ZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvY3B1Lzc0eHhfN3h4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOTA1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1Lzc0eHhfN3h4L01ha2VmaWxlCkBAIC0wLDAgKzEsNTEgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMQorIyBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubworU09CSlMJPSBjYWNoZS5vIGtnZGIubyBpby5vCitDT0JKUwk9IHRyYXBzLm8gY3B1Lm8gY3B1X2luaXQubyBzcGVlZC5vIGludGVycnVwdHMubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvY2FjaGUuUyBiL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvY2FjaGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmM3Mjk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC9jYWNoZS5TCkBAIC0wLDAgKzEsNDA0IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8NzR4eF83eHguaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKworI2lmbmRlZiBDQUNIRV9MSU5FX1NJWkUKKyMgZGVmaW5lIENBQ0hFX0xJTkVfU0laRSBMMV9DQUNIRV9CWVRFUworI2VuZGlmCisKKyNpZiBDQUNIRV9MSU5FX1NJWkUgPT0gMTI4CisjZGVmaW5lIExHX0NBQ0hFX0xJTkVfU0laRSA3CisjZWxpZiBDQUNIRV9MSU5FX1NJWkUgPT0gMzIKKyNkZWZpbmUgTEdfQ0FDSEVfTElORV9TSVpFIDUKKyNlbGlmIENBQ0hFX0xJTkVfU0laRSA9PSAxNgorI2RlZmluZSBMR19DQUNIRV9MSU5FX1NJWkUgNAorI2VsaWYgQ0FDSEVfTElORV9TSVpFID09IDgKKyNkZWZpbmUgTEdfQ0FDSEVfTElORV9TSVpFIDMKKyNlbHNlCisjIGVycm9yICJJbnZhbGlkIGNhY2hlIGxpbmUgc2l6ZSEiCisjZW5kaWYKKworLyoKKyAqIEludmFsaWRhdGUgTDEgaW5zdHJ1Y3Rpb24gY2FjaGUuCisgKi8KK19HTE9CQUwoaW52YWxpZGF0ZV9sMV9pbnN0cnVjdGlvbl9jYWNoZSkKKwltZnNwcglyMyxQVlIKKwlybHdpbm0JcjMscjMsMTYsMTYsMzEKKwljbXBpCTAscjMsMQorCWJlcWxyCQkJLyogZm9yIDYwMSwgZG8gbm90aGluZyAqLworCS8qIDYwMy82MDQgcHJvY2Vzc29yIC0gdXNlIGludmFsaWRhdGUtYWxsIGJpdCBpbiBISUQwICovCisJbWZzcHIJcjMsSElEMAorCW9yaQlyMyxyMyxISUQwX0lDRkkKKwltdHNwcglISUQwLHIzCisJaXN5bmMKKwlibHIKKworLyoKKyAqIEludmFsaWRhdGUgTDEgZGF0YSBjYWNoZS4KKyAqLworX0dMT0JBTChpbnZhbGlkYXRlX2wxX2RhdGFfY2FjaGUpCisJbWZzcHIJcjMsSElEMAorCW9yaQlyMyxyMyxISUQwX0RDRkkKKwltdHNwcglISUQwLHIzCisJaXN5bmMKKwlibHIKKworLyoKKyAqIEZsdXNoIGRhdGEgY2FjaGUuCisgKi8KK19HTE9CQUwoZmx1c2hfZGNhY2hlKQorCWxpcwlyMywwCisJbGlzCXI1LENBQ0hFX0xJTkVfU0laRQorZmx1c2g6CisJY21wCTAsMSxyMyxyNQorCWJnZQlkb25lCisJbHd6CXI1LDAocjMpCisJbGlzCXI1LENBQ0hFX0xJTkVfU0laRQorCWFkZGkJcjMscjMsMHg0CisJYglmbHVzaAorZG9uZToKKwlibHIKKy8qCisgKiBXcml0ZSBhbnkgbW9kaWZpZWQgZGF0YSBjYWNoZSBibG9ja3Mgb3V0IHRvIG1lbW9yeQorICogYW5kIGludmFsaWRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgaW5zdHJ1Y3Rpb24gY2FjaGUgYmxvY2tzLgorICogVGhpcyBpcyBhIG5vLW9wIG9uIHRoZSA2MDEuCisgKgorICogZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc3RvcCkKKyAqLworX0dMT0JBTChmbHVzaF9pY2FjaGVfcmFuZ2UpCisJbWZzcHIJcjUsUFZSCisJcmx3aW5tCXI1LHI1LDE2LDE2LDMxCisJY21waQkwLHI1LDEKKwliZXFscgkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCisJbGkJcjUsQ0FDSEVfTElORV9TSVpFLTEKKwlhbmRjCXIzLHIzLHI1CisJc3ViZglyNCxyMyxyNAorCWFkZAlyNCxyNCxyNQorCXNyd2kuCXI0LHI0LExHX0NBQ0hFX0xJTkVfU0laRQorCWJlcWxyCisJbXRjdHIJcjQKKwltcglyNixyMworMToJZGNic3QJMCxyMworCWFkZGkJcjMscjMsQ0FDSEVfTElORV9TSVpFCisJYmRuegkxYgorCXN5bmMJCQkJLyogd2FpdCBmb3IgZGNic3QncyB0byBnZXQgdG8gcmFtICovCisJbXRjdHIJcjQKKzI6CWljYmkJMCxyNgorCWFkZGkJcjYscjYsQ0FDSEVfTElORV9TSVpFCisJYmRuegkyYgorCXN5bmMJCQkJLyogYWRkaXRpb25hbCBzeW5jIG5lZWRlZCBvbiBnNCAqLworCWlzeW5jCisJYmxyCisvKgorICogV3JpdGUgYW55IG1vZGlmaWVkIGRhdGEgY2FjaGUgYmxvY2tzIG91dCB0byBtZW1vcnkuCisgKiBEb2VzIG5vdCBpbnZhbGlkYXRlIHRoZSBjb3JyZXNwb25kaW5nIGNhY2hlIGxpbmVzIChlc3BlY2lhbGx5IGZvcgorICogYW55IGNvcnJlc3BvbmRpbmcgaW5zdHJ1Y3Rpb24gY2FjaGUpLgorICoKKyAqIGNsZWFuX2RjYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHN0b3ApCisgKi8KK19HTE9CQUwoY2xlYW5fZGNhY2hlX3JhbmdlKQorCWxpCXI1LENBQ0hFX0xJTkVfU0laRS0xCisJYW5kYwlyMyxyMyxyNQkvKiBhbGlnbiByMyBkb3duIHRvIGNhY2hlIGxpbmUgKi8KKwlzdWJmCXI0LHIzLHI0CS8qIHI0ID0gb2Zmc2V0IG9mIHN0b3AgZnJvbSBzdGFydCBvZiBjYWNoZSBsaW5lICovCisJYWRkCXI0LHI0LHI1CS8qIHI0ICs9IGNhY2hlX2xpbmVfc2l6ZS0xICovCisJc3J3aS4JcjQscjQsTEdfQ0FDSEVfTElORV9TSVpFICAvKiByNCA9IG51bWJlciBvZiBjYWNoZSBsaW5lcyB0byBmbHVzaCAqLworCWJlcWxyCQkJCSAgLyogaWYgcjQgPT0gMCByZXR1cm4gKi8KKwltdGN0cglyNAkJCSAgLyogY3RyID0gcjQgKi8KKworCXN5bmMKKzE6CWRjYnN0CTAscjMKKwlhZGRpCXIzLHIzLENBQ0hFX0xJTkVfU0laRQorCWJkbnoJMWIKKwlzeW5jCQkJCS8qIHdhaXQgZm9yIGRjYnN0J3MgdG8gZ2V0IHRvIHJhbSAqLworCWJscgorCisvKgorICogV3JpdGUgYW55IG1vZGlmaWVkIGRhdGEgY2FjaGUgYmxvY2tzIG91dCB0byBtZW1vcnkKKyAqIGFuZCBpbnZhbGlkYXRlIHRoZSBjb3JyZXNwb25kaW5nIGluc3RydWN0aW9uIGNhY2hlIGJsb2Nrcy4KKyAqCisgKiBmbHVzaF9kY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzdG9wKQorICovCitfR0xPQkFMKGZsdXNoX2RjYWNoZV9yYW5nZSkKKwlsaQlyNSxDQUNIRV9MSU5FX1NJWkUtMQorCWFuZGMJcjMscjMscjUKKwlzdWJmCXI0LHIzLHI0CisJYWRkCXI0LHI0LHI1CisJc3J3aS4JcjQscjQsTEdfQ0FDSEVfTElORV9TSVpFCisJYmVxbHIKKwltdGN0cglyNAorCisJc3luYworMToJZGNiZgkwLHIzCisJYWRkaQlyMyxyMyxDQUNIRV9MSU5FX1NJWkUKKwliZG56CTFiCisJc3luYwkJCQkvKiB3YWl0IGZvciBkY2JmJ3MgdG8gZ2V0IHRvIHJhbSAqLworCWJscgorCisvKgorICogTGlrZSBhYm92ZSwgYnV0IGludmFsaWRhdGUgdGhlIEQtY2FjaGUuICBUaGlzIGlzIHVzZWQgYnkgdGhlIDh4eAorICogdG8gaW52YWxpZGF0ZSB0aGUgY2FjaGUgc28gdGhlIFBQQyBjb3JlIGRvZXNuJ3QgZ2V0IHN0YWxlIGRhdGEKKyAqIGZyb20gdGhlIENQTSAobm8gY2FjaGUgc25vb3BpbmcgaGVyZSA6LSkuCisgKgorICogaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzdG9wKQorICovCitfR0xPQkFMKGludmFsaWRhdGVfZGNhY2hlX3JhbmdlKQorCWxpCXI1LENBQ0hFX0xJTkVfU0laRS0xCisJYW5kYwlyMyxyMyxyNQorCXN1YmYJcjQscjMscjQKKwlhZGQJcjQscjQscjUKKwlzcndpLglyNCxyNCxMR19DQUNIRV9MSU5FX1NJWkUKKwliZXFscgorCW10Y3RyCXI0CisKKwlzeW5jCisxOglkY2JpCTAscjMKKwlhZGRpCXIzLHIzLENBQ0hFX0xJTkVfU0laRQorCWJkbnoJMWIKKwlzeW5jCQkJCS8qIHdhaXQgZm9yIGRjYmkncyB0byBnZXQgdG8gcmFtICovCisJYmxyCisKKy8qCisgKiBGbHVzaCBhIHBhcnRpY3VsYXIgcGFnZSBmcm9tIHRoZSBkYXRhIGNhY2hlIHRvIFJBTS4KKyAqIE5vdGU6IHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGluc3RydWN0aW9uIGNhY2hlIGRvZXMgKm5vdCoKKyAqIHNub29wIGZyb20gdGhlIGRhdGEgY2FjaGUuCisgKiBUaGlzIGlzIGEgbm8tb3Agb24gdGhlIDYwMSB3aGljaCBoYXMgYSB1bmlmaWVkIGNhY2hlLgorICoKKyAqCXZvaWQgX19mbHVzaF9wYWdlX3RvX3JhbSh2b2lkICpwYWdlKQorICovCitfR0xPQkFMKF9fZmx1c2hfcGFnZV90b19yYW0pCisJbWZzcHIJcjUsUFZSCisJcmx3aW5tCXI1LHI1LDE2LDE2LDMxCisJY21waQkwLHI1LDEKKwliZXFscgkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCisJcmx3aW5tCXIzLHIzLDAsMCwxOQkJLyogR2V0IHBhZ2UgYmFzZSBhZGRyZXNzICovCisJbGkJcjQsNDA5Ni9DQUNIRV9MSU5FX1NJWkUJLyogTnVtYmVyIG9mIGxpbmVzIGluIGEgcGFnZSAqLworCW10Y3RyCXI0CisJbXIJcjYscjMKKzA6CWRjYnN0CTAscjMJCQkvKiBXcml0ZSBsaW5lIHRvIHJhbSAqLworCWFkZGkJcjMscjMsQ0FDSEVfTElORV9TSVpFCisJYmRuegkwYgorCXN5bmMKKwltdGN0cglyNAorMToJaWNiaQkwLHI2CisJYWRkaQlyNixyNixDQUNIRV9MSU5FX1NJWkUKKwliZG56CTFiCisJc3luYworCWlzeW5jCisJYmxyCisKKy8qCisgKiBGbHVzaCBhIHBhcnRpY3VsYXIgcGFnZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4KKyAqIE5vdGU6IHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGluc3RydWN0aW9uIGNhY2hlIGRvZXMgKm5vdCoKKyAqIHNub29wIGZyb20gdGhlIGRhdGEgY2FjaGUuCisgKiBUaGlzIGlzIGEgbm8tb3Agb24gdGhlIDYwMSB3aGljaCBoYXMgYSB1bmlmaWVkIGNhY2hlLgorICoKKyAqCXZvaWQgX19mbHVzaF9pY2FjaGVfcGFnZSh2b2lkICpwYWdlKQorICovCitfR0xPQkFMKF9fZmx1c2hfaWNhY2hlX3BhZ2UpCisJbWZzcHIJcjUsUFZSCisJcmx3aW5tCXI1LHI1LDE2LDE2LDMxCisJY21waQkwLHI1LDEKKwliZXFscgkJCQkvKiBmb3IgNjAxLCBkbyBub3RoaW5nICovCisJbGkJcjQsNDA5Ni9DQUNIRV9MSU5FX1NJWkUJLyogTnVtYmVyIG9mIGxpbmVzIGluIGEgcGFnZSAqLworCW10Y3RyCXI0CisxOglpY2JpCTAscjMKKwlhZGRpCXIzLHIzLENBQ0hFX0xJTkVfU0laRQorCWJkbnoJMWIKKwlzeW5jCisJaXN5bmMKKwlibHIKKworLyoKKyAqIENsZWFyIGEgcGFnZSB1c2luZyB0aGUgZGNieiBpbnN0cnVjdGlvbiwgd2hpY2ggZG9lc24ndCBjYXVzZSBhbnkKKyAqIG1lbW9yeSB0cmFmZmljIChleGNlcHQgdG8gd3JpdGUgb3V0IGFueSBjYWNoZSBsaW5lcyB3aGljaCBnZXQKKyAqIGRpc3BsYWNlZCkuICBUaGlzIG9ubHkgd29ya3Mgb24gY2FjaGVhYmxlIG1lbW9yeS4KKyAqLworX0dMT0JBTChjbGVhcl9wYWdlKQorCWxpCXIwLDQwOTYvQ0FDSEVfTElORV9TSVpFCisJbXRjdHIJcjAKKzE6CWRjYnoJMCxyMworCWFkZGkJcjMscjMsQ0FDSEVfTElORV9TSVpFCisJYmRuegkxYgorCWJscgorCisvKgorICogRW5hYmxlIEwxIEluc3RydWN0aW9uIGNhY2hlCisgKi8KK19HTE9CQUwoaWNhY2hlX2VuYWJsZSkKKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0lDRkl8SElEMF9JTE9DSworCWFuZGMJcjMsIHIzLCByNQorCW9yaQlyMywgcjMsIEhJRDBfSUNFCisJb3JpCXI1LCByMywgSElEMF9JQ0ZJCisJbXRzcHIJSElEMCwgcjUKKwltdHNwcglISUQwLCByMworCWlzeW5jCisJYmxyCisKKy8qCisgKiBEaXNhYmxlIEwxIEluc3RydWN0aW9uIGNhY2hlCisgKi8KK19HTE9CQUwoaWNhY2hlX2Rpc2FibGUpCisJbWZscglyNAorCWJsCWludmFsaWRhdGVfbDFfaW5zdHJ1Y3Rpb25fY2FjaGUJCS8qIHVzZXMgcjMgKi8KKwlzeW5jCisJbXRscglyNAorCW1mc3ByCXIzLCBISUQwCisJbGkJcjUsIDAKKwlvcmkJcjUsIHI1LCBISUQwX0lDRQorCWFuZGMJcjMsIHIzLCByNQorCW10c3ByCUhJRDAsIHIzCisJaXN5bmMKKwlibHIKKworLyoKKyAqIElzIGluc3RydWN0aW9uIGNhY2hlIGVuYWJsZWQ/CisgKi8KK19HTE9CQUwoaWNhY2hlX3N0YXR1cykKKwltZnNwcglyMywgSElEMAorCWFuZGkuCXIzLCByMywgSElEMF9JQ0UKKwlibHIKKworCitfR0xPQkFMKGwxZGNhY2hlX2VuYWJsZSkKKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0RDRkl8SElEMF9ETE9DSworCWFuZGMJcjMsIHIzLCByNQorCW10c3ByCUhJRDAsIHIzCQkvKiBubyBpbnZhbGlkYXRlLCB1bmxvY2sgKi8KKwlvcmkJcjMsIHIzLCBISUQwX0RDRQorCW9yaQlyNSwgcjMsIEhJRDBfRENGSQorCW10c3ByCUhJRDAsIHI1CQkvKiBlbmFibGUgKyBpbnZhbGlkYXRlICovCisJbXRzcHIJSElEMCwgcjMJCS8qIGVuYWJsZSAqLworCXN5bmMKKwlibHIKKworLyoKKyAqIEVuYWJsZSBkYXRhIGNhY2hlKHMpIC0gTDEgYW5kIG9wdGlvbmFsbHkgTDIKKyAqIENhbGxzIGwyY2FjaGVfZW5hYmxlLiBMUiBzYXZlZCBpbiByNQorICovCitfR0xPQkFMKGRjYWNoZV9lbmFibGUpCisJbWZzcHIJcjMsIEhJRDAKKwlsaQlyNSwgSElEMF9EQ0ZJfEhJRDBfRExPQ0sKKwlhbmRjCXIzLCByMywgcjUKKwltdHNwcglISUQwLCByMwkJLyogbm8gaW52YWxpZGF0ZSwgdW5sb2NrICovCisJb3JpCXIzLCByMywgSElEMF9EQ0UKKwlvcmkJcjUsIHIzLCBISUQwX0RDRkkKKwltdHNwcglISUQwLCByNQkJLyogZW5hYmxlICsgaW52YWxpZGF0ZSAqLworCW10c3ByCUhJRDAsIHIzCQkvKiBlbmFibGUgKi8KKwlzeW5jCisjaWZkZWYgQ09ORklHX1NZU19MMgorCW1mbHIJcjUKKwlibAlsMmNhY2hlX2VuYWJsZQkJLyogdXNlcyByMyBhbmQgcjQgKi8KKwlzeW5jCisJbXRscglyNQorI2VuZGlmCisJYmxyCisKKworLyoKKyAqIERpc2FibGUgZGF0YSBjYWNoZShzKSAtIEwxIGFuZCBvcHRpb25hbGx5IEwyCisgKiBDYWxscyBmbHVzaF9kY2FjaGUgYW5kIGwyY2FjaGVfZGlzYWJsZV9ub19mbHVzaC4KKyAqIExSIHNhdmVkIGluIHI0CisgKi8KK19HTE9CQUwoZGNhY2hlX2Rpc2FibGUpCisJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlciAqLworCWJsCWZsdXNoX2RjYWNoZQkvKiB1c2VzIHIzIGFuZCByNSAqLworCXN5bmMKKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0RDRkl8SElEMF9ETE9DSworCWFuZGMJcjMsIHIzLCByNQorCW10c3ByCUhJRDAsIHIzCQkvKiBubyBpbnZhbGlkYXRlLCB1bmxvY2sgKi8KKwlsaQlyNSwgSElEMF9EQ0V8SElEMF9EQ0ZJCisJYW5kYwlyMywgcjMsIHI1CQkvKiBubyBlbmFibGUsIG5vIGludmFsaWRhdGUgKi8KKwltdHNwcglISUQwLCByMworCXN5bmMKKyNpZmRlZiBDT05GSUdfU1lTX0wyCisJYmwJbDJjYWNoZV9kaXNhYmxlX25vX2ZsdXNoIC8qIHVzZXMgcjMgKi8KKyNlbmRpZgorCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIgKi8KKwlibHIKKworLyoKKyAqIElzIGRhdGEgY2FjaGUgZW5hYmxlZD8KKyAqLworX0dMT0JBTChkY2FjaGVfc3RhdHVzKQorCW1mc3ByCXIzLCBISUQwCisJYW5kaS4JcjMsIHIzLCBISUQwX0RDRQorCWJscgorCisvKgorICogSW52YWxpZGF0ZSBMMiBjYWNoZSB1c2luZyBMMkkgYW5kIHBvbGxpbmcgTDJJUCBvciBMMkkKKyAqLworX0dMT0JBTChsMmNhY2hlX2ludmFsaWRhdGUpCisJc3luYworCW1mc3ByIHIzLCBsMmNyCisJb3JpcwlyMywgcjMsIEwyQ1JfTDJJQGgKKwlzeW5jCisJbXRzcHIJbDJjciwgcjMKKwlzeW5jCisJbWZzcHIgcjMsIFBWUgorCXN5bmMKKwlybHdpbm0gcjMsIHIzLCAxNiwxNiwzMQorCWNtcGxpIDAscjMsMHg4MDAwICAvKiA3NDUxLCA3NDQxICovCisJYmVxIDAsaW52Xzc0NTAKKwljbXBsaSAwLHIzLDB4ODAwMSAgLyogNzQ1NSwgNzQ0NSAqLworCWJlcSAwLGludl83NDUwCisJY21wbGkgMCxyMywweDgwMDIgIC8qIDc0NTcsIDc0NDcgKi8KKwliZXEgMCxpbnZfNzQ1MAorCWNtcGxpIDAscjMsMHg4MDAzICAvKiA3NDQ3QSAqLworCWJlcSAwLGludl83NDUwCisJY21wbGkgMCxyMywweDgwMDQgIC8qIDc0NDggKi8KKwliZXEgMCxpbnZfNzQ1MAoraW52bDI6CisJbWZzcHIJcjMsIGwyY3IKKwlhbmRpLglyMywgcjMsIEwyQ1JfTDJJUAorCWJuZQlpbnZsMgorCS8qIHR1cm4gb2ZmIHRoZSBnbG9iYWwgaW52YWxpZGF0ZSBiaXQgKi8KKwltZnNwcglyMywgbDJjcgorCXJsd2lubQlyMywgcjMsIDAsIDExLCA5CisJc3luYworCW10c3ByCWwyY3IsIHIzCisJc3luYworCWJscgoraW52Xzc0NTA6CisJbWZzcHIJcjMsIGwyY3IKKwlhbmRpcy4gcjMsIHIzLCBMMkNSX0wySUBoCisJYm5lIGludl83NDUwCisJYmxyCisKKy8qCisgKiBFbmFibGUgTDIgY2FjaGUKKyAqIENhbGxzIGwyY2FjaGVfaW52YWxpZGF0ZS4gTFIgaXMgc2F2ZWQgaW4gcjQKKyAqLworX0dMT0JBTChsMmNhY2hlX2VuYWJsZSkKKwltZmxyCXI0CQkJLyogc2F2ZSBsaW5rIHJlZ2lzdGVyICovCisJYmwJbDJjYWNoZV9pbnZhbGlkYXRlCS8qIHVzZXMgcjMgKi8KKwlzeW5jCisJbGlzCXIzLCBMMl9FTkFCTEVAaAorCW9yaQlyMywgcjMsIEwyX0VOQUJMRUBsCisJbXRzcHIJbDJjciwgcjMKKwlpc3luYworCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIgKi8KKwlibHIKKworLyoKKyAqIERpc2FibGUgTDIgY2FjaGUKKyAqIENhbGxzIGZsdXNoX2RjYWNoZS4gTFIgaXMgc2F2ZWQgaW4gcjQKKyAqLworX0dMT0JBTChsMmNhY2hlX2Rpc2FibGUpCisJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlciAqLworCWJsCWZsdXNoX2RjYWNoZQkJLyogdXNlcyByMyBhbmQgcjUgKi8KKwlzeW5jCisJbXRscglyNAkJCS8qIHJlc3RvcmUgbGluayByZWdpc3RlciAqLworbDJjYWNoZV9kaXNhYmxlX25vX2ZsdXNoOgkJLyogcHJvdmlkZSB3YXkgdG8gZGlzYWJsZSBMMiB3L28gZmx1c2hpbmcgKi8KKwlsaXMJcjMsIEwyX0lOSVRAaAorCW9yaQlyMywgcjMsIEwyX0lOSVRAbAorCW10c3ByCWwyY3IsIHIzCisJaXN5bmMKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvY29uZmlnLm1rIGIvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxZjZhYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAxCisjIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitQTEFURk9STV9SRUxGTEFHUyArPSAtZlBJQyAtbWVhYmkKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfNzR4eF83eHggLWZmaXhlZC1yMiAtbXN0cmluZwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxNzI3NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvY3B1LmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBjcHUuYworICoKKyAqIENQVSBzcGVjaWZpYyBjb2RlCisgKgorICogd3JpdHRlbiBvciBjb2xsZWN0ZWQgYW5kIHNvbWV0aW1lcyByZXdyaXR0ZW4gYnkKKyAqIE1hZ251cyBEYW1tIDxkYW1tQGJpdHNtYXJ0LmNvbT4KKyAqCisgKiBtaW5vciBtb2RpZmljYXRpb25zIGJ5CisgKiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICoKKyAqIG1vcmUgbW9kaWZpY2F0aW9ucyBieQorICogSm9zaCBIdWJlciA8aHViZXJAbWNseC5jb20+CisgKiBhZGRlZCBzdXBwb3J0IGZvciB0aGUgNzR4eCBzZXJpZXMgb2YgY3B1cworICogYWRkZWQgc3VwcG9ydCBmb3IgdGhlIDd4eCBzZXJpZXMgb2YgY3B1cworICogbWFkZSB0aGUgY29kZSBhIGxpdHRsZSBsZXNzIGhhcmQtY29kZWQsIGFuZCBtb3JlIGF1dG8tZGV0ZWN0aXNoCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDw3NHh4Xzd4eC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTUlHQU9ORUczU0UKKyNpbmNsdWRlICIuLi9ib2FyZC9NQUkvQW1pZ2FPbmVHM1NFL3ZpYTY4Ni5oIgorI2luY2x1ZGUgIi4uL2JvYXJkL01BSS9BbWlnYU9uZUczU0UvbWVtaW8uaCIKKyNlbmRpZgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworY3B1X3QKK2dldF9jcHVfdHlwZSh2b2lkKQoreworCXVpbnQgcHZyID0gZ2V0X3B2cigpOworCWNwdV90IHR5cGU7CisKKwl0eXBlID0gQ1BVX1VOS05PV047CisKKwlzd2l0Y2ggKFBWUl9WRVIocHZyKSkgeworCWNhc2UgMHgwMDBjOgorCQl0eXBlID0gQ1BVXzc0MDA7CisJCWJyZWFrOworCWNhc2UgMHgwMDA4OgorCQl0eXBlID0gQ1BVXzc1MDsKKworCQlpZiAoKChwdnIgPj4gOCkgJiAweGZmKSA9PSAweDAxKSB7CisJCQl0eXBlID0gQ1BVXzc1MENYOwkvKiBvbGQgQ1ggKDgwMTAwIGFuZCA4MDEweD8pKi8KKwkJfSBlbHNlIGlmICgoKHB2ciA+PiA4KSAmIDB4ZmYpID09IDB4MjIpIHsKKwkJCXR5cGUgPSBDUFVfNzUwQ1g7CS8qIENYICg4MjIwMSw4MjIwMikgYW5kIENYZSAoODIyMTQpICovCisJCX0gZWxzZSBpZiAoKChwdnIgPj4gOCkgJiAweGZmKSA9PSAweDMzKSB7CisJCQl0eXBlID0gQ1BVXzc1MENYOwkvKiBDWGUgKDgzMzExKSAqLworCQl9IGVsc2UgaWYgKCgocHZyID4+IDEyKSAmIDB4RikgPT0gMHgzKSB7CisJCQl0eXBlID0gQ1BVXzc1NTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHg3MDAwOgorCQl0eXBlID0gQ1BVXzc1MEZYOworCQlicmVhazsKKworCWNhc2UgMHg3MDAyOgorCQl0eXBlID0gQ1BVXzc1MEdYOworCQlicmVhazsKKworCWNhc2UgMHg4MDBDOgorCQl0eXBlID0gQ1BVXzc0MTA7CisJCWJyZWFrOworCisJY2FzZSAweDgwMDA6CisJCXR5cGUgPSBDUFVfNzQ1MDsKKwkJYnJlYWs7CisKKwljYXNlIDB4ODAwMToKKwkJdHlwZSA9IENQVV83NDU1OworCQlicmVhazsKKworCWNhc2UgMHg4MDAyOgorCQl0eXBlID0gQ1BVXzc0NTc7CisJCWJyZWFrOworCisJY2FzZSAweDgwMDM6CisJCXR5cGUgPSBDUFVfNzQ0N0E7CisJCWJyZWFrOworCisJY2FzZSAweDgwMDQ6CisJCXR5cGUgPSBDUFVfNzQ0ODsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdHlwZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgIWRlZmluZWQoQ09ORklHX0JBQjd4eCkKK2ludCBjaGVja2NwdSAodm9pZCkKK3sKKwl1aW50IHR5cGUgICA9IGdldF9jcHVfdHlwZSgpOworCXVpbnQgcHZyICAgID0gZ2V0X3B2cigpOworCXVsb25nIGNsb2NrID0gZ2QtPmNwdV9jbGs7CisJY2hhciBidWZbMzJdOworCWNoYXIgKnN0cjsKKworCXB1dHMgKCJDUFU6ICAgIik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIENQVV83NTBDWDoKKwkJcHJpbnRmICgiNzUwQ1glcyB2JWQuJWQiLCAocHZyJjB4ZjApPyJlIjoiIiwKKwkJCShwdnI+PjgpICYgMHhmLAorCQkJcHZyICYgMHhmKTsKKwkJZ290bwlQUl9DTEs7CisKKwljYXNlIENQVV83NTA6CisJCXN0ciA9ICI3NTAiOworCQlicmVhazsKKworCWNhc2UgQ1BVXzc1MEZYOgorCQlzdHIgPSAiNzUwRlgiOworCQlicmVhazsKKworCWNhc2UgQ1BVXzc1MEdYOgorCQlzdHIgPSAiNzUwR1giOworCQlicmVhazsKKworCWNhc2UgQ1BVXzc1NToKKwkJc3RyID0gIjc1NSI7CisJCWJyZWFrOworCisJY2FzZSBDUFVfNzQwMDoKKwkJc3RyID0gIk1QQzc0MDAiOworCQlicmVhazsKKworCWNhc2UgQ1BVXzc0MTA6CisJCXN0ciA9ICJNUEM3NDEwIjsKKwkJYnJlYWs7CisKKwljYXNlIENQVV83NDQ3QToKKwkJc3RyID0gIk1QQzc0NDdBIjsKKwkJYnJlYWs7CisKKwljYXNlIENQVV83NDQ4OgorCQlzdHIgPSAiTVBDNzQ0OCI7CisJCWJyZWFrOworCisJY2FzZSBDUFVfNzQ1MDoKKwkJc3RyID0gIk1QQzc0NTAiOworCQlicmVhazsKKworCWNhc2UgQ1BVXzc0NTU6CisJCXN0ciA9ICJNUEM3NDU1IjsKKwkJYnJlYWs7CisKKwljYXNlIENQVV83NDU3OgorCQlzdHIgPSAiTVBDNzQ1NyI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmtub3duIENQVSAtLSBQVlI6IDB4JTA4eFxuIiwgcHZyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ZiAoIiVzIHYlZC4lZCIsIHN0ciwgKHB2ciA+PiA4KSAmIDB4RkYsIHB2ciAmIDB4RkYpOworUFJfQ0xLOgorCXByaW50ZiAoIiBAICVzIE1IelxuIiwgc3RybWh6KGJ1ZiwgY2xvY2spKTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKy8qIHRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIHVuaW1wbGVtZW50ZWQgY3VycmVudGx5IFtqb3NoXSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogTDEgaS1jYWNoZQkJCQkJCQkJKi8KKworaW50CitjaGVja2ljYWNoZSh2b2lkKQoreworCXJldHVybiAwOyAvKiBYWFggKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEwxIGQtY2FjaGUJCQkJCQkJCSovCisKK2ludAorY2hlY2tkY2FjaGUodm9pZCkKK3sKKwlyZXR1cm4gMDsgLyogWFhYICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc29mdF9yZXN0YXJ0KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwkvKiBTUlIwIGhhcyBzeXN0ZW0gcmVzZXQgdmVjdG9yLCBTUlIxIGhhcyBkZWZhdWx0IE1TUiB2YWx1ZSAqLworCS8qIHJmaSByZXN0b3JlcyBNU1IgZnJvbSBTUlIxIGFuZCBzZXRzIHRoZSBQQyB0byB0aGUgU1JSMCB2YWx1ZSAqLworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtdHNwcgkyNiwgJTAiCQk6OiAiciIgKGFkZHIpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImxpCTQsICgxIDw8IDYpIgk6OjogInI0Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtdHNwcgkyNywgNCIpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgicmZpIik7CisKKwl3aGlsZSgxKTsJLyogbm90IHJlYWNoZWQgKi8KK30KKworCisjaWYgIWRlZmluZWQoQ09ORklHX1BDSVBQQzIpICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfQkFCN3h4KSAgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19FTFBQQykgICAmJiBcCisgICAgIWRlZmluZWQoQ09ORklHX1BQTUM3WFgpCisvKiBubyBnZW5lcmljIHdheSB0byBkbyBib2FyZCByZXNldC4gc2ltcGx5IGNhbGwgc29mdF9yZXNldC4gKi8KK3ZvaWQKK2RvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bG9uZyBhZGRyOworCS8qIGZsdXNoIGFuZCBkaXNhYmxlIEkvRCBjYWNoZSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgibWZzcHIJMywgMTAwOCIJOjo6ICJyMyIpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgib3JpCTUsIDUsIDB4Y2MwMCIJOjo6ICJyNSIpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgib3JpCTQsIDMsIDB4YzAwIgk6OjogInI0Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJhbmRjCTUsIDMsIDUiCTo6OiAicjUiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm10c3ByCTEwMDgsIDQiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlzeW5jIik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtdHNwcgkxMDA4LCA1Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOworCisjaWZkZWYgQ09ORklHX1NZU19SRVNFVF9BRERSRVNTCisJYWRkciA9IENPTkZJR19TWVNfUkVTRVRfQUREUkVTUzsKKyNlbHNlCisJLyoKKwkgKiBub3RlOiB3aGVuIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFIHBvaW50cyB0byBhIFJBTSBhZGRyZXNzLAorCSAqIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFIC0gc2l6ZW9mICh1bG9uZykgaXMgdXN1YWxseSBhIHZhbGlkCisJICogYWRkcmVzcy4gQmV0dGVyIHBpY2sgYW4gYWRkcmVzcyBrbm93biB0byBiZSBpbnZhbGlkIG9uIHlvdXIKKwkgKiBzeXN0ZW0gYW5kIGFzc2lnbiBpdCB0byBDT05GSUdfU1lTX1JFU0VUX0FERFJFU1MuCisJICovCisJYWRkciA9IENPTkZJR19TWVNfTU9OSVRPUl9CQVNFIC0gc2l6ZW9mICh1bG9uZyk7CisjZW5kaWYKKwlzb2Z0X3Jlc3RhcnQoYWRkcik7CisJd2hpbGUoMSk7CS8qIG5vdCByZWFjaGVkICovCit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogRm9yIHRoZSA3NDAwIHRoZSBUQiBjbG9jayBydW5zIGF0IDEvNCB0aGUgY3B1IGJ1cyBzcGVlZC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0FNSUdBT05FRzNTRSkgfHwgZGVmaW5lZChDT05GSUdfU1lTX0NPTkZJR19CVVNfQ0xLKQordW5zaWduZWQgbG9uZyBnZXRfdGJjbGsodm9pZCkKK3sKKwlyZXR1cm4gKGdkLT5idXNfY2xrIC8gNCk7Cit9CisjZWxzZQkvKiAhIENPTkZJR19BTUlHQU9ORUczU0UgYW5kICFDT05GSUdfU1lTX0NPTkZJR19CVVNfQ0xLKi8KKwordW5zaWduZWQgbG9uZyBnZXRfdGJjbGsgKHZvaWQpCit7CisJcmV0dXJuIENPTkZJR19TWVNfQlVTX0haIC8gNDsKK30KKyNlbmRpZgkvKiBDT05GSUdfQU1JR0FPTkVHM1NFIG9yIENPTkZJR19TWVNfQ09ORklHX0JVU19DTEsqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorI2lmICFkZWZpbmVkKENPTkZJR19QQ0lQUEMyKSAmJiAhZGVmaW5lZChDT05GSUdfQkFCN3h4KQordm9pZAord2F0Y2hkb2dfcmVzZXQodm9pZCkKK3sKKworfQorI2VuZGlmICAvKiAhQ09ORklHX1BDSVBQQzIgJiYgIUNPTkZJR19CQUI3eHggKi8KKyNlbmRpZgkvKiBDT05GSUdfV0FUQ0hET0cgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX09GX0xJQkZEVAordm9pZCBmdF9jcHVfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJZG9fZml4dXBfYnlfcHJvcF91MzIoYmxvYiwgImRldmljZV90eXBlIiwgImNwdSIsIDQsCisJCQkgICAgICJ0aW1lYmFzZS1mcmVxdWVuY3kiLCBiZC0+YmlfYnVzZnJlcSAvIDQsIDEpOworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LAorCQkJICAgICAiYnVzLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKwlkb19maXh1cF9ieV9wcm9wX3UzMihibG9iLCAiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNCwKKwkJCSAgICAgImNsb2NrLWZyZXF1ZW5jeSIsIGJkLT5iaV9pbnRmcmVxLCAxKTsKKworCWZkdF9maXh1cF9tZW1vcnkoYmxvYiwgKHU2NCliZC0+YmlfbWVtc3RhcnQsICh1NjQpYmQtPmJpX21lbXNpemUpOworCisJZmR0X2ZpeHVwX2V0aGVybmV0KGJsb2IpOworfQorI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1Lzc0eHhfN3h4L2NwdV9pbml0LmMgYi9hcmNoL3Bvd2VycGMvY3B1Lzc0eHhfN3h4L2NwdV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkMWIyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvY3B1X2luaXQuYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogY3B1X2luaXQuYyAtIGxvdyBsZXZlbCBjcHUgaW5pdAorICoKKyAqIHRoZXJlJ3MgcmVhbGx5IG5vdGhpbmcgZ29pbmcgb24gaGVyZSB5ZXQuICBmdXR1cmUgd29yayBhcmVhPworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDw3NHh4Xzd4eC5oPgorCisvKgorICogQnJlYXRoIHNvbWUgbGlmZSBpbnRvIHRoZSBDUFUuLi4KKyAqCisgKiB0aGVyZSdzIGJhc2ljYWxseSBub3RoaW5nIHRvIGRvIGhlcmUgc2luY2UgdGhlIG1lbW9yeSBjb250cm9sbGVyCisgKiBpc24ndCBvbiB0aGUgQ1BVIGluIHRoaXMgY2FzZS4KKyAqLwordm9pZAorY3B1X2luaXRfZiAodm9pZCkKK3sKKwlzd2l0Y2ggKGdldF9jcHVfdHlwZSgpKSB7CisJY2FzZSBDUFVfNzQ1MDoKKwljYXNlIENQVV83NDU1OgorCWNhc2UgQ1BVXzc0NTc6CisJY2FzZSBDUFVfNzQ0N0E6CisJY2FzZSBDUFVfNzQ0ODoKKwkJLyogZW5hYmxlIHRoZSB0aW1lYmFzZSBiaXQgaW4gSElEMCAqLworCQlzZXRfaGlkMChnZXRfaGlkMCgpIHwgMHg0MDAwMDAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZG8gbm90aGluZyAqLworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBpbml0aWFsaXplIGhpZ2hlciBsZXZlbCBwYXJ0cyBvZiBDUFUgbGlrZSB0aW1lcnMKKyAqLworaW50IGNwdV9pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvaW50ZXJydXB0cy5jIGIvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhMWFlYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvaW50ZXJydXB0cy5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogaW50ZXJydXB0cy5jIC0ganVzdCBlbm91Z2ggc3VwcG9ydCBmb3IgdGhlIGRlY3JlbWVudGVyL3RpbWVyCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzh4eC5oPgorI2luY2x1ZGUgPG1wYzh4eF9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisKK2ludCBpbnRlcnJ1cHRfaW5pdF9jcHUgKHVuc2lnbmVkICpkZWNyZW1lbnRlcl9jb3VudCkKK3sKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiAhZGVmaW5lZChDT05GSUdfQU1JR0FPTkVHM1NFKQorCXByaW50ZigiaW50ZXJydXB0X2luaXQ6IEdUIG1haW4gY2F1c2UgcmVnOiAlMDh4OiUwOHhcbiIsCisJICAgICAgIEdUUkVHUkVBRChMT1dfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSKSwKKwkgICAgICAgR1RSRUdSRUFEKEhJR0hfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSKSk7CisJcHJpbnRmKCJpbnRlcnJ1cHRfaW5pdDogZXRoZXJuZXQgY2F1c2UgcmVnczogJTA4eCAlMDh4ICUwOHhcbiIsCisJICAgICAgIEdUUkVHUkVBRChFVEhFUk5FVDBfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSKSwKKwkgICAgICAgR1RSRUdSRUFEKEVUSEVSTkVUMV9JTlRFUlJVUFRfQ0FVU0VfUkVHSVNURVIpLAorCSAgICAgICBHVFJFR1JFQUQoRVRIRVJORVQyX0lOVEVSUlVQVF9DQVVTRV9SRUdJU1RFUikpOworCXByaW50ZigiaW50ZXJydXB0X2luaXQ6IGV0aGVybmV0IG1hc2sgcmVnczogICUwOHggJTA4eCAlMDh4XG4iLAorCSAgICAgICBHVFJFR1JFQUQoRVRIRVJORVQwX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSKSwKKwkgICAgICAgR1RSRUdSRUFEKEVUSEVSTkVUMV9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUiksCisJICAgICAgIEdUUkVHUkVBRChFVEhFUk5FVDJfSU5URVJSVVBUX01BU0tfUkVHSVNURVIpKTsKKwlwdXRzKCJpbnRlcnJ1cHRfaW5pdDogc2V0dGluZyBkZWNyZW1lbnRlcl9jb3VudFxuIik7CisjZW5kaWYKKwkqZGVjcmVtZW50ZXJfY291bnQgPSBnZXRfdGJjbGsoKSAvIENPTkZJR19TWVNfSFo7CisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhhbmRsZSBleHRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQKK2V4dGVybmFsX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwdXRzKCJleHRlcm5hbF9pbnRlcnJ1cHQgKG9vcHMhKVxuIik7Cit9CisKK3ZvbGF0aWxlIHVsb25nIHRpbWVzdGFtcCA9IDA7CisKKy8qCisgKiB0aW1lcl9pbnRlcnJ1cHQgLSBnZXRzIGNhbGxlZCB3aGVuIHRoZSBkZWNyZW1lbnRlciBvdmVyZmxvd3MsCisgKiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKiBUcml2aWFsIGltcGxlbWVudGF0aW9uIC0gbm8gbmVlZCB0byBiZSByZWFsbHkgYWNjdXJhdGUuCisgKi8KK3ZvaWQKK3RpbWVyX2ludGVycnVwdF9jcHUgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBJbnN0YWxsIGFuZCBmcmVlIGEgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KKwordm9pZAoraXJxX2luc3RhbGxfaGFuZGxlcihpbnQgdmVjLCBpbnRlcnJ1cHRfaGFuZGxlcl90ICpoYW5kbGVyLCB2b2lkICphcmcpCit7CisKK30KKwordm9pZAoraXJxX2ZyZWVfaGFuZGxlcihpbnQgdmVjKQoreworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitkb19pcnFpbmZvKGNtZF90YmxfdCAqY21kdHAsIGJkX3QgKmJkLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlwdXRzKCJJUlEgcmVsYXRlZCBmdW5jdGlvbnMgYXJlIHVuaW1wbGVtZW50ZWQgY3VycmVudGx5LlxuIik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1Lzc0eHhfN3h4L2lvLlMgYi9hcmNoL3Bvd2VycGMvY3B1Lzc0eHhfN3h4L2lvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyZTZkMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgvaW8uUwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgJRGFuIE1hbGVrIDxkbWFsZWtAamxjLm5ldD4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkJTWFnbnVzIERhbW0gPGtpZXJheXBjMDEucC55LmtpZS5lcmEuZXJpY3Nzb24uc2U+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAxCVN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICoJCQlBbmRyZWFzIEhlcHBlbCA8YWhlcHBlbEBzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIJV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBpbjggKi8KKy8qICBEZXNjcmlwdGlvbjogIElucHV0IDggYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibCAgaW44Citpbjg6CisJbGJ6ICAgICByMywwKHIzKQorCXN5bmMKKwlibHIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEZ1bmN0aW9uOiAgICAgaW4xNiAqLworLyogIERlc2NyaXB0aW9uOiAgSW5wdXQgMTYgYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibCAgaW4xNgoraW4xNjoKKwlsaHogICAgIHIzLDAocjMpCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBpbjE2ciAqLworLyogIERlc2NyaXB0aW9uOiAgSW5wdXQgMTYgYml0cyBhbmQgYnl0ZSByZXZlcnNlICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsICBpbjE2cgoraW4xNnI6CisJbGhicnggICByMywwLHIzCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBpbjMyICovCisvKiAgRGVzY3JpcHRpb246ICBJbnB1dCAzMiBiaXRzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsICBpbjMyCitpbjMyOgorCWx3eiAgICAgMywwKDMpCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBpbjMyciAqLworLyogIERlc2NyaXB0aW9uOiAgSW5wdXQgMzIgYml0cyBhbmQgYnl0ZSByZXZlcnNlICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLmdsb2JsICBpbjMycgoraW4zMnI6CisJbHdicnggICByMywwLHIzCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBvdXQ4ICovCisvKiAgRGVzY3JpcHRpb246ICBPdXRwdXQgOCBiaXRzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsICBvdXQ4CitvdXQ4OgorCXN0YiAgICAgcjQsMChyMykKKwlzeW5jCisJYmxyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBGdW5jdGlvbjogICAgIG91dDE2ICovCisvKiAgRGVzY3JpcHRpb246ICBPdXRwdXQgMTYgYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibCAgb3V0MTYKK291dDE2OgorCXN0aCAgICAgcjQsMChyMykKKwlzeW5jCisJYmxyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBGdW5jdGlvbjogICAgIG91dDE2ciAqLworLyogIERlc2NyaXB0aW9uOiAgQnl0ZSByZXZlcnNlIGFuZCBvdXRwdXQgMTYgYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibCAgb3V0MTZyCitvdXQxNnI6CisJc3RoYnJ4ICByNCwwLHIzCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBvdXQzMiAqLworLyogIERlc2NyaXB0aW9uOiAgT3V0cHV0IDMyIGJpdHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwgIG91dDMyCitvdXQzMjoKKwlzdHcgICAgIHI0LDAocjMpCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBvdXQzMnIgKi8KKy8qICBEZXNjcmlwdGlvbjogIEJ5dGUgcmV2ZXJzZSBhbmQgb3V0cHV0IDMyIGJpdHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwgIG91dDMycgorb3V0MzJyOgorCXN0d2JyeCAgcjQsMCxyMworCXN5bmMKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgva2dkYi5TIGIvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC9rZ2RiLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0ODdjZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvNzR4eF83eHgva2dkYi5TCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwCU11cnJheSBKZW5zZW4gPE11cnJheS5KZW5zZW5AY21zdC5jc2lyby5hdT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwN1VTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8NzR4eF83eHguaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCisgLyoKKyAqIGNhY2hlIGZsdXNoaW5nIHJvdXRpbmVzIGZvciBrZ2RiCisgKi8KKworCS5nbG9ibAlrZ2RiX2ZsdXNoX2NhY2hlX2FsbAora2dkYl9mbHVzaF9jYWNoZV9hbGw6CisJbGlzCXIzLDAKKwlhZGRpcwlyNCxyMCwweDAwNDAKK2tnZGJfZmx1c2hfbG9vcDoKKwlsd3oJcjUsMChyMykKKwlhZGRpCXIzLHIzLENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUKKwljbXAJMCwwLHIzLHI0CisJYm5lCWtnZGJfZmx1c2hfbG9vcAorCVNZTkMKKwltZnNwcglyMywxMDA4CisJb3JpCXIzLHIzLDB4ODgwMAorCW10c3ByCTEwMDgscjMKKwlzeW5jCisJYmxyCisKKwkuZ2xvYmwJa2dkYl9mbHVzaF9jYWNoZV9yYW5nZQora2dkYl9mbHVzaF9jYWNoZV9yYW5nZToKKwlsaQlyNSxDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFLTEKKwlhbmRjCXIzLHIzLHI1CisJc3ViZglyNCxyMyxyNAorCWFkZAlyNCxyNCxyNQorCXNyd2kuCXI0LHI0LENPTkZJR19TWVNfQ0FDSEVMSU5FX1NISUZUCisJYmVxbHIKKwltdGN0cglyNAorCW1yCXI2LHIzCisxOglkY2JzdAkwLHIzCisJYWRkaQlyMyxyMyxDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCisJYmRuegkxYgorCXN5bmMJCQkJLyogd2FpdCBmb3IgZGNic3QncyB0byBnZXQgdG8gcmFtICovCisJbXRjdHIJcjQKKzI6CWljYmkJMCxyNgorCWFkZGkJcjYscjYsQ09ORklHX1NZU19DQUNIRUxJTkVfU0laRQorCWJkbnoJMmIKKwlTWU5DCisJYmxyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC9zcGVlZC5jIGIvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC9zcGVlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZmRjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1Lzc0eHhfN3h4L3NwZWVkLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8NzR4eF83eHguaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpZmRlZiBDT05GSUdfQU1JR0FPTkVHM1NFCisjaW5jbHVkZSAiLi4vYm9hcmQvTUFJL0FtaWdhT25lRzNTRS92aWE2ODYuaCIKKyNlbmRpZgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X2JvYXJkX2J1c19jbGsgKHZvaWQpOworCitzdGF0aWMgY29uc3QgaW50IGhpZDFfbXVsdGlwbGllcnNfeF8xMFtdID0geworCTI1LAkvKiAwMDAwIC0gMi41eCAqLworCTc1LAkvKiAwMDAxIC0gNy41eCAqLworCTcwLAkvKiAwMDEwIC0gN3ggKi8KKwkxMCwJLyogMDAxMSAtIGJ5cGFzcyAqLworCTIwLAkvKiAwMTAwIC0gMnggKi8KKwk2NSwJLyogMDEwMSAtIDYuNXggKi8KKwkxMDAsCS8qIDAxMTAgLSAxMHggKi8KKwk0NSwJLyogMDExMSAtIDQuNXggKi8KKwkzMCwJLyogMTAwMCAtIDN4ICovCisJNTUsCS8qIDEwMDEgLSA1LjV4ICovCisJNDAsCS8qIDEwMTAgLSA0eCAqLworCTUwLAkvKiAxMDExIC0gNXggKi8KKwk4MCwJLyogMTEwMCAtIDh4ICovCisJNjAsCS8qIDExMDEgLSA2eCAqLworCTM1LAkvKiAxMTEwIC0gMy41eCAqLworCTAJLyogMTExMSAtIG9mZiAqLworfTsKKworLyogUExMX0NGR1swOjRdIHRhYmxlIGZvciBjcHUgNzQ0OC83NDQ3QS83NDU1Lzc0NTcgKi8KK3N0YXRpYyBjb25zdCBpbnQgaGlkMV83NHh4X211bHRpcGxpZXJzX3hfMTBbXSA9IHsKKwkxMTUsCS8qIDAwMDAwIC0gMTEuNXggICovCisJMTcwLAkvKiAwMDAwMSAtIDE3eCAgICAqLworCTc1LAkvKiAwMDAxMCAtICA3LjV4ICAqLworCTE1MCwJLyogMDAwMTEgLSAxNXggICAgKi8KKwk3MCwJLyogMDAxMDAgLSAgN3ggICAgKi8KKwkxODAsCS8qIDAwMTAxIC0gMTh4ICAgICovCisJMTAsCS8qIDAwMTEwIC0gYnlwYXNzICovCisJMjAwLAkvKiAwMDExMSAtIDIweCAgICAqLworCTIwLAkvKiAwMTAwMCAtICAyeCAgICAqLworCTIxMCwJLyogMDEwMDEgLSAyMXggICAgKi8KKwk2NSwJLyogMDEwMTAgLSAgNi41eCAgKi8KKwkxMzAsCS8qIDAxMDExIC0gMTN4ICAgICovCisJODUsCS8qIDAxMTAwIC0gIDguNXggICovCisJMjQwLAkvKiAwMTEwMSAtIDI0eCAgICAqLworCTk1LAkvKiAwMTExMCAtICA5LjV4ICAqLworCTkwLAkvKiAwMTExMSAtICA5eCAgICAqLworCTMwLAkvKiAxMDAwMCAtICAzeCAgICAqLworCTEwNSwJLyogMTAwMDEgLSAxMC41eCAgKi8KKwk1NSwJLyogMTAwMTAgLSAgNS41eCAgKi8KKwkxMTAsCS8qIDEwMDExIC0gMTF4ICAgICovCisJNDAsCS8qIDEwMTAwIC0gIDR4ICAgICovCisJMTAwLAkvKiAxMDEwMSAtIDEweCAgICAqLworCTUwLAkvKiAxMDExMCAtICA1eCAgICAqLworCTEyMCwJLyogMTAxMTEgLSAxMnggICAgKi8KKwk4MCwJLyogMTEwMDAgLSAgOHggICAgKi8KKwkxNDAsCS8qIDExMDAxIC0gMTR4ICAgICovCisJNjAsCS8qIDExMDEwIC0gIDZ4ICAgICovCisJMTYwLAkvKiAxMTAxMSAtIDE2eCAgICAqLworCTEzNSwJLyogMTExMDAgLSAxMy41eCAgKi8KKwkyODAsCS8qIDExMTAxIC0gMjh4ICAgICovCisJMCwJLyogMTExMTAgLSBvZmYgICAgKi8KKwkxMjUJLyogMTExMTEgLSAxMi41eCAgKi8KK307CisKK3N0YXRpYyBjb25zdCBpbnQgaGlkMV9meF9tdWx0aXBsaWVyc194XzEwW10gPSB7CisJMDAsCS8qIDAwMDAgLSBvZmYgKi8KKwkwMCwJLyogMDAwMSAtIG9mZiAqLworCTEwLAkvKiAwMDEwIC0gYnlwYXNzICovCisJMTAsCS8qIDAwMTEgLSBieXBhc3MgKi8KKwkyMCwJLyogMDEwMCAtIDJ4ICovCisJMjUsCS8qIDAxMDEgLSAyLjV4ICovCisJMzAsCS8qIDAxMTAgLSAzeCAqLworCTM1LAkvKiAwMTExIC0gMy41eCAqLworCTQwLAkvKiAxMDAwIC0gNHggKi8KKwk0NSwJLyogMTAwMSAtIDQuNXggKi8KKwk1MCwJLyogMTAxMCAtIDV4ICovCisJNTUsCS8qIDEwMTEgLSA1LjV4ICovCisJNjAsCS8qIDExMDAgLSA2eCAqLworCTY1LAkvKiAxMTAxIC0gNi41eCAqLworCTcwLAkvKiAxMTEwIC0gN3ggKi8KKwk3NSwJLyogMTExMSAtIDcuNSAqLworCTgwLAkvKiAxMDAwMCAtIDh4ICovCisJODUsCS8qIDEwMDAxIC0gOC41eCAqLworCTkwLAkvKiAxMDAxMCAtIDl4ICovCisJOTUsCS8qIDEwMDExIC0gOS41eCAqLworCTEwMCwJLyogMTAxMDAgLSAxMHggKi8KKwkxMTAsCS8qIDEwMTAxIC0gMTF4ICovCisJMTIwLAkvKiAxMDExMCAtIDEyeCAqLworfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBNZWFzdXJlIENQVSBjbG9jayBzcGVlZCAoY29yZSBjbG9jayBHQ0xLMSwgR0NMSzIpCisgKgorICogKEFwcHJveC4gR0NMSyBmcmVxdWVuY3kgaW4gSHopCisgKi8KKworaW50IGdldF9jbG9ja3MgKHZvaWQpCit7CisJdWxvbmcgY2xvY2sgPSAwOworCisjaWZkZWYgQ09ORklHX1NZU19CVVNfQ0xLCisJZ2QtPmJ1c19jbGsgPSBDT05GSUdfU1lTX0JVU19DTEs7CS8qIGJ1cyBjbG9jayBpcyBhIGZpeGVkIGZyZXF1ZW5jeSAqLworI2Vsc2UKKwlnZC0+YnVzX2NsayA9IGdldF9ib2FyZF9idXNfY2xrICgpOwkvKiBidXMgY2xvY2sgaXMgY29uZmlndXJhYmxlICovCisjZW5kaWYKKworCS8qIGNhbGN1bGF0ZSB0aGUgY2xvY2sgZnJlcXVlbmN5IGJhc2VkIHVwb24gdGhlIENQVSB0eXBlICovCisJc3dpdGNoIChnZXRfY3B1X3R5cGUoKSkgeworCWNhc2UgQ1BVXzc0NDdBOgorCWNhc2UgQ1BVXzc0NDg6CisJY2FzZSBDUFVfNzQ1NToKKwljYXNlIENQVV83NDU3OgorCQkvKgorCQkgKiBNYWtlIHN1cmUgZGl2aXNpb24gaXMgZG9uZSBiZWZvcmUgbXVsdGlwbGljYXRpb24gdG8gcHJldmVudCAzMi1iaXQKKwkJICogYXJpdGhtZXRpYyBvdmVyZmxvd3Mgd2hpY2ggd2lsbCBjYXVzZSBhIG5lZ2F0aXZlIG51bWJlcgorCQkgKi8KKwkJY2xvY2sgPSAoZ2QtPmJ1c19jbGsgLyAxMCkgKgorCQkJaGlkMV83NHh4X211bHRpcGxpZXJzX3hfMTBbKGdldF9oaWQxICgpID4+IDEyKSAmIDB4MUZdOworCQlicmVhazsKKworCWNhc2UgQ1BVXzc1MEdYOgorCWNhc2UgQ1BVXzc1MEZYOgorCQljbG9jayA9IChnZC0+YnVzX2NsayAvIDEwKSAqCisJCQloaWQxX2Z4X211bHRpcGxpZXJzX3hfMTBbZ2V0X2hpZDEgKCkgPj4gMjddOworCQlicmVhazsKKworCWNhc2UgQ1BVXzc0NTA6CisJY2FzZSBDUFVfNzQwOgorCWNhc2UgQ1BVXzc0MFA6CisJY2FzZSBDUFVfNzQ1OgorCWNhc2UgQ1BVXzc1MENYOgorCWNhc2UgQ1BVXzc1MDoKKwljYXNlIENQVV83NTBQOgorCWNhc2UgQ1BVXzc1NToKKwljYXNlIENQVV83NDAwOgorCWNhc2UgQ1BVXzc0MTA6CisJCS8qCisJCSAqIE1ha2Ugc3VyZSBkaXZpc2lvbiBpcyBkb25lIGJlZm9yZSBtdWx0aXBsaWNhdGlvbiB0byBwcmV2ZW50IDMyLWJpdAorCQkgKiBhcml0aG1ldGljIG92ZXJmbG93cyB3aGljaCB3aWxsIGNhdXNlIGEgbmVnYXRpdmUgbnVtYmVyCisJCSAqLworCQljbG9jayA9IChnZC0+YnVzX2NsayAvIDEwKSAqCisJCQloaWQxX211bHRpcGxpZXJzX3hfMTBbZ2V0X2hpZDEgKCkgPj4gMjhdOworCQlicmVhazsKKworCWNhc2UgQ1BVX1VOS05PV046CisJICAgICAgIHByaW50ZiAoImdldF9nY2xrX2ZyZXEoKTogdW5rbm93biBDUFUgdHlwZVxuIik7CisJICAgICAgIGNsb2NrID0gMDsKKwkgICAgICAgcmV0dXJuICgxKTsKKwl9CisKKwlnZC0+Y3B1X2NsayA9IGNsb2NrOworCisJcmV0dXJuICgwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC9zdGFydC5TIGIvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZmRmODgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1Lzc0eHhfN3h4L3N0YXJ0LlMKQEAgLTAsMCArMSw4NzQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4CURhbiBNYWxlayA8ZG1hbGVrQGpsYy5uZXQ+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5CU1hZ251cyBEYW1tIDxraWVyYXlwYzAxLnAueS5raWUuZXJhLmVyaWNzc29uLnNlPgorICogIENvcHlyaWdodCAoQykgMjAwMCwyMDAxLDIwMDIgV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qICBVLUJvb3QgLSBTdGFydHVwIENvZGUgZm9yIFBvd2VyUEMgYmFzZWQgRW1iZWRkZWQgQm9hcmRzCisgKgorICoKKyAqICBUaGUgcHJvY2Vzc29yIHN0YXJ0cyBhdCAweGZmZjAwMTAwIGFuZCB0aGUgY29kZSBpcyBleGVjdXRlZAorICogIGZyb20gZmxhc2guIFRoZSBjb2RlIGlzIG9yZ2FuaXplZCB0byBiZSBhdCBhbiBvdGhlciBhZGRyZXNzCisgKiAgaW4gbWVtb3J5LCBidXQgYXMgbG9uZyB3ZSBkb24ndCBqdW1wIGFyb3VuZCBiZWZvcmUgcmVsb2NhdGluZy4KKyAqICBib2FyZF9pbml0IGxpZXMgYXQgYSBxdWl0ZSBoaWdoIGFkZHJlc3MgYW5kIHdoZW4gdGhlIGNwdSBoYXMKKyAqICBqdW1wZWQgdGhlcmUsIGV2ZXJ5dGhpbmcgaXMgb2suCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDw3NHh4Xzd4eC5oPgorI2luY2x1ZGUgPHRpbWVzdGFtcC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisjaWYgIWRlZmluZWQoQ09ORklHX0RCNjQzNjApICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfREI2NDQ2MCkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19DUENJNzUwKSAmJiBcCisgICAgIWRlZmluZWQoQ09ORklHX1AzTXgpCisjaW5jbHVkZSA8Z2FsaWxlby9ndDY0MjYwUi5oPgorI2VuZGlmCisKKyNpZm5kZWYgIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUgIENPTkZJR19JREVOVF9TVFJJTkcgIiIKKyNlbmRpZgorCisvKiBXZSBkb24ndCB3YW50IHRoZSAgTU1VIHlldC4KKyovCisjdW5kZWYJTVNSX0tFUk5FTAorLyogTWFjaGluZSBDaGVjayBhbmQgUmVjb3ZlcmFibGUgSW50ZXJyLiAqLworI2RlZmluZSBNU1JfS0VSTkVMICggTVNSX01FIHwgTVNSX1JJICkKKworLyoKKyAqIFNldCB1cCBHT1Q6IEdsb2JhbCBPZmZzZXQgVGFibGUKKyAqCisgKiBVc2UgcjEyIHRvIGFjY2VzcyB0aGUgR09UCisgKi8KKwlTVEFSVF9HT1QKKwlHT1RfRU5UUlkoX0dPVDJfVEFCTEVfKQorCUdPVF9FTlRSWShfRklYVVBfVEFCTEVfKQorCisJR09UX0VOVFJZKF9zdGFydCkKKwlHT1RfRU5UUlkoX3N0YXJ0X29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKF9lbmRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkodHJhbnNmZXJfdG9faGFuZGxlcikKKworCUdPVF9FTlRSWShfX2luaXRfZW5kKQorCUdPVF9FTlRSWShfZW5kKQorCUdPVF9FTlRSWShfX2Jzc19zdGFydCkKKwlFTkRfR09UCisKKy8qCisgKiByMyAtIDFzdCBhcmcgdG8gYm9hcmRfaW5pdCgpOiBJTU1QIHBvaW50ZXIKKyAqIHI0IC0gMm5kIGFyZyB0byBib2FyZF9pbml0KCk6IGJvb3QgZmxhZworICovCisJLnRleHQKKwkubG9uZwkweDI3MDUxOTU2CQkvKiBVLUJvb3QgTWFnaWMgTnVtYmVyCQkqLworCS5nbG9ibAl2ZXJzaW9uX3N0cmluZwordmVyc2lvbl9zdHJpbmc6CisJLmFzY2lpCVVfQk9PVF9WRVJTSU9OCisJLmFzY2lpCSIgKCIsIFVfQk9PVF9EQVRFLCAiIC0gIiwgVV9CT09UX1RJTUUsICIpIgorCS5hc2NpaQlDT05GSUdfSURFTlRfU1RSSU5HLCAiXDAiCisKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKwkuZ2xvYmwJX3N0YXJ0Citfc3RhcnQ6CisJbGkJcjIxLCBCT09URkxBR19DT0xECS8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIICovCisJYglib290X2NvbGQKKwlzeW5jCisKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQgKyAweDEwCisKKwkuZ2xvYmwJX3N0YXJ0X3dhcm0KK19zdGFydF93YXJtOgorCWxpCXIyMSwgQk9PVEZMQUdfV0FSTQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCisJYglib290X3dhcm0KKwlzeW5jCisKKwkvKiB0aGUgYm9vdCBjb2RlIGlzIGxvY2F0ZWQgYmVsb3cgdGhlIGV4Y2VwdGlvbiB0YWJsZSAqLworCisJLmdsb2JsCV9zdGFydF9vZl92ZWN0b3JzCitfc3RhcnRfb2ZfdmVjdG9yczoKKworLyogTWFjaGluZSBjaGVjayAqLworCVNURF9FWENFUFRJT04oMHgyMDAsIE1hY2hpbmVDaGVjaywgTWFjaGluZUNoZWNrRXhjZXB0aW9uKQorCisvKiBEYXRhIFN0b3JhZ2UgZXhjZXB0aW9uLiAgIk5ldmVyIiBnZW5lcmF0ZWQgb24gdGhlIDg2MC4gKi8KKwlTVERfRVhDRVBUSU9OKDB4MzAwLCBEYXRhU3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogSW5zdHJ1Y3Rpb24gU3RvcmFnZSBleGNlcHRpb24uICAiTmV2ZXIiIGdlbmVyYXRlZCBvbiB0aGUgODYwLiAqLworCVNURF9FWENFUFRJT04oMHg0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg1MDAsIEV4dEludGVycnVwdCwgZXh0ZXJuYWxfaW50ZXJydXB0KQorCisvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLworCS4gPSAweDYwMAorQWxpZ25tZW50OgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwltZnNwcglyNCxEQVIKKwlzdHcJcjQsX0RBUihyMjEpCisJbWZzcHIJcjUsRFNJU1IKKwlzdHcJcjUsX0RTSVNSKHIyMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRVhDX1hGRVJfVEVNUExBVEUoQWxpZ25tZW50LCBBbGlnbm1lbnRFeGNlcHRpb24sIE1TUl9LRVJORUwsIENPUFlfRUUpCisKKy8qIFByb2dyYW0gY2hlY2sgZXhjZXB0aW9uICovCisJLiA9IDB4NzAwCitQcm9ncmFtQ2hlY2s6CisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlFWENfWEZFUl9URU1QTEFURShQcm9ncmFtQ2hlY2ssIFByb2dyYW1DaGVja0V4Y2VwdGlvbiwKKwkJTVNSX0tFUk5FTCwgQ09QWV9FRSkKKworCS8qIE5vIEZQVSBvbiBNUEM4eHguICBUaGlzIGV4Y2VwdGlvbiBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuLgorCSovCisJU1REX0VYQ0VQVElPTigweDgwMCwgRlBVbmF2YWlsYWJsZSwgVW5rbm93bkV4Y2VwdGlvbikKKworCS8qIEkgZ3Vlc3Mgd2UgY291bGQgaW1wbGVtZW50IGRlY3JlbWVudGVyLCBhbmQgbWF5IGhhdmUKKwkgKiB0byBzb21lZGF5IGZvciB0aW1la2VlcGluZy4KKwkgKi8KKwlTVERfRVhDRVBUSU9OKDB4OTAwLCBEZWNyZW1lbnRlciwgdGltZXJfaW50ZXJydXB0KQorCVNURF9FWENFUFRJT04oMHhhMDAsIFRyYXBfMGEsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGIwMCwgVHJhcF8wYiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4YzAwLCBTeXN0ZW1DYWxsLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhkMDAsIFNpbmdsZVN0ZXAsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKDB4ZTAwLCBUcmFwXzBlLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhmMDAsIFRyYXBfMGYsIFVua25vd25FeGNlcHRpb24pCisKKwkvKgorCSAqIE9uIHRoZSBNUEM4eHgsIHRoaXMgaXMgYSBzb2Z0d2FyZSBlbXVsYXRpb24gaW50ZXJydXB0LiBJdAorCSAqIG9jY3VycyBmb3IgYWxsIHVuaW1wbGVtZW50ZWQgYW5kIGlsbGVnYWwgaW5zdHJ1Y3Rpb25zLgorCSAqLworCVNURF9FWENFUFRJT04oMHgxMDAwLCBTb2Z0RW11LCBTb2Z0RW11RXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTigweDExMDAsIEluc3RydWN0aW9uVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTIwMCwgRGF0YVRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDEzMDAsIEluc3RydWN0aW9uVExCRXJyb3IsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE0MDAsIERhdGFUTEJFcnJvciwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHgxNTAwLCBSZXNlcnZlZDUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE2MDAsIFJlc2VydmVkNiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTcwMCwgUmVzZXJ2ZWQ3LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxODAwLCBSZXNlcnZlZDgsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE5MDAsIFJlc2VydmVkOSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWEwMCwgUmVzZXJ2ZWRBLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxYjAwLCBSZXNlcnZlZEIsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKDB4MWMwMCwgRGF0YUJyZWFrcG9pbnQsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFkMDAsIEluc3RydWN0aW9uQnJlYWtwb2ludCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWUwMCwgUGVyaXBoZXJhbEJyZWFrcG9pbnQsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFmMDAsIERldlBvcnRCcmVha3BvaW50LCBVbmtub3duRXhjZXB0aW9uKQorCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisJLiA9IDB4MjAwMAorCitib290X2NvbGQ6Citib290X3dhcm06CisJLyogZGlzYWJsZSBldmVyeXRoaW5nICovCisJbGkJcjAsIDAKKwltdHNwcglISUQwLCByMAorCXN5bmMKKwltdG1zcgkwCisJYmwJaW52YWxpZGF0ZV9iYXRzCisJc3luYworCisjaWZkZWYgQ09ORklHX1NZU19MMgorCS8qIGluaXQgdGhlIEwyIGNhY2hlICovCisJYWRkaXMJcjMsIHIwLCBMMl9JTklUQGgKKwlvcmkJcjMsIHIzLCBMMl9JTklUQGwKKwlzeW5jCisJbXRzcHIJbDJjciwgcjMKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FMVElWRUMpICYmIGRlZmluZWQoQ09ORklHXzc0eHgpCisJLmxvbmcJMHg3ZTAwMDY2YworCQkvKgorCQkgKiBkc3NhbGwgaW5zdHJ1Y3Rpb24sIGdhcyBkb2Vzbid0IGhhdmUgaXQgeWV0CisJCSAqIC4uLmZvciBhbHRpdmVjLCBkYXRhIHN0cmVhbSBzdG9wIGFsbCB0aGlzIHByb2JhYmx5CisJCSAqIGlzbid0IG5lZWRlZCB1bmxlc3Mgd2Ugd2FybSAoc29mdHdhcmUpIHJlYm9vdCBVLUJvb3QKKwkJICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TWVNfTDIKKwkvKiBpbnZhbGlkYXRlIHRoZSBMMiBjYWNoZSAqLworCWJsCWwyY2FjaGVfaW52YWxpZGF0ZQorCXN5bmMKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfQk9BUkRfQVNNX0lOSVQKKwkvKiBkbyBlYXJseSBpbml0ICovCisJYmwJYm9hcmRfYXNtX2luaXQKKyNlbmRpZgorCisJLyoKKwkgKiBDYWxjdWxhdGUgYWJzb2x1dGUgYWRkcmVzcyBpbiBGTEFTSCBhbmQganVtcCB0aGVyZQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsaXMJcjMsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBsCisJYWRkaQlyMywgcjMsIGluX2ZsYXNoIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwltdGxyCXIzCisJYmxyCisKK2luX2ZsYXNoOgorCS8qIGxldCB0aGUgQy1jb2RlIHNldCB1cCB0aGUgcmVzdAkJCSovCisJLyoJCQkJCQkJKi8KKwkvKiBCZSBjYXJlZnVsIHRvIGtlZXAgY29kZSByZWxvY2F0YWJsZSAhCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIHBlcmZvcm0gbG93LWxldmVsIGluaXQgKi8KKwkvKiBzZHJhbSBpbml0LCBnYWxpbGVvIGluaXQsIGV0YyAqLworCS8qIHIzOglOSFIgYml0IGZyb20gSElEMCAqLworCisJLyogc2V0dXAgdGhlIGJhdHMgKi8KKwlibAlzZXR1cF9iYXRzCisJc3luYworCisJLyoKKwkgKiBDYWNoZSBtdXN0IGJlIGVuYWJsZWQgaGVyZSBmb3Igc3RhY2staW4tY2FjaGUgdHJpY2suCisJICogVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgQkFUUy4KKwkgKiBUaGlzIG1lYW5zOgorCSAqICAgMSkgZm9yIHRoZSBFVkIsIG9yaWdpbmFsIGd0IHJlZ3MgbmVlZCB0byBiZSBtYXBwZWQKKwkgKiAgIDIpIG5lZWQgdG8gaGF2ZSBhbiBJQkFUIGZvciB0aGUgMHhmIHJlZ2lvbiwKKwkgKiAgICAgIHdlIGFyZSBydW5uaW5nIHRoZXJlIQorCSAqIENhY2hlIHNob3VsZCBiZSB0dXJuZWQgb24gYWZ0ZXIgQkFUcywgc2luY2UgYnkgZGVmYXVsdAorCSAqIGV2ZXJ5dGhpbmcgaXMgd3JpdGUtdGhyb3VnaC4KKwkgKiBUaGUgaW5pdC1tZW0gQkFUIGNhbiBiZSByZXVzZWQgYWZ0ZXIgcmVsb2MuIFRoZSBvbGQKKwkgKiBndC1yZWdzIEJBVCBjYW4gYmUgcmV1c2VkIGFmdGVyIGJvYXJkX2luaXRfZiBjYWxscworCSAqIGJvYXJkX2Vhcmx5X2luaXRfZiAoRVZCIG9ubHkpLgorCSAqLworI2lmICFkZWZpbmVkKENPTkZJR19CQUI3eHgpICYmICFkZWZpbmVkKENPTkZJR19FTFBQQykgJiYgIWRlZmluZWQoQ09ORklHX1AzTXgpCisJLyogZW5hYmxlIGFkZHJlc3MgdHJhbnNsYXRpb24gKi8KKwlibAllbmFibGVfYWRkcl90cmFucworCXN5bmMKKworCS8qIGVuYWJsZSBhbmQgaW52YWxpZGF0ZSB0aGUgZGF0YSBjYWNoZSAqLworCWJsCWwxZGNhY2hlX2VuYWJsZQorCXN5bmMKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfSU5JVF9SQU1fTE9DSworCWJsCWxvY2tfcmFtX2luX2NhY2hlCisJc3luYworI2VuZGlmCisKKwkvKiBzZXQgdXAgdGhlIHN0YWNrIHBvaW50ZXIgaW4gb3VyIG5ld2x5IGNyZWF0ZWQKKwkgKiBjYWNoZS1yYW0gKHIxKSAqLworCWxpcwlyMSwgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfR0JMX0RBVEFfT0ZGU0VUKUBoCisJb3JpCXIxLCByMSwgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfR0JMX0RBVEFfT0ZGU0VUKUBsCisKKwlsaQlyMCwgMAkJLyogTWFrZSByb29tIGZvciBzdGFjayBmcmFtZSBoZWFkZXIgYW5kCSovCisJc3R3dQlyMCwgLTQocjEpCS8qIGNsZWFyIGZpbmFsIHN0YWNrIGZyYW1lIHNvIHRoYXQJKi8KKwlzdHd1CXIwLCAtNChyMSkJLyogc3RhY2sgYmFja3RyYWNlcyB0ZXJtaW5hdGUgY2xlYW5seQkqLworCisJR0VUX0dPVAkJCS8qIGluaXRpYWxpemUgR09UIGFjY2VzcwkqLworCisJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlICAgICAoZnJvbSBGbGFzaCkJKi8KKwlibAljcHVfaW5pdF9mCisJc3luYworCisJbXIJcjMsIHIyMQorCisJLyogcjM6IEJPT1RGTEFHICovCisJLyogcnVuIDFzdCBwYXJ0IG9mIGJvYXJkIGluaXQgY29kZSAoZnJvbSBGbGFzaCkgICAqLworCWJsCWJvYXJkX2luaXRfZgorCXN5bmMKKworCS8qIE5PVFJFQUNIRUQgKi8KKworCS5nbG9ibAlpbnZhbGlkYXRlX2JhdHMKK2ludmFsaWRhdGVfYmF0czoKKwkvKiBpbnZhbGlkYXRlIEJBVHMgKi8KKwltdHNwcglJQkFUMFUsIHIwCisJbXRzcHIJSUJBVDFVLCByMAorCW10c3ByCUlCQVQyVSwgcjAKKwltdHNwcglJQkFUM1UsIHIwCisjaWZkZWYgQ09ORklHX0hJR0hfQkFUUworCW10c3ByICAgSUJBVDRVLCByMAorCW10c3ByICAgSUJBVDVVLCByMAorCW10c3ByICAgSUJBVDZVLCByMAorCW10c3ByICAgSUJBVDdVLCByMAorI2VuZGlmCisJaXN5bmMKKwltdHNwcglEQkFUMFUsIHIwCisJbXRzcHIJREJBVDFVLCByMAorCW10c3ByCURCQVQyVSwgcjAKKwltdHNwcglEQkFUM1UsIHIwCisjaWZkZWYgQ09ORklHX0hJR0hfQkFUUworCW10c3ByICAgREJBVDRVLCByMAorCW10c3ByICAgREJBVDVVLCByMAorCW10c3ByICAgREJBVDZVLCByMAorCW10c3ByICAgREJBVDdVLCByMAorI2VuZGlmCisJaXN5bmMKKwlzeW5jCisJYmxyCisKKwkvKiBzZXR1cF9iYXRzIC0gc2V0IHRoZW0gdXAgdG8gc29tZSBpbml0aWFsIHN0YXRlICovCisJLmdsb2JsCXNldHVwX2JhdHMKK3NldHVwX2JhdHM6CisJYWRkaXMJcjAsIHIwLCAweDAwMDAKKworCS8qIElCQVQgMCAqLworCWFkZGlzCXI0LCByMCwgQ09ORklHX1NZU19JQkFUMExAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfSUJBVDBMQGwKKwlhZGRpcwlyMywgcjAsIENPTkZJR19TWVNfSUJBVDBVQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0lCQVQwVUBsCisJbXRzcHIJSUJBVDBMLCByNAorCW10c3ByCUlCQVQwVSwgcjMKKwlpc3luYworCisJLyogREJBVCAwICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0RCQVQwTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19EQkFUMExAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19EQkFUMFVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfREJBVDBVQGwKKwltdHNwcglEQkFUMEwsIHI0CisJbXRzcHIJREJBVDBVLCByMworCWlzeW5jCisKKwkvKiBJQkFUIDEgKi8KKwlhZGRpcwlyNCwgcjAsIENPTkZJR19TWVNfSUJBVDFMQGgKKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX0lCQVQxTEBsCisJYWRkaXMJcjMsIHIwLCBDT05GSUdfU1lTX0lCQVQxVUBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19JQkFUMVVAbAorCW10c3ByCUlCQVQxTCwgcjQKKwltdHNwcglJQkFUMVUsIHIzCisJaXN5bmMKKworCS8qIERCQVQgMSAqLworCWFkZGlzCXI0LCByMCwgQ09ORklHX1NZU19EQkFUMUxAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfREJBVDFMQGwKKwlhZGRpcwlyMywgcjAsIENPTkZJR19TWVNfREJBVDFVQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0RCQVQxVUBsCisJbXRzcHIJREJBVDFMLCByNAorCW10c3ByCURCQVQxVSwgcjMKKwlpc3luYworCisJLyogSUJBVCAyICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0lCQVQyTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JQkFUMkxAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19JQkFUMlVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSUJBVDJVQGwKKwltdHNwcglJQkFUMkwsIHI0CisJbXRzcHIJSUJBVDJVLCByMworCWlzeW5jCisKKwkvKiBEQkFUIDIgKi8KKwlhZGRpcwlyNCwgcjAsIENPTkZJR19TWVNfREJBVDJMQGgKKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX0RCQVQyTEBsCisJYWRkaXMJcjMsIHIwLCBDT05GSUdfU1lTX0RCQVQyVUBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19EQkFUMlVAbAorCW10c3ByCURCQVQyTCwgcjQKKwltdHNwcglEQkFUMlUsIHIzCisJaXN5bmMKKworCS8qIElCQVQgMyAqLworCWFkZGlzCXI0LCByMCwgQ09ORklHX1NZU19JQkFUM0xAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfSUJBVDNMQGwKKwlhZGRpcwlyMywgcjAsIENPTkZJR19TWVNfSUJBVDNVQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0lCQVQzVUBsCisJbXRzcHIJSUJBVDNMLCByNAorCW10c3ByCUlCQVQzVSwgcjMKKwlpc3luYworCisJLyogREJBVCAzICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0RCQVQzTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19EQkFUM0xAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19EQkFUM1VAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfREJBVDNVQGwKKwltdHNwcglEQkFUM0wsIHI0CisJbXRzcHIJREJBVDNVLCByMworCWlzeW5jCisKKyNpZmRlZiBDT05GSUdfSElHSF9CQVRTCisJLyogSUJBVCA0ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfSUJBVDRMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19JQkFUNExAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0lCQVQ0VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfSUJBVDRVQGwKKwltdHNwciAgIElCQVQ0TCwgcjQKKwltdHNwciAgIElCQVQ0VSwgcjMKKwlpc3luYworCisJLyogREJBVCA0ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfREJBVDRMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19EQkFUNExAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0RCQVQ0VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfREJBVDRVQGwKKwltdHNwciAgIERCQVQ0TCwgcjQKKwltdHNwciAgIERCQVQ0VSwgcjMKKwlpc3luYworCisJLyogSUJBVCA1ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfSUJBVDVMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19JQkFUNUxAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0lCQVQ1VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfSUJBVDVVQGwKKwltdHNwciAgIElCQVQ1TCwgcjQKKwltdHNwciAgIElCQVQ1VSwgcjMKKwlpc3luYworCisJLyogREJBVCA1ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfREJBVDVMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19EQkFUNUxAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0RCQVQ1VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfREJBVDVVQGwKKwltdHNwciAgIERCQVQ1TCwgcjQKKwltdHNwciAgIERCQVQ1VSwgcjMKKwlpc3luYworCisJLyogSUJBVCA2ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfSUJBVDZMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19JQkFUNkxAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0lCQVQ2VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfSUJBVDZVQGwKKwltdHNwciAgIElCQVQ2TCwgcjQKKwltdHNwciAgIElCQVQ2VSwgcjMKKwlpc3luYworCisJLyogREJBVCA2ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfREJBVDZMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19EQkFUNkxAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0RCQVQ2VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfREJBVDZVQGwKKwltdHNwciAgIERCQVQ2TCwgcjQKKwltdHNwciAgIERCQVQ2VSwgcjMKKwlpc3luYworCisJLyogSUJBVCA3ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfSUJBVDdMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19JQkFUN0xAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0lCQVQ3VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfSUJBVDdVQGwKKwltdHNwciAgIElCQVQ3TCwgcjQKKwltdHNwciAgIElCQVQ3VSwgcjMKKwlpc3luYworCisJLyogREJBVCA3ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfREJBVDdMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19EQkFUN0xAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0RCQVQ3VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfREJBVDdVQGwKKwltdHNwciAgIERCQVQ3TCwgcjQKKwltdHNwciAgIERCQVQ3VSwgcjMKKwlpc3luYworI2VuZGlmCisKKwkvKiBiYXRzIGFyZSBkb25lLCBub3cgaW52YWxpZGF0ZSB0aGUgVExCcyAqLworCisJYWRkaXMJcjMsIDAsIDB4MDAwMAorCWFkZGlzCXI1LCAwLCAweDQgICAgLyogdXBwZXIgYm91bmQgb2YgMHgwMDA0MDAwMCBmb3IgNzQwMC83NTAgKi8KKworCWlzeW5jCisKK3RsYmxwOgorCXRsYmllCXIzCisJc3luYworCWFkZGkJcjMsIHIzLCAweDEwMDAKKwljbXAJMCwgMCwgcjMsIHI1CisJYmx0IHRsYmxwCisKKwlibHIKKworCS5nbG9ibCBlbmFibGVfYWRkcl90cmFucworZW5hYmxlX2FkZHJfdHJhbnM6CisJLyogZW5hYmxlIGFkZHJlc3MgdHJhbnNsYXRpb24gKi8KKwltZm1zcglyNQorCW9yaQlyNSwgcjUsIChNU1JfSVIgfCBNU1JfRFIpCisJbXRtc3IJcjUKKwlpc3luYworCWJscgorCisJLmdsb2JsIGRpc2FibGVfYWRkcl90cmFucworZGlzYWJsZV9hZGRyX3RyYW5zOgorCS8qIGRpc2FibGUgYWRkcmVzcyB0cmFuc2xhdGlvbiAqLworCW1mbHIJcjQKKwltZm1zcglyMworCWFuZGkuCXIwLCByMywgKE1TUl9JUiB8IE1TUl9EUikKKwliZXFscgorCWFuZGMJcjMsIHIzLCByMAorCW10c3ByCVNSUjAsIHI0CisJbXRzcHIJU1JSMSwgcjMKKwlyZmkKKworLyoKKyAqIFRoaXMgY29kZSBmaW5pc2hlcyBzYXZpbmcgdGhlIHJlZ2lzdGVycyB0byB0aGUgZXhjZXB0aW9uIGZyYW1lCisgKiBhbmQganVtcHMgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBleGNlcHRpb24uCisgKiBSZWdpc3RlciByMjEgaXMgcG9pbnRlciBpbnRvIHRyYXAgZnJhbWUsIHIxIGhhcyBuZXcgc3RhY2sgcG9pbnRlci4KKyAqLworCS5nbG9ibAl0cmFuc2Zlcl90b19oYW5kbGVyCit0cmFuc2Zlcl90b19oYW5kbGVyOgorCXN0dwlyMjIsX05JUChyMjEpCisJbGlzCXIyMixNU1JfUE9XQGgKKwlhbmRjCXIyMyxyMjMscjIyCisJc3R3CXIyMyxfTVNSKHIyMSkKKwlTQVZFX0dQUig3LCByMjEpCisJU0FWRV80R1BSUyg4LCByMjEpCisJU0FWRV84R1BSUygxMiwgcjIxKQorCVNBVkVfOEdQUlMoMjQsIHIyMSkKKwltZmxyCXIyMworCWFuZGkuCXIyNCxyMjMsMHgzZjAwCQkvKiBnZXQgdmVjdG9yIG9mZnNldCAqLworCXN0dwlyMjQsVFJBUChyMjEpCisJbGkJcjIyLDAKKwlzdHcJcjIyLFJFU1VMVChyMjEpCisJbXRzcHIJU1BSRzIscjIyCQkvKiByMSBpcyBub3cga2VybmVsIHNwICovCisJbHd6CXIyNCwwKHIyMykJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBoYW5kbGVyICovCisJbHd6CXIyMyw0KHIyMykJCS8qIHdoZXJlIHRvIGdvIHdoZW4gZG9uZSAqLworCW10c3ByCVNSUjAscjI0CisJbXRzcHIJU1JSMSxyMjAKKwltdGxyCXIyMworCVNZTkMKKwlyZmkJCQkJLyoganVtcCB0byBoYW5kbGVyLCBlbmFibGUgTU1VICovCisKK2ludF9yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1JSMCxyMgorCW10c3ByCVNSUjEscjAKKwlsd3oJcjAsR1BSMChyMSkKKwlsd3oJcjIsR1BSMihyMSkKKwlsd3oJcjEsR1BSMShyMSkKKwlTWU5DCisJcmZpCisKKwkuZ2xvYmwJZGNfcmVhZAorZGNfcmVhZDoKKwlibHIKKworCS5nbG9ibCBnZXRfcHZyCitnZXRfcHZyOgorCW1mc3ByCXIzLCBQVlIKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogdm9pZCByZWxvY2F0ZV9jb2RlIChhZGRyX3NwLCBnZCwgYWRkcl9tb25pKQorICoKKyAqIFRoaXMgImZ1bmN0aW9uIiBkb2VzIG5vdCByZXR1cm4sIGluc3RlYWQgaXQgY29udGludWVzIGluIFJBTQorICogYWZ0ZXIgcmVsb2NhdGluZyB0aGUgbW9uaXRvciBjb2RlLgorICoKKyAqIHIzID0gZGVzdAorICogcjQgPSBzcmMKKyAqIHI1ID0gbGVuZ3RoIGluIGJ5dGVzCisgKiByNiA9IGNhY2hlbGluZXNpemUKKyAqLworCS5nbG9ibAlyZWxvY2F0ZV9jb2RlCityZWxvY2F0ZV9jb2RlOgorCW1yCXIxLCAgcjMJCS8qIFNldCBuZXcgc3RhY2sgcG9pbnRlcgkJKi8KKwltcglyOSwgIHI0CQkvKiBTYXZlIGNvcHkgb2YgR2xvYmFsIERhdGEgcG9pbnRlcgkqLworCW1yCXIxMCwgcjUJCS8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisKKwlHRVRfR09UCisJbXIJcjMsICByNQkJCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisJbGlzCXI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWx3eglyNSwgR09UKF9faW5pdF9lbmQpCisJc3ViCXI1LCByNSwgcjQKKwlsaQlyNiwgQ09ORklHX1NZU19DQUNIRUxJTkVfU0laRQkJLyogQ2FjaGUgTGluZSBTaXplCSovCisKKwkvKgorCSAqIEZpeCBHT1QgcG9pbnRlcjoKKwkgKgorCSAqIE5ldyBHT1QtUFRSID0gKG9sZCBHT1QtUFRSIC0gQ09ORklHX1NZU19NT05JVE9SX0JBU0UpICsgRGVzdGluYXRpb24gQWRkcmVzcworCSAqCisJICogT2Zmc2V0OgorCSAqLworCXN1YglyMTUsIHIxMCwgcjQKKworCS8qIEZpcnN0IG91ciBvd24gR09UICovCisJYWRkCXIxMiwgcjEyLCByMTUKKwkvKiB0aGVuIHRoZSBvbmUgdXNlZCBieSB0aGUgQyBjb2RlICovCisJYWRkCXIzMCwgcjMwLCByMTUKKworCS8qCisJICogTm93IHJlbG9jYXRlIGNvZGUKKwkgKi8KKyNpZmRlZiBDT05GSUdfRUNDCisJYmwJYm9hcmRfcmVsb2NhdGVfcm9tCisJc3luYworCW1yCXIzLCByMTAJCQkJLyogRGVzdGluYXRpb24gQWRkcmVzcwkqLworCWxpcwlyNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAaAkJLyogU291cmNlICAgICAgQWRkcmVzcwkqLworCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGwKKwlsd3oJcjUsIEdPVChfX2luaXRfZW5kKQorCXN1YglyNSwgcjUsIHI0CisJbGkJcjYsIENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUJCS8qIENhY2hlIExpbmUgU2l6ZQkqLworI2Vsc2UKKwljbXBsdwljcjEscjMscjQKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJYmVxCWNyMSw0ZgkJLyogSW4gcGxhY2UgY29weSBpcyBub3QgbmVjZXNzYXJ5CSovCisJYmVxCTdmCQkvKiBQcm90ZWN0IGFnYWluc3QgMCBjb3VudAkJKi8KKwltdGN0cglyMAorCWJnZQljcjEsMmYKKworCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisJYgk0ZgorCisyOglzbHdpCXIwLHIwLDIKKwlhZGQJcjgscjQscjAKKwlhZGQJcjcscjMscjAKKzM6CWx3enUJcjAsLTQocjgpCisJc3R3dQlyMCwtNChyNykKKwliZG56CTNiCisjZW5kaWYKKy8qCisgKiBOb3cgZmx1c2ggdGhlIGNhY2hlOiBub3RlIHRoYXQgd2UgbXVzdCBzdGFydCBmcm9tIGEgY2FjaGUgYWxpZ25lZAorICogYWRkcmVzcy4gT3RoZXJ3aXNlIHdlIG1pZ2h0IG1pc3Mgb25lIGNhY2hlIGxpbmUuCisgKi8KKzQ6CWNtcHdpCXI2LDAKKwlhZGQJcjUscjMscjUKKwliZXEJN2YJCS8qIEFsd2F5cyBmbHVzaCBwcmVmZXRjaCBxdWV1ZSBpbiBhbnkgY2FzZSAqLworCXN1YmkJcjAscjYsMQorCWFuZGMJcjMscjMscjAKKwltcglyNCxyMworNToJZGNic3QJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTViCisJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBkY2JzdCB0byBjb21wbGV0ZSBvbiBidXMgKi8KKwltcglyNCxyMworNjoJaWNiaQkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNmIKKzc6CXN5bmMJCQkvKiBXYWl0IGZvciBhbGwgaWNiaSB0byBjb21wbGV0ZSBvbiBidXMJKi8KKwlpc3luYworCisvKgorICogV2UgYXJlIGRvbmUuIERvIG5vdCByZXR1cm4sIGluc3RlYWQgYnJhbmNoIHRvIHNlY29uZCBwYXJ0IG9mIGJvYXJkCisgKiBpbml0aWFsaXphdGlvbiwgbm93IHJ1bm5pbmcgZnJvbSBSQU0uCisgKi8KKwlhZGRpCXIwLCByMTAsIGluX3JhbSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbXRscglyMAorCWJscgorCitpbl9yYW06CisjaWZkZWYgQ09ORklHX0VDQworCWJsCWJvYXJkX2luaXRfZWNjCisjZW5kaWYKKwkvKgorCSAqIFJlbG9jYXRpb24gRnVuY3Rpb24sIHIxMiBwb2ludCB0byBnb3QyKzB4ODAwMAorCSAqCisJICogQWRqdXN0IGdvdDIgcG9pbnRlcnMsIG5vIG5lZWQgdG8gY2hlY2sgZm9yIDAsIHRoaXMgY29kZQorCSAqIGFscmVhZHkgcHV0cyBhIGZldyBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKwkgKi8KKwlsaQlyMCxfX2dvdDJfZW50cmllc0BzZWN0b2ZmQGwKKwlsYQlyMyxHT1QoX0dPVDJfVEFCTEVfKQorCWx3eglyMTEsR09UKF9HT1QyX1RBQkxFXykKKwltdGN0cglyMAorCXN1YglyMTEscjMscjExCisJYWRkaQlyMyxyMywtNAorMToJbHd6dQlyMCw0KHIzKQorCWNtcHdpCXIwLDAKKwliZXEtCTJmCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMCwwKHIzKQorMjoJYmRuegkxYgorCisJLyoKKwkgKiBOb3cgYWRqdXN0IHRoZSBmaXh1cHMgYW5kIHRoZSBwb2ludGVycyB0byB0aGUgZml4dXBzCisJICogaW4gY2FzZSB3ZSBuZWVkIHRvIG1vdmUgb3Vyc2VsdmVzIGFnYWluLgorCSAqLworCWxpCXIwLF9fZml4dXBfZW50cmllc0BzZWN0b2ZmQGwKKwlsd3oJcjMsR09UKF9GSVhVUF9UQUJMRV8pCisJY21wd2kJcjAsMAorCW10Y3RyCXIwCisJYWRkaQlyMyxyMywtNAorCWJlcQk0ZgorMzoJbHd6dQlyNCw0KHIzKQorCWx3enV4CXIwLHI0LHIxMQorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjEwLDAocjMpCisJc3R3CXIwLDAocjQpCisJYmRuegkzYgorNDoKKy8qIGNsZWFyX2JzczogKi8KKwkvKgorCSAqIE5vdyBjbGVhciBCU1Mgc2VnbWVudAorCSAqLworCWx3eglyMyxHT1QoX19ic3Nfc3RhcnQpCisJbHd6CXI0LEdPVChfZW5kKQorCisJY21wbHcJMCwgcjMsIHI0CisJYmVxCTZmCisKKwlsaQlyMCwgMAorNToKKwlzdHcJcjAsIDAocjMpCisJYWRkaQlyMywgcjMsIDQKKwljbXBsdwkwLCByMywgcjQKKwlibmUJNWIKKzY6CisJbXIJcjMsIHIxMAkJLyogRGVzdGluYXRpb24gQWRkcmVzcwkJKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BTUlHQU9ORUczU0UpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19EQjY0MzYwKQkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0RCNjQ0NjApICAgICAgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQQ0k3NTApCXx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19QUE1DN1hYKSAgICAgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1AzTXgpCisJbXIJcjQsIHI5CQkvKiBVc2UgUkFNIGNvcHkgb2YgdGhlIGdsb2JhbCBkYXRhICovCisjZW5kaWYKKwlibAlhZnRlcl9yZWxvYworCisJLyogbm90IHJlYWNoZWQgLSBlbmQgcmVsb2NhdGVfY29kZSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKgorCSAqIENvcHkgZXhjZXB0aW9uIHZlY3RvciBjb2RlIHRvIGxvdyBtZW1vcnkKKwkgKgorCSAqIHIzOiBkZXN0X2FkZHIKKwkgKiByNzogc291cmNlIGFkZHJlc3MsIHI4OiBlbmQgYWRkcmVzcywgcjk6IHRhcmdldCBhZGRyZXNzCisJICovCisJLmdsb2JsCXRyYXBfaW5pdAordHJhcF9pbml0OgorCW1mbHIJcjQJCQkvKiBzYXZlIGxpbmsgcmVnaXN0ZXIJCSovCisJR0VUX0dPVAorCWx3eglyNywgR09UKF9zdGFydCkKKwlsd3oJcjgsIEdPVChfZW5kX29mX3ZlY3RvcnMpCisKKwlsaQlyOSwgMHgxMDAJCS8qIHJlc2V0IHZlY3RvciBhbHdheXMgYXQgMHgxMDAgKi8KKworCWNtcGx3CTAsIHI3LCByOAorCWJnZWxyCQkJCS8qIHJldHVybiBpZiByNz49cjggLSBqdXN0IGluIGNhc2UgKi8KKzE6CisJbHd6CXIwLCAwKHI3KQorCXN0dwlyMCwgMChyOSkKKwlhZGRpCXI3LCByNywgNAorCWFkZGkJcjksIHI5LCA0CisJY21wbHcJMCwgcjcsIHI4CisJYm5lCTFiCisKKwkvKgorCSAqIHJlbG9jYXRlIGBoZGxyJyBhbmQgYGludF9yZXR1cm4nIGVudHJpZXMKKwkgKi8KKwlsaQlyNywgLkxfTWFjaGluZUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzI6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yCSovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTJiCisKKwlsaQlyNywgLkxfQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfUHJvZ3JhbUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfRlBVbmF2YWlsYWJsZSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIFN5c3RlbUNhbGwgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMzoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJM2IKKworCWxpCXI3LCAuTF9TaW5nbGVTdGVwIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgX2VuZF9vZl92ZWN0b3JzIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzQ6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yCSovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTRiCisKKwkvKiBlbmFibGUgZXhlY3B0aW9ucyBmcm9tIFJBTSB2ZWN0b3JzICovCisJbWZtc3IJcjcKKwlsaQlyOCxNU1JfSVAKKwlhbmRjCXI3LHI3LHI4CisJbXRtc3IJcjcKKworCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIJKi8KKwlibHIKKworI2lmZGVmIENPTkZJR19TWVNfSU5JVF9SQU1fTE9DSworbG9ja19yYW1faW5fY2FjaGU6CisJLyogQWxsb2NhdGUgSW5pdGlhbCBSQU0gaW4gZGF0YSBjYWNoZS4KKwkgKi8KKwlsaXMJcjMsIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgJiB+MzEpQGgKKwlvcmkJcjMsIHIzLCAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICYgfjMxKUBsCisJbGkJcjQsICgoQ09ORklHX1NZU19JTklUX1JBTV9FTkQgJiB+MzEpICsgXAorCQkgICAgIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgJiAzMSkgKyAzMSkgLyAzMgorCW10Y3RyCXI0CisxOgorCWRjYnoJcjAsIHIzCisJYWRkaQlyMywgcjMsIDMyCisJYmRuegkxYgorCisJLyogTG9jayB0aGUgZGF0YSBjYWNoZSAqLworCW1mc3ByCXIwLCBISUQwCisJb3JpCXIwLCByMCwgMHgxMDAwCisJc3luYworCW10c3ByCUhJRDAsIHIwCisJc3luYworCWJscgorCisuZ2xvYmwgdW5sb2NrX3JhbV9pbl9jYWNoZQordW5sb2NrX3JhbV9pbl9jYWNoZToKKwkvKiBpbnZhbGlkYXRlIHRoZSBJTklUX1JBTSBzZWN0aW9uICovCisJbGlzCXIzLCAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICYgfjMxKUBoCisJb3JpCXIzLCByMywgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiAmIH4zMSlAbAorCWxpCXI0LCAoKENPTkZJR19TWVNfSU5JVF9SQU1fRU5EICYgfjMxKSArIFwKKwkJICAgICAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICYgMzEpICsgMzEpIC8gMzIKKwltdGN0cglyNAorMToJaWNiaQlyMCwgcjMKKwlhZGRpCXIzLCByMywgMzIKKwliZG56CTFiCisJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBpY2JpIHRvIGNvbXBsZXRlIG9uIGJ1cwkqLworCWlzeW5jCisKKwkvKiBVbmxvY2sgdGhlIGRhdGEgY2FjaGUgYW5kIGludmFsaWRhdGUgaXQgKi8KKwltZnNwciAgIHIwLCBISUQwCisJbGkgICAgICByMywweDEwMDAKKwlhbmRjICAgIHIwLHIwLHIzCisJbGkJcjMsMHgwNDAwCisJb3IJcjAscjAscjMKKwlzeW5jCisJbXRzcHIgICBISUQwLCByMAorCXN5bmMKKwlibHIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2NwdS83NHh4Xzd4eC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNzNiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1Lzc0eHhfN3h4L3RyYXBzLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBsaW51eC9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiAgR2FyeSBUaG9tYXMgKGdkdEBsaW51eHBwYy5vcmcpCisgKgorICogTW9kaWZpZWQgYnkgQ29ydCBEb3VnYW4gKGNvcnRAY3Mubm10LmVkdSkKKyAqIGFuZCBQYXVsIE1hY2tlcnJhcyAocGF1bHVzQGNzLmFudS5lZHUuYXUpCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBoYXJkd2FyZSBleGNlcHRpb25zCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxrZ2RiLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaWZkZWYgQ09ORklHX0FNSUdBT05FRzNTRQorREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisjZW5kaWYKKworLyogUmV0dXJucyAwIGlmIGV4Y2VwdGlvbiBub3QgZm91bmQgYW5kIGZpeHVwIG90aGVyd2lzZS4gICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlKHVuc2lnbmVkIGxvbmcpOworCisvKiBUSElTIE5FRURTIENIQU5HSU5HIHRvIHVzZSB0aGUgYm9hcmQgaW5mbyBzdHJ1Y3R1cmUuCisqLworI2lmZGVmIENPTkZJR19BTUlHQU9ORUczU0UKKyNkZWZpbmUgRU5EX09GX01FTSAoZ2QtPmJkLT5iaV9tZW1zdGFydCArIGdkLT5iZC0+YmlfbWVtc2l6ZSkKKyNlbHNlCisjZGVmaW5lIEVORF9PRl9NRU0JMHgwMjAwMDAwMAorI2VuZGlmCisKKy8qCisgKiBUcmFwICYgRXhjZXB0aW9uIHN1cHBvcnQKKyAqLworCit2b2lkCitwcmludF9iYWNrdHJhY2UodW5zaWduZWQgbG9uZyAqc3ApCit7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHJpbnRmKCJDYWxsIGJhY2t0cmFjZTogIik7CisJd2hpbGUgKHNwKSB7CisJCWlmICgodWludClzcCA+IEVORF9PRl9NRU0pCisJCQlicmVhazsKKworCQlpID0gc3BbMV07CisJCWlmIChjbnQrKyAlIDcgPT0gMCkKKwkJCXByaW50ZigiXG4iKTsKKwkJcHJpbnRmKCIlMDhsWCAiLCBpKTsKKwkJaWYgKGNudCA+IDMyKSBicmVhazsKKwkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSpzcDsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorCit2b2lkCitzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpOworCisJcHJpbnRmKCJOSVA6ICUwOGxYIFhFUjogJTA4bFggTFI6ICUwOGxYIFJFR1M6IgorCSAgICAgICAiICVwIFRSQVA6ICUwNGx4IERBUjogJTA4bFhcbiIsCisJICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+eGVyLCByZWdzLT5saW5rLCByZWdzLCByZWdzLT50cmFwLCByZWdzLT5kYXIpOworCXByaW50ZigiTVNSOiAlMDhseCBFRTogJTAxeCBQUjogJTAxeCBGUDoiCisJICAgICAgICIgJTAxeCBNRTogJTAxeCBJUi9EUjogJTAxeCUwMXhcbiIsCisJICAgICAgIHJlZ3MtPm1zciwgcmVncy0+bXNyJk1TUl9FRSA/IDEgOiAwLCByZWdzLT5tc3ImTVNSX1BSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciAmIE1TUl9GUCA/IDEgOiAwLHJlZ3MtPm1zciZNU1JfTUUgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyJk1TUl9JUiA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3ImTVNSX0RSID8gMSA6IDApOworCisJcHJpbnRmKCJcbiIpOworCWZvciAoaSA9IDA7ICBpIDwgMzI7ICBpKyspIHsKKwkJaWYgKChpICUgOCkgPT0gMCkKKwkJeworCQkJcHJpbnRmKCJHUFIlMDJkOiAiLCBpKTsKKwkJfQorCisJCXByaW50ZigiJTA4bFggIiwgcmVncy0+Z3ByW2ldKTsKKwkJaWYgKChpICUgOCkgPT0gNykKKwkJeworCQkJcHJpbnRmKCJcbiIpOworCQl9CisJfQorfQorCisKK3ZvaWQKK19leGNlcHRpb24oaW50IHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiRXhjZXB0aW9uIGluIGtlcm5lbCBwYyAlbHggc2lnbmFsICVkIixyZWdzLT5uaXAsc2lnbnIpOworfQorCit2b2lkCitNYWNoaW5lQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmaXh1cDsKKworCS8qIFByb2JpbmcgUENJIHVzaW5nIGNvbmZpZyBjeWNsZXMgY2F1c2UgdGhpcyBleGNlcHRpb24KKwkgKiB3aGVuIGEgZGV2aWNlIGlzIG5vdCBwcmVzZW50LiAgQ2F0Y2ggaXQgYW5kIHJldHVybiB0bworCSAqIHRoZSBQQ0kgZXhjZXB0aW9uIGhhbmRsZXIuCisJICovCisJaWYgKChmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGUocmVncy0+bmlwKSkgIT0gMCkgeworCQlyZWdzLT5uaXAgPSBmaXh1cDsKKwkJcmV0dXJuOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwcmludGYoIk1hY2hpbmUgY2hlY2sgaW4ga2VybmVsIG1vZGUuXG4iKTsKKwlwcmludGYoIkNhdXNlZCBieSAoZnJvbSBtc3IpOiAiKTsKKwlwcmludGYoInJlZ3MgJXAgIixyZWdzKTsKKwlzd2l0Y2goIHJlZ3MtPm1zciAmIDB4MDAwRjAwMDApIHsKKwljYXNlICgweDgwMDAwMDAwPj4xMik6CisJCXByaW50ZigiTWFjaGluZSBjaGVjayBzaWduYWwgLSBwcm9iYWJseSBkdWUgdG8gbW0gZmF1bHRcbiIKKwkJCSJ3aXRoIG1tdSBvZmZcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwPj4xMyk6CisJCXByaW50ZigiVHJhbnNmZXIgZXJyb3IgYWNrIHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjE0KToKKwkJcHJpbnRmKCJEYXRhIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwPj4xNSk6CisJCXByaW50ZigiQWRkcmVzcyBwYXJpdHkgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmtub3duIHZhbHVlcyBpbiBtc3JcbiIpOworCX0KKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygibWFjaGluZSBjaGVjayIpOworfQorCit2b2lkCitBbGlnbm1lbnRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiQWxpZ25tZW50IEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitQcm9ncmFtQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgY2hhciAqcCA9IHJlZ3MgPyAodW5zaWduZWQgY2hhciAqKShyZWdzLT5uaXApIDogTlVMTDsKKwlpbnQgaSwgajsKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzKHJlZ3MpOworCisJcCA9ICh1bnNpZ25lZCBjaGFyICopICgodW5zaWduZWQgbG9uZylwICYgMHhGRkZGRkZFMCk7CisJcCAtPSAzMjsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKz0xNikgeworCQlwcmludGYoIiUwOHg6ICIsICh1bnNpZ25lZCBpbnQpcCtpKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCXByaW50ZigiJTAyeCAiLCBwW2kral0pOworCQl9CisJCXByaW50ZigiXG4iKTsKKwl9CisKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJQcm9ncmFtIENoZWNrIEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMoIlNvZnR3YXJlIEVtdWxhdGlvbiBFeGNlcHRpb24iKTsKK30KKworCit2b2lkCitVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJcHJpbnRmKCJCYWQgdHJhcCBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4XG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CisJX2V4Y2VwdGlvbigwLCByZWdzKTsKK30KKworLyogUHJvYmUgYW4gYWRkcmVzcyBieSByZWFkaW5nLiAgSWYgbm90IHByZXNlbnQsIHJldHVybiAtMSwgb3RoZXJ3aXNlCisgKiByZXR1cm4gMC4KKyAqLworaW50CithZGRyX3Byb2JlKHVpbnQgKmFkZHIpCit7CisjaWYgMAorCWludAlyZXR2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCSIxOglsd3ogJTAsMCglMSlcbiIJCVwKKwkJIgllaWVpb1xuIgkJXAorCQkiCWxpICUwLDBcbiIJCVwKKwkJIjI6XG4iCQkJCVwKKwkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJXAorCQkiMzoJbGkgJTAsLTFcbiIJCVwKKwkJIgliIDJiXG4iCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIglcCisJCSIJLmFsaWduIDJcbiIJCVwKKwkJIgkubG9uZyAxYiwzYlxuIgkJXAorCQkiLnRleHQiCQkJCVwKKwkJOiAiPXIiIChyZXR2YWwpIDogInIiKGFkZHIpKTsKKworCXJldHVybiAocmV0dmFsKTsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTljNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvTWFrZWZpbGUKQEAgLTAsMCArMSw2MyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDctMjAwOSBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCiskKHNoZWxsIG1rZGlyIC1wICQoT0JKVFJFRSkvYm9hcmQvZnJlZXNjYWxlL2NvbW1vbikKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitDT0JKUy15CTo9IGNwdS5vCitDT0JKUy15CSs9IHRyYXBzLm8KK0NPQkpTLXkgKz0gY3B1X2luaXQubworQ09CSlMteSArPSBmaXhlZF9zZHJhbS5vCitDT0JKUy15ICs9IGkyYy5vCitDT0JKUy15ICs9IGludGVycnVwdHMubworQ09CSlMteSArPSBpb3Bpbi5vCitDT0JKUy15ICs9IHNlcmlhbC5vCitDT0JKUy15ICs9IHNwZWVkLm8KK0NPQkpTLSR7Q09ORklHX0ZTTF9ESVVfRkJ9ICs9IGRpdS5vCitDT0JKUy0ke0NPTkZJR19GU0xfRElVX0ZCfSArPSAuLi8uLi8uLi8uLi9ib2FyZC9mcmVlc2NhbGUvY29tbW9uL2ZzbF9kaXVfZmIubworQ09CSlMtJHtDT05GSUdfRlNMX0RJVV9GQn0gKz0gLi4vLi4vLi4vLi4vYm9hcmQvZnJlZXNjYWxlL2NvbW1vbi9mc2xfbG9nb19ibXAubworQ09CSlMtJHtDT05GSUdfQ01EX0lERX0gKz0gaWRlLm8KK0NPQkpTLSR7Q09ORklHX0lJTX0gKz0gaWltLm8KK0NPQkpTLSQoQ09ORklHX1BDSSkgKz0gcGNpLm8KKworQ09CSlMJOj0gJChDT0JKUy15KQorU1JDUwk6PSAkKFNUQVJUOi5vPS5TKSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykgJChDT0JKUykpCitTVEFSVAk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTVEFSVCkpCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvYXNtLW9mZnNldHMuaCBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9hc20tb2Zmc2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1N2Q0YmUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2FzbS1vZmZzZXRzLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIG5lZWRlZCBmb3IgYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L3N0YXJ0LlMKKyAqCisgKiBUaGVzZSBzaG91bGQgYmUgYXV0by1nZW5lcmF0ZWQKKyAqLworI2RlZmluZSBMUENTMEFXCQkJMHgwMDI0CisjZGVmaW5lIFNSQU1CQVIJCQkweDAwQzQKKyNkZWZpbmUgU1dDUlIJCQkweDA5MDQKKyNkZWZpbmUgTFBDX09GRlNFVAkJMHgxMDAwMAorI2RlZmluZSBDUzBfQ09ORklHCQkweDAwMDAwCisjZGVmaW5lIENTX0NUUkwJCQkweDAwMDIwCisjZGVmaW5lIENTX0NUUkxfTUUJCTB4MDEwMDAwMDAJLyogQ1MgTWFzdGVyIEVuYWJsZSBiaXQgKi8KKworI2RlZmluZSBFWENfT0ZGX1NZU19SRVNFVAkweDAxMDAKKyNkZWZpbmUJX1NUQVJUX09GRlNFVAkJRVhDX09GRl9TWVNfUkVTRVQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9jb25maWcubWsgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOWVkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA3LTIwMDkgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLW1lYWJpCisKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHX01QQzUxMlggLURDT05GSUdfRTMwMCBcCisJCQktZmZpeGVkLXIyIC1tc29mdC1mbG9hdCAtbWNwdT02MDNlCisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4KKyMgQSBib2FyZCBwb3J0IGNhbiBvdmVycmlkZSB0aGlzIHNldHRpbmcgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWNiZDIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2NwdS5jCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3LTIwMTAgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQ1BVIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBNUEM1MTJ4IGZhbWlseS4KKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzgzeHggY29kZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPG5ldGRldi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorI2VuZGlmCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitpbnQgY2hlY2tjcHUgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl1bG9uZyBjbG9jayA9IGdkLT5jcHVfY2xrOworCXUzMiBwdnIgPSBnZXRfcHZyICgpOworCXUzMiBzcHJpZHIgPSBpbl9iZTMyKCZpbW1yLT5zeXNjb25mLnNwcmlkcik7CisJY2hhciBidWYxWzMyXSwgYnVmMlszMl07CisKKwlwdXRzICgiQ1BVOiAgICIpOworCisJc3dpdGNoIChzcHJpZHIgJiAweGZmZmYwMDAwKSB7CisJY2FzZSBTUFJfNTEyMUU6CisJCXB1dHMgKCJNUEM1MTIxZSAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBwYXJ0IElEICUwOHggIiwgc3ByaWRyICYgMHhmZmZmMDAwMCk7CisJfQorCXByaW50ZiAoInJldi4gJWQuJWQsIENvcmUgIiwgU1ZSX01KUkVWIChzcHJpZHIpLCBTVlJfTU5SRVYgKHNwcmlkcikpOworCisJc3dpdGNoIChwdnIgJiAweGZmZmYwMDAwKSB7CisJY2FzZSBQVlJfRTMwMEM0OgorCQlwdXRzICgiZTMwMGM0ICIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwdXRzICgidW5rbm93biAiKTsKKwl9CisJcHJpbnRmICgiYXQgJXMgTUh6LCBDU0IgYXQgJXMgTUh6IChSU1I9MHglMDRseClcbiIsCisJCXN0cm1oeihidWYxLCBjbG9jayksCisJCXN0cm1oeihidWYyLCBnZC0+Y3NiX2NsayksCisJCWdkLT5yZXNldF9zdGF0dXMgJiAweGZmZmYpOworCXJldHVybiAwOworfQorCisKK2ludAorZG9fcmVzZXQgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bG9uZyBtc3I7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisKKwkvKiBJbnRlcnJ1cHRzIGFuZCBNTVUgb2ZmICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZm1zciAgICAlMCI6Ij1yIiAobXNyKTopOworCisJbXNyICY9IH4oIE1TUl9FRSB8IE1TUl9JUiB8IE1TUl9EUik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtdG1zciAgICAlMCI6OiJyIiAobXNyKSk7CisKKwkvKgorCSAqIEVuYWJsZSBSZXNldCBDb250cm9sIFJlZyAtICJSU1RFIiBpcyB0aGUgbWFnaWMgd29yZCB0aGF0IGxldCB1cyBnbworCSAqLworCW91dF9iZTMyKCZpbW1hcC0+cmVzZXQucnByLCAweDUyNTM1NDQ1KTsKKworCS8qIFZlcmlmeSBSZXNldCBDb250cm9sIFJlZyBpcyBlbmFibGVkICovCisJd2hpbGUgKCEoaW5fYmUzMigmaW1tYXAtPnJlc2V0LnJjZXIpICYgUkNFUl9DUkUpKQorCQk7CisKKwlwcmludGYgKCJSZXNldHRpbmcgdGhlIGJvYXJkLlxuIik7CisJdWRlbGF5KDIwMCk7CisKKwkvKiBQZXJmb3JtIHJlc2V0ICovCisJb3V0X2JlMzIoJmltbWFwLT5yZXNldC5yY3IsIFJDUl9TV0hSKTsKKworCS8qIFVucmVhY2hlZC4uLiAqLworCXJldHVybiAxOworfQorCisKKy8qCisgKiBHZXQgdGltZWJhc2UgY2xvY2sgZnJlcXVlbmN5IChsaWtlIGNwdV9jbGsgaW4gSHopCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RiY2xrICh2b2lkKQoreworCXVsb25nIHRiY2xrOworCisJdGJjbGsgPSAoZ2QtPmJ1c19jbGsgKyAzTCkgLyA0TDsKKworCXJldHVybiB0YmNsazsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCit2b2lkIHdhdGNoZG9nX3Jlc2V0ICh2b2lkKQoreworCWludCByZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwkvKiBSZXNldCB3YXRjaGRvZyAqLworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJb3V0X2JlMzIoJmltbXItPndkdC5zd3NyciwgMHg1NTZjKTsKKwlvdXRfYmUzMigmaW1tci0+d2R0LnN3c3JyLCAweGFhMzkpOworCisJaWYgKHJlX2VuYWJsZSkKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19PRl9MSUJGRFQKKworI2lmZGVmIENPTkZJR19PRl9TVVBQT1JUX09MRF9ERVZJQ0VfVFJFRVMKKy8qCisgKiBmZHQgc2V0dXAgZm9yIG9sZCBkZXZpY2UgdHJlZXMKKyAqIGZpeCB1cAorICogCWNwdSBjbG9ja3MKKyAqIAlzb2MgY2xvY2tzCisgKiAJZXRoZXJuZXQgYWRkcmVzc2VzCisgKi8KK3N0YXRpYyB2b2lkIG9sZF9mdF9jcHVfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJLyoKKwkgKiBhdm9pZCBmaXhpbmcgdXAgYnkgcGF0aCBiZWNhdXNlIHRoYXQKKwkgKiBwcm9kdWNlcyBzY2FyeSBlcnJvciBtZXNzYWdlcworCSAqLworCXVjaGFyIGVuZXRhZGRyWzZdOworCisJLyoKKwkgKiBvbGQgZGV2aWNlIHRyZWVzIGhhdmUgZXRoZXJuZXQgbm9kZXMgd2l0aAorCSAqIGRldmljZV90eXBlID0gIm5ldHdvcmsiCisJICovCisJZXRoX2dldGVudl9lbmV0YWRkcigiZXRoYWRkciIsIGVuZXRhZGRyKTsKKwlkb19maXh1cF9ieV9wcm9wKGJsb2IsICJkZXZpY2VfdHlwZSIsICJuZXR3b3JrIiwgOCwKKwkJImxvY2FsLW1hYy1hZGRyZXNzIiwgZW5ldGFkZHIsIDYsIDApOworCWRvX2ZpeHVwX2J5X3Byb3AoYmxvYiwgImRldmljZV90eXBlIiwgIm5ldHdvcmsiLCA4LAorCQkiYWRkcmVzcyIsIGVuZXRhZGRyLCA2LCAwKTsKKwkvKgorCSAqIG9sZCBkZXZpY2UgdHJlZXMgaGF2ZSBzb2Mgbm9kZXMgd2l0aAorCSAqIGRldmljZV90eXBlID0gInNvYyIKKwkgKi8KKwlkb19maXh1cF9ieV9wcm9wX3UzMihibG9iLCAiZGV2aWNlX3R5cGUiLCAic29jIiwgNCwKKwkJImJ1cy1mcmVxdWVuY3kiLCBiZC0+YmlfaXBzZnJlcSwgMCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZnRfY2xvY2tfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJY2hhciAqY3B1X3BhdGggPSAiL2NwdXMvIiBPRl9DUFU7CisKKwkvKgorCSAqIGZpeHVwIGNwdSBjbG9ja3MgdXNpbmcgcGF0aAorCSAqLworCWRvX2ZpeHVwX2J5X3BhdGhfdTMyKGJsb2IsIGNwdV9wYXRoLAorCQkidGltZWJhc2UtZnJlcXVlbmN5IiwgT0ZfVEJDTEssIDEpOworCWRvX2ZpeHVwX2J5X3BhdGhfdTMyKGJsb2IsIGNwdV9wYXRoLAorCQkiYnVzLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKwlkb19maXh1cF9ieV9wYXRoX3UzMihibG9iLCBjcHVfcGF0aCwKKwkJImNsb2NrLWZyZXF1ZW5jeSIsIGJkLT5iaV9pbnRmcmVxLCAxKTsKKwkvKgorCSAqIGZpeHVwIHNvYyBjbG9ja3MgdXNpbmcgY29tcGF0aWJsZQorCSAqLworCWRvX2ZpeHVwX2J5X2NvbXBhdF91MzIoYmxvYiwgT0ZfU09DX0NPTVBBVCwKKwkJImJ1cy1mcmVxdWVuY3kiLCBiZC0+YmlfaXBzZnJlcSwgMSk7Cit9CisKK3ZvaWQgZnRfY3B1X3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworI2lmZGVmIENPTkZJR19PRl9TVVBQT1JUX09MRF9ERVZJQ0VfVFJFRVMKKwlvbGRfZnRfY3B1X3NldHVwKGJsb2IsIGJkKTsKKyNlbmRpZgorCWZ0X2Nsb2NrX3NldHVwKGJsb2IsIGJkKTsKKyNpZmRlZiBDT05GSUdfSEFTX0VUSDAKKwlmZHRfZml4dXBfZXRoZXJuZXQoYmxvYik7CisjZW5kaWYKKwlmZHRfZml4dXBfbWVtb3J5KGJsb2IsICh1NjQpYmQtPmJpX21lbXN0YXJ0LCAodTY0KWJkLT5iaV9tZW1zaXplKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01QQzUxMnhfRkVDCisvKiBEZWZhdWx0IGluaXRpYWxpemF0aW9ucyBmb3IgRkVDIGNvbnRyb2xsZXJzLiAgVG8gb3ZlcnJpZGUsCisgKiBjcmVhdGUgYSBib2FyZC1zcGVjaWZpYyBmdW5jdGlvbiBjYWxsZWQ6CisgKiAJaW50IGJvYXJkX2V0aF9pbml0KGJkX3QgKmJpcykKKyAqLworCitpbnQgY3B1X2V0aF9pbml0KGJkX3QgKmJpcykKK3sKKwlyZXR1cm4gbXBjNTEyeF9mZWNfaW5pdGlhbGl6ZShiaXMpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvY3B1X2luaXQuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9jcHVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmJlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvY3B1X2luaXQuYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzgzeHggY29kZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qCisgKiBTZXQgdXAgdGhlIG1lbW9yeSBtYXAsIGluaXRpYWxpemUgcmVnaXN0ZXJzLAorICovCit2b2lkIGNwdV9pbml0X2YgKHZvbGF0aWxlIGltbWFwX3QgKiBpbSkKK3sKKwl1MzIgaXBzX2RpdjsKKworCS8qIFBvaW50ZXIgaXMgd3JpdGFibGUgc2luY2Ugd2UgYWxsb2NhdGVkIGEgcmVnaXN0ZXIgZm9yIGl0ICovCisJZ2QgPSAoZ2RfdCAqKSAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICsgQ09ORklHX1NZU19HQkxfREFUQV9PRkZTRVQpOworCisJLyogQ2xlYXIgaW5pdGlhbCBnbG9iYWwgZGF0YSAqLworCW1lbXNldCAoKHZvaWQgKikgZ2QsIDAsIHNpemVvZiAoZ2RfdCkpOworCisJLyogc3lzdGVtIHBlcmZvcm1hbmNlIHR3ZWFraW5nICovCisKKyNpZmRlZiBDT05GSUdfU1lTX0FDUl9QSVBFX0RFUAorCS8qIEFyYml0ZXIgcGlwZWxpbmUgZGVwdGggKi8KKwlvdXRfYmUzMigmaW0tPmFyYml0ZXIuYWNyLAorCQkoaW0tPmFyYml0ZXIuYWNyICYgfkFDUl9QSVBFX0RFUCkgfAorCQkoQ09ORklHX1NZU19BQ1JfUElQRV9ERVAgPDwgQUNSX1BJUEVfREVQX1NISUZUKQorCSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TWVNfQUNSX1JQVENOVAorCS8qIEFyYml0ZXIgcmVwZWF0IGNvdW50ICovCisJb3V0X2JlMzIoaW0tPmFyYml0ZXIuYWNyLAorCQkoaW0tPmFyYml0ZXIuYWNyICYgfihBQ1JfUlBUQ05UKSkgfAorCQkoQ09ORklHX1NZU19BQ1JfUlBUQ05UIDw8IEFDUl9SUFRDTlRfU0hJRlQpCisJKTsKKyNlbmRpZgorCisJLyogUlNSIC0gUmVzZXQgU3RhdHVzIFJlZ2lzdGVyIC0gY2xlYXIgYWxsIHN0YXR1cyAqLworCWdkLT5yZXNldF9zdGF0dXMgPSBpbS0+cmVzZXQucnNyOworCW91dF9iZTMyKCZpbS0+cmVzZXQucnNyLCB+UlNSX1JFUyk7CisKKwkvKgorCSAqIFJNUiAtIFJlc2V0IE1vZGUgUmVnaXN0ZXIgLSBlbmFibGUgY2hlY2tzdG9wIHJlc2V0CisJICovCisJb3V0X2JlMzIoJmltLT5yZXNldC5ybXIsIFJNUl9DU1JFICYgKDEgPDwgUk1SX0NTUkVfU0hJRlQpKTsKKworCS8qIFNldCBJUFMtQ1NCIGRpdmlkZXI6IElQUyA9IDEvMiBDU0IgKi8KKwlpcHNfZGl2ID0gaW5fYmUzMigmaW0tPmNsay5zY2ZyWzBdKTsKKwlpcHNfZGl2ICY9IH4oU0NGUjFfSVBTX0RJVl9NQVNLKTsKKwlpcHNfZGl2IHw9IFNDRlIxX0lQU19ESVYgPDwgU0NGUjFfSVBTX0RJVl9TSElGVDsKKwlvdXRfYmUzMigmaW0tPmNsay5zY2ZyWzBdLCBpcHNfZGl2KTsKKworCS8qCisJICogRW5hYmxlIFRpbWUgQmFzZS9EZWNyZW1lbnRlcgorCSAqCisJICogTk9USUNFOiBUQiBuZWVkcyB0byBiZSBlbmFibGVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvCisJICogaGF2ZSB1ZGVsYXkoKSB3b3JraW5nOyBpZiBub3QgZW5hYmxlZCwgdXN1YWxseSBsZWFkcyB0byBhIGhhbmcsIGxpa2UKKwkgKiBkdXJpbmcgRkxBU0ggY2hpcCBpZGVudGlmaWNhdGlvbiBldGMuCisJICovCisJc2V0Yml0c19iZTMyKCZpbS0+c3lzY29uZi5zcGNyLCBTUENSX1RCRU4pOworfQorCitpbnQgY3B1X2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9kaXUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9kaXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzYxMTYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2RpdS5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIFlvcmsgU3VuIDx5b3Jrc3VuQGZyZWVzY2FsZS5jb20+CisgKgorICogRlNMIERJVSBGcmFtZWJ1ZmZlciBkcml2ZXIKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vYm9hcmQvZnJlZXNjYWxlL2NvbW1vbi9mc2xfZGl1X2ZiLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFTykgfHwgZGVmaW5lZChDT05GSUdfQ0ZCX0NPTlNPTEUpCisjaW5jbHVkZSA8c3RkaW9fZGV2Lmg+CisjaW5jbHVkZSA8dmlkZW9fZmIuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0ZTTF9ESVVfTE9HT19CTVAKK2V4dGVybiB1bnNpZ25lZCBpbnQgRlNMX0xvZ29fQk1QW107CisjZWxzZQorI2RlZmluZSBGU0xfTG9nb19CTVAgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgeHJlcywgeXJlczsKKwordm9pZCBkaXVfc2V0X3BpeGVsX2Nsb2NrKHVuc2lnbmVkIGludCBwaXhjbG9jaykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGNsazUxMnhfdCAqY2xrID0gJmltbWFwLT5jbGs7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50ICpjbGtkdmRyID0gJmNsay0+c2NmclswXTsKKwl1bnNpZ25lZCBsb25nIHNwZWVkX2NjYiwgdGVtcCwgcGl4dmFsOworCisJc3BlZWRfY2NiID0gZ2V0X2J1c19mcmVxKDApICogNDsKKwl0ZW1wID0gMTAwMDAwMDAwMC9waXhjbG9jazsKKwl0ZW1wICo9IDEwMDA7CisJcGl4dmFsID0gc3BlZWRfY2NiIC8gdGVtcDsKKwlkZWJ1ZygiRElVIHBpeHZhbCA9ICVsdVxuIiwgcGl4dmFsKTsKKworCS8qIE1vZGlmeSBQWENMSyBpbiBHVVRTIENMS0RWRFIgKi8KKwlkZWJ1ZygiRElVOiBDdXJyZW50IHZhbHVlIG9mIENMS0RWRFIgPSAweCUwOHhcbiIsIGluX2JlMzIoY2xrZHZkcikpOworCXRlbXAgPSBpbl9iZTMyKGNsa2R2ZHIpICYgMHhGRkZGRkYwMDsKKwlvdXRfYmUzMihjbGtkdmRyLCB0ZW1wIHwgKHBpeHZhbCAmIDB4RkYpKTsKKwlkZWJ1ZygiRElVOiBNb2RpZmllZCB2YWx1ZSBvZiBDTEtEVkRSID0gMHglMDh4XG4iLCBpbl9iZTMyKGNsa2R2ZHIpKTsKK30KKworY2hhciAqdmFsaWRfYm1wKGNoYXIgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBoX2FkZHI7CisKKwloX2FkZHIgPSBzaW1wbGVfc3RydG91bChhZGRyLCBOVUxMLCAxNik7CisJaWYgKGhfYWRkciA8IENPTkZJR19TWVNfRkxBU0hfQkFTRSB8fAorCQkJaF9hZGRyID49IChDT05GSUdfU1lTX0ZMQVNIX0JBU0UgKyBDT05GSUdfU1lTX0ZMQVNIX1NJWkUgLSAxKSkgeworCQlwcmludGYoImJtcCBhZGRyICVseCBpcyBub3QgYSB2YWxpZCBmbGFzaCBhZGRyZXNzXG4iLCBoX2FkZHIpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKCgqKGNoYXIgKikoaF9hZGRyKSAhPSAnQicpIHx8ICgqKGNoYXIgKikoaF9hZGRyKzEpICE9ICdNJykpIHsKKwkJcHJpbnRmKCJibXAgYWRkciBpcyBub3QgYSBibXBcbiIpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIChjaGFyICopaF9hZGRyOworfQorCitpbnQgbXBjNTEyMV9kaXVfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBwaXhlbF9mb3JtYXQ7CisJY2hhciAqYm1wID0gTlVMTDsKKwljaGFyICpibXBfZW52OworCisJeHJlcyA9IDEwMjQ7CisJeXJlcyA9IDc2ODsKKwlwaXhlbF9mb3JtYXQgPSAweDg4ODgzMzE2OworCisJZGVidWcoIm1wYzUxMjFfZGl1X2luaXRcbiIpOworCWJtcF9lbnYgPSBnZXRlbnYoImRpdV9ibXBfYWRkciIpOworCWlmIChibXBfZW52KSB7CisJCWJtcCA9IHZhbGlkX2JtcChibXBfZW52KTsKKwl9CisJaWYgKCFibXApCisJCWJtcCA9IChjaGFyICopRlNMX0xvZ29fQk1QOworCXJldHVybiBmc2xfZGl1X2luaXQoeHJlcywgcGl4ZWxfZm9ybWF0LCAwLCAodW5zaWduZWQgY2hhciAqKWJtcCk7Cit9CisKK2ludCBtcGM1MTIxZGl1X2luaXRfc2hvd19ibXAoY21kX3RibF90ICpjbWR0cCwKKwkJCSAgICAgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdW5zaWduZWQgaW50IGFkZHI7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJY21kX3VzYWdlKGNtZHRwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCFzdHJuY21wKGFyZ3ZbMV0sICJpbml0IiwgNCkpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFTykgfHwgZGVmaW5lZChDT05GSUdfQ0ZCX0NPTlNPTEUpCisJCWZzbF9kaXVfY2xlYXJfc2NyZWVuKCk7CisJCWRydl92aWRlb19pbml0KCk7CisjZWxzZQorCQlyZXR1cm4gbXBjNTEyMV9kaXVfaW5pdCgpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwkJZnNsX2RpdV9jbGVhcl9zY3JlZW4oKTsKKwkJZnNsX2RpdV9kaXNwbGF5X2JtcCgodW5zaWduZWQgY2hhciAqKWFkZHIsIDAsIDAsIDApOworCX0KKworCXJldHVybiAwOworfQorCitVX0JPT1RfQ01EKAorCWRpdWZiLCBDT05GSUdfU1lTX01BWEFSR1MsIDEsIG1wYzUxMjFkaXVfaW5pdF9zaG93X2JtcCwKKwkiSW5pdCBvciBEaXNwbGF5IEJNUCBmaWxlIiwKKwkiaW5pdFxuICAgIC0gaW5pdGlhbGl6ZSBESVVcbiIKKwkiYWRkclxuICAgIC0gZGlzcGxheSBibXAgYXQgYWRkcmVzcyAnYWRkciciCisJKTsKKworCisjaWYgZGVmaW5lZChDT05GSUdfVklERU8pIHx8IGRlZmluZWQoQ09ORklHX0NGQl9DT05TT0xFKQorCisvKgorICogVGhlIEdyYXBoaWMgRGV2aWNlCisgKi8KK0dyYXBoaWNEZXZpY2UgY3RmYjsKK3ZvaWQgKnZpZGVvX2h3X2luaXQodm9pZCkKK3sKKwlHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmY3RmYjsKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKworCWlmIChtcGM1MTIxX2RpdV9pbml0KCkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGZpbGwgaW4gR3JhcGhpYyBkZXZpY2Ugc3RydWN0ICovCisJc3ByaW50ZihwR0QtPm1vZGVJZGVudCwgIiVkeCVkeCVkICVka0h6ICVkSHoiLAorCQl4cmVzLCB5cmVzLCAzMiwgNjQsIDYwKTsKKworCXBHRC0+ZnJhbWVBZHJzID0gKHVuc2lnbmVkIGludClmc2xfZmJfb3BlbigmaW5mbyk7CisJcEdELT53aW5TaXplWCA9IHhyZXM7CisJcEdELT53aW5TaXplWSA9IHlyZXMgLSBpbmZvLT5sb2dvX2hlaWdodDsKKwlwR0QtPnBsblNpemVYID0gcEdELT53aW5TaXplWDsKKwlwR0QtPnBsblNpemVZID0gcEdELT53aW5TaXplWTsKKworCXBHRC0+Z2RmQnl0ZXNQUCA9IDQ7CisJcEdELT5nZGZJbmRleCA9IEdERl8zMkJJVF9YODg4UkdCOworCisJcEdELT5pc2FCYXNlID0gMDsKKwlwR0QtPnBjaUJhc2UgPSAwOworCXBHRC0+bWVtU2l6ZSA9IGluZm8tPnNjcmVlbl9zaXplIC0gaW5mby0+bG9nb19zaXplOworCisJLyogQ3Vyc29yIFN0YXJ0IEFkZHJlc3MgKi8KKwlwR0QtPmRwckJhc2UgPSAwOworCXBHRC0+dnByQmFzZSA9IDA7CisJcEdELT5jcHJCYXNlID0gMDsKKworCXJldHVybiAodm9pZCAqKXBHRDsKK30KKworLyoqCisgICogU2V0IHRoZSBMVVQKKyAgKgorICAqIEBpbmRleDogY29sb3IgbnVtYmVyCisgICogQHI6IHJlZAorICAqIEBiOiBibHVlCisgICogQGc6IGdyZWVuCisgICovCit2b2lkIHZpZGVvX3NldF9sdXQKKwkodW5zaWduZWQgaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyIHIsIHVuc2lnbmVkIGNoYXIgZywgdW5zaWduZWQgY2hhciBiKQoreworCXJldHVybjsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1ZJREVPKSB8fCBkZWZpbmVkKENPTkZJR19DRkJfQ09OU09MRSkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9maXhlZF9zZHJhbS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2ZpeGVkX3NkcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyYjVmYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9maXhlZF9zZHJhbS5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3LTIwMDkgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21wYzUxMnguaD4KKworLyoKKyAqIE1ERFJDIENvbmZpZyBSdW50aW1lIFNldHRpbmdzCisgKi8KK2RkcjUxMnhfY29uZmlnX3QgZGVmYXVsdF9tZGRyY19jb25maWcgPSB7CisJLmRkcl9zeXNfY29uZmlnICAgPSBDT05GSUdfU1lTX01ERFJDX1NZU19DRkcsCisJLmRkcl90aW1lX2NvbmZpZzAgPSBDT05GSUdfU1lTX01ERFJDX1RJTUVfQ0ZHMCwKKwkuZGRyX3RpbWVfY29uZmlnMSA9IENPTkZJR19TWVNfTUREUkNfVElNRV9DRkcxLAorCS5kZHJfdGltZV9jb25maWcyID0gQ09ORklHX1NZU19NRERSQ19USU1FX0NGRzIsCit9OworCit1MzIgZGVmYXVsdF9pbml0X3NlcVtdID0geworCUNPTkZJR19TWVNfRERSQ01EX05PUCwKKwlDT05GSUdfU1lTX0REUkNNRF9OT1AsCisJQ09ORklHX1NZU19ERFJDTURfTk9QLAorCUNPTkZJR19TWVNfRERSQ01EX05PUCwKKwlDT05GSUdfU1lTX0REUkNNRF9OT1AsCisJQ09ORklHX1NZU19ERFJDTURfTk9QLAorCUNPTkZJR19TWVNfRERSQ01EX05PUCwKKwlDT05GSUdfU1lTX0REUkNNRF9OT1AsCisJQ09ORklHX1NZU19ERFJDTURfTk9QLAorCUNPTkZJR19TWVNfRERSQ01EX05PUCwKKwlDT05GSUdfU1lTX0REUkNNRF9QQ0hHX0FMTCwKKwlDT05GSUdfU1lTX0REUkNNRF9OT1AsCisJQ09ORklHX1NZU19ERFJDTURfUkZTSCwKKwlDT05GSUdfU1lTX0REUkNNRF9OT1AsCisJQ09ORklHX1NZU19ERFJDTURfUkZTSCwKKwlDT05GSUdfU1lTX0REUkNNRF9OT1AsCisJQ09ORklHX1NZU19NSUNST05fSU5JVF9ERVZfT1AsCisJQ09ORklHX1NZU19ERFJDTURfTk9QLAorCUNPTkZJR19TWVNfRERSQ01EX0VNMiwKKwlDT05GSUdfU1lTX0REUkNNRF9OT1AsCisJQ09ORklHX1NZU19ERFJDTURfUENIR19BTEwsCisJQ09ORklHX1NZU19ERFJDTURfRU0yLAorCUNPTkZJR19TWVNfRERSQ01EX0VNMywKKwlDT05GSUdfU1lTX0REUkNNRF9FTl9ETEwsCisJQ09ORklHX1NZU19NSUNST05fSU5JVF9ERVZfT1AsCisJQ09ORklHX1NZU19ERFJDTURfUENIR19BTEwsCisJQ09ORklHX1NZU19ERFJDTURfUkZTSCwKKwlDT05GSUdfU1lTX01JQ1JPTl9JTklUX0RFVl9PUCwKKwlDT05GSUdfU1lTX0REUkNNRF9PQ0RfREVGQVVMVCwKKwlDT05GSUdfU1lTX0REUkNNRF9QQ0hHX0FMTCwKKwlDT05GSUdfU1lTX0REUkNNRF9OT1AKK307CisKKy8qCisgKiBmaXhlZCBzZHJhbSBpbml0OgorICogVGhlIGJvYXJkIGRvZXNuJ3QgdXNlIG1lbW9yeSBtb2R1bGVzIHRoYXQgaGF2ZSBzZXJpYWwgcHJlc2VuY2UKKyAqIGRldGVjdCBvciBzaW1pbGFyIG1lY2hhbmlzbSBmb3IgZGlzY292ZXJ5IG9mIHRoZSBEUkFNIHNldHRpbmdzCisgKi8KK2xvbmcgaW50IGZpeGVkX3NkcmFtKGRkcjUxMnhfY29uZmlnX3QgKm1kZHJjX2NvbmZpZywKKwkJCXUzMiAqZHJhbV9pbml0X3NlcSwgaW50IHNlcV9zeikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXUzMiBtc2l6ZSA9IENPTkZJR19TWVNfRERSX1NJWkUgKiAxMDI0ICogMTAyNDsKKwl1MzIgbXNpemVfbG9nMiA9IF9faWxvZzIobXNpemUpOworCXUzMiBpOworCisJLyogdGFrZSBkZWZhdWx0IHNldHRpbmdzIGFuZCBpbml0IHNlcXVlbmNlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChtZGRyY19jb25maWcgPT0gTlVMTCkKKwkJbWRkcmNfY29uZmlnID0gJmRlZmF1bHRfbWRkcmNfY29uZmlnOworCWlmIChkcmFtX2luaXRfc2VxID09IE5VTEwpIHsKKwkJZHJhbV9pbml0X3NlcSA9IGRlZmF1bHRfaW5pdF9zZXE7CisJCXNlcV9zeiA9IHNpemVvZihkZWZhdWx0X2luaXRfc2VxKS9zaXplb2YodTMyKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIElPIENvbnRyb2wgKi8KKwlvdXRfYmUzMigmaW0tPmlvX2N0cmwuaW9fY29udHJvbF9tZW0sIElPQ1RSTF9NVVhfRERSKTsKKworCS8qIEluaXRpYWxpemUgRERSIExvY2FsIFdpbmRvdyAqLworCW91dF9iZTMyKCZpbS0+c3lzY29uZi5kZHJsYXcuYmFyLCBDT05GSUdfU1lTX0REUl9CQVNFICYgMHhGRkZGRjAwMCk7CisJb3V0X2JlMzIoJmltLT5zeXNjb25mLmRkcmxhdy5hciwgbXNpemVfbG9nMiAtIDEpOworCXN5bmNfbGF3KCZpbS0+c3lzY29uZi5kZHJsYXcuYXIpOworCisJLyogRERSIEVuYWJsZSAqLworCW91dF9iZTMyKCZpbS0+bWRkcmMuZGRyX3N5c19jb25maWcsIE1ERFJDX1NZU19DRkdfRU4pOworCisJLyogSW5pdGlhbGl6ZSBERFIgUHJpb3JpdHkgTWFuYWdlciAqLworCW91dF9iZTMyKCZpbS0+bWRkcmMucHJpb21hbl9jb25maWcxLCBDT05GSUdfU1lTX01ERFJDR1JQX1BNX0NGRzEpOworCW91dF9iZTMyKCZpbS0+bWRkcmMucHJpb21hbl9jb25maWcyLCBDT05GSUdfU1lTX01ERFJDR1JQX1BNX0NGRzIpOworCW91dF9iZTMyKCZpbS0+bWRkcmMuaGlwcmlvX2NvbmZpZywgQ09ORklHX1NZU19NRERSQ0dSUF9ISVBSSU9fQ0ZHKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTBfbWFpbl91cHBlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQwX01VKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTBfbWFpbl9sb3dlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQwX01MKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTFfbWFpbl91cHBlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQxX01VKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTFfbWFpbl9sb3dlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQxX01MKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTJfbWFpbl91cHBlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQyX01VKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTJfbWFpbl9sb3dlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQyX01MKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTNfbWFpbl91cHBlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQzX01VKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTNfbWFpbl9sb3dlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQzX01MKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTRfbWFpbl91cHBlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQ0X01VKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTRfbWFpbl9sb3dlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQ0X01MKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTBfYWx0ZXJuYXRlX3VwcGVyLCBDT05GSUdfU1lTX01ERFJDR1JQX0xVVDBfQVUpOworCW91dF9iZTMyKCZpbS0+bWRkcmMubHV0X3RhYmxlMF9hbHRlcm5hdGVfbG93ZXIsIENPTkZJR19TWVNfTUREUkNHUlBfTFVUMF9BTCk7CisJb3V0X2JlMzIoJmltLT5tZGRyYy5sdXRfdGFibGUxX2FsdGVybmF0ZV91cHBlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQxX0FVKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTFfYWx0ZXJuYXRlX2xvd2VyLCBDT05GSUdfU1lTX01ERFJDR1JQX0xVVDFfQUwpOworCW91dF9iZTMyKCZpbS0+bWRkcmMubHV0X3RhYmxlMl9hbHRlcm5hdGVfdXBwZXIsIENPTkZJR19TWVNfTUREUkNHUlBfTFVUMl9BVSk7CisJb3V0X2JlMzIoJmltLT5tZGRyYy5sdXRfdGFibGUyX2FsdGVybmF0ZV9sb3dlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQyX0FMKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTNfYWx0ZXJuYXRlX3VwcGVyLCBDT05GSUdfU1lTX01ERFJDR1JQX0xVVDNfQVUpOworCW91dF9iZTMyKCZpbS0+bWRkcmMubHV0X3RhYmxlM19hbHRlcm5hdGVfbG93ZXIsIENPTkZJR19TWVNfTUREUkNHUlBfTFVUM19BTCk7CisJb3V0X2JlMzIoJmltLT5tZGRyYy5sdXRfdGFibGU0X2FsdGVybmF0ZV91cHBlciwgQ09ORklHX1NZU19NRERSQ0dSUF9MVVQ0X0FVKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmx1dF90YWJsZTRfYWx0ZXJuYXRlX2xvd2VyLCBDT05GSUdfU1lTX01ERFJDR1JQX0xVVDRfQUwpOworCisJLyoKKwkgKiBJbml0aWFsaXplIE1ERFJDCisJICogIHB1dCBNRERSQyBpbiBDTUQgbW9kZSBhbmQKKwkgKiAgc2V0IHRoZSBtYXggdGltZSBiZXR3ZWVuIHJlZnJlc2hlcyB0byAwIGR1cmluZyBpbml0IHByb2Nlc3MKKwkgKi8KKwlvdXRfYmUzMigmaW0tPm1kZHJjLmRkcl9zeXNfY29uZmlnLAorCQltZGRyY19jb25maWctPmRkcl9zeXNfY29uZmlnIHwgTUREUkNfU1lTX0NGR19DTURfTUFTSyk7CisJb3V0X2JlMzIoJmltLT5tZGRyYy5kZHJfdGltZV9jb25maWcwLAorCQltZGRyY19jb25maWctPmRkcl90aW1lX2NvbmZpZzAgJiBNRERSQ19SRUZSRVNIX1pFUk9fTUFTSyk7CisJb3V0X2JlMzIoJmltLT5tZGRyYy5kZHJfdGltZV9jb25maWcxLAorCQltZGRyY19jb25maWctPmRkcl90aW1lX2NvbmZpZzEpOworCW91dF9iZTMyKCZpbS0+bWRkcmMuZGRyX3RpbWVfY29uZmlnMiwKKwkJbWRkcmNfY29uZmlnLT5kZHJfdGltZV9jb25maWcyKTsKKworCS8qIEluaXRpYWxpemUgRERSIHdpdGggZWl0aGVyIGRlZmF1bHQgb3Igc3VwcGxpZWQgaW5pdCBzZXF1ZW5jZSAqLworCWZvciAoaSA9IDA7IGkgPCBzZXFfc3o7IGkrKykKKwkJb3V0X2JlMzIoJmltLT5tZGRyYy5kZHJfY29tbWFuZCwgZHJhbV9pbml0X3NlcVtpXSk7CisKKwkvKiBTdGFydCBNRERSQyAqLworCW91dF9iZTMyKCZpbS0+bWRkcmMuZGRyX3RpbWVfY29uZmlnMCwgbWRkcmNfY29uZmlnLT5kZHJfdGltZV9jb25maWcwKTsKKwlvdXRfYmUzMigmaW0tPm1kZHJjLmRkcl9zeXNfY29uZmlnLCBtZGRyY19jb25maWctPmRkcl9zeXNfY29uZmlnKTsKKworCXJldHVybiBtc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9pMmMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQ5MDk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2kyYy5jCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzIC0gMjAwOQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBCYXNlZCBvbiB0aGUgTVBDNXh4eCBjb2RlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZmRlZiBDT05GSUdfSEFSRF9JMkMKKworI2luY2x1ZGUgPGkyYy5oPgorCisvKiBieSBkZWZhdWx0IHNldCBJMkMgYnVzIDAgYWN0aXZlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGJ1c19udW0gX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSkgPSAwOworCisjZGVmaW5lIEkyQ19USU1FT1VUCTEwMAorI2RlZmluZSBJMkNfUkVUUklFUwkzCisKK3N0cnVjdCBtcGM1MTJ4X2kyY190YXAgeworCWludCBzY2wydGFwOworCWludCB0YXAydGFwOworfTsKKworc3RhdGljIGludCAgbXBjX3JlZ19pbih2b2xhdGlsZSB1MzIgKnJlZyk7CitzdGF0aWMgdm9pZCBtcGNfcmVnX291dCh2b2xhdGlsZSB1MzIgKnJlZywgaW50IHZhbCwgaW50IG1hc2spOworc3RhdGljIGludCAgd2FpdF9mb3JfYmIodm9pZCk7CitzdGF0aWMgaW50ICB3YWl0X2Zvcl9waW4oaW50ICpzdGF0dXMpOworc3RhdGljIGludCAgZG9fYWRkcmVzcyh1Y2hhciBjaGlwLCBjaGFyIHJkd3JfZmxhZyk7CitzdGF0aWMgaW50ICBzZW5kX2J5dGVzKHVjaGFyIGNoaXAsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgaW50ICByZWNlaXZlX2J5dGVzKHVjaGFyIGNoaXAsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgaW50ICBtcGNfZ2V0X2ZkcihpbnQpOworCitzdGF0aWMgaW50IG1wY19yZWdfaW4gKHZvbGF0aWxlIHUzMiAqcmVnKQoreworCWludCByZXQgPSBpbl9iZTMyKHJlZykgPj4gMjQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtcGNfcmVnX291dCAodm9sYXRpbGUgdTMyICpyZWcsIGludCB2YWwsIGludCBtYXNrKQoreworCWlmICghbWFzaykgeworCQlvdXRfYmUzMihyZWcsIHZhbCA8PCAyNCk7CisJfSBlbHNlIHsKKwkJY2xyc2V0Yml0c19iZTMyKHJlZywgbWFzayA8PCAyNCwgKHZhbCAmIG1hc2spIDw8IDI0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfYmIgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbS0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgdGltZW91dCA9IEkyQ19USU1FT1VUOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBtcGNfcmVnX2luICgmcmVncy0+bXNyKTsKKworCXdoaWxlICh0aW1lb3V0LS0gJiYgKHN0YXR1cyAmIEkyQ19CQikpIHsKKwkJdm9sYXRpbGUgaW50IHRlbXA7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKwkJdGVtcCA9IG1wY19yZWdfaW4gKCZyZWdzLT5tZHIpOworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCAwKTsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19FTiwgMCk7CisKKwkJdWRlbGF5ICgxMDAwKTsKKwkJc3RhdHVzID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1zcik7CisJfQorCisJcmV0dXJuIChzdGF0dXMgJiBJMkNfQkIpOworfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX3BpbiAoaW50ICpzdGF0dXMpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbS0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgdGltZW91dCA9IEkyQ19USU1FT1VUOworCisJKnN0YXR1cyA9IG1wY19yZWdfaW4gKCZyZWdzLT5tc3IpOworCisJd2hpbGUgKHRpbWVvdXQtLSAmJiAhKCpzdGF0dXMgJiBJMkNfSUYpKSB7CisJCXVkZWxheSAoMTAwMCk7CisJCSpzdGF0dXMgPSBtcGNfcmVnX2luICgmcmVncy0+bXNyKTsKKwl9CisKKwlpZiAoISgqc3RhdHVzICYgSTJDX0lGKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tc3IsIDAsIEkyQ19JRik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19hZGRyZXNzICh1Y2hhciBjaGlwLCBjaGFyIHJkd3JfZmxhZykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltLT5pMmMuZGV2W2J1c19udW1dOworCWludCBzdGF0dXM7CisKKwljaGlwIDw8PSAxOworCisJaWYgKHJkd3JfZmxhZykgeworCQljaGlwIHw9IDE7CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIEkyQ19UWCwgSTJDX1RYKTsKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1kciwgY2hpcCwgMCk7CisKKwlpZiAod2FpdF9mb3JfcGluICgmc3RhdHVzKSkgeworCQlyZXR1cm4gLTI7CisJfQorCisJaWYgKHN0YXR1cyAmIEkyQ19SWEFLKSB7CisJCXJldHVybiAtMzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZW5kX2J5dGVzICh1Y2hhciBjaGlwLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbS0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgd3Jjb3VudDsKKwlpbnQgc3RhdHVzOworCisJZm9yICh3cmNvdW50ID0gMDsgd3Jjb3VudCA8IGxlbjsgKyt3cmNvdW50KSB7CisKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tZHIsIGJ1Zlt3cmNvdW50XSwgMCk7CisKKwkJaWYgKHdhaXRfZm9yX3BpbiAoJnN0YXR1cykpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIEkyQ19SWEFLKSB7CisJCQlicmVhazsKKwkJfQorCisJfQorCisJcmV0dXJuICEod3Jjb3VudCA9PSBsZW4pOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfYnl0ZXMgKHVjaGFyIGNoaXAsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltLT5pMmMuZGV2W2J1c19udW1dOworCWludCBkdW1teSAgID0gMTsKKwlpbnQgcmRjb3VudCA9IDA7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCBJMkNfVFgpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCWJ1ZltyZGNvdW50XSA9IG1wY19yZWdfaW4gKCZyZWdzLT5tZHIpOworCisJCWlmIChkdW1teSkgeworCQkJZHVtbXkgPSAwOworCQl9IGVsc2UgeworCQkJcmRjb3VudCsrOworCQl9CisKKwkJaWYgKHdhaXRfZm9yX3BpbiAoJnN0YXR1cykpIHsKKwkJCXJldHVybiAtNDsKKwkJfQorCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfVFhBSywgSTJDX1RYQUspOworCWJ1ZltyZGNvdW50KytdID0gbXBjX3JlZ19pbiAoJnJlZ3MtPm1kcik7CisKKwlpZiAod2FpdF9mb3JfcGluICgmc3RhdHVzKSkgeworCQlyZXR1cm4gLTU7CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIEkyQ19UWEFLKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKiBJMkMgQVBJICoqKioqKioqKioqKioqKiovCisKK3ZvaWQgaTJjX2luaXQgKGludCBzcGVlZCwgaW50IHNhZGRyKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEkyQ19CVVNfQ05UOyBpKyspeworCQl2b2xhdGlsZSBpMmM1MTJ4X2Rldl90ICpyZWdzID0gJmltLT5pMmMuZGV2W2ldOworCisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCAwKTsKKworCQkvKiBTZXQgY2xvY2sgKi8KKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tZmRyLCBtcGNfZ2V0X2ZkciAoc3BlZWQpLCAwKTsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tYWRyLCBzYWRkciA8PCAxLCAwKTsKKworCQkvKiBFbmFibGUgbW9kdWxlICovCisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfRU4sIEkyQ19JTklUX01BU0spOworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1zciwgMCwgSTJDX0lGKTsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlvdXRfYmUzMigmaW0tPmkyYy5pY3IsIDApOworCisJLyogVHVybiBvZmYgZmlsdGVycyAqLworCW91dF9iZTMyKCZpbS0+aTJjLm1pZnIsIDApOworfQorCitzdGF0aWMgaW50IG1wY19nZXRfZmRyIChpbnQgc3BlZWQpCit7CisJc3RhdGljIGludCBmZHIgPSAtMTsKKworCWlmIChmZHIgPT0gLTEpIHsKKwkJdWxvbmcgYmVzdF9zcGVlZCA9IDA7CisJCXVsb25nIGRpdmlkZXI7CisJCXVsb25nIGlwcywgc2NsOworCQl1bG9uZyBiZXN0bWF0Y2ggPSAweGZmZmZmZmZmVUw7CisJCWludCBiZXN0X2kgPSAwLCBiZXN0X2ogPSAwLCBpLCBqOworCQlpbnQgU0NMX1RhcFtdID0geyA5LCAxMCwgMTIsIDE1LCA1LCA2LCA3LCA4fTsKKwkJc3RydWN0IG1wYzUxMnhfaTJjX3RhcCBzY2x0YXBbXSA9IHsKKwkJCXs0LCAxfSwKKwkJCXs0LCAyfSwKKwkJCXs2LCA0fSwKKwkJCXs2LCA4fSwKKwkJCXsxNCwgMTZ9LAorCQkJezMwLCAzMn0sCisJCQl7NjIsIDY0fSwKKwkJCXsxMjYsIDEyOH0KKwkJfTsKKworCQlpcHMgPSBnZC0+aXBzX2NsazsKKwkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKKwkJCWZvciAoaiA9IDc7IGogPj0gMDsgai0tKSB7CisJCQkJc2NsID0gMiAqIChzY2x0YXBbal0uc2NsMnRhcCArCisJCQkJCSAgIChTQ0xfVGFwW2ldIC0gMSkgKiBzY2x0YXBbal0udGFwMnRhcAorCQkJCQkgICArIDIpOworCQkJCWlmIChpcHMgPD0gc3BlZWQqc2NsKSB7CisJCQkJCWlmICgoc3BlZWQqc2NsIC0gaXBzKSA8IGJlc3RtYXRjaCkgeworCQkJCQkJYmVzdG1hdGNoID0gc3BlZWQqc2NsIC0gaXBzOworCQkJCQkJYmVzdF9pID0gaTsKKwkJCQkJCWJlc3RfaiA9IGo7CisJCQkJCQliZXN0X3NwZWVkID0gaXBzL3NjbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlkaXZpZGVyID0gKGJlc3RfaSAmIDMpIHwgKChiZXN0X2kgJiA0KSA8PCAzKSB8IChiZXN0X2ogPDwgMik7CisJCWlmIChnZC0+ZmxhZ3MgJiBHRF9GTEdfUkVMT0MpIHsKKwkJCWZkciA9IGRpdmlkZXI7CisJCX0gZWxzZSB7CisJCQlkZWJ1ZygiJWxkIGtIeiwgXG4iLCBiZXN0X3NwZWVkIC8gMTAwMCk7CisJCQlyZXR1cm4gZGl2aWRlcjsKKwkJfQorCX0KKworCXJldHVybiBmZHI7Cit9CisKK2ludCBpMmNfcHJvYmUgKHVjaGFyIGNoaXApCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbS0+aTJjLmRldltidXNfbnVtXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJMkNfUkVUUklFUzsgaSsrKSB7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKworCQlpZiAoISBkb19hZGRyZXNzIChjaGlwLCAwKSkgeworCQkJbXBjX3JlZ19vdXQgKCZyZWdzLT5tY3IsIDAsIEkyQ19TVEEpOworCQkJdWRlbGF5ICg1MDApOworCQkJYnJlYWs7CisJCX0KKworCQltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJCXVkZWxheSAoNTAwKTsKKwl9CisKKwlyZXR1cm4gKGkgPT0gSTJDX1JFVFJJRVMpOworfQorCitpbnQgaTJjX3JlYWQgKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWYsIGludCBsZW4pCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgaTJjNTEyeF9kZXZfdCAqcmVncyA9ICZpbS0+aTJjLmRldltidXNfbnVtXTsKKwljaGFyIHhhZGRyWzRdOworCWludCByZXQgPSAtMTsKKworCXhhZGRyWzBdID0gKGFkZHIgPj4gMjQpICYgMHhGRjsKKwl4YWRkclsxXSA9IChhZGRyID4+IDE2KSAmIDB4RkY7CisJeGFkZHJbMl0gPSAoYWRkciA+PiAgOCkgJiAweEZGOworCXhhZGRyWzNdID0gIGFkZHIJJiAweEZGOworCisJaWYgKHdhaXRfZm9yX2JiICgpKSB7CisJCXByaW50ZiAoImkyY19yZWFkOiBidXMgaXMgYnVzeVxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgSTJDX1NUQSwgSTJDX1NUQSk7CisJaWYgKGRvX2FkZHJlc3MgKGNoaXAsIDApKSB7CisJCXByaW50ZiAoImkyY19yZWFkOiBmYWlsZWQgdG8gYWRkcmVzcyBjaGlwXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCWlmIChzZW5kX2J5dGVzIChjaGlwLCAmeGFkZHJbNC1hbGVuXSwgYWxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3JlYWQ6IHNlbmRfYnl0ZXMgZmFpbGVkXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfUlNUQSwgSTJDX1JTVEEpOworCWlmIChkb19hZGRyZXNzIChjaGlwLCAxKSkgeworCQlwcmludGYgKCJpMmNfcmVhZDogZmFpbGVkIHRvIGFkZHJlc3MgY2hpcFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAocmVjZWl2ZV9ieXRlcyAoY2hpcCwgKGNoYXIgKilidWYsIGxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3JlYWQ6IHJlY2VpdmVfYnl0ZXMgZmFpbGVkXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCXJldCA9IDA7CitEb25lOgorCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCAwLCBJMkNfU1RBKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaTJjX3dyaXRlICh1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmLCBpbnQgbGVuKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGkyYzUxMnhfZGV2X3QgKnJlZ3MgPSAmaW0tPmkyYy5kZXZbYnVzX251bV07CisJY2hhciB4YWRkcls0XTsKKwlpbnQgcmV0ID0gLTE7CisKKwl4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisJeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworCXhhZGRyWzJdID0gKGFkZHIgPj4gIDgpICYgMHhGRjsKKwl4YWRkclszXSA9ICBhZGRyCSYgMHhGRjsKKworCWlmICh3YWl0X2Zvcl9iYiAoKSkgeworCQlwcmludGYgKCJpMmNfd3JpdGU6IGJ1cyBpcyBidXN5XG4iKTsKKwkJZ290byBEb25lOworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKwlpZiAoZG9fYWRkcmVzcyAoY2hpcCwgMCkpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBmYWlsZWQgdG8gYWRkcmVzcyBjaGlwXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCWlmIChzZW5kX2J5dGVzIChjaGlwLCAmeGFkZHJbNC1hbGVuXSwgYWxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAoc2VuZF9ieXRlcyAoY2hpcCwgKGNoYXIgKilidWYsIGxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlyZXQgPSAwOworRG9uZToKKwltcGNfcmVnX291dCAoJnJlZ3MtPm1jciwgMCwgSTJDX1NUQSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGkyY19zZXRfYnVzX251bSAodW5zaWduZWQgaW50IGJ1cykKK3sKKwlpZiAoYnVzID49IEkyQ19CVVNfQ05UKSB7CisJCXJldHVybiAtMTsKKwl9CisJYnVzX251bSA9IGJ1czsKKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBpbnQgaTJjX2dldF9idXNfbnVtICh2b2lkKQoreworCXJldHVybiBidXNfbnVtOworfQorCisjZW5kaWYJLyogQ09ORklHX0hBUkRfSTJDICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvaWRlLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvaWRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2YjJmNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9pZGUuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNy0yMDA5IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKQorCit2b2lkIGlkZV9zZXRfcmVzZXQgKGludCBpZGVyZXNldCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwlkZWJ1ZyAoImlkZV9zZXRfcmVzZXQoJWQpXG4iLCBpZGVyZXNldCk7CisKKwlpZiAoaWRlcmVzZXQpIHsKKwkJb3V0X2JlMzIoJmltLT5wYXRhLnBhdGFfYXRhX2NvbnRyb2wsIDApOworCX0gZWxzZSB7CisJCW91dF9iZTMyKCZpbS0+cGF0YS5wYXRhX2F0YV9jb250cm9sLCBGU0xfQVRBX0NUUkxfQVRBX1JTVF9CKTsKKwl9CisJdWRlbGF5KDEwMCk7Cit9CisKK3ZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpCit7CisJZGVidWcgKCJpbml0X2lkZV9yZXNldFxuIik7CisKKwkvKgorCSAqIENsZWFyIHRoZSByZXNldCBiaXQgdG8gcmVzZXQgdGhlIGludGVyZmFjZQorCSAqIGNmLiBSZWZNYW4gTVBDNTEyMUVFOiAyOC40LjEgUmVzZXR0aW5nIHRoZSBBVEEgQnVzCisJICovCisJaWRlX3NldF9yZXNldCgxKTsKKworCS8qIEFzc2VydCB0aGUgcmVzZXQgYml0IHRvIGVuYWJsZSB0aGUgaW50ZXJmYWNlICovCisJaWRlX3NldF9yZXNldCgwKTsKKworfQorCisjZGVmaW5lIENBTENfVElNSU5HKHQpICh0ICsgcGVyaW9kIC0gMSkgLyBwZXJpb2QKKworaW50IGlkZV9wcmVpbml0ICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCWxvbmcgdDsKKwljb25zdCBzdHJ1Y3QgeworCQlzaG9ydCB0MDsKKwkJc2hvcnQgdDE7CisJCXNob3J0IHQyXzg7CisJCXNob3J0IHQyXzE2OworCQlzaG9ydCB0Mmk7CisJCXNob3J0IHQ0OworCQlzaG9ydCB0OTsKKwkJc2hvcnQgdEE7CisJfSBwaW9fc3BlY3MgPSB7CisJCS50MCAgICA9IDYwMCwKKwkJLnQxICAgID0gIDcwLAorCQkudDJfOCAgPSAyOTAsCisJCS50Ml8xNiA9IDE2NSwKKwkJLnQyaSAgID0gICAwLAorCQkudDQgICAgPSAgMzAsCisJCS50OSAgICA9ICAyMCwKKwkJLnRBICAgID0gIDUwLAorCX07CisJdW5pb24geworCQl1MzIgY29uZmlnOworCQlzdHJ1Y3QgeworCQkJdTggZmllbGQxOworCQkJdTggZmllbGQyOworCQkJdTggZmllbGQzOworCQkJdTggZmllbGQ0OworCQl9Ynl0ZXM7CisJfSBjZmc7CisKKwlkZWJ1ZyAoIklERSBwcmVpbml0IHVzaW5nIFBBVEEgcGVyaXBoZXJhbCBhdCBJTU1SLUFERFIgJTA4eFxuIiwKKwkJKHUzMikmaW0tPnBhdGEpOworCisJLyogU2V0IHRoZSByZXNldCBiaXQgdG8gMSB0byBlbmFibGUgdGhlIGludGVyZmFjZSAqLworCWlkZV9zZXRfcmVzZXQoMCk7CisKKwkvKiBJbml0IHRpbWluZ3MgOiB3ZSB1c2UgUElPIG1vZGUgMCB0aW1pbmdzICovCisJdCA9IDEwMDAwMDAwMDAgLyBnZC0+aXBzX2NsazsJLyogcGVyaW9kIGluIG5zICovCisJY2ZnLmJ5dGVzLmZpZWxkMSA9IDM7CisJY2ZnLmJ5dGVzLmZpZWxkMiA9IDM7CisJY2ZnLmJ5dGVzLmZpZWxkMyA9IChwaW9fc3BlY3MudDEgKyB0KSAvIHQ7CisJY2ZnLmJ5dGVzLmZpZWxkNCA9IChwaW9fc3BlY3MudDJfOCArIHQpIC8gdDsKKworCW91dF9iZTMyKCZpbS0+cGF0YS5wYXRhX3RpbWUxLCBjZmcuY29uZmlnKTsKKworCWNmZy5ieXRlcy5maWVsZDEgPSAocGlvX3NwZWNzLnQyXzggKyB0KSAvIHQ7CisJY2ZnLmJ5dGVzLmZpZWxkMiA9IChwaW9fc3BlY3MudEEgKyB0KSAvIHQgKyAyOworCWNmZy5ieXRlcy5maWVsZDMgPSAxOworCWNmZy5ieXRlcy5maWVsZDQgPSAocGlvX3NwZWNzLnQ0ICsgdCkgLyB0OworCisJb3V0X2JlMzIoJmltLT5wYXRhLnBhdGFfdGltZTIsIGNmZy5jb25maWcpOworCisJY2ZnLmNvbmZpZyA9IGluX2JlMzIoJmltLT5wYXRhLnBhdGFfdGltZTMpOworCWNmZy5ieXRlcy5maWVsZDEgPSAocGlvX3NwZWNzLnQ5ICsgdCkgLyB0OworCisJb3V0X2JlMzIoJmltLT5wYXRhLnBhdGFfdGltZTMsIGNmZy5jb25maWcpOworCisJZGVidWcgKCJQQVRBIHByZWluaXQgY29tcGxldGUuXG4iKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfSURFX1JFU0VUKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2lpbS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2lpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMmViMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvaWltLmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBTaWxpY29uIFR1cm5rZXkgRXhwcmVzcywgSW5jLgorICogTWFydGhhIE1hcnggPG1tYXJ4QHNpbGljb250a3guY29tPgorICoKKyAqIEFEUzUxMjEgSUlNIChGdXNlYm94KSBJbnRlcmZhY2UKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgQ09ORklHX0NNRF9GVVNFCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitzdGF0aWMgY2hhciBjdXJfYmFuayA9ICcxJzsKKworY2hhciAqaWltX2Vycl9tc2codTMyIGVycikKK3sKKwlzdGF0aWMgY2hhciAqSUlNX2VycnNbXSA9IHsKKwkJIlBhcml0eSBFcnJvciBpbiBjYWNoZSIsCisJCSJFeHBsaWNpdCBTZW5zZSBDeWNsZSBFcnJvciIsCisJCSJXcml0ZSB0byBMb2NrZWQgUmVnaXN0ZXIgRXJyb3IiLAorCQkiUmVhZCBQcm90ZWN0IEVycm9yIiwKKwkJIk92ZXJyaWRlIFByb3RlY3QgRXJyb3IiLAorCQkiV3JpdGUgUHJvdGVjdCBFcnJvciJ9OworCisJaW50IGk7CisKKwlpZiAoIWVycikKKwkJcmV0dXJuICIiOworCWZvciAoaSA9IDE7IGkgPCA4OyBpKyspCisJCWlmIChlcnIgJiAoMSA8PCBpKSkKKwkJCXByaW50ZigiSUlNIC0gJXNcbiIsIElJTV9lcnJzW2ktMV0pOworCXJldHVybiAiIjsKK30KKworaW50IGluX3JhbmdlKGludCBuLCBpbnQgbWluLCBpbnQgbWF4LCBjaGFyICplcnIsIGNoYXIgKnVzZykKK3sKKwlpZiAobiA+IG1heCB8fCBuIDwgbWluKSB7CisJCXByaW50ZihlcnIpOworCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIHVzZyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IGFkczUxMjFfZnVzZV9yZWFkKGludCBiYW5rLCBpbnQgZnN0YXJ0LCBpbnQgbnVtKQoreworCWlpbTUxMnhfdCAqaWltID0gJigoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVIpLT5paW07CisJdTMyICppaW1fZmIsIGR1bW15OworCWludCBmLCBjdHI7CisKKwlvdXRfYmUzMigmaWltLT5lcnIsIGluX2JlMzIoJmlpbS0+ZXJyKSk7CisJaWYgKGJhbmsgPT0gMCkKKwkJaWltX2ZiID0gKHUzMiAqKSYoaWltLT5mYmFjMCk7CisJZWxzZQorCQlpaW1fZmIgPSAodTMyICopJihpaW0tPmZiYWMxKTsKKy8qIHRyeSBhIHJlYWQgdG8gc2VlIGlmIFJlYWQgUHJvdGVjdCBpcyBzZXQgKi8KKwlkdW1teSA9IGluX2JlMzIoJmlpbV9mYlswXSk7CisJaWYgKGluX2JlMzIoJmlpbS0+ZXJyKSAmIElJTV9FUlJfUlBFKSB7CisJCXByaW50ZigiXHRSZWFkIHByb3RlY3QgZnVzZSBpcyBzZXRcbiIpOworCQlvdXRfYmUzMigmaWltLT5lcnIsIElJTV9FUlJfUlBFKTsKKwkJcmV0dXJuIDA7CisJfQorCXByaW50ZigiUmVhZGluZyBCYW5rICVkIGNhY2hlXG4iLCBiYW5rKTsKKwlmb3IgKGYgPSBmc3RhcnQsIGN0ciA9IDA7IG51bSA+IDA7IGN0cisrLCBudW0tLSwgZisrKSB7CisJCWlmIChjdHIgJSA0ID09IDApCisJCQlwcmludGYoIkYlMmQ6IiwgZik7CisJCXByaW50ZigiXHQlIzA0eCIsICh1OCkoaWltX2ZiW2ZdKSk7CisJCWlmIChjdHIgJSA0ID09IDMpCisJCQlwcmludGYoIlxuIik7CisJfQorCWlmIChjdHIgJSA0ICE9IDApCisJCXByaW50ZigiXG4iKTsKK30KKworaW50IGFkczUxMjFfZnVzZV9vdmVycmlkZShpbnQgYmFuaywgaW50IGYsIHU4IHZhbCkKK3sKKwlpaW01MTJ4X3QgKmlpbSA9ICYoKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SKS0+aWltOworCXUzMiAqaWltX2ZiOworCXUzMiBpaW1fc3RhdDsKKwlpbnQgaTsKKworCW91dF9iZTMyKCZpaW0tPmVyciwgaW5fYmUzMigmaWltLT5lcnIpKTsKKwlpZiAoYmFuayA9PSAwKQorCQlpaW1fZmIgPSAodTMyICopJihpaW0tPmZiYWMwKTsKKwllbHNlCisJCWlpbV9mYiA9ICh1MzIgKikmKGlpbS0+ZmJhYzEpOworLyogdHJ5IGEgcmVhZCB0byBzZWUgaWYgUmVhZCBQcm90ZWN0IGlzIHNldCAqLworCWlpbV9zdGF0ID0gaW5fYmUzMigmaWltX2ZiWzBdKTsKKwlpZiAoaW5fYmUzMigmaWltLT5lcnIpICYgSUlNX0VSUl9SUEUpIHsKKwkJcHJpbnRmKCJSZWFkIHByb3RlY3QgZnVzZSBpcyBzZXQgb24gYmFuayAlZDsiCisJCQkiT3ZlcnJpZGUgcHJvdGVjdCBtYXkgYWxzbyBiZSBzZXRcbiIsIGJhbmspOworCQlwcmludGYoIkFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIG92ZXJyaWRlXG4iKTsKKwkJb3V0X2JlMzIoJmlpbS0+ZXJyLCBJSU1fRVJSX1JQRSk7CisJfQorCWlmIChpaW1fc3RhdCAmIElJTV9GQkFDX0ZCT1ApIHsKKwkJcHJpbnRmKCJPdmVycmlkZSBwcm90ZWN0IGZ1c2UgaXMgc2V0IG9uIGJhbmsgJWRcbiIsIGJhbmspOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGYgPiBJSU1fRk1BWCkgLyogcmVzZXQgdGhlIGVudGlyZSBiYW5rICovCisJCWZvciAoaSA9IDA7IGkgPCBJSU1fRk1BWCArIDE7IGkrKykKKwkJCW91dF9iZTMyKCZpaW1fZmJbaV0sICAwKTsKKwllbHNlCisJCW91dF9iZTMyKCZpaW1fZmJbZl0sIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhZHM1MTIxX2Z1c2VfcHJvZyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgYmFuaywgY2hhciAqZnVzZW5vX2JpdG5vKQoreworCWlpbTUxMnhfdCAqaWltID0gJigoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVIpLT5paW07CisJaW50IGYsIGksIGJpdG5vOworCXUzMiBzdGF0LCBlcnI7CisKKwlmID0gc2ltcGxlX3N0cnRvbChmdXNlbm9fYml0bm8sIE5VTEwsIDEwKTsKKwlpZiAoZiA9PSAwICYmIGZ1c2Vub19iaXRub1swXSAhPSAnMCcpCisJCWYgPSAtMTsKKwlpZiAoIWluX3JhbmdlKGYsIDAsIElJTV9GTUFYLAorCQkiPGZyb3c+IG11c3QgYmUgYmV0d2VlbiAwLTMxXG5cbiIsIGNtZHRwLT51c2FnZSkpCisJCXJldHVybiAxOworCWJpdG5vID0gLTE7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAoZnVzZW5vX2JpdG5vW2ldID09ICdfJykgeworCQkJYml0bm8gPSBzaW1wbGVfc3RydG9sKCYoZnVzZW5vX2JpdG5vW2krMV0pLCBOVUxMLCAxMCk7CisJCQlpZiAoYml0bm8gPT0gMCAmJiBmdXNlbm9fYml0bm9baSsxXSAhPSAnMCcpCisJCQkJYml0bm8gPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghaW5fcmFuZ2UoYml0bm8sIDAsIDcsICJCaXQgbnVtYmVyIHJhbmdlcyBmcm9tIDAtN1xuIgorCQkiRXhhbXBsZSBvZiA8ZnJvd19iaXRubz46IFwiMThfNFwiIHNldHMgYml0IDQgb2Ygcm93IDE4XG4iLAorCQljbWR0cC0+dXNhZ2UpKQorCQlyZXR1cm4gMTsKKwlvdXRfYmUzMigmaWltLT5lcnIsIGluX2JlMzIoJmlpbS0+ZXJyKSk7CisJb3V0X2JlMzIoJmlpbS0+cHJnX3AsIElJTV9QUkdfUF9TRVQpOworCW91dF9iZTMyKCZpaW0tPnVhLCBJSU1fU0VUX1VBKGJhbmssIGYpKTsKKwlvdXRfYmUzMigmaWltLT5sYSwgSUlNX1NFVF9MQShmLCBiaXRubykpOworI2lmZGVmIERFQlVHCisJcHJpbnRmKCJQcm9ncmFtbWluZyBkaXNhYmxlZCB3aXRoIERFQlVHIGRlZmluZWQgXG4iKTsKKwlwcmludGYoIiJTZXQgdXAgdG8gcHJvCisJcHJpbnRmKCJpaW0udWEgPSAleDsgaWltLmxhID0gJXhcbiIsIGlpbS0+dWEsIGlpbS0+bGEpOworI2Vsc2UKKwlvdXRfYmUzMigmaWltLT5mY3RsLCBJSU1fRkNUTF9QUk9HX1BVTFNFIHwgSUlNX0ZDVExfUFJPRyk7CisJZG8KKwkJdWRlbGF5KDIwKTsKKwl3aGlsZSAoKHN0YXQgPSBpbl9iZTMyKCZpaW0tPnN0YXQpKSAmIElJTV9TVEFUX0JVU1kpOworCW91dF9iZTMyKCZpaW0tPnByZ19wLCAwKTsKKwllcnIgPSBpbl9iZTMyKCZpaW0tPmVycik7CisJaWYgKHN0YXQgJiBJSU1fU1RBVF9QUkdEKSB7CisJCWlmICghKGVyciAmIChJSU1fRVJSX1dQRSB8IElJTV9FUlJfV1BFKSkpIHsKKwkJCXByaW50ZigiRnVzZSBpcyBzdWNjZXNzZnVsbHkgc2V0Iik7CisJCQlpZiAoZXJyKQorCQkJCXByaW50ZigiIC0gaG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgZXJyb3JzIik7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwkJaWltLT5zdGF0ID0gMDsKKwl9CisJaWYgKGVycikgeworCQlpaW1fZXJyX21zZyhlcnIpOworCQlvdXRfYmUzMigmaWltLT5lcnIsIGluX2JlMzIoJmlpbS0+ZXJyKSk7CisJfQorI2VuZGlmCit9CisKK2ludCBhZHM1MTIxX2Z1c2Vfc2Vuc2UoaW50IGJhbmssIGludCBmc3RhcnQsIGludCBudW0pCit7CisJaWltNTEyeF90ICppaW0gPSAmKChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUiktPmlpbTsKKwl1MzIgaWltX2ZiYWM7CisJdTMyIHN0YXQsIGVyciwgZXJyX2hvbGQgPSAwOworCWludCBmLCBjdHI7CisKKwlvdXRfYmUzMigmaWltLT5lcnIsIGluX2JlMzIoJmlpbS0+ZXJyKSk7CisJaWYgKGJhbmsgPT0gMCkKKwkJaWltX2ZiYWMgPSBpbl9iZTMyKCZpaW0tPmZiYWMwKTsKKwllbHNlCisJCWlpbV9mYmFjID0gaW5fYmUzMigmaWltLT5mYmFjMSk7CisJaWYgKGlpbV9mYmFjICYgSUlNX0ZCQUNfRkJFU1ApIHsKKwkJcHJpbnRmKCJcdFNlbnNlIFByb3RlY3QgZGlzYWxsb3dzIHRoaXMgb3BlcmF0aW9uXG4iKTsKKwkJb3V0X2JlMzIoJmlpbS0+ZXJyLCBJSU1fRkJBQ19GQkVTUCk7CisJCXJldHVybiAxOworCX0KKwllcnIgPSBpbl9iZTMyKCZpaW0tPmVycik7CisJaWYgKGVycikgeworCQlpaW1fZXJyX21zZyhlcnIpOworCQllcnJfaG9sZCB8PSBlcnI7CisJfQorCWlmIChlcnIgJiBJSU1fRVJSX1JQRSkKKwkJcHJpbnRmKCJcdFJlYWQgcHJvdGVjdCBmdXNlIGlzIHNldDsgIgorCQkJIlNlbnNlIFByb3RlY3QgbWF5IGJlIHNldCBidXQgd2lsbCBiZSBhdHRlbXB0ZWRcbiIpOworCWlmIChlcnIpCisJCW91dF9iZTMyKCZpaW0tPmVyciwgZXJyKTsKKwlwcmludGYoIlNlbnNpbmcgZnVzZShzKSBvbiBCYW5rICVkXG4iLCBiYW5rKTsKKwlmb3IgKGYgPSBmc3RhcnQsIGN0ciA9IDA7IG51bSA+IDA7IGN0cisrLCBmKyssIG51bS0tKSB7CisJCW91dF9iZTMyKCZpaW0tPnVhLCBJSU1fU0VUX1VBKGJhbmssIGYpKTsKKwkJb3V0X2JlMzIoJmlpbS0+bGEsIElJTV9TRVRfTEEoZiwgMCkpOworCQlvdXRfYmUzMigmaWltLT5mY3RsLCAgSUlNX0ZDVExfRVNOU19OKTsKKwkJZG8KKwkJCXVkZWxheSgyMCk7CisJCXdoaWxlICgoc3RhdCA9IGluX2JlMzIoJmlpbS0+c3RhdCkpICYgSUlNX1NUQVRfQlVTWSk7CisJCWVyciA9IGluX2JlMzIoJmlpbS0+ZXJyKTsKKwkJaWYgKGVyciAmIElJTV9FUlJfU05TRSkgeworCQkJaWltX2Vycl9tc2coZXJyKTsKKwkJCW91dF9iZTMyKCZpaW0tPmVyciwgSUlNX0VSUl9TTlNFKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChzdGF0ICYgSUlNX1NUQVRfU05TRCkgeworCQkJb3V0X2JlMzIoJmlpbS0+c3RhdCwgMCk7CisJCQlpZiAoY3RyICUgNCA9PSAwKQorCQkJCXByaW50ZigiRiUyZDoiLCBmKTsKKwkJCXByaW50ZigiXHQlIzA0eCIsICh1OClpaW0tPnNkYXQpOworCQkJaWYgKGN0ciAlIDQgPT0gMykKKwkJCQlwcmludGYoIlxuIik7CisJCX0KKwkJaWYgKGVycikgeworCQkJZXJyX2hvbGQgfD0gZXJyOworCQkJb3V0X2JlMzIoJmlpbS0+ZXJyLCBlcnIpOworCQl9CisJfQorCWlmIChjdHIgJSA0ICE9IDApCisJCXByaW50ZigiXG4iKTsKKwlpZiAoZXJyX2hvbGQpCisJCWlpbV9lcnJfbXNnKGVycl9ob2xkKTsKKworCXJldHVybiAwOworfQorCitpbnQgYWRzNTEyMV9mdXNlX3N0YXQoaW50IGJhbmspCit7CisJaWltNTEyeF90ICppaW0gPSAmKChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUiktPmlpbTsKKwl1MzIgaWltX2ZiYWM7CisJdTMyIGVycjsKKworCW91dF9iZTMyKCZpaW0tPmVyciwgaW5fYmUzMigmaWltLT5lcnIpKTsKKwlpZiAoYmFuayA9PSAwKQorCQlpaW1fZmJhYyA9IGluX2JlMzIoJmlpbS0+ZmJhYzApOworCWVsc2UKKwkJaWltX2ZiYWMgPSBpbl9iZTMyKCZpaW0tPmZiYWMxKTsKKwllcnIgPSBpbl9iZTMyKCZpaW0tPmVycik7CisJaWYgKGVycikKKwkJaWltX2Vycl9tc2coZXJyKTsKKwlpZiAoZXJyICYgSUlNX0VSUl9SUEUgIHx8IGlpbV9mYmFjICYgSUlNX0ZCQUNfRkJSUCkgeworCQlpZiAoaWltX2ZiYWMgPT0gMCkKKwkJCXByaW50ZigiU2luY2UgcHJvdGVjdGlvbiBzZXR0aW5ncyBjYW4ndCBiZSByZWFkIC0gIgorCQkJCSJ0cnkgc2Vuc2luZyBmdXNlIHJvdyAwO1xuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoaWltX2ZiYWMgJiBJSU1fUFJPVEVDVElPTikKKwkJcHJpbnRmKCJQcm90ZWN0aW9uIEZ1c2VzIEJhbmsgJWQgPSAlIzA0eDpcbiIsIGJhbmssIGlpbV9mYmFjKTsKKwllbHNlIGlmICghKGVyciAmIElJTV9FUlJfUlBFKSkKKwkJcHJpbnRmKCJObyBQcm90ZWN0aW9uIGZ1c2VzIGFyZSBzZXRcbiIpOworCWlmIChpaW1fZmJhYyAmIElJTV9GQkFDX0ZCV1ApCisJCXByaW50ZigiXHRXcml0ZSBQcm90ZWN0IGZ1c2UgaXMgc2V0XG4iKTsKKwlpZiAoaWltX2ZiYWMgJiBJSU1fRkJBQ19GQk9QKQorCQlwcmludGYoIlx0T3ZlcnJpZGUgUHJvdGVjdCBmdXNlIGlzIHNldFxuIik7CisJaWYgKGlpbV9mYmFjICYgSUlNX0ZCQUNfRkJFU1ApCisJCXByaW50ZigiXHRTZW5zZSBQcm90ZWN0IEZ1c2UgaXMgc2V0XG4iKTsKKwlvdXRfYmUzMigmaWltLT5lcnIsIGluX2JlMzIoJmlpbS0+ZXJyKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRvX2FkczUxMjFfZnVzZShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZnJvdywgbiwgdiwgYmFuazsKKworCWlmIChjdXJfYmFuayA9PSAnMCcpCisJCWJhbmsgPSAwOworCWVsc2UKKwkJYmFuayA9IDE7CisKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAxOworCWNhc2UgMjoKKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgInN0YXQiLCA0KSA9PSAwKQorCQkJcmV0dXJuIGFkczUxMjFfZnVzZV9zdGF0KGJhbmspOworCQlpZiAoc3RybmNtcChhcmd2WzFdLCAicmVhZCIsIDQpID09IDApCisJCQlyZXR1cm4gYWRzNTEyMV9mdXNlX3JlYWQoYmFuaywgMCwgSUlNX0ZNQVggKyAxKTsKKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgInNlbnNlIiwgNSkgPT0gMCkKKwkJCXJldHVybiBhZHM1MTIxX2Z1c2Vfc2Vuc2UoYmFuaywgMCwgSUlNX0ZNQVggKyAxKTsKKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgIm92cmlkZSIsIDYpID09IDApCisJCQlyZXR1cm4gYWRzNTEyMV9mdXNlX292ZXJyaWRlKGJhbmssIElJTV9GTUFYICsgMSwgMCk7CisJCWlmIChzdHJuY21wKGFyZ3ZbMV0sICJiYW5rIiwgNCkgPT0gMCkgeworCQkJcHJpbnRmKCJBY3RpdmUgRnVzZSBCYW5rIGlzICVjXG4iLCBjdXJfYmFuayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAxOworCWNhc2UgMzoKKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgImJhbmsiLCA0KSA9PSAwKSB7CisJCQlpZiAoYXJndlsyXVswXSA9PSAnMCcpCisJCQkJY3VyX2JhbmsgPSAnMCc7CisJCQllbHNlIGlmIChhcmd2WzJdWzBdID09ICcxJykKKwkJCQljdXJfYmFuayA9ICcxJzsKKwkJCWVsc2UgeworCQkJCXByaW50ZigiVXNhZ2U6XG4lc1xuIiwgY21kdHAtPnVzYWdlKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJcHJpbnRmKCJTZXR0aW5nIEFjdGl2ZSBGdXNlIEJhbmsgdG8gJWNcbiIsIGN1cl9iYW5rKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzdHJuY21wKGFyZ3ZbMV0sICJwcm9nIiwgNCkgPT0gMCkKKwkJCXJldHVybiBhZHM1MTIxX2Z1c2VfcHJvZyhjbWR0cCwgYmFuaywgYXJndlsyXSk7CisKKwkJZnJvdyA9IChpbnQpc2ltcGxlX3N0cnRvbChhcmd2WzJdLCBOVUxMLCAxMCk7CisJCWlmIChmcm93ID09IDAgJiYgYXJndlsyXVswXSAhPSAnMCcpCisJCQlmcm93ID0gLTE7CisJCWlmICghaW5fcmFuZ2UoZnJvdywgMCwgSUlNX0ZNQVgsCisJCQkiPGZyb3c+IG11c3QgYmUgYmV0d2VlbiAwLTMxXG5cbiIsIGNtZHRwLT51c2FnZSkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgInJlYWQiLCA0KSA9PSAwKQorCQkJcmV0dXJuIGFkczUxMjFfZnVzZV9yZWFkKGJhbmssIGZyb3csIDEpOworCQlpZiAoc3RybmNtcChhcmd2WzFdLCAib3ZyaWRlIiwgNikgPT0gMCkKKwkJCXJldHVybiBhZHM1MTIxX2Z1c2Vfb3ZlcnJpZGUoYmFuaywgZnJvdywgMCk7CisJCWlmIChzdHJuY21wKGFyZ3ZbMV0sICJzZW5zZSIsIDUpID09IDApCisJCQlyZXR1cm4gYWRzNTEyMV9mdXNlX3NlbnNlKGJhbmssIGZyb3csIDEpOworCQlwcmludGYoIlVzYWdlOlxuJXNcbiIsIGNtZHRwLT51c2FnZSk7CisJCXJldHVybiAxOworCWNhc2UgNDoKKwkJZnJvdyA9IChpbnQpc2ltcGxlX3N0cnRvbChhcmd2WzJdLCBOVUxMLCAxMCk7CisJCWlmIChmcm93ID09IDAgJiYgYXJndlsyXVswXSAhPSAnMCcpCisJCQlmcm93ID0gLTE7CisJCWlmICghaW5fcmFuZ2UoZnJvdywgMCwgSUlNX0ZNQVgsCisJCQkiPGZyb3c+IG11c3QgYmUgYmV0d2VlbiAwLTMxXG5cbiIsIGNtZHRwLT51c2FnZSkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgInJlYWQiLCA0KSA9PSAwKSB7CisJCQluID0gKGludClzaW1wbGVfc3RydG9sKGFyZ3ZbM10sIE5VTEwsIDEwKTsKKwkJCWlmICghaW5fcmFuZ2UoZnJvdyArIG4sIGZyb3cgKyAxLCBJSU1fRk1BWCArIDEsCisJCQkJIjxmcm93Pis8bj4gbXVzdCBiZSBiZXR3ZWVuIDEtMzJcblxuIiwKKwkJCQljbWR0cC0+dXNhZ2UpKQorCQkJCXJldHVybiAxOworCQkJcmV0dXJuIGFkczUxMjFfZnVzZV9yZWFkKGJhbmssIGZyb3csIG4pOworCQl9CisJCWlmIChzdHJuY21wKGFyZ3ZbMV0sICJvdnJpZGUiLCA2KSA9PSAwKSB7CisJCQl2ID0gKGludClzaW1wbGVfc3RydG9sKGFyZ3ZbM10sIE5VTEwsIDEwKTsKKwkJCXJldHVybiBhZHM1MTIxX2Z1c2Vfb3ZlcnJpZGUoYmFuaywgZnJvdywgdik7CisJCX0KKwkJaWYgKHN0cm5jbXAoYXJndlsxXSwgInNlbnNlIiwgNSkgPT0gMCkgeworCQkJbiA9IChpbnQpc2ltcGxlX3N0cnRvbChhcmd2WzNdLCBOVUxMLCAxMCk7CisJCQlpZiAoIWluX3JhbmdlKGZyb3cgKyBuLCBmcm93ICsgMSwgSUlNX0ZNQVggKyAxLAorCQkJCSI8ZnJvdz4rPG4+IG11c3QgYmUgYmV0d2VlbiAxLTMyXG5cbiIsCisJCQkJY21kdHAtPnVzYWdlKSkKKwkJCQlyZXR1cm4gMTsKKwkJCXJldHVybiBhZHM1MTIxX2Z1c2Vfc2Vuc2UoYmFuaywgZnJvdywgbik7CisJCX0KKwkJcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCQlyZXR1cm4gMTsKKwlkZWZhdWx0OiAvKiBhdCBsZWFzdCA1IGFyZ3MgKi8KKwkJcHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCQlyZXR1cm4gMTsKKwl9Cit9CisKK1VfQk9PVF9DTUQoCisJZnVzZSwgQ09ORklHX1NZU19NQVhBUkdTLCAwLCBkb19hZHM1MTIxX2Z1c2UsCisJIiAgIC0gUmVhZCwgU2Vuc2UsIE92ZXJyaWRlIG9yIFByb2dyYW0gRnVzZXNcbiIsCisJImJhbmsgPG4+CQktIHNldHMgYWN0aXZlIEZ1c2UgQmFuayB0byAwIG9yIDFcbiIKKwkiCQkJICAgIG5vIGFyZ3Mgc2hvd3MgY3VycmVudCBhY3RpdmUgYmFua1xuIgorCSJmdXNlIHN0YXQJCS0gcHJpbnQgYWN0aXZlIGZ1c2UgYmFuaydzIHByb3RlY3Rpb24gc3RhdHVzXG4iCisJImZ1c2UgcmVhZCBbPGZyb3c+IFs8bj5dXSAtIHByaW50IDxuPiBmdXNlIHJvd3Mgc3RhcnRpbmcgYXQgPGZyb3c+XG4iCisJIgkJCSAgICBubyBhcmdzIHRvIHByaW50IGVudGlyZSBiYW5rJ3MgZnVzZXNcbiIKKwkiZnVzZSBvdnJpZGUgWzxmcm93PiBbPHY+XV0tIG92ZXJyaWRlIGZ1c2VzIGF0IDxmcm93PiB3aXRoIDx2PlxuIgorCSIJCQkgICAgbm8gPHY+IGRlZmF1bHRzIHRvIDAgZm9yIHRoZSByb3dcbiIKKwkiCQkJICAgIG5vIGFyZ3MgcmVzZXRzIGVudGlyZSBiYW5rIHRvIDBcbiIKKwkiCQkJICBOT1RFIC0gc2V0dGluZ3MgcGVyc2lzdCB1bnRpbCBoYXJkIHJlc2V0XG4iCisJImZ1c2Ugc2Vuc2UgWzxmcm93Pl0JLSBzZW5zZXMgY3VycmVudCBmdXNlIGF0IDxmcm93PlxuIgorCSIJCQkgICAgbm8gYXJncyBmb3IgZW50aXJlIGJhbmtcbiIKKwkiZnVzZSBwcm9nIDxmcm93X2JpdD4gCS0gcHJvZ3JhbSBmdXNlIGF0IHJvdyA8ZnJvdz4sIGJpdCA8X2JpdD5cbiIKKwkiCQkJICAgIDxmcm93PiBpcyAwLTMxLCA8Yml0PiBpcyAwLTc7IGVnLiAxM18yIFxuIgorCSIJCQkgIFdBUk5JTkcgLSB0aGlzIGlzIHBlcm1hbmVudCIKKyk7CisjZW5kaWYgLyogQ09ORklHX0NNRF9GVVNFICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvaW50ZXJydXB0cy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2ludGVycnVwdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjdjNzczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2ludGVycnVwdHMuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzgzeHggY29kZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitzdHJ1Y3QgaXJxX2FjdGlvbiB7CisJaW50ZXJydXB0X2hhbmRsZXJfdCAqaGFuZGxlcjsKKwl2b2lkICphcmc7CisJdWxvbmcgY291bnQ7Cit9OworCitpbnQgaW50ZXJydXB0X2luaXRfY3B1ICh1bnNpZ25lZCAqZGVjcmVtZW50ZXJfY291bnQpCit7CisJKmRlY3JlbWVudGVyX2NvdW50ID0gZ2V0X3RiY2xrICgpIC8gQ09ORklHX1NZU19IWjsKKworCXJldHVybiAwOworfQorCisvKgorICogSW5zdGFsbCBhbmQgZnJlZSBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLwordm9pZAoraXJxX2luc3RhbGxfaGFuZGxlciAoaW50IGlycSwgaW50ZXJydXB0X2hhbmRsZXJfdCAqIGhhbmRsZXIsIHZvaWQgKmFyZykKK3sKK30KKwordm9pZCBpcnFfZnJlZV9oYW5kbGVyIChpbnQgaXJxKQoreworfQorCit2b2lkIHRpbWVyX2ludGVycnVwdF9jcHUgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9pb3Bpbi5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L2lvcGluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMDk0NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9pb3Bpbi5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDgKKyAqIE1hcnRoYSBKIE1hcngsIFNpbGljb24gVHVybmtleSBFeHByZXNzLCBtbWFyeEBzaWxpY29udGt4LmNvbQorICogbXBjNTEyeCBJL08gcGluL3BhZCBpbml0aWFsaXphdGlvbiBmb3IgdGhlIEFEUzUxMjEgYm9hcmQKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCit2b2lkIGlvcGluX2luaXRpYWxpemUoaW9waW5fdCAqaW9yZWdzX2luaXQsIGludCBsZW4pCit7CisJc2hvcnQgaSwgaiwgcDsKKwl1MzIgKnJlZzsKKwlpbW1hcF90ICppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCisJcmVnID0gKHUzMiAqKSYoaW0tPmlvX2N0cmwpOworCisJaWYgKHNpemVvZihpb3JlZ3NfaW5pdCkgPT0gMCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWZvciAocCA9IDAsIGogPSBpb3JlZ3NfaW5pdFtpXS5wX29mZnNldCAvIHNpemVvZih1X2xvbmcpOworCQkJcCA8IGlvcmVnc19pbml0W2ldLm5yX3BpbnM7IHArKywgaisrKSB7CisJCQlpZiAoaW9yZWdzX2luaXRbaV0uYml0X29yKQorCQkJCXNldGJpdHNfYmUzMihyZWcgKyBqLCBpb3JlZ3NfaW5pdFtpXS52YWwpOworCQkJZWxzZQorCQkJCW91dF9iZTMyIChyZWcgKyBqLCBpb3JlZ3NfaW5pdFtpXS52YWwpOworCQl9CisJfQorCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDFkYjhiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L3BjaS5jCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyA8d2RAZGVueC5kZT4KKyAqIENvcHlyaWdodCAoQykgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gMjAwNiwgMjAwNy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8YXNtL2dsb2JhbF9kYXRhLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZW5kaWYKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qIFN5c3RlbSBSQU0gbWFwcGVkIHRvIFBDSSBzcGFjZSAqLworI2RlZmluZSBDT05GSUdfUENJX1NZU19NRU1fQlVTCUNPTkZJR19TWVNfU0RSQU1fQkFTRQorI2RlZmluZSBDT05GSUdfUENJX1NZU19NRU1fUEhZUwlDT05GSUdfU1lTX1NEUkFNX0JBU0UKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2lfaG9zZTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBjaV9pbml0X2JvYXJkKCkKKyAqCisgKi8KK3ZvaWQKK3BjaV9pbml0X2JvYXJkKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgbGF3NTEyeF90ICpwY2lfbGF3OworCXZvbGF0aWxlIHBvdDUxMnhfdCAqcGNpX3BvdDsKKwl2b2xhdGlsZSBwY2ljdHJsNTEyeF90ICpwY2lfY3RybDsKKwl2b2xhdGlsZSBwY2ljb25mNTEyeF90ICpwY2lfY29uZjsKKwl1MTYgcmVnMTY7CisJdTMyIHJlZzMyOworCXUzMiBkZXY7CisJaW50IGk7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCisJLyogU2V0IFBDSSBkaXZpZGVyIGZvciAzM01IeiAqLworCXJlZzMyID0gaW5fYmUzMigmaW0tPmNsay5zY2ZyWzBdKTsKKwlyZWczMiAmPSB+KFNDRlIxX1BDSV9ESVZfTUFTSyk7CisJcmVnMzIgfD0gU0NGUjFfUENJX0RJViA8PCBTQ0ZSMV9QQ0lfRElWX1NISUZUOworCW91dF9iZTMyKCZpbS0+Y2xrLnNjZnJbMF0sIHJlZzMyKTsKKworCWNscnNldGJpdHNfYmUzMigmaW0tPmNsay5zY2ZyWzBdLAorCQkJU0NGUjFfUENJX0RJVl9NQVNLLAorCQkJU0NGUjFfUENJX0RJViA8PCBTQ0ZSMV9QQ0lfRElWX1NISUZUCisJKTsKKworCXBjaV9sYXcgPSBpbS0+c3lzY29uZi5wY2lsYXc7CisJcGNpX3BvdCA9IGltLT5pb3MucG90OworCXBjaV9jdHJsID0gJmltLT5wY2lfY3RybDsKKwlwY2lfY29uZiA9ICZpbS0+cGNpX2NvbmY7CisKKwlob3NlID0gJnBjaV9ob3NlOworCisJLyoKKwkgKiBSZWxlYXNlIFBDSSBSU1QgT3V0cHV0IHNpZ25hbAorCSAqLworCW91dF9iZTMyKCZwY2lfY3RybC0+Z2NyLCAwKTsKKwl1ZGVsYXkoMjAwMCk7CisJb3V0X2JlMzIoJnBjaV9jdHJsLT5nY3IsIDEpOworCisJLyogV2UgbmVlZCB0byB3YWl0IGF0IGxlYXN0IGEgMXNlYyBiYXNlZCBvbiBQQ0kgc3BlY3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorCQl1ZGVsYXkoMTAwMCk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBQQ0kgTG9jYWwgQWNjZXNzIFdpbmRvd3MKKwkgKi8KKwlvdXRfYmUzMigmcGNpX2xhd1swXS5iYXIsIENPTkZJR19TWVNfUENJX01FTV9QSFlTICYgTEFXQkFSX0JBUik7CisJb3V0X2JlMzIoJnBjaV9sYXdbMF0uYXIsIExBV0FSX0VOIHwgTEFXQVJfU0laRV81MTJNKTsKKworCW91dF9iZTMyKCZwY2lfbGF3WzFdLmJhciwgQ09ORklHX1NZU19QQ0lfSU9fUEhZUyAmIExBV0JBUl9CQVIpOworCW91dF9iZTMyKCZwY2lfbGF3WzFdLmFyLCBMQVdBUl9FTiB8IExBV0FSX1NJWkVfMTZNKTsKKworCS8qCisJICogQ29uZmlndXJlIFBDSSBPdXRib3VuZCBUcmFuc2xhdGlvbiBXaW5kb3dzCisJICovCisKKwkvKiBQQ0kgbWVtIHNwYWNlIC0gcHJlZmV0Y2ggKi8KKwlvdXRfYmUzMigmcGNpX3BvdFswXS5wb3RhciwKKwkJKENPTkZJR19TWVNfUENJX01FTV9CQVNFID4+IDEyKSAmIFBPVEFSX1RBX01BU0spOworCW91dF9iZTMyKCZwY2lfcG90WzBdLnBvYmFyLAorCQkoQ09ORklHX1NZU19QQ0lfTUVNX1BIWVMgPj4gMTIpICYgUE9CQVJfQkFfTUFTSyk7CisJb3V0X2JlMzIoJnBjaV9wb3RbMF0ucG9jbXIsCisJCVBPQ01SX0VOIHwgUE9DTVJfUFJFIHwgUE9DTVJfQ01fMjU2TSk7CisKKwkvKiBQQ0kgSU8gc3BhY2UgKi8KKwlvdXRfYmUzMigmcGNpX3BvdFsxXS5wb3RhciwKKwkJKENPTkZJR19TWVNfUENJX0lPX0JBU0UgPj4gMTIpICYgUE9UQVJfVEFfTUFTSyk7CisJb3V0X2JlMzIoJnBjaV9wb3RbMV0ucG9iYXIsCisJCShDT05GSUdfU1lTX1BDSV9JT19QSFlTID4+IDEyKSAmIFBPQkFSX0JBX01BU0spOworCW91dF9iZTMyKCZwY2lfcG90WzFdLnBvY21yLAorCQlQT0NNUl9FTiB8IFBPQ01SX0lPIHwgUE9DTVJfQ01fMTZNKTsKKworCS8qIFBDSSBtbWlvIC0gbm9uLXByZWZldGNoIG1lbSBzcGFjZSAqLworCW91dF9iZTMyKCZwY2lfcG90WzJdLnBvdGFyLAorCQkoQ09ORklHX1NZU19QQ0lfTU1JT19CQVNFID4+IDEyKSAmIFBPVEFSX1RBX01BU0spOworCW91dF9iZTMyKCZwY2lfcG90WzJdLnBvYmFyLAorCQkoQ09ORklHX1NZU19QQ0lfTU1JT19QSFlTID4+IDEyKSAmIFBPQkFSX0JBX01BU0spOworCW91dF9iZTMyKCZwY2lfcG90WzJdLnBvY21yLAorCQlQT0NNUl9FTiB8IFBPQ01SX0NNXzI1Nk0pOworCisJLyoKKwkgKiBDb25maWd1cmUgUENJIEluYm91bmQgVHJhbnNsYXRpb24gV2luZG93cworCSAqLworCisJLyogd2UgbmVlZCBSQU0gbWFwcGVkIHRvIFBDSSBzcGFjZSBmb3IgdGhlIGRldmljZXMgdG8KKwkgKiBhY2Nlc3MgbWFpbiBtZW1vcnkgKi8KKwlvdXRfYmUzMigmcGNpX2N0cmxbMF0ucGl0YXIxLCAweDApOworCW91dF9iZTMyKCZwY2lfY3RybFswXS5waWJhcjEsIDB4MCk7CisJb3V0X2JlMzIoJnBjaV9jdHJsWzBdLnBpZWJhcjEsIDB4MCk7CisJb3V0X2JlMzIoJnBjaV9jdHJsWzBdLnBpd2FyMSwKKwkJUElXQVJfRU4gfCBQSVdBUl9QRiB8IFBJV0FSX1JUVF9TTk9PUCB8CisJCVBJV0FSX1dUVF9TTk9PUCB8IChfX2lsb2cyKGdkLT5yYW1fc2l6ZSkgLSAxKSk7CisKKwlob3NlLT5maXJzdF9idXNubyA9IDA7CisJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CisKKwkvKiBQQ0kgbWVtb3J5IHByZWZldGNoIHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCSAgICAgICBDT05GSUdfU1lTX1BDSV9NRU1fQkFTRSwKKwkJICAgICAgIENPTkZJR19TWVNfUENJX01FTV9QSFlTLAorCQkgICAgICAgQ09ORklHX1NZU19QQ0lfTUVNX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTXxQQ0lfUkVHSU9OX1BSRUZFVENIKTsKKworCS8qIFBDSSBtZW1vcnkgc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMSwKKwkJICAgICAgIENPTkZJR19TWVNfUENJX01NSU9fQkFTRSwKKwkJICAgICAgIENPTkZJR19TWVNfUENJX01NSU9fUEhZUywKKwkJICAgICAgIENPTkZJR19TWVNfUENJX01NSU9fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIFBDSSBJTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkgICAgICAgQ09ORklHX1NZU19QQ0lfSU9fQkFTRSwKKwkJICAgICAgIENPTkZJR19TWVNfUENJX0lPX1BIWVMsCisJCSAgICAgICBDT05GSUdfU1lTX1BDSV9JT19TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkvKiBTeXN0ZW0gbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDMsCisJCSAgICAgICBDT05GSUdfUENJX1NZU19NRU1fQlVTLAorCQkgICAgICAgQ09ORklHX1BDSV9TWVNfTUVNX1BIWVMsCisJCSAgICAgICBnZC0+cmFtX3NpemUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fU1lTX01FTU9SWSk7CisKKwlob3NlLT5yZWdpb25fY291bnQgPSA0OworCisJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsCisJCQkgICAoQ09ORklHX1NZU19JTU1SICsgMHg4MzAwKSwKKwkJCSAgIChDT05GSUdfU1lTX0lNTVIgKyAweDgzMDQpKTsKKworCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOworCisJLyoKKwkgKiBXcml0ZSB0byBDb21tYW5kIHJlZ2lzdGVyCisJICovCisJcmVnMTYgPSAweGZmOworCWRldiA9IFBDSV9CREYoaG9zZS0+Zmlyc3RfYnVzbm8sIDAsIDApOworCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgJnJlZzE2KTsKKwlyZWcxNiB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfTUVNT1JZOworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIHJlZzE2KTsKKworCS8qCisJICogQ2xlYXIgbm9uLXJlc2VydmVkIGJpdHMgaW4gc3RhdHVzIHJlZ2lzdGVyLgorCSAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX1NUQVRVUywgMHhmZmZmKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDB4MDgpOworCisjaWZkZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cKKwlwcmludGYoIlBDSTogICBCdXMgRGV2IFZlbklkIERldklkIENsYXNzIEludFxuIik7CisjZW5kaWYKKwkvKgorCSAqIEhvc2Ugc2Nhbi4KKwkgKi8KKwlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbihob3NlKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKK3ZvaWQgZnRfcGNpX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCWludCBub2Rlb2Zmc2V0OworCWludCB0bXBbMl07CisJY29uc3QgY2hhciAqcGF0aDsKKworCW5vZGVvZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQoYmxvYiwgIi9hbGlhc2VzIik7CisJaWYgKG5vZGVvZmZzZXQgPj0gMCkgeworCQlwYXRoID0gZmR0X2dldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgInBjaSIsIE5VTEwpOworCQlpZiAocGF0aCkgeworCQkJdG1wWzBdID0gY3B1X3RvX2JlMzIocGNpX2hvc2UuZmlyc3RfYnVzbm8pOworCQkJdG1wWzFdID0gY3B1X3RvX2JlMzIocGNpX2hvc2UubGFzdF9idXNubyk7CisJCQlkb19maXh1cF9ieV9wYXRoKGJsb2IsIHBhdGgsICJidXMtcmFuZ2UiLAorCQkJCSZ0bXAsIHNpemVvZih0bXApLCAxKTsKKworCQkJdG1wWzBdID0gY3B1X3RvX2JlMzIoZ2QtPnBjaV9jbGspOworCQkJZG9fZml4dXBfYnlfcGF0aChibG9iLCBwYXRoLCAiY2xvY2stZnJlcXVlbmN5IiwKKwkJCQkmdG1wLCBzaXplb2YodG1wWzBdKSwgMSk7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L3NlcmlhbC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMmY0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvc2VyaWFsLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAgLSAyMDEwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEJhc2VkIG9udCB0aGUgTVBDNTIwMCBQU0MgZHJpdmVyLgorICogQWRhcHRlZCBmb3IgTVBDNTEyeCBieSBKYW4gV3JvYmVsIDx3cnJAc2VtaWhhbGYuY29tPgorICovCisKKy8qCisgKiBNaW5pbWFsIHNlcmlhbCBmdW5jdGlvbnMgbmVlZGVkIHRvIHVzZSBvbmUgb2YgdGhlIFBTQyBwb3J0cworICogYXMgc2VyaWFsIGNvbnNvbGUgaW50ZXJmYWNlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZChDT05GSUdfUFNDX0NPTlNPTEUpCisKK3N0YXRpYyB2b2lkIGZpZm9faW5pdCAodm9sYXRpbGUgcHNjNTEyeF90ICpwc2MpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisKKwkvKiByZXNldCBSeCAmIFR4IGZpZm8gc2xpY2UgKi8KKwlvdXRfYmUzMigmcHNjLT5yZmNtZCwgUFNDX0ZJRk9fUkVTRVRfU0xJQ0UpOworCW91dF9iZTMyKCZwc2MtPnRmY21kLCBQU0NfRklGT19SRVNFVF9TTElDRSk7CisKKwkvKiBkaXNhYmxlIFR4ICYgUnggRklGTyBpbnRlcnJ1cHRzICovCisJb3V0X2JlMzIoJnBzYy0+cmZpbnRtYXNrLCAwKTsKKwlvdXRfYmUzMigmcHNjLT50ZmludG1hc2ssIDApOworCisJb3V0X2JlMzIoJnBzYy0+dGZzaXplLCBDT05TT0xFX0ZJRk9fVFhfU0laRSB8IChDT05TT0xFX0ZJRk9fVFhfQUREUiA8PCAxNikpOworCW91dF9iZTMyKCZwc2MtPnJmc2l6ZSwgQ09OU09MRV9GSUZPX1JYX1NJWkUgfCAoQ09OU09MRV9GSUZPX1JYX0FERFIgPDwgMTYpKTsKKworCS8qIGVuYWJsZSBUeCAmIFJ4IEZJRk8gc2xpY2UgKi8KKwlvdXRfYmUzMigmcHNjLT5yZmNtZCwgUFNDX0ZJRk9fRU5BQkxFX1NMSUNFKTsKKwlvdXRfYmUzMigmcHNjLT50ZmNtZCwgUFNDX0ZJRk9fRU5BQkxFX1NMSUNFKTsKKworCW91dF9iZTMyKCZpbS0+Zmlmb2MuZmlmb2NfY21kLCBGSUZPQ19ESVNBQkxFX0NMT0NLX0dBVEUpOworCV9fYXNtX18gdm9sYXRpbGUgKCJzeW5jIik7Cit9CisKK3ZvaWQgc2VyaWFsX3NldGJyZyh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCXVuc2lnbmVkIGxvbmcgYmFzZWNsaywgZGl2OworCisJLyogY2FsY3VsYXRlIGRpdmlkb3IgZm9yIHNldHRpbmcgUFNDIENUVVIgYW5kIENUTFIgcmVnaXN0ZXJzICovCisJYmFzZWNsayA9IChnZC0+aXBzX2NsayArIDgpIC8gMTY7CisJZGl2ID0gKGJhc2VjbGsgKyAoZ2QtPmJhdWRyYXRlIC8gMikpIC8gZ2QtPmJhdWRyYXRlOworCisJb3V0XzgoJnBzYy0+Y3R1ciwgKGRpdiA+PiA4KSAmIDB4ZmYpOworCW91dF84KCZwc2MtPmN0bHIsICBkaXYgJiAweGZmKTsgLyogc2V0IGJhdWRyYXRlICovCit9CisKK2ludCBzZXJpYWxfaW5pdCh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCisJZmlmb19pbml0IChwc2MpOworCisJLyogc2V0IE1SIHJlZ2lzdGVyIHRvIHBvaW50IHRvIE1SMSAqLworCW91dF84KCZwc2MtPmNvbW1hbmQsIFBTQ19TRUxfTU9ERV9SRUdfMSk7CisKKwkvKiBkaXNhYmxlIFR4L1J4ICovCisJb3V0XzgoJnBzYy0+Y29tbWFuZCwgUFNDX1RYX0RJU0FCTEUgfCBQU0NfUlhfRElTQUJMRSk7CisKKwkvKiBjaG9vc2UgdGhlIHByZXNjYWxlcglieSAxNiBmb3IgdGhlIFR4L1J4IGNsb2NrIGdlbmVyYXRpb24gKi8KKwlvdXRfYmUxNigmcHNjLT5wc2NfY2xvY2tfc2VsZWN0LCAweGRkMDApOworCisJLyogc3dpdGNoIHRvIFVBUlQgbW9kZSAqLworCW91dF9iZTMyKCZwc2MtPnNpY3IsIDApOworCisJLyogbW9kZSByZWdpc3RlciBwb2ludHMgdG8gbXIxICovCisJLyogY29uZmlndXJlIHBhcml0eSwgYml0IGxlbmd0aCBhbmQgc28gb24gaW4gbW9kZSByZWdpc3RlciAxKi8KKwlvdXRfOCgmcHNjLT5tb2RlLCBQU0NfTU9ERV84X0JJVFMgfCBQU0NfTU9ERV9QQVJOT05FKTsKKwkvKiBub3csIG1vZGUgcmVnaXN0ZXIgcG9pbnRzIHRvIG1yMiAqLworCW91dF84KCZwc2MtPm1vZGUsIFBTQ19NT0RFXzFfU1RPUEJJVCk7CisKKwkvKiBzZXQgYmF1ZHJhdGUgKi8KKwlzZXJpYWxfc2V0YnJnKCk7CisKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJb3V0X2JlMTYoJnBzYy0+cHNjX2ltciwgMCk7CisKKwkvKiByZXNldCBhbmQgZW5hYmxlIFJ4L1R4ICovCisJb3V0XzgoJnBzYy0+Y29tbWFuZCwgUFNDX1JTVF9SWCk7CisJb3V0XzgoJnBzYy0+Y29tbWFuZCwgUFNDX1JTVF9UWCk7CisJb3V0XzgoJnBzYy0+Y29tbWFuZCwgUFNDX1JYX0VOQUJMRSB8IFBTQ19UWF9FTkFCTEUpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2VyaWFsX3B1dGMgKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCisJaWYgKGMgPT0gJ1xuJykKKwkJc2VyaWFsX3B1dGMgKCdccicpOworCisJLyogV2FpdCBmb3IgbGFzdCBjaGFyYWN0ZXIgdG8gZ28uICovCisJd2hpbGUgKCEoaW5fYmUxNigmcHNjLT5wc2Nfc3RhdHVzKSAmIFBTQ19TUl9UWEVNUCkpCisJCTsKKworCW91dF84KCZwc2MtPnRmZGF0YV84LCBjKTsKK30KKwordm9pZCBzZXJpYWxfcHV0Y19yYXcgKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLiAqLworCXdoaWxlICghKGluX2JlMTYoJnBzYy0+cHNjX3N0YXR1cykgJiBQU0NfU1JfVFhFTVApKQorCQk7CisKKwlvdXRfOCgmcHNjLT50ZmRhdGFfOCwgYyk7Cit9CisKKwordm9pZCBzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJc2VyaWFsX3B1dGMgKCpzKyspOworCX0KK30KKworaW50IHNlcmlhbF9nZXRjICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCisJLyogV2FpdCBmb3IgYSBjaGFyYWN0ZXIgdG8gYXJyaXZlLiAqLworCXdoaWxlIChpbl9iZTMyKCZwc2MtPnJmc3RhdCkgJiBQU0NfRklGT19FTVBUWSkKKwkJOworCisJcmV0dXJuIGluXzgoJnBzYy0+cmZkYXRhXzgpOworfQorCitpbnQgc2VyaWFsX3RzdGMgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgcHNjNTEyeF90ICpwc2MgPSAocHNjNTEyeF90ICopICZpbS0+cHNjW0NPTkZJR19QU0NfQ09OU09MRV07CisKKwlyZXR1cm4gIShpbl9iZTMyKCZwc2MtPnJmc3RhdCkgJiBQU0NfRklGT19FTVBUWSk7Cit9CisKK3ZvaWQgc2VyaWFsX3NldHJ0cyhpbnQgcykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBwc2M1MTJ4X3QgKnBzYyA9IChwc2M1MTJ4X3QgKikgJmltLT5wc2NbQ09ORklHX1BTQ19DT05TT0xFXTsKKworCWlmIChzKSB7CisJCS8qIEFzc2VydCBSVFMgKGJlY29tZSBMT1cpICovCisJCW91dF84KCZwc2MtPm9wMSwgMHgxKTsKKwl9CisJZWxzZSB7CisJCS8qIE5lZ2F0ZSBSVFMgKGJlY29tZSBISUdIKSAqLworCQlvdXRfOCgmcHNjLT5vcDAsIDB4MSk7CisJfQorfQorCitpbnQgc2VyaWFsX2dldGN0cyh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHBzYzUxMnhfdCAqcHNjID0gKHBzYzUxMnhfdCAqKSAmaW0tPnBzY1tDT05GSUdfUFNDX0NPTlNPTEVdOworCisJcmV0dXJuIChpbl84KCZwc2MtPmlwKSAmIDB4MSkgPyAwIDogMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFNDX0NPTlNPTEUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9zcGVlZC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L3NwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4ZDA5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9zcGVlZC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDkKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBCYXNlZCBvbiB0aGUgTVBDODN4eCBjb2RlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworc3RhdGljIGludCBzcG1mX211bHRbXSA9IHsKKwk2OCwgMSwgMTIsIDE2LAorCTIwLCAyNCwgMjgsIDMyLAorCTM2LCA0MCwgNDQsIDQ4LAorCTUyLCA1NiwgNjAsIDY0Cit9OworCitzdGF0aWMgaW50IGNwbWZfbXVsdFtdWzJdID0geworCXswLCAxfSwgezAsIDF9LCAvKiAwIGFuZCAxIGFyZSBub3QgdmFsaWQgKi8KKwl7MSwgMX0sIHszLCAyfSwKKwl7MiwgMX0sIHs1LCAyfSwKKwl7MywgMX0sIHs3LCAyfSwKKwl7MCwgMX0sIHswLCAxfSwgLyogYW5kIGFsbCBhYm92ZSA3IGFyZSBub3QgdmFsaWQgdG9vICovCisJezAsIDF9LCB7MCwgMX0sCisJezAsIDF9LCB7MCwgMX0sCisJezAsIDF9LCB7MCwgMX0KK307CisKK3N0YXRpYyBpbnQgc3lzX2Rpdmlkb3JzW11bMl0gPSB7CisJezIsIDF9LCB7NSwgMn0sIHszLCAxfSwgezcsIDJ9LCB7NCwgMX0sCisJezksIDJ9LCB7NSwgMX0sIHs3LCAxfSwgezYsIDF9LCB7OCwgMX0sCisJezksIDF9LCB7MTEsIDF9LCB7MTAsIDF9LCB7MTIsIDF9LCB7MTMsIDF9LAorCXsxNSwgMX0sIHsxNCwgMX0sIHsxNiwgMX0sIHsxNywgMX0sIHsxOSwgMX0sCisJezE4LCAxfSwgezIwLCAxfSwgezIxLCAxfSwgezIzLCAxfSwgezIyLCAxfSwKKwl7MjQsIDF9LCB7MjUsIDF9LCB7MjcsIDF9LCB7MjYsIDF9LCB7MjgsIDF9LAorCXsyOSwgMX0sIHszMSwgMX0sIHszMCwgMX0sIHszMiwgMX0sIHszMywgMX0KK307CisKK2ludCBnZXRfY2xvY2tzICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXU4IHNwbWY7CisJdTggY3BtZjsKKwl1OCBzeXNfZGl2OworCXU4IGlwc19kaXY7CisJdTggcGNpX2RpdjsKKwl1MzIgcmVmX2NsayA9IENPTkZJR19TWVNfTVBDNTEyWF9DTEtJTjsKKwl1MzIgc3BsbDsKKwl1MzIgc3lzX2NsazsKKwl1MzIgY29yZV9jbGs7CisJdTMyIGNzYl9jbGs7CisJdTMyIGlwc19jbGs7CisJdTMyIHBjaV9jbGs7CisJdTMyIHJlZzsKKworCXJlZyA9IGluX2JlMzIoJmltLT5zeXNjb25mLmltbXJiYXIpOworCWlmICgocmVnICYgSU1NUkJBUl9CQVNFX0FERFIpICE9ICh1MzIpIGltKQorCQlyZXR1cm4gLTE7CisKKwlyZWcgPSBpbl9iZTMyKCZpbS0+Y2xrLnNwbXIpOworCXNwbWYgPSAocmVnICYgU1BNUl9TUE1GKSA+PiBTUE1SX1NQTUZfU0hJRlQ7CisJc3BsbCA9IHJlZl9jbGsgKiBzcG1mX211bHRbc3BtZl07CisKKwlyZWcgPSBpbl9iZTMyKCZpbS0+Y2xrLnNjZnJbMV0pOworCXN5c19kaXYgPSAocmVnICYgU0NGUjJfU1lTX0RJVikgPj4gU0NGUjJfU1lTX0RJVl9TSElGVDsKKwlzeXNfY2xrID0gKHNwbGwgKiBzeXNfZGl2aWRvcnNbc3lzX2Rpdl1bMV0pIC8gc3lzX2Rpdmlkb3JzW3N5c19kaXZdWzBdOworCisJY3NiX2NsayA9IHN5c19jbGsgLyAyOworCisJcmVnID0gaW5fYmUzMigmaW0tPmNsay5zcG1yKTsKKwljcG1mID0gKHJlZyAmIFNQTVJfQ1BNRikgPj4gU1BNUl9DUE1GX1NISUZUOworCWNvcmVfY2xrID0gKGNzYl9jbGsgKiBjcG1mX211bHRbY3BtZl1bMF0pIC8gY3BtZl9tdWx0W2NwbWZdWzFdOworCisJcmVnID0gaW5fYmUzMigmaW0tPmNsay5zY2ZyWzBdKTsKKwlpcHNfZGl2ID0gKHJlZyAmIFNDRlIxX0lQU19ESVZfTUFTSykgPj4gU0NGUjFfSVBTX0RJVl9TSElGVDsKKwlpZiAoaXBzX2RpdiAhPSAwKSB7CisJCWlwc19jbGsgPSBjc2JfY2xrIC8gaXBzX2RpdjsKKwl9IGVsc2UgeworCQkvKiBpbiBjYXNlIHdlIGNhbm5vdCBnZXQgYSBzYW5lIElQUyBkaXZpc29yLCBmYWlsIGdyYWNlZnVsbHkgKi8KKwkJaXBzX2NsayA9IDA7CisJfQorCisJcmVnID0gaW5fYmUzMigmaW0tPmNsay5zY2ZyWzBdKTsKKwlwY2lfZGl2ID0gKHJlZyAmIFNDRlIxX1BDSV9ESVZfTUFTSykgPj4gU0NGUjFfUENJX0RJVl9TSElGVDsKKwlpZiAocGNpX2RpdiAhPSAwKSB7CisJCXBjaV9jbGsgPSBjc2JfY2xrIC8gcGNpX2RpdjsKKwl9IGVsc2UgeworCQkvKiBpbiBjYXNlIHdlIGNhbm5vdCBnZXQgYSBzYW5lIElQUyBkaXZpc29yLCBmYWlsIGdyYWNlZnVsbHkgKi8KKwkJcGNpX2NsayA9IDMzMzMzMzsKKwl9CisKKwlnZC0+aXBzX2NsayA9IGlwc19jbGs7CisJZ2QtPnBjaV9jbGsgPSBwY2lfY2xrOworCWdkLT5jc2JfY2xrID0gY3NiX2NsazsKKwlnZC0+Y3B1X2NsayA9IGNvcmVfY2xrOworCWdkLT5idXNfY2xrID0gY3NiX2NsazsKKwlyZXR1cm4gMDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9idXNfZnJlcQorICogcmV0dXJuIHN5c3RlbSBidXMgZnJlcSBpbiBIegorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIGdldF9idXNfZnJlcSAodWxvbmcgZHVtbXkpCit7CisJcmV0dXJuIGdkLT5jc2JfY2xrOworfQorCitpbnQgZG9fY2xvY2tzIChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY2hhciBidWZbMzJdOworCisJcHJpbnRmKCJDbG9jayBjb25maWd1cmF0aW9uOlxuIik7CisJcHJpbnRmKCIgIENQVTogICAgICAgICAgICAgICAgICUtNHMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+Y3B1X2NsaykpOworCXByaW50ZigiICBDb2hlcmVudCBTeXN0ZW0gQnVzOiAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPmNzYl9jbGspKTsKKwlwcmludGYoIiAgSVBTIEJ1czogICAgICAgICAgICAgJS00cyBNSHpcbiIsIHN0cm1oeihidWYsIGdkLT5pcHNfY2xrKSk7CisJcHJpbnRmKCIgIFBDSTogICAgICAgICAgICAgICAgICUtNHMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+cGNpX2NsaykpOworCXByaW50ZigiICBERFI6ICAgICAgICAgICAgICAgICAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgMipnZC0+Y3NiX2NsaykpOworCXJldHVybiAwOworfQorCitVX0JPT1RfQ01EKGNsb2NrcywgMSwgMCwgZG9fY2xvY2tzLAorCSJwcmludCBjbG9jayBjb25maWd1cmF0aW9uIiwKKwkiICAgIGNsb2NrcyIKKyk7CisKK2ludCBwcnRfbXBjNTEyeF9jbGtzICh2b2lkKQoreworCWRvX2Nsb2NrcyAoTlVMTCwgMCwgMCwgTlVMTCk7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9zdGFydC5TIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2YjYxNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC9zdGFydC5TCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk4ICBEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0PgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBNYWdudXMgRGFtbSA8a2llcmF5cGMwMS5wLnkua2llLmVyYS5lcmljc3Nvbi5zZT4KKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA5IFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisgKiBDb3B5cmlnaHQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gMjAwNCwgMjAwNi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBCYXNlZCBvbiB0aGUgTVBDODN4eCBjb2RlLgorICovCisKKy8qCisgKiAgVS1Cb290IC0gU3RhcnR1cCBDb2RlIGZvciBNUEM1MTJ4IGJhc2VkIEVtYmVkZGVkIEJvYXJkcworICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx0aW1lc3RhbXAuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUgQ09ORklHXzUyMVgJMQkJLyogbmVlZGVkIGZvciBMaW51eCBrZXJuZWwgaGVhZGVyIGZpbGVzKi8KKworI2luY2x1ZGUgPGFzbS9pbW1hcF81MTJ4Lmg+CisjaW5jbHVkZSAiYXNtLW9mZnNldHMuaCIKKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisjaWZuZGVmICBDT05GSUdfSURFTlRfU1RSSU5HCisjZGVmaW5lICBDT05GSUdfSURFTlRfU1RSSU5HICJNUEM1MTJYIgorI2VuZGlmCisKKy8qCisgKiBGbG9hdGluZyBQb2ludCBlbmFibGUsIE1hY2hpbmUgQ2hlY2sgYW5kIFJlY292ZXJhYmxlIEludGVyci4KKyAqLworI3VuZGVmCU1TUl9LRVJORUwKKyNpZmRlZiBERUJVRworI2RlZmluZSBNU1JfS0VSTkVMIChNU1JfRlB8TVNSX1JJKQorI2Vsc2UKKyNkZWZpbmUgTVNSX0tFUk5FTCAoTVNSX0ZQfE1TUl9NRXxNU1JfUkkpCisjZW5kaWYKKworLyogTWFjcm9zIGZvciBtYW5pcHVsYXRpbmcgQ1N4X1NUQVJUL1NUT1AgKi8KKyNkZWZpbmUgU1RBUlRfUkVHKHN0YXJ0KQkoKHN0YXJ0KSA+PiAxNikKKyNkZWZpbmUgU1RPUF9SRUcoc3RhcnQsIHNpemUpCSgoKHN0YXJ0KSArIChzaXplKSAtIDEpID4+IDE2KQorCisvKgorICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQorICoKKyAqIFVzZSByMTIgdG8gYWNjZXNzIHRoZSBHT1QKKyAqLworCVNUQVJUX0dPVAorCUdPVF9FTlRSWShfR09UMl9UQUJMRV8pCisJR09UX0VOVFJZKF9GSVhVUF9UQUJMRV8pCisKKwlHT1RfRU5UUlkoX3N0YXJ0KQorCUdPVF9FTlRSWShfc3RhcnRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkoX2VuZF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWSh0cmFuc2Zlcl90b19oYW5kbGVyKQorCisJR09UX0VOVFJZKF9faW5pdF9lbmQpCisJR09UX0VOVFJZKF9lbmQpCisJR09UX0VOVFJZKF9fYnNzX3N0YXJ0KQorCUVORF9HT1QKKworLyoKKyAqIE1hZ2ljIG51bWJlciBhbmQgdmVyc2lvbiBzdHJpbmcKKyAqLworCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQm9vdCBNYWdpYyBOdW1iZXIgKi8KKwkuZ2xvYmwJdmVyc2lvbl9zdHJpbmcKK3ZlcnNpb25fc3RyaW5nOgorCS5hc2NpaSBVX0JPT1RfVkVSU0lPTgorCS5hc2NpaSAiICgiLCBVX0JPT1RfREFURSwgIiAtICIsIFVfQk9PVF9USU1FLCAiKSIKKwkuYXNjaWkgIiAiLCBDT05GSUdfSURFTlRfU1RSSU5HLCAiXDAiCisKKy8qCisgKiBWZWN0b3IgVGFibGUKKyAqLworCS50ZXh0CisJLiA9IEVYQ19PRkZfU1lTX1JFU0VUCisKKwkuZ2xvYmwJX3N0YXJ0CisJLyogU3RhcnQgZnJvbSBoZXJlIGFmdGVyIHJlc2V0L3Bvd2VyIG9uICovCitfc3RhcnQ6CisJbGkJcjIxLCBCT09URkxBR19DT0xEICAvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworCWIJYm9vdF9jb2xkCisKKwkuZ2xvYmwJX3N0YXJ0X29mX3ZlY3RvcnMKK19zdGFydF9vZl92ZWN0b3JzOgorCisvKiBNYWNoaW5lIGNoZWNrICovCisJU1REX0VYQ0VQVElPTigweDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCisKKy8qIERhdGEgU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDMwMCwgRGF0YVN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEluc3RydWN0aW9uIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg1MDAsIEV4dEludGVycnVwdCwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KKwkuID0gMHg2MDAKK0FsaWdubWVudDoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJbWZzcHIJcjQsREFSCisJc3R3CXI0LF9EQVIocjIxKQorCW1mc3ByCXI1LERTSVNSCisJc3R3CXI1LF9EU0lTUihyMjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKEFsaWdubWVudCwgQWxpZ25tZW50RXhjZXB0aW9uLCBNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLworCS4gPSAweDcwMAorUHJvZ3JhbUNoZWNrOgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRVhDX1hGRVJfVEVNUExBVEUoUHJvZ3JhbUNoZWNrLCBQcm9ncmFtQ2hlY2tFeGNlcHRpb24sCisJCU1TUl9LRVJORUwsIENPUFlfRUUpCisKKy8qIEZsb2F0aW5nIFBvaW50IFVuaXQgdW5hdmFpbGFibGUgZXhjZXB0aW9uICovCisJU1REX0VYQ0VQVElPTigweDgwMCwgRlBVbmF2YWlsYWJsZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogRGVjcmVtZW50ZXIgKi8KKwlTVERfRVhDRVBUSU9OKDB4OTAwLCBEZWNyZW1lbnRlciwgdGltZXJfaW50ZXJydXB0KQorCisvKiBDcml0aWNhbCBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4YTAwLCBDcml0aWNhbCwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogU3lzdGVtIENhbGwgKi8KKwlTVERfRVhDRVBUSU9OKDB4YzAwLCBTeXN0ZW1DYWxsLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBUcmFjZSBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4ZDAwLCBUcmFjZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogUGVyZm9ybWFuY2UgTW9uaXRvciBpbnRlcnJ1cHQgKi8KKwlTVERfRVhDRVBUSU9OKDB4ZjAwLCBQZXJmTW9uLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBJbnRydWN0aW9uIFRyYW5zbGF0aW9uIE1pc3MgKi8KKwlTVERfRVhDRVBUSU9OKDB4MTAwMCwgSW5zdHJ1Y3Rpb25UTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBEYXRhIExvYWQgVHJhbnNsYXRpb24gTWlzcyAqLworCVNURF9FWENFUFRJT04oMHgxMTAwLCBEYXRhTG9hZFRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisKKy8qIERhdGEgU3RvcmUgVHJhbnNsYXRpb24gTWlzcyAqLworCVNURF9FWENFUFRJT04oMHgxMjAwLCBEYXRhU3RvcmVUTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBJbnN0cnVjdGlvbiBBZGRyZXNzIEJyZWFrcG9pbnQgKi8KKwlTVERfRVhDRVBUSU9OKDB4MTMwMCwgSW5zdHJ1Y3Rpb25BZGRyQnJlYWtwb2ludCwgRGVidWdFeGNlcHRpb24pCisKKy8qIFN5c3RlbSBNYW5hZ2VtZW50IGludGVycnVwdCAqLworCVNURF9FWENFUFRJT04oMHgxNDAwLCBTeXN0ZW1NZ210SW50ZXJydXB0LCBVbmtub3duRXhjZXB0aW9uKQorCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisJLiA9IDB4MzAwMAorYm9vdF9jb2xkOgorCS8qIFNhdmUgbXNyIGNvbnRlbnRzICovCisJbWZtc3IJcjUKKworCS8qIFNldCBJTU1SIGFyZWEgdG8gb3VyIHByZWZlcnJlZCBsb2NhdGlvbiAqLworCWxpcwlyNCwgQ09ORklHX0RFRkFVTFRfSU1NUkBoCisJbGlzCXIzLCBDT05GSUdfU1lTX0lNTVJAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSU1NUkBsCisJc3R3CXIzLCBJTU1SQkFSKHI0KQorCW10c3ByCU1CQVIsIHIzCQkvKiBJTU1SQkFSIGlzIG1pcnJvcmVkIGludG8gdGhlIE1CQVIgU1BSICgzMTEpICovCisKKwkvKiBJbml0aWFsaXNlIHRoZSBtYWNoaW5lICovCisJYmwJY3B1X2Vhcmx5X2luaXQKKworCS8qCisJICogU2V0IHVwIExvY2FsIEFjY2VzcyBXaW5kb3dzOgorCSAqCisJICogMSkgQm9vdC9DUzAgKGJvb3QgRkxBU0gpCisJICogMikgT24tY2hpcCBTUkFNIChpbml0aWFsIHN0YWNrIHB1cnBvc2VzKQorCSAqLworCisJLyogQm9vdCBDUy9DUzAgd2luZG93IHJhbmdlICovCisJbGlzICAgICByMywgQ09ORklHX1NZU19JTU1SQGgKKwlvcmkgICAgIHIzLCByMywgQ09ORklHX1NZU19JTU1SQGwKKworCWxpcwlyNCwgU1RBUlRfUkVHKENPTkZJR19TWVNfRkxBU0hfQkFTRSkKKwlvcmkJcjQsIHI0LCBTVE9QX1JFRyhDT05GSUdfU1lTX0ZMQVNIX0JBU0UsIENPTkZJR19TWVNfRkxBU0hfU0laRSkKKwlzdHcJcjQsIExQQ1MwQVcocjMpCisKKwkvKgorCSAqIFRoZSBTUkFNIHdpbmRvdyBoYXMgYSBmaXhlZCBzaXplICgyNTZLKSwgc28gb25seSB0aGUgc3RhcnQgYWRkcmVzcworCSAqIGlzIG5lY2Vzc2FyeQorCSAqLworCWxpcwlyNCwgU1RBUlRfUkVHKENPTkZJR19TWVNfU1JBTV9CQVNFKSAmIDB4ZmYwMAorCXN0dwlyNCwgU1JBTUJBUihyMykKKworCS8qCisJICogQWNjb3JkaW5nIHRvIE1QQzUxMjFlIFJNLCBjb25maWd1cmluZyBsb2NhbCBhY2Nlc3Mgd2luZG93cyBzaG91bGQKKwkgKiBiZSBmb2xsb3dlZCBieSBhIGR1bW15IHJlYWQgb2YgdGhlIGNvbmZpZyByZWdpc3RlciB0aGF0IHdhcworCSAqIG1vZGlmaWVkIGxhc3QgYW5kIGFuIGlzeW5jCisJICovCisJbHd6CXI0LCBTUkFNQkFSKHIzKQorCWlzeW5jCisKKwkvKgorCSAqIFNldCBjb25maWd1cmF0aW9uIG9mIHRoZSBCb290L0NTMCwgdGhlIFNSQU0gd2luZG93IGRvZXMgbm90IGhhdmUgYQorCSAqIGNvbmZpZyByZWdpc3RlciBzbyBubyBwYXJhbXMgY2FuIGJlIHNldCBmb3IgaXQKKwkgKi8KKwlsaXMgICAgIHIzLCAoQ09ORklHX1NZU19JTU1SICsgTFBDX09GRlNFVClAaAorCW9yaSAgICAgcjMsIHIzLCAoQ09ORklHX1NZU19JTU1SICsgTFBDX09GRlNFVClAbAorCisJbGlzICAgICByNCwgQ09ORklHX1NZU19DUzBfQ0ZHQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19DUzBfQ0ZHQGwKKwlzdHcgICAgIHI0LCBDUzBfQ09ORklHKHIzKQorCisJLyogTWFzdGVyIGVuYWJsZSBhbGwgQ1MncyAqLworCWxpcwlyNCwgQ1NfQ1RSTF9NRUBoCisJb3JpCXI0LCByNCwgQ1NfQ1RSTF9NRUBsCisJc3R3CXI0LCBDU19DVFJMKHIzKQorCisJbGlzCXI0LCAoQ09ORklHX1NZU19NT05JVE9SX0JBU0UpQGgKKwlvcmkJcjQsIHI0LCAoQ09ORklHX1NZU19NT05JVE9SX0JBU0UpQGwKKwlhZGRpCXI1LCByNCwgaW5fZmxhc2ggLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCW10bHIJcjUKKwlibHIKKworaW5fZmxhc2g6CisJbGlzCXIxLCAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICsgQ09ORklHX1NZU19HQkxfREFUQV9PRkZTRVQpQGgKKwlvcmkJcjEsIHIxLCAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICsgQ09ORklHX1NZU19HQkxfREFUQV9PRkZTRVQpQGwKKworCWxpCXIwLCAwCQkvKiBNYWtlIHJvb20gZm9yIHN0YWNrIGZyYW1lIGhlYWRlciBhbmQJKi8KKwlzdHd1CXIwLCAtNChyMSkJLyogY2xlYXIgZmluYWwgc3RhY2sgZnJhbWUgc28gdGhhdAkqLworCXN0d3UJcjAsIC00KHIxKQkvKiBzdGFjayBiYWNrdHJhY2VzIHRlcm1pbmF0ZSBjbGVhbmx5CSovCisKKwkvKiBsZXQgdGhlIEMtY29kZSBzZXQgdXAgdGhlIHJlc3QJCQkqLworCS8qCQkJCQkJCSovCisJLyogQmUgY2FyZWZ1bCB0byBrZWVwIGNvZGUgcmVsb2NhdGFibGUgJiBzdGFjayBodW1ibGUJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlHRVRfR09UCQkJLyogaW5pdGlhbGl6ZSBHT1QgYWNjZXNzCSovCisKKwkvKiByMzogSU1NUiAqLworCWxpcwlyMywgQ09ORklHX1NZU19JTU1SQGgKKwkvKiBydW4gbG93LWxldmVsIENQVSBpbml0IGNvZGUgKGluIEZsYXNoKSAqLworCWJsCWNwdV9pbml0X2YKKworCS8qIHIzOiBCT09URkxBRyAqLworCW1yCXIzLCByMjEKKwkvKiBydW4gMXN0IHBhcnQgb2YgYm9hcmQgaW5pdCBjb2RlIChpbiBGbGFzaCkgKi8KKwlibAlib2FyZF9pbml0X2YKKworCS8qIE5PVFJFQUNIRUQgLSBib2FyZF9pbml0X2YoKSBkb2VzIG5vdCByZXR1cm4gKi8KKworLyoKKyAqIFRoaXMgY29kZSBmaW5pc2hlcyBzYXZpbmcgdGhlIHJlZ2lzdGVycyB0byB0aGUgZXhjZXB0aW9uIGZyYW1lCisgKiBhbmQganVtcHMgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBleGNlcHRpb24uCisgKiBSZWdpc3RlciByMjEgaXMgcG9pbnRlciBpbnRvIHRyYXAgZnJhbWUsIHIxIGhhcyBuZXcgc3RhY2sgcG9pbnRlci4KKyAqLworCS5nbG9ibAl0cmFuc2Zlcl90b19oYW5kbGVyCit0cmFuc2Zlcl90b19oYW5kbGVyOgorCXN0dwlyMjIsX05JUChyMjEpCisJbGlzCXIyMixNU1JfUE9XQGgKKwlhbmRjCXIyMyxyMjMscjIyCisJc3R3CXIyMyxfTVNSKHIyMSkKKwlTQVZFX0dQUig3LCByMjEpCisJU0FWRV80R1BSUyg4LCByMjEpCisJU0FWRV84R1BSUygxMiwgcjIxKQorCVNBVkVfOEdQUlMoMjQsIHIyMSkKKwltZmxyCXIyMworCWFuZGkuCXIyNCxyMjMsMHgzZjAwCQkvKiBnZXQgdmVjdG9yIG9mZnNldCAqLworCXN0dwlyMjQsVFJBUChyMjEpCisJbGkJcjIyLDAKKwlzdHcJcjIyLFJFU1VMVChyMjEpCisJbHd6CXIyNCwwKHIyMykJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBoYW5kbGVyICovCisJbHd6CXIyMyw0KHIyMykJCS8qIHdoZXJlIHRvIGdvIHdoZW4gZG9uZSAqLworCW10c3ByCVNSUjAscjI0CisJbXRzcHIJU1JSMSxyMjAKKwltdGxyCXIyMworCVNZTkMKKwlyZmkJCQkJLyoganVtcCB0byBoYW5kbGVyLCBlbmFibGUgTU1VICovCisKK2ludF9yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1JSMCxyMgorCW10c3ByCVNSUjEscjAKKwlsd3oJcjAsR1BSMChyMSkKKwlsd3oJcjIsR1BSMihyMSkKKwlsd3oJcjEsR1BSMShyMSkKKwlTWU5DCisJcmZpCisKKy8qCisgKiBUaGlzIGNvZGUgaW5pdGlhbGlzZXMgdGhlIG1hY2hpbmUsIGl0IGV4cGVjdHMgb3JpZ2luYWwgTVNSIGNvbnRlbnRzIHRvIGJlIGluIHI1LgorICovCitjcHVfZWFybHlfaW5pdDoKKwkvKiBJbml0aWFsaXplIG1hY2hpbmUgc3RhdHVzOyBlbmFibGUgbWFjaGluZSBjaGVjayBpbnRlcnJ1cHQgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpCXIzLCBNU1JfS0VSTkVMCQkJLyogU2V0IE1FIGFuZCBSSSBmbGFncyAqLworCXJsd2ltaQlyMywgcjUsIDAsIDI1LCAyNQkJLyogcHJlc2VydmUgSVAgYml0ICovCisjaWZkZWYgREVCVUcKKwlybHdpbWkJcjMsIHI1LCAwLCAyMSwgMjIJCS8qIGRlYnVnZ2VyIG1pZ2h0IHNldCBTRSwgQkUgYml0cyAqLworI2VuZGlmCisJbXRtc3IJcjMKKwlTWU5DCisJbXRzcHIJU1JSMSwgcjMJCQkvKiBNaXJyb3IgY3VycmVudCBNU1Igc3RhdGUgaW4gU1JSMSAqLworCisJbGlzCXIzLCBDT05GSUdfU1lTX0lNTVJAaAorCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisJLyogSW5pdGlhbGlzZSB0aGUgd2F0Y2hkb2cgYW5kIHJlc2V0IGl0ICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGlzIHI0LCBDT05GSUdfU1lTX1dBVENIRE9HX1ZBTFVFCisJb3JpIHI0LCByNCwgKFNXQ1JSX1NXRU4gfCBTV0NSUl9TV1JJIHwgU1dDUlJfU1dQUikKKwlzdHcgcjQsIFNXQ1JSKHIzKQorCisJLyogcmVzZXQgKi8KKwlsaQlyNCwgMHg1NTZDCisJc3RoCXI0LCBTV1NSUkBsKHIzKQorCWxpCXI0LCAweDAKKwlvcmkJcjQsIHI0LCAweEFBMzkKKwlzdGgJcjQsIFNXU1JSQGwocjMpCisjZWxzZQorCS8qIERpc2FibGUgdGhlIHdhdGNoZG9nICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsd3ogcjQsIFNXQ1JSKHIzKQorCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIGl0J3MgZW5hYmxlZCBmb3IgZGlzYWJsaW5nOiBvbmNlIGRpc2FibGVkIGJ5IHMvdworCSAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHJlLWVuYWJsZSBpdAorCSAqLworCWFuZGkuIHI0LCByNCwgMHg0CisJYmVxIDFmCisJeG9yIHI0LCByNCwgcjQKKwlzdHcgcjQsIFNXQ1JSKHIzKQorMToKKyNlbmRpZiAvKiBDT05GSUdfV0FUQ0hET0cgKi8KKworCS8qIEluaXRpYWxpemUgdGhlIEhhcmR3YXJlIEltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBSZWdpc3RlcnMgKi8KKwkvKiBISUQwIGFsc28gY29udGFpbnMgY2FjaGUgY29udHJvbAkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpcwlyMywgQ09ORklHX1NZU19ISUQwX0lOSVRAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSElEMF9JTklUQGwKKwlTWU5DCisJbXRzcHIJSElEMCwgcjMKKworCWxpcwlyMywgQ09ORklHX1NZU19ISUQwX0ZJTkFMQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0hJRDBfRklOQUxAbAorCVNZTkMKKwltdHNwcglISUQwLCByMworCisJbGlzCXIzLCBDT05GSUdfU1lTX0hJRDJAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSElEMkBsCisJU1lOQworCW10c3ByCUhJRDIsIHIzCisJc3luYworCWJscgorCisKKy8qIENhY2hlIGZ1bmN0aW9ucy4KKyAqCisgKiBOb3RlOiByZXF1aXJlcyB0aGF0IGFsbCBjYWNoZSBiaXRzIGluCisgKiBISUQwIGFyZSBpbiB0aGUgbG93IGhhbGYgd29yZC4KKyAqLworCS5nbG9ibAlpY2FjaGVfZW5hYmxlCitpY2FjaGVfZW5hYmxlOgorCW1mc3ByCXIzLCBISUQwCisJb3JpCXIzLCByMywgSElEMF9JQ0UKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0lMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9JQ0ZJCisJaXN5bmMKKwltdHNwcglISUQwLCByNCAgICAvKiBzZXRzIGVuYWJsZSBhbmQgaW52YWxpZGF0ZSwgY2xlYXJzIGxvY2sgKi8KKwlpc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX2Rpc2FibGUKK2ljYWNoZV9kaXNhYmxlOgorCW1mc3ByCXIzLCBISUQwCisJbGlzCXI0LCAwCisJb3JpCXI0LCByNCwgSElEMF9JQ0V8SElEMF9JTE9DSworCWFuZGMJcjMsIHIzLCByNAorCW9yaQlyNCwgcjMsIEhJRDBfSUNGSQorCWlzeW5jCisJbXRzcHIJSElEMCwgcjQgICAgIC8qIHNldHMgaW52YWxpZGF0ZSwgY2xlYXJzIGVuYWJsZSBhbmQgbG9jayovCisJaXN5bmMKKwltdHNwcglISUQwLCByMwkvKiBjbGVhcnMgaW52YWxpZGF0ZSAqLworCWJscgorCisJLmdsb2JsCWljYWNoZV9zdGF0dXMKK2ljYWNoZV9zdGF0dXM6CisJbWZzcHIJcjMsIEhJRDAKKwlybHdpbm0JcjMsIHIzLCAoMzEgLSBISUQwX0lDRV9TSElGVCArIDEpLCAzMSwgMzEKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZW5hYmxlCitkY2FjaGVfZW5hYmxlOgorCW1mc3ByCXIzLCBISUQwCisJbGkJcjUsIEhJRDBfRENGSXxISUQwX0RMT0NLCisJYW5kYwlyMywgcjMsIHI1CisJbXRzcHIJSElEMCwgcjMJCS8qIG5vIGludmFsaWRhdGUsIHVubG9jayAqLworCW9yaQlyMywgcjMsIEhJRDBfRENFCisJb3JpCXI1LCByMywgSElEMF9EQ0ZJCisJbXRzcHIJSElEMCwgcjUJCS8qIGVuYWJsZSArIGludmFsaWRhdGUgKi8KKwltdHNwcglISUQwLCByMwkJLyogZW5hYmxlICovCisJc3luYworCWJscgorCisJLmdsb2JsCWRjYWNoZV9kaXNhYmxlCitkY2FjaGVfZGlzYWJsZToKKwltZnNwcglyMywgSElEMAorCWxpcwlyNCwgMAorCW9yaQlyNCwgcjQsIEhJRDBfRENFfEhJRDBfRExPQ0sKKwlhbmRjCXIzLCByMywgcjQKKwlvcmkJcjQsIHIzLCBISUQwX0RDSQorCXN5bmMKKwltdHNwcglISUQwLCByNAkvKiBzZXRzIGludmFsaWRhdGUsIGNsZWFycyBlbmFibGUgYW5kIGxvY2sgKi8KKwlzeW5jCisJbXRzcHIJSElEMCwgcjMJLyogY2xlYXJzIGludmFsaWRhdGUgKi8KKwlibHIKKworCS5nbG9ibAlkY2FjaGVfc3RhdHVzCitkY2FjaGVfc3RhdHVzOgorCW1mc3ByCXIzLCBISUQwCisJcmx3aW5tCXIzLCByMywgKDMxIC0gSElEMF9EQ0VfU0hJRlQgKyAxKSwgMzEsIDMxCisJYmxyCisKKwkuZ2xvYmwgZ2V0X3B2cgorZ2V0X3B2cjoKKwltZnNwcglyMywgUFZSCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiB2b2lkIHJlbG9jYXRlX2NvZGUgKGFkZHJfc3AsIGdkLCBhZGRyX21vbmkpCisgKgorICogVGhpcyAiZnVuY3Rpb24iIGRvZXMgbm90IHJldHVybiwgaW5zdGVhZCBpdCBjb250aW51ZXMgaW4gUkFNCisgKiBhZnRlciByZWxvY2F0aW5nIHRoZSBtb25pdG9yIGNvZGUuCisgKgorICogcjMgPSBkZXN0CisgKiByNCA9IHNyYworICogcjUgPSBsZW5ndGggaW4gYnl0ZXMKKyAqIHI2ID0gY2FjaGVsaW5lc2l6ZQorICovCisJLmdsb2JsCXJlbG9jYXRlX2NvZGUKK3JlbG9jYXRlX2NvZGU6CisJbXIJcjEsICByMwkJLyogU2V0IG5ldyBzdGFjayBwb2ludGVyCSovCisJbXIJcjksICByNAkJLyogU2F2ZSBjb3B5IG9mIEdsb2JhbCBEYXRhIHBvaW50ZXIgKi8KKwltcglyMTAsIHI1CQkvKiBTYXZlIGNvcHkgb2YgRGVzdGluYXRpb24gQWRkcmVzcyAqLworCisJR0VUX0dPVAorCW1yCXIzLCAgcjUJCQkJLyogRGVzdGluYXRpb24gQWRkcmVzcyAqLworCWxpcwlyNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAaAkJLyogU291cmNlICAgICAgQWRkcmVzcyAqLworCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGwKKwlsd3oJcjUsIEdPVChfX2luaXRfZW5kKQorCXN1YglyNSwgcjUsIHI0CisJbGkJcjYsIENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUJCS8qIENhY2hlIExpbmUgU2l6ZSAqLworCisJLyoKKwkgKiBGaXggR09UIHBvaW50ZXI6CisJICoKKwkgKiBOZXcgR09ULVBUUiA9IChvbGQgR09ULVBUUiAtIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFKQorCSAqCQkrIERlc3RpbmF0aW9uIEFkZHJlc3MKKwkgKgorCSAqIE9mZnNldDoKKwkgKi8KKwlzdWIJcjE1LCByMTAsIHI0CisKKwkvKiBGaXJzdCBvdXIgb3duIEdPVCAqLworCWFkZAlyMTIsIHIxMiwgcjE1CisJLyogdGhlbiB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLworCWFkZAlyMzAsIHIzMCwgcjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisJY21wbHcJY3IxLHIzLHI0CisJYWRkaQlyMCxyNSwzCisJc3J3aS4JcjAscjAsMgorCWJlcQljcjEsNGYJCS8qIEluIHBsYWNlIGNvcHkgaXMgbm90IG5lY2Vzc2FyeSAqLworCWJlcQk3ZgkJLyogUHJvdGVjdCBhZ2FpbnN0IDAgY291bnQJICAqLworCW10Y3RyCXIwCisJYmdlCWNyMSwyZgorCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorCisJLyogY29weSAqLworMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJbXRjdHIJcjAKKwlsYQlyOCwtNChyNCkKKwlsYQlyNywtNChyMykKKworCS8qIGFuZCBjb21wYXJlICovCisyMDoJbHd6dQlyMjAsNChyOCkKKwlsd3p1CXIyMSw0KHI3KQorCXhvci4gcjIyLCByMjAsIHIyMQorCWJuZSAgMzBmCisJYmRuegkyMGIKKwliIDRmCisKKwkvKiBjb21wYXJlIGZhaWxlZCAqLworMzA6CWxpIHIzLCAwCisJYmxyCisKKzI6CXNsd2kJcjAscjAsMiAvKiByZSBjb3B5IGluIHJldmVyc2Ugb3JkZXIgLi4uIHkgZG8gd2UgbmVlZGVkIGl0PyAqLworCWFkZAlyOCxyNCxyMAorCWFkZAlyNyxyMyxyMAorMzoJbHd6dQlyMCwtNChyOCkKKwlzdHd1CXIwLC00KHI3KQorCWJkbnoJM2IKKworLyoKKyAqIE5vdyBmbHVzaCB0aGUgY2FjaGU6IG5vdGUgdGhhdCB3ZSBtdXN0IHN0YXJ0IGZyb20gYSBjYWNoZSBhbGlnbmVkCisgKiBhZGRyZXNzLiBPdGhlcndpc2Ugd2UgbWlnaHQgbWlzcyBvbmUgY2FjaGUgbGluZS4KKyAqLworNDoJY21wd2kJcjYsMAorCWFkZAlyNSxyMyxyNQorCWJlcQk3ZgkJLyogQWx3YXlzIGZsdXNoIHByZWZldGNoIHF1ZXVlIGluIGFueSBjYXNlICovCisJc3ViaQlyMCxyNiwxCisJYW5kYwlyMyxyMyxyMAorCW1yCXI0LHIzCis1OglkY2JzdAkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNWIKKwlzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGRjYnN0IHRvIGNvbXBsZXRlIG9uIGJ1cyAqLworCW1yCXI0LHIzCis2OglpY2JpCTAscjQKKwlhZGQJcjQscjQscjYKKwljbXBsdwlyNCxyNQorCWJsdAk2YgorNzoJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBpY2JpIHRvIGNvbXBsZXRlIG9uIGJ1cwkqLworCWlzeW5jCisKKy8qCisgKiBXZSBhcmUgZG9uZS4gRG8gbm90IHJldHVybiwgaW5zdGVhZCBicmFuY2ggdG8gc2Vjb25kIHBhcnQgb2YgYm9hcmQKKyAqIGluaXRpYWxpemF0aW9uLCBub3cgcnVubmluZyBmcm9tIFJBTS4KKyAqLworCWFkZGkJcjAsIHIxMCwgaW5fcmFtIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwltdGxyCXIwCisJYmxyCisKK2luX3JhbToKKwkvKgorCSAqIFJlbG9jYXRpb24gRnVuY3Rpb24sIHIxMiBwb2ludCB0byBnb3QyKzB4ODAwMAorCSAqCisJICogQWRqdXN0IGdvdDIgcG9pbnRlcnMsIG5vIG5lZWQgdG8gY2hlY2sgZm9yIDAsIHRoaXMgY29kZQorCSAqIGFscmVhZHkgcHV0cyBhIGZldyBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKwkgKi8KKwlsaQlyMCxfX2dvdDJfZW50cmllc0BzZWN0b2ZmQGwKKwlsYQlyMyxHT1QoX0dPVDJfVEFCTEVfKQorCWx3eglyMTEsR09UKF9HT1QyX1RBQkxFXykKKwltdGN0cglyMAorCXN1YglyMTEscjMscjExCisJYWRkaQlyMyxyMywtNAorMToJbHd6dQlyMCw0KHIzKQorCWNtcHdpCXIwLDAKKwliZXEtCTJmCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMCwwKHIzKQorMjoJYmRuegkxYgorCisJLyoKKwkgKiBOb3cgYWRqdXN0IHRoZSBmaXh1cHMgYW5kIHRoZSBwb2ludGVycyB0byB0aGUgZml4dXBzCisJICogaW4gY2FzZSB3ZSBuZWVkIHRvIG1vdmUgb3Vyc2VsdmVzIGFnYWluLgorCSAqLworCWxpCXIwLF9fZml4dXBfZW50cmllc0BzZWN0b2ZmQGwKKwlsd3oJcjMsR09UKF9GSVhVUF9UQUJMRV8pCisJY21wd2kJcjAsMAorCW10Y3RyCXIwCisJYWRkaQlyMyxyMywtNAorCWJlcQk0ZgorMzoJbHd6dQlyNCw0KHIzKQorCWx3enV4CXIwLHI0LHIxMQorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjEwLDAocjMpCisJc3R3CXIwLDAocjQpCisJYmRuegkzYgorNDoKK2NsZWFyX2JzczoKKwkvKgorCSAqIE5vdyBjbGVhciBCU1Mgc2VnbWVudAorCSAqLworCWx3eglyMyxHT1QoX19ic3Nfc3RhcnQpCisJbHd6CXI0LEdPVChfZW5kKQorCisJY21wbHcJMCwgcjMsIHI0CisJYmVxCTZmCisKKwlsaQlyMCwgMAorNToKKwlzdHcJcjAsIDAocjMpCisJYWRkaQlyMywgcjMsIDQKKwljbXBsdwkwLCByMywgcjQKKwlibmUJNWIKKzY6CisJbXIJcjMsIHI5CQkvKiBHbG9iYWwgRGF0YSBwb2ludGVyCQkqLworCW1yCXI0LCByMTAJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJCSovCisJYmwJYm9hcmRfaW5pdF9yCisKKwkvKgorCSAqIENvcHkgZXhjZXB0aW9uIHZlY3RvciBjb2RlIHRvIGxvdyBtZW1vcnkKKwkgKgorCSAqIHIzOiBkZXN0X2FkZHIKKwkgKiByNzogc291cmNlIGFkZHJlc3MsIHI4OiBlbmQgYWRkcmVzcywgcjk6IHRhcmdldCBhZGRyZXNzCisJICovCisJLmdsb2JsCXRyYXBfaW5pdAordHJhcF9pbml0OgorCW1mbHIJcjQJCS8qIHNhdmUgbGluayByZWdpc3RlciAqLworCUdFVF9HT1QKKwlsd3oJcjcsIEdPVChfc3RhcnQpCisJbHd6CXI4LCBHT1QoX2VuZF9vZl92ZWN0b3JzKQorCisJbGkJcjksIDB4MTAwCS8qIHJlc2V0IHZlY3RvciBhdCAweDEwMCAqLworCisJY21wbHcJMCwgcjcsIHI4CisJYmdlbHIJCQkvKiByZXR1cm4gaWYgcjc+PXI4IC0ganVzdCBpbiBjYXNlICovCisxOgorCWx3eglyMCwgMChyNykKKwlzdHcJcjAsIDAocjkpCisJYWRkaQlyNywgcjcsIDQKKwlhZGRpCXI5LCByOSwgNAorCWNtcGx3CTAsIHI3LCByOAorCWJuZQkxYgorCisJLyoKKwkgKiByZWxvY2F0ZSBgaGRscicgYW5kIGBpbnRfcmV0dXJuJyBlbnRyaWVzCisJICovCisJbGkJcjcsIC5MX01hY2hpbmVDaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIEFsaWdubWVudCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisyOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvciAqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkyYgorCisJbGkJcjcsIC5MX0FsaWdubWVudCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJYmwJdHJhcF9yZWxvYworCisJbGkJcjcsIC5MX1Byb2dyYW1DaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJYmwJdHJhcF9yZWxvYworCisJbGkJcjcsIC5MX0ZQVW5hdmFpbGFibGUgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBTeXN0ZW1DYWxsIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzM6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yICovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTNiCisKKwlsaQlyNywgLkxfVHJhY2UgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorNDoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IgKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJNGIKKworCW1mbXNyCXIzCQkJLyogbm93IHRoYXQgdGhlIHZlY3RvcnMgaGF2ZSAqLworCWxpcwlyNywgTVNSX0lQQGgJCS8qIHJlbG9jYXRlZCBpbnRvIGxvdyBtZW1vcnkgKi8KKwlvcmkJcjcsIHI3LCBNU1JfSVBAbAkvKiBNU1JbSVBdIGNhbiBiZSB0dXJuZWQgb2ZmICovCisJYW5kYwlyMywgcjMsIHI3CQkvKiAoaWYgaXQgd2FzIG9uKSAqLworCVNZTkMJCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjMKKwlTWU5DCisKKwltdGxyCXI0CQkJLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyICAgICovCisJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNTEyeC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmY0YTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvdHJhcHMuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCAtIDIwMDcKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgIEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUgTVBDODN4eCBjb2RlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBoYXJkd2FyZQorICogZXhjZXB0aW9ucworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxrZ2RiLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nKTsKKworLyoKKyAqIEVuZCBvZiBhZGRyZXNzYWJsZSBtZW1vcnkuICBUaGlzIG1heSBiZSBsZXNzIHRoYW4gdGhlIGFjdHVhbAorICogYW1vdW50IG9mIG1lbW9yeSBvbiB0aGUgc3lzdGVtIGlmIHdlJ3JlIHVuYWJsZSB0byBrZWVwIGFsbAorICogdGhlIG1lbW9yeSBtYXBwZWQgaW4uCisgKi8KK2V4dGVybiB1bG9uZyBnZXRfZWZmZWN0aXZlX21lbXNpemUodm9pZCk7CisjZGVmaW5lIEVORF9PRl9NRU0gKGdkLT5iZC0+YmlfbWVtc3RhcnQgKyBnZXRfZWZmZWN0aXZlX21lbXNpemUoKSkKKworLyoKKyAqIFRyYXAgJiBFeGNlcHRpb24gc3VwcG9ydAorICovCisKK3ZvaWQKK3ByaW50X2JhY2t0cmFjZSAodW5zaWduZWQgbG9uZyAqc3ApCit7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHV0cyAoIkNhbGwgYmFja3RyYWNlOiAiKTsKKwl3aGlsZSAoc3ApIHsKKwkJaWYgKCh1aW50KXNwID4gRU5EX09GX01FTSkKKwkJCWJyZWFrOworCisJCWkgPSBzcFsxXTsKKwkJaWYgKGNudCsrICUgNyA9PSAwKQorCQkJcHV0YyAoJ1xuJyk7CisJCXByaW50ZiAoIiUwOGxYICIsIGkpOworCQlpZiAoY250ID4gMzIpIGJyZWFrOworCQlzcCA9ICh1bnNpZ25lZCBsb25nICopICpzcDsKKwl9CisJcHV0YyAoJ1xuJyk7Cit9CisKK3ZvaWQgc2hvd19yZWdzIChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGk7CisKKwlwcmludGYgKCJOSVA6ICUwOGxYIFhFUjogJTA4bFggTFI6ICUwOGxYIFJFR1M6ICVwIFRSQVA6ICUwNGx4IERBUjogJTA4bFhcbiIsCisJICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+eGVyLCByZWdzLT5saW5rLCByZWdzLCByZWdzLT50cmFwLCByZWdzLT5kYXIpOworCXByaW50ZiAoIk1TUjogJTA4bHggRUU6ICUwMXggUFI6ICUwMXggRlA6ICUwMXggTUU6ICUwMXggSVIvRFI6ICUwMXglMDF4XG4iLAorCSAgICAgICByZWdzLT5tc3IsIHJlZ3MtPm1zciAmIE1TUl9FRSA/IDEgOiAwLCByZWdzLT5tc3IgJiBNU1JfUFIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyICYgTVNSX0ZQID8gMSA6IDAscmVncy0+bXNyICYgTVNSX01FID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciAmIE1TUl9JUiA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3IgJiBNU1JfRFIgPyAxIDogMCk7CisKKwlwdXRjICgnXG4nKTsKKwlmb3IgKGkgPSAwOyAgaSA8IDMyOyAgaSsrKSB7CisJCWlmICgoaSAlIDgpID09IDApIHsKKwkJCXByaW50ZiAoIkdQUiUwMmQ6ICIsIGkpOworCQl9CisKKwkJcHJpbnRmICgiJTA4bFggIiwgcmVncy0+Z3ByW2ldKTsKKwkJaWYgKChpICUgOCkgPT0gNykgeworCQkJcHV0YyAoJ1xuJyk7CisJCX0KKwl9Cit9CisKKwordm9pZAorX2V4Y2VwdGlvbiAoaW50IHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaG93X3JlZ3MgKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSAoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljICgiRXhjZXB0aW9uIGF0IHBjICVseCBzaWduYWwgJWQiLCByZWdzLT5uaXAsc2lnbnIpOworfQorCisKK3ZvaWQKK01hY2hpbmVDaGVja0V4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmaXh1cDsKKworCWlmICgoZml4dXAgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlIChyZWdzLT5uaXApKSAhPSAwKSB7CisJCXJlZ3MtPm5pcCA9IGZpeHVwOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXB1dHMgKCJNYWNoaW5lIGNoZWNrLlxuQ2F1c2VkIGJ5IChmcm9tIG1zcik6ICIpOworCXByaW50ZiAoInJlZ3MgJXAgIixyZWdzKTsKKwlzd2l0Y2ggKHJlZ3MtPm1zciAmIDB4MDBGRjAwMDApIHsKKwljYXNlICgweDgwMDAwMDAwID4+IDEwKToKKwkJcHV0cyAoIkluc3RydWN0aW9uIGNhY2hlIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDExKToKKwkJcHV0cyAoIkRhdGEgY2FjaGUgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDAgPj4gMTIpOgorCQlwdXRzICgiTWFjaGluZSBjaGVjayBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDEzKToKKwkJcHV0cyAoIlRyYW5zZmVyIGVycm9yIGFjayBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDE0KToKKwkJcHV0cyAoIkRhdGEgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDAgPj4gMTUpOgorCQlwdXRzICgiQWRkcmVzcyBwYXJpdHkgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHV0cyAoIlVua25vd24gdmFsdWVzIGluIG1zclxuIik7CisJfQorCXNob3dfcmVncyAocmVncyk7CisJcHJpbnRfYmFja3RyYWNlICgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisKKwlwYW5pYyAoIm1hY2hpbmUgY2hlY2siKTsKK30KKwordm9pZAorQWxpZ25tZW50RXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZmRlZiBDT05GSUdfQ01EX0tHREIKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyAocmVncyk7CisJcHJpbnRfYmFja3RyYWNlICgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMgKCJBbGlnbm1lbnQgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQKK1Byb2dyYW1DaGVja0V4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MgKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSAoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljICgiUHJvZ3JhbSBDaGVjayBFeGNlcHRpb24iKTsKK30KKwordm9pZAorU29mdEVtdUV4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWZkZWYgQ09ORklHX0NNRF9LR0RCCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MgKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSAoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljICgiU29mdHdhcmUgRW11bGF0aW9uIEV4Y2VwdGlvbiIpOworfQorCisKK3ZvaWQKK1Vua25vd25FeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19DTURfS0dEQgorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJcHJpbnRmICgiQmFkIHRyYXAgYXQgUEM6ICVseCwgU1I6ICVseCwgdmVjdG9yPSVseFxuIiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOworCV9leGNlcHRpb24gKDAsIHJlZ3MpOworfQorCisjaWZkZWYgQ09ORklHX0NNRF9CRURCVUcKK2V4dGVybiB2b2lkIGRvX2JlZGJ1Z19icmVha3BvaW50IChzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZgorCit2b2lkCitEZWJ1Z0V4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJpbnRmICgiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwICk7CisJc2hvd19yZWdzIChyZWdzKTsKKyNpZmRlZiBDT05GSUdfQ01EX0JFREJVRworCWRvX2JlZGJ1Z19icmVha3BvaW50IChyZWdzKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L3UtYm9vdC5sZHMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE2Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1MTJ4L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKQl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBhcmNoL3Bvd2VycGMvY3B1L21wYzUxMngvc3RhcnQubwkoLnRleHQpCisgICAgKigudGV4dCkKKyAgICAqKC5nb3QxKQorICAgIC4gPSBBTElHTigxNik7CisgICAgKiguZWhfZnJhbWUpCisgICAgKihTT1JUX0JZX0FMSUdOTUVOVChTT1JUX0JZX05BTUUoLnJvZGF0YSopKSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAoTk9MT0FEKSAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC4gPSBBTElHTig0KTsKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQorRU5UUlkoX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGM1MzIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvTWFrZWZpbGUKQEAgLTAsMCArMSw1OSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgKEMpIENvcHlyaWdodCAyMDAzCisjIE1hcnRpbiBXaW5pc3RvZXJmZXIsIG1hcnRpbndpbmlzdG9lcmZlckBnbXguY2guCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMKKyMgRmlsZToJCQlhcmNoL3Bvd2VycGMvY3B1L21wYzV4eC9NYWtlZmlsZQorIworIyBEaXNjcmlwdGlvbjoJCU1ha2VmaWxlIHRvIGJ1aWxkIG1wYzV4eCBjcHUgY29uZmlndXJhdGlvbi4KKyMJCQlXaWxsIGluY2x1ZGUgdG9wIGNvbmZpZy5tayB3aGljaCBpdHNlbGZzCisjCQkJdXNlcyB0aGUgZGVmaW5pdGlvbnMgbWFkZSBpbiBhcmNoL3Bvd2VycGMvY3B1L21wYzV4eC9jb25maWcubWsKKyMKKworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitDT0JKUwk9IHNlcmlhbC5vIGNwdS5vIGNwdV9pbml0Lm8gaW50ZXJydXB0cy5vIHRyYXBzLm8gc3BlZWQubyBzcGkubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L2NvbmZpZy5tayBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjkyODVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAzCisjIE1hcnRpbiBXaW5pc3RvZXJmZXIsIG1hcnRpbndpbmlzdG9lcmZlckBnbXguY2guCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMKKyMgRmlsZToJCQljb25maWcubWsKKyMKKyMgRGlzY3JpcHRpb246CQljb21waWxlciBmbGFncyBhbmQgbWFrZSBkZWZpbml0aW9ucworIworCisKK1BMQVRGT1JNX1JFTEZMQUdTICs9CS1mUElDIC1tZWFiaQorCitQTEFURk9STV9DUFBGTEFHUyArPQktRENPTkZJR181eHggLWZmaXhlZC1yMiAtbXBvd2VycGMgLW1zb2Z0LWZsb2F0CisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L2NwdS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmZmViYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L2NwdS5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzCisgKiBNYXJ0aW4gV2luaXN0b2VyZmVyLCBtYXJ0aW53aW5pc3RvZXJmZXJAZ214LmNoLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sCisgKi8KKworLyoKKyAqIEZpbGU6CQljcHUuYworICoKKyAqIERpc2NyaXB0aW9uOgkJU29tZSBjcHUgc3BlY2lmaWMgZnVuY3Rpb24gZm9yIHdhdGNoZG9nLAorICogICAgICAgICAgICAgICAgICAgICAgY3B1IHZlcnNpb24gdGVzdCwgY2xvY2sgc2V0dGluZyAuLi4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bXBjNXh4Lmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgKGRlZmluZWQoQ09ORklHX01QQzU1NSkpCisjICBkZWZpbmUJSURfU1RSCSJNUEM1NTUvNTU2IgorCisvKgorICogQ2hlY2sgdmVyc2lvbiBvZiBjcHUgd2l0aCBQcm9jZXNzb3IgVmVyc2lvbiBSZWdpc3RlciAoUFZSKQorICovCitzdGF0aWMgaW50IGNoZWNrX2NwdV92ZXJzaW9uIChsb25nIGNsb2NrLCB1aW50IHB2ciwgdWludCBpbW1yKQoreworICAgIGNoYXIgYnVmWzMyXTsKKwkvKiBUaGUgaGlnaGVzdCAxNiBiaXRzIHNob3VsZCBiZSAweDAwMDIgZm9yIGEgTVBDNTU1LzU1NiAqLworCWlmICgocHZyID4+IDE2KSA9PSAweDAwMDIpIHsKKwkJcHJpbnRmICgiICIgSURfU1RSICIgVmVyc2lvbiAleCIsIChwdnIgPj4gMTYpKTsKKwkJcHJpbnRmICgiIGF0ICVzIE1IejoiLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJOb3Qgc3VwcG9ydGVkIGNwdSB2ZXJzaW9uIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX01QQzU1NSAqLworCisKKy8qCisgKiBDaGVjayB2ZXJzaW9uIG9mIG1wYzV4eAorICovCitpbnQgY2hlY2tjcHUgKHZvaWQpCit7CisJdWxvbmcgY2xvY2sgPSBnZC0+Y3B1X2NsazsKKwl1aW50IGltbXIgPSBnZXRfaW1tciAoMCk7CS8qIFJldHVybiBmdWxsIElNTVIgY29udGVudHMgKi8KKwl1aW50IHB2ciA9IGdldF9wdnIgKCk7CQkvKiBSZXRyaWV2ZSBQVlIgcmVnaXN0ZXIgKi8KKworCXB1dHMgKCJDUFU6ICAgIik7CisKKwlyZXR1cm4gY2hlY2tfY3B1X3ZlcnNpb24gKGNsb2NrLCBwdnIsIGltbXIpOworfQorCisvKgorICogQ2FsbGVkIGJ5IG1hY3JvIFdBVENIRE9HX1JFU0VUCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKK3ZvaWQgd2F0Y2hkb2dfcmVzZXQgKHZvaWQpCit7CisJaW50IHJlX2VuYWJsZSA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCXJlc2V0XzV4eF93YXRjaGRvZyAoKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SKTsKKwlpZiAocmVfZW5hYmxlKQorCQllbmFibGVfaW50ZXJydXB0cyAoKTsKK30KKworLyoKKyAqIFdpbGwgY2xlYXIgc29mdHdhcmUgcmVzZXQKKyAqLwordm9pZCByZXNldF81eHhfd2F0Y2hkb2cgKHZvbGF0aWxlIGltbWFwX3QgKiBpbW1yKQoreworCS8qIFVzZSB0aGUgTVBDNXh4IEludGVybmFsIFdhdGNoZG9nICovCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc3dzciA9IDB4NTU2YzsJLyogUHJldmVudCBTVyB0aW1lLW91dCAqLworCWltbXItPmltX3NpdV9jb25mLnNjX3N3c3IgPSAweGFhMzk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfV0FUQ0hET0cgKi8KKworCisvKgorICogR2V0IHRpbWViYXNlIGNsb2NrIGZyZXF1ZW5jeQorICovCit1bnNpZ25lZCBsb25nIGdldF90YmNsayAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKHZvbGF0aWxlIGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXVsb25nIG9zY2NsaywgZmFjdG9yOworCisJaWYgKGltbXItPmltX2Nsa3JzdC5jYXJfc2NjciAmIFNDQ1JfVEJTKSB7CisJCXJldHVybiAoZ2QtPmNwdV9jbGsgLyAxNik7CisJfQorCisJZmFjdG9yID0gKCgoQ09ORklHX1NZU19QTFBSQ1IpICYgUExQUkNSX01GX01TSykgPj4gUExQUkNSX01GX1NISUZUKSArIDE7CisKKwlvc2NjbGsgPSBnZC0+Y3B1X2NsayAvIGZhY3RvcjsKKworCWlmICgoaW1tci0+aW1fY2xrcnN0LmNhcl9zY2NyICYgU0NDUl9SVFNFTCkgPT0gMCB8fCBmYWN0b3IgPiAyKSB7CisJCXJldHVybiAob3NjY2xrIC8gNCk7CisJfQorCXJldHVybiAob3NjY2xrIC8gMTYpOworfQorCit2b2lkIGRjYWNoZV9lbmFibGUgKHZvaWQpCit7CisJcmV0dXJuOworfQorCit2b2lkIGRjYWNoZV9kaXNhYmxlICh2b2lkKQoreworCXJldHVybjsKK30KKworaW50IGRjYWNoZV9zdGF0dXMgKHZvaWQpCit7CisJcmV0dXJuIDA7CS8qIGFsd2F5cyBvZmYgKi8KK30KKworLyoKKyAqIFJlc2V0IGJvYXJkCisgKi8KK2ludCBkb19yZXNldCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworI2lmIGRlZmluZWQoQ09ORklHX1BBVEkpCisJdm9sYXRpbGUgdWxvbmcgKmFkZHIgPSAodWxvbmcgKikgQ09ORklHX1NZU19SRVNFVF9BRERSRVNTOworCSphZGRyID0gMTsKKyNlbHNlCisJdWxvbmcgYWRkcjsKKworCS8qIEludGVycnVwdHMgb2ZmLCBlbmFibGUgcmVzZXQgKi8KKwlfX2FzbV9fIHZvbGF0aWxlCSgiICBtdHNwcgk4MSwgJXIwCQlcblx0IgorCQkJCSAiICBtZm1zcgklcjMJCVxuXHQiCisJCQkJICIgIHJsd2lubQklcjMxLCVyMywwLDI1LDIzXG5cdCIKKwkJCQkgIiAgbXRtc3IJJXIzMQkJXG5cdCIpOworCS8qCisJICogVHJ5aW5nIHRvIGV4ZWN1dGUgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gYXQgYSBub24tZXhpc3RpbmcgYWRkcmVzcworCSAqIHNob3VsZCBjYXVzZSBhIG1hY2hpbmUgY2hlY2ssIHJlc3VsdGluZyBpbiByZXNldAorCSAqLworI2lmZGVmIENPTkZJR19TWVNfUkVTRVRfQUREUkVTUworCWFkZHIgPSBDT05GSUdfU1lTX1JFU0VUX0FERFJFU1M7CisjZWxzZQorCS8qCisJICogbm90ZTogd2hlbiBDT05GSUdfU1lTX01PTklUT1JfQkFTRSBwb2ludHMgdG8gYSBSQU0gYWRkcmVzcywgQ09ORklHX1NZU19NT05JVE9SX0JBU0UgICAgICAgICAqIC0gc2l6ZW9mICh1bG9uZykgaXMgdXN1YWxseSBhIHZhbGlkIGFkZHJlc3MuIEJldHRlciBwaWNrIGFuIGFkZHJlc3MKKwkgKiBrbm93biB0byBiZSBpbnZhbGlkIG9uIHlvdXIgc3lzdGVtIGFuZCBhc3NpZ24gaXQgdG8gQ09ORklHX1NZU19SRVNFVF9BRERSRVNTLgorCSAqICIodWxvbmcpLTEiIHVzZWQgdG8gYmUgYSBnb29kIGNob2ljZSBmb3IgbWFueSBzeXN0ZW1zLi4uCisJICovCisJYWRkciA9IENPTkZJR19TWVNfTU9OSVRPUl9CQVNFIC0gc2l6ZW9mICh1bG9uZyk7CisjZW5kaWYKKwkoKHZvaWQgKCopICh2b2lkKSkgYWRkcikgKCk7CisjZW5kaWYgIC8qICNpZiBkZWZpbmVkKENPTkZJR19QQVRJKSAqLworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvY3B1X2luaXQuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L2NwdV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0YmY4NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L2NwdV9pbml0LmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMgIE1hcnRpbiBXaW5pc3RvZXJmZXIsIG1hcnRpbndpbmlzdG9lcmZlckBnbXguY2guCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwKKyAqLworCisvKgorICogRmlsZToJCWNwdV9pbml0LmMKKyAqCisgKiBEaXNjcmlwdGlvbjoJCUNvbnRhaW5zIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyB0byBzZXR1cAorICoJCQl0aGUgY3B1IHByb3Blcmx5CisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM1eHguaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorCisvKgorICogU2V0dXAgZXNzZW50aWFsIGNwdSByZWdpc3RlcnMgdG8gcnVuCisgKi8KK3ZvaWQgY3B1X2luaXRfZiAodm9sYXRpbGUgaW1tYXBfdCAqIGltbXIpCit7CisJdm9sYXRpbGUgbWVtY3RsNXh4X3QgKm1lbWN0bCA9ICZpbW1yLT5pbV9tZW1jdGw7CisJdWxvbmcgcmVnOworCisJLyogU1lQQ1IgLSBjb250YWlucyB3YXRjaGRvZyBjb250cm9sLiBUaGlzIHdpbGwgZW5hYmxlIHdhdGNoZG9nICovCisJLyogaWYgQ09ORklHX1dBVENIRE9HIGlzIHNldCAqLworCWltbXItPmltX3NpdV9jb25mLnNjX3N5cGNyID0gQ09ORklHX1NZU19TWVBDUjsKKworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCXJlc2V0XzV4eF93YXRjaGRvZyAoaW1tcik7CisjZW5kaWYKKworCS8qIFNJVU1DUiAtIGNvbnRhaW5zIGRlYnVnIHBpbiBjb25maWd1cmF0aW9uICovCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyIHw9IENPTkZJR19TWVNfU0lVTUNSOworCisJLyogSW5pdGlhbGl6ZSB0aW1lYmFzZS4gVW5sb2NrIFRCU0NSSyAqLworCWltbXItPmltX3NpdGsuc2l0a190YnNjcmsgPSBLQVBXUl9LRVk7CisJaW1tci0+aW1fc2l0LnNpdF90YnNjciA9IENPTkZJR19TWVNfVEJTQ1I7CisKKwkvKiBGdWxsIElNQiBidXMgc3BlZWQgKi8KKwlpbW1yLT5pbV91aW1iLnVpbWJfdW1jciA9IENPTkZJR19TWVNfVU1DUjsKKworCS8qIFRpbWUgYmFzZSBhbmQgZGVjcmVtZW50ZXIgd2lsbCBiZSBlbmFibGVzIChUQkUpICovCisJLyogaW4gaW5pdF90aW1lYmFzZSgpIGluIHRpbWUuYyBjYWxsZWQgZnJvbSBib2FyZF9pbml0X2YoKS4gKi8KKworCS8qIEluaXRpYWxpemUgdGhlIFBJVC4gVW5sb2NrIFBJU0NSSyAqLworCWltbXItPmltX3NpdGsuc2l0a19waXNjcmsgPSBLQVBXUl9LRVk7CisJaW1tci0+aW1fc2l0LnNpdF9waXNjciA9IENPTkZJR19TWVNfUElTQ1I7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfUEFUSSkKKwkvKiBQQVRJIHNlc3QgUExMIGluIHN0YXJ0LlMgKi8KKwkvKiBQTEwgKENQVSBjbG9jaykgc2V0dGluZ3MgKi8KKwlpbW1yLT5pbV9jbGtyc3RrLmNhcmtfcGxwcmNyayA9IEtBUFdSX0tFWTsKKworCS8qIElmIENPTkZJR19TWVNfUExQUkNSIChzZXQgaW4gdGhlIHZhcmlvdXMgKl9jb25maWcuaCBmaWxlcykgdHJpZXMgdG8KKwkgKiBzZXQgdGhlIE1GIGZpZWxkLCB0aGVuIGp1c3QgY29weSBDT05GSUdfU1lTX1BMUFJDUiBvdmVyIGNhcl9wbHByY3IsCisJICogb3RoZXJ3aXNlIE9SIGluIENPTkZJR19TWVNfUExQUkNSIHNvIHdlIGRvIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnRNRgorCSAqIGZpZWxkIHZhbHVlLgorCSAqLworI2lmICgoQ09ORklHX1NZU19QTFBSQ1IgJiBQTFBSQ1JfTUZfTVNLKSAhPSAwKQorCXJlZyA9IENPTkZJR19TWVNfUExQUkNSOwkJCS8qIHJlc2V0IGNvbnRyb2wgYml0cyAgICovCisjZWxzZQorCXJlZyA9IGltbXItPmltX2Nsa3JzdC5jYXJfcGxwcmNyOworCXJlZyAmPSBQTFBSQ1JfTUZfTVNLOwkJCS8qIGlzb2xhdGUgTUYgZmllbGQgKi8KKwlyZWcgfD0gQ09ORklHX1NZU19QTFBSQ1I7CQkJLyogcmVzZXQgY29udHJvbCBiaXRzICAgKi8KKyNlbmRpZgorCWltbXItPmltX2Nsa3JzdC5jYXJfcGxwcmNyID0gcmVnOworCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BBVEkpICovCisKKwkvKiBTeXN0ZW0gaW50ZWdyYXRpb24gdGltZXJzLiBDT05GSUdfU1lTX01BU0sgaGFzIEVCREYgY29uZmlndXJhdGlvbiAqLworCWltbXItPmltX2Nsa3JzdGsuY2Fya19zY2NyayA9IEtBUFdSX0tFWTsKKwlyZWcgPSBpbW1yLT5pbV9jbGtyc3QuY2FyX3NjY3I7CisJcmVnICY9IFNDQ1JfTUFTSzsKKwlyZWcgfD0gQ09ORklHX1NZU19TQ0NSOworCWltbXItPmltX2Nsa3JzdC5jYXJfc2NjciA9IHJlZzsKKworCS8qIE1lbW9yeSBDb250cm9sbGVyICovCisJbWVtY3RsLT5tZW1jX2JyMCA9IENPTkZJR19TWVNfQlIwX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfb3IwID0gQ09ORklHX1NZU19PUjBfUFJFTElNOworCisjaWYgKGRlZmluZWQoQ09ORklHX1NZU19PUjFfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfQlIxX1BSRUxJTSkpCisJbWVtY3RsLT5tZW1jX29yMSA9IENPTkZJR19TWVNfT1IxX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIxID0gQ09ORklHX1NZU19CUjFfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1IyX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0JSMl9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yMiA9IENPTkZJR19TWVNfT1IyX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIyID0gQ09ORklHX1NZU19CUjJfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1IzX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0JSM19QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yMyA9IENPTkZJR19TWVNfT1IzX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIzID0gQ09ORklHX1NZU19CUjNfUFJFTElNOworI2VuZGlmCisKK30KKworLyoKKyAqIEluaXRpYWxpemUgaGlnaGVyIGxldmVsIHBhcnRzIG9mIGNwdQorICovCitpbnQgY3B1X2luaXRfciAodm9pZCkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvIGF0IHRoZSBtb21lbnQgKi8KKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvaW50ZXJydXB0cy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvaW50ZXJydXB0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzU0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eC9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMglXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICogKEMpIENvcHlyaWdodCAyMDAzCQlNYXJ0aW4gV2luaXN0b2VyZmVyLCBtYXJ0aW53aW5pc3RvZXJmZXJAZ214LmNoLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sCisgKi8KKworLyoKKyAqIEZpbGU6CQlpbnRlcnJ1cHQuYworICoKKyAqIERpc2NyaXB0aW9uOgkJQ29udGFpbnMgaW50ZXJydXB0IHJvdXRpbmVzIG5lZWRlZCBieSBVLUJvb3QKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtcGM1eHguaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQVRJKQorLyogUEFUSSB1c2VzIElSUXMgZm9yIFBDSSBkb29yYmVsbCAqLworI3VuZGVmIE5SX0lSUVMKKyNkZWZpbmUgTlJfSVJRUyAxNgorI2VuZGlmCisKK3N0cnVjdCBpbnRlcnJ1cHRfYWN0aW9uIHsKKwlpbnRlcnJ1cHRfaGFuZGxlcl90ICpoYW5kbGVyOworCXZvaWQgKmFyZzsKKwlpbnQgY291bnQ7Cit9OworCitzdGF0aWMgc3RydWN0IGludGVycnVwdF9hY3Rpb24gaXJxX3ZlY3NbTlJfSVJRU107CisKKy8qCisgKiBJbml0aWFsaXNlIGludGVycnVwdHMKKyAqLworCitpbnQgaW50ZXJydXB0X2luaXRfY3B1ICh1bG9uZyAqZGVjcmVtZW50ZXJfY291bnQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwlpbnQgdmVjOworCisJLyogRGVjcmVtZW50ZXIgdXNlZCBoZXJlIGZvciBzdGF0dXMgbGVkICovCisJKmRlY3JlbWVudGVyX2NvdW50ID0gZ2V0X3RiY2xrICgpIC8gQ09ORklHX1NZU19IWjsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zaW1hc2sgPSAwOworCWZvciAodmVjPTA7IHZlYzxOUl9JUlFTOyB2ZWMrKykgeworCQlpcnFfdmVjc1t2ZWNdLmhhbmRsZXIgPSBOVUxMOworCQlpcnFfdmVjc1t2ZWNdLmFyZyA9IE5VTEw7CisJCWlycV92ZWNzW3ZlY10uY291bnQgPSAwOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBIYW5kbGUgZXh0ZXJuYWwgaW50ZXJydXB0cworICovCit2b2lkIGV4dGVybmFsX2ludGVycnVwdCAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwlpbnQgaXJxOworCXVsb25nIHNpbWFzaywgbmV3bWFzazsKKwl1bG9uZyB2ZWMsIHZfYml0OworCisJLyoKKwkgKiByZWFkIHRoZSBTSVZFQyByZWdpc3RlciBhbmQgc2hpZnQgdGhlIGJpdHMgZG93bgorCSAqIHRvIGdldCB0aGUgaXJxIG51bWJlcgorCSAqLworCXZlYyA9IGltbXItPmltX3NpdV9jb25mLnNjX3NpdmVjOworCWlycSA9IHZlYyA+PiAyNjsKKwl2X2JpdCA9IDB4ODAwMDAwMDBVTCA+PiBpcnE7CisKKwkvKgorCSAqIFJlYWQgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgYW5kIE1hc2sgSW50ZXJydXB0cworCSAqLworCXNpbWFzayA9IGltbXItPmltX3NpdV9jb25mLnNjX3NpbWFzazsKKwluZXdtYXNrID0gc2ltYXNrICYgKH4oMHhGRkZGMDAwMCA+PiBpcnEpKTsKKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zaW1hc2sgPSBuZXdtYXNrOworCisJaWYgKCEoaXJxICYgMHgxKSkgewkJLyogRXh0ZXJuYWwgSW50ZXJydXB0ID8gICAgICovCisJCXVsb25nIHNpZWw7CisKKwkJLyoKKwkJICogUmVhZCBJbnRlcnJ1cHQgRWRnZS9MZXZlbCBSZWdpc3RlcgorCQkgKi8KKwkJc2llbCA9IGltbXItPmltX3NpdV9jb25mLnNjX3NpZWw7CisKKwkJaWYgKHNpZWwgJiB2X2JpdCkgewkvKiBlZGdlIHRyaWdnZXJlZCBpbnRlcnJ1cHQgPyAgICovCisJCQkvKgorCQkJICogUmV3cml0ZSBTSVBFTkQgUmVnaXN0ZXIgdG8gY2xlYXIgaW50ZXJydXB0CisJCQkgKi8KKwkJCWltbXItPmltX3NpdV9jb25mLnNjX3NpcGVuZCA9IHZfYml0OworCQl9CisJfQorCisJaWYgKGlycV92ZWNzW2lycV0uaGFuZGxlciAhPSBOVUxMKSB7CisJCWlycV92ZWNzW2lycV0uaGFuZGxlciAoaXJxX3ZlY3NbaXJxXS5hcmcpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIlxuQm9ndXMgRXh0ZXJuYWwgSW50ZXJydXB0IElSUSAlZCBWZWN0b3IgJWxkXG4iLAorCQkJCWlycSwgdmVjKTsKKwkJLyogdHVybiBvZmYgdGhlIGJvZ3VzIGludGVycnVwdCB0byBhdm9pZCBpdCBmcm9tIG5vdyAqLworCQlzaW1hc2sgJj0gfnZfYml0OworCX0KKwkvKgorCSAqIFJlLUVuYWJsZSBvbGQgSW50ZXJydXB0IE1hc2sKKwkgKi8KKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zaW1hc2sgPSBzaW1hc2s7Cit9CisKKy8qCisgKiBJbnN0YWxsIGFuZCBmcmVlIGFuIGludGVycnVwdCBoYW5kbGVyCisgKi8KK3ZvaWQgaXJxX2luc3RhbGxfaGFuZGxlciAoaW50IHZlYywgaW50ZXJydXB0X2hhbmRsZXJfdCAqIGhhbmRsZXIsCisJCQkJCQkgIHZvaWQgKmFyZykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCS8qIFNJVSBpbnRlcnJ1cHQgKi8KKwlpZiAoaXJxX3ZlY3NbdmVjXS5oYW5kbGVyICE9IE5VTEwpIHsKKwkJcHJpbnRmICgiU0lVIGludGVycnVwdCAlZCAweCV4XG4iLAorCQkJdmVjLAorCQkJKHVpbnQpIGhhbmRsZXIpOworCX0KKwlpcnFfdmVjc1t2ZWNdLmhhbmRsZXIgPSBoYW5kbGVyOworCWlycV92ZWNzW3ZlY10uYXJnID0gYXJnOworCWltbXItPmltX3NpdV9jb25mLnNjX3NpbWFzayB8PSAxIDw8ICgzMSAtIHZlYyk7CisjaWYgMAorCXByaW50ZiAoIkluc3RhbGwgU0lVIGludGVycnVwdCBmb3IgdmVjdG9yICVkID09PiAlcFxuIiwKKwkJdmVjLCBoYW5kbGVyKTsKKyNlbmRpZgorfQorCit2b2lkIGlycV9mcmVlX2hhbmRsZXIgKGludCB2ZWMpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwkvKiBTSVUgaW50ZXJydXB0ICovCisjaWYgMAorCXByaW50ZiAoIkZyZWUgQ1BNIGludGVycnVwdCBmb3IgdmVjdG9yICVkXG4iLAorCQl2ZWMpOworI2VuZGlmCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2ltYXNrICY9IH4oMSA8PCAoMzEgLSB2ZWMpKTsKKwlpcnFfdmVjc1t2ZWNdLmhhbmRsZXIgPSBOVUxMOworCWlycV92ZWNzW3ZlY10uYXJnID0gTlVMTDsKK30KKworLyoKKyAqICBUaW1lciBpbnRlcnJ1cHQgLSBnZXRzIGNhbGxlZCB3aGVuICBiaXQgMCBvZiBERUMgY2hhbmdlcyBmcm9tCisgKiAgMC4gRGVjcmVtZW50ZXIgaXMgZW5hYmxlZCB3aXRoIGJpdCBUQkUgaW4gVEJTQ1IuCisgKi8KK3ZvaWQgdGltZXJfaW50ZXJydXB0X2NwdSAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKworI2lmIDAKKwlwcmludGYgKCIqKiogVGltZXIgSW50ZXJydXB0ICoqKiAiKTsKKyNlbmRpZgorCS8qIFJlc2V0IFRpbWVyIFN0YXR1cyBCaXQgYW5kIFRpbWVycyBJbnRlcnJ1cHQgU3RhdHVzICovCisJaW1tci0+aW1fY2xrcnN0ay5jYXJrX3BscHJjcmsgPSBLQVBXUl9LRVk7CisJX19hc21fXyAoIm5vcCIpOworCWltbXItPmltX2Nsa3JzdC5jYXJfcGxwcmNyIHw9IFBMUFJDUl9URVhQUyB8IFBMUFJDUl9UTUlTVDsKKworCXJldHVybjsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGlycWluZm8gLSBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBJUlFzCisgKgorICovCitpbnQgZG9faXJxaW5mbyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgdmVjOworCisJcHJpbnRmICgiXG5JbnRlcnJ1cHQtSW5mb3JtYXRpb246XG4iKTsKKwlwcmludGYgKCJOciAgUm91dGluZSAgIEFyZyAgICAgICBDb3VudFxuIik7CisKKwlmb3IgKHZlYz0wOyB2ZWM8TlJfSVJRUzsgdmVjKyspIHsKKwkJaWYgKGlycV92ZWNzW3ZlY10uaGFuZGxlciAhPSBOVUxMKSB7CisJCQlwcmludGYgKCIlMDJkICAlMDhseCAgJTA4bHggICVkXG4iLAorCQkJCXZlYywKKwkJCQkodWxvbmcpaXJxX3ZlY3NbdmVjXS5oYW5kbGVyLAorCQkJCSh1bG9uZylpcnFfdmVjc1t2ZWNdLmFyZywKKwkJCQlpcnFfdmVjc1t2ZWNdLmNvdW50KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3NlcmlhbC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjNmRiOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3NlcmlhbC5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzCisgKiBNYXJ0aW4gV2luaXN0b2VyZmVyLCBtYXJ0aW53aW5pc3RvZXJmZXJAZ214LmNoLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sCisgKi8KKworLyoKKyAqIEZpbGU6CQlzZXJpYWwuYworICoKKyAqIERpc2NyaXB0aW9uOgkJU2VyaWFsIGludGVyZmFjZSBkcml2ZXIgZm9yIFNDSTEgYW5kIFNDSTIuCisgKgkJCVNpbmNlIHRoaXMgY29kZSB3aWxsIGJlIGNhbGxlZCBmcm9tIFJPTSB1c2UKKyAqCQkJb25seSBub24tc3RhdGljIGxvY2FsIHZhcmlhYmxlcy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1wYzV4eC5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworLyoKKyAqIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworCitzdGF0aWMgaW50IHJlYWR5X3RvX3NlbmQodm9pZCk7CisKKy8qCisgKiBNaW5pbWFsIGdsb2JhbCBzZXJpYWwgZnVuY3Rpb25zIG5lZWRlZCB0byB1c2Ugb25lIG9mIHRoZSBTQ0kgbW9kdWxlcy4KKyAqLworCitpbnQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCisJc2VyaWFsX3NldGJyZygpOworCisjaWYgZGVmaW5lZChDT05GSUdfNXh4X0NPTlNfU0NJMSkKKwkvKiAxMC1CaXQsIDEgc3RhcnQgYml0LCA4IGRhdGEgYml0LCBubyBwYXJpdHksIDEgc3RvcCBiaXQgKi8KKwlpbW1yLT5pbV9xc21jbS5xc21jbV9zY2MxcjEgPSBTQ0lfTV8xMDsKKwlpbW1yLT5pbV9xc21jbS5xc21jbV9zY2MxcjEgPSBTQ0lfVEUgfCBTQ0lfUkU7CisjZWxzZQorCWltbXItPmltX3FzbWNtLnFzbWNtX3NjYzJyMSA9IFNDSV9NXzEwOworCWltbXItPmltX3FzbWNtLnFzbWNtX3NjYzJyMSA9IFNDSV9URSB8IFNDSV9SRTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCit2b2lkIHNlcmlhbF9wdXRjKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisKKwkvKiBUZXN0IGZvciBjb21wbGV0aXRpb24gKi8KKwlpZihyZWFkeV90b19zZW5kKCkpIHsKKyNpZiBkZWZpbmVkKENPTkZJR181eHhfQ09OU19TQ0kxKQorCQlpbW1yLT5pbV9xc21jbS5xc21jbV9zYzFkciA9IChzaG9ydCljOworI2Vsc2UKKwkJaW1tci0+aW1fcXNtY20ucXNtY21fc2MyZHIgPSAoc2hvcnQpYzsKKyNlbmRpZgorCQlpZihjID09ICdcbicpIHsKKwkJCWlmKHJlYWR5X3RvX3NlbmQoKSk7CisjaWYgZGVmaW5lZChDT05GSUdfNXh4X0NPTlNfU0NJMSkKKwkJCWltbXItPmltX3FzbWNtLnFzbWNtX3NjMWRyID0gKHNob3J0KSdccic7CisjZWxzZQorCQkJaW1tci0+aW1fcXNtY20ucXNtY21fc2MyZHIgPSAoc2hvcnQpJ1xyJzsKKyNlbmRpZgorCQl9CisJfQorfQorCitpbnQgc2VyaWFsX2dldGModm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgc2hvcnQgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgdG1wOworCisJLyogTmV3IGRhdGEgPyAqLworCWRvIHsKKyNpZiBkZWZpbmVkKENPTkZJR181eHhfQ09OU19TQ0kxKQorCQlzdGF0dXMgPSBpbW1yLT5pbV9xc21jbS5xc21jbV9zYzFzcjsKKyNlbHNlCisJCXN0YXR1cyA9IGltbXItPmltX3FzbWNtLnFzbWNtX3NjMnNyOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwkJcmVzZXRfNXh4X3dhdGNoZG9nIChpbW1yKTsKKyNlbmRpZgorCX0gd2hpbGUgKChzdGF0dXMgJiBTQ0lfUkRSRikgPT0gMCk7CisKKwkvKiBSZWFkIGRhdGEgKi8KKyNpZiBkZWZpbmVkKENPTkZJR181eHhfQ09OU19TQ0kxKQorCXRtcCA9ICh1bnNpZ25lZCBjaGFyKShpbW1yLT5pbV9xc21jbS5xc21jbV9zYzFkciAmIFNDSV9TQ1hEUl9NSyk7CisjZWxzZQorCXRtcCA9ICh1bnNpZ25lZCBjaGFyKSggaW1tci0+aW1fcXNtY20ucXNtY21fc2MyZHIgJiBTQ0lfU0NYRFJfTUspOworI2VuZGlmCisJcmV0dXJuCXRtcDsKK30KKworaW50IHNlcmlhbF90c3RjKCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJc2hvcnQgc3RhdHVzOworCisJLyogTmV3IGRhdGEgY2hhcmFjdGVyID8gKi8KKyNpZiBkZWZpbmVkKENPTkZJR181eHhfQ09OU19TQ0kxKQorCXN0YXR1cyA9IGltbXItPmltX3FzbWNtLnFzbWNtX3NjMXNyOworI2Vsc2UKKwlzdGF0dXMgPSBpbW1yLT5pbV9xc21jbS5xc21jbV9zYzJzcjsKKyNlbmRpZgorCXJldHVybiAoc3RhdHVzICYgU0NJX1JEUkYpOworfQorCit2b2lkIHNlcmlhbF9zZXRicmcgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXNob3J0IHNjeGJyOworCisJLyogU2V0IGJhdWRyYXRlICovCisJc2N4YnIgPSAoZ2QtPmNwdV9jbGsgLyAoMzIgKiBnZC0+YmF1ZHJhdGUpKTsKKyNpZiBkZWZpbmVkKENPTkZJR181eHhfQ09OU19TQ0kxKQorCWltbXItPmltX3FzbWNtLnFzbWNtX3NjYzFyMCA9IChzY3hiciAmIFNDSV9TQ1hCUl9NSyk7CisjZWxzZQorCWltbXItPmltX3FzbWNtLnFzbWNtX3NjYzJyMCA9IChzY3hiciAmIFNDSV9TQ1hCUl9NSyk7CisjZW5kaWYKK30KKwordm9pZCBzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJc2VyaWFsX3B1dGMoKnMpOworCQkrK3M7CisJfQorfQorCitpbnQgcmVhZHlfdG9fc2VuZCh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBzaG9ydCBzdGF0dXM7CisKKwlkbyB7CisjaWYgZGVmaW5lZChDT05GSUdfNXh4X0NPTlNfU0NJMSkKKwkJc3RhdHVzID0gaW1tci0+aW1fcXNtY20ucXNtY21fc2Mxc3I7CisjZWxzZQorCQlzdGF0dXMgPSBpbW1yLT5pbV9xc21jbS5xc21jbV9zYzJzcjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisJCXJlc2V0XzV4eF93YXRjaGRvZyAoaW1tcik7CisjZW5kaWYKKwl9IHdoaWxlICgoc3RhdHVzICYgU0NJX1REUkUpID09IDApOworCXJldHVybiAxOworCit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eC9zcGVlZC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTVjMWRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvc3BlZWQuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzCisgKiBNYXJ0aW4gV2luaXN0b2VyZmVyLCBtYXJ0aW53aW5pc3RvZXJmZXJAZ214LmNoLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sCisgKi8KKworLyoKKyAqIEZpbGU6CQlzcGVlZC5jCisgKgorICogRGlzY3JpcHRpb246CQlQcm92aWRlcyBjcHUgc3BlZWQgY2FsY3VsYXRpb24KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzV4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qCisgKiBHZXQgY3B1IGFuZCBidXMgY2xvY2sKKyAqLworaW50IGdldF9jbG9ja3MgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKworI2lmbmRlZglDT05GSUdfNXh4X0dDTEtfRlJFUQorCXVpbnQgZGl2ZiA9IChpbW1yLT5pbV9jbGtyc3QuY2FyX3BscHJjciAmIFBMUFJDUl9ESVZGX01TSyk7CisJdWludCBtZiA9ICgoaW1tci0+aW1fY2xrcnN0LmNhcl9wbHByY3IgJiBQTFBSQ1JfTUZfTVNLKSA+PiBQTFBSQ1JfTUZfU0hJRlQpOworCXVsb25nIHZjb291dDsKKworCXZjb291dCA9IChDT05GSUdfU1lTX09TQ19DTEsgLyAoZGl2ZiArIDEpKSAqIChtZiArIDEpICogMjsKKwlpZihpbW1yLT5pbV9jbGtyc3QuY2FyX3BscHJjciAmIFBMUFJDUl9DU1JDX01TSykgeworCQlnZC0+Y3B1X2NsayA9IHZjb291dCAvICgyXigoKGltbXItPmltX2Nsa3JzdC5jYXJfc2NjciAmIFNDQ1JfREZOTF9NU0spID4+IFNDQ1JfREZOTF9TSElGVCkgKyAxKSk7CisJfSBlbHNlIHsKKwkJZ2QtPmNwdV9jbGsgPSB2Y29vdXQgLyAoMl4oaW1tci0+aW1fY2xrcnN0LmNhcl9zY2NyICYgU0NDUl9ERk5IX01TSykpOworCX0KKworI2Vsc2UgLyogQ09ORklHXzV4eF9HQ0xLX0ZSRVEgKi8KKwlnZC0+YnVzX2NsayA9IENPTkZJR181eHhfR0NMS19GUkVROworI2VuZGlmIC8qIENPTkZJR181eHhfR0NMS19GUkVRICovCisKKwlpZiAoKGltbXItPmltX2Nsa3JzdC5jYXJfc2NjciAmIFNDQ1JfRUJERjExKSA9PSAwKSB7CisJCS8qIE5vIEJ1cyBEaXZpZGVyIGFjdGl2ZSAqLworCQlnZC0+YnVzX2NsayA9IGdkLT5jcHVfY2xrOworCX0gZWxzZSB7CisJCS8qIENMS09VVCBpcyBHQ0xLIC8gMiAqLworCQlnZC0+YnVzX2NsayA9IGdkLT5jcHVfY2xrIC8gMjsKKwl9CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3NwaS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhMTVlYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3NwaS5jCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIE5hdmluIEJvcHB1cmkgLyBQcmFzaGFudCBQYXRlbAorICoJPG5ib3BwdXJpQHRyaW5ldGNvbW11bmljYXRpb24uY29tPiwKKyAqCTxwbXBhdGVsQHRyaW5ldGNvbW11bmljYXRpb24uY29tPgorICogQ29weXJpZ2h0IChjKSAyMDAxIEdlcmQgTWVubmNoZW4gPEdlcmQuTWVubmNoZW5AaWNuLnNpZW1lbnMuZGU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPHdkQGRlbnguZGU+LgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBNUEM1eHggQ1BNIFNQSSBpbnRlcmZhY2UuCisgKgorICogUGFydHMgb2YgdGhpcyBjb2RlIGFyZSBwcm9iYWJseSBub3QgcG9ydGFibGUgYW5kL29yIHNwZWNpZmljIHRvCisgKiB0aGUgYm9hcmQgd2hpY2ggSSB1c2VkIGZvciB0aGUgdGVzdHMuIFBsZWFzZSBzZW5kIGZpeGVzL2NvbXBsYWludHMKKyAqIHRvIHdkQGRlbnguZGUKKyAqCisgKiBQb3J0ZWQgdG8gTVBDNXh4CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRGVuaXMgUGV0ZXIsIE1QTCBBRyBTd2l0emVybGFuZCwgZC5wZXRyQG1wbC5jaC4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjNXh4Lmg+CisjaW5jbHVkZSA8YXNtLzV4eF9pbW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8cG9zdC5oPgorI2luY2x1ZGUgPG5ldC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJKQorCisjdW5kZWYJREVCVUcKKworI2RlZmluZSBTUElfRUVQUk9NX1dSRU4JCTB4MDYKKyNkZWZpbmUgU1BJX0VFUFJPTV9SRFNSCQkweDA1CisjZGVmaW5lIFNQSV9FRVBST01fUkVBRAkJMHgwMworI2RlZmluZSBTUElfRUVQUk9NX1dSSVRFCTB4MDIKKworCisjaWZkZWYJREVCVUcKKworI2RlZmluZQlEUFJJTlQoYSkJcHJpbnRmIGE7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSGVscGVyIGZ1bmN0aW9ucyB0byBwZWVrIGludG8gdHggYW5kIHJ4IGJ1ZmZlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhleF9kaWdpdCA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworc3RhdGljIGNoYXIgcXVpY2toZXggKGludCBpKQoreworCXJldHVybiBoZXhfZGlnaXRbaV07Cit9CisKK3N0YXRpYyB2b2lkIG1lbWR1bXAgKHZvaWQgKnB2LCBpbnQgbnVtKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKnBjID0gKHVuc2lnbmVkIGNoYXIgKikgcHY7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCXByaW50ZiAoIiVjJWMgIiwgcXVpY2toZXggKHBjW2ldID4+IDQpLCBxdWlja2hleCAocGNbaV0gJiAweDBmKSk7CisJcHJpbnRmICgiXHQiKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCXByaW50ZiAoIiVjIiwgaXNwcmludCAocGNbaV0pID8gcGNbaV0gOiAnLicpOworCXByaW50ZiAoIlxuIik7Cit9CisjZWxzZQkvKiAhREVCVUcgKi8KKworI2RlZmluZQlEUFJJTlQoYSkKKworI2VuZGlmCS8qIERFQlVHICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgc3BpX2luaXQgKHZvaWQpOworCitzc2l6ZV90IHNwaV9yZWFkICh1Y2hhciAqLCBpbnQsIHVjaGFyICosIGludCk7Citzc2l6ZV90IHNwaV93cml0ZSAodWNoYXIgKiwgaW50LCB1Y2hhciAqLCBpbnQpOworc3NpemVfdCBzcGlfeGZlciAoc2l6ZV90KTsKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGdW5jdGlvbjogICAgc3BpX2luaXRfZgorICoKKyAqICBEZXNjcmlwdGlvbjogSW5pdCBTUEktQ29udHJvbGxlciAoUk9NIHBhcnQpCisgKgorICogIHJldHVybjogICAgICAtLS0KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit2b2lkIHNwaV9pbml0X2YgKHZvaWQpCit7CisJaW50IGk7CisKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yOworCXZvbGF0aWxlIHFzbWNtNXh4X3QgKnFzbWNtOworCisJaW1tciA9IChpbW1hcF90ICopICBDT05GSUdfU1lTX0lNTVI7CisJcXNtY20gPSAocXNtY201eHhfdCAqKSZpbW1yLT5pbV9xc21jbTsKKworCXFzbWNtLT5xc21jbV9xc21jciA9IDA7IC8qIGFsbCBhY2Nlc3NlcyBlbmFibGVkICovCisJcXNtY20tPnFzbWNtX3FzcGlfaWwgPSAwOyAvKiBsb3dlc3QgSVJRICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEdQSU8gb3IgcGVyLiBGdW5jdGlvbgorCSAqIFBRU1BBUlswMF0gPSAwIHJlc2VydmVkCisJICogUFFTUEFSWzAxXSA9IDEgWzB4NDAwMF0gLT4gUEVSSTogKFNQSUNTMykKKwkgKiBQUVNQQVJbMDJdID0gMCBbMHgwMDAwXSAtPiBHUElPCisJICogUFFTUEFSWzAzXSA9IDAgWzB4MDAwMF0gLT4gR1BJTworCSAqIFBRU1BBUlswNF0gPSAxIFsweDA4MDBdIC0+IFBFUkk6IChTUElDUzApCisJICogUFFTUEFSWzA1XSA9IDAgcmVzZXZlZAorCSAqIFBRU1BBUlswNl0gPSAxIFsweDAyMDBdIC0+IFBFUkk6IChTUElNT1NJKQorCSAqIFBRU1BBUlswN10gPSAxIFsweDAxMDBdIC0+IFBFUkk6IChTUElNSVNPKQorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJcXNtY20tPnFzbWNtX3Bxc3BhciA9ICAweDMgfCAoQ09ORklHX1NZU19TUElfQ1NfVVNFRCA8PCAzKTsKKworCSAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEREUlFTWzAwXSA9IDAgcmVzZXJ2ZWQKKwkgKiBERFJRU1swMV0gPSAxIFsweDAwNDBdIC0+IFNQSUNTMyBPdXRwdXQKKwkgKiBERFJRU1swMl0gPSAwIFsweDAwMDBdIC0+IEdQSU8gT3V0cHV0CisJICogRERSUVNbMDNdID0gMCBbMHgwMDAwXSAtPiBHUElPIE91dHB1dAorCSAqIEREUlFTWzA0XSA9IDEgWzB4MDAwOF0gLT4gU1BJQ1MwIE91dHB1dAorCSAqIEREUlFTWzA1XSA9IDEgWzB4MDAwNF0gLT4gU1BJQ0xLIE91dHB1dAorCSAqIEREUlFTWzA2XSA9IDEgWzB4MDAwMl0gLT4gU1BJTU9TSSBPdXRwdXQKKwkgKiBERFJRU1swN10gPSAwIFsweDAwMDFdIC0+IFNQSU1JU08gSW5wdXQKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCXFzbWNtLT5xc21jbV9kZHJxcyA9IDB4N0U7CisJIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogQmFzZSBzdGF0ZSBmb3IgdXNlZCBTUEkgQ1MgcGlucywgaWYgYmFzZSA9IDAgYWN0aXZlIG11c3QgYmUgMQorCSAqIFBPUlRRU1swMF0gPSAwIHJlc2VydmVkCisJICogUE9SVFFTWzAxXSA9IDAgcmVzZXJ2ZWQKKwkgKiBQT1JUUVNbMDJdID0gMCByZXNlcnZlZAorCSAqIFBPUlRRU1swM10gPSAwIHJlc2VydmVkCisJICogUE9SVFFTWzA0XSA9IDAgWzB4MDAwMF0gUnhEMgorCSAqIFBPUlRRU1swNV0gPSAxIFsweDA0MDBdIFR4RDIKKwkgKiBQT1JUUVNbMDZdID0gMCBbMHgwMDAwXSBSeEQxCisJICogUE9SVFFTWzA3XSA9IDEgWzB4MDEwMF0gVHhEMQorCSAqIFBPUlRRU1swOF0gPSAwIHJlc2VydmVkCisJICogUE9SVFFTWzA5XSA9IDAgWzB4MDAwMF0gLT4gU1BJQ1MzIEJhc2UgT3V0cHV0CisJICogUE9SVFFTWzEwXSA9IDAgWzB4MDAwMF0gLT4gU1BJQ1MyIEJhc2UgT3V0cHV0CisJICogUE9SVFFTWzExXSA9IDAgWzB4MDAwMF0gLT4gU1BJQ1MxIEJhc2UgT3V0cHV0CisJICogUE9SVFFTWzEyXSA9IDAgWzB4MDAwMF0gLT4gU1BJQ1MwIEJhc2UgT3V0cHV0CisJICogUE9SVFFTWzEzXSA9IDAgWzB4MDAwNF0gLT4gU1BJQ0xLIE91dHB1dAorCSAqIFBPUlRRU1sxNF0gPSAwIFsweDAwMDJdIC0+IFNQSU1PU0kgT3V0cHV0CisJICogUE9SVFFTWzE1XSA9IDAgWzB4MDAwMV0gLT4gU1BJTUlTTyBJbnB1dAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJcXNtY20tPnFzbWNtX3BvcnRxcyB8PSAoQ09ORklHX1NZU19TUElfQ1NfQkFTRSA8PCAzKTsKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIENvbnRyb2xsIFJlZ2lzdGVyIDAKKwkgKiBTUENSMFswMF0gPSAxICgweDgwMDApIE1hc3RlcgorCSAqIFNQQ1IwWzAxXSA9IDAgKDB4MDAwMCkgV2lyZWQtT3IKKwkgKiBTUENSMFsyLi41XSA9ICgweDIwMDApIEJpdHMgcGVyIHRyYW5zZmVyIChkZWZhdWx0IDgpCisJICogU1BDUjBbMDZdID0gMCAoMHgwMDAwKSBOb3JtYWwgcG9sYXJpdHkKKwkgKiBTUENSMFswN10gPSAwICgweDAwMDApIE5vcm1hbCBDbG9jayBQaGFzZQorCSAqIFNQQ1IwWzA4Li4xNV0gPSAxNCAxLjRNSHoKKwkgKi8KKwlxc21jbS0+cXNtY21fc3BjcjA9MHhBMDBFOworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogQ29udHJvbGwgUmVnaXN0ZXIgMQorCSAqIFNQQ1IxWzAwXSA9IDAgKDB4MDAwMCkgUVNQSSBlbmFibGVkCisJICogU1BDUjFbMS4uN10gPSAgKDB4N0YwMCkgRGVsYXkgYmVmb3JlIFRyYW5zZmVyCisJICogU1BDUjFbOC4uMTVdID0gKDB4MDAwMCkgRGVsYXkgQWZ0ZXIgdHJhbnNmZXIgKDIwNC44dXNlY0A0ME1IeikKKwkgKi8KKwlxc21jbS0+cXNtY21fc3BjcjE9MHg3RjAwOworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogQ29udHJvbGwgUmVnaXN0ZXIgMgorCSAqIFNQQ1IyWzAwXSA9IDAgKDB4MDAwMCkgU1BJIElSUXMgRGlzYWJlbGQKKwkgKiBTUENSMlswMV0gPSAwICgweDAwMDApIE5vIFdyYXAgYXJvdW5kCisJICogU1BDUjJbMDJdID0gMCAoMHgwMDAwKSBXcmFwIHRvIDAKKwkgKiBTUENSMlszLi43XSA9ICgweDAwMDApIEVuZCBRdWV1ZSBwb2ludGVyID0gMAorCSAqIFNQQ1IyWzguLjEwXSA9IDAgKDB4MDAwMCkgcmVzZXJ2ZWQKKwkgKiBTUENSMlsxMS4uMTVdID0gMCAoMHgwMDAwKSBOZXdRdWV1ZSBBZGRyZXNzID0gMAorCSAqLworCXFzbWNtLT5xc21jbV9zcGNyMj0weDAwMDA7CisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBDb250cm9sbCBSZWdpc3RlciAzCisJICogU1BDUjNbMDAuLjA0XSA9IDAgKDB4MDAwMCkgcmVzZXJ2ZWQKKwkgKiBTUENSM1swNV0gPSAwICgweDAwMDApIEZlZWRiYWNrIGRpc2FibGVkCisJICogU1BDUjNbMDZdID0gMCAoMHgwMDAwKSBJUlEgb24gSEFMVEEgJiBNT0RGIGRpc2FibGVkCisJICogU1BDUjNbMDddID0gMCAoMHgwMDAwKSBOb3QgaGFsdGVkCisJICovCisJcXNtY20tPnFzbWNtX3NwY3IzPTB4MDA7CisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTUFNSIChDb250cm9sbCBSZWdpc3RlciAzKSBSZWFkIG9ubHkvIHJlc2V0IEZsYWdzIDA4LDA5LDEwCisJICogU1BDUjNbMDhdID0gMSAoMHg4MCkgUVNQSSBmaW5pc2hlZAorCSAqIFNQQ1IzWzA5XSA9IDEgKDB4NDApIE1vZGUgRmF1bHQgRmxhZworCSAqIFNQQ1IzWzEwXSA9IDEgKDB4MjApIEhBTFRBCisJICogU1BDUjNbMTEuLjE1XSA9IDAgKDB4MDAwMCkgTGFzdCBleGVjdXRlZCBjb21tYW5kCisJICovCisJcXNtY20tPnFzbWNtX3Nwc3I9MHhFMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXR1cCBSQU0KKwkgKi8KKwlmb3IoaT0wO2k8MzI7aSsrKSB7CisJCSBxc21jbS0+cXNtY21fcmVjcmFtW2ldPTB4MDAwMDsKKwkJIHFzbWNtLT5xc21jbV90cmFucmFtW2ldPTB4MDAwMDsKKwkJIHFzbWNtLT5xc21jbV9jb21kcmFtW2ldPTB4MDA7CisJfQorCXJldHVybjsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb246ICAgIHNwaV9pbml0X3IKKyAqICBEdW1teSwgYWxsIGluaXRpYWxpemF0aW9ucyBoYXZlIGJlZW4gZG9uZSBpbiBzcGlfaW5pdF9yCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZCBzcGlfaW5pdF9yICh2b2lkKQoreworCXJldHVybjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEZ1bmN0aW9uOiAgICBzcGlfd3JpdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzc2l6ZV90IHNob3J0X3NwaV93cml0ZSAodWNoYXIgKmFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBpLGRsZW47CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tcjsKKwl2b2xhdGlsZSBxc21jbTV4eF90ICpxc21jbTsKKworCWltbXIgPSAoaW1tYXBfdCAqKSAgQ09ORklHX1NZU19JTU1SOworCXFzbWNtID0gKHFzbWNtNXh4X3QgKikmaW1tci0+aW1fcXNtY207CisJZm9yKGk9MDtpPDMyO2krKykgeworCQkgcXNtY20tPnFzbWNtX3JlY3JhbVtpXT0weDAwMDA7CisJCSBxc21jbS0+cXNtY21fdHJhbnJhbVtpXT0weDAwMDA7CisJCSBxc21jbS0+cXNtY21fY29tZHJhbVtpXT0weDAwOworCX0KKwlxc21jbS0+cXNtY21fdHJhbnJhbVswXSA9ICBTUElfRUVQUk9NX1dSRU47IC8qIHdyaXRlIGVuYWJsZSAqLworCXNwaV94ZmVyKDEpOworCWk9MDsKKwlxc21jbS0+cXNtY21fdHJhbnJhbVtpKytdID0gIFNQSV9FRVBST01fV1JJVEU7IC8qIFdSSVRFIG1lbW9yeSBhcnJheSAqLworCXFzbWNtLT5xc21jbV90cmFucmFtW2krK10gPSAgYWRkclswXTsKKwlxc21jbS0+cXNtY21fdHJhbnJhbVtpKytdID0gIGFkZHJbMV07CisKKwlmb3IoZGxlbj0wO2RsZW48bGVuO2RsZW4rKykgeworCQlxc21jbS0+cXNtY21fdHJhbnJhbVtpK2RsZW5dID0gYnVmZmVyW2RsZW5dOyAvKiBXUklURSBtZW1vcnkgYXJyYXkgKi8KKwl9CisJLyogdHJhbnNtaXQgaXQgKi8KKwlzcGlfeGZlcihpK2RsZW4pOworCS8qIGlnbm9yZSByZWNlaXZlZCBkYXRhCSovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlxc21jbS0+cXNtY21fdHJhbnJhbVswXSA9ICBTUElfRUVQUk9NX1JEU1I7IC8qIHJlYWQgc3RhdHVzICovCisJCXFzbWNtLT5xc21jbV90cmFucmFtWzFdID0gMDsKKwkJc3BpX3hmZXIoMik7CisJCWlmICghKHFzbWNtLT5xc21jbV9yZWNyYW1bMV0gJiAxKSkgeworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMDApOworCX0KKwlpZiAoaSA+PSAxMDAwKSB7CisJCXByaW50ZiAoIioqKiBzcGlfd3JpdGU6IFRpbWUgb3V0IHdoaWxlIHdyaXRpbmchXG4iKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworI2RlZmluZSBUUkFOU0ZFUl9MRU4gMTYKKworc3NpemVfdCBzcGlfd3JpdGUgKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgaW5kZXgsaSxuZXdsZW47CisJdWNoYXIgbmV3YWRkclsyXTsKKwlpbnQgY3VycmFkZHI7CisKKwljdXJyYWRkcj0oYWRkclthbGVuLTJdPDw4KSthZGRyW2FsZW4tMV07CisJaT1sZW47CisJaW5kZXg9MDsKKwlkbyB7CisJCW5ld2FkZHJbMV09KGN1cnJhZGRyICYgMHhmZik7CisJCW5ld2FkZHJbMF09KChjdXJyYWRkcj4+OCkgJiAweGZmKTsKKwkJaWYoaT5UUkFOU0ZFUl9MRU4pIHsKKwkJCW5ld2xlbj1UUkFOU0ZFUl9MRU47CisJCQlpLT1UUkFOU0ZFUl9MRU47CisJCX0KKwkJZWxzZSB7CisJCQluZXdsZW49aTsKKwkJCWk9MDsKKwkJfQorCQlzaG9ydF9zcGlfd3JpdGUgKG5ld2FkZHIsIDIsICZidWZmZXJbaW5kZXhdLCBuZXdsZW4pOworCQlpbmRleCs9bmV3bGVuOworCQljdXJyYWRkcis9bmV3bGVuOworCX13aGlsZShpKTsKKwlyZXR1cm4gKGxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRnVuY3Rpb246ICAgIHNwaV9yZWFkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3NpemVfdCBzaG9ydF9zcGlfcmVhZCAodWNoYXIgKmFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbXI7CisJdm9sYXRpbGUgcXNtY201eHhfdCAqcXNtY207CisKKwlpbW1yID0gKGltbWFwX3QgKikgIENPTkZJR19TWVNfSU1NUjsKKwlxc21jbSA9IChxc21jbTV4eF90ICopJmltbXItPmltX3FzbWNtOworCisJZm9yKGk9MDtpPDMyO2krKykgeworCQkgcXNtY20tPnFzbWNtX3JlY3JhbVtpXT0weDAwMDA7CisJCSBxc21jbS0+cXNtY21fdHJhbnJhbVtpXT0weDAwMDA7CisJCSBxc21jbS0+cXNtY21fY29tZHJhbVtpXT0weDAwOworCX0KKwlpPTA7CisJcXNtY20tPnFzbWNtX3RyYW5yYW1baSsrXSA9IChTUElfRUVQUk9NX1JFQUQpOyAvKiBSRUFEIG1lbW9yeSBhcnJheSAqLworCXFzbWNtLT5xc21jbV90cmFucmFtW2krK10gPSBhZGRyWzBdICYgMHhmZjsKKwlxc21jbS0+cXNtY21fdHJhbnJhbVtpKytdID0gYWRkclsxXSAmIDB4ZmY7CisJc3BpX3hmZXIoMyArIGxlbik7CisJZm9yKGk9MDtpPGxlbjtpKyspIHsKKwkJKmJ1ZmZlcisrPShjaGFyKXFzbWNtLT5xc21jbV9yZWNyYW1baSszXTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3NpemVfdCBzcGlfcmVhZCAodWNoYXIgKmFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBpbmRleCxpLG5ld2xlbjsKKwl1Y2hhciBuZXdhZGRyWzJdOworCWludCBjdXJyYWRkcjsKKworCWN1cnJhZGRyPShhZGRyW2FsZW4tMl08PDgpK2FkZHJbYWxlbi0xXTsKKwlpPWxlbjsKKwlpbmRleD0wOworCWRvIHsKKwkJbmV3YWRkclsxXT0oY3VycmFkZHIgJiAweGZmKTsKKwkJbmV3YWRkclswXT0oKGN1cnJhZGRyPj44KSAmIDB4ZmYpOworCQlpZihpPlRSQU5TRkVSX0xFTikgeworCQkJbmV3bGVuPVRSQU5TRkVSX0xFTjsKKwkJCWktPVRSQU5TRkVSX0xFTjsKKwkJfQorCQllbHNlIHsKKwkJCW5ld2xlbj1pOworCQkJaT0wOworCQl9CisJCXNob3J0X3NwaV9yZWFkIChuZXdhZGRyLCAyLCAmYnVmZmVyW2luZGV4XSwgbmV3bGVuKTsKKwkJaW5kZXgrPW5ld2xlbjsKKwkJY3VycmFkZHIrPW5ld2xlbjsKKwl9d2hpbGUoaSk7CisJcmV0dXJuIChsZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEZ1bmN0aW9uOiAgICBzcGlfeGZlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3NzaXplX3Qgc3BpX3hmZXIgKHNpemVfdCBjb3VudCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yOworCXZvbGF0aWxlIHFzbWNtNXh4X3QgKnFzbWNtOworCWludCBpOworCWludCB0bTsKKwl1c2hvcnQgc3RhdHVzOworCWltbXIgPSAoaW1tYXBfdCAqKSAgQ09ORklHX1NZU19JTU1SOworCXFzbWNtID0gKHFzbWNtNXh4X3QgKikmaW1tci0+aW1fcXNtY207CisJRFBSSU5UICgoIioqKiBzcGlfeGZlciBlbnRlcmVkIGNvdW50ICVkKioqXG4iLGNvdW50KSk7CisKKwkvKiBTZXQgQ1MgZm9yIGRldmljZSAqLworCWZvcihpPTA7aTwoY291bnQtMSk7aSsrKQorCQlxc21jbS0+cXNtY21fY29tZHJhbVtpXSA9IDB4ODAgfCBDT05GSUdfU1lTX1NQSV9DU19BQ1Q7ICAvKiBDUzMgaXMgY29ubmVjdGVkIHRvIHRoZSBTUEkgRUVQUk9NICovCisKKwlxc21jbS0+cXNtY21fY29tZHJhbVtpXSA9IENPTkZJR19TWVNfU1BJX0NTX0FDVDsgLyogQ1MzIGlzIGNvbm5lY3RlZCB0byB0aGUgU1BJIEVFUFJPTSAqLworCXFzbWNtLT5xc21jbV9zcGNyMj0oKGNvdW50LTEpJjB4MUYpPDw4OworCisJRFBSSU5UICgoIioqKiBzcGlfeGZlcjogQnl0ZXMgdG8gYmUgeGZlcnJlZDogJWQgKioqXG4iLCBjb3VudCkpOworCisJcXNtY20tPnFzbWNtX3Nwc3I9MHhFMDsgLyogY2xlYXIgYWxsIGZsYWdzICovCisKKwkvKiBzdGFydCBzcGkgdHJhbnNmZXIgKi8KKwlEUFJJTlQgKCgiKioqIHNwaV94ZmVyOiBQZXJmb3JtaW5nIHRyYW5zZmVyIC4uLlxuIikpOworCXFzbWNtLT5xc21jbV9zcGNyMSB8PSAweDgwMDA7CQkvKiBTdGFydCB0cmFuc21pdCAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBXYWl0IGZvciBTUEkgdHJhbnNtaXQgdG8gZ2V0IG91dAorCSAqIG9yIHRpbWUgb3V0ICgxIHNlY29uZCA9IDEwMDAgbXMpCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlmb3IgKHRtPTA7IHRtPDEwMDA7ICsrdG0pIHsKKwkJc3RhdHVzPXFzbWNtLT5xc21jbV9zcGNyMTsKKwkJaWYoKHN0YXR1cyAmIDB4ODAwMCk9PTApCisJCQlicmVhazsKKwkJdWRlbGF5ICgxMDAwKTsKKwl9CisJaWYgKHRtID49IDEwMDApIHsKKwkJcHJpbnRmICgiKioqIHNwaV94ZmVyOiBUaW1lIG91dCB3aGlsZSB4ZmVycmluZyB0by9mcm9tIFNQSSFcbiIpOworCX0KKyNpZmRlZglERUJVRworCXByaW50ZiAoIlxuc3BpX3hmZXI6IHR4YnVmIGFmdGVyIHhmZXJcbiIpOworCW1lbWR1bXAgKCh2b2lkICopIHFzbWNtLT5xc21jbV90cmFucmFtLCAzMik7CS8qIGR1bXAgb2YgdHhidWYgYmVmb3JlIHRyYW5zbWl0ICovCisJcHJpbnRmICgic3BpX3hmZXI6IHJ4YnVmIGFmdGVyIHhmZXJcbiIpOworCW1lbWR1bXAgKCh2b2lkICopIHFzbWNtLT5xc21jbV9yZWNyYW0sIDMyKTsJLyogZHVtcCBvZiByeGJ1ZiBhZnRlciB0cmFuc21pdCAqLworCXByaW50ZiAoIlxuc3BpX3hmZXI6IGNvbW1idWYgYWZ0ZXIgeGZlclxuIik7CisJbWVtZHVtcCAoKHZvaWQgKikgcXNtY20tPnFzbWNtX2NvbWRyYW0sIDMyKTsJLyogZHVtcCBvZiB0eGJ1ZiBiZWZvcmUgdHJhbnNtaXQgKi8KKwlwcmludGYgKCJcbiIpOworI2VuZGlmCisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfU1BJICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvc3RhcnQuUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmODc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3N0YXJ0LlMKQEAgLTAsMCArMSw1NzYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4CURhbiBNYWxlayA8ZG1hbGVrQGpsYy5uZXQ+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5CU1hZ251cyBEYW1tIDxraWVyYXlwYzAxLnAueS5raWUuZXJhLmVyaWNzc29uLnNlPgorICogIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICogIENvcHlyaWdodCAoQykgMjAwMyAgTWFydGluIFdpbmlzdG9lcmZlciwgbWFydGlud2luaXN0b2VyZmVyQGdteC5jaC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogRmlsZToJCXN0YXJ0LlMKKyAqCisgKiBEaXNjcmlwdGlvbjoJCXN0YXJ0dXAgY29kZQorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjNXh4Lmg+CisjaW5jbHVkZSA8dGltZXN0YW1wLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorCisjZGVmaW5lIENPTkZJR181eHggMQkJLyogbmVlZGVkIGZvciBMaW51eCBrZXJuZWwgaGVhZGVyIGZpbGVzICovCisjZGVmaW5lIF9MSU5VWF9DT05GSUdfSCAxCS8qIGF2b2lkIHJlYWRpbmcgTGludXggYXV0b2NvbmYuaCBmaWxlCSovCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2lmbmRlZiAgQ09ORklHX0lERU5UX1NUUklORworI2RlZmluZSAgQ09ORklHX0lERU5UX1NUUklORyAiIgorI2VuZGlmCisKKy8qIFdlIGRvbid0IGhhdmUgYSBNTVUuCisqLworI3VuZGVmCU1TUl9LRVJORUwKKyNkZWZpbmUgTVNSX0tFUk5FTCAoIE1TUl9NRSB8IE1TUl9SSSApCQkvKiBNYWNoaW5lIENoZWNrIGFuZCBSZWNvdmVyYWJsZSBJbnRlcnIuICovCisKKy8qCisgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCisgKgorICogVXNlIHIxMiB0byBhY2Nlc3MgdGhlIEdPVAorICovCisJU1RBUlRfR09UCisJR09UX0VOVFJZKF9HT1QyX1RBQkxFXykKKwlHT1RfRU5UUlkoX0ZJWFVQX1RBQkxFXykKKworCUdPVF9FTlRSWShfc3RhcnQpCisJR09UX0VOVFJZKF9zdGFydF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWShfZW5kX29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKHRyYW5zZmVyX3RvX2hhbmRsZXIpCisKKwlHT1RfRU5UUlkoX19pbml0X2VuZCkKKwlHT1RfRU5UUlkoX2VuZCkKKwlHT1RfRU5UUlkoX19ic3Nfc3RhcnQpCisJRU5EX0dPVAorCisvKgorICogcjMgLSAxc3QgYXJnIHRvIGJvYXJkX2luaXQoKTogSU1NUCBwb2ludGVyCisgKiByNCAtIDJuZCBhcmcgdG8gYm9hcmRfaW5pdCgpOiBib290IGZsYWcKKyAqLworCS50ZXh0CisJLmxvbmcJMHgyNzA1MTk1NgkJCS8qIFUtQm9vdCBNYWdpYyBOdW1iZXIgKi8KKwkuZ2xvYmwJdmVyc2lvbl9zdHJpbmcKK3ZlcnNpb25fc3RyaW5nOgorCS5hc2NpaSBVX0JPT1RfVkVSU0lPTgorCS5hc2NpaSAiICgiLCBVX0JPT1RfREFURSwgIiAtICIsIFVfQk9PVF9USU1FLCAiKSIKKwkuYXNjaWkgQ09ORklHX0lERU5UX1NUUklORywgIlwwIgorCisJLiA9IEVYQ19PRkZfU1lTX1JFU0VUCisJLmdsb2JsCV9zdGFydAorX3N0YXJ0OgorCW1mc3ByCXIzLCA2MzgKKwlsaQlyNCwgQ09ORklHX1NZU19JU0IJCQkvKiBTZXQgSVNCIGJpdCAqLworCW9yCXIzLCByMywgcjQKKwltdHNwcgk2MzgsIHIzCisJbGkJcjIxLCBCT09URkxBR19DT0xECQkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSAkqLworCWIJYm9vdF9jb2xkCisKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQgKyAweDIwCisKKwkuZ2xvYmwJX3N0YXJ0X3dhcm0KK19zdGFydF93YXJtOgorCWxpCXIyMSwgQk9PVEZMQUdfV0FSTQkJLyogU29mdHdhcmUgcmVib290ICovCisJYglib290X3dhcm0KKworYm9vdF9jb2xkOgorYm9vdF93YXJtOgorCisJLyogSW5pdGlhbGl6ZSBtYWNoaW5lIHN0YXR1czsgZW5hYmxlIG1hY2hpbmUgY2hlY2sgaW50ZXJydXB0CQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGkJcjMsIE1TUl9LRVJORUwJCQkvKiBTZXQgTUUsIFJJIGZsYWdzICovCisJbXRtc3IJcjMKKwltdHNwcglTUlIxLCByMwkJCS8qIE1ha2UgU1JSMSBtYXRjaCBNU1IgKi8KKworCS8qIEluaXRpYWxpemUgZGVidWcgcG9ydCByZWdpc3RlcnMJCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwl4b3IJcjAsIHIwLCByMAkJCS8qIENsZWFyIFIwICovCisJbXRzcHIJTENUUkwxLCByMAkJCS8qIEluaXRpYWxpemUgZGVidWcgcG9ydCByZWdzICovCisJbXRzcHIJTENUUkwyLCByMAorCW10c3ByCUNPVU5UQSwgcjAKKwltdHNwcglDT1VOVEIsIHIwCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQVRJKQorCS8qIHRoZSBleHRlcm5hbCBmbGFzaCBhY2Nlc3Mgb24gUEFUSSBmYWlscyBpZiBwcm9ncmFtbWluZyB0aGUgUExMIHRvIDQwTUh6LgorCSAqIENvcHkgdGhlIFBMTCBwcm9ncmFtbWluZyBjb2RlIHRvIHRoZSBpbnRlcm5hbCBSQU0gYW5kIGV4ZWN1dGUgaXQKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpcwlyMywgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGwKKwlhZGRpCXIzLCByMywgcGxsX3Byb2dfY29kZV9zdGFydCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisKKwlsaXMJcjQsIENPTkZJR19TWVNfSU5JVF9SQU1fQUREUkBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JTklUX1JBTV9BRERSQGwKKwltdGxyCXI0CisJYWRkaXMJcjUsMCwweDAKKwlvcmkJcjUscjUsKChwbGxfcHJvZ19jb2RlX2VuZCAtIHBsbF9wcm9nX2NvZGVfc3RhcnQpID4+MikKKwltdGN0cglyNQorCWFkZGkJcjMsIHIzLCAtNAorCWFkZGkJcjQsIHI0LCAtNAorMDoKKwlsd3p1CXIwLDQocjMpCisJc3R3dQlyMCw0KHI0KQorCWJkbnoJMGIgICAgICAgICAgICAgICAgLyogY29weSBsb29wICovCisJYmxybAorI2VuZGlmCisKKwkvKgorCSAqIENhbGN1bGF0ZSBhYnNvbHV0ZSBhZGRyZXNzIGluIEZMQVNIIGFuZCBqdW1wIHRoZXJlCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpcwlyMywgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGwKKwlhZGRpCXIzLCByMywgaW5fZmxhc2ggLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCW10bHIJcjMKKwlibHIKKworaW5fZmxhc2g6CisKKwkvKiBJbml0aWFsaXplIHNvbWUgU1BScyB0aGF0IGFyZSBoYXJkIHRvIGFjY2VzcyBmcm9tIEMJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaXMgICAgIHIzLCBDT05GSUdfU1lTX0lNTVJAaAkJCS8qIFBhc3MgSU1NUiBhcyBhcmcxIHRvIEMgcm91dGluZSAqLworCWxpcwlyMiwgQ09ORklHX1NZU19JTklUX1NQX0FERFJAaAorCW9yaQlyMSwgcjIsIENPTkZJR19TWVNfSU5JVF9TUF9BRERSQGwJLyogU2V0IHVwIHRoZSBzdGFjayBpbiBpbnRlcm5hbCBTUkFNICovCisJLyogTm90ZTogUjAgaXMgc3RpbGwgMCBoZXJlICovCisJc3R3dQlyMCwgLTQocjEpCQkJLyogQ2xlYXIgZmluYWwgc3RhY2sgZnJhbWUgc28gdGhhdAkqLworCXN0d3UJcjAsIC00KHIxKQkJCS8qIHN0YWNrIGJhY2t0cmFjZXMgdGVybWluYXRlIGNsZWFubHkJKi8KKworCS8qCisJICogRGlzYWJsZSBzZXJpYWxpemVkIGlmZXRjaCBhbmQgc2hvdyBjeWNsZXMKKwkgKiAoaS5lLiBzZXQgcHJvY2Vzc29yIHRvIG5vcm1hbCBtb2RlKSBmb3IgbWF4aW11bQorCSAqIHBlcmZvcm1hbmNlLgorCSAqLworCisJbGkJcjIsIDB4MDAwNworCW10c3ByCUlDVFJMLCByMgorCisJLyogU2V0IHVwIGRlYnVnIG1vZGUgZW50cnkgKi8KKworCWxpcwlyMiwgQ09ORklHX1NZU19ERVJAaAorCW9yaQlyMiwgcjIsIENPTkZJR19TWVNfREVSQGwKKwltdHNwcglERVIsIHIyCisKKwkvKiBMZXQgdGhlIEMtY29kZSBzZXQgdXAgdGhlIHJlc3QJCQkJCSovCisJLyoJCQkJCQkJCQkqLworCS8qIEJlIGNhcmVmdWwgdG8ga2VlcCBjb2RlIHJlbG9jYXRhYmxlICEJCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJR0VUX0dPVAkJCS8qIGluaXRpYWxpemUgR09UIGFjY2VzcwkJCSovCisKKwkvKiByMzogSU1NUiAqLworCWJsCWNwdV9pbml0X2YJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlICAgICAoZnJvbSBGbGFzaCkJKi8KKworCW1yCXIzLCByMjEKKwkvKiByMzogQk9PVEZMQUcgKi8KKwlibAlib2FyZF9pbml0X2YJLyogcnVuIDFzdCBwYXJ0IG9mIGJvYXJkIGluaXQgY29kZSAoZnJvbSBGbGFzaCkgKi8KKworCisJLmdsb2JsCV9zdGFydF9vZl92ZWN0b3JzCitfc3RhcnRfb2ZfdmVjdG9yczoKKworLyogTWFjaGluZSBjaGVjayAqLworCVNURF9FWENFUFRJT04oMHgyMDAsIE1hY2hpbmVDaGVjaywgTWFjaGluZUNoZWNrRXhjZXB0aW9uKQorCisvKiBEYXRhIFN0b3JhZ2UgZXhjZXB0aW9uLiAgIk5ldmVyIiBnZW5lcmF0ZWQgb24gdGhlIDg2MC4gKi8KKwlTVERfRVhDRVBUSU9OKDB4MzAwLCBEYXRhU3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogSW5zdHJ1Y3Rpb24gU3RvcmFnZSBleGNlcHRpb24uICAiTmV2ZXIiIGdlbmVyYXRlZCBvbiB0aGUgODYwLiAqLworCVNURF9FWENFUFRJT04oMHg0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg1MDAsIEV4dEludGVycnVwdCwgZXh0ZXJuYWxfaW50ZXJydXB0KQorCisvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLworCS4gPSAweDYwMAorQWxpZ25tZW50OgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwltZnNwcglyNCxEQVIKKwlzdHcJcjQsX0RBUihyMjEpCisJbWZzcHIJcjUsRFNJU1IKKwlzdHcJcjUsX0RTSVNSKHIyMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRVhDX1hGRVJfVEVNUExBVEUoQWxpZ25tZW50LCBBbGlnbm1lbnRFeGNlcHRpb24sIE1TUl9LRVJORUwsIENPUFlfRUUpCisKKy8qIFByb2dyYW0gY2hlY2sgZXhjZXB0aW9uICovCisJLiA9IDB4NzAwCitQcm9ncmFtQ2hlY2s6CisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlFWENfWEZFUl9URU1QTEFURShQcm9ncmFtQ2hlY2ssIFByb2dyYW1DaGVja0V4Y2VwdGlvbiwKKwkJTVNSX0tFUk5FTCwgQ09QWV9FRSkKKworCS8qIEZQVSBvbiBNUEM1eHggYXZhaWxhYmxlLiBXZSB3aWxsIHVzZSBpdCBsYXRlci4KKwkqLworCVNURF9FWENFUFRJT04oMHg4MDAsIEZQVW5hdmFpbGFibGUsIFVua25vd25FeGNlcHRpb24pCisKKwkvKiBJIGd1ZXNzIHdlIGNvdWxkIGltcGxlbWVudCBkZWNyZW1lbnRlciwgYW5kIG1heSBoYXZlCisJICogdG8gc29tZWRheSBmb3IgdGltZWtlZXBpbmcuCisJICovCisJU1REX0VYQ0VQVElPTigweDkwMCwgRGVjcmVtZW50ZXIsIHRpbWVyX2ludGVycnVwdCkKKwlTVERfRVhDRVBUSU9OKDB4YTAwLCBUcmFwXzBhLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhiMDAsIFRyYXBfMGIsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGMwMCwgU3lzdGVtQ2FsbCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4ZDAwLCBTaW5nbGVTdGVwLCBVbmtub3duRXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTigweGUwMCwgVHJhcF8wZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4ZjAwLCBUcmFwXzBmLCBVbmtub3duRXhjZXB0aW9uKQorCisJLyogT24gdGhlIE1QQzh4eCwgdGhpcyBpcyBhIHNvZnR3YXJlIGVtdWxhdGlvbiBpbnRlcnJ1cHQuICBJdCBvY2N1cnMKKwkgKiBmb3IgYWxsIHVuaW1wbGVtZW50ZWQgYW5kIGlsbGVnYWwgaW5zdHJ1Y3Rpb25zLgorCSAqLworCVNURF9FWENFUFRJT04oMHgxMDAwLCBTb2Z0RW11LCBTb2Z0RW11RXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxMTAwLCBJbnN0cnVjdGlvblRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDEyMDAsIERhdGFUTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxMzAwLCBJbnN0cnVjdGlvblRMQkVycm9yLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxNDAwLCBEYXRhVExCRXJyb3IsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKDB4MTUwMCwgUmVzZXJ2ZWQ1LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxNjAwLCBSZXNlcnZlZDYsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE3MDAsIFJlc2VydmVkNywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTgwMCwgUmVzZXJ2ZWQ4LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxOTAwLCBSZXNlcnZlZDksIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFhMDAsIFJlc2VydmVkQSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWIwMCwgUmVzZXJ2ZWRCLCBVbmtub3duRXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTigweDFjMDAsIERhdGFCcmVha3BvaW50LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxZDAwLCBJbnN0cnVjdGlvbkJyZWFrcG9pbnQsIERlYnVnRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxZTAwLCBQZXJpcGhlcmFsQnJlYWtwb2ludCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWYwMCwgRGV2UG9ydEJyZWFrcG9pbnQsIFVua25vd25FeGNlcHRpb24pCisKKworCS5nbG9ibAlfZW5kX29mX3ZlY3RvcnMKK19lbmRfb2ZfdmVjdG9yczoKKworCisJLiA9IDB4MjAwMAorCisvKgorICogVGhpcyBjb2RlIGZpbmlzaGVzIHNhdmluZyB0aGUgcmVnaXN0ZXJzIHRvIHRoZSBleGNlcHRpb24gZnJhbWUKKyAqIGFuZCBqdW1wcyB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAqIFJlZ2lzdGVyIHIyMSBpcyBwb2ludGVyIGludG8gdHJhcCBmcmFtZSwgcjEgaGFzIG5ldyBzdGFjayBwb2ludGVyLgorICovCisJLmdsb2JsCXRyYW5zZmVyX3RvX2hhbmRsZXIKK3RyYW5zZmVyX3RvX2hhbmRsZXI6CisJc3R3CXIyMixfTklQKHIyMSkKKwlsaXMJcjIyLE1TUl9QT1dAaAorCWFuZGMJcjIzLHIyMyxyMjIKKwlzdHcJcjIzLF9NU1IocjIxKQorCVNBVkVfR1BSKDcsIHIyMSkKKwlTQVZFXzRHUFJTKDgsIHIyMSkKKwlTQVZFXzhHUFJTKDEyLCByMjEpCisJU0FWRV84R1BSUygyNCwgcjIxKQorCW1mbHIJcjIzCisJYW5kaS4JcjI0LHIyMywweDNmMDAJCS8qIGdldCB2ZWN0b3Igb2Zmc2V0ICovCisJc3R3CXIyNCxUUkFQKHIyMSkKKwlsaQlyMjIsMAorCXN0dwlyMjIsUkVTVUxUKHIyMSkKKwltdHNwcglTUFJHMixyMjIJCS8qIHIxIGlzIG5vdyBrZXJuZWwgc3AgKi8KKwlsd3oJcjI0LDAocjIzKQkJLyogdmlydHVhbCBhZGRyZXNzIG9mIGhhbmRsZXIgKi8KKwlsd3oJcjIzLDQocjIzKQkJLyogd2hlcmUgdG8gZ28gd2hlbiBkb25lICovCisJbXRzcHIJU1JSMCxyMjQKKwltdHNwcglTUlIxLHIyMAorCW10bHIJcjIzCisJU1lOQworCXJmaQkJCQkvKiBqdW1wIHRvIGhhbmRsZXIsIGVuYWJsZSBNTVUgKi8KKworaW50X3JldHVybjoKKwltZm1zcglyMjgJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjI4CisJU1lOQworCWx3eglyMixfQ1RSKHIxKQorCWx3eglyMCxfTElOSyhyMSkKKwltdGN0cglyMgorCW10bHIJcjAKKwlsd3oJcjIsX1hFUihyMSkKKwlsd3oJcjAsX0NDUihyMSkKKwltdHNwcglYRVIscjIKKwltdGNyZgkweEZGLHIwCisJUkVTVF8xMEdQUlMoMywgcjEpCisJUkVTVF8xMEdQUlMoMTMsIHIxKQorCVJFU1RfOEdQUlMoMjMsIHIxKQorCVJFU1RfR1BSKDMxLCByMSkKKwlsd3oJcjIsX05JUChyMSkJCS8qIFJlc3RvcmUgZW52aXJvbm1lbnQgKi8KKwlsd3oJcjAsX01TUihyMSkKKwltdHNwcglTUlIwLHIyCisJbXRzcHIJU1JSMSxyMAorCWx3eglyMCxHUFIwKHIxKQorCWx3eglyMixHUFIyKHIxKQorCWx3eglyMSxHUFIxKHIxKQorCVNZTkMKKwlyZmkKKworCisvKgorICogdW5zaWduZWQgaW50IGdldF9pbW1yICh1bnNpZ25lZCBpbnQgbWFzaykKKyAqCisgKiByZXR1cm4gKG1hc2sgPyAoSU1NUiAmIG1hc2spIDogSU1NUik7CisgKi8KKwkuZ2xvYmwJZ2V0X2ltbXIKK2dldF9pbW1yOgorCW1yCXI0LHIzCQkvKiBzYXZlIG1hc2sgKi8KKwltZnNwcglyMywgSU1NUgkvKiBJTU1SICovCisJY21wd2kJMCxyNCwwCQkvKiBtYXNrICE9IDAgPyAqLworCWJlcQk0ZgorCWFuZAlyMyxyMyxyNAkvKiBJTU1SICYgbWFzayAqLworNDoKKwlibHIKKworCS5nbG9ibCBnZXRfcHZyCitnZXRfcHZyOgorCW1mc3ByCXIzLCBQVlIKKwlibHIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiB2b2lkIHJlbG9jYXRlX2NvZGUgKGFkZHJfc3AsIGdkLCBhZGRyX21vbmkpCisgKgorICogVGhpcyAiZnVuY3Rpb24iIGRvZXMgbm90IHJldHVybiwgaW5zdGVhZCBpdCBjb250aW51ZXMgaW4gUkFNCisgKiBhZnRlciByZWxvY2F0aW5nIHRoZSBtb25pdG9yIGNvZGUuCisgKgorICogcjMgPSBkZXN0CisgKiByNCA9IHNyYworICogcjUgPSBsZW5ndGggaW4gYnl0ZXMKKyAqIHI2ID0gY2FjaGVsaW5lc2l6ZQorICovCisJLmdsb2JsCXJlbG9jYXRlX2NvZGUKK3JlbG9jYXRlX2NvZGU6CisJbXIJcjEsICByMwkJLyogU2V0IG5ldyBzdGFjayBwb2ludGVyIGluIFNSQU0JKi8KKwltcglyOSwgIHI0CQkvKiBTYXZlIGNvcHkgb2YgZ2xvYmFsIGRhdGEgcG9pbnRlciBpbiBTUkFNICovCisJbXIJcjEwLCByNQkJLyogU2F2ZSBjb3B5IG9mIG1vbml0b3IgZGVzdGluYXRpb24gQWRkcmVzcyBpbiBTUkFNICovCisKKwlHRVRfR09UCisJbXIJcjMsICByNQkJCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisJbGlzCXI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWx3eglyNSwgR09UKF9faW5pdF9lbmQpCisJc3ViCXI1LCByNSwgcjQKKworCS8qCisJICogRml4IEdPVCBwb2ludGVyOgorCSAqCisJICogTmV3IEdPVC1QVFIgPSAob2xkIEdPVC1QVFIgLSBDT05GSUdfU1lTX01PTklUT1JfQkFTRSkgKyBEZXN0aW5hdGlvbiBBZGRyZXNzCisJICoKKwkgKiBPZmZzZXQ6CisJICovCisJc3ViCXIxNSwgcjEwLCByNAorCisJLyogRmlyc3Qgb3VyIG93biBHT1QgKi8KKwlhZGQJcjEyLCByMTIsIHIxNQorCS8qIHRoZSB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLworCWFkZAlyMzAsIHIzMCwgcjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisKKwljbXBsdwljcjEscjMscjQKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJYmVxCWNyMSw0ZgkJLyogSW4gcGxhY2UgY29weSBpcyBub3QgbmVjZXNzYXJ5CSovCisJYmVxCTRmCQkvKiBQcm90ZWN0IGFnYWluc3QgMCBjb3VudAkJKi8KKwltdGN0cglyMAorCWJnZQljcjEsMmYKKworCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisJYgk0ZgorCisyOglzbHdpCXIwLHIwLDIKKwlhZGQJcjgscjQscjAKKwlhZGQJcjcscjMscjAKKzM6CWx3enUJcjAsLTQocjgpCisJc3R3dQlyMCwtNChyNykKKwliZG56CTNiCisKKzQ6CXN5bmMKKwlpc3luYworCisvKgorICogV2UgYXJlIGRvbmUuIERvIG5vdCByZXR1cm4sIGluc3RlYWQgYnJhbmNoIHRvIHNlY29uZCBwYXJ0IG9mIGJvYXJkCisgKiBpbml0aWFsaXphdGlvbiwgbm93IHJ1bm5pbmcgZnJvbSBSQU0uCisgKi8KKworCWFkZGkJcjAsIHIxMCwgaW5fcmFtIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwltdGxyCXIwCisJYmxyCisKK2luX3JhbToKKworCS8qCisJICogUmVsb2NhdGlvbiBGdW5jdGlvbiwgcjEyIHBvaW50IHRvIGdvdDIrMHg4MDAwCisJICoKKwkgKiBBZGp1c3QgZ290MiBwb2ludGVycywgbm8gbmVlZCB0byBjaGVjayBmb3IgMCwgdGhpcyBjb2RlCisJICogYWxyZWFkeSBwdXRzIGEgZmV3IGVudHJpZXMgaW4gdGhlIHRhYmxlLgorCSAqLworCWxpCXIwLF9fZ290Ml9lbnRyaWVzQHNlY3RvZmZAbAorCWxhCXIzLEdPVChfR09UMl9UQUJMRV8pCisJbHd6CXIxMSxHT1QoX0dPVDJfVEFCTEVfKQorCW10Y3RyCXIwCisJc3ViCXIxMSxyMyxyMTEKKwlhZGRpCXIzLHIzLC00CisxOglsd3p1CXIwLDQocjMpCisJY21wd2kJcjAsMAorCWJlcS0JMmYKKwlhZGQJcjAscjAscjExCisJc3R3CXIwLDAocjMpCisyOgliZG56CTFiCisKKwkvKgorCSAqIE5vdyBhZGp1c3QgdGhlIGZpeHVwcyBhbmQgdGhlIHBvaW50ZXJzIHRvIHRoZSBmaXh1cHMKKwkgKiBpbiBjYXNlIHdlIG5lZWQgdG8gbW92ZSBvdXJzZWx2ZXMgYWdhaW4uCisJICovCisJbGkJcjAsX19maXh1cF9lbnRyaWVzQHNlY3RvZmZAbAorCWx3eglyMyxHT1QoX0ZJWFVQX1RBQkxFXykKKwljbXB3aQlyMCwwCisJbXRjdHIJcjAKKwlhZGRpCXIzLHIzLC00CisJYmVxCTRmCiszOglsd3p1CXI0LDQocjMpCisJbHd6dXgJcjAscjQscjExCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMTAsMChyMykKKwlzdHcJcjAsMChyNCkKKwliZG56CTNiCis0OgorY2xlYXJfYnNzOgorCS8qCisJICogTm93IGNsZWFyIEJTUyBzZWdtZW50CisJICovCisJbHd6CXIzLEdPVChfX2Jzc19zdGFydCkKKwlsd3oJcjQsR09UKF9lbmQpCisJY21wbHcJMCwgcjMsIHI0CisJYmVxCTZmCisKKwlsaQlyMCwgMAorNToKKwlzdHcJcjAsIDAocjMpCisJYWRkaQlyMywgcjMsIDQKKwljbXBsdwkwLCByMywgcjQKKwlibmUJNWIKKzY6CisKKwltcglyMywgcjkJCS8qIEdsb2JhbCBEYXRhIHBvaW50ZXIJCSovCisJbXIJcjQsIHIxMAkJLyogRGVzdGluYXRpb24gQWRkcmVzcwkJKi8KKwlibAlib2FyZF9pbml0X3IKKworCS8qCisJICogQ29weSBleGNlcHRpb24gdmVjdG9yIGNvZGUgdG8gbG93IG1lbW9yeQorCSAqCisJICogcjM6IGRlc3RfYWRkcgorCSAqIHI3OiBzb3VyY2UgYWRkcmVzcywgcjg6IGVuZCBhZGRyZXNzLCByOTogdGFyZ2V0IGFkZHJlc3MKKwkgKi8KKwkuZ2xvYmwJdHJhcF9pbml0Cit0cmFwX2luaXQ6CisJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlcgkJKi8KKwlHRVRfR09UCisJbHd6CXI3LCBHT1QoX3N0YXJ0KQorCWx3eglyOCwgR09UKF9lbmRfb2ZfdmVjdG9ycykKKworCWxpCXI5LCAweDEwMAkJLyogcmVzZXQgdmVjdG9yIGFsd2F5cyBhdCAweDEwMCAqLworCisJY21wbHcJMCwgcjcsIHI4CisJYmdlbHIJCQkJLyogcmV0dXJuIGlmIHI3Pj1yOCAtIGp1c3QgaW4gY2FzZSAqLworMToKKwlsd3oJcjAsIDAocjcpCisJc3R3CXIwLCAwKHI5KQorCWFkZGkJcjcsIHI3LCA0CisJYWRkaQlyOSwgcjksIDQKKwljbXBsdwkwLCByNywgcjgKKwlibmUJMWIKKworCS8qCisJICogcmVsb2NhdGUgYGhkbHInIGFuZCBgaW50X3JldHVybicgZW50cmllcworCSAqLworCWxpCXI3LCAuTF9NYWNoaW5lQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBBbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMjoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJMmIKKworCWxpCXI3LCAuTF9BbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9Qcm9ncmFtQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgU3lzdGVtQ2FsbCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCiszOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkzYgorCisJbGkJcjcsIC5MX1NpbmdsZVN0ZXAgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorNDoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJNGIKKworCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIJKi8KKwlibHIKKworI2lmIGRlZmluZWQoQ09ORklHX1BBVEkpCisvKiBQcm9ncmFtIHRoZSBQTEwgKi8KK3BsbF9wcm9nX2NvZGVfc3RhcnQ6CisJbGlzCXI0LCAoQ09ORklHX1NZU19JTU1SICsgMHgwMDJmYzM4NClAaAorCW9yaQlyNCwgcjQsIChDT05GSUdfU1lTX0lNTVIgKyAweDAwMmZjMzg0KUBsCisJbGlzCXIzLCAoMHg1NWNjYWEzMylAaAorCW9yaQlyMywgcjMsICgweDU1Y2NhYTMzKUBsCisJc3R3CXIzLCAwKHI0KQorCWxpcwlyNCwgKENPTkZJR19TWVNfSU1NUiArIDB4MDAyZmMyODQpQGgKKwlvcmkJcjQsIHI0LCAoQ09ORklHX1NZU19JTU1SICsgMHgwMDJmYzI4NClAbAorCWxpcwlyMywgQ09ORklHX1NZU19QTFBSQ1JAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfUExQUkNSQGwKKwlzdHcJcjMsIDAocjQpCisJYWRkaXMJcjMsMCwweDAKKwlvcmkJcjMscjMsMHhBMDAwCisJbXRjdHIJcjMKKy4uc3BpbmxwOgorICBiZG56ICAgIC4uc3BpbmxwICAgICAgICAgICAgICAgIC8qIHNwaW4gbG9vcCAqLworCWJscgorcGxsX3Byb2dfY29kZV9lbmQ6CisJbm9wCisJYmxyCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzY2UxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eC90cmFwcy5jCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogbGludXgvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgIEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqIE1vZGlmaWVkIGJ5IENvcnQgRG91Z2FuIChjb3J0QGNzLm5tdC5lZHUpCisgKiBhbmQgUGF1bCBNYWNrZXJyYXMgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgaGFyZHdhcmUgZXhjZXB0aW9ucworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8a2dkYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCitleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZgorCisvKiBSZXR1cm5zIDAgaWYgZXhjZXB0aW9uIG5vdCBmb3VuZCBhbmQgZml4dXAgb3RoZXJ3aXNlLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHNlYXJjaF9leGNlcHRpb25fdGFibGUodW5zaWduZWQgbG9uZyk7CisKKy8qIFRISVMgTkVFRFMgQ0hBTkdJTkcgdG8gdXNlIHRoZSBib2FyZCBpbmZvIHN0cnVjdHVyZS4KKyovCisjZGVmaW5lIEVORF9PRl9NRU0JMHgwMDAxMDAwCisKKworLyoKKyAqIFByaW50IHN0YWNrIGJhY2t0cmFjZQorICovCit2b2lkIHByaW50X2JhY2t0cmFjZSh1bnNpZ25lZCBsb25nICpzcCkKK3sKKwlpbnQgY250ID0gMDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlwcmludGYoIkNhbGwgYmFja3RyYWNlOiAiKTsKKwl3aGlsZSAoc3ApIHsKKwkJaWYgKCh1aW50KXNwID4gRU5EX09GX01FTSkKKwkJCWJyZWFrOworCisJCWkgPSBzcFsxXTsKKwkJaWYgKGNudCsrICUgNyA9PSAwKQorCQkJcHJpbnRmKCJcbiIpOworCQlwcmludGYoIiUwOGxYICIsIGkpOworCQlpZiAoY250ID4gMzIpIGJyZWFrOworCQlzcCA9ICh1bnNpZ25lZCBsb25nICopKnNwOworCX0KKwlwcmludGYoIlxuIik7Cit9CisKKy8qCisgKiBQcmludCBjdXJyZW50IHJlZ2lzdGVycworICovCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGk7CisJcHJpbnRmKCJOSVA6ICUwOGxYIFhFUjogJTA4bFggTFI6ICUwOGxYIFJFR1M6ICVwIFRSQVA6ICUwNGx4IERBUjogJTA4bFhcbiIsCisJICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+eGVyLCByZWdzLT5saW5rLCByZWdzLCByZWdzLT50cmFwLCByZWdzLT5kYXIpOworCXByaW50ZigiTVNSOiAlMDhseCBFRTogJTAxeCBQUjogJTAxeCBGUDogJTAxeCBNRTogJTAxeCBJUi9EUjogJTAxeCUwMXhcbiIsCisJICAgICAgIHJlZ3MtPm1zciwgcmVncy0+bXNyJk1TUl9FRSA/IDEgOiAwLCByZWdzLT5tc3ImTVNSX1BSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciAmIE1TUl9GUCA/IDEgOiAwLHJlZ3MtPm1zciZNU1JfTUUgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyJk1TUl9JUiA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3ImTVNSX0RSID8gMSA6IDApOworCisJcHJpbnRmKCJcbiIpOworCWZvciAoaSA9IDA7ICBpIDwgMzI7ICBpKyspIHsKKwkJaWYgKChpICUgOCkgPT0gMCkKKwkJeworCQkJcHJpbnRmKCJHUFIlMDJkOiAiLCBpKTsKKwkJfQorCisJCXByaW50ZigiJTA4bFggIiwgcmVncy0+Z3ByW2ldKTsKKwkJaWYgKChpICUgOCkgPT0gNykKKwkJeworCQkJcHJpbnRmKCJcbiIpOworCQl9CisJfQorfQorCisKKy8qCisgKiBHZW5lcmFsIGV4Y2VwdGlvbiBoYW5kbGVyIHJvdXRpbmUKKyAqLwordm9pZCBfZXhjZXB0aW9uKGludCBzaWduciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMoIkV4Y2VwdGlvbiBpbiBrZXJuZWwgcGMgJWx4IHNpZ25hbCAlZCIscmVncy0+bmlwLHNpZ25yKTsKK30KKworLyoKKyAqIE1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIGhhbmRsZXIgcm91dGluZQorICovCit2b2lkIE1hY2hpbmVDaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZpeHVwOworCisJLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgorCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCisJICogdGhlIFBDSSBleGNlcHRpb24gaGFuZGxlci4KKwkgKi8KKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZShyZWdzLT5uaXApKSAhPSAwKSB7CisJCXJlZ3MtPm5pcCA9IGZpeHVwOworCQlyZXR1cm47CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ZigiTWFjaGluZSBjaGVjayBpbiBrZXJuZWwgbW9kZS5cbiIpOworCXByaW50ZigiQ2F1c2VkIGJ5IChmcm9tIG1zcik6ICIpOworCXByaW50ZigicmVncyAlcCAiLHJlZ3MpOworCXN3aXRjaCggcmVncy0+bXNyICYgMHgwMDBGMDAwMCkgeworCWNhc2UgKDB4ODAwMDAwMDA+PjEyKToKKwkJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjEzKToKKwkJcHJpbnRmKCJUcmFuc2ZlciBlcnJvciBhY2sgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTQpOgorCQlwcmludGYoIkRhdGEgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjE1KToKKwkJcHJpbnRmKCJBZGRyZXNzIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlVua25vd24gdmFsdWVzIGluIG1zclxuIik7CisJfQorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJtYWNoaW5lIGNoZWNrIik7Cit9CisKKy8qCisgKiBBbGlnbm1lbnQgZXhjZXB0aW9uIGhhbmRsZXIgcm91dGluZQorICovCit2b2lkIEFsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJBbGlnbm1lbnQgRXhjZXB0aW9uIik7Cit9CisKKy8qCisgKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiBoYW5kbGVyIHJvdXRpbmUKKyAqLwordm9pZCBQcm9ncmFtQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiUHJvZ3JhbSBDaGVjayBFeGNlcHRpb24iKTsKK30KKworLyoKKyAqIFNvZnR3YXJlIGVtdWxhdGlvbiBleGNlcHRpb24gaGFuZGxlciByb3V0aW5lCisgKi8KK3ZvaWQgU29mdEVtdUV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJTb2Z0d2FyZSBFbXVsYXRpb24gRXhjZXB0aW9uIik7Cit9CisKKworLyoKKyAqIFVua25vd24gZXhjZXB0aW9uIGhhbmRsZXIgcm91dGluZQorICovCit2b2lkIFVua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlwcmludGYoIkJhZCB0cmFwIGF0IFBDOiAlbHgsIFNSOiAlbHgsIHZlY3Rvcj0lbHhcbiIsCisJICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+bXNyLCByZWdzLT50cmFwKTsKKwlfZXhjZXB0aW9uKDAsIHJlZ3MpOworfQorCisvKgorICogRGVidWcgZXhjZXB0aW9uIGhhbmRsZXIgcm91dGluZQorICovCit2b2lkIERlYnVnRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ZigiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwICk7CisJc2hvd19yZWdzKHJlZ3MpOworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCisJZG9fYmVkYnVnX2JyZWFrcG9pbnQoIHJlZ3MgKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHgvdS1ib290LmxkcyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlNWRjMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEJV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZQorICogKEMpIENvcHlyaWdodCAyMDAzCU1hcnRpbiBXaW5pc3RvZXJmZXIsIG1hcnRpbndpbmlzdG9lcmZlckBnbXguY2gKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KQl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4JKi8KKyAgICAvKiB0aGUgc2VjdG9yIGxheW91dCBvZiBvdXIgZmxhc2ggY2hpcHMhCVhYWCBGSVhNRSBYWFgJKi8KKworICAgIGFyY2gvcG93ZXJwYy9jcHUvbXBjNXh4L3N0YXJ0Lm8JKC50ZXh0KQorCisgICAgKigudGV4dCkKKyAgICAqKC5nb3QxKQorICB9CisgIF9ldGV4dCA9IC47CisgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgIC5yb2RhdGEgICAgOgorICB7CisgICAgKiguZWhfZnJhbWUpCisgICAgKihTT1JUX0JZX0FMSUdOTUVOVChTT1JUX0JZX05BTUUoLnJvZGF0YSopKSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDAwRkYpICYgMHhGRkZGRkYwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4yOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pPj4yOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgKE5PTE9BRCkgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAuID0gQUxJR04oNCk7CisgIH0KKworICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworLyogICAuID0gZW52X3N0YXJ0OworCS5wcGNlbnYJOgorCXsKKwkJY29tbW9uL2Vudl9lbWJlZGRlZC5vICgucHBjZW52KQorCX0KKyovCit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlMDYxMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk9IHN0YXJ0Lm8KK1NPQkpTCT0gaW8ubyBmaXJtd2FyZV9zY190YXNrX2Jlc3Rjb21tLmltcGwubworQ09CSlMJPSBpMmMubyB0cmFwcy5vIGNwdS5vIGNwdV9pbml0Lm8gaWRlLm8gaW50ZXJydXB0cy5vIFwKKwkgIGxvYWR0YXNrLm8gcGNpX21wYzUyMDAubyBzZXJpYWwubyBzcGVlZC5vIHVzYl9vaGNpLm8gdXNiLm8KKworU1JDUwk6PSAkKFNUQVJUOi5vPS5TKSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykgJChDT0JKUykpCitTVEFSVAk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTVEFSVCkpCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvY29uZmlnLm1rIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWY4YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2NvbmZpZy5tawpAQCAtMCwwICsxLDMwIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitQTEFURk9STV9SRUxGTEFHUyArPSAtZlBJQyAtbWVhYmkKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTVBDNXh4eCAtZmZpeGVkLXIyIFwKKwkJICAgICAtbXN0cmluZyAtbWNwdT02MDNlIC1tbXVsdGlwbGUKKworIyBVc2UgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQm9hcmQgcG9ydCBjYW4gb3ZlcnJpZGUgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjAyMzRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2NwdS5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMTAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIENQVSBzcGVjaWZpYyBjb2RlIGZvciB0aGUgTVBDNXh4eCBDUFVzCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPG1wYzV4eHguaD4KKyNpbmNsdWRlIDxuZXRkZXYuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX09GX0lERV9GSVhVUCkKKyNpbmNsdWRlIDxpZGUuaD4KKyNlbmRpZgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworaW50IGNoZWNrY3B1ICh2b2lkKQoreworCXVsb25nIGNsb2NrID0gZ2QtPmNwdV9jbGs7CisJY2hhciBidWZbMzJdOworCXVpbnQgc3ZyLCBwdnI7CisKKwlwdXRzICgiQ1BVOiAgICIpOworCisJc3ZyID0gZ2V0X3N2cigpOworCXB2ciA9IGdldF9wdnIoKTsKKworCXN3aXRjaCAocHZyKSB7CisJY2FzZSBQVlJfNTIwMDoKKwkJcHJpbnRmKCJNUEM1MjAwIik7CisJCWJyZWFrOworCWNhc2UgUFZSXzUyMDBCOgorCQlwcmludGYoIk1QQzUyMDBCIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiVW5rbm93biBNUEM1eHh4Iik7CisJCWJyZWFrOworCX0KKworCXByaW50ZiAoIiB2JWQuJWQsIENvcmUgdiVkLiVkIiwgU1ZSX01KUkVWIChzdnIpLCBTVlJfTU5SRVYgKHN2ciksCisJCVBWUl9NQUoocHZyKSwgUFZSX01JTihwdnIpKTsKKwlwcmludGYgKCIgYXQgJXMgTUh6XG4iLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQKK2RvX3Jlc2V0IChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdWxvbmcgbXNyOworCS8qIEludGVycnVwdHMgYW5kIE1NVSBvZmYgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mbXNyICAgICUwIjoiPXIiIChtc3IpOik7CisKKwltc3IgJj0gfihNU1JfTUUgfCBNU1JfRUUgfCBNU1JfSVIgfCBNU1JfRFIpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgibXRtc3IgICAgJTAiOjoiciIgKG1zcikpOworCisJLyogQ2hhcmdlIHRoZSB3YXRjaGRvZyB0aW1lciAqLworCSoodnVfbG9uZyAqKShNUEM1WFhYX0dQVDBfQ09VTlRFUikgPSAweDAwMDEwMDBmOworCSoodnVfbG9uZyAqKShNUEM1WFhYX0dQVDBfRU5BQkxFKSA9IDB4OTAwNDsgLyogd2RlbnxjZXx0aW1lcl9tcyAqLworCXdoaWxlKDEpOworCisJcmV0dXJuIDE7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogR2V0IHRpbWViYXNlIGNsb2NrIGZyZXF1ZW5jeSAobGlrZSBjcHVfY2xrIGluIEh6KQorICoKKyAqLwordW5zaWduZWQgbG9uZyBnZXRfdGJjbGsgKHZvaWQpCit7CisJdWxvbmcgdGJjbGs7CisKKwl0YmNsayA9IChnZC0+YnVzX2NsayArIDNMKSAvIDRMOworCisJcmV0dXJuICh0YmNsayk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkgJiYgZGVmaW5lZCAoQ09ORklHX09GX0JPQVJEX1NFVFVQKQordm9pZCBmdF9jcHVfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJaW50IGRpdiA9IGluXzgoKHZvaWQqKUNPTkZJR19TWVNfTUJBUiArIDB4MjA0KSAmIDB4MDAyMCA/IDggOiA0OworCWNoYXIgKiBjcHVfcGF0aCA9ICIvY3B1cy8iIE9GX0NQVTsKKyNpZmRlZiBDT05GSUdfTVBDNXh4eF9GRUMKKwl1Y2hhciBlbmV0YWRkcls2XTsKKwljaGFyICogZXRoX3BhdGggPSAiLyIgT0ZfU09DICIvZXRoZXJuZXRAMzAwMCI7CisjZW5kaWYKKworCWRvX2ZpeHVwX2J5X3BhdGhfdTMyKGJsb2IsIGNwdV9wYXRoLCAidGltZWJhc2UtZnJlcXVlbmN5IiwgT0ZfVEJDTEssIDEpOworCWRvX2ZpeHVwX2J5X3BhdGhfdTMyKGJsb2IsIGNwdV9wYXRoLCAiYnVzLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKwlkb19maXh1cF9ieV9wYXRoX3UzMihibG9iLCBjcHVfcGF0aCwgImNsb2NrLWZyZXF1ZW5jeSIsIGJkLT5iaV9pbnRmcmVxLCAxKTsKKwlkb19maXh1cF9ieV9wYXRoX3UzMihibG9iLCAiLyIgT0ZfU09DLCAiYnVzLWZyZXF1ZW5jeSIsIGJkLT5iaV9pcGJmcmVxLCAxKTsKKwlkb19maXh1cF9ieV9wYXRoX3UzMihibG9iLCAiLyIgT0ZfU09DLCAic3lzdGVtLWZyZXF1ZW5jeSIsCisJCQkJYmQtPmJpX2J1c2ZyZXEqZGl2LCAxKTsKKyNpZmRlZiBDT05GSUdfTVBDNXh4eF9GRUMKKwlldGhfZ2V0ZW52X2VuZXRhZGRyKCJldGhhZGRyIiwgZW5ldGFkZHIpOworCWRvX2ZpeHVwX2J5X3BhdGgoYmxvYiwgZXRoX3BhdGgsICJtYWMtYWRkcmVzcyIsIGVuZXRhZGRyLCA2LCAwKTsKKwlkb19maXh1cF9ieV9wYXRoKGJsb2IsIGV0aF9wYXRoLCAibG9jYWwtbWFjLWFkZHJlc3MiLCBlbmV0YWRkciwgNiwgMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9JREVfRklYVVApCisJaWYgKCFpZGVfZGV2aWNlX3ByZXNlbnQoMCkpIHsKKwkJLyogTk8gQ0YgY2FyZCBkZXRlY3RlZCAtPiBkZWxldGUgYXRhIG5vZGUgaW4gRFRTICovCisJCWludCBub2Rlb2Zmc2V0ID0gMDsKKwkJY2hhciBub2RlbmFtZVtdID0gIi9zb2M1MjAwQGYwMDAwMDAwL2F0YUAzYTAwIjsKKworCQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0KGJsb2IsIG5vZGVuYW1lKTsKKwkJaWYgKG5vZGVvZmZzZXQgPj0gMCkgeworCQkJZmR0X2RlbF9ub2RlKGJsb2IsIG5vZGVvZmZzZXQpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIlczogY2Fubm90IGZpbmQgJXMgbm9kZSBlcnI6JXNcbiIsCisJCQkJX19mdW5jX18sIG5vZGVuYW1lLCBmZHRfc3RyZXJyb3Iobm9kZW9mZnNldCkpOworCQl9CisJfQorCisjZW5kaWYKKwlmZHRfZml4dXBfbWVtb3J5KGJsb2IsICh1NjQpYmQtPmJpX21lbXN0YXJ0LCAodTY0KWJkLT5iaV9tZW1zaXplKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0JPT1RDT1VOVF9MSU1JVAorCit2b2lkIGJvb3Rjb3VudF9zdG9yZSAodWxvbmcgYSkKK3sKKwl2b2xhdGlsZSB1bG9uZyAqc2F2ZV9hZGRyID0gKHZvbGF0aWxlIHVsb25nICopIChNUEM1WFhYX0NETV9CUkRDUk1CKTsKKworCSpzYXZlX2FkZHIgPSAoQk9PVENPVU5UX01BR0lDICYgMHhmZmZmMDAwMCkgfCBhOworfQorCit1bG9uZyBib290Y291bnRfbG9hZCAodm9pZCkKK3sKKwl2b2xhdGlsZSB1bG9uZyAqc2F2ZV9hZGRyID0gKHZvbGF0aWxlIHVsb25nICopIChNUEM1WFhYX0NETV9CUkRDUk1CKTsKKworCWlmICgoKnNhdmVfYWRkciAmIDB4ZmZmZjAwMDApICE9IChCT09UQ09VTlRfTUFHSUMgJiAweGZmZmYwMDAwKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gKCpzYXZlX2FkZHIgJiAweDAwMDBmZmZmKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfQk9PVENPVU5UX0xJTUlUICovCisKKyNpZmRlZiBDT05GSUdfTVBDNXh4eF9GRUMKKy8qIERlZmF1bHQgaW5pdGlhbGl6YXRpb25zIGZvciBGRUMgY29udHJvbGxlcnMuICBUbyBvdmVycmlkZSwKKyAqIGNyZWF0ZSBhIGJvYXJkLXNwZWNpZmljIGZ1bmN0aW9uIGNhbGxlZDoKKyAqIAlpbnQgYm9hcmRfZXRoX2luaXQoYmRfdCAqYmlzKQorICovCisKK2ludCBjcHVfZXRoX2luaXQoYmRfdCAqYmlzKQoreworCXJldHVybiBtcGM1eHh4X2ZlY19pbml0aWFsaXplKGJpcyk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQordm9pZCB3YXRjaGRvZ19yZXNldCh2b2lkKQoreworCWludCByZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKwlyZXNldF81eHh4X3dhdGNoZG9nKCk7CisJaWYgKHJlX2VuYWJsZSkgZW5hYmxlX2ludGVycnVwdHMoKTsKK30KKwordm9pZCByZXNldF81eHh4X3dhdGNoZG9nKHZvaWQpCit7CisJdm9sYXRpbGUgc3RydWN0IG1wYzV4eHhfZ3B0ICpncHQwID0KKwkJKHN0cnVjdCBtcGM1eHh4X2dwdCAqKSBNUEM1WFhYX0dQVDsKKworCS8qIFRyaWdnZXIgVElNRVJfMCBieSB3cml0aW5nIEE1IHRvIE9DUFcgKi8KKwljbHJzZXRiaXRzX2JlMzIoJmdwdDAtPmVtc3IsIDB4ZmYwMDAwMDAsIDB4YTUwMDAwMDApOworfQorI2VuZGlmCS8qIENPTkZJR19XQVRDSERPRyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2NwdV9pbml0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvY3B1X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGFmMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2NwdV9pbml0LmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAxMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjNXh4eC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisvKgorICogQnJlYXRoIHNvbWUgbGlmZSBpbnRvIHRoZSBDUFUuLi4KKyAqCisgKiBTZXQgdXAgdGhlIG1lbW9yeSBtYXAsCisgKiBpbml0aWFsaXplIGEgYnVuY2ggb2YgcmVnaXN0ZXJzLgorICovCit2b2lkIGNwdV9pbml0X2YgKHZvaWQpCit7CisJdm9sYXRpbGUgc3RydWN0IG1wYzV4eHhfbW1hcF9jdGwgKm1tID0KKwkJKHN0cnVjdCBtcGM1eHh4X21tYXBfY3RsICopIENPTkZJR19TWVNfTUJBUjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbXBjNXh4eF9scGIgKmxwYiA9CisJCShzdHJ1Y3QgbXBjNXh4eF9scGIgKikgTVBDNVhYWF9MUEI7CisJdm9sYXRpbGUgc3RydWN0IG1wYzV4eHhfZ3BpbyAqZ3BpbyA9CisJCShzdHJ1Y3QgbXBjNXh4eF9ncGlvICopIE1QQzVYWFhfR1BJTzsKKwl2b2xhdGlsZSBzdHJ1Y3QgbXBjNXh4eF94bGIgKnhsYiA9CisJCShzdHJ1Y3QgbXBjNXh4eF94bGIgKikgTVBDNVhYWF9YTEJBUkI7CisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0lQQkNMS19FUVVBTFNfWExCQ0xLKQorCXZvbGF0aWxlIHN0cnVjdCBtcGM1eHh4X2NkbSAqY2RtID0KKwkJKHN0cnVjdCBtcGM1eHh4X2NkbSAqKSBNUEM1WFhYX0NETTsKKyNlbmRpZgkvKiBDT05GSUdfU1lTX0lQQkNMS19FUVVBTFNfWExCQ0xLICovCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCisJdm9sYXRpbGUgc3RydWN0IG1wYzV4eHhfZ3B0ICpncHQwID0KKwkJKHN0cnVjdCBtcGM1eHh4X2dwdCAqKSBNUEM1WFhYX0dQVDsKKyNlbmRpZiAvKiBDT05GSUdfV0FUQ0hET0cgKi8KKwl1bnNpZ25lZCBsb25nIGFkZGVjciA9ICgxIDw8IDI1KTsgLyogQm9vdF9DUyAqLworCS8qIFBvaW50ZXIgaXMgd3JpdGFibGUgc2luY2Ugd2UgYWxsb2NhdGVkIGEgcmVnaXN0ZXIgZm9yIGl0ICovCisJZ2QgPSAoZ2RfdCAqKSAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICsgQ09ORklHX1NZU19HQkxfREFUQV9PRkZTRVQpOworCisJLyogQ2xlYXIgaW5pdGlhbCBnbG9iYWwgZGF0YSAqLworCW1lbXNldCAoKHZvaWQgKikgZ2QsIDAsIHNpemVvZiAoZ2RfdCkpOworCisJLyoKKwkgKiBNZW1vcnkgQ29udHJvbGxlcjogY29uZmlndXJlIGNoaXAgc2VsZWN0cyBhbmQgZW5hYmxlIHRoZW0KKwkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQk9PVENTX1NUQVJUKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfQk9PVENTX1NJWkUpCisJb3V0X2JlMzIoJm1tLT5ib290X3N0YXJ0LCBTVEFSVF9SRUcoQ09ORklHX1NZU19CT09UQ1NfU1RBUlQpKTsKKwlvdXRfYmUzMigmbW0tPmJvb3Rfc3RvcCwgU1RPUF9SRUcoQ09ORklHX1NZU19CT09UQ1NfU1RBUlQsCisJCQkJCSAgQ09ORklHX1NZU19CT09UQ1NfU0laRSkpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0JPT1RDU19DRkcpCisJb3V0X2JlMzIoJmxwYi0+Y3MwX2NmZywgQ09ORklHX1NZU19CT09UQ1NfQ0ZHKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTMF9TVEFSVCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0NTMF9TSVpFKQorCW91dF9iZTMyKCZtbS0+Y3MwX3N0YXJ0LCBTVEFSVF9SRUcoQ09ORklHX1NZU19DUzBfU1RBUlQpKTsKKwlvdXRfYmUzMigmbW0tPmNzMF9zdG9wLCBTVE9QX1JFRyhDT05GSUdfU1lTX0NTMF9TVEFSVCwKKwkJCQkJIENPTkZJR19TWVNfQ1MwX1NJWkUpKTsKKwkvKiBDUzAgYW5kIEJPT1RfQ1MgY2Fubm90IGJlIGVuYWJsZWQgYXQgb25jZS4gKi8KKwkvKglhZGRlY3IgfD0gKDEgPDwgMTYpOyAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTMF9DRkcpCisJb3V0X2JlMzIoJmxwYi0+Y3MwX2NmZywgQ09ORklHX1NZU19DUzBfQ0ZHKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTMV9TVEFSVCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0NTMV9TSVpFKQorCW91dF9iZTMyKCZtbS0+Y3MxX3N0YXJ0LCBTVEFSVF9SRUcoQ09ORklHX1NZU19DUzFfU1RBUlQpKTsKKwlvdXRfYmUzMigmbW0tPmNzMV9zdG9wLCBTVE9QX1JFRyhDT05GSUdfU1lTX0NTMV9TVEFSVCwKKwkJCQkJIENPTkZJR19TWVNfQ1MxX1NJWkUpKTsKKwlhZGRlY3IgfD0gKDEgPDwgMTcpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTMV9DRkcpCisJb3V0X2JlMzIoJmxwYi0+Y3MxX2NmZywgQ09ORklHX1NZU19DUzFfQ0ZHKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTMl9TVEFSVCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0NTMl9TSVpFKQorCW91dF9iZTMyKCZtbS0+Y3MyX3N0YXJ0LCBTVEFSVF9SRUcoQ09ORklHX1NZU19DUzJfU1RBUlQpKTsKKwlvdXRfYmUzMigmbW0tPmNzMl9zdG9wLCBTVE9QX1JFRyhDT05GSUdfU1lTX0NTMl9TVEFSVCwKKwkJCQkJIENPTkZJR19TWVNfQ1MyX1NJWkUpKTsKKwlhZGRlY3IgfD0gKDEgPDwgMTgpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTMl9DRkcpCisJb3V0X2JlMzIoJmxwYi0+Y3MyX2NmZywgQ09ORklHX1NZU19DUzJfQ0ZHKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTM19TVEFSVCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0NTM19TSVpFKQorCW91dF9iZTMyKCZtbS0+Y3MzX3N0YXJ0LCBTVEFSVF9SRUcoQ09ORklHX1NZU19DUzNfU1RBUlQpKTsKKwlvdXRfYmUzMigmbW0tPmNzM19zdG9wLCBTVE9QX1JFRyhDT05GSUdfU1lTX0NTM19TVEFSVCwKKwkJCQkJIENPTkZJR19TWVNfQ1MzX1NJWkUpKTsKKwlhZGRlY3IgfD0gKDEgPDwgMTkpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTM19DRkcpCisJb3V0X2JlMzIoJmxwYi0+Y3MzX2NmZywgQ09ORklHX1NZU19DUzNfQ0ZHKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTNF9TVEFSVCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0NTNF9TSVpFKQorCW91dF9iZTMyKCZtbS0+Y3M0X3N0YXJ0LCBTVEFSVF9SRUcoQ09ORklHX1NZU19DUzRfU1RBUlQpKTsKKwlvdXRfYmUzMigmbW0tPmNzNF9zdG9wLCBTVE9QX1JFRyhDT05GSUdfU1lTX0NTNF9TVEFSVCwKKwkJCQkJICBDT05GSUdfU1lTX0NTNF9TSVpFKSk7CisJYWRkZWNyIHw9ICgxIDw8IDIwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19DUzRfQ0ZHKQorCW91dF9iZTMyKCZscGItPmNzNF9jZmcsIENPTkZJR19TWVNfQ1M0X0NGRyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19DUzVfU1RBUlQpICYmIGRlZmluZWQoQ09ORklHX1NZU19DUzVfU0laRSkKKwlvdXRfYmUzMigmbW0tPmNzNV9zdGFydCwgU1RBUlRfUkVHKENPTkZJR19TWVNfQ1M1X1NUQVJUKSk7CisJb3V0X2JlMzIoJm1tLT5jczVfc3RvcCwgU1RPUF9SRUcoQ09ORklHX1NZU19DUzVfU1RBUlQsCisJCQkJCSAgQ09ORklHX1NZU19DUzVfU0laRSkpOworCWFkZGVjciB8PSAoMSA8PCAyMSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQ1M1X0NGRykKKwlvdXRfYmUzMigmbHBiLT5jczVfY2ZnLCBDT05GSUdfU1lTX0NTNV9DRkcpOworI2VuZGlmCisKKwlhZGRlY3IgfD0gMTsKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQ1M2X1NUQVJUKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfQ1M2X1NJWkUpCisJb3V0X2JlMzIoJm1tLT5jczZfc3RhcnQsIFNUQVJUX1JFRyhDT05GSUdfU1lTX0NTNl9TVEFSVCkpOworCW91dF9iZTMyKCZtbS0+Y3M2X3N0b3AsIFNUT1BfUkVHKENPTkZJR19TWVNfQ1M2X1NUQVJULAorCQkJCQkgIENPTkZJR19TWVNfQ1M2X1NJWkUpKTsKKwlhZGRlY3IgfD0gKDEgPDwgMjYpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTNl9DRkcpCisJb3V0X2JlMzIoJmxwYi0+Y3M2X2NmZywgQ09ORklHX1NZU19DUzZfQ0ZHKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NTN19TVEFSVCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0NTN19TSVpFKQorCW91dF9iZTMyKCZtbS0+Y3M3X3N0YXJ0LCBTVEFSVF9SRUcoQ09ORklHX1NZU19DUzdfU1RBUlQpKTsKKwlvdXRfYmUzMigmbW0tPmNzN19zdG9wLCBTVE9QX1JFRyhDT05GSUdfU1lTX0NTN19TVEFSVCwKKwkJCQkJICBDT05GSUdfU1lTX0NTN19TSVpFKSk7CisJYWRkZWNyIHw9ICgxIDw8IDI3KTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19DUzdfQ0ZHKQorCW91dF9iZTMyKCZscGItPmNzN19jZmcsIENPTkZJR19TWVNfQ1M3X0NGRyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19DU19CVVJTVCkKKwlvdXRfYmUzMigmbHBiLT5jc19idXJzdCwgQ09ORklHX1NZU19DU19CVVJTVCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQ1NfREVBRENZQ0xFKQorCW91dF9iZTMyKCZscGItPmNzX2RlYWRjeWNsZSwgQ09ORklHX1NZU19DU19ERUFEQ1lDTEUpOworI2VuZGlmCisKKwkvKiBFbmFibGUgY2hpcCBzZWxlY3RzICovCisJb3V0X2JlMzIoJm1tLT5pcGJpX3dzX2N0cmwsIGFkZGVjcik7CisJb3V0X2JlMzIoJmxwYi0+Y3NfY3RybCwgKDEgPDwgMjQpKTsKKworCS8qIFNldHVwIHBpbiBtdWx0aXBsZXhpbmcgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfR1BTX1BPUlRfQ09ORklHKQorCW91dF9iZTMyKCZncGlvLT5wb3J0X2NvbmZpZywgQ09ORklHX1NZU19HUFNfUE9SVF9DT05GSUcpOworI2VuZGlmCisKKwkvKiBlbmFibGUgdGltZWJhc2UgKi8KKwlzZXRiaXRzX2JlMzIoJnhsYi0+Y29uZmlnLCAoMSA8PCAxMykpOworCisJLyogRW5hYmxlIHNub29waW5nIGZvciBSQU0gKi8KKwlzZXRiaXRzX2JlMzIoJnhsYi0+Y29uZmlnLCAoMSA8PCAxNSkpOworCW91dF9iZTMyKCZ4bGItPnNub29wX3dpbmRvdywgQ09ORklHX1NZU19TRFJBTV9CQVNFIHwgMHgxZCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfSVBCQ0xLX0VRVUFMU19YTEJDTEspCisJLyogTW90b3JvbGEgcmVwb3J0cyBJUEIgc2hvdWxkIGJldHRlciBydW4gYXQgMTMzIE1Iei4gKi8KKwlzZXRiaXRzX2JlMzIoJm1tLT5pcGJpX3dzX2N0cmwsIDEpOworCS8qIHBjaV9jbGtfc2VsID0gMHgwMiwgaXBiX2Nsa19zZWwgPSAweDAwOyAqLworCWFkZGVjciA9IGluX2JlMzIoJmNkbS0+Y2ZnKTsKKwlhZGRlY3IgJj0gfjB4MTAzOworIyBpZiBkZWZpbmVkKENPTkZJR19TWVNfUENJQ0xLX0VRVUFMU19JUEJDTEtfRElWMikKKwkvKiBwY2lfY2xrX3NlbCA9IDB4MDEgLT4gSVBCX0NMSy8yICovCisJYWRkZWNyIHw9IDB4MDE7CisjIGVsc2UKKwkvKiBwY2lfY2xrX3NlbCA9IDB4MDIgLT4gWExCX0NMSy80ID0gSVBCX0NMSy80ICovCisJYWRkZWNyIHw9IDB4MDI7CisjIGVuZGlmIC8qIENPTkZJR19TWVNfUENJQ0xLX0VRVUFMU19JUEJDTEtfRElWMiAqLworCW91dF9iZTMyKCZjZG0tPmNmZywgYWRkZWNyKTsKKyNlbmRpZgkvKiBDT05GSUdfU1lTX0lQQkNMS19FUVVBTFNfWExCQ0xLICovCisJLyogQ29uZmlndXJlIHRoZSBYTEIgQXJiaXRlciAqLworCW91dF9iZTMyKCZ4bGItPm1hc3Rlcl9wcmlfZW5hYmxlLCAweGZmKTsKKwlvdXRfYmUzMigmeGxiLT5tYXN0ZXJfcHJpb3JpdHksIDB4MTExMTExMTEpOworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX1hMQl9QSVBFTElOSU5HKQorCS8qIEVuYWJsZSBwaXBsaW5pbmcgKi8KKwljbHJiaXRzX2JlMzIoJnhsYi0+Y29uZmlnLCAoMSA8PCAzMSkpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwkvKiBDaGFyZ2UgdGhlIHdhdGNoZG9nIHRpbWVyIC0gcHJlc2NhbGVyID0gNjRrLCBjb3VudCA9IDY0ayovCisJb3V0X2JlMzIoJmdwdDAtPmNpciwgMHgwMDAwZmZmZik7CisJb3V0X2JlMzIoJmdwdDAtPmVtc3IsIDB4OTAwNCk7CS8qIHdkZW58Y2V8dGltZXJfbXMgKi8KKworCXJlc2V0XzV4eHhfd2F0Y2hkb2coKTsKKyNlbmRpZiAvKiBDT05GSUdfV0FUQ0hET0cgKi8KK30KKworLyoKKyAqIGluaXRpYWxpemUgaGlnaGVyIGxldmVsIHBhcnRzIG9mIENQVSBsaWtlIHRpbWUgYmFzZSBhbmQgdGltZXJzCisgKi8KK2ludCBjcHVfaW5pdF9yICh2b2lkKQoreworCXZvbGF0aWxlIHN0cnVjdCBtcGM1eHh4X2ludHIgKmludHIgPQorCQkoc3RydWN0IG1wYzV4eHhfaW50ciAqKSBNUEM1WFhYX0lDVEw7CisKKwkvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzICovCisJb3V0X2JlMzIoJmludHItPnBlcl9tYXNrLCAweGZmZmZmZjAwKTsKKwlzZXRiaXRzX2JlMzIoJmludHItPm1haW5fbWFzaywgMHgwMDAxZmZmZik7CisJY2xyYml0c19iZTMyKCZpbnRyLT5jdHJsLCAweDAwMDAwZjAwKTsKKwkvKiByb3V0ZSBjcml0aWNhbCBpbnRzIHRvIG5vcm1hbCBpbnRzICovCisJc2V0Yml0c19iZTMyKCZpbnRyLT5jdHJsLCAweDAwMDAwMDAxKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIGRlZmluZWQoQ09ORklHX01QQzV4eHhfRkVDKQorCS8qIGxvYWQgRkVDIG1pY3JvY29kZSAqLworCWxvYWR0YXNrKDAsIDIpOworI2VuZGlmCisKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2Zpcm13YXJlX3NjX3Rhc2tfYmVzdGNvbW0uaW1wbC5TIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2Zpcm13YXJlX3NjX3Rhc2tfYmVzdGNvbW0uaW1wbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzIzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvZmlybXdhcmVfc2NfdGFza19iZXN0Y29tbS5pbXBsLlMKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIFNvZnR3YXJlIENlbnRlciwgTW90b3JvbGEgQ2hpbmEuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1pY3JvY29kZSBmb3IgdGhlIEZFQyBjb250cm9sbGVyIG9mIHRoZSBNUEM1MjAwIENQVS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKy8qIHNhcy9zY2NnLCBnYXMgdGFyZ2V0ICovCisuc2VjdGlvbiAgICAgICAgc21hcnRkbWFJbml0RGF0YSwiYXciLEBwcm9nYml0cwkvKiBJbml0aWFsaXplZCBkYXRhIGZvciB0YXNrIHZhcmlhYmxlcyAqLworLnNlY3Rpb24gICAgICAgIHNtYXJ0ZG1hVGFza1RhYmxlLCJhdyIsQHByb2diaXRzCS8qIFRhc2sgdGFibGVzICovCisuYWxpZ24gIDkKKy5nbG9ibCB0YXNrVGFibGUKK3Rhc2tUYWJsZToKKy5nbG9ibCBzY0V0aGVybmV0UmVjdl9FbnRyeQorc2NFdGhlcm5ldFJlY3ZfRW50cnk6CQkvKiBUYXNrIDAgKi8KKy5sb25nICAgc2NFdGhlcm5ldFJlY3ZfVERUIC0gdGFza1RhYmxlCS8qIFRhc2sgMCBEZXNjcmlwdG9yIFRhYmxlICovCisubG9uZyAgIHNjRXRoZXJuZXRSZWN2X1REVCAtIHRhc2tUYWJsZSArIDB4MDAwMDAwYTQKKy5sb25nICAgc2NFdGhlcm5ldFJlY3ZfVmFyVGFiIC0gdGFza1RhYmxlCS8qIFRhc2sgMCBWYXJpYWJsZSBUYWJsZSAqLworLmxvbmcgICBzY0V0aGVybmV0UmVjdl9GRFQgLSB0YXNrVGFibGUgKyAweDAzCS8qIFRhc2sgMCBGdW5jdGlvbiBEZXNjcmlwdG9yIFRhYmxlICYgRmxhZ3MgKi8KKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIHNjRXRoZXJuZXRSZWN2X0NTYXZlIC0gdGFza1RhYmxlCS8qIFRhc2sgMCBjb250ZXh0IHNhdmUgc3BhY2UgKi8KKy5sb25nICAgQ09ORklHX1NZU19NQkFSCisuZ2xvYmwgc2NFdGhlcm5ldFhtaXRfRW50cnkKK3NjRXRoZXJuZXRYbWl0X0VudHJ5OgkJLyogVGFzayAxICovCisubG9uZyAgIHNjRXRoZXJuZXRYbWl0X1REVCAtIHRhc2tUYWJsZQkvKiBUYXNrIDEgRGVzY3JpcHRvciBUYWJsZSAqLworLmxvbmcgICBzY0V0aGVybmV0WG1pdF9URFQgLSB0YXNrVGFibGUgKyAweDAwMDAwMGQwCisubG9uZyAgIHNjRXRoZXJuZXRYbWl0X1ZhclRhYiAtIHRhc2tUYWJsZQkvKiBUYXNrIDEgVmFyaWFibGUgVGFibGUgKi8KKy5sb25nICAgc2NFdGhlcm5ldFhtaXRfRkRUIC0gdGFza1RhYmxlICsgMHgwMwkvKiBUYXNrIDEgRnVuY3Rpb24gRGVzY3JpcHRvciBUYWJsZSAmIEZsYWdzICovCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICBzY0V0aGVybmV0WG1pdF9DU2F2ZSAtIHRhc2tUYWJsZQkvKiBUYXNrIDEgY29udGV4dCBzYXZlIHNwYWNlICovCisubG9uZyAgIENPTkZJR19TWVNfTUJBUgorCisKKy5nbG9ibCBzY0V0aGVybmV0UmVjdl9URFQKK3NjRXRoZXJuZXRSZWN2X1REVDoJLyogVGFzayAwIERlc2NyaXB0b3IgVGFibGUgKi8KKy5sb25nICAgMHhjNGM1MDAwMAkvKiAwMDAwOiAgTENERVhUOiBpZHgwID0gdmFyOSArIHZhcjEwOyBpZHgwIG9uY2UgdmFyMDsgaWR4MCArPSBpbmMwICovCisubG9uZyAgIDB4ODRjNWUwMDAJLyogMDAwNDogIExDRDogaWR4MSA9IHZhcjkgKyB2YXIxMTsgOyBpZHgxICs9IGluYzAgKi8KKy5sb25nICAgMHgxMDAwMWYwOAkvKiAwMDA4OiAgICBEUkQxQTogdmFyNyA9IGlkeDE7IEZOPTAgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MTAwMDAzODAJLyogMDAwQzogICAgRFJEMUE6IHZhcjAgPSAqaWR4MDsgRk49MCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMDAwMGY4OAkvKiAwMDEwOiAgICBEUkQxQTogdmFyMyA9ICppZHgxOyBGTj0wIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHg4MTk4MDAwMAkvKiAwMDE0OiAgTENEOiBpZHgwID0gdmFyMzsgaWR4MCBvbmNlIHZhcjA7IGlkeDAgKz0gaW5jMCAqLworLmxvbmcgICAweDEwMDAwNzgwCS8qIDAwMTg6ICAgIERSRDFBOiB2YXIxID0gKmlkeDA7IEZOPTAgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4NjAwMDAwMDAJLyogMDAxQzogICAgRFJEMkE6IEVVMD0wIEVVMT0wIEVVMj0wIEVVMz0wIEVYVCBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDEwY2YwNGMJLyogMDAyMDogICAgRFJEMkIxOiB2YXI0ID0gRVUzKCk7IEVVMyh2YXIxLHZhcjEyKSAgKi8KKy5sb25nICAgMHg4MjE4MDM0OQkvKiAwMDI0OiAgTENEOiBpZHgwID0gdmFyNDsgaWR4MCAhPSB2YXIxMzsgaWR4MCArPSBpbmMxICovCisubG9uZyAgIDB4ODFjNjgwMDQJLyogMDAyODogICAgTENEOiBpZHgxID0gdmFyMyArIHZhcjEzICsgNDsgaWR4MSBvbmNlIHZhcjA7IGlkeDEgKz0gaW5jMCAqLworLmxvbmcgICAweDcwMDAwMDAwCS8qIDAwMkM6ICAgICAgRFJEMkE6IEVVMD0wIEVVMT0wIEVVMj0wIEVVMz0wIEVYVCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMThjZjA0ZQkvKiAwMDMwOiAgICAgIERSRDJCMTogdmFyNiA9IEVVMygpOyBFVTModmFyMSx2YXIxNCkgICovCisubG9uZyAgIDB4NzAwMDAwMDAJLyogMDAzNDogICAgICBEUkQyQTogRVUwPTAgRVUxPTAgRVUyPTAgRVUzPTAgRVhUIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDAyMGNmMDRmCS8qIDAwMzg6ICAgICAgRFJEMkIxOiB2YXI4ID0gRVUzKCk7IEVVMyh2YXIxLHZhcjE1KSAgKi8KKy5sb25nICAgMHgwMDAwMGI4OAkvKiAwMDNDOiAgICAgIERSRDFBOiB2YXIyID0gKmlkeDE7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDgwMDBkMTg0CS8qIDAwNDA6ICAgIExDREVYVDogaWR4MSA9IDB4ZjAwMDMxODQ7IDsgKi8KKy5sb25nICAgMHhjNjk5MDQ1MgkvKiAwMDQ0OiAgICBMQ0RFWFQ6IGlkeDIgPSB2YXIxMzsgaWR4MiA8IHZhcjE3OyBpZHgyICs9IGluYzIgKi8KKy5sb25nICAgMHg4MTQ4NjAxMAkvKiAwMDQ4OiAgICBMQ0Q6IGlkeDMgPSB2YXIyICsgdmFyMTY7IDsgaWR4MyArPSBpbmMyICovCisubG9uZyAgIDB4MDA2YWNmODgJLyogMDA0QzogICAgICBEUkQxQTogKmlkeDMgPSAqaWR4MTsgRk49MCBpbml0PTMgV1M9MSBSUz0xICovCisubG9uZyAgIDB4ODAwMGQxODQJLyogMDA1MDogICAgTENERVhUOiBpZHgxID0gMHhmMDAwMzE4NDsgOyAqLworLmxvbmcgICAweDg2ODEwNDkyCS8qIDAwNTQ6ICAgIExDRDogaWR4MiA9IHZhcjEzLCBpZHgzID0gdmFyMjsgaWR4MiA8IHZhcjE4OyBpZHgyICs9IGluYzIsIGlkeDMgKz0gaW5jMiAqLworLmxvbmcgICAweDAwNmFjZjg4CS8qIDAwNTg6ICAgICAgRFJEMUE6ICppZHgzID0gKmlkeDE7IEZOPTAgaW5pdD0zIFdTPTEgUlM9MSAqLworLmxvbmcgICAweDgwMDBkMTg0CS8qIDAwNUM6ICAgIExDREVYVDogaWR4MSA9IDB4ZjAwMDMxODQ7IDsgKi8KKy5sb25nICAgMHg4NjgxODRkMgkvKiAwMDYwOiAgICBMQ0Q6IGlkeDIgPSB2YXIxMywgaWR4MyA9IHZhcjM7IGlkeDIgPCB2YXIxOTsgaWR4MiArPSBpbmMyLCBpZHgzICs9IGluYzIgKi8KKy5sb25nICAgMHgwMDBhY2Y4OAkvKiAwMDY0OiAgICAgIERSRDFBOiAqaWR4MyA9ICppZHgxOyBGTj0wIGluaXQ9MCBXUz0xIFJTPTEgKi8KKy5sb25nICAgMHhjMzE4ODM5YgkvKiAwMDY4OiAgICBMQ0RFWFQ6IGlkeDEgPSB2YXI2OyBpZHgxID09IHZhcjE0OyBpZHgxICs9IGluYzMgKi8KKy5sb25nICAgMHg4MDE5MDAwMAkvKiAwMDZDOiAgICBMQ0Q6IGlkeDIgPSB2YXIwOyBpZHgyIG9uY2UgdmFyMDsgaWR4MiArPSBpbmMwICovCisubG9uZyAgIDB4MDQwMDg0NjgJLyogMDA3MDogICAgICBEUkQxQTogaWR4MSA9IHZhcjEzOyBGTj0wIElOVCBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4YzQwMzgzNTgJLyogMDA3NDogICAgTENERVhUOiBpZHgxID0gdmFyOCwgaWR4MiA9IHZhcjc7IGlkeDEgPT0gdmFyMTM7IGlkeDEgKz0gaW5jMywgaWR4MiArPSBpbmMwICovCisubG9uZyAgIDB4ODFjNTAwMDAJLyogMDA3ODogICAgTENEOiBpZHgzID0gdmFyMyArIHZhcjEwOyBpZHgzIG9uY2UgdmFyMDsgaWR4MyArPSBpbmMwICovCisubG9uZyAgIDB4MTAwMGNiMTgJLyogMDA3QzogICAgICBEUkQxQTogKmlkeDIgPSBpZHgzOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDAwMDAwZjE4CS8qIDAwODA6ICAgICAgRFJEMUE6IHZhcjMgPSBpZHgzOyBGTj0wIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHhjNDE4ODM2NAkvKiAwMDg0OiAgICBMQ0RFWFQ6IGlkeDEgPSB2YXI4OyBpZHgxID4gdmFyMTM7IGlkeDEgKz0gaW5jNCAqLworLmxvbmcgICAweDgzOTkwMDAwCS8qIDAwODg6ICAgIExDRDogaWR4MiA9IHZhcjc7IGlkeDIgb25jZSB2YXIwOyBpZHgyICs9IGluYzAgKi8KKy5sb25nICAgMHgxMDAwMGMwMAkvKiAwMDhDOiAgICAgIERSRDFBOiB2YXIzID0gdmFyMDsgRk49MCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMDAwYzgwMAkvKiAwMDkwOiAgICAgIERSRDFBOiAqaWR4MiA9IHZhcjA7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDgxOTg4MDAwCS8qIDAwOTQ6ICAgIExDRDogaWR4MSA9IHZhcjM7IGlkeDEgb25jZSB2YXIwOyBpZHgxICs9IGluYzAgKi8KKy5sb25nICAgMHgxMDAwMDc4OAkvKiAwMDk4OiAgICAgIERSRDFBOiB2YXIxID0gKmlkeDE7IEZOPTAgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4NjAwMDAwMDAJLyogMDA5QzogICAgICBEUkQyQTogRVUwPTAgRVUxPTAgRVUyPTAgRVUzPTAgRVhUIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwODBjZjA0YwkvKiAwMEEwOiAgICAgIERSRDJCMTogaWR4MCA9IEVVMygpOyBFVTModmFyMSx2YXIxMikgICovCisubG9uZyAgIDB4MDAwMDAxZjgJLyogMDBBNCg6MCk6ICAgIE5PUCAqLworCisKKy5nbG9ibCBzY0V0aGVybmV0WG1pdF9URFQKK3NjRXRoZXJuZXRYbWl0X1REVDoJLyogVGFzayAxIERlc2NyaXB0b3IgVGFibGUgKi8KKy5sb25nICAgMHg4MDAyNDgwMAkvKiAwMDAwOiAgTENERVhUOiBpZHgwID0gMHhmMDAwODgwMDsgOyAqLworLmxvbmcgICAweDg1YzYwMDA0CS8qIDAwMDQ6ICBMQ0Q6IGlkeDEgPSB2YXIxMSArIHZhcjEyICsgNDsgaWR4MSBvbmNlIHZhcjA7IGlkeDEgKz0gaW5jMCAqLworLmxvbmcgICAweDEwMDAyMzA4CS8qIDAwMDg6ICAgIERSRDFBOiB2YXI4ID0gaWR4MTsgRk49MCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgxMDAwMGY4OAkvKiAwMDBDOiAgICBEUkQxQTogdmFyMyA9ICppZHgxOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDAwMDAwMzgwCS8qIDAwMTA6ICAgIERSRDFBOiB2YXIwID0gKmlkeDA7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDgxOTgwMDAwCS8qIDAwMTQ6ICBMQ0Q6IGlkeDAgPSB2YXIzOyBpZHgwIG9uY2UgdmFyMDsgaWR4MCArPSBpbmMwICovCisubG9uZyAgIDB4MTAwMDA3ODAJLyogMDAxODogICAgRFJEMUE6IHZhcjEgPSAqaWR4MDsgRk49MCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHg2MDAwMDAwMAkvKiAwMDFDOiAgICBEUkQyQTogRVUwPTAgRVUxPTAgRVUyPTAgRVUzPTAgRVhUIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMjRjZjA0ZAkvKiAwMDIwOiAgICBEUkQyQjE6IHZhcjkgPSBFVTMoKTsgRVUzKHZhcjEsdmFyMTMpICAqLworLmxvbmcgICAweDg0OTgwMzA5CS8qIDAwMjQ6ICBMQ0Q6IGlkeDAgPSB2YXI5OyBpZHgwICE9IHZhcjEyOyBpZHgwICs9IGluYzEgKi8KKy5sb25nICAgMHhjMDAwNDAwMwkvKiAwMDI4OiAgICBMQ0RFWFQ6IGlkeDEgPSAweDAwMDAwMDAzOyA7ICovCisubG9uZyAgIDB4ODFjNjAwMDQJLyogMDAyQzogICAgTENEOiBpZHgyID0gdmFyMyArIHZhcjEyICsgNDsgaWR4MiBvbmNlIHZhcjA7IGlkeDIgKz0gaW5jMCAqLworLmxvbmcgICAweDcwMDAwMDAwCS8qIDAwMzA6ICAgICAgRFJEMkE6IEVVMD0wIEVVMT0wIEVVMj0wIEVVMz0wIEVYVCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMTBjZjA0ZQkvKiAwMDM0OiAgICAgIERSRDJCMTogdmFyNCA9IEVVMygpOyBFVTModmFyMSx2YXIxNCkgICovCisubG9uZyAgIDB4NzAwMDAwMDAJLyogMDAzODogICAgICBEUkQyQTogRVUwPTAgRVUxPTAgRVUyPTAgRVUzPTAgRVhUIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDAxNGNmMDRmCS8qIDAwM0M6ICAgICAgRFJEMkIxOiB2YXI1ID0gRVUzKCk7IEVVMyh2YXIxLHZhcjE1KSAgKi8KKy5sb25nICAgMHg3MDAwMDAwMAkvKiAwMDQwOiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MCBFWFQgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDI4Y2YwNTAJLyogMDA0NDogICAgICBEUkQyQjE6IHZhcjEwID0gRVUzKCk7IEVVMyh2YXIxLHZhcjE2KSAgKi8KKy5sb25nICAgMHg3MDAwMDAwMAkvKiAwMDQ4OiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MCBFWFQgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDE4Y2YwNTEJLyogMDA0QzogICAgICBEUkQyQjE6IHZhcjYgPSBFVTMoKTsgRVUzKHZhcjEsdmFyMTcpICAqLworLmxvbmcgICAweDEwMDAwYjkwCS8qIDAwNTA6ICAgICAgRFJEMUE6IHZhcjIgPSAqaWR4MjsgRk49MCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHg2MDAwMDAwMAkvKiAwMDU0OiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MCBFWFQgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDAxY2NmMGExCS8qIDAwNTg6ICAgICAgRFJEMkIxOiB2YXI3ID0gRVUzKCk7IEVVMyh2YXIyLGlkeDEpICAqLworLmxvbmcgICAweGMyOTg4MzEyCS8qIDAwNUM6ICAgIExDREVYVDogaWR4MSA9IHZhcjU7IGlkeDEgPiB2YXIxMjsgaWR4MSArPSBpbmMyICovCisubG9uZyAgIDB4ODM0OTAwMDAJLyogMDA2MDogICAgTENEOiBpZHgyID0gdmFyNiArIHZhcjE4OyBpZHgyIG9uY2UgdmFyMDsgaWR4MiArPSBpbmMwICovCisubG9uZyAgIDB4MDAwMDFiMTAJLyogMDA2NDogICAgICBEUkQxQTogdmFyNiA9IGlkeDI7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDgwMDBkMWE0CS8qIDAwNjg6ICAgIExDREVYVDogaWR4MSA9IDB4ZjAwMDMxYTQ7IDsgKi8KKy5sb25nICAgMHg4MzAxMDMxYwkvKiAwMDZDOiAgICBMQ0Q6IGlkeDIgPSB2YXI2LCBpZHgzID0gdmFyMjsgaWR4MiA+IHZhcjEyOyBpZHgyICs9IGluYzMsIGlkeDMgKz0gaW5jNCAqLworLmxvbmcgICAweDAwOGFjNzk4CS8qIDAwNzA6ICAgICAgRFJEMUE6ICppZHgxID0gKmlkeDM7IEZOPTAgaW5pdD00IFdTPTEgUlM9MSAqLworLmxvbmcgICAweDgwMDBkMWE0CS8qIDAwNzQ6ICAgIExDREVYVDogaWR4MSA9IDB4ZjAwMDMxYTQ7IDsgKi8KKy5sb25nICAgMHhjMTQzMDAwMAkvKiAwMDc4OiAgICBMQ0RFWFQ6IGlkeDIgPSB2YXIyICsgdmFyNjsgaWR4MiBvbmNlIHZhcjA7IGlkeDIgKz0gaW5jMCAqLworLmxvbmcgICAweDgyOTk4MzEyCS8qIDAwN0M6ICAgIExDRDogaWR4MyA9IHZhcjU7IGlkeDMgPiB2YXIxMjsgaWR4MyArPSBpbmMyICovCisubG9uZyAgIDB4MDg4YWM3OTAJLyogMDA4MDogICAgICBEUkQxQTogKmlkeDEgPSAqaWR4MjsgRk49MCBURkQgaW5pdD00IFdTPTEgUlM9MSAqLworLmxvbmcgICAweDgxOTg4MDAwCS8qIDAwODQ6ICAgIExDRDogaWR4MSA9IHZhcjM7IGlkeDEgb25jZSB2YXIwOyBpZHgxICs9IGluYzAgKi8KKy5sb25nICAgMHg2MDAwMDAwMQkvKiAwMDg4OiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MSBFWFQgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDBjNGNmYzRkCS8qIDAwOEM6ICAgICAgRFJEMkIxOiAqaWR4MSA9IEVVMygpOyBFVTMoKmlkeDEsdmFyMTMpICAqLworLmxvbmcgICAweGMyMTg4M2FkCS8qIDAwOTA6ICAgIExDREVYVDogaWR4MSA9IHZhcjQ7IGlkeDEgPT0gdmFyMTQ7IGlkeDEgKz0gaW5jNSAqLworLmxvbmcgICAweDgwMTkwMDAwCS8qIDAwOTQ6ICAgIExDRDogaWR4MiA9IHZhcjA7IGlkeDIgb25jZSB2YXIwOyBpZHgyICs9IGluYzAgKi8KKy5sb25nICAgMHgwNDAwODQ2MAkvKiAwMDk4OiAgICAgIERSRDFBOiBpZHgxID0gdmFyMTI7IEZOPTAgSU5UIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHhjNDA1MjMwNQkvKiAwMDlDOiAgICBMQ0RFWFQ6IGlkeDEgPSB2YXI4LCBpZHgyID0gdmFyMTA7IGlkeDIgPT0gdmFyMTI7IGlkeDEgKz0gaW5jMCwgaWR4MiArPSBpbmM1ICovCisubG9uZyAgIDB4ODFjOTgwMDAJLyogMDBBMDogICAgTENEOiBpZHgzID0gdmFyMyArIHZhcjE5OyBpZHgzIG9uY2UgdmFyMDsgaWR4MyArPSBpbmMwICovCisubG9uZyAgIDB4MTAwMGM3MTgJLyogMDBBNDogICAgICBEUkQxQTogKmlkeDEgPSBpZHgzOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDAwMDAwZjE4CS8qIDAwQTg6ICAgICAgRFJEMUE6IHZhcjMgPSBpZHgzOyBGTj0wIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHhjNDE4ODAwMAkvKiAwMEFDOiAgICBMQ0RFWFQ6IGlkeDEgPSB2YXI4OyBpZHgxIG9uY2UgdmFyMDsgaWR4MSArPSBpbmMwICovCisubG9uZyAgIDB4ODUxOTAzMTIJLyogMDBCMDogICAgTENEOiBpZHgyID0gdmFyMTA7IGlkeDIgPiB2YXIxMjsgaWR4MiArPSBpbmMyICovCisubG9uZyAgIDB4MTAwMDBjMDAJLyogMDBCNDogICAgICBEUkQxQTogdmFyMyA9IHZhcjA7IEZOPTAgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MTAwMGM0MDAJLyogMDBCODogICAgICBEUkQxQTogKmlkeDEgPSB2YXIwOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDAwMDA4ODYwCS8qIDAwQkM6ICAgICAgRFJEMUE6IGlkeDIgPSB2YXIxMjsgRk49MCBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4ODE5ODgwMDAJLyogMDBDMDogICAgTENEOiBpZHgxID0gdmFyMzsgaWR4MSBvbmNlIHZhcjA7IGlkeDEgKz0gaW5jMCAqLworLmxvbmcgICAweDEwMDAwNzg4CS8qIDAwQzQ6ICAgICAgRFJEMUE6IHZhcjEgPSAqaWR4MTsgRk49MCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHg2MDAwMDAwMAkvKiAwMEM4OiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MCBFWFQgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDA4MGNmMDRkCS8qIDAwQ0M6ICAgICAgRFJEMkIxOiBpZHgwID0gRVUzKCk7IEVVMyh2YXIxLHZhcjEzKSAgKi8KKy5sb25nICAgMHgwMDAwMDFmOAkvKiAwMEQwKDowKTogICAgTk9QICovCisKKy5hbGlnbiAgOAorCisuZ2xvYmwgc2NFdGhlcm5ldFJlY3ZfVmFyVGFiCitzY0V0aGVybmV0UmVjdl9WYXJUYWI6CS8qIFRhc2sgMCBWYXJpYWJsZSBUYWJsZSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclswXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsxXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsyXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclszXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls0XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls1XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls2XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls3XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls4XSAqLworLmxvbmcgICAoQ09ORklHX1NZU19NQkFSICsgMHg4ODAwKQkvKiB2YXJbOV0gKi8KKy5sb25nICAgMHgwMDAwMDAwOAkvKiB2YXJbMTBdICovCisubG9uZyAgIDB4MDAwMDAwMGMJLyogdmFyWzExXSAqLworLmxvbmcgICAweDgwMDAwMDAwCS8qIHZhclsxMl0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMTNdICovCisubG9uZyAgIDB4MTAwMDAwMDAJLyogdmFyWzE0XSAqLworLmxvbmcgICAweDIwMDAwMDAwCS8qIHZhclsxNV0gKi8KKy5sb25nICAgMHgwMDAwMDVlNAkvKiB2YXJbMTZdICovCisubG9uZyAgIDB4MDAwMDAwMGUJLyogdmFyWzE3XSAqLworLmxvbmcgICAweDAwMDAwNWUwCS8qIHZhclsxOF0gKi8KKy5sb25nICAgMHgwMDAwMDAwNAkvKiB2YXJbMTldICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogdmFyWzIwXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsyMV0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMjJdICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogdmFyWzIzXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIGluY1swXSAqLworLmxvbmcgICAweDYwMDAwMDAwCS8qIGluY1sxXSAqLworLmxvbmcgICAweDIwMDAwMDAxCS8qIGluY1syXSAqLworLmxvbmcgICAweDgwMDAwMDAwCS8qIGluY1szXSAqLworLmxvbmcgICAweDQwMDAwMDAwCS8qIGluY1s0XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIGluY1s1XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIGluY1s2XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIGluY1s3XSAqLworCisuYWxpZ24gIDgKKworLmdsb2JsIHNjRXRoZXJuZXRYbWl0X1ZhclRhYgorc2NFdGhlcm5ldFhtaXRfVmFyVGFiOgkvKiBUYXNrIDEgVmFyaWFibGUgVGFibGUgKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMF0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMV0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMl0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbM10gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbNF0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbNV0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbNl0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbN10gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbOF0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbOV0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMTBdICovCisubG9uZyAgIChDT05GSUdfU1lTX01CQVIgKyAweDg4MDApCS8qIHZhclsxMV0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMTJdICovCisubG9uZyAgIDB4ODAwMDAwMDAJLyogdmFyWzEzXSAqLworLmxvbmcgICAweDEwMDAwMDAwCS8qIHZhclsxNF0gKi8KKy5sb25nICAgMHgwODAwMDAwMAkvKiB2YXJbMTVdICovCisubG9uZyAgIDB4MjAwMDAwMDAJLyogdmFyWzE2XSAqLworLmxvbmcgICAweDAwMDBmZmZmCS8qIHZhclsxN10gKi8KKy5sb25nICAgMHhmZmZmZmZmZgkvKiB2YXJbMThdICovCisubG9uZyAgIDB4MDAwMDAwMDgJLyogdmFyWzE5XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsyMF0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMjFdICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogdmFyWzIyXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsyM10gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiBpbmNbMF0gKi8KKy5sb25nICAgMHg2MDAwMDAwMAkvKiBpbmNbMV0gKi8KKy5sb25nICAgMHg0MDAwMDAwMAkvKiBpbmNbMl0gKi8KKy5sb25nICAgMHg0MDAwZmZmZgkvKiBpbmNbM10gKi8KKy5sb25nICAgMHhlMDAwMDAwMQkvKiBpbmNbNF0gKi8KKy5sb25nICAgMHg4MDAwMDAwMAkvKiBpbmNbNV0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiBpbmNbNl0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiBpbmNbN10gKi8KKworLmFsaWduICA4CisKKy5nbG9ibCBzY0V0aGVybmV0UmVjdl9GRFQKK3NjRXRoZXJuZXRSZWN2X0ZEVDoJLyogVGFzayAwIEZ1bmN0aW9uIERlc2NyaXB0b3IgVGFibGUgKi8KKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgyMTgwMDAwMAkvKiBhbmQoKSwgRVUjIDMgKi8KKy5sb25nICAgMHgyMTQwMDAwMAkvKiBhbmRuKCksIEVVIyAzICovCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorCisuYWxpZ24gIDgKKworLmdsb2JsIHNjRXRoZXJuZXRYbWl0X0ZEVAorc2NFdGhlcm5ldFhtaXRfRkRUOgkvKiBUYXNrIDEgRnVuY3Rpb24gRGVzY3JpcHRvciBUYWJsZSAqLworLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDIxODAwMDAwCS8qIGFuZCgpLCBFVSMgMyAqLworLmxvbmcgICAweDIxNDAwMDAwCS8qIGFuZG4oKSwgRVUjIDMgKi8KKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisKKworLmdsb2JsIHNjRXRoZXJuZXRSZWN2X0NTYXZlCitzY0V0aGVybmV0UmVjdl9DU2F2ZToJLyogVGFzayAwIGNvbnRleHQgc2F2ZSBzcGFjZSAqLworLnNwYWNlICAxMjgsIDB4MAorCisKKy5nbG9ibCBzY0V0aGVybmV0WG1pdF9DU2F2ZQorc2NFdGhlcm5ldFhtaXRfQ1NhdmU6CS8qIFRhc2sgMSBjb250ZXh0IHNhdmUgc3BhY2UgKi8KKy5zcGFjZSAgMTI4LCAweDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9pMmMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjdmNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2kyYy5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZmRlZiBDT05GSUdfSEFSRF9JMkMKKworI2luY2x1ZGUgPG1wYzV4eHguaD4KKyNpbmNsdWRlIDxpMmMuaD4KKworI2lmIChDT05GSUdfU1lTX0kyQ19NT0RVTEUgPT0gMikKKyNkZWZpbmUgSTJDX0JBU0UJTVBDNVhYWF9JMkMyCisjZWxpZiAoQ09ORklHX1NZU19JMkNfTU9EVUxFID09IDEpCisjZGVmaW5lIEkyQ19CQVNFCU1QQzVYWFhfSTJDMQorI2Vsc2UKKyNlcnJvciBDT05GSUdfU1lTX0kyQ19NT0RVTEUgaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQKKyNlbmRpZgorCisjZGVmaW5lIEkyQ19USU1FT1VUCTY2NjcKKyNkZWZpbmUgSTJDX1JFVFJJRVMJMworCitzdHJ1Y3QgbXBjNXh4eF9pMmNfdGFwIHsKKwlpbnQgc2NsMnRhcDsKKwlpbnQgdGFwMnRhcDsKK307CisKK3N0YXRpYyBpbnQgIG1wY19yZWdfaW4gICAgKHZvbGF0aWxlIHUzMiAqcmVnKTsKK3N0YXRpYyB2b2lkIG1wY19yZWdfb3V0ICAgKHZvbGF0aWxlIHUzMiAqcmVnLCBpbnQgdmFsLCBpbnQgbWFzayk7CitzdGF0aWMgaW50ICB3YWl0X2Zvcl9iYiAgICh2b2lkKTsKK3N0YXRpYyBpbnQgIHdhaXRfZm9yX3BpbiAgKGludCAqc3RhdHVzKTsKK3N0YXRpYyBpbnQgIGRvX2FkZHJlc3MgICAgKHVjaGFyIGNoaXAsIGNoYXIgcmR3cl9mbGFnKTsKK3N0YXRpYyBpbnQgIHNlbmRfYnl0ZXMgICAgKHVjaGFyIGNoaXAsIGNoYXIgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgaW50ICByZWNlaXZlX2J5dGVzICh1Y2hhciBjaGlwLCBjaGFyICpidWYsIGludCBsZW4pOworc3RhdGljIGludCAgbXBjX2dldF9mZHIgICAoaW50KTsKKworc3RhdGljIGludCBtcGNfcmVnX2luKHZvbGF0aWxlIHUzMiAqcmVnKQoreworCWludCByZXQgPSAqcmVnID4+IDI0OworCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtcGNfcmVnX291dCh2b2xhdGlsZSB1MzIgKnJlZywgaW50IHZhbCwgaW50IG1hc2spCit7CisJaW50IHRtcDsKKworCWlmICghbWFzaykgeworCQkqcmVnID0gdmFsIDw8IDI0OworCX0gZWxzZSB7CisJCXRtcCA9IG1wY19yZWdfaW4ocmVnKTsKKwkJKnJlZyA9ICgodG1wICYgfm1hc2spIHwgKHZhbCAmIG1hc2spKSA8PCAyNDsKKwl9CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX2JiKHZvaWQpCit7CisJc3RydWN0IG1wYzV4eHhfaTJjICpyZWdzICAgID0gKHN0cnVjdCBtcGM1eHh4X2kyYyAqKUkyQ19CQVNFOworCWludCAgICAgICAgICAgICAgICAgdGltZW91dCA9IEkyQ19USU1FT1VUOworCWludCAgICAgICAgICAgICAgICAgc3RhdHVzOworCisJc3RhdHVzID0gbXBjX3JlZ19pbigmcmVncy0+bXNyKTsKKworCXdoaWxlICh0aW1lb3V0LS0gJiYgKHN0YXR1cyAmIEkyQ19CQikpIHsKKyNpZiAxCisJCXZvbGF0aWxlIGludCB0ZW1wOworCQltcGNfcmVnX291dCgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKwkJdGVtcCA9IG1wY19yZWdfaW4oJnJlZ3MtPm1kcik7CisJCW1wY19yZWdfb3V0KCZyZWdzLT5tY3IsIDAsIEkyQ19TVEEpOworCQltcGNfcmVnX291dCgmcmVncy0+bWNyLCAwLCAwKTsKKwkJbXBjX3JlZ19vdXQoJnJlZ3MtPm1jciwgSTJDX0VOLCAwKTsKKyNlbmRpZgorCQl1ZGVsYXkoMTUpOworCQlzdGF0dXMgPSBtcGNfcmVnX2luKCZyZWdzLT5tc3IpOworCX0KKworCXJldHVybiAoc3RhdHVzICYgSTJDX0JCKTsKK30KKworc3RhdGljIGludCB3YWl0X2Zvcl9waW4oaW50ICpzdGF0dXMpCit7CisJc3RydWN0IG1wYzV4eHhfaTJjICpyZWdzICAgID0gKHN0cnVjdCBtcGM1eHh4X2kyYyAqKUkyQ19CQVNFOworCWludCAgICAgICAgICAgICAgICAgdGltZW91dCA9IEkyQ19USU1FT1VUOworCisJKnN0YXR1cyA9IG1wY19yZWdfaW4oJnJlZ3MtPm1zcik7CisKKwl3aGlsZSAodGltZW91dC0tICYmICEoKnN0YXR1cyAmIEkyQ19JRikpIHsKKwkJdWRlbGF5KDE1KTsKKwkJKnN0YXR1cyA9IG1wY19yZWdfaW4oJnJlZ3MtPm1zcik7CisJfQorCisJaWYgKCEoKnN0YXR1cyAmIEkyQ19JRikpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCW1wY19yZWdfb3V0KCZyZWdzLT5tc3IsIDAsIEkyQ19JRik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19hZGRyZXNzKHVjaGFyIGNoaXAsIGNoYXIgcmR3cl9mbGFnKQoreworCXN0cnVjdCBtcGM1eHh4X2kyYyAqcmVncyA9IChzdHJ1Y3QgbXBjNXh4eF9pMmMgKilJMkNfQkFTRTsKKwlpbnQgICAgICAgICAgICAgICAgIHN0YXR1czsKKworCWNoaXAgPDw9IDE7CisKKwlpZiAocmR3cl9mbGFnKSB7CisJCWNoaXAgfD0gMTsKKwl9CisKKwltcGNfcmVnX291dCgmcmVncy0+bWNyLCBJMkNfVFgsIEkyQ19UWCk7CisJbXBjX3JlZ19vdXQoJnJlZ3MtPm1kciwgY2hpcCwgMCk7CisKKwlpZiAod2FpdF9mb3JfcGluKCZzdGF0dXMpKSB7CisJCXJldHVybiAtMjsKKwl9CisKKwlpZiAoc3RhdHVzICYgSTJDX1JYQUspIHsKKwkJcmV0dXJuIC0zOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlbmRfYnl0ZXModWNoYXIgY2hpcCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBtcGM1eHh4X2kyYyAqcmVncyA9IChzdHJ1Y3QgbXBjNXh4eF9pMmMgKilJMkNfQkFTRTsKKwlpbnQgICAgICAgICAgICAgICAgIHdyY291bnQ7CisJaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7CisKKwlmb3IgKHdyY291bnQgPSAwOyB3cmNvdW50IDwgbGVuOyArK3dyY291bnQpIHsKKworCQltcGNfcmVnX291dCgmcmVncy0+bWRyLCBidWZbd3Jjb3VudF0sIDApOworCisJCWlmICh3YWl0X2Zvcl9waW4oJnN0YXR1cykpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIEkyQ19SWEFLKSB7CisJCQlicmVhazsKKwkJfQorCisJfQorCisJcmV0dXJuICEod3Jjb3VudCA9PSBsZW4pOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfYnl0ZXModWNoYXIgY2hpcCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBtcGM1eHh4X2kyYyAqcmVncyAgICA9IChzdHJ1Y3QgbXBjNXh4eF9pMmMgKilJMkNfQkFTRTsKKwlpbnQgICAgICAgICAgICAgICAgIGR1bW15ICAgPSAxOworCWludCAgICAgICAgICAgICAgICAgcmRjb3VudCA9IDA7CisJaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7CisJaW50ICAgICAgICAgICAgICAgICBpOworCisJbXBjX3JlZ19vdXQoJnJlZ3MtPm1jciwgMCwgSTJDX1RYKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQlidWZbcmRjb3VudF0gPSBtcGNfcmVnX2luKCZyZWdzLT5tZHIpOworCisJCWlmIChkdW1teSkgeworCQkJZHVtbXkgPSAwOworCQl9IGVsc2UgeworCQkJcmRjb3VudCsrOworCQl9CisKKworCQlpZiAod2FpdF9mb3JfcGluKCZzdGF0dXMpKSB7CisJCQlyZXR1cm4gLTQ7CisJCX0KKwl9CisKKwltcGNfcmVnX291dCgmcmVncy0+bWNyLCBJMkNfVFhBSywgSTJDX1RYQUspOworCWJ1ZltyZGNvdW50KytdID0gbXBjX3JlZ19pbigmcmVncy0+bWRyKTsKKworCWlmICh3YWl0X2Zvcl9waW4oJnN0YXR1cykpIHsKKwkJcmV0dXJuIC01OworCX0KKworCW1wY19yZWdfb3V0KCZyZWdzLT5tY3IsIDAsIEkyQ19UWEFLKTsKKworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0kyQ19JTklUX01QQzVYWFgpCisKKyNkZWZpbmUgRkRSNTEwKHgpICh1OCkgKCgoeCAmIDB4MjApID4+IDMpIHwgKHggJiAweDMpKQorI2RlZmluZSBGRFI0MzIoeCkgKHU4KSAoKHggJiAweDFDKSA+PiAyKQorLyoKKyAqIFJlc2V0IGFueSBpMmMgZGV2aWNlcyB0aGF0IG1heSBoYXZlIGJlZW4gaW50ZXJydXB0ZWQgZHVyaW5nIGEgc3lzdGVtIHJlc2V0LgorICogTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgY2xvY2tpbmcgdGhlIGxpbmUgdW50aWwgU0NMIGFuZCBTREEKKyAqIGFyZSByZWxlYXNlZCBhbmQgdGhlbiBzZW5kaW5nIGEgc3RhcnQgY29uZHRpaW9uIChGcm9tIGFuIEF0bWVsIGRhdGFzaGVldCkuCisgKiBUaGVyZSBpcyBubyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBpMmMgcGlucyBzbyBpbnN0ZWFkIGNyZWF0ZSBzdGFydCBjb21tYW5kcworICogdGhyb3VnaCB0aGUgaTJjIGludGVyZmFjZS4gIFNlbmQgYSBzdGFydCBjb21tYW5kIHRoZW4gZGVsYXkgZm9yIHRoZSBTREEgSG9sZAorICogdGltZSwgcmVwZWF0IHRoaXMgYnkgZGlzYWJsaW5nL2VuYWJsaW5nIHRoZSBidXMgYSB0b3RhbCBvZiA5IHRpbWVzLgorICovCitzdGF0aWMgdm9pZCBzZW5kX3Jlc2V0KHZvaWQpCit7CisJc3RydWN0IG1wYzV4eHhfaTJjICpyZWdzID0gKHN0cnVjdCBtcGM1eHh4X2kyYyAqKUkyQ19CQVNFOworCWludCBpOworCXUzMiBkZWxheTsKKwl1OCBmZHI7CisJaW50IFNEQV9UYXBbXSA9IHsgMywgMywgNCwgNCwgMSwgMSwgMiwgMn07CisJc3RydWN0IG1wYzV4eHhfaTJjX3RhcCBzY2x0YXBbXSA9IHsKKwkJezQsIDF9LAorCQl7NCwgMn0sCisJCXs2LCA0fSwKKwkJezYsIDh9LAorCQl7MTQsIDE2fSwKKwkJezMwLCAzMn0sCisJCXs2MiwgNjR9LAorCQl7MTI2LCAxMjh9CisJfTsKKworCWZkciA9ICh1OCltcGNfcmVnX2luKCZyZWdzLT5tZmRyKTsKKworCWRlbGF5ID0gc2NsdGFwW0ZEUjQzMihmZHIpXS5zY2wydGFwICsgKChTREFfVGFwW0ZEUjUxMChmZHIpXSAtIDEpICogXAorCQlzY2x0YXBbRkRSNDMyKGZkcildLnRhcDJ0YXApICsgMzsKKworCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKwkJbXBjX3JlZ19vdXQoJnJlZ3MtPm1jciwgSTJDX0VOfEkyQ19TVEF8STJDX1RYLCBJMkNfSU5JVF9NQVNLKTsKKwkJdWRlbGF5KGRlbGF5KTsKKwkJbXBjX3JlZ19vdXQoJnJlZ3MtPm1jciwgMCwgSTJDX0lOSVRfTUFTSyk7CisJCXVkZWxheShkZWxheSk7CisJfQorCisJbXBjX3JlZ19vdXQoJnJlZ3MtPm1jciwgSTJDX0VOLCBJMkNfSU5JVF9NQVNLKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU1lTX0kyY19JTklUX01QQzVYWFggKi8KKworLyoqKioqKioqKioqKioqKiogSTJDIEFQSSAqKioqKioqKioqKioqKioqLworCit2b2lkIGkyY19pbml0KGludCBzcGVlZCwgaW50IHNhZGRyKQoreworCXN0cnVjdCBtcGM1eHh4X2kyYyAqcmVncyA9IChzdHJ1Y3QgbXBjNXh4eF9pMmMgKilJMkNfQkFTRTsKKworCW1wY19yZWdfb3V0KCZyZWdzLT5tY3IsIDAsIDApOworCW1wY19yZWdfb3V0KCZyZWdzLT5tYWRyLCBzYWRkciA8PCAxLCAwKTsKKworCS8qIFNldCBjbG9jaworCSAqLworCW1wY19yZWdfb3V0KCZyZWdzLT5tZmRyLCBtcGNfZ2V0X2ZkcihzcGVlZCksIDApOworCisJLyogRW5hYmxlIG1vZHVsZQorCSAqLworCW1wY19yZWdfb3V0KCZyZWdzLT5tY3IsIEkyQ19FTiwgSTJDX0lOSVRfTUFTSyk7CisJbXBjX3JlZ19vdXQoJnJlZ3MtPm1zciwgMCwgSTJDX0lGKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19JMkNfSU5JVF9NUEM1WFhYKQorCXNlbmRfcmVzZXQoKTsKKyNlbmRpZgorCXJldHVybjsKK30KKworc3RhdGljIGludCBtcGNfZ2V0X2ZkcihpbnQgc3BlZWQpCit7CisJc3RhdGljIGludCBmZHIgPSAtMTsKKworCWlmIChmZHIgPT0gLTEpIHsKKwkJdWxvbmcgYmVzdF9zcGVlZCA9IDA7CisJCXVsb25nIGRpdmlkZXI7CisJCXVsb25nIGlwYiwgc2NsOworCQl1bG9uZyBiZXN0bWF0Y2ggPSAweGZmZmZmZmZmVUw7CisJCWludCBiZXN0X2kgPSAwLCBiZXN0X2ogPSAwLCBpLCBqOworCQlpbnQgU0NMX1RhcFtdID0geyA5LCAxMCwgMTIsIDE1LCA1LCA2LCA3LCA4fTsKKwkJc3RydWN0IG1wYzV4eHhfaTJjX3RhcCBzY2x0YXBbXSA9IHsKKwkJCXs0LCAxfSwKKwkJCXs0LCAyfSwKKwkJCXs2LCA0fSwKKwkJCXs2LCA4fSwKKwkJCXsxNCwgMTZ9LAorCQkJezMwLCAzMn0sCisJCQl7NjIsIDY0fSwKKwkJCXsxMjYsIDEyOH0KKwkJfTsKKworCQlpcGIgPSBnZC0+aXBiX2NsazsKKwkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKKwkJCWZvciAoaiA9IDc7IGogPj0gMDsgai0tKSB7CisJCQkJc2NsID0gMiAqIChzY2x0YXBbal0uc2NsMnRhcCArCisJCQkJCShTQ0xfVGFwW2ldIC0gMSkgKiBzY2x0YXBbal0udGFwMnRhcCArIDIpOworCQkJCWlmIChpcGIgPD0gc3BlZWQqc2NsKSB7CisJCQkJCWlmICgoc3BlZWQqc2NsIC0gaXBiKSA8IGJlc3RtYXRjaCkgeworCQkJCQkJYmVzdG1hdGNoID0gc3BlZWQqc2NsIC0gaXBiOworCQkJCQkJYmVzdF9pID0gaTsKKwkJCQkJCWJlc3RfaiA9IGo7CisJCQkJCQliZXN0X3NwZWVkID0gaXBiL3NjbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlkaXZpZGVyID0gKGJlc3RfaSAmIDMpIHwgKChiZXN0X2kgJiA0KSA8PCAzKSB8IChiZXN0X2ogPDwgMik7CisJCWlmIChnZC0+ZmxhZ3MgJiBHRF9GTEdfUkVMT0MpIHsKKwkJCWZkciA9IGRpdmlkZXI7CisJCX0gZWxzZSB7CisJCQlpZiAoZ2QtPmhhdmVfY29uc29sZSkKKwkJCQlwcmludGYoIiVsZCBrSHosICIsIGJlc3Rfc3BlZWQgLyAxMDAwKTsKKwkJCXJldHVybiBkaXZpZGVyOworCQl9CisJfQorCisJcmV0dXJuIGZkcjsKK30KKworaW50IGkyY19wcm9iZSh1Y2hhciBjaGlwKQoreworCXN0cnVjdCBtcGM1eHh4X2kyYyAqcmVncyA9IChzdHJ1Y3QgbXBjNXh4eF9pMmMgKilJMkNfQkFTRTsKKwlpbnQgICAgICAgICAgICAgICAgIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTJDX1JFVFJJRVM7IGkrKykgeworCQltcGNfcmVnX291dCgmcmVncy0+bWNyLCBJMkNfU1RBLCBJMkNfU1RBKTsKKworCQlpZiAoISBkb19hZGRyZXNzKGNoaXAsIDApKSB7CisJCQltcGNfcmVnX291dCgmcmVncy0+bWNyLCAwLCBJMkNfU1RBKTsKKwkJCXVkZWxheSg1MDApOworCQkJYnJlYWs7CisJCX0KKworCQltcGNfcmVnX291dCgmcmVncy0+bWNyLCAwLCBJMkNfU1RBKTsKKwkJdWRlbGF5KDUwMCk7CisJfQorCisJcmV0dXJuIChpID09IEkyQ19SRVRSSUVTKTsKK30KKworaW50IGkyY19yZWFkKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWYsIGludCBsZW4pCit7CisJY2hhciAgICAgICAgICAgICAgICB4YWRkcls0XTsKKwlzdHJ1Y3QgbXBjNXh4eF9pMmMgKiByZWdzICAgICAgICA9IChzdHJ1Y3QgbXBjNXh4eF9pMmMgKilJMkNfQkFTRTsKKwlpbnQgICAgICAgICAgICAgICAgICByZXQgICAgICAgICA9IC0xOworCisJeGFkZHJbMF0gPSAoYWRkciA+PiAyNCkgJiAweEZGOworCXhhZGRyWzFdID0gKGFkZHIgPj4gMTYpICYgMHhGRjsKKwl4YWRkclsyXSA9IChhZGRyID4+ICA4KSAmIDB4RkY7CisJeGFkZHJbM10gPSAgYWRkcgkmIDB4RkY7CisKKwlpZiAod2FpdF9mb3JfYmIoKSkgeworCQlpZiAoZ2QtPmhhdmVfY29uc29sZSkKKwkJCXByaW50ZigiaTJjX3JlYWQ6IGJ1cyBpcyBidXN5XG4iKTsKKwkJZ290byBEb25lOworCX0KKworCW1wY19yZWdfb3V0KCZyZWdzLT5tY3IsIEkyQ19TVEEsIEkyQ19TVEEpOworCWlmIChkb19hZGRyZXNzKGNoaXAsIDApKSB7CisJCWlmIChnZC0+aGF2ZV9jb25zb2xlKQorCQkJcHJpbnRmKCJpMmNfcmVhZDogZmFpbGVkIHRvIGFkZHJlc3MgY2hpcFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAoc2VuZF9ieXRlcyhjaGlwLCAmeGFkZHJbNC1hbGVuXSwgYWxlbikpIHsKKwkJaWYgKGdkLT5oYXZlX2NvbnNvbGUpCisJCQlwcmludGYoImkyY19yZWFkOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwltcGNfcmVnX291dCgmcmVncy0+bWNyLCBJMkNfUlNUQSwgSTJDX1JTVEEpOworCWlmIChkb19hZGRyZXNzKGNoaXAsIDEpKSB7CisJCWlmIChnZC0+aGF2ZV9jb25zb2xlKQorCQkJcHJpbnRmKCJpMmNfcmVhZDogZmFpbGVkIHRvIGFkZHJlc3MgY2hpcFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAocmVjZWl2ZV9ieXRlcyhjaGlwLCAoY2hhciAqKWJ1ZiwgbGVuKSkgeworCQlpZiAoZ2QtPmhhdmVfY29uc29sZSkKKwkJCXByaW50ZigiaTJjX3JlYWQ6IHJlY2VpdmVfYnl0ZXMgZmFpbGVkXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCXJldCA9IDA7CitEb25lOgorCW1wY19yZWdfb3V0KCZyZWdzLT5tY3IsIDAsIEkyQ19TVEEpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBpMmNfd3JpdGUodWNoYXIgY2hpcCwgdWludCBhZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwljaGFyICAgICAgICAgICAgICAgeGFkZHJbNF07CisJc3RydWN0IG1wYzV4eHhfaTJjICpyZWdzICAgICAgICA9IChzdHJ1Y3QgbXBjNXh4eF9pMmMgKilJMkNfQkFTRTsKKwlpbnQgICAgICAgICAgICAgICAgIHJldCAgICAgICAgID0gLTE7CisKKwl4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisJeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworCXhhZGRyWzJdID0gKGFkZHIgPj4gIDgpICYgMHhGRjsKKwl4YWRkclszXSA9ICBhZGRyCSYgMHhGRjsKKworCWlmICh3YWl0X2Zvcl9iYigpKSB7CisJCWlmIChnZC0+aGF2ZV9jb25zb2xlKQorCQkJcHJpbnRmKCJpMmNfd3JpdGU6IGJ1cyBpcyBidXN5XG4iKTsKKwkJZ290byBEb25lOworCX0KKworCW1wY19yZWdfb3V0KCZyZWdzLT5tY3IsIEkyQ19TVEEsIEkyQ19TVEEpOworCWlmIChkb19hZGRyZXNzKGNoaXAsIDApKSB7CisJCWlmIChnZC0+aGF2ZV9jb25zb2xlKQorCQkJcHJpbnRmKCJpMmNfd3JpdGU6IGZhaWxlZCB0byBhZGRyZXNzIGNoaXBcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJaWYgKHNlbmRfYnl0ZXMoY2hpcCwgJnhhZGRyWzQtYWxlbl0sIGFsZW4pKSB7CisJCWlmIChnZC0+aGF2ZV9jb25zb2xlKQorCQkJcHJpbnRmKCJpMmNfd3JpdGU6IHNlbmRfYnl0ZXMgZmFpbGVkXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCWlmIChzZW5kX2J5dGVzKGNoaXAsIChjaGFyICopYnVmLCBsZW4pKSB7CisJCWlmIChnZC0+aGF2ZV9jb25zb2xlKQorCQkJcHJpbnRmKCJpMmNfd3JpdGU6IHNlbmRfYnl0ZXMgZmFpbGVkXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCXJldCA9IDA7CitEb25lOgorCW1wY19yZWdfb3V0KCZyZWdzLT5tY3IsIDAsIEkyQ19TVEEpOworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSEFSRF9JMkMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9pZGUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9pZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzM3YWJiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2lkZS5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFBpZXJyZSBBVUJFUlQsIFN0YXVibGkgRmF2ZXJnZXMsIDxwLmF1YmVydEBzdGF1YmxpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBJbml0IGlzIGRlcml2ZWQgZnJvbSBMaW51eCBjb2RlLgorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSURFKQorI2luY2x1ZGUgPG1wYzV4eHguaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNkZWZpbmUgQ0FMQ19USU1JTkcodCkgKHQgKyBwZXJpb2QgLSAxKSAvIHBlcmlvZAorCisjaWZkZWYgQ09ORklHX0lERV9SRVNFVAorZXh0ZXJuIHZvaWQgaW5pdF9pZGVfcmVzZXQgKHZvaWQpOworI2VuZGlmCisKK2ludCBpZGVfcHJlaW5pdCAodm9pZCkKK3sKKwlsb25nIHBlcmlvZCwgdDAsIHQxLCB0Ml84LCB0Ml8xNiwgdDQsIHRhOworCXZ1X2xvbmcgcmVnOworCXN0cnVjdCBtcGM1eHh4X3NkbWEgKnBzZG1hID0gKHN0cnVjdCBtcGM1eHh4X3NkbWEgKikgTVBDNVhYWF9TRE1BOworCisJcmVnID0gKih2dV9sb25nICopIE1QQzVYWFhfR1BTX1BPUlRfQ09ORklHOworI2lmIGRlZmluZWQoQ09ORklHX1NZU19BVEFfQ1NfT05fSTJDMikKKwkvKiBBVEEgY3MwLzEgb24gaTJjMiBjbGsvaW8gKi8KKwlyZWcgPSAocmVnICYgfjB4MDMwMDAwMDB1bCkgfCAweDAyMDAwMDAwdWw7CisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQVRBX0NTX09OX1RJTUVSMDEpCisJLyogQVRBIGNzMC8xIG9uIFRpbWVyIDAvMSAqLworCXJlZyA9IChyZWcgJiB+MHgwMzAwMDAwMHVsKSB8IDB4MDMwMDAwMDB1bDsKKyNlbHNlCisJLyogQVRBIGNzMC8xIG9uIExvY2FsIFBsdXMgY3M0LzUgKi8KKwlyZWcgPSAocmVnICYgfjB4MDMwMDAwMDB1bCkgfCAweDAxMDAwMDAwdWw7CisjZW5kaWYJLyogQ09ORklHX1RPVEFMNTIwMCAqLworCSoodnVfbG9uZyAqKSBNUEM1WFhYX0dQU19QT1JUX0NPTkZJRyA9IHJlZzsKKworCS8qIEFsbCBzYW1wbGUgY29kZXMgZG8gdGhhdC4uLiAqLworCSoodnVfbG9uZyAqKSBNUEM1WFhYX0FUQV9TSEFSRV9DT1VOVCA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19VQzEwMSkKKwkvKiBDb25maWd1cmUgYW5kIHJlc2V0IGhvc3QgKi8KKwkqKHZ1X2xvbmcgKikgTVBDNVhYWF9BVEFfSE9TVF9DT05GSUcgPQorCQlNUEM1eHh4X0FUQV9IT1NUQ09ORl9TTVIgfCBNUEM1eHh4X0FUQV9IT1NUQ09ORl9GUjsKKwl1ZGVsYXkgKDEwKTsKKwkqKHZ1X2xvbmcgKikgTVBDNVhYWF9BVEFfSE9TVF9DT05GSUcgPSAwOworI2Vsc2UKKwkvKiBDb25maWd1cmUgYW5kIHJlc2V0IGhvc3QgKi8KKwkqKHZ1X2xvbmcgKikgTVBDNVhYWF9BVEFfSE9TVF9DT05GSUcgPSBNUEM1eHh4X0FUQV9IT1NUQ09ORl9JT1JEWSB8CisJCU1QQzV4eHhfQVRBX0hPU1RDT05GX1NNUiB8IE1QQzV4eHhfQVRBX0hPU1RDT05GX0ZSOworCXVkZWxheSAoMTApOworCSoodnVfbG9uZyAqKSBNUEM1WFhYX0FUQV9IT1NUX0NPTkZJRyA9IE1QQzV4eHhfQVRBX0hPU1RDT05GX0lPUkRZOworI2VuZGlmCisKKwkvKiBEaXNhYmxlIHByZWZldGNoIG9uIENvbW1idXMgKi8KKwlwc2RtYS0+UHRkQ250cmwgfD0gMTsKKworCS8qIEluaXQgdGltaW5ncyA6IHdlIHVzZSBQSU8gbW9kZSAwIHRpbWluZ3MgKi8KKwlwZXJpb2QgPSAxMDAwMDAwMDAwIC8gZ2QtPmlwYl9jbGs7CS8qIHBlcmlvZCBpbiBucyAqLworCisJdDAgPSBDQUxDX1RJTUlORyAoNjAwKTsKKwl0Ml84ID0gQ0FMQ19USU1JTkcgKDI5MCk7CisJdDJfMTYgPSBDQUxDX1RJTUlORyAoMTY1KTsKKwlyZWcgPSAodDAgPDwgMjQpIHwgKHQyXzggPDwgMTYpIHwgKHQyXzE2IDw8IDgpOworCSoodnVfbG9uZyAqKSBNUEM1WFhYX0FUQV9QSU8xID0gcmVnOworCisJdDQgPSBDQUxDX1RJTUlORyAoMzApOworCXQxID0gQ0FMQ19USU1JTkcgKDcwKTsKKwl0YSA9IENBTENfVElNSU5HICgzNSk7CisJcmVnID0gKHQ0IDw8IDI0KSB8ICh0MSA8PCAxNikgfCAodGEgPDwgOCk7CisKKwkqKHZ1X2xvbmcgKikgTVBDNVhYWF9BVEFfUElPMiA9IHJlZzsKKworI2lmZGVmIENPTkZJR19JREVfUkVTRVQKKwlpbml0X2lkZV9yZXNldCAoKTsKKyNlbmRpZiAvKiBDT05GSUdfSURFX1JFU0VUICovCisKKwlyZXR1cm4gKDApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvaW50ZXJydXB0cy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2ludGVycnVwdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmVlZTNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2ludGVycnVwdHMuYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogRGV0bGV2IFp1bmRlbCwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgZHp1QGRlbnguZGUKKyAqCisgKiAoQykgQ29weXJpZ2h0IC0yMDAzCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogSm9zaCBIdWJlciA8aHViZXJAbWNseC5jb20+LCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogdGhpcyBzZWN0aW9uIHdhcyByaXBwZWQgb3V0IG9mIGFyY2gvcG93ZXJwYy9zeXNsaWIvbXBjNTJ4eF9waWMuYyBpbiB0aGUKKyAqIExpbnV4IDIuNiBzb3VyY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGNvcHlyaWdodC4KKyAqCisgKiBCYXNlZCBvbiAod2VsbCwgbW9zdGx5IGNvcGllZCBmcm9tKSB0aGUgY29kZSBmcm9tIHRoZSAyLjQga2VybmVsIGJ5CisgKiBEYWxlIEZhcm5zd29ydGggPGRmYXJuc3dvcnRoQG12aXN0YS5jb20+IGFuZCBLZW50IEJvcmcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBNb250YXZpc3RhIFNvZnR3YXJlLCBJbmMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworc3RydWN0IGlycV9hY3Rpb24geworCWludGVycnVwdF9oYW5kbGVyX3QgKmhhbmRsZXI7CisJdm9pZCAqYXJnOworCXVsb25nIGNvdW50OworfTsKKworc3RhdGljIHN0cnVjdCBpcnFfYWN0aW9uIGlycV9oYW5kbGVyc1tOUl9JUlFTXTsKKworc3RhdGljIHN0cnVjdCBtcGM1eHh4X2ludHIgKmludHI7CitzdGF0aWMgc3RydWN0IG1wYzV4eHhfc2RtYSAqc2RtYTsKKworc3RhdGljIHZvaWQgbXBjNXh4eF9pY19kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIHZhbDsKKworCWlmIChpcnEgPT0gTVBDNVhYWF9JUlEwKSB7CisJCXZhbCA9IGluX2JlMzIoJmludHItPmN0cmwpOworCQl2YWwgJj0gfigxIDw8IDExKTsKKwkJb3V0X2JlMzIoJmludHItPmN0cmwsIHZhbCk7CisJfSBlbHNlIGlmIChpcnEgPCBNUEM1WFhYX0lSUTEpIHsKKwkJQlVHKCk7CisJfSBlbHNlIGlmIChpcnEgPD0gTVBDNVhYWF9JUlEzKSB7CisJCXZhbCA9IGluX2JlMzIoJmludHItPmN0cmwpOworCQl2YWwgJj0gfigxIDw8ICgxMCAtIChpcnEgLSBNUEM1WFhYX0lSUTEpKSk7CisJCW91dF9iZTMyKCZpbnRyLT5jdHJsLCB2YWwpOworCX0gZWxzZSBpZiAoaXJxIDwgTVBDNVhYWF9TRE1BX0lSUV9CQVNFKSB7CisJCXZhbCA9IGluX2JlMzIoJmludHItPm1haW5fbWFzayk7CisJCXZhbCB8PSAxIDw8ICgxNiAtIChpcnEgLSBNUEM1WFhYX01BSU5fSVJRX0JBU0UpKTsKKwkJb3V0X2JlMzIoJmludHItPm1haW5fbWFzaywgdmFsKTsKKwl9IGVsc2UgaWYgKGlycSA8IE1QQzVYWFhfUEVSUF9JUlFfQkFTRSkgeworCQl2YWwgPSBpbl9iZTMyKCZzZG1hLT5JbnRNYXNrKTsKKwkJdmFsIHw9IDEgPDwgKGlycSAtIE1QQzVYWFhfU0RNQV9JUlFfQkFTRSk7CisJCW91dF9iZTMyKCZzZG1hLT5JbnRNYXNrLCB2YWwpOworCX0gZWxzZSB7CisJCXZhbCA9IGluX2JlMzIoJmludHItPnBlcl9tYXNrKTsKKwkJdmFsIHw9IDEgPDwgKDMxIC0gKGlycSAtIE1QQzVYWFhfUEVSUF9JUlFfQkFTRSkpOworCQlvdXRfYmUzMigmaW50ci0+cGVyX21hc2ssIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtcGM1eHh4X2ljX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiB2YWw7CisKKwlpZiAoaXJxID09IE1QQzVYWFhfSVJRMCkgeworCQl2YWwgPSBpbl9iZTMyKCZpbnRyLT5jdHJsKTsKKwkJdmFsIHw9IDEgPDwgMTE7CisJCW91dF9iZTMyKCZpbnRyLT5jdHJsLCB2YWwpOworCX0gZWxzZSBpZiAoaXJxIDwgTVBDNVhYWF9JUlExKSB7CisJCUJVRygpOworCX0gZWxzZSBpZiAoaXJxIDw9IE1QQzVYWFhfSVJRMykgeworCQl2YWwgPSBpbl9iZTMyKCZpbnRyLT5jdHJsKTsKKwkJdmFsIHw9IDEgPDwgKDEwIC0gKGlycSAtIE1QQzVYWFhfSVJRMSkpOworCQlvdXRfYmUzMigmaW50ci0+Y3RybCwgdmFsKTsKKwl9IGVsc2UgaWYgKGlycSA8IE1QQzVYWFhfU0RNQV9JUlFfQkFTRSkgeworCQl2YWwgPSBpbl9iZTMyKCZpbnRyLT5tYWluX21hc2spOworCQl2YWwgJj0gfigxIDw8ICgxNiAtIChpcnEgLSBNUEM1WFhYX01BSU5fSVJRX0JBU0UpKSk7CisJCW91dF9iZTMyKCZpbnRyLT5tYWluX21hc2ssIHZhbCk7CisJfSBlbHNlIGlmIChpcnEgPCBNUEM1WFhYX1BFUlBfSVJRX0JBU0UpIHsKKwkJdmFsID0gaW5fYmUzMigmc2RtYS0+SW50TWFzayk7CisJCXZhbCAmPSB+KDEgPDwgKGlycSAtIE1QQzVYWFhfU0RNQV9JUlFfQkFTRSkpOworCQlvdXRfYmUzMigmc2RtYS0+SW50TWFzaywgdmFsKTsKKwl9IGVsc2UgeworCQl2YWwgPSBpbl9iZTMyKCZpbnRyLT5wZXJfbWFzayk7CisJCXZhbCAmPSB+KDEgPDwgKDMxIC0gKGlycSAtIE1QQzVYWFhfUEVSUF9JUlFfQkFTRSkpKTsKKwkJb3V0X2JlMzIoJmludHItPnBlcl9tYXNrLCB2YWwpOworCX0KK30KKworc3RhdGljIHZvaWQgbXBjNXh4eF9pY19hY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgdmFsOworCisJLyoKKwkgKiBPbmx5IHNvbWUgaXJxcyBhcmUgcmVzZXQgaGVyZSwgb3RoZXJzIGluIGludGVycnVwdGluZyBoYXJkd2FyZS4KKwkgKi8KKworCXN3aXRjaCAoaXJxKSB7CisJY2FzZSBNUEM1WFhYX0lSUTA6CisJCXZhbCA9IGluX2JlMzIoJmludHItPmN0cmwpOworCQl2YWwgfD0gMHgwODAwMDAwMDsKKwkJb3V0X2JlMzIoJmludHItPmN0cmwsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgTVBDNVhYWF9DQ1NfSVJROgorCQl2YWwgPSBpbl9iZTMyKCZpbnRyLT5lbmNfc3RhdHVzKTsKKwkJdmFsIHw9IDB4MDAwMDA0MDA7CisJCW91dF9iZTMyKCZpbnRyLT5lbmNfc3RhdHVzLCB2YWwpOworCQlicmVhazsKKwljYXNlIE1QQzVYWFhfSVJRMToKKwkJdmFsID0gaW5fYmUzMigmaW50ci0+Y3RybCk7CisJCXZhbCB8PSAweDA0MDAwMDAwOworCQlvdXRfYmUzMigmaW50ci0+Y3RybCwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBNUEM1WFhYX0lSUTI6CisJCXZhbCA9IGluX2JlMzIoJmludHItPmN0cmwpOworCQl2YWwgfD0gMHgwMjAwMDAwMDsKKwkJb3V0X2JlMzIoJmludHItPmN0cmwsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgTVBDNVhYWF9JUlEzOgorCQl2YWwgPSBpbl9iZTMyKCZpbnRyLT5jdHJsKTsKKwkJdmFsIHw9IDB4MDEwMDAwMDA7CisJCW91dF9iZTMyKCZpbnRyLT5jdHJsLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoaXJxID49IE1QQzVYWFhfU0RNQV9JUlFfQkFTRQorCQkgICAgJiYgaXJxIDwgKE1QQzVYWFhfU0RNQV9JUlFfQkFTRSArIE1QQzVYWFhfU0RNQV9JUlFfTlVNKSkgeworCQkJb3V0X2JlMzIoJnNkbWEtPkludFBlbmQsCisJCQkJIDEgPDwgKGlycSAtIE1QQzVYWFhfU0RNQV9JUlFfQkFTRSkpOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbXBjNXh4eF9pY19kaXNhYmxlX2FuZF9hY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwltcGM1eHh4X2ljX2Rpc2FibGUoaXJxKTsKKwltcGM1eHh4X2ljX2FjayhpcnEpOworfQorCitzdGF0aWMgdm9pZCBtcGM1eHh4X2ljX2VuZCh1bnNpZ25lZCBpbnQgaXJxKQoreworCW1wYzV4eHhfaWNfZW5hYmxlKGlycSk7Cit9CisKK3ZvaWQgbXBjNXh4eF9pbml0X2lycSh2b2lkKQoreworCXUzMiBpbnRyX2N0cmw7CisKKwkvKiBSZW1hcCB0aGUgbmVjZXNzYXJ5IHpvbmVzICovCisJaW50ciA9IChzdHJ1Y3QgbXBjNXh4eF9pbnRyICopKE1QQzVYWFhfSUNUTCk7CisJc2RtYSA9IChzdHJ1Y3QgbXBjNXh4eF9zZG1hICopKE1QQzVYWFhfU0RNQSk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgc291cmNlcy4gKi8KKwlvdXRfYmUzMigmc2RtYS0+SW50UGVuZCwgMHhmZmZmZmZmZik7CS8qIDEgbWVhbnMgY2xlYXIgcGVuZGluZyAqLworCW91dF9iZTMyKCZzZG1hLT5JbnRNYXNrLCAweGZmZmZmZmZmKTsJLyogMSBtZWFucyBkaXNhYmxlZCAqLworCW91dF9iZTMyKCZpbnRyLT5wZXJfbWFzaywgMHg3ZmZmZmMwMCk7CS8qIDEgbWVhbnMgZGlzYWJsZWQgKi8KKwlvdXRfYmUzMigmaW50ci0+bWFpbl9tYXNrLCAweDAwMDEwZmZmKTsJLyogMSBtZWFucyBkaXNhYmxlZCAqLworCWludHJfY3RybCA9IGluX2JlMzIoJmludHItPmN0cmwpOworCWludHJfY3RybCB8PSAweDBmMDAwMDAwIHwJLyogY2xlYXIgSVJRIDAtMyAqLworCSAgICAweDAwZmYwMDAwIHwJLyogSVJRIDAtMyBsZXZlbCBzZW5zaXRpdmUgbG93IGFjdGl2ZSAqLworCSAgICAweDAwMDAxMDAwIHwJLyogTUVFIG1hc3RlciBleHRlcm5hbCBlbmFibGUgKi8KKwkgICAgMHgwMDAwMDAwMCB8CS8qIDAgbWVhbnMgZGlzYWJsZSBJUlEgMC0zICovCisJICAgIDB4MDAwMDAwMDE7CQkvKiBDRWIgcm91dGUgY3JpdGljYWwgbm9ybWFsbHkgKi8KKwlvdXRfYmUzMigmaW50ci0+Y3RybCwgaW50cl9jdHJsKTsKKworCS8qIFplcm8gYSBidW5jaCBvZiB0aGUgcHJpb3JpdHkgc2V0dGluZ3MuICAqLworCW91dF9iZTMyKCZpbnRyLT5wZXJfcHJpMSwgMCk7CisJb3V0X2JlMzIoJmludHItPnBlcl9wcmkyLCAwKTsKKwlvdXRfYmUzMigmaW50ci0+cGVyX3ByaTMsIDApOworCW91dF9iZTMyKCZpbnRyLT5tYWluX3ByaTEsIDApOworCW91dF9iZTMyKCZpbnRyLT5tYWluX3ByaTIsIDApOworfQorCitpbnQgbXBjNXh4eF9nZXRfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBzdGF0dXM7CisJaW50IGlycSA9IC0xOworCisJc3RhdHVzID0gaW5fYmUzMigmaW50ci0+ZW5jX3N0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgMHgwMDAwMDQwMCkgewkvKiBjcml0aWNhbCAqLworCQlpcnEgPSAoc3RhdHVzID4+IDgpICYgMHgzOworCQlpZiAoaXJxID09IDIpCS8qIGhpZ2ggcHJpb3JpdHkgcGVyaXBoZXJhbCAqLworCQkJZ290byBwZXJpcGhlcmFsOworCQlpcnEgKz0gTVBDNVhYWF9DUklUX0lSUV9CQVNFOworCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgwMDIwMDAwMCkgewkvKiBtYWluICovCisJCWlycSA9IChzdGF0dXMgPj4gMTYpICYgMHgxZjsKKwkJaWYgKGlycSA9PSA0KQkvKiBsb3cgcHJpb3JpdHkgcGVyaXBoZXJhbCAqLworCQkJZ290byBwZXJpcGhlcmFsOworCQlpcnEgKz0gTVBDNVhYWF9NQUlOX0lSUV9CQVNFOworCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgyMDAwMDAwMCkgewkvKiBwZXJpcGhlcmFsICovCisJICAgICAgcGVyaXBoZXJhbDoKKwkJaXJxID0gKHN0YXR1cyA+PiAyNCkgJiAweDFmOworCQlpZiAoaXJxID09IDApIHsJLyogYmVzdGNvbW0gKi8KKwkJCXN0YXR1cyA9IGluX2JlMzIoJnNkbWEtPkludFBlbmQpOworCQkJaXJxID0gZmZzKHN0YXR1cykgKyBNUEM1WFhYX1NETUFfSVJRX0JBU0UgLSAxOworCQl9IGVsc2UKKwkJCWlycSArPSBNUEM1WFhYX1BFUlBfSVJRX0JBU0U7CisJfQorCisJcmV0dXJuIGlycTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBpbnRlcnJ1cHRfaW5pdF9jcHUodWxvbmcgKiBkZWNyZW1lbnRlcl9jb3VudCkKK3sKKwkqZGVjcmVtZW50ZXJfY291bnQgPSBnZXRfdGJjbGsoKSAvIENPTkZJR19TWVNfSFo7CisKKwltcGM1eHh4X2luaXRfaXJxKCk7CisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhhbmRsZSBleHRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgZXh0ZXJuYWxfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBpcnEsIHVubWFzayA9IDE7CisKKwlpcnEgPSBtcGM1eHh4X2dldF9pcnEocmVncyk7CisKKwltcGM1eHh4X2ljX2Rpc2FibGVfYW5kX2FjayhpcnEpOworCisJZW5hYmxlX2ludGVycnVwdHMoKTsKKworCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyICE9IE5VTEwpCisJCSgqaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlcikgKGlycV9oYW5kbGVyc1tpcnFdLmFyZyk7CisJZWxzZSB7CisJCXByaW50ZigiXG5Cb2d1cyBFeHRlcm5hbCBJbnRlcnJ1cHQgSVJRICVkXG4iLCBpcnEpOworCQkvKgorCQkgKiB0dXJuIG9mZiB0aGUgYm9ndXMgaW50ZXJydXB0LCBvdGhlcndpc2UgaXQKKwkJICogbWlnaHQgcmVwZWF0IGZvcmV2ZXIKKwkJICovCisJCXVubWFzayA9IDA7CisJfQorCisJaWYgKHVubWFzaykKKwkJbXBjNXh4eF9pY19lbmQoaXJxKTsKK30KKwordm9pZCB0aW1lcl9pbnRlcnJ1cHRfY3B1KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBJbnN0YWxsIGFuZCBmcmVlIGEgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KKwordm9pZCBpcnFfaW5zdGFsbF9oYW5kbGVyKGludCBpcnEsIGludGVycnVwdF9oYW5kbGVyX3QgKiBoYW5kbGVyLCB2b2lkICphcmcpCit7CisJaWYgKGlycSA8IDAgfHwgaXJxID49IE5SX0lSUVMpIHsKKwkJcHJpbnRmKCJpcnFfaW5zdGFsbF9oYW5kbGVyOiBiYWQgaXJxIG51bWJlciAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyICE9IE5VTEwpCisJCXByaW50ZigiaXJxX2luc3RhbGxfaGFuZGxlcjogMHglMDhseCByZXBsYWNpbmcgMHglMDhseFxuIiwKKwkJICAgICAgICh1bG9uZykgaGFuZGxlciwgKHVsb25nKSBpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyKTsKKworCWlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIgPSBoYW5kbGVyOworCWlycV9oYW5kbGVyc1tpcnFdLmFyZyA9IGFyZzsKKworCW1wYzV4eHhfaWNfZW5hYmxlKGlycSk7Cit9CisKK3ZvaWQgaXJxX2ZyZWVfaGFuZGxlcihpbnQgaXJxKQoreworCWlmIChpcnEgPCAwIHx8IGlycSA+PSBOUl9JUlFTKSB7CisJCXByaW50ZigiaXJxX2ZyZWVfaGFuZGxlcjogYmFkIGlycSBudW1iZXIgJWRcbiIsIGlycSk7CisJCXJldHVybjsKKwl9CisKKwltcGM1eHh4X2ljX2Rpc2FibGUoaXJxKTsKKworCWlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIgPSBOVUxMOworCWlycV9oYW5kbGVyc1tpcnFdLmFyZyA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKK3ZvaWQgZG9faXJxaW5mbyhjbWRfdGJsX3QgKiBjbWR0cCwgYmRfdCAqIGJkLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaXJxLCByZV9lbmFibGU7CisJdTMyIGludHJfY3RybDsKKwljaGFyICppcnFfY29uZmlnW10gPSB7ICJsZXZlbCBzZW5zaXRpdmUsIGFjdGl2ZSBoaWdoIiwKKwkJImVkZ2Ugc2Vuc2l0aXZlLCByaXNpbmcgYWN0aXZlIGVkZ2UiLAorCQkiZWRnZSBzZW5zaXRpdmUsIGZhbGxpbmcgYWN0aXZlIGVkZ2UiLAorCQkibGV2ZWwgc2Vuc2l0aXZlLCBhY3RpdmUgbG93IgorCX07CisKKwlyZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCWludHJfY3RybCA9IGluX2JlMzIoJmludHItPmN0cmwpOworCXByaW50ZigiSW50ZXJydXB0IGNvbmZpZ3VyYXRpb246XG4iKTsKKworCWZvciAoaXJxID0gMDsgaXJxIDw9IDM7IGlycSsrKSB7CisJCXByaW50ZigiSVJRJWQ6ICVzXG4iLCBpcnEsCisJCSAgICAgICBpcnFfY29uZmlnWyhpbnRyX2N0cmwgPj4gKDIyIC0gMiAqIGlycSkpICYgMHgzXSk7CisJfQorCisJcHV0cygiXG5JbnRlcnJ1cHQtSW5mb3JtYXRpb246XG4iICJOciAgUm91dGluZSAgIEFyZyAgICAgICBDb3VudFxuIik7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKQorCQlpZiAoaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlciAhPSBOVUxMKQorCQkJcHJpbnRmKCIlMDJkICAlMDhseCAgJTA4bHggICVsZFxuIiwgaXJxLAorCQkJICAgICAgICh1bG9uZykgaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlciwKKwkJCSAgICAgICAodWxvbmcpIGlycV9oYW5kbGVyc1tpcnFdLmFyZywKKwkJCSAgICAgICBpcnFfaGFuZGxlcnNbaXJxXS5jb3VudCk7CisKKwlpZiAocmVfZW5hYmxlKQorCQllbmFibGVfaW50ZXJydXB0cygpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvaW8uUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9pby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzhhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvaW8uUwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgJRGFuIE1hbGVrIDxkbWFsZWtAamxjLm5ldD4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkJTWFnbnVzIERhbW0gPGtpZXJheXBjMDEucC55LmtpZS5lcmEuZXJpY3Nzb24uc2U+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAxCVN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICoJCQlBbmRyZWFzIEhlcHBlbCA8YWhlcHBlbEBzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBpbjggKi8KKy8qICBEZXNjcmlwdGlvbjogIElucHV0IDggYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibCAgaW44Citpbjg6CisJbGJ6ICAgICByMywwKHIzKQorCXN5bmMKKwlibHIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEZ1bmN0aW9uOiAgICAgaW4xNiAqLworLyogIERlc2NyaXB0aW9uOiAgSW5wdXQgMTYgYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibCAgaW4xNgoraW4xNjoKKwlsaHogICAgIHIzLDAocjMpCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBpbjE2ciAqLworLyogIERlc2NyaXB0aW9uOiAgSW5wdXQgMTYgYml0cyBhbmQgYnl0ZSByZXZlcnNlICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsICBpbjE2cgoraW4xNnI6CisJbGhicnggICByMywwLHIzCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBpbjMyICovCisvKiAgRGVzY3JpcHRpb246ICBJbnB1dCAzMiBiaXRzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsICBpbjMyCitpbjMyOgorCWx3eiAgICAgMywwKDMpCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBpbjMyciAqLworLyogIERlc2NyaXB0aW9uOiAgSW5wdXQgMzIgYml0cyBhbmQgYnl0ZSByZXZlcnNlICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgLmdsb2JsICBpbjMycgoraW4zMnI6CisJbHdicnggICByMywwLHIzCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBvdXQ4ICovCisvKiAgRGVzY3JpcHRpb246ICBPdXRwdXQgOCBiaXRzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsICBvdXQ4CitvdXQ4OgorCXN0YiAgICAgcjQsMChyMykKKwlzeW5jCisJYmxyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBGdW5jdGlvbjogICAgIG91dDE2ICovCisvKiAgRGVzY3JpcHRpb246ICBPdXRwdXQgMTYgYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibCAgb3V0MTYKK291dDE2OgorCXN0aCAgICAgcjQsMChyMykKKwlzeW5jCisJYmxyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBGdW5jdGlvbjogICAgIG91dDE2ciAqLworLyogIERlc2NyaXB0aW9uOiAgQnl0ZSByZXZlcnNlIGFuZCBvdXRwdXQgMTYgYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibCAgb3V0MTZyCitvdXQxNnI6CisJc3RoYnJ4ICByNCwwLHIzCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBvdXQzMiAqLworLyogIERlc2NyaXB0aW9uOiAgT3V0cHV0IDMyIGJpdHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwgIG91dDMyCitvdXQzMjoKKwlzdHcgICAgIHI0LDAocjMpCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246ICAgICBvdXQzMnIgKi8KKy8qICBEZXNjcmlwdGlvbjogIEJ5dGUgcmV2ZXJzZSBhbmQgb3V0cHV0IDMyIGJpdHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwgIG91dDMycgorb3V0MzJyOgorCXN0d2JyeCAgcjQsMCxyMworCXN5bmMKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9sb2FkdGFzay5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L2xvYWR0YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlN2I1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9sb2FkdGFzay5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGNvZGUKKyAqIChDKSBDb3B5cmlnaHQgTW90b3JvbGEsIEluYy4sIDIwMDAKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjNXh4eC5oPgorCisvKiBCZXN0Q29tbS9TbWFydENvbW0gbWljcm9jb2RlICovCitleHRlcm4gaW50IHRhc2tUYWJsZTsKKwordm9pZCBsb2FkdGFzayhpbnQgYmFzZXRhc2ssIGludCB0YXNrcykKK3sKKwlpbnQgKnNyYW0gPSAoaW50ICopTVBDNVhYWF9TUkFNOworCWludCAqdGFza19vcmcgPSAmdGFza1RhYmxlOworCXVuc2lnbmVkIGludCBzdGFydCwgb2Zmc2V0LCBlbmQ7CisJaW50IGk7CisKKyNpZmRlZiBERUJVRworCXByaW50ZigiYmFzZXRhc2sgPSAlZCwgdGFza3MgPSAlZFxuIiwgYmFzZXRhc2ssIHRhc2tzKTsKKwlwcmludGYoInRhc2tfb3JnID0gMHglMDh4XG4iLCAodW5zaWduZWQgaW50KXRhc2tfb3JnKTsKKyNlbmRpZgorCisJLyogc2V0dXAgVGFza0JBUiByZWdpc3RlciAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfU0RNQSA9IE1QQzVYWFhfU1JBTTsKKworCS8qIHJlbG9jYXRlIHRhc2sgdGFibGUgZW50cmllcyAqLworCW9mZnNldCA9ICh1bnNpZ25lZCBpbnQpc3JhbTsKKwlmb3IgKGkgPSBiYXNldGFzazsgaSA8IGJhc2V0YXNrICsgdGFza3M7IGkrKykgeworCQlzcmFtW2kgKiA4ICsgMF0gPSB0YXNrX29yZ1tpICogOCArIDBdICsgb2Zmc2V0OworCQlzcmFtW2kgKiA4ICsgMV0gPSB0YXNrX29yZ1tpICogOCArIDFdICsgb2Zmc2V0OworCQlzcmFtW2kgKiA4ICsgMl0gPSB0YXNrX29yZ1tpICogOCArIDJdICsgb2Zmc2V0OworCQlzcmFtW2kgKiA4ICsgM10gPSB0YXNrX29yZ1tpICogOCArIDNdICsgb2Zmc2V0OworCQlzcmFtW2kgKiA4ICsgNF0gPSB0YXNrX29yZ1tpICogOCArIDRdOworCQlzcmFtW2kgKiA4ICsgNV0gPSB0YXNrX29yZ1tpICogOCArIDVdOworCQlzcmFtW2kgKiA4ICsgNl0gPSB0YXNrX29yZ1tpICogOCArIDZdICsgb2Zmc2V0OworCQlzcmFtW2kgKiA4ICsgN10gPSB0YXNrX29yZ1tpICogOCArIDddOworCX0KKworCS8qIHJlbG9jYXRlIHRhc2sgZGVzY3JpcHRvcnMgKi8KKwlzdGFydCA9IChzcmFtW2Jhc2V0YXNrICogOF0gLSAodW5zaWduZWQgaW50KXNyYW0pOworCWVuZCA9IChzcmFtWyhiYXNldGFzayArIHRhc2tzIC0gMSkgKiA4ICsgMV0gLSAodW5zaWduZWQgaW50KXNyYW0pOworCisjaWZkZWYgREVCVUcKKwlwcmludGYgKCJURFQgc3RhcnQgPSAweCUwOHgsIGVuZCA9IDB4JTA4eFxuIiwgc3RhcnQsIGVuZCk7CisjZW5kaWYKKworCXN0YXJ0IC89IDQ7CisJZW5kIC89IDQ7CisJZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHsKKwkJc3JhbVtpXSA9IHRhc2tfb3JnW2ldOworCX0KKworCS8qIHJlbG9jYXRlIHZhcmlhYmxlcyAqLworCXN0YXJ0ID0gKHNyYW1bYmFzZXRhc2sgKiA4ICsgMl0gLSAodW5zaWduZWQgaW50KXNyYW0pOworCWVuZCA9IChzcmFtWyhiYXNldGFzayArIHRhc2tzIC0gMSkgKiA4ICsgMl0gKyAyNTYgLSAodW5zaWduZWQgaW50KXNyYW0pOworCXN0YXJ0IC89IDQ7CisJZW5kIC89IDQ7CisJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQlzcmFtW2ldID0gdGFza19vcmdbaV07CisJfQorCisJLyogcmVsb2NhdGUgZnVuY3Rpb24gZGVjcmlwdG9ycyAqLworCXN0YXJ0ID0gKChzcmFtW2Jhc2V0YXNrICogOCArIDNdICYgMHhmZmZmZmZmYykgLSAodW5zaWduZWQgaW50KXNyYW0pOworCWVuZCA9ICgoc3JhbVsoYmFzZXRhc2sgKyB0YXNrcyAtIDEpICogOCArIDNdICYgMHhmZmZmZmZmYykgKyAyNTYgLSAodW5zaWduZWQgaW50KXNyYW0pOworCXN0YXJ0IC89IDQ7CisJZW5kIC89IDQ7CisJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQlzcmFtW2ldID0gdGFza19vcmdbaV07CisJfQorCisJYXNtIHZvbGF0aWxlICgic3luYyIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3BjaV9tcGM1MjAwLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvcGNpX21wYzUyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjY4ZjhhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3BjaV9tcGM1MjAwLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8bXBjNXh4eC5oPgorCisvKiBTeXN0ZW0gUkFNIG1hcHBlZCBvdmVyIFBDSSAqLworI2RlZmluZSBDT05GSUdfUENJX01FTU9SWV9CVVMJQ09ORklHX1NZU19TRFJBTV9CQVNFCisjZGVmaW5lIENPTkZJR19QQ0lfTUVNT1JZX1BIWVMJQ09ORklHX1NZU19TRFJBTV9CQVNFCisjZGVmaW5lIENPTkZJR19QQ0lfTUVNT1JZX1NJWkUJKDEwMjQgKiAxMDI0ICogMTAyNCkKKworLyogUENJSVdDUiBiaXQgZmllbGRzICovCisjZGVmaW5lIElXQ1JfTUVNCSgwIDw8IDMpCisjZGVmaW5lIElXQ1JfSU8JCSgxIDw8IDMpCisjZGVmaW5lIElXQ1JfUkVBRAkoMCA8PCAxKQorI2RlZmluZSBJV0NSX1JFQURMSU5FCSgxIDw8IDEpCisjZGVmaW5lIElXQ1JfUkVBRE1VTFQJKDIgPDwgMSkKKyNkZWZpbmUgSVdDUl9FTgkJKDEgPDwgMCkKKworc3RhdGljIGludCBtcGM1MjAwX3JlYWRfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCSAgICAgIHBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQsIHUzMiogdmFsdWUpCit7CisJKih2b2xhdGlsZSB1MzIgKilNUEM1WFhYX1BDSV9DQVIgPSAoMSA8PCAzMSkgfCBkZXYgfCBvZmZzZXQ7CisJZWllaW8oKTsKKwl1ZGVsYXkoMTApOworI2lmIChkZWZpbmVkIENPTkZJR19QRjUyMDAgfHwgZGVmaW5lZCBDT05GSUdfQ1BDSTUyMDApCisJaWYgKGRldiAmIDB4MDBmZjAwMDApIHsKKwkJdTMyIHZhbDsKKwkJdmFsICA9IGluX2xlMTYoKHZvbGF0aWxlIHUxNiAqKShDT05GSUdfUENJX0lPX1BIWVMrMikpOworCQl1ZGVsYXkoMTApOworCQl2YWwgPSB2YWwgPDwgMTY7CisJCXZhbCB8PSBpbl9sZTE2KCh2b2xhdGlsZSB1MTYgKikoQ09ORklHX1BDSV9JT19QSFlTKzApKTsKKwkJKnZhbHVlID0gdmFsOworCX0gZWxzZSB7CisJCSp2YWx1ZSA9IGluX2xlMzIoKHZvbGF0aWxlIHUzMiAqKUNPTkZJR19QQ0lfSU9fUEhZUyk7CisJfQorCXVkZWxheSgxMCk7CisjZWxzZQorCSp2YWx1ZSA9IGluX2xlMzIoKHZvbGF0aWxlIHUzMiAqKUNPTkZJR19QQ0lfSU9fUEhZUyk7CisjZW5kaWYKKwllaWVpbygpOworCSoodm9sYXRpbGUgdTMyICopTVBDNVhYWF9QQ0lfQ0FSID0gMDsKKwl1ZGVsYXkoMTApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wYzUyMDBfd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCSAgICAgIHBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwkqKHZvbGF0aWxlIHUzMiAqKU1QQzVYWFhfUENJX0NBUiA9ICgxIDw8IDMxKSB8IGRldiB8IG9mZnNldDsKKwllaWVpbygpOworCXVkZWxheSgxMCk7CisJb3V0X2xlMzIoKHZvbGF0aWxlIHUzMiAqKUNPTkZJR19QQ0lfSU9fUEhZUywgdmFsdWUpOworCWVpZWlvKCk7CisJKih2b2xhdGlsZSB1MzIgKilNUEM1WFhYX1BDSV9DQVIgPSAwOworCXVkZWxheSgxMCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcGNpX21wYzV4eHhfaW5pdCAoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCS8qIFN5c3RlbSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQkgICAgICAgQ09ORklHX1BDSV9NRU1PUllfQlVTLAorCQkgICAgICAgQ09ORklHX1BDSV9NRU1PUllfUEhZUywKKwkJICAgICAgIENPTkZJR19QQ0lfTUVNT1JZX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fU1lTX01FTU9SWSk7CisKKwkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCSAgICAgICBDT05GSUdfUENJX01FTV9CVVMsCisJCSAgICAgICBDT05GSUdfUENJX01FTV9QSFlTLAorCQkgICAgICAgQ09ORklHX1BDSV9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIFBDSSBJTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkgICAgICAgQ09ORklHX1BDSV9JT19CVVMsCisJCSAgICAgICBDT05GSUdfUENJX0lPX1BIWVMsCisJCSAgICAgICBDT05GSUdfUENJX0lPX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDM7CisKKwlwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKKworCS8qIEdQSU8gTXVsdGlwbGV4aW5nIC0gZW5hYmxlIFBDSSAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfR1BTX1BPUlRfQ09ORklHICY9IH4oMSA8PCAxNSk7CisKKwkvKiBTZXQgaG9zdCBicmlkZ2UgYXMgcGNpIG1hc3RlciBhbmQgZW5hYmxlIG1lbW9yeSBkZWNvZGluZyAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfUENJX0NNRCB8PQorCQlQQ0lfQ09NTUFORF9NQVNURVIgfCBQQ0lfQ09NTUFORF9NRU1PUlk7CisKKwkvKiBTZXQgbWF4aW11bSBsYXRlbmN5IHRpbWVyICovCisJKih2dV9sb25nICopTVBDNVhYWF9QQ0lfQ0ZHIHw9ICgweGY4MDApOworCisJLyogU2V0IGNhY2hlIGxpbmUgc2l6ZSAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfUENJX0NGRyA9ICgqKHZ1X2xvbmcgKilNUEM1WFhYX1BDSV9DRkcgJiB+MHhmZikgfAorCQkoQ09ORklHX1NZU19DQUNIRUxJTkVfU0laRSAvIDQpOworCisJLyogTWFwIE1CQVIgdG8gUENJIHNwYWNlICovCisJKih2dV9sb25nICopTVBDNVhYWF9QQ0lfQkFSMCA9IENPTkZJR19TWVNfTUJBUjsKKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1BDSV9UQkFUUjAgPSBDT05GSUdfU1lTX01CQVIgfCAxOworCisJLyogTWFwIFJBTSB0byBQQ0kgc3BhY2UgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1BDSV9CQVIxID0gQ09ORklHX1BDSV9NRU1PUllfQlVTIHwgKDEgPDwgMyk7CisJKih2dV9sb25nICopTVBDNVhYWF9QQ0lfVEJBVFIxID0gQ09ORklHX1BDSV9NRU1PUllfUEhZUyB8IDE7CisKKwkvKiBQYXJrIFhMQiBvbiBQQ0kgKi8KKwkqKHZ1X2xvbmcgKikoTVBDNVhYWF9YTEJBUkIgKyAweDQwKSAmPSB+KCg3IDw8IDgpIHwgKDMgPDwgNSkpOworCSoodnVfbG9uZyAqKShNUEM1WFhYX1hMQkFSQiArIDB4NDApIHw9ICgzIDw8IDgpIHwgKDMgPDwgNSk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgZnJvbSBQQ0kgY29udHJvbGxlciAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfUENJX0dTQ1IgJj0gfig3IDw8IDEyKTsKKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1BDSV9JQ1IgICY9IH4oNyA8PCAyNCk7CisKKwkvKiBTZXQgUENJIHJldHJ5IGNvdW50ZXIgdG8gMCA9IGluZmluaXRlIHJldHJ5LiAqLworCS8qIFRoZSBkZWZhdWx0IG9mIDI1NSBpcyB0b28gc2hvcnQgZm9yIHNsb3cgZGV2aWNlcy4gKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1BDSV9JQ1IgJj0gMHhGRkZGRkYwMDsKKworCS8qIERpc2FibGUgaW5pdGlhdG9yIHdpbmRvd3MgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1BDSV9JV0NSID0gMDsKKworCS8qIE1hcCBQQ0kgbWVtb3J5IHRvIHBoeXNpY2FsIHNwYWNlICovCisJKih2dV9sb25nICopTVBDNVhYWF9QQ0lfSVcwQlRBUiA9IENPTkZJR19QQ0lfTUVNX1BIWVMgfAorCQkoKChDT05GSUdfUENJX01FTV9TSVpFIC0gMSkgPj4gOCkgJiAweDAwZmYwMDAwKSB8CisJCShDT05GSUdfUENJX01FTV9CVVMgPj4gMTYpOworCSoodnVfbG9uZyAqKU1QQzVYWFhfUENJX0lXQ1IgfD0gKElXQ1JfTUVNIHwgSVdDUl9SRUFEIHwgSVdDUl9FTikgPDwgMjQ7CisKKwkvKiBNYXAgUENJIEkvTyB0byBwaHlzaWNhbCBzcGFjZSAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfUENJX0lXMUJUQVIgPSBDT05GSUdfUENJX0lPX1BIWVMgfAorCQkoKChDT05GSUdfUENJX0lPX1NJWkUgLSAxKSA+PiA4KSAmIDB4MDBmZjAwMDApIHwKKwkJKENPTkZJR19QQ0lfSU9fQlVTID4+IDE2KTsKKwkqKHZ1X2xvbmcgKilNUEM1WFhYX1BDSV9JV0NSIHw9IChJV0NSX0lPIHwgSVdDUl9SRUFEIHwgSVdDUl9FTikgPDwgMTY7CisKKwkvKiBSZXNldCB0aGUgUENJIGJ1cyAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfUENJX0dTQ1IgfD0gMTsKKwl1ZGVsYXkoMTAwMCk7CisJKih2dV9sb25nICopTVBDNVhYWF9QQ0lfR1NDUiAmPSB+MTsKKwl1ZGVsYXkoMTAwMCk7CisKKwlwY2lfc2V0X29wcyhob3NlLAorCQlwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlX3ZpYV9kd29yZCwKKwkJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZF92aWFfZHdvcmQsCisJCW1wYzUyMDBfcmVhZF9jb25maWdfZHdvcmQsCisJCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlX3ZpYV9kd29yZCwKKwkJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmRfdmlhX2R3b3JkLAorCQltcGM1MjAwX3dyaXRlX2NvbmZpZ19kd29yZCk7CisKKwl1ZGVsYXkoMTAwMCk7CisKKyNpZmRlZiBDT05GSUdfUENJX1NDQU5fU0hPVworCXByaW50ZigiUENJOiAgIEJ1cyBEZXYgVmVuSWQgRGV2SWQgQ2xhc3MgSW50XG4iKTsKKyNlbmRpZgorCisJaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3NlcmlhbC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTg3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvc2VyaWFsLmMKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAgLSAyMDAzCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEhhY2tlZCBmb3IgTVBDODI2MCBieSBNdXJyYXkuSmVuc2VuQGNtc3QuY3Npcm8uYXUsIDE5LU9jdC0wMCwgd2l0aAorICogY2hhbmdlcyBiYXNlZCBvbiB0aGUgZmlsZSBhcmNoL3Bvd2VycGMvbWJ4Ym9vdC9tODI2MF90dHkuYyBmcm9tIHRoZQorICogTGludXgvUFBDIHNvdXJjZXMgKG04MjYwX3R0eS5jIGhhZCBubyBjb3B5cmlnaHQgaW5mbyBpbiBpdCkuCisgKgorICogTWFydGluIEtyYXVzZSwgOCBKdW4gMjAwNgorICogQWRkZWQgQ09ORklHX1NFUklBTF9NVUxUSSBzdXBwb3J0CisgKi8KKworLyoKKyAqIE1pbmltYWwgc2VyaWFsIGZ1bmN0aW9ucyBuZWVkZWQgdG8gdXNlIG9uZSBvZiB0aGUgUFNDIHBvcnRzCisgKiBhcyBzZXJpYWwgY29uc29sZSBpbnRlcmZhY2UuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzV4eHguaD4KKworI2lmIGRlZmluZWQgKENPTkZJR19TRVJJQUxfTVVMVEkpCisjaW5jbHVkZSA8c2VyaWFsLmg+CisjZW5kaWYKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QU0NfQ09OU09MRSkKKworI2lmIENPTkZJR19QU0NfQ09OU09MRSA9PSAxCisjZGVmaW5lIFBTQ19CQVNFIE1QQzVYWFhfUFNDMQorI2VsaWYgQ09ORklHX1BTQ19DT05TT0xFID09IDIKKyNkZWZpbmUgUFNDX0JBU0UgTVBDNVhYWF9QU0MyCisjZWxpZiBDT05GSUdfUFNDX0NPTlNPTEUgPT0gMworI2RlZmluZSBQU0NfQkFTRSBNUEM1WFhYX1BTQzMKKyNlbGlmIENPTkZJR19QU0NfQ09OU09MRSA9PSA0CisjZGVmaW5lIFBTQ19CQVNFIE1QQzVYWFhfUFNDNAorI2VsaWYgQ09ORklHX1BTQ19DT05TT0xFID09IDUKKyNkZWZpbmUgUFNDX0JBU0UgTVBDNVhYWF9QU0M1CisjZWxpZiBDT05GSUdfUFNDX0NPTlNPTEUgPT0gNgorI2RlZmluZSBQU0NfQkFTRSBNUEM1WFhYX1BTQzYKKyNlbHNlCisjZXJyb3IgQ09ORklHX1BTQ19DT05TT0xFIG11c3QgYmUgaW4gMSAuLi4gNgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVVMVEkpICYmICFkZWZpbmVkKENPTkZJR19QU0NfQ09OU09MRTIpCisjZXJyb3IgeW91IG11c3QgZGVmaW5lIENPTkZJR19QU0NfQ09OU09MRTIgaWYgQ09ORklHX1NFUklBTF9NVUxUSSBpcyBzZXQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01VTFRJKQorI2lmIENPTkZJR19QU0NfQ09OU09MRTIgPT0gMQorI2RlZmluZSBQU0NfQkFTRTIgTVBDNVhYWF9QU0MxCisjZWxpZiBDT05GSUdfUFNDX0NPTlNPTEUyID09IDIKKyNkZWZpbmUgUFNDX0JBU0UyIE1QQzVYWFhfUFNDMgorI2VsaWYgQ09ORklHX1BTQ19DT05TT0xFMiA9PSAzCisjZGVmaW5lIFBTQ19CQVNFMiBNUEM1WFhYX1BTQzMKKyNlbGlmIENPTkZJR19QU0NfQ09OU09MRTIgPT0gNAorI2RlZmluZSBQU0NfQkFTRTIgTVBDNVhYWF9QU0M0CisjZWxpZiBDT05GSUdfUFNDX0NPTlNPTEUyID09IDUKKyNkZWZpbmUgUFNDX0JBU0UyIE1QQzVYWFhfUFNDNQorI2VsaWYgQ09ORklHX1BTQ19DT05TT0xFMiA9PSA2CisjZGVmaW5lIFBTQ19CQVNFMiBNUEM1WFhYX1BTQzYKKyNlbHNlCisjZXJyb3IgQ09ORklHX1BTQ19DT05TT0xFMiBtdXN0IGJlIGluIDEgLi4uIDYKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfTVVMVEkgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NVUxUSSkKK2ludCBzZXJpYWxfaW5pdF9kZXYgKHVuc2lnbmVkIGxvbmcgZGV2X2Jhc2UpCisjZWxzZQoraW50IHNlcmlhbF9pbml0ICh2b2lkKQorI2VuZGlmCit7CisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01VTFRJKQorCXZvbGF0aWxlIHN0cnVjdCBtcGM1eHh4X3BzYyAqcHNjID0gKHN0cnVjdCBtcGM1eHh4X3BzYyAqKWRldl9iYXNlOworI2Vsc2UKKwl2b2xhdGlsZSBzdHJ1Y3QgbXBjNXh4eF9wc2MgKnBzYyA9IChzdHJ1Y3QgbXBjNXh4eF9wc2MgKilQU0NfQkFTRTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgYmFzZWNsazsKKwlpbnQgZGl2OworCisJLyogcmVzZXQgUFNDICovCisJcHNjLT5jb21tYW5kID0gUFNDX1NFTF9NT0RFX1JFR18xOworCisJLyogc2VsZWN0IGNsb2NrIHNvdXJjZXMgKi8KKwlwc2MtPnBzY19jbG9ja19zZWxlY3QgPSAwOworCWJhc2VjbGsgPSAoZ2QtPmlwYl9jbGsgKyAxNikgLyAzMjsKKworCS8qIHN3aXRjaCB0byBVQVJUIG1vZGUgKi8KKwlwc2MtPnNpY3IgPSAwOworCisJLyogY29uZmlndXJlIHBhcml0eSwgYml0IGxlbmd0aCBhbmQgc28gb24gKi8KKwlwc2MtPm1vZGUgPSBQU0NfTU9ERV84X0JJVFMgfCBQU0NfTU9ERV9QQVJOT05FOworCXBzYy0+bW9kZSA9IFBTQ19NT0RFX09ORV9TVE9QOworCisJLyogc2V0IHVwIFVBUlQgZGl2aXNvciAqLworCWRpdiA9IChiYXNlY2xrICsgKGdkLT5iYXVkcmF0ZS8yKSkgLyBnZC0+YmF1ZHJhdGU7CisJcHNjLT5jdHVyID0gKGRpdiA+PiA4KSAmIDB4ZmY7CisJcHNjLT5jdGxyID0gZGl2ICYgMHhmZjsKKworCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlwc2MtPnBzY19pbXIgPSAwOworCisJLyogcmVzZXQgYW5kIGVuYWJsZSBSeC9UeCAqLworCXBzYy0+Y29tbWFuZCA9IFBTQ19SU1RfUlg7CisJcHNjLT5jb21tYW5kID0gUFNDX1JTVF9UWDsKKwlwc2MtPmNvbW1hbmQgPSBQU0NfUlhfRU5BQkxFIHwgUFNDX1RYX0VOQUJMRTsKKworCXJldHVybiAoMCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVVMVEkpCit2b2lkIHNlcmlhbF9wdXRjX2RldiAodW5zaWduZWQgbG9uZyBkZXZfYmFzZSwgY29uc3QgY2hhciBjKQorI2Vsc2UKK3ZvaWQgc2VyaWFsX3B1dGMoY29uc3QgY2hhciBjKQorI2VuZGlmCit7CisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01VTFRJKQorCXZvbGF0aWxlIHN0cnVjdCBtcGM1eHh4X3BzYyAqcHNjID0gKHN0cnVjdCBtcGM1eHh4X3BzYyAqKWRldl9iYXNlOworI2Vsc2UKKwl2b2xhdGlsZSBzdHJ1Y3QgbXBjNXh4eF9wc2MgKnBzYyA9IChzdHJ1Y3QgbXBjNXh4eF9wc2MgKilQU0NfQkFTRTsKKyNlbmRpZgorCisJaWYgKGMgPT0gJ1xuJykKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVVMVEkpCisJCXNlcmlhbF9wdXRjX2RldiAoZGV2X2Jhc2UsICdccicpOworI2Vsc2UKKwkJc2VyaWFsX3B1dGMoJ1xyJyk7CisjZW5kaWYKKworCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLiAqLworCXdoaWxlICghKHBzYy0+cHNjX3N0YXR1cyAmIFBTQ19TUl9UWEVNUCkpCisJCTsKKworCXBzYy0+cHNjX2J1ZmZlcl84ID0gYzsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NVUxUSSkKK3ZvaWQgc2VyaWFsX3B1dGNfcmF3X2Rldih1bnNpZ25lZCBsb25nIGRldl9iYXNlLCBjb25zdCBjaGFyIGMpCisjZWxzZQordm9pZCBzZXJpYWxfcHV0Y19yYXcoY29uc3QgY2hhciBjKQorI2VuZGlmCit7CisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01VTFRJKQorCXZvbGF0aWxlIHN0cnVjdCBtcGM1eHh4X3BzYyAqcHNjID0gKHN0cnVjdCBtcGM1eHh4X3BzYyAqKWRldl9iYXNlOworI2Vsc2UKKwl2b2xhdGlsZSBzdHJ1Y3QgbXBjNXh4eF9wc2MgKnBzYyA9IChzdHJ1Y3QgbXBjNXh4eF9wc2MgKilQU0NfQkFTRTsKKyNlbmRpZgorCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLiAqLworCXdoaWxlICghKHBzYy0+cHNjX3N0YXR1cyAmIFBTQ19TUl9UWEVNUCkpCisJCTsKKworCXBzYy0+cHNjX2J1ZmZlcl84ID0gYzsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01VTFRJKQordm9pZCBzZXJpYWxfcHV0c19kZXYgKHVuc2lnbmVkIGxvbmcgZGV2X2Jhc2UsIGNvbnN0IGNoYXIgKnMpCisjZWxzZQordm9pZCBzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqcykKKyNlbmRpZgoreworCXdoaWxlICgqcykgeworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NVUxUSSkKKwkJc2VyaWFsX3B1dGNfZGV2IChkZXZfYmFzZSwgKnMrKyk7CisjZWxzZQorCQlzZXJpYWxfcHV0YyAoKnMrKyk7CisjZW5kaWYKKwl9Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVVMVEkpCitpbnQgc2VyaWFsX2dldGNfZGV2ICh1bnNpZ25lZCBsb25nIGRldl9iYXNlKQorI2Vsc2UKK2ludCBzZXJpYWxfZ2V0Yyh2b2lkKQorI2VuZGlmCit7CisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01VTFRJKQorCXZvbGF0aWxlIHN0cnVjdCBtcGM1eHh4X3BzYyAqcHNjID0gKHN0cnVjdCBtcGM1eHh4X3BzYyAqKWRldl9iYXNlOworI2Vsc2UKKwl2b2xhdGlsZSBzdHJ1Y3QgbXBjNXh4eF9wc2MgKnBzYyA9IChzdHJ1Y3QgbXBjNXh4eF9wc2MgKilQU0NfQkFTRTsKKyNlbmRpZgorCisJLyogV2FpdCBmb3IgYSBjaGFyYWN0ZXIgdG8gYXJyaXZlLiAqLworCXdoaWxlICghKHBzYy0+cHNjX3N0YXR1cyAmIFBTQ19TUl9SWFJEWSkpCisJCTsKKworCXJldHVybiBwc2MtPnBzY19idWZmZXJfODsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NVUxUSSkKK2ludCBzZXJpYWxfdHN0Y19kZXYgKHVuc2lnbmVkIGxvbmcgZGV2X2Jhc2UpCisjZWxzZQoraW50IHNlcmlhbF90c3RjKHZvaWQpCisjZW5kaWYKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVVMVEkpCisJdm9sYXRpbGUgc3RydWN0IG1wYzV4eHhfcHNjICpwc2MgPSAoc3RydWN0IG1wYzV4eHhfcHNjICopZGV2X2Jhc2U7CisjZWxzZQorCXZvbGF0aWxlIHN0cnVjdCBtcGM1eHh4X3BzYyAqcHNjID0gKHN0cnVjdCBtcGM1eHh4X3BzYyAqKVBTQ19CQVNFOworI2VuZGlmCisKKwlyZXR1cm4gKHBzYy0+cHNjX3N0YXR1cyAmIFBTQ19TUl9SWFJEWSk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVVMVEkpCit2b2lkIHNlcmlhbF9zZXRicmdfZGV2ICh1bnNpZ25lZCBsb25nIGRldl9iYXNlKQorI2Vsc2UKK3ZvaWQgc2VyaWFsX3NldGJyZyh2b2lkKQorI2VuZGlmCit7CisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01VTFRJKQorCXZvbGF0aWxlIHN0cnVjdCBtcGM1eHh4X3BzYyAqcHNjID0gKHN0cnVjdCBtcGM1eHh4X3BzYyAqKWRldl9iYXNlOworI2Vsc2UKKwl2b2xhdGlsZSBzdHJ1Y3QgbXBjNXh4eF9wc2MgKnBzYyA9IChzdHJ1Y3QgbXBjNXh4eF9wc2MgKilQU0NfQkFTRTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgYmFzZWNsaywgZGl2OworCisJYmFzZWNsayA9IChnZC0+aXBiX2NsayArIDE2KSAvIDMyOworCisJLyogc2V0IHVwIFVBUlQgZGl2aXNvciAqLworCWRpdiA9IChiYXNlY2xrICsgKGdkLT5iYXVkcmF0ZS8yKSkgLyBnZC0+YmF1ZHJhdGU7CisJcHNjLT5jdHVyID0gKGRpdiA+PiA4KSAmIDB4RkY7CisJcHNjLT5jdGxyID0gIGRpdiAmIDB4ZmY7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVVMVEkpCit2b2lkIHNlcmlhbF9zZXRydHNfZGV2ICh1bnNpZ25lZCBsb25nIGRldl9iYXNlLCBpbnQgcykKKyNlbHNlCit2b2lkIHNlcmlhbF9zZXRydHMoaW50IHMpCisjZW5kaWYKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVVMVEkpCisJdm9sYXRpbGUgc3RydWN0IG1wYzV4eHhfcHNjICpwc2MgPSAoc3RydWN0IG1wYzV4eHhfcHNjICopZGV2X2Jhc2U7CisjZWxzZQorCXZvbGF0aWxlIHN0cnVjdCBtcGM1eHh4X3BzYyAqcHNjID0gKHN0cnVjdCBtcGM1eHh4X3BzYyAqKVBTQ19CQVNFOworI2VuZGlmCisKKwlpZiAocykgeworCQkvKiBBc3NlcnQgUlRTIChiZWNvbWUgTE9XKSAqLworCQlwc2MtPm9wMSA9IDB4MTsKKwl9CisJZWxzZSB7CisJCS8qIE5lZ2F0ZSBSVFMgKGJlY29tZSBISUdIKSAqLworCQlwc2MtPm9wMCA9IDB4MTsKKwl9Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTVVMVEkpCitpbnQgc2VyaWFsX2dldGN0c19kZXYgKHVuc2lnbmVkIGxvbmcgZGV2X2Jhc2UpCisjZWxzZQoraW50IHNlcmlhbF9nZXRjdHModm9pZCkKKyNlbmRpZgoreworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NVUxUSSkKKwl2b2xhdGlsZSBzdHJ1Y3QgbXBjNXh4eF9wc2MgKnBzYyA9IChzdHJ1Y3QgbXBjNXh4eF9wc2MgKilkZXZfYmFzZTsKKyNlbHNlCisJdm9sYXRpbGUgc3RydWN0IG1wYzV4eHhfcHNjICpwc2MgPSAoc3RydWN0IG1wYzV4eHhfcHNjICopUFNDX0JBU0U7CisjZW5kaWYKKworCXJldHVybiAocHNjLT5pcCAmIDB4MSkgPyAwIDogMTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NVUxUSSkKK2ludCBzZXJpYWwwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gKHNlcmlhbF9pbml0X2RldihQU0NfQkFTRSkpOworfQorCitpbnQgc2VyaWFsMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIChzZXJpYWxfaW5pdF9kZXYoUFNDX0JBU0UyKSk7Cit9Cit2b2lkIHNlcmlhbDBfc2V0YnJnICh2b2lkKQoreworCXNlcmlhbF9zZXRicmdfZGV2KFBTQ19CQVNFKTsKK30KK3ZvaWQgc2VyaWFsMV9zZXRicmcgKHZvaWQpCit7CisJc2VyaWFsX3NldGJyZ19kZXYoUFNDX0JBU0UyKTsKK30KKwordm9pZCBzZXJpYWwwX3B1dGMoY29uc3QgY2hhciBjKQoreworCXNlcmlhbF9wdXRjX2RldihQU0NfQkFTRSxjKTsKK30KKwordm9pZCBzZXJpYWwxX3B1dGMoY29uc3QgY2hhciBjKQoreworCXNlcmlhbF9wdXRjX2RldihQU0NfQkFTRTIsIGMpOworfQordm9pZCBzZXJpYWwwX3B1dHMoY29uc3QgY2hhciAqcykKK3sKKwlzZXJpYWxfcHV0c19kZXYoUFNDX0JBU0UsIHMpOworfQorCit2b2lkIHNlcmlhbDFfcHV0cyhjb25zdCBjaGFyICpzKQoreworCXNlcmlhbF9wdXRzX2RldihQU0NfQkFTRTIsIHMpOworfQorCitpbnQgc2VyaWFsMF9nZXRjKHZvaWQpCit7CisJcmV0dXJuKHNlcmlhbF9nZXRjX2RldihQU0NfQkFTRSkpOworfQorCitpbnQgc2VyaWFsMV9nZXRjKHZvaWQpCit7CisJcmV0dXJuKHNlcmlhbF9nZXRjX2RldihQU0NfQkFTRTIpKTsKK30KK2ludCBzZXJpYWwwX3RzdGModm9pZCkKK3sKKwlyZXR1cm4gKHNlcmlhbF90c3RjX2RldihQU0NfQkFTRSkpOworfQorCitpbnQgc2VyaWFsMV90c3RjKHZvaWQpCit7CisJcmV0dXJuIChzZXJpYWxfdHN0Y19kZXYoUFNDX0JBU0UyKSk7Cit9CisKK3N0cnVjdCBzZXJpYWxfZGV2aWNlIHNlcmlhbDBfZGV2aWNlID0KK3sKKwkic2VyaWFsMCIsCisJIlVBUlQwIiwKKwlzZXJpYWwwX2luaXQsCisJc2VyaWFsMF9zZXRicmcsCisJc2VyaWFsMF9nZXRjLAorCXNlcmlhbDBfdHN0YywKKwlzZXJpYWwwX3B1dGMsCisJc2VyaWFsMF9wdXRzLAorfTsKKworc3RydWN0IHNlcmlhbF9kZXZpY2Ugc2VyaWFsMV9kZXZpY2UgPQoreworCSJzZXJpYWwxIiwKKwkiVUFSVDEiLAorCXNlcmlhbDFfaW5pdCwKKwlzZXJpYWwxX3NldGJyZywKKwlzZXJpYWwxX2dldGMsCisJc2VyaWFsMV90c3RjLAorCXNlcmlhbDFfcHV0YywKKwlzZXJpYWwxX3B1dHMsCit9OworI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfTVVMVEkgKi8KKworI2VuZGlmIC8qIENPTkZJR19QU0NfQ09OU09MRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3NwZWVkLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI3ZDNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3NwZWVkLmMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM1eHh4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBCdXMtdG8tQ29yZSBNdWx0aXBsaWVycyAqLworCitzdGF0aWMgaW50IGJ1czJjb3JlW10gPSB7CisJMywgMiwgMiwgMiwgNCwgNCwgNSwgOSwKKwk2LCAxMSwgOCwgMTAsIDMsIDEyLCA3LCAwLAorCTYsIDUsIDEzLCAyLCAxNCwgNCwgMTUsIDksCisJMCwgMTEsIDgsIDEwLCAxNiwgMTIsIDcsIDAKK307CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKgorICovCisKK2ludCBnZXRfY2xvY2tzICh2b2lkKQoreworCXVsb25nIHZhbCwgdmNvOworCisjaWYgIWRlZmluZWQoQ09ORklHX1NZU19NUEM1WFhYX0NMS0lOKQorI2Vycm9yIGNsb2NrIG1lYXN1cmluZyBub3QgaW1wbGVtZW50ZWQgeWV0IC0gZGVmaW5lIENPTkZJR19TWVNfTVBDNVhYWF9DTEtJTgorI2VuZGlmCisKKwl2YWwgPSAqKHZ1X2xvbmcgKilNUEM1WFhYX0NETV9QT1JDRkc7CisJaWYgKHZhbCAmICgxIDw8IDYpKSB7CisJCXZjbyA9IENPTkZJR19TWVNfTVBDNVhYWF9DTEtJTiAqIDEyOworCX0gZWxzZSB7CisJCXZjbyA9IENPTkZJR19TWVNfTVBDNVhYWF9DTEtJTiAqIDE2OworCX0KKwlpZiAodmFsICYgKDEgPDwgNSkpIHsKKwkJZ2QtPmJ1c19jbGsgPSB2Y28gLyA4OworCX0gZWxzZSB7CisJCWdkLT5idXNfY2xrID0gdmNvIC8gNDsKKwl9CisJZ2QtPmNwdV9jbGsgPSBnZC0+YnVzX2NsayAqIGJ1czJjb3JlW3ZhbCAmIDB4MWZdIC8gMjsKKworCXZhbCA9ICoodnVfbG9uZyAqKU1QQzVYWFhfQ0RNX0NGRzsKKwlpZiAodmFsICYgKDEgPDwgOCkpIHsKKwkJZ2QtPmlwYl9jbGsgPSBnZC0+YnVzX2NsayAvIDI7CisJfSBlbHNlIHsKKwkJZ2QtPmlwYl9jbGsgPSBnZC0+YnVzX2NsazsKKwl9CisJc3dpdGNoICh2YWwgJiAzKSB7CisJCWNhc2UgMDogZ2QtPnBjaV9jbGsgPSBnZC0+aXBiX2NsazsgYnJlYWs7CisJCWNhc2UgMTogZ2QtPnBjaV9jbGsgPSBnZC0+aXBiX2NsayAvIDI7IGJyZWFrOworCQlkZWZhdWx0OiBnZC0+cGNpX2NsayA9IGdkLT5idXNfY2xrIC8gNDsgYnJlYWs7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworaW50IHBydF9tcGM1eHh4X2Nsa3MgKHZvaWQpCit7CisJY2hhciBidWYxWzMyXSwgYnVmMlszMl0sIGJ1ZjNbMzJdOworCisJcHJpbnRmICgiICAgICAgIEJ1cyAlcyBNSHosIElQQiAlcyBNSHosIFBDSSAlcyBNSHpcbiIsCisJCXN0cm1oeihidWYxLCBnZC0+YnVzX2NsayksCisJCXN0cm1oeihidWYyLCBnZC0+aXBiX2NsayksCisJCXN0cm1oeihidWYzLCBnZC0+cGNpX2NsaykKKwkpOworCXJldHVybiAoMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9zdGFydC5TIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZjA5YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9zdGFydC5TCkBAIC0wLDAgKzEsNzc3IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5OAlEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0PgorICogIENvcHlyaWdodCAoQykgMTk5OQlNYWdudXMgRGFtbSA8a2llcmF5cGMwMS5wLnkua2llLmVyYS5lcmljc3Nvbi5zZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDAzIFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqICBVLUJvb3QgLSBTdGFydHVwIENvZGUgZm9yIE1QQzV4eHggQ1BVcworICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjNXh4eC5oPgorI2luY2x1ZGUgPHRpbWVzdGFtcC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2RlZmluZSBDT05GSUdfTVBDNXh4eCAxCS8qIG5lZWRlZCBmb3IgTGludXgga2VybmVsIGhlYWRlciBmaWxlcyAqLworI2RlZmluZSBfTElOVVhfQ09ORklHX0ggMQkvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZQkqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZm5kZWYgIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUgIENPTkZJR19JREVOVF9TVFJJTkcgIiIKKyNlbmRpZgorCisvKiBXZSBkb24ndCB3YW50IHRoZSAgTU1VIHlldC4KKyovCisjdW5kZWYJTVNSX0tFUk5FTAorLyogRmxvYXRpbmcgUG9pbnQgZW5hYmxlLCBNYWNoaW5lIENoZWNrIGFuZCBSZWNvdmVyYWJsZSBJbnRlcnIuICovCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgTVNSX0tFUk5FTCAoTVNSX0ZQfE1TUl9SSSkKKyNlbHNlCisjZGVmaW5lIE1TUl9LRVJORUwgKE1TUl9GUHxNU1JfTUV8TVNSX1JJKQorI2VuZGlmCisKKy8qCisgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCisgKgorICogVXNlIHIxMiB0byBhY2Nlc3MgdGhlIEdPVAorICovCisJU1RBUlRfR09UCisJR09UX0VOVFJZKF9HT1QyX1RBQkxFXykKKwlHT1RfRU5UUlkoX0ZJWFVQX1RBQkxFXykKKworCUdPVF9FTlRSWShfc3RhcnQpCisJR09UX0VOVFJZKF9zdGFydF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWShfZW5kX29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKHRyYW5zZmVyX3RvX2hhbmRsZXIpCisKKwlHT1RfRU5UUlkoX19pbml0X2VuZCkKKwlHT1RfRU5UUlkoX2VuZCkKKwlHT1RfRU5UUlkoX19ic3Nfc3RhcnQpCisJRU5EX0dPVAorCisvKgorICogVmVyc2lvbiBzdHJpbmcKKyAqLworCS5kYXRhCisJLmdsb2JsCXZlcnNpb25fc3RyaW5nCit2ZXJzaW9uX3N0cmluZzoKKwkuYXNjaWkgVV9CT09UX1ZFUlNJT04KKwkuYXNjaWkgIiAoIiwgVV9CT09UX0RBVEUsICIgLSAiLCBVX0JPT1RfVElNRSwgIikiCisJLmFzY2lpIENPTkZJR19JREVOVF9TVFJJTkcsICJcMCIKKworLyoKKyAqIEV4Y2VwdGlvbiB2ZWN0b3JzCisgKi8KKwkudGV4dAorCS4gPSBFWENfT0ZGX1NZU19SRVNFVAorCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKwlsaQlyMjEsIEJPT1RGTEFHX0NPTEQJLyogTm9ybWFsIFBvd2VyLU9uCQkqLworCW5vcAorCWIJYm9vdF9jb2xkCisKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQgKyAweDEwCisKKwkuZ2xvYmwJX3N0YXJ0X3dhcm0KK19zdGFydF93YXJtOgorCWxpCXIyMSwgQk9PVEZMQUdfV0FSTQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCisJYglib290X3dhcm0KKworYm9vdF9jb2xkOgorYm9vdF93YXJtOgorCW1mbXNyCXI1CQkJLyogc2F2ZSBtc3IgY29udGVudHMJCSovCisKKwkvKiBNb3ZlIENTQm9vdCBhbmQgYWRqdXN0IGluc3RydWN0aW9uIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19MT1dCT09UKQorIyBpZiBkZWZpbmVkKENPTkZJR19TWVNfUkFNQk9PVCkKKyMgIGVycm9yIENPTkZJR19TWVNfTE9XQk9PVCBpcyBpbmNvbXBhdGlibGUgd2l0aCBDT05GSUdfU1lTX1JBTUJPT1QKKyMgZW5kaWYgLyogQ09ORklHX1NZU19SQU1CT09UICovCisJbGlzCXI0LCBDT05GSUdfU1lTX0RFRkFVTFRfTUJBUkBoCisJbGlzCXIzLAlTVEFSVF9SRUcoQ09ORklHX1NZU19CT09UQ1NfU1RBUlQpQGgKKwlvcmkJcjMsIHIzLCBTVEFSVF9SRUcoQ09ORklHX1NZU19CT09UQ1NfU1RBUlQpQGwKKwlzdHcJcjMsIDB4NChyNCkJCS8qIENTMCBzdGFydCAqLworCWxpcwlyMywJU1RPUF9SRUcoQ09ORklHX1NZU19CT09UQ1NfU1RBUlQsIENPTkZJR19TWVNfQk9PVENTX1NJWkUpQGgKKwlvcmkJcjMsIHIzLCBTVE9QX1JFRyhDT05GSUdfU1lTX0JPT1RDU19TVEFSVCwgQ09ORklHX1NZU19CT09UQ1NfU0laRSlAbAorCXN0dwlyMywgMHg4KHI0KQkJLyogQ1MwIHN0b3AgKi8KKwlsaXMJcjMsICAgICAweDAyMDEwMDAwQGgKKwlvcmkJcjMsIHIzLCAweDAyMDEwMDAwQGwKKwlzdHcJcjMsIDB4NTQocjQpCQkvKiBDUzAgYW5kIEJvb3QgZW5hYmxlICovCisKKwlsaXMgICAgIHIzLAlsb3dib290X3JlZW50cnlAaAkvKiBqdW1wIGZyb20gYm9vdGxvdyBhZGRyZXNzIHNwYWNlICgweDAwMDB4eHh4KSAqLworCW9yaSAgICAgcjMsIHIzLCBsb3dib290X3JlZW50cnlAbAkvKiB0byB0aGUgYWRkcmVzcyBzcGFjZSB0aGUgbGlua2VyIHVzZWQgKi8KKwltdGxyCXIzCisJYmxyCisKK2xvd2Jvb3RfcmVlbnRyeToKKwlsaXMJcjMsCVNUQVJUX1JFRyhDT05GSUdfU1lTX0JPT1RDU19TVEFSVClAaAorCW9yaQlyMywgcjMsIFNUQVJUX1JFRyhDT05GSUdfU1lTX0JPT1RDU19TVEFSVClAbAorCXN0dwlyMywgMHg0YyhyNCkJCS8qIEJvb3Qgc3RhcnQgKi8KKwlsaXMJcjMsCVNUT1BfUkVHKENPTkZJR19TWVNfQk9PVENTX1NUQVJULCBDT05GSUdfU1lTX0JPT1RDU19TSVpFKUBoCisJb3JpCXIzLCByMywgU1RPUF9SRUcoQ09ORklHX1NZU19CT09UQ1NfU1RBUlQsIENPTkZJR19TWVNfQk9PVENTX1NJWkUpQGwKKwlzdHcJcjMsIDB4NTAocjQpCQkvKiBCb290IHN0b3AgKi8KKwlsaXMJcjMsICAgICAweDAyMDAwMDAxQGgKKwlvcmkJcjMsIHIzLCAweDAyMDAwMDAxQGwKKwlzdHcJcjMsIDB4NTQocjQpCQkvKiBCb290IGVuYWJsZSwgQ1MwIGRpc2FibGUgKi8KKyNlbmRpZgkvKiBDT05GSUdfU1lTX0xPV0JPT1QgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19ERUZBVUxUX01CQVIpICYmICFkZWZpbmVkKENPTkZJR19TWVNfUkFNQk9PVCkKKwlsaXMJcjMsIENPTkZJR19TWVNfTUJBUkBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19NQkFSQGwKKwkvKiBNQkFSIGlzIG1pcnJvcmVkIGludG8gdGhlIE1CQVIgU1BSICovCisJbXRzcHIJTUJBUixyMworCXJsd2lubQlyMywgcjMsIDE2LCAxNiwgMzEKKwlsaXMJcjQsIENPTkZJR19TWVNfREVGQVVMVF9NQkFSQGgKKwlzdHcJcjMsIDAocjQpCisjZW5kaWYgLyogQ09ORklHX1NZU19ERUZBVUxUX01CQVIgKi8KKworCS8qIEluaXRpYWxpc2UgdGhlIE1QQzV4eHggcHJvY2Vzc29yIGNvcmUJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJYmwJaW5pdF81eHh4X2NvcmUKKworCS8qIGluaXRpYWxpemUgc29tZSB0aGluZ3MgdGhhdCBhcmUgaGFyZCB0byBhY2Nlc3MgZnJvbSBDCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBzZXQgdXAgc3RhY2sgaW4gb24tY2hpcCBTUkFNICovCisJbGlzCXIzLCBDT05GSUdfU1lTX0lOSVRfUkFNX0FERFJAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSU5JVF9SQU1fQUREUkBsCisJb3JpCXIxLCByMywgQ09ORklHX1NZU19JTklUX1NQX09GRlNFVAorCWxpCXIwLCAwCQkJLyogTWFrZSByb29tIGZvciBzdGFjayBmcmFtZSBoZWFkZXIgYW5kCSovCisJc3R3dQlyMCwgLTQocjEpCQkvKiBjbGVhciBmaW5hbCBzdGFjayBmcmFtZSBzbyB0aGF0CSovCisJc3R3dQlyMCwgLTQocjEpCQkvKiBzdGFjayBiYWNrdHJhY2VzIHRlcm1pbmF0ZSBjbGVhbmx5CSovCisKKwkvKiBsZXQgdGhlIEMtY29kZSBzZXQgdXAgdGhlIHJlc3QJCQkJKi8KKwkvKgkJCQkJCQkJKi8KKwkvKiBCZSBjYXJlZnVsIHRvIGtlZXAgY29kZSByZWxvY2F0YWJsZSAhCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCUdFVF9HT1QJCQkvKiBpbml0aWFsaXplIEdPVCBhY2Nlc3MJCSovCisKKwkvKiByMzogSU1NUiAqLworCWJsCWNwdV9pbml0X2YJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlIChpbiBGbGFzaCkqLworCisJbXIJcjMsIHIyMQorCS8qIHIzOiBCT09URkxBRyAqLworCWJsCWJvYXJkX2luaXRfZgkvKiBydW4gMXN0IHBhcnQgb2YgYm9hcmQgaW5pdCBjb2RlIChpbiBGbGFzaCkqLworCisvKgorICogVmVjdG9yIFRhYmxlCisgKi8KKworCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycworX3N0YXJ0X29mX3ZlY3RvcnM6CisKKy8qIE1hY2hpbmUgY2hlY2sgKi8KKwlTVERfRVhDRVBUSU9OKDB4MjAwLCBNYWNoaW5lQ2hlY2ssIE1hY2hpbmVDaGVja0V4Y2VwdGlvbikKKworLyogRGF0YSBTdG9yYWdlIGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4MzAwLCBEYXRhU3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogSW5zdHJ1Y3Rpb24gU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDQwMCwgSW5zdFN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEV4dGVybmFsIEludGVycnVwdCBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDUwMCwgRXh0SW50ZXJydXB0LCBleHRlcm5hbF9pbnRlcnJ1cHQpCisKKy8qIEFsaWdubWVudCBleGNlcHRpb24uICovCisJLiA9IDB4NjAwCitBbGlnbm1lbnQ6CisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQorCW1mc3ByCXI0LERBUgorCXN0dwlyNCxfREFSKHIyMSkKKwltZnNwcglyNSxEU0lTUgorCXN0dwlyNSxfRFNJU1IocjIxKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlFWENfWEZFUl9URU1QTEFURShBbGlnbm1lbnQsIEFsaWdubWVudEV4Y2VwdGlvbiwgTVNSX0tFUk5FTCwgQ09QWV9FRSkKKworLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KKwkuID0gMHg3MDAKK1Byb2dyYW1DaGVjazoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKFByb2dyYW1DaGVjaywgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uLAorCQlNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisJU1REX0VYQ0VQVElPTigweDgwMCwgRlBVbmF2YWlsYWJsZSwgVW5rbm93bkV4Y2VwdGlvbikKKworCS8qIEkgZ3Vlc3Mgd2UgY291bGQgaW1wbGVtZW50IGRlY3JlbWVudGVyLCBhbmQgbWF5IGhhdmUKKwkgKiB0byBzb21lZGF5IGZvciB0aW1la2VlcGluZy4KKwkgKi8KKwlTVERfRVhDRVBUSU9OKDB4OTAwLCBEZWNyZW1lbnRlciwgdGltZXJfaW50ZXJydXB0KQorCisJU1REX0VYQ0VQVElPTigweGEwMCwgVHJhcF8wYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4YjAwLCBUcmFwXzBiLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhjMDAsIFN5c3RlbUNhbGwsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGQwMCwgU2luZ2xlU3RlcCwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHhlMDAsIFRyYXBfMGUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGYwMCwgVHJhcF8wZiwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHgxMDAwLCBJbnN0cnVjdGlvblRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDExMDAsIERhdGFMb2FkVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTIwMCwgRGF0YVN0b3JlVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKyNpZmRlZiBERUJVRworCS4gPSAweDEzMDAKKwkvKgorCSAqIFRoaXMgZXhjZXB0aW9uIG9jY3VycyB3aGVuIHRoZSBwcm9ncmFtIGNvdW50ZXIgbWF0Y2hlcyB0aGUKKwkgKiBJbnN0cnVjdGlvbiBBZGRyZXNzIEJyZWFrcG9pbnQgUmVnaXN0ZXIgKElBQlIpLgorCSAqCisJICogSSB3YW50IHRoZSBjcHUgdG8gaGFsdCBpZiB0aGlzIG9jY3VycyBzbyBJIGNhbiBodW50IGFyb3VuZAorCSAqIHdpdGggdGhlIGRlYnVnZ2VyIGFuZCBsb29rIGF0IHRoaW5ncy4KKwkgKgorCSAqIFdoZW4gREVCVUcgaXMgZGVmaW5lZCwgYm90aCBtYWNoaW5lIGNoZWNrIGVuYWJsZSAoaW4gdGhlIE1TUikKKwkgKiBhbmQgY2hlY2tzdG9wIHJlc2V0IGVuYWJsZSAoaW4gdGhlIHJlc2V0IG1vZGUgcmVnaXN0ZXIpIGFyZQorCSAqIHR1cm5lZCBvZmYgYW5kIHNvIGEgY2hlY2tzdG9wIGNvbmRpdGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgY3B1CisJICogaGFsdGluZy4KKwkgKgorCSAqIEkgZm9yY2UgdGhlIGNwdSBpbnRvIGEgY2hlY2tzdG9wIGNvbmRpdGlvbiBieSBwdXR0aW5nIGFuIGlsbGVnYWwKKwkgKiBpbnN0cnVjdGlvbiBoZXJlIChhdCBsZWFzdCB0aGlzIGlzIHRoZSB0aGVvcnkpLgorCSAqCisJICogd2VsbCAtIHRoYXQgZGlkbnQgd29yaywgc28ganVzdCBkbyBhbiBpbmZpbml0ZSBsb29wIQorCSAqLworMToJYgkxYgorI2Vsc2UKKwlTVERfRVhDRVBUSU9OKDB4MTMwMCwgSW5zdHJ1Y3Rpb25CcmVha3BvaW50LCBEZWJ1Z0V4Y2VwdGlvbikKKyNlbmRpZgorCVNURF9FWENFUFRJT04oMHgxNDAwLCBTTUksIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKDB4MTUwMCwgVHJhcF8xNSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTYwMCwgVHJhcF8xNiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTcwMCwgVHJhcF8xNywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTgwMCwgVHJhcF8xOCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTkwMCwgVHJhcF8xOSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWEwMCwgVHJhcF8xYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWIwMCwgVHJhcF8xYiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWMwMCwgVHJhcF8xYywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWQwMCwgVHJhcF8xZCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWUwMCwgVHJhcF8xZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWYwMCwgVHJhcF8xZiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjAwMCwgVHJhcF8yMCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjEwMCwgVHJhcF8yMSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjIwMCwgVHJhcF8yMiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjMwMCwgVHJhcF8yMywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjQwMCwgVHJhcF8yNCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjUwMCwgVHJhcF8yNSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjYwMCwgVHJhcF8yNiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjcwMCwgVHJhcF8yNywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjgwMCwgVHJhcF8yOCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjkwMCwgVHJhcF8yOSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmEwMCwgVHJhcF8yYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmIwMCwgVHJhcF8yYiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmMwMCwgVHJhcF8yYywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmQwMCwgVHJhcF8yZCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmUwMCwgVHJhcF8yZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmYwMCwgVHJhcF8yZiwgVW5rbm93bkV4Y2VwdGlvbikKKworCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisJLiA9IDB4MzAwMAorCisvKgorICogVGhpcyBjb2RlIGZpbmlzaGVzIHNhdmluZyB0aGUgcmVnaXN0ZXJzIHRvIHRoZSBleGNlcHRpb24gZnJhbWUKKyAqIGFuZCBqdW1wcyB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAqIFJlZ2lzdGVyIHIyMSBpcyBwb2ludGVyIGludG8gdHJhcCBmcmFtZSwgcjEgaGFzIG5ldyBzdGFjayBwb2ludGVyLgorICovCisJLmdsb2JsCXRyYW5zZmVyX3RvX2hhbmRsZXIKK3RyYW5zZmVyX3RvX2hhbmRsZXI6CisJc3R3CXIyMixfTklQKHIyMSkKKwlsaXMJcjIyLE1TUl9QT1dAaAorCWFuZGMJcjIzLHIyMyxyMjIKKwlzdHcJcjIzLF9NU1IocjIxKQorCVNBVkVfR1BSKDcsIHIyMSkKKwlTQVZFXzRHUFJTKDgsIHIyMSkKKwlTQVZFXzhHUFJTKDEyLCByMjEpCisJU0FWRV84R1BSUygyNCwgcjIxKQorCW1mbHIJcjIzCisJYW5kaS4JcjI0LHIyMywweDNmMDAJCS8qIGdldCB2ZWN0b3Igb2Zmc2V0ICovCisJc3R3CXIyNCxUUkFQKHIyMSkKKwlsaQlyMjIsMAorCXN0dwlyMjIsUkVTVUxUKHIyMSkKKwlsd3oJcjI0LDAocjIzKQkJLyogdmlydHVhbCBhZGRyZXNzIG9mIGhhbmRsZXIgKi8KKwlsd3oJcjIzLDQocjIzKQkJLyogd2hlcmUgdG8gZ28gd2hlbiBkb25lICovCisJbXRzcHIJU1JSMCxyMjQKKwltdHNwcglTUlIxLHIyMAorCW10bHIJcjIzCisJU1lOQworCXJmaQkJCQkvKiBqdW1wIHRvIGhhbmRsZXIsIGVuYWJsZSBNTVUgKi8KKworaW50X3JldHVybjoKKwltZm1zcglyMjgJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXI0LDAKKwlvcmkJcjQscjQsTVNSX0VFCisJYW5kYwlyMjgscjI4LHI0CisJU1lOQwkJCS8qIFNvbWUgY2hpcCByZXZzIG5lZWQgdGhpcy4uLiAqLworCW10bXNyCXIyOAorCVNZTkMKKwlsd3oJcjIsX0NUUihyMSkKKwlsd3oJcjAsX0xJTksocjEpCisJbXRjdHIJcjIKKwltdGxyCXIwCisJbHd6CXIyLF9YRVIocjEpCisJbHd6CXIwLF9DQ1IocjEpCisJbXRzcHIJWEVSLHIyCisJbXRjcmYJMHhGRixyMAorCVJFU1RfMTBHUFJTKDMsIHIxKQorCVJFU1RfMTBHUFJTKDEzLCByMSkKKwlSRVNUXzhHUFJTKDIzLCByMSkKKwlSRVNUX0dQUigzMSwgcjEpCisJbHd6CXIyLF9OSVAocjEpCS8qIFJlc3RvcmUgZW52aXJvbm1lbnQgKi8KKwlsd3oJcjAsX01TUihyMSkKKwltdHNwcglTUlIwLHIyCisJbXRzcHIJU1JSMSxyMAorCWx3eglyMCxHUFIwKHIxKQorCWx3eglyMixHUFIyKHIxKQorCWx3eglyMSxHUFIxKHIxKQorCVNZTkMKKwlyZmkKKworLyoKKyAqIFRoaXMgY29kZSBpbml0aWFsaXNlcyB0aGUgTVBDNXh4eCBwcm9jZXNzb3IgY29yZQorICogKGNvbmZvcm1zIHRvIFBvd2VyUEMgNjAzZSBzcGVjKQorICogTm90ZTogZXhwZWN0cyBvcmlnaW5hbCBNU1IgY29udGVudHMgdG8gYmUgaW4gcjUuCisgKi8KKworCS5nbG9ibAlpbml0XzV4eF9jb3JlCitpbml0XzV4eHhfY29yZToKKworCS8qIEluaXRpYWxpemUgbWFjaGluZSBzdGF0dXM7IGVuYWJsZSBtYWNoaW5lIGNoZWNrIGludGVycnVwdAkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGkJcjMsIE1TUl9LRVJORUwJCS8qIFNldCBNRSBhbmQgUkkgZmxhZ3MgKi8KKwlybHdpbWkJcjMsIHI1LCAwLCAyNSwgMjUJLyogcHJlc2VydmUgSVAgYml0IHNldCBieSBIUkNXICovCisjaWZkZWYgREVCVUcKKwlybHdpbWkJcjMsIHI1LCAwLCAyMSwgMjIJLyogZGVidWdnZXIgbWlnaHQgc2V0IFNFICYgQkUgYml0cyAqLworI2VuZGlmCisJU1lOQwkJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMworCVNZTkMKKwltdHNwcglTUlIxLCByMwkJLyogTWFrZSBTUlIxIG1hdGNoIE1TUiAqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgSGFyZHdhcmUgSW1wbGVtZW50YXRpb24tZGVwZW5kZW50IFJlZ2lzdGVycwkqLworCS8qIEhJRDAgYWxzbyBjb250YWlucyBjYWNoZSBjb250cm9sCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaXMJcjMsIENPTkZJR19TWVNfSElEMF9JTklUQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0hJRDBfSU5JVEBsCisJU1lOQworCW10c3ByCUhJRDAsIHIzCisKKwlsaXMJcjMsIENPTkZJR19TWVNfSElEMF9GSU5BTEBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19ISUQwX0ZJTkFMQGwKKwlTWU5DCisJbXRzcHIJSElEMCwgcjMKKworCS8qIGNsZWFyIGFsbCBCQVQncwkJCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaQlyMCwgMAorCW10c3ByCURCQVQwVSwgcjAKKwltdHNwcglEQkFUMEwsIHIwCisJbXRzcHIJREJBVDFVLCByMAorCW10c3ByCURCQVQxTCwgcjAKKwltdHNwcglEQkFUMlUsIHIwCisJbXRzcHIJREJBVDJMLCByMAorCW10c3ByCURCQVQzVSwgcjAKKwltdHNwcglEQkFUM0wsIHIwCisJbXRzcHIJREJBVDRVLCByMAorCW10c3ByCURCQVQ0TCwgcjAKKwltdHNwcglEQkFUNVUsIHIwCisJbXRzcHIJREJBVDVMLCByMAorCW10c3ByCURCQVQ2VSwgcjAKKwltdHNwcglEQkFUNkwsIHIwCisJbXRzcHIJREJBVDdVLCByMAorCW10c3ByCURCQVQ3TCwgcjAKKwltdHNwcglJQkFUMFUsIHIwCisJbXRzcHIJSUJBVDBMLCByMAorCW10c3ByCUlCQVQxVSwgcjAKKwltdHNwcglJQkFUMUwsIHIwCisJbXRzcHIJSUJBVDJVLCByMAorCW10c3ByCUlCQVQyTCwgcjAKKwltdHNwcglJQkFUM1UsIHIwCisJbXRzcHIJSUJBVDNMLCByMAorCW10c3ByCUlCQVQ0VSwgcjAKKwltdHNwcglJQkFUNEwsIHIwCisJbXRzcHIJSUJBVDVVLCByMAorCW10c3ByCUlCQVQ1TCwgcjAKKwltdHNwcglJQkFUNlUsIHIwCisJbXRzcHIJSUJBVDZMLCByMAorCW10c3ByCUlCQVQ3VSwgcjAKKwltdHNwcglJQkFUN0wsIHIwCisJU1lOQworCisJLyogaW52YWxpZGF0ZSBhbGwgdGxiJ3MJCQkJCQkqLworCS8qCQkJCQkJCQkqLworCS8qIEZyb20gdGhlIDYwM2UgVXNlciBNYW51YWw6ICJUaGUgNjAzZSBwcm92aWRlcyB0aGUgYWJpbGl0eSB0bwkqLworCS8qIGludmFsaWRhdGUgYSBUTEIgZW50cnkuIFRoZSBUTEIgSW52YWxpZGF0ZSBFbnRyeSAodGxiaWUpCSovCisJLyogaW5zdHJ1Y3Rpb24gaW52YWxpZGF0ZXMgdGhlIFRMQiBlbnRyeSBpbmRleGVkIGJ5IHRoZSBFQSwgYW5kCSovCisJLyogb3BlcmF0ZXMgb24gYm90aCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgVExCcyBzaW11bHRhbmVvdXNseSovCisJLyogaW52YWxpZGF0aW5nIGZvdXIgVExCIGVudHJpZXMgKGJvdGggc2V0cyBpbiBlYWNoIFRMQikuIFRoZQkqLworCS8qIGluZGV4IGNvcnJlc3BvbmRzIHRvIGJpdHMgMTUtMTkgb2YgdGhlIEVBLiBUbyBpbnZhbGlkYXRlIGFsbAkqLworCS8qIGVudHJpZXMgd2l0aGluIGJvdGggVExCcywgMzIgdGxiaWUgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZQkqLworCS8qIGlzc3VlZCwgaW5jcmVtZW50aW5nIHRoaXMgZmllbGQgYnkgb25lIGVhY2ggdGltZS4iCQkqLworCS8qCQkJCQkJCQkqLworCS8qICJOb3RlIHRoYXQgdGhlIHRsYmlhIGluc3RydWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGUJKi8KKwkvKiA2MDNlLiIJCQkJCQkJKi8KKwkvKgkJCQkJCQkJKi8KKwkvKiBiaXRzIDE1LTE5IGNvcnJlc3BvbmQgdG8gYWRkcmVzc2VzIDB4MDAwMDAwMDAgdG8gMHgwMDAxRjAwMAkqLworCS8qIGluY3JlbWVudGluZyBieSAweDEwMDAgZWFjaCB0aW1lLiBUaGUgY29kZSBiZWxvdyBpcyBzb3J0IG9mCSovCisJLyogYmFzZWQgb24gY29kZSBpbiAiZmx1c2hfdGxicyIgZnJvbSBhcmNoL3Bvd2VycGMva2VybmVsL2hlYWQuUwkqLworCS8qCQkJCQkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGkJcjMsIDMyCisJbXRjdHIJcjMKKwlsaQlyMywgMAorMToJdGxiaWUJcjMKKwlhZGRpCXIzLCByMywgMHgxMDAwCisJYmRuegkxYgorCVNZTkMKKworCS8qIERvbmUhCQkJCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlibHIKKworLyogQ2FjaGUgZnVuY3Rpb25zLgorICoKKyAqIE5vdGU6IHJlcXVpcmVzIHRoYXQgYWxsIGNhY2hlIGJpdHMgaW4KKyAqIEhJRDAgYXJlIGluIHRoZSBsb3cgaGFsZiB3b3JkLgorICovCisJLmdsb2JsCWljYWNoZV9lbmFibGUKK2ljYWNoZV9lbmFibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlvcmkJcjMsIHIzLCBISUQwX0lDRQorCWxpcwlyNCwgMAorCW9yaQlyNCwgcjQsIEhJRDBfSUxPQ0sKKwlhbmRjCXIzLCByMywgcjQKKwlvcmkJcjQsIHIzLCBISUQwX0lDRkkKKwlpc3luYworCW10c3ByCUhJRDAsIHI0CS8qIHNldHMgZW5hYmxlIGFuZCBpbnZhbGlkYXRlLCBjbGVhcnMgbG9jayAqLworCWlzeW5jCisJbXRzcHIJSElEMCwgcjMJLyogY2xlYXJzIGludmFsaWRhdGUgKi8KKwlibHIKKworCS5nbG9ibAlpY2FjaGVfZGlzYWJsZQoraWNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0lDRXxISUQwX0lMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9JQ0ZJCisJaXN5bmMKKwltdHNwcglISUQwLCByNAkvKiBzZXRzIGludmFsaWRhdGUsIGNsZWFycyBlbmFibGUgYW5kIGxvY2sgKi8KKwlpc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX3N0YXR1cworaWNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXJsd2lubQlyMywgcjMsIEhJRDBfSUNFX0JJVFBPUyArIDEsIDMxLCAzMQorCWJscgorCisJLmdsb2JsCWRjYWNoZV9lbmFibGUKK2RjYWNoZV9lbmFibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlvcmkJcjMsIHIzLCBISUQwX0RDRQorCWxpcwlyNCwgMAorCW9yaQlyNCwgcjQsIEhJRDBfRExPQ0sKKwlhbmRjCXIzLCByMywgcjQKKwlvcmkJcjQsIHIzLCBISUQwX0RDSQorCXN5bmMKKwltdHNwcglISUQwLCByNAkvKiBzZXRzIGVuYWJsZSBhbmQgaW52YWxpZGF0ZSwgY2xlYXJzIGxvY2sgKi8KKwlzeW5jCisJbXRzcHIJSElEMCwgcjMJLyogY2xlYXJzIGludmFsaWRhdGUgKi8KKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZGlzYWJsZQorZGNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0RDRXxISUQwX0RMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9EQ0kKKwlzeW5jCisJbXRzcHIJSElEMCwgcjQJLyogc2V0cyBpbnZhbGlkYXRlLCBjbGVhcnMgZW5hYmxlIGFuZCBsb2NrICovCisJc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX3N0YXR1cworZGNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXJsd2lubQlyMywgcjMsIEhJRDBfRENFX0JJVFBPUyArIDEsIDMxLCAzMQorCWJscgorCisJLmdsb2JsIGdldF9zdnIKK2dldF9zdnI6CisJbWZzcHIJcjMsIFNWUgorCWJscgorCisJLmdsb2JsIGdldF9wdnIKK2dldF9wdnI6CisJbWZzcHIJcjMsIFBWUgorCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiB2b2lkIHJlbG9jYXRlX2NvZGUgKGFkZHJfc3AsIGdkLCBhZGRyX21vbmkpCisgKgorICogVGhpcyAiZnVuY3Rpb24iIGRvZXMgbm90IHJldHVybiwgaW5zdGVhZCBpdCBjb250aW51ZXMgaW4gUkFNCisgKiBhZnRlciByZWxvY2F0aW5nIHRoZSBtb25pdG9yIGNvZGUuCisgKgorICogcjMgPSBkZXN0CisgKiByNCA9IHNyYworICogcjUgPSBsZW5ndGggaW4gYnl0ZXMKKyAqIHI2ID0gY2FjaGVsaW5lc2l6ZQorICovCisJLmdsb2JsCXJlbG9jYXRlX2NvZGUKK3JlbG9jYXRlX2NvZGU6CisJbXIJcjEsICByMwkJLyogU2V0IG5ldyBzdGFjayBwb2ludGVyCQkqLworCW1yCXI5LCAgcjQJCS8qIFNhdmUgY29weSBvZiBHbG9iYWwgRGF0YSBwb2ludGVyCSovCisJbXIJcjEwLCByNQkJLyogU2F2ZSBjb3B5IG9mIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKworCUdFVF9HT1QKKwltcglyMywgIHI1CQkJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKwlsaXMJcjQsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGgJCS8qIFNvdXJjZSAgICAgIEFkZHJlc3MJKi8KKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBsCisJbHd6CXI1LCBHT1QoX19pbml0X2VuZCkKKwlzdWIJcjUsIHI1LCByNAorCWxpCXI2LCBDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCQkvKiBDYWNoZSBMaW5lIFNpemUJKi8KKworCS8qCisJICogRml4IEdPVCBwb2ludGVyOgorCSAqCisJICogTmV3IEdPVC1QVFIgPSAob2xkIEdPVC1QVFIgLSBDT05GSUdfU1lTX01PTklUT1JfQkFTRSkgKyBEZXN0aW5hdGlvbiBBZGRyZXNzCisJICoKKwkgKiBPZmZzZXQ6CisJICovCisJc3ViCXIxNSwgcjEwLCByNAorCisJLyogRmlyc3Qgb3VyIG93biBHT1QgKi8KKwlhZGQJcjEyLCByMTIsIHIxNQorCS8qIHRoZW4gdGhlIG9uZSB1c2VkIGJ5IHRoZSBDIGNvZGUgKi8KKwlhZGQJcjMwLCByMzAsIHIxNQorCisJLyoKKwkgKiBOb3cgcmVsb2NhdGUgY29kZQorCSAqLworCisJY21wbHcJY3IxLHIzLHI0CisJYWRkaQlyMCxyNSwzCisJc3J3aS4JcjAscjAsMgorCWJlcQljcjEsNGYJCS8qIEluIHBsYWNlIGNvcHkgaXMgbm90IG5lY2Vzc2FyeQkqLworCWJlcQk3ZgkJLyogUHJvdGVjdCBhZ2FpbnN0IDAgY291bnQJCSovCisJbXRjdHIJcjAKKwliZ2UJY3IxLDJmCisKKwlsYQlyOCwtNChyNCkKKwlsYQlyNywtNChyMykKKzE6CWx3enUJcjAsNChyOCkKKwlzdHd1CXIwLDQocjcpCisJYmRuegkxYgorCWIJNGYKKworMjoJc2x3aQlyMCxyMCwyCisJYWRkCXI4LHI0LHIwCisJYWRkCXI3LHIzLHIwCiszOglsd3p1CXIwLC00KHI4KQorCXN0d3UJcjAsLTQocjcpCisJYmRuegkzYgorCisvKgorICogTm93IGZsdXNoIHRoZSBjYWNoZTogbm90ZSB0aGF0IHdlIG11c3Qgc3RhcnQgZnJvbSBhIGNhY2hlIGFsaWduZWQKKyAqIGFkZHJlc3MuIE90aGVyd2lzZSB3ZSBtaWdodCBtaXNzIG9uZSBjYWNoZSBsaW5lLgorICovCis0OgljbXB3aQlyNiwwCisJYWRkCXI1LHIzLHI1CisJYmVxCTdmCQkvKiBBbHdheXMgZmx1c2ggcHJlZmV0Y2ggcXVldWUgaW4gYW55IGNhc2UgKi8KKwlzdWJpCXIwLHI2LDEKKwlhbmRjCXIzLHIzLHIwCisJbWZzcHIJcjcsSElEMAkJLyogZG9uJ3QgZG8gZGNic3QgaWYgZGNhY2hlIGlzIGRpc2FibGVkICovCisJcmx3aW5tCXI3LHI3LEhJRDBfRENFX0JJVFBPUysxLDMxLDMxCisJY21wd2kJcjcsMAorCWJlcQk5ZgorCW1yCXI0LHIzCis1OglkY2JzdAkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNWIKKwlzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGRjYnN0IHRvIGNvbXBsZXRlIG9uIGJ1cyAqLworOToJbWZzcHIJcjcsSElEMAkJLyogZG9uJ3QgZG8gaWNiaSBpZiBpY2FjaGUgaXMgZGlzYWJsZWQgKi8KKwlybHdpbm0JcjcscjcsSElEMF9JQ0VfQklUUE9TKzEsMzEsMzEKKwljbXB3aQlyNywwCisJYmVxCTdmCisJbXIJcjQscjMKKzY6CWljYmkJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTZiCis3OglzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGljYmkgdG8gY29tcGxldGUgb24gYnVzCSovCisJaXN5bmMKKworLyoKKyAqIFdlIGFyZSBkb25lLiBEbyBub3QgcmV0dXJuLCBpbnN0ZWFkIGJyYW5jaCB0byBzZWNvbmQgcGFydCBvZiBib2FyZAorICogaW5pdGlhbGl6YXRpb24sIG5vdyBydW5uaW5nIGZyb20gUkFNLgorICovCisKKwlhZGRpCXIwLCByMTAsIGluX3JhbSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbXRscglyMAorCWJscgorCitpbl9yYW06CisKKwkvKgorCSAqIFJlbG9jYXRpb24gRnVuY3Rpb24sIHIxMiBwb2ludCB0byBnb3QyKzB4ODAwMAorCSAqCisJICogQWRqdXN0IGdvdDIgcG9pbnRlcnMsIG5vIG5lZWQgdG8gY2hlY2sgZm9yIDAsIHRoaXMgY29kZQorCSAqIGFscmVhZHkgcHV0cyBhIGZldyBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKwkgKi8KKwlsaQlyMCxfX2dvdDJfZW50cmllc0BzZWN0b2ZmQGwKKwlsYQlyMyxHT1QoX0dPVDJfVEFCTEVfKQorCWx3eglyMTEsR09UKF9HT1QyX1RBQkxFXykKKwltdGN0cglyMAorCXN1YglyMTEscjMscjExCisJYWRkaQlyMyxyMywtNAorMToJbHd6dQlyMCw0KHIzKQorCWNtcHdpCXIwLDAKKwliZXEtCTJmCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMCwwKHIzKQorMjoJYmRuegkxYgorCisJLyoKKwkgKiBOb3cgYWRqdXN0IHRoZSBmaXh1cHMgYW5kIHRoZSBwb2ludGVycyB0byB0aGUgZml4dXBzCisJICogaW4gY2FzZSB3ZSBuZWVkIHRvIG1vdmUgb3Vyc2VsdmVzIGFnYWluLgorCSAqLworCWxpCXIwLF9fZml4dXBfZW50cmllc0BzZWN0b2ZmQGwKKwlsd3oJcjMsR09UKF9GSVhVUF9UQUJMRV8pCisJY21wd2kJcjAsMAorCW10Y3RyCXIwCisJYWRkaQlyMyxyMywtNAorCWJlcQk0ZgorMzoJbHd6dQlyNCw0KHIzKQorCWx3enV4CXIwLHI0LHIxMQorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjEwLDAocjMpCisJc3R3CXIwLDAocjQpCisJYmRuegkzYgorNDoKK2NsZWFyX2JzczoKKwkvKgorCSAqIE5vdyBjbGVhciBCU1Mgc2VnbWVudAorCSAqLworCWx3eglyMyxHT1QoX19ic3Nfc3RhcnQpCisJbHd6CXI0LEdPVChfZW5kKQorCisJY21wbHcJMCwgcjMsIHI0CisJYmVxCTZmCisKKwlsaQlyMCwgMAorNToKKwlzdHcJcjAsIDAocjMpCisJYWRkaQlyMywgcjMsIDQKKwljbXBsdwkwLCByMywgcjQKKwlibmUJNWIKKzY6CisKKwltcglyMywgcjkJCS8qIEdsb2JhbCBEYXRhIHBvaW50ZXIJCSovCisJbXIJcjQsIHIxMAkJLyogRGVzdGluYXRpb24gQWRkcmVzcwkJKi8KKwlibAlib2FyZF9pbml0X3IKKworCS8qCisJICogQ29weSBleGNlcHRpb24gdmVjdG9yIGNvZGUgdG8gbG93IG1lbW9yeQorCSAqCisJICogcjM6IGRlc3RfYWRkcgorCSAqIHI3OiBzb3VyY2UgYWRkcmVzcywgcjg6IGVuZCBhZGRyZXNzLCByOTogdGFyZ2V0IGFkZHJlc3MKKwkgKi8KKwkuZ2xvYmwJdHJhcF9pbml0Cit0cmFwX2luaXQ6CisJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlcgkJKi8KKwlHRVRfR09UCisJbHd6CXI3LCBHT1QoX3N0YXJ0KQorCWx3eglyOCwgR09UKF9lbmRfb2ZfdmVjdG9ycykKKworCWxpCXI5LCAweDEwMAkJLyogcmVzZXQgdmVjdG9yIGFsd2F5cyBhdCAweDEwMCAqLworCisJY21wbHcJMCwgcjcsIHI4CisJYmdlbHIJCQkJLyogcmV0dXJuIGlmIHI3Pj1yOCAtIGp1c3QgaW4gY2FzZSAqLworMToKKwlsd3oJcjAsIDAocjcpCisJc3R3CXIwLCAwKHI5KQorCWFkZGkJcjcsIHI3LCA0CisJYWRkaQlyOSwgcjksIDQKKwljbXBsdwkwLCByNywgcjgKKwlibmUJMWIKKworCS8qCisJICogcmVsb2NhdGUgYGhkbHInIGFuZCBgaW50X3JldHVybicgZW50cmllcworCSAqLworCWxpCXI3LCAuTF9NYWNoaW5lQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBBbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMjoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJMmIKKworCWxpCXI3LCAuTF9BbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9Qcm9ncmFtQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgU3lzdGVtQ2FsbCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCiszOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkzYgorCisJbGkJcjcsIC5MX1NpbmdsZVN0ZXAgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorNDoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJNGIKKworCW1mbXNyCXIzCQkJLyogbm93IHRoYXQgdGhlIHZlY3RvcnMgaGF2ZQkqLworCWxpcwlyNywgTVNSX0lQQGgJCS8qIHJlbG9jYXRlZCBpbnRvIGxvdyBtZW1vcnkJKi8KKwlvcmkJcjcsIHI3LCBNU1JfSVBAbAkvKiBNU1JbSVBdIGNhbiBiZSB0dXJuZWQgb2ZmCSovCisJYW5kYwlyMywgcjMsIHI3CQkvKiAoaWYgaXQgd2FzIG9uKQkJKi8KKwlTWU5DCQkJCS8qIFNvbWUgY2hpcCByZXZzIG5lZWQgdGhpcy4uLiAqLworCW10bXNyCXIzCisJU1lOQworCisJbXRscglyNAkJCS8qIHJlc3RvcmUgbGluayByZWdpc3RlciAgICAqLworCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTcyZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3RyYXBzLmMKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBsaW51eC9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiAgR2FyeSBUaG9tYXMgKGdkdEBsaW51eHBwYy5vcmcpCisgKgorICogTW9kaWZpZWQgYnkgQ29ydCBEb3VnYW4gKGNvcnRAY3Mubm10LmVkdSkKKyAqIGFuZCBQYXVsIE1hY2tlcnJhcyAocGF1bHVzQGNzLmFudS5lZHUuYXUpCisgKiBmaXhlZCBNYWNoaW5lIENoZWNrIFJlYXNvbnMgYnkgUmVpbmhhcmQgTWV5ZXIgKHIubWV5ZXJAZW1rLWVsZWt0cm9uaWsuZGUpCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDMKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIGhhcmR3YXJlIGV4Y2VwdGlvbnMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGtnZGIuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qIFJldHVybnMgMCBpZiBleGNlcHRpb24gbm90IGZvdW5kIGFuZCBmaXh1cCBvdGhlcndpc2UuICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nKTsKKworLyogVEhJUyBORUVEUyBDSEFOR0lORyB0byB1c2UgdGhlIGJvYXJkIGluZm8gc3RydWN0dXJlLgorKi8KKyNkZWZpbmUgRU5EX09GX01FTQkweDAyMDAwMDAwCisKKy8qCisgKiBUcmFwICYgRXhjZXB0aW9uIHN1cHBvcnQKKyAqLworCit2b2lkCitwcmludF9iYWNrdHJhY2UodW5zaWduZWQgbG9uZyAqc3ApCit7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHJpbnRmKCJDYWxsIGJhY2t0cmFjZTogIik7CisJd2hpbGUgKHNwKSB7CisJCWlmICgodWludClzcCA+IEVORF9PRl9NRU0pCisJCQlicmVhazsKKworCQlpID0gc3BbMV07CisJCWlmIChjbnQrKyAlIDcgPT0gMCkKKwkJCXByaW50ZigiXG4iKTsKKwkJcHJpbnRmKCIlMDhsWCAiLCBpKTsKKwkJaWYgKGNudCA+IDMyKSBicmVhazsKKwkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSpzcDsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGk7CisKKwlwcmludGYoIk5JUDogJTA4bFggWEVSOiAlMDhsWCBMUjogJTA4bFggUkVHUzogJXAgVFJBUDogJTA0bHggREFSOiAlMDhsWFxuIiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT54ZXIsIHJlZ3MtPmxpbmssIHJlZ3MsIHJlZ3MtPnRyYXAsIHJlZ3MtPmRhcik7CisJcHJpbnRmKCJNU1I6ICUwOGx4IEVFOiAlMDF4IFBSOiAlMDF4IEZQOiAlMDF4IE1FOiAlMDF4IElSL0RSOiAlMDF4JTAxeFxuIiwKKwkgICAgICAgcmVncy0+bXNyLCByZWdzLT5tc3ImTVNSX0VFID8gMSA6IDAsIHJlZ3MtPm1zciZNU1JfUFIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyICYgTVNSX0ZQID8gMSA6IDAscmVncy0+bXNyJk1TUl9NRSA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3ImTVNSX0lSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciZNU1JfRFIgPyAxIDogMCk7CisKKwlwcmludGYoIlxuIik7CisJZm9yIChpID0gMDsgIGkgPCAzMjsgIGkrKykgeworCQlpZiAoKGkgJSA4KSA9PSAwKQorCQl7CisJCQlwcmludGYoIkdQUiUwMmQ6ICIsIGkpOworCQl9CisKKwkJcHJpbnRmKCIlMDhsWCAiLCByZWdzLT5ncHJbaV0pOworCQlpZiAoKGkgJSA4KSA9PSA3KQorCQl7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwl9Cit9CisKKwordm9pZAorX2V4Y2VwdGlvbihpbnQgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJFeGNlcHRpb24gaW4ga2VybmVsIHBjICVseCBzaWduYWwgJWQiLHJlZ3MtPm5pcCxzaWducik7Cit9CisKK3ZvaWQKK01hY2hpbmVDaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZpeHVwOworCisJLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgorCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCisJICogdGhlIFBDSSBleGNlcHRpb24gaGFuZGxlci4KKwkgKi8KKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZShyZWdzLT5uaXApKSAhPSAwKSB7CisJCXJlZ3MtPm5pcCA9IGZpeHVwOworCQlyZXR1cm47CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ZigiTWFjaGluZSBjaGVjayBpbiBrZXJuZWwgbW9kZS5cbiIpOworCXByaW50ZigiQ2F1c2VkIGJ5IChmcm9tIG1zcik6ICIpOworCXByaW50ZigicmVncyAlcCAiLHJlZ3MpOworCS8qIHJlZmVyIHRvIDYwM2UgTWFudWFsIChNUEM2MDNFVU0vQUQpLCBjaGFwdGVyIDQuNS4yLjEgKi8KKwlzd2l0Y2goIHJlZ3MtPm1zciAmIDB4MDAwRjAwMDApCisJeworCWNhc2UgKDB4ODAwMDAwMDA+PjEyKSA6CisJCXByaW50ZigiTWFjaGluZSBjaGVjayBzaWduYWwgLSBwcm9iYWJseSBkdWUgdG8gbW0gZmF1bHRcbiIKKwkJCSJ3aXRoIG1tdSBvZmZcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwPj4xMykgOgorCQlwcmludGYoIlRyYW5zZmVyIGVycm9yIGFjayBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwPj4xNCkgOgorCQlwcmludGYoIkRhdGEgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjE1KSA6CisJCXByaW50ZigiQWRkcmVzcyBwYXJpdHkgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmtub3duIHZhbHVlcyBpbiBtc3JcbiIpOworCX0KKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygibWFjaGluZSBjaGVjayIpOworfQorCit2b2lkCitBbGlnbm1lbnRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiQWxpZ25tZW50IEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitQcm9ncmFtQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiUHJvZ3JhbSBDaGVjayBFeGNlcHRpb24iKTsKK30KKwordm9pZAorU29mdEVtdUV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJTb2Z0d2FyZSBFbXVsYXRpb24gRXhjZXB0aW9uIik7Cit9CisKKwordm9pZAorVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXByaW50ZigiQmFkIHRyYXAgYXQgUEM6ICVseCwgU1I6ICVseCwgdmVjdG9yPSVseFxuIiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOworCV9leGNlcHRpb24oMCwgcmVncyk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQorZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CisjZW5kaWYKKwordm9pZAorRGVidWdFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisKKyAgcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKKyAgc2hvd19yZWdzKHJlZ3MpOworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCisgIGRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CisjZW5kaWYKK30KKworLyogUHJvYmUgYW4gYWRkcmVzcyBieSByZWFkaW5nLiAgSWYgbm90IHByZXNlbnQsIHJldHVybiAtMSwgb3RoZXJ3aXNlCisgKiByZXR1cm4gMC4KKyAqLworaW50CithZGRyX3Byb2JlKHVpbnQgKmFkZHIpCit7CisjaWYgMAorCWludAlyZXR2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCSIxOglsd3ogJTAsMCglMSlcbiIJCVwKKwkJIgllaWVpb1xuIgkJXAorCQkiCWxpICUwLDBcbiIJCVwKKwkJIjI6XG4iCQkJCVwKKwkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJXAorCQkiMzoJbGkgJTAsLTFcbiIJCVwKKwkJIgliIDJiXG4iCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIglcCisJCSIJLmFsaWduIDJcbiIJCVwKKwkJIgkubG9uZyAxYiwzYlxuIgkJXAorCQkiLnRleHQiCQkJCVwKKwkJOiAiPXIiIChyZXR2YWwpIDogInIiKGFkZHIpKTsKKworCXJldHVybiAocmV0dmFsKTsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3UtYm9vdC1jdXN0b21sYXlvdXQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZmZjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvdS1ib290LWN1c3RvbWxheW91dC5sZHMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KQl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIC8qIFdBUk5JTkcgLSB0aGUgZm9sbG93aW5nIGlzIGhhbmQtb3B0aW1pemVkIHRvIGZpdCB3aXRoaW4gICovCisgICAgLyogdGhlIHNlY3RvciBsYXlvdXQgb2Ygb3VyIGZsYXNoIGNoaXBzISAgICBYWFggRklYTUUgWFhYICAgKi8KKworICAgIGFyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9zdGFydC5vICAgICAgICAgICgudGV4dCkKKyAgICBhcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvdHJhcHMubyAgICAgICAgICAoLnRleHQpCisgICAgbGliL2NyYzMyLm8gICAgICAgICAoLnRleHQpCisgICAgYXJjaC9wb3dlcnBjL2xpYi9jYWNoZS5vICAgICAgICAgICAgICgudGV4dCkKKyAgICBhcmNoL3Bvd2VycGMvbGliL3RpbWUubyAgICAgICAgICAgICAgKC50ZXh0KQorCisgICAgLiA9IERFRklORUQoZW52X29mZnNldCkgPyBlbnZfb2Zmc2V0IDogLjsKKyAgICBjb21tb24vZW52X2VtYmVkZGVkLm8gICAgICAgICgucHBjZW52KQorCisgICAgKigudGV4dCkKKyAgICAqKC5nb3QxKQorICAgIC4gPSBBTElHTigxNik7CisgICAgKiguZWhfZnJhbWUpCisgICAgKihTT1JUX0JZX0FMSUdOTUVOVChTT1JUX0JZX05BTUUoLnJvZGF0YSopKSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAoTk9MT0FEKSAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC4gPSBBTElHTig0KTsKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQwNjBkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KQl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGFyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC9zdGFydC5vCSgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgICAgLiA9IEFMSUdOKDE2KTsKKyAgICAqKC5laF9mcmFtZSkKKyAgICAqKFNPUlRfQllfQUxJR05NRU5UKFNPUlRfQllfTkFNRSgucm9kYXRhKikpKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzIChOT0xPQUQpICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLiA9IEFMSUdOKDQpOworICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvdXNiLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjN2RhMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC91c2IuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBNYXJrdXMgS2xvdHpidWVjaGVyLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIDxta0BkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9PSENJX05FVykgJiYgZGVmaW5lZChDT05GSUdfU1lTX1VTQl9PSENJX0NQVV9JTklUKQorCisjaW5jbHVkZSA8bXBjNXh4eC5oPgorCitpbnQgdXNiX2NwdV9pbml0KHZvaWQpCit7CisJLyogU2V0IHRoZSBVU0IgQ2xvY2sJCQkJCQkgICAgICovCisJKih2dV9sb25nICopTVBDNVhYWF9DRE1fNDhfRkRDID0gQ09ORklHX1VTQl9DTE9DSzsKKworI2lmZGVmIENPTkZJR19QU0MzX1VTQiAvKiBVU0IgaXMgdXNpbmcgdGhlIGFsdGVybmF0ZSBjb25maWd1cmF0aW9uICovCisJLyogcmVtb3ZlIGFsbCBQU0MzIFVTQiBiaXRzIGZpcnN0IGJlZm9yZSBPUmluZyBpbiBvdXJzICovCisJKih2dV9sb25nICopTVBDNVhYWF9HUFNfUE9SVF9DT05GSUcgJj0gfjB4MDA4MDRmMDA7CisjZWxzZQorCS8qIHJlbW92ZSBhbGwgVVNCIGJpdHMgZmlyc3QgYmVmb3JlIE9SaW5nIGluIG91cnMgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX0dQU19QT1JUX0NPTkZJRyAmPSB+MHgwMDgwNzAwMDsKKyNlbmRpZgorCS8qIEFjdGl2YXRlIFVTQiBwb3J0CQkJCQkJICAgICAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfR1BTX1BPUlRfQ09ORklHIHw9IENPTkZJR19VU0JfQ09ORklHOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X3N0b3Aodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfaW5pdF9mYWlsKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX1VTQl9PSENJX0NQVV9JTklUKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3VzYl9vaGNpLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvdXNiX29oY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc2ZTRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM1eHh4L3VzYl9vaGNpLmMKQEAgLTAsMCArMSwxNjQ2IEBACisvKgorICogVVJCIE9IQ0kgSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCIG9uIHRoZSBNUEM1MjAwLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMy0yMDA0CisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyA8Z2FyeWpAZGVueC5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFBpZXJyZSBBdWJlcnQsIFN0YXVibGkgRmF2ZXJnZXMgPHAuYXViZXJ0QHN0YXVibGkuY29tPgorICoKKyAqIE5vdGU6IE11Y2ggb2YgdGhpcyBjb2RlIGhhcyBiZWVuIGRlcml2ZWQgZnJvbSBMaW51eCAyLjQKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+CisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMiBEYXZpZCBCcm93bmVsbAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworLyoKKyAqIElNUE9SVEFOVCBOT1RFUworICogMSAtIHRoaXMgZHJpdmVyIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBVU0IgTWFzcyBTdG9yYWdlIERldmljZXMKKyAqICAgICAoQkJCKSBPTkxZLiBUaGVyZSBpcyBOTyBzdXBwb3J0IGZvciBJbnRlcnJ1cHQgb3IgSXNvY2hyb25vdXMgcGlwZXMhCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX1VTQl9PSENJCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDx1c2IuaD4KKyNpbmNsdWRlICJ1c2Jfb2hjaS5oIgorCisjaW5jbHVkZSA8bXBjNXh4eC5oPgorCisjZGVmaW5lIE9IQ0lfVVNFX05QUwkJLyogZm9yY2UgTm9Qb3dlclN3aXRjaGluZyBtb2RlICovCisjdW5kZWYgT0hDSV9WRVJCT1NFX0RFQlVHCS8qIG5vdCBhbHdheXMgaGVscGZ1bCAqLworI3VuZGVmIERFQlVHCisjdW5kZWYgU0hPV19JTkZPCisjdW5kZWYgT0hDSV9GSUxMX1RSQUNFCisKKy8qIEZvciBpbml0aWFsaXppbmcgY29udHJvbGxlciAobWFzayBpbiBhbiBIQ0ZTIG1vZGUgdG9vKSAqLworI2RlZmluZSBPSENJX0NPTlRST0xfSU5JVCBcCisJKE9IQ0lfQ1RSTF9DQlNSICYgMHgzKSB8IE9IQ0lfQ1RSTF9JRSB8IE9IQ0lfQ1RSTF9QTEUKKworI2RlZmluZSByZWFkbChhKSAoKigodm9sYXRpbGUgdTMyICopKGEpKSkKKyNkZWZpbmUgd3JpdGVsKGEsIGIpICgqKCh2b2xhdGlsZSB1MzIgKikoYikpID0gKCh2b2xhdGlsZSB1MzIpYSkpCisKKyNkZWZpbmUgbWluX3QodHlwZSx4LHkpICh7IHR5cGUgX194ID0gKHgpOyB0eXBlIF9feSA9ICh5KTsgX194IDwgX195ID8gX194OiBfX3k7IH0pCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIHByaW50ZigiREVCVUc6ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZiAvKiBERUJVRyAqLworI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ZigiRVJST1I6ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKKyNpZmRlZiBTSE9XX0lORk8KKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJJTkZPOiAiIGZvcm1hdCAiXG4iLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgbTE2X3N3YXAoeCkgc3dhcF8xNih4KQorI2RlZmluZSBtMzJfc3dhcCh4KSBzd2FwXzMyKHgpCisKKyNkZWZpbmUgb2hjaV9jcHVfdG9fbGUxNih4KSAoeCkKKyNkZWZpbmUgb2hjaV9jcHVfdG9fbGUzMih4KSAoeCkKKworLyogZ2xvYmFsIG9oY2lfdCAqLworc3RhdGljIG9oY2lfdCBnb2hjaTsKKy8qIHRoaXMgbXVzdCBiZSBhbGlnbmVkIHRvIGEgMjU2IGJ5dGUgYm91bmRhcnkgKi8KK3N0cnVjdCBvaGNpX2hjY2EgZ2hjY2FbMV07CisvKiBhIHBvaW50ZXIgdG8gdGhlIGFsaWduZWQgc3RvcmFnZSAqLworc3RydWN0IG9oY2lfaGNjYSAqcGhjY2E7CisvKiB0aGlzIGFsbG9jYXRlcyBFRHMgZm9yIGFsbCBwb3NzaWJsZSBlbmRwb2ludHMgKi8KK3N0cnVjdCBvaGNpX2RldmljZSBvaGNpX2RldjsKKy8qIHVyYl9wcml2ICovCit1cmJfcHJpdl90IHVyYl9wcml2OworLyogUkhTQyBmbGFnICovCitpbnQgZ290X3Joc2M7CisvKiBkZXZpY2Ugd2hpY2ggd2FzIGRpc2Nvbm5lY3RlZCAqLworc3RydWN0IHVzYl9kZXZpY2UgKmRldmdvbmU7CisvKiBmbGFnIGd1YXJkaW5nIFVSQiB0cmFuc2F0aW9uICovCitpbnQgdXJiX2ZpbmlzaGVkID0gMDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQU1ELTc1NiAoRDIgcmV2KSByZXBvcnRzIGNvcnJ1cHQgcmVnaXN0ZXIgY29udGVudHMgaW4gc29tZSBjYXNlcy4KKyAqIFRoZSBlcnJhdHVtICgjNCkgZGVzY3JpcHRpb24gaXMgaW5jb3JyZWN0LiAgQU1EJ3Mgd29ya2Fyb3VuZCB3YWl0cworICogdGlsbCBzb21lIGJpdHMgKG1vc3RseSByZXNlcnZlZCkgYXJlIGNsZWFyOyBvayBmb3IgYWxsIHJldnMuCisgKi8KKyNkZWZpbmUgT0hDSV9RVUlSS19BTUQ3NTYgMHhhYmNkCisjZGVmaW5lIHJlYWRfcm9vdGh1YihoYywgcmVnaXN0ZXIsIG1hc2spICh7IFwKKwl1MzIgdGVtcCA9IHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIucmVnaXN0ZXIpOyBcCisJaWYgKGhjLT5mbGFncyAmIE9IQ0lfUVVJUktfQU1ENzU2KSBcCisJCXdoaWxlICh0ZW1wICYgbWFzaykgXAorCQkJdGVtcCA9IHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIucmVnaXN0ZXIpOyBcCisJdGVtcDsgfSkKKworc3RhdGljIHUzMiByb290aHViX2EgKHN0cnVjdCBvaGNpICpoYykKKwl7IHJldHVybiByZWFkX3Jvb3RodWIgKGhjLCBhLCAweGZjMGZlMDAwKTsgfQorc3RhdGljIGlubGluZSB1MzIgcm9vdGh1Yl9iIChzdHJ1Y3Qgb2hjaSAqaGMpCisJeyByZXR1cm4gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5iKTsgfQorc3RhdGljIGlubGluZSB1MzIgcm9vdGh1Yl9zdGF0dXMgKHN0cnVjdCBvaGNpICpoYykKKwl7IHJldHVybiByZWFkbCAoJmhjLT5yZWdzLT5yb290aHViLnN0YXR1cyk7IH0KK3N0YXRpYyB1MzIgcm9vdGh1Yl9wb3J0c3RhdHVzIChzdHJ1Y3Qgb2hjaSAqaGMsIGludCBpKQorCXsgcmV0dXJuIHJlYWRfcm9vdGh1YiAoaGMsIHBvcnRzdGF0dXMgW2ldLCAweGZmZTBmY2UwKTsgfQorCisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBpbnQgaGNfaW50ZXJydXB0ICh2b2lkKTsKK3N0YXRpYyB2b2lkCit0ZF9zdWJtaXRfam9iIChzdHJ1Y3QgdXNiX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICogYnVmZmVyLAorCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICogc2V0dXAsIHVyYl9wcml2X3QgKiB1cmIsIGludCBpbnRlcnZhbCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIFVSQiBzdXBwb3J0IGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZnJlZSBIQ0QtcHJpdmF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFVSQiAqLworCitzdGF0aWMgdm9pZCB1cmJfZnJlZV9wcml2ICh1cmJfcHJpdl90ICogdXJiKQoreworCWludAkJaTsKKwlpbnQJCWxhc3Q7CisJc3RydWN0IHRkCSogdGQ7CisKKwlsYXN0ID0gdXJiLT5sZW5ndGggLSAxOworCWlmIChsYXN0ID49IDApIHsKKwkJZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJCXRkID0gdXJiLT50ZFtpXTsKKwkJCWlmICh0ZCkgeworCQkJCXRkLT51c2JfZGV2ID0gTlVMTDsKKwkJCQl1cmItPnRkW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIERFQlVHCitzdGF0aWMgaW50IHNvaGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlciAoc3RydWN0IHVzYl9kZXZpY2UgKiBkZXYpOworCisvKiBkZWJ1Z3wgcHJpbnQgdGhlIG1haW4gY29tcG9uZW50cyBvZiBhbiBVUkIKKyAqIHNtYWxsOiAwKSBoZWFkZXIgKyBkYXRhIHBhY2tldHMgMSkganVzdCBoZWFkZXIgKi8KKworc3RhdGljIHZvaWQgcGt0X3ByaW50IChzdHJ1Y3QgdXNiX2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICogYnVmZmVyLAorCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICogc2V0dXAsIGNoYXIgKiBzdHIsIGludCBzbWFsbCkKK3sKKwl1cmJfcHJpdl90ICogcHVyYiA9ICZ1cmJfcHJpdjsKKworCWRiZygiJXMgVVJCOlslNHhdIGRldjolMmQsZXA6JTJkLSVjLHR5cGU6JXMsbGVuOiVkLyVkIHN0YXQ6JSNseCIsCisJCQlzdHIsCisJCQlzb2hjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIgKGRldiksCisJCQl1c2JfcGlwZWRldmljZSAocGlwZSksCisJCQl1c2JfcGlwZWVuZHBvaW50IChwaXBlKSwKKwkJCXVzYl9waXBlb3V0IChwaXBlKT8gJ08nOiAnSScsCisJCQl1c2JfcGlwZXR5cGUgKHBpcGUpIDwgMj8gKHVzYl9waXBlaW50IChwaXBlKT8gIklOVFIiOiAiSVNPQyIpOgorCQkJCSh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpPyAiQ1RSTCI6ICJCVUxLIiksCisJCQlwdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkJdHJhbnNmZXJfbGVuLCBkZXYtPnN0YXR1cyk7CisjaWZkZWYJT0hDSV9WRVJCT1NFX0RFQlVHCisJaWYgKCFzbWFsbCkgeworCQlpbnQgaSwgbGVuOworCisJCWlmICh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpKSB7CisJCQlwcmludGYgKF9fRklMRV9fICI6IGNtZCg4KToiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA4IDsgaSsrKQorCQkJCXByaW50ZiAoIiAlMDJ4IiwgKChfX3U4ICopIHNldHVwKSBbaV0pOworCQkJcHJpbnRmICgiXG4iKTsKKwkJfQorCQlpZiAodHJhbnNmZXJfbGVuID4gMCAmJiBidWZmZXIpIHsKKwkJCXByaW50ZiAoX19GSUxFX18gIjogZGF0YSglZC8lZCk6IiwKKwkJCQlwdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkJCXRyYW5zZmVyX2xlbik7CisJCQlsZW4gPSB1c2JfcGlwZW91dCAocGlwZSk/CisJCQkJCXRyYW5zZmVyX2xlbjogcHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBpIDwgbGVuOyBpKyspCisJCQkJcHJpbnRmICgiICUwMngiLCAoKF9fdTggKikgYnVmZmVyKSBbaV0pOworCQkJcHJpbnRmICgiJXNcbiIsIGkgPCBsZW4/ICIuLi4iOiAiIik7CisJCX0KKwl9CisjZW5kaWYKK30KKworLyoganVzdCBmb3IgZGVidWdnaW5nOyBwcmludHMgbm9uLWVtcHR5IGJyYW5jaGVzIG9mIHRoZSBpbnQgZWQgdHJlZSBpbmNsdXNpdmUgaXNvIGVkcyovCit2b2lkIGVwX3ByaW50X2ludF9lZHMgKG9oY2lfdCAqb2hjaSwgY2hhciAqIHN0cikgeworCWludCBpLCBqOworCSBfX3UzMiAqIGVkX3A7CisJZm9yIChpPSAwOyBpIDwgMzI7IGkrKykgeworCQlqID0gNTsKKwkJZWRfcCA9ICYob2hjaS0+aGNjYS0+aW50X3RhYmxlIFtpXSk7CisJCWlmICgqZWRfcCA9PSAwKQorCQkgICAgY29udGludWU7CisJCXByaW50ZiAoX19GSUxFX18gIjogJXMgYnJhbmNoIGludCAlMmQoJTJ4KToiLCBzdHIsIGksIGkpOworCQl3aGlsZSAoKmVkX3AgIT0gMCAmJiBqLS0pIHsKKwkJCWVkX3QgKmVkID0gKGVkX3QgKilvaGNpX2NwdV90b19sZTMyKGVkX3ApOworCQkJcHJpbnRmICgiIGVkOiAlNHg7IiwgZWQtPmh3SU5GTyk7CisJCQllZF9wID0gJmVkLT5od05leHRFRDsKKwkJfQorCQlwcmludGYgKCJcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgb2hjaV9kdW1wX2ludHJfbWFzayAoY2hhciAqbGFiZWwsIF9fdTMyIG1hc2spCit7CisJZGJnICgiJXM6IDB4JTA4eCVzJXMlcyVzJXMlcyVzJXMlcyIsCisJCWxhYmVsLAorCQltYXNrLAorCQkobWFzayAmIE9IQ0lfSU5UUl9NSUUpID8gIiBNSUUiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX09DKSA/ICIgT0MiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1JIU0MpID8gIiBSSFNDIiA6ICIiLAorCQkobWFzayAmIE9IQ0lfSU5UUl9GTk8pID8gIiBGTk8iIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1VFKSA/ICIgVUUiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1JEKSA/ICIgUkQiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1NGKSA/ICIgU0YiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX1dESCkgPyAiIFdESCIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfU08pID8gIiBTTyIgOiAiIgorCQkpOworfQorCitzdGF0aWMgdm9pZCBtYXliZV9wcmludF9lZHMgKGNoYXIgKmxhYmVsLCBfX3UzMiB2YWx1ZSkKK3sKKwllZF90ICplZHAgPSAoZWRfdCAqKXZhbHVlOworCisJaWYgKHZhbHVlKSB7CisJCWRiZyAoIiVzICUwOHgiLCBsYWJlbCwgdmFsdWUpOworCQlkYmcgKCIlMDh4IiwgZWRwLT5od0lORk8pOworCQlkYmcgKCIlMDh4IiwgZWRwLT5od1RhaWxQKTsKKwkJZGJnICgiJTA4eCIsIGVkcC0+aHdIZWFkUCk7CisJCWRiZyAoIiUwOHgiLCBlZHAtPmh3TmV4dEVEKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICogaGNmczJzdHJpbmcgKGludCBzdGF0ZSkKK3sKKwlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgT0hDSV9VU0JfUkVTRVQ6CXJldHVybiAicmVzZXQiOworCQljYXNlIE9IQ0lfVVNCX1JFU1VNRToJcmV0dXJuICJyZXN1bWUiOworCQljYXNlIE9IQ0lfVVNCX09QRVI6CXJldHVybiAib3BlcmF0aW9uYWwiOworCQljYXNlIE9IQ0lfVVNCX1NVU1BFTkQ6CXJldHVybiAic3VzcGVuZCI7CisJfQorCXJldHVybiAiPyI7Cit9CisKKy8qIGR1bXAgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgb2hjaV9kdW1wX3N0YXR1cyAob2hjaV90ICpjb250cm9sbGVyKQoreworCXN0cnVjdCBvaGNpX3JlZ3MJKnJlZ3MgPSBjb250cm9sbGVyLT5yZWdzOworCV9fdTMyCQkJdGVtcDsKKworCXRlbXAgPSByZWFkbCAoJnJlZ3MtPnJldmlzaW9uKSAmIDB4ZmY7CisJaWYgKHRlbXAgIT0gMHgxMCkKKwkJZGJnICgic3BlYyAlZC4lZCIsICh0ZW1wID4+IDQpLCAodGVtcCAmIDB4MGYpKTsKKworCXRlbXAgPSByZWFkbCAoJnJlZ3MtPmNvbnRyb2wpOworCWRiZyAoImNvbnRyb2w6IDB4JTA4eCVzJXMlcyBIQ0ZTPSVzJXMlcyVzJXMgQ0JTUj0lZCIsIHRlbXAsCisJCSh0ZW1wICYgT0hDSV9DVFJMX1JXRSkgPyAiIFJXRSIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NUUkxfUldDKSA/ICIgUldDIiA6ICIiLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9JUikgPyAiIElSIiA6ICIiLAorCQloY2ZzMnN0cmluZyAodGVtcCAmIE9IQ0lfQ1RSTF9IQ0ZTKSwKKwkJKHRlbXAgJiBPSENJX0NUUkxfQkxFKSA/ICIgQkxFIiA6ICIiLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9DTEUpID8gIiBDTEUiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX0lFKSA/ICIgSUUiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX1BMRSkgPyAiIFBMRSIgOiAiIiwKKwkJdGVtcCAmIE9IQ0lfQ1RSTF9DQlNSCisJCSk7CisKKwl0ZW1wID0gcmVhZGwgKCZyZWdzLT5jbWRzdGF0dXMpOworCWRiZyAoImNtZHN0YXR1czogMHglMDh4IFNPQz0lZCVzJXMlcyVzIiwgdGVtcCwKKwkJKHRlbXAgJiBPSENJX1NPQykgPj4gMTYsCisJCSh0ZW1wICYgT0hDSV9PQ1IpID8gIiBPQ1IiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9CTEYpID8gIiBCTEYiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DTEYpID8gIiBDTEYiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9IQ1IpID8gIiBIQ1IiIDogIiIKKwkJKTsKKworCW9oY2lfZHVtcF9pbnRyX21hc2sgKCJpbnRyc3RhdHVzIiwgcmVhZGwgKCZyZWdzLT5pbnRyc3RhdHVzKSk7CisJb2hjaV9kdW1wX2ludHJfbWFzayAoImludHJlbmFibGUiLCByZWFkbCAoJnJlZ3MtPmludHJlbmFibGUpKTsKKworCW1heWJlX3ByaW50X2VkcyAoImVkX3BlcmlvZGN1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX3BlcmlvZGN1cnJlbnQpKTsKKworCW1heWJlX3ByaW50X2VkcyAoImVkX2NvbnRyb2xoZWFkIiwgcmVhZGwgKCZyZWdzLT5lZF9jb250cm9saGVhZCkpOworCW1heWJlX3ByaW50X2VkcyAoImVkX2NvbnRyb2xjdXJyZW50IiwgcmVhZGwgKCZyZWdzLT5lZF9jb250cm9sY3VycmVudCkpOworCisJbWF5YmVfcHJpbnRfZWRzICgiZWRfYnVsa2hlYWQiLCByZWFkbCAoJnJlZ3MtPmVkX2J1bGtoZWFkKSk7CisJbWF5YmVfcHJpbnRfZWRzICgiZWRfYnVsa2N1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX2J1bGtjdXJyZW50KSk7CisKKwltYXliZV9wcmludF9lZHMgKCJkb25laGVhZCIsIHJlYWRsICgmcmVncy0+ZG9uZWhlYWQpKTsKK30KKworc3RhdGljIHZvaWQgb2hjaV9kdW1wX3Jvb3RodWIgKG9oY2lfdCAqY29udHJvbGxlciwgaW50IHZlcmJvc2UpCit7CisJX191MzIJCQl0ZW1wLCBuZHAsIGk7CisKKwl0ZW1wID0gcm9vdGh1Yl9hIChjb250cm9sbGVyKTsKKwluZHAgPSAodGVtcCAmIFJIX0FfTkRQKTsKKworCWlmICh2ZXJib3NlKSB7CisJCWRiZyAoInJvb3RodWIuYTogJTA4eCBQT1RQR1Q9JWQlcyVzJXMlcyVzIE5EUD0lZCIsIHRlbXAsCisJCQkoKHRlbXAgJiBSSF9BX1BPVFBHVCkgPj4gMjQpICYgMHhmZiwKKwkJCSh0ZW1wICYgUkhfQV9OT0NQKSA/ICIgTk9DUCIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfQV9PQ1BNKSA/ICIgT0NQTSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfQV9EVCkgPyAiIERUIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9BX05QUykgPyAiIE5QUyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfQV9QU00pID8gIiBQU00iIDogIiIsCisJCQluZHAKKwkJCSk7CisJCXRlbXAgPSByb290aHViX2IgKGNvbnRyb2xsZXIpOworCQlkYmcgKCJyb290aHViLmI6ICUwOHggUFBDTT0lMDR4IERSPSUwNHgiLAorCQkJdGVtcCwKKwkJCSh0ZW1wICYgUkhfQl9QUENNKSA+PiAxNiwKKwkJCSh0ZW1wICYgUkhfQl9EUikKKwkJCSk7CisJCXRlbXAgPSByb290aHViX3N0YXR1cyAoY29udHJvbGxlcik7CisJCWRiZyAoInJvb3RodWIuc3RhdHVzOiAlMDh4JXMlcyVzJXMlcyVzIiwKKwkJCXRlbXAsCisJCQkodGVtcCAmIFJIX0hTX0NSV0UpID8gIiBDUldFIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9IU19PQ0lDKSA/ICIgT0NJQyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfSFNfTFBTQykgPyAiIExQU0MiIDogIiIsCisJCQkodGVtcCAmIFJIX0hTX0RSV0UpID8gIiBEUldFIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9IU19PQ0kpID8gIiBPQ0kiIDogIiIsCisJCQkodGVtcCAmIFJIX0hTX0xQUykgPyAiIExQUyIgOiAiIgorCQkJKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbmRwOyBpKyspIHsKKwkJdGVtcCA9IHJvb3RodWJfcG9ydHN0YXR1cyAoY29udHJvbGxlciwgaSk7CisJCWRiZyAoInJvb3RodWIucG9ydHN0YXR1cyBbJWRdID0gMHglMDh4JXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzIiwKKwkJCWksCisJCQl0ZW1wLAorCQkJKHRlbXAgJiBSSF9QU19QUlNDKSA/ICIgUFJTQyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfT0NJQykgPyAiIE9DSUMiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX1BTU0MpID8gIiBQU1NDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QRVNDKSA/ICIgUEVTQyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfQ1NDKSA/ICIgQ1NDIiA6ICIiLAorCisJCQkodGVtcCAmIFJIX1BTX0xTREEpID8gIiBMU0RBIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QUFMpID8gIiBQUFMiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX1BSUykgPyAiIFBSUyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUE9DSSkgPyAiIFBPQ0kiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX1BTUykgPyAiIFBTUyIgOiAiIiwKKworCQkJKHRlbXAgJiBSSF9QU19QRVMpID8gIiBQRVMiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX0NDUykgPyAiIENDUyIgOiAiIgorCQkJKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9oY2lfZHVtcCAob2hjaV90ICpjb250cm9sbGVyLCBpbnQgdmVyYm9zZSkKK3sKKwlkYmcgKCJPSENJIGNvbnRyb2xsZXIgdXNiLSVzIHN0YXRlIiwgY29udHJvbGxlci0+c2xvdF9uYW1lKTsKKworCS8qIGR1bXBzIHNvbWUgb2YgdGhlIHN0YXRlIHdlIGtub3cgYWJvdXQgKi8KKwlvaGNpX2R1bXBfc3RhdHVzIChjb250cm9sbGVyKTsKKwlpZiAodmVyYm9zZSkKKwkJZXBfcHJpbnRfaW50X2VkcyAoY29udHJvbGxlciwgImhjY2EiKTsKKwlkYmcgKCJoY2NhIGZyYW1lICMlMDR4IiwgY29udHJvbGxlci0+aGNjYS0+ZnJhbWVfbm8pOworCW9oY2lfZHVtcF9yb290aHViIChjb250cm9sbGVyLCAxKTsKK30KKworCisjZW5kaWYgLyogREVCVUcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogSW50ZXJmYWNlIGZ1bmN0aW9ucyAoVVJCKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZ2V0IGEgdHJhbnNmZXIgcmVxdWVzdCAqLworCitpbnQgc29oY2lfc3VibWl0X2pvYihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwLCBpbnQgaW50ZXJ2YWwpCit7CisJb2hjaV90ICpvaGNpOworCWVkX3QgKiBlZDsKKwl1cmJfcHJpdl90ICpwdXJiX3ByaXY7CisJaW50IGksIHNpemUgPSAwOworCisJb2hjaSA9ICZnb2hjaTsKKworCS8qIHdoZW4gY29udHJvbGxlcidzIGh1bmcsIHBlcm1pdCBvbmx5IHJvb3RodWIgY2xlYW51cCBhdHRlbXB0cworCSAqIHN1Y2ggYXMgcG93ZXJpbmcgZG93biBwb3J0cyAqLworCWlmIChvaGNpLT5kaXNhYmxlZCkgeworCQllcnIoInNvaGNpX3N1Ym1pdF9qb2I6IEVQSVBFIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBpZiB3ZSBoYXZlIGFuIHVuZmluaXNoZWQgVVJCIGZyb20gcHJldmlvdXMgdHJhbnNhY3Rpb24gbGV0J3MKKwkgKiBmYWlsIGFuZCBzY3JlYW0gYXMgcXVpY2tseSBhcyBwb3NzaWJsZSBzbyBhcyBub3QgdG8gY29ycnVwdAorCSAqIGZ1cnRoZXIgY29tbXVuaWNhdGlvbiAqLworCWlmICghdXJiX2ZpbmlzaGVkKSB7CisJCWVycigic29oY2lfc3VibWl0X2pvYjogVVJCIE5PVCBGSU5JU0hFRCIpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIHdlJ3JlIGFib3V0IHRvIGJlZ2luIGEgbmV3IHRyYW5zYWN0aW9uIGhlcmUgc28gbWFyayB0aGUgVVJCIHVuZmluaXNoZWQgKi8KKwl1cmJfZmluaXNoZWQgPSAwOworCisJLyogZXZlcnkgZW5kcG9pbnQgaGFzIGEgZWQsIGxvY2F0ZSBhbmQgZmlsbCBpdCAqLworCWlmICghKGVkID0gZXBfYWRkX2VkIChkZXYsIHBpcGUpKSkgeworCQllcnIoInNvaGNpX3N1Ym1pdF9qb2I6IEVOT01FTSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogZm9yIHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIFVSQiB3ZSBuZWVkIHRoZSBudW1iZXIgb2YgVERzIChzaXplKSAqLworCXN3aXRjaCAodXNiX3BpcGV0eXBlIChwaXBlKSkgeworCQljYXNlIFBJUEVfQlVMSzogLyogb25lIFREIGZvciBldmVyeSA0MDk2IEJ5dGUgKi8KKwkJCXNpemUgPSAodHJhbnNmZXJfbGVuIC0gMSkgLyA0MDk2ICsgMTsKKwkJCWJyZWFrOworCQljYXNlIFBJUEVfQ09OVFJPTDogLyogMSBURCBmb3Igc2V0dXAsIDEgZm9yIEFDSyBhbmQgMSBmb3IgZXZlcnkgNDA5NiBCICovCisJCQlzaXplID0gKHRyYW5zZmVyX2xlbiA9PSAwKT8gMjoKKwkJCQkJCSh0cmFuc2Zlcl9sZW4gLSAxKSAvIDQwOTYgKyAzOworCQkJYnJlYWs7CisJfQorCisJaWYgKHNpemUgPj0gKE5fVVJCX1REIC0gMSkpIHsKKwkJZXJyKCJuZWVkICVkIFREcywgb25seSBoYXZlICVkIiwgc2l6ZSwgTl9VUkJfVEQpOworCQlyZXR1cm4gLTE7CisJfQorCXB1cmJfcHJpdiA9ICZ1cmJfcHJpdjsKKwlwdXJiX3ByaXYtPnBpcGUgPSBwaXBlOworCisJLyogZmlsbCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIHRoZSBVUkIgKi8KKwlwdXJiX3ByaXYtPmxlbmd0aCA9IHNpemU7CisJcHVyYl9wcml2LT5lZCA9IGVkOworCXB1cmJfcHJpdi0+YWN0dWFsX2xlbmd0aCA9IDA7CisKKwkvKiBhbGxvY2F0ZSB0aGUgVERzICovCisJLyogbm90ZSB0aGF0IHRkWzBdIHdhcyBhbGxvY2F0ZWQgaW4gZXBfYWRkX2VkICovCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlwdXJiX3ByaXYtPnRkW2ldID0gdGRfYWxsb2MgKGRldik7CisJCWlmICghcHVyYl9wcml2LT50ZFtpXSkgeworCQkJcHVyYl9wcml2LT5sZW5ndGggPSBpOworCQkJdXJiX2ZyZWVfcHJpdiAocHVyYl9wcml2KTsKKwkJCWVycigic29oY2lfc3VibWl0X2pvYjogRU5PTUVNIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAoZWQtPnN0YXRlID09IEVEX05FVyB8fCAoZWQtPnN0YXRlICYgRURfREVMKSkgeworCQl1cmJfZnJlZV9wcml2IChwdXJiX3ByaXYpOworCQllcnIoInNvaGNpX3N1Ym1pdF9qb2I6IEVJTlZBTCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogbGluayB0aGUgZWQgaW50byBhIGNoYWluIGlmIGlzIG5vdCBhbHJlYWR5ICovCisJaWYgKGVkLT5zdGF0ZSAhPSBFRF9PUEVSKQorCQllcF9saW5rIChvaGNpLCBlZCk7CisKKwkvKiBmaWxsIHRoZSBURHMgYW5kIGxpbmsgaXQgdG8gdGhlIGVkICovCisJdGRfc3VibWl0X2pvYihkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgcHVyYl9wcml2LCBpbnRlcnZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIERFQlVHCisvKiB0ZWxsIHVzIHRoZSBjdXJyZW50IFVTQiBmcmFtZSBudW1iZXIgKi8KKworc3RhdGljIGludCBzb2hjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQoreworCW9oY2lfdCAqb2hjaSA9ICZnb2hjaTsKKworCXJldHVybiBvaGNpX2NwdV90b19sZTE2IChvaGNpLT5oY2NhLT5mcmFtZV9ubyk7Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogRUQgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBsaW5rIGFuIGVkIGludG8gb25lIG9mIHRoZSBIQyBjaGFpbnMgKi8KKworc3RhdGljIGludCBlcF9saW5rIChvaGNpX3QgKm9oY2ksIGVkX3QgKmVkaSkKK3sKKwl2b2xhdGlsZSBlZF90ICplZCA9IGVkaTsKKworCWVkLT5zdGF0ZSA9IEVEX09QRVI7CisKKwlzd2l0Y2ggKGVkLT50eXBlKSB7CisJY2FzZSBQSVBFX0NPTlRST0w6CisJCWVkLT5od05leHRFRCA9IDA7CisJCWlmIChvaGNpLT5lZF9jb250cm9sdGFpbCA9PSBOVUxMKSB7CisJCQl3cml0ZWwgKGVkLCAmb2hjaS0+cmVncy0+ZWRfY29udHJvbGhlYWQpOworCQl9IGVsc2UgeworCQkJb2hjaS0+ZWRfY29udHJvbHRhaWwtPmh3TmV4dEVEID0gb2hjaV9jcHVfdG9fbGUzMiAoKHVuc2lnbmVkIGxvbmcpZWQpOworCQl9CisJCWVkLT5lZF9wcmV2ID0gb2hjaS0+ZWRfY29udHJvbHRhaWw7CisJCWlmICghb2hjaS0+ZWRfY29udHJvbHRhaWwgJiYgIW9oY2ktPmVkX3JtX2xpc3RbMF0gJiYKKwkJCSFvaGNpLT5lZF9ybV9saXN0WzFdICYmICFvaGNpLT5zbGVlcGluZykgeworCQkJb2hjaS0+aGNfY29udHJvbCB8PSBPSENJX0NUUkxfQ0xFOworCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJCX0KKwkJb2hjaS0+ZWRfY29udHJvbHRhaWwgPSBlZGk7CisJCWJyZWFrOworCisJY2FzZSBQSVBFX0JVTEs6CisJCWVkLT5od05leHRFRCA9IDA7CisJCWlmIChvaGNpLT5lZF9idWxrdGFpbCA9PSBOVUxMKSB7CisJCQl3cml0ZWwgKGVkLCAmb2hjaS0+cmVncy0+ZWRfYnVsa2hlYWQpOworCQl9IGVsc2UgeworCQkJb2hjaS0+ZWRfYnVsa3RhaWwtPmh3TmV4dEVEID0gb2hjaV9jcHVfdG9fbGUzMiAoKHVuc2lnbmVkIGxvbmcpZWQpOworCQl9CisJCWVkLT5lZF9wcmV2ID0gb2hjaS0+ZWRfYnVsa3RhaWw7CisJCWlmICghb2hjaS0+ZWRfYnVsa3RhaWwgJiYgIW9oY2ktPmVkX3JtX2xpc3RbMF0gJiYKKwkJCSFvaGNpLT5lZF9ybV9saXN0WzFdICYmICFvaGNpLT5zbGVlcGluZykgeworCQkJb2hjaS0+aGNfY29udHJvbCB8PSBPSENJX0NUUkxfQkxFOworCQkJd3JpdGVsIChvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJCX0KKwkJb2hjaS0+ZWRfYnVsa3RhaWwgPSBlZGk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogdW5saW5rIGFuIGVkIGZyb20gb25lIG9mIHRoZSBIQyBjaGFpbnMuCisgKiBqdXN0IHRoZSBsaW5rIHRvIHRoZSBlZCBpcyB1bmxpbmtlZC4KKyAqIHRoZSBsaW5rIGZyb20gdGhlIGVkIHN0aWxsIHBvaW50cyB0byBhbm90aGVyIG9wZXJhdGlvbmFsIGVkIG9yIDAKKyAqIHNvIHRoZSBIQyBjYW4gZXZlbnR1YWxseSBmaW5pc2ggdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHVubGlua2VkIGVkICovCisKK3N0YXRpYyBpbnQgZXBfdW5saW5rIChvaGNpX3QgKm9oY2ksIGVkX3QgKmVkaSkKK3sKKwl2b2xhdGlsZSBlZF90ICplZCA9IGVkaTsKKworCWVkLT5od0lORk8gfD0gb2hjaV9jcHVfdG9fbGUzMiAoT0hDSV9FRF9TS0lQKTsKKworCXN3aXRjaCAoZWQtPnR5cGUpIHsKKwljYXNlIFBJUEVfQ09OVFJPTDoKKwkJaWYgKGVkLT5lZF9wcmV2ID09IE5VTEwpIHsKKwkJCWlmICghZWQtPmh3TmV4dEVEKSB7CisJCQkJb2hjaS0+aGNfY29udHJvbCAmPSB+T0hDSV9DVFJMX0NMRTsKKwkJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwkJCX0KKwkJCXdyaXRlbCAob2hjaV9jcHVfdG9fbGUzMiAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSksICZvaGNpLT5yZWdzLT5lZF9jb250cm9saGVhZCk7CisJCX0gZWxzZSB7CisJCQllZC0+ZWRfcHJldi0+aHdOZXh0RUQgPSBlZC0+aHdOZXh0RUQ7CisJCX0KKwkJaWYgKG9oY2ktPmVkX2NvbnRyb2x0YWlsID09IGVkKSB7CisJCQlvaGNpLT5lZF9jb250cm9sdGFpbCA9IGVkLT5lZF9wcmV2OworCQl9IGVsc2UgeworCQkJKChlZF90ICopb2hjaV9jcHVfdG9fbGUzMiAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSkpLT5lZF9wcmV2ID0gZWQtPmVkX3ByZXY7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfQlVMSzoKKwkJaWYgKGVkLT5lZF9wcmV2ID09IE5VTEwpIHsKKwkJCWlmICghZWQtPmh3TmV4dEVEKSB7CisJCQkJb2hjaS0+aGNfY29udHJvbCAmPSB+T0hDSV9DVFJMX0JMRTsKKwkJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwkJCX0KKwkJCXdyaXRlbCAob2hjaV9jcHVfdG9fbGUzMiAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSksICZvaGNpLT5yZWdzLT5lZF9idWxraGVhZCk7CisJCX0gZWxzZSB7CisJCQllZC0+ZWRfcHJldi0+aHdOZXh0RUQgPSBlZC0+aHdOZXh0RUQ7CisJCX0KKwkJaWYgKG9oY2ktPmVkX2J1bGt0YWlsID09IGVkKSB7CisJCQlvaGNpLT5lZF9idWxrdGFpbCA9IGVkLT5lZF9wcmV2OworCQl9IGVsc2UgeworCQkJKChlZF90ICopb2hjaV9jcHVfdG9fbGUzMiAoKigoX191MzIgKikmZWQtPmh3TmV4dEVEKSkpLT5lZF9wcmV2ID0gZWQtPmVkX3ByZXY7CisJCX0KKwkJYnJlYWs7CisJfQorCWVkLT5zdGF0ZSA9IEVEX1VOTElOSzsKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBhZGQvcmVpbml0IGFuIGVuZHBvaW50OyB0aGlzIHNob3VsZCBiZSBkb25lIG9uY2UgYXQgdGhlIHVzYl9zZXRfY29uZmlndXJhdGlvbiBjb21tYW5kLAorICogYnV0IHRoZSBVU0Igc3RhY2sgaXMgYSBsaXR0bGUgYml0IHN0YXRlbGVzcwlzbyB3ZSBkbyBpdCBhdCBldmVyeSB0cmFuc2FjdGlvbgorICogaWYgdGhlIHN0YXRlIG9mIHRoZSBlZCBpcyBFRF9ORVcgdGhlbiBhIGR1bW15IHRkIGlzIGFkZGVkIGFuZCB0aGUgc3RhdGUgaXMgY2hhbmdlZCB0byBFRF9VTkxJTksKKyAqIGluIGFsbCBvdGhlciBjYXNlcyB0aGUgc3RhdGUgaXMgbGVmdCB1bmNoYW5nZWQKKyAqIHRoZSBlZCBpbmZvIGZpZWxkcyBhcmUgc2V0dGVkIGFueXdheSBldmVuIHRob3VnaCBtb3N0IG9mIHRoZW0gc2hvdWxkIG5vdCBjaGFuZ2UgKi8KKworc3RhdGljIGVkX3QgKiBlcF9hZGRfZWQgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUpCit7CisJdGRfdCAqdGQ7CisJZWRfdCAqZWRfcmV0OworCXZvbGF0aWxlIGVkX3QgKmVkOworCisJZWQgPSBlZF9yZXQgPSAmb2hjaV9kZXYuZWRbKHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpIDw8IDEpIHwKKwkJCSh1c2JfcGlwZWNvbnRyb2wgKHBpcGUpPyAwOiB1c2JfcGlwZW91dCAocGlwZSkpXTsKKworCWlmICgoZWQtPnN0YXRlICYgRURfREVMKSB8fCAoZWQtPnN0YXRlICYgRURfVVJCX0RFTCkpIHsKKwkJZXJyKCJlcF9hZGRfZWQ6IHBlbmRpbmcgZGVsZXRlIik7CisJCS8qIHBlbmRpbmcgZGVsZXRlIHJlcXVlc3QgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGVkLT5zdGF0ZSA9PSBFRF9ORVcpIHsKKwkJZWQtPmh3SU5GTyA9IG9oY2lfY3B1X3RvX2xlMzIgKE9IQ0lfRURfU0tJUCk7IC8qIHNraXAgZWQgKi8KKwkJLyogZHVtbXkgdGQ7IGVuZCBvZiB0ZCBsaXN0IGZvciBlZCAqLworCQl0ZCA9IHRkX2FsbG9jICh1c2JfZGV2KTsKKwkJZWQtPmh3VGFpbFAgPSBvaGNpX2NwdV90b19sZTMyICgodW5zaWduZWQgbG9uZyl0ZCk7CisJCWVkLT5od0hlYWRQID0gZWQtPmh3VGFpbFA7CisJCWVkLT5zdGF0ZSA9IEVEX1VOTElOSzsKKwkJZWQtPnR5cGUgPSB1c2JfcGlwZXR5cGUgKHBpcGUpOworCQlvaGNpX2Rldi5lZF9jbnQrKzsKKwl9CisKKwllZC0+aHdJTkZPID0gb2hjaV9jcHVfdG9fbGUzMiAodXNiX3BpcGVkZXZpY2UgKHBpcGUpCisJCQl8IHVzYl9waXBlZW5kcG9pbnQgKHBpcGUpIDw8IDcKKwkJCXwgKHVzYl9waXBlaXNvYyAocGlwZSk/IDB4ODAwMDogMCkKKwkJCXwgKHVzYl9waXBlY29udHJvbCAocGlwZSk/IDA6ICh1c2JfcGlwZW91dCAocGlwZSk/IDB4ODAwOiAweDEwMDApKQorCQkJfCB1c2JfcGlwZXNsb3cgKHBpcGUpIDw8IDEzCisJCQl8IHVzYl9tYXhwYWNrZXQgKHVzYl9kZXYsIHBpcGUpIDw8IDE2KTsKKworCXJldHVybiBlZF9yZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIFREIGhhbmRsaW5nIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZW5xdWV1ZSBuZXh0IFREIGZvciB0aGlzIFVSQiAoT0hDSSBzcGVjIDUuMi44LjIpICovCisKK3N0YXRpYyB2b2lkIHRkX2ZpbGwgKG9oY2lfdCAqb2hjaSwgdW5zaWduZWQgaW50IGluZm8sCisJdm9pZCAqZGF0YSwgaW50IGxlbiwKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgaW5kZXgsIHVyYl9wcml2X3QgKnVyYl9wcml2KQoreworCXZvbGF0aWxlIHRkX3QgICp0ZCwgKnRkX3B0OworI2lmZGVmIE9IQ0lfRklMTF9UUkFDRQorCWludCBpOworI2VuZGlmCisKKwlpZiAoaW5kZXggPiB1cmJfcHJpdi0+bGVuZ3RoKSB7CisJCWVycigiaW5kZXggPiBsZW5ndGgiKTsKKwkJcmV0dXJuOworCX0KKwkvKiB1c2UgdGhpcyB0ZCBhcyB0aGUgbmV4dCBkdW1teSAqLworCXRkX3B0ID0gdXJiX3ByaXYtPnRkIFtpbmRleF07CisJdGRfcHQtPmh3TmV4dFREID0gMDsKKworCS8qIGZpbGwgdGhlIG9sZCBkdW1teSBURCAqLworCXRkID0gdXJiX3ByaXYtPnRkIFtpbmRleF0gPSAodGRfdCAqKShvaGNpX2NwdV90b19sZTMyICh1cmJfcHJpdi0+ZWQtPmh3VGFpbFApICYgfjB4Zik7CisKKwl0ZC0+ZWQgPSB1cmJfcHJpdi0+ZWQ7CisJdGQtPm5leHRfZGxfdGQgPSBOVUxMOworCXRkLT5pbmRleCA9IGluZGV4OworCXRkLT5kYXRhID0gKF9fdTMyKWRhdGE7CisjaWZkZWYgT0hDSV9GSUxMX1RSQUNFCisJaWYgKHVzYl9waXBlYnVsayh1cmJfcHJpdi0+cGlwZSkgJiYgdXNiX3BpcGVvdXQodXJiX3ByaXYtPnBpcGUpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJcHJpbnRmKCJ0ZC0+ZGF0YVslZF0gJSMyeCAiLGksICgodW5zaWduZWQgY2hhciAqKXRkLT5kYXRhKVtpXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisjZW5kaWYKKwlpZiAoIWxlbikKKwkJZGF0YSA9IDA7CisKKwl0ZC0+aHdJTkZPID0gb2hjaV9jcHVfdG9fbGUzMiAoaW5mbyk7CisJdGQtPmh3Q0JQID0gb2hjaV9jcHVfdG9fbGUzMiAoKHVuc2lnbmVkIGxvbmcpZGF0YSk7CisJaWYgKGRhdGEpCisJCXRkLT5od0JFID0gb2hjaV9jcHVfdG9fbGUzMiAoKHVuc2lnbmVkIGxvbmcpKGRhdGEgKyBsZW4gLSAxKSk7CisJZWxzZQorCQl0ZC0+aHdCRSA9IDA7CisJdGQtPmh3TmV4dFREID0gb2hjaV9jcHVfdG9fbGUzMiAoKHVuc2lnbmVkIGxvbmcpdGRfcHQpOworCisJLyogYXBwZW5kIHRvIHF1ZXVlICovCisJdGQtPmVkLT5od1RhaWxQID0gdGQtPmh3TmV4dFREOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBwcmVwYXJlIGFsbCBURHMgb2YgYSB0cmFuc2ZlciAqLworc3RhdGljIHZvaWQgdGRfc3VibWl0X2pvYiAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKnNldHVwLCB1cmJfcHJpdl90ICp1cmIsIGludCBpbnRlcnZhbCkKK3sKKwlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7CisJaW50IGRhdGFfbGVuID0gdHJhbnNmZXJfbGVuOworCXZvaWQgKmRhdGE7CisJaW50IGNudCA9IDA7CisJX191MzIgaW5mbyA9IDA7CisJdW5zaWduZWQgaW50IHRvZ2dsZSA9IDA7CisKKwkvKiBPSENJIGhhbmRsZXMgdGhlIERBVEEtdG9nZ2xlcyBpdHNlbGYsIHdlIGp1c3QgdXNlIHRoZSBVU0ItdG9nZ2xlIGJpdHMgZm9yIHJlc2V0aW5nICovCisJaWYodXNiX2dldHRvZ2dsZShkZXYsIHVzYl9waXBlZW5kcG9pbnQocGlwZSksIHVzYl9waXBlb3V0KHBpcGUpKSkgeworCQl0b2dnbGUgPSBURF9UX1RPR0dMRTsKKwl9IGVsc2UgeworCQl0b2dnbGUgPSBURF9UX0RBVEEwOworCQl1c2Jfc2V0dG9nZ2xlKGRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwgdXNiX3BpcGVvdXQocGlwZSksIDEpOworCX0KKwl1cmItPnRkX2NudCA9IDA7CisJaWYgKGRhdGFfbGVuKQorCQlkYXRhID0gYnVmZmVyOworCWVsc2UKKwkJZGF0YSA9IDA7CisKKwlzd2l0Y2ggKHVzYl9waXBldHlwZSAocGlwZSkpIHsKKwljYXNlIFBJUEVfQlVMSzoKKwkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KKwkJCVREX0NDIHwgVERfRFBfT1VUIDogVERfQ0MgfCBURF9EUF9JTiA7CisJCXdoaWxlKGRhdGFfbGVuID4gNDA5NikgeworCQkJdGRfZmlsbCAob2hjaSwgaW5mbyB8IChjbnQ/IFREX1RfVE9HR0xFOnRvZ2dsZSksIGRhdGEsIDQwOTYsIGRldiwgY250LCB1cmIpOworCQkJZGF0YSArPSA0MDk2OyBkYXRhX2xlbiAtPSA0MDk2OyBjbnQrKzsKKwkJfQorCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPworCQkJVERfQ0MgfCBURF9EUF9PVVQgOiBURF9DQyB8IFREX1IgfCBURF9EUF9JTiA7CisJCXRkX2ZpbGwgKG9oY2ksIGluZm8gfCAoY250PyBURF9UX1RPR0dMRTp0b2dnbGUpLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQsIHVyYik7CisJCWNudCsrOworCisJCWlmICghb2hjaS0+c2xlZXBpbmcpCisJCQl3cml0ZWwgKE9IQ0lfQkxGLCAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsgLyogc3RhcnQgYnVsayBsaXN0ICovCisJCWJyZWFrOworCisJY2FzZSBQSVBFX0NPTlRST0w6CisJCWluZm8gPSBURF9DQyB8IFREX0RQX1NFVFVQIHwgVERfVF9EQVRBMDsKKwkJdGRfZmlsbCAob2hjaSwgaW5mbywgc2V0dXAsIDgsIGRldiwgY250KyssIHVyYik7CisJCWlmIChkYXRhX2xlbiA+IDApIHsKKwkJCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/CisJCQkJVERfQ0MgfCBURF9SIHwgVERfRFBfT1VUIHwgVERfVF9EQVRBMSA6IFREX0NDIHwgVERfUiB8IFREX0RQX0lOIHwgVERfVF9EQVRBMTsKKwkJCS8qIE5PVEU6ICBtaXNoYW5kbGVzIHRyYW5zZmVycyA+OEssIHNvbWUgPjRLICovCisJCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBkYXRhLCBkYXRhX2xlbiwgZGV2LCBjbnQrKywgdXJiKTsKKwkJfQorCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPworCQkJVERfQ0MgfCBURF9EUF9JTiB8IFREX1RfREFUQTE6IFREX0NDIHwgVERfRFBfT1VUIHwgVERfVF9EQVRBMTsKKwkJdGRfZmlsbCAob2hjaSwgaW5mbywgZGF0YSwgMCwgZGV2LCBjbnQrKywgdXJiKTsKKwkJaWYgKCFvaGNpLT5zbGVlcGluZykKKwkJCXdyaXRlbCAoT0hDSV9DTEYsICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOyAvKiBzdGFydCBDb250cm9sIGxpc3QgKi8KKwkJYnJlYWs7CisJfQorCWlmICh1cmItPmxlbmd0aCAhPSBjbnQpCisJCWRiZygiVEQgTEVOR1RIICVkICE9IENOVCAlZCIsIHVyYi0+bGVuZ3RoLCBjbnQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBEb25lIExpc3QgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qIGNhbGN1bGF0ZSB0aGUgdHJhbnNmZXIgbGVuZ3RoIGFuZCB1cGRhdGUgdGhlIHVyYiAqLworCitzdGF0aWMgdm9pZCBkbF90cmFuc2Zlcl9sZW5ndGgodGRfdCAqIHRkKQoreworCV9fdTMyIHRkSU5GTywgdGRCRSwgdGRDQlA7CisJdXJiX3ByaXZfdCAqbHVyYl9wcml2ID0gJnVyYl9wcml2OworCisJdGRJTkZPID0gb2hjaV9jcHVfdG9fbGUzMiAodGQtPmh3SU5GTyk7CisJdGRCRSAgID0gb2hjaV9jcHVfdG9fbGUzMiAodGQtPmh3QkUpOworCXRkQ0JQICA9IG9oY2lfY3B1X3RvX2xlMzIgKHRkLT5od0NCUCk7CisKKworCWlmICghKHVzYl9waXBlY29udHJvbChsdXJiX3ByaXYtPnBpcGUpICYmCisJICAgICgodGQtPmluZGV4ID09IDApIHx8ICh0ZC0+aW5kZXggPT0gbHVyYl9wcml2LT5sZW5ndGggLSAxKSkpKSB7CisJCWlmICh0ZEJFICE9IDApIHsKKwkJCWlmICh0ZC0+aHdDQlAgPT0gMCkKKwkJCQlsdXJiX3ByaXYtPmFjdHVhbF9sZW5ndGggKz0gdGRCRSAtIHRkLT5kYXRhICsgMTsKKwkJCWVsc2UKKwkJCQlsdXJiX3ByaXYtPmFjdHVhbF9sZW5ndGggKz0gdGRDQlAgLSB0ZC0+ZGF0YTsKKwkJfQorCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogcmVwbGllcyB0byB0aGUgcmVxdWVzdCBoYXZlIHRvIGJlIG9uIGEgRklGTyBiYXNpcyBzbworICogd2UgcmV2ZXJzZSB0aGUgcmV2ZXJzZWQgZG9uZS1saXN0ICovCisKK3N0YXRpYyB0ZF90ICogZGxfcmV2ZXJzZV9kb25lX2xpc3QgKG9oY2lfdCAqb2hjaSkKK3sKKwlfX3UzMiB0ZF9saXN0X2hjOworCXRkX3QgKnRkX3JldiA9IE5VTEw7CisJdGRfdCAqdGRfbGlzdCA9IE5VTEw7CisJdXJiX3ByaXZfdCAqbHVyYl9wcml2ID0gTlVMTDsKKworCXRkX2xpc3RfaGMgPSBvaGNpX2NwdV90b19sZTMyIChvaGNpLT5oY2NhLT5kb25lX2hlYWQpICYgMHhmZmZmZmZmMDsKKwlvaGNpLT5oY2NhLT5kb25lX2hlYWQgPSAwOworCisJd2hpbGUgKHRkX2xpc3RfaGMpIHsKKwkJdGRfbGlzdCA9ICh0ZF90ICopdGRfbGlzdF9oYzsKKworCQlpZiAoVERfQ0NfR0VUIChvaGNpX2NwdV90b19sZTMyICh0ZF9saXN0LT5od0lORk8pKSkgeworCQkJbHVyYl9wcml2ID0gJnVyYl9wcml2OworCQkJZGJnKCIgVVNCLWVycm9yL3N0YXR1czogJXggOiAlcCIsCisJCQkJCVREX0NDX0dFVCAob2hjaV9jcHVfdG9fbGUzMiAodGRfbGlzdC0+aHdJTkZPKSksIHRkX2xpc3QpOworCQkJaWYgKHRkX2xpc3QtPmVkLT5od0hlYWRQICYgb2hjaV9jcHVfdG9fbGUzMiAoMHgxKSkgeworCQkJCWlmIChsdXJiX3ByaXYgJiYgKCh0ZF9saXN0LT5pbmRleCArIDEpIDwgbHVyYl9wcml2LT5sZW5ndGgpKSB7CisJCQkJCXRkX2xpc3QtPmVkLT5od0hlYWRQID0KKwkJCQkJCShsdXJiX3ByaXYtPnRkW2x1cmJfcHJpdi0+bGVuZ3RoIC0gMV0tPmh3TmV4dFREICYgb2hjaV9jcHVfdG9fbGUzMiAoMHhmZmZmZmZmMCkpIHwKKwkJCQkJCQkJCSh0ZF9saXN0LT5lZC0+aHdIZWFkUCAmIG9oY2lfY3B1X3RvX2xlMzIgKDB4MikpOworCQkJCQlsdXJiX3ByaXYtPnRkX2NudCArPSBsdXJiX3ByaXYtPmxlbmd0aCAtIHRkX2xpc3QtPmluZGV4IC0gMTsKKwkJCQl9IGVsc2UKKwkJCQkJdGRfbGlzdC0+ZWQtPmh3SGVhZFAgJj0gb2hjaV9jcHVfdG9fbGUzMiAoMHhmZmZmZmZmMik7CisJCQl9CisJCQl0ZF9saXN0LT5od05leHRURCA9IDA7CisJCX0KKworCQl0ZF9saXN0LT5uZXh0X2RsX3RkID0gdGRfcmV2OworCQl0ZF9yZXYgPSB0ZF9saXN0OworCQl0ZF9saXN0X2hjID0gb2hjaV9jcHVfdG9fbGUzMiAodGRfbGlzdC0+aHdOZXh0VEQpICYgMHhmZmZmZmZmMDsKKwl9CisJcmV0dXJuIHRkX2xpc3Q7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHRkIGRvbmUgbGlzdCAqLworc3RhdGljIGludCBkbF9kb25lX2xpc3QgKG9oY2lfdCAqb2hjaSwgdGRfdCAqdGRfbGlzdCkKK3sKKwl0ZF90ICp0ZF9saXN0X25leHQgPSBOVUxMOworCWVkX3QgKmVkOworCWludCBjYyA9IDA7CisJaW50IHN0YXQgPSAwOworCS8qIHVyYl90ICp1cmI7ICovCisJdXJiX3ByaXZfdCAqbHVyYl9wcml2OworCV9fdTMyIHRkSU5GTywgZWRIZWFkUCwgZWRUYWlsUDsKKworCXdoaWxlICh0ZF9saXN0KSB7CisJCXRkX2xpc3RfbmV4dCA9IHRkX2xpc3QtPm5leHRfZGxfdGQ7CisKKwkJbHVyYl9wcml2ID0gJnVyYl9wcml2OworCQl0ZElORk8gPSBvaGNpX2NwdV90b19sZTMyICh0ZF9saXN0LT5od0lORk8pOworCisJCWVkID0gdGRfbGlzdC0+ZWQ7CisKKwkJZGxfdHJhbnNmZXJfbGVuZ3RoKHRkX2xpc3QpOworCisJCS8qIGVycm9yIGNvZGUgb2YgdHJhbnNmZXIgKi8KKwkJY2MgPSBURF9DQ19HRVQgKHRkSU5GTyk7CisJCWlmICgrKyhsdXJiX3ByaXYtPnRkX2NudCkgPT0gbHVyYl9wcml2LT5sZW5ndGgpIHsKKwkJCWlmICgoZWQtPnN0YXRlICYgKEVEX09QRVIgfCBFRF9VTkxJTkspKQorCQkJCQkmJiAobHVyYl9wcml2LT5zdGF0ZSAhPSBVUkJfREVMKSkgeworCQkJCWRiZygiQ29uZGl0aW9uQ29kZSAlI3giLCBjYyk7CisJCQkJc3RhdCA9IGNjX3RvX2Vycm9yW2NjXTsKKwkJCQl1cmJfZmluaXNoZWQgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKGVkLT5zdGF0ZSAhPSBFRF9ORVcpIHsKKwkJCWVkSGVhZFAgPSBvaGNpX2NwdV90b19sZTMyIChlZC0+aHdIZWFkUCkgJiAweGZmZmZmZmYwOworCQkJZWRUYWlsUCA9IG9oY2lfY3B1X3RvX2xlMzIgKGVkLT5od1RhaWxQKTsKKworCQkJLyogdW5saW5rIGVkcyBpZiB0aGV5IGFyZSBub3QgYnVzeSAqLworCQkJaWYgKChlZEhlYWRQID09IGVkVGFpbFApICYmIChlZC0+c3RhdGUgPT0gRURfT1BFUikpCisJCQkJZXBfdW5saW5rIChvaGNpLCBlZCk7CisJCX0KKworCQl0ZF9saXN0ID0gdGRfbGlzdF9uZXh0OworCX0KKwlyZXR1cm4gc3RhdDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogVmlydHVhbCBSb290IEh1YgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRGV2aWNlIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBfX3U4IHJvb3RfaHViX2Rldl9kZXNbXSA9Cit7CisJMHgxMiwJICAgIC8qCV9fdTggIGJMZW5ndGg7ICovCisJMHgwMSwJICAgIC8qCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsgRGV2aWNlICovCisJMHgxMCwJICAgIC8qCV9fdTE2IGJjZFVTQjsgdjEuMSAqLworCTB4MDEsCisJMHgwOSwJICAgIC8qCV9fdTggIGJEZXZpY2VDbGFzczsgSFVCX0NMQVNTQ09ERSAqLworCTB4MDAsCSAgICAvKglfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGJEZXZpY2VQcm90b2NvbDsgKi8KKwkweDA4LAkgICAgLyoJX191OCAgYk1heFBhY2tldFNpemUwOyA4IEJ5dGVzICovCisJMHgwMCwJICAgIC8qCV9fdTE2IGlkVmVuZG9yOyAqLworCTB4MDAsCisJMHgwMCwJICAgIC8qCV9fdTE2IGlkUHJvZHVjdDsgKi8KKwkweDAwLAorCTB4MDAsCSAgICAvKglfX3UxNiBiY2REZXZpY2U7ICovCisJMHgwMCwKKwkweDAwLAkgICAgLyoJX191OCAgaU1hbnVmYWN0dXJlcjsgKi8KKwkweDAxLAkgICAgLyoJX191OCAgaVByb2R1Y3Q7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlTZXJpYWxOdW1iZXI7ICovCisJMHgwMQkgICAgLyoJX191OCAgYk51bUNvbmZpZ3VyYXRpb25zOyAqLworfTsKKworCisvKiBDb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBfX3U4IHJvb3RfaHViX2NvbmZpZ19kZXNbXSA9Cit7CisJMHgwOSwJICAgIC8qCV9fdTggIGJMZW5ndGg7ICovCisJMHgwMiwJICAgIC8qCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsgQ29uZmlndXJhdGlvbiAqLworCTB4MTksCSAgICAvKglfX3UxNiB3VG90YWxMZW5ndGg7ICovCisJMHgwMCwKKwkweDAxLAkgICAgLyoJX191OCAgYk51bUludGVyZmFjZXM7ICovCisJMHgwMSwJICAgIC8qCV9fdTggIGJDb25maWd1cmF0aW9uVmFsdWU7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlDb25maWd1cmF0aW9uOyAqLworCTB4NDAsCSAgICAvKglfX3U4ICBibUF0dHJpYnV0ZXM7CisJCSBCaXQgNzogQnVzLXBvd2VyZWQsIDY6IFNlbGYtcG93ZXJlZCwgNSBSZW1vdGUtd2Frd3VwLCA0Li4wOiByZXN2ZCAqLworCTB4MDAsCSAgICAvKglfX3U4ICBNYXhQb3dlcjsgKi8KKworCS8qIGludGVyZmFjZSAqLworCTB4MDksCSAgICAvKglfX3U4ICBpZl9iTGVuZ3RoOyAqLworCTB4MDQsCSAgICAvKglfX3U4ICBpZl9iRGVzY3JpcHRvclR5cGU7IEludGVyZmFjZSAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iSW50ZXJmYWNlTnVtYmVyOyAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iQWx0ZXJuYXRlU2V0dGluZzsgKi8KKwkweDAxLAkgICAgLyoJX191OCAgaWZfYk51bUVuZHBvaW50czsgKi8KKwkweDA5LAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VTdWJDbGFzczsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZVByb3RvY29sOyAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9pSW50ZXJmYWNlOyAqLworCisJLyogZW5kcG9pbnQgKi8KKwkweDA3LAkgICAgLyoJX191OCAgZXBfYkxlbmd0aDsgKi8KKwkweDA1LAkgICAgLyoJX191OCAgZXBfYkRlc2NyaXB0b3JUeXBlOyBFbmRwb2ludCAqLworCTB4ODEsCSAgICAvKglfX3U4ICBlcF9iRW5kcG9pbnRBZGRyZXNzOyBJTiBFbmRwb2ludCAxICovCisJMHgwMywJICAgIC8qCV9fdTggIGVwX2JtQXR0cmlidXRlczsgSW50ZXJydXB0ICovCisJMHgwMiwJICAgIC8qCV9fdTE2IGVwX3dNYXhQYWNrZXRTaXplOyAoKE1BWF9ST09UX1BPUlRTICsgMSkgLyA4ICovCisJMHgwMCwKKwkweGZmCSAgICAvKglfX3U4ICBlcF9iSW50ZXJ2YWw7IDI1NSBtcyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MFtdID0KK3sKKwkweDA0LAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDMsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgU3RyaW5nLWRlc2NyaXB0b3IgKi8KKwkweDA5LAkJCS8qICBfX3U4ICBsYW5nIElEICovCisJMHgwNCwJCQkvKiAgX191OCAgbGFuZyBJRCAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MVtdID0KK3sKKwkyOCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCisJJ08nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdDJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0knLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknICcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdSJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknbycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd0JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd1JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ2InLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KK307CisKKy8qIEh1YiBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9yIGlzIGNvbnN0cnVjdGVkIGR5bmFtaWNhbGx5ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBPSyh4KQkJCWxlbiA9ICh4KTsgYnJlYWsKKyNpZmRlZiBERUJVRworI2RlZmluZSBXUl9SSF9TVEFUKHgpCQl7aW5mbygiV1I6c3RhdHVzICUjOHgiLCAoeCkpO3dyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnN0YXR1cyk7fQorI2RlZmluZSBXUl9SSF9QT1JUU1RBVCh4KQl7aW5mbygiV1I6cG9ydHN0YXR1c1slZF0gJSM4eCIsIHdJbmRleC0xLCAoeCkpO3dyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnBvcnRzdGF0dXNbd0luZGV4LTFdKTt9CisjZWxzZQorI2RlZmluZSBXUl9SSF9TVEFUKHgpCQl3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5zdGF0dXMpCisjZGVmaW5lIFdSX1JIX1BPUlRTVEFUKHgpCXdyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnBvcnRzdGF0dXNbd0luZGV4LTFdKQorI2VuZGlmCisjZGVmaW5lIFJEX1JIX1NUQVQJCXJvb3RodWJfc3RhdHVzKCZnb2hjaSkKKyNkZWZpbmUgUkRfUkhfUE9SVFNUQVQJCXJvb3RodWJfcG9ydHN0YXR1cygmZ29oY2ksd0luZGV4LTEpCisKKy8qIHJlcXVlc3QgdG8gdmlydHVhbCByb290IGh1YiAqLworCitpbnQgcmhfY2hlY2tfcG9ydF9zdGF0dXMob2hjaV90ICpjb250cm9sbGVyKQoreworCV9fdTMyIHRlbXAsIG5kcCwgaTsKKwlpbnQgcmVzOworCisJcmVzID0gLTE7CisJdGVtcCA9IHJvb3RodWJfYSAoY29udHJvbGxlcik7CisJbmRwID0gKHRlbXAgJiBSSF9BX05EUCk7CisJZm9yIChpID0gMDsgaSA8IG5kcDsgaSsrKSB7CisJCXRlbXAgPSByb290aHViX3BvcnRzdGF0dXMgKGNvbnRyb2xsZXIsIGkpOworCQkvKiBjaGVjayBmb3IgYSBkZXZpY2UgZGlzY29ubmVjdCAqLworCQlpZiAoKCh0ZW1wICYgKFJIX1BTX1BFU0MgfCBSSF9QU19DU0MpKSA9PQorCQkJKFJIX1BTX1BFU0MgfCBSSF9QU19DU0MpKSAmJgorCQkJKCh0ZW1wICYgUkhfUFNfQ0NTKSA9PSAwKSkgeworCQkJcmVzID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgb2hjaV9zdWJtaXRfcmhfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwKKwkJdm9pZCAqYnVmZmVyLCBpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqY21kKQoreworCXZvaWQgKiBkYXRhID0gYnVmZmVyOworCWludCBsZW5pID0gdHJhbnNmZXJfbGVuOworCWludCBsZW4gPSAwOworCWludCBzdGF0ID0gMDsKKwlfX3UzMiBkYXRhYls0XTsKKwlfX3U4ICpkYXRhX2J1ZiA9IChfX3U4ICopZGF0YWI7CisJX191MTYgYm1SVHlwZV9iUmVxOworCV9fdTE2IHdWYWx1ZTsKKwlfX3UxNiB3SW5kZXg7CisJX191MTYgd0xlbmd0aDsKKworI2lmZGVmIERFQlVHCit1cmJfcHJpdi5hY3R1YWxfbGVuZ3RoID0gMDsKK3BrdF9wcmludChkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBjbWQsICJTVUIocmgpIiwgdXNiX3BpcGVpbihwaXBlKSk7CisjZW5kaWYKKwlpZiAodXNiX3BpcGVpbnQocGlwZSkpIHsKKwkJaW5mbygiUm9vdC1IdWIgc3VibWl0IElSUTogTk9UIGltcGxlbWVudGVkIik7CisJCXJldHVybiAwOworCX0KKworCWJtUlR5cGVfYlJlcSAgPSBjbWQtPnJlcXVlc3R0eXBlIHwgKGNtZC0+cmVxdWVzdCA8PCA4KTsKKwl3VmFsdWUJICAgICAgPSBtMTZfc3dhcCAoY21kLT52YWx1ZSk7CisJd0luZGV4CSAgICAgID0gbTE2X3N3YXAgKGNtZC0+aW5kZXgpOworCXdMZW5ndGgJICAgICAgPSBtMTZfc3dhcCAoY21kLT5sZW5ndGgpOworCisJaW5mbygiUm9vdC1IdWI6IGFkcjogJTJ4IGNtZCglMXgpOiAlMDh4ICUwNHggJTA0eCAlMDR4IiwKKwkJZGV2LT5kZXZudW0sIDgsIGJtUlR5cGVfYlJlcSwgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgpOworCisJc3dpdGNoIChibVJUeXBlX2JSZXEpIHsKKwkvKiBSZXF1ZXN0IERlc3RpbmF0aW9uOgorCSAgIHdpdGhvdXQgZmxhZ3M6IERldmljZSwKKwkgICBSSF9JTlRFUkZBQ0U6IGludGVyZmFjZSwKKwkgICBSSF9FTkRQT0lOVDogZW5kcG9pbnQsCisJICAgUkhfQ0xBU1MgbWVhbnMgSFVCIGhlcmUsCisJICAgUkhfT1RIRVIgfCBSSF9DTEFTUwlhbG1vc3QgZXZlciBtZWFucyBIVUJfUE9SVCBoZXJlCisJKi8KKworCWNhc2UgUkhfR0VUX1NUQVRVUzoKKwkJCSooX191MTYgKikgZGF0YV9idWYgPSBtMTZfc3dhcCAoMSk7IE9LICgyKTsKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9JTlRFUkZBQ0U6CisJCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gbTE2X3N3YXAgKDApOyBPSyAoMik7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfRU5EUE9JTlQ6CisJCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gbTE2X3N3YXAgKDApOyBPSyAoMik7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfQ0xBU1M6CisJCQkqKF9fdTMyICopIGRhdGFfYnVmID0gbTMyX3N3YXAgKAorCQkJCVJEX1JIX1NUQVQgJiB+KFJIX0hTX0NSV0UgfCBSSF9IU19EUldFKSk7CisJCQlPSyAoNCk7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJCSooX191MzIgKikgZGF0YV9idWYgPSBtMzJfc3dhcCAoUkRfUkhfUE9SVFNUQVQpOyBPSyAoNCk7CisKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9FTkRQT0lOVDoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX0VORFBPSU5UX1NUQUxMKTogT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfQ0xBU1M6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCQljYXNlIFJIX0NfSFVCX0xPQ0FMX1BPV0VSOgorCQkJCU9LKDApOworCQkJY2FzZSAoUkhfQ19IVUJfT1ZFUl9DVVJSRU5UKToKKwkJCQkJV1JfUkhfU1RBVChSSF9IU19PQ0lDKTsgT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX1BPUlRfRU5BQkxFKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NDUyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUE9DSSk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX1BPUlRfUE9XRVIpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfTFNEQSk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX0NfUE9SVF9DT05ORUNUSU9OKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NTQyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9DX1BPUlRfRU5BQkxFKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BFU0MpOyBPSyAoMCk7CisJCQljYXNlIChSSF9DX1BPUlRfU1VTUEVORCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1NDKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19PQ0lDKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX1JFU0VUKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BSU0MpOyBPSyAoMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX1BPUlRfU1VTUEVORCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1MgKTsgT0sgKDApOworCQkJY2FzZSAoUkhfUE9SVF9SRVNFVCk6IC8qIEJVRyBJTiBIVVAgQ09ERSAqKioqKioqKiovCisJCQkJCWlmIChSRF9SSF9QT1JUU1RBVCAmIFJIX1BTX0NDUykKKwkJCQkJICAgIFdSX1JIX1BPUlRTVEFUIChSSF9QU19QUlMpOworCQkJCQlPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX1BPV0VSKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BQUyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX0VOQUJMRSk6IC8qIEJVRyBJTiBIVVAgQ09ERSAqKioqKioqKiovCisJCQkJCWlmIChSRF9SSF9QT1JUU1RBVCAmIFJIX1BTX0NDUykKKwkJCQkJICAgIFdSX1JIX1BPUlRTVEFUIChSSF9QU19QRVMgKTsKKwkJCQkJT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfQUREUkVTUzogZ29oY2kucmguZGV2bnVtID0gd1ZhbHVlOyBPSygwKTsKKworCWNhc2UgUkhfR0VUX0RFU0NSSVBUT1I6CisJCXN3aXRjaCAoKHdWYWx1ZSAmIDB4ZmYwMCkgPj4gOCkgeworCQkJY2FzZSAoMHgwMSk6IC8qIGRldmljZSBkZXNjcmlwdG9yICovCisJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgIGxlbmksCisJCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX2Rldl9kZXMpLAorCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJZGF0YV9idWYgPSByb290X2h1Yl9kZXZfZGVzOyBPSyhsZW4pOworCQkJY2FzZSAoMHgwMik6IC8qIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJICBsZW5pLAorCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJICAgICAgc2l6ZW9mIChyb290X2h1Yl9jb25maWdfZGVzKSwKKwkJCQkJICAgICAgd0xlbmd0aCkpOworCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfY29uZmlnX2RlczsgT0sobGVuKTsKKwkJCWNhc2UgKDB4MDMpOiAvKiBzdHJpbmcgZGVzY3JpcHRvcnMgKi8KKwkJCQlpZih3VmFsdWU9PTB4MDMwMCkgeworCQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQkgIGxlbmksCisJCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfc3RyX2luZGV4MCksCisJCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfc3RyX2luZGV4MDsKKwkJCQkJT0sobGVuKTsKKwkJCQl9CisJCQkJaWYod1ZhbHVlPT0weDAzMDEpIHsKKwkJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkJICBsZW5pLAorCQkJCQkJICBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX3N0cl9pbmRleDEpLAorCQkJCQkJICAgICAgd0xlbmd0aCkpOworCQkJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX3N0cl9pbmRleDE7CisJCQkJCU9LKGxlbik7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkhfR0VUX0RFU0NSSVBUT1IgfCBSSF9DTEFTUzoKKwkgICAgeworCQkgICAgX191MzIgdGVtcCA9IHJvb3RodWJfYSAoJmdvaGNpKTsKKworCQkgICAgZGF0YV9idWYgWzBdID0gOTsJCS8qIG1pbiBsZW5ndGg7ICovCisJCSAgICBkYXRhX2J1ZiBbMV0gPSAweDI5OworCQkgICAgZGF0YV9idWYgWzJdID0gdGVtcCAmIFJIX0FfTkRQOworCQkgICAgZGF0YV9idWYgWzNdID0gMDsKKwkJICAgIGlmICh0ZW1wICYgUkhfQV9QU00pCS8qIHBlci1wb3J0IHBvd2VyIHN3aXRjaGluZz8gKi8KKwkJCWRhdGFfYnVmIFszXSB8PSAweDE7CisJCSAgICBpZiAodGVtcCAmIFJIX0FfTk9DUCkJLyogbm8gb3ZlcmN1cnJlbnQgcmVwb3J0aW5nPyAqLworCQkJZGF0YV9idWYgWzNdIHw9IDB4MTA7CisJCSAgICBlbHNlIGlmICh0ZW1wICYgUkhfQV9PQ1BNKQkvKiBwZXItcG9ydCBvdmVyY3VycmVudCByZXBvcnRpbmc/ICovCisJCQlkYXRhX2J1ZiBbM10gfD0gMHg4OworCisJCSAgICAvKiBjb3JyZXNwb25kcyB0byBkYXRhX2J1Zls0LTddICovCisJCSAgICBkYXRhYiBbMV0gPSAwOworCQkgICAgZGF0YV9idWYgWzVdID0gKHRlbXAgJiBSSF9BX1BPVFBHVCkgPj4gMjQ7CisJCSAgICB0ZW1wID0gcm9vdGh1Yl9iICgmZ29oY2kpOworCQkgICAgZGF0YV9idWYgWzddID0gdGVtcCAmIFJIX0JfRFI7CisJCSAgICBpZiAoZGF0YV9idWYgWzJdIDwgNykgeworCQkJZGF0YV9idWYgWzhdID0gMHhmZjsKKwkJICAgIH0gZWxzZSB7CisJCQlkYXRhX2J1ZiBbMF0gKz0gMjsKKwkJCWRhdGFfYnVmIFs4XSA9ICh0ZW1wICYgUkhfQl9EUikgPj4gODsKKwkJCWRhdGFfYnVmIFsxMF0gPSBkYXRhX2J1ZiBbOV0gPSAweGZmOworCQkgICAgfQorCisJCSAgICBsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbmksCisJCQkgICAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIGRhdGFfYnVmIFswXSwgd0xlbmd0aCkpOworCQkgICAgT0sgKGxlbik7CisJCX0KKworCWNhc2UgUkhfR0VUX0NPTkZJR1VSQVRJT046CSooX191OCAqKSBkYXRhX2J1ZiA9IDB4MDE7IE9LICgxKTsKKworCWNhc2UgUkhfU0VUX0NPTkZJR1VSQVRJT046CVdSX1JIX1NUQVQgKDB4MTAwMDApOyBPSyAoMCk7CisKKwlkZWZhdWx0OgorCQlkYmcgKCJ1bnN1cHBvcnRlZCByb290IGh1YiBjb21tYW5kIik7CisJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwl9CisKKyNpZmRlZglERUJVRworCW9oY2lfZHVtcF9yb290aHViICgmZ29oY2ksIDEpOworI2VuZGlmCisKKwlsZW4gPSBtaW5fdChpbnQsIGxlbiwgbGVuaSk7CisJaWYgKGRhdGEgIT0gZGF0YV9idWYpCisJICAgIG1lbWNweSAoZGF0YSwgZGF0YV9idWYsIGxlbik7CisJZGV2LT5hY3RfbGVuID0gbGVuOworCWRldi0+c3RhdHVzID0gc3RhdDsKKworI2lmZGVmIERFQlVHCisJaWYgKHRyYW5zZmVyX2xlbikKKwkJdXJiX3ByaXYuYWN0dWFsX2xlbmd0aCA9IHRyYW5zZmVyX2xlbjsKKwlwa3RfcHJpbnQoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgY21kLCAiUkVUKHJoKSIsIDAvKnVzYl9waXBlaW4ocGlwZSkqLyk7CisjZW5kaWYKKworCXJldHVybiBzdGF0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBjb21tb24gY29kZSBmb3IgaGFuZGxpbmcgc3VibWl0IG1lc3NhZ2VzIC0gdXNlZCBmb3IgYWxsIGJ1dCByb290IGh1YiAqLworLyogYWNjZXNzZXMuICovCitpbnQgc3VibWl0X2NvbW1vbl9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCwgaW50IGludGVydmFsKQoreworCWludCBzdGF0ID0gMDsKKwlpbnQgbWF4c2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlKTsKKwlpbnQgdGltZW91dDsKKworCS8qIGRldmljZSBwdWxsZWQ/IFNob3J0Y3V0IHRoZSBhY3Rpb24uICovCisJaWYgKGRldmdvbmUgPT0gZGV2KSB7CisJCWRldi0+c3RhdHVzID0gVVNCX1NUX0NSQ19FUlI7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIERFQlVHCisJdXJiX3ByaXYuYWN0dWFsX2xlbmd0aCA9IDA7CisJcGt0X3ByaW50KGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCAiU1VCIiwgdXNiX3BpcGVpbihwaXBlKSk7CisjZW5kaWYKKwlpZiAoIW1heHNpemUpIHsKKwkJZXJyKCJzdWJtaXRfY29tbW9uX21lc3NhZ2U6IHBpcGVzaXplIGZvciBwaXBlICVseCBpcyB6ZXJvIiwKKwkJCXBpcGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNvaGNpX3N1Ym1pdF9qb2IoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsIGludGVydmFsKSA8IDApIHsKKwkJZXJyKCJzb2hjaV9zdWJtaXRfam9iIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYWxsb3cgbW9yZSB0aW1lIGZvciBhIEJVTEsgZGV2aWNlIHRvIHJlYWN0IC0gc29tZSBhcmUgc2xvdyAqLworI2RlZmluZSBCVUxLX1RPCSA1MDAwCS8qIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCisJaWYgKHVzYl9waXBlYnVsayhwaXBlKSkKKwkJdGltZW91dCA9IEJVTEtfVE87CisJZWxzZQorCQl0aW1lb3V0ID0gMTAwOworCisJLyogd2FpdCBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwlmb3IgKDs7KSB7CisJCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgaXMgZG9uZSAqLworCQlzdGF0ID0gaGNfaW50ZXJydXB0KCk7CisJCWlmIChzdGF0IDwgMCkgeworCQkJc3RhdCA9IFVTQl9TVF9DUkNfRVJSOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBOT1RFOiBzaW5jZSB3ZSBhcmUgbm90IGludGVycnVwdCBkcml2ZW4gaW4gVS1Cb290IGFuZCBhbHdheXMKKwkJICogaGFuZGxlIG9ubHkgb25lIFVSQiBhdCBhIHRpbWUsIHdlIGNhbm5vdCBhc3N1bWUgdGhlCisJCSAqIHRyYW5zYWN0aW9uIGZpbmlzaGVkIG9uIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJldHVybiBmcm9tCisJCSAqIGhjX2ludGVycnVwdCgpLi4gdW5sZXNzIHRoZSBmbGFnIGZvciBjdXJyZW50IFVSQiBpcyBzZXQsCisJCSAqIG1lYW5pbmcgdGhhdCBhbGwgVEQncyB0by9mcm9tIGRldmljZSBnb3QgYWN0dWFsbHkKKwkJICogdHJhbnNmZXJyZWQgYW5kIHByb2Nlc3NlZC4gSWYgdGhlIGN1cnJlbnQgVVJCIGlzIG5vdAorCQkgKiBmaW5pc2hlZCB3ZSBuZWVkIHRvIHJlLWl0ZXJhdGUgdGhpcyBsb29wIHNvIGFzCisJCSAqIGhjX2ludGVycnVwdCgpIGdldHMgY2FsbGVkIGFnYWluIGFzIHRoZXJlIG5lZWRzIHRvIGJlIHNvbWUKKwkJICogbW9yZSBURCdzIHRvIHByb2Nlc3Mgc3RpbGwgKi8KKwkJaWYgKChzdGF0ID49IDApICYmIChzdGF0ICE9IDB4ZmYpICYmICh1cmJfZmluaXNoZWQpKSB7CisJCQkvKiAweGZmIGlzIHJldHVybmVkIGZvciBhbiBTRi1pbnRlcnJ1cHQgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKC0tdGltZW91dCkgeworCQkJd2FpdF9tcygxKTsKKwkJCWlmICghdXJiX2ZpbmlzaGVkKQorCQkJCWRiZygiXCUiKTsKKworCQl9IGVsc2UgeworCQkJZXJyKCJDVEw6VElNRU9VVCAiKTsKKwkJCWRiZygic3VibWl0X2NvbW1vbl9tc2c6IFRPIHN0YXR1cyAleFxuIiwgc3RhdCk7CisJCQlzdGF0ID0gVVNCX1NUX0NSQ19FUlI7CisJCQl1cmJfZmluaXNoZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisjaWYgMAorCS8qIHdlIGdvdCBhbiBSb290IEh1YiBTdGF0dXMgQ2hhbmdlIGludGVycnVwdCAqLworCWlmIChnb3RfcmhzYykgeworI2lmZGVmIERFQlVHCisJCW9oY2lfZHVtcF9yb290aHViICgmZ29oY2ksIDEpOworI2VuZGlmCisJCWdvdF9yaHNjID0gMDsKKwkJLyogYWJ1c2UgdGltZW91dCAqLworCQl0aW1lb3V0ID0gcmhfY2hlY2tfcG9ydF9zdGF0dXMoJmdvaGNpKTsKKwkJaWYgKHRpbWVvdXQgPj0gMCkgeworI2lmIDAgLyogdGhpcyBkb2VzIG5vdGhpbmcgdXNlZnVsLCBidXQgbGVhdmUgaXQgaGVyZSBpbiBjYXNlIHRoYXQgY2hhbmdlcyAqLworCQkJLyogdGhlIGNhbGxlZCByb3V0aW5lIGFkZHMgMSB0byB0aGUgcGFzc2VkIHZhbHVlICovCisJCQl1c2JfaHViX3BvcnRfY29ubmVjdF9jaGFuZ2UoZ29oY2kucmguZGV2LCB0aW1lb3V0IC0gMSk7CisjZW5kaWYKKwkJCS8qCisJCQkgKiBYWFgKKwkJCSAqIFRoaXMgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGJlY2F1c2UgaXQgYXNzdW1lcworCQkJICogdGhhdCBvbmx5IG9uZSBkZXZpY2UgaXMgZXZlciBwbHVnZ2VkIGluIQorCQkJICovCisJCQlkZXZnb25lID0gZGV2OworCQl9CisJfQorI2VuZGlmCisKKwlkZXYtPnN0YXR1cyA9IHN0YXQ7CisJZGV2LT5hY3RfbGVuID0gdHJhbnNmZXJfbGVuOworCisjaWZkZWYgREVCVUcKKwlwa3RfcHJpbnQoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJSRVQoY3RscikiLCB1c2JfcGlwZWluKHBpcGUpKTsKKyNlbmRpZgorCisJLyogZnJlZSBURHMgaW4gdXJiX3ByaXYgKi8KKwl1cmJfZnJlZV9wcml2ICgmdXJiX3ByaXYpOworCXJldHVybiAwOworfQorCisvKiBzdWJtaXQgcm91dGluZXMgY2FsbGVkIGZyb20gdXNiLmMgKi8KK2ludCBzdWJtaXRfYnVsa19tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCWludCB0cmFuc2Zlcl9sZW4pCit7CisJaW5mbygic3VibWl0X2J1bGtfbXNnIik7CisJcmV0dXJuIHN1Ym1pdF9jb21tb25fbXNnKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIE5VTEwsIDApOworfQorCitpbnQgc3VibWl0X2NvbnRyb2xfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXApCit7CisJaW50IG1heHNpemUgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7CisKKwlpbmZvKCJzdWJtaXRfY29udHJvbF9tc2ciKTsKKyNpZmRlZiBERUJVRworCXVyYl9wcml2LmFjdHVhbF9sZW5ndGggPSAwOworCXBrdF9wcmludChkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgIlNVQiIsIHVzYl9waXBlaW4ocGlwZSkpOworI2VuZGlmCisJaWYgKCFtYXhzaXplKSB7CisJCWVycigic3VibWl0X2NvbnRyb2xfbWVzc2FnZTogcGlwZXNpemUgZm9yIHBpcGUgJWx4IGlzIHplcm8iLAorCQkJcGlwZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCgocGlwZSA+PiA4KSAmIDB4N2YpID09IGdvaGNpLnJoLmRldm51bSkgeworCQlnb2hjaS5yaC5kZXYgPSBkZXY7CisJCS8qIHJvb3QgaHViIC0gcmVkaXJlY3QgKi8KKwkJcmV0dXJuIG9oY2lfc3VibWl0X3JoX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLAorCQkJc2V0dXApOworCX0KKworCXJldHVybiBzdWJtaXRfY29tbW9uX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgMCk7Cit9CisKK2ludCBzdWJtaXRfaW50X21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJaW50IHRyYW5zZmVyX2xlbiwgaW50IGludGVydmFsKQoreworCWluZm8oInN1Ym1pdF9pbnRfbXNnIik7CisJcmV0dXJuIC0xOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBIQyBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHJlc2V0IHRoZSBIQyBhbmQgQlVTICovCisKK3N0YXRpYyBpbnQgaGNfcmVzZXQgKG9oY2lfdCAqb2hjaSkKK3sKKwlpbnQgdGltZW91dCA9IDMwOworCWludCBzbW1fdGltZW91dCA9IDUwOyAvKiAwLDUgc2VjICovCisKKwlpZiAocmVhZGwgKCZvaGNpLT5yZWdzLT5jb250cm9sKSAmIE9IQ0lfQ1RSTF9JUikgeyAvKiBTTU0gb3ducyB0aGUgSEMgKi8KKwkJd3JpdGVsIChPSENJX09DUiwgJm9oY2ktPnJlZ3MtPmNtZHN0YXR1cyk7IC8qIHJlcXVlc3Qgb3duZXJzaGlwICovCisJCWluZm8oIlVTQiBIQyBUYWtlT3ZlciBmcm9tIFNNTSIpOworCQl3aGlsZSAocmVhZGwgKCZvaGNpLT5yZWdzLT5jb250cm9sKSAmIE9IQ0lfQ1RSTF9JUikgeworCQkJd2FpdF9tcyAoMTApOworCQkJaWYgKC0tc21tX3RpbWVvdXQgPT0gMCkgeworCQkJCWVycigiVVNCIEhDIFRha2VPdmVyIGZhaWxlZCEiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEaXNhYmxlIEhDIGludGVycnVwdHMgKi8KKwl3cml0ZWwgKE9IQ0lfSU5UUl9NSUUsICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7CisKKwlkYmcoIlVTQiBIQyByZXNldF9oYyB1c2ItJXM6IGN0cmwgPSAweCVYIDsiLAorCQlvaGNpLT5zbG90X25hbWUsCisJCXJlYWRsICgmb2hjaS0+cmVncy0+Y29udHJvbCkpOworCisJLyogUmVzZXQgVVNCIChuZWVkZWQgYnkgc29tZSBjb250cm9sbGVycykgKi8KKwlvaGNpLT5oY19jb250cm9sID0gMDsKKwl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKworCS8qIEhDIFJlc2V0IHJlcXVpcmVzIG1heCAxMCB1cyBkZWxheSAqLworCXdyaXRlbCAoT0hDSV9IQ1IsICAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsKKwl3aGlsZSAoKHJlYWRsICgmb2hjaS0+cmVncy0+Y21kc3RhdHVzKSAmIE9IQ0lfSENSKSAhPSAwKSB7CisJCWlmICgtLXRpbWVvdXQgPT0gMCkgeworCQkJZXJyKCJVU0IgSEMgcmVzZXQgdGltZWQgb3V0ISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXVkZWxheSAoMSk7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTdGFydCBhbiBPSENJIGNvbnRyb2xsZXIsIHNldCB0aGUgQlVTIG9wZXJhdGlvbmFsCisgKiBlbmFibGUgaW50ZXJydXB0cworICogY29ubmVjdCB0aGUgdmlydHVhbCByb290IGh1YiAqLworCitzdGF0aWMgaW50IGhjX3N0YXJ0IChvaGNpX3QgKiBvaGNpKQoreworCV9fdTMyIG1hc2s7CisJdW5zaWduZWQgaW50IGZtaW50ZXJ2YWw7CisKKwlvaGNpLT5kaXNhYmxlZCA9IDE7CisKKwkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHdoZXJlIHRoZSBjb250cm9sIGFuZCBidWxrIGxpc3RzIGFyZQorCSAqIFRoZSBsaXN0cyBhcmUgZW1wdHkgbm93LiAqLworCisJd3JpdGVsICgwLCAmb2hjaS0+cmVncy0+ZWRfY29udHJvbGhlYWQpOworCXdyaXRlbCAoMCwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKKworCXdyaXRlbCAoKF9fdTMyKW9oY2ktPmhjY2EsICZvaGNpLT5yZWdzLT5oY2NhKTsgLyogYSByZXNldCBjbGVhcnMgdGhpcyAqLworCisJZm1pbnRlcnZhbCA9IDB4MmVkZjsKKwl3cml0ZWwgKChmbWludGVydmFsICogOSkgLyAxMCwgJm9oY2ktPnJlZ3MtPnBlcmlvZGljc3RhcnQpOworCWZtaW50ZXJ2YWwgfD0gKCgoKGZtaW50ZXJ2YWwgLSAyMTApICogNikgLyA3KSA8PCAxNik7CisJd3JpdGVsIChmbWludGVydmFsLCAmb2hjaS0+cmVncy0+Zm1pbnRlcnZhbCk7CisJd3JpdGVsICgweDYyOCwgJm9oY2ktPnJlZ3MtPmxzdGhyZXNoKTsKKworCS8qIHN0YXJ0IGNvbnRyb2xsZXIgb3BlcmF0aW9ucyAqLworCW9oY2ktPmhjX2NvbnRyb2wgPSBPSENJX0NPTlRST0xfSU5JVCB8IE9IQ0lfVVNCX09QRVI7CisJb2hjaS0+ZGlzYWJsZWQgPSAwOworCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCW1hc2sgPSAoT0hDSV9JTlRSX1NPIHwgT0hDSV9JTlRSX1dESCB8IE9IQ0lfSU5UUl9TRiB8IE9IQ0lfSU5UUl9SRCB8CisJCQlPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfRk5PIHwgT0hDSV9JTlRSX1JIU0MgfAorCQkJT0hDSV9JTlRSX09DIHwgT0hDSV9JTlRSX01JRSk7CisJd3JpdGVsIChtYXNrLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJbWFzayAmPSB+T0hDSV9JTlRSX01JRTsKKwl3cml0ZWwgKG1hc2ssICZvaGNpLT5yZWdzLT5pbnRyc3RhdHVzKTsKKwkvKiBDaG9vc2UgdGhlIGludGVycnVwdHMgd2UgY2FyZSBhYm91dCBub3cgIC0gYnV0IHcvbyBNSUUgKi8KKwltYXNrID0gT0hDSV9JTlRSX1JIU0MgfCBPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfV0RIIHwgT0hDSV9JTlRSX1NPOworCXdyaXRlbCAobWFzaywgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworCisjaWZkZWYJT0hDSV9VU0VfTlBTCisJLyogcmVxdWlyZWQgZm9yIEFNRC03NTYgYW5kIHNvbWUgTWFjIHBsYXRmb3JtcyAqLworCXdyaXRlbCAoKHJvb3RodWJfYSAob2hjaSkgfCBSSF9BX05QUykgJiB+UkhfQV9QU00sCisJCSZvaGNpLT5yZWdzLT5yb290aHViLmEpOworCXdyaXRlbCAoUkhfSFNfTFBTQywgJm9oY2ktPnJlZ3MtPnJvb3RodWIuc3RhdHVzKTsKKyNlbmRpZgkvKiBPSENJX1VTRV9OUFMgKi8KKworI2RlZmluZSBtZGVsYXkobikgKHt1bnNpZ25lZCBsb25nIG1zZWM9KG4pOyB3aGlsZSAobXNlYy0tKSB1ZGVsYXkoMTAwMCk7fSkKKwkvKiBQT1RQR1QgZGVsYXkgaXMgYml0cyAyNC0zMSwgaW4gMiBtcyB1bml0cy4gKi8KKwltZGVsYXkgKChyb290aHViX2EgKG9oY2kpID4+IDIzKSAmIDB4MWZlKTsKKworCS8qIGNvbm5lY3QgdGhlIHZpcnR1YWwgcm9vdCBodWIgKi8KKwlvaGNpLT5yaC5kZXZudW0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGFuIGludGVycnVwdCBoYXBwZW5zICovCisKK3N0YXRpYyBpbnQKK2hjX2ludGVycnVwdCAodm9pZCkKK3sKKwlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7CisJc3RydWN0IG9oY2lfcmVncyAqcmVncyA9IG9oY2ktPnJlZ3M7CisJaW50IGludHM7CisJaW50IHN0YXQgPSAtMTsKKworCWlmICgob2hjaS0+aGNjYS0+ZG9uZV9oZWFkICE9IDApICYmCisJICAgICAhKG9oY2lfY3B1X3RvX2xlMzIob2hjaS0+aGNjYS0+ZG9uZV9oZWFkKSAmIDB4MDEpKSB7CisKKwkJaW50cyA9ICBPSENJX0lOVFJfV0RIOworCisJfSBlbHNlIGlmICgoaW50cyA9IHJlYWRsICgmcmVncy0+aW50cnN0YXR1cykpID09IH4odTMyKTApIHsKKwkJb2hjaS0+ZGlzYWJsZWQrKzsKKwkJZXJyICgiJXMgZGV2aWNlIHJlbW92ZWQhIiwgb2hjaS0+c2xvdF9uYW1lKTsKKwkJcmV0dXJuIC0xOworCisJfSBlbHNlIGlmICgoaW50cyAmPSByZWFkbCAoJnJlZ3MtPmludHJlbmFibGUpKSA9PSAwKSB7CisJCWRiZygiaGNfaW50ZXJydXB0OiByZXR1cm5pbmcuLlxuIik7CisJCXJldHVybiAweGZmOworCX0KKworCS8qIGRiZygiSW50ZXJydXB0OiAleCBmcmFtZTogJXgiLCBpbnRzLCBsZTE2X3RvX2NwdSAob2hjaS0+aGNjYS0+ZnJhbWVfbm8pKTsgKi8KKworCWlmIChpbnRzICYgT0hDSV9JTlRSX1JIU0MpIHsKKwkJZ290X3Joc2MgPSAxOworCQlzdGF0ID0gMHhmZjsKKwl9CisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9VRSkgeworCQlvaGNpLT5kaXNhYmxlZCsrOworCQllcnIgKCJPSENJIFVucmVjb3ZlcmFibGUgRXJyb3IsIGNvbnRyb2xsZXIgdXNiLSVzIGRpc2FibGVkIiwKKwkJCW9oY2ktPnNsb3RfbmFtZSk7CisJCS8qIGUuZy4gZHVlIHRvIFBDSSBNYXN0ZXIvVGFyZ2V0IEFib3J0ICovCisKKyNpZmRlZglERUJVRworCQlvaGNpX2R1bXAgKG9oY2ksIDEpOworI2VuZGlmCisJCS8qIEZJWE1FOiBiZSBvcHRpbWlzdGljLCBob3BlIHRoYXQgYnVnIHdvbid0IHJlcGVhdCBvZnRlbi4gKi8KKwkJLyogTWFrZSBzb21lIG5vbi1pbnRlcnJ1cHQgY29udGV4dCByZXN0YXJ0IHRoZSBjb250cm9sbGVyLiAqLworCQkvKiBDb3VudCBhbmQgbGltaXQgdGhlIHJldHJpZXMgdGhvdWdoOyBlaXRoZXIgaGFyZHdhcmUgb3IgKi8KKwkJLyogc29mdHdhcmUgZXJyb3JzIGNhbiBnbyBmb3JldmVyLi4uICovCisJCWhjX3Jlc2V0IChvaGNpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChpbnRzICYgT0hDSV9JTlRSX1dESCkgeworCQl3cml0ZWwgKE9IQ0lfSU5UUl9XREgsICZyZWdzLT5pbnRyZGlzYWJsZSk7CisJCXN0YXQgPSBkbF9kb25lX2xpc3QgKCZnb2hjaSwgZGxfcmV2ZXJzZV9kb25lX2xpc3QgKCZnb2hjaSkpOworCQl3cml0ZWwgKE9IQ0lfSU5UUl9XREgsICZyZWdzLT5pbnRyZW5hYmxlKTsKKwl9CisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9TTykgeworCQlkYmcoIlVTQiBTY2hlZHVsZSBvdmVycnVuXG4iKTsKKwkJd3JpdGVsIChPSENJX0lOVFJfU08sICZyZWdzLT5pbnRyZW5hYmxlKTsKKwkJc3RhdCA9IC0xOworCX0KKworCS8qIEZJWE1FOiAgdGhpcyBhc3N1bWVzIFNPRiAoMS9tcykgaW50ZXJydXB0cyBkb24ndCBnZXQgbG9zdC4uLiAqLworCWlmIChpbnRzICYgT0hDSV9JTlRSX1NGKSB7CisJCXVuc2lnbmVkIGludCBmcmFtZSA9IG9oY2lfY3B1X3RvX2xlMTYgKG9oY2ktPmhjY2EtPmZyYW1lX25vKSAmIDE7CisJCXdhaXRfbXMoMSk7CisJCXdyaXRlbCAoT0hDSV9JTlRSX1NGLCAmcmVncy0+aW50cmRpc2FibGUpOworCQlpZiAob2hjaS0+ZWRfcm1fbGlzdFtmcmFtZV0gIT0gTlVMTCkKKwkJCXdyaXRlbCAoT0hDSV9JTlRSX1NGLCAmcmVncy0+aW50cmVuYWJsZSk7CisJCXN0YXQgPSAweGZmOworCX0KKworCXdyaXRlbCAoaW50cywgJnJlZ3MtPmludHJzdGF0dXMpOworCXJldHVybiBzdGF0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBEZS1hbGxvY2F0ZSBhbGwgcmVzb3VyY2VzLi4gKi8KKworc3RhdGljIHZvaWQgaGNfcmVsZWFzZV9vaGNpIChvaGNpX3QgKm9oY2kpCit7CisJZGJnICgiVVNCIEhDIHJlbGVhc2Ugb2hjaSB1c2ItJXMiLCBvaGNpLT5zbG90X25hbWUpOworCisJaWYgKCFvaGNpLT5kaXNhYmxlZCkKKwkJaGNfcmVzZXQgKG9oY2kpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogbG93IGxldmVsIGluaXRhbGlzYXRpb24gcm91dGluZSwgY2FsbGVkIGZyb20gdXNiLmMKKyAqLworc3RhdGljIGNoYXIgb2hjaV9pbml0ZWQgPSAwOworCitpbnQgdXNiX2xvd2xldmVsX2luaXQodm9pZCkKK3sKKworCS8qIFNldCB0aGUgVVNCIENsb2NrCQkJCQkJICAgICAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfQ0RNXzQ4X0ZEQyA9IENPTkZJR19VU0JfQ0xPQ0s7CisKKyNpZmRlZiBDT05GSUdfUFNDM19VU0IgLyogVVNCIGlzIHVzaW5nIHRoZSBhbHRlcm5hdGUgY29uZmlndXJhdGlvbiAqLworCS8qIHJlbW92ZSBhbGwgUFNDMyBVU0IgYml0cyBmaXJzdCBiZWZvcmUgT1JpbmcgaW4gb3VycyAqLworCSoodnVfbG9uZyAqKU1QQzVYWFhfR1BTX1BPUlRfQ09ORklHICY9IH4weDAwODA0ZjAwOworI2Vsc2UKKwkvKiByZW1vdmUgYWxsIFVTQiBiaXRzIGZpcnN0IGJlZm9yZSBPUmluZyBpbiBvdXJzICovCisJKih2dV9sb25nICopTVBDNVhYWF9HUFNfUE9SVF9DT05GSUcgJj0gfjB4MDA4MDcwMDA7CisjZW5kaWYKKwkvKiBBY3RpdmF0ZSBVU0IgcG9ydAkJCQkJCSAgICAgKi8KKwkqKHZ1X2xvbmcgKilNUEM1WFhYX0dQU19QT1JUX0NPTkZJRyB8PSBDT05GSUdfVVNCX0NPTkZJRzsKKworCW1lbXNldCAoJmdvaGNpLCAwLCBzaXplb2YgKG9oY2lfdCkpOworCW1lbXNldCAoJnVyYl9wcml2LCAwLCBzaXplb2YgKHVyYl9wcml2X3QpKTsKKworCS8qIGFsaWduIHRoZSBzdG9yYWdlICovCisJaWYgKChfX3UzMikmZ2hjY2FbMF0gJiAweGZmKSB7CisJCWVycigiSENDQSBub3QgYWxpZ25lZCEhIik7CisJCXJldHVybiAtMTsKKwl9CisJcGhjY2EgPSAmZ2hjY2FbMF07CisJaW5mbygiYWxpZ25lZCBnaGNjYSAlcCIsIHBoY2NhKTsKKwltZW1zZXQoJm9oY2lfZGV2LCAwLCBzaXplb2Yoc3RydWN0IG9oY2lfZGV2aWNlKSk7CisJaWYgKChfX3UzMikmb2hjaV9kZXYuZWRbMF0gJiAweDcpIHsKKwkJZXJyKCJFRHMgbm90IGFsaWduZWQhISIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChndGQsIDAsIHNpemVvZih0ZF90KSAqIChOVU1fVEQgKyAxKSk7CisJaWYgKChfX3UzMilndGQgJiAweDcpIHsKKwkJZXJyKCJURHMgbm90IGFsaWduZWQhISIpOworCQlyZXR1cm4gLTE7CisJfQorCXB0ZCA9IGd0ZDsKKwlnb2hjaS5oY2NhID0gcGhjY2E7CisJbWVtc2V0IChwaGNjYSwgMCwgc2l6ZW9mIChzdHJ1Y3Qgb2hjaV9oY2NhKSk7CisKKwlnb2hjaS5kaXNhYmxlZCA9IDE7CisJZ29oY2kuc2xlZXBpbmcgPSAwOworCWdvaGNpLmlycSA9IC0xOworCWdvaGNpLnJlZ3MgPSAoc3RydWN0IG9oY2lfcmVncyAqKU1QQzVYWFhfVVNCOworCisJZ29oY2kuZmxhZ3MgPSAwOworCWdvaGNpLnNsb3RfbmFtZSA9ICJtcGM1MjAwIjsKKworCWlmIChoY19yZXNldCAoJmdvaGNpKSA8IDApIHsKKwkJaGNfcmVsZWFzZV9vaGNpICgmZ29oY2kpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGhjX3N0YXJ0ICgmZ29oY2kpIDwgMCkgeworCQllcnIgKCJjYW4ndCBzdGFydCB1c2ItJXMiLCBnb2hjaS5zbG90X25hbWUpOworCQloY19yZWxlYXNlX29oY2kgKCZnb2hjaSk7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZmRlZglERUJVRworCW9oY2lfZHVtcCAoJmdvaGNpLCAxKTsKKyNlbmRpZgorCW9oY2lfaW5pdGVkID0gMTsKKwl1cmJfZmluaXNoZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfbG93bGV2ZWxfc3RvcCh2b2lkKQoreworCS8qIHRoaXMgZ2V0cyBjYWxsZWQgcmVhbGx5IGVhcmx5IC0gYmVmb3JlIHRoZSBjb250cm9sbGVyIGhhcyAqLworCS8qIGV2ZW4gYmVlbiBpbml0aWFsaXplZCEgKi8KKwlpZiAoIW9oY2lfaW5pdGVkKQorCQlyZXR1cm4gMDsKKwkvKiBUT0RPIHJlbGVhc2UgYW55IGludGVycnVwdHMsIGV0Yy4gKi8KKwkvKiBjYWxsIGhjX3JlbGVhc2Vfb2hjaSgpIGhlcmUgPyAqLworCWhjX3Jlc2V0ICgmZ29oY2kpOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1VTQl9PSENJICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvdXNiX29oY2kuaCBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjNXh4eC91c2Jfb2hjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOWI1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzV4eHgvdXNiX29oY2kuaApAQCAtMCwwICsxLDQxOCBAQAorLyoKKyAqIFVSQiBPSENJIEhDRCAoSG9zdCBDb250cm9sbGVyIERyaXZlcikgZm9yIFVTQi4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTkgUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDEgRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogdXNiLW9oY2kuaAorICovCisKKworc3RhdGljIGludCBjY190b19lcnJvclsxNl0gPSB7CisKKy8qIG1hcHBpbmcgb2YgdGhlIE9IQ0kgQ0Mgc3RhdHVzIHRvIGVycm9yIGNvZGVzICovCisJLyogTm8gIEVycm9yICAqLwkgICAgICAgMCwKKwkvKiBDUkMgRXJyb3IgICovCSAgICAgICBVU0JfU1RfQ1JDX0VSUiwKKwkvKiBCaXQgU3R1ZmYgICovCSAgICAgICBVU0JfU1RfQklUX0VSUiwKKwkvKiBEYXRhIFRvZ2cgICovCSAgICAgICBVU0JfU1RfQ1JDX0VSUiwKKwkvKiBTdGFsbCAgICAgICovCSAgICAgICBVU0JfU1RfU1RBTExFRCwKKwkvKiBEZXZOb3RSZXNwICovCSAgICAgICAtMSwKKwkvKiBQSURDaGVjayAgICovCSAgICAgICBVU0JfU1RfQklUX0VSUiwKKwkvKiBVbkV4cFBJRCAgICovCSAgICAgICBVU0JfU1RfQklUX0VSUiwKKwkvKiBEYXRhT3ZlciAgICovCSAgICAgICBVU0JfU1RfQlVGX0VSUiwKKwkvKiBEYXRhVW5kZXIgICovCSAgICAgICBVU0JfU1RfQlVGX0VSUiwKKwkvKiByZXNlcnZkICAgICovCSAgICAgICAtMSwKKwkvKiByZXNlcnZkICAgICovCSAgICAgICAtMSwKKwkvKiBCdWZmZXJPdmVyICovCSAgICAgICBVU0JfU1RfQlVGX0VSUiwKKwkvKiBCdWZmVW5kZXIgICovCSAgICAgICBVU0JfU1RfQlVGX0VSUiwKKwkvKiBOb3QgQWNjZXNzICovCSAgICAgICAtMSwKKwkvKiBOb3QgQWNjZXNzICovCSAgICAgICAtMQorfTsKKworLyogRUQgU3RhdGVzICovCisKKyNkZWZpbmUgRURfTkVXCQkweDAwCisjZGVmaW5lIEVEX1VOTElOSwkweDAxCisjZGVmaW5lIEVEX09QRVIJCTB4MDIKKyNkZWZpbmUgRURfREVMCQkweDA0CisjZGVmaW5lIEVEX1VSQl9ERUwJMHgwOAorCisvKiB1c2Jfb2hjaV9lZCAqLworc3RydWN0IGVkIHsKKwlfX3UzMiBod0lORk87CisJX191MzIgaHdUYWlsUDsKKwlfX3UzMiBod0hlYWRQOworCV9fdTMyIGh3TmV4dEVEOworCisJc3RydWN0IGVkICplZF9wcmV2OworCV9fdTggaW50X3BlcmlvZDsKKwlfX3U4IGludF9icmFuY2g7CisJX191OCBpbnRfbG9hZDsKKwlfX3U4IGludF9pbnRlcnZhbDsKKwlfX3U4IHN0YXRlOworCV9fdTggdHlwZTsKKwlfX3UxNiBsYXN0X2lzbzsKKwlzdHJ1Y3QgZWQgKmVkX3JtX2xpc3Q7CisKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlfX3UzMiB1bnVzZWRbM107Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSk7Cit0eXBlZGVmIHN0cnVjdCBlZCBlZF90OworCisKKy8qIFREIGluZm8gZmllbGQgKi8KKyNkZWZpbmUgVERfQ0MJICAgIDB4ZjAwMDAwMDAKKyNkZWZpbmUgVERfQ0NfR0VUKHRkX3ApICgodGRfcCA+PjI4KSAmIDB4MGYpCisjZGVmaW5lIFREX0NDX1NFVCh0ZF9wLCBjYykgKHRkX3ApID0gKCh0ZF9wKSAmIDB4MGZmZmZmZmYpIHwgKCgoY2MpICYgMHgwZikgPDwgMjgpCisjZGVmaW5lIFREX0VDCSAgICAweDBDMDAwMDAwCisjZGVmaW5lIFREX1QJICAgIDB4MDMwMDAwMDAKKyNkZWZpbmUgVERfVF9EQVRBMCAgMHgwMjAwMDAwMAorI2RlZmluZSBURF9UX0RBVEExICAweDAzMDAwMDAwCisjZGVmaW5lIFREX1RfVE9HR0xFIDB4MDAwMDAwMDAKKyNkZWZpbmUgVERfUgkgICAgMHgwMDA0MDAwMAorI2RlZmluZSBURF9ESQkgICAgMHgwMEUwMDAwMAorI2RlZmluZSBURF9ESV9TRVQoWCkgKCgoWCkgJiAweDA3KTw8IDIxKQorI2RlZmluZSBURF9EUAkgICAgMHgwMDE4MDAwMAorI2RlZmluZSBURF9EUF9TRVRVUCAweDAwMDAwMDAwCisjZGVmaW5lIFREX0RQX0lOICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgVERfRFBfT1VUICAgMHgwMDA4MDAwMAorCisjZGVmaW5lIFREX0lTTwkgICAgMHgwMDAxMDAwMAorI2RlZmluZSBURF9ERUwJICAgIDB4MDAwMjAwMDAKKworLyogQ0MgQ29kZXMgKi8KKyNkZWZpbmUgVERfQ0NfTk9FUlJPUgkgICAweDAwCisjZGVmaW5lIFREX0NDX0NSQwkgICAweDAxCisjZGVmaW5lIFREX0NDX0JJVFNUVUZGSU5HICAweDAyCisjZGVmaW5lIFREX0NDX0RBVEFUT0dHTEVNICAweDAzCisjZGVmaW5lIFREX0NDX1NUQUxMCSAgIDB4MDQKKyNkZWZpbmUgVERfREVWTk9UUkVTUAkgICAweDA1CisjZGVmaW5lIFREX1BJRENIRUNLRkFJTAkgICAweDA2CisjZGVmaW5lIFREX1VORVhQRUNURURQSUQgICAweDA3CisjZGVmaW5lIFREX0RBVEFPVkVSUlVOCSAgIDB4MDgKKyNkZWZpbmUgVERfREFUQVVOREVSUlVOCSAgIDB4MDkKKyNkZWZpbmUgVERfQlVGRkVST1ZFUlJVTiAgIDB4MEMKKyNkZWZpbmUgVERfQlVGRkVSVU5ERVJSVU4gIDB4MEQKKyNkZWZpbmUgVERfTk9UQUNDRVNTRUQJICAgMHgwRgorCisKKyNkZWZpbmUgTUFYUFNXIDEKKworc3RydWN0IHRkIHsKKwlfX3UzMiBod0lORk87CisJX191MzIgaHdDQlA7CQkvKiBDdXJyZW50IEJ1ZmZlciBQb2ludGVyICovCisJX191MzIgaHdOZXh0VEQ7CQkvKiBOZXh0IFREIFBvaW50ZXIgKi8KKwlfX3UzMiBod0JFOwkJLyogTWVtb3J5IEJ1ZmZlciBFbmQgUG9pbnRlciAqLworCisJX191OCB1bnVzZWQ7CisJX191OCBpbmRleDsKKwlzdHJ1Y3QgZWQgKmVkOworCXN0cnVjdCB0ZCAqbmV4dF9kbF90ZDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlpbnQgdHJhbnNmZXJfbGVuOworCV9fdTMyIGRhdGE7CisKKwlfX3UzMiB1bnVzZWQyWzJdOworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwordHlwZWRlZiBzdHJ1Y3QgdGQgdGRfdDsKKworI2RlZmluZSBPSENJX0VEX1NLSVAJKDEgPDwgMTQpCisKKy8qCisgKiBUaGUgSENDQSAoSG9zdCBDb250cm9sbGVyIENvbW11bmljYXRpb25zIEFyZWEpIGlzIGEgMjU2IGJ5dGUKKyAqIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoZSBPSENJIHNwZWMuIHRoYXQgdGhlIGhvc3QgY29udHJvbGxlciBpcworICogdG9sZCB0aGUgYmFzZSBhZGRyZXNzIG9mLiAgSXQgbXVzdCBiZSAyNTYtYnl0ZSBhbGlnbmVkLgorICovCisKKyNkZWZpbmUgTlVNX0lOVFMgMzIJLyogcGFydCBvZiB0aGUgT0hDSSBzdGFuZGFyZCAqLworc3RydWN0IG9oY2lfaGNjYSB7CisJX191MzIJaW50X3RhYmxlW05VTV9JTlRTXTsJLyogSW50ZXJydXB0IEVEIHRhYmxlICovCisJX191MTYJcGFkMTsJCQkvKiBzZXQgdG8gMCBvbiBlYWNoIGZyYW1lX25vIGNoYW5nZSAqLworCV9fdTE2CWZyYW1lX25vOwkJLyogY3VycmVudCBmcmFtZSBudW1iZXIgKi8KKwlfX3UzMglkb25lX2hlYWQ7CQkvKiBpbmZvIHJldHVybmVkIGZvciBhbiBpbnRlcnJ1cHQgKi8KKwl1OAkJcmVzZXJ2ZWRfZm9yX2hjWzExNl07Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMjU2KSkpOworCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiByb290IGh1YiBwb3J0cy4KKyAqLworI2RlZmluZSBNQVhfUk9PVF9QT1JUUwkxNQkvKiBtYXhpbXVtIE9IQ0kgcm9vdCBodWIgcG9ydHMgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgT0hDSSBjb250cm9sbGVyJ3MgbWVtb3J5IG1hcHBlZCBJL08KKyAqIHJlZ2lvbi4gIFRoaXMgaXMgTWVtb3J5IE1hcHBlZCBJL08uCVlvdSBtdXN0IHVzZSB0aGUgcmVhZGwoKSBhbmQKKyAqIHdyaXRlbCgpIG1hY3JvcyBkZWZpbmVkIGluIGFzbS9pby5oIHRvIGFjY2VzcyB0aGVzZSEhCisgKi8KK3N0cnVjdCBvaGNpX3JlZ3MgeworCS8qIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlcnMgKi8KKwlfX3UzMglyZXZpc2lvbjsKKwlfX3UzMgljb250cm9sOworCV9fdTMyCWNtZHN0YXR1czsKKwlfX3UzMglpbnRyc3RhdHVzOworCV9fdTMyCWludHJlbmFibGU7CisJX191MzIJaW50cmRpc2FibGU7CisJLyogbWVtb3J5IHBvaW50ZXJzICovCisJX191MzIJaGNjYTsKKwlfX3UzMgllZF9wZXJpb2RjdXJyZW50OworCV9fdTMyCWVkX2NvbnRyb2xoZWFkOworCV9fdTMyCWVkX2NvbnRyb2xjdXJyZW50OworCV9fdTMyCWVkX2J1bGtoZWFkOworCV9fdTMyCWVkX2J1bGtjdXJyZW50OworCV9fdTMyCWRvbmVoZWFkOworCS8qIGZyYW1lIGNvdW50ZXJzICovCisJX191MzIJZm1pbnRlcnZhbDsKKwlfX3UzMglmbXJlbWFpbmluZzsKKwlfX3UzMglmbW51bWJlcjsKKwlfX3UzMglwZXJpb2RpY3N0YXJ0OworCV9fdTMyCWxzdGhyZXNoOworCS8qIFJvb3QgaHViIHBvcnRzICovCisJc3RydWN0CW9oY2lfcm9vdGh1Yl9yZWdzIHsKKwkJX191MzIJYTsKKwkJX191MzIJYjsKKwkJX191MzIJc3RhdHVzOworCQlfX3UzMglwb3J0c3RhdHVzW01BWF9ST09UX1BPUlRTXTsKKwl9IHJvb3RodWI7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisKKworLyogT0hDSSBDT05UUk9MIEFORCBTVEFUVVMgUkVHSVNURVIgTUFTS1MgKi8KKworLyoKKyAqIEhjQ29udHJvbCAoY29udHJvbCkgcmVnaXN0ZXIgbWFza3MKKyAqLworI2RlZmluZSBPSENJX0NUUkxfQ0JTUgkoMyA8PCAwKQkvKiBjb250cm9sL2J1bGsgc2VydmljZSByYXRpbyAqLworI2RlZmluZSBPSENJX0NUUkxfUExFCSgxIDw8IDIpCS8qIHBlcmlvZGljIGxpc3QgZW5hYmxlICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9JRQkoMSA8PCAzKQkvKiBpc29jaHJvbm91cyBlbmFibGUgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX0NMRQkoMSA8PCA0KQkvKiBjb250cm9sIGxpc3QgZW5hYmxlICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9CTEUJKDEgPDwgNSkJLyogYnVsayBsaXN0IGVuYWJsZSAqLworI2RlZmluZSBPSENJX0NUUkxfSENGUwkoMyA8PCA2KQkvKiBob3N0IGNvbnRyb2xsZXIgZnVuY3Rpb25hbCBzdGF0ZSAqLworI2RlZmluZSBPSENJX0NUUkxfSVIJKDEgPDwgOCkJLyogaW50ZXJydXB0IHJvdXRpbmcgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX1JXQwkoMSA8PCA5KQkvKiByZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAqLworI2RlZmluZSBPSENJX0NUUkxfUldFCSgxIDw8IDEwKQkvKiByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLworCisvKiBwcmUtc2hpZnRlZCB2YWx1ZXMgZm9yIEhDRlMgKi8KKyMJZGVmaW5lIE9IQ0lfVVNCX1JFU0VUCSgwIDw8IDYpCisjCWRlZmluZSBPSENJX1VTQl9SRVNVTUUJKDEgPDwgNikKKyMJZGVmaW5lIE9IQ0lfVVNCX09QRVIJKDIgPDwgNikKKyMJZGVmaW5lIE9IQ0lfVVNCX1NVU1BFTkQgKDMgPDwgNikKKworLyoKKyAqIEhjQ29tbWFuZFN0YXR1cyAoY21kc3RhdHVzKSByZWdpc3RlciBtYXNrcworICovCisjZGVmaW5lIE9IQ0lfSENSCSgxIDw8IDApCS8qIGhvc3QgY29udHJvbGxlciByZXNldCAqLworI2RlZmluZSBPSENJX0NMRgkoMSA8PCAxKQkvKiBjb250cm9sIGxpc3QgZmlsbGVkICovCisjZGVmaW5lIE9IQ0lfQkxGCSgxIDw8IDIpCS8qIGJ1bGsgbGlzdCBmaWxsZWQgKi8KKyNkZWZpbmUgT0hDSV9PQ1IJKDEgPDwgMykJLyogb3duZXJzaGlwIGNoYW5nZSByZXF1ZXN0ICovCisjZGVmaW5lIE9IQ0lfU09DCSgzIDw8IDE2KQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gY291bnQgKi8KKworLyoKKyAqIG1hc2tzIHVzZWQgd2l0aCBpbnRlcnJ1cHQgcmVnaXN0ZXJzOgorICogSGNJbnRlcnJ1cHRTdGF0dXMgKGludHJzdGF0dXMpCisgKiBIY0ludGVycnVwdEVuYWJsZSAoaW50cmVuYWJsZSkKKyAqIEhjSW50ZXJydXB0RGlzYWJsZSAoaW50cmRpc2FibGUpCisgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX1NPCSgxIDw8IDApCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biAqLworI2RlZmluZSBPSENJX0lOVFJfV0RICSgxIDw8IDEpCS8qIHdyaXRlYmFjayBvZiBkb25lX2hlYWQgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX1NGCSgxIDw8IDIpCS8qIHN0YXJ0IGZyYW1lICovCisjZGVmaW5lIE9IQ0lfSU5UUl9SRAkoMSA8PCAzKQkvKiByZXN1bWUgZGV0ZWN0ICovCisjZGVmaW5lIE9IQ0lfSU5UUl9VRQkoMSA8PCA0KQkvKiB1bnJlY292ZXJhYmxlIGVycm9yICovCisjZGVmaW5lIE9IQ0lfSU5UUl9GTk8JKDEgPDwgNSkJLyogZnJhbWUgbnVtYmVyIG92ZXJmbG93ICovCisjZGVmaW5lIE9IQ0lfSU5UUl9SSFNDCSgxIDw8IDYpCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX09DCSgxIDw8IDMwKQkvKiBvd25lcnNoaXAgY2hhbmdlICovCisjZGVmaW5lIE9IQ0lfSU5UUl9NSUUJKDEgPDwgMzEpCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCisKKworLyogVmlydHVhbCBSb290IEhVQiAqLworc3RydWN0IHZpcnRfcm9vdF9odWIgeworCWludCBkZXZudW07IC8qIEFkZHJlc3Mgb2YgUm9vdCBIdWIgZW5kcG9pbnQgKi8KKwl2b2lkICpkZXY7ICAvKiB3YXMgdXJiICovCisJdm9pZCAqaW50X2FkZHI7CisJaW50IHNlbmQ7CisJaW50IGludGVydmFsOworfTsKKworLyogVVNCIEhVQiBDT05TVEFOVFMgKG5vdCBPSENJLXNwZWNpZmljOyBzZWUgaHViLmgpICovCisKKy8qIGRlc3RpbmF0aW9uIG9mIHJlcXVlc3QgKi8KKyNkZWZpbmUgUkhfSU5URVJGQUNFCQkgICAweDAxCisjZGVmaW5lIFJIX0VORFBPSU5UCQkgICAweDAyCisjZGVmaW5lIFJIX09USEVSCQkgICAweDAzCisKKyNkZWZpbmUgUkhfQ0xBU1MJCSAgIDB4MjAKKyNkZWZpbmUgUkhfVkVORE9SCQkgICAweDQwCisKKy8qIFJlcXVlc3RzOiBiUmVxdWVzdCA8PCA4IHwgYm1SZXF1ZXN0VHlwZSAqLworI2RlZmluZSBSSF9HRVRfU1RBVFVTCQkweDAwODAKKyNkZWZpbmUgUkhfQ0xFQVJfRkVBVFVSRQkweDAxMDAKKyNkZWZpbmUgUkhfU0VUX0ZFQVRVUkUJCTB4MDMwMAorI2RlZmluZSBSSF9TRVRfQUREUkVTUwkJMHgwNTAwCisjZGVmaW5lIFJIX0dFVF9ERVNDUklQVE9SCTB4MDY4MAorI2RlZmluZSBSSF9TRVRfREVTQ1JJUFRPUgkweDA3MDAKKyNkZWZpbmUgUkhfR0VUX0NPTkZJR1VSQVRJT04JMHgwODgwCisjZGVmaW5lIFJIX1NFVF9DT05GSUdVUkFUSU9OCTB4MDkwMAorI2RlZmluZSBSSF9HRVRfU1RBVEUJCTB4MDI4MAorI2RlZmluZSBSSF9HRVRfSU5URVJGQUNFCTB4MEE4MAorI2RlZmluZSBSSF9TRVRfSU5URVJGQUNFCTB4MEIwMAorI2RlZmluZSBSSF9TWU5DX0ZSQU1FCQkweDBDODAKKy8qIE91ciBWZW5kb3IgU3BlY2lmaWMgUmVxdWVzdCAqLworI2RlZmluZSBSSF9TRVRfRVAJCTB4MjAwMAorCisKKy8qIEh1YiBwb3J0IGZlYXR1cmVzICovCisjZGVmaW5lIFJIX1BPUlRfQ09OTkVDVElPTgkgICAweDAwCisjZGVmaW5lIFJIX1BPUlRfRU5BQkxFCQkgICAweDAxCisjZGVmaW5lIFJIX1BPUlRfU1VTUEVORAkJICAgMHgwMgorI2RlZmluZSBSSF9QT1JUX09WRVJfQ1VSUkVOVAkgICAweDAzCisjZGVmaW5lIFJIX1BPUlRfUkVTRVQJCSAgIDB4MDQKKyNkZWZpbmUgUkhfUE9SVF9QT1dFUgkJICAgMHgwOAorI2RlZmluZSBSSF9QT1JUX0xPV19TUEVFRAkgICAweDA5CisKKyNkZWZpbmUgUkhfQ19QT1JUX0NPTk5FQ1RJT04JICAgMHgxMAorI2RlZmluZSBSSF9DX1BPUlRfRU5BQkxFCSAgIDB4MTEKKyNkZWZpbmUgUkhfQ19QT1JUX1NVU1BFTkQJICAgMHgxMgorI2RlZmluZSBSSF9DX1BPUlRfT1ZFUl9DVVJSRU5UCSAgIDB4MTMKKyNkZWZpbmUgUkhfQ19QT1JUX1JFU0VUCQkgICAweDE0CisKKy8qIEh1YiBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9DX0hVQl9MT0NBTF9QT1dFUgkgICAweDAwCisjZGVmaW5lIFJIX0NfSFVCX09WRVJfQ1VSUkVOVAkgICAweDAxCisKKyNkZWZpbmUgUkhfREVWSUNFX1JFTU9URV9XQUtFVVAJICAgMHgwMAorI2RlZmluZSBSSF9FTkRQT0lOVF9TVEFMTAkgICAweDAxCisKKyNkZWZpbmUgUkhfQUNLCQkJICAgMHgwMQorI2RlZmluZSBSSF9SRVFfRVJSCQkgICAtMQorI2RlZmluZSBSSF9OQUNLCQkJICAgMHgwMAorCisKKy8qIE9IQ0kgUk9PVCBIVUIgUkVHSVNURVIgTUFTS1MgKi8KKworLyogcm9vdGh1Yi5wb3J0c3RhdHVzIFtpXSBiaXRzICovCisjZGVmaW5lIFJIX1BTX0NDUwkgICAgIDB4MDAwMDAwMDEJCS8qIGN1cnJlbnQgY29ubmVjdCBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfUFNfUEVTCSAgICAgMHgwMDAwMDAwMgkJLyogcG9ydCBlbmFibGUgc3RhdHVzKi8KKyNkZWZpbmUgUkhfUFNfUFNTCSAgICAgMHgwMDAwMDAwNAkJLyogcG9ydCBzdXNwZW5kIHN0YXR1cyAqLworI2RlZmluZSBSSF9QU19QT0NJCSAgICAgMHgwMDAwMDAwOAkJLyogcG9ydCBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yICovCisjZGVmaW5lIFJIX1BTX1BSUwkgICAgIDB4MDAwMDAwMTAJCS8qIHBvcnQgcmVzZXQgc3RhdHVzICovCisjZGVmaW5lIFJIX1BTX1BQUwkgICAgIDB4MDAwMDAxMDAJCS8qIHBvcnQgcG93ZXIgc3RhdHVzICovCisjZGVmaW5lIFJIX1BTX0xTREEJICAgICAweDAwMDAwMjAwCQkvKiBsb3cgc3BlZWQgZGV2aWNlIGF0dGFjaGVkICovCisjZGVmaW5lIFJIX1BTX0NTQwkgICAgIDB4MDAwMTAwMDAJCS8qIGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBSSF9QU19QRVNDCSAgICAgMHgwMDAyMDAwMAkJLyogcG9ydCBlbmFibGUgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBSSF9QU19QU1NDCSAgICAgMHgwMDA0MDAwMAkJLyogcG9ydCBzdXNwZW5kIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgUkhfUFNfT0NJQwkgICAgIDB4MDAwODAwMDAJCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgY2hhbmdlICovCisjZGVmaW5lIFJIX1BTX1BSU0MJICAgICAweDAwMTAwMDAwCQkvKiBwb3J0IHJlc2V0IHN0YXR1cyBjaGFuZ2UgKi8KKworLyogcm9vdGh1Yi5zdGF0dXMgYml0cyAqLworI2RlZmluZSBSSF9IU19MUFMJICAgICAweDAwMDAwMDAxCQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfSFNfT0NJCSAgICAgMHgwMDAwMDAwMgkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvciAqLworI2RlZmluZSBSSF9IU19EUldFCSAgICAgMHgwMDAwODAwMAkJLyogZGV2aWNlIHJlbW90ZSB3YWtldXAgZW5hYmxlICovCisjZGVmaW5lIFJIX0hTX0xQU0MJICAgICAweDAwMDEwMDAwCQkvKiBsb2NhbCBwb3dlciBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lIFJIX0hTX09DSUMJICAgICAweDAwMDIwMDAwCQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yIGNoYW5nZSAqLworI2RlZmluZSBSSF9IU19DUldFCSAgICAgMHg4MDAwMDAwMAkJLyogY2xlYXIgcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KKworLyogcm9vdGh1Yi5iIG1hc2tzICovCisjZGVmaW5lIFJIX0JfRFIJCTB4MDAwMGZmZmYJCS8qIGRldmljZSByZW1vdmFibGUgZmxhZ3MgKi8KKyNkZWZpbmUgUkhfQl9QUENNCTB4ZmZmZjAwMDAJCS8qIHBvcnQgcG93ZXIgY29udHJvbCBtYXNrICovCisKKy8qIHJvb3RodWIuYSBtYXNrcyAqLworI2RlZmluZSBSSF9BX05EUAkoMHhmZiA8PCAwKQkJLyogbnVtYmVyIG9mIGRvd25zdHJlYW0gcG9ydHMgKi8KKyNkZWZpbmUgUkhfQV9QU00JKDEgPDwgOCkJCS8qIHBvd2VyIHN3aXRjaGluZyBtb2RlICovCisjZGVmaW5lIFJIX0FfTlBTCSgxIDw8IDkpCQkvKiBubyBwb3dlciBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUgUkhfQV9EVAkJKDEgPDwgMTApCQkvKiBkZXZpY2UgdHlwZSAobWJ6KSAqLworI2RlZmluZSBSSF9BX09DUE0JKDEgPDwgMTEpCQkvKiBvdmVyIGN1cnJlbnQgcHJvdGVjdGlvbiBtb2RlICovCisjZGVmaW5lIFJIX0FfTk9DUAkoMSA8PCAxMikJCS8qIG5vIG92ZXIgY3VycmVudCBwcm90ZWN0aW9uICovCisjZGVmaW5lIFJIX0FfUE9UUEdUCSgweGZmIDw8IDI0KQkJLyogcG93ZXIgb24gdG8gcG93ZXIgZ29vZCB0aW1lICovCisKKy8qIHVyYiAqLworI2RlZmluZSBOX1VSQl9URCA0OAordHlwZWRlZiBzdHJ1Y3QKK3sKKwllZF90ICplZDsKKwlfX3UxNiBsZW5ndGg7CS8qIG51bWJlciBvZiB0ZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCAqLworCV9fdTE2IHRkX2NudDsJLyogbnVtYmVyIG9mIHRkcyBhbHJlYWR5IHNlcnZpY2VkICovCisJaW50ICAgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBwaXBlOworCWludCBhY3R1YWxfbGVuZ3RoOworCXRkX3QgKnRkW05fVVJCX1REXTsJLyogbGlzdCBwb2ludGVyIHRvIGFsbCBjb3JyZXNwb25kaW5nIFREcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0ICovCit9IHVyYl9wcml2X3Q7CisjZGVmaW5lIFVSQl9ERUwgMQorCisvKgorICogVGhpcyBpcyB0aGUgZnVsbCBvaGNpIGNvbnRyb2xsZXIgZGVzY3JpcHRpb24KKyAqCisgKiBOb3RlIGhvdyB0aGUgInByb3BlciIgVVNCIGluZm9ybWF0aW9uIGlzIGp1c3QKKyAqIGEgc3Vic2V0IG9mIHdoYXQgdGhlIGZ1bGwgaW1wbGVtZW50YXRpb24gbmVlZHMuIChMaW51cykKKyAqLworCisKK3R5cGVkZWYgc3RydWN0IG9oY2kgeworCXN0cnVjdCBvaGNpX2hjY2EgKmhjY2E7CQkvKiBoY2NhICovCisJLypkbWFfYWRkcl90IGhjY2FfZG1hOyovCisKKwlpbnQgaXJxOworCWludCBkaXNhYmxlZDsJCQkvKiBlLmcuIGdvdCBhIFVFLCB3ZSdyZSBodW5nICovCisJaW50IHNsZWVwaW5nOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBmb3IgSEMgYnVncyAqLworCisJc3RydWN0IG9oY2lfcmVncyAqcmVnczsgLyogT0hDSSBjb250cm9sbGVyJ3MgbWVtb3J5ICovCisKKwllZF90ICplZF9ybV9saXN0WzJdOwkgLyogbGlzdHMgb2YgYWxsIGVuZHBvaW50cyB0byBiZSByZW1vdmVkICovCisJZWRfdCAqZWRfYnVsa3RhaWw7CSAvKiBsYXN0IGVuZHBvaW50IG9mIGJ1bGsgbGlzdCAqLworCWVkX3QgKmVkX2NvbnRyb2x0YWlsOwkgLyogbGFzdCBlbmRwb2ludCBvZiBjb250cm9sIGxpc3QgKi8KKwlpbnQgaW50cnN0YXR1czsKKwlfX3UzMiBoY19jb250cm9sOwkJLyogY29weSBvZiB0aGUgaGMgY29udHJvbCByZWcgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2WzMyXTsKKwlzdHJ1Y3QgdmlydF9yb290X2h1YiByaDsKKworCWNvbnN0IGNoYXIJKnNsb3RfbmFtZTsKK30gb2hjaV90OworCisjZGVmaW5lIE5VTV9FRFMgOAkJLyogbnVtIG9mIHByZWFsbG9jYXRlZCBlbmRwb2ludCBkZXNjcmlwdG9ycyAqLworCitzdHJ1Y3Qgb2hjaV9kZXZpY2UgeworCWVkX3QJZWRbTlVNX0VEU107CisJaW50IGVkX2NudDsKK307CisKKy8qIGhjZCAqLworLyogZW5kcG9pbnQgKi8KK3N0YXRpYyBpbnQgZXBfbGluayhvaGNpX3QgKiBvaGNpLCBlZF90ICogZWQpOworc3RhdGljIGludCBlcF91bmxpbmsob2hjaV90ICogb2hjaSwgZWRfdCAqIGVkKTsKK3N0YXRpYyBlZF90ICogZXBfYWRkX2VkKHN0cnVjdCB1c2JfZGV2aWNlICogdXNiX2RldiwgdW5zaWduZWQgbG9uZyBwaXBlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogd2UgbmVlZCBtb3JlIFREcyB0aGFuIEVEcyAqLworI2RlZmluZSBOVU1fVEQgNjQKKworLyogKzEgc28gd2UgY2FuIGFsaWduIHRoZSBzdG9yYWdlICovCit0ZF90IGd0ZFtOVU1fVEQrMV07CisvKiBwb2ludGVycyB0byBhbGlnbmVkIHN0b3JhZ2UgKi8KK3RkX3QgKnB0ZDsKKworLyogVERzIC4uLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGQgKgordGRfYWxsb2MgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2KQoreworCWludCBpOworCXN0cnVjdCB0ZAkqdGQ7CisKKwl0ZCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IE5VTV9URDsgaSsrKQorCXsKKwkJaWYgKHB0ZFtpXS51c2JfZGV2ID09IE5VTEwpCisJCXsKKwkJCXRkID0gJnB0ZFtpXTsKKwkJCXRkLT51c2JfZGV2ID0gdXNiX2RldjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHRkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2VkX2ZyZWUgKHN0cnVjdCBlZCAqZWQpCit7CisJZWQtPnVzYl9kZXYgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZmFkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvTWFrZWZpbGUKQEAgLTAsMCArMSw1MCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitTT0JKUwk9IGlvLm8gZmVjX2RtYV90YXNrcy5vCitDT0JKUwk9IGNwdS5vIGNwdV9pbml0Lm8gZHJhbVNldHVwLm8gZmVjLm8gaTJjLm8gXAorCSAgaW50ZXJydXB0cy5vIGxvYWR0YXNrLm8gc3BlZWQubyBcCisJICB0cmFwcy5vIHVhcnQubyBwY2kubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9jb25maWcubWsgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MDY4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAzCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1tZWFiaQorCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19NUEM4MjIwIC1mZml4ZWQtcjIgXAorCQkgICAgIC1tc3RyaW5nIC1tY3B1PTYwM2UgLW1tdWx0aXBsZQorCisjIFVzZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICBCb2FyZCBwb3J0IGNhbiBvdmVycmlkZSBpbiBib2FyZC8qL2NvbmZpZy5taworTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvdS1ib290LmxkcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2NwdS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2NmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvY3B1LmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQ1BVIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBNUEM4MjIwIENQVXMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bXBjODIyMC5oPgorI2luY2x1ZGUgPG5ldGRldi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK2ludCBjaGVja2NwdSAodm9pZCkKK3sKKwl1bG9uZyBjbG9jayA9IGdkLT5jcHVfY2xrOworCWNoYXIgYnVmWzMyXTsKKworCXB1dHMgKCJDUFU6ICAgIik7CisKKwlwcmludGYgKENQVV9JRF9TVFIpOworCisJcHJpbnRmICgiIChKVEFHIElEICUwOGx4KSIsICoodnVfbG9uZyAqKSAoQ09ORklHX1NZU19NQkFSICsgMHg1MCkpOworCisJcHJpbnRmICgiIGF0ICVzIE1IelxuIiwgc3RybWh6IChidWYsIGNsb2NrKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgZG9fcmVzZXQgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl2b2xhdGlsZSBncHRtcjgyMjBfdCAqZ3B0bXIgPSAodm9sYXRpbGUgZ3B0bXI4MjIwX3QgKikgTU1BUF9HUFRNUjsKKwl1bG9uZyBtc3I7CisKKwkvKiBJbnRlcnJ1cHRzIGFuZCBNTVUgb2ZmICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZm1zciAgICAlMCI6Ij1yIiAobXNyKTopOworCisJbXNyICY9IH4oTVNSX01FIHwgTVNSX0VFIHwgTVNSX0lSIHwgTVNSX0RSKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm10bXNyICAgICUwIjo6InIiIChtc3IpKTsKKworCS8qIENoYXJnZSB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KKwlncHRtci0+UHJlc2NsID0gMTA7CisJZ3B0bXItPkNvdW50ID0gMTsKKworCWdwdG1yLT5Nb2RlID0gR1BUX1RNU19TR1BJTzsKKworCWdwdG1yLT5Db250cm9sID0gR1BUX0NUUkxfV0RFTiB8IEdQVF9DVFJMX0NFOworCisJcmV0dXJuIDE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEdldCB0aW1lYmFzZSBjbG9jayBmcmVxdWVuY3kgKGxpa2UgY3B1X2NsayBpbiBIeikKKyAqCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RiY2xrICh2b2lkKQoreworCXVsb25nIHRiY2xrOworCisJdGJjbGsgPSAoZ2QtPmJ1c19jbGsgKyAzTCkgLyA0TDsKKworCXJldHVybiAodGJjbGspOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBJbml0aWFsaXplcyBvbi1jaGlwIGV0aGVybmV0IGNvbnRyb2xsZXJzLgorICogdG8gb3ZlcnJpZGUsIGltcGxlbWVudCBib2FyZF9ldGhfaW5pdCgpCisgKi8KK2ludCBjcHVfZXRoX2luaXQoYmRfdCAqYmlzKQoreworI2lmIGRlZmluZWQoQ09ORklHX01QQzgyMjBfRkVDKQorCW1wYzgyMjBfZmVjX2luaXRpYWxpemUoYmlzKTsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2NwdV9pbml0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvY3B1X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjUyYzdkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2NwdV9pbml0LmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODIyMC5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworLyoKKyAqIEJyZWF0aCBzb21lIGxpZmUgaW50byB0aGUgQ1BVLi4uCisgKgorICogU2V0IHVwIHRoZSBtZW1vcnkgbWFwLAorICogaW5pdGlhbGl6ZSBhIGJ1bmNoIG9mIHJlZ2lzdGVycy4KKyAqLwordm9pZCBjcHVfaW5pdF9mICh2b2lkKQoreworCXZvbGF0aWxlIGZsZXhidXM4MjIwX3QgKmZsZXhidXMgPSAodm9sYXRpbGUgZmxleGJ1czgyMjBfdCAqKSBNTUFQX0ZCOworCXZvbGF0aWxlIHBjZmc4MjIwX3QgKnBvcnRjZmcgPSAodm9sYXRpbGUgcGNmZzgyMjBfdCAqKSBNTUFQX1BDRkc7CisJdm9sYXRpbGUgeGxiYXJiODIyMF90ICp4bGJhcmIgPSAodm9sYXRpbGUgeGxiYXJiODIyMF90ICopIE1NQVBfWExCQVJCOworCisJLyogUG9pbnRlciBpcyB3cml0YWJsZSBzaW5jZSB3ZSBhbGxvY2F0ZWQgYSByZWdpc3RlciBmb3IgaXQgKi8KKwlnZCA9IChnZF90ICopIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgKyBDT05GSUdfU1lTX0dCTF9EQVRBX09GRlNFVCk7CisKKwkvKiBDbGVhciBpbml0aWFsIGdsb2JhbCBkYXRhICovCisJbWVtc2V0ICgodm9pZCAqKSBnZCwgMCwgc2l6ZW9mIChnZF90KSk7CisKKwkvKiBDbGVhciBhbGwgcG9ydCBjb25maWd1cmF0aW9uICovCisJcG9ydGNmZy0+cGNmZzAgPSAwOworCXBvcnRjZmctPnBjZmcxID0gMDsKKwlwb3J0Y2ZnLT5wY2ZnMiA9IDA7CisJcG9ydGNmZy0+cGNmZzMgPSAwOworCXBvcnRjZmctPnBjZmcyID0gQ09ORklHX1NZU19HUDFfUE9SVDJfQ09ORklHOworCXBvcnRjZmctPnBjZmczID0gQ09ORklHX1NZU19QQ0lfUE9SVDNfQ09ORklHIHwgQ09ORklHX1NZU19HUDJfUE9SVDNfQ09ORklHOworCisJLyoKKwkgKiBGbGV4YnVzIENvbnRyb2xsZXI6IGNvbmZpZ3VyZSBjaGlwIHNlbGVjdHMgYW5kIGVuYWJsZSB0aGVtCisJICovCisjaWYgZGVmaW5lZCAoQ09ORklHX1NZU19DUzBfQkFTRSkKKwlmbGV4YnVzLT5jc2FyMCA9IENPTkZJR19TWVNfQ1MwX0JBU0U7CisKKy8qIFNvcmNlcnktQyBjYW4gaGFuZy11cCBhZnRlciBDVFJMIHJlZyBpbml0aWFsaXphdGlvbiAqLworI2lmIGRlZmluZWQgKENPTkZJR19TWVNfQ1MwX0NUUkwpCisJZmxleGJ1cy0+Y3NjcjAgPSBDT05GSUdfU1lTX0NTMF9DVFJMOworI2VuZGlmCisJZmxleGJ1cy0+Y3NtcjAgPSAoKENPTkZJR19TWVNfQ1MwX01BU0sgLSAxKSAmIDB4ZmZmZjAwMDApIHwgMTsKKwlfX2FzbV9fIHZvbGF0aWxlICgic3luYyIpOworI2VuZGlmCisjaWYgZGVmaW5lZCAoQ09ORklHX1NZU19DUzFfQkFTRSkKKwlmbGV4YnVzLT5jc2FyMSA9IENPTkZJR19TWVNfQ1MxX0JBU0U7CisJZmxleGJ1cy0+Y3NjcjEgPSBDT05GSUdfU1lTX0NTMV9DVFJMOworCWZsZXhidXMtPmNzbXIxID0gKChDT05GSUdfU1lTX0NTMV9NQVNLIC0gMSkgJiAweGZmZmYwMDAwKSB8IDE7CisJX19hc21fXyB2b2xhdGlsZSAoInN5bmMiKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKENPTkZJR19TWVNfQ1MyX0JBU0UpCisJZmxleGJ1cy0+Y3NhcjIgPSBDT05GSUdfU1lTX0NTMl9CQVNFOworCWZsZXhidXMtPmNzY3IyID0gQ09ORklHX1NZU19DUzJfQ1RSTDsKKwlmbGV4YnVzLT5jc21yMiA9ICgoQ09ORklHX1NZU19DUzJfTUFTSyAtIDEpICYgMHhmZmZmMDAwMCkgfCAxOworCXBvcnRjZmctPnBjZmczIHw9IENPTkZJR19TWVNfQ1MyX1BPUlQzX0NPTkZJRzsKKwlfX2FzbV9fIHZvbGF0aWxlICgic3luYyIpOworI2VuZGlmCisjaWYgZGVmaW5lZCAoQ09ORklHX1NZU19DUzNfQkFTRSkKKwlmbGV4YnVzLT5jc2FyMyA9IENPTkZJR19TWVNfQ1MzX0JBU0U7CisJZmxleGJ1cy0+Y3NjcjMgPSBDT05GSUdfU1lTX0NTM19DVFJMOworCWZsZXhidXMtPmNzbXIzID0gKChDT05GSUdfU1lTX0NTM19NQVNLIC0gMSkgJiAweGZmZmYwMDAwKSB8IDE7CisJcG9ydGNmZy0+cGNmZzMgfD0gQ09ORklHX1NZU19DUzNfUE9SVDNfQ09ORklHOworCV9fYXNtX18gdm9sYXRpbGUgKCJzeW5jIik7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChDT05GSUdfU1lTX0NTNF9CQVNFKQorCWZsZXhidXMtPmNzYXI0ID0gQ09ORklHX1NZU19DUzRfQkFTRTsKKwlmbGV4YnVzLT5jc2NyNCA9IENPTkZJR19TWVNfQ1M0X0NUUkw7CisJZmxleGJ1cy0+Y3NtcjQgPSAoKENPTkZJR19TWVNfQ1M0X01BU0sgLSAxKSAmIDB4ZmZmZjAwMDApIHwgMTsKKwlwb3J0Y2ZnLT5wY2ZnMyB8PSBDT05GSUdfU1lTX0NTNF9QT1JUM19DT05GSUc7CisJX19hc21fXyB2b2xhdGlsZSAoInN5bmMiKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKENPTkZJR19TWVNfQ1M1X0JBU0UpCisJZmxleGJ1cy0+Y3NhcjUgPSBDT05GSUdfU1lTX0NTNV9CQVNFOworCWZsZXhidXMtPmNzY3I1ID0gQ09ORklHX1NZU19DUzVfQ1RSTDsKKwlmbGV4YnVzLT5jc21yNSA9ICgoQ09ORklHX1NZU19DUzVfTUFTSyAtIDEpICYgMHhmZmZmMDAwMCkgfCAxOworCXBvcnRjZmctPnBjZmczIHw9IENPTkZJR19TWVNfQ1M1X1BPUlQzX0NPTkZJRzsKKwlfX2FzbV9fIHZvbGF0aWxlICgic3luYyIpOworI2VuZGlmCisKKwkvKiBUaGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUgY2Fubm90IHBsYWNlIGluIGNwdV9pbml0X3IoKSwKKwkgICBpdCB3aWxsIGNhdXNlIHRoZSBzeXN0ZW0gdG8gaGFuZyAqLworCS8qIGVuYWJsZSB0aW1lYmFzZSAqLworCXhsYmFyYi0+YWRkclRlblRpbWVPdXQgPSAweDEwMDA7CisJeGxiYXJiLT5kYXRhVGVuVGltZU91dCA9IDB4MTAwMDsKKwl4bGJhcmItPmJ1c0FjdFRpbWVPdXQgPSAweDIwMDA7CisKKwl4bGJhcmItPmNvbmZpZyA9IDB4MDAwMDIwMDA7CisKKwkvKiBNYXN0ZXIgUHJpb3JpdHkgRW5hYmxlICovCisJeGxiYXJiLT5tYXN0UHJpb3JpdHkgPSAwOworCXhsYmFyYi0+bWFzdFByaUVuID0gMHhmZjsKK30KKworLyoKKyAqIGluaXRpYWxpemUgaGlnaGVyIGxldmVsIHBhcnRzIG9mIENQVSBsaWtlIHRpbWUgYmFzZSBhbmQgdGltZXJzCisgKi8KK2ludCBjcHVfaW5pdF9yICh2b2lkKQoreworCS8qIHRoaXMgbWF5IGJlbG9uZ3MgdG8gZGlzYWJsZSBpbnRlcnJ1cHQgc2VjdGlvbiAqLworCS8qIG1hc2sgYWxsIGludGVycnVwdHMgKi8KKwkqKHZ1X2xvbmcgKikgMHhmMDAwMDcwMCA9IDB4ZmZmZmZjMDA7CisJKih2dV9sb25nICopIDB4ZjAwMDA3MTQgfD0gMHgwMDAxZmZmZjsKKwkqKHZ1X2xvbmcgKikgMHhmMDAwMDcxMCAmPSB+MHgwMDAwMGYwMDsKKworCS8qIHJvdXRlIGNyaXRpY2FsIGludHMgdG8gbm9ybWFsIGludHMgKi8KKwkqKHZ1X2xvbmcgKikgMHhmMDAwMDcxMCB8PSAweDAwMDAwMDAxOworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTVBDODIyMF9GRUMpCisJLyogbG9hZCBGRUMgbWljcm9jb2RlICovCisJbG9hZHRhc2sgKDAsIDIpOworI2VuZGlmCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9kbWEuaCBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDZlZTYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2RtYS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGNvZGUKKyAqIChDKSBDb3B5cmlnaHQgTW90b3JvbGEsIEluYy4sIDIwMDAKKyAqCisgKiBNUEM4MjIwIGRtYSBoZWFkZXIgZmlsZQorICovCisKKyNpZm5kZWYgX19NUEM4MjIwX0RNQV9ICisjZGVmaW5lIF9fTVBDODIyMF9ETUFfSAorCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODIyMC5oPgorCisvKiBUYXNrIG51bWJlciBhc3NpZ25tZW50ICovCisjZGVmaW5lIEZFQ19SRUNWX1RBU0tfTk8gICAgICAgICAgICAwCisjZGVmaW5lIEZFQ19YTUlUX1RBU0tfTk8gICAgICAgICAgICAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdHVmZiBmb3IgRXRoZXJuZXQgVHgvUnggdGFza3MKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogTGF5b3V0IG9mIEV0aGVybmV0IGNvbnRyb2xsZXIgUGFyYW1ldGVyIFNSQU0gYXJlYToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIDB4MDA6IFRCRF9CQVNFLCBiYXNlIGFkZHJlc3Mgb2YgVFggQkQgcmluZworICogMHgwNDogVEJEX05FWFQsIGFkZHJlc3Mgb2YgbmV4dCBUWCBCRCB0byBiZSBwcm9jZXNzZWQKKyAqIDB4MDg6IFJCRF9CQVNFLCBiYXNlIGFkZHJlc3Mgb2YgUlggQkQgcmluZworICogMHgwQzogUkJEX05FWFQsIGFkZHJlc3Mgb2YgbmV4dCBSWCBCRCB0byBiZSBwcm9jZXNzZWQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQUxMIFBBUkFNRVRFUlMgQVJFIEFMTCBMT05HV09SRFMgKEZPVVIgQllURVMgRUFDSCkuCisgKi8KKworLyogYmFzZSBhZGRyZXNzIG9mIFNSQU0gYXJlYSB0byBzdG9yZSBwYXJhbWV0ZXJzIHVzZWQgYnkgRXRoZXJuZXQgdGFza3MgKi8KKyNkZWZpbmUgRkVDX1BBUkFNX0JBU0UgIChNTUFQX1NSQU0gKyAweDViMDApCisKKy8qIGJhc2UgYWRkcmVzcyBvZiBTUkFNIGFyZWEgZm9yIGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBGRUNfQkRfQkFTRSAgICAgKE1NQVBfU1JBTSArIDB4NWIyMCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNvbW1vbiBzaG9ydGN1dHMgIHVzZWQgIGJ5IGRyaXZlciBDIGNvZGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogRGlzYWJsZSBTbWFydERNQSB0YXNrICovCisjZGVmaW5lIERNQV9UQVNLX0RJU0FCTEUodGFza251bSkJCQkJCQlcCit7CQkJCQkJCQkJCVwKKwl2b2xhdGlsZSB1c2hvcnQgKnRjciA9ICh1c2hvcnQgKikoTU1BUF9ETUEgKyAweDAwMDAwMDFjICsgMiAqIHRhc2tudW0pOyBcCisJKnRjciA9ICgqdGNyKSAmICh+MHg4MDAwKTsJCQkJCQlcCit9CisKKy8qIEVuYWJsZSBTbWFydERNQSB0YXNrICovCisjZGVmaW5lIERNQV9UQVNLX0VOQUJMRSh0YXNrbnVtKQkJCQkJCVwKK3sJCQkJCQkJCQkJXAorCXZvbGF0aWxlIHVzaG9ydCAqdGNyID0gKHVzaG9ydCAqKSAoTU1BUF9ETUEgKyAweDAwMDAwMDFjICsgMiAqIHRhc2tudW0pO1wKKwkqdGNyID0gKCp0Y3IpICB8IDB4ODAwMDsJCQkJCQlcCit9CisKKy8qIENsZWFyIGludGVycnVwdCBwZW5kaW5nIGJpdHMgKi8KKyNkZWZpbmUgRE1BX0NMRUFSX0lFVkVOVCh0YXNrbnVtKQkJCQkJCVwKK3sJCQkJCQkJCQkJXAorCXN0cnVjdCBtcGM4MjIwX2RtYSAqZG1hID0gKHN0cnVjdCBtcGM4MjIwX2RtYSAqKU1NQVBfRE1BOwkJXAorCWRtYS0+SW50UGVuZCA9ICgxIDw8IHRhc2tudW0pOwkJCQkJCVwKK30KKworI2VuZGlmICAvKiBfX01QQzgyMjBfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9kcmFtU2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9kcmFtU2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmNmMTMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2RyYW1TZXR1cC5jCkBAIC0wLDAgKzEsNzUyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0LCBGcmVlc2NhbGUsIEluYworICogVHNpQ2h1bmcgTGlldywgVHNpLUNodW5nLkxpZXdAZnJlZXNjYWxlLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCitERVNDUklQVElPTgorUmVhZCBEcmFtIHNwZCBhbmQgYmFzZSBvbiBpdHMgaW5mb3JtYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBtZW1vcnkgc2l6ZSwKK2NoYXJhY3RlcmlzdGljcyB0byBpbml0aWFsaXplIHRoZSBkcmFtIG9uIE1QQzgyMjAKKyovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4MjIwLmg+CisjaW5jbHVkZSAiaTJjQ29yZS5oIgorI2luY2x1ZGUgImRyYW1TZXR1cC5oIgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2RlZmluZSBTUERfU0laRQlDT05GSUdfU1lTX1NEUkFNX1NQRF9TSVpFCisjZGVmaW5lIERSQU1fU1BECShDT05GSUdfU1lTX1NEUkFNX1NQRF9JMkNfQUREUik8PDEJLyogb24gQm9hcmQgU1BEIGVlcHJvbSAqLworI2RlZmluZSBUT1RBTF9CQU5LCUNPTkZJR19TWVNfU0RSQU1fVE9UQUxfQkFOS1MKKworaW50IHNwZF9zdGF0dXMgKHZvbGF0aWxlIGkyYzgyMjBfdCAqIHBpMmMsIHU4IHN0YV9iaXQsIHU4IHRydWVmYWxzZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBJMkNfUE9MTF9DT1VOVDsgaSsrKSB7CisJCWlmICgocGkyYy0+c3IgJiBzdGFfYml0KSA9PSAodHJ1ZWZhbHNlID8gc3RhX2JpdCA6IDApKQorCQkJcmV0dXJuIChPSyk7CisJfQorCisJcmV0dXJuIChFUlJPUik7Cit9CisKK2ludCBzcGRfY2xlYXIgKHZvbGF0aWxlIGkyYzgyMjBfdCAqIHBpMmMpCit7CisJcGkyYy0+YWRyID0gMDsKKwlwaTJjLT5mZHIgPSAwOworCXBpMmMtPmNyID0gMDsKKwlwaTJjLT5zciA9IDA7CisKKwlyZXR1cm4gKE9LKTsKK30KKworaW50IHNwZF9zdG9wICh2b2xhdGlsZSBpMmM4MjIwX3QgKiBwaTJjKQoreworCXBpMmMtPmNyICY9IH5JMkNfQ1RMX1NUQTsJLyogR2VuZXJhdGUgc3RvcCBzaWduYWwgICAgICAgICAqLworCWlmIChzcGRfc3RhdHVzIChwaTJjLCBJMkNfU1RBX0JCLCAwKSAhPSBPSykKKwkJcmV0dXJuIEVSUk9SOworCisJcmV0dXJuIChPSyk7Cit9CisKK2ludCBzcGRfcmVhZGJ5dGUgKHZvbGF0aWxlIGkyYzgyMjBfdCAqIHBpMmMsIHU4ICogcmVhZGIsIGludCAqaW5kZXgpCit7CisJcGkyYy0+c3IgJj0gfkkyQ19TVEFfSUY7CS8qIENsZWFyIEludGVycnVwdCBCaXQgICAgICAgICAgKi8KKwkqcmVhZGIgPSBwaTJjLT5kcjsJLyogUmVhZCBhIGJ5dGUgICAgICAgICAgICAgICAgICAqLworCisJLyoKKwkgICBTZXQgSTJDX0NUUkxfVFhBSyB3aWxsIGNhdXNlIFRyYW5zZmVyIHBlbmRpbmcgYW5kCisJICAgc2V0IEkyQ19DVFJMX1NUQSB3aWxsIGNhdXNlIEludGVycnVwdCBwZW5kaW5nCisJICovCisJaWYgKCppbmRleCAhPSAyKSB7CisJCWlmIChzcGRfc3RhdHVzIChwaTJjLCBJMkNfU1RBX0NGLCAxKSAhPSBPSykJLyogVHJhbnNmZXIgbm90IGNvbXBsZXRlPyAgICAgICAqLworCQkJcmV0dXJuIEVSUk9SOworCX0KKworCWlmICgqaW5kZXggIT0gMSkgeworCQlpZiAoc3BkX3N0YXR1cyAocGkyYywgSTJDX1NUQV9JRiwgMSkgIT0gT0spCisJCQlyZXR1cm4gRVJST1I7CisJfQorCisJcmV0dXJuIChPSyk7Cit9CisKK2ludCByZWFkU3BkRGF0YSAodTggKiBzcGREYXRhKQoreworCXZvbGF0aWxlIGkyYzgyMjBfdCAqcGkyY1JlZzsKKwl2b2xhdGlsZSBwY2ZnODIyMF90ICpwY2ZnOworCXU4IHNsdkFkciA9IERSQU1fU1BEOworCXU4IFRtcDsKKwlpbnQgTGVuZ3RoID0gU1BEX1NJWkU7CisJaW50IGkgPSAwOworCisJLyogRW5hYmxlIFBvcnQgQ29uZmlndXJhdGlvbiBmb3IgU0RBIGFuZCBTREwgc2lnbmFscyAqLworCXBjZmcgPSAodm9sYXRpbGUgcGNmZzgyMjBfdCAqKSAoTU1BUF9QQ0ZHKTsKKwlfX2FzbV9fICgic3luYyIpOworCXBjZmctPnBjZmczICY9IH5DT05GSUdfU1lTX0kyQ19QT1JUM19DT05GSUc7CisJX19hc21fXyAoInN5bmMiKTsKKworCS8qIFBvaW50cyB0aGUgc3RydWN0dXJlIHRvIEkyYyBtYmFyIG1lbW9yeSBvZmZzZXQgKi8KKwlwaTJjUmVnID0gKHZvbGF0aWxlIGkyYzgyMjBfdCAqKSAoTU1BUF9JMkMpOworCisKKwkvKiBDbGVhciBGRFIsIEFEUiwgU1IgYW5kIENSIHJlZyAqLworCXBpMmNSZWctPmFkciA9IDA7CisJcGkyY1JlZy0+ZmRyID0gMDsKKwlwaTJjUmVnLT5jciA9IDA7CisJcGkyY1JlZy0+c3IgPSAwOworCisJLyogU2V0IGZvciBmaXggWExCIEJ1cyBGcmVxdWVuY3kgKi8KKwlzd2l0Y2ggKGdkLT5idXNfY2xrKSB7CisJY2FzZSA2MDAwMDAwMDoKKwkJcGkyY1JlZy0+ZmRyID0gMHgxNTsKKwkJYnJlYWs7CisJY2FzZSA3MDAwMDAwMDoKKwkJcGkyY1JlZy0+ZmRyID0gMHgxNjsKKwkJYnJlYWs7CisJY2FzZSA4MDAwMDAwMDoKKwkJcGkyY1JlZy0+ZmRyID0gMHgzYTsKKwkJYnJlYWs7CisJY2FzZSA5MDAwMDAwMDoKKwkJcGkyY1JlZy0+ZmRyID0gMHgxNzsKKwkJYnJlYWs7CisJY2FzZSAxMDAwMDAwMDA6CisJCXBpMmNSZWctPmZkciA9IDB4M2I7CisJCWJyZWFrOworCWNhc2UgMTEwMDAwMDAwOgorCQlwaTJjUmVnLT5mZHIgPSAweDE4OworCQlicmVhazsKKwljYXNlIDEyMDAwMDAwMDoKKwkJcGkyY1JlZy0+ZmRyID0gMHgxOTsKKwkJYnJlYWs7CisJY2FzZSAxMzAwMDAwMDA6CisJCXBpMmNSZWctPmZkciA9IDB4MWE7CisJCWJyZWFrOworCX0KKworCXBpMmNSZWctPmFkciA9IENPTkZJR19TWVNfSTJDX1NMQVZFPDwxOworCisJcGkyY1JlZy0+Y3IgPSBJMkNfQ1RMX0VOOwkvKiBTZXQgRW5hYmxlICAgICAgICAgKi8KKworCS8qCisJICAgVGhlIEkyQyBidXMgc2hvdWxkIGJlIGluIElkbGUgc3RhdGUuIElmIHRoZSBidXMgaXMgYnVzeSwKKwkgICBjbGVhciB0aGUgU1RBIGJpdCBpbiBjb250cm9sIHJlZ2lzdGVyCisJICovCisJaWYgKHNwZF9zdGF0dXMgKHBpMmNSZWcsIEkyQ19TVEFfQkIsIDApICE9IE9LKSB7CisJCWlmICgocGkyY1JlZy0+Y3IgJiBJMkNfQ1RMX1NUQSkgPT0gSTJDX0NUTF9TVEEpCisJCQlwaTJjUmVnLT5jciAmPSB+STJDX0NUTF9TVEE7CisKKwkJLyogQ2hlY2sgYWdhaW4gaWYgaXQgaXMgc3RpbGwgYnVzeSwgcmV0dXJuIGVycm9yIGlmIGZvdW5kICovCisJCWlmIChzcGRfc3RhdHVzIChwaTJjUmVnLCBJMkNfU1RBX0JCLCAxKSA9PSBPSykKKwkJCXJldHVybiBFUlJPUjsKKwl9CisKKwlwaTJjUmVnLT5jciB8PSBJMkNfQ1RMX1RYOwkvKiBFbmFibGUgdGhlIEkyYyBmb3IgVFgsIEFjayAgICovCisJcGkyY1JlZy0+Y3IgfD0gSTJDX0NUTF9TVEE7CS8qIEdlbmVyYXRlIHN0YXJ0IHNpZ25hbCAgICAgICAgKi8KKworCWlmIChzcGRfc3RhdHVzIChwaTJjUmVnLCBJMkNfU1RBX0JCLCAxKSAhPSBPSykKKwkJcmV0dXJuIEVSUk9SOworCisKKwkvKiBXcml0ZSBzbGF2ZSBhZGRyZXNzICovCisJcGkyY1JlZy0+c3IgJj0gfkkyQ19TVEFfSUY7CS8qIENsZWFyIEludGVycnVwdCAgICAgICAgICAgICAgKi8KKwlwaTJjUmVnLT5kciA9IHNsdkFkcjsJLyogV3JpdGUgYSBieXRlICAgICAgICAgICAgICAgICAqLworCisJaWYgKHNwZF9zdGF0dXMgKHBpMmNSZWcsIEkyQ19TVEFfQ0YsIDEpICE9IE9LKSB7CS8qIFRyYW5zZmVyIG5vdCBjb21wbGV0ZT8gICAgICAgKi8KKwkJc3BkX3N0b3AgKHBpMmNSZWcpOworCQlyZXR1cm4gRVJST1I7CisJfQorCisJaWYgKHNwZF9zdGF0dXMgKHBpMmNSZWcsIEkyQ19TVEFfSUYsIDEpICE9IE9LKSB7CisJCXNwZF9zdG9wIChwaTJjUmVnKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCisJLyogSXNzdWUgdGhlIG9mZnNldCB0byBzdGFydCAqLworCXBpMmNSZWctPnNyICY9IH5JMkNfU1RBX0lGOwkvKiBDbGVhciBJbnRlcnJ1cHQgICAgICAgICAgICAgICovCisJcGkyY1JlZy0+ZHIgPSAwOwkvKiBXcml0ZSBhIGJ5dGUgICAgICAgICAgICAgICAgICovCisKKwlpZiAoc3BkX3N0YXR1cyAocGkyY1JlZywgSTJDX1NUQV9DRiwgMSkgIT0gT0spIHsJLyogVHJhbnNmZXIgbm90IGNvbXBsZXRlPyAgICAgICAqLworCQlzcGRfc3RvcCAocGkyY1JlZyk7CisJCXJldHVybiBFUlJPUjsKKwl9CisKKwlpZiAoc3BkX3N0YXR1cyAocGkyY1JlZywgSTJDX1NUQV9JRiwgMSkgIT0gT0spIHsKKwkJc3BkX3N0b3AgKHBpMmNSZWcpOworCQlyZXR1cm4gRVJST1I7CisJfQorCisKKwkvKiBTZXQgcmVwZWF0IHN0YXJ0ICovCisJcGkyY1JlZy0+Y3IgfD0gSTJDX0NUTF9SU1RBOwkvKiBSZXBlYXQgU3RhcnQgICAgICAgICAgICAgICAgICovCisKKwlwaTJjUmVnLT5zciAmPSB+STJDX1NUQV9JRjsJLyogQ2xlYXIgSW50ZXJydXB0ICAgICAgICAgICAgICAqLworCXBpMmNSZWctPmRyID0gc2x2QWRyIHwgMTsJLyogV3JpdGUgYSBieXRlICAgICAgICAgICAgICAgICAqLworCisJaWYgKHNwZF9zdGF0dXMgKHBpMmNSZWcsIEkyQ19TVEFfQ0YsIDEpICE9IE9LKSB7CS8qIFRyYW5zZmVyIG5vdCBjb21wbGV0ZT8gICAgICAgKi8KKwkJc3BkX3N0b3AgKHBpMmNSZWcpOworCQlyZXR1cm4gRVJST1I7CisJfQorCisJaWYgKHNwZF9zdGF0dXMgKHBpMmNSZWcsIEkyQ19TVEFfSUYsIDEpICE9IE9LKSB7CisJCXNwZF9zdG9wIChwaTJjUmVnKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCWlmICgoKHBpMmNSZWctPnNyICYgMHgwNykgPT0gMHgwNykgfHwgKHBpMmNSZWctPnNyICYgMHgwMSkpCisJCXJldHVybiBFUlJPUjsKKworCXBpMmNSZWctPmNyICY9IH5JMkNfQ1RMX1RYOwkvKiBTZXQgcmVjZWl2ZSBtb2RlICAgICAgICAgICAgICovCisKKwlpZiAoKChwaTJjUmVnLT5zciAmIDB4MDcpID09IDB4MDcpIHx8IChwaTJjUmVnLT5zciAmIDB4MDEpKQorCQlyZXR1cm4gRVJST1I7CisKKwkvKiBEdW1teSBSZWFkICovCisJaWYgKHNwZF9yZWFkYnl0ZSAocGkyY1JlZywgJlRtcCwgJmkpICE9IE9LKSB7CisJCXNwZF9zdG9wIChwaTJjUmVnKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCWkgPSAwOworCXdoaWxlIChMZW5ndGgpIHsKKwkJaWYgKExlbmd0aCA9PSAyKQorCQkJcGkyY1JlZy0+Y3IgfD0gSTJDX0NUTF9UWEFLOworCisJCWlmIChMZW5ndGggPT0gMSkKKwkJCXBpMmNSZWctPmNyICY9IH5JMkNfQ1RMX1NUQTsKKworCQlpZiAoc3BkX3JlYWRieXRlIChwaTJjUmVnLCBzcGREYXRhLCAmTGVuZ3RoKSAhPSBPSykgeworCQkJcmV0dXJuIHNwZF9zdG9wIChwaTJjUmVnKTsKKwkJfQorCQlpKys7CisJCUxlbmd0aC0tOworCQlzcGREYXRhKys7CisJfQorCisJLyogU3RvcCB0aGUgc2VydmljZSAqLworCXNwZF9zdG9wIChwaTJjUmVnKTsKKworCXJldHVybiBPSzsKK30KKworaW50IGdldEJhbmtJbmZvIChpbnQgYmFuaywgZHJhbWluZm9fdCAqIHBCYW5rKQoreworCWludCBzdGF0dXM7CisJaW50IGNoZWNrc3VtOworCWludCBjb3VudDsKKwl1OCBzcGREYXRhW1NQRF9TSVpFXTsKKworCisJaWYgKGJhbmsgPiAyIHx8IHBCYW5rID09IDApIHsKKwkJLyogaWxsZWdhbCB2YWx1ZXMgKi8KKwkJcmV0dXJuICgtNDIpOworCX0KKworCXN0YXR1cyA9IHJlYWRTcGREYXRhICgmc3BkRGF0YVswXSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiAoLTEpOworCisJLyogY2hlY2sgdGhlIGNoZWNrc3VtICovCisJZm9yIChjb3VudCA9IDAsIGNoZWNrc3VtID0gMDsgY291bnQgPCBMT0NfQ0hFQ0tTVU07IGNvdW50KyspCisJCWNoZWNrc3VtICs9IHNwZERhdGFbY291bnRdOworCisJY2hlY2tzdW0gPSBjaGVja3N1bSAtICgoY2hlY2tzdW0gLyAyNTYpICogMjU2KTsKKworCWlmIChjaGVja3N1bSAhPSBzcGREYXRhW0xPQ19DSEVDS1NVTV0pCisJCXJldHVybiAoLTIpOworCisJLyogR2V0IHRoZSBtZW1vcnkgdHlwZSAqLworCWlmICghCisJICAgICgoc3BkRGF0YVtMT0NfVFlQRV0gPT0gVFlQRV9ERFIpCisJICAgICB8fCAoc3BkRGF0YVtMT0NfVFlQRV0gPT0gVFlQRV9TRFIpKSkKKwkJLyogbm90IG9uZSBvZiB0aGUgdHlwZXMgd2Ugc3VwcG9ydCAqLworCQlyZXR1cm4gKC0zKTsKKworCXBCYW5rLT50eXBlID0gc3BkRGF0YVtMT0NfVFlQRV07CisKKwkvKiBTZXQgbG9naWNhbCBiYW5rcyAqLworCXBCYW5rLT5iYW5rcyA9IHNwZERhdGFbTE9DX0xPR0lDQUxfQkFOS1NdOworCisJLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGVub3VnaCBwaHlzaWNhbCBiYW5rcyB0byBjb3ZlciB0aGUgYmFuayB3ZSBhcmUKKwkgKiBmaWd1cmluZyBvdXQuICBPZGQtbnVtYmVyZWQgYmFua3MgY29ycmVzcG9uZCB0byB0aGUgc2Vjb25kIGJhbmsKKwkgKiBvbiB0aGUgZGV2aWNlLgorCSAqLworCWlmIChiYW5rICYgMSkgeworCQkvKiBTZWNvbmQgYmFuayBvZiBhICJkZXZpY2UiICovCisJCWlmIChzcGREYXRhW0xPQ19QSFlTX0JBTktTXSA8IDIpCisJCQkvKiB0aGlzIGJhbmsgZG9lc24ndCBleGlzdCBvbiB0aGUgImRldmljZSIgKi8KKwkJCXJldHVybiAoLTQpOworCisJCWlmIChzcGREYXRhW0xPQ19ST1dTXSAmIDB4ZjApCisJCQkvKiBUd28gYXN5bW1ldHJpYyBiYW5rcyAqLworCQkJcEJhbmstPnJvd3MgPSBzcGREYXRhW0xPQ19ST1dTXSA+PiA0OworCQllbHNlCisJCQlwQmFuay0+cm93cyA9IHNwZERhdGFbTE9DX1JPV1NdOworCisJCWlmIChzcGREYXRhW0xPQ19DT0xTXSAmIDB4ZjApCisJCQkvKiBUd28gYXN5bW1ldHJpYyBiYW5rcyAqLworCQkJcEJhbmstPmNvbHMgPSBzcGREYXRhW0xPQ19DT0xTXSA+PiA0OworCQllbHNlCisJCQlwQmFuay0+Y29scyA9IHNwZERhdGFbTE9DX0NPTFNdOworCX0gZWxzZSB7CisJCS8qIEZpcnN0IGJhbmsgb2YgYSAiZGV2aWNlIiAqLworCQlwQmFuay0+cm93cyA9IHNwZERhdGFbTE9DX1JPV1NdOworCQlwQmFuay0+Y29scyA9IHNwZERhdGFbTE9DX0NPTFNdOworCX0KKworCXBCYW5rLT53aWR0aCA9IHNwZERhdGFbTE9DX1dJRFRIX0hJR0hdIDw8IDggfCBzcGREYXRhW0xPQ19XSURUSF9MT1ddOworCXBCYW5rLT5idXJzdHMgPSBzcGREYXRhW0xPQ19CVVJTVFNdOworCXBCYW5rLT5DQVMgPSBzcGREYXRhW0xPQ19DQVNdOworCXBCYW5rLT5DUyA9IHNwZERhdGFbTE9DX0NTXTsKKwlwQmFuay0+V0UgPSBzcGREYXRhW0xPQ19XRV07CisJcEJhbmstPlRycCA9IHNwZERhdGFbTE9DX1RycF07CisJcEJhbmstPlRyY2QgPSBzcGREYXRhW0xPQ19UcmNkXTsKKwlwQmFuay0+YnVmZmVyZWQgPSBzcGREYXRhW0xPQ19CdWZmZXJlZF0gJiAxOworCXBCYW5rLT5yZWZyZXNoID0gc3BkRGF0YVtMT0NfUkVGUkVTSF07CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qIGNoZWNrTXV4U2V0dGluZyAtLSBnaXZlbiBhIHJvdy9jb2x1bW4gZGV2aWNlIGdlb21ldHJ5LCByZXR1cm4gYSBtYXNrCisgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHZhbGlkIERSQU0gY29udHJvbGxlciBhZGRyX211eCBzZXR0aW5ncyBmb3IKKyAqICAgICAgICAgICAgICAgICAgICB0aGF0IGdlb21ldHJ5LgorICoKKyAqICBBcmd1bWVudHM6ICAgICAgICB1OCByb3dzOiAgICAgbnVtYmVyIG9mIHJvdyBhZGRyZXNzZXMgaW4gdGhpcyBkZXZpY2UKKyAqICAgICAgICAgICAgICAgICAgICB1OCBjb2x1bW5zOiAgbnVtYmVyIG9mIGNvbHVtbiBhZGRyZXNzZXMgaW4gdGhpcyBkZXZpY2UKKyAqCisgKiAgUmV0dXJuczogICAgICAgICAgYSBtYXNrIG9mIHRoZSBhbGxvd2VkIGFkZHJfbXV4IHNldHRpbmdzIGZvciB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuICBFYWNoIGJpdCBpbiB0aGUgbWFzayByZXByZXNlbnRzIGEKKyAqICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBhZGRyX211eCBzZXR0aW5ncyAoZm9yIGV4YW1wbGUsIHRoZQorICogICAgICAgICAgICAgICAgICAgICgxPDwyKSBiaXQgaW4gdGhlIG1hc2sgcmVwcmVzZW50cyB0aGUgMGIxMCBzZXR0aW5nKS8KKyAqCisgKi8KK3U4IGNoZWNrTXV4U2V0dGluZyAodTggcm93cywgdTggY29sdW1ucykKK3sKKwltdXhkZXNjX3QgKnBJZHgsICpwTXV4OworCXU4IG1hc2s7CisJaW50IGxyb3dzLCBsY29sdW1uczsKKwl1MzIgbXV4WzRdID0geyAweDAwMDgwYzA0LCAweDAxMDgwZDAzLCAweDAyMDgwZTAyLCAweGZmZmZmZmZmIH07CisKKwkvKiBTZXR1cCBNdXhEZXNjcmlwdG9yIGluIFNSQU0gc3BhY2UgKi8KKwkvKiBNVVhERVNDIEFkZHJlc3NSdW5zIFtdID0geworCSAgIHsgMCwgOCwgMTIsIDQgfSwgICAgICAgICAvIHNldHRpbmcsIGNvbHVtbnMsIHJvd3MsIGV4dHJhIGNvbHVtbnMgLworCSAgIHsgMSwgOCwgMTMsIDMgfSwgICAgICAgICAvIHNldHRpbmcsIGNvbHVtbnMsIHJvd3MsIGV4dHJhIGNvbHVtbnMgLworCSAgIHsgMiwgOCwgMTQsIDIgfSwgICAgICAgICAvIHNldHRpbmcsIGNvbHVtbnMsIHJvd3MsIGV4dHJhIGNvbHVtbnMgLworCSAgIHsgMHhmZiB9ICAgICAgICAgICAgICAgICAvIGxpc3QgdGVybWluYXRvciAvCisJICAgfTsgKi8KKworCXBJZHggPSAobXV4ZGVzY190ICopICYgbXV4WzBdOworCisJLyogQ2hlY2sgcm93cyB4IGNvbHVtbnMgYWdhaW5zdCBlYWNoIHBvc3NpYmxlIGFkZHJlc3MgbXV4IHNldHRpbmcgKi8KKwlmb3IgKHBNdXggPSBwSWR4LCBtYXNrID0gMDs7IHBNdXgrKykgeworCQlscm93cyA9IHJvd3M7CisJCWxjb2x1bW5zID0gY29sdW1uczsKKworCQlpZiAocE11eC0+TXV4VmFsdWUgPT0gMHhmZikKKwkJCWJyZWFrOwkvKiBlbmQgb2YgbGlzdCAqLworCisJCS8qIEZvciBhIGdpdmVuIG11eCBzZXR0aW5nLCBzaW5jZSB3ZSB3YW50IGFsbCB0aGUgbWVtb3J5IGluIGEKKwkJICogZGV2aWNlIHRvIGJlIGNvbnRpZ3VvdXMsIHdlIHdhbnQgdGhlIGRldmljZSAidXNlIHVwIiB0aGUKKwkJICogYWRkcmVzcyBsaW5lcyBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIGV4dHJhIGNvbHVtbiBvciByb3cKKwkJICogYWRkcmVzcyBsaW5lcyBvbiB0aGUgZGV2aWNlLgorCQkgKi8KKworCQlsY29sdW1ucyAtPSBwTXV4LT5Db2x1bW5zOworCQlpZiAobGNvbHVtbnMgPCAwKQorCQkJLyogTm90IGVub3VnaCBjb2x1bW5zIHRvIGdldCB0byB0aGUgcm93cyAqLworCQkJY29udGludWU7CisKKwkJbHJvd3MgLT0gcE11eC0+Um93czsKKwkJaWYgKGxyb3dzID4gMCkKKwkJCS8qIHdlIGhhdmUgZXh0cmEgcm93cyBsZWZ0IC0tIGNhbid0IGRvIHRoYXQhICovCisJCQljb250aW51ZTsKKworCQkvKiBBdCB0aGlzIHBvaW50LCB3ZSBlaXRoZXIgaGF2ZSB0byBoYXZlIHVzZWQgdXAgYWxsIHRoZQorCQkgKiByb3dzIG9yIHdlIGhhdmUgdG8gaGF2ZSBubyBjb2x1bW5zIGxlZnQuCisJCSAqLworCisJCWlmIChsY29sdW1ucyAhPSAwICYmIGxyb3dzICE9IDApCisJCQkvKiByb3dzIEFORCBjb2x1bW5zIGFyZSBsZWZ0LiAgQmFkISAqLworCQkJY29udGludWU7CisKKwkJbGNvbHVtbnMgLT0gcE11eC0+TW9yZUNvbHVtbnM7CisKKwkJaWYgKGxjb2x1bW5zIDw9IDApCisJCQltYXNrIHw9ICgxIDw8IHBNdXgtPk11eFZhbHVlKTsKKwl9CisKKwlyZXR1cm4gKG1hc2spOworfQorCisKK3UzMiBkcmFtU2V0dXAgKHZvaWQpCit7CisJZHJhbWluZm9fdCBEcmFtSW5mb1tUT1RBTF9CQU5LXTsKKwlkcmFtaW5mb190ICpwRHJhbUluZm87CisJdTMyIHNpemUsIHRlbXAsIGNmZ192YWx1ZSwgbW9kZV92YWx1ZSwgcmVmcmVzaDsKKwl1OCAqcHRyOworCXU4IGJ1cnN0cywgVHJwLCBUcmNkLCB0eXBlLCBidWZmZXJlZDsKKwl1OCBtdXhtYXNrLCByb3dzLCBjb2x1bW5zOworCWludCBjb3VudCwgYmFua251bTsKKwl1MzIgKnByZWZyZXNoLCAqcElkeDsKKwl1MzIgcmVmcmF0ZVs4XSA9IHsgMTU2MjUsIDM5MDAsIDc4MDAsIDMxMzAwLAorCQk2MjUwMCwgMTI1MDAwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmCisJfTsKKwl2b2xhdGlsZSBzeXNjb25mODIyMF90ICpzeXNjb25mOworCXZvbGF0aWxlIG1lbWN0bDgyMjBfdCAqbWVtY3RsOworCisJc3lzY29uZiA9ICh2b2xhdGlsZSBzeXNjb25mODIyMF90ICopIE1NQVBfTUJBUjsKKwltZW1jdGwgPSAodm9sYXRpbGUgbWVtY3RsODIyMF90ICopIE1NQVBfTUVNQ1RMOworCisJLyogU2V0IGV2ZXJ5dGhpbmcgaW4gdGhlIGRlc2NyaXB0aW9ucyB0byB6ZXJvICovCisJcHRyID0gKHU4ICopICYgRHJhbUluZm9bMF07CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2l6ZW9mIChEcmFtSW5mbyk7IGNvdW50KyspCisJCSpwdHIrKyA9IDA7CisKKwlmb3IgKGJhbmtudW0gPSAwOyBiYW5rbnVtIDwgVE9UQUxfQkFOSzsgYmFua251bSsrKQorCQlzeXNjb25mLT5jc2NmZ1tiYW5rbnVtXTsKKworCS8qIERlc2NyaXB0aW9ucyBvZiByb3cvY29sdW1uIGFkZHJlc3MgbXV4aW5nIGZvciB2YXJpb3VzCisJICogYWRkcl9tdXggc2V0dGluZ3MuCisJICovCisKKwlwSWR4ID0gcHJlZnJlc2ggPSAodTMyICopICYgcmVmcmF0ZVswXTsKKworCS8qIEdldCBhbGwgdGhlIGluZm8gZm9yIGFsbCB0aHJlZSBsb2dpY2FsIGJhbmtzICovCisJYnVyc3RzID0gMHhmZjsKKwlUcnAgPSAwOworCVRyY2QgPSAwOworCXR5cGUgPSAwOworCWJ1ZmZlcmVkID0gMHhmZjsKKwlyZWZyZXNoID0gMHhmZmZmZmZmZjsKKwltdXhtYXNrID0gMHhmZjsKKworCS8qIFR3byBiYW5rLCBDUzAgYW5kIENTMSAqLworCWZvciAoYmFua251bSA9IDAsIHBEcmFtSW5mbyA9ICZEcmFtSW5mb1swXTsKKwkgICAgIGJhbmtudW0gPCBUT1RBTF9CQU5LOyBiYW5rbnVtKyssIHBEcmFtSW5mbysrKSB7CisJCXBEcmFtSW5mby0+b3JkaW5hbCA9IGJhbmtudW07CS8qIGluaXRpYWwgc29ydGluZyAqLworCQlpZiAoZ2V0QmFua0luZm8gKGJhbmtudW0sIHBEcmFtSW5mbykgPCAwKQorCQkJY29udGludWU7CisKKwkJLyogZ2V0IGN1bXVsYXRpdmUgcGFyYW1ldGVycyBvZiBhbGwgdGhyZWUgYmFua3MgKi8KKwkJaWYgKHR5cGUgJiYgcERyYW1JbmZvLT50eXBlICE9IHR5cGUpCisJCQlyZXR1cm4gMDsKKworCQl0eXBlID0gcERyYW1JbmZvLT50eXBlOworCQlyb3dzID0gcERyYW1JbmZvLT5yb3dzOworCQljb2x1bW5zID0gcERyYW1JbmZvLT5jb2xzOworCisJCS8qIFRoaXMgY2hpcCBvbmx5IHN1cHBvcnRzIDEzIERSQU0gbWVtb3J5IGxpbmVzLCBidXQgc29tZSBkZXZpY2VzCisJCSAqIGhhdmUgMTQgcm93cy4gIFRvIGRlYWwgd2l0aCB0aGlzLCBpZ25vcmUgdGhlIDE0dGggYWRkcmVzcyBsaW5lCisJCSAqIGJ5IGxpbWl0aW5nIHRoZSBudW1iZXIgb2Ygcm93cyAoYW5kIGNvbHVtbnMpIHRvIDEzLiAgVGhpcyB3aWxsCisJCSAqIG1lYW4gdGhhdCBmb3IgMTQtcm93IGRldmljZXMgd2Ugd2lsbCBvbmx5IGJlIGFibGUgdG8gdXNlCisJCSAqIGhhbGYgb2YgdGhlIG1lbW9yeSwgYnV0IGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZy4KKwkJICovCisJCWlmIChyb3dzID4gMTMpCisJCQlyb3dzID0gMTM7CisJCWlmIChjb2x1bW5zID4gMTMpCisJCQljb2x1bW5zID0gMTM7CisKKwkJcERyYW1JbmZvLT5zaXplID0KKwkJCSgoMSA8PCAocm93cyArIGNvbHVtbnMpKSAqIHBEcmFtSW5mby0+d2lkdGgpOworCQlwRHJhbUluZm8tPnNpemUgKj0gcERyYW1JbmZvLT5iYW5rczsKKwkJcERyYW1JbmZvLT5zaXplID4+PSAzOworCisJCS8qIGZpZ3VyZSBvdXQgd2hpY2ggYWRkcl9tdXggY29uZmlndXJhdGlvbnMgd2lsbCBzdXBwb3J0IHRoaXMgZGV2aWNlICovCisJCW11eG1hc2sgJj0gY2hlY2tNdXhTZXR0aW5nIChyb3dzLCBjb2x1bW5zKTsKKwkJaWYgKG11eG1hc2sgPT0gMCkKKwkJCXJldHVybiAwOworCisJCWJ1ZmZlcmVkID0gcERyYW1JbmZvLT5idWZmZXJlZDsKKwkJYnVyc3RzICY9IHBEcmFtSW5mby0+YnVyc3RzOwkvKiB1bmlvbiBvZiBhbGwgYnVyc3RzICovCisJCWlmIChwRHJhbUluZm8tPlRycCA+IFRycCkJLyogd29yc3QgY2FzZSAobG9uZ2VzdCkgVHJwICovCisJCQlUcnAgPSBwRHJhbUluZm8tPlRycDsKKworCQlpZiAocERyYW1JbmZvLT5UcmNkID4gVHJjZCkJLyogd29yc3QgY2FzZSAobG9uZ2VzdCkgVHJjZCAqLworCQkJVHJjZCA9IHBEcmFtSW5mby0+VHJjZDsKKworCQlwcmVmcmVzaCA9IHBJZHg7CisJCS8qIHdvcnN0IGNhc2UgKHNob3J0ZXN0KSBSZWZyZXNoIHBlcmlvZCAqLworCQlpZiAocmVmcmVzaCA+IHByZWZyZXNoW3BEcmFtSW5mby0+cmVmcmVzaCAmIDddKQorCQkJcmVmcmVzaCA9IHByZWZyZXNoW3BEcmFtSW5mby0+cmVmcmVzaCAmIDddOworCisJfQkJCS8qIGZvciBsb29wICovCisKKworCS8qIFdlIG9ubHkgYWxsb3cgYSBidXJzdCBsZW5ndGggb2YgOCEgKi8KKwlpZiAoIShidXJzdHMgJiA4KSkKKwkJYnVyc3RzID0gODsKKworCS8qIFNvcnQgdGhlIGRldmljZXMuICBJbiBvcmRlciB0byBnZXQgZWFjaCBjaGlwIHNlbGVjdCByZWdpb24KKwkgKiBhbGlnbmVkIHByb3Blcmx5LCBwdXQgdGhlIGJpZ2dlc3QgZGV2aWNlIGF0IHRoZSBsb3dlc3QgYWRkcmVzcy4KKwkgKiBBIHNpbXBsZSBidWJibGUgc29ydCB3aWxsIGRvIHRoZSB0cmljay4KKwkgKi8KKwlmb3IgKGJhbmtudW0gPSAwLCBwRHJhbUluZm8gPSAmRHJhbUluZm9bMF07CisJICAgICBiYW5rbnVtIDwgVE9UQUxfQkFOSzsgYmFua251bSsrLCBwRHJhbUluZm8rKykgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgVE9UQUxfQkFOSzsgaSsrKSB7CisJCQlpZiAocERyYW1JbmZvLT5zaXplIDwgRHJhbUluZm9baV0uc2l6ZSAmJgorCQkJICAgIHBEcmFtSW5mby0+b3JkaW5hbCA8IERyYW1JbmZvW2ldLm9yZGluYWwpIHsKKwkJCQkvKiBJZiB0aGUgY3VycmVudCBiYW5rIGlzIHNtYWxsZXIsIGJ1dCBpZiB0aGUgb3JkaW5hbCBpcyBhbHNvCisJCQkJICogc21hbGxlciwgc3dhcCB0aGUgb3JkaW5hbHMKKwkJCQkgKi8KKwkJCQl1OCB0ZW1wODsKKworCQkJCXRlbXA4ID0gRHJhbUluZm9baV0ub3JkaW5hbDsKKwkJCQlEcmFtSW5mb1tpXS5vcmRpbmFsID0gcERyYW1JbmZvLT5vcmRpbmFsOworCQkJCXBEcmFtSW5mby0+b3JkaW5hbCA9IHRlbXA4OworCQkJfQorCQl9CisJfQorCisKKwkvKiBOb3cgZmlndXJlIG91dCB0aGUgYmFzZSBhZGRyZXNzIGZvciBlYWNoIGJhbmsuICBXaGlsZQorCSAqIHdlJ3JlIGF0IGl0LCBmaWd1cmUgb3V0IGhvdyBtdWNoIG1lbW9yeSB0aGVyZSBpcy4KKwkgKgorCSAqLworCXNpemUgPSAwOworCWZvciAoYmFua251bSA9IDA7IGJhbmtudW0gPCBUT1RBTF9CQU5LOyBiYW5rbnVtKyspIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IFRPVEFMX0JBTks7IGkrKykgeworCQkJaWYgKERyYW1JbmZvW2ldLm9yZGluYWwgPT0gYmFua251bQorCQkJICAgICYmIERyYW1JbmZvW2ldLnNpemUgIT0gMCkgeworCQkJCURyYW1JbmZvW2ldLmJhc2UgPSBzaXplOworCQkJCXNpemUgKz0gRHJhbUluZm9baV0uc2l6ZTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNldCB1cCB0aGUgRHJpdmUgU3RyZW5ndGggcmVnaXN0ZXIgKi8KKwlzeXNjb25mLT5zZHJhbWRzID0gQ09ORklHX1NZU19TRFJBTV9EUklWRV9TVFJFTkdUSDsKKworCS8qICoqKioqKioqKioqKioqKioqKioqKiogQ2ZnIDEgKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisJLyogU2V0IHRoZSBzaW5nbGUgcmVhZCB0byByZWFkL3dyaXRlL3ByZWNoYXJnZSBkZWxheSAqLworCWNmZ192YWx1ZSA9IENGRzFfU1JEMlJXUCAoKHR5cGUgPT0gVFlQRV9ERFIpID8gNyA6IDB4Yik7CisKKwkvKiBTZXQgdGhlIHNpbmdsZSB3cml0ZSB0byByZWFkL3dyaXRlL3ByZWNoYXJnZSBkZWxheS4KKwkgKiBUaGlzIG1heSBvciBtYXkgbm90IGJlIGNvcnJlY3QuICBUaGUgY29udHJvbGxlciBzcGVjCisJICogc2F5cyAidFdSIiwgYnV0ICJ0V1IiIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgU1BELiAgSXQKKwkgKiBhbHdheXMgc2VlbXMgdG8gYmUgMTVuc2VjIGZvciB0aGUgY2xhc3Mgb2YgZGV2aWNlIHdlJ3JlCisJICogdXNpbmcsIHdoaWNoIHR1cm5zIG91dCB0byBiZSAyIGNsb2NrIGN5Y2xlcyBhdCAxMzNNSHosCisJICogc28gdGhhdCdzIHdoYXQgd2UncmUgZ29pbmcgdG8gdXNlLgorCSAqCisJICogSE9XRVZFUiwgYmVjYXVzZSBvZiBhIGJ1ZyBpbiB0aGUgY29udHJvbGxlciwgZm9yIEREUgorCSAqIHdlIG5lZWQgdG8gc2V0IHRoaXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHZhbHVlCisJICogY2FsY3VsYXRlZCBmb3IgYnd0MnJ3cC4KKwkgKi8KKwljZmdfdmFsdWUgfD0gQ0ZHMV9TV1QyUldQICgodHlwZSA9PSBUWVBFX0REUikgPyA3IDogMik7CisKKwkvKiBTZXQgdGhlIFJlYWQgQ0FTIGxhdGVuY3kuICBXZSdyZSBnb2luZyB0byB1c2UgYSBDTCBvZgorCSAqIDIuNSBmb3IgRERSIGFuZCAyIFNEUi4KKwkgKi8KKwljZmdfdmFsdWUgfD0gQ0ZHMV9STEFURU5DWSAoKHR5cGUgPT0gVFlQRV9ERFIpID8gNyA6IDIpOworCisKKwkvKiBTZXQgdGhlIEFjdGl2ZSB0byBSZWFkL1dyaXRlIGRlbGF5LiAgVGhpcyBkZXBlbmRzCisJICogb24gVHJjZCB3aGljaCBpcyByZXBvcnRlZCBhcyBuYW5vc2Vjb25kcyB0aW1lcyA0LgorCSAqIFdlIHdhbnQgdG8gY2FsY3VsYXRlIFRyY2QgKGluIG5hbm9zZWNvbmRzKSB0aW1lcyBYTEIgY2xvY2sgKGluIEh6KQorCSAqIHdoaWNoIGdpdmVzIHVzIGEgZGltZW5zaW9ubGVzcyBxdWFudGl0eS4gIFBsYXkgZ2FtZXMgd2l0aAorCSAqIHRoZSBkaXZpc2lvbnMgc28gd2UgZG9uJ3QgcnVuIG91dCBvZiBkeW5hbWljIHJhbmdlcy4KKwkgKi8KKwkvKiBhY2NvdW50IGZvciBtZWdhaGVyeiBhbmQgdGhlIHRpbWVzIDQgKi8KKwl0ZW1wID0gKFRyY2QgKiAoZ2QtPmJ1c19jbGsgLyAxMDAwMDAwKSkgLyA0OworCisJLyogYWNjb3VudCBmb3IgbmFub3NlY29uZHMgYW5kIHJvdW5kIHVwLCB3aXRoIGEgbWluaW11bSB2YWx1ZSBvZiAyICovCisJdGVtcCA9ICgodGVtcCArIDk5OSkgLyAxMDAwKSAtIDE7CisJaWYgKHRlbXAgPCAyKQorCQl0ZW1wID0gMjsKKworCWNmZ192YWx1ZSB8PSBDRkcxX0FDVDJXUiAodGVtcCk7CisKKwkvKiBTZXQgdGhlIHByZWNoYXJnZSB0byBhY3RpdmUgZGVsYXkuICBUaGlzIGRlcGVuZHMKKwkgKiBvbiBUcnAgd2hpY2ggaXMgcmVwb3J0ZWQgYXMgbmFub3NlY29uZHMgdGltZXMgNC4KKwkgKiBXZSB3YW50IHRvIGNhbGN1bGF0ZSBUcnAgKGluIG5hbm9zZWNvbmRzKSB0aW1lcyBYTEIgY2xvY2sgKGluIEh6KQorCSAqIHdoaWNoIGdpdmVzIHVzIGEgZGltZW5zaW9ubGVzcyBxdWFudGl0eS4gIFBsYXkgZ2FtZXMgd2l0aAorCSAqIHRoZSBkaXZpc2lvbnMgc28gd2UgZG9uJ3QgcnVuIG91dCBvZiBkeW5hbWljIHJhbmdlcy4KKwkgKi8KKwkvKiBhY2NvdW50IGZvciBtZWdhaGVyeiBhbmQgdGhlIHRpbWVzIDQgKi8KKwl0ZW1wID0gKFRycCAqIChnZC0+YnVzX2NsayAvIDEwMDAwMDApKSAvIDQ7CisKKwkvKiBhY2NvdW50IGZvciBuYW5vc2Vjb25kcyBhbmQgcm91bmQgdXAsIHRoZW4gc3VidHJhY3QgMSwgd2l0aCBhCisJICogbWludW11bSB2YWx1ZSBvZiAxIGFuZCBhIG1heGltdW0gdmFsdWUgb2YgNy4KKwkgKi8KKwl0ZW1wID0gKCgodGVtcCArIDk5OSkgLyAxMDAwKSAtIDEpICYgNzsKKwlpZiAodGVtcCA8IDEpCisJCXRlbXAgPSAxOworCisJY2ZnX3ZhbHVlIHw9IENGRzFfUFJFMkFDVCAodGVtcCk7CisKKwkvKiBTZXQgcmVmcmVzaCB0byBhY3RpdmUgZGVsYXkuICBUaGlzIGRlcGVuZHMKKwkgKiBvbiBUcmZjIHdoaWNoIGlzIG5vdCByZXBvcnRlZCBpbiB0aGUgU1BELgorCSAqIFdlJ2xsIHVzZSBhIG5vbWluYWwgdmFsdWUgb2YgNzVuc2VjIHdoaWNoIGlzCisJICogd2hhdCB0aGUgY29udHJvbGxlciBzcGVjIHVzZXMuCisJICovCisJdGVtcCA9ICg3NSAqIChnZC0+YnVzX2NsayAvIDEwMDAwMDApKTsKKwkvKiBhY2NvdW50IGZvciBuYW5vc2Vjb25kcyBhbmQgcm91bmQgdXAsIHRoZW4gc3VidHJhY3QgMSAqLworCWNmZ192YWx1ZSB8PSBDRkcxX1JFRjJBQ1QgKCgodGVtcCArIDk5OSkgLyAxMDAwKSAtIDEpOworCisJLyogU2V0IHRoZSB3cml0ZSBsYXRlbmN5LCB1c2luZyB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBjb250cm9sbGVyIHNwZWMgKi8KKwljZmdfdmFsdWUgfD0gQ0ZHMV9XTEFURU5DWSAoKHR5cGUgPT0gVFlQRV9ERFIpID8gMyA6IDApOworCW1lbWN0bC0+Y2ZnMSA9IGNmZ192YWx1ZTsJLyogY2ZnIDEgKi8KKwlhc20gdm9sYXRpbGUgKCJzeW5jIik7CisKKworCS8qICoqKioqKioqKioqKioqKioqKioqKiogQ2ZnIDIgKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisJLyogU2V0IHRoZSBidXJzdCByZWFkIHRvIHJlYWQvcHJlY2hhcmdlIGRlbGF5ICovCisJY2ZnX3ZhbHVlID0gQ0ZHMl9CUkQyUlAgKCh0eXBlID09IFRZUEVfRERSKSA/IDUgOiA4KTsKKworCS8qIFNldCB0aGUgYnVyc3Qgd3JpdGUgdG8gcmVhZC9wcmVjaGFyZ2UgZGVsYXkuICBTZW1pLW1hZ2ljIG51bWJlcnMKKwkgKiBiYXNlZCBvbiB0aGUgY29udHJvbGxlciBzcGVjIHJlY29tbWVuZGF0aW9ucywgYXNzdW1pbmcgdFdSIGlzCisJICogdHdvIGNsb2NrIGN5Y2xlcy4KKwkgKi8KKwljZmdfdmFsdWUgfD0gQ0ZHMl9CV1QyUldQICgodHlwZSA9PSBUWVBFX0REUikgPyA3IDogMTApOworCisJLyogU2V0IHRoZSBCdXJzdCByZWFkIHRvIHdyaXRlIGRlbGF5LiAgU2VtaS1tYWdpYyBudW1iZXJzCisJICogYmFzZWQgb24gdGhlIERSQU0gY29udHJvbGxlciBkb2N1bWVudGF0aW9uLgorCSAqLworCWNmZ192YWx1ZSB8PSBDRkcyX0JSRDJXVCAoKHR5cGUgPT0gVFlQRV9ERFIpID8gNyA6IDB4Yik7CisKKwkvKiBTZXQgdGhlIGJ1cnN0IGxlbmd0aCAtLSBtdXN0IGJlIDghISBXZWxsLCA3LCBhY3R1YWxseSwgYmVjdWFzZQorCSAqIGl0J3MgYnVyc3QgbGVuZ2h0IG1pbnVzIDEuCisJICovCisJY2ZnX3ZhbHVlIHw9IENGRzJfQlVSU1RMRU4gKDcpOworCW1lbWN0bC0+Y2ZnMiA9IGNmZ192YWx1ZTsJLyogY2ZnIDIgKi8KKwlhc20gdm9sYXRpbGUgKCJzeW5jIik7CisKKworCS8qICoqKioqKioqKioqKioqKioqKioqKiogbW9kZSAqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKwkvKiBTZXQgZW5hYmxlIGJpdCwgQ0tFIGhpZ2gvbG93IGJpdHMsIGFuZCB0aGUgRERSL1NEUiBtb2RlIGJpdCwKKwkgKiBkaXNhYmxlIGF1dG9tYXRpYyByZWZyZXNoLgorCSAqLworCWNmZ192YWx1ZSA9IENUTF9NT0RFX0VOQUJMRSB8IENUTF9DS0VfSElHSCB8CisJCSgodHlwZSA9PSBUWVBFX0REUikgPyBDVExfRERSX01PREUgOiAwKTsKKworCS8qIFNldCB0aGUgYWRkcmVzcyBtdXggYmFzZWQgb24gd2hpY2hldmVyIHNldHRpbmcocykgaXMvYXJlIGNvbW1vbgorCSAqIHRvIGFsbCB0aGUgZGV2aWNlcyB3ZSBoYXZlLiAgSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSwgY2hvb3NlCisJICogb25lIGFyYml0cmFyaWx5LgorCSAqLworCWlmIChtdXhtYXNrICYgMHg0KQorCQljZmdfdmFsdWUgfD0gQ1RMX0FERFJNVVggKDIpOworCWVsc2UgaWYgKG11eG1hc2sgJiAweDIpCisJCWNmZ192YWx1ZSB8PSBDVExfQUREUk1VWCAoMSk7CisJZWxzZQorCQljZmdfdmFsdWUgfD0gQ1RMX0FERFJNVVggKDApOworCisJLyogU2V0IHRoZSByZWZyZXNoIGludGVydmFsLiAqLworCXRlbXAgPSAoKHJlZnJlc2ggKiAoZ2QtPmJ1c19jbGsgLyAxMDAwMDAwKSkgLyAoMTAwMCAqIDY0KSkgLSAxOworCWNmZ192YWx1ZSB8PSBDVExfUkVGUkVTSF9JTlRFUlZBTCAodGVtcCk7CisKKwkvKiBTZXQgYnVmZmVyZWQvbm9uLWJ1ZmZlcmVkIG1lbW9yeSAqLworCWlmIChidWZmZXJlZCkKKwkJY2ZnX3ZhbHVlIHw9IENUTF9CVUZGRVJFRDsKKworCW1lbWN0bC0+Y3RybCA9IGNmZ192YWx1ZTsJLyogY3RybCAqLworCWFzbSB2b2xhdGlsZSAoInN5bmMiKTsKKworCWlmICh0eXBlID09IFRZUEVfRERSKSB7CisJCS8qIGlzc3VlIHByZWNoYXJnZSBhbGwgKi8KKwkJdGVtcCA9IGNmZ192YWx1ZSB8IENUTF9QUkVDSEFSR0VfQ01EOworCQltZW1jdGwtPmN0cmwgPSB0ZW1wOwkvKiBjdHJsICovCisJCWFzbSB2b2xhdGlsZSAoInN5bmMiKTsKKwl9CisKKworCS8qIFNldCB1cCBtb2RlIHZhbHVlIGZvciBDQVMgbGF0ZW5jeSAqLworI2lmIChDT05GSUdfU1lTX1NEUkFNX0NBU19MQVRFTkNZPT01KSAvKiBDTD0yLjUgKi8KKwltb2RlX3ZhbHVlID0gKE1PREVfTU9ERSB8IE1PREVfQlVSU1RMRU4gKE1PREVfQlVSU1RMRU5fOCkgfAorCQlNT0RFX0JUX1NFUVVFTlRJQUwgfCBNT0RFX0NMIChNT0RFX0NMXzJwNSkgfCBNT0RFX0NNRCk7CisjZWxzZQorCW1vZGVfdmFsdWUgPSAoTU9ERV9NT0RFIHwgTU9ERV9CVVJTVExFTiAoTU9ERV9CVVJTVExFTl84KSB8CisJCSAgICAgIE1PREVfQlRfU0VRVUVOVElBTCB8IE1PREVfQ0wgKE1PREVfQ0xfMikgfCBNT0RFX0NNRCk7CisjZW5kaWYKKwlhc20gdm9sYXRpbGUgKCJzeW5jIik7CisKKwkvKiBXcml0ZSBFeHRlbmRlZCBNb2RlICAtIGVuYWJsZSBETEwgKi8KKwlpZiAodHlwZSA9PSBUWVBFX0REUikgeworCQl0ZW1wID0gTU9ERV9FWFRFTkRFRCB8IE1PREVfWF9ETExfRU5BQkxFIHwKKwkJCU1PREVfWF9EU19OT1JNQUwgfCBNT0RFX0NNRDsKKwkJbWVtY3RsLT5tb2RlID0gKHRlbXAgPj4gMTYpOwkvKiBtb2RlICovCisJCWFzbSB2b2xhdGlsZSAoInN5bmMiKTsKKworCQkvKiBXcml0ZSBNb2RlIC0gcmVzZXQgRExMLCBzZXQgQ0FTIGxhdGVuY3kgKi8KKwkJdGVtcCA9IG1vZGVfdmFsdWUgfCBNT0RFX09QTU9ERSAoTU9ERV9PUE1PREVfUkVTRVRETEwpOworCQltZW1jdGwtPm1vZGUgPSAodGVtcCA+PiAxNik7CS8qIG1vZGUgKi8KKwkJYXNtIHZvbGF0aWxlICgic3luYyIpOworCX0KKworCS8qIFByb2dyYW0gdGhlIGNoaXAgc2VsZWN0cy4gKi8KKwlmb3IgKGJhbmtudW0gPSAwOyBiYW5rbnVtIDwgVE9UQUxfQkFOSzsgYmFua251bSsrKSB7CisJCWlmIChEcmFtSW5mb1tiYW5rbnVtXS5zaXplICE9IDApIHsKKwkJCXUzMiBtYXNrOworCQkJaW50IGk7CisKKwkJCWZvciAoaSA9IDAsIG1hc2sgPSAxOyBpIDwgMzI7IG1hc2sgPDw9IDEsIGkrKykgeworCQkJCWlmIChEcmFtSW5mb1tiYW5rbnVtXS5zaXplICYgbWFzaykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl0ZW1wID0gKERyYW1JbmZvW2JhbmtudW1dLmJhc2UgJiAweGZmZjAwMDAwKSB8IChpIC0KKwkJCQkJCQkJCTEpOworCisJCQlzeXNjb25mLT5jc2NmZ1tiYW5rbnVtXSA9IHRlbXA7CisJCQlhc20gdm9sYXRpbGUgKCJzeW5jIik7CisJCX0KKwl9CisKKwkvKiBXYWl0IGZvciBETEwgbG9jayAqLworCXVkZWxheSAoMjAwKTsKKworCXRlbXAgPSBjZmdfdmFsdWUgfCBDVExfUFJFQ0hBUkdFX0NNRDsJLyogaXNzdWUgcHJlY2hhcmdlIGFsbCAqLworCW1lbWN0bC0+Y3RybCA9IHRlbXA7CS8qIGN0cmwgKi8KKwlhc20gdm9sYXRpbGUgKCJzeW5jIik7CisKKwl0ZW1wID0gY2ZnX3ZhbHVlIHwgQ1RMX1JFRlJFU0hfQ01EOwkvKiBpc3N1ZSBwcmVjaGFyZ2UgYWxsICovCisJbWVtY3RsLT5jdHJsID0gdGVtcDsJLyogY3RybCAqLworCWFzbSB2b2xhdGlsZSAoInN5bmMiKTsKKworCW1lbWN0bC0+Y3RybCA9IHRlbXA7CS8qIGN0cmwgKi8KKwlhc20gdm9sYXRpbGUgKCJzeW5jIik7CisKKwkvKiBXcml0ZSBNb2RlIC0gRExMIG5vcm1hbCAqLworCXRlbXAgPSBtb2RlX3ZhbHVlIHwgTU9ERV9PUE1PREUgKE1PREVfT1BNT0RFX05PUk1BTCk7CisJbWVtY3RsLT5tb2RlID0gKHRlbXAgPj4gMTYpOwkvKiBtb2RlICovCisJYXNtIHZvbGF0aWxlICgic3luYyIpOworCisJLyogRW5hYmxlIHJlZnJlc2gsIGVuYWJsZSBEUVMncyAoaWYgRERSKSwgYW5kIGxvY2sgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwljZmdfdmFsdWUgJj0gfkNUTF9NT0RFX0VOQUJMRTsJLyogbG9jayByZWdpc3RlciAqLworCWNmZ192YWx1ZSB8PSBDVExfUkVGUkVTSF9FTkFCTEU7CS8qIGVuYWJsZSByZWZyZXNoICovCisKKwlpZiAodHlwZSA9PSBUWVBFX0REUikKKwkJY2ZnX3ZhbHVlIHw9IENUTF9EUVNPRU4gKDB4Zik7CS8qIGVuYWJsZSBEUVMncyBmb3IgRERSICovCisKKwltZW1jdGwtPmN0cmwgPSBjZmdfdmFsdWU7CS8qIGN0cmwgKi8KKwlhc20gdm9sYXRpbGUgKCJzeW5jIik7CisKKwlyZXR1cm4gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9kcmFtU2V0dXAuaCBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9kcmFtU2V0dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjY0ZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2RyYW1TZXR1cC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogZHJhbVNldHVwLmgKKyAqCisgKiBQcm90b3R5cGVzLCBldGMuIGZvciB0aGUgTW90b3JvbGEgTVBDODIyMAorICogZW1iZWRkZWQgY3B1IGNoaXBzCisgKgorICogMjAwNCAoYykgRnJlZXNjYWxlLCBJbmMuCisgKiBBdXRob3I6IFRzaUNodW5nIExpZXcgPFRzaS1DaHVuZy5MaWV3QGZyZWVzY2FsZS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX19JTkNkcmFtc2V0dXBoCisjZGVmaW5lIF9fSU5DZHJhbXNldHVwaAorI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qIFdoZXJlIHZhcmlvdXMgdGhpbmdzIGFyZSBpbiB0aGUgU1BEICovCisjZGVmaW5lIExPQ19UWVBFICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIExPQ19DSEVDS1NVTSAgICAgICAgICAgICAgICA2MworI2RlZmluZSBMT0NfUEhZU19CQU5LUyAgICAgICAgICAgICAgNQorI2RlZmluZSBMT0NfTE9HSUNBTF9CQU5LUyAgICAgICAgICAgMTcKKyNkZWZpbmUgTE9DX1JPV1MgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTE9DX0NPTFMgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTE9DX1dJRFRIX0hJR0ggICAgICAgICAgICAgIDcKKyNkZWZpbmUgTE9DX1dJRFRIX0xPVyAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgTE9DX1JFRlJFU0ggICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIExPQ19CVVJTVFMgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBMT0NfQ0FTICAgICAgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgTE9DX0NTICAgICAgICAgICAgICAgICAgICAgIDE5CisjZGVmaW5lIExPQ19XRSAgICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBMT0NfVGN5YyAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBMT0NfVGFjICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTE9DX1RycCAgICAgICAgICAgICAgICAgICAgIDI3CisjZGVmaW5lIExPQ19UcnJkICAgICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBMT0NfVHJjZCAgICAgICAgICAgICAgICAgICAgMjkKKyNkZWZpbmUgTE9DX1RyYXMgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIExPQ19CdWZmZXJlZCAgICAgICAgICAgICAgICAyMQorLyogVHlwZXMgb2YgbWVtb3J5IHRoZSBTUEQgY2FuIHRlbGwgdXMgYWJvdXQuCisgKiBXZSBjYW4gYWN0dWFsbHkgb25seSB1c2UgU0RSQU0gYW5kIEREUi4KKyAqLworI2RlZmluZSBUWVBFX0RSQU0gICAgICAgICAgICAgICAgICAgMQkvKiBwbGFpbiBvbGQgZHJhbSAqLworI2RlZmluZSBUWVBFX0VETyAgICAgICAgICAgICAgICAgICAgMgkvKiBFRE8gZHJhbSAqLworI2RlZmluZSBUWVBFX05pYmJsZSAgICAgICAgICAgICAgICAgMwkvKiBzZXJpYWwgbmliYmxlIG1lbW9yeSAqLworI2RlZmluZSBUWVBFX1NEUiAgICAgICAgICAgICAgICAgICAgNAkvKiBTRFJBTSAqLworI2RlZmluZSBUWVBFX1JPTSAgICAgICAgICAgICAgICAgICAgNQkvKiAgKi8KKyNkZWZpbmUgVFlQRV9TR1JSQU0gICAgICAgICAgICAgICAgIDYJLyogZ3JhcGhpY3MgbWVtb3J5ICovCisjZGVmaW5lIFRZUEVfRERSICAgICAgICAgICAgICAgICAgICA3CS8qIEREUiBzZHJhbSAqLworI2RlZmluZSBTRFJBTURTX01BU0sgICAgICAgIDB4MwkvKiBlYWNoIGZpZWxkIGlzIDIgYml0cyB3aWRlICovCisjZGVmaW5lIFNEUkFNRFNfU0JFX1NISUZUICAgICA4CS8qIENsb2NrIGVuYWJsZSBkcml2ZSBzdHJlbmd0aCAqLworI2RlZmluZSBTRFJBTURTX1NCQ19TSElGVCAgICAgNgkvKiBDbG9ja3MgZHJpdmUgc3RyZW5ndGggKi8KKyNkZWZpbmUgU0RSQU1EU19TQkFfU0hJRlQgICAgIDQJLyogQWRkcmVzcyBkcml2ZSBzdHJlbmd0aCAqLworI2RlZmluZSBTRFJBTURTX1NCU19TSElGVCAgICAgMgkvKiBTRFIgRFFTIGRyaXZlIHN0cmVuZ3RoICovCisjZGVmaW5lIFNEUkFNRFNfU0JEX1NISUZUICAgICAwCS8qIERhdGEgYW5kIERRUyBkcml2ZSBzdHJlbmd0aCAqLworI2RlZmluZSAgRFJJVkVfU1RSRU5HVEhfSElHSCAwCisjZGVmaW5lICBEUklWRV9TVFJFTkdUSF9NRUQgIDEKKyNkZWZpbmUgIERSSVZFX1NUUkVOR1RIX0xPVyAgMgorI2RlZmluZSAgRFJJVkVfU1RSRU5HVEhfT0ZGICAzCisKKyNkZWZpbmUgT0sgICAgICAwCisjZGVmaW5lIEVSUk9SICAgLTEKKy8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGFkZHJlc3MgbXV4aW5nLiAqLworCXR5cGVkZWYgc3RydWN0IHRhZ011eERlc2NyaXB0b3IgeworCXU4IE11eFZhbHVlOworCXU4IENvbHVtbnM7CisJdTggUm93czsKKwl1OCBNb3JlQ29sdW1uczsKK30gbXV4ZGVzY190OworCisvKiBTdHJ1Y3R1cmUgdG8gZGVmaW5lIG9uZSBwaHlzaWNhbCBiYW5rIG9mCisgKiBtZW1vcnkuICBOb3RlIHRoYXQgZHJhbSBzaXplIGluIGJ5dGVzIGlzCisgKiAoMl5eKHJvd3MrY29sdW1ucykpICogd2lkdGggKiBiYW5rcyAvIDgKKyovCit0eXBlZGVmIHN0cnVjdCB0YWdEcmFtSW5mbyB7CisJdTMyIHNpemU7CQkvKiBzaXplIGluIGJ5dGVzICovCisJdTMyIGJhc2U7CQkvKiBiYXNlIGFkZHJlc3MgKi8KKwl1OCBvcmRpbmFsOwkJLyogd2hlcmUgaW4gdGhlIG1lbW9yeSBtYXAgd2lsbCB3ZSBwdXQgdGhpcyAqLworCXU4IHR5cGU7CisJdTggcm93czsKKwl1OCBjb2xzOworCXUxNiB3aWR0aDsJCS8qIHdpZHRoIG9mIGVhY2ggY2hpcCBpbiBiaXRzICovCisJdTggYmFua3M7CQkvKiBudW1iZXIgb2YgY2hpcHMsIGFrYSBsb2dpY2FsIGJhbmtzICovCisJdTggYnVyc3RzOwkJLyogYml0LWVuY29kZWQgYWxsb3dhYmxlIGJ1cnN0IGxlbmd0aCAqLworCXU4IENBUzsJCQkvKiBiaXQtZW5jb2RlZCBDQVMgbGF0ZW5jeSB2YWx1ZXMgKi8KKwl1OCBDUzsJCQkvKiBiaXQtZW5jb2RlZCBDUyBsYXRlbmN5IHZhbHVlcyAqLworCXU4IFdFOwkJCS8qIGJpdC1lbmNvZGVkIFdFIGxhdGVuY3kgdmFsdWVzICovCisJdTggVHJwOwkJCS8qIGJpdC1lbmNvZGVkIHJvdyBwcmVjaGFyZ2UgdGltZSAqLworCXU4IFRyY2Q7CQkvKiBiaXQtZW5jb2RlZCBSQVMgdG8gQ0FTIGRlbGF5ICovCisJdTggYnVmZmVyZWQ7CQkvKiBidWZmZXJlZCBvciBub3QgKi8KKwl1OCByZWZyZXNoOwkJLyogZW5jb2RlZCByZWZyZXNoIHJhdGUgKi8KK30gZHJhbWluZm9fdDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX19JTkNkcmFtc2V0dXBoICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvZmVjLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvZmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyZTBmZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9mZWMuYwpAQCAtMCwwICsxLDEwMDAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIG1wYzQyMDBmZWMuYywKKyAqIChDKSBDb3B5cmlnaHQgTW90b3JvbGEsIEluYy4sIDIwMDAKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODIyMC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPG1paXBoeS5oPgorI2luY2x1ZGUgImRtYS5oIgorI2luY2x1ZGUgImZlYy5oIgorCisjdW5kZWYgIERFQlVHCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKSAmJiBcCisgICAgZGVmaW5lZChDT05GSUdfTVBDODIyMF9GRUMpCisKKyNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpCisjZXJyb3IgIkNPTkZJR19NSUkgaGFzIHRvIGJlIGRlZmluZWQhIgorI2VuZGlmCisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgdGZpZm9fcHJpbnQgKGNoYXIgKmRldm5hbWUsIG1wYzgyMjBfZmVjX3ByaXYgKiBmZWMpOworc3RhdGljIHZvaWQgcmZpZm9fcHJpbnQgKGNoYXIgKmRldm5hbWUsIG1wYzgyMjBfZmVjX3ByaXYgKiBmZWMpOworI2VuZGlmIC8qIERFQlVHICovCisKKyNpZmRlZiBERUJVRworc3RhdGljIHUzMiBsb2NhbF9jcmMzMiAoY2hhciAqc3RyaW5nLCB1bnNpZ25lZCBpbnQgY3JjX3ZhbHVlLCBpbnQgbGVuKTsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJdTggZGF0YVsxNTAwXTsJCS8qIGFjdHVhbCBkYXRhICovCisJaW50IGxlbmd0aDsJCS8qIGFjdHVhbCBsZW5ndGggKi8KKwlpbnQgdXNlZDsJCS8qIGJ1ZmZlciBpbiB1c2Ugb3Igbm90ICovCisJdTggaGVhZFsxNl07CQkvKiBNQUMgaGVhZGVyKDYgKyA2ICsgMikgKyAyKGFsaWduZWQpICovCit9IE5CVUY7CisKK2ludCBmZWM4MjIwX21paXBoeV9yZWFkIChjaGFyICpkZXZuYW1lLCB1OCBwaHlBZGRyLCB1OCByZWdBZGRyLCB1MTYgKiByZXRWYWwpOworaW50IGZlYzgyMjBfbWlpcGh5X3dyaXRlIChjaGFyICpkZXZuYW1lLCB1OCBwaHlBZGRyLCB1OCByZWdBZGRyLCB1MTYgZGF0YSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgbXBjODIyMF9mZWNfcGh5ZHVtcCAoY2hhciAqZGV2bmFtZSkKK3sKKwl1MTYgcGh5U3RhdHVzLCBpOworCXU4IHBoeUFkZHIgPSBDT05GSUdfUEhZX0FERFI7CisJdTggcmVnX21hc2tbXSA9IHsKKyNpZiBDT05GSUdfUEhZX1RZUEUgPT0gMHg3OWM4NzQgLyogQU1EIEFtNzlDODc0ICovCisJCS8qIHJlZ3MgdG8gcHJpbnQ6IDAuLi43LCAxNi4uLjE5LCAyMSwgMjMsIDI0ICovCisJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisjZWxzZQorCQkvKiByZWdzIHRvIHByaW50OiAwLi4uOCwgMTYuLi4yMCAqLworCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorI2VuZGlmCisJfTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmIChyZWdfbWFza1tpXSkgeworCQkJbWlpcGh5X3JlYWQgKGRldm5hbWUsIHBoeUFkZHIsIGksICZwaHlTdGF0dXMpOworCQkJcHJpbnRmICgiTWlpIHJlZyAlZDogMHglMDR4XG4iLCBpLCBwaHlTdGF0dXMpOworCQl9CisJfQorfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbXBjODIyMF9mZWNfcmJkX2luaXQgKG1wYzgyMjBfZmVjX3ByaXYgKiBmZWMpCit7CisJaW50IGl4OworCWNoYXIgKmRhdGE7CisJc3RhdGljIGludCBvbmNlID0gMDsKKworCWZvciAoaXggPSAwOyBpeCA8IEZFQ19SQkRfTlVNOyBpeCsrKSB7CisJCWlmICghb25jZSkgeworCQkJZGF0YSA9IChjaGFyICopIG1hbGxvYyAoRkVDX01BWF9QS1RfU0laRSk7CisJCQlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCQkJcHJpbnRmICgiUkJEIElOSVQgRkFJTEVEXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlmZWMtPnJiZEJhc2VbaXhdLmRhdGFQb2ludGVyID0gKHUzMikgZGF0YTsKKwkJfQorCQlmZWMtPnJiZEJhc2VbaXhdLnN0YXR1cyA9IEZFQ19SQkRfRU1QVFk7CisJCWZlYy0+cmJkQmFzZVtpeF0uZGF0YUxlbmd0aCA9IDA7CisJfQorCW9uY2UrKzsKKworCS8qCisJICogaGF2ZSB0aGUgbGFzdCBSQkQgdG8gY2xvc2UgdGhlIHJpbmcKKwkgKi8KKwlmZWMtPnJiZEJhc2VbaXggLSAxXS5zdGF0dXMgfD0gRkVDX1JCRF9XUkFQOworCWZlYy0+cmJkSW5kZXggPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG1wYzgyMjBfZmVjX3RiZF9pbml0IChtcGM4MjIwX2ZlY19wcml2ICogZmVjKQoreworCWludCBpeDsKKworCWZvciAoaXggPSAwOyBpeCA8IEZFQ19UQkRfTlVNOyBpeCsrKSB7CisJCWZlYy0+dGJkQmFzZVtpeF0uc3RhdHVzID0gMDsKKwl9CisKKwkvKgorCSAqIEhhdmUgdGhlIGxhc3QgVEJEIHRvIGNsb3NlIHRoZSByaW5nCisJICovCisJZmVjLT50YmRCYXNlW2l4IC0gMV0uc3RhdHVzIHw9IEZFQ19UQkRfV1JBUDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBzb21lIGluZGljZXMKKwkgKi8KKwlmZWMtPnRiZEluZGV4ID0gMDsKKwlmZWMtPnVzZWRUYmRJbmRleCA9IDA7CisJZmVjLT5jbGVhblRiZE51bSA9IEZFQ19UQkRfTlVNOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtcGM4MjIwX2ZlY19yYmRfY2xlYW4gKG1wYzgyMjBfZmVjX3ByaXYgKiBmZWMsIEZFQ19SQkQgKiBwUmJkKQoreworCS8qCisJICogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3IgYXMgZW1wdHkKKwkgKi8KKwlpZiAoKGZlYy0+cmJkSW5kZXgpID09IChGRUNfUkJEX05VTSAtIDEpKQorCQlwUmJkLT5zdGF0dXMgPSAoRkVDX1JCRF9XUkFQIHwgRkVDX1JCRF9FTVBUWSk7CisJZWxzZQorCQlwUmJkLT5zdGF0dXMgPSBGRUNfUkJEX0VNUFRZOworCisJcFJiZC0+ZGF0YUxlbmd0aCA9IDA7CisKKwkvKgorCSAqIE5vdywgd2UgaGF2ZSBhbiBlbXB0eSBSeEJELCByZXN0YXJ0IHRoZSBTbWFydERNQSByZWNlaXZlIHRhc2sKKwkgKi8KKwlETUFfVEFTS19FTkFCTEUgKEZFQ19SRUNWX1RBU0tfTk8pOworCisJLyoKKwkgKiBJbmNyZW1lbnQgQkQgY291bnQKKwkgKi8KKwlmZWMtPnJiZEluZGV4ID0gKGZlYy0+cmJkSW5kZXggKyAxKSAlIEZFQ19SQkRfTlVNOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtcGM4MjIwX2ZlY190YmRfc2NydWIgKG1wYzgyMjBfZmVjX3ByaXYgKiBmZWMpCit7CisJRkVDX1RCRCAqcFVzZWRUYmQ7CisKKyNpZmRlZiBERUJVRworCXByaW50ZiAoInRiZF9zY3J1YjogZmVjLT5jbGVhblRiZE51bSA9ICVkLCBmZWMtPnVzZWRUYmRJbmRleCA9ICVkXG4iLAorCQlmZWMtPmNsZWFuVGJkTnVtLCBmZWMtPnVzZWRUYmRJbmRleCk7CisjZW5kaWYKKworCS8qCisJICogcHJvY2VzcyBhbGwgdGhlIGNvbnN1bWVkIFRCRHMKKwkgKi8KKwl3aGlsZSAoZmVjLT5jbGVhblRiZE51bSA8IEZFQ19UQkRfTlVNKSB7CisJCXBVc2VkVGJkID0gJmZlYy0+dGJkQmFzZVtmZWMtPnVzZWRUYmRJbmRleF07CisJCWlmIChwVXNlZFRiZC0+c3RhdHVzICYgRkVDX1RCRF9SRUFEWSkgeworI2lmZGVmIERFQlVHCisJCQlwcmludGYgKCJDYW5ub3QgY2xlYW4gVEJEICVkLCBpbiB1c2VcbiIsCisJCQkJZmVjLT5jbGVhblRiZE51bSk7CisjZW5kaWYKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIGNsZWFuIHRoaXMgYnVmZmVyIGRlc2NyaXB0b3IKKwkJICovCisJCWlmIChmZWMtPnVzZWRUYmRJbmRleCA9PSAoRkVDX1RCRF9OVU0gLSAxKSkKKwkJCXBVc2VkVGJkLT5zdGF0dXMgPSBGRUNfVEJEX1dSQVA7CisJCWVsc2UKKwkJCXBVc2VkVGJkLT5zdGF0dXMgPSAwOworCisJCS8qCisJCSAqIHVwZGF0ZSBzb21lIGluZGVjZXMgZm9yIGEgY29ycmVjdCBoYW5kbGluZyBvZiB0aGUgVEJEIHJpbmcKKwkJICovCisJCWZlYy0+Y2xlYW5UYmROdW0rKzsKKwkJZmVjLT51c2VkVGJkSW5kZXggPSAoZmVjLT51c2VkVGJkSW5kZXggKyAxKSAlIEZFQ19UQkRfTlVNOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbXBjODIyMF9mZWNfc2V0X2h3YWRkciAobXBjODIyMF9mZWNfcHJpdiAqIGZlYywgY2hhciAqbWFjKQoreworCXU4IGN1cnJCeXRlOwkJLyogYnl0ZSBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgQ1JDICovCisJaW50IGJ5dGU7CQkvKiBsb29wIC0gY291bnRlciAqLworCWludCBiaXQ7CQkvKiBsb29wIC0gY291bnRlciAqLworCXUzMiBjcmMgPSAweGZmZmZmZmZmOwkvKiBpbml0aWFsIHZhbHVlICovCisKKwkvKgorCSAqIFRoZSBhbGdvcml0aG0gdXNlZCBpcyB0aGUgZm9sbG93aW5nOgorCSAqIHdlIGxvb3Agb24gZWFjaCBvZiB0aGUgc2l4IGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBhZGRyZXNzLAorCSAqIGFuZCB3ZSBjb21wdXRlIHRoZSBDUkMgYnkgbGVmdC1zaGlmdGluZyB0aGUgcHJldmlvdXMKKwkgKiB2YWx1ZSBieSBvbmUgcG9zaXRpb24sIHNvIHRoYXQgZWFjaCBiaXQgaW4gdGhlIGN1cnJlbnQKKwkgKiBieXRlIG9mIHRoZSBhZGRyZXNzIG1heSBjb250cmlidXRlIHRoZSBjYWxjdWxhdGlvbi4gSWYKKwkgKiB0aGUgbGF0dGVyIGFuZCB0aGUgTVNCIGluIHRoZSBDUkMgYXJlIGRpZmZlcmVudCwgdGhlbgorCSAqIHRoZSBDUkMgdmFsdWUgc28gY29tcHV0ZWQgaXMgYWxzbyBleC1vcmVkIHdpdGggdGhlCisJICogInBvbHlub21pdW0gZ2VuZXJhdG9yIi4gVGhlIGN1cnJlbnQgYnl0ZSBvZiB0aGUgYWRkcmVzcworCSAqIGlzIGFsc28gc2hpZnRlZCByaWdodCBieSBvbmUgYml0IGF0IGVhY2ggaXRlcmF0aW9uLgorCSAqIFRoaXMgaXMgYmVjYXVzZSB0aGUgQ1JDIGdlbmVyYXRvcmUgaW4gaGFyZHdhcmUgaXMgaW1wbGVtZW50ZWQKKwkgKiBhcyBhIHNoaWZ0LXJlZ2lzdGVyIHdpdGggYXMgbWFueSBleC1vcmVzIGFzIHRoZSByYWRpeGVzCisJICogaW4gdGhlIHBvbHlub21pdW0uIFRoaXMgc3VnZ2VzdHMgdGhhdCB3ZSByZXByZXNlbnQgdGhlCisJICogcG9seW5vbWl1bW0gaXRzZWxmIGFzIGEgMzItYml0IGNvbnN0YW50LgorCSAqLworCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCA2OyBieXRlKyspIHsKKwkJY3VyckJ5dGUgPSBtYWNbYnl0ZV07CisJCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKKwkJCWlmICgoY3VyckJ5dGUgJiAweDAxKSBeIChjcmMgJiAweDAxKSkgeworCQkJCWNyYyA+Pj0gMTsKKwkJCQljcmMgPSBjcmMgXiAweGVkYjg4MzIwOworCQkJfSBlbHNlIHsKKwkJCQljcmMgPj49IDE7CisJCQl9CisJCQljdXJyQnl0ZSA+Pj0gMTsKKwkJfQorCX0KKworCWNyYyA9IGNyYyA+PiAyNjsKKworCS8qCisJICogU2V0IGluZGl2aWR1YWwgaGFzaCB0YWJsZSByZWdpc3RlcgorCSAqLworCWlmIChjcmMgPj0gMzIpIHsKKwkJZmVjLT5ldGgtPmlhZGRyMSA9ICgxIDw8IChjcmMgLSAzMikpOworCQlmZWMtPmV0aC0+aWFkZHIyID0gMDsKKwl9IGVsc2UgeworCQlmZWMtPmV0aC0+aWFkZHIxID0gMDsKKwkJZmVjLT5ldGgtPmlhZGRyMiA9ICgxIDw8IGNyYyk7CisJfQorCisJLyoKKwkgKiBTZXQgcGh5c2ljYWwgYWRkcmVzcworCSAqLworCWZlYy0+ZXRoLT5wYWRkcjEgPQorCQkobWFjWzBdIDw8IDI0KSArIChtYWNbMV0gPDwgMTYpICsgKG1hY1syXSA8PCA4KSArIG1hY1szXTsKKwlmZWMtPmV0aC0+cGFkZHIyID0gKG1hY1s0XSA8PCAyNCkgKyAobWFjWzVdIDw8IDE2KSArIDB4ODgwODsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtcGM4MjIwX2ZlY19pbml0IChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2LCBiZF90ICogYmlzKQoreworCW1wYzgyMjBfZmVjX3ByaXYgKmZlYyA9IChtcGM4MjIwX2ZlY19wcml2ICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgbXBjODIyMF9kbWEgKmRtYSA9IChzdHJ1Y3QgbXBjODIyMF9kbWEgKikgTU1BUF9ETUE7CisJY29uc3QgdTggcGh5QWRkciA9IENPTkZJR19QSFlfQUREUjsJLyogT25seSBvbmUgUEhZICovCisKKyNpZmRlZiBERUJVRworCXByaW50ZiAoIm1wYzgyMjBfZmVjX2luaXQuLi4gQmVnaW5cbiIpOworI2VuZGlmCisKKwkvKgorCSAqIEluaXRpYWxpemUgUnhCRC9UeEJEIHJpbmdzCisJICovCisJbXBjODIyMF9mZWNfcmJkX2luaXQgKGZlYyk7CisJbXBjODIyMF9mZWNfdGJkX2luaXQgKGZlYyk7CisKKwkvKgorCSAqIFNldCB1cCBQaW4gTXV4aW5nIGZvciBGRUMgMQorCSAqLworCSoodnVfbG9uZyAqKSBNTUFQX1BDRkcgPSAwOworCSoodnVfbG9uZyAqKSAoTU1BUF9QQ0ZHICsgNCkgPSAwOworCS8qCisJICogQ2xlYXIgRkVDLUxpdGUgaW50ZXJydXB0IGV2ZW50IHJlZ2lzdGVyKElFVkVOVCkKKwkgKi8KKwlmZWMtPmV0aC0+aWV2ZW50ID0gMHhmZmZmZmZmZjsKKworCS8qCisJICogU2V0IGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCisJICovCisJZmVjLT5ldGgtPmltYXNrID0gMHgwMDAwMDAwMDsKKworCS8qCisJICogU2V0IEZFQy1MaXRlIHJlY2VpdmUgY29udHJvbCByZWdpc3RlcihSX0NOVFJMKToKKwkgKi8KKwlpZiAoZmVjLT54Y3ZfdHlwZSA9PSBTRVZFTldJUkUpIHsKKwkJLyoKKwkJICogRnJhbWUgbGVuZ3RoPTE1MTg7IDctd2lyZSBtb2RlCisJCSAqLworCQlmZWMtPmV0aC0+cl9jbnRybCA9IDB4MDVlZTAwMjA7IC8qMHgwNWVlMDAwMDtGSVhNRSAqLworCX0gZWxzZSB7CisJCS8qCisJCSAqIEZyYW1lIGxlbmd0aD0xNTE4OyBNSUkgbW9kZTsKKwkJICovCisJCWZlYy0+ZXRoLT5yX2NudHJsID0gMHgwNWVlMDAyNDsgLyoweDA1ZWUwMDA0O0ZJWE1FICovCisJfQorCisJZmVjLT5ldGgtPnhfY250cmwgPSAweDAwMDAwMDAwOyAvKiBoYWxmLWR1cGxleCwgaGVhcnRiZWF0IGRpc2FibGVkICovCisJaWYgKGZlYy0+eGN2X3R5cGUgIT0gU0VWRU5XSVJFKSB7CisJCS8qCisJCSAqIFNldCBNSUlfU1BFRUQgPSAoMS8obWlpX3NwZWVkICogMikpICogU3lzdGVtIENsb2NrCisJCSAqIGFuZCBkbyBub3QgZHJvcCB0aGUgUHJlYW1ibGUuCisJCSAqLworCQkvKiB0YmQgLSBydG0gKi8KKwkJLypmZWMtPmV0aC0+bWlpX3NwZWVkID0gKCgoZ2QtPmlwYl9jbGsgPj4gMjApIC8gNSkgPDwgMSk7ICovCisJCS8qIE5vIE1JSSBmb3IgNy13aXJlIG1vZGUgKi8KKwkJZmVjLT5ldGgtPm1paV9zcGVlZCA9IDB4MDAwMDAwMzA7CisJfQorCisJLyoKKwkgKiBTZXQgT3Bjb2RlL1BhdXNlIER1cmF0aW9uIFJlZ2lzdGVyCisJICovCisJZmVjLT5ldGgtPm9wX3BhdXNlID0gMHgwMDAxMDAyMDsJLypGSVhNRTB4ZmZmZjAwMjA7ICovCisKKwkvKgorCSAqIFNldCBSeCBGSUZPIGFsYXJtIGFuZCBncmFudWxhcml0eSB2YWx1ZQorCSAqLworCWZlYy0+ZXRoLT5yZmlmb19jbnRybCA9IDB4MGMwMDAwMDA7CisJZmVjLT5ldGgtPnJmaWZvX2FsYXJtID0gMHgwMDAwMDMwYzsKKyNpZmRlZiBERUJVRworCWlmIChmZWMtPmV0aC0+cmZpZm9fc3RhdHVzICYgMHgwMDcwMDAwMCkgeworCQlwcmludGYgKCJtcGM4MjIwX2ZlY19pbml0KCkgUkZJRk8gZXJyb3JcbiIpOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBTZXQgVHggRklGTyBncmFudWxhcml0eSB2YWx1ZQorCSAqLworCS8qZmVjLT5ldGgtPnRmaWZvX2NudHJsID0gMHgwYzAwMDAwMDsgKi8gLyp0YmQgLSBydG0gKi8KKwlmZWMtPmV0aC0+dGZpZm9fY250cmwgPSAweDBlMDAwMDAwOworI2lmZGVmIERFQlVHCisJcHJpbnRmICgidGZpZm9fc3RhdHVzOiAweCUwOHhcbiIsIGZlYy0+ZXRoLT50Zmlmb19zdGF0dXMpOworCXByaW50ZiAoInRmaWZvX2FsYXJtOiAweCUwOHhcbiIsIGZlYy0+ZXRoLT50Zmlmb19hbGFybSk7CisjZW5kaWYKKworCS8qCisJICogU2V0IHRyYW5zbWl0IGZpZm8gd2F0ZXJtYXJrIHJlZ2lzdGVyKFhfV01SSyksIGRlZmF1bHQgPSA2NAorCSAqLworCWZlYy0+ZXRoLT50Zmlmb19hbGFybSA9IDB4MDAwMDAwODA7CisJZmVjLT5ldGgtPnhfd21yayA9IDB4MjsKKworCS8qCisJICogU2V0IGluZGl2aWR1YWwgYWRkcmVzcyBmaWx0ZXIgZm9yIHVuaWNhc3QgYWRkcmVzcworCSAqIGFuZCBzZXQgcGh5c2ljYWwgYWRkcmVzcyByZWdpc3RlcnMuCisJICovCisJbXBjODIyMF9mZWNfc2V0X2h3YWRkciAoZmVjLCAoY2hhciAqKShkZXYtPmVuZXRhZGRyKSk7CisKKwkvKgorCSAqIFNldCBtdWx0aWNhc3QgYWRkcmVzcyBmaWx0ZXIKKwkgKi8KKwlmZWMtPmV0aC0+Z2FkZHIxID0gMHgwMDAwMDAwMDsKKwlmZWMtPmV0aC0+Z2FkZHIyID0gMHgwMDAwMDAwMDsKKworCS8qCisJICogVHVybiBPTiBjaGVhdGVyIEZTTTogPz8/PworCSAqLworCWZlYy0+ZXRoLT54bWl0X2ZzbSA9IDB4MDMwMDAwMDA7CisKKyNpZiAxCisvKiNpZiBkZWZpbmVkKENPTkZJR19NUEM1MjAwKSovCisJLyoKKwkgKiBUdXJuIG9mZiBDT01NIGJ1cyBwcmVmZXRjaCBpbiB0aGUgTUdUNTIwMCBCZXN0Q29tbS4gSXQgZG9lc24ndAorCSAqIHdvcmsgdy8gdGhlIGN1cnJlbnQgcmVjZWl2ZSB0YXNrLgorCSAqLworCWRtYS0+UHRkQ250cmwgfD0gMHgwMDAwMDAwMTsKKyNlbmRpZgorCisJLyoKKwkgKiBTZXQgcHJpb3JpdHkgb2YgZGlmZmVyZW50IGluaXRpYXRvcnMKKwkgKi8KKwlkbWEtPklQUjAgPSA3OwkJLyogYWx3YXlzICovCisJZG1hLT5JUFIzID0gNjsJCS8qIEV0aCBSWCAqLworCWRtYS0+SVBSNCA9IDU7CQkvKiBFdGggVHggKi8KKworCS8qCisJICogQ2xlYXIgU21hcnRETUEgdGFzayBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzCisJICovCisJRE1BX0NMRUFSX0lFVkVOVCAoRkVDX1JFQ1ZfVEFTS19OTyk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgU21hcnRETUEgcGFyYW1ldGVycyBzdG9yZWQgaW4gU1JBTQorCSAqLworCSooaW50ICopIEZFQ19UQkRfQkFTRSA9IChpbnQpIGZlYy0+dGJkQmFzZTsKKwkqKGludCAqKSBGRUNfUkJEX0JBU0UgPSAoaW50KSBmZWMtPnJiZEJhc2U7CisJKihpbnQgKikgRkVDX1RCRF9ORVhUID0gKGludCkgZmVjLT50YmRCYXNlOworCSooaW50ICopIEZFQ19SQkRfTkVYVCA9IChpbnQpIGZlYy0+cmJkQmFzZTsKKworCWlmIChmZWMtPnhjdl90eXBlICE9IFNFVkVOV0lSRSkgeworCQkvKgorCQkgKiBJbml0aWFsaXplIFBIWShMWFQ5NzFBKToKKwkJICoKKwkJICogICBHZW5lcmFsbHksIG9uIHBvd2VyIHVwLCB0aGUgTFhUOTcxQSByZWFkcyBpdHMgY29uZmlndXJhdGlvbgorCQkgKiAgIHBpbnMgdG8gY2hlY2sgZm9yIGZvcmNlZCBvcGVyYXRpb24sIElmIG5vdCBjb2ZpZ3VyZWQgZm9yCisJCSAqICAgZm9yY2VkIG9wZXJhdGlvbiwgaXQgdXNlcyBhdXRvLW5lZ290aWF0aW9uL3BhcmFsbGVsIGRldGVjdGlvbgorCQkgKiAgIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIGxpbmUgb3BlcmF0aW5nIGNvbmRpdGlvbnMuCisJCSAqICAgSWYgdGhlIFBIWSBkZXZpY2Ugb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGxpbmsgc3VwcG9ydHMKKwkJICogICBhdXRvLW5lZ290aWF0aW9uLCB0aGUgTFhUOTcxQSBhdXRvLW5lZ290aWF0ZXMgd2l0aCBpdAorCQkgKiAgIHVzaW5nIEZhc3QgTGluayBQdWxzZShGTFApIEJ1cnN0cy4gSWYgdGhlIFBIWSBwYXJ0bmVyIGRvZXMgbm90CisJCSAqICAgc3VwcG9ydCBhdXRvLW5lZ290aWF0aW9uLCB0aGUgTFhUOTcxQSBhdXRvbWF0aWNhbGx5IGRldGVjdHMKKwkJICogICB0aGUgcHJlc2VuY2Ugb2YgZWl0aGVyIGxpbmsgcHVsc2VzKDEwTWJwcyBQSFkpIG9yIElkbGUKKwkJICogICBzeW1ib2xzKDEwME1icHMpIGFuZCBzZXRzIGl0cyBvcGVyYXRpbmcgY29uZGl0aW9ucyBhY2NvcmRpbmdseS4KKwkJICoKKwkJICogICBXaGVuIGF1dG8tbmVnb3RpYXRpb24gaXMgY29udHJvbGxlZCBieSBzb2Z0d2FyZSwgdGhlIGZvbGxvd2luZworCQkgKiAgIHN0ZXBzIGFyZSByZWNvbW1lbmRlZC4KKwkJICoKKwkJICogTm90ZToKKwkJICogICBUaGUgcGh5c2ljYWwgYWRkcmVzcyBpcyBkZXBlbmRlbnQgb24gaGFyZHdhcmUgY29uZmlndXJhdGlvbi4KKwkJICoKKwkJICovCisJCWludCB0aW1lb3V0ID0gMTsKKwkJdTE2IHBoeVN0YXR1czsKKworCQkvKgorCQkgKiBSZXNldCBQSFksIHRoZW4gZGVsYXkgMzAwbnMKKwkJICovCisJCW1paXBoeV93cml0ZSAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDAsIDB4ODAwMCk7CisJCXVkZWxheSAoMTAwMCk7CisKKwkJaWYgKGZlYy0+eGN2X3R5cGUgPT0gTUlJMTApIHsKKwkJCS8qCisJCQkgKiBGb3JjZSAxMEJhc2UtVCwgRkRYIG9wZXJhdGlvbgorCQkJICovCisjaWZkZWYgREVCVUcKKwkJCXByaW50ZiAoIkZvcmNpbmcgMTAgTWJwcyBldGhlcm5ldCBsaW5rLi4uICIpOworI2VuZGlmCisJCQltaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpOworCQkJLyoKKwkJCSAgIG1paXBoeV93cml0ZShmZWMsIHBoeUFkZHIsIDB4MCwgMHgwMTAwKTsKKwkJCSAqLworCQkJbWlpcGh5X3dyaXRlIChkZXYtPm5hbWUsIHBoeUFkZHIsIDB4MCwgMHgwMTgwKTsKKworCQkJdGltZW91dCA9IDIwOworCQkJZG8gewkvKiB3YWl0IGZvciBsaW5rIHN0YXR1cyB0byBnbyBkb3duICovCisJCQkJdWRlbGF5ICgxMDAwMCk7CisJCQkJaWYgKCh0aW1lb3V0LS0pID09IDApIHsKKyNpZmRlZiBERUJVRworCQkJCQlwcmludGYgKCJobW1tLCBzaG91bGQgbm90IGhhdmUgd2FpdGVkLi4uIik7CisjZW5kaWYKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW1paXBoeV9yZWFkIChkZXYtPm5hbWUsIHBoeUFkZHIsIDB4MSwgJnBoeVN0YXR1cyk7CisjaWZkZWYgREVCVUcKKwkJCQlwcmludGYgKCI9Iik7CisjZW5kaWYKKwkJCX0gd2hpbGUgKChwaHlTdGF0dXMgJiAweDAwMDQpKTsgLyogIWxpbmsgdXAgKi8KKworCQkJdGltZW91dCA9IDEwMDA7CisJCQlkbyB7CS8qIHdhaXQgZm9yIGxpbmsgc3RhdHVzIHRvIGNvbWUgYmFjayB1cCAqLworCQkJCXVkZWxheSAoMTAwMDApOworCQkJCWlmICgodGltZW91dC0tKSA9PSAwKSB7CisJCQkJCXByaW50ZiAoImZhaWxlZC4gTGluayBpcyBkb3duLlxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltaWlwaHlfcmVhZCAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpOworI2lmZGVmIERFQlVHCisJCQkJcHJpbnRmICgiKyIpOworI2VuZGlmCisJCQl9IHdoaWxlICghKHBoeVN0YXR1cyAmIDB4MDAwNCkpOwkvKiAhbGluayB1cCAqLworCisjaWZkZWYgREVCVUcKKwkJCXByaW50ZiAoImRvbmUuXG4iKTsKKyNlbmRpZgorCQl9IGVsc2UgewkvKiBNSUkxMDAgKi8KKwkJCS8qCisJCQkgKiBTZXQgdGhlIGF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCByZWdpc3RlciBiaXRzCisJCQkgKi8KKwkJCW1paXBoeV93cml0ZSAoZGV2LT5uYW1lLCBwaHlBZGRyLCAweDQsIDB4MDFlMSk7CisKKwkJCS8qCisJCQkgKiBTZXQgTURJTyBiaXQgMC4xMiA9IDEoJiYgYml0IDAuOT0xPykgdG8gZW5hYmxlIGF1dG8tbmVnb3RpYXRpb24KKwkJCSAqLworCQkJbWlpcGh5X3dyaXRlIChkZXYtPm5hbWUsIHBoeUFkZHIsIDB4MCwgMHgxMjAwKTsKKworCQkJLyoKKwkJCSAqIFdhaXQgZm9yIEFOIGNvbXBsZXRpb24KKwkJCSAqLworCQkJdGltZW91dCA9IDUwMDA7CisJCQlkbyB7CisJCQkJdWRlbGF5ICgxMDAwKTsKKworCQkJCWlmICgodGltZW91dC0tKSA9PSAwKSB7CisjaWZkZWYgREVCVUcKKwkJCQkJcHJpbnRmICgiUEhZIGF1dG8gbmVnIDAgZmFpbGVkLi4uXG4iKTsKKyNlbmRpZgorCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCisJCQkJaWYgKG1paXBoeV9yZWFkIChkZXYtPm5hbWUsIHBoeUFkZHIsIDB4MSwgJnBoeVN0YXR1cykgIT0KKwkJCQkgICAgMCkgeworI2lmZGVmIERFQlVHCisJCQkJCXByaW50ZiAoIlBIWSBhdXRvIG5lZyAxIGZhaWxlZCAweCUwNHguLi5cbiIsIHBoeVN0YXR1cyk7CisjZW5kaWYKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0gd2hpbGUgKCEocGh5U3RhdHVzICYgMHgwMDA0KSk7CisKKyNpZmRlZiBERUJVRworCQkJcHJpbnRmICgiUEhZIGF1dG8gbmVnIGNvbXBsZXRlISBcbiIpOworI2VuZGlmCisJCX0KKworCX0KKworCS8qCisJICogRW5hYmxlIEZFQy1MaXRlIGNvbnRyb2xsZXIKKwkgKi8KKwlmZWMtPmV0aC0+ZWNudHJsIHw9IDB4MDAwMDAwMDY7CisKKyNpZmRlZiBERUJVRworCWlmIChmZWMtPnhjdl90eXBlICE9IFNFVkVOV0lSRSkKKwkJbXBjODIyMF9mZWNfcGh5ZHVtcCAoZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyoKKwkgKiBFbmFibGUgU21hcnRETUEgcmVjZWl2ZSB0YXNrCisJICovCisJRE1BX1RBU0tfRU5BQkxFIChGRUNfUkVDVl9UQVNLX05PKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmICgibXBjODIyMF9mZWNfaW5pdC4uLiBEb25lIFxuIik7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtcGM4MjIwX2ZlY19oYWx0IChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCW1wYzgyMjBfZmVjX3ByaXYgKmZlYyA9IChtcGM4MjIwX2ZlY19wcml2ICopIGRldi0+cHJpdjsKKwlpbnQgY291bnRlciA9IDB4ZmZmZjsKKworI2lmZGVmIERFQlVHCisJaWYgKGZlYy0+eGN2X3R5cGUgIT0gU0VWRU5XSVJFKQorCQltcGM4MjIwX2ZlY19waHlkdW1wIChkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKgorCSAqIG1hc2sgRkVDIGNoaXAgaW50ZXJydXB0cworCSAqLworCWZlYy0+ZXRoLT5pbWFzayA9IDA7CisKKwkvKgorCSAqIGlzc3VlIGdyYWNlZnVsIHN0b3AgY29tbWFuZCB0byB0aGUgRkVDIHRyYW5zbWl0dGVyIGlmIG5lY2Vzc2FyeQorCSAqLworCWZlYy0+ZXRoLT54X2NudHJsIHw9IDB4MDAwMDAwMDE7CisKKwkvKgorCSAqIHdhaXQgZm9yIGdyYWNlZnVsIHN0b3AgdG8gcmVnaXN0ZXIKKwkgKi8KKwl3aGlsZSAoKGNvdW50ZXItLSkgJiYgKCEoZmVjLT5ldGgtPmlldmVudCAmIDB4MTAwMDAwMDApKSk7CisKKwkvKgorCSAqIERpc2FibGUgU21hcnRETUEgdGFza3MKKwkgKi8KKwlETUFfVEFTS19ESVNBQkxFIChGRUNfWE1JVF9UQVNLX05PKTsKKwlETUFfVEFTS19ESVNBQkxFIChGRUNfUkVDVl9UQVNLX05PKTsKKworCS8qCisJICogRGlzYWJsZSB0aGUgRXRoZXJuZXQgQ29udHJvbGxlcgorCSAqLworCWZlYy0+ZXRoLT5lY250cmwgJj0gMHhmZmZmZmZmZDsKKworCS8qCisJICogQ2xlYXIgRklGTyBzdGF0dXMgcmVnaXN0ZXJzCisJICovCisJZmVjLT5ldGgtPnJmaWZvX3N0YXR1cyAmPSAweDAwNzAwMDAwOworCWZlYy0+ZXRoLT50Zmlmb19zdGF0dXMgJj0gMHgwMDcwMDAwMDsKKworCWZlYy0+ZXRoLT5yZXNldF9jbnRybCA9IDB4MDEwMDAwMDA7CisKKwkvKgorCSAqIElzc3VlIGEgcmVzZXQgY29tbWFuZCB0byB0aGUgRkVDIGNoaXAKKwkgKi8KKwlmZWMtPmV0aC0+ZWNudHJsIHw9IDB4MTsKKworCS8qCisJICogd2FpdCBhdCBsZWFzdCAxNiBjbG9jayBjeWNsZXMKKwkgKi8KKwl1ZGVsYXkgKDEwKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmICgiRXRoZXJuZXQgdGFzayBzdG9wcGVkXG4iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgREVCVUcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdGZpZm9fcHJpbnQgKGNoYXIgKmRldm5hbWUsIG1wYzgyMjBfZmVjX3ByaXYgKiBmZWMpCit7CisJdTE2IHBoeUFkZHIgPSBDT05GSUdfUEhZX0FERFI7CisJdTE2IHBoeVN0YXR1czsKKworCWlmICgoZmVjLT5ldGgtPnRmaWZvX2xyZl9wdHIgIT0gZmVjLT5ldGgtPnRmaWZvX2x3Zl9wdHIpCisJICAgIHx8IChmZWMtPmV0aC0+dGZpZm9fcmRwdHIgIT0gZmVjLT5ldGgtPnRmaWZvX3dycHRyKSkgeworCisJCW1paXBoeV9yZWFkIChkZXZuYW1lLCBwaHlBZGRyLCAweDEsICZwaHlTdGF0dXMpOworCQlwcmludGYgKCJcbnBoeVN0YXR1czogMHglMDR4XG4iLCBwaHlTdGF0dXMpOworCQlwcmludGYgKCJlY250cmw6ICAgMHglMDh4XG4iLCBmZWMtPmV0aC0+ZWNudHJsKTsKKwkJcHJpbnRmICgiaWV2ZW50OiAgIDB4JTA4eFxuIiwgZmVjLT5ldGgtPmlldmVudCk7CisJCXByaW50ZiAoInhfc3RhdHVzOiAweCUwOHhcbiIsIGZlYy0+ZXRoLT54X3N0YXR1cyk7CisJCXByaW50ZiAoInRmaWZvOiBzdGF0dXMJMHglMDh4XG4iLCBmZWMtPmV0aC0+dGZpZm9fc3RhdHVzKTsKKworCQlwcmludGYgKCIJY29udHJvbCAweCUwOHhcbiIsIGZlYy0+ZXRoLT50Zmlmb19jbnRybCk7CisJCXByaW50ZiAoIglscmZwCTB4JTA4eFxuIiwgZmVjLT5ldGgtPnRmaWZvX2xyZl9wdHIpOworCQlwcmludGYgKCIJbHdmcAkweCUwOHhcbiIsIGZlYy0+ZXRoLT50Zmlmb19sd2ZfcHRyKTsKKwkJcHJpbnRmICgiCWFsYXJtCTB4JTA4eFxuIiwgZmVjLT5ldGgtPnRmaWZvX2FsYXJtKTsKKwkJcHJpbnRmICgiCXJlYWRwdHIgMHglMDh4XG4iLCBmZWMtPmV0aC0+dGZpZm9fcmRwdHIpOworCQlwcmludGYgKCIJd3JpdHB0ciAweCUwOHhcbiIsIGZlYy0+ZXRoLT50Zmlmb193cnB0cik7CisJfQorfQorCitzdGF0aWMgdm9pZCByZmlmb19wcmludCAoY2hhciAqZGV2bmFtZSwgbXBjODIyMF9mZWNfcHJpdiAqIGZlYykKK3sKKwl1MTYgcGh5QWRkciA9IENPTkZJR19QSFlfQUREUjsKKwl1MTYgcGh5U3RhdHVzOworCisJaWYgKChmZWMtPmV0aC0+cmZpZm9fbHJmX3B0ciAhPSBmZWMtPmV0aC0+cmZpZm9fbHdmX3B0cikKKwkgICAgfHwgKGZlYy0+ZXRoLT5yZmlmb19yZHB0ciAhPSBmZWMtPmV0aC0+cmZpZm9fd3JwdHIpKSB7CisKKwkJbWlpcGh5X3JlYWQgKGRldm5hbWUsIHBoeUFkZHIsIDB4MSwgJnBoeVN0YXR1cyk7CisJCXByaW50ZiAoIlxucGh5U3RhdHVzOiAweCUwNHhcbiIsIHBoeVN0YXR1cyk7CisJCXByaW50ZiAoImVjbnRybDogICAweCUwOHhcbiIsIGZlYy0+ZXRoLT5lY250cmwpOworCQlwcmludGYgKCJpZXZlbnQ6ICAgMHglMDh4XG4iLCBmZWMtPmV0aC0+aWV2ZW50KTsKKwkJcHJpbnRmICgieF9zdGF0dXM6IDB4JTA4eFxuIiwgZmVjLT5ldGgtPnhfc3RhdHVzKTsKKwkJcHJpbnRmICgicmZpZm86IHN0YXR1cwkweCUwOHhcbiIsIGZlYy0+ZXRoLT5yZmlmb19zdGF0dXMpOworCisJCXByaW50ZiAoIgljb250cm9sIDB4JTA4eFxuIiwgZmVjLT5ldGgtPnJmaWZvX2NudHJsKTsKKwkJcHJpbnRmICgiCWxyZnAJMHglMDh4XG4iLCBmZWMtPmV0aC0+cmZpZm9fbHJmX3B0cik7CisJCXByaW50ZiAoIglsd2ZwCTB4JTA4eFxuIiwgZmVjLT5ldGgtPnJmaWZvX2x3Zl9wdHIpOworCQlwcmludGYgKCIJYWxhcm0JMHglMDh4XG4iLCBmZWMtPmV0aC0+cmZpZm9fYWxhcm0pOworCQlwcmludGYgKCIJcmVhZHB0ciAweCUwOHhcbiIsIGZlYy0+ZXRoLT5yZmlmb19yZHB0cik7CisJCXByaW50ZiAoIgl3cml0cHRyIDB4JTA4eFxuIiwgZmVjLT5ldGgtPnJmaWZvX3dycHRyKTsKKwl9Cit9CisjZW5kaWYgLyogREVCVUcgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG1wYzgyMjBfZmVjX3NlbmQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHZvbGF0aWxlIHZvaWQgKmV0aF9kYXRhLAorCQkJICAgICBpbnQgZGF0YV9sZW5ndGgpCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgdHJhbnNtaXRzIG9uZSBmcmFtZS4gIFRoaXMgcm91dGluZSBvbmx5IGFjY2VwdHMKKwkgKiA2LWJ5dGUgRXRoZXJuZXQgYWRkcmVzc2VzLgorCSAqLworCW1wYzgyMjBfZmVjX3ByaXYgKmZlYyA9IChtcGM4MjIwX2ZlY19wcml2ICopIGRldi0+cHJpdjsKKwlGRUNfVEJEICpwVGJkOworCisjaWZkZWYgREVCVUcKKwlwcmludGYgKCJ0YmQgc3RhdHVzOiAweCUwNHhcbiIsIGZlYy0+dGJkQmFzZVswXS5zdGF0dXMpOworCXRmaWZvX3ByaW50IChkZXYtPm5hbWUsIGZlYyk7CisjZW5kaWYKKworCS8qCisJICogQ2xlYXIgVHggQkQgcmluZyBhdCBmaXJzdAorCSAqLworCW1wYzgyMjBfZmVjX3RiZF9zY3J1YiAoZmVjKTsKKworCS8qCisJICogQ2hlY2sgZm9yIHZhbGlkIGxlbmd0aCBvZiBkYXRhLgorCSAqLworCWlmICgoZGF0YV9sZW5ndGggPiAxNTAwKSB8fCAoZGF0YV9sZW5ndGggPD0gMCkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogQ2hlY2sgdGhlIG51bWJlciBvZiB2YWNhbnQgVHhCRHMuCisJICovCisJaWYgKGZlYy0+Y2xlYW5UYmROdW0gPCAxKSB7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRmICgiTm8gYXZhaWxhYmxlIFR4QkRzIC4uLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogR2V0IHRoZSBmaXJzdCBUeEJEIHRvIHNlbmQgdGhlIG1hYyBoZWFkZXIKKwkgKi8KKwlwVGJkID0gJmZlYy0+dGJkQmFzZVtmZWMtPnRiZEluZGV4XTsKKwlwVGJkLT5kYXRhTGVuZ3RoID0gZGF0YV9sZW5ndGg7CisJcFRiZC0+ZGF0YVBvaW50ZXIgPSAodTMyKSBldGhfZGF0YTsKKwlwVGJkLT5zdGF0dXMgfD0gRkVDX1RCRF9MQVNUIHwgRkVDX1RCRF9UQyB8IEZFQ19UQkRfUkVBRFk7CisJZmVjLT50YmRJbmRleCA9IChmZWMtPnRiZEluZGV4ICsgMSkgJSBGRUNfVEJEX05VTTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmICgiRE1BX1RBU0tfRU5BQkxFLCBmZWMtPnRiZEluZGV4ID0gJWQgXG4iLCBmZWMtPnRiZEluZGV4KTsKKyNlbmRpZgorCisJLyoKKwkgKiBLaWNrIHRoZSBNSUkgaS9mCisJICovCisJaWYgKGZlYy0+eGN2X3R5cGUgIT0gU0VWRU5XSVJFKSB7CisJCXUxNiBwaHlTdGF0dXM7CisKKwkJbWlpcGh5X3JlYWQgKGRldi0+bmFtZSwgMCwgMHgxLCAmcGh5U3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIEVuYWJsZSBTbWFydERNQSB0cmFuc21pdCB0YXNrCisJICovCisKKyNpZmRlZiBERUJVRworCXRmaWZvX3ByaW50IChkZXYtPm5hbWUsIGZlYyk7CisjZW5kaWYKKworCURNQV9UQVNLX0VOQUJMRSAoRkVDX1hNSVRfVEFTS19OTyk7CisKKyNpZmRlZiBERUJVRworCXRmaWZvX3ByaW50IChkZXYtPm5hbWUsIGZlYyk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHCisJcHJpbnRmICgiKyIpOworI2VuZGlmCisKKwlmZWMtPmNsZWFuVGJkTnVtIC09IDE7CisKKyNpZmRlZiBERUJVRworCXByaW50ZiAoInNtYXJ0RE1BIGV0aGVybmV0IFR4IHRhc2sgZW5hYmxlZFxuIik7CisjZW5kaWYKKwkvKgorCSAqIHdhaXQgdW50aWwgZnJhbWUgaXMgc2VudCAuCisJICovCisJd2hpbGUgKHBUYmQtPnN0YXR1cyAmIEZFQ19UQkRfUkVBRFkpIHsKKwkJdWRlbGF5ICgxMCk7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRmICgiVERCIHN0YXR1cyA9ICUwNHhcbiIsIHBUYmQtPnN0YXR1cyk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG1wYzgyMjBfZmVjX3JlY3YgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBUaGlzIGNvbW1hbmQgcHVsbHMgb25lIGZyYW1lIGZyb20gdGhlIGNhcmQKKwkgKi8KKwltcGM4MjIwX2ZlY19wcml2ICpmZWMgPSAobXBjODIyMF9mZWNfcHJpdiAqKSBkZXYtPnByaXY7CisJRkVDX1JCRCAqcFJiZCA9ICZmZWMtPnJiZEJhc2VbZmVjLT5yYmRJbmRleF07CisJdW5zaWduZWQgbG9uZyBpZXZlbnQ7CisJaW50IGZyYW1lX2xlbmd0aCwgbGVuID0gMDsKKwlOQlVGICpmcmFtZTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmICgibXBjODIyMF9mZWNfcmVjdiAlZCBTdGFydC4uLlxuIiwgZmVjLT5yYmRJbmRleCk7CisJcHJpbnRmICgiLSIpOworI2VuZGlmCisKKwkvKgorCSAqIENoZWNrIGlmIGFueSBjcml0aWNhbCBldmVudHMgaGF2ZSBoYXBwZW5lZAorCSAqLworCWlldmVudCA9IGZlYy0+ZXRoLT5pZXZlbnQ7CisJZmVjLT5ldGgtPmlldmVudCA9IGlldmVudDsKKwlpZiAoaWV2ZW50ICYgMHgyMDA2MDAwMCkgeworCQkvKiBCQUJULCBSeC9UeCBGSUZPIGVycm9ycyAqLworCQltcGM4MjIwX2ZlY19oYWx0IChkZXYpOworCQltcGM4MjIwX2ZlY19pbml0IChkZXYsIE5VTEwpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlldmVudCAmIDB4ODAwMDAwMDApIHsKKwkJLyogSGVhcnRiZWF0IGVycm9yICovCisJCWZlYy0+ZXRoLT54X2NudHJsIHw9IDB4MDAwMDAwMDE7CisJfQorCWlmIChpZXZlbnQgJiAweDEwMDAwMDAwKSB7CisJCS8qIEdyYWNlZnVsIHN0b3AgY29tcGxldGUgKi8KKwkJaWYgKGZlYy0+ZXRoLT54X2NudHJsICYgMHgwMDAwMDAwMSkgeworCQkJbXBjODIyMF9mZWNfaGFsdCAoZGV2KTsKKwkJCWZlYy0+ZXRoLT54X2NudHJsICY9IH4weDAwMDAwMDAxOworCQkJbXBjODIyMF9mZWNfaW5pdCAoZGV2LCBOVUxMKTsKKwkJfQorCX0KKworCWlmICghKHBSYmQtPnN0YXR1cyAmIEZFQ19SQkRfRU1QVFkpKSB7CisJCWlmICgocFJiZC0+c3RhdHVzICYgRkVDX1JCRF9MQVNUKQorCQkgICAgJiYgIShwUmJkLT5zdGF0dXMgJiBGRUNfUkJEX0VSUikKKwkJICAgICYmICgocFJiZC0+ZGF0YUxlbmd0aCAtIDQpID4gMTQpKSB7CisKKwkJCS8qCisJCQkgKiBHZXQgYnVmZmVyIGFkZHJlc3MgYW5kIHNpemUKKwkJCSAqLworCQkJZnJhbWUgPSAoTkJVRiAqKSBwUmJkLT5kYXRhUG9pbnRlcjsKKwkJCWZyYW1lX2xlbmd0aCA9IHBSYmQtPmRhdGFMZW5ndGggLSA0OworCisjaWYgKDApCisJCQl7CisJCQkJaW50IGk7CisKKwkJCQlwcmludGYgKCJyZWN2IGRhdGEgaGRyOiIpOworCQkJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQorCQkJCQlwcmludGYgKCIleCAiLCAqKGZyYW1lLT5oZWFkICsgaSkpOworCQkJCXByaW50ZiAoIlxuIik7CisJCQl9CisjZW5kaWYKKwkJCS8qCisJCQkgKiAgRmlsbCB0aGUgYnVmZmVyIGFuZCBwYXNzIGl0IHRvIHVwcGVyIGxheWVycworCQkJICovCisvKgkJCW1lbWNweShidWZmLCBmcmFtZS0+aGVhZCwgMTQpOworCQkJbWVtY3B5KGJ1ZmYgKyAxNCwgZnJhbWUtPmRhdGEsIGZyYW1lX2xlbmd0aCk7Ki8KKwkJCU5ldFJlY2VpdmUgKCh2b2xhdGlsZSB1Y2hhciAqKSBwUmJkLT5kYXRhUG9pbnRlciwKKwkJCQkgICAgZnJhbWVfbGVuZ3RoKTsKKwkJCWxlbiA9IGZyYW1lX2xlbmd0aDsKKwkJfQorCQkvKgorCQkgKiBSZXNldCBidWZmZXIgZGVzY3JpcHRvciBhcyBlbXB0eQorCQkgKi8KKwkJbXBjODIyMF9mZWNfcmJkX2NsZWFuIChmZWMsIHBSYmQpOworCX0KKwlETUFfQ0xFQVJfSUVWRU5UIChGRUNfUkVDVl9UQVNLX05PKTsKKwlyZXR1cm4gbGVuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtcGM4MjIwX2ZlY19pbml0aWFsaXplIChiZF90ICogYmlzKQoreworCW1wYzgyMjBfZmVjX3ByaXYgKmZlYzsKKworI2lmZGVmIENPTkZJR19IQVNfRVRIMQorCW1wYzgyMjBfZmVjX3ByaXYgKmZlYzI7CisjZW5kaWYKKwlzdHJ1Y3QgZXRoX2RldmljZSAqZGV2OworCWNoYXIgKnRtcCwgKmVuZDsKKwljaGFyIGVudl9lbmV0YWRkcls2XTsKKworI2lmZGVmIENPTkZJR19IQVNfRVRIMQorCWNoYXIgZW52X2VuZXQxYWRkcls2XTsKKyNlbmRpZgorCWludCBpOworCisJZmVjID0gKG1wYzgyMjBfZmVjX3ByaXYgKikgbWFsbG9jIChzaXplb2YgKCpmZWMpKTsKKwlkZXYgPSAoc3RydWN0IGV0aF9kZXZpY2UgKikgbWFsbG9jIChzaXplb2YgKCpkZXYpKTsKKwltZW1zZXQgKGRldiwgMCwgc2l6ZW9mICpkZXYpOworCisJZmVjLT5ldGggPSAoZXRoZXJuZXRfcmVncyAqKSBNTUFQX0ZFQzE7CisjaWZkZWYgQ09ORklHX0hBU19FVEgxCisJZmVjMiA9IChtcGM4MjIwX2ZlY19wcml2ICopIG1hbGxvYyAoc2l6ZW9mICgqZmVjKSk7CisJZmVjMi0+ZXRoID0gKGV0aGVybmV0X3JlZ3MgKikgTU1BUF9GRUMyOworI2VuZGlmCisJZmVjLT50YmRCYXNlID0gKEZFQ19UQkQgKikgRkVDX0JEX0JBU0U7CisJZmVjLT5yYmRCYXNlID0KKwkJKEZFQ19SQkQgKikgKEZFQ19CRF9CQVNFICsgRkVDX1RCRF9OVU0gKiBzaXplb2YgKEZFQ19UQkQpKTsKKwlmZWMtPnhjdl90eXBlID0gTUlJMTAwOworCisJZGV2LT5wcml2ID0gKHZvaWQgKikgZmVjOworCWRldi0+aW9iYXNlID0gTU1BUF9GRUMxOworCWRldi0+aW5pdCA9IG1wYzgyMjBfZmVjX2luaXQ7CisJZGV2LT5oYWx0ID0gbXBjODIyMF9mZWNfaGFsdDsKKwlkZXYtPnNlbmQgPSBtcGM4MjIwX2ZlY19zZW5kOworCWRldi0+cmVjdiA9IG1wYzgyMjBfZmVjX3JlY3Y7CisKKwlzcHJpbnRmIChkZXYtPm5hbWUsICJGRUMgRVRIRVJORVQiKTsKKwlldGhfcmVnaXN0ZXIgKGRldik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCisJbWlpcGh5X3JlZ2lzdGVyIChkZXYtPm5hbWUsCisJCQlmZWM4MjIwX21paXBoeV9yZWFkLCBmZWM4MjIwX21paXBoeV93cml0ZSk7CisjZW5kaWYKKworCS8qCisJICogVHJ5IHRvIHNldCB0aGUgbWFjIGFkZHJlc3Mgbm93LiBUaGUgZmVjIG1hYyBhZGRyZXNzIGlzCisJICogYSBnYXJiYWdlIGFmdGVyIHJlc2V0LiBXaGVuIG5vdCB1c2luZyBmZWMgZm9yIGJvb3RpbmcKKwkgKiB0aGUgTGludXggZmVjIGRyaXZlciB3aWxsIHRyeSB0byB3b3JrIHdpdGggdGhpcyBnYXJiYWdlLgorCSAqLworCXRtcCA9IGdldGVudiAoImV0aGFkZHIiKTsKKwlpZiAodG1wKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCWVudl9lbmV0YWRkcltpXSA9CisJCQkJdG1wID8gc2ltcGxlX3N0cnRvdWwgKHRtcCwgJmVuZCwgMTYpIDogMDsKKwkJCWlmICh0bXApCisJCQkJdG1wID0gKCplbmQpID8gZW5kICsgMSA6IGVuZDsKKwkJfQorCQltcGM4MjIwX2ZlY19zZXRfaHdhZGRyIChmZWMsIGVudl9lbmV0YWRkcik7CisJfQorI2lmZGVmIENPTkZJR19IQVNfRVRIMQorCXRtcCA9IGdldGVudiAoImV0aDFhZGRyIik7CisJaWYgKHRtcCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQllbnZfZW5ldDFhZGRyW2ldID0KKwkJCQl0bXAgPyBzaW1wbGVfc3RydG91bCAodG1wLCAmZW5kLCAxNikgOiAwOworCQkJaWYgKHRtcCkKKwkJCQl0bXAgPSAoKmVuZCkgPyBlbmQgKyAxIDogZW5kOworCQl9CisJCW1wYzgyMjBfZmVjX3NldF9od2FkZHIgKGZlYzIsIGVudl9lbmV0MWFkZHIpOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKKy8qIE1JSS1pbnRlcmZhY2UgcmVsYXRlZCBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmZWM4MjIwX21paXBoeV9yZWFkIChjaGFyICpkZXZuYW1lLCB1OCBwaHlBZGRyLCB1OCByZWdBZGRyLCB1MTYgKiByZXRWYWwpCit7CisJZXRoZXJuZXRfcmVncyAqZXRoID0gKGV0aGVybmV0X3JlZ3MgKikgTU1BUF9GRUMxOworCXUzMiByZWc7CQkvKiBjb252ZW5pZW50IGhvbGRlciBmb3IgdGhlIFBIWSByZWdpc3RlciAqLworCXUzMiBwaHk7CQkvKiBjb252ZW5pZW50IGhvbGRlciBmb3IgdGhlIFBIWSAqLworCWludCB0aW1lb3V0ID0gMHhmZmZmOworCisJLyoKKwkgKiByZWFkaW5nIGZyb20gYW55IFBIWSdzIHJlZ2lzdGVyIGlzIGRvbmUgYnkgcHJvcGVybHkKKwkgKiBwcm9ncmFtbWluZyB0aGUgRkVDJ3MgTUlJIGRhdGEgcmVnaXN0ZXIuCisJICovCisJcmVnID0gcmVnQWRkciA8PCBGRUNfTUlJX0RBVEFfUkFfU0hJRlQ7CisJcGh5ID0gcGh5QWRkciA8PCBGRUNfTUlJX0RBVEFfUEFfU0hJRlQ7CisKKwlldGgtPm1paV9kYXRhID0KKwkJKEZFQ19NSUlfREFUQV9TVCB8IEZFQ19NSUlfREFUQV9PUF9SRCB8IEZFQ19NSUlfREFUQV9UQSB8IHBoeQorCQkgfCByZWcpOworCisJLyoKKwkgKiB3YWl0IGZvciB0aGUgcmVsYXRlZCBpbnRlcnJ1cHQKKwkgKi8KKwl3aGlsZSAoKHRpbWVvdXQtLSkgJiYgKCEoZXRoLT5pZXZlbnQgJiAweDAwODAwMDAwKSkpOworCisJaWYgKHRpbWVvdXQgPT0gMCkgeworI2lmZGVmIERFQlVHCisJCXByaW50ZiAoIlJlYWQgTURJTyBmYWlsZWQuLi5cbiIpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIGNsZWFyIG1paSBpbnRlcnJ1cHQgYml0CisJICovCisJZXRoLT5pZXZlbnQgPSAweDAwODAwMDAwOworCisJLyoKKwkgKiBpdCdzIG5vdyBzYWZlIHRvIHJlYWQgdGhlIFBIWSdzIHJlZ2lzdGVyCisJICovCisJKnJldFZhbCA9ICh1MTYpIGV0aC0+bWlpX2RhdGE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGZlYzgyMjBfbWlpcGh5X3dyaXRlIChjaGFyICpkZXZuYW1lLCB1OCBwaHlBZGRyLCB1OCByZWdBZGRyLCB1MTYgZGF0YSkKK3sKKwlldGhlcm5ldF9yZWdzICpldGggPSAoZXRoZXJuZXRfcmVncyAqKSBNTUFQX0ZFQzE7CisJdTMyIHJlZzsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZIHJlZ2lzdGVyICovCisJdTMyIHBoeTsJCS8qIGNvbnZlbmllbnQgaG9sZGVyIGZvciB0aGUgUEhZICovCisJaW50IHRpbWVvdXQgPSAweGZmZmY7CisKKwlyZWcgPSByZWdBZGRyIDw8IEZFQ19NSUlfREFUQV9SQV9TSElGVDsKKwlwaHkgPSBwaHlBZGRyIDw8IEZFQ19NSUlfREFUQV9QQV9TSElGVDsKKworCWV0aC0+bWlpX2RhdGEgPSAoRkVDX01JSV9EQVRBX1NUIHwgRkVDX01JSV9EQVRBX09QX1dSIHwKKwkJCSBGRUNfTUlJX0RBVEFfVEEgfCBwaHkgfCByZWcgfCBkYXRhKTsKKworCS8qCisJICogd2FpdCBmb3IgdGhlIE1JSSBpbnRlcnJ1cHQKKwkgKi8KKwl3aGlsZSAoKHRpbWVvdXQtLSkgJiYgKCEoZXRoLT5pZXZlbnQgJiAweDAwODAwMDAwKSkpOworCisJaWYgKHRpbWVvdXQgPT0gMCkgeworI2lmZGVmIERFQlVHCisJCXByaW50ZiAoIldyaXRlIE1ESU8gZmFpbGVkLi4uXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBjbGVhciBNSUkgaW50ZXJydXB0IGJpdAorCSAqLworCWV0aC0+aWV2ZW50ID0gMHgwMDgwMDAwMDsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgREVCVUcKK3N0YXRpYyB1MzIgbG9jYWxfY3JjMzIgKGNoYXIgKnN0cmluZywgdW5zaWduZWQgaW50IGNyY192YWx1ZSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwljaGFyIGM7CisJdW5zaWduZWQgaW50IGNyYywgY291bnQ7CisKKwkvKgorCSAqIGNyYzMyIGFsZ29yaXRobQorCSAqLworCS8qCisJICogY3JjID0gMHhmZmZmZmZmZjsgKiBUaGUgaW5pdGlhbGl6ZWQgdmFsdWUgc2hvdWxkIGJlIDB4ZmZmZmZmZmYKKwkgKi8KKwljcmMgPSBjcmNfdmFsdWU7CisKKwlmb3IgKGkgPSBsZW47IC0taSA+PSAwOykgeworCQljID0gKnN0cmluZysrOworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCA4OyBjb3VudCsrKSB7CisJCQlpZiAoKGMgJiAweDAxKSBeIChjcmMgJiAweDAxKSkgeworCQkJCWNyYyA+Pj0gMTsKKwkJCQljcmMgPSBjcmMgXiAweGVkYjg4MzIwOworCQkJfSBlbHNlIHsKKwkJCQljcmMgPj49IDE7CisJCQl9CisJCQljID4+PSAxOworCQl9CisJfQorCisJLyoKKwkgKiBJbiBiaWcgZW5kaWFuIHN5c3RlbSwgZG8gYnl0ZSBzd2FwaW5nIGZvciBjcmMgdmFsdWUKKwkgKi8KKwlyZXR1cm4gY3JjOworfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNlbmRpZiAvKiBDT05GSUdfTVBDODIyMF9GRUMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9mZWMuaCBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9mZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODkyN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2ZlYy5oCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzLTIwMDQKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIG1wYzQyMDBmZWMuaAorICogKEMpIENvcHlyaWdodCBNb3Rvcm9sYSwgSW5jLiwgMjAwMAorICoKKyAqIG9kaW4gZXRoZXJuZXQgaGVhZGVyIGZpbGUKKyAqLworCisjaWZuZGVmIF9fTVBDODIyMF9GRUNfSAorI2RlZmluZSBfX01QQzgyMjBfRkVDX0gKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzgyMjAuaD4KKyNpbmNsdWRlICJkbWEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgZXRoZXJuZXRfcmVnaXN0ZXJfc2V0IHsKKworLyogWzEwOjJdYWRkciA9IDAwICovCisKKy8qICBDb250cm9sIGFuZCBzdGF0dXMgUmVnaXN0ZXJzIChvZmZzZXQgMDAwLTFGRikgKi8KKworCXZvbGF0aWxlIHUzMiBmZWNfaWQ7CQkvKiBNQkFSX0VUSCArIDB4MDAwICovCisJdm9sYXRpbGUgdTMyIGlldmVudDsJCS8qIE1CQVJfRVRIICsgMHgwMDQgKi8KKwl2b2xhdGlsZSB1MzIgaW1hc2s7CQkvKiBNQkFSX0VUSCArIDB4MDA4ICovCisKKwl2b2xhdGlsZSB1MzIgUkVTMFsxXTsJCS8qIE1CQVJfRVRIICsgMHgwMEMgKi8KKwl2b2xhdGlsZSB1MzIgcl9kZXNfYWN0aXZlOwkvKiBNQkFSX0VUSCArIDB4MDEwICovCisJdm9sYXRpbGUgdTMyIHhfZGVzX2FjdGl2ZTsJLyogTUJBUl9FVEggKyAweDAxNCAqLworCXZvbGF0aWxlIHUzMiByX2Rlc19hY3RpdmVfY2w7CS8qIE1CQVJfRVRIICsgMHgwMTggKi8KKwl2b2xhdGlsZSB1MzIgeF9kZXNfYWN0aXZlX2NsOwkvKiBNQkFSX0VUSCArIDB4MDFDICovCisJdm9sYXRpbGUgdTMyIGl2ZW50X3NldDsJCS8qIE1CQVJfRVRIICsgMHgwMjAgKi8KKwl2b2xhdGlsZSB1MzIgZWNudHJsOwkJLyogTUJBUl9FVEggKyAweDAyNCAqLworCisJdm9sYXRpbGUgdTMyIFJFUzFbNl07CQkvKiBNQkFSX0VUSCArIDB4MDI4LTAzQyAqLworCXZvbGF0aWxlIHUzMiBtaWlfZGF0YTsJCS8qIE1CQVJfRVRIICsgMHgwNDAgKi8KKwl2b2xhdGlsZSB1MzIgbWlpX3NwZWVkOwkJLyogTUJBUl9FVEggKyAweDA0NCAqLworCXZvbGF0aWxlIHUzMiBtaWlfc3RhdHVzOwkvKiBNQkFSX0VUSCArIDB4MDQ4ICovCisKKwl2b2xhdGlsZSB1MzIgUkVTMls1XTsJCS8qIE1CQVJfRVRIICsgMHgwNEMtMDVDICovCisJdm9sYXRpbGUgdTMyIG1pYl9kYXRhOwkJLyogTUJBUl9FVEggKyAweDA2MCAqLworCXZvbGF0aWxlIHUzMiBtaWJfY29udHJvbDsJLyogTUJBUl9FVEggKyAweDA2NCAqLworCisJdm9sYXRpbGUgdTMyIFJFUzNbNl07CQkvKiBNQkFSX0VUSCArIDB4MDY4LTdDICovCisJdm9sYXRpbGUgdTMyIHJfYWN0aXZhdGU7CS8qIE1CQVJfRVRIICsgMHgwODAgKi8KKwl2b2xhdGlsZSB1MzIgcl9jbnRybDsJCS8qIE1CQVJfRVRIICsgMHgwODQgKi8KKwl2b2xhdGlsZSB1MzIgcl9oYXNoOwkJLyogTUJBUl9FVEggKyAweDA4OCAqLworCXZvbGF0aWxlIHUzMiByX2RhdGE7CQkvKiBNQkFSX0VUSCArIDB4MDhDICovCisJdm9sYXRpbGUgdTMyIGFyX2RvbmU7CQkvKiBNQkFSX0VUSCArIDB4MDkwICovCisJdm9sYXRpbGUgdTMyIHJfdGVzdDsJCS8qIE1CQVJfRVRIICsgMHgwOTQgKi8KKwl2b2xhdGlsZSB1MzIgcl9taWI7CQkvKiBNQkFSX0VUSCArIDB4MDk4ICovCisJdm9sYXRpbGUgdTMyIHJfZGFfbG93OwkJLyogTUJBUl9FVEggKyAweDA5QyAqLworCXZvbGF0aWxlIHUzMiByX2RhX2hpZ2g7CQkvKiBNQkFSX0VUSCArIDB4MEEwICovCisKKwl2b2xhdGlsZSB1MzIgUkVTNFs3XTsJCS8qIE1CQVJfRVRIICsgMHgwQTQtMEJDICovCisJdm9sYXRpbGUgdTMyIHhfYWN0aXZhdGU7CS8qIE1CQVJfRVRIICsgMHgwQzAgKi8KKwl2b2xhdGlsZSB1MzIgeF9jbnRybDsJCS8qIE1CQVJfRVRIICsgMHgwQzQgKi8KKwl2b2xhdGlsZSB1MzIgYmFja29mZjsJCS8qIE1CQVJfRVRIICsgMHgwQzggKi8KKwl2b2xhdGlsZSB1MzIgeF9kYXRhOwkJLyogTUJBUl9FVEggKyAweDBDQyAqLworCXZvbGF0aWxlIHUzMiB4X3N0YXR1czsJCS8qIE1CQVJfRVRIICsgMHgwRDAgKi8KKwl2b2xhdGlsZSB1MzIgeF9taWI7CQkvKiBNQkFSX0VUSCArIDB4MEQ0ICovCisJdm9sYXRpbGUgdTMyIHhfdGVzdDsJCS8qIE1CQVJfRVRIICsgMHgwRDggKi8KKwl2b2xhdGlsZSB1MzIgZmR4ZmNfZGExOwkJLyogTUJBUl9FVEggKyAweDBEQyAqLworCXZvbGF0aWxlIHUzMiBmZHhmY19kYTI7CQkvKiBNQkFSX0VUSCArIDB4MEUwICovCisJdm9sYXRpbGUgdTMyIHBhZGRyMTsJCS8qIE1CQVJfRVRIICsgMHgwRTQgKi8KKwl2b2xhdGlsZSB1MzIgcGFkZHIyOwkJLyogTUJBUl9FVEggKyAweDBFOCAqLworCXZvbGF0aWxlIHUzMiBvcF9wYXVzZTsJCS8qIE1CQVJfRVRIICsgMHgwRUMgKi8KKworCXZvbGF0aWxlIHUzMiBSRVM1WzRdOwkJLyogTUJBUl9FVEggKyAweDBGMC0wRkMgKi8KKwl2b2xhdGlsZSB1MzIgaW5zdHJfcmVnOwkJLyogTUJBUl9FVEggKyAweDEwMCAqLworCXZvbGF0aWxlIHUzMiBjb250ZXh0X3JlZzsJLyogTUJBUl9FVEggKyAweDEwNCAqLworCXZvbGF0aWxlIHUzMiB0ZXN0X2NudHJsOwkvKiBNQkFSX0VUSCArIDB4MTA4ICovCisJdm9sYXRpbGUgdTMyIGFjY19yZWc7CQkvKiBNQkFSX0VUSCArIDB4MTBDICovCisJdm9sYXRpbGUgdTMyIG9uZXM7CQkvKiBNQkFSX0VUSCArIDB4MTEwICovCisJdm9sYXRpbGUgdTMyIHplcm9zOwkJLyogTUJBUl9FVEggKyAweDExNCAqLworCXZvbGF0aWxlIHUzMiBpYWRkcjE7CQkvKiBNQkFSX0VUSCArIDB4MTE4ICovCisJdm9sYXRpbGUgdTMyIGlhZGRyMjsJCS8qIE1CQVJfRVRIICsgMHgxMUMgKi8KKwl2b2xhdGlsZSB1MzIgZ2FkZHIxOwkJLyogTUJBUl9FVEggKyAweDEyMCAqLworCXZvbGF0aWxlIHUzMiBnYWRkcjI7CQkvKiBNQkFSX0VUSCArIDB4MTI0ICovCisJdm9sYXRpbGUgdTMyIHJhbmRvbTsJCS8qIE1CQVJfRVRIICsgMHgxMjggKi8KKwl2b2xhdGlsZSB1MzIgcmFuZDE7CQkvKiBNQkFSX0VUSCArIDB4MTJDICovCisJdm9sYXRpbGUgdTMyIHRtcDsJCS8qIE1CQVJfRVRIICsgMHgxMzAgKi8KKworCXZvbGF0aWxlIHUzMiBSRVM2WzNdOwkJLyogTUJBUl9FVEggKyAweDEzNC0xM0MgKi8KKwl2b2xhdGlsZSB1MzIgZmlmb19pZDsJCS8qIE1CQVJfRVRIICsgMHgxNDAgKi8KKwl2b2xhdGlsZSB1MzIgeF93bXJrOwkJLyogTUJBUl9FVEggKyAweDE0NCAqLworCXZvbGF0aWxlIHUzMiBmY250cmw7CQkvKiBNQkFSX0VUSCArIDB4MTQ4ICovCisJdm9sYXRpbGUgdTMyIHJfYm91bmQ7CQkvKiBNQkFSX0VUSCArIDB4MTRDICovCisJdm9sYXRpbGUgdTMyIHJfZnN0YXJ0OwkJLyogTUJBUl9FVEggKyAweDE1MCAqLworCXZvbGF0aWxlIHUzMiByX2NvdW50OwkJLyogTUJBUl9FVEggKyAweDE1NCAqLworCXZvbGF0aWxlIHUzMiByX2xhZzsJCS8qIE1CQVJfRVRIICsgMHgxNTggKi8KKwl2b2xhdGlsZSB1MzIgcl9yZWFkOwkJLyogTUJBUl9FVEggKyAweDE1QyAqLworCXZvbGF0aWxlIHUzMiByX3dyaXRlOwkJLyogTUJBUl9FVEggKyAweDE2MCAqLworCXZvbGF0aWxlIHUzMiB4X2NvdW50OwkJLyogTUJBUl9FVEggKyAweDE2NCAqLworCXZvbGF0aWxlIHUzMiB4X2xhZzsJCS8qIE1CQVJfRVRIICsgMHgxNjggKi8KKwl2b2xhdGlsZSB1MzIgeF9yZXRyeTsJCS8qIE1CQVJfRVRIICsgMHgxNkMgKi8KKwl2b2xhdGlsZSB1MzIgeF93cml0ZTsJCS8qIE1CQVJfRVRIICsgMHgxNzAgKi8KKwl2b2xhdGlsZSB1MzIgeF9yZWFkOwkJLyogTUJBUl9FVEggKyAweDE3NCAqLworCisJdm9sYXRpbGUgdTMyIFJFUzdbMl07CQkvKiBNQkFSX0VUSCArIDB4MTc4LTE3QyAqLworCXZvbGF0aWxlIHUzMiBmbV9jbnRybDsJCS8qIE1CQVJfRVRIICsgMHgxODAgKi8KKwl2b2xhdGlsZSB1MzIgcmZpZm9fZGF0YTsJLyogTUJBUl9FVEggKyAweDE4NCAqLworCXZvbGF0aWxlIHUzMiByZmlmb19zdGF0dXM7CS8qIE1CQVJfRVRIICsgMHgxODggKi8KKwl2b2xhdGlsZSB1MzIgcmZpZm9fY250cmw7CS8qIE1CQVJfRVRIICsgMHgxOEMgKi8KKwl2b2xhdGlsZSB1MzIgcmZpZm9fbHJmX3B0cjsJLyogTUJBUl9FVEggKyAweDE5MCAqLworCXZvbGF0aWxlIHUzMiByZmlmb19sd2ZfcHRyOwkvKiBNQkFSX0VUSCArIDB4MTk0ICovCisJdm9sYXRpbGUgdTMyIHJmaWZvX2FsYXJtOwkvKiBNQkFSX0VUSCArIDB4MTk4ICovCisJdm9sYXRpbGUgdTMyIHJmaWZvX3JkcHRyOwkvKiBNQkFSX0VUSCArIDB4MTlDICovCisJdm9sYXRpbGUgdTMyIHJmaWZvX3dycHRyOwkvKiBNQkFSX0VUSCArIDB4MUEwICovCisJdm9sYXRpbGUgdTMyIHRmaWZvX2RhdGE7CS8qIE1CQVJfRVRIICsgMHgxQTQgKi8KKwl2b2xhdGlsZSB1MzIgdGZpZm9fc3RhdHVzOwkvKiBNQkFSX0VUSCArIDB4MUE4ICovCisJdm9sYXRpbGUgdTMyIHRmaWZvX2NudHJsOwkvKiBNQkFSX0VUSCArIDB4MUFDICovCisJdm9sYXRpbGUgdTMyIHRmaWZvX2xyZl9wdHI7CS8qIE1CQVJfRVRIICsgMHgxQjAgKi8KKwl2b2xhdGlsZSB1MzIgdGZpZm9fbHdmX3B0cjsJLyogTUJBUl9FVEggKyAweDFCNCAqLworCXZvbGF0aWxlIHUzMiB0Zmlmb19hbGFybTsJLyogTUJBUl9FVEggKyAweDFCOCAqLworCXZvbGF0aWxlIHUzMiB0Zmlmb19yZHB0cjsJLyogTUJBUl9FVEggKyAweDFCQyAqLworCXZvbGF0aWxlIHUzMiB0Zmlmb193cnB0cjsJLyogTUJBUl9FVEggKyAweDFDMCAqLworCisJdm9sYXRpbGUgdTMyIHJlc2V0X2NudHJsOwkvKiBNQkFSX0VUSCArIDB4MUM0ICovCisJdm9sYXRpbGUgdTMyIHhtaXRfZnNtOwkJLyogTUJBUl9FVEggKyAweDFDOCAqLworCisJdm9sYXRpbGUgdTMyIFJFUzhbM107CQkvKiBNQkFSX0VUSCArIDB4MUNDLTFENCAqLworCXZvbGF0aWxlIHUzMiByZGVzX2RhdGEwOwkvKiBNQkFSX0VUSCArIDB4MUQ4ICovCisJdm9sYXRpbGUgdTMyIHJkZXNfZGF0YTE7CS8qIE1CQVJfRVRIICsgMHgxREMgKi8KKwl2b2xhdGlsZSB1MzIgcl9sZW5ndGg7CQkvKiBNQkFSX0VUSCArIDB4MUUwICovCisJdm9sYXRpbGUgdTMyIHhfbGVuZ3RoOwkJLyogTUJBUl9FVEggKyAweDFFNCAqLworCXZvbGF0aWxlIHUzMiB4X2FkZHI7CQkvKiBNQkFSX0VUSCArIDB4MUU4ICovCisJdm9sYXRpbGUgdTMyIGNkZXNfZGF0YTsJCS8qIE1CQVJfRVRIICsgMHgxRUMgKi8KKwl2b2xhdGlsZSB1MzIgc3RhdHVzOwkJLyogTUJBUl9FVEggKyAweDFGMCAqLworCXZvbGF0aWxlIHUzMiBkbWFfY29udHJvbDsJLyogTUJBUl9FVEggKyAweDFGNCAqLworCXZvbGF0aWxlIHUzMiBkZXNfY21uZDsJCS8qIE1CQVJfRVRIICsgMHgxRjggKi8KKwl2b2xhdGlsZSB1MzIgZGF0YTsJCS8qIE1CQVJfRVRIICsgMHgxRkMgKi8KKworCS8qICBNSUIgQ09VTlRFUlMgKE9mZnNldCAyMDAtMkZGKSAqLworCisJdm9sYXRpbGUgdTMyIHJtb25fdF9kcm9wOwkvKiBNQkFSX0VUSCArIDB4MjAwICovCisJdm9sYXRpbGUgdTMyIHJtb25fdF9wYWNrZXRzOwkvKiBNQkFSX0VUSCArIDB4MjA0ICovCisJdm9sYXRpbGUgdTMyIHJtb25fdF9iY19wa3Q7CS8qIE1CQVJfRVRIICsgMHgyMDggKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl90X21jX3BrdDsJLyogTUJBUl9FVEggKyAweDIwQyAqLworCXZvbGF0aWxlIHUzMiBybW9uX3RfY3JjX2FsaWduOwkvKiBNQkFSX0VUSCArIDB4MjEwICovCisJdm9sYXRpbGUgdTMyIHJtb25fdF91bmRlcnNpemU7CS8qIE1CQVJfRVRIICsgMHgyMTQgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl90X292ZXJzaXplOwkvKiBNQkFSX0VUSCArIDB4MjE4ICovCisJdm9sYXRpbGUgdTMyIHJtb25fdF9mcmFnOwkvKiBNQkFSX0VUSCArIDB4MjFDICovCisJdm9sYXRpbGUgdTMyIHJtb25fdF9qYWI7CS8qIE1CQVJfRVRIICsgMHgyMjAgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl90X2NvbDsJLyogTUJBUl9FVEggKyAweDIyNCAqLworCXZvbGF0aWxlIHUzMiBybW9uX3RfcDY0OwkvKiBNQkFSX0VUSCArIDB4MjI4ICovCisJdm9sYXRpbGUgdTMyIHJtb25fdF9wNjV0bzEyNzsJLyogTUJBUl9FVEggKyAweDIyQyAqLworCXZvbGF0aWxlIHUzMiBybW9uX3RfcDEyOHRvMjU1OwkvKiBNQkFSX0VUSCArIDB4MjMwICovCisJdm9sYXRpbGUgdTMyIHJtb25fdF9wMjU2dG81MTE7CS8qIE1CQVJfRVRIICsgMHgyMzQgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl90X3A1MTJ0bzEwMjM7CS8qIE1CQVJfRVRIICsgMHgyMzggKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl90X3AxMDI0dG8yMDQ3Oy8qIE1CQVJfRVRIICsgMHgyM0MgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl90X3BfZ3RlMjA0ODsJLyogTUJBUl9FVEggKyAweDI0MCAqLworCXZvbGF0aWxlIHUzMiBybW9uX3Rfb2N0ZXRzOwkvKiBNQkFSX0VUSCArIDB4MjQ0ICovCisJdm9sYXRpbGUgdTMyIGllZWVfdF9kcm9wOwkvKiBNQkFSX0VUSCArIDB4MjQ4ICovCisJdm9sYXRpbGUgdTMyIGllZWVfdF9mcmFtZV9vazsJLyogTUJBUl9FVEggKyAweDI0QyAqLworCXZvbGF0aWxlIHUzMiBpZWVlX3RfMWNvbDsJLyogTUJBUl9FVEggKyAweDI1MCAqLworCXZvbGF0aWxlIHUzMiBpZWVlX3RfbWNvbDsJLyogTUJBUl9FVEggKyAweDI1NCAqLworCXZvbGF0aWxlIHUzMiBpZWVlX3RfZGVmOwkvKiBNQkFSX0VUSCArIDB4MjU4ICovCisJdm9sYXRpbGUgdTMyIGllZWVfdF9sY29sOwkvKiBNQkFSX0VUSCArIDB4MjVDICovCisJdm9sYXRpbGUgdTMyIGllZWVfdF9leGNvbDsJLyogTUJBUl9FVEggKyAweDI2MCAqLworCXZvbGF0aWxlIHUzMiBpZWVlX3RfbWFjZXJyOwkvKiBNQkFSX0VUSCArIDB4MjY0ICovCisJdm9sYXRpbGUgdTMyIGllZWVfdF9jc2VycjsJLyogTUJBUl9FVEggKyAweDI2OCAqLworCXZvbGF0aWxlIHUzMiBpZWVlX3Rfc3FlOwkvKiBNQkFSX0VUSCArIDB4MjZDICovCisJdm9sYXRpbGUgdTMyIHRfZmR4ZmM7CQkvKiBNQkFSX0VUSCArIDB4MjcwICovCisJdm9sYXRpbGUgdTMyIGllZWVfdF9vY3RldHNfb2s7CS8qIE1CQVJfRVRIICsgMHgyNzQgKi8KKworCXZvbGF0aWxlIHUzMiBSRVM5WzJdOwkJLyogTUJBUl9FVEggKyAweDI3OC0yN0MgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl9yX2Ryb3A7CS8qIE1CQVJfRVRIICsgMHgyODAgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl9yX3BhY2tldHM7CS8qIE1CQVJfRVRIICsgMHgyODQgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl9yX2JjX3BrdDsJLyogTUJBUl9FVEggKyAweDI4OCAqLworCXZvbGF0aWxlIHUzMiBybW9uX3JfbWNfcGt0OwkvKiBNQkFSX0VUSCArIDB4MjhDICovCisJdm9sYXRpbGUgdTMyIHJtb25fcl9jcmNfYWxpZ247CS8qIE1CQVJfRVRIICsgMHgyOTAgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl9yX3VuZGVyc2l6ZTsJLyogTUJBUl9FVEggKyAweDI5NCAqLworCXZvbGF0aWxlIHUzMiBybW9uX3Jfb3ZlcnNpemU7CS8qIE1CQVJfRVRIICsgMHgyOTggKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl9yX2ZyYWc7CS8qIE1CQVJfRVRIICsgMHgyOUMgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl9yX2phYjsJLyogTUJBUl9FVEggKyAweDJBMCAqLworCisJdm9sYXRpbGUgdTMyIHJtb25fcl9yZXN2ZF8wOwkvKiBNQkFSX0VUSCArIDB4MkE0ICovCisKKwl2b2xhdGlsZSB1MzIgcm1vbl9yX3A2NDsJLyogTUJBUl9FVEggKyAweDJBOCAqLworCXZvbGF0aWxlIHUzMiBybW9uX3JfcDY1dG8xMjc7CS8qIE1CQVJfRVRIICsgMHgyQUMgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl9yX3AxMjh0bzI1NTsJLyogTUJBUl9FVEggKyAweDJCMCAqLworCXZvbGF0aWxlIHUzMiBybW9uX3JfcDI1NnRvNTExOwkvKiBNQkFSX0VUSCArIDB4MkI0ICovCisJdm9sYXRpbGUgdTMyIHJtb25fcl9wNTEydG8xMDIzOwkvKiBNQkFSX0VUSCArIDB4MkI4ICovCisJdm9sYXRpbGUgdTMyIHJtb25fcl9wMTAyNHRvMjA0NzsvKiBNQkFSX0VUSCArIDB4MkJDICovCisJdm9sYXRpbGUgdTMyIHJtb25fcl9wX2d0ZTIwNDg7CS8qIE1CQVJfRVRIICsgMHgyQzAgKi8KKwl2b2xhdGlsZSB1MzIgcm1vbl9yX29jdGV0czsJLyogTUJBUl9FVEggKyAweDJDNCAqLworCXZvbGF0aWxlIHUzMiBpZWVlX3JfZHJvcDsJLyogTUJBUl9FVEggKyAweDJDOCAqLworCXZvbGF0aWxlIHUzMiBpZWVlX3JfZnJhbWVfb2s7CS8qIE1CQVJfRVRIICsgMHgyQ0MgKi8KKwl2b2xhdGlsZSB1MzIgaWVlZV9yX2NyYzsJLyogTUJBUl9FVEggKyAweDJEMCAqLworCXZvbGF0aWxlIHUzMiBpZWVlX3JfYWxpZ247CS8qIE1CQVJfRVRIICsgMHgyRDQgKi8KKwl2b2xhdGlsZSB1MzIgcl9tYWNlcnI7CQkvKiBNQkFSX0VUSCArIDB4MkQ4ICovCisJdm9sYXRpbGUgdTMyIHJfZmR4ZmM7CQkvKiBNQkFSX0VUSCArIDB4MkRDICovCisJdm9sYXRpbGUgdTMyIGllZWVfcl9vY3RldHNfb2s7CS8qIE1CQVJfRVRIICsgMHgyRTAgKi8KKworCXZvbGF0aWxlIHUzMiBSRVMxMFs2XTsJCS8qIE1CQVJfRVRIICsgMHgyRTQtMkZDICovCisKKwl2b2xhdGlsZSB1MzIgUkVTMTFbNjRdOwkJLyogTUJBUl9FVEggKyAweDMwMC0zRkYgKi8KK30gZXRoZXJuZXRfcmVnczsKKworLyogUmVjZWl2ZSAmIFRyYW5zbWl0IEJ1ZmZlciBEZXNjcmlwdG9yIGRlZmluaXRpb25zICovCit0eXBlZGVmIHN0cnVjdCBCdWZmZXJEZXNjcmlwdG9yIHsKKwl1MTYgc3RhdHVzOworCXUxNiBkYXRhTGVuZ3RoOworCXUzMiBkYXRhUG9pbnRlcjsKK30gRkVDX1JCRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBzdGF0dXM7CisJdTE2IGRhdGFMZW5ndGg7CisJdTMyIGRhdGFQb2ludGVyOworfSBGRUNfVEJEOworCisvKiBwcml2YXRlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBlbnVtIHsKKwlTRVZFTldJUkUsCQkvKiA3LXdpcmUgICAgICAgKi8KKwlNSUkxMCwJCQkvKiBNSUkgMTBNYnBzICAgKi8KKwlNSUkxMDAJCQkvKiBNSUkgMTAwTWJwcyAgKi8KK30geGNlaXZlcl90eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisJZXRoZXJuZXRfcmVncyAqZXRoOworCXhjZWl2ZXJfdHlwZSB4Y3ZfdHlwZTsJLyogdHJhbnNjZWl2ZXIgdHlwZSAqLworCUZFQ19SQkQgKnJiZEJhc2U7CS8qIFJCRCByaW5nICovCisJRkVDX1RCRCAqdGJkQmFzZTsJLyogVEJEIHJpbmcgKi8KKwl1MTYgcmJkSW5kZXg7CQkvKiBuZXh0IHJlY2VpdmUgQkQgdG8gcmVhZCAqLworCXUxNiB0YmRJbmRleDsJCS8qIG5leHQgdHJhbnNtaXQgQkQgdG8gc2VuZCAqLworCXUxNiB1c2VkVGJkSW5kZXg7CS8qIG5leHQgdHJhbnNtaXQgQkQgdG8gY2xlYW4gKi8KKwl1MTYgY2xlYW5UYmROdW07CS8qIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHRyYW5zbWl0IEJEcyAqLworfSBtcGM4MjIwX2ZlY19wcml2OworCisvKiBFdGhlcm5ldCBwYXJhbWV0ZXIgYXJlYSAqLworI2RlZmluZSBGRUNfVEJEX0JBU0UJICAgIChGRUNfUEFSQU1fQkFTRSArIDB4MDApCisjZGVmaW5lIEZFQ19UQkRfTkVYVAkgICAgKEZFQ19QQVJBTV9CQVNFICsgMHgwNCkKKyNkZWZpbmUgRkVDX1JCRF9CQVNFCSAgICAoRkVDX1BBUkFNX0JBU0UgKyAweDA4KQorI2RlZmluZSBGRUNfUkJEX05FWFQJICAgIChGRUNfUEFSQU1fQkFTRSArIDB4MGMpCisKKy8qIEJEIE51bWVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIEZFQ19UQkRfTlVNCSAgIDQ4CS8qIFRoZSB1c2VyIGNhbiBhZGp1c3QgdGhpcyB2YWx1ZSAqLworI2RlZmluZSBGRUNfUkJEX05VTQkgICAzMgkvKiBUaGUgdXNlciBjYW4gYWRqdXN0IHRoaXMgdmFsdWUgKi8KKworLyogcGFja2V0IHNpemUgbGltaXQgKi8KKyNkZWZpbmUgRkVDX01BWF9QS1RfU0laRSAgIDE1MzYKKworLyogUkJEIGJpdHMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRkVDX1JCRF9FTVBUWQkweDgwMDAJLyogQnVmZmVyIGlzIGVtcHR5ICovCisjZGVmaW5lIEZFQ19SQkRfV1JBUAkweDIwMDAJLyogTGFzdCBCRCBpbiByaW5nICovCisjZGVmaW5lIEZFQ19SQkRfSU5UCTB4MTAwMAkvKiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRkVDX1JCRF9MQVNUCTB4MDgwMAkvKiBCdWZmZXIgaXMgbGFzdCBpbiBmcmFtZSh1c2VsZXNzKSAqLworI2RlZmluZSBGRUNfUkJEX01JU1MJMHgwMTAwCS8qIE1pc3MgYml0IGZvciBwcm9tIG1vZGUgKi8KKyNkZWZpbmUgRkVDX1JCRF9CQwkweDAwODAJLyogVGhlIHJlY2VpdmVkIGZyYW1lIGlzIGJyb2FkY2FzdCBmcmFtZSAqLworI2RlZmluZSBGRUNfUkJEX01DCTB4MDA0MAkvKiBUaGUgcmVjZWl2ZWQgZnJhbWUgaXMgbXVsdGljYXN0IGZyYW1lICovCisjZGVmaW5lIEZFQ19SQkRfTEcJMHgwMDIwCS8qIEZyYW1lIGxlbmd0aCB2aW9sYXRpb24gKi8KKyNkZWZpbmUgRkVDX1JCRF9OTwkweDAwMTAJLyogTm9ub2N0ZXQgYWxpZ24gZnJhbWUgKi8KKyNkZWZpbmUgRkVDX1JCRF9TSAkweDAwMDgJLyogU2hvcnQgZnJhbWUgKi8KKyNkZWZpbmUgRkVDX1JCRF9DUgkweDAwMDQJLyogQ1JDIGVycm9yICovCisjZGVmaW5lIEZFQ19SQkRfT1YJMHgwMDAyCS8qIFJlY2VpdmUgRklGTyBvdmVycnVuICovCisjZGVmaW5lIEZFQ19SQkRfVFIJMHgwMDAxCS8qIEZyYW1lIGlzIHRydW5jYXRlZCAqLworI2RlZmluZSBGRUNfUkJEX0VSUgkoRkVDX1JCRF9MRyB8IEZFQ19SQkRfTk8gfCBGRUNfUkJEX0NSIHwgXAorCQkJIEZFQ19SQkRfT1YgfCBGRUNfUkJEX1RSKQorCisvKiBUQkQgYml0cyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBGRUNfVEJEX1JFQURZCTB4ODAwMAkvKiBCdWZmZXIgaXMgcmVhZHkgKi8KKyNkZWZpbmUgRkVDX1RCRF9XUkFQCTB4MjAwMAkvKiBMYXN0IEJEIGluIHJpbmcgKi8KKyNkZWZpbmUgRkVDX1RCRF9JTlQJMHgxMDAwCS8qIEludGVycnVwdCAqLworI2RlZmluZSBGRUNfVEJEX0xBU1QJMHgwODAwCS8qIEJ1ZmZlciBpcyBsYXN0IGluIGZyYW1lICovCisjZGVmaW5lIEZFQ19UQkRfVEMJMHgwNDAwCS8qIFRyYW5zbWl0IHRoZSBDUkMgKi8KKyNkZWZpbmUgRkVDX1RCRF9BQkMJMHgwMjAwCS8qIEFwcGVuZCBiYWQgQ1JDICovCisKKy8qIE1JSS1yZWxhdGVkIGRlZmluaXRpb3MgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX1NUCQkweDQwMDAwMDAwCS8qIFN0YXJ0IG9mIGZyYW1lIGRlbGltaXRlciAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfT1BfUkQJMHgyMDAwMDAwMAkvKiBQZXJmb3JtIGEgcmVhZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX09QX1dSCTB4MTAwMDAwMDAJLyogUGVyZm9ybSBhIHdyaXRlIG9wZXJhdGlvbiAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfUEFfTVNLCTB4MGY4MDAwMDAJLyogUEhZIEFkZHJlc3MgZmllbGQgbWFzayAqLworI2RlZmluZSBGRUNfTUlJX0RBVEFfUkFfTVNLCTB4MDA3YzAwMDAJLyogUEhZIFJlZ2lzdGVyIGZpZWxkIG1hc2sgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX1RBCQkweDAwMDIwMDAwCS8qIFR1cm5hcm91bmQgKi8KKyNkZWZpbmUgRkVDX01JSV9EQVRBX0RBVEFNU0sJMHgwMDAwZmZmZgkvKiBQSFkgZGF0YSBmaWVsZCAqLworCisjZGVmaW5lIEZFQ19NSUlfREFUQV9SQV9TSElGVAkxOAkvKiBNSUkgUmVnaXN0ZXIgYWRkcmVzcyBiaXRzICovCisjZGVmaW5lIEZFQ19NSUlfREFUQV9QQV9TSElGVAkyMwkvKiBNSUkgUEhZIGFkZHJlc3MgYml0cyAqLworCisjZW5kaWYgLyogX19NUEM4MjIwX0ZFQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvZmVjX2RtYV90YXNrcy5TIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2ZlY19kbWFfdGFza3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhhMDNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2ZlY19kbWFfdGFza3MuUwpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWljcm9jb2RlIGZvciB0aGUgRkVDIGNvbnRyb2xsZXIgb2YgdGhlIE1QQzgyMjAuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODIyMCkKKworLyogc2FzL3NjY2csIGdhcyB0YXJnZXQgKi8KKy5zZWN0aW9uICAgICAgICBzbWFydGRtYUluaXREYXRhLCJhdyIsQHByb2diaXRzCS8qIEluaXRpYWxpemVkIGRhdGEgZm9yIHRhc2sgdmFyaWFibGVzICovCisuc2VjdGlvbiAgICAgICAgc21hcnRkbWFUYXNrVGFibGUsImF3IixAcHJvZ2JpdHMJLyogVGFzayB0YWJsZXMgKi8KKy5hbGlnbiAgOQorLmdsb2JsIHRhc2tUYWJsZQordGFza1RhYmxlOgorLmdsb2JsIHNjRXRoZXJuZXRSZWN2X0VudHJ5CitzY0V0aGVybmV0UmVjdl9FbnRyeToJCS8qIFRhc2sgMCAqLworLmxvbmcgICBzY0V0aGVybmV0UmVjdl9URFQgLSB0YXNrVGFibGUJLyogVGFzayAwIERlc2NyaXB0b3IgVGFibGUgKi8KKy5sb25nICAgc2NFdGhlcm5ldFJlY3ZfVERUIC0gdGFza1RhYmxlICsgMHgwMDAwMDA5NAorLmxvbmcgICBzY0V0aGVybmV0UmVjdl9WYXJUYWIgLSB0YXNrVGFibGUJLyogVGFzayAwIFZhcmlhYmxlIFRhYmxlICovCisubG9uZyAgIHNjRXRoZXJuZXRSZWN2X0ZEVCAtIHRhc2tUYWJsZSArIDB4MDMJLyogVGFzayAwIEZ1bmN0aW9uIERlc2NyaXB0b3IgVGFibGUgJiBGbGFncyAqLworLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgc2NFdGhlcm5ldFJlY3ZfQ1NhdmUgLSB0YXNrVGFibGUJLyogVGFzayAwIGNvbnRleHQgc2F2ZSBzcGFjZSAqLworLmxvbmcgICAweGYwMDAwMDAwCisuZ2xvYmwgc2NFdGhlcm5ldFhtaXRfRW50cnkKK3NjRXRoZXJuZXRYbWl0X0VudHJ5OgkJLyogVGFzayAxICovCisubG9uZyAgIHNjRXRoZXJuZXRYbWl0X1REVCAtIHRhc2tUYWJsZQkvKiBUYXNrIDEgRGVzY3JpcHRvciBUYWJsZSAqLworLmxvbmcgICBzY0V0aGVybmV0WG1pdF9URFQgLSB0YXNrVGFibGUgKyAweDAwMDAwMGUwCisubG9uZyAgIHNjRXRoZXJuZXRYbWl0X1ZhclRhYiAtIHRhc2tUYWJsZQkvKiBUYXNrIDEgVmFyaWFibGUgVGFibGUgKi8KKy5sb25nICAgc2NFdGhlcm5ldFhtaXRfRkRUIC0gdGFza1RhYmxlICsgMHgwMwkvKiBUYXNrIDEgRnVuY3Rpb24gRGVzY3JpcHRvciBUYWJsZSAmIEZsYWdzICovCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICBzY0V0aGVybmV0WG1pdF9DU2F2ZSAtIHRhc2tUYWJsZQkvKiBUYXNrIDEgY29udGV4dCBzYXZlIHNwYWNlICovCisubG9uZyAgIDB4ZjAwMDAwMDAKKworCisuZ2xvYmwgc2NFdGhlcm5ldFJlY3ZfVERUCitzY0V0aGVybmV0UmVjdl9URFQ6CS8qIFRhc2sgMCBEZXNjcmlwdG9yIFRhYmxlICovCisubG9uZyAgIDB4YzRjNTAwMDAJLyogMDAwMCgxNTMpOiAgTENERVhUOiBpZHgwID0gdmFyOSArIHZhcjEwOyBpZHgwIG9uY2UgdmFyMDsgaWR4MCArPSBpbmMwICovCisubG9uZyAgIDB4ODRjNWUwMDAJLyogMDAwNCgxNTMpOiAgTENEOiBpZHgxID0gdmFyOSArIHZhcjExOyA7IGlkeDEgKz0gaW5jMCAqLworLmxvbmcgICAweDEwMDAxZjA4CS8qIDAwMDgoMTU2KTogICAgRFJEMUE6IHZhcjcgPSBpZHgxOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDEwMDAwMzgwCS8qIDAwMEMoMTU3KTogICAgRFJEMUE6IHZhcjAgPSAqaWR4MDsgRk49MCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMDAwMGY4OAkvKiAwMDEwKDE1OCk6ICAgIERSRDFBOiB2YXIzID0gKmlkeDE7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDgxOTgwMDAwCS8qIDAwMTQoMTYyKTogIExDRDogaWR4MCA9IHZhcjM7IGlkeDAgb25jZSB2YXIwOyBpZHgwICs9IGluYzAgKi8KKy5sb25nICAgMHgxMDAwMDc4MAkvKiAwMDE4KDE2NCk6ICAgIERSRDFBOiB2YXIxID0gKmlkeDA7IEZOPTAgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4NjAwMDAwMDAJLyogMDAxQygxNjUpOiAgICBEUkQyQTogRVUwPTAgRVUxPTAgRVUyPTAgRVUzPTAgRVhUIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMTBjZjA0YwkvKiAwMDIwKDE2NSk6ICAgIERSRDJCMTogdmFyNCA9IEVVMygpOyBFVTModmFyMSx2YXIxMikgICovCisubG9uZyAgIDB4ODIxODAzNDkJLyogMDAyNCgxNjkpOiAgTENEOiBpZHgwID0gdmFyNDsgaWR4MCAhPSB2YXIxMzsgaWR4MCArPSBpbmMxICovCisubG9uZyAgIDB4ODFjNjgwMDQJLyogMDAyOCgxNzIpOiAgICBMQ0Q6IGlkeDEgPSB2YXIzICsgdmFyMTMgKyA0OyBpZHgxIG9uY2UgdmFyMDsgaWR4MSArPSBpbmMwICovCisubG9uZyAgIDB4NzAwMDAwMDAJLyogMDAyQygxNzQpOiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MCBFWFQgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDE4Y2YwNGUJLyogMDAzMCgxNzQpOiAgICAgIERSRDJCMTogdmFyNiA9IEVVMygpOyBFVTModmFyMSx2YXIxNCkgICovCisubG9uZyAgIDB4NzAwMDAwMDAJLyogMDAzNCgxNzUpOiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MCBFWFQgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDIwY2YwNGYJLyogMDAzOCgxNzUpOiAgICAgIERSRDJCMTogdmFyOCA9IEVVMygpOyBFVTModmFyMSx2YXIxNSkgICovCisubG9uZyAgIDB4MDAwMDBiODgJLyogMDAzQygxNzYpOiAgICAgIERSRDFBOiB2YXIyID0gKmlkeDE7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDgwMDI1MTg0CS8qIDAwNDAoMjA1KTogICAgTENERVhUOiBpZHgxID0gMHhmMDAwOTE4NDsgOyAqLworLmxvbmcgICAweDg2ODEwNDEyCS8qIDAwNDQoMjA1KTogICAgTENEOiBpZHgyID0gdmFyMTMsIGlkeDMgPSB2YXIyOyBpZHgyIDwgdmFyMTY7IGlkeDIgKz0gaW5jMiwgaWR4MyArPSBpbmMyICovCisubG9uZyAgIDB4MDIwMGNmODgJLyogMDA0OCgyMDkpOiAgICAgIERSRDFBOiAqaWR4MyA9ICppZHgxOyBGTj0wIGluaXQ9MTYgV1M9MCBSUz0wICovCisubG9uZyAgIDB4ODAwMjUxODQJLyogMDA0QygyMTcpOiAgICBMQ0RFWFQ6IGlkeDEgPSAweGYwMDA5MTg0OyA7ICovCisubG9uZyAgIDB4ODY4MTg0NWIJLyogMDA1MCgyMTcpOiAgICBMQ0Q6IGlkeDIgPSB2YXIxMywgaWR4MyA9IHZhcjM7IGlkeDIgPCB2YXIxNzsgaWR4MiArPSBpbmMzLCBpZHgzICs9IGluYzMgKi8KKy5sb25nICAgMHgwMDAwY2Y4OAkvKiAwMDU0KDIyMSk6ICAgICAgRFJEMUE6ICppZHgzID0gKmlkeDE7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweGMzMTg4M2E0CS8qIDAwNTgoMjI1KTogICAgTENERVhUOiBpZHgxID0gdmFyNjsgaWR4MSA9PSB2YXIxNDsgaWR4MSArPSBpbmM0ICovCisubG9uZyAgIDB4ODAxOTAwMDAJLyogMDA1QygyMjUpOiAgICBMQ0Q6IGlkeDIgPSB2YXIwOyBpZHgyIG9uY2UgdmFyMDsgaWR4MiArPSBpbmMwICovCisubG9uZyAgIDB4MDQwMDg0NjgJLyogMDA2MCgyMjcpOiAgICAgIERSRDFBOiBpZHgxID0gdmFyMTM7IEZOPTAgSU5UIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHhjNDAzODM2MAkvKiAwMDY0KDIzMik6ICAgIExDREVYVDogaWR4MSA9IHZhcjgsIGlkeDIgPSB2YXI3OyBpZHgxID09IHZhcjEzOyBpZHgxICs9IGluYzQsIGlkeDIgKz0gaW5jMCAqLworLmxvbmcgICAweDgxYzUwMDAwCS8qIDAwNjgoMjMzKTogICAgTENEOiBpZHgzID0gdmFyMyArIHZhcjEwOyBpZHgzIG9uY2UgdmFyMDsgaWR4MyArPSBpbmMwICovCisubG9uZyAgIDB4MTAwMGNiMTgJLyogMDA2QygyMzUpOiAgICAgIERSRDFBOiAqaWR4MiA9IGlkeDM7IEZOPTAgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDAwMDBmMTgJLyogMDA3MCgyMzYpOiAgICAgIERSRDFBOiB2YXIzID0gaWR4MzsgRk49MCBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4YzQxODgzNmQJLyogMDA3NCgyMzgpOiAgICBMQ0RFWFQ6IGlkeDEgPSB2YXI4OyBpZHgxID4gdmFyMTM7IGlkeDEgKz0gaW5jNSAqLworLmxvbmcgICAweDgzOTkwMDAwCS8qIDAwNzgoMjM4KTogICAgTENEOiBpZHgyID0gdmFyNzsgaWR4MiBvbmNlIHZhcjA7IGlkeDIgKz0gaW5jMCAqLworLmxvbmcgICAweDEwMDAwYzAwCS8qIDAwN0MoMjQwKTogICAgICBEUkQxQTogdmFyMyA9IHZhcjA7IEZOPTAgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDAwMGM4MDAJLyogMDA4MCgyNDEpOiAgICAgIERSRDFBOiAqaWR4MiA9IHZhcjA7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDgxOTg4MDAwCS8qIDAwODQoMjQ1KTogICAgTENEOiBpZHgxID0gdmFyMzsgaWR4MSBvbmNlIHZhcjA7IGlkeDEgKz0gaW5jMCAqLworLmxvbmcgICAweDEwMDAwNzg4CS8qIDAwODgoMjQ3KTogICAgICBEUkQxQTogdmFyMSA9ICppZHgxOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDYwMDAwMDAwCS8qIDAwOEMoMjQ4KTogICAgICBEUkQyQTogRVUwPTAgRVUxPTAgRVUyPTAgRVUzPTAgRVhUIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwODBjZjA0YwkvKiAwMDkwKDI0OCk6ICAgICAgRFJEMkIxOiBpZHgwID0gRVUzKCk7IEVVMyh2YXIxLHZhcjEyKSAgKi8KKy5sb25nICAgMHgwMDAwMDFmOAkvKiAwMDk0KDowKTogICAgTk9QICovCisKKworLmdsb2JsIHNjRXRoZXJuZXRYbWl0X1REVAorc2NFdGhlcm5ldFhtaXRfVERUOgkvKiBUYXNrIDEgRGVzY3JpcHRvciBUYWJsZSAqLworLmxvbmcgICAweDgwMDk1YjAwCS8qIDAwMDAoMjgwKTogIExDREVYVDogaWR4MCA9IDB4ZjAwMjViMDA7IDsgKi8KKy5sb25nICAgMHg4NWM2MDAwNAkvKiAwMDA0KDI4MCk6ICBMQ0Q6IGlkeDEgPSB2YXIxMSArIHZhcjEyICsgNDsgaWR4MSBvbmNlIHZhcjA7IGlkeDEgKz0gaW5jMCAqLworLmxvbmcgICAweDEwMDAyMzA4CS8qIDAwMDgoMjgzKTogICAgRFJEMUE6IHZhcjggPSBpZHgxOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDEwMDAwZjg4CS8qIDAwMEMoMjg0KTogICAgRFJEMUE6IHZhcjMgPSAqaWR4MTsgRk49MCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMDAwMDM4MAkvKiAwMDEwKDI4NSk6ICAgIERSRDFBOiB2YXIwID0gKmlkeDA7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDgxOTgwMDAwCS8qIDAwMTQoMjg4KTogIExDRDogaWR4MCA9IHZhcjM7IGlkeDAgb25jZSB2YXIwOyBpZHgwICs9IGluYzAgKi8KKy5sb25nICAgMHgxMDAwMDc4MAkvKiAwMDE4KDI5MCk6ICAgIERSRDFBOiB2YXIxID0gKmlkeDA7IEZOPTAgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4NjAwMDAwMDAJLyogMDAxQygyOTEpOiAgICBEUkQyQTogRVUwPTAgRVUxPTAgRVUyPTAgRVUzPTAgRVhUIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMjRjZjA0ZAkvKiAwMDIwKDI5MSk6ICAgIERSRDJCMTogdmFyOSA9IEVVMygpOyBFVTModmFyMSx2YXIxMykgICovCisubG9uZyAgIDB4ODQ5ODAzMDkJLyogMDAyNCgyOTQpOiAgTENEOiBpZHgwID0gdmFyOTsgaWR4MCAhPSB2YXIxMjsgaWR4MCArPSBpbmMxICovCisubG9uZyAgIDB4YzAwMDQwMDMJLyogMDAyOCgyOTcpOiAgICBMQ0RFWFQ6IGlkeDEgPSAweDAwMDAwMDAzOyA7ICovCisubG9uZyAgIDB4ODFjNjAwMDQJLyogMDAyQygyOTcpOiAgICBMQ0Q6IGlkeDIgPSB2YXIzICsgdmFyMTIgKyA0OyBpZHgyIG9uY2UgdmFyMDsgaWR4MiArPSBpbmMwICovCisubG9uZyAgIDB4NzAwMDAwMDAJLyogMDAzMCgyOTkpOiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MCBFWFQgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDEwY2YwNGUJLyogMDAzNCgyOTkpOiAgICAgIERSRDJCMTogdmFyNCA9IEVVMygpOyBFVTModmFyMSx2YXIxNCkgICovCisubG9uZyAgIDB4NzAwMDAwMDAJLyogMDAzOCgzMDApOiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MCBFWFQgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDE0Y2YwNGYJLyogMDAzQygzMDApOiAgICAgIERSRDJCMTogdmFyNSA9IEVVMygpOyBFVTModmFyMSx2YXIxNSkgICovCisubG9uZyAgIDB4NzAwMDAwMDAJLyogMDA0MCgzMDEpOiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MCBFWFQgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDI4Y2YwNTAJLyogMDA0NCgzMDEpOiAgICAgIERSRDJCMTogdmFyMTAgPSBFVTMoKTsgRVUzKHZhcjEsdmFyMTYpICAqLworLmxvbmcgICAweDcwMDAwMDAwCS8qIDAwNDgoMzAyKTogICAgICBEUkQyQTogRVUwPTAgRVUxPTAgRVUyPTAgRVUzPTAgRVhUIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDAxOGNmMDUxCS8qIDAwNEMoMzAyKTogICAgICBEUkQyQjE6IHZhcjYgPSBFVTMoKTsgRVUzKHZhcjEsdmFyMTcpICAqLworLmxvbmcgICAweDEwMDAwYjkwCS8qIDAwNTAoMzAzKTogICAgICBEUkQxQTogdmFyMiA9ICppZHgyOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDYwMDAwMDAwCS8qIDAwNTQoMzA0KTogICAgICBEUkQyQTogRVUwPTAgRVUxPTAgRVUyPTAgRVUzPTAgRVhUIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHgwMWNjZjBhMQkvKiAwMDU4KDMwNCk6ICAgICAgRFJEMkIxOiB2YXI3ID0gRVUzKCk7IEVVMyh2YXIyLGlkeDEpICAqLworLmxvbmcgICAweGMyOTg4MzEyCS8qIDAwNUMoMzA4KTogICAgTENERVhUOiBpZHgxID0gdmFyNTsgaWR4MSA+IHZhcjEyOyBpZHgxICs9IGluYzIgKi8KKy5sb25nICAgMHg4MzQ5MDAwMAkvKiAwMDYwKDMwOCk6ICAgIExDRDogaWR4MiA9IHZhcjYgKyB2YXIxODsgaWR4MiBvbmNlIHZhcjA7IGlkeDIgKz0gaW5jMCAqLworLmxvbmcgICAweDAwMDAxYjEwCS8qIDAwNjQoMzEwKTogICAgICBEUkQxQTogdmFyNiA9IGlkeDI7IEZOPTAgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDgwMDI1MWE0CS8qIDAwNjgoMzE1KTogICAgTENERVhUOiBpZHgxID0gMHhmMDAwOTFhNDsgOyAqLworLmxvbmcgICAweGMzMDEwNGRjCS8qIDAwNkMoMzE1KTogICAgTENERVhUOiBpZHgyID0gdmFyNiwgaWR4MyA9IHZhcjI7IGlkeDIgPj0gdmFyMTk7IGlkeDIgKz0gaW5jMywgaWR4MyArPSBpbmM0ICovCisubG9uZyAgIDB4ODM5YTAzMmQJLyogMDA3MCgzMTYpOiAgICBMQ0Q6IGlkeDQgPSB2YXI3OyBpZHg0ID09IHZhcjEyOyBpZHg0ICs9IGluYzUgKi8KKy5sb25nICAgMHgwMjIwYzc5OAkvKiAwMDc0KDMyMSk6ICAgICAgRFJEMUE6ICppZHgxID0gKmlkeDM7IEZOPTAgaW5pdD0xNyBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHg4MDAyNTFhNAkvKiAwMDc4KDMyOSk6ICAgIExDREVYVDogaWR4MSA9IDB4ZjAwMDkxYTQ7IDsgKi8KKy5sb25nICAgMHg5OTE5ODMzNwkvKiAwMDdDKDMyOSk6ICAgIExDRDogaWR4MiA9IGlkeDIsIGlkeDMgPSBpZHgzOyBpZHgyID4gdmFyMTI7IGlkeDIgKz0gaW5jNiwgaWR4MyArPSBpbmM3ICovCisubG9uZyAgIDB4MDIyYWM3OTgJLyogMDA4MCgzMzMpOiAgICAgIERSRDFBOiAqaWR4MSA9ICppZHgzOyBGTj0wIGluaXQ9MTcgV1M9MSBSUz0xICovCisubG9uZyAgIDB4ODAwMjUxYTQJLyogMDA4NCgzNTApOiAgICBMQ0RFWFQ6IGlkeDEgPSAweGYwMDA5MWE0OyA7ICovCisubG9uZyAgIDB4YzE0MzAwMDAJLyogMDA4OCgzNTApOiAgICBMQ0RFWFQ6IGlkeDIgPSB2YXIyICsgdmFyNjsgaWR4MiBvbmNlIHZhcjA7IGlkeDIgKz0gaW5jMCAqLworLmxvbmcgICAweDgyOTk4MzEyCS8qIDAwOEMoMzUxKTogICAgTENEOiBpZHgzID0gdmFyNTsgaWR4MyA+IHZhcjEyOyBpZHgzICs9IGluYzIgKi8KKy5sb25nICAgMHgwYTJhYzc5MAkvKiAwMDkwKDM1NCk6ICAgICAgRFJEMUE6ICppZHgxID0gKmlkeDI7IEZOPTAgVEZEIGluaXQ9MTcgV1M9MSBSUz0xICovCisubG9uZyAgIDB4ODE5ODgwMDAJLyogMDA5NCgzNTkpOiAgICBMQ0Q6IGlkeDEgPSB2YXIzOyBpZHgxIG9uY2UgdmFyMDsgaWR4MSArPSBpbmMwICovCisubG9uZyAgIDB4NjAwMDAwMDIJLyogMDA5OCgzNjEpOiAgICAgIERSRDJBOiBFVTA9MCBFVTE9MCBFVTI9MCBFVTM9MiBFWFQgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDBjNGNmYzRkCS8qIDAwOUMoMzYxKTogICAgICBEUkQyQjE6ICppZHgxID0gRVUzKCk7IEVVMygqaWR4MSx2YXIxMykgICovCisubG9uZyAgIDB4YzIxODgzYWQJLyogMDBBMCgzNjUpOiAgICBMQ0RFWFQ6IGlkeDEgPSB2YXI0OyBpZHgxID09IHZhcjE0OyBpZHgxICs9IGluYzUgKi8KKy5sb25nICAgMHg4MDE5MDAwMAkvKiAwMEE0KDM2NSk6ICAgIExDRDogaWR4MiA9IHZhcjA7IGlkeDIgb25jZSB2YXIwOyBpZHgyICs9IGluYzAgKi8KKy5sb25nICAgMHgwNDAwODQ2MAkvKiAwMEE4KDM2Nyk6ICAgICAgRFJEMUE6IGlkeDEgPSB2YXIxMjsgRk49MCBJTlQgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweGM0MDUyMzA1CS8qIDAwQUMoMzcxKTogICAgTENERVhUOiBpZHgxID0gdmFyOCwgaWR4MiA9IHZhcjEwOyBpZHgyID09IHZhcjEyOyBpZHgxICs9IGluYzAsIGlkeDIgKz0gaW5jNSAqLworLmxvbmcgICAweDgxY2EwMDAwCS8qIDAwQjAoMzcyKTogICAgTENEOiBpZHgzID0gdmFyMyArIHZhcjIwOyBpZHgzIG9uY2UgdmFyMDsgaWR4MyArPSBpbmMwICovCisubG9uZyAgIDB4MTAwMGM3MTgJLyogMDBCNCgzNzQpOiAgICAgIERSRDFBOiAqaWR4MSA9IGlkeDM7IEZOPTAgTU9SRSBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDAwMDBmMTgJLyogMDBCOCgzNzUpOiAgICAgIERSRDFBOiB2YXIzID0gaWR4MzsgRk49MCBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4YzQxODgwMDAJLyogMDBCQygzNzgpOiAgICBMQ0RFWFQ6IGlkeDEgPSB2YXI4OyBpZHgxIG9uY2UgdmFyMDsgaWR4MSArPSBpbmMwICovCisubG9uZyAgIDB4ODUxOTAzMTIJLyogMDBDMCgzNzgpOiAgICBMQ0Q6IGlkeDIgPSB2YXIxMDsgaWR4MiA+IHZhcjEyOyBpZHgyICs9IGluYzIgKi8KKy5sb25nICAgMHgxMDAwMGMwMAkvKiAwMEM0KDM4MCk6ICAgICAgRFJEMUE6IHZhcjMgPSB2YXIwOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDEwMDBjNDAwCS8qIDAwQzgoMzgxKTogICAgICBEUkQxQTogKmlkeDEgPSB2YXIwOyBGTj0wIE1PUkUgaW5pdD0wIFdTPTAgUlM9MCAqLworLmxvbmcgICAweDAwMDA4ODYwCS8qIDAwQ0MoMzgyKTogICAgICBEUkQxQTogaWR4MiA9IHZhcjEyOyBGTj0wIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHg4MTk4ODAwMAkvKiAwMEQwKDM4Nik6ICAgIExDRDogaWR4MSA9IHZhcjM7IGlkeDEgb25jZSB2YXIwOyBpZHgxICs9IGluYzAgKi8KKy5sb25nICAgMHgxMDAwMDc4OAkvKiAwMEQ0KDM4OCk6ICAgICAgRFJEMUE6IHZhcjEgPSAqaWR4MTsgRk49MCBNT1JFIGluaXQ9MCBXUz0wIFJTPTAgKi8KKy5sb25nICAgMHg2MDAwMDAwMAkvKiAwMEQ4KDM4OSk6ICAgICAgRFJEMkE6IEVVMD0wIEVVMT0wIEVVMj0wIEVVMz0wIEVYVCBpbml0PTAgV1M9MCBSUz0wICovCisubG9uZyAgIDB4MDgwY2YwNGQJLyogMDBEQygzODkpOiAgICAgIERSRDJCMTogaWR4MCA9IEVVMygpOyBFVTModmFyMSx2YXIxMykgICovCisubG9uZyAgIDB4MDAwMDAxZjgJLyogMDBFMCg6MCk6ICAgIE5PUCAqLworCisuYWxpZ24gOAorCisuZ2xvYmwgc2NFdGhlcm5ldFJlY3ZfVmFyVGFiCitzY0V0aGVybmV0UmVjdl9WYXJUYWI6CS8qIFRhc2sgMCBWYXJpYWJsZSBUYWJsZSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclswXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsxXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsyXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclszXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls0XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls1XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls2XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls3XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls4XSAqLworLmxvbmcgICAweGYwMDI1YjAwCS8qIHZhcls5XSAqLworLmxvbmcgICAweDAwMDAwMDA4CS8qIHZhclsxMF0gKi8KKy5sb25nICAgMHgwMDAwMDAwYwkvKiB2YXJbMTFdICovCisubG9uZyAgIDB4ODAwMDAwMDAJLyogdmFyWzEyXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsxM10gKi8KKy5sb25nICAgMHgxMDAwMDAwMAkvKiB2YXJbMTRdICovCisubG9uZyAgIDB4MjAwMDAwMDAJLyogdmFyWzE1XSAqLworLmxvbmcgICAweDAwMDAwODAwCS8qIHZhclsxNl0gKi8KKy5sb25nICAgMHgwMDAwMDAwMQkvKiB2YXJbMTddICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogdmFyWzE4XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsxOV0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMjBdICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogdmFyWzIxXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsyMl0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMjNdICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogaW5jWzBdICovCisubG9uZyAgIDB4NjAwMDAwMDAJLyogaW5jWzFdICovCisubG9uZyAgIDB4MjAwMDAwMDQJLyogaW5jWzJdICovCisubG9uZyAgIDB4MjAwMDAwMDEJLyogaW5jWzNdICovCisubG9uZyAgIDB4ODAwMDAwMDAJLyogaW5jWzRdICovCisubG9uZyAgIDB4NDAwMDAwMDAJLyogaW5jWzVdICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogaW5jWzZdICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogaW5jWzddICovCisKKy5hbGlnbiAgOAorCisuZ2xvYmwgc2NFdGhlcm5ldFhtaXRfVmFyVGFiCitzY0V0aGVybmV0WG1pdF9WYXJUYWI6CS8qIFRhc2sgMSBWYXJpYWJsZSBUYWJsZSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclswXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsxXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsyXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclszXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls0XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls1XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls2XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls3XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls4XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhcls5XSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsxMF0gKi8KKy5sb25nICAgMHhmMDAyNWIwMAkvKiB2YXJbMTFdICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogdmFyWzEyXSAqLworLmxvbmcgICAweDgwMDAwMDAwCS8qIHZhclsxM10gKi8KKy5sb25nICAgMHgxMDAwMDAwMAkvKiB2YXJbMTRdICovCisubG9uZyAgIDB4MDgwMDAwMDAJLyogdmFyWzE1XSAqLworLmxvbmcgICAweDIwMDAwMDAwCS8qIHZhclsxNl0gKi8KKy5sb25nICAgMHgwMDAwZmZmZgkvKiB2YXJbMTddICovCisubG9uZyAgIDB4ZmZmZmZmZmYJLyogdmFyWzE4XSAqLworLmxvbmcgICAweDAwMDAwMDA0CS8qIHZhclsxOV0gKi8KKy5sb25nICAgMHgwMDAwMDAwOAkvKiB2YXJbMjBdICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogdmFyWzIxXSAqLworLmxvbmcgICAweDAwMDAwMDAwCS8qIHZhclsyMl0gKi8KKy5sb25nICAgMHgwMDAwMDAwMAkvKiB2YXJbMjNdICovCisubG9uZyAgIDB4MDAwMDAwMDAJLyogaW5jWzBdICovCisubG9uZyAgIDB4NjAwMDAwMDAJLyogaW5jWzFdICovCisubG9uZyAgIDB4NDAwMDAwMDAJLyogaW5jWzJdICovCisubG9uZyAgIDB4YzAwMGZmZmMJLyogaW5jWzNdICovCisubG9uZyAgIDB4ZTAwMDAwMDQJLyogaW5jWzRdICovCisubG9uZyAgIDB4ODAwMDAwMDAJLyogaW5jWzVdICovCisubG9uZyAgIDB4NDAwMGZmZmYJLyogaW5jWzZdICovCisubG9uZyAgIDB4ZTAwMDAwMDEJLyogaW5jWzddICovCisKKy5hbGlnbiA4CisKKy5nbG9ibCBzY0V0aGVybmV0UmVjdl9GRFQKK3NjRXRoZXJuZXRSZWN2X0ZEVDoJLyogVGFzayAwIEZ1bmN0aW9uIERlc2NyaXB0b3IgVGFibGUgKi8KKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgyMTgwMDAwMAkvKiBhbmQoKSwgRVUjIDMgKi8KKy5sb25nICAgMHgyMWUwMDAwMAkvKiBvcigpLCBFVSMgMyAqLworLmxvbmcgICAweDIxNDAwMDAwCS8qIGFuZG4oKSwgRVUjIDMgKi8KKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorCisuYWxpZ24gOAorCisuZ2xvYmwgc2NFdGhlcm5ldFhtaXRfRkRUCitzY0V0aGVybmV0WG1pdF9GRFQ6CS8qIFRhc2sgMSBGdW5jdGlvbiBEZXNjcmlwdG9yIFRhYmxlICovCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MjE4MDAwMDAJLyogYW5kKCksIEVVIyAzICovCisubG9uZyAgIDB4MjFlMDAwMDAJLyogb3IoKSwgRVUjIDMgKi8KKy5sb25nICAgMHgyMTQwMDAwMAkvKiBhbmRuKCksIEVVIyAzICovCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKy5sb25nICAgMHgwMDAwMDAwMAorLmxvbmcgICAweDAwMDAwMDAwCisubG9uZyAgIDB4MDAwMDAwMDAKKworCisuZ2xvYmwgc2NFdGhlcm5ldFJlY3ZfQ1NhdmUKK3NjRXRoZXJuZXRSZWN2X0NTYXZlOgkvKiBUYXNrIDAgY29udGV4dCBzYXZlIHNwYWNlICovCisuc3BhY2UgIDEyOCwgMHgwCisKKworLmdsb2JsIHNjRXRoZXJuZXRYbWl0X0NTYXZlCitzY0V0aGVybmV0WG1pdF9DU2F2ZToJLyogVGFzayAxIGNvbnRleHQgc2F2ZSBzcGFjZSAqLworLnNwYWNlICAxMjgsIDB4MAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9pMmMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVjZGYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2kyYy5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0LCBGcmVlc2NhbGUsIEluYworICogVHNpQ2h1bmcgTGlldywgVHNpLUNodW5nLkxpZXdAZnJlZXNjYWxlLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWZkZWYgQ09ORklHX0hBUkRfSTJDCisKKyNpbmNsdWRlIDxtcGM4MjIwLmg+CisjaW5jbHVkZSA8aTJjLmg+CisKK3R5cGVkZWYgc3RydWN0IG1wYzgyMjBfaTJjIHsKKwl2b2xhdGlsZSB1MzIgYWRyOwkvKiBJMkNuICsgMHgwMCAqLworCXZvbGF0aWxlIHUzMiBmZHI7CS8qIEkyQ24gKyAweDA0ICovCisJdm9sYXRpbGUgdTMyIGNyOwkvKiBJMkNuICsgMHgwOCAqLworCXZvbGF0aWxlIHUzMiBzcjsJLyogSTJDbiArIDB4MEMgKi8KKwl2b2xhdGlsZSB1MzIgZHI7CS8qIEkyQ24gKyAweDEwICovCit9IGkyY190OworCisvKiBJMkNuIGNvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBJMkNfRU4gICAgICAweDgwCisjZGVmaW5lIEkyQ19JRU4gICAgIDB4NDAKKyNkZWZpbmUgSTJDX1NUQSAgICAgMHgyMAorI2RlZmluZSBJMkNfVFggICAgICAweDEwCisjZGVmaW5lIEkyQ19UWEFLICAgIDB4MDgKKyNkZWZpbmUgSTJDX1JTVEEgICAgMHgwNAorI2RlZmluZSBJMkNfSU5JVF9NQVNLICAgKEkyQ19FTiB8IEkyQ19TVEEgfCBJMkNfVFggfCBJMkNfUlNUQSkKKworLyogSTJDbiBzdGF0dXMgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBJMkNfQ0YgICAgICAweDgwCisjZGVmaW5lIEkyQ19BQVMgICAgIDB4NDAKKyNkZWZpbmUgSTJDX0JCICAgICAgMHgyMAorI2RlZmluZSBJMkNfQUwgICAgICAweDEwCisjZGVmaW5lIEkyQ19TUlcgICAgIDB4MDQKKyNkZWZpbmUgSTJDX0lGICAgICAgMHgwMgorI2RlZmluZSBJMkNfUlhBSyAgICAweDAxCisKKyNkZWZpbmUgSTJDX1RJTUVPVVQgMTAwCisjZGVmaW5lIEkyQ19SRVRSSUVTIDEKKworc3RydWN0IG1wYzgyMjBfaTJjX3RhcCB7CisJaW50IHNjbDJ0YXA7CisJaW50IHRhcDJ0YXA7Cit9OworCitzdGF0aWMgaW50IG1wY19yZWdfaW4gKHZvbGF0aWxlIHUzMiAqIHJlZyk7CitzdGF0aWMgdm9pZCBtcGNfcmVnX291dCAodm9sYXRpbGUgdTMyICogcmVnLCBpbnQgdmFsLCBpbnQgbWFzayk7CitzdGF0aWMgaW50IHdhaXRfZm9yX2JiICh2b2lkKTsKK3N0YXRpYyBpbnQgd2FpdF9mb3JfcGluIChpbnQgKnN0YXR1cyk7CitzdGF0aWMgaW50IGRvX2FkZHJlc3MgKHVjaGFyIGNoaXAsIGNoYXIgcmR3cl9mbGFnKTsKK3N0YXRpYyBpbnQgc2VuZF9ieXRlcyAodWNoYXIgY2hpcCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgcmVjZWl2ZV9ieXRlcyAodWNoYXIgY2hpcCwgY2hhciAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgbXBjX2dldF9mZHIgKGludCk7CisKK3N0YXRpYyBpbnQgbXBjX3JlZ19pbiAodm9sYXRpbGUgdTMyICogcmVnKQoreworCWludCByZXQ7CisJcmV0ID0gKnJlZyA+PiAyNDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXBjX3JlZ19vdXQgKHZvbGF0aWxlIHUzMiAqIHJlZywgaW50IHZhbCwgaW50IG1hc2spCit7CisJaW50IHRtcDsKKworCWlmICghbWFzaykgeworCQkqcmVnID0gdmFsIDw8IDI0OworCX0gZWxzZSB7CisJCXRtcCA9IG1wY19yZWdfaW4gKHJlZyk7CisJCSpyZWcgPSAoKHRtcCAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKSkgPDwgMjQ7CisJfQorCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCB3YWl0X2Zvcl9iYiAodm9pZCkKK3sKKwlpMmNfdCAqcmVncyA9IChpMmNfdCAqKSBNTUFQX0kyQzsKKwlpbnQgdGltZW91dCA9IEkyQ19USU1FT1VUOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBtcGNfcmVnX2luICgmcmVncy0+c3IpOworCisJd2hpbGUgKHRpbWVvdXQtLSAmJiAoc3RhdHVzICYgSTJDX0JCKSkgeworI2lmIDEKKwkJdm9sYXRpbGUgaW50IHRlbXA7CisKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5jciwgSTJDX1NUQSwgSTJDX1NUQSk7CisJCXRlbXAgPSBtcGNfcmVnX2luICgmcmVncy0+ZHIpOworCQltcGNfcmVnX291dCAoJnJlZ3MtPmNyLCAwLCBJMkNfU1RBKTsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5jciwgMCwgMCk7CisJCW1wY19yZWdfb3V0ICgmcmVncy0+Y3IsIEkyQ19FTiwgMCk7CisjZW5kaWYKKwkJdWRlbGF5ICgxMDAwKTsKKwkJc3RhdHVzID0gbXBjX3JlZ19pbiAoJnJlZ3MtPnNyKTsKKwl9CisKKwlyZXR1cm4gKHN0YXR1cyAmIEkyQ19CQik7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfcGluIChpbnQgKnN0YXR1cykKK3sKKwlpMmNfdCAqcmVncyA9IChpMmNfdCAqKSBNTUFQX0kyQzsKKwlpbnQgdGltZW91dCA9IEkyQ19USU1FT1VUOworCisJKnN0YXR1cyA9IG1wY19yZWdfaW4gKCZyZWdzLT5zcik7CisKKwl3aGlsZSAodGltZW91dC0tICYmICEoKnN0YXR1cyAmIEkyQ19JRikpIHsKKwkJdWRlbGF5ICgxMDAwKTsKKwkJKnN0YXR1cyA9IG1wY19yZWdfaW4gKCZyZWdzLT5zcik7CisJfQorCisJaWYgKCEoKnN0YXR1cyAmIEkyQ19JRikpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+c3IsIDAsIEkyQ19JRik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fYWRkcmVzcyAodWNoYXIgY2hpcCwgY2hhciByZHdyX2ZsYWcpCit7CisJaTJjX3QgKnJlZ3MgPSAoaTJjX3QgKikgTU1BUF9JMkM7CisJaW50IHN0YXR1czsKKworCWNoaXAgPDw9IDE7CisKKwlpZiAocmR3cl9mbGFnKQorCQljaGlwIHw9IDE7CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPmNyLCBJMkNfVFgsIEkyQ19UWCk7CisJbXBjX3JlZ19vdXQgKCZyZWdzLT5kciwgY2hpcCwgMCk7CisKKwlpZiAod2FpdF9mb3JfcGluICgmc3RhdHVzKSkKKwkJcmV0dXJuIC0yOworCWlmIChzdGF0dXMgJiBJMkNfUlhBSykKKwkJcmV0dXJuIC0zOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlbmRfYnl0ZXMgKHVjaGFyIGNoaXAsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpMmNfdCAqcmVncyA9IChpMmNfdCAqKSBNTUFQX0kyQzsKKwlpbnQgd3Jjb3VudDsKKwlpbnQgc3RhdHVzOworCisJZm9yICh3cmNvdW50ID0gMDsgd3Jjb3VudCA8IGxlbjsgKyt3cmNvdW50KSB7CisKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5kciwgYnVmW3dyY291bnRdLCAwKTsKKworCQlpZiAod2FpdF9mb3JfcGluICgmc3RhdHVzKSkKKwkJCWJyZWFrOworCisJCWlmIChzdGF0dXMgJiBJMkNfUlhBSykKKwkJCWJyZWFrOworCisJfQorCisJcmV0dXJuICEod3Jjb3VudCA9PSBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfYnl0ZXMgKHVjaGFyIGNoaXAsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpMmNfdCAqcmVncyA9IChpMmNfdCAqKSBNTUFQX0kyQzsKKwlpbnQgZHVtbXkgPSAxOworCWludCByZGNvdW50ID0gMDsKKwlpbnQgc3RhdHVzOworCWludCBpOworCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5jciwgMCwgSTJDX1RYKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQlidWZbcmRjb3VudF0gPSBtcGNfcmVnX2luICgmcmVncy0+ZHIpOworCisJCWlmIChkdW1teSkKKwkJCWR1bW15ID0gMDsKKwkJZWxzZQorCQkJcmRjb3VudCsrOworCisJCWlmICh3YWl0X2Zvcl9waW4gKCZzdGF0dXMpKQorCQkJcmV0dXJuIC00OworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+Y3IsIEkyQ19UWEFLLCBJMkNfVFhBSyk7CisJYnVmW3JkY291bnQrK10gPSBtcGNfcmVnX2luICgmcmVncy0+ZHIpOworCisJaWYgKHdhaXRfZm9yX3BpbiAoJnN0YXR1cykpCisJCXJldHVybiAtNTsKKworCW1wY19yZWdfb3V0ICgmcmVncy0+Y3IsIDAsIEkyQ19UWEFLKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKiogSTJDIEFQSSAqKioqKioqKioqKioqKioqLworCit2b2lkIGkyY19pbml0IChpbnQgc3BlZWQsIGludCBzYWRkcikKK3sKKwlpMmNfdCAqcmVncyA9IChpMmNfdCAqKSBNTUFQX0kyQzsKKworCW1wY19yZWdfb3V0ICgmcmVncy0+Y3IsIDAsIDApOworCW1wY19yZWdfb3V0ICgmcmVncy0+YWRyLCBzYWRkciA8PCAxLCAwKTsKKworCS8qIFNldCBjbG9jaworCSAqLworCW1wY19yZWdfb3V0ICgmcmVncy0+ZmRyLCBtcGNfZ2V0X2ZkciAoc3BlZWQpLCAwKTsKKworCS8qIEVuYWJsZSBtb2R1bGUKKwkgKi8KKwltcGNfcmVnX291dCAoJnJlZ3MtPmNyLCBJMkNfRU4sIEkyQ19JTklUX01BU0spOworCW1wY19yZWdfb3V0ICgmcmVncy0+c3IsIDAsIEkyQ19JRik7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IG1wY19nZXRfZmRyIChpbnQgc3BlZWQpCit7CisJc3RhdGljIGludCBmZHIgPSAtMTsKKworCWlmIChmZHIgPT0gLTEpIHsKKwkJdWxvbmcgYmVzdF9zcGVlZCA9IDA7CisJCXVsb25nIGRpdmlkZXI7CisJCXVsb25nIGlwYiwgc2NsOworCQl1bG9uZyBiZXN0bWF0Y2ggPSAweGZmZmZmZmZmVUw7CisJCWludCBiZXN0X2kgPSAwLCBiZXN0X2ogPSAwLCBpLCBqOworCQlpbnQgU0NMX1RhcFtdID0geyA5LCAxMCwgMTIsIDE1LCA1LCA2LCA3LCA4IH07CisJCXN0cnVjdCBtcGM4MjIwX2kyY190YXAgc2NsdGFwW10gPSB7CisJCQl7NCwgMX0sCisJCQl7NCwgMn0sCisJCQl7NiwgNH0sCisJCQl7NiwgOH0sCisJCQl7MTQsIDE2fSwKKwkJCXszMCwgMzJ9LAorCQkJezYyLCA2NH0sCisJCQl7MTI2LCAxMjh9CisJCX07CisKKwkJaXBiID0gZ2QtPmJ1c19jbGs7CisJCWZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CisJCQlmb3IgKGogPSA3OyBqID49IDA7IGotLSkgeworCQkJCXNjbCA9IDIgKiAoc2NsdGFwW2pdLnNjbDJ0YXAgKworCQkJCQkgICAoU0NMX1RhcFtpXSAtCisJCQkJCSAgICAxKSAqIHNjbHRhcFtqXS50YXAydGFwICsgMik7CisJCQkJaWYgKGlwYiA8PSBzcGVlZCAqIHNjbCkgeworCQkJCQlpZiAoKHNwZWVkICogc2NsIC0gaXBiKSA8IGJlc3RtYXRjaCkgeworCQkJCQkJYmVzdG1hdGNoID0gc3BlZWQgKiBzY2wgLSBpcGI7CisJCQkJCQliZXN0X2kgPSBpOworCQkJCQkJYmVzdF9qID0gajsKKwkJCQkJCWJlc3Rfc3BlZWQgPSBpcGIgLyBzY2w7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZGl2aWRlciA9IChiZXN0X2kgJiAzKSB8ICgoYmVzdF9pICYgNCkgPDwgMykgfCAoYmVzdF9qIDw8IDIpOworCQlpZiAoZ2QtPmZsYWdzICYgR0RfRkxHX1JFTE9DKSB7CisJCQlmZHIgPSBkaXZpZGVyOworCQl9IGVsc2UgeworCQkJcHJpbnRmICgiJWxkIGtIeiwgIiwgYmVzdF9zcGVlZCAvIDEwMDApOworCQkJcmV0dXJuIGRpdmlkZXI7CisJCX0KKwl9CisKKwlyZXR1cm4gZmRyOworfQorCitpbnQgaTJjX3Byb2JlICh1Y2hhciBjaGlwKQoreworCWkyY190ICpyZWdzID0gKGkyY190ICopIE1NQVBfSTJDOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEkyQ19SRVRSSUVTOyBpKyspIHsKKwkJbXBjX3JlZ19vdXQgKCZyZWdzLT5jciwgSTJDX1NUQSwgSTJDX1NUQSk7CisKKwkJaWYgKCFkb19hZGRyZXNzIChjaGlwLCAwKSkgeworCQkJbXBjX3JlZ19vdXQgKCZyZWdzLT5jciwgMCwgSTJDX1NUQSk7CisJCQlicmVhazsKKwkJfQorCisJCW1wY19yZWdfb3V0ICgmcmVncy0+Y3IsIDAsIEkyQ19TVEEpOworCQl1ZGVsYXkgKDUwKTsKKwl9CisKKwlyZXR1cm4gKGkgPT0gSTJDX1JFVFJJRVMpOworfQorCitpbnQgaTJjX3JlYWQgKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICogYnVmLCBpbnQgbGVuKQoreworCXVjaGFyIHhhZGRyWzRdOworCWkyY190ICpyZWdzID0gKGkyY190ICopIE1NQVBfSTJDOworCWludCByZXQgPSAtMTsKKworCXhhZGRyWzBdID0gKGFkZHIgPj4gMjQpICYgMHhGRjsKKwl4YWRkclsxXSA9IChhZGRyID4+IDE2KSAmIDB4RkY7CisJeGFkZHJbMl0gPSAoYWRkciA+PiA4KSAmIDB4RkY7CisJeGFkZHJbM10gPSBhZGRyICYgMHhGRjsKKworCWlmICh3YWl0X2Zvcl9iYiAoKSkgeworCQlwcmludGYgKCJpMmNfcmVhZDogYnVzIGlzIGJ1c3lcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJbXBjX3JlZ19vdXQgKCZyZWdzLT5jciwgSTJDX1NUQSwgSTJDX1NUQSk7CisJaWYgKGRvX2FkZHJlc3MgKGNoaXAsIDApKSB7CisJCXByaW50ZiAoImkyY19yZWFkOiBmYWlsZWQgdG8gYWRkcmVzcyBjaGlwXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCWlmIChzZW5kX2J5dGVzIChjaGlwLCAoY2hhciAqKSZ4YWRkcls0IC0gYWxlbl0sIGFsZW4pKSB7CisJCXByaW50ZiAoImkyY19yZWFkOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwltcGNfcmVnX291dCAoJnJlZ3MtPmNyLCBJMkNfUlNUQSwgSTJDX1JTVEEpOworCWlmIChkb19hZGRyZXNzIChjaGlwLCAxKSkgeworCQlwcmludGYgKCJpMmNfcmVhZDogZmFpbGVkIHRvIGFkZHJlc3MgY2hpcFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAocmVjZWl2ZV9ieXRlcyAoY2hpcCwgKGNoYXIgKilidWYsIGxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3JlYWQ6IHJlY2VpdmVfYnl0ZXMgZmFpbGVkXG4iKTsKKwkJZ290byBEb25lOworCX0KKworCXJldCA9IDA7CisgICAgICBEb25lOgorCW1wY19yZWdfb3V0ICgmcmVncy0+Y3IsIDAsIEkyQ19TVEEpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBpMmNfd3JpdGUgKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICogYnVmLCBpbnQgbGVuKQoreworCXVjaGFyIHhhZGRyWzRdOworCWkyY190ICpyZWdzID0gKGkyY190ICopIE1NQVBfSTJDOworCWludCByZXQgPSAtMTsKKworCXhhZGRyWzBdID0gKGFkZHIgPj4gMjQpICYgMHhGRjsKKwl4YWRkclsxXSA9IChhZGRyID4+IDE2KSAmIDB4RkY7CisJeGFkZHJbMl0gPSAoYWRkciA+PiA4KSAmIDB4RkY7CisJeGFkZHJbM10gPSBhZGRyICYgMHhGRjsKKworCWlmICh3YWl0X2Zvcl9iYiAoKSkgeworCQlwcmludGYgKCJpMmNfd3JpdGU6IGJ1cyBpcyBidXN5XG4iKTsKKwkJZ290byBEb25lOworCX0KKworCW1wY19yZWdfb3V0ICgmcmVncy0+Y3IsIEkyQ19TVEEsIEkyQ19TVEEpOworCWlmIChkb19hZGRyZXNzIChjaGlwLCAwKSkgeworCQlwcmludGYgKCJpMmNfd3JpdGU6IGZhaWxlZCB0byBhZGRyZXNzIGNoaXBcbiIpOworCQlnb3RvIERvbmU7CisJfQorCisJaWYgKHNlbmRfYnl0ZXMgKGNoaXAsIChjaGFyICopJnhhZGRyWzQgLSBhbGVuXSwgYWxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlpZiAoc2VuZF9ieXRlcyAoY2hpcCwgKGNoYXIgKilidWYsIGxlbikpIHsKKwkJcHJpbnRmICgiaTJjX3dyaXRlOiBzZW5kX2J5dGVzIGZhaWxlZFxuIik7CisJCWdvdG8gRG9uZTsKKwl9CisKKwlyZXQgPSAwOworICAgICAgRG9uZToKKwltcGNfcmVnX291dCAoJnJlZ3MtPmNyLCAwLCBJMkNfU1RBKTsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogQ09ORklHX0hBUkRfSTJDICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvaTJjQ29yZS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2kyY0NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODlhZDAzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2kyY0NvcmUuYwpAQCAtMCwwICsxLDYyNyBAQAorLyogSTJjQ29yZS5jIC0gTVBDODIyMCBQUEMgSTJDIExpYnJhcnkgKi8KKworLyogQ29weXJpZ2h0IDIwMDQgICAgICBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAqLworCisvKgorbW9kaWZpY2F0aW9uIGhpc3RvcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMWMsMjlqdW4wNCx0Y2wJIDEuMwlyZW1vdmVkIENSLiBBZGRlZCB0d28gYnl0ZXMgb2Zmc2V0IHN1cHBvcnQuCiswMWIsMTlqYW4wNCx0Y2wJIDEuMglyZW1vdmVkIGkyY01zRGVsYXkgYW5kIHN5c0RlY0dldC4gcmVuYW1lZCBpMmNNc0RlbGF5CisJCQliYWNrIHRvIHN5c01zRGVsYXkKKzAxYSwxOWphbjA0LHRjbAkgMS4xCWNyZWF0ZWQgYW5kIHNlcGVyYXRlZCBmcm9tIGkyYy5jCisqLworCisvKgorREVTQ1JJUFRJT04KK1RoaXMgZmlsZSBjb250YWluIEkyQyBsb3cgbGV2ZWwgaGFuZGxpbmcgbGlicmFyeSBmdW5jdGlvbnMKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNpbmNsdWRlIDxzeXNMaWIuaD4KKyNpbmNsdWRlIDxpb3NMaWIuaD4KKyNpbmNsdWRlIDxsb2dMaWIuaD4KKyNpbmNsdWRlIDx0aWNrTGliLmg+CisKKy8qIEJTUCBJbmNsdWRlcyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIm1wYzgyMjAuaCIKKyNpbmNsdWRlICJpMmNDb3JlLmgiCisKKyNpZmRlZiBERUJVR19JMkNDT1JFCitpbnQgSTJDQ0RiZyA9IDA7CisjZW5kaWYKKworI2RlZmluZSBBQlMoeCkJKCh4IDwgMCk/IC14IDogeCkKKworY2hhciAqSTJDRVJSWzE2XSA9IHsKKwkiVHJhbnNmZXIgaW4gUHJvZ3Jlc3NcbiIsCS8qIDAgKi8KKwkiVHJhbnNmZXIgY29tcGxldGVcbiIsCisJIk5vdCBBZGRyZXNzZWRcbiIsCQkvKiAyICovCisJIkFkZHJlc3NlZCBhcyBhIHNsYXZlXG4iLAorCSJCdXMgaXMgSWRsZVxuIiwJCS8qIDQgKi8KKwkiQnVzIGlzIGJ1c3lcbiIsCisJIkFyYml0cmF0aW9uIExvc3RcbiIsCQkvKiA2ICovCisJIkFyYml0cmF0aW9uIG9uIFRyYWNrXG4iLAorCSJTbGF2ZSByZWNlaXZlLCBtYXN0ZXIgd3JpdGluZyB0byBzbGF2ZVxuIiwJLyogOCAqLworCSJTbGF2ZSB0cmFuc21pdCwgbWFzdGVyIHJlYWRpbmcgZnJvbSBzbGF2ZVxuIiwKKwkiSW50ZXJydXB0IGlzIHBlbmRpbmdcbiIsCS8qIDEwICovCisJIkludGVycnVwdCBjb21wbGV0ZVxuIiwKKwkiQWNrbm93bGVkZ2UgcmVjZWl2ZWRcbiIsCS8qIDEyICovCisJIk5vIGFja25vd2xlZGdlIHJlY2VpdmVkXG4iLAorCSJVbmtub3duIHN0YXR1c1xuIiwJCS8qIDE0ICovCisJIlxuIgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNoa19zdGF0dXMgLSBDaGVjayBJMkMgc3RhdHVzIGJpdAorICoKKyAqIFJFVFVSTlM6IE9LLCBvciBFUlJPUiBpZiB0aGUgYml0IGVuY291bnRlcgorICoKKyAqLworCitTVEFUVVMgY2hrX3N0YXR1cyAoUFNJMkMgcGkyYywgVUlOVDggc3RhX2JpdCwgVUlOVDggdHJ1ZWZhbHNlKQoreworCWludCBpLCBzdGF0dXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEkyQ19QT0xMX0NPVU5UOyBpKyspIHsKKwkJaWYgKChwaTJjLT5zciAmIHN0YV9iaXQpID09ICh0cnVlZmFsc2UgPyBzdGFfYml0IDogMCkpCisJCQlyZXR1cm4gKE9LKTsKKwl9CisKKwlJMkNDREJHIChMMiwgKCItLS0gc3IgJXggc3RhYml0ICV4IHRydWVmYWxzZSAlZFxuIiwKKwkJICAgICAgcGkyYy0+c3IsIHN0YV9iaXQsIHRydWVmYWxzZSwgMCwgMCwgMCkpOworCisJaWYgKGkgPT0gSTJDX1BPTExfQ09VTlQpIHsKKwkJc3dpdGNoIChzdGFfYml0KSB7CisJCWNhc2UgSTJDX1NUQV9DRjoKKwkJCXN0YXR1cyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBJMkNfU1RBX0FBUzoKKwkJCXN0YXR1cyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBJMkNfU1RBX0JCOgorCQkJc3RhdHVzID0gNDsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19TVEFfQUw6CisJCQlzdGF0dXMgPSA2OworCQkJYnJlYWs7CisJCWNhc2UgSTJDX1NUQV9TUlc6CisJCQlzdGF0dXMgPSA4OworCQkJYnJlYWs7CisJCWNhc2UgSTJDX1NUQV9JRjoKKwkJCXN0YXR1cyA9IDEwOworCQkJYnJlYWs7CisJCWNhc2UgSTJDX1NUQV9SWEFLOgorCQkJc3RhdHVzID0gMTI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0YXR1cyA9IDE0OworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXRydWVmYWxzZSkKKwkJCXN0YXR1cysrOworCisJCUkyQ0NEQkcgKE5PLCAoIi0tLSBzdGF0dXMgJWRcbiIsIHN0YXR1cywgMCwgMCwgMCwgMCwgMCkpOworCQlJMkNDREJHIChOTywgKEkyQ0VSUltzdGF0dXNdLCAwLCAwLCAwLCAwLCAwLCAwKSk7CisJfQorCisJcmV0dXJuIChFUlJPUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJMkMgRW5hYmxlIC0gRW5hYmxlIHRoZSBJMkMgQ29udHJvbGxlcgorICoKKyAqLworU1RBVFVTIGkyY19lbmFibGUgKFNJMkMgKiBwaTJjLCBQSTJDU0VUIHBpMmNTZXQpCit7CisJaW50IGZkciA9IHBpMmNTZXQtPmJpdF9yYXRlOworCVVJTlQ4IGFkciA9IHBpMmNTZXQtPmkyY19hZHI7CisKKwlJMkNDREJHIChMMiwgKCJpMmNfZW5hYmxlIGZkciAlZCBhZHIgJXhcbiIsIGZkciwgYWRyLCAwLCAwLCAwLCAwKSk7CisKKwlpMmNfY2xlYXIgKHBpMmMpOwkvKiBDbGVhciBGRFIsIEFEUiwgU1IgYW5kIENSIHJlZyAqLworCisJU2V0STJjRkRSIChwaTJjLCBmZHIpOwkvKiBGcmVxdWVuY3kJCQkqLworCXBpMmMtPmFkciA9IGFkcjsKKworCXBpMmMtPmNyID0gSTJDX0NUTF9FTjsJLyogU2V0IEVuYWJsZQkJCSovCisKKwkvKgorCSAgIFRoZSBJMkMgYnVzIHNob3VsZCBiZSBpbiBJZGxlIHN0YXRlLiBJZiB0aGUgYnVzIGlzIGJ1c3ksCisJICAgY2xlYXIgdGhlIFNUQSBiaXQgaW4gY29udHJvbCByZWdpc3RlcgorCSAqLworCWlmIChjaGtfc3RhdHVzIChwaTJjLCBJMkNfU1RBX0JCLCAwKSAhPSBPSykgeworCQlpZiAoKHBpMmMtPmNyICYgSTJDX0NUTF9TVEEpID09IEkyQ19DVExfU1RBKQorCQkJcGkyYy0+Y3IgJj0gfkkyQ19DVExfU1RBOworCisJCS8qIENoZWNrIGFnYWluIGlmIGl0IGlzIHN0aWxsIGJ1c3ksIHJldHVybiBlcnJvciBpZiBmb3VuZCAqLworCQlpZiAoY2hrX3N0YXR1cyAocGkyYywgSTJDX1NUQV9CQiwgMSkgPT0gT0spCisJCQlyZXR1cm4gRVJST1I7CisJfQorCisJcmV0dXJuIChPSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJMkMgRGlzYWJsZSAtIERpc2FibGUgdGhlIEkyQyBDb250cm9sbGVyCisgKgorICovCitTVEFUVVMgaTJjX2Rpc2FibGUgKFBTSTJDIHBpMmMpCit7CisJaTJjX2NsZWFyIChwaTJjKTsKKworCXBpMmMtPmNyICY9IEkyQ19DVExfRU47IC8qIERpc2FibGUgSTJjCQkJKi8KKworCWlmICgocGkyYy0+Y3IgJiBJMkNfQ1RMX1NUQSkgPT0gSTJDX0NUTF9TVEEpCisJCXBpMmMtPmNyICY9IH5JMkNfQ1RMX1NUQTsKKworCWlmIChjaGtfc3RhdHVzIChwaTJjLCBJMkNfU1RBX0JCLCAwKSAhPSBPSykKKwkJcmV0dXJuIEVSUk9SOworCisJcmV0dXJuIChPSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJMkMgQ2xlYXIgLSBDbGVhciB0aGUgSTJDIENvbnRyb2xsZXIKKyAqCisgKi8KK1NUQVRVUyBpMmNfY2xlYXIgKFBTSTJDIHBpMmMpCit7CisJcGkyYy0+YWRyID0gMDsKKwlwaTJjLT5mZHIgPSAwOworCXBpMmMtPmNyID0gMDsKKwlwaTJjLT5zciA9IDA7CisKKwlyZXR1cm4gKE9LKTsKK30KKworCitTVEFUVVMgaTJjX3N0YXJ0IChQU0kyQyBwaTJjLCBQSTJDU0VUIHBpMmNTZXQpCit7CisjaWZkZWYgVFdPQllURVMKKwlVSU5UMTYgQnl0ZU9mZnNldCA9IHBpMmNTZXQtPnN0cl9hZHI7CisjZWxzZQorCVVJTlQ4IEJ5dGVPZmZzZXQgPSBwaTJjU2V0LT5zdHJfYWRyOworI2VuZGlmCisjaWYgMQorCVVJTlQ4IHRtcCA9IDA7CisjZW5kaWYKKwlVSU5UOCBBZGRyID0gcGkyY1NldC0+c2x2X2FkcjsKKworCXBpMmMtPmNyIHw9IEkyQ19DVExfU1RBOwkvKiBHZW5lcmF0ZSBzdGFydCBzaWduYWwJKi8KKworCWlmIChjaGtfc3RhdHVzIChwaTJjLCBJMkNfU1RBX0JCLCAxKSAhPSBPSykKKwkJcmV0dXJuIEVSUk9SOworCisJLyogV3JpdGUgc2xhdmUgYWRkcmVzcyAqLworCWlmIChpMmNfd3JpdGVieXRlIChwaTJjLCAmQWRkcikgIT0gT0spIHsKKwkJaTJjX3N0b3AgKHBpMmMpOwkvKiBEaXNhYmxlIEkyYwkJCSovCisJCXJldHVybiBFUlJPUjsKKwl9CisjaWZkZWYgVFdPQllURVMKKyMgICBpZiAwCisJLyogSXNzdWUgdGhlIG9mZnNldCB0byBzdGFydCAqLworCWlmIChpMmNfd3JpdGUyYnl0ZSAocGkyYywgJkJ5dGVPZmZzZXQpICE9IE9LKSB7CisJCWkyY19zdG9wIChwaTJjKTsJLyogRGlzYWJsZSBJMmMJCQkqLworCQlyZXR1cm4gRVJST1I7CisJfQorI2VuZGlmCisJdG1wID0gKEJ5dGVPZmZzZXQgPj4gOCkgJiAweGZmOworCWlmIChpMmNfd3JpdGVieXRlIChwaTJjLCAmdG1wKSAhPSBPSykgeworCQlpMmNfc3RvcCAocGkyYyk7CS8qIERpc2FibGUgSTJjCQkJKi8KKwkJcmV0dXJuIEVSUk9SOworCX0KKwl0bXAgPSBCeXRlT2Zmc2V0ICYgMHhmZjsKKwlpZiAoaTJjX3dyaXRlYnl0ZSAocGkyYywgJnRtcCkgIT0gT0spIHsKKwkJaTJjX3N0b3AgKHBpMmMpOwkvKiBEaXNhYmxlIEkyYwkJCSovCisJCXJldHVybiBFUlJPUjsKKwl9CisjZWxzZQorCWlmIChpMmNfd3JpdGVieXRlIChwaTJjLCAmQnl0ZU9mZnNldCkgIT0gT0spIHsKKwkJaTJjX3N0b3AgKHBpMmMpOwkvKiBEaXNhYmxlIEkyYwkJCSovCisJCXJldHVybiBFUlJPUjsKKwl9CisjZW5kaWYKKworCXJldHVybiAoT0spOworfQorCitTVEFUVVMgaTJjX3N0b3AgKFBTSTJDIHBpMmMpCit7CisJcGkyYy0+Y3IgJj0gfkkyQ19DVExfU1RBOwkvKiBHZW5lcmF0ZSBzdG9wIHNpZ25hbAkJKi8KKwlpZiAoY2hrX3N0YXR1cyAocGkyYywgSTJDX1NUQV9CQiwgMCkgIT0gT0spCisJCXJldHVybiBFUlJPUjsKKworCXJldHVybiAoT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVhZCBMZW4gYnl0ZXMgdG8gdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgKkRhdGEgZnJvbSB0aGUgZGV2aWNlCisgKiB3aXRoIGFkZHJlc3MgQWRkci4KKyAqLworaW50IGkyY19yZWFkYmxvY2sgKFNJMkMgKiBwaTJjLCBQSTJDU0VUIHBpMmNTZXQsIFVJTlQ4ICogRGF0YSkKK3sKKwlpbnQgaSA9IDA7CisJVUlOVDggVG1wOworCisvKiAgICBVSU5UOCBCeXRlT2Zmc2V0ID0gcGkyY1NldC0+c3RyX2Fkcjsgbm90IHVzZWQ/ICovCisJVUlOVDggQWRkciA9IHBpMmNTZXQtPnNsdl9hZHI7CisJaW50IExlbmd0aCA9IHBpMmNTZXQtPnhmZXJfc2l6ZTsKKworCUkyQ0NEQkcgKEwxLCAoImkyY19yZWFkYmxvY2sgYWRkciAleCBkYXRhIDB4JTA4eCBsZW4gJWQgb2Zmc2V0ICVkXG4iLAorCQkgICAgICBBZGRyLCAoaW50KSBEYXRhLCBMZW5ndGgsIEJ5dGVPZmZzZXQsIDAsIDApKTsKKworCWlmIChwaTJjLT5zciAmIEkyQ19TVEFfQUwpIHsJLyogQ2hlY2sgaWYgQXJiaXRyYXRpb24gbG9zdAkqLworCQlJMkNDREJHIChGTiwgKCJBcmJpdHJhdGlvbiBsb3N0XG4iLCAwLCAwLCAwLCAwLCAwLCAwKSk7CisJCXBpMmMtPnNyICY9IH5JMkNfU1RBX0FMOwkvKiBDbGVhciBBcmJpdHJhdGlvbiBzdGF0dXMgYml0ICovCisJCXJldHVybiBFUlJPUjsKKwl9CisKKwlwaTJjLT5jciB8PSBJMkNfQ1RMX1RYOyAvKiBFbmFibGUgdGhlIEkyYyBmb3IgVFgsIEFjawkqLworCisJaWYgKGkyY19zdGFydCAocGkyYywgcGkyY1NldCkgPT0gRVJST1IpCisJCXJldHVybiBFUlJPUjsKKworCXBpMmMtPmNyIHw9IEkyQ19DVExfUlNUQTsJLyogUmVwZWF0IFN0YXJ0ICovCisKKwlUbXAgPSBBZGRyIHwgMTsKKworCWlmIChpMmNfd3JpdGVieXRlIChwaTJjLCAmVG1wKSAhPSBPSykgeworCQlpMmNfc3RvcCAocGkyYyk7CS8qIERpc2FibGUgSTJjCSovCisJCXJldHVybiBFUlJPUjsKKwl9CisKKwlpZiAoKChwaTJjLT5zciAmIDB4MDcpID09IDB4MDcpIHx8IChwaTJjLT5zciAmIDB4MDEpKQorCQlyZXR1cm4gRVJST1I7CisKKwlwaTJjLT5jciAmPSB+STJDX0NUTF9UWDsJLyogU2V0IHJlY2VpdmUgbW9kZQkqLworCisJaWYgKCgocGkyYy0+c3IgJiAweDA3KSA9PSAweDA3KSB8fCAocGkyYy0+c3IgJiAweDAxKSkKKwkJcmV0dXJuIEVSUk9SOworCisJLyogRHVtbXkgUmVhZCAqLworCWlmIChpMmNfcmVhZGJ5dGUgKHBpMmMsICZUbXAsICZpKSAhPSBPSykgeworCQlpMmNfc3RvcCAocGkyYyk7CS8qIERpc2FibGUgSTJjCSovCisJCXJldHVybiBFUlJPUjsKKwl9CisKKwlpID0gMDsKKwl3aGlsZSAoTGVuZ3RoKSB7CisJCWlmIChMZW5ndGggPT0gMikKKwkJCXBpMmMtPmNyIHw9IEkyQ19DVExfVFhBSzsKKworCQlpZiAoTGVuZ3RoID09IDEpCisJCQlwaTJjLT5jciAmPSB+STJDX0NUTF9TVEE7CisKKwkJaWYgKGkyY19yZWFkYnl0ZSAocGkyYywgRGF0YSwgJkxlbmd0aCkgIT0gT0spIHsKKwkJCXJldHVybiBpMmNfc3RvcCAocGkyYyk7CisJCX0KKwkJaSsrOworCQlMZW5ndGgtLTsKKwkJRGF0YSsrOworCX0KKworCWlmIChpMmNfc3RvcCAocGkyYykgPT0gRVJST1IpCisJCXJldHVybiBFUlJPUjsKKworCXJldHVybiBpOworfQorCitTVEFUVVMgaTJjX3dyaXRlYmxvY2sgKFNJMkMgKiBwaTJjLCBQSTJDU0VUIHBpMmNTZXQsIFVJTlQ4ICogRGF0YSkKK3sKKwlpbnQgTGVuZ3RoID0gcGkyY1NldC0+eGZlcl9zaXplOworCisjaWZkZWYgVFdPQllURVMKKwlVSU5UMTYgQnl0ZU9mZnNldCA9IHBpMmNTZXQtPnN0cl9hZHI7CisjZWxzZQorCVVJTlQ4IEJ5dGVPZmZzZXQgPSBwaTJjU2V0LT5zdHJfYWRyOworI2VuZGlmCisJaW50IGosIGs7CisKKwlJMkNDREJHIChMMiwgKCJpMmNfd3JpdGVibG9ja1xuIiwgMCwgMCwgMCwgMCwgMCwgMCkpOworCisJaWYgKHBpMmMtPnNyICYgSTJDX1NUQV9BTCkgeworCQkvKiBDaGVjayBpZiBhcmJpdHJhdGlvbiBsb3N0ICovCisJCUkyQ0NEQkcgKEwyLCAoIkFyYml0cmF0aW9uIGxvc3RcbiIsIDAsIDAsIDAsIDAsIDAsIDApKTsKKwkJcGkyYy0+c3IgJj0gfkkyQ19TVEFfQUw7CS8qIENsZWFyIHRoZSBjb25kaXRpb24JKi8KKwkJcmV0dXJuIEVSUk9SOworCX0KKworCXBpMmMtPmNyIHw9IEkyQ19DVExfVFg7IC8qIEVuYWJsZSB0aGUgSTJjIGZvciBUWCwgQWNrCSovCisKKwkvKiBEbyB0aGUgbm90IGV2ZW4gb2Zmc2V0IGZpcnN0ICovCisJaWYgKChCeXRlT2Zmc2V0ICUgOCkgIT0gMCkgeworCQlpbnQgcmVtYWluOworCisJCWlmIChMZW5ndGggPiA4KSB7CisJCQlyZW1haW4gPSA4IC0gKEJ5dGVPZmZzZXQgJSA4KTsKKwkJCUxlbmd0aCAtPSByZW1haW47CisKKwkJCXBpMmNTZXQtPnN0cl9hZHIgPSBCeXRlT2Zmc2V0OworCisJCQlpZiAoaTJjX3N0YXJ0IChwaTJjLCBwaTJjU2V0KSA9PSBFUlJPUikKKwkJCQlyZXR1cm4gRVJST1I7CisKKwkJCWZvciAoaiA9IEJ5dGVPZmZzZXQ7IGogPCByZW1haW47IGorKykgeworCQkJCWlmIChpMmNfd3JpdGVieXRlIChwaTJjLCBEYXRhKyspICE9IE9LKQorCQkJCQlyZXR1cm4gRVJST1I7CisJCQl9CisKKwkJCWlmIChpMmNfc3RvcCAocGkyYykgPT0gRVJST1IpCisJCQkJcmV0dXJuIEVSUk9SOworCisJCQlzeXNNc0RlbGF5ICgzMik7CisKKwkJCS8qIFVwZGF0ZSB0aGUgbmV3IEJ5dGVPZmZzZXQgKi8KKwkJCUJ5dGVPZmZzZXQgKz0gcmVtYWluOworCQl9CisJfQorCisJZm9yIChqID0gQnl0ZU9mZnNldCwgayA9IDA7IGogPCAoTGVuZ3RoICsgQnl0ZU9mZnNldCk7IGorKykgeworCQlpZiAoKGogJSA4KSA9PSAwKSB7CisJCQlwaTJjU2V0LT5zdHJfYWRyID0gajsKKwkJCWlmIChpMmNfc3RhcnQgKHBpMmMsIHBpMmNTZXQpID09IEVSUk9SKQorCQkJCXJldHVybiBFUlJPUjsKKwkJfQorCisJCWsrKzsKKworCQlpZiAoaTJjX3dyaXRlYnl0ZSAocGkyYywgRGF0YSsrKSAhPSBPSykKKwkJCXJldHVybiBFUlJPUjsKKworCQlpZiAoKGogPT0gKExlbmd0aCAtIDEpKSB8fCAoKGsgJSA4KSA9PSAwKSkgeworCQkJaWYgKGkyY19zdG9wIChwaTJjKSA9PSBFUlJPUikKKwkJCQlyZXR1cm4gRVJST1I7CisKKwkJCXN5c01zRGVsYXkgKDUwKTsKKwkJfQorCisJfQorCisJcmV0dXJuIGs7Cit9CisKK1NUQVRVUyBpMmNfcmVhZGJ5dGUgKFNJMkMgKiBwaTJjLCBVSU5UOCAqIHJlYWRiLCBpbnQgKmluZGV4KQoreworCXBpMmMtPnNyICY9IH5JMkNfU1RBX0lGOwkvKiBDbGVhciBJbnRlcnJ1cHQgQml0CSovCisJKnJlYWRiID0gcGkyYy0+ZHI7CQkvKiBSZWFkIGEgYnl0ZQkJKi8KKworCS8qCisJICAgU2V0IEkyQ19DVFJMX1RYQUsgd2lsbCBjYXVzZSBUcmFuc2ZlciBwZW5kaW5nIGFuZAorCSAgIHNldCBJMkNfQ1RSTF9TVEEgd2lsbCBjYXVzZSBJbnRlcnJ1cHQgcGVuZGluZworCSAqLworCWlmICgqaW5kZXggIT0gMikgeworCQlpZiAoY2hrX3N0YXR1cyAocGkyYywgSTJDX1NUQV9DRiwgMSkgIT0gT0spCS8qIFRyYW5zZmVyIG5vdCBjb21wbGV0ZT8JKi8KKwkJCXJldHVybiBFUlJPUjsKKwl9CisKKwlpZiAoKmluZGV4ICE9IDEpIHsKKwkJaWYgKGNoa19zdGF0dXMgKHBpMmMsIEkyQ19TVEFfSUYsIDEpICE9IE9LKQorCQkJcmV0dXJuIEVSUk9SOworCX0KKworCXJldHVybiAoT0spOworfQorCisKK1NUQVRVUyBpMmNfd3JpdGVieXRlIChTSTJDICogcGkyYywgVUlOVDggKiB3cml0ZWIpCit7CisJcGkyYy0+c3IgJj0gfkkyQ19TVEFfSUY7CS8qIENsZWFyIEludGVycnVwdAkqLworCXBpMmMtPmRyID0gKndyaXRlYjsJCS8qIFdyaXRlIGEgYnl0ZQkJKi8KKworCWlmIChjaGtfc3RhdHVzIChwaTJjLCBJMkNfU1RBX0NGLCAxKSAhPSBPSykJLyogVHJhbnNmZXIgbm90IGNvbXBsZXRlPwkqLworCQlyZXR1cm4gRVJST1I7CisKKwlpZiAoY2hrX3N0YXR1cyAocGkyYywgSTJDX1NUQV9JRiwgMSkgIT0gT0spCisJCXJldHVybiBFUlJPUjsKKworCXJldHVybiBPSzsKK30KKworU1RBVFVTIGkyY193cml0ZTJieXRlIChTSTJDICogcGkyYywgVUlOVDE2ICogd3JpdGViKQoreworCVVJTlQ4IGRhdGE7CisKKwlkYXRhID0gKFVJTlQ4KSAoKCp3cml0ZWIgPj4gOCkgJiAweGZmKTsKKwlpZiAoaTJjX3dyaXRlYnl0ZSAocGkyYywgJmRhdGEpICE9IE9LKQorCQlyZXR1cm4gRVJST1I7CisJZGF0YSA9IChVSU5UOCkgKCp3cml0ZWIgJiAweGZmKTsKKwlpZiAoaTJjX3dyaXRlYnl0ZSAocGkyYywgJmRhdGEpICE9IE9LKQorCQlyZXR1cm4gRVJST1I7CisJcmV0dXJuIE9LOworfQorCisvKiBGRFIgdGFibGUgYmFzZSBvbiAzM01IeiAtIG1vcmUgZGV0YWlsIHBsZWFzZSByZWZlciB0byBPZGluaTJjX2RpdmlkZXJzLnhscworRkRSIEZEUiBzY2wgc2RhIHNjbDJ0YXAyCis1MTAgNDMyIHRhcCB0YXAgdGFwIHRhcCBzY2xfcGVyCSAgICBzZGFfaG9sZAlJMkMgRnJlcSAgICAwCTEgICAyCTMgICA0CTUKKzAwMCAwMDAgOSAgIDMJNCAgIDEJMjggQ2xvY2tzICAgOSBDbG9ja3MJMTE5MCBLSHogICAgMAkwICAgMAkwICAgMAkwCiswMDAgMDAxIDkgICAzCTQgICAyCTQ0IENsb2NrcyAgIDExIENsb2Nrcwk3NTggS0h6CSAgICAwCTAgICAxCTAgICAwCTAKKzAwMCAwMTAgOSAgIDMJNiAgIDQJODAgQ2xvY2tzICAgMTcgQ2xvY2tzCTQxNyBLSHoJICAgIDAJMCAgIDAJMSAgIDAJMAorMDAwIDAxMSA5ICAgMwk2ICAgOAkxNDQgQ2xvY2tzICAyNSBDbG9ja3MJMjMxIEtIegkgICAgMAkwICAgMQkxICAgMAkwCiswMDAgMTAwIDkgICAzCTE0ICAxNgkyODggQ2xvY2tzICA0OSBDbG9ja3MJMTE2IEtIegkgICAgMAkwICAgMAkwICAgMQkwCiswMDAgMTAxIDkgICAzCTMwICAzMgk1NzYgQ2xvY2tzICA5NyBDbG9ja3MJNTggS0h6CSAgICAwCTAgICAxCTAgICAxCTAKKzAwMCAxMTAgOSAgIDMJNjIgIDY0CTExNTIgQ2xvY2tzIDE5MyBDbG9ja3MJMjkgS0h6CSAgICAwCTAgICAwCTEgICAxCTAKKzAwMCAxMTEgOSAgIDMJMTI2IDEyOCAyMzA0IENsb2NrcyAzODUgQ2xvY2tzCTE0IEtIegkgICAgMAkwICAgMQkxICAgMQkwCiswMDEgMDAwIDEwICAzCTQgICAxCTMwIENsb2NrcyAgIDkgQ2xvY2tzCTExMTEgS0h6MSAgIDAJMCAgIDAJMCAgIDAKKzAwMSAwMDEgMTAgIDMJNCAgIDIJNDggQ2xvY2tzICAgMTEgQ2xvY2tzCTY5NCBLSHoJICAgIDEJMCAgIDEJMCAgIDAJMAorMDAxIDAxMCAxMCAgMwk2ICAgNAk4OCBDbG9ja3MgICAxNyBDbG9ja3MJMzc5IEtIegkgICAgMQkwICAgMAkxICAgMAkwCiswMDEgMDExIDEwICAzCTYgICA4CTE2MCBDbG9ja3MgIDI1IENsb2NrcwkyMDggS0h6CSAgICAxCTAgICAxCTEgICAwCTAKKzAwMSAxMDAgMTAgIDMJMTQgIDE2CTMyMCBDbG9ja3MgIDQ5IENsb2NrcwkxMDQgS0h6CSAgICAxCTAgICAwCTAgICAxCTAKKzAwMSAxMDEgMTAgIDMJMzAgIDMyCTY0MCBDbG9ja3MgIDk3IENsb2Nrcwk1MiBLSHoJICAgIDEJMCAgIDEJMCAgIDEJMAorMDAxIDExMCAxMCAgMwk2MiAgNjQJMTI4MCBDbG9ja3MgMTkzIENsb2NrcwkyNiBLSHoJICAgIDEJMCAgIDAJMSAgIDEJMAorMDAxIDExMSAxMCAgMwkxMjYgMTI4IDI1NjAgQ2xvY2tzIDM4NSBDbG9ja3MJMTMgS0h6CSAgICAxCTAgICAxCTEgICAxCTAKKzAxMCAwMDAgMTIgIDQJNCAgIDEJMzQgQ2xvY2tzICAgMTAgQ2xvY2tzCTk4MCBLSHoJICAgIDAJMSAgIDAJMCAgIDAJMAorMDEwIDAwMSAxMiAgNAk0ICAgMgk1NiBDbG9ja3MgICAxMyBDbG9ja3MJNTk1IEtIegkgICAgMAkxICAgMQkwICAgMAkwCiswMTAgMDEwIDEyICA0CTYgICA0CTEwNCBDbG9ja3MgIDIxIENsb2NrcwkzMjEgS0h6CSAgICAwCTEgICAwCTEgICAwCTAKKzAxMCAwMTEgMTIgIDQJNiAgIDgJMTkyIENsb2NrcyAgMzMgQ2xvY2tzCTE3NCBLSHoJICAgIDAJMSAgIDEJMSAgIDAJMAorMDEwIDEwMCAxMiAgNAkxNCAgMTYJMzg0IENsb2NrcyAgNjUgQ2xvY2tzCTg3IEtIegkgICAgMAkxICAgMAkwICAgMQkwCiswMTAgMTAxIDEyICA0CTMwICAzMgk3NjggQ2xvY2tzICAxMjkgQ2xvY2tzCTQzIEtIegkgICAgMAkxICAgMQkwICAgMQkwCiswMTAgMTEwIDEyICA0CTYyICA2NAkxNTM2IENsb2NrcyAyNTcgQ2xvY2tzCTIyIEtIegkgICAgMAkxICAgMAkxICAgMQkwCiswMTAgMTExIDEyICA0CTEyNiAxMjggMzA3MiBDbG9ja3MgNTEzIENsb2NrcwkxMSBLSHoJICAgIDAJMSAgIDEJMSAgIDEJMAorMDExIDAwMCAxNSAgNAk0ICAgMQk0MCBDbG9ja3MgICAxMCBDbG9ja3MJODMzIEtIegkgICAgMQkxICAgMAkwICAgMAkwCiswMTEgMDAxIDE1ICA0CTQgICAyCTY4IENsb2NrcyAgIDEzIENsb2Nrcwk0OTAgS0h6CSAgICAxCTEgICAxCTAgICAwCTAKKzAxMSAwMTAgMTUgIDQJNiAgIDQJMTI4IENsb2NrcyAgMjEgQ2xvY2tzCTI2MCBLSHoJICAgIDEJMSAgIDAJMSAgIDAJMAorMDExIDAxMSAxNSAgNAk2ICAgOAkyNDAgQ2xvY2tzICAzMyBDbG9ja3MJMTM5IEtIegkgICAgMQkxICAgMQkxICAgMAkwCiswMTEgMTAwIDE1ICA0CTE0ICAxNgk0ODAgQ2xvY2tzICA2NSBDbG9ja3MJNjkgS0h6CSAgICAxCTEgICAwCTAgICAxCTAKKzAxMSAxMDEgMTUgIDQJMzAgIDMyCTk2MCBDbG9ja3MgIDEyOSBDbG9ja3MJMzUgS0h6CSAgICAxCTEgICAxCTAgICAxCTAKKzAxMSAxMTAgMTUgIDQJNjIgIDY0CTE5MjAgQ2xvY2tzIDI1NyBDbG9ja3MJMTcgS0h6CSAgICAxCTEgICAwCTEgICAxCTAKKzAxMSAxMTEgMTUgIDQJMTI2IDEyOCAzODQwIENsb2NrcyA1MTMgQ2xvY2tzCTkgS0h6CSAgICAxCTEgICAxCTEgICAxCTAKKzEwMCAwMDAgNSAgIDEJNCAgIDEJMjAgQ2xvY2tzICAgNyBDbG9ja3MJMTY2NyBLSHogICAgMAkwICAgMAkwICAgMAkxCisxMDAgMDAxIDUgICAxCTQgICAyCTI4IENsb2NrcyAgIDcgQ2xvY2tzCTExOTAgS0h6ICAgIDAJMCAgIDEJMCAgIDAJMQorMTAwIDAxMCA1ICAgMQk2ICAgNAk0OCBDbG9ja3MgICA5IENsb2Nrcwk2OTQgS0h6CSAgICAwCTAgICAwCTEgICAwCTEKKzEwMCAwMTEgNSAgIDEJNiAgIDgJODAgQ2xvY2tzICAgOSBDbG9ja3MJNDE3IEtIegkgICAgMAkwICAgMQkxICAgMAkxCisxMDAgMTAwIDUgICAxCTE0ICAxNgkxNjAgQ2xvY2tzICAxNyBDbG9ja3MJMjA4IEtIegkgICAgMAkwICAgMAkwICAgMQkxCisxMDAgMTAxIDUgICAxCTMwICAzMgkzMjAgQ2xvY2tzICAzMyBDbG9ja3MJMTA0IEtIegkgICAgMAkwICAgMQkwICAgMQkxCisxMDAgMTEwIDUgICAxCTYyICA2NAk2NDAgQ2xvY2tzICA2NSBDbG9ja3MJNTIgS0h6CSAgICAwCTAgICAwCTEgICAxCTEKKzEwMCAxMTEgNSAgIDEJMTI2IDEyOCAxMjgwIENsb2NrcyAxMjkgQ2xvY2tzCTI2IEtIegkgICAgMAkwICAgMQkxICAgMQkxCisxMDEgMDAwIDYgICAxCTQgICAxCTIyIENsb2NrcyAgIDcgQ2xvY2tzCTE1MTUgS0h6ICAgIDEJMCAgIDAJMCAgIDAJMQorMTAxIDAwMSA2ICAgMQk0ICAgMgkzMiBDbG9ja3MgICA3IENsb2NrcwkxMDQyIEtIeiAgICAxCTAgICAxCTAgICAwCTEKKzEwMSAwMTAgNiAgIDEJNiAgIDQJNTYgQ2xvY2tzICAgOSBDbG9ja3MJNTk1IEtIegkgICAgMQkwICAgMAkxICAgMAkxCisxMDEgMDExIDYgICAxCTYgICA4CTk2IENsb2NrcyAgIDkgQ2xvY2tzCTM0NyBLSHoJICAgIDEJMCAgIDEJMSAgIDAJMQorMTAxIDEwMCA2ICAgMQkxNCAgMTYJMTkyIENsb2NrcyAgMTcgQ2xvY2tzCTE3NCBLSHoJICAgIDEJMCAgIDAJMCAgIDEJMQorMTAxIDEwMSA2ICAgMQkzMCAgMzIJMzg0IENsb2NrcyAgMzMgQ2xvY2tzCTg3IEtIegkgICAgMQkwICAgMQkwICAgMQkxCisxMDEgMTEwIDYgICAxCTYyICA2NAk3NjggQ2xvY2tzICA2NSBDbG9ja3MJNDMgS0h6CSAgICAxCTAgICAwCTEgICAxCTEKKzEwMSAxMTEgNiAgIDEJMTI2IDEyOCAxNTM2IENsb2NrcyAxMjkgQ2xvY2tzCTIyIEtIegkgICAgMQkwICAgMQkxICAgMQkxCisxMTAgMDAwIDcgICAyCTQgICAxCTI0IENsb2NrcyAgIDggQ2xvY2tzCTEzODkgS0h6ICAgIDAJMSAgIDAJMCAgIDAJMQorMTEwIDAwMSA3ICAgMgk0ICAgMgkzNiBDbG9ja3MgICA5IENsb2Nrcwk5MjYgS0h6CSAgICAwCTEgICAxCTAgICAwCTEKKzExMCAwMTAgNyAgIDIJNiAgIDQJNjQgQ2xvY2tzICAgMTMgQ2xvY2tzCTUyMSBLSHoJICAgIDAJMSAgIDAJMSAgIDAJMQorMTEwIDAxMSA3ICAgMgk2ICAgOAkxMTIgQ2xvY2tzICAxNyBDbG9ja3MJMjk4IEtIegkgICAgMAkxICAgMQkxICAgMAkxCisxMTAgMTAwIDcgICAyCTE0ICAxNgkyMjQgQ2xvY2tzICAzMyBDbG9ja3MJMTQ5IEtIegkgICAgMAkxICAgMAkwICAgMQkxCisxMTAgMTAxIDcgICAyCTMwICAzMgk0NDggQ2xvY2tzICA2NSBDbG9ja3MJNzQgS0h6CSAgICAwCTEgICAxCTAgICAxCTEKKzExMCAxMTAgNyAgIDIJNjIgIDY0CTg5NiBDbG9ja3MgIDEyOSBDbG9ja3MJMzcgS0h6CSAgICAwCTEgICAwCTEgICAxCTEKKzExMCAxMTEgNyAgIDIJMTI2IDEyOCAxNzkyIENsb2NrcyAyNTcgQ2xvY2tzCTE5IEtIegkgICAgMAkxICAgMQkxICAgMQkxCisxMTEgMDAwIDggICAyCTQgICAxCTI2IENsb2NrcyAgIDggQ2xvY2tzCTEyODIgS0h6ICAgIDEJMSAgIDAJMCAgIDAJMQorMTExIDAwMSA4ICAgMgk0ICAgMgk0MCBDbG9ja3MgICA5IENsb2Nrcwk4MzMgS0h6CSAgICAxCTEgICAxCTAgICAwCTEKKzExMSAwMTAgOCAgIDIJNiAgIDQJNzIgQ2xvY2tzICAgMTMgQ2xvY2tzCTQ2MyBLSHoJICAgIDEJMSAgIDAJMSAgIDAJMQorMTExIDAxMSA4ICAgMgk2ICAgOAkxMjggQ2xvY2tzICAxNyBDbG9ja3MJMjYwIEtIegkgICAgMQkxICAgMQkxICAgMAkxCisxMTEgMTAwIDggICAyCTE0ICAxNgkyNTYgQ2xvY2tzICAzMyBDbG9ja3MJMTMwIEtIegkgICAgMQkxICAgMAkwICAgMQkxCisxMTEgMTAxIDggICAyCTMwICAzMgk1MTIgQ2xvY2tzICA2NSBDbG9ja3MJNjUgS0h6CSAgICAxCTEgICAxCTAgICAxCTEKKzExMSAxMTAgOCAgIDIJNjIgIDY0CTEwMjQgQ2xvY2tzIDEyOSBDbG9ja3MJMzMgS0h6CSAgICAxCTEgICAwCTEgICAxCTEKKzExMSAxMTEgOCAgIDIJMTI2IDEyOCAyMDQ4IENsb2NrcyAyNTcgQ2xvY2tzCTE2IEtIegkgICAgMQkxICAgMQkxICAgMQkxCisqLworU1RBVFVTIFNldEkyY0ZEUiAoUFNJMkMgcGkyY1JlZ3MsIGludCBiaXRyYXRlKQoreworLyogQ29uc3RhbnRzICovCisJY29uc3QgVUlOVDggZGl2X2hvbGRbOF1bM10gPSB7IHs5LCAzfSwgezEwLCAzfSwKKwl7MTIsIDR9LCB7MTUsIDR9LAorCXs1LCAxfSwgezYsIDF9LAorCXs3LCAyfSwgezgsIDJ9CisJfTsKKworCWNvbnN0IFVJTlQ4IHNjbF90YXBbOF1bMl0gPSB7IHs0LCAxfSwgezQsIDJ9LAorCXs2LCA0fSwgezYsIDh9LAorCXsxNCwgMTZ9LCB7MzAsIDMyfSwKKwl7NjIsIDY0fSwgezEyNiwgMTI4fQorCX07CisKKwlVSU5UOCBtZmRyX2JpdHM7CisKKwlpbnQgaSA9IDA7CisJaW50IGogPSAwOworCisJaW50IERpZmYsIG1pbjsKKwlpbnQgV2hpY2hGcmVxLCBpUmVjLCBqUmVjOworCWludCBTQ0xfUGVyaW9kOworCWludCBTQ0xfSG9sZDsKKwlpbnQgSTJDX0ZyZXE7CisKKwlJMkNDREJHIChMMiwgKCJFbnRlcmluZyBnZXRCaXRSYXRlOiBiaXRyYXRlICVkIHBpMmNSZWdzIDB4JTA4eFxuIiwKKwkJICAgICAgYml0cmF0ZSwgKGludCkgcGkyY1JlZ3MsIDAsIDAsIDAsIDApKTsKKworCWlmIChiaXRyYXRlIDwgMCkgeworCQlJMkNDREJHIChOTywgKCJJbnZhbGlkIGJpdHJhdGVcbiIsIDAsIDAsIDAsIDAsIDAsIDApKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCS8qIEluaXRpYWxpemUgKi8KKwltZmRyX2JpdHMgPSAwOworCW1pbiA9IDB4N2ZmZmZmZmY7CisJV2hpY2hGcmVxID0gaVJlYyA9IGpSZWMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQkvKiBTQ0wgUGVyaW9kID0gMiAqIChzY2wydGFwICsgWyhTQ0xfVGFwIC0gMSkgKiB0YXAydGFwXSArIDIpCisJCQkgKiBTQ0wgSG9sZCAgID0gc2NsMnRhcCArICgoU0RBX1RhcCAtIDEpICogdGFwMnRhcCkgKyAzCisJCQkgKiBCaXQgUmF0ZSAoSTJDIEZyZXEpID0gU3lzdGVtIEZyZXEgLyBTQ0wgUGVyaW9kCisJCQkgKi8KKwkJCVNDTF9QZXJpb2QgPQorCQkJCTIgKiAoc2NsX3RhcFtpXVswXSArCisJCQkJICAgICAoKGRpdl9ob2xkW2pdWzBdIC0gMSkgKiBzY2xfdGFwW2ldWzFdKSArCisJCQkJICAgICAyKTsKKworCQkJLyogTm93IGdldCB0aGUgSTJDIEZyZXEgKi8KKwkJCUkyQ19GcmVxID0gREVWX0NMT0NLX0ZSRVEgLyBTQ0xfUGVyaW9kOworCisJCQkvKiBUYWtlIGVxdWFsIG9yIHNsb3dlciAqLworCQkJaWYgKEkyQ19GcmVxID4gYml0cmF0ZSkKKwkJCQljb250aW51ZTsKKworCQkJLyogVGFrZSB0aGUgZGlmZmVyZW5jZXMgKi8KKwkJCURpZmYgPSBJMkNfRnJlcSAtIGJpdHJhdGU7CisKKwkJCURpZmYgPSBBQlMgKERpZmYpOworCisJCQkvKiBGaW5kIHRoZSBjbG9zZXIgdmFsdWUgKi8KKwkJCWlmIChEaWZmIDwgbWluKSB7CisJCQkJbWluID0gRGlmZjsKKwkJCQlXaGljaEZyZXEgPSBJMkNfRnJlcTsKKwkJCQlpUmVjID0gaTsKKwkJCQlqUmVjID0gajsKKwkJCX0KKworCQkJSTJDQ0RCRyAoTDIsCisJCQkJICgiLS0tICglZCwlZCkgSTJDX0ZyZXEgJWQgbWluRGlmZiAlZCBtaW4gJWRcbiIsCisJCQkJICBpLCBqLCBJMkNfRnJlcSwgRGlmZiwgbWluLCAwKSk7CisJCX0KKwl9CisKKwlTQ0xfUGVyaW9kID0KKwkJMiAqIChzY2xfdGFwW2lSZWNdWzBdICsKKwkJICAgICAoKGRpdl9ob2xkW2pSZWNdWzBdIC0gMSkgKiBzY2xfdGFwW2lSZWNdWzFdKSArIDIpOworCisJSTJDQ0RCRyAoTDIsICgiXG5taW4gJWQgV2hpY2hGcmVxICVkIGlSZWMgJWQgalJlYyAlZFxuIiwKKwkJICAgICAgbWluLCBXaGljaEZyZXEsIGlSZWMsIGpSZWMsIDAsIDApKTsKKwlJMkNDREJHIChMMiwgKCItLS0gc2NsMnRhcCAlZCBTQ0xfVGFwICVkIHRhcDJ0YXAgJWRcbiIsCisJCSAgICAgIHNjbF90YXBbaVJlY11bMF0sIGRpdl9ob2xkW2pSZWNdWzBdLCBzY2xfdGFwW2lSZWNdWzFdLAorCQkgICAgICAwLCAwLCAwKSk7CisKKwkvKiBUaGlzIG1heSBubyByZXF1aXJlICovCisJU0NMX0hvbGQgPQorCQlzY2xfdGFwW2lSZWNdWzBdICsKKwkJKChkaXZfaG9sZFtqUmVjXVsxXSAtIDEpICogc2NsX3RhcFtpUmVjXVsxXSkgKyAzOworCUkyQ0NEQkcgKEwyLAorCQkgKCItLS0gU0NMX1BlcmlvZCAlZCBTQ0xfSG9sZCAlZFxuIiwgU0NMX1BlcmlvZCwgU0NMX0hvbGQsIDAsCisJCSAgMCwgMCwgMCkpOworCisJSTJDQ0RCRyAoTDIsICgiLS0tIG1mZHJfYml0cyAleFxuIiwgbWZkcl9iaXRzLCAwLCAwLCAwLCAwLCAwKSk7CisKKwkvKiBGRFIgNCwzLDIgKi8KKwlpZiAoKGlSZWMgJiAxKSA9PSAxKQorCQltZmRyX2JpdHMgfD0gMHgwNDsJLyogRkRSIDIgKi8KKwlpZiAoKGlSZWMgJiAyKSA9PSAyKQorCQltZmRyX2JpdHMgfD0gMHgwODsJLyogRkRSIDMgKi8KKwlpZiAoKGlSZWMgJiA0KSA9PSA0KQorCQltZmRyX2JpdHMgfD0gMHgxMDsJLyogRkRSIDQgKi8KKwkvKiBGRFIgNSwxLDAgKi8KKwlpZiAoKGpSZWMgJiAxKSA9PSAxKQorCQltZmRyX2JpdHMgfD0gMHgwMTsJLyogRkRSIDAgKi8KKwlpZiAoKGpSZWMgJiAyKSA9PSAyKQorCQltZmRyX2JpdHMgfD0gMHgwMjsJLyogRkRSIDEgKi8KKwlpZiAoKGpSZWMgJiA0KSA9PSA0KQorCQltZmRyX2JpdHMgfD0gMHgyMDsJLyogRkRSIDUgKi8KKworCUkyQ0NEQkcgKEwyLCAoIi0tLSBtZmRyX2JpdHMgJXhcbiIsIG1mZHJfYml0cywgMCwgMCwgMCwgMCwgMCkpOworCisJcGkyY1JlZ3MtPmZkciA9IG1mZHJfYml0czsKKworCXJldHVybiBPSzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9pMmNDb3JlLmggYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvaTJjQ29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzgzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvaTJjQ29yZS5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogaTJjQ29yZS5oCisgKgorICogUHJvdG90eXBlcywgZXRjLiBmb3IgdGhlIE1vdG9yb2xhIE1QQzgyMjAKKyAqIGVtYmVkZGVkIGNwdSBjaGlwcworICoKKyAqIDIwMDQgKGMpIEZyZWVzY2FsZSwgSW5jLgorICogQXV0aG9yOiBUc2lDaHVuZyBMaWV3IDxUc2ktQ2h1bmcuTGlld0BmcmVlc2NhbGUuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9fSU5DaTJjY29yZWgKKyNkZWZpbmUgX19JTkNpMmNjb3JlaAorI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qIGRldmljZSB0eXBlcyAqLworI2RlZmluZSBJMkNfREVWSUNFX1RZUEVfRUVQUk9NIDAKKyNkZWZpbmUgSTJDX0VFUFJPTV9BRFJTIDB4YTAKKyNkZWZpbmUgSTJDX0NUUkxfQURSUyAgIEkyQ19FRVBST01fQURSUworI2RlZmluZSBFRVBST01fQUREUjAgICAgMHhBMgkvKiBvbiBEaW1tIFNQRCBlZXByb20gKi8KKyNkZWZpbmUgRUVQUk9NX0FERFIxICAgIDB4QTQJLyogb24gQm9hcmQgU1BEIGVlcHJvbSAqLworI2RlZmluZSBFRVBST01fQUREUjIgICAgMHhEMgkvKiBub24tc3RhbmRhcmQgZWVwcm9tIC0gY2xvY2sgZ2VuZXJhdG9yICovCisvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEkyQ19DVExfRU4gICAgICAweDgwCS8qIEkyQyBFbmFibGUgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSTJDX0NUTF9JRU4gICAgIDB4NDAJLyogSTJDIEludGVycnVwdCBFbmFibGUgICAgICAgICAqLworI2RlZmluZSBJMkNfQ1RMX1NUQSAgICAgMHgyMAkvKiBNYXN0ZXIvU2xhdmUgTW9kZSBzZWxlY3QgICAgICovCisjZGVmaW5lIEkyQ19DVExfVFggICAgICAweDEwCS8qIFRyYW5zbWl0L1JlY2VpdmUgTW9kZSBTZWxlY3QgKi8KKyNkZWZpbmUgSTJDX0NUTF9UWEFLICAgIDB4MDgJLyogVHJhbnNtaXQgQWNrbm93bGVkZ2UgRW5hYmxlICAqLworI2RlZmluZSBJMkNfQ1RMX1JTVEEgICAgMHgwNAkvKiBSZXBlYXQgU3RhcnQgICAgICAgICAgICAgICAgICovCisvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSTJDX1NUQV9DRiAgICAgIDB4ODAJLyogRGF0YSBUcmFuc2ZlciAgICAgICAqLworI2RlZmluZSBJMkNfU1RBX0FBUyAgICAgMHg0MAkvKiBBZHJlc3NlZCBBcyBTbGF2ZSAgICovCisjZGVmaW5lIEkyQ19TVEFfQkIgICAgICAweDIwCS8qIEJ1cyBCdXN5ICAgICAgICAgICAgKi8KKyNkZWZpbmUgSTJDX1NUQV9BTCAgICAgIDB4MTAJLyogQXJiaXRyYXRpb24gTG9zdCAgICAqLworI2RlZmluZSBJMkNfU1RBX1NSVyAgICAgMHgwNAkvKiBTbGF2ZSBSZWFkL1dyaXRlICAgICovCisjZGVmaW5lIEkyQ19TVEFfSUYgICAgICAweDAyCS8qIEkyQyBJbnRlcnJ1cHQgICAgICAgKi8KKyNkZWZpbmUgSTJDX1NUQV9SWEFLICAgIDB4MDEJLyogUmVjZWl2ZSBBY2tub3dsZWRnZSAqLworLyogSW50ZXJydXB0IENvbnRvbCBSZWdpc3RlciAqLworI2RlZmluZSBJMkNfSU5UX0JOQkUyICAgMHg4MAkvKiBCdXMgTm90IEJ1c3kgRW5hYmxlIDIgKi8KKyNkZWZpbmUgSTJDX0lOVF9URTIgICAgIDB4NDAJLyogVHJhbnNtaXQgRW5hYmxlIDIgICAgICovCisjZGVmaW5lIEkyQ19JTlRfUkUyICAgICAweDIwCS8qIFJlY2VpdmUgRW5hYmxlIDIgICAgICAqLworI2RlZmluZSBJMkNfSU5UX0lFMiAgICAgMHgxMAkvKiBJbnRlcnJ1cHQgRW5hYmxlIDIgICAgKi8KKyNkZWZpbmUgSTJDX0lOVF9CTkJFMSAgIDB4MDgJLyogQnVzIE5vdCBCdXN5IEVuYWJsZSAxICovCisjZGVmaW5lIEkyQ19JTlRfVEUxICAgICAweDA0CS8qIFRyYW5zbWl0IEVuYWJsZSAxICAgICAqLworI2RlZmluZSBJMkNfSU5UX1JFMSAgICAgMHgwMgkvKiBSZWNlaXZlIEVuYWJsZSAxICAgICAgKi8KKyNkZWZpbmUgSTJDX0lOVF9JRTEgICAgIDB4MDEJLyogSW50ZXJydXB0IEVuYWJsZSAxICAgICovCisjZGVmaW5lIEkyQ19QT0xMX0NPVU5UIDB4MTAwMDAwCisjZGVmaW5lIEkyQ19FTkFCTEUgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEkyQ19ESVNBQkxFICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEkyQ19TVEFSVCAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEkyQ19SRVBTVEFSVCAgICAweDAwMDAwMDA4CisjZGVmaW5lIEkyQ19TVE9QICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEkyQ19CSVRSQVRFICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEkyQ19TTEFWRUFEUiAgICAweDAwMDAwMDQwCisjZGVmaW5lIEkyQ19TVEFSVEFEUiAgICAweDAwMDAwMDgwCisjdW5kZWYgVFdPQllURVMKK3R5cGVkZWYgc3RydWN0IGkyY19zZXR0aW5ncyB7CisJLyogRGV2aWNlIHNldHRpbmdzICovCisJaW50IGJpdF9yYXRlOwkJLyogRGV2aWNlIGJpdCByYXRlICovCisJdTggaTJjX2FkcjsJCS8qIEkyQyBhZGRyZXNzICovCisJdTggc2x2X2FkcjsJCS8qIFNsYXZlIGFkZHJlc3MgKi8KKyNpZmRlZiBUV09CWVRFUworCXUxNiBzdHJfYWRyOwkJLyogU3RhcnQgYWRkcmVzcyAqLworI2Vsc2UKKwl1OCBzdHJfYWRyOwkJLyogU3RhcnQgYWRkcmVzcyAqLworI2VuZGlmCisJaW50IHhmZXJfc2l6ZTsJCS8qIFRyYW5zZmVyIFNpemUgKi8KKworCWludCBiSTJjX2VuOwkJLyogRW5hYmxlIG9yIERpc2FibGUgKi8KKwlpbnQgY21kRmxhZzsJCS8qIEkyYyBDb21tYW5kIEZsYWdzICovCit9IGkyY3NldF90OworCisvKgoraW50IGNoZWNrX3N0YXR1cyhQU0kyQyBwaTJjLCB1OCBzdGFfYml0LCB1OCB0cnVlZmFsc2UpOworaW50IGkyY19lbmFibGUoUFNJMkMgcGkyYywgUEkyQ1NFVCBwaTJjU2V0KTsKK2ludCBpMmNfZGlzYWJsZShQU0kyQyBwaTJjKTsKK2ludCBpMmNfc3RhcnQoUFNJMkMgcGkyYywgUEkyQ1NFVCBwaTJjU2V0KTsKK2ludCBpMmNfc3RvcChQU0kyQyBwaTJjKTsKK2ludCBpMmNfY2xlYXIoUFNJMkMgcGkyYyk7CitpbnQgaTJjX3JlYWRibG9jayAoUFNJMkMgcGkyYywgUEkyQ1NFVCBwaTJjU2V0LCB1OCAqRGF0YSk7CitpbnQgaTJjX3dyaXRlYmxvY2sgKFBTSTJDIHBpMmMsIFBJMkNTRVQgcGkyY1NldCwgdTggKkRhdGEpOworaW50IGkyY19yZWFkYnl0ZShQU0kyQyBwaTJjLCB1OCAqcmVhZGIsIGludCAqaW5kZXgpOworaW50IGkyY193cml0ZWJ5dGUoUFNJMkMgcGkyYywgdTggKndyaXRlYik7CitpbnQgU2V0STJjRkRSKCBQU0kyQyBwaTJjUmVncywgaW50IGJpdHJhdGUgKTsKKyovCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfX0lOQ2kyY2NvcmVoICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvaW50ZXJydXB0cy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2ludGVycnVwdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGU5OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2ludGVycnVwdHMuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogKEMpIENvcHlyaWdodCAtMjAwMworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBpbnRlcnJ1cHRzLmMgLSBqdXN0IGVub3VnaCBzdXBwb3J0IGZvciB0aGUgZGVjcmVtZW50ZXIvdGltZXIKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworaW50IGludGVycnVwdF9pbml0X2NwdSAodWxvbmcgKiBkZWNyZW1lbnRlcl9jb3VudCkKK3sKKwkqZGVjcmVtZW50ZXJfY291bnQgPSBnZXRfdGJjbGsgKCkgLyBDT05GSUdfU1lTX0haOworCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIYW5kbGUgZXh0ZXJuYWwgaW50ZXJydXB0cworICovCit2b2lkIGV4dGVybmFsX2ludGVycnVwdCAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHV0cyAoImV4dGVybmFsX2ludGVycnVwdCAob29wcyEpXG4iKTsKK30KKwordm9pZCB0aW1lcl9pbnRlcnJ1cHRfY3B1IChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBub3RoaW5nIHRvIGRvIGhlcmUgKi8KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSW5zdGFsbCBhbmQgZnJlZSBhIGludGVycnVwdCBoYW5kbGVyLgorICovCisKK3ZvaWQgaXJxX2luc3RhbGxfaGFuZGxlciAoaW50IHZlYywgaW50ZXJydXB0X2hhbmRsZXJfdCAqIGhhbmRsZXIsIHZvaWQgKmFyZykKK3sKKworfQorCit2b2lkIGlycV9mcmVlX2hhbmRsZXIgKGludCB2ZWMpCit7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2RvX2lycWluZm8gKGNtZF90YmxfdCAqIGNtZHRwLCBiZF90ICogYmQsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXB1dHMgKCJJUlEgcmVsYXRlZCBmdW5jdGlvbnMgYXJlIHVuaW1wbGVtZW50ZWQgY3VycmVudGx5LlxuIik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvaW8uUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9pby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlY2RmNTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvaW8uUwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgJRGFuIE1hbGVrIDxkbWFsZWtAamxjLm5ldD4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkJTWFnbnVzIERhbW0gPGtpZXJheXBjMDEucC55LmtpZS5lcmEuZXJpY3Nzb24uc2U+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAxCVN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICoJCQlBbmRyZWFzIEhlcHBlbCA8YWhlcHBlbEBzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246CSAgaW44ICovCisvKiAgRGVzY3JpcHRpb246ICBJbnB1dCA4IGJpdHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJaW44Citpbjg6CisJbGJ6CXIzLDAocjMpCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246CSAgaW4xNiAqLworLyogIERlc2NyaXB0aW9uOiAgSW5wdXQgMTYgYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlpbjE2CitpbjE2OgorCWxoeglyMywwKHIzKQorCXN5bmMKKwlibHIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEZ1bmN0aW9uOgkgIGluMTZyICovCisvKiAgRGVzY3JpcHRpb246ICBJbnB1dCAxNiBiaXRzIGFuZCBieXRlIHJldmVyc2UgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJaW4xNnIKK2luMTZyOgorCWxoYnJ4CXIzLDAscjMKKwlzeW5jCisJYmxyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBGdW5jdGlvbjoJICBpbjMyICovCisvKiAgRGVzY3JpcHRpb246ICBJbnB1dCAzMiBiaXRzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCWluMzIKK2luMzI6CisJbHd6CTMsMCgzKQorCXN5bmMKKwlibHIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEZ1bmN0aW9uOgkgIGluMzJyICovCisvKiAgRGVzY3JpcHRpb246ICBJbnB1dCAzMiBiaXRzIGFuZCBieXRlIHJldmVyc2UgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJaW4zMnIKK2luMzJyOgorCWx3YnJ4CXIzLDAscjMKKwlzeW5jCisJYmxyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBGdW5jdGlvbjoJICBvdXQ4ICovCisvKiAgRGVzY3JpcHRpb246ICBPdXRwdXQgOCBiaXRzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCW91dDgKK291dDg6CisJc3RiCXI0LDAocjMpCisJc3luYworCWJscgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRnVuY3Rpb246CSAgb3V0MTYgKi8KKy8qICBEZXNjcmlwdGlvbjogIE91dHB1dCAxNiBiaXRzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCW91dDE2CitvdXQxNjoKKwlzdGgJcjQsMChyMykKKwlzeW5jCisJYmxyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBGdW5jdGlvbjoJICBvdXQxNnIgKi8KKy8qICBEZXNjcmlwdGlvbjogIEJ5dGUgcmV2ZXJzZSBhbmQgb3V0cHV0IDE2IGJpdHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJb3V0MTZyCitvdXQxNnI6CisJc3RoYnJ4CXI0LDAscjMKKwlzeW5jCisJYmxyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBGdW5jdGlvbjoJICBvdXQzMiAqLworLyogIERlc2NyaXB0aW9uOiAgT3V0cHV0IDMyIGJpdHMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJb3V0MzIKK291dDMyOgorCXN0dwlyNCwwKHIzKQorCXN5bmMKKwlibHIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogIEZ1bmN0aW9uOgkgIG91dDMyciAqLworLyogIERlc2NyaXB0aW9uOiAgQnl0ZSByZXZlcnNlIGFuZCBvdXRwdXQgMzIgYml0cyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlvdXQzMnIKK291dDMycjoKKwlzdHdicngJcjQsMCxyMworCXN5bmMKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9sb2FkdGFzay5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL2xvYWR0YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4YjYyNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9sb2FkdGFzay5jCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIGNvZGUKKyAqIChDKSBDb3B5cmlnaHQgTW90b3JvbGEsIEluYy4sIDIwMDAKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODIyMC5oPgorCisvKiBNdWx0aWNoYW5uZWwgRE1BIG1pY3JvY29kZSAqLworZXh0ZXJuIGludCB0YXNrVGFibGU7CisKK3ZvaWQgbG9hZHRhc2sgKGludCBiYXNldGFzaywgaW50IHRhc2tzKQoreworCWludCAqc3JhbSA9IChpbnQgKikgKE1NQVBfU1JBTSArIDUxMik7CisJaW50ICp0YXNrX29yZyA9ICZ0YXNrVGFibGU7CisJdW5zaWduZWQgaW50IHN0YXJ0LCBvZmZzZXQsIGVuZDsKKwlpbnQgaTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmICgiYmFzZXRhc2sgPSAlZCwgdGFza3MgPSAlZFxuIiwgYmFzZXRhc2ssIHRhc2tzKTsKKwlwcmludGYgKCJ0YXNrX29yZyA9IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGludCkgdGFza19vcmcpOworI2VuZGlmCisKKwkvKiBzZXR1cCBUYXNrQkFSIHJlZ2lzdGVyICovCisJKih2dV9sb25nICopIE1NQVBfRE1BID0gKE1NQVBfU1JBTSArIDUxMik7CisKKwkvKiByZWxvY2F0ZSB0YXNrIHRhYmxlIGVudHJpZXMgKi8KKwlvZmZzZXQgPSAodW5zaWduZWQgaW50KSBzcmFtOworCWZvciAoaSA9IGJhc2V0YXNrOyBpIDwgYmFzZXRhc2sgKyB0YXNrczsgaSsrKSB7CisJCXNyYW1baSAqIDggKyAwXSA9IHRhc2tfb3JnW2kgKiA4ICsgMF0gKyBvZmZzZXQ7CisJCXNyYW1baSAqIDggKyAxXSA9IHRhc2tfb3JnW2kgKiA4ICsgMV0gKyBvZmZzZXQ7CisJCXNyYW1baSAqIDggKyAyXSA9IHRhc2tfb3JnW2kgKiA4ICsgMl0gKyBvZmZzZXQ7CisJCXNyYW1baSAqIDggKyAzXSA9IHRhc2tfb3JnW2kgKiA4ICsgM10gKyBvZmZzZXQ7CisJCXNyYW1baSAqIDggKyA0XSA9IHRhc2tfb3JnW2kgKiA4ICsgNF07CisJCXNyYW1baSAqIDggKyA1XSA9IHRhc2tfb3JnW2kgKiA4ICsgNV07CisJCXNyYW1baSAqIDggKyA2XSA9IHRhc2tfb3JnW2kgKiA4ICsgNl0gKyBvZmZzZXQ7CisJCXNyYW1baSAqIDggKyA3XSA9IHRhc2tfb3JnW2kgKiA4ICsgN107CisJfQorCisJLyogcmVsb2NhdGUgdGFzayBkZXNjcmlwdG9ycyAqLworCXN0YXJ0ID0gKHNyYW1bYmFzZXRhc2sgKiA4XSAtICh1bnNpZ25lZCBpbnQpIHNyYW0pOworCWVuZCA9IChzcmFtWyhiYXNldGFzayArIHRhc2tzIC0gMSkgKiA4ICsgMV0gLSAodW5zaWduZWQgaW50KSBzcmFtKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmICgiVERUIHN0YXJ0ID0gMHglMDh4LCBlbmQgPSAweCUwOHhcbiIsIHN0YXJ0LCBlbmQpOworI2VuZGlmCisKKwlzdGFydCAvPSA0OworCWVuZCAvPSA0OworCWZvciAoaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7CisJCXNyYW1baV0gPSB0YXNrX29yZ1tpXTsKKwl9CisKKwkvKiByZWxvY2F0ZSB2YXJpYWJsZXMgKi8KKwlzdGFydCA9IChzcmFtW2Jhc2V0YXNrICogOCArIDJdIC0gKHVuc2lnbmVkIGludCkgc3JhbSk7CisJZW5kID0gKHNyYW1bKGJhc2V0YXNrICsgdGFza3MgLSAxKSAqIDggKyAyXSArIDI1NiAtCisJICAgICAgICh1bnNpZ25lZCBpbnQpIHNyYW0pOworCXN0YXJ0IC89IDQ7CisJZW5kIC89IDQ7CisJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQlzcmFtW2ldID0gdGFza19vcmdbaV07CisJfQorCisJLyogcmVsb2NhdGUgZnVuY3Rpb24gZGVjcmlwdG9ycyAqLworCXN0YXJ0ID0gKChzcmFtW2Jhc2V0YXNrICogOCArIDNdICYgMHhmZmZmZmZmYykgLSAodW5zaWduZWQgaW50KSBzcmFtKTsKKwllbmQgPSAoKHNyYW1bKGJhc2V0YXNrICsgdGFza3MgLSAxKSAqIDggKyAzXSAmIDB4ZmZmZmZmZmMpICsgMjU2IC0KKwkgICAgICAgKHVuc2lnbmVkIGludCkgc3JhbSk7CisJc3RhcnQgLz0gNDsKKwllbmQgLz0gNDsKKwlmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisJCXNyYW1baV0gPSB0YXNrX29yZ1tpXTsKKwl9CisKKwlhc20gdm9sYXRpbGUgKCJzeW5jIik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvcGNpLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmNDNiNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9wY2kuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgorICogQ29weXJpZ2h0IChDKSAyMDAzIE1vdG9yb2xhIEluYy4KKyAqIFhpYW5naHVhIFhpYW8gKHgueGlhb0Btb3Rvcm9sYS5jb20pCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIFBDSSBDb25maWd1cmF0aW9uIHNwYWNlIGFjY2VzcyBzdXBwb3J0IGZvciBNUEM4MjIwIFBDSSBCcmlkZ2UKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzgyMjAuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKworLyogU3lzdGVtIFJBTSBtYXBwZWQgb3ZlciBQQ0kgKi8KKyNkZWZpbmUgQ09ORklHX1BDSV9TWVNfTUVNX0JVUwkgQ09ORklHX1NZU19TRFJBTV9CQVNFCisjZGVmaW5lIENPTkZJR19QQ0lfU1lTX01FTV9QSFlTCSBDT05GSUdfU1lTX1NEUkFNX0JBU0UKKyNkZWZpbmUgQ09ORklHX1BDSV9TWVNfTUVNX1NJWkUJICgxMDI0ICogMTAyNCAqIDEwMjQpCisKKyNkZWZpbmUgY2ZnX3JlYWQodmFsLCBhZGRyLCB0eXBlLCBvcCkJCSp2YWwgPSBvcCgodHlwZSkoYWRkcikpOworI2RlZmluZSBjZmdfd3JpdGUodmFsLCBhZGRyLCB0eXBlLCBvcCkJCW9wKCh0eXBlICopKGFkZHIpLCAodmFsKSk7CisKKyNkZWZpbmUgUENJX09QKHJ3LCBzaXplLCB0eXBlLCBvcCwgbWFzaykJCQkJXAoraW50IG1wYzgyMjBfcGNpXyMjcncjI19jb25maWdfIyNzaXplKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwJXAorCXBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQsIHR5cGUgdmFsKQkJCQlcCit7CQkJCQkJCQkJXAorCXUzMiBhZGRyID0gMDsJCQkJCQkJXAorCXUxNiBjZmdfdHlwZSA9IDA7CQkJCQkJXAorCWFkZHIgPSAoKG9mZnNldCAmIDB4ZmMpIHwgY2ZnX3R5cGUgfCAoZGV2KSAgfCAweDgwMDAwMDAwKTsJXAorCW91dF9iZTMyKGhvc2UtPmNmZ19hZGRyLCBhZGRyKTsJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOwkJCQkJXAorCWNmZ18jI3J3KHZhbCwgaG9zZS0+Y2ZnX2RhdGEgKyAob2Zmc2V0ICYgbWFzayksIHR5cGUsIG9wKTsJXAorCW91dF9iZTMyKGhvc2UtPmNmZ19hZGRyLCBhZGRyICYgMHg3ZmZmZmZmZik7CQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30KKworUENJX09QKHJlYWQsIGJ5dGUsIHU4ICosIGluXzgsIDMpCitQQ0lfT1AocmVhZCwgd29yZCwgdTE2ICosIGluX2xlMTYsIDIpCitQQ0lfT1Aod3JpdGUsIGJ5dGUsIHU4LCBvdXRfOCwgMykKK1BDSV9PUCh3cml0ZSwgd29yZCwgdTE2LCBvdXRfbGUxNiwgMikKK1BDSV9PUCh3cml0ZSwgZHdvcmQsIHUzMiwgb3V0X2xlMzIsIDApCisKK2ludCBtcGM4MjIwX3BjaV9yZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYsCisJaW50IG9mZnNldCwgdTMyICp2YWwpCit7CisJdTMyIGFkZHI7CisJdTMyIHRtcHY7CisJdTMyIG1hc2sgPSAyOwkgLyogd29yZCBhY2Nlc3MgKi8KKwkvKiBSZWFkIGxvd2VyIDE2IGJpdHMgKi8KKwlhZGRyID0gKChvZmZzZXQgJiAweGZjKSB8IChkZXYpIHwgMHg4MDAwMDAwMCk7CisJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIsIGFkZHIpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJKnZhbCA9ICh1MzIpIGluX2xlMTYoKHUxNiAqKSAoaG9zZS0+Y2ZnX2RhdGEgKyAob2Zmc2V0ICYgbWFzaykpKTsKKwlvdXRfYmUzMihob3NlLT5jZmdfYWRkciwgYWRkciAmIDB4N2ZmZmZmZmYpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisKKwkvKiBSZWFkIHVwcGVyIDE2IGJpdHMgKi8KKwlvZmZzZXQgKz0gMjsKKwlhZGRyID0gKChvZmZzZXQgJiAweGZjKSB8IDEgfCAoZGV2KSB8IDB4ODAwMDAwMDApOworCW91dF9iZTMyKGhvc2UtPmNmZ19hZGRyLCBhZGRyKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCXRtcHYgPSAodTMyKSBpbl9sZTE2KCh1MTYgKikgKGhvc2UtPmNmZ19kYXRhICsgKG9mZnNldCAmIG1hc2spKSk7CisJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIsIGFkZHIgJiAweDdmZmZmZmZmKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCisJLyogY29tYmluZSByZXN1bHRzIGludG8gZHdvcmQgdmFsdWUgKi8KKwkqdmFsID0gKHRtcHYgPDwgMTYpIHwgKnZhbDsKKworCXJldHVybiAwOworfQorCit2b2lkCitwY2lfbXBjODIyMF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwl1MzIgd2luMCwgd2luMSwgd2luMjsKKwl2b2xhdGlsZSBtcGM4MjIwX3hjcGNpX3QgKnhjcGNpID0KKwkJKHZvbGF0aWxlIG1wYzgyMjBfeGNwY2lfdCAqKSBNTUFQX1hDUENJOworCisJdm9sYXRpbGUgcGNmZzgyMjBfdCAqcG9ydGNmZyA9ICh2b2xhdGlsZSBwY2ZnODIyMF90ICopIE1NQVBfUENGRzsKKworCXdpbjAgPSAodTMyKSBDT05GSUdfUENJX01FTV9QSFlTOworCXdpbjEgPSAodTMyKSBDT05GSUdfUENJX0lPX1BIWVM7CisJd2luMiA9ICh1MzIpIENPTkZJR19QQ0lfQ0ZHX1BIWVM7CisKKwkvKiBBc3NlcnQgUENJIHJlc2V0ICovCisJb3V0X2JlMzIgKCZ4Y3BjaS0+Z2xiX3N0YXRfY3RsLCBQQ0lfR0xCX1NUQVRfQ1RSTF9QUik7CisKKwkvKiBEaXNhYmxlIHByZWZldGNoaW5nIGJ1dCByZWFkLW11bHRpcGxlcyB3aWxsIHN0aWxsIHByZWZldGNoICovCisJb3V0X2JlMzIgKCZ4Y3BjaS0+dGFyZ2V0X2N0cmwsIDB4MDAwMDAwMDApOworCisJLyogSW5pdGlhdG9yIHdpbmRvd3MgKi8KKwlvdXRfYmUzMiAoJnhjcGNpLT5pbml0X3dpbjAsICAod2luMCA+PiAxNikgfCB3aW4wIHwgMHgwMDNmMDAwMCk7CisJb3V0X2JlMzIgKCZ4Y3BjaS0+aW5pdF93aW4xLCAoKHdpbjEgPj4gMTYpIHwgd2luMSApKTsKKwlvdXRfYmUzMiAoJnhjcGNpLT5pbml0X3dpbjIsICgod2luMiA+PiAxNikgfCB3aW4yICkpOworCisJb3V0X2JlMzIgKCZ4Y3BjaS0+aW5pdF93aW5fY2ZnLAorCQlQQ0lfSU5JVF9XSU5fQ0ZHX1dJTjBfQ1RSTF9FTiB8CisJCVBDSV9JTklUX1dJTl9DRkdfV0lOMV9DVFJMX0VOIHwgUENJX0lOSVRfV0lOX0NGR19XSU4xX0NUUkxfSU8gfAorCQlQQ0lfSU5JVF9XSU5fQ0ZHX1dJTjJfQ1RSTF9FTiB8IFBDSV9JTklUX1dJTl9DRkdfV0lOMl9DVFJMX0lPKTsKKworCW91dF9iZTMyICgmeGNwY2ktPmluaXRfY3RybCwgMHgwMDAwMDAwMCk7CisKKwkvKiBFbmFibGUgYnVzIG1hc3RlciBhbmQgbWVtIGFjY2VzcyAqLworCW91dF9iZTMyICgmeGNwY2ktPnN0YXRfY21kX3JlZywgUENJX1NUQVRfQ01EX0IgfCBQQ0lfU1RBVF9DTURfTSk7CisKKwkvKiBDYWNoZSBsaW5lIHNpemUgYW5kIG1hc3RlciBsYXRlbmN5ICovCisJb3V0X2JlMzIgKCZ4Y3BjaS0+YmlzdF9odHlwX2xhdF9jc2hsLCAoMHhmOCA8PCBQQ0lfQ0ZHMV9MVF9TSElGVCkpOworCisJb3V0X2JlMzIgKCZ4Y3BjaS0+YmFzZTAsIFBDSV9CQVNFX0FERFJfUkVHMCk7IC8qIDI1Nk1CIC0gTUJBUiBzcGFjZSAqLworCW91dF9iZTMyICgmeGNwY2ktPmJhc2UxLCBQQ0lfQkFTRV9BRERSX1JFRzEpOyAvKiAxR0IgLSBTRFJBTSBzcGFjZSAqLworCisJb3V0X2JlMzIgKCZ4Y3BjaS0+dGFyZ2V0X2JhcjAsCisJCVBDSV9UQVJHRVRfQkFTRV9BRERSX1JFRzAgfCBQQ0lfVEFSR0VUX0JBU0VfQUREUl9FTik7CisJb3V0X2JlMzIgKCZ4Y3BjaS0+dGFyZ2V0X2JhcjEsCisJCVBDSV9UQVJHRVRfQkFTRV9BRERSX1JFRzEgfCBQQ0lfVEFSR0VUX0JBU0VfQUREUl9FTik7CisKKwkvKiBEZWFzc2VydCByZXNldCBiaXQgKi8KKwlvdXRfYmUzMiAoJnhjcGNpLT5nbGJfc3RhdF9jdGwsIDB4MDAwMDAwMDApOworCisJLyogRW5hYmxlIFBDSSBidXMgbWFzdGVyIHN1cHBvcnQgKi8KKwkvKiBTZXQgUENJR05UMSwgUENJUkVRMSwgUENJUkVRMC9QQ0lHTlRJTiwgUENJR05UMC9QQ0lSRVFPVVQsCisJICAgICAgIFBDSVJFUTIsIFBDSUdOVDIgKi8KKwlvdXRfYmUzMigodm9sYXRpbGUgdTMyICopJnBvcnRjZmctPnBjZmczLAorCQkoaW5fYmUzMigodm9sYXRpbGUgdTMyICopJnBvcnRjZmctPnBjZmczKSAmIDB4RkMzRkNFN0YpKTsKKwlvdXRfYmUzMigodm9sYXRpbGUgdTMyICopJnBvcnRjZmctPnBjZmczLAorCQkoaW5fYmUzMigodm9sYXRpbGUgdTMyICopJnBvcnRjZmctPnBjZmczKSB8IDB4MDE0MDAxODApKTsKKworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQlDT05GSUdfUENJX01FTV9CVVMsCisJCUNPTkZJR19QQ0lfTUVNX1BIWVMsCisJCUNPTkZJR19QQ0lfTUVNX1NJWkUsCisJCVBDSV9SRUdJT05fTUVNKTsKKworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQlDT05GSUdfUENJX0lPX0JVUywKKwkJQ09ORklHX1BDSV9JT19QSFlTLAorCQlDT05GSUdfUENJX0lPX1NJWkUsCisJCVBDSV9SRUdJT05fSU8pOworCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCUNPTkZJR19QQ0lfU1lTX01FTV9CVVMsCisJCUNPTkZJR19QQ0lfU1lTX01FTV9QSFlTLAorCQlDT05GSUdfUENJX1NZU19NRU1fU0laRSwKKwkJUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX1NZU19NRU1PUlkpOworCisJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKworCWhvc2UtPmNmZ19hZGRyID0gJih4Y3BjaS0+Y2ZnX2Fkcik7CisJaG9zZS0+Y2ZnX2RhdGEgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUNPTkZJR19QQ0lfQ0ZHX0JVUzsKKworCXBjaV9zZXRfb3BzKGhvc2UsCisJCW1wYzgyMjBfcGNpX3JlYWRfY29uZmlnX2J5dGUsCisJCW1wYzgyMjBfcGNpX3JlYWRfY29uZmlnX3dvcmQsCisJCW1wYzgyMjBfcGNpX3JlYWRfY29uZmlnX2R3b3JkLAorCQltcGM4MjIwX3BjaV93cml0ZV9jb25maWdfYnl0ZSwKKwkJbXBjODIyMF9wY2lfd3JpdGVfY29uZmlnX3dvcmQsCisJCW1wYzgyMjBfcGNpX3dyaXRlX2NvbmZpZ19kd29yZCk7CisKKwkvKiBIb3NlIHNjYW4gKi8KKwlwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKKwlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbihob3NlKTsKKworCW91dF9iZTMyICgmeGNwY2ktPmJhc2UwLCBQQ0lfQkFTRV9BRERSX1JFRzApOyAvKiAyNTZNQiAtIE1CQVIgc3BhY2UgKi8KKwlvdXRfYmUzMiAoJnhjcGNpLT5iYXNlMSwgUENJX0JBU0VfQUREUl9SRUcxKTsgLyogMUdCIC0gU0RSQU0gc3BhY2UgKi8KK30KKworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9zcGVlZC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL3NwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhYzg0NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9zcGVlZC5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0LCBGcmVlc2NhbGUsIEluYworICogVHNpQ2h1bmcgTGlldywgVHNpLUNodW5nLkxpZXdAZnJlZXNjYWxlLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODIyMC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3R5cGVkZWYgc3RydWN0IHBsbG11bHRpcGxpZXIgeworCXU4IGhpZDE7CisJaW50IG11bHRpOworCWludCB2Y29fZGl2OworfSBwbGxjZmdfdDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICoKKyAqLworCitpbnQgZ2V0X2Nsb2NrcyAodm9pZCkKK3sKKwlwbGxjZmdfdCBidXMyY29yZVtdID0geworCQl7MHgwMiwgMiwgOH0sCS8qIDEgKi8KKwkJezB4MDEsIDIsIDR9LAorCQl7MHgwQywgMywgOH0sCS8qIDEuNSAqLworCQl7MHgwMCwgMywgNH0sCisJCXsweDE4LCAzLCAyfSwKKwkJezB4MDUsIDQsIDR9LAkvKiAyICovCisJCXsweDA0LCA0LCAyfSwKKwkJezB4MTEsIDUsIDR9LAkvKiAyLjUgKi8KKwkJezB4MDYsIDUsIDJ9LAorCQl7MHgxMCwgNiwgNH0sCS8qIDMgKi8KKwkJezB4MDgsIDYsIDJ9LAorCQl7MHgwRSwgNywgMn0sCS8qIDMuNSAqLworCQl7MHgwQSwgOCwgMn0sCS8qIDQgKi8KKwkJezB4MDcsIDksIDJ9LAkvKiA0LjUgKi8KKwkJezB4MEIsIDEwLCAyfSwJLyogNSAqLworCQl7MHgwOSwgMTEsIDJ9LAkvKiA1LjUgKi8KKwkJezB4MEQsIDEyLCAyfSwJLyogNiAqLworCQl7MHgxMiwgMTMsIDJ9LAkvKiA2LjUgKi8KKwkJezB4MTQsIDE0LCAyfSwJLyogNyAqLworCQl7MHgxNiwgMTUsIDJ9LAkvKiA3LjUgKi8KKwkJezB4MUMsIDE2LCAyfQkvKiA4ICovCisJfTsKKwl1MzIgaGlkMTsKKwlpbnQgaSwgc2l6ZSwgcGNpMmJ1czsKKworI2lmICFkZWZpbmVkKENPTkZJR19TWVNfTVBDODIyMF9DTEtJTikKKyNlcnJvciBjbG9jayBtZWFzdXJpbmcgbm90IGltcGxlbWVudGVkIHlldCAtIGRlZmluZSBDT05GSUdfU1lTX01QQzgyMjBfQ0xLSU4KKyNlbmRpZgorCisJZ2QtPmlucF9jbGsgPSBDT05GSUdfU1lTX01QQzgyMjBfQ0xLSU47CisKKwkvKiBSZWFkIFhMQiB0byBQQ0koSU5QKSBjbG9jayBtdWx0aXBsaWVyICovCisJcGNpMmJ1cyA9ICgqKCh2b2xhdGlsZSB1MzIgKilQQ0lfUkVHX1BDSUdTQ1IpICYKKwkJUENJX1JFR19QQ0lHU0NSX1BDSTJYTEJfQ0xLX01BU0spPj5QQ0lfUkVHX1BDSUdTQ1JfUENJMlhMQl9DTEtfQklUOworCisJLyogWExCIGJ1cyBjbG9jayAqLworCWdkLT5idXNfY2xrID0gQ09ORklHX1NZU19NUEM4MjIwX0NMS0lOICogcGNpMmJ1czsKKworCS8qIFBDSSBjbG9jayBpcyBzYW1lIGFzIGlucHV0IGNsb2NrICovCisJZ2QtPnBjaV9jbGsgPSBDT05GSUdfU1lTX01QQzgyMjBfQ0xLSU47CisKKwkvKiBGbGV4QnVzIGlzIHRlbXBvcmFyeSBzZXQgYXMgdGhlIHNhbWUgYXMgaW5wdXQgY2xvY2sgKi8KKwkvKiB3aWxsIGRvIGR5bmFtaWMgaW4gdGhlIGZ1dHVyZSAqLworCWdkLT5mbGJfY2xrID0gQ09ORklHX1NZU19NUEM4MjIwX0NMS0lOOworCisJLyogQ1BVIENsb2NrIC0gUmVhZCBISUQxICovCisJYXNtIHZvbGF0aWxlICgibWZzcHIgJTAsIDEwMDkiOiI9ciIgKGhpZDEpOik7CisKKwlzaXplID0gc2l6ZW9mIChidXMyY29yZSkgLyBzaXplb2YgKHBsbGNmZ190KTsKKworCWhpZDEgPj49IDI3OworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJaWYgKGhpZDEgPT0gYnVzMmNvcmVbaV0uaGlkMSkgeworCQkJZ2QtPmNwdV9jbGsgPSAoYnVzMmNvcmVbaV0ubXVsdGkgKiBnZC0+YnVzX2NsaykgPj4gMTsKKwkJCWdkLT52Y29fY2xrID0gQ09ORklHX1NZU19NUEM4MjIwX1NZU1BMTF9WQ09fTVVMVElQTElFUiAqIChnZC0+cGNpX2NsayAqIGJ1czJjb3JlW2ldLnZjb19kaXYpLzI7CisJCQlicmVhazsKKwkJfQorCisJLyogaGFyZGNvZGVkIDgxTUh6IGZvciBub3cgKi8KKwlnZC0+cGV2X2NsayA9IDgxMDAwMDAwOworCisJcmV0dXJuICgwKTsKK30KKworaW50IHBydF9tcGM4MjIwX2Nsa3MgKHZvaWQpCit7CisJY2hhciBidWYxWzMyXSwgYnVmMlszMl0sIGJ1ZjNbMzJdLCBidWY0WzMyXTsKKworCXByaW50ZiAoIiAgICAgICBCdXMgJXMgTUh6LCBDUFUgJXMgTUh6LCBQQ0kgJXMgTUh6LCBWQ08gJXMgTUh6XG4iLAorCQlzdHJtaHooYnVmMSwgZ2QtPmJ1c19jbGspLAorCQlzdHJtaHooYnVmMiwgZ2QtPmNwdV9jbGspLAorCQlzdHJtaHooYnVmMywgZ2QtPnBjaV9jbGspLAorCQlzdHJtaHooYnVmNCwgZ2QtPnZjb19jbGspCisJKTsKKwlyZXR1cm4gKDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvc3RhcnQuUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzlkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvc3RhcnQuUwpAQCAtMCwwICsxLDc1MCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgJRGFuIE1hbGVrIDxkbWFsZWtAamxjLm5ldD4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkJTWFnbnVzIERhbW0gPGtpZXJheXBjMDEucC55LmtpZS5lcmEuZXJpY3Nzb24uc2U+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwMyBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiAgVS1Cb290IC0gU3RhcnR1cCBDb2RlIGZvciBNUEM4MjIwIENQVXMKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzgyMjAuaD4KKyNpbmNsdWRlIDx0aW1lc3RhbXAuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19IIDEgICAvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZSAgKi8KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisjaWZuZGVmCSBDT05GSUdfSURFTlRfU1RSSU5HCisjZGVmaW5lCSBDT05GSUdfSURFTlRfU1RSSU5HICIiCisjZW5kaWYKKworLyogV2UgZG9uJ3Qgd2FudCB0aGUgIE1NVSB5ZXQuCisqLworI3VuZGVmCU1TUl9LRVJORUwKKy8qIEZsb2F0aW5nIFBvaW50IGVuYWJsZSwgTWFjaGluZSBDaGVjayBhbmQgUmVjb3ZlcmFibGUgSW50ZXJyLiAqLworI2lmZGVmIERFQlVHCisjZGVmaW5lIE1TUl9LRVJORUwgKE1TUl9GUHxNU1JfUkkpCisjZWxzZQorI2RlZmluZSBNU1JfS0VSTkVMIChNU1JfRlB8TVNSX01FfE1TUl9SSSkKKyNlbmRpZgorCisvKgorICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQorICoKKyAqIFVzZSByMTIgdG8gYWNjZXNzIHRoZSBHT1QKKyAqLworCVNUQVJUX0dPVAorCUdPVF9FTlRSWShfR09UMl9UQUJMRV8pCisJR09UX0VOVFJZKF9GSVhVUF9UQUJMRV8pCisKKwlHT1RfRU5UUlkoX3N0YXJ0KQorCUdPVF9FTlRSWShfc3RhcnRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkoX2VuZF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWSh0cmFuc2Zlcl90b19oYW5kbGVyKQorCisJR09UX0VOVFJZKF9faW5pdF9lbmQpCisJR09UX0VOVFJZKF9lbmQpCisJR09UX0VOVFJZKF9fYnNzX3N0YXJ0KQorCUVORF9HT1QKKworLyoKKyAqIFZlcnNpb24gc3RyaW5nCisgKi8KKwkuZGF0YQorCS5nbG9ibAl2ZXJzaW9uX3N0cmluZwordmVyc2lvbl9zdHJpbmc6CisJLmFzY2lpIFVfQk9PVF9WRVJTSU9OCisJLmFzY2lpICIgKCIsIFVfQk9PVF9EQVRFLCAiIC0gIiwgVV9CT09UX1RJTUUsICIpIgorCS5hc2NpaSBDT05GSUdfSURFTlRfU1RSSU5HLCAiXDAiCisKKy8qCisgKiBFeGNlcHRpb24gdmVjdG9ycworICovCisJLnRleHQKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKwkuZ2xvYmwJX3N0YXJ0Citfc3RhcnQ6CisJbGkJcjIxLCBCT09URkxBR19DT0xEICAvKiBOb3JtYWwgUG93ZXItT24JICAgICovCisJbm9wCisJYglib290X2NvbGQKKworCS4gPSBFWENfT0ZGX1NZU19SRVNFVCArIDB4MTAKKworCS5nbG9ibAlfc3RhcnRfd2FybQorX3N0YXJ0X3dhcm06CisJbGkJcjIxLCBCT09URkxBR19XQVJNICAvKiBTb2Z0d2FyZSByZWJvb3QJICAgICovCisJYglib290X3dhcm0KKworYm9vdF9jb2xkOgorYm9vdF93YXJtOgorCW1mbXNyCXI1CQkgICAgLyogc2F2ZSBtc3IgY29udGVudHMgICAgKi8KKworCS8qIHJlcGxhY2UgZGVmYXVsdCBNQkFSIGJhc2UgYWRkcmVzcyBmcm9tIDB4ODAwMDAwMDAKKwkgICAgdG8gMHhmMDAwMDAwMCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0RFRkFVTFRfTUJBUikgJiYgIWRlZmluZWQoQ09ORklHX1NZU19SQU1CT09UKQorCWxpcwlyMywgQ09ORklHX1NZU19NQkFSQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX01CQVJAbAorCisJLyogTUJBUiBpcyBtaXJyb3JlZCBpbnRvIHRoZSBNQkFSIFNQUiAqLworCW10c3ByCU1CQVIscjMKKwltdHNwcglTUFJOX1NQUkc3VyxyMworCWxpcwlyNCwgQ09ORklHX1NZU19ERUZBVUxUX01CQVJAaAorCXN0dwlyMywgMChyNCkKKyNlbmRpZiAvKiBDT05GSUdfU1lTX0RFRkFVTFRfTUJBUiAqLworCisJLyogSW5pdGlhbGlzZSB0aGUgTVBDODIyMCBwcm9jZXNzb3IgY29yZQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlibCAgaW5pdF84MjIwX2NvcmUKKworCS8qIGluaXRpYWxpemUgc29tZSB0aGluZ3MgdGhhdCBhcmUgaGFyZCB0byBhY2Nlc3MgZnJvbSBDCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBzZXQgdXAgc3RhY2sgaW4gb24tY2hpcCBTUkFNICovCisJbGlzCXIzLCBDT05GSUdfU1lTX0lOSVRfUkFNX0FERFJAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSU5JVF9SQU1fQUREUkBsCisJb3JpCXIxLCByMywgQ09ORklHX1NZU19JTklUX1NQX09GRlNFVAorCisJbGkJcjAsIDAJCS8qIE1ha2Ugcm9vbSBmb3Igc3RhY2sgZnJhbWUgaGVhZGVyIGFuZCAqLworCXN0d3UJcjAsIC00KHIxKQkvKiBjbGVhciBmaW5hbCBzdGFjayBmcmFtZSBzbyB0aGF0CSovCisJc3R3dQlyMCwgLTQocjEpCS8qIHN0YWNrIGJhY2t0cmFjZXMgdGVybWluYXRlIGNsZWFubHkJKi8KKworCS8qIGxldCB0aGUgQy1jb2RlIHNldCB1cCB0aGUgcmVzdAkJCQkqLworCS8qCQkJCQkJCQkqLworCS8qIEJlIGNhcmVmdWwgdG8ga2VlcCBjb2RlIHJlbG9jYXRhYmxlICEJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJR0VUX0dPVAkJCS8qIGluaXRpYWxpemUgR09UIGFjY2VzcwkJKi8KKworCS8qIHIzOiBJTU1SICovCisJYmwJY3B1X2luaXRfZgkvKiBydW4gbG93LWxldmVsIENQVSBpbml0IGNvZGUgKGluIEZsYXNoKSovCisKKwltcglyMywgcjIxCisJLyogcjM6IEJPT1RGTEFHICovCisJYmwJYm9hcmRfaW5pdF9mCS8qIHJ1biAxc3QgcGFydCBvZiBib2FyZCBpbml0IGNvZGUgKGluIEZsYXNoKSovCisKKy8qCisgKiBWZWN0b3IgVGFibGUKKyAqLworCisJLmdsb2JsCV9zdGFydF9vZl92ZWN0b3JzCitfc3RhcnRfb2ZfdmVjdG9yczoKKworLyogTWFjaGluZSBjaGVjayAqLworCVNURF9FWENFUFRJT04oMHgyMDAsIE1hY2hpbmVDaGVjaywgTWFjaGluZUNoZWNrRXhjZXB0aW9uKQorCisvKiBEYXRhIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHgzMDAsIERhdGFTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBJbnN0cnVjdGlvbiBTdG9yYWdlIGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4NDAwLCBJbnN0U3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogRXh0ZXJuYWwgSW50ZXJydXB0IGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4NTAwLCBFeHRJbnRlcnJ1cHQsIGV4dGVybmFsX2ludGVycnVwdCkKKworLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KKwkuID0gMHg2MDAKK0FsaWdubWVudDoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJbWZzcHIJcjQsREFSCisJc3R3CXI0LF9EQVIocjIxKQorCW1mc3ByCXI1LERTSVNSCisJc3R3CXI1LF9EU0lTUihyMjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKEFsaWdubWVudCwgQWxpZ25tZW50RXhjZXB0aW9uLCBNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLworCS4gPSAweDcwMAorUHJvZ3JhbUNoZWNrOgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRVhDX1hGRVJfVEVNUExBVEUoUHJvZ3JhbUNoZWNrLCBQcm9ncmFtQ2hlY2tFeGNlcHRpb24sCisJCU1TUl9LRVJORUwsIENPUFlfRUUpCisKKwlTVERfRVhDRVBUSU9OKDB4ODAwLCBGUFVuYXZhaWxhYmxlLCBVbmtub3duRXhjZXB0aW9uKQorCisJLyogSSBndWVzcyB3ZSBjb3VsZCBpbXBsZW1lbnQgZGVjcmVtZW50ZXIsIGFuZCBtYXkgaGF2ZQorCSAqIHRvIHNvbWVkYXkgZm9yIHRpbWVrZWVwaW5nLgorCSAqLworCVNURF9FWENFUFRJT04oMHg5MDAsIERlY3JlbWVudGVyLCB0aW1lcl9pbnRlcnJ1cHQpCisKKwlTVERfRVhDRVBUSU9OKDB4YTAwLCBUcmFwXzBhLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhiMDAsIFRyYXBfMGIsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGMwMCwgU3lzdGVtQ2FsbCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4ZDAwLCBTaW5nbGVTdGVwLCBVbmtub3duRXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTigweGUwMCwgVHJhcF8wZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4ZjAwLCBUcmFwXzBmLCBVbmtub3duRXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTigweDEwMDAsIEluc3RydWN0aW9uVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTEwMCwgRGF0YUxvYWRUTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxMjAwLCBEYXRhU3RvcmVUTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorI2lmZGVmIERFQlVHCisJLiA9IDB4MTMwMAorCS8qCisJICogVGhpcyBleGNlcHRpb24gb2NjdXJzIHdoZW4gdGhlIHByb2dyYW0gY291bnRlciBtYXRjaGVzIHRoZQorCSAqIEluc3RydWN0aW9uIEFkZHJlc3MgQnJlYWtwb2ludCBSZWdpc3RlciAoSUFCUikuCisJICoKKwkgKiBJIHdhbnQgdGhlIGNwdSB0byBoYWx0IGlmIHRoaXMgb2NjdXJzIHNvIEkgY2FuIGh1bnQgYXJvdW5kCisJICogd2l0aCB0aGUgZGVidWdnZXIgYW5kIGxvb2sgYXQgdGhpbmdzLgorCSAqCisJICogV2hlbiBERUJVRyBpcyBkZWZpbmVkLCBib3RoIG1hY2hpbmUgY2hlY2sgZW5hYmxlIChpbiB0aGUgTVNSKQorCSAqIGFuZCBjaGVja3N0b3AgcmVzZXQgZW5hYmxlIChpbiB0aGUgcmVzZXQgbW9kZSByZWdpc3RlcikgYXJlCisJICogdHVybmVkIG9mZiBhbmQgc28gYSBjaGVja3N0b3AgY29uZGl0aW9uIHdpbGwgcmVzdWx0IGluIHRoZSBjcHUKKwkgKiBoYWx0aW5nLgorCSAqCisJICogSSBmb3JjZSB0aGUgY3B1IGludG8gYSBjaGVja3N0b3AgY29uZGl0aW9uIGJ5IHB1dHRpbmcgYW4gaWxsZWdhbAorCSAqIGluc3RydWN0aW9uIGhlcmUgKGF0IGxlYXN0IHRoaXMgaXMgdGhlIHRoZW9yeSkuCisJICoKKwkgKiB3ZWxsIC0gdGhhdCBkaWRudCB3b3JrLCBzbyBqdXN0IGRvIGFuIGluZmluaXRlIGxvb3AhCisJICovCisxOgliCTFiCisjZWxzZQorCVNURF9FWENFUFRJT04oMHgxMzAwLCBJbnN0cnVjdGlvbkJyZWFrcG9pbnQsIERlYnVnRXhjZXB0aW9uKQorI2VuZGlmCisJU1REX0VYQ0VQVElPTigweDE0MDAsIFNNSSwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHgxNTAwLCBUcmFwXzE1LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxNjAwLCBUcmFwXzE2LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxNzAwLCBUcmFwXzE3LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxODAwLCBUcmFwXzE4LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxOTAwLCBUcmFwXzE5LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxYTAwLCBUcmFwXzFhLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxYjAwLCBUcmFwXzFiLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxYzAwLCBUcmFwXzFjLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxZDAwLCBUcmFwXzFkLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxZTAwLCBUcmFwXzFlLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxZjAwLCBUcmFwXzFmLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyMDAwLCBUcmFwXzIwLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyMTAwLCBUcmFwXzIxLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyMjAwLCBUcmFwXzIyLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyMzAwLCBUcmFwXzIzLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyNDAwLCBUcmFwXzI0LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyNTAwLCBUcmFwXzI1LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyNjAwLCBUcmFwXzI2LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyNzAwLCBUcmFwXzI3LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyODAwLCBUcmFwXzI4LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyOTAwLCBUcmFwXzI5LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyYTAwLCBUcmFwXzJhLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyYjAwLCBUcmFwXzJiLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyYzAwLCBUcmFwXzJjLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyZDAwLCBUcmFwXzJkLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyZTAwLCBUcmFwXzJlLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgyZjAwLCBUcmFwXzJmLCBVbmtub3duRXhjZXB0aW9uKQorCisKKwkuZ2xvYmwJX2VuZF9vZl92ZWN0b3JzCitfZW5kX29mX3ZlY3RvcnM6CisKKwkuID0gMHgzMDAwCisKKy8qCisgKiBUaGlzIGNvZGUgZmluaXNoZXMgc2F2aW5nIHRoZSByZWdpc3RlcnMgdG8gdGhlIGV4Y2VwdGlvbiBmcmFtZQorICogYW5kIGp1bXBzIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyIGZvciB0aGUgZXhjZXB0aW9uLgorICogUmVnaXN0ZXIgcjIxIGlzIHBvaW50ZXIgaW50byB0cmFwIGZyYW1lLCByMSBoYXMgbmV3IHN0YWNrIHBvaW50ZXIuCisgKi8KKwkuZ2xvYmwJdHJhbnNmZXJfdG9faGFuZGxlcgordHJhbnNmZXJfdG9faGFuZGxlcjoKKwlzdHcJcjIyLF9OSVAocjIxKQorCWxpcwlyMjIsTVNSX1BPV0BoCisJYW5kYwlyMjMscjIzLHIyMgorCXN0dwlyMjMsX01TUihyMjEpCisJU0FWRV9HUFIoNywgcjIxKQorCVNBVkVfNEdQUlMoOCwgcjIxKQorCVNBVkVfOEdQUlMoMTIsIHIyMSkKKwlTQVZFXzhHUFJTKDI0LCByMjEpCisJbWZscglyMjMKKwlhbmRpLglyMjQscjIzLDB4M2YwMAkgICAgLyogZ2V0IHZlY3RvciBvZmZzZXQgKi8KKwlzdHcJcjI0LFRSQVAocjIxKQorCWxpCXIyMiwwCisJc3R3CXIyMixSRVNVTFQocjIxKQorCWx3eglyMjQsMChyMjMpCQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgaGFuZGxlciAqLworCWx3eglyMjMsNChyMjMpCQkvKiB3aGVyZSB0byBnbyB3aGVuIGRvbmUgKi8KKwltdHNwcglTUlIwLHIyNAorCW10c3ByCVNSUjEscjIwCisJbXRscglyMjMKKwlTWU5DCisJcmZpCQkJICAgIC8qIGp1bXAgdG8gaGFuZGxlciwgZW5hYmxlIE1NVSAqLworCitpbnRfcmV0dXJuOgorCW1mbXNyCXIyOAkJICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXI0LDAKKwlvcmkJcjQscjQsTVNSX0VFCisJYW5kYwlyMjgscjI4LHI0CisJU1lOQwkJCSAgICAvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkgICAgLyogUmVzdG9yZSBlbnZpcm9ubWVudCAqLworCWx3eglyMCxfTVNSKHIxKQorCW10c3ByCVNSUjAscjIKKwltdHNwcglTUlIxLHIwCisJbHd6CXIwLEdQUjAocjEpCisJbHd6CXIyLEdQUjIocjEpCisJbHd6CXIxLEdQUjEocjEpCisJU1lOQworCXJmaQorCisvKgorICogVGhpcyBjb2RlIGluaXRpYWxpc2VzIHRoZSBNUEM4MjIwIHByb2Nlc3NvciBjb3JlCisgKiAoY29uZm9ybXMgdG8gUG93ZXJQQyA2MDNlIHNwZWMpCisgKiBOb3RlOiBleHBlY3RzIG9yaWdpbmFsIE1TUiBjb250ZW50cyB0byBiZSBpbiByNS4KKyAqLworCisJLmdsb2JsCWluaXRfODIyMF9jb3JlCitpbml0XzgyMjBfY29yZToKKworCS8qIEluaXRpYWxpemUgbWFjaGluZSBzdGF0dXM7IGVuYWJsZSBtYWNoaW5lIGNoZWNrIGludGVycnVwdAkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGkJcjMsIE1TUl9LRVJORUwJICAgIC8qIFNldCBNRSBhbmQgUkkgZmxhZ3MJCSovCisJcmx3aW1pCXIzLCByNSwgMCwgMjUsIDI1ICAgLyogcHJlc2VydmUgSVAgYml0IHNldCBieSBIUkNXCSovCisjaWZkZWYgREVCVUcKKwlybHdpbWkJcjMsIHI1LCAwLCAyMSwgMjIgICAvKiBkZWJ1Z2dlciBtaWdodCBzZXQgU0UgJiBCRSBiaXRzCSovCisjZW5kaWYKKwlTWU5DCQkJICAgIC8qIFNvbWUgY2hpcCByZXZzIG5lZWQgdGhpcy4uLgkqLworCW10bXNyCXIzCisJU1lOQworCW10c3ByCVNSUjEsIHIzCSAgICAvKiBNYWtlIFNSUjEgbWF0Y2ggTVNSCQkqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgSGFyZHdhcmUgSW1wbGVtZW50YXRpb24tZGVwZW5kZW50IFJlZ2lzdGVycwkqLworCS8qIEhJRDAgYWxzbyBjb250YWlucyBjYWNoZSBjb250cm9sCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaXMJcjMsIENPTkZJR19TWVNfSElEMF9JTklUQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0hJRDBfSU5JVEBsCisJU1lOQworCW10c3ByCUhJRDAsIHIzCisKKwlsaXMJcjMsIENPTkZJR19TWVNfSElEMF9GSU5BTEBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19ISUQwX0ZJTkFMQGwKKwlTWU5DCisJbXRzcHIJSElEMCwgcjMKKworCS8qIEVuYWJsZSBFeHRyYSBCQVRzICovCisJbWZzcHIJcjMsIDEwMTEgICAgLyogSElEMiAqLworCWxpcwlyNCwgMHgwMDA0CisJb3JpCXI0LCByNCwgMHgwMDAwCisJb3IJcjQsIHI0LCByMworCW10c3ByCTEwMTEsIHI0CisJc3luYworCisJLyogY2xlYXIgYWxsIEJBVCdzCQkJCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpCXIwLCAwCisJbXRzcHIJREJBVDBVLCByMAorCW10c3ByCURCQVQwTCwgcjAKKwltdHNwcglEQkFUMVUsIHIwCisJbXRzcHIJREJBVDFMLCByMAorCW10c3ByCURCQVQyVSwgcjAKKwltdHNwcglEQkFUMkwsIHIwCisJbXRzcHIJREJBVDNVLCByMAorCW10c3ByCURCQVQzTCwgcjAKKwltdHNwcglEQkFUNFUsIHIwCisJbXRzcHIJREJBVDRMLCByMAorCW10c3ByCURCQVQ1VSwgcjAKKwltdHNwcglEQkFUNUwsIHIwCisJbXRzcHIJREJBVDZVLCByMAorCW10c3ByCURCQVQ2TCwgcjAKKwltdHNwcglEQkFUN1UsIHIwCisJbXRzcHIJREJBVDdMLCByMAorCW10c3ByCUlCQVQwVSwgcjAKKwltdHNwcglJQkFUMEwsIHIwCisJbXRzcHIJSUJBVDFVLCByMAorCW10c3ByCUlCQVQxTCwgcjAKKwltdHNwcglJQkFUMlUsIHIwCisJbXRzcHIJSUJBVDJMLCByMAorCW10c3ByCUlCQVQzVSwgcjAKKwltdHNwcglJQkFUM0wsIHIwCisJbXRzcHIJSUJBVDRVLCByMAorCW10c3ByCUlCQVQ0TCwgcjAKKwltdHNwcglJQkFUNVUsIHIwCisJbXRzcHIJSUJBVDVMLCByMAorCW10c3ByCUlCQVQ2VSwgcjAKKwltdHNwcglJQkFUNkwsIHIwCisJbXRzcHIJSUJBVDdVLCByMAorCW10c3ByCUlCQVQ3TCwgcjAKKwlTWU5DCisKKwkvKiBpbnZhbGlkYXRlIGFsbCB0bGIncwkJCQkJCSovCisJLyoJCQkJCQkJCSovCisJLyogRnJvbSB0aGUgNjAzZSBVc2VyIE1hbnVhbDogIlRoZSA2MDNlIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvICovCisJLyogaW52YWxpZGF0ZSBhIFRMQiBlbnRyeS4gVGhlIFRMQiBJbnZhbGlkYXRlIEVudHJ5ICh0bGJpZSkJKi8KKwkvKiBpbnN0cnVjdGlvbiBpbnZhbGlkYXRlcyB0aGUgVExCIGVudHJ5IGluZGV4ZWQgYnkgdGhlIEVBLCBhbmQgKi8KKwkvKiBvcGVyYXRlcyBvbiBib3RoIHRoZSBpbnN0cnVjdGlvbiBhbmQgZGF0YSBUTEJzIHNpbXVsdGFuZW91c2x5Ki8KKwkvKiBpbnZhbGlkYXRpbmcgZm91ciBUTEIgZW50cmllcyAoYm90aCBzZXRzIGluIGVhY2ggVExCKS4gVGhlCSovCisJLyogaW5kZXggY29ycmVzcG9uZHMgdG8gYml0cyAxNS0xOSBvZiB0aGUgRUEuIFRvIGludmFsaWRhdGUgYWxsICovCisJLyogZW50cmllcyB3aXRoaW4gYm90aCBUTEJzLCAzMiB0bGJpZSBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlCSovCisJLyogaXNzdWVkLCBpbmNyZW1lbnRpbmcgdGhpcyBmaWVsZCBieSBvbmUgZWFjaCB0aW1lLiIJCSovCisJLyoJCQkJCQkJCSovCisJLyogIk5vdGUgdGhhdCB0aGUgdGxiaWEgaW5zdHJ1Y3Rpb24gaXMgbm90IGltcGxlbWVudGVkIG9uIHRoZQkqLworCS8qIDYwM2UuIgkJCQkJCQkqLworCS8qCQkJCQkJCQkqLworCS8qIGJpdHMgMTUtMTkgY29ycmVzcG9uZCB0byBhZGRyZXNzZXMgMHgwMDAwMDAwMCB0byAweDAwMDFGMDAwCSovCisJLyogaW5jcmVtZW50aW5nIGJ5IDB4MTAwMCBlYWNoIHRpbWUuIFRoZSBjb2RlIGJlbG93IGlzIHNvcnQgb2YJKi8KKwkvKiBiYXNlZCBvbiBjb2RlIGluICJmbHVzaF90bGJzIiBmcm9tIGFyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZC5TCSovCisJLyoJCQkJCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaQlyMywgMzIKKwltdGN0cglyMworCWxpCXIzLCAwCisxOgl0bGJpZQlyMworCWFkZGkJcjMsIHIzLCAweDEwMDAKKwliZG56CTFiCisJU1lOQworCisJLyogRG9uZSEJCQkJCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWJscgorCisvKiBDYWNoZSBmdW5jdGlvbnMuCisgKgorICogTm90ZTogcmVxdWlyZXMgdGhhdCBhbGwgY2FjaGUgYml0cyBpbgorICogSElEMCBhcmUgaW4gdGhlIGxvdyBoYWxmIHdvcmQuCisgKi8KKwkuZ2xvYmwJaWNhY2hlX2VuYWJsZQoraWNhY2hlX2VuYWJsZToKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX0hJRDBfSU5JVCAvKiBzZXQgSUNFICYgSUNGSSBiaXQJCSovCisJcmx3aW5tCXIzLCByNCwgMCwgMjEsIDE5ICAgICAvKiBjbGVhciB0aGUgSUNGSSBiaXQJCSovCisKKwkvKgorCSAqIFRoZSBzZXR0aW5nIG9mIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSBlbmFibGUgKElDRSkgYml0IG11c3QgYmUKKwkgKiBwcmVjZWRlZCBieSBhbiBpc3luYyBpbnN0cnVjdGlvbiB0byBwcmV2ZW50IHRoZSBjYWNoZSBmcm9tIGJlaW5nCisJICogZW5hYmxlZCBvciBkaXNhYmxlZCB3aGlsZSBhbiBpbnN0cnVjdGlvbiBhY2Nlc3MgaXMgaW4gcHJvZ3Jlc3MuCisJICovCisJaXN5bmMKKwltdHNwcglISUQwLCByNAkgICAgICAvKiBFbmFibGUgSW5zdHIgQ2FjaGUgJiBJbnZhbCBjYWNoZSAqLworCW10c3ByCUhJRDAsIHIzCSAgICAgIC8qIHVzaW5nIDIgY29uc2VjIGluc3RydWN0aW9ucwkqLworCWlzeW5jCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX2Rpc2FibGUKK2ljYWNoZV9kaXNhYmxlOgorCW1mc3ByCXIzLCBISUQwCisJcmx3aW5tCXIzLCByMywgMCwgMTcsIDE1ICAgICAvKiBjbGVhciB0aGUgSUNFIGJpdAkJKi8KKwltdHNwcglISUQwLCByMworCWlzeW5jCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX3N0YXR1cworaWNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXJsd2lubQlyMywgcjMsIEhJRDBfSUNFX0JJVFBPUyArIDEsIDMxLCAzMQorCWJscgorCisJLmdsb2JsCWRjYWNoZV9lbmFibGUKK2RjYWNoZV9lbmFibGU6CisJbGlzCXI0LCAwCisJb3JpCXI0LCByNCwgSElEMF9EQ0V8SElEMF9EQ0ZJIC8qIHNldCBEQ0UgJiBEQ0ZJIGJpdAkqLworCXJsd2lubQlyMywgcjQsIDAsIDIyLCAyMCAgICAgLyogY2xlYXIgdGhlIERDRkkgYml0CQkqLworCisJLyogRW5hYmxlIGFkZHJlc3MgdHJhbnNsYXRpb24gaW4gTVNSIGJpdCAqLworCW1mbXNyCXI1CisJb3JpCXI1LCByNSwgMHgKKworCisJLyoKKwkgKiBUaGUgc2V0dGluZyBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgZW5hYmxlIChJQ0UpIGJpdCBtdXN0IGJlCisJICogcHJlY2VkZWQgYnkgYW4gaXN5bmMgaW5zdHJ1Y3Rpb24gdG8gcHJldmVudCB0aGUgY2FjaGUgZnJvbSBiZWluZworCSAqIGVuYWJsZWQgb3IgZGlzYWJsZWQgd2hpbGUgYW4gaW5zdHJ1Y3Rpb24gYWNjZXNzIGlzIGluIHByb2dyZXNzLgorCSAqLworCWlzeW5jCisJbXRzcHIJSElEMCwgcjQJICAgICAgLyogRW5hYmxlIERhdGEgQ2FjaGUgJiBJbnZhbCBjYWNoZSovCisJbXRzcHIJSElEMCwgcjMJICAgICAgLyogdXNpbmcgMiBjb25zZWMgaW5zdHJ1Y3Rpb25zCSovCisJaXN5bmMKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZGlzYWJsZQorZGNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlybHdpbm0JcjMsIHIzLCAwLCAxOCwgMTYgICAgIC8qIGNsZWFyIHRoZSBEQ0UgYml0ICovCisJbXRzcHIJSElEMCwgcjMKKwlpc3luYworCWJscgorCisJLmdsb2JsCWRjYWNoZV9zdGF0dXMKK2RjYWNoZV9zdGF0dXM6CisJbWZzcHIJcjMsIEhJRDAKKwlybHdpbm0JcjMsIHIzLCBISUQwX0RDRV9CSVRQT1MgKyAxLCAzMSwgMzEKKwlibHIKKworCS5nbG9ibAlnZXRfcHZyCitnZXRfcHZyOgorCW1mc3ByCXIzLCBQVlIKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogdm9pZCByZWxvY2F0ZV9jb2RlIChhZGRyX3NwLCBnZCwgYWRkcl9tb25pKQorICoKKyAqIFRoaXMgImZ1bmN0aW9uIiBkb2VzIG5vdCByZXR1cm4sIGluc3RlYWQgaXQgY29udGludWVzIGluIFJBTQorICogYWZ0ZXIgcmVsb2NhdGluZyB0aGUgbW9uaXRvciBjb2RlLgorICoKKyAqIHIzID0gZGVzdAorICogcjQgPSBzcmMKKyAqIHI1ID0gbGVuZ3RoIGluIGJ5dGVzCisgKiByNiA9IGNhY2hlbGluZXNpemUKKyAqLworCS5nbG9ibAlyZWxvY2F0ZV9jb2RlCityZWxvY2F0ZV9jb2RlOgorCW1yCXIxLCAgcjMJICAgIC8qIFNldCBuZXcgc3RhY2sgcG9pbnRlcgkJKi8KKwltcglyOSwgIHI0CSAgICAvKiBTYXZlIGNvcHkgb2YgR2xvYmFsIERhdGEgcG9pbnRlciAqLworCW1yCXIxMCwgcjUJICAgIC8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisKKwlHRVRfR09UCisJbXIJcjMsICByNQkgICAgLyogRGVzdGluYXRpb24gQWRkcmVzcwkJKi8KKwlsaXMJcjQsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGgJLyogU291cmNlIEFkZHJlc3MJKi8KKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBsCisJbHd6CXI1LCBHT1QoX19pbml0X2VuZCkKKwlzdWIJcjUsIHI1LCByNAorCWxpCXI2LCBDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCS8qIENhY2hlIExpbmUgU2l6ZQkqLworCisJLyoKKwkgKiBGaXggR09UIHBvaW50ZXI6CisJICoKKwkgKiBOZXcgR09ULVBUUiA9IChvbGQgR09ULVBUUiAtIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFKSArIERlc3RpbmF0aW9uIEFkZHJlc3MKKwkgKgorCSAqIE9mZnNldDoKKwkgKi8KKwlzdWIJcjE1LCByMTAsIHI0CisKKwkvKiBGaXJzdCBvdXIgb3duIEdPVCAqLworCWFkZAlyMTIsIHIxMiwgcjE1CisJLyogdGhlbiB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLworCWFkZAlyMzAsIHIzMCwgcjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisKKwljbXBsdwljcjEscjMscjQKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJYmVxCWNyMSw0ZgkgICAgLyogSW4gcGxhY2UgY29weSBpcyBub3QgbmVjZXNzYXJ5CSovCisJYmVxCTdmCSAgICAvKiBQcm90ZWN0IGFnYWluc3QgMCBjb3VudAkJKi8KKwltdGN0cglyMAorCWJnZQljcjEsMmYKKworCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisJYgk0ZgorCisyOglzbHdpCXIwLHIwLDIKKwlhZGQJcjgscjQscjAKKwlhZGQJcjcscjMscjAKKzM6CWx3enUJcjAsLTQocjgpCisJc3R3dQlyMCwtNChyNykKKwliZG56CTNiCisKKy8qCisgKiBOb3cgZmx1c2ggdGhlIGNhY2hlOiBub3RlIHRoYXQgd2UgbXVzdCBzdGFydCBmcm9tIGEgY2FjaGUgYWxpZ25lZAorICogYWRkcmVzcy4gT3RoZXJ3aXNlIHdlIG1pZ2h0IG1pc3Mgb25lIGNhY2hlIGxpbmUuCisgKi8KKzQ6CWNtcHdpCXI2LDAKKwlhZGQJcjUscjMscjUKKwliZXEJN2YJICAgIC8qIEFsd2F5cyBmbHVzaCBwcmVmZXRjaCBxdWV1ZSBpbiBhbnkgY2FzZQkqLworCXN1YmkJcjAscjYsMQorCWFuZGMJcjMscjMscjAKKwltZnNwcglyNyxISUQwCSAgICAvKiBkb24ndCBkbyBkY2JzdCBpZiBkY2FjaGUgaXMgZGlzYWJsZWQJKi8KKwlybHdpbm0JcjcscjcsSElEMF9EQ0VfQklUUE9TKzEsMzEsMzEKKwljbXB3aQlyNywwCisJYmVxCTlmCisJbXIJcjQscjMKKzU6CWRjYnN0CTAscjQKKwlhZGQJcjQscjQscjYKKwljbXBsdwlyNCxyNQorCWJsdAk1YgorCXN5bmMJCSAgICAvKiBXYWl0IGZvciBhbGwgZGNic3QgdG8gY29tcGxldGUgb24gYnVzCSovCis5OgltZnNwcglyNyxISUQwCSAgICAvKiBkb24ndCBkbyBpY2JpIGlmIGljYWNoZSBpcyBkaXNhYmxlZAkqLworCXJsd2lubQlyNyxyNyxISUQwX0lDRV9CSVRQT1MrMSwzMSwzMQorCWNtcHdpCXI3LDAKKwliZXEJN2YKKwltcglyNCxyMworNjoJaWNiaQkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNmIKKzc6CXN5bmMJCSAgICAvKiBXYWl0IGZvciBhbGwgaWNiaSB0byBjb21wbGV0ZSBvbiBidXMJKi8KKwlpc3luYworCisvKgorICogV2UgYXJlIGRvbmUuIERvIG5vdCByZXR1cm4sIGluc3RlYWQgYnJhbmNoIHRvIHNlY29uZCBwYXJ0IG9mIGJvYXJkCisgKiBpbml0aWFsaXphdGlvbiwgbm93IHJ1bm5pbmcgZnJvbSBSQU0uCisgKi8KKworCWFkZGkJcjAsIHIxMCwgaW5fcmFtIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwltdGxyCXIwCisJYmxyCisKK2luX3JhbToKKworCS8qCisJICogUmVsb2NhdGlvbiBGdW5jdGlvbiwgcjEyIHBvaW50IHRvIGdvdDIrMHg4MDAwCisJICoKKwkgKiBBZGp1c3QgZ290MiBwb2ludGVycywgbm8gbmVlZCB0byBjaGVjayBmb3IgMCwgdGhpcyBjb2RlCisJICogYWxyZWFkeSBwdXRzIGEgZmV3IGVudHJpZXMgaW4gdGhlIHRhYmxlLgorCSAqLworCWxpCXIwLF9fZ290Ml9lbnRyaWVzQHNlY3RvZmZAbAorCWxhCXIzLEdPVChfR09UMl9UQUJMRV8pCisJbHd6CXIxMSxHT1QoX0dPVDJfVEFCTEVfKQorCW10Y3RyCXIwCisJc3ViCXIxMSxyMyxyMTEKKwlhZGRpCXIzLHIzLC00CisxOglsd3p1CXIwLDQocjMpCisJY21wd2kJcjAsMAorCWJlcS0JMmYKKwlhZGQJcjAscjAscjExCisJc3R3CXIwLDAocjMpCisyOgliZG56CTFiCisKKwkvKgorCSAqIE5vdyBhZGp1c3QgdGhlIGZpeHVwcyBhbmQgdGhlIHBvaW50ZXJzIHRvIHRoZSBmaXh1cHMKKwkgKiBpbiBjYXNlIHdlIG5lZWQgdG8gbW92ZSBvdXJzZWx2ZXMgYWdhaW4uCisJICovCisJbGkJcjAsX19maXh1cF9lbnRyaWVzQHNlY3RvZmZAbAorCWx3eglyMyxHT1QoX0ZJWFVQX1RBQkxFXykKKwljbXB3aQlyMCwwCisJbXRjdHIJcjAKKwlhZGRpCXIzLHIzLC00CisJYmVxCTRmCiszOglsd3p1CXI0LDQocjMpCisJbHd6dXgJcjAscjQscjExCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMTAsMChyMykKKwlzdHcJcjAsMChyNCkKKwliZG56CTNiCis0OgorY2xlYXJfYnNzOgorCS8qCisJICogTm93IGNsZWFyIEJTUyBzZWdtZW50CisJICovCisJbHd6CXIzLEdPVChfX2Jzc19zdGFydCkKKwlsd3oJcjQsR09UKF9lbmQpCisKKwljbXBsdwkwLCByMywgcjQKKwliZXEJNmYKKworCWxpCXIwLCAwCis1OgorCXN0dwlyMCwgMChyMykKKwlhZGRpCXIzLCByMywgNAorCWNtcGx3CTAsIHIzLCByNAorCWJuZQk1YgorNjoKKworCW1yCXIzLCByOQkgICAgLyogR2xvYmFsIERhdGEgcG9pbnRlcgkqLworCW1yCXI0LCByMTAJICAgIC8qIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKwlibAlib2FyZF9pbml0X3IKKworCS8qCisJICogQ29weSBleGNlcHRpb24gdmVjdG9yIGNvZGUgdG8gbG93IG1lbW9yeQorCSAqCisJICogcjM6IGRlc3RfYWRkcgorCSAqIHI3OiBzb3VyY2UgYWRkcmVzcywgcjg6IGVuZCBhZGRyZXNzLCByOTogdGFyZ2V0IGFkZHJlc3MKKwkgKi8KKwkuZ2xvYmwJdHJhcF9pbml0Cit0cmFwX2luaXQ6CisJbWZscglyNAkgICAgLyogc2F2ZSBsaW5rIHJlZ2lzdGVyCQkqLworCUdFVF9HT1QKKwlsd3oJcjcsIEdPVChfc3RhcnQpCisJbHd6CXI4LCBHT1QoX2VuZF9vZl92ZWN0b3JzKQorCisJbGkJcjksIDB4MTAwICAgLyogcmVzZXQgdmVjdG9yIGFsd2F5cyBhdCAweDEwMAkqLworCisJY21wbHcJMCwgcjcsIHI4CisJYmdlbHIJCSAgICAvKiByZXR1cm4gaWYgcjc+PXI4IC0ganVzdCBpbiBjYXNlCSovCisxOgorCWx3eglyMCwgMChyNykKKwlzdHcJcjAsIDAocjkpCisJYWRkaQlyNywgcjcsIDQKKwlhZGRpCXI5LCByOSwgNAorCWNtcGx3CTAsIHI3LCByOAorCWJuZQkxYgorCisJLyoKKwkgKiByZWxvY2F0ZSBgaGRscicgYW5kIGBpbnRfcmV0dXJuJyBlbnRyaWVzCisJICovCisJbGkJcjcsIC5MX01hY2hpbmVDaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIEFsaWdubWVudCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisyOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJICAgIC8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkgICAgKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJMmIKKworCWxpCXI3LCAuTF9BbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9Qcm9ncmFtQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgU3lzdGVtQ2FsbCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCiszOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJICAgIC8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkgICAgKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJM2IKKworCWxpCXI3LCAuTF9TaW5nbGVTdGVwIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgX2VuZF9vZl92ZWN0b3JzIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzQ6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkgICAgLyogbmV4dCBleGNlcHRpb24gdmVjdG9yCSAgICAqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAk0YgorCisJbWZtc3IJcjMJCSAgICAvKiBub3cgdGhhdCB0aGUgdmVjdG9ycyBoYXZlICAgICovCisJbGlzCXI3LCBNU1JfSVBAaAkgICAgLyogcmVsb2NhdGVkIGludG8gbG93IG1lbW9yeSAgICAqLworCW9yaQlyNywgcjcsIE1TUl9JUEBsICAgIC8qIE1TUltJUF0gY2FuIGJlIHR1cm5lZCBvZmYgICAgKi8KKwlhbmRjCXIzLCByMywgcjcJICAgIC8qIChpZiBpdCB3YXMgb24pCQkgICAgKi8KKwlTWU5DCQkJICAgIC8qIFNvbWUgY2hpcCByZXZzIG5lZWQgdGhpcy4uLiAgKi8KKwltdG1zcglyMworCVNZTkMKKworCW10bHIJcjQJCSAgICAvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIJICAgICovCisJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODk0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvdHJhcHMuYwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2ICBHYXJ5IFRob21hcyAoZ2R0QGxpbnV4cHBjLm9yZykKKyAqCisgKiBNb2RpZmllZCBieSBDb3J0IERvdWdhbiAoY29ydEBjcy5ubXQuZWR1KQorICogYW5kIFBhdWwgTWFja2VycmFzIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKKyAqIGZpeGVkIE1hY2hpbmUgQ2hlY2sgUmVhc29ucyBieSBSZWluaGFyZCBNZXllciAoci5tZXllckBlbWstZWxla3Ryb25pay5kZSkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgaGFyZHdhcmUgZXhjZXB0aW9ucworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8a2dkYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworLyogUmV0dXJucyAwIGlmIGV4Y2VwdGlvbiBub3QgZm91bmQgYW5kIGZpeHVwIG90aGVyd2lzZS4gICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlICh1bnNpZ25lZCBsb25nKTsKKworLyogVEhJUyBORUVEUyBDSEFOR0lORyB0byB1c2UgdGhlIGJvYXJkIGluZm8gc3RydWN0dXJlLgorKi8KKyNkZWZpbmUgRU5EX09GX01FTSAgICAgIDB4MDIwMDAwMDAKKworLyoKKyAqIFRyYXAgJiBFeGNlcHRpb24gc3VwcG9ydAorICovCisKK3ZvaWQgcHJpbnRfYmFja3RyYWNlICh1bnNpZ25lZCBsb25nICpzcCkKK3sKKwlpbnQgY250ID0gMDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlwcmludGYgKCJDYWxsIGJhY2t0cmFjZTogIik7CisJd2hpbGUgKHNwKSB7CisJCWlmICgodWludCkgc3AgPiBFTkRfT0ZfTUVNKQorCQkJYnJlYWs7CisKKwkJaSA9IHNwWzFdOworCQlpZiAoY250KysgJSA3ID09IDApCisJCQlwcmludGYgKCJcbiIpOworCQlwcmludGYgKCIlMDhsWCAiLCBpKTsKKwkJaWYgKGNudCA+IDMyKQorCQkJYnJlYWs7CisJCXNwID0gKHVuc2lnbmVkIGxvbmcgKikgKnNwOworCX0KKwlwcmludGYgKCJcbiIpOworfQorCit2b2lkIHNob3dfcmVncyAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGk7CisKKwlwcmludGYgKCJOSVA6ICUwOGxYIFhFUjogJTA4bFggTFI6ICUwOGxYIFJFR1M6ICVwIFRSQVA6ICUwNGx4IERBUjogJTA4bFhcbiIsCisJCXJlZ3MtPm5pcCwgcmVncy0+eGVyLCByZWdzLT5saW5rLCByZWdzLCByZWdzLT50cmFwLCByZWdzLT5kYXIpOworCXByaW50ZiAoIk1TUjogJTA4bHggRUU6ICUwMXggUFI6ICUwMXggRlA6ICUwMXggTUU6ICUwMXggSVIvRFI6ICUwMXglMDF4XG4iLAorCQlyZWdzLT5tc3IsCisJCXJlZ3MtPm1zciAmIE1TUl9FRSA/IDEgOiAwLCByZWdzLT5tc3IgJiBNU1JfUFIgPyAxIDogMCwKKwkJcmVncy0+bXNyICYgTVNSX0ZQID8gMSA6IDAsIHJlZ3MtPm1zciAmIE1TUl9NRSA/IDEgOiAwLAorCQlyZWdzLT5tc3IgJiBNU1JfSVIgPyAxIDogMCwgcmVncy0+bXNyICYgTVNSX0RSID8gMSA6IDApOworCisJcHJpbnRmICgiXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlpZiAoKGkgJSA4KSA9PSAwKSB7CisJCQlwcmludGYgKCJHUFIlMDJkOiAiLCBpKTsKKwkJfQorCisJCXByaW50ZiAoIiUwOGxYICIsIHJlZ3MtPmdwcltpXSk7CisJCWlmICgoaSAlIDgpID09IDcpIHsKKwkJCXByaW50ZiAoIlxuIik7CisJCX0KKwl9Cit9CisKKwordm9pZCBfZXhjZXB0aW9uIChpbnQgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNob3dfcmVncyAocmVncyk7CisJcHJpbnRfYmFja3RyYWNlICgodW5zaWduZWQgbG9uZyAqKSByZWdzLT5ncHJbMV0pOworCXBhbmljICgiRXhjZXB0aW9uIGluIGtlcm5lbCBwYyAlbHggc2lnbmFsICVkIiwgcmVncy0+bmlwLCBzaWducik7Cit9CisKK3ZvaWQgTWFjaGluZUNoZWNrRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZpeHVwOworCisJLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgorCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCisJICogdGhlIFBDSSBleGNlcHRpb24gaGFuZGxlci4KKwkgKi8KKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSAocmVncy0+bmlwKSkgIT0gMCkgeworCQlyZWdzLT5uaXAgPSBmaXh1cDsKKwkJcmV0dXJuOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIKKwkgICAgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ZiAoIk1hY2hpbmUgY2hlY2sgaW4ga2VybmVsIG1vZGUuXG4iKTsKKwlwcmludGYgKCJDYXVzZWQgYnkgKGZyb20gbXNyKTogIik7CisJcHJpbnRmICgicmVncyAlcCAiLCByZWdzKTsKKwkvKiByZWZlciB0byA2MDNlIE1hbnVhbCAoTVBDNjAzRVVNL0FEKSwgY2hhcHRlciA0LjUuMi4xICovCisJc3dpdGNoIChyZWdzLT5tc3IgJiAweDAwMEYwMDAwKSB7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxMik6CisJCXByaW50ZiAoIk1hY2hpbmUgY2hlY2sgc2lnbmFsIC0gcHJvYmFibHkgZHVlIHRvIG1tIGZhdWx0XG4iCisJCQkid2l0aCBtbXUgb2ZmXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxMyk6CisJCXByaW50ZiAoIlRyYW5zZmVyIGVycm9yIGFjayBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDE0KToKKwkJcHJpbnRmICgiRGF0YSBwYXJpdHkgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMCA+PiAxNSk6CisJCXByaW50ZiAoIkFkZHJlc3MgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZiAoIlVua25vd24gdmFsdWVzIGluIG1zclxuIik7CisJfQorCXNob3dfcmVncyAocmVncyk7CisJcHJpbnRfYmFja3RyYWNlICgodW5zaWduZWQgbG9uZyAqKSByZWdzLT5ncHJbMV0pOworCXBhbmljICgibWFjaGluZSBjaGVjayIpOworfQorCit2b2lkIEFsaWdubWVudEV4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyCisJICAgICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopIHJlZ3MtPmdwclsxXSk7CisJcGFuaWMgKCJBbGlnbm1lbnQgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIKKwkgICAgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MgKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSAoKHVuc2lnbmVkIGxvbmcgKikgcmVncy0+Z3ByWzFdKTsKKwlwYW5pYyAoIlByb2dyYW0gQ2hlY2sgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQgU29mdEVtdUV4Y2VwdGlvbiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyCisJICAgICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzIChyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UgKCh1bnNpZ25lZCBsb25nICopIHJlZ3MtPmdwclsxXSk7CisJcGFuaWMgKCJTb2Z0d2FyZSBFbXVsYXRpb24gRXhjZXB0aW9uIik7Cit9CisKKwordm9pZCBVbmtub3duRXhjZXB0aW9uIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIKKwkgICAgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlwcmludGYgKCJCYWQgdHJhcCBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4XG4iLAorCQlyZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CisJX2V4Y2VwdGlvbiAoMCwgcmVncyk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQorZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQgKHN0cnVjdCBwdF9yZWdzICopOworI2VuZGlmCisKK3ZvaWQgRGVidWdFeGNlcHRpb24gKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCisJcHJpbnRmICgiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwKTsKKwlzaG93X3JlZ3MgKHJlZ3MpOworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCisJZG9fYmVkYnVnX2JyZWFrcG9pbnQgKHJlZ3MpOworI2VuZGlmCit9CisKKy8qIFByb2JlIGFuIGFkZHJlc3MgYnkgcmVhZGluZy4gIElmIG5vdCBwcmVzZW50LCByZXR1cm4gLTEsIG90aGVyd2lzZQorICogcmV0dXJuIDAuCisgKi8KK2ludCBhZGRyX3Byb2JlICh1aW50ICogYWRkcikKK3sKKyNpZiAwCisJaW50IHJldHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiMTogbHd6ICUwLDAoJTEpXG4iCisJCQkgICAgICAiICAgZWllaW9cbiIKKwkJCSAgICAgICIgICBsaSAlMCwwXG4iCisJCQkgICAgICAiMjpcbiIKKwkJCSAgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCQkgICAgICAiMzogbGkgJTAsLTFcbiIKKwkJCSAgICAgICIgICBiIDJiXG4iCisJCQkgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkJICAgICAgIiAgIC5hbGlnbiAyXG4iCisJCQkgICAgICAiICAgLmxvbmcgMWIsM2JcbiIKKwkJCSAgICAgICIudGV4dCI6Ij1yIiAocmV0dmFsKToiciIgKGFkZHIpKTsKKworCXJldHVybiAocmV0dmFsKTsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL3UtYm9vdC5sZHMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWE3YTBlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KQl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGFyY2gvcG93ZXJwYy9jcHUvbXBjODIyMC9zdGFydC5vCSgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgICAgLiA9IEFMSUdOKDE2KTsKKyAgICAqKC5laF9mcmFtZSkKKyAgICAqKFNPUlRfQllfQUxJR05NRU5UKFNPUlRfQllfTkFNRSgucm9kYXRhKikpKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzIChOT0xPQUQpICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLiA9IEFMSUdOKDQpOworICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyMjAvdWFydC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL3VhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzRiNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjIwL3VhcnQuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCwgRnJlZXNjYWxlLCBJbmMKKyAqIFRzaUNodW5nIExpZXcsIFRzaS1DaHVuZy5MaWV3QGZyZWVzY2FsZS5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qCisgKiBNaW5pbWFsIHNlcmlhbCBmdW5jdGlvbnMgbmVlZGVkIHRvIHVzZSBvbmUgb2YgdGhlIFBTQyBwb3J0cworICogYXMgc2VyaWFsIGNvbnNvbGUgaW50ZXJmYWNlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4MjIwLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjZGVmaW5lIFBTQ19CQVNFICAgTU1BUF9QU0MxCisKKyNpZiBkZWZpbmVkKENPTkZJR19QU0NfQ09OU09MRSkKK2ludCBzZXJpYWxfaW5pdCAodm9pZCkKK3sKKwl2b2xhdGlsZSBwc2M4MjIwX3QgKnBzYyA9IChwc2M4MjIwX3QgKikgUFNDX0JBU0U7CisJdTMyIGNvdW50ZXI7CisKKwkvKiB3cml0ZSB0byBTSUNSOiBTSU0yID0gdWFydCBtb2RlLGRjZCBkb2VzIG5vdCBhZmZlY3QgcnggKi8KKwlwc2MtPmNyID0gMDsKKwlwc2MtPmlwY3JfYWNyID0gMDsKKwlwc2MtPmlzcl9pbXIgPSAwOworCisJLyogd3JpdGUgdG8gQ1NSOiBSWC9UWCBiYXVkIHJhdGUgZnJvbSB0aW1lcnMgKi8KKwlwc2MtPnNyX2NzciA9IDB4ZGQwMDAwMDA7CisKKwlwc2MtPm1yMV8yID0gUFNDX01SMV9CSVRTX0NIQVJfOCB8IFBTQ19NUjFfTk9fUEFSSVRZIHwgUFNDX01SMl9TVE9QX0JJVFNfMTsKKworCS8qIFNldHRpbmcgdXAgQmF1ZFJhdGUgKi8KKwljb3VudGVyID0gKChnZC0+YnVzX2NsayAvIGdkLT5iYXVkcmF0ZSkpID4+IDU7CisJY291bnRlcisrOworCisJLyogd3JpdGUgdG8gQ1RVUjogZGl2aWRlIGNvdW50ZXIgdXBwZXIgYnl0ZSAqLworCXBzYy0+Y3R1ciA9ICgoY291bnRlciAmIDB4ZmYwMCkgPDwgMTYpOworCS8qIHdyaXRlIHRvIENUTFI6IGRpdmlkZSBjb3VudGVyIGxvd2VyIGJ5dGUgKi8KKwlwc2MtPmN0bHIgPSAoKGNvdW50ZXIgJiAweDAwZmYpIDw8IDI0KTsKKworCXBzYy0+Y3IgPSBQU0NfQ1JfUlNUX1JYX0NNRDsKKwlwc2MtPmNyID0gUFNDX0NSX1JTVF9UWF9DTUQ7CisJcHNjLT5jciA9IFBTQ19DUl9SU1RfRVJSX1NUU19DTUQ7CisJcHNjLT5jciA9IFBTQ19DUl9SU1RfQlJLX0lOVF9DTUQ7CisJcHNjLT5jciA9IFBTQ19DUl9SU1RfTVJfUFRSX0NNRDsKKworCXBzYy0+Y3IgPSBQU0NfQ1JfUlhfRU5BQkxFIHwgUFNDX0NSX1RYX0VOQUJMRTsKKwlyZXR1cm4gKDApOworfQorCit2b2lkIHNlcmlhbF9wdXRjIChjb25zdCBjaGFyIGMpCit7CisJdm9sYXRpbGUgcHNjODIyMF90ICpwc2MgPSAocHNjODIyMF90ICopIFBTQ19CQVNFOworCisJaWYgKGMgPT0gJ1xuJykKKwkJc2VyaWFsX3B1dGMgKCdccicpOworCisJLyogV2FpdCBmb3IgbGFzdCBjaGFyYWN0ZXIgdG8gZ28uICovCisJd2hpbGUgKCEocHNjLT5zcl9jc3IgJiBQU0NfU1JfVFhSRFkpKTsKKworCXBzYy0+eG1pdGJ1ZlswXSA9IGM7Cit9CisKK3ZvaWQgc2VyaWFsX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXNlcmlhbF9wdXRjICgqcysrKTsKKwl9Cit9CisKK2ludCBzZXJpYWxfZ2V0YyAodm9pZCkKK3sKKwl2b2xhdGlsZSBwc2M4MjIwX3QgKnBzYyA9IChwc2M4MjIwX3QgKikgUFNDX0JBU0U7CisKKwkvKiBXYWl0IGZvciBhIGNoYXJhY3RlciB0byBhcnJpdmUuICovCisJd2hpbGUgKCEocHNjLT5zcl9jc3IgJiBQU0NfU1JfUlhSRFkpKTsKKwlyZXR1cm4gcHNjLT54bWl0YnVmWzJdOworfQorCitpbnQgc2VyaWFsX3RzdGMgKHZvaWQpCit7CisJdm9sYXRpbGUgcHNjODIyMF90ICpwc2MgPSAocHNjODIyMF90ICopIFBTQ19CQVNFOworCisJcmV0dXJuIChwc2MtPnNyX2NzciAmIFBTQ19TUl9SWFJEWSk7Cit9CisKK3ZvaWQgc2VyaWFsX3NldGJyZyAodm9pZCkKK3sKKwl2b2xhdGlsZSBwc2M4MjIwX3QgKnBzYyA9IChwc2M4MjIwX3QgKikgUFNDX0JBU0U7CisJdTMyIGNvdW50ZXI7CisKKwljb3VudGVyID0gKChnZC0+YnVzX2NsayAvIGdkLT5iYXVkcmF0ZSkpID4+IDU7CisJY291bnRlcisrOworCisJLyogd3JpdGUgdG8gQ1RVUjogZGl2aWRlIGNvdW50ZXIgdXBwZXIgYnl0ZSAqLworCXBzYy0+Y3R1ciA9ICgoY291bnRlciAmIDB4ZmYwMCkgPDwgMTYpOworCS8qIHdyaXRlIHRvIENUTFI6IGRpdmlkZSBjb3VudGVyIGxvd2VyIGJ5dGUgKi8KKwlwc2MtPmN0bHIgPSAoKGNvdW50ZXIgJiAweDAwZmYpIDw8IDI0KTsKKworCXBzYy0+Y3IgPSBQU0NfQ1JfUlNUX1JYX0NNRDsKKwlwc2MtPmNyID0gUFNDX0NSX1JTVF9UWF9DTUQ7CisKKwlwc2MtPmNyID0gUFNDX0NSX1JYX0VOQUJMRSB8IFBTQ19DUl9UWF9FTkFCTEU7Cit9CisjZW5kaWYgLyogQ09ORklHX1BTQ19DT05TT0xFICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvLmdpdGlnbm9yZSBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzk5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisvYmVkYnVnXzYwM2UuYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1N2FkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvTWFrZWZpbGUKQEAgLTAsMCArMSw1NiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKK2lmbmVxICgkKE9CSlRSRUUpLCQoU1JDVFJFRSkpCiskKHNoZWxsIG1rZGlyIC1wICQob2JqKWRyaXZlcnMvZXBpYykKKyQoc2hlbGwgbWtkaXIgLXAgJChvYmopZHJpdmVycy9pMmMpCitlbmRpZgorCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk9IHN0YXJ0Lm8KK0NPQkpTCT0gdHJhcHMubyBjcHUubyBjcHVfaW5pdC5vIGludGVycnVwdHMubyBzcGVlZC5vIFwKKwkgIGRyaXZlcnMvZXBpYy9lcGljMS5vIGRyaXZlcnMvaTJjL2kyYy5vIHBjaS5vCitDT0JKU19MTiA9IGJlZGJ1Z182MDNlLm8KKworU1JDUwk6PSAkKFNUQVJUOi5vPS5TKSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKU19MTjoubz0uYykpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSAkKENPQkpTX0xOKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworJChvYmopYmVkYnVnXzYwM2UuYzoKKwlsbiAtc2YgJChzcmMpLi4vbXBjODI2MC9iZWRidWdfNjAzZS5jICQob2JqKWJlZGJ1Z182MDNlLmMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9jb25maWcubWsgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YzI4NzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1tZWFiaQorCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19NUEM4MjRYIC1mZml4ZWQtcjIgLW1zdHJpbmcgLW1jcHU9NjAzZSAtbXNvZnQtZmxvYXQKKworIyBVc2UgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQm9hcmQgcG9ydCBjYW4gb3ZlcnJpZGUgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGY2YTk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2NwdS5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwIC0gMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjODI0eC5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK2ludCBjaGVja2NwdSAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcHZyID0gZ2V0X3B2ciAoKTsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbiA9IHB2ciA+PiAxNjsKKwl1bnNpZ25lZCBjaGFyIHJldmlzaW9uOworCXVsb25nIGNsb2NrID0gZ2QtPmNwdV9jbGs7CisJY2hhciBidWZbMzJdOworCisJcHV0cyAoIkNQVTogICAiKTsKKworCXN3aXRjaCAodmVyc2lvbikgeworCWNhc2UgQ1BVX1RZUEVfODI0MDoKKwkJcHV0cyAoIk1QQzgyNDAiKTsKKwkJYnJlYWs7CisKKwljYXNlIENQVV9UWVBFXzgyNDU6CisJCXB1dHMgKCJNUEM4MjQ1Iik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOwkJLypub3QgdmFsaWQgZm9yIHRoaXMgc291cmNlICovCisJfQorCisJQ09ORklHX1JFQURfQllURSAoUkVWSUQsIHJldmlzaW9uKTsKKworCWlmIChyZXZpc2lvbikgeworCQlwcmludGYgKCIgUmV2aXNpb24gJWQuJWQiLAorCQkJKHJldmlzaW9uICYgMHhmMCkgPj4gNCwKKwkJCShyZXZpc2lvbiAmIDB4MGYpKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLTE7CQkvKiBubyB2YWxpZCBDUFUgcmV2aXNpb24gaW5mbyAqLworCX0KKworCXByaW50ZiAoIiBhdCAlcyBNSHo6Iiwgc3RybWh6IChidWYsIGNsb2NrKSk7CisKKwlwcmludGYgKCIgJXUga0IgSS1DYWNoZSIsIGNoZWNraWNhY2hlICgpID4+IDEwKTsKKwlwcmludGYgKCIgJXUga0IgRC1DYWNoZSIsIGNoZWNrZGNhY2hlICgpID4+IDEwKTsKKworCXB1dHMgKCJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEwxIGktY2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IGNoZWNraWNhY2hlICh2b2lkKQoreworCSAvKlRPRE8qLworCSByZXR1cm4gMTI4ICogNCAqIDMyOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogTDEgZC1jYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgY2hlY2tkY2FjaGUgKHZvaWQpCit7CisJIC8qVE9ETyovCisJIHJldHVybiAxMjggKiA0ICogMzI7CisKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgZG9fcmVzZXQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVsb25nIG1zciwgYWRkcjsKKworCS8qIEludGVycnVwdHMgYW5kIE1NVSBvZmYgKi8KKwlfX2FzbV9fICgibXRzcHIgICAgODEsIDAiKTsKKworCS8qIEludGVycnVwdHMgYW5kIE1NVSBvZmYgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1mbXNyICAgICUwIjoiPXIiIChtc3IpOik7CisKKwltc3IgJj0gfjB4MTAzMDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm10bXNyICAgICUwIjo6InIiIChtc3IpKTsKKworCS8qCisJICogVHJ5aW5nIHRvIGV4ZWN1dGUgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gYXQgYSBub24tZXhpc3RpbmcgYWRkcmVzcworCSAqIHNob3VsZCBjYXVzZSBhIG1hY2hpbmUgY2hlY2ssIHJlc3VsdGluZyBpbiByZXNldAorCSAqLworI2lmZGVmIENPTkZJR19TWVNfUkVTRVRfQUREUkVTUworCWFkZHIgPSBDT05GSUdfU1lTX1JFU0VUX0FERFJFU1M7CisjZWxzZQorCS8qCisJICogbm90ZTogd2hlbiBDT05GSUdfU1lTX01PTklUT1JfQkFTRSBwb2ludHMgdG8gYSBSQU0gYWRkcmVzcywKKwkgKiBDT05GSUdfU1lTX01PTklUT1JfQkFTRSAtIHNpemVvZiAodWxvbmcpIGlzIHVzdWFsbHkgYSB2YWxpZAorCSAqIGFkZHJlc3MuIEJldHRlciBwaWNrIGFuIGFkZHJlc3Mga25vd24gdG8gYmUgaW52YWxpZCBvbgorCSAqIHlvdXIgc3lzdGVtIGFuZCBhc3NpZ24gaXQgdG8gQ09ORklHX1NZU19SRVNFVF9BRERSRVNTLgorCSAqICIodWxvbmcpLTEiIHVzZWQgdG8gYmUgYSBnb29kIGNob2ljZSBmb3IgbWFueSBzeXN0ZW1zLi4uCisJICovCisJYWRkciA9IENPTkZJR19TWVNfTU9OSVRPUl9CQVNFIC0gc2l6ZW9mICh1bG9uZyk7CisjZW5kaWYKKwkoKHZvaWQgKCopKHZvaWQpKSBhZGRyKSAoKTsKKwlyZXR1cm4gMTsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBHZXQgdGltZWJhc2UgY2xvY2sgZnJlcXVlbmN5IChsaWtlIGNwdV9jbGsgaW4gSHopCisgKiBUaGlzIGlzIHRoZSBzeXNfbG9naWNfY2xrIChtZW1vcnkgYnVzKSBkaXZpZGVkIGJ5IDQKKyAqLwordW5zaWduZWQgbG9uZyBnZXRfdGJjbGsgKHZvaWQpCit7CisJcmV0dXJuICgoZ2V0X2J1c19mcmVxICgwKSArIDJMKSAvIDRMKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGhlIE1QQzgyNHggaGFzIGFuIGludGVncmF0ZWQgUENJIGNvbnRyb2xsZXIga25vd24gYXMgdGhlIE1QQzEwNy4KKyAqIFRoZSBmb2xsb3dpbmcgYXJlIE1QQzEwNyBCcmlkZ2UgQ29udHJvbGxlciBhbmQgUENJIFN1cHBvcnQgZnVuY3Rpb25zCisgKgorICovCisKKy8qCisgKiAgVGhpcyBwcm9jZWR1cmUgcmVhZHMgYSAzMi1iaXQgYWRkcmVzcyBNUEMxMDcgcmVnaXN0ZXIsIGFuZCByZXR1cm5zCisgKiAgYSAzMiBiaXQgdmFsdWUuICBJdCBzd2FwcyB0aGUgYWRkcmVzcyB0byBsaXR0bGUgZW5kaWFuIGJlZm9yZQorICogIHdyaXRpbmcgaXQgdG8gY29uZmlnIGFkZHJlc3MsIGFuZCBzd2FwcyB0aGUgdmFsdWUgdG8gYmlnIGVuZGlhbgorICogIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIGNhbGxlci4KKyAqLwordW5zaWduZWQgaW50IG1wYzgyNHhfbXBjMTA3X2dldHJlZyAodW5zaWduZWQgaW50IHJlZ051bSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCS8qIHN3YXAgdGhlIGFkZHIuIHRvIGxpdHRsZSBlbmRpYW4gKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSBDSFJQX1JFR19BRERSID0gUENJU1dBUCAocmVnTnVtKTsKKwl0ZW1wID0gKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgQ0hSUF9SRUdfREFUQTsKKwlyZXR1cm4gUENJU1dBUCAodGVtcCk7CQkvKiBzd2FwIHRoZSBkYXRhIHVwb24gcmV0dXJuICovCit9CisKKy8qCisgKiAgVGhpcyBwcm9jZWR1cmUgd3JpdGVzIGEgMzItYml0IGFkZHJlc3MgTVBDMTA3IHJlZ2lzdGVyLiAgSXQgc3dhcHMKKyAqICB0aGUgYWRkcmVzcyB0byBsaXR0bGUgZW5kaWFuIGJlZm9yZSB3cml0aW5nIGl0IHRvIGNvbmZpZyBhZGRyZXNzLgorICovCisKK3ZvaWQgbXBjODI0eF9tcGMxMDdfc2V0cmVnICh1bnNpZ25lZCBpbnQgcmVnTnVtLCB1bnNpZ25lZCBpbnQgcmVnVmFsKQoreworCS8qIHN3YXAgdGhlIGFkZHIuIHRvIGxpdHRsZSBlbmRpYW4gKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSBDSFJQX1JFR19BRERSID0gUENJU1dBUCAocmVnTnVtKTsKKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSBDSFJQX1JFR19EQVRBID0gUENJU1dBUCAocmVnVmFsKTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqICBXcml0ZSBhIGJ5dGUgKDggYml0cykgdG8gYSBtZW1vcnkgbG9jYXRpb24uCisgKi8KK3ZvaWQgbXBjODI0eF9tcGMxMDdfd3JpdGU4ICh1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCSoodW5zaWduZWQgY2hhciAqKSBhZGRyID0gZGF0YTsKKwlfX2FzbV9fICgic3luYyIpOworfQorCisvKgorICogIFdyaXRlIGEgd29yZCAoMTYgYml0cykgdG8gYSBtZW1vcnkgbG9jYXRpb24gYWZ0ZXIgdGhlIHZhbHVlCisgKiAgaGFzIGJlZW4gYnl0ZSBzd2FwcGVkIChiaWcgdG8gbGl0dGxlIGVuZGlhbiBvciB2aWNlIHZlcnNhKQorICovCisKK3ZvaWQgbXBjODI0eF9tcGMxMDdfd3JpdGUxNiAodW5zaWduZWQgaW50IGFkZHJlc3MsIHVuc2lnbmVkIHNob3J0IGRhdGEpCit7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBhZGRyZXNzID0gQllURV9TV0FQXzE2X0JJVCAoZGF0YSk7CisJX19hc21fXyAoInN5bmMiKTsKK30KKworLyoKKyAqICBXcml0ZSBhIGxvbmcgd29yZCAoMzIgYml0cykgdG8gYSBtZW1vcnkgbG9jYXRpb24gYWZ0ZXIgdGhlIHZhbHVlCisgKiAgaGFzIGJlZW4gYnl0ZSBzd2FwcGVkIChiaWcgdG8gbGl0dGxlIGVuZGlhbiBvciB2aWNlIHZlcnNhKQorICovCisKK3ZvaWQgbXBjODI0eF9tcGMxMDdfd3JpdGUzMiAodW5zaWduZWQgaW50IGFkZHJlc3MsIHVuc2lnbmVkIGludCBkYXRhKQoreworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIGFkZHJlc3MgPSBMT05HU1dBUCAoZGF0YSk7CisJX19hc21fXyAoInN5bmMiKTsKK30KKworLyoKKyAqICBSZWFkIGEgYnl0ZSAoOCBiaXRzKSBmcm9tIGEgbWVtb3J5IGxvY2F0aW9uLgorICovCit1bnNpZ25lZCBjaGFyIG1wYzgyNHhfbXBjMTA3X3JlYWQ4ICh1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGFkZHI7Cit9CisKKworLyoKKyAqICBSZWFkIGEgd29yZCAoMTYgYml0cykgZnJvbSBhIG1lbW9yeSBsb2NhdGlvbiwgYW5kIGJ5dGUgc3dhcCB0aGUKKyAqICB2YWx1ZSBiZWZvcmUgcmV0dXJuaW5nIHRvIHRoZSBjYWxsZXIuCisgKi8KK3Vuc2lnbmVkIHNob3J0IG1wYzgyNHhfbXBjMTA3X3JlYWQxNiAodW5zaWduZWQgaW50IGFkZHJlc3MpCit7CisJdW5zaWduZWQgc2hvcnQgcmV0VmFsOworCisJcmV0VmFsID0gQllURV9TV0FQXzE2X0JJVCAoKih1bnNpZ25lZCBzaG9ydCAqKSBhZGRyZXNzKTsKKwlyZXR1cm4gcmV0VmFsOworfQorCisKKy8qCisgKiAgUmVhZCBhIGxvbmcgd29yZCAoMzIgYml0cykgZnJvbSBhIG1lbW9yeSBsb2NhdGlvbiwgYW5kIGJ5dGUKKyAqICBzd2FwIHRoZSB2YWx1ZSBiZWZvcmUgcmV0dXJuaW5nIHRvIHRoZSBjYWxsZXIuCisgKi8KK3Vuc2lnbmVkIGludCBtcGM4MjR4X21wYzEwN19yZWFkMzIgKHVuc2lnbmVkIGludCBhZGRyZXNzKQoreworCXVuc2lnbmVkIGludCByZXRWYWw7CisKKwlyZXRWYWwgPSBMT05HU1dBUCAoKih1bnNpZ25lZCBpbnQgKikgYWRkcmVzcyk7CisJcmV0dXJuIChyZXRWYWwpOworfQorCisKKy8qCisgKiAgUmVhZCBhIHJlZ2lzdGVyIGluIHRoZSBFbWJlZGRlZCBVdGlsaXRpZXMgTWVtb3J5IEJsb2NrIGFkZHJlc3MKKyAqICBzcGFjZS4KKyAqICBJbnB1dDogcmVnTnVtIC0gcmVnaXN0ZXIgbnVtYmVyICsgdXRpbGl0eSBiYXNlIGFkZHJlc3MuICBFeGFtcGxlLAorICogICAgICAgICB0aGUgYmFzZSBhZGRyZXNzIG9mIEVQSUMgaXMgMHg0MDAwMCwgdGhlIHJlZ2lzdGVyIG51bWJlcgorICoJICAgYmVpbmcgcGFzc2VkIGlzIDB4NDAwMDArdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCByZWdpc3Rlci4KKyAqCSAgIChTZWUgZXBpYy5oIGZvciByZWdpc3RlciBhZGRyZXNzZXMpLgorICogIE91dHB1dDogIFRoZSAzMiBiaXQgbGl0dGxlIGVuZGlhbiB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIuCisgKi8KKwordW5zaWduZWQgaW50IG1wYzgyNHhfZXVtbWJhcl9yZWFkICh1bnNpZ25lZCBpbnQgcmVnTnVtKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9ICoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChFVU1CQkFSX1ZBTCArIHJlZ051bSk7CisJdGVtcCA9IFBDSVNXQVAgKHRlbXApOworCXJldHVybiB0ZW1wOworfQorCisKKy8qCisgKiAgV3JpdGUgYSB2YWx1ZSB0byBhIHJlZ2lzdGVyIGluIHRoZSBFbWJlZGRlZCBVdGlsaXRpZXMgTWVtb3J5CisgKiAgQmxvY2sgYWRkcmVzcyBzcGFjZS4KKyAqICBJbnB1dDogcmVnTnVtIC0gcmVnaXN0ZXIgbnVtYmVyICsgdXRpbGl0eSBiYXNlIGFkZHJlc3MuICBFeGFtcGxlLAorICogICAgICAgICAgICAgICAgICB0aGUgYmFzZSBhZGRyZXNzIG9mIEVQSUMgaXMgMHg0MDAwMCwgdGhlIHJlZ2lzdGVyCisgKgkgICAgICAgICAgICBudW1iZXIgaXMgMHg0MDAwMCt0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IHJlZ2lzdGVyLgorICoJICAgICAgICAgICAgKFNlZSBlcGljLmggZm9yIHJlZ2lzdGVyIGFkZHJlc3NlcykuCisgKiAgICAgICAgIHJlZ1ZhbCAtIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHJlZ2lzdGVyLgorICovCisKK3ZvaWQgbXBjODI0eF9ldW1tYmFyX3dyaXRlICh1bnNpZ25lZCBpbnQgcmVnTnVtLCB1bnNpZ25lZCBpbnQgcmVnVmFsKQoreworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChFVU1CQkFSX1ZBTCArIHJlZ051bSkgPSBQQ0lTV0FQIChyZWdWYWwpOworCXJldHVybjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2NwdV9pbml0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvY3B1X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTVmNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2NwdV9pbml0LmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFJvYiBUYXlsb3IuIEZseWluZyBQaWcgU3lzdGVtcy4gcm9idEBmbHlpbmdwaWcuY29tLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8bXBjODI0eC5oPgorCisjaWZuZGVmIENPTkZJR19TWVNfQkFOSzBfUk9XCisjZGVmaW5lIENPTkZJR19TWVNfQkFOSzBfUk9XIDAKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfU1lTX0JBTksxX1JPVworI2RlZmluZSBDT05GSUdfU1lTX0JBTksxX1JPVyAwCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1NZU19CQU5LMl9ST1cKKyNkZWZpbmUgQ09ORklHX1NZU19CQU5LMl9ST1cgMAorI2VuZGlmCisjaWZuZGVmIENPTkZJR19TWVNfQkFOSzNfUk9XCisjZGVmaW5lIENPTkZJR19TWVNfQkFOSzNfUk9XIDAKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfU1lTX0JBTks0X1JPVworI2RlZmluZSBDT05GSUdfU1lTX0JBTks0X1JPVyAwCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1NZU19CQU5LNV9ST1cKKyNkZWZpbmUgQ09ORklHX1NZU19CQU5LNV9ST1cgMAorI2VuZGlmCisjaWZuZGVmIENPTkZJR19TWVNfQkFOSzZfUk9XCisjZGVmaW5lIENPTkZJR19TWVNfQkFOSzZfUk9XIDAKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfU1lTX0JBTks3X1JPVworI2RlZmluZSBDT05GSUdfU1lTX0JBTks3X1JPVyAwCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1NZU19EQlVTX1NJWkUyCisjZGVmaW5lIENPTkZJR19TWVNfREJVU19TSVpFMiAwCisjZW5kaWYKKworLyoKKyAqIEJyZWF0aCBzb21lIGxpZmUgaW50byB0aGUgQ1BVLi4uCisgKgorICogU2V0IHVwIHRoZSBtZW1vcnkgbWFwLAorICogaW5pdGlhbGl6ZSBhIGJ1bmNoIG9mIHJlZ2lzdGVycywKKyAqLwordm9pZAorY3B1X2luaXRfZiAodm9pZCkKK3sKKy8qIE1PVVNTRSBib2FyZCBpcyBpbml0aWFsaXplZCBpbiBhc20gKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfTU9VU1NFKSAmJiAhZGVmaW5lZChDT05GSUdfQk1XKQorICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIENPTkZJR19XUklURV9IQUxGV09SRChQQ0lDUiwgMHgwNik7IC8qIEJ1cyBNYXN0ZXIsIHJlc3BvbmQgdG8gUENJIG1lbW9yeSBzcGFjZSBhY2Vzc2VzKi8KKy8qICAgIENPTkZJR19XUklURV9IQUxGV09SRChQQ0lTUiwgMHhmZmZmKTsgKi8gLypyZXNldCBQQ0lTUiovCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVVNFTktJKSB8fCBkZWZpbmVkKENPTkZJR19QTjYyKQorLyogV2h5IGlzIHRoaXMgaGVyZSwgeW91IGFzaz8gIFRyeSwganVzdCB0cnkgc2V0dGluZyAweDgwMDAKKyAqIGluIFBDSUFDUiB3aXRoIENPTkZJR19XUklURV9IQUxGV09SRCgpCisgKiB0aGlzIG9uZSB3YXMgYSBzdHVtcGVyLCBhbmQgd2UgYXJlIGFubm95ZWQKKyAqLworCisjZGVmaW5lIE1fQ09ORklHX1dSSVRFX0hBTEZXT1JEKCBhZGRyLCBkYXRhICkgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCIJCVwKKwkJc3R3ICAlMiwwKCUwKVxuCQlcCisJCXN5bmNcbgkJCVwKKwkJc3RoICAlMywyKCUxKVxuCQlcCisJCXN5bmNcbgkJCVwKKwkJIgkJCVwKKwkJOiAvKiBubyBvdXRwdXQgKi8JXAorCQk6ICJyIiAoQ09ORklHX0FERFIpLCAiciIgKENPTkZJR19EQVRBKSwJCQlcCisJCSJyIiAoUENJU1dBUChhZGRyICYgfjMpKSwgInIiIChQQ0lTV0FQKGRhdGEgPDwgMTYpKQlcCisJKTsKKworCU1fQ09ORklHX1dSSVRFX0hBTEZXT1JEKFBDSUFDUiwgMHg4MDAwKTsKKyNlbmRpZgorCisJQ09ORklHX1dSSVRFX0JZVEUoUENMU1IsIDB4OCk7CS8qIHNldCBQQ0kgY2FjaGUgbGluZSBzaXplICovCisJQ09ORklHX1dSSVRFX0JZVEUgKFBMVFIsIDB4NDApOyAvKiBzZXQgUENJIGxhdGVuY3kgdGltZXIgKi8KKwkvKgorCSogTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgYml0IGlzIGNsZWFyZWQgYWZ0ZXIgYSBoYXJkIHJlc2V0LCBpdAorCSogbXVzdCBiZSBleHBsaWNpdGx5IHNldCBhbmQgdGhlbiBjbGVhcmVkIGJ5IHNvZnR3YXJlIGR1cmluZworCSogaW5pdGlhbGl6YXRpb24gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIGNvcnJlY3Qgb3BlcmF0aW9uIG9mIHRoZQorCSogRExMIGFuZCB0aGUgU0RSQU1fQ0xLWzA6M10gc2lnbmFscyAoaWYgdGhleSBhcmUgdXNlZCkuCisJKi8KKwlDT05GSUdfUkVBRF9CWVRFIChBTUJPUiwgdmFsKTsKKwlDT05GSUdfV1JJVEVfQllURShBTUJPUiwgdmFsICYgMHhERik7CisJQ09ORklHX1dSSVRFX0JZVEUoQU1CT1IsIHZhbCB8IDB4MjApOworCUNPTkZJR19XUklURV9CWVRFKEFNQk9SLCB2YWwgJiAweERGKTsKKyNpZmRlZiBDT05GSUdfTVBDODI0NQorCS8qIHNpbGljb24gYnVnIDI4IE1QQzgyNDUgKi8KKwlDT05GSUdfUkVBRF9CWVRFKEFNQk9SLHZhbCk7CisJQ09ORklHX1dSSVRFX0JZVEUoQU1CT1IsdmFsfDB4MSk7CisKKyNpZiAwCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGJ1ZyBvbmx5IGFmZmVjdHMgb2xkZXIgKFhQQzgyNDUpIHByb2Nlc3NvcnMuCisJICogRE1BIHRyYW5zZmVycyBpbml0aWF0ZWQgYnkgZXh0ZXJuYWwgZGV2aWNlcyBnZXQgY29ycnVwdGVkIGR1ZQorCSAqIHRvIGEgaGFyZHdhcmUgc2NoZWR1bGluZyBwcm9ibGVtLgorCSAqCisJICogVGhlIGVmZmVjdCBpczoKKwkgKiB3aGVuIHRyYW5zZmVycmluZyBYIHdvcmRzLCB0aGUgZmlyc3QgMzIgd29yZHMgYXJlIHRyYW5zZmVycmVkCisJICogT0ssIHRoZSBuZXh0IDMgeCAzMiB3b3JkcyBhcmUgJ29sZCcgZGF0YSAoZnJvbSBwcmV2aW91cyBETUEpCisJICogd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIFggd29yZHMgaXMgeGZlcnJlZCBmaW5lLgorCSAqCisJICogRGlzYWJsaW5nIDMgb2YgdGhlIDQgMzIgd29yZCBoYXJkd2FyZSBidWZmZXJzIHNvbHZlcyB0aGUgcHJvYmxlbQorCSAqIHdpdGggbm8gc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgbG9zcy4KKwkgKi8KKworCUNPTkZJR19SRUFEX0JZVEUoUENNQkNSLHZhbCk7CisJLyogaW4gb3JkZXIgbm90IHRvIGNvcnJ1cHQgZGF0YSB3aGljaCBpcyBiZWluZyByZWFkIG92ZXIgdGhlIFBDSSBidXMKKwkqIHdpdGggdGhlIFBQQyBhcyBzbGF2ZSwgd2UgbmVlZCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBQQ01SQnMgdG8gMSwKKwkqIDQuMTEgaW4gdGhlICBwcm9jZXNzb3IgdXNlciBtYW51YWwKKwkqICovCisKKyNpZiAxCisJQ09ORklHX1dSSVRFX0JZVEUoUENNQkNSLCh2YWx8MHhDMCkpOyAvKiAxIFBDTVJCICovCisjZWxzZQorCUNPTkZJR19XUklURV9CWVRFKFBDTUJDUiwodmFsfDB4ODApKTsgLyogMiBQQ01SQnMgKi8KKwlDT05GSUdfV1JJVEVfQllURShQQ01CQ1IsKHZhbHwweDQwKSk7IC8qIDMgUENNUkJzICovCisJLyogZGVmYXVsdCwgNCBQQ01SQnMgYXJlIHVzZWQgKi8KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworCUNPTkZJR19SRUFEX1dPUkQoUElDUjEsIHZhbCk7CisjaWYgZGVmaW5lZChDT05GSUdfTVBDODI0MCkKKwlDT05GSUdfV1JJVEVfV09SRCggUElDUjEsCisJCSh2YWwgJiAoUElDUjFfQUREUkVTU19NQVAgfCBQSUNSMV9SQ1MwKSkgfAorCQkgICAgICAgUElSQzFfTVNLIHwgUElDUjFfUFJPQ19UWVBFXzYwM0UgfAorCQkgICAgICAgUElDUjFfRkxBU0hfV1JfRU4gfCBQSUNSMV9NQ1BfRU4gfAorCQkgICAgICAgUElDUjFfQ0ZfRFBBUksgfCBQSUNSMV9FTl9QQ1MgfAorCQkgICAgICAgUElDUjFfQ0ZfQVBBUksgKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgyNDUpCisJQ09ORklHX1dSSVRFX1dPUkQoIFBJQ1IxLAorCQkodmFsICYgKFBJQ1IxX1JDUzApKSB8CisJCSAgICAgICBQSUNSMV9QUk9DX1RZUEVfNjAzRSB8CisJCSAgICAgICBQSUNSMV9GTEFTSF9XUl9FTiB8IFBJQ1IxX01DUF9FTiB8CisJCSAgICAgICBQSUNSMV9DRl9EUEFSSyB8IFBJQ1IxX05PX0JVU1dfQ0sgfAorCQkgICAgICAgUElDUjFfREVDfCBQSUNSMV9DRl9BUEFSSyB8IDB4MTApOyAvKiA4MjQ1IFVNIHNheXMgYml0IDQgbXVzdCBiZSBzZXQgKi8KKyNlbHNlCisjZXJyb3IgU3BlY2lmaWMgdHlwZSBvZiBNUEM4MjR4IG11c3QgYmUgZGVmaW5lZCAoaS5lLiBDT05GSUdfTVBDODI0MCkKKyNlbmRpZgorCisJQ09ORklHX1JFQURfV09SRChQSUNSMiwgdmFsKTsKKwl2YWw9IHZhbCAmIH4gKFBJQ1IyX0NGX1NOT09QX1dTX01BU0sgfCBQSUNSMl9DRl9BUEhBU0VfV1NfTUFTSyk7IC8qbWFzayBvZmYgd2FpdHN0YXRlIGJpdHMqLworI2lmbmRlZiBDT05GSUdfUE42MgorCXZhbCB8PSBQSUNSMl9DRl9TTk9PUF9XU18xV1MgfCBQSUNSMl9DRl9BUEhBU0VfV1NfMVdTOyAvKjEgd2FpdCBzdGF0ZSovCisjZW5kaWYKKwlDT05GSUdfV1JJVEVfV09SRChQSUNSMiwgdmFsKTsKKworCUNPTkZJR19XUklURV9XT1JEKEVVTUJCQVIsIENPTkZJR19TWVNfRVVNQl9BRERSKTsKKyNpZm5kZWYgQ09ORklHX1NZU19SQU1CT09UCisJQ09ORklHX1dSSVRFX1dPUkQoTUNDUjEsIChDT05GSUdfU1lTX1JPTU5BTCA8PCBNQ0NSMV9ST01OQUxfU0hJRlQpIHwKKwkJCQkgKENPTkZJR19TWVNfQkFOSzBfUk9XKSB8CisJCQkJIChDT05GSUdfU1lTX0JBTksxX1JPVyA8PCBNQ0NSMV9CQU5LMVJPV19TSElGVCkgfAorCQkJCSAoQ09ORklHX1NZU19CQU5LMl9ST1cgPDwgTUNDUjFfQkFOSzJST1dfU0hJRlQpIHwKKwkJCQkgKENPTkZJR19TWVNfQkFOSzNfUk9XIDw8IE1DQ1IxX0JBTkszUk9XX1NISUZUKSB8CisJCQkJIChDT05GSUdfU1lTX0JBTks0X1JPVyA8PCBNQ0NSMV9CQU5LNFJPV19TSElGVCkgfAorCQkJCSAoQ09ORklHX1NZU19CQU5LNV9ST1cgPDwgTUNDUjFfQkFOSzVST1dfU0hJRlQpIHwKKwkJCQkgKENPTkZJR19TWVNfQkFOSzZfUk9XIDw8IE1DQ1IxX0JBTks2Uk9XX1NISUZUKSB8CisJCQkJIChDT05GSUdfU1lTX0JBTks3X1JPVyA8PCBNQ0NSMV9CQU5LN1JPV19TSElGVCkgfAorCQkJCSAoQ09ORklHX1NZU19ST01GQUwgPDwgTUNDUjFfUk9NRkFMX1NISUZUKSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19BU1JJU0UpICYmIGRlZmluZWQoQ09ORklHX1NZU19BU0ZBTEwpCisJQ09ORklHX1dSSVRFX1dPUkQoTUNDUjIsIENPTkZJR19TWVNfUkVGSU5UIDw8IE1DQ1IyX1JFRklOVF9TSElGVCB8CisJCQkJIENPTkZJR19TWVNfQVNSSVNFIDw8IE1DQ1IyX0FTUklTRV9TSElGVCB8CisJCQkJIENPTkZJR19TWVNfQVNGQUxMIDw8IE1DQ1IyX0FTRkFMTF9TSElGVCk7CisjZWxzZQorCUNPTkZJR19XUklURV9XT1JEKE1DQ1IyLCBDT05GSUdfU1lTX1JFRklOVCA8PCBNQ0NSMl9SRUZJTlRfU0hJRlQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQwKQorCUNPTkZJR19XUklURV9XT1JEKE1DQ1IzLAorCQkoKChDT05GSUdfU1lTX0JTVE9QUkUgJiAweDAwM2MpID4+IDIpIDw8IE1DQ1IzX0JTVE9QUkUyVE81X1NISUZUKSB8CisJCShDT05GSUdfU1lTX1JFRlJFQyA8PCBNQ0NSM19SRUZSRUNfU0hJRlQpIHwKKwkJKENPTkZJR19TWVNfUkRMQVQgIDw8IE1DQ1IzX1JETEFUX1NISUZUKSk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQ1KQorCUNPTkZJR19XUklURV9XT1JEKE1DQ1IzLAorCQkoKChDT05GSUdfU1lTX0JTVE9QUkUgJiAweDAwM2MpID4+IDIpIDw8IE1DQ1IzX0JTVE9QUkUyVE81X1NISUZUKSB8CisJCShDT05GSUdfU1lTX1JFRlJFQyA8PCBNQ0NSM19SRUZSRUNfU0hJRlQpKTsKKyNlbHNlCisjZXJyb3IgU3BlY2lmaWMgdHlwZSBvZiBNUEM4MjR4IG11c3QgYmUgZGVmaW5lZCAoaS5lLiBDT05GSUdfTVBDODI0MCkKKyNlbmRpZgorCisvKiB0aGlzIGlzIGdyb3NzLiAgV2UgdGhpbmsgdGhlc2Ugc2hvdWxkIGFsbCBiZSB0aGUgc2FtZSwgYW5kIHZhcmlvdXMgYm9hcmRzCisgKiAgc2hvdWxkIGRlZmluZSBDT05GSUdfU1lTX0FDVE9SVyB0byAwIGlmIHRoZXkgZG9uJ3Qgd2FudCB0byBzZXQgaXQsIG9yIGV2ZW4sIGlmCisgKiAgaXRzIG5vdCBzZXQsIHdlIGRlZmluZSBpdCB0byB6ZXJvIGluIHRoaXMgZmlsZQorICovCisjaWYgZGVmaW5lZChDT05GSUdfQ1U4MjQpIHx8IGRlZmluZWQoQ09ORklHX1BONjIpCisJQ09ORklHX1dSSVRFX1dPUkQoTUNDUjQsCisJKENPTkZJR19TWVNfUFJFVE9BQ1QgPDwgTUNDUjRfUFJFVE9BQ1RfU0hJRlQpIHwKKwkoQ09ORklHX1NZU19BQ1RUT1BSRSA8PCBNQ0NSNF9BQ1RUT1BSRV9TSElGVCkgfAorCU1DQ1I0X0JJVDIxIHwKKwkoQ09ORklHX1NZU19SRUdJU1RFUkRfVFlQRV9CVUZGRVIgPyBNQ0NSNF9SRUdJU1RFUkVEOiAwKSB8CisJKChDT05GSUdfU1lTX0JTVE9QUkUgJiAweDAwMDMpIDw8TUNDUjRfQlNUT1BSRTBUTzFfU0hJRlQgKSB8CisJKCgoQ09ORklHX1NZU19TRE1PREVfQ0FTX0xBVCA8PDQpIHwgKENPTkZJR19TWVNfU0RNT0RFX1dSQVAgPDwzKSB8CisJCSAgQ09ORklHX1NZU19TRE1PREVfQlVSU1RMRU4pIDw8IE1DQ1I0X1NETU9ERV9TSElGVCkgfAorCShDT05GSUdfU1lTX0FDVE9SVyA8PCBNQ0NSNF9BQ1RUT1JXX1NISUZUKSB8CisJKCgoQ09ORklHX1NZU19CU1RPUFJFICYgMHgwM2MwKSA+PiA2KSA8PCBNQ0NSNF9CU1RPUFJFNlRPOV9TSElGVCkpOworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODI0MCkKKwlDT05GSUdfV1JJVEVfV09SRChNQ0NSNCwKKwkoQ09ORklHX1NZU19QUkVUT0FDVCA8PCBNQ0NSNF9QUkVUT0FDVF9TSElGVCkgfAorCShDT05GSUdfU1lTX0FDVFRPUFJFIDw8IE1DQ1I0X0FDVFRPUFJFX1NISUZUKSB8CisJTUNDUjRfQklUMjEgfAorCShDT05GSUdfU1lTX1JFR0lTVEVSRF9UWVBFX0JVRkZFUiA/IE1DQ1I0X1JFR0lTVEVSRUQ6IDApIHwKKwkoKENPTkZJR19TWVNfQlNUT1BSRSAmIDB4MDAwMykgPDxNQ0NSNF9CU1RPUFJFMFRPMV9TSElGVCApIHwKKwkoKChDT05GSUdfU1lTX1NETU9ERV9DQVNfTEFUIDw8NCkgfCAoQ09ORklHX1NZU19TRE1PREVfV1JBUCA8PDMpIHwKKwkJICAoQ09ORklHX1NZU19TRE1PREVfQlVSU1RMRU4pKSA8PE1DQ1I0X1NETU9ERV9TSElGVCkgfAorCSgoKENPTkZJR19TWVNfQlNUT1BSRSAmIDB4MDNjMCkgPj4gNikgPDxNQ0NSNF9CU1RPUFJFNlRPOV9TSElGVCApKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgyNDUpCisJQ09ORklHX1JFQURfV09SRChNQ0NSMSwgdmFsKTsKKwl2YWwgJj0gTUNDUjFfREJVU19TSVpFMDsgICAgLyogdGVzdCBmb3IgNjQtYml0IG1lbSBidXMgKi8KKworCUNPTkZJR19XUklURV9XT1JEKE1DQ1I0LAorCQkoQ09ORklHX1NZU19QUkVUT0FDVCA8PCBNQ0NSNF9QUkVUT0FDVF9TSElGVCkgfAorCQkoQ09ORklHX1NZU19BQ1RUT1BSRSA8PCBNQ0NSNF9BQ1RUT1BSRV9TSElGVCkgfAorCQkoQ09ORklHX1NZU19FWFRST00gPyBNQ0NSNF9FWFRST00gOiAwKSB8CisJCShDT05GSUdfU1lTX1JFR0RJTU0gPyBNQ0NSNF9SRUdESU1NIDogMCkgfAorCQkoQ09ORklHX1NZU19SRUdJU1RFUkRfVFlQRV9CVUZGRVIgPyBNQ0NSNF9SRUdJU1RFUkVEOiAwKSB8CisJCSgoQ09ORklHX1NZU19CU1RPUFJFICYgMHgwMDAzKSA8PE1DQ1I0X0JTVE9QUkUwVE8xX1NISUZUICkgfAorCQkoQ09ORklHX1NZU19EQlVTX1NJWkUyIDw8IE1DQ1I0X0RCVVNfU0laRTJfU0hJRlQpIHwKKwkJKCgoQ09ORklHX1NZU19TRE1PREVfQ0FTX0xBVCA8PDQpIHwgKENPTkZJR19TWVNfU0RNT0RFX1dSQVAgPDwzKSB8CisJCSAgICAgICh2YWwgPyAyIDogMykpIDw8IE1DQ1I0X1NETU9ERV9TSElGVCkgIHwKKwkJKENPTkZJR19TWVNfQUNUT1JXIDw8IE1DQ1I0X0FDVFRPUldfU0hJRlQpIHwKKwkJKCgoQ09ORklHX1NZU19CU1RPUFJFICYgMHgwM2MwKSA+PiA2KSA8PE1DQ1I0X0JTVE9QUkU2VE85X1NISUZUICkpOworI2Vsc2UKKyNlcnJvciBTcGVjaWZpYyB0eXBlIG9mIE1QQzgyNHggbXVzdCBiZSBkZWZpbmVkIChpLmUuIENPTkZJR19NUEM4MjQwKQorI2VuZGlmCisKKwlDT05GSUdfV1JJVEVfV09SRChNU0FSMSwKKwkJKCAoQ09ORklHX1NZU19CQU5LMF9TVEFSVCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LMV9TVEFSVCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIDw8IDgpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LMl9TVEFSVCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIDw8IDE2KSB8CisJCSgoKENPTkZJR19TWVNfQkFOSzNfU1RBUlQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCAyNCkpOworCUNPTkZJR19XUklURV9XT1JEKEVNU0FSMSwKKwkJKCAoQ09ORklHX1NZU19CQU5LMF9TVEFSVCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgfAorCQkoKChDT05GSUdfU1lTX0JBTksxX1NUQVJUICYgTUlDUl9FQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKSA8PCA4KSB8CisJCSgoKENPTkZJR19TWVNfQkFOSzJfU1RBUlQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIDw8IDE2KSB8CisJCSgoKENPTkZJR19TWVNfQkFOSzNfU1RBUlQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIDw8IDI0KSk7CisJQ09ORklHX1dSSVRFX1dPUkQoTVNBUjIsCisJCSggKENPTkZJR19TWVNfQkFOSzRfU1RBUlQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSB8CisJCSgoKENPTkZJR19TWVNfQkFOSzVfU1RBUlQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCA4KSB8CisJCSgoKENPTkZJR19TWVNfQkFOSzZfU1RBUlQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCAxNikgfAorCQkoKChDT05GSUdfU1lTX0JBTks3X1NUQVJUICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfQUREUl9TSElGVCkgPDwgMjQpKTsKKwlDT05GSUdfV1JJVEVfV09SRChFTVNBUjIsCisJCSggKENPTkZJR19TWVNfQkFOSzRfU1RBUlQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LNV9TVEFSVCAmIE1JQ1JfRUFERFJfTUFTSykgPj4gTUlDUl9FQUREUl9TSElGVCkgPDwgOCkgfAorCQkoKChDT05GSUdfU1lTX0JBTks2X1NUQVJUICYgTUlDUl9FQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKSA8PCAxNikgfAorCQkoKChDT05GSUdfU1lTX0JBTks3X1NUQVJUICYgTUlDUl9FQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKSA8PCAyNCkpOworCUNPTkZJR19XUklURV9XT1JEKE1FQVIxLAorCQkoIChDT05GSUdfU1lTX0JBTkswX0VORCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LMV9FTkQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCA4KSB8CisJCSgoKENPTkZJR19TWVNfQkFOSzJfRU5EICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfQUREUl9TSElGVCkgPDwgMTYpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LM19FTkQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCAyNCkpOworCUNPTkZJR19XUklURV9XT1JEKEVNRUFSMSwKKwkJKCAoQ09ORklHX1NZU19CQU5LMF9FTkQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LMV9FTkQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIDw8IDgpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LMl9FTkQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIDw8IDE2KSB8CisJCSgoKENPTkZJR19TWVNfQkFOSzNfRU5EICYgTUlDUl9FQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKSA8PCAyNCkpOworCUNPTkZJR19XUklURV9XT1JEKE1FQVIyLAorCQkoIChDT05GSUdfU1lTX0JBTks0X0VORCAmIE1JQ1JfQUREUl9NQVNLKSA+PiBNSUNSX0FERFJfU0hJRlQpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LNV9FTkQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCA4KSB8CisJCSgoKENPTkZJR19TWVNfQkFOSzZfRU5EICYgTUlDUl9BRERSX01BU0spID4+IE1JQ1JfQUREUl9TSElGVCkgPDwgMTYpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LN19FTkQgJiBNSUNSX0FERFJfTUFTSykgPj4gTUlDUl9BRERSX1NISUZUKSA8PCAyNCkpOworCUNPTkZJR19XUklURV9XT1JEKEVNRUFSMiwKKwkJKCAoQ09ORklHX1NZU19CQU5LNF9FTkQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LNV9FTkQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIDw8IDgpIHwKKwkJKCgoQ09ORklHX1NZU19CQU5LNl9FTkQgJiBNSUNSX0VBRERSX01BU0spID4+IE1JQ1JfRUFERFJfU0hJRlQpIDw8IDE2KSB8CisJCSgoKENPTkZJR19TWVNfQkFOSzdfRU5EICYgTUlDUl9FQUREUl9NQVNLKSA+PiBNSUNSX0VBRERSX1NISUZUKSA8PCAyNCkpOworCisJQ09ORklHX1dSSVRFX0JZVEUoT0RDUiwgQ09ORklHX1NZU19PRENSKTsKKyNpZmRlZiBDT05GSUdfU1lTX0RMTF9NQVhfREVMQVkKKwlDT05GSUdfV1JJVEVfQllURShNSU9DUjEsIENPTkZJR19TWVNfRExMX01BWF9ERUxBWSk7CS8qIG5lZWRlZCB0byBtYWtlIERMTCBsb2NrICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfRExMX0VYVEVORCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX1BDSV9IT0xEX0RFTCkKKwlDT05GSUdfV1JJVEVfQllURShQTUNSMiwgQ09ORklHX1NZU19ETExfRVhURU5EIHwgQ09ORklHX1NZU19QQ0lfSE9MRF9ERUwpOworI2VuZGlmCisjaWYgZGVmaW5lZChNSU9DUjIpICYmIGRlZmluZWQoQ09ORklHX1NZU19TRFJBTV9EU0NEKQorCUNPTkZJR19XUklURV9CWVRFKE1JT0NSMiwgQ09ORklHX1NZU19TRFJBTV9EU0NEKTsJLyogY2hhbmdlIG1lbW9yeSBpbnB1dCAqLworI2VuZGlmIC8qIHNldHVwICYgaG9sZCB0aW1lICovCisKKwlDT05GSUdfV1JJVEVfQllURShNQkVSLAorCQkgQ09ORklHX1NZU19CQU5LMF9FTkFCTEUgfAorCQkoQ09ORklHX1NZU19CQU5LMV9FTkFCTEUgPDwgMSkgfAorCQkoQ09ORklHX1NZU19CQU5LMl9FTkFCTEUgPDwgMikgfAorCQkoQ09ORklHX1NZU19CQU5LM19FTkFCTEUgPDwgMykgfAorCQkoQ09ORklHX1NZU19CQU5LNF9FTkFCTEUgPDwgNCkgfAorCQkoQ09ORklHX1NZU19CQU5LNV9FTkFCTEUgPDwgNSkgfAorCQkoQ09ORklHX1NZU19CQU5LNl9FTkFCTEUgPDwgNikgfAorCQkoQ09ORklHX1NZU19CQU5LN19FTkFCTEUgPDwgNykpOworCisjaWZkZWYgQ09ORklHX1NZU19QR01BWAorCUNPTkZJR19XUklURV9CWVRFKE1QTVIsIENPTkZJR19TWVNfUEdNQVgpOworI2VuZGlmCisKKwkvKiAhIFdhaXQgMjAwdXMgYmVmb3JlIGluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzICovCisJLypGSVhNRTogd3JpdGUgYSBkZWNlbnQgdWRlbGF5IHdhaXQgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIiBtdGN0cgklMCBcbiBcCisJCTA6IGJkbnoJIDBiXG4iCisJCToKKwkJOiAiciIgKDB4MTAwMDApKTsKKworCUNPTkZJR19SRUFEX1dPUkQoTUNDUjEsIHZhbCk7CisJQ09ORklHX1dSSVRFX1dPUkQoTUNDUjEsIHZhbCB8IE1DQ1IxX01FTUdPKTsgLyogc2V0IG1lbW9yeSBhY2Nlc3MgZ29pbmcgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiZWllaW8iKTsKKworI2VuZGlmIC8qICFDT05GSUdfTU9VU1NFICYmICFDT05GSUdfQk1XICovCit9CisKKworI2lmZGVmIENPTkZJR19NT1VTU0UKKyNpZmRlZiBJTkNMVURFX01QQzEwN19SRVBPUlQKK3N0cnVjdCBNUEMxMDdfcyB7CisJdW5zaWduZWQgaW50IGlvYmFzZTsKKwljaGFyIGRlc2NbMTIwXTsKK30gTVBDMTA3UmVnc1tdID0geworCXsgQk1DX0JBU0UgKyAgMHgwMCwgIk1QQzEwNyBWZW5kb3IvRGV2aWNlIElEIgkJfSwKKwl7IEJNQ19CQVNFICsgIDB4MDQsICJNUEMxMDcgUENJIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyIiB9LAorCXsgQk1DX0JBU0UgKyAgMHgwOCwgIk1QQzEwNyBSZXZpc2lvbiIJCQl9LAorCXsgQk1DX0JBU0UgKyAgMHgwQywgIk1QQzEwNyBDYWNoZSBMaW5lIFNpemUiCQl9LAorCXsgQk1DX0JBU0UgKyAgMHgxMCwgIk1QQzEwNyBMTUJBUiIJCQl9LAorCXsgQk1DX0JBU0UgKyAgMHgxNCwgIk1QQzgyNHggUENTUiIJCQl9LAorCXsgQk1DX0JBU0UgKyAgMHhBOCwgIk1QQzgyNHggUElDUjEiCQkJfSwKKwl7IEJNQ19CQVNFICsgIDB4QUMsICJNUEM4MjR4IFBJQ1IyIgkJCX0sCisJeyBCTUNfQkFTRSArICAweDQ2LCAiTVBDODI0eCBQQUNSIgkJCX0sCisJeyBCTUNfQkFTRSArIDB4MzEwLCAiTVBDODI0eCBJVFdSIgkJCX0sCisJeyBCTUNfQkFTRSArIDB4MzAwLCAiTVBDODI0eCBPTUJBUiIJCQl9LAorCXsgQk1DX0JBU0UgKyAweDMwOCwgIk1QQzgyNHggT1RXUiIJCQl9LAorCXsgQk1DX0JBU0UgKyAgMHgxNCwgIk1QQzEwNyBQZXJpcGhlcmFsIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciIgfSwKKwl7IEJNQ19CQVNFICsgMHg3OCwgIk1QQzEwNyBFVU1CQVIiCQkJfSwKKwl7IEJNQ19CQVNFICsgMHhDMCwgIk1QQzEwNyBQcm9jZXNzb3IgQnVzIEVycm9yIFN0YXR1cyIJfSwKKwl7IEJNQ19CQVNFICsgMHhDNCwgIk1QQzEwNyBQQ0kgQnVzIEVycm9yIFN0YXR1cyIJfSwKKwl7IEJNQ19CQVNFICsgMHhDOCwgIk1QQzEwNyBQcm9jZXNzb3IvUENJIEVycm9yIEFkZHJlc3MiCX0sCisJeyBCTUNfQkFTRSArIDB4RTAsICJNUEMxMDcgQU1CT1IgUmVnaXN0ZXIiCQl9LAorCXsgQk1DX0JBU0UgKyAweEYwLCAiTVBDMTA3IE1DQ1IxIFJlZ2lzdGVyIgkJfSwKKwl7IEJNQ19CQVNFICsgMHhGNCwgIk1QQzEwNyBNQ0NSMiBSZWdpc3RlciIJCX0sCisJeyBCTUNfQkFTRSArIDB4RjgsICJNUEMxMDcgTUNDUjMgUmVnaXN0ZXIiCQl9LAorCXsgQk1DX0JBU0UgKyAweEZDLCAiTVBDMTA3IE1DQ1I0IFJlZ2lzdGVyIgkJfSwKK307CisjZGVmaW5lIE5fTVBDMTA3X1JlZ3MJKHNpemVvZihNUEMxMDdSZWdzKS9zaXplb2YoTVBDMTA3UmVnc1swXSkpCisjZW5kaWYgLyogSU5DTFVERV9NUEMxMDdfUkVQT1JUICovCisjZW5kaWYgLyogQ09ORklHX01PVVNTRSAqLworCisvKgorICogaW5pdGlhbGl6ZSBoaWdoZXIgbGV2ZWwgcGFydHMgb2YgQ1BVIGxpa2UgdGltZSBiYXNlIGFuZCB0aW1lcnMKKyAqLworaW50IGNwdV9pbml0X3IgKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX01PVVNTRQorI2lmZGVmIElOQ0xVREVfTVBDMTA3X1JFUE9SVAorCXVuc2lnbmVkIGludCB0bXAgPSAwLCBpOworI2VuZGlmCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBFVU1CQkFSIChFbWJlZGRlZCBVdGlsIE1lbSBCbG9jayBCYXNlIEFkZHIgUmVnKS4KKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWZvcmUgdGhlIEVQSUMsIERNQSBjdGxyLCBJMkMgY3RsciwgZXRjLiBjYW4KKwkgKiBiZSBhY2Nlc3NlZC4KKwkgKi8KKworI2lmZGVmIENPTkZJR19NUEM4MjQwCQkJLyogb25seSBvbiBNUEM4MjQwICovCisJbXBjODI0eF9tcGMxMDdfc2V0cmVnIChFVU1CQkFSLCBFVU1CQkFSX1ZBTCk7CisJLyogTU9UL1NQUzogSXNzdWUgIzEwMDAyLCBQQ0kgKEZEIEFsaWFzIGVuYWJsZSkgKi8KKwltcGM4MjR4X21wYzEwN19zZXRyZWcgKEFNQk9SLCAweDAwMDAwMEMwKTsKKyNlbmRpZgorCisKKyNpZmRlZiBJTkNMVURFX01QQzEwN19SRVBPUlQKKwkvKiBDaGVjayBNUEM4MjR4IFBDSSBEZXZpY2UgYW5kIFZlbmRvciBJRCAqLworCXdoaWxlICgodG1wID0gbXBjODI0eF9tcGMxMDdfZ2V0cmVnIChCTUNfQkFTRSkpICE9IDB4MzEwNTcpIHsKKwkJcHJpbnRmICgiCU1QQzEwNzogb2Zmc2V0PTB4JXgsIHZhbCA9IDB4JXhcbiIsCisJCQlCTUNfQkFTRSwKKwkJCXRtcCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5fTVBDMTA3X1JlZ3M7IGkrKykgeworCQlwcmludGYgKCIJMHgleC8lcyA9IDB4JXhcbiIsCisJCQlNUEMxMDdSZWdzW2ldLmlvYmFzZSwKKwkJCU1QQzEwN1JlZ3NbaV0uZGVzYywKKwkJCW1wYzgyNHhfbXBjMTA3X2dldHJlZyAoTVBDMTA3UmVnc1tpXS5pb2Jhc2UpKTsKKwl9CisKKwlwcmludGYgKCJJQkFUMEwgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMEwpKTsKKwlwcmludGYgKCJJQkFUMFUgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMFUpKTsKKwlwcmludGYgKCJJQkFUMUwgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMUwpKTsKKwlwcmludGYgKCJJQkFUMVUgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMVUpKTsKKwlwcmludGYgKCJJQkFUMkwgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMkwpKTsKKwlwcmludGYgKCJJQkFUMlUgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUMlUpKTsKKwlwcmludGYgKCJJQkFUM0wgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUM0wpKTsKKwlwcmludGYgKCJJQkFUM1UgPSAweCUwOFhcbiIsIG1mc3ByIChJQkFUM1UpKTsKKwlwcmludGYgKCJEQkFUMEwgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMEwpKTsKKwlwcmludGYgKCJEQkFUMFUgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMFUpKTsKKwlwcmludGYgKCJEQkFUMUwgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMUwpKTsKKwlwcmludGYgKCJEQkFUMVUgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMVUpKTsKKwlwcmludGYgKCJEQkFUMkwgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMkwpKTsKKwlwcmludGYgKCJEQkFUMlUgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUMlUpKTsKKwlwcmludGYgKCJEQkFUM0wgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUM0wpKTsKKwlwcmludGYgKCJEQkFUM1UgPSAweCUwOFhcbiIsIG1mc3ByIChEQkFUM1UpKTsKKyNlbmRpZiAvKiBJTkNMVURFX01QQzEwN19SRVBPUlQgKi8KKyNlbmRpZiAvKiBDT05GSUdfTU9VU1NFICovCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2VwaWMuaCBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2VwaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODAzZjYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvZXBpYy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICJlcGljL2VwaWMuaCIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2VwaWMvUkVBRE1FIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvZXBpYy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5ODk5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2VwaWMvUkVBRE1FCkBAIC0wLDAgKzEsMTAyIEBACitDT05URU5UOgorCisgICBlcGljLmgKKyAgIGVwaWMxLmMKKyAgIGVwaWMyLnMKKworV0hBVCBBUkUgVEhFU0UgRklMRVM6CisKK1RoZXNlIGZpbGVzIGNvbnRhaW4gTVBDODI0MCAoS2FobHVhKSBFUElDCitkcml2ZXIgcm91dGluZXMuIFRoZSBkcml2ZXIgcm91dGluZXMgYXJlIG5vdAord3JpdHRlbiBmb3IgYW55IHNwZWNpZmljIG9wZXJhdGluZyBzeXN0ZW0uCitUaGV5IHNlcnZlcyB0aGUgcHVycG9zZSBvZiBjb2RlIHNhbXBsZSwgYW5kCitqdW1wLXN0YXJ0IGZvciB1c2luZyB0aGUgTVBDODI0MCBFUElDIHVuaXQuCisKK0ZvciB0aGUgcmVhc29uIG9mIGNvcnJlY3RuZXNzIG9mIEMgbGFuZ3VhZ2UKK3N5bnRheCwgdGhlc2UgZmlsZXMgYXJlIGNvbXBpbGVkIGJ5IE1ldGF3YXJlCitDIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIuCisKK0VORElBTiBOT1RBVElPTjoKKworVGhlIGFsZ29yaXRobSBpcyBkZXNpZ25lZCBmb3IgYmlnLWVuZGlhbiBtb2RlLAorc29mdHdhcmUgaXMgcmVzcG9uc2libGUgZm9yIGJ5dGUgc3dhcHBpbmcuCisKK1VTQUdFOgorCisxLiBUaGUgaG9zdCBzeXN0ZW0gdGhhdCBpcyBydW5uaW5nIG9uIE1QQzgyNDAKKyAgIHNoYWxsIGxpbmsgdGhlIGZpbGVzIGxpc3RlZCBoZXJlLiBUaGUgbWVtb3J5CisgICBsb2NhdGlvbiBvZiBkcml2ZXIgcm91dGluZXMgc2hhbGwgdGFrZSBpbnRvCisgICBhY2NvdW50IG9mIHRoYXQgZHJpdmVyIHJvdXRpbmVzIG5lZWQgdG8gcnVuCisgICBpbiBzdXBlcnZpc29yIG1vZGUgYW5kIHRoZXkgcHJvY2VzcyBleHRlcm5hbAorICAgaW50ZXJydXB0cy4KKworICAgVGhlIHJvdXRpbmUgZXBpY19leGNlcHRpb24gc2hhbGwgYmUgY2FsbGVkIGJ5CisgICBleGNlcHRpb24gdmVjdG9yIGF0IGxvY2F0aW9uIDB4NTAwLCBpLmUuLAorICAgNjAzZSBjb3JlIGV4dGVybmFsIGV4Y2VwdGlvbiB2ZWN0b3IuCisKKzIuIFRoZSBob3N0IHN5c3RlbSBpcyByZXNwb25zaWJsZSBmb3IgY29uZmlndXJpbmcKKyAgIHRoZSBNUEM4MjQwIGluY2x1ZGluZyBFbWJlZGRlZCBVdGlsaXRpZXMgTWVtb3J5CisgICBCbG9jay4gQWxsIEVQSUMgZHJpdmVyIGZ1bmN0aW9ucyByZXF1aXJlIHRoZQorICAgY29udGVudCBvZiBFbWJlZGRlZCBVdGlsaXRpZXMgTWVtb3J5IEJsb2NrCisgICBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIsIEVVTUJCQVIsIGFzIHRoZSBmaXJzdAorICAgcGFyYW1ldGVyLgorCiszLiBCZWZvcmUgRVBJQyB1bml0IG9mIE1QQzgyNDAgY2FuIGJlIHVzZWQsCisgICBpbml0aWFsaXplIEVQSUMgdW5pdCBieSBjYWxsaW5nIGVwaWNJbml0CisgICB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuCisKKyAgIFRoZSBpbml0aWFsaXphdGlvbiBzaGFsbCBkaXNhYmxlIHRoZSA2MDNlCisgICBjb3JlIEV4dGVybmFsIEV4Y2VwdGlvbiBieSBjYWxsaW5nIENvcmVFeHRJbnREaXNhYmxlKCApLgorICAgTmV4dCwgY2FsbCBlcGljSW5pdCggKS4gTGFzdCwgZW5hYmxlIHRoZSA2MDNlIGNvcmUKKyAgIEV4dGVybmFsIEV4Y2VwdGlvbiBieSBjYWxsaW5nIENvcmVFeHRJbnRFbmFibGUoICkuCisKKzQuIEFmdGVyIEVQSUMgdW5pdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQsCisgICBlcGljSW50U291cmNlU2V0KCApIHNoYWxsIGJlIHVzZWQgdG8gcmVnaXN0ZXIgZWFjaAorICAgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZS4gQW55dGltZSwgYW4gZXh0ZXJuYWwKKyAgIGludGVycnVwdCBzb3VyY2UgY2FuIGJlIGRpc2FibGVkIG9yIGVuYWJsZWQgYnkKKyAgIGNhbGxpbmcgY29ycmVzcG9uZGluZyBmdW5jdGlvbiwgZXBpY0ludERpc2FibGUoICksCisgICBvciBlcGljSW50RW5hYmxlKCApLgorCisgICBHbG9iYWwgVGltZXJzJyByZXNvdXJjZSwgYmFzZSBjb3VudCBhbmQgZnJlcXVlbmN5LAorICAgY2FuIGJlIGNoYW5nZWQgYnkgY2FsbGluZyBlcGljVG1GcmVxdWVuY3lTZXQoICkKKyAgIGFuZCBlcGljVG1CYXNlU2V0KCApLgorCisgICBUbyBzdG9wIGNvdW50aW5nIGEgc3BlY2lmaWMgZ2xvYmFsIHRpbWVyLCB1c2UKKyAgIHRoZSBmdW5jdGlvbiwgZXBpY1RtSW5oaWJpdCB3aGlsZSBlcGljVG1FbmFibGUKKyAgIGNhbiBiZSB1c2VkIHRvIHN0YXJ0IGNvdW50aW5nIGEgdGltZXIuCisKKzUuIFRvIG1hc2sgYSBzZXQgb2YgZXh0ZXJuYWwgaW50ZXJydXB0cyB0aGF0IGFyZQorICAgYXJlIGNlcnRhaW4gbGV2ZWwgYmVsb3csIGVwaWNJbnRQcmlvcml0eVNldCggKQorICAgY2FuIGJlIHVzZWQuIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2Vzc29yJ3MKKyAgIGN1cnJlbnQgdGFzayBwcmlvcml0eSByZWdpc3RlciBpcyBzZXQgdG8gMHg3LAorICAgb25seSBpbnRlcnJ1cHRzIG9mIHByaW9yaXR5IDB4OCBvciBoaWdoZXIgd2lsbAorICAgYmUgcGFzc2VkIHRvIHRoZSBwcm9jZXNzb3IuCisKKyAgIEJlIGNhcmVmdWwgd2hlbiB1c2luZyB0aGlzIGZ1bmN0aW9uLiBJdCBtYXkKKyAgIGNvcnJ1cHQgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHBlbmRpbmcsIHNlbGVjdG9yLAorICAgYW5kIHJlcXVlc3QgcmVnaXN0ZXJzLCByZXN1bHRpbmcgYW4gaW52YWxpZCB2ZXRvci4KKworICAgQWZ0ZXIgZW5hYmxpbmcgYW4gaW50ZXJydXB0LCBkaXNhYmxlIGl0IG1heSBhbHNvCisgICBjYXVzZSBhbiBpbnZhbGlkIHZlY3Rvci4gVXNlciBtYXkgY29uc2lkZXIgdXNpbmcKKyAgIHRoZSBzcHVyaW91cyB2ZWN0b3IgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB0bworICAgaGFuZGxlIHRoaXMgY2FzZS4KKworNi4gVGhlIEVQSUMgZHJpdmVyIHJvdXRpbmVzIGNvbnRhaW5zIGEgc2V0CisgICBvZiB1dGlsaXRpZXMsIFNldCBhbmQgR2V0LCBmb3IgaG9zdCBzeXN0ZW0KKyAgIHRvIHF1ZXJ5IGFuZCBtb2RpZnkgdGhlIGRlc2lyZWQgRVBJQyBzb3VyY2UKKyAgIHJlZ2lzdGVycy4KKworNy4gRWFjaCBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlIHNoYWxsIHJlZ2lzdGVyCisgICBpdHMgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gVGhlIHJvdXRpbmUKKyAgIHNoYWxsIGNvbnRhaW4gYWxsIGludGVycnVwdCBzb3VyY2Ugc3BlY2lmaWMKKyAgIHByb2Nlc3NlcyBhbmQga2VlcCBhcyBzaG9ydCBhcyBwb3NzaWJsZS4KKworICAgU3BlY2lhbCBjdXN0b21pemVkIGVuZCBvZiBpbnRlcnJ1cHQgcm91dGluZQorICAgaXMgb3B0aW9uYWwuIElmIGl0IGlzIG5lZWRlZCwgaXQgc2hhbGwgY29udGFpbgorICAgdGhlIGV4dGVybmFsIGludGVycnVwdCBzb3VyY2Ugc3BlY2lmaWMgZW5kIG9mCisgICBpbnRlcnJ1cHQgcHJvY2Vzcy4KKworICAgRXh0ZXJuYWwgaW50ZXJydXB0IGV4Y2VwdGlvbiB2ZWN0b3IgYXQgMHg1MDAKKyAgIHNoYWxsIGFsd2F5cyBjYWxsIHRoZSBlcGljRU9JIGp1c3QgYmVmb3JlCisgICByZmkgaW5zdHJ1Y3Rpb24uIFJlZmVyIHRvIHRoZSByb3V0aW5lLAorICAgZXBpY19leGNlcHRpb24sIGZvciBhIGNvZGUgc2FtcGxlLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvZXBpYy9lcGljLmggYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvZHJpdmVycy9lcGljL2VwaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY4MWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvZXBpYy9lcGljLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1wYzgyNDBlcGljLmggLSBFUElDIG1vZHVsZSBvZiB0aGUgTVBDODI0MCBtaWNyby1jb250cm9sbGVyCisgKgorICogQ29weXJpZ2ggMTk5OSAgTW90b3JvbGEgSW5jLgorICoKKyAqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICogPT09PT09PT09PT09PT09PT09PT09CisgKiAwMWEsMDRGZWI5OSxNeSAgQ3JlYXRlZC4KKyAqIDE1Tm92MjAwLCByb2J0IC1tb2RpZmllZCB0byB1c2UgaW4gVS1Cb290CisgKgorKi8KKworI2lmbmRlZiBfX0lOQ0VQSUNoCisjZGVmaW5lIF9fSU5DRVBJQ2gKKworI2RlZmluZSBVTE9ORyB1bnNpZ25lZCBsb25nCisjZGVmaW5lIE1BWFZFQyAgICAgICAgICAgICAyMAorI2RlZmluZSBNQVhJUlEgICAgICAgIDUgLyogSVJRcyAqLworI2RlZmluZSBFUElDX0RJUkVDVF9JUlEgICAgIDAgLyogRGlyZWN0IGludGVycnVwdCB0eXBlICovCisKKy8qIEVQSUMgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisKKyNkZWZpbmUgRVBJQ19FVU1CQkFSICAgICAgMHg0MDAwMCAgICAgLyogRVVNQkJBUiBvZiBFUElDICAqLworI2RlZmluZSBFUElDX0ZFQVRVUkVTX1JFRyAoRVBJQ19FVU1CQkFSICsgMHgwMTAwMCkvKiBGZWF0dXJlIHJlcG9ydGluZyAqLworI2RlZmluZSBFUElDX0dMT0JBTF9SRUcgICAoRVBJQ19FVU1CQkFSICsgMHgwMTAyMCkvKiBHbG9iYWwgY29uZmlnLiAgKi8KKyNkZWZpbmUgRVBJQ19JTlRfQ09ORl9SRUcgKEVQSUNfRVVNQkJBUiArIDB4MDEwMzApLyogSW50ZXJydXB0IGNvbmZpZy4gKi8KKyNkZWZpbmUgRVBJQ19WRU5ET1JfSURfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgwMTA4MCkvKiBWZW5kb3IgaWQgKi8KKyNkZWZpbmUgRVBJQ19QUk9DX0lOSVRfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgwMTA5MCkvKiBQcm9jZXNzb3IgaW5pdC4gKi8KKyNkZWZpbmUgRVBJQ19TUFVSX1ZFQ19SRUcgKEVQSUNfRVVNQkJBUiArIDB4MDEwZTApLyogU3B1cmlvdXMgdmVjdG9yICovCisjZGVmaW5lIEVQSUNfVE1fRlJFUV9SRUcgIChFUElDX0VVTUJCQVIgKyAweDAxMGYwKS8qIFRpbWVyIEZyZXF1ZW5jeSAqLworCisjZGVmaW5lIEVQSUNfVE0wX0NVUl9DT1VOVF9SRUcgIChFUElDX0VVTUJCQVIgKyAweDAxMTAwKS8qIEdibCBUTTAgQ3VyLiBDb3VudCovCisjZGVmaW5lIEVQSUNfVE0wX0JBU0VfQ09VTlRfUkVHIChFUElDX0VVTUJCQVIgKyAweDAxMTEwKS8qIEdibCBUTTAgQmFzZSBDb3VudCovCisjZGVmaW5lIEVQSUNfVE0wX1ZFQ19SRUcgIChFUElDX0VVTUJCQVIgKyAweDAxMTIwKS8qIEdibCBUTTAgVmVjdG9yIFByaSovCisjZGVmaW5lIEVQSUNfVE0wX0RFU19SRUcgIChFUElDX0VVTUJCQVIgKyAweDAxMTMwKS8qIEdibCBUTTAgRGVzdC4gKi8KKworI2RlZmluZSBFUElDX1RNMV9DVVJfQ09VTlRfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgwMTE0MCkvKiBHYmwgVE0xIEN1ci4gQ291bnQqLworI2RlZmluZSBFUElDX1RNMV9CQVNFX0NPVU5UX1JFRyAoRVBJQ19FVU1CQkFSICsgMHgwMTE1MCkvKiBHYmwgVE0xIEJhc2UgQ291bnQqLworI2RlZmluZSBFUElDX1RNMV9WRUNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgwMTE2MCkvKiBHYmwgVE0xIFZlY3RvciBQcmkqLworI2RlZmluZSBFUElDX1RNMV9ERVNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgwMTE3MCkvKiBHYmwgVE0xIERlc3QuICovCisKKyNkZWZpbmUgRVBJQ19UTTJfQ1VSX0NPVU5UX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MDExODApLyogR2JsIFRNMiBDdXIuIENvdW50Ki8KKyNkZWZpbmUgRVBJQ19UTTJfQkFTRV9DT1VOVF9SRUcgKEVQSUNfRVVNQkJBUiArIDB4MDExOTApLyogR2JsIFRNMiBCYXNlIENvdW50Ki8KKyNkZWZpbmUgRVBJQ19UTTJfVkVDX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MDExYTApLyogR2JsIFRNMiBWZWN0b3IgUHJpKi8KKyNkZWZpbmUgRVBJQ19UTTJfREVTX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MDExYjApLyogR2JsIFRNMiBEZXN0ICovCisKKyNkZWZpbmUgRVBJQ19UTTNfQ1VSX0NPVU5UX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MDExYzApLyogR2JsIFRNMyBDdXIuIENvdW50Ki8KKyNkZWZpbmUgRVBJQ19UTTNfQkFTRV9DT1VOVF9SRUcgKEVQSUNfRVVNQkJBUiArIDB4MDExZDApLyogR2JsIFRNMyBCYXNlIENvdW50Ki8KKyNkZWZpbmUgRVBJQ19UTTNfVkVDX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MDExZTApLyogR2JsIFRNMyBWZWN0b3IgUHJpKi8KKyNkZWZpbmUgRVBJQ19UTTNfREVTX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MDExZjApLyogR2JsIFRNMyBEZXN0LiAqLworCisjZGVmaW5lIEVQSUNfRVhfSU5UMF9WRUNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDIwMCkvKiBFeHQuIEludC4gU3IwIERlcyAqLworI2RlZmluZSBFUElDX0VYX0lOVDBfREVTX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAyMTApLyogRXh0LiBJbnQuIFNyMCBWZWN0Ki8KKyNkZWZpbmUgRVBJQ19FWF9JTlQxX1ZFQ19SRUcgIChFUElDX0VVTUJCQVIgKyAweDEwMjIwKS8qIEV4dC4gSW50LiBTcjEgRGVzICovCisjZGVmaW5lIEVQSUNfRVhfSU5UMV9ERVNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDIzMCkvKiBFeHQuIEludC4gU3IxIFZlY3QqLworI2RlZmluZSBFUElDX0VYX0lOVDJfVkVDX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAyNDApLyogRXh0LiBJbnQuIFNyMiBEZXMgKi8KKyNkZWZpbmUgRVBJQ19FWF9JTlQyX0RFU19SRUcgIChFUElDX0VVTUJCQVIgKyAweDEwMjUwKS8qIEV4dC4gSW50LiBTcjIgVmVjdCovCisjZGVmaW5lIEVQSUNfRVhfSU5UM19WRUNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDI2MCkvKiBFeHQuIEludC4gU3IzIERlcyAqLworI2RlZmluZSBFUElDX0VYX0lOVDNfREVTX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAyNzApLyogRXh0LiBJbnQuIFNyMyBWZWN0Ki8KKyNkZWZpbmUgRVBJQ19FWF9JTlQ0X1ZFQ19SRUcgIChFUElDX0VVTUJCQVIgKyAweDEwMjgwKS8qIEV4dC4gSW50LiBTcjQgRGVzICovCisjZGVmaW5lIEVQSUNfRVhfSU5UNF9ERVNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDI5MCkvKiBFeHQuIEludC4gU3I0IFZlY3QqLworCisjZGVmaW5lIEVQSUNfU1JfSU5UMF9WRUNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDIwMCkvKiBTci4gSW50LiBTcjAgRGVzICovCisjZGVmaW5lIEVQSUNfU1JfSU5UMF9ERVNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDIxMCkvKiBTci4gSW50LiBTcjAgVmVjdCAqLworI2RlZmluZSBFUElDX1NSX0lOVDFfVkVDX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAyMjApLyogU3IuIEludC4gU3IxIERlcyAqLworI2RlZmluZSBFUElDX1NSX0lOVDFfREVTX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAyMzApLyogU3IuIEludC4gU3IxIFZlY3QuKi8KKyNkZWZpbmUgRVBJQ19TUl9JTlQyX1ZFQ19SRUcgIChFUElDX0VVTUJCQVIgKyAweDEwMjQwKS8qIFNyLiBJbnQuIFNyMiBEZXMgKi8KKyNkZWZpbmUgRVBJQ19TUl9JTlQyX0RFU19SRUcgIChFUElDX0VVTUJCQVIgKyAweDEwMjUwKS8qIFNyLiBJbnQuIFNyMiBWZWN0LiovCisjZGVmaW5lIEVQSUNfU1JfSU5UM19WRUNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDI2MCkvKiBTci4gSW50LiBTcjMgRGVzICovCisjZGVmaW5lIEVQSUNfU1JfSU5UM19ERVNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDI3MCkvKiBTci4gSW50LiBTcjMgVmVjdC4qLworI2RlZmluZSBFUElDX1NSX0lOVDRfVkVDX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAyODApLyogU3IuIEludC4gU3I0IERlcyAqLworI2RlZmluZSBFUElDX1NSX0lOVDRfREVTX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAyOTApLyogU3IuIEludC4gU3I0IFZlY3QuKi8KKworI2RlZmluZSBFUElDX1NSX0lOVDVfVkVDX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAyYTApLyogU3IuIEludC4gU3I1IERlcyAqLworI2RlZmluZSBFUElDX1NSX0lOVDVfREVTX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAyYjApLyogU3IuIEludC4gU3I1IFZlY3QuKi8KKyNkZWZpbmUgRVBJQ19TUl9JTlQ2X1ZFQ19SRUcgIChFUElDX0VVTUJCQVIgKyAweDEwMmMwKS8qIFNyLiBJbnQuIFNyNiBEZXMgKi8KKyNkZWZpbmUgRVBJQ19TUl9JTlQ2X0RFU19SRUcgIChFUElDX0VVTUJCQVIgKyAweDEwMmQwKS8qIFNyLiBJbnQuIFNyNiBWZWN0LiovCisjZGVmaW5lIEVQSUNfU1JfSU5UN19WRUNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDJlMCkvKiBTci4gSW50LiBTcjcgRGVzICovCisjZGVmaW5lIEVQSUNfU1JfSU5UN19ERVNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMDJmMCkvKiBTci4gSW50LiBTcjcgVmVjdC4qLworI2RlZmluZSBFUElDX1NSX0lOVDhfVkVDX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAzMDApLyogU3IuIEludC4gU3I4IERlcyAqLworI2RlZmluZSBFUElDX1NSX0lOVDhfREVTX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTAzMTApLyogU3IuIEludC4gU3I4IFZlY3QuKi8KKyNkZWZpbmUgRVBJQ19TUl9JTlQ5X1ZFQ19SRUcgIChFUElDX0VVTUJCQVIgKyAweDEwMzIwKS8qIFNyLiBJbnQuIFNyOSBEZXMgKi8KKyNkZWZpbmUgRVBJQ19TUl9JTlQ5X0RFU19SRUcgIChFUElDX0VVTUJCQVIgKyAweDEwMzMwKS8qIFNyLiBJbnQuIFNyOSBWZWN0LiovCisKKyNkZWZpbmUgRVBJQ19TUl9JTlQxMF9WRUNfUkVHIChFUElDX0VVTUJCQVIgKyAweDEwMzQwKS8qIFNyLiBJbnQuIFNyMTAgRGVzICovCisjZGVmaW5lIEVQSUNfU1JfSU5UMTBfREVTX1JFRyAoRVBJQ19FVU1CQkFSICsgMHgxMDM1MCkvKiBTci4gSW50LiBTcjEwIFZlY3QqLworI2RlZmluZSBFUElDX1NSX0lOVDExX1ZFQ19SRUcgKEVQSUNfRVVNQkJBUiArIDB4MTAzNjApLyogU3IuIEludC4gU3IxMSBEZXMgKi8KKyNkZWZpbmUgRVBJQ19TUl9JTlQxMV9ERVNfUkVHIChFUElDX0VVTUJCQVIgKyAweDEwMzcwKS8qIFNyLiBJbnQuIFNyMTEgVmVjdCovCisjZGVmaW5lIEVQSUNfU1JfSU5UMTJfVkVDX1JFRyAoRVBJQ19FVU1CQkFSICsgMHgxMDM4MCkvKiBTci4gSW50LiBTcjEyIERlcyAqLworI2RlZmluZSBFUElDX1NSX0lOVDEyX0RFU19SRUcgKEVQSUNfRVVNQkJBUiArIDB4MTAzOTApLyogU3IuIEludC4gU3IxMiBWZWN0Ki8KKyNkZWZpbmUgRVBJQ19TUl9JTlQxM19WRUNfUkVHIChFUElDX0VVTUJCQVIgKyAweDEwM2EwKS8qIFNyLiBJbnQuIFNyMTMgRGVzICovCisjZGVmaW5lIEVQSUNfU1JfSU5UMTNfREVTX1JFRyAoRVBJQ19FVU1CQkFSICsgMHgxMDNiMCkvKiBTci4gSW50LiBTcjEzIFZlY3QqLworI2RlZmluZSBFUElDX1NSX0lOVDE0X1ZFQ19SRUcgKEVQSUNfRVVNQkJBUiArIDB4MTAzYzApLyogU3IuIEludC4gU3IxNCBEZXMgKi8KKyNkZWZpbmUgRVBJQ19TUl9JTlQxNF9ERVNfUkVHIChFUElDX0VVTUJCQVIgKyAweDEwM2QwKS8qIFNyLiBJbnQuIFNyMTQgVmVjdCovCisjZGVmaW5lIEVQSUNfU1JfSU5UMTVfVkVDX1JFRyAoRVBJQ19FVU1CQkFSICsgMHgxMDNlMCkvKiBTci4gSW50LiBTcjE1IERlcyAqLworI2RlZmluZSBFUElDX1NSX0lOVDE1X0RFU19SRUcgKEVQSUNfRVVNQkJBUiArIDB4MTAzZjApLyogU3IuIEludC4gU3IxNSBWZWN0Ki8KKworI2RlZmluZSBFUElDX0kyQ19JTlRfVkVDX1JFRyAgKEVQSUNfRVVNQkJBUiArIDB4MTEwMjApLyogSTJDIEludC4gVmVjdCBQcmkuKi8KKyNkZWZpbmUgRVBJQ19JMkNfSU5UX0RFU19SRUcgIChFUElDX0VVTUJCQVIgKyAweDExMDMwKS8qIEkyQyBJbnQuIERlc3QgKi8KKyNkZWZpbmUgRVBJQ19ETUEwX0lOVF9WRUNfUkVHIChFUElDX0VVTUJCQVIgKyAweDExMDQwKS8qIERNQTAgSW50LiBWZWN0IFByaSovCisjZGVmaW5lIEVQSUNfRE1BMF9JTlRfREVTX1JFRyAoRVBJQ19FVU1CQkFSICsgMHgxMTA1MCkvKiBETUEwIEludC4gRGVzdCAqLworI2RlZmluZSBFUElDX0RNQTFfSU5UX1ZFQ19SRUcgKEVQSUNfRVVNQkJBUiArIDB4MTEwNjApLyogRE1BMSBJbnQuIFZlY3QgUHJpKi8KKyNkZWZpbmUgRVBJQ19ETUExX0lOVF9ERVNfUkVHIChFUElDX0VVTUJCQVIgKyAweDExMDcwKS8qIERNQTEgSW50LiBEZXN0ICovCisjZGVmaW5lIEVQSUNfTVNHX0lOVF9WRUNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMTBjMCkvKiBNc2cgSW50LiBWZWN0IFByaSovCisjZGVmaW5lIEVQSUNfTVNHX0lOVF9ERVNfUkVHICAoRVBJQ19FVU1CQkFSICsgMHgxMTBkMCkvKiBNc2cgSW50LiBEZXN0ICAqLworCisjZGVmaW5lIEVQSUNfUFJPQ19DVEFTS19QUklfUkVHIChFUElDX0VVTUJCQVIgKyAweDIwMDgwKS8qIFByb2MuIGN1cnJlbnQgdGFzayovCisjZGVmaW5lIEVQSUNfUFJPQ19JTlRfQUNLX1JFRyAoRVBJQ19FVU1CQkFSICsgMHgyMDBhMCkvKiBJbnQuIGFja25vd2xlZGdlICovCisjZGVmaW5lIEVQSUNfUFJPQ19FT0lfUkVHIChFUElDX0VVTUJCQVIgKyAweDIwMGIwKS8qIEVuZCBvZiBpbnRlcnJ1cHQgKi8KKworI2RlZmluZSBFUElDX1ZFQ19QUklfTUFTSyAgICAgIDB4ODAwMDAwMDAgLyogTWFzayBJbnRlcnJ1cHQgYml0IGluIElWUFIgKi8KKyNkZWZpbmUgRVBJQ19WRUNfUFJJX0RGTFRfUFJJICA4ICAgICAgICAgIC8qIEludGVycnVwdCBQcmlvcml0eSBpbiBJVlBSICovCisKKy8qIEVycm9yIGNvZGUgKi8KKworI2RlZmluZSBPSyAgICAgICAwCisjZGVmaW5lIEVSUk9SICAgIC0xCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKwordm9pZCBlcGljVmVuZG9ySWQoIHVuc2lnbmVkIGludCAqc3RlcCwKKyAgICAgICB1bnNpZ25lZCBpbnQgKmRldklkLAorICAgICAgIHVuc2lnbmVkIGludCAqdmVuSWQKKyAgICAgKTsKK3ZvaWQgZXBpY0ZlYXR1cmVzKCB1bnNpZ25lZCBpbnQgKm5vSVJRcywKKwkgICAgIHVuc2lnbmVkIGludCAqbm9DUFVzLAorICAgICAgIHVuc2lnbmVkIGludCAqVmVySWQgKTsKK2V4dGVybiB2b2lkIGVwaWNJbml0KCB1bnNpZ25lZCBpbnQgSVJRVHlwZSwgdW5zaWduZWQgaW50IGNsa1JhdGlvKTsKK1VMT05HIHN5c0VVTUJCQVJSZWFkICggVUxPTkcgcmVnTnVtICk7Cit2b2lkIHN5c0VVTUJCQVJXcml0ZSAoIFVMT05HIHJlZ051bSwgVUxPTkcgcmVnVmFsKTsKK2V4dGVybiB2b2lkIGVwaWNUbUZyZXF1ZW5jeVNldCggdW5zaWduZWQgaW50IGZycSApOworZXh0ZXJuIHVuc2lnbmVkIGludCBlcGljVG1GcmVxdWVuY3lHZXQodm9pZCk7CitleHRlcm4gdW5zaWduZWQgaW50IGVwaWNUbUJhc2VTZXQoIFVMT05HIHNyY0FkZHIsCisJCSB1bnNpZ25lZCBpbnQgY250LAorCQkgdW5zaWduZWQgaW50IGluaGliaXQgKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZXBpY1RtQmFzZUdldCAoIFVMT05HIHNyY0FkZHIsIHVuc2lnbmVkIGludCAqdmFsICk7CitleHRlcm4gdW5zaWduZWQgaW50IGVwaWNUbUNvdW50R2V0KCBVTE9ORyBzcmNBZGRyLCB1bnNpZ25lZCBpbnQgKnZhbCApOworZXh0ZXJuIHVuc2lnbmVkIGludCBlcGljVG1JbmhpYml0KCB1bnNpZ25lZCBpbnQgdGltZXIgKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZXBpY1RtRW5hYmxlKCBVTE9ORyBzcmNBZHIgKTsKK2V4dGVybiB2b2lkIENvcmVFeHRJbnRFbmFibGUodm9pZCk7ICAvKiBFbmFibGUgNjAzZSBleHRlcm5hbCBpbnRlcnJ1cHRzICovCitleHRlcm4gdm9pZCBDb3JlRXh0SW50RGlzYWJsZSh2b2lkKTsgLyogRGlzYWJsZSA2MDNlIGV4dGVybmFsIGludGVycnVwdHMgKi8KK2V4dGVybiB1bnNpZ25lZCBjaGFyIGVwaWNJbnRUYXNrR2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgZXBpY0ludFRhc2tTZXQoIHVuc2lnbmVkIGNoYXIgdmFsICk7CitleHRlcm4gdW5zaWduZWQgaW50IGVwaWNJbnRBY2sodm9pZCk7CitleHRlcm4gdm9pZCBlcGljU3ByU2V0KCB1bnNpZ25lZCBpbnQgZXVtYmJhciwgdW5zaWduZWQgY2hhciApOworZXh0ZXJuIHZvaWQgZXBpY0NvbmZpZ0dldCggdW5zaWduZWQgaW50ICpjbGtSYXRpbywKKwkgICAgICAgdW5zaWduZWQgaW50ICpzZXJFbmFibGUgKTsKK2V4dGVybiB2b2lkIFNyY1ZlY1RhYmxlSW5pdCh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgIGVwaWNNb2RlR2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgZXBpY0ludEVuYWJsZShpbnQgVmVjdCk7CitleHRlcm4gdm9pZCBlcGljSW50RGlzYWJsZShpbnQgVmVjdCk7CitleHRlcm4gaW50IGVwaWNJbnRTb3VyY2VDb25maWcoaW50IFZlY3QsIGludCBQb2xhcml0eSwgaW50IFNlbnNlLCBpbnQgUHJpbyk7CitleHRlcm4gdW5zaWduZWQgaW50IGVwaWNJbnRBY2sodm9pZCk7CitleHRlcm4gdm9pZCBlcGljRU9JKHZvaWQpOworZXh0ZXJuIGludCBlcGljQ3VyVGFza1ByaW9TZXQoaW50IFZlY3QpOworCitzdHJ1Y3QgU3JjVmVjVGFibGUKKyAgICB7CisgICAgIFVMT05HIHNyY0FkZHI7CisgICAgIGNoYXIgIHNyY05hbWVbNDBdOworICAgIH07CisKKyNlbmRpZiAgIC8qICBFUElDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2VwaWMvZXBpYzEuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2VwaWMvZXBpYzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JiNDJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvZXBpYy9lcGljMS5jCkBAIC0wLDAgKzEsNTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjb3B5cmlnaHQgQCBtb3Rvcm9sYSwgMTk5OQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPG1wYzgyNHguaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlICJlcGljLmgiCisKKworI2RlZmluZSBQUklOVChmb3JtYXQsIGFyZ3MuLi4pIHByaW50Zihmb3JtYXQgLCAjIyBhcmdzKQorCit0eXBlZGVmIHZvaWQgKCpWT0lERlVOQ1BUUikgICh2b2lkKTsgIC8qIHB0ciB0byBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCAqLworc3RydWN0IFNyY1ZlY1RhYmxlIFNyY1ZlY1RhYmxlW01BWFZFQ10gPSAvKiBBZGRyL1ZlY3RvciBjcm9zcy1yZWZlcmVuY2UgdGJsICovCisgICAgeworICAgIHsgRVBJQ19FWF9JTlQwX1ZFQ19SRUcsICAiRXh0ZXJuYWwgRGlyZWN0L1NlcmlhbCBTb3VyY2UgMCJ9LAorICAgIHsgRVBJQ19FWF9JTlQxX1ZFQ19SRUcsICAiRXh0ZXJuYWwgRGlyZWN0L1NlcmlhbCBTb3VyY2UgMSJ9LAorICAgIHsgRVBJQ19FWF9JTlQyX1ZFQ19SRUcsICAiRXh0ZXJuYWwgRGlyZWN0L1NlcmlhbCBTb3VyY2UgMiJ9LAorICAgIHsgRVBJQ19FWF9JTlQzX1ZFQ19SRUcsICAiRXh0ZXJuYWwgRGlyZWN0L1NlcmlhbCBTb3VyY2UgMyJ9LAorICAgIHsgRVBJQ19FWF9JTlQ0X1ZFQ19SRUcsICAiRXh0ZXJuYWwgRGlyZWN0L1NlcmlhbCBTb3VyY2UgNCJ9LAorCisgICAgeyBFUElDX1NSX0lOVDVfVkVDX1JFRywgICJFeHRlcm5hbCBTZXJpYWwgU291cmNlIDUifSwKKyAgICB7IEVQSUNfU1JfSU5UNl9WRUNfUkVHLCAgIkV4dGVybmFsIFNlcmlhbCBTb3VyY2UgNiJ9LAorICAgIHsgRVBJQ19TUl9JTlQ3X1ZFQ19SRUcsICAiRXh0ZXJuYWwgU2VyaWFsIFNvdXJjZSA3In0sCisgICAgeyBFUElDX1NSX0lOVDhfVkVDX1JFRywgICJFeHRlcm5hbCBTZXJpYWwgU291cmNlIDgifSwKKyAgICB7IEVQSUNfU1JfSU5UOV9WRUNfUkVHLCAgIkV4dGVybmFsIFNlcmlhbCBTb3VyY2UgOSJ9LAorICAgIHsgRVBJQ19TUl9JTlQxMF9WRUNfUkVHLCAiRXh0ZXJuYWwgU2VyaWFsIFNvdXJjZSAxMCJ9LAorICAgIHsgRVBJQ19TUl9JTlQxMV9WRUNfUkVHLCAiRXh0ZXJuYWwgU2VyaWFsIFNvdXJjZSAxMSJ9LAorICAgIHsgRVBJQ19TUl9JTlQxMl9WRUNfUkVHLCAiRXh0ZXJuYWwgU2VyaWFsIFNvdXJjZSAxMiJ9LAorICAgIHsgRVBJQ19TUl9JTlQxM19WRUNfUkVHLCAiRXh0ZXJuYWwgU2VyaWFsIFNvdXJjZSAxMyJ9LAorICAgIHsgRVBJQ19TUl9JTlQxNF9WRUNfUkVHLCAiRXh0ZXJuYWwgU2VyaWFsIFNvdXJjZSAxNCJ9LAorICAgIHsgRVBJQ19TUl9JTlQxNV9WRUNfUkVHLCAiRXh0ZXJuYWwgU2VyaWFsIFNvdXJjZSAxNSJ9LAorCisgICAgeyBFUElDX0kyQ19JTlRfVkVDX1JFRywgICJJbnRlcm5hbCBJMkMgU291cmNlIn0sCisgICAgeyBFUElDX0RNQTBfSU5UX1ZFQ19SRUcsICJJbnRlcm5hbCBETUEwIFNvdXJjZSJ9LAorICAgIHsgRVBJQ19ETUExX0lOVF9WRUNfUkVHLCAiSW50ZXJuYWwgRE1BMSBTb3VyY2UifSwKKyAgICB7IEVQSUNfTVNHX0lOVF9WRUNfUkVHLCAgIkludGVybmFsIE1lc3NhZ2UgU291cmNlIn0sCisgICAgfTsKKworVk9JREZVTkNQVFIgaW50VmVjVGJsW01BWFZFQ107ICAgIC8qIEludGVycnVwdCB2ZWN0b3IgdGFibGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgZXBpY0luaXQgLSBJbml0aWFsaXplIHRoZSBFUElDIHJlZ2lzdGVycworKgorKiAgVGhpcyByb3V0aW5lIHJlc2V0cyB0aGUgR2xvYmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIsIHRodXMgaXQ6CisqICAgICAtICBEaXNhYmxlcyBhbGwgaW50ZXJydXB0cworKiAgICAgLSAgU2V0cyBlcGljIHJlZ2lzdGVycyB0byByZXNldCB2YWx1ZXMKKyogICAgIC0gIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBQcm9jZXNzb3IgQ3VycmVudCBUYXNrIFByaW9yaXR5IHRvIHRoZQorKiAgICAgICAgaGlnaGVzdCBwcmlvcml0eSAoMHhGKS4KKyogIGVwaWNJbml0IHRoZW4gc2V0cyB0aGUgRVBJQyBvcGVyYXRpb24gbW9kZSB0byBNaXhlZCBNb2RlICh2cy4gUGFzcworKiAgVGhyb3VnaCBvciA4MjU5IGNvbXBhdGlibGUgbW9kZSkuCisqCisqICBJZiBJUlFUeXBlIChpbnB1dCkgaXMgRGlyZWN0IElSUXM6CisqICAgICAtIElSUVR5cGUgaXMgd3JpdHRlbiB0byB0aGUgU0lFIGJpdCBvZiB0aGUgRVBJQyBJbnRlcnJ1cHQKKyogICAgICAgQ29uZmlndXJhdGlvbiByZWdpc3RlciAoSUNSKS4KKyogICAgIC0gY2xrUmF0aW8gaXMgaWdub3JlZC4KKyogIElmIElSUVR5cGUgaXMgU2VyaWFsIElSUXM6CisqICAgICAtIGJvdGggSVJRVHlwZSBhbmQgY2xrUmF0aW8gd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBJQ1IgcmVnaXN0ZXIKKyovCisKK3ZvaWQgZXBpY0luaXQKKyAgICAoCisgICAgdW5zaWduZWQgaW50IElSUVR5cGUsICAgICAgLyogRGlyZWN0IG9yIFNlcmlhbCAqLworICAgIHVuc2lnbmVkIGludCBjbGtSYXRpbyAgICAgIC8qIENsayBSYXRpbyBmb3IgU2VyaWFsIElSUXMgKi8KKyAgICApCisgICAgeworICAgIFVMT05HIHRtcDsKKworICAgIHRtcCA9IHN5c0VVTUJCQVJSZWFkKEVQSUNfR0xPQkFMX1JFRyk7CisgICAgdG1wIHw9IDB4YTAwMDAwMDA7ICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBHbG9iYWwgQ29uZi4gcmVnaXN0ZXIgKi8KKyAgICBzeXNFVU1CQkFSV3JpdGUoRVBJQ19HTE9CQUxfUkVHLCB0bXApOworCS8qCisJICogV2FpdCBmb3IgRVBJQyB0byByZXNldCAtIENMSAorCSAqLworICAgIHdoaWxlKCAoc3lzRVVNQkJBUlJlYWQoRVBJQ19HTE9CQUxfUkVHKSAmIDB4ODAwMDAwMDApID09IDEpOworICAgIHN5c0VVTUJCQVJXcml0ZShFUElDX0dMT0JBTF9SRUcsIDB4MjAwMDAwMDApOworICAgIHRtcCA9IHN5c0VVTUJCQVJSZWFkKEVQSUNfSU5UX0NPTkZfUkVHKTsgICAgLyogUmVhZCBpbnRlcnJ1cHQgY29uZi4gcmVnICovCisKKyAgICBpZiAoSVJRVHlwZSA9PSBFUElDX0RJUkVDVF9JUlEpICAgICAgICAgICAgIC8qIGRpcmVjdCBtb2RlICovCisJc3lzRVVNQkJBUldyaXRlKEVQSUNfSU5UX0NPTkZfUkVHLCB0bXAgJiAweGY3ZmZmZmZmKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcmlhbCBtb2RlICovCisJeworCXRtcCA9IChjbGtSYXRpbyA8PCAyOCkgfCAweDA4MDAwMDAwOyAgICAvKiBTZXQgY2xvY2sgcmF0aW8gKi8KKwlzeXNFVU1CQkFSV3JpdGUoRVBJQ19JTlRfQ09ORl9SRUcsIHRtcCk7CisJfQorCisgICAgd2hpbGUgKGVwaWNJbnRBY2soKSAhPSAweGZmKSAgICAgICAvKiBDbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJCWVwaWNFT0koKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBlcGljSW50RW5hYmxlIC0gRW5hYmxlIGFuIGludGVycnVwdCBzb3VyY2UKKyAqCisgKiAgVGhpcyByb3V0aW5lIGNsZWFycyB0aGUgbWFzayBiaXQgb2YgYW4gZXh0ZXJuYWwsIGFuIGludGVybmFsIG9yCisgKiAgYSBUaW1lciByZWdpc3RlciB0byBlbmFibGUgdGhlIGludGVycnVwdC4KKyAqCisgKiAgUkVUVVJOUzogIE5vbmUKKyAqLwordm9pZCBlcGljSW50RW5hYmxlKGludCBpbnRWZWMpCit7CisgICAgVUxPTkcgdG1wOworICAgIFVMT05HIHNyQWRkcjsKKworICAgIHNyQWRkciA9IFNyY1ZlY1RhYmxlW2ludFZlY10uc3JjQWRkcjsgIC8qIFJldHJpZXZlIHNyYyBWZWMvUHJpbyByZWdpc3RlciAqLworICAgIHRtcCA9IHN5c0VVTUJCQVJSZWFkKHNyQWRkcik7CisgICAgdG1wICY9IH5FUElDX1ZFQ19QUklfTUFTSzsgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIG1hc2sgYml0ICovCisgICAgdG1wIHw9IChFUElDX1ZFQ19QUklfREZMVF9QUkkgPDwgMTYpOyAgIC8qIFNldCBwcmlvcml0eSB0byBEZWZhdWx0IC0gQ0xIICovCisgICAgdG1wIHw9IGludFZlYzsJCQkJICAgICAgICAgICAvKiBTZXQgVmVjdG9yIG51bWJlciAqLworICAgIHN5c0VVTUJCQVJXcml0ZShzckFkZHIsIHRtcCk7CisKKyAgICByZXR1cm47CisgICAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGVwaWNJbnREaXNhYmxlIC0gRGlzYWJsZSBhbiBpbnRlcnJ1cHQgc291cmNlCisgKgorICogIFRoaXMgcm91dGluZSBzZXRzIHRoZSBtYXNrIGJpdCBvZiBhbiBleHRlcm5hbCwgYW4gaW50ZXJuYWwgb3IKKyAqICBhIFRpbWVyIHJlZ2lzdGVyIHRvIGRpc2FibGUgdGhlIGludGVycnVwdC4KKyAqCisgKiAgUkVUVVJOUzogIE9LIG9yIEVSUk9SCisgKgorICovCisKK3ZvaWQgZXBpY0ludERpc2FibGUKKyAgICAoCisgICAgaW50IGludFZlYyAgICAgICAgLyogSW50ZXJydXB0IHZlY3RvciBudW1iZXIgKi8KKyAgICApCisgICAgeworCisgICAgVUxPTkcgdG1wLCBzckFkZHI7CisKKyAgICBzckFkZHIgPSBTcmNWZWNUYWJsZVtpbnRWZWNdLnNyY0FkZHI7CisgICAgdG1wID0gc3lzRVVNQkJBUlJlYWQoc3JBZGRyKTsKKyAgICB0bXAgfD0gMHg4MDAwMDAwMDsgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBtYXNrIGJpdCAqLworICAgIHN5c0VVTUJCQVJXcml0ZShzckFkZHIsIHRtcCk7CisgICAgcmV0dXJuOworICAgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGVwaWNJbnRTb3VyY2VDb25maWcgLSBTZXQgcHJvcGVydGllcyBvZiBhbiBpbnRlcnJ1cHQgc291cmNlCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGludGVycnVwdCBwcm9wZXJpdGVzIChQb2xhcml0eSwgU2Vuc2UsIEludGVycnVwdAorICogUHJvcml0eSwgYW5kIEludGVycnVwdCBWZWN0b3IpIG9mIGFuIEludGVycnVwdCBTb3VyY2UuICBUaGUgcHJvcGVydGllcworICogY2FuIGJlIHNldCB3aGVuIHRoZSBjdXJyZW50IHNvdXJjZSBpcyBub3QgaW4tcmVxdWVzdCBvciBpbi1zZXJ2aWNlLAorICogd2hpY2ggaXMgZGV0ZXJtaW5lZCBieSB0aGUgQWN0aXZpdHkgYml0LiAgVGhpcyByb3V0aW5lIHJldHVybiBFUlJPUgorICogaWYgdGhlIHRoZSBBY3Rpdml0eSBiaXQgaXMgMSAoaW4tcmVxdWVzdCBvciBpbi1zZXJ2aWNlKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgU291cmNlIFZlY3Rvci9Qcmlvcml0eSByZWdpc3RlciAoaW5wdXQpCisgKiBpcyBhIHZhbGlkIGFkZHJlc3MuCisgKgorICogUkVUVVJOUzogIE9LIG9yIEVSUk9SCisgKi8KKworaW50IGVwaWNJbnRTb3VyY2VDb25maWcKKyAgICAoCisgICAgaW50ICAgVmVjdCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJydXB0IHNvdXJjZSB2ZWN0b3IgbnVtYmVyICovCisgICAgaW50ICAgUG9sYXJpdHksICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJydXB0IHNvdXJjZSBwb2xhcml0eSAqLworICAgIGludCAgIFNlbnNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGVycnVwdCBzb3VyY2UgU2Vuc2UgKi8KKyAgICBpbnQgICBQcmlvICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcnJ1cHQgc291cmNlIHByaW9yaXR5ICovCisgICAgKQorCisgICAgeworICAgIFVMT05HIHRtcCwgbmV3VmFsOworICAgIFVMT05HIGFjdEJpdCwgc3JBZGRyOworCisgICAgc3JBZGRyID0gU3JjVmVjVGFibGVbVmVjdF0uc3JjQWRkcjsKKyAgICB0bXAgPSBzeXNFVU1CQkFSUmVhZChzckFkZHIpOworICAgIGFjdEJpdCA9ICh0bXAgJiA0MDAwMDAwMCkgPj4gMzA7ICAgIC8qIHJldHJpZXZlIGFjdGl2aXR5IGJpdCAtIGJpdCAzMCAqLworICAgIGlmIChhY3RCaXQgPT0gMSkKKwlyZXR1cm4gRVJST1I7CisKKyAgICB0bXAgJj0gMHhmZjMwZmYwMDsgICAgIC8qIEVyYXNlIHByZXZpb3VzbHkgc2V0IFAsUyxQcmlvLFZlY3RvciBiaXRzICovCisgICAgbmV3VmFsID0gKFBvbGFyaXR5IDw8IDIzKSB8IChTZW5zZSA8PCAyMikgfCAoUHJpbyA8PCAxNikgfCBWZWN0OworICAgIHN5c0VVTUJCQVJXcml0ZShzckFkZHIsIHRtcCB8IG5ld1ZhbCApOworICAgIHJldHVybiAoT0spOworICAgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGVwaWNJbnRBY2sgLSBhY2tub3dsZWRnZSBhbiBpbnRlcnJ1cHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBJbnRlcnJ1cHQgYWNrbm93bGRnZSByZWdpc3RlciBhbmQgcmV0dXJuCisgKiB0aGUgdmVjdG9yIG51bWJlciBvZiB0aGUgaGlnaGVzdCBwZW5kaW5nIGludGVycnVwdC4KKyAqCisgKiBSRVRVUk5TOiBJbnRlcnJ1cHQgVmVjdG9yIG51bWJlci4KKyAqLworCit1bnNpZ25lZCBpbnQgZXBpY0ludEFjayh2b2lkKQoreworICAgIHJldHVybihzeXNFVU1CQkFSUmVhZCggRVBJQ19QUk9DX0lOVF9BQ0tfUkVHICkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXBpY0VPSSAtIHNpZ25hbCBhbiBlbmQgb2YgaW50ZXJydXB0CisgKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgMHgwIHRvIHRoZSBFT0kgcmVnaXN0ZXIgdG8gc2lnbmFsIGVuZCBvZiBpbnRlcnJ1cHQuCisgKiBJdCBpcyB1c3VhbGx5IGNhbGxlZCBhZnRlciBhbiBpbnRlcnJ1cHQgcm91dGluZSBpcyBzZXJ2ZWQuCisgKgorICogUkVUVVJOUzogTm9uZQorICovCisKK3ZvaWQgZXBpY0VPSSh2b2lkKQorICAgIHsKKyAgICBzeXNFVU1CQkFSV3JpdGUoRVBJQ19QUk9DX0VPSV9SRUcsIDB4MCk7CisgICAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGVwaWNDdXJUYXNrUHJpb1NldCAtIHNldHMgdGhlIHByaW9yaXR5IG9mIHRoZSBQcm9jZXNzb3IgQ3VycmVudCBUYXNrCisgKgorICogIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBlcGljSW5pdCgpIHRvIGxvd2VyIHRoZSBwcmlvcml0eQorICogIG9mIHRoZSBwcm9jZXNzb3IgY3VycmVudCB0YXNrLgorICoKKyAqICBSRVRVUk5TOiAgT0sgb3IgRVJST1IKKyAqLworCitpbnQgZXBpY0N1clRhc2tQcmlvU2V0CisgICAgKAorICAgIGludCBwcmlvTnVtICAgICAgICAgICAgICAgICAvKiBOZXcgcHJpb3JpdHkgdmFsdWUgKi8KKyAgICApCisgICAgeworCisgICAgaWYgKCAocHJpb051bSA8IDApIHx8IChwcmlvTnVtID4gMHhGKSkKKwlyZXR1cm4gRVJST1I7CisgICAgc3lzRVVNQkJBUldyaXRlKEVQSUNfUFJPQ19DVEFTS19QUklfUkVHLCBwcmlvTnVtKTsKKyAgICByZXR1cm4gT0s7CisgICAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBlcGljSW50VGFza0dldAorICoKKyAqIGRlc2NyaXB0aW9uOiBHZXQgdmFsdWUgb2YgcHJvY2Vzc29yIGN1cnJlbnQgaW50ZXJydXB0IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIKKyAqCisgKiBub3RlOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgY2hhciBlcGljSW50VGFza0dldCgpCit7CisgIC8qIGdldCB0aGUgaW50ZXJydXB0IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIgKi8KKyAgICBVTE9ORyByZWc7CisgICAgdW5zaWduZWQgY2hhciByZWM7CisKKyAgICByZWcgPSBzeXNFVU1CQkFSUmVhZCggRVBJQ19QUk9DX0NUQVNLX1BSSV9SRUcgKTsKKyAgICByZWMgPSAoIHJlZyAmIDB4MEYgKTsKKyAgICByZXR1cm4gcmVjOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IGVwaWNJU1IKKyAqCisgKiBkZXNjcmlwdGlvbjogRVBJQyBzZXJ2aWNlIHJvdXRpbmUgY2FsbGVkIGJ5IHRoZSBjb3JlIGV4Y2VwdGlvbgorICogICAgICAgICAgICAgIGF0IDB4NTAwCisgKgorICogbm90ZToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBlcGljSVNSKHZvaWQpCit7CisgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogZXBpY01vZGVHZXQKKyAqCisgKiBkZXNjcmlwdGlvbjogcXVlcnkgRVBJQyBtb2RlLCByZXR1cm4gMCBpZiBwYXNzIHRocm91Z2ggbW9kZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgaWYgbWl4ZWQgbW9kZQorICoKKyAqIG5vdGU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBlcGljTW9kZUdldCh2b2lkKQoreworICAgIFVMT05HIHZhbDsKKworICAgIHZhbCA9IHN5c0VVTUJCQVJSZWFkKCBFUElDX0dMT0JBTF9SRUcgKTsKKyAgICByZXR1cm4gKCggdmFsICYgMHgyMDAwMDAwMCApID4+IDI5KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogZXBpY0NvbmZpZ0dldAorICoKKyAqIGRlc2NyaXB0aW9uOiBHZXQgdGhlIEVQSUMgaW50ZXJydXB0IENvbmZpZ3VyYXRpb24KKyAqICAgICAgICAgICAgICByZXR1cm4gMCBpZiBub3QgZXJyb3IsIG90aGVyd2lzZSByZXR1cm4gMQorICoKKyAqIG5vdGU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGVwaWNDb25maWdHZXQoIHVuc2lnbmVkIGludCAqY2xrUmF0aW8sIHVuc2lnbmVkIGludCAqc2VyRW5hYmxlKQoreworICAgIFVMT05HIHZhbDsKKworICAgIHZhbCA9IHN5c0VVTUJCQVJSZWFkKCBFUElDX0lOVF9DT05GX1JFRyApOworICAgICpjbGtSYXRpbyA9ICggdmFsICYgMHg3MDAwMDAwMCApID4+IDI4OworICAgICpzZXJFbmFibGUgPSAoIHZhbCAmIDB4ODAwMDAwMCApID4+IDI3OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgc3lzRVVNQkJBUlJlYWQgLSBSZWFkIGEgMzItYml0IEVVTUJCQVIgcmVnaXN0ZXIKKyAqCisgKiAgVGhpcyByb3V0aW5lIHJlYWRzIHRoZSBjb250ZW50IG9mIGEgcmVnaXN0ZXIgaW4gdGhlIEVtYmVkZGVkCisgKiAgVXRpbGl0aWVzIE1lbW9yeSBCbG9jaywgYW5kIHN3YXBzIHRvIGJpZyBlbmRpYW4gYmVmb3JlIHJldHVybmluZworICogIHRoZSB2YWx1ZS4KKyAqCisgKiAgUkVUVVJOUzogIFRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgRVVNQkJBUiByZWdpc3Rlci4KKyAqLworCitVTE9ORyBzeXNFVU1CQkFSUmVhZAorICAgICgKKyAgICBVTE9ORyByZWdOdW0KKyAgICApCisgICAgeworICAgIFVMT05HIHRlbXA7CisKKyAgICB0ZW1wID0gKihVTE9ORyAqKSAoQ09ORklHX1NZU19FVU1CX0FERFIgKyByZWdOdW0pOworICAgIHJldHVybiAoIExPTkdTV0FQKHRlbXApKTsKKyAgICB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgc3lzRVVNQkJBUldyaXRlIC0gV3JpdGUgYSAzMi1iaXQgRVVNQkJBUiByZWdpc3RlcgorICoKKyAqICBUaGlzIHJvdXRpbmUgc3dhcHMgdGhlIHZhbHVlIHRvIGxpdHRsZSBlbmRpYW4gdGhlbiB3cml0ZXMgaXQgdG8KKyAqICBhIHJlZ2lzdGVyIGluIHRoZSBFbWJlZGRlZCBVdGlsaXRpZXMgTWVtb3J5IEJsb2NrIGFkZHJlc3Mgc3BhY2UuCisgKgorICogIFJFVFVSTlM6IE4vQQorICovCisKK3ZvaWQgc3lzRVVNQkJBUldyaXRlCisgICAgKAorICAgIFVMT05HIHJlZ051bSwgICAgICAgICAgICAgICAvKiBFVU1CQkFSIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyAgICBVTE9ORyByZWdWYWwgICAgICAgICAgICAgICAgLyogVmFsdWUgdG8gYmUgd3JpdHRlbiAqLworICAgICkKKyAgICB7CisKKyAgICAqKFVMT05HICopIChDT05GSUdfU1lTX0VVTUJfQUREUiArIHJlZ051bSkgPSBMT05HU1dBUChyZWdWYWwpOworICAgIHJldHVybiA7CisgICAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IGVwaWNWZW5kb3JJZAorICoKKyAqIGRlc2NyaXB0aW9uOiByZXR1cm4gdGhlIEVQSUMgVmVuZG9yIElkZW50aWZpY2F0aW9uCisgKiAgICAgICAgICAgICAgcmVnaXN0ZXI6CisgKgorICogICAgICAgICAgICAgIHNpbGljY29uIHZlcnNpb24sIGRldmljZSBpZCwgYW5kIHZlbmRvciBpZAorICoKKyAqIG5vdGU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGVwaWNWZW5kb3JJZAorICAgKAorICAgIHVuc2lnbmVkIGludCAqc3RlcCwKKyAgICB1bnNpZ25lZCBpbnQgKmRldklkLAorICAgIHVuc2lnbmVkIGludCAqdmVuSWQKKyAgICkKKyAgIHsKKyAgICBVTE9ORyB2YWw7CisgICAgdmFsID0gc3lzRVVNQkJBUlJlYWQoIEVQSUNfVkVORE9SX0lEX1JFRyApOworICAgICpzdGVwICA9ICggdmFsICYgMHgwMEZGMDAwMCApID4+IDE2OworICAgICpkZXZJZCA9ICggdmFsICYgMHgwMDAwRkYwMCApID4+IDg7CisgICAgKnZlbklkID0gKCB2YWwgJiAweDAwMDAwMEZGICk7CisgICAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBlcGljRmVhdHVyZXMKKyAqCisgKiBkZXNjcmlwdGlvbjogcmV0dXJuIHRoZSBudW1iZXIgb2YgSVJRIHN1cHBvcnRlZCwKKyAqICAgICAgICAgICAgICBudW1iZXIgb2YgQ1BVLCBhbmQgdGhlIHZlcnNpb24gb2YgdGhlCisgKiAgICAgICAgICAgICAgT3BlbkVQSUMKKyAqCisgKiBub3RlOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGVwaWNGZWF0dXJlcworICAgICgKKyAgICB1bnNpZ25lZCBpbnQgKm5vSVJRcywKKyAgICB1bnNpZ25lZCBpbnQgKm5vQ1BVcywKKyAgICB1bnNpZ25lZCBpbnQgKnZlcklkCisgICAgKQorICAgIHsKKyAgICBVTE9ORyB2YWw7CisKKyAgICB2YWwgPSBzeXNFVU1CQkFSUmVhZCggRVBJQ19GRUFUVVJFU19SRUcgKTsKKyAgICAqbm9JUlFzICA9ICggdmFsICYgMHgwN0ZGMDAwMCApID4+IDE2OworICAgICpub0NQVXMgID0gKCB2YWwgJiAweDAwMDAxRjAwICkgPj4gODsKKyAgICAqdmVySWQgICA9ICggdmFsICYgMHgwMDAwMDBGRiApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBlcGNpVG1GcmVxdW5jeVNldAorICoKKyAqIGRlc2NyaXB0aW9uOiBTZXQgdGhlIHRpbWVyIGZyZXF1ZW5jeSByZXBvcnRpbmcgcmVnaXN0ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZXBpY1RtRnJlcXVlbmN5U2V0KCB1bnNpZ25lZCBpbnQgZnJxICkKK3sKKyAgICBzeXNFVU1CQkFSV3JpdGUoRVBJQ19UTV9GUkVRX1JFRywgZnJxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBlcGljVG1GcmVxdW5jeUdldAorICoKKyAqIGRlc2NyaXB0aW9uOiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIFRpbWVyIEZyZXF1ZW5jeQorICogUmVwb3J0aW5nIHJlZ2lzdGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBlcGljVG1GcmVxdWVuY3lHZXQodm9pZCkKK3sKKyAgICByZXR1cm4oIHN5c0VVTUJCQVJSZWFkKEVQSUNfVE1fRlJFUV9SRUcpKSA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBlcGljVG1CYXNlU2V0CisgKgorICogZGVzY3JpcHRpb246IFNldCB0aGUgI24gZ2xvYmFsIHRpbWVyIGJhc2UgY291bnQgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICByZXR1cm4gMCBpZiBubyBlcnJvciwgb3RoZXJ3aXNlIHJldHVybiAxLgorICoKKyAqIG5vdGU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBlcGljVG1CYXNlU2V0CisgICAgKAorICAgIFVMT05HIHNyY0FkZHIsICAgICAgICAgLyogQWRkcmVzcyBvZiB0aGUgVGltZXIgQmFzZSByZWdpc3RlciAqLworICAgIHVuc2lnbmVkIGludCBjbnQsICAgIC8qIEJhc2UgY291bnQgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5oaWJpdCAgIC8qIDEgLSBjb3VudCBpbmhpYml0ICovCisgICAgKQoreworCisgICAgdW5zaWduZWQgaW50IHZhbCA9IDB4ODAwMDAwMDA7CisgICAgLyogRmlyc3QgaW5oaWJpdCBjb3VudGluZyB0aGUgdGltZXIgKi8KKyAgICBzeXNFVU1CQkFSV3JpdGUoc3JjQWRkciwgdmFsKSA7CisKKyAgICAvKiBzZXQgdGhlIG5ldyB2YWx1ZSAqLworICAgIHZhbCA9IChjbnQgJiAweDdmZmZmZmZmKSB8ICgoaW5oaWJpdCAmIDB4MSkgPDwgMzEpOworICAgIHN5c0VVTUJCQVJXcml0ZShzcmNBZGRyLCB2YWwpIDsKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogZXBpY1RtQmFzZUdldAorICoKKyAqIGRlc2NyaXB0aW9uOiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdsb2JhbCB0aW1lciBiYXNlIGNvdW50IHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgcmV0dXJuIDAgaWYgbm8gZXJyb3IsIG90aGVyd2lzZSByZXR1cm4gMS4KKyAqCisgKiBub3RlOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IGVwaWNUbUJhc2VHZXQoIFVMT05HIHNyY0FkZHIsIHVuc2lnbmVkIGludCAqdmFsICkKK3sKKyAgICAqdmFsID0gc3lzRVVNQkJBUlJlYWQoIHNyY0FkZHIgKTsKKyAgICAqdmFsID0gKnZhbCAmIDB4N2ZmZmZmZmY7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IGVwaWNUbUNvdW50R2V0CisgKgorICogZGVzY3JpcHRpb246IEdldCB0aGUgdmFsdWUgb2YgYSBnaXZlbiBnbG9iYWwgdGltZXIKKyAqICAgICAgICAgICAgICBjdXJyZW50IGNvdW50IHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgcmV0dXJuIDAgaWYgbm8gZXJyb3IsIG90aGVyd2lzZSByZXR1cm4gMQorICogbm90ZToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IGVwaWNUbUNvdW50R2V0KCBVTE9ORyBzcmNBZGRyLCB1bnNpZ25lZCBpbnQgKnZhbCApCit7CisgICAgKnZhbCA9IHN5c0VVTUJCQVJSZWFkKCBzcmNBZGRyICk7CisgICAgKnZhbCA9ICp2YWwgJiAweDdmZmZmZmZmOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IGVwaWNUbUluaGliaXQKKyAqCisgKiBkZXNjcmlwdGlvbjogU3RvcCBjb3VudGluZyBvZiBhIGdpdmVuIGdsb2JhbCB0aW1lcgorICogICAgICAgICAgICAgIHJldHVybiAwIGlmIG5vIGVycm9yLCBvdGhlcndpc2UgcmV0dXJuIDEKKyAqCisgKiBub3RlOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IGVwaWNUbUluaGliaXQoIHVuc2lnbmVkIGludCBzcmNBZGRyICkKK3sKKyAgICBVTE9ORyB2YWw7CisKKyAgICB2YWwgPSBzeXNFVU1CQkFSUmVhZCggc3JjQWRkciApOworICAgIHZhbCB8PSAweDgwMDAwMDAwOworICAgIHN5c0VVTUJCQVJXcml0ZSggc3JjQWRkciwgdmFsICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBlcGljVG1FbmFibGUKKyAqCisgKiBkZXNjcmlwdGlvbjogRW5hYmxlIGNvdW50aW5nIG9mIGEgZ2l2ZW4gZ2xvYmFsIHRpbWVyCisgKiAgICAgICAgICAgICAgcmV0dXJuIDAgaWYgbm8gZXJyb3IsIG90aGVyd2lzZSByZXR1cm4gMQorICoKKyAqIG5vdGU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQgZXBpY1RtRW5hYmxlKCBVTE9ORyBzcmNBZGRyICkKK3sKKyAgICBVTE9ORyB2YWw7CisKKyAgICB2YWwgPSBzeXNFVU1CQkFSUmVhZCggc3JjQWRkciApOworICAgIHZhbCAmPSAweDdmZmZmZmZmOworICAgIHN5c0VVTUJCQVJXcml0ZSggc3JjQWRkciwgdmFsICk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXBpY1NvdXJjZVByaW50KGludCBWZWN0KQorICAgIHsKKyAgICBVTE9ORyBzcmNWYWw7CisKKyAgICBzcmNWYWwgPSBzeXNFVU1CQkFSUmVhZChTcmNWZWNUYWJsZVtWZWN0XS5zcmNBZGRyKTsKKyAgICBQUklOVCgiJXNcbiIsIFNyY1ZlY1RhYmxlW1ZlY3RdLnNyY05hbWUpOworICAgIFBSSU5UKCJBZGRyZXNzICAgPSAweCVseFxuIiwgU3JjVmVjVGFibGVbVmVjdF0uc3JjQWRkcik7CisgICAgUFJJTlQoIlZlY3RvciAgICA9ICVsZFxuIiwgKHNyY1ZhbCAmIDB4MDAwMDAwRkYpICk7CisgICAgUFJJTlQoIk1hc2sgICAgICA9ICVsZFxuIiwgc3JjVmFsID4+IDMxKTsKKyAgICBQUklOVCgiQWN0aXZpdGl5ID0gJWxkXG4iLCAoc3JjVmFsICYgNDAwMDAwMDApID4+IDMwKTsKKyAgICBQUklOVCgiUG9sYXJpdHkgID0gJWxkXG4iLCAoc3JjVmFsICYgMHgwMDgwMDAwMCkgPj4gMjMpOworICAgIFBSSU5UKCJTZW5zZSAgICAgPSAlbGRcbiIsIChzcmNWYWwgJiAweDAwNDAwMDAwKSA+PiAyMik7CisgICAgUFJJTlQoIlByaW9yaXR5ICA9ICVsZFxuIiwgKHNyY1ZhbCAmIDB4MDAwRjAwMDApID4+IDE2KTsKKyAgICB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvZHJpdmVycy9lcGljL2VwaWMyLlMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvZHJpdmVycy9lcGljL2VwaWMyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkMTlhYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2VwaWMvZXBpYzIuUwpAQCAtMCwwICsxLDE5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogY29weXJpZ2h0IEAgTW90b3JvbGEsIDE5OTkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uOiBDb3JlRXh0SW50RW5hYmxlCisgKgorICogZGVzY3JpcHRpb246IEVuYWJsZSA2MDNlIGNvcmUgZXh0ZXJuYWwgaW50ZXJydXB0CisgKgorICogbm90ZTogbXRtc3IgaXMgY29udGV4dC1zeW5jaHJvbml6YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkudGV4dAorCQkuYWxpZ24gMgorCS5nbG9iYWwgQ29yZUV4dEludEVuYWJsZQorQ29yZUV4dEludEVuYWJsZToKKwkgbWZtc3IgICAgcjMKKworCSBvcmkgICAgICByMyxyMywweDgwMDAgICAgICAgICAvKiBlbmFibGUgZXh0ZXJuYWwgaW50ZXJydXB0ICovCisJIG10bXNyICAgIHIzCisKKwkgYmNsciAyMCwgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IENvcmVFeHRJbnREaXNhYmxlCisgKgorICogZGVzY3JpcHRpb246IERpc2FibGUgNjAzZSBjb3JlIGV4dGVybmFsIGludGVycnVwdAorICoKKyAqIG5vdGU6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJLnRleHQKKwkJLmFsaWduIDIKKwkuZ2xvYmFsIENvcmVFeHRJbnREaXNhYmxlCitDb3JlRXh0SW50RGlzYWJsZToKKwltZm1zciAgICByNAorCisJeG9yCXIzLHIzLHIzCisJb3IgICAgICByMyxyMyxyNAorCisJYW5kaXMuCXI0LHI0LDB4ZmZmZgorCWFuZGkuICAgcjMscjMsMHg3ZmZmICAgICAgICAgLyogZGlzYWJsZSBleHRlcm5hbCBpbnRlcnJ1cHQgKi8KKworCW9yICAgICAgcjMscjMscjQKKwltdG1zciAgICByMworCisJYmNsciAyMCwgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogZXBpY0VPSQorICoKKyAqIGRlc2NyaXB0aW9uOiBzaWduYWwgdGhlIEVPSSBhbmQgcmVzdG9yZSBtYWNoaW5lIHN0YXR1cworICogICAgICAgSW5wdXQ6IHIzIC0gdmFsdWUgb2YgZXVtYmJhcgorICogICAgICAgT3V0cHV0OiByMyAtIHZhbHVlIG9mIGV1bWJiYXIKKyAqICAgICAgICAgICAgICAgcjQgLSBJU1IgdmVjdG9yIHZhbHVlCisgKiBub3RlOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkudGV4dAorCQkuYWxpZ24gMgorCS5nbG9iYWwgZXBpY0VPSQorZXBpY0VPSToKKwlsaXMJcjUsMHgwMDA2CSAgICAgICAgLyogQnVpbGQgRW5kIE9mIEludGVycnVwdCBSZWdpc3RlciBvZmZzZXQgKi8KKwlvcmkJcjUscjUsMHgwMGIwCisJeG9yCXI3LHI3LHI3CSAgICAgICAgLyogQ2xlYXIgcjcgKi8KKwlzdHdicngJcjcscjUscjMJICAgIC8qIFNhdmUgcjcsIHdyaXRpbmcgdG8gdGhpcyByZWdpc3RlciB3aWxsCisJCQkJCSAgICAgKiBpbnRpZGF0ZSB0aGUgZW5kIG9mIHByb2Nlc3NpbmcgdGhlCisJCQkJCSAgICAgKiBoaWdoZXN0IGludGVycnVwdC4KKwkJCSAgICAgKi8KKwlzeW5jCisKKwkvKiAtLS1SRVNUT1JFIE1BQ0hJTkUgU1RBVEUgKi8KKwltZm1zcglyMTMJCSAgICAgICAgLyogQ2xlYXIgUmVjb3ZlcmFibGUgSW50ZXJydXB0IGJpdCBpbiBNU1IgKi8KKwlvciAgICAgIHI3LHI3LHIxMworCisJYW5kaXMuICByNyxyNywweGZmZmYKKwlhbmRpLglyMTMscjEzLDB4N2ZmZAkvKiAoYW5kIGRpc2FibGUgaW50ZXJydXB0cykgKi8KKwlvciAgICAgIHIxMyxyMTMscjcKKwltdG1zcglyMTMKKworCWx3eiAgIHIxMywweDFjKHIxKSAgICAgIC8qIHB1bGwgY3RyICovCisJbXRjdHIgcjEzCisKKwlsd3ogICByMTMsMHgxOChyMSkgICAgICAvKiBwdWxsIHhlciAqLworCW10Y3RyIHIxMworCisJbHd6ICAgcjEzLDB4MTQocjEpICAgICAgLyogcHVsbCBsciAqLworCW10Y3RyIHIxMworCisJbHd6CSAgICByMTMsMHgxMChyMSkJLyogUHVsbCBTUlIxIGZyb20gc3RhY2sgKi8KKwltdHNwciAgIFNSUjEscjEzCSAgICAvKiBSZXN0b3JlIFNSUjEgKi8KKworCWx3egkgICAgcjEzLDB4YyhyMSkJICAgIC8qIFB1bGwgU1JSMCBmcm9tIHN0YWNrICovCisJbXRzcHIgICBTUlIwLHIxMwkgICAgLyogUmVzdG9yZSBTUlIwICovCisKKwlsd3oJICAgIHIxMywweDgocjEpCSAgICAvKiBQdWxsIFVzZXIgc3RhY2sgcG9pbnRlciBmcm9tIHN0YWNrICovCisJbXRzcHIgICBTUFJHMSxyMTMJICAgIC8qIFJlc3RvcmUgU1BSRzEgKi8KKworCWx3eglyNCwweDQocjEpICAgICAgICAgIC8qIHZlY3RvciB2YWx1ZSAqLworCWx3eglyMywweDAocjEpICAgICAgICAgIC8qIGV1bWJiYXIgKi8KKwlzeW5jCisKKwlhZGRpCXIxLHIxLDB4MjAJLyogRGVhbGxvY2F0ZSBzdGFjayAqLworCW10c3ByICAgU1BSRzAscjEJLyogU2F2ZSB1cGRhdGVkIFN1cGVydmlzb3Igc3RhY2sgcG9pbnRlciAqLworCW1mc3ByICAgcjEsU1BSRzEJLyogUmVzdG9yZSBVc2VyIHN0YWNrIHBvaW50ZXIgKi8KKworCWJjbHIgICAgIDIwLDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogZXhjZXB0aW9uIHJvdXRpbmUgY2FsbGVkIGJ5IGV4Y2VwdGlvbiB2ZWN0b3IKKyAqICAgICAgICAgICBhdCAweDUwMCwgZXh0ZXJuYWwgaW50ZXJydXB0CisgKgorICogZGVzY3JpcHRpb246IEthaGx1YSBFUElDIGNvbnRyb2xsZXIKKyAqCisgKiBpbnB1dDogIHIzIC0gY29udGVudCBvZiBldW1iYmFyCisgKiBvdXRwdXQ6IHIzIC0gSVNSIHJldHVybiB2YWx1ZQorICogICAgICAgICByNCAtIEludGVycnVwdCB2ZWN0b3IgbnVtYmVyCisgKiBub3RlOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgLnRleHQKKwkgICAuYWxpZ24gMgorICAgICAgIC5nbG9iYWwgZXBpY19leGNlcHRpb24KKworZXBpY19leGNlcHRpb246CisKKwkvKi0tLVNBVkUgTUFDSElORSBTVEFURSBUTyBBIFNUQUNLICovCisJbXRzcHIgICBTUFJHMSxyMQkvKiBTYXZlIFVzZXIgc3RhY2sgcG9pbnRlciB0byBTUFJHMSAqLworCW1mc3ByCXIxLFNQUkcwCS8qIExvYWQgU3VwZXJ2aXNvciBzdGFjayBwb2ludGVyIGludG8gcjEgKi8KKworCXN0d3UJcjMsLTB4MjAocjEpCS8qIFB1c2ggdGhlIHZhbHVlIG9mIGV1bWJiYXIgb250byBzdGFjayAqLworCisJbWZzcHIJcjMsU1BSRzEJLyogUHVzaCBVc2VyIHN0YWNrIHBvaW50ZXIgb250byBzdGFjayAqLworCXN0dwkgICAgcjMsMHg4KHIxKQorCW1mc3ByCXIzLFNSUjAJICAgIC8qIFB1c2ggU1JSMCBvbnRvIHN0YWNrICovCisJc3R3CSAgICByMSwweGMocjEpCisJbWZzcHIJcjMsU1JSMQkgICAgLyogUHVzaCBTUlIxIG9udG8gc3RhY2sgKi8KKwlzdHcJICAgIHIzLDB4MTAocjEpCisJbWZsciAgICByMworCXN0dyAgICAgcjMsMHgxNChyMSkgLyogUHVzaCBMUiAqLworCW1meGVyICAgcjMKKwlzdHcgICAgIHIzLDB4MTgocjEpIC8qIFB1c2ggWGVyICovCisJbWZjdHIgICByMworCXN0dyAgICAgcjMsMHgxYyhyMSkgLyogUHVzaCBDVFIgKi8KKworCW10c3ByCVNQUkcwLHIxCS8qIFNhdmUgdXBkYXRlZCBTdXBlcnZpc29yIHN0YWNrIHBvaW50ZXIKKwkJCQkJICogdmFsdWUgdG8gU1BSRzAKKwkJCSAqLworCW1mbXNyCXIzCisJb3JpCSAgICByMyxyMywweDAwMDIJLyogU2V0IFJlY292ZXJhYmxlIEludGVycnVwdCBiaXQgaW4gTVNSICovCisJbXRtc3IJcjMKKworCS8qIC0tLVJFQUQgSU4gVEhFIEVVTUJBUiBSRUdJU1RFUiAqLworICAgIGx3eiAgICAgcjYsMChyMSkgICAgICAgLyogdGhpcyBpcyBldW1iYmFyICovCisgICAgc3luYworCisJLyogLS0tUkVBRCBFUElDIFJFR0lTVEVSOglQUk9DRVNTT1IgSU5URVJSVVBUIEFDS05PV0xFREdFIFJFR0lTVEVSICovCisJbGlzCXI1LDB4MDAwNgkgICAgICAgIC8qIEJ1aWxkIEludGVycnVwdCBBY2tub3dsZWRnZSBSZWdpc3RlcgorCQkJCQkgICAgICogb2Zmc2V0CisJCQkgICAgICovCisJb3JpCXI1LHI1LDB4MDBhMAorCWx3YnJ4CXI3LHI1LHI2ICAgIC8qIExvYWQgaW50ZXJydXB0IHZlY3RvciBpbnRvIHI3ICovCisJc3luYworCisJLyogLS1NQVNLIE9GRiBBTEwgQklUUyBFWENFUFQgVEhFIFZFQ1RPUiAqLworCXhvcglyMyxyMyxyMworICAgIHhvciByNCxyNCxyNAorCW9yICAgIHIzLCByMywgcjYgICAgICAgIC8qICBldW1iYmFyIGluIHIzICovCisJYW5kaS4gcjQscjcsMHgwMGZmCS8qIE1hc2sgb2ZmIGJpdHMsIHZlY3RvciBpbiByNCAqLworCisgICAgc3R3ICAgICByNCwweDA0KHIxKSAgICAgLyogc2F2ZSB0aGUgdmVjdG9yIHZhbHVlICovCisKKyAgICBsaXMgICAgIHI1LGVwaWNJU1JAaGEKKwlvcmkgICAgIHI1LHI1LGVwaWNJU1JAbAorCW10bHIgICAgcjUKKwlibHJsCisKKyAgICB4b3IgICByMzAscjMwLHIzMAorCW9yICAgIHIzMCxyMzAscjMgICAgICAgIC8qIHNhdmUgdGhlIHIzIHdoaWNoIGNvbnRhaW50cyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gZXBpY0lTUiAqLworCisJLyogLS0tUkVBRCBJTiBUSEUgRVVNQkFSIFJFR0lTVEVSICovCisgICAgbHd6ICAgICByMywwKHIxKQorICAgIHN5bmMKKworICAgIGxpcyAgICAgcjUsZXBpY0VPSUBoYQorCW9yaSAgICAgcjUscjUsZXBpY0VPSUBsCisJbXRsciAgICByNQorCWJscmwKKworICAgIHhvciAgcjMscjMscjMKKwlvciAgIHIzLHIzLHIzMCAgICAgICAgICAgLyogcmVzdG9yZSB0aGUgSVNSIHJldHVybiB2YWx1ZSAgKi8KKworCWJjbHIgICAgIDIwLDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2VwaWMvZXBpY3V0aWwuUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2VwaWMvZXBpY3V0aWwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODc3MDUwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvZXBpYy9lcGljdXRpbC5TCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNvcHlyaWdodCBAIE1vdG9yb2xhLCAxOTk5CisgKgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0d28gY29tbW9ubHkgdXNlZAorICogbG93ZXIgbGV2ZWwgdXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBUaGUgdXRpbGl0eSByb3V0aW5lcyBhcmUgYWxzbyBpbiBvdGhlcgorICogS2FobHVhIGRldmljZSBkcml2ZXIgbGlicmFyaWVzLiBUaGUKKyAqIG5lZWQgdG8gYmUgbGlua2VkIGluIG9ubHkgb25jZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZnVuY3Rpb246IGxvYWRfcnVudGltZV9yZWcKKyAqCisgKiBpbnB1dDogIHIzIC0gdmFsdWUgb2YgZXVtYmJhcgorICogICAgICAgICByNCAtIHJlZ2lzdGVyIG9mZnNldCBpbiBlbWJlZGRlZCB1dGlsaXR5IHNwYWNlCisgKgorICogb3V0cHV0OiByMyAtIHJlZ2lzdGVyIGNvbnRlbnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgLnRleHQKKyAgICAgIC5hbGlnbiAyCisgICAgICAuZ2xvYmFsIGxvYWRfcnVudGltZV9yZWcKKworbG9hZF9ydW50aW1lX3JlZzoKKworCQkgIHhvciByNSxyNSxyNQorCSAgb3IgIHI1LHI1LHIzICAgICAgIC8qIHNhdmUgZXVtYmJhciAqLworCisJICAgICAgbHdicngJcjMscjQscjUKKwkgICAgICBzeW5jCisKKwkgICAgICBiY2xyIDIwLCAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbjogc3RvcmVfcnVudGltZV9yZWcKKyAqCisgKiBpbnB1dDogcjMgLSB2YWx1ZSBvZiBldW1iYmFyCisgKiAgICAgICAgcjQgLSByZWdpc3RlciBvZmZzZXQgaW4gZW1iZWRkZWQgdXRpbGl0eSBzcGFjZQorICogICAgICAgIHI1IC0gbmV3IHZhbHVlIHRvIGJlIHN0b3JlZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSAgIC50ZXh0CisJICAgLmFsaWduIDIKKwkgICAuZ2xvYmFsIHN0b3JlX3J1bnRpbWVfcmVnCitzdG9yZV9ydW50aW1lX3JlZzoKKworCQkgIHhvciByMCxyMCxyMAorCisJICAgICAgc3R3YnJ4IHI1LCAgcjQsIHIzCisJICAgICAgc3luYworCisJCSAgYmNsciAgIDIwLDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2Vycm9ycy5oIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3OTRhMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9kcml2ZXJzL2Vycm9ycy5oCkBAIC0wLDAgKzEsMjEyIEBACisvKglDb3B5cmlnaHQgTW90b3JvbGEsIEluYy4gMTk5MywgMTk5NAorCUFMTCBSSUdIVFMgUkVTRVJWRUQKKworCVlvdSBhcmUgaGVyZWJ5IGdyYW50ZWQgYSBjb3B5cmlnaHQgbGljZW5zZSB0byB1c2UsIG1vZGlmeSwgYW5kCisJZGlzdHJpYnV0ZSB0aGUgU09GVFdBUkUgc28gbG9uZyBhcyB0aGlzIGVudGlyZSBub3RpY2UgaXMgcmV0YWluZWQKKwl3aXRob3V0IGFsdGVyYXRpb24gaW4gYW55IG1vZGlmaWVkIGFuZC9vciByZWRpc3RyaWJ1dGVkIHZlcnNpb25zLAorCWFuZCB0aGF0IHN1Y2ggbW9kaWZpZWQgdmVyc2lvbnMgYXJlIGNsZWFybHkgaWRlbnRpZmllZCBhcyBzdWNoLgorCU5vIGxpY2Vuc2VzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UgdW5kZXIKKwlhbnkgcGF0ZW50cyBvciB0cmFkZW1hcmtzIG9mIE1vdG9yb2xhLCBJbmMuCisKKwlUaGUgU09GVFdBUkUgaXMgcHJvdmlkZWQgb24gYW4gIkFTIElTIiBiYXNpcyBhbmQgd2l0aG91dCB3YXJyYW50eS4KKwlUbyB0aGUgbWF4aW11bSBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBNT1RPUk9MQSBESVNDTEFJTVMKKwlBTEwgV0FSUkFOVElFUyBXSEVUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIElNUExJRUQKKwlXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKwlQVVJQT1NFIEFORCBBTlkgV0FSUkFOVFkgQUdBSU5TVCBJTkZSSU5HRU1FTlQgV0lUSAorCVJFR0FSRCBUTyBUSEUgU09GVFdBUkUgKElOQ0xVRElORyBBTlkgTU9ESUZJRUQgVkVSU0lPTlMKKwlUSEVSRU9GKSBBTkQgQU5ZIEFDQ09NUEFOWUlORyBXUklUVEVOIE1BVEVSSUFMUy4KKworCVRvIHRoZSBtYXhpbXVtIGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIElOIE5PIEVWRU5UIFNIQUxMCisJTU9UT1JPTEEgQkUgTElBQkxFIEZPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCisJKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YKKwlCVVNJTkVTUyBQUk9GSVRTLCBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIExPU1MgT0YgQlVTSU5FU1MKKwlJTkZPUk1BVElPTiwgT1IgT1RIRVIgUEVDVU5JQVJZIExPU1MpIEFSSVNJTkcgT0YgVEhFIFVTRSBPUgorCUlOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFLiAgIE1vdG9yb2xhIGFzc3VtZXMgbm8gcmVzcG9uc2liaWxpdHkKKwlmb3IgdGhlIG1haW50ZW5hbmNlIGFuZCBzdXBwb3J0IG9mIHRoZSBTT0ZUV0FSRS4KKworKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKy8qCisJIDEgICAgICAgICAyICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICA1ICAgICAgICAgNiAgICAgICAgIDcgICAgICAgICA4CiswMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorKi8KKy8qIExpc3QgZGVmaW5lIHN0YXRlbWVudHMgaGVyZSAqLworCisvKiBUaGVzZSBhcmUgZm9yIGFsbCB0aGUgdG9vbGJveGVzIGFuZCBmdW5jdGlvbnMgdG8gdXNlLiBUaGVzZSB3aWxsIGhlbHAKK3RvIHN0YW5kYXJkaXplIHRoZSBlcnJvciBoYW5kbGluZyBpbiB0aGUgY3VycmVudCBwcm9qZWN0ICovCisKKwkJCQkvKiB0aGlzIGlzIHRoZSAiZGF0YSB0eXBlIiBmb3IgdGhlIGVycm9yCisJCQkJbWVzc2FnZXMgaW4gdGhlIHN5c3RlbSAqLworI2RlZmluZSBTVEFUVVMgdW5zaWduZWQgaW50CisKKwkJCQkvKiB0aGlzIGlzIGEgc3VjY2VzcyBzdGF0dXMgY29kZSAqLworI2RlZmluZSBTVUNDRVNTIDEKKworCQkJCS8qIGxpa2V3aXNlIHRoaXMgaXMgZmFpbHVyZSAqLworI2RlZmluZSBGQUlMVVJFIDAKKworI2RlZmluZSBOVU1fRVJST1JTIDQ3CisKKy8qIFRoaXMgZmlyc3Qgc2VjdGlvbiBvZiAiZGVmaW5lcyIgYXJlIGZvciBlcnJvciBjb2RlcyBPTkxZLiAgVGhlIGNhbGxlZAorICAgcm91dGluZSB3aWxsIHJldHVybiBvbmUgb2YgdGhlc2UgZXJyb3IgY29kZXMgdG8gdGhlIGNhbGxlci4gIElmIHRoZSBmaW5hbAorICAgcmV0dXJuZWQgY29kZSBpcyAiVkFMSUQiLCB0aGVuIGV2ZXJ5dGhpbmcgaXMgYS1va2F5LiAgSG93ZXZlciwgaWYgb25lCisgICBvZiB0aGUgZnVuY3Rpb25zIHJldHVybnMgYSBub24tdmFsaWQgc3RhdHVzLCB0aGF0IGVycm9yIGNvZGUgc2hvdWxkIGJlCisgICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBjYWxsZXJzLiAgQXQgdGhlIGVuZCwgdGhlIGxhc3QgY2FsbGVyIHdpbGwKKyAgIGNhbGwgYW4gZXJyb3JfcHJvY2Vzc2luZyBmdW5jdGlvbiwgYW5kIHNlbmQgaW4gdGhlIHN0YXR1cyB3aGljaCB3YXMKKyAgIHJldHVybmVkLiAgSXQncyB1cCB0byB0aGUgZXJyb3JfcHJvY2Vzc2luZyBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2gKKyAgIGVycm9yIG9jY3VyZWQgKGFzIGluZGljYXRlZCBieSB0aGUgc3RhdHVzKSwgYW5kIHByaW50IGFuIGFwcHJvcHJpYXRlCisgICBtZXNzYWdlIGJhY2sgdG8gdGhlIHVzZXIuCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHRoZXNlIGFyZSBzcGVjaWZpY2FsbHkgZm9yIHRoZSBwYXJzZXIgcm91dGluZXMJCQkqLworCisjZGVmaW5lIFVOS05PV05fQ09NTUFORAkJMHhmYjAwIC8qICJ1bnJlY29nbml6ZWQgY29tbWFuZCAiICovCisjZGVmaW5lIFVOS05PV05fUkVHSVNURVIJMHhmYjAxIC8qICJ1bmtub3duIHJlZ2lzdGVyICIqLworI2RlZmluZSBJTExFR0FMX1JEX1NUQUdFCTB4ZmIwMiAvKiBjYW5ub3Qgc3BlY2lmeSByZWcuIGZhbWlseSBpbiByYW5nZSovCisjZGVmaW5lIElMTEVHQUxfUkVHX0ZBTUlMWQkweGZiMDMgLyogImNhbm5vdCBzcGVjaWZ5IGEgcmFuZ2Ugb2Ygc3BlY2lhbAorCQkJCQlvciBtaXNjZWxsYW5lb3VzIHJlZ2lzdGVycyIqLworI2RlZmluZSBSQU5HRV9DUk9TU19GQU1JTFkJMHhmYjA0IC8qICJjYW5ub3Qgc3BlY2lmeSBhIHJhbmdlIGFjcm9zcworCQkJCQlyZWdpc3RlciBmYW1pbGllcyIgKi8KKyNkZWZpbmUgVU5JTVBMRU1FTlRFRF9TVEFHRQkweGZiMDUgLyogaW52YWxpZCByZCBvciBybW0gcGFyYW1ldGVyIGZvcm1hdCAqLworI2RlZmluZSBSRUdfTk9UX1dSSVRFQUJMRQkweGZiMDYgLyogInVua25vd24gb3BlcmF0b3IgaW4gYXJndWVtZW50cyIqLworI2RlZmluZSBJTlZBTElEX0ZJTEVOQU1FCTB4ZmIwNyAvKiAiaW52YWxpZCBkb3dubG9hZCBmaWxlbmFtZSIgKi8KKyNkZWZpbmUgSU5WQUxJRF9CQVVEX1JBVEUJMHhmYjA4CS8qIGludmFsaWQgYmF1ZCByYXRlIGZyb20gc2IgY29tbWFuZCAqLworI2RlZmluZSBVTlNVUFBPUlRFRF9SRUdJU1RFUgkweGZiMDkJLyogU3BlY2lhbCByZWdpc3RlciBpcyBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEZPUl9CT0FSRF9PTkxZCQkweGZiMGEgIC8qICJOb3QgYXZhaWxhYmxlIGZvciBVbml4LiIgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlc2UgYXJlIGZvciB0aGUgZXJyb3IgY2hlY2tpbmcgdG9vbGJveAkJCQkqLworCisjZGVmaW5lIElOVkFMSUQJCQkweGZkMDAgLyogTk9UIHZhbGlkICovCisjZGVmaW5lIFZBTElECQkJMHhmZDAxIC8qIHZhbGlkICovCisKKwkJCQkJLyogVGhpcyBlcnJvciBpcyBmb3VuZCBpbiB0aGUgZmNuOgorCQkJCQlpc19yaWdodF9zaXplX2lucHV0KCkgdG8gaW5kaWNhdGUKKwkJCQkJdGhhdCB0aGUgaW5wdXQgd2FzIG5vdCA4IGNoYXJhY3RlcnMKKwkJCQkJbG9uZy4gICovCisjZGVmaW5lIElOVkFMSURfU0laRQkJMHhmZDAyCisKKwkJCQkJLyogVGhpcyBlcnJvciBpcyBmb3VuZCBpbiB0aGUgZmNuOgorCQkJCQlpc192YWxpZF9hZGRyZXNzX3JhbmdlKCkgdG8gaW5kaWNhdGUKKwkJCQkJdGhhdCB0aGUgYWRkcmVzcyBnaXZlbiBmYWxscyBvdXRzaWRlCisJCQkJCW9mIHZhbGlkIG1lbW9yeSBkZWZpbmVkIGJ5IE1FTV9TVEFSVAorCQkJCQl0byBNRU1fRU5ELgorCQkJCQkqLworI2RlZmluZSBPVVRfT0ZfQk9VTkRTX0FERFJFU1MJMHhmZDAzCisKKwkJCQkJLyogVGhpcyBlcnJvciBpcyBmb3VuZCBpbiB0aGUgZmNuOgorCQkJCQlpc192YWxpZF9oZXhfaW5wdXQoKSB0byBpbmRpY2F0ZSB0aGF0CisJCQkJCW9uZSBvZiBtb3JlIG9mIHRoZSBjaGFyYWN0ZXJzIGVudGVyZWQKKwkJCQkJYXJlIG5vdCB2YWxpZCBoZXggY2hhcmFjdGVycy4gIFZhbGlkCisJCQkJCWhleCBjaGFyYWN0ZXJzIGFyZSAwLTksIEEtRiwgYS1mLgorCQkJCQkqLworI2RlZmluZSBJTlZBTElEX0hFWF9JTlBVVAkweGZkMDQKKworCQkJCQkvKiBUaGlzIGVycm9yIGlzIGZvdW5kIGluIHRoZSBmY246CisJCQkJCWlzX3ZhbGlkX3JlZ2lzdGVyX251bWJlcigpIHRvIGluZGljYXRlCisJCQkJCXRoYXQgYSBnaXZlbiByZWdpc3RlciBkb2VzIG5vdCBleGlzdC4KKwkJCQkJKi8KKyNkZWZpbmUgUkVHX05PVF9SRUFEQUJMRQkweGZkMDUKKworCQkJCQkvKiBUaGlzIGVycm9yIGlzIGZvdW5kIGluIHRoZSBmY246CisJCQkJCWlzX3dvcmRfYWxpZ25lZF9hZGRyZXNzKCkgdG8gaW5kaWNhdGUKKwkJCQkJdGhhdCB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBub3Qgd29yZC0KKwkJCQkJYWxpZ25lZC4gIEEgd29yZC1hbGlnbmVkIGFkZHJlc3MgZW5kcworCQkJCQlpbiAweDAsMHg0LDB4OCwweGMuCisJCQkJCSovCisjZGVmaW5lCU5PVF9XT1JEX0FMSUdORUQJMHhmZDA3CisKKwkJCQkJLyogVGhpcyBlcnJvciBpcyBmb3VuZCBpbiB0aGUgZmNuOgorCQkJCQlpc192YWxpZF9hZGRyZXNzX3JhbmdlKCkgdG8gaW5kaWNhdGUKKwkJCQkJdGhhdCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBpcyBncmVhdGVyCisJCQkJCXRoYW4gdGhlIGVuZGluZyBhZGRyZXNzLgorCQkJCQkqLworI2RlZmluZSBSRVZFUlNFRF9BRERSRVNTCTB4ZmQwOAorCisJCQkJCS8qIHRoaXMgZXJyb3IgdGVsbHMgdXMgdGhhdCB0aGUgYWRkcmVzcworCQkJCQlzcGVjaWZpZWQgYXMgdGhlIGRlc3RpbmF0aW9uIGlzIHdpdGhpbgorCQkJCQl0aGUgc291cmNlIGFkZHJlc3NlcyAgKi8KKyNkZWZpbmUgUkFOR0VfT1ZFUkxBUAkJMHhmZDA5CisKKworI2RlZmluZQlFUlJPUgkJCTB4ZmQwYSAvKiBBbiBlcnJvciBvY2N1cmVkICovCisjZGVmaW5lIElOVkFMSURfUEFSQU0JCTB4ZmQwYiAvKiAiaW52YWxpZCBpbnB1dCBwYXJhbWV0ZXIgIiAqLworCisKKyNkZWZpbmUgSU5WQUxJRF9GTEFHCQkweGZkMGMJLyogaW52YWxpZCBmbGFnICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGVzZSBhcmUgZm9yIHRoZSBnZXRhcmcgdG9vbGJveAkJCQkJKi8KKworI2RlZmluZSBJTlZBTElEX05VTUJFUl9BUkdTCTB4RkUwMCAvKiBpbnZhbGlkIG51bWJlciBvZiBjb21tZCBhcmd1ZW1lbnRzICovCisjZGVmaW5lIFVOS05PV05fUEFSQU1FVEVSCTB4RkUwMSAvKiAidW5rbm93biB0eXBlIG9mIHBhcmFtZXRlciAiKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlc2UgYXJlIGZvciB0aGUgdG9rZW5pemVyIHRvb2xib3gJCQkJCSovCisKKyNkZWZpbmUgSUxMRUdBTF9DSEFSQUNURVIJMHhGRjAwIC8qIHVucmVjb2duaXplZCBjaGFyLiBpbiBpbnB1dCBzdHJlYW0qLworI2RlZmluZSBUVExfTk9UX1NPUlRFRAkJMHhGRjAxIC8qIHRva2VuIHRyYW5zbGF0aW9uIGxpc3Qgbm90IHNvcnRlZCAqLworI2RlZmluZSBUVExfTk9UX0RFRklORUQJCTB4RkYwMiAvKiB0b2tlbiB0cmFuc2xhdGlvbiBsaXN0IG5vdCBhc3NpZ25lZCovCisjZGVmaW5lIElOVkFMSURfU1RSSU5HCQkweEZGMDMgLyogdW5hYmxlIHRvIGV4dHJhY3Qgc3RyaW5nIGZyb20gaW5wdXQgKi8KKyNkZWZpbmUgQlVGRkVSX0VNUFRZCQkweEZGMDQgLyogImlucHV0IGJ1ZmZlciBpcyBlbXB0eSIgKi8KKyNkZWZpbmUgSU5WQUxJRF9NT0RFCQkweEZGMDUgLyogaW5wdXQgYnVmIGlzIGluIGFuIHVucmVjb2duaXplZCBtb2RlKi8KKyNkZWZpbmUgVE9LX0lOVEVSTkFMX0VSUk9SCTB4RkYwNiAvKiAiaW50ZXJuYWwgdG9rZW5pemVyIGVycm9yIiAqLworI2RlZmluZSBUT09fTUFOWV9JQlMJCTB4RkYwNyAvKiAidG9vIG1hbnkgb3BlbiBpbnB1dCBidWZmZXJzIiAqLworI2RlZmluZSBOT19PUEVOX0lCUwkJMHhGRjA4IC8qICJubyBvcGVuIGlucHV0IGJ1ZmZlcnMiICovCisKKworLyogdGhlc2UgYXJlIGZvciB0aGUgcmVhZCBmcm9tIHNjcmVlbiB0b29sYm94ICovCisKKyNkZWZpbmUgUkVTRVJWRURfV09SRAkJMHhGQzAwIC8qIHVzZWQgYSByZXNlcnZlZCB3b3JkIGFzIGFuIGFyZ3VlbWVudCovCisKKworLyogdGhlc2UgYXJlIGZvciB0aGUgYnJlYWtwb2ludCByb3V0aW5lcyAqLworCisjZGVmaW5lIEZVTExfQlBEUwkJMHhGQTAwIC8qIGJyZWFrcG9pbnQgZGF0YSBzdHJ1Y3R1cmUgaXMgZnVsbCAqLworCisKKy8qIFRIRVNFIGFyZSBmb3IgdGhlIGRvd25sb2FkZXIgKi8KKworI2RlZmluZSBOT1RfSU5fU19SRUNPUkRfRk9STUFUCTB4ZjkwMCAvKiAibm90IGluIFMtUmVjb3JkIEZvcm1hdCIgKi8KKyNkZWZpbmUgVU5SRUNfUkVDT1JEX1RZUEUJMHhmOTAxIC8qICJ1bnJlY29nbml6ZWQgcmVjb3JkIHR5cGUiICovCisjZGVmaW5lIENPTlZFUlNJT05fRVJST1IJMHhmOTAyIC8qICJhc2NpaSB0byBpbnQgY29udmVyc2lvbiBlcnJvciIgKi8KKyNkZWZpbmUgSU5WQUxJRF9NRU1PUlkJCTB4ZjkwMyAvKiAiYmFkIHMtcmVjb3JkIG1lbW9yeSBhZGRyZXNzICIgKi8KKworCisvKiB0aGVzZSBhcmUgZm9yIHRoZSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBzdHVmZiAqLworCisjZGVmaW5lIENPTVBfVU5LX0NIQVJBQ1RFUgkweGY4MDAgLyogInVua25vd24gY29tcHJlc3NlZCBjaGFyYWN0ZXIgIiAqLworCisjZGVmaW5lIENPTVBfVU5LTk9XTl9TVEFURQkweGY4MDEgLyogInVua25vd24gYmluYXJ5IHN0YXRlIiAqLworCisjZGVmaW5lIE5PVF9JTl9DT01QUkVTU0VEX0ZPUk1BVCAweGY4MDIgLyogbm90IGluIGNvbXByZXNzZWQgUy1SZWNvcmQgZm9ybWF0ICovCisKKworLyogdGhlc2UgYXJlIGZvciB0aGUgRFVBUlQgaGFuZGxpbmcgdGhpbmdzICovCisKKwkJCQkJLyogInVucmVjb2duaXplZCBzZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uIiAqLworI2RlZmluZSBVTktOT1dOX1BPUlRfU1RBVEUJMHhmNzAwCisKKworLyogdGhlc2UgYXJlIGZvciB0aGUgcmVnaXN0ZXIgdG9vbGJveCAqLworCisJCQkJCS8qICJjYW5ub3QgZmluZCByZWdpc3RlciBpbiBzcGVjaWFsCisJCQkJCSBwdXJwb3NlIHJlZ2lzdGVyIGZpbGUgIiAqLworI2RlZmluZSBTUFJfTk9UX0ZPVU5ECQkweGY2MDAKKworCisvKiB0aGVzZSBhcmUgZm9yIHRoZSBkdWFydCBzcGVjaWZpYyBzdHVmZiAqLworCisJCQkJCS8qICJ0cmFuc3BhcmVudCBtb2RlIG5lZWRzIGFjY2VzcyB0bworCQkJCQkJdHdvIHNlcmlhbCBwb3J0cyIgKi8KKyNkZWZpbmUgVE1fTkVFRFNfQk9USF9QT1JUUwkweGY1MDAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlc2UgYXJlIHNwZWNpZmljYWxseSBmb3IgdGhlIGZsYXNoIHJvdXRpbmVzCQkJKi8KKyNkZWZpbmUgRkxBU0hfRVJST1IJCTB4ZjEwMAkJLyogZ2VuZXJhbCBmbGFzaCBlcnJvciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvaTJjL2kyYy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvaTJjL2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2FlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvZHJpdmVycy9pMmMvaTJjLmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIEdsZWIgTmF0YXBvdiA8Z25hdGFwb3ZAbXJ2LmNvbT4KKyAqIFNvbWUgYml0cyBhcmUgdGFrZW4gZnJvbSBsaW51eCBkcml2ZXIgd3JpdGVuIGJ5IGFkcmlhbkBodW1ib2xkdC5jby51aworICoKKyAqIEhhcmR3YXJlIEkyQyBkcml2ZXIgZm9yIE1QQzEwNyBQQ0kgYnJpZGdlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI3VuZGVmIEkyQ0RCRworCisjaWZkZWYgQ09ORklHX0hBUkRfSTJDCisjaW5jbHVkZSA8aTJjLmg+CisKKyNkZWZpbmUgVElNRU9VVCAoQ09ORklHX1NZU19IWi80KQorCisjZGVmaW5lIEkyQ19BZGRyICgodW5zaWduZWQgKikoQ09ORklHX1NZU19FVU1CX0FERFIgKyAweDMwMDApKQorCisjZGVmaW5lIEkyQ0FEUiAmSTJDX0FkZHJbMF0KKyNkZWZpbmUgSTJDRkRSICAmSTJDX0FkZHJbMV0KKyNkZWZpbmUgSTJDQ0NSICAmSTJDX0FkZHJbMl0KKyNkZWZpbmUgSTJDQ1NSICAmSTJDX0FkZHJbM10KKyNkZWZpbmUgSTJDQ0RSICAmSTJDX0FkZHJbNF0KKworI2RlZmluZSBNUEMxMDdfQ0NSX01FTiAgMHg4MAorI2RlZmluZSBNUEMxMDdfQ0NSX01JRU4gMHg0MAorI2RlZmluZSBNUEMxMDdfQ0NSX01TVEEgMHgyMAorI2RlZmluZSBNUEMxMDdfQ0NSX01UWCAgMHgxMAorI2RlZmluZSBNUEMxMDdfQ0NSX1RYQUsgMHgwOAorI2RlZmluZSBNUEMxMDdfQ0NSX1JTVEEgMHgwNAorCisjZGVmaW5lIE1QQzEwN19DU1JfTUNGICAweDgwCisjZGVmaW5lIE1QQzEwN19DU1JfTUFBUyAweDQwCisjZGVmaW5lIE1QQzEwN19DU1JfTUJCICAweDIwCisjZGVmaW5lIE1QQzEwN19DU1JfTUFMICAweDEwCisjZGVmaW5lIE1QQzEwN19DU1JfU1JXICAweDA0CisjZGVmaW5lIE1QQzEwN19DU1JfTUlGICAweDAyCisjZGVmaW5lIE1QQzEwN19DU1JfUlhBSyAweDAxCisKKyNkZWZpbmUgSTJDX1JFQUQgIDEKKyNkZWZpbmUgSTJDX1dSSVRFIDAKKworLyogdGFrZW4gZnJvbSBsaW51eCBpbmNsdWRlL2FzbS1wcGMvaW8uaCAqLworaW5saW5lIHVuc2lnbmVkIGluX2xlMzIgKHZvbGF0aWxlIHVuc2lnbmVkICphZGRyKQoreworCXVuc2lnbmVkIHJldDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgibHdicnggJTAsMCwlMTtcbiIKKwkJCSAgICAgICJ0d2kgMCwlMCwwO1xuIgorCQkJICAgICAgImlzeW5jIjoiPXIiIChyZXQpOiAiciIgKGFkZHIpLCAibSIgKCphZGRyKSk7CisJcmV0dXJuIHJldDsKK30KKworaW5saW5lIHZvaWQgb3V0X2xlMzIgKHZvbGF0aWxlIHVuc2lnbmVkICphZGRyLCBpbnQgdmFsKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3R3YnJ4ICUxLDAsJTI7IGVpZWlvIjoiPW0iICgqYWRkcik6InIiICh2YWwpLAorCQkJICAgICAgInIiIChhZGRyKSk7Cit9CisKKyNkZWZpbmUgd3JpdGVsKHZhbCwgYWRkcikgb3V0X2xlMzIoYWRkciwgdmFsKQorI2RlZmluZSByZWFkbChhZGRyKSBpbl9sZTMyKGFkZHIpCisKK3ZvaWQgaTJjX2luaXQgKGludCBzcGVlZCwgaW50IHNsYXZlYWRkKQoreworCS8qIHN0b3AgSTJDIGNvbnRyb2xsZXIgKi8KKwl3cml0ZWwgKDB4MCwgSTJDQ0NSKTsKKwkvKiBzZXQgY2xvY2sgKi8KKwl3cml0ZWwgKDB4MTAyMCwgSTJDRkRSKTsKKwkvKiB3cml0ZSBzbGF2ZSBhZGRyZXNzICovCisJd3JpdGVsIChzbGF2ZWFkZCwgSTJDQURSKTsKKwkvKiBjbGVhciBzdGF0dXMgcmVnaXN0ZXIgKi8KKwl3cml0ZWwgKDB4MCwgSTJDQ1NSKTsKKwkvKiBzdGFydCBJMkMgY29udHJvbGxlciAqLworCXdyaXRlbCAoTVBDMTA3X0NDUl9NRU4sIEkyQ0NDUik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBpMmNfd2FpdDRidXMgKHZvaWQpCit7CisJdWxvbmcgdGltZXZhbCA9IGdldF90aW1lciAoMCk7CisKKwl3aGlsZSAocmVhZGwgKEkyQ0NTUikgJiBNUEMxMDdfQ1NSX01CQikKKwkJaWYgKGdldF90aW1lciAodGltZXZhbCkgPiBUSU1FT1VUKQorCQkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBpMmNfd2FpdCAoaW50IHdyaXRlKQoreworCXUzMiBjc3I7CisJdWxvbmcgdGltZXZhbCA9IGdldF90aW1lciAoMCk7CisKKwlkbyB7CisJCWNzciA9IHJlYWRsIChJMkNDU1IpOworCisJCWlmICghKGNzciAmIE1QQzEwN19DU1JfTUlGKSkKKwkJCWNvbnRpbnVlOworCisJCXdyaXRlbCAoMHgwLCBJMkNDU1IpOworCisJCWlmIChjc3IgJiBNUEMxMDdfQ1NSX01BTCkgeworI2lmZGVmIEkyQ0RCRworCQkJcHJpbnRmICgiaTJjX3dhaXQ6IE1BTFxuIik7CisjZW5kaWYKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmICghKGNzciAmIE1QQzEwN19DU1JfTUNGKSkgeworI2lmZGVmIEkyQ0RCRworCQkJcHJpbnRmICgiaTJjX3dhaXQ6IHVuZmluaXNoZWRcbiIpOworI2VuZGlmCisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAod3JpdGUgPT0gSTJDX1dSSVRFICYmIChjc3IgJiBNUEMxMDdfQ1NSX1JYQUspKSB7CisjaWZkZWYgSTJDREJHCisJCQlwcmludGYgKCJpMmNfd2FpdDogTm8gUlhBQ0tcbiIpOworI2VuZGlmCisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9IHdoaWxlIChnZXRfdGltZXIgKHRpbWV2YWwpIDwgVElNRU9VVCk7CisKKyNpZmRlZiBJMkNEQkcKKwlwcmludGYgKCJpMmNfd2FpdDogdGltZWQgb3V0XG4iKTsKKyNlbmRpZgorCXJldHVybiAtMTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGkyY193cml0ZV9hZGRyICh1OCBkZXYsIHU4IGRpciwgaW50IHJzdGEpCit7CisJd3JpdGVsIChNUEMxMDdfQ0NSX01FTiB8IE1QQzEwN19DQ1JfTVNUQSB8IE1QQzEwN19DQ1JfTVRYIHwKKwkJKHJzdGEgPyBNUEMxMDdfQ0NSX1JTVEEgOiAwKSwgSTJDQ0NSKTsKKworCXdyaXRlbCAoKGRldiA8PCAxKSB8IGRpciwgSTJDQ0RSKTsKKworCWlmIChpMmNfd2FpdCAoSTJDX1dSSVRFKSA8IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX2kyY193cml0ZSAodTggKiBkYXRhLCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCisJd3JpdGVsIChNUEMxMDdfQ0NSX01FTiB8IE1QQzEwN19DQ1JfTVNUQSB8IE1QQzEwN19DQ1JfTVRYLCBJMkNDQ1IpOworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCXdyaXRlbCAoZGF0YVtpXSwgSTJDQ0RSKTsKKworCQlpZiAoaTJjX3dhaXQgKEkyQ19XUklURSkgPCAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX2kyY19yZWFkICh1OCAqIGRhdGEsIGludCBsZW5ndGgpCit7CisJaW50IGk7CisKKwl3cml0ZWwgKE1QQzEwN19DQ1JfTUVOIHwgTVBDMTA3X0NDUl9NU1RBIHwKKwkJKChsZW5ndGggPT0gMSkgPyBNUEMxMDdfQ0NSX1RYQUsgOiAwKSwgSTJDQ0NSKTsKKworCS8qIGR1bW15IHJlYWQgKi8KKwlyZWFkbCAoSTJDQ0RSKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlpZiAoaTJjX3dhaXQgKEkyQ19SRUFEKSA8IDApCisJCQlicmVhazsKKworCQkvKiBHZW5lcmF0ZSBhY2sgb24gbGFzdCBuZXh0IHRvIGxhc3QgYnl0ZSAqLworCQlpZiAoaSA9PSBsZW5ndGggLSAyKQorCQkJd3JpdGVsIChNUEMxMDdfQ0NSX01FTiB8IE1QQzEwN19DQ1JfTVNUQSB8CisJCQkJTVBDMTA3X0NDUl9UWEFLLCBJMkNDQ1IpOworCisJCS8qIEdlbmVyYXRlIHN0b3Agb24gbGFzdCBieXRlICovCisJCWlmIChpID09IGxlbmd0aCAtIDEpCisJCQl3cml0ZWwgKE1QQzEwN19DQ1JfTUVOIHwgTVBDMTA3X0NDUl9UWEFLLCBJMkNDQ1IpOworCisJCWRhdGFbaV0gPSByZWFkbCAoSTJDQ0RSKTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworaW50IGkyY19yZWFkICh1OCBkZXYsIHVpbnQgYWRkciwgaW50IGFsZW4sIHU4ICogZGF0YSwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaSA9IDA7CisJdTggKmEgPSAodTggKikgJiBhZGRyOworCisJaWYgKGkyY193YWl0NGJ1cyAoKSA8IDApCisJCWdvdG8gZXhpdDsKKworCWlmIChpMmNfd3JpdGVfYWRkciAoZGV2LCBJMkNfV1JJVEUsIDApID09IDApCisJCWdvdG8gZXhpdDsKKworCWlmIChfX2kyY193cml0ZSAoJmFbNCAtIGFsZW5dLCBhbGVuKSAhPSBhbGVuKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoaTJjX3dyaXRlX2FkZHIgKGRldiwgSTJDX1JFQUQsIDEpID09IDApCisJCWdvdG8gZXhpdDsKKworCWkgPSBfX2kyY19yZWFkIChkYXRhLCBsZW5ndGgpOworCitleGl0OgorCXdyaXRlbCAoTVBDMTA3X0NDUl9NRU4sIEkyQ0NDUik7CisKKwlyZXR1cm4gIShpID09IGxlbmd0aCk7Cit9CisKK2ludCBpMmNfd3JpdGUgKHU4IGRldiwgdWludCBhZGRyLCBpbnQgYWxlbiwgdTggKiBkYXRhLCBpbnQgbGVuZ3RoKQoreworCWludCBpID0gMDsKKwl1OCAqYSA9ICh1OCAqKSAmIGFkZHI7CisKKwlpZiAoaTJjX3dhaXQ0YnVzICgpIDwgMCkKKwkJZ290byBleGl0OworCisJaWYgKGkyY193cml0ZV9hZGRyIChkZXYsIEkyQ19XUklURSwgMCkgPT0gMCkKKwkJZ290byBleGl0OworCisJaWYgKF9faTJjX3dyaXRlICgmYVs0IC0gYWxlbl0sIGFsZW4pICE9IGFsZW4pCisJCWdvdG8gZXhpdDsKKworCWkgPSBfX2kyY193cml0ZSAoZGF0YSwgbGVuZ3RoKTsKKworZXhpdDoKKwl3cml0ZWwgKE1QQzEwN19DQ1JfTUVOLCBJMkNDQ1IpOworCisJcmV0dXJuICEoaSA9PSBsZW5ndGgpOworfQorCitpbnQgaTJjX3Byb2JlICh1Y2hhciBjaGlwKQoreworCWludCB0bXA7CisKKwkvKgorCSAqIFRyeSB0byByZWFkIHRoZSBmaXJzdCBsb2NhdGlvbiBvZiB0aGUgY2hpcC4gIFRoZSB1bmRlcmx5aW5nCisJICogZHJpdmVyIGRvZXNuJ3QgYXBwZWFyIHRvIHN1cHBvcnQgc2VuZGluZyBqdXN0IHRoZSBjaGlwIGFkZHJlc3MKKwkgKiBhbmQgbG9va2luZyBmb3IgYW4gPEFDSz4gYmFjay4KKwkgKi8KKwl1ZGVsYXkgKDEwMDAwKTsKKwlyZXR1cm4gaTJjX3JlYWQgKGNoaXAsIDAsIDEsICh1Y2hhciAqKSAmdG1wLCAxKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19IQVJEX0kyQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvaTJjX2V4cG9ydC5oIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2RyaXZlcnMvaTJjX2V4cG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjRkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvZHJpdmVycy9pMmNfZXhwb3J0LmgKQEAgLTAsMCArMSwxMDMgQEAKKyNpZm5kZWYgSTJDX0VYUE9SVF9ICisjZGVmaW5lIEkyQ19FWFBPUlRfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCBNb3Ryb2xhIDE5OTkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlc2UgYXJlIHRoZSBkZWZpbmVkIHJldHVybiB2YWx1ZXMgZm9yIHRoZSBJMkNfZG9fdHJhbnNhY3Rpb24gZnVuY3Rpb24uCisgKiBBbnkgbm9uLXplcm8gdmFsdWUgaW5kaWNhdGVzIGZhaWx1cmUuICBGYWlsdXJlIG1vZGVzIGNhbiBiZSBhZGRlZCBmb3IKKyAqIG1vcmUgZGV0YWlsZWQgZXJyb3IgcmVwb3J0aW5nLgorICovCit0eXBlZGVmIGVudW0gX2kyY19zdGF0dXMKK3sKKyBJMkNfU1VDQ0VTUyAgICAgPSAwLAorIEkyQ19FUlJPUiwKK30gSTJDX1N0YXR1czsKKworLyogVGhlc2UgYXJlIHRoZSBkZWZpbmVkIHRhc2tzIGZvciBJMkNfZG9fdHJhbnNhY3Rpb24uCisgKiBNb2RlcyBmb3IgU0xBVkVfUkNWIGFuZCBTTEFWRV9YTUlUIHdpbGwgYmUgYWRkZWQuCisgKi8KK3R5cGVkZWYgZW51bSBfaTJjX3RyYW5zYWN0aW9uX21vZGUKK3sKKwlJMkNfTUFTVEVSX1JDViA9ICAwLAorCUkyQ19NQVNURVJfWE1JVCA9IDEsCit9IEkyQ19UUkFOU0FDVElPTl9NT0RFOworCit0eXBlZGVmIGVudW0gX2kyY19pbnRlcnJ1cHRfbW9kZQoreworCUkyQ19JTlRfRElTQUJMRSA9ICAwLAorCUkyQ19JTlRfRU5BQkxFID0gMSwKK30gSTJDX0lOVEVSUlVQVF9NT0RFOworCit0eXBlZGVmIGVudW0gX2kyY19zdG9wCit7CisJSTJDX05PX1NUT1AgPSAgMCwKKwlJMkNfU1RPUCA9IDEsCit9IEkyQ19TVE9QX01PREU7CisKK3R5cGVkZWYgZW51bSBfaTJjX3Jlc3RhcnQKK3sKKwlJMkNfTk9fUkVTVEFSVCA9ICAwLAorCUkyQ19SRVNUQVJUID0gMSwKK30gSTJDX1JFU1RBUlRfTU9ERTsKKworLyoqKioqKioqKioqKioqKioqKioqIEFwcC4gQVBJICoqKioqKioqKioqKioqKioqKioqCisgKiBUaGUgYXBwbGljYXRpb24gQVBJIGlzIGZvciB1c2VyIGxldmVsIGFwcGxpY2F0aW9uCisgKiB0byB1c2UgdGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgSTJDIGRyaXZlci4KKyAqIFRoaXMgaXMgYSAiZ2VuZXJpYyIgSTJDIGludGVyZmFjZSwgaXQgc2hvdWxkIGNvbnRhaW4KKyAqIG5vdGhpbmcgc3BlY2lmaWMgdG8gdGhlIEthaGx1YSBpbXBsZW1lbnRhdGlvbi4KKyAqIE9ubHkgdGhlIGdlbmVyaWMgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieSB0aGUgbGlicmFyeS4KKyAqCisgKiBOb3RlOiBJdHMgQXBwLnMgcmVzcG9uc2liaWxpdHkgdG8gc3dhcCB0aGUgZGF0YQorICogICAgICAgYnl0ZS4gSW4gb3VyIEFQSSwgd2UganVzdCB0cmFuc2ZlciB3aGF0ZXZlcgorICogICAgICAgd2UgYXJlIGdpdmVuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogIEluaXRpYWxpemUgSTJDIHVuaXQgd2l0aCB0aGUgZm9sbG93aW5nOgorICogIGRyaXZlcidzIHNsYXZlIGFkZHJlc3MKKyAqICBpbnRlcnJ1cHQgZW5hYmxlZAorICogIG9wdGlvbmFsIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gbGF5ZXIgcHJpbnQgZnVuY3Rpb24KKyAqCisgKiAgVGhlc2UgcGFyYW1ldGVycyBtYXkgYmUgYWRkZWQ6CisgKiAgZGVzaXJlZCBjbG9jayByYXRlCisgKiAgZGlnaXRhbCBmaWx0ZXIgZnJlcXVlbmN5IHNhbXBsaW5nIHJhdGUKKyAqCisgKiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgSTJDIHVuaXQgY2FuIGJlIHVzZWQuCisgKi8KK2V4dGVybiBJMkNfU3RhdHVzIEkyQ19Jbml0aWFsaXplKAorCXVuc2lnbmVkIGNoYXIgYWRkciwgICAgICAgICAgICAvKiBkcml2ZXIncyBJMkMgc2xhdmUgYWRkcmVzcyAqLworCUkyQ19JTlRFUlJVUFRfTU9ERSBlbl9pbnQsICAgICAvKiAxIC0gZW5hYmxlIEkyQyBpbnRlcnJ1cHQKKwkJCQkJKiAwIC0gZGlzYWJsZSBJMkMgaW50ZXJydXB0CisJCQkJCSovCisJaW50ICgqYXBwX3ByaW50X2Z1bmN0aW9uKShjaGFyICosLi4uKSk7IC8qIHBvaW50ZXIgdG8gb3B0aW9uYWwgInByaW50ZiIKKwkJCQkJCSAqIHByb3ZpZGVkIGJ5IGFwcGxpY2F0aW9uCisJCQkJCQkgKi8KKworLyogUGVyZm9ybSB0aGUgZ2l2ZW4gSTJDIHRyYW5zYWN0aW9uLCBvbmx5IE1BU1RFUl9YTUlUIGFuZCBNQVNURVJfUkNWCisgKiBhcmUgaW1wbGVtZW50ZWQuICBCb3RoIGFyZSBvbmx5IGluIHBvbGxpbmcgbW9kZS4KKyAqCisgKiBlbl9pbnQgY29udHJvbHMgaW50ZXJydXB0L3BvbGxpbmcgbW9kZQorICogYWN0IGlzIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uCisgKiBhZGRyIGlzIHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgc2xhdmUgZGV2aWNlCisgKiBsZW4gaXMgdGhlIGxlbmd0aCBvZiBkYXRhIHRvIHNlbmQgb3IgcmVjZWl2ZQorICogYnVmZmVyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIGJ1ZmZlcgorICogc3RvcCA9IEkyQ19OT19TVE9QLCBkb24ndCBzaWduYWwgU1RPUCBhdCBlbmQgb2YgdHJhbnNhY3Rpb24KKyAqICAgICAgICBJMkNfU1RPUCwgc2lnbmFsIFNUT1AgYXQgZW5kIG9mIHRyYW5zYWN0aW9uCisgKiByZXRyeSBpcyB0aGUgdGltZW91dCByZXRyeSB2YWx1ZSwgY3VycmVudGx5IGlnbm9yZWQKKyAqIHJzdGEgPSBJMkNfTk9fUkVTVEFSVCwgdGhpcyBpcyBub3QgY29udGludWF0aW9uIG9mIGV4aXN0aW5nIHRyYW5zYWN0aW9uCisgKiAgICAgICAgSTJDX1JFU1RBUlQsIHRoaXMgaXMgYSBjb250aW51YXRpb24gb2YgZXhpc3RpbmcgdHJhbnNhY3Rpb24KKyAqLworZXh0ZXJuIEkyQ19TdGF0dXMgSTJDX2RvX3RyYW5zYWN0aW9uKCBJMkNfSU5URVJSVVBUX01PREUgZW5faW50LAorCQkJCSAgICAgIEkyQ19UUkFOU0FDVElPTl9NT0RFIGFjdCwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyIGkyY19hZGRyLAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgZGF0YV9hZGRyLAorCQkJCSAgICAgIGludCBsZW4sCisJCQkJICAgICAgY2hhciAqYnVmZmVyLAorCQkJCSAgICAgIEkyQ19TVE9QX01PREUgc3RvcCwKKwkJCQkgICAgICBpbnQgcmV0cnksCisJCQkJICAgICAgSTJDX1JFU1RBUlRfTU9ERSByc3RhKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L2ludGVycnVwdHMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5YzUyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICogUm9iIFRheWxvciwgRmx5aW5nIFBpZyBTeXN0ZW1zLiByb2J0QGZseWluZ3BpZy5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODI0eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcGNpX2lvLmg+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNpbmNsdWRlICJkcml2ZXJzL2VwaWMuaCIKKworaW50IGludGVycnVwdF9pbml0X2NwdSAodW5zaWduZWQgKmRlY3JlbWVudGVyX2NvdW50KQoreworCSpkZWNyZW1lbnRlcl9jb3VudCA9IChnZXRfYnVzX2ZyZXEgKDApIC8gNCkgLyBDT05GSUdfU1lTX0haOworCisJLyoKKwkgKiBJdCdzIGFsbCBicm9rZW4gYXQgdGhlIG1vbWVudCBhbmQgSSBjdXJyZW50bHkgZG9uJ3QgbmVlZAorCSAqIGludGVycnVwdHMuIElmIHlvdSB3YW50IHRvIGZpeCBpdCwgaGF2ZSBhIGxvb2sgYXQgdGhlIGVwaWMKKwkgKiBkcml2ZXJzIGluIGRpbmszMiB2MTIuIFRoZXkgZG8gZXZlcnRoaW5nIGFuZCBNb3Rvcm9sYSBzYWlkCisJICogSSBjb3VsZCB1c2UgdGhlIGRpbmsgc291cmNlIGluIHRoaXMgcHJvamVjdCBhcyBsb25nIGFzCisJICogY29weXJpZ2h0IG5vdGljZXMgcmVtYWluIGludGFjdC4KKwkgKi8KKworCWVwaWNJbml0IChFUElDX0RJUkVDVF9JUlEsIDApOworCS8qIEVQSUMgd29uJ3QgZ2VuZXJhdGUgSU5UIHVubGVzcyBDdXJyZW50IFRhc2sgUHJpIDwgMTUgKi8KKwllcGljQ3VyVGFza1ByaW9TZXQoMCk7CisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhhbmRsZSBleHRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgZXh0ZXJuYWxfaW50ZXJydXB0IChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRlbXA7CisKKwlwY2lfcmVhZGwgKENPTkZJR19TWVNfRVVNQl9BRERSICsgRVBJQ19QUk9DX0lOVF9BQ0tfUkVHLCB0ZW1wKTsKKwlzeW5jICgpOwkJCQkJLyogaSdtIG5vdCBjb252aW5jZWQgdGhpcyBpcyBuZWVkZWQsIGJ1dCBkaW5rIHNvdXJjZSBoYXMgaXQgKi8KKwl0ZW1wICY9IDB4ZmY7CQkJCS8qZ2V0IHZlY3RvciAqLworCisJLypUT0RPOiBoYW5kbGUgdGhlbSAtLi4uICovCisJZXBpY0VPSSAoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBibGFuayBpbnQgaGFuZGxlcnMuCisgKi8KKwordm9pZAoraXJxX2luc3RhbGxfaGFuZGxlciAoaW50IHZlYywgaW50ZXJydXB0X2hhbmRsZXJfdCAqIGhhbmRsZXIsIHZvaWQgKmFyZykKK3sKK30KKwordm9pZCBpcnFfZnJlZV9oYW5kbGVyIChpbnQgdmVjKQoreworCit9CisKKy8qVE9ETzogc29tZSBoYW5kbGVycyBmb3Igd2luYm9uZCBhbmQgODczMDggaW50ZXJydXB0cworIGFuZCB3aGF0IGFib3V0IGdlbmVyaWMgcGNpIGludGVlcnVwdHM/CisgdmdhPworICovCisKK3ZvaWQgdGltZXJfaW50ZXJydXB0X2NwdSAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogbm90aGluZyB0byBkbyBoZXJlICovCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L3BjaS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYWFlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvcGNpLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIGFyY2gvcG93ZXJwYy9rZXJuZWwvbXBjMTB4X2NvbW1vbi5jCisgKgorICogQ29tbW9uIHJvdXRpbmVzIGZvciB0aGUgTW90b3JvbGEgU1BTIE1QQzEwNiwgTVBDMTA3IGFuZCBNUEM4MjQwIEhvc3QgYnJpZGdlLAorICogTWVtIGN0bHIsIEVQSUMsIGV0Yy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIKKyAqICAgICAgICAgbWdyZWVyQG12aXN0YS5jb20KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19QQ0kKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxtcGM4MjR4Lmg+CisKK3ZvaWQgcGNpX21wYzgyNHhfaW5pdCAoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCS8qIFN5c3RlbSBtZW1vcnkgc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJICAgICAgIENIUlBfUENJX01FTU9SWV9CVVMsCisJCSAgICAgICBDSFJQX1BDSV9NRU1PUllfUEhZUywKKwkJICAgICAgIENIUlBfUENJX01FTU9SWV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX1NZU19NRU1PUlkpOworCisJLyogUENJIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkgICAgICAgQ0hSUF9QQ0lfTUVNX0JVUywKKwkJICAgICAgIENIUlBfUENJX01FTV9QSFlTLAorCQkgICAgICAgQ0hSUF9QQ0lfTUVNX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkvKiBJU0EvUENJIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkgICAgICAgQ0hSUF9JU0FfTUVNX0JVUywKKwkJICAgICAgIENIUlBfSVNBX01FTV9QSFlTLAorCQkgICAgICAgQ0hSUF9JU0FfTUVNX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CisKKwkvKiBQQ0kgSS9PIHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDMsCisJCSAgICAgICBDSFJQX1BDSV9JT19CVVMsCisJCSAgICAgICBDSFJQX1BDSV9JT19QSFlTLAorCQkgICAgICAgQ0hSUF9QQ0lfSU9fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJLyogSVNBL1BDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgNCwKKwkJICAgICAgIENIUlBfSVNBX0lPX0JVUywKKwkJICAgICAgIENIUlBfSVNBX0lPX1BIWVMsCisJCSAgICAgICBDSFJQX0lTQV9JT19TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwlob3NlLT5yZWdpb25fY291bnQgPSA1OworCisJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsCisJCQkgICBDSFJQX1JFR19BRERSLAorCQkJICAgQ0hSUF9SRUdfREFUQSk7CisKKwlwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKKworCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKGhvc2UpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9zcGVlZC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L3NwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjYjk3MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9zcGVlZC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR3JlZ29yeSBFLiBBbGxlbiwgZ2FsbGVuQGFybHV0LnV0ZXhhcy5lZHUKKyAqIEFwcGxpZWQgUmVzZWFyY2ggTGFib3JhdG9yaWVzLCBUaGUgVW5pdmVyc2l0eSBvZiBUZXhhcyBhdCBBdXN0aW4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODI0eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIE5PVEU6IFRoaXMgZGVzY3JpYmVzIHRoZSBwcm9wZXIgdXNlIG9mIHRoaXMgZmlsZS4KKyAqCisgKiBDT05GSUdfU1lTX0NMS19GUkVRIHNob3VsZCBiZSBkZWZpbmVkIGFzIHRoZSBpbnB1dCBmcmVxdWVuY3kgb24KKyAqIFBDSV9TWU5DX0lOIC4KKyAqCisgKiBDT05GSUdfUExMX1BDSV9UT19NRU1fTVVMVElQTElFUiBpcyBvbmx5IHJlcXVpcmVkIG9uIE1QQzgyNDAKKyAqIGJvYXJkcy4gSXQgc2hvdWxkIGJlIGRlZmluZWQgYXMgdGhlIFBDSSB0byBNZW1vcnkgTXVsdGlwbGllciBhcworICogZG9jdW1lbnRlZCBpbiB0aGUgTVBDODI0MCBIYXJkd2FyZSBTcGVjcy4KKyAqCisgKiBPdGhlciBtcGM4MjR4IGJvYXJkcyBkb24ndCBuZWVkIENPTkZJR19QTExfUENJX1RPX01FTV9NVUxUSVBMSUVSCisgKiBiZWNhdXNlIHRoZXkgY2FuIGRldGVybWluZSBpdCBmcm9tIHRoZSBQQ1IuCisgKgorICogR2FyeSBNaWxsaW9ybiA8Z2FyeS5taWxsaW9ybkBtb3Rvcm9sYS5jb20+ICh3aG8gc2hvdWxkIGtub3cgc2luY2UKKyAqIGhlIGRlc2lnbmVkIHRoZSBTYW5kcG9pbnQpIHRvbGQgdXMgdGhhdCB0aGUgUENSIGlzIG5vdCBpbiBhbGwgcmV2cworICogb2YgdGhlIE1QQzgyNDAgQ1BVLCBzbyBpdCdzIG5vdCBndWFyYW50ZWVhYmxlIGFuZCB3ZSBjYW5ub3QgZG8KKyAqIGF3YXkgd2l0aCBDT05GSUdfUExMX1BDSV9UT19NRU1fTVVMVElQTElFUiBhbHRvZ2V0aGVyLgorICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoaXMgZ2l2ZXMgdGhlIFBDSSB0byBNZW1vcnkgbXVsdGlwbGllciB0aW1lcyAxMCAqLworLyogVGhlIGluZGV4IGlzIHRoZSB2YWx1ZSBvZiBQTExfQ0ZHWzA6NF0gKi8KKy8qIFRoaXMgaXMgZG9jdW1lbnRlZCBpbiB0aGUgTVBDODI0MC81IEhhcmR3YXJlIFNwZWNzICovCisKK3Nob3J0IHBsbF9wY2lfdG9fbWVtX211bHRpcGxpZXJbXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MjQwKQorCTMwLCAzMCwgMTAsIDEwLCAyMCwgMTAsICAwLCAxMCwKKwkxMCwgIDAsIDIwLCAgMCwgMjAsICAwLCAyMCwgIDAsCisJMzAsICAwLCAxNSwgIDAsIDIwLCAgMCwgMjAsICAwLAorCTI1LCAgMCwgMTAsICAwLCAxNSwgMTUsICAwLCAgMCwKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgyNDUpCisJMzAsIDMwLCAxMCwgMTAsIDIwLCAxMCwgMTAsIDEwLAorCTEwLCAyMCwgMjAsIDE1LCAyMCwgMTUsIDIwLCAzMCwKKwkzMCwgNDAsIDE1LCA0MCwgMjAsIDI1LCAyMCwgNDAsCisJMjUsIDIwLCAxMCwgMjAsIDE1LCAxNSwgMTUsICAwLAorI2Vsc2UKKyNlcnJvciBTcGVjaWZpYyB0eXBlIG9mIE1QQzgyNHggbXVzdCBiZSBkZWZpbmVkIChpLmUuIENPTkZJR19NUEM4MjQwKQorI2VuZGlmCit9OworCisjZGVmaW5lIENVODI0X1BMTF9TVEFURV9SRUcJMHhGRTgwMDAyRgorI2RlZmluZSBQQ1IJCQkweDgwMDAwMEUyCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogY29tcHV0ZSB0aGUgbWVtb3J5IGJ1cyBjbG9jayBmcmVxdWVuY3kgKi8KK3Vsb25nIGdldF9idXNfZnJlcSAodWxvbmcgZHVtbXkpCit7CisJdW5zaWduZWQgY2hhciBwbGxfY2ZnOworI2lmIGRlZmluZWQoQ09ORklHX01QQzgyNDApICYmICFkZWZpbmVkKENPTkZJR19DVTgyNCkKKwlyZXR1cm4gKENPTkZJR19TWVNfQ0xLX0ZSRVEpICogKENPTkZJR19QTExfUENJX1RPX01FTV9NVUxUSVBMSUVSKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NVODI0KQorCXBsbF9jZmcgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKENVODI0X1BMTF9TVEFURV9SRUcpOworCXBsbF9jZmcgJj0gMHgxZjsKKyNlbHNlCisJQ09ORklHX1JFQURfQllURShQQ1IsIHBsbF9jZmcpOworCXBsbF9jZmcgPSAocGxsX2NmZyA+PiAzKSAmIDB4MWY7CisjZW5kaWYKKwlyZXR1cm4gKChDT05GSUdfU1lTX0NMS19GUkVRKSAqIHBsbF9wY2lfdG9fbWVtX211bHRpcGxpZXJbcGxsX2NmZ10gKyA1KSAvIDEwOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBnaXZlcyB0aGUgTWVtb3J5IHRvIENQVSBDb3JlIG11bHRpcGxpZXIgdGltZXMgMTAgKi8KKy8qIFRoZSBpbmRleCBpcyB0aGUgdmFsdWUgb2YgUExMUkFUSU8gaW4gSElEMSAqLworLyogVGhpcyBpcyBkb2N1bWVudGVkIGluIHRoZSBNUEM4MjQwIEhhcmR3YXJlIFNwZWNzICovCisvKiBUaGlzIGlzIG5vdCBkb2N1bWVudGVkIGZvciBNUEM4MjQ1ID8gRklYTUUgKi8KK3Nob3J0IHBsbHJhdGlvX3RvX2ZhY3RvcltdID0geworICAgICAwLCAgMCwgIDAsIDEwLCAyMCwgMjAsIDI1LCA0NSwKKyAgICAzMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgMTAsICAwLCAgMCwgIDAsIDQ1LAorICAgIDMwLCAgMCwgNDAsICAwLCAgMCwgIDAsIDM1LCAgMCwKK307CisKKy8qIGNvbXB1dGUgdGhlIENQVSBhbmQgbWVtb3J5IGJ1cyBjbG9jayBmcmVxdWVuY2llcyAqLworaW50IGdldF9jbG9ja3MgKHZvaWQpCit7CisJdWludCBoaWQxID0gbWZzcHIoSElEMSk7CisJaGlkMSA9IChoaWQxID4+ICgzMi01KSkgJiAweDFmOworCWdkLT5jcHVfY2xrID0gKHBsbHJhdGlvX3RvX2ZhY3RvcltoaWQxXSAqIGdldF9idXNfZnJlcSgwKSArIDUpCisJCQkgIC8gMTA7CisJZ2QtPmJ1c19jbGsgPSBnZXRfYnVzX2ZyZXEoMCk7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9zdGFydC5TIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmNTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC9zdGFydC5TCkBAIC0wLDAgKzEsNzY2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5OAlEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0PgorICogIENvcHlyaWdodCAoQykgMTk5OQlNYWdudXMgRGFtbSA8a2llcmF5cGMwMS5wLnkua2llLmVyYS5lcmljc3Nvbi5zZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSwyMDAyIFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogVS1Cb290IC0gU3RhcnR1cCBDb2RlIGZvciBQb3dlclBDIGJhc2VkIEVtYmVkZGVkIEJvYXJkcworICoKKyAqCisgKiBUaGUgcHJvY2Vzc29yIHN0YXJ0cyBhdCAweDAwMDAwMTAwIGFuZCB0aGUgY29kZSBpcyBleGVjdXRlZAorICogZnJvbSBmbGFzaC4gVGhlIGNvZGUgaXMgb3JnYW5pemVkIHRvIGJlIGF0IGFuIG90aGVyIGFkZHJlc3MKKyAqIGluIG1lbW9yeSwgYnV0IGFzIGxvbmcgd2UgZG9uJ3QganVtcCBhcm91bmQgYmVmb3JlIHJlbG9jYXRpbmcuCisgKiBib2FyZF9pbml0IGxpZXMgYXQgYSBxdWl0ZSBoaWdoIGFkZHJlc3MgYW5kIHdoZW4gdGhlIGNwdSBoYXMKKyAqIGp1bXBlZCB0aGVyZSwgZXZlcnl0aGluZyBpcyBvay4KKyAqIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgY3B1IGdpdmVzIHRoZSBGTEFTSCAoQ1MwKSB0aGUgd2hvbGUKKyAqIGFkZHJlc3Mgc3BhY2UgYXQgc3RhcnR1cCwgYW5kIGJvYXJkX2luaXQgbGllcyBhcyBhIGVjaG8gb2YKKyAqIHRoZSBmbGFzaCBzb21ld2hlcmUgdXAgdGhlcmUgaW4gdGhlIG1lbW9yeW1hcC4KKyAqCisgKiBib2FyZF9pbml0IHdpbGwgY2hhbmdlIENTMCB0byBiZSBwb3NpdGlvbmVkIGF0IHRoZSBjb3JyZWN0CisgKiBhZGRyZXNzIGFuZCAocylkcmFtIHdpbGwgYmUgcG9zaXRpb25lZCBhdCBhZGRyZXNzIDAKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzgyNHguaD4KKyNpbmNsdWRlIDx0aW1lc3RhbXAuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19IIDEJLyogYXZvaWQgcmVhZGluZyBMaW51eCBhdXRvY29uZi5oIGZpbGUJKi8KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisjaWZuZGVmIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUgQ09ORklHX0lERU5UX1NUUklORyAiIgorI2VuZGlmCisKKy8qIFdlIGRvbid0IHdhbnQgdGhlIE1NVSB5ZXQuCisqLworI3VuZGVmCU1TUl9LRVJORUwKKy8qIEZQLCBNYWNoaW5lIENoZWNrIGFuZCBSZWNvdmVyYWJsZSBJbnRlcnIuICovCisjZGVmaW5lIE1TUl9LRVJORUwgKCBNU1JfRlAgfCBNU1JfTUUgfCBNU1JfUkkgKQorCisvKgorICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQorICoKKyAqIFVzZSByMTIgdG8gYWNjZXNzIHRoZSBHT1QKKyAqLworCVNUQVJUX0dPVAorCUdPVF9FTlRSWShfR09UMl9UQUJMRV8pCisJR09UX0VOVFJZKF9GSVhVUF9UQUJMRV8pCisKKwlHT1RfRU5UUlkoX3N0YXJ0KQorCUdPVF9FTlRSWShfc3RhcnRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkoX2VuZF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWSh0cmFuc2Zlcl90b19oYW5kbGVyKQorCisJR09UX0VOVFJZKF9faW5pdF9lbmQpCisJR09UX0VOVFJZKF9lbmQpCisJR09UX0VOVFJZKF9fYnNzX3N0YXJ0KQorI2lmIGRlZmluZWQoQ09ORklHX0ZBRFMpCisJR09UX0VOVFJZKGVudmlyb25tZW50KQorI2VuZGlmCisJRU5EX0dPVAorCisvKgorICogcjMgLSAxc3QgYXJnIHRvIGJvYXJkX2luaXQoKTogSU1NUCBwb2ludGVyCisgKiByNCAtIDJuZCBhcmcgdG8gYm9hcmRfaW5pdCgpOiBib290IGZsYWcKKyAqLworCS50ZXh0CisJLmxvbmcJMHgyNzA1MTk1NgkJLyogVS1Cb290IE1hZ2ljIE51bWJlcgkJCSovCisJLmdsb2JsCXZlcnNpb25fc3RyaW5nCit2ZXJzaW9uX3N0cmluZzoKKwkuYXNjaWkgVV9CT09UX1ZFUlNJT04KKwkuYXNjaWkgIiAoIiwgVV9CT09UX0RBVEUsICIgLSAiLCBVX0JPT1RfVElNRSwgIikiCisJLmFzY2lpIENPTkZJR19JREVOVF9TVFJJTkcsICJcMCIKKworCS4gPSBFWENfT0ZGX1NZU19SRVNFVAorCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKwlsaQlyMjEsIEJPT1RGTEFHX0NPTEQJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKwliCWJvb3RfY29sZAorCisJLiA9IEVYQ19PRkZfU1lTX1JFU0VUICsgMHgxMAorCisJLmdsb2JsCV9zdGFydF93YXJtCitfc3RhcnRfd2FybToKKwlsaQlyMjEsIEJPT1RGTEFHX1dBUk0JLyogU29mdHdhcmUgcmVib290CQkJKi8KKwliCWJvb3Rfd2FybQorCitib290X2NvbGQ6Citib290X3dhcm06CisKKwkvKiBJbml0aWFsaXplIG1hY2hpbmUgc3RhdHVzOyBlbmFibGUgbWFjaGluZSBjaGVjayBpbnRlcnJ1cHQJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsaQlyMywgTVNSX0tFUk5FTAkJLyogU2V0IEZQLCBNRSwgUkkgZmxhZ3MgKi8KKwltdG1zcglyMworCW10c3ByCVNSUjEsIHIzCQkvKiBNYWtlIFNSUjEgbWF0Y2ggTVNSICovCisKKwlhZGRpcwlyMCwwLDB4MDAwMAkJLyogbGV0cyBtYWtlIHN1cmUgdGhhdCByMCBpcyByZWFsbHkgMCAqLworCW10c3ByICAgSElEMCwgcjAJCS8qIGRpc2FibGUgSSBhbmQgRCBjYWNoZXMgKi8KKworCW1mc3ByCXIzLCBJQ1IJCQkvKiBjbGVhciBJbnRlcnJ1cHQgQ2F1c2UgUmVnaXN0ZXIgKi8KKworCW1mbXNyCXIzCQkJLyogdHVybiBvZmYgYWRkcmVzcyB0cmFuc2xhdGlvbiAqLworCWFkZGlzCXI0LDAsMHhmZmZmCisJb3JpCXI0LHI0LDB4ZmZjZgorCWFuZAlyMyxyMyxyNAorCW10bXNyCXIzCisJaXN5bmMKKwlzeW5jCQkJCS8qIHRoZSBNTVUgc2hvdWxkIGJlIG9mZi4uLiAqLworCisKK2luX2ZsYXNoOgorI2lmIGRlZmluZWQoQ09ORklHX0JNVykKKwlibCBlYXJseV9pbml0X2YgLyogTXVzdCBiZSBBU006IG5vIHN0YWNrIHlldCEgKi8KKyNlbmRpZgorCS8qCisJICogU2V0dXAgQkFUcyAtIGNhbm5vdCBiZSBkb25lIGluIEMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHN0YWNrIHlldAorCSAqLworCWJsCXNldHVwX2JhdHMKKworCS8qIEVuYWJsZSBNTVUuCisJICovCisJbWZtc3IJcjMKKwlvcmkJcjMsIHIzLCAoTVNSX0lSIHwgTVNSX0RSKQorCW10bXNyCXIzCisjaWYgIWRlZmluZWQoQ09ORklHX0JNVykKKwkvKiBFbmFibGUgYW5kIGludmFsaWRhdGUgZGF0YSBjYWNoZS4KKwkgKi8KKwltZnNwcglyMywgSElEMAorCW1yCXIyLCByMworCW9yaQlyMywgcjMsIEhJRDBfRENFIHwgSElEMF9EQ0kKKwlvcmkJcjIsIHIyLCBISUQwX0RDRQorCXN5bmMKKwltdHNwcglISUQwLCByMworCW10c3ByCUhJRDAsIHIyCisJc3luYworCisJLyogQWxsb2NhdGUgSW5pdGlhbCBSQU0gaW4gZGF0YSBjYWNoZS4KKwkgKi8KKwlsaXMJcjMsIENPTkZJR19TWVNfSU5JVF9SQU1fQUREUkBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19JTklUX1JBTV9BRERSQGwKKwlsaQlyMiwgMTI4CisJbXRjdHIJcjIKKzE6CisJZGNieglyMCwgcjMKKwlhZGRpCXIzLCByMywgMzIKKwliZG56CTFiCisKKwkvKiBMb2NrIHdheTAgaW4gZGF0YSBjYWNoZS4KKwkgKi8KKwltZnNwcglyMywgMTAxMQorCWxpcwlyMiwgMHhmZmZmCisJb3JpCXIyLCByMiwgMHhmZjFmCisJYW5kCXIzLCByMywgcjIKKwlvcmkJcjMsIHIzLCAweDAwODAKKwlzeW5jCisJbXRzcHIJMTAxMSwgcjMKKyNlbmRpZiAvKiAhQ09ORklHX0JNVyAqLworCS8qCisJICogVGhpc2sgdGhlIHN0YWNrIHBvaW50ZXIgKnNvbWV3aGVyZSogc2Vuc2libGUuIERvZXNudAorCSAqIG1hdHRlciBtdWNoIHdoZXJlIGFzIHdlJ2xsIG1vdmUgaXQgd2hlbiB3ZSByZWxvY2F0ZQorCSAqLworCWxpcwlyMSwgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfR0JMX0RBVEFfT0ZGU0VUKUBoCisJb3JpCXIxLCByMSwgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfR0JMX0RBVEFfT0ZGU0VUKUBsCisKKwlsaQlyMCwgMAkJCS8qIE1ha2Ugcm9vbSBmb3Igc3RhY2sgZnJhbWUgaGVhZGVyIGFuZAkqLworCXN0d3UJcjAsIC00KHIxKQkJLyogY2xlYXIgZmluYWwgc3RhY2sgZnJhbWUgc28gdGhhdAkqLworCXN0d3UJcjAsIC00KHIxKQkJLyogc3RhY2sgYmFja3RyYWNlcyB0ZXJtaW5hdGUgY2xlYW5seQkqLworCisJLyogbGV0IHRoZSBDLWNvZGUgc2V0IHVwIHRoZSByZXN0CQkJCQkqLworCS8qCQkJCQkJCQkJKi8KKwkvKiBCZSBjYXJlZnVsIHRvIGtlZXAgY29kZSByZWxvY2F0YWJsZSAhCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCUdFVF9HT1QJCQkvKiBpbml0aWFsaXplIEdPVCBhY2Nlc3MJCQkqLworCisJLyogcjM6IElNTVIgKi8KKwlibAljcHVfaW5pdF9mCS8qIHJ1biBsb3ctbGV2ZWwgQ1BVIGluaXQgY29kZSAgICAgKGZyb20gRmxhc2gpCSovCisKKwltcglyMywgcjIxCisJLyogcjM6IEJPT1RGTEFHICovCisJYmwJYm9hcmRfaW5pdF9mCS8qIHJ1biAxc3QgcGFydCBvZiBib2FyZCBpbml0IGNvZGUgKGZyb20gRmxhc2gpICovCisKKworCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycworX3N0YXJ0X29mX3ZlY3RvcnM6CisKKy8qIE1hY2hpbmUgY2hlY2sgKi8KKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfTUFDSF9DSENLLCBNYWNoaW5lQ2hlY2ssIE1hY2hpbmVDaGVja0V4Y2VwdGlvbikKKworLyogRGF0YSBTdG9yYWdlIGV4Y2VwdGlvbi4gICJOZXZlciIgZ2VuZXJhdGVkIG9uIHRoZSA4NjAuICovCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0RBVEFfU1RPUiwgRGF0YVN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEluc3RydWN0aW9uIFN0b3JhZ2UgZXhjZXB0aW9uLiAgIk5ldmVyIiBnZW5lcmF0ZWQgb24gdGhlIDg2MC4gKi8KKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfSU5TX1NUT1IsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oRVhDX09GRl9FWFRFUk5BTCwgRXh0SW50ZXJydXB0LCBleHRlcm5hbF9pbnRlcnJ1cHQpCisKKy8qIEFsaWdubWVudCBleGNlcHRpb24uICovCisJLiA9IEVYQ19PRkZfQUxJR04KK0FsaWdubWVudDoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJbWZzcHIJcjQsREFSCisJc3R3CXI0LF9EQVIocjIxKQorCW1mc3ByCXI1LERTSVNSCisJc3R3CXI1LF9EU0lTUihyMjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKEFsaWdubWVudCwgQWxpZ25tZW50RXhjZXB0aW9uLCBNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLworCS4gPSBFWENfT0ZGX1BST0dSQU0KK1Byb2dyYW1DaGVjazoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKFByb2dyYW1DaGVjaywgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uLAorCQlNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisJLyogTm8gRlBVIG9uIE1QQzh4eC4gVGhpcyBleGNlcHRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KKwkqLworCVNURF9FWENFUFRJT04oRVhDX09GRl9GUFVOQVZBSUwsIEZQVW5hdmFpbGFibGUsIFVua25vd25FeGNlcHRpb24pCisKKwkvKiBJIGd1ZXNzIHdlIGNvdWxkIGltcGxlbWVudCBkZWNyZW1lbnRlciwgYW5kIG1heSBoYXZlCisJICogdG8gc29tZWRheSBmb3IgdGltZWtlZXBpbmcuCisJICovCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0RFQ1IsIERlY3JlbWVudGVyLCB0aW1lcl9pbnRlcnJ1cHQpCisJU1REX0VYQ0VQVElPTigweGEwMCwgVHJhcF8wYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4YjAwLCBUcmFwXzBiLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhjMDAsIFN5c3RlbUNhbGwsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfVFJBQ0UsIFNpbmdsZVN0ZXAsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfRlBVTkFTU0lTVCwgVHJhcF8wZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfUE1JLCBUcmFwXzBmLCBVbmtub3duRXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0lUTUUsIEluc3RydWN0aW9uVHJhbnNNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oRVhDX09GRl9ETFRNRSwgRGF0YUxvYWRUcmFuc01pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0RTVE1FLCBEYXRhU3RvcmVUcmFuc01pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX0lBQkUsIEluc3RydWN0aW9uQnJlYWtwb2ludCwgRGVidWdFeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTihFWENfT0ZGX1NNSUUsIFN5c01hbmFnZUludCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTUwMCwgUmVzZXJ2ZWQ1LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxNjAwLCBSZXNlcnZlZDYsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE3MDAsIFJlc2VydmVkNywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTgwMCwgUmVzZXJ2ZWQ4LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxOTAwLCBSZXNlcnZlZDksIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFhMDAsIFJlc2VydmVkQSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWIwMCwgUmVzZXJ2ZWRCLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxYzAwLCBSZXNlcnZlZEMsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFkMDAsIFJlc2VydmVkRCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWUwMCwgUmVzZXJ2ZWRFLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxZjAwLCBSZXNlcnZlZEYsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKEVYQ19PRkZfUk1URSwgUnVuTW9kZVRyYWNlLCBVbmtub3duRXhjZXB0aW9uKQorCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisKKwkuID0gMHgzMDAwCisKKy8qCisgKiBUaGlzIGNvZGUgZmluaXNoZXMgc2F2aW5nIHRoZSByZWdpc3RlcnMgdG8gdGhlIGV4Y2VwdGlvbiBmcmFtZQorICogYW5kIGp1bXBzIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyIGZvciB0aGUgZXhjZXB0aW9uLgorICogUmVnaXN0ZXIgcjIxIGlzIHBvaW50ZXIgaW50byB0cmFwIGZyYW1lLCByMSBoYXMgbmV3IHN0YWNrIHBvaW50ZXIuCisgKi8KKwkuZ2xvYmwJdHJhbnNmZXJfdG9faGFuZGxlcgordHJhbnNmZXJfdG9faGFuZGxlcjoKKwlzdHcJcjIyLF9OSVAocjIxKQorCWxpcwlyMjIsTVNSX1BPV0BoCisJYW5kYwlyMjMscjIzLHIyMgorCXN0dwlyMjMsX01TUihyMjEpCisJU0FWRV9HUFIoNywgcjIxKQorCVNBVkVfNEdQUlMoOCwgcjIxKQorCVNBVkVfOEdQUlMoMTIsIHIyMSkKKwlTQVZFXzhHUFJTKDI0LCByMjEpCisjaWYgMAorCWFuZGkuCXIyMyxyMjMsTVNSX1BSCisJbWZzcHIJcjIzLFNQUkczCQkvKiBpZiBmcm9tIHVzZXIsIGZpeCB1cCB0c3MucmVncyAqLworCWJlcQkyZgorCWFkZGkJcjI0LHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJc3R3CXIyNCxQVF9SRUdTKHIyMykKKzI6CWFkZGkJcjIscjIzLC1UU1MJCS8qIHNldCByMiB0byBjdXJyZW50ICovCisJdG92aXJ0KHIyLHIyLHIyMykKKyNlbmRpZgorCW1mbHIJcjIzCisJYW5kaS4JcjI0LHIyMywweDNmMDAJCS8qIGdldCB2ZWN0b3Igb2Zmc2V0ICovCisJc3R3CXIyNCxUUkFQKHIyMSkKKwlsaQlyMjIsMAorCXN0dwlyMjIsUkVTVUxUKHIyMSkKKwltdHNwcglTUFJHMixyMjIJCS8qIHIxIGlzIG5vdyBrZXJuZWwgc3AgKi8KKyNpZiAwCisJYWRkaQlyMjQscjIsVEFTS19TVFJVQ1RfU0laRSAvKiBjaGVjayBmb3Iga2VybmVsIHN0YWNrIG92ZXJmbG93ICovCisJY21wbHcJMCxyMSxyMgorCWNtcGx3CTEscjEscjI0CisJY3JhbmQJMSwxLDQKKwliZ3QJc3RhY2tfb3ZmCQkvKiBpZiByMiA8IHIxIDwgcjIrVEFTS19TVFJVQ1RfU0laRSAqLworI2VuZGlmCisJbHd6CXIyNCwwKHIyMykJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBoYW5kbGVyICovCisJbHd6CXIyMyw0KHIyMykJCS8qIHdoZXJlIHRvIGdvIHdoZW4gZG9uZSAqLworCW10c3ByCVNSUjAscjI0CisJb3JpCXIyMCxyMjAsMHgzMAkJLyogZW5hYmxlIElSLCBEUiAqLworCW10c3ByCVNSUjEscjIwCisJbXRscglyMjMKKwlTWU5DCisJcmZpCQkJCS8qIGp1bXAgdG8gaGFuZGxlciwgZW5hYmxlIE1NVSAqLworCitpbnRfcmV0dXJuOgorCW1mbXNyCXIyOAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbGkJcjQsMAorCW9yaQlyNCxyNCxNU1JfRUUKKwlhbmRjCXIyOCxyMjgscjQKKwlTWU5DCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjI4CisJU1lOQworCWx3eglyMixfQ1RSKHIxKQorCWx3eglyMCxfTElOSyhyMSkKKwltdGN0cglyMgorCW10bHIJcjAKKwlsd3oJcjIsX1hFUihyMSkKKwlsd3oJcjAsX0NDUihyMSkKKwltdHNwcglYRVIscjIKKwltdGNyZgkweEZGLHIwCisJUkVTVF8xMEdQUlMoMywgcjEpCisJUkVTVF8xMEdQUlMoMTMsIHIxKQorCVJFU1RfOEdQUlMoMjMsIHIxKQorCVJFU1RfR1BSKDMxLCByMSkKKwlsd3oJcjIsX05JUChyMSkJLyogUmVzdG9yZSBlbnZpcm9ubWVudCAqLworCWx3eglyMCxfTVNSKHIxKQorCW10c3ByCVNSUjAscjIKKwltdHNwcglTUlIxLHIwCisJbHd6CXIwLEdQUjAocjEpCisJbHd6CXIyLEdQUjIocjEpCisJbHd6CXIxLEdQUjEocjEpCisJU1lOQworCXJmaQorCisvKiBDYWNoZSBmdW5jdGlvbnMuCisqLworCS5nbG9ibAlpY2FjaGVfZW5hYmxlCitpY2FjaGVfZW5hYmxlOgorCW1mc3ByCXI1LEhJRDAJCS8qIHR1cm4gb24gdGhlIEkgY2FjaGUuICovCisJb3JpCXI1LHI1LDB4ODgwMAkvKiBJbnN0cnVjdGlvbiBjYWNoZSBvbmx5ISAqLworCWFkZGlzCXI2LDAsMHhGRkZGCisJb3JpCXI2LHI2LDB4RjdGRgorCWFuZAlyNixyNSxyNgkvKiBjbGVhciB0aGUgaW52YWxpZGF0ZSBiaXQgKi8KKwlzeW5jCisJbXRzcHIJSElEMCxyNQorCW10c3ByCUhJRDAscjYKKwlpc3luYworCXN5bmMKKwlibHIKKworCS5nbG9ibAlpY2FjaGVfZGlzYWJsZQoraWNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjUsSElEMAorCWFkZGlzCXI2LDAsMHhGRkZGCisJb3JpCXI2LHI2LDB4N0ZGRgorCWFuZAlyNSxyNSxyNgorCXN5bmMKKwltdHNwcglISUQwLHI1CisJaXN5bmMKKwlzeW5jCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX3N0YXR1cworaWNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXNyd2kJcjMsIHIzLCAxNQkvKiA+PjE1ICYgMT0+IHNlbGVjdCBiaXQgMTYgKi8KKwlhbmRpLglyMywgcjMsIDEKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZW5hYmxlCitkY2FjaGVfZW5hYmxlOgorCW1mc3ByCXI1LEhJRDAJCS8qIHR1cm4gb24gdGhlIEQgY2FjaGUuICovCisJb3JpCXI1LHI1LDB4NDQwMAkvKiBEYXRhIGNhY2hlIG9ubHkhICovCisJbWZzcHIJcjQsIFBWUgkJLyogcmVhZCBQVlIgKi8KKwlzcmF3aQlyMywgcjQsIDE2CS8qIHNoaWZ0IG9mZiB0aGUgbGVhc3QgMTYgYml0cyAqLworCWNtcGkJMCwgMCwgcjMsIDB4QwkvKiBDaGVjayBmb3IgTWF4IHB2ciAqLworCWJuZQlOb3RNYXgKKwlvcmkJcjUscjUsMHgwMDQwCS8qIHNldHRpbmcgdGhlIERDRkEgYml0LCBmb3IgTWF4IHJldiAxIGVycmF0YSAqLworTm90TWF4OgorCWFkZGlzCXI2LDAsMHhGRkZGCisJb3JpCXI2LHI2LDB4RkJGRgorCWFuZAlyNixyNSxyNgkvKiBjbGVhciB0aGUgaW52YWxpZGF0ZSBiaXQgKi8KKwlzeW5jCisJbXRzcHIJSElEMCxyNQorCW10c3ByCUhJRDAscjYKKwlpc3luYworCXN5bmMKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZGlzYWJsZQorZGNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjUsSElEMAorCWFkZGlzCXI2LDAsMHhGRkZGCisJb3JpCXI2LHI2LDB4QkZGRgorCWFuZAlyNSxyNSxyNgorCXN5bmMKKwltdHNwcglISUQwLHI1CisJaXN5bmMKKwlzeW5jCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX3N0YXR1cworZGNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXNyd2kJcjMsIHIzLCAxNAkvKiA+PjE0ICYgMT0+IHNlbGVjdCBiaXQgMTcgKi8KKwlhbmRpLglyMywgcjMsIDEKKwlibHIKKworCS5nbG9ibAlkY19yZWFkCitkY19yZWFkOgorLypUT0RPIDogd2hvIHVzZXMgdGhpcywgd2hhdCBzaG91bGQgaXQgZG8/CisqLworCWJscgorCisKKwkuZ2xvYmwgZ2V0X3B2cgorZ2V0X3B2cjoKKwltZnNwcglyMywgUFZSCisJYmxyCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogdm9pZCByZWxvY2F0ZV9jb2RlIChhZGRyX3NwLCBnZCwgYWRkcl9tb25pKQorICoKKyAqIFRoaXMgImZ1bmN0aW9uIiBkb2VzIG5vdCByZXR1cm4sIGluc3RlYWQgaXQgY29udGludWVzIGluIFJBTQorICogYWZ0ZXIgcmVsb2NhdGluZyB0aGUgbW9uaXRvciBjb2RlLgorICoKKyAqIHIzID0gZGVzdAorICogcjQgPSBzcmMKKyAqIHI1ID0gbGVuZ3RoIGluIGJ5dGVzCisgKiByNiA9IGNhY2hlbGluZXNpemUKKyAqLworCS5nbG9ibAlyZWxvY2F0ZV9jb2RlCityZWxvY2F0ZV9jb2RlOgorCisJbXIJcjEsICByMwkJLyogU2V0IG5ldyBzdGFjayBwb2ludGVyCQkqLworCW1yCXI5LCAgcjQJCS8qIFNhdmUgY29weSBvZiBHbG9iYWwgRGF0YSBwb2ludGVyCSovCisJbXIJcjEwLCByNQkJLyogU2F2ZSBjb3B5IG9mIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKworCUdFVF9HT1QKKwltcglyMywgIHI1CQkJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKyNpZmRlZiBDT05GSUdfU1lTX1JBTUJPT1QKKwlsaXMJcjQsIENPTkZJR19TWVNfU0RSQU1fQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19TRFJBTV9CQVNFQGwKKyNlbHNlCisJbGlzCXI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorI2VuZGlmCisJbHd6CXI1LCBHT1QoX19pbml0X2VuZCkKKwlzdWIJcjUsIHI1LCByNAorCWxpCXI2LCBDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCQkvKiBDYWNoZSBMaW5lIFNpemUJKi8KKworCS8qCisJICogRml4IEdPVCBwb2ludGVyOgorCSAqCisJICogTmV3IEdPVC1QVFIgPSAob2xkIEdPVC1QVFIgLSBDT05GSUdfU1lTX01PTklUT1JfQkFTRSkgKyBEZXN0aW5hdGlvbiBBZGRyZXNzCisJICoKKwkgKiBPZmZzZXQ6CisJICovCisJc3ViCXIxNSwgcjEwLCByNAorCisJLyogRmlyc3Qgb3VyIG93biBHT1QgKi8KKwlhZGQJcjEyLCByMTIsIHIxNQorCS8qIHRoZSB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLworCWFkZAlyMzAsIHIzMCwgcjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisKKwljbXBsdwljcjEscjMscjQKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJYmVxCWNyMSw0ZgkJLyogSW4gcGxhY2UgY29weSBpcyBub3QgbmVjZXNzYXJ5CSovCisJYmVxCTdmCQkvKiBQcm90ZWN0IGFnYWluc3QgMCBjb3VudAkJKi8KKwltdGN0cglyMAorCWJnZQljcjEsMmYKKworCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisJYgk0ZgorCisyOglzbHdpCXIwLHIwLDIKKwlhZGQJcjgscjQscjAKKwlhZGQJcjcscjMscjAKKzM6CWx3enUJcjAsLTQocjgpCisJc3R3dQlyMCwtNChyNykKKwliZG56CTNiCisKKzQ6CisjaWYgIWRlZmluZWQoQ09ORklHX0JNVykKKy8qIFVubG9jayB0aGUgZGF0YSBjYWNoZSBhbmQgaW52YWxpZGF0ZSBsb2NrZWQgYXJlYSAqLworCXhvcglyMCwgcjAsIHIwCisJbXRzcHIJMTAxMSwgcjAKKwlsaXMJcjQsIENPTkZJR19TWVNfSU5JVF9SQU1fQUREUkBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JTklUX1JBTV9BRERSQGwKKwlsaQlyMCwgMTI4CisJbXRjdHIJcjAKKzQxOgorCWRjYmkJcjAsIHI0CisJYWRkaQlyNCwgcjQsIDMyCisJYmRuegk0MWIKKyNlbmRpZgorCisvKgorICogTm93IGZsdXNoIHRoZSBjYWNoZTogbm90ZSB0aGF0IHdlIG11c3Qgc3RhcnQgZnJvbSBhIGNhY2hlIGFsaWduZWQKKyAqIGFkZHJlc3MuIE90aGVyd2lzZSB3ZSBtaWdodCBtaXNzIG9uZSBjYWNoZSBsaW5lLgorICovCisJY21wd2kJcjYsMAorCWFkZAlyNSxyMyxyNQorCWJlcQk3ZgkJLyogQWx3YXlzIGZsdXNoIHByZWZldGNoIHF1ZXVlIGluIGFueSBjYXNlICovCisJc3ViaQlyMCxyNiwxCisJYW5kYwlyMyxyMyxyMAorCW1yCXI0LHIzCis1OglkY2JzdAkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNWIKKwlzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGRjYnN0IHRvIGNvbXBsZXRlIG9uIGJ1cyAqLworCW1yCXI0LHIzCis2OglpY2JpCTAscjQKKwlhZGQJcjQscjQscjYKKwljbXBsdwlyNCxyNQorCWJsdAk2YgorNzoJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBpY2JpIHRvIGNvbXBsZXRlIG9uIGJ1cwkqLworCWlzeW5jCisKKy8qCisgKiBXZSBhcmUgZG9uZS4gRG8gbm90IHJldHVybiwgaW5zdGVhZCBicmFuY2ggdG8gc2Vjb25kIHBhcnQgb2YgYm9hcmQKKyAqIGluaXRpYWxpemF0aW9uLCBub3cgcnVubmluZyBmcm9tIFJBTS4KKyAqLworCisJYWRkaQlyMCwgcjEwLCBpbl9yYW0gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCW10bHIJcjAKKwlibHIKKworaW5fcmFtOgorCisJLyoKKwkgKiBSZWxvY2F0aW9uIEZ1bmN0aW9uLCByMTIgcG9pbnQgdG8gZ290MisweDgwMDAKKwkgKgorCSAqIEFkanVzdCBnb3QyIHBvaW50ZXJzLCBubyBuZWVkIHRvIGNoZWNrIGZvciAwLCB0aGlzIGNvZGUKKwkgKiBhbHJlYWR5IHB1dHMgYSBmZXcgZW50cmllcyBpbiB0aGUgdGFibGUuCisJICovCisJbGkJcjAsX19nb3QyX2VudHJpZXNAc2VjdG9mZkBsCisJbGEJcjMsR09UKF9HT1QyX1RBQkxFXykKKwlsd3oJcjExLEdPVChfR09UMl9UQUJMRV8pCisJbXRjdHIJcjAKKwlzdWIJcjExLHIzLHIxMQorCWFkZGkJcjMscjMsLTQKKzE6CWx3enUJcjAsNChyMykKKwljbXB3aQlyMCwwCisJYmVxLQkyZgorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjAsMChyMykKKzI6CWJkbnoJMWIKKworCS8qCisJICogTm93IGFkanVzdCB0aGUgZml4dXBzIGFuZCB0aGUgcG9pbnRlcnMgdG8gdGhlIGZpeHVwcworCSAqIGluIGNhc2Ugd2UgbmVlZCB0byBtb3ZlIG91cnNlbHZlcyBhZ2Fpbi4KKwkgKi8KKwlsaQlyMCxfX2ZpeHVwX2VudHJpZXNAc2VjdG9mZkBsCisJbHd6CXIzLEdPVChfRklYVVBfVEFCTEVfKQorCWNtcHdpCXIwLDAKKwltdGN0cglyMAorCWFkZGkJcjMscjMsLTQKKwliZXEJNGYKKzM6CWx3enUJcjQsNChyMykKKwlsd3p1eAlyMCxyNCxyMTEKKwlhZGQJcjAscjAscjExCisJc3R3CXIxMCwwKHIzKQorCXN0dwlyMCwwKHI0KQorCWJkbnoJM2IKKzQ6CitjbGVhcl9ic3M6CisJLyoKKwkgKiBOb3cgY2xlYXIgQlNTIHNlZ21lbnQKKwkgKi8KKwlsd3oJcjMsR09UKF9fYnNzX3N0YXJ0KQorCWx3eglyNCxHT1QoX2VuZCkKKworCWNtcGx3CTAsIHIzLCByNAorCWJlcQk2ZgorCisJbGkJcjAsIDAKKzU6CisJc3R3CXIwLCAwKHIzKQorCWFkZGkJcjMsIHIzLCA0CisJY21wbHcJMCwgcjMsIHI0CisJYmx0CTViCis2OgorCisJbXIJcjMsIHI5CQkvKiBHbG9iYWwgRGF0YSBwb2ludGVyCQkqLworCW1yCXI0LCByMTAJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJCSovCisJYmwJYm9hcmRfaW5pdF9yCisKKwkvKgorCSAqIENvcHkgZXhjZXB0aW9uIHZlY3RvciBjb2RlIHRvIGxvdyBtZW1vcnkKKwkgKgorCSAqIHIzOiBkZXN0X2FkZHIKKwkgKiByNzogc291cmNlIGFkZHJlc3MsIHI4OiBlbmQgYWRkcmVzcywgcjk6IHRhcmdldCBhZGRyZXNzCisJICovCisJLmdsb2JsCXRyYXBfaW5pdAordHJhcF9pbml0OgorCW1mbHIJcjQJCQkvKiBzYXZlIGxpbmsgcmVnaXN0ZXIJCSovCisJR0VUX0dPVAorCWx3eglyNywgR09UKF9zdGFydCkKKwlsd3oJcjgsIEdPVChfZW5kX29mX3ZlY3RvcnMpCisKKwlsaQlyOSwgMHgxMDAJCS8qIHJlc2V0IHZlY3RvciBhbHdheXMgYXQgMHgxMDAgKi8KKworCWNtcGx3CTAsIHI3LCByOAorCWJnZWxyCQkJCS8qIHJldHVybiBpZiByNz49cjggLSBqdXN0IGluIGNhc2UgKi8KKzE6CisJbHd6CXIwLCAwKHI3KQorCXN0dwlyMCwgMChyOSkKKwlhZGRpCXI3LCByNywgNAorCWFkZGkJcjksIHI5LCA0CisJY21wbHcJMCwgcjcsIHI4CisJYm5lCTFiCisKKwkvKgorCSAqIHJlbG9jYXRlIGBoZGxyJyBhbmQgYGludF9yZXR1cm4nIGVudHJpZXMKKwkgKi8KKwlsaQlyNywgLkxfTWFjaGluZUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzI6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yCSovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTJiCisKKwlsaQlyNywgLkxfQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfUHJvZ3JhbUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfRlBVbmF2YWlsYWJsZSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIFN5c3RlbUNhbGwgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMzoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJM2IKKworCWxpCXI3LCAuTF9TaW5nbGVTdGVwIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgX2VuZF9vZl92ZWN0b3JzIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzQ6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yCSovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTRiCisKKwltdGxyCXI0CQkJLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyCSovCisJYmxyCisKKwkvKiBTZXR1cCB0aGUgQkFUIHJlZ2lzdGVycy4KKwkgKi8KK3NldHVwX2JhdHM6CisJbGlzCXI0LCBDT05GSUdfU1lTX0lCQVQwTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JQkFUMExAbAorCWxpcwlyMywgQ09ORklHX1NZU19JQkFUMFVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSUJBVDBVQGwKKwltdHNwcglJQkFUMEwsIHI0CisJbXRzcHIJSUJBVDBVLCByMworCWlzeW5jCisKKwlsaXMJcjQsIENPTkZJR19TWVNfREJBVDBMQGgKKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX0RCQVQwTEBsCisJbGlzCXIzLCBDT05GSUdfU1lTX0RCQVQwVUBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19EQkFUMFVAbAorCW10c3ByCURCQVQwTCwgcjQKKwltdHNwcglEQkFUMFUsIHIzCisJaXN5bmMKKworCWxpcwlyNCwgQ09ORklHX1NZU19JQkFUMUxAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfSUJBVDFMQGwKKwlsaXMJcjMsIENPTkZJR19TWVNfSUJBVDFVQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0lCQVQxVUBsCisJbXRzcHIJSUJBVDFMLCByNAorCW10c3ByCUlCQVQxVSwgcjMKKwlpc3luYworCisJbGlzCXI0LCBDT05GSUdfU1lTX0RCQVQxTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19EQkFUMUxAbAorCWxpcwlyMywgQ09ORklHX1NZU19EQkFUMVVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfREJBVDFVQGwKKwltdHNwcglEQkFUMUwsIHI0CisJbXRzcHIJREJBVDFVLCByMworCWlzeW5jCisKKwlsaXMJcjQsIENPTkZJR19TWVNfSUJBVDJMQGgKKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX0lCQVQyTEBsCisJbGlzCXIzLCBDT05GSUdfU1lTX0lCQVQyVUBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19JQkFUMlVAbAorCW10c3ByCUlCQVQyTCwgcjQKKwltdHNwcglJQkFUMlUsIHIzCisJaXN5bmMKKworCWxpcwlyNCwgQ09ORklHX1NZU19EQkFUMkxAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfREJBVDJMQGwKKwlsaXMJcjMsIENPTkZJR19TWVNfREJBVDJVQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0RCQVQyVUBsCisJbXRzcHIJREJBVDJMLCByNAorCW10c3ByCURCQVQyVSwgcjMKKwlpc3luYworCisJbGlzCXI0LCBDT05GSUdfU1lTX0lCQVQzTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JQkFUM0xAbAorCWxpcwlyMywgQ09ORklHX1NZU19JQkFUM1VAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSUJBVDNVQGwKKwltdHNwcglJQkFUM0wsIHI0CisJbXRzcHIJSUJBVDNVLCByMworCWlzeW5jCisKKwlsaXMJcjQsIENPTkZJR19TWVNfREJBVDNMQGgKKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX0RCQVQzTEBsCisJbGlzCXIzLCBDT05GSUdfU1lTX0RCQVQzVUBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19EQkFUM1VAbAorCW10c3ByCURCQVQzTCwgcjQKKwltdHNwcglEQkFUM1UsIHIzCisJaXN5bmMKKworCS8qIEludmFsaWRhdGUgVExCcy4KKwkgKiAtPiBmb3IgKHZhbCA9IDA7IHZhbCA8IDB4MjAwMDA7IHZhbCs9MHgxMDAwKQorCSAqIC0+ICAgdGxiaWUodmFsKTsKKwkgKi8KKwlsaXMJcjMsIDAKKwlsaXMJcjUsIDIKKworMToKKwl0bGJpZQlyMworCWFkZGkJcjMsIHIzLCAweDEwMDAKKwljbXAJMCwgMCwgcjMsIHI1CisJYmx0CTFiCisKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L3RyYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzYjk4MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC90cmFwcy5jCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogbGludXgvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgIEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqIE1vZGlmaWVkIGJ5IENvcnQgRG91Z2FuIChjb3J0QGNzLm5tdC5lZHUpCisgKiBhbmQgUGF1bCBNYWNrZXJyYXMgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgaGFyZHdhcmUgZXhjZXB0aW9ucworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qIFJldHVybnMgMCBpZiBleGNlcHRpb24gbm90IGZvdW5kIGFuZCBmaXh1cCBvdGhlcndpc2UuICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nKTsKKworLyogVEhJUyBORUVEUyBDSEFOR0lORyB0byB1c2UgdGhlIGJvYXJkIGluZm8gc3RydWN0dXJlLgorKi8KKyNkZWZpbmUgRU5EX09GX01FTQkweDAwNDAwMDAwCisKKy8qCisgKiBUcmFwICYgRXhjZXB0aW9uIHN1cHBvcnQKKyAqLworCit2b2lkCitwcmludF9iYWNrdHJhY2UodW5zaWduZWQgbG9uZyAqc3ApCit7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHJpbnRmKCJDYWxsIGJhY2t0cmFjZTogIik7CisJd2hpbGUgKHNwKSB7CisJCWlmICgodWludClzcCA+IEVORF9PRl9NRU0pCisJCQlicmVhazsKKworCQlpID0gc3BbMV07CisJCWlmIChjbnQrKyAlIDcgPT0gMCkKKwkJCXByaW50ZigiXG4iKTsKKwkJcHJpbnRmKCIlMDhsWCAiLCBpKTsKKwkJaWYgKGNudCA+IDMyKSBicmVhazsKKwkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSpzcDsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGk7CisKKwlwcmludGYoIk5JUDogJTA4bFggWEVSOiAlMDhsWCBMUjogJTA4bFggUkVHUzogJXAgVFJBUDogJTA0bHggREFSOiAlMDhsWFxuIiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT54ZXIsIHJlZ3MtPmxpbmssIHJlZ3MsIHJlZ3MtPnRyYXAsIHJlZ3MtPmRhcik7CisJcHJpbnRmKCJNU1I6ICUwOGx4IEVFOiAlMDF4IFBSOiAlMDF4IEZQOiAlMDF4IE1FOiAlMDF4IElSL0RSOiAlMDF4JTAxeFxuIiwKKwkgICAgICAgcmVncy0+bXNyLCByZWdzLT5tc3ImTVNSX0VFID8gMSA6IDAsIHJlZ3MtPm1zciZNU1JfUFIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyICYgTVNSX0ZQID8gMSA6IDAscmVncy0+bXNyJk1TUl9NRSA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3ImTVNSX0lSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciZNU1JfRFIgPyAxIDogMCk7CisKKwlwcmludGYoIlxuIik7CisJZm9yIChpID0gMDsgIGkgPCAzMjsgIGkrKykgeworCQlpZiAoKGkgJSA4KSA9PSAwKQorCQl7CisJCQlwcmludGYoIkdQUiUwMmQ6ICIsIGkpOworCQl9CisKKwkJcHJpbnRmKCIlMDhsWCAiLCByZWdzLT5ncHJbaV0pOworCQlpZiAoKGkgJSA4KSA9PSA3KQorCQl7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwl9Cit9CisKKwordm9pZAorX2V4Y2VwdGlvbihpbnQgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJFeGNlcHRpb24gaW4ga2VybmVsIHBjICVseCBzaWduYWwgJWQiLHJlZ3MtPm5pcCxzaWducik7Cit9CisKK3ZvaWQKK01hY2hpbmVDaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZpeHVwOworCisJLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgorCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCisJICogdGhlIFBDSSBleGNlcHRpb24gaGFuZGxlci4KKwkgKi8KKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZShyZWdzLT5uaXApKSAhPSAwKSB7CisJCXJlZ3MtPm5pcCA9IGZpeHVwOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIGluIGtlcm5lbCBtb2RlLlxuIik7CisJcHJpbnRmKCJDYXVzZWQgYnkgKGZyb20gbXNyKTogIik7CisJcHJpbnRmKCJyZWdzICVwICIscmVncyk7CisJc3dpdGNoKCByZWdzLT5tc3IgJiAweDAwMEYwMDAwKSB7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTIpOgorCQlwcmludGYoIk1hY2hpbmUgY2hlY2sgc2lnbmFsIC0gcHJvYmFibHkgZHVlIHRvIG1tIGZhdWx0XG4iCisJCQkid2l0aCBtbXUgb2ZmXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTMpOgorCQlwcmludGYoIlRyYW5zZmVyIGVycm9yIGFjayBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwPj4xNCk6CisJCXByaW50ZigiRGF0YSBwYXJpdHkgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTUpOgorCQlwcmludGYoIkFkZHJlc3MgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiVW5rbm93biB2YWx1ZXMgaW4gbXNyXG4iKTsKKwl9CisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMoIm1hY2hpbmUgY2hlY2siKTsKK30KKwordm9pZAorQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJBbGlnbm1lbnQgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQKK1Byb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiUHJvZ3JhbSBDaGVjayBFeGNlcHRpb24iKTsKK30KKwordm9pZAorU29mdEVtdUV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiU29mdHdhcmUgRW11bGF0aW9uIEV4Y2VwdGlvbiIpOworfQorCisKK3ZvaWQKK1Vua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHJpbnRmKCJCYWQgdHJhcCBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4XG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CisJX2V4Y2VwdGlvbigwLCByZWdzKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCitleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZgorCit2b2lkCitEZWJ1Z0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKworICBwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOworICBzaG93X3JlZ3MocmVncyk7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKKyAgZG9fYmVkYnVnX2JyZWFrcG9pbnQoIHJlZ3MgKTsKKyNlbmRpZgorfQorCisvKiBQcm9iZSBhbiBhZGRyZXNzIGJ5IHJlYWRpbmcuICBJZiBub3QgcHJlc2VudCwgcmV0dXJuIC0xLCBvdGhlcndpc2UKKyAqIHJldHVybiAwLgorICovCitpbnQKK2FkZHJfcHJvYmUodWludCAqYWRkcikKK3sKKyNpZiAwCisJaW50CXJldHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKKwkJIjE6CWx3eiAlMCwwKCUxKVxuIgkJXAorCQkiCWVpZWlvXG4iCQlcCisJCSIJbGkgJTAsMFxuIgkJXAorCQkiMjpcbiIJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIglcCisJCSIzOglsaSAlMCwtMVxuIgkJXAorCQkiCWIgMmJcbiIJCQlcCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCVwKKwkJIgkuYWxpZ24gMlxuIgkJXAorCQkiCS5sb25nIDFiLDNiXG4iCQlcCisJCSIudGV4dCIJCQkJXAorCQk6ICI9ciIgKHJldHZhbCkgOiAiciIoYWRkcikpOworCisJcmV0dXJuIChyZXR2YWwpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvdS1ib290LmxkcyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI0eC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmNkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNHgvdS1ib290LmxkcwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKQl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKQl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjR4L3N0YXJ0Lm8JCSgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgICAgLiA9IEFMSUdOKDE2KTsKKyAgICAqKC5laF9mcmFtZSkKKyAgICAqKFNPUlRfQllfQUxJR05NRU5UKFNPUlRfQllfTkFNRSgucm9kYXRhKikpKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzIChOT0xPQUQpICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLiA9IEFMSUdOKDQpOworICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwYzJkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9NYWtlZmlsZQpAQCAtMCwwICsxLDUzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA4CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk9IHN0YXJ0Lm8ga2dkYi5vCitDT0JKUwk9IHRyYXBzLm8gc2VyaWFsX3NtYy5vIHNlcmlhbF9zY2MubyBjcHUubyBjcHVfaW5pdC5vIHNwZWVkLm8gXAorCSAgaW50ZXJydXB0cy5vIGV0aGVyX2ZjYy5vIGkyYy5vIGNvbW1wcm9jLm8gXAorCSAgYmVkYnVnXzYwM2UubyBwY2kubyBzcGkubworCitDT0JKUy0kKENPTkZJR19FVEhFUl9PTl9TQ0MpID0gZXRoZXJfc2NjLm8KKworQ09CSlMJKz0gJChDT0JKUy15KQorCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykgJChvYmopa2dkYi5vCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvYmVkYnVnXzYwM2UuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9iZWRidWdfNjAzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjlmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvYmVkYnVnXzYwM2UuYwpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIEJlZGJ1ZyBGdW5jdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1QQzYwM2UgY29yZQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxiZWRidWcvdHlwZS5oPgorI2luY2x1ZGUgPGJlZGJ1Zy9iZWRidWcuaD4KKyNpbmNsdWRlIDxiZWRidWcvcmVncy5oPgorI2luY2x1ZGUgPGJlZGJ1Zy9wcGMuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpIFwKKwkmJiAoZGVmaW5lZChDT05GSUdfTVBDODI0WCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODI2MCkpCisKKyNkZWZpbmUgTUFYX0JSRUFLX1BPSU5UUyAxCisKK2V4dGVybiBDUFVfREVCVUdfQ1RYIGJ1Z19jdHg7CisKK3ZvaWQgYmVkYnVnNjAzZV9pbml0IF9fUCgodm9pZCkpOwordm9pZCBiZWRidWc2MDNlX2RvX2JyZWFrIF9fUCgoY21kX3RibF90KixpbnQsaW50LGNoYXIqW10pKTsKK3ZvaWQgYmVkYnVnNjAzZV9icmVha19pc3IgX19QKChzdHJ1Y3QgcHRfcmVncyopKTsKK2ludCAgYmVkYnVnNjAzZV9maW5kX2VtcHR5IF9fUCgodm9pZCkpOworaW50ICBiZWRidWc2MDNlX3NldCBfX1AoKGludCx1bnNpZ25lZCBsb25nKSk7CitpbnQgIGJlZGJ1ZzYwM2VfY2xlYXIgX19QKChpbnQpKTsKKworDAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIGJ1Z19jdHggc3RydWN0dXJlIGZvciB0aGUgcHJvY2Vzc29yLiAgQ2xlYXIgYWxsCisgKiBvZiB0aGUgYnJlYWtwb2ludHMuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgYmVkYnVnNjAzZV9pbml0KCB2b2lkICkKK3sKKyAgaW50CWk7CisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgYnVnX2N0eC5od19kZWJ1Z19lbmFibGVkID0gMDsKKyAgYnVnX2N0eC5zdG9wcGVkID0gMDsKKyAgYnVnX2N0eC5jdXJyZW50X2JwID0gMDsKKyAgYnVnX2N0eC5yZWdzID0gTlVMTDsKKworICBidWdfY3R4LmRvX2JyZWFrICAgPSBiZWRidWc2MDNlX2RvX2JyZWFrOworICBidWdfY3R4LmJyZWFrX2lzciAgPSBiZWRidWc2MDNlX2JyZWFrX2lzcjsKKyAgYnVnX2N0eC5maW5kX2VtcHR5ID0gYmVkYnVnNjAzZV9maW5kX2VtcHR5OworICBidWdfY3R4LnNldCAgICAgICAgPSBiZWRidWc2MDNlX3NldDsKKyAgYnVnX2N0eC5jbGVhciAgICAgID0gYmVkYnVnNjAzZV9jbGVhcjsKKworICBmb3IoIGkgPSAxOyBpIDw9IE1BWF9CUkVBS19QT0lOVFM7ICsraSApCisgICAgKCpidWdfY3R4LmNsZWFyKSggaSApOworCisgIHB1dHMgKCJCRURCVUc6cmVhZHlcbiIpOworICByZXR1cm47Cit9IC8qIGJlZGJ1Z19pbml0X2JyZWFrcG9pbnRzICovCisKKworDAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0L2NsZWFyL3Nob3cgdGhlIGhhcmR3YXJlIGJyZWFrcG9pbnQgZm9yIHRoZSA2MDNlLiAgVGhlICJvZmYiCisgKiBzdHJpbmcgd2lsbCBkaXNhYmxlIGEgc3BlY2lmaWMgYnJlYWtwb2ludC4gIFRoZSAic2hvdyIgc3RyaW5nIHdpbGwKKyAqIGRpc3BsYXkgdGhlIGN1cnJlbnQgYnJlYWtwb2ludHMuICBPdGhlcndpc2UgYW4gYWRkcmVzcyB3aWxsIHNldCBhCisgKiBicmVha3BvaW50IGF0IHRoYXQgYWRkcmVzcy4gIFNldHRpbmcgYSBicmVha3BvaW50IHVzZXMgdGhlIENQVS1zcGVjaWZpYworICogc2V0IHJvdXRpbmUgd2hpY2ggd2lsbCBhc3NpZ24gYSBicmVha3BvaW50IG51bWJlci4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBiZWRidWc2MDNlX2RvX2JyZWFrIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsCisJCQkgY2hhciAqYXJndltdKQoreworICBsb25nCQlhZGRyOyAgICAgICAgICAgLyogQWRkcmVzcyB0byBicmVhayBhdCAgKi8KKyAgaW50CQl3aGljaF9icDsgICAgICAgLyogQnJlYWtwb2ludCBudW1iZXIgICAgKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICBpZiAoYXJnYyA8IDIpCisgIHsKKyAgICBjbWRfdXNhZ2UoY21kdHApOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFR1cm4gb2ZmIGEgYnJlYWtwb2ludCAqLworCisgIGlmKCBzdHJjbXAoIGFyZ3ZbIDEgXSwgIm9mZiIgKSA9PSAwICkKKyAgeworICAgIGlmKCBidWdfY3R4Lmh3X2RlYnVnX2VuYWJsZWQgPT0gMCApCisgICAgeworICAgICAgcHV0cyAoICJObyBicmVha3BvaW50cyBlbmFibGVkXG4iICk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpY2hfYnAgPSBzaW1wbGVfc3RydG91bCggYXJndlsgMiBdLCBOVUxMLCAxMCApOworCisgICAgaWYoIGJ1Z19jdHguY2xlYXIgKQorICAgICAgKCpidWdfY3R4LmNsZWFyKSggd2hpY2hfYnAgKTsKKworICAgIHByaW50ZiggIkJyZWFrcG9pbnQgJWQgcmVtb3ZlZFxuIiwgd2hpY2hfYnAgKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBTaG93IGEgbGlzdCBvZiBicmVha3BvaW50cyAqLworCisgIGlmKCBzdHJjbXAoIGFyZ3ZbIDEgXSwgInNob3ciICkgPT0gMCApCisgIHsKKyAgICBmb3IoIHdoaWNoX2JwID0gMTsgd2hpY2hfYnAgPD0gTUFYX0JSRUFLX1BPSU5UUzsgKyt3aGljaF9icCApCisgICAgeworCisgICAgICBhZGRyID0gR0VUX0lBQlIoKTsKKworICAgICAgcHJpbnRmKCAiQnJlYWtwb2ludCBbJWRdOiAiLCB3aGljaF9icCApOworICAgICAgaWYoIChhZGRyICYgMHgwMDAwMDAwMikgPT0gMCApCisJcHV0cyAoICJOT1QgU0VUXG4iICk7CisgICAgICBlbHNlCisJZGlzcHBjKCAodW5zaWduZWQgY2hhciAqKShhZGRyICYgMHhGRkZGRkZGQyksIDAsIDEsIGJlZGJ1Z19wdXRzLCBGX1JBREhFWCApOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICAvKiBTZXQgYSBicmVha3BvaW50IGF0IHRoZSBhZGRyZXNzICovCisKKyAgaWYoISgoIGlzZGlnaXQoIGFyZ3ZbIDEgXVsgMCBdICkpIHx8CisJKCggYXJndlsgMSBdWyAwIF0gPj0gJ2EnICkgJiYgKCBhcmd2WyAxIF1bIDAgXSA8PSAnZicgKSkgfHwKKwkoKCBhcmd2WyAxIF1bIDAgXSA+PSAnQScgKSAmJiAoIGFyZ3ZbIDEgXVsgMCBdIDw9ICdGJyApKSkpCisgIHsKKyAgICBjbWRfdXNhZ2UoY21kdHApOworICAgIHJldHVybjsKKyAgfQorCisgIGFkZHIgPSBzaW1wbGVfc3RydG91bCggYXJndlsgMSBdLCBOVUxMLCAxNiApOworCisgIGlmKCggYnVnX2N0eC5zZXQgKSAmJiAoIHdoaWNoX2JwID0gKCpidWdfY3R4LnNldCkoIDAsIGFkZHIgKSkgPiAwICkKKyAgeworICAgIHByaW50ZiggIkJyZWFrcG9pbnQgWyVkXTogIiwgd2hpY2hfYnAgKTsKKyAgICBkaXNwcGMoICh1bnNpZ25lZCBjaGFyICopYWRkciwgMCwgMSwgYmVkYnVnX3B1dHMsIEZfUkFESEVYICk7CisgIH0KKworICByZXR1cm47Cit9IC8qIGJlZGJ1ZzYwM2VfZG9fYnJlYWsgKi8KKworCisMCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIYW5kbGUgYSBicmVha3BvaW50LiAgRW50ZXIgYSBtaW5pIG1haW4gbG9vcC4gIFN0YXkgaW4gdGhlIGxvb3AgdW50aWwKKyAqIHRoZSBzdG9wcGVkIGZsYWcgaW4gdGhlIGRlYnVnIGNvbnRleHQgaXMgY2xlYXJlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBiZWRidWc2MDNlX2JyZWFrX2lzciggc3RydWN0IHB0X3JlZ3MgKnJlZ3MgKQoreworICB1bnNpZ25lZCBsb25nCWFkZHI7ICAgICAgICAgICAvKiBBZGRyZXNzIHN0b3BwZWQgYXQgICAqLworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIGJ1Z19jdHguY3VycmVudF9icCA9IDE7CisgIGFkZHIgPSBHRVRfSUFCUigpICYgMHhGRkZGRkZGQzsKKworICBiZWRidWdfbWFpbl9sb29wKCBhZGRyLCByZWdzICk7CisgIHJldHVybjsKK30gLyogYmVkYnVnNjAzZV9icmVha19pc3IgKi8KKworCisMCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZWUgaWYgdGhlIGhhcmR3YXJlIGJyZWFrcG9pbnQgaXMgYXZhaWxhYmxlLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitpbnQgYmVkYnVnNjAzZV9maW5kX2VtcHR5KCB2b2lkICkKK3sKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICBpZiggKEdFVF9JQUJSKCkgJiYgMHgwMDAwMDAwMikgPT0gMCApCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9IC8qIGJlZGJ1ZzYwM2VfZmluZF9lbXB0eSAqLworCisKKwwKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBhIGJyZWFrcG9pbnQuICBJZiAnd2hpY2hfYnAnIGlzIHplcm8gdGhlbiBmaW5kIGFuIHVudXNlZCBicmVha3BvaW50CisgKiBudW1iZXIsIG90aGVyd2lzZSByZWFzc2lnbiB0aGUgZ2l2ZW4gYnJlYWtwb2ludC4gIElmIGhhcmR3YXJlIGRlYnVnZ2luZworICogaXMgbm90IGVuYWJsZWQsIHRoZW4gdHVybiBpdCBvbiB2aWEgdGhlIE1TUiBhbmQgREJDUjAuICBTZXQgdGhlIGJyZWFrCisgKiBhZGRyZXNzIGluIHRoZSBJQUJSIHJlZ2lzdGVyLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitpbnQgYmVkYnVnNjAzZV9zZXQoIGludCB3aGljaF9icCwgdW5zaWduZWQgbG9uZyBhZGRyICkKK3sKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICBpZigoIGFkZHIgJiAweDAwMDAwMDAzICkgIT0gMCApCisgIHsKKyAgICBwdXRzICggIkJyZWFrcG9pbnRzIG11c3QgYmUgb24gYSAzMiBiaXQgYm91bmRhcnlcbiIgKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIE9ubHkgbG9vayBpZiB3aGljaF9icCA9PSAwLCBlbHNlIHVzZSB3aGljaF9icCAqLworICBpZigoIGJ1Z19jdHguZmluZF9lbXB0eSApICYmICggIXdoaWNoX2JwICkgJiYKKyAgICAgKCB3aGljaF9icCA9ICgqYnVnX2N0eC5maW5kX2VtcHR5KSgpKSA9PSAwICkKKyAgeworICAgIHB1dHMgKCAiQWxsIGJyZWFrcG9pbnRzIGluIHVzZVxuIiApOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYoIHdoaWNoX2JwIDwgMSB8fCB3aGljaF9icCA+IE1BWF9CUkVBS19QT0lOVFMgKQorICB7CisgICAgcHJpbnRmKCAiSW52YWxpZCBicmVhayBwb2ludCAjICVkXG4iLCB3aGljaF9icCApOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYoICEgYnVnX2N0eC5od19kZWJ1Z19lbmFibGVkICkKKyAgeworICAgIGJ1Z19jdHguaHdfZGVidWdfZW5hYmxlZCA9IDE7CisgIH0KKworICBTRVRfSUFCUiggYWRkciB8IDB4MDAwMDAwMDIgKTsKKworICByZXR1cm4gd2hpY2hfYnA7Cit9IC8qIGJlZGJ1ZzYwM2Vfc2V0ICovCisKKworDAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGlzYWJsZSBhIHNwZWNpZmljIGJyZWFrb2ludCBieSBzZXR0aW5nIHRoZSBJQUJSIHJlZ2lzdGVyIHRvIHplcm8uCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK2ludCBiZWRidWc2MDNlX2NsZWFyKCBpbnQgd2hpY2hfYnAgKQoreworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIGlmKCB3aGljaF9icCA8IDEgfHwgd2hpY2hfYnAgPiBNQVhfQlJFQUtfUE9JTlRTICkKKyAgeworICAgIHByaW50ZiggIkludmFsaWQgYnJlYWsgcG9pbnQgIyAoJWQpXG4iLCB3aGljaF9icCApOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIFNFVF9JQUJSKCAwICk7CisKKyAgcmV0dXJuIDA7Cit9IC8qIGJlZGJ1ZzYwM2VfY2xlYXIgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9jb21tcHJvYy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2NvbW1wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExYTY3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9jb21tcHJvYy5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uICJhcmNoL3Bvd2VycGMvODI2MF9pby9jb21tcHJvYy5jIiAtIGhlcmUgaXMgaXQncworICogY29weXJpZ2h0IG5vdGljZToKKyAqCisgKiBHZW5lcmFsIFB1cnBvc2UgZnVuY3Rpb25zIGZvciB0aGUgZ2xvYmFsIG1hbmFnZW1lbnQgb2YgdGhlCisgKiA4MjYwIENvbW11bmljYXRpb24gUHJvY2Vzc29yIE1vZHVsZS4KKyAqIENvcHlyaWdodCAoYykgMTk5OSBEYW4gTWFsZWsgKGRtYWxla0BqbGMubmV0KQorICogQ29weXJpZ2h0IChjKSAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYyAoc291cmNlQG12aXN0YS5jb20pCisgKgkyLjMuOTkgVXBkYXRlcworICoKKyAqIEluIGFkZGl0aW9uIHRvIHRoZSBpbmRpdmlkdWFsIGNvbnRyb2wgb2YgdGhlIGNvbW11bmljYXRpb24KKyAqIGNoYW5uZWxzLCB0aGVyZSBhcmUgYSBmZXcgZnVuY3Rpb25zIHRoYXQgZ2xvYmFsbHkgYWZmZWN0IHRoZQorICogY29tbXVuaWNhdGlvbiBwcm9jZXNzb3IuCisgKgorICogQnVmZmVyIGRlc2NyaXB0b3JzIG11c3QgYmUgYWxsb2NhdGVkIGZyb20gdGhlIGR1YWwgcG9ydGVkIG1lbW9yeQorICogc3BhY2UuICBUaGUgYWxsb2NhdG9yIGZvciB0aGF0IGlzIGhlcmUuICBXaGVuIHRoZSBjb21tdW5pY2F0aW9uCisgKiBwcm9jZXNzIGlzIHJlc2V0LCB3ZSByZWNsYWltIHRoZSBtZW1vcnkgYXZhaWxhYmxlLiAgVGhlcmUgaXMKKyAqIGN1cnJlbnRseSBubyBkZWFsbG9jYXRvciBmb3IgdGhpcyBtZW1vcnkuCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3ZvaWQKK204MjYwX2NwbV9yZXNldCh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSB1bG9uZyBjb3VudDsKKworCS8qIFJlY2xhaW0gdGhlIERQIG1lbW9yeSBmb3Igb3VyIHVzZS4KKwkqLworCWdkLT5kcF9hbGxvY19iYXNlID0gQ1BNX0RBVEFPTkxZX0JBU0U7CisJZ2QtPmRwX2FsbG9jX3RvcCA9IGdkLT5kcF9hbGxvY19iYXNlICsgQ1BNX0RBVEFPTkxZX1NJWkU7CisKKwkvKgorCSAqIFJlc2V0IENQTQorCSAqLworCWltbXItPmltX2NwbS5jcF9jcGNyID0gQ1BNX0NSX1JTVDsKKwljb3VudCA9IDA7CisJZG8gewkJCS8qIFNwaW4gdW50aWwgY29tbWFuZCBwcm9jZXNzZWQJCSovCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKwl9IHdoaWxlICgoaW1tci0+aW1fY3BtLmNwX2NwY3IgJiBDUE1fQ1JfRkxHKSAmJiArK2NvdW50IDwgMTAwMDAwMCk7CisKKyNpZmRlZiBDT05GSUdfSEFSRF9JMkMKKwkqKCh1bnNpZ25lZCBzaG9ydCopKCZpbW1yLT5pbV9kcHJhbWJhc2VbUFJPRkZfSTJDX0JBU0VdKSkgPSAwOworI2VuZGlmCit9CisKKy8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5IGZyb20gdGhlIGR1YWwgcG9ydGVkIHJhbS4KKyAqIFRvIGhlbHAgcHJvdG9jb2xzIHdpdGggb2JqZWN0IGFsaWdubWVudCByZXN0cmljdGlvbnMsIHdlIGRvIHRoYXQKKyAqIGlmIHRoZXkgYXNrLgorICovCit1aW50CittODI2MF9jcG1fZHBhbGxvYyh1aW50IHNpemUsIHVpbnQgYWxpZ24pCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXVpbnQJcmV0bG9jOworCXVpbnQJYWxpZ25fbWFzaywgb2ZmOworCXVpbnQJc2F2ZWJhc2U7CisKKwlhbGlnbl9tYXNrID0gYWxpZ24gLSAxOworCXNhdmViYXNlID0gZ2QtPmRwX2FsbG9jX2Jhc2U7CisKKwlpZiAoKG9mZiA9IChnZC0+ZHBfYWxsb2NfYmFzZSAmIGFsaWduX21hc2spKSAhPSAwKQorCQlnZC0+ZHBfYWxsb2NfYmFzZSArPSAoYWxpZ24gLSBvZmYpOworCisJaWYgKChvZmYgPSBzaXplICYgYWxpZ25fbWFzaykgIT0gMCkKKwkJc2l6ZSArPSBhbGlnbiAtIG9mZjsKKworCWlmICgoZ2QtPmRwX2FsbG9jX2Jhc2UgKyBzaXplKSA+PSBnZC0+ZHBfYWxsb2NfdG9wKSB7CisJCWdkLT5kcF9hbGxvY19iYXNlID0gc2F2ZWJhc2U7CisJCXBhbmljKCJtODI2MF9jcG1fZHBhbGxvYzogcmFuIG91dCBvZiBkdWFsIHBvcnQgcmFtISIpOworCX0KKworCXJldGxvYyA9IGdkLT5kcF9hbGxvY19iYXNlOworCWdkLT5kcF9hbGxvY19iYXNlICs9IHNpemU7CisKKwltZW1zZXQoKHZvaWQgKikmaW1tci0+aW1fZHByYW1iYXNlW3JldGxvY10sIDAsIHNpemUpOworCisJcmV0dXJuKHJldGxvYyk7Cit9CisKKy8qIFdlIGFsc28gb3duIG9uZSBwYWdlIG9mIGhvc3QgYnVmZmVyIHNwYWNlIGZvciB0aGUgYWxsb2NhdGlvbiBvZgorICogVUFSVCAiZmlmb3MiIGFuZCB0aGUgbGlrZS4KKyAqLwordWludAorbTgyNjBfY3BtX2hvc3RhbGxvYyh1aW50IHNpemUsIHVpbnQgYWxpZ24pCit7CisJLyogdGhlIGhvc3QgbWlnaHQgbm90IGV2ZW4gaGF2ZSBSQU0geWV0IC0ganVzdCB1c2UgZHVhbCBwb3J0IFJBTSAqLworCXJldHVybiAobTgyNjBfY3BtX2RwYWxsb2Moc2l6ZSwgYWxpZ24pKTsKK30KKworLyogU2V0IGEgYmF1ZCByYXRlIGdlbmVyYXRvci4gIFRoaXMgbmVlZHMgbG90cyBvZiB3b3JrLiAgVGhlcmUgYXJlCisgKiBlaWdodCBCUkdzLCB3aGljaCBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBDUE0gY2hhbm5lbHMgb3Igb3V0cHV0CisgKiBhcyBjbG9ja3MuICBUaGUgQlJHcyBhcmUgaW4gdHdvIGRpZmZlcmVudCBibG9jayBvZiBpbnRlcm5hbAorICogbWVtb3J5IG1hcHBlZCBzcGFjZS4KKyAqIFRoZSBiYXVkIHJhdGUgY2xvY2sgaXMgdGhlIHN5c3RlbSBjbG9jayBkaXZpZGVkIGJ5IHNvbWV0aGluZy4KKyAqIEl0IHdhcyBzZXQgdXAgbG9uZyBhZ28gZHVyaW5nIHRoZSBpbml0aWFsIGJvb3QgcGhhc2UgYW5kIGlzCisgKiBpcyBnaXZlbiB0byB1cy4KKyAqIEJhdWQgcmF0ZSBjbG9ja3MgYXJlIHplcm8tYmFzZWQgaW4gdGhlIGRyaXZlciBjb2RlIChhcyB0aGF0IG1hcHMKKyAqIHRvIHBvcnQgbnVtYmVycykuICBEb2N1bWVudGF0aW9uIHVzZXMgMS1iYXNlZCBudW1iZXJpbmcuCisgKi8KKyNkZWZpbmUgQlJHX0lOVF9DTEsJZ2QtPmJyZ19jbGsKKyNkZWZpbmUgQlJHX1VBUlRfQ0xLCShCUkdfSU5UX0NMSyAvIDE2KQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgVUFSVHMsIG9yIGFueXRoaW5nIGVsc2UgdGhhdCB1c2VzIGEgMTZ4CisgKiBvdmVyc2FtcGxlZCBjbG9jay4KKyAqLwordm9pZAorbTgyNjBfY3BtX3NldGJyZyh1aW50IGJyZywgdWludCByYXRlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSB1aW50CSpicDsKKwl1aW50IGNkID0gQlJHX1VBUlRfQ0xLIC8gcmF0ZTsKKworCWlmICgoQlJHX1VBUlRfQ0xLICUgcmF0ZSkgPCAocmF0ZSAvIDIpKQorCQljZC0tOworCWlmIChicmcgPCA0KSB7CisJCWJwID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzE7CisJfQorCWVsc2UgeworCQlicCA9ICh1aW50ICopJmltbXItPmltX2JyZ2M1OworCQlicmcgLT0gNDsKKwl9CisJYnAgKz0gYnJnOworCSpicCA9IChjZCA8PCAxKSB8IENQTV9CUkdfRU47Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgaGlnaCBzcGVlZCBzeW5jaHJvbm91cyBiYXVkIHJhdGUKKyAqIGNsb2Nrcy4KKyAqLwordm9pZAorbTgyNjBfY3BtX2Zhc3RicmcodWludCBicmcsIHVpbnQgcmF0ZSwgaW50IGRpdjE2KQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSB1aW50CSpicDsKKworCS8qIFRoaXMgaXMgZ29vZCBlbm91Z2ggdG8gZ2V0IFNNQ3MgcnVubmluZy4uLi4uCisJKi8KKwlpZiAoYnJnIDwgNCkgeworCQlicCA9ICh1aW50ICopJmltbXItPmltX2JyZ2MxOworCX0KKwllbHNlIHsKKwkJYnAgPSAodWludCAqKSZpbW1yLT5pbV9icmdjNTsKKwkJYnJnIC09IDQ7CisJfQorCWJwICs9IGJyZzsKKwkqYnAgPSAoKCgoKEJSR19JTlRfQ0xLK3JhdGUtMSkvcmF0ZSktMSkmMHhmZmYpPDwxKXxDUE1fQlJHX0VOOworCWlmIChkaXYxNikKKwkJKmJwIHw9IENQTV9CUkdfRElWMTY7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgYmF1ZCByYXRlIGdlbmVyYXRvcnMgdXNpbmcgYW4gZXh0ZXJuYWwKKyAqIGNsb2NrIHNvdXJjZSBhbmQgMTZ4IG92ZXJzYW1wbGluZy4KKyAqLworCit2b2lkCittODI2MF9jcG1fZXh0Y2JyZyh1aW50IGJyZywgdWludCByYXRlLCB1aW50IGV4dGNsaywgaW50IHBpbnNlbCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgdWludAkqYnA7CisKKwlpZiAoYnJnIDwgNCkgeworCQlicCA9ICh1aW50ICopJmltbXItPmltX2JyZ2MxOworCX0KKwllbHNlIHsKKwkJYnAgPSAodWludCAqKSZpbW1yLT5pbV9icmdjNTsKKwkJYnJnIC09IDQ7CisJfQorCWJwICs9IGJyZzsKKwkqYnAgPSAoKCgoKChleHRjbGsvMTYpK3JhdGUtMSkvcmF0ZSktMSkmMHhmZmYpPDwxKXxDUE1fQlJHX0VOOworCWlmIChwaW5zZWwgPT0gMCkKKwkJKmJwIHw9IENQTV9CUkdfRVhUQ19DTEszXzk7CisJZWxzZQorCQkqYnAgfD0gQ1BNX0JSR19FWFRDX0NMSzVfMTU7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19QT1NUKSB8fCBkZWZpbmVkKENPTkZJR19MT0dCVUZGRVIpCisKK3ZvaWQgcG9zdF93b3JkX3N0b3JlICh1bG9uZyBhKQoreworCXZvbGF0aWxlIHVsb25nICpzYXZlX2FkZHIgPQorCQkodm9sYXRpbGUgdWxvbmcgKikoQ09ORklHX1NZU19JTU1SICsgQ1BNX1BPU1RfV09SRF9BRERSKTsKKworCSpzYXZlX2FkZHIgPSBhOworfQorCit1bG9uZyBwb3N0X3dvcmRfbG9hZCAodm9pZCkKK3sKKwl2b2xhdGlsZSB1bG9uZyAqc2F2ZV9hZGRyID0KKwkJKHZvbGF0aWxlIHVsb25nICopKENPTkZJR19TWVNfSU1NUiArIENQTV9QT1NUX1dPUkRfQUREUik7CisKKwlyZXR1cm4gKnNhdmVfYWRkcjsKK30KKworI2VuZGlmCS8qIENPTkZJR19QT1NUIHx8IENPTkZJR19MT0dCVUZGRVIqLworCisjaWZkZWYgQ09ORklHX0JPT1RDT1VOVF9MSU1JVAorCit2b2lkIGJvb3Rjb3VudF9zdG9yZSAodWxvbmcgYSkKK3sKKwl2b2xhdGlsZSB1bG9uZyAqc2F2ZV9hZGRyID0KKwkJKHZvbGF0aWxlIHVsb25nICopKENPTkZJR19TWVNfSU1NUiArIENQTV9CT09UQ09VTlRfQUREUik7CisKKwlzYXZlX2FkZHJbMF0gPSBhOworCXNhdmVfYWRkclsxXSA9IEJPT1RDT1VOVF9NQUdJQzsKK30KKwordWxvbmcgYm9vdGNvdW50X2xvYWQgKHZvaWQpCit7CisJdm9sYXRpbGUgdWxvbmcgKnNhdmVfYWRkciA9CisJCSh2b2xhdGlsZSB1bG9uZyAqKShDT05GSUdfU1lTX0lNTVIgKyBDUE1fQk9PVENPVU5UX0FERFIpOworCisJaWYgKHNhdmVfYWRkclsxXSAhPSBCT09UQ09VTlRfTUFHSUMpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIHNhdmVfYWRkclswXTsKK30KKworI2VuZGlmIC8qIENPTkZJR19CT09UQ09VTlRfTElNSVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9jb25maWcubWsgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YmI2ODgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1tZWFiaQorCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR184MjYwIC1EQ09ORklHX0NQTTIgLWZmaXhlZC1yMiBcCisJCSAgICAgLW1zdHJpbmcgLW1jcHU9NjAzZSAtbW11bHRpcGxlCisKKyMgVXNlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4gIEJvYXJkIHBvcnQgY2FuIG92ZXJyaWRlIGluIGJvYXJkLyovY29uZmlnLm1rCitMRFNDUklQVCA6PSAkKFNSQ1RSRUUpL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC91LWJvb3QubGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvY3B1LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkYmYyOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9jcHUuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBDUFUgc3BlY2lmaWMgY29kZSBmb3IgdGhlIE1QQzgyNXggLyBNUEM4MjZ4IC8gTVBDODI3eCAvIE1QQzgyOHgKKyAqCisgKiB3cml0dGVuIG9yIGNvbGxlY3RlZCBhbmQgc29tZXRpbWVzIHJld3JpdHRlbiBieQorICogTWFnbnVzIERhbW0gPGRhbW1AYml0c21hcnQuY29tPgorICoKKyAqIG1vZGlmaWVkIGJ5CisgKiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICoKKyAqIG1vZGlmaWVkIGZvciA4MjYwIGJ5CisgKiBNdXJyYXkgSmVuc2VuIDxNdXJyYXkuSmVuc2VuQGNtc3QuY3Npcm8uYXU+CisgKgorICogYWRkZWQgODI2MCBtYXNrcyBieQorICogTWFyaXVzIEdyb2VnZXIgPG1hZ0BzeXNnby5kZT4KKyAqCisgKiBhZGRlZCBIaVA3ICg4MjR4LzgyN3gvODI4MCkgcHJvY2Vzc29ycyBzdXBwb3J0IGJ5CisgKiBZdWxpIEJhcmNvaGVuIDx5dWxpQGFyYWJlbGxhc3cuY29tPgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtcGM4MjYwLmg+CisjaW5jbHVkZSA8bmV0ZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9jcG1fODI2MC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGxpYmZkdF9lbnYuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorI2VuZGlmCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZChDT05GSUdfR0VUX0NQVV9TVFJfRikKK2V4dGVybiBpbnQgZ2V0X2NwdV9zdHJfZiAoY2hhciAqYnVmKTsKKyNlbmRpZgorCitpbnQgY2hlY2tjcHUgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdWxvbmcgY2xvY2sgPSBnZC0+Y3B1X2NsazsKKwl1aW50IHB2ciA9IGdldF9wdnIgKCk7CisJdWludCBpbW1yLCByZXYsIG0sIGs7CisJY2hhciBidWZbMzJdOworCisJcHV0cyAoIkNQVTogICAiKTsKKworCXN3aXRjaCAocHZyKSB7CisJY2FzZSBQVlJfODI2MDoKKwljYXNlIFBWUl84MjYwX0hJUDM6CisJCWsgPSAzOworCQlicmVhazsKKwljYXNlIFBWUl84MjYwX0hJUDQ6CisJCWsgPSA0OworCQlicmVhazsKKwljYXNlIFBWUl84MjYwX0hJUDdSMToKKwljYXNlIFBWUl84MjYwX0hJUDdSQToKKwljYXNlIFBWUl84MjYwX0hJUDc6CisJCWsgPSA3OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CS8qIHdob29wcyEgbm90IGFuIE1QQzgyNjAgKi8KKwl9CisJcmV2ID0gcHZyICYgMHhmZjsKKworCWltbXIgPSBpbW1hcC0+aW1fbWVtY3RsLm1lbWNfaW1tcjsKKwlpZiAoKGltbXIgJiBJTU1SX0lTQl9NU0spICE9IENPTkZJR19TWVNfSU1NUikKKwkJcmV0dXJuIC0xOwkvKiB3aG9vcHMhIHNvbWVvbmUgbW92ZWQgdGhlIElNTVIgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0dFVF9DUFVfU1RSX0YpCisJZ2V0X2NwdV9zdHJfZiAoYnVmKTsKKwlwcmludGYgKCIlcyAoSGlQJWQgUmV2ICUwMngsIE1hc2sgIiwgYnVmLCBrLCByZXYpOworI2Vsc2UKKwlwcmludGYgKENQVV9JRF9TVFIgIiAoSGlQJWQgUmV2ICUwMngsIE1hc2sgIiwgaywgcmV2KTsKKyNlbmRpZgorCisJLyoKKwkgKiB0aGUgYm90dG9tIDE2IGJpdHMgb2YgdGhlIGltbXIgYXJlIHRoZSBQYXJ0IE51bWJlciBhbmQgTWFzayBOdW1iZXIKKwkgKiAoNC0zNCk7IHRoZSAxNiBiaXRzIGF0IFBST0ZGX1JFVk5VTSAoMHg4YWYwKSBpbiBkdWFsIHBvcnQgcmFtIGlzIHRoZQorCSAqIFJJU0MgTWljcm9jb2RlIFJldmlzaW9uIE51bWJlciAoMTMtMTApLgorCSAqIEZvciB0aGUgODI2MCwgTW90b3JvbGEgZG9lc24ndCBpbmNsdWRlIHRoZSBNaWNyb2NvZGUgUmV2aXNpb24KKwkgKiBpbiB0aGUgbWFzay4KKwkgKi8KKwltID0gaW1tciAmIChJTU1SX1BBUlROVU1fTVNLIHwgSU1NUl9NQVNLTlVNX01TSyk7CisJayA9ICooKHVzaG9ydCAqKSAmIGltbWFwLT5pbV9kcHJhbWJhc2VbUFJPRkZfUkVWTlVNXSk7CisKKwlzd2l0Y2ggKG0pIHsKKwljYXNlIDB4MDAwMDoKKwkJcHV0cyAoIjAuMiAySjI0TSIpOworCQlicmVhazsKKwljYXNlIDB4MDAxMDoKKwkJcHV0cyAoIkEuMCBLMjJBIik7CisJCWJyZWFrOworCWNhc2UgMHgwMDExOgorCQlwdXRzICgiQS4xIDFLMjJBLVhDIik7CisJCWJyZWFrOworCWNhc2UgMHgwMDAxOgorCQlwdXRzICgiQi4xIDFLMjNBIik7CisJCWJyZWFrOworCWNhc2UgMHgwMDIxOgorCQlwdXRzICgiQi4yIDJLMjNBLVhDIik7CisJCWJyZWFrOworCWNhc2UgMHgwMDIzOgorCQlwdXRzICgiQi4zIDNLMjNBIik7CisJCWJyZWFrOworCWNhc2UgMHgwMDI0OgorCQlwdXRzICgiQy4yIDZLMjNBIik7CisJCWJyZWFrOworCWNhc2UgMHgwMDYwOgorCQlwdXRzICgiQS4wKEEpIDJLMjVBIik7CisJCWJyZWFrOworCWNhc2UgMHgwMDYyOgorCQlwdXRzICgiQi4xIDRLMjVBIik7CisJCWJyZWFrOworCWNhc2UgMHgwMDY0OgorCQlwdXRzICgiQy4wIDVLMjVBIik7CisJCWJyZWFrOworCWNhc2UgMHgwQTAwOgorCQlwdXRzICgiMC4wIDBLNDlNIik7CisJCWJyZWFrOworCWNhc2UgMHgwQTAxOgorCQlwdXRzICgiMC4xIDFLNDlNIik7CisJCWJyZWFrOworCWNhc2UgMHgwQTEwOgorCQlwdXRzICgiMS4wIDFLNDlNIik7CisJCWJyZWFrOworCWNhc2UgMHgwQzAwOgorCQlwdXRzICgiMC4wIDBLNTBNIik7CisJCWJyZWFrOworCWNhc2UgMHgwQzEwOgorCQlwdXRzICgiMS4wIDFLNTBNIik7CisJCWJyZWFrOworCWNhc2UgMHgwRDAwOgorCQlwdXRzICgiMC4wIDBLNTBNIik7CisJCWJyZWFrOworCWNhc2UgMHgwRDEwOgorCQlwdXRzICgiMS4wIDFLNTBNIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZiAoInVua25vd24gW2ltbXI9MHglMDR4LGs9MHglMDR4XSIsIG0sIGspOworCQlicmVhazsKKwl9CisKKwlwcmludGYgKCIpIGF0ICVzIE1IelxuIiwgc3RybWh6IChidWYsIGNsb2NrKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogY29uZmlndXJlcyBhIFVQTSBieSB3cml0aW5nIGludG8gdGhlIFVQTSBSQU0gYXJyYXkJCQkgICAgICovCisvKiB1c2VzIGJhbmsgMTEgYW5kIGEgZHVtbXkgcGh5c2ljYWwgYWRkcmVzcyAoPUJSeF9CQV9NU0spCQkgICAgICovCisvKiBOT1RFOiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBjaG9zZW4gbXVzdCBub3Qgb3ZlcmxhcCBpbnRvIGFueSBvdGhlciBhcmVhICAgICovCisvKiBtYXBwZWQgYnkgdGhlIG1lbW9yeSBjb250cm9sbGVyIGJlY2F1c2UgYmFuayAxMSBoYXMgdGhlIGxvd2VzdCBwcmlvcml0eSAgICovCisKK3ZvaWQgdXBtY29uZmlnICh1aW50IHVwbSwgdWludCAqIHRhYmxlLCB1aW50IHNpemUpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgbWVtY3RsODI2MF90ICptZW1jdGwgPSAmaW1tYXAtPmltX21lbWN0bDsKKwl2b2xhdGlsZSB1Y2hhciAqZHVtbXkgPSAodWNoYXIgKikgQlJ4X0JBX01TSzsJLyogc2V0IGFsbCBCQSBiaXRzICovCisJdWludCBpOworCisJLyogZmlyc3Qgc2V0IHVwIGJhbmsgMTEgdG8gcmVmZXJlbmNlIHRoZSBjb3JyZWN0IFVQTSBhdCBhIGR1bW15IGFkZHJlc3MgKi8KKworCW1lbWN0bC0+bWVtY19vcjExID0gT1J4VV9BTV9NU0s7CS8qIHNldCBhbGwgQU0gYml0cyAqLworCisJc3dpdGNoICh1cG0pIHsKKworCWNhc2UgVVBNQToKKwkJbWVtY3RsLT5tZW1jX2JyMTEgPQorCQkJKCh1aW50KWR1bW15ICYgQlJ4X0JBX01TSykgfCBCUnhfUFNfMzIgfCBCUnhfTVNfVVBNQSB8CisJCQlCUnhfVjsKKwkJbWVtY3RsLT5tZW1jX21hbXIgPSBNeE1SX09QX1dBUlI7CisJCWJyZWFrOworCisJY2FzZSBVUE1COgorCQltZW1jdGwtPm1lbWNfYnIxMSA9CisJCQkoKHVpbnQpZHVtbXkgJiBCUnhfQkFfTVNLKSB8IEJSeF9QU18zMiB8IEJSeF9NU19VUE1CIHwKKwkJCUJSeF9WOworCQltZW1jdGwtPm1lbWNfbWJtciA9IE14TVJfT1BfV0FSUjsKKwkJYnJlYWs7CisKKwljYXNlIFVQTUM6CisJCW1lbWN0bC0+bWVtY19icjExID0KKwkJCSgodWludClkdW1teSAmIEJSeF9CQV9NU0spIHwgQlJ4X1BTXzMyIHwgQlJ4X01TX1VQTUMgfAorCQkJQlJ4X1Y7CisJCW1lbWN0bC0+bWVtY19tY21yID0gTXhNUl9PUF9XQVJSOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXBhbmljICgidXBtY29uZmlnIHBhc3NlZCBpbnZhbGlkIFVQTSBudW1iZXIgKCV1KVxuIiwgdXBtKTsKKwkJYnJlYWs7CisKKwl9CisKKwkvKgorCSAqIGF0IHRoaXMgcG9pbnQsIHRoZSBkdW1teSBhZGRyZXNzIGlzIHNldCB1cCB0byBhY2Nlc3MgdGhlIHNlbGVjdGVkIFVQTSwKKwkgKiB0aGUgTUFEIHBvaW50ZXIgaXMgemVybywgYW5kIHRoZSBNeE1SIE9QIGlzIHNldCBmb3Igd3JpdGluZyB0byBSQU0KKwkgKgorCSAqIG5vdyB3ZSBzaW1wbHkgbG9hZCB0aGUgbWRyIHdpdGggZWFjaCB3b3JkIGFuZCBwb2tlIHRoZSBkdW1teSBhZGRyZXNzLgorCSAqIHRoZSBNQUQgaXMgaW5jcmVtZW50ZWQgb24gZWFjaCBhY2Nlc3MuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCW1lbWN0bC0+bWVtY19tZHIgPSB0YWJsZVtpXTsKKwkJKmR1bW15ID0gMDsKKwl9CisKKwkvKiBub3cga2lsbCBiYW5rIDExICovCisJbWVtY3RsLT5tZW1jX2JyMTEgPSAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAhZGVmaW5lZChDT05GSUdfSEFWRV9PV05fUkVTRVQpCitpbnQKK2RvX3Jlc2V0IChjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdWxvbmcgbXNyLCBhZGRyOworCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisKKwlpbW1hcC0+aW1fY2xrcnN0LmNhcl9ybXIgPSBSTVJfQ1NSRTsJLyogQ2hlY2tzdG9wIFJlc2V0IGVuYWJsZSAqLworCisJLyogSW50ZXJydXB0cyBhbmQgTU1VIG9mZiAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgibWZtc3IgICAgJTAiOiI9ciIgKG1zcik6KTsKKworCW1zciAmPSB+KE1TUl9NRSB8IE1TUl9FRSB8IE1TUl9JUiB8IE1TUl9EUik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtdG1zciAgICAlMCI6OiJyIiAobXNyKSk7CisKKwkvKgorCSAqIFRyeWluZyB0byBleGVjdXRlIHRoZSBuZXh0IGluc3RydWN0aW9uIGF0IGEgbm9uLWV4aXN0aW5nIGFkZHJlc3MKKwkgKiBzaG91bGQgY2F1c2UgYSBtYWNoaW5lIGNoZWNrLCByZXN1bHRpbmcgaW4gcmVzZXQKKwkgKi8KKyNpZmRlZiBDT05GSUdfU1lTX1JFU0VUX0FERFJFU1MKKwlhZGRyID0gQ09ORklHX1NZU19SRVNFVF9BRERSRVNTOworI2Vsc2UKKwkvKgorCSAqIG5vdGU6IHdoZW4gQ09ORklHX1NZU19NT05JVE9SX0JBU0UgcG9pbnRzIHRvIGEgUkFNIGFkZHJlc3MsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFCisJICogLSBzaXplb2YgKHVsb25nKSBpcyB1c3VhbGx5IGEgdmFsaWQgYWRkcmVzcy4gQmV0dGVyIHBpY2sgYW4gYWRkcmVzcworCSAqIGtub3duIHRvIGJlIGludmFsaWQgb24geW91ciBzeXN0ZW0gYW5kIGFzc2lnbiBpdCB0byBDT05GSUdfU1lTX1JFU0VUX0FERFJFU1MuCisJICovCisJYWRkciA9IENPTkZJR19TWVNfTU9OSVRPUl9CQVNFIC0gc2l6ZW9mICh1bG9uZyk7CisjZW5kaWYKKwkoKHZvaWQgKCopKHZvaWQpKSBhZGRyKSAoKTsKKwlyZXR1cm4gMTsKKworfQorI2VuZGlmCS8qIENPTkZJR19IQVZFX09XTl9SRVNFVCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBHZXQgdGltZWJhc2UgY2xvY2sgZnJlcXVlbmN5IChsaWtlIGNwdV9jbGsgaW4gSHopCisgKgorICovCit1bnNpZ25lZCBsb25nIGdldF90YmNsayAodm9pZCkKK3sKKwl1bG9uZyB0YmNsazsKKworCXRiY2xrID0gKGdkLT5idXNfY2xrICsgM0wpIC8gNEw7CisKKwlyZXR1cm4gKHRiY2xrKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCit2b2lkIHdhdGNoZG9nX3Jlc2V0ICh2b2lkKQoreworCWludCByZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwlyZXNldF84MjYwX3dhdGNoZG9nICgoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVIpOworCWlmIChyZV9lbmFibGUpCisJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOworfQorI2VuZGlmIC8qIENPTkZJR19XQVRDSERPRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKSAmJiBkZWZpbmVkIChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCit2b2lkIGZ0X2NwdV9zZXR1cCAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfSEFTX0VUSDApIHx8IGRlZmluZWQoQ09ORklHX0hBU19FVEgxKSB8fFwKKyAgICBkZWZpbmVkKENPTkZJR19IQVNfRVRIMikgfHwgZGVmaW5lZChDT05GSUdfSEFTX0VUSDMpCisJZmR0X2ZpeHVwX2V0aGVybmV0KGJsb2IpOworI2VuZGlmCisKKwlkb19maXh1cF9ieV9jb21wYXRfdTMyKGJsb2IsICJmc2wsY3BtMi1icmciLAorCQkJICAgICAgICJjbG9jay1mcmVxdWVuY3kiLCBiZC0+YmlfYnJnZnJlcSwgMSk7CisKKwlkb19maXh1cF9ieV9wcm9wX3UzMihibG9iLCAiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNCwKKwkJImJ1cy1mcmVxdWVuY3kiLCBiZC0+YmlfYnVzZnJlcSwgMSk7CisJZG9fZml4dXBfYnlfcHJvcF91MzIoYmxvYiwgImRldmljZV90eXBlIiwgImNwdSIsIDQsCisJCSJ0aW1lYmFzZS1mcmVxdWVuY3kiLCBPRl9UQkNMSywgMSk7CisJZG9fZml4dXBfYnlfcHJvcF91MzIoYmxvYiwgImRldmljZV90eXBlIiwgImNwdSIsIDQsCisJCSJjbG9jay1mcmVxdWVuY3kiLCBiZC0+YmlfaW50ZnJlcSwgMSk7CisJZmR0X2ZpeHVwX21lbW9yeShibG9iLCAodTY0KWJkLT5iaV9tZW1zdGFydCwgKHU2NCliZC0+YmlfbWVtc2l6ZSk7Cit9CisjZW5kaWYgLyogQ09ORklHX09GX0xJQkZEVCAqLworCisvKgorICogSW5pdGlhbGl6ZXMgb24tY2hpcCBldGhlcm5ldCBjb250cm9sbGVycy4KKyAqIHRvIG92ZXJyaWRlLCBpbXBsZW1lbnQgYm9hcmRfZXRoX2luaXQoKQorICovCitpbnQgY3B1X2V0aF9pbml0KGJkX3QgKmJpcykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GQ0MpCisJZmVjX2luaXRpYWxpemUoYmlzKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX1NDQykKKwltcGM4Mnh4X3NjY19lbmV0X2luaXRpYWxpemUoYmlzKTsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2NwdV9pbml0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvY3B1X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDUyNzczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2NwdV9pbml0LmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODI2MC5oPgorI2luY2x1ZGUgPGFzbS9jcG1fODI2MC5oPgorI2luY2x1ZGUgPGlvcG9ydHMuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19CT0FSRF9HRVRfQ1BVX0NMS19GKQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYm9hcmRfZ2V0X2NwdV9jbGtfZiAodm9pZCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgY29uZmlnXzgyNjBfaW9wb3J0cyAodm9sYXRpbGUgaW1tYXBfdCAqIGltbXIpCit7CisJaW50IHBvcnRudW07CisKKwlmb3IgKHBvcnRudW0gPSAwOyBwb3J0bnVtIDwgNDsgcG9ydG51bSsrKSB7CisJCXVpbnQgcG1zayA9IDAsCisJCSAgICAgcHBhciA9IDAsCisJCSAgICAgcHNvciA9IDAsCisJCSAgICAgcGRpciA9IDAsCisJCSAgICAgcG9kciA9IDAsCisJCSAgICAgcGRhdCA9IDA7CisJCWlvcF9jb25mX3QgKmlvcGMgPSAoaW9wX2NvbmZfdCAqKSAmIGlvcF9jb25mX3RhYltwb3J0bnVtXVswXTsKKwkJaW9wX2NvbmZfdCAqZWlvcGMgPSBpb3BjICsgMzI7CisJCXVpbnQgbXNrID0gMTsKKworCQkvKgorCQkgKiBOT1RFOgorCQkgKiBpbmRleCAwIHJlZmVycyB0byBwaW4gMzEsCisJCSAqIGluZGV4IDMxIHJlZmVycyB0byBwaW4gMAorCQkgKi8KKwkJd2hpbGUgKGlvcGMgPCBlaW9wYykgeworCQkJaWYgKGlvcGMtPmNvbmYpIHsKKwkJCQlwbXNrIHw9IG1zazsKKwkJCQlpZiAoaW9wYy0+cHBhcikKKwkJCQkJcHBhciB8PSBtc2s7CisJCQkJaWYgKGlvcGMtPnBzb3IpCisJCQkJCXBzb3IgfD0gbXNrOworCQkJCWlmIChpb3BjLT5wZGlyKQorCQkJCQlwZGlyIHw9IG1zazsKKwkJCQlpZiAoaW9wYy0+cG9kcikKKwkJCQkJcG9kciB8PSBtc2s7CisJCQkJaWYgKGlvcGMtPnBkYXQpCisJCQkJCXBkYXQgfD0gbXNrOworCQkJfQorCisJCQltc2sgPDw9IDE7CisJCQlpb3BjKys7CisJCX0KKworCQlpZiAocG1zayAhPSAwKSB7CisJCQl2b2xhdGlsZSBpb3BvcnRfdCAqaW9wID0gaW9wb3J0X2FkZHIgKGltbXIsIHBvcnRudW0pOworCQkJdWludCB0cG1zayA9IH5wbXNrOworCisJCQkvKgorCQkJICogdGhlIChzb21ld2hhdCBjb25mdXNlZCkgcGFyYWdyYXBoIGF0IHRoZQorCQkJICogYm90dG9tIG9mIHBhZ2UgMzUtNSB3YXJucyB0aGF0IHRoZXJlIG1pZ2h0CisJCQkgKiBiZSAidW5rbm93biBiZWhhdmlvdXIiIHdoZW4gcHJvZ3JhbW1pbmcKKwkJCSAqIFBTT1J4IGFuZCBQRElSeCwgaWYgUFBBUnggPSAxLCBzbyBJCisJCQkgKiBkZWNpZGVkIHRoaXMgbWVhbnQgSSBoYWQgdG8gZGlzYWJsZSB0aGUKKwkJCSAqIGRlZGljYXRlZCBmdW5jdGlvbiBmaXJzdCwgYW5kIGVuYWJsZSBpdAorCQkJICogbGFzdC4KKwkJCSAqLworCQkJaW9wLT5wcGFyICY9IHRwbXNrOworCQkJaW9wLT5wc29yID0gKGlvcC0+cHNvciAmIHRwbXNrKSB8IHBzb3I7CisJCQlpb3AtPnBvZHIgPSAoaW9wLT5wb2RyICYgdHBtc2spIHwgcG9kcjsKKwkJCWlvcC0+cGRhdCA9IChpb3AtPnBkYXQgJiB0cG1zaykgfCBwZGF0OworCQkJaW9wLT5wZGlyID0gKGlvcC0+cGRpciAmIHRwbXNrKSB8IHBkaXI7CisJCQlpb3AtPnBwYXIgfD0gcHBhcjsKKwkJfQorCX0KK30KKworI2RlZmluZSBTRVRfVkFMX01BU0soYSwgYiwgbWFzaykgKChhICYgbWFzaykgfCAoYiAmIH5tYXNrKSkKKy8qCisgKiBCcmVhdGggc29tZSBsaWZlIGludG8gdGhlIENQVS4uLgorICoKKyAqIFNldCB1cCB0aGUgbWVtb3J5IG1hcCwKKyAqIGluaXRpYWxpemUgYSBidW5jaCBvZiByZWdpc3RlcnMsCisgKiBpbml0aWFsaXplIHRoZSBVUE0ncworICovCit2b2lkIGNwdV9pbml0X2YgKHZvbGF0aWxlIGltbWFwX3QgKiBpbW1yKQoreworI2lmICFkZWZpbmVkKENPTkZJR19DT0dFTlQpCQkvKiBkb25lIGluIHN0YXJ0LlMgZm9yIHRoZSBjb2dlbnQgKi8KKwl1aW50IHNjY3I7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19CT0FSRF9HRVRfQ1BVX0NMS19GKQorCXVuc2lnbmVkIGxvbmcgY3B1X2NsazsKKyNlbmRpZgorCXZvbGF0aWxlIG1lbWN0bDgyNjBfdCAqbWVtY3RsID0gJmltbXItPmltX21lbWN0bDsKKwlleHRlcm4gdm9pZCBtODI2MF9jcG1fcmVzZXQgKHZvaWQpOworCisJLyogUG9pbnRlciBpcyB3cml0YWJsZSBzaW5jZSB3ZSBhbGxvY2F0ZWQgYSByZWdpc3RlciBmb3IgaXQgKi8KKwlnZCA9IChnZF90ICopIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgKyBDT05GSUdfU1lTX0dCTF9EQVRBX09GRlNFVCk7CisKKwkvKiBDbGVhciBpbml0aWFsIGdsb2JhbCBkYXRhICovCisJbWVtc2V0ICgodm9pZCAqKSBnZCwgMCwgc2l6ZW9mIChnZF90KSk7CisKKwkvKiBSU1IgLSBSZXNldCBTdGF0dXMgUmVnaXN0ZXIgLSBjbGVhciBhbGwgc3RhdHVzICg1LTQpICovCisJZ2QtPnJlc2V0X3N0YXR1cyA9IGltbXItPmltX2Nsa3JzdC5jYXJfcnNyOworCWltbXItPmltX2Nsa3JzdC5jYXJfcnNyID0gUlNSX0FMTEJJVFM7CisKKwkvKiBSTVIgLSBSZXNldCBNb2RlIFJlZ2lzdGVyIC0gY29udGFpbnMgY2hlY2tzdG9wIHJlc2V0IGVuYWJsZSAoNS01KSAqLworCWltbXItPmltX2Nsa3JzdC5jYXJfcm1yID0gQ09ORklHX1NZU19STVI7CisKKwkvKiBCQ1IgLSBCdXMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoNC0yNSkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQkNSXzYweCkgJiYgKENPTkZJR19TWVNfQkNSX1NJTkdMRSkKKwlpZiAoaW1tci0+aW1fc2l1X2NvbmYuc2NfYmNyICYgQkNSX0VCTSkgeworCQlpbW1yLT5pbV9zaXVfY29uZi5zY19iY3IgPSBTRVRfVkFMX01BU0soaW1tci0+aW1fc2l1X2NvbmYuc2NfYmNyLCBDT05GSUdfU1lTX0JDUl82MHgsIDB4ODAwMDAwMTApOworCX0gZWxzZSB7CisJCWltbXItPmltX3NpdV9jb25mLnNjX2JjciA9IFNFVF9WQUxfTUFTSyhpbW1yLT5pbV9zaXVfY29uZi5zY19iY3IsIENPTkZJR19TWVNfQkNSX1NJTkdMRSwgMHg4MDAwMDAxMCk7CisJfQorI2Vsc2UKKwlpbW1yLT5pbV9zaXVfY29uZi5zY19iY3IgPSBDT05GSUdfU1lTX0JDUjsKKyNlbmRpZgorCisJLyogU0lVTUNSIC0gY29udGFpbnMgZGVidWcgcGluIGNvbmZpZ3VyYXRpb24gKDQtMzEpICovCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX1NJVU1DUl9MT1cpICYmIChDT05GSUdfU1lTX1NJVU1DUl9ISUdIKQorCWNwdV9jbGsgPSBib2FyZF9nZXRfY3B1X2Nsa19mICgpOworCWlmIChjcHVfY2xrID49IDEwMDAwMDAwMCkgeworCQlpbW1yLT5pbV9zaXVfY29uZi5zY19zaXVtY3IgPSBTRVRfVkFMX01BU0soaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyLCBDT05GSUdfU1lTX1NJVU1DUl9ISUdILCAweDlmM2NjMDAwKTsKKwl9IGVsc2UgeworCQlpbW1yLT5pbV9zaXVfY29uZi5zY19zaXVtY3IgPSBTRVRfVkFMX01BU0soaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyLCBDT05GSUdfU1lTX1NJVU1DUl9MT1csIDB4OWYzY2MwMDApOworCX0KKyNlbHNlCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyID0gQ09ORklHX1NZU19TSVVNQ1I7CisjZW5kaWYKKworCWNvbmZpZ184MjYwX2lvcG9ydHMgKGltbXIpOworCisJLyogaW5pdGlhbGl6ZSB0aW1lIGNvdW50ZXIgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVyICg0LTQwKSAqLworCWltbXItPmltX3NpdC5zaXRfdG1jbnRzYyA9IENPTkZJR19TWVNfVE1DTlRTQzsKKworCS8qIGluaXRpYWxpemUgdGhlIFBJVCAoNC00MikgKi8KKwlpbW1yLT5pbV9zaXQuc2l0X3Bpc2NyID0gQ09ORklHX1NZU19QSVNDUjsKKworI2lmICFkZWZpbmVkKENPTkZJR19DT0dFTlQpCQkvKiBkb25lIGluIHN0YXJ0LlMgZm9yIHRoZSBjb2dlbnQgKi8KKwkvKiBTeXN0ZW0gY2xvY2sgY29udHJvbCByZWdpc3RlciAoOS04KSAqLworCXNjY3IgPSBpbW1yLT5pbV9jbGtyc3QuY2FyX3NjY3IgJgorCQkoU0NDUl9QQ0lfTU9ERSB8IFNDQ1JfUENJX01PRENLIHwgU0NDUl9QQ0lERl9NU0spOworCWltbXItPmltX2Nsa3JzdC5jYXJfc2NjciA9IHNjY3IgfAorCQkoQ09ORklHX1NZU19TQ0NSICYgfihTQ0NSX1BDSV9NT0RFIHwgU0NDUl9QQ0lfTU9EQ0sgfCBTQ0NSX1BDSURGX01TSykgKTsKKyNlbmRpZiAvKiAhQ09ORklHX0NPR0VOVCAqLworCisJLyoKKwkgKiBNZW1vcnkgQ29udHJvbGxlcjoKKwkgKi8KKworCS8qIE1hcCBiYW5rcyAwIGFuZCAxIHRvIHRoZSBGTEFTSCBiYW5rcyAwIGFuZCAxIGF0IHByZWxpbWluYXJ5CisJICogYWRkcmVzc2VzIC0gdGhlc2UgaGF2ZSB0byBiZSBtb2RpZmllZCBsYXRlciB3aGVuIEZMQVNIIHNpemUKKwkgKiBoYXMgYmVlbiBkZXRlcm1pbmVkCisJICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1IwX1JFTUFQKQorCW1lbWN0bC0+bWVtY19vcjAgPSBDT05GSUdfU1lTX09SMF9SRU1BUDsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19PUjFfUkVNQVApCisJbWVtY3RsLT5tZW1jX29yMSA9IENPTkZJR19TWVNfT1IxX1JFTUFQOworI2VuZGlmCisKKwkvKiBub3cgcmVzdHJpY3QgdG8gcHJlbGltaW5hcnkgcmFuZ2UgKi8KKwkvKiB0aGUgUFMgY2FtZSBmcm9tIHRoZSBIUkNXLCBkb260dCBjaGFuZ2UgaXQgKi8KKwltZW1jdGwtPm1lbWNfYnIwID0gU0VUX1ZBTF9NQVNLKG1lbWN0bC0+bWVtY19icjAgLCBDT05GSUdfU1lTX0JSMF9QUkVMSU0sIEJSeF9QU19NU0spOworCW1lbWN0bC0+bWVtY19vcjAgPSBDT05GSUdfU1lTX09SMF9QUkVMSU07CisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIxX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SMV9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yMSA9IENPTkZJR19TWVNfT1IxX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIxID0gQ09ORklHX1NZU19CUjFfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIyX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SMl9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yMiA9IENPTkZJR19TWVNfT1IyX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIyID0gQ09ORklHX1NZU19CUjJfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIzX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SM19QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yMyA9IENPTkZJR19TWVNfT1IzX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIzID0gQ09ORklHX1NZU19CUjNfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI0X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SNF9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNCA9IENPTkZJR19TWVNfT1I0X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI0ID0gQ09ORklHX1NZU19CUjRfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI1X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SNV9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNSA9IENPTkZJR19TWVNfT1I1X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI1ID0gQ09ORklHX1NZU19CUjVfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI2X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SNl9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNiA9IENPTkZJR19TWVNfT1I2X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI2ID0gQ09ORklHX1NZU19CUjZfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI3X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SN19QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNyA9IENPTkZJR19TWVNfT1I3X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI3ID0gQ09ORklHX1NZU19CUjdfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI4X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SOF9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yOCA9IENPTkZJR19TWVNfT1I4X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI4ID0gQ09ORklHX1NZU19CUjhfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI5X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SOV9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yOSA9IENPTkZJR19TWVNfT1I5X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI5ID0gQ09ORklHX1NZU19CUjlfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIxMF9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjEwX1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3IxMCA9IENPTkZJR19TWVNfT1IxMF9QUkVMSU07CisJbWVtY3RsLT5tZW1jX2JyMTAgPSBDT05GSUdfU1lTX0JSMTBfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIxMV9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjExX1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3IxMSA9IENPTkZJR19TWVNfT1IxMV9QUkVMSU07CisJbWVtY3RsLT5tZW1jX2JyMTEgPSBDT05GSUdfU1lTX0JSMTFfUFJFTElNOworI2VuZGlmCisKKwltODI2MF9jcG1fcmVzZXQgKCk7Cit9CisKKy8qCisgKiBpbml0aWFsaXplIGhpZ2hlciBsZXZlbCBwYXJ0cyBvZiBDUFUgbGlrZSB0aW1lIGJhc2UgYW5kIHRpbWVycworICovCitpbnQgY3B1X2luaXRfciAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgZ2QtPmJkLT5iaV9pbW1yX2Jhc2U7CisKKwlpbW1yLT5pbV9jcG0uY3BfcmNjciA9IENPTkZJR19TWVNfUkNDUjsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBwcmludCBvdXQgdGhlIHJlYXNvbiBmb3IgdGhlIHJlc2V0CisgKi8KK2ludCBwcnRfODI2MF9yc3IgKHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCXVsb25nIG1hc2s7CisJCWNoYXIgKmRlc2M7CisJfSBiaXRzW10gPSB7CisJCXsKKwkJUlNSX0pUUlMsICJKVEFHIn0sIHsKKwkJUlNSX0NTUlMsICJDaGVjayBTdG9wIn0sIHsKKwkJUlNSX1NXUlMsICJTb2Z0d2FyZSBXYXRjaGRvZyJ9LCB7CisJCVJTUl9CTVJTLCAiQnVzIE1vbml0b3IifSwgeworCQlSU1JfRVNSUywgIkV4dGVybmFsIFNvZnQifSwgeworCQlSU1JfRUhSUywgIkV4dGVybmFsIEhhcmQifQorCX07CisJc3RhdGljIGludCBuID0gc2l6ZW9mIGJpdHMgLyBzaXplb2YgYml0c1swXTsKKwl1bG9uZyByc3IgPSBnZC0+cmVzZXRfc3RhdHVzOworCWludCBpOworCWNoYXIgKnNlcDsKKworCXB1dHMgKENQVV9JRF9TVFIgIiBSZXNldCBTdGF0dXM6Iik7CisKKwlzZXAgPSAiICI7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJaWYgKHJzciAmIGJpdHNbaV0ubWFzaykgeworCQkJcHJpbnRmICgiJXMlcyIsIHNlcCwgYml0c1tpXS5kZXNjKTsKKwkJCXNlcCA9ICIsICI7CisJCX0KKworCXB1dHMgKCJcblxuIik7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9ldGhlcl9mY2MuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9ldGhlcl9mY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWMwMmEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2V0aGVyX2ZjYy5jCkBAIC0wLDAgKzEsMTE5MCBAQAorLyoKKyAqIE1QQzgyNjAgRkNDIEZhc3QgRXRoZXJuZXQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgIERhbiBNYWxlayAoZG1hbGVrQGpsYy5uZXQpCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBNUEM4MjYwIEZDQyBGYXN0IEV0aGVybmV0CisgKiBCYXNpYyBFVCBIVyBpbml0aWFsaXphdGlvbiBhbmQgcGFja2V0IFJYL1RYIHJvdXRpbmVzCisgKgorICogVGhpcyBjb2RlIHdpbGwgbm90IHBlcmZvcm0gdGhlIElPIHBvcnQgY29uZmlndXJhdGlvbi4gVGhpcyBzaG91bGQgYmUKKyAqIGRvbmUgaW4gdGhlIGlvcF9jb25mX3Qgc3RydWN0dXJlIHNwZWNpZmljIGZvciB0aGUgYm9hcmQuCisgKgorICogVE9ETzoKKyAqIGFkZCBhIFBIWSBkcml2ZXIgdG8gZG8gdGhlIG5lZ290aWF0aW9uCisgKiByZWZsZWN0IG5lZ290aWF0aW9uIHJlc3VsdHMgaW4gRlBTTVIKKyAqIGxvb2sgZm9yIHdheXMgdG8gY29uZmlndXJlIHRoZSBib2FyZCBzcGVjaWZpYyBzdHVmZiBlbHNld2hlcmUsIGVnLgorICogICAgY29uZmlnX3h4eC5oIG9yIHRoZSBib2FyZCBkaXJlY3RvcnkKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2NwbV84MjYwLmg+CisjaW5jbHVkZSA8bXBjODI2MC5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKKyNpbmNsdWRlIDxtaWlwaHkuaD4KKyNlbmRpZgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykgJiYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgXAorCWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKKworc3RhdGljIHN0cnVjdCBldGhlcl9mY2NfaW5mb19zCit7CisJaW50IGV0aGVyX2luZGV4OworCWludCBwcm9mZl9lbmV0OworCXVsb25nIGNwbV9jcl9lbmV0X3NibG9jazsKKwl1bG9uZyBjcG1fY3JfZW5ldF9wYWdlOworCXVsb25nIGNteGZjcl9tYXNrOworCXVsb25nIGNteGZjcl92YWx1ZTsKK30KKwlldGhlcl9mY2NfaW5mb1tdID0KK3sKKyNpZmRlZiBDT05GSUdfRVRIRVJfT05fRkNDMQoreworCTAsCisJUFJPRkZfRkNDMSwKKwlDUE1fQ1JfRkNDMV9TQkxPQ0ssCisJQ1BNX0NSX0ZDQzFfUEFHRSwKKwlDT05GSUdfU1lTX0NNWEZDUl9NQVNLMSwKKwlDT05GSUdfU1lTX0NNWEZDUl9WQUxVRTEKK30sCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MyCit7CisJMSwKKwlQUk9GRl9GQ0MyLAorCUNQTV9DUl9GQ0MyX1NCTE9DSywKKwlDUE1fQ1JfRkNDMl9QQUdFLAorCUNPTkZJR19TWVNfQ01YRkNSX01BU0syLAorCUNPTkZJR19TWVNfQ01YRkNSX1ZBTFVFMgorfSwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VUSEVSX09OX0ZDQzMKK3sKKwkyLAorCVBST0ZGX0ZDQzMsCisJQ1BNX0NSX0ZDQzNfU0JMT0NLLAorCUNQTV9DUl9GQ0MzX1BBR0UsCisJQ09ORklHX1NZU19DTVhGQ1JfTUFTSzMsCisJQ09ORklHX1NZU19DTVhGQ1JfVkFMVUUzCit9LAorI2VuZGlmCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1heGltdW0gaW5wdXQgRE1BIHNpemUuICBNdXN0IGJlIGEgc2hvdWxkKD8pIGJlIGEgbXVsdGlwbGUgb2YgNC4gKi8KKyNkZWZpbmUgUEtUX01BWERNQV9TSVpFICAgICAgICAgMTUyMAorCisvKiBUaGUgRkNDIHN0b3JlcyBkZXN0L3NyYy90eXBlLCBkYXRhLCBhbmQgY2hlY2tzdW0gZm9yIHJlY2VpdmUgcGFja2V0cy4gKi8KKyNkZWZpbmUgUEtUX01BWEJVRl9TSVpFICAgICAgICAgMTUxOAorI2RlZmluZSBQS1RfTUlOQlVGX1NJWkUgICAgICAgICA2NAorCisvKiBNYXhpbXVtIGlucHV0IGJ1ZmZlciBzaXplLiAgTXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLiAqLworI2RlZmluZSBQS1RfTUFYQkxSX1NJWkUgICAgICAgICAxNTM2CisKKyNkZWZpbmUgVE9VVF9MT09QIDEwMDAwMDAKKworI2RlZmluZSBUWF9CVUZfQ05UIDIKKyNpZmRlZiBfX0dOVUNfXworc3RhdGljIGNoYXIgdHhidWZbVFhfQlVGX0NOVF1bUEtUX01BWEJMUl9TSVpFXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOworI2Vsc2UKKyNlcnJvciAidHhidWYgbXVzdCBiZSA2NC1iaXQgYWxpZ25lZCIKKyNlbmRpZgorCitzdGF0aWMgdWludCByeElkeDsJLyogaW5kZXggb2YgdGhlIGN1cnJlbnQgUlggYnVmZmVyICovCitzdGF0aWMgdWludCB0eElkeDsJLyogaW5kZXggb2YgdGhlIGN1cnJlbnQgVFggYnVmZmVyICovCisKKy8qCisgKiBGQ0MgRXRoZXJuZXQgVHggYW5kIFJ4IGJ1ZmZlciBkZXNjcmlwdG9ycy4KKyAqIFByb3ZpZGUgZm9yIERvdWJsZSBCdWZmZXJpbmcKKyAqIE5vdGU6IFBLVEJVRlNSWCBpcyBkZWZpbmVkIGluIG5ldC5oCisgKi8KKwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgcnR4YmQgeworICAgIGNiZF90IHJ4YmRbUEtUQlVGU1JYXTsKKyAgICBjYmRfdCB0eGJkW1RYX0JVRl9DTlRdOworfSBSVFhCRDsKKworLyogIEdvb2QgbmV3czogdGhlIEZDQyBzdXBwb3J0cyBleHRlcm5hbCBCRHMhICovCisjaWZkZWYgX19HTlVDX18KK3N0YXRpYyBSVFhCRCBydHggX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKKyNlbHNlCisjZXJyb3IgInJ0eCBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgZmVjX3NlbmQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworICAgIGludCBpOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgaWYgKGxlbmd0aCA8PSAwKSB7CisJcHJpbnRmKCJmZWM6IGJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIGxlbmd0aCk7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgZm9yKGk9MDsgcnR4LnR4YmRbdHhJZHhdLmNiZF9zYyAmIEJEX0VORVRfVFhfUkVBRFk7IGkrKykgeworCWlmIChpID49IFRPVVRfTE9PUCkgeworCSAgICBwdXRzICgiZmVjOiB0eCBidWZmZXIgbm90IHJlYWR5XG4iKTsKKwkgICAgZ290byBvdXQ7CisJfQorICAgIH0KKworICAgIHJ0eC50eGJkW3R4SWR4XS5jYmRfYnVmYWRkciA9ICh1aW50KXBhY2tldDsKKyAgICBydHgudHhiZFt0eElkeF0uY2JkX2RhdGxlbiA9IGxlbmd0aDsKKyAgICBydHgudHhiZFt0eElkeF0uY2JkX3NjIHw9IChCRF9FTkVUX1RYX1JFQURZIHwgQkRfRU5FVF9UWF9MQVNUIHwKKwkJCSAgICAgICBCRF9FTkVUX1RYX1dSQVApOworCisgICAgZm9yKGk9MDsgcnR4LnR4YmRbdHhJZHhdLmNiZF9zYyAmIEJEX0VORVRfVFhfUkVBRFk7IGkrKykgeworCWlmIChpID49IFRPVVRfTE9PUCkgeworCSAgICBwdXRzICgiZmVjOiB0eCBlcnJvclxuIik7CisJICAgIGdvdG8gb3V0OworCX0KKyAgICB9CisKKyNpZmRlZiBFVF9ERUJVRworICAgIHByaW50ZigiY3ljbGVzOiAlZCBzdGF0dXM6ICUwNHhcbiIsIGksIHJ0eC50eGJkW3R4SWR4XS5jYmRfc2MpOworI2VuZGlmCisKKyAgICAvKiByZXR1cm4gb25seSBzdGF0dXMgYml0cyAqLworICAgIHJlc3VsdCA9IHJ0eC50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1NUQVRTOworCitvdXQ6CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBmZWNfcmVjdihzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworICAgIGludCBsZW5ndGg7CisKKyAgICBmb3IgKDs7KQorICAgIHsKKwlpZiAocnR4LnJ4YmRbcnhJZHhdLmNiZF9zYyAmIEJEX0VORVRfUlhfRU1QVFkpIHsKKwkgICAgbGVuZ3RoID0gLTE7CisJICAgIGJyZWFrOyAgICAgLyogbm90aGluZyByZWNlaXZlZCAtIGxlYXZlIGZvcigpIGxvb3AgKi8KKwl9CisJbGVuZ3RoID0gcnR4LnJ4YmRbcnhJZHhdLmNiZF9kYXRsZW47CisKKwlpZiAocnR4LnJ4YmRbcnhJZHhdLmNiZF9zYyAmIDB4MDAzZikgeworCSAgICBwcmludGYoImZlYzogcnggZXJyb3IgJTA0eFxuIiwgcnR4LnJ4YmRbcnhJZHhdLmNiZF9zYyk7CisJfQorCWVsc2UgeworCSAgICAvKiBQYXNzIHRoZSBwYWNrZXQgdXAgdG8gdGhlIHByb3RvY29sIGxheWVycy4gKi8KKwkgICAgTmV0UmVjZWl2ZShOZXRSeFBhY2tldHNbcnhJZHhdLCBsZW5ndGggLSA0KTsKKwl9CisKKworCS8qIEdpdmUgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBGQ0MuICovCisJcnR4LnJ4YmRbcnhJZHhdLmNiZF9kYXRsZW4gPSAwOworCisJLyogd3JhcCBhcm91bmQgYnVmZmVyIGluZGV4IHdoZW4gbmVjZXNzYXJ5ICovCisJaWYgKChyeElkeCArIDEpID49IFBLVEJVRlNSWCkgeworCSAgICBydHgucnhiZFtQS1RCVUZTUlggLSAxXS5jYmRfc2MgPSAoQkRfRU5FVF9SWF9XUkFQIHwgQkRfRU5FVF9SWF9FTVBUWSk7CisJICAgIHJ4SWR4ID0gMDsKKwl9CisJZWxzZSB7CisJICAgIHJ0eC5yeGJkW3J4SWR4XS5jYmRfc2MgPSBCRF9FTkVUX1JYX0VNUFRZOworCSAgICByeElkeCsrOworCX0KKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworCitzdGF0aWMgaW50IGZlY19pbml0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIGJkX3QgKmJpcykKK3sKKyAgICBzdHJ1Y3QgZXRoZXJfZmNjX2luZm9fcyAqIGluZm8gPSBkZXYtPnByaXY7CisgICAgaW50IGk7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworICAgIHZvbGF0aWxlIGNwbTgyNjBfdCAqY3AgPSAmKGltbXItPmltX2NwbSk7CisgICAgZmNjX2VuZXRfdCAqcHJhbV9wdHI7CisgICAgdW5zaWduZWQgbG9uZyBtZW1fYWRkcjsKKworI2lmIDAKKyAgICBtaWlfZGlzY292ZXJfcGh5KCk7CisjZW5kaWYKKworICAgIC8qIDI4LjkgLSAoMS0yKTogaW9wb3J0cyBoYXZlIGJlZW4gc2V0IHVwIGFscmVhZHkgKi8KKworICAgIC8qIDI4LjkgLSAoMyk6IGNvbm5lY3QgRkNDJ3MgdHggYW5kIHJ4IGNsb2NrcyAqLworICAgIGltbXItPmltX2NwbXV4LmNteF91YXIgPSAwOworICAgIGltbXItPmltX2NwbXV4LmNteF9mY3IgPSAoaW1tci0+aW1fY3BtdXguY214X2ZjciAmIH5pbmZvLT5jbXhmY3JfbWFzaykgfAorCQkJCQkJCWluZm8tPmNteGZjcl92YWx1ZTsKKworICAgIC8qIDI4LjkgLSAoNCk6IEdGTVI6IGRpc2FibGUgdHgvcngsIENDSVRUIENSQywgTW9kZSBFdGhlcm5ldCAqLworICAgIGltbXItPmltX2ZjY1tpbmZvLT5ldGhlcl9pbmRleF0uZmNjX2dmbXIgPQorICAgICAgRkNDX0dGTVJfTU9ERV9FTkVUIHwgRkNDX0dGTVJfVENSQ18zMjsKKworICAgIC8qIDI4LjkgLSAoNSk6IEZQU01SOiBlbmFibGUgZnVsbCBkdXBsZXgsIHNlbGVjdCBDQ0lUVCBDUkMgZm9yIEV0aGVybmV0ICovCisgICAgaW1tci0+aW1fZmNjW2luZm8tPmV0aGVyX2luZGV4XS5mY2NfZnBzbXIgPSBDT05GSUdfU1lTX0ZDQ19QU01SIHwgRkNDX1BTTVJfRU5DUkM7CisKKyAgICAvKiAyOC45IC0gKDYpOiBGRFNSOiBFdGhlcm5ldCBTeW4gKi8KKyAgICBpbW1yLT5pbV9mY2NbaW5mby0+ZXRoZXJfaW5kZXhdLmZjY19mZHNyID0gMHhENTU1OworCisgICAgLyogcmVzZXQgaW5kZWNlcyB0byBjdXJyZW50IHJ4L3R4IGJkIChzZWUgZXRoX3NlbmQoKS9ldGhfcngoKSkgKi8KKyAgICByeElkeCA9IDA7CisgICAgdHhJZHggPSAwOworCisgICAgLyogU2V0dXAgUmVjZWl2ZXIgQnVmZmVyIERlc2NyaXB0b3JzICovCisgICAgZm9yIChpID0gMDsgaSA8IFBLVEJVRlNSWDsgaSsrKQorICAgIHsKKyAgICAgIHJ0eC5yeGJkW2ldLmNiZF9zYyA9IEJEX0VORVRfUlhfRU1QVFk7CisgICAgICBydHgucnhiZFtpXS5jYmRfZGF0bGVuID0gMDsKKyAgICAgIHJ0eC5yeGJkW2ldLmNiZF9idWZhZGRyID0gKHVpbnQpTmV0UnhQYWNrZXRzW2ldOworICAgIH0KKyAgICBydHgucnhiZFtQS1RCVUZTUlggLSAxXS5jYmRfc2MgfD0gQkRfRU5FVF9SWF9XUkFQOworCisgICAgLyogU2V0dXAgRXRoZXJuZXQgVHJhbnNtaXR0ZXIgQnVmZmVyIERlc2NyaXB0b3JzICovCisgICAgZm9yIChpID0gMDsgaSA8IFRYX0JVRl9DTlQ7IGkrKykKKyAgICB7CisgICAgICBydHgudHhiZFtpXS5jYmRfc2MgPSAoQkRfRU5FVF9UWF9QQUQgfCBCRF9FTkVUX1RYX0xBU1QgfCBCRF9FTkVUX1RYX1RDKTsKKyAgICAgIHJ0eC50eGJkW2ldLmNiZF9kYXRsZW4gPSAwOworICAgICAgcnR4LnR4YmRbaV0uY2JkX2J1ZmFkZHIgPSAodWludCkmdHhidWZbaV1bMF07CisgICAgfQorICAgIHJ0eC50eGJkW1RYX0JVRl9DTlQgLSAxXS5jYmRfc2MgfD0gQkRfRU5FVF9UWF9XUkFQOworCisgICAgLyogMjguOSAtICg3KTogaW5pdGlhbGlzZSBwYXJhbWV0ZXIgcmFtICovCisgICAgcHJhbV9wdHIgPSAoZmNjX2VuZXRfdCAqKSYoaW1tci0+aW1fZHByYW1iYXNlW2luZm8tPnByb2ZmX2VuZXRdKTsKKworICAgIC8qIGNsZWFyIHdob2xlIHN0cnVjdHVyZSB0byBtYWtlIHN1cmUgYWxsIHJlc2VydmVkIGZpZWxkcyBhcmUgemVybyAqLworICAgIG1lbXNldCgodm9pZCopcHJhbV9wdHIsIDAsIHNpemVvZihmY2NfZW5ldF90KSk7CisKKyAgICAvKgorICAgICAqIGNvbW1vbiBQYXJhbWV0ZXIgUkFNIGFyZWEKKyAgICAgKgorICAgICAqIEFsbG9jYXRlIHNwYWNlIGluIHRoZSByZXNlcnZlZCBGQ0MgYXJlYSBvZiBEUFJBTSBmb3IgdGhlCisgICAgICogaW50ZXJuYWwgYnVmZmVycy4gIE5vIG9uZSB1c2VzIHRoaXMgc3BhY2UgKHlldCksIHNvIHdlCisgICAgICogY2FuIGRvIHRoaXMuICBMYXRlciwgd2Ugd2lsbCBhZGQgcmVzb3VyY2UgbWFuYWdlbWVudCBmb3IKKyAgICAgKiB0aGlzIGFyZWEuCisgICAgICovCisgICAgbWVtX2FkZHIgPSBDUE1fRkNDX1NQRUNJQUxfQkFTRSArICgoaW5mby0+ZXRoZXJfaW5kZXgpICogNjQpOworICAgIHByYW1fcHRyLT5mZW5fZ2VuZmNjLmZjY19yaXB0ciA9IG1lbV9hZGRyOworICAgIHByYW1fcHRyLT5mZW5fZ2VuZmNjLmZjY190aXB0ciA9IG1lbV9hZGRyKzMyOworICAgIC8qCisgICAgICogU2V0IG1heGltdW0gYnl0ZXMgcGVyIHJlY2VpdmUgYnVmZmVyLgorICAgICAqIEl0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi4KKyAgICAgKi8KKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfbXJibHIgPSBQS1RfTUFYQkxSX1NJWkU7CisgICAgcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3JzdGF0ZSA9IChDUE1GQ1JfR0JMIHwgQ1BNRkNSX0VCIHwKKwkJCQkgICAgICAgQ09ORklHX1NZU19DUE1GQ1JfUkFNVFlQRSkgPDwgMjQ7CisgICAgcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3JiYXNlID0gKHVuc2lnbmVkIGludCkoJnJ0eC5yeGJkW3J4SWR4XSk7CisgICAgcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3RzdGF0ZSA9IChDUE1GQ1JfR0JMIHwgQ1BNRkNSX0VCIHwKKwkJCQkgICAgICAgQ09ORklHX1NZU19DUE1GQ1JfUkFNVFlQRSkgPDwgMjQ7CisgICAgcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3RiYXNlID0gKHVuc2lnbmVkIGludCkoJnJ0eC50eGJkW3R4SWR4XSk7CisKKyAgICAvKiBwcm90b2NvbC1zcGVjaWZpYyBhcmVhICovCisgICAgcHJhbV9wdHItPmZlbl9jbWFzayA9IDB4ZGViYjIwZTM7CS8qIENSQyBtYXNrICovCisgICAgcHJhbV9wdHItPmZlbl9jcHJlcyA9IDB4ZmZmZmZmZmY7CS8qIENSQyBwcmVzZXQgKi8KKyAgICBwcmFtX3B0ci0+ZmVuX3JldGxpbSA9IDE1OwkJLyogUmV0cnkgbGltaXQgdGhyZXNob2xkICovCisgICAgcHJhbV9wdHItPmZlbl9tZmxyID0gUEtUX01BWEJVRl9TSVpFOyAgIC8qIG1heGltdW0gZnJhbWUgbGVuZ3RoIHJlZ2lzdGVyICovCisgICAgLyoKKyAgICAgKiBTZXQgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzLgorICAgICAqCisgICAgICogVGhpcyBpcyBzdXBwbGllZCBpbiB0aGUgYm9hcmQgaW5mb3JtYXRpb24gc3RydWN0dXJlLCBzbyB3ZQorICAgICAqIGNvcHkgdGhhdCBpbnRvIHRoZSBjb250cm9sbGVyLgorICAgICAqIFNvLCBmYXIgd2UgaGF2ZSBvbmx5IGJlZW4gZ2l2ZW4gb25lIEV0aGVybmV0IGFkZHJlc3MuIFdlIG1ha2UKKyAgICAgKiBpdCB1bmlxdWUgYnkgc2V0dGluZyBhIGZldyBiaXRzIGluIHRoZSB1cHBlciBieXRlIG9mIHRoZQorICAgICAqIG5vbi1zdGF0aWMgcGFydCBvZiB0aGUgYWRkcmVzcy4KKyAgICAgKi8KKyNkZWZpbmUgZWEgZXRoX2dldF9kZXYoKS0+ZW5ldGFkZHIKKyAgICBwcmFtX3B0ci0+ZmVuX3BhZGRyaCA9IChlYVs1XSA8PCA4KSArIGVhWzRdOworICAgIHByYW1fcHRyLT5mZW5fcGFkZHJtID0gKGVhWzNdIDw8IDgpICsgZWFbMl07CisgICAgcHJhbV9wdHItPmZlbl9wYWRkcmwgPSAoZWFbMV0gPDwgOCkgKyBlYVswXTsKKyN1bmRlZiBlYQorICAgIHByYW1fcHRyLT5mZW5fbWluZmxyID0gUEtUX01JTkJVRl9TSVpFOyAvKiBtaW5pbXVtIGZyYW1lIGxlbmd0aCByZWdpc3RlciAqLworICAgIC8qIHBhZCBwb2ludGVyLiB1c2UgdGlwdHIgc2luY2Ugd2UgZG9uJ3QgbmVlZCBhIHNwZWNpZmljIHBhZGRpbmcgY2hhciAqLworICAgIHByYW1fcHRyLT5mZW5fcGFkcHRyID0gcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3RpcHRyOworICAgIHByYW1fcHRyLT5mZW5fbWF4ZDEgPSBQS1RfTUFYRE1BX1NJWkU7CS8qIG1heGltdW0gRE1BMSBsZW5ndGggKi8KKyAgICBwcmFtX3B0ci0+ZmVuX21heGQyID0gUEtUX01BWERNQV9TSVpFOwkvKiBtYXhpbXVtIERNQTIgbGVuZ3RoICovCisgICAgcHJhbV9wdHItPmZlbl9yZnRociA9IDE7CisgICAgcHJhbV9wdHItPmZlbl9yZmNudCA9IDE7CisjaWYgMAorICAgIHByaW50ZigicHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3JiYXNlICUwOGx4XG4iLAorCXByYW1fcHRyLT5mZW5fZ2VuZmNjLmZjY19yYmFzZSk7CisgICAgcHJpbnRmKCJwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdGJhc2UgJTA4bHhcbiIsCisJcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3RiYXNlKTsKKyNlbmRpZgorCisgICAgLyogMjguOSAtICg4KTogY2xlYXIgb3V0IGV2ZW50cyBpbiBGQ0NFICovCisgICAgaW1tci0+aW1fZmNjW2luZm8tPmV0aGVyX2luZGV4XS5mY2NfZmNjZSA9IH4weDA7CisKKyAgICAvKiAyOC45IC0gKDkpOiBGQ0NNOiBtYXNrIGFsbCBldmVudHMgKi8KKyAgICBpbW1yLT5pbV9mY2NbaW5mby0+ZXRoZXJfaW5kZXhdLmZjY19mY2NtID0gMDsKKworICAgIC8qIDI4LjkgLSAoMTAtMTIpOiB3ZSBkb24ndCB1c2UgZXRoZXJuZXQgaW50ZXJydXB0cyAqLworCisgICAgLyogMjguOSAtICgxMykKKyAgICAgKgorICAgICAqIExldCdzIHJlLWluaXRpYWxpemUgdGhlIGNoYW5uZWwgbm93LiAgV2UgaGF2ZSB0byBkbyBpdCBsYXRlcgorICAgICAqIHRoYW4gdGhlIG1hbnVhbCBkZXNjcmliZXMgYmVjYXVzZSB3ZSBoYXZlIGp1c3Qgbm93IGZpbmlzaGVkCisgICAgICogdGhlIEJEIGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIGNwLT5jcF9jcGNyID0gbWtfY3JfY21kKGluZm8tPmNwbV9jcl9lbmV0X3BhZ2UsCisJCQkgICAgaW5mby0+Y3BtX2NyX2VuZXRfc2Jsb2NrLAorCQkJICAgIDB4MGMsCisJCQkgICAgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisgICAgZG8geworCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKyAgICB9IHdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpOworCisgICAgLyogMjguOSAtICgxNCk6IGVuYWJsZSB0eC9yeCBpbiBnZm1yICovCisgICAgaW1tci0+aW1fZmNjW2luZm8tPmV0aGVyX2luZGV4XS5mY2NfZ2ZtciB8PSBGQ0NfR0ZNUl9FTlQgfCBGQ0NfR0ZNUl9FTlI7CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZmVjX2hhbHQoc3RydWN0IGV0aF9kZXZpY2UqIGRldikKK3sKKyAgICBzdHJ1Y3QgZXRoZXJfZmNjX2luZm9fcyAqIGluZm8gPSBkZXYtPnByaXY7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCisgICAgLyogd3JpdGUgR0ZNUjogZGlzYWJsZSB0eC9yeCAqLworICAgIGltbXItPmltX2ZjY1tpbmZvLT5ldGhlcl9pbmRleF0uZmNjX2dmbXIgJj0KKwkJCQkJCX4oRkNDX0dGTVJfRU5UIHwgRkNDX0dGTVJfRU5SKTsKK30KKworaW50IGZlY19pbml0aWFsaXplKGJkX3QgKmJpcykKK3sKKwlzdHJ1Y3QgZXRoX2RldmljZSogZGV2OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihldGhlcl9mY2NfaW5mbykgLyBzaXplb2YoZXRoZXJfZmNjX2luZm9bMF0pOyBpKyspCisJeworCQlkZXYgPSAoc3RydWN0IGV0aF9kZXZpY2UqKSBtYWxsb2Moc2l6ZW9mICpkZXYpOworCQltZW1zZXQoZGV2LCAwLCBzaXplb2YgKmRldik7CisKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJGQ0MlZCBFVEhFUk5FVCIsCisJCQlldGhlcl9mY2NfaW5mb1tpXS5ldGhlcl9pbmRleCArIDEpOworCQlkZXYtPnByaXYgICA9ICZldGhlcl9mY2NfaW5mb1tpXTsKKwkJZGV2LT5pbml0ICAgPSBmZWNfaW5pdDsKKwkJZGV2LT5oYWx0ICAgPSBmZWNfaGFsdDsKKwkJZGV2LT5zZW5kICAgPSBmZWNfc2VuZDsKKwkJZGV2LT5yZWN2ICAgPSBmZWNfcmVjdjsKKworCQlldGhfcmVnaXN0ZXIoZGV2KTsKKworI2lmIChkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpKSBcCisJCSYmIGRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpCisJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsCisJCQkJYmJfbWlpcGh5X3JlYWQsCWJiX21paXBoeV93cml0ZSk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIENPTkZJR19FVEhFUl9MT09QQkFDS19URVNUCisKKyNkZWZpbmUgRUxCVF9CVUZTWgkxMDI0CS8qIG11c3QgYmUgbXVsdGlwbGUgb2YgMzIgKi8KKworI2RlZmluZSBFTEJUX0NSQ1NaCTQKKworI2RlZmluZSBFTEJUX05SWEJECTQJLyogbXVzdCBiZSBhdCBsZWFzdCAyICovCisjZGVmaW5lIEVMQlRfTlRYQkQJNAorCisjZGVmaW5lIEVMQlRfTUFYUlhFUlIJMzIKKyNkZWZpbmUgRUxCVF9NQVhUWEVSUgkzMgorCisjZGVmaW5lIEVMQlRfQ0xTV0FJVAkxMDAwCS8qIG1zZWMgdG8gd2FpdCBmb3IgZnVydGhlciBpbnB1dCBmcmFtZXMgKi8KKwordHlwZWRlZgorCXN0cnVjdCB7CisJCXVpbnQgb2ZmOworCQljaGFyICpsYWI7CisJfQorZWxidF9wcmRlc2M7CisKK3R5cGVkZWYKKwlzdHJ1Y3QgeworCQl1aW50IF9sLCBfZiwgbSwgYmMsIG1jLCBsZywgbm8sIHNoLCBjciwgb3YsIGNsOworCQl1aW50IGJhZHNyYywgYmFkdHlwLCBiYWRsZW4sIGJhZGJpdDsKKwl9CitlbGJ0X3J4ZWFjYzsKKworc3RhdGljIGVsYnRfcHJkZXNjIHJ4ZWFjY19kZXNjc1tdID0geworCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIF9sKSwJCSJOb3QgTGFzdCBpbiBGcmFtZSIJfSwKKwl7IG9mZnNldG9mKGVsYnRfcnhlYWNjLCBfZiksCQkiTm90IEZpcnN0IGluIEZyYW1lIgl9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIG0pLAkJIkFkZHJlc3MgTWlzcyIJCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgYmMpLAkJIkJyb2FkY2FzdCBBZGRyZXNzIgl9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIG1jKSwJCSJNdWx0aWNhc3QgQWRkcmVzcyIJfSwKKwl7IG9mZnNldG9mKGVsYnRfcnhlYWNjLCBsZyksCQkiRnJhbWUgTGVuZ3RoIFZpb2xhdGlvbiJ9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIG5vKSwJCSJOb24tT2N0ZXQgQWxpZ25tZW50Igl9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIHNoKSwJCSJTaG9ydCBGcmFtZSIJCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgY3IpLAkJIkNSQyBFcnJvciIJCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgb3YpLAkJIk92ZXJydW4iCQl9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIGNsKSwJCSJDb2xsaXNpb24iCQl9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIGJhZHNyYyksCSJCYWQgU3JjIEFkZHJlc3MiCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgYmFkdHlwKSwJIkJhZCBGcmFtZSBUeXBlIgl9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIGJhZGxlbiksCSJCYWQgRnJhbWUgTGVuZ3RoIgl9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIGJhZGJpdCksCSJEYXRhIENvbXBhcmUgRXJyb3JzIgl9LAorfTsKK3N0YXRpYyBpbnQgcnhlYWNjX25kZXNjID0gc2l6ZW9mIChyeGVhY2NfZGVzY3MpIC8gc2l6ZW9mIChyeGVhY2NfZGVzY3NbMF0pOworCit0eXBlZGVmCisJc3RydWN0IHsKKwkJdWludCBkZWYsIGhiLCBsYywgcmwsIHJjLCB1biwgY3NsOworCX0KK2VsYnRfdHhlYWNjOworCitzdGF0aWMgZWxidF9wcmRlc2MgdHhlYWNjX2Rlc2NzW10gPSB7CisJeyBvZmZzZXRvZihlbGJ0X3R4ZWFjYywgZGVmKSwJCSJEZWZlciBJbmRpY2F0aW9uIgl9LAorCXsgb2Zmc2V0b2YoZWxidF90eGVhY2MsIGhiKSwJCSJIZWFydGJlYXQiCQl9LAorCXsgb2Zmc2V0b2YoZWxidF90eGVhY2MsIGxjKSwJCSJMYXRlIENvbGxpc2lvbiIJfSwKKwl7IG9mZnNldG9mKGVsYnRfdHhlYWNjLCBybCksCQkiUmV0cmFuc21pc3Npb24gTGltaXQiCX0sCisJeyBvZmZzZXRvZihlbGJ0X3R4ZWFjYywgcmMpLAkJIlJldHJ5IENvdW50IgkJfSwKKwl7IG9mZnNldG9mKGVsYnRfdHhlYWNjLCB1biksCQkiVW5kZXJydW4iCQl9LAorCXsgb2Zmc2V0b2YoZWxidF90eGVhY2MsIGNzbCksCQkiQ2FycmllciBTZW5zZSBMb3N0Igl9LAorfTsKK3N0YXRpYyBpbnQgdHhlYWNjX25kZXNjID0gc2l6ZW9mICh0eGVhY2NfZGVzY3MpIC8gc2l6ZW9mICh0eGVhY2NfZGVzY3NbMF0pOworCit0eXBlZGVmCisJc3RydWN0IHsKKwkJdWNoYXIgcnhidWZzW0VMQlRfTlJYQkRdW0VMQlRfQlVGU1pdOworCQl1Y2hhciB0eGJ1ZnNbRUxCVF9OVFhCRF1bRUxCVF9CVUZTWl07CisJCWNiZF90IHJ4YmRbRUxCVF9OUlhCRF07CisJCWNiZF90IHR4YmRbRUxCVF9OVFhCRF07CisJCWVudW0geyBJZGxlLCBSdW5uaW5nLCBDbG9zaW5nLCBDbG9zZWQgfSBzdGF0ZTsKKwkJaW50IHByb2ZmLCBwYWdlLCBzYmxvY2s7CisJCXVpbnQgY2xzdGltZSwgbnNlbnQsIG50eGVyciwgbnJjdmQsIG5yeGVycjsKKwkJdXNob3J0IHJ4ZXJyc1tFTEJUX01BWFJYRVJSXSwgdHhlcnJzW0VMQlRfTUFYVFhFUlJdOworCQllbGJ0X3J4ZWFjYyByeGVhY2M7CisJCWVsYnRfdHhlYWNjIHR4ZWFjYzsKKwl9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSkKK2VsYnRfY2hhbjsKKworc3RhdGljIHVjaGFyIHBhdGJ5dGVzW0VMQlRfTlRYQkRdID0geworCTB4ZmYsIDB4YWEsIDB4NTUsIDB4MDAKK307CitzdGF0aWMgdWludCBwYXR3b3Jkc1tFTEJUX05UWEJEXSA9IHsKKwkweGZmZmZmZmZmLCAweGFhYWFhYWFhLCAweDU1NTU1NTU1LCAweDAwMDAwMDAwCit9OworCisjaWZkZWYgX19HTlVDX18KK3N0YXRpYyBlbGJ0X2NoYW4gZWxidF9jaGFuc1szXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOworI2Vsc2UKKyNlcnJvciAiZWxidF9jaGFucyBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkIgorI2VuZGlmCisKKyNkZWZpbmUgQ1BNX0NSX0dSQUNFRlVMX1NUT1BfVFgJKCh1c2hvcnQpMHgwMDA1KQorCitzdGF0aWMgZWxidF9wcmRlc2MgZXByYW1fZGVzY3NbXSA9IHsKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9jcmNlYyksCSJDUkMgRXJyb3JzIgkJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9hbGVjKSwJIkFsaWdubWVudCBFcnJvcnMiCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5fZGlzZmMpLAkiRGlzY2FyZGVkIEZyYW1lcyIJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9vY3RjKSwJIk9jdGV0cyIJCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5fY29sYyksCSJDb2xsaXNpb25zIgkJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9icm9jKSwJIkJyb2FkY2FzdCBGcmFtZXMiCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5fbXVsYyksCSJNdWx0aWNhc3QgRnJhbWVzIgl9LAorCXsgb2Zmc2V0b2YoZmNjX2VuZXRfdCwgZmVuX3VzcGMpLAkiVW5kZXJzaXplIEZyYW1lcyIJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9mcmdjKSwJIkZyYWdtZW50cyIJCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5fb3NwYyksCSJPdmVyc2l6ZSBGcmFtZXMiCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5famJyYyksCSJKYWJiZXJzIgkJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9wNjRjKSwJIjY0IE9jdGV0IEZyYW1lcyIJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9wNjVjKSwJIjY1LTEyNyBPY3RldCBGcmFtZXMiCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5fcDEyOGMpLAkiMTI4LTI1NSBPY3RldCBGcmFtZXMiCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5fcDI1NmMpLAkiMjU2LTUxMSBPY3RldCBGcmFtZXMiCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5fcDUxMmMpLAkiNTEyLTEwMjMgT2N0ZXQgRnJhbWVzIgl9LAorCXsgb2Zmc2V0b2YoZmNjX2VuZXRfdCwgZmVuX3AxMDI0YyksCSIxMDI0LTE1MTggT2N0ZXQgRnJhbWVzIn0sCit9Oworc3RhdGljIGludCBlcHJhbV9uZGVzYyA9IHNpemVvZiAoZXByYW1fZGVzY3MpIC8gc2l6ZW9mIChlcHJhbV9kZXNjc1swXSk7CisKKy8qCisgKiBnaXZlbiBhbiBlbGJ0X3ByZGVzYyBhcnJheSBhbmQgYW4gYXJyYXkgb2YgYmFzZSBhZGRyZXNzZXMsIHByaW50CisgKiBlYWNoIHByZGVzYyBkb3duIHRoZSBzY3JlZW4gd2l0aCB0aGUgdmFsdWVzIGZldGNoZWQgZnJvbSBlYWNoCisgKiBiYXNlIGFkZHJlc3MgYWNyb3NzIHRoZSBzY3JlZW4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2Rlc2MgKGVsYnRfcHJkZXNjIGRlc2NzW10sIGludCBuZGVzYywgdWNoYXIgKmJhc2VzW10sIGludCBuYmFzZSkKK3sKKwllbGJ0X3ByZGVzYyAqZHAgPSBkZXNjcywgKmVkcCA9IGRwICsgbmRlc2M7CisJaW50IGk7CisKKwlwcmludGYgKCIlMzJzIiwgIiIpOworCisJZm9yIChpID0gMDsgaSA8IG5iYXNlOyBpKyspCisJCXByaW50ZiAoIiAgQ2hhbm5lbCAlZCIsIGkpOworCisJcHV0YyAoJ1xuJyk7CisKKwl3aGlsZSAoZHAgPCBlZHApIHsKKworCQlwcmludGYgKCIlLTMycyIsIGRwLT5sYWIpOworCisJCWZvciAoaSA9IDA7IGkgPCBuYmFzZTsgaSsrKSB7CisJCQl1aW50IHZhbCA9ICoodWludCAqKShiYXNlc1tpXSArIGRwLT5vZmYpOworCisJCQlwcmludGYgKCIgJTEwdSIsIHZhbCk7CisJCX0KKworCQlwdXRjICgnXG4nKTsKKworCQlkcCsrOworCX0KK30KKworLyoKKyAqIHJldHVybiBudW1iZXIgb2YgYml0cyB0aGF0IGFyZSBzZXQgaW4gYSB2YWx1ZTsgdmFsdWUgY29udGFpbnMKKyAqIG5iaXRzIChyaWdodC1qdXN0aWZpZWQpIGJpdHMuCisgKi8KK3N0YXRpYyB1aW50IF9faW5saW5lX18KK25icyAodWludCB2YWx1ZSwgdWludCBuYml0cykKK3sKKwl1aW50IGNudCA9IDA7CisjaWYgMQorCXVpbnQgcG9zID0gc2l6ZW9mICh1aW50KSAqIDg7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIlwKKwltdGN0cgklMlxuXAorMToJcmx3bm0uCSUyLCUxLCU0LDMxLDMxXG5cCisJYmVxCTJmXG5cCisJYWRkaQklMCwlMCwxXG5cCisyOglzdWJpCSU0LCU0LDFcblwKKwliZG56CTFiIgorCTogIj1yIihjbnQpCisJOiAiciIodmFsdWUpLCAiciIobmJpdHMpLCAiciIoY250KSwgInIiKHBvcykKKwk6ICJjdHIiLCAiY2MiICk7CisjZWxzZQorCXVpbnQgbWFzayA9IDE7CisKKwlkbyB7CisJCWlmICh2YWx1ZSAmIG1hc2spCisJCQljbnQrKzsKKwkJbWFzayA8PD0gMTsKKwl9IHdoaWxlICgtLW5iaXRzKTsKKyNlbmRpZgorCisJcmV0dXJuIChjbnQpOworfQorCitzdGF0aWMgdWxvbmcKK2JhZGJpdHMgKHVjaGFyICpicCwgaW50IG4sIHVsb25nIHBhdCkKK3sKKwl1bG9uZyAqbHAsIGNudCA9IDA7CisJaW50IG5sOworCisJd2hpbGUgKG4gPiAwICYmICgodWxvbmcpYnAgJiAoc2l6ZW9mICh1bG9uZykgLSAxKSkgIT0gMCkgeworCQl1Y2hhciBkaWZmOworCisJCWRpZmYgPSAqYnArKyBeICh1Y2hhcilwYXQ7CisKKwkJaWYgKGRpZmYpCisJCQljbnQgKz0gbmJzICgodWxvbmcpZGlmZiwgOCk7CisKKwkJbi0tOworCX0KKworCWxwID0gKHVsb25nICopYnA7CisJbmwgPSBuIC8gc2l6ZW9mICh1bG9uZyk7CisJbiAtPSBubCAqIHNpemVvZiAodWxvbmcpOworCisJd2hpbGUgKG5sID4gMCkgeworCQl1bG9uZyBkaWZmOworCisJCWRpZmYgPSAqbHArKyBeIHBhdDsKKworCQlpZiAoZGlmZikKKwkJCWNudCArPSBuYnMgKGRpZmYsIDMyKTsKKworCQlubC0tOworCX0KKworCWJwID0gKHVjaGFyICopbHA7CisKKwl3aGlsZSAobiA+IDApIHsKKwkJdWNoYXIgZGlmZjsKKworCQlkaWZmID0gKmJwKysgXiAodWNoYXIpcGF0OworCisJCWlmIChkaWZmKQorCQkJY250ICs9IG5icyAoKHVsb25nKWRpZmYsIDgpOworCisJCW4tLTsKKwl9CisKKwlyZXR1cm4gKGNudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKK3N3YXAxNiAodW5zaWduZWQgc2hvcnQgeCkKK3sKKwlyZXR1cm4gKCgoeCAmIDB4ZmYpIDw8IDgpIHwgKCh4ICYgMHhmZjAwKSA+PiA4KSk7Cit9CisKKy8qIGJyb2FkY2FzdCBpcyBub3QgYW4gZXJyb3IgLSB3ZSBzZW5kIHRoZW0gbGlrZSB0aGF0ICovCisjZGVmaW5lIEJEX0VORVRfUlhfRVJSUwkoQkRfRU5FVF9SWF9TVEFUUyAmIH5CRF9FTkVUX1JYX0JDKQorCit2b2lkCitldGhfbG9vcGJhY2tfdGVzdCAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgY3BtODI2MF90ICpjcCA9ICYoaW1tci0+aW1fY3BtKTsKKwlpbnQgYywgbmNsb3NlZDsKKwl1bG9uZyBydW50aW1lLCBubXNlYzsKKwl1Y2hhciAqYmFzZXNbM107CisKKwlwdXRzICgiRkNDIEV0aGVybmV0IEV4dGVybmFsIGxvb3BiYWNrIHRlc3RcbiIpOworCisJZXRoX2dldGVudl9lbmV0YWRkcigiZXRoYWRkciIsIE5ldE91ckV0aGVyKTsKKworCS8qCisJICogZ2xvYmFsIGluaXRpYWxpc2F0aW9ucyBmb3IgYWxsIEZDQyBjaGFubmVscworCSAqLworCisJLyogMjguOSAtICgxLTIpOiBpb3BvcnRzIGhhdmUgYmVlbiBzZXQgdXAgYWxyZWFkeSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfSFlNT0QpCisJLyoKKwkgKiBBdHRlbnRpb246IHRoaXMgaXMgYm9hcmQtc3BlY2lmaWMKKwkgKiAwLCBGQ0MxCisJICogMSwgRkNDMgorCSAqIDIsIEZDQzMKKwkgKi8KKyMgICAgICAgZGVmaW5lIEZDQ19TVEFSVF9MT09QIDAKKyMgICAgICAgZGVmaW5lIEZDQ19FTkRfTE9PUCAgIDIKKworCS8qCisJICogQXR0ZW50aW9uOiB0aGlzIGlzIGJvYXJkLXNwZWNpZmljCisJICogLSBGQ0MxIFJ4LUNMSyBpcyBDTEsxMAorCSAqIC0gRkNDMSBUeC1DTEsgaXMgQ0xLMTEKKwkgKiAtIEZDQzIgUngtQ0xLIGlzIENMSzEzCisJICogLSBGQ0MyIFR4LUNMSyBpcyBDTEsxNAorCSAqIC0gRkNDMyBSeC1DTEsgaXMgQ0xLMTUKKwkgKiAtIEZDQzMgVHgtQ0xLIGlzIENMSzE2CisJICovCisKKwkvKiAyOC45IC0gKDMpOiBjb25uZWN0IEZDQydzIHR4IGFuZCByeCBjbG9ja3MgKi8KKwlpbW1yLT5pbV9jcG11eC5jbXhfdWFyID0gMDsKKwlpbW1yLT5pbV9jcG11eC5jbXhfZmNyID0gQ01YRkNSX1JGMUNTX0NMSzEwfENNWEZDUl9URjFDU19DTEsxMXxcCisJICAgIENNWEZDUl9SRjJDU19DTEsxM3xDTVhGQ1JfVEYyQ1NfQ0xLMTR8XAorCSAgICBDTVhGQ1JfUkYzQ1NfQ0xLMTV8Q01YRkNSX1RGM0NTX0NMSzE2OworI2VsaWYgZGVmaW5lZChDT05GSUdfU0JDODI2MCkgfHwgZGVmaW5lZChDT05GSUdfU0FDU25nKQorCS8qCisJICogQXR0ZW50aW9uOiB0aGlzIGlzIGJvYXJkLXNwZWNpZmljCisJICogMSwgRkNDMgorCSAqLworIyAgICAgICBkZWZpbmUgRkNDX1NUQVJUX0xPT1AgMQorIyAgICAgICBkZWZpbmUgRkNDX0VORF9MT09QICAgMQorCisJLyoKKwkgKiBBdHRlbnRpb246IHRoaXMgaXMgYm9hcmQtc3BlY2lmaWMKKwkgKiAtIEZDQzIgUngtQ0xLIGlzIENMSzEzCisJICogLSBGQ0MyIFR4LUNMSyBpcyBDTEsxNAorCSAqLworCisJLyogMjguOSAtICgzKTogY29ubmVjdCBGQ0MncyB0eCBhbmQgcnggY2xvY2tzICovCisJaW1tci0+aW1fY3BtdXguY214X3VhciA9IDA7CisJaW1tci0+aW1fY3BtdXguY214X2ZjciA9IENNWEZDUl9SRjJDU19DTEsxM3xDTVhGQ1JfVEYyQ1NfQ0xLMTQ7CisjZWxzZQorI2Vycm9yICJldGhfbG9vcGJhY2tfdGVzdCBub3Qgc3VwcG9ydGVkIG9uIHlvdXIgYm9hcmQiCisjZW5kaWYKKworCXB1dHMgKCJJbml0aWFsaXNlIEZDQyBjaGFubmVsczoiKTsKKworCWZvciAoYyA9IEZDQ19TVEFSVF9MT09QOyBjIDw9IEZDQ19FTkRfTE9PUDsgYysrKSB7CisJCWVsYnRfY2hhbiAqZWNwID0gJmVsYnRfY2hhbnNbY107CisJCXZvbGF0aWxlIGZjY190ICpmY3AgPSAmaW1tci0+aW1fZmNjW2NdOworCQl2b2xhdGlsZSBmY2NfZW5ldF90ICpmcHA7CisJCWludCBpOworCQl1bG9uZyBhZGRyOworCisJCS8qCisJCSAqIGluaXRpYWxpc2UgY2hhbm5lbCBkYXRhCisJCSAqLworCisJCXByaW50ZiAoIiAlZCIsIGMpOworCisJCW1lbXNldCAoKHZvaWQgKillY3AsIDAsIHNpemVvZiAoKmVjcCkpOworCisJCWVjcC0+c3RhdGUgPSBJZGxlOworCisJCXN3aXRjaCAoYykgeworCisJCWNhc2UgMDogLyogRkNDMSAqLworCQkJZWNwLT5wcm9mZiA9IFBST0ZGX0ZDQzE7CisJCQllY3AtPnBhZ2UgPSBDUE1fQ1JfRkNDMV9QQUdFOworCQkJZWNwLT5zYmxvY2sgPSBDUE1fQ1JfRkNDMV9TQkxPQ0s7CisJCQlicmVhazsKKworCQljYXNlIDE6IC8qIEZDQzIgKi8KKwkJCWVjcC0+cHJvZmYgPSBQUk9GRl9GQ0MyOworCQkJZWNwLT5wYWdlID0gQ1BNX0NSX0ZDQzJfUEFHRTsKKwkJCWVjcC0+c2Jsb2NrID0gQ1BNX0NSX0ZDQzJfU0JMT0NLOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOiAvKiBGQ0MzICovCisJCQllY3AtPnByb2ZmID0gUFJPRkZfRkNDMzsKKwkJCWVjcC0+cGFnZSA9IENQTV9DUl9GQ0MzX1BBR0U7CisJCQllY3AtPnNibG9jayA9IENQTV9DUl9GQ0MzX1NCTE9DSzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogc2V0IHVwIHR4IGJ1ZmZlcnMgYW5kIGJkcworCQkgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgRUxCVF9OVFhCRDsgaSsrKSB7CisJCQljYmRfdCAqYmRwID0gJmVjcC0+dHhiZFtpXTsKKwkJCXVjaGFyICpicCA9ICZlY3AtPnR4YnVmc1tpXVswXTsKKworCQkJYmRwLT5jYmRfYnVmYWRkciA9ICh1aW50KWJwOworCQkJLyogcm9vbSBmb3IgY3JjICovCisJCQliZHAtPmNiZF9kYXRsZW4gPSBFTEJUX0JVRlNaIC0gRUxCVF9DUkNTWjsKKwkJCWJkcC0+Y2JkX3NjID0gQkRfRU5FVF9UWF9SRUFEWSB8IEJEX0VORVRfVFhfUEFEIHwgXAorCQkJCUJEX0VORVRfVFhfTEFTVCB8IEJEX0VORVRfVFhfVEM7CisKKwkJCW1lbXNldCAoKHZvaWQgKilicCwgcGF0Ynl0ZXNbaV0sIEVMQlRfQlVGU1opOworCQkJTmV0U2V0RXRoZXIgKGJwLCBOZXRCY2FzdEFkZHIsIDB4ODAwMCk7CisJCX0KKwkJZWNwLT50eGJkW0VMQlRfTlRYQkQgLSAxXS5jYmRfc2MgfD0gQkRfRU5FVF9UWF9XUkFQOworCisJCS8qCisJCSAqIHNldCB1cCByeCBidWZmZXJzIGFuZCBiZHMKKwkJICovCisKKwkJZm9yIChpID0gMDsgaSA8IEVMQlRfTlJYQkQ7IGkrKykgeworCQkgICAgY2JkX3QgKmJkcCA9ICZlY3AtPnJ4YmRbaV07CisJCSAgICB1Y2hhciAqYnAgPSAmZWNwLT5yeGJ1ZnNbaV1bMF07CisKKwkJICAgIGJkcC0+Y2JkX2J1ZmFkZHIgPSAodWludClicDsKKwkJICAgIGJkcC0+Y2JkX2RhdGxlbiA9IDA7CisJCSAgICBiZHAtPmNiZF9zYyA9IEJEX0VORVRfUlhfRU1QVFk7CisKKwkJICAgIG1lbXNldCAoKHZvaWQgKilicCwgMCwgRUxCVF9CVUZTWik7CisJCX0KKwkJZWNwLT5yeGJkW0VMQlRfTlJYQkQgLSAxXS5jYmRfc2MgfD0gQkRfRU5FVF9SWF9XUkFQOworCisJCS8qCisJCSAqIHNldCB1cCB0aGUgRkNDIGNoYW5uZWwgaGFyZHdhcmUKKwkJICovCisKKwkJLyogMjguOSAtICg0KTogR0ZNUjogZGlzYWJsZSB0eC9yeCwgQ0NJVFQgQ1JDLCBNb2RlIEV0aGVybmV0ICovCisJCWZjcC0+ZmNjX2dmbXIgPSBGQ0NfR0ZNUl9NT0RFX0VORVQgfCBGQ0NfR0ZNUl9UQ1JDXzMyOworCisJCS8qIDI4LjkgLSAoNSk6IEZQU01SOiBmZCwgZW5ldCBDUkMsIFByb21pcywgUk1PTiwgUnggU0hvcnQgKi8KKwkJZmNwLT5mY2NfZnBzbXIgPSBGQ0NfUFNNUl9GREUgfCBGQ0NfUFNNUl9MUEIgfCBcCisJCQlGQ0NfUFNNUl9FTkNSQyB8IEZDQ19QU01SX1BSTyB8IFwKKwkJCUZDQ19QU01SX01PTiB8IEZDQ19QU01SX1JTSDsKKworCQkvKiAyOC45IC0gKDYpOiBGRFNSOiBFdGhlcm5ldCBTeW4gKi8KKwkJZmNwLT5mY2NfZmRzciA9IDB4RDU1NTsKKworCQkvKiAyOS45IC0gKDcpOiBpbml0aWFsaXNlIHBhcmFtZXRlciByYW0gKi8KKwkJZnBwID0gKGZjY19lbmV0X3QgKikmKGltbXItPmltX2RwcmFtYmFzZVtlY3AtPnByb2ZmXSk7CisKKwkJLyogY2xlYXIgd2hvbGUgc3RydWN0IHRvIG1ha2Ugc3VyZSBhbGwgcmVzdiBmaWVsZHMgYXJlIHplcm8gKi8KKwkJbWVtc2V0ICgodm9pZCAqKWZwcCwgMCwgc2l6ZW9mIChmY2NfZW5ldF90KSk7CisKKwkJLyoKKwkJICogY29tbW9uIFBhcmFtZXRlciBSQU0gYXJlYQorCQkgKgorCQkgKiBBbGxvY2F0ZSBzcGFjZSBpbiB0aGUgcmVzZXJ2ZWQgRkNDIGFyZWEgb2YgRFBSQU0gZm9yIHRoZQorCQkgKiBpbnRlcm5hbCBidWZmZXJzLiAgTm8gb25lIHVzZXMgdGhpcyBzcGFjZSAoeWV0KSwgc28gd2UKKwkJICogY2FuIGRvIHRoaXMuICBMYXRlciwgd2Ugd2lsbCBhZGQgcmVzb3VyY2UgbWFuYWdlbWVudCBmb3IKKwkJICogdGhpcyBhcmVhLgorCQkgKi8KKwkJYWRkciA9IENQTV9GQ0NfU1BFQ0lBTF9CQVNFICsgKGMgKiA2NCk7CisJCWZwcC0+ZmVuX2dlbmZjYy5mY2NfcmlwdHIgPSBhZGRyOworCQlmcHAtPmZlbl9nZW5mY2MuZmNjX3RpcHRyID0gYWRkciArIDMyOworCisJCS8qCisJCSAqIFNldCBtYXhpbXVtIGJ5dGVzIHBlciByZWNlaXZlIGJ1ZmZlci4KKwkJICogSXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLgorCQkgKiBidWZmZXJzIGFyZSBpbiA2MHggYnVzIG1lbW9yeS4KKwkJICovCisJCWZwcC0+ZmVuX2dlbmZjYy5mY2NfbXJibHIgPSBQS1RfTUFYQkxSX1NJWkU7CisJCWZwcC0+ZmVuX2dlbmZjYy5mY2NfcnN0YXRlID0gKENQTUZDUl9HQkwgfCBDUE1GQ1JfRUIpIDw8IDI0OworCQlmcHAtPmZlbl9nZW5mY2MuZmNjX3JiYXNlID0gKHVuc2lnbmVkIGludCkoJmVjcC0+cnhiZFswXSk7CisJCWZwcC0+ZmVuX2dlbmZjYy5mY2NfdHN0YXRlID0gKENQTUZDUl9HQkwgfCBDUE1GQ1JfRUIpIDw8IDI0OworCQlmcHAtPmZlbl9nZW5mY2MuZmNjX3RiYXNlID0gKHVuc2lnbmVkIGludCkoJmVjcC0+dHhiZFswXSk7CisKKwkJLyogcHJvdG9jb2wtc3BlY2lmaWMgYXJlYSAqLworCQlmcHAtPmZlbl9jbWFzayA9IDB4ZGViYjIwZTM7CS8qIENSQyBtYXNrICovCisJCWZwcC0+ZmVuX2NwcmVzID0gMHhmZmZmZmZmZjsJLyogQ1JDIHByZXNldCAqLworCQlmcHAtPmZlbl9yZXRsaW0gPSAxNTsJCS8qIFJldHJ5IGxpbWl0IHRocmVzaG9sZCAqLworCQlmcHAtPmZlbl9tZmxyID0gUEtUX01BWEJVRl9TSVpFOy8qIG1heCBmcmFtZSBsZW5ndGggcmVnaXN0ZXIgKi8KKworCQkvKgorCQkgKiBTZXQgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzLgorCQkgKgorCQkgKiBUaGlzIGlzIHN1cHBsaWVkIGluIHRoZSBib2FyZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUsIHNvIHdlCisJCSAqIGNvcHkgdGhhdCBpbnRvIHRoZSBjb250cm9sbGVyLgorCQkgKiBTbywgZmFyIHdlIGhhdmUgb25seSBiZWVuIGdpdmVuIG9uZSBFdGhlcm5ldCBhZGRyZXNzLiBXZSB1c2UKKwkJICogdGhlIHNhbWUgYWRkcmVzcyBmb3IgYWxsIGNoYW5uZWxzCisJCSAqLworI2RlZmluZSBlYSBOZXRPdXJFdGhlcgorCQlmcHAtPmZlbl9wYWRkcmggPSAoZWFbNV0gPDwgOCkgKyBlYVs0XTsKKwkJZnBwLT5mZW5fcGFkZHJtID0gKGVhWzNdIDw8IDgpICsgZWFbMl07CisJCWZwcC0+ZmVuX3BhZGRybCA9IChlYVsxXSA8PCA4KSArIGVhWzBdOworI3VuZGVmIGVhCisKKwkJZnBwLT5mZW5fbWluZmxyID0gUEtUX01JTkJVRl9TSVpFOyAvKiBtaW4gZnJhbWUgbGVuIHJlZ2lzdGVyICovCisJCS8qCisJCSAqIHBhZCBwb2ludGVyLiB1c2UgdGlwdHIgc2luY2Ugd2UgZG9uJ3QgbmVlZAorCQkgKiBhIHNwZWNpZmljIHBhZGRpbmcgY2hhcgorCQkgKi8KKwkJZnBwLT5mZW5fcGFkcHRyID0gZnBwLT5mZW5fZ2VuZmNjLmZjY190aXB0cjsKKwkJZnBwLT5mZW5fbWF4ZDEgPSBQS1RfTUFYRE1BX1NJWkU7CS8qIG1heCBETUExIGxlbmd0aCAqLworCQlmcHAtPmZlbl9tYXhkMiA9IFBLVF9NQVhETUFfU0laRTsJLyogbWF4IERNQTIgbGVuZ3RoICovCisJCWZwcC0+ZmVuX3JmdGhyID0gMTsKKwkJZnBwLT5mZW5fcmZjbnQgPSAxOworCisJCS8qIDI4LjkgLSAoOCk6IGNsZWFyIG91dCBldmVudHMgaW4gRkNDRSAqLworCQlmY3AtPmZjY19mY2NlID0gfjB4MDsKKworCQkvKiAyOC45IC0gKDkpOiBGQ0NNOiBtYXNrIGFsbCBldmVudHMgKi8KKwkJZmNwLT5mY2NfZmNjbSA9IDA7CisKKwkJLyogMjguOSAtICgxMC0xMik6IHdlIGRvbid0IHVzZSBldGhlcm5ldCBpbnRlcnJ1cHRzICovCisKKwkJLyogMjguOSAtICgxMykKKwkJICoKKwkJICogTGV0J3MgcmUtaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbCBub3cuICBXZSBoYXZlIHRvIGRvIGl0IGxhdGVyCisJCSAqIHRoYW4gdGhlIG1hbnVhbCBkZXNjcmliZXMgYmVjYXVzZSB3ZSBoYXZlIGp1c3Qgbm93IGZpbmlzaGVkCisJCSAqIHRoZSBCRCBpbml0aWFsaXphdGlvbi4KKwkJICovCisJCWNwLT5jcF9jcGNyID0gbWtfY3JfY21kIChlY3AtPnBhZ2UsIGVjcC0+c2Jsb2NrLCBcCisJCQkweDBjLCBDUE1fQ1JfSU5JVF9UUlgpIHwgQ1BNX0NSX0ZMRzsKKwkJZG8geworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCQl9IHdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpOworCX0KKworCXB1dHMgKCIgZG9uZVxuU3RhcnRpbmcgdGVzdC4uLiAoQ3RybC1DIHRvIEZpbmlzaClcbiIpOworCisJLyoKKwkgKiBOb3RlOiBkb24ndCB3YW50IHNlcmlhbCBvdXRwdXQgZnJvbSBoZXJlIHVudGlsIHRoZSBlbmQgb2YgdGhlCisJICogdGVzdCAtIHRoZSBkZWxheXMgd291bGQgcHJvYmFibHkgc3R1ZmYgdGhpbmdzIHVwLgorCSAqLworCisJY2xlYXJfY3RybGMgKCk7CisJcnVudGltZSA9IGdldF90aW1lciAoMCk7CisKKwlkbyB7CisJCW5jbG9zZWQgPSAwOworCisJCWZvciAoYyA9IEZDQ19TVEFSVF9MT09QOyBjIDw9IEZDQ19FTkRfTE9PUDsgYysrKSB7CisJCQl2b2xhdGlsZSBmY2NfdCAqZmNwID0gJmltbXItPmltX2ZjY1tjXTsKKwkJCWVsYnRfY2hhbiAqZWNwID0gJmVsYnRfY2hhbnNbY107CisJCQlpbnQgaTsKKworCQkJc3dpdGNoIChlY3AtPnN0YXRlKSB7CisKKwkJCWNhc2UgSWRsZToKKwkJCQkvKgorCQkJCSAqIHNldCB0aGUgY2hhbm5lbCBSdW5uaW5nIC4uLgorCQkJCSAqLworCisJCQkJLyogMjguOSAtICgxNCk6IGVuYWJsZSB0eC9yeCBpbiBnZm1yICovCisJCQkJZmNwLT5mY2NfZ2ZtciB8PSBGQ0NfR0ZNUl9FTlQgfCBGQ0NfR0ZNUl9FTlI7CisKKwkJCQllY3AtPnN0YXRlID0gUnVubmluZzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSdW5uaW5nOgorCQkJCS8qCisJCQkJICogKHdoaWxlIFJ1bm5pbmcgb25seSkgY2hlY2sgZm9yCisJCQkJICogdGVybWluYXRpb24gb2YgdGhlIHRlc3QKKwkJCQkgKi8KKworCQkJCSh2b2lkKWN0cmxjICgpOworCisJCQkJaWYgKGhhZF9jdHJsYyAoKSkgeworCQkJCQkvKgorCQkJCQkgKiBpbml0aWF0ZSBhICJncmFjZWZ1bCBzdG9wIHRyYW5zbWl0IgorCQkJCQkgKiBvbiB0aGUgY2hhbm5lbAorCQkJCQkgKi8KKwkJCQkJY3AtPmNwX2NwY3IgPSBta19jcl9jbWQgKGVjcC0+cGFnZSwgXAorCQkJCQkJZWNwLT5zYmxvY2ssIDB4MGMsIFwKKwkJCQkJCUNQTV9DUl9HUkFDRUZVTF9TVE9QX1RYKSB8IFwKKwkJCQkJCUNQTV9DUl9GTEc7CisJCQkJCWRvIHsKKwkJCQkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKwkJCQkJfSB3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKKworCQkJCQllY3AtPmNsc3RpbWUgPSBnZXRfdGltZXIgKDApOworCQkJCQllY3AtPnN0YXRlID0gQ2xvc2luZzsKKwkJCQl9CisJCQkJLyogZmFsbCB0aHJvdWdoIC4uLiAqLworCisJCQljYXNlIENsb3Npbmc6CisJCQkJLyoKKwkJCQkgKiAod2hpbGUgUnVubmluZyBvciBDbG9zaW5nKSBwb2xsIHRoZSBjaGFubmVsOgorCQkJCSAqIC0gY2hlY2sgZm9yIGFueSBub24tUkVBRFkgdHggYnVmZmVycyBhbmQKKwkJCQkgKiAgIG1ha2UgdGhlbSByZWFkeQorCQkJCSAqIC0gY2hlY2sgZm9yIGFueSBub24tRU1QVFkgcnggYnVmZmVycyBhbmQKKwkJCQkgKiAgIGNoZWNrIHRoYXQgdGhleSB3ZXJlIHJlY2VpdmVkIGNvcnJlY3RseSwKKwkJCQkgKiAgIGFkanVzdCBjb3VudGVycyBldGMsIHRoZW4gbWFrZSBlbXB0eQorCQkJCSAqLworCisJCQkJZm9yIChpID0gMDsgaSA8IEVMQlRfTlRYQkQ7IGkrKykgeworCQkJCQljYmRfdCAqYmRwID0gJmVjcC0+dHhiZFtpXTsKKwkJCQkJdXNob3J0IHNjID0gYmRwLT5jYmRfc2M7CisKKwkJCQkJaWYgKChzYyAmIEJEX0VORVRfVFhfUkVBRFkpICE9IDApCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKgorCQkJCQkgKiB0aGlzIGZyYW1lIGhhcyBmaW5pc2hlZAorCQkJCQkgKiB0cmFuc21pdHRpbmcKKwkJCQkJICovCisJCQkJCWVjcC0+bnNlbnQrKzsKKworCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1RYX1NUQVRTKSB7CisJCQkJCQl1bG9uZyBuOworCisJCQkJCQkvKgorCQkJCQkJICogd2UgaGFkIGFuIGVycm9yIG9uCisJCQkJCQkgKiB0aGUgdHJhbnNtaXNzaW9uCisJCQkJCQkgKi8KKwkJCQkJCW4gPSBlY3AtPm50eGVycisrOworCQkJCQkJaWYgKG4gPCBFTEJUX01BWFRYRVJSKQorCQkJCQkJCWVjcC0+dHhlcnJzW25dID0gc2M7CisKKwkJCQkJCWlmIChzYyAmIEJEX0VORVRfVFhfREVGKQorCQkJCQkJCWVjcC0+dHhlYWNjLmRlZisrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9IQikKKwkJCQkJCQllY3AtPnR4ZWFjYy5oYisrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9MQykKKwkJCQkJCQllY3AtPnR4ZWFjYy5sYysrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9STCkKKwkJCQkJCQllY3AtPnR4ZWFjYy5ybCsrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9SQ01BU0spCisJCQkJCQkJZWNwLT50eGVhY2MucmMrKzsKKwkJCQkJCWlmIChzYyAmIEJEX0VORVRfVFhfVU4pCisJCQkJCQkJZWNwLT50eGVhY2MudW4rKzsKKwkJCQkJCWlmIChzYyAmIEJEX0VORVRfVFhfQ1NMKQorCQkJCQkJCWVjcC0+dHhlYWNjLmNzbCsrOworCisJCQkJCQliZHAtPmNiZF9zYyAmPSBcCisJCQkJCQkJfkJEX0VORVRfVFhfU1RBVFM7CisJCQkJCX0KKworCQkJCQlpZiAoZWNwLT5zdGF0ZSA9PSBDbG9zaW5nKQorCQkJCQkJZWNwLT5jbHN0aW1lID0gZ2V0X3RpbWVyICgwKTsKKworCQkJCQkvKiBtYWtlIGl0IHJlYWR5IGFnYWluICovCisJCQkJCWJkcC0+Y2JkX3NjIHw9IEJEX0VORVRfVFhfUkVBRFk7CisJCQkJfQorCisJCQkJZm9yIChpID0gMDsgaSA8IEVMQlRfTlJYQkQ7IGkrKykgeworCQkJCQljYmRfdCAqYmRwID0gJmVjcC0+cnhiZFtpXTsKKwkJCQkJdXNob3J0IHNjID0gYmRwLT5jYmRfc2MsIG1hc2s7CisKKwkJCQkJaWYgKChzYyAmIEJEX0VORVRfUlhfRU1QVFkpICE9IDApCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiB3ZSBoYXZlIGEgbmV3IGZyYW1lIGluIHRoaXMgYnVmZmVyICovCisJCQkJCWVjcC0+bnJjdmQrKzsKKworCQkJCQltYXNrID0gQkRfRU5FVF9SWF9MQVNUfEJEX0VORVRfUlhfRklSU1Q7CisJCQkJCWlmICgoc2MgJiBtYXNrKSAhPSBtYXNrKSB7CisJCQkJCQkvKiBzb21ldGhpbmdzIHdyb25nIGhlcmUgLi4uICovCisJCQkJCQlpZiAoIShzYyAmIEJEX0VORVRfUlhfTEFTVCkpCisJCQkJCQkJZWNwLT5yeGVhY2MuX2wrKzsKKwkJCQkJCWlmICghKHNjICYgQkRfRU5FVF9SWF9GSVJTVCkpCisJCQkJCQkJZWNwLT5yeGVhY2MuX2YrKzsKKwkJCQkJfQorCisJCQkJCWlmIChzYyAmIEJEX0VORVRfUlhfRVJSUykgeworCQkJCQkJdWxvbmcgbjsKKworCQkJCQkJLyoKKwkJCQkJCSAqIHdlIGhhZCBzb21lIHNvcnQgb2YgZXJyb3IKKwkJCQkJCSAqIG9uIHRoZSBmcmFtZQorCQkJCQkJICovCisJCQkJCQluID0gZWNwLT5ucnhlcnIrKzsKKwkJCQkJCWlmIChuIDwgRUxCVF9NQVhSWEVSUikKKwkJCQkJCQllY3AtPnJ4ZXJyc1tuXSA9IHNjOworCisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX01JU1MpCisJCQkJCQkJZWNwLT5yeGVhY2MubSsrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9CQykKKwkJCQkJCQllY3AtPnJ4ZWFjYy5iYysrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9NQykKKwkJCQkJCQllY3AtPnJ4ZWFjYy5tYysrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9MRykKKwkJCQkJCQllY3AtPnJ4ZWFjYy5sZysrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9OTykKKwkJCQkJCQllY3AtPnJ4ZWFjYy5ubysrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9TSCkKKwkJCQkJCQllY3AtPnJ4ZWFjYy5zaCsrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9DUikKKwkJCQkJCQllY3AtPnJ4ZWFjYy5jcisrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9PVikKKwkJCQkJCQllY3AtPnJ4ZWFjYy5vdisrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9DTCkKKwkJCQkJCQllY3AtPnJ4ZWFjYy5jbCsrOworCisJCQkJCQliZHAtPmNiZF9zYyAmPSBcCisJCQkJCQkJfkJEX0VORVRfUlhfRVJSUzsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCXVzaG9ydCBkYXRsZW4gPSBiZHAtPmNiZF9kYXRsZW47CisJCQkJCQlFdGhlcm5ldF90ICplaHA7CisJCQkJCQl1c2hvcnQgcHJvdDsKKwkJCQkJCWludCBvdXJzLCB0YiwgbiwgbmJ5dGVzOworCisJCQkJCQllaHAgPSAoRXRoZXJuZXRfdCAqKSBcCisJCQkJCQkJJmVjcC0+cnhidWZzW2ldWzBdOworCisJCQkJCQlvdXJzID0gbWVtY21wIChlaHAtPmV0X3NyYywgXAorCQkJCQkJCU5ldE91ckV0aGVyLCA2KTsKKworCQkJCQkJcHJvdCA9IHN3YXAxNiAoZWhwLT5ldF9wcm90bGVuKTsKKwkJCQkJCXRiID0gcHJvdCAmIDB4ODAwMDsKKwkJCQkJCW4gPSBwcm90ICYgMHg3ZmZmOworCisJCQkJCQluYnl0ZXMgPSBFTEJUX0JVRlNaIC0gXAorCQkJCQkJCW9mZnNldG9mIChFdGhlcm5ldF90LCBcCisJCQkJCQkJCWV0X2RzYXApIC0gXAorCQkJCQkJCUVMQlRfQ1JDU1o7CisKKwkJCQkJCS8qIGNoZWNrIHRoZSBmcmFtZSBpcyBjb3JyZWN0ICovCisJCQkJCQlpZiAoZGF0bGVuICE9IEVMQlRfQlVGU1opCisJCQkJCQkJZWNwLT5yeGVhY2MuYmFkbGVuKys7CisJCQkJCQllbHNlIGlmICghb3VycykKKwkJCQkJCQllY3AtPnJ4ZWFjYy5iYWRzcmMrKzsKKwkJCQkJCWVsc2UgaWYgKCF0YiB8fCBuID49IEVMQlRfTlRYQkQpCisJCQkJCQkJZWNwLT5yeGVhY2MuYmFkdHlwKys7CisJCQkJCQllbHNlIHsKKwkJCQkJCQl1bG9uZyBwYXR3b3JkID0gXAorCQkJCQkJCQlwYXR3b3Jkc1tuXTsKKwkJCQkJCQl1aW50IG5iYjsKKworCQkJCQkJCW5iYiA9IGJhZGJpdHMgKCBcCisJCQkJCQkJCSZlaHAtPmV0X2RzYXAsIFwKKwkJCQkJCQkJbmJ5dGVzLCBcCisJCQkJCQkJCXBhdHdvcmQpOworCisJCQkJCQkJZWNwLT5yeGVhY2MuYmFkYml0ICs9IFwKKwkJCQkJCQkJbmJiOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKGVjcC0+c3RhdGUgPT0gQ2xvc2luZykKKwkJCQkJICAgIGVjcC0+Y2xzdGltZSA9IGdldF90aW1lciAoMCk7CisKKwkJCQkJLyogbWFrZSBpdCBlbXB0eSBhZ2FpbiAqLworCQkJCQliZHAtPmNiZF9zYyB8PSBCRF9FTkVUX1JYX0VNUFRZOworCQkJCX0KKworCQkJCWlmIChlY3AtPnN0YXRlICE9IENsb3NpbmcpCisJCQkJCWJyZWFrOworCisJCQkJLyoKKwkJCQkgKiAod2hpbGUgQ2xvc2luZykgY2hlY2sgdG8gc2VlIGlmCisJCQkJICogd2FpdGVkIGxvbmcgZW5vdWdoCisJCQkJICovCisKKwkJCQlpZiAoZ2V0X3RpbWVyIChlY3AtPmNsc3RpbWUpID49IEVMQlRfQ0xTV0FJVCkgeworCQkJCQkvKiB3cml0ZSBHRk1SOiBkaXNhYmxlIHR4L3J4ICovCisJCQkJCWZjcC0+ZmNjX2dmbXIgJj0gXAorCQkJCQkJfihGQ0NfR0ZNUl9FTlQgfCBGQ0NfR0ZNUl9FTlIpOworCQkJCQllY3AtPnN0YXRlID0gQ2xvc2VkOworCQkJCX0KKworCQkJCWJyZWFrOworCisJCQljYXNlIENsb3NlZDoKKwkJCQluY2xvc2VkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCX0gd2hpbGUgKG5jbG9zZWQgPCAoRkNDX0VORF9MT09QIC0gRkNDX1NUQVJUX0xPT1AgKyAxKSk7CisKKwlydW50aW1lID0gZ2V0X3RpbWVyIChydW50aW1lKTsKKwlpZiAocnVudGltZSA8PSBFTEJUX0NMU1dBSVQpIHsKKwkJcHJpbnRmICgiV2hvb3BzISBzb21laG93IGVsYXBzZWQgdGltZSAoJWxkKSBpcyB3cm9uZyAoPD0gJWQpXG4iLAorCQkJcnVudGltZSwgRUxCVF9DTFNXQUlUKTsKKwkJcmV0dXJuOworCX0KKwlubXNlYyA9IHJ1bnRpbWUgLSBFTEJUX0NMU1dBSVQ7CisKKwlwcmludGYgKCJUZXN0IEZpbmlzaGVkIGluICVsZG1zIChwbHVzICVkbXMgY2xvc2Ugd2FpdCBwZXJpb2QpIVxuXG4iLAorCQlubXNlYywgRUxCVF9DTFNXQUlUKTsKKworCS8qCisJICogbm93IHByaW50IHN0YXRzCisJICovCisKKwlmb3IgKGMgPSBGQ0NfU1RBUlRfTE9PUDsgYyA8PSBGQ0NfRU5EX0xPT1A7IGMrKykgeworCQllbGJ0X2NoYW4gKmVjcCA9ICZlbGJ0X2NoYW5zW2NdOworCQl1aW50IHJ4cHBzLCB0eHBwcywgbmVycjsKKworCQlyeHBwcyA9IChlY3AtPm5yY3ZkICogMTAwMCkgLyBubXNlYzsKKwkJdHhwcHMgPSAoZWNwLT5uc2VudCAqIDEwMDApIC8gbm1zZWM7CisKKwkJcHJpbnRmICgiQ2hhbm5lbCAlZDogJWQgcmN2ZCAoJWQgcHBzLCAlZCByeGVycnMpLCAiCisJCQkiJWQgc2VudCAoJWQgcHBzLCAlZCB0eGVycnMpXG5cbiIsIGMsCisJCQllY3AtPm5yY3ZkLCByeHBwcywgZWNwLT5ucnhlcnIsCisJCQllY3AtPm5zZW50LCB0eHBwcywgZWNwLT5udHhlcnIpOworCisJCWlmICgobmVyciA9IGVjcC0+bnJ4ZXJyKSA+IDApIHsKKwkJCXVsb25nIGk7CisKKwkJCXByaW50ZiAoIlx0Rmlyc3QgJWQgcnggZXJyczoiLCBuZXJyKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZXJyOyBpKyspCisJCQkJcHJpbnRmICgiICUwNHgiLCBlY3AtPnJ4ZXJyc1tpXSk7CisJCQlwdXRjICgnXG4nKTsKKwkJfQorCisJCWlmICgobmVyciA9IGVjcC0+bnR4ZXJyKSA+IDApIHsKKwkJCXVsb25nIGk7CisKKwkJCXByaW50ZiAoIlx0Rmlyc3QgJWQgdHggZXJyczoiLCBuZXJyKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZXJyOyBpKyspCisJCQkJcHJpbnRmICgiICUwNHgiLCBlY3AtPnR4ZXJyc1tpXSk7CisJCQlwdXRjICgnXG4nKTsKKwkJfQorCX0KKworCXB1dHMgKCJSZWNlaXZlIEVycm9yIENvdW50czpcbiIpOworCWZvciAoYyA9IEZDQ19TVEFSVF9MT09QOyBjIDw9IEZDQ19FTkRfTE9PUDsgYysrKQorCQliYXNlc1tjXSA9ICh1Y2hhciAqKSZlbGJ0X2NoYW5zW2NdLnJ4ZWFjYzsKKwlwcmludF9kZXNjIChyeGVhY2NfZGVzY3MsIHJ4ZWFjY19uZGVzYywgYmFzZXMsIDMpOworCisJcHV0cyAoIlxuVHJhbnNtaXQgRXJyb3IgQ291bnRzOlxuIik7CisJZm9yIChjID0gRkNDX1NUQVJUX0xPT1A7IGMgPD0gRkNDX0VORF9MT09QOyBjKyspCisJCWJhc2VzW2NdID0gKHVjaGFyICopJmVsYnRfY2hhbnNbY10udHhlYWNjOworCXByaW50X2Rlc2MgKHR4ZWFjY19kZXNjcywgdHhlYWNjX25kZXNjLCBiYXNlcywgMyk7CisKKwlwdXRzICgiXG5STU9OKC1saWtlKSBDb3VudGVyczpcbiIpOworCWZvciAoYyA9IEZDQ19TVEFSVF9MT09QOyBjIDw9IEZDQ19FTkRfTE9PUDsgYysrKQorCQliYXNlc1tjXSA9ICh1Y2hhciAqKSZpbW1yLT5pbV9kcHJhbWJhc2VbZWxidF9jaGFuc1tjXS5wcm9mZl07CisJcHJpbnRfZGVzYyAoZXByYW1fZGVzY3MsIGVwcmFtX25kZXNjLCBiYXNlcywgMyk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRVRIRVJfTE9PUEJBQ0tfVEVTVCAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9ldGhlcl9zY2MuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9ldGhlcl9zY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzIxMTFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2V0aGVyX3NjYy5jCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogTVBDODI2MCBTQ0MgRXRoZXJuZXQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgIERhbiBNYWxlayAoZG1hbGVrQGpsYy5uZXQpCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgKGMpIDIwMDEKKyAqIEFkdmVudCBOZXR3b3JrcywgSW5jLiA8aHR0cDovL3d3dy5hZHZlbnRuZXR3b3Jrcy5jb20+CisgKiBKYXkgTW9ua21hbiA8anRtQHNtb290aHNtb290aGllLmNvbT4KKyAqCisgKiBNb2RpZmllZCBzbyB0aGF0IGl0IHBsYXlzIG5pY2VseSB3aGVuIG1vcmUgdGhhbiBvbmUgRVRIRVJORVQgaW50ZXJmYWNlCisgKiBpcyBpbiB1c2UgYSBsYSBldGhlcl9mY2MuYy4KKyAqIChDKSBDb3B5cmlnaHQgMjAwOAorICogREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluIEdtYkgKKyAqIEdhcnkgSmVubmVqb2huIDxnYXJ5akBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKyNpbmNsdWRlIDxtcGM4MjYwLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWZuZGVmIENPTkZJR19ORVRfTVVMVEkKKyNlcnJvciAiQ09ORklHX05FVF9NVUxUSSBtdXN0IGJlIGRlZmluZWQuIgorI2VuZGlmCisKKyNpZiAoQ09ORklHX0VUSEVSX0lOREVYID09IDEpCisjICBkZWZpbmUgUFJPRkZfRU5FVCAgICAgICAgICAgIFBST0ZGX1NDQzEKKyMgIGRlZmluZSBDUE1fQ1JfRU5FVF9QQUdFICAgICAgQ1BNX0NSX1NDQzFfUEFHRQorIyAgZGVmaW5lIENQTV9DUl9FTkVUX1NCTE9DSyAgICBDUE1fQ1JfU0NDMV9TQkxPQ0sKKyMgIGRlZmluZSBDTVhTQ1JfTUFTSyAgICAgICAgICAoQ01YU0NSX1NDMSAgICAgICAgICB8XAorCQkJCUNNWFNDUl9SUzFDU19NU0sgICAgfFwKKwkJCQlDTVhTQ1JfVFMxQ1NfTVNLKQorCisjZWxpZiAoQ09ORklHX0VUSEVSX0lOREVYID09IDIpCisjICBkZWZpbmUgUFJPRkZfRU5FVCAgICAgICAgICAgIFBST0ZGX1NDQzIKKyMgIGRlZmluZSBDUE1fQ1JfRU5FVF9QQUdFICAgICAgQ1BNX0NSX1NDQzJfUEFHRQorIyAgZGVmaW5lIENQTV9DUl9FTkVUX1NCTE9DSyAgICBDUE1fQ1JfU0NDMl9TQkxPQ0sKKyMgIGRlZmluZSBDTVhTQ1JfTUFTSyAgICAgICAgICAoQ01YU0NSX1NDMiAgICAgICAgICB8XAorCQkJCUNNWFNDUl9SUzJDU19NU0sgICAgfFwKKwkJCQlDTVhTQ1JfVFMyQ1NfTVNLKQorCisjZWxpZiAoQ09ORklHX0VUSEVSX0lOREVYID09IDMpCisjICBkZWZpbmUgUFJPRkZfRU5FVCAgICAgICAgICAgIFBST0ZGX1NDQzMKKyMgIGRlZmluZSBDUE1fQ1JfRU5FVF9QQUdFICAgICAgQ1BNX0NSX1NDQzNfUEFHRQorIyAgZGVmaW5lIENQTV9DUl9FTkVUX1NCTE9DSyAgICBDUE1fQ1JfU0NDM19TQkxPQ0sKKyMgIGRlZmluZSBDTVhTQ1JfTUFTSyAgICAgICAgICAoQ01YU0NSX1NDMyAgICAgICAgICB8XAorCQkJCUNNWFNDUl9SUzNDU19NU0sgICAgfFwKKwkJCQlDTVhTQ1JfVFMzQ1NfTVNLKQorI2VsaWYgKENPTkZJR19FVEhFUl9JTkRFWCA9PSA0KQorIyAgZGVmaW5lIFBST0ZGX0VORVQgICAgICAgICAgICBQUk9GRl9TQ0M0CisjICBkZWZpbmUgQ1BNX0NSX0VORVRfUEFHRSAgICAgIENQTV9DUl9TQ0M0X1BBR0UKKyMgIGRlZmluZSBDUE1fQ1JfRU5FVF9TQkxPQ0sgICAgQ1BNX0NSX1NDQzRfU0JMT0NLCisjICBkZWZpbmUgQ01YU0NSX01BU0sgICAgICAgICAgKENNWFNDUl9TQzQgICAgICAgICAgfFwKKwkJCQlDTVhTQ1JfUlM0Q1NfTVNLICAgIHxcCisJCQkJQ01YU0NSX1RTNENTX01TSykKKworI2VuZGlmCisKKworLyogRXRoZXJuZXQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQnVmZmVycyAqLworI2RlZmluZSBEQlVGX0xFTkdUSCAgMTUyMAorCisjZGVmaW5lIFRYX0JVRl9DTlQgMgorCisjaWYgIWRlZmluZWQoQ09ORklHX1NZU19TQ0NfVE9VVF9MT09QKQorICAjZGVmaW5lIENPTkZJR19TWVNfU0NDX1RPVVRfTE9PUCAxMDAwMDAwCisjZW5kaWYKKworc3RhdGljIGNoYXIgdHhidWZbVFhfQlVGX0NOVF1bIERCVUZfTEVOR1RIIF07CisKK3N0YXRpYyB1aW50IHJ4SWR4OyAgICAgIC8qIGluZGV4IG9mIHRoZSBjdXJyZW50IFJYIGJ1ZmZlciAqLworc3RhdGljIHVpbnQgdHhJZHg7ICAgICAgLyogaW5kZXggb2YgdGhlIGN1cnJlbnQgVFggYnVmZmVyICovCisKKy8qCisgKiBTQ0MgRXRoZXJuZXQgVHggYW5kIFJ4IGJ1ZmZlciBkZXNjcmlwdG9ycyBhbGxvY2F0ZWQgYXQgdGhlCisgKiAgaW1tci0+dWRhdGFfYmQgYWRkcmVzcyBvbiBEdWFsLVBvcnQgUkFNCisgKiBQcm92aWRlIGZvciBEb3VibGUgQnVmZmVyaW5nCisgKi8KKwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgQ29tbW9uQnVmZmVyRGVzY3JpcHRvciB7CisgICAgY2JkX3QgcnhiZFtQS1RCVUZTUlhdOyAgICAgICAgIC8qIFJ4IEJEICovCisgICAgY2JkX3QgdHhiZFtUWF9CVUZfQ05UXTsgICAgICAgIC8qIFR4IEJEICovCit9IFJUWEJEOworCitzdGF0aWMgUlRYQkQgKnJ0eDsKKworCitzdGF0aWMgaW50IHNlY19zZW5kKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIGlmIChsZW5ndGggPD0gMCkgeworCXByaW50Zigic2NjOiBiYWQgcGFja2V0IHNpemU6ICVkXG4iLCBsZW5ndGgpOworCWdvdG8gb3V0OworICAgIH0KKworICAgIGZvcihpPTA7IHJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjICYgQkRfRU5FVF9UWF9SRUFEWTsgaSsrKSB7CisJaWYgKGkgPj0gQ09ORklHX1NZU19TQ0NfVE9VVF9MT09QKSB7CisJICAgIHB1dHMgKCJzY2M6IHR4IGJ1ZmZlciBub3QgcmVhZHlcbiIpOworCSAgICBnb3RvIG91dDsKKwl9CisgICAgfQorCisgICAgcnR4LT50eGJkW3R4SWR4XS5jYmRfYnVmYWRkciA9ICh1aW50KXBhY2tldDsKKyAgICBydHgtPnR4YmRbdHhJZHhdLmNiZF9kYXRsZW4gPSBsZW5ndGg7CisgICAgcnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgfD0gKEJEX0VORVRfVFhfUkVBRFkgfCBCRF9FTkVUX1RYX0xBU1QgfAorCQkJCUJEX0VORVRfVFhfV1JBUCk7CisKKyAgICBmb3IoaT0wOyBydHgtPnR4YmRbdHhJZHhdLmNiZF9zYyAmIEJEX0VORVRfVFhfUkVBRFk7IGkrKykgeworCWlmIChpID49IENPTkZJR19TWVNfU0NDX1RPVVRfTE9PUCkgeworCSAgICBwdXRzICgic2NjOiB0eCBlcnJvclxuIik7CisJICAgIGdvdG8gb3V0OworCX0KKyAgICB9CisKKyAgICAvKiByZXR1cm4gb25seSBzdGF0dXMgYml0cyAqLworICAgIHJlc3VsdCA9IHJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjICYgQkRfRU5FVF9UWF9TVEFUUzsKKworIG91dDoKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBpbnQgc2VjX3J4KHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisgICAgaW50IGxlbmd0aDsKKworICAgIGZvciAoOzspCisgICAgeworCWlmIChydHgtPnJ4YmRbcnhJZHhdLmNiZF9zYyAmIEJEX0VORVRfUlhfRU1QVFkpIHsKKwkgICAgbGVuZ3RoID0gLTE7CisJICAgIGJyZWFrOyAgICAgLyogbm90aGluZyByZWNlaXZlZCAtIGxlYXZlIGZvcigpIGxvb3AgKi8KKwl9CisKKwlsZW5ndGggPSBydHgtPnJ4YmRbcnhJZHhdLmNiZF9kYXRsZW47CisKKwlpZiAocnR4LT5yeGJkW3J4SWR4XS5jYmRfc2MgJiAweDAwM2YpCisJeworCSAgICBwcmludGYoImVycjogJXhcbiIsIHJ0eC0+cnhiZFtyeElkeF0uY2JkX3NjKTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogUGFzcyB0aGUgcGFja2V0IHVwIHRvIHRoZSBwcm90b2NvbCBsYXllcnMuICovCisJICAgIE5ldFJlY2VpdmUoTmV0UnhQYWNrZXRzW3J4SWR4XSwgbGVuZ3RoIC0gNCk7CisJfQorCisKKwkvKiBHaXZlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgU0NDLiAqLworCXJ0eC0+cnhiZFtyeElkeF0uY2JkX2RhdGxlbiA9IDA7CisKKwkvKiB3cmFwIGFyb3VuZCBidWZmZXIgaW5kZXggd2hlbiBuZWNlc3NhcnkgKi8KKwlpZiAoKHJ4SWR4ICsgMSkgPj0gUEtUQlVGU1JYKSB7CisJICAgIHJ0eC0+cnhiZFtQS1RCVUZTUlggLSAxXS5jYmRfc2MgPSAoQkRfRU5FVF9SWF9XUkFQIHwKKwkJCQkJICAgICAgIEJEX0VORVRfUlhfRU1QVFkpOworCSAgICByeElkeCA9IDA7CisJfQorCWVsc2UgeworCSAgICBydHgtPnJ4YmRbcnhJZHhdLmNiZF9zYyA9IEJEX0VORVRfUlhfRU1QVFk7CisJICAgIHJ4SWR4Kys7CisJfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTQ0MgRXRoZXJuZXQgSW5pdGlhbGl6YXRpb24gUm91dGluZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHNlY19pbml0KHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGJkX3QgKmJpcykKK3sKKyAgICBpbnQgaTsKKyAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisgICAgc2NjX2VuZXRfdCAqcHJhbV9wdHI7CisgICAgdWludCBkcGFkZHI7CisgICAgdWNoYXIgZWFbNl07CisKKyAgICByeElkeCA9IDA7CisgICAgdHhJZHggPSAwOworCisgICAgLyoKKyAgICAgKiBBc3NpZ24gc3RhdGljIHBvaW50ZXIgdG8gQkQgYXJlYS4KKyAgICAgKiBBdm9pZCBleGhhdXN0aW5nIERQUkFNLCB3aGljaCB3b3VsZCBjYXVzZSBhIHBhbmljLgorICAgICAqLworICAgIGlmIChydHggPT0gTlVMTCkgeworCSAgICBkcGFkZHIgPSBtODI2MF9jcG1fZHBhbGxvYyhzaXplb2YoUlRYQkQpICsgMiwgMTYpOworCSAgICBydHggPSAoUlRYQkQgKikmaW1tci0+aW1fZHByYW1iYXNlW2RwYWRkcl07CisgICAgfQorCisgICAgLyogMjQuMjEgLSAoMS0zKTogaW9wb3J0cyBoYXZlIGJlZW4gc2V0IHVwIGFscmVhZHkgKi8KKworICAgIC8qIDI0LjIxIC0gKDQsNSk6IGNvbm5lY3QgU0NDJ3MgdHggYW5kIHJ4IGNsb2NrcywgdXNlIE5NU0kgZm9yIFNDQyAqLworICAgIGltbXItPmltX2NwbXV4LmNteF91YXIgPSAwOworICAgIGltbXItPmltX2NwbXV4LmNteF9zY3IgPSAoIChpbW1yLT5pbV9jcG11eC5jbXhfc2NyICYgfkNNWFNDUl9NQVNLKSB8CisJCQkgICAgICAgQ09ORklHX1NZU19DTVhTQ1JfVkFMVUUpOworCisKKyAgICAvKiAyNC4yMSAoNikgd3JpdGUgUkJBU0UgYW5kIFRCQVNFIHRvIHBhcmFtZXRlciBSQU0gKi8KKyAgICBwcmFtX3B0ciA9IChzY2NfZW5ldF90ICopJihpbW1yLT5pbV9kcHJhbWJhc2VbUFJPRkZfRU5FVF0pOworICAgIHByYW1fcHRyLT5zZW5fZ2Vuc2NjLnNjY19yYmFzZSA9ICh1bnNpZ25lZCBpbnQpKCZydHgtPnJ4YmRbMF0pOworICAgIHByYW1fcHRyLT5zZW5fZ2Vuc2NjLnNjY190YmFzZSA9ICh1bnNpZ25lZCBpbnQpKCZydHgtPnR4YmRbMF0pOworCisgICAgcHJhbV9wdHItPnNlbl9nZW5zY2Muc2NjX3JmY3IgPSAweDE4OyAgLyogTnJtbCBPcHMgYW5kIE1vdCBieXRlIG9yZGVyaW5nICovCisgICAgcHJhbV9wdHItPnNlbl9nZW5zY2Muc2NjX3RmY3IgPSAweDE4OyAgLyogTW90IGJ5dGUgb3JkZXJpbmcsIE5ybWwgYWNjZXNzICovCisKKyAgICBwcmFtX3B0ci0+c2VuX2dlbnNjYy5zY2NfbXJibHIgPSBEQlVGX0xFTkdUSDsgLyogbWF4LiBwYWNrYWdlIGxlbiAxNTIwICovCisKKyAgICBwcmFtX3B0ci0+c2VuX2NwcmVzICA9IH4oMHgwKTsgICAgICAgIC8qIFByZXNldCBDUkMgKi8KKyAgICBwcmFtX3B0ci0+c2VuX2NtYXNrICA9IDB4ZGViYjIwZTM7ICAgIC8qIENvbnN0YW50IE1hc2sgZm9yIENSQyAqLworCisKKyAgICAvKiAyNC4yMSAtICg3KTogV3JpdGUgSU5JVCBSWCBBTkQgVFggUEFSQU1FVEVSUyB0byBDUENSICovCisgICAgd2hpbGUoaW1tci0+aW1fY3BtLmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKKyAgICBpbW1yLT5pbV9jcG0uY3BfY3BjciA9IG1rX2NyX2NtZChDUE1fQ1JfRU5FVF9QQUdFLAorCQkJCSAgICAgQ1BNX0NSX0VORVRfU0JMT0NLLAorCQkJCSAgICAgMHgwYywKKwkJCQkgICAgIENQTV9DUl9JTklUX1RSWCkgfCBDUE1fQ1JfRkxHOworCisgICAgLyogMjQuMjEgLSAoOC0xOCk6IFNldCB1cCBwYXJhbWV0ZXIgUkFNICovCisgICAgcHJhbV9wdHItPnNlbl9jcmNlYyAgPSAweDA7ICAgICAgICAgICAvKiBFcnJvciBDb3VudGVyIENSQyAodW51c2VkKSAqLworICAgIHByYW1fcHRyLT5zZW5fYWxlYyAgID0gMHgwOyAgICAgICAgICAgLyogQWxpZ24gRXJyb3IgQ291bnRlciAodW51c2VkKSAqLworICAgIHByYW1fcHRyLT5zZW5fZGlzZmMgID0gMHgwOyAgICAgICAgICAgLyogRGlzY2FyZCBGcmFtZSBDb3VudGVyICh1bnVzZWQpICovCisKKyAgICBwcmFtX3B0ci0+c2VuX3BhZHMgICA9IDB4ODg4ODsgICAgICAgIC8qIFNob3J0IEZyYW1lIFBBRCBDaGFyYWN0ZXJzICovCisKKyAgICBwcmFtX3B0ci0+c2VuX3JldGxpbSA9IDE1OyAgICAgICAgICAgIC8qIFJldHJ5IExpbWl0IFRocmVzaG9sZCAqLworCisgICAgcHJhbV9wdHItPnNlbl9tYXhmbHIgPSAxNTE4OyAgLyogTUFYIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworICAgIHByYW1fcHRyLT5zZW5fbWluZmxyID0gNjQ7ICAgICAgICAgICAgLyogTUlOIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworCisgICAgcHJhbV9wdHItPnNlbl9tYXhkMSAgPSBEQlVGX0xFTkdUSDsgICAvKiBNQVggRE1BMSBMZW5ndGggUmVnaXN0ZXIgKi8KKyAgICBwcmFtX3B0ci0+c2VuX21heGQyICA9IERCVUZfTEVOR1RIOyAgIC8qIE1BWCBETUEyIExlbmd0aCBSZWdpc3RlciAqLworCisgICAgcHJhbV9wdHItPnNlbl9nYWRkcjEgPSAweDA7ICAgLyogR3JvdXAgQWRkcmVzcyBGaWx0ZXIgMSAodW51c2VkKSAqLworICAgIHByYW1fcHRyLT5zZW5fZ2FkZHIyID0gMHgwOyAgIC8qIEdyb3VwIEFkZHJlc3MgRmlsdGVyIDIgKHVudXNlZCkgKi8KKyAgICBwcmFtX3B0ci0+c2VuX2dhZGRyMyA9IDB4MDsgICAvKiBHcm91cCBBZGRyZXNzIEZpbHRlciAzICh1bnVzZWQpICovCisgICAgcHJhbV9wdHItPnNlbl9nYWRkcjQgPSAweDA7ICAgLyogR3JvdXAgQWRkcmVzcyBGaWx0ZXIgNCAodW51c2VkKSAqLworCisgICAgZXRoX2dldGVudl9lbmV0YWRkcigiZXRoYWRkciIsIGVhKTsKKyAgICBwcmFtX3B0ci0+c2VuX3BhZGRyaCA9IChlYVs1XSA8PCA4KSArIGVhWzRdOworICAgIHByYW1fcHRyLT5zZW5fcGFkZHJtID0gKGVhWzNdIDw8IDgpICsgZWFbMl07CisgICAgcHJhbV9wdHItPnNlbl9wYWRkcmwgPSAoZWFbMV0gPDwgOCkgKyBlYVswXTsKKworICAgIHByYW1fcHRyLT5zZW5fcHBlciAgID0gMHgwOyAgIC8qIFBlcnNpc3RlbmNlICh1bnVzZWQpICovCisKKyAgICBwcmFtX3B0ci0+c2VuX2lhZGRyMSA9IDB4MDsgICAvKiBJbmRpdmlkdWFsIEFkZHJlc3MgRmlsdGVyIDEgKHVudXNlZCkgKi8KKyAgICBwcmFtX3B0ci0+c2VuX2lhZGRyMiA9IDB4MDsgICAvKiBJbmRpdmlkdWFsIEFkZHJlc3MgRmlsdGVyIDIgKHVudXNlZCkgKi8KKyAgICBwcmFtX3B0ci0+c2VuX2lhZGRyMyA9IDB4MDsgICAvKiBJbmRpdmlkdWFsIEFkZHJlc3MgRmlsdGVyIDMgKHVudXNlZCkgKi8KKyAgICBwcmFtX3B0ci0+c2VuX2lhZGRyNCA9IDB4MDsgICAvKiBJbmRpdmlkdWFsIEFkZHJlc3MgRmlsdGVyIDQgKHVudXNlZCkgKi8KKworICAgIHByYW1fcHRyLT5zZW5fdGFkZHJoID0gMHgwOyAgIC8qIFRtcCBBZGRyZXNzIChNU0IpICh1bnVzZWQpICovCisgICAgcHJhbV9wdHItPnNlbl90YWRkcm0gPSAweDA7ICAgLyogVG1wIEFkZHJlc3MgKHVudXNlZCkgKi8KKyAgICBwcmFtX3B0ci0+c2VuX3RhZGRybCA9IDB4MDsgICAvKiBUbXAgQWRkcmVzcyAoTFNCKSAodW51c2VkKSAqLworCisgICAgLyogMjQuMjEgLSAoMTkpOiBJbml0aWFsaXplIFJ4QkQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgUEtUQlVGU1JYOyBpKyspCisgICAgeworCXJ0eC0+cnhiZFtpXS5jYmRfc2MgPSBCRF9FTkVUX1JYX0VNUFRZOworCXJ0eC0+cnhiZFtpXS5jYmRfZGF0bGVuID0gMDsgICAgICAgICAgICAgICAgICAvKiBSZXNldCAqLworCXJ0eC0+cnhiZFtpXS5jYmRfYnVmYWRkciA9ICh1aW50KU5ldFJ4UGFja2V0c1tpXTsKKyAgICB9CisKKyAgICBydHgtPnJ4YmRbUEtUQlVGU1JYIC0gMV0uY2JkX3NjIHw9IEJEX0VORVRfUlhfV1JBUDsKKworICAgIC8qIDI0LjIxIC0gKDIwKTogSW5pdGlhbGl6ZSBUeEJEICovCisgICAgZm9yIChpID0gMDsgaSA8IFRYX0JVRl9DTlQ7IGkrKykKKyAgICB7CisJcnR4LT50eGJkW2ldLmNiZF9zYyA9IChCRF9FTkVUX1RYX1BBRCAgfAorCQkJICAgICAgIEJEX0VORVRfVFhfTEFTVCB8CisJCQkgICAgICAgQkRfRU5FVF9UWF9UQyk7CisJcnR4LT50eGJkW2ldLmNiZF9kYXRsZW4gPSAwOyAgICAgICAgICAgICAgICAgIC8qIFJlc2V0ICovCisJcnR4LT50eGJkW2ldLmNiZF9idWZhZGRyID0gKHVpbnQpJnR4YnVmW2ldWzBdOworICAgIH0KKworICAgIHJ0eC0+dHhiZFtUWF9CVUZfQ05UIC0gMV0uY2JkX3NjIHw9IEJEX0VORVRfVFhfV1JBUDsKKworICAgIC8qIDI0LjIxIC0gKDIxKTogV3JpdGUgMHhmZmZmIHRvIFNDQ0UgKi8KKyAgICBpbW1yLT5pbV9zY2NbQ09ORklHX0VUSEVSX0lOREVYLTFdLnNjY19zY2NlID0gfigweDApOworCisgICAgLyogMjQuMjEgLSAoMjIpOiBXcml0ZSB0byBTQ0NNIHRvIGVuYWJsZSBUWEUsIFJYRiwgVFhCIGV2ZW50cyAqLworICAgIGltbXItPmltX3NjY1tDT05GSUdfRVRIRVJfSU5ERVgtMV0uc2NjX3NjY20gPSAoU0NDRV9FTkVUX1RYRSB8CisJCQkJCQkgICBTQ0NFX0VORVRfUlhGIHwKKwkJCQkJCSAgIFNDQ0VfRU5FVF9UWEIpOworCisgICAgLyogMjQuMjEgLSAoMjMpOiB3ZSBkb24ndCB1c2UgZXRoZXJuZXQgaW50ZXJydXB0cyAqLworCisgICAgLyogMjQuMjEgLSAoMjQpOiBDbGVhciBHU01SX0ggdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb25zICovCisgICAgaW1tci0+aW1fc2NjW0NPTkZJR19FVEhFUl9JTkRFWC0xXS5zY2NfZ3NtcmggPSAwOworCisgICAgLyogMjQuMjEgLSAoMjUpOiBDbGVhciBHU01SX0wgdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb25zICovCisgICAgaW1tci0+aW1fc2NjW0NPTkZJR19FVEhFUl9JTkRFWC0xXS5zY2NfZ3NtcmwgPSAoU0NDX0dTTVJMX1RDSSAgICAgICAgfAorCQkJCQkJICAgIFNDQ19HU01STF9UUExfNDggICAgIHwKKwkJCQkJCSAgICBTQ0NfR1NNUkxfVFBQXzEwICAgICB8CisJCQkJCQkgICAgU0NDX0dTTVJMX01PREVfRU5FVCk7CisKKyAgICAvKiAyNC4yMSAtICgyNik6IEluaXRpYWxpemUgRFNSICovCisgICAgaW1tci0+aW1fc2NjW0NPTkZJR19FVEhFUl9JTkRFWC0xXS5zY2NfZHNyID0gMHhkNTU1OworCisgICAgLyogMjQuMjEgLSAoMjcpOiBJbml0aWFsaXplIFBTTVIyCisgICAgICoKKyAgICAgKiBTZXR0aW5nczoKKyAgICAgKglDUkMgPSAzMi1CaXQgQ0NJVFQKKyAgICAgKglOSUIgPSBCZWdpbiBzZWFyY2hpbmcgZm9yIFNGRCAyMiBiaXRzIGFmdGVyIFJFTkEKKyAgICAgKglGREUgPSBGdWxsIER1cGxleCBFbmFibGUKKyAgICAgKglCUk8gPSBSZWplY3QgYnJvYWRjYXN0IHBhY2tldHMKKyAgICAgKglQUk9NSVNDT1VTID0gQ2F0Y2ggYWxsIHBhY2tldHMgcmVnYXJkbGVzcyBvZiBkZXN0LiBNQUMgYWRyZXNzCisgICAgICovCisgICAgaW1tci0+aW1fc2NjW0NPTkZJR19FVEhFUl9JTkRFWC0xXS5zY2NfcHNtciAgID0JU0NDX1BTTVJfRU5DUkMJfAorCQkJCQkJCVNDQ19QU01SX05JQjIyCXwKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0NfRU5FVF9GVUxMX0RVUExFWCkKKwkJCQkJCQlTQ0NfUFNNUl9GREUJfAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU0NDX0VORVRfTk9fQlJPQURDQVNUKQorCQkJCQkJCVNDQ19QU01SX0JSTwl8CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0NfRU5FVF9QUk9NSVNDT1VTKQorCQkJCQkJCVNDQ19QU01SX1BSTwl8CisjZW5kaWYKKwkJCQkJCQkwOworCisgICAgLyogMjQuMjEgLSAoMjgpOiBXcml0ZSB0byBHU01SX0wgdG8gZW5hYmxlIFNDQyAqLworICAgIGltbXItPmltX3NjY1tDT05GSUdfRVRIRVJfSU5ERVgtMV0uc2NjX2dzbXJsIHw9IChTQ0NfR1NNUkxfRU5SIHwKKwkJCQkJCSAgICAgU0NDX0dTTVJMX0VOVCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzZWNfaGFsdChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKyAgICBpbW1yLT5pbV9zY2NbQ09ORklHX0VUSEVSX0lOREVYLTFdLnNjY19nc21ybCAmPSB+KFNDQ19HU01STF9FTlIgfAorCQkJCQkJICAgICAgU0NDX0dTTVJMX0VOVCk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBzZWNfcmVzdGFydCh2b2lkKQoreworICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKyAgICBpbW1yLT5pbV9jcG0uY3Bfc2NjW0NPTkZJR19FVEhFUl9JTkRFWC0xXS5zY2NfZ3NtcmwgfD0gKFNDQ19HU01STF9FTlIgfAorCQkJCQkJCSAgICBTQ0NfR1NNUkxfRU5UKTsKK30KKyNlbmRpZgorCitpbnQgbXBjODJ4eF9zY2NfZW5ldF9pbml0aWFsaXplKGJkX3QgKmJpcykKK3sKKwlzdHJ1Y3QgZXRoX2RldmljZSAqZGV2OworCisJZGV2ID0gKHN0cnVjdCBldGhfZGV2aWNlICopIG1hbGxvYyhzaXplb2YgKmRldik7CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mICpkZXYpOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJTQ0MgRVRIRVJORVQiKTsKKwlkZXYtPmluaXQgICA9IHNlY19pbml0OworCWRldi0+aGFsdCAgID0gc2VjX2hhbHQ7CisJZGV2LT5zZW5kICAgPSBzZWNfc2VuZDsKKwlkZXYtPnJlY3YgICA9IHNlY19yeDsKKworCWV0aF9yZWdpc3RlcihkZXYpOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvaTJjLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiZGNjMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9pMmMuYwpAQCAtMCwwICsxLDc4NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogUGFvbG8gU2NhZmZhcmRpLCBBSVJWRU5UIFNBTSBzLnAuYSAtIFJJTUlOSShJVEFMWSksIGFyc2VuaW9AdGluLml0CisgKgorICogKEMpIENvcHlyaWdodCAyMDAwIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0hBUkRfSTJDKQorCisjaW5jbHVkZSA8YXNtL2NwbV84MjYwLmg+CisjaW5jbHVkZSA8aTJjLmg+CisKKy8qIGRlZmluZSB0byBlbmFibGUgZGVidWcgbWVzc2FnZXMgKi8KKyN1bmRlZiAgREVCVUdfSTJDCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX01VTFRJX0JVUykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTJjX2J1c19udW0gX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSkgPSAwOworI2VuZGlmIC8qIENPTkZJR19JMkNfTVVMVElfQlVTICovCisKKy8qIHVTZWMgdG8gd2FpdCBiZXR3ZWVuIHBvbGxzIG9mIHRoZSBpMmMgKi8KKyNkZWZpbmUgREVMQVlfVVMJMTAwCisvKiB1U2VjIHRvIHdhaXQgZm9yIHRoZSBDUE0gdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgYnVmZmVyICovCisjZGVmaW5lIFNUQVJUX0RFTEFZX1VTCTEwMDAKKworLyoKKyAqIHR4L3J4IHBlci1ieXRlIHRpbWVvdXQ6IHdlIGRlbGF5IERFTEFZX1VTIHVTZWMgYmV0d2VlbiBwb2xscyBzbyB0aGUKKyAqIHRpbWVvdXQgd2lsbCBiZSAodHhfbGVuZ3RoICsgcnhfbGVuZ3RoKSAqIERFTEFZX1VTICogVE9VVF9MT09QCisgKi8KKyNkZWZpbmUgVE9VVF9MT09QIDUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU2V0IGRlZmF1bHQgdmFsdWVzCisgKi8KKyNpZm5kZWYJQ09ORklHX1NZU19JMkNfU1BFRUQKKyNkZWZpbmUJQ09ORklHX1NZU19JMkNfU1BFRUQJNTAwMDAKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordHlwZWRlZiB2b2lkICgqaTJjX2VjYl90KShpbnQsIGludCwgdm9pZCAqKTsgICAgLyogZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIGJkIGFuZCBidWZmZXIgc3BhY2UgdXNhZ2UuICovCit0eXBlZGVmIHN0cnVjdCBpMmNfc3RhdGUgeworCWludAkJcnhfaWR4OwkJLyogaW5kZXggICB0byBuZXh0IGZyZWUgUnggQkQgKi8KKwlpbnQJCXR4X2lkeDsJCS8qIGluZGV4ICAgdG8gbmV4dCBmcmVlIFR4IEJEICovCisJdm9pZAkJKnJ4YmQ7CQkvKiBwb2ludGVyIHRvIG5leHQgZnJlZSBSeCBCRCAqLworCXZvaWQJCSp0eGJkOwkJLyogcG9pbnRlciB0byBuZXh0IGZyZWUgVHggQkQgKi8KKwlpbnQJCXR4X3NwYWNlOwkvKiBudW1iZXIgIG9mIFR4IGJ5dGVzIGxlZnQgICAqLworCXVuc2lnbmVkIGNoYXIJKnR4X2J1ZjsJLyogcG9pbnRlciB0byBmcmVlIFR4IGFyZWEgICAgKi8KKwlpMmNfZWNiX3QJZXJyX2NiOwkJLyogZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb24gICAgKi8KKwl2b2lkCQkqY2JfZGF0YTsJLyogcHJpdmF0ZSBkYXRhIHRvIGJlIHBhc3NlZCAgKi8KK30gaTJjX3N0YXRlX3Q7CisKKy8qIGZsYWdzIGZvciBpMmNfc2VuZCgpIGFuZCBpMmNfcmVjZWl2ZSgpICovCisjZGVmaW5lCUkyQ0ZfRU5BQkxFX1NFQ09OREFSWQkweDAxCS8qIHNlY29uZGFyeV9hZGRyZXNzIGlzIHZhbGlkCSovCisjZGVmaW5lCUkyQ0ZfU1RBUlRfQ09ORAkJMHgwMgkvKiB0eDogZ2VuZXJhdGUgc3RhcnQgY29uZGl0aW9uCSovCisjZGVmaW5lIEkyQ0ZfU1RPUF9DT05ECQkweDA0CS8qIHR4OiBnZW5lcmF0ZSBzdG9wICBjb25kaXRpb24JKi8KKworLyogcmV0dXJuIGNvZGVzICovCisjZGVmaW5lIEkyQ0VSUl9OT19CVUZGRVJTCTEJLyogbm8gbW9yZSBCRHMgb3IgYnVmZmVyIHNwYWNlCSovCisjZGVmaW5lIEkyQ0VSUl9NU0dfVE9PX0xPTkcJMgkvKiB0cmllZCB0byBzZW5kL3JlY2VpdmUgdG8gbXVjaCBkYXRhICAgKi8KKyNkZWZpbmUgSTJDRVJSX1RJTUVPVVQJCTMJLyogdGltZW91dCBpbiBpMmNfZG9pbygpCSovCisjZGVmaW5lIEkyQ0VSUl9RVUVVRV9FTVBUWQk0CS8qIGkyY19kb2lvIGNhbGxlZCB3aXRob3V0IHNlbmQvcmVjZWl2ZSAqLworI2RlZmluZSBJMkNFUlJfSU9fRVJST1IJCTUJLyogaGFkIGFuIGVycm9yIGR1cmluZyBjb21tcwkqLworCisvKiBlcnJvciBjYWxsYmFjayBmbGFncyAqLworI2RlZmluZSBJMkNFQ0JfUlhfRVJSCQkweDEwCS8qIHRoaXMgaXMgYSByZWNlaXZlIGVycm9yCSovCisjZGVmaW5lICAgICBJMkNFQ0JfUlhfT1YJMHgwMgkvKiByZWNlaXZlIG92ZXJydW4gZXJyb3IJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9SWF9NQVNLCTB4MGYJLyogbWFzayBmb3IgZXJyb3IgYml0cwkJKi8KKyNkZWZpbmUgSTJDRUNCX1RYX0VSUgkJMHgyMAkvKiB0aGlzIGlzIGEgdHJhbnNtaXQgZXJyb3IJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9UWF9DTAkweDAxCS8qIHRyYW5zbWl0IGNvbGxpc2lvbiBlcnJvcgkqLworI2RlZmluZSAgICAgSTJDRUNCX1RYX1VOCTB4MDIJLyogdHJhbnNtaXQgdW5kZXJmbG93IGVycm9yCSovCisjZGVmaW5lICAgICBJMkNFQ0JfVFhfTkFLCTB4MDQJLyogdHJhbnNtaXQgbm8gYWNrIGVycm9yCSovCisjZGVmaW5lICAgICBJMkNFQ0JfVFhfTUFTSwkweDBmCS8qIG1hc2sgZm9yIGVycm9yIGJpdHMJCSovCisjZGVmaW5lIEkyQ0VDQl9USU1FT1VUCQkweDQwCS8qIHRoaXMgaXMgYSB0aW1lb3V0IGVycm9yCSovCisKKyNkZWZpbmUgRVJST1JfSTJDX05PTkUJCTAKKyNkZWZpbmUgRVJST1JfSTJDX0xFTkdUSAkxCisKKyNkZWZpbmUgSTJDX1dSSVRFX0JJVAkJMHgwMAorI2RlZmluZSBJMkNfUkVBRF9CSVQJCTB4MDEKKworI2RlZmluZSBJMkNfUlhUWF9MRU4JMTI4CS8qIG1heGltdW0gdHgvcnggYnVmZmVyIGxlbmd0aCAqLworCisKKyNkZWZpbmUgTlVNX1JYX0JEUyA0CisjZGVmaW5lIE5VTV9UWF9CRFMgNAorI2RlZmluZSBNQVhfVFhfU1BBQ0UgMjU2CisKK3R5cGVkZWYgc3RydWN0IEkyQ19CRAoreworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKyAgdW5zaWduZWQgY2hhciAqYWRkcjsKK30gSTJDX0JEOworI2RlZmluZSBCRF9JMkNfVFhfU1RBUlQgMHgwNDAwICAvKiBzcGVjaWFsIHN0YXR1cyBmb3IgaTJjOiBTdGFydCBjb25kaXRpb24gKi8KKworI2RlZmluZSBCRF9JMkNfVFhfQ0wJMHgwMDAxCS8qIGNvbGxpc2lvbiBlcnJvciAqLworI2RlZmluZSBCRF9JMkNfVFhfVU4JMHgwMDAyCS8qIHVuZGVyZmxvdyBlcnJvciAqLworI2RlZmluZSBCRF9JMkNfVFhfTkFLCTB4MDAwNAkvKiBubyBhY2tub3dsZWRnZSBlcnJvciAqLworI2RlZmluZSBCRF9JMkNfVFhfRVJSCShCRF9JMkNfVFhfTkFLfEJEX0kyQ19UWF9VTnxCRF9JMkNfVFhfQ0wpCisKKyNkZWZpbmUgQkRfSTJDX1JYX0VSUglCRF9TQ19PVgorCisjaWZkZWYgREVCVUdfSTJDCisjZGVmaW5lIFBSSU5URCh4KSBwcmludGYgeAorI2Vsc2UKKyNkZWZpbmUgUFJJTlREKHgpCisjZW5kaWYKKworLyoKKyAqIFJldHVybnMgdGhlIGJlc3QgdmFsdWUgb2YgSTJCUkcgdG8gbWVldCBkZXNpcmVkIGNsb2NrIHNwZWVkIG9mIEkyQyB3aXRoCisgKiBpbnB1dCBwYXJhbWV0ZXJzIChjbG9jayBzcGVlZCwgZmlsdGVyLCBhbmQgcHJlZGl2aWRlciB2YWx1ZSkuCisgKiBJdCByZXR1cm5zIGNvbXB1dGVyIHNwZWVkIHZhbHVlIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGl0IGFuZCBkZXNpcmVkCisgKiBzcGVlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2kyY19yb3VuZHJhdGUoaW50IGh6LCBpbnQgc3BlZWQsIGludCBmaWx0ZXIsIGludCBtb2R2YWwsCisJCWludCAqYnJndmFsLCBpbnQgKnRvdHNwZWVkKQoreworICAgIGludCBtb2RkaXYgPSAxIDw8ICg1LShtb2R2YWwgJiAzKSksIGJyZ2RpdiwgZGl2OworCisgICAgUFJJTlREKCgiXHRbSTJDXSB0cnlpbmcgaHo9JWQsIHNwZWVkPSVkLCBmaWx0ZXI9JWQsIG1vZHZhbD0lZFxuIiwKKwloeiwgc3BlZWQsIGZpbHRlciwgbW9kdmFsKSk7CisKKyAgICBkaXYgPSBtb2RkaXYgKiBzcGVlZDsKKyAgICBicmdkaXYgPSAoaHogKyBkaXYgLSAxKSAvIGRpdjsKKworICAgIFBSSU5URCgoIlx0XHRtb2RkaXY9JWQsIGJyZ2Rpdj0lZFxuIiwgbW9kZGl2LCBicmdkaXYpKTsKKworICAgICpicmd2YWwgPSAoKGJyZ2RpdiArIDEpIC8gMikgLSAzIC0gKDIqZmlsdGVyKTsKKworICAgIGlmICgoKmJyZ3ZhbCA8IDApIHx8ICgqYnJndmFsID4gMjU1KSkgeworCSAgUFJJTlREKCgiXHRcdHJlamVjdGVkIGJyZ3ZhbD0lZFxuIiwgKmJyZ3ZhbCkpOworCSAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGJyZ2RpdiA9IDIgKiAoKmJyZ3ZhbCArIDMgKyAoMiAqIGZpbHRlcikpOworICAgIGRpdiA9IG1vZGRpdiAqIGJyZ2RpdiA7CisgICAgKnRvdHNwZWVkID0gaHogLyBkaXY7CisKKyAgICBQUklOVEQoKCJcdFx0YWNjZXB0ZWQgYnJndmFsPSVkLCB0b3RzcGVlZD0lZFxuIiwgKmJyZ3ZhbCwgKnRvdHNwZWVkKSk7CisKKyAgICByZXR1cm4gIDA7Cit9CisKKy8qCisgKiBTZXRzIHRoZSBJMkMgY2xvY2sgcHJlZGl2aWRlciBhbmQgZGl2aWRlciB0byBtZWV0IHJlcXVpcmVkIGNsb2NrIHNwZWVkLgorICovCitzdGF0aWMgaW50IGkyY19zZXRyYXRlKGludCBoeiwgaW50IHNwZWVkKQoreworICAgIGltbWFwX3QJKmltbWFwID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIgOworICAgIHZvbGF0aWxlIGkyYzgyNjBfdCAqaTJjID0gKGkyYzgyNjBfdCAqKSZpbW1hcC0+aW1faTJjOworICAgIGludCBicmd2YWwsCisJICBtb2R2YWwsCS8qIDAtMyAqLworCSAgYmVzdHNwZWVkX2RpZmYgPSBzcGVlZCwKKwkgIGJlc3RzcGVlZF9icmd2YWw9MCwKKwkgIGJlc3RzcGVlZF9tb2R2YWw9MCwKKwkgIGJlc3RzcGVlZF9maWx0ZXI9MCwKKwkgIHRvdHNwZWVkLAorCSAgZmlsdGVyID0gMDsgLyogVXNlIHRoaXMgZml4ZWQgdmFsdWUgKi8KKworCWZvciAobW9kdmFsID0gMDsgbW9kdmFsIDwgNDsgbW9kdmFsKyspCisJeworCQlpZiAoaTJjX3JvdW5kcmF0ZSAoaHosIHNwZWVkLCBmaWx0ZXIsIG1vZHZhbCwgJmJyZ3ZhbCwgJnRvdHNwZWVkKSA9PSAwKQorCQl7CisJCQlpbnQgZGlmZiA9IHNwZWVkIC0gdG90c3BlZWQgOworCisJCQlpZiAoKGRpZmYgPj0gMCkgJiYgKGRpZmYgPCBiZXN0c3BlZWRfZGlmZikpCisJCQl7CisJCQkJYmVzdHNwZWVkX2RpZmYJPSBkaWZmIDsKKwkJCQliZXN0c3BlZWRfbW9kdmFsCT0gbW9kdmFsOworCQkJCWJlc3RzcGVlZF9icmd2YWwJPSBicmd2YWw7CisJCQkJYmVzdHNwZWVkX2ZpbHRlcgk9IGZpbHRlcjsKKwkJCX0KKwkJfQorCX0KKworICAgIFBSSU5URCgoIltJMkNdIEJlc3QgaXM6XG4iKSk7CisgICAgUFJJTlREKCgiW0kyQ10gQ1BVPSVkaHogUkFURT0lZCBGPSVkIEkyTU9EPSUwOHggSTJCUkc9JTA4eCBESUZGPSVkaHpcbiIsCisJCSAgIGh6LCBzcGVlZCwKKwkJICAgYmVzdHNwZWVkX2ZpbHRlciwgYmVzdHNwZWVkX21vZHZhbCwgYmVzdHNwZWVkX2JyZ3ZhbCwKKwkJICAgYmVzdHNwZWVkX2RpZmYpKTsKKworICAgIGkyYy0+aTJjX2kybW9kIHw9ICgoYmVzdHNwZWVkX21vZHZhbCAmIDMpIDw8IDEpIHwgKGJlc3RzcGVlZF9maWx0ZXIgPDwgMyk7CisgICAgaTJjLT5pMmNfaTJicmcgPSBiZXN0c3BlZWRfYnJndmFsICYgMHhmZjsKKworICAgIFBSSU5URCgoIltJMkNdIGkybW9kPSUwOHggaTJicmc9JTA4eFxuIiwgaTJjLT5pMmNfaTJtb2QsIGkyYy0+aTJjX2kyYnJnKSk7CisKKyAgICByZXR1cm4gMSA7Cit9CisKK3ZvaWQgaTJjX2luaXQoaW50IHNwZWVkLCBpbnQgc2xhdmVhZGQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUiA7CisJdm9sYXRpbGUgY3BtODI2MF90ICpjcCA9IChjcG04MjYwX3QgKikmaW1tYXAtPmltX2NwbTsKKwl2b2xhdGlsZSBpMmM4MjYwX3QgKmkyYwk9IChpMmM4MjYwX3QgKikmaW1tYXAtPmltX2kyYzsKKwl2b2xhdGlsZSBpaWNfdCAqaWlwOworCXVsb25nIHJiYXNlLCB0YmFzZTsKKwl2b2xhdGlsZSBJMkNfQkQgKnJ4YmQsICp0eGJkOworCXVpbnQgZHBhZGRyOworCisjaWZkZWYgQ09ORklHX1NZU19JMkNfSU5JVF9CT0FSRAorCS8qIGNhbGwgYm9hcmQgc3BlY2lmaWMgaTJjIGJ1cyByZXNldCByb3V0aW5lIGJlZm9yZSBhY2Nlc3NpbmcgdGhlICAgKi8KKwkvKiBlbnZpcm9ubWVudCwgd2hpY2ggbWlnaHQgYmUgaW4gYSBjaGlwIG9uIHRoYXQgYnVzLiBGb3IgZGV0YWlscyAgICovCisJLyogYWJvdXQgdGhpcyBwcm9ibGVtIHNlZSBkb2MvSTJDX0VkZ2VfQ29uZGl0aW9ucy4gICAgICAgICAgICAgICAgICAqLworCWkyY19pbml0X2JvYXJkKCk7CisjZW5kaWYKKworCWRwYWRkciA9ICooKHVuc2lnbmVkIHNob3J0KikoJmltbWFwLT5pbV9kcHJhbWJhc2VbUFJPRkZfSTJDX0JBU0VdKSk7CisJaWYgKGRwYWRkciA9PSAwKSB7CisJICAgIC8qIG5lZWQgdG8gYWxsb2NhdGUgZHVhbCBwb3J0IHJhbSAqLworCSAgICBkcGFkZHIgPSBtODI2MF9jcG1fZHBhbGxvYyg2NCArCisJCShOVU1fUlhfQkRTICogc2l6ZW9mKEkyQ19CRCkpICsgKE5VTV9UWF9CRFMgKiBzaXplb2YoSTJDX0JEKSkgKworCQlNQVhfVFhfU1BBQ0UsIDY0KTsKKwkgICAgKigodW5zaWduZWQgc2hvcnQqKSgmaW1tYXAtPmltX2RwcmFtYmFzZVtQUk9GRl9JMkNfQkFTRV0pKSA9IGRwYWRkcjsKKwl9CisKKwkvKgorCSAqIGluaXRpYWxpc2UgZGF0YSBpbiBkdWFsIHBvcnQgcmFtOgorCSAqCisJICoJICBkcGFkZHIgLT4gcGFyYW1ldGVyIHJhbSAoNjQgYnl0ZXMpCisJICogICAgICAgICByYmFzZSAtPiByeCBCRCAgICAgICAgIChOVU1fUlhfQkRTICogc2l6ZW9mKEkyQ19CRCkgYnl0ZXMpCisJICogICAgICAgICB0YmFzZSAtPiB0eCBCRCAgICAgICAgIChOVU1fVFhfQkRTICogc2l6ZW9mKEkyQ19CRCkgYnl0ZXMpCisJICogICAgICAgICAgICAgICAgICB0eCBidWZmZXIgICAgIChNQVhfVFhfU1BBQ0UgYnl0ZXMpCisJICovCisKKwlpaXAgPSAoaWljX3QgKikmaW1tYXAtPmltX2RwcmFtYmFzZVtkcGFkZHJdOworCW1lbXNldCgodm9pZCopaWlwLCAwLCBzaXplb2YoaWljX3QpKTsKKworCXJiYXNlID0gZHBhZGRyICsgNjQ7CisJdGJhc2UgPSByYmFzZSArIE5VTV9SWF9CRFMgKiBzaXplb2YoSTJDX0JEKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWkyYy0+aTJjX2kybW9kID0gMHgwMDsKKwlpMmMtPmkyY19pMmNtciA9IDB4MDA7CisJaTJjLT5pMmNfaTJjZXIgPSAweGZmOworCWkyYy0+aTJjX2kyYWRkID0gc2xhdmVhZGQ7CisKKwkvKgorCSAqIFNldCB0aGUgSTJDIEJSRyBDbG9jayBkaXZpc2lvbiBmYWN0b3IgZnJvbSBkZXNpcmVkIGkyYyByYXRlCisJICogYW5kIGN1cnJlbnQgQ1BVIHJhdGUgKHdlIGFzc3VtZSBzY2NyIGRmYmdyIGZpZWxkIGlzIDA7CisJICogZGl2aWRlIEJSR0NMSyBieSAxKQorCSAqLworCVBSSU5URCgoIltJMkNdIFNldHRpbmcgcmF0ZS4uLlxuIikpOworCWkyY19zZXRyYXRlIChnZC0+YnJnX2NsaywgQ09ORklHX1NZU19JMkNfU1BFRUQpIDsKKworCS8qIFNldCBJMkMgY29udHJvbGxlciBpbiBtYXN0ZXIgbW9kZSAqLworCWkyYy0+aTJjX2kyY29tID0gMHgwMTsKKworCS8qIEluaXRpYWxpemUgVHgvUnggcGFyYW1ldGVycyAqLworCWlpcC0+aWljX3JiYXNlID0gcmJhc2U7CisJaWlwLT5paWNfdGJhc2UgPSB0YmFzZTsKKwlyeGJkID0gKEkyQ19CRCAqKSgodW5zaWduZWQgY2hhciAqKSZpbW1hcC0+aW1fZHByYW1iYXNlW2lpcC0+aWljX3JiYXNlXSk7CisJdHhiZCA9IChJMkNfQkQgKikoKHVuc2lnbmVkIGNoYXIgKikmaW1tYXAtPmltX2RwcmFtYmFzZVtpaXAtPmlpY190YmFzZV0pOworCisJUFJJTlREKCgiW0kyQ10gcmJhc2UgPSAlMDR4XG4iLCBpaXAtPmlpY19yYmFzZSkpOworCVBSSU5URCgoIltJMkNdIHRiYXNlID0gJTA0eFxuIiwgaWlwLT5paWNfdGJhc2UpKTsKKwlQUklOVEQoKCJbSTJDXSByeGJkID0gJTA4eFxuIiwgKGludClyeGJkKSk7CisJUFJJTlREKCgiW0kyQ10gdHhiZCA9ICUwOHhcbiIsIChpbnQpdHhiZCkpOworCisJLyogU2V0IGJpZyBlbmRpYW4gYnl0ZSBvcmRlciAqLworCWlpcC0+aWljX3RmY3IgPSAweDEwOworCWlpcC0+aWljX3JmY3IgPSAweDEwOworCisJLyogU2V0IG1heGltdW0gcmVjZWl2ZSBzaXplLiAqLworCWlpcC0+aWljX21yYmxyID0gSTJDX1JYVFhfTEVOOworCisgICAgY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoQ1BNX0NSX0kyQ19QQUdFLAorCQkJCQkJCUNQTV9DUl9JMkNfU0JMT0NLLAorCQkJCQkJCTB4MDAsCisJCQkJCQkJQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisgICAgZG8geworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisgICAgfSB3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKKworCS8qIENsZWFyIGV2ZW50cyBhbmQgaW50ZXJydXB0cyAqLworCWkyYy0+aTJjX2kyY2VyID0gMHhmZjsKKwlpMmMtPmkyY19pMmNtciA9IDB4MDA7Cit9CisKK3N0YXRpYwordm9pZCBpMmNfbmV3aW8oaTJjX3N0YXRlX3QgKnN0YXRlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIgOworCXZvbGF0aWxlIGlpY190ICppaXA7CisJdWludCBkcGFkZHI7CisKKwlQUklOVEQoKCJbSTJDXSBpMmNfbmV3aW9cbiIpKTsKKworCWRwYWRkciA9ICooKHVuc2lnbmVkIHNob3J0KikoJmltbWFwLT5pbV9kcHJhbWJhc2VbUFJPRkZfSTJDX0JBU0VdKSk7CisJaWlwID0gKGlpY190ICopJmltbWFwLT5pbV9kcHJhbWJhc2VbZHBhZGRyXTsKKwlzdGF0ZS0+cnhfaWR4ID0gMDsKKwlzdGF0ZS0+dHhfaWR4ID0gMDsKKwlzdGF0ZS0+cnhiZCA9ICh2b2lkKikmaW1tYXAtPmltX2RwcmFtYmFzZVtpaXAtPmlpY19yYmFzZV07CisJc3RhdGUtPnR4YmQgPSAodm9pZCopJmltbWFwLT5pbV9kcHJhbWJhc2VbaWlwLT5paWNfdGJhc2VdOworCXN0YXRlLT50eF9zcGFjZSA9IE1BWF9UWF9TUEFDRTsKKwlzdGF0ZS0+dHhfYnVmID0gKHVjaGFyKilzdGF0ZS0+dHhiZCArIE5VTV9UWF9CRFMgKiBzaXplb2YoSTJDX0JEKTsKKwlzdGF0ZS0+ZXJyX2NiID0gTlVMTDsKKwlzdGF0ZS0+Y2JfZGF0YSA9IE5VTEw7CisKKwlQUklOVEQoKCJbSTJDXSByeGJkID0gJTA4eFxuIiwgKGludClzdGF0ZS0+cnhiZCkpOworCVBSSU5URCgoIltJMkNdIHR4YmQgPSAlMDh4XG4iLCAoaW50KXN0YXRlLT50eGJkKSk7CisJUFJJTlREKCgiW0kyQ10gdHhfYnVmID0gJTA4eFxuIiwgKGludClzdGF0ZS0+dHhfYnVmKSk7CisKKwkvKiBjbGVhciB0aGUgYnVmZmVyIG1lbW9yeSAqLworCW1lbXNldCgoY2hhciAqKXN0YXRlLT50eF9idWYsIDAsIE1BWF9UWF9TUEFDRSk7Cit9CisKK3N0YXRpYworaW50IGkyY19zZW5kKGkyY19zdGF0ZV90ICpzdGF0ZSwKKwkJCSB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCisJCQkgdW5zaWduZWQgY2hhciBzZWNvbmRhcnlfYWRkcmVzcywKKwkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQkgdW5zaWduZWQgc2hvcnQgc2l6ZSwKKwkJCSB1bnNpZ25lZCBjaGFyICpkYXRhb3V0KQoreworCXZvbGF0aWxlIEkyQ19CRCAqdHhiZDsKKwlpbnQgaSxqOworCisJUFJJTlREKCgiW0kyQ10gaTJjX3NlbmQgYWRkPSUwMmQgc2VjPSUwMmQgZmxhZz0lMDJkIHNpemU9JWRcbiIsCisJCQlhZGRyZXNzLCBzZWNvbmRhcnlfYWRkcmVzcywgZmxhZ3MsIHNpemUpKTsKKworCS8qIHRyeWluZyB0byBzZW5kIG1lc3NhZ2UgbGFyZ2VyIHRoYW4gQkQgKi8KKwlpZiAoc2l6ZSA+IEkyQ19SWFRYX0xFTikKKwkgIHJldHVybiBJMkNFUlJfTVNHX1RPT19MT05HOworCisJLyogbm8gbW9yZSBmcmVlIGJkcyAqLworCWlmIChzdGF0ZS0+dHhfaWR4ID49IE5VTV9UWF9CRFMgfHwgc3RhdGUtPnR4X3NwYWNlIDwgKDIgKyBzaXplKSkKKwkgIHJldHVybiBJMkNFUlJfTk9fQlVGRkVSUzsKKworCXR4YmQgPSAoSTJDX0JEICopc3RhdGUtPnR4YmQ7CisJdHhiZC0+YWRkciA9IHN0YXRlLT50eF9idWY7CisKKwlQUklOVEQoKCJbSTJDXSB0eGJkID0gJTA4eFxuIiwgKGludCl0eGJkKSk7CisKKyAgICBpZiAoZmxhZ3MgJiBJMkNGX1NUQVJUX0NPTkQpCisgICAgeworCVBSSU5URCgoIltJMkNdIEZvcm1hdHRpbmcgYWRkcmVzc2VzLi4uXG4iKSk7CisJaWYgKGZsYWdzICYgSTJDRl9FTkFCTEVfU0VDT05EQVJZKQorCXsKKwkJdHhiZC0+bGVuZ3RoID0gc2l6ZSArIDI7ICAvKiBMZW5ndGggb2YgbWVzc2FnZSBwbHVzIGRlc3QgYWRkcmVzc2VzICovCisJCXR4YmQtPmFkZHJbMF0gPSBhZGRyZXNzIDw8IDE7CisJCXR4YmQtPmFkZHJbMV0gPSBzZWNvbmRhcnlfYWRkcmVzczsKKwkJaSA9IDI7CisJfQorCWVsc2UKKwl7CisJCXR4YmQtPmxlbmd0aCA9IHNpemUgKyAxOyAgLyogTGVuZ3RoIG9mIG1lc3NhZ2UgcGx1cyBkZXN0IGFkZHJlc3MgKi8KKwkJdHhiZC0+YWRkclswXSA9IGFkZHJlc3MgPDwgMTsgIC8qIFdyaXRlIGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gQkQgKi8KKwkJaSA9IDE7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCXR4YmQtPmxlbmd0aCA9IHNpemU7ICAvKiBMZW5ndGggb2YgbWVzc2FnZSAqLworCWkgPSAwOworICAgIH0KKworCS8qIHNldCB1cCB0eGJkICovCisJdHhiZC0+c3RhdHVzID0gQkRfU0NfUkVBRFk7CisJaWYgKGZsYWdzICYgSTJDRl9TVEFSVF9DT05EKQorCSAgdHhiZC0+c3RhdHVzIHw9IEJEX0kyQ19UWF9TVEFSVDsKKwlpZiAoZmxhZ3MgJiBJMkNGX1NUT1BfQ09ORCkKKwkgIHR4YmQtPnN0YXR1cyB8PSBCRF9TQ19MQVNUIHwgQkRfU0NfV1JBUDsKKworCS8qIENvcHkgZGF0YSB0byBzZW5kIGludG8gYnVmZmVyICovCisJUFJJTlREKCgiW0kyQ10gY29weSBkYXRhLi4uXG4iKSk7CisJZm9yKGogPSAwOyBqIDwgc2l6ZTsgaSsrLCBqKyspCisJICB0eGJkLT5hZGRyW2ldID0gZGF0YW91dFtqXTsKKworCVBSSU5URCgoIltJMkNdIHR4YmQ6IGxlbmd0aD0weCUwNHggc3RhdHVzPTB4JTA0eCBhZGRyWzBdPTB4JTAyeCBhZGRyWzFdPTB4JTAyeFxuIiwKKwkJICAgdHhiZC0+bGVuZ3RoLAorCQkgICB0eGJkLT5zdGF0dXMsCisJCSAgIHR4YmQtPmFkZHJbMF0sCisJCSAgIHR4YmQtPmFkZHJbMV0pKTsKKworCS8qIGFkdmFuY2Ugc3RhdGUgKi8KKwlzdGF0ZS0+dHhfYnVmICs9IHR4YmQtPmxlbmd0aDsKKwlzdGF0ZS0+dHhfc3BhY2UgLT0gdHhiZC0+bGVuZ3RoOworCXN0YXRlLT50eF9pZHgrKzsKKwlzdGF0ZS0+dHhiZCA9ICh2b2lkKikodHhiZCArIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYworaW50IGkyY19yZWNlaXZlKGkyY19zdGF0ZV90ICpzdGF0ZSwKKwkJCQl1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCisJCQkJdW5zaWduZWQgY2hhciBzZWNvbmRhcnlfYWRkcmVzcywKKwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQkJdW5zaWduZWQgc2hvcnQgc2l6ZV90b19leHBlY3QsCisJCQkJdW5zaWduZWQgY2hhciAqZGF0YWluKQoreworCXZvbGF0aWxlIEkyQ19CRCAqcnhiZCwgKnR4YmQ7CisKKwlQUklOVEQoKCJbSTJDXSBpMmNfcmVjZWl2ZSAlMDJkICUwMmQgJTAyZFxuIiwgYWRkcmVzcywgc2Vjb25kYXJ5X2FkZHJlc3MsIGZsYWdzKSk7CisKKwkvKiBFeHBlY3RlZCB0byByZWNlaXZlIHRvbyBtdWNoICovCisJaWYgKHNpemVfdG9fZXhwZWN0ID4gSTJDX1JYVFhfTEVOKQorCSAgcmV0dXJuIEkyQ0VSUl9NU0dfVE9PX0xPTkc7CisKKwkvKiBubyBtb3JlIGZyZWUgYmRzICovCisJaWYgKHN0YXRlLT50eF9pZHggPj0gTlVNX1RYX0JEUyB8fCBzdGF0ZS0+cnhfaWR4ID49IE5VTV9SWF9CRFMKKwkJIHx8IHN0YXRlLT50eF9zcGFjZSA8IDIpCisJICByZXR1cm4gSTJDRVJSX05PX0JVRkZFUlM7CisKKwlyeGJkID0gKEkyQ19CRCAqKXN0YXRlLT5yeGJkOworCXR4YmQgPSAoSTJDX0JEICopc3RhdGUtPnR4YmQ7CisKKwlQUklOVEQoKCJbSTJDXSByeGJkID0gJTA4eFxuIiwgKGludClyeGJkKSk7CisJUFJJTlREKCgiW0kyQ10gdHhiZCA9ICUwOHhcbiIsIChpbnQpdHhiZCkpOworCisJdHhiZC0+YWRkciA9IHN0YXRlLT50eF9idWY7CisKKwkvKiBzZXQgdXAgVFhCRCBmb3IgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWlmIChmbGFncyAmIEkyQ0ZfRU5BQkxFX1NFQ09OREFSWSkKKwl7CisJCXR4YmQtPmxlbmd0aCA9IDI7CisJCXR4YmQtPmFkZHJbMF0gPSBhZGRyZXNzIDw8IDE7ICAgLyogV3JpdGUgZGF0YSAqLworCQl0eGJkLT5hZGRyWzFdID0gc2Vjb25kYXJ5X2FkZHJlc3M7ICAvKiBJbnRlcm5hbCBhZGRyZXNzICovCisJCXR4YmQtPnN0YXR1cyA9IEJEX1NDX1JFQURZOworCX0KKwllbHNlCisJeworCQl0eGJkLT5sZW5ndGggPSAxICsgc2l6ZV90b19leHBlY3Q7CisJCXR4YmQtPmFkZHJbMF0gPSAoYWRkcmVzcyA8PCAxKSB8IDB4MDE7CisJCXR4YmQtPnN0YXR1cyA9IEJEX1NDX1JFQURZOworCQltZW1zZXQoJnR4YmQtPmFkZHJbMV0sIDAsIHR4YmQtPmxlbmd0aCk7CisJfQorCisJLyogc2V0IHVwIHJ4YmQgZm9yIHJlY2VwdGlvbiAqLworCXJ4YmQtPnN0YXR1cyA9IEJEX1NDX0VNUFRZOworCXJ4YmQtPmxlbmd0aCA9IHNpemVfdG9fZXhwZWN0OworCXJ4YmQtPmFkZHIgPSBkYXRhaW47CisKKwl0eGJkLT5zdGF0dXMgfD0gQkRfSTJDX1RYX1NUQVJUOworCWlmIChmbGFncyAmIEkyQ0ZfU1RPUF9DT05EKQorCXsKKwkJdHhiZC0+c3RhdHVzIHw9IEJEX1NDX0xBU1QgfCBCRF9TQ19XUkFQOworCQlyeGJkLT5zdGF0dXMgfD0gQkRfU0NfV1JBUDsKKwl9CisKKwlQUklOVEQoKCJbSTJDXSB0eGJkOiBsZW5ndGg9MHglMDR4IHN0YXR1cz0weCUwNHggYWRkclswXT0weCUwMnggYWRkclsxXT0weCUwMnhcbiIsCisJCSAgIHR4YmQtPmxlbmd0aCwKKwkJICAgdHhiZC0+c3RhdHVzLAorCQkgICB0eGJkLT5hZGRyWzBdLAorCQkgICB0eGJkLT5hZGRyWzFdKSk7CisJUFJJTlREKCgiW0kyQ10gcnhiZDogbGVuZ3RoPTB4JTA0eCBzdGF0dXM9MHglMDR4IGFkZHJbMF09MHglMDJ4IGFkZHJbMV09MHglMDJ4XG4iLAorCQkgICByeGJkLT5sZW5ndGgsCisJCSAgIHJ4YmQtPnN0YXR1cywKKwkJICAgcnhiZC0+YWRkclswXSwKKwkJICAgcnhiZC0+YWRkclsxXSkpOworCisJLyogYWR2YW5jZSBzdGF0ZSAqLworCXN0YXRlLT50eF9idWYgKz0gdHhiZC0+bGVuZ3RoOworCXN0YXRlLT50eF9zcGFjZSAtPSB0eGJkLT5sZW5ndGg7CisJc3RhdGUtPnR4X2lkeCsrOworCXN0YXRlLT50eGJkID0gKHZvaWQqKSh0eGJkICsgMSk7CisJc3RhdGUtPnJ4X2lkeCsrOworCXN0YXRlLT5yeGJkID0gKHZvaWQqKShyeGJkICsgMSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMKK2ludCBpMmNfZG9pbyhpMmNfc3RhdGVfdCAqc3RhdGUpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUiA7CisJdm9sYXRpbGUgaWljX3QgKmlpcDsKKwl2b2xhdGlsZSBpMmM4MjYwX3QgKmkyYwk9IChpMmM4MjYwX3QgKikmaW1tYXAtPmltX2kyYzsKKwl2b2xhdGlsZSBJMkNfQkQgKnR4YmQsICpyeGJkOworCWludCAgbiwgaSwgYiwgcnhjbnQgPSAwLCByeHRpbWVvID0gMCwgdHhjbnQgPSAwLCB0eHRpbWVvID0gMCwgcmMgPSAwOworCXVpbnQgZHBhZGRyOworCisJUFJJTlREKCgiW0kyQ10gaTJjX2RvaW9cbiIpKTsKKworCWlmIChzdGF0ZS0+dHhfaWR4IDw9IDAgJiYgc3RhdGUtPnJ4X2lkeCA8PSAwKSB7CisJCVBSSU5URCgoIltJMkNdIE5vIEkvTyBpcyBxdWV1ZWRcbiIpKTsKKwkJcmV0dXJuIEkyQ0VSUl9RVUVVRV9FTVBUWTsKKwl9CisKKwlkcGFkZHIgPSAqKCh1bnNpZ25lZCBzaG9ydCopKCZpbW1hcC0+aW1fZHByYW1iYXNlW1BST0ZGX0kyQ19CQVNFXSkpOworCWlpcCA9IChpaWNfdCAqKSZpbW1hcC0+aW1fZHByYW1iYXNlW2RwYWRkcl07CisJaWlwLT5paWNfcmJwdHIgPSBpaXAtPmlpY19yYmFzZTsKKwlpaXAtPmlpY190YnB0ciA9IGlpcC0+aWljX3RiYXNlOworCisJLyogRW5hYmxlIEkyQyAqLworCVBSSU5URCgoIltJMkNdIEVuYWJsaW5nIEkyQy4uLlxuIikpOworCWkyYy0+aTJjX2kybW9kIHw9IDB4MDE7CisKKwkvKiBCZWdpbiB0cmFuc21pc3Npb24gKi8KKwlpMmMtPmkyY19pMmNvbSB8PSAweDgwOworCisJLyogTG9vcCB1bnRpbCB0cmFuc21pdCAmIHJlY2VpdmUgY29tcGxldGVkICovCisKKwlpZiAoKG4gPSBzdGF0ZS0+dHhfaWR4KSA+IDApIHsKKworCQl0eGJkID0gKChJMkNfQkQqKXN0YXRlLT50eGJkKSAtIG47CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCXR4dGltZW8gKz0gVE9VVF9MT09QICogdHhiZC0+bGVuZ3RoOworCQkJdHhiZCsrOworCQl9CisKKwkJdHhiZC0tOyAvKiB3YWl0IHVudGlsIGxhc3QgaW4gbGlzdCBpcyBkb25lICovCisKKwkJUFJJTlREKCgiW0kyQ10gVHJhbnNtaXR0aW5nLi4uKHR4YmQ9MHglMDhseClcbiIsICh1bG9uZyl0eGJkKSk7CisKKwkJdWRlbGF5KFNUQVJUX0RFTEFZX1VTKTsJLyogZ2l2ZSBpdCB0aW1lIHRvIHN0YXJ0ICovCisJCXdoaWxlKCh0eGJkLT5zdGF0dXMgJiBCRF9TQ19SRUFEWSkgJiYgKCsrdHhjbnQgPCB0eHRpbWVvKSkgeworCQkJdWRlbGF5KERFTEFZX1VTKTsKKwkJCWlmIChjdHJsYygpKQorCQkJCXJldHVybiAoLTEpOworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCQl9CisJfQorCisJaWYgKHR4Y250IDwgdHh0aW1lbyAmJiAobiA9IHN0YXRlLT5yeF9pZHgpID4gMCkgeworCisJCXJ4YmQgPSAoKEkyQ19CRCopc3RhdGUtPnJ4YmQpIC0gbjsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJcnh0aW1lbyArPSBUT1VUX0xPT1AgKiByeGJkLT5sZW5ndGg7CisJCQlyeGJkKys7CisJCX0KKworCQlyeGJkLS07IC8qIHdhaXQgdW50aWwgbGFzdCBpbiBsaXN0IGlzIGRvbmUgKi8KKworCQlQUklOVEQoKCJbSTJDXSBSZWNlaXZpbmcuLi4ocnhiZD0weCUwOGx4KVxuIiwgKHVsb25nKXJ4YmQpKTsKKworCQl1ZGVsYXkoU1RBUlRfREVMQVlfVVMpOwkvKiBnaXZlIGl0IHRpbWUgdG8gc3RhcnQgKi8KKwkJd2hpbGUoKHJ4YmQtPnN0YXR1cyAmIEJEX1NDX0VNUFRZKSAmJiAoKytyeGNudCA8IHJ4dGltZW8pKSB7CisJCQl1ZGVsYXkoREVMQVlfVVMpOworCQkJaWYgKGN0cmxjKCkpCisJCQkJcmV0dXJuICgtMSk7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisJCX0KKwl9CisKKwkvKiBUdXJuIG9mZiBJMkMgKi8KKwlpMmMtPmkyY19pMm1vZCAmPSB+MHgwMTsKKworCWlmICgobiA9IHN0YXRlLT50eF9pZHgpID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQl0eGJkID0gKChJMkNfQkQqKXN0YXRlLT50eGJkKSAtIChuIC0gaSk7CisJCQlpZiAoKGIgPSB0eGJkLT5zdGF0dXMgJiBCRF9JMkNfVFhfRVJSKSAhPSAwKSB7CisJCQkJaWYgKHN0YXRlLT5lcnJfY2IgIT0gTlVMTCkKKwkJCQkJKCpzdGF0ZS0+ZXJyX2NiKShJMkNFQ0JfVFhfRVJSfGIsIGksCisJCQkJCQlzdGF0ZS0+Y2JfZGF0YSk7CisJCQkJaWYgKHJjID09IDApCisJCQkJCXJjID0gSTJDRVJSX0lPX0VSUk9SOworCQkJfQorCQl9CisJfQorCisJaWYgKChuID0gc3RhdGUtPnJ4X2lkeCkgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCXJ4YmQgPSAoKEkyQ19CRCopc3RhdGUtPnJ4YmQpIC0gKG4gLSBpKTsKKwkJCWlmICgoYiA9IHJ4YmQtPnN0YXR1cyAmIEJEX0kyQ19SWF9FUlIpICE9IDApIHsKKwkJCQlpZiAoc3RhdGUtPmVycl9jYiAhPSBOVUxMKQorCQkJCQkoKnN0YXRlLT5lcnJfY2IpKEkyQ0VDQl9SWF9FUlJ8YiwgaSwKKwkJCQkJCXN0YXRlLT5jYl9kYXRhKTsKKwkJCQlpZiAocmMgPT0gMCkKKwkJCQkJcmMgPSBJMkNFUlJfSU9fRVJST1I7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKHR4dGltZW8gPiAwICYmIHR4Y250ID49IHR4dGltZW8pIHx8IFwKKwkgICAgKHJ4dGltZW8gPiAwICYmIHJ4Y250ID49IHJ4dGltZW8pKSB7CisJCWlmIChzdGF0ZS0+ZXJyX2NiICE9IE5VTEwpCisJCQkoKnN0YXRlLT5lcnJfY2IpKEkyQ0VDQl9USU1FT1VULCAtMSwgc3RhdGUtPmNiX2RhdGEpOworCQlpZiAocmMgPT0gMCkKKwkJCXJjID0gSTJDRVJSX1RJTUVPVVQ7CisJfQorCisJcmV0dXJuIChyYyk7Cit9CisKK3N0YXRpYyB2b2lkCitpMmNfcHJvYmVfY2FsbGJhY2soaW50IGZsYWdzLCBpbnQgeG51bSwgdm9pZCAqZGF0YSkKK3sKKwkvKgorCSAqIHRoZSBvbmx5IGFjY2VwdGFibGUgZXJyb3JzIGFyZSBhIHRyYW5zbWl0IE5BSyBvciBhIHJlY2VpdmUKKwkgKiBvdmVycnVuIC0gdHggTkFLIG1lYW5zIHRoZSBkZXZpY2UgZG9lcyBub3QgZXhpc3QsIHJ4IE9WCisJICogbWVhbnMgdGhlIGRldmljZSBtdXN0IGhhdmUgcmVzcG9uZGVkIHRvIHRoZSBzbGF2ZSBhZGRyZXNzCisJICogZXZlbiB0aG91Z2ggdGhlIHRyYW5zZmVyIGZhaWxlZAorCSAqLworCWlmIChmbGFncyA9PSAoSTJDRUNCX1RYX0VSUnxJMkNFQ0JfVFhfTkFLKSkKKwkJKihpbnQgKilkYXRhIHw9IDE7CisJaWYgKGZsYWdzID09IChJMkNFQ0JfUlhfRVJSfEkyQ0VDQl9SWF9PVikpCisJCSooaW50ICopZGF0YSB8PSAyOworfQorCitpbnQKK2kyY19wcm9iZSh1Y2hhciBjaGlwKQoreworCWkyY19zdGF0ZV90IHN0YXRlOworCWludCByYywgZXJyX2ZsYWc7CisJdWNoYXIgYnVmWzFdOworCisJaTJjX25ld2lvKCZzdGF0ZSk7CisKKwlzdGF0ZS5lcnJfY2IgPSBpMmNfcHJvYmVfY2FsbGJhY2s7CisJc3RhdGUuY2JfZGF0YSA9ICh2b2lkICopICZlcnJfZmxhZzsKKwllcnJfZmxhZyA9IDA7CisKKwlyYyA9IGkyY19yZWNlaXZlKCZzdGF0ZSwgY2hpcCwgMCwgSTJDRl9TVEFSVF9DT05EfEkyQ0ZfU1RPUF9DT05ELCAxLCBidWYpOworCisJaWYgKHJjICE9IDApCisJCXJldHVybiAocmMpOwkvKiBwcm9iZSBmYWlsZWQgKi8KKworCXJjID0gaTJjX2RvaW8oJnN0YXRlKTsKKworCWlmIChyYyA9PSAwKQorCQlyZXR1cm4gKDApOwkvKiBkZXZpY2UgZXhpc3RzIC0gcmVhZCBzdWNjZWVkZWQgKi8KKworCWlmIChyYyA9PSBJMkNFUlJfVElNRU9VVCkKKwkJcmV0dXJuICgtMSk7CS8qIGRldmljZSBkb2VzIG5vdCBleGlzdCAtIHRpbWVvdXQgKi8KKworCWlmIChyYyAhPSBJMkNFUlJfSU9fRVJST1IgfHwgZXJyX2ZsYWcgPT0gMCkKKwkJcmV0dXJuIChyYyk7CS8qIHByb2JlIGZhaWxlZCAqLworCisJaWYgKGVycl9mbGFnICYgMSkKKwkJcmV0dXJuICgtMSk7CS8qIGRldmljZSBkb2VzIG5vdCBleGlzdCAtIGhhZCB0cmFuc21pdCBOQUsgKi8KKworCXJldHVybiAoMCk7CS8qIGRldmljZSBleGlzdHMgLSBoYWQgcmVjZWl2ZSBvdmVycnVuICovCit9CisKKworaW50CitpMmNfcmVhZCh1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWkyY19zdGF0ZV90IHN0YXRlOworCXVjaGFyIHhhZGRyWzRdOworCWludCByYzsKKworCXhhZGRyWzBdID0gKGFkZHIgPj4gMjQpICYgMHhGRjsKKwl4YWRkclsxXSA9IChhZGRyID4+IDE2KSAmIDB4RkY7CisJeGFkZHJbMl0gPSAoYWRkciA+PiAgOCkgJiAweEZGOworCXhhZGRyWzNdID0gIGFkZHIgICAgICAgICYgMHhGRjsKKworI2lmZGVmIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX09WRVJGTE9XCisJIC8qCisJICAqIEVFUFJPTSBjaGlwcyB0aGF0IGltcGxlbWVudCAiYWRkcmVzcyBvdmVyZmxvdyIgYXJlIG9uZXMKKwkgICogbGlrZSBDYXRhbHlzdCAyNFdDMDQvMDgvMTYgd2hpY2ggaGFzIDkvMTAvMTEgYml0cyBvZiBhZGRyZXNzCisJICAqIGFuZCB0aGUgZXh0cmEgYml0cyBlbmQgdXAgaW4gdGhlICJjaGlwIGFkZHJlc3MiIGJpdCBzbG90cy4KKwkgICogVGhpcyBtYWtlcyBhIDI0V0MwOCAoMUtieXRlKSBjaGlwIGxvb2sgbGlrZSBmb3VyIDI1NiBieXRlCisJICAqIGNoaXBzLgorCSAgKgorCSAgKiBOb3RlIHRoYXQgd2UgY29uc2lkZXIgdGhlIGxlbmd0aCBvZiB0aGUgYWRkcmVzcyBmaWVsZCB0byBzdGlsbAorCSAgKiBiZSBvbmUgYnl0ZSBiZWNhdXNlIHRoZSBleHRyYSBhZGRyZXNzIGJpdHMgYXJlIGhpZGRlbiBpbiB0aGUKKwkgICogY2hpcCBhZGRyZXNzLgorCSAgKi8KKwljaGlwIHw9ICgoYWRkciA+PiAoYWxlbiAqIDgpKSAmIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX09WRVJGTE9XKTsKKyNlbmRpZgorCisJaTJjX25ld2lvKCZzdGF0ZSk7CisKKwlyYyA9IGkyY19zZW5kKCZzdGF0ZSwgY2hpcCwgMCwgSTJDRl9TVEFSVF9DT05ELCBhbGVuLCAmeGFkZHJbNC1hbGVuXSk7CisJaWYgKHJjICE9IDApIHsKKwkJcHJpbnRmKCJpMmNfcmVhZDogaTJjX3NlbmQgZmFpbGVkICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmMgPSBpMmNfcmVjZWl2ZSgmc3RhdGUsIGNoaXAsIDAsIEkyQ0ZfU1RPUF9DT05ELCBsZW4sIGJ1ZmZlcik7CisJaWYgKHJjICE9IDApIHsKKwkJcHJpbnRmKCJpMmNfcmVhZDogaTJjX3JlY2VpdmUgZmFpbGVkICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmMgPSBpMmNfZG9pbygmc3RhdGUpOworCWlmIChyYyAhPSAwKSB7CisJCXByaW50ZigiaTJjX3JlYWQ6IGkyY19kb2lvIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitpMmNfd3JpdGUodWNoYXIgY2hpcCwgdWludCBhZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpMmNfc3RhdGVfdCBzdGF0ZTsKKwl1Y2hhciB4YWRkcls0XTsKKwlpbnQgcmM7CisKKwl4YWRkclswXSA9IChhZGRyID4+IDI0KSAmIDB4RkY7CisJeGFkZHJbMV0gPSAoYWRkciA+PiAxNikgJiAweEZGOworCXhhZGRyWzJdID0gKGFkZHIgPj4gIDgpICYgMHhGRjsKKwl4YWRkclszXSA9ICBhZGRyICAgICAgICAmIDB4RkY7CisKKyNpZmRlZiBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVworCSAvKgorCSAgKiBFRVBST00gY2hpcHMgdGhhdCBpbXBsZW1lbnQgImFkZHJlc3Mgb3ZlcmZsb3ciIGFyZSBvbmVzCisJICAqIGxpa2UgQ2F0YWx5c3QgMjRXQzA0LzA4LzE2IHdoaWNoIGhhcyA5LzEwLzExIGJpdHMgb2YgYWRkcmVzcworCSAgKiBhbmQgdGhlIGV4dHJhIGJpdHMgZW5kIHVwIGluIHRoZSAiY2hpcCBhZGRyZXNzIiBiaXQgc2xvdHMuCisJICAqIFRoaXMgbWFrZXMgYSAyNFdDMDggKDFLYnl0ZSkgY2hpcCBsb29rIGxpa2UgZm91ciAyNTYgYnl0ZQorCSAgKiBjaGlwcy4KKwkgICoKKwkgICogTm90ZSB0aGF0IHdlIGNvbnNpZGVyIHRoZSBsZW5ndGggb2YgdGhlIGFkZHJlc3MgZmllbGQgdG8gc3RpbGwKKwkgICogYmUgb25lIGJ5dGUgYmVjYXVzZSB0aGUgZXh0cmEgYWRkcmVzcyBiaXRzIGFyZSBoaWRkZW4gaW4gdGhlCisJICAqIGNoaXAgYWRkcmVzcy4KKwkgICovCisJY2hpcCB8PSAoKGFkZHIgPj4gKGFsZW4gKiA4KSkgJiBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVyk7CisjZW5kaWYKKworCWkyY19uZXdpbygmc3RhdGUpOworCisJcmMgPSBpMmNfc2VuZCgmc3RhdGUsIGNoaXAsIDAsIEkyQ0ZfU1RBUlRfQ09ORCwgYWxlbiwgJnhhZGRyWzQtYWxlbl0pOworCWlmIChyYyAhPSAwKSB7CisJCXByaW50ZigiaTJjX3dyaXRlOiBmaXJzdCBpMmNfc2VuZCBmYWlsZWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyYyA9IGkyY19zZW5kKCZzdGF0ZSwgMCwgMCwgSTJDRl9TVE9QX0NPTkQsIGxlbiwgYnVmZmVyKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGYoImkyY193cml0ZTogc2Vjb25kIGkyY19zZW5kIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiAxOworCX0KKworCXJjID0gaTJjX2RvaW8oJnN0YXRlKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGYoImkyY193cml0ZTogaTJjX2RvaW8gZmFpbGVkICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfSTJDX01VTFRJX0JVUykKKy8qCisgKiBGdW5jdGlvbnMgZm9yIG11bHRpcGxlIEkyQyBidXMgaGFuZGxpbmcKKyAqLwordW5zaWduZWQgaW50IGkyY19nZXRfYnVzX251bSh2b2lkKQoreworCXJldHVybiBpMmNfYnVzX251bTsKK30KKworaW50IGkyY19zZXRfYnVzX251bSh1bnNpZ25lZCBpbnQgYnVzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0kyQ19NVVgpCisJaWYgKGJ1cyA8IENPTkZJR19TWVNfTUFYX0kyQ19CVVMpIHsKKwkJaTJjX2J1c19udW0gPSBidXM7CisJfSBlbHNlIHsKKwkJaW50CXJldDsKKworCQlyZXQgPSBpMnhfbXV4X3NlbGVjdF9tdXgoYnVzKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJaTJjX2J1c19udW0gPSBidXM7CisJCWVsc2UKKwkJCXJldHVybiByZXQ7CisJfQorI2Vsc2UKKwlpZiAoYnVzID49IENPTkZJR19TWVNfTUFYX0kyQ19CVVMpCisJCXJldHVybiAtMTsKKwlpMmNfYnVzX251bSA9IGJ1czsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisjZW5kaWYJLyogQ09ORklHX0kyQ19NVUxUSV9CVVMgKi8KKyNlbmRpZgkvKiBDT05GSUdfSEFSRF9JMkMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9pbnRlcnJ1cHRzLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvaW50ZXJydXB0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDZjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvaW50ZXJydXB0cy5jCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogSGFja2VkIGZvciBNUEM4MjYwIGJ5IE11cnJheS5KZW5zZW5AY21zdC5jc2lyby5hdSwgMjItT2N0LTAwCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtcGM4MjYwLmg+CisjaW5jbHVkZSA8bXBjODI2MF9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGlycV9hY3Rpb24geworCWludGVycnVwdF9oYW5kbGVyX3QgKmhhbmRsZXI7CisJdm9pZCAqYXJnOworCXVsb25nIGNvdW50OworfTsKKworc3RhdGljIHN0cnVjdCBpcnFfYWN0aW9uIGlycV9oYW5kbGVyc1tOUl9JUlFTXTsKKworc3RhdGljIHVsb25nIHBwY19jYWNoZWRfaXJxX21hc2tbTlJfTUFTS19XT1JEU107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogdGhpcyBzZWN0aW9uIHdhcyByaXBwZWQgb3V0IG9mIGFyY2gvcG93ZXJwYy9rZXJuZWwvcHBjODI2MF9waWMuYyBpbiB0aGUJICAgICovCisvKiBMaW51eC9QUEMgMi40Lnggc291cmNlLiBUaGVyZSB3YXMgbm8gY29weXJpZ2h0IG5vdGljZSBpbiB0aGF0IGZpbGUuCSAgICAqLworCisvKiBUaGUgODI2MCBpbnRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbGxlci4gIEl0IGlzIHVzdWFsbHkKKyAqIHRoZSBvbmx5IGludGVycnVwdCBjb250cm9sbGVyLgorICogVGhlcmUgYXJlIHR3byAzMi1iaXQgcmVnaXN0ZXJzIChoaWdoL2xvdykgZm9yIHVwIHRvIDY0CisgKiBwb3NzaWJsZSBpbnRlcnJ1cHRzLgorICoKKyAqIE5vdywgdGhlIGZ1biBzdGFydHMuLi4uLkludGVycnVwdCBOdW1iZXJzIERPIE5PVCBNQVAKKyAqIGluIGEgc2ltcGxlIGFyaXRobWV0aWMgZmFzaGlvbiB0byBtYXNrIG9yIHBlbmRpbmcgcmVnaXN0ZXJzLgorICogVGhhdCBpcywgaW50ZXJydXB0IDQgZG9lcyBub3QgbWFwIHRvIGJpdCBwb3NpdGlvbiA0LgorICogV2UgY3JlYXRlIHR3byB0YWJsZXMsIGluZGV4ZWQgYnkgdmVjdG9yIG51bWJlciwgdG8gaW5kaWNhdGUKKyAqIHdoaWNoIHJlZ2lzdGVyIHRvIHVzZSBhbmQgd2hpY2ggYml0IGluIHRoZSByZWdpc3RlciB0byB1c2UuCisgKi8KK3N0YXRpYyB1X2NoYXIgaXJxX3RvX3NpdXJlZ1tdID0geworCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworc3RhdGljIHVfY2hhciBpcnFfdG9fc2l1Yml0W10gPSB7CisJMzEsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLAorCTIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwKKwkyOSwgMzAsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsCisJMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDMxLAorCTAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsCisJOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKwkxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LAorCTcsIDYsIDUsIDQsIDMsIDIsIDEsIDAKK307CisKK3N0YXRpYyB2b2lkIG04MjYwX21hc2tfaXJxICh1bnNpZ25lZCBpbnQgaXJxX25yKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJaW50IGJpdCwgd29yZDsKKwl2b2xhdGlsZSB1aW50ICpzaW1yOworCisJYml0ID0gaXJxX3RvX3NpdWJpdFtpcnFfbnJdOworCXdvcmQgPSBpcnFfdG9fc2l1cmVnW2lycV9ucl07CisKKwlzaW1yID0gJihpbW1yLT5pbV9pbnRjdGwuaWNfc2ltcmgpOworCXBwY19jYWNoZWRfaXJxX21hc2tbd29yZF0gJj0gfigxIDw8ICgzMSAtIGJpdCkpOworCXNpbXJbd29yZF0gPSBwcGNfY2FjaGVkX2lycV9tYXNrW3dvcmRdOworfQorCitzdGF0aWMgdm9pZCBtODI2MF91bm1hc2tfaXJxICh1bnNpZ25lZCBpbnQgaXJxX25yKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJaW50IGJpdCwgd29yZDsKKwl2b2xhdGlsZSB1aW50ICpzaW1yOworCisJYml0ID0gaXJxX3RvX3NpdWJpdFtpcnFfbnJdOworCXdvcmQgPSBpcnFfdG9fc2l1cmVnW2lycV9ucl07CisKKwlzaW1yID0gJihpbW1yLT5pbV9pbnRjdGwuaWNfc2ltcmgpOworCXBwY19jYWNoZWRfaXJxX21hc2tbd29yZF0gfD0gKDEgPDwgKDMxIC0gYml0KSk7CisJc2ltclt3b3JkXSA9IHBwY19jYWNoZWRfaXJxX21hc2tbd29yZF07Cit9CisKK3N0YXRpYyB2b2lkIG04MjYwX21hc2tfYW5kX2FjayAodW5zaWduZWQgaW50IGlycV9ucikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCWludCBiaXQsIHdvcmQ7CisJdm9sYXRpbGUgdWludCAqc2ltciwgKnNpcG5yOworCisJYml0ID0gaXJxX3RvX3NpdWJpdFtpcnFfbnJdOworCXdvcmQgPSBpcnFfdG9fc2l1cmVnW2lycV9ucl07CisKKwlzaW1yID0gJihpbW1yLT5pbV9pbnRjdGwuaWNfc2ltcmgpOworCXNpcG5yID0gJihpbW1yLT5pbV9pbnRjdGwuaWNfc2lwbnJoKTsKKwlwcGNfY2FjaGVkX2lycV9tYXNrW3dvcmRdICY9IH4oMSA8PCAoMzEgLSBiaXQpKTsKKwlzaW1yW3dvcmRdID0gcHBjX2NhY2hlZF9pcnFfbWFza1t3b3JkXTsKKwlzaXBuclt3b3JkXSA9IDEgPDwgKDMxIC0gYml0KTsKK30KKworc3RhdGljIGludCBtODI2MF9nZXRfaXJxIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCWludCBpcnE7CisJdW5zaWduZWQgbG9uZyBiaXRzOworCisJLyogRm9yIE1QQzgyNjAsIHJlYWQgdGhlIFNJVkVDIHJlZ2lzdGVyIGFuZCBzaGlmdCB0aGUgYml0cyBkb3duCisJICogdG8gZ2V0IHRoZSBpcnEgbnVtYmVyLiAgICAgICAgICovCisJYml0cyA9IGltbXItPmltX2ludGN0bC5pY19zaXZlYzsKKwlpcnEgPSBiaXRzID4+IDI2OworCXJldHVybiBpcnE7Cit9CisKKy8qIGVuZCBvZiBjb2RlIHJpcHBlZCBvdXQgb2YgYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGM4MjYwX3BpYy5jCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgaW50ZXJydXB0X2luaXRfY3B1ICh1bnNpZ25lZCAqZGVjcmVtZW50ZXJfY291bnQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKworCSpkZWNyZW1lbnRlcl9jb3VudCA9IChnZC0+YnVzX2NsayAvIDQpIC8gQ09ORklHX1NZU19IWjsKKworCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hcHBpbmcgcHJpb3JpdGllcyAqLworCWltbXItPmltX2ludGN0bC5pY19zaWNyID0gMDsKKwlpbW1yLT5pbV9pbnRjdGwuaWNfc2lwcnIgPSAweDA1MzA5NzcwOworCWltbXItPmltX2ludGN0bC5pY19zY3BycmggPSAweDA1MzA5NzcwOworCWltbXItPmltX2ludGN0bC5pY19zY3BycmwgPSAweDA1MzA5NzcwOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgY2xlYXIgYWxsIHBlbmRpbmcgYml0cyAqLworCWltbXItPmltX2ludGN0bC5pY19zaW1yaCA9IHBwY19jYWNoZWRfaXJxX21hc2tbMF0gPSAwOworCWltbXItPmltX2ludGN0bC5pY19zaW1ybCA9IHBwY19jYWNoZWRfaXJxX21hc2tbMV0gPSAwOworCWltbXItPmltX2ludGN0bC5pY19zaXBucmggPSAweGZmZmZmZmZmOworCWltbXItPmltX2ludGN0bC5pY19zaXBucmwgPSAweGZmZmZmZmZmOworCisjaWZkZWYgQ09ORklHX0hZTU9ECisJLyoKKwkgKiBlbnN1cmUgYWxsIGV4dGVybmFsIGludGVycnVwdCBzb3VyY2VzIGRlZmF1bHQgdG8gdHJpZ2dlciBvbgorCSAqIGhpZ2gtdG8tbG93IHRyYW5zaXRpb24gKGkuZS4gZWRnZSB0cmlnZ2VyZWQgYWN0aXZlIGxvdykKKwkgKi8KKwlpbW1yLT5pbV9pbnRjdGwuaWNfc2lleHIgPSAtMTsKKyNlbmRpZgorCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIYW5kbGUgZXh0ZXJuYWwgaW50ZXJydXB0cworICovCit2b2lkIGV4dGVybmFsX2ludGVycnVwdCAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGlycSwgdW5tYXNrID0gMTsKKworCWlycSA9IG04MjYwX2dldF9pcnEgKHJlZ3MpOworCisJbTgyNjBfbWFza19hbmRfYWNrIChpcnEpOworCisJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwlpZiAoaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlciAhPSBOVUxMKQorCQkoKmlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIpIChpcnFfaGFuZGxlcnNbaXJxXS5hcmcpOworCWVsc2UgeworCQlwcmludGYgKCJcbkJvZ3VzIEV4dGVybmFsIEludGVycnVwdCBJUlEgJWRcbiIsIGlycSk7CisJCS8qCisJCSAqIHR1cm4gb2ZmIHRoZSBib2d1cyBpbnRlcnJ1cHQsIG90aGVyd2lzZSBpdAorCQkgKiBtaWdodCByZXBlYXQgZm9yZXZlcgorCQkgKi8KKwkJdW5tYXNrID0gMDsKKwl9CisKKwlpZiAodW5tYXNrKQorCQltODI2MF91bm1hc2tfaXJxIChpcnEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEluc3RhbGwgYW5kIGZyZWUgYW4gaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KKwordm9pZAoraXJxX2luc3RhbGxfaGFuZGxlciAoaW50IGlycSwgaW50ZXJydXB0X2hhbmRsZXJfdCAqIGhhbmRsZXIsIHZvaWQgKmFyZykKK3sKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPj0gTlJfSVJRUykgeworCQlwcmludGYgKCJpcnFfaW5zdGFsbF9oYW5kbGVyOiBiYWQgaXJxIG51bWJlciAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyICE9IE5VTEwpCisJCXByaW50ZiAoImlycV9pbnN0YWxsX2hhbmRsZXI6IDB4JTA4bHggcmVwbGFjaW5nIDB4JTA4bHhcbiIsCisJCQkJKHVsb25nKSBoYW5kbGVyLCAodWxvbmcpIGlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIpOworCisJaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlciA9IGhhbmRsZXI7CisJaXJxX2hhbmRsZXJzW2lycV0uYXJnID0gYXJnOworCisJbTgyNjBfdW5tYXNrX2lycSAoaXJxKTsKK30KKwordm9pZCBpcnFfZnJlZV9oYW5kbGVyIChpbnQgaXJxKQoreworCWlmIChpcnEgPCAwIHx8IGlycSA+PSBOUl9JUlFTKSB7CisJCXByaW50ZiAoImlycV9mcmVlX2hhbmRsZXI6IGJhZCBpcnEgbnVtYmVyICVkXG4iLCBpcnEpOworCQlyZXR1cm47CisJfQorCisJbTgyNjBfbWFza19pcnEgKGlycSk7CisKKwlpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyID0gTlVMTDsKKwlpcnFfaGFuZGxlcnNbaXJxXS5hcmcgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCB0aW1lcl9pbnRlcnJ1cHRfY3B1IChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBub3RoaW5nIHRvIGRvIGhlcmUgKi8KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKKworLyogcmlwcGVkIHRoaXMgb3V0IG9mIHBwYzR4eC9pbnRlcnJ1cHRzLmMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogaXJxaW5mbyAtIHByaW50IGluZm9ybWF0aW9uIGFib3V0IFBDSSBkZXZpY2VzCisqCisqLwordm9pZAorZG9faXJxaW5mbyAoY21kX3RibF90ICogY21kdHAsIGJkX3QgKiBiZCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGlycSwgcmVfZW5hYmxlOworCisJcmVfZW5hYmxlID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJcHV0cyAoIlxuSW50ZXJydXB0LUluZm9ybWF0aW9uOlxuIgorCQkiTnIgIFJvdXRpbmUgICBBcmcgICAgICAgQ291bnRcbiIpOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCAzMjsgaXJxKyspCisJCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyICE9IE5VTEwpCisJCQlwcmludGYgKCIlMDJkICAlMDhseCAgJTA4bHggICVsZFxuIiwgaXJxLAorCQkJCQkodWxvbmcpIGlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIsCisJCQkJCSh1bG9uZykgaXJxX2hhbmRsZXJzW2lycV0uYXJnLAorCQkJCQlpcnFfaGFuZGxlcnNbaXJxXS5jb3VudCk7CisKKwlpZiAocmVfZW5hYmxlKQorCQllbmFibGVfaW50ZXJydXB0cyAoKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAva2dkYi5TIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2tnZGIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTkzNmM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2tnZGIuUwpAQCAtMCwwICsxLDcyIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMAlNdXJyYXkgSmVuc2VuIDxNdXJyYXkuSmVuc2VuQGNtc3QuY3Npcm8uYXU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtcGM4MjYwLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorCisjZGVmaW5lIENPTkZJR184MjYwIDEJCS8qIG5lZWRlZCBmb3IgTGludXgga2VybmVsIGhlYWRlciBmaWxlcyAqLworI2RlZmluZSBfTElOVVhfQ09ORklHX0ggMQkvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZQkqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKworIC8qCisgKiBjYWNoZSBmbHVzaGluZyByb3V0aW5lcyBmb3Iga2dkYgorICovCisKKwkuZ2xvYmwJa2dkYl9mbHVzaF9jYWNoZV9hbGwKK2tnZGJfZmx1c2hfY2FjaGVfYWxsOgorCW1mc3ByCXIzLCBISUQwCisJb3JpCXIzLCByMywgSElEMF9JQ0ZJfEhJRDBfRENJCS8qIEludmFsaWRhdGUgQWxsICovCisJU1lOQworCW10c3ByCUhJRDAsIHIzCisJYmxyCisKKwkuZ2xvYmwJa2dkYl9mbHVzaF9jYWNoZV9yYW5nZQora2dkYl9mbHVzaF9jYWNoZV9yYW5nZToKKwlsaQlyNSxDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFLTEKKwlhbmRjCXIzLHIzLHI1CisJc3ViZglyNCxyMyxyNAorCWFkZAlyNCxyNCxyNQorCXNyd2kuCXI0LHI0LENPTkZJR19TWVNfQ0FDSEVMSU5FX1NISUZUCisJYmVxbHIKKwltdGN0cglyNAorCW1yCXI2LHIzCisxOglkY2JzdAkwLHIzCisJYWRkaQlyMyxyMyxDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCisJYmRuegkxYgorCXN5bmMJCQkJLyogd2FpdCBmb3IgZGNic3QncyB0byBnZXQgdG8gcmFtICovCisJbXRjdHIJcjQKKzI6CWljYmkJMCxyNgorCWFkZGkJcjYscjYsQ09ORklHX1NZU19DQUNIRUxJTkVfU0laRQorCWJkbnoJMmIKKwlTWU5DCisJYmxyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3BjaS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTRiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvcGNpLmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIFZpdGFseSBCb3JkdWcgPHZib3JkdWdAcnUubXZpc3RhLmNvbT4KKyAqIEFkZGVkIHN1cHBvcnQgZm9yIFBDSSBicmlkZ2Ugb24gTVBDODI3MkFEUworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19QQ0kKKworI2luY2x1ZGUgPHBjaS5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDxhc20vbTgyNjBfcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaWZkZWYgQ09ORklHX09GX0xJQkZEVAorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgQ09ORklHX01QQzgyNjZBRFMgfHwgZGVmaW5lZCBDT05GSUdfTVBDODI3MiB8fCBkZWZpbmVkIENPTkZJR19QTTgyNgorREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisjZW5kaWYKKworLyoKKyAqICAgTG9jYWwtPlBDSSBtYXAgKGZyb20gQ1BVKQkJCQkgICBjb250cm9sbGVkIGJ5CisgKiAgIE1QQzgyNnggbWFzdGVyIHdpbmRvdworICoKKyAqICAgMHg4MDAwMDAwMCAtIDB4QkZGRkZGRkYJQ1BVMlBDSSBzcGFjZQkJICAgUENJQlIwCisgKiAgIDB4RjQwMDAwMDAgLSAweEY3RkZGRkZGCUNQVTJQQ0kgc3BhY2UJCSAgIFBDSUJSMQorICoKKyAqICAgMHg4MDAwMDAwMCAtIDB4OUZGRkZGRkYJMHg4MDAwMDAwMCAtIDB4OUZGRkZGRkYJICAoT3V0Ym91bmQgQVRVICMxKQorICoJCQkJUENJIE1lbSB3aXRoIHByZWZldGNoCisgKgorICogICAweEEwMDAwMDAwIC0gMHhCRkZGRkZGRgkweEEwMDAwMDAwIC0gMHhCRkZGRkZGRgkgIChPdXRib3VuZCBBVFUgIzIpCisgKgkJCQlQQ0kgTWVtIHcvbyAgcHJlZmV0Y2gKKyAqCisgKiAgIDB4RjQwMDAwMDAgLSAweEY3RkZGRkZGCTB4MDAwMDAwMDAgLSAweDAzRkZGRkZGCSAgKE91dGJvdW5kIEFUVSAjMykKKyAqCQkJCTMyLWJpdCBQQ0kgSU8KKyAqCisgKiAgIFBDSS0+TG9jYWwgbWFwIChmcm9tIFBDSSkKKyAqICAgTVBDODI2eCBzbGF2ZSB3aW5kb3cJCQkJICAgY29udHJvbGxlZCBieQorICoKKyAqICAgMHgwMDAwMDAwMCAtIDB4MUZGRkZGRkYJMHgwMDAwMDAwMCAtIDB4MUZGRkZGRkYJICAoSW5ib3VuZCBBVFUgIzEpCisgKgkJCQlNUEM4MjZ4IGxvY2FsIG1lbW9yeQorICovCisKKy8qCisgKiBTbGF2ZSB3aW5kb3cgdGhhdCBhbGxvd3MgUENJIG1hc3RlcnMgdG8gYWNjZXNzIE1QQzgyNnggbG9jYWwgbWVtb3J5LgorICogVGhpcyB3aW5kb3cgaXMgc2V0IHVwIHVzaW5nIHRoZSBmaXJzdCBzZXQgb2YgSW5ib3VuZCBBVFUgcmVnaXN0ZXJzCisgKi8KKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSV9TTFZfTUVNX0xPQ0FMCisjZGVmaW5lIFBDSV9TTFZfTUVNX0xPQ0FMIENPTkZJR19TWVNfU0RSQU1fQkFTRQkvKiBMb2NhbCBiYXNlICovCisjZWxzZQorI2RlZmluZSBQQ0lfU0xWX01FTV9MT0NBTCBDT05GSUdfU1lTX1BDSV9TTFZfTUVNX0xPQ0FMCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSV9TTFZfTUVNX0JVUworI2RlZmluZSBQQ0lfU0xWX01FTV9CVVMgMHgwMDAwMDAwMAkvKiBQQ0kgYmFzZSAqLworI2Vsc2UKKyNkZWZpbmUgUENJX1NMVl9NRU1fQlVTIENPTkZJR19TWVNfUENJX1NMVl9NRU1fQlVTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BJQ01SMF9NQVNLX0FUVFJJQgorI2RlZmluZSBQSUNNUjBfTUFTS19BVFRSSUIJKFBJQ01SX01BU0tfNTEyTUIgfCBQSUNNUl9FTkFCTEUgfCBcCisJCQkJIFBJQ01SX1BSRUZFVENIX0VOKQorI2Vsc2UKKyNkZWZpbmUgUElDTVIwX01BU0tfQVRUUklCIENPTkZJR19TWVNfUElDTVIwX01BU0tfQVRUUklCCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgd2luZG93cyB0aGF0IGFsbG93IHRoZSBDUFUgdG8gYWNjZXNzIFBDSSBhZGRyZXNzIHNwYWNlLgorICogQWxsIHRocmVlIFBDSSBtYXN0ZXIgd2luZG93cywgd2hpY2ggYWxsb3cgdGhlIENQVSB0byBhY2Nlc3MgUENJCisgKiBwcmVmZXRjaCwgbm9uIHByZWZldGNoLCBhbmQgSU8gc3BhY2UgKHNlZSBiZWxvdyksIG11c3QgYWxsIGZpdCB3aXRoaW4KKyAqIHRoZXNlIHdpbmRvd3MuCisgKi8KKworLyogUENJQlIwICovCisjaWZuZGVmIENPTkZJR19TWVNfUENJX01TVFIwX0xPQ0FMCisjZGVmaW5lIFBDSV9NU1RSMF9MT0NBTAkJMHg4MDAwMDAwMAkvKiBMb2NhbCBiYXNlICovCisjZWxzZQorI2RlZmluZSBQQ0lfTVNUUjBfTE9DQUwgQ09ORklHX1NZU19QQ0lfTVNUUjBfTE9DQUwKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUENJTVNLMF9NQVNLCisjZGVmaW5lIFBDSU1TSzBfTUFTSwkJUENJTVNLXzFHQgkvKiBTaXplIG9mIHdpbmRvdyAqLworI2Vsc2UKKyNkZWZpbmUgUENJTVNLMF9NQVNLCUNPTkZJR19TWVNfUENJTVNLMF9NQVNLCisjZW5kaWYKKworLyogUENJQlIxICovCisjaWZuZGVmIENPTkZJR19TWVNfUENJX01TVFIxX0xPQ0FMCisjZGVmaW5lIFBDSV9NU1RSMV9MT0NBTAkJMHhGNDAwMDAwMAkvKiBMb2NhbCBiYXNlICovCisjZWxzZQorI2RlZmluZSBQQ0lfTVNUUjFfTE9DQUwJCUNPTkZJR19TWVNfUENJX01TVFIxX0xPQ0FMCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSU1TSzFfTUFTSworI2RlZmluZQkgUENJTVNLMV9NQVNLCQlQQ0lNU0tfNjRNQgkvKiBTaXplIG9mIHdpbmRvdyAqLworI2Vsc2UKKyNkZWZpbmUJIFBDSU1TSzFfTUFTSwkJQ09ORklHX1NZU19QQ0lNU0sxX01BU0sKKyNlbmRpZgorCisvKgorICogTWFzdGVyIHdpbmRvdyB0aGF0IGFsbG93cyB0aGUgQ1BVIHRvIGFjY2VzcyBQQ0kgTWVtb3J5IChwcmVmZXRjaCkuCisgKiBUaGlzIHdpbmRvdyB3aWxsIGJlIHNldHVwIHdpdGggdGhlIGZpcnN0IHNldCBvZiBPdXRib3VuZCBBVFUgcmVnaXN0ZXJzCisgKiBpbiB0aGUgYnJpZGdlLgorICovCisKKyNpZm5kZWYgQ09ORklHX1NZU19QQ0lfTVNUUl9NRU1fTE9DQUwKKyNkZWZpbmUgUENJX01TVFJfTUVNX0xPQ0FMIDB4ODAwMDAwMDAJLyogTG9jYWwgYmFzZSAqLworI2Vsc2UKKyNkZWZpbmUgUENJX01TVFJfTUVNX0xPQ0FMIENPTkZJR19TWVNfUENJX01TVFJfTUVNX0xPQ0FMCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSV9NU1RSX01FTV9CVVMKKyNkZWZpbmUgUENJX01TVFJfTUVNX0JVUyAweDgwMDAwMDAwCS8qIFBDSSBiYXNlICAgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSX01FTV9CVVMgQ09ORklHX1NZU19QQ0lfTVNUUl9NRU1fQlVTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX0NQVV9QQ0lfTUVNX1NUQVJUCisjZGVmaW5lIENQVV9QQ0lfTUVNX1NUQVJUIFBDSV9NU1RSX01FTV9MT0NBTAorI2Vsc2UKKyNkZWZpbmUgQ1BVX1BDSV9NRU1fU1RBUlQgQ09ORklHX1NZU19DUFVfUENJX01FTV9TVEFSVAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19QQ0lfTVNUUl9NRU1fU0laRQorI2RlZmluZSBQQ0lfTVNUUl9NRU1fU0laRSAweDEwMDAwMDAwCS8qIDI1Nk1CICovCisjZWxzZQorI2RlZmluZSBQQ0lfTVNUUl9NRU1fU0laRSBDT05GSUdfU1lTX1BDSV9NU1RSX01FTV9TSVpFCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BPQ01SMF9NQVNLX0FUVFJJQgorI2RlZmluZSBQT0NNUjBfTUFTS19BVFRSSUIJKFBPQ01SX01BU0tfMjU2TUIgfCBQT0NNUl9FTkFCTEUgfCBQT0NNUl9QUkVGRVRDSF9FTikKKyNlbHNlCisjZGVmaW5lIFBPQ01SMF9NQVNLX0FUVFJJQiBDT05GSUdfU1lTX1BPQ01SMF9NQVNLX0FUVFJJQgorI2VuZGlmCisKKy8qCisgKiBNYXN0ZXIgd2luZG93IHRoYXQgYWxsb3dzIHRoZSBDUFUgdG8gYWNjZXNzIFBDSSBNZW1vcnkgKG5vbi1wcmVmZXRjaCkuCisgKiBUaGlzIHdpbmRvdyB3aWxsIGJlIHNldHVwIHdpdGggdGhlIHNlY29uZCBzZXQgb2YgT3V0Ym91bmQgQVRVIHJlZ2lzdGVycworICogaW4gdGhlIGJyaWRnZS4KKyAqLworCisjaWZuZGVmIENPTkZJR19TWVNfUENJX01TVFJfTUVNSU9fTE9DQUwKKyNkZWZpbmUgUENJX01TVFJfTUVNSU9fTE9DQUwgMHg5MDAwMDAwMCAvKiBMb2NhbCBiYXNlICovCisjZWxzZQorI2RlZmluZSBQQ0lfTVNUUl9NRU1JT19MT0NBTCBDT05GSUdfU1lTX1BDSV9NU1RSX01FTUlPX0xPQ0FMCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSV9NU1RSX01FTUlPX0JVUworI2RlZmluZSBQQ0lfTVNUUl9NRU1JT19CVVMgMHg5MDAwMDAwMAkvKiBQQ0kgYmFzZSAgICovCisjZWxzZQorI2RlZmluZSBQQ0lfTVNUUl9NRU1JT19CVVMgQ09ORklHX1NZU19QQ0lfTVNUUl9NRU1JT19CVVMKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfQ1BVX1BDSV9NRU1JT19TVEFSVAorI2RlZmluZSBDUFVfUENJX01FTUlPX1NUQVJUIFBDSV9NU1RSX01FTUlPX0xPQ0FMCisjZWxzZQorI2RlZmluZSBDUFVfUENJX01FTUlPX1NUQVJUIENPTkZJR19TWVNfQ1BVX1BDSV9NRU1JT19TVEFSVAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19QQ0lfTVNUUl9NRU1JT19TSVpFCisjZGVmaW5lIFBDSV9NU1RSX01FTUlPX1NJWkUgMHgxMDAwMDAwMAkvKiAyNTYgTUIgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSX01FTUlPX1NJWkUgQ09ORklHX1NZU19QQ0lfTVNUUl9NRU1JT19TSVpFCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BPQ01SMV9NQVNLX0FUVFJJQgorI2RlZmluZSBQT0NNUjFfTUFTS19BVFRSSUIJKFBPQ01SX01BU0tfNTEyTUIgfCBQT0NNUl9FTkFCTEUpCisjZWxzZQorI2RlZmluZSBQT0NNUjFfTUFTS19BVFRSSUIgQ09ORklHX1NZU19QT0NNUjFfTUFTS19BVFRSSUIKKyNlbmRpZgorCisvKgorICogTWFzdGVyIHdpbmRvdyB0aGF0IGFsbG93cyB0aGUgQ1BVIHRvIGFjY2VzcyBQQ0kgSU8gc3BhY2UuCisgKiBUaGlzIHdpbmRvdyB3aWxsIGJlIHNldHVwIHdpdGggdGhlIHRoaXJkIHNldCBvZiBPdXRib3VuZCBBVFUgcmVnaXN0ZXJzCisgKiBpbiB0aGUgYnJpZGdlLgorICovCisKKyNpZm5kZWYgQ09ORklHX1NZU19QQ0lfTVNUUl9JT19MT0NBTAorI2RlZmluZSBQQ0lfTVNUUl9JT19MT0NBTCAweEEwMDAwMDAwCS8qIExvY2FsIGJhc2UgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSX0lPX0xPQ0FMIENPTkZJR19TWVNfUENJX01TVFJfSU9fTE9DQUwKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUENJX01TVFJfSU9fQlVTCisjZGVmaW5lIFBDSV9NU1RSX0lPX0JVUyAweEEwMDAwMDAwCS8qIFBDSSBiYXNlICAgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSX0lPX0JVUyBDT05GSUdfU1lTX1BDSV9NU1RSX0lPX0JVUworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19DUFVfUENJX0lPX1NUQVJUCisjZGVmaW5lIENQVV9QQ0lfSU9fU1RBUlQgUENJX01TVFJfSU9fTE9DQUwKKyNlbHNlCisjZGVmaW5lIENQVV9QQ0lfSU9fU1RBUlQgQ09ORklHX1NZU19DUFVfUENJX0lPX1NUQVJUCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSV9NU1RSX0lPX1NJWkUKKyNkZWZpbmUgUENJX01TVFJfSU9fU0laRSAweDEwMDAwMDAwCS8qIDI1Nk1CICovCisjZWxzZQorI2RlZmluZSBQQ0lfTVNUUl9JT19TSVpFIENPTkZJR19TWVNfUENJX01TVFJfSU9fU0laRQorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19QT0NNUjJfTUFTS19BVFRSSUIKKyNkZWZpbmUgUE9DTVIyX01BU0tfQVRUUklCCShQT0NNUl9NQVNLXzI1Nk1CIHwgUE9DTVJfRU5BQkxFIHwgUE9DTVJfUENJX0lPKQorI2Vsc2UKKyNkZWZpbmUgUE9DTVIyX01BU0tfQVRUUklCIENPTkZJR19TWVNfUE9DTVIyX01BU0tfQVRUUklCCisjZW5kaWYKKworLyogUENJIGJ1cyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyAqLworCisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfQ1RMUgkweDA2CisKKworc3RhdGljIGlubGluZSB2b2lkIHBjaV9vdXRsICh1MzIgYWRkciwgdTMyIGRhdGEpCit7CisJKih2b2xhdGlsZSB1MzIgKikgYWRkciA9IGNwdV90b19sZTMyIChkYXRhKTsKK30KKwordm9pZCBwY2lfbXBjODI1MF9pbml0IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJdTE2IHRlbXBTaG9ydDsKKworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXBjaV9kZXZfdCBob3N0X2Rldm5vID0gUENJX0JERiAoMCwgMCwgMCk7CisKKwlwY2lfc2V0dXBfaW5kaXJlY3QgKGhvc2UsIENPTkZJR19TWVNfSU1NUiArIFBDSV9DRkdfQUREUl9SRUcsCisJCQkgICAgQ09ORklHX1NZU19JTU1SICsgUENJX0NGR19EQVRBX1JFRyk7CisKKwkvKgorCSAqIFNldHRpbmcgcmVxdWlyZWQgdG8gZW5hYmxlIGxvY2FsIGJ1cyBmb3IgUENJIChTSVVNQ1IgW0xCUENdKS4KKwkgKi8KKyNpZmRlZiBDT05GSUdfTVBDODI2NkFEUworCWltbWFwLT5pbV9zaXVfY29uZi5zY19zaXVtY3IgPQorCQkoaW1tYXAtPmltX3NpdV9jb25mLnNjX3NpdW1jciAmIH5TSVVNQ1JfTEJQQzExKQorCQl8IFNJVU1DUl9MQlBDMDE7CisjZWxpZiBkZWZpbmVkKENPTkZJR19BRFNUWVBFKSAmJiBDT05GSUdfQURTVFlQRSA9PSBDT05GSUdfU1lTX1BRMkZBRFMKKy8qIG5vdGhpbmcgdG8gZG8gZm9yIHRoaXMgYm9hcmQgaGVyZSAqLworI2VsaWYgZGVmaW5lZCBDT05GSUdfTVBDODI3MgorCWltbWFwLT5pbV9zaXVfY29uZi5zY19zaXVtY3IgPSAoaW1tYXAtPmltX3NpdV9jb25mLnNjX3NpdW1jciAmCisJCQkJICB+U0lVTUNSX0JCRCAmCisJCQkJICB+U0lVTUNSX0VTRSAmCisJCQkJICB+U0lVTUNSX1BCU0UgJgorCQkJCSAgflNJVU1DUl9DRElTICYKKwkJCQkgIH5TSVVNQ1JfRFBQQzExICYKKwkJCQkgIH5TSVVNQ1JfTDJDUEMxMSAmCisJCQkJICB+U0lVTUNSX0xCUEMxMSAmCisJCQkJICB+U0lVTUNSX0FQUEMxMSAmCisJCQkJICB+U0lVTUNSX0NTMTBQQzExICYKKwkJCQkgIH5TSVVNQ1JfQkNUTEMxMSAmCisJCQkJICB+U0lVTUNSX01NUjExKQorCQkJCSAgfCBTSVVNQ1JfRFBQQzExCisJCQkJICB8IFNJVU1DUl9MMkNQQzAxCisJCQkJICB8IFNJVU1DUl9MQlBDMDAKKwkJCQkgIHwgU0lVTUNSX0FQUEMxMAorCQkJCSAgfCBTSVVNQ1JfQ1MxMFBDMDAKKwkJCQkgIHwgU0lVTUNSX0JDVExDMDAKKwkJCQkgIHwgU0lVTUNSX01NUjExOworI2VsaWYgZGVmaW5lZChDT05GSUdfVFFNODI3MikKKy8qIG5vdGhpbmcgdG8gZG8gZm9yIHRoaXMgQm9hcmQgaGVyZSAqLworI2Vsc2UKKwkvKgorCSAqIFNldHRpbmcgcmVxdWlyZWQgdG8gZW5hYmxlIElSUTEtSVJRNyAoU0lVTUNSIFtEUFBDXSksCisJICogYW5kIGxvY2FsIGJ1cyBmb3IgUENJIChTSVVNQ1IgW0xCUENdKS4KKwkgKi8KKwlpbW1hcC0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyID0gKGltbWFwLT5pbV9zaXVfY29uZi5zY19zaXVtY3IgJgorCQkJCQkJflNJVU1DUl9MQlBDMTEgJgorCQkJCQkJflNJVU1DUl9DUzEwUEMxMSAmCisJCQkJCQl+U0lVTUNSX0xCUEMxMSkgfAorCQkJCQlTSVVNQ1JfTEJQQzAxIHwKKwkJCQkJU0lVTUNSX0NTMTBQQzAxIHwKKwkJCQkJU0lVTUNSX0FQUEMxMDsKKyNlbmRpZgorCisJLyogTWFrZSBQQ0kgbG93ZXN0IHByaW9yaXR5ICovCisJLyogRWFjaCA0IGJpdHMgaXMgYSBkZXZpY2UgYnVzIHJlcXVlc3QJYW5kIHRoZSBNUyA0Yml0cworCSAgIGlzIGhpZ2hlc3QgcHJpb3JpdHkgKi8KKwkvKiBCdXMJCSAgICAgNGJpdCB2YWx1ZQorCSAgIC0tLQkJICAgICAtLS0tLS0tLS0tCisJICAgQ1BNIGhpZ2gJICAgICAwYjAwMDAKKwkgICBDUE0gbWlkZGxlCSAgICAgMGIwMDAxCisJICAgQ1BNIGxvdwkgICAgIDBiMDAxMAorCSAgIFBDSSByZWd1ZXN0CSAgICAgMGIwMDExCisJICAgUmVzZXJ2ZWQJICAgICAwYjAxMDAKKwkgICBSZXNlcnZlZAkgICAgIDBiMDEwMQorCSAgIEludGVybmFsIENvcmUgICAgIDBiMDExMAorCSAgIEV4dGVybmFsIE1hc3RlciAxIDBiMDExMQorCSAgIEV4dGVybmFsIE1hc3RlciAyIDBiMTAwMAorCSAgIEV4dGVybmFsIE1hc3RlciAzIDBiMTAwMQorCSAgIFRoZSByZXN0IGFyZSByZXNlcnZlZCAqLworCWltbWFwLT5pbV9zaXVfY29uZi5zY19wcGNfYWxyaCA9IDB4NjEyMDc4OTM7CisKKwkvKiBQYXJrIGJ1cyBvbiBjb3JlIHdoaWxlIG1vZGlmeWluZyBQQ0kgQnVzIGFjY2Vzc2VzICovCisJaW1tYXAtPmltX3NpdV9jb25mLnNjX3BwY19hY3IgPSAweDY7CisKKwkvKgorCSAqIFNldCB1cCBtYXN0ZXIgd2luZG93cyB0aGF0IGFsbG93IHRoZSBDUFUgdG8gYWNjZXNzIFBDSSBzcGFjZS4gVGhlc2UKKwkgKiB3aW5kb3dzIGFyZSBzZXQgdXAgdXNpbmcgdGhlIHR3byBTSVUgUENJQlIgcmVnaXN0ZXJzLgorCSAqLworCWltbWFwLT5pbV9tZW1jdGwubWVtY19wY2ltc2swID0gUENJTVNLMF9NQVNLOworCWltbWFwLT5pbV9tZW1jdGwubWVtY19wY2licjAgPSBQQ0lfTVNUUjBfTE9DQUwgfCBQQ0lCUl9FTkFCTEU7CisKKyNpZiBkZWZpbmVkIENPTkZJR19NUEM4MjY2QURTIHx8IGRlZmluZWQgQ09ORklHX01QQzgyNzIKKwlpbW1hcC0+aW1fbWVtY3RsLm1lbWNfcGNpbXNrMSA9IFBDSU1TSzFfTUFTSzsKKwlpbW1hcC0+aW1fbWVtY3RsLm1lbWNfcGNpYnIxID0gUENJX01TVFIxX0xPQ0FMIHwgUENJQlJfRU5BQkxFOworI2VuZGlmCisKKwkvKiBSZWxlYXNlIFBDSSBSU1QgKGJ5IGRlZmF1bHQgdGhlIFBDSSBSU1Qgc2lnbmFsIGlzIGhlbGQgbG93KQkqLworCWltbWFwLT5pbV9wY2kucGNpX2djciA9IGNwdV90b19sZTMyIChQQ0lHQ1JfUENJX0JVU19FTik7CisKKwkvKiBnaXZlIGl0IHNvbWUgdGltZSAqLworCXsKKyNpZiBkZWZpbmVkIENPTkZJR19NUEM4MjY2QURTIHx8IGRlZmluZWQgQ09ORklHX01QQzgyNzIKKwkJLyogR2l2ZSB0aGUgUENJIGNhcmRzIG1vcmUgdGltZSB0byBpbml0aWFsaXplIGJlZm9yZSBxdWVyeQorCQkgICBUaGlzIG1pZ2h0IGJlIGdvb2QgZm9yIG90aGVyIGJvYXJkcyBhbHNvCisJCSAqLworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKQorI2VuZGlmCisJCQl1ZGVsYXkgKDEwMDApOworCX0KKworCS8qCisJICogU2V0IHVwIG1hc3RlciB3aW5kb3cgdGhhdCBhbGxvd3MgdGhlIENQVSB0byBhY2Nlc3MgUENJIE1lbW9yeSAocHJlZmV0Y2gpCisJICogc3BhY2UuIFRoaXMgd2luZG93IGlzIHNldCB1cCB1c2luZyB0aGUgZmlyc3Qgc2V0IG9mIE91dGJvdW5kIEFUVSByZWdpc3RlcnMuCisJICovCisJaW1tYXAtPmltX3BjaS5wY2lfcG90YXIwID0gY3B1X3RvX2xlMzIgKFBDSV9NU1RSX01FTV9CVVMgPj4gMTIpOwkvKiBQQ0kgYmFzZSAqLworCWltbWFwLT5pbV9wY2kucGNpX3BvYmFyMCA9IGNwdV90b19sZTMyIChQQ0lfTVNUUl9NRU1fTE9DQUwgPj4gMTIpOwkvKiBMb2NhbCBiYXNlICovCisJaW1tYXAtPmltX3BjaS5wY2lfcG9jbXIwID0gY3B1X3RvX2xlMzIgKFBPQ01SMF9NQVNLX0FUVFJJQik7CS8qIFNpemUgJiBhdHRyaWJ1dGUgKi8KKworCS8qCisJICogU2V0IHVwIG1hc3RlciB3aW5kb3cgdGhhdCBhbGxvd3MgdGhlIENQVSB0byBhY2Nlc3MgUENJIE1lbW9yeSAobm9uLXByZWZldGNoKQorCSAqIHNwYWNlLiBUaGlzIHdpbmRvdyBpcyBzZXQgdXAgdXNpbmcgdGhlIHNlY29uZCBzZXQgb2YgT3V0Ym91bmQgQVRVIHJlZ2lzdGVycy4KKwkgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9wb3RhcjEgPSBjcHVfdG9fbGUzMiAoUENJX01TVFJfTUVNSU9fQlVTID4+IDEyKTsJLyogUENJIGJhc2UgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9wb2JhcjEgPSBjcHVfdG9fbGUzMiAoUENJX01TVFJfTUVNSU9fTE9DQUwgPj4gMTIpOwkvKiBMb2NhbCBiYXNlICovCisJaW1tYXAtPmltX3BjaS5wY2lfcG9jbXIxID0gY3B1X3RvX2xlMzIgKFBPQ01SMV9NQVNLX0FUVFJJQik7CS8qIFNpemUgJiBhdHRyaWJ1dGUgKi8KKworCS8qCisJICogU2V0IHVwIG1hc3RlciB3aW5kb3cgdGhhdCBhbGxvd3MgdGhlIENQVSB0byBhY2Nlc3MgUENJIElPIHNwYWNlLiBUaGlzIHdpbmRvdworCSAqIGlzIHNldCB1cCB1c2luZyB0aGUgdGhpcmQgc2V0IG9mIE91dGJvdW5kIEFUVSByZWdpc3RlcnMuCisJICovCisJaW1tYXAtPmltX3BjaS5wY2lfcG90YXIyID0gY3B1X3RvX2xlMzIgKFBDSV9NU1RSX0lPX0JVUyA+PiAxMik7IC8qIFBDSSBiYXNlICovCisJaW1tYXAtPmltX3BjaS5wY2lfcG9iYXIyID0gY3B1X3RvX2xlMzIgKFBDSV9NU1RSX0lPX0xPQ0FMID4+IDEyKTsJLyogTG9jYWwgYmFzZSAqLworCWltbWFwLT5pbV9wY2kucGNpX3BvY21yMiA9IGNwdV90b19sZTMyIChQT0NNUjJfTUFTS19BVFRSSUIpOwkvKiBTaXplICYgYXR0cmlidXRlICovCisKKwkvKgorCSAqIFNldCB1cCBzbGF2ZSB3aW5kb3cgdGhhdCBhbGxvd3MgUENJIG1hc3RlcnMgdG8gYWNjZXNzIE1QQzgyNnggbG9jYWwgbWVtb3J5LgorCSAqIFRoaXMgd2luZG93IGlzIHNldCB1cCB1c2luZyB0aGUgZmlyc3Qgc2V0IG9mIEluYm91bmQgQVRVIHJlZ2lzdGVycworCSAqLworCWltbWFwLT5pbV9wY2kucGNpX3BpdGFyMCA9IGNwdV90b19sZTMyIChQQ0lfU0xWX01FTV9MT0NBTCA+PiAxMik7CS8qIFBDSSBiYXNlICovCisJaW1tYXAtPmltX3BjaS5wY2lfcGliYXIwID0gY3B1X3RvX2xlMzIgKFBDSV9TTFZfTUVNX0JVUyA+PiAxMik7IC8qIExvY2FsIGJhc2UgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9waWNtcjAgPSBjcHVfdG9fbGUzMiAoUElDTVIwX01BU0tfQVRUUklCKTsJLyogU2l6ZSAmIGF0dHJpYnV0ZSAqLworCisJLyogU2VlIGFib3ZlIGZvciBkZXNjcmlwdGlvbiAtIHB1dHMgUENJIHJlcXVlc3QgYXMgaGlnaGVzdCBwcmlvcml0eSAqLworI2lmZGVmIENPTkZJR19NUEM4MjcyCisJaW1tYXAtPmltX3NpdV9jb25mLnNjX3BwY19hbHJoID0gMHgwMTIzNjc0NTsKKyNlbHNlCisJaW1tYXAtPmltX3NpdV9jb25mLnNjX3BwY19hbHJoID0gMHgwMzEyNDU2NzsKKyNlbmRpZgorCisJLyogUGFyayB0aGUgYnVzIG9uIHRoZSBQQ0kgKi8KKwlpbW1hcC0+aW1fc2l1X2NvbmYuc2NfcHBjX2FjciA9IFBQQ19BQ1JfQlVTX1BBUktfUENJOworCisJLyogSG9zdCBtb2RlIC0gc3BlY2lmeSB0aGUgYnJpZGdlIGFzIGEgaG9zdC1QQ0kgYnJpZGdlICovCisKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZSAoaG9zZSwgaG9zdF9kZXZubywgUENJX0NMQVNTX0NPREUsCisJCQkJICAgIFBDSV9DTEFTU19CUklER0VfQ1RMUik7CisKKwkvKiBFbmFibGUgdGhlIGhvc3QgYnJpZGdlIHRvIGJlIGEgbWFzdGVyIG9uIHRoZSBQQ0kgYnVzLCBhbmQgdG8gYWN0IGFzIGEgUENJIG1lbW9yeSB0YXJnZXQgKi8KKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkIChob3NlLCBob3N0X2Rldm5vLCBQQ0lfQ09NTUFORCwgJnRlbXBTaG9ydCk7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQgKGhvc2UsIGhvc3RfZGV2bm8sIFBDSV9DT01NQU5ELAorCQkJCSAgICB0ZW1wU2hvcnQgfCBQQ0lfQ09NTUFORF9NQVNURVIgfAorCQkJCSAgICBQQ0lfQ09NTUFORF9NRU1PUlkpOworCisJLyogZG8gc29tZSBicmlkZ2UgaW5pdCwgc2hvdWxkIGJlIGRvbmUgb24gYWxsIDgyNjAgYmFzZWQgYnJpZGdlcyAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlIChob3NlLCBob3N0X2Rldm5vLCBQQ0lfQ0FDSEVfTElORV9TSVpFLAorCQkJCSAgICAweDA4KTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZSAoaG9zZSwgaG9zdF9kZXZubywgUENJX0xBVEVOQ1lfVElNRVIsCisJCQkJICAgIDB4RjgpOworCisJaG9zZS0+Zmlyc3RfYnVzbm8gPSAwOworCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCisJLyogU3lzdGVtIG1lbW9yeSBzcGFjZSAqLworI2lmIGRlZmluZWQgQ09ORklHX01QQzgyNjZBRFMgfHwgZGVmaW5lZCBDT05GSUdfTVBDODI3MiB8fCBkZWZpbmVkIENPTkZJR19QTTgyNgorCXBjaV9zZXRfcmVnaW9uIChob3NlLT5yZWdpb25zICsgMCwKKwkJCVBDSV9TTFZfTUVNX0JVUywKKwkJCVBDSV9TTFZfTUVNX0xPQ0FMLAorCQkJZ2QtPnJhbV9zaXplLCBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fU1lTX01FTU9SWSk7CisjZWxzZQorCXBjaV9zZXRfcmVnaW9uIChob3NlLT5yZWdpb25zICsgMCwKKwkJCUNPTkZJR19TWVNfU0RSQU1fQkFTRSwKKwkJCUNPTkZJR19TWVNfU0RSQU1fQkFTRSwKKwkJCTB4NDAwMDAwMCwgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX1NZU19NRU1PUlkpOworI2VuZGlmCisKKwkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCisjaWYgZGVmaW5lZCBDT05GSUdfTVBDODI2NkFEUyB8fCBkZWZpbmVkIENPTkZJR19NUEM4MjcyCisJcGNpX3NldF9yZWdpb24gKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkJUENJX01TVFJfTUVNSU9fQlVTLAorCQkJUENJX01TVFJfTUVNSU9fTE9DQUwsCisJCQlQQ0lfTVNUUl9NRU1JT19TSVpFLCBQQ0lfUkVHSU9OX01FTSk7CisjZWxzZQorCXBjaV9zZXRfcmVnaW9uIChob3NlLT5yZWdpb25zICsgMSwKKwkJCVBDSV9NU1RSX01FTV9CVVMsCisJCQlQQ0lfTVNUUl9NRU1fTE9DQUwsCisJCQlQQ0lfTVNUUl9NRU1fU0laRSwgUENJX1JFR0lPTl9NRU0pOworI2VuZGlmCisKKwkvKiBQQ0kgSS9PIHNwYWNlICovCisJcGNpX3NldF9yZWdpb24gKGhvc2UtPnJlZ2lvbnMgKyAyLAorCQkJUENJX01TVFJfSU9fQlVTLAorCQkJUENJX01TVFJfSU9fTE9DQUwsIFBDSV9NU1RSX0lPX1NJWkUsIFBDSV9SRUdJT05fSU8pOworCisJaG9zZS0+cmVnaW9uX2NvdW50ID0gMzsKKworCXBjaV9yZWdpc3Rlcl9ob3NlIChob3NlKTsKKwkvKiBNYXNrIG9mZiBtYXN0ZXIgYWJvcnQgbWFjaGluZSBjaGVja3MgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9lbXIgJj0gY3B1X3RvX2xlMzIgKH5QQ0lfRVJST1JfUENJX05PX1JTUCk7CisJZWllaW8gKCk7CisKKwlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2NhbiAoaG9zZSk7CisKKworCS8qIGNsZWFyIHRoZSBlcnJvciBpbiB0aGUgZXJyb3Igc3RhdHVzIHJlZ2lzdGVyICovCisJaW1tYXAtPmltX3BjaS5wY2lfZXNyID0gY3B1X3RvX2xlMzIgKFBDSV9FUlJPUl9QQ0lfTk9fUlNQKTsKKworCS8qIHVubWFzayBtYXN0ZXIgYWJvcnQgbWFjaGluZSBjaGVja3MgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9lbXIgfD0gY3B1X3RvX2xlMzIgKFBDSV9FUlJPUl9QQ0lfTk9fUlNQKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKK3ZvaWQgZnRfcGNpX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJwY2kiLCA0LAorCQkiY2xvY2stZnJlcXVlbmN5IiwgZ2QtPnBjaV9jbGssIDEpOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc2VyaWFsX3NjYy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NlcmlhbF9zY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWI2YTI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NlcmlhbF9zY2MuYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBIYWNrZWQgZm9yIE1QQzgyNjAgYnkgTXVycmF5LkplbnNlbkBjbXN0LmNzaXJvLmF1LCAxOS1PY3QtMDAuCisgKi8KKworLyoKKyAqIE1pbmltYWwgc2VyaWFsIGZ1bmN0aW9ucyBuZWVkZWQgdG8gdXNlIG9uZSBvZiB0aGUgU0NDIHBvcnRzCisgKiBhcyBzZXJpYWwgY29uc29sZSBpbnRlcmZhY2UuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT05TX09OX1NDQykKKworI2lmIENPTkZJR19DT05TX0lOREVYID09IDEJLyogQ29uc29sZSBvbiBTQ0MxICovCisKKyNkZWZpbmUgU0NDX0lOREVYCQkwCisjZGVmaW5lIFBST0ZGX1NDQwkJUFJPRkZfU0NDMQorI2RlZmluZSBDTVhTQ1JfTUFTSwkJKENNWFNDUl9HUjF8Q01YU0NSX1NDMXxcCisJCQkJCUNNWFNDUl9SUzFDU19NU0t8Q01YU0NSX1RTMUNTX01TSykKKyNkZWZpbmUgQ01YU0NSX1ZBTFVFCQkoQ01YU0NSX1JTMUNTX0JSRzF8Q01YU0NSX1RTMUNTX0JSRzEpCisjZGVmaW5lIENQTV9DUl9TQ0NfUEFHRQkJQ1BNX0NSX1NDQzFfUEFHRQorI2RlZmluZSBDUE1fQ1JfU0NDX1NCTE9DSwlDUE1fQ1JfU0NDMV9TQkxPQ0sKKworI2VsaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gMgkvKiBDb25zb2xlIG9uIFNDQzIgKi8KKworI2RlZmluZSBTQ0NfSU5ERVgJCTEKKyNkZWZpbmUgUFJPRkZfU0NDCQlQUk9GRl9TQ0MyCisjZGVmaW5lIENNWFNDUl9NQVNLCQkoQ01YU0NSX0dSMnxDTVhTQ1JfU0MyfFwKKwkJCQkJQ01YU0NSX1JTMkNTX01TS3xDTVhTQ1JfVFMyQ1NfTVNLKQorI2RlZmluZSBDTVhTQ1JfVkFMVUUJCShDTVhTQ1JfUlMyQ1NfQlJHMnxDTVhTQ1JfVFMyQ1NfQlJHMikKKyNkZWZpbmUgQ1BNX0NSX1NDQ19QQUdFCQlDUE1fQ1JfU0NDMl9QQUdFCisjZGVmaW5lIENQTV9DUl9TQ0NfU0JMT0NLCUNQTV9DUl9TQ0MyX1NCTE9DSworCisjZWxpZiBDT05GSUdfQ09OU19JTkRFWCA9PSAzCS8qIENvbnNvbGUgb24gU0NDMyAqLworCisjZGVmaW5lIFNDQ19JTkRFWAkJMgorI2RlZmluZSBQUk9GRl9TQ0MJCVBST0ZGX1NDQzMKKyNkZWZpbmUgQ01YU0NSX01BU0sJCShDTVhTQ1JfR1IzfENNWFNDUl9TQzN8XAorCQkJCQlDTVhTQ1JfUlMzQ1NfTVNLfENNWFNDUl9UUzNDU19NU0spCisjZGVmaW5lIENNWFNDUl9WQUxVRQkJKENNWFNDUl9SUzNDU19CUkczfENNWFNDUl9UUzNDU19CUkczKQorI2RlZmluZSBDUE1fQ1JfU0NDX1BBR0UJCUNQTV9DUl9TQ0MzX1BBR0UKKyNkZWZpbmUgQ1BNX0NSX1NDQ19TQkxPQ0sJQ1BNX0NSX1NDQzNfU0JMT0NLCisKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDQJLyogQ29uc29sZSBvbiBTQ0M0ICovCisKKyNkZWZpbmUgU0NDX0lOREVYCQkzCisjZGVmaW5lIFBST0ZGX1NDQwkJUFJPRkZfU0NDNAorI2RlZmluZSBDTVhTQ1JfTUFTSwkJKENNWFNDUl9HUjR8Q01YU0NSX1NDNHxcCisJCQkJCUNNWFNDUl9SUzRDU19NU0t8Q01YU0NSX1RTNENTX01TSykKKyNkZWZpbmUgQ01YU0NSX1ZBTFVFCQkoQ01YU0NSX1JTNENTX0JSRzR8Q01YU0NSX1RTNENTX0JSRzQpCisjZGVmaW5lIENQTV9DUl9TQ0NfUEFHRQkJQ1BNX0NSX1NDQzRfUEFHRQorI2RlZmluZSBDUE1fQ1JfU0NDX1NCTE9DSwlDUE1fQ1JfU0NDNF9TQkxPQ0sKKworI2Vsc2UKKworI2Vycm9yICJjb25zb2xlIG5vdCBjb3JyZWN0bHkgZGVmaW5lZCIKKworI2VuZGlmCisKK2ludCBzZXJpYWxfaW5pdCAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHNjY190ICpzcDsKKwl2b2xhdGlsZSBzY2NfdWFydF90ICp1cDsKKwl2b2xhdGlsZSBjYmRfdCAqdGJkZiwgKnJiZGY7CisJdm9sYXRpbGUgY3BtODI2MF90ICpjcCA9ICYoaW0tPmltX2NwbSk7CisJdWludAlkcGFkZHI7CisKKwkvKiBpbml0aWFsaXplIHBvaW50ZXJzIHRvIFNDQyAqLworCisJc3AgPSAoc2NjX3QgKikgJihpbS0+aW1fc2NjW1NDQ19JTkRFWF0pOworCXVwID0gKHNjY191YXJ0X3QgKikmaW0tPmltX2RwcmFtYmFzZVtQUk9GRl9TQ0NdOworCisJLyogRGlzYWJsZSB0cmFuc21pdHRlci9yZWNlaXZlci4KKwkqLworCXNwLT5zY2NfZ3NtcmwgJj0gfihTQ0NfR1NNUkxfRU5SIHwgU0NDX0dTTVJMX0VOVCk7CisKKwkvKiBwdXQgdGhlIFNDQyBjaGFubmVsIGludG8gTk1TSSAobm9uIG11bHRpcGxleGQgc2VyaWFsIGludGVyZmFjZSkKKwkgKiBtb2RlIGFuZCB3aXJlIHRoZSBzZWxlY3RlZCBTQ0MgVHggYW5kIFJ4IGNsb2NrcyB0byBCUkd4ICgxNS0xNSkuCisJICovCisJaW0tPmltX2NwbXV4LmNteF9zY3IgPSAoaW0tPmltX2NwbXV4LmNteF9zY3ImfkNNWFNDUl9NQVNLKXxDTVhTQ1JfVkFMVUU7CisKKwkvKiBTZXQgdXAgdGhlIGJhdWQgcmF0ZSBnZW5lcmF0b3IuCisJKi8KKwlzZXJpYWxfc2V0YnJnICgpOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHR3byBidWZmZXIgZGVzY3JpcHRvcnMgaW4gdGhlIERQIHJhbS4KKwkgKiBkYW1tOiBhbGxvY2F0aW5nIHNwYWNlIGFmdGVyIHRoZSB0d28gYnVmZmVycyBmb3IgcngvdHggZGF0YQorCSAqLworCisJZHBhZGRyID0gbTgyNjBfY3BtX2RwYWxsb2MoKDIgKiBzaXplb2YgKGNiZF90KSkgKyAyLCAxNik7CisKKwkvKiBTZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlcnMgaW4KKwkgKiB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzLgorCSAqLworCXJiZGYgPSAoY2JkX3QgKikmaW0tPmltX2RwcmFtYmFzZVtkcGFkZHJdOworCXJiZGYtPmNiZF9idWZhZGRyID0gKHVpbnQpIChyYmRmKzIpOworCXJiZGYtPmNiZF9zYyA9IEJEX1NDX0VNUFRZIHwgQkRfU0NfV1JBUDsKKwl0YmRmID0gcmJkZiArIDE7CisJdGJkZi0+Y2JkX2J1ZmFkZHIgPSAoKHVpbnQpIChyYmRmKzIpKSArIDE7CisJdGJkZi0+Y2JkX3NjID0gQkRfU0NfV1JBUDsKKworCS8qIFNldCB1cCB0aGUgdWFydCBwYXJhbWV0ZXJzIGluIHRoZSBwYXJhbWV0ZXIgcmFtLgorCSovCisJdXAtPnNjY19nZW5zY2Muc2NjX3JiYXNlID0gZHBhZGRyOworCXVwLT5zY2NfZ2Vuc2NjLnNjY190YmFzZSA9IGRwYWRkcitzaXplb2YoY2JkX3QpOworCXVwLT5zY2NfZ2Vuc2NjLnNjY19yZmNyID0gQ1BNRkNSX0VCOworCXVwLT5zY2NfZ2Vuc2NjLnNjY190ZmNyID0gQ1BNRkNSX0VCOworCXVwLT5zY2NfZ2Vuc2NjLnNjY19tcmJsciA9IDE7CisJdXAtPnNjY19tYXhpZGwgPSAwOworCXVwLT5zY2NfYnJrY3IgPSAxOworCXVwLT5zY2NfcGFyZWMgPSAwOworCXVwLT5zY2NfZnJtZWMgPSAwOworCXVwLT5zY2Nfbm9zZWMgPSAwOworCXVwLT5zY2NfYnJrZWMgPSAwOworCXVwLT5zY2NfdWFkZHIxID0gMDsKKwl1cC0+c2NjX3VhZGRyMiA9IDA7CisJdXAtPnNjY190b3NlcSA9IDA7CisJdXAtPnNjY19jaGFyMSA9IHVwLT5zY2NfY2hhcjIgPSB1cC0+c2NjX2NoYXIzID0gdXAtPnNjY19jaGFyNCA9IDB4ODAwMDsKKwl1cC0+c2NjX2NoYXI1ID0gdXAtPnNjY19jaGFyNiA9IHVwLT5zY2NfY2hhcjcgPSB1cC0+c2NjX2NoYXI4ID0gMHg4MDAwOworCXVwLT5zY2NfcmNjbSA9IDB4YzBmZjsKKworCS8qIE1hc2sgYWxsIGludGVycnVwdHMgYW5kIHJlbW92ZSBhbnl0aGluZyBwZW5kaW5nLgorCSovCisJc3AtPnNjY19zY2NtID0gMDsKKwlzcC0+c2NjX3NjY2UgPSAweGZmZmY7CisKKwkvKiBTZXQgOCBiaXQgRklGTywgMTYgYml0IG92ZXJzYW1wbGluZyBhbmQgVUFSVCBtb2RlLgorCSovCisJc3AtPnNjY19nc21yaCA9IFNDQ19HU01SSF9SRlc7CS8qIDggYml0IEZJRk8gKi8KKwlzcC0+c2NjX2dzbXJsID0gXAorCQlTQ0NfR1NNUkxfVERDUl8xNiB8IFNDQ19HU01STF9SRENSXzE2IHwgU0NDX0dTTVJMX01PREVfVUFSVDsKKworCS8qIFNldCBDVFMgZmxvdyBjb250cm9sLCAxIHN0b3AgYml0LCA4IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoLAorCSAqIG5vcm1hbCBhc3luYyBVQVJUIG1vZGUsIG5vIHBhcml0eQorCSAqLworCXNwLT5zY2NfcHNtciA9IFNDVV9QU01SX0ZMQyB8IFNDVV9QU01SX0NMOworCisJLyogZXhlY3V0ZSB0aGUgIkluaXQgUnggYW5kIFR4IHBhcmFtcyIgQ1AgY29tbWFuZC4KKwkqLworCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykgIC8qIHdhaXQgaWYgY3AgaXMgYnVzeSAqLworCSAgOworCisJY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoQ1BNX0NSX1NDQ19QQUdFLCBDUE1fQ1JfU0NDX1NCTE9DSywKKwkJCQkJMCwgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisKKwl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKSAgLyogd2FpdCBpZiBjcCBpcyBidXN5ICovCisJICA7CisKKwkvKiBFbmFibGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIuCisJKi8KKwlzcC0+c2NjX2dzbXJsIHw9IFNDQ19HU01STF9FTlIgfCBTQ0NfR1NNUkxfRU5UOworCisJcmV0dXJuICgwKTsKK30KKwordm9pZAorc2VyaWFsX3NldGJyZyAodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DT05TX1VTRV9FWFRDKQorCW04MjYwX2NwbV9leHRjYnJnKFNDQ19JTkRFWCwgZ2QtPmJhdWRyYXRlLAorCQlDT05GSUdfQ09OU19FWFRDX1JBVEUsIENPTkZJR19DT05TX0VYVENfUElOU0VMKTsKKyNlbHNlCisJbTgyNjBfY3BtX3NldGJyZyhTQ0NfSU5ERVgsIGdkLT5iYXVkcmF0ZSk7CisjZW5kaWYKK30KKwordm9pZAorc2VyaWFsX3B1dGMoY29uc3QgY2hhciBjKQoreworCXZvbGF0aWxlIHNjY191YXJ0X3QJKnVwOworCXZvbGF0aWxlIGNiZF90CQkqdGJkZjsKKwl2b2xhdGlsZSBpbW1hcF90CSppbTsKKworCWlmIChjID09ICdcbicpCisJCXNlcmlhbF9wdXRjICgnXHInKTsKKworCWltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdXAgPSAoc2NjX3VhcnRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NDQ107CisJdGJkZiA9IChjYmRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW3VwLT5zY2NfZ2Vuc2NjLnNjY190YmFzZV07CisKKwkvKiBXYWl0IGZvciBsYXN0IGNoYXJhY3RlciB0byBnby4KKwkgKi8KKwl3aGlsZSAodGJkZi0+Y2JkX3NjICYgQkRfU0NfUkVBRFkpCisJCTsKKworCS8qIExvYWQgdGhlIGNoYXJhY3RlciBpbnRvIHRoZSB0cmFuc21pdCBidWZmZXIuCisJICovCisJKih2b2xhdGlsZSBjaGFyICopdGJkZi0+Y2JkX2J1ZmFkZHIgPSBjOworCXRiZGYtPmNiZF9kYXRsZW4gPSAxOworCXRiZGYtPmNiZF9zYyB8PSBCRF9TQ19SRUFEWTsKK30KKwordm9pZAorc2VyaWFsX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXNlcmlhbF9wdXRjICgqcysrKTsKKwl9Cit9CisKK2ludAorc2VyaWFsX2dldGModm9pZCkKK3sKKwl2b2xhdGlsZSBjYmRfdAkJKnJiZGY7CisJdm9sYXRpbGUgc2NjX3VhcnRfdAkqdXA7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW07CisJdW5zaWduZWQgY2hhcgkJYzsKKworCWltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdXAgPSAoc2NjX3VhcnRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NDQ107CisJcmJkZiA9IChjYmRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW3VwLT5zY2NfZ2Vuc2NjLnNjY19yYmFzZV07CisKKwkvKiBXYWl0IGZvciBjaGFyYWN0ZXIgdG8gc2hvdyB1cC4KKwkgKi8KKwl3aGlsZSAocmJkZi0+Y2JkX3NjICYgQkRfU0NfRU1QVFkpCisJCTsKKworCS8qIEdyYWIgdGhlIGNoYXIgYW5kIGNsZWFyIHRoZSBidWZmZXIgYWdhaW4uCisJICovCisJYyA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXJiZGYtPmNiZF9idWZhZGRyOworCXJiZGYtPmNiZF9zYyB8PSBCRF9TQ19FTVBUWTsKKworCXJldHVybiAoYyk7Cit9CisKK2ludAorc2VyaWFsX3RzdGMoKQoreworCXZvbGF0aWxlIGNiZF90CQkqcmJkZjsKKwl2b2xhdGlsZSBzY2NfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBpbW1hcF90CSppbTsKKworCWltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdXAgPSAoc2NjX3VhcnRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NDQ107CisJcmJkZiA9IChjYmRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW3VwLT5zY2NfZ2Vuc2NjLnNjY19yYmFzZV07CisKKwlyZXR1cm4gKChyYmRmLT5jYmRfc2MgJiBCRF9TQ19FTVBUWSkgPT0gMCk7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfQ09OU19PTl9TQ0MgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0tHREJfT05fU0NDKQorCisjaWYgZGVmaW5lZChDT05GSUdfQ09OU19PTl9TQ0MpICYmIENPTkZJR19LR0RCX0lOREVYID09IENPTkZJR19DT05TX0lOREVYCisjZXJyb3IgV2hvb3BzISBzZXJpYWwgY29uc29sZSBhbmQga2dkYiBhcmUgb24gdGhlIHNhbWUgc2NjIHNlcmlhbCBwb3J0CisjZW5kaWYKKworI2lmIENPTkZJR19LR0RCX0lOREVYID09IDEJLyogS0dEQiBQb3J0IG9uIFNDQzEgKi8KKworI2RlZmluZSBLR0RCX1NDQ19JTkRFWAkJMAorI2RlZmluZSBLR0RCX1BST0ZGX1NDQwkJUFJPRkZfU0NDMQorI2RlZmluZSBLR0RCX0NNWFNDUl9NQVNLCShDTVhTQ1JfR1IxfENNWFNDUl9TQzF8XAorCQkJCQlDTVhTQ1JfUlMxQ1NfTVNLfENNWFNDUl9UUzFDU19NU0spCisjZGVmaW5lIEtHREJfQ01YU0NSX1ZBTFVFCShDTVhTQ1JfUlMxQ1NfQlJHMXxDTVhTQ1JfVFMxQ1NfQlJHMSkKKyNkZWZpbmUgS0dEQl9DUE1fQ1JfU0NDX1BBR0UJQ1BNX0NSX1NDQzFfUEFHRQorI2RlZmluZSBLR0RCX0NQTV9DUl9TQ0NfU0JMT0NLCUNQTV9DUl9TQ0MxX1NCTE9DSworCisjZWxpZiBDT05GSUdfS0dEQl9JTkRFWCA9PSAyCS8qIEtHREIgUG9ydCBvbiBTQ0MyICovCisKKyNkZWZpbmUgS0dEQl9TQ0NfSU5ERVgJCTEKKyNkZWZpbmUgS0dEQl9QUk9GRl9TQ0MJCVBST0ZGX1NDQzIKKyNkZWZpbmUgS0dEQl9DTVhTQ1JfTUFTSwkoQ01YU0NSX0dSMnxDTVhTQ1JfU0MyfFwKKwkJCQkJQ01YU0NSX1JTMkNTX01TS3xDTVhTQ1JfVFMyQ1NfTVNLKQorI2RlZmluZSBLR0RCX0NNWFNDUl9WQUxVRQkoQ01YU0NSX1JTMkNTX0JSRzJ8Q01YU0NSX1RTMkNTX0JSRzIpCisjZGVmaW5lIEtHREJfQ1BNX0NSX1NDQ19QQUdFCUNQTV9DUl9TQ0MyX1BBR0UKKyNkZWZpbmUgS0dEQl9DUE1fQ1JfU0NDX1NCTE9DSwlDUE1fQ1JfU0NDMl9TQkxPQ0sKKworI2VsaWYgQ09ORklHX0tHREJfSU5ERVggPT0gMwkvKiBLR0RCIFBvcnQgb24gU0NDMyAqLworCisjZGVmaW5lIEtHREJfU0NDX0lOREVYCQkyCisjZGVmaW5lIEtHREJfUFJPRkZfU0NDCQlQUk9GRl9TQ0MzCisjZGVmaW5lIEtHREJfQ01YU0NSX01BU0sJKENNWFNDUl9HUjN8Q01YU0NSX1NDM3xcCisJCQkJCUNNWFNDUl9SUzNDU19NU0t8Q01YU0NSX1RTM0NTX01TSykKKyNkZWZpbmUgS0dEQl9DTVhTQ1JfVkFMVUUJKENNWFNDUl9SUzNDU19CUkczfENNWFNDUl9UUzNDU19CUkczKQorI2RlZmluZSBLR0RCX0NQTV9DUl9TQ0NfUEFHRQlDUE1fQ1JfU0NDM19QQUdFCisjZGVmaW5lIEtHREJfQ1BNX0NSX1NDQ19TQkxPQ0sJQ1BNX0NSX1NDQzNfU0JMT0NLCisKKyNlbGlmIENPTkZJR19LR0RCX0lOREVYID09IDQJLyogS0dEQiBQb3J0IG9uIFNDQzQgKi8KKworI2RlZmluZSBLR0RCX1NDQ19JTkRFWAkJMworI2RlZmluZSBLR0RCX1BST0ZGX1NDQwkJUFJPRkZfU0NDNAorI2RlZmluZSBLR0RCX0NNWFNDUl9NQVNLCShDTVhTQ1JfR1I0fENNWFNDUl9TQzR8XAorCQkJCQlDTVhTQ1JfUlM0Q1NfTVNLfENNWFNDUl9UUzRDU19NU0spCisjZGVmaW5lIEtHREJfQ01YU0NSX1ZBTFVFCShDTVhTQ1JfUlM0Q1NfQlJHNHxDTVhTQ1JfVFM0Q1NfQlJHNCkKKyNkZWZpbmUgS0dEQl9DUE1fQ1JfU0NDX1BBR0UJQ1BNX0NSX1NDQzRfUEFHRQorI2RlZmluZSBLR0RCX0NQTV9DUl9TQ0NfU0JMT0NLCUNQTV9DUl9TQ0M0X1NCTE9DSworCisjZWxzZQorCisjZXJyb3IgImtnZGIgc2VyaWFsIHBvcnQgbm90IGNvcnJlY3RseSBkZWZpbmVkIgorCisjZW5kaWYKKwordm9pZAora2dkYl9zZXJpYWxfaW5pdCAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHNjY190ICpzcDsKKwl2b2xhdGlsZSBzY2NfdWFydF90ICp1cDsKKwl2b2xhdGlsZSBjYmRfdCAqdGJkZiwgKnJiZGY7CisJdm9sYXRpbGUgY3BtODI2MF90ICpjcCA9ICYoaW0tPmltX2NwbSk7CisJdWludCBkcGFkZHIsIHNwZWVkID0gQ09ORklHX0tHREJfQkFVRFJBVEU7CisJY2hhciAqcywgKmU7CisKKwlpZiAoKHMgPSBnZXRlbnYoImtnZGJyYXRlIikpICE9IE5VTEwgJiYgKnMgIT0gJ1wwJykgeworCQl1bG9uZyByYXRlID0gc2ltcGxlX3N0cnRvdWwocywgJmUsIDEwKTsKKwkJaWYgKGUgPiBzICYmICplID09ICdcMCcpCisJCQlzcGVlZCA9IHJhdGU7CisJfQorCisJLyogaW5pdGlhbGl6ZSBwb2ludGVycyB0byBTQ0MgKi8KKworCXNwID0gKHNjY190ICopICYoaW0tPmltX3NjY1tLR0RCX1NDQ19JTkRFWF0pOworCXVwID0gKHNjY191YXJ0X3QgKikmaW0tPmltX2RwcmFtYmFzZVtLR0RCX1BST0ZGX1NDQ107CisKKwkvKiBEaXNhYmxlIHRyYW5zbWl0dGVyL3JlY2VpdmVyLgorCSovCisJc3AtPnNjY19nc21ybCAmPSB+KFNDQ19HU01STF9FTlIgfCBTQ0NfR1NNUkxfRU5UKTsKKworCS8qIHB1dCB0aGUgU0NDIGNoYW5uZWwgaW50byBOTVNJIChub24gbXVsdGlwbGV4ZCBzZXJpYWwgaW50ZXJmYWNlKQorCSAqIG1vZGUgYW5kIHdpcmUgdGhlIHNlbGVjdGVkIFNDQyBUeCBhbmQgUnggY2xvY2tzIHRvIEJSR3ggKDE1LTE1KS4KKwkgKi8KKwlpbS0+aW1fY3BtdXguY214X3NjciA9IFwKKwkJKGltLT5pbV9jcG11eC5jbXhfc2NyICYgfktHREJfQ01YU0NSX01BU0spIHwgS0dEQl9DTVhTQ1JfVkFMVUU7CisKKwkvKiBTZXQgdXAgdGhlIGJhdWQgcmF0ZSBnZW5lcmF0b3IuCisJKi8KKyNpZiBkZWZpbmVkKENPTkZJR19LR0RCX1VTRV9FWFRDKQorCW04MjYwX2NwbV9leHRjYnJnKEtHREJfU0NDX0lOREVYLCBzcGVlZCwKKwkJQ09ORklHX0tHREJfRVhUQ19SQVRFLCBDT05GSUdfS0dEQl9FWFRDX1BJTlNFTCk7CisjZWxzZQorCW04MjYwX2NwbV9zZXRicmcoS0dEQl9TQ0NfSU5ERVgsIHNwZWVkKTsKKyNlbmRpZgorCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHR3byBidWZmZXIgZGVzY3JpcHRvcnMgaW4gdGhlIERQIHJhbS4KKwkgKiBkYW1tOiBhbGxvY2F0aW5nIHNwYWNlIGFmdGVyIHRoZSB0d28gYnVmZmVycyBmb3IgcngvdHggZGF0YQorCSAqLworCisJZHBhZGRyID0gbTgyNjBfY3BtX2RwYWxsb2MoKDIgKiBzaXplb2YgKGNiZF90KSkgKyAyLCAxNik7CisKKwkvKiBTZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlcnMgaW4KKwkgKiB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzLgorCSAqLworCXJiZGYgPSAoY2JkX3QgKikmaW0tPmltX2RwcmFtYmFzZVtkcGFkZHJdOworCXJiZGYtPmNiZF9idWZhZGRyID0gKHVpbnQpIChyYmRmKzIpOworCXJiZGYtPmNiZF9zYyA9IEJEX1NDX0VNUFRZIHwgQkRfU0NfV1JBUDsKKwl0YmRmID0gcmJkZiArIDE7CisJdGJkZi0+Y2JkX2J1ZmFkZHIgPSAoKHVpbnQpIChyYmRmKzIpKSArIDE7CisJdGJkZi0+Y2JkX3NjID0gQkRfU0NfV1JBUDsKKworCS8qIFNldCB1cCB0aGUgdWFydCBwYXJhbWV0ZXJzIGluIHRoZSBwYXJhbWV0ZXIgcmFtLgorCSovCisJdXAtPnNjY19nZW5zY2Muc2NjX3JiYXNlID0gZHBhZGRyOworCXVwLT5zY2NfZ2Vuc2NjLnNjY190YmFzZSA9IGRwYWRkcitzaXplb2YoY2JkX3QpOworCXVwLT5zY2NfZ2Vuc2NjLnNjY19yZmNyID0gQ1BNRkNSX0VCOworCXVwLT5zY2NfZ2Vuc2NjLnNjY190ZmNyID0gQ1BNRkNSX0VCOworCXVwLT5zY2NfZ2Vuc2NjLnNjY19tcmJsciA9IDE7CisJdXAtPnNjY19tYXhpZGwgPSAwOworCXVwLT5zY2NfYnJrY3IgPSAxOworCXVwLT5zY2NfcGFyZWMgPSAwOworCXVwLT5zY2NfZnJtZWMgPSAwOworCXVwLT5zY2Nfbm9zZWMgPSAwOworCXVwLT5zY2NfYnJrZWMgPSAwOworCXVwLT5zY2NfdWFkZHIxID0gMDsKKwl1cC0+c2NjX3VhZGRyMiA9IDA7CisJdXAtPnNjY190b3NlcSA9IDA7CisJdXAtPnNjY19jaGFyMSA9IHVwLT5zY2NfY2hhcjIgPSB1cC0+c2NjX2NoYXIzID0gdXAtPnNjY19jaGFyNCA9IDB4ODAwMDsKKwl1cC0+c2NjX2NoYXI1ID0gdXAtPnNjY19jaGFyNiA9IHVwLT5zY2NfY2hhcjcgPSB1cC0+c2NjX2NoYXI4ID0gMHg4MDAwOworCXVwLT5zY2NfcmNjbSA9IDB4YzBmZjsKKworCS8qIE1hc2sgYWxsIGludGVycnVwdHMgYW5kIHJlbW92ZSBhbnl0aGluZyBwZW5kaW5nLgorCSovCisJc3AtPnNjY19zY2NtID0gMDsKKwlzcC0+c2NjX3NjY2UgPSAweGZmZmY7CisKKwkvKiBTZXQgOCBiaXQgRklGTywgMTYgYml0IG92ZXJzYW1wbGluZyBhbmQgVUFSVCBtb2RlLgorCSovCisJc3AtPnNjY19nc21yaCA9IFNDQ19HU01SSF9SRlc7CS8qIDggYml0IEZJRk8gKi8KKwlzcC0+c2NjX2dzbXJsID0gXAorCQlTQ0NfR1NNUkxfVERDUl8xNiB8IFNDQ19HU01STF9SRENSXzE2IHwgU0NDX0dTTVJMX01PREVfVUFSVDsKKworCS8qIFNldCBDVFMgZmxvdyBjb250cm9sLCAxIHN0b3AgYml0LCA4IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoLAorCSAqIG5vcm1hbCBhc3luYyBVQVJUIG1vZGUsIG5vIHBhcml0eQorCSAqLworCXNwLT5zY2NfcHNtciA9IFNDVV9QU01SX0ZMQyB8IFNDVV9QU01SX0NMOworCisJLyogZXhlY3V0ZSB0aGUgIkluaXQgUnggYW5kIFR4IHBhcmFtcyIgQ1AgY29tbWFuZC4KKwkqLworCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykgIC8qIHdhaXQgaWYgY3AgaXMgYnVzeSAqLworCSAgOworCisJY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoS0dEQl9DUE1fQ1JfU0NDX1BBR0UsIEtHREJfQ1BNX0NSX1NDQ19TQkxPQ0ssCisJCQkJCTAsIENQTV9DUl9JTklUX1RSWCkgfCBDUE1fQ1JfRkxHOworCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykgIC8qIHdhaXQgaWYgY3AgaXMgYnVzeSAqLworCSAgOworCisJLyogRW5hYmxlIHRyYW5zbWl0dGVyL3JlY2VpdmVyLgorCSovCisJc3AtPnNjY19nc21ybCB8PSBTQ0NfR1NNUkxfRU5SIHwgU0NDX0dTTVJMX0VOVDsKKworCXByaW50ZigiU0NDJWQgYXQgJWRicHMgIiwgQ09ORklHX0tHREJfSU5ERVgsIHNwZWVkKTsKK30KKwordm9pZAorcHV0RGVidWdDaGFyKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBzY2NfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBjYmRfdAkJKnRiZGY7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW07CisKKwlpZiAoYyA9PSAnXG4nKQorCQlwdXREZWJ1Z0NoYXIgKCdccicpOworCisJaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl1cCA9IChzY2NfdWFydF90ICopJmltLT5pbV9kcHJhbWJhc2VbS0dEQl9QUk9GRl9TQ0NdOworCXRiZGYgPSAoY2JkX3QgKikmaW0tPmltX2RwcmFtYmFzZVt1cC0+c2NjX2dlbnNjYy5zY2NfdGJhc2VdOworCisJLyogV2FpdCBmb3IgbGFzdCBjaGFyYWN0ZXIgdG8gZ28uCisJICovCisJd2hpbGUgKHRiZGYtPmNiZF9zYyAmIEJEX1NDX1JFQURZKQorCQk7CisKKwkvKiBMb2FkIHRoZSBjaGFyYWN0ZXIgaW50byB0aGUgdHJhbnNtaXQgYnVmZmVyLgorCSAqLworCSoodm9sYXRpbGUgY2hhciAqKXRiZGYtPmNiZF9idWZhZGRyID0gYzsKKwl0YmRmLT5jYmRfZGF0bGVuID0gMTsKKwl0YmRmLT5jYmRfc2MgfD0gQkRfU0NfUkVBRFk7Cit9CisKK3ZvaWQKK3B1dERlYnVnU3RyIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlwdXREZWJ1Z0NoYXIgKCpzKyspOworCX0KK30KKworaW50CitnZXREZWJ1Z0NoYXIodm9pZCkKK3sKKwl2b2xhdGlsZSBjYmRfdAkJKnJiZGY7CisJdm9sYXRpbGUgc2NjX3VhcnRfdAkqdXA7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW07CisJdW5zaWduZWQgY2hhcgkJYzsKKworCWltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdXAgPSAoc2NjX3VhcnRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW0tHREJfUFJPRkZfU0NDXTsKKwlyYmRmID0gKGNiZF90ICopJmltLT5pbV9kcHJhbWJhc2VbdXAtPnNjY19nZW5zY2Muc2NjX3JiYXNlXTsKKworCS8qIFdhaXQgZm9yIGNoYXJhY3RlciB0byBzaG93IHVwLgorCSAqLworCXdoaWxlIChyYmRmLT5jYmRfc2MgJiBCRF9TQ19FTVBUWSkKKwkJOworCisJLyogR3JhYiB0aGUgY2hhciBhbmQgY2xlYXIgdGhlIGJ1ZmZlciBhZ2Fpbi4KKwkgKi8KKwljID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcmJkZi0+Y2JkX2J1ZmFkZHI7CisJcmJkZi0+Y2JkX3NjIHw9IEJEX1NDX0VNUFRZOworCisJcmV0dXJuIChjKTsKK30KKwordm9pZAora2dkYl9pbnRlcnJ1cHRpYmxlKGludCB5ZXMpCit7CisJcmV0dXJuOworfQorCisjZW5kaWYJLyogQ09ORklHX0tHREJfT05fU0NDICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc2VyaWFsX3NtYy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NlcmlhbF9zbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZlYWJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NlcmlhbF9zbWMuYwpAQCAtMCwwICsxLDQ2NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBIYWNrZWQgZm9yIE1QQzgyNjAgYnkgTXVycmF5LkplbnNlbkBjbXN0LmNzaXJvLmF1LCAxOS1PY3QtMDAsIHdpdGgKKyAqIGNoYW5nZXMgYmFzZWQgb24gdGhlIGZpbGUgYXJjaC9wb3dlcnBjL21ieGJvb3QvbTgyNjBfdHR5LmMgZnJvbSB0aGUKKyAqIExpbnV4L1BQQyBzb3VyY2VzIChtODI2MF90dHkuYyBoYWQgbm8gY29weXJpZ2h0IGluZm8gaW4gaXQpLgorICovCisKKy8qCisgKiBNaW5pbWFsIHNlcmlhbCBmdW5jdGlvbnMgbmVlZGVkIHRvIHVzZSBvbmUgb2YgdGhlIFNNQyBwb3J0cworICogYXMgc2VyaWFsIGNvbnNvbGUgaW50ZXJmYWNlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4MjYwLmg+CisjaW5jbHVkZSA8YXNtL2NwbV84MjYwLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZChDT05GSUdfQ09OU19PTl9TTUMpCisKKyNpZiBDT05GSUdfQ09OU19JTkRFWCA9PSAxCS8qIENvbnNvbGUgb24gU01DMSAqLworCisjZGVmaW5lIFNNQ19JTkRFWAkJMAorI2RlZmluZSBQUk9GRl9TTUNfQkFTRQkJUFJPRkZfU01DMV9CQVNFCisjZGVmaW5lIFBST0ZGX1NNQwkJUFJPRkZfU01DMQorI2RlZmluZSBDUE1fQ1JfU01DX1BBR0UJCUNQTV9DUl9TTUMxX1BBR0UKKyNkZWZpbmUgQ1BNX0NSX1NNQ19TQkxPQ0sJQ1BNX0NSX1NNQzFfU0JMT0NLCisjZGVmaW5lIENNWFNNUl9NQVNLCQkoQ01YU01SX1NNQzF8Q01YU01SX1NNQzFDU19NU0spCisjZGVmaW5lIENNWFNNUl9WQUxVRQkJQ01YU01SX1NNQzFDU19CUkc3CisKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDIJLyogQ29uc29sZSBvbiBTTUMyICovCisKKyNkZWZpbmUgU01DX0lOREVYCQkxCisjZGVmaW5lIFBST0ZGX1NNQ19CQVNFCQlQUk9GRl9TTUMyX0JBU0UKKyNkZWZpbmUgUFJPRkZfU01DCQlQUk9GRl9TTUMyCisjZGVmaW5lIENQTV9DUl9TTUNfUEFHRQkJQ1BNX0NSX1NNQzJfUEFHRQorI2RlZmluZSBDUE1fQ1JfU01DX1NCTE9DSwlDUE1fQ1JfU01DMl9TQkxPQ0sKKyNkZWZpbmUgQ01YU01SX01BU0sJCShDTVhTTVJfU01DMnxDTVhTTVJfU01DMkNTX01TSykKKyNkZWZpbmUgQ01YU01SX1ZBTFVFCQlDTVhTTVJfU01DMkNTX0JSRzgKKworI2Vsc2UKKworI2Vycm9yICJjb25zb2xlIG5vdCBjb3JyZWN0bHkgZGVmaW5lZCIKKworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfU1lTX1NNQ19SWEJVRkxFTikKKyNkZWZpbmUgQ09ORklHX1NZU19TTUNfUlhCVUZMRU4JMQorI2RlZmluZSBDT05GSUdfU1lTX01BWElETEUJMAorI2Vsc2UKKyNpZiAhZGVmaW5lZChDT05GSUdfU1lTX01BWElETEUpCisjZXJyb3IgInlvdSBtdXN0IGRlZmluZSBDT05GSUdfU1lTX01BWElETEUiCisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBzZXJpYWxidWZmZXIgeworCWNiZF90CXJ4YmQ7CQkvKiBSeCBCRCAqLworCWNiZF90CXR4YmQ7CQkvKiBUeCBCRCAqLworCXVpbnQJcnhpbmRleDsJLyogaW5kZXggZm9yIG5leHQgY2hhcmFjdGVyIHRvIHJlYWQgKi8KKwl2b2xhdGlsZSB1Y2hhcglyeGJ1ZltDT05GSUdfU1lTX1NNQ19SWEJVRkxFTl07LyogcnggYnVmZmVycyAqLworCXZvbGF0aWxlIHVjaGFyCXR4YnVmOwkvKiB0eCBidWZmZXJzICovCit9IHNlcmlhbGJ1ZmZlcl90OworCisvKiBtYXAgcnNfdGFibGUgaW5kZXggdG8gYmF1ZCByYXRlIGdlbmVyYXRvciBpbmRleCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnJnX21hcFtdID0geworCTYsCS8qIEJSRzcgZm9yIFNNQzEgKi8KKwk3LAkvKiBCUkc4IGZvciBTTUMyICovCisJMCwJLyogQlJHMSBmb3IgU0NDMSAqLworCTEsCS8qIEJSRzEgZm9yIFNDQzIgKi8KKwkyLAkvKiBCUkcxIGZvciBTQ0MzICovCisJMywJLyogQlJHMSBmb3IgU0NDNCAqLworfTsKKworaW50IHNlcmlhbF9pbml0ICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgc21jX3QgKnNwOworCXZvbGF0aWxlIHNtY191YXJ0X3QgKnVwOworCXZvbGF0aWxlIGNwbTgyNjBfdCAqY3AgPSAmKGltLT5pbV9jcG0pOworCXVpbnQJZHBhZGRyOworCXZvbGF0aWxlIHNlcmlhbGJ1ZmZlcl90ICpydHg7CisKKwkvKiBpbml0aWFsaXplIHBvaW50ZXJzIHRvIFNNQyAqLworCisJc3AgPSAoc21jX3QgKikgJihpbS0+aW1fc21jW1NNQ19JTkRFWF0pOworCSoodXNob3J0ICopKCZpbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NNQ19CQVNFXSkgPSBQUk9GRl9TTUM7CisJdXAgPSAoc21jX3VhcnRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NNQ107CisKKwkvKiBEaXNhYmxlIHRyYW5zbWl0dGVyL3JlY2VpdmVyLiAqLworCXNwLT5zbWNfc21jbXIgJj0gfihTTUNNUl9SRU4gfCBTTUNNUl9URU4pOworCisJLyogTk9URTogSS9PIHBvcnQgcGlucyBhcmUgc2V0IHVwIHZpYSB0aGUgaW9wX2NvbmZfdGFiW10gdGFibGUgKi8KKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0d28gYnVmZmVyIGRlc2NyaXB0b3JzIGluIHRoZSBEUCByYW0uCisJICogZGFtbTogYWxsb2NhdGluZyBzcGFjZSBhZnRlciB0aGUgdHdvIGJ1ZmZlcnMgZm9yIHJ4L3R4IGRhdGEKKwkgKi8KKworCS8qIGFsbG9jYXRlIHNpemUgb2Ygc3RydWN0IHNlcmlhbGJ1ZmZlciB3aXRoIGJkIHJ4L3R4LAorCSAqIGJ1ZmZlciByeC90eCBhbmQgcnggaW5kZXgKKwkgKi8KKwlkcGFkZHIgPSBtODI2MF9jcG1fZHBhbGxvYygoc2l6ZW9mKHNlcmlhbGJ1ZmZlcl90KSksIDE2KTsKKworCXJ0eCA9IChzZXJpYWxidWZmZXJfdCAqKSZpbS0+aW1fZHByYW1iYXNlW2RwYWRkcl07CisKKwkvKiBTZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlcnMgaW4KKwkgKiB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzLgorCSAqLworCXJ0eC0+cnhiZC5jYmRfYnVmYWRkciA9ICh1aW50KSAmcnR4LT5yeGJ1ZjsKKwlydHgtPnJ4YmQuY2JkX3NjICAgICAgPSAwOworCisJcnR4LT50eGJkLmNiZF9idWZhZGRyID0gKHVpbnQpICZydHgtPnR4YnVmOworCXJ0eC0+dHhiZC5jYmRfc2MgICAgICA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIHVhcnQgcGFyYW1ldGVycyBpbiB0aGUgcGFyYW1ldGVyIHJhbS4gKi8KKwl1cC0+c21jX3JiYXNlID0gZHBhZGRyOworCXVwLT5zbWNfdGJhc2UgPSBkcGFkZHIrc2l6ZW9mKGNiZF90KTsKKwl1cC0+c21jX3JmY3IgPSBDUE1GQ1JfRUI7CisJdXAtPnNtY190ZmNyID0gQ1BNRkNSX0VCOworCXVwLT5zbWNfYnJrbGVuID0gMDsKKwl1cC0+c21jX2Jya2VjID0gMDsKKwl1cC0+c21jX2Jya2NyID0gMDsKKworCS8qIFNldCBVQVJUIG1vZGUsIDggYml0LCBubyBwYXJpdHksIG9uZSBzdG9wLgorCSAqIEVuYWJsZSByZWNlaXZlIGFuZCB0cmFuc21pdC4KKwkgKi8KKwlzcC0+c21jX3NtY21yID0gc21jcl9ta19jbGVuKDkpIHwgIFNNQ01SX1NNX1VBUlQ7CisKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzIGFuZCByZW1vdmUgYW55dGhpbmcgcGVuZGluZy4gKi8KKwlzcC0+c21jX3NtY20gPSAwOworCXNwLT5zbWNfc21jZSA9IDB4ZmY7CisKKwkvKiBwdXQgdGhlIFNNQyBjaGFubmVsIGludG8gTk1TSSAobm9uIG11bHRpcGxleGQgc2VyaWFsIGludGVyZmFjZSkKKwkgKiBtb2RlIGFuZCB3aXJlIGVpdGhlciBCUkc3IHRvIFNNQzEgb3IgQlJHOCB0byBTTUMyICgxNS0xNykuCisJICovCisJaW0tPmltX2NwbXV4LmNteF9zbXIgPSAoaW0tPmltX2NwbXV4LmNteF9zbXImfkNNWFNNUl9NQVNLKXxDTVhTTVJfVkFMVUU7CisKKwkvKiBTZXQgdXAgdGhlIGJhdWQgcmF0ZSBnZW5lcmF0b3IuICovCisJc2VyaWFsX3NldGJyZyAoKTsKKworCS8qIE1ha2UgdGhlIGZpcnN0IGJ1ZmZlciB0aGUgb25seSBidWZmZXIuICovCisJcnR4LT50eGJkLmNiZF9zYyB8PSBCRF9TQ19XUkFQOworCXJ0eC0+cnhiZC5jYmRfc2MgfD0gQkRfU0NfRU1QVFkgfCBCRF9TQ19XUkFQOworCisJLyogc2luZ2xlL211bHRpIGNoYXJhY3RlciByZWNlaXZlLiAqLworCXVwLT5zbWNfbXJibHIgPSBDT05GSUdfU1lTX1NNQ19SWEJVRkxFTjsKKwl1cC0+c21jX21heGlkbCA9IENPTkZJR19TWVNfTUFYSURMRTsKKwlydHgtPnJ4aW5kZXggPSAwOworCisJLyogSW5pdGlhbGl6ZSBUeC9SeCBwYXJhbWV0ZXJzLiAqLworCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykgIC8qIHdhaXQgaWYgY3AgaXMgYnVzeSAqLworCSAgOworCisJY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoQ1BNX0NSX1NNQ19QQUdFLCBDUE1fQ1JfU01DX1NCTE9DSywKKwkJCQkJMCwgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisKKwl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKSAgLyogd2FpdCBpZiBjcCBpcyBidXN5ICovCisJICA7CisKKwkvKiBFbmFibGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIuICovCisJc3AtPnNtY19zbWNtciB8PSBTTUNNUl9SRU4gfCBTTUNNUl9URU47CisKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitzZXJpYWxfc2V0YnJnICh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NPTlNfVVNFX0VYVEMpCisJbTgyNjBfY3BtX2V4dGNicmcoYnJnX21hcFtTTUNfSU5ERVhdLCBnZC0+YmF1ZHJhdGUsCisJCUNPTkZJR19DT05TX0VYVENfUkFURSwgQ09ORklHX0NPTlNfRVhUQ19QSU5TRUwpOworI2Vsc2UKKwltODI2MF9jcG1fc2V0YnJnKGJyZ19tYXBbU01DX0lOREVYXSwgZ2QtPmJhdWRyYXRlKTsKKyNlbmRpZgorfQorCit2b2lkCitzZXJpYWxfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisJdm9sYXRpbGUgc21jX3VhcnRfdAkqdXA7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBzZXJpYWxidWZmZXJfdAkqcnR4OworCisJaWYgKGMgPT0gJ1xuJykKKwkJc2VyaWFsX3B1dGMgKCdccicpOworCisJdXAgPSAoc21jX3VhcnRfdCAqKSYoaW0tPmltX2RwcmFtYmFzZVtQUk9GRl9TTUNdKTsKKworCXJ0eCA9IChzZXJpYWxidWZmZXJfdCAqKSZpbS0+aW1fZHByYW1iYXNlW3VwLT5zbWNfcmJhc2VdOworCisJLyogV2FpdCBmb3IgbGFzdCBjaGFyYWN0ZXIgdG8gZ28uICovCisJd2hpbGUgKHJ0eC0+dHhiZC5jYmRfc2MgJiBCRF9TQ19SRUFEWSAmIEJEX1NDX1JFQURZKQorCQk7CisJcnR4LT50eGJ1ZiA9IGM7CisJcnR4LT50eGJkLmNiZF9kYXRsZW4gPSAxOworCXJ0eC0+dHhiZC5jYmRfc2MgfD0gQkRfU0NfUkVBRFk7Cit9CisKK3ZvaWQKK3NlcmlhbF9wdXRzIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzZXJpYWxfcHV0YyAoKnMrKyk7CisJfQorfQorCitpbnQKK3NlcmlhbF9nZXRjKHZvaWQpCit7CisJdm9sYXRpbGUgc21jX3VhcnRfdAkqdXA7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBzZXJpYWxidWZmZXJfdAkqcnR4OworCXVuc2lnbmVkIGNoYXIgIGM7CisKKwl1cCA9IChzbWNfdWFydF90ICopJihpbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NNQ10pOworCisJcnR4ID0gKHNlcmlhbGJ1ZmZlcl90ICopJmltLT5pbV9kcHJhbWJhc2VbdXAtPnNtY19yYmFzZV07CisKKwkvKiBXYWl0IGZvciBjaGFyYWN0ZXIgdG8gc2hvdyB1cC4gKi8KKwl3aGlsZSAocnR4LT5yeGJkLmNiZF9zYyAmIEJEX1NDX0VNUFRZKQorCQk7CisKKwkvKiB0aGUgY2hhcmFjdGVycyBhcmUgcmVhZCBvbmUgYnkgb25lLAorCSAqIHVzZSB0aGUgcnhpbmRleCB0byBrbm93IHRoZSBuZXh0IGNoYXIgdG8gZGVsaXZlcgorCSAqLworCWMgPSAqKHVuc2lnbmVkIGNoYXIgKikgKHJ0eC0+cnhiZC5jYmRfYnVmYWRkciArIHJ0eC0+cnhpbmRleCk7CisJcnR4LT5yeGluZGV4Kys7CisKKwkvKiBjaGVjayBpZiBhbGwgY2hhciBhcmUgcmVhZG91dCwgdGhlbiBtYWtlIHByZXBhcmUgZm9yIG5leHQgcmVjZWl2ZSAqLworCWlmIChydHgtPnJ4aW5kZXggPj0gcnR4LT5yeGJkLmNiZF9kYXRsZW4pIHsKKwkJcnR4LT5yeGluZGV4ID0gMDsKKwkJcnR4LT5yeGJkLmNiZF9zYyB8PSBCRF9TQ19FTVBUWTsKKwl9CisJcmV0dXJuKGMpOworfQorCitpbnQKK3NlcmlhbF90c3RjKCkKK3sKKwl2b2xhdGlsZSBzbWNfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBpbW1hcF90CSppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHNlcmlhbGJ1ZmZlcl90CSpydHg7CisKKwl1cCA9IChzbWNfdWFydF90ICopJihpbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NNQ10pOworCXJ0eCA9IChzZXJpYWxidWZmZXJfdCAqKSZpbS0+aW1fZHByYW1iYXNlW3VwLT5zbWNfcmJhc2VdOworCisJcmV0dXJuICEocnR4LT5yeGJkLmNiZF9zYyAmIEJEX1NDX0VNUFRZKTsKK30KKworI2VuZGlmCS8qIENPTkZJR19DT05TX09OX1NNQyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfS0dEQl9PTl9TTUMpCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT05TX09OX1NNQykgJiYgQ09ORklHX0tHREJfSU5ERVggPT0gQ09ORklHX0NPTlNfSU5ERVgKKyNlcnJvciBXaG9vcHMhIHNlcmlhbCBjb25zb2xlIGFuZCBrZ2RiIGFyZSBvbiB0aGUgc2FtZSBzbWMgc2VyaWFsIHBvcnQKKyNlbmRpZgorCisjaWYgQ09ORklHX0tHREJfSU5ERVggPT0gMQkvKiBLR0RCIFBvcnQgb24gU01DMSAqLworCisjZGVmaW5lIEtHREJfU01DX0lOREVYCQkwCisjZGVmaW5lIEtHREJfUFJPRkZfU01DX0JBU0UJUFJPRkZfU01DMV9CQVNFCisjZGVmaW5lIEtHREJfUFJPRkZfU01DCQlQUk9GRl9TTUMxCisjZGVmaW5lIEtHREJfQ1BNX0NSX1NNQ19QQUdFCUNQTV9DUl9TTUMxX1BBR0UKKyNkZWZpbmUgS0dEQl9DUE1fQ1JfU01DX1NCTE9DSwlDUE1fQ1JfU01DMV9TQkxPQ0sKKyNkZWZpbmUgS0dEQl9DTVhTTVJfTUFTSwkoQ01YU01SX1NNQzF8Q01YU01SX1NNQzFDU19NU0spCisjZGVmaW5lIEtHREJfQ01YU01SX1ZBTFVFCUNNWFNNUl9TTUMxQ1NfQlJHNworCisjZWxpZiBDT05GSUdfS0dEQl9JTkRFWCA9PSAyCS8qIEtHREIgUG9ydCBvbiBTTUMyICovCisKKyNkZWZpbmUgS0dEQl9TTUNfSU5ERVgJCTEKKyNkZWZpbmUgS0dEQl9QUk9GRl9TTUNfQkFTRQlQUk9GRl9TTUMyX0JBU0UKKyNkZWZpbmUgS0dEQl9QUk9GRl9TTUMJCVBST0ZGX1NNQzIKKyNkZWZpbmUgS0dEQl9DUE1fQ1JfU01DX1BBR0UJQ1BNX0NSX1NNQzJfUEFHRQorI2RlZmluZSBLR0RCX0NQTV9DUl9TTUNfU0JMT0NLCUNQTV9DUl9TTUMyX1NCTE9DSworI2RlZmluZSBLR0RCX0NNWFNNUl9NQVNLCShDTVhTTVJfU01DMnxDTVhTTVJfU01DMkNTX01TSykKKyNkZWZpbmUgS0dEQl9DTVhTTVJfVkFMVUUJQ01YU01SX1NNQzJDU19CUkc4CisKKyNlbHNlCisKKyNlcnJvciAiY29uc29sZSBub3QgY29ycmVjdGx5IGRlZmluZWQiCisKKyNlbmRpZgorCit2b2lkCitrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgc21jX3QgKnNwOworCXZvbGF0aWxlIHNtY191YXJ0X3QgKnVwOworCXZvbGF0aWxlIGNiZF90ICp0YmRmLCAqcmJkZjsKKwl2b2xhdGlsZSBjcG04MjYwX3QgKmNwID0gJihpbS0+aW1fY3BtKTsKKwl1aW50IGRwYWRkciwgc3BlZWQgPSBDT05GSUdfS0dEQl9CQVVEUkFURTsKKwljaGFyICpzLCAqZTsKKworCWlmICgocyA9IGdldGVudigia2dkYnJhdGUiKSkgIT0gTlVMTCAmJiAqcyAhPSAnXDAnKSB7CisJCXVsb25nIHJhdGUgPSBzaW1wbGVfc3RydG91bChzLCAmZSwgMTApOworCQlpZiAoZSA+IHMgJiYgKmUgPT0gJ1wwJykKKwkJCXNwZWVkID0gcmF0ZTsKKwl9CisKKwkvKiBpbml0aWFsaXplIHBvaW50ZXJzIHRvIFNNQyAqLworCisJc3AgPSAoc21jX3QgKikgJihpbS0+aW1fc21jW0tHREJfU01DX0lOREVYXSk7CisJKih1c2hvcnQgKikoJmltLT5pbV9kcHJhbWJhc2VbS0dEQl9QUk9GRl9TTUNfQkFTRV0pID0gS0dEQl9QUk9GRl9TTUM7CisJdXAgPSAoc21jX3VhcnRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW0tHREJfUFJPRkZfU01DXTsKKworCS8qIERpc2FibGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIuICovCisJc3AtPnNtY19zbWNtciAmPSB+KFNNQ01SX1JFTiB8IFNNQ01SX1RFTik7CisKKwkvKiBOT1RFOiBJL08gcG9ydCBwaW5zIGFyZSBzZXQgdXAgdmlhIHRoZSBpb3BfY29uZl90YWJbXSB0YWJsZSAqLworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHR3byBidWZmZXIgZGVzY3JpcHRvcnMgaW4gdGhlIERQIHJhbS4KKwkgKiBkYW1tOiBhbGxvY2F0aW5nIHNwYWNlIGFmdGVyIHRoZSB0d28gYnVmZmVycyBmb3IgcngvdHggZGF0YQorCSAqLworCisJZHBhZGRyID0gbTgyNjBfY3BtX2RwYWxsb2MoKDIgKiBzaXplb2YgKGNiZF90KSkgKyAyLCAxNik7CisKKwkvKiBTZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlcnMgaW4KKwkgKiB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzLgorCSAqLworCXJiZGYgPSAoY2JkX3QgKikmaW0tPmltX2RwcmFtYmFzZVtkcGFkZHJdOworCXJiZGYtPmNiZF9idWZhZGRyID0gKHVpbnQpIChyYmRmKzIpOworCXJiZGYtPmNiZF9zYyA9IDA7CisJdGJkZiA9IHJiZGYgKyAxOworCXRiZGYtPmNiZF9idWZhZGRyID0gKCh1aW50KSAocmJkZisyKSkgKyAxOworCXRiZGYtPmNiZF9zYyA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIHVhcnQgcGFyYW1ldGVycyBpbiB0aGUgcGFyYW1ldGVyIHJhbS4gKi8KKwl1cC0+c21jX3JiYXNlID0gZHBhZGRyOworCXVwLT5zbWNfdGJhc2UgPSBkcGFkZHIrc2l6ZW9mKGNiZF90KTsKKwl1cC0+c21jX3JmY3IgPSBDUE1GQ1JfRUI7CisJdXAtPnNtY190ZmNyID0gQ1BNRkNSX0VCOworCXVwLT5zbWNfYnJrbGVuID0gMDsKKwl1cC0+c21jX2Jya2VjID0gMDsKKwl1cC0+c21jX2Jya2NyID0gMDsKKworCS8qIFNldCBVQVJUIG1vZGUsIDggYml0LCBubyBwYXJpdHksIG9uZSBzdG9wLgorCSAqIEVuYWJsZSByZWNlaXZlIGFuZCB0cmFuc21pdC4KKwkgKi8KKwlzcC0+c21jX3NtY21yID0gc21jcl9ta19jbGVuKDkpIHwgIFNNQ01SX1NNX1VBUlQ7CisKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzIGFuZCByZW1vdmUgYW55dGhpbmcgcGVuZGluZy4gKi8KKwlzcC0+c21jX3NtY20gPSAwOworCXNwLT5zbWNfc21jZSA9IDB4ZmY7CisKKwkvKiBwdXQgdGhlIFNNQyBjaGFubmVsIGludG8gTk1TSSAobm9uIG11bHRpcGxleGQgc2VyaWFsIGludGVyZmFjZSkKKwkgKiBtb2RlIGFuZCB3aXJlIGVpdGhlciBCUkc3IHRvIFNNQzEgb3IgQlJHOCB0byBTTUMyICgxNS0xNykuCisJICovCisJaW0tPmltX2NwbXV4LmNteF9zbXIgPQorCQkoaW0tPmltX2NwbXV4LmNteF9zbXIgJiB+S0dEQl9DTVhTTVJfTUFTSykgfCBLR0RCX0NNWFNNUl9WQUxVRTsKKworCS8qIFNldCB1cCB0aGUgYmF1ZCByYXRlIGdlbmVyYXRvci4gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19LR0RCX1VTRV9FWFRDKQorCW04MjYwX2NwbV9leHRjYnJnKGJyZ19tYXBbS0dEQl9TTUNfSU5ERVhdLCBzcGVlZCwKKwkJQ09ORklHX0tHREJfRVhUQ19SQVRFLCBDT05GSUdfS0dEQl9FWFRDX1BJTlNFTCk7CisjZWxzZQorCW04MjYwX2NwbV9zZXRicmcoYnJnX21hcFtLR0RCX1NNQ19JTkRFWF0sIHNwZWVkKTsKKyNlbmRpZgorCisJLyogTWFrZSB0aGUgZmlyc3QgYnVmZmVyIHRoZSBvbmx5IGJ1ZmZlci4gKi8KKwl0YmRmLT5jYmRfc2MgfD0gQkRfU0NfV1JBUDsKKwlyYmRmLT5jYmRfc2MgfD0gQkRfU0NfRU1QVFkgfCBCRF9TQ19XUkFQOworCisJLyogU2luZ2xlIGNoYXJhY3RlciByZWNlaXZlLiAqLworCXVwLT5zbWNfbXJibHIgPSAxOworCXVwLT5zbWNfbWF4aWRsID0gMDsKKworCS8qIEluaXRpYWxpemUgVHgvUnggcGFyYW1ldGVycy4gKi8KKworCXdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpICAvKiB3YWl0IGlmIGNwIGlzIGJ1c3kgKi8KKwkgIDsKKworCWNwLT5jcF9jcGNyID0gbWtfY3JfY21kKEtHREJfQ1BNX0NSX1NNQ19QQUdFLCBLR0RCX0NQTV9DUl9TTUNfU0JMT0NLLAorCQkJCQkwLCBDUE1fQ1JfSU5JVF9UUlgpIHwgQ1BNX0NSX0ZMRzsKKworCXdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpICAvKiB3YWl0IGlmIGNwIGlzIGJ1c3kgKi8KKwkgIDsKKworCS8qIEVuYWJsZSB0cmFuc21pdHRlci9yZWNlaXZlci4JKi8KKwlzcC0+c21jX3NtY21yIHw9IFNNQ01SX1JFTiB8IFNNQ01SX1RFTjsKKworCXByaW50ZigiU01DJWQgYXQgJWRicHMgIiwgQ09ORklHX0tHREJfSU5ERVgsIHNwZWVkKTsKK30KKwordm9pZAorcHV0RGVidWdDaGFyKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBjYmRfdAkJKnRiZGY7CisJdm9sYXRpbGUgY2hhcgkJKmJ1ZjsKKwl2b2xhdGlsZSBzbWNfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBpbW1hcF90CSppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCisJaWYgKGMgPT0gJ1xuJykKKwkJcHV0RGVidWdDaGFyICgnXHInKTsKKworCXVwID0gKHNtY191YXJ0X3QgKikmKGltLT5pbV9kcHJhbWJhc2VbS0dEQl9QUk9GRl9TTUNdKTsKKworCXRiZGYgPSAoY2JkX3QgKikmaW0tPmltX2RwcmFtYmFzZVt1cC0+c21jX3RiYXNlXTsKKworCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLiAqLworCWJ1ZiA9IChjaGFyICopdGJkZi0+Y2JkX2J1ZmFkZHI7CisJd2hpbGUgKHRiZGYtPmNiZF9zYyAmIEJEX1NDX1JFQURZKQorCQk7CisKKwkqYnVmID0gYzsKKwl0YmRmLT5jYmRfZGF0bGVuID0gMTsKKwl0YmRmLT5jYmRfc2MgfD0gQkRfU0NfUkVBRFk7Cit9CisKK3ZvaWQKK3B1dERlYnVnU3RyIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlwdXREZWJ1Z0NoYXIgKCpzKyspOworCX0KK30KKworaW50CitnZXREZWJ1Z0NoYXIodm9pZCkKK3sKKwl2b2xhdGlsZSBjYmRfdAkJKnJiZGY7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgkqYnVmOworCXZvbGF0aWxlIHNtY191YXJ0X3QJKnVwOworCXZvbGF0aWxlIGltbWFwX3QJKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdW5zaWduZWQgY2hhcgkJYzsKKworCXVwID0gKHNtY191YXJ0X3QgKikmKGltLT5pbV9kcHJhbWJhc2VbS0dEQl9QUk9GRl9TTUNdKTsKKworCXJiZGYgPSAoY2JkX3QgKikmaW0tPmltX2RwcmFtYmFzZVt1cC0+c21jX3JiYXNlXTsKKworCS8qIFdhaXQgZm9yIGNoYXJhY3RlciB0byBzaG93IHVwLiAqLworCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcmJkZi0+Y2JkX2J1ZmFkZHI7CisJd2hpbGUgKHJiZGYtPmNiZF9zYyAmIEJEX1NDX0VNUFRZKQorCQk7CisJYyA9ICpidWY7CisJcmJkZi0+Y2JkX3NjIHw9IEJEX1NDX0VNUFRZOworCisJcmV0dXJuKGMpOworfQorCit2b2lkCitrZ2RiX2ludGVycnVwdGlibGUoaW50IHllcykKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfS0dEQl9PTl9TTUMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zcGVlZC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxYzJiMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zcGVlZC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19CT0FSRF9HRVRfQ1BVX0NMS19GKQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYm9hcmRfZ2V0X2NwdV9jbGtfZiAodm9pZCk7CisjZW5kaWYKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQnVzLXRvLUNvcmUgTXVsdGlwbGllciAqLworI2RlZmluZSBfMXgJMgorI2RlZmluZSBfMV81eAkzCisjZGVmaW5lIF8yeAk0CisjZGVmaW5lIF8yXzV4CTUKKyNkZWZpbmUgXzN4CTYKKyNkZWZpbmUgXzNfNXgJNworI2RlZmluZSBfNHgJOAorI2RlZmluZSBfNF81eAk5CisjZGVmaW5lIF81eAkxMAorI2RlZmluZSBfNV81eAkxMQorI2RlZmluZSBfNngJMTIKKyNkZWZpbmUgXzZfNXgJMTMKKyNkZWZpbmUgXzd4CTE0CisjZGVmaW5lIF83XzV4CTE1CisjZGVmaW5lIF84eAkxNgorI2RlZmluZSBfYnlwCS0xCisjZGVmaW5lIF9vZmYJLTIKKyNkZWZpbmUgX3VuawktMworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGIyY19tdWx0OworCWludCB2Y29fZGl2OworCWNoYXIgKmZyZXFfNjB4OworCWNoYXIgKmZyZXFfY29yZTsKK30gY29yZWNuZl90OworCisvKgorICogdGhpcyB0YWJsZSBiYXNlZCBvbiAiRXJyYXRhIHRvIE1QQzgyNjAgUG93ZXJRVUlDQyBJSSBVc2VyJ3MgTWFudWFsIiwKKyAqIFJldi4gMSwgOC8yMDAwLCBwYWdlIDEwLgorICovCitjb3JlY25mX3QgY29yZWNuZl90YWJbXSA9IHsKKwl7IF8xXzV4LCAgNCwgIiAzMy0xMDAiLCAiIDMzLTEwMCIgfSwJLyogMHgwMCAqLworCXsgICBfMXgsICA0LCAiIDUwLTE1MCIsICIgNTAtMTUwIiB9LAkvKiAweDAxICovCisJeyAgIF8xeCwgIDgsICIgMjUtNzUgIiwgIiAyNS03NSAiIH0sCS8qIDB4MDIgKi8KKwl7ICBfYnlwLCAtMSwgIiAgPy0/ICAiLCAiICA/LT8gICIgfSwJLyogMHgwMyAqLworCXsgICBfMngsICAyLCAiIDUwLTE1MCIsICIxMDAtMzAwIiB9LAkvKiAweDA0ICovCisJeyAgIF8yeCwgIDQsICIgMjUtNzUgIiwgIiA1MC0xNTAiIH0sCS8qIDB4MDUgKi8KKwl7IF8yXzV4LCAgMiwgIiA0MC0xMjAiLCAiMTAwLTI0MCIgfSwJLyogMHgwNiAqLworCXsgXzRfNXgsICAyLCAiIDIyLTY1ICIsICIxMDAtMzAwIiB9LAkvKiAweDA3ICovCisJeyAgIF8zeCwgIDIsICIgMzMtMTAwIiwgIjEwMC0zMDAiIH0sCS8qIDB4MDggKi8KKwl7IF81XzV4LCAgMiwgIiAxOC01NSAiLCAiMTAwLTMwMCIgfSwJLyogMHgwOSAqLworCXsgICBfNHgsICAyLCAiIDI1LTc1ICIsICIxMDAtMzAwIiB9LAkvKiAweDBBICovCisJeyAgIF81eCwgIDIsICIgMjAtNjAgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MEIgKi8KKwl7IF8xXzV4LCAgOCwgIiAxNi01MCAiLCAiIDE2LTUwICIgfSwJLyogMHgwQyAqLworCXsgICBfNngsICAyLCAiIDE2LTUwICIsICIxMDAtMzAwIiB9LAkvKiAweDBEICovCisJeyBfM181eCwgIDIsICIgMzAtODUgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MEUgKi8KKwl7ICBfb2ZmLCAtMSwgIiAgPy0/ICAiLCAiICA/LT8gICIgfSwJLyogMHgwRiAqLworCXsgICBfM3gsICA0LCAiIDE2LTUwICIsICIgNTAtMTUwIiB9LAkvKiAweDEwICovCisJeyBfMl81eCwgIDQsICIgMjAtNjAgIiwgIiA1MC0xMjAiIH0sCS8qIDB4MTEgKi8KKwl7IF82XzV4LCAgMiwgIiAxNS00NiAiLCAiMTAwLTMwMCIgfSwJLyogMHgxMiAqLworCXsgIF9ieXAsIC0xLCAiICA/LT8gICIsICIgID8tPyAgIiB9LAkvKiAweDEzICovCisJeyAgIF83eCwgIDIsICIgMTQtNDMgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MTQgKi8KKwl7ICAgXzJ4LCAgNCwgIiAyNS03NSAiLCAiIDUwLTE1MCIgfSwJLyogMHgxNSAqLworCXsgXzdfNXgsICAyLCAiIDEzLTQwICIsICIxMDAtMzAwIiB9LAkvKiAweDE2ICovCisJeyBfNF81eCwgIDIsICIgMjItNjUgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MTcgKi8KKwl7ICBfdW5rLCAtMSwgIiAgPy0/ICAiLCAiICA/LT8gICIgfSwJLyogMHgxOCAqLworCXsgXzVfNXgsICAyLCAiIDE4LTU1ICIsICIxMDAtMzAwIiB9LAkvKiAweDE5ICovCisJeyAgIF80eCwgIDIsICIgMjUtNzUgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MUEgKi8KKwl7ICAgXzV4LCAgMiwgIiAyMC02MCAiLCAiMTAwLTMwMCIgfSwJLyogMHgxQiAqLworCXsgICBfOHgsICAyLCAiIDEyLTM4ICIsICIxMDAtMzAwIiB9LAkvKiAweDFDICovCisJeyAgIF82eCwgIDIsICIgMTYtNTAgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MUQgKi8KKwl7IF8zXzV4LCAgMiwgIiAzMC04NSAiLCAiMTAwLTMwMCIgfSwJLyogMHgxRSAqLworCXsgIF9vZmYsIC0xLCAiICA/LT8gICIsICIgID8tPyAgIiB9LAkvKiAweDFGICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKgorICovCisKK2ludCBnZXRfY2xvY2tzICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXVsb25nIGNsa2luOworCXVsb25nIHNjY3IsIGRmYnJnOworCXVsb25nIHNjbXIsIGNvcmVjbmYsIGJ1c2RmLCBjcG1kZiwgcGxsZGYsIHBsbG1mOworCWNvcmVjbmZfdCAqY3A7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfODI2MF9DTEtJTikKKyNlcnJvciBjbG9jayBtZWFzdXJpbmcgbm90IGltcGxlbWVudGVkIHlldCAtIGRlZmluZSBDT05GSUdfODI2MF9DTEtJTgorI2Vsc2UKKyNpZiBkZWZpbmVkKENPTkZJR19CT0FSRF9HRVRfQ1BVX0NMS19GKQorCWNsa2luID0gYm9hcmRfZ2V0X2NwdV9jbGtfZiAoKTsKKyNlbHNlCisJY2xraW4gPSBDT05GSUdfODI2MF9DTEtJTjsKKyNlbmRpZgorI2VuZGlmCisKKwlzY2NyID0gaW1tYXAtPmltX2Nsa3JzdC5jYXJfc2NjcjsKKwlkZmJyZyA9IChzY2NyICYgU0NDUl9ERkJSR19NU0spID4+IFNDQ1JfREZCUkdfU0hJRlQ7CisKKwlzY21yID0gaW1tYXAtPmltX2Nsa3JzdC5jYXJfc2NtcjsKKwljb3JlY25mID0gKHNjbXIgJiBTQ01SX0NPUkVDTkZfTVNLKSA+PiBTQ01SX0NPUkVDTkZfU0hJRlQ7CisJY3AgPSAmY29yZWNuZl90YWJbY29yZWNuZl07CisKKwlidXNkZiA9IChzY21yICYgU0NNUl9CVVNERl9NU0spID4+IFNDTVJfQlVTREZfU0hJRlQ7CisJY3BtZGYgPSAoc2NtciAmIFNDTVJfQ1BNREZfTVNLKSA+PiBTQ01SX0NQTURGX1NISUZUOworCisJLyogSGlQNywgSGlQNyBSZXYwMSwgSGlQNyBSZXZBICovCisJaWYgKChnZXRfcHZyICgpID09IFBWUl84MjYwX0hJUDcpIHx8CisJICAgIChnZXRfcHZyICgpID09IFBWUl84MjYwX0hJUDdSMSkgfHwKKwkgICAgKGdldF9wdnIgKCkgPT0gUFZSXzgyNjBfSElQN1JBKSkgeworCQlwbGxtZiA9IChzY21yICYgU0NNUl9QTExNRl9NU0tINykgPj4gU0NNUl9QTExNRl9TSElGVDsKKwkJZ2QtPnZjb19vdXQgPSBjbGtpbiAqIChwbGxtZiArIDEpOworCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlQMywgSGlQNCAqLworCQlwbGxtZiA9IChzY21yICYgU0NNUl9QTExNRl9NU0spID4+IFNDTVJfUExMTUZfU0hJRlQ7CisJCXBsbGRmID0gKHNjbXIgJiBTQ01SX1BMTERGKSA/IDEgOiAwOworCQlnZC0+dmNvX291dCA9IChjbGtpbiAqIDIgKiAocGxsbWYgKyAxKSkgLyAocGxsZGYgKyAxKTsKKwl9CisjaWYgMAorCWlmIChnZC0+dmNvX291dCAvIChidXNkZiArIDEpICE9IGNsa2luKSB7CisJCS8qIGFhYXJycmdnZ2hoaCEhISAqLworCQlyZXR1cm4gKDEpOworCX0KKyNlbmRpZgorCisJZ2QtPmNwbV9jbGsgPSBnZC0+dmNvX291dCAvIDI7CisJZ2QtPmJ1c19jbGsgPSBjbGtpbjsKKwlnZC0+c2NjX2NsayA9IGdkLT52Y29fb3V0IC8gNDsKKwlnZC0+YnJnX2NsayA9IGdkLT52Y29fb3V0IC8gKDEgPDwgKDIgKiAoZGZicmcgKyAxKSkpOworCisJaWYgKGNwLT5iMmNfbXVsdCA+IDApIHsKKwkJZ2QtPmNwdV9jbGsgPSAoY2xraW4gKiBjcC0+YjJjX211bHQpIC8gMjsKKwl9IGVsc2UgeworCQlnZC0+Y3B1X2NsayA9IGNsa2luOworCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwlnZC0+cGNpX2NsayA9IGNsa2luOworCisJaWYgKHNjY3IgJiBTQ0NSX1BDSV9NT0RFKSB7CisJCXVpbnQgcGNpX2RpdjsKKwkJdWludCBwY2lkZiA9IChzY2NyICYgU0NDUl9QQ0lERl9NU0spID4+IFNDQ1JfUENJREZfU0hJRlQ7CisKKwkJaWYgKHNjY3IgJiBTQ0NSX1BDSV9NT0RDSykgeworCQkJcGNpX2RpdiA9IDI7CisJCQlpZiAocGNpZGYgPT0gOSkgeworCQkJCXBjaV9kaXYgKj0gNTsKKwkJCX0gZWxzZSBpZiAocGNpZGYgPT0gMHhCKSB7CisJCQkJcGNpX2RpdiAqPSA2OworCQkJfSBlbHNlIHsKKwkJCQlwY2lfZGl2ICo9IChwY2lkZiArIDEpOworCQkJfQorCQl9IGVsc2UgeworCQkJcGNpX2RpdiA9IHBjaWRmICsgMTsKKwkJfQorCisJCWdkLT5wY2lfY2xrID0gKGdkLT5jcG1fY2xrICogMikgLyBwY2lfZGl2OworCX0KKyNlbmRpZgorCisJcmV0dXJuICgwKTsKK30KKworaW50IHBydF84MjYwX2Nsa3MgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdWxvbmcgc2NjciwgZGZicmc7CisJdWxvbmcgc2NtciwgY29yZWNuZiwgYnVzZGYsIGNwbWRmLCBwbGxkZiwgcGxsbWYsIHBjaWRmOworCWNvcmVjbmZfdCAqY3A7CisKKwlzY2NyID0gaW1tYXAtPmltX2Nsa3JzdC5jYXJfc2NjcjsKKwlkZmJyZyA9IChzY2NyICYgU0NDUl9ERkJSR19NU0spID4+IFNDQ1JfREZCUkdfU0hJRlQ7CisKKwlzY21yID0gaW1tYXAtPmltX2Nsa3JzdC5jYXJfc2NtcjsKKwljb3JlY25mID0gKHNjbXIgJiBTQ01SX0NPUkVDTkZfTVNLKSA+PiBTQ01SX0NPUkVDTkZfU0hJRlQ7CisJYnVzZGYgPSAoc2NtciAmIFNDTVJfQlVTREZfTVNLKSA+PiBTQ01SX0JVU0RGX1NISUZUOworCWNwbWRmID0gKHNjbXIgJiBTQ01SX0NQTURGX01TSykgPj4gU0NNUl9DUE1ERl9TSElGVDsKKwlwbGxkZiA9IChzY21yICYgU0NNUl9QTExERikgPyAxIDogMDsKKwlwbGxtZiA9IChzY21yICYgU0NNUl9QTExNRl9NU0spID4+IFNDTVJfUExMTUZfU0hJRlQ7CisJcGNpZGYgPSAoc2NjciAmIFNDQ1JfUENJREZfTVNLKSA+PiBTQ0NSX1BDSURGX1NISUZUOworCisJY3AgPSAmY29yZWNuZl90YWJbY29yZWNuZl07CisKKwlwdXRzIChDUFVfSURfU1RSICIgQ2xvY2sgQ29uZmlndXJhdGlvblxuIC0gQnVzLXRvLUNvcmUgTXVsdCAiKTsKKworCXN3aXRjaCAoY3AtPmIyY19tdWx0KSB7CisJY2FzZSBfYnlwOgorCQlwdXRzICgiQllQQVNTIik7CisJCWJyZWFrOworCisJY2FzZSBfb2ZmOgorCQlwdXRzICgiT0ZGIik7CisJCWJyZWFrOworCisJY2FzZSBfdW5rOgorCQlwdXRzICgiVU5LTk9XTiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZiAoIiVkJXN4IiwKKwkJCWNwLT5iMmNfbXVsdCAvIDIsCisJCQkoY3AtPmIyY19tdWx0ICUgMikgPyAiLjUiIDogIiIpOworCQlicmVhazsKKwl9CisKKwlwcmludGYgKCIsIFZDTyBEaXYgJWQsIDYweCBCdXMgRnJlcSAlcywgQ29yZSBGcmVxICVzXG4iLAorCQkJY3AtPnZjb19kaXYsIGNwLT5mcmVxXzYweCwgY3AtPmZyZXFfY29yZSk7CisKKwlwcmludGYgKCIgLSBkZmJyZyAlbGQsIGNvcmVjbmYgMHglMDJseCwgYnVzZGYgJWxkLCBjcG1kZiAlbGQsICIKKwkJInBsbGRmICVsZCwgcGxsbWYgJWxkLCBwY2lkZiAlbGRcbiIsCisJCQlkZmJyZywgY29yZWNuZiwgYnVzZGYsIGNwbWRmLAorCQkJcGxsZGYsIHBsbG1mLCBwY2lkZik7CisKKwlwcmludGYgKCIgLSB2Y29fb3V0ICUxMGxkLCBzY2NfY2xrICUxMGxkLCBicmdfY2xrICUxMGxkXG4iLAorCQkJZ2QtPnZjb19vdXQsIGdkLT5zY2NfY2xrLCBnZC0+YnJnX2Nsayk7CisKKwlwcmludGYgKCIgLSBjcHVfY2xrICUxMGxkLCBjcG1fY2xrICUxMGxkLCBidXNfY2xrICUxMGxkXG4iLAorCQkJZ2QtPmNwdV9jbGssIGdkLT5jcG1fY2xrLCBnZC0+YnVzX2Nsayk7CisjaWZkZWYgQ09ORklHX1BDSQorCXByaW50ZiAoIiAtIHBjaV9jbGsgJTEwbGRcbiIsIGdkLT5wY2lfY2xrKTsKKyNlbmRpZgorCXB1dGMgKCdcbicpOworCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zcGVlZC5oIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NwZWVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzMmExNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zcGVlZC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGltZXIgdmFsdWUgZm9yIHRpbWVyIDIsIElDTEsgPSAxMAorICoKKyAqIFNQRUVEX0ZDT1VOVDIgPSAgR0NMSyAvICgxNiAqIChUSU1FUl9UTVJfUFMgKyAxKSkKKyAqIFNQRUVEX1RNUjNfUFMgPSAoR0NMSyAvICgxNiAqIFNQRUVEX0ZDT1VOVDMpKSAtIDEKKyAqCisgKiBTUEVFRF9GQ09VTlQyCXRpbWVyIDIgY291bnRpbmcgZnJlcXVlbmN5CisgKiBHQ0xLCQkJQ1BVIGNsb2NrCisgKiBTUEVFRF9UTVIyX1BTCXByZXNjYWxlcgorICovCisjZGVmaW5lIFNQRUVEX1RNUjJfUFMJKDI1MCAtIDEpCS8qIGRpdmlkZSBieSAyNTAJKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGltZXIgdmFsdWUgZm9yIFBJVAorICoKKyAqIFBJVF9USU1FID0gU1BFRURfUElUQyAvIFBJVFJUQ0xLCisgKiBQSVRSVENMSyA9IDgxOTIKKyAqLworI2RlZmluZSBTUEVFRF9QSVRDCSg4MiA8PCAxNikJLyogc3RhcnQgY291bnRpbmcgZnJvbSA4MgkqLworCisvKgorICogVGhlIG5ldyB2YWx1ZSBmb3IgUFRBIGlzIGNhbGN1bGF0ZWQgZnJvbQorICoKKyAqCVBUQSA9IChnY2xrICogVHJlZnJlc2gpIC8gKDIgXiAoMiAqIERGQlJHKSAqIFBUUCAqIE5DUykKKyAqCisgKiBnY2xrCQlDUFUgY2xvY2sgKG5vdCBidXMgY2xvY2sgISkKKyAqIFRyZWZyZXNoCVJlZnJlc2ggY3ljbGUgKiA0IChmb3VyIHdvcmQgYnVyc3RzIHVzZWQpCisgKiBERkJSRwlGb3Igbm9ybWFsIG1vZGUgKG5vIGNsb2NrIHJlZHVjdGlvbikgYWx3YXlzIDAKKyAqIFBUUAkJUHJlc2NhbGVyIChhbHJlYWR5IGFkanVzdGVkIGZvciBuby4gb2YgYmFua3MgYW5kIDRLIC8gOEsgcmVmcmVzaCkKKyAqIE5DUwkJTnVtYmVyIG9mIFNEUkFNIGJhbmtzIChjaGlwIHNlbGVjdHMpIG9uIHRoaXMgVVBNLgorICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc3BpLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkMmFjMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zcGkuYwpAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBOYXZpbiBCb3BwdXJpIC8gUHJhc2hhbnQgUGF0ZWwKKyAqCTxuYm9wcHVyaUB0cmluZXRjb21tdW5pY2F0aW9uLmNvbT4sCisgKgk8cG1wYXRlbEB0cmluZXRjb21tdW5pY2F0aW9uLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBHZXJkIE1lbm5jaGVuIDxHZXJkLk1lbm5jaGVuQGljbi5zaWVtZW5zLmRlPgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPHdkQGRlbnguZGU+LgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBNUEM4MjYwIENQTSBTUEkgaW50ZXJmYWNlLgorICoKKyAqIFBhcnRzIG9mIHRoaXMgY29kZSBhcmUgcHJvYmFibHkgbm90IHBvcnRhYmxlIGFuZC9vciBzcGVjaWZpYyB0bworICogdGhlIGJvYXJkIHdoaWNoIEkgdXNlZCBmb3IgdGhlIHRlc3RzLiBQbGVhc2Ugc2VuZCBmaXhlcy9jb21wbGFpbnRzCisgKiB0byB3ZEBkZW54LmRlCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1NQSSkKKworLyogV2FybmluZzoKKyAqIFlvdSBjYW5ub3QgZW5hYmxlIERFQlVHIGZvciBlYXJseSBzeXN0ZW0gaW5pdGFsaXphdGlvbiwgaS4gZS4gd2hlbgorICogdGhpcyBkcml2ZXIgaXMgdXNlZCB0byByZWFkIGVudmlyb25tZW50IHBhcmFtZXRlcnMgbGlrZSAiYmF1ZHJhdGUiCisgKiBmcm9tIEVFUFJPTSB3aGljaCBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBzZXJpYWwgcG9ydCB3aGljaCBpcworICogbmVlZGVkIHRvIHByaW50IHRoZSBkZWJ1ZyBtZXNzYWdlcy4uLgorICovCisjdW5kZWYJREVCVUcKKworI2RlZmluZSBTUElfRUVQUk9NX1dSRU4JCTB4MDYKKyNkZWZpbmUgU1BJX0VFUFJPTV9SRFNSCQkweDA1CisjZGVmaW5lIFNQSV9FRVBST01fUkVBRAkJMHgwMworI2RlZmluZSBTUElfRUVQUk9NX1dSSVRFCTB4MDIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPZmZzZXQgZm9yIGluaXRpYWwgU1BJIGJ1ZmZlcnMgaW4gRFBSQU06CisgKiBXZSBuZWVkIGEgNTIwIGJ5dGUgc2NyYXRjaCBEUFJBTSBhcmVhIHRvIHVzZSBhdCBhbiBlYXJseSBzdGFnZS4KKyAqIEl0IGlzIHVzZWQgYmV0d2VlbiB0aGUgdHdvIGluaXRpYWxpemF0aW9uIGNhbGxzIChzcGlfaW5pdF9mKCkKKyAqIGFuZCBzcGlfaW5pdF9yKCkpLgorICogVGhlIHZhbHVlIDB4MjAwMCBtYWtlcyBpdCBmYXIgZW5vdWdoIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhCisgKiBhcmVhIChhcyB3ZWxsIGFzIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIpLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZuZGVmCUNPTkZJR19TWVNfU1BJX0lOSVRfT0ZGU0VUCisjZGVmaW5lCUNPTkZJR19TWVNfU1BJX0lOSVRfT0ZGU0VUCTB4MjAwMAorI2VuZGlmCisKKyNkZWZpbmUgQ1BNX1NQSV9CQVNFIDB4MTAwCisKKyNpZmRlZglERUJVRworCisjZGVmaW5lCURQUklOVChhKQlwcmludGYgYTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIHBlZWsgaW50byB0eCBhbmQgcnggYnVmZmVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGV4X2RpZ2l0ID0gIjAxMjM0NTY3ODlBQkNERUYiOworCitzdGF0aWMgY2hhciBxdWlja2hleCAoaW50IGkpCit7CisJcmV0dXJuIGhleF9kaWdpdFtpXTsKK30KKworc3RhdGljIHZvaWQgbWVtZHVtcCAodm9pZCAqcHYsIGludCBudW0pCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqcGMgPSAodW5zaWduZWQgY2hhciAqKSBwdjsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJcHJpbnRmICgiJWMlYyAiLCBxdWlja2hleCAocGNbaV0gPj4gNCksIHF1aWNraGV4IChwY1tpXSAmIDB4MGYpKTsKKwlwcmludGYgKCJcdCIpOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJcHJpbnRmICgiJWMiLCBpc3ByaW50IChwY1tpXSkgPyBwY1tpXSA6ICcuJyk7CisJcHJpbnRmICgiXG4iKTsKK30KKyNlbHNlCS8qICFERUJVRyAqLworCisjZGVmaW5lCURQUklOVChhKQorCisjZW5kaWYJLyogREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb24gcHJvdG90eXBlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBzcGlfaW5pdCAodm9pZCk7CisKK3NzaXplX3Qgc3BpX3JlYWQgKHVjaGFyICosIGludCwgdWNoYXIgKiwgaW50KTsKK3NzaXplX3Qgc3BpX3dyaXRlICh1Y2hhciAqLCBpbnQsIHVjaGFyICosIGludCk7Citzc2l6ZV90IHNwaV94ZmVyIChzaXplX3QpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWYXJpYWJsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNQVhfQlVGRkVSCTB4MTA0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluaXRpYWxseSB3ZSBwbGFjZSB0aGUgUlggYW5kIFRYIGJ1ZmZlcnMgYXQgYSBmaXhlZCBsb2NhdGlvbiBpbiBEUFJBTSEKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB1Y2hhciAqcnhidWYgPQorICAodWNoYXIgKikmKChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SKS0+aW1fZHByYW1iYXNlCisJCQlbQ09ORklHX1NZU19TUElfSU5JVF9PRkZTRVRdOworc3RhdGljIHVjaGFyICp0eGJ1ZiA9CisgICh1Y2hhciAqKSYoKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIpLT5pbV9kcHJhbWJhc2UKKwkJCVtDT05GSUdfU1lTX1NQSV9JTklUX09GRlNFVCtNQVhfQlVGRkVSXTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgRnVuY3Rpb246ICAgIHNwaV9pbml0X2YKKyAqCisgKiAgRGVzY3JpcHRpb246IEluaXQgU1BJLUNvbnRyb2xsZXIgKFJPTSBwYXJ0KQorICoKKyAqICByZXR1cm46ICAgICAgLS0tCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQgc3BpX2luaXRfZiAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgZHBhZGRyOworCisJdm9sYXRpbGUgc3BpX3QgKnNwaTsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yOworCXZvbGF0aWxlIGNwbTgyNjBfdCAqY3A7CisJdm9sYXRpbGUgY2JkX3QgKnRiZGYsICpyYmRmOworCisJaW1tciA9IChpbW1hcF90ICopICBDT05GSUdfU1lTX0lNTVI7CisJY3AgICA9IChjcG04MjYwX3QgKikgJmltbXItPmltX2NwbTsKKworCSoodXNob3J0ICopKCZpbW1yLT5pbV9kcHJhbWJhc2VbUFJPRkZfU1BJX0JBU0VdKSA9IFBST0ZGX1NQSTsKKwlzcGkgID0gKHNwaV90ICopJmltbXItPmltX2RwcmFtYmFzZVtQUk9GRl9TUEldOworCisvKiAxICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogSW5pdGlhbGl6ZSBQb3J0IEQgU1BJIHBpbnMKKwkgKiAod2UgYXJlIG9ubHkgaW4gTWFzdGVyIE1vZGUgISkKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogR1BJTyBvciBwZXIuIEZ1bmN0aW9uCisJICogUFBBUkRbMTZdID0gMSBbMHgwMDAwODAwMF0gKFNQSU1JU08pCisJICogUFBBUkRbMTddID0gMSBbMHgwMDAwNDAwMF0gKFNQSU1PU0kpCisJICogUFBBUkRbMThdID0gMSBbMHgwMDAwMjAwMF0gKFNQSUNMSykKKwkgKiBQUEFSRFsxMl0gPSAwIFsweDAwMDgwMDAwXSAtPiBHUElPOiAoQ1MgZm9yIEFUQyBFRVBST00pCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BwYXJkIHw9ICAweDAwMDBFMDAwOwkvKiBzZXQgIGJpdHMJKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BwYXJkICY9IH4weDAwMDgwMDAwOwkvKiByZXNldCBiaXQJKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBJbi9PdXQgb3IgcGVyLiBGdW5jdGlvbiAwLzEKKwkgKiBQRElSRFsxNl0gPSAwIFsweDAwMDA4MDAwXSAtPiBQRVJJMTogU1BJTUlTTworCSAqIFBESVJEWzE3XSA9IDAgWzB4MDAwMDQwMDBdIC0+IFBFUkkxOiBTUElNT1NJCisJICogUERJUkRbMThdID0gMCBbMHgwMDAwMjAwMF0gLT4gUEVSSTE6IFNQSUNMSworCSAqIFBESVJEWzEyXSA9IDEgWzB4MDAwODAwMDBdIC0+IEdQSU8gT1VUOiBDUyBmb3IgQVRDIEVFUFJPTQorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkaXJkICY9IH4weDAwMDBFMDAwOworCWltbXItPmltX2lvcG9ydC5pb3BfcGRpcmQgfD0gMHgwMDA4MDAwMDsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBzcGVjaWFsIG9wdGlvbiByZWcuCisJICogUFNPUkRbMTZdID0gMSBbMHgwMDAwODAwMF0gLT4gU1BJTUlTTworCSAqIFBTT1JEWzE3XSA9IDEgWzB4MDAwMDQwMDBdIC0+IFNQSU1PU0kKKwkgKiBQU09SRFsxOF0gPSAxIFsweDAwMDAyMDAwXSAtPiBTUElDTEsKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wc29yZCB8PSAweDAwMDBFMDAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyIHJhbS4KKwkgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSBtYW55IHRoaW5ncyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybworCSAqLworCXNwaS0+c3BpX3JzdGF0ZQk9IDA7CisJc3BpLT5zcGlfcmRwCT0gMDsKKwlzcGktPnNwaV9yYnB0cgk9IDA7CisJc3BpLT5zcGlfcmJjCT0gMDsKKwlzcGktPnNwaV9yeHRtcAk9IDA7CisJc3BpLT5zcGlfdHN0YXRlCT0gMDsKKwlzcGktPnNwaV90ZHAJPSAwOworCXNwaS0+c3BpX3RicHRyCT0gMDsKKwlzcGktPnNwaV90YmMJPSAwOworCXNwaS0+c3BpX3R4dG1wCT0gMDsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBvbmUgdHJhbnNtaXQgYW5kIG9uZSByZWNlaXZlIGJ1ZmZlcgorCSAqIGRlc2NyaXB0b3IgaW4gdGhlIERQIHJhbQorCSAqLworI2lmZGVmIENPTkZJR19TWVNfQUxMT0NfRFBSQU0KKwlkcGFkZHIgPSBtODI2MF9jcG1fZHBhbGxvYyAoc2l6ZW9mKGNiZF90KSoyLCA4KTsKKyNlbHNlCisJZHBhZGRyID0gQ1BNX1NQSV9CQVNFOworI2VuZGlmCisKKy8qIDMgKi8KKwkvKiBTZXQgdXAgdGhlIFNQSSBwYXJhbWV0ZXJzIGluIHRoZSBwYXJhbWV0ZXIgcmFtICovCisJc3BpLT5zcGlfcmJhc2UgPSBkcGFkZHI7CisJc3BpLT5zcGlfdGJhc2UgPSBkcGFkZHIgKyBzaXplb2YgKGNiZF90KTsKKworCS8qKioqKioqKioqKklNUE9SVEFOVCoqKioqKioqKioqKioqKioqKi8KKworCS8qCisJICogU2V0dGluZyB0cmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvciBwb2ludGVycworCSAqIGluaXRpYWxseSB0byByYmFzZSBhbmQgdGJhc2UuIE9ubHkgdGhlIG1pY3JvY29kZSBwYXRjaGVzCisJICogZG9jdW1lbnRhdGlvbiB0YWxrcyBhYm91dCBpbml0aWFsaXppbmcgdGhpcyBwb2ludGVyLiBUaGlzCisJICogaXMgbWlzc2luZyBmcm9tIHRoZSBzYW1wbGUgSTJDIGRyaXZlci4gSWYgeW91IGRvbnQKKwkgKiBpbml0aWFsaXplIHRoZXNlIHBvaW50ZXJzLCB0aGUga2VybmVsIGhhbmdzLgorCSAqLworCXNwaS0+c3BpX3JicHRyID0gc3BpLT5zcGlfcmJhc2U7CisJc3BpLT5zcGlfdGJwdHIgPSBzcGktPnNwaV90YmFzZTsKKworLyogNCAqLworCS8qIEluaXQgU1BJIFR4ICsgUnggUGFyYW1ldGVycyAqLworCXdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpCisJCTsKKwljcC0+Y3BfY3BjciA9IG1rX2NyX2NtZChDUE1fQ1JfU1BJX1BBR0UsIENQTV9DUl9TUElfU0JMT0NLLAorCQkJCQkJCTAsIENQTV9DUl9JTklUX1RSWCkgfCBDUE1fQ1JfRkxHOworCXdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpCisJCTsKKworLyogNiAqLworCS8qIFNldCB0byBiaWcgZW5kaWFuLiAqLworCXNwaS0+c3BpX3RmY3IgPSBDUE1GQ1JfRUI7CisJc3BpLT5zcGlfcmZjciA9IENQTUZDUl9FQjsKKworLyogNyAqLworCS8qIFNldCBtYXhpbXVtIHJlY2VpdmUgc2l6ZS4gKi8KKwlzcGktPnNwaV9tcmJsciA9IE1BWF9CVUZGRVI7CisKKy8qIDggKyA5ICovCisJLyogdHggYW5kIHJ4IGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworCXRiZGYgPSAoY2JkX3QgKikgJiBpbW1yLT5pbV9kcHJhbWJhc2Vbc3BpLT5zcGlfdGJhc2VdOworCXJiZGYgPSAoY2JkX3QgKikgJiBpbW1yLT5pbV9kcHJhbWJhc2Vbc3BpLT5zcGlfcmJhc2VdOworCisJdGJkZi0+Y2JkX3NjICY9IH5CRF9TQ19SRUFEWTsKKwlyYmRmLT5jYmRfc2MgJj0gfkJEX1NDX0VNUFRZOworCisJLyogU2V0IHRoZSBiZCdzIHJ4IGFuZCB0eCBidWZmZXIgYWRkcmVzcyBwb2ludGVycyAqLworCXJiZGYtPmNiZF9idWZhZGRyID0gKHVsb25nKSByeGJ1ZjsKKwl0YmRmLT5jYmRfYnVmYWRkciA9ICh1bG9uZykgdHhidWY7CisKKy8qIDEwICsgMTEgKi8KKwlpbW1yLT5pbV9zcGkuc3BpX3NwaWUgPSBTUElfRU1BU0s7CQkvKiBDbGVhciBhbGwgU1BJIGV2ZW50cwkqLworCWltbXItPmltX3NwaS5zcGlfc3BpbSA9IDB4MDA7CQkJLyogTWFzayAgYWxsIFNQSSBldmVudHMgKi8KKworCisJcmV0dXJuOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGdW5jdGlvbjogICAgc3BpX2luaXRfcgorICoKKyAqICBEZXNjcmlwdGlvbjogSW5pdCBTUEktQ29udHJvbGxlciAoUkFNIHBhcnQpIC0KKyAqCQkgVGhlIG1hbGxvYyBlbmdpbmUgaXMgcmVhZHkgYW5kIHdlIGNhbiBtb3ZlIG91ciBidWZmZXJzIHRvCisgKgkJIG5vcm1hbCBSQU0KKyAqCisgKiAgcmV0dXJuOiAgICAgIC0tLQorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCit2b2lkIHNwaV9pbml0X3IgKHZvaWQpCit7CisJdm9sYXRpbGUgc3BpX3QgKnNwaTsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yOworCXZvbGF0aWxlIGNwbTgyNjBfdCAqY3A7CisJdm9sYXRpbGUgY2JkX3QgKnRiZGYsICpyYmRmOworCisJaW1tciA9IChpbW1hcF90ICopICBDT05GSUdfU1lTX0lNTVI7CisJY3AgICA9IChjcG04MjYwX3QgKikgJmltbXItPmltX2NwbTsKKworCXNwaSAgPSAoc3BpX3QgKikmaW1tci0+aW1fZHByYW1iYXNlW1BST0ZGX1NQSV07CisKKwkvKiB0eCBhbmQgcnggYnVmZmVyIGRlc2NyaXB0b3JzICovCisJdGJkZiA9IChjYmRfdCAqKSAmIGltbXItPmltX2RwcmFtYmFzZVtzcGktPnNwaV90YmFzZV07CisJcmJkZiA9IChjYmRfdCAqKSAmIGltbXItPmltX2RwcmFtYmFzZVtzcGktPnNwaV9yYmFzZV07CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIFJYIGFuZCBUWCBidWZmZXJzICovCisJcnhidWYgPSAodWNoYXIgKikgbWFsbG9jIChNQVhfQlVGRkVSKTsKKwl0eGJ1ZiA9ICh1Y2hhciAqKSBtYWxsb2MgKE1BWF9CVUZGRVIpOworCisJcmJkZi0+Y2JkX2J1ZmFkZHIgPSAodWxvbmcpIHJ4YnVmOworCXRiZGYtPmNiZF9idWZhZGRyID0gKHVsb25nKSB0eGJ1ZjsKKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBGdW5jdGlvbjogICAgc3BpX3dyaXRlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3NpemVfdCBzcGlfd3JpdGUgKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCW1lbXNldChyeGJ1ZiwgMCwgTUFYX0JVRkZFUik7CisJbWVtc2V0KHR4YnVmLCAwLCBNQVhfQlVGRkVSKTsKKwkqdHhidWYgPSBTUElfRUVQUk9NX1dSRU47CQkvKiB3cml0ZSBlbmFibGUJCSovCisJc3BpX3hmZXIoMSk7CisJbWVtY3B5KHR4YnVmLCBhZGRyLCBhbGVuKTsKKwkqdHhidWYgPSBTUElfRUVQUk9NX1dSSVRFOwkJLyogV1JJVEUgbWVtb3J5IGFycmF5CSovCisJbWVtY3B5KGFsZW4gKyB0eGJ1ZiwgYnVmZmVyLCBsZW4pOworCXNwaV94ZmVyKGFsZW4gKyBsZW4pOworCQkJCQkJLyogaWdub3JlIHJlY2VpdmVkIGRhdGEJKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisJCSp0eGJ1ZiA9IFNQSV9FRVBST01fUkRTUjsJLyogcmVhZCBzdGF0dXMJCSovCisJCXR4YnVmWzFdID0gMDsKKwkJc3BpX3hmZXIoMik7CisJCWlmICghKHJ4YnVmWzFdICYgMSkpIHsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDAwKTsKKwl9CisJaWYgKGkgPj0gMTAwMCkgeworCQlwcmludGYgKCIqKiogc3BpX3dyaXRlOiBUaW1lIG91dCB3aGlsZSB3cml0aW5nIVxuIik7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBGdW5jdGlvbjogICAgc3BpX3JlYWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzc2l6ZV90IHNwaV9yZWFkICh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJbWVtc2V0KHJ4YnVmLCAwLCBNQVhfQlVGRkVSKTsKKwltZW1zZXQodHhidWYsIDAsIE1BWF9CVUZGRVIpOworCW1lbWNweSh0eGJ1ZiwgYWRkciwgYWxlbik7CisJKnR4YnVmID0gU1BJX0VFUFJPTV9SRUFEOwkJLyogUkVBRCBtZW1vcnkgYXJyYXkJKi8KKworCS8qCisJICogVGhlcmUgaXMgYSBidWcgaW4gODYwVCAoPykgdGhhdCBjdXRzIHRoZSBsYXN0IGJ5dGUgb2YgaW5wdXQKKwkgKiBpZiB3ZSdyZSByZWFkaW5nIGludG8gRFBSQU0uIFRoZSBzb2x1dGlvbiB3ZSBjaG9vc2UgaGVyZSBpcworCSAqIHRvIGFsd2F5cyByZWFkIGxlbisxIGJ5dGVzICh3ZSBoYXZlIG9uZSBleHRyYSBieXRlIGF0IHRoZQorCSAqIGVuZCBvZiB0aGUgYnVmZmVyKS4KKwkgKi8KKwlzcGlfeGZlcihhbGVuICsgbGVuICsgMSk7CisJbWVtY3B5KGJ1ZmZlciwgYWxlbiArIHJ4YnVmLCBsZW4pOworCisJcmV0dXJuIGxlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBGdW5jdGlvbjogICAgc3BpX3hmZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzc2l6ZV90IHNwaV94ZmVyIChzaXplX3QgY291bnQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tcjsKKwl2b2xhdGlsZSBjcG04MjYwX3QgKmNwOworCXZvbGF0aWxlIHNwaV90ICpzcGk7CisJY2JkX3QgKnRiZGYsICpyYmRmOworCWludCB0bTsKKworCURQUklOVCAoKCIqKiogc3BpX3hmZXIgZW50ZXJlZCAqKipcbiIpKTsKKworCWltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJY3AgICA9IChjcG04MjYwX3QgKikgJmltbXItPmltX2NwbTsKKworCXNwaSAgPSAoc3BpX3QgKikmaW1tci0+aW1fZHByYW1iYXNlW1BST0ZGX1NQSV07CisKKwl0YmRmID0gKGNiZF90ICopICYgaW1tci0+aW1fZHByYW1iYXNlW3NwaS0+c3BpX3RiYXNlXTsKKwlyYmRmID0gKGNiZF90ICopICYgaW1tci0+aW1fZHByYW1iYXNlW3NwaS0+c3BpX3JiYXNlXTsKKworCS8qIEJvYXJkLXNwZWNpZmljOiBTZXQgQ1MgZm9yIGRldmljZSAoQVRDIEVFUFJPTSkgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkYXRkICY9IH4weDAwMDgwMDAwOworCisJLyogU2V0dGluZyB0eCBiZCBzdGF0dXMgYW5kIGRhdGEgbGVuZ3RoICovCisJdGJkZi0+Y2JkX3NjICA9IEJEX1NDX1JFQURZIHwgQkRfU0NfTEFTVCB8IEJEX1NDX1dSQVA7CisJdGJkZi0+Y2JkX2RhdGxlbiA9IGNvdW50OworCisJRFBSSU5UICgoIioqKiBzcGlfeGZlcjogQnl0ZXMgdG8gYmUgeGZlcnJlZDogJWQgKioqXG4iLAorCQkJCQkJCXRiZGYtPmNiZF9kYXRsZW4pKTsKKworCS8qIFNldHRpbmcgcnggYmQgc3RhdHVzIGFuZCBkYXRhIGxlbmd0aCAqLworCXJiZGYtPmNiZF9zYyA9IEJEX1NDX0VNUFRZIHwgQkRfU0NfV1JBUDsKKwlyYmRmLT5jYmRfZGF0bGVuID0gMDsJIC8qIHJ4IGxlbmd0aCBoYXMgbm8gc2lnbmlmaWNhbmNlICovCisKKwlpbW1yLT5pbV9zcGkuc3BpX3NwbW9kZSA9IFNQTU9ERV9SRVYJfAorCQkJU1BNT0RFX01TVFIJfAorCQkJU1BNT0RFX0VOCXwKKwkJCVNQTU9ERV9MRU4oOCkJfAkvKiA4IEJpdHMgcGVyIGNoYXIgKi8KKwkJCVNQTU9ERV9QTSgweDgpIDsJLyogbWVkaXVtIHNwZWVkICovCisJaW1tci0+aW1fc3BpLnNwaV9zcGllID0gU1BJX0VNQVNLOwkJLyogQ2xlYXIgYWxsIFNQSSBldmVudHMJKi8KKwlpbW1yLT5pbV9zcGkuc3BpX3NwaW0gPSAweDAwOwkJCS8qIE1hc2sgIGFsbCBTUEkgZXZlbnRzICovCisKKwkvKiBzdGFydCBzcGkgdHJhbnNmZXIgKi8KKwlEUFJJTlQgKCgiKioqIHNwaV94ZmVyOiBQZXJmb3JtaW5nIHRyYW5zZmVyIC4uLlxuIikpOworCWltbXItPmltX3NwaS5zcGlfc3Bjb20gfD0gU1BJX1NUUjsJCS8qIFN0YXJ0IHRyYW5zbWl0ICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFdhaXQgZm9yIFNQSSB0cmFuc21pdCB0byBnZXQgb3V0CisJICogb3IgdGltZSBvdXQgKDEgc2Vjb25kID0gMTAwMCBtcykKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWZvciAodG09MDsgdG08MTAwMDsgKyt0bSkgeworCQlpZiAoaW1tci0+aW1fc3BpLnNwaV9zcGllICYgU1BJX1RYQikgewkvKiBUeCBCdWZmZXIgRW1wdHkgKi8KKwkJCURQUklOVCAoKCIqKiogc3BpX3hmZXI6IFR4IGJ1ZmZlciBlbXB0eVxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCh0YmRmLT5jYmRfc2MgJiBCRF9TQ19SRUFEWSkgPT0gMCkgeworCQkJRFBSSU5UICgoIioqKiBzcGlfeGZlcjogVHggQkQgZG9uZVxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5ICgxMDAwKTsKKwl9CisJaWYgKHRtID49IDEwMDApIHsKKwkJcHJpbnRmICgiKioqIHNwaV94ZmVyOiBUaW1lIG91dCB3aGlsZSB4ZmVycmluZyB0by9mcm9tIFNQSSFcbiIpOworCX0KKwlEUFJJTlQgKCgiKioqIHNwaV94ZmVyOiAuLi4gdHJhbnNmZXIgZW5kZWRcbiIpKTsKKworI2lmZGVmCURFQlVHCisJcHJpbnRmICgiXG5zcGlfeGZlcjogdHhidWYgYWZ0ZXIgeGZlclxuIik7CisJbWVtZHVtcCAoKHZvaWQgKikgdHhidWYsIDE2KTsJLyogZHVtcCBvZiB0eGJ1ZiBiZWZvcmUgdHJhbnNtaXQgKi8KKwlwcmludGYgKCJzcGlfeGZlcjogcnhidWYgYWZ0ZXIgeGZlclxuIik7CisJbWVtZHVtcCAoKHZvaWQgKikgcnhidWYsIDE2KTsJLyogZHVtcCBvZiByeGJ1ZiBhZnRlciB0cmFuc21pdCAqLworCXByaW50ZiAoIlxuIik7CisjZW5kaWYKKworCS8qIENsZWFyIENTIGZvciBkZXZpY2UgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkYXRkIHw9IDB4MDAwODAwMDA7CisKKwlyZXR1cm4gY291bnQ7Cit9CisjZW5kaWYJLyogQ09ORklHX1NQSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3N0YXJ0LlMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDM1MDQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3N0YXJ0LlMKQEAgLTAsMCArMSwxMDIzIEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5OAlEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0PgorICogIENvcHlyaWdodCAoQykgMTk5OQlNYWdudXMgRGFtbSA8a2llcmF5cGMwMS5wLnkua2llLmVyYS5lcmljc3Nvbi5zZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsMjAwMiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiAgVS1Cb290IC0gU3RhcnR1cCBDb2RlIGZvciBNUEM4MjYwIFBvd2VyUEMgYmFzZWQgRW1iZWRkZWQgQm9hcmRzCisgKi8KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxtcGM4MjYwLmg+CisjaW5jbHVkZSA8dGltZXN0YW1wLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorCisjZGVmaW5lIENPTkZJR184MjYwIDEJCS8qIG5lZWRlZCBmb3IgTGludXgga2VybmVsIGhlYWRlciBmaWxlcyAqLworI2RlZmluZSBfTElOVVhfQ09ORklHX0ggMQkvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZQkqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZm5kZWYgIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUgIENPTkZJR19JREVOVF9TVFJJTkcgIiIKKyNlbmRpZgorCisvKiBXZSBkb24ndCB3YW50IHRoZSAgTU1VIHlldC4KKyovCisjdW5kZWYJTVNSX0tFUk5FTAorLyogRmxvYXRpbmcgUG9pbnQgZW5hYmxlLCBNYWNoaW5lIENoZWNrIGFuZCBSZWNvdmVyYWJsZSBJbnRlcnIuICovCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgTVNSX0tFUk5FTCAoTVNSX0ZQfE1TUl9SSSkKKyNlbHNlCisjZGVmaW5lIE1TUl9LRVJORUwgKE1TUl9GUHxNU1JfTUV8TVNSX1JJKQorI2VuZGlmCisKKy8qCisgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCisgKgorICogVXNlIHIxMiB0byBhY2Nlc3MgdGhlIEdPVAorICovCisJU1RBUlRfR09UCisJR09UX0VOVFJZKF9HT1QyX1RBQkxFXykKKwlHT1RfRU5UUlkoX0ZJWFVQX1RBQkxFXykKKworCUdPVF9FTlRSWShfc3RhcnQpCisJR09UX0VOVFJZKF9zdGFydF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWShfZW5kX29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKHRyYW5zZmVyX3RvX2hhbmRsZXIpCisKKwlHT1RfRU5UUlkoX19pbml0X2VuZCkKKwlHT1RfRU5UUlkoX2VuZCkKKwlHT1RfRU5UUlkoX19ic3Nfc3RhcnQpCisjaWYgZGVmaW5lZChDT05GSUdfSFlNT0QpCisJR09UX0VOVFJZKGVudmlyb25tZW50KQorI2VuZGlmCisJRU5EX0dPVAorCisvKgorICogVmVyc2lvbiBzdHJpbmcgLSBtdXN0IGJlIGluIGRhdGEgc2VnbWVudCBiZWNhdXNlIE1QQzgyNjAgdXNlcyB0aGUgZmlyc3QKKyAqIDI1NiBieXRlcyBmb3IgdGhlIEhhcmQgUmVzZXQgQ29uZmlndXJhdGlvbiBXb3JkIHRhYmxlIChzZWUgYmVsb3cpLgorICogU2ltaWxhcmx5LCBjYW4ndCBoYXZlIHRoZSBVLUJvb3QgTWFnaWMgTnVtYmVyIGFzIHRoZSBmaXJzdCB0aGluZyBpbgorICogdGhlIGltYWdlIC0gZG9uJ3Qga25vdyBob3cgdGhpcyB3aWxsIGFmZmVjdCB0aGUgaW1hZ2UgdG9vbHMsIGJ1dCBJIGd1ZXNzCisgKiBJJ2xsIGZpbmQgb3V0IHNvb24KKyAqLworCS5kYXRhCisJLmdsb2JsCXZlcnNpb25fc3RyaW5nCit2ZXJzaW9uX3N0cmluZzoKKwkuYXNjaWkgVV9CT09UX1ZFUlNJT04KKwkuYXNjaWkgIiAoIiwgVV9CT09UX0RBVEUsICIgLSAiLCBVX0JPT1RfVElNRSwgIikiCisJLmFzY2lpIENPTkZJR19JREVOVF9TVFJJTkcsICJcMCIKKworLyoKKyAqICBIYXJkIFJlc2V0IENvbmZpZ3VyYXRpb24gV29yZCAoSFJDVykgdGFibGUKKyAqCisgKiAgVGhlIEhhcmQgUmVzZXQgQ29uZmlndXJhdGlvbiBXb3JkIChIUkNXKSBzZXRzIGEgbnVtYmVyIG9mIHVzZWZ1bCB0aGluZ3MKKyAqICBzdWNoIGFzIHdoZXRoZXIgdGhlcmUgaXMgYW4gZXh0ZXJuYWwgbWVtb3J5IGNvbnRyb2xsZXIsIHdoZXRoZXIgdGhlCisgKiAgUG93ZXJQQyBjb3JlIGlzIGRpc2FibGVkIChpLmUuIG9ubHkgdGhlIGNvbW11bmljYXRpb25zIHByb2Nlc3NvciBpcworICogIGFjdGl2ZSwgYWNjZXNzZWQgYnkgYW5vdGhlciBDUFUgb24gdGhlIGJ1cyksIHdoZXRoZXIgdXNpbmcgZXh0ZXJuYWwKKyAqICBhcmJpdHJhdGlvbiwgZXh0ZXJuYWwgYnVzIG1vZGUsIGJvb3QgcG9ydCBzaXplLCBjb3JlIGluaXRpYWwgcHJlZml4LAorICogIGludGVybmFsIHNwYWNlIGJhc2UsIGJvb3QgbWVtb3J5IHNwYWNlLCBldGMuCisgKgorICogIFRoZXNlIHRoaW5ncyBkaWN0YXRlIHdoZXJlIHRoZSBwcm9jZXNzb3IgYmVnaW5zIGV4ZWN1dGlvbiwgd2hlcmUgdGhlCisgKiAgYm9vdCBST00gYXBwZWFycyBpbiBtZW1vcnksIHRoZSBtZW1vcnkgY29udHJvbGxlciBzZXR1cCB3aGVuIGFjY2VzcworICogIGJvb3QgUk9NLCBldGMuIFRoZSBIUkNXIGlzICpleHRyZW1lbHkqIGltcG9ydGFudC4KKyAqCisgKiAgVGhlIEhSQ1cgaXMgcmVhZCBmcm9tIHRoZSBidXMgZHVyaW5nIHJlc2V0LiBPbmUgQ1BVIG9uIHRoZSBidXMgd2lsbAorICogIGJlIGEgaGFyZCByZXNldCBjb25maWd1cmF0aW9uIG1hc3RlciwgYW55IG90aGVycyB3aWxsIGJlIGhhcmQgcmVzZXQKKyAqICBjb25maWd1cmF0aW9uIHNsYXZlcy4gVGhlIG1hc3RlciByZWFkcyBlaWdodCBIUkNXcyBmcm9tIGZsYXNoIGR1cmluZworICogIHJlc2V0IC0gdGhlIGZpcnN0IGl0IHVzZXMgZm9yIGl0c2VsZiwgdGhlIG90aGVyIDcgaXQgY29tbXVuaWNhdGVzIHRvCisgKiAgdXAgdG8gNyBjb25maWd1cmF0aW9uIHNsYXZlcyBieSBzb21lIGNvbXBsaWNhdGVkIG1lY2hhbmlzbSwgd2hpY2ggaXMKKyAqICBub3QgcmVhbGx5IGltcG9ydGFudCBoZXJlLgorICoKKyAqICBUaGUgY29uZmlndXJhdGlvbiBtYXN0ZXIgcGVyZm9ybXMgMzIgc3VjY2Vzc2l2ZSByZWFkcyBzdGFydGluZyBhdCBhZGRyZXNzCisgKiAgMCBhbmQgaW5jcmVtZW50aW5nIGJ5IDggZWFjaCByZWFkIChpLmUuIG9uIDY0IGJpdCBib3VuZGFyaWVzKSBidXQgb25seSA4CisgKiAgYml0cyBpcyByZWFkLCBhbmQgYWx3YXlzIGZyb20gYnl0ZSBsYW5lIERbMC03XSAoc28gdGhhdCBwb3J0IHNpemUgb2YgdGhlCisgKiAgYm9vdCBkZXZpY2UgZG9lcyBub3QgbWF0dGVyKS4gVGhlIGZpcnN0IGZvdXIgcmVhZHMgZm9ybSB0aGUgMzIgYml0IEhSQ1cKKyAqICBmb3IgdGhlIG1hc3RlciBpdHNlbGYuIFRoZSBzZWNvbmQgZm91ciByZWFkcyBmb3JtIHRoZSBIUkNXIGZvciB0aGUgZmlyc3QKKyAqICBzbGF2ZSwgYW5kIHNvIG9uLCB1cCB0byBzZXZlbiBzbGF2ZXMuIFRoZSAzMiBiaXQgSFJDVyBpcyBmb3JtZWQgYnkKKyAqICBjb25jYXRlbmF0aW5nIHRoZSBmb3VyIGJ5dGVzLCB3aXRoIHRoZSBmaXJzdCByZWFkIHBsYWNlZCBpbiBieXRlIDAgKHRoZQorICogIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSksIGFuZCBzbyBvbiB3aXRoIHRoZSBmb3VydGggcmVhZCBwbGFjZWQgaW4gYnl0ZSAzCisgKiAgKHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlKS4KKyAqLworI2RlZmluZSBfSFJDV19UQUJMRV9FTlRSWSh3KQkJXAorCS5maWxsCTgsMSwoKCh3KT4+MjQpJjB4ZmYpOwlcCisJLmZpbGwJOCwxLCgoKHcpPj4xNikmMHhmZik7CVwKKwkuZmlsbAk4LDEsKCgodyk+PiA4KSYweGZmKTsJXAorCS5maWxsCTgsMSwoKCh3KSAgICApJjB4ZmYpCisJLnRleHQKKwkuZ2xvYmwJX2hyY3dfdGFibGUKK19ocmN3X3RhYmxlOgorCV9IUkNXX1RBQkxFX0VOVFJZKENPTkZJR19TWVNfSFJDV19NQVNURVIpCisJX0hSQ1dfVEFCTEVfRU5UUlkoQ09ORklHX1NZU19IUkNXX1NMQVZFMSkKKwlfSFJDV19UQUJMRV9FTlRSWShDT05GSUdfU1lTX0hSQ1dfU0xBVkUyKQorCV9IUkNXX1RBQkxFX0VOVFJZKENPTkZJR19TWVNfSFJDV19TTEFWRTMpCisJX0hSQ1dfVEFCTEVfRU5UUlkoQ09ORklHX1NZU19IUkNXX1NMQVZFNCkKKwlfSFJDV19UQUJMRV9FTlRSWShDT05GSUdfU1lTX0hSQ1dfU0xBVkU1KQorCV9IUkNXX1RBQkxFX0VOVFJZKENPTkZJR19TWVNfSFJDV19TTEFWRTYpCisJX0hSQ1dfVEFCTEVfRU5UUlkoQ09ORklHX1NZU19IUkNXX1NMQVZFNykKKy8qCisgKiAgQWZ0ZXIgY29uZmlndXJhdGlvbiwgYSBzeXN0ZW0gcmVzZXQgZXhjZXB0aW9uIGlzIGV4ZWN1dGVkIHVzaW5nIHRoZQorICogIHZlY3RvciBhdCBvZmZzZXQgMHgxMDAgcmVsYXRpdmUgdG8gdGhlIGJhc2Ugc2V0IGJ5IE1TUltJUF0uIElmIE1TUltJUF0KKyAqICBpcyAwLCB0aGUgYmFzZSBhZGRyZXNzIGlzIDB4MDAwMDAwMDAuIElmIE1TUltJUF0gaXMgMSwgdGhlIGJhc2UgYWRkcmVzcworICogIGlzIDB4ZmZmMDAwMDAuIEluIHRoZSBjYXNlIG9mIGEgUG93ZXIgT24gUmVzZXQgb3IgSGFyZCBSZXNldCwgdGhlIHZhbHVlCisgKiAgb2YgTVNSW0lQXSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBDSVAgZmllbGQgaW4gdGhlIEhSQ1cuCisgKgorICogIE90aGVyIGJpdHMgaW4gdGhlIEhSQ1cgc2V0IHVwIHRoZSBCYXNlIEFkZHJlc3MgYW5kIFBvcnQgU2l6ZSBpbiBCUjAuCisgKiAgVGhpcyBkZXRlcm1pbmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYm9vdCBST00gKGZsYXNoIG9yIEVQUk9NKSBpbiB0aGUKKyAqICBwcm9jZXNzb3IncyBhZGRyZXNzIHNwYWNlIGF0IGJvb3QgdGltZS4gQXMgbG9uZyBhcyB0aGUgSFJDVyBpcyBzZXQgdXAKKyAqICBzbyB0aGF0IHdlIGV2ZW50dWFsbHkgZW5kIHVwIGV4ZWN1dGluZyB0aGUgY29kZSBiZWxvdyB3aGVuIHRoZSBwcm9jZXNzb3IKKyAqICBleGVjdXRlcyB0aGUgcmVzZXQgZXhjZXB0aW9uLCB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIHNob3VsZCBub3QgbWF0dGVyLgorICoKKyAqICBPbmNlIHdlIGhhdmUgZ290IGhlcmUsIHRoZSBhZGRyZXNzIG1hc2sgaW4gT1IwIGlzIGNsZWFyZWQgc28gdGhhdCB0aGUKKyAqICBib3R0b20gMzJLIG9mIHRoZSBib290IFJPTSBpcyBlZmZlY3RpdmVseSByZXBlYXRlZCBhbGwgdGhyb3VnaG91dCB0aGUKKyAqICBwcm9jZXNzb3IncyBhZGRyZXNzIHNwYWNlLCBhZnRlciB3aGljaCB3ZSBjYW4ganVtcCB0byB0aGUgYWJzb2x1dGUKKyAqICBhZGRyZXNzIGF0IHdoaWNoIHRoZSBib290IFJPTSB3YXMgbGlua2VkIGF0IGNvbXBpbGUgdGltZSwgYW5kIHByb2NlZWQKKyAqICB0byBpbml0aWFsaXNlIHRoZSBtZW1vcnkgY29udHJvbGxlciB3aXRob3V0IHdvcnJ5aW5nIGlmIHRoZSBydWcgd2lsbCBiZQorICogIHB1bGxlZCBvdXQgZnJvbSB1bmRlciB1cywgc28gdG8gc3BlYWsgKGl0IHdpbGwgYmUgZmluZSBhcyBsb25nIGFzIHdlCisgKiAgY29uZmlndXJlIEJSMCB3aXRoIHRoZSBzYW1lIGJvb3QgUk9NIGxpbmsgYWRkcmVzcykuCisgKi8KKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKworCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKwlsaQlyMjEsIEJPT1RGTEFHX0NPTEQJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gqLworCW5vcAorCWIJYm9vdF9jb2xkCisKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQgKyAweDEwCisKKwkuZ2xvYmwJX3N0YXJ0X3dhcm0KK19zdGFydF93YXJtOgorCWxpCXIyMSwgQk9PVEZMQUdfV0FSTQkvKiBTb2Z0d2FyZSByZWJvb3QJCSovCisJYglib290X3dhcm0KKworYm9vdF9jb2xkOgorI2lmIGRlZmluZWQoQ09ORklHX01QQzgyNjBBRFMpICYmIGRlZmluZWQoQ09ORklHX1NZU19ERUZBVUxUX0lNTVIpCisJbGlzCXIzLCBDT05GSUdfU1lTX0RFRkFVTFRfSU1NUkBoCisJbm9wCisJbHd6CXI0LCAwKHIzKQorCW5vcAorCXJsd2lubQlyNCwgcjQsIDAsIDgsIDUKKwlub3AKKwlvcmlzCXI0LCByNCwgMHgwMjAwCisJbm9wCisJc3R3CXI0LCAwKHIzKQorCW5vcAorI2VuZGlmIC8qIENPTkZJR19NUEM4MjYwQURTICYmIENPTkZJR19TWVNfREVGQVVMVF9JTU1SICovCitib290X3dhcm06CisJbWZtc3IJcjUJCQkvKiBzYXZlIG1zciBjb250ZW50cwkJKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0NPR0VOVCkKKwkvKiB0aGlzIGlzIHdoYXQgdGhlIGNvZ2VudCBFUFJPTSBkb2VzICovCisJbGkJcjAsIDAKKwltdG1zcglyMAorCWlzeW5jCisJYmwJY29nZW50X2luaXRfODI2MAorI2VuZGlmCS8qIENPTkZJR19DT0dFTlQgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19ERUZBVUxUX0lNTVIpCisJbGlzCXIzLCBDT05GSUdfU1lTX0lNTVJAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSU1NUkBsCisJbGlzCXI0LCBDT05GSUdfU1lTX0RFRkFVTFRfSU1NUkBoCisJc3R3CXIzLCAweDFBOChyNCkKKyNlbmRpZiAvKiBDT05GSUdfU1lTX0RFRkFVTFRfSU1NUiAqLworCisJLyogSW5pdGlhbGlzZSB0aGUgTVBDODI2MCBwcm9jZXNzb3IgY29yZQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlibAlpbml0XzgyNjBfY29yZQorCisjaWZuZGVmIENPTkZJR19TWVNfUkFNQk9PVAorCS8qIFdoZW4gYm9vdGluZyBmcm9tIFJPTSAoRmxhc2ggb3IgRVBST00pLCBjbGVhciB0aGUJCSovCisJLyogQWRkcmVzcyBNYXNrIGluIE9SMCBzbyBST00gYXBwZWFycyBldmVyeXdoZXJlCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGlzCXIzLCAoQ09ORklHX1NZU19JTU1SK0lNX1JFR0JBU0UpQGgKKwlsd3oJcjQsIElNX09SMEBsKHIzKQorCWxpCXI1LCAweDdmZmYKKwlhbmQJcjQsIHI0LCByNQorCXN0dwlyNCwgSU1fT1IwQGwocjMpCisKKwkvKiBDYWxjdWxhdGUgYWJzb2x1dGUgYWRkcmVzcyBpbiBGTEFTSCBhbmQganVtcCB0aGVyZQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpcwlyMywgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGwKKwlhZGRpCXIzLCByMywgaW5fZmxhc2ggLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCW10bHIJcjMKKwlibHIKKworaW5fZmxhc2g6CisjZW5kaWYJLyogQ09ORklHX1NZU19SQU1CT09UICovCisKKwkvKiBpbml0aWFsaXplIHNvbWUgdGhpbmdzIHRoYXQgYXJlIGhhcmQgdG8gYWNjZXNzIGZyb20gQwkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGlzCXIzLCBDT05GSUdfU1lTX0lNTVJAaAkJLyogc2V0IHVwIHN0YWNrIGluIGludGVybmFsIERQUkFNICovCisJb3JpCXIxLCByMywgQ09ORklHX1NZU19JTklUX1NQX09GRlNFVAorCWxpCXIwLCAwCQkJLyogTWFrZSByb29tIGZvciBzdGFjayBmcmFtZSBoZWFkZXIgYW5kCSovCisJc3R3dQlyMCwgLTQocjEpCQkvKiBjbGVhciBmaW5hbCBzdGFjayBmcmFtZSBzbyB0aGF0CSovCisJc3R3dQlyMCwgLTQocjEpCQkvKiBzdGFjayBiYWNrdHJhY2VzIHRlcm1pbmF0ZSBjbGVhbmx5CSovCisKKwkvKiBsZXQgdGhlIEMtY29kZSBzZXQgdXAgdGhlIHJlc3QJCQkJKi8KKwkvKgkJCQkJCQkJKi8KKwkvKiBCZSBjYXJlZnVsIHRvIGtlZXAgY29kZSByZWxvY2F0YWJsZSAhCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCUdFVF9HT1QJCQkvKiBpbml0aWFsaXplIEdPVCBhY2Nlc3MJCSovCisKKwkvKiByMzogSU1NUiAqLworCWJsCWNwdV9pbml0X2YJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlIChpbiBGbGFzaCkqLworCisjaWZkZWYgREVCVUcKKwlibAlpbml0X2RlYnVnCS8qIHNldCB1cCBkZWJ1Z2dpbmcgc3R1ZmYJCSovCisjZW5kaWYKKworCW1yCXIzLCByMjEKKwkvKiByMzogQk9PVEZMQUcgKi8KKwlibAlib2FyZF9pbml0X2YJLyogcnVuIDFzdCBwYXJ0IG9mIGJvYXJkIGluaXQgY29kZSAoaW4gRmxhc2gpKi8KKworLyoKKyAqIFZlY3RvciBUYWJsZQorICovCisKKwkuZ2xvYmwJX3N0YXJ0X29mX3ZlY3RvcnMKK19zdGFydF9vZl92ZWN0b3JzOgorCisvKiBNYWNoaW5lIGNoZWNrICovCisJU1REX0VYQ0VQVElPTigweDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCisKKy8qIERhdGEgU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDMwMCwgRGF0YVN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEluc3RydWN0aW9uIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg1MDAsIEV4dEludGVycnVwdCwgZXh0ZXJuYWxfaW50ZXJydXB0KQorCisvKiBBbGlnbm1lbnQgZXhjZXB0aW9uLiAqLworCS4gPSAweDYwMAorQWxpZ25tZW50OgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwltZnNwcglyNCxEQVIKKwlzdHcJcjQsX0RBUihyMjEpCisJbWZzcHIJcjUsRFNJU1IKKwlzdHcJcjUsX0RTSVNSKHIyMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRVhDX1hGRVJfVEVNUExBVEUoQWxpZ25tZW50LCBBbGlnbm1lbnRFeGNlcHRpb24sIE1TUl9LRVJORUwsIENPUFlfRUUpCisKKy8qIFByb2dyYW0gY2hlY2sgZXhjZXB0aW9uICovCisJLiA9IDB4NzAwCitQcm9ncmFtQ2hlY2s6CisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlFWENfWEZFUl9URU1QTEFURShQcm9ncmFtQ2hlY2ssIFByb2dyYW1DaGVja0V4Y2VwdGlvbiwKKwkJTVNSX0tFUk5FTCwgQ09QWV9FRSkKKworCVNURF9FWENFUFRJT04oMHg4MDAsIEZQVW5hdmFpbGFibGUsIFVua25vd25FeGNlcHRpb24pCisKKwkvKiBJIGd1ZXNzIHdlIGNvdWxkIGltcGxlbWVudCBkZWNyZW1lbnRlciwgYW5kIG1heSBoYXZlCisJICogdG8gc29tZWRheSBmb3IgdGltZWtlZXBpbmcuCisJICovCisJU1REX0VYQ0VQVElPTigweDkwMCwgRGVjcmVtZW50ZXIsIHRpbWVyX2ludGVycnVwdCkKKworCVNURF9FWENFUFRJT04oMHhhMDAsIFRyYXBfMGEsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGIwMCwgVHJhcF8wYiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4YzAwLCBTeXN0ZW1DYWxsLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhkMDAsIFNpbmdsZVN0ZXAsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKDB4ZTAwLCBUcmFwXzBlLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhmMDAsIFRyYXBfMGYsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKDB4MTAwMCwgSW5zdHJ1Y3Rpb25UTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxMTAwLCBEYXRhTG9hZFRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDEyMDAsIERhdGFTdG9yZVRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisjaWZkZWYgREVCVUcKKwkuID0gMHgxMzAwCisJLyoKKwkgKiBUaGlzIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiB0aGUgcHJvZ3JhbSBjb3VudGVyIG1hdGNoZXMgdGhlCisJICogSW5zdHJ1Y3Rpb24gQWRkcmVzcyBCcmVha3BvaW50IFJlZ2lzdGVyIChJQUJSKS4KKwkgKgorCSAqIEkgd2FudCB0aGUgY3B1IHRvIGhhbHQgaWYgdGhpcyBvY2N1cnMgc28gSSBjYW4gaHVudCBhcm91bmQKKwkgKiB3aXRoIHRoZSBkZWJ1Z2dlciBhbmQgbG9vayBhdCB0aGluZ3MuCisJICoKKwkgKiBXaGVuIERFQlVHIGlzIGRlZmluZWQsIGJvdGggbWFjaGluZSBjaGVjayBlbmFibGUgKGluIHRoZSBNU1IpCisJICogYW5kIGNoZWNrc3RvcCByZXNldCBlbmFibGUgKGluIHRoZSByZXNldCBtb2RlIHJlZ2lzdGVyKSBhcmUKKwkgKiB0dXJuZWQgb2ZmIGFuZCBzbyBhIGNoZWNrc3RvcCBjb25kaXRpb24gd2lsbCByZXN1bHQgaW4gdGhlIGNwdQorCSAqIGhhbHRpbmcuCisJICoKKwkgKiBJIGZvcmNlIHRoZSBjcHUgaW50byBhIGNoZWNrc3RvcCBjb25kaXRpb24gYnkgcHV0dGluZyBhbiBpbGxlZ2FsCisJICogaW5zdHJ1Y3Rpb24gaGVyZSAoYXQgbGVhc3QgdGhpcyBpcyB0aGUgdGhlb3J5KS4KKwkgKgorCSAqIHdlbGwgLSB0aGF0IGRpZG50IHdvcmssIHNvIGp1c3QgZG8gYW4gaW5maW5pdGUgbG9vcCEKKwkgKi8KKzE6CWIJMWIKKyNlbHNlCisJU1REX0VYQ0VQVElPTigweDEzMDAsIEluc3RydWN0aW9uQnJlYWtwb2ludCwgRGVidWdFeGNlcHRpb24pCisjZW5kaWYKKwlTVERfRVhDRVBUSU9OKDB4MTQwMCwgU01JLCBVbmtub3duRXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTigweDE1MDAsIFRyYXBfMTUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE2MDAsIFRyYXBfMTYsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE3MDAsIFRyYXBfMTcsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE4MDAsIFRyYXBfMTgsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE5MDAsIFRyYXBfMTksIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFhMDAsIFRyYXBfMWEsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFiMDAsIFRyYXBfMWIsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFjMDAsIFRyYXBfMWMsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFkMDAsIFRyYXBfMWQsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFlMDAsIFRyYXBfMWUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFmMDAsIFRyYXBfMWYsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDIwMDAsIFRyYXBfMjAsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDIxMDAsIFRyYXBfMjEsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDIyMDAsIFRyYXBfMjIsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDIzMDAsIFRyYXBfMjMsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDI0MDAsIFRyYXBfMjQsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDI1MDAsIFRyYXBfMjUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDI2MDAsIFRyYXBfMjYsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDI3MDAsIFRyYXBfMjcsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDI4MDAsIFRyYXBfMjgsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDI5MDAsIFRyYXBfMjksIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDJhMDAsIFRyYXBfMmEsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDJiMDAsIFRyYXBfMmIsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDJjMDAsIFRyYXBfMmMsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDJkMDAsIFRyYXBfMmQsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDJlMDAsIFRyYXBfMmUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDJmMDAsIFRyYXBfMmYsIFVua25vd25FeGNlcHRpb24pCisKKworCS5nbG9ibAlfZW5kX29mX3ZlY3RvcnMKK19lbmRfb2ZfdmVjdG9yczoKKworCS4gPSAweDMwMDAKKworLyoKKyAqIFRoaXMgY29kZSBmaW5pc2hlcyBzYXZpbmcgdGhlIHJlZ2lzdGVycyB0byB0aGUgZXhjZXB0aW9uIGZyYW1lCisgKiBhbmQganVtcHMgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBleGNlcHRpb24uCisgKiBSZWdpc3RlciByMjEgaXMgcG9pbnRlciBpbnRvIHRyYXAgZnJhbWUsIHIxIGhhcyBuZXcgc3RhY2sgcG9pbnRlci4KKyAqLworCS5nbG9ibAl0cmFuc2Zlcl90b19oYW5kbGVyCit0cmFuc2Zlcl90b19oYW5kbGVyOgorCXN0dwlyMjIsX05JUChyMjEpCisJbGlzCXIyMixNU1JfUE9XQGgKKwlhbmRjCXIyMyxyMjMscjIyCisJc3R3CXIyMyxfTVNSKHIyMSkKKwlTQVZFX0dQUig3LCByMjEpCisJU0FWRV80R1BSUyg4LCByMjEpCisJU0FWRV84R1BSUygxMiwgcjIxKQorCVNBVkVfOEdQUlMoMjQsIHIyMSkKKwltZmxyCXIyMworCWFuZGkuCXIyNCxyMjMsMHgzZjAwCQkvKiBnZXQgdmVjdG9yIG9mZnNldCAqLworCXN0dwlyMjQsVFJBUChyMjEpCisJbGkJcjIyLDAKKwlzdHcJcjIyLFJFU1VMVChyMjEpCisJbHd6CXIyNCwwKHIyMykJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBoYW5kbGVyICovCisJbHd6CXIyMyw0KHIyMykJCS8qIHdoZXJlIHRvIGdvIHdoZW4gZG9uZSAqLworCW10c3ByCVNSUjAscjI0CisJbXRzcHIJU1JSMSxyMjAKKwltdGxyCXIyMworCVNZTkMKKwlyZmkJCQkJLyoganVtcCB0byBoYW5kbGVyLCBlbmFibGUgTU1VICovCisKK2ludF9yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1JSMCxyMgorCW10c3ByCVNSUjEscjAKKwlsd3oJcjAsR1BSMChyMSkKKwlsd3oJcjIsR1BSMihyMSkKKwlsd3oJcjEsR1BSMShyMSkKKwlTWU5DCisJcmZpCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT0dFTlQpCisKKy8qCisgKiBUaGlzIGNvZGUgaW5pdGlhbGlzZXMgdGhlIE1QQzgyNjAgcHJvY2Vzc29yIGNvcmUKKyAqIChjb25mb3JtcyB0byBQb3dlclBDIDYwM2Ugc3BlYykKKyAqLworCisJLmdsb2JsCWNvZ2VudF9pbml0XzgyNjAKK2NvZ2VudF9pbml0XzgyNjA6CisKKwkvKiBUYWtlbiBmcm9tIHBhZ2UgMTQgb2YgQ01BMjgyIG1hbnVhbAkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGlzCXI0LCAoQ09ORklHX1NZU19JTU1SK0lNX1JFR0JBU0UpQGgKKwlsaXMJcjMsIENPTkZJR19TWVNfSU1NUkBoCisJc3R3CXIzLCBJTV9JTU1SQGwocjQpCisJbHd6CXIzLCBJTV9JTU1SQGwocjQpCisJc3R3CXIzLCAwKHIwKQorCWxpcwlyMywgQ09ORklHX1NZU19TWVBDUkBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19TWVBDUkBsCisJc3R3CXIzLCBJTV9TWVBDUkBsKHI0KQorCWx3eglyMywgSU1fU1lQQ1JAbChyNCkKKwlzdHcJcjMsIDQocjApCisJbGlzCXIzLCBDT05GSUdfU1lTX1NDQ1JAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfU0NDUkBsCisJc3R3CXIzLCBJTV9TQ0NSQGwocjQpCisJbHd6CXIzLCBJTV9TQ0NSQGwocjQpCisJc3R3CXIzLCA4KHIwKQorCisJLyogdGhlIHJlc3Qgb2YgdGhpcyB3YXMgZGlzYXNzZW1ibGVkIGZyb20gdGhlCQkJKi8KKwkvKiBFUFJPTSBjb2RlIHRoYXQgY2FtZSB3aXRoIG15IENNQTI4MiBDUFUgbW9kdWxlCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGlzCXIxLCAweDEyMzQKKwlvcmkJcjEsIHIxLCAweDU2NzgKKwlzdHcJcjEsIDB4MjAocjApCisJbHd6CXIxLCAweDIwKHIwKQorCXN0dwlyMSwgMHgyNChyMCkKKwlsd3oJcjEsIDB4MjQocjApCisJbGlzCXIzLCAweDBlODAKKwlvcmkJcjMsIHIzLCAwCisJc3R3CXIxLCA0KHIzKQorCWx3eglyMSwgNChyMykKKworCS8qIERvbmUhCQkJCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlibHIKKworI2VuZGlmCS8qIENPTkZJR19DT0dFTlQgKi8KKworLyoKKyAqIFRoaXMgY29kZSBpbml0aWFsaXNlcyB0aGUgTVBDODI2MCBwcm9jZXNzb3IgY29yZQorICogKGNvbmZvcm1zIHRvIFBvd2VyUEMgNjAzZSBzcGVjKQorICogTm90ZTogZXhwZWN0cyBvcmlnaW5hbCBNU1IgY29udGVudHMgdG8gYmUgaW4gcjUuCisgKi8KKworCS5nbG9ibAlpbml0XzgyNjBfY29yZQoraW5pdF84MjYwX2NvcmU6CisKKwkvKiBJbml0aWFsaXplIG1hY2hpbmUgc3RhdHVzOyBlbmFibGUgbWFjaGluZSBjaGVjayBpbnRlcnJ1cHQJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpCXIzLCBNU1JfS0VSTkVMCQkvKiBTZXQgTUUgYW5kIFJJIGZsYWdzICovCisJcmx3aW1pCXIzLCByNSwgMCwgMjUsIDI1CS8qIHByZXNlcnZlIElQIGJpdCBzZXQgYnkgSFJDVyAqLworI2lmZGVmIERFQlVHCisJcmx3aW1pCXIzLCByNSwgMCwgMjEsIDIyCS8qIGRlYnVnZ2VyIG1pZ2h0IHNldCBTRSAmIEJFIGJpdHMgKi8KKyNlbmRpZgorCVNZTkMJCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjMKKwlTWU5DCisJbXRzcHIJU1JSMSwgcjMJCS8qIE1ha2UgU1JSMSBtYXRjaCBNU1IgKi8KKworCS8qIEluaXRpYWxpc2UgdGhlIFNZUENSIGVhcmx5LCBhbmQgcmVzZXQgdGhlIHdhdGNoZG9nIChpZiByZXEpCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaXMJcjMsIChDT05GSUdfU1lTX0lNTVIrSU1fUkVHQkFTRSlAaAorI2lmICFkZWZpbmVkKENPTkZJR19DT0dFTlQpCisJbGlzCXI0LCBDT05GSUdfU1lTX1NZUENSQGgKKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX1NZUENSQGwKKwlzdHcJcjQsIElNX1NZUENSQGwocjMpCisjZW5kaWYgLyogIUNPTkZJR19DT0dFTlQgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwlsaQlyNCwgMjE4NjgJCS8qID0gMHg1NTZjICovCisJc3RoCXI0LCBJTV9TV1NSQGwocjMpCisJbGkJcjQsIC0yMTk1OQkJLyogPSAweGFhMzkgKi8KKwlzdGgJcjQsIElNX1NXU1JAbChyMykKKyNlbmRpZiAvKiBDT05GSUdfV0FUQ0hET0cgKi8KKworCS8qIEluaXRpYWxpemUgdGhlIEhhcmR3YXJlIEltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBSZWdpc3RlcnMJKi8KKwkvKiBISUQwIGFsc28gY29udGFpbnMgY2FjaGUgY29udHJvbAkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGlzCXIzLCBDT05GSUdfU1lTX0hJRDBfSU5JVEBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19ISUQwX0lOSVRAbAorCVNZTkMKKwltdHNwcglISUQwLCByMworCisJbGlzCXIzLCBDT05GSUdfU1lTX0hJRDBfRklOQUxAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSElEMF9GSU5BTEBsCisJU1lOQworCW10c3ByCUhJRDAsIHIzCisKKwlsaXMJcjMsIENPTkZJR19TWVNfSElEMkBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19ISUQyQGwKKwltdHNwcglISUQyLCByMworCisJLyogY2xlYXIgYWxsIEJBVCdzCQkJCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpCXIwLCAwCisJbXRzcHIJREJBVDBVLCByMAorCW10c3ByCURCQVQwTCwgcjAKKwltdHNwcglEQkFUMVUsIHIwCisJbXRzcHIJREJBVDFMLCByMAorCW10c3ByCURCQVQyVSwgcjAKKwltdHNwcglEQkFUMkwsIHIwCisJbXRzcHIJREJBVDNVLCByMAorCW10c3ByCURCQVQzTCwgcjAKKwltdHNwcglJQkFUMFUsIHIwCisJbXRzcHIJSUJBVDBMLCByMAorCW10c3ByCUlCQVQxVSwgcjAKKwltdHNwcglJQkFUMUwsIHIwCisJbXRzcHIJSUJBVDJVLCByMAorCW10c3ByCUlCQVQyTCwgcjAKKwltdHNwcglJQkFUM1UsIHIwCisJbXRzcHIJSUJBVDNMLCByMAorCVNZTkMKKworCS8qIGludmFsaWRhdGUgYWxsIHRsYidzCQkJCQkJKi8KKwkvKgkJCQkJCQkJKi8KKwkvKiBGcm9tIHRoZSA2MDNlIFVzZXIgTWFudWFsOiAiVGhlIDYwM2UgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8JKi8KKwkvKiBpbnZhbGlkYXRlIGEgVExCIGVudHJ5LiBUaGUgVExCIEludmFsaWRhdGUgRW50cnkgKHRsYmllKQkqLworCS8qIGluc3RydWN0aW9uIGludmFsaWRhdGVzIHRoZSBUTEIgZW50cnkgaW5kZXhlZCBieSB0aGUgRUEsIGFuZAkqLworCS8qIG9wZXJhdGVzIG9uIGJvdGggdGhlIGluc3RydWN0aW9uIGFuZCBkYXRhIFRMQnMgc2ltdWx0YW5lb3VzbHkqLworCS8qIGludmFsaWRhdGluZyBmb3VyIFRMQiBlbnRyaWVzIChib3RoIHNldHMgaW4gZWFjaCBUTEIpLiBUaGUJKi8KKwkvKiBpbmRleCBjb3JyZXNwb25kcyB0byBiaXRzIDE1LTE5IG9mIHRoZSBFQS4gVG8gaW52YWxpZGF0ZSBhbGwJKi8KKwkvKiBlbnRyaWVzIHdpdGhpbiBib3RoIFRMQnMsIDMyIHRsYmllIGluc3RydWN0aW9ucyBzaG91bGQgYmUJKi8KKwkvKiBpc3N1ZWQsIGluY3JlbWVudGluZyB0aGlzIGZpZWxkIGJ5IG9uZSBlYWNoIHRpbWUuIgkJKi8KKwkvKgkJCQkJCQkJKi8KKwkvKiAiTm90ZSB0aGF0IHRoZSB0bGJpYSBpbnN0cnVjdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgb24gdGhlCSovCisJLyogNjAzZS4iCQkJCQkJCSovCisJLyoJCQkJCQkJCSovCisJLyogYml0cyAxNS0xOSBjb3JyZXNwb25kIHRvIGFkZHJlc3NlcyAweDAwMDAwMDAwIHRvIDB4MDAwMUYwMDAJKi8KKwkvKiBpbmNyZW1lbnRpbmcgYnkgMHgxMDAwIGVhY2ggdGltZS4gVGhlIGNvZGUgYmVsb3cgaXMgc29ydCBvZgkqLworCS8qIGJhc2VkIG9uIGNvZGUgaW4gImZsdXNoX3RsYnMiIGZyb20gYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkLlMJKi8KKwkvKgkJCQkJCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpCXIzLCAzMgorCW10Y3RyCXIzCisJbGkJcjMsIDAKKzE6CXRsYmllCXIzCisJYWRkaQlyMywgcjMsIDB4MTAwMAorCWJkbnoJMWIKKwlTWU5DCisKKwkvKiBEb25lIQkJCQkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJYmxyCisKKyNpZmRlZiBERUJVRworCisvKgorICogaW5pdGlhbGlzZSB0aGluZ3MgcmVsYXRlZCB0byBkZWJ1Z2dpbmcuCisgKgorICogbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgKEdPVCkgaXMgaW5pdGlhbGlzZWQKKyAqIChHRVRfR09UKSBhbmQgYWZ0ZXIgY3B1X2luaXRfZigpIGhhcyBleGVjdXRlZC4KKyAqLworCisJLmdsb2JsCWluaXRfZGVidWcKK2luaXRfZGVidWc6CisKKwlsaXMJcjMsIChDT05GSUdfU1lTX0lNTVIrSU1fUkVHQkFTRSlAaAorCisJLyogUXVpY2sgYW5kIGRpcnR5IGhhY2sgdG8gZW5hYmxlIHRoZSBSQU0gYW5kIGNvcHkgdGhlCQkqLworCS8qIHZlY3RvcnMgc28gdGhhdCB3ZSBjYW4gdGFrZSBleGNlcHRpb25zLgkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogd3JpdGUgTWVtb3J5IFJlZnJlc2ggUHJlc2NhbGVyICovCisJbGkJcjQsIENPTkZJR19TWVNfTVBUUFIKKwlzdGgJcjQsIElNX01QVFBSQGwocjMpCisJLyogd3JpdGUgNjB4IFJlZnJlc2ggVGltZXIgKi8KKwlsaQlyNCwgQ09ORklHX1NZU19QU1JUCisJc3RiCXI0LCBJTV9QU1JUQGwocjMpCisJLyogaW5pdCB0aGUgNjB4IFNEUkFNIE1vZGUgUmVnaXN0ZXIgKi8KKwlsaXMJcjQsIChDT05GSUdfU1lTX1BTRE1SfFBTRE1SX09QX05PUk0pQGgKKwlvcmkJcjQsIHI0LCAoQ09ORklHX1NZU19QU0RNUnxQU0RNUl9PUF9OT1JNKUBsCisJc3R3CXI0LCBJTV9QU0RNUkBsKHIzKQorCS8qIHdyaXRlIFByZWNoYXJnZSBBbGwgQmFua3MgY29tbWFuZCAqLworCWxpcwlyNCwgKENPTkZJR19TWVNfUFNETVJ8UFNETVJfT1BfUFJFQSlAaAorCW9yaQlyNCwgcjQsIChDT05GSUdfU1lTX1BTRE1SfFBTRE1SX09QX1BSRUEpQGwKKwlzdHcJcjQsIElNX1BTRE1SQGwocjMpCisJc3RiCXIwLCAwKDApCisJLyogd3JpdGUgZWlnaHQgQ0JSIFJlZnJlc2ggY29tbWFuZHMgKi8KKwlsaXMJcjQsIChDT05GSUdfU1lTX1BTRE1SfFBTRE1SX09QX0NCUlIpQGgKKwlvcmkJcjQsIHI0LCAoQ09ORklHX1NZU19QU0RNUnxQU0RNUl9PUF9DQlJSKUBsCisJc3R3CXI0LCBJTV9QU0RNUkBsKHIzKQorCXN0YglyMCwgMCgwKQorCXN0YglyMCwgMCgwKQorCXN0YglyMCwgMCgwKQorCXN0YglyMCwgMCgwKQorCXN0YglyMCwgMCgwKQorCXN0YglyMCwgMCgwKQorCXN0YglyMCwgMCgwKQorCXN0YglyMCwgMCgwKQorCS8qIHdyaXRlIE1vZGUgUmVnaXN0ZXIgV3JpdGUgY29tbWFuZCAqLworCWxpcwlyNCwgKENPTkZJR19TWVNfUFNETVJ8UFNETVJfT1BfTVJXKUBoCisJb3JpCXI0LCByNCwgKENPTkZJR19TWVNfUFNETVJ8UFNETVJfT1BfTVJXKUBsCisJc3R3CXI0LCBJTV9QU0RNUkBsKHIzKQorCXN0YglyMCwgMCgwKQorCS8qIHdyaXRlIE5vcm1hbCBPcGVyYXRpb24gY29tbWFuZCBhbmQgZW5hYmxlIFJlZnJlc2ggKi8KKwlsaXMJcjQsIChDT05GSUdfU1lTX1BTRE1SfFBTRE1SX09QX05PUk18UFNETVJfUkZFTilAaAorCW9yaQlyNCwgcjQsIChDT05GSUdfU1lTX1BTRE1SfFBTRE1SX09QX05PUk18UFNETVJfUkZFTilAbAorCXN0dwlyNCwgSU1fUFNETVJAbChyMykKKwlzdGIJcjAsIDAoMCkKKwkvKiBSQU0gc2hvdWxkIG5vdyBiZSBvcGVyYXRpb25hbCAqLworCisjZGVmaW5lIFZFQ19XUkRfQ05UCSgoX2VuZF9vZl92ZWN0b3JzIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQpIC8gNCkKKwltZmxyCXIzCisJR0VUX0dPVAorCW10bHIJcjMKKwlsd3oJcjMsIEdPVChfZW5kX29mX3ZlY3RvcnMpCisJcmx3aW5tCXI0LCByMywgMCwgMTgsIDMxCS8qIF9lbmRfb2ZfdmVjdG9ycyAmIDB4M0ZGRgkqLworCWxpcwlyNSwgVkVDX1dSRF9DTlRAaAorCW9yaQlyNSwgcjUsIFZFQ19XUkRfQ05UQGwKKwltdGN0cglyNQorMToKKwlsd3p1CXI1LCAtNChyMykKKwlzdHd1CXI1LCAtNChyNCkKKwliZG56CTFiCisKKwkvKiBMb2FkIHRoZSBJbnN0cnVjdGlvbiBBZGRyZXNzIEJyZWFrcG9pbnQgUmVnaXN0ZXIgKElBQlIpLgkqLworCS8qCQkJCQkJCQkqLworCS8qIFRoZSBhZGRyZXNzIHRvIGxvYWQgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCB3b3JkIG9mIGR1YWwgcG9ydAkqLworCS8qIHJhbSBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCB3aGlsZSB0aGUgcG93ZXIgaXMgb24sIHNvIHlvdQkqLworCS8qIGNhbiBwbHVnIGFkZHJlc3NlcyBpbnRvIHRoYXQgbG9jYXRpb24gdGhlbiByZXNldCB0aGUgY3B1IGFuZAkqLworCS8qIHRoaXMgY29kZSB3aWxsIGxvYWQgdGhhdCBhZGRyZXNzIGludG8gdGhlIElBQlIgYWZ0ZXIgdGhlCSovCisJLyogcmVzZXQuCQkJCQkJCSovCisJLyoJCQkJCQkJCSovCisJLyogV2hlbiB0aGUgcHJvZ3JhbSBjb3VudGVyIG1hdGNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBJQUJSLAkqLworCS8qIGFuIGV4Y2VwdGlvbiBpcyBnZW5lcmF0ZWQgKGJlZm9yZSB0aGUgaW5zdHJ1Y3Rpb24gYXQgdGhhdAkqLworCS8qIGxvY2F0aW9uIGNvbXBsZXRlcykuIFRoZSB2ZWN0b3IgZm9yIHRoaXMgZXhjZXB0aW9uIGlzIDB4MTMwMCAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpcwlyMywgQ09ORklHX1NZU19JTU1SQGgKKwlsd3oJcjMsIDAocjMpCisJbXRzcHIJSUFCUiwgcjMKKworCS8qIFNldCB0aGUgZW50aXJlIGR1YWwgcG9ydCBSQU0gKHdoZXJlIHRoZSBpbml0aWFsIHN0YWNrCSovCisJLyogcmVzaWRlcykgdG8gYSBrbm93biB2YWx1ZSAtIG1ha2VzIGl0IGVhc2llciB0byBzZWUgd2hlcmUJKi8KKwkvKiB0aGUgc3RhY2sgaGFzIGJlZW4gd3JpdHRlbgkJCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsaXMJcjMsIChDT05GSUdfU1lTX0lNTVIgKyBDT05GSUdfU1lTX0lOSVRfU1BfT0ZGU0VUKUBoCisJb3JpCXIzLCByMywgKENPTkZJR19TWVNfSU1NUiArIENPTkZJR19TWVNfSU5JVF9TUF9PRkZTRVQpQGwKKwlsaQlyNCwgKChDT05GSUdfU1lTX0lOSVRfU1BfT0ZGU0VUIC0gNCkgLyA0KQorCW10Y3RyCXI0CisJbGlzCXI0LCAweGRlYWRiZWFmQGgKKwlvcmkJcjQsIHI0LCAweGRlYWRiZWFmQGwKKzE6CisJc3R3dQlyNCwgLTQocjMpCisJYmRuegkxYgorCisJLyogRG9uZSEJCQkJCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWJscgorI2VuZGlmCisKKy8qIENhY2hlIGZ1bmN0aW9ucy4KKyAqCisgKiBOb3RlOiByZXF1aXJlcyB0aGF0IGFsbCBjYWNoZSBiaXRzIGluCisgKiBISUQwIGFyZSBpbiB0aGUgbG93IGhhbGYgd29yZC4KKyAqLworCS5nbG9ibAlpY2FjaGVfZW5hYmxlCitpY2FjaGVfZW5hYmxlOgorCW1mc3ByCXIzLCBISUQwCisJb3JpCXIzLCByMywgSElEMF9JQ0UKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0lMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9JQ0ZJCisJaXN5bmMKKwltdHNwcglISUQwLCByNAkvKiBzZXRzIGVuYWJsZSBhbmQgaW52YWxpZGF0ZSwgY2xlYXJzIGxvY2sgKi8KKwlpc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX2Rpc2FibGUKK2ljYWNoZV9kaXNhYmxlOgorCW1mc3ByCXIzLCBISUQwCisJbGlzCXI0LCAwCisJb3JpCXI0LCByNCwgSElEMF9JQ0V8SElEMF9JTE9DSworCWFuZGMJcjMsIHIzLCByNAorCW9yaQlyNCwgcjMsIEhJRDBfSUNGSQorCWlzeW5jCisJbXRzcHIJSElEMCwgcjQJLyogc2V0cyBpbnZhbGlkYXRlLCBjbGVhcnMgZW5hYmxlIGFuZCBsb2NrICovCisJaXN5bmMKKwltdHNwcglISUQwLCByMwkvKiBjbGVhcnMgaW52YWxpZGF0ZSAqLworCWJscgorCisJLmdsb2JsCWljYWNoZV9zdGF0dXMKK2ljYWNoZV9zdGF0dXM6CisJbWZzcHIJcjMsIEhJRDAKKwlybHdpbm0JcjMsIHIzLCBISUQwX0lDRV9CSVRQT1MgKyAxLCAzMSwgMzEKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZW5hYmxlCitkY2FjaGVfZW5hYmxlOgorCW1mc3ByCXIzLCBISUQwCisJb3JpCXIzLCByMywgSElEMF9EQ0UKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0RMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9EQ0kKKwlzeW5jCisJbXRzcHIJSElEMCwgcjQJLyogc2V0cyBlbmFibGUgYW5kIGludmFsaWRhdGUsIGNsZWFycyBsb2NrICovCisJc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX2Rpc2FibGUKK2RjYWNoZV9kaXNhYmxlOgorCW1mc3ByCXIzLCBISUQwCisJbGlzCXI0LCAwCisJb3JpCXI0LCByNCwgSElEMF9EQ0V8SElEMF9ETE9DSworCWFuZGMJcjMsIHIzLCByNAorCW9yaQlyNCwgcjMsIEhJRDBfRENJCisJc3luYworCW10c3ByCUhJRDAsIHI0CS8qIHNldHMgaW52YWxpZGF0ZSwgY2xlYXJzIGVuYWJsZSBhbmQgbG9jayAqLworCXN5bmMKKwltdHNwcglISUQwLCByMwkvKiBjbGVhcnMgaW52YWxpZGF0ZSAqLworCWJscgorCisJLmdsb2JsCWRjYWNoZV9zdGF0dXMKK2RjYWNoZV9zdGF0dXM6CisJbWZzcHIJcjMsIEhJRDAKKwlybHdpbm0JcjMsIHIzLCBISUQwX0RDRV9CSVRQT1MgKyAxLCAzMSwgMzEKKwlibHIKKworCS5nbG9ibCBnZXRfcHZyCitnZXRfcHZyOgorCW1mc3ByCXIzLCBQVlIKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogdm9pZCByZWxvY2F0ZV9jb2RlIChhZGRyX3NwLCBnZCwgYWRkcl9tb25pKQorICoKKyAqIFRoaXMgImZ1bmN0aW9uIiBkb2VzIG5vdCByZXR1cm4sIGluc3RlYWQgaXQgY29udGludWVzIGluIFJBTQorICogYWZ0ZXIgcmVsb2NhdGluZyB0aGUgbW9uaXRvciBjb2RlLgorICoKKyAqIHIzID0gZGVzdAorICogcjQgPSBzcmMKKyAqIHI1ID0gbGVuZ3RoIGluIGJ5dGVzCisgKiByNiA9IGNhY2hlbGluZXNpemUKKyAqLworCS5nbG9ibAlyZWxvY2F0ZV9jb2RlCityZWxvY2F0ZV9jb2RlOgorCW1yCXIxLCAgcjMJCS8qIFNldCBuZXcgc3RhY2sgcG9pbnRlcgkJKi8KKwltcglyOSwgIHI0CQkvKiBTYXZlIGNvcHkgb2YgR2xvYmFsIERhdGEgcG9pbnRlcgkqLworCW1yCXIxMCwgcjUJCS8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisKKwlHRVRfR09UCisJbXIJcjMsICByNQkJCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisJbGlzCXI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWx3eglyNSwgR09UKF9faW5pdF9lbmQpCisJc3ViCXI1LCByNSwgcjQKKwlsaQlyNiwgQ09ORklHX1NZU19DQUNIRUxJTkVfU0laRQkJLyogQ2FjaGUgTGluZSBTaXplCSovCisKKwkvKgorCSAqIEZpeCBHT1QgcG9pbnRlcjoKKwkgKgorCSAqIE5ldyBHT1QtUFRSID0gKG9sZCBHT1QtUFRSIC0gQ09ORklHX1NZU19NT05JVE9SX0JBU0UpICsgRGVzdGluYXRpb24gQWRkcmVzcworCSAqCisJICogT2Zmc2V0OgorCSAqLworCXN1YglyMTUsIHIxMCwgcjQKKworCS8qIEZpcnN0IG91ciBvd24gR09UICovCisJYWRkCXIxMiwgcjEyLCByMTUKKwkvKiB0aGVuIHRoZSBvbmUgdXNlZCBieSB0aGUgQyBjb2RlICovCisJYWRkCXIzMCwgcjMwLCByMTUKKworCS8qCisJICogTm93IHJlbG9jYXRlIGNvZGUKKwkgKi8KKworCWNtcGx3CWNyMSxyMyxyNAorCWFkZGkJcjAscjUsMworCXNyd2kuCXIwLHIwLDIKKwliZXEJY3IxLDRmCQkvKiBJbiBwbGFjZSBjb3B5IGlzIG5vdCBuZWNlc3NhcnkJKi8KKwliZXEJN2YJCS8qIFByb3RlY3QgYWdhaW5zdCAwIGNvdW50CQkqLworCW10Y3RyCXIwCisJYmdlCWNyMSwyZgorCisJbGEJcjgsLTQocjQpCisJbGEJcjcsLTQocjMpCisxOglsd3p1CXIwLDQocjgpCisJc3R3dQlyMCw0KHI3KQorCWJkbnoJMWIKKwliCTRmCisKKzI6CXNsd2kJcjAscjAsMgorCWFkZAlyOCxyNCxyMAorCWFkZAlyNyxyMyxyMAorMzoJbHd6dQlyMCwtNChyOCkKKwlzdHd1CXIwLC00KHI3KQorCWJkbnoJM2IKKworLyoKKyAqIE5vdyBmbHVzaCB0aGUgY2FjaGU6IG5vdGUgdGhhdCB3ZSBtdXN0IHN0YXJ0IGZyb20gYSBjYWNoZSBhbGlnbmVkCisgKiBhZGRyZXNzLiBPdGhlcndpc2Ugd2UgbWlnaHQgbWlzcyBvbmUgY2FjaGUgbGluZS4KKyAqLworNDoJY21wd2kJcjYsMAorCWFkZAlyNSxyMyxyNQorCWJlcQk3ZgkJLyogQWx3YXlzIGZsdXNoIHByZWZldGNoIHF1ZXVlIGluIGFueSBjYXNlICovCisJc3ViaQlyMCxyNiwxCisJYW5kYwlyMyxyMyxyMAorCW1mc3ByCXI3LEhJRDAJCS8qIGRvbid0IGRvIGRjYnN0IGlmIGRjYWNoZSBpcyBkaXNhYmxlZCAqLworCXJsd2lubQlyNyxyNyxISUQwX0RDRV9CSVRQT1MrMSwzMSwzMQorCWNtcHdpCXI3LDAKKwliZXEJOWYKKwltcglyNCxyMworNToJZGNic3QJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTViCisJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBkY2JzdCB0byBjb21wbGV0ZSBvbiBidXMgKi8KKzk6CW1mc3ByCXI3LEhJRDAJCS8qIGRvbid0IGRvIGljYmkgaWYgaWNhY2hlIGlzIGRpc2FibGVkICovCisJcmx3aW5tCXI3LHI3LEhJRDBfSUNFX0JJVFBPUysxLDMxLDMxCisJY21wd2kJcjcsMAorCWJlcQk3ZgorCW1yCXI0LHIzCis2OglpY2JpCTAscjQKKwlhZGQJcjQscjQscjYKKwljbXBsdwlyNCxyNQorCWJsdAk2YgorNzoJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBpY2JpIHRvIGNvbXBsZXRlIG9uIGJ1cwkqLworCWlzeW5jCisKKy8qCisgKiBXZSBhcmUgZG9uZS4gRG8gbm90IHJldHVybiwgaW5zdGVhZCBicmFuY2ggdG8gc2Vjb25kIHBhcnQgb2YgYm9hcmQKKyAqIGluaXRpYWxpemF0aW9uLCBub3cgcnVubmluZyBmcm9tIFJBTS4KKyAqLworCisJYWRkaQlyMCwgcjEwLCBpbl9yYW0gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCW10bHIJcjAKKwlibHIKKworaW5fcmFtOgorCisJLyoKKwkgKiBSZWxvY2F0aW9uIEZ1bmN0aW9uLCByMTIgcG9pbnQgdG8gZ290MisweDgwMDAKKwkgKgorCSAqIEFkanVzdCBnb3QyIHBvaW50ZXJzLCBubyBuZWVkIHRvIGNoZWNrIGZvciAwLCB0aGlzIGNvZGUKKwkgKiBhbHJlYWR5IHB1dHMgYSBmZXcgZW50cmllcyBpbiB0aGUgdGFibGUuCisJICovCisJbGkJcjAsX19nb3QyX2VudHJpZXNAc2VjdG9mZkBsCisJbGEJcjMsR09UKF9HT1QyX1RBQkxFXykKKwlsd3oJcjExLEdPVChfR09UMl9UQUJMRV8pCisJbXRjdHIJcjAKKwlzdWIJcjExLHIzLHIxMQorCWFkZGkJcjMscjMsLTQKKzE6CWx3enUJcjAsNChyMykKKwljbXB3aQlyMCwwCisJYmVxLQkyZgorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjAsMChyMykKKzI6CWJkbnoJMWIKKworCS8qCisJICogTm93IGFkanVzdCB0aGUgZml4dXBzIGFuZCB0aGUgcG9pbnRlcnMgdG8gdGhlIGZpeHVwcworCSAqIGluIGNhc2Ugd2UgbmVlZCB0byBtb3ZlIG91cnNlbHZlcyBhZ2Fpbi4KKwkgKi8KKwlsaQlyMCxfX2ZpeHVwX2VudHJpZXNAc2VjdG9mZkBsCisJbHd6CXIzLEdPVChfRklYVVBfVEFCTEVfKQorCWNtcHdpCXIwLDAKKwltdGN0cglyMAorCWFkZGkJcjMscjMsLTQKKwliZXEJNGYKKzM6CWx3enUJcjQsNChyMykKKwlsd3p1eAlyMCxyNCxyMTEKKwlhZGQJcjAscjAscjExCisJc3R3CXIxMCwwKHIzKQorCXN0dwlyMCwwKHI0KQorCWJkbnoJM2IKKzQ6CitjbGVhcl9ic3M6CisJLyoKKwkgKiBOb3cgY2xlYXIgQlNTIHNlZ21lbnQKKwkgKi8KKwlsd3oJcjMsR09UKF9fYnNzX3N0YXJ0KQorI2lmIGRlZmluZWQoQ09ORklHX0hZTU9EKQorCS8qCisJICogRm9yIEhZTU9EIC0gdGhlIGVudmlyb25tZW50IGlzIHRoZSB2ZXJ5IGxhc3QgaXRlbSBpbiBmbGFzaC4KKwkgKiBUaGUgcmVhbCAuYnNzIHN0b3BzIGp1c3QgYmVmb3JlIGVudmlyb25tZW50IHN0YXJ0cywgc28gb25seQorCSAqIGNsZWFyIHVwIHRvIHRoYXQgcG9pbnQuCisJICoKKwkgKiB0YWtlbiBmcm9tIG1vZHMgZm9yIEZBRFMgYm9hcmQKKwkgKi8KKwlsd3oJcjQsR09UKGVudmlyb25tZW50KQorI2Vsc2UKKwlsd3oJcjQsR09UKF9lbmQpCisjZW5kaWYKKworCWNtcGx3CTAsIHIzLCByNAorCWJlcQk2ZgorCisJbGkJcjAsIDAKKzU6CisJc3R3CXIwLCAwKHIzKQorCWFkZGkJcjMsIHIzLCA0CisJY21wbHcJMCwgcjMsIHI0CisJYm5lCTViCis2OgorCisJbXIJcjMsIHI5CQkvKiBHbG9iYWwgRGF0YSBwb2ludGVyCQkqLworCW1yCXI0LCByMTAJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJCSovCisJYmwJYm9hcmRfaW5pdF9yCisKKwkvKgorCSAqIENvcHkgZXhjZXB0aW9uIHZlY3RvciBjb2RlIHRvIGxvdyBtZW1vcnkKKwkgKgorCSAqIHIzOiBkZXN0X2FkZHIKKwkgKiByNzogc291cmNlIGFkZHJlc3MsIHI4OiBlbmQgYWRkcmVzcywgcjk6IHRhcmdldCBhZGRyZXNzCisJICovCisJLmdsb2JsCXRyYXBfaW5pdAordHJhcF9pbml0OgorCW1mbHIJcjQJCQkvKiBzYXZlIGxpbmsgcmVnaXN0ZXIJCSovCisJR0VUX0dPVAorCWx3eglyNywgR09UKF9zdGFydCkKKwlsd3oJcjgsIEdPVChfZW5kX29mX3ZlY3RvcnMpCisKKwlsaQlyOSwgMHgxMDAJCS8qIHJlc2V0IHZlY3RvciBhbHdheXMgYXQgMHgxMDAgKi8KKworCWNtcGx3CTAsIHI3LCByOAorCWJnZWxyCQkJCS8qIHJldHVybiBpZiByNz49cjggLSBqdXN0IGluIGNhc2UgKi8KKzE6CisJbHd6CXIwLCAwKHI3KQorCXN0dwlyMCwgMChyOSkKKwlhZGRpCXI3LCByNywgNAorCWFkZGkJcjksIHI5LCA0CisJY21wbHcJMCwgcjcsIHI4CisJYm5lCTFiCisKKwkvKgorCSAqIHJlbG9jYXRlIGBoZGxyJyBhbmQgYGludF9yZXR1cm4nIGVudHJpZXMKKwkgKi8KKwlsaQlyNywgLkxfTWFjaGluZUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzI6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yCSovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTJiCisKKwlsaQlyNywgLkxfQWxpZ25tZW50IC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfUHJvZ3JhbUNoZWNrIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfRlBVbmF2YWlsYWJsZSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIFN5c3RlbUNhbGwgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMzoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJM2IKKworCWxpCXI3LCAuTF9TaW5nbGVTdGVwIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgX2VuZF9vZl92ZWN0b3JzIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzQ6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yCSovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTRiCisKKwltZm1zcglyMwkJCS8qIG5vdyB0aGF0IHRoZSB2ZWN0b3JzIGhhdmUJKi8KKwlsaXMJcjcsIE1TUl9JUEBoCQkvKiByZWxvY2F0ZWQgaW50byBsb3cgbWVtb3J5CSovCisJb3JpCXI3LCByNywgTVNSX0lQQGwJLyogTVNSW0lQXSBjYW4gYmUgdHVybmVkIG9mZgkqLworCWFuZGMJcjMsIHIzLCByNwkJLyogKGlmIGl0IHdhcyBvbikJCSovCisJU1lOQwkJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMworCVNZTkMKKworCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIgICAgKi8KKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3RyYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExNmNkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC90cmFwcy5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogbGludXgvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgIEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqIE1vZGlmaWVkIGJ5IENvcnQgRG91Z2FuIChjb3J0QGNzLm5tdC5lZHUpCisgKiBhbmQgUGF1bCBNYWNrZXJyYXMgKHBhdWx1c0Bjcy5hbnUuZWR1LmF1KQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgaGFyZHdhcmUgZXhjZXB0aW9ucworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8a2dkYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbTgyNjBfcGNpLmg+CisKKy8qIFJldHVybnMgMCBpZiBleGNlcHRpb24gbm90IGZvdW5kIGFuZCBmaXh1cCBvdGhlcndpc2UuICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nKTsKKworLyogVEhJUyBORUVEUyBDSEFOR0lORyB0byB1c2UgdGhlIGJvYXJkIGluZm8gc3RydWN0dXJlLgorKi8KKyNkZWZpbmUgRU5EX09GX01FTQkweDAyMDAwMDAwCisKKy8qCisgKiBUcmFwICYgRXhjZXB0aW9uIHN1cHBvcnQKKyAqLworCit2b2lkCitwcmludF9iYWNrdHJhY2UodW5zaWduZWQgbG9uZyAqc3ApCit7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHV0cyAoIkNhbGwgYmFja3RyYWNlOiAiKTsKKwl3aGlsZSAoc3ApIHsKKwkJaWYgKCh1aW50KXNwID4gRU5EX09GX01FTSkKKwkJCWJyZWFrOworCisJCWkgPSBzcFsxXTsKKwkJaWYgKGNudCsrICUgNyA9PSAwKQorCQkJcHV0YyAoJ1xuJyk7CisJCXByaW50ZigiJTA4bFggIiwgaSk7CisJCWlmIChjbnQgPiAzMikgYnJlYWs7CisJCXNwID0gKHVuc2lnbmVkIGxvbmcgKikqc3A7CisJfQorCXB1dGMgKCdcbicpOworfQorCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGk7CisKKwlwcmludGYoIk5JUDogJTA4bFggWEVSOiAlMDhsWCBMUjogJTA4bFggUkVHUzogJXAgVFJBUDogJTA0bHggREFSOiAlMDhsWFxuIiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT54ZXIsIHJlZ3MtPmxpbmssIHJlZ3MsIHJlZ3MtPnRyYXAsIHJlZ3MtPmRhcik7CisJcHJpbnRmKCJNU1I6ICUwOGx4IEVFOiAlMDF4IFBSOiAlMDF4IEZQOiAlMDF4IE1FOiAlMDF4IElSL0RSOiAlMDF4JTAxeFxuIiwKKwkgICAgICAgcmVncy0+bXNyLCByZWdzLT5tc3ImTVNSX0VFID8gMSA6IDAsIHJlZ3MtPm1zciZNU1JfUFIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyICYgTVNSX0ZQID8gMSA6IDAscmVncy0+bXNyJk1TUl9NRSA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3ImTVNSX0lSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciZNU1JfRFIgPyAxIDogMCk7CisKKwlwdXRjICgnXG4nKTsKKwlmb3IgKGkgPSAwOyAgaSA8IDMyOyAgaSsrKSB7CisJCWlmICgoaSAlIDgpID09IDApIHsKKwkJCXByaW50ZigiR1BSJTAyZDogIiwgaSk7CisJCX0KKworCQlwcmludGYoIiUwOGxYICIsIHJlZ3MtPmdwcltpXSk7CisJCWlmICgoaSAlIDgpID09IDcpIHsKKwkJCXB1dGMgKCdcbicpOworCQl9CisJfQorfQorCisKK3ZvaWQKK19leGNlcHRpb24oaW50IHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiRXhjZXB0aW9uIGluIGtlcm5lbCBwYyAlbHggc2lnbmFsICVkIixyZWdzLT5uaXAsc2lnbnIpOworfQorCisjaWZkZWYgQ09ORklHX1BDSQordm9pZCBkdW1wX3BjaSAodm9pZCkKK3sKKworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCisJcHJpbnRmICgiUENJOiBlcnIgc3RhdHVzICV4IGVyciBtYXNrICV4IGVyciBjdHJsICV4XG4iLAorCQlsZTMyX3RvX2NwdSAoaW1tYXAtPmltX3BjaS5wY2lfZXNyKSwKKwkJbGUzMl90b19jcHUgKGltbWFwLT5pbV9wY2kucGNpX2VtciksCisJCWxlMzJfdG9fY3B1IChpbW1hcC0+aW1fcGNpLnBjaV9lY3IpKTsKKwlwcmludGYgKCIgICAgIGVycm9yIGFkZHJlc3MgJXggZXJyb3IgZGF0YSAleCBjdHJsICV4XG4iLAorCQlsZTMyX3RvX2NwdSAoaW1tYXAtPmltX3BjaS5wY2lfZWFjciksCisJCWxlMzJfdG9fY3B1IChpbW1hcC0+aW1fcGNpLnBjaV9lZGNyKSwKKwkJbGUzMl90b19jcHUgKGltbWFwLT5pbV9wY2kucGNpX2VjY3IpKTsKKworfQorI2VuZGlmCisKK3ZvaWQKK01hY2hpbmVDaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZpeHVwOworCisJLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgorCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCisJICogdGhlIFBDSSBleGNlcHRpb24gaGFuZGxlci4KKwkgKi8KKyNpZmRlZiBDT05GSUdfUENJCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisjaWZkZWYgREVCVUcKKwlkdW1wX3BjaSgpOworI2VuZGlmCisJLyogY2xlYXIgdGhlIGVycm9yIGluIHRoZSBlcnJvciBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlpZihpbW1hcC0+aW1fcGNpLnBjaV9lc3IgJiBjcHVfdG9fbGUzMihQQ0lfRVJST1JfUENJX05PX1JTUCkpIHsKKwkJaW1tYXAtPmltX3BjaS5wY2lfZXNyID0gY3B1X3RvX2xlMzIoUENJX0VSUk9SX1BDSV9OT19SU1ApOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJaWYgKChmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGUocmVncy0+bmlwKSkgIT0gMCkgeworCQlyZWdzLT5uaXAgPSBmaXh1cDsKKwkJcmV0dXJuOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwdXRzICgiTWFjaGluZSBjaGVjayBpbiBrZXJuZWwgbW9kZS5cbiIKKwkJIkNhdXNlZCBieSAoZnJvbSBtc3IpOiAiKTsKKwlwcmludGYoInJlZ3MgJXAgIixyZWdzKTsKKwlzd2l0Y2goIHJlZ3MtPm1zciAmIDB4MDAwRjAwMDApIHsKKwljYXNlICgweDgwMDAwMDAwPj4xMik6CisJCXB1dHMgKCJNYWNoaW5lIGNoZWNrIHNpZ25hbCAtIHByb2JhYmx5IGR1ZSB0byBtbSBmYXVsdFxuIgorCQkJIndpdGggbW11IG9mZlxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjEzKToKKwkJcHV0cyAoIlRyYW5zZmVyIGVycm9yIGFjayBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwPj4xNCk6CisJCXB1dHMgKCJEYXRhIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwPj4xNSk6CisJCXB1dHMgKCJBZGRyZXNzIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwdXRzICgiVW5rbm93biB2YWx1ZXMgaW4gbXNyXG4iKTsKKwl9CisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisjaWZkZWYgQ09ORklHX1BDSQorCWR1bXBfcGNpKCk7CisjZW5kaWYKKwlwYW5pYygibWFjaGluZSBjaGVjayIpOworfQorCit2b2lkCitBbGlnbm1lbnRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiQWxpZ25tZW50IEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitQcm9ncmFtQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiUHJvZ3JhbSBDaGVjayBFeGNlcHRpb24iKTsKK30KKwordm9pZAorU29mdEVtdUV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJTb2Z0d2FyZSBFbXVsYXRpb24gRXhjZXB0aW9uIik7Cit9CisKKwordm9pZAorVW5rbm93bkV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXByaW50ZigiQmFkIHRyYXAgYXQgUEM6ICVseCwgU1I6ICVseCwgdmVjdG9yPSVseFxuIiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOworCV9leGNlcHRpb24oMCwgcmVncyk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQorZXh0ZXJuIHZvaWQgZG9fYmVkYnVnX2JyZWFrcG9pbnQoc3RydWN0IHB0X3JlZ3MgKik7CisjZW5kaWYKKwordm9pZAorRGVidWdFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisKKyAgcHJpbnRmKCJEZWJ1Z2dlciB0cmFwIGF0IEAgJWx4XG4iLCByZWdzLT5uaXAgKTsKKyAgc2hvd19yZWdzKHJlZ3MpOworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCisgIGRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CisjZW5kaWYKK30KKworLyogUHJvYmUgYW4gYWRkcmVzcyBieSByZWFkaW5nLiAgSWYgbm90IHByZXNlbnQsIHJldHVybiAtMSwgb3RoZXJ3aXNlCisgKiByZXR1cm4gMC4KKyAqLworaW50CithZGRyX3Byb2JlKHVpbnQgKmFkZHIpCit7CisjaWYgMAorCWludAlyZXR2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCSIxOglsd3ogJTAsMCglMSlcbiIJCVwKKwkJIgllaWVpb1xuIgkJXAorCQkiCWxpICUwLDBcbiIJCVwKKwkJIjI6XG4iCQkJCVwKKwkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJXAorCQkiMzoJbGkgJTAsLTFcbiIJCVwKKwkJIgliIDJiXG4iCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIglcCisJCSIJLmFsaWduIDJcbiIJCVwKKwkJIgkubG9uZyAxYiwzYlxuIgkJXAorCQkiLnRleHQiCQkJCVwKKwkJOiAiPXIiIChyZXR2YWwpIDogInIiKGFkZHIpKTsKKworCXJldHVybiAocmV0dmFsKTsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3UtYm9vdC5sZHMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODY4MWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwNworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KQl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgIGFyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zdGFydC5vCQkoLnRleHQpCisgICAgKigudGV4dCkKKyAgICAqKC5nb3QxKQorICAgIC4gPSBBTElHTigxNik7CisgICAgKiguZWhfZnJhbWUpCisgICAgKihTT1JUX0JZX0FMSUdOTUVOVChTT1JUX0JZX05BTUUoLnJvZGF0YSopKSkKKyAgfQorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDBGRkYpICYgMHhGRkZGRjAwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIC4gPSAuOworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAoTk9MT0FEKSAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgIC4gPSBBTElHTig0KTsKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTJjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubworCitDT0JKUy15ICs9IHRyYXBzLm8KK0NPQkpTLXkgKz0gY3B1Lm8KK0NPQkpTLXkgKz0gY3B1X2luaXQubworQ09CSlMteSArPSBzcGVlZC5vCitDT0JKUy15ICs9IGludGVycnVwdHMubworQ09CSlMteSArPSBzcGRfc2RyYW0ubworQ09CSlMteSArPSBlY2MubworQ09CSlMtJChDT05GSUdfUUUpICs9IHFlX2lvLm8KK0NPQkpTLSQoQ09ORklHX0ZTTF9TRVJERVMpICs9IHNlcmRlcy5vCitDT0JKUy0kKENPTkZJR19QQ0kpICs9IHBjaS5vCitDT0JKUy0kKENPTkZJR19QQ0lFKSArPSBwY2llLm8KK0NPQkpTLSQoQ09ORklHX09GX0xJQkZEVCkgKz0gZmR0Lm8KKworQ09CSlMJOj0gJChDT0JKUy15KQorU1JDUwk6PSAkKFNUQVJUOi5vPS5TKSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykgJChDT0JKUykpCitTVEFSVAk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTVEFSVCkpCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvY29uZmlnLm1rIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTNhOGMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L2NvbmZpZy5tawpAQCAtMCwwICsxLDI5IEBACisjCisjIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1tZWFiaQorCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19NUEM4M3h4IC1EQ09ORklHX0UzMDAgXAorCQkJLWZmaXhlZC1yMiAtbXNvZnQtZmxvYXQKKworIyBVc2UgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQm9hcmQgcG9ydCBjYW4gb3ZlcnJpZGUgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE4MGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L2NwdS5jCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogQ1BVIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBNUEM4M3h4IGZhbWlseS4KKyAqCisgKiBEZXJpdmVkIGZyb20gdGhlIE1QQzgyNjAgYW5kIE1QQzg1eHguCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1wYzgzeHguaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8dHNlYy5oPgorI2luY2x1ZGUgPG5ldGRldi5oPgorI2luY2x1ZGUgPGZzbF9lc2RoYy5oPgorI2lmZGVmIENPTkZJR19CT09UQ09VTlRfTElNSVQKKyNpbmNsdWRlIDxhc20vaW1tYXBfcWUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNlbmRpZgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworaW50IGNoZWNrY3B1KHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tcjsKKwl1bG9uZyBjbG9jayA9IGdkLT5jcHVfY2xrOworCXUzMiBwdnIgPSBnZXRfcHZyKCk7CisJdTMyIHNwcmlkcjsKKwljaGFyIGJ1ZlszMl07CisJaW50IGk7CisKKwljb25zdCBzdHJ1Y3QgY3B1X3R5cGUgeworCQljaGFyIG5hbWVbMTVdOworCQl1MzIgcGFydGlkOworCX0gY3B1X3R5cGVfbGlzdCBbXSA9IHsKKwkJQ1BVX1RZUEVfRU5UUlkoODMxMSksCisJCUNQVV9UWVBFX0VOVFJZKDgzMTMpLAorCQlDUFVfVFlQRV9FTlRSWSg4MzE0KSwKKwkJQ1BVX1RZUEVfRU5UUlkoODMxNSksCisJCUNQVV9UWVBFX0VOVFJZKDgzMjEpLAorCQlDUFVfVFlQRV9FTlRSWSg4MzIzKSwKKwkJQ1BVX1RZUEVfRU5UUlkoODM0MyksCisJCUNQVV9UWVBFX0VOVFJZKDgzNDdfVEJHQV8pLAorCQlDUFVfVFlQRV9FTlRSWSg4MzQ3X1BCR0FfKSwKKwkJQ1BVX1RZUEVfRU5UUlkoODM0OSksCisJCUNQVV9UWVBFX0VOVFJZKDgzNThfVEJHQV8pLAorCQlDUFVfVFlQRV9FTlRSWSg4MzU4X1BCR0FfKSwKKwkJQ1BVX1RZUEVfRU5UUlkoODM2MCksCisJCUNQVV9UWVBFX0VOVFJZKDgzNzcpLAorCQlDUFVfVFlQRV9FTlRSWSg4Mzc4KSwKKwkJQ1BVX1RZUEVfRU5UUlkoODM3OSksCisJfTsKKworCWltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKworCXB1dHMoIkNQVTogICAiKTsKKworCXN3aXRjaCAocHZyICYgMHhmZmZmMDAwMCkgeworCQljYXNlIFBWUl9FMzAwQzE6CisJCQlwcmludGYoImUzMDBjMSwgIik7CisJCQlicmVhazsKKworCQljYXNlIFBWUl9FMzAwQzI6CisJCQlwcmludGYoImUzMDBjMiwgIik7CisJCQlicmVhazsKKworCQljYXNlIFBWUl9FMzAwQzM6CisJCQlwcmludGYoImUzMDBjMywgIik7CisJCQlicmVhazsKKworCQljYXNlIFBWUl9FMzAwQzQ6CisJCQlwcmludGYoImUzMDBjNCwgIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJVbmtub3duIGNvcmUsICIpOworCX0KKworCXNwcmlkciA9IGltbXItPnN5c2NvbmYuc3ByaWRyOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3B1X3R5cGVfbGlzdCk7IGkrKykKKwkJaWYgKGNwdV90eXBlX2xpc3RbaV0ucGFydGlkID09IFBBUlRJRF9OT19FKHNwcmlkcikpIHsKKwkJCXB1dHMoIk1QQyIpOworCQkJcHV0cyhjcHVfdHlwZV9saXN0W2ldLm5hbWUpOworCQkJaWYgKElTX0VfUFJPQ0VTU09SKHNwcmlkcikpCisJCQkJcHV0cygiRSIpOworCQkJaWYgKFJFVklEX01BSk9SKHNwcmlkcikgPj0gMikKKwkJCQlwdXRzKCJBIik7CisJCQlwcmludGYoIiwgUmV2OiAlZC4lZCIsIFJFVklEX01BSk9SKHNwcmlkciksCisJCQkgICAgICAgUkVWSURfTUlOT1Ioc3ByaWRyKSk7CisJCQlicmVhazsKKwkJfQorCisJaWYgKGkgPT0gQVJSQVlfU0laRShjcHVfdHlwZV9saXN0KSkKKwkJcHJpbnRmKCIoU1BSSURSICUwOHggdW5rbm93biksICIsIHNwcmlkcik7CisKKwlwcmludGYoIiBhdCAlcyBNSHosICIsIHN0cm1oeihidWYsIGNsb2NrKSk7CisKKwlwcmludGYoIkNTQjogJXMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+Y3NiX2NsaykpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFByb2dyYW0gYSBVUE0gd2l0aCB0aGUgY29kZSBzdXBwbGllZCBpbiB0aGUgdGFibGUuCisgKgorICogVGhlICdkdW1teScgdmFyaWFibGUgaXMgdXNlZCB0byBpbmNyZW1lbnQgdGhlIE1BRC4gJ2R1bW15JyBpcworICogc3VwcG9zZWQgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2YgdGhlIGRldmljZSBiZWluZworICogcHJvZ3JhbW1lZCBieSB0aGUgVVBNLiAgVGhlIGRhdGEgaW4gdGhlIE1EUiBpcyB3cml0dGVuIGludG8KKyAqIG1lbW9yeSBhbmQgdGhlIE1BRCBpcyBpbmNyZW1lbnRlZCBldmVyeSB0aW1lIHRoZXJlJ3MgYSB3cml0ZQorICogdG8gJ2R1bW15Jy4gVW5mb3J0dW5hdGVseSwgdGhlIGN1cnJlbnQgcHJvdG90eXBlIGZvciB0aGlzCisgKiBmdW5jdGlvbiBkb2Vzbid0IGFsbG93IGZvciBwYXNzaW5nIHRoZSBhZGRyZXNzIG9mIHRoaXMKKyAqIGRldmljZSwgYW5kIGNoYW5naW5nIHRoZSBwcm90b3R5cGUgd2lsbCBicmVhayBhIG51bWJlciBsb3RzCisgKiBvZiBvdGhlciBjb2RlLCBzbyB3ZSBuZWVkIHRvIHVzZSBhIHJvdW5kLWFib3V0IHdheSBvZiBmaW5kaW5nCisgKiB0aGUgdmFsdWUgZm9yICdkdW1teScuCisgKgorICogVGhlIHZhbHVlIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgYmFzZSBhZGRyZXNzIGJpdHMgb2YgdGhlCisgKiBCYXNlIFJlZ2lzdGVyIChCUikgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpYyBVUE0uICBUbyBmaW5kCisgKiB0aGF0IEJSLCB3ZSBuZWVkIHRvIHNjYW4gYWxsIDggQlJzIHVudGlsIHdlIGZpbmQgdGhlIG9uZSB0aGF0CisgKiBoYXMgaXRzIE1TRUwgYml0cyBtYXRjaGluZyB0aGUgVVBNIHdlIHdhbnQuICBPbmNlIHdlIGtub3cgdGhlCisgKiByaWdodCBCUiwgd2UgY2FuIGV4dHJhY3QgdGhlIGJhc2UgYWRkcmVzcyBiaXRzIGZyb20gaXQuCisgKgorICogVGhlIE14TVIgYW5kIHRoZSBCUiBhbmQgT1Igb2YgdGhlIGNob3NlbiBiYW5rIHNob3VsZCBhbGwgYmUKKyAqIGNvbmZpZ3VyZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogdXBtOiAwPVVQTUEsIDE9VVBNQiwgMj1VUE1DCisgKiB0YWJsZTogUG9pbnRlciB0byBhbiBhcnJheSBvZiB2YWx1ZXMgdG8gcHJvZ3JhbQorICogc2l6ZTogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4gIE11c3QgYmUgNjQgb3IgbGVzcy4KKyAqLwordm9pZCB1cG1jb25maWcgKHVpbnQgdXBtLCB1aW50ICp0YWJsZSwgdWludCBzaXplKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGZzbF9sYnVzX3QgKmxidXMgPSAmaW1tYXAtPmxidXM7CisJdm9sYXRpbGUgdWNoYXIgKmR1bW15ID0gTlVMTDsKKwljb25zdCB1MzIgbXNlbCA9ICh1cG0gKyA0KSA8PCBCUl9NU0VMX1NISUZUOwkvKiBXaGF0IHRoZSBNU0VMIGZpZWxkIGluIEJSbiBzaG91bGQgYmUgKi8KKwl2b2xhdGlsZSB1MzIgKm14bXIgPSAmbGJ1cy0+bWFtciArIHVwbTsJLyogUG9pbnRlciB0byBtYW1yLCBtYm1yLCBvciBtY21yICovCisJdWludCBpOworCisJLyogU2NhbiBhbGwgdGhlIGJhbmtzIHRvIGRldGVybWluZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmICgobGJ1cy0+YmFua1tpXS5iciAmIEJSX01TRUwpID09IG1zZWwpIHsKKwkJCWR1bW15ID0gKHVjaGFyICopIChsYnVzLT5iYW5rW2ldLmJyICYgQlJfQkEpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWR1bW15KSB7CisJCXByaW50ZigiRXJyb3I6ICVzKCkgY291bGQgbm90IGZpbmQgbWF0Y2hpbmcgQlJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWhhbmcoKTsKKwl9CisKKwkvKiBTZXQgdGhlIE9QIGZpZWxkIGluIHRoZSBNeE1SIHRvICJ3cml0ZSIgYW5kIHRoZSBNQUQgZmllbGQgdG8gMDAwMDAwICovCisJKm14bXIgPSAoKm14bXIgJiAweENGRkZGRkMwKSB8IDB4MTAwMDAwMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWxidXMtPm1kciA9IHRhYmxlW2ldOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKKwkJKmR1bW15ID0gMDsJLyogV3JpdGUgdGhlIHZhbHVlIHRvIG1lbW9yeSBhbmQgaW5jcmVtZW50IE1BRCAqLworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKKwkJd2hpbGUoKCgqbXhtciAmIDB4M2YpICE9ICgoaSArIDEpICYgMHgzZikpKTsKKwl9CisKKwkvKiBTZXQgdGhlIE9QIGZpZWxkIGluIHRoZSBNeE1SIHRvICJub3JtYWwiIGFuZCB0aGUgTUFEIGZpZWxkIHRvIDAwMDAwMCAqLworCSpteG1yICY9IDB4Q0ZGRkZGQzA7Cit9CisKKworaW50Citkb19yZXNldCAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVsb25nIG1zcjsKKyNpZm5kZWYgTVBDODN4eF9SRVNFVAorCXVsb25nIGFkZHI7CisjZW5kaWYKKworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCisJcHV0cygiUmVzZXR0aW5nIHRoZSBib2FyZC5cbiIpOworCisjaWZkZWYgTVBDODN4eF9SRVNFVAorCisJLyogSW50ZXJydXB0cyBhbmQgTU1VIG9mZiAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgibWZtc3IgICAgJTAiOiI9ciIgKG1zcik6KTsKKworCW1zciAmPSB+KCBNU1JfRUUgfCBNU1JfSVIgfCBNU1JfRFIpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgibXRtc3IgICAgJTAiOjoiciIgKG1zcikpOworCisJLyogZW5hYmxlIFJlc2V0IENvbnRyb2wgUmVnICovCisJaW1tYXAtPnJlc2V0LnJwciA9IDB4NTI1MzU0NDU7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJpc3luYyIpOworCisJLyogY29uZmlybSBSZXNldCBDb250cm9sIFJlZyBpcyBlbmFibGVkICovCisJd2hpbGUoISgoaW1tYXAtPnJlc2V0LnJjZXIpICYgUkNFUl9DUkUpKTsKKworCXVkZWxheSgyMDApOworCisJLyogcGVyZm9ybSByZXNldCwgb25seSBvbmUgYml0ICovCisJaW1tYXAtPnJlc2V0LnJjciA9IFJDUl9TV0hSOworCisjZWxzZQkvKiAhIE1QQzgzeHhfUkVTRVQgKi8KKworCWltbWFwLT5yZXNldC5ybXIgPSBSTVJfQ1NSRTsgICAgLyogQ2hlY2tzdG9wIFJlc2V0IGVuYWJsZSAqLworCisJLyogSW50ZXJydXB0cyBhbmQgTU1VIG9mZiAqLworCV9fYXNtX18gX192b2xhdGlsZV9fICgibWZtc3IgICAgJTAiOiI9ciIgKG1zcik6KTsKKworCW1zciAmPSB+KE1TUl9NRSB8IE1TUl9FRSB8IE1TUl9JUiB8IE1TUl9EUik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtdG1zciAgICAlMCI6OiJyIiAobXNyKSk7CisKKwkvKgorCSAqIFRyeWluZyB0byBleGVjdXRlIHRoZSBuZXh0IGluc3RydWN0aW9uIGF0IGEgbm9uLWV4aXN0aW5nIGFkZHJlc3MKKwkgKiBzaG91bGQgY2F1c2UgYSBtYWNoaW5lIGNoZWNrLCByZXN1bHRpbmcgaW4gcmVzZXQKKwkgKi8KKwlhZGRyID0gQ09ORklHX1NZU19SRVNFVF9BRERSRVNTOworCisJKCh2b2lkICgqKSh2b2lkKSkgYWRkcikgKCk7CisjZW5kaWYJLyogTVBDODN4eF9SRVNFVCAqLworCisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIEdldCB0aW1lYmFzZSBjbG9jayBmcmVxdWVuY3kgKGxpa2UgY3B1X2NsayBpbiBIeikKKyAqLworCit1bnNpZ25lZCBsb25nIGdldF90YmNsayh2b2lkKQoreworCXVsb25nIHRiY2xrOworCisJdGJjbGsgPSAoZ2QtPmJ1c19jbGsgKyAzTCkgLyA0TDsKKworCXJldHVybiB0YmNsazsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCit2b2lkIHdhdGNoZG9nX3Jlc2V0ICh2b2lkKQoreworCWludCByZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCS8qIFJlc2V0IHRoZSA4M3h4IHdhdGNoZG9nICovCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwlpbW1yLT53ZHQuc3dzcnIgPSAweDU1NmM7CisJaW1tci0+d2R0LnN3c3JyID0gMHhhYTM5OworCisJaWYgKHJlX2VuYWJsZSkKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7Cit9CisjZW5kaWYKKworLyoKKyAqIEluaXRpYWxpemVzIG9uLWNoaXAgZXRoZXJuZXQgY29udHJvbGxlcnMuCisgKiB0byBvdmVycmlkZSwgaW1wbGVtZW50IGJvYXJkX2V0aF9pbml0KCkKKyAqLworaW50IGNwdV9ldGhfaW5pdChiZF90ICpiaXMpCit7CisjaWYgZGVmaW5lZChDT05GSUdfVUVDX0VUSCkKKwl1ZWNfc3RhbmRhcmRfaW5pdChiaXMpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19UU0VDX0VORVQpCisJdHNlY19zdGFuZGFyZF9pbml0KGJpcyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemVzIG9uLWNoaXAgTU1DIGNvbnRyb2xsZXJzLgorICogdG8gb3ZlcnJpZGUsIGltcGxlbWVudCBib2FyZF9tbWNfaW5pdCgpCisgKi8KK2ludCBjcHVfbW1jX2luaXQoYmRfdCAqYmlzKQoreworI2lmZGVmIENPTkZJR19GU0xfRVNESEMKKwlyZXR1cm4gZnNsX2VzZGhjX21tY19pbml0KGJpcyk7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfQk9PVENPVU5UX0xJTUlUCisKKyNpZiAhZGVmaW5lZChDT05GSUdfTVBDODM2MCkKKyNlcnJvciAiQ09ORklHX0JPT1RDT1VOVF9MSU1JVCBvbmx5IGZvciBNUEM4MzYwIGltcGxlbWVudGVkIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQk9PVENPVU5UX0FERFIpCisjZGVmaW5lIENPTkZJR19CT09UQ09VTlRfQUREUgkoMHgxMTAwMDAgKyBRRV9NVVJBTV9TSVpFIC0gMiAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3ZvaWQgYm9vdGNvdW50X3N0b3JlICh1bG9uZyBhKQoreworCXZvaWQgKnJlZyA9ICh2b2lkICopKENPTkZJR19TWVNfSU1NUiArIENPTkZJR19CT09UQ09VTlRfQUREUik7CisJb3V0X2JlMzIgKHJlZywgYSk7CisJb3V0X2JlMzIgKHJlZyArIDQsIEJPT1RDT1VOVF9NQUdJQyk7Cit9CisKK3Vsb25nIGJvb3Rjb3VudF9sb2FkICh2b2lkKQoreworCXZvaWQgKnJlZyA9ICh2b2lkICopKENPTkZJR19TWVNfSU1NUiArIENPTkZJR19CT09UQ09VTlRfQUREUik7CisKKwlpZiAoaW5fYmUzMiAocmVnICsgNCkgIT0gQk9PVENPVU5UX01BR0lDKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBpbl9iZTMyIChyZWcpOworfQorI2VuZGlmIC8qIENPTkZJR19CT09UQ09VTlRfTElNSVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9jcHVfaW5pdC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L2NwdV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViNDUyMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9jcHVfaW5pdC5jCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODN4eC5oPgorI2luY2x1ZGUgPGlvcG9ydHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpZmRlZiBDT05GSUdfVVNCX0VIQ0lfRlNMCisjaW5jbHVkZSA8dXNiL2VoY2ktZnNsLmg+CisjZW5kaWYKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZmRlZiBDT05GSUdfUUUKK2V4dGVybiBxZV9pb3BfY29uZl90IHFlX2lvcF9jb25mX3RhYltdOworZXh0ZXJuIHZvaWQgcWVfY29uZmlnX2lvcGluKHU4IHBvcnQsIHU4IHBpbiwgaW50IGRpciwKKwkJCSBpbnQgb3Blbl9kcmFpbiwgaW50IGFzc2lnbik7CitleHRlcm4gdm9pZCBxZV9pbml0KHVpbnQgcWVfYmFzZSk7CitleHRlcm4gdm9pZCBxZV9yZXNldCh2b2lkKTsKKworc3RhdGljIHZvaWQgY29uZmlnX3FlX2lvcG9ydHModm9pZCkKK3sKKwl1OAlwb3J0LCBwaW47CisJaW50CWRpciwgb3Blbl9kcmFpbiwgYXNzaWduOworCWludAlpOworCisJZm9yIChpID0gMDsgcWVfaW9wX2NvbmZfdGFiW2ldLmFzc2lnbiAhPSBRRV9JT1BfVEFCX0VORDsgaSsrKSB7CisJCXBvcnQJCT0gcWVfaW9wX2NvbmZfdGFiW2ldLnBvcnQ7CisJCXBpbgkJPSBxZV9pb3BfY29uZl90YWJbaV0ucGluOworCQlkaXIJCT0gcWVfaW9wX2NvbmZfdGFiW2ldLmRpcjsKKwkJb3Blbl9kcmFpbgk9IHFlX2lvcF9jb25mX3RhYltpXS5vcGVuX2RyYWluOworCQlhc3NpZ24JCT0gcWVfaW9wX2NvbmZfdGFiW2ldLmFzc2lnbjsKKwkJcWVfY29uZmlnX2lvcGluKHBvcnQsIHBpbiwgZGlyLCBvcGVuX2RyYWluLCBhc3NpZ24pOworCX0KK30KKyNlbmRpZgorCisvKgorICogQnJlYXRoZSBzb21lIGxpZmUgaW50byB0aGUgQ1BVLi4uCisgKgorICogU2V0IHVwIHRoZSBtZW1vcnkgbWFwLAorICogaW5pdGlhbGl6ZSBhIGJ1bmNoIG9mIHJlZ2lzdGVycywKKyAqIGluaXRpYWxpemUgdGhlIFVQTSdzCisgKi8KK3ZvaWQgY3B1X2luaXRfZiAodm9sYXRpbGUgaW1tYXBfdCAqIGltKQoreworCV9fYmUzMiBhY3JfbWFzayA9CisjaWZkZWYgQ09ORklHX1NZU19BQ1JfUElQRV9ERVAgLyogQXJiaXRlciBwaXBlbGluZSBkZXB0aCAqLworCQkoQUNSX1BJUEVfREVQIDw8IEFDUl9QSVBFX0RFUF9TSElGVCkgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19BQ1JfUlBUQ05UIC8qIEFyYml0ZXIgcmVwZWF0IGNvdW50ICovCisJCShBQ1JfUlBUQ05UIDw8IEFDUl9SUFRDTlRfU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfQUNSX0FQQVJLCS8qIEFyYml0ZXIgYWRkcmVzcyBwYXJraW5nIG1vZGUgKi8KKwkJKEFDUl9BUEFSSyA8PCBBQ1JfQVBBUktfU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfQUNSX1BBUktNCS8qIEFyYml0ZXIgcGFya2luZyBtYXN0ZXIgKi8KKwkJKEFDUl9QQVJLTSA8PCBBQ1JfUEFSS01fU0hJRlQpIHwKKyNlbmRpZgorCQkwOworCV9fYmUzMiBhY3JfdmFsID0KKyNpZmRlZiBDT05GSUdfU1lTX0FDUl9QSVBFX0RFUCAvKiBBcmJpdGVyIHBpcGVsaW5lIGRlcHRoICovCisJCShDT05GSUdfU1lTX0FDUl9QSVBFX0RFUCA8PCBBQ1JfUElQRV9ERVBfU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfQUNSX1JQVENOVCAvKiBBcmJpdGVyIHJlcGVhdCBjb3VudCAqLworCQkoQ09ORklHX1NZU19BQ1JfUlBUQ05UIDw8IEFDUl9SUFRDTlRfU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfQUNSX0FQQVJLCS8qIEFyYml0ZXIgYWRkcmVzcyBwYXJraW5nIG1vZGUgKi8KKwkJKENPTkZJR19TWVNfQUNSX0FQQVJLIDw8IEFDUl9BUEFSS19TSElGVCkgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19BQ1JfUEFSS00JLyogQXJiaXRlciBwYXJraW5nIG1hc3RlciAqLworCQkoQ09ORklHX1NZU19BQ1JfUEFSS00gPDwgQUNSX1BBUktNX1NISUZUKSB8CisjZW5kaWYKKwkJMDsKKwlfX2JlMzIgc3Bjcl9tYXNrID0KKyNpZmRlZiBDT05GSUdfU1lTX1NQQ1JfT1BUIC8qIE9wdGltaXplIHRyYW5zYWN0aW9ucyBiZXR3ZWVuIENTQiBhbmQgb3RoZXIgZGV2ICovCisJCShTUENSX09QVCA8PCBTUENSX09QVF9TSElGVCkgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19TUENSX1RTRUNFUCAvKiBhbGwgZVRTRUMncyBFbWVyZ2VuY3kgcHJpb3JpdHkgKi8KKwkJKFNQQ1JfVFNFQ0VQIDw8IFNQQ1JfVFNFQ0VQX1NISUZUKSB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX1NQQ1JfVFNFQzFFUCAvKiBUU0VDMSBFbWVyZ2VuY3kgcHJpb3JpdHkgKi8KKwkJKFNQQ1JfVFNFQzFFUCA8PCBTUENSX1RTRUMxRVBfU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfU1BDUl9UU0VDMkVQIC8qIFRTRUMyIEVtZXJnZW5jeSBwcmlvcml0eSAqLworCQkoU1BDUl9UU0VDMkVQIDw8IFNQQ1JfVFNFQzJFUF9TSElGVCkgfAorI2VuZGlmCisJCTA7CisJX19iZTMyIHNwY3JfdmFsID0KKyNpZmRlZiBDT05GSUdfU1lTX1NQQ1JfT1BUCisJCShDT05GSUdfU1lTX1NQQ1JfT1BUIDw8IFNQQ1JfT1BUX1NISUZUKSB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX1NQQ1JfVFNFQ0VQIC8qIGFsbCBlVFNFQydzIEVtZXJnZW5jeSBwcmlvcml0eSAqLworCQkoQ09ORklHX1NZU19TUENSX1RTRUNFUCA8PCBTUENSX1RTRUNFUF9TSElGVCkgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19TUENSX1RTRUMxRVAgLyogVFNFQzEgRW1lcmdlbmN5IHByaW9yaXR5ICovCisJCShDT05GSUdfU1lTX1NQQ1JfVFNFQzFFUCA8PCBTUENSX1RTRUMxRVBfU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfU1BDUl9UU0VDMkVQIC8qIFRTRUMyIEVtZXJnZW5jeSBwcmlvcml0eSAqLworCQkoQ09ORklHX1NZU19TUENSX1RTRUMyRVAgPDwgU1BDUl9UU0VDMkVQX1NISUZUKSB8CisjZW5kaWYKKwkJMDsKKwlfX2JlMzIgc2Njcl9tYXNrID0KKyNpZmRlZiBDT05GSUdfU1lTX1NDQ1JfRU5DQ00gLyogRW5jcnlwdGlvbiBjbG9jayBtb2RlICovCisJCShTQ0NSX0VOQ0NNIDw8IFNDQ1JfRU5DQ01fU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfU0NDUl9QQ0lDTSAvKiBQQ0kgJiBETUEgY2xvY2sgbW9kZSAqLworCQkoU0NDUl9QQ0lDTSA8PCBTQ0NSX1BDSUNNX1NISUZUKSB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX1NDQ1JfVFNFQ0NNIC8qIGFsbCBUU0VDJ3MgY2xvY2sgbW9kZSAqLworCQkoU0NDUl9UU0VDQ00gPDwgU0NDUl9UU0VDQ01fU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfU0NDUl9UU0VDMUNNIC8qIFRTRUMxIGNsb2NrIG1vZGUgKi8KKwkJKFNDQ1JfVFNFQzFDTSA8PCBTQ0NSX1RTRUMxQ01fU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfU0NDUl9UU0VDMkNNIC8qIFRTRUMyIGNsb2NrIG1vZGUgKi8KKwkJKFNDQ1JfVFNFQzJDTSA8PCBTQ0NSX1RTRUMyQ01fU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfU0NDUl9UU0VDMU9OIC8qIFRTRUMxIGNsb2NrIHN3aXRjaCAqLworCQkoU0NDUl9UU0VDMU9OIDw8IFNDQ1JfVFNFQzFPTl9TSElGVCkgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19TQ0NSX1RTRUMyT04gLyogVFNFQzIgY2xvY2sgc3dpdGNoICovCisJCShTQ0NSX1RTRUMyT04gPDwgU0NDUl9UU0VDMk9OX1NISUZUKSB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX1NDQ1JfVVNCTVBIQ00gLyogVVNCIE1QSCBjbG9jayBtb2RlICovCisJCShTQ0NSX1VTQk1QSENNIDw8IFNDQ1JfVVNCTVBIQ01fU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfU0NDUl9VU0JEUkNNIC8qIFVTQiBEUiBjbG9jayBtb2RlICovCisJCShTQ0NSX1VTQkRSQ00gPDwgU0NDUl9VU0JEUkNNX1NISUZUKSB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX1NDQ1JfU0FUQUNNIC8qIFNBVEEgY29udHJvbGxlciBjbG9jayBtb2RlICovCisJCShTQ0NSX1NBVEFDTSA8PCBTQ0NSX1NBVEFDTV9TSElGVCkgfAorI2VuZGlmCisJCTA7CisJX19iZTMyIHNjY3JfdmFsID0KKyNpZmRlZiBDT05GSUdfU1lTX1NDQ1JfRU5DQ00gLyogRW5jcnlwdGlvbiBjbG9jayBtb2RlICovCisJCShDT05GSUdfU1lTX1NDQ1JfRU5DQ00gPDwgU0NDUl9FTkNDTV9TSElGVCkgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19TQ0NSX1BDSUNNIC8qIFBDSSAmIERNQSBjbG9jayBtb2RlICovCisJCShDT05GSUdfU1lTX1NDQ1JfUENJQ00gPDwgU0NDUl9QQ0lDTV9TSElGVCkgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19TQ0NSX1RTRUNDTSAvKiBhbGwgVFNFQydzIGNsb2NrIG1vZGUgKi8KKwkJKENPTkZJR19TWVNfU0NDUl9UU0VDQ00gPDwgU0NDUl9UU0VDQ01fU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfU0NDUl9UU0VDMUNNIC8qIFRTRUMxIGNsb2NrIG1vZGUgKi8KKwkJKENPTkZJR19TWVNfU0NDUl9UU0VDMUNNIDw8IFNDQ1JfVFNFQzFDTV9TSElGVCkgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19TQ0NSX1RTRUMyQ00gLyogVFNFQzIgY2xvY2sgbW9kZSAqLworCQkoQ09ORklHX1NZU19TQ0NSX1RTRUMyQ00gPDwgU0NDUl9UU0VDMkNNX1NISUZUKSB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX1NDQ1JfVFNFQzFPTiAvKiBUU0VDMSBjbG9jayBzd2l0Y2ggKi8KKwkJKENPTkZJR19TWVNfU0NDUl9UU0VDMU9OIDw8IFNDQ1JfVFNFQzFPTl9TSElGVCkgfAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19TQ0NSX1RTRUMyT04gLyogVFNFQzIgY2xvY2sgc3dpdGNoICovCisJCShDT05GSUdfU1lTX1NDQ1JfVFNFQzJPTiA8PCBTQ0NSX1RTRUMyT05fU0hJRlQpIHwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfU0NDUl9VU0JNUEhDTSAvKiBVU0IgTVBIIGNsb2NrIG1vZGUgKi8KKwkJKENPTkZJR19TWVNfU0NDUl9VU0JNUEhDTSA8PCBTQ0NSX1VTQk1QSENNX1NISUZUKSB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX1NDQ1JfVVNCRFJDTSAvKiBVU0IgRFIgY2xvY2sgbW9kZSAqLworCQkoQ09ORklHX1NZU19TQ0NSX1VTQkRSQ00gPDwgU0NDUl9VU0JEUkNNX1NISUZUKSB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX1NDQ1JfU0FUQUNNIC8qIFNBVEEgY29udHJvbGxlciBjbG9jayBtb2RlICovCisJCShDT05GSUdfU1lTX1NDQ1JfU0FUQUNNIDw8IFNDQ1JfU0FUQUNNX1NISUZUKSB8CisjZW5kaWYKKwkJMDsKKwlfX2JlMzIgbGNycl9tYXNrID0KKyNpZmRlZiBDT05GSUdfU1lTX0xDUlJfREJZUCAvKiBQTEwgYnlwYXNzICovCisJCUxDUlJfREJZUCB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX0xDUlJfRUFEQyAvKiBleHRlcm5hbCBhZGRyZXNzIGRlbGF5ICovCisJCUxDUlJfRUFEQyB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX0xDUlJfQ0xLRElWIC8qIHN5c3RlbSBjbG9jayBkaXZpZGVyICovCisJCUxDUlJfQ0xLRElWIHwKKyNlbmRpZgorCQkwOworCV9fYmUzMiBsY3JyX3ZhbCA9CisjaWZkZWYgQ09ORklHX1NZU19MQ1JSX0RCWVAgLyogUExMIGJ5cGFzcyAqLworCQlDT05GSUdfU1lTX0xDUlJfREJZUCB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX0xDUlJfRUFEQworCQlDT05GSUdfU1lTX0xDUlJfRUFEQyB8CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX0xDUlJfQ0xLRElWIC8qIHN5c3RlbSBjbG9jayBkaXZpZGVyICovCisJCUNPTkZJR19TWVNfTENSUl9DTEtESVYgfAorI2VuZGlmCisJCTA7CisKKwkvKiBQb2ludGVyIGlzIHdyaXRhYmxlIHNpbmNlIHdlIGFsbG9jYXRlZCBhIHJlZ2lzdGVyIGZvciBpdCAqLworCWdkID0gKGdkX3QgKikgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfR0JMX0RBVEFfT0ZGU0VUKTsKKworCS8qIENsZWFyIGluaXRpYWwgZ2xvYmFsIGRhdGEgKi8KKwltZW1zZXQgKCh2b2lkICopIGdkLCAwLCBzaXplb2YgKGdkX3QpKTsKKworCS8qIHN5c3RlbSBwZXJmb3JtYW5jZSB0d2Vha2luZyAqLworCWNscnNldGJpdHNfYmUzMigmaW0tPmFyYml0ZXIuYWNyLCBhY3JfbWFzaywgYWNyX3ZhbCk7CisKKwljbHJzZXRiaXRzX2JlMzIoJmltLT5zeXNjb25mLnNwY3IsIHNwY3JfbWFzaywgc3Bjcl92YWwpOworCisJY2xyc2V0Yml0c19iZTMyKCZpbS0+Y2xrLnNjY3IsIHNjY3JfbWFzaywgc2Njcl92YWwpOworCisJLyogUlNSIC0gUmVzZXQgU3RhdHVzIFJlZ2lzdGVyIC0gY2xlYXIgYWxsIHN0YXR1cyAoNC42LjEuMykgKi8KKwlnZC0+cmVzZXRfc3RhdHVzID0gX19yYXdfcmVhZGwoJmltLT5yZXNldC5yc3IpOworCV9fcmF3X3dyaXRlbCh+KFJTUl9SRVMpLCAmaW0tPnJlc2V0LnJzcik7CisKKwkvKiBBRVIgLSBBcmJpdGVyIEV2ZW50IFJlZ2lzdGVyIC0gc3RvcmUgc3RhdHVzICovCisJZ2QtPmFyYml0ZXJfZXZlbnRfYXR0cmlidXRlcyA9IF9fcmF3X3JlYWRsKCZpbS0+YXJiaXRlci5hZWF0cik7CisJZ2QtPmFyYml0ZXJfZXZlbnRfYWRkcmVzcyA9IF9fcmF3X3JlYWRsKCZpbS0+YXJiaXRlci5hZWFkcik7CisKKwkvKgorCSAqIFJNUiAtIFJlc2V0IE1vZGUgUmVnaXN0ZXIKKwkgKiBjb250YWlucyBjaGVja3N0b3AgcmVzZXQgZW5hYmxlICg0LjYuMS40KQorCSAqLworCV9fcmF3X3dyaXRlbChSTVJfQ1NSRSAmICgxPDxSTVJfQ1NSRV9TSElGVCksICZpbS0+cmVzZXQucm1yKTsKKworCS8qIExDUlIgLSBDbG9jayBSYXRpbyBSZWdpc3RlciAoMTAuMy4xLjE2KQorCSAqIHdyaXRlLCByZWFkLCBhbmQgaXN5bmMgcGVyIE1QQzgzNzlFUk0gcmV2LjEgQ0xLREVWIGZpZWxkIGRlc2NyaXB0aW9uCisJICovCisJY2xyc2V0Yml0c19iZTMyKCZpbS0+bGJ1cy5sY3JyLCBsY3JyX21hc2ssIGxjcnJfdmFsKTsKKwlfX3Jhd19yZWFkbCgmaW0tPmxidXMubGNycik7CisJaXN5bmMoKTsKKworCS8qIEVuYWJsZSBUaW1lIEJhc2UgJiBEZWNyZW1lbnRlciAoIHNvIHdlIHdpbGwgaGF2ZSB1ZGVsYXkoKSApKi8KKwlzZXRiaXRzX2JlMzIoJmltLT5zeXNjb25mLnNwY3IsIFNQQ1JfVEJFTik7CisKKwkvKiBTeXN0ZW0gR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVyICovCisjaWZkZWYgQ09ORklHX1NZU19TSUNSSAorI2lmIGRlZmluZWQoQ09ORklHX01QQzgzNHgpIHx8IGRlZmluZWQoQ09ORklHX01QQzgzMTMpCisJLyogcmVnYXJkaW5nIHRvIE1QQzM0eCBtYW51YWwgcmV2LjEgYml0cyAyOC4uMjkgbXVzdCBiZSBwcmVzZXJ2ZWQgKi8KKwlfX3Jhd193cml0ZWwoKGltLT5zeXNjb25mLnNpY3JoICYgMHgwMDAwMDAwQykgfCBDT05GSUdfU1lTX1NJQ1JILAorCQkgICAgICZpbS0+c3lzY29uZi5zaWNyaCk7CisjZWxzZQorCV9fcmF3X3dyaXRlbChDT05GSUdfU1lTX1NJQ1JILCAmaW0tPnN5c2NvbmYuc2ljcmgpOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX1NJQ1JMCisJX19yYXdfd3JpdGVsKENPTkZJR19TWVNfU0lDUkwsICZpbS0+c3lzY29uZi5zaWNybCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX0REUkNEUiAvKiBERFIgY29udHJvbCBkcml2ZXIgcmVnaXN0ZXIgKi8KKwlfX3Jhd193cml0ZWwoQ09ORklHX1NZU19ERFJDRFIsICZpbS0+c3lzY29uZi5kZHJjZHIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU19PQklSIC8qIE91dHB1dCBidWZmZXIgaW1wZWRhbmNlIHJlZ2lzdGVyICovCisJX19yYXdfd3JpdGVsKENPTkZJR19TWVNfT0JJUiwgJmltLT5zeXNjb25mLm9iaXIpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUUUKKwkvKiBDb25maWcgUUUgaW9wb3J0cyAqLworCWNvbmZpZ19xZV9pb3BvcnRzKCk7CisjZW5kaWYKKworCS8qCisJICogTWVtb3J5IENvbnRyb2xsZXI6CisJICovCisKKwkvKiBNYXAgYmFua3MgMCBhbmQgMSB0byB0aGUgRkxBU0ggYmFua3MgMCBhbmQgMSBhdCBwcmVsaW1pbmFyeQorCSAqIGFkZHJlc3NlcyAtIHRoZXNlIGhhdmUgdG8gYmUgbW9kaWZpZWQgbGF0ZXIgd2hlbiBGTEFTSCBzaXplCisJICogaGFzIGJlZW4gZGV0ZXJtaW5lZAorCSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSMF9QUkVMSU0pICBcCisJJiYgZGVmaW5lZChDT05GSUdfU1lTX09SMF9QUkVMSU0pIFwKKwkmJiBkZWZpbmVkKENPTkZJR19TWVNfTEJMQVdCQVIwX1BSRUxJTSkgXAorCSYmIGRlZmluZWQoQ09ORklHX1NZU19MQkxBV0FSMF9QUkVMSU0pCisJaW0tPmxidXMuYmFua1swXS5iciA9IENPTkZJR19TWVNfQlIwX1BSRUxJTTsKKwlpbS0+bGJ1cy5iYW5rWzBdLm9yID0gQ09ORklHX1NZU19PUjBfUFJFTElNOworCWltLT5zeXNjb25mLmxibGF3WzBdLmJhciA9IENPTkZJR19TWVNfTEJMQVdCQVIwX1BSRUxJTTsKKwlpbS0+c3lzY29uZi5sYmxhd1swXS5hciA9IENPTkZJR19TWVNfTEJMQVdBUjBfUFJFTElNOworI2Vsc2UKKyNlcnJvcglDT05GSUdfU1lTX0JSMF9QUkVMSU0sIENPTkZJR19TWVNfT1IwX1BSRUxJTSwgQ09ORklHX1NZU19MQkxBV0JBUjBfUFJFTElNICYgQ09ORklHX1NZU19MQkxBV0FSMF9QUkVMSU0gbXVzdCBiZSBkZWZpbmVkCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjFfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IxX1BSRUxJTSkKKwlpbS0+bGJ1cy5iYW5rWzFdLmJyID0gQ09ORklHX1NZU19CUjFfUFJFTElNOworCWltLT5sYnVzLmJhbmtbMV0ub3IgPSBDT05GSUdfU1lTX09SMV9QUkVMSU07CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTEJMQVdCQVIxX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0xCTEFXQVIxX1BSRUxJTSkKKwlpbS0+c3lzY29uZi5sYmxhd1sxXS5iYXIgPSBDT05GSUdfU1lTX0xCTEFXQkFSMV9QUkVMSU07CisJaW0tPnN5c2NvbmYubGJsYXdbMV0uYXIgPSBDT05GSUdfU1lTX0xCTEFXQVIxX1BSRUxJTTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjJfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IyX1BSRUxJTSkKKwlpbS0+bGJ1cy5iYW5rWzJdLmJyID0gQ09ORklHX1NZU19CUjJfUFJFTElNOworCWltLT5sYnVzLmJhbmtbMl0ub3IgPSBDT05GSUdfU1lTX09SMl9QUkVMSU07CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTEJMQVdCQVIyX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0xCTEFXQVIyX1BSRUxJTSkKKwlpbS0+c3lzY29uZi5sYmxhd1syXS5iYXIgPSBDT05GSUdfU1lTX0xCTEFXQkFSMl9QUkVMSU07CisJaW0tPnN5c2NvbmYubGJsYXdbMl0uYXIgPSBDT05GSUdfU1lTX0xCTEFXQVIyX1BSRUxJTTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjNfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IzX1BSRUxJTSkKKwlpbS0+bGJ1cy5iYW5rWzNdLmJyID0gQ09ORklHX1NZU19CUjNfUFJFTElNOworCWltLT5sYnVzLmJhbmtbM10ub3IgPSBDT05GSUdfU1lTX09SM19QUkVMSU07CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTEJMQVdCQVIzX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0xCTEFXQVIzX1BSRUxJTSkKKwlpbS0+c3lzY29uZi5sYmxhd1szXS5iYXIgPSBDT05GSUdfU1lTX0xCTEFXQkFSM19QUkVMSU07CisJaW0tPnN5c2NvbmYubGJsYXdbM10uYXIgPSBDT05GSUdfU1lTX0xCTEFXQVIzX1BSRUxJTTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjRfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I0X1BSRUxJTSkKKwlpbS0+bGJ1cy5iYW5rWzRdLmJyID0gQ09ORklHX1NZU19CUjRfUFJFTElNOworCWltLT5sYnVzLmJhbmtbNF0ub3IgPSBDT05GSUdfU1lTX09SNF9QUkVMSU07CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTEJMQVdCQVI0X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0xCTEFXQVI0X1BSRUxJTSkKKwlpbS0+c3lzY29uZi5sYmxhd1s0XS5iYXIgPSBDT05GSUdfU1lTX0xCTEFXQkFSNF9QUkVMSU07CisJaW0tPnN5c2NvbmYubGJsYXdbNF0uYXIgPSBDT05GSUdfU1lTX0xCTEFXQVI0X1BSRUxJTTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjVfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I1X1BSRUxJTSkKKwlpbS0+bGJ1cy5iYW5rWzVdLmJyID0gQ09ORklHX1NZU19CUjVfUFJFTElNOworCWltLT5sYnVzLmJhbmtbNV0ub3IgPSBDT05GSUdfU1lTX09SNV9QUkVMSU07CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTEJMQVdCQVI1X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0xCTEFXQVI1X1BSRUxJTSkKKwlpbS0+c3lzY29uZi5sYmxhd1s1XS5iYXIgPSBDT05GSUdfU1lTX0xCTEFXQkFSNV9QUkVMSU07CisJaW0tPnN5c2NvbmYubGJsYXdbNV0uYXIgPSBDT05GSUdfU1lTX0xCTEFXQVI1X1BSRUxJTTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjZfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I2X1BSRUxJTSkKKwlpbS0+bGJ1cy5iYW5rWzZdLmJyID0gQ09ORklHX1NZU19CUjZfUFJFTElNOworCWltLT5sYnVzLmJhbmtbNl0ub3IgPSBDT05GSUdfU1lTX09SNl9QUkVMSU07CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTEJMQVdCQVI2X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0xCTEFXQVI2X1BSRUxJTSkKKwlpbS0+c3lzY29uZi5sYmxhd1s2XS5iYXIgPSBDT05GSUdfU1lTX0xCTEFXQkFSNl9QUkVMSU07CisJaW0tPnN5c2NvbmYubGJsYXdbNl0uYXIgPSBDT05GSUdfU1lTX0xCTEFXQVI2X1BSRUxJTTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjdfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I3X1BSRUxJTSkKKwlpbS0+bGJ1cy5iYW5rWzddLmJyID0gQ09ORklHX1NZU19CUjdfUFJFTElNOworCWltLT5sYnVzLmJhbmtbN10ub3IgPSBDT05GSUdfU1lTX09SN19QUkVMSU07CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTEJMQVdCQVI3X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0xCTEFXQVI3X1BSRUxJTSkKKwlpbS0+c3lzY29uZi5sYmxhd1s3XS5iYXIgPSBDT05GSUdfU1lTX0xCTEFXQkFSN19QUkVMSU07CisJaW0tPnN5c2NvbmYubGJsYXdbN10uYXIgPSBDT05GSUdfU1lTX0xCTEFXQVI3X1BSRUxJTTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TWVNfR1BJTzFfUFJFTElNCisJaW0tPmdwaW9bMF0uZGF0ID0gQ09ORklHX1NZU19HUElPMV9EQVQ7CisJaW0tPmdwaW9bMF0uZGlyID0gQ09ORklHX1NZU19HUElPMV9ESVI7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1lTX0dQSU8yX1BSRUxJTQorCWltLT5ncGlvWzFdLmRhdCA9IENPTkZJR19TWVNfR1BJTzJfREFUOworCWltLT5ncGlvWzFdLmRpciA9IENPTkZJR19TWVNfR1BJTzJfRElSOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1VTQl9FSENJX0ZTTAorI2lmbmRlZiBDT05GSUdfTVBDODM0eAorCXVpbnQzMl90IHRlbXA7CisJc3RydWN0IHVzYl9laGNpICplaGNpID0gKHN0cnVjdCB1c2JfZWhjaSAqKUNPTkZJR19TWVNfTVBDOHh4eF9VU0JfQUREUjsKKworCS8qIENvbmZpZ3VyZSBpbnRlcmZhY2UuICovCisJc2V0Yml0c19iZTMyKCZlaGNpLT5jb250cm9sLCBSRUZTRUxfMTZNSFogfCBVVE1JX1BIWV9FTik7CisKKwkvKiBXYWl0IGZvciBjbG9jayB0byBzdGFiaWxpemUgKi8KKwlkbyB7CisJCXRlbXAgPSBfX3Jhd19yZWFkbCgmZWhjaS0+Y29udHJvbCk7CisJCXVkZWxheSgxMDAwKTsKKwl9IHdoaWxlICghKHRlbXAgJiBQSFlfQ0xLX1ZBTElEKSk7CisjZW5kaWYKKyNlbmRpZgorfQorCitpbnQgY3B1X2luaXRfciAodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUUUKKwl1aW50IHFlX2Jhc2UgPSBDT05GSUdfU1lTX0lNTVIgKyAweDAwMTAwMDAwOyAvKiBRRSBpbW1yIGJhc2UgKi8KKworCXFlX2luaXQocWVfYmFzZSk7CisJcWVfcmVzZXQoKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogUHJpbnQgb3V0IHRoZSBidXMgYXJiaXRlciBldmVudAorICovCisjaWYgZGVmaW5lZChDT05GSUdfRElTUExBWV9BRVJfRlVMTCkKK3N0YXRpYyBpbnQgcHJpbnRfODN4eF9hcmJfZXZlbnQoaW50IGZvcmNlKQoreworCXN0YXRpYyBjaGFyKiBldmVudFtdID0geworCQkiQWRkcmVzcyBUaW1lIE91dCIsCisJCSJEYXRhIFRpbWUgT3V0IiwKKwkJIkFkZHJlc3MgT25seSBUcmFuc2ZlciBUeXBlIiwKKwkJIkV4dGVybmFsIENvbnRyb2wgV29yZCBUcmFuc2ZlciBUeXBlIiwKKwkJIlJlc2VydmVkIFRyYW5zZmVyIFR5cGUiLAorCQkiVHJhbnNmZXIgRXJyb3IiLAorCQkicmVzZXJ2ZWQiLAorCQkicmVzZXJ2ZWQiCisJfTsKKwlzdGF0aWMgY2hhciogbWFzdGVyW10gPSB7CisJCSJlMzAwIENvcmUgRGF0YSBUcmFuc2FjdGlvbiIsCisJCSJyZXNlcnZlZCIsCisJCSJlMzAwIENvcmUgSW5zdHJ1Y3Rpb24gRmV0Y2giLAorCQkicmVzZXJ2ZWQiLAorCQkiVFNFQzEiLAorCQkiVFNFQzIiLAorCQkiVVNCIE1QSCIsCisJCSJVU0IgRFIiLAorCQkiRW5jcnlwdGlvbiBDb3JlIiwKKwkJIkkyQyBCb290IFNlcXVlbmNlciIsCisJCSJKVEFHIiwKKwkJInJlc2VydmVkIiwKKwkJImVTREhDIiwKKwkJIlBDSTEiLAorCQkiUENJMiIsCisJCSJETUEiLAorCQkiUVVJQ0MgRW5naW5lIDAwIiwKKwkJIlFVSUNDIEVuZ2luZSAwMSIsCisJCSJRVUlDQyBFbmdpbmUgMTAiLAorCQkiUVVJQ0MgRW5naW5lIDExIiwKKwkJInJlc2VydmVkIiwKKwkJInJlc2VydmVkIiwKKwkJInJlc2VydmVkIiwKKwkJInJlc2VydmVkIiwKKwkJIlNBVEExIiwKKwkJIlNBVEEyIiwKKwkJIlNBVEEzIiwKKwkJIlNBVEE0IiwKKwkJInJlc2VydmVkIiwKKwkJIlBDSSBFeHByZXNzIDEiLAorCQkiUENJIEV4cHJlc3MgMiIsCisJCSJURE0tRE1BQyIKKwl9OworCXN0YXRpYyBjaGFyICp0cmFuc2ZlcltdID0geworCQkiQWRkcmVzcy1vbmx5LCBDbGVhbiBCbG9jayIsCisJCSJBZGRyZXNzLW9ubHksIGx3YXJ4IHJlc2VydmF0aW9uIHNldCIsCisJCSJTaW5nbGUtYmVhdCBvciBCdXJzdCB3cml0ZSIsCisJCSJyZXNlcnZlZCIsCisJCSJBZGRyZXNzLW9ubHksIEZsdXNoIEJsb2NrIiwKKwkJInJlc2VydmVkIiwKKwkJIkJ1cnN0IHdyaXRlIiwKKwkJInJlc2VydmVkIiwKKwkJIkFkZHJlc3Mtb25seSwgc3luYyIsCisJCSJBZGRyZXNzLW9ubHksIHRsYnN5bmMiLAorCQkiU2luZ2xlLWJlYXQgb3IgQnVyc3QgcmVhZCIsCisJCSJTaW5nbGUtYmVhdCBvciBCdXJzdCByZWFkIiwKKwkJIkFkZHJlc3Mtb25seSwgS2lsbCBCbG9jayIsCisJCSJBZGRyZXNzLW9ubHksIGljYmkiLAorCQkiQnVyc3QgcmVhZCIsCisJCSJyZXNlcnZlZCIsCisJCSJBZGRyZXNzLW9ubHksIGVpZWlvIiwKKwkJInJlc2VydmVkIiwKKwkJIlNpbmdsZS1iZWF0IHdyaXRlIiwKKwkJInJlc2VydmVkIiwKKwkJImVjb3d4IC0gSWxsZWdhbCBzaW5nbGUtYmVhdCB3cml0ZSIsCisJCSJyZXNlcnZlZCIsCisJCSJyZXNlcnZlZCIsCisJCSJyZXNlcnZlZCIsCisJCSJBZGRyZXNzLW9ubHksIFRMQiBJbnZhbGlkYXRlIiwKKwkJInJlc2VydmVkIiwKKwkJIlNpbmdsZS1iZWF0IG9yIEJ1cnN0IHJlYWQiLAorCQkicmVzZXJ2ZWQiLAorCQkiZWNpd3ggLSBJbGxlZ2FsIHNpbmdsZS1iZWF0IHJlYWQiLAorCQkicmVzZXJ2ZWQiLAorCQkiQnVyc3QgcmVhZCIsCisJCSJyZXNlcnZlZCIKKwl9OworCisJaW50IGV0eXBlID0gKGdkLT5hcmJpdGVyX2V2ZW50X2F0dHJpYnV0ZXMgJiBBRUFUUl9FVkVOVCkKKwkgICAgICAgICAgICA+PiBBRUFUUl9FVkVOVF9TSElGVDsKKwlpbnQgbXN0cl9pZCA9IChnZC0+YXJiaXRlcl9ldmVudF9hdHRyaWJ1dGVzICYgQUVBVFJfTVNUUl9JRCkKKwkgICAgICAgICAgICAgID4+IEFFQVRSX01TVFJfSURfU0hJRlQ7CisJaW50IHRic3QgPSAoZ2QtPmFyYml0ZXJfZXZlbnRfYXR0cmlidXRlcyAmIEFFQVRSX1RCU1QpCisJICAgICAgICAgICA+PiBBRUFUUl9UQlNUX1NISUZUOworCWludCB0c2l6ZSA9IChnZC0+YXJiaXRlcl9ldmVudF9hdHRyaWJ1dGVzICYgQUVBVFJfVFNJWkUpCisJICAgICAgICAgICAgPj4gQUVBVFJfVFNJWkVfU0hJRlQ7CisJaW50IHR0eXBlID0gKGdkLT5hcmJpdGVyX2V2ZW50X2F0dHJpYnV0ZXMgJiBBRUFUUl9UVFlQRSkKKwkgICAgICAgICAgICA+PiBBRUFUUl9UVFlQRV9TSElGVDsKKworCWlmICghZm9yY2UgJiYgIWdkLT5hcmJpdGVyX2V2ZW50X2FkZHJlc3MpCisJCXJldHVybiAwOworCisJcHV0cygiQXJiaXRlciBFdmVudCBTdGF0dXM6XG4iKTsKKwlwcmludGYoIiAgICAgICBFdmVudCBBZGRyZXNzOiAweCUwOGxYXG4iLCBnZC0+YXJiaXRlcl9ldmVudF9hZGRyZXNzKTsKKwlwcmludGYoIiAgICAgICBFdmVudCBUeXBlOiAgICAweCUxeCAgPSAlc1xuIiwgZXR5cGUsIGV2ZW50W2V0eXBlXSk7CisJcHJpbnRmKCIgICAgICAgTWFzdGVyIElEOiAgICAgMHglMDJ4ID0gJXNcbiIsIG1zdHJfaWQsIG1hc3Rlclttc3RyX2lkXSk7CisJcHJpbnRmKCIgICAgICAgVHJhbnNmZXIgU2l6ZTogMHglMXggID0gJWQgYnl0ZXNcbiIsICh0YnN0PDwzKSB8IHRzaXplLAorCQkJCXRic3QgPyAodHNpemUgPyB0c2l6ZSA6IDgpIDogMTYgKyA4ICogdHNpemUpOworCXByaW50ZigiICAgICAgIFRyYW5zZmVyIFR5cGU6IDB4JTAyeCA9ICVzXG4iLCB0dHlwZSwgdHJhbnNmZXJbdHR5cGVdKTsKKworCXJldHVybiBnZC0+YXJiaXRlcl9ldmVudF9hZGRyZXNzOworfQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19ESVNQTEFZX0FFUl9CUklFRikKKworc3RhdGljIGludCBwcmludF84M3h4X2FyYl9ldmVudChpbnQgZm9yY2UpCit7CisJaWYgKCFmb3JjZSAmJiAhZ2QtPmFyYml0ZXJfZXZlbnRfYWRkcmVzcykKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoIkFyYml0ZXIgRXZlbnQgU3RhdHVzOiBBRUFUUj0weCUwOGxYLCBBRUFEUj0weCUwOGxYXG4iLAorCQlnZC0+YXJiaXRlcl9ldmVudF9hdHRyaWJ1dGVzLCBnZC0+YXJiaXRlcl9ldmVudF9hZGRyZXNzKTsKKworCXJldHVybiBnZC0+YXJiaXRlcl9ldmVudF9hZGRyZXNzOworfQorI2VuZGlmIC8qIENPTkZJR19ESVNQTEFZX0FFUl94eHh4ICovCisKKy8qCisgKiBGaWd1cmUgb3V0IHRoZSBjYXVzZSBvZiB0aGUgcmVzZXQKKyAqLworaW50IHBydF84M3h4X3Jzcih2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3QgeworCQl1bG9uZyBtYXNrOworCQljaGFyICpkZXNjOworCX0gYml0c1tdID0geworCQl7CisJCVJTUl9TV1NSLCAiU29mdHdhcmUgU29mdCJ9LCB7CisJCVJTUl9TV0hSLCAiU29mdHdhcmUgSGFyZCJ9LCB7CisJCVJTUl9KU1JTLCAiSlRBRyBTb2Z0In0sIHsKKwkJUlNSX0NTSFIsICJDaGVjayBTdG9wIn0sIHsKKwkJUlNSX1NXUlMsICJTb2Z0d2FyZSBXYXRjaGRvZyJ9LCB7CisJCVJTUl9CTVJTLCAiQnVzIE1vbml0b3IifSwgeworCQlSU1JfU1JTLCAgIkV4dGVybmFsL0ludGVybmFsIFNvZnQifSwgeworCQlSU1JfSFJTLCAgIkV4dGVybmFsL0ludGVybmFsIEhhcmQifQorCX07CisJc3RhdGljIGludCBuID0gc2l6ZW9mIGJpdHMgLyBzaXplb2YgYml0c1swXTsKKwl1bG9uZyByc3IgPSBnZC0+cmVzZXRfc3RhdHVzOworCWludCBpOworCWNoYXIgKnNlcDsKKworCXB1dHMoIlJlc2V0IFN0YXR1czoiKTsKKworCXNlcCA9ICIgIjsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlpZiAocnNyICYgYml0c1tpXS5tYXNrKSB7CisJCQlwcmludGYoIiVzJXMiLCBzZXAsIGJpdHNbaV0uZGVzYyk7CisJCQlzZXAgPSAiLCAiOworCQl9CisJcHV0cygiXG4iKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RJU1BMQVlfQUVSX0ZVTEwpIHx8IGRlZmluZWQoQ09ORklHX0RJU1BMQVlfQUVSX0JSSUVGKQorCXByaW50XzgzeHhfYXJiX2V2ZW50KHJzciAmIFJTUl9CTVJTKTsKKyNlbmRpZgorCXB1dHMoIlxuIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9lY2MuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9lY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzk0MmI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L2VjYy5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogRGF2ZSBMaXUgPGRhdmVsaXVAZnJlZXNjYWxlLmNvbT4KKyAqIGJhc2VkIG9uIHRoZSBjb250cmlidXRpb24gb2YgTWFyaWFuIEJhbGFrb3dpY3ogPG04QHNlbWloYWxmLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4M3h4Lmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgZGVmaW5lZChDT05GSUdfRERSX0VDQ19DTUQpCit2b2lkIGVjY19wcmludF9zdGF0dXModm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkciA9ICZpbW1hcC0+ZGRyOworCisJcHJpbnRmKCJcbkVDQyBtb2RlOiAlc1xuXG4iLAorCSAgICAgICAoZGRyLT5zZHJhbV9jZmcgJiBTRFJBTV9DRkdfRUNDX0VOKSA/ICJPTiIgOiAiT0ZGIik7CisKKwkvKiBJbnRlcnJ1cHRzICovCisJcHJpbnRmKCJNZW1vcnkgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTpcbiIpOworCXByaW50ZigiICBNdWx0aXBsZS1CaXQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZTogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NQkVFKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2ludF9lbiAmIEVDQ19FUlJfSU5UX0VOX1NCRUUpID8gMSA6IDApOworCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIEludGVycnVwdCBFbmFibGU6ICVkXG5cbiIsCisJICAgICAgIChkZHItPmVycl9pbnRfZW4gJiBFQ0NfRVJSX0lOVF9FTl9NU0VFKSA/IDEgOiAwKTsKKworCS8qIEVycm9yIGRpc2FibGUgKi8KKwlwcmludGYoIk1lbW9yeSBFcnJvciBEaXNhYmxlOlxuIik7CisJcHJpbnRmKCIgIE11bHRpcGxlLUJpdCBFcnJvciBEaXNhYmxlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2Rpc2FibGUgJiBFQ0NfRVJST1JfRElTQUJMRV9NQkVEKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgU2lubGUtQml0IEVycm9yIERpc2FibGU6ICVkXG4iLAorCSAgICAgICAoZGRyLT5lcnJfZGlzYWJsZSAmIEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQpID8gMSA6IDApOworCXByaW50ZigiICBNZW1vcnkgU2VsZWN0IEVycm9yIERpc2FibGU6ICVkXG5cbiIsCisJICAgICAgIChkZHItPmVycl9kaXNhYmxlICYgRUNDX0VSUk9SX0RJU0FCTEVfTVNFRCkgPyAxIDogMCk7CisKKwkvKiBFcnJvciBpbmplY3Rpb24gKi8KKwlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaC9Mb3c6ICUwOHggJTA4eFxuIiwKKwkgICAgICAgZGRyLT5kYXRhX2Vycl9pbmplY3RfaGksIGRkci0+ZGF0YV9lcnJfaW5qZWN0X2xvKTsKKworCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBFcnJvciBJbmplY3Rpb24gTWFzayBFQ0M6XG4iKTsKKwlwcmludGYoIiAgRUNDIE1pcnJvciBCeXRlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FTUIpID8gMSA6IDApOworCXByaW50ZigiICBFQ0MgSW5qZWN0aW9uIEVuYWJsZTogJWRcbiIsCisJICAgICAgIChkZHItPmVjY19lcnJfaW5qZWN0ICYgRUNDX0VSUl9JTkpFQ1RfRUlFTikgPyAxIDogMCk7CisJcHJpbnRmKCIgIEVDQyBFcnJvciBJbmplY3Rpb24gTWFzazogMHglMDJ4XG5cbiIsCisJICAgICAgIGRkci0+ZWNjX2Vycl9pbmplY3QgJiBFQ0NfRVJSX0lOSkVDVF9FRUlNKTsKKworCS8qIFNCRSBjb3VudGVyL3RocmVzaG9sZCAqLworCXByaW50ZigiTWVtb3J5IFNpbmdsZS1CaXQgRXJyb3IgTWFuYWdlbWVudCAoMC4uMjU1KTpcbiIpOworCXByaW50ZigiICBTaW5nbGUtQml0IEVycm9yIFRocmVzaG9sZDogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9zYmUgJiBFQ0NfRVJST1JfTUFOX1NCRVQpID4+IEVDQ19FUlJPUl9NQU5fU0JFVF9TSElGVCk7CisJcHJpbnRmKCIgIFNpbmdsZS1CaXQgRXJyb3IgQ291bnRlcjogJWRcblxuIiwKKwkgICAgICAgKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFQykgPj4gRUNDX0VSUk9SX01BTl9TQkVDX1NISUZUKTsKKworCS8qIEVycm9yIGRldGVjdCAqLworCXByaW50ZigiTWVtb3J5IEVycm9yIERldGVjdDpcbiIpOworCXByaW50ZigiICBNdWx0aXBsZSBNZW1vcnkgRXJyb3JzOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTU1FKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgTXVsdGlwbGUtQml0IEVycm9yOiAlZFxuIiwKKwkgICAgICAgKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTUJFKSA/IDEgOiAwKTsKKwlwcmludGYoIiAgU2luZ2xlLUJpdCBFcnJvcjogJWRcbiIsCisJICAgICAgIChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX1NCRSkgPyAxIDogMCk7CisJcHJpbnRmKCIgIE1lbW9yeSBTZWxlY3QgRXJyb3I6ICVkXG5cbiIsCisJICAgICAgIChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01TRSkgPyAxIDogMCk7CisKKwkvKiBDYXB0dXJlIGRhdGEgKi8KKwlwcmludGYoIk1lbW9yeSBFcnJvciBBZGRyZXNzIENhcHR1cmU6IDB4JTA4eFxuIiwgZGRyLT5jYXB0dXJlX2FkZHJlc3MpOworCXByaW50ZigiTWVtb3J5IERhdGEgUGF0aCBSZWFkIENhcHR1cmUgSGlnaC9Mb3c6ICUwOHggJTA4eFxuIiwKKwkgICAgICAgZGRyLT5jYXB0dXJlX2RhdGFfaGksIGRkci0+Y2FwdHVyZV9kYXRhX2xvKTsKKwlwcmludGYoIk1lbW9yeSBEYXRhIFBhdGggUmVhZCBDYXB0dXJlIEVDQzogMHglMDJ4XG5cbiIsCisJICAgICAgIGRkci0+Y2FwdHVyZV9lY2MgJiBDQVBUVVJFX0VDQ19FQ0UpOworCisJcHJpbnRmKCJNZW1vcnkgRXJyb3IgQXR0cmlidXRlcyBDYXB0dXJlOlxuIik7CisJcHJpbnRmKCIgRGF0YSBCZWF0IE51bWJlcjogJWRcbiIsCisJICAgICAgIChkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfQk5VTSkgPj4KKwkgICAgICAgRUNDX0NBUFRfQVRUUl9CTlVNX1NISUZUKTsKKwlwcmludGYoIiAgVHJhbnNhY3Rpb24gU2l6ZTogJWRcbiIsCisJICAgICAgIChkZHItPmNhcHR1cmVfYXR0cmlidXRlcyAmIEVDQ19DQVBUX0FUVFJfVFNJWikgPj4KKwkgICAgICAgRUNDX0NBUFRfQVRUUl9UU0laX1NISUZUKTsKKwlwcmludGYoIiAgVHJhbnNhY3Rpb24gU291cmNlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UU1JDKSA+PgorCSAgICAgICBFQ0NfQ0FQVF9BVFRSX1RTUkNfU0hJRlQpOworCXByaW50ZigiICBUcmFuc2FjdGlvbiBUeXBlOiAlZFxuIiwKKwkgICAgICAgKGRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzICYgRUNDX0NBUFRfQVRUUl9UVFlQKSA+PgorCSAgICAgICBFQ0NfQ0FQVF9BVFRSX1RUWVBfU0hJRlQpOworCXByaW50ZigiICBFcnJvciBJbmZvcm1hdGlvbiBWYWxpZDogJWRcblxuIiwKKwkgICAgICAgZGRyLT5jYXB0dXJlX2F0dHJpYnV0ZXMgJiBFQ0NfQ0FQVF9BVFRSX1ZMRCk7Cit9CisKK2ludCBkb19lY2MoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGRkcjgzeHhfdCAqZGRyID0gJmltbWFwLT5kZHI7CisJdm9sYXRpbGUgdTMyIHZhbDsKKwl1NjQgKmFkZHI7CisJdTMyIGNvdW50OworCXJlZ2lzdGVyIHU2NCAqaTsKKwl1MzIgcmV0WzJdOworCXUzMiBwYXR0ZXJuWzJdOworCXUzMiB3cml0ZWJhY2tbMl07CisKKwkvKiBUaGUgcGF0dGVybiBpcyB3cml0dGVuIGludG8gbWVtb3J5IHRvIGdlbmVyYXRlIGVycm9yICovCisJcGF0dGVyblswXSA9IDB4ZmVkY2JhOThVTDsKKwlwYXR0ZXJuWzFdID0gMHg3NjU0MzIxMFVMOworCisJLyogQWZ0ZXIgaW5qZWN0aW5nIGVycm9yLCByZS1pbml0aWFsaXplIHRoZSBtZW1vcnkgd2l0aCB0aGUgdmFsdWUgKi8KKwl3cml0ZWJhY2tbMF0gPSAweDAxMjM0NTY3VUw7CisJd3JpdGViYWNrWzFdID0gMHg4OWFiY2RlZlVMOworCisJaWYgKGFyZ2MgPiA0KSB7CisJCWNtZF91c2FnZShjbWR0cCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChhcmdjID09IDIpIHsKKwkJaWYgKHN0cmNtcChhcmd2WzFdLCAic3RhdHVzIikgPT0gMCkgeworCQkJZWNjX3ByaW50X3N0YXR1cygpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJjYXB0dXJlY2xlYXIiKSA9PSAwKSB7CisJCQlkZHItPmNhcHR1cmVfYWRkcmVzcyA9IDA7CisJCQlkZHItPmNhcHR1cmVfZGF0YV9oaSA9IDA7CisJCQlkZHItPmNhcHR1cmVfZGF0YV9sbyA9IDA7CisJCQlkZHItPmNhcHR1cmVfZWNjID0gMDsKKwkJCWRkci0+Y2FwdHVyZV9hdHRyaWJ1dGVzID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChhcmdjID09IDMpIHsKKwkJaWYgKHN0cmNtcChhcmd2WzFdLCAic2JlY250IikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOworCQkJaWYgKHZhbCA+IDI1NSkgeworCQkJCXByaW50ZigiSW5jb3JyZWN0IENvdW50ZXIgdmFsdWUsICIKKwkJCQkgICAgICAgInNob3VsZCBiZSAwLi4yNTVcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQl2YWwgPSAodmFsIDw8IEVDQ19FUlJPUl9NQU5fU0JFQ19TSElGVCk7CisJCQl2YWwgfD0gKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFVCk7CisKKwkJCWRkci0+ZXJyX3NiZSA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAic2JldGhyIikgPT0gMCkgeworCQkJdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTApOworCQkJaWYgKHZhbCA+IDI1NSkgeworCQkJCXByaW50ZigiSW5jb3JyZWN0IENvdW50ZXIgdmFsdWUsICIKKwkJCQkgICAgICAgInNob3VsZCBiZSAwLi4yNTVcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQl2YWwgPSAodmFsIDw8IEVDQ19FUlJPUl9NQU5fU0JFVF9TSElGVCk7CisJCQl2YWwgfD0gKGRkci0+ZXJyX3NiZSAmIEVDQ19FUlJPUl9NQU5fU0JFQyk7CisKKwkJCWRkci0+ZXJyX3NiZSA9IHZhbDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiZXJyZGlzYWJsZSIpID09IDApIHsKKwkJCXZhbCA9IGRkci0+ZXJyX2Rpc2FibGU7CisKKwkJCWlmIChzdHJjbXAoYXJndlsyXSwgIitzYmUiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ESVNBQkxFX1NCRUQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiK21iZSIpID09IDApIHsKKwkJCQl2YWwgfD0gRUNDX0VSUk9SX0RJU0FCTEVfTUJFRDsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICIrbXNlIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfRElTQUJMRV9NU0VEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIithbGwiKSA9PSAwKSB7CisJCQkJdmFsIHw9IChFQ0NfRVJST1JfRElTQUJMRV9TQkVEIHwKKwkJCQkJRUNDX0VSUk9SX0RJU0FCTEVfTUJFRCB8CisJCQkJCUVDQ19FUlJPUl9ESVNBQkxFX01TRUQpOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1zYmUiKSA9PSAwKSB7CisJCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9TQkVEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1tYmUiKSA9PSAwKSB7CisJCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9NQkVEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1tc2UiKSA9PSAwKSB7CisJCQkJdmFsICY9IH5FQ0NfRVJST1JfRElTQUJMRV9NU0VEOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIi1hbGwiKSA9PSAwKSB7CisJCQkJdmFsICY9IH4oRUNDX0VSUk9SX0RJU0FCTEVfU0JFRCB8CisJCQkJCSBFQ0NfRVJST1JfRElTQUJMRV9NQkVEIHwKKwkJCQkJIEVDQ19FUlJPUl9ESVNBQkxFX01TRUQpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIkluY29ycmVjdCBlcnJfZGlzYWJsZSBmaWVsZFxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCWRkci0+ZXJyX2Rpc2FibGUgPSB2YWw7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImVycmRldGVjdGNsciIpID09IDApIHsKKwkJCXZhbCA9IGRkci0+ZXJyX2RldGVjdDsKKworCQkJaWYgKHN0cmNtcChhcmd2WzJdLCAibW1lIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01NRTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJzYmUiKSA9PSAwKSB7CisJCQkJdmFsIHw9IEVDQ19FUlJPUl9ERVRFQ1RfU0JFOworCQkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsyXSwgIm1iZSIpID09IDApIHsKKwkJCQl2YWwgfD0gRUNDX0VSUk9SX0RFVEVDVF9NQkU7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAibXNlIikgPT0gMCkgeworCQkJCXZhbCB8PSBFQ0NfRVJST1JfREVURUNUX01TRTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJhbGwiKSA9PSAwKSB7CisJCQkJdmFsIHw9IChFQ0NfRVJST1JfREVURUNUX01NRSB8CisJCQkJCUVDQ19FUlJPUl9ERVRFQ1RfTUJFIHwKKwkJCQkJRUNDX0VSUk9SX0RFVEVDVF9TQkUgfAorCQkJCQlFQ0NfRVJST1JfREVURUNUX01TRSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiSW5jb3JyZWN0IGVycl9kZXRlY3QgZmllbGRcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQlkZHItPmVycl9kZXRlY3QgPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGRhdGFoaSIpID09IDApIHsKKwkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfaGkgPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGRhdGFsbyIpID09IDApIHsKKwkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCQkJZGRyLT5kYXRhX2Vycl9pbmplY3RfbG8gPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdGVjYyIpID09IDApIHsKKwkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwkJCWlmICh2YWwgPiAweGZmKSB7CisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgRUNDIGluamVjdCBtYXNrLCAiCisJCQkJICAgICAgICJzaG91bGQgYmUgMHgwMC4uMHhmZlxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQl2YWwgfD0gKGRkci0+ZWNjX2Vycl9pbmplY3QgJiB+RUNDX0VSUl9JTkpFQ1RfRUVJTSk7CisKKwkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImluamVjdCIpID09IDApIHsKKwkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7CisKKwkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKKwkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzJdLCAiZGlzIikgPT0gMCkKKwkJCQl2YWwgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47CisJCQllbHNlCisJCQkJcHJpbnRmKCJJbmNvcnJlY3QgY29tbWFuZFxuIik7CisKKwkJCWRkci0+ZWNjX2Vycl9pbmplY3QgPSB2YWw7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oImlzeW5jIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIm1pcnJvciIpID09IDApIHsKKwkJCXZhbCA9IGRkci0+ZWNjX2Vycl9pbmplY3Q7CisKKwkJCWlmIChzdHJjbXAoYXJndlsyXSwgImVuIikgPT0gMCkKKwkJCQl2YWwgfD0gRUNDX0VSUl9JTkpFQ1RfRU1COworCQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMl0sICJkaXMiKSA9PSAwKQorCQkJCXZhbCAmPSB+RUNDX0VSUl9JTkpFQ1RfRU1COworCQkJZWxzZQorCQkJCXByaW50ZigiSW5jb3JyZWN0IGNvbW1hbmRcbiIpOworCisJCQlkZHItPmVjY19lcnJfaW5qZWN0ID0gdmFsOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKGFyZ2MgPT0gNCkgeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJ0ZXN0ZHciKSA9PSAwKSB7CisJCQlhZGRyID0gKHU2NCAqKSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisJCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKworCQkJaWYgKCh1MzIpIGFkZHIgJSA4KSB7CisJCQkJcHJpbnRmKCJBZGRyZXNzIG5vdCBhbGxpZ25lZCBvbiAiCisJCQkJICAgICAgICJkb3VibGUgd29yZCBib3VuZGFyeVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCQkJZm9yIChpID0gYWRkcjsgaSA8IGFkZHIgKyBjb3VudDsgaSsrKSB7CisKKwkJCQkvKiBlbmFibGUgaW5qZWN0cyAqLworCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOworCisJCQkJLyogd3JpdGUgbWVtb3J5IGxvY2F0aW9uIGluamVjdGluZyBlcnJvcnMgKi8KKwkJCQlwcGNEV3N0b3JlKCh1MzIgKikgaSwgcGF0dGVybik7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKworCQkJCS8qIGRpc2FibGUgaW5qZWN0cyAqLworCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKKworCQkJCS8qIHJlYWQgZGF0YSwgdGhpcyBnZW5lcmF0ZXMgRUNDIGVycm9yICovCisJCQkJcHBjRFdsb2FkKCh1MzIgKikgaSwgcmV0KTsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCisJCQkJLyogcmUtaW5pdGlhbGl6ZSBtZW1vcnksIGRvdWJsZSB3b3JkIHdyaXRlIHRoZSBsb2NhdGlvbiBhZ2FpbiwKKwkJCQkgKiBnZW5lcmF0ZXMgbmV3IEVDQyBjb2RlIHRoaXMgdGltZSAqLworCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCB3cml0ZWJhY2spOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQl9CisJCQllbmFibGVfaW50ZXJydXB0cygpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHN0cmNtcChhcmd2WzFdLCAidGVzdHdvcmQiKSA9PSAwKSB7CisJCQlhZGRyID0gKHU2NCAqKSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisJCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKworCQkJaWYgKCh1MzIpIGFkZHIgJSA4KSB7CisJCQkJcHJpbnRmKCJBZGRyZXNzIG5vdCBhbGxpZ25lZCBvbiAiCisJCQkJICAgICAgICJkb3VibGUgd29yZCBib3VuZGFyeVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCQkJZm9yIChpID0gYWRkcjsgaSA8IGFkZHIgKyBjb3VudDsgaSsrKSB7CisKKwkJCQkvKiBlbmFibGUgaW5qZWN0cyAqLworCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgfD0gRUNDX0VSUl9JTkpFQ1RfRUlFTjsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3luYyIpOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJpc3luYyIpOworCisJCQkJLyogd3JpdGUgbWVtb3J5IGxvY2F0aW9uIGluamVjdGluZyBlcnJvcnMgKi8KKwkJCQkqKHUzMiAqKSBpID0gMHhmZWRjYmE5OFVMOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisKKwkJCQkvKiBzdWIgZG91YmxlIHdvcmQgd3JpdGUsCisJCQkJICogYnVzIHdpbGwgcmVhZC1tb2RpZnktd3JpdGUsCisJCQkJICogZ2VuZXJhdGVzIEVDQyBlcnJvciAqLworCQkJCSooKHUzMiAqKSBpICsgMSkgPSAweDc2NTQzMjEwVUw7CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKworCQkJCS8qIGRpc2FibGUgaW5qZWN0cyAqLworCQkJCWRkci0+ZWNjX2Vycl9pbmplY3QgJj0gfkVDQ19FUlJfSU5KRUNUX0VJRU47CisJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaXN5bmMiKTsKKworCQkJCS8qIHJlLWluaXRpYWxpemUgbWVtb3J5LAorCQkJCSAqIGRvdWJsZSB3b3JkIHdyaXRlIHRoZSBsb2NhdGlvbiBhZ2FpbiwKKwkJCQkgKiBnZW5lcmF0ZXMgbmV3IEVDQyBjb2RlIHRoaXMgdGltZSAqLworCQkJCXBwY0RXc3RvcmUoKHUzMiAqKSBpLCB3cml0ZWJhY2spOworCQkJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7CisJCQl9CisJCQllbmFibGVfaW50ZXJydXB0cygpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJY21kX3VzYWdlKGNtZHRwKTsKKwlyZXR1cm4gMTsKK30KKworVV9CT09UX0NNRChlY2MsIDQsIDAsIGRvX2VjYywKKwkgICAic3VwcG9ydCBmb3IgRERSIEVDQyBmZWF0dXJlcyIsCisJICAgInN0YXR1cyAgICAgICAgICAgICAgLSBwcmludCBvdXQgc3RhdHVzIGluZm9cbiIKKwkgICAiZWNjIGNhcHR1cmVjbGVhciAgICAgICAgLSBjbGVhciBjYXB0dXJlIHJlZ3MgZGF0YVxuIgorCSAgICJlY2Mgc2JlY250IDx2YWw+ICAgICAgICAtIHNldCBTaW5nbGUtQml0IEVycm9yIGNvdW50ZXJcbiIKKwkgICAiZWNjIHNiZXRociA8dmFsPiAgICAgICAgLSBzZXQgU2luZ2xlLUJpdCBUaHJlc2hvbGRcbiIKKwkgICAiZWNjIGVycmRpc2FibGUgPGZsYWc+ICAgLSBjbGVhci9zZXQgZGlzYWJsZSBNZW1vcnkgRXJyb3IgRGlzYWJsZSwgZmxhZzpcbiIKKwkgICAiICBbLXwrXXNiZSAtIFNpbmdsZS1CaXQgRXJyb3JcbiIKKwkgICAiICBbLXwrXW1iZSAtIE11bHRpcGxlLUJpdCBFcnJvclxuIgorCSAgICIgIFstfCtdbXNlIC0gTWVtb3J5IFNlbGVjdCBFcnJvclxuIgorCSAgICIgIFstfCtdYWxsIC0gYWxsIGVycm9yc1xuIgorCSAgICJlY2MgZXJyZGV0ZWN0Y2xyIDxmbGFnPiAtIGNsZWFyIE1lbW9yeSBFcnJvciBEZXRlY3QsIGZsYWc6XG4iCisJICAgIiAgbW1lIC0gTXVsdGlwbGUgTWVtb3J5IEVycm9yc1xuIgorCSAgICIgIHNiZSAtIFNpbmdsZS1CaXQgRXJyb3JcbiIKKwkgICAiICBtYmUgLSBNdWx0aXBsZS1CaXQgRXJyb3JcbiIKKwkgICAiICBtc2UgLSBNZW1vcnkgU2VsZWN0IEVycm9yXG4iCisJICAgIiAgYWxsIC0gYWxsIGVycm9yc1xuIgorCSAgICJlY2MgaW5qZWN0ZGF0YWhpIDxoaT4gIC0gc2V0IE1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgSGlnaFxuIgorCSAgICJlY2MgaW5qZWN0ZGF0YWxvIDxsbz4gIC0gc2V0IE1lbW9yeSBEYXRhIFBhdGggRXJyb3IgSW5qZWN0aW9uIE1hc2sgTG93XG4iCisJICAgImVjYyBpbmplY3RlY2MgPGVjYz4gICAgLSBzZXQgRUNDIEVycm9yIEluamVjdGlvbiBNYXNrXG4iCisJICAgImVjYyBpbmplY3QgPGVufGRpcz4gICAgLSBlbmFibGUvZGlzYWJsZSBlcnJvciBpbmplY3Rpb25cbiIKKwkgICAiZWNjIG1pcnJvciA8ZW58ZGlzPiAgICAtIGVuYWJsZS9kaXNhYmxlIG1pcnJvciBieXRlXG4iCisJICAgImVjYyB0ZXN0ZHcgPGFkZHI+IDxjbnQ+ICAtIHRlc3QgbWVtIHJlZ2lvbiB3aXRoIGRvdWJsZSB3b3JkIGFjY2VzczpcbiIKKwkgICAiICAtIGVuYWJsZXMgaW5qZWN0c1xuIgorCSAgICIgIC0gd3JpdGVzIHBhdHRlcm4gaW5qZWN0aW5nIGVycm9ycyB3aXRoIGRvdWJsZSB3b3JkIGFjY2Vzc1xuIgorCSAgICIgIC0gZGlzYWJsZXMgaW5qZWN0c1xuIgorCSAgICIgIC0gcmVhZHMgcGF0dGVybiBiYWNrIHdpdGggZG91YmxlIHdvcmQgYWNjZXNzLCBnZW5lcmF0ZXMgZXJyb3JcbiIKKwkgICAiICAtIHJlLWluaXRzIG1lbW9yeVxuIgorCSAgICJlY2MgdGVzdHdvcmQgPGFkZHI+IDxjbnQ+ICAtIHRlc3QgbWVtIHJlZ2lvbiB3aXRoIHdvcmQgYWNjZXNzOlxuIgorCSAgICIgIC0gZW5hYmxlcyBpbmplY3RzXG4iCisJICAgIiAgLSB3cml0ZXMgcGF0dGVybiBpbmplY3RpbmcgZXJyb3JzIHdpdGggd29yZCBhY2Nlc3NcbiIKKwkgICAiICAtIHdyaXRlcyBwYXR0ZXJuIHdpdGggd29yZCBhY2Nlc3MsIGdlbmVyYXRlcyBlcnJvclxuIgorCSAgICIgIC0gZGlzYWJsZXMgaW5qZWN0c1xuIiAiICAtIHJlLWluaXRzIG1lbW9yeSIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvZmR0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvZmR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmNzNhNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9mZHQuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworZXh0ZXJuIHZvaWQgZnRfcWVfc2V0dXAodm9pZCAqYmxvYik7CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVENPVU5UX0xJTUlUKSAmJiBkZWZpbmVkKENPTkZJR19NUEM4MzYwKQorI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgorCit2b2lkIGZkdF9maXh1cF9tdXJhbSAodm9pZCAqYmxvYikKK3sKKwl1bG9uZyBkYXRhWzJdOworCisJZGF0YVswXSA9IDA7CisJZGF0YVsxXSA9IFFFX01VUkFNX1NJWkUgLSAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCWRvX2ZpeHVwX2J5X2NvbXBhdChibG9iLCAiZnNsLHFlLW11cmFtLWRhdGEiLCAicmVnIiwKKwkJCWRhdGEsIHNpemVvZiAoZGF0YSksIDApOworfQorI2VuZGlmCisKK3ZvaWQgZnRfY3B1X3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCWltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwlpbnQgc3ByaWRyID0gaW1tci0+c3lzY29uZi5zcHJpZHI7CisKKwkvKgorCSAqIGRlbGV0ZSBjcnlwdG8gbm9kZSBpZiBub3Qgb24gYW4gRS1wcm9jZXNzb3IKKwkgKiBpbml0aWFsIHJldmlzaW9ucyBvZiB0aGUgTVBDODM0eEUvNnhFIGhhdmUgdGhlIG9yaWdpbmFsIFNFQyAyLjAuCisJICogRUEgcmV2aXNpb25zIGdvdCB0aGUgU0VDIHVwcmV2dmVkIHRvIDIuNCBidXQgc2luY2UgdGhlIGRlZmF1bHQgZGV2aWNlCisJICogdHJlZSBjb250YWlucyBTRUMgMi4wIHByb3BlcnRpZXMgd2UgdXByZXYgdGhlbSBoZXJlLgorCSAqLworCWlmICghSVNfRV9QUk9DRVNTT1Ioc3ByaWRyKSkKKwkJZmR0X2ZpeHVwX2NyeXB0b19ub2RlKGJsb2IsIDApOworCWVsc2UgaWYgKElTX0VfUFJPQ0VTU09SKHNwcmlkcikgJiYKKwkJIChTUFJfRkFNSUxZKHNwcmlkcikgPT0gU1BSXzgzNFhfRkFNSUxZIHx8CisJCSAgU1BSX0ZBTUlMWShzcHJpZHIpID09IFNQUl84MzZYX0ZBTUlMWSkgJiYKKwkJIFJFVklEX01BSk9SKHNwcmlkcikgPj0gMikKKwkJZmR0X2ZpeHVwX2NyeXB0b19ub2RlKGJsb2IsIDB4MDIwNCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19IQVNfRVRIMCkgfHwgZGVmaW5lZChDT05GSUdfSEFTX0VUSDEpIHx8XAorICAgIGRlZmluZWQoQ09ORklHX0hBU19FVEgyKSB8fCBkZWZpbmVkKENPTkZJR19IQVNfRVRIMykgfHxcCisgICAgZGVmaW5lZChDT05GSUdfSEFTX0VUSDQpIHx8IGRlZmluZWQoQ09ORklHX0hBU19FVEg1KQorCWZkdF9maXh1cF9ldGhlcm5ldChibG9iKTsKKyNpZmRlZiBDT05GSUdfTVBDODMxMworCS8qCisJKiBtcGM4MzEzZSBlcnJhdHVtIElQSUMxIHN3YXBwZWQgVFNFQyBpbnRlcnJ1cHQgSUQgbnVtYmVycyBvbiByZXYuIDEKKwkqIGgvdyAoc2VlIEFOMzU0NSkuICBUaGUgYmFzZSBkZXZpY2UgdHJlZSBpbiB1c2UgaGFzIHJldi4gMSBJRCBudW1iZXJzLAorCSogc28gaWYgb24gUmV2LiAyIChhbmQgaGlnaGVyKSBoL3csIHdlIGZpeCB0aGVtIHVwIGhlcmUKKwkqLworCWlmIChSRVZJRF9NQUpPUihpbW1yLT5zeXNjb25mLnNwcmlkcikgPj0gMikgeworCQlpbnQgbm9kZW9mZnNldCwgcGF0aDsKKwkJY29uc3QgY2hhciAqcHJvcDsKKworCQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0KGJsb2IsICIvYWxpYXNlcyIpOworCQlpZiAobm9kZW9mZnNldCA+PSAwKSB7CisjaWYgZGVmaW5lZChDT05GSUdfSEFTX0VUSDApCisJCQlwcm9wID0gZmR0X2dldHByb3AoYmxvYiwgbm9kZW9mZnNldCwgImV0aGVybmV0MCIsIE5VTEwpOworCQkJaWYgKHByb3ApIHsKKwkJCQl1MzIgdG1wW10gPSB7IDMyLCAweDgsIDMzLCAweDgsIDM0LCAweDggfTsKKworCQkJCXBhdGggPSBmZHRfcGF0aF9vZmZzZXQoYmxvYiwgcHJvcCk7CisJCQkJcHJvcCA9IGZkdF9nZXRwcm9wKGJsb2IsIHBhdGgsICJpbnRlcnJ1cHRzIiwgMCk7CisJCQkJaWYgKHByb3ApCisJCQkJCWZkdF9zZXRwcm9wKGJsb2IsIHBhdGgsICJpbnRlcnJ1cHRzIiwKKwkJCQkJCSAgICAmdG1wLCBzaXplb2YodG1wKSk7CisJCQl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19IQVNfRVRIMSkKKwkJCXByb3AgPSBmZHRfZ2V0cHJvcChibG9iLCBub2Rlb2Zmc2V0LCAiZXRoZXJuZXQxIiwgTlVMTCk7CisJCQlpZiAocHJvcCkgeworCQkJCXUzMiB0bXBbXSA9IHsgMzUsIDB4OCwgMzYsIDB4OCwgMzcsIDB4OCB9OworCisJCQkJcGF0aCA9IGZkdF9wYXRoX29mZnNldChibG9iLCBwcm9wKTsKKwkJCQlwcm9wID0gZmR0X2dldHByb3AoYmxvYiwgcGF0aCwgImludGVycnVwdHMiLCAwKTsKKwkJCQlpZiAocHJvcCkKKwkJCQkJZmR0X3NldHByb3AoYmxvYiwgcGF0aCwgImludGVycnVwdHMiLAorCQkJCQkJICAgICZ0bXAsIHNpemVvZih0bXApKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorI2VuZGlmCisjZW5kaWYKKworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LAorCQkidGltZWJhc2UtZnJlcXVlbmN5IiwgKGJkLT5iaV9idXNmcmVxIC8gNCksIDEpOworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LAorCQkiYnVzLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKwlkb19maXh1cF9ieV9wcm9wX3UzMihibG9iLCAiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNCwKKwkJImNsb2NrLWZyZXF1ZW5jeSIsIGdkLT5jb3JlX2NsaywgMSk7CisJZG9fZml4dXBfYnlfcHJvcF91MzIoYmxvYiwgImRldmljZV90eXBlIiwgInNvYyIsIDQsCisJCSJidXMtZnJlcXVlbmN5IiwgYmQtPmJpX2J1c2ZyZXEsIDEpOworCWRvX2ZpeHVwX2J5X2NvbXBhdF91MzIoYmxvYiwgImZzbCxzb2MiLAorCQkiYnVzLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKwlkb19maXh1cF9ieV9jb21wYXRfdTMyKGJsb2IsICJmc2wsc29jIiwKKwkJImNsb2NrLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKwlkb19maXh1cF9ieV9jb21wYXRfdTMyKGJsb2IsICJmc2wsaW1tciIsCisJCSJidXMtZnJlcXVlbmN5IiwgYmQtPmJpX2J1c2ZyZXEsIDEpOworCWRvX2ZpeHVwX2J5X2NvbXBhdF91MzIoYmxvYiwgImZzbCxpbW1yIiwKKwkJImNsb2NrLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKyNpZmRlZiBDT05GSUdfUUUKKwlmdF9xZV9zZXR1cChibG9iKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NZU19OUzE2NTUwCisJZG9fZml4dXBfYnlfY29tcGF0X3UzMihibG9iLCAibnMxNjU1MCIsCisJCSJjbG9jay1mcmVxdWVuY3kiLCBDT05GSUdfU1lTX05TMTY1NTBfQ0xLLCAxKTsKKyNlbmRpZgorCisJZmR0X2ZpeHVwX21lbW9yeShibG9iLCAodTY0KWJkLT5iaV9tZW1zdGFydCwgKHU2NCliZC0+YmlfbWVtc2l6ZSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UQ09VTlRfTElNSVQpCisJZmR0X2ZpeHVwX211cmFtIChibG9iKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L2ludGVycnVwdHMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmZmJhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxtcGM4M3h4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworc3RydWN0IGlycV9hY3Rpb24geworCWludGVycnVwdF9oYW5kbGVyX3QgKmhhbmRsZXI7CisJdm9pZCAqYXJnOworCXVsb25nIGNvdW50OworfTsKKworaW50IGludGVycnVwdF9pbml0X2NwdSAodW5zaWduZWQgKmRlY3JlbWVudGVyX2NvdW50KQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisKKwkqZGVjcmVtZW50ZXJfY291bnQgPSAoZ2QtPmJ1c19jbGsgLyA0KSAvIENPTkZJR19TWVNfSFo7CisKKwkvKiBFbmFibGUgZTMwMCB0aW1lIGJhc2UgKi8KKworCWltbXItPnN5c2NvbmYuc3BjciB8PSAweDAwNDAwMDAwOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEhhbmRsZSBleHRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KKwordm9pZCBleHRlcm5hbF9pbnRlcnJ1cHQgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworfQorCisKKy8qCisgKiBJbnN0YWxsIGFuZCBmcmVlIGFuIGludGVycnVwdCBoYW5kbGVyLgorICovCisKK3ZvaWQKK2lycV9pbnN0YWxsX2hhbmRsZXIgKGludCBpcnEsIGludGVycnVwdF9oYW5kbGVyX3QgKiBoYW5kbGVyLCB2b2lkICphcmcpCit7Cit9CisKKwordm9pZCBpcnFfZnJlZV9oYW5kbGVyIChpbnQgaXJxKQoreworfQorCisKK3ZvaWQgdGltZXJfaW50ZXJydXB0X2NwdSAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogbm90aGluZyB0byBkbyBoZXJlICovCisJcmV0dXJuOworfQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQorCisvKiByaXBwZWQgdGhpcyBvdXQgb2YgcHBjNHh4L2ludGVycnVwdHMuYyAqLworCisvKgorICogaXJxaW5mbyAtIHByaW50IGluZm9ybWF0aW9uIGFib3V0IFBDSSBkZXZpY2VzCisgKi8KKwordm9pZAorZG9faXJxaW5mbyhjbWRfdGJsX3QgKmNtZHRwLCBiZF90ICpiZCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L25hbmRfaW5pdC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L25hbmRfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTE0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvbmFuZF9pbml0LmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4M3h4Lmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisvKgorICogQnJlYXRoZSBzb21lIGxpZmUgaW50byB0aGUgQ1BVLi4uCisgKgorICogU2V0IHVwIHRoZSBtZW1vcnkgbWFwLAorICogaW5pdGlhbGl6ZSBhIGJ1bmNoIG9mIHJlZ2lzdGVycywKKyAqIGluaXRpYWxpemUgdGhlIFVQTSdzCisgKi8KK3ZvaWQgY3B1X2luaXRfZiAodm9sYXRpbGUgaW1tYXBfdCAqIGltKQoreworCWludCBpOworCisJLyogUG9pbnRlciBpcyB3cml0YWJsZSBzaW5jZSB3ZSBhbGxvY2F0ZWQgYSByZWdpc3RlciBmb3IgaXQgKi8KKwlnZCA9IChnZF90ICopIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgKyBDT05GSUdfU1lTX0dCTF9EQVRBX09GRlNFVCk7CisKKwkvKiBDbGVhciBpbml0aWFsIGdsb2JhbCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihnZF90KTsgaSsrKQorCQkoKGNoYXIgKilnZClbaV0gPSAwOworCisJLyogc3lzdGVtIHBlcmZvcm1hbmNlIHR3ZWFraW5nICovCisKKyNpZmRlZiBDT05GSUdfU1lTX0FDUl9QSVBFX0RFUAorCS8qIEFyYml0ZXIgcGlwZWxpbmUgZGVwdGggKi8KKwlpbS0+YXJiaXRlci5hY3IgPSAoaW0tPmFyYml0ZXIuYWNyICYgfkFDUl9QSVBFX0RFUCkgfAorCQkJICAoQ09ORklHX1NZU19BQ1JfUElQRV9ERVAgPDwgQUNSX1BJUEVfREVQX1NISUZUKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NZU19BQ1JfUlBUQ05UCisJLyogQXJiaXRlciByZXBlYXQgY291bnQgKi8KKwlpbS0+YXJiaXRlci5hY3IgPSAoaW0tPmFyYml0ZXIuYWNyICYgfihBQ1JfUlBUQ05UKSkgfAorCQkJICAoQ09ORklHX1NZU19BQ1JfUlBUQ05UIDw8IEFDUl9SUFRDTlRfU0hJRlQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1lTX1NQQ1JfT1BUCisJLyogT3B0aW1pemUgdHJhbnNhY3Rpb25zIGJldHdlZW4gQ1NCIGFuZCBvdGhlciBkZXZpY2VzICovCisJaW0tPnN5c2NvbmYuc3BjciA9IChpbS0+c3lzY29uZi5zcGNyICYgflNQQ1JfT1BUKSB8CisJCQkgICAoQ09ORklHX1NZU19TUENSX09QVCA8PCBTUENSX09QVF9TSElGVCk7CisjZW5kaWYKKworCS8qIEVuYWJsZSBUaW1lIEJhc2UgJiBEZWNyaW1lbnRlciAoc28gd2Ugd2lsbCBoYXZlIHVkZWxheSgpKSAqLworCWltLT5zeXNjb25mLnNwY3IgfD0gU1BDUl9UQkVOOworCisJLyogRERSIGNvbnRyb2wgZHJpdmVyIHJlZ2lzdGVyICovCisjaWZkZWYgQ09ORklHX1NZU19ERFJDRFIKKwlpbS0+c3lzY29uZi5kZHJjZHIgPSBDT05GSUdfU1lTX0REUkNEUjsKKyNlbmRpZgorCS8qIE91dHB1dCBidWZmZXIgaW1wZWRhbmNlIHJlZ2lzdGVyICovCisjaWZkZWYgQ09ORklHX1NZU19PQklSCisJaW0tPnN5c2NvbmYub2JpciA9IENPTkZJR19TWVNfT0JJUjsKKyNlbmRpZgorCisJLyoKKwkgKiBNZW1vcnkgQ29udHJvbGxlcjoKKwkgKi8KKworCS8qIE1hcCBiYW5rcyAwIGFuZCAxIHRvIHRoZSBGTEFTSCBiYW5rcyAwIGFuZCAxIGF0IHByZWxpbWluYXJ5CisJICogYWRkcmVzc2VzIC0gdGhlc2UgaGF2ZSB0byBiZSBtb2RpZmllZCBsYXRlciB3aGVuIEZMQVNIIHNpemUKKwkgKiBoYXMgYmVlbiBkZXRlcm1pbmVkCisJICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTkFORF9CUl9QUkVMSU0pICBcCisJJiYgZGVmaW5lZChDT05GSUdfU1lTX05BTkRfT1JfUFJFTElNKSBcCisJJiYgZGVmaW5lZChDT05GSUdfU1lTX05BTkRfTEJMQVdCQVJfUFJFTElNKSBcCisJJiYgZGVmaW5lZChDT05GSUdfU1lTX05BTkRfTEJMQVdBUl9QUkVMSU0pCisJaW0tPmxidXMuYmFua1swXS5iciA9IENPTkZJR19TWVNfTkFORF9CUl9QUkVMSU07CisJaW0tPmxidXMuYmFua1swXS5vciA9IENPTkZJR19TWVNfTkFORF9PUl9QUkVMSU07CisJaW0tPnN5c2NvbmYubGJsYXdbMF0uYmFyID0gQ09ORklHX1NZU19OQU5EX0xCTEFXQkFSX1BSRUxJTTsKKwlpbS0+c3lzY29uZi5sYmxhd1swXS5hciA9IENPTkZJR19TWVNfTkFORF9MQkxBV0FSX1BSRUxJTTsKKyNlbHNlCisjZXJyb3IgQ09ORklHX1NZU19OQU5EX0JSX1BSRUxJTSwgQ09ORklHX1NZU19OQU5EX09SX1BSRUxJTSwgQ09ORklHX1NZU19OQU5EX0xCTEFXQkFSX1BSRUxJTSAmIENPTkZJR19TWVNfTkFORF9MQkxBV0FSX1BSRUxJTSBtdXN0IGJlIGRlZmluZWQKKyNlbmRpZgorfQorCisvKgorICogR2V0IHRpbWViYXNlIGNsb2NrIGZyZXF1ZW5jeSAobGlrZSBjcHVfY2xrIGluIEh6KQorICovCit1bnNpZ25lZCBsb25nIGdldF90YmNsayh2b2lkKQoreworCXJldHVybiAoZ2QtPmJ1c19jbGsgKyAzTCkgLyA0TDsKK30KKwordm9pZCBwdXRzKGNvbnN0IGNoYXIgKnN0cikKK3sKKwl3aGlsZSAoKnN0cikKKwkJcHV0Yygqc3RyKyspOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3BjaS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmIyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvcGNpLmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuIDIwMDcKKyAqCisgKiBBdXRob3I6IFNjb3R0IFdvb2QgPHNjb3R0d29vZEBmcmVlc2NhbGUuY29tPiwKKyAqIHdpdGggc29tZSBiaXRzIGZyb20gb2xkZXIgYm9hcmQtc3BlY2lmaWMgUENJIGluaXRpYWxpemF0aW9uLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vbXBjODM0OV9wY2kuaD4KKworI2RlZmluZSBNQVhfQlVTRVMgMgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2lfaG9zZVtNQVhfQlVTRVNdOworc3RhdGljIGludCBwY2lfbnVtX2J1c2VzOworCitzdGF0aWMgdm9pZCBwY2lfaW5pdF9idXMoaW50IGJ1cywgc3RydWN0IHBjaV9yZWdpb24gKnJlZykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKHZvbGF0aWxlIGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgcG90ODN4eF90ICpwb3QgPSBpbW1yLT5pb3MucG90OworCXZvbGF0aWxlIHBjaWN0cmw4M3h4X3QgKnBjaV9jdHJsID0gJmltbXItPnBjaV9jdHJsW2J1c107CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaV9ob3NlW2J1c107CisJdTMyIGRldjsKKwl1MTYgcmVnMTY7CisJaW50IGk7CisKKwlpZiAoYnVzID09IDEpCisJCXBvdCArPSAzOworCisJLyogU2V0dXAgb3V0Ym91bmQgdHJhbnNsYXRpb24gd2luZG93cyAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyssIHJlZysrLCBwb3QrKykgeworCQlpZiAocmVnLT5zaXplID09IDApCisJCQlicmVhazsKKworCQlob3NlLT5yZWdpb25zW2ldID0gKnJlZzsKKwkJaG9zZS0+cmVnaW9uX2NvdW50Kys7CisKKwkJcG90LT5wb3RhciA9IHJlZy0+YnVzX3N0YXJ0ID4+IDEyOworCQlwb3QtPnBvYmFyID0gcmVnLT5waHlzX3N0YXJ0ID4+IDEyOworCQlwb3QtPnBvY21yID0gfihyZWctPnNpemUgLSAxKSA+PiAxMjsKKworCQlpZiAocmVnLT5mbGFncyAmIFBDSV9SRUdJT05fSU8pCisJCQlwb3QtPnBvY21yIHw9IFBPQ01SX0lPOworI2lmZGVmIENPTkZJR184M1hYX1BDSV9TVFJFQU1JTkcKKwkJZWxzZSBpZiAocmVnLT5mbGFncyAmIFBDSV9SRUdJT05fUFJFRkVUQ0gpCisJCQlwb3QtPnBvY21yIHw9IFBPQ01SX1NFOworI2VuZGlmCisKKwkJaWYgKGJ1cyA9PSAxKQorCQkJcG90LT5wb2NtciB8PSBQT0NNUl9EU1Q7CisKKwkJcG90LT5wb2NtciB8PSBQT0NNUl9FTjsKKwl9CisKKwkvKiBQb2ludCBpbmJvdW5kIHRyYW5zbGF0aW9uIGF0IFJBTSAqLworCXBjaV9jdHJsLT5waXRhcjEgPSAwOworCXBjaV9jdHJsLT5waWJhcjEgPSAwOworCXBjaV9jdHJsLT5waWViYXIxID0gMDsKKwlwY2lfY3RybC0+cGl3YXIxID0gUElXQVJfRU4gfCBQSVdBUl9QRiB8IFBJV0FSX1JUVF9TTk9PUCB8CisJICAgICAgICAgICAgICAgICAgIFBJV0FSX1dUVF9TTk9PUCB8IChfX2lsb2cyKGdkLT5yYW1fc2l6ZSAtIDEpKTsKKworCWkgPSBob3NlLT5yZWdpb25fY291bnQrKzsKKwlob3NlLT5yZWdpb25zW2ldLmJ1c19zdGFydCA9IDA7CisJaG9zZS0+cmVnaW9uc1tpXS5waHlzX3N0YXJ0ID0gMDsKKwlob3NlLT5yZWdpb25zW2ldLnNpemUgPSBnZC0+cmFtX3NpemU7CisJaG9zZS0+cmVnaW9uc1tpXS5mbGFncyA9IFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9TWVNfTUVNT1JZOworCisJaG9zZS0+Zmlyc3RfYnVzbm8gPSBwY2lfbGFzdF9idXNubygpICsgMTsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCBDT05GSUdfU1lTX0lNTVIgKyAweDgzMDAgKyBidXMgKiAweDgwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfU1lTX0lNTVIgKyAweDgzMDQgKyBidXMgKiAweDgwKTsKKworCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOworCisJLyoKKwkgKiBXcml0ZSB0byBDb21tYW5kIHJlZ2lzdGVyCisJICovCisJcmVnMTYgPSAweGZmOworCWRldiA9IFBDSV9CREYoaG9zZS0+Zmlyc3RfYnVzbm8sIDAsIDApOworCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgJnJlZzE2KTsKKwlyZWcxNiB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfTUVNT1JZOworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIHJlZzE2KTsKKworCS8qCisJICogQ2xlYXIgbm9uLXJlc2VydmVkIGJpdHMgaW4gc3RhdHVzIHJlZ2lzdGVyLgorCSAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX1NUQVRVUywgMHhmZmZmKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIDB4MDgpOworCisjaWZkZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cKKwlwcmludGYoIlBDSTogICBCdXMgRGV2IFZlbklkIERldklkIENsYXNzIEludFxuIik7CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1BDSVNMQVZFCisJLyoKKwkgKiBIb3NlIHNjYW4uCisJICovCisJaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7CisjZW5kaWYKK30KKworLyoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgc2V0IE9DQ1IsIGFuZCB0aGUgUENJX0xBVyBCQVJzCisgKiBtdXN0IGhhdmUgYmVlbiBzZXQgdG8gY292ZXIgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgcmVnaW9ucy4KKyAqCisgKiBJZiBmZXdlciB0aGFuIHRocmVlIHJlZ2lvbnMgYXJlIHJlcXVlc3RlZCwgdGhlbiB0aGUgcmVnaW9uCisgKiBsaXN0IGlzIHRlcm1pbmF0ZWQgd2l0aCBhIHJlZ2lvbiBvZiBzaXplIDAuCisgKi8KK3ZvaWQgbXBjODN4eF9wY2lfaW5pdChpbnQgbnVtX2J1c2VzLCBzdHJ1Y3QgcGNpX3JlZ2lvbiAqKnJlZywgaW50IHdhcm1ib290KQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAodm9sYXRpbGUgaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwlpbnQgaTsKKworCWlmIChudW1fYnVzZXMgPiBNQVhfQlVTRVMpIHsKKwkJcHJpbnRmKCIlZCBQQ0kgYnVzZXMgcmVxdXN0ZWQsICVkIHN1cHBvcnRlZFxuIiwKKwkJICAgICAgIG51bV9idXNlcywgTUFYX0JVU0VTKTsKKworCQludW1fYnVzZXMgPSBNQVhfQlVTRVM7CisJfQorCisJcGNpX251bV9idXNlcyA9IG51bV9idXNlczsKKworCS8qCisJICogUmVsZWFzZSBQQ0kgUlNUIE91dHB1dCBzaWduYWwuCisJICogUG93ZXIgb24gdG8gUlNUIGhpZ2ggbXVzdCBiZSBhdCBsZWFzdCAxMDAgbXMgYXMgcGVyIFBDSSBzcGVjLgorCSAqIE9uIHdhcm0gYm9vdHMgb25seSAxIG1zIGlzIHJlcXVpcmVkLgorCSAqLworCXVkZWxheSh3YXJtYm9vdCA/IDEwMDAgOiAxMDAwMDApOworCisJZm9yIChpID0gMDsgaSA8IG51bV9idXNlczsgaSsrKQorCQlpbW1yLT5wY2lfY3RybFtpXS5nY3IgPSAxOworCisJLyoKKwkgKiBSU1QgaGlnaCB0byBmaXJzdCBjb25maWcgYWNjZXNzIG11c3QgYmUgYXQgbGVhc3QgMl4yNSBjeWNsZXMKKwkgKiBhcyBwZXIgUENJIHNwZWMuICBUaGlzIGNvdWxkIGJlIGN1dCBpbiBoYWxmIGlmIHdlIGtub3cgd2UncmUKKwkgKiBydW5uaW5nIGF0IDY2TUh6LiAgVGhpcyBjb3VsZCBiZSBpbnN1ZmZpY2llbnRseSBsb25nIGlmIHdlJ3JlCisJICogcnVubmluZyB0aGUgUENJIGJ1cyBhdCBzaWduaWZpY2FudGx5IGxlc3MgdGhhbiAzM01Iei4KKwkgKi8KKwl1ZGVsYXkoMTAyMDAwMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1c2VzOyBpKyspCisJCXBjaV9pbml0X2J1cyhpLCByZWdbaV0pOworfQorCisjaWZkZWYgQ09ORklHX1BDSVNMQVZFCisKKyNkZWZpbmUgUENJX0ZVTkNUSU9OX0NPTkZJRwkweDQ0CisjZGVmaW5lIFBDSV9GVU5DVElPTl9DRkdfTE9DSwkweDIwCisKKy8qCisgKiBVbmxvY2sgdGhlIGNvbmZpZ3VyYXRpb24gYml0IHNvIHRoYXQgdGhlIGhvc3Qgc3lzdGVtIGNhbiBiZWdpbiBib290aW5nCisgKgorICogVGhpcyBzaG91bGQgYmUgdXNlZCBhZnRlciB5b3UgaGF2ZToKKyAqIDEpIENhbGxlZCBtcGM4M3h4X3BjaV9pbml0KCkKKyAqIDIpIFNldCB1cCB5b3VyIGluYm91bmQgdHJhbnNsYXRpb24gd2luZG93cyB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZQorICovCit2b2lkIG1wYzgzeHhfcGNpc2xhdmVfdW5sb2NrKGludCBidXMpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaV9ob3NlW2J1c107CisJdTMyIGRldjsKKwl1MTYgcmVnMTY7CisKKwkvKiBVbmxvY2sgY29uZmlndXJhdGlvbiBsb2NrIGluIFBDSSBmdW5jdGlvbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJZGV2ID0gUENJX0JERihob3NlLT5maXJzdF9idXNubywgMCwgMCk7CisJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZCAoaG9zZSwgZGV2LCBQQ0lfRlVOQ1RJT05fQ09ORklHLCAmcmVnMTYpOworCXJlZzE2ICY9IH4oUENJX0ZVTkNUSU9OX0NGR19MT0NLKTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZCAoaG9zZSwgZGV2LCBQQ0lfRlVOQ1RJT05fQ09ORklHLCByZWcxNik7CisKKwkvKiBUaGUgY29uZmlndXJhdGlvbiBiaXQgaXMgbm93IHVubG9ja2VkLCBzbyB3ZSBjYW4gc2NhbiB0aGUgYnVzICovCisJaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkKK3ZvaWQgZnRfcGNpX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKQoreworCWludCBub2Rlb2Zmc2V0OworCWludCB0bXBbMl07CisJY29uc3QgY2hhciAqcGF0aDsKKworCWlmIChwY2lfbnVtX2J1c2VzIDwgMSkKKwkJcmV0dXJuOworCisJbm9kZW9mZnNldCA9IGZkdF9wYXRoX29mZnNldChibG9iLCAiL2FsaWFzZXMiKTsKKwlpZiAobm9kZW9mZnNldCA+PSAwKSB7CisJCXBhdGggPSBmZHRfZ2V0cHJvcChibG9iLCBub2Rlb2Zmc2V0LCAicGNpMCIsIE5VTEwpOworCQlpZiAocGF0aCkgeworCQkJdG1wWzBdID0gY3B1X3RvX2JlMzIocGNpX2hvc2VbMF0uZmlyc3RfYnVzbm8pOworCQkJdG1wWzFdID0gY3B1X3RvX2JlMzIocGNpX2hvc2VbMF0ubGFzdF9idXNubyk7CisJCQlkb19maXh1cF9ieV9wYXRoKGJsb2IsIHBhdGgsICJidXMtcmFuZ2UiLAorCQkJCSZ0bXAsIHNpemVvZih0bXApLCAxKTsKKworCQkJdG1wWzBdID0gY3B1X3RvX2JlMzIoZ2QtPnBjaV9jbGspOworCQkJZG9fZml4dXBfYnlfcGF0aChibG9iLCBwYXRoLCAiY2xvY2stZnJlcXVlbmN5IiwKKwkJCQkmdG1wLCBzaXplb2YodG1wWzBdKSwgMSk7CisJCX0KKworCQlpZiAocGNpX251bV9idXNlcyA8IDIpCisJCQlyZXR1cm47CisKKwkJcGF0aCA9IGZkdF9nZXRwcm9wKGJsb2IsIG5vZGVvZmZzZXQsICJwY2kxIiwgTlVMTCk7CisJCWlmIChwYXRoKSB7CisJCQl0bXBbMF0gPSBjcHVfdG9fYmUzMihwY2lfaG9zZVsxXS5maXJzdF9idXNubyk7CisJCQl0bXBbMV0gPSBjcHVfdG9fYmUzMihwY2lfaG9zZVsxXS5sYXN0X2J1c25vKTsKKwkJCWRvX2ZpeHVwX2J5X3BhdGgoYmxvYiwgcGF0aCwgImJ1cy1yYW5nZSIsCisJCQkJJnRtcCwgc2l6ZW9mKHRtcCksIDEpOworCisJCQl0bXBbMF0gPSBjcHVfdG9fYmUzMihnZC0+cGNpX2Nsayk7CisJCQlkb19maXh1cF9ieV9wYXRoKGJsb2IsIHBhdGgsICJjbG9jay1mcmVxdWVuY3kiLAorCQkJCSZ0bXAsIHNpemVvZih0bXBbMF0pLCAxKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfT0ZfTElCRkRUICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvcGNpZS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3BjaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Y4OTA2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3BjaWUuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5ICBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBBdXRob3JzOiBUb255IExpIDx0b255LmxpQGZyZWVzY2FsZS5jb20+CisgKiAgICAgICAgICBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8bXBjODN4eC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2RlZmluZSBQQ0lFX01BWF9CVVNFUyAyCisKKyNpZmRlZiBDT05GSUdfODNYWF9HRU5FUklDX1BDSUVfUkVHSVNURVJfSE9TRVMKKworc3RhdGljIGludCBtcGM4M3h4X3BjaWVfcmVtYXBfY2ZnKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKK3sKKwlpbnQgYnVzID0gUENJX0JVUyhkZXYpIC0gaG9zZS0+Zmlyc3RfYnVzbm87CisJaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXBleDgzeHhfdCAqcGV4ID0gJmltbXItPnBjaWV4cFtidXNdOworCXN0cnVjdCBwZXhfb3V0Ym91bmRfd2luZG93ICpvdXRfd2luID0gJnBleC0+YnJpZGdlLnBleF9vdXRib3VuZF93aW5bMF07CisJdTggZGV2Zm4gPSBQQ0lfREVWKGRldikgPDwgMyB8IFBDSV9GVU5DKGRldik7CisJdTMyIGRldl9iYXNlID0gYnVzIDw8IDI0IHwgZGV2Zm4gPDwgMTY7CisKKwlpZiAoaG9zZS0+aW5kaXJlY3RfdHlwZSA9PSBJTkRJUkVDVF9UWVBFX05PX1BDSUVfTElOSykKKwkJcmV0dXJuIC0xOworCS8qCisJICogV29ya2Fyb3VuZCBmb3IgdGhlIEhXIGJ1ZzogZm9yIFR5cGUgMCBjb25maWd1cmUgdHJhbnNhY3Rpb25zIHRoZQorCSAqIFBDSS1FIGNvbnRyb2xsZXIgZG9lcyBub3QgY2hlY2sgdGhlIGRldmljZSBudW1iZXIgYml0cyBhbmQganVzdAorCSAqIGFzc3VtZXMgdGhhdCB0aGUgZGV2aWNlIG51bWJlciBiaXRzIGFyZSAwLgorCSAqLworCWlmIChkZXZmbiAmIDB4ZjgpCisJCXJldHVybiAtMTsKKworCW91dF9sZTMyKCZvdXRfd2luLT50YXJsLCBkZXZfYmFzZSk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgY2ZnX3JlYWQodmFsLCBhZGRyLCB0eXBlLCBvcCkgXAorCWRvIHsgKnZhbCA9IG9wKCh0eXBlKShhZGRyKSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIGNmZ193cml0ZSh2YWwsIGFkZHIsIHR5cGUsIG9wKSBcCisJZG8geyBvcCgodHlwZSAqKShhZGRyKSwgKHZhbCkpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIGNmZ19yZWFkX2Vycih2YWwpIGRvIHsgKnZhbCA9IC0xOyB9IHdoaWxlICgwKQorI2RlZmluZSBjZmdfd3JpdGVfZXJyKHZhbCkgZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIFBDSUVfT1AocncsIHNpemUsIHR5cGUsIG9wKQkJCQkJXAorc3RhdGljIGludCBwY2llXyMjcncjI19jb25maWdfIyNzaXplKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwJXAorCQkJCSAgICAgcGNpX2Rldl90IGRldiwgaW50IG9mZnNldCwJCVwKKwkJCQkgICAgIHR5cGUgdmFsKQkJCQlcCit7CQkJCQkJCQkJXAorCWludCByZXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXQgPSBtcGM4M3h4X3BjaWVfcmVtYXBfY2ZnKGhvc2UsIGRldik7CQkJXAorCWlmIChyZXQpIHsJCQkJCQkJXAorCQljZmdfIyNydyMjX2Vycih2YWwpOyAJCQkJCVwKKwkJcmV0dXJuIHJldDsgCQkJCQkJXAorCX0JCQkJCQkJCVwKKwljZmdfIyNydyh2YWwsICh2b2lkICopaG9zZS0+Y2ZnX2FkZHIgKyBvZmZzZXQsIHR5cGUsIG9wKTsJXAorCXJldHVybiAwOwkJCQkJCQlcCit9CisKK1BDSUVfT1AocmVhZCwgYnl0ZSwgdTggKiwgaW5fOCkKK1BDSUVfT1AocmVhZCwgd29yZCwgdTE2ICosIGluX2xlMTYpCitQQ0lFX09QKHJlYWQsIGR3b3JkLCB1MzIgKiwgaW5fbGUzMikKK1BDSUVfT1Aod3JpdGUsIGJ5dGUsIHU4LCBvdXRfOCkKK1BDSUVfT1Aod3JpdGUsIHdvcmQsIHUxNiwgb3V0X2xlMTYpCitQQ0lFX09QKHdyaXRlLCBkd29yZCwgdTMyLCBvdXRfbGUzMikKKworc3RhdGljIHZvaWQgbXBjODN4eF9wY2llX3JlZ2lzdGVyX2hvc2UoaW50IGJ1cywgc3RydWN0IHBjaV9yZWdpb24gKnJlZywKKwkJCQkgICAgICAgdTggbGluaykKK3sKKwlleHRlcm4gdm9pZCBkaXNhYmxlX2FkZHJfdHJhbnModm9pZCk7IC8qIHN0YXJ0LlMgKi8KKwlzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHBjaWVfaG9zZVtQQ0lFX01BWF9CVVNFU107CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gJnBjaWVfaG9zZVtidXNdOworCWludCBpOworCisJLyoKKwkgKiBUaGVyZSBhcmUgbm8gc3BhcmUgQkFUcyB0byByZW1hcCBhbGwgUENJLUUgd2luZG93cyBmb3IgVS1Cb290LCBzbworCSAqIGRpc2FibGUgdHJhbnNsYXRpb25zLiBJbiBnZW5lcmFsLCB0aGlzIGlzIG5vdCBncmVhdCBzb2x1dGlvbiwgYW5kCisJICogdGhhdCdzIHdoeSB3ZSBkb24ndCByZWdpc3RlciBQQ0ktRSBob3NlcyBieSBkZWZhdWx0LgorCSAqLworCWRpc2FibGVfYWRkcl90cmFucygpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKywgcmVnKyspIHsKKwkJaWYgKHJlZy0+c2l6ZSA9PSAwKQorCQkJYnJlYWs7CisKKwkJaG9zZS0+cmVnaW9uc1tpXSA9ICpyZWc7CisJCWhvc2UtPnJlZ2lvbl9jb3VudCsrOworCX0KKworCWkgPSBob3NlLT5yZWdpb25fY291bnQrKzsKKwlob3NlLT5yZWdpb25zW2ldLmJ1c19zdGFydCA9IDA7CisJaG9zZS0+cmVnaW9uc1tpXS5waHlzX3N0YXJ0ID0gMDsKKwlob3NlLT5yZWdpb25zW2ldLnNpemUgPSBnZC0+cmFtX3NpemU7CisJaG9zZS0+cmVnaW9uc1tpXS5mbGFncyA9IFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9TWVNfTUVNT1JZOworCisJaSA9IGhvc2UtPnJlZ2lvbl9jb3VudCsrOworCWhvc2UtPnJlZ2lvbnNbaV0uYnVzX3N0YXJ0ID0gQ09ORklHX1NZU19JTU1SOworCWhvc2UtPnJlZ2lvbnNbaV0ucGh5c19zdGFydCA9IENPTkZJR19TWVNfSU1NUjsKKwlob3NlLT5yZWdpb25zW2ldLnNpemUgPSAweDEwMDAwMDsKKwlob3NlLT5yZWdpb25zW2ldLmZsYWdzID0gUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX1NZU19NRU1PUlk7CisKKwlob3NlLT5maXJzdF9idXNubyA9IHBjaV9sYXN0X2J1c25vKCkgKyAxOworCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCisJaWYgKGJ1cyA9PSAwKQorCQlob3NlLT5jZmdfYWRkciA9ICh1bnNpZ25lZCBpbnQgKilDT05GSUdfU1lTX1BDSUUxX0NGR19CQVNFOworCWVsc2UKKwkJaG9zZS0+Y2ZnX2FkZHIgPSAodW5zaWduZWQgaW50ICopQ09ORklHX1NZU19QQ0lFMl9DRkdfQkFTRTsKKworCXBjaV9zZXRfb3BzKGhvc2UsCisJCQlwY2llX3JlYWRfY29uZmlnX2J5dGUsCisJCQlwY2llX3JlYWRfY29uZmlnX3dvcmQsCisJCQlwY2llX3JlYWRfY29uZmlnX2R3b3JkLAorCQkJcGNpZV93cml0ZV9jb25maWdfYnl0ZSwKKwkJCXBjaWVfd3JpdGVfY29uZmlnX3dvcmQsCisJCQlwY2llX3dyaXRlX2NvbmZpZ19kd29yZCk7CisKKwlpZiAoIWxpbmspCisJCWhvc2UtPmluZGlyZWN0X3R5cGUgPSBJTkRJUkVDVF9UWVBFX05PX1BDSUVfTElOSzsKKworCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOworCisjaWZkZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cKKwlwcmludGYoIlBDSTogICBCdXMgRGV2IFZlbklkIERldklkIENsYXNzIEludFxuIik7CisjZW5kaWYKKwkvKgorCSAqIEhvc2Ugc2Nhbi4KKwkgKi8KKwlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbihob3NlKTsKK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgbXBjODN4eF9wY2llX3JlZ2lzdGVyX2hvc2UoaW50IGJ1cywgc3RydWN0IHBjaV9yZWdpb24gKnJlZywKKwkJCQkgICAgICAgdTggbGluaykge30KKworI2VuZGlmIC8qIENPTkZJR184M1hYX0dFTkVSSUNfUENJRV9SRUdJU1RFUl9IT1NFUyAqLworCitzdGF0aWMgdm9pZCBtcGM4M3h4X3BjaWVfaW5pdF9idXMoaW50IGJ1cywgc3RydWN0IHBjaV9yZWdpb24gKnJlZykKK3sKKwlpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJcGV4ODN4eF90ICpwZXggPSAmaW1tci0+cGNpZXhwW2J1c107CisJc3RydWN0IHBleF9vdXRib3VuZF93aW5kb3cgKm91dF93aW47CisJc3RydWN0IHBleF9pbmJvdW5kX3dpbmRvdyAqaW5fd2luOworCXZvaWQgKmhvc2VfY2ZnX2Jhc2U7CisJdW5zaWduZWQgaW50IHJhbV9zejsKKwl1bnNpZ25lZCBpbnQgYmFybDsKKwl1bnNpZ25lZCBpbnQgdGFyOworCXUxNiByZWcxNjsKKwlpbnQgaTsKKworCS8qIEVuYWJsZSBwZXggY3NiIGJyaWRnZSBpbmJvdW5kICYgb3V0Ym91bmQgdHJhbnNhY3Rpb25zICovCisJb3V0X2xlMzIoJnBleC0+YnJpZGdlLnBleF9jc2JfY3RybCwKKwkJaW5fbGUzMigmcGV4LT5icmlkZ2UucGV4X2NzYl9jdHJsKSB8IFBFWF9DU0JfQ1RSTF9PQlBJT0UgfAorCQlQRVhfQ1NCX0NUUkxfSUJQSU9FKTsKKworCS8qIEVuYWJsZSBicmlkZ2Ugb3V0Ym91bmQgKi8KKwlvdXRfbGUzMigmcGV4LT5icmlkZ2UucGV4X2NzYl9vYmN0cmwsIFBFWF9DU0JfT0JDVFJMX1BJT0UgfAorCQlQRVhfQ1NCX09CQ1RSTF9NRU1XRSB8IFBFWF9DU0JfT0JDVFJMX0lPV0UgfAorCQlQRVhfQ1NCX09CQ1RSTF9DRkdXRSk7CisKKwlvdXRfd2luID0gJnBleC0+YnJpZGdlLnBleF9vdXRib3VuZF93aW5bMF07CisJaWYgKGJ1cykgeworCQlvdXRfbGUzMigmb3V0X3dpbi0+YXIsIFBFWF9PV0FSX0VOIHwgUEVYX09XQVJfVFlQRV9DRkcgfAorCQkJQ09ORklHX1NZU19QQ0lFMl9DRkdfU0laRSk7CisJCW91dF9sZTMyKCZvdXRfd2luLT5iYXIsIENPTkZJR19TWVNfUENJRTJfQ0ZHX0JBU0UpOworCX0gZWxzZSB7CisJCW91dF9sZTMyKCZvdXRfd2luLT5hciwgUEVYX09XQVJfRU4gfCBQRVhfT1dBUl9UWVBFX0NGRyB8CisJCQlDT05GSUdfU1lTX1BDSUUxX0NGR19TSVpFKTsKKwkJb3V0X2xlMzIoJm91dF93aW4tPmJhciwgQ09ORklHX1NZU19QQ0lFMV9DRkdfQkFTRSk7CisJfQorCW91dF9sZTMyKCZvdXRfd2luLT50YXJsLCAwKTsKKwlvdXRfbGUzMigmb3V0X3dpbi0+dGFyaCwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrLCByZWcrKykgeworCQl1MzIgYXI7CisKKwkJaWYgKHJlZy0+c2l6ZSA9PSAwKQorCQkJYnJlYWs7CisKKwkJb3V0X3dpbiA9ICZwZXgtPmJyaWRnZS5wZXhfb3V0Ym91bmRfd2luW2kgKyAxXTsKKwkJb3V0X2xlMzIoJm91dF93aW4tPmJhciwgcmVnLT5waHlzX3N0YXJ0KTsKKwkJb3V0X2xlMzIoJm91dF93aW4tPnRhcmwsIHJlZy0+YnVzX3N0YXJ0KTsKKwkJb3V0X2xlMzIoJm91dF93aW4tPnRhcmgsIDApOworCQlhciA9IFBFWF9PV0FSX0VOIHwgKHJlZy0+c2l6ZSAmIFBFWF9PV0FSX1NJWkUpOworCQlpZiAocmVnLT5mbGFncyAmIFBDSV9SRUdJT05fSU8pCisJCQlhciB8PSBQRVhfT1dBUl9UWVBFX0lPOworCQllbHNlCisJCQlhciB8PSBQRVhfT1dBUl9UWVBFX01FTTsKKwkJb3V0X2xlMzIoJm91dF93aW4tPmFyLCBhcik7CisJfQorCisJb3V0X2xlMzIoJnBleC0+YnJpZGdlLnBleF9jc2JfaWJjdHJsLCBQRVhfQ1NCX0lCQ1RSTF9QSU9FKTsKKworCXJhbV9zeiA9IGdkLT5yYW1fc2l6ZTsKKwliYXJsID0gMDsKKwl0YXIgPSAwOworCWkgPSAwOworCXdoaWxlIChyYW1fc3ogPiAwKSB7CisJCWluX3dpbiA9ICZwZXgtPmJyaWRnZS5wZXhfaW5ib3VuZF93aW5baV07CisJCW91dF9sZTMyKCZpbl93aW4tPmJhcmwsIGJhcmwpOworCQlvdXRfbGUzMigmaW5fd2luLT5iYXJoLCAweDApOworCQlvdXRfbGUzMigmaW5fd2luLT50YXIsIHRhcik7CisJCWlmIChyYW1fc3ogPj0gMHgxMDAwMDAwMCkgeworCQkJLyogVGhlIG1heGl1bSB3aW5kb3dzIHNpemUgaXMgMjU2TSAqLworCQkJb3V0X2xlMzIoJmluX3dpbi0+YXIsIFBFWF9JV0FSX0VOIHwgUEVYX0lXQVJfTlNPViB8CisJCQkJUEVYX0lXQVJfVFlQRV9QRiB8IDB4MEZGRkYwMDApOworCQkJYmFybCArPSAweDEwMDAwMDAwOworCQkJdGFyICs9IDB4MTAwMDAwMDA7CisJCQlyYW1fc3ogLT0gMHgxMDAwMDAwMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBVTSAgaXMgbm90IGNsZWFyIGhlcmUuCisJCQkgKiBTbywgcm91bmQgdXAgdG8gZXZlbiBNYiBib3VuZGFyeSAqLworCisJCQlyYW1fc3ogPSByYW1fc3ogPj4gKDIwICsKKwkJCQkJKChyYW1fc3ogJiAweEZGRkZGKSA/IDEgOiAwKSk7CisJCQlpZiAoIShyYW1fc3ogJSAyKSkKKwkJCQlyYW1fc3ogLT0gMTsKKwkJCW91dF9sZTMyKCZpbl93aW4tPmFyLCBQRVhfSVdBUl9FTiB8IFBFWF9JV0FSX05TT1YgfAorCQkJCVBFWF9JV0FSX1RZUEVfUEYgfCAocmFtX3N6IDw8IDIwKSB8IDB4RkYwMDApOworCQkJcmFtX3N6ID0gMDsKKwkJfQorCQlpKys7CisJfQorCisJaW5fd2luID0gJnBleC0+YnJpZGdlLnBleF9pbmJvdW5kX3dpbltpXTsKKwlvdXRfbGUzMigmaW5fd2luLT5iYXJsLCBDT05GSUdfU1lTX0lNTVIpOworCW91dF9sZTMyKCZpbl93aW4tPmJhcmgsIDApOworCW91dF9sZTMyKCZpbl93aW4tPnRhciwgQ09ORklHX1NZU19JTU1SKTsKKwlvdXRfbGUzMigmaW5fd2luLT5hciwgUEVYX0lXQVJfRU4gfAorCQlQRVhfSVdBUl9UWVBFX05PX1BGIHwgUEVYX0lXQVJfU0laRV8xTSk7CisKKwkvKiBFbmFibGUgdGhlIGhvc3QgdmlydHVhbCBJTlRYIGludGVycnVwdHMgKi8KKwlvdXRfbGUzMigmcGV4LT5icmlkZ2UucGV4X2ludF9heGlfbWlzY19lbmIsCisJCWluX2xlMzIoJnBleC0+YnJpZGdlLnBleF9pbnRfYXhpX21pc2NfZW5iKSB8IDB4MUUwKTsKKworCS8qIEhvc2UgY29uZmlndXJlIGhlYWRlciBpcyBtZW1vcnktbWFwcGVkICovCisJaG9zZV9jZmdfYmFzZSA9ICh2b2lkICopcGV4OworCisJZ2V0X2Nsb2NrcygpOworCS8qIENvbmZpZ3VyZSB0aGUgUENJRSBjb250cm9sbGVyIGNvcmUgY2xvY2sgcmF0aW8gKi8KKwlvdXRfbGUzMihob3NlX2NmZ19iYXNlICsgUEVYX0dDTEtfUkFUSU8sCisJCSgoKGJ1cyA/IGdkLT5wY2lleHAyX2NsayA6IGdkLT5wY2lleHAxX2NsaykgLyAxMDAwMDAwKSAqIDE2KQorCQkvIDMzMyk7CisJdWRlbGF5KDEwMDAwMDApOworCisJLyogRG8gVHlwZSAxIGJyaWRnZSBjb25maWd1cmF0aW9uICovCisJb3V0XzgoaG9zZV9jZmdfYmFzZSArIFBDSV9QUklNQVJZX0JVUywgMCk7CisJb3V0XzgoaG9zZV9jZmdfYmFzZSArIFBDSV9TRUNPTkRBUllfQlVTLCAxKTsKKwlvdXRfOChob3NlX2NmZ19iYXNlICsgUENJX1NVQk9SRElOQVRFX0JVUywgMjU1KTsKKworCS8qCisJICogV3JpdGUgdG8gQ29tbWFuZCByZWdpc3RlcgorCSAqLworCXJlZzE2ID0gaW5fbGUxNihob3NlX2NmZ19iYXNlICsgUENJX0NPTU1BTkQpOworCXJlZzE2IHw9IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX0lPIHwKKwkJCVBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9QQVJJVFk7CisJb3V0X2xlMTYoaG9zZV9jZmdfYmFzZSArIFBDSV9DT01NQU5ELCByZWcxNik7CisKKwkvKgorCSAqIENsZWFyIG5vbi1yZXNlcnZlZCBiaXRzIGluIHN0YXR1cyByZWdpc3Rlci4KKwkgKi8KKwlvdXRfbGUxNihob3NlX2NmZ19iYXNlICsgUENJX1NUQVRVUywgMHhmZmZmKTsKKwlvdXRfOChob3NlX2NmZ19iYXNlICsgUENJX0xBVEVOQ1lfVElNRVIsIDB4ODApOworCW91dF84KGhvc2VfY2ZnX2Jhc2UgKyBQQ0lfQ0FDSEVfTElORV9TSVpFLCAweDA4KTsKKworCXByaW50ZigiUENJRSVkOiAiLCBidXMpOworCisJcmVnMTYgPSBpbl9sZTE2KGhvc2VfY2ZnX2Jhc2UgKyBQQ0lfTFRTU00pOworCWlmIChyZWcxNiA+PSBQQ0lfTFRTU01fTDApCisJCXByaW50ZigibGlua1xuIik7CisJZWxzZQorCQlwcmludGYoIk5vIGxpbmtcbiIpOworCisJbXBjODN4eF9wY2llX3JlZ2lzdGVyX2hvc2UoYnVzLCByZWcsIHJlZzE2ID49IFBDSV9MVFNTTV9MMCk7Cit9CisKKy8qCisgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBhbHJlYWR5IHNldCBTQ0NSLCBTRVJERVMgYW5kIHRoZSBQQ0lFX0xBVyBCQVJzCisgKiBtdXN0IGhhdmUgYmVlbiBzZXQgdG8gY292ZXIgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgcmVnaW9ucy4KKyAqLwordm9pZCBtcGM4M3h4X3BjaWVfaW5pdChpbnQgbnVtX2J1c2VzLCBzdHJ1Y3QgcGNpX3JlZ2lvbiAqKnJlZywgaW50IHdhcm1ib290KQoreworCWludCBpOworCisJLyoKKwkgKiBSZWxlYXNlIFBDSSBSU1QgT3V0cHV0IHNpZ25hbC4KKwkgKiBQb3dlciBvbiB0byBSU1QgaGlnaCBtdXN0IGJlIGF0IGxlYXN0IDEwMCBtcyBhcyBwZXIgUENJIHNwZWMuCisJICogT24gd2FybSBib290cyBvbmx5IDEgbXMgaXMgcmVxdWlyZWQuCisJICovCisJdWRlbGF5KHdhcm1ib290ID8gMTAwMCA6IDEwMDAwMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1c2VzOyBpKyspCisJCW1wYzgzeHhfcGNpZV9pbml0X2J1cyhpLCByZWdbaV0pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3FlX2lvLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvcWVfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjk0ZjAwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3FlX2lvLmMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIERhdmUgTGl1IDxkYXZlbGl1QGZyZWVzY2FsZS5jb20+CisgKiBiYXNlZCBvbiBzb3VyY2UgY29kZSBvZiBTaGxvbWkgR3JpZGlzaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJhc20vZXJybm8uaCIKKyNpbmNsdWRlICJhc20vaW8uaCIKKyNpbmNsdWRlICJhc20vaW1tYXBfODN4eC5oIgorCisjZGVmaW5lCU5VTV9PRl9QSU5TCTMyCit2b2lkIHFlX2NvbmZpZ19pb3Bpbih1OCBwb3J0LCB1OCBwaW4sIGludCBkaXIsIGludCBvcGVuX2RyYWluLCBpbnQgYXNzaWduKQoreworCXUzMgkJCXBpbl8yYml0X21hc2s7CisJdTMyCQkJcGluXzJiaXRfZGlyOworCXUzMgkJCXBpbl8yYml0X2Fzc2lnbjsKKwl1MzIJCQlwaW5fMWJpdF9tYXNrOworCXUzMgkJCXRtcF92YWw7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW0gPSAodm9sYXRpbGUgaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBxZXBpbzgzeHhfdAkqcGFyX2lvID0gKHZvbGF0aWxlIHFlcGlvODN4eF90ICopJmltLT5xZXBpbzsKKworCS8qIENhY3VsYXRlIHBpbiBsb2NhdGlvbiBhbmQgMmJpdCBtYXNrIGFuZCBkaXIgKi8KKwlwaW5fMmJpdF9tYXNrID0gKHUzMikoMHgzIDw8IChOVU1fT0ZfUElOUy0ocGluJShOVU1fT0ZfUElOUy8yKSsxKSoyKSk7CisJcGluXzJiaXRfZGlyID0gKHUzMikoZGlyIDw8IChOVU1fT0ZfUElOUy0ocGluJShOVU1fT0ZfUElOUy8yKSsxKSoyKSk7CisKKwkvKiBTZXR1cCB0aGUgZGlyZWN0aW9uICovCisJdG1wX3ZhbCA9IChwaW4gPiAoTlVNX09GX1BJTlMvMikgLSAxKSA/IFwKKwkJaW5fYmUzMigmcGFyX2lvLT5pb3BvcnRbcG9ydF0uZGlyMikgOgorCQlpbl9iZTMyKCZwYXJfaW8tPmlvcG9ydFtwb3J0XS5kaXIxKTsKKworCWlmIChwaW4gPiAoTlVNX09GX1BJTlMvMikgLTEpIHsKKwkJb3V0X2JlMzIoJnBhcl9pby0+aW9wb3J0W3BvcnRdLmRpcjIsIH5waW5fMmJpdF9tYXNrICYgdG1wX3ZhbCk7CisJCW91dF9iZTMyKCZwYXJfaW8tPmlvcG9ydFtwb3J0XS5kaXIyLCBwaW5fMmJpdF9kaXIgfCB0bXBfdmFsKTsKKwl9IGVsc2UgeworCQlvdXRfYmUzMigmcGFyX2lvLT5pb3BvcnRbcG9ydF0uZGlyMSwgfnBpbl8yYml0X21hc2sgJiB0bXBfdmFsKTsKKwkJb3V0X2JlMzIoJnBhcl9pby0+aW9wb3J0W3BvcnRdLmRpcjEsIHBpbl8yYml0X2RpciB8IHRtcF92YWwpOworCX0KKworCS8qIENhbGN1bGF0ZSBwaW4gbG9jYXRpb24gZm9yIDFiaXQgbWFzayAqLworCXBpbl8xYml0X21hc2sgPSAodTMyKSgxIDw8IChOVU1fT0ZfUElOUyAtIChwaW4rMSkpKTsKKworCS8qIFNldHVwIHRoZSBvcGVuIGRyYWluICovCisJdG1wX3ZhbCA9IGluX2JlMzIoJnBhcl9pby0+aW9wb3J0W3BvcnRdLnBvZHIpOworCWlmIChvcGVuX2RyYWluKSB7CisJCW91dF9iZTMyKCZwYXJfaW8tPmlvcG9ydFtwb3J0XS5wb2RyLCBwaW5fMWJpdF9tYXNrIHwgdG1wX3ZhbCk7CisJfSBlbHNlIHsKKwkJb3V0X2JlMzIoJnBhcl9pby0+aW9wb3J0W3BvcnRdLnBvZHIsIH5waW5fMWJpdF9tYXNrICYgdG1wX3ZhbCk7CisJfQorCisJLyogU2V0dXAgdGhlIGFzc2lnbm1lbnQgKi8KKwl0bXBfdmFsID0gKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtIDEpID8KKwkJaW5fYmUzMigmcGFyX2lvLT5pb3BvcnRbcG9ydF0ucHBhcjIpOgorCQlpbl9iZTMyKCZwYXJfaW8tPmlvcG9ydFtwb3J0XS5wcGFyMSk7CisJcGluXzJiaXRfYXNzaWduID0gKHUzMikoYXNzaWduCisJCQkJPDwgKE5VTV9PRl9QSU5TIC0gKHBpbiUoTlVNX09GX1BJTlMvMikrMSkqMikpOworCisJLyogQ2xlYXIgYW5kIHNldCAyIGJpdHMgbWFzayAqLworCWlmIChwaW4gPiAoTlVNX09GX1BJTlMvMikgLSAxKSB7CisJCW91dF9iZTMyKCZwYXJfaW8tPmlvcG9ydFtwb3J0XS5wcGFyMiwgfnBpbl8yYml0X21hc2sgJiB0bXBfdmFsKTsKKwkJb3V0X2JlMzIoJnBhcl9pby0+aW9wb3J0W3BvcnRdLnBwYXIyLCBwaW5fMmJpdF9hc3NpZ24gfCB0bXBfdmFsKTsKKwl9IGVsc2UgeworCQlvdXRfYmUzMigmcGFyX2lvLT5pb3BvcnRbcG9ydF0ucHBhcjEsIH5waW5fMmJpdF9tYXNrICYgdG1wX3ZhbCk7CisJCW91dF9iZTMyKCZwYXJfaW8tPmlvcG9ydFtwb3J0XS5wcGFyMSwgcGluXzJiaXRfYXNzaWduIHwgdG1wX3ZhbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3NlcmRlcy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3NlcmRlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDMzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvc2VyZGVzLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBGcmVlc2NhbGUgU2VyRGVzIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdXRvciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA4IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBBdXRob3I6IExpIFlhbmcgPGxlb2xpQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2ZzbF9zZXJkZXMuaD4KKworLyogU2VyRGVzIHJlZ2lzdGVycyAqLworI2RlZmluZSBGU0xfU1JEU0NSMF9PRkZTCQkweDAKKyNkZWZpbmUgRlNMX1NSRFNDUjBfRFBQXzFWMgkJMHgwMDAwODgwMAorI2RlZmluZSBGU0xfU1JEU0NSMV9PRkZTCQkweDQKKyNkZWZpbmUgRlNMX1NSRFNDUjFfUExMQlcJCTB4MDAwMDAwNDAKKyNkZWZpbmUgRlNMX1NSRFNDUjJfT0ZGUwkJMHg4CisjZGVmaW5lIEZTTF9TUkRTQ1IyX1ZERF8xVjIJCTB4MDA4MDAwMDAKKyNkZWZpbmUgRlNMX1NSRFNDUjJfU0VJQ19NQVNLCQkweDAwMDAxYzFjCisjZGVmaW5lIEZTTF9TUkRTQ1IyX1NFSUNfU0FUQQkJMHgwMDAwMTQxNAorI2RlZmluZSBGU0xfU1JEU0NSMl9TRUlDX1BFWAkJMHgwMDAwMTAxMAorI2RlZmluZSBGU0xfU1JEU0NSMl9TRUlDX1NHTUlJCQkweDAwMDAwMTAxCisjZGVmaW5lIEZTTF9TUkRTQ1IzX09GRlMJCTB4YworI2RlZmluZSBGU0xfU1JEU0NSM19LRlJfU0FUQQkJMHgxMDEwMDAwMAorI2RlZmluZSBGU0xfU1JEU0NSM19LUEhfU0FUQQkJMHgwNDA0MDAwMAorI2RlZmluZSBGU0xfU1JEU0NSM19TREZNX1NBVEFfUEVYCTB4MDEwMTAwMDAKKyNkZWZpbmUgRlNMX1NSRFNDUjNfU0RUWExfU0FUQQkJMHgwMDAwMDUwNQorI2RlZmluZSBGU0xfU1JEU0NSNF9PRkZTCQkweDEwCisjZGVmaW5lIEZTTF9TUkRTQ1I0X1BST1RfU0FUQQkJMHgwMDAwMDgwOAorI2RlZmluZSBGU0xfU1JEU0NSNF9QUk9UX1BFWAkJMHgwMDAwMDEwMQorI2RlZmluZSBGU0xfU1JEU0NSNF9QUk9UX1NHTUlJCQkweDAwMDAwNTA1CisjZGVmaW5lIEZTTF9TUkRTQ1I0X1BMQU5FX1gyCQkweDAxMDAwMDAwCisjZGVmaW5lIEZTTF9TUkRTUlNUQ1RMX09GRlMJCTB4MjAKKyNkZWZpbmUgRlNMX1NSRFNSU1RDVExfUlNUCQkweDgwMDAwMDAwCisjZGVmaW5lIEZTTF9TUkRTUlNUQ1RMX1NBVEFfUkVTRVQJMHhmCisKK3ZvaWQgZnNsX3NldHVwX3NlcmRlcyh1MzIgb2Zmc2V0LCBjaGFyIHByb3RvLCB1MzIgcmZja3MsIGNoYXIgdmRkKQoreworCXZvaWQgKnJlZ3MgPSAodm9pZCAqKUNPTkZJR19TWVNfSU1NUiArIG9mZnNldDsKKwl1MzIgdG1wOworCisJLyogMS4wViBjb3JldmRkICovCisJaWYgKHZkZCkgeworCQkvKiBEUFBFL0RQUEEgPSAwICovCisJCXRtcCA9IGluX2JlMzIocmVncyArIEZTTF9TUkRTQ1IwX09GRlMpOworCQl0bXAgJj0gfkZTTF9TUkRTQ1IwX0RQUF8xVjI7CisJCW91dF9iZTMyKHJlZ3MgKyBGU0xfU1JEU0NSMF9PRkZTLCB0bXApOworCisJCS8qIFZERCA9IDAgKi8KKwkJdG1wID0gaW5fYmUzMihyZWdzICsgRlNMX1NSRFNDUjJfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjJfVkREXzFWMjsKKwkJb3V0X2JlMzIocmVncyArIEZTTF9TUkRTQ1IyX09GRlMsIHRtcCk7CisJfQorCisJLyogcHJvdG9jb2wgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIEZTTF9TRVJERVNfUFJPVE9fU0FUQToKKwkJLyogU2V0IGFuZCBjbGVhciByZXNldCBiaXRzICovCisJCXRtcCA9IGluX2JlMzIocmVncyArIEZTTF9TUkRTUlNUQ1RMX09GRlMpOworCQl0bXAgfD0gRlNMX1NSRFNSU1RDVExfU0FUQV9SRVNFVDsKKwkJb3V0X2JlMzIocmVncyArIEZTTF9TUkRTUlNUQ1RMX09GRlMsIHRtcCk7CisJCXVkZWxheSgxMDAwKTsKKwkJdG1wICY9IH5GU0xfU1JEU1JTVENUTF9TQVRBX1JFU0VUOworCQlvdXRfYmUzMihyZWdzICsgRlNMX1NSRFNSU1RDVExfT0ZGUywgdG1wKTsKKworCQkvKiBDb25maWd1cmUgU1JEU0NSMSAqLworCQl0bXAgPSBpbl9iZTMyKHJlZ3MgKyBGU0xfU1JEU0NSMV9PRkZTKTsKKwkJdG1wICY9IH5GU0xfU1JEU0NSMV9QTExCVzsKKwkJb3V0X2JlMzIocmVncyArIEZTTF9TUkRTQ1IxX09GRlMsIHRtcCk7CisKKwkJLyogQ29uZmlndXJlIFNSRFNDUjIgKi8KKwkJdG1wID0gaW5fYmUzMihyZWdzICsgRlNMX1NSRFNDUjJfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjJfU0VJQ19NQVNLOworCQl0bXAgfD0gRlNMX1NSRFNDUjJfU0VJQ19TQVRBOworCQlvdXRfYmUzMihyZWdzICsgRlNMX1NSRFNDUjJfT0ZGUywgdG1wKTsKKworCQkvKiBDb25maWd1cmUgU1JEU0NSMyAqLworCQl0bXAgPSBGU0xfU1JEU0NSM19LRlJfU0FUQSB8IEZTTF9TUkRTQ1IzX0tQSF9TQVRBIHwKKwkJCUZTTF9TUkRTQ1IzX1NERk1fU0FUQV9QRVggfAorCQkJRlNMX1NSRFNDUjNfU0RUWExfU0FUQTsKKwkJb3V0X2JlMzIocmVncyArIEZTTF9TUkRTQ1IzX09GRlMsIHRtcCk7CisKKwkJLyogQ29uZmlndXJlIFNSRFNDUjQgKi8KKwkJdG1wID0gcmZja3MgfCBGU0xfU1JEU0NSNF9QUk9UX1NBVEE7CisJCW91dF9iZTMyKHJlZ3MgKyBGU0xfU1JEU0NSNF9PRkZTLCB0bXApOworCQlicmVhazsKKwljYXNlIEZTTF9TRVJERVNfUFJPVE9fUEVYOgorCWNhc2UgRlNMX1NFUkRFU19QUk9UT19QRVhfWDI6CisJCS8qIENvbmZpZ3VyZSBTUkRTQ1IxICovCisJCXRtcCA9IGluX2JlMzIocmVncyArIEZTTF9TUkRTQ1IxX09GRlMpOworCQl0bXAgfD0gRlNMX1NSRFNDUjFfUExMQlc7CisJCW91dF9iZTMyKHJlZ3MgKyBGU0xfU1JEU0NSMV9PRkZTLCB0bXApOworCisJCS8qIENvbmZpZ3VyZSBTUkRTQ1IyICovCisJCXRtcCA9IGluX2JlMzIocmVncyArIEZTTF9TUkRTQ1IyX09GRlMpOworCQl0bXAgJj0gfkZTTF9TUkRTQ1IyX1NFSUNfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IyX1NFSUNfUEVYOworCQlvdXRfYmUzMihyZWdzICsgRlNMX1NSRFNDUjJfT0ZGUywgdG1wKTsKKworCQkvKiBDb25maWd1cmUgU1JEU0NSMyAqLworCQl0bXAgPSBGU0xfU1JEU0NSM19TREZNX1NBVEFfUEVYOworCQlvdXRfYmUzMihyZWdzICsgRlNMX1NSRFNDUjNfT0ZGUywgdG1wKTsKKworCQkvKiBDb25maWd1cmUgU1JEU0NSNCAqLworCQl0bXAgPSByZmNrcyB8IEZTTF9TUkRTQ1I0X1BST1RfUEVYOworCQlpZiAocHJvdG8gPT0gRlNMX1NFUkRFU19QUk9UT19QRVhfWDIpCisJCQl0bXAgfD0gRlNMX1NSRFNDUjRfUExBTkVfWDI7CisJCW91dF9iZTMyKHJlZ3MgKyBGU0xfU1JEU0NSNF9PRkZTLCB0bXApOworCQlicmVhazsKKwljYXNlIEZTTF9TRVJERVNfUFJPVE9fU0dNSUk6CisJCS8qIENvbmZpZ3VyZSBTUkRTQ1IxICovCisJCXRtcCA9IGluX2JlMzIocmVncyArIEZTTF9TUkRTQ1IxX09GRlMpOworCQl0bXAgJj0gfkZTTF9TUkRTQ1IxX1BMTEJXOworCQlvdXRfYmUzMihyZWdzICsgRlNMX1NSRFNDUjFfT0ZGUywgdG1wKTsKKworCQkvKiBDb25maWd1cmUgU1JEU0NSMiAqLworCQl0bXAgPSBpbl9iZTMyKHJlZ3MgKyBGU0xfU1JEU0NSMl9PRkZTKTsKKwkJdG1wICY9IH5GU0xfU1JEU0NSMl9TRUlDX01BU0s7CisJCXRtcCB8PSBGU0xfU1JEU0NSMl9TRUlDX1NHTUlJOworCQlvdXRfYmUzMihyZWdzICsgRlNMX1NSRFNDUjJfT0ZGUywgdG1wKTsKKworCQkvKiBDb25maWd1cmUgU1JEU0NSMyAqLworCQlvdXRfYmUzMihyZWdzICsgRlNMX1NSRFNDUjNfT0ZGUywgMCk7CisKKwkJLyogQ29uZmlndXJlIFNSRFNDUjQgKi8KKwkJdG1wID0gcmZja3MgfCBGU0xfU1JEU0NSNF9QUk9UX1NHTUlJOworCQlvdXRfYmUzMihyZWdzICsgRlNMX1NSRFNDUjRfT0ZGUywgdG1wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCS8qIERvIGEgc29mdHdhcmUgcmVzZXQgKi8KKwl0bXAgPSBpbl9iZTMyKHJlZ3MgKyBGU0xfU1JEU1JTVENUTF9PRkZTKTsKKwl0bXAgfD0gRlNMX1NSRFNSU1RDVExfUlNUOworCW91dF9iZTMyKHJlZ3MgKyBGU0xfU1JEU1JTVENUTF9PRkZTLCB0bXApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3NwZF9zZHJhbS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3NwZF9zZHJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YWFhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvc3BkX3NkcmFtLmMKQEAgLTAsMCArMSw5MTggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogKEMpIENvcHlyaWdodCAyMDAzIE1vdG9yb2xhIEluYy4KKyAqIFhpYW5naHVhIFhpYW8gKFguWGlhb0Btb3Rvcm9sYS5jb20pCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxzcGQuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8c3BkX3NkcmFtLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCit2b2lkIGJvYXJkX2FkZF9yYW1faW5mbyhpbnQgdXNlX2RlZmF1bHQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgZGRyODN4eF90ICpkZHIgPSAmaW1tYXAtPmRkcjsKKwljaGFyIGJ1ZlszMl07CisKKwlwcmludGYoIiAoRERSJWQiLCAoKGRkci0+c2RyYW1fY2ZnICYgU0RSQU1fQ0ZHX1NEUkFNX1RZUEVfTUFTSykKKwkJCSAgID4+IFNEUkFNX0NGR19TRFJBTV9UWVBFX1NISUZUKSAtIDEpOworCisJaWYgKGRkci0+c2RyYW1fY2ZnICYgU0RSQU1fQ0ZHXzMyX0JFKQorCQlwdXRzKCIsIDMyLWJpdCIpOworCWVsc2UKKwkJcHV0cygiLCA2NC1iaXQiKTsKKworCWlmIChkZHItPnNkcmFtX2NmZyAmIFNEUkFNX0NGR19FQ0NfRU4pCisJCXB1dHMoIiwgRUNDIG9uIik7CisJZWxzZQorCQlwdXRzKCIsIEVDQyBvZmYiKTsKKworCXByaW50ZigiLCAlcyBNSHopIiwgc3RybWh6KGJ1ZiwgZ2QtPm1lbV9jbGspKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19MQl9TRFJBTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0xCQ19TRFJBTV9TSVpFKQorCXB1dHMoIlxuU0RSQU06ICIpOworCXByaW50X3NpemUgKENPTkZJR19TWVNfTEJDX1NEUkFNX1NJWkUgKiAxMDI0ICogMTAyNCwgIiAobG9jYWwgYnVzKSIpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfU1BEX0VFUFJPTQorI2lmbmRlZglDT05GSUdfU1lTX1JFQURfU1BECisjZGVmaW5lIENPTkZJR19TWVNfUkVBRF9TUEQJaTJjX3JlYWQKKyNlbmRpZgorCisvKgorICogQ29udmVydCBwaWNvc2Vjb25kcyBpbnRvIGNsb2NrIGN5Y2xlcyAocm91bmRpbmcgdXAgaWYgbmVlZGVkKS4KKyAqLworaW50CitwaWNvc190b19jbGsoaW50IHBpY29zKQoreworCXVuc2lnbmVkIGludCBtZW1fYnVzX2NsazsKKwlpbnQgY2xrczsKKworCW1lbV9idXNfY2xrID0gZ2QtPm1lbV9jbGsgPj4gMTsKKwljbGtzID0gcGljb3MgLyAoMTAwMDAwMDAwMCAvIChtZW1fYnVzX2NsayAvIDEwMDApKTsKKwlpZiAocGljb3MgJSAoMTAwMDAwMDAwMCAvIChtZW1fYnVzX2NsayAvIDEwMDApKSAhPSAwKQorCQljbGtzKys7CisKKwlyZXR1cm4gY2xrczsKK30KKwordW5zaWduZWQgaW50IGJhbmtzaXplKHVuc2lnbmVkIGNoYXIgcm93X2RlbnMpCit7CisJcmV0dXJuICgocm93X2RlbnMgPj4gMikgfCAoKHJvd19kZW5zICYgMykgPDwgNikpIDw8IDI0OworfQorCitpbnQgcmVhZF9zcGQodWludCBhZGRyKQoreworCXJldHVybiAoKGludCkgYWRkcik7Cit9CisKKyN1bmRlZiBTUERfREVCVUcKKyNpZmRlZiBTUERfREVCVUcKK3N0YXRpYyB2b2lkIHNwZF9kZWJ1ZyhzcGRfZWVwcm9tX3QgKnNwZCkKK3sKKwlwcmludGYgKCJcbkRJTU0gdHlwZTogICAgICAgJS0xOC4xOHNcbiIsIHNwZC0+bXBhcnQpOworCXByaW50ZiAoIlNQRCBzaXplOiAgICAgICAgJWRcbiIsIHNwZC0+aW5mb19zaXplKTsKKwlwcmludGYgKCJFRVBST00gc2l6ZTogICAgICVkXG4iLCAxIDw8IHNwZC0+Y2hpcF9zaXplKTsKKwlwcmludGYgKCJNZW1vcnkgdHlwZTogICAgICVkXG4iLCBzcGQtPm1lbV90eXBlKTsKKwlwcmludGYgKCJSb3cgYWRkcjogICAgICAgICVkXG4iLCBzcGQtPm5yb3dfYWRkcik7CisJcHJpbnRmICgiQ29sdW1uIGFkZHI6ICAgICAlZFxuIiwgc3BkLT5uY29sX2FkZHIpOworCXByaW50ZiAoIiMgb2Ygcm93czogICAgICAgJWRcbiIsIHNwZC0+bnJvd3MpOworCXByaW50ZiAoIlJvdyBkZW5zaXR5OiAgICAgJWRcbiIsIHNwZC0+cm93X2RlbnMpOworCXByaW50ZiAoIiMgb2YgYmFua3M6ICAgICAgJWRcbiIsIHNwZC0+bmJhbmtzKTsKKwlwcmludGYgKCJEYXRhIHdpZHRoOiAgICAgICVkXG4iLAorCQkJMjU2ICogc3BkLT5kYXRhd19tc2IgKyBzcGQtPmRhdGF3X2xzYik7CisJcHJpbnRmICgiQ2hpcCB3aWR0aDogICAgICAlZFxuIiwgc3BkLT5wcmltdyk7CisJcHJpbnRmICgiUmVmcmVzaCByYXRlOiAgICAlMDJYXG4iLCBzcGQtPnJlZnJlc2gpOworCXByaW50ZiAoIkNBUyBsYXRlbmNpZXM6ICAgJTAyWFxuIiwgc3BkLT5jYXNfbGF0KTsKKwlwcmludGYgKCJXcml0ZSBsYXRlbmNpZXM6ICUwMlhcbiIsIHNwZC0+d3JpdGVfbGF0KTsKKwlwcmludGYgKCJ0UlA6ICAgICAgICAgICAgICVkXG4iLCBzcGQtPnRycCk7CisJcHJpbnRmICgidFJDRDogICAgICAgICAgICAlZFxuIiwgc3BkLT50cmNkKTsKKwlwcmludGYgKCJcbiIpOworfQorI2VuZGlmIC8qIFNQRF9ERUJVRyAqLworCitsb25nIGludCBzcGRfc2RyYW0oKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgZGRyODN4eF90ICpkZHIgPSAmaW1tYXAtPmRkcjsKKwl2b2xhdGlsZSBsYXc4M3h4X3QgKmVjbSA9ICZpbW1hcC0+c3lzY29uZi5kZHJsYXdbMF07CisJc3BkX2VlcHJvbV90IHNwZDsKKwl1bnNpZ25lZCBpbnQgbl9yYW5rczsKKwl1bnNpZ25lZCBpbnQgb2R0X3JkX2NmZywgb2R0X3dyX2NmZzsKKwl1bnNpZ25lZCBjaGFyIHR3cl9jbGssIHR3dHJfY2xrOworCXVuc2lnbmVkIGludCBzZHJhbV90eXBlOworCXVuc2lnbmVkIGludCBtZW1zaXplOworCXVuc2lnbmVkIGludCBsYXdfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIGNhc2xhdCwgY2FzbGF0X2N0cmw7CisJdW5zaWduZWQgaW50IHRyZmMsIHRyZmNfY2xrLCB0cmZjX2xvdywgdHJmY19oaWdoOworCXVuc2lnbmVkIGludCB0cmNkX2NsaywgdHJ0cF9jbGs7CisJdW5zaWduZWQgY2hhciBja2VfbWluX2NsazsKKwl1bnNpZ25lZCBjaGFyIGFkZF9sYXQsIHdyX2xhdDsKKwl1bnNpZ25lZCBjaGFyIHdyX2RhdGFfZGVsYXk7CisJdW5zaWduZWQgY2hhciBmb3VyX2FjdDsKKwl1bnNpZ25lZCBjaGFyIGNwbzsKKwl1bnNpZ25lZCBjaGFyIGJ1cnN0bGVuOworCXVuc2lnbmVkIGNoYXIgb2R0X2NmZywgbW9kZV9vZHRfZW5hYmxlOworCXVuc2lnbmVkIGludCBtYXhfYnVzX2NsazsKKwl1bnNpZ25lZCBpbnQgbWF4X2RhdGFfcmF0ZSwgZWZmZWN0aXZlX2RhdGFfcmF0ZTsKKwl1bnNpZ25lZCBpbnQgZGRyY19jbGs7CisJdW5zaWduZWQgaW50IHJlZnJlc2hfY2xrOworCXVuc2lnbmVkIGludCBzZHJhbV9jZmc7CisJdW5zaWduZWQgaW50IGRkcmNfZWNjX2VuYWJsZTsKKwl1bnNpZ25lZCBpbnQgcHZyID0gZ2V0X3B2cigpOworCisJLyoKKwkgKiBGaXJzdCBkaXNhYmxlIHRoZSBtZW1vcnkgY29udHJvbGxlciAoY291bGQgYmUgZW5hYmxlZAorCSAqIGJ5IHRoZSBkZWJ1Z2dlcikKKwkgKi8KKwljbHJzZXRiaXRzX2JlMzIoJmRkci0+c2RyYW1fY2ZnLCBTRFJBTV9DRkdfTUVNX0VOLCAwKTsKKwlzeW5jKCk7CisJaXN5bmMoKTsKKworCS8qIFJlYWQgU1BEIHBhcmFtZXRlcnMgd2l0aCBJMkMgKi8KKwlDT05GSUdfU1lTX1JFQURfU1BEKFNQRF9FRVBST01fQUREUkVTUywgMCwgMSwgKHVjaGFyICopICYgc3BkLCBzaXplb2YgKHNwZCkpOworI2lmZGVmIFNQRF9ERUJVRworCXNwZF9kZWJ1Zygmc3BkKTsKKyNlbmRpZgorCS8qIENoZWNrIHRoZSBtZW1vcnkgdHlwZSAqLworCWlmIChzcGQubWVtX3R5cGUgIT0gU1BEX01FTVRZUEVfRERSICYmIHNwZC5tZW1fdHlwZSAhPSBTUERfTUVNVFlQRV9ERFIyKSB7CisJCWRlYnVnKCJERFI6IE1vZHVsZSBtZW0gdHlwZSBpcyAlMDJYXG4iLCBzcGQubWVtX3R5cGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGJhbmsgKi8KKwlpZiAoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUikgeworCQluX3JhbmtzID0gc3BkLm5yb3dzOworCX0gZWxzZSB7CisJCW5fcmFua3MgPSAoc3BkLm5yb3dzICYgMHg3KSArIDE7CisJfQorCisJaWYgKG5fcmFua3MgPiAyKSB7CisJCXByaW50ZigiRERSOiBUaGUgbnVtYmVyIG9mIHBoeXNpY2FsIGJhbmsgaXMgJTAyWFxuIiwgbl9yYW5rcyk7CisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygcm93IG9mIHRoZSBtb2R1bGUgaXMgaW4gdGhlIHJhbmdlIG9mIEREUkMgKi8KKwlpZiAoc3BkLm5yb3dfYWRkciA8IDEyIHx8IHNwZC5ucm93X2FkZHIgPiAxNSkgeworCQlwcmludGYoIkREUjogUm93IG51bWJlciBpcyBvdXQgb2YgcmFuZ2Ugb2YgRERSQywgcm93PSUwMlhcbiIsCisJCQkJCQkJIHNwZC5ucm93X2FkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIGNvbCBvZiB0aGUgbW9kdWxlIGlzIGluIHRoZSByYW5nZSBvZiBERFJDICovCisJaWYgKHNwZC5uY29sX2FkZHIgPCA4IHx8IHNwZC5uY29sX2FkZHIgPiAxMSkgeworCQlwcmludGYoIkREUjogQ29sIG51bWJlciBpcyBvdXQgb2YgcmFuZ2Ugb2YgRERSQywgY29sPSUwMlhcbiIsCisJCQkJCQkJIHNwZC5uY29sX2FkZHIpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBDT05GSUdfU1lTX0REUkNEUl9WQUxVRQorCS8qCisJICogQWRqdXN0IEREUiBJSSBJTyB2b2x0YWdlIGJpYXNpbmcuICBJdCBqdXN0IG1ha2VzIGl0IHdvcmsuCisJICovCisJaWYoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUjIpIHsKKwkJaW1tYXAtPnN5c2NvbmYuZGRyY2RyID0gQ09ORklHX1NZU19ERFJDRFJfVkFMVUU7CisJfQorCXVkZWxheSg1MDAwMCk7CisjZW5kaWYKKworCS8qCisJICogT0RUIGNvbmZpZ3VyYXRpb24gcmVjb21tZW5kYXRpb24gZnJvbSBERFIgQ29udHJvbGxlciBDaGFwdGVyLgorCSAqLworCW9kdF9yZF9jZmcgPSAwOwkJCS8qIE5ldmVyIGFzc2VydCBPRFQgKi8KKwlvZHRfd3JfY2ZnID0gMDsJCQkvKiBOZXZlciBhc3NlcnQgT0RUICovCisJaWYgKHNwZC5tZW1fdHlwZSA9PSBTUERfTUVNVFlQRV9ERFIyKSB7CisJCW9kdF93cl9jZmcgPSAxOwkJLyogQXNzZXJ0IE9EVCBvbiB3cml0ZXMgdG8gQ1NuICovCisJfQorCisJLyogU2V0dXAgRERSIGNoaXAgc2VsZWN0IHJlZ2lzdGVyICovCisjaWZkZWYgQ09ORklHX1NZU184M1hYX0REUl9VU0VTX0NTMAorCWRkci0+Y3NibmRzWzBdLmNzYm5kcyA9IChiYW5rc2l6ZShzcGQucm93X2RlbnMpID4+IDI0KSAtIDE7CisJZGRyLT5jc19jb25maWdbMF0gPSAoIDEgPDwgMzEKKwkJCSAgICB8IChvZHRfcmRfY2ZnIDw8IDIwKQorCQkJICAgIHwgKG9kdF93cl9jZmcgPDwgMTYpCisJCQkgICAgfCAoKHNwZC5uYmFua3MgPT0gOCA/IDEgOiAwKSA8PCAxNCkKKwkJCSAgICB8ICgoc3BkLm5yb3dfYWRkciAtIDEyKSA8PCA4KQorCQkJICAgIHwgKHNwZC5uY29sX2FkZHIgLSA4KSApOworCWRlYnVnKCJcbiIpOworCWRlYnVnKCJjczBfYm5kcyA9IDB4JTA4eFxuIixkZHItPmNzYm5kc1swXS5jc2JuZHMpOworCWRlYnVnKCJjczBfY29uZmlnID0gMHglMDh4XG4iLGRkci0+Y3NfY29uZmlnWzBdKTsKKworCWlmIChuX3JhbmtzID09IDIpIHsKKwkJZGRyLT5jc2JuZHNbMV0uY3NibmRzID0gKCAoYmFua3NpemUoc3BkLnJvd19kZW5zKSA+PiA4KQorCQkJCSAgfCAoKGJhbmtzaXplKHNwZC5yb3dfZGVucykgPj4gMjMpIC0gMSkgKTsKKwkJZGRyLT5jc19jb25maWdbMV0gPSAoIDE8PDMxCisJCQkJICAgIHwgKG9kdF9yZF9jZmcgPDwgMjApCisJCQkJICAgIHwgKG9kdF93cl9jZmcgPDwgMTYpCisJCQkJICAgIHwgKChzcGQubmJhbmtzID09IDggPyAxIDogMCkgPDwgMTQpCisJCQkJICAgIHwgKChzcGQubnJvd19hZGRyIC0gMTIpIDw8IDgpCisJCQkJICAgIHwgKHNwZC5uY29sX2FkZHIgLSA4KSApOworCQlkZWJ1ZygiY3MxX2JuZHMgPSAweCUwOHhcbiIsZGRyLT5jc2JuZHNbMV0uY3NibmRzKTsKKwkJZGVidWcoImNzMV9jb25maWcgPSAweCUwOHhcbiIsZGRyLT5jc19jb25maWdbMV0pOworCX0KKworI2Vsc2UKKwlkZHItPmNzYm5kc1syXS5jc2JuZHMgPSAoYmFua3NpemUoc3BkLnJvd19kZW5zKSA+PiAyNCkgLSAxOworCWRkci0+Y3NfY29uZmlnWzJdID0gKCAxIDw8IDMxCisJCQkgICAgfCAob2R0X3JkX2NmZyA8PCAyMCkKKwkJCSAgICB8IChvZHRfd3JfY2ZnIDw8IDE2KQorCQkJICAgIHwgKChzcGQubmJhbmtzID09IDggPyAxIDogMCkgPDwgMTQpCisJCQkgICAgfCAoKHNwZC5ucm93X2FkZHIgLSAxMikgPDwgOCkKKwkJCSAgICB8IChzcGQubmNvbF9hZGRyIC0gOCkgKTsKKwlkZWJ1ZygiXG4iKTsKKwlkZWJ1ZygiY3MyX2JuZHMgPSAweCUwOHhcbiIsZGRyLT5jc2JuZHNbMl0uY3NibmRzKTsKKwlkZWJ1ZygiY3MyX2NvbmZpZyA9IDB4JTA4eFxuIixkZHItPmNzX2NvbmZpZ1syXSk7CisKKwlpZiAobl9yYW5rcyA9PSAyKSB7CisJCWRkci0+Y3NibmRzWzNdLmNzYm5kcyA9ICggKGJhbmtzaXplKHNwZC5yb3dfZGVucykgPj4gOCkKKwkJCQkgIHwgKChiYW5rc2l6ZShzcGQucm93X2RlbnMpID4+IDIzKSAtIDEpICk7CisJCWRkci0+Y3NfY29uZmlnWzNdID0gKCAxPDwzMQorCQkJCSAgICB8IChvZHRfcmRfY2ZnIDw8IDIwKQorCQkJCSAgICB8IChvZHRfd3JfY2ZnIDw8IDE2KQorCQkJCSAgICB8ICgoc3BkLm5iYW5rcyA9PSA4ID8gMSA6IDApIDw8IDE0KQorCQkJCSAgICB8ICgoc3BkLm5yb3dfYWRkciAtIDEyKSA8PCA4KQorCQkJCSAgICB8IChzcGQubmNvbF9hZGRyIC0gOCkgKTsKKwkJZGVidWcoImNzM19ibmRzID0gMHglMDh4XG4iLGRkci0+Y3NibmRzWzNdLmNzYm5kcyk7CisJCWRlYnVnKCJjczNfY29uZmlnID0gMHglMDh4XG4iLGRkci0+Y3NfY29uZmlnWzNdKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogRmlndXJlIG91dCBtZW1vcnkgc2l6ZSBpbiBNZWdhYnl0ZXMuCisJICovCisJbWVtc2l6ZSA9IG5fcmFua3MgKiBiYW5rc2l6ZShzcGQucm93X2RlbnMpIC8gMHgxMDAwMDA7CisKKwkvKgorCSAqIEZpcnN0IHN1cHBvcnRlZCBMQVcgc2l6ZSBpcyAxNk0sIGF0IExBV0FSX1NJWkVfMTZNID09IDIzLgorCSAqLworCWxhd19zaXplID0gMTkgKyBfX2lsb2cyKG1lbXNpemUpOworCisJLyoKKwkgKiBTZXQgdXAgTEFXQkFSIGZvciBhbGwgb2YgRERSLgorCSAqLworCWVjbS0+YmFyID0gQ09ORklHX1NZU19ERFJfU0RSQU1fQkFTRSAmIDB4ZmZmZmYwMDA7CisJZWNtLT5hciAgPSAoTEFXQVJfRU4gfCBMQVdBUl9UUkdUX0lGX0REUiB8IChMQVdBUl9TSVpFICYgbGF3X3NpemUpKTsKKwlkZWJ1ZygiRERSOmJhcj0weCUwOHhcbiIsIGVjbS0+YmFyKTsKKwlkZWJ1ZygiRERSOmFyPTB4JTA4eFxuIiwgZWNtLT5hcik7CisKKwkvKgorCSAqIEZpbmQgdGhlIGxhcmdlc3QgQ0FTIGJ5IGxvY2F0aW5nIHRoZSBoaWdoZXN0IDEgYml0CisJICogaW4gdGhlIHNwZC5jYXNfbGF0IGZpZWxkLiAgVHJhbnNsYXRlIGl0IHRvIGEgRERSCisJICogY29udHJvbGxlciBmaWVsZCB2YWx1ZToKKwkgKgorCSAqCUNBUyBMYXQJRERSIEkJRERSIElJCUN0cmwKKwkgKglDbG9ja3MJU1BEIEJpdAlTUEQgQml0CVZhbHVlCisJICoJLS0tLS0tLQktLS0tLS0tCS0tLS0tLS0JLS0tLS0KKwkgKgkxLjAJMAkJMDAwMQorCSAqCTEuNQkxCQkwMDEwCisJICoJMi4wCTIJMgkwMDExCisJICoJMi41CTMJCTAxMDAKKwkgKgkzLjAJNAkzCTAxMDEKKwkgKgkzLjUJNQkJMDExMAorCSAqCTQuMAk2CTQJMDExMQorCSAqCTQuNQkJCTEwMDAKKwkgKgk1LjAJCTUJMTAwMQorCSAqLworCWNhc2xhdCA9IF9faWxvZzIoc3BkLmNhc19sYXQpOworCWlmICgoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUikKKwkgICAgJiYgKGNhc2xhdCA+IDYpKSB7CisJCXByaW50ZigiRERSIEk6IEludmFsaWQgU1BEIENBUyBMYXRlbmN5OiAweCV4LlxuIiwgc3BkLmNhc19sYXQpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHNwZC5tZW1fdHlwZSA9PSBTUERfTUVNVFlQRV9ERFIyCisJCSAgICYmIChjYXNsYXQgPCAyIHx8IGNhc2xhdCA+IDUpKSB7CisJCXByaW50ZigiRERSIElJOiBJbnZhbGlkIFNQRCBDQVMgTGF0ZW5jeTogMHgleC5cbiIsCisJCSAgICAgICBzcGQuY2FzX2xhdCk7CisJCXJldHVybiAwOworCX0KKwlkZWJ1ZygiRERSOiBjYXNsYXQgU1BEIGJpdCBpcyAlZFxuIiwgY2FzbGF0KTsKKworCW1heF9idXNfY2xrID0gMTAwMCAqMTAgLyAoKChzcGQuY2xrX2N5Y2xlICYgMHhGMCkgPj4gNCkgKiAxMAorCQkJKyAoc3BkLmNsa19jeWNsZSAmIDB4MGYpKTsKKwltYXhfZGF0YV9yYXRlID0gbWF4X2J1c19jbGsgKiAyOworCisJZGVidWcoIkREUjpNb2R1bGUgbWF4aW11bSBkYXRhIHJhdGUgaXM6ICVkIE1IelxuIiwgbWF4X2RhdGFfcmF0ZSk7CisKKwlkZHJjX2NsayA9IGdkLT5tZW1fY2xrIC8gMTAwMDAwMDsKKwllZmZlY3RpdmVfZGF0YV9yYXRlID0gMDsKKworCWlmIChtYXhfZGF0YV9yYXRlID49IDQ2MCkgeyAvKiBpdCBpcyBERFIyLTgwMCwgNjY3LCA1MzMgKi8KKwkJaWYgKHNwZC5jYXNfbGF0ICYgMHgwOCkKKwkJCWNhc2xhdCA9IDM7CisJCWVsc2UKKwkJCWNhc2xhdCA9IDQ7CisJCWlmIChkZHJjX2NsayA8PSA0NjAgJiYgZGRyY19jbGsgPiAzNTApCisJCQllZmZlY3RpdmVfZGF0YV9yYXRlID0gNDAwOworCQllbHNlIGlmIChkZHJjX2NsayA8PTM1MCAmJiBkZHJjX2NsayA+IDI4MCkKKwkJCWVmZmVjdGl2ZV9kYXRhX3JhdGUgPSAzMzM7CisJCWVsc2UgaWYgKGRkcmNfY2xrIDw9IDI4MCAmJiBkZHJjX2NsayA+IDIzMCkKKwkJCWVmZmVjdGl2ZV9kYXRhX3JhdGUgPSAyNjY7CisJCWVsc2UKKwkJCWVmZmVjdGl2ZV9kYXRhX3JhdGUgPSAyMDA7CisJfSBlbHNlIGlmIChtYXhfZGF0YV9yYXRlID49IDM5MCAmJiBtYXhfZGF0YV9yYXRlIDwgNDYwKSB7IC8qIGl0IGlzIEREUiA0MDAgKi8KKwkJaWYgKGRkcmNfY2xrIDw9IDQ2MCAmJiBkZHJjX2NsayA+IDM1MCkgeworCQkJLyogRERSIGNvbnRyb2xsZXIgY2xrIGF0IDM1MH40NjAgKi8KKwkJCWVmZmVjdGl2ZV9kYXRhX3JhdGUgPSA0MDA7IC8qIDVucyAqLworCQkJY2FzbGF0ID0gY2FzbGF0OworCQl9IGVsc2UgaWYgKGRkcmNfY2xrIDw9IDM1MCAmJiBkZHJjX2NsayA+IDI4MCkgeworCQkJLyogRERSIGNvbnRyb2xsZXIgY2xrIGF0IDI4MH4zNTAgKi8KKwkJCWVmZmVjdGl2ZV9kYXRhX3JhdGUgPSAzMzM7IC8qIDZucyAqLworCQkJaWYgKHNwZC5jbGtfY3ljbGUyID09IDB4NjApCisJCQkJY2FzbGF0ID0gY2FzbGF0IC0gMTsKKwkJCWVsc2UKKwkJCQljYXNsYXQgPSBjYXNsYXQ7CisJCX0gZWxzZSBpZiAoZGRyY19jbGsgPD0gMjgwICYmIGRkcmNfY2xrID4gMjMwKSB7CisJCQkvKiBERFIgY29udHJvbGxlciBjbGsgYXQgMjMwfjI4MCAqLworCQkJZWZmZWN0aXZlX2RhdGFfcmF0ZSA9IDI2NjsgLyogNy41bnMgKi8KKwkJCWlmIChzcGQuY2xrX2N5Y2xlMyA9PSAweDc1KQorCQkJCWNhc2xhdCA9IGNhc2xhdCAtIDI7CisJCQllbHNlIGlmIChzcGQuY2xrX2N5Y2xlMiA9PSAweDc1KQorCQkJCWNhc2xhdCA9IGNhc2xhdCAtIDE7CisJCQllbHNlCisJCQkJY2FzbGF0ID0gY2FzbGF0OworCQl9IGVsc2UgaWYgKGRkcmNfY2xrIDw9IDIzMCAmJiBkZHJjX2NsayA+IDkwKSB7CisJCQkvKiBERFIgY29udHJvbGxlciBjbGsgYXQgOTB+MjMwICovCisJCQllZmZlY3RpdmVfZGF0YV9yYXRlID0gMjAwOyAvKiAxMG5zICovCisJCQlpZiAoc3BkLmNsa19jeWNsZTMgPT0gMHhhMCkKKwkJCQljYXNsYXQgPSBjYXNsYXQgLSAyOworCQkJZWxzZSBpZiAoc3BkLmNsa19jeWNsZTIgPT0gMHhhMCkKKwkJCQljYXNsYXQgPSBjYXNsYXQgLSAxOworCQkJZWxzZQorCQkJCWNhc2xhdCA9IGNhc2xhdDsKKwkJfQorCX0gZWxzZSBpZiAobWF4X2RhdGFfcmF0ZSA+PSAzMjMpIHsgLyogaXQgaXMgRERSIDMzMyAqLworCQlpZiAoZGRyY19jbGsgPD0gMzUwICYmIGRkcmNfY2xrID4gMjgwKSB7CisJCQkvKiBERFIgY29udHJvbGxlciBjbGsgYXQgMjgwfjM1MCAqLworCQkJZWZmZWN0aXZlX2RhdGFfcmF0ZSA9IDMzMzsgLyogNm5zICovCisJCQljYXNsYXQgPSBjYXNsYXQ7CisJCX0gZWxzZSBpZiAoZGRyY19jbGsgPD0gMjgwICYmIGRkcmNfY2xrID4gMjMwKSB7CisJCQkvKiBERFIgY29udHJvbGxlciBjbGsgYXQgMjMwfjI4MCAqLworCQkJZWZmZWN0aXZlX2RhdGFfcmF0ZSA9IDI2NjsgLyogNy41bnMgKi8KKwkJCWlmIChzcGQuY2xrX2N5Y2xlMiA9PSAweDc1KQorCQkJCWNhc2xhdCA9IGNhc2xhdCAtIDE7CisJCQllbHNlCisJCQkJY2FzbGF0ID0gY2FzbGF0OworCQl9IGVsc2UgaWYgKGRkcmNfY2xrIDw9IDIzMCAmJiBkZHJjX2NsayA+IDkwKSB7CisJCQkvKiBERFIgY29udHJvbGxlciBjbGsgYXQgOTB+MjMwICovCisJCQllZmZlY3RpdmVfZGF0YV9yYXRlID0gMjAwOyAvKiAxMG5zICovCisJCQlpZiAoc3BkLmNsa19jeWNsZTMgPT0gMHhhMCkKKwkJCQljYXNsYXQgPSBjYXNsYXQgLSAyOworCQkJZWxzZSBpZiAoc3BkLmNsa19jeWNsZTIgPT0gMHhhMCkKKwkJCQljYXNsYXQgPSBjYXNsYXQgLSAxOworCQkJZWxzZQorCQkJCWNhc2xhdCA9IGNhc2xhdDsKKwkJfQorCX0gZWxzZSBpZiAobWF4X2RhdGFfcmF0ZSA+PSAyNTYpIHsgLyogaXQgaXMgRERSIDI2NiAqLworCQlpZiAoZGRyY19jbGsgPD0gMzUwICYmIGRkcmNfY2xrID4gMjgwKSB7CisJCQkvKiBERFIgY29udHJvbGxlciBjbGsgYXQgMjgwfjM1MCAqLworCQkJcHJpbnRmKCJERFI6IEREUiBjb250cm9sbGVyIGZyZXEgaXMgbW9yZSB0aGFuICIKKwkJCQkibWF4IGRhdGEgcmF0ZSBvZiB0aGUgbW9kdWxlXG4iKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGRkcmNfY2xrIDw9IDI4MCAmJiBkZHJjX2NsayA+IDIzMCkgeworCQkJLyogRERSIGNvbnRyb2xsZXIgY2xrIGF0IDIzMH4yODAgKi8KKwkJCWVmZmVjdGl2ZV9kYXRhX3JhdGUgPSAyNjY7IC8qIDcuNW5zICovCisJCQljYXNsYXQgPSBjYXNsYXQ7CisJCX0gZWxzZSBpZiAoZGRyY19jbGsgPD0gMjMwICYmIGRkcmNfY2xrID4gOTApIHsKKwkJCS8qIEREUiBjb250cm9sbGVyIGNsayBhdCA5MH4yMzAgKi8KKwkJCWVmZmVjdGl2ZV9kYXRhX3JhdGUgPSAyMDA7IC8qIDEwbnMgKi8KKwkJCWlmIChzcGQuY2xrX2N5Y2xlMiA9PSAweGEwKQorCQkJCWNhc2xhdCA9IGNhc2xhdCAtIDE7CisJCX0KKwl9IGVsc2UgaWYgKG1heF9kYXRhX3JhdGUgPj0gMTkwKSB7IC8qIGl0IGlzIEREUiAyMDAgKi8KKwkJaWYgKGRkcmNfY2xrIDw9IDM1MCAmJiBkZHJjX2NsayA+IDIzMCkgeworCQkJLyogRERSIGNvbnRyb2xsZXIgY2xrIGF0IDIzMH4zNTAgKi8KKwkJCXByaW50ZigiRERSOiBERFIgY29udHJvbGxlciBmcmVxIGlzIG1vcmUgdGhhbiAiCisJCQkJIm1heCBkYXRhIHJhdGUgb2YgdGhlIG1vZHVsZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChkZHJjX2NsayA8PSAyMzAgJiYgZGRyY19jbGsgPiA5MCkgeworCQkJLyogRERSIGNvbnRyb2xsZXIgY2xrIGF0IDkwfjIzMCAqLworCQkJZWZmZWN0aXZlX2RhdGFfcmF0ZSA9IDIwMDsgLyogMTBucyAqLworCQkJY2FzbGF0ID0gY2FzbGF0OworCQl9CisJfQorCisJZGVidWcoIkREUjpFZmZlY3RpdmUgZGF0YSByYXRlIGlzOiAlZE1IelxuIiwgZWZmZWN0aXZlX2RhdGFfcmF0ZSk7CisJZGVidWcoIkREUjpUaGUgTVNCIDEgb2YgQ0FTIExhdGVuY3kgaXM6ICVkXG4iLCBjYXNsYXQpOworCisJLyoKKwkgKiBFcnJhdGEgRERSNiB3b3JrIGFyb3VuZDogaW5wdXQgZW5hYmxlIDIgY3ljbGVzIGVhcmxpZXIuCisJICogaW5jbHVkaW5nIE1QQzgzNHggUmV2MS4wLzEuMSBhbmQgTVBDODM2MCBSZXYxLjEvMS4yLgorCSAqLworCWlmKFBWUl9NQUoocHZyKSA8PSAxICYmIHNwZC5tZW1fdHlwZSA9PSBTUERfTUVNVFlQRV9ERFIpeworCQlpZiAoY2FzbGF0ID09IDIpCisJCQlkZHItPmRlYnVnX3JlZyA9IDB4MjAxYzAwMDA7IC8qIENMPTIgKi8KKwkJZWxzZSBpZiAoY2FzbGF0ID09IDMpCisJCQlkZHItPmRlYnVnX3JlZyA9IDB4MjAyYzAwMDA7IC8qIENMPTIuNSAqLworCQllbHNlIGlmIChjYXNsYXQgPT0gNCkKKwkJCWRkci0+ZGVidWdfcmVnID0gMHgyMDJjMDAwMDsgLyogQ0w9My4wICovCisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzeW5jIik7CisKKwkJZGVidWcoIkVycmF0YSBERFI2IChkZWJ1Z19yZWc9MHglMDh4KVxuIiwgZGRyLT5kZWJ1Z19yZWcpOworCX0KKworCS8qCisJICogQ29udmVydCBjYXNsYXQgY2xvY2tzIHRvIEREUiBjb250cm9sbGVyIHZhbHVlLgorCSAqIEZvcmNlIGNhc2xhdF9jdHJsIHRvIGJlIEREUiBDb250cm9sbGVyIGZpZWxkLXNpemVkLgorCSAqLworCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSKSB7CisJCWNhc2xhdF9jdHJsID0gKGNhc2xhdCArIDEpICYgMHgwNzsKKwl9IGVsc2UgeworCQljYXNsYXRfY3RybCA9ICAoMiAqIGNhc2xhdCAtIDEpICYgMHgwZjsKKwl9CisKKwlkZWJ1ZygiRERSOiBlZmZlY3RpdmUgZGF0YSByYXRlIGlzICVkIE1IelxuIiwgZWZmZWN0aXZlX2RhdGFfcmF0ZSk7CisJZGVidWcoIkREUjogY2FzbGF0IFNQRCBiaXQgaXMgJWQsIGNvbnRyb2xsZXIgZmllbGQgaXMgMHgleFxuIiwKKwkgICAgICBjYXNsYXQsIGNhc2xhdF9jdHJsKTsKKworCS8qCisJICogVGltaW5nIENvbmZpZyAwLgorCSAqIEF2b2lkIHdyaXRpbmcgZm9yIEREUiBJLgorCSAqLworCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSMikgeworCQl1bnNpZ25lZCBjaGFyIHRheHBkX2NsayA9IDg7CQkvKiBCeSB0aGUgYm9vay4gKi8KKwkJdW5zaWduZWQgY2hhciB0bXJkX2NsayA9IDI7CQkvKiBCeSB0aGUgYm9vay4gKi8KKwkJdW5zaWduZWQgY2hhciBhY3RfcGRfZXhpdCA9IDI7CQkvKiBFbXBpcmljYWw/ICovCisJCXVuc2lnbmVkIGNoYXIgcHJlX3BkX2V4aXQgPSA2OwkJLyogRW1waXJpY2FsPyAqLworCisJCWRkci0+dGltaW5nX2NmZ18wID0gKDAKKwkJCXwgKChhY3RfcGRfZXhpdCAmIDB4NykgPDwgMjApCS8qIEFDVF9QRF9FWElUICovCisJCQl8ICgocHJlX3BkX2V4aXQgJiAweDcpIDw8IDE2KQkvKiBQUkVfUERfRVhJVCAqLworCQkJfCAoKHRheHBkX2NsayAmIDB4ZikgPDwgOCkJLyogT0RUX1BEX0VYSVQgKi8KKwkJCXwgKCh0bXJkX2NsayAmIDB4ZikgPDwgMCkJLyogTVJTX0NZQyAqLworCQkJKTsKKwkJZGVidWcoIkREUjogdGltaW5nX2NmZ18wID0gMHglMDh4XG4iLCBkZHItPnRpbWluZ19jZmdfMCk7CisJfQorCisJLyoKKwkgKiBGb3IgRERSIEksIFdSUkVDKFR3cikgYW5kIFdSVE9SRChUd3RyKSBhcmUgbm90IGluIFNQRCwKKwkgKiB1c2UgY29uc2VydmF0aXZlIHZhbHVlLgorCSAqIEZvciBERFIgSUksIHRoZXkgYXJlIGJ5dGVzIDM2IGFuZCAzNywgaW4gcXVhcnRlciBuYW5vcy4KKwkgKi8KKworCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSKSB7CisJCXR3cl9jbGsgPSAzOwkvKiBDbG9ja3MgKi8KKwkJdHd0cl9jbGsgPSAxOwkvKiBDbG9ja3MgKi8KKwl9IGVsc2UgeworCQl0d3JfY2xrID0gcGljb3NfdG9fY2xrKHNwZC50d3IgKiAyNTApOworCQl0d3RyX2NsayA9IHBpY29zX3RvX2NsayhzcGQudHd0ciAqIDI1MCk7CisJCWlmICh0d3RyX2NsayA8IDIpCisJCQl0d3RyX2NsayA9IDI7CisJfQorCisJLyoKKwkgKiBDYWxjdWxhdGUgVHJmYywgaW4gcGljb3MuCisJICogRERSIEk6ICBCeXRlIDQyIHN0cmFpZ2h0IHVwIGluIG5zLgorCSAqIEREUiBJSTogQnl0ZSA0MCBhbmQgNDIgc3dpenpsZWQgc29tZSwgaW4gbnMuCisJICovCisJaWYgKHNwZC5tZW1fdHlwZSA9PSBTUERfTUVNVFlQRV9ERFIpIHsKKwkJdHJmYyA9IHNwZC50cmZjICogMTAwMDsJCS8qIHVwIHRvIHBzICovCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IGJ5dGU0MF90YWJsZV9wc1s4XSA9IHsKKwkJCTAsCisJCQkyNTAsCisJCQkzMzAsCisJCQk1MDAsCisJCQk2NjAsCisJCQk3NTAsCisJCQkwLAorCQkJMAorCQl9OworCisJCXRyZmMgPSAoKChzcGQudHJjdHJmY19leHQgJiAweDEpICogMjU2KSArIHNwZC50cmZjKSAqIDEwMDAKKwkJCSsgYnl0ZTQwX3RhYmxlX3BzWyhzcGQudHJjdHJmY19leHQgPj4gMSkgJiAweDddOworCX0KKwl0cmZjX2NsayA9IHBpY29zX3RvX2Nsayh0cmZjKTsKKworCS8qCisJICogVHJjZCwgQnl0ZSAyOSwgZnJvbSBxdWFydGVyIG5hbm9zIHRvIHBzIGFuZCBjbG9ja3MuCisJICovCisJdHJjZF9jbGsgPSBwaWNvc190b19jbGsoc3BkLnRyY2QgKiAyNTApICYgMHg3OworCisJLyoKKwkgKiBDb252ZXJ0IHRyZmNfY2xrIHRvIEREUiBjb250cm9sbGVyIGZpZWxkcy4gIEREUiBJIHNob3VsZAorCSAqIGZpdCBpbiB0aGUgUkVGUkVDIGZpZWxkICgxNi0xOSkgb2YgVElNSU5HX0NGR18xLCBidXQgdGhlCisJICogODN4eCBjb250cm9sbGVyIGhhcyBhbiBleHRlbmRlZCBSRUZSRUMgZmllbGQgb2YgdGhyZWUgYml0cy4KKwkgKiBUaGUgY29udHJvbGxlciBhdXRvbWF0aWNhbGx5IGFkZHMgOCBjbG9ja3MgdG8gdGhpcyB2YWx1ZSwKKwkgKiBzbyBwcmVhZGp1c3QgaXQgZG93biA4IGZpcnN0IGJlZm9yZSBzcGxpdHRpbmcgaXQgdXAuCisJICovCisJdHJmY19sb3cgPSAodHJmY19jbGsgLSA4KSAmIDB4ZjsKKwl0cmZjX2hpZ2ggPSAoKHRyZmNfY2xrIC0gOCkgPj4gNCkgJiAweDM7CisKKwlkZHItPnRpbWluZ19jZmdfMSA9CisJICAgICgoKHBpY29zX3RvX2NsayhzcGQudHJwICogMjUwKSAmIDB4MDcpIDw8IDI4ICkgfAkvKiBQUkVUT0FDVCAqLworCSAgICAgKChwaWNvc190b19jbGsoc3BkLnRyYXMgKiAxMDAwKSAmIDB4MGYgKSA8PCAyNCApIHwgLyogQUNUVE9QUkUgKi8KKwkgICAgICh0cmNkX2NsayA8PCAyMCApIHwJCQkJLyogQUNUVE9SVyAqLworCSAgICAgKGNhc2xhdF9jdHJsIDw8IDE2ICkgfAkJCQkvKiBDQVNMQVQgKi8KKwkgICAgICh0cmZjX2xvdyA8PCAxMiApIHwJCQkJLyogUkVGRUMgKi8KKwkgICAgICgodHdyX2NsayAmIDB4MDcpIDw8IDgpIHwJCQkJLyogV1JSUkVDICovCisJICAgICAoKHBpY29zX3RvX2NsayhzcGQudHJyZCAqIDI1MCkgJiAweDA3KSA8PCA0KSB8CS8qIEFDVFRPQUNUICovCisJICAgICAoKHR3dHJfY2xrICYgMHgwNykgPDwgMCkJCQkJLyogV1JUT1JEICovCisJICAgICk7CisKKwkvKgorCSAqIEFkZGl0aXZlIExhdGVuY3kKKwkgKiBGb3IgRERSIEksIDAuCisJICogRm9yIEREUiBJSSwgd2l0aCBPRFQgZW5hYmxlZCwgdXNlICJhIHZhbHVlIiBsZXNzIHRoYW4gQUNUVE9SVywKKwkgKiB3aGljaCBjb21lcyBmcm9tIFRyY2QsIGFuZCBhbHNvIG5vdGUgdGhhdDoKKwkgKglhZGRfbGF0ICsgY2FzbGF0IG11c3QgYmUgPj0gNAorCSAqLworCWFkZF9sYXQgPSAwOworCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSMgorCSAgICAmJiAob2R0X3dyX2NmZyB8fCBvZHRfcmRfY2ZnKQorCSAgICAmJiAoY2FzbGF0IDwgNCkpIHsKKwkJYWRkX2xhdCA9IDQgLSBjYXNsYXQ7CisJCWlmICgoYWRkX2xhdCArIGNhc2xhdCkgPCA0KSB7CisJCQlhZGRfbGF0ID0gMDsKKwkJfQorCX0KKworCS8qCisJICogV3JpdGUgRGF0YSBEZWxheQorCSAqIEhpc3RvcmljYWxseSAweDIgPT0gNC84IGNsb2NrIGRlbGF5LgorCSAqIEVtcGlyaWNhbGx5LCAweDMgPT0gNi84IGNsb2NrIGRlbGF5IGlzIHN1Z2dlc3RlZCBmb3IgRERSIEkgMjY2LgorCSAqLworCXdyX2RhdGFfZGVsYXkgPSAyOworCisJLyoKKwkgKiBXcml0ZSBMYXRlbmN5CisJICogUmVhZCB0byBQcmVjaGFyZ2UKKwkgKiBNaW5pbXVtIENLRSBQdWxzZSBXaWR0aC4KKwkgKiBGb3VyIEFjdGl2YXRlIFdpbmRvdworCSAqLworCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYSBsaWUuICBJdCBzaG91bGQgcmVhbGx5IGJlIDEsIGJ1dCBpZiBpdCBpcworCQkgKiBzZXQgdG8gMSwgYml0cyBvdmVybGFwIGludG8gdGhlIG9sZCBjb250cm9sbGVyJ3MKKwkJICogb3RoZXJ3aXNlIHVudXNlZCBBQ1NNIGZpZWxkLiAgSWYgd2UgbGVhdmUgaXQgMCwgdGhlbgorCQkgKiB0aGUgSFcgd2lsbCBtYWdpY2FsbHkgdHJlYXQgaXQgYXMgMSBmb3IgRERSIDEuICBPaCBZZWEuCisJCSAqLworCQl3cl9sYXQgPSAwOworCisJCXRydHBfY2xrID0gMjsJCS8qIEJ5IHRoZSBib29rLiAqLworCQlja2VfbWluX2NsayA9IDE7CS8qIEJ5IHRoZSBib29rLiAqLworCQlmb3VyX2FjdCA9IDE7CQkvKiBCeSB0aGUgYm9vay4gKi8KKworCX0gZWxzZSB7CisJCXdyX2xhdCA9IGNhc2xhdCAtIDE7CisKKwkJLyogQ29udmVydCBTUEQgdmFsdWUgZnJvbSBxdWFydGVyIG5hbm9zIHRvIHBpY29zLiAqLworCQl0cnRwX2NsayA9IHBpY29zX3RvX2NsayhzcGQudHJ0cCAqIDI1MCk7CisJCWlmICh0cnRwX2NsayA8IDIpCisJCQl0cnRwX2NsayA9IDI7CisJCXRydHBfY2xrICs9IGFkZF9sYXQ7CisKKwkJY2tlX21pbl9jbGsgPSAzOwkvKiBCeSB0aGUgYm9vay4gKi8KKwkJZm91cl9hY3QgPSBwaWNvc190b19jbGsoMzc1MDApOwkvKiBCeSB0aGUgYm9vay4gMWsgcGFnZXM/ICovCisJfQorCisJLyoKKwkgKiBFbXBpcmljYWxseSBzZXQgfk1DQVMtdG8tcHJlYW1ibGUgb3ZlcnJpZGUgZm9yIEREUiAyLgorCSAqIFlvdXIgbWlsYWdlIHdpbGwgdmFyeS4KKwkgKi8KKwljcG8gPSAwOworCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSMikgeworCQlpZiAoZWZmZWN0aXZlX2RhdGFfcmF0ZSA9PSAyNjYpIHsKKwkJCWNwbyA9IDB4NDsJCS8qIFJFQURfTEFUICsgMS8yICovCisJCX0gZWxzZSBpZiAoZWZmZWN0aXZlX2RhdGFfcmF0ZSA9PSAzMzMpIHsKKwkJCWNwbyA9IDB4NjsJCS8qIFJFQURfTEFUICsgMSAqLworCQl9IGVsc2UgaWYgKGVmZmVjdGl2ZV9kYXRhX3JhdGUgPT0gNDAwKSB7CisJCQljcG8gPSAweDc7CQkvKiBSRUFEX0xBVCArIDUvNCAqLworCQl9IGVsc2UgeworCQkJLyogQXV0b21hdGljIGNhbGlicmF0aW9uICovCisJCQljcG8gPSAweDFmOworCQl9CisJfQorCisJZGRyLT50aW1pbmdfY2ZnXzIgPSAoMAorCQl8ICgoYWRkX2xhdCAmIDB4NykgPDwgMjgpCQkvKiBBRERfTEFUICovCisJCXwgKChjcG8gJiAweDFmKSA8PCAyMykJCQkvKiBDUE8gKi8KKwkJfCAoKHdyX2xhdCAmIDB4NykgPDwgMTkpCQkvKiBXUl9MQVQgKi8KKwkJfCAoKHRydHBfY2xrICYgMHg3KSA8PCAxMykJCS8qIFJEX1RPX1BSRSAqLworCQl8ICgod3JfZGF0YV9kZWxheSAmIDB4NykgPDwgMTApCQkvKiBXUl9EQVRBX0RFTEFZICovCisJCXwgKChja2VfbWluX2NsayAmIDB4NykgPDwgNikJCS8qIENLRV9QTFMgKi8KKwkJfCAoKGZvdXJfYWN0ICYgMHgxZikgPDwgMCkJCS8qIEZPVVJfQUNUICovCisJCSk7CisKKwlkZWJ1ZygiRERSOnRpbWluZ19jZmdfMT0weCUwOHhcbiIsIGRkci0+dGltaW5nX2NmZ18xKTsKKwlkZWJ1ZygiRERSOnRpbWluZ19jZmdfMj0weCUwOHhcbiIsIGRkci0+dGltaW5nX2NmZ18yKTsKKworCS8qIENoZWNrIERJTU0gZGF0YSBidXMgd2lkdGggKi8KKwlpZiAoc3BkLmRhdGF3X2xzYiA8IDY0KSB7CisJCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSKQorCQkJYnVyc3RsZW4gPSAweDAzOyAvKiAzMiBiaXQgZGF0YSBidXMsIGJ1cnN0IGxlbiBpcyA4ICovCisJCWVsc2UKKwkJCWJ1cnN0bGVuID0gMHgwMjsgLyogMzIgYml0IGRhdGEgYnVzLCBidXJzdCBsZW4gaXMgNCAqLworCQlkZWJ1ZygiXG4gICBERFIgRElNTTogZGF0YSBidXMgd2lkdGggaXMgMzIgYml0Iik7CisJfSBlbHNlIHsKKwkJYnVyc3RsZW4gPSAweDAyOyAvKiBPdGhlcnMgYWN0IGFzIDY0IGJpdCBidXMsIGJ1cnN0IGxlbiBpcyA0ICovCisJCWRlYnVnKCJcbiAgIEREUiBESU1NOiBkYXRhIGJ1cyB3aWR0aCBpcyA2NCBiaXQiKTsKKwl9CisKKwkvKiBJcyB0aGlzIGFuIEVDQyBERFIgY2hpcD8gKi8KKwlpZiAoc3BkLmNvbmZpZyA9PSAweDAyKQorCQlkZWJ1ZygiIHdpdGggRUNDXG4iKTsKKwllbHNlCisJCWRlYnVnKCIgd2l0aG91dCBFQ0NcbiIpOworCisJLyogQnVyc3QgbGVuZ3RoIGlzIGFsd2F5cyA0IGZvciA2NCBiaXQgZGF0YSBidXMsIDggZm9yIDMyIGJpdCBkYXRhIGJ1cywKKwkgICBCdXJzdCB0eXBlIGlzIHNlcXVlbnRpYWwKKwkgKi8KKwlpZiAoc3BkLm1lbV90eXBlID09IFNQRF9NRU1UWVBFX0REUikgeworCQlzd2l0Y2ggKGNhc2xhdCkgeworCQljYXNlIDE6CisJCQlkZHItPnNkcmFtX21vZGUgPSAweDUwIHwgYnVyc3RsZW47IC8qIENMPTEuNSAqLworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWRkci0+c2RyYW1fbW9kZSA9IDB4MjAgfCBidXJzdGxlbjsgLyogQ0w9Mi4wICovCisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJZGRyLT5zZHJhbV9tb2RlID0gMHg2MCB8IGJ1cnN0bGVuOyAvKiBDTD0yLjUgKi8KKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlkZHItPnNkcmFtX21vZGUgPSAweDMwIHwgYnVyc3RsZW47IC8qIENMPTMuMCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIkREUjpvbmx5IENMIDEuNSwgMi4wLCAyLjUsIDMuMCBpcyBzdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQltb2RlX29kdF9lbmFibGUgPSAweDA7ICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBkaXNhYmxlZCAqLworCQlpZiAob2R0X3dyX2NmZyB8fCBvZHRfcmRfY2ZnKSB7CisJCQkvKgorCQkJICogQml0cyA2IGFuZCAyIGluIEV4dGVuZGVkIE1SUygxKQorCQkJICogQml0IDIgPT0gMHgwNCA9PSA3NSBPaG0sIHdpdGggMiBESU1NIG1vZHVsZXMuCisJCQkgKiBCaXQgNiA9PSAweDQwID09IDE1MCBPaG0sIHdpdGggMSBESU1NIG1vZHVsZS4KKwkJCSAqLworCQkJbW9kZV9vZHRfZW5hYmxlID0gMHg0MDsgICAgICAgICAvKiAxNTAgT2htICovCisJCX0KKworCQlkZHItPnNkcmFtX21vZGUgPQorCQkJKDAKKwkJCSB8ICgxIDw8ICgxNiArIDEwKSkgICAgICAgICAgICAgLyogRFFTIERpZmZlcmVudGlhbCBkaXNhYmxlICovCisJCQkgfCAoYWRkX2xhdCA8PCAoMTYgKyAzKSkgICAgICAgIC8qIEFkZGl0aXZlIExhdGVuY3kgaW4gRU1SUzEgKi8KKwkJCSB8IChtb2RlX29kdF9lbmFibGUgPDwgMTYpICAgICAgLyogT0RUIEVuYWJsZSBpbiBFTVJTMSAqLworCQkJIHwgKCh0d3JfY2xrIC0gMSkgPDwgOSkgICAgICAgICAvKiBXcml0ZSBSZWNvdmVyeSBBdXRvcHJlICovCisJCQkgfCAoY2FzbGF0IDw8IDQpICAgICAgICAgICAgICAgIC8qIGNhc2xhdCAqLworCQkJIHwgKGJ1cnN0bGVuIDw8IDApICAgICAgICAgICAgICAvKiBCdXJzdCBsZW5ndGggKi8KKwkJCSk7CisJfQorCWRlYnVnKCJERFI6c2RyYW1fbW9kZT0weCUwOHhcbiIsIGRkci0+c2RyYW1fbW9kZSk7CisKKwkvKgorCSAqIENsZWFyIEVNUlMyIGFuZCBFTVJTMy4KKwkgKi8KKwlkZHItPnNkcmFtX21vZGUyID0gMDsKKwlkZWJ1ZygiRERSOiBzZHJhbV9tb2RlMiA9IDB4JTA4eFxuIiwgZGRyLT5zZHJhbV9tb2RlMik7CisKKwlzd2l0Y2ggKHNwZC5yZWZyZXNoKSB7CisJCWNhc2UgMHgwMDoKKwkJY2FzZSAweDgwOgorCQkJcmVmcmVzaF9jbGsgPSBwaWNvc190b19jbGsoMTU2MjUwMDApOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJY2FzZSAweDgxOgorCQkJcmVmcmVzaF9jbGsgPSBwaWNvc190b19jbGsoMzkwMDAwMCk7CisJCQlicmVhazsKKwkJY2FzZSAweDAyOgorCQljYXNlIDB4ODI6CisJCQlyZWZyZXNoX2NsayA9IHBpY29zX3RvX2Nsayg3ODAwMDAwKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDM6CisJCWNhc2UgMHg4MzoKKwkJCXJlZnJlc2hfY2xrID0gcGljb3NfdG9fY2xrKDMxMzAwMDAwKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCWNhc2UgMHg4NDoKKwkJCXJlZnJlc2hfY2xrID0gcGljb3NfdG9fY2xrKDYyNTAwMDAwKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDU6CisJCWNhc2UgMHg4NToKKwkJCXJlZnJlc2hfY2xrID0gcGljb3NfdG9fY2xrKDEyNTAwMDAwMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlZnJlc2hfY2xrID0gMHg1MTI7CisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFNldCBCU1RPUFJFIHRvIDB4MTAwIGZvciBwYWdlIG1vZGUKKwkgKiBJZiBhdXRvLWNoYXJnZSBpcyB1c2VkLCBzZXQgQlNUT1BSRSA9IDAKKwkgKi8KKwlkZHItPnNkcmFtX2ludGVydmFsID0gKChyZWZyZXNoX2NsayAmIDB4M2ZmZikgPDwgMTYpIHwgMHgxMDA7CisJZGVidWcoIkREUjpzZHJhbV9pbnRlcnZhbD0weCUwOHhcbiIsIGRkci0+c2RyYW1faW50ZXJ2YWwpOworCisJLyoKKwkgKiBTRFJBTSBDZmcgMgorCSAqLworCW9kdF9jZmcgPSAwOworI2lmbmRlZiBDT05GSUdfTkVWRVJfQVNTRVJUX09EVF9UT19DUFUKKwlpZiAob2R0X3JkX2NmZyB8IG9kdF93cl9jZmcpIHsKKwkJb2R0X2NmZyA9IDB4MjsJCS8qIE9EVCB0byBJT3MgZHVyaW5nIHJlYWRzICovCisJfQorI2VuZGlmCisJaWYgKHNwZC5tZW1fdHlwZSA9PSBTUERfTUVNVFlQRV9ERFIyKSB7CisJCWRkci0+c2RyYW1fY2ZnMiA9ICgwCisJCQkgICAgfCAoMCA8PCAyNikJLyogVHJ1ZSBEUVMgKi8KKwkJCSAgICB8IChvZHRfY2ZnIDw8IDIxKQkvKiBPRFQgb25seSByZWFkICovCisJCQkgICAgfCAoMSA8PCAxMikJLyogMSByZWZyZXNoIGF0IGEgdGltZSAqLworCQkJICAgICk7CisKKwkJZGVidWcoIkREUjogc2RyYW1fY2ZnMiAgPSAweCUwOHhcbiIsIGRkci0+c2RyYW1fY2ZnMik7CisJfQorCisjaWZkZWYgQ09ORklHX1NZU19ERFJfU0RSQU1fQ0xLX0NOVEwJLyogT3B0aW9uYWwgcGxhdGZvcm0gc3BlY2lmaWMgdmFsdWUgKi8KKwlkZHItPnNkcmFtX2Nsa19jbnRsID0gQ09ORklHX1NZU19ERFJfU0RSQU1fQ0xLX0NOVEw7CisjZW5kaWYKKwlkZWJ1ZygiRERSOnNkcmFtX2Nsa19jbnRsPTB4JTA4eFxuIiwgZGRyLT5zZHJhbV9jbGtfY250bCk7CisKKwlhc20oInN5bmM7aXN5bmMiKTsKKworCXVkZWxheSg2MDApOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IHRoZSBzZXR0aW5ncyBmb3IgdGhlIHNkcmFtX2NmZyByZWdpc3Rlci4gQnVpbGQgdXAKKwkgKiB0aGUgdmFsdWUgaW4gJ3NkcmFtX2NmZycgYmVmb3JlIHdyaXRpbmcgc2luY2UgdGhlIHdyaXRlIGludG8KKwkgKiB0aGUgcmVnaXN0ZXIgd2lsbCBhY3R1YWxseSBlbmFibGUgdGhlIG1lbW9yeSBjb250cm9sbGVyLCBhbmQgYWxsCisJICogc2V0dGluZ3MgbXVzdCBiZSBkb25lIGJlZm9yZSBlbmFibGluZy4KKwkgKgorCSAqIHNkcmFtX2NmZ1swXSAgID0gMSAoZGRyIHNkcmFtIGxvZ2ljIGVuYWJsZSkKKwkgKiBzZHJhbV9jZmdbMV0gICA9IDEgKHNlbGYtcmVmcmVzaC1lbmFibGUpCisJICogc2RyYW1fY2ZnWzU6N10gPSAoU0RSQU0gdHlwZSA9IEREUiBTRFJBTSkKKwkgKgkJCTAxMCBERFIgMSBTRFJBTQorCSAqCQkJMDExIEREUiAyIFNEUkFNCisJICogc2RyYW1fY2ZnWzEyXSA9IDAgKDMyX0JFID0wICwgNjQgYml0IGJ1cyBtb2RlKQorCSAqIHNkcmFtX2NmZ1sxM10gPSAwICg4X0JFID0wLCA0LWJlYXQgYnVyc3RzKQorCSAqLworCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSKQorCQlzZHJhbV90eXBlID0gU0RSQU1fQ0ZHX1NEUkFNX1RZUEVfRERSMTsKKwllbHNlCisJCXNkcmFtX3R5cGUgPSBTRFJBTV9DRkdfU0RSQU1fVFlQRV9ERFIyOworCisJc2RyYW1fY2ZnID0gKDAKKwkJICAgICB8IFNEUkFNX0NGR19NRU1fRU4JCS8qIEREUiBlbmFibGUgKi8KKwkJICAgICB8IFNEUkFNX0NGR19TUkVOCQkvKiBTZWxmIHJlZnJlc2ggKi8KKwkJICAgICB8IHNkcmFtX3R5cGUJCS8qIFNEUkFNIHR5cGUgKi8KKwkJICAgICApOworCisJLyogc2RyYW1fY2ZnWzNdID0gUkRfRU4gLSByZWdpc3RlcmVkIERJTU0gZW5hYmxlICovCisJaWYgKHNwZC5tb2RfYXR0ciAmIDB4MDIpCisJCXNkcmFtX2NmZyB8PSBTRFJBTV9DRkdfUkRfRU47CisKKwkvKiBUaGUgRElNTSBpcyAzMmJpdCB3aWR0aCAqLworCWlmIChzcGQuZGF0YXdfbHNiIDwgNjQpIHsKKwkJaWYgKHNwZC5tZW1fdHlwZSA9PSBTUERfTUVNVFlQRV9ERFIpCisJCQlzZHJhbV9jZmcgfD0gU0RSQU1fQ0ZHXzMyX0JFIHwgU0RSQU1fQ0ZHXzhfQkU7CisJCWlmIChzcGQubWVtX3R5cGUgPT0gU1BEX01FTVRZUEVfRERSMikKKwkJCXNkcmFtX2NmZyB8PSBTRFJBTV9DRkdfMzJfQkU7CisJfQorCisJZGRyY19lY2NfZW5hYmxlID0gMDsKKworI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpCisJLyogRW5hYmxlIEVDQyB3aXRoIHNkcmFtX2NmZ1syXSAqLworCWlmIChzcGQuY29uZmlnID09IDB4MDIpIHsKKwkJc2RyYW1fY2ZnIHw9IDB4MjAwMDAwMDA7CisJCWRkcmNfZWNjX2VuYWJsZSA9IDE7CisJCS8qIGRpc2FibGUgZXJyb3IgZGV0ZWN0aW9uICovCisJCWRkci0+ZXJyX2Rpc2FibGUgPSB+RUNDX0VSUk9SX0VOQUJMRTsKKwkJLyogc2V0IHNpbmdsZSBiaXQgZXJyb3IgdGhyZXNob2xkIHRvIG1heGltdW0gdmFsdWUsCisJCSAqIHJlc2V0IGNvdW50ZXIgdG8gemVybyAqLworCQlkZHItPmVycl9zYmUgPSAoMjU1IDw8IEVDQ19FUlJPUl9NQU5fU0JFVF9TSElGVCkgfAorCQkJCSgwIDw8IEVDQ19FUlJPUl9NQU5fU0JFQ19TSElGVCk7CisJfQorCisJZGVidWcoIkREUjplcnJfZGlzYWJsZT0weCUwOHhcbiIsIGRkci0+ZXJyX2Rpc2FibGUpOworCWRlYnVnKCJERFI6ZXJyX3NiZT0weCUwOHhcbiIsIGRkci0+ZXJyX3NiZSk7CisjZW5kaWYKKwlkZWJ1ZygiICAgRERSQyBFQ0MgbW9kZTogJXNcbiIsIGRkcmNfZWNjX2VuYWJsZSA/ICJPTiI6Ik9GRiIpOworCisjaWYgZGVmaW5lZChDT05GSUdfRERSXzJUX1RJTUlORykKKwkvKgorCSAqIEVuYWJsZSAyVCB0aW1pbmcgYnkgc2V0dGluZyBzZHJhbV9jZmdbMTZdLgorCSAqLworCXNkcmFtX2NmZyB8PSBTRFJBTV9DRkdfMlRfRU47CisjZW5kaWYKKwkvKiBFbmFibGUgY29udHJvbGxlciwgYW5kIEdPISAqLworCWRkci0+c2RyYW1fY2ZnID0gc2RyYW1fY2ZnOworCWFzbSgic3luYztpc3luYyIpOworCXVkZWxheSg1MDApOworCisJZGVidWcoIkREUjpzZHJhbV9jZmc9MHglMDh4XG4iLCBkZHItPnNkcmFtX2NmZyk7CisJcmV0dXJuIG1lbXNpemU7IC8qaW4gTUJ5dGVzKi8KK30KKyNlbmRpZiAvKiBDT05GSUdfU1BEX0VFUFJPTSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgJiYgIWRlZmluZWQoQ09ORklHX0VDQ19JTklUX1ZJQV9ERFJDT05UUk9MTEVSKQorLyoKKyAqIFVzZSB0aW1lYmFzZSBjb3VudGVyLCBnZXRfdGltZXIoKSBpcyBub3QgYXZhaWxhYmUKKyAqIGF0IHRoaXMgcG9pbnQgb2YgaW5pdGlhbGl6YXRpb24geWV0LgorICovCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGdldF90Ym1zICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdGJsOworCXVuc2lnbmVkIGxvbmcgdGJ1MSwgdGJ1MjsKKwl1bnNpZ25lZCBsb25nIG1zOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXA7CisKKwl1bG9uZyB0YmNsayA9IGdldF90YmNsaygpOworCisJLyogZ2V0IHRoZSB0aW1lYmFzZSB0aWNrcyAqLworCWRvIHsKKwkJYXNtIHZvbGF0aWxlICgibWZ0YnUgJTAiOiI9ciIgKHRidTEpOik7CisJCWFzbSB2b2xhdGlsZSAoIm1mdGIgJTAiOiI9ciIgKHRibCk6KTsKKwkJYXNtIHZvbGF0aWxlICgibWZ0YnUgJTAiOiI9ciIgKHRidTIpOik7CisJfSB3aGlsZSAodGJ1MSAhPSB0YnUyKTsKKworCS8qIGNvbnZlcnQgdGlja3MgdG8gbXMgKi8KKwl0bXAgPSAodW5zaWduZWQgbG9uZyBsb25nKSh0YnUxKTsKKwl0bXAgPSAodG1wIDw8IDMyKTsKKwl0bXAgKz0gKHVuc2lnbmVkIGxvbmcgbG9uZykodGJsKTsKKwltcyA9IHRtcC8odGJjbGsvMTAwMCk7CisKKwlyZXR1cm4gbXM7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGFsbCBvZiBtZW1vcnkgZm9yIEVDQywgdGhlbiBlbmFibGUgZXJyb3JzLgorICovCit2b2lkIGRkcl9lbmFibGVfZWNjKHVuc2lnbmVkIGludCBkcmFtX3NpemUpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBkZHI4M3h4X3QgKmRkcj0gJmltbWFwLT5kZHI7CisJdW5zaWduZWQgbG9uZyB0X3N0YXJ0LCB0X2VuZDsKKwlyZWdpc3RlciB1NjQgKnA7CisJcmVnaXN0ZXIgdWludCBzaXplOworCXVuc2lnbmVkIGludCBwYXR0ZXJuWzJdOworCisJaWNhY2hlX2VuYWJsZSgpOworCXRfc3RhcnQgPSBnZXRfdGJtcygpOworCXBhdHRlcm5bMF0gPSAweGRlYWRiZWVmOworCXBhdHRlcm5bMV0gPSAweGRlYWRiZWVmOworCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQ19JTklUX1ZJQV9ETUEpCisJZG1hX21lbWluaXQocGF0dGVyblswXSwgZHJhbV9zaXplKTsKKyNlbHNlCisJZGVidWcoImRkciBpbml0OiBDUFUgRlAgd3JpdGUgbWV0aG9kXG4iKTsKKwlzaXplID0gZHJhbV9zaXplOworCWZvciAocCA9IDA7IHAgPCAodTY0Kikoc2l6ZSk7IHArKykgeworCQlwcGNEV3N0b3JlKCh1MzIqKXAsIHBhdHRlcm4pOworCX0KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmMiKTsKKyNlbmRpZgorCisJdF9lbmQgPSBnZXRfdGJtcygpOworCWljYWNoZV9kaXNhYmxlKCk7CisKKwlkZWJ1ZygiXG5SRUFEWSEhXG4iKTsKKwlkZWJ1ZygiZGRyIGluaXQgZHVyYXRpb246ICVsZCBtc1xuIiwgdF9lbmQgLSB0X3N0YXJ0KTsKKworCS8qIENsZWFyIEFsbCBFQ0MgRXJyb3JzICovCisJaWYgKChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01NRSkgPT0gRUNDX0VSUk9SX0RFVEVDVF9NTUUpCisJCWRkci0+ZXJyX2RldGVjdCB8PSBFQ0NfRVJST1JfREVURUNUX01NRTsKKwlpZiAoKGRkci0+ZXJyX2RldGVjdCAmIEVDQ19FUlJPUl9ERVRFQ1RfTUJFKSA9PSBFQ0NfRVJST1JfREVURUNUX01CRSkKKwkJZGRyLT5lcnJfZGV0ZWN0IHw9IEVDQ19FUlJPUl9ERVRFQ1RfTUJFOworCWlmICgoZGRyLT5lcnJfZGV0ZWN0ICYgRUNDX0VSUk9SX0RFVEVDVF9TQkUpID09IEVDQ19FUlJPUl9ERVRFQ1RfU0JFKQorCQlkZHItPmVycl9kZXRlY3QgfD0gRUNDX0VSUk9SX0RFVEVDVF9TQkU7CisJaWYgKChkZHItPmVycl9kZXRlY3QgJiBFQ0NfRVJST1JfREVURUNUX01TRSkgPT0gRUNDX0VSUk9SX0RFVEVDVF9NU0UpCisJCWRkci0+ZXJyX2RldGVjdCB8PSBFQ0NfRVJST1JfREVURUNUX01TRTsKKworCS8qIERpc2FibGUgRUNDLUludGVycnVwdHMgKi8KKwlkZHItPmVycl9pbnRfZW4gJj0gRUNDX0VSUl9JTlRfRElTQUJMRTsKKworCS8qIEVuYWJsZSBlcnJvcnMgZm9yIEVDQyAqLworCWRkci0+ZXJyX2Rpc2FibGUgJj0gRUNDX0VSUk9SX0VOQUJMRTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgic3luYyIpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgiaXN5bmMiKTsKK30KKyNlbmRpZgkvKiBDT05GSUdfRERSX0VDQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3NwZWVkLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGU3ZTkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3NwZWVkLmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4M3h4Lmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgZW51bSB7CisJX3VuaywKKwlfb2ZmLAorCV9ieXAsCisJX3g4LAorCV94NCwKKwlfeDIsCisJX3gxLAorCV8xeCwKKwlfMV81eCwKKwlfMngsCisJXzJfNXgsCisJXzN4Cit9IG11bHRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCW11bHRfdCBjb3JlX2NzYl9yYXRpbzsKKwltdWx0X3QgdmNvX2RpdmlkZXI7Cit9IGNvcmVjbmZfdDsKKworY29yZWNuZl90IGNvcmVjbmZfdGFiW10gPSB7CisJe19ieXAsIF9ieXB9LAkJLyogMHgwMCAqLworCXtfYnlwLCBfYnlwfSwJCS8qIDB4MDEgKi8KKwl7X2J5cCwgX2J5cH0sCQkvKiAweDAyICovCisJe19ieXAsIF9ieXB9LAkJLyogMHgwMyAqLworCXtfYnlwLCBfYnlwfSwJCS8qIDB4MDQgKi8KKwl7X2J5cCwgX2J5cH0sCQkvKiAweDA1ICovCisJe19ieXAsIF9ieXB9LAkJLyogMHgwNiAqLworCXtfYnlwLCBfYnlwfSwJCS8qIDB4MDcgKi8KKwl7XzF4LCBfeDJ9LAkJLyogMHgwOCAqLworCXtfMXgsIF94NH0sCQkvKiAweDA5ICovCisJe18xeCwgX3g4fSwJCS8qIDB4MEEgKi8KKwl7XzF4LCBfeDh9LAkJLyogMHgwQiAqLworCXtfMV81eCwgX3gyfSwJCS8qIDB4MEMgKi8KKwl7XzFfNXgsIF94NH0sCQkvKiAweDBEICovCisJe18xXzV4LCBfeDh9LAkJLyogMHgwRSAqLworCXtfMV81eCwgX3g4fSwJCS8qIDB4MEYgKi8KKwl7XzJ4LCBfeDJ9LAkJLyogMHgxMCAqLworCXtfMngsIF94NH0sCQkvKiAweDExICovCisJe18yeCwgX3g4fSwJCS8qIDB4MTIgKi8KKwl7XzJ4LCBfeDh9LAkJLyogMHgxMyAqLworCXtfMl81eCwgX3gyfSwJCS8qIDB4MTQgKi8KKwl7XzJfNXgsIF94NH0sCQkvKiAweDE1ICovCisJe18yXzV4LCBfeDh9LAkJLyogMHgxNiAqLworCXtfMl81eCwgX3g4fSwJCS8qIDB4MTcgKi8KKwl7XzN4LCBfeDJ9LAkJLyogMHgxOCAqLworCXtfM3gsIF94NH0sCQkvKiAweDE5ICovCisJe18zeCwgX3g4fSwJCS8qIDB4MUEgKi8KKwl7XzN4LCBfeDh9LAkJLyogMHgxQiAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCisgKi8KK2ludCBnZXRfY2xvY2tzKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdTMyIHBjaV9zeW5jX2luOworCXU4IHNwbWY7CisJdTggY2xraW5fZGl2OworCXUzMiBzY2NyOworCXUzMiBjb3JlY25mX3RhYl9pbmRleDsKKwl1OCBjb3JlcGxsOworCXUzMiBsY3JyOworCisJdTMyIGNzYl9jbGs7CisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM0eCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODMxeCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODM3eCkKKwl1MzIgdHNlYzFfY2xrOworCXUzMiB0c2VjMl9jbGs7CisJdTMyIHVzYmRyX2NsazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NUEM4MzR4CisJdTMyIHVzYm1waF9jbGs7CisjZW5kaWYKKwl1MzIgY29yZV9jbGs7CisJdTMyIGkyYzFfY2xrOworI2lmICFkZWZpbmVkKENPTkZJR19NUEM4MzJ4KQorCXUzMiBpMmMyX2NsazsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01QQzgzMTUpCisJdTMyIHRkbV9jbGs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4Mzd4KQorCXUzMiBzZGhjX2NsazsKKyNlbmRpZgorCXUzMiBlbmNfY2xrOworCXUzMiBsYml1X2NsazsKKwl1MzIgbGNsa19jbGs7CisJdTMyIG1lbV9jbGs7CisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM2MCkKKwl1MzIgbWVtX3NlY19jbGs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MzYwKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MzJ4KQorCXUzMiBxZXBtZjsKKwl1MzIgcWVwZGY7CisJdTMyIHFlX2NsazsKKwl1MzIgYnJnX2NsazsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01QQzgzN3gpIHx8IGRlZmluZWQoQ09ORklHX01QQzgzMXgpCisJdTMyIHBjaWV4cDFfY2xrOworCXUzMiBwY2lleHAyX2NsazsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01QQzgzN3gpIHx8IGRlZmluZWQoQ09ORklHX01QQzgzMTUpCisJdTMyIHNhdGFfY2xrOworI2VuZGlmCisKKwlpZiAoKGltLT5zeXNjb25mLmltbXJiYXIgJiBJTU1SQkFSX0JBU0VfQUREUikgIT0gKHUzMikgaW0pCisJCXJldHVybiAtMTsKKworCWNsa2luX2RpdiA9ICgoaW0tPmNsay5zcG1yICYgU1BNUl9DS0lEKSA+PiBTUE1SX0NLSURfU0hJRlQpOworCisJaWYgKGltLT5yZXNldC5yY3doICYgSFJDV0hfUENJX0hPU1QpIHsKKyNpZiBkZWZpbmVkKENPTkZJR184M1hYX0NMS0lOKQorCQlwY2lfc3luY19pbiA9IENPTkZJR184M1hYX0NMS0lOIC8gKDEgKyBjbGtpbl9kaXYpOworI2Vsc2UKKwkJcGNpX3N5bmNfaW4gPSAweERFQURCRUVGOworI2VuZGlmCisJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR184M1hYX1BDSUNMSykKKwkJcGNpX3N5bmNfaW4gPSBDT05GSUdfODNYWF9QQ0lDTEs7CisjZWxzZQorCQlwY2lfc3luY19pbiA9IDB4REVBREJFRUY7CisjZW5kaWYKKwl9CisKKwlzcG1mID0gKChpbS0+cmVzZXQucmN3bCAmIEhSQ1dMX1NQTUYpID4+IEhSQ1dMX1NQTUZfU0hJRlQpOworCWNzYl9jbGsgPSBwY2lfc3luY19pbiAqICgxICsgY2xraW5fZGl2KSAqIHNwbWY7CisKKwlzY2NyID0gaW0tPmNsay5zY2NyOworCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM0eCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODMxeCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODM3eCkKKwlzd2l0Y2ggKChzY2NyICYgU0NDUl9UU0VDMUNNKSA+PiBTQ0NSX1RTRUMxQ01fU0hJRlQpIHsKKwljYXNlIDA6CisJCXRzZWMxX2NsayA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdHNlYzFfY2xrID0gY3NiX2NsazsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0c2VjMV9jbGsgPSBjc2JfY2xrIC8gMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0c2VjMV9jbGsgPSBjc2JfY2xrIC8gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogdW5rb3duIFNDQ1JfVFNFQzFDTSB2YWx1ZSAqLworCQlyZXR1cm4gLTI7CisJfQorCisJc3dpdGNoICgoc2NjciAmIFNDQ1JfVVNCRFJDTSkgPj4gU0NDUl9VU0JEUkNNX1NISUZUKSB7CisJY2FzZSAwOgorCQl1c2Jkcl9jbGsgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCXVzYmRyX2NsayA9IGNzYl9jbGs7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdXNiZHJfY2xrID0gY3NiX2NsayAvIDI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdXNiZHJfY2xrID0gY3NiX2NsayAvIDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHVua293biBTQ0NSX1VTQkRSQ00gdmFsdWUgKi8KKwkJcmV0dXJuIC0zOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM0eCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODM3eCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODMxNSkKKwlzd2l0Y2ggKChzY2NyICYgU0NDUl9UU0VDMkNNKSA+PiBTQ0NSX1RTRUMyQ01fU0hJRlQpIHsKKwljYXNlIDA6CisJCXRzZWMyX2NsayA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdHNlYzJfY2xrID0gY3NiX2NsazsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0c2VjMl9jbGsgPSBjc2JfY2xrIC8gMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0c2VjMl9jbGsgPSBjc2JfY2xrIC8gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogdW5rb3duIFNDQ1JfVFNFQzJDTSB2YWx1ZSAqLworCQlyZXR1cm4gLTQ7CisJfQorI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODMxMykKKwl0c2VjMl9jbGsgPSB0c2VjMV9jbGs7CisKKwlpZiAoIShzY2NyICYgU0NDUl9UU0VDMU9OKSkKKwkJdHNlYzFfY2xrID0gMDsKKwlpZiAoIShzY2NyICYgU0NDUl9UU0VDMk9OKSkKKwkJdHNlYzJfY2xrID0gMDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM0eCkKKwlzd2l0Y2ggKChzY2NyICYgU0NDUl9VU0JNUEhDTSkgPj4gU0NDUl9VU0JNUEhDTV9TSElGVCkgeworCWNhc2UgMDoKKwkJdXNibXBoX2NsayA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdXNibXBoX2NsayA9IGNzYl9jbGs7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdXNibXBoX2NsayA9IGNzYl9jbGsgLyAyOworCQlicmVhazsKKwljYXNlIDM6CisJCXVzYm1waF9jbGsgPSBjc2JfY2xrIC8gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogdW5rb3duIFNDQ1JfVVNCTVBIQ00gdmFsdWUgKi8KKwkJcmV0dXJuIC01OworCX0KKworCWlmICh1c2JtcGhfY2xrICE9IDAgJiYgdXNiZHJfY2xrICE9IDAgJiYgdXNibXBoX2NsayAhPSB1c2Jkcl9jbGspIHsKKwkJLyogaWYgVVNCIE1QSCBjbG9jayBpcyBub3QgZGlzYWJsZWQgYW5kCisJCSAqIFVTQiBEUiBjbG9jayBpcyBub3QgZGlzYWJsZWQgdGhlbgorCQkgKiBVU0IgTVBIICYgVVNCIERSIG11c3QgaGF2ZSB0aGUgc2FtZSByYXRlCisJCSAqLworCQlyZXR1cm4gLTY7CisJfQorI2VuZGlmCisJc3dpdGNoICgoc2NjciAmIFNDQ1JfRU5DQ00pID4+IFNDQ1JfRU5DQ01fU0hJRlQpIHsKKwljYXNlIDA6CisJCWVuY19jbGsgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCWVuY19jbGsgPSBjc2JfY2xrOworCQlicmVhazsKKwljYXNlIDI6CisJCWVuY19jbGsgPSBjc2JfY2xrIC8gMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQllbmNfY2xrID0gY3NiX2NsayAvIDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHVua293biBTQ0NSX0VOQ0NNIHZhbHVlICovCisJCXJldHVybiAtNzsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4Mzd4KQorCXN3aXRjaCAoKHNjY3IgJiBTQ0NSX1NESENDTSkgPj4gU0NDUl9TREhDQ01fU0hJRlQpIHsKKwljYXNlIDA6CisJCXNkaGNfY2xrID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzZGhjX2NsayA9IGNzYl9jbGs7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc2RoY19jbGsgPSBjc2JfY2xrIC8gMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzZGhjX2NsayA9IGNzYl9jbGsgLyAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiB1bmtvd24gU0NDUl9TREhDQ00gdmFsdWUgKi8KKwkJcmV0dXJuIC04OworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01QQzgzMTUpCisJc3dpdGNoICgoc2NjciAmIFNDQ1JfVERNQ00pID4+IFNDQ1JfVERNQ01fU0hJRlQpIHsKKwljYXNlIDA6CisJCXRkbV9jbGsgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCXRkbV9jbGsgPSBjc2JfY2xrOworCQlicmVhazsKKwljYXNlIDI6CisJCXRkbV9jbGsgPSBjc2JfY2xrIC8gMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0ZG1fY2xrID0gY3NiX2NsayAvIDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHVua293biBTQ0NSX1RETUNNIHZhbHVlICovCisJCXJldHVybiAtODsKKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01QQzgzNHgpCisJaTJjMV9jbGsgPSB0c2VjMl9jbGs7CisjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4MzYwKQorCWkyYzFfY2xrID0gY3NiX2NsazsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzgzMngpCisJaTJjMV9jbGsgPSBlbmNfY2xrOworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODMxeCkKKwlpMmMxX2NsayA9IGVuY19jbGs7CisjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4Mzd4KQorCWkyYzFfY2xrID0gc2RoY19jbGs7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChDT05GSUdfTVBDODMyeCkKKwlpMmMyX2NsayA9IGNzYl9jbGs7IC8qIGkyYy0yIGNsayBpcyBlcXVhbCB0byBjc2IgY2xrICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01QQzgzN3gpIHx8IGRlZmluZWQoQ09ORklHX01QQzgzMXgpCisJc3dpdGNoICgoc2NjciAmIFNDQ1JfUENJRVhQMUNNKSA+PiBTQ0NSX1BDSUVYUDFDTV9TSElGVCkgeworCWNhc2UgMDoKKwkJcGNpZXhwMV9jbGsgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCXBjaWV4cDFfY2xrID0gY3NiX2NsazsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwY2lleHAxX2NsayA9IGNzYl9jbGsgLyAyOworCQlicmVhazsKKwljYXNlIDM6CisJCXBjaWV4cDFfY2xrID0gY3NiX2NsayAvIDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHVua293biBTQ0NSX1BDSUVYUDFDTSB2YWx1ZSAqLworCQlyZXR1cm4gLTk7CisJfQorCisJc3dpdGNoICgoc2NjciAmIFNDQ1JfUENJRVhQMkNNKSA+PiBTQ0NSX1BDSUVYUDJDTV9TSElGVCkgeworCWNhc2UgMDoKKwkJcGNpZXhwMl9jbGsgPSAwOworCQlicmVhazsKKwljYXNlIDE6CisJCXBjaWV4cDJfY2xrID0gY3NiX2NsazsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwY2lleHAyX2NsayA9IGNzYl9jbGsgLyAyOworCQlicmVhazsKKwljYXNlIDM6CisJCXBjaWV4cDJfY2xrID0gY3NiX2NsayAvIDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHVua293biBTQ0NSX1BDSUVYUDJDTSB2YWx1ZSAqLworCQlyZXR1cm4gLTEwOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM3eCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODMxNSkKKwlzd2l0Y2ggKChzY2NyICYgU0NDUl9TQVRBMUNNKSA+PiBTQ0NSX1NBVEExQ01fU0hJRlQpIHsKKwljYXNlIDA6CisJCXNhdGFfY2xrID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlzYXRhX2NsayA9IGNzYl9jbGs7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc2F0YV9jbGsgPSBjc2JfY2xrIC8gMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzYXRhX2NsayA9IGNzYl9jbGsgLyAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiB1bmtvd24gU0NDUl9TQVRBQ00gdmFsdWUgKi8KKwkJcmV0dXJuIC0xMTsKKwl9CisjZW5kaWYKKworCWxiaXVfY2xrID0gY3NiX2NsayAqCisJICAgICAgICAgICAoMSArICgoaW0tPnJlc2V0LnJjd2wgJiBIUkNXTF9MQklVQ00pID4+IEhSQ1dMX0xCSVVDTV9TSElGVCkpOworCWxjcnIgPSAoaW0tPmxidXMubGNyciAmIExDUlJfQ0xLRElWKSA+PiBMQ1JSX0NMS0RJVl9TSElGVDsKKwlzd2l0Y2ggKGxjcnIpIHsKKwljYXNlIDI6CisJY2FzZSA0OgorCWNhc2UgODoKKwkJbGNsa19jbGsgPSBsYml1X2NsayAvIGxjcnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHVua25vd24gbGNyciAqLworCQlyZXR1cm4gLTEyOworCX0KKworCW1lbV9jbGsgPSBjc2JfY2xrICoKKwkJICAoMSArICgoaW0tPnJlc2V0LnJjd2wgJiBIUkNXTF9ERFJDTSkgPj4gSFJDV0xfRERSQ01fU0hJRlQpKTsKKwljb3JlcGxsID0gKGltLT5yZXNldC5yY3dsICYgSFJDV0xfQ09SRVBMTCkgPj4gSFJDV0xfQ09SRVBMTF9TSElGVDsKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MzYwKQorCW1lbV9zZWNfY2xrID0gY3NiX2NsayAqICgxICsKKwkJICAgICAgICgoaW0tPnJlc2V0LnJjd2wgJiBIUkNXTF9MQklVQ00pID4+IEhSQ1dMX0xCSVVDTV9TSElGVCkpOworI2VuZGlmCisKKwljb3JlY25mX3RhYl9pbmRleCA9ICgoY29yZXBsbCAmIDB4MUYpIDw8IDIpIHwgKChjb3JlcGxsICYgMHg2MCkgPj4gNSk7CisJaWYgKGNvcmVjbmZfdGFiX2luZGV4ID4gKHNpemVvZihjb3JlY25mX3RhYikgLyBzaXplb2YoY29yZWNuZl90KSkpIHsKKwkJLyogY29yZWNuZl90YWJfaW5kZXggaXMgdG9vIGhpZ2gsIHBvc3NpYmx5IHdvcm5nIHZhbHVlICovCisJCXJldHVybiAtMTE7CisJfQorCXN3aXRjaCAoY29yZWNuZl90YWJbY29yZWNuZl90YWJfaW5kZXhdLmNvcmVfY3NiX3JhdGlvKSB7CisJY2FzZSBfYnlwOgorCWNhc2UgX3gxOgorCWNhc2UgXzF4OgorCQljb3JlX2NsayA9IGNzYl9jbGs7CisJCWJyZWFrOworCWNhc2UgXzFfNXg6CisJCWNvcmVfY2xrID0gKDMgKiBjc2JfY2xrKSAvIDI7CisJCWJyZWFrOworCWNhc2UgXzJ4OgorCQljb3JlX2NsayA9IDIgKiBjc2JfY2xrOworCQlicmVhazsKKwljYXNlIF8yXzV4OgorCQljb3JlX2NsayA9ICg1ICogY3NiX2NsaykgLyAyOworCQlicmVhazsKKwljYXNlIF8zeDoKKwkJY29yZV9jbGsgPSAzICogY3NiX2NsazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogdW5rb3duIGNvcmUgdG8gY3NiIHJhdGlvICovCisJCXJldHVybiAtMTM7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM2MCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODMyeCkKKwlxZXBtZiA9IChpbS0+cmVzZXQucmN3bCAmIEhSQ1dMX0NFUE1GKSA+PiBIUkNXTF9DRVBNRl9TSElGVDsKKwlxZXBkZiA9IChpbS0+cmVzZXQucmN3bCAmIEhSQ1dMX0NFUERGKSA+PiBIUkNXTF9DRVBERl9TSElGVDsKKwlxZV9jbGsgPSAocGNpX3N5bmNfaW4gKiBxZXBtZikgLyAoMSArIHFlcGRmKTsKKwlicmdfY2xrID0gcWVfY2xrIC8gMjsKKyNlbmRpZgorCisJZ2QtPmNzYl9jbGsgPSBjc2JfY2xrOworI2lmIGRlZmluZWQoQ09ORklHX01QQzgzNHgpIHx8IGRlZmluZWQoQ09ORklHX01QQzgzMXgpIHx8IGRlZmluZWQoQ09ORklHX01QQzgzN3gpCisJZ2QtPnRzZWMxX2NsayA9IHRzZWMxX2NsazsKKwlnZC0+dHNlYzJfY2xrID0gdHNlYzJfY2xrOworCWdkLT51c2Jkcl9jbGsgPSB1c2Jkcl9jbGs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MzR4KQorCWdkLT51c2JtcGhfY2xrID0gdXNibXBoX2NsazsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01QQzgzMTUpCisJZ2QtPnRkbV9jbGsgPSB0ZG1fY2xrOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM3eCkKKwlnZC0+c2RoY19jbGsgPSBzZGhjX2NsazsKKyNlbmRpZgorCWdkLT5jb3JlX2NsayA9IGNvcmVfY2xrOworCWdkLT5pMmMxX2NsayA9IGkyYzFfY2xrOworI2lmICFkZWZpbmVkKENPTkZJR19NUEM4MzJ4KQorCWdkLT5pMmMyX2NsayA9IGkyYzJfY2xrOworI2VuZGlmCisJZ2QtPmVuY19jbGsgPSBlbmNfY2xrOworCWdkLT5sYml1X2NsayA9IGxiaXVfY2xrOworCWdkLT5sY2xrX2NsayA9IGxjbGtfY2xrOworCWdkLT5tZW1fY2xrID0gbWVtX2NsazsKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MzYwKQorCWdkLT5tZW1fc2VjX2NsayA9IG1lbV9zZWNfY2xrOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM2MCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODMyeCkKKwlnZC0+cWVfY2xrID0gcWVfY2xrOworCWdkLT5icmdfY2xrID0gYnJnX2NsazsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01QQzgzN3gpCisJZ2QtPnBjaWV4cDFfY2xrID0gcGNpZXhwMV9jbGs7CisJZ2QtPnBjaWV4cDJfY2xrID0gcGNpZXhwMl9jbGs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4Mzd4KSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MzE1KQorCWdkLT5zYXRhX2NsayA9IHNhdGFfY2xrOworI2VuZGlmCisJZ2QtPnBjaV9jbGsgPSBwY2lfc3luY19pbjsKKwlnZC0+Y3B1X2NsayA9IGdkLT5jb3JlX2NsazsKKwlnZC0+YnVzX2NsayA9IGdkLT5jc2JfY2xrOworCXJldHVybiAwOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2J1c19mcmVxCisgKiByZXR1cm4gc3lzdGVtIGJ1cyBmcmVxIGluIEh6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgZ2V0X2J1c19mcmVxKHVsb25nIGR1bW15KQoreworCXJldHVybiBnZC0+Y3NiX2NsazsKK30KKworaW50IGRvX2Nsb2NrcyAoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgYnVmWzMyXTsKKworCXByaW50ZigiQ2xvY2sgY29uZmlndXJhdGlvbjpcbiIpOworCXByaW50ZigiICBDb3JlOiAgICAgICAgICAgICAgICAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPmNvcmVfY2xrKSk7CisJcHJpbnRmKCIgIENvaGVyZW50IFN5c3RlbSBCdXM6ICUtNHMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+Y3NiX2NsaykpOworI2lmIGRlZmluZWQoQ09ORklHX01QQzgzNjApIHx8IGRlZmluZWQoQ09ORklHX01QQzgzMngpCisJcHJpbnRmKCIgIFFFOiAgICAgICAgICAgICAgICAgICUtNHMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+cWVfY2xrKSk7CisJcHJpbnRmKCIgIEJSRzogICAgICAgICAgICAgICAgICUtNHMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+YnJnX2NsaykpOworI2VuZGlmCisJcHJpbnRmKCIgIExvY2FsIEJ1cyBDb250cm9sbGVyOiUtNHMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+bGJpdV9jbGspKTsKKwlwcmludGYoIiAgTG9jYWwgQnVzOiAgICAgICAgICAgJS00cyBNSHpcbiIsIHN0cm1oeihidWYsIGdkLT5sY2xrX2NsaykpOworCXByaW50ZigiICBERFI6ICAgICAgICAgICAgICAgICAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPm1lbV9jbGspKTsKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MzYwKQorCXByaW50ZigiICBERFIgU2Vjb25kYXJ5OiAgICAgICAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPm1lbV9zZWNfY2xrKSk7CisjZW5kaWYKKwlwcmludGYoIiAgU0VDOiAgICAgICAgICAgICAgICAgJS00cyBNSHpcbiIsIHN0cm1oeihidWYsIGdkLT5lbmNfY2xrKSk7CisJcHJpbnRmKCIgIEkyQzE6ICAgICAgICAgICAgICAgICUtNHMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+aTJjMV9jbGspKTsKKyNpZiAhZGVmaW5lZChDT05GSUdfTVBDODMyeCkKKwlwcmludGYoIiAgSTJDMjogICAgICAgICAgICAgICAgJS00cyBNSHpcbiIsIHN0cm1oeihidWYsIGdkLT5pMmMyX2NsaykpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODMxNSkKKwlwcmludGYoIiAgVERNOiAgICAgICAgICAgICAgICAgJS00cyBNSHpcbiIsIHN0cm1oeihidWYsIGdkLT50ZG1fY2xrKSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4Mzd4KQorCXByaW50ZigiICBTREhDOiAgICAgICAgICAgICAgICAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPnNkaGNfY2xrKSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4MzR4KSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MzF4KSB8fCBkZWZpbmVkKENPTkZJR19NUEM4Mzd4KQorCXByaW50ZigiICBUU0VDMTogICAgICAgICAgICAgICAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPnRzZWMxX2NsaykpOworCXByaW50ZigiICBUU0VDMjogICAgICAgICAgICAgICAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPnRzZWMyX2NsaykpOworCXByaW50ZigiICBVU0IgRFI6ICAgICAgICAgICAgICAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPnVzYmRyX2NsaykpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODM0eCkKKwlwcmludGYoIiAgVVNCIE1QSDogICAgICAgICAgICAgJS00cyBNSHpcbiIsIHN0cm1oeihidWYsIGdkLT51c2JtcGhfY2xrKSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4Mzd4KQorCXByaW50ZigiICBQQ0lFWFAxOiAgICAgICAgICAgICAlLTRzIE1IelxuIiwgc3RybWh6KGJ1ZiwgZ2QtPnBjaWV4cDFfY2xrKSk7CisJcHJpbnRmKCIgIFBDSUVYUDI6ICAgICAgICAgICAgICUtNHMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+cGNpZXhwMl9jbGspKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01QQzgzN3gpIHx8IGRlZmluZWQoQ09ORklHX01QQzgzMTUpCisJcHJpbnRmKCIgIFNBVEE6ICAgICAgICAgICAgICAgICUtNHMgTUh6XG4iLCBzdHJtaHooYnVmLCBnZC0+c2F0YV9jbGspKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitVX0JPT1RfQ01EKGNsb2NrcywgMSwgMCwgZG9fY2xvY2tzLAorCSJwcmludCBjbG9jayBjb25maWd1cmF0aW9uIiwKKwkiICAgIGNsb2NrcyIKKyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvc3RhcnQuUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODN4eC9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzgwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvc3RhcnQuUwpAQCAtMCwwICsxLDEyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggIERhbiBNYWxlayA8ZG1hbGVrQGpsYy5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgIE1hZ251cyBEYW1tIDxraWVyYXlwYzAxLnAueS5raWUuZXJhLmVyaWNzc29uLnNlPgorICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLDIwMDIgV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAqIENvcHlyaWdodCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiAyMDA0LCAyMDA2LCAyMDA4LgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiAgVS1Cb290IC0gU3RhcnR1cCBDb2RlIGZvciBNUEM4M3h4IFBvd2VyUEMgYmFzZWQgRW1iZWRkZWQgQm9hcmRzCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzgzeHguaD4KKyNpbmNsdWRlIDx0aW1lc3RhbXAuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUgQ09ORklHXzgzWFgJMQkJLyogbmVlZGVkIGZvciBMaW51eCBrZXJuZWwgaGVhZGVyIGZpbGVzKi8KKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19IIDEJLyogYXZvaWQgcmVhZGluZyBMaW51eCBhdXRvY29uZi5oIGZpbGUgKi8KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisjaWZuZGVmICBDT05GSUdfSURFTlRfU1RSSU5HCisjZGVmaW5lICBDT05GSUdfSURFTlRfU1RSSU5HICJNUEM4M1hYIgorI2VuZGlmCisKKy8qIFdlIGRvbid0IHdhbnQgdGhlICBNTVUgeWV0LgorICovCisjdW5kZWYJTVNSX0tFUk5FTAorCisvKgorICogRmxvYXRpbmcgUG9pbnQgZW5hYmxlLCBNYWNoaW5lIENoZWNrIGFuZCBSZWNvdmVyYWJsZSBJbnRlcnIuCisgKi8KKyNpZmRlZiBERUJVRworI2RlZmluZSBNU1JfS0VSTkVMIChNU1JfRlB8TVNSX1JJKQorI2Vsc2UKKyNkZWZpbmUgTVNSX0tFUk5FTCAoTVNSX0ZQfE1TUl9NRXxNU1JfUkkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkgJiYgIWRlZmluZWQoQ09ORklHX1NZU19SQU1CT09UKQorI2RlZmluZSBDT05GSUdfU1lTX0ZMQVNIQk9PVAorI2VuZGlmCisKKy8qCisgKiBTZXQgdXAgR09UOiBHbG9iYWwgT2Zmc2V0IFRhYmxlCisgKgorICogVXNlIHIxMiB0byBhY2Nlc3MgdGhlIEdPVAorICovCisJU1RBUlRfR09UCisJR09UX0VOVFJZKF9HT1QyX1RBQkxFXykKKwlHT1RfRU5UUlkoX19ic3Nfc3RhcnQpCisJR09UX0VOVFJZKF9lbmQpCisKKyNpZm5kZWYgQ09ORklHX05BTkRfU1BMCisJR09UX0VOVFJZKF9GSVhVUF9UQUJMRV8pCisJR09UX0VOVFJZKF9zdGFydCkKKwlHT1RfRU5UUlkoX3N0YXJ0X29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKF9lbmRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkodHJhbnNmZXJfdG9faGFuZGxlcikKKyNlbmRpZgorCUVORF9HT1QKKworLyoKKyAqIFRoZSBIYXJkIFJlc2V0IENvbmZpZ3VyYXRpb24gV29yZCAoSFJDVykgdGFibGUgaXMgaW4gdGhlIGZpcnN0IDY0CisgKiAoMHg0MCkgYnl0ZXMgb2YgZmxhc2guICBJdCBoYXMgOCBieXRlcywgYnV0IGVhY2ggYnl0ZSBpcyByZXBlYXRlZCA4CisgKiB0aW1lcyBzbyB0aGUgcHJvY2Vzc29yIGNhbiBmZXRjaCBpdCBvdXQgb2YgZmxhc2ggd2hldGhlciB0aGUgZmxhc2gKKyAqIGlzIDgsIDE2LCAzMiwgb3IgNjQgYml0cyB3aWRlIChoYXJkd2FyZSB0cmlja2VyeSkuCisgKi8KKwkudGV4dAorI2RlZmluZSBfSFJDV19UQUJMRV9FTlRSWSh3KQkJXAorCS5maWxsCTgsMSwoKCh3KT4+MjQpJjB4ZmYpOwlcCisJLmZpbGwJOCwxLCgoKHcpPj4xNikmMHhmZik7CVwKKwkuZmlsbAk4LDEsKCgodyk+PiA4KSYweGZmKTsJXAorCS5maWxsCTgsMSwoKCh3KSAgICApJjB4ZmYpCisKKwlfSFJDV19UQUJMRV9FTlRSWShDT05GSUdfU1lTX0hSQ1dfTE9XKQorCV9IUkNXX1RBQkxFX0VOVFJZKENPTkZJR19TWVNfSFJDV19ISUdIKQorCisvKgorICogTWFnaWMgbnVtYmVyIGFuZCB2ZXJzaW9uIHN0cmluZyAtIHB1dCBpdCBhZnRlciB0aGUgSFJDVyBzaW5jZSBpdAorICogY2Fubm90IGJlIGZpcnN0IGluIGZsYXNoIGxpa2UgaXQgaXMgaW4gbWFueSBvdGhlciBwcm9jZXNzb3JzLgorICovCisJLmxvbmcJMHgyNzA1MTk1NgkJLyogVS1Cb290IE1hZ2ljIE51bWJlciAqLworCisJLmdsb2JsCXZlcnNpb25fc3RyaW5nCit2ZXJzaW9uX3N0cmluZzoKKwkuYXNjaWkgVV9CT09UX1ZFUlNJT04KKwkuYXNjaWkgIiAoIiwgVV9CT09UX0RBVEUsICIgLSAiLCBVX0JPT1RfVElNRSwgIikiCisJLmFzY2lpICIgIiwgQ09ORklHX0lERU5UX1NUUklORywgIlwwIgorCisJLmFsaWduIDIKKworCS5nbG9ibCBlbmFibGVfYWRkcl90cmFucworZW5hYmxlX2FkZHJfdHJhbnM6CisJLyogZW5hYmxlIGFkZHJlc3MgdHJhbnNsYXRpb24gKi8KKwltZm1zcglyNQorCW9yaQlyNSwgcjUsIChNU1JfSVIgfCBNU1JfRFIpCisJbXRtc3IJcjUKKwlpc3luYworCWJscgorCisJLmdsb2JsIGRpc2FibGVfYWRkcl90cmFucworZGlzYWJsZV9hZGRyX3RyYW5zOgorCS8qIGRpc2FibGUgYWRkcmVzcyB0cmFuc2xhdGlvbiAqLworCW1mbHIJcjQKKwltZm1zcglyMworCWFuZGkuCXIwLCByMywgKE1TUl9JUiB8IE1TUl9EUikKKwliZXFscgorCWFuZGMJcjMsIHIzLCByMAorCW10c3ByCVNSUjAsIHI0CisJbXRzcHIJU1JSMSwgcjMKKwlyZmkKKworCS5nbG9ibCBnZXRfcHZyCitnZXRfcHZyOgorCW1mc3ByCXIzLCBQVlIKKwlibHIKKworCS5nbG9ibAlwcGNEV3N0b3JlCitwcGNEV3N0b3JlOgorCWxmZAkxLCAwKHI0KQorCXN0ZmQJMSwgMChyMykKKwlibHIKKworCS5nbG9ibAlwcGNEV2xvYWQKK3BwY0RXbG9hZDoKKwlsZmQJMSwgMChyMykKKwlzdGZkCTEsIDAocjQpCisJYmxyCisKKyNpZm5kZWYgQ09ORklHX0RFRkFVTFRfSU1NUgorI2Vycm9yIENPTkZJR19ERUZBVUxUX0lNTVIgbXVzdCBiZSBkZWZpbmVkCisjZW5kaWYgLyogQ09ORklHX1NZU19ERUZBVUxUX0lNTVIgKi8KKyNpZm5kZWYgQ09ORklHX1NZU19JTU1SCisjZGVmaW5lIENPTkZJR19TWVNfSU1NUiBDT05GSUdfREVGQVVMVF9JTU1SCisjZW5kaWYgLyogQ09ORklHX1NZU19JTU1SICovCisKKy8qCisgKiBBZnRlciBjb25maWd1cmF0aW9uLCBhIHN5c3RlbSByZXNldCBleGNlcHRpb24gaXMgZXhlY3V0ZWQgdXNpbmcgdGhlCisgKiB2ZWN0b3IgYXQgb2Zmc2V0IDB4MTAwIHJlbGF0aXZlIHRvIHRoZSBiYXNlIHNldCBieSBNU1JbSVBdLiBJZgorICogTVNSW0lQXSBpcyAwLCB0aGUgYmFzZSBhZGRyZXNzIGlzIDB4MDAwMDAwMDAuIElmIE1TUltJUF0gaXMgMSwgdGhlCisgKiBiYXNlIGFkZHJlc3MgaXMgMHhmZmYwMDAwMC4gSW4gdGhlIGNhc2Ugb2YgYSBQb3dlciBPbiBSZXNldCBvciBIYXJkCisgKiBSZXNldCwgdGhlIHZhbHVlIG9mIE1TUltJUF0gaXMgZGV0ZXJtaW5lZCBieSB0aGUgQ0lQIGZpZWxkIGluIHRoZQorICogSFJDVy4KKyAqCisgKiBPdGhlciBiaXRzIGluIHRoZSBIUkNXIHNldCB1cCB0aGUgQmFzZSBBZGRyZXNzIGFuZCBQb3J0IFNpemUgaW4gQlIwLgorICogVGhpcyBkZXRlcm1pbmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYm9vdCBST00gKGZsYXNoIG9yIEVQUk9NKSBpbiB0aGUKKyAqIHByb2Nlc3NvcidzIGFkZHJlc3Mgc3BhY2UgYXQgYm9vdCB0aW1lLiBBcyBsb25nIGFzIHRoZSBIUkNXIGlzIHNldCB1cAorICogc28gdGhhdCB3ZSBldmVudHVhbGx5IGVuZCB1cCBleGVjdXRpbmcgdGhlIGNvZGUgYmVsb3cgd2hlbiB0aGUKKyAqIHByb2Nlc3NvciBleGVjdXRlcyB0aGUgcmVzZXQgZXhjZXB0aW9uLCB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIHNob3VsZAorICogbm90IG1hdHRlci4KKyAqCisgKiBPbmNlIHdlIGhhdmUgZ290IGhlcmUsIHRoZSBhZGRyZXNzIG1hc2sgaW4gT1IwIGlzIGNsZWFyZWQgc28gdGhhdCB0aGUKKyAqIGJvdHRvbSAzMksgb2YgdGhlIGJvb3QgUk9NIGlzIGVmZmVjdGl2ZWx5IHJlcGVhdGVkIGFsbCB0aHJvdWdob3V0IHRoZQorICogcHJvY2Vzc29yJ3MgYWRkcmVzcyBzcGFjZSwgYWZ0ZXIgd2hpY2ggd2UgY2FuIGp1bXAgdG8gdGhlIGFic29sdXRlCisgKiBhZGRyZXNzIGF0IHdoaWNoIHRoZSBib290IFJPTSB3YXMgbGlua2VkIGF0IGNvbXBpbGUgdGltZSwgYW5kIHByb2NlZWQKKyAqIHRvIGluaXRpYWxpc2UgdGhlIG1lbW9yeSBjb250cm9sbGVyIHdpdGhvdXQgd29ycnlpbmcgaWYgdGhlIHJ1ZyB3aWxsCisgKiBiZSBwdWxsZWQgb3V0IGZyb20gdW5kZXIgdXMsIHNvIHRvIHNwZWFrIChpdCB3aWxsIGJlIGZpbmUgYXMgbG9uZyBhcworICogd2UgY29uZmlndXJlIEJSMCB3aXRoIHRoZSBzYW1lIGJvb3QgUk9NIGxpbmsgYWRkcmVzcykuCisgKi8KKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKworCS5nbG9ibAlfc3RhcnQKK19zdGFydDogLyogdGltZSB0IDAgKi8KKwlsaQlyMjEsIEJPT1RGTEFHX0NPTEQgIC8qIE5vcm1hbCBQb3dlci1PbjogQm9vdCBmcm9tIEZMQVNIKi8KKwlub3AKKwliCWJvb3RfY29sZAorCisJLiA9IEVYQ19PRkZfU1lTX1JFU0VUICsgMHgxMAorCisJLmdsb2JsCV9zdGFydF93YXJtCitfc3RhcnRfd2FybToKKwlsaQlyMjEsIEJPT1RGTEFHX1dBUk0JLyogU29mdHdhcmUgcmVib290CSovCisJYglib290X3dhcm0KKworCitib290X2NvbGQ6IC8qIHRpbWUgdCAzICovCisJbGlzCXI0LCBDT05GSUdfREVGQVVMVF9JTU1SQGgKKwlub3AKK2Jvb3Rfd2FybTogLyogdGltZSB0IDUgKi8KKwltZm1zcglyNQkJCS8qIHNhdmUgbXNyIGNvbnRlbnRzCSovCisKKwkvKiA4M3h4IG1hbnVhbHMgcHJlc2NyaWJlIGEgc3BlY2lmaWMgc2VxdWVuY2UgZm9yIHVwZGF0aW5nIElNTVJCQVIuICovCisJYmwJMWYKKzE6CW1mbHIJcjcKKworCWxpcwlyMywgQ09ORklHX1NZU19JTU1SQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0lNTVJAbAorCisJbHd6CXI2LCBJTU1SQkFSKHI0KQorCWlzeW5jCisKKwlzdHcJcjMsIElNTVJCQVIocjQpCisJbHd6CXI2LCAwKHI3KQkJLyogQXJiaXRyYXJ5IGV4dGVybmFsIGxvYWQgKi8KKwlpc3luYworCisJbHd6CXI2LCBJTU1SQkFSKHIzKQorCWlzeW5jCisKKwkvKiBJbml0aWFsaXNlIHRoZSBFMzAwIHByb2Nlc3NvciBjb3JlCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19OQU5EX1NQTAorCS8qIFRoZSBGQ00gYmVnaW5zIGV4ZWN1dGlvbiBhZnRlciBvbmx5IHRoZSBmaXJzdCBwYWdlCisJICogaXMgbG9hZGVkLiAgV2FpdCBmb3IgdGhlIHJlc3QgYmVmb3JlIGJyYW5jaGluZworCSAqIHRvIGFub3RoZXIgZmxhc2ggcGFnZS4KKwkgKi8KKzE6CWx3eglyNiwgMHg1MGIwKHIzKQorCWFuZGkuCXI2LCByNiwgMQorCWJlcQkxYgorI2VuZGlmCisKKwlibAlpbml0X2UzMDBfY29yZQorCisjaWZkZWYgQ09ORklHX1NZU19GTEFTSEJPT1QKKworCS8qIEluZmxhdGUgZmxhc2ggbG9jYXRpb24gc28gaXQgYXBwZWFycyBldmVyeXdoZXJlLCBjYWxjdWxhdGUgKi8KKwkvKiB0aGUgYWJzb2x1dGUgYWRkcmVzcyBpbiBmaW5hbCBsb2NhdGlvbiBvZiB0aGUgRkxBU0gsIGp1bXAgICovCisJLyogdGhlcmUgYW5kIGRlZmxhdGUgdGhlIGZsYXNoIHNpemUgYmFjayB0byBtaW5pbWFsIHNpemUgICAgICAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlibCBtYXBfZmxhc2hfYnlfbGF3MQorCWxpcyByNCwgKENPTkZJR19TWVNfTU9OSVRPUl9CQVNFKUBoCisJb3JpIHI0LCByNCwgKENPTkZJR19TWVNfTU9OSVRPUl9CQVNFKUBsCisJYWRkaSByNSwgcjQsIGluX2ZsYXNoIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwltdGxyIHI1CisJYmxyCitpbl9mbGFzaDoKKyNpZiAxIC8qIFJlbWFwcGluZyBmbGFzaCB3aXRoIExBVzAuICovCisJYmwgcmVtYXBfZmxhc2hfYnlfbGF3MAorI2VuZGlmCisjZW5kaWYJLyogQ09ORklHX1NZU19GTEFTSEJPT1QgKi8KKworCS8qIHNldHVwIHRoZSBiYXRzICovCisJYmwJc2V0dXBfYmF0cworCXN5bmMKKworCS8qCisJICogQ2FjaGUgbXVzdCBiZSBlbmFibGVkIGhlcmUgZm9yIHN0YWNrLWluLWNhY2hlIHRyaWNrLgorCSAqIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBlbmFibGUgdGhlIEJBVFMuCisJICogVGhpcyBtZWFuczoKKwkgKiAgIDEpIGZvciB0aGUgRVZCLCBvcmlnaW5hbCBndCByZWdzIG5lZWQgdG8gYmUgbWFwcGVkCisJICogICAyKSBuZWVkIHRvIGhhdmUgYW4gSUJBVCBmb3IgdGhlIDB4ZiByZWdpb24sCisJICogICAgICB3ZSBhcmUgcnVubmluZyB0aGVyZSEKKwkgKiBDYWNoZSBzaG91bGQgYmUgdHVybmVkIG9uIGFmdGVyIEJBVHMsIHNpbmNlIGJ5IGRlZmF1bHQKKwkgKiBldmVyeXRoaW5nIGlzIHdyaXRlLXRocm91Z2guCisJICogVGhlIGluaXQtbWVtIEJBVCBjYW4gYmUgcmV1c2VkIGFmdGVyIHJlbG9jLiBUaGUgb2xkCisJICogZ3QtcmVncyBCQVQgY2FuIGJlIHJldXNlZCBhZnRlciBib2FyZF9pbml0X2YgY2FsbHMKKwkgKiBib2FyZF9lYXJseV9pbml0X2YgKEVWQiBvbmx5KS4KKwkgKi8KKwkvKiBlbmFibGUgYWRkcmVzcyB0cmFuc2xhdGlvbiAqLworCWJsCWVuYWJsZV9hZGRyX3RyYW5zCisJc3luYworCisJLyogZW5hYmxlIHRoZSBkYXRhIGNhY2hlICovCisJYmwJZGNhY2hlX2VuYWJsZQorCXN5bmMKKyNpZmRlZiBDT05GSUdfU1lTX0lOSVRfUkFNX0xPQ0sKKwlibAlsb2NrX3JhbV9pbl9jYWNoZQorCXN5bmMKKyNlbmRpZgorCisJLyogc2V0IHVwIHRoZSBzdGFjayBwb2ludGVyIGluIG91ciBuZXdseSBjcmVhdGVkCisJICogY2FjaGUtcmFtIChyMSkgKi8KKwlsaXMJcjEsIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgKyBDT05GSUdfU1lTX0dCTF9EQVRBX09GRlNFVClAaAorCW9yaQlyMSwgcjEsIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgKyBDT05GSUdfU1lTX0dCTF9EQVRBX09GRlNFVClAbAorCisJbGkJcjAsIDAJCS8qIE1ha2Ugcm9vbSBmb3Igc3RhY2sgZnJhbWUgaGVhZGVyIGFuZAkqLworCXN0d3UJcjAsIC00KHIxKQkvKiBjbGVhciBmaW5hbCBzdGFjayBmcmFtZSBzbyB0aGF0CSovCisJc3R3dQlyMCwgLTQocjEpCS8qIHN0YWNrIGJhY2t0cmFjZXMgdGVybWluYXRlIGNsZWFubHkJKi8KKworCisJLyogbGV0IHRoZSBDLWNvZGUgc2V0IHVwIHRoZSByZXN0CSAgICAgICAgICAgICAgICAgICAgKi8KKwkvKgkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiBCZSBjYXJlZnVsIHRvIGtlZXAgY29kZSByZWxvY2F0YWJsZSAmIHN0YWNrIGh1bWJsZSAgICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJR0VUX0dPVAkJCS8qIGluaXRpYWxpemUgR09UIGFjY2VzcwkqLworCisJLyogcjM6IElNTVIgKi8KKwlsaXMJcjMsIENPTkZJR19TWVNfSU1NUkBoCisJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlIChpbiBGbGFzaCkqLworCWJsCWNwdV9pbml0X2YKKworCS8qIHIzOiBCT09URkxBRyAqLworCW1yCXIzLCByMjEKKwkvKiBydW4gMXN0IHBhcnQgb2YgYm9hcmQgaW5pdCBjb2RlIChpbiBGbGFzaCkqLworCWJsCWJvYXJkX2luaXRfZgorCisjaWZuZGVmIENPTkZJR19OQU5EX1NQTAorLyoKKyAqIFZlY3RvciBUYWJsZQorICovCisKKwkuZ2xvYmwJX3N0YXJ0X29mX3ZlY3RvcnMKK19zdGFydF9vZl92ZWN0b3JzOgorCisvKiBNYWNoaW5lIGNoZWNrICovCisJU1REX0VYQ0VQVElPTigweDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCisKKy8qIERhdGEgU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDMwMCwgRGF0YVN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEluc3RydWN0aW9uIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHg0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworI2lmbmRlZiBGSVhNRQorCVNURF9FWENFUFRJT04oMHg1MDAsIEV4dEludGVycnVwdCwgZXh0ZXJuYWxfaW50ZXJydXB0KQorI2VuZGlmCisKKy8qIEFsaWdubWVudCBleGNlcHRpb24uICovCisJLiA9IDB4NjAwCitBbGlnbm1lbnQ6CisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQorCW1mc3ByCXI0LERBUgorCXN0dwlyNCxfREFSKHIyMSkKKwltZnNwcglyNSxEU0lTUgorCXN0dwlyNSxfRFNJU1IocjIxKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlFWENfWEZFUl9URU1QTEFURShBbGlnbm1lbnQsIEFsaWdubWVudEV4Y2VwdGlvbiwgTVNSX0tFUk5FTCwgQ09QWV9FRSkKKworLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KKwkuID0gMHg3MDAKK1Byb2dyYW1DaGVjazoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKFByb2dyYW1DaGVjaywgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uLAorCQlNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisJU1REX0VYQ0VQVElPTigweDgwMCwgRlBVbmF2YWlsYWJsZSwgVW5rbm93bkV4Y2VwdGlvbikKKworCS8qIEkgZ3Vlc3Mgd2UgY291bGQgaW1wbGVtZW50IGRlY3JlbWVudGVyLCBhbmQgbWF5IGhhdmUKKwkgKiB0byBzb21lZGF5IGZvciB0aW1la2VlcGluZy4KKwkgKi8KKwlTVERfRVhDRVBUSU9OKDB4OTAwLCBEZWNyZW1lbnRlciwgdGltZXJfaW50ZXJydXB0KQorCisJU1REX0VYQ0VQVElPTigweGEwMCwgVHJhcF8wYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4YjAwLCBUcmFwXzBiLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhjMDAsIFN5c3RlbUNhbGwsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGQwMCwgU2luZ2xlU3RlcCwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHhlMDAsIFRyYXBfMGUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGYwMCwgVHJhcF8wZiwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHgxMDAwLCBJbnN0cnVjdGlvblRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDExMDAsIERhdGFMb2FkVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTIwMCwgRGF0YVN0b3JlVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKyNpZmRlZiBERUJVRworCS4gPSAweDEzMDAKKwkvKgorCSAqIFRoaXMgZXhjZXB0aW9uIG9jY3VycyB3aGVuIHRoZSBwcm9ncmFtIGNvdW50ZXIgbWF0Y2hlcyB0aGUKKwkgKiBJbnN0cnVjdGlvbiBBZGRyZXNzIEJyZWFrcG9pbnQgUmVnaXN0ZXIgKElBQlIpLgorCSAqCisJICogSSB3YW50IHRoZSBjcHUgdG8gaGFsdCBpZiB0aGlzIG9jY3VycyBzbyBJIGNhbiBodW50IGFyb3VuZAorCSAqIHdpdGggdGhlIGRlYnVnZ2VyIGFuZCBsb29rIGF0IHRoaW5ncy4KKwkgKgorCSAqIFdoZW4gREVCVUcgaXMgZGVmaW5lZCwgYm90aCBtYWNoaW5lIGNoZWNrIGVuYWJsZSAoaW4gdGhlIE1TUikKKwkgKiBhbmQgY2hlY2tzdG9wIHJlc2V0IGVuYWJsZSAoaW4gdGhlIHJlc2V0IG1vZGUgcmVnaXN0ZXIpIGFyZQorCSAqIHR1cm5lZCBvZmYgYW5kIHNvIGEgY2hlY2tzdG9wIGNvbmRpdGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgY3B1CisJICogaGFsdGluZy4KKwkgKgorCSAqIEkgZm9yY2UgdGhlIGNwdSBpbnRvIGEgY2hlY2tzdG9wIGNvbmRpdGlvbiBieSBwdXR0aW5nIGFuIGlsbGVnYWwKKwkgKiBpbnN0cnVjdGlvbiBoZXJlIChhdCBsZWFzdCB0aGlzIGlzIHRoZSB0aGVvcnkpLgorCSAqCisJICogd2VsbCAtIHRoYXQgZGlkbnQgd29yaywgc28ganVzdCBkbyBhbiBpbmZpbml0ZSBsb29wIQorCSAqLworMToJYgkxYgorI2Vsc2UKKwlTVERfRVhDRVBUSU9OKDB4MTMwMCwgSW5zdHJ1Y3Rpb25CcmVha3BvaW50LCBEZWJ1Z0V4Y2VwdGlvbikKKyNlbmRpZgorCVNURF9FWENFUFRJT04oMHgxNDAwLCBTTUksIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKDB4MTUwMCwgVHJhcF8xNSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTYwMCwgVHJhcF8xNiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTcwMCwgVHJhcF8xNywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTgwMCwgVHJhcF8xOCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTkwMCwgVHJhcF8xOSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWEwMCwgVHJhcF8xYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWIwMCwgVHJhcF8xYiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWMwMCwgVHJhcF8xYywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWQwMCwgVHJhcF8xZCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWUwMCwgVHJhcF8xZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWYwMCwgVHJhcF8xZiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjAwMCwgVHJhcF8yMCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjEwMCwgVHJhcF8yMSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjIwMCwgVHJhcF8yMiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjMwMCwgVHJhcF8yMywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjQwMCwgVHJhcF8yNCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjUwMCwgVHJhcF8yNSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjYwMCwgVHJhcF8yNiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjcwMCwgVHJhcF8yNywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjgwMCwgVHJhcF8yOCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjkwMCwgVHJhcF8yOSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmEwMCwgVHJhcF8yYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmIwMCwgVHJhcF8yYiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmMwMCwgVHJhcF8yYywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmQwMCwgVHJhcF8yZCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmUwMCwgVHJhcF8yZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmYwMCwgVHJhcF8yZiwgVW5rbm93bkV4Y2VwdGlvbikKKworCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisJLiA9IDB4MzAwMAorCisvKgorICogVGhpcyBjb2RlIGZpbmlzaGVzIHNhdmluZyB0aGUgcmVnaXN0ZXJzIHRvIHRoZSBleGNlcHRpb24gZnJhbWUKKyAqIGFuZCBqdW1wcyB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAqIFJlZ2lzdGVyIHIyMSBpcyBwb2ludGVyIGludG8gdHJhcCBmcmFtZSwgcjEgaGFzIG5ldyBzdGFjayBwb2ludGVyLgorICovCisJLmdsb2JsCXRyYW5zZmVyX3RvX2hhbmRsZXIKK3RyYW5zZmVyX3RvX2hhbmRsZXI6CisJc3R3CXIyMixfTklQKHIyMSkKKwlsaXMJcjIyLE1TUl9QT1dAaAorCWFuZGMJcjIzLHIyMyxyMjIKKwlzdHcJcjIzLF9NU1IocjIxKQorCVNBVkVfR1BSKDcsIHIyMSkKKwlTQVZFXzRHUFJTKDgsIHIyMSkKKwlTQVZFXzhHUFJTKDEyLCByMjEpCisJU0FWRV84R1BSUygyNCwgcjIxKQorCW1mbHIJcjIzCisJYW5kaS4JcjI0LHIyMywweDNmMDAJCS8qIGdldCB2ZWN0b3Igb2Zmc2V0ICovCisJc3R3CXIyNCxUUkFQKHIyMSkKKwlsaQlyMjIsMAorCXN0dwlyMjIsUkVTVUxUKHIyMSkKKwlsd3oJcjI0LDAocjIzKQkJLyogdmlydHVhbCBhZGRyZXNzIG9mIGhhbmRsZXIgKi8KKwlsd3oJcjIzLDQocjIzKQkJLyogd2hlcmUgdG8gZ28gd2hlbiBkb25lICovCisJbXRzcHIJU1JSMCxyMjQKKwltdHNwcglTUlIxLHIyMAorCW10bHIJcjIzCisJU1lOQworCXJmaQkJCQkvKiBqdW1wIHRvIGhhbmRsZXIsIGVuYWJsZSBNTVUgKi8KKworaW50X3JldHVybjoKKwltZm1zcglyMjgJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXI0LDAKKwlvcmkJcjQscjQsTVNSX0VFCisJYW5kYwlyMjgscjI4LHI0CisJU1lOQwkJCS8qIFNvbWUgY2hpcCByZXZzIG5lZWQgdGhpcy4uLiAqLworCW10bXNyCXIyOAorCVNZTkMKKwlsd3oJcjIsX0NUUihyMSkKKwlsd3oJcjAsX0xJTksocjEpCisJbXRjdHIJcjIKKwltdGxyCXIwCisJbHd6CXIyLF9YRVIocjEpCisJbHd6CXIwLF9DQ1IocjEpCisJbXRzcHIJWEVSLHIyCisJbXRjcmYJMHhGRixyMAorCVJFU1RfMTBHUFJTKDMsIHIxKQorCVJFU1RfMTBHUFJTKDEzLCByMSkKKwlSRVNUXzhHUFJTKDIzLCByMSkKKwlSRVNUX0dQUigzMSwgcjEpCisJbHd6CXIyLF9OSVAocjEpCS8qIFJlc3RvcmUgZW52aXJvbm1lbnQgKi8KKwlsd3oJcjAsX01TUihyMSkKKwltdHNwcglTUlIwLHIyCisJbXRzcHIJU1JSMSxyMAorCWx3eglyMCxHUFIwKHIxKQorCWx3eglyMixHUFIyKHIxKQorCWx3eglyMSxHUFIxKHIxKQorCVNZTkMKKwlyZmkKKyNlbmRpZiAvKiAhQ09ORklHX05BTkRfU1BMICovCisKKy8qCisgKiBUaGlzIGNvZGUgaW5pdGlhbGlzZXMgdGhlIEUzMDAgcHJvY2Vzc29yIGNvcmUKKyAqIChjb25mb3JtcyB0byBQb3dlclBDIDYwM2Ugc3BlYykKKyAqIE5vdGU6IGV4cGVjdHMgb3JpZ2luYWwgTVNSIGNvbnRlbnRzIHRvIGJlIGluIHI1LgorICovCisJLmdsb2JsCWluaXRfZTMwMF9jb3JlCitpbml0X2UzMDBfY29yZTogLyogdGltZSB0IDEwICovCisJLyogSW5pdGlhbGl6ZSBtYWNoaW5lIHN0YXR1czsgZW5hYmxlIG1hY2hpbmUgY2hlY2sgaW50ZXJydXB0ICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaQlyMywgTVNSX0tFUk5FTAkJCS8qIFNldCBNRSBhbmQgUkkgZmxhZ3MgKi8KKwlybHdpbWkJcjMsIHI1LCAwLCAyNSwgMjUJLyogcHJlc2VydmUgSVAgYml0IHNldCBieSBIUkNXICovCisjaWZkZWYgREVCVUcKKwlybHdpbWkJcjMsIHI1LCAwLCAyMSwgMjIgICAvKiBkZWJ1Z2dlciBtaWdodCBzZXQgU0UgJiBCRSBiaXRzICovCisjZW5kaWYKKwlTWU5DCQkJCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjMKKwlTWU5DCisJbXRzcHIJU1JSMSwgcjMJCQkvKiBNYWtlIFNSUjEgbWF0Y2ggTVNSICovCisKKworCWxpcwlyMywgQ09ORklHX1NZU19JTU1SQGgKKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwkvKiBJbml0aWFsaXNlIHRoZSBXYXRoY2RvZyB2YWx1ZXMgYW5kIHJlc2V0IGl0IChpZiByZXEpICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpcyByNCwgQ09ORklHX1NZU19XQVRDSERPR19WQUxVRQorCW9yaSByNCwgcjQsIChTV0NSUl9TV0VOIHwgU1dDUlJfU1dSSSB8IFNXQ1JSX1NXUFIpCisJc3R3IHI0LCBTV0NSUihyMykKKworCS8qIGFuZCByZXNldCBpdCAqLworCisJbGkJcjQsIDB4NTU2QworCXN0aAlyNCwgU1dTUlJAbChyMykKKwlsaQlyNCwgLTB4NTVDNworCXN0aAlyNCwgU1dTUlJAbChyMykKKyNlbHNlCisJLyogRGlzYWJsZSBXYXRoY2RvZyAgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWx3eiByNCwgU1dDUlIocjMpCisJLyogQ2hlY2sgdG8gc2VlIGlmIGl0cyBlbmFibGVkIGZvciBkaXNhYmxpbmcKKwkgICBvbmNlIGRpc2FibGVkIGJ5IFNXIHlvdSBjYW4ndCByZS1lbmFibGUgKi8KKwlhbmRpLiByNCwgcjQsIDB4NAorCWJlcSAxZgorCXhvciByNCwgcjQsIHI0CisJc3R3IHI0LCBTV0NSUihyMykKKzE6CisjZW5kaWYgLyogQ09ORklHX1dBVENIRE9HICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19NQVNLX0FFUl9BTykKKwkvKiBXcml0ZSB0aGUgQXJiaXRlciBFdmVudCBFbmFibGUgdG8gbWFzayBBZGRyZXNzIE9ubHkgdHJhcHMuICovCisJLyogVGhpcyBwcmV2ZW50cyB0aGUgZGNieiBpbnN0cnVjdGlvbiBmcm9tIGJlaW5nIHRyYXBwZWQgd2hlbiAqLworCS8qIEhJRDBfQUJFIEFkZHJlc3MgQnJvYWRjYXN0IEVuYWJsZSBpcyBzZXQgYW5kIHRoZSBNRU1PUlkgICAgKi8KKwkvKiBDT0hFUkVOQ1kgYml0IGlzIHNldCBpbiB0aGUgV0lNRyBiaXRzLCB3aGljaCBpcyBvZnRlbiAgICAgICovCisJLyogbmVlZGVkIGZvciBQQ0kgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWx3eglyNCwgMHgwODA4KHIzKQorCXJsd2lubQlyMCwgcjQsIDAsIH5BRVJfQU8KKwlzdHcJcjAsIDB4MDgwOChyMykKKyNlbmRpZiAvKiBDT05GSUdfTUFTS19BRVJfQU8gKi8KKworCS8qIEluaXRpYWxpemUgdGhlIEhhcmR3YXJlIEltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBSZWdpc3RlcnMgKi8KKwkvKiBISUQwIGFsc28gY29udGFpbnMgY2FjaGUgY29udHJvbAkJCSovCisJLyogLSBmb3JjZSBpbnZhbGlkYXRpb24gb2YgZGF0YSBhbmQgaW5zdHJ1Y3Rpb24gY2FjaGVzICAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpcwlyMywgQ09ORklHX1NZU19ISUQwX0lOSVRAaAorCW9yaQlyMywgcjMsIChDT05GSUdfU1lTX0hJRDBfSU5JVCB8IEhJRDBfSUNGSSB8IEhJRDBfRENGSSlAbAorCVNZTkMKKwltdHNwcglISUQwLCByMworCisJbGlzCXIzLCBDT05GSUdfU1lTX0hJRDBfRklOQUxAaAorCW9yaQlyMywgcjMsIChDT05GSUdfU1lTX0hJRDBfRklOQUwgJiB+KEhJRDBfSUNGSSB8IEhJRDBfRENGSSkpQGwKKwlTWU5DCisJbXRzcHIJSElEMCwgcjMKKworCWxpcwlyMywgQ09ORklHX1NZU19ISUQyQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0hJRDJAbAorCVNZTkMKKwltdHNwcglISUQyLCByMworCisJLyogRG9uZSEJCQkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlibHIKKworCS8qIHNldHVwX2JhdHMgLSBzZXQgdGhlbSB1cCB0byBzb21lIGluaXRpYWwgc3RhdGUgKi8KKwkuZ2xvYmwJc2V0dXBfYmF0cworc2V0dXBfYmF0czoKKwlhZGRpcwlyMCwgcjAsIDB4MDAwMAorCisJLyogSUJBVCAwICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0lCQVQwTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JQkFUMExAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19JQkFUMFVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSUJBVDBVQGwKKwltdHNwcglJQkFUMEwsIHI0CisJbXRzcHIJSUJBVDBVLCByMworCisJLyogREJBVCAwICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0RCQVQwTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19EQkFUMExAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19EQkFUMFVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfREJBVDBVQGwKKwltdHNwcglEQkFUMEwsIHI0CisJbXRzcHIJREJBVDBVLCByMworCisJLyogSUJBVCAxICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0lCQVQxTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JQkFUMUxAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19JQkFUMVVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSUJBVDFVQGwKKwltdHNwcglJQkFUMUwsIHI0CisJbXRzcHIJSUJBVDFVLCByMworCisJLyogREJBVCAxICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0RCQVQxTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19EQkFUMUxAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19EQkFUMVVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfREJBVDFVQGwKKwltdHNwcglEQkFUMUwsIHI0CisJbXRzcHIJREJBVDFVLCByMworCisJLyogSUJBVCAyICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0lCQVQyTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JQkFUMkxAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19JQkFUMlVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSUJBVDJVQGwKKwltdHNwcglJQkFUMkwsIHI0CisJbXRzcHIJSUJBVDJVLCByMworCisJLyogREJBVCAyICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0RCQVQyTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19EQkFUMkxAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19EQkFUMlVAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfREJBVDJVQGwKKwltdHNwcglEQkFUMkwsIHI0CisJbXRzcHIJREJBVDJVLCByMworCisJLyogSUJBVCAzICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0lCQVQzTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JQkFUM0xAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19JQkFUM1VAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSUJBVDNVQGwKKwltdHNwcglJQkFUM0wsIHI0CisJbXRzcHIJSUJBVDNVLCByMworCisJLyogREJBVCAzICovCisJYWRkaXMJcjQsIHIwLCBDT05GSUdfU1lTX0RCQVQzTEBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19EQkFUM0xAbAorCWFkZGlzCXIzLCByMCwgQ09ORklHX1NZU19EQkFUM1VAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfREJBVDNVQGwKKwltdHNwcglEQkFUM0wsIHI0CisJbXRzcHIJREJBVDNVLCByMworCisjaWZkZWYgQ09ORklHX0hJR0hfQkFUUworCS8qIElCQVQgNCAqLworCWFkZGlzICAgcjQsIHIwLCBDT05GSUdfU1lTX0lCQVQ0TEBoCisJb3JpICAgICByNCwgcjQsIENPTkZJR19TWVNfSUJBVDRMQGwKKwlhZGRpcyAgIHIzLCByMCwgQ09ORklHX1NZU19JQkFUNFVAaAorCW9yaSAgICAgcjMsIHIzLCBDT05GSUdfU1lTX0lCQVQ0VUBsCisJbXRzcHIgICBJQkFUNEwsIHI0CisJbXRzcHIgICBJQkFUNFUsIHIzCisKKwkvKiBEQkFUIDQgKi8KKwlhZGRpcyAgIHI0LCByMCwgQ09ORklHX1NZU19EQkFUNExAaAorCW9yaSAgICAgcjQsIHI0LCBDT05GSUdfU1lTX0RCQVQ0TEBsCisJYWRkaXMgICByMywgcjAsIENPTkZJR19TWVNfREJBVDRVQGgKKwlvcmkgICAgIHIzLCByMywgQ09ORklHX1NZU19EQkFUNFVAbAorCW10c3ByICAgREJBVDRMLCByNAorCW10c3ByICAgREJBVDRVLCByMworCisJLyogSUJBVCA1ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfSUJBVDVMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19JQkFUNUxAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0lCQVQ1VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfSUJBVDVVQGwKKwltdHNwciAgIElCQVQ1TCwgcjQKKwltdHNwciAgIElCQVQ1VSwgcjMKKworCS8qIERCQVQgNSAqLworCWFkZGlzICAgcjQsIHIwLCBDT05GSUdfU1lTX0RCQVQ1TEBoCisJb3JpICAgICByNCwgcjQsIENPTkZJR19TWVNfREJBVDVMQGwKKwlhZGRpcyAgIHIzLCByMCwgQ09ORklHX1NZU19EQkFUNVVAaAorCW9yaSAgICAgcjMsIHIzLCBDT05GSUdfU1lTX0RCQVQ1VUBsCisJbXRzcHIgICBEQkFUNUwsIHI0CisJbXRzcHIgICBEQkFUNVUsIHIzCisKKwkvKiBJQkFUIDYgKi8KKwlhZGRpcyAgIHI0LCByMCwgQ09ORklHX1NZU19JQkFUNkxAaAorCW9yaSAgICAgcjQsIHI0LCBDT05GSUdfU1lTX0lCQVQ2TEBsCisJYWRkaXMgICByMywgcjAsIENPTkZJR19TWVNfSUJBVDZVQGgKKwlvcmkgICAgIHIzLCByMywgQ09ORklHX1NZU19JQkFUNlVAbAorCW10c3ByICAgSUJBVDZMLCByNAorCW10c3ByICAgSUJBVDZVLCByMworCisJLyogREJBVCA2ICovCisJYWRkaXMgICByNCwgcjAsIENPTkZJR19TWVNfREJBVDZMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19EQkFUNkxAbAorCWFkZGlzICAgcjMsIHIwLCBDT05GSUdfU1lTX0RCQVQ2VUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfREJBVDZVQGwKKwltdHNwciAgIERCQVQ2TCwgcjQKKwltdHNwciAgIERCQVQ2VSwgcjMKKworCS8qIElCQVQgNyAqLworCWFkZGlzICAgcjQsIHIwLCBDT05GSUdfU1lTX0lCQVQ3TEBoCisJb3JpICAgICByNCwgcjQsIENPTkZJR19TWVNfSUJBVDdMQGwKKwlhZGRpcyAgIHIzLCByMCwgQ09ORklHX1NZU19JQkFUN1VAaAorCW9yaSAgICAgcjMsIHIzLCBDT05GSUdfU1lTX0lCQVQ3VUBsCisJbXRzcHIgICBJQkFUN0wsIHI0CisJbXRzcHIgICBJQkFUN1UsIHIzCisKKwkvKiBEQkFUIDcgKi8KKwlhZGRpcyAgIHI0LCByMCwgQ09ORklHX1NZU19EQkFUN0xAaAorCW9yaSAgICAgcjQsIHI0LCBDT05GSUdfU1lTX0RCQVQ3TEBsCisJYWRkaXMgICByMywgcjAsIENPTkZJR19TWVNfREJBVDdVQGgKKwlvcmkgICAgIHIzLCByMywgQ09ORklHX1NZU19EQkFUN1VAbAorCW10c3ByICAgREJBVDdMLCByNAorCW10c3ByICAgREJBVDdVLCByMworI2VuZGlmCisKKwlpc3luYworCisJLyogaW52YWxpZGF0ZSBhbGwgdGxiJ3MKKwkgKgorCSAqIEZyb20gdGhlIDYwM2UgVXNlciBNYW51YWw6ICJUaGUgNjAzZSBwcm92aWRlcyB0aGUgYWJpbGl0eSB0bworCSAqIGludmFsaWRhdGUgYSBUTEIgZW50cnkuIFRoZSBUTEIgSW52YWxpZGF0ZSBFbnRyeSAodGxiaWUpCisJICogaW5zdHJ1Y3Rpb24gaW52YWxpZGF0ZXMgdGhlIFRMQiBlbnRyeSBpbmRleGVkIGJ5IHRoZSBFQSwgYW5kCisJICogb3BlcmF0ZXMgb24gYm90aCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgVExCcyBzaW11bHRhbmVvdXNseQorCSAqIGludmFsaWRhdGluZyBmb3VyIFRMQiBlbnRyaWVzIChib3RoIHNldHMgaW4gZWFjaCBUTEIpLiBUaGUKKwkgKiBpbmRleCBjb3JyZXNwb25kcyB0byBiaXRzIDE1LTE5IG9mIHRoZSBFQS4gVG8gaW52YWxpZGF0ZSBhbGwKKwkgKiBlbnRyaWVzIHdpdGhpbiBib3RoIFRMQnMsIDMyIHRsYmllIGluc3RydWN0aW9ucyBzaG91bGQgYmUKKwkgKiBpc3N1ZWQsIGluY3JlbWVudGluZyB0aGlzIGZpZWxkIGJ5IG9uZSBlYWNoIHRpbWUuIgorCSAqCisJICogIk5vdGUgdGhhdCB0aGUgdGxiaWEgaW5zdHJ1Y3Rpb24gaXMgbm90IGltcGxlbWVudGVkIG9uIHRoZQorCSAqIDYwM2UuIgorCSAqCisJICogYml0cyAxNS0xOSBjb3JyZXNwb25kIHRvIGFkZHJlc3NlcyAweDAwMDAwMDAwIHRvIDB4MDAwMUYwMDAKKwkgKiBpbmNyZW1lbnRpbmcgYnkgMHgxMDAwIGVhY2ggdGltZS4gVGhlIGNvZGUgYmVsb3cgaXMgc29ydCBvZgorCSAqIGJhc2VkIG9uIGNvZGUgaW4gImZsdXNoX3RsYnMiIGZyb20gYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkLlMKKwkgKgorCSAqLworCWxpcwlyMywgMAorCWxpcwlyNSwgMgorCisxOgorCXRsYmllCXIzCisJYWRkaQlyMywgcjMsIDB4MTAwMAorCWNtcAkwLCAwLCByMywgcjUKKwlibHQJMWIKKworCWJscgorCisvKiBDYWNoZSBmdW5jdGlvbnMuCisgKgorICogTm90ZTogcmVxdWlyZXMgdGhhdCBhbGwgY2FjaGUgYml0cyBpbgorICogSElEMCBhcmUgaW4gdGhlIGxvdyBoYWxmIHdvcmQuCisgKi8KKwkuZ2xvYmwJaWNhY2hlX2VuYWJsZQoraWNhY2hlX2VuYWJsZToKKwltZnNwcglyMywgSElEMAorCW9yaQlyMywgcjMsIEhJRDBfSUNFCisJbGkJcjQsIEhJRDBfSUNGSXxISUQwX0lMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9JQ0ZJCisJaXN5bmMKKwltdHNwcglISUQwLCByNCAgICAvKiBzZXRzIGVuYWJsZSBhbmQgaW52YWxpZGF0ZSwgY2xlYXJzIGxvY2sgKi8KKwlpc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX2Rpc2FibGUKK2ljYWNoZV9kaXNhYmxlOgorCW1mc3ByCXIzLCBISUQwCisJbGlzCXI0LCAwCisJb3JpCXI0LCByNCwgSElEMF9JQ0V8SElEMF9JQ0ZJfEhJRDBfSUxPQ0sKKwlhbmRjCXIzLCByMywgcjQKKwlpc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlLCBlbmFibGUgYW5kIGxvY2sgKi8KKwlibHIKKworCS5nbG9ibAlpY2FjaGVfc3RhdHVzCitpY2FjaGVfc3RhdHVzOgorCW1mc3ByCXIzLCBISUQwCisJcmx3aW5tCXIzLCByMywgKDMxIC0gSElEMF9JQ0VfU0hJRlQgKyAxKSwgMzEsIDMxCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX2VuYWJsZQorZGNhY2hlX2VuYWJsZToKKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0RDRkl8SElEMF9ETE9DSworCWFuZGMJcjMsIHIzLCByNQorCW9yaQlyMywgcjMsIEhJRDBfRENFCisJc3luYworCW10c3ByCUhJRDAsIHIzCQkvKiBlbmFibGUsIG5vIGludmFsaWRhdGUgKi8KKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZGlzYWJsZQorZGNhY2hlX2Rpc2FibGU6CisJbWZscglyNAorCWJsCWZsdXNoX2RjYWNoZQkJLyogdXNlcyByMyBhbmQgcjUgKi8KKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0RDRXxISUQwX0RMT0NLCisJYW5kYwlyMywgcjMsIHI1CisJb3JpCXI1LCByMywgSElEMF9EQ0ZJCisJc3luYworCW10c3ByCUhJRDAsIHI1CS8qIHNldHMgaW52YWxpZGF0ZSwgY2xlYXJzIGVuYWJsZSBhbmQgbG9jayAqLworCXN5bmMKKwltdHNwcglISUQwLCByMwkvKiBjbGVhcnMgaW52YWxpZGF0ZSAqLworCW10bHIJcjQKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfc3RhdHVzCitkY2FjaGVfc3RhdHVzOgorCW1mc3ByCXIzLCBISUQwCisJcmx3aW5tCXIzLCByMywgKDMxIC0gSElEMF9EQ0VfU0hJRlQgKyAxKSwgMzEsIDMxCisJYmxyCisKKwkuZ2xvYmwJZmx1c2hfZGNhY2hlCitmbHVzaF9kY2FjaGU6CisJbGlzCXIzLCAwCisJbGlzCXI1LCBDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCisxOgljbXAJMCwgMSwgcjMsIHI1CisJYmdlCTJmCisJbHd6CXI1LCAwKHIzKQorCWxpcwlyNSwgQ09ORklHX1NZU19DQUNIRUxJTkVfU0laRQorCWFkZGkJcjMsIHIzLCAweDQKKwliCTFiCisyOglibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIHZvaWQgcmVsb2NhdGVfY29kZSAoYWRkcl9zcCwgZ2QsIGFkZHJfbW9uaSkKKyAqCisgKiBUaGlzICJmdW5jdGlvbiIgZG9lcyBub3QgcmV0dXJuLCBpbnN0ZWFkIGl0IGNvbnRpbnVlcyBpbiBSQU0KKyAqIGFmdGVyIHJlbG9jYXRpbmcgdGhlIG1vbml0b3IgY29kZS4KKyAqCisgKiByMyA9IGRlc3QKKyAqIHI0ID0gc3JjCisgKiByNSA9IGxlbmd0aCBpbiBieXRlcworICogcjYgPSBjYWNoZWxpbmVzaXplCisgKi8KKwkuZ2xvYmwJcmVsb2NhdGVfY29kZQorcmVsb2NhdGVfY29kZToKKwltcglyMSwgIHIzCQkvKiBTZXQgbmV3IHN0YWNrIHBvaW50ZXIJKi8KKwltcglyOSwgIHI0CQkvKiBTYXZlIGNvcHkgb2YgR2xvYmFsIERhdGEgcG9pbnRlciAqLworCW1yCXIxMCwgcjUJCS8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisKKwlHRVRfR09UCisJbXIJcjMsICByNQkJCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisJbGlzCXI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzICovCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWx3eglyNSwgR09UKF9fYnNzX3N0YXJ0KQorCXN1YglyNSwgcjUsIHI0CisJbGkJcjYsIENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUJCS8qIENhY2hlIExpbmUgU2l6ZSAqLworCisJLyoKKwkgKiBGaXggR09UIHBvaW50ZXI6CisJICoKKwkgKiBOZXcgR09ULVBUUiA9IChvbGQgR09ULVBUUiAtIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFKQorCSAqCQkrIERlc3RpbmF0aW9uIEFkZHJlc3MKKwkgKgorCSAqIE9mZnNldDoKKwkgKi8KKwlzdWIJcjE1LCByMTAsIHI0CisKKwkvKiBGaXJzdCBvdXIgb3duIEdPVCAqLworCWFkZAlyMTIsIHIxMiwgcjE1CisJLyogdGhlbiB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLworCWFkZAlyMzAsIHIzMCwgcjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisKKwljbXBsdwljcjEscjMscjQKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJYmVxCWNyMSw0ZgkJLyogSW4gcGxhY2UgY29weSBpcyBub3QgbmVjZXNzYXJ5ICovCisJYmVxCTdmCQkvKiBQcm90ZWN0IGFnYWluc3QgMCBjb3VudAkgICovCisJbXRjdHIJcjAKKwliZ2UJY3IxLDJmCisJbGEJcjgsLTQocjQpCisJbGEJcjcsLTQocjMpCisKKwkvKiBjb3B5ICovCisxOglsd3p1CXIwLDQocjgpCisJc3R3dQlyMCw0KHI3KQorCWJkbnoJMWIKKworCWFkZGkJcjAscjUsMworCXNyd2kuCXIwLHIwLDIKKwltdGN0cglyMAorCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorCisJLyogYW5kIGNvbXBhcmUgKi8KKzIwOglsd3p1CXIyMCw0KHI4KQorCWx3enUJcjIxLDQocjcpCisJeG9yLiByMjIsIHIyMCwgcjIxCisJYm5lICAzMGYKKwliZG56CTIwYgorCWIgNGYKKworCS8qIGNvbXBhcmUgZmFpbGVkICovCiszMDoJbGkgcjMsIDAKKwlibHIKKworMjoJc2x3aQlyMCxyMCwyIC8qIHJlIGNvcHkgaW4gcmV2ZXJzZSBvcmRlciAuLi4geSBkbyB3ZSBuZWVkZWQgaXQ/ICovCisJYWRkCXI4LHI0LHIwCisJYWRkCXI3LHIzLHIwCiszOglsd3p1CXIwLC00KHI4KQorCXN0d3UJcjAsLTQocjcpCisJYmRuegkzYgorCisvKgorICogTm93IGZsdXNoIHRoZSBjYWNoZTogbm90ZSB0aGF0IHdlIG11c3Qgc3RhcnQgZnJvbSBhIGNhY2hlIGFsaWduZWQKKyAqIGFkZHJlc3MuIE90aGVyd2lzZSB3ZSBtaWdodCBtaXNzIG9uZSBjYWNoZSBsaW5lLgorICovCis0OgljbXB3aQlyNiwwCisJYWRkCXI1LHIzLHI1CisJYmVxCTdmCQkvKiBBbHdheXMgZmx1c2ggcHJlZmV0Y2ggcXVldWUgaW4gYW55IGNhc2UgKi8KKwlzdWJpCXIwLHI2LDEKKwlhbmRjCXIzLHIzLHIwCisJbXIJcjQscjMKKzU6CWRjYnN0CTAscjQKKwlhZGQJcjQscjQscjYKKwljbXBsdwlyNCxyNQorCWJsdAk1YgorCXN5bmMJCQkvKiBXYWl0IGZvciBhbGwgZGNic3QgdG8gY29tcGxldGUgb24gYnVzICovCisJbXIJcjQscjMKKzY6CWljYmkJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTZiCis3OglzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGljYmkgdG8gY29tcGxldGUgb24gYnVzCSovCisJaXN5bmMKKworLyoKKyAqIFdlIGFyZSBkb25lLiBEbyBub3QgcmV0dXJuLCBpbnN0ZWFkIGJyYW5jaCB0byBzZWNvbmQgcGFydCBvZiBib2FyZAorICogaW5pdGlhbGl6YXRpb24sIG5vdyBydW5uaW5nIGZyb20gUkFNLgorICovCisJYWRkaQlyMCwgcjEwLCBpbl9yYW0gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCW10bHIJcjAKKwlibHIKKworaW5fcmFtOgorCisJLyoKKwkgKiBSZWxvY2F0aW9uIEZ1bmN0aW9uLCByMTIgcG9pbnQgdG8gZ290MisweDgwMDAKKwkgKgorCSAqIEFkanVzdCBnb3QyIHBvaW50ZXJzLCBubyBuZWVkIHRvIGNoZWNrIGZvciAwLCB0aGlzIGNvZGUKKwkgKiBhbHJlYWR5IHB1dHMgYSBmZXcgZW50cmllcyBpbiB0aGUgdGFibGUuCisJICovCisJbGkJcjAsX19nb3QyX2VudHJpZXNAc2VjdG9mZkBsCisJbGEJcjMsR09UKF9HT1QyX1RBQkxFXykKKwlsd3oJcjExLEdPVChfR09UMl9UQUJMRV8pCisJbXRjdHIJcjAKKwlzdWIJcjExLHIzLHIxMQorCWFkZGkJcjMscjMsLTQKKzE6CWx3enUJcjAsNChyMykKKwljbXB3aQlyMCwwCisJYmVxLQkyZgorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjAsMChyMykKKzI6CWJkbnoJMWIKKworI2lmbmRlZiBDT05GSUdfTkFORF9TUEwKKwkvKgorCSAqIE5vdyBhZGp1c3QgdGhlIGZpeHVwcyBhbmQgdGhlIHBvaW50ZXJzIHRvIHRoZSBmaXh1cHMKKwkgKiBpbiBjYXNlIHdlIG5lZWQgdG8gbW92ZSBvdXJzZWx2ZXMgYWdhaW4uCisJICovCisJbGkJcjAsX19maXh1cF9lbnRyaWVzQHNlY3RvZmZAbAorCWx3eglyMyxHT1QoX0ZJWFVQX1RBQkxFXykKKwljbXB3aQlyMCwwCisJbXRjdHIJcjAKKwlhZGRpCXIzLHIzLC00CisJYmVxCTRmCiszOglsd3p1CXI0LDQocjMpCisJbHd6dXgJcjAscjQscjExCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMTAsMChyMykKKwlzdHcJcjAsMChyNCkKKwliZG56CTNiCis0OgorI2VuZGlmCisKK2NsZWFyX2JzczoKKwkvKgorCSAqIE5vdyBjbGVhciBCU1Mgc2VnbWVudAorCSAqLworCWx3eglyMyxHT1QoX19ic3Nfc3RhcnQpCisjaWYgZGVmaW5lZChDT05GSUdfSFlNT0QpCisJLyoKKwkgKiBGb3IgSFlNT0QgLSB0aGUgZW52aXJvbm1lbnQgaXMgdGhlIHZlcnkgbGFzdCBpdGVtIGluIGZsYXNoLgorCSAqIFRoZSByZWFsIC5ic3Mgc3RvcHMganVzdCBiZWZvcmUgZW52aXJvbm1lbnQgc3RhcnRzLCBzbyBvbmx5CisJICogY2xlYXIgdXAgdG8gdGhhdCBwb2ludC4KKwkgKgorCSAqIHRha2VuIGZyb20gbW9kcyBmb3IgRkFEUyBib2FyZAorCSAqLworCWx3eglyNCxHT1QoZW52aXJvbm1lbnQpCisjZWxzZQorCWx3eglyNCxHT1QoX2VuZCkKKyNlbmRpZgorCisJY21wbHcJMCwgcjMsIHI0CisJYmVxCTZmCisKKwlsaQlyMCwgMAorNToKKwlzdHcJcjAsIDAocjMpCisJYWRkaQlyMywgcjMsIDQKKwljbXBsdwkwLCByMywgcjQKKwlibmUJNWIKKzY6CisKKwltcglyMywgcjkJCS8qIEdsb2JhbCBEYXRhIHBvaW50ZXIJCSovCisJbXIJcjQsIHIxMAkJLyogRGVzdGluYXRpb24gQWRkcmVzcwkJKi8KKwlibAlib2FyZF9pbml0X3IKKworI2lmbmRlZiBDT05GSUdfTkFORF9TUEwKKwkvKgorCSAqIENvcHkgZXhjZXB0aW9uIHZlY3RvciBjb2RlIHRvIGxvdyBtZW1vcnkKKwkgKgorCSAqIHIzOiBkZXN0X2FkZHIKKwkgKiByNzogc291cmNlIGFkZHJlc3MsIHI4OiBlbmQgYWRkcmVzcywgcjk6IHRhcmdldCBhZGRyZXNzCisJICovCisJLmdsb2JsCXRyYXBfaW5pdAordHJhcF9pbml0OgorCW1mbHIJcjQJCS8qIHNhdmUgbGluayByZWdpc3RlciAqLworCUdFVF9HT1QKKwlsd3oJcjcsIEdPVChfc3RhcnQpCisJbHd6CXI4LCBHT1QoX2VuZF9vZl92ZWN0b3JzKQorCisJbGkJcjksIDB4MTAwCS8qIHJlc2V0IHZlY3RvciBhbHdheXMgYXQgMHgxMDAgKi8KKworCWNtcGx3CTAsIHI3LCByOAorCWJnZWxyCQkJLyogcmV0dXJuIGlmIHI3Pj1yOCAtIGp1c3QgaW4gY2FzZSAqLworMToKKwlsd3oJcjAsIDAocjcpCisJc3R3CXIwLCAwKHI5KQorCWFkZGkJcjcsIHI3LCA0CisJYWRkaQlyOSwgcjksIDQKKwljbXBsdwkwLCByNywgcjgKKwlibmUJMWIKKworCS8qCisJICogcmVsb2NhdGUgYGhkbHInIGFuZCBgaW50X3JldHVybicgZW50cmllcworCSAqLworCWxpCXI3LCAuTF9NYWNoaW5lQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBBbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMjoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IgKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJMmIKKworCWxpCXI3LCAuTF9BbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9Qcm9ncmFtQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgU3lzdGVtQ2FsbCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCiszOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvciAqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkzYgorCisJbGkJcjcsIC5MX1NpbmdsZVN0ZXAgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorNDoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IgKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJNGIKKworCW1mbXNyCXIzCQkJLyogbm93IHRoYXQgdGhlIHZlY3RvcnMgaGF2ZSAqLworCWxpcwlyNywgTVNSX0lQQGgJCS8qIHJlbG9jYXRlZCBpbnRvIGxvdyBtZW1vcnkgKi8KKwlvcmkJcjcsIHI3LCBNU1JfSVBAbAkvKiBNU1JbSVBdIGNhbiBiZSB0dXJuZWQgb2ZmICovCisJYW5kYwlyMywgcjMsIHI3CQkvKiAoaWYgaXQgd2FzIG9uKSAqLworCVNZTkMJCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjMKKwlTWU5DCisKKwltdGxyCXI0CQkJLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyICAgICovCisJYmxyCisKKyNlbmRpZiAvKiAhQ09ORklHX05BTkRfU1BMICovCisKKyNpZmRlZiBDT05GSUdfU1lTX0lOSVRfUkFNX0xPQ0sKK2xvY2tfcmFtX2luX2NhY2hlOgorCS8qIEFsbG9jYXRlIEluaXRpYWwgUkFNIGluIGRhdGEgY2FjaGUuCisJICovCisJbGlzCXIzLCAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICYgfjMxKUBoCisJb3JpCXIzLCByMywgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiAmIH4zMSlAbAorCWxpCXI0LCAoKENPTkZJR19TWVNfSU5JVF9SQU1fRU5EICYgfjMxKSArIFwKKwkJICAgICAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICYgMzEpICsgMzEpIC8gMzIKKwltdGN0cglyNAorMToKKwlkY2J6CXIwLCByMworCWFkZGkJcjMsIHIzLCAzMgorCWJkbnoJMWIKKworCS8qIExvY2sgdGhlIGRhdGEgY2FjaGUgKi8KKwltZnNwcglyMCwgSElEMAorCW9yaQlyMCwgcjAsIEhJRDBfRExPQ0sKKwlzeW5jCisJbXRzcHIJSElEMCwgcjAKKwlzeW5jCisJYmxyCisKKyNpZm5kZWYgQ09ORklHX05BTkRfU1BMCisuZ2xvYmwgdW5sb2NrX3JhbV9pbl9jYWNoZQordW5sb2NrX3JhbV9pbl9jYWNoZToKKwkvKiBpbnZhbGlkYXRlIHRoZSBJTklUX1JBTSBzZWN0aW9uICovCisJbGlzCXIzLCAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICYgfjMxKUBoCisJb3JpCXIzLCByMywgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiAmIH4zMSlAbAorCWxpCXI0LCAoKENPTkZJR19TWVNfSU5JVF9SQU1fRU5EICYgfjMxKSArIFwKKwkJICAgICAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICYgMzEpICsgMzEpIC8gMzIKKwltdGN0cglyNAorMToJaWNiaQlyMCwgcjMKKwlkY2JpCXIwLCByMworCWFkZGkJcjMsIHIzLCAzMgorCWJkbnoJMWIKKwlzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGljYmkgdG8gY29tcGxldGUgb24gYnVzCSovCisJaXN5bmMKKworCS8qIFVubG9jayB0aGUgZGF0YSBjYWNoZSBhbmQgaW52YWxpZGF0ZSBpdCAqLworCW1mc3ByICAgcjMsIEhJRDAKKwlsaQlyNSwgSElEMF9ETE9DS3xISUQwX0RDRkkKKwlhbmRjCXIzLCByMywgcjUJCS8qIG5vIGludmFsaWRhdGUsIHVubG9jayAqLworCW9yaQlyNSwgcjMsIEhJRDBfRENGSQkvKiBpbnZhbGlkYXRlLCB1bmxvY2sgKi8KKwlzeW5jCisJbXRzcHIJSElEMCwgcjUJCS8qIGludmFsaWRhdGUsIHVubG9jayAqLworCXN5bmMKKwltdHNwcglISUQwLCByMwkJLyogbm8gaW52YWxpZGF0ZSwgdW5sb2NrICovCisJYmxyCisjZW5kaWYgLyogIUNPTkZJR19OQU5EX1NQTCAqLworI2VuZGlmIC8qIENPTkZJR19TWVNfSU5JVF9SQU1fTE9DSyAqLworCisjaWZkZWYgQ09ORklHX1NZU19GTEFTSEJPT1QKK21hcF9mbGFzaF9ieV9sYXcxOgorCS8qIFdoZW4gYm9vdGluZyBmcm9tIFJPTSAoRmxhc2ggb3IgRVBST00pLCBjbGVhciB0aGUgICovCisJLyogQWRkcmVzcyBNYXNrIGluIE9SMCBzbyBST00gYXBwZWFycyBldmVyeXdoZXJlICAgICAgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpcwlyMywgKENPTkZJR19TWVNfSU1NUilAaCAgLyogcjMgPD0gQ09ORklHX1NZU19JTU1SICAgICovCisJbHd6CXI0LCBPUjBAbChyMykKKwlsaQlyNSwgMHg3ZmZmICAgICAgICAvKiByNSA8PSAweDAwMDA3RkZGRiAqLworCWFuZAlyNCwgcjQsIHI1CisJc3R3CXI0LCBPUjBAbChyMykgICAgIC8qIE9SMCA8PSBPUjAgJiAweDAwMDA3RkZGRiAqLworCisJLyogQXMgTVBDODM0OUUgVXNlcidzIE1hbnVhbCBwcmVzZW50ZWQsIHdoZW4gUkNXW0JNU10gaXMgc2V0IHRvIDAsCisJICogc3lzdGVtIHdpbGwgYm9vdCBmcm9tIDB4MDAwMF8wMTAwLCBhbmQgdGhlIExCTEFXQkFSMFtCQVNFX0FERFJdCisJICogcmVzZXQgdmFsdWUgaXMgMHgwMDAwMDsgd2hlbiBSQ1dbQk1TXSBpcyBzZXQgdG8gMSwgc3lzdGVtIHdpbGwgYm9vdAorCSAqIGZyb20gMHhGRkYwXzAxMDAsIGFuZCB0aGUgTEJMQVdCQVIwW0JBU0VfQUREUl0gcmVzZXQgdmFsdWUgaXMKKwkgKiAweEZGODAwLiAgRnJvbSB0aGUgaGFyZCByZXNldHRpbmcgdG8gaGVyZSwgdGhlIHByb2Nlc3NvciBmZXRjaGVkIGFuZAorCSAqIGV4ZWN1dGVkIHRoZSBpbnN0cnVjdGlvbnMgb25lIGJ5IG9uZS4gIFRoZXJlIGlzIG5vdCBhYnNvbHV0ZWx5CisJICoganVtcGluZyBoYXBwZW5lZC4gIExhdGVybHksIHRoZSB1LWJvb3QgY29kZSBoYXMgdG8gZG8gYW4gYWJzb2x1dGVseQorCSAqIGp1bXBpbmcgdG8gdGVsbCB0aGUgQ1BVIGluc3RydWN0aW9uIGZldGNoaW5nIGNvbXBvbmVudCB3aGF0IHRoZQorCSAqIHUtYm9vdCBURVhUIGJhc2UgYWRkcmVzcyBpcy4gIEJlY2F1c2UgdGhlIFRFWFQgYmFzZSByZXNpZGVzIGluIHRoZQorCSAqIGJvb3QgUk9NIG1lbW9yeSBzcGFjZSwgdG8gZ2FyYW50ZWUgdGhlIGNvZGUgY2FuIHJ1biBzbW9vdGhseSBhZnRlcgorCSAqIHRoYXQganVtcGluZywgd2UgbXVzdCBtYXAgaW4gdGhlIGVudGlyZSBib290IFJPTSBieSBMb2NhbCBBY2Nlc3MKKwkgKiBXaW5kb3cuICBTb21ldGltZXMsIHdlIGRlc2lyZSBhbiBub24tMHgwMDAwMCBvciBub24tMHhGRjgwMCBzdGFydGluZworCSAqIGFkZHJlc3MgZm9yIGJvb3QgUk9NLCBzdWNoIGFzIDB4RkUwMDAwMDAuICBJbiB0aGlzIGNhc2UsIHRoZSBkZWZhdWx0CisJICogTEJJVSBMb2NhbCBBY2Nlc3MgV2lkb3cgMCB3aWxsIG5vdCBjb3ZlciB0aGlzIG1lbW9yeSBzcGFjZS4gIFNvLCB3ZQorCSAqIG5lZWQgYW5vdGhlciB3aW5kb3cgdG8gbWFwIGluIGl0LgorCSAqLworCWxpcyByNCwgKENPTkZJR19TWVNfRkxBU0hfQkFTRSlAaAorCW9yaSByNCwgcjQsIChDT05GSUdfU1lTX0ZMQVNIX0JBU0UpQGwKKwlzdHcgcjQsIExCTEFXQkFSMShyMykgLyogTEJMQVdCQVIxIDw9IENPTkZJR19TWVNfRkxBU0hfQkFTRSAqLworCisJLyogU3RvcmUgMHg4MDAwMDAxMiArIGxvZzIoQ09ORklHX1NZU19GTEFTSF9TSVpFKSBpbnRvIExCTEFXQVIxICovCisJbGlzIHI0LCAoMHg4MDAwMDAxMilAaAorCW9yaSByNCwgcjQsICgweDgwMDAwMDEyKUBsCisJbGkgcjUsIENPTkZJR19TWVNfRkxBU0hfU0laRQorMToJc3Jhd2kuIHI1LCByNSwgMQkvKiByNSA9IHI1ID4+IDEgKi8KKwlhZGRpIHI0LCByNCwgMQorCWJuZSAxYgorCisJc3R3IHI0LCBMQkxBV0FSMShyMykgLyogTEJMQVdBUjEgPD0gOE1CIEZsYXNoIFNpemUgKi8KKwlibHIKKworCS8qIFRob3VnaCBhbGwgdGhlIExCSVUgTG9jYWwgQWNjZXNzIFdpbmRvd3MgYW5kIExCQyBCYW5rcyB3aWxsIGJlCisJICogaW5pdGlhbGl6ZWQgaW4gdGhlIEMgY29kZSwgd2UnZCBiZXR0ZXIgY29uZmlndXJlIGJvb3QgUk9NJ3MKKwkgKiB3aW5kb3cgMCBhbmQgYmFuayAwIGNvcnJlY3RseSBhdCBoZXJlLgorCSAqLworcmVtYXBfZmxhc2hfYnlfbGF3MDoKKwkvKiBJbml0aWFsaXplIHRoZSBCUjAgd2l0aCB0aGUgYm9vdCBST00gc3RhcnRpbmcgYWRkcmVzcy4gKi8KKwlsd3ogcjQsIEJSMChyMykKKwlsaSAgcjUsIDB4N0ZGRgorCWFuZCByNCwgcjQsIHI1CisJbGlzIHI1LCAoQ09ORklHX1NZU19GTEFTSF9CQVNFICYgMHhGRkZGODAwMClAaAorCW9yaSByNSwgcjUsIChDT05GSUdfU1lTX0ZMQVNIX0JBU0UgJiAweEZGRkY4MDAwKUBsCisJb3IgIHI1LCByNSwgcjQKKwlzdHcgcjUsIEJSMChyMykgLyogcjUgPD0gKENPTkZJR19TWVNfRkxBU0hfQkFTRSAmIDB4RkZGRjgwMDApIHwgKEJSMCAmIDB4MDAwMDdGRkYpICovCisKKwlsd3ogcjQsIE9SMChyMykKKwlsaXMgcjUsIH4oKENPTkZJR19TWVNfRkxBU0hfU0laRSA8PCA0KSAtIDEpCisJb3IgcjQsIHI0LCByNQorCXN0dyByNCwgT1IwKHIzKQorCisJbGlzIHI0LCAoQ09ORklHX1NZU19GTEFTSF9CQVNFKUBoCisJb3JpIHI0LCByNCwgKENPTkZJR19TWVNfRkxBU0hfQkFTRSlAbAorCXN0dyByNCwgTEJMQVdCQVIwKHIzKSAvKiBMQkxBV0JBUjAgPD0gQ09ORklHX1NZU19GTEFTSF9CQVNFICovCisKKwkvKiBTdG9yZSAweDgwMDAwMDEyICsgbG9nMihDT05GSUdfU1lTX0ZMQVNIX1NJWkUpIGludG8gTEJMQVdBUjAgKi8KKwlsaXMgcjQsICgweDgwMDAwMDEyKUBoCisJb3JpIHI0LCByNCwgKDB4ODAwMDAwMTIpQGwKKwlsaSByNSwgQ09ORklHX1NZU19GTEFTSF9TSVpFCisxOglzcmF3aS4gcjUsIHI1LCAxIC8qIHI1ID0gcjUgPj4gMSAqLworCWFkZGkgcjQsIHI0LCAxCisJYm5lIDFiCisJc3R3IHI0LCBMQkxBV0FSMChyMykgLyogTEJMQVdBUjAgPD0gRmxhc2ggU2l6ZSAqLworCisKKwl4b3IgcjQsIHI0LCByNAorCXN0dyByNCwgTEJMQVdCQVIxKHIzKQorCXN0dyByNCwgTEJMQVdBUjEocjMpIC8qIE9mZiBMQklVIExBVzEgKi8KKwlibHIKKyNlbmRpZiAvKiBDT05GSUdfU1lTX0ZMQVNIQk9PVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDcxYjhiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3RyYXBzLmMKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgIEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBoYXJkd2FyZQorICogZXhjZXB0aW9ucworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8a2dkYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbXBjODM0OV9wY2kuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qIFJldHVybnMgMCBpZiBleGNlcHRpb24gbm90IGZvdW5kIGFuZCBmaXh1cCBvdGhlcndpc2UuICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nKTsKKworI2RlZmluZSBFTkRfT0ZfTUVNCShnZC0+YmQtPmJpX21lbXN0YXJ0ICsgZ2QtPmJkLT5iaV9tZW1zaXplKQorCisvKgorICogVHJhcCAmIEV4Y2VwdGlvbiBzdXBwb3J0CisgKi8KKwordm9pZAorcHJpbnRfYmFja3RyYWNlKHVuc2lnbmVkIGxvbmcgKnNwKQoreworCWludCBjbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgaTsKKworCXB1dHMgKCJDYWxsIGJhY2t0cmFjZTogIik7CisJd2hpbGUgKHNwKSB7CisJCWlmICgodWludClzcCA+IEVORF9PRl9NRU0pCisJCQlicmVhazsKKworCQlpID0gc3BbMV07CisJCWlmIChjbnQrKyAlIDcgPT0gMCkKKwkJCXB1dGMgKCdcbicpOworCQlwcmludGYoIiUwOGxYICIsIGkpOworCQlpZiAoY250ID4gMzIpIGJyZWFrOworCQlzcCA9ICh1bnNpZ25lZCBsb25nICopKnNwOworCX0KKwlwdXRjICgnXG4nKTsKK30KKwordm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpOworCisJcHJpbnRmKCJOSVA6ICUwOGxYIFhFUjogJTA4bFggTFI6ICUwOGxYIFJFR1M6ICVwIFRSQVA6ICUwNGx4IERBUjogJTA4bFhcbiIsCisJICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+eGVyLCByZWdzLT5saW5rLCByZWdzLCByZWdzLT50cmFwLCByZWdzLT5kYXIpOworCXByaW50ZigiTVNSOiAlMDhseCBFRTogJTAxeCBQUjogJTAxeCBGUDogJTAxeCBNRTogJTAxeCBJUi9EUjogJTAxeCUwMXhcbiIsCisJICAgICAgIHJlZ3MtPm1zciwgcmVncy0+bXNyJk1TUl9FRSA/IDEgOiAwLCByZWdzLT5tc3ImTVNSX1BSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciAmIE1TUl9GUCA/IDEgOiAwLHJlZ3MtPm1zciZNU1JfTUUgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyJk1TUl9JUiA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3ImTVNSX0RSID8gMSA6IDApOworCisJcHV0YyAoJ1xuJyk7CisJZm9yIChpID0gMDsgIGkgPCAzMjsgIGkrKykgeworCQlpZiAoKGkgJSA4KSA9PSAwKSB7CisJCQlwcmludGYoIkdQUiUwMmQ6ICIsIGkpOworCQl9CisKKwkJcHJpbnRmKCIlMDhsWCAiLCByZWdzLT5ncHJbaV0pOworCQlpZiAoKGkgJSA4KSA9PSA3KSB7CisJCQlwdXRjICgnXG4nKTsKKwkJfQorCX0KK30KKworCit2b2lkCitfZXhjZXB0aW9uKGludCBzaWduciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMoIkV4Y2VwdGlvbiBpbiBrZXJuZWwgcGMgJWx4IHNpZ25hbCAlZCIscmVncy0+bmlwLHNpZ25yKTsKK30KKworI2lmZGVmIENPTkZJR19QQ0kKK3ZvaWQgZHVtcF9wY2kgKHZvaWQpCit7CisvKgorCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXByaW50ZiAoIlBDSTogZXJyIHN0YXR1cyAleCBlcnIgbWFzayAleCBlcnIgY3RybCAleFxuIiwKKwkJbGUzMl90b19jcHUgKGltbWFwLT5pbV9wY2kucGNpX2VzciksCisJCWxlMzJfdG9fY3B1IChpbW1hcC0+aW1fcGNpLnBjaV9lbXIpLAorCQlsZTMyX3RvX2NwdSAoaW1tYXAtPmltX3BjaS5wY2lfZWNyKSk7CisJcHJpbnRmICgiICAgICBlcnJvciBhZGRyZXNzICV4IGVycm9yIGRhdGEgJXggY3RybCAleFxuIiwKKwkJbGUzMl90b19jcHUgKGltbWFwLT5pbV9wY2kucGNpX2VhY3IpLAorCQlsZTMyX3RvX2NwdSAoaW1tYXAtPmltX3BjaS5wY2lfZWRjciksCisJCWxlMzJfdG9fY3B1IChpbW1hcC0+aW1fcGNpLnBjaV9lY2NyKSk7CisqLworfQorI2VuZGlmCisKK3ZvaWQKK01hY2hpbmVDaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZpeHVwOworCisJLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgorCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCisJICogdGhlIFBDSSBleGNlcHRpb24gaGFuZGxlci4KKwkgKi8KKyNpZmRlZiBDT05GSUdfUENJCisjaWYgMAorCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwICA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworI2lmZGVmIERFQlVHCisJZHVtcF9wY2koKTsKKyNlbmRpZgorCS8qIGNsZWFyIHRoZSBlcnJvciBpbiB0aGUgZXJyb3Igc3RhdHVzIHJlZ2lzdGVyICovCisJaWYoaW1tYXAtPmltX3BjaS5wY2lfZXNyICYgY3B1X3RvX2xlMzIoUENJX0VSUk9SX1BDSV9OT19SU1ApKSB7CisJCWltbWFwLT5pbV9wY2kucGNpX2VzciA9IGNwdV90b19sZTMyKFBDSV9FUlJPUl9QQ0lfTk9fUlNQKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZShyZWdzLT5uaXApKSAhPSAwKSB7CisJCXJlZ3MtPm5pcCA9IGZpeHVwOworCQlyZXR1cm47CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXB1dHMgKCJNYWNoaW5lIGNoZWNrIGluIGtlcm5lbCBtb2RlLlxuIgorCQkiQ2F1c2VkIGJ5IChmcm9tIG1zcik6ICIpOworCXByaW50ZigicmVncyAlcCAiLHJlZ3MpOworCXN3aXRjaCggcmVncy0+bXNyICYgMHgwMDBGMDAwMCkgeworCWNhc2UgKDB4ODAwMDAwMDA+PjEyKToKKwkJcHV0cyAoIk1hY2hpbmUgY2hlY2sgc2lnbmFsIC0gcHJvYmFibHkgZHVlIHRvIG1tIGZhdWx0XG4iCisJCQkid2l0aCBtbXUgb2ZmXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTMpOgorCQlwdXRzICgiVHJhbnNmZXIgZXJyb3IgYWNrIHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjE0KToKKwkJcHV0cyAoIkRhdGEgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjE1KToKKwkJcHV0cyAoIkFkZHJlc3MgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB1dHMgKCJVbmtub3duIHZhbHVlcyBpbiBtc3JcbiIpOworCX0KKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKyNpZmRlZiBDT05GSUdfUENJCisJZHVtcF9wY2koKTsKKyNlbmRpZgorCXBhbmljKCJtYWNoaW5lIGNoZWNrIik7Cit9CisKK3ZvaWQKK0FsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJBbGlnbm1lbnQgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQKK1Byb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJQcm9ncmFtIENoZWNrIEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMoIlNvZnR3YXJlIEVtdWxhdGlvbiBFeGNlcHRpb24iKTsKK30KKworCit2b2lkCitVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJcHJpbnRmKCJCYWQgdHJhcCBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4XG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CisJX2V4Y2VwdGlvbigwLCByZWdzKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCitleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZgorCit2b2lkCitEZWJ1Z0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOworCXNob3dfcmVncyhyZWdzKTsKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQorCWRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CisjZW5kaWYKK30KKworLyogUHJvYmUgYW4gYWRkcmVzcyBieSByZWFkaW5nLiAgSWYgbm90IHByZXNlbnQsIHJldHVybiAtMSwgb3RoZXJ3aXNlCisgKiByZXR1cm4gMC4KKyAqLworaW50CithZGRyX3Byb2JlKHVpbnQgKmFkZHIpCit7CisjaWYgMAorCWludAlyZXR2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCSIxOglsd3ogJTAsMCglMSlcbiIJCVwKKwkJIgllaWVpb1xuIgkJXAorCQkiCWxpICUwLDBcbiIJCVwKKwkJIjI6XG4iCQkJCVwKKwkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJXAorCQkiMzoJbGkgJTAsLTFcbiIJCVwKKwkJIgliIDJiXG4iCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIglcCisJCSIJLmFsaWduIDJcbiIJCVwKKwkJIgkubG9uZyAxYiwzYlxuIgkJXAorCQkiLnRleHQiCQkJCVwKKwkJOiAiPXIiIChyZXR2YWwpIDogInIiKGFkZHIpKTsKKworCXJldHVybiAocmV0dmFsKTsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3UtYm9vdC5sZHMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgzeHgvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc0YTEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKQl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKQl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgYXJjaC9wb3dlcnBjL2NwdS9tcGM4M3h4L3N0YXJ0Lm8JKC50ZXh0KQorICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgICAuID0gQUxJR04oMTYpOworICAgICooLmVoX2ZyYW1lKQorICAgICooU09SVF9CWV9BTElHTk1FTlQoU09SVF9CWV9OQU1FKC5yb2RhdGEqKSkpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwRkZGKSAmIDB4RkZGRkYwMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgKE5PTE9BRCkgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgICAuID0gQUxJR04oNCk7CisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KK0VOVFJZKF9zdGFydCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDY0ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L01ha2VmaWxlCkBAIC0wLDAgKzEsOTUgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMiwyMDAzIE1vdG9yb2xhIEluYy4KKyMgWGlhbmdodWEgWGlhbyxYLlhpYW9AbW90b3JvbGEuY29tCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk9IHN0YXJ0Lm8gcmVzZXR2ZWMubworU09CSlMtJChDT05GSUdfTVApCSs9IHJlbGVhc2UubworU09CSlMJPSAkKFNPQkpTLXkpCisKK0NPQkpTLSQoQ09ORklHX0NQTTIpCSs9IGNvbW1wcm9jLm8KKworIyBzdXBwb3J0cyBkZHIxCitDT0JKUy0kKENPTkZJR19NUEM4NTQwKSArPSBkZHItZ2VuMS5vCitDT0JKUy0kKENPTkZJR19NUEM4NTYwKSArPSBkZHItZ2VuMS5vCitDT0JKUy0kKENPTkZJR19NUEM4NTQxKSArPSBkZHItZ2VuMS5vCitDT0JKUy0kKENPTkZJR19NUEM4NTU1KSArPSBkZHItZ2VuMS5vCisKKyMgc3VwcG9ydHMgZGRyMS8yCitDT0JKUy0kKENPTkZJR19NUEM4NTQ4KSArPSBkZHItZ2VuMi5vCitDT0JKUy0kKENPTkZJR19NUEM4NTY4KSArPSBkZHItZ2VuMi5vCitDT0JKUy0kKENPTkZJR19NUEM4NTQ0KSArPSBkZHItZ2VuMi5vCisKKyMgc3VwcG9ydHMgZGRyMS8yLzMKK0NPQkpTLSQoQ09ORklHX01QQzg1NzIpICs9IGRkci1nZW4zLm8KK0NPQkpTLSQoQ09ORklHX01QQzg1MzYpICs9IGRkci1nZW4zLm8KK0NPQkpTLSQoQ09ORklHX01QQzg1NjkpCSs9IGRkci1nZW4zLm8KK0NPQkpTLSQoQ09ORklHX1AxMDExKQkrPSBkZHItZ2VuMy5vCitDT0JKUy0kKENPTkZJR19QMTAxMikJKz0gZGRyLWdlbjMubworQ09CSlMtJChDT05GSUdfUDEwMTMpCSs9IGRkci1nZW4zLm8KK0NPQkpTLSQoQ09ORklHX1AxMDIwKQkrPSBkZHItZ2VuMy5vCitDT0JKUy0kKENPTkZJR19QMTAyMSkJKz0gZGRyLWdlbjMubworQ09CSlMtJChDT05GSUdfUDEwMjIpCSs9IGRkci1nZW4zLm8KK0NPQkpTLSQoQ09ORklHX1AyMDEwKQkrPSBkZHItZ2VuMy5vCitDT0JKUy0kKENPTkZJR19QMjAyMCkJKz0gZGRyLWdlbjMubworQ09CSlMtJChDT05GSUdfUFBDX1A0MDgwKQkrPSBkZHItZ2VuMy5vCisKK0NPQkpTLSQoQ09ORklHX0NQTTIpCSs9IGV0aGVyX2ZjYy5vCitDT0JKUy0kKENPTkZJR19PRl9MSUJGRFQpICs9IGZkdC5vCitDT0JKUy0kKENPTkZJR19NUCkJKz0gbXAubworQ09CSlMtJChDT05GSUdfTVBDODUzNikgKz0gbXBjODUzNl9zZXJkZXMubworQ09CSlMtJChDT05GSUdfUENJKQkrPSBwY2kubworQ09CSlMtJChDT05GSUdfUUUpCSs9IHFlX2lvLm8KK0NPQkpTLSQoQ09ORklHX0NQTTIpCSs9IHNlcmlhbF9zY2MubworCitDT0JKUwk9ICQoQ09CSlMteSkKK0NPQkpTCSs9IGNwdS5vCitDT0JKUwkrPSBjcHVfaW5pdC5vCitDT0JKUwkrPSBjcHVfaW5pdF9lYXJseS5vCitDT0JKUwkrPSBpbnRlcnJ1cHRzLm8KK0NPQkpTCSs9IHNwZWVkLm8KK0NPQkpTCSs9IHRsYi5vCitDT0JKUwkrPSB0cmFwcy5vCisKK1NSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQorU1RBUlQJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU1RBUlQpKQorCithbGw6CSQob2JqKS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2NvbW1wcm9jLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvY29tbXByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGZkMWNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2NvbW1wcm9jLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBBZGFwdGVkIGZvciBNb3Rvcm9sYSBNUEM4NTYwIGNoaXBzCisgKiBYaWFuZ2h1YSBYaWFvIDx4LnhpYW9AbW90b3JvbGEuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiAiYXJjaC9wb3dlcnBjLzgyNjBfaW8vY29tbXByb2MuYyIgLSBoZXJlIGlzIGl0J3MKKyAqIGNvcHlyaWdodCBub3RpY2U6CisgKgorICogR2VuZXJhbCBQdXJwb3NlIGZ1bmN0aW9ucyBmb3IgdGhlIGdsb2JhbCBtYW5hZ2VtZW50IG9mIHRoZQorICogODIyMCBDb21tdW5pY2F0aW9uIFByb2Nlc3NvciBNb2R1bGUuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMgKHNvdXJjZUBtdmlzdGEuY29tKQorICoJMi4zLjk5IFVwZGF0ZXMKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNb3Rvcm9sYSxJbmMuCisgKgorICogSW4gYWRkaXRpb24gdG8gdGhlIGluZGl2aWR1YWwgY29udHJvbCBvZiB0aGUgY29tbXVuaWNhdGlvbgorICogY2hhbm5lbHMsIHRoZXJlIGFyZSBhIGZldyBmdW5jdGlvbnMgdGhhdCBnbG9iYWxseSBhZmZlY3QgdGhlCisgKiBjb21tdW5pY2F0aW9uIHByb2Nlc3Nvci4KKyAqCisgKiBCdWZmZXIgZGVzY3JpcHRvcnMgbXVzdCBiZSBhbGxvY2F0ZWQgZnJvbSB0aGUgZHVhbCBwb3J0ZWQgbWVtb3J5CisgKiBzcGFjZS4gIFRoZSBhbGxvY2F0b3IgZm9yIHRoYXQgaXMgaGVyZS4gIFdoZW4gdGhlIGNvbW11bmljYXRpb24KKyAqIHByb2Nlc3MgaXMgcmVzZXQsIHdlIHJlY2xhaW0gdGhlIG1lbW9yeSBhdmFpbGFibGUuICBUaGVyZSBpcworICogY3VycmVudGx5IG5vIGRlYWxsb2NhdG9yIGZvciB0aGlzIG1lbW9yeS4KKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9jcG1fODV4eC5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworLyoKKyAqIGJlY2F1c2Ugd2UgaGF2ZSBzdGFjayBhbmQgaW5pdCBkYXRhIGluIGR1YWwgcG9ydCByYW0KKyAqIHdlIG11c3QgcmVkdWNlIHRoZSBzaXplCisgKi8KKyN1bmRlZglDUE1fREFUQU9OTFlfU0laRQorI2RlZmluZSBDUE1fREFUQU9OTFlfU0laRQkoKHVpbnQpKDggKiAxMDI0KSAtIENQTV9EQVRBT05MWV9CQVNFKQorCit2b2lkCittODU2MF9jcG1fcmVzZXQodm9pZCkKK3sKKwl2b2xhdGlsZSBjY3NyX2NwbV90ICpjcG0gPSAoY2Nzcl9jcG1fdCAqKUNPTkZJR19TWVNfTVBDODV4eF9DUE1fQUREUjsKKwl2b2xhdGlsZSB1bG9uZyBjb3VudDsKKworCWdkID0gKGdkX3QgKikgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfR0JMX0RBVEFfT0ZGU0VUKTsKKworCS8qIFJlY2xhaW0gdGhlIERQIG1lbW9yeSBmb3Igb3VyIHVzZS4KKwkqLworCWdkLT5kcF9hbGxvY19iYXNlID0gQ1BNX0RBVEFPTkxZX0JBU0U7CisJZ2QtPmRwX2FsbG9jX3RvcCA9IGdkLT5kcF9hbGxvY19iYXNlICsgQ1BNX0RBVEFPTkxZX1NJWkU7CisKKwkvKgorCSAqIFJlc2V0IENQTQorCSAqLworCWNwbS0+aW1fY3BtX2NwLmNwY3IgPSBDUE1fQ1JfUlNUOworCWNvdW50ID0gMDsKKwlkbyB7CQkJLyogU3BpbiB1bnRpbCBjb21tYW5kIHByb2Nlc3NlZAkJKi8KKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCX0gd2hpbGUgKChjcG0tPmltX2NwbV9jcC5jcGNyICYgQ1BNX0NSX0ZMRykgJiYgKytjb3VudCA8IDEwMDAwMDApOworfQorCisvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSBmcm9tIHRoZSBkdWFsIHBvcnRlZCByYW0uCisgKiBUbyBoZWxwIHByb3RvY29scyB3aXRoIG9iamVjdCBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLCB3ZSBkbyB0aGF0CisgKiBpZiB0aGV5IGFzay4KKyAqLwordWludAorbTg1NjBfY3BtX2RwYWxsb2ModWludCBzaXplLCB1aW50IGFsaWduKQoreworCXZvbGF0aWxlIGNjc3JfY3BtX3QgKmNwbSA9IChjY3NyX2NwbV90ICopQ09ORklHX1NZU19NUEM4NXh4X0NQTV9BRERSOworCXVpbnQJcmV0bG9jOworCXVpbnQJYWxpZ25fbWFzaywgb2ZmOworCXVpbnQJc2F2ZWJhc2U7CisKKwlhbGlnbl9tYXNrID0gYWxpZ24gLSAxOworCXNhdmViYXNlID0gZ2QtPmRwX2FsbG9jX2Jhc2U7CisKKwlpZiAoKG9mZiA9IChnZC0+ZHBfYWxsb2NfYmFzZSAmIGFsaWduX21hc2spKSAhPSAwKQorCQlnZC0+ZHBfYWxsb2NfYmFzZSArPSAoYWxpZ24gLSBvZmYpOworCisJaWYgKChvZmYgPSBzaXplICYgYWxpZ25fbWFzaykgIT0gMCkKKwkJc2l6ZSArPSBhbGlnbiAtIG9mZjsKKworCWlmICgoZ2QtPmRwX2FsbG9jX2Jhc2UgKyBzaXplKSA+PSBnZC0+ZHBfYWxsb2NfdG9wKSB7CisJCWdkLT5kcF9hbGxvY19iYXNlID0gc2F2ZWJhc2U7CisJCXBhbmljKCJtODU2MF9jcG1fZHBhbGxvYzogcmFuIG91dCBvZiBkdWFsIHBvcnQgcmFtISIpOworCX0KKworCXJldGxvYyA9IGdkLT5kcF9hbGxvY19iYXNlOworCWdkLT5kcF9hbGxvY19iYXNlICs9IHNpemU7CisKKwltZW1zZXQoKHZvaWQgKikmKGNwbS0+aW1fZHByYW1iYXNlW3JldGxvY10pLCAwLCBzaXplKTsKKworCXJldHVybihyZXRsb2MpOworfQorCisvKiBXZSBhbHNvIG93biBvbmUgcGFnZSBvZiBob3N0IGJ1ZmZlciBzcGFjZSBmb3IgdGhlIGFsbG9jYXRpb24gb2YKKyAqIFVBUlQgImZpZm9zIiBhbmQgdGhlIGxpa2UuCisgKi8KK3VpbnQKK204NTYwX2NwbV9ob3N0YWxsb2ModWludCBzaXplLCB1aW50IGFsaWduKQoreworCS8qIHRoZSBob3N0IG1pZ2h0IG5vdCBldmVuIGhhdmUgUkFNIHlldCAtIGp1c3QgdXNlIGR1YWwgcG9ydCBSQU0gKi8KKwlyZXR1cm4gKG04NTYwX2NwbV9kcGFsbG9jKHNpemUsIGFsaWduKSk7Cit9CisKKy8qIFNldCBhIGJhdWQgcmF0ZSBnZW5lcmF0b3IuICBUaGlzIG5lZWRzIGxvdHMgb2Ygd29yay4gIFRoZXJlIGFyZQorICogZWlnaHQgQlJHcywgd2hpY2ggY2FuIGJlIGNvbm5lY3RlZCB0byB0aGUgQ1BNIGNoYW5uZWxzIG9yIG91dHB1dAorICogYXMgY2xvY2tzLiAgVGhlIEJSR3MgYXJlIGluIHR3byBkaWZmZXJlbnQgYmxvY2sgb2YgaW50ZXJuYWwKKyAqIG1lbW9yeSBtYXBwZWQgc3BhY2UuCisgKiBUaGUgYmF1ZCByYXRlIGNsb2NrIGlzIHRoZSBzeXN0ZW0gY2xvY2sgZGl2aWRlZCBieSBzb21ldGhpbmcuCisgKiBJdCB3YXMgc2V0IHVwIGxvbmcgYWdvIGR1cmluZyB0aGUgaW5pdGlhbCBib290IHBoYXNlIGFuZCBpcworICogaXMgZ2l2ZW4gdG8gdXMuCisgKiBCYXVkIHJhdGUgY2xvY2tzIGFyZSB6ZXJvLWJhc2VkIGluIHRoZSBkcml2ZXIgY29kZSAoYXMgdGhhdCBtYXBzCisgKiB0byBwb3J0IG51bWJlcnMpLiAgRG9jdW1lbnRhdGlvbiB1c2VzIDEtYmFzZWQgbnVtYmVyaW5nLgorICovCisjZGVmaW5lIEJSR19JTlRfQ0xLCWdkLT5icmdfY2xrCisjZGVmaW5lIEJSR19VQVJUX0NMSwkoKEJSR19JTlRfQ0xLICsgMTUpIC8gMTYpCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBVQVJUUywgb3IgYW55dGhpbmcgZWxzZSB0aGF0IHVzZXMgYSAxNngKKyAqIG92ZXJzYW1wbGVkIGNsb2NrLgorICovCit2b2lkCittODU2MF9jcG1fc2V0YnJnKHVpbnQgYnJnLCB1aW50IHJhdGUpCit7CisJdm9sYXRpbGUgY2Nzcl9jcG1fdCAqY3BtID0gKGNjc3JfY3BtX3QgKilDT05GSUdfU1lTX01QQzg1eHhfQ1BNX0FERFI7CisJdm9sYXRpbGUgdWludAkqYnA7CisKKwkvKiBUaGlzIGlzIGdvb2QgZW5vdWdoIHRvIGdldCBTTUNzIHJ1bm5pbmcuLi4uLgorCSovCisJaWYgKGJyZyA8IDQpIHsKKwkJYnAgPSAodWludCAqKSYoY3BtLT5pbV9jcG1fYnJnMS5icmdjMSk7CisJfQorCWVsc2UgeworCQlicCA9ICh1aW50ICopJihjcG0tPmltX2NwbV9icmcyLmJyZ2M1KTsKKwkJYnJnIC09IDQ7CisJfQorCWJwICs9IGJyZzsKKwkqYnAgPSAoKCgoKEJSR19VQVJUX0NMSytyYXRlLTEpL3JhdGUpLTEpJjB4ZmZmKTw8MSl8Q1BNX0JSR19FTjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBoaWdoIHNwZWVkIHN5bmNocm9ub3VzIGJhdWQgcmF0ZQorICogY2xvY2tzLgorICovCit2b2lkCittODU2MF9jcG1fZmFzdGJyZyh1aW50IGJyZywgdWludCByYXRlLCBpbnQgZGl2MTYpCit7CisJdm9sYXRpbGUgY2Nzcl9jcG1fdCAqY3BtID0gKGNjc3JfY3BtX3QgKilDT05GSUdfU1lTX01QQzg1eHhfQ1BNX0FERFI7CisJdm9sYXRpbGUgdWludAkqYnA7CisKKwkvKiBUaGlzIGlzIGdvb2QgZW5vdWdoIHRvIGdldCBTTUNzIHJ1bm5pbmcuLi4uLgorCSovCisJaWYgKGJyZyA8IDQpIHsKKwkJYnAgPSAodWludCAqKSYoY3BtLT5pbV9jcG1fYnJnMS5icmdjMSk7CisJfQorCWVsc2UgeworCQlicCA9ICh1aW50ICopJihjcG0tPmltX2NwbV9icmcyLmJyZ2M1KTsKKwkJYnJnIC09IDQ7CisJfQorCWJwICs9IGJyZzsKKwkqYnAgPSAoKCgoKEJSR19JTlRfQ0xLK3JhdGUtMSkvcmF0ZSktMSkmMHhmZmYpPDwxKXxDUE1fQlJHX0VOOworCWlmIChkaXYxNikKKwkJKmJwIHw9IENQTV9CUkdfRElWMTY7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgYmF1ZCByYXRlIGdlbmVyYXRvcnMgdXNpbmcgYW4gZXh0ZXJuYWwKKyAqIGNsb2NrIHNvdXJjZSBhbmQgMTZ4IG92ZXJzYW1wbGluZy4KKyAqLworCit2b2lkCittODU2MF9jcG1fZXh0Y2JyZyh1aW50IGJyZywgdWludCByYXRlLCB1aW50IGV4dGNsaywgaW50IHBpbnNlbCkKK3sKKwl2b2xhdGlsZSBjY3NyX2NwbV90ICpjcG0gPSAoY2Nzcl9jcG1fdCAqKUNPTkZJR19TWVNfTVBDODV4eF9DUE1fQUREUjsKKwl2b2xhdGlsZSB1aW50CSpicDsKKworCWlmIChicmcgPCA0KSB7CisJCWJwID0gKHVpbnQgKikmKGNwbS0+aW1fY3BtX2JyZzEuYnJnYzEpOworCX0KKwllbHNlIHsKKwkJYnAgPSAodWludCAqKSYoY3BtLT5pbV9jcG1fYnJnMi5icmdjNSk7CisJCWJyZyAtPSA0OworCX0KKwlicCArPSBicmc7CisJKmJwID0gKCgoKCgoZXh0Y2xrLzE2KStyYXRlLTEpL3JhdGUpLTEpJjB4ZmZmKTw8MSl8Q1BNX0JSR19FTjsKKwlpZiAocGluc2VsID09IDApCisJCSpicCB8PSBDUE1fQlJHX0VYVENfQ0xLM185OworCWVsc2UKKwkJKmJwIHw9IENQTV9CUkdfRVhUQ19DTEs1XzE1OworfQorCisjaWZkZWYgQ09ORklHX1BPU1QKKwordm9pZCBwb3N0X3dvcmRfc3RvcmUgKHVsb25nIGEpCit7CisJdm9sYXRpbGUgdWxvbmcgKnNhdmVfYWRkciA9CisJCSh2b2xhdGlsZSB1bG9uZyAqKShDT05GSUdfU1lTX0lNTVIgKyBDUE1fUE9TVF9XT1JEX0FERFIpOworCisJKnNhdmVfYWRkciA9IGE7Cit9CisKK3Vsb25nIHBvc3Rfd29yZF9sb2FkICh2b2lkKQoreworCXZvbGF0aWxlIHVsb25nICpzYXZlX2FkZHIgPQorCQkodm9sYXRpbGUgdWxvbmcgKikoQ09ORklHX1NZU19JTU1SICsgQ1BNX1BPU1RfV09SRF9BRERSKTsKKworCXJldHVybiAqc2F2ZV9hZGRyOworfQorCisjZW5kaWYJLyogQ09ORklHX1BPU1QgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9jb25maWcubWsgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwN2Q5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyLDIwMDMgTW90b3JvbGEgSW5jLgorIyBYaWFuZ2h1YSBYaWFvLCBYLlhpYW9AbW90b3JvbGEuY29tCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1tZWFiaQorCitQTEFURk9STV9DUFBGTEFHUyArPSAtZmZpeGVkLXIyIC1XYSwtbWU1MDAgLW1zb2Z0LWZsb2F0IC1tbm8tc3RyaW5nCisKKyMgLW1zcGU9eWVzIGlzIG5lZWRlZCB0byBoYXZlIC1tbm8tc3BlIGFjY2VwdGVkIGJ5IGEgYnVnZ3kgR0NDOworIyBzZWUgIltQQVRDSCxyczYwMDBdIG1ha2UgLW1uby1zcGUgd29yayBhcyBleHBlY3RlZCIgb24KKyMgaHR0cDovL2djYy5nbnUub3JnL21sL2djYy1wYXRjaGVzLzIwMDgtMDQvbXNnMDAzMTEuaHRtbAorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tc3BlPXllcykKK1BMQVRGT1JNX0NQUEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbW5vLXNwZSkKKworIyBVc2UgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQm9hcmQgcG9ydCBjYW4gb3ZlcnJpZGUgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M2ZTAzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2NwdS5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDQsMjAwNy0yMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiAoQykgQ29weXJpZ2h0IDIwMDIsIDIwMDMgTW90b3JvbGEgSW5jLgorICogWGlhbmdodWEgWGlhbyAoWC5YaWFvQG1vdG9yb2xhLmNvbSkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGZzbF9lc2RoYy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworaW50IGNoZWNrY3B1ICh2b2lkKQoreworCXN5c19pbmZvX3Qgc3lzaW5mbzsKKwl1aW50IHB2ciwgc3ZyOworCXVpbnQgZmFtOworCXVpbnQgdmVyOworCXVpbnQgbWFqb3IsIG1pbm9yOworCXN0cnVjdCBjcHVfdHlwZSAqY3B1OworCWNoYXIgYnVmMVszMl0sIGJ1ZjJbMzJdOworI2lmZGVmIENPTkZJR19ERFJfQ0xLX0ZSRVEKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfR1VUU19BRERSKTsKKyNpZmRlZiBDT05GSUdfRlNMX0NPUkVORVQKKwl1MzIgZGRyX3N5bmMgPSAoKGd1ci0+cmN3c3JbNV0pICYgRlNMX0NPUkVORVRfUkNXU1I1X0REUl9TWU5DKQorCQk+PiBGU0xfQ09SRU5FVF9SQ1dTUjVfRERSX1NZTkNfU0hJRlQ7CisjZWxzZQorCXUzMiBkZHJfcmF0aW8gPSAoKGd1ci0+cG9ycGxsc3IpICYgTVBDODV4eF9QT1JQTExTUl9ERFJfUkFUSU8pCisJCT4+IE1QQzg1eHhfUE9SUExMU1JfRERSX1JBVElPX1NISUZUOworI2VuZGlmCisjZWxzZQorI2lmZGVmIENPTkZJR19GU0xfQ09SRU5FVAorCXUzMiBkZHJfc3luYyA9IDA7CisjZWxzZQorCXUzMiBkZHJfcmF0aW8gPSAwOworI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0REUl9DTEtfRlJFUSAqLworCWludCBpOworCisJc3ZyID0gZ2V0X3N2cigpOworCW1ham9yID0gU1ZSX01BSihzdnIpOworI2lmZGVmIENPTkZJR19NUEM4NTM2CisJbWFqb3IgJj0gMHg3OyAvKiB0aGUgbXNiIG9mIHRoaXMgbmliYmxlIGlzIGEgbWZnIGNvZGUgKi8KKyNlbmRpZgorCW1pbm9yID0gU1ZSX01JTihzdnIpOworCisJaWYgKGNwdV9udW1jb3JlcygpID4gMSkgeworI2lmbmRlZiBDT05GSUdfTVAKKwkJcHV0cygiVW5pY29yZSBzb2Z0d2FyZSBvbiBtdWx0aXByb2Nlc3NvciBzeXN0ZW0hIVxuIgorCQkgICAgICJUbyBlbmFibGUgbXV0bHRpY29yZSBidWlsZCBkZWZpbmUgQ09ORklHX01QXG4iKTsKKyNlbmRpZgorCQl2b2xhdGlsZSBjY3NyX3BpY190ICpwaWMgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfUElDX0FERFIpOworCQlwcmludGYoIkNQVSVkOiAgIiwgcGljLT53aG9hbWkpOworCX0gZWxzZSB7CisJCXB1dHMoIkNQVTogICAiKTsKKwl9CisKKwljcHUgPSBnZC0+Y3B1OworCisJcHV0cyhjcHUtPm5hbWUpOworCWlmIChJU19FX1BST0NFU1NPUihzdnIpKQorCQlwdXRzKCJFIik7CisKKwlwcmludGYoIiwgVmVyc2lvbjogJWQuJWQsICgweCUwOHgpXG4iLCBtYWpvciwgbWlub3IsIHN2cik7CisKKwlwdnIgPSBnZXRfcHZyKCk7CisJZmFtID0gUFZSX0ZBTShwdnIpOworCXZlciA9IFBWUl9WRVIocHZyKTsKKwltYWpvciA9IFBWUl9NQUoocHZyKTsKKwltaW5vciA9IFBWUl9NSU4ocHZyKTsKKworCXByaW50ZigiQ29yZTogICIpOworCXN3aXRjaCAoZmFtKSB7CisJY2FzZSBQVlJfRkFNKFBWUl84NXh4KToKKwkgICAgcHV0cygiRTUwMCIpOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBwdXRzKCJVbmtub3duIik7CisJICAgIGJyZWFrOworCX0KKworCWlmIChQVlJfTUVNKHB2cikgPT0gMHgwMykKKwkJcHV0cygiTUMiKTsKKworCXByaW50ZigiLCBWZXJzaW9uOiAlZC4lZCwgKDB4JTA4eClcbiIsIG1ham9yLCBtaW5vciwgcHZyKTsKKworCWdldF9zeXNfaW5mbygmc3lzaW5mbyk7CisKKwlwdXRzKCJDbG9jayBDb25maWd1cmF0aW9uOiIpOworCWZvciAoaSA9IDA7IGkgPCBjcHVfbnVtY29yZXMoKTsgaSsrKSB7CisJCWlmICghKGkgJiAzKSkKKwkJCXByaW50ZiAoIlxuICAgICAgICIpOworCQlwcmludGYoIkNQVSVkOiUtNHMgTUh6LCAiLAorCQkJCWksc3RybWh6KGJ1ZjEsIHN5c2luZm8uZnJlcVByb2Nlc3NvcltpXSkpOworCX0KKwlwcmludGYoIlxuICAgICAgIENDQjolLTRzIE1IeixcbiIsIHN0cm1oeihidWYxLCBzeXNpbmZvLmZyZXFTeXN0ZW1CdXMpKTsKKworI2lmZGVmIENPTkZJR19GU0xfQ09SRU5FVAorCWlmIChkZHJfc3luYyA9PSAxKSB7CisJCXByaW50ZigiICAgICAgIEREUjolLTRzIE1IeiAoJXMgTVQvcyBkYXRhIHJhdGUpICIKKwkJCSIoU3luY2hyb25vdXMpLCAiLAorCQkJc3RybWh6KGJ1ZjEsIHN5c2luZm8uZnJlcUREUkJ1cy8yKSwKKwkJCXN0cm1oeihidWYyLCBzeXNpbmZvLmZyZXFERFJCdXMpKTsKKwl9IGVsc2UgeworCQlwcmludGYoIiAgICAgICBERFI6JS00cyBNSHogKCVzIE1UL3MgZGF0YSByYXRlKSAiCisJCQkiKEFzeW5jaHJvbm91cyksICIsCisJCQlzdHJtaHooYnVmMSwgc3lzaW5mby5mcmVxRERSQnVzLzIpLAorCQkJc3RybWh6KGJ1ZjIsIHN5c2luZm8uZnJlcUREUkJ1cykpOworCX0KKyNlbHNlCisJc3dpdGNoIChkZHJfcmF0aW8pIHsKKwljYXNlIDB4MDoKKwkJcHJpbnRmKCIgICAgICAgRERSOiUtNHMgTUh6ICglcyBNVC9zIGRhdGEgcmF0ZSksICIsCisJCQlzdHJtaHooYnVmMSwgc3lzaW5mby5mcmVxRERSQnVzLzIpLAorCQkJc3RybWh6KGJ1ZjIsIHN5c2luZm8uZnJlcUREUkJ1cykpOworCQlicmVhazsKKwljYXNlIDB4NzoKKwkJcHJpbnRmKCIgICAgICAgRERSOiUtNHMgTUh6ICglcyBNVC9zIGRhdGEgcmF0ZSkgIgorCQkJIihTeW5jaHJvbm91cyksICIsCisJCQlzdHJtaHooYnVmMSwgc3lzaW5mby5mcmVxRERSQnVzLzIpLAorCQkJc3RybWh6KGJ1ZjIsIHN5c2luZm8uZnJlcUREUkJ1cykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiAgICAgICBERFI6JS00cyBNSHogKCVzIE1UL3MgZGF0YSByYXRlKSAiCisJCQkiKEFzeW5jaHJvbm91cyksICIsCisJCQlzdHJtaHooYnVmMSwgc3lzaW5mby5mcmVxRERSQnVzLzIpLAorCQkJc3RybWh6KGJ1ZjIsIHN5c2luZm8uZnJlcUREUkJ1cykpOworCQlicmVhazsKKwl9CisjZW5kaWYKKworCWlmIChzeXNpbmZvLmZyZXFMb2NhbEJ1cyA+IExDUlJfQ0xLRElWKSB7CisJCXByaW50ZigiTEJDOiUtNHMgTUh6XG4iLCBzdHJtaHooYnVmMSwgc3lzaW5mby5mcmVxTG9jYWxCdXMpKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkxCQzogdW5rbm93biAoTENSUltDTEtESVZdID0gMHglMDJseClcbiIsCisJCSAgICAgICBzeXNpbmZvLmZyZXFMb2NhbEJ1cyk7CisJfQorCisjaWZkZWYgQ09ORklHX0NQTTIKKwlwcmludGYoIkNQTTogICAlcyBNSHpcbiIsIHN0cm1oeihidWYxLCBzeXNpbmZvLmZyZXFTeXN0ZW1CdXMpKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1FFCisJcHJpbnRmKCIgICAgICAgUUU6JS00cyBNSHpcbiIsIHN0cm1oeihidWYxLCBzeXNpbmZvLmZyZXFRRSkpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1lTX0RQQUFfRk1BTgorCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfU1lTX05VTV9GTUFOOyBpKyspIHsKKwkJcHJpbnRmKCIgICAgICAgRk1BTiVkOiAlcyBNSHpcbiIsIGksCisJCQlzdHJtaHooYnVmMSwgc3lzaW5mby5mcmVxRk1hbltpXSkpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NZU19EUEFBX1BNRQorCXByaW50ZigiICAgICAgIFBNRTogICAlcyBNSHpcbiIsIHN0cm1oeihidWYxLCBzeXNpbmZvLmZyZXFQTUUpKTsKKyNlbmRpZgorCisJcHV0cygiTDE6ICAgIEQtY2FjaGUgMzIga0IgZW5hYmxlZFxuICAgICAgIEktY2FjaGUgMzIga0IgZW5hYmxlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBkb19yZXNldCAoY21kX3RibF90ICpjbWR0cCwgYmRfdCAqYmQsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworLyogRXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgZ2VuZXJhdGlvbiBvZiBQUTMgcGFydHMgaGFzIFJTVENSICovCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODU0MCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODU0MSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX01QQzg1NTUpIHx8IGRlZmluZWQoQ09ORklHX01QQzg1NjApCisJdW5zaWduZWQgbG9uZyB2YWwsIG1zcjsKKworCS8qCisJICogSW5pdGlhdGUgaGFyZCByZXNldCBpbiBkZWJ1ZyBjb250cm9sIHJlZ2lzdGVyIERCQ1IwCisJICogTWFrZSBzdXJlIE1TUltERV0gPSAxLiAgVGhpcyBvbmx5IHJlc2V0cyB0aGUgY29yZS4KKwkgKi8KKwltc3IgPSBtZm1zciAoKTsKKwltc3IgfD0gTVNSX0RFOworCW10bXNyIChtc3IpOworCisJdmFsID0gbWZzcHIoREJDUjApOworCXZhbCB8PSAweDcwMDAwMDAwOworCW10c3ByKERCQ1IwLHZhbCk7CisjZWxzZQorCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICh2b2lkICopKENPTkZJR19TWVNfTVBDODV4eF9HVVRTX0FERFIpOworCW91dF9iZTMyKCZndXItPnJzdGNyLCAweDIpOwkvKiBIUkVTRVRfUkVRICovCisJdWRlbGF5KDEwMCk7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCisKKy8qCisgKiBHZXQgdGltZWJhc2UgY2xvY2sgZnJlcXVlbmN5CisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RiY2xrICh2b2lkKQoreworI2lmZGVmIENPTkZJR19GU0xfQ09SRU5FVAorCXJldHVybiAoZ2QtPmJ1c19jbGsgKyA4KSAvIDE2OworI2Vsc2UKKwlyZXR1cm4gKGdkLT5idXNfY2xrICsgNFVMKS84VUw7CisjZW5kaWYKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpCit2b2lkCit3YXRjaGRvZ19yZXNldCh2b2lkKQoreworCWludCByZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKwlyZXNldF84NXh4X3dhdGNoZG9nKCk7CisJaWYgKHJlX2VuYWJsZSkgZW5hYmxlX2ludGVycnVwdHMoKTsKK30KKwordm9pZAorcmVzZXRfODV4eF93YXRjaGRvZyh2b2lkKQoreworCS8qCisJICogQ2xlYXIgVFNSKFdJUykgYml0IGJ5IHdyaXRpbmcgMQorCSAqLworCXVuc2lnbmVkIGxvbmcgdmFsOworCXZhbCA9IG1mc3ByKFNQUk5fVFNSKTsKKwl2YWwgfD0gVFNSX1dJUzsKKwltdHNwcihTUFJOX1RTUiwgdmFsKTsKK30KKyNlbmRpZgkvKiBDT05GSUdfV0FUQ0hET0cgKi8KKworLyoKKyAqIENvbmZpZ3VyZXMgYSBVUE0uIFRoZSBmdW5jdGlvbiByZXF1aXJlcyB0aGUgcmVzcGVjdGl2ZSBNeE1SIHRvIGJlIHNldAorICogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gInNpemUiIGlzIHRoZSBudW1iZXIgb3IgZW50cmllcywgbm90IGEgc2l6ZW9mLgorICovCit2b2lkIHVwbWNvbmZpZyAodWludCB1cG0sIHVpbnQgKiB0YWJsZSwgdWludCBzaXplKQoreworCWludCBpLCBtZHIsIG1hZCwgb2xkX21hZCA9IDA7CisJdm9sYXRpbGUgdTMyICpteG1yOworCXZvbGF0aWxlIGNjc3JfbGJjX3QgKmxiYyA9ICh2b2lkICopKENPTkZJR19TWVNfTVBDODV4eF9MQkNfQUREUik7CisJdm9sYXRpbGUgdTMyICpicnAsKm9ycDsKKwl2b2xhdGlsZSB1OCogZHVtbXkgPSBOVUxMOworCWludCB1cG1tYXNrOworCisJc3dpdGNoICh1cG0pIHsKKwljYXNlIFVQTUE6CisJCW14bXIgPSAmbGJjLT5tYW1yOworCQl1cG1tYXNrID0gQlJfTVNfVVBNQTsKKwkJYnJlYWs7CisJY2FzZSBVUE1COgorCQlteG1yID0gJmxiYy0+bWJtcjsKKwkJdXBtbWFzayA9IEJSX01TX1VQTUI7CisJCWJyZWFrOworCWNhc2UgVVBNQzoKKwkJbXhtciA9ICZsYmMtPm1jbXI7CisJCXVwbW1hc2sgPSBCUl9NU19VUE1DOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiVzOiBCYWQgVVBNIGluZGV4ICVkIHRvIGNvbmZpZ3VyZVxuIiwgX19GVU5DVElPTl9fLCB1cG0pOworCQloYW5nKCk7CisJfQorCisJLyogRmluZCB0aGUgYWRkcmVzcyBmb3IgdGhlIGR1bW15IHdyaXRlIHRyYW5zYWN0aW9uICovCisJZm9yIChicnAgPSAmbGJjLT5icjAsIG9ycCA9ICZsYmMtPm9yMCwgaSA9IDA7IGkgPCA4OworCQkgaSsrLCBicnAgKz0gMiwgb3JwICs9IDIpIHsKKworCQkvKiBMb29rIGZvciBhIHZhbGlkIEJSIHdpdGggc2VsZWN0ZWQgVVBNICovCisJCWlmICgoaW5fYmUzMihicnApICYgKEJSX1YgfCBCUl9NU0VMKSkgPT0gKEJSX1YgfCB1cG1tYXNrKSkgeworCQkJZHVtbXkgPSAodm9sYXRpbGUgdTgqKShpbl9iZTMyKGJycCkgJiBCUl9CQSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IDgpIHsKKwkJcHJpbnRmKCJFcnJvcjogJXMoKSBjb3VsZCBub3QgZmluZCBtYXRjaGluZyBCUlxuIiwgX19GVU5DVElPTl9fKTsKKwkJaGFuZygpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJLyogMSAqLworCQlvdXRfYmUzMihteG1yLCAgKGluX2JlMzIobXhtcikgJiAweDRmZmZmZmMwKSB8IE14TVJfT1BfV0FSUiB8IGkpOworCQkvKiAyICovCisJCW91dF9iZTMyKCZsYmMtPm1kciwgdGFibGVbaV0pOworCQkvKiAzICovCisJCW1kciA9IGluX2JlMzIoJmxiYy0+bWRyKTsKKwkJLyogNCAqLworCQkqKHZvbGF0aWxlIHU4ICopZHVtbXkgPSAwOworCQkvKiA1ICovCisJCWRvIHsKKwkJCW1hZCA9IGluX2JlMzIobXhtcikgJiBNeE1SX01BRF9NU0s7CisJCX0gd2hpbGUgKG1hZCA8PSBvbGRfbWFkICYmICEoIW1hZCAmJiBpID09IChzaXplLTEpKSk7CisJCW9sZF9tYWQgPSBtYWQ7CisJfQorCW91dF9iZTMyKG14bXIsIChpbl9iZTMyKG14bXIpICYgMHg0ZmZmZmZjMCkgfCBNeE1SX09QX05PUk0pOworfQorCisvKgorICogSW5pdGlhbGl6ZXMgb24tY2hpcCBNTUMgY29udHJvbGxlcnMuCisgKiB0byBvdmVycmlkZSwgaW1wbGVtZW50IGJvYXJkX21tY19pbml0KCkKKyAqLworaW50IGNwdV9tbWNfaW5pdChiZF90ICpiaXMpCit7CisjaWZkZWYgQ09ORklHX0ZTTF9FU0RIQworCXJldHVybiBmc2xfZXNkaGNfbW1jX2luaXQoYmlzKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9jcHVfaW5pdC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2NwdV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxMjZkMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9jcHVfaW5pdC5jCkBAIC0wLDAgKzEsNDA1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDctMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMyBNb3Rvcm9sYSBJbmMuCisgKiBNb2RpZmllZCBieSBYaWFuZ2h1YSBYaWFvLCBYLlhpYW9AbW90b3JvbGEuY29tCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxpb3BvcnRzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9mc2xfbGF3Lmg+CisjaW5jbHVkZSAibXAuaCIKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZmRlZiBDT05GSUdfTVBDODUzNgorZXh0ZXJuIHZvaWQgZnNsX3NlcmRlc19pbml0KHZvaWQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUUUKK2V4dGVybiBxZV9pb3BfY29uZl90IHFlX2lvcF9jb25mX3RhYltdOworZXh0ZXJuIHZvaWQgcWVfY29uZmlnX2lvcGluKHU4IHBvcnQsIHU4IHBpbiwgaW50IGRpciwKKwkJCQlpbnQgb3Blbl9kcmFpbiwgaW50IGFzc2lnbik7CitleHRlcm4gdm9pZCBxZV9pbml0KHVpbnQgcWVfYmFzZSk7CitleHRlcm4gdm9pZCBxZV9yZXNldCh2b2lkKTsKKworc3RhdGljIHZvaWQgY29uZmlnX3FlX2lvcG9ydHModm9pZCkKK3sKKwl1OCAgICAgIHBvcnQsIHBpbjsKKwlpbnQgICAgIGRpciwgb3Blbl9kcmFpbiwgYXNzaWduOworCWludCAgICAgaTsKKworCWZvciAoaSA9IDA7IHFlX2lvcF9jb25mX3RhYltpXS5hc3NpZ24gIT0gUUVfSU9QX1RBQl9FTkQ7IGkrKykgeworCQlwb3J0CQk9IHFlX2lvcF9jb25mX3RhYltpXS5wb3J0OworCQlwaW4JCT0gcWVfaW9wX2NvbmZfdGFiW2ldLnBpbjsKKwkJZGlyCQk9IHFlX2lvcF9jb25mX3RhYltpXS5kaXI7CisJCW9wZW5fZHJhaW4JPSBxZV9pb3BfY29uZl90YWJbaV0ub3Blbl9kcmFpbjsKKwkJYXNzaWduCQk9IHFlX2lvcF9jb25mX3RhYltpXS5hc3NpZ247CisJCXFlX2NvbmZpZ19pb3Bpbihwb3J0LCBwaW4sIGRpciwgb3Blbl9kcmFpbiwgYXNzaWduKTsKKwl9Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DUE0yCit2b2lkIGNvbmZpZ184NTYwX2lvcG9ydHMgKHZvbGF0aWxlIGNjc3JfY3BtX3QgKiBjcG0pCit7CisJaW50IHBvcnRudW07CisKKwlmb3IgKHBvcnRudW0gPSAwOyBwb3J0bnVtIDwgNDsgcG9ydG51bSsrKSB7CisJCXVpbnQgcG1zayA9IDAsCisJCSAgICAgcHBhciA9IDAsCisJCSAgICAgcHNvciA9IDAsCisJCSAgICAgcGRpciA9IDAsCisJCSAgICAgcG9kciA9IDAsCisJCSAgICAgcGRhdCA9IDA7CisJCWlvcF9jb25mX3QgKmlvcGMgPSAoaW9wX2NvbmZfdCAqKSAmIGlvcF9jb25mX3RhYltwb3J0bnVtXVswXTsKKwkJaW9wX2NvbmZfdCAqZWlvcGMgPSBpb3BjICsgMzI7CisJCXVpbnQgbXNrID0gMTsKKworCQkvKgorCQkgKiBOT1RFOgorCQkgKiBpbmRleCAwIHJlZmVycyB0byBwaW4gMzEsCisJCSAqIGluZGV4IDMxIHJlZmVycyB0byBwaW4gMAorCQkgKi8KKwkJd2hpbGUgKGlvcGMgPCBlaW9wYykgeworCQkJaWYgKGlvcGMtPmNvbmYpIHsKKwkJCQlwbXNrIHw9IG1zazsKKwkJCQlpZiAoaW9wYy0+cHBhcikKKwkJCQkJcHBhciB8PSBtc2s7CisJCQkJaWYgKGlvcGMtPnBzb3IpCisJCQkJCXBzb3IgfD0gbXNrOworCQkJCWlmIChpb3BjLT5wZGlyKQorCQkJCQlwZGlyIHw9IG1zazsKKwkJCQlpZiAoaW9wYy0+cG9kcikKKwkJCQkJcG9kciB8PSBtc2s7CisJCQkJaWYgKGlvcGMtPnBkYXQpCisJCQkJCXBkYXQgfD0gbXNrOworCQkJfQorCisJCQltc2sgPDw9IDE7CisJCQlpb3BjKys7CisJCX0KKworCQlpZiAocG1zayAhPSAwKSB7CisJCQl2b2xhdGlsZSBpb3BvcnRfdCAqaW9wID0gaW9wb3J0X2FkZHIgKGNwbSwgcG9ydG51bSk7CisJCQl1aW50IHRwbXNrID0gfnBtc2s7CisKKwkJCS8qCisJCQkgKiB0aGUgKHNvbWV3aGF0IGNvbmZ1c2VkKSBwYXJhZ3JhcGggYXQgdGhlCisJCQkgKiBib3R0b20gb2YgcGFnZSAzNS01IHdhcm5zIHRoYXQgdGhlcmUgbWlnaHQKKwkJCSAqIGJlICJ1bmtub3duIGJlaGF2aW91ciIgd2hlbiBwcm9ncmFtbWluZworCQkJICogUFNPUnggYW5kIFBESVJ4LCBpZiBQUEFSeCA9IDEsIHNvIEkKKwkJCSAqIGRlY2lkZWQgdGhpcyBtZWFudCBJIGhhZCB0byBkaXNhYmxlIHRoZQorCQkJICogZGVkaWNhdGVkIGZ1bmN0aW9uIGZpcnN0LCBhbmQgZW5hYmxlIGl0CisJCQkgKiBsYXN0LgorCQkJICovCisJCQlpb3AtPnBwYXIgJj0gdHBtc2s7CisJCQlpb3AtPnBzb3IgPSAoaW9wLT5wc29yICYgdHBtc2spIHwgcHNvcjsKKwkJCWlvcC0+cG9kciA9IChpb3AtPnBvZHIgJiB0cG1zaykgfCBwb2RyOworCQkJaW9wLT5wZGF0ID0gKGlvcC0+cGRhdCAmIHRwbXNrKSB8IHBkYXQ7CisJCQlpb3AtPnBkaXIgPSAoaW9wLT5wZGlyICYgdHBtc2spIHwgcGRpcjsKKwkJCWlvcC0+cHBhciB8PSBwcGFyOworCQl9CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBCcmVhdGhlIHNvbWUgbGlmZSBpbnRvIHRoZSBDUFUuLi4KKyAqCisgKiBTZXQgdXAgdGhlIG1lbW9yeSBtYXAKKyAqIGluaXRpYWxpemUgYSBidW5jaCBvZiByZWdpc3RlcnMKKyAqLworCisjaWZkZWYgQ09ORklHX0ZTTF9DT1JFTkVUCitzdGF0aWMgdm9pZCBjb3JlbmV0X3RiX2luaXQodm9pZCkKK3sKKwl2b2xhdGlsZSBjY3NyX3JjcG1fdCAqcmNwbSA9CisJCSh2b2lkICopKENPTkZJR19TWVNfRlNMX0NPUkVORVRfUkNQTV9BRERSKTsKKwl2b2xhdGlsZSBjY3NyX3BpY190ICpwaWMgPQorCQkodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfUElDX0FERFIpOworCXUzMiB3aG9hbWkgPSBpbl9iZTMyKCZwaWMtPndob2FtaSk7CisKKwkvKiBFbmFibGUgdGhlIHRpbWViYXNlIHJlZ2lzdGVyIGZvciB0aGlzIGNvcmUgKi8KKwlvdXRfYmUzMigmcmNwbS0+Y3RiZW5ybCwgKDEgPDwgd2hvYW1pKSk7Cit9CisjZW5kaWYKKwordm9pZCBjcHVfaW5pdF9mICh2b2lkKQoreworCXZvbGF0aWxlIGNjc3JfbGJjX3QgKm1lbWN0bCA9ICh2b2lkICopKENPTkZJR19TWVNfTVBDODV4eF9MQkNfQUREUik7CisJZXh0ZXJuIHZvaWQgbTg1NjBfY3BtX3Jlc2V0ICh2b2lkKTsKKyNpZmRlZiBDT05GSUdfTVBDODU0OAorCWNjc3JfbG9jYWxfZWNtX3QgKmVjbSA9ICh2b2lkICopKENPTkZJR19TWVNfTVBDODV4eF9FQ01fQUREUik7CisJdWludCBzdnIgPSBnZXRfc3ZyKCk7CisKKwkvKgorCSAqIENQVTIgZXJyYXRhIHdvcmthcm91bmQ6IEEgY29yZSBoYW5nIHBvc3NpYmxlIHdoaWxlIGV4ZWN1dGluZworCSAqIGEgbXN5bmMgaW5zdHJ1Y3Rpb24gYW5kIGEgc25vb3BhYmxlIHRyYW5zYWN0aW9uIGZyb20gYW4gSS9PCisJICogbWFzdGVyIHRhZ2dlZCB0byBtYWtlIHF1aWNrIGZvcndhcmQgcHJvZ3Jlc3MgaXMgcHJlc2VudC4KKwkgKiBGaXhlZCBpbiBzaWxpY29uIHJldiAyLjEuCisJICovCisJaWYgKChTVlJfTUFKKHN2cikgPT0gMSkgfHwgKChTVlJfTUFKKHN2cikgPT0gMiAmJiBTVlJfTUlOKHN2cikgPT0gMHgwKSkpCisJCW91dF9iZTMyKCZlY20tPmVlYnBjciwgaW5fYmUzMigmZWNtLT5lZWJwY3IpIHwgKDEgPDwgMTYpKTsKKyNlbmRpZgorCisJZGlzYWJsZV90bGIoMTQpOworCWRpc2FibGVfdGxiKDE1KTsKKworI2lmZGVmIENPTkZJR19DUE0yCisJY29uZmlnXzg1NjBfaW9wb3J0cygoY2Nzcl9jcG1fdCAqKUNPTkZJR19TWVNfTVBDODV4eF9DUE1fQUREUik7CisjZW5kaWYKKworCS8qIE1hcCBiYW5rcyAwIGFuZCAxIHRvIHRoZSBGTEFTSCBiYW5rcyAwIGFuZCAxIGF0IHByZWxpbWluYXJ5CisJICogYWRkcmVzc2VzIC0gdGhlc2UgaGF2ZSB0byBiZSBtb2RpZmllZCBsYXRlciB3aGVuIEZMQVNIIHNpemUKKwkgKiBoYXMgYmVlbiBkZXRlcm1pbmVkCisJICovCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX09SMF9SRU1BUCkKKwltZW1jdGwtPm9yMCA9IENPTkZJR19TWVNfT1IwX1JFTUFQOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX09SMV9SRU1BUCkKKwltZW1jdGwtPm9yMSA9IENPTkZJR19TWVNfT1IxX1JFTUFQOworI2VuZGlmCisKKwkvKiBub3cgcmVzdHJpY3QgdG8gcHJlbGltaW5hcnkgcmFuZ2UgKi8KKwkvKiBpZiBjczEgaXMgYWxyZWFkeSBzZXQgdmlhIGRlYnVnZ2VyLCBsZWF2ZSBjczAvY3MxIGFsb25lICovCisJaWYgKCEgbWVtY3RsLT5icjEgJiAxKSB7CisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSMF9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjBfUFJFTElNKQorCQltZW1jdGwtPmJyMCA9IENPTkZJR19TWVNfQlIwX1BSRUxJTTsKKwkJbWVtY3RsLT5vcjAgPSBDT05GSUdfU1lTX09SMF9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjFfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IxX1BSRUxJTSkKKwkJbWVtY3RsLT5vcjEgPSBDT05GSUdfU1lTX09SMV9QUkVMSU07CisJCW1lbWN0bC0+YnIxID0gQ09ORklHX1NZU19CUjFfUFJFTElNOworI2VuZGlmCisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSMl9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjJfUFJFTElNKQorCW1lbWN0bC0+b3IyID0gQ09ORklHX1NZU19PUjJfUFJFTElNOworCW1lbWN0bC0+YnIyID0gQ09ORklHX1NZU19CUjJfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIzX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SM19QUkVMSU0pCisJbWVtY3RsLT5vcjMgPSBDT05GSUdfU1lTX09SM19QUkVMSU07CisJbWVtY3RsLT5icjMgPSBDT05GSUdfU1lTX0JSM19QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjRfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I0X1BSRUxJTSkKKwltZW1jdGwtPm9yNCA9IENPTkZJR19TWVNfT1I0X1BSRUxJTTsKKwltZW1jdGwtPmJyNCA9IENPTkZJR19TWVNfQlI0X1BSRUxJTTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSNV9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjVfUFJFTElNKQorCW1lbWN0bC0+b3I1ID0gQ09ORklHX1NZU19PUjVfUFJFTElNOworCW1lbWN0bC0+YnI1ID0gQ09ORklHX1NZU19CUjVfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI2X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SNl9QUkVMSU0pCisJbWVtY3RsLT5vcjYgPSBDT05GSUdfU1lTX09SNl9QUkVMSU07CisJbWVtY3RsLT5icjYgPSBDT05GSUdfU1lTX0JSNl9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjdfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I3X1BSRUxJTSkKKwltZW1jdGwtPm9yNyA9IENPTkZJR19TWVNfT1I3X1BSRUxJTTsKKwltZW1jdGwtPmJyNyA9IENPTkZJR19TWVNfQlI3X1BSRUxJTTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BNMikKKwltODU2MF9jcG1fcmVzZXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19RRQorCS8qIENvbmZpZyBRRSBpb3BvcnRzICovCisJY29uZmlnX3FlX2lvcG9ydHMoKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01QQzg1MzYpCisJZnNsX3NlcmRlc19pbml0KCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRE1BKQorCWRtYV9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRlNMX0NPUkVORVQKKwljb3JlbmV0X3RiX2luaXQoKTsKKyNlbmRpZgorCWluaXRfdXNlZF90bGJfY2FtcygpOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIEwyIGFzIGNhY2hlLgorICoKKyAqIFRoZSBuZXdlciA4NTQ4LCBldGMsIHBhcnRzIGhhdmUgdHdpY2UgYXMgbXVjaCBjYWNoZSwgYnV0CisgKiB1c2UgdGhlIHNhbWUgYml0LWVuY29kaW5nIGFzIHRoZSBvbGRlciA4NTU1LCBldGMsIHBhcnRzLgorICoKKyAqLworCitpbnQgY3B1X2luaXRfcih2b2lkKQoreworCXB1dHMgKCJMMjogICAgIik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19MMl9DQUNIRSkKKwl2b2xhdGlsZSBjY3NyX2wyY2FjaGVfdCAqbDJjYWNoZSA9ICh2b2lkICopQ09ORklHX1NZU19NUEM4NXh4X0wyX0FERFI7CisJdm9sYXRpbGUgdWludCBjYWNoZV9jdGw7CisJdWludCBzdnIsIHZlcjsKKwl1aW50IGwyc3JiYXI7CisJdTMyIGwyc2l6X2ZpZWxkOworCisJc3ZyID0gZ2V0X3N2cigpOworCXZlciA9IFNWUl9TT0NfVkVSKHN2cik7CisKKwlhc20oIm1zeW5jO2lzeW5jIik7CisJY2FjaGVfY3RsID0gbDJjYWNoZS0+bDJjdGw7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfUkFNQk9PVCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0lOSVRfTDJfQUREUikKKwlpZiAoY2FjaGVfY3RsICYgTVBDODV4eF9MMkNUTF9MMkUpIHsKKwkJLyogQ2xlYXIgTDIgU1JBTSBtZW1vcnktbWFwcGVkIGJhc2UgYWRkcmVzcyAqLworCQlvdXRfYmUzMigmbDJjYWNoZS0+bDJzcmJhcjAsIDB4MCk7CisJCW91dF9iZTMyKCZsMmNhY2hlLT5sMnNyYmFyMSwgMHgwKTsKKworCQkvKiBzZXQgTUJFQ0NESVM9MCwgU0JFQ0NESVM9MCAqLworCQljbHJiaXRzX2JlMzIoJmwyY2FjaGUtPmwyZXJyZGlzLAorCQkJCShNUEM4NXh4X0wyRVJSRElTX01CRUNDIHwKKwkJCQkgTVBDODV4eF9MMkVSUkRJU19TQkVDQykpOworCisJCS8qIHNldCBMMkU9MCwgTDJTUkFNPTAgKi8KKwkJY2xyYml0c19iZTMyKCZsMmNhY2hlLT5sMmN0bCwKKwkJCQkoTVBDODV4eF9MMkNUTF9MMkUgfAorCQkJCSBNUEM4NXh4X0wyQ1RMX0wyU1JBTV9FTlRJUkUpKTsKKwl9CisjZW5kaWYKKworCWwyc2l6X2ZpZWxkID0gKGNhY2hlX2N0bCA+PiAyOCkgJiAweDM7CisKKwlzd2l0Y2ggKGwyc2l6X2ZpZWxkKSB7CisJY2FzZSAweDA6CisJCXByaW50ZigiIHVua25vd24gc2l6ZSAoMHglMDh4KVxuIiwgY2FjaGVfY3RsKTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwljYXNlIDB4MToKKwkJaWYgKHZlciA9PSBTVlJfODU0MCB8fCB2ZXIgPT0gU1ZSXzg1NjAgICB8fAorCQkgICAgdmVyID09IFNWUl84NTQxIHx8IHZlciA9PSBTVlJfODU0MV9FIHx8CisJCSAgICB2ZXIgPT0gU1ZSXzg1NTUgfHwgdmVyID09IFNWUl84NTU1X0UpIHsKKwkJCXB1dHMoIjEyOCBLQiAiKTsKKwkJCS8qIHNldCBMMkU9MSwgTDJJPTEsICYgTDJCTEtTWj0xICgxMjggS2J5dGUpICovCisJCQljYWNoZV9jdGwgPSAweGM0MDAwMDAwOworCQl9IGVsc2UgeworCQkJcHV0cygiMjU2IEtCICIpOworCQkJY2FjaGVfY3RsID0gMHhjMDAwMDAwMDsgLyogc2V0IEwyRT0xLCBMMkk9MSwgJiBMMlNSQU09MCAqLworCQl9CisJCWJyZWFrOworCWNhc2UgMHgyOgorCQlpZiAodmVyID09IFNWUl84NTQwIHx8IHZlciA9PSBTVlJfODU2MCAgIHx8CisJCSAgICB2ZXIgPT0gU1ZSXzg1NDEgfHwgdmVyID09IFNWUl84NTQxX0UgfHwKKwkJICAgIHZlciA9PSBTVlJfODU1NSB8fCB2ZXIgPT0gU1ZSXzg1NTVfRSkgeworCQkJcHV0cygiMjU2IEtCICIpOworCQkJLyogc2V0IEwyRT0xLCBMMkk9MSwgJiBMMkJMS1NaPTIgKDI1NiBLYnl0ZSkgKi8KKwkJCWNhY2hlX2N0bCA9IDB4YzgwMDAwMDA7CisJCX0gZWxzZSB7CisJCQlwdXRzICgiNTEyIEtCICIpOworCQkJLyogc2V0IEwyRT0xLCBMMkk9MSwgJiBMMlNSQU09MCAqLworCQkJY2FjaGVfY3RsID0gMHhjMDAwMDAwMDsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4MzoKKwkJcHV0cygiMTAyNCBLQiAiKTsKKwkJLyogc2V0IEwyRT0xLCBMMkk9MSwgJiBMMlNSQU09MCAqLworCQljYWNoZV9jdGwgPSAweGMwMDAwMDAwOworCQlicmVhazsKKwl9CisKKwlpZiAobDJjYWNoZS0+bDJjdGwgJiBNUEM4NXh4X0wyQ1RMX0wyRSkgeworCQlwdXRzKCJhbHJlYWR5IGVuYWJsZWQiKTsKKwkJbDJzcmJhciA9IGwyY2FjaGUtPmwyc3JiYXIwOworI2lmZGVmIENPTkZJR19TWVNfSU5JVF9MMl9BRERSCisJCWlmIChsMmNhY2hlLT5sMmN0bCAmIE1QQzg1eHhfTDJDVExfTDJTUkFNX0VOVElSRQorCQkJCSYmIGwyc3JiYXIgPj0gQ09ORklHX1NZU19GTEFTSF9CQVNFKSB7CisJCQlsMnNyYmFyID0gQ09ORklHX1NZU19JTklUX0wyX0FERFI7CisJCQlsMmNhY2hlLT5sMnNyYmFyMCA9IGwyc3JiYXI7CisJCQlwcmludGYoIm1vdmluZyB0byAweCUwOHgiLCBDT05GSUdfU1lTX0lOSVRfTDJfQUREUik7CisJCX0KKyNlbmRpZiAvKiBDT05GSUdfU1lTX0lOSVRfTDJfQUREUiAqLworCQlwdXRzKCJcbiIpOworCX0gZWxzZSB7CisJCWFzbSgibXN5bmM7aXN5bmMiKTsKKwkJbDJjYWNoZS0+bDJjdGwgPSBjYWNoZV9jdGw7IC8qIGludmFsaWRhdGUgJiBlbmFibGUgKi8KKwkJYXNtKCJtc3luYztpc3luYyIpOworCQlwdXRzKCJlbmFibGVkXG4iKTsKKwl9CisjZWxpZiBkZWZpbmVkKENPTkZJR19CQUNLU0lERV9MMl9DQUNIRSkKKwl1MzIgbDJjZmcwID0gbWZzcHIoU1BSTl9MMkNGRzApOworCisJLyogaW52YWxpZGF0ZSB0aGUgTDIgY2FjaGUgKi8KKwltdHNwcihTUFJOX0wyQ1NSMCwgKEwyQ1NSMF9MMkZJfEwyQ1NSMF9MMkxGQykpOworCXdoaWxlIChtZnNwcihTUFJOX0wyQ1NSMCkgJiAoTDJDU1IwX0wyRkl8TDJDU1IwX0wyTEZDKSkKKwkJOworCisjaWZkZWYgQ09ORklHX1NZU19DQUNIRV9TVEFTSElORworCS8qIHNldCBzdGFzaCBpZCB0byAoY29yZUlEKSAqIDIgKyAzMiArIEwyICgxKSAqLworCW10c3ByKFNQUk5fTDJDU1IxLCAoMzIgKyAxKSk7CisjZW5kaWYKKworCS8qIGVuYWJsZSB0aGUgY2FjaGUgKi8KKwltdHNwcihTUFJOX0wyQ1NSMCwgQ09ORklHX1NZU19JTklUX0wyQ1NSMCk7CisKKwlpZiAoQ09ORklHX1NZU19JTklUX0wyQ1NSMCAmIEwyQ1NSMF9MMkUpIHsKKwkJd2hpbGUgKCEobWZzcHIoU1BSTl9MMkNTUjApICYgTDJDU1IwX0wyRSkpCisJCQk7CisJCXByaW50ZigiJWQgS0IgZW5hYmxlZFxuIiwgKGwyY2ZnMCAmIDB4M2ZmZikgKiA2NCk7CisJfQorI2Vsc2UKKwlwdXRzKCJkaXNhYmxlZFxuIik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUUUKKwl1aW50IHFlX2Jhc2UgPSBDT05GSUdfU1lTX0lNTVIgKyAweDAwMDgwMDAwOyAvKiBRRSBpbW1yIGJhc2UgKi8KKwlxZV9pbml0KHFlX2Jhc2UpOworCXFlX3Jlc2V0KCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01QKQorCXNldHVwX21wKCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIHZvaWQgc2V0dXBfaXZvcnModm9pZCk7CisKK3ZvaWQgYXJjaF9wcmVib290X29zKHZvaWQpCit7CisJdTMyIG1zcjsKKworCS8qCisJICogV2UgYXJlIGNoYW5naW5nIGludGVycnVwdCBvZmZzZXRzIGFuZCBhcmUgYWJvdXQgdG8gYm9vdCB0aGUgT1Mgc28KKwkgKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkaXNhYmxlIGFsbCBhc3luYyBpbnRlcnJ1cHRzLiBFRSBpcyBhbHJlYWR5CisJICogZGlzYWJsZWQgYnkgdGhlIHRpbWUgd2UgZ2V0IGNhbGxlZC4KKwkgKi8KKwltc3IgPSBtZm1zcigpOworCW1zciAmPSB+KE1TUl9NRXxNU1JfQ0V8TVNSX0RFKTsKKwltdG1zcihtc3IpOworCisJc2V0dXBfaXZvcnMoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9jcHVfaW5pdF9lYXJseS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2NwdV9pbml0X2Vhcmx5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhYTk0YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9jcHVfaW5pdF9lYXJseS5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9mc2xfbGF3Lmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgKENPTkZJR19TWVNfQ0NTUkJBUl9ERUZBVUxUICE9IENPTkZJR19TWVNfQ0NTUkJBUl9QSFlTKQorI2lmZGVmIENPTkZJR19GU0xfQ09SRU5FVAorc3RhdGljIHZvaWQgc2V0dXBfY2NzcmJhcih2b2lkKQoreworCXUzMiB0ZW1wOworCXZvbGF0aWxlIHUzMiAqY2Nzcl92aXJ0ID0gKHZvbGF0aWxlIHUzMiAqKShDT05GSUdfU1lTX0NDU1JCQVIgKyAweDEwMDApOworCXZvbGF0aWxlIGNjc3JfbG9jYWxfdCAqY2NtOworCisJLyoKKwkgKiBXZSBjYW4ndCBjYWxsIHNldF9sYXcoKSBiZWNhdXNlIHdlIGhhdmVuJ3QgbW92ZWQKKwkgKiBDQ1NSIHlldC4KKwkgKi8KKwljY20gPSAodm9pZCAqKWNjc3JfdmlydDsKKworCW91dF9iZTMyKCZjY20tPmxhd1swXS5sYXdiYXJoLAorCQkodTY0KUNPTkZJR19TWVNfQ0NTUkJBUl9QSFlTID4+IDMyKTsKKwlvdXRfYmUzMigmY2NtLT5sYXdbMF0ubGF3YmFybCwgKHUzMilDT05GSUdfU1lTX0NDU1JCQVJfUEhZUyk7CisJb3V0X2JlMzIoJmNjbS0+bGF3WzBdLmxhd2FyLAorCQlMQVdfRU4gfCAoMHgxZSA8PCAyMCkgfCBMQVdfU0laRV80Syk7CisKKwlpbl9iZTMyKCh1MzIgKikoY2Nzcl92aXJ0ICsgMCkpOworCWluX2JlMzIoKHUzMiAqKShjY3NyX3ZpcnQgKyAxKSk7CisJaXN5bmMoKTsKKworCWNjbSA9ICh2b2lkICopQ09ORklHX1NZU19DQ1NSQkFSOworCS8qIE5vdyB1c2UgdGhlIHRlbXBvcmFyeSBMQVcgdG8gbW92ZSBDQ1NSICovCisJb3V0X2JlMzIoJmNjbS0+Y2NzcmJhcmgsICh1NjQpQ09ORklHX1NZU19DQ1NSQkFSX1BIWVMgPj4gMzIpOworCW91dF9iZTMyKCZjY20tPmNjc3JiYXJsLCAodTMyKUNPTkZJR19TWVNfQ0NTUkJBUl9QSFlTKTsKKwlvdXRfYmUzMigmY2NtLT5jY3NyYXIsIENDU1JBUl9DKTsKKwl0ZW1wID0gaW5fYmUzMigmY2NtLT5jY3NyYXIpOworCWRpc2FibGVfbGF3KDApOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHNldHVwX2Njc3JiYXIodm9pZCkKK3sKKwl1MzIgdGVtcDsKKwl2b2xhdGlsZSB1MzIgKmNjc3JfdmlydCA9ICh2b2xhdGlsZSB1MzIgKikoQ09ORklHX1NZU19DQ1NSQkFSICsgMHgxMDAwKTsKKworCXRlbXAgPSBpbl9iZTMyKGNjc3JfdmlydCk7CisJb3V0X2JlMzIoY2Nzcl92aXJ0LCBDT05GSUdfU1lTX0NDU1JCQVJfUEhZUyA+PiAxMik7CisJdGVtcCA9IGluX2JlMzIoKHZvbGF0aWxlIHUzMiAqKUNPTkZJR19TWVNfQ0NTUkJBUik7Cit9CisjZW5kaWYKKyNlbmRpZgorCisvKiBXZSBydW4gY3B1X2luaXRfZWFybHlfZiBpbiBBUyA9IDEgKi8KK3ZvaWQgY3B1X2luaXRfZWFybHlfZih2b2lkKQoreworCXUzMiBtYXMwLCBtYXMxLCBtYXMyLCBtYXMzLCBtYXM3OworCWludCBpOworCisJLyogUG9pbnRlciBpcyB3cml0YWJsZSBzaW5jZSB3ZSBhbGxvY2F0ZWQgYSByZWdpc3RlciBmb3IgaXQgKi8KKwlnZCA9IChnZF90ICopIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgKyBDT05GSUdfU1lTX0dCTF9EQVRBX09GRlNFVCk7CisKKwkvKgorCSAqIENsZWFyIGluaXRpYWwgZ2xvYmFsIGRhdGEKKwkgKiAgIHdlIGRvbid0IHVzZSBtZW1zZXQgc28gd2UgY2FuIHNoYXJlIHRoaXMgY29kZSB3aXRoIE5BTkRfU1BMCisJICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihnZF90KTsgaSsrKQorCQkoKGNoYXIgKilnZClbaV0gPSAwOworCisJbWFzMCA9IE1BUzBfVExCU0VMKDApIHwgTUFTMF9FU0VMKDApOworCW1hczEgPSBNQVMxX1ZBTElEIHwgTUFTMV9USUQoMCkgfCBNQVMxX1RTIHwgTUFTMV9UU0laRShCT09LRV9QQUdFU1pfNEspOworCW1hczIgPSBGU0xfQk9PS0VfTUFTMihDT05GSUdfU1lTX0NDU1JCQVIsIE1BUzJfSXxNQVMyX0cpOworCW1hczMgPSBGU0xfQk9PS0VfTUFTMyhDT05GSUdfU1lTX0NDU1JCQVJfUEhZUywgMCwgTUFTM19TV3xNQVMzX1NSKTsKKwltYXM3ID0gRlNMX0JPT0tFX01BUzcoQ09ORklHX1NZU19DQ1NSQkFSX1BIWVMpOworCisJd3JpdGVfdGxiKG1hczAsIG1hczEsIG1hczIsIG1hczMsIG1hczcpOworCisJLyogc2V0IHVwIENDU1IgaWYgd2Ugd2FudCBpdCBtb3ZlZCAqLworI2lmIChDT05GSUdfU1lTX0NDU1JCQVJfREVGQVVMVCAhPSBDT05GSUdfU1lTX0NDU1JCQVJfUEhZUykKKwltYXMwID0gTUFTMF9UTEJTRUwoMCkgfCBNQVMwX0VTRUwoMSk7CisJLyogbWFzMSBpcyB0aGUgc2FtZSBhcyBhYm92ZSAqLworCW1hczIgPSBGU0xfQk9PS0VfTUFTMihDT05GSUdfU1lTX0NDU1JCQVIgKyAweDEwMDAsIE1BUzJfSXxNQVMyX0cpOworCW1hczMgPSBGU0xfQk9PS0VfTUFTMyhDT05GSUdfU1lTX0NDU1JCQVJfREVGQVVMVCwgMCwgTUFTM19TV3xNQVMzX1NSKTsKKwltYXM3ID0gRlNMX0JPT0tFX01BUzcoQ09ORklHX1NZU19DQ1NSQkFSX0RFRkFVTFQpOworCisJd3JpdGVfdGxiKG1hczAsIG1hczEsIG1hczIsIG1hczMsIG1hczcpOworCisJc2V0dXBfY2NzcmJhcigpOworI2VuZGlmCisKKwlpbml0X2xhd3MoKTsKKwlpbnZhbGlkYXRlX3RsYigwKTsKKwlpbml0X3RsYnMoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9jcHVfaW5pdF9uYW5kLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvY3B1X2luaXRfbmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGNjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvY3B1X2luaXRfbmFuZC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKwordm9pZCBjcHVfaW5pdF9mKHZvaWQpCit7CisJY2Nzcl9sYmNfdCAqbGJjID0gKHZvaWQgKikoQ09ORklHX1NZU19NUEM4NXh4X0xCQ19BRERSKTsKKworCS8qCisJICogTENSUiAtIENsb2NrIFJhdGlvIFJlZ2lzdGVyIC0gc2V0IHVwIGxvY2FsIGJ1cyB0aW1pbmcKKwkgKiB3aGVuIG5lZWRlZAorCSAqLworCW91dF9iZTMyKCZsYmMtPmxjcnIsIExDUlJfREJZUCB8IExDUlJfQ0xLRElWXzgpOworCisjaWYgZGVmaW5lZChDT05GSUdfTkFORF9CUl9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX05BTkRfT1JfUFJFTElNKQorCW91dF9iZTMyKCZsYmMtPmJyMCwgQ09ORklHX05BTkRfQlJfUFJFTElNKTsKKwlvdXRfYmUzMigmbGJjLT5vcjAsIENPTkZJR19OQU5EX09SX1BSRUxJTSk7CisjZWxzZQorI2Vycm9yICBDT05GSUdfTkFORF9CUl9QUkVMSU0sIENPTkZJR19OQU5EX09SX1BSRUxJTSBtdXN0IGJlIGRlZmluZWQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX1JBTUJPT1QpICYmIGRlZmluZWQoQ09ORklHX1NZU19JTklUX0wyX0FERFIpCisJY2Nzcl9sMmNhY2hlX3QgKmwyY2FjaGUgPSAodm9pZCAqKUNPTkZJR19TWVNfTVBDODV4eF9MMl9BRERSOworCWNoYXIgKmwyc3JiYXI7CisJaW50IGk7CisKKwlvdXRfYmUzMigmbDJjYWNoZS0+bDJzcmJhcjAsIENPTkZJR19TWVNfSU5JVF9MMl9BRERSKTsKKworCS8qIHNldCBNQkVDQ0RJUz0xLCBTQkVDQ0RJUz0xICovCisJb3V0X2JlMzIoJmwyY2FjaGUtPmwyZXJyZGlzLAorCQkoTVBDODV4eF9MMkVSUkRJU19NQkVDQyB8IE1QQzg1eHhfTDJFUlJESVNfU0JFQ0MpKTsKKworCS8qIHNldCBMMkU9MSAmIEwyU1JBTT0wMDEgKi8KKwlvdXRfYmUzMigmbDJjYWNoZS0+bDJjdGwsCisJCShNUEM4NXh4X0wyQ1RMX0wyRSB8IE1QQzg1eHhfTDJDVExfTDJTUkFNX0VOVElSRSkpOworCisJLyogSW5pdGlhbGl6ZSBMMiBTUkFNIHRvIHplcm8gKi8KKwlsMnNyYmFyID0gKGNoYXIgKilDT05GSUdfU1lTX0lOSVRfTDJfQUREUjsKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX1NZU19MMl9TSVpFOyBpKyspCisJCWwyc3JiYXJbaV0gPSAwOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvZGRyLWdlbjEuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9kZHItZ2VuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDM3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvZGRyLWdlbjEuYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2Rkcl9zZHJhbS5oPgorCisjaWYgKENPTkZJR19DSElQX1NFTEVDVFNfUEVSX0NUUkwgPiA0KQorI2Vycm9yIEludmFsaWQgc2V0dGluZyBmb3IgQ09ORklHX0NISVBfU0VMRUNUU19QRVJfQ1RSTAorI2VuZGlmCisKK3ZvaWQgZnNsX2Rkcl9zZXRfbWVtY3RsX3JlZ3MoY29uc3QgZnNsX2Rkcl9jZmdfcmVnc190ICpyZWdzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY3RybF9udW0pCit7CisJdW5zaWduZWQgaW50IGk7CisJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyID0gKHZvaWQgKilDT05GSUdfU1lTX01QQzg1eHhfRERSX0FERFI7CisKKwlpZiAoY3RybF9udW0gIT0gMCkgeworCQlwcmludGYoIiVzIHVuZXhwZWN0ZWQgY3RybF9udW0gPSAldVxuIiwgX19GVU5DVElPTl9fLCBjdHJsX251bSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX0NISVBfU0VMRUNUU19QRVJfQ1RSTDsgaSsrKSB7CisJCWlmIChpID09IDApIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzMF9ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzMF9jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisKKwkJfSBlbHNlIGlmIChpID09IDEpIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzMV9ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzMV9jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisKKwkJfSBlbHNlIGlmIChpID09IDIpIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzMl9ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzMl9jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisKKwkJfSBlbHNlIGlmIChpID09IDMpIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzM19ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzM19jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisJCX0KKwl9CisKKwlvdXRfYmUzMigmZGRyLT50aW1pbmdfY2ZnXzEsIHJlZ3MtPnRpbWluZ19jZmdfMSk7CisJb3V0X2JlMzIoJmRkci0+dGltaW5nX2NmZ18yLCByZWdzLT50aW1pbmdfY2ZnXzIpOworCW91dF9iZTMyKCZkZHItPnNkcmFtX21vZGUsIHJlZ3MtPmRkcl9zZHJhbV9tb2RlKTsKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9pbnRlcnZhbCwgcmVncy0+ZGRyX3NkcmFtX2ludGVydmFsKTsKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NTU1KSB8fCBkZWZpbmVkKENPTkZJR19NUEM4NTQxKQorCW91dF9iZTMyKCZkZHItPnNkcmFtX2Nsa19jbnRsLCByZWdzLT5kZHJfc2RyYW1fY2xrX2NudGwpOworI2VuZGlmCisKKwkvKgorCSAqIDIwMCBwYWluZnVsIG1pY3JvLXNlY29uZHMgbXVzdCBlbGFwc2UgYmV0d2VlbgorCSAqIHRoZSBERFIgY2xvY2sgc2V0dXAgYW5kIHRoZSBERFIgY29uZmlnIGVuYWJsZS4KKwkgKi8KKwl1ZGVsYXkoMjAwKTsKKwlhc20gdm9sYXRpbGUoInN5bmM7aXN5bmMiKTsKKworCW91dF9iZTMyKCZkZHItPnNkcmFtX2NmZywgcmVncy0+ZGRyX3NkcmFtX2NmZyk7CisKKwlhc20oInN5bmM7aXN5bmM7bXN5bmMiKTsKKwl1ZGVsYXkoNTAwKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICYmICFkZWZpbmVkKENPTkZJR19FQ0NfSU5JVF9WSUFfRERSQ09OVFJPTExFUikKKy8qCisgKiBJbml0aWFsaXplIGFsbCBvZiBtZW1vcnkgZm9yIEVDQywgdGhlbiBlbmFibGUgZXJyb3JzLgorICovCisKK3ZvaWQKK2Rkcl9lbmFibGVfZWNjKHVuc2lnbmVkIGludCBkcmFtX3NpemUpCit7CisJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfRERSX0FERFIpOworCisJZG1hX21lbWluaXQoQ09ORklHX01FTV9JTklUX1ZBTFVFLCBkcmFtX3NpemUpOworCisJLyoKKwkgKiBFbmFibGUgZXJyb3JzIGZvciBFQ0MuCisJICovCisJZGVidWcoIkRNQSBERFI6IGVycl9kaXNhYmxlID0gMHglMDh4XG4iLCBkZHItPmVycl9kaXNhYmxlKTsKKwlkZHItPmVycl9kaXNhYmxlID0gMHgwMDAwMDAwMDsKKwlhc20oInN5bmM7aXN5bmM7bXN5bmMiKTsKKwlkZWJ1ZygiRE1BIEREUjogZXJyX2Rpc2FibGUgPSAweCUwOHhcbiIsIGRkci0+ZXJyX2Rpc2FibGUpOworfQorCisjZW5kaWYJLyogQ09ORklHX0REUl9FQ0MgICYmICEgQ09ORklHX0VDQ19JTklUX1ZJQV9ERFJDT05UUk9MTEVSICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvZGRyLWdlbjIuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9kZHItZ2VuMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NWY5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvZGRyLWdlbjIuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2Rkcl9zZHJhbS5oPgorCisjaWYgKENPTkZJR19DSElQX1NFTEVDVFNfUEVSX0NUUkwgPiA0KQorI2Vycm9yIEludmFsaWQgc2V0dGluZyBmb3IgQ09ORklHX0NISVBfU0VMRUNUU19QRVJfQ1RSTAorI2VuZGlmCisKK3ZvaWQgZnNsX2Rkcl9zZXRfbWVtY3RsX3JlZ3MoY29uc3QgZnNsX2Rkcl9jZmdfcmVnc190ICpyZWdzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY3RybF9udW0pCit7CisJdW5zaWduZWQgaW50IGk7CisJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyID0gKHZvaWQgKilDT05GSUdfU1lTX01QQzg1eHhfRERSX0FERFI7CisKKwlpZiAoY3RybF9udW0pIHsKKwkJcHJpbnRmKCIlcyB1bmV4cGVjdGVkIGN0cmxfbnVtID0gJXVcbiIsIF9fRlVOQ1RJT05fXywgY3RybF9udW0pOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19DSElQX1NFTEVDVFNfUEVSX0NUUkw7IGkrKykgeworCQlpZiAoaSA9PSAwKSB7CisJCQlvdXRfYmUzMigmZGRyLT5jczBfYm5kcywgcmVncy0+Y3NbaV0uYm5kcyk7CisJCQlvdXRfYmUzMigmZGRyLT5jczBfY29uZmlnLCByZWdzLT5jc1tpXS5jb25maWcpOworCisJCX0gZWxzZSBpZiAoaSA9PSAxKSB7CisJCQlvdXRfYmUzMigmZGRyLT5jczFfYm5kcywgcmVncy0+Y3NbaV0uYm5kcyk7CisJCQlvdXRfYmUzMigmZGRyLT5jczFfY29uZmlnLCByZWdzLT5jc1tpXS5jb25maWcpOworCisJCX0gZWxzZSBpZiAoaSA9PSAyKSB7CisJCQlvdXRfYmUzMigmZGRyLT5jczJfYm5kcywgcmVncy0+Y3NbaV0uYm5kcyk7CisJCQlvdXRfYmUzMigmZGRyLT5jczJfY29uZmlnLCByZWdzLT5jc1tpXS5jb25maWcpOworCisJCX0gZWxzZSBpZiAoaSA9PSAzKSB7CisJCQlvdXRfYmUzMigmZGRyLT5jczNfYm5kcywgcmVncy0+Y3NbaV0uYm5kcyk7CisJCQlvdXRfYmUzMigmZGRyLT5jczNfY29uZmlnLCByZWdzLT5jc1tpXS5jb25maWcpOworCQl9CisJfQorCisJb3V0X2JlMzIoJmRkci0+dGltaW5nX2NmZ18zLCByZWdzLT50aW1pbmdfY2ZnXzMpOworCW91dF9iZTMyKCZkZHItPnRpbWluZ19jZmdfMCwgcmVncy0+dGltaW5nX2NmZ18wKTsKKwlvdXRfYmUzMigmZGRyLT50aW1pbmdfY2ZnXzEsIHJlZ3MtPnRpbWluZ19jZmdfMSk7CisJb3V0X2JlMzIoJmRkci0+dGltaW5nX2NmZ18yLCByZWdzLT50aW1pbmdfY2ZnXzIpOworCW91dF9iZTMyKCZkZHItPnNkcmFtX2NmZ18yLCByZWdzLT5kZHJfc2RyYW1fY2ZnXzIpOworCW91dF9iZTMyKCZkZHItPnNkcmFtX21vZGUsIHJlZ3MtPmRkcl9zZHJhbV9tb2RlKTsKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9tb2RlXzIsIHJlZ3MtPmRkcl9zZHJhbV9tb2RlXzIpOworCW91dF9iZTMyKCZkZHItPnNkcmFtX21kX2NudGwsIHJlZ3MtPmRkcl9zZHJhbV9tZF9jbnRsKTsKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9pbnRlcnZhbCwgcmVncy0+ZGRyX3NkcmFtX2ludGVydmFsKTsKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9kYXRhX2luaXQsIHJlZ3MtPmRkcl9kYXRhX2luaXQpOworCW91dF9iZTMyKCZkZHItPnNkcmFtX2Nsa19jbnRsLCByZWdzLT5kZHJfc2RyYW1fY2xrX2NudGwpOworCW91dF9iZTMyKCZkZHItPmluaXRfYWRkciwgcmVncy0+ZGRyX2luaXRfYWRkcik7CisJb3V0X2JlMzIoJmRkci0+aW5pdF9leHRfYWRkciwgcmVncy0+ZGRyX2luaXRfZXh0X2FkZHIpOworCisJLyoKKwkgKiAyMDAgcGFpbmZ1bCBtaWNyby1zZWNvbmRzIG11c3QgZWxhcHNlIGJldHdlZW4KKwkgKiB0aGUgRERSIGNsb2NrIHNldHVwIGFuZCB0aGUgRERSIGNvbmZpZyBlbmFibGUuCisJICovCisJdWRlbGF5KDIwMCk7CisJYXNtIHZvbGF0aWxlKCJzeW5jO2lzeW5jIik7CisKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9jZmcsIHJlZ3MtPmRkcl9zZHJhbV9jZmcpOworCisJLyogUG9sbCBERFJfU0RSQU1fQ0ZHXzJbRF9JTklUXSBiaXQgdW50aWwgYXV0by1kYXRhIGluaXQgaXMgZG9uZS4gICovCisJd2hpbGUgKGluX2JlMzIoJmRkci0+c2RyYW1fY2ZnXzIpICYgMHgxMCkgeworCQl1ZGVsYXkoMTAwMDApOwkJLyogdGhyb3R0bGUgcG9sbGluZyByYXRlICovCisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2Rkci1nZW4zLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvZGRyLWdlbjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjkxY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2Rkci1nZW4zLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9mc2xfZGRyX3NkcmFtLmg+CisKKyNpZiAoQ09ORklHX0NISVBfU0VMRUNUU19QRVJfQ1RSTCA+IDQpCisjZXJyb3IgSW52YWxpZCBzZXR0aW5nIGZvciBDT05GSUdfQ0hJUF9TRUxFQ1RTX1BFUl9DVFJMCisjZW5kaWYKKwordm9pZCBmc2xfZGRyX3NldF9tZW1jdGxfcmVncyhjb25zdCBmc2xfZGRyX2NmZ19yZWdzX3QgKnJlZ3MsCisJCQkgICAgIHVuc2lnbmVkIGludCBjdHJsX251bSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl2b2xhdGlsZSBjY3NyX2Rkcl90ICpkZHI7CisJdTMyIHRlbXBfc2RyYW1fY2ZnOworCisJc3dpdGNoIChjdHJsX251bSkgeworCWNhc2UgMDoKKwkJZGRyID0gKHZvaWQgKilDT05GSUdfU1lTX01QQzg1eHhfRERSX0FERFI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZGRyID0gKHZvaWQgKilDT05GSUdfU1lTX01QQzg1eHhfRERSMl9BRERSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiVzIHVuZXhwZWN0ZWQgY3RybF9udW0gPSAldVxuIiwgX19GVU5DVElPTl9fLCBjdHJsX251bSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX0NISVBfU0VMRUNUU19QRVJfQ1RSTDsgaSsrKSB7CisJCWlmIChpID09IDApIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzMF9ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzMF9jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisJCQlvdXRfYmUzMigmZGRyLT5jczBfY29uZmlnXzIsIHJlZ3MtPmNzW2ldLmNvbmZpZ18yKTsKKworCQl9IGVsc2UgaWYgKGkgPT0gMSkgeworCQkJb3V0X2JlMzIoJmRkci0+Y3MxX2JuZHMsIHJlZ3MtPmNzW2ldLmJuZHMpOworCQkJb3V0X2JlMzIoJmRkci0+Y3MxX2NvbmZpZywgcmVncy0+Y3NbaV0uY29uZmlnKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzMV9jb25maWdfMiwgcmVncy0+Y3NbaV0uY29uZmlnXzIpOworCisJCX0gZWxzZSBpZiAoaSA9PSAyKSB7CisJCQlvdXRfYmUzMigmZGRyLT5jczJfYm5kcywgcmVncy0+Y3NbaV0uYm5kcyk7CisJCQlvdXRfYmUzMigmZGRyLT5jczJfY29uZmlnLCByZWdzLT5jc1tpXS5jb25maWcpOworCQkJb3V0X2JlMzIoJmRkci0+Y3MyX2NvbmZpZ18yLCByZWdzLT5jc1tpXS5jb25maWdfMik7CisKKwkJfSBlbHNlIGlmIChpID09IDMpIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzM19ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzM19jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisJCQlvdXRfYmUzMigmZGRyLT5jczNfY29uZmlnXzIsIHJlZ3MtPmNzW2ldLmNvbmZpZ18yKTsKKwkJfQorCX0KKworCW91dF9iZTMyKCZkZHItPnRpbWluZ19jZmdfMywgcmVncy0+dGltaW5nX2NmZ18zKTsKKwlvdXRfYmUzMigmZGRyLT50aW1pbmdfY2ZnXzAsIHJlZ3MtPnRpbWluZ19jZmdfMCk7CisJb3V0X2JlMzIoJmRkci0+dGltaW5nX2NmZ18xLCByZWdzLT50aW1pbmdfY2ZnXzEpOworCW91dF9iZTMyKCZkZHItPnRpbWluZ19jZmdfMiwgcmVncy0+dGltaW5nX2NmZ18yKTsKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9jZmdfMiwgcmVncy0+ZGRyX3NkcmFtX2NmZ18yKTsKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9tb2RlLCByZWdzLT5kZHJfc2RyYW1fbW9kZSk7CisJb3V0X2JlMzIoJmRkci0+c2RyYW1fbW9kZV8yLCByZWdzLT5kZHJfc2RyYW1fbW9kZV8yKTsKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9tZF9jbnRsLCByZWdzLT5kZHJfc2RyYW1fbWRfY250bCk7CisJb3V0X2JlMzIoJmRkci0+c2RyYW1faW50ZXJ2YWwsIHJlZ3MtPmRkcl9zZHJhbV9pbnRlcnZhbCk7CisJb3V0X2JlMzIoJmRkci0+c2RyYW1fZGF0YV9pbml0LCByZWdzLT5kZHJfZGF0YV9pbml0KTsKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9jbGtfY250bCwgcmVncy0+ZGRyX3NkcmFtX2Nsa19jbnRsKTsKKwlvdXRfYmUzMigmZGRyLT5pbml0X2FkZHIsIHJlZ3MtPmRkcl9pbml0X2FkZHIpOworCW91dF9iZTMyKCZkZHItPmluaXRfZXh0X2FkZHIsIHJlZ3MtPmRkcl9pbml0X2V4dF9hZGRyKTsKKworCW91dF9iZTMyKCZkZHItPnRpbWluZ19jZmdfNCwgcmVncy0+dGltaW5nX2NmZ180KTsKKwlvdXRfYmUzMigmZGRyLT50aW1pbmdfY2ZnXzUsIHJlZ3MtPnRpbWluZ19jZmdfNSk7CisJb3V0X2JlMzIoJmRkci0+ZGRyX3pxX2NudGwsIHJlZ3MtPmRkcl96cV9jbnRsKTsKKwlvdXRfYmUzMigmZGRyLT5kZHJfd3JsdmxfY250bCwgcmVncy0+ZGRyX3dybHZsX2NudGwpOworCW91dF9iZTMyKCZkZHItPmRkcl9zcl9jbnRyLCByZWdzLT5kZHJfc3JfY250cik7CisJb3V0X2JlMzIoJmRkci0+ZGRyX3NkcmFtX3Jjd18xLCByZWdzLT5kZHJfc2RyYW1fcmN3XzEpOworCW91dF9iZTMyKCZkZHItPmRkcl9zZHJhbV9yY3dfMiwgcmVncy0+ZGRyX3NkcmFtX3Jjd18yKTsKKworCS8qIFNldCwgYnV0IGRvIG5vdCBlbmFibGUgdGhlIG1lbW9yeSAqLworCXRlbXBfc2RyYW1fY2ZnID0gcmVncy0+ZGRyX3NkcmFtX2NmZzsKKwl0ZW1wX3NkcmFtX2NmZyAmPSB+KFNEUkFNX0NGR19NRU1fRU4pOworCW91dF9iZTMyKCZkZHItPnNkcmFtX2NmZywgdGVtcF9zZHJhbV9jZmcpOworCS8qCisJICogRm9yIDg1NzIgRERSMSBlcnJhdHVtIC0gRERSIGNvbnRyb2xsZXIgbWF5IGVudGVyIGlsbGVnYWwgc3RhdGUKKwkgKiB3aGVuIG9wZXJhdGlpbmcgaW4gMzItYml0IGJ1cyBtb2RlIHdpdGggNC1iZWF0IGJ1cnN0cywKKwkgKiBUaGlzIGVycmF0dW0gZG9lcyBub3QgYWZmZWN0IEREUjMgbW9kZSwgb25seSBmb3IgRERSMiBtb2RlLgorCSAqLworI2lmZGVmIENPTkZJR19NUEM4NTcyCisJaWYgKCgoKGluX2JlMzIoJmRkci0+c2RyYW1fY2ZnKSA+PiAyNCkgJiAweDcpID09IFNEUkFNX1RZUEVfRERSMikKKwkgICAgJiYgaW5fYmUzMigmZGRyLT5zZHJhbV9jZmcpICYgMHg4MDAwMCkgeworCQkvKiBzZXQgREVCVUdfMVszMV0gKi8KKwkJdTMyIHRlbXAgPSBpbl9iZTMyKCZkZHItPmRlYnVnXzEpOworCQlvdXRfYmUzMigmZGRyLT5kZWJ1Z18xLCB0ZW1wIHwgMSk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIDUwMCBwYWluZnVsIG1pY3JvLXNlY29uZHMgbXVzdCBlbGFwc2UgYmV0d2VlbgorCSAqIHRoZSBERFIgY2xvY2sgc2V0dXAgYW5kIHRoZSBERFIgY29uZmlnIGVuYWJsZS4KKwkgKiBERFIyIG5lZWQgMjAwIHVzLCBhbmQgRERSMyBuZWVkIDUwMCB1cyBmcm9tIHNwZWMsCisJICogd2UgY2hvb3NlIHRoZSBtYXgsIHRoYXQgaXMgNTAwIHVzIGZvciBhbGwgb2YgY2FzZS4KKwkgKi8KKwl1ZGVsYXkoNTAwKTsKKwlhc20gdm9sYXRpbGUoInN5bmM7aXN5bmMiKTsKKworCS8qIExldCB0aGUgY29udHJvbGxlciBnbyAqLworCXRlbXBfc2RyYW1fY2ZnID0gaW5fYmUzMigmZGRyLT5zZHJhbV9jZmcpOworCW91dF9iZTMyKCZkZHItPnNkcmFtX2NmZywgdGVtcF9zZHJhbV9jZmcgfCBTRFJBTV9DRkdfTUVNX0VOKTsKKworCS8qIFBvbGwgRERSX1NEUkFNX0NGR18yW0RfSU5JVF0gYml0IHVudGlsIGF1dG8tZGF0YSBpbml0IGlzIGRvbmUuICAqLworCXdoaWxlIChpbl9iZTMyKCZkZHItPnNkcmFtX2NmZ18yKSAmIDB4MTApIHsKKwkJdWRlbGF5KDEwMDAwKTsJCS8qIHRocm90dGxlIHBvbGxpbmcgcmF0ZSAqLworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9ldGhlcl9mY2MuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9ldGhlcl9mY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE0MTRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2V0aGVyX2ZjYy5jCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogTVBDODU2MCBGQ0MgRmFzdCBFdGhlcm5ldAorICogQ29weXJpZ2h0IChjKSAyMDAzIE1vdG9yb2xhLEluYy4KKyAqIFhpYW5naHVhIFhpYW8sIChYLlhpYW9AbW90b3JvbGEuY29tKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICAgRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAgU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIE1QQzg1NjAgRkNDIEZhc3QgRXRoZXJuZXQKKyAqIEJhc2ljIEVUIEhXIGluaXRpYWxpemF0aW9uIGFuZCBwYWNrZXQgUlgvVFggcm91dGluZXMKKyAqCisgKiBUaGlzIGNvZGUgd2lsbCBub3QgcGVyZm9ybSB0aGUgSU8gcG9ydCBjb25maWd1cmF0aW9uLiBUaGlzIHNob3VsZCBiZQorICogZG9uZSBpbiB0aGUgaW9wX2NvbmZfdCBzdHJ1Y3R1cmUgc3BlY2lmaWMgZm9yIHRoZSBib2FyZC4KKyAqCisgKiBUT0RPOgorICogYWRkIGEgUEhZIGRyaXZlciB0byBkbyB0aGUgbmVnb3RpYXRpb24KKyAqIHJlZmxlY3QgbmVnb3RpYXRpb24gcmVzdWx0cyBpbiBGUFNNUgorICogbG9vayBmb3Igd2F5cyB0byBjb25maWd1cmUgdGhlIGJvYXJkIHNwZWNpZmljIHN0dWZmIGVsc2V3aGVyZSwgZWcuCisgKiAgICBjb25maWdfeHh4Lmggb3IgdGhlIGJvYXJkIGRpcmVjdG9yeQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vY3BtXzg1eHguaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCisjaW5jbHVkZSA8bWlpcGh5Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykgJiYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgXAorCWRlZmluZWQoQ09ORklHX05FVF9NVUxUSSkKKworc3RhdGljIHN0cnVjdCBldGhlcl9mY2NfaW5mb19zCit7CisJaW50IGV0aGVyX2luZGV4OworCWludCBwcm9mZl9lbmV0OworCXVsb25nIGNwbV9jcl9lbmV0X3NibG9jazsKKwl1bG9uZyBjcG1fY3JfZW5ldF9wYWdlOworCXVsb25nIGNteGZjcl9tYXNrOworCXVsb25nIGNteGZjcl92YWx1ZTsKK30KKwlldGhlcl9mY2NfaW5mb1tdID0KK3sKKyNpZmRlZiBDT05GSUdfRVRIRVJfT05fRkNDMQoreworCTAsCisJUFJPRkZfRkNDMSwKKwlDUE1fQ1JfRkNDMV9TQkxPQ0ssCisJQ1BNX0NSX0ZDQzFfUEFHRSwKKwlDT05GSUdfU1lTX0NNWEZDUl9NQVNLMSwKKwlDT05GSUdfU1lTX0NNWEZDUl9WQUxVRTEKK30sCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MyCit7CisJMSwKKwlQUk9GRl9GQ0MyLAorCUNQTV9DUl9GQ0MyX1NCTE9DSywKKwlDUE1fQ1JfRkNDMl9QQUdFLAorCUNPTkZJR19TWVNfQ01YRkNSX01BU0syLAorCUNPTkZJR19TWVNfQ01YRkNSX1ZBTFVFMgorfSwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VUSEVSX09OX0ZDQzMKK3sKKwkyLAorCVBST0ZGX0ZDQzMsCisJQ1BNX0NSX0ZDQzNfU0JMT0NLLAorCUNQTV9DUl9GQ0MzX1BBR0UsCisJQ09ORklHX1NZU19DTVhGQ1JfTUFTSzMsCisJQ09ORklHX1NZU19DTVhGQ1JfVkFMVUUzCit9LAorI2VuZGlmCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIE1heGltdW0gaW5wdXQgRE1BIHNpemUuICBNdXN0IGJlIGEgc2hvdWxkKD8pIGJlIGEgbXVsdGlwbGUgb2YgNC4gKi8KKyNkZWZpbmUgUEtUX01BWERNQV9TSVpFICAgICAgICAgMTUyMAorCisvKiBUaGUgRkNDIHN0b3JlcyBkZXN0L3NyYy90eXBlLCBkYXRhLCBhbmQgY2hlY2tzdW0gZm9yIHJlY2VpdmUgcGFja2V0cy4gKi8KKyNkZWZpbmUgUEtUX01BWEJVRl9TSVpFICAgICAgICAgMTUxOAorI2RlZmluZSBQS1RfTUlOQlVGX1NJWkUgICAgICAgICA2NAorCisvKiBNYXhpbXVtIGlucHV0IGJ1ZmZlciBzaXplLiAgTXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLiAqLworI2RlZmluZSBQS1RfTUFYQkxSX1NJWkUgICAgICAgICAxNTM2CisKKyNkZWZpbmUgVE9VVF9MT09QIDEwMDAwMDAKKworI2RlZmluZSBUWF9CVUZfQ05UIDIKKworc3RhdGljIHVpbnQgcnhJZHg7CS8qIGluZGV4IG9mIHRoZSBjdXJyZW50IFJYIGJ1ZmZlciAqLworc3RhdGljIHVpbnQgdHhJZHg7CS8qIGluZGV4IG9mIHRoZSBjdXJyZW50IFRYIGJ1ZmZlciAqLworCisvKgorICogRkNDIEV0aGVybmV0IFR4IGFuZCBSeCBidWZmZXIgZGVzY3JpcHRvcnMuCisgKiBQcm92aWRlIGZvciBEb3VibGUgQnVmZmVyaW5nCisgKiBOb3RlOiBQS1RCVUZTUlggaXMgZGVmaW5lZCBpbiBuZXQuaAorICovCisKK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IHJ0eGJkIHsKKyAgICBjYmRfdCByeGJkW1BLVEJVRlNSWF07CisgICAgY2JkX3QgdHhiZFtUWF9CVUZfQ05UXTsKK30gUlRYQkQ7CisKKy8qICBHb29kIG5ld3M6IHRoZSBGQ0Mgc3VwcG9ydHMgZXh0ZXJuYWwgQkRzISAqLworI2lmZGVmIF9fR05VQ19fCitzdGF0aWMgUlRYQkQgcnR4IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CisjZWxzZQorI2Vycm9yICJydHggbXVzdCBiZSA2NC1iaXQgYWxpZ25lZCIKKyNlbmRpZgorCisjdW5kZWYgRVRfREVCVUcKKworc3RhdGljIGludCBmZWNfc2VuZChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCit7CisgICAgaW50IGkgPSAwOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgaWYgKGxlbmd0aCA8PSAwKSB7CisJcHJpbnRmKCJmZWM6IGJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIGxlbmd0aCk7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgZm9yKGk9MDsgcnR4LnR4YmRbdHhJZHhdLmNiZF9zYyAmIEJEX0VORVRfVFhfUkVBRFk7IGkrKykgeworCWlmIChpID49IFRPVVRfTE9PUCkgeworCSAgICBwcmludGYoImZlYzogdHggYnVmZmVyIG5vdCByZWFkeVxuIik7CisJICAgIGdvdG8gb3V0OworCX0KKyAgICB9CisKKyAgICBydHgudHhiZFt0eElkeF0uY2JkX2J1ZmFkZHIgPSAodWludClwYWNrZXQ7CisgICAgcnR4LnR4YmRbdHhJZHhdLmNiZF9kYXRsZW4gPSBsZW5ndGg7CisgICAgcnR4LnR4YmRbdHhJZHhdLmNiZF9zYyB8PSAoQkRfRU5FVF9UWF9SRUFEWSB8IEJEX0VORVRfVFhfTEFTVCB8IFwKKwkJCSAgICAgICBCRF9FTkVUX1RYX1RDIHwgQkRfRU5FVF9UWF9QQUQpOworCisgICAgZm9yKGk9MDsgcnR4LnR4YmRbdHhJZHhdLmNiZF9zYyAmIEJEX0VORVRfVFhfUkVBRFk7IGkrKykgeworCWlmIChpID49IFRPVVRfTE9PUCkgeworCSAgICBwcmludGYoImZlYzogdHggZXJyb3JcbiIpOworCSAgICBnb3RvIG91dDsKKwl9CisgICAgfQorCisjaWZkZWYgRVRfREVCVUcKKyAgICBwcmludGYoImN5Y2xlczogMHgleCB0eElkeD0weCUwNHggc3RhdHVzOiAweCUwNHhcbiIsIGksIHR4SWR4LHJ0eC50eGJkW3R4SWR4XS5jYmRfc2MpOworICAgIHByaW50ZigicGFja2V0cyBhdCAweCUwOHgsIGxlbmd0aF9pbl9ieXRlcz0weCV4XG4iLCh1aW50KXBhY2tldCxsZW5ndGgpOworICAgIGZvcihpPTA7aTwobGVuZ3RoLzE2ICsgMSk7aSsrKSB7CisJIHByaW50ZigiJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwqKCh1aW50ICopcnR4LnR4YmRbdHhJZHhdLmNiZF9idWZhZGRyK2kqNCksXAorICAgICooKHVpbnQgKilydHgudHhiZFt0eElkeF0uY2JkX2J1ZmFkZHIgKyBpKjQgKyAxKSwqKCh1aW50ICopcnR4LnR4YmRbdHhJZHhdLmNiZF9idWZhZGRyICsgaSo0ICsgMiksIFwKKyAgICAqKCh1aW50ICopcnR4LnR4YmRbdHhJZHhdLmNiZF9idWZhZGRyICsgaSo0ICsgMykpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogcmV0dXJuIG9ubHkgc3RhdHVzIGJpdHMgKi8KKyAgICByZXN1bHQgPSBydHgudHhiZFt0eElkeF0uY2JkX3NjICYgQkRfRU5FVF9UWF9TVEFUUzsKKyAgICB0eElkeCA9ICh0eElkeCArIDEpICUgVFhfQlVGX0NOVDsKKworb3V0OgorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgZmVjX3JlY3Yoc3RydWN0IGV0aF9kZXZpY2UqIGRldikKK3sKKyAgICBpbnQgbGVuZ3RoOworCisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKHJ0eC5yeGJkW3J4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1JYX0VNUFRZKSB7CisJICAgIGxlbmd0aCA9IC0xOworCSAgICBicmVhazsgICAgIC8qIG5vdGhpbmcgcmVjZWl2ZWQgLSBsZWF2ZSBmb3IoKSBsb29wICovCisJfQorCWxlbmd0aCA9IHJ0eC5yeGJkW3J4SWR4XS5jYmRfZGF0bGVuOworCisJaWYgKHJ0eC5yeGJkW3J4SWR4XS5jYmRfc2MgJiAweDAwM2YpIHsKKwkgICAgcHJpbnRmKCJmZWM6IHJ4IGVycm9yICUwNHhcbiIsIHJ0eC5yeGJkW3J4SWR4XS5jYmRfc2MpOworCX0KKwllbHNlIHsKKwkgICAgLyogUGFzcyB0aGUgcGFja2V0IHVwIHRvIHRoZSBwcm90b2NvbCBsYXllcnMuICovCisJICAgIE5ldFJlY2VpdmUoTmV0UnhQYWNrZXRzW3J4SWR4XSwgbGVuZ3RoIC0gNCk7CisJfQorCisKKwkvKiBHaXZlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgRkNDLiAqLworCXJ0eC5yeGJkW3J4SWR4XS5jYmRfZGF0bGVuID0gMDsKKworCS8qIHdyYXAgYXJvdW5kIGJ1ZmZlciBpbmRleCB3aGVuIG5lY2Vzc2FyeSAqLworCWlmICgocnhJZHggKyAxKSA+PSBQS1RCVUZTUlgpIHsKKwkgICAgcnR4LnJ4YmRbUEtUQlVGU1JYIC0gMV0uY2JkX3NjID0gKEJEX0VORVRfUlhfV1JBUCB8IEJEX0VORVRfUlhfRU1QVFkpOworCSAgICByeElkeCA9IDA7CisJfQorCWVsc2UgeworCSAgICBydHgucnhiZFtyeElkeF0uY2JkX3NjID0gQkRfRU5FVF9SWF9FTVBUWTsKKwkgICAgcnhJZHgrKzsKKwl9CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisKKworc3RhdGljIGludCBmZWNfaW5pdChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCBiZF90ICpiaXMpCit7CisgICAgc3RydWN0IGV0aGVyX2ZjY19pbmZvX3MgKiBpbmZvID0gZGV2LT5wcml2OworICAgIGludCBpOworICAgIHZvbGF0aWxlIGNjc3JfY3BtX3QgKmNwbSA9IChjY3NyX2NwbV90ICopQ09ORklHX1NZU19NUEM4NXh4X0NQTV9BRERSOworICAgIHZvbGF0aWxlIGNjc3JfY3BtX2NwX3QgKmNwID0gJihjcG0tPmltX2NwbV9jcCk7CisgICAgZmNjX2VuZXRfdCAqcHJhbV9wdHI7CisgICAgdW5zaWduZWQgbG9uZyBtZW1fYWRkcjsKKworI2lmIDAKKyAgICBtaWlfZGlzY292ZXJfcGh5KCk7CisjZW5kaWYKKworICAgIC8qIDI4LjkgLSAoMS0yKTogaW9wb3J0cyBoYXZlIGJlZW4gc2V0IHVwIGFscmVhZHkgKi8KKworICAgIC8qIDI4LjkgLSAoMyk6IGNvbm5lY3QgRkNDJ3MgdHggYW5kIHJ4IGNsb2NrcyAqLworICAgIGNwbS0+aW1fY3BtX211eC5jbXh1YXIgPSAwOyAvKiBBVE0gKi8KKyAgICBjcG0tPmltX2NwbV9tdXguY214ZmNyID0gKGNwbS0+aW1fY3BtX211eC5jbXhmY3IgJiB+aW5mby0+Y214ZmNyX21hc2spIHwKKwkJCQkJCQlpbmZvLT5jbXhmY3JfdmFsdWU7CisKKyAgICAvKiAyOC45IC0gKDQpOiBHRk1SOiBkaXNhYmxlIHR4L3J4LCBDQ0lUVCBDUkMsIHNldCBNb2RlIEV0aGVybmV0ICovCisgICAgaWYoaW5mby0+ZXRoZXJfaW5kZXggPT0gMCkgeworCWNwbS0+aW1fY3BtX2ZjYzEuZ2ZtciA9IEZDQ19HRk1SX01PREVfRU5FVCB8IEZDQ19HRk1SX1RDUkNfMzI7CisgICAgfSBlbHNlIGlmIChpbmZvLT5ldGhlcl9pbmRleCA9PSAxKSB7CisJY3BtLT5pbV9jcG1fZmNjMi5nZm1yID0gRkNDX0dGTVJfTU9ERV9FTkVUIHwgRkNDX0dGTVJfVENSQ18zMjsKKyAgICB9IGVsc2UgaWYgKGluZm8tPmV0aGVyX2luZGV4ID09IDIpIHsKKwljcG0tPmltX2NwbV9mY2MzLmdmbXIgPSBGQ0NfR0ZNUl9NT0RFX0VORVQgfCBGQ0NfR0ZNUl9UQ1JDXzMyOworICAgIH0KKworICAgIC8qIDI4LjkgLSAoNSk6IEZQU01SOiBlbmFibGUgZnVsbCBkdXBsZXgsIHNlbGVjdCBDQ0lUVCBDUkMgZm9yIEV0aGVybmV0LE1JSSAqLworICAgIGlmKGluZm8tPmV0aGVyX2luZGV4ID09IDApIHsKKwljcG0tPmltX2NwbV9mY2MxLmZwc21yID0gQ09ORklHX1NZU19GQ0NfUFNNUiB8IEZDQ19QU01SX0VOQ1JDOworICAgIH0gZWxzZSBpZiAoaW5mby0+ZXRoZXJfaW5kZXggPT0gMSl7CisJY3BtLT5pbV9jcG1fZmNjMi5mcHNtciA9IENPTkZJR19TWVNfRkNDX1BTTVIgfCBGQ0NfUFNNUl9FTkNSQzsKKyAgICB9IGVsc2UgaWYgKGluZm8tPmV0aGVyX2luZGV4ID09IDIpeworCWNwbS0+aW1fY3BtX2ZjYzMuZnBzbXIgPSBDT05GSUdfU1lTX0ZDQ19QU01SIHwgRkNDX1BTTVJfRU5DUkM7CisgICAgfQorCisgICAgLyogMjguOSAtICg2KTogRkRTUjogRXRoZXJuZXQgU3luICovCisgICAgaWYoaW5mby0+ZXRoZXJfaW5kZXggPT0gMCkgeworCWNwbS0+aW1fY3BtX2ZjYzEuZmRzciA9IDB4RDU1NTsKKyAgICB9IGVsc2UgaWYgKGluZm8tPmV0aGVyX2luZGV4ID09IDEpIHsKKwljcG0tPmltX2NwbV9mY2MyLmZkc3IgPSAweEQ1NTU7CisgICAgfSBlbHNlIGlmIChpbmZvLT5ldGhlcl9pbmRleCA9PSAyKSB7CisJY3BtLT5pbV9jcG1fZmNjMy5mZHNyID0gMHhENTU1OworICAgIH0KKworICAgIC8qIHJlc2V0IGluZGVjZXMgdG8gY3VycmVudCByeC90eCBiZCAoc2VlIGV0aF9zZW5kKCkvZXRoX3J4KCkpICovCisgICAgcnhJZHggPSAwOworICAgIHR4SWR4ID0gMDsKKworICAgIC8qIFNldHVwIFJlY2VpdmVyIEJ1ZmZlciBEZXNjcmlwdG9ycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBQS1RCVUZTUlg7IGkrKykKKyAgICB7CisgICAgICBydHgucnhiZFtpXS5jYmRfc2MgPSBCRF9FTkVUX1JYX0VNUFRZOworICAgICAgcnR4LnJ4YmRbaV0uY2JkX2RhdGxlbiA9IDA7CisgICAgICBydHgucnhiZFtpXS5jYmRfYnVmYWRkciA9ICh1aW50KU5ldFJ4UGFja2V0c1tpXTsKKyAgICB9CisgICAgcnR4LnJ4YmRbUEtUQlVGU1JYIC0gMV0uY2JkX3NjIHw9IEJEX0VORVRfUlhfV1JBUDsKKworICAgIC8qIFNldHVwIEV0aGVybmV0IFRyYW5zbWl0dGVyIEJ1ZmZlciBEZXNjcmlwdG9ycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBUWF9CVUZfQ05UOyBpKyspCisgICAgeworICAgICAgcnR4LnR4YmRbaV0uY2JkX3NjID0gMDsKKyAgICAgIHJ0eC50eGJkW2ldLmNiZF9kYXRsZW4gPSAwOworICAgICAgcnR4LnR4YmRbaV0uY2JkX2J1ZmFkZHIgPSAwOworICAgIH0KKyAgICBydHgudHhiZFtUWF9CVUZfQ05UIC0gMV0uY2JkX3NjIHw9IEJEX0VORVRfVFhfV1JBUDsKKworICAgIC8qIDI4LjkgLSAoNyk6IGluaXRpYWxpemUgcGFyYW1ldGVyIHJhbSAqLworICAgIHByYW1fcHRyID0gKGZjY19lbmV0X3QgKikmKGNwbS0+aW1fZHByYW1iYXNlW2luZm8tPnByb2ZmX2VuZXRdKTsKKworICAgIC8qIGNsZWFyIHdob2xlIHN0cnVjdHVyZSB0byBtYWtlIHN1cmUgYWxsIHJlc2VydmVkIGZpZWxkcyBhcmUgemVybyAqLworICAgIG1lbXNldCgodm9pZCopcHJhbV9wdHIsIDAsIHNpemVvZihmY2NfZW5ldF90KSk7CisKKyAgICAvKgorICAgICAqIGNvbW1vbiBQYXJhbWV0ZXIgUkFNIGFyZWEKKyAgICAgKgorICAgICAqIEFsbG9jYXRlIHNwYWNlIGluIHRoZSByZXNlcnZlZCBGQ0MgYXJlYSBvZiBEUFJBTSBmb3IgdGhlCisgICAgICogaW50ZXJuYWwgYnVmZmVycy4gIE5vIG9uZSB1c2VzIHRoaXMgc3BhY2UgKHlldCksIHNvIHdlCisgICAgICogY2FuIGRvIHRoaXMuICBMYXRlciwgd2Ugd2lsbCBhZGQgcmVzb3VyY2UgbWFuYWdlbWVudCBmb3IKKyAgICAgKiB0aGlzIGFyZWEuCisgICAgICogQ1BNX0ZDQ19TUEVDSUFMX0JBU0U6CTB4QjAwMCBmb3IgTVBDODU0MCwgTVBDODU2MAorICAgICAqCQkJCTB4OTAwMCBmb3IgTVBDODU0MSwgTVBDODU1NQorICAgICAqLworICAgIG1lbV9hZGRyID0gQ1BNX0ZDQ19TUEVDSUFMX0JBU0UgKyAoKGluZm8tPmV0aGVyX2luZGV4KSAqIDY0KTsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfcmlwdHIgPSBtZW1fYWRkcjsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdGlwdHIgPSBtZW1fYWRkciszMjsKKyAgICAvKgorICAgICAqIFNldCBtYXhpbXVtIGJ5dGVzIHBlciByZWNlaXZlIGJ1ZmZlci4KKyAgICAgKiBJdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIuCisgICAgICovCisgICAgcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX21yYmxyID0gUEtUX01BWEJMUl9TSVpFOyAvKiAxNTM2ICovCisgICAgLyogbG9jYWxidXMgU0RSQU0gc2hvdWxkIGJlIHByZWZlcnJlZCAqLworICAgIHByYW1fcHRyLT5mZW5fZ2VuZmNjLmZjY19yc3RhdGUgPSAoQ1BNRkNSX0dCTCB8IENQTUZDUl9FQiB8CisJCQkJICAgICAgIENPTkZJR19TWVNfQ1BNRkNSX1JBTVRZUEUpIDw8IDI0OworICAgIHByYW1fcHRyLT5mZW5fZ2VuZmNjLmZjY19yYmFzZSA9ICh1bnNpZ25lZCBpbnQpKCZydHgucnhiZFtyeElkeF0pOworICAgIHByYW1fcHRyLT5mZW5fZ2VuZmNjLmZjY19yYmRzdGF0ID0gMDsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfcmJkbGVuID0gMDsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfcmRwdHIgPSAwOworICAgIC8qIGxvY2FsYnVzIFNEUkFNIHNob3VsZCBiZSBwcmVmZXJyZWQgKi8KKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdHN0YXRlID0gKENQTUZDUl9HQkwgfCBDUE1GQ1JfRUIgfAorCQkJCSAgICAgICBDT05GSUdfU1lTX0NQTUZDUl9SQU1UWVBFKSA8PCAyNDsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdGJhc2UgPSAodW5zaWduZWQgaW50KSgmcnR4LnR4YmRbdHhJZHhdKTsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdGJkc3RhdCA9IDA7CisgICAgcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3RiZGxlbiA9IDA7CisgICAgcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3RkcHRyID0gMDsKKworICAgIC8qIHByb3RvY29sLXNwZWNpZmljIGFyZWEgKi8KKyAgICBwcmFtX3B0ci0+ZmVuX3N0YXRidWYgPSAweDA7CisgICAgcHJhbV9wdHItPmZlbl9jbWFzayA9IDB4ZGViYjIwZTM7CS8qIENSQyBtYXNrICovCisgICAgcHJhbV9wdHItPmZlbl9jcHJlcyA9IDB4ZmZmZmZmZmY7CS8qIENSQyBwcmVzZXQgKi8KKyAgICBwcmFtX3B0ci0+ZmVuX2NyY2VjID0gMDsKKyAgICBwcmFtX3B0ci0+ZmVuX2FsZWMgPSAwOworICAgIHByYW1fcHRyLT5mZW5fZGlzZmMgPSAwOworICAgIHByYW1fcHRyLT5mZW5fcmV0bGltID0gMTU7CQkvKiBSZXRyeSBsaW1pdCB0aHJlc2hvbGQgKi8KKyAgICBwcmFtX3B0ci0+ZmVuX3JldGNudCA9IDA7CisgICAgcHJhbV9wdHItPmZlbl9wcGVyID0gMDsKKyAgICBwcmFtX3B0ci0+ZmVuX2JvZmZjbnQgPSAwOworICAgIHByYW1fcHRyLT5mZW5fZ2FkZHJoID0gMDsKKyAgICBwcmFtX3B0ci0+ZmVuX2dhZGRybCA9IDA7CisgICAgcHJhbV9wdHItPmZlbl9tZmxyID0gUEtUX01BWEJVRl9TSVpFOyAgIC8qIG1heGltdW0gZnJhbWUgbGVuZ3RoIHJlZ2lzdGVyICovCisgICAgLyoKKyAgICAgKiBTZXQgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzLgorICAgICAqCisgICAgICogVGhpcyBpcyBzdXBwbGllZCBpbiB0aGUgYm9hcmQgaW5mb3JtYXRpb24gc3RydWN0dXJlLCBzbyB3ZQorICAgICAqIGNvcHkgdGhhdCBpbnRvIHRoZSBjb250cm9sbGVyLgorICAgICAqIFNvIGZhciB3ZSBoYXZlIG9ubHkgYmVlbiBnaXZlbiBvbmUgRXRoZXJuZXQgYWRkcmVzcy4gV2UgbWFrZQorICAgICAqIGl0IHVuaXF1ZSBieSBzZXR0aW5nIGEgZmV3IGJpdHMgaW4gdGhlIHVwcGVyIGJ5dGUgb2YgdGhlCisgICAgICogbm9uLXN0YXRpYyBwYXJ0IG9mIHRoZSBhZGRyZXNzLgorICAgICAqLworI2RlZmluZSBlYSBldGhfZ2V0X2RldigpLT5lbmV0YWRkcgorICAgIHByYW1fcHRyLT5mZW5fcGFkZHJoID0gKGVhWzVdIDw8IDgpICsgZWFbNF07CisgICAgcHJhbV9wdHItPmZlbl9wYWRkcm0gPSAoZWFbM10gPDwgOCkgKyBlYVsyXTsKKyAgICBwcmFtX3B0ci0+ZmVuX3BhZGRybCA9IChlYVsxXSA8PCA4KSArIGVhWzBdOworI3VuZGVmIGVhCisgICAgcHJhbV9wdHItPmZlbl9pYmRjb3VudCA9IDA7CisgICAgcHJhbV9wdHItPmZlbl9pYmRzdGFydCA9IDA7CisgICAgcHJhbV9wdHItPmZlbl9pYmRlbmQgPSAwOworICAgIHByYW1fcHRyLT5mZW5fdHhsZW4gPSAwOworICAgIHByYW1fcHRyLT5mZW5faWFkZHJoID0gMDsgIC8qIGRpc2FibGUgaGFzaCAqLworICAgIHByYW1fcHRyLT5mZW5faWFkZHJsID0gMDsKKyAgICBwcmFtX3B0ci0+ZmVuX21pbmZsciA9IFBLVF9NSU5CVUZfU0laRTsgLyogbWluaW11bSBmcmFtZSBsZW5ndGggcmVnaXN0ZXI6IDY0ICovCisgICAgLyogcGFkIHBvaW50ZXIuIHVzZSB0aXB0ciBzaW5jZSB3ZSBkb24ndCBuZWVkIGEgc3BlY2lmaWMgcGFkZGluZyBjaGFyICovCisgICAgcHJhbV9wdHItPmZlbl9wYWRwdHIgPSBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdGlwdHI7CisgICAgcHJhbV9wdHItPmZlbl9tYXhkMSA9IFBLVF9NQVhETUFfU0laRTsJLyogbWF4aW11bSBETUExIGxlbmd0aDoxNTIwICovCisgICAgcHJhbV9wdHItPmZlbl9tYXhkMiA9IFBLVF9NQVhETUFfU0laRTsJLyogbWF4aW11bSBETUEyIGxlbmd0aDoxNTIwICovCisKKyNpZiBkZWZpbmVkKEVUX0RFQlVHKQorICAgIHByaW50ZigicGFybV9wdHIoMHhmZjc4ODUwMCkgPSAlcFxuIixwcmFtX3B0cik7CisgICAgcHJpbnRmKCJwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfcmJhc2UgJTA4eFxuIiwKKwlwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfcmJhc2UpOworICAgIHByaW50ZigicHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3RiYXNlICUwOHhcbiIsCisJcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3RiYXNlKTsKKyNlbmRpZgorCisgICAgLyogMjguOSAtICg4KSg5KTogY2xlYXIgb3V0IGV2ZW50cyBpbiBGQ0NFICovCisgICAgLyogMjguOSAtICg5KTogRkNDTTogbWFzayBhbGwgZXZlbnRzICovCisgICAgaWYoaW5mby0+ZXRoZXJfaW5kZXggPT0gMCkgeworCWNwbS0+aW1fY3BtX2ZjYzEuZmNjZSA9IH4weDA7CisJY3BtLT5pbV9jcG1fZmNjMS5mY2NtID0gMDsKKyAgICB9IGVsc2UgaWYgKGluZm8tPmV0aGVyX2luZGV4ID09IDEpIHsKKwljcG0tPmltX2NwbV9mY2MyLmZjY2UgPSB+MHgwOworCWNwbS0+aW1fY3BtX2ZjYzIuZmNjbSA9IDA7CisgICAgfSBlbHNlIGlmIChpbmZvLT5ldGhlcl9pbmRleCA9PSAyKSB7CisJY3BtLT5pbV9jcG1fZmNjMy5mY2NlID0gfjB4MDsKKwljcG0tPmltX2NwbV9mY2MzLmZjY20gPSAwOworICAgIH0KKworICAgIC8qIDI4LjkgLSAoMTAtMTIpOiB3ZSBkb24ndCB1c2UgZXRoZXJuZXQgaW50ZXJydXB0cyAqLworCisgICAgLyogMjguOSAtICgxMykKKyAgICAgKgorICAgICAqIExldCdzIHJlLWluaXRpYWxpemUgdGhlIGNoYW5uZWwgbm93LiAgV2UgaGF2ZSB0byBkbyBpdCBsYXRlcgorICAgICAqIHRoYW4gdGhlIG1hbnVhbCBkZXNjcmliZXMgYmVjYXVzZSB3ZSBoYXZlIGp1c3Qgbm93IGZpbmlzaGVkCisgICAgICogdGhlIEJEIGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIGNwLT5jcGNyID0gbWtfY3JfY21kKGluZm8tPmNwbV9jcl9lbmV0X3BhZ2UsCisJCQkgICAgaW5mby0+Y3BtX2NyX2VuZXRfc2Jsb2NrLAorCQkJICAgIDB4MGMsCisJCQkgICAgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisgICAgZG8geworCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKyAgICB9IHdoaWxlIChjcC0+Y3BjciAmIENQTV9DUl9GTEcpOworCisgICAgLyogMjguOSAtICgxNCk6IGVuYWJsZSB0eC9yeCBpbiBnZm1yICovCisgICAgaWYoaW5mby0+ZXRoZXJfaW5kZXggPT0gMCkgeworCWNwbS0+aW1fY3BtX2ZjYzEuZ2ZtciB8PSBGQ0NfR0ZNUl9FTlQgfCBGQ0NfR0ZNUl9FTlI7CisgICAgfSBlbHNlIGlmIChpbmZvLT5ldGhlcl9pbmRleCA9PSAxKSB7CisJY3BtLT5pbV9jcG1fZmNjMi5nZm1yIHw9IEZDQ19HRk1SX0VOVCB8IEZDQ19HRk1SX0VOUjsKKyAgICB9IGVsc2UgaWYgKGluZm8tPmV0aGVyX2luZGV4ID09IDIpIHsKKwljcG0tPmltX2NwbV9mY2MzLmdmbXIgfD0gRkNDX0dGTVJfRU5UIHwgRkNDX0dGTVJfRU5SOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmZWNfaGFsdChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworICAgIHN0cnVjdCBldGhlcl9mY2NfaW5mb19zICogaW5mbyA9IGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBjY3NyX2NwbV90ICpjcG0gPSAoY2Nzcl9jcG1fdCAqKUNPTkZJR19TWVNfTVBDODV4eF9DUE1fQUREUjsKKworICAgIC8qIHdyaXRlIEdGTVI6IGRpc2FibGUgdHgvcnggKi8KKyAgICBpZihpbmZvLT5ldGhlcl9pbmRleCA9PSAwKSB7CisJY3BtLT5pbV9jcG1fZmNjMS5nZm1yICY9IH4oRkNDX0dGTVJfRU5UIHwgRkNDX0dGTVJfRU5SKTsKKyAgICB9IGVsc2UgaWYoaW5mby0+ZXRoZXJfaW5kZXggPT0gMSkgeworCWNwbS0+aW1fY3BtX2ZjYzIuZ2ZtciAmPSB+KEZDQ19HRk1SX0VOVCB8IEZDQ19HRk1SX0VOUik7CisgICAgfSBlbHNlIGlmKGluZm8tPmV0aGVyX2luZGV4ID09IDIpIHsKKwljcG0tPmltX2NwbV9mY2MzLmdmbXIgJj0gfihGQ0NfR0ZNUl9FTlQgfCBGQ0NfR0ZNUl9FTlIpOworICAgIH0KK30KKworaW50IGZlY19pbml0aWFsaXplKGJkX3QgKmJpcykKK3sKKwlzdHJ1Y3QgZXRoX2RldmljZSogZGV2OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihldGhlcl9mY2NfaW5mbykgLyBzaXplb2YoZXRoZXJfZmNjX2luZm9bMF0pOyBpKyspCisJeworCQlkZXYgPSAoc3RydWN0IGV0aF9kZXZpY2UqKSBtYWxsb2Moc2l6ZW9mICpkZXYpOworCQltZW1zZXQoZGV2LCAwLCBzaXplb2YgKmRldik7CisKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJGQ0MlZCBFVEhFUk5FVCIsCisJCQlldGhlcl9mY2NfaW5mb1tpXS5ldGhlcl9pbmRleCArIDEpOworCQlkZXYtPnByaXYgICA9ICZldGhlcl9mY2NfaW5mb1tpXTsKKwkJZGV2LT5pbml0ICAgPSBmZWNfaW5pdDsKKwkJZGV2LT5oYWx0ICAgPSBmZWNfaGFsdDsKKwkJZGV2LT5zZW5kICAgPSBmZWNfc2VuZDsKKwkJZGV2LT5yZWN2ICAgPSBmZWNfcmVjdjsKKworCQlldGhfcmVnaXN0ZXIoZGV2KTsKKworI2lmIChkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpKSBcCisJCSYmIGRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpCisJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsCisJCQkJYmJfbWlpcGh5X3JlYWQsCWJiX21paXBoeV93cml0ZSk7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvZmR0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvZmR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxMWFiNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9mZHQuYwpAQCAtMCwwICsxLDQxNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGxpYmZkdC5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaWZkZWYgQ09ORklHX0ZTTF9FU0RIQworI2luY2x1ZGUgPGZzbF9lc2RoYy5oPgorI2VuZGlmCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitleHRlcm4gdm9pZCBmdF9xZV9zZXR1cCh2b2lkICpibG9iKTsKK2V4dGVybiB2b2lkIGZ0X2ZpeHVwX251bV9jb3Jlcyh2b2lkICpibG9iKTsKKworI2lmZGVmIENPTkZJR19NUAorI2luY2x1ZGUgIm1wLmgiCisKK3ZvaWQgZnRfZml4dXBfY3B1KHZvaWQgKmJsb2IsIHU2NCBtZW1vcnlfbGltaXQpCit7CisJaW50IG9mZjsKKwl1bG9uZyBzcGluX3RibF9hZGRyID0gZ2V0X3NwaW5fcGh5c19hZGRyKCk7CisJdTMyIGJvb3RwZyA9IGRldGVybWluZV9tcF9ib290cGcoKTsKKwl1MzIgaWQgPSBnZXRfbXlfaWQoKTsKKworCW9mZiA9IGZkdF9ub2RlX29mZnNldF9ieV9wcm9wX3ZhbHVlKGJsb2IsIC0xLCAiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNCk7CisJd2hpbGUgKG9mZiAhPSAtRkRUX0VSUl9OT1RGT1VORCkgeworCQl1MzIgKnJlZyA9ICh1MzIgKilmZHRfZ2V0cHJvcChibG9iLCBvZmYsICJyZWciLCAwKTsKKworCQlpZiAocmVnKSB7CisJCQlpZiAoKnJlZyA9PSBpZCkgeworCQkJCWZkdF9zZXRwcm9wX3N0cmluZyhibG9iLCBvZmYsICJzdGF0dXMiLCAib2theSIpOworCQkJfSBlbHNlIHsKKwkJCQl1NjQgdmFsID0gKnJlZyAqIFNJWkVfQk9PVF9FTlRSWSArIHNwaW5fdGJsX2FkZHI7CisJCQkJdmFsID0gY3B1X3RvX2ZkdDMyKHZhbCk7CisJCQkJZmR0X3NldHByb3Bfc3RyaW5nKGJsb2IsIG9mZiwgInN0YXR1cyIsCisJCQkJCQkJCSJkaXNhYmxlZCIpOworCQkJCWZkdF9zZXRwcm9wX3N0cmluZyhibG9iLCBvZmYsICJlbmFibGUtbWV0aG9kIiwKKwkJCQkJCQkJInNwaW4tdGFibGUiKTsKKwkJCQlmZHRfc2V0cHJvcChibG9iLCBvZmYsICJjcHUtcmVsZWFzZS1hZGRyIiwKKwkJCQkJCSZ2YWwsIHNpemVvZih2YWwpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ZiAoImNwdSBOVUxMXG4iKTsKKwkJfQorCQlvZmYgPSBmZHRfbm9kZV9vZmZzZXRfYnlfcHJvcF92YWx1ZShibG9iLCBvZmYsCisJCQkJImRldmljZV90eXBlIiwgImNwdSIsIDQpOworCX0KKworCS8qIFJlc2VydmUgdGhlIGJvb3QgcGFnZSBzbyBPU2VzIGRvbnQgdXNlIGl0ICovCisJaWYgKCh1NjQpYm9vdHBnIDwgbWVtb3J5X2xpbWl0KSB7CisJCW9mZiA9IGZkdF9hZGRfbWVtX3JzdihibG9iLCBib290cGcsICh1NjQpNDA5Nik7CisJCWlmIChvZmYgPCAwKQorCQkJcHJpbnRmKCIlczogJXNcbiIsIF9fRlVOQ1RJT05fXywgZmR0X3N0cmVycm9yKG9mZikpOworCX0KK30KKyNlbmRpZgorCisjZGVmaW5lIGZ0X2ZpeHVwX2wzY2FjaGUoeCwgeSkKKworI2lmIGRlZmluZWQoQ09ORklHX0wyX0NBQ0hFKQorLyogcmV0dXJuIHNpemUgaW4ga2lsb2J5dGVzICovCitzdGF0aWMgaW5saW5lIHUzMiBsMmNhY2hlX3NpemUodm9pZCkKK3sKKwl2b2xhdGlsZSBjY3NyX2wyY2FjaGVfdCAqbDJjYWNoZSA9ICh2b2lkICopQ09ORklHX1NZU19NUEM4NXh4X0wyX0FERFI7CisJdm9sYXRpbGUgdTMyIGwyc2l6X2ZpZWxkID0gKGwyY2FjaGUtPmwyY3RsID4+IDI4KSAmIDB4MzsKKwl1MzIgdmVyID0gU1ZSX1NPQ19WRVIoZ2V0X3N2cigpKTsKKworCXN3aXRjaCAobDJzaXpfZmllbGQpIHsKKwljYXNlIDB4MDoKKwkJYnJlYWs7CisJY2FzZSAweDE6CisJCWlmICh2ZXIgPT0gU1ZSXzg1NDAgfHwgdmVyID09IFNWUl84NTYwICAgfHwKKwkJICAgIHZlciA9PSBTVlJfODU0MSB8fCB2ZXIgPT0gU1ZSXzg1NDFfRSB8fAorCQkgICAgdmVyID09IFNWUl84NTU1IHx8IHZlciA9PSBTVlJfODU1NV9FKQorCQkJcmV0dXJuIDEyODsKKwkJZWxzZQorCQkJcmV0dXJuIDI1NjsKKwkJYnJlYWs7CisJY2FzZSAweDI6CisJCWlmICh2ZXIgPT0gU1ZSXzg1NDAgfHwgdmVyID09IFNWUl84NTYwICAgfHwKKwkJICAgIHZlciA9PSBTVlJfODU0MSB8fCB2ZXIgPT0gU1ZSXzg1NDFfRSB8fAorCQkgICAgdmVyID09IFNWUl84NTU1IHx8IHZlciA9PSBTVlJfODU1NV9FKQorCQkJcmV0dXJuIDI1NjsKKwkJZWxzZQorCQkJcmV0dXJuIDUxMjsKKwkJYnJlYWs7CisJY2FzZSAweDM6CisJCXJldHVybiAxMDI0OworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZ0X2ZpeHVwX2wyY2FjaGUodm9pZCAqYmxvYikKK3sKKwlpbnQgbGVuLCBvZmY7CisJdTMyICpwaDsKKwlzdHJ1Y3QgY3B1X3R5cGUgKmNwdSA9IGlkZW50aWZ5X2NwdShTVlJfU09DX1ZFUihnZXRfc3ZyKCkpKTsKKwljaGFyIGNvbXBhdF9idWZbMzhdOworCisJY29uc3QgdTMyIGxpbmVfc2l6ZSA9IDMyOworCWNvbnN0IHUzMiBudW1fd2F5cyA9IDg7CisJY29uc3QgdTMyIHNpemUgPSBsMmNhY2hlX3NpemUoKSAqIDEwMjQ7CisJY29uc3QgdTMyIG51bV9zZXRzID0gc2l6ZSAvIChsaW5lX3NpemUgKiBudW1fd2F5cyk7CisKKwlvZmYgPSBmZHRfbm9kZV9vZmZzZXRfYnlfcHJvcF92YWx1ZShibG9iLCAtMSwgImRldmljZV90eXBlIiwgImNwdSIsIDQpOworCWlmIChvZmYgPCAwKSB7CisJCWRlYnVnKCJubyBjcHUgbm9kZSBmb3VudFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwaCA9ICh1MzIgKilmZHRfZ2V0cHJvcChibG9iLCBvZmYsICJuZXh0LWxldmVsLWNhY2hlIiwgMCk7CisKKwlpZiAocGggPT0gTlVMTCkgeworCQlkZWJ1Zygibm8gbmV4dC1sZXZlbC1jYWNoZSBwcm9wZXJ0eVxuIik7CisJCXJldHVybiA7CisJfQorCisJb2ZmID0gZmR0X25vZGVfb2Zmc2V0X2J5X3BoYW5kbGUoYmxvYiwgKnBoKTsKKwlpZiAob2ZmIDwgMCkgeworCQlwcmludGYoIiVzOiAlc1xuIiwgX19mdW5jX18sIGZkdF9zdHJlcnJvcihvZmYpKTsKKwkJcmV0dXJuIDsKKwl9CisKKwlpZiAoY3B1KSB7CisJCWlmIChpc2RpZ2l0KGNwdS0+bmFtZVswXSkpCisJCQlsZW4gPSBzcHJpbnRmKGNvbXBhdF9idWYsCisJCQkJImZzbCxtcGMlcy1sMi1jYWNoZS1jb250cm9sbGVyIiwgY3B1LT5uYW1lKTsKKwkJZWxzZQorCQkJbGVuID0gc3ByaW50Zihjb21wYXRfYnVmLAorCQkJCSJmc2wsJWMlcy1sMi1jYWNoZS1jb250cm9sbGVyIiwKKwkJCQl0b2xvd2VyKGNwdS0+bmFtZVswXSksIGNwdS0+bmFtZSArIDEpOworCisJCXNwcmludGYoJmNvbXBhdF9idWZbbGVuICsgMV0sICJjYWNoZSIpOworCX0KKwlmZHRfc2V0cHJvcChibG9iLCBvZmYsICJjYWNoZS11bmlmaWVkIiwgTlVMTCwgMCk7CisJZmR0X3NldHByb3BfY2VsbChibG9iLCBvZmYsICJjYWNoZS1ibG9jay1zaXplIiwgbGluZV9zaXplKTsKKwlmZHRfc2V0cHJvcF9jZWxsKGJsb2IsIG9mZiwgImNhY2hlLXNpemUiLCBzaXplKTsKKwlmZHRfc2V0cHJvcF9jZWxsKGJsb2IsIG9mZiwgImNhY2hlLXNldHMiLCBudW1fc2V0cyk7CisJZmR0X3NldHByb3BfY2VsbChibG9iLCBvZmYsICJjYWNoZS1sZXZlbCIsIDIpOworCWZkdF9zZXRwcm9wKGJsb2IsIG9mZiwgImNvbXBhdGlibGUiLCBjb21wYXRfYnVmLCBzaXplb2YoY29tcGF0X2J1ZikpOworCisJLyogd2UgZG9udCBib3RoZXIgdy9MMyBzaW5jZSBubyBwbGF0Zm9ybSBvZiB0aGlzIHR5cGUgaGFzIG9uZSAqLworfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQkFDS1NJREVfTDJfQ0FDSEUpCitzdGF0aWMgaW5saW5lIHZvaWQgZnRfZml4dXBfbDJjYWNoZSh2b2lkICpibG9iKQoreworCWludCBvZmYsIGwyX29mZiwgbDNfb2ZmID0gLTE7CisJdTMyICpwaDsKKwl1MzIgbDJjZmcwID0gbWZzcHIoU1BSTl9MMkNGRzApOworCXUzMiBzaXplLCBsaW5lX3NpemUsIG51bV93YXlzLCBudW1fc2V0czsKKworCXNpemUgPSAobDJjZmcwICYgMHgzZmZmKSAqIDY0ICogMTAyNDsKKwludW1fd2F5cyA9ICgobDJjZmcwID4+IDE0KSAmIDB4MWYpICsgMTsKKwlsaW5lX3NpemUgPSAoKChsMmNmZzAgPj4gMjMpICYgMHgzKSArIDEpICogMzI7CisJbnVtX3NldHMgPSBzaXplIC8gKGxpbmVfc2l6ZSAqIG51bV93YXlzKTsKKworCW9mZiA9IGZkdF9ub2RlX29mZnNldF9ieV9wcm9wX3ZhbHVlKGJsb2IsIC0xLCAiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNCk7CisKKwl3aGlsZSAob2ZmICE9IC1GRFRfRVJSX05PVEZPVU5EKSB7CisJCXBoID0gKHUzMiAqKWZkdF9nZXRwcm9wKGJsb2IsIG9mZiwgIm5leHQtbGV2ZWwtY2FjaGUiLCAwKTsKKworCQlpZiAocGggPT0gTlVMTCkgeworCQkJZGVidWcoIm5vIG5leHQtbGV2ZWwtY2FjaGUgcHJvcGVydHlcbiIpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJbDJfb2ZmID0gZmR0X25vZGVfb2Zmc2V0X2J5X3BoYW5kbGUoYmxvYiwgKnBoKTsKKwkJaWYgKGwyX29mZiA8IDApIHsKKwkJCXByaW50ZigiJXM6ICVzXG4iLCBfX2Z1bmNfXywgZmR0X3N0cmVycm9yKG9mZikpOworCQkJZ290byBuZXh0OworCQl9CisKKyNpZmRlZiBDT05GSUdfU1lTX0NBQ0hFX1NUQVNISU5HCisJCXsKKwkJCXUzMiAqcmVnID0gKHUzMiAqKWZkdF9nZXRwcm9wKGJsb2IsIG9mZiwgInJlZyIsIDApOworCQkJaWYgKHJlZykKKwkJCQlmZHRfc2V0cHJvcF9jZWxsKGJsb2IsIGwyX29mZiwgImNhY2hlLXN0YXNoLWlkIiwKKwkJCQkJICgqcmVnICogMikgKyAzMiArIDEpOworCQl9CisjZW5kaWYKKworCQlmZHRfc2V0cHJvcChibG9iLCBsMl9vZmYsICJjYWNoZS11bmlmaWVkIiwgTlVMTCwgMCk7CisJCWZkdF9zZXRwcm9wX2NlbGwoYmxvYiwgbDJfb2ZmLCAiY2FjaGUtYmxvY2stc2l6ZSIsIGxpbmVfc2l6ZSk7CisJCWZkdF9zZXRwcm9wX2NlbGwoYmxvYiwgbDJfb2ZmLCAiY2FjaGUtc2l6ZSIsIHNpemUpOworCQlmZHRfc2V0cHJvcF9jZWxsKGJsb2IsIGwyX29mZiwgImNhY2hlLXNldHMiLCBudW1fc2V0cyk7CisJCWZkdF9zZXRwcm9wX2NlbGwoYmxvYiwgbDJfb2ZmLCAiY2FjaGUtbGV2ZWwiLCAyKTsKKwkJZmR0X3NldHByb3AoYmxvYiwgbDJfb2ZmLCAiY29tcGF0aWJsZSIsICJjYWNoZSIsIDYpOworCisJCWlmIChsM19vZmYgPCAwKSB7CisJCQlwaCA9ICh1MzIgKilmZHRfZ2V0cHJvcChibG9iLCBsMl9vZmYsICJuZXh0LWxldmVsLWNhY2hlIiwgMCk7CisKKwkJCWlmIChwaCA9PSBOVUxMKSB7CisJCQkJZGVidWcoIm5vIG5leHQtbGV2ZWwtY2FjaGUgcHJvcGVydHlcbiIpOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWwzX29mZiA9ICpwaDsKKwkJfQorbmV4dDoKKwkJb2ZmID0gZmR0X25vZGVfb2Zmc2V0X2J5X3Byb3BfdmFsdWUoYmxvYiwgb2ZmLAorCQkJCSJkZXZpY2VfdHlwZSIsICJjcHUiLCA0KTsKKwl9CisJaWYgKGwzX29mZiA+IDApIHsKKwkJbDNfb2ZmID0gZmR0X25vZGVfb2Zmc2V0X2J5X3BoYW5kbGUoYmxvYiwgbDNfb2ZmKTsKKwkJaWYgKGwzX29mZiA8IDApIHsKKwkJCXByaW50ZigiJXM6ICVzXG4iLCBfX2Z1bmNfXywgZmR0X3N0cmVycm9yKG9mZikpOworCQkJcmV0dXJuIDsKKwkJfQorCQlmdF9maXh1cF9sM2NhY2hlKGJsb2IsIGwzX29mZik7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgZnRfZml4dXBfbDJjYWNoZSh4KQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmdF9maXh1cF9jYWNoZSh2b2lkICpibG9iKQoreworCWludCBvZmY7CisKKwlvZmYgPSBmZHRfbm9kZV9vZmZzZXRfYnlfcHJvcF92YWx1ZShibG9iLCAtMSwgImRldmljZV90eXBlIiwgImNwdSIsIDQpOworCisJd2hpbGUgKG9mZiAhPSAtRkRUX0VSUl9OT1RGT1VORCkgeworCQl1MzIgbDFjZmcwID0gbWZzcHIoU1BSTl9MMUNGRzApOworCQl1MzIgbDFjZmcxID0gbWZzcHIoU1BSTl9MMUNGRzEpOworCQl1MzIgaXNpemUsIGlsaW5lX3NpemUsIGludW1fc2V0cywgaW51bV93YXlzOworCQl1MzIgZHNpemUsIGRsaW5lX3NpemUsIGRudW1fc2V0cywgZG51bV93YXlzOworCisJCS8qIGQtc2lkZSBjb25maWcgKi8KKwkJZHNpemUgPSAobDFjZmcwICYgMHg3ZmYpICogMTAyNDsKKwkJZG51bV93YXlzID0gKChsMWNmZzAgPj4gMTEpICYgMHhmZikgKyAxOworCQlkbGluZV9zaXplID0gKCgobDFjZmcwID4+IDIzKSAmIDB4MykgKyAxKSAqIDMyOworCQlkbnVtX3NldHMgPSBkc2l6ZSAvIChkbGluZV9zaXplICogZG51bV93YXlzKTsKKworCQlmZHRfc2V0cHJvcF9jZWxsKGJsb2IsIG9mZiwgImQtY2FjaGUtYmxvY2stc2l6ZSIsIGRsaW5lX3NpemUpOworCQlmZHRfc2V0cHJvcF9jZWxsKGJsb2IsIG9mZiwgImQtY2FjaGUtc2l6ZSIsIGRzaXplKTsKKwkJZmR0X3NldHByb3BfY2VsbChibG9iLCBvZmYsICJkLWNhY2hlLXNldHMiLCBkbnVtX3NldHMpOworCisjaWZkZWYgQ09ORklHX1NZU19DQUNIRV9TVEFTSElORworCQl7CisJCQl1MzIgKnJlZyA9ICh1MzIgKilmZHRfZ2V0cHJvcChibG9iLCBvZmYsICJyZWciLCAwKTsKKwkJCWlmIChyZWcpCisJCQkJZmR0X3NldHByb3BfY2VsbChibG9iLCBvZmYsICJjYWNoZS1zdGFzaC1pZCIsCisJCQkJCSAoKnJlZyAqIDIpICsgMzIgKyAwKTsKKwkJfQorI2VuZGlmCisKKwkJLyogaS1zaWRlIGNvbmZpZyAqLworCQlpc2l6ZSA9IChsMWNmZzEgJiAweDdmZikgKiAxMDI0OworCQlpbnVtX3dheXMgPSAoKGwxY2ZnMSA+PiAxMSkgJiAweGZmKSArIDE7CisJCWlsaW5lX3NpemUgPSAoKChsMWNmZzEgPj4gMjMpICYgMHgzKSArIDEpICogMzI7CisJCWludW1fc2V0cyA9IGlzaXplIC8gKGlsaW5lX3NpemUgKiBpbnVtX3dheXMpOworCisJCWZkdF9zZXRwcm9wX2NlbGwoYmxvYiwgb2ZmLCAiaS1jYWNoZS1ibG9jay1zaXplIiwgaWxpbmVfc2l6ZSk7CisJCWZkdF9zZXRwcm9wX2NlbGwoYmxvYiwgb2ZmLCAiaS1jYWNoZS1zaXplIiwgaXNpemUpOworCQlmZHRfc2V0cHJvcF9jZWxsKGJsb2IsIG9mZiwgImktY2FjaGUtc2V0cyIsIGludW1fc2V0cyk7CisKKwkJb2ZmID0gZmR0X25vZGVfb2Zmc2V0X2J5X3Byb3BfdmFsdWUoYmxvYiwgb2ZmLAorCQkJCSJkZXZpY2VfdHlwZSIsICJjcHUiLCA0KTsKKwl9CisKKwlmdF9maXh1cF9sMmNhY2hlKGJsb2IpOworfQorCisKK3ZvaWQgZmR0X2FkZF9lbmV0X3N0YXNoaW5nKHZvaWQgKmZkdCkKK3sKKwlkb19maXh1cF9ieV9jb21wYXQoZmR0LCAiZ2lhbmZhciIsICJiZC1zdGFzaCIsIE5VTEwsIDAsIDEpOworCisJZG9fZml4dXBfYnlfY29tcGF0X3UzMihmZHQsICJnaWFuZmFyIiwgInJ4LXN0YXNoLWxlbiIsIDk2LCAxKTsKKworCWRvX2ZpeHVwX2J5X2NvbXBhdF91MzIoZmR0LCAiZ2lhbmZhciIsICJyeC1zdGFzaC1pZHgiLCAwLCAxKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19EUEFBX0ZNQU4pIHx8IGRlZmluZWQoQ09ORklHX1NZU19EUEFBX1BNRSkKK3N0YXRpYyB2b2lkIGZ0X2ZpeHVwX2Nsa3Modm9pZCAqYmxvYiwgY29uc3QgY2hhciAqYWxpYXMsIHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwljb25zdCBjaGFyICpwYXRoID0gZmR0X2dldF9hbGlhcyhibG9iLCBhbGlhcyk7CisKKwlpbnQgb2ZmID0gZmR0X3BhdGhfb2Zmc2V0KGJsb2IsIHBhdGgpOworCisJaWYgKG9mZiA+PSAwKSB7CisJCW9mZiA9IGZkdF9zZXRwcm9wX2NlbGwoYmxvYiwgb2ZmLCAiY2xvY2stZnJlcXVlbmN5IiwgZnJlcSk7CisJCWlmIChvZmYgPiAwKQorCQkJcHJpbnRmKCJXQVJOSU5HIGVuYWJsZSB0byBzZXQgY2xvY2stZnJlcXVlbmN5ICIKKwkJCQkiZm9yICVzOiAlc1xuIiwgYWxpYXMsIGZkdF9zdHJlcnJvcihvZmYpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZ0X2ZpeHVwX2RwYWFfY2xrcyh2b2lkICpibG9iKQoreworCXN5c19pbmZvX3Qgc3lzaW5mbzsKKworCWdldF9zeXNfaW5mbygmc3lzaW5mbyk7CisJZnRfZml4dXBfY2xrcyhibG9iLCAiZm1hbjAiLCBzeXNpbmZvLmZyZXFGTWFuWzBdKTsKKworI2lmIChDT05GSUdfU1lTX05VTV9GTUFOID09IDIpCisJZnRfZml4dXBfY2xrcyhibG9iLCAiZm1hbjEiLCBzeXNpbmZvLmZyZXFGTWFuWzFdKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NZU19EUEFBX1BNRQorCWZ0X2ZpeHVwX2Nsa3MoYmxvYiwgInBtZSIsIHN5c2luZm8uZnJlcVBNRSk7CisjZW5kaWYKK30KKyNlbHNlCisjZGVmaW5lIGZ0X2ZpeHVwX2RwYWFfY2xrcyh4KQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUUUKK3N0YXRpYyB2b2lkIGZ0X2ZpeHVwX3FlX3NudW0odm9pZCAqYmxvYikKK3sKKwl1bnNpZ25lZCBpbnQgc3ZyOworCisJc3ZyID0gbWZzcHIoU1BSTl9TVlIpOworCWlmIChTVlJfU09DX1ZFUihzdnIpID09IFNWUl84NTY5X0UpIHsKKwkJaWYoSVNfU1ZSX1JFVihzdnIsIDEsIDApKQorCQkJZG9fZml4dXBfYnlfY29tcGF0X3UzMihibG9iLCAiZnNsLHFlIiwKKwkJCQkiZnNsLHFlLW51bS1zbnVtcyIsIDQ2LCAxKTsKKwkJZWxzZQorCQkJZG9fZml4dXBfYnlfY29tcGF0X3UzMihibG9iLCAiZnNsLHFlIiwKKwkJCQkiZnNsLHFlLW51bS1zbnVtcyIsIDc2LCAxKTsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBmdF9jcHVfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJaW50IG9mZjsKKwlpbnQgdmFsOworCXN5c19pbmZvX3Qgc3lzaW5mbzsKKworCS8qIGRlbGV0ZSBjcnlwdG8gbm9kZSBpZiBub3Qgb24gYW4gRS1wcm9jZXNzb3IgKi8KKwlpZiAoIUlTX0VfUFJPQ0VTU09SKGdldF9zdnIoKSkpCisJCWZkdF9maXh1cF9jcnlwdG9fbm9kZShibG9iLCAwKTsKKworCWZkdF9maXh1cF9ldGhlcm5ldChibG9iKTsKKworCWZkdF9hZGRfZW5ldF9zdGFzaGluZyhibG9iKTsKKworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LAorCQkidGltZWJhc2UtZnJlcXVlbmN5IiwgZ2V0X3RiY2xrKCksIDEpOworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LAorCQkiYnVzLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKwlnZXRfc3lzX2luZm8oJnN5c2luZm8pOworCW9mZiA9IGZkdF9ub2RlX29mZnNldF9ieV9wcm9wX3ZhbHVlKGJsb2IsIC0xLCAiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNCk7CisJd2hpbGUgKG9mZiAhPSAtRkRUX0VSUl9OT1RGT1VORCkgeworCQl1MzIgKnJlZyA9ICh1MzIgKilmZHRfZ2V0cHJvcChibG9iLCBvZmYsICJyZWciLCAwKTsKKwkJdmFsID0gY3B1X3RvX2ZkdDMyKHN5c2luZm8uZnJlcVByb2Nlc3NvclsqcmVnXSk7CisJCWZkdF9zZXRwcm9wKGJsb2IsIG9mZiwgImNsb2NrLWZyZXF1ZW5jeSIsICZ2YWwsIDQpOworCQlvZmYgPSBmZHRfbm9kZV9vZmZzZXRfYnlfcHJvcF92YWx1ZShibG9iLCBvZmYsICJkZXZpY2VfdHlwZSIsCisJCQkJCQkJImNwdSIsIDQpOworCX0KKwlkb19maXh1cF9ieV9wcm9wX3UzMihibG9iLCAiZGV2aWNlX3R5cGUiLCAic29jIiwgNCwKKwkJImJ1cy1mcmVxdWVuY3kiLCBiZC0+YmlfYnVzZnJlcSwgMSk7CisKKwlkb19maXh1cF9ieV9jb21wYXRfdTMyKGJsb2IsICJmc2wscHEzLWxvY2FsYnVzIiwKKwkJImJ1cy1mcmVxdWVuY3kiLCBnZC0+bGJjX2NsaywgMSk7CisJZG9fZml4dXBfYnlfY29tcGF0X3UzMihibG9iLCAiZnNsLGVsYmMiLAorCQkiYnVzLWZyZXF1ZW5jeSIsIGdkLT5sYmNfY2xrLCAxKTsKKyNpZmRlZiBDT05GSUdfUUUKKwlmdF9xZV9zZXR1cChibG9iKTsKKwlmdF9maXh1cF9xZV9zbnVtKGJsb2IpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1lTX05TMTY1NTAKKwlkb19maXh1cF9ieV9jb21wYXRfdTMyKGJsb2IsICJuczE2NTUwIiwKKwkJImNsb2NrLWZyZXF1ZW5jeSIsIENPTkZJR19TWVNfTlMxNjU1MF9DTEssIDEpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ1BNMgorCWRvX2ZpeHVwX2J5X2NvbXBhdF91MzIoYmxvYiwgImZzbCxjcG0yLXNjYy11YXJ0IiwKKwkJImN1cnJlbnQtc3BlZWQiLCBiZC0+YmlfYmF1ZHJhdGUsIDEpOworCisJZG9fZml4dXBfYnlfY29tcGF0X3UzMihibG9iLCAiZnNsLGNwbTItYnJnIiwKKwkJImNsb2NrLWZyZXF1ZW5jeSIsIGJkLT5iaV9icmdmcmVxLCAxKTsKKyNlbmRpZgorCisJZmR0X2ZpeHVwX21lbW9yeShibG9iLCAodTY0KWJkLT5iaV9tZW1zdGFydCwgKHU2NCliZC0+YmlfbWVtc2l6ZSk7CisKKyNpZmRlZiBDT05GSUdfTVAKKwlmdF9maXh1cF9jcHUoYmxvYiwgKHU2NCliZC0+YmlfbWVtc3RhcnQgKyAodTY0KWJkLT5iaV9tZW1zaXplKTsKKyNlbmRpZgorCWZ0X2ZpeHVwX251bV9jb3JlcyhibG9iKTsKKworCWZ0X2ZpeHVwX2NhY2hlKGJsb2IpOworCisjaWYgZGVmaW5lZChDT05GSUdfRlNMX0VTREhDKQorCWZkdF9maXh1cF9lc2RoYyhibG9iLCBiZCk7CisjZW5kaWYKKworCWZ0X2ZpeHVwX2RwYWFfY2xrcyhibG9iKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9maXhlZF9pdm9yLlMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvZml4ZWRfaXZvci5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMGNhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvZml4ZWRfaXZvci5TCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIEt1bWFyIEdhbGEgPGt1bWFyLmdhbGFAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgb3RoZXIgYXNtIGNvZGUgc2luY2UKKyAqIHdlIHdpbGwgd2FudCB0byBleGVjdXRlIHRoaXMgb24gYm90aCB0aGUgcHJpbWFyeSBjb3JlIHdoZW4KKyAqIGl0IGRvZXMgYSBib290bSBhbmQgdGhlIHNlY29uZGFyeSBjb3JlJ3MgdGhhdCBnZXQgcmVsZWFzZWQKKyAqIG91dCBvZiB0aGUgc3BpbiB0YWJsZSAqLworCisjZGVmaW5lIFNFVF9JVk9SKHZlY3Rvcl9udW1iZXIsIHZlY3Rvcl9vZmZzZXQpCVwKKwlsaQlyMyx2ZWN0b3Jfb2Zmc2V0QGw7IAkJXAorCW10c3ByCVNQUk5fSVZPUiMjdmVjdG9yX251bWJlcixyMzsKKworI2RlZmluZSBTRVRfR0lWT1IodmVjdG9yX251bWJlciwgdmVjdG9yX29mZnNldCkJXAorCWxpCXIzLHZlY3Rvcl9vZmZzZXRAbDsgCQlcCisJbXRzcHIJU1BSTl9HSVZPUiMjdmVjdG9yX251bWJlcixyMzsKKworCVNFVF9JVk9SKDAsIDB4MDIwKSAvKiBDcml0aWNhbCBJbnB1dCAqLworCVNFVF9JVk9SKDEsIDB4MDAwKSAvKiBNYWNoaW5lIENoZWNrICovCisJU0VUX0lWT1IoMiwgMHgwNjApIC8qIERhdGEgU3RvcmFnZSAqLworCVNFVF9JVk9SKDMsIDB4MDgwKSAvKiBJbnN0cnVjdGlvbiBTdG9yYWdlICovCisJU0VUX0lWT1IoNCwgMHgwYTApIC8qIEV4dGVybmFsIElucHV0ICovCisJU0VUX0lWT1IoNSwgMHgwYzApIC8qIEFsaWdubWVudCAqLworCVNFVF9JVk9SKDYsIDB4MGUwKSAvKiBQcm9ncmFtICovCisJU0VUX0lWT1IoNywgMHgxMDApIC8qIEZQIFVuYXZhaWxhYmxlICovCisJU0VUX0lWT1IoOCwgMHgxMjApIC8qIFN5c3RlbSBDYWxsICovCisJU0VUX0lWT1IoOSwgMHgxNDApIC8qIEF1eGlsaWFyeSBQcm9jZXNzb3IgVW5hdmFpbGFibGUgKi8KKwlTRVRfSVZPUigxMCwgMHgxNjApIC8qIERlY3JlbWVudGVyICovCisJU0VUX0lWT1IoMTEsIDB4MTgwKSAvKiBGaXhlZCBJbnRlcnZhbCBUaW1lciAqLworCVNFVF9JVk9SKDEyLCAweDFhMCkgLyogV2F0Y2hkb2cgVGltZXIgKi8KKwlTRVRfSVZPUigxMywgMHgxYzApIC8qIERhdGEgVExCIEVycm9yICovCisJU0VUX0lWT1IoMTQsIDB4MWUwKSAvKiBJbnN0cnVjdGlvbiBUTEIgRXJyb3IgKi8KKwlTRVRfSVZPUigxNSwgMHgwNDApIC8qIERlYnVnICovCisKKy8qIGU1MDB2MSAmIGU1MDB2MiBvbmx5ICovCisjaWZuZGVmIENPTkZJR19FNTAwTUMKKwlTRVRfSVZPUigzMiwgMHgyMDApIC8qIFNQRSBVbmF2YWlsYWJsZSAqLworCVNFVF9JVk9SKDMzLCAweDIyMCkgLyogRW1iZWRkZWQgRlAgRGF0YSAqLworCVNFVF9JVk9SKDM0LCAweDI0MCkgLyogRW1iZWRkZWQgRlAgUm91bmQgKi8KKyNlbmRpZgorCisJU0VUX0lWT1IoMzUsIDB4MjYwKSAvKiBQZXJmb3JtYW5jZSBtb25pdG9yICovCisKKy8qIGU1MDBtYyBvbmx5ICovCisjaWZkZWYgQ09ORklHX0U1MDBNQworCVNFVF9JVk9SKDM2LCAweDI4MCkgLyogUHJvY2Vzc29yIGRvb3JiZWxsICovCisJU0VUX0lWT1IoMzcsIDB4MmEwKSAvKiBQcm9jZXNzb3IgZG9vcmJlbGwgY3JpdGljYWwgKi8KKwlTRVRfSVZPUigzOCwgMHgyYzApIC8qIEd1ZXN0IFByb2Nlc3NvciBkb29yYmVsbCAqLworCVNFVF9JVk9SKDM5LCAweDJlMCkgLyogR3Vlc3QgUHJvY2Vzc29yIGNyaXRpY2FsICYgbWFjaGluZSBjaGVjayAqLworCVNFVF9JVk9SKDQwLCAweDMwMCkgLyogSHlwZXJ2aXNvciBzeXN0ZW0gY2FsbCAqLworCVNFVF9JVk9SKDQxLCAweDMyMCkgLyogSHlwZXJ2aXNvciBQcml2aWxlZGdlICovCisKKwlTRVRfR0lWT1IoMiwgMHgwNjApIC8qIEd1ZXN0IERhdGEgU3RvcmFnZSAqLworCVNFVF9HSVZPUigzLCAweDA4MCkgLyogR3Vlc3QgSW5zdHJ1Y3Rpb24gU3RvcmFnZSAqLworCVNFVF9HSVZPUig0LCAweDBhMCkgLyogR3Vlc3QgRXh0ZXJuYWwgSW5wdXQgKi8KKwlTRVRfR0lWT1IoOCwgMHgxMjApIC8qIEd1ZXN0IFN5c3RlbSBDYWxsICovCisJU0VUX0dJVk9SKDEzLCAweDFjMCkgLyogR3Vlc3QgRGF0YSBUTEIgRXJyb3IgKi8KKwlTRVRfR0lWT1IoMTQsIDB4MWUwKSAvKiBHdWVzdCBJbnN0cnVjdGlvbiBUTEIgRXJyb3IgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2ludGVycnVwdHMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5MzY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgKDQ0MCBwb3J0KQorICogU2NvdHQgTWNOdXR0LCBBcnRlc3luIENvbW11bmljYXRpb24gUHJvZHVjcywgc21jbnV0dEBhcnRzeW5jcC5jb20KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDMgTW90b3JvbGEgSW5jLiAoTVBDODV4eCBwb3J0KQorICogWGlhbmdodWEgWGlhbyAoWC5YaWFvQG1vdG9yb2xhLmNvbSkKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitpbnQgaW50ZXJydXB0X2luaXRfY3B1KHVuc2lnbmVkIGludCAqZGVjcmVtZW50ZXJfY291bnQpCit7CisJY2Nzcl9waWNfdCBfX2lvbWVtICpwaWMgPSAodm9pZCAqKUNPTkZJR19TWVNfTVBDODV4eF9QSUNfQUREUjsKKworCW91dF9iZTMyKCZwaWMtPmdjciwgTVBDODV4eF9QSUNHQ1JfUlNUKTsKKwl3aGlsZSAoaW5fYmUzMigmcGljLT5nY3IpICYgTVBDODV4eF9QSUNHQ1JfUlNUKQorCQk7CisJb3V0X2JlMzIoJnBpYy0+Z2NyLCBNUEM4NXh4X1BJQ0dDUl9NKTsKKwlpbl9iZTMyKCZwaWMtPmdjcik7CisKKwkqZGVjcmVtZW50ZXJfY291bnQgPSBnZXRfdGJjbGsoKSAvIENPTkZJR19TWVNfSFo7CisKKwkvKiBQSUUgaXMgc2FtZSBhcyBESUUsIGRlYyBpbnRlcnJ1cHQgZW5hYmxlICovCisJbXRzcHIoU1BSTl9UQ1IsIFRDUl9QSUUpOworCisjaWZkZWYgQ09ORklHX0lOVEVSUlVQVFMKKwlwaWMtPmlpdnByMSA9IDB4ODEwMDAxOwkvKiA1MDIyMCBlbmFibGUgZWNtIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHIxQCV4ID0gJXhcbiIsICh1aW50KSZwaWMtPmlpdnByMSwgcGljLT5paXZwcjEpOworCisJcGljLT5paXZwcjIgPSAweDgxMDAwMjsJLyogNTAyNDAgZW5hYmxlIGRkciBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMkAleCA9ICV4XG4iLCAodWludCkmcGljLT5paXZwcjIsIHBpYy0+aWl2cHIyKTsKKworCXBpYy0+aWl2cHIzID0gMHg4MTAwMDM7CS8qIDUwMjYwIGVuYWJsZSBsYmMgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjNAJXggPSAleFxuIiwgKHVpbnQpJnBpYy0+aWl2cHIzLCBwaWMtPmlpdnByMyk7CisKKyNpZmRlZiBDT05GSUdfUENJMQorCXBpYy0+aWl2cHI4ID0gMHg4MTAwMDg7CS8qIGVuYWJsZSBwY2kxIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHI4QCV4ID0gJXhcbiIsICh1aW50KSZwaWMtPmlpdnByOCwgcGljLT5paXZwcjgpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfUENJMikgfHwgZGVmaW5lZChDT05GSUdfUENJRTIpCisJcGljLT5paXZwcjkgPSAweDgxMDAwOTsJLyogZW5hYmxlIHBjaTEgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjlAJXggPSAleFxuIiwgKHVpbnQpJnBpYy0+aWl2cHI5LCBwaWMtPmlpdnByOSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENJRTEKKwlwaWMtPmlpdnByMTAgPSAweDgxMDAwYTsJLyogZW5hYmxlIHBjaWUxIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHIxMEAleCA9ICV4XG4iLCAodWludCkmcGljLT5paXZwcjEwLCBwaWMtPmlpdnByMTApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSUUzCisJcGljLT5paXZwcjExID0gMHg4MTAwMGI7CS8qIGVuYWJsZSBwY2llMyBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMTFAJXggPSAleFxuIiwgKHVpbnQpJnBpYy0+aWl2cHIxMSwgcGljLT5paXZwcjExKTsKKyNlbmRpZgorCisJcGljLT5jdHByPTA7CQkvKiA0MDA4MCBjbGVhciBjdXJyZW50IHRhc2sgcHJpb3JpdHkgcmVnaXN0ZXIgKi8KKyNlbmRpZgorCisJcmV0dXJuICgwKTsKK30KKworLyogSW5zdGFsbCBhbmQgZnJlZSBhIGludGVycnVwdCBoYW5kbGVyLiBOb3QgaW1wbGVtZW50ZWQgeWV0LiAqLworCit2b2lkCitpcnFfaW5zdGFsbF9oYW5kbGVyKGludCB2ZWMsIGludGVycnVwdF9oYW5kbGVyX3QgKmhhbmRsZXIsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQKK2lycV9mcmVlX2hhbmRsZXIoaW50IHZlYykKK3sKKwlyZXR1cm47Cit9CisKK3ZvaWQgdGltZXJfaW50ZXJydXB0X2NwdShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBQSVMgaXMgc2FtZSBhcyBESVMsIGRlYyBpbnRlcnJ1cHQgc3RhdHVzICovCisJbXRzcHIoU1BSTl9UU1IsIFRTUl9QSVMpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0lSUSkKKy8qIGlycWluZm8gLSBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBQQ0kgZGV2aWNlcyxub3QgaW1wbGVtZW50ZWQuICovCitpbnQgZG9faXJxaW5mbyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L21wLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjZiZjMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L21wLmMKQEAgLTAsMCArMSwzNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxpb3BvcnRzLmg+CisjaW5jbHVkZSA8bG1iLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9mc2xfbGF3Lmg+CisjaW5jbHVkZSAibXAuaCIKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3UzMiBnZXRfbXlfaWQoKQoreworCXJldHVybiBtZnNwcihTUFJOX1BJUik7Cit9CisKK2ludCBjcHVfcmVzZXQoaW50IG5yKQoreworCXZvbGF0aWxlIGNjc3JfcGljX3QgKnBpYyA9ICh2b2lkICopKENPTkZJR19TWVNfTVBDODV4eF9QSUNfQUREUik7CisJb3V0X2JlMzIoJnBpYy0+cGlyLCAxIDw8IG5yKTsKKwkvKiB0aGUgZHVtbXkgcmVhZCB3b3JrcyBhcm91bmQgYW4gZXJyYXRhIG9uIGVhcmx5IDg1eHggTVAgUElDcyAqLworCSh2b2lkKWluX2JlMzIoJnBpYy0+cGlyKTsKKwlvdXRfYmUzMigmcGljLT5waXIsIDB4MCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNwdV9zdGF0dXMoaW50IG5yKQoreworCXUzMiAqdGFibGUsIGlkID0gZ2V0X215X2lkKCk7CisKKwlpZiAobnIgPT0gaWQpIHsKKwkJdGFibGUgPSAodTMyICopZ2V0X3NwaW5fdmlydF9hZGRyKCk7CisJCXByaW50ZigidGFibGUgYmFzZSBAIDB4JXBcbiIsIHRhYmxlKTsKKwl9IGVsc2UgeworCQl0YWJsZSA9ICh1MzIgKilnZXRfc3Bpbl92aXJ0X2FkZHIoKSArIG5yICogTlVNX0JPT1RfRU5UUlk7CisJCXByaW50ZigiUnVubmluZyBvbiBjcHUgJWRcbiIsIGlkKTsKKwkJcHJpbnRmKCJcbiIpOworCQlwcmludGYoInRhYmxlIEAgMHglcFxuIiwgdGFibGUpOworCQlwcmludGYoIiAgIGFkZHIgLSAweCUwOHhcbiIsIHRhYmxlW0JPT1RfRU5UUllfQUREUl9MT1dFUl0pOworCQlwcmludGYoIiAgIHBpciAgLSAweCUwOHhcbiIsIHRhYmxlW0JPT1RfRU5UUllfUElSXSk7CisJCXByaW50ZigiICAgcjMgICAtIDB4JTA4eFxuIiwgdGFibGVbQk9PVF9FTlRSWV9SM19MT1dFUl0pOworCQlwcmludGYoIiAgIHI2ICAgLSAweCUwOHhcbiIsIHRhYmxlW0JPT1RfRU5UUllfUjZfTE9XRVJdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19GU0xfQ09SRU5FVAoraW50IGNwdV9kaXNhYmxlKGludCBucikKK3sKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfR1VUU19BRERSKTsKKworCXNldGJpdHNfYmUzMigmZ3VyLT5jb3JlZGlzcmwsIDEgPDwgbnIpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQoraW50IGNwdV9kaXNhYmxlKGludCBucikKK3sKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfR1VUU19BRERSKTsKKworCXN3aXRjaCAobnIpIHsKKwljYXNlIDA6CisJCXNldGJpdHNfYmUzMigmZ3VyLT5kZXZkaXNyLCBNUEM4NXh4X0RFVkRJU1JfQ1BVMCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2V0Yml0c19iZTMyKCZndXItPmRldmRpc3IsIE1QQzg1eHhfREVWRElTUl9DUFUxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJJbnZhbGlkIGNwdSBudW1iZXIgZm9yIGRpc2FibGUgJWRcbiIsIG5yKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHU4IGJvb3RfZW50cnlfbWFwWzRdID0geworCTAsCisJQk9PVF9FTlRSWV9QSVIsCisJQk9PVF9FTlRSWV9SM19MT1dFUiwKKwlCT09UX0VOVFJZX1I2X0xPV0VSLAorfTsKKworaW50IGNwdV9yZWxlYXNlKGludCBuciwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1MzIgaSwgdmFsLCAqdGFibGUgPSAodTMyICopZ2V0X3NwaW5fdmlydF9hZGRyKCkgKyBuciAqIE5VTV9CT09UX0VOVFJZOworCXU2NCBib290X2FkZHI7CisKKwlpZiAobnIgPT0gZ2V0X215X2lkKCkpIHsKKwkJcHJpbnRmKCJJbnZhbGlkIHRvIHJlbGVhc2UgdGhlIGJvb3QgY29yZS5cblxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChhcmdjICE9IDQpIHsKKwkJcHJpbnRmKCJJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcmVsZWFzZS5cblxuIik7CisJCXJldHVybiAxOworCX0KKworCWJvb3RfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbChhcmd2WzBdLCBOVUxMLCAxNik7CisKKwkvKiBoYW5kbGUgcGlyLCByMywgcjYgKi8KKwlmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7CisJCWlmIChhcmd2W2ldWzBdICE9ICctJykgeworCQkJdTggZW50cnkgPSBib290X2VudHJ5X21hcFtpXTsKKwkJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbaV0sIE5VTEwsIDE2KTsKKwkJCXRhYmxlW2VudHJ5XSA9IHZhbDsKKwkJfQorCX0KKworCXRhYmxlW0JPT1RfRU5UUllfQUREUl9VUFBFUl0gPSAodTMyKShib290X2FkZHIgPj4gMzIpOworCisJLyogZW5zdXJlIGFsbCB0YWJsZSB1cGRhdGVzIGNvbXBsZXRlIGJlZm9yZSBmaW5hbCBhZGRyZXNzIHdyaXRlICovCisJZWllaW8oKTsKKworCXRhYmxlW0JPT1RfRU5UUllfQUREUl9MT1dFUl0gPSAodTMyKShib290X2FkZHIgJiAweGZmZmZmZmZmKTsKKworCXJldHVybiAwOworfQorCit1MzIgZGV0ZXJtaW5lX21wX2Jvb3RwZyh2b2lkKQoreworCS8qIGlmIHdlIGhhdmUgNEcgb3IgbW9yZSBvZiBtZW1vcnksIHB1dCB0aGUgYm9vdCBwYWdlIGF0IDRHYi00ayAqLworCWlmICgodTY0KWdkLT5yYW1fc2l6ZSA+IDB4ZmZmZmYwMDApCisJCXJldHVybiAoMHhmZmZmZjAwMCk7CisKKwlyZXR1cm4gKGdkLT5yYW1fc2l6ZSAtIDQwOTYpOworfQorCit1bG9uZyBnZXRfc3Bpbl9waHlzX2FkZHIodm9pZCkKK3sKKwlleHRlcm4gdWxvbmcgX19zZWNvbmRhcnlfc3RhcnRfcGFnZTsKKwlleHRlcm4gdWxvbmcgX19zcGluX3RhYmxlOworCisJcmV0dXJuIChkZXRlcm1pbmVfbXBfYm9vdHBnKCkgKworCQkodWxvbmcpJl9fc3Bpbl90YWJsZSAtICh1bG9uZykmX19zZWNvbmRhcnlfc3RhcnRfcGFnZSk7Cit9CisKK3Vsb25nIGdldF9zcGluX3ZpcnRfYWRkcih2b2lkKQoreworCWV4dGVybiB1bG9uZyBfX3NlY29uZGFyeV9zdGFydF9wYWdlOworCWV4dGVybiB1bG9uZyBfX3NwaW5fdGFibGU7CisKKwlyZXR1cm4gKENPTkZJR19CUFRSX1ZJUlRfQUREUiArCisJCSh1bG9uZykmX19zcGluX3RhYmxlIC0gKHVsb25nKSZfX3NlY29uZGFyeV9zdGFydF9wYWdlKTsKK30KKworI2lmZGVmIENPTkZJR19GU0xfQ09SRU5FVAorc3RhdGljIHZvaWQgcGxhdF9tcF91cCh1bnNpZ25lZCBsb25nIGJvb3RwZykKK3sKKwl1MzIgdXAsIGNwdV91cF9tYXNrLCB3aG9hbWk7CisJdTMyICp0YWJsZSA9ICh1MzIgKilnZXRfc3Bpbl92aXJ0X2FkZHIoKTsKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXI7CisJdm9sYXRpbGUgY2Nzcl9sb2NhbF90ICpjY207CisJdm9sYXRpbGUgY2Nzcl9yY3BtX3QgKnJjcG07CisJdm9sYXRpbGUgY2Nzcl9waWNfdCAqcGljOworCWludCB0aW1lb3V0ID0gMTA7CisJdTMyIG5yX2NwdXM7CisJc3RydWN0IGxhd19lbnRyeSBlOworCisJZ3VyID0gKHZvaWQgKikoQ09ORklHX1NZU19NUEM4NXh4X0dVVFNfQUREUik7CisJY2NtID0gKHZvaWQgKikoQ09ORklHX1NZU19GU0xfQ09SRU5FVF9DQ01fQUREUik7CisJcmNwbSA9ICh2b2lkICopKENPTkZJR19TWVNfRlNMX0NPUkVORVRfUkNQTV9BRERSKTsKKwlwaWMgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfUElDX0FERFIpOworCisJbnJfY3B1cyA9ICgoaW5fYmUzMigmcGljLT5mcnIpID4+IDgpICYgMHhmZikgKyAxOworCisJd2hvYW1pID0gaW5fYmUzMigmcGljLT53aG9hbWkpOworCWNwdV91cF9tYXNrID0gMSA8PCB3aG9hbWk7CisJb3V0X2JlMzIoJmNjbS0+YnN0cmwsIGJvb3RwZyk7CisKKwllID0gZmluZF9sYXcoYm9vdHBnKTsKKwlvdXRfYmUzMigmY2NtLT5ic3RyYXIsIExBV19FTiB8IGUudHJndF9pZCA8PCAyMCB8IExBV19TSVpFXzRLKTsKKworCS8qIHJlYWRiYWNrIHRvIHN5bmMgd3JpdGUgKi8KKwlpbl9iZTMyKCZjY20tPmJzdHJhcik7CisKKwkvKiBkaXNhYmxlIHRpbWUgYmFzZSBhdCB0aGUgcGxhdGZvcm0gKi8KKwlvdXRfYmUzMigmcmNwbS0+Y3RiZW5ybCwgY3B1X3VwX21hc2spOworCisJLyogcmVsZWFzZSB0aGUgaG91bmRzICovCisJdXAgPSAoKDEgPDwgbnJfY3B1cykgLSAxKTsKKwlvdXRfYmUzMigmZ3VyLT5icnJsLCB1cCk7CisKKwkvKiB3YWl0IGZvciBldmVyeW9uZSAqLworCXdoaWxlICh0aW1lb3V0KSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbnJfY3B1czsgaSsrKSB7CisJCQlpZiAodGFibGVbaSAqIE5VTV9CT09UX0VOVFJZICsgQk9PVF9FTlRSWV9BRERSX0xPV0VSXSkKKwkJCQljcHVfdXBfbWFzayB8PSAoMSA8PCBpKTsKKwkJfTsKKworCQlpZiAoKGNwdV91cF9tYXNrICYgdXApID09IHVwKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwMCk7CisJCXRpbWVvdXQtLTsKKwl9CisKKwlpZiAodGltZW91dCA9PSAwKQorCQlwcmludGYoIkNQVSB1cCB0aW1lb3V0LiBDUFUgdXAgbWFzayBpcyAleCBzaG91bGQgYmUgJXhcbiIsCisJCQljcHVfdXBfbWFzaywgdXApOworCisJLyogZW5hYmxlIHRpbWUgYmFzZSBhdCB0aGUgcGxhdGZvcm0gKi8KKwlvdXRfYmUzMigmcmNwbS0+Y3RiZW5ybCwgMCk7CisJbXRzcHIoU1BSTl9UQldVLCAwKTsKKwltdHNwcihTUFJOX1RCV0wsIDApOworCW91dF9iZTMyKCZyY3BtLT5jdGJlbnJsLCAoMSA8PCBucl9jcHVzKSAtIDEpOworCisjaWZkZWYgQ09ORklHX01QQzh4eHhfRElTQUJMRV9CUFRSCisJLyoKKwkgKiBEaXNhYmxpbmcgQm9vdCBQYWdlIFRyYW5zbGF0aW9uIGFsbG93cyB0aGUgbWVtb3J5IHJlZ2lvbiAweGZmZmZmMDAwCisJICogdG8gMHhmZmZmZmZmZiB0byBiZSB1c2VkIG5vcm1hbGx5LiAgTGVhdmluZyBCb290IFBhZ2UgVHJhbnNsYXRpb24KKwkgKiBlbmFibGVkIHJlbWFwcyAweGZmZmZmMDAwIHRvIFNEUkFNIHdoaWNoIG1ha2VzIHRoYXQgbWVtb3J5IHJlZ2lvbgorCSAqIHVudXNhYmxlIGZvciBub3JtYWwgb3BlcmF0aW9uIGJ1dCBpdCBkb2VzIGFsbG93IE9TZXMgdG8gZWFzaWx5CisJICogcmVzZXQgYSBwcm9jZXNzb3IgY29yZSB0byBwdXQgaXQgYmFjayBpbnRvIFUtQm9vdCdzIHNwaW5sb29wLgorCSAqLworCWNscmJpdHNfYmUzMigmZWNtLT5icHRyLCAweDgwMDAwMDAwKTsKKyNlbmRpZgorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHBsYXRfbXBfdXAodW5zaWduZWQgbG9uZyBib290cGcpCit7CisJdTMyIHVwLCBjcHVfdXBfbWFzaywgd2hvYW1pOworCXUzMiAqdGFibGUgPSAodTMyICopZ2V0X3NwaW5fdmlydF9hZGRyKCk7CisJdm9sYXRpbGUgdTMyIGJwY3I7CisJdm9sYXRpbGUgY2Nzcl9sb2NhbF9lY21fdCAqZWNtID0gKHZvaWQgKikoQ09ORklHX1NZU19NUEM4NXh4X0VDTV9BRERSKTsKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfR1VUU19BRERSKTsKKwl2b2xhdGlsZSBjY3NyX3BpY190ICpwaWMgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfUElDX0FERFIpOworCXUzMiBkZXZkaXNyOworCWludCB0aW1lb3V0ID0gMTA7CisKKwl3aG9hbWkgPSBpbl9iZTMyKCZwaWMtPndob2FtaSk7CisJb3V0X2JlMzIoJmVjbS0+YnB0ciwgMHg4MDAwMDAwMCB8IChib290cGcgPj4gMTIpKTsKKworCS8qIGRpc2FibGUgdGltZSBiYXNlIGF0IHRoZSBwbGF0Zm9ybSAqLworCWRldmRpc3IgPSBpbl9iZTMyKCZndXItPmRldmRpc3IpOworCWlmICh3aG9hbWkpCisJCWRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1RCMDsKKwllbHNlCisJCWRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1RCMTsKKwlvdXRfYmUzMigmZ3VyLT5kZXZkaXNyLCBkZXZkaXNyKTsKKworCS8qIHJlbGVhc2UgdGhlIGhvdW5kcyAqLworCXVwID0gKCgxIDw8IGNwdV9udW1jb3JlcygpKSAtIDEpOworCWJwY3IgPSBpbl9iZTMyKCZlY20tPmVlYnBjcik7CisJYnBjciB8PSAodXAgPDwgMjQpOworCW91dF9iZTMyKCZlY20tPmVlYnBjciwgYnBjcik7CisJYXNtKCJzeW5jOyBpc3luYzsgbXN5bmMiKTsKKworCWNwdV91cF9tYXNrID0gMSA8PCB3aG9hbWk7CisJLyogd2FpdCBmb3IgZXZlcnlvbmUgKi8KKwl3aGlsZSAodGltZW91dCkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGNwdV9udW1jb3JlcygpOyBpKyspIHsKKwkJCWlmICh0YWJsZVtpICogTlVNX0JPT1RfRU5UUlkgKyBCT09UX0VOVFJZX0FERFJfTE9XRVJdKQorCQkJCWNwdV91cF9tYXNrIHw9ICgxIDw8IGkpOworCQl9OworCisJCWlmICgoY3B1X3VwX21hc2sgJiB1cCkgPT0gdXApCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTAwKTsKKwkJdGltZW91dC0tOworCX0KKworCWlmICh0aW1lb3V0ID09IDApCisJCXByaW50ZigiQ1BVIHVwIHRpbWVvdXQuIENQVSB1cCBtYXNrIGlzICV4IHNob3VsZCBiZSAleFxuIiwKKwkJCWNwdV91cF9tYXNrLCB1cCk7CisKKwkvKiBlbmFibGUgdGltZSBiYXNlIGF0IHRoZSBwbGF0Zm9ybSAqLworCWlmICh3aG9hbWkpCisJCWRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1RCMTsKKwllbHNlCisJCWRldmRpc3IgfD0gTVBDODV4eF9ERVZESVNSX1RCMDsKKwlvdXRfYmUzMigmZ3VyLT5kZXZkaXNyLCBkZXZkaXNyKTsKKwltdHNwcihTUFJOX1RCV1UsIDApOworCW10c3ByKFNQUk5fVEJXTCwgMCk7CisKKwlkZXZkaXNyICY9IH4oTVBDODV4eF9ERVZESVNSX1RCMCB8IE1QQzg1eHhfREVWRElTUl9UQjEpOworCW91dF9iZTMyKCZndXItPmRldmRpc3IsIGRldmRpc3IpOworCisjaWZkZWYgQ09ORklHX01QQzh4eHhfRElTQUJMRV9CUFRSCisJLyoKKwkgKiBEaXNhYmxpbmcgQm9vdCBQYWdlIFRyYW5zbGF0aW9uIGFsbG93cyB0aGUgbWVtb3J5IHJlZ2lvbiAweGZmZmZmMDAwCisJICogdG8gMHhmZmZmZmZmZiB0byBiZSB1c2VkIG5vcm1hbGx5LiAgTGVhdmluZyBCb290IFBhZ2UgVHJhbnNsYXRpb24KKwkgKiBlbmFibGVkIHJlbWFwcyAweGZmZmZmMDAwIHRvIFNEUkFNIHdoaWNoIG1ha2VzIHRoYXQgbWVtb3J5IHJlZ2lvbgorCSAqIHVudXNhYmxlIGZvciBub3JtYWwgb3BlcmF0aW9uIGJ1dCBpdCBkb2VzIGFsbG93IE9TZXMgdG8gZWFzaWx5CisJICogcmVzZXQgYSBwcm9jZXNzb3IgY29yZSB0byBwdXQgaXQgYmFjayBpbnRvIFUtQm9vdCdzIHNwaW5sb29wLgorCSAqLworCWNscmJpdHNfYmUzMigmZWNtLT5icHRyLCAweDgwMDAwMDAwKTsKKyNlbmRpZgorfQorI2VuZGlmCisKK3ZvaWQgY3B1X21wX2xtYl9yZXNlcnZlKHN0cnVjdCBsbWIgKmxtYikKK3sKKwl1MzIgYm9vdHBnID0gZGV0ZXJtaW5lX21wX2Jvb3RwZygpOworCisJbG1iX3Jlc2VydmUobG1iLCBib290cGcsIDQwOTYpOworfQorCit2b2lkIHNldHVwX21wKHZvaWQpCit7CisJZXh0ZXJuIHVsb25nIF9fc2Vjb25kYXJ5X3N0YXJ0X3BhZ2U7CisJZXh0ZXJuIHVsb25nIF9fYm9vdHBnX2FkZHI7CisJdWxvbmcgZml4dXAgPSAodWxvbmcpJl9fc2Vjb25kYXJ5X3N0YXJ0X3BhZ2U7CisJdTMyIGJvb3RwZyA9IGRldGVybWluZV9tcF9ib290cGcoKTsKKworCS8qIFN0b3JlIHRoZSBib290cGcncyBTRFJBTSBhZGRyZXNzIGZvciB1c2UgYnkgc2Vjb25kYXJ5IENQVSBjb3JlcyAqLworCV9fYm9vdHBnX2FkZHIgPSBib290cGc7CisKKwkvKiBsb29rIGZvciB0aGUgdGxiIGNvdmVyaW5nIHRoZSByZXNldCBwYWdlLCB0aGVyZSBiZXR0ZXIgYmUgb25lICovCisJaW50IGkgPSBmaW5kX3RsYl9pZHgoKHZvaWQgKilDT05GSUdfQlBUUl9WSVJUX0FERFIsIDEpOworCisJLyogd2UgZm91bmQgYSBtYXRjaCAqLworCWlmIChpICE9IC0xKSB7CisJCS8qIG1hcCByZXNldCBwYWdlIHRvIGJvb3RwZyBzbyB3ZSBjYW4gY29weSBjb2RlIHRoZXJlICovCisJCWRpc2FibGVfdGxiKGkpOworCisJCXNldF90bGIoMSwgQ09ORklHX0JQVFJfVklSVF9BRERSLCBib290cGcsIC8qIHRsYiwgZXBuLCBycG4gKi8KKwkJCU1BUzNfU1h8TUFTM19TV3xNQVMzX1NSLCBNQVMyX0l8TUFTMl9HLCAvKiBwZXJtcywgd2ltZ2UgKi8KKwkJCTAsIGksIEJPT0tFX1BBR0VTWl80SywgMSk7IC8qIHRzLCBlc2VsLCB0c2l6ZSwgaXByb3QgKi8KKworCQltZW1jcHkoKHZvaWQgKilDT05GSUdfQlBUUl9WSVJUX0FERFIsICh2b2lkICopZml4dXAsIDQwOTYpOworCisJCXBsYXRfbXBfdXAoYm9vdHBnKTsKKwl9IGVsc2UgeworCQlwdXRzKCJXQVJOSU5HOiBObyByZXNldCBwYWdlIFRMQi4gIgorCQkJIlNraXBwaW5nIHNlY29uZGFyeSBjb3JlIHNldHVwXG4iKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvbXAuaCBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjJjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvbXAuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9fTVBDODVYWF9NUF9IXworI2RlZmluZSBfX01QQzg1WFhfTVBfSF8KKworI2luY2x1ZGUgPGFzbS9tcC5oPgorCit1bG9uZyBnZXRfc3Bpbl9waHlzX2FkZHIodm9pZCk7Cit1bG9uZyBnZXRfc3Bpbl92aXJ0X2FkZHIodm9pZCk7Cit1MzIgZ2V0X215X2lkKHZvaWQpOworCisjZGVmaW5lIEJPT1RfRU5UUllfQUREUl9VUFBFUgkwCisjZGVmaW5lIEJPT1RfRU5UUllfQUREUl9MT1dFUgkxCisjZGVmaW5lIEJPT1RfRU5UUllfUjNfVVBQRVIJMgorI2RlZmluZSBCT09UX0VOVFJZX1IzX0xPV0VSCTMKKyNkZWZpbmUgQk9PVF9FTlRSWV9SRVNWCQk0CisjZGVmaW5lIEJPT1RfRU5UUllfUElSCQk1CisjZGVmaW5lIEJPT1RfRU5UUllfUjZfVVBQRVIJNgorI2RlZmluZSBCT09UX0VOVFJZX1I2X0xPV0VSCTcKKyNkZWZpbmUgTlVNX0JPT1RfRU5UUlkJCTgKKyNkZWZpbmUgU0laRV9CT09UX0VOVFJZCQkoTlVNX0JPT1RfRU5UUlkgKiBzaXplb2YodTMyKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvbXBjODUzNl9zZXJkZXMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9tcGM4NTM2X3NlcmRlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNmE2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvbXBjODUzNl9zZXJkZXMuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1dG9yLCBJbmMuCisgKglEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pbW1hcF84NXh4Lmg+CisKKy8qIFBPUkRFVlNSIHJlZ2lzdGVyICovCisjZGVmaW5lIEdVVFNfUE9SREVWU1JfT0ZGUwkJMHhjCisjZGVmaW5lIEdVVFNfUE9SREVWU1JfU0VSREVTMl9JT19TRUwJMHgzODAwMDAwMAorI2RlZmluZSBHVVRTX1BPUkRFVlNSX1NFUkRFUzJfSU9fU0VMX1NISUZUCTI3CisKKy8qIFNlckRlcyBDUjAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRlNMX1NSRFNDUjBfT0ZGUwkweDAKKyNkZWZpbmUgRlNMX1NSRFNDUjBfVFhFUUFfTUFTSwkweDAwMDA3MDAwCisjZGVmaW5lIEZTTF9TUkRTQ1IwX1RYRVFBX1NHTUlJCTB4MDAwMDQwMDAKKyNkZWZpbmUgRlNMX1NSRFNDUjBfVFhFUUFfU0FUQQkweDAwMDAxMDAwCisjZGVmaW5lIEZTTF9TUkRTQ1IwX1RYRVFFX01BU0sJMHgwMDAwMDcwMAorI2RlZmluZSBGU0xfU1JEU0NSMF9UWEVRRV9TR01JSQkweDAwMDAwNDAwCisjZGVmaW5lIEZTTF9TUkRTQ1IwX1RYRVFFX1NBVEEJMHgwMDAwMDEwMAorCisvKiBTZXJEZXMgQ1IxIHJlZ2lzdGVyICovCisjZGVmaW5lIEZTTF9TUkRTQ1IxX09GRlMJMHg0CisjZGVmaW5lIEZTTF9TUkRTQ1IxX0xBTkVBX01BU0sJMHg4MDIwMDAwMAorI2RlZmluZSBGU0xfU1JEU0NSMV9MQU5FQV9PRkYJMHg4MDIwMDAwMAorI2RlZmluZSBGU0xfU1JEU0NSMV9MQU5FRV9NQVNLCTB4MDgwMjAwMDAKKyNkZWZpbmUgRlNMX1NSRFNDUjFfTEFORUVfT0ZGCTB4MDgwMjAwMDAKKworLyogU2VyRGVzIENSMiByZWdpc3RlciAqLworI2RlZmluZSBGU0xfU1JEU0NSMl9PRkZTCTB4OAorI2RlZmluZSBGU0xfU1JEU0NSMl9FSUNBX01BU0sJMHgwMDAwMWYwMAorI2RlZmluZSBGU0xfU1JEU0NSMl9FSUNBX1NHTUlJCTB4MDAwMDA0MDAKKyNkZWZpbmUgRlNMX1NSRFNDUjJfRUlDQV9TQVRBCTB4MDAwMDE0MDAKKyNkZWZpbmUgRlNMX1NSRFNDUjJfRUlDRV9NQVNLCTB4MDAwMDAwMWYKKyNkZWZpbmUgRlNMX1NSRFNDUjJfRUlDRV9TR01JSQkweDAwMDAwMDA0CisjZGVmaW5lIEZTTF9TUkRTQ1IyX0VJQ0VfU0FUQQkweDAwMDAwMDE0CisKKy8qIFNlckRlcyBDUjMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRlNMX1NSRFNDUjNfT0ZGUwkweGMKKyNkZWZpbmUgRlNMX1NSRFNDUjNfTEFORUFfTUFTSwkweDNmMDAwNzAwCisjZGVmaW5lIEZTTF9TUkRTQ1IzX0xBTkVBX1NHTUlJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRlNMX1NSRFNDUjNfTEFORUFfU0FUQQkweDE1MDAwNTAwCisjZGVmaW5lIEZTTF9TUkRTQ1IzX0xBTkVFX01BU0sJMHgwMDNmMDAwNworI2RlZmluZSBGU0xfU1JEU0NSM19MQU5FRV9TR01JSQkweDAwMDAwMDAwCisjZGVmaW5lIEZTTF9TUkRTQ1IzX0xBTkVFX1NBVEEJMHgwMDE1MDAwNQorCit2b2lkIGZzbF9zZXJkZXNfaW5pdCh2b2lkKQoreworCXZvaWQgKmd1dHMgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfR1VUU19BRERSKTsKKwl2b2lkICpzZCA9ICh2b2lkICopQ09ORklHX1NZU19NUEM4NXh4X1NFUkRFUzJfQUREUjsKKwl1MzIgcG9yZGV2c3IgPSBpbl9iZTMyKGd1dHMgKyBHVVRTX1BPUkRFVlNSX09GRlMpOworCXUzMiBzcmRzMl9pb19zZWw7CisJdTMyIHRtcDsKKworCS8qIHBhcnNlIHRoZSBTUkRTMl9JT19TRUwgb2YgUE9SREVWU1IgKi8KKwlzcmRzMl9pb19zZWwgPSAocG9yZGV2c3IgJiBHVVRTX1BPUkRFVlNSX1NFUkRFUzJfSU9fU0VMKQorCQkgICAgICAgPj4gR1VUU19QT1JERVZTUl9TRVJERVMyX0lPX1NFTF9TSElGVDsKKworCXN3aXRjaCAoc3JkczJfaW9fc2VsKSB7CisJY2FzZSAxOgkvKiBMYW5lIEEgLSBTQVRBMSwgTGFuZSBFIC0gU0FUQTIgKi8KKwkJLyogQ1IgMCAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjBfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjBfVFhFUUFfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IwX1RYRVFBX1NBVEE7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjBfVFhFUUVfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IwX1RYRVFFX1NBVEE7CisJCW91dF9iZTMyKHNkICsgRlNMX1NSRFNDUjBfT0ZGUywgdG1wKTsKKwkJLyogQ1IgMSAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjFfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjFfTEFORUFfTUFTSzsKKwkJdG1wICY9IH5GU0xfU1JEU0NSMV9MQU5FRV9NQVNLOworCQlvdXRfYmUzMihzZCArIEZTTF9TUkRTQ1IxX09GRlMsIHRtcCk7CisJCS8qIENSIDIgKi8KKwkJdG1wID0gaW5fYmUzMihzZCArIEZTTF9TUkRTQ1IyX09GRlMpOworCQl0bXAgJj0gfkZTTF9TUkRTQ1IyX0VJQ0FfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IyX0VJQ0FfU0FUQTsKKwkJdG1wICY9IH5GU0xfU1JEU0NSMl9FSUNFX01BU0s7CisJCXRtcCB8PSBGU0xfU1JEU0NSMl9FSUNFX1NBVEE7CisJCW91dF9iZTMyKHNkICsgRlNMX1NSRFNDUjJfT0ZGUywgdG1wKTsKKwkJLyogQ1IgMyAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjNfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjNfTEFORUFfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IzX0xBTkVBX1NBVEE7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjNfTEFORUVfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IzX0xBTkVFX1NBVEE7CisJCW91dF9iZTMyKHNkICsgRlNMX1NSRFNDUjNfT0ZGUywgdG1wKTsKKwkJYnJlYWs7CisJY2FzZSAzOiAvKiBMYW5lIEEgLSBTQVRBMSwgTGFuZSBFIC0gZGlzYWJsZWQgKi8KKwkJLyogQ1IgMCAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjBfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjBfVFhFUUFfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IwX1RYRVFBX1NBVEE7CisJCW91dF9iZTMyKHNkICsgRlNMX1NSRFNDUjBfT0ZGUywgdG1wKTsKKwkJLyogQ1IgMSAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjFfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjFfTEFORUVfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IxX0xBTkVFX09GRjsKKwkJb3V0X2JlMzIoc2QgKyBGU0xfU1JEU0NSMV9PRkZTLCB0bXApOworCQkvKiBDUiAyICovCisJCXRtcCA9IGluX2JlMzIoc2QgKyBGU0xfU1JEU0NSMl9PRkZTKTsKKwkJdG1wICY9IH5GU0xfU1JEU0NSMl9FSUNBX01BU0s7CisJCXRtcCB8PSBGU0xfU1JEU0NSMl9FSUNBX1NBVEE7CisJCW91dF9iZTMyKHNkICsgRlNMX1NSRFNDUjJfT0ZGUywgdG1wKTsKKwkJLyogQ1IgMyAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjNfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjNfTEFORUFfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IzX0xBTkVBX1NBVEE7CisJCW91dF9iZTMyKHNkICsgRlNMX1NSRFNDUjNfT0ZGUywgdG1wKTsKKwkJYnJlYWs7CisJY2FzZSA0OiAvKiBMYW5lIEEgLSBlVFNFQzEgU0dNSUksIExhbmUgRSAtIGVUU0VDMyBTR01JSSAqLworCQkvKiBDUiAwICovCisJCXRtcCA9IGluX2JlMzIoc2QgKyBGU0xfU1JEU0NSMF9PRkZTKTsKKwkJdG1wICY9IH5GU0xfU1JEU0NSMF9UWEVRQV9NQVNLOworCQl0bXAgfD0gRlNMX1NSRFNDUjBfVFhFUUFfU0dNSUk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjBfVFhFUUVfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IwX1RYRVFFX1NHTUlJOworCQlvdXRfYmUzMihzZCArIEZTTF9TUkRTQ1IwX09GRlMsIHRtcCk7CisJCS8qIENSIDEgKi8KKwkJdG1wID0gaW5fYmUzMihzZCArIEZTTF9TUkRTQ1IxX09GRlMpOworCQl0bXAgJj0gfkZTTF9TUkRTQ1IxX0xBTkVBX01BU0s7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjFfTEFORUVfTUFTSzsKKwkJb3V0X2JlMzIoc2QgKyBGU0xfU1JEU0NSMV9PRkZTLCB0bXApOworCQkvKiBDUiAyICovCisJCXRtcCA9IGluX2JlMzIoc2QgKyBGU0xfU1JEU0NSMl9PRkZTKTsKKwkJdG1wICY9IH5GU0xfU1JEU0NSMl9FSUNBX01BU0s7CisJCXRtcCB8PSBGU0xfU1JEU0NSMl9FSUNBX1NHTUlJOworCQl0bXAgJj0gfkZTTF9TUkRTQ1IyX0VJQ0VfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IyX0VJQ0VfU0dNSUk7CisJCW91dF9iZTMyKHNkICsgRlNMX1NSRFNDUjJfT0ZGUywgdG1wKTsKKwkJLyogQ1IgMyAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjNfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjNfTEFORUFfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IzX0xBTkVBX1NHTUlJOworCQl0bXAgJj0gfkZTTF9TUkRTQ1IzX0xBTkVFX01BU0s7CisJCXRtcCB8PSBGU0xfU1JEU0NSM19MQU5FRV9TR01JSTsKKwkJb3V0X2JlMzIoc2QgKyBGU0xfU1JEU0NSM19PRkZTLCB0bXApOworCQlicmVhazsKKwljYXNlIDY6IC8qIExhbmUgQSAtIGVUU0VDMSBTR01JSSwgTGFuZSBFIC0gZGlzYWJsZWQgKi8KKwkJLyogQ1IgMCAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjBfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjBfVFhFUUFfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IwX1RYRVFBX1NHTUlJOworCQlvdXRfYmUzMihzZCArIEZTTF9TUkRTQ1IwX09GRlMsIHRtcCk7CisJCS8qIENSIDEgKi8KKwkJdG1wID0gaW5fYmUzMihzZCArIEZTTF9TUkRTQ1IxX09GRlMpOworCQl0bXAgJj0gfkZTTF9TUkRTQ1IxX0xBTkVFX01BU0s7CisJCXRtcCB8PSBGU0xfU1JEU0NSMV9MQU5FRV9PRkY7CisJCW91dF9iZTMyKHNkICsgRlNMX1NSRFNDUjFfT0ZGUywgdG1wKTsKKwkJLyogQ1IgMiAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjJfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjJfRUlDQV9NQVNLOworCQl0bXAgfD0gRlNMX1NSRFNDUjJfRUlDQV9TR01JSTsKKwkJb3V0X2JlMzIoc2QgKyBGU0xfU1JEU0NSMl9PRkZTLCB0bXApOworCQkvKiBDUiAzICovCisJCXRtcCA9IGluX2JlMzIoc2QgKyBGU0xfU1JEU0NSM19PRkZTKTsKKwkJdG1wICY9IH5GU0xfU1JEU0NSM19MQU5FQV9NQVNLOworCQl0bXAgfD0gRlNMX1NSRFNDUjNfTEFORUFfU0dNSUk7CisJCW91dF9iZTMyKHNkICsgRlNMX1NSRFNDUjNfT0ZGUywgdG1wKTsKKwkJYnJlYWs7CisJY2FzZSA3OiAvKiBMYW5lIEEgLSBkaXNhYmxlZCwgTGFuZSBFIC0gZGlzYWJsZWQgKi8KKwkJLyogQ1IgMSAqLworCQl0bXAgPSBpbl9iZTMyKHNkICsgRlNMX1NSRFNDUjFfT0ZGUyk7CisJCXRtcCAmPSB+RlNMX1NSRFNDUjFfTEFORUFfTUFTSzsKKwkJdG1wIHw9IEZTTF9TUkRTQ1IxX0xBTkVBX09GRjsKKwkJdG1wICY9IH5GU0xfU1JEU0NSMV9MQU5FRV9NQVNLOworCQl0bXAgfD0gRlNMX1NSRFNDUjFfTEFORUVfT0ZGOworCQlvdXRfYmUzMihzZCArIEZTTF9TUkRTQ1IxX09GRlMsIHRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9wY2kuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQyNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3BjaS5jCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTW90b3JvbGEgSW5jLgorICogWGlhbmdodWEgWGlhbyAoeC54aWFvQG1vdG9yb2xhLmNvbSkKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogUENJIENvbmZpZ3VyYXRpb24gc3BhY2UgYWNjZXNzIHN1cHBvcnQgZm9yIE1QQzg1eHggUENJIEJyaWRnZQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2NwbV84NXh4Lmg+CisjaW5jbHVkZSA8cGNpLmg+CisKKyNpZiAhZGVmaW5lZChDT05GSUdfRlNMX1BDSV9JTklUKQorCisjaWZuZGVmIENPTkZJR19TWVNfUENJMV9NRU1fQlVTCisjZGVmaW5lIENPTkZJR19TWVNfUENJMV9NRU1fQlVTIENPTkZJR19TWVNfUENJMV9NRU1fQkFTRQorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19QQ0kxX0lPX0JVUworI2RlZmluZSBDT05GSUdfU1lTX1BDSTFfSU9fQlVTIENPTkZJR19TWVNfUENJMV9JT19CQVNFCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSTJfTUVNX0JVUworI2RlZmluZSBDT05GSUdfU1lTX1BDSTJfTUVNX0JVUyBDT05GSUdfU1lTX1BDSTJfTUVNX0JBU0UKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUENJMl9JT19CVVMKKyNkZWZpbmUgQ09ORklHX1NZU19QQ0kyX0lPX0JVUyBDT05GSUdfU1lTX1BDSTJfSU9fQkFTRQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaV9ob3NlOworCit2b2lkCitwY2lfbXBjODV4eF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqYm9hcmRfaG9zZSkKK3sKKwl1MTYgcmVnMTY7CisJdTMyIGRldjsKKworCXZvbGF0aWxlIGNjc3JfcGNpeF90ICpwY2l4ID0gKHZvaWQgKikoQ09ORklHX1NZU19NUEM4NXh4X1BDSVhfQUREUik7CisjaWZkZWYgQ09ORklHX01QQzg1WFhfUENJMgorCXZvbGF0aWxlIGNjc3JfcGNpeF90ICpwY2l4MiA9ICh2b2lkICopKENPTkZJR19TWVNfTVBDODV4eF9QQ0lYMl9BRERSKTsKKyNlbmRpZgorCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICh2b2lkICopKENPTkZJR19TWVNfTVBDODV4eF9HVVRTX0FERFIpOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2U7CisKKwlwY2lfaG9zZSA9IGJvYXJkX2hvc2U7CisKKwlob3NlID0gJnBjaV9ob3NlWzBdOworCisJaG9zZS0+Zmlyc3RfYnVzbm8gPSAwOworCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOworCisJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsCisJCQkgICAoQ09ORklHX1NZU19JTU1SKzB4ODAwMCksCisJCQkgICAoQ09ORklHX1NZU19JTU1SKzB4ODAwNCkpOworCisJLyoKKwkgKiBIb3NlIHNjYW4uCisJICovCisJZGV2ID0gUENJX0JERihob3NlLT5maXJzdF9idXNubywgMCwgMCk7CisJcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZCAoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgJnJlZzE2KTsKKwlyZWcxNiB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfTUVNT1JZOworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX0NPTU1BTkQsIHJlZzE2KTsKKworCS8qCisJICogQ2xlYXIgbm9uLXJlc2VydmVkIGJpdHMgaW4gc3RhdHVzIHJlZ2lzdGVyLgorCSAqLworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIGRldiwgUENJX1NUQVRVUywgMHhmZmZmKTsKKworCWlmICghKGd1ci0+cG9yZGV2c3IgJiBNUEM4NXh4X1BPUkRFVlNSX1BDSTEpKSB7CisJCS8qIFBDSS1YIGluaXQgKi8KKwkJaWYgKENPTkZJR19TWVNfQ0xLX0ZSRVEgPCA2NjAwMDAwMCkKKwkJCXByaW50ZigiUENJLVggd2lsbCBvbmx5IHdvcmsgYXQgNjYgTUh6XG4iKTsKKworCQlyZWcxNiA9IFBDSV9YX0NNRF9NQVhfU1BMSVQgfCBQQ0lfWF9DTURfTUFYX1JFQUQKKwkJCXwgUENJX1hfQ01EX0VSTyB8IFBDSV9YX0NNRF9EUEVSUl9FOworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZChob3NlLCBkZXYsIFBDSVhfQ09NTUFORCwgcmVnMTYpOworCX0KKworCXBjaXgtPnBvdGFyMSAgID0gKENPTkZJR19TWVNfUENJMV9NRU1fQlVTID4+IDEyKSAmIDB4MDAwZmZmZmY7CisJcGNpeC0+cG90ZWFyMSAgPSAweDAwMDAwMDAwOworCXBjaXgtPnBvd2JhcjEgID0gKENPTkZJR19TWVNfUENJMV9NRU1fUEhZUyA+PiAxMikgJiAweDAwMGZmZmZmOworCXBjaXgtPnBvd2JlYXIxID0gMHgwMDAwMDAwMDsKKwlwY2l4LT5wb3dhcjEgPSAoUE9XQVJfRU4gfCBQT1dBUl9NRU1fUkVBRCB8CisJCQlQT1dBUl9NRU1fV1JJVEUgfCAoX19pbG9nMihDT05GSUdfU1lTX1BDSTFfTUVNX1NJWkUpIC0gMSkpOworCisJcGNpeC0+cG90YXIyICA9IChDT05GSUdfU1lTX1BDSTFfSU9fQlVTID4+IDEyKSAmIDB4MDAwZmZmZmY7CisJcGNpeC0+cG90ZWFyMiAgPSAweDAwMDAwMDAwOworCXBjaXgtPnBvd2JhcjIgID0gKENPTkZJR19TWVNfUENJMV9JT19QSFlTID4+IDEyKSAmIDB4MDAwZmZmZmY7CisJcGNpeC0+cG93YmVhcjIgPSAweDAwMDAwMDAwOworCXBjaXgtPnBvd2FyMiA9IChQT1dBUl9FTiB8IFBPV0FSX0lPX1JFQUQgfAorCQkJUE9XQVJfSU9fV1JJVEUgfCAoX19pbG9nMihDT05GSUdfU1lTX1BDSTFfSU9fU0laRSkgLSAxKSk7CisKKwlwY2l4LT5waXRhcjEgPSAweDAwMDAwMDAwOworCXBjaXgtPnBpd2JhcjEgPSAweDAwMDAwMDAwOworCXBjaXgtPnBpd2FyMSA9IChQSVdBUl9FTiB8IFBJV0FSX1BGIHwgUElXQVJfTE9DQUwgfAorCQkJUElXQVJfUkVBRF9TTk9PUCB8IFBJV0FSX1dSSVRFX1NOT09QIHwgUElXQVJfTUVNXzJHKTsKKworCXBjaXgtPnBvd2FyMyA9IDA7CisJcGNpeC0+cG93YXI0ID0gMDsKKwlwY2l4LT5waXdhcjIgPSAwOworCXBjaXgtPnBpd2FyMyA9IDA7CisKKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJICAgICAgIENPTkZJR19TWVNfUENJMV9NRU1fQlVTLAorCQkgICAgICAgQ09ORklHX1NZU19QQ0kxX01FTV9QSFlTLAorCQkgICAgICAgQ09ORklHX1NZU19QQ0kxX01FTV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCSAgICAgICBDT05GSUdfU1lTX1BDSTFfSU9fQlVTLAorCQkgICAgICAgQ09ORklHX1NZU19QQ0kxX0lPX1BIWVMsCisJCSAgICAgICBDT05GSUdfU1lTX1BDSTFfSU9fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJaG9zZS0+cmVnaW9uX2NvdW50ID0gMjsKKworCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOworCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODU1NUNEUykgfHwgZGVmaW5lZChDT05GSUdfTVBDODU0MUNEUykKKwkvKgorCSAqIFRoaXMgaXMgYSBTVyB3b3JrYXJvdW5kIGZvciBhbiBhcHBhcmVudCBIVyBwcm9ibGVtCisJICogaW4gdGhlIFBDSSBjb250cm9sbGVyIG9uIHRoZSBNUEM4NTU1NS80MSBDRFMgYm9hcmRzLgorCSAqIFRoZSBmaXJzdCBjb25maWcgY3ljbGUgbXVzdCBiZSB0byBhIHZhbGlkLCBrbm93bgorCSAqIGRldmljZSBvbiB0aGUgUENJIGJ1cyBpbiBvcmRlciB0byB0cmljayB0aGUgUENJCisJICogY29udHJvbGxlciBzdGF0ZSBtYWNoaW5lIGludG8gYSBrbm93biB2YWxpZCBzdGF0ZS4KKwkgKiBXaXRob3V0IHRoaXMsIHRoZSBmaXJzdCBjb25maWcgY3ljbGUgaGFzIHRoZSBjaGFuY2UKKwkgKiBvZiBoYW5naW5nIHRoZSBjb250cm9sbGVyIHBlcm1hbmVudGx5LCBqdXN0IGxlYXZpbmcKKwkgKiBpdCBpbiBhIHNlbWktd29ya2luZyBzdGF0ZSwgb3IgbGVhdmluZyBpdCB3b3JraW5nLgorCSAqCisJICogUGljayBvbiB0aGUgVHVuZHJhLCBEZXZpY2UgMTcsIHRvIGdldCBpdCByaWdodC4KKwkgKi8KKwl7CisJCXU4IGhlYWRlcl90eXBlOworCisJCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwKKwkJCQkJICBQQ0lfQkRGKDAsQlJJREdFX0lELDApLAorCQkJCQkgIFBDSV9IRUFERVJfVFlQRSwKKwkJCQkJICAmaGVhZGVyX3R5cGUpOworCX0KKyNlbmRpZgorCisJaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7CisKKyNpZmRlZiBDT05GSUdfTVBDODVYWF9QQ0kyCisJaG9zZSA9ICZwY2lfaG9zZVsxXTsKKworCWhvc2UtPmZpcnN0X2J1c25vID0gcGNpX2hvc2VbMF0ubGFzdF9idXNubyArIDE7CisJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CisKKwlwY2lfc2V0dXBfaW5kaXJlY3QoaG9zZSwKKwkJCSAgIChDT05GSUdfU1lTX0lNTVIrMHg5MDAwKSwKKwkJCSAgIChDT05GSUdfU1lTX0lNTVIrMHg5MDA0KSk7CisKKwlkZXYgPSBQQ0lfQkRGKGhvc2UtPmZpcnN0X2J1c25vLCAwLCAwKTsKKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkIChob3NlLCBkZXYsIFBDSV9DT01NQU5ELCAmcmVnMTYpOworCXJlZzE2IHw9IFBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9NQVNURVIgfCBQQ0lfQ09NTUFORF9NRU1PUlk7CisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgcmVnMTYpOworCisJLyoKKwkgKiBDbGVhciBub24tcmVzZXJ2ZWQgYml0cyBpbiBzdGF0dXMgcmVnaXN0ZXIuCisJICovCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgZGV2LCBQQ0lfU1RBVFVTLCAweGZmZmYpOworCisJcGNpeDItPnBvdGFyMSAgID0gKENPTkZJR19TWVNfUENJMl9NRU1fQlVTID4+IDEyKSAmIDB4MDAwZmZmZmY7CisJcGNpeDItPnBvdGVhcjEgID0gMHgwMDAwMDAwMDsKKwlwY2l4Mi0+cG93YmFyMSAgPSAoQ09ORklHX1NZU19QQ0kyX01FTV9QSFlTID4+IDEyKSAmIDB4MDAwZmZmZmY7CisJcGNpeDItPnBvd2JlYXIxID0gMHgwMDAwMDAwMDsKKwlwY2l4Mi0+cG93YXIxID0gKFBPV0FSX0VOIHwgUE9XQVJfTUVNX1JFQUQgfAorCQkJUE9XQVJfTUVNX1dSSVRFIHwgKF9faWxvZzIoQ09ORklHX1NZU19QQ0kyX01FTV9TSVpFKSAtIDEpKTsKKworCXBjaXgyLT5wb3RhcjIgID0gKENPTkZJR19TWVNfUENJMl9JT19CVVMgPj4gMTIpICYgMHgwMDBmZmZmZjsKKwlwY2l4Mi0+cG90ZWFyMiAgPSAweDAwMDAwMDAwOworCXBjaXgyLT5wb3diYXIyICA9IChDT05GSUdfU1lTX1BDSTJfSU9fUEhZUyA+PiAxMikgJiAweDAwMGZmZmZmOworCXBjaXgyLT5wb3diZWFyMiA9IDB4MDAwMDAwMDA7CisJcGNpeDItPnBvd2FyMiA9IChQT1dBUl9FTiB8IFBPV0FSX0lPX1JFQUQgfAorCQkJUE9XQVJfSU9fV1JJVEUgfCAoX19pbG9nMihDT05GSUdfU1lTX1BDSTJfSU9fU0laRSkgLSAxKSk7CisKKwlwY2l4Mi0+cGl0YXIxID0gMHgwMDAwMDAwMDsKKwlwY2l4Mi0+cGl3YmFyMSA9IDB4MDAwMDAwMDA7CisJcGNpeDItPnBpd2FyMSA9IChQSVdBUl9FTiB8IFBJV0FSX1BGIHwgUElXQVJfTE9DQUwgfAorCQkJUElXQVJfUkVBRF9TTk9PUCB8IFBJV0FSX1dSSVRFX1NOT09QIHwgUElXQVJfTUVNXzJHKTsKKworCXBjaXgyLT5wb3dhcjMgPSAwOworCXBjaXgyLT5wb3dhcjQgPSAwOworCXBjaXgyLT5waXdhcjIgPSAwOworCXBjaXgyLT5waXdhcjMgPSAwOworCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCisJCSAgICAgICBDT05GSUdfU1lTX1BDSTJfTUVNX0JVUywKKwkJICAgICAgIENPTkZJR19TWVNfUENJMl9NRU1fUEhZUywKKwkJICAgICAgIENPTkZJR19TWVNfUENJMl9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkgICAgICAgQ09ORklHX1NZU19QQ0kyX0lPX0JVUywKKwkJICAgICAgIENPTkZJR19TWVNfUENJMl9JT19QSFlTLAorCQkgICAgICAgQ09ORklHX1NZU19QQ0kyX0lPX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDI7CisKKwkvKgorCSAqIEhvc2Ugc2Nhbi4KKwkgKi8KKwlwY2lfcmVnaXN0ZXJfaG9zZShob3NlKTsKKworCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKGhvc2UpOworI2VuZGlmCit9CisjZW5kaWYgLyogIUNPTkZJR19GU0xfUENJX0lOSVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9xZV9pby5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3FlX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhMjliNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9xZV9pby5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICogYmFzZWQgb24gc291cmNlIGNvZGUgb2YgU2hsb21pIEdyaWRpc2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiYXNtL2Vycm5vLmgiCisjaW5jbHVkZSAiYXNtL2lvLmgiCisjaW5jbHVkZSAiYXNtL2ltbWFwXzg1eHguaCIKKworI2lmIGRlZmluZWQoQ09ORklHX1FFKQorI2RlZmluZQlOVU1fT0ZfUElOUwkzMgordm9pZCBxZV9jb25maWdfaW9waW4odTggcG9ydCwgdTggcGluLCBpbnQgZGlyLCBpbnQgb3Blbl9kcmFpbiwgaW50IGFzc2lnbikKK3sKKwl1MzIJCQlwaW5fMmJpdF9tYXNrOworCXUzMgkJCXBpbl8yYml0X2RpcjsKKwl1MzIJCQlwaW5fMmJpdF9hc3NpZ247CisJdTMyCQkJcGluXzFiaXRfbWFzazsKKwl1MzIJCQl0bXBfdmFsOworCXZvbGF0aWxlIGNjc3JfZ3VyX3QJKmd1ciA9ICh2b2lkICopKENPTkZJR19TWVNfTVBDODV4eF9HVVRTX0FERFIpOworCXZvbGF0aWxlIHBhcl9pb190CSpwYXJfaW8gPSAodm9sYXRpbGUgcGFyX2lvX3QgKikKKwkJCQkJCSYoZ3VyLT5xZV9wYXJfaW8pOworCisJLyogQ2FjdWxhdGUgcGluIGxvY2F0aW9uIGFuZCAyYml0IG1hc2sgYW5kIGRpciAqLworCXBpbl8yYml0X21hc2sgPSAodTMyKSgweDMgPDwgKE5VTV9PRl9QSU5TLShwaW4lKE5VTV9PRl9QSU5TLzIpKzEpKjIpKTsKKwlwaW5fMmJpdF9kaXIgPSAodTMyKShkaXIgPDwgKE5VTV9PRl9QSU5TLShwaW4lKE5VTV9PRl9QSU5TLzIpKzEpKjIpKTsKKworCS8qIFNldHVwIHRoZSBkaXJlY3Rpb24gKi8KKwl0bXBfdmFsID0gKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtIDEpID8gXAorCQlpbl9iZTMyKCZwYXJfaW9bcG9ydF0uY3BkaXIyKSA6CisJCWluX2JlMzIoJnBhcl9pb1twb3J0XS5jcGRpcjEpOworCisJaWYgKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtMSkgeworCQlvdXRfYmUzMigmcGFyX2lvW3BvcnRdLmNwZGlyMiwgfnBpbl8yYml0X21hc2sgJiB0bXBfdmFsKTsKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcGRpcjIsIHBpbl8yYml0X2RpciB8IHRtcF92YWwpOworCX0gZWxzZSB7CisJCW91dF9iZTMyKCZwYXJfaW9bcG9ydF0uY3BkaXIxLCB+cGluXzJiaXRfbWFzayAmIHRtcF92YWwpOworCQlvdXRfYmUzMigmcGFyX2lvW3BvcnRdLmNwZGlyMSwgcGluXzJiaXRfZGlyIHwgdG1wX3ZhbCk7CisJfQorCisJLyogQ2FsY3VsYXRlIHBpbiBsb2NhdGlvbiBmb3IgMWJpdCBtYXNrICovCisJcGluXzFiaXRfbWFzayA9ICh1MzIpKDEgPDwgKE5VTV9PRl9QSU5TIC0gKHBpbisxKSkpOworCisJLyogU2V0dXAgdGhlIG9wZW4gZHJhaW4gKi8KKwl0bXBfdmFsID0gaW5fYmUzMigmcGFyX2lvW3BvcnRdLmNwb2RyKTsKKwlpZiAob3Blbl9kcmFpbikKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcG9kciwgcGluXzFiaXRfbWFzayB8IHRtcF92YWwpOworCWVsc2UKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcG9kciwgfnBpbl8xYml0X21hc2sgJiB0bXBfdmFsKTsKKworCS8qIFNldHVwIHRoZSBhc3NpZ25tZW50ICovCisJdG1wX3ZhbCA9IChwaW4gPiAoTlVNX09GX1BJTlMvMikgLSAxKSA/CisJCWluX2JlMzIoJnBhcl9pb1twb3J0XS5jcHBhcjIpOgorCQlpbl9iZTMyKCZwYXJfaW9bcG9ydF0uY3BwYXIxKTsKKwlwaW5fMmJpdF9hc3NpZ24gPSAodTMyKShhc3NpZ24KKwkJCQk8PCAoTlVNX09GX1BJTlMgLSAocGluJShOVU1fT0ZfUElOUy8yKSsxKSoyKSk7CisKKwkvKiBDbGVhciBhbmQgc2V0IDIgYml0cyBtYXNrICovCisJaWYgKHBpbiA+IChOVU1fT0ZfUElOUy8yKSAtIDEpIHsKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcHBhcjIsIH5waW5fMmJpdF9tYXNrICYgdG1wX3ZhbCk7CisJCW91dF9iZTMyKCZwYXJfaW9bcG9ydF0uY3BwYXIyLCBwaW5fMmJpdF9hc3NpZ24gfCB0bXBfdmFsKTsKKwl9IGVsc2UgeworCQlvdXRfYmUzMigmcGFyX2lvW3BvcnRdLmNwcGFyMSwgfnBpbl8yYml0X21hc2sgJiB0bXBfdmFsKTsKKwkJb3V0X2JlMzIoJnBhcl9pb1twb3J0XS5jcHBhcjEsIHBpbl8yYml0X2Fzc2lnbiB8IHRtcF92YWwpOworCX0KK30KKworI2VuZGlmIC8qIENPTkZJR19RRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3JlbGVhc2UuUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9yZWxlYXNlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1YjlkYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9yZWxlYXNlLlMKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBLdW1hciBHYWxhIDxrdW1hci5nYWxhQGZyZWVzY2FsZS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzg1eHguaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19IIDEJLyogYXZvaWQgcmVhZGluZyBMaW51eCBhdXRvY29uZi5oIGZpbGUJKi8KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisvKiBUbyBib290IHNlY29uZGFyeSBjcHVzLCB3ZSBuZWVkIGEgcGxhY2UgZm9yIHRoZW0gdG8gc3RhcnQgdXAuCisgKiBOb3JtYWxseSwgdGhleSBzdGFydCBhdCAweGZmZmZmZmZjLCBidXQgdGhhdCdzIHVzdWFsbHkgdGhlCisgKiBmaXJtd2FyZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gaGF2ZSB0byBydW4gdGhlIGZpcm13YXJlIGFnYWluLgorICogSW5zdGVhZCwgdGhlIHByaW1hcnkgY3B1IHdpbGwgc2V0IHRoZSBCUFRSIHRvIHBvaW50IGhlcmUgdG8KKyAqIHRoaXMgcGFnZS4gIFdlIHRoZW4gc2V0IHVwIHRoZSBjb3JlLCBhbmQgaGVhZCB0bworICogc3RhcnRfc2Vjb25kYXJ5LiAgTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhhdCB0aGUgY29kZSBiZWxvdworICogbXVzdCBuZXZlciBleGNlZWQgMTAyMyBpbnN0cnVjdGlvbnMgKHRoZSBicmFuY2ggYXQgdGhlIGVuZAorICogd291bGQgdGhlbiBiZSB0aGUgMTAyNHRoKS4KKyAqLworCS5nbG9ibAlfX3NlY29uZGFyeV9zdGFydF9wYWdlCisJLmFsaWduCTEyCitfX3NlY29uZGFyeV9zdGFydF9wYWdlOgorLyogRmlyc3QgZG8gc29tZSBwcmVsaW1pbmFyeSBzZXR1cCAqLworCWxpcwlyMywgSElEMF9FTUNQQGgJCS8qIGVuYWJsZSBtYWNoaW5lIGNoZWNrICovCisjaWZuZGVmIENPTkZJR19FNTAwTUMKKwlvcmkJcjMscjMsSElEMF9UQkVOQGwJLyogZW5hYmxlIFRpbWViYXNlICovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEhZU182NEJJVAorCW9yaQlyMyxyMyxISUQwX0VOTUFTN0BsCS8qIGVuYWJsZSBNQVM3IHVwZGF0ZXMgKi8KKyNlbmRpZgorCW10c3ByCVNQUk5fSElEMCxyMworCisjaWZuZGVmIENPTkZJR19FNTAwTUMKKwlsaQlyMywoSElEMV9BU1RNRXxISUQxX0FCRSlAbAkvKiBBZGRyIHN0cmVhbWluZyAmIGJyb2FkY2FzdCAqLworCW1mc3ByICAgcjAsUFZSCisJYW5kaS4JcjAscjAsMHhmZgorCWNtcHdpCXIwLDB4NTBAbAkvKiBpZiB3ZSBhcmUgcmV2IDUuMCBvciBncmVhdGVyIHNldCBNQkREICovCisJYmx0IDFmCisJLyogU2V0IE1CREQgYml0IGFsc28gKi8KKwlvcmkgcjMsIHIzLCBISUQxX01CRERAbAorMToKKwltdHNwcglTUFJOX0hJRDEscjMKKyNlbmRpZgorCisJLyogRW5hYmxlIGJyYW5jaCBwcmVkaWN0aW9uICovCisJbGlzCXIzLEJVQ1NSX0VOQUJMRUBoCisJb3JpCXIzLHIzLEJVQ1NSX0VOQUJMRUBsCisJbXRzcHIJU1BSTl9CVUNTUixyMworCisJLyogRW5zdXJlIFRCIGlzIDAgKi8KKwlsaQlyMywwCisJbXR0YmwJcjMKKwltdHRidQlyMworCisJLyogRW5hYmxlL2ludmFsaWRhdGUgdGhlIEktQ2FjaGUgKi8KKwlsaXMJcjIsKEwxQ1NSMV9JQ0ZJfEwxQ1NSMV9JQ0xGUilAaAorCW9yaQlyMixyMiwoTDFDU1IxX0lDRkl8TDFDU1IxX0lDTEZSKUBsCisJbXRzcHIJU1BSTl9MMUNTUjEscjIKKzE6CisJbWZzcHIJcjMsU1BSTl9MMUNTUjEKKwlhbmQuCXIxLHIzLHIyCisJYm5lCTFiCisKKwlsaXMJcjMsKEwxQ1NSMV9DUEV8TDFDU1IxX0lDRSlAaAorCW9yaQlyMyxyMywoTDFDU1IxX0NQRXxMMUNTUjFfSUNFKUBsCisJbXRzcHIJU1BSTl9MMUNTUjEscjMKKwlpc3luYworMjoKKwltZnNwcglyMyxTUFJOX0wxQ1NSMQorCWFuZGkuCXIxLHIzLEwxQ1NSMV9JQ0VAbAorCWJlcQkyYgorCisJLyogRW5hYmxlL2ludmFsaWRhdGUgdGhlIEQtQ2FjaGUgKi8KKwlsaXMJcjIsKEwxQ1NSMF9EQ0ZJfEwxQ1NSMF9EQ0xGUilAaAorCW9yaQlyMixyMiwoTDFDU1IwX0RDRkl8TDFDU1IwX0RDTEZSKUBsCisJbXRzcHIJU1BSTl9MMUNTUjAscjIKKzE6CisJbWZzcHIJcjMsU1BSTl9MMUNTUjAKKwlhbmQuCXIxLHIzLHIyCisJYm5lCTFiCisKKwlsaXMJcjMsKEwxQ1NSMF9DUEV8TDFDU1IwX0RDRSlAaAorCW9yaQlyMyxyMywoTDFDU1IwX0NQRXxMMUNTUjBfRENFKUBsCisJbXRzcHIJU1BSTl9MMUNTUjAscjMKKwlpc3luYworMjoKKwltZnNwcglyMyxTUFJOX0wxQ1NSMAorCWFuZGkuCXIxLHIzLEwxQ1NSMF9EQ0VAbAorCWJlcQkyYgorCisjZGVmaW5lIHRvcmVzZXQoeCkgKHggLSBfX3NlY29uZGFyeV9zdGFydF9wYWdlICsgMHhmZmZmZjAwMCkKKworCS8qIGdldCBvdXIgUElSIHRvIGZpZ3VyZSBvdXQgb3VyIHRhYmxlIGVudHJ5ICovCisJbGlzCXIzLHRvcmVzZXQoX19zcGluX3RhYmxlKUBoCisJb3JpCXIzLHIzLHRvcmVzZXQoX19zcGluX3RhYmxlKUBsCisKKwkvKiByMTAgaGFzIHRoZSBiYXNlIGFkZHJlc3MgZm9yIHRoZSBlbnRyeSAqLworCW1mc3ByCXIwLFNQUk5fUElSCisjaWZkZWYgQ09ORklHX0U1MDBNQworCXJsd2lubQlyNCxyMCwyNywyNywzMQorI2Vsc2UKKwltcglyNCxyMAorI2VuZGlmCisJc2x3aQlyOCxyNCw1CisJYWRkCXIxMCxyMyxyOAorCisjaWYgZGVmaW5lZChDT05GSUdfRTUwME1DKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfQ0FDSEVfU1RBU0hJTkcpCisJLyogc2V0IHN0YXNoIGlkIHRvIChjb3JlSUQpICogMiArIDMyICsgTDEgQ1QgKDApICovCisJc2x3aQlyOCxyNCwxCisJYWRkaQlyOCxyOCwzMgorCW10c3ByCUwxQ1NSMixyOAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQkFDS1NJREVfTDJfQ0FDSEUKKwkvKiBFbmFibGUvaW52YWxpZGF0ZSB0aGUgTDIgY2FjaGUgKi8KKwltc3luYworCWxpcwlyMiwoTDJDU1IwX0wyRkl8TDJDU1IwX0wyTEZDKUBoCisJb3JpCXIyLHIyLChMMkNTUjBfTDJGSXxMMkNTUjBfTDJMRkMpQGwKKwltdHNwcglTUFJOX0wyQ1NSMCxyMgorMToKKwltZnNwcglyMyxTUFJOX0wyQ1NSMAorCWFuZC4JcjEscjMscjIKKwlibmUJMWIKKworI2lmZGVmIENPTkZJR19TWVNfQ0FDSEVfU1RBU0hJTkcKKwkvKiBzZXQgc3Rhc2ggaWQgdG8gKGNvcmVJRCkgKiAyICsgMzIgKyBMMiAoMSkgKi8KKwlhZGRpCXIzLHI4LDEKKwltdHNwcglTUFJOX0wyQ1NSMSxyMworI2VuZGlmCisKKwlsaXMJcjMsQ09ORklHX1NZU19JTklUX0wyQ1NSMEBoCisJb3JpCXIzLHIzLENPTkZJR19TWVNfSU5JVF9MMkNTUjBAbAorCW10c3ByCVNQUk5fTDJDU1IwLHIzCisJaXN5bmMKKzI6CisJbWZzcHIJcjMsU1BSTl9MMkNTUjAKKwlhbmRpcy4JcjEscjMsTDJDU1IwX0wyRUBoCisJYmVxCTJiCisjZW5kaWYKKworI2RlZmluZSBFUEFQUl9NQUdJQwkJKDB4NDU1MDQxNTApCisjZGVmaW5lIEVOVFJZX0FERFJfVVBQRVIJMAorI2RlZmluZSBFTlRSWV9BRERSX0xPV0VSCTQKKyNkZWZpbmUgRU5UUllfUjNfVVBQRVIJCTgKKyNkZWZpbmUgRU5UUllfUjNfTE9XRVIJCTEyCisjZGVmaW5lIEVOVFJZX1JFU1YJCTE2CisjZGVmaW5lIEVOVFJZX1BJUgkJMjAKKyNkZWZpbmUgRU5UUllfUjZfVVBQRVIJCTI0CisjZGVmaW5lIEVOVFJZX1I2X0xPV0VSCQkyOAorI2RlZmluZSBFTlRSWV9TSVpFCQkzMgorCisJLyogc2V0dXAgdGhlIGVudHJ5ICovCisJbGkJcjMsMAorCWxpCXI4LDEKKwlzdHcJcjAsRU5UUllfUElSKHIxMCkKKwlzdHcJcjMsRU5UUllfQUREUl9VUFBFUihyMTApCisJc3R3CXI4LEVOVFJZX0FERFJfTE9XRVIocjEwKQorCXN0dwlyMyxFTlRSWV9SM19VUFBFUihyMTApCisJc3R3CXI0LEVOVFJZX1IzX0xPV0VSKHIxMCkKKwlzdHcJcjMsRU5UUllfUjZfVVBQRVIocjEwKQorCXN0dwlyMyxFTlRSWV9SNl9MT1dFUihyMTApCisKKwkvKiBsb2FkIHIxMyB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZSAnYm9vdHBnJyBpbiBTRFJBTSAqLworCWxpcwlyMTMsdG9yZXNldChfX2Jvb3RwZ19hZGRyKUBoCisJb3JpCXIxMyxyMTMsdG9yZXNldChfX2Jvb3RwZ19hZGRyKUBsCisJbHd6CXIxMywwKHIxMykKKworCS8qIHNldHVwIG1hcHBpbmcgZm9yIEFTID0gMSwgYW5kIGp1bXAgdGhlcmUgKi8KKwlsaXMJcjExLChNQVMwX1RMQlNFTCgxKXxNQVMwX0VTRUwoMSkpQGgKKwltdHNwcglTUFJOX01BUzAscjExCisJbGlzCXIxMSwoTUFTMV9WQUxJRHxNQVMxX0lQUk9UKUBoCisJb3JpCXIxMSxyMTEsKE1BUzFfVFN8TUFTMV9UU0laRShCT09LRV9QQUdFU1pfNEspKUBsCisJbXRzcHIJU1BSTl9NQVMxLHIxMQorCW9yaXMJcjExLHIxMywoTUFTMl9JfE1BUzJfRylAaAorCW9yaQlyMTEscjEzLChNQVMyX0l8TUFTMl9HKUBsCisJbXRzcHIJU1BSTl9NQVMyLHIxMQorCW9yaXMJcjExLHIxMywoTUFTM19TWHxNQVMzX1NXfE1BUzNfU1IpQGgKKwlvcmkJcjExLHIxMywoTUFTM19TWHxNQVMzX1NXfE1BUzNfU1IpQGwKKwltdHNwcglTUFJOX01BUzMscjExCisJdGxid2UKKworCWJsCTFmCisxOgltZmxyCXIxMQorCS8qCisJICogT1IgaW4gMHhmZmYgdG8gY3JlYXRlIGEgbWFzayBvZiB0aGUgYm9vdHBnIFNEUkFNIGFkZHJlc3MuICBXZSB1c2UKKwkgKiB0aGlzIG1hc2sgdG8gZml4dXAgdGhlIGNwdSBzcGluIHRhYmxlIGFuZCB0aGUgYWRkcmVzcyB0aGF0IHdlIHdhbnQKKwkgKiB0byBqdW1wIHRvLCBlZyBjaGFuZ2UgdGhlbSBmcm9tIDB4ZmZmZmZ4eHggdG8gMHg3ZmZmZnh4eCBpZiB0aGUKKwkgKiBib290cGcgaXMgYXQgMHg3ZmZmZjAwMCBpbiBTRFJBTS4KKwkgKi8KKwlvcmkJcjEzLHIxMywweGZmZgorCWFuZAlyMTEsIHIxMSwgcjEzCisJYW5kCXIxMCwgcjEwLCByMTMKKworCWFkZGkJcjExLHIxMSwoMmYtMWIpCisJbWZtc3IJcjEzCisJb3JpCXIxMixyMTMsTVNSX0lTfE1TUl9EU0BsCisKKwltdHNwcglTUFJOX1NSUjAscjExCisJbXRzcHIJU1BSTl9TUlIxLHIxMgorCXJmaQorCisJLyogc3BpbiB3YWl0aW5nIGZvciBhZGRyICovCisyOgorCWx3eglyNCxFTlRSWV9BRERSX0xPV0VSKHIxMCkKKwlhbmRpLglyMTEscjQsMQorCWJuZQkyYgorCWlzeW5jCisKKwkvKiBzZXR1cCBJVk9ScyB0byBtYXRjaCBmaXhlZCBvZmZzZXRzICovCisjaW5jbHVkZSAiZml4ZWRfaXZvci5TIgorCisJLyogZ2V0IHRoZSB1cHBlciBiaXRzIG9mIHRoZSBhZGRyICovCisJbHd6CXIxMSxFTlRSWV9BRERSX1VQUEVSKHIxMCkKKworCS8qIHNldHVwIGJyYW5jaCBhZGRyICovCisJbXRzcHIJU1BSTl9TUlIwLHI0CisKKwkvKiBtYXJrIHRoZSBlbnRyeSBhcyByZWxlYXNlZCAqLworCWxpCXI4LDMKKwlzdHcJcjgsRU5UUllfQUREUl9MT1dFUihyMTApCisKKwkvKiBtYXNrIGJ5IH42NE0gdG8gc2V0dXAgb3VyIHRsYiB3ZSB3aWxsIGp1bXAgdG8gKi8KKwlybHdpbm0JcjEyLHI0LDAsMCw1CisKKwkvKiBzZXR1cCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOSAqLworCWx3eglyMyxFTlRSWV9SM19MT1dFUihyMTApCisJbGkJcjQsMAorCWxpCXI1LDAKKwlsd3oJcjYsRU5UUllfUjZfTE9XRVIocjEwKQorCWxpcwlyNywoNjQqMTAyNCoxMDI0KUBoCisJbGkJcjgsMAorCWxpCXI5LDAKKworCS8qIGxvYWQgdXAgdGhlIHBpciAqLworCWx3eglyMCxFTlRSWV9QSVIocjEwKQorCW10c3ByCVNQUk5fUElSLHIwCisJbWZzcHIJcjAsU1BSTl9QSVIKKwlzdHcJcjAsRU5UUllfUElSKHIxMCkKKworCW10c3ByCUlWUFIscjEyCisvKgorICogQ29taW5nIGhlcmUsIHdlIGtub3cgdGhlIGNwdSBoYXMgb25lIFRMQiBtYXBwaW5nIGluIFRMQjFbMF0KKyAqIHdoaWNoIG1hcHMgMHhmZmZmZjAwMC0weGZmZmZmZmZmIG9uZS10by1vbmUuICBXZSBzZXQgdXAgYQorICogc2Vjb25kIG1hcHBpbmcgdGhhdCBtYXBzIGFkZHIgMToxIGZvciA2NE0sIGFuZCB0aGVuIHdlIGp1bXAgdG8KKyAqIGFkZHIKKyAqLworCWxpcwlyMTAsKE1BUzBfVExCU0VMKDEpfE1BUzBfRVNFTCgwKSlAaAorCW10c3ByCVNQUk5fTUFTMCxyMTAKKwlsaXMJcjEwLChNQVMxX1ZBTElEfE1BUzFfSVBST1QpQGgKKwlvcmkJcjEwLHIxMCwoTUFTMV9UU0laRShCT09LRV9QQUdFU1pfNjRNKSlAbAorCW10c3ByCVNQUk5fTUFTMSxyMTAKKwkvKiBXSU1HRSA9IDBiMDAwMDAgZm9yIG5vdyAqLworCW10c3ByCVNQUk5fTUFTMixyMTIKKwlvcmkJcjEyLHIxMiwoTUFTM19TWHxNQVMzX1NXfE1BUzNfU1IpCisJbXRzcHIJU1BSTl9NQVMzLHIxMgorI2lmZGVmIENPTkZJR19FTkFCTEVfMzZCSVRfUEhZUworCW10c3ByCVNQUk5fTUFTNyxyMTEKKyNlbmRpZgorCXRsYndlCisKKy8qIE5vdyB3ZSBoYXZlIGFub3RoZXIgbWFwcGluZyBmb3IgdGhpcyBwYWdlLCBzbyB3ZSBqdW1wIHRvIHRoYXQKKyAqIG1hcHBpbmcKKyAqLworCW10c3ByCVNQUk5fU1JSMSxyMTMKKwlyZmkKKworCS8qCisJICogQWxsb2NhdGUgc29tZSBzcGFjZSBmb3IgdGhlIFNEUkFNIGFkZHJlc3Mgb2YgdGhlIGJvb3RwZy4KKwkgKiBUaGlzIHZhcmlhYmxlIGhhcyB0byBiZSBpbiB0aGUgYm9vdCBwYWdlIHNvIHRoYXQgaXQgY2FuCisJICogYmUgYWNjZXNzZWQgYnkgc2Vjb25kYXJ5IGNvcmVzIHdoZW4gdGhleSBjb21lIG91dCBvZiByZXNldC4KKwkgKi8KKwkuZ2xvYmwgX19ib290cGdfYWRkcgorX19ib290cGdfYWRkcjoKKwkubG9uZwkwCisKKwkuYWxpZ24gTDFfQ0FDSEVfU0hJRlQKKwkuZ2xvYmwgX19zcGluX3RhYmxlCitfX3NwaW5fdGFibGU6CisJLnNwYWNlIENPTkZJR19NQVhfQ1BVUypFTlRSWV9TSVpFCisKKwkvKiBGaWxsIGluIHRoZSBlbXB0eSBzcGFjZS4gIFRoZSBhY3R1YWwgcmVzZXQgdmVjdG9yIGlzCisJICogdGhlIGxhc3Qgd29yZCBvZiB0aGUgcGFnZSAqLworX19zZWNvbmRhcnlfc3RhcnRfY29kZV9lbmQ6CisJLnNwYWNlIDQwOTIgLSAoX19zZWNvbmRhcnlfc3RhcnRfY29kZV9lbmQgLSBfX3NlY29uZGFyeV9zdGFydF9wYWdlKQorX19zZWNvbmRhcnlfcmVzZXRfdmVjdG9yOgorCWIJX19zZWNvbmRhcnlfc3RhcnRfcGFnZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3Jlc2V0dmVjLlMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvcmVzZXR2ZWMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTU1NWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3Jlc2V0dmVjLlMKQEAgLTAsMCArMSwyIEBACisJLnNlY3Rpb24gLnJlc2V0dmVjLCJheCIKKwliIF9zdGFydF9lNTAwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvc2VyaWFsX3NjYy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3NlcmlhbF9zY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFiMjEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3NlcmlhbF9zY2MuYwpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMyBNb3Rvcm9sYSBJbmMuCisgKiBYaWFuZ2h1YSBYaWFvIChYLlhpYW9AbW90b3JvbGEuY29tKQorICogTW9kaWZpZWQgYmFzZWQgb24gODI2MCBmb3IgODU2MC4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogSGFja2VkIGZvciBNUEM4MjYwIGJ5IE11cnJheS5KZW5zZW5AY21zdC5jc2lyby5hdSwgMTktT2N0LTAwLgorICovCisKKy8qCisgKiBNaW5pbWFsIHNlcmlhbCBmdW5jdGlvbnMgbmVlZGVkIHRvIHVzZSBvbmUgb2YgdGhlIFNDQyBwb3J0cworICogYXMgc2VyaWFsIGNvbnNvbGUgaW50ZXJmYWNlLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vY3BtXzg1eHguaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT05TX09OX1NDQykKKworI2lmIENPTkZJR19DT05TX0lOREVYID09IDEJLyogQ29uc29sZSBvbiBTQ0MxICovCisKKyNkZWZpbmUgU0NDX0lOREVYCQkwCisjZGVmaW5lIFBST0ZGX1NDQwkJUFJPRkZfU0NDMQorI2RlZmluZSBDTVhTQ1JfTUFTSwkJKENNWFNDUl9HUjF8Q01YU0NSX1NDMXxcCisJCQkJCUNNWFNDUl9SUzFDU19NU0t8Q01YU0NSX1RTMUNTX01TSykKKyNkZWZpbmUgQ01YU0NSX1ZBTFVFCQkoQ01YU0NSX1JTMUNTX0JSRzF8Q01YU0NSX1RTMUNTX0JSRzEpCisjZGVmaW5lIENQTV9DUl9TQ0NfUEFHRQkJQ1BNX0NSX1NDQzFfUEFHRQorI2RlZmluZSBDUE1fQ1JfU0NDX1NCTE9DSwlDUE1fQ1JfU0NDMV9TQkxPQ0sKKworI2VsaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gMgkvKiBDb25zb2xlIG9uIFNDQzIgKi8KKworI2RlZmluZSBTQ0NfSU5ERVgJCTEKKyNkZWZpbmUgUFJPRkZfU0NDCQlQUk9GRl9TQ0MyCisjZGVmaW5lIENNWFNDUl9NQVNLCQkoQ01YU0NSX0dSMnxDTVhTQ1JfU0MyfFwKKwkJCQkJQ01YU0NSX1JTMkNTX01TS3xDTVhTQ1JfVFMyQ1NfTVNLKQorI2RlZmluZSBDTVhTQ1JfVkFMVUUJCShDTVhTQ1JfUlMyQ1NfQlJHMnxDTVhTQ1JfVFMyQ1NfQlJHMikKKyNkZWZpbmUgQ1BNX0NSX1NDQ19QQUdFCQlDUE1fQ1JfU0NDMl9QQUdFCisjZGVmaW5lIENQTV9DUl9TQ0NfU0JMT0NLCUNQTV9DUl9TQ0MyX1NCTE9DSworCisjZWxpZiBDT05GSUdfQ09OU19JTkRFWCA9PSAzCS8qIENvbnNvbGUgb24gU0NDMyAqLworCisjZGVmaW5lIFNDQ19JTkRFWAkJMgorI2RlZmluZSBQUk9GRl9TQ0MJCVBST0ZGX1NDQzMKKyNkZWZpbmUgQ01YU0NSX01BU0sJCShDTVhTQ1JfR1IzfENNWFNDUl9TQzN8XAorCQkJCQlDTVhTQ1JfUlMzQ1NfTVNLfENNWFNDUl9UUzNDU19NU0spCisjZGVmaW5lIENNWFNDUl9WQUxVRQkJKENNWFNDUl9SUzNDU19CUkczfENNWFNDUl9UUzNDU19CUkczKQorI2RlZmluZSBDUE1fQ1JfU0NDX1BBR0UJCUNQTV9DUl9TQ0MzX1BBR0UKKyNkZWZpbmUgQ1BNX0NSX1NDQ19TQkxPQ0sJQ1BNX0NSX1NDQzNfU0JMT0NLCisKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDQJLyogQ29uc29sZSBvbiBTQ0M0ICovCisKKyNkZWZpbmUgU0NDX0lOREVYCQkzCisjZGVmaW5lIFBST0ZGX1NDQwkJUFJPRkZfU0NDNAorI2RlZmluZSBDTVhTQ1JfTUFTSwkJKENNWFNDUl9HUjR8Q01YU0NSX1NDNHxcCisJCQkJCUNNWFNDUl9SUzRDU19NU0t8Q01YU0NSX1RTNENTX01TSykKKyNkZWZpbmUgQ01YU0NSX1ZBTFVFCQkoQ01YU0NSX1JTNENTX0JSRzR8Q01YU0NSX1RTNENTX0JSRzQpCisjZGVmaW5lIENQTV9DUl9TQ0NfUEFHRQkJQ1BNX0NSX1NDQzRfUEFHRQorI2RlZmluZSBDUE1fQ1JfU0NDX1NCTE9DSwlDUE1fQ1JfU0NDNF9TQkxPQ0sKKworI2Vsc2UKKworI2Vycm9yICJjb25zb2xlIG5vdCBjb3JyZWN0bHkgZGVmaW5lZCIKKworI2VuZGlmCisKK2ludCBzZXJpYWxfaW5pdCAodm9pZCkKK3sKKwl2b2xhdGlsZSBjY3NyX2NwbV90ICpjcG0gPSAoY2Nzcl9jcG1fdCAqKUNPTkZJR19TWVNfTVBDODV4eF9DUE1fQUREUjsKKwl2b2xhdGlsZSBjY3NyX2NwbV9zY2NfdCAqc3A7CisJdm9sYXRpbGUgc2NjX3VhcnRfdCAqdXA7CisJdm9sYXRpbGUgY2JkX3QgKnRiZGYsICpyYmRmOworCXZvbGF0aWxlIGNjc3JfY3BtX2NwX3QgKmNwID0gJihjcG0tPmltX2NwbV9jcCk7CisJdWludAlkcGFkZHI7CisKKwkvKiBpbml0aWFsaXplIHBvaW50ZXJzIHRvIFNDQyAqLworCisJc3AgPSAoY2Nzcl9jcG1fc2NjX3QgKikgJihjcG0tPmltX2NwbV9zY2NbU0NDX0lOREVYXSk7CisJdXAgPSAoc2NjX3VhcnRfdCAqKSYoY3BtLT5pbV9kcHJhbWJhc2VbUFJPRkZfU0NDXSk7CisKKwkvKiBEaXNhYmxlIHRyYW5zbWl0dGVyL3JlY2VpdmVyLgorCSovCisJc3AtPmdzbXJsICY9IH4oU0NDX0dTTVJMX0VOUiB8IFNDQ19HU01STF9FTlQpOworCisJLyogcHV0IHRoZSBTQ0MgY2hhbm5lbCBpbnRvIE5NU0kgKG5vbiBtdWx0aXBsZXhkIHNlcmlhbCBpbnRlcmZhY2UpCisJICogbW9kZSBhbmQgd2lyZSB0aGUgc2VsZWN0ZWQgU0NDIFR4IGFuZCBSeCBjbG9ja3MgdG8gQlJHeCAoMTUtMTUpLgorCSAqLworCWNwbS0+aW1fY3BtX211eC5jbXhzY3IgPSBcCisJCShjcG0tPmltX2NwbV9tdXguY214c2NyJn5DTVhTQ1JfTUFTSyl8Q01YU0NSX1ZBTFVFOworCisJLyogU2V0IHVwIHRoZSBiYXVkIHJhdGUgZ2VuZXJhdG9yLgorCSovCisJc2VyaWFsX3NldGJyZyAoKTsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0d28gYnVmZmVyIGRlc2NyaXB0b3JzIGluIHRoZSBEUCByYW0uCisJICogZGFtbTogYWxsb2NhdGluZyBzcGFjZSBhZnRlciB0aGUgdHdvIGJ1ZmZlcnMgZm9yIHJ4L3R4IGRhdGEKKwkgKi8KKworCWRwYWRkciA9IG04NTYwX2NwbV9kcGFsbG9jKCgyICogc2l6ZW9mIChjYmRfdCkpICsgMiwgMTYpOworCisJLyogU2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBob3N0IG1lbW9yeSBidWZmZXJzIGluCisJICogdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycy4KKwkgKi8KKwlyYmRmID0gKGNiZF90ICopJihjcG0tPmltX2RwcmFtYmFzZVtkcGFkZHJdKTsKKwlyYmRmLT5jYmRfYnVmYWRkciA9ICh1aW50KSAocmJkZisyKTsKKwlyYmRmLT5jYmRfc2MgPSBCRF9TQ19FTVBUWSB8IEJEX1NDX1dSQVA7CisJdGJkZiA9IHJiZGYgKyAxOworCXRiZGYtPmNiZF9idWZhZGRyID0gKCh1aW50KSAocmJkZisyKSkgKyAxOworCXRiZGYtPmNiZF9zYyA9IEJEX1NDX1dSQVA7CisKKwkvKiBTZXQgdXAgdGhlIHVhcnQgcGFyYW1ldGVycyBpbiB0aGUgcGFyYW1ldGVyIHJhbS4KKwkqLworCXVwLT5zY2NfZ2Vuc2NjLnNjY19yYmFzZSA9IGRwYWRkcjsKKwl1cC0+c2NjX2dlbnNjYy5zY2NfdGJhc2UgPSBkcGFkZHIrc2l6ZW9mKGNiZF90KTsKKwl1cC0+c2NjX2dlbnNjYy5zY2NfcmZjciA9IENQTUZDUl9FQjsKKwl1cC0+c2NjX2dlbnNjYy5zY2NfdGZjciA9IENQTUZDUl9FQjsKKwl1cC0+c2NjX2dlbnNjYy5zY2NfbXJibHIgPSAxOworCXVwLT5zY2NfbWF4aWRsID0gMDsKKwl1cC0+c2NjX2Jya2NyID0gMTsKKwl1cC0+c2NjX3BhcmVjID0gMDsKKwl1cC0+c2NjX2ZybWVjID0gMDsKKwl1cC0+c2NjX25vc2VjID0gMDsKKwl1cC0+c2NjX2Jya2VjID0gMDsKKwl1cC0+c2NjX3VhZGRyMSA9IDA7CisJdXAtPnNjY191YWRkcjIgPSAwOworCXVwLT5zY2NfdG9zZXEgPSAwOworCXVwLT5zY2NfY2hhcjEgPSB1cC0+c2NjX2NoYXIyID0gdXAtPnNjY19jaGFyMyA9IHVwLT5zY2NfY2hhcjQgPSAweDgwMDA7CisJdXAtPnNjY19jaGFyNSA9IHVwLT5zY2NfY2hhcjYgPSB1cC0+c2NjX2NoYXI3ID0gdXAtPnNjY19jaGFyOCA9IDB4ODAwMDsKKwl1cC0+c2NjX3JjY20gPSAweGMwZmY7CisKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzIGFuZCByZW1vdmUgYW55dGhpbmcgcGVuZGluZy4KKwkqLworCXNwLT5zY2NtID0gMDsKKwlzcC0+c2NjZSA9IDB4ZmZmZjsKKworCS8qIFNldCA4IGJpdCBGSUZPLCAxNiBiaXQgb3ZlcnNhbXBsaW5nIGFuZCBVQVJUIG1vZGUuCisJKi8KKwlzcC0+Z3NtcmggPSBTQ0NfR1NNUkhfUkZXOwkvKiA4IGJpdCBGSUZPICovCisJc3AtPmdzbXJsID0gXAorCQlTQ0NfR1NNUkxfVERDUl8xNiB8IFNDQ19HU01STF9SRENSXzE2IHwgU0NDX0dTTVJMX01PREVfVUFSVDsKKworCS8qIFNldCBDVFMgbm8gZmxvdyBjb250cm9sLCAxIHN0b3AgYml0LCA4IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoLAorCSAqIG5vcm1hbCBhc3luYyBVQVJUIG1vZGUsIG5vIHBhcml0eQorCSAqLworCXNwLT5wc21yID0gU0NVX1BTTVJfQ0w7CisKKwkvKiBleGVjdXRlIHRoZSAiSW5pdCBSeCBhbmQgVHggcGFyYW1zIiBDUCBjb21tYW5kLgorCSovCisKKwl3aGlsZSAoY3AtPmNwY3IgJiBDUE1fQ1JfRkxHKSAgLyogd2FpdCBpZiBjcCBpcyBidXN5ICovCisJICA7CisKKwljcC0+Y3BjciA9IG1rX2NyX2NtZChDUE1fQ1JfU0NDX1BBR0UsIENQTV9DUl9TQ0NfU0JMT0NLLAorCQkJCQkwLCBDUE1fQ1JfSU5JVF9UUlgpIHwgQ1BNX0NSX0ZMRzsKKworCXdoaWxlIChjcC0+Y3BjciAmIENQTV9DUl9GTEcpICAvKiB3YWl0IGlmIGNwIGlzIGJ1c3kgKi8KKwkgIDsKKworCS8qIEVuYWJsZSB0cmFuc21pdHRlci9yZWNlaXZlci4KKwkqLworCXNwLT5nc21ybCB8PSBTQ0NfR1NNUkxfRU5SIHwgU0NDX0dTTVJMX0VOVDsKKworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3NlcmlhbF9zZXRicmcgKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ09OU19VU0VfRVhUQykKKwltODU2MF9jcG1fZXh0Y2JyZyhTQ0NfSU5ERVgsIGdkLT5iYXVkcmF0ZSwKKwkJQ09ORklHX0NPTlNfRVhUQ19SQVRFLCBDT05GSUdfQ09OU19FWFRDX1BJTlNFTCk7CisjZWxzZQorCW04NTYwX2NwbV9zZXRicmcoU0NDX0lOREVYLCBnZC0+YmF1ZHJhdGUpOworI2VuZGlmCit9CisKK3ZvaWQKK3NlcmlhbF9wdXRjKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBzY2NfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBjYmRfdAkJKnRiZGY7CisJdm9sYXRpbGUgY2Nzcl9jcG1fdAkqY3BtID0gKGNjc3JfY3BtX3QgKilDT05GSUdfU1lTX01QQzg1eHhfQ1BNX0FERFI7CisKKwlpZiAoYyA9PSAnXG4nKQorCQlzZXJpYWxfcHV0YyAoJ1xyJyk7CisKKwl1cCA9IChzY2NfdWFydF90ICopJihjcG0tPmltX2RwcmFtYmFzZVtQUk9GRl9TQ0NdKTsKKwl0YmRmID0gKGNiZF90ICopJihjcG0tPmltX2RwcmFtYmFzZVt1cC0+c2NjX2dlbnNjYy5zY2NfdGJhc2VdKTsKKworCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLgorCSAqLworCXdoaWxlICh0YmRmLT5jYmRfc2MgJiBCRF9TQ19SRUFEWSkKKwkJOworCisJLyogTG9hZCB0aGUgY2hhcmFjdGVyIGludG8gdGhlIHRyYW5zbWl0IGJ1ZmZlci4KKwkgKi8KKwkqKHZvbGF0aWxlIGNoYXIgKil0YmRmLT5jYmRfYnVmYWRkciA9IGM7CisJdGJkZi0+Y2JkX2RhdGxlbiA9IDE7CisJdGJkZi0+Y2JkX3NjIHw9IEJEX1NDX1JFQURZOworfQorCit2b2lkCitzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJc2VyaWFsX3B1dGMgKCpzKyspOworCX0KK30KKworaW50CitzZXJpYWxfZ2V0Yyh2b2lkKQoreworCXZvbGF0aWxlIGNiZF90CQkqcmJkZjsKKwl2b2xhdGlsZSBzY2NfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBjY3NyX2NwbV90CSpjcG0gPSAoY2Nzcl9jcG1fdCAqKUNPTkZJR19TWVNfTVBDODV4eF9DUE1fQUREUjsKKwl1bnNpZ25lZCBjaGFyCQljOworCisJdXAgPSAoc2NjX3VhcnRfdCAqKSYoY3BtLT5pbV9kcHJhbWJhc2VbUFJPRkZfU0NDXSk7CisJcmJkZiA9IChjYmRfdCAqKSYoY3BtLT5pbV9kcHJhbWJhc2VbdXAtPnNjY19nZW5zY2Muc2NjX3JiYXNlXSk7CisKKwkvKiBXYWl0IGZvciBjaGFyYWN0ZXIgdG8gc2hvdyB1cC4KKwkgKi8KKwl3aGlsZSAocmJkZi0+Y2JkX3NjICYgQkRfU0NfRU1QVFkpCisJCTsKKworCS8qIEdyYWIgdGhlIGNoYXIgYW5kIGNsZWFyIHRoZSBidWZmZXIgYWdhaW4uCisJICovCisJYyA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXJiZGYtPmNiZF9idWZhZGRyOworCXJiZGYtPmNiZF9zYyB8PSBCRF9TQ19FTVBUWTsKKworCXJldHVybiAoYyk7Cit9CisKK2ludAorc2VyaWFsX3RzdGMoKQoreworCXZvbGF0aWxlIGNiZF90CQkqcmJkZjsKKwl2b2xhdGlsZSBzY2NfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBjY3NyX2NwbV90CSpjcG0gPSAoY2Nzcl9jcG1fdCAqKUNPTkZJR19TWVNfTVBDODV4eF9DUE1fQUREUjsKKworCXVwID0gKHNjY191YXJ0X3QgKikmKGNwbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NDQ10pOworCXJiZGYgPSAoY2JkX3QgKikmKGNwbS0+aW1fZHByYW1iYXNlW3VwLT5zY2NfZ2Vuc2NjLnNjY19yYmFzZV0pOworCisJcmV0dXJuICgocmJkZi0+Y2JkX3NjICYgQkRfU0NfRU1QVFkpID09IDApOworfQorCisjZW5kaWYJLyogQ09ORklHX0NPTlNfT05fU0NDICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvc3BlZWQuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9zcGVlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGVkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvc3BlZWQuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LCAyMDA3LTIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDMgTW90b3JvbGEgSW5jLgorICogWGlhbmdodWEgWGlhbywgKFguWGlhb0Btb3Rvcm9sYS5jb20pCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgZ2V0X3N5c19pbmZvIChzeXNfaW5mb190ICogc3lzSW5mbykKK3sKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfR1VUU19BRERSKTsKKyNpZmRlZiBDT05GSUdfRlNMX0NPUkVORVQKKwl2b2xhdGlsZSBjY3NyX2Nsa190ICpjbGsgPSAodm9pZCAqKShDT05GSUdfU1lTX0ZTTF9DT1JFTkVUX0NMS19BRERSKTsKKworCWNvbnN0IHU4IGNvcmVfY3BseF9QTExbMTZdID0geworCQlbIDBdID0gMCwJLyogQ0MxIFBQTCAvIDEgKi8KKwkJWyAxXSA9IDAsCS8qIENDMSBQUEwgLyAyICovCisJCVsgMl0gPSAwLAkvKiBDQzEgUFBMIC8gNCAqLworCQlbIDRdID0gMSwJLyogQ0MyIFBQTCAvIDEgKi8KKwkJWyA1XSA9IDEsCS8qIENDMiBQUEwgLyAyICovCisJCVsgNl0gPSAxLAkvKiBDQzIgUFBMIC8gNCAqLworCQlbIDhdID0gMiwJLyogQ0MzIFBQTCAvIDEgKi8KKwkJWyA5XSA9IDIsCS8qIENDMyBQUEwgLyAyICovCisJCVsxMF0gPSAyLAkvKiBDQzMgUFBMIC8gNCAqLworCQlbMTJdID0gMywJLyogQ0M0IFBQTCAvIDEgKi8KKwkJWzEzXSA9IDMsCS8qIENDNCBQUEwgLyAyICovCisJCVsxNF0gPSAzLAkvKiBDQzQgUFBMIC8gNCAqLworCX07CisKKwljb25zdCB1OCBjb3JlX2NwbHhfUExMX2RpdlsxNl0gPSB7CisJCVsgMF0gPSAxLAkvKiBDQzEgUFBMIC8gMSAqLworCQlbIDFdID0gMiwJLyogQ0MxIFBQTCAvIDIgKi8KKwkJWyAyXSA9IDQsCS8qIENDMSBQUEwgLyA0ICovCisJCVsgNF0gPSAxLAkvKiBDQzIgUFBMIC8gMSAqLworCQlbIDVdID0gMiwJLyogQ0MyIFBQTCAvIDIgKi8KKwkJWyA2XSA9IDQsCS8qIENDMiBQUEwgLyA0ICovCisJCVsgOF0gPSAxLAkvKiBDQzMgUFBMIC8gMSAqLworCQlbIDldID0gMiwJLyogQ0MzIFBQTCAvIDIgKi8KKwkJWzEwXSA9IDQsCS8qIENDMyBQUEwgLyA0ICovCisJCVsxMl0gPSAxLAkvKiBDQzQgUFBMIC8gMSAqLworCQlbMTNdID0gMiwJLyogQ0M0IFBQTCAvIDIgKi8KKwkJWzE0XSA9IDQsCS8qIENDNCBQUEwgLyA0ICovCisJfTsKKwl1aW50IGxjcnJfZGl2LCBpLCBmcmVxQ0NfUExMWzRdLCByY3dfdG1wOworCXVuc2lnbmVkIGxvbmcgc3lzY2xrID0gQ09ORklHX1NZU19DTEtfRlJFUTsKKworCXN5c0luZm8tPmZyZXFTeXN0ZW1CdXMgPSBzeXNjbGs7CisJc3lzSW5mby0+ZnJlcUREUkJ1cyA9IHN5c2NsazsKKwlmcmVxQ0NfUExMWzBdID0gc3lzY2xrOworCWZyZXFDQ19QTExbMV0gPSBzeXNjbGs7CisJZnJlcUNDX1BMTFsyXSA9IHN5c2NsazsKKwlmcmVxQ0NfUExMWzNdID0gc3lzY2xrOworCisJc3lzSW5mby0+ZnJlcVN5c3RlbUJ1cyAqPSAoaW5fYmUzMigmZ3VyLT5yY3dzclswXSkgPj4gMjUpICYgMHgxZjsKKwlzeXNJbmZvLT5mcmVxRERSQnVzICo9ICgoaW5fYmUzMigmZ3VyLT5yY3dzclswXSkgPj4gMTcpICYgMHgxZik7CisJZnJlcUNDX1BMTFswXSAqPSAoaW5fYmUzMigmY2xrLT5wbGxjMWdzcikgPj4gMSkgJiAweDNmOworCWZyZXFDQ19QTExbMV0gKj0gKGluX2JlMzIoJmNsay0+cGxsYzJnc3IpID4+IDEpICYgMHgzZjsKKwlmcmVxQ0NfUExMWzJdICo9IChpbl9iZTMyKCZjbGstPnBsbGMzZ3NyKSA+PiAxKSAmIDB4M2Y7CisJZnJlcUNDX1BMTFszXSAqPSAoaW5fYmUzMigmY2xrLT5wbGxjNGdzcikgPj4gMSkgJiAweDNmOworCisJcmN3X3RtcCA9IGluX2JlMzIoJmd1ci0+cmN3c3JbM10pOworCWZvciAoaSA9IDA7IGkgPCBjcHVfbnVtY29yZXMoKTsgaSsrKSB7CisJCXUzMiBjX3BsbF9zZWwgPSAoaW5fYmUzMigmY2xrLT5jbGtjMGNzciArIGkqOCkgPj4gMjcpICYgMHhmOworCQl1MzIgY3BseF9wbGwgPSBjb3JlX2NwbHhfUExMW2NfcGxsX3NlbF07CisKKwkJc3lzSW5mby0+ZnJlcVByb2Nlc3NvcltpXSA9CisJCQkgZnJlcUNDX1BMTFtjcGx4X3BsbF0gLyBjb3JlX2NwbHhfUExMX2RpdltjX3BsbF9zZWxdOworCX0KKworI2RlZmluZSBQTUVfQ0xLX1NFTAkweDgwMDAwMDAwCisjZGVmaW5lIEZNMV9DTEtfU0VMCTB4NDAwMDAwMDAKKyNkZWZpbmUgRk0yX0NMS19TRUwJMHgyMDAwMDAwMAorCXJjd190bXAgPSBpbl9iZTMyKCZndXItPnJjd3NyWzddKTsKKworI2lmZGVmIENPTkZJR19TWVNfRFBBQV9QTUUKKwlpZiAocmN3X3RtcCAmIFBNRV9DTEtfU0VMKQorCQlzeXNJbmZvLT5mcmVxUE1FID0gZnJlcUNDX1BMTFsyXSAvIDI7CisJZWxzZQorCQlzeXNJbmZvLT5mcmVxUE1FID0gc3lzSW5mby0+ZnJlcVN5c3RlbUJ1cyAvIDI7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TWVNfRFBBQV9GTUFOCisJaWYgKHJjd190bXAgJiBGTTFfQ0xLX1NFTCkKKwkJc3lzSW5mby0+ZnJlcUZNYW5bMF0gPSBmcmVxQ0NfUExMWzJdIC8gMjsKKwllbHNlCisJCXN5c0luZm8tPmZyZXFGTWFuWzBdID0gc3lzSW5mby0+ZnJlcVN5c3RlbUJ1cyAvIDI7CisjaWYgKENPTkZJR19TWVNfTlVNX0ZNQU4pID09IDIKKwlpZiAocmN3X3RtcCAmIEZNMl9DTEtfU0VMKQorCQlzeXNJbmZvLT5mcmVxRk1hblsxXSA9IGZyZXFDQ19QTExbMl0gLyAyOworCWVsc2UKKwkJc3lzSW5mby0+ZnJlcUZNYW5bMV0gPSBzeXNJbmZvLT5mcmVxU3lzdGVtQnVzIC8gMjsKKyNlbmRpZgorI2VuZGlmCisKKyNlbHNlCisJdWludCBwbGF0X3JhdGlvLGU1MDBfcmF0aW8saGFsZl9mcmVxU3lzdGVtQnVzOworCXVpbnQgbGNycl9kaXY7CisJaW50IGk7CisjaWZkZWYgQ09ORklHX1FFCisJdTMyIHFlX3JhdGlvOworI2VuZGlmCisKKwlwbGF0X3JhdGlvID0gKGd1ci0+cG9ycGxsc3IpICYgMHgwMDAwMDAzZTsKKwlwbGF0X3JhdGlvID4+PSAxOworCXN5c0luZm8tPmZyZXFTeXN0ZW1CdXMgPSBwbGF0X3JhdGlvICogQ09ORklHX1NZU19DTEtfRlJFUTsKKworCS8qIERpdmlkZSBiZWZvcmUgbXVsdGlwbHkgdG8gYXZvaWQgaW50ZWdlcgorCSAqIG92ZXJmbG93IGZvciBwcm9jZXNzb3Igc3BlZWRzIGFib3ZlIDJHSHogKi8KKwloYWxmX2ZyZXFTeXN0ZW1CdXMgPSBzeXNJbmZvLT5mcmVxU3lzdGVtQnVzLzI7CisJZm9yIChpID0gMDsgaSA8IGNwdV9udW1jb3JlcygpOyBpKyspIHsKKwkJZTUwMF9yYXRpbyA9ICgoZ3VyLT5wb3JwbGxzcikgPj4gKGkgKiA4ICsgMTYpKSAmIDB4M2Y7CisJCXN5c0luZm8tPmZyZXFQcm9jZXNzb3JbaV0gPSBlNTAwX3JhdGlvICogaGFsZl9mcmVxU3lzdGVtQnVzOworCX0KKworCS8qIE5vdGU6IGZyZXFERFJCdXMgaXMgdGhlIE1DTEsgZnJlcXVlbmN5LCBub3QgdGhlIGRhdGEgcmF0ZS4gKi8KKwlzeXNJbmZvLT5mcmVxRERSQnVzID0gc3lzSW5mby0+ZnJlcVN5c3RlbUJ1czsKKworI2lmZGVmIENPTkZJR19ERFJfQ0xLX0ZSRVEKKwl7CisJCXUzMiBkZHJfcmF0aW8gPSAoKGd1ci0+cG9ycGxsc3IpICYgTVBDODV4eF9QT1JQTExTUl9ERFJfUkFUSU8pCisJCQk+PiBNUEM4NXh4X1BPUlBMTFNSX0REUl9SQVRJT19TSElGVDsKKwkJaWYgKGRkcl9yYXRpbyAhPSAweDcpCisJCQlzeXNJbmZvLT5mcmVxRERSQnVzID0gZGRyX3JhdGlvICogQ09ORklHX0REUl9DTEtfRlJFUTsKKwl9CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1FFCisJcWVfcmF0aW8gPSAoKGd1ci0+cG9ycGxsc3IpICYgTVBDODV4eF9QT1JQTExTUl9RRV9SQVRJTykKKwkJCT4+IE1QQzg1eHhfUE9SUExMU1JfUUVfUkFUSU9fU0hJRlQ7CisJc3lzSW5mby0+ZnJlcVFFID0gcWVfcmF0aW8gKiBDT05GSUdfU1lTX0NMS19GUkVROworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTEJDX0xDUlIpCisJLyogV2Ugd2lsbCBwcm9ncmFtIExDUlIgdG8gdGhpcyB2YWx1ZSBsYXRlciAqLworCWxjcnJfZGl2ID0gQ09ORklHX1NZU19MQkNfTENSUiAmIExDUlJfQ0xLRElWOworI2Vsc2UKKwl7CisJICAgIHZvbGF0aWxlIGNjc3JfbGJjX3QgKmxiYyA9ICh2b2lkICopKENPTkZJR19TWVNfTVBDODV4eF9MQkNfQUREUik7CisJICAgIGxjcnJfZGl2ID0gaW5fYmUzMigmbGJjLT5sY3JyKSAmIExDUlJfQ0xLRElWOworCX0KKyNlbmRpZgorCWlmIChsY3JyX2RpdiA9PSAyIHx8IGxjcnJfZGl2ID09IDQgfHwgbGNycl9kaXYgPT0gOCkgeworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9DT1JFTkVUKQorCQkvKiBJZiB0aGlzIGlzIGNvcmVuZXQgYmFzZWQgU29DLCBiaXQtcmVwcmVzZW50YXRpb24KKwkJICogZm9yIGZvdXIgdGltZXMgdGhlIGNsb2NrIGRpdmlkZXIgdmFsdWVzLgorCQkgKi8KKwkJbGNycl9kaXYgKj0gNDsKKyNlbGlmICFkZWZpbmVkKENPTkZJR19NUEM4NTQwKSAmJiAhZGVmaW5lZChDT05GSUdfTVBDODU0MSkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19NUEM4NTU1KSAmJiAhZGVmaW5lZChDT05GSUdfTVBDODU2MCkKKwkJLyoKKwkJICogWWVzLCB0aGUgZW50aXJlIFBRMzggZmFtaWx5IHVzZSB0aGUgc2FtZQorCQkgKiBiaXQtcmVwcmVzZW50YXRpb24gZm9yIHR3aWNlIHRoZSBjbG9jayBkaXZpZGVyIHZhbHVlcy4KKwkJICovCisJCWxjcnJfZGl2ICo9IDI7CisjZW5kaWYKKwkJc3lzSW5mby0+ZnJlcUxvY2FsQnVzID0gc3lzSW5mby0+ZnJlcVN5c3RlbUJ1cyAvIGxjcnJfZGl2OworCX0gZWxzZSB7CisJCS8qIEluIGNhc2UgYW55b25lIGNhcmVzIHdoYXQgdGhlIHVua25vd24gdmFsdWUgaXMgKi8KKwkJc3lzSW5mby0+ZnJlcUxvY2FsQnVzID0gbGNycl9kaXY7CisJfQorfQorCisKK2ludCBnZXRfY2xvY2tzICh2b2lkKQoreworCXN5c19pbmZvX3Qgc3lzX2luZm87CisjaWZkZWYgQ09ORklHX01QQzg1NDQKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAodm9pZCAqKSBDT05GSUdfU1lTX01QQzg1eHhfR1VUU19BRERSOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ1BNMikKKwl2b2xhdGlsZSBjY3NyX2NwbV90ICpjcG0gPSAoY2Nzcl9jcG1fdCAqKUNPTkZJR19TWVNfTVBDODV4eF9DUE1fQUREUjsKKwl1aW50IHNjY3IsIGRmYnJnOworCisJLyogc2V0IFZDTyA9IDQgKiBCUkcgKi8KKwljcG0tPmltX2NwbV9pbnRjdGwuc2NjciAmPSAweGZmZmZmZmZjOworCXNjY3IgPSBjcG0tPmltX2NwbV9pbnRjdGwuc2NjcjsKKwlkZmJyZyA9IChzY2NyICYgU0NDUl9ERkJSR19NU0spID4+IFNDQ1JfREZCUkdfU0hJRlQ7CisjZW5kaWYKKwlnZXRfc3lzX2luZm8gKCZzeXNfaW5mbyk7CisJZ2QtPmNwdV9jbGsgPSBzeXNfaW5mby5mcmVxUHJvY2Vzc29yWzBdOworCWdkLT5idXNfY2xrID0gc3lzX2luZm8uZnJlcVN5c3RlbUJ1czsKKwlnZC0+bWVtX2NsayA9IHN5c19pbmZvLmZyZXFERFJCdXM7CisJZ2QtPmxiY19jbGsgPSBzeXNfaW5mby5mcmVxTG9jYWxCdXM7CisKKyNpZmRlZiBDT05GSUdfUUUKKwlnZC0+cWVfY2xrID0gc3lzX2luZm8uZnJlcVFFOworCWdkLT5icmdfY2xrID0gZ2QtPnFlX2NsayAvIDI7CisjZW5kaWYKKwkvKgorCSAqIFRoZSBiYXNlIGNsb2NrIGZvciBJMkMgZGVwZW5kcyBvbiB0aGUgYWN0dWFsIFNPQy4gIFVuZm9ydHVuYXRlbHksCisJICogdGhlcmUgaXMgbm8gcGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmN5LCBzbworCSAqIHRoZSBvbmx5IGNob2ljZSBpcyB0byBsb29rIHVwIHRoZSBhY3R1YWwgU09DIG51bWJlciBhbmQgdXNlIHRoZSB2YWx1ZQorCSAqIGZvciB0aGF0IFNPQy4gVGhpcyBpbmZvcm1hdGlvbiBpcyB0YWtlbiBmcm9tIGFwcGxpY2F0aW9uIG5vdGUKKwkgKiBBTjI5MTkuCisJICovCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODU0MCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODU0MSkgfHwgXAorCWRlZmluZWQoQ09ORklHX01QQzg1NjApIHx8IGRlZmluZWQoQ09ORklHX01QQzg1NTUpCisJZ2QtPmkyYzFfY2xrID0gc3lzX2luZm8uZnJlcVN5c3RlbUJ1czsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg1NDQpCisJLyoKKwkgKiBPbiB0aGUgODU0NCwgdGhlIEkyQyBjbG9jayBpcyB0aGUgc2FtZSBhcyB0aGUgU0VDIGNsb2NrLiAgVGhpcyBjYW4gYmUKKwkgKiBlaXRoZXIgQ0NCLzIgb3IgQ0NCLzMsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgY2ZnX3NlY19mcmVxLiBTZWUKKwkgKiA0LjQuMy4zIG9mIHRoZSA4NTQ0IFJNLiAgTm90ZSB0aGF0IHRoaXMgbWlnaHQgYWN0dWFsbHkgd29yayBmb3IgYWxsCisJICogODV4eCwgYnV0IG9ubHkgdGhlIDg1NDQgaGFzIGNmZ19zZWNfZnJlcSwgc28gaXQncyB1bmtub3duIGlmIHRoZQorCSAqIFBPUkRFVlNSMl9TRUNfQ0ZHIGJpdCBpcyAwIG9uIGFsbCA4NXh4IGJvYXJkcyB0aGF0IGFyZSBub3QgYW4gODU0NC4KKwkgKi8KKwlpZiAoZ3VyLT5wb3JkZXZzcjIgJiBNUEM4NXh4X1BPUkRFVlNSMl9TRUNfQ0ZHKQorCQlnZC0+aTJjMV9jbGsgPSBzeXNfaW5mby5mcmVxU3lzdGVtQnVzIC8gMzsKKwllbHNlCisJCWdkLT5pMmMxX2NsayA9IHN5c19pbmZvLmZyZXFTeXN0ZW1CdXMgLyAyOworI2Vsc2UKKwkvKiBNb3N0IDg1eHggU09DcyB1c2UgQ0NCLzIsIHNvIHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuICovCisJZ2QtPmkyYzFfY2xrID0gc3lzX2luZm8uZnJlcVN5c3RlbUJ1cyAvIDI7CisjZW5kaWYKKwlnZC0+aTJjMl9jbGsgPSBnZC0+aTJjMV9jbGs7CisKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRVNESEMpCisjaWZkZWYgQ09ORklHX01QQzg1NjkKKwlnZC0+c2RoY19jbGsgPSBnZC0+YnVzX2NsazsKKyNlbHNlCisJZ2QtPnNkaGNfY2xrID0gZ2QtPmJ1c19jbGsgLyAyOworI2VuZGlmCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRlNMX0VTREhDKSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ1BNMikKKwlnZC0+dmNvX291dCA9IDIqc3lzX2luZm8uZnJlcVN5c3RlbUJ1czsKKwlnZC0+Y3BtX2NsayA9IGdkLT52Y29fb3V0IC8gMjsKKwlnZC0+c2NjX2NsayA9IGdkLT52Y29fb3V0IC8gNDsKKwlnZC0+YnJnX2NsayA9IGdkLT52Y29fb3V0IC8gKDEgPDwgKDIgKiAoZGZicmcgKyAxKSkpOworI2VuZGlmCisKKwlpZihnZC0+Y3B1X2NsayAhPSAwKSByZXR1cm4gKDApOworCWVsc2UgcmV0dXJuICgxKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9idXNfZnJlcQorICogcmV0dXJuIHN5c3RlbSBidXMgZnJlcSBpbiBIegorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIGdldF9idXNfZnJlcSAodWxvbmcgZHVtbXkpCit7CisJcmV0dXJuIGdkLT5idXNfY2xrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9kZHJfZnJlcQorICogcmV0dXJuIGRkciBidXMgZnJlcSBpbiBIegorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIGdldF9kZHJfZnJlcSAodWxvbmcgZHVtbXkpCit7CisJcmV0dXJuIGdkLT5tZW1fY2xrOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3N0YXJ0LlMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NiNTZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3N0YXJ0LlMKQEAgLTAsMCArMSwxMTk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDQsIDIwMDctMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNb3Rvcm9sYSxJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogVS1Cb290IFN0YXJ0dXAgQ29kZSBmb3IgTW90b3JvbGEgODV4eCBQb3dlclBDIGJhc2VkIEVtYmVkZGVkIEJvYXJkcworICoKKyAqIFRoZSBwcm9jZXNzb3Igc3RhcnRzIGF0IDB4ZmZmZmZmZmMgYW5kIHRoZSBjb2RlIGlzIGZpcnN0IGV4ZWN1dGVkIGluIHRoZQorICogbGFzdCA0SyBwYWdlKDB4ZmZmZmYwMDAtMHhmZmZmZmZmZikgaW4gZmxhc2gvcm9tLgorICoKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjODV4eC5oPgorI2luY2x1ZGUgPHRpbWVzdGFtcC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2RlZmluZSBfTElOVVhfQ09ORklHX0ggMQkvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZQkqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZm5kZWYJIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUJIENPTkZJR19JREVOVF9TVFJJTkcgIiIKKyNlbmRpZgorCisjdW5kZWYJTVNSX0tFUk5FTAorI2RlZmluZSBNU1JfS0VSTkVMICggTVNSX01FICkJLyogTWFjaGluZSBDaGVjayAqLworCisvKgorICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQorICoKKyAqIFVzZSByMTIgdG8gYWNjZXNzIHRoZSBHT1QKKyAqLworCVNUQVJUX0dPVAorCUdPVF9FTlRSWShfR09UMl9UQUJMRV8pCisJR09UX0VOVFJZKF9GSVhVUF9UQUJMRV8pCisKKyNpZm5kZWYgQ09ORklHX05BTkRfU1BMCisJR09UX0VOVFJZKF9zdGFydCkKKwlHT1RfRU5UUlkoX3N0YXJ0X29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKF9lbmRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkodHJhbnNmZXJfdG9faGFuZGxlcikKKyNlbmRpZgorCisJR09UX0VOVFJZKF9faW5pdF9lbmQpCisJR09UX0VOVFJZKF9lbmQpCisJR09UX0VOVFJZKF9fYnNzX3N0YXJ0KQorCUVORF9HT1QKKworLyoKKyAqIGU1MDAgU3RhcnR1cCAtLSBhZnRlciByZXNldCBvbmx5IHRoZSBsYXN0IDRLQiBvZiB0aGUgZWZmZWN0aXZlCisgKiBhZGRyZXNzIHNwYWNlIGlzIG1hcHBlZCBpbiB0aGUgTU1VIEwyIFRMQjEgRW50cnkwLiBUaGUgLmJvb3RwZworICogc2VjdGlvbiBpcyBsb2NhdGVkIGF0IFRISVMgTEFTVCBwYWdlIGFuZCBiYXNpY2FsbHkgZG9lcyB0aHJlZQorICogdGhpbmdzOiBjbGVhciBzb21lIHJlZ2lzdGVycywgc2V0IHVwIGV4Y2VwdGlvbiB0YWJsZXMgYW5kCisgKiBhZGQgbW9yZSBUTEIgZW50cmllcyBmb3IgJ2xhcmdlciBzcGFjZXMnKGUuZy4gdGhlIGJvb3Qgcm9tKSB0bworICogY29udGludWUgdGhlIGJvb3QgcHJvY2VkdXJlLgorCisgKiBPbmNlIHRoZSBib290IHJvbSBpcyBtYXBwZWQgYnkgVExCIGVudHJpZXMgd2UgY2FuIHByb2NlZWQKKyAqIHdpdGggbm9ybWFsIHN0YXJ0dXAuCisgKgorICovCisKKwkuc2VjdGlvbiAuYm9vdHBnLCJheCIKKwkuZ2xvYmwgX3N0YXJ0X2U1MDAKKworX3N0YXJ0X2U1MDA6CisKKy8qIGNsZWFyIHJlZ2lzdGVycy9hcnJheXMgbm90IHJlc2V0IGJ5IGhhcmR3YXJlICovCisKKwkvKiBMMSAqLworCWxpCXIwLDIKKwltdHNwcglMMUNTUjAscjAJLyogaW52YWxpZGF0ZSBkLWNhY2hlICovCisJbXRzcHIJTDFDU1IxLHIwCS8qIGludmFsaWRhdGUgaS1jYWNoZSAqLworCisJbWZzcHIJcjEsREJTUgorCW10c3ByCURCU1IscjEJCS8qIENsZWFyIGFsbCB2YWxpZCBiaXRzICovCisKKwkvKgorCSAqCUVuYWJsZSBMMSBDYWNoZXMgZWFybHkKKwkgKgorCSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfRTUwME1DKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfQ0FDSEVfU1RBU0hJTkcpCisJLyogc2V0IHN0YXNoIGlkIHRvIChjb3JlSUQpICogMiArIDMyICsgTDEgQ1QgKDApICovCisJbGkJcjIsKDMyICsgMCkKKwltdHNwcglMMUNTUjIscjIKKyNlbmRpZgorCisJLyogRW5hYmxlL2ludmFsaWRhdGUgdGhlIEktQ2FjaGUgKi8KKwlsaXMJcjIsKEwxQ1NSMV9JQ0ZJfEwxQ1NSMV9JQ0xGUilAaAorCW9yaQlyMixyMiwoTDFDU1IxX0lDRkl8TDFDU1IxX0lDTEZSKUBsCisJbXRzcHIJU1BSTl9MMUNTUjEscjIKKzE6CisJbWZzcHIJcjMsU1BSTl9MMUNTUjEKKwlhbmQuCXIxLHIzLHIyCisJYm5lCTFiCisKKwlsaXMJcjMsKEwxQ1NSMV9DUEV8TDFDU1IxX0lDRSlAaAorCW9yaQlyMyxyMywoTDFDU1IxX0NQRXxMMUNTUjFfSUNFKUBsCisJbXRzcHIJU1BSTl9MMUNTUjEscjMKKwlpc3luYworMjoKKwltZnNwcglyMyxTUFJOX0wxQ1NSMQorCWFuZGkuCXIxLHIzLEwxQ1NSMV9JQ0VAbAorCWJlcQkyYgorCisJLyogRW5hYmxlL2ludmFsaWRhdGUgdGhlIEQtQ2FjaGUgKi8KKwlsaXMJcjIsKEwxQ1NSMF9EQ0ZJfEwxQ1NSMF9EQ0xGUilAaAorCW9yaQlyMixyMiwoTDFDU1IwX0RDRkl8TDFDU1IwX0RDTEZSKUBsCisJbXRzcHIJU1BSTl9MMUNTUjAscjIKKzE6CisJbWZzcHIJcjMsU1BSTl9MMUNTUjAKKwlhbmQuCXIxLHIzLHIyCisJYm5lCTFiCisKKwlsaXMJcjMsKEwxQ1NSMF9DUEV8TDFDU1IwX0RDRSlAaAorCW9yaQlyMyxyMywoTDFDU1IwX0NQRXxMMUNTUjBfRENFKUBsCisJbXRzcHIJU1BSTl9MMUNTUjAscjMKKwlpc3luYworMjoKKwltZnNwcglyMyxTUFJOX0wxQ1NSMAorCWFuZGkuCXIxLHIzLEwxQ1NSMF9EQ0VAbAorCWJlcQkyYgorCisJLyogU2V0dXAgaW50ZXJydXB0IHZlY3RvcnMgKi8KKwlsaXMJcjEsVEVYVF9CQVNFQGgKKwltdHNwcglJVlBSLHIxCisKKwlsaQlyMSwweDAxMDAKKwltdHNwcglJVk9SMCxyMQkvKiAwOiBDcml0aWNhbCBpbnB1dCAqLworCWxpCXIxLDB4MDIwMAorCW10c3ByCUlWT1IxLHIxCS8qIDE6IE1hY2hpbmUgY2hlY2sgKi8KKwlsaQlyMSwweDAzMDAKKwltdHNwcglJVk9SMixyMQkvKiAyOiBEYXRhIHN0b3JhZ2UgKi8KKwlsaQlyMSwweDA0MDAKKwltdHNwcglJVk9SMyxyMQkvKiAzOiBJbnN0cnVjdGlvbiBzdG9yYWdlICovCisJbGkJcjEsMHgwNTAwCisJbXRzcHIJSVZPUjQscjEJLyogNDogRXh0ZXJuYWwgaW50ZXJydXB0ICovCisJbGkJcjEsMHgwNjAwCisJbXRzcHIJSVZPUjUscjEJLyogNTogQWxpZ25tZW50ICovCisJbGkJcjEsMHgwNzAwCisJbXRzcHIJSVZPUjYscjEJLyogNjogUHJvZ3JhbSBjaGVjayAqLworCWxpCXIxLDB4MDgwMAorCW10c3ByCUlWT1I3LHIxCS8qIDc6IGZsb2F0aW5nIHBvaW50IHVuYXZhaWxhYmxlICovCisJbGkJcjEsMHgwOTAwCisJbXRzcHIJSVZPUjgscjEJLyogODogU3lzdGVtIGNhbGwgKi8KKwkvKiA5OiBBdXhpbGlhcnkgcHJvY2Vzc29yIHVuYXZhaWxhYmxlKHVuc3VwcG9ydGVkKSAqLworCWxpCXIxLDB4MGEwMAorCW10c3ByCUlWT1IxMCxyMQkvKiAxMDogRGVjcmVtZW50ZXIgKi8KKwlsaQlyMSwweDBiMDAKKwltdHNwcglJVk9SMTEscjEJLyogMTE6IEludGVydmFsIHRpbWVyICovCisJbGkJcjEsMHgwYzAwCisJbXRzcHIJSVZPUjEyLHIxCS8qIDEyOiBXYXRjaGRvZyB0aW1lciAqLworCWxpCXIxLDB4MGQwMAorCW10c3ByCUlWT1IxMyxyMQkvKiAxMzogRGF0YSBUTEIgZXJyb3IgKi8KKwlsaQlyMSwweDBlMDAKKwltdHNwcglJVk9SMTQscjEJLyogMTQ6IEluc3RydWN0aW9uIFRMQiBlcnJvciAqLworCWxpCXIxLDB4MGYwMAorCW10c3ByCUlWT1IxNSxyMQkvKiAxNTogRGVidWcgKi8KKworCS8qIENsZWFyIGFuZCBzZXQgdXAgc29tZSByZWdpc3RlcnMuICovCisJbGkgICAgICByMCwweDAwMDAKKwlsaXMJcjEsMHhmZmZmCisJbXRzcHIJREVDLHIwCQkJLyogcHJldmVudCBkZWMgZXhjZXB0aW9ucyAqLworCW10dGJsCXIwCQkJLyogcHJldmVudCBmaXQgJiB3ZHQgZXhjZXB0aW9ucyAqLworCW10dGJ1CXIwCisJbXRzcHIJVFNSLHIxCQkJLyogY2xlYXIgYWxsIHRpbWVyIGV4Y2VwdGlvbiBzdGF0dXMgKi8KKwltdHNwcglUQ1IscjAJCQkvKiBkaXNhYmxlIGFsbCAqLworCW10c3ByCUVTUixyMAkJCS8qIGNsZWFyIGV4Y2VwdGlvbiBzeW5kcm9tZSByZWdpc3RlciAqLworCW10c3ByCU1DU1IscjAJCQkvKiBtYWNoaW5lIGNoZWNrIHN5bmRyb21lIHJlZ2lzdGVyICovCisJbXR4ZXIJcjAJCQkvKiBjbGVhciBpbnRlZ2VyIGV4Y2VwdGlvbiByZWdpc3RlciAqLworCisjaWZkZWYgQ09ORklHX1NZU19CT09LM0VfSFYKKwltdHNwcglNQVM4LHIwCQkJLyogbWFrZSBzdXJlIE1BUzggaXMgY2xlYXIgKi8KKyNlbmRpZgorCisJLyogRW5hYmxlIFRpbWUgQmFzZSBhbmQgU2VsZWN0IFRpbWUgQmFzZSBDbG9jayAqLworCWxpcwlyMCxISUQwX0VNQ1BAaAkJLyogRW5hYmxlIG1hY2hpbmUgY2hlY2sgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19FTkFCTEVfMzZCSVRfUEhZUykKKwlvcmkJcjAscjAsSElEMF9FTk1BUzdAbAkvKiBFbmFibGUgTUFTNyAqLworI2VuZGlmCisjaWZuZGVmIENPTkZJR19FNTAwTUMKKwlvcmkJcjAscjAsSElEMF9UQkVOQGwJLyogRW5hYmxlIFRpbWViYXNlICovCisjZW5kaWYKKwltdHNwcglISUQwLHIwCisKKyNpZm5kZWYgQ09ORklHX0U1MDBNQworCWxpCXIwLChISUQxX0FTVE1FfEhJRDFfQUJFKUBsCS8qIEFkZHIgc3RyZWFtaW5nICYgYnJvYWRjYXN0ICovCisJbWZzcHIJcjMsUFZSCisJYW5kaS4JcjMscjMsIDB4ZmYKKwljbXB3aQlyMywweDUwQGwJLyogaWYgd2UgYXJlIHJldiA1LjAgb3IgZ3JlYXRlciBzZXQgTUJERCAqLworCWJsdCAxZgorCS8qIFNldCBNQkREIGJpdCBhbHNvICovCisJb3JpIHIwLCByMCwgSElEMV9NQkREQGwKKzE6CisJbXRzcHIJSElEMSxyMAorI2VuZGlmCisKKwkvKiBFbmFibGUgQnJhbmNoIFByZWRpY3Rpb24gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19CVEIpCisJbGlzCXIwLEJVQ1NSX0VOQUJMRUBoCisJb3JpCXIwLHIwLEJVQ1NSX0VOQUJMRUBsCisJbXRzcHIJU1BSTl9CVUNTUixyMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfSU5JVF9EQkNSKQorCWxpcwlyMSwweGZmZmYKKwlvcmkJcjEscjEsMHhmZmZmCisJbXRzcHIJREJTUixyMQkJCS8qIENsZWFyIGFsbCBzdGF0dXMgYml0cyAqLworCWxpcwlyMCxDT05GSUdfU1lTX0lOSVRfREJDUkBoCS8qIERCQ1IwW0lETV0gbXVzdCBiZSBzZXQgKi8KKwlvcmkJcjAscjAsQ09ORklHX1NZU19JTklUX0RCQ1JAbAorCW10c3ByCURCQ1IwLHIwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NUEM4NTY5CisjZGVmaW5lIENPTkZJR19TWVNfTEJDX0FERFIgKENPTkZJR19TWVNfQ0NTUkJBUl9ERUZBVUxUICsgMHg1MDAwKQorI2RlZmluZSBDT05GSUdfU1lTX0xCQ1JfQUREUiAoQ09ORklHX1NZU19MQkNfQUREUiArIDB4ZDApCisKKwkvKiBNUEM4NTY5IFJldi4wIHNpbGNvbiBuZWVkcyB0byBzZXQgYml0IDEzIG9mIExCQ1IgdG8gYWxsb3cgZWxCQyB0bworCSAqIHVzZSBhZGRyZXNzIHNwYWNlIHdoaWNoIGlzIG1vcmUgdGhhbiAxMmJpdHMsIGFuZCBpdCBtdXN0IGJlIGRvbmUgaW4KKwkgKiB0aGUgNEsgYm9vdCBwYWdlLiBTbyB3ZSBzZXQgdGhpcyBiaXQgaGVyZS4KKwkgKi8KKworCS8qIGNyZWF0ZSBhIHRlbXAgbWFwcGluZyBUTEIwWzBdIGZvciBMQkNSICAqLworCWxpcyAgICAgcjYsRlNMX0JPT0tFX01BUzAoMCwgMCwgMClAaAorCW9yaSAgICAgcjYscjYsRlNMX0JPT0tFX01BUzAoMCwgMCwgMClAbAorCisJbGlzICAgICByNyxGU0xfQk9PS0VfTUFTMSgxLCAwLCAwLCAwLCBCT09LRV9QQUdFU1pfNEspQGgKKwlvcmkgICAgIHI3LHI3LEZTTF9CT09LRV9NQVMxKDEsIDAsIDAsIDAsIEJPT0tFX1BBR0VTWl80SylAbAorCisJbGlzICAgICByOCxGU0xfQk9PS0VfTUFTMihDT05GSUdfU1lTX0xCQ19BRERSLCBNQVMyX0l8TUFTMl9HKUBoCisJb3JpICAgICByOCxyOCxGU0xfQk9PS0VfTUFTMihDT05GSUdfU1lTX0xCQ19BRERSLCBNQVMyX0l8TUFTMl9HKUBsCisKKwlsaXMgICAgIHI5LEZTTF9CT09LRV9NQVMzKENPTkZJR19TWVNfTEJDX0FERFIsIDAsCisJCQkJCQkoTUFTM19TWHxNQVMzX1NXfE1BUzNfU1IpKUBoCisJb3JpICAgICByOSxyOSxGU0xfQk9PS0VfTUFTMyhDT05GSUdfU1lTX0xCQ19BRERSLCAwLAorCQkJCQkJKE1BUzNfU1h8TUFTM19TV3xNQVMzX1NSKSlAbAorCisJbXRzcHIgICBNQVMwLHI2CisJbXRzcHIgICBNQVMxLHI3CisJbXRzcHIgICBNQVMyLHI4CisJbXRzcHIgICBNQVMzLHI5CisJaXN5bmMKKwltc3luYworCXRsYndlCisKKwkvKiBTZXQgTEJDUiByZWdpc3RlciAqLworCWxpcyAgICAgcjQsQ09ORklHX1NZU19MQkNSX0FERFJAaAorCW9yaSAgICAgcjQscjQsQ09ORklHX1NZU19MQkNSX0FERFJAbAorCisJbGlzICAgICByNSxDT05GSUdfU1lTX0xCQ19MQkNSQGgKKwlvcmkgICAgIHI1LHI1LENPTkZJR19TWVNfTEJDX0xCQ1JAbAorCXN0dyAgICAgcjUsMChyNCkKKwlpc3luYworCisJLyogaW52YWxpZGF0ZSB0aGlzIHRlbXAgVExCICovCisJbGlzCXI0LENPTkZJR19TWVNfTEJDX0FERFJAaAorCW9yaQlyNCxyNCxDT05GSUdfU1lTX0xCQ19BRERSQGwKKwl0bGJpdmF4CTAscjQKKwlpc3luYworCisjZW5kaWYgLyogQ09ORklHX01QQzg1NjkgKi8KKworCWxpcyAgICAgcjYsRlNMX0JPT0tFX01BUzAoMSwgMTUsIDApQGgKKwlvcmkgICAgIHI2LHI2LEZTTF9CT09LRV9NQVMwKDEsIDE1LCAwKUBsCisKKyNpZm5kZWYgQ09ORklHX1NZU19SQU1CT09UCisJLyogY3JlYXRlIGEgdGVtcCBtYXBwaW5nIGluIEFTPTEgdG8gdGhlIDRNIGJvb3Qgd2luZG93ICovCisJbGlzICAgICByNyxGU0xfQk9PS0VfTUFTMSgxLCAxLCAwLCAxLCBCT09LRV9QQUdFU1pfNE0pQGgKKwlvcmkgICAgIHI3LHI3LEZTTF9CT09LRV9NQVMxKDEsIDEsIDAsIDEsIEJPT0tFX1BBR0VTWl80TSlAbAorCisJbGlzICAgICByOCxGU0xfQk9PS0VfTUFTMihURVhUX0JBU0UgJiAweGZmYzAwMDAwLCAoTUFTMl9JfE1BUzJfRykpQGgKKwlvcmkgICAgIHI4LHI4LEZTTF9CT09LRV9NQVMyKFRFWFRfQkFTRSAmIDB4ZmZjMDAwMDAsIChNQVMyX0l8TUFTMl9HKSlAbAorCisJLyogVGhlIDg1eHggaGFzIHRoZSBkZWZhdWx0IGJvb3Qgd2luZG93IDB4ZmY4MDAwMDAgLSAweGZmZmZmZmZmICovCisJbGlzICAgICByOSxGU0xfQk9PS0VfTUFTMygweGZmYzAwMDAwLCAwLCAoTUFTM19TWHxNQVMzX1NXfE1BUzNfU1IpKUBoCisJb3JpICAgICByOSxyOSxGU0xfQk9PS0VfTUFTMygweGZmYzAwMDAwLCAwLCAoTUFTM19TWHxNQVMzX1NXfE1BUzNfU1IpKUBsCisjZWxzZQorCS8qCisJICogY3JlYXRlIGEgdGVtcCBtYXBwaW5nIGluIEFTPTEgdG8gdGhlIDFNIFRFWFRfQkFTRSBzcGFjZSwgdGhlIG1haW4KKwkgKiBpbWFnZSBoYXMgYmVlbiByZWxvY2F0ZWQgdG8gVEVYVF9CQVNFIG9uIHRoZSBzZWNvbmQgc3RhZ2UuCisJICovCisJbGlzICAgICByNyxGU0xfQk9PS0VfTUFTMSgxLCAxLCAwLCAxLCBCT09LRV9QQUdFU1pfMU0pQGgKKwlvcmkgICAgIHI3LHI3LEZTTF9CT09LRV9NQVMxKDEsIDEsIDAsIDEsIEJPT0tFX1BBR0VTWl8xTSlAbAorCisJbGlzICAgICByOCxGU0xfQk9PS0VfTUFTMihURVhUX0JBU0UsIChNQVMyX0l8TUFTMl9HKSlAaAorCW9yaSAgICAgcjgscjgsRlNMX0JPT0tFX01BUzIoVEVYVF9CQVNFLCAoTUFTMl9JfE1BUzJfRykpQGwKKworCWxpcyAgICAgcjksRlNMX0JPT0tFX01BUzMoVEVYVF9CQVNFLCAwLCAoTUFTM19TWHxNQVMzX1NXfE1BUzNfU1IpKUBoCisJb3JpICAgICByOSxyOSxGU0xfQk9PS0VfTUFTMyhURVhUX0JBU0UsIDAsIChNQVMzX1NYfE1BUzNfU1d8TUFTM19TUikpQGwKKyNlbmRpZgorCisJbXRzcHIgICBNQVMwLHI2CisJbXRzcHIgICBNQVMxLHI3CisJbXRzcHIgICBNQVMyLHI4CisJbXRzcHIgICBNQVMzLHI5CisJaXN5bmMKKwltc3luYworCXRsYndlCisKKwkvKiBjcmVhdGUgYSB0ZW1wIG1hcHBpbmcgaW4gQVM9MSB0byB0aGUgc3RhY2sgKi8KKwlsaXMgICAgIHI2LEZTTF9CT09LRV9NQVMwKDEsIDE0LCAwKUBoCisJb3JpICAgICByNixyNixGU0xfQk9PS0VfTUFTMCgxLCAxNCwgMClAbAorCisJbGlzICAgICByNyxGU0xfQk9PS0VfTUFTMSgxLCAxLCAwLCAxLCBCT09LRV9QQUdFU1pfMTZLKUBoCisJb3JpICAgICByNyxyNyxGU0xfQk9PS0VfTUFTMSgxLCAxLCAwLCAxLCBCT09LRV9QQUdFU1pfMTZLKUBsCisKKwlsaXMgICAgIHI4LEZTTF9CT09LRV9NQVMyKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiwgMClAaAorCW9yaSAgICAgcjgscjgsRlNMX0JPT0tFX01BUzIoQ09ORklHX1NZU19JTklUX1JBTV9BRERSLCAwKUBsCisKKwlsaXMgICAgIHI5LEZTTF9CT09LRV9NQVMzKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiwgMCwgKE1BUzNfU1h8TUFTM19TV3xNQVMzX1NSKSlAaAorCW9yaSAgICAgcjkscjksRlNMX0JPT0tFX01BUzMoQ09ORklHX1NZU19JTklUX1JBTV9BRERSLCAwLCAoTUFTM19TWHxNQVMzX1NXfE1BUzNfU1IpKUBsCisKKwltdHNwciAgIE1BUzAscjYKKwltdHNwciAgIE1BUzEscjcKKwltdHNwciAgIE1BUzIscjgKKwltdHNwciAgIE1BUzMscjkKKwlpc3luYworCW1zeW5jCisJdGxid2UKKworCWxpcwlyNixNU1JfSVN8TVNSX0RTQGgKKwlvcmkJcjYscjYsTVNSX0lTfE1TUl9EU0BsCisJbGlzCXI3LHN3aXRjaF9hc0BoCisJb3JpCXI3LHI3LHN3aXRjaF9hc0BsCisKKwltdHNwcglTUFJOX1NSUjAscjcKKwltdHNwcglTUFJOX1NSUjEscjYKKwlyZmkKKworc3dpdGNoX2FzOgorLyogTDEgRENhY2hlIGlzIHVzZWQgZm9yIGluaXRpYWwgUkFNICovCisKKwkvKiBBbGxvY2F0ZSBJbml0aWFsIFJBTSBpbiBkYXRhIGNhY2hlLgorCSAqLworCWxpcwlyMyxDT05GSUdfU1lTX0lOSVRfUkFNX0FERFJAaAorCW9yaQlyMyxyMyxDT05GSUdfU1lTX0lOSVRfUkFNX0FERFJAbAorCW1mc3ByCXIyLCBMMUNGRzAKKwlhbmRpLglyMiwgcjIsIDB4MWZmCisJLyogY2FjaGUgc2l6ZSAqIDEwMjQgLyAoMiAqIEwxIGxpbmUgc2l6ZSkgKi8KKwlzbHdpCXIyLCByMiwgKDEwIC0gMSAtIEwxX0NBQ0hFX1NISUZUKQorCW10Y3RyCXIyCisJbGkJcjAsMAorMToKKwlkY2J6CXIwLHIzCisJZGNidGxzCTAscjAscjMKKwlhZGRpCXIzLHIzLENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUKKwliZG56CTFiCisKKwkvKiBKdW1wIG91dCB0aGUgbGFzdCA0SyBwYWdlIGFuZCBjb250aW51ZSB0byAnbm9ybWFsJyBzdGFydCAqLworI2lmZGVmIENPTkZJR19TWVNfUkFNQk9PVAorCWIJX3N0YXJ0X2NvbnQKKyNlbHNlCisJLyogQ2FsY3VsYXRlIGFic29sdXRlIGFkZHJlc3MgaW4gRkxBU0ggYW5kIGp1bXAgdGhlcmUJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGlzCXIzLENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGgKKwlvcmkJcjMscjMsQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWFkZGkJcjMscjMsX3N0YXJ0X2NvbnQgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJbXRscglyMworCWJscgorI2VuZGlmCisKKwkudGV4dAorCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKwkubG9uZwkweDI3MDUxOTU2CQkvKiBVLUJPT1QgTWFnaWMgTnVtYmVyICovCisJLmdsb2JsCXZlcnNpb25fc3RyaW5nCit2ZXJzaW9uX3N0cmluZzoKKwkuYXNjaWkgVV9CT09UX1ZFUlNJT04KKwkuYXNjaWkgIiAoIiwgVV9CT09UX0RBVEUsICIgLSAiLCBVX0JPT1RfVElNRSwgIikiCisJLmFzY2lpIENPTkZJR19JREVOVF9TVFJJTkcsICJcMCIKKworCS5hbGlnbgk0CisJLmdsb2JsCV9zdGFydF9jb250Citfc3RhcnRfY29udDoKKwkvKiBTZXR1cCB0aGUgc3RhY2sgaW4gaW5pdGlhbCBSQU0sY291bGQgYmUgTDItYXMtU1JBTSBvciBMMSBkY2FjaGUqLworCWxpcwlyMSxDT05GSUdfU1lTX0lOSVRfUkFNX0FERFJAaAorCW9yaQlyMSxyMSxDT05GSUdfU1lTX0lOSVRfU1BfT0ZGU0VUQGwKKworCWxpCXIwLDAKKwlzdHd1CXIwLC00KHIxKQorCXN0d3UJcjAsLTQocjEpCQkvKiBUZXJtaW5hdGUgY2FsbCBjaGFpbiAqLworCisJc3R3dQlyMSwtOChyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCWxpcwlyMCxSRVNFVF9WRUNUT1JAaAkvKiBBZGRyZXNzIG9mIHJlc2V0IHZlY3RvciAqLworCW9yaQlyMCxyMCxSRVNFVF9WRUNUT1JAbAorCXN0d3UJcjEsLTgocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KKwlzdHcJcjAsKzEyKHIxKQkJLyogU2F2ZSByZXR1cm4gYWRkciAodW5kZXJmbG93IHZlY3QpICovCisKKwlHRVRfR09UCisJYmwJY3B1X2luaXRfZWFybHlfZgorCisJLyogc3dpdGNoIGJhY2sgdG8gQVMgPSAwICovCisJbGlzCXIzLChNU1JfQ0V8TVNSX01FfE1TUl9ERSlAaAorCW9yaQlyMyxyMywoTVNSX0NFfE1TUl9NRXxNU1JfREUpQGwKKwltdG1zcglyMworCWlzeW5jCisKKwlibAljcHVfaW5pdF9mCisJYmwJYm9hcmRfaW5pdF9mCisJaXN5bmMKKworI2lmbmRlZiBDT05GSUdfTkFORF9TUEwKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKwkuZ2xvYmwJX3N0YXJ0X29mX3ZlY3RvcnMKK19zdGFydF9vZl92ZWN0b3JzOgorCisvKiBDcml0aWNhbCBpbnB1dC4gKi8KKwlDUklUX0VYQ0VQVElPTigweDAxMDAsIENyaXRpY2FsSW5wdXQsIENyaXRjYWxJbnB1dEV4Y2VwdGlvbikKKworLyogTWFjaGluZSBjaGVjayAqLworCU1DS19FWENFUFRJT04oMHgyMDAsIE1hY2hpbmVDaGVjaywgTWFjaGluZUNoZWNrRXhjZXB0aW9uKQorCisvKiBEYXRhIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHgwMzAwLCBEYXRhU3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogSW5zdHJ1Y3Rpb24gU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDA0MDAsIEluc3RTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHgwNTAwLCBFeHRJbnRlcnJ1cHQsIEV4dEludEV4Y2VwdGlvbikKKworLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KKwkuID0gMHgwNjAwCitBbGlnbm1lbnQ6CisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQorCW1mc3ByCXI0LERBUgorCXN0dwlyNCxfREFSKHIyMSkKKwltZnNwcglyNSxEU0lTUgorCXN0dwlyNSxfRFNJU1IocjIxKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlFWENfWEZFUl9URU1QTEFURShBbGlnbm1lbnQsIEFsaWdubWVudEV4Y2VwdGlvbiwgTVNSX0tFUk5FTCwgQ09QWV9FRSkKKworLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KKwkuID0gMHgwNzAwCitQcm9ncmFtQ2hlY2s6CisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlFWENfWEZFUl9URU1QTEFURShQcm9ncmFtQ2hlY2ssIFByb2dyYW1DaGVja0V4Y2VwdGlvbiwKKwkJTVNSX0tFUk5FTCwgQ09QWV9FRSkKKworCS8qIE5vIEZQVSBvbiBNUEM4NXh4LiAgVGhpcyBleGNlcHRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KKwkqLworCVNURF9FWENFUFRJT04oMHgwODAwLCBGUFVuYXZhaWxhYmxlLCBVbmtub3duRXhjZXB0aW9uKQorCisJLiA9IDB4MDkwMAorLyoKKyAqIHIwIC0gU1lTQ0FMTCBudW1iZXIKKyAqIHIzLS4uLiBhcmd1bWVudHMKKyAqLworU3lzdGVtQ2FsbDoKKwlhZGRpcwlyMTEscjAsMAkvKiBnZXQgZnVuY3Rpb25zIHRhYmxlIGFkZHIgKi8KKwlvcmkJcjExLHIxMSwwCS8qIE5vdGU6IHRoaXMgY29kZSBpcyBwYXRjaGVkIGluIHRyYXBfaW5pdCAqLworCWFkZGlzCXIxMixyMCwwCS8qIGdldCBudW1iZXIgb2YgZnVuY3Rpb25zICovCisJb3JpCXIxMixyMTIsMAorCisJY21wbHcJMCxyMCxyMTIKKwliZ2UJMWYKKworCXJsd2lubQlyMCxyMCwyLDAsMzEJLyogZm5fYWRkciA9IGZuX3RibFtyMF0gKi8KKwlhZGQJcjExLHIxMSxyMAorCWx3eglyMTEsMChyMTEpCisKKwlsaQlyMjAsMHhkMDAtNAkvKiBHZXQgc3RhY2sgcG9pbnRlciAqLworCWx3eglyMTIsMChyMjApCisJc3ViaQlyMTIscjEyLDEyCS8qIEFkanVzdCBzdGFjayBwb2ludGVyICovCisJbGkJcjAsMHhjMDArX2VuZF9iYWNrLVN5c3RlbUNhbGwKKwljbXBsdwkwLHIwLHIxMgkvKiBDaGVjayBzdGFjayBvdmVyZmxvdyAqLworCWJndAkxZgorCXN0dwlyMTIsMChyMjApCisKKwltZmxyCXIwCisJc3R3CXIwLDAocjEyKQorCW1mc3ByCXIwLFNSUjAKKwlzdHcJcjAsNChyMTIpCisJbWZzcHIJcjAsU1JSMQorCXN0dwlyMCw4KHIxMikKKworCWxpCXIxMiwweGMwMCtfYmFjay1TeXN0ZW1DYWxsCisJbXRscglyMTIKKwltdHNwcglTUlIwLHIxMQorCisxOglTWU5DCisJcmZpCitfYmFjazoKKworCW1mbXNyCXIxMQkJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXIxMiwwCisJb3JpCXIxMixyMTIsTVNSX0VFCisJYW5kYwlyMTEscjExLHIxMgorCVNZTkMJCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjExCisJU1lOQworCisJbGkJcjEyLDB4ZDAwLTQJCS8qIHJlc3RvcmUgcmVncyAqLworCWx3eglyMTIsMChyMTIpCisKKwlsd3oJcjExLDAocjEyKQorCW10bHIJcjExCisJbHd6CXIxMSw0KHIxMikKKwltdHNwcglTUlIwLHIxMQorCWx3eglyMTEsOChyMTIpCisJbXRzcHIJU1JSMSxyMTEKKworCWFkZGkJcjEyLHIxMiwxMgkJLyogQWRqdXN0IHN0YWNrIHBvaW50ZXIgKi8KKwlsaQlyMjAsMHhkMDAtNAorCXN0dwlyMTIsMChyMjApCisKKwlTWU5DCisJcmZpCitfZW5kX2JhY2s6CisKKwlTVERfRVhDRVBUSU9OKDB4MGEwMCwgRGVjcmVtZW50ZXIsIHRpbWVyX2ludGVycnVwdCkKKwlTVERfRVhDRVBUSU9OKDB4MGIwMCwgSW50ZXJ2YWxUaW1lciwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MGMwMCwgV2F0Y2hkb2dUaW1lciwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHgwZDAwLCBEYXRhVExCRXJyb3IsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDBlMDAsIEluc3RydWN0aW9uVExCRXJyb3IsIFVua25vd25FeGNlcHRpb24pCisKKwlDUklUX0VYQ0VQVElPTigweDBmMDAsIERlYnVnQnJlYWtwb2ludCwgRGVidWdFeGNlcHRpb24gKQorCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisKKwkuID0gLiArICgweDEwMCAtICggLiAmIDB4ZmYgKSkJLyogYWxpZ24gZm9yIGRlYnVnICovCisKKy8qCisgKiBUaGlzIGNvZGUgZmluaXNoZXMgc2F2aW5nIHRoZSByZWdpc3RlcnMgdG8gdGhlIGV4Y2VwdGlvbiBmcmFtZQorICogYW5kIGp1bXBzIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyIGZvciB0aGUgZXhjZXB0aW9uLgorICogUmVnaXN0ZXIgcjIxIGlzIHBvaW50ZXIgaW50byB0cmFwIGZyYW1lLCByMSBoYXMgbmV3IHN0YWNrIHBvaW50ZXIuCisgKi8KKwkuZ2xvYmwJdHJhbnNmZXJfdG9faGFuZGxlcgordHJhbnNmZXJfdG9faGFuZGxlcjoKKwlzdHcJcjIyLF9OSVAocjIxKQorCWxpcwlyMjIsTVNSX1BPV0BoCisJYW5kYwlyMjMscjIzLHIyMgorCXN0dwlyMjMsX01TUihyMjEpCisJU0FWRV9HUFIoNywgcjIxKQorCVNBVkVfNEdQUlMoOCwgcjIxKQorCVNBVkVfOEdQUlMoMTIsIHIyMSkKKwlTQVZFXzhHUFJTKDI0LCByMjEpCisKKwltZmxyCXIyMworCWFuZGkuCXIyNCxyMjMsMHgzZjAwCQkvKiBnZXQgdmVjdG9yIG9mZnNldCAqLworCXN0dwlyMjQsVFJBUChyMjEpCisJbGkJcjIyLDAKKwlzdHcJcjIyLFJFU1VMVChyMjEpCisJbXRzcHIJU1BSRzIscjIyCQkvKiByMSBpcyBub3cga2VybmVsIHNwICovCisKKwlsd3oJcjI0LDAocjIzKQkJLyogdmlydHVhbCBhZGRyZXNzIG9mIGhhbmRsZXIgKi8KKwlsd3oJcjIzLDQocjIzKQkJLyogd2hlcmUgdG8gZ28gd2hlbiBkb25lICovCisJbXRzcHIJU1JSMCxyMjQKKwltdHNwcglTUlIxLHIyMAorCW10bHIJcjIzCisJU1lOQworCXJmaQkJCQkvKiBqdW1wIHRvIGhhbmRsZXIsIGVuYWJsZSBNTVUgKi8KKworaW50X3JldHVybjoKKwltZm1zcglyMjgJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXI0LDAKKwlvcmkJcjQscjQsTVNSX0VFCisJYW5kYwlyMjgscjI4LHI0CisJU1lOQwkJCS8qIFNvbWUgY2hpcCByZXZzIG5lZWQgdGhpcy4uLiAqLworCW10bXNyCXIyOAorCVNZTkMKKwlsd3oJcjIsX0NUUihyMSkKKwlsd3oJcjAsX0xJTksocjEpCisJbXRjdHIJcjIKKwltdGxyCXIwCisJbHd6CXIyLF9YRVIocjEpCisJbHd6CXIwLF9DQ1IocjEpCisJbXRzcHIJWEVSLHIyCisJbXRjcmYJMHhGRixyMAorCVJFU1RfMTBHUFJTKDMsIHIxKQorCVJFU1RfMTBHUFJTKDEzLCByMSkKKwlSRVNUXzhHUFJTKDIzLCByMSkKKwlSRVNUX0dQUigzMSwgcjEpCisJbHd6CXIyLF9OSVAocjEpCS8qIFJlc3RvcmUgZW52aXJvbm1lbnQgKi8KKwlsd3oJcjAsX01TUihyMSkKKwltdHNwcglTUlIwLHIyCisJbXRzcHIJU1JSMSxyMAorCWx3eglyMCxHUFIwKHIxKQorCWx3eglyMixHUFIyKHIxKQorCWx3eglyMSxHUFIxKHIxKQorCVNZTkMKKwlyZmkKKworY3JpdF9yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1BSTl9DU1JSMCxyMgorCW10c3ByCVNQUk5fQ1NSUjEscjAKKwlsd3oJcjAsR1BSMChyMSkKKwlsd3oJcjIsR1BSMihyMSkKKwlsd3oJcjEsR1BSMShyMSkKKwlTWU5DCisJcmZjaQorCittY2tfcmV0dXJuOgorCW1mbXNyCXIyOAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbGkJcjQsMAorCW9yaQlyNCxyNCxNU1JfRUUKKwlhbmRjCXIyOCxyMjgscjQKKwlTWU5DCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjI4CisJU1lOQworCWx3eglyMixfQ1RSKHIxKQorCWx3eglyMCxfTElOSyhyMSkKKwltdGN0cglyMgorCW10bHIJcjAKKwlsd3oJcjIsX1hFUihyMSkKKwlsd3oJcjAsX0NDUihyMSkKKwltdHNwcglYRVIscjIKKwltdGNyZgkweEZGLHIwCisJUkVTVF8xMEdQUlMoMywgcjEpCisJUkVTVF8xMEdQUlMoMTMsIHIxKQorCVJFU1RfOEdQUlMoMjMsIHIxKQorCVJFU1RfR1BSKDMxLCByMSkKKwlsd3oJcjIsX05JUChyMSkJLyogUmVzdG9yZSBlbnZpcm9ubWVudCAqLworCWx3eglyMCxfTVNSKHIxKQorCW10c3ByCVNQUk5fTUNTUlIwLHIyCisJbXRzcHIJU1BSTl9NQ1NSUjEscjAKKwlsd3oJcjAsR1BSMChyMSkKKwlsd3oJcjIsR1BSMihyMSkKKwlsd3oJcjEsR1BSMShyMSkKKwlTWU5DCisJcmZtY2kKKworLyogQ2FjaGUgZnVuY3Rpb25zLgorKi8KKy5nbG9ibCBpbnZhbGlkYXRlX2ljYWNoZQoraW52YWxpZGF0ZV9pY2FjaGU6CisJbWZzcHIJcjAsTDFDU1IxCisJb3JpCXIwLHIwLEwxQ1NSMV9JQ0ZJCisJbXN5bmMKKwlpc3luYworCW10c3ByCUwxQ1NSMSxyMAorCWlzeW5jCisJYmxyCQkJCS8qIGVudGlyZSBJIGNhY2hlICovCisKKy5nbG9ibCBpbnZhbGlkYXRlX2RjYWNoZQoraW52YWxpZGF0ZV9kY2FjaGU6CisJbWZzcHIJcjAsTDFDU1IwCisJb3JpCXIwLHIwLEwxQ1NSMF9EQ0ZJCisJbXN5bmMKKwlpc3luYworCW10c3ByCUwxQ1NSMCxyMAorCWlzeW5jCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX2VuYWJsZQoraWNhY2hlX2VuYWJsZToKKwltZmxyCXI4CisJYmwJaW52YWxpZGF0ZV9pY2FjaGUKKwltdGxyCXI4CisJaXN5bmMKKwltZnNwcglyNCxMMUNTUjEKKwlvcmkJcjQscjQsMHgwMDAxCisJb3JpcwlyNCxyNCwweDAwMDEKKwltdHNwcglMMUNTUjEscjQKKwlpc3luYworCWJscgorCisJLmdsb2JsCWljYWNoZV9kaXNhYmxlCitpY2FjaGVfZGlzYWJsZToKKwltZnNwcglyMCxMMUNTUjEKKwlsaXMJcjMsMAorCW9yaQlyMyxyMyxMMUNTUjFfSUNFCisJYW5kYwlyMCxyMCxyMworCW10c3ByCUwxQ1NSMSxyMAorCWlzeW5jCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX3N0YXR1cworaWNhY2hlX3N0YXR1czoKKwltZnNwcglyMyxMMUNTUjEKKwlhbmRpLglyMyxyMyxMMUNTUjFfSUNFCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX2VuYWJsZQorZGNhY2hlX2VuYWJsZToKKwltZmxyCXI4CisJYmwJaW52YWxpZGF0ZV9kY2FjaGUKKwltdGxyCXI4CisJaXN5bmMKKwltZnNwcglyMCxMMUNTUjAKKwlvcmkJcjAscjAsMHgwMDAxCisJb3JpcwlyMCxyMCwweDAwMDEKKwltc3luYworCWlzeW5jCisJbXRzcHIJTDFDU1IwLHIwCisJaXN5bmMKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZGlzYWJsZQorZGNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjMsTDFDU1IwCisJbGlzCXI0LDAKKwlvcmkJcjQscjQsTDFDU1IwX0RDRQorCWFuZGMJcjMscjMscjQKKwltdHNwcglMMUNTUjAscjAKKwlpc3luYworCWJscgorCisJLmdsb2JsCWRjYWNoZV9zdGF0dXMKK2RjYWNoZV9zdGF0dXM6CisJbWZzcHIJcjMsTDFDU1IwCisJYW5kaS4JcjMscjMsTDFDU1IwX0RDRQorCWJscgorCisJLmdsb2JsIGdldF9waXIKK2dldF9waXI6CisJbWZzcHIJcjMsUElSCisJYmxyCisKKwkuZ2xvYmwgZ2V0X3B2cgorZ2V0X3B2cjoKKwltZnNwcglyMyxQVlIKKwlibHIKKworCS5nbG9ibCBnZXRfc3ZyCitnZXRfc3ZyOgorCW1mc3ByCXIzLFNWUgorCWJscgorCisJLmdsb2JsIHdyX3Rjcgord3JfdGNyOgorCW10c3ByCVRDUixyMworCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgaW44ICovCisvKiBEZXNjcmlwdGlvbjoJIElucHV0IDggYml0cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCWluOAoraW44OgorCWxieglyMywweDAwMDAocjMpCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBvdXQ4ICovCisvKiBEZXNjcmlwdGlvbjoJIE91dHB1dCA4IGJpdHMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlvdXQ4CitvdXQ4OgorCXN0YglyNCwweDAwMDAocjMpCisJc3luYworCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgb3V0MTYgKi8KKy8qIERlc2NyaXB0aW9uOgkgT3V0cHV0IDE2IGJpdHMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlvdXQxNgorb3V0MTY6CisJc3RoCXI0LDB4MDAwMChyMykKKwlzeW5jCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBvdXQxNnIgKi8KKy8qIERlc2NyaXB0aW9uOgkgQnl0ZSByZXZlcnNlIGFuZCBvdXRwdXQgMTYgYml0cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCW91dDE2cgorb3V0MTZyOgorCXN0aGJyeAlyNCxyMCxyMworCXN5bmMKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBGdW5jdGlvbjoJIG91dDMyICovCisvKiBEZXNjcmlwdGlvbjoJIE91dHB1dCAzMiBiaXRzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJb3V0MzIKK291dDMyOgorCXN0dwlyNCwweDAwMDAocjMpCisJc3luYworCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgb3V0MzJyICovCisvKiBEZXNjcmlwdGlvbjoJIEJ5dGUgcmV2ZXJzZSBhbmQgb3V0cHV0IDMyIGJpdHMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlvdXQzMnIKK291dDMycjoKKwlzdHdicngJcjQscjAscjMKKwlzeW5jCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBpbjE2ICovCisvKiBEZXNjcmlwdGlvbjoJIElucHV0IDE2IGJpdHMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlpbjE2CitpbjE2OgorCWxoeglyMywweDAwMDAocjMpCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBpbjE2ciAqLworLyogRGVzY3JpcHRpb246CSBJbnB1dCAxNiBiaXRzIGFuZCBieXRlIHJldmVyc2UgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlpbjE2cgoraW4xNnI6CisJbGhicngJcjMscjAscjMKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBGdW5jdGlvbjoJIGluMzIgKi8KKy8qIERlc2NyaXB0aW9uOgkgSW5wdXQgMzIgYml0cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCWluMzIKK2luMzI6CisJbHd6CTMsMHgwMDAwKDMpCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBpbjMyciAqLworLyogRGVzY3JpcHRpb246CSBJbnB1dCAzMiBiaXRzIGFuZCBieXRlIHJldmVyc2UgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlpbjMycgoraW4zMnI6CisJbHdicngJcjMscjAscjMKKwlibHIKKyNlbmRpZiAgLyogIUNPTkZJR19OQU5EX1NQTCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiB2b2lkIHdyaXRlX3RsYihtYXMwLCBtYXMxLCBtYXMyLCBtYXMzLCBtYXM3KQorICovCisJLmdsb2JsCXdyaXRlX3RsYgord3JpdGVfdGxiOgorCW10c3ByCU1BUzAscjMKKwltdHNwcglNQVMxLHI0CisJbXRzcHIJTUFTMixyNQorCW10c3ByCU1BUzMscjYKKyNpZmRlZiBDT05GSUdfRU5BQkxFXzM2QklUX1BIWVMKKwltdHNwcglNQVM3LHI3CisjZW5kaWYKKwlsaQlyMywwCisjaWZkZWYgQ09ORklHX1NZU19CT09LM0VfSFYKKwltdHNwcglNQVM4LHIzCisjZW5kaWYKKwlpc3luYworCXRsYndlCisJbXN5bmMKKwlpc3luYworCWJscgorCisvKgorICogdm9pZCByZWxvY2F0ZV9jb2RlIChhZGRyX3NwLCBnZCwgYWRkcl9tb25pKQorICoKKyAqIFRoaXMgImZ1bmN0aW9uIiBkb2VzIG5vdCByZXR1cm4sIGluc3RlYWQgaXQgY29udGludWVzIGluIFJBTQorICogYWZ0ZXIgcmVsb2NhdGluZyB0aGUgbW9uaXRvciBjb2RlLgorICoKKyAqIHIzID0gZGVzdAorICogcjQgPSBzcmMKKyAqIHI1ID0gbGVuZ3RoIGluIGJ5dGVzCisgKiByNiA9IGNhY2hlbGluZXNpemUKKyAqLworCS5nbG9ibAlyZWxvY2F0ZV9jb2RlCityZWxvY2F0ZV9jb2RlOgorCW1yCXIxLHIzCQkvKiBTZXQgbmV3IHN0YWNrIHBvaW50ZXIJCSovCisJbXIJcjkscjQJCS8qIFNhdmUgY29weSBvZiBJbml0IERhdGEgcG9pbnRlcgkqLworCW1yCXIxMCxyNQkJLyogU2F2ZSBjb3B5IG9mIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKworCUdFVF9HT1QKKwltcglyMyxyNQkJCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisJbGlzCXI0LENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGgJCS8qIFNvdXJjZSAgICAgIEFkZHJlc3MJKi8KKwlvcmkJcjQscjQsQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWx3eglyNSxHT1QoX19pbml0X2VuZCkKKwlzdWIJcjUscjUscjQKKwlsaQlyNixDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCQkvKiBDYWNoZSBMaW5lIFNpemUJKi8KKworCS8qCisJICogRml4IEdPVCBwb2ludGVyOgorCSAqCisJICogTmV3IEdPVC1QVFIgPSAob2xkIEdPVC1QVFIgLSBDT05GSUdfU1lTX01PTklUT1JfQkFTRSkgKyBEZXN0aW5hdGlvbiBBZGRyZXNzCisJICoKKwkgKiBPZmZzZXQ6CisJICovCisJc3ViCXIxNSxyMTAscjQKKworCS8qIEZpcnN0IG91ciBvd24gR09UICovCisJYWRkCXIxMixyMTIscjE1CisJLyogdGhlIHRoZSBvbmUgdXNlZCBieSB0aGUgQyBjb2RlICovCisJYWRkCXIzMCxyMzAscjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisKKwljbXBsdwljcjEscjMscjQKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJYmVxCWNyMSw0ZgkJLyogSW4gcGxhY2UgY29weSBpcyBub3QgbmVjZXNzYXJ5CSovCisJYmVxCTdmCQkvKiBQcm90ZWN0IGFnYWluc3QgMCBjb3VudAkJKi8KKwltdGN0cglyMAorCWJnZQljcjEsMmYKKworCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisJYgk0ZgorCisyOglzbHdpCXIwLHIwLDIKKwlhZGQJcjgscjQscjAKKwlhZGQJcjcscjMscjAKKzM6CWx3enUJcjAsLTQocjgpCisJc3R3dQlyMCwtNChyNykKKwliZG56CTNiCisKKy8qCisgKiBOb3cgZmx1c2ggdGhlIGNhY2hlOiBub3RlIHRoYXQgd2UgbXVzdCBzdGFydCBmcm9tIGEgY2FjaGUgYWxpZ25lZAorICogYWRkcmVzcy4gT3RoZXJ3aXNlIHdlIG1pZ2h0IG1pc3Mgb25lIGNhY2hlIGxpbmUuCisgKi8KKzQ6CWNtcHdpCXI2LDAKKwlhZGQJcjUscjMscjUKKwliZXEJN2YJCS8qIEFsd2F5cyBmbHVzaCBwcmVmZXRjaCBxdWV1ZSBpbiBhbnkgY2FzZSAqLworCXN1YmkJcjAscjYsMQorCWFuZGMJcjMscjMscjAKKwltcglyNCxyMworNToJZGNic3QJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTViCisJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBkY2JzdCB0byBjb21wbGV0ZSBvbiBidXMgKi8KKwltcglyNCxyMworNjoJaWNiaQkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNmIKKzc6CXN5bmMJCQkvKiBXYWl0IGZvciBhbGwgaWNiaSB0byBjb21wbGV0ZSBvbiBidXMgKi8KKwlpc3luYworCisJLyoKKwkgKiBSZS1wb2ludCB0aGUgSVZQUiBhdCBSQU0KKwkgKi8KKwltdHNwcglJVlBSLHIxMAorCisvKgorICogV2UgYXJlIGRvbmUuIERvIG5vdCByZXR1cm4sIGluc3RlYWQgYnJhbmNoIHRvIHNlY29uZCBwYXJ0IG9mIGJvYXJkCisgKiBpbml0aWFsaXphdGlvbiwgbm93IHJ1bm5pbmcgZnJvbSBSQU0uCisgKi8KKworCWFkZGkJcjAscjEwLGluX3JhbSAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwltdGxyCXIwCisJYmxyCQkJCS8qIE5FVkVSIFJFVFVSTlMhICovCisJLmdsb2JsCWluX3JhbQoraW5fcmFtOgorCisJLyoKKwkgKiBSZWxvY2F0aW9uIEZ1bmN0aW9uLCByMTIgcG9pbnQgdG8gZ290MisweDgwMDAKKwkgKgorCSAqIEFkanVzdCBnb3QyIHBvaW50ZXJzLCBubyBuZWVkIHRvIGNoZWNrIGZvciAwLCB0aGlzIGNvZGUKKwkgKiBhbHJlYWR5IHB1dHMgYSBmZXcgZW50cmllcyBpbiB0aGUgdGFibGUuCisJICovCisJbGkJcjAsX19nb3QyX2VudHJpZXNAc2VjdG9mZkBsCisJbGEJcjMsR09UKF9HT1QyX1RBQkxFXykKKwlsd3oJcjExLEdPVChfR09UMl9UQUJMRV8pCisJbXRjdHIJcjAKKwlzdWIJcjExLHIzLHIxMQorCWFkZGkJcjMscjMsLTQKKzE6CWx3enUJcjAsNChyMykKKwljbXB3aQlyMCwwCisJYmVxLQkyZgorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjAsMChyMykKKzI6CWJkbnoJMWIKKworCS8qCisJICogTm93IGFkanVzdCB0aGUgZml4dXBzIGFuZCB0aGUgcG9pbnRlcnMgdG8gdGhlIGZpeHVwcworCSAqIGluIGNhc2Ugd2UgbmVlZCB0byBtb3ZlIG91cnNlbHZlcyBhZ2Fpbi4KKwkgKi8KKwlsaQlyMCxfX2ZpeHVwX2VudHJpZXNAc2VjdG9mZkBsCisJbHd6CXIzLEdPVChfRklYVVBfVEFCTEVfKQorCWNtcHdpCXIwLDAKKwltdGN0cglyMAorCWFkZGkJcjMscjMsLTQKKwliZXEJNGYKKzM6CWx3enUJcjQsNChyMykKKwlsd3p1eAlyMCxyNCxyMTEKKwlhZGQJcjAscjAscjExCisJc3R3CXIxMCwwKHIzKQorCXN0dwlyMCwwKHI0KQorCWJkbnoJM2IKKzQ6CitjbGVhcl9ic3M6CisJLyoKKwkgKiBOb3cgY2xlYXIgQlNTIHNlZ21lbnQKKwkgKi8KKwlsd3oJcjMsR09UKF9fYnNzX3N0YXJ0KQorCWx3eglyNCxHT1QoX2VuZCkKKworCWNtcGx3CTAscjMscjQKKwliZXEJNmYKKworCWxpCXIwLDAKKzU6CisJc3R3CXIwLDAocjMpCisJYWRkaQlyMyxyMyw0CisJY21wbHcJMCxyMyxyNAorCWJuZQk1YgorNjoKKworCW1yCXIzLHI5CQkvKiBJbml0IERhdGEgcG9pbnRlcgkJKi8KKwltcglyNCxyMTAJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJCSovCisJYmwJYm9hcmRfaW5pdF9yCisKKyNpZm5kZWYgQ09ORklHX05BTkRfU1BMCisJLyoKKwkgKiBDb3B5IGV4Y2VwdGlvbiB2ZWN0b3IgY29kZSB0byBsb3cgbWVtb3J5CisJICoKKwkgKiByMzogZGVzdF9hZGRyCisJICogcjc6IHNvdXJjZSBhZGRyZXNzLCByODogZW5kIGFkZHJlc3MsIHI5OiB0YXJnZXQgYWRkcmVzcworCSAqLworCS5nbG9ibAl0cmFwX2luaXQKK3RyYXBfaW5pdDoKKwltZmxyCXI0CQkJLyogc2F2ZSBsaW5rIHJlZ2lzdGVyCQkqLworCUdFVF9HT1QKKwlsd3oJcjcsR09UKF9zdGFydF9vZl92ZWN0b3JzKQorCWx3eglyOCxHT1QoX2VuZF9vZl92ZWN0b3JzKQorCisJbGkJcjksMHgxMDAJCS8qIHJlc2V0IHZlY3RvciBhbHdheXMgYXQgMHgxMDAgKi8KKworCWNtcGx3CTAscjcscjgKKwliZ2VscgkJCQkvKiByZXR1cm4gaWYgcjc+PXI4IC0ganVzdCBpbiBjYXNlICovCisxOgorCWx3eglyMCwwKHI3KQorCXN0dwlyMCwwKHI5KQorCWFkZGkJcjcscjcsNAorCWFkZGkJcjkscjksNAorCWNtcGx3CTAscjcscjgKKwlibmUJMWIKKworCS8qCisJICogcmVsb2NhdGUgYGhkbHInIGFuZCBgaW50X3JldHVybicgZW50cmllcworCSAqLworCWxpCXI3LC5MX0NyaXRpY2FsSW5wdXQgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJYmwJdHJhcF9yZWxvYworCWxpCXI3LC5MX01hY2hpbmVDaGVjayAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlibAl0cmFwX3JlbG9jCisJbGkJcjcsLkxfRGF0YVN0b3JhZ2UgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJYmwJdHJhcF9yZWxvYworCWxpCXI3LC5MX0luc3RTdG9yYWdlIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKwlsaQlyNywuTF9FeHRJbnRlcnJ1cHQgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJYmwJdHJhcF9yZWxvYworCWxpCXI3LC5MX0FsaWdubWVudCAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlibAl0cmFwX3JlbG9jCisJbGkJcjcsLkxfUHJvZ3JhbUNoZWNrIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKwlsaQlyNywuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKwlsaQlyNywuTF9EZWNyZW1lbnRlciAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlibAl0cmFwX3JlbG9jCisJbGkJcjcsLkxfSW50ZXJ2YWxUaW1lciAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlsaQlyOCxfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisyOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LHI3LDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLHI3LHI4CisJYmx0CTJiCisKKwlsaXMJcjcsMHgwCisJbXRzcHIJSVZQUixyNworCisJbXRscglyNAkJCS8qIHJlc3RvcmUgbGluayByZWdpc3RlcgkqLworCWJscgorCisuZ2xvYmwgdW5sb2NrX3JhbV9pbl9jYWNoZQordW5sb2NrX3JhbV9pbl9jYWNoZToKKwkvKiBpbnZhbGlkYXRlIHRoZSBJTklUX1JBTSBzZWN0aW9uICovCisJbGlzCXIzLChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgJiB+KENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUtMSkpQGgKKwlvcmkJcjMscjMsKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiAmIH4oQ09ORklHX1NZU19DQUNIRUxJTkVfU0laRS0xKSlAbAorCW1mc3ByCXI0LEwxQ0ZHMAorCWFuZGkuCXI0LHI0LDB4MWZmCisJc2x3aQlyNCxyNCwoMTAgLSAxIC0gTDFfQ0FDSEVfU0hJRlQpCisJbXRjdHIJcjQKKzE6CWRjYmkJcjAscjMKKwlhZGRpCXIzLHIzLENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUKKwliZG56CTFiCisJc3luYworCisJLyogSW52YWxpZGF0ZSB0aGUgVExCIGVudHJpZXMgZm9yIHRoZSBjYWNoZSAqLworCWxpcwlyMyxDT05GSUdfU1lTX0lOSVRfUkFNX0FERFJAaAorCW9yaQlyMyxyMyxDT05GSUdfU1lTX0lOSVRfUkFNX0FERFJAbAorCXRsYml2YXgJMCxyMworCWFkZGkJcjMscjMsMHgxMDAwCisJdGxiaXZheAkwLHIzCisJYWRkaQlyMyxyMywweDEwMDAKKwl0bGJpdmF4CTAscjMKKwlhZGRpCXIzLHIzLDB4MTAwMAorCXRsYml2YXgJMCxyMworCWlzeW5jCisJYmxyCisKKy5nbG9ibCBmbHVzaF9kY2FjaGUKK2ZsdXNoX2RjYWNoZToKKwltZnNwcglyMyxTUFJOX0wxQ0ZHMAorCisJcmx3aW5tCXI1LHIzLDksMwkvKiBFeHRyYWN0IGNhY2hlIGJsb2NrIHNpemUgKi8KKwl0d2xndGkJcjUsMQkJLyogT25seSAzMiBhbmQgNjQgYnl0ZSBjYWNoZSBibG9ja3MKKwkJCQkgKiBhcmUgY3VycmVudGx5IGRlZmluZWQuCisJCQkJICovCisJbGkJcjQsMzIKKwlzdWJmaWMJcjYscjUsMgkJLyogcjYgPSBsb2cyKDFLaUIgLyBjYWNoZSBibG9jayBzaXplKSAtCisJCQkJICogICAgICBsb2cyKG51bWJlciBvZiB3YXlzKQorCQkJCSAqLworCXNsdwlyNSxyNCxyNQkvKiByNSA9IGNhY2hlIGJsb2NrIHNpemUgKi8KKworCXJsd2lubQlyNyxyMywwLDB4ZmYJLyogRXh0cmFjdCBudW1iZXIgb2YgS2lCIGluIHRoZSBjYWNoZSAqLworCW11bGxpCXI3LHI3LDEzCS8qIEFuIDgtd2F5IGNhY2hlIHdpbGwgcmVxdWlyZSAxMworCQkJCSAqIGxvYWRzIHBlciBzZXQuCisJCQkJICovCisJc2x3CXI3LHI3LHI2CisKKwkvKiBzYXZlIG9mZiBISUQwIGFuZCBzZXQgRENGQSAqLworCW1mc3ByCXI4LFNQUk5fSElEMAorCW9yaQlyOSxyOCxISUQwX0RDRkFAbAorCW10c3ByCVNQUk5fSElEMCxyOQorCWlzeW5jCisKKwlsaXMJcjQsMAorCW10Y3RyCXI3CisKKzE6CWx3eglyMywwKHI0KQkvKiBMb2FkLi4uICovCisJYWRkCXI0LHI0LHI1CisJYmRuegkxYgorCisJbXN5bmMKKwlsaXMJcjQsMAorCW10Y3RyCXI3CisKKzE6CWRjYmYJMCxyNAkJLyogLi4uYW5kIGZsdXNoLiAqLworCWFkZAlyNCxyNCxyNQorCWJkbnoJMWIKKworCS8qIHJlc3RvcmUgSElEMCAqLworCW10c3ByCVNQUk5fSElEMCxyOAorCWlzeW5jCisKKwlibHIKKworLmdsb2JsIHNldHVwX2l2b3JzCitzZXR1cF9pdm9yczoKKworI2luY2x1ZGUgImZpeGVkX2l2b3IuUyIKKwlibHIKKyNlbmRpZiAvKiAhQ09ORklHX05BTkRfU1BMICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvdGxiLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvdGxiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwMzdhYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC90bGIuYwpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaWZkZWYgQ09ORklHX0FERFJfTUFQCisjaW5jbHVkZSA8YWRkcl9tYXAuaD4KKyNlbmRpZgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwordm9pZCBpbnZhbGlkYXRlX3RsYih1OCB0bGIpCit7CisJaWYgKHRsYiA9PSAwKQorCQltdHNwcihNTVVDU1IwLCAweDQpOworCWlmICh0bGIgPT0gMSkKKwkJbXRzcHIoTU1VQ1NSMCwgMHgyKTsKK30KKwordm9pZCBpbml0X3RsYnModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdGxiX2VudHJpZXM7IGkrKykgeworCQl3cml0ZV90bGIodGxiX3RhYmxlW2ldLm1hczAsCisJCQkgIHRsYl90YWJsZVtpXS5tYXMxLAorCQkJICB0bGJfdGFibGVbaV0ubWFzMiwKKwkJCSAgdGxiX3RhYmxlW2ldLm1hczMsCisJCQkgIHRsYl90YWJsZVtpXS5tYXM3KTsKKwl9CisKKwlyZXR1cm4gOworfQorCisjaWZuZGVmIENPTkZJR19OQU5EX1NQTAorc3RhdGljIGlubGluZSB2b2lkIHVzZV90bGJfY2FtKHU4IGlkeCkKK3sKKwlpbnQgaSA9IGlkeCAvIDMyOworCWludCBiaXQgPSBpZHggJSAzMjsKKworCWdkLT51c2VkX3RsYl9jYW1zW2ldIHw9ICgxIDw8IGJpdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3RsYl9jYW0odTggaWR4KQoreworCWludCBpID0gaWR4IC8gMzI7CisJaW50IGJpdCA9IGlkeCAlIDMyOworCisJZ2QtPnVzZWRfdGxiX2NhbXNbaV0gJj0gfigxIDw8IGJpdCk7Cit9CisKK3ZvaWQgaW5pdF91c2VkX3RsYl9jYW1zKHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IG51bV9jYW0gPSBtZnNwcihTUFJOX1RMQjFDRkcpICYgMHhmZmY7CisKKwlmb3IgKGkgPSAwOyBpIDwgKChDT05GSUdfU1lTX05VTV9UTEJDQU1TKzMxKS8zMik7IGkrKykKKwkJZ2QtPnVzZWRfdGxiX2NhbXNbaV0gPSAwOworCisJLyogd2FsayBhbGwgdGhlIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbTsgaSsrKSB7CisJCXUzMiBfbWFzMTsKKworCQltdHNwcihNQVMwLCBGU0xfQk9PS0VfTUFTMCgxLCBpLCAwKSk7CisKKwkJYXNtIHZvbGF0aWxlKCJ0bGJyZTtpc3luYyIpOworCQlfbWFzMSA9IG1mc3ByKE1BUzEpOworCisJCS8qIGlmIHRoZSBlbnRyeSBpc24ndCB2YWxpZCBza2lwIGl0ICovCisJCWlmICgoX21hczEgJiBNQVMxX1ZBTElEKSkKKwkJCXVzZV90bGJfY2FtKGkpOworCX0KK30KKworaW50IGZpbmRfZnJlZV90bGJjYW0odm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgaWR4OworCisJZm9yIChpID0gMDsgaSA8ICgoQ09ORklHX1NZU19OVU1fVExCQ0FNUyszMSkvMzIpOyBpKyspIHsKKwkJaWR4ID0gZmZ6KGdkLT51c2VkX3RsYl9jYW1zW2ldKTsKKworCQlpZiAoaWR4ICE9IDMyKQorCQkJYnJlYWs7CisJfQorCisJaWR4ICs9IGkgKiAzMjsKKworCWlmIChpZHggPj0gQ09ORklHX1NZU19OVU1fVExCQ0FNUykKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGlkeDsKK30KKwordm9pZCBzZXRfdGxiKHU4IHRsYiwgdTMyIGVwbiwgdTY0IHJwbiwKKwkgICAgIHU4IHBlcm1zLCB1OCB3aW1nZSwKKwkgICAgIHU4IHRzLCB1OCBlc2VsLCB1OCB0c2l6ZSwgdTggaXByb3QpCit7CisJdTMyIF9tYXMwLCBfbWFzMSwgX21hczIsIF9tYXMzLCBfbWFzNzsKKworCWlmICh0bGIgPT0gMSkKKwkJdXNlX3RsYl9jYW0oZXNlbCk7CisKKwlfbWFzMCA9IEZTTF9CT09LRV9NQVMwKHRsYiwgZXNlbCwgMCk7CisJX21hczEgPSBGU0xfQk9PS0VfTUFTMSgxLCBpcHJvdCwgMCwgdHMsIHRzaXplKTsKKwlfbWFzMiA9IEZTTF9CT09LRV9NQVMyKGVwbiwgd2ltZ2UpOworCV9tYXMzID0gRlNMX0JPT0tFX01BUzMocnBuLCAwLCBwZXJtcyk7CisJX21hczcgPSBGU0xfQk9PS0VfTUFTNyhycG4pOworCisJd3JpdGVfdGxiKF9tYXMwLCBfbWFzMSwgX21hczIsIF9tYXMzLCBfbWFzNyk7CisKKyNpZmRlZiBDT05GSUdfQUREUl9NQVAKKwlpZiAoKHRsYiA9PSAxKSAmJiAoZ2QtPmZsYWdzICYgR0RfRkxHX1JFTE9DKSkKKwkJYWRkcm1hcF9zZXRfZW50cnkoZXBuLCBycG4sICgxVUwgPDwgKCh0c2l6ZSAqIDIpICsgMTApKSwgZXNlbCk7CisjZW5kaWYKK30KKwordm9pZCBkaXNhYmxlX3RsYih1OCBlc2VsKQoreworCXUzMiBfbWFzMCwgX21hczEsIF9tYXMyLCBfbWFzMywgX21hczc7CisKKwlmcmVlX3RsYl9jYW0oZXNlbCk7CisKKwlfbWFzMCA9IEZTTF9CT09LRV9NQVMwKDEsIGVzZWwsIDApOworCV9tYXMxID0gMDsKKwlfbWFzMiA9IDA7CisJX21hczMgPSAwOworCV9tYXM3ID0gMDsKKworCW10c3ByKE1BUzAsIF9tYXMwKTsKKwltdHNwcihNQVMxLCBfbWFzMSk7CisJbXRzcHIoTUFTMiwgX21hczIpOworCW10c3ByKE1BUzMsIF9tYXMzKTsKKyNpZmRlZiBDT05GSUdfRU5BQkxFXzM2QklUX1BIWVMKKwltdHNwcihNQVM3LCBfbWFzNyk7CisjZW5kaWYKKwlhc20gdm9sYXRpbGUoImlzeW5jO21zeW5jO3RsYndlO2lzeW5jIik7CisKKyNpZmRlZiBDT05GSUdfQUREUl9NQVAKKwlpZiAoZ2QtPmZsYWdzICYgR0RfRkxHX1JFTE9DKQorCQlhZGRybWFwX3NldF9lbnRyeSgwLCAwLCAwLCBlc2VsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0bGJzeCAoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgKmFkZHIpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0bGJzeCAwLCUwIiA6IDogInIiIChhZGRyKSwgIm0iICgqYWRkcikpOworfQorCisvKiByZXR1cm4gLTEgaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcgKi8KK2ludCBmaW5kX3RsYl9pZHgodm9pZCAqYWRkciwgdTggdGxic2VsKQoreworCXUzMiBfbWFzMCwgX21hczE7CisKKwkvKiB6ZXJvIG91dCBTZWFyY2ggUElELCBBUyAqLworCW10c3ByKE1BUzYsIDApOworCisJdGxic3goYWRkcik7CisKKwlfbWFzMCA9IG1mc3ByKE1BUzApOworCV9tYXMxID0gbWZzcHIoTUFTMSk7CisKKwkvKiB3ZSBmb3VuZCBzb21ldGhpbmcsIGFuZCBpdHMgaW4gdGhlIFRMQiB3ZSBleHBlY3QgKi8KKwlpZiAoKE1BUzFfVkFMSUQgJiBfbWFzMSkgJiYKKwkJKE1BUzBfVExCU0VMKHRsYnNlbCkgPT0gKF9tYXMwICYgTUFTMF9UTEJTRUxfTVNLKSkpIHsKKwkJcmV0dXJuICgoX21hczAgJiBNQVMwX0VTRUxfTVNLKSA+PiAxNik7CisJfQorCisJcmV0dXJuIC0xOworfQorCisjaWZkZWYgQ09ORklHX0FERFJfTUFQCit2b2lkIGluaXRfYWRkcl9tYXAodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbnVtX2NhbSA9IG1mc3ByKFNQUk5fVExCMUNGRykgJiAweGZmZjsKKworCS8qIHdhbGsgYWxsIHRoZSBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IG51bV9jYW07IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGVwbjsKKwkJdTMyIHRzaXplLCBfbWFzMTsKKwkJcGh5c19hZGRyX3QgcnBuOworCisJCW10c3ByKE1BUzAsIEZTTF9CT09LRV9NQVMwKDEsIGksIDApKTsKKworCQlhc20gdm9sYXRpbGUoInRsYnJlO2lzeW5jIik7CisJCV9tYXMxID0gbWZzcHIoTUFTMSk7CisKKwkJLyogaWYgdGhlIGVudHJ5IGlzbid0IHZhbGlkIHNraXAgaXQgKi8KKwkJaWYgKCEoX21hczEgJiBNQVMxX1ZBTElEKSkKKwkJCWNvbnRpbnVlOworCisJCXRzaXplID0gKF9tYXMxID4+IDgpICYgMHhmOworCQllcG4gPSBtZnNwcihNQVMyKSAmIE1BUzJfRVBOOworCQlycG4gPSBtZnNwcihNQVMzKSAmIE1BUzNfUlBOOworI2lmZGVmIENPTkZJR19FTkFCTEVfMzZCSVRfUEhZUworCQlycG4gfD0gKChwaHlzX2FkZHJfdCltZnNwcihNQVM3KSkgPDwgMzI7CisjZW5kaWYKKworCQlhZGRybWFwX3NldF9lbnRyeShlcG4sIHJwbiwgKDFVTCA8PCAoKHRzaXplICogMikgKyAxMCkpLCBpKTsKKwl9CisKKwlyZXR1cm4gOworfQorI2VuZGlmCisKK3Vuc2lnbmVkIGludCBzZXR1cF9kZHJfdGxicyh1bnNpZ25lZCBpbnQgbWVtc2l6ZV9pbl9tZWcpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHRsYl9zaXplOworCXVuc2lnbmVkIGludCByYW1fdGxiX2FkZHJlc3MgPSAodW5zaWduZWQgaW50KUNPTkZJR19TWVNfRERSX1NEUkFNX0JBU0U7CisJdW5zaWduZWQgaW50IG1heF9jYW0gPSAobWZzcHIoU1BSTl9UTEIxQ0ZHKSA+PiAxNikgJiAweGY7CisJdTY0IHNpemUsIG1lbXNpemUgPSAodTY0KW1lbXNpemVfaW5fbWVnIDw8IDIwOworCisJc2l6ZSA9IG1pbihtZW1zaXplLCBDT05GSUdfTUFYX01FTV9NQVBQRUQpOworCisJLyogQ29udmVydCAoNF5tYXgpIGtCIHRvICgyXm1heCkgYnl0ZXMgKi8KKwltYXhfY2FtID0gbWF4X2NhbSAqIDIgKyAxMDsKKworCWZvciAoaSA9IDA7IHNpemUgJiYgaSA8IDg7IGkrKykgeworCQlpbnQgcmFtX3RsYl9pbmRleCA9IGZpbmRfZnJlZV90bGJjYW0oKTsKKwkJdTMyIGNhbXNpemUgPSBfX2lsb2cyX3U2NChzaXplKSAmIH4xVTsKKwkJdTMyIGFsaWduID0gX19pbG9nMihyYW1fdGxiX2FkZHJlc3MpICYgfjFVOworCisJCWlmIChyYW1fdGxiX2luZGV4ID09IC0xKQorCQkJYnJlYWs7CisKKwkJaWYgKGFsaWduID09IC0yKSBhbGlnbiA9IG1heF9jYW07CisJCWlmIChjYW1zaXplID4gYWxpZ24pCisJCQljYW1zaXplID0gYWxpZ247CisKKwkJaWYgKGNhbXNpemUgPiBtYXhfY2FtKQorCQkJY2Ftc2l6ZSA9IG1heF9jYW07CisKKwkJdGxiX3NpemUgPSAoY2Ftc2l6ZSAtIDEwKSAvIDI7CisKKwkJc2V0X3RsYigxLCByYW1fdGxiX2FkZHJlc3MsIHJhbV90bGJfYWRkcmVzcywKKwkJCU1BUzNfU1h8TUFTM19TV3xNQVMzX1NSLCAwLAorCQkJMCwgcmFtX3RsYl9pbmRleCwgdGxiX3NpemUsIDEpOworCisJCXNpemUgLT0gMVVMTCA8PCBjYW1zaXplOworCQltZW1zaXplIC09IDFVTEwgPDwgY2Ftc2l6ZTsKKwkJcmFtX3RsYl9hZGRyZXNzICs9IDFVTCA8PCBjYW1zaXplOworCX0KKworCWlmIChtZW1zaXplKQorCQlwcmludF9zaXplKG1lbXNpemUsICIgbGVmdCB1bm1hcHBlZFxuIik7CisKKwkvKgorCSAqIENvbmZpcm0gdGhhdCB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBtZW1vcnkgd2FzIG1hcHBlZC4KKwkgKi8KKwlyZXR1cm4gbWVtc2l6ZV9pbl9tZWc7Cit9CisjZW5kaWYgLyogIUNPTkZJR19OQU5EX1NQTCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTk2NjY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L3RyYXBzLmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBsaW51eC9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBNb3Rvcm9sYQorICogTW9kaWZpZWQgYnkgWGlhbmdodWEgWGlhbyh4LnhpYW9AbW90b3JvbGEuY29tKQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2ICBHYXJ5IFRob21hcyAoZ2R0QGxpbnV4cHBjLm9yZykKKyAqCisgKiBNb2RpZmllZCBieSBDb3J0IERvdWdhbiAoY29ydEBjcy5ubXQuZWR1KQorICogYW5kIFBhdWwgTWFja2VycmFzIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIGhhcmR3YXJlIGV4Y2VwdGlvbnMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGtnZGIuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisvKiBSZXR1cm5zIDAgaWYgZXhjZXB0aW9uIG5vdCBmb3VuZCBhbmQgZml4dXAgb3RoZXJ3aXNlLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHNlYXJjaF9leGNlcHRpb25fdGFibGUodW5zaWduZWQgbG9uZyk7CisKKy8qCisgKiBFbmQgb2YgYWRkcmVzc2FibGUgbWVtb3J5LiAgVGhpcyBtYXkgYmUgbGVzcyB0aGFuIHRoZSBhY3R1YWwKKyAqIGFtb3VudCBvZiBtZW1vcnkgb24gdGhlIHN5c3RlbSBpZiB3ZSdyZSB1bmFibGUgdG8ga2VlcCBhbGwKKyAqIHRoZSBtZW1vcnkgbWFwcGVkIGluLgorICovCitleHRlcm4gdWxvbmcgZ2V0X2VmZmVjdGl2ZV9tZW1zaXplKHZvaWQpOworI2RlZmluZSBFTkRfT0ZfTUVNIChnZC0+YmQtPmJpX21lbXN0YXJ0ICsgZ2V0X2VmZmVjdGl2ZV9tZW1zaXplKCkpCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X3Rzcih1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm10c3ByIDB4MTUwLCAlMCIgOiA6ICJyIiAodmFsKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgZ2V0X2Vzcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWFzbSB2b2xhdGlsZSgibWZzcHIgJTAsIDB4MDNlIiA6ICI9ciIgKHZhbCkgOik7CisJcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBFU1JfTUNJIDB4ODAwMDAwMDAKKyNkZWZpbmUgRVNSX1BJTCAweDA4MDAwMDAwCisjZGVmaW5lIEVTUl9QUFIgMHgwNDAwMDAwMAorI2RlZmluZSBFU1JfUFRSIDB4MDIwMDAwMDAKKyNkZWZpbmUgRVNSX0RTVCAweDAwODAwMDAwCisjZGVmaW5lIEVTUl9ESVogMHgwMDQwMDAwMAorI2RlZmluZSBFU1JfVTBGIDB4MDAwMDgwMDAKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCitleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZgorCisvKgorICogVHJhcCAmIEV4Y2VwdGlvbiBzdXBwb3J0CisgKi8KKwordm9pZAorcHJpbnRfYmFja3RyYWNlKHVuc2lnbmVkIGxvbmcgKnNwKQoreworCWludCBjbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgaTsKKworCXByaW50ZigiQ2FsbCBiYWNrdHJhY2U6ICIpOworCXdoaWxlIChzcCkgeworCQlpZiAoKHVpbnQpc3AgPiBFTkRfT0ZfTUVNKQorCQkJYnJlYWs7CisKKwkJaSA9IHNwWzFdOworCQlpZiAoY250KysgJSA3ID09IDApCisJCQlwcmludGYoIlxuIik7CisJCXByaW50ZigiJTA4bFggIiwgaSk7CisJCWlmIChjbnQgPiAzMikgYnJlYWs7CisJCXNwID0gKHVuc2lnbmVkIGxvbmcgKikqc3A7CisJfQorCXByaW50ZigiXG4iKTsKK30KKwordm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpOworCisJcHJpbnRmKCJOSVA6ICUwOGxYIFhFUjogJTA4bFggTFI6ICUwOGxYIFJFR1M6ICVwIFRSQVA6ICUwNGx4IERBUjogJTA4bFhcbiIsCisJICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+eGVyLCByZWdzLT5saW5rLCByZWdzLCByZWdzLT50cmFwLCByZWdzLT5kYXIpOworCXByaW50ZigiTVNSOiAlMDhseCBFRTogJTAxeCBQUjogJTAxeCBGUDogJTAxeCBNRTogJTAxeCBJUi9EUjogJTAxeCUwMXhcbiIsCisJICAgICAgIHJlZ3MtPm1zciwgcmVncy0+bXNyJk1TUl9FRSA/IDEgOiAwLCByZWdzLT5tc3ImTVNSX1BSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciAmIE1TUl9GUCA/IDEgOiAwLHJlZ3MtPm1zciZNU1JfTUUgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyJk1TUl9JUiA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3ImTVNSX0RSID8gMSA6IDApOworCisJcHJpbnRmKCJcbiIpOworCWZvciAoaSA9IDA7ICBpIDwgMzI7ICBpKyspIHsKKwkJaWYgKChpICUgOCkgPT0gMCkKKwkJeworCQkJcHJpbnRmKCJHUFIlMDJkOiAiLCBpKTsKKwkJfQorCisJCXByaW50ZigiJTA4bFggIiwgcmVncy0+Z3ByW2ldKTsKKwkJaWYgKChpICUgOCkgPT0gNykKKwkJeworCQkJcHJpbnRmKCJcbiIpOworCQl9CisJfQorfQorCisKK3ZvaWQKK19leGNlcHRpb24oaW50IHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiRXhjZXB0aW9uIGluIGtlcm5lbCBwYyAlbHggc2lnbmFsICVkIixyZWdzLT5uaXAsc2lnbnIpOworfQorCit2b2lkCitDcml0Y2FsSW5wdXRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcGFuaWMoIkNyaXRpY2FsIElucHV0IEV4Y2VwdGlvbiIpOworfQorCitpbnQgbWFjaGluZWNoZWNrX2NvdW50ID0gMDsKK2ludCBtYWNoaW5lY2hlY2tfZXJyb3IgPSAwOwordm9pZAorTWFjaGluZUNoZWNrRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZml4dXA7CisJdW5zaWduZWQgaW50IG1jc3IsIG1jc3JyMCwgbWNzcnIxLCBtY2FyOworCisJLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgorCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCisJICogdGhlIFBDSSBleGNlcHRpb24gaGFuZGxlci4KKwkgKi8KKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZShyZWdzLT5uaXApKSAhPSAwKSB7CisJCXJlZ3MtPm5pcCA9IGZpeHVwOworCQlyZXR1cm47CisJfQorCisJbWNzcnIwID0gbWZzcHIoU1BSTl9NQ1NSUjApOworCW1jc3JyMSA9IG1mc3ByKFNQUk5fTUNTUlIxKTsKKwltY3NyID0gbWZzcHIoU1BSTl9NQ1NSKTsKKwltY2FyID0gbWZzcHIoU1BSTl9NQ0FSKTsKKworCW1hY2hpbmVjaGVja19jb3VudCsrOworCW1hY2hpbmVjaGVja19lcnJvcj0xOworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ZigiTWFjaGluZSBjaGVjayBpbiBrZXJuZWwgbW9kZS5cbiIpOworCXByaW50ZigiQ2F1c2VkIGJ5IChmcm9tIG1jc3IpOiAiKTsKKwlwcmludGYoIm1jc3IgPSAweCUwOHhcbiIsIG1jc3IpOworCWlmIChtY3NyICYgMHg4MDAwMDAwMCkKKwkJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIGlucHV0IHBpblxuIik7CisJaWYgKG1jc3IgJiAweDQwMDAwMDAwKQorCQlwcmludGYoIkluc3RydWN0aW9uIGNhY2hlIHBhcml0eSBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDIwMDAwMDAwKQorCQlwcmludGYoIkRhdGEgY2FjaGUgcHVzaCBwYXJpdHkgZXJyb3JcbiIpOworCWlmIChtY3NyICYgMHgxMDAwMDAwMCkKKwkJcHJpbnRmKCJEYXRhIGNhY2hlIHBhcml0eSBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDAwMDAwMDgwKQorCQlwcmludGYoIkJ1cyBpbnN0cnVjdGlvbiBhZGRyZXNzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwNDApCisJCXByaW50ZigiQnVzIFJlYWQgYWRkcmVzcyBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDAwMDAwMDIwKQorCQlwcmludGYoIkJ1cyBXcml0ZSBhZGRyZXNzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwMTApCisJCXByaW50ZigiQnVzIEluc3RydWN0aW9uIGRhdGEgYnVzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwMDgpCisJCXByaW50ZigiQnVzIFJlYWQgZGF0YSBidXMgZXJyb3JcbiIpOworCWlmIChtY3NyICYgMHgwMDAwMDAwNCkKKwkJcHJpbnRmKCJCdXMgV3JpdGUgYnVzIGVycm9yXG4iKTsKKwlpZiAobWNzciAmIDB4MDAwMDAwMDIpCisJCXByaW50ZigiQnVzIEluc3RydWN0aW9uIHBhcml0eSBlcnJvclxuIik7CisJaWYgKG1jc3IgJiAweDAwMDAwMDAxKQorCQlwcmludGYoIkJ1cyBSZWFkIHBhcml0eSBlcnJvclxuIik7CisKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRmKCJNQ1NSPTB4JTA4eCBcdE1DU1JSMD0weCUwOHggXG5NQ1NSUjE9MHglMDh4IFx0TUNBUj0weCUwOHhcbiIsCisJICAgICAgIG1jc3IsIG1jc3JyMCwgbWNzcnIxLCBtY2FyKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCWlmIChtYWNoaW5lY2hlY2tfY291bnQgPiAxMCkgeworCQlwYW5pYygibWFjaGluZSBjaGVjayBjb3VudCB0b28gaGlnaFxuIik7CisJfQorCisJaWYgKG1hY2hpbmVjaGVja19jb3VudCA+IDEpIHsKKwkJcmVncy0+bmlwICs9IDQ7IC8qIHNraXAgb2ZmZW5kaW5nIGluc3RydWN0aW9uICovCisJCXByaW50ZigiU2tpcHBpbmcgY3VycmVudCBpbnN0ciwgUmV0dXJuaW5nIHRvIDB4JTA4bHhcbiIsCisJCSAgICAgICByZWdzLT5uaXApOworCX0gZWxzZSB7CisJCXByaW50ZigiUmV0dXJuaW5nIGJhY2sgdG8gMHglMDhseFxuIixyZWdzLT5uaXApOworCX0KK30KKwordm9pZAorQWxpZ25tZW50RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiQWxpZ25tZW50IEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitQcm9ncmFtQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJbG9uZyBlc3JfdmFsOworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXNob3dfcmVncyhyZWdzKTsKKworCWVzcl92YWwgPSBnZXRfZXNyKCk7CisJaWYoIGVzcl92YWwgJiBFU1JfUElMICkKKwkJcHJpbnRmKCAiKiogSWxsZWdhbCBJbnN0cnVjdGlvbiAqKlxuIiApOworCWVsc2UgaWYoIGVzcl92YWwgJiBFU1JfUFBSICkKKwkJcHJpbnRmKCAiKiogUHJpdmlsZWdlZCBJbnN0cnVjdGlvbiAqKlxuIiApOworCWVsc2UgaWYoIGVzcl92YWwgJiBFU1JfUFRSICkKKwkJcHJpbnRmKCAiKiogVHJhcCBJbnN0cnVjdGlvbiAqKlxuIiApOworCisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiUHJvZ3JhbSBDaGVjayBFeGNlcHRpb24iKTsKK30KKwordm9pZAorUElURXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qCisJICogUmVzZXQgUElUIGludGVycnVwdAorCSAqLworCXNldF90c3IoMHgwYzAwMDAwMCk7CisKKwkvKgorCSAqIENhbGwgdGltZXJfaW50ZXJydXB0IHJvdXRpbmUgaW4gaW50ZXJydXB0cy5jCisJICovCisJdGltZXJfaW50ZXJydXB0KE5VTEwpOworfQorCisKK3ZvaWQKK1Vua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ZigiQmFkIHRyYXAgYXQgUEM6ICVseCwgU1I6ICVseCwgdmVjdG9yPSVseFxuIiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOworCV9leGNlcHRpb24oMCwgcmVncyk7Cit9CisKK3ZvaWQKK0V4dEludEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2xhdGlsZSBjY3NyX3BpY190ICpwaWMgPSAodm9pZCAqKShDT05GSUdfU1lTX01QQzg1eHhfUElDX0FERFIpOworCisJdWludCB2ZWN0OworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ZigiRXh0ZXJuYWwgSW50ZXJydXB0IEV4Y2VwdGlvbiBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4IiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT5tc3IsIHJlZ3MtPnRyYXApOworCXZlY3QgPSBwaWMtPmlhY2swOworCXByaW50ZigiIGlycSBJQUNLMEAlMDV4PSVkXG4iLChpbnQpJnBpYy0+aWFjazAsdmVjdCk7CisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7Cit9CisKK3ZvaWQKK0RlYnVnRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXByaW50ZigiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwICk7CisJc2hvd19yZWdzKHJlZ3MpOworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCisJZG9fYmVkYnVnX2JyZWFrcG9pbnQoIHJlZ3MgKTsKKyNlbmRpZgorfQorCisvKiBQcm9iZSBhbiBhZGRyZXNzIGJ5IHJlYWRpbmcuCSBJZiBub3QgcHJlc2VudCwgcmV0dXJuIC0xLCBvdGhlcndpc2UKKyAqIHJldHVybiAwLgorICovCitpbnQKK2FkZHJfcHJvYmUodWludCAqYWRkcikKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC91LWJvb3QtbmFuZC5sZHMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvdS1ib290LW5hbmQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDNlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvdS1ib290LW5hbmQubGRzCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfQVJDSChwb3dlcnBjKQorLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitQSERSUworeworICB0ZXh0IFBUX0xPQUQ7CisgIGJzcyBQVF9MT0FEOworfQorCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KQl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgIH0gOnRleHQKKyAgICBfZXRleHQgPSAuOworICAgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgICAgLnJvZGF0YSAgICA6CisgICB7CisgICAgKiguZWhfZnJhbWUpCisgICAgKihTT1JUX0JZX0FMSUdOTUVOVChTT1JUX0JZX05BTUUoLnJvZGF0YSopKSkKKyAgfSA6dGV4dAorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDAwRkYpICYgMHhGRkZGRkYwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgLmJvb3RwZyBBRERSKC50ZXh0KSAtIDB4MTAwMCA6CisgIHsKKyAgICBhcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvc3RhcnQubwkoLmJvb3RwZykKKyAgfSA6dGV4dCA9IDB4ZmZmZgorCisgIC4gPSBBRERSKC50ZXh0KSArIDB4ODAwMDA7CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzIChOT0xPQUQpICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9IDpic3MKKworICAuID0gQUxJR04oNCk7CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvdS1ib290LW5hbmRfc3BsLmxkcyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC91LWJvb3QtbmFuZF9zcGwubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOWNlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvdS1ib290LW5hbmRfc3BsLmxkcwpAQCAtMCwwICsxLDY3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlCisgKgorICogQ29weXJpZ2h0IDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUNUSU9OUworeworCS4gPSAweGZmZjAwMDAwOworCS50ZXh0IDogeworCQkqKC50ZXh0KQorCX0KKwlfZXRleHQgPSAuOworCisJLnJlbG9jIDogeworCQlfR09UMl9UQUJMRV8gPSAuOworCQkqKC5nb3QyKQorCQlfRklYVVBfVEFCTEVfID0gLjsKKwkJKiguZml4dXApCisJfQorCV9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisJX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisJLiA9IEFMSUdOKDgpOworCS5kYXRhIDogeworCQkqKC5yb2RhdGEqKQorCQkqKC5kYXRhKikKKwkJKiguc2RhdGEqKQorCX0KKwlfZWRhdGEgID0gIC47CisKKwkuID0gQUxJR04oOCk7CisJX19pbml0X2JlZ2luID0gLjsKKwlfX2luaXRfZW5kID0gLjsKKworCS5yZXNldHZlYyBBRERSKC50ZXh0KSArIDB4ZmZjIDogeworCQkqKC5yZXNldHZlYykKKwl9ID0gMHhmZmZmCisKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsKKwkJKiguc2JzcykKKwkJKiguYnNzKQorCX0KKwlfZW5kID0gLjsKK30KK0FTU0VSVChfX2luaXRfZW5kIDw9IDB4ZmZmMDBmZmMsICJOQU5EIGJvb3RzdHJhcCB0b28gYmlnIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvdS1ib290LmxkcyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGIxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg1eHgvdS1ib290LmxkcwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA3LTIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIFJFU0VUX1ZFQ1RPUl9BRERSRVNTCisjZGVmaW5lIFJFU0VUX1ZFQ1RPUl9BRERSRVNTCTB4ZmZmZmZmZmMKKyNlbmRpZgorCitPVVRQVVRfQVJDSChwb3dlcnBjKQorLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitQSERSUworeworICB0ZXh0IFBUX0xPQUQ7CisgIGJzcyBQVF9MT0FEOworfQorCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KQl9CisgIC5yZWwuZGF0YSAgICAgIDogeyAqKC5yZWwuZGF0YSkJCX0KKyAgLnJlbGEuZGF0YSAgICAgOiB7ICooLnJlbGEuZGF0YSkJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpCX0KKyAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9CisgIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KKyAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQorICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQorICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9CisgIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9CisgIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQorICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9CisgIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQorICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9CisgIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9CisgIC5wbHQgOiB7ICooLnBsdCkgfQorICAudGV4dCAgICAgIDoKKyAgeworICAgICooLnRleHQpCisgICAgKiguZ290MSkKKyAgIH0gOnRleHQKKyAgICBfZXRleHQgPSAuOworICAgIFBST1ZJREUgKGV0ZXh0ID0gLik7CisgICAgLnJvZGF0YSAgICA6CisgICB7CisgICAgKiguZWhfZnJhbWUpCisgICAgKihTT1JUX0JZX0FMSUdOTUVOVChTT1JUX0JZX05BTUUoLnJvZGF0YSopKSkKKyAgfSA6dGV4dAorICAuZmluaSAgICAgIDogeyAqKC5maW5pKSAgICB9ID0wCisgIC5jdG9ycyAgICAgOiB7ICooLmN0b3JzKSAgIH0KKyAgLmR0b3JzICAgICA6IHsgKiguZHRvcnMpICAgfQorCisgIC8qIFJlYWQtd3JpdGUgc2VjdGlvbiwgbWVyZ2VkIGludG8gZGF0YSBzZWdtZW50OiAqLworICAuID0gKC4gKyAweDAwRkYpICYgMHhGRkZGRkYwMDsKKyAgX2Vyb3RleHQgPSAuOworICBQUk9WSURFIChlcm90ZXh0ID0gLik7CisgIC5yZWxvYyAgIDoKKyAgeworICAgICooLmdvdCkKKyAgICBfR09UMl9UQUJMRV8gPSAuOworICAgICooLmdvdDIpCisgICAgX0ZJWFVQX1RBQkxFXyA9IC47CisgICAgKiguZml4dXApCisgIH0KKyAgX19nb3QyX2VudHJpZXMgPSAoX0ZJWFVQX1RBQkxFXyAtIF9HT1QyX1RBQkxFXykgPj4gMjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKSA+PiAyOworCisgIC5kYXRhICAgIDoKKyAgeworICAgICooLmRhdGEpCisgICAgKiguZGF0YTEpCisgICAgKiguc2RhdGEpCisgICAgKiguc2RhdGEyKQorICAgICooLmR5bmFtaWMpCisgICAgQ09OU1RSVUNUT1JTCisgIH0KKyAgX2VkYXRhICA9ICAuOworICBQUk9WSURFIChlZGF0YSA9IC4pOworCisgIC4gPSAuOworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworICAuID0gLjsKKyAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKKworICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLnRleHQuaW5pdCA6IHsgKigudGV4dC5pbml0KSB9CisgIC5kYXRhLmluaXQgOiB7ICooLmRhdGEuaW5pdCkgfQorICAuID0gQUxJR04oMjU2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgLmJvb3RwZyBSRVNFVF9WRUNUT1JfQUREUkVTUyAtIDB4ZmZjIDoKKyAgeworICAgIGFyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9zdGFydC5vCSguYm9vdHBnKQorICB9IDp0ZXh0ID0gMHhmZmZmCisKKyAgLnJlc2V0dmVjIFJFU0VUX1ZFQ1RPUl9BRERSRVNTIDoKKyAgeworICAgICooLnJlc2V0dmVjKQorICB9IDp0ZXh0ID0gMHhmZmZmCisKKyAgLiA9IFJFU0VUX1ZFQ1RPUl9BRERSRVNTICsgMHg0OworCisgIC8qCisgICAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBic3Mgc2VnbWVudCBpc24ndCBsaW5rZWQgYXQgMHgwLCBvdGhlcndpc2UgaXRzCisgICAqIGFkZHJlc3Mgd29uJ3QgYmUgdXBkYXRlZCBkdXJpbmcgcmVsb2NhdGlvbiBmaXh1cHMuICBOb3RlIHRoYXQKKyAgICogdGhpcyBpcyBhIHRlbXBvcmFyeSBmaXguICBDb2RlIHRvIGR5bmFtaWNhbGx5IHRoZSBmaXh1cCB0aGUgYnNzCisgICAqIGxvY2F0aW9uIHdpbGwgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4gIFdoZW4gdGhlIGJzcyByZWxvY2F0aW9uCisgICAqIGZpeHVwIGNvZGUgaXMgcHJlc2VudCB0aGlzIHdvcmthcm91bmQgc2hvdWxkIGJlIHJlbW92ZWQuCisgICAqLworI2lmIChSRVNFVF9WRUNUT1JfQUREUkVTUyA9PSAweGZmZmZmZmZjKQorICAuIHw9IDB4MTA7CisjZW5kaWYKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgKE5PTE9BRCkgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0gOmJzcworCisgIC4gPSBBTElHTig0KTsKKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNhNzlhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L01ha2VmaWxlCkBAIC0wLDAgKzEsNjMgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyMgKEMpIENvcHlyaWdodCAyMDAyLDIwMDMgTW90b3JvbGEgSW5jLgorIyBYaWFuZ2h1YSBYaWFvLFguWGlhb0Btb3Rvcm9sYS5jb20KKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLiAoTUM4Nnh4IFBvcnQpCisjIEplZmYgQnJvd24KKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubworCitTT0JKUy15ICs9IGNhY2hlLm8KK1NPQkpTLSQoQ09ORklHX01QKSArPSByZWxlYXNlLm8KKworQ09CSlMteQkrPSBjcHUubworQ09CSlMteQkrPSBjcHVfaW5pdC5vCisjIDg2MTAgJiA4NjQxIGFyZSBpZGVudGljYWwgdy9yZWdhcmRzIHRvIEREUgorQ09CSlMtJChDT05GSUdfTVBDODYxMCkgKz0gZGRyLTg2NDEubworQ09CSlMtJChDT05GSUdfTVBDODY0MSkgKz0gZGRyLTg2NDEubworQ09CSlMtJChDT05GSUdfT0ZfTElCRkRUKSArPSBmZHQubworQ09CSlMteQkrPSBpbnRlcnJ1cHRzLm8KK0NPQkpTLSQoQ09ORklHX01QKSArPSBtcC5vCitDT0JKUy15CSs9IHNwZWVkLm8KK0NPQkpTLXkJKz0gdHJhcHMubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlMteToubz0uUykgJChDT0JKUy15Oi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUy15KSAkKENPQkpTLXkpKQorU1RBUlQJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU1RBUlQpKQorCithbGw6CSQob2JqKS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChBU09CSlMpICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9jYWNoZS5TIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L2NhY2hlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiMDU4YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9jYWNoZS5TCkBAIC0wLDAgKzEsMzc4IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjODZ4eC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisjaWZuZGVmIENBQ0hFX0xJTkVfU0laRQorIyBkZWZpbmUgQ0FDSEVfTElORV9TSVpFIEwxX0NBQ0hFX0JZVEVTCisjZW5kaWYKKworI2lmIENBQ0hFX0xJTkVfU0laRSA9PSAxMjgKKyNkZWZpbmUgTEdfQ0FDSEVfTElORV9TSVpFIDcKKyNlbGlmIENBQ0hFX0xJTkVfU0laRSA9PSAzMgorI2RlZmluZSBMR19DQUNIRV9MSU5FX1NJWkUgNQorI2VsaWYgQ0FDSEVfTElORV9TSVpFID09IDE2CisjZGVmaW5lIExHX0NBQ0hFX0xJTkVfU0laRSA0CisjZWxpZiBDQUNIRV9MSU5FX1NJWkUgPT0gOAorI2RlZmluZSBMR19DQUNIRV9MSU5FX1NJWkUgMworI2Vsc2UKKyMgZXJyb3IgIkludmFsaWQgY2FjaGUgbGluZSBzaXplISIKKyNlbmRpZgorCisvKgorICogTW9zdCBvZiB0aGlzIGNvZGUgaXMgdGFrZW4gZnJvbSA3NHh4Xzd4eC9jYWNoZS5TCisgKiBhbmQgdGhlbiBjbGVhbmVkIHVwIGEgYml0CisgKi8KKworLyoKKyAqIEludmFsaWRhdGUgTDEgaW5zdHJ1Y3Rpb24gY2FjaGUuCisgKi8KK19HTE9CQUwoaW52YWxpZGF0ZV9sMV9pbnN0cnVjdGlvbl9jYWNoZSkKKwkvKiB1c2UgaW52YWxpZGF0ZS1hbGwgYml0IGluIEhJRDAgKi8KKwltZnNwcglyMyxISUQwCisJb3JpCXIzLHIzLEhJRDBfSUNGSQorCW10c3ByCUhJRDAscjMKKwlpc3luYworCWJscgorCisvKgorICogSW52YWxpZGF0ZSBMMSBkYXRhIGNhY2hlLgorICovCitfR0xPQkFMKGludmFsaWRhdGVfbDFfZGF0YV9jYWNoZSkKKwltZnNwcglyMyxISUQwCisJb3JpCXIzLHIzLEhJRDBfRENGSQorCW10c3ByCUhJRDAscjMKKwlpc3luYworCWJscgorCisvKgorICogRmx1c2ggZGF0YSBjYWNoZS4KKyAqLworX0dMT0JBTChmbHVzaF9kY2FjaGUpCisJbGlzCXIzLDAKKwlsaXMJcjUsQ0FDSEVfTElORV9TSVpFCitmbHVzaDoKKwljbXAJMCwxLHIzLHI1CisJYmdlCWRvbmUKKwlsd3oJcjUsMChyMykKKwlsaXMJcjUsQ0FDSEVfTElORV9TSVpFCisJYWRkaQlyMyxyMywweDQKKwliCWZsdXNoCitkb25lOgorCWJscgorLyoKKyAqIFdyaXRlIGFueSBtb2RpZmllZCBkYXRhIGNhY2hlIGJsb2NrcyBvdXQgdG8gbWVtb3J5CisgKiBhbmQgaW52YWxpZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBpbnN0cnVjdGlvbiBjYWNoZSBibG9ja3MuCisgKiBUaGlzIGlzIGEgbm8tb3Agb24gdGhlIDYwMS4KKyAqCisgKiBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzdG9wKQorICovCitfR0xPQkFMKGZsdXNoX2ljYWNoZV9yYW5nZSkKKwlsaQlyNSxDQUNIRV9MSU5FX1NJWkUtMQorCWFuZGMJcjMscjMscjUKKwlzdWJmCXI0LHIzLHI0CisJYWRkCXI0LHI0LHI1CisJc3J3aS4JcjQscjQsTEdfQ0FDSEVfTElORV9TSVpFCisJYmVxbHIKKwltdGN0cglyNAorCW1yCXI2LHIzCisxOglkY2JzdAkwLHIzCisJYWRkaQlyMyxyMyxDQUNIRV9MSU5FX1NJWkUKKwliZG56CTFiCisJc3luYwkJCQkvKiB3YWl0IGZvciBkY2JzdCdzIHRvIGdldCB0byByYW0gKi8KKwltdGN0cglyNAorMjoJaWNiaQkwLHI2CisJYWRkaQlyNixyNixDQUNIRV9MSU5FX1NJWkUKKwliZG56CTJiCisJc3luYwkJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCisJaXN5bmMKKwlibHIKKy8qCisgKiBXcml0ZSBhbnkgbW9kaWZpZWQgZGF0YSBjYWNoZSBibG9ja3Mgb3V0IHRvIG1lbW9yeS4KKyAqIERvZXMgbm90IGludmFsaWRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgY2FjaGUgbGluZXMgKGVzcGVjaWFsbHkgZm9yCisgKiBhbnkgY29ycmVzcG9uZGluZyBpbnN0cnVjdGlvbiBjYWNoZSkuCisgKgorICogY2xlYW5fZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc3RvcCkKKyAqLworX0dMT0JBTChjbGVhbl9kY2FjaGVfcmFuZ2UpCisJbGkJcjUsQ0FDSEVfTElORV9TSVpFLTEKKwlhbmRjCXIzLHIzLHI1CS8qIGFsaWduIHIzIGRvd24gdG8gY2FjaGUgbGluZSAqLworCXN1YmYJcjQscjMscjQJLyogcjQgPSBvZmZzZXQgb2Ygc3RvcCBmcm9tIHN0YXJ0IG9mIGNhY2hlIGxpbmUgKi8KKwlhZGQJcjQscjQscjUJLyogcjQgKz0gY2FjaGVfbGluZV9zaXplLTEgKi8KKwlzcndpLglyNCxyNCxMR19DQUNIRV9MSU5FX1NJWkUgIC8qIHI0ID0gbnVtYmVyIG9mIGNhY2hlIGxpbmVzIHRvIGZsdXNoICovCisJYmVxbHIJCQkJICAvKiBpZiByNCA9PSAwIHJldHVybiAqLworCW10Y3RyCXI0CQkJICAvKiBjdHIgPSByNCAqLworCisJc3luYworMToJZGNic3QJMCxyMworCWFkZGkJcjMscjMsQ0FDSEVfTElORV9TSVpFCisJYmRuegkxYgorCXN5bmMJCQkJLyogd2FpdCBmb3IgZGNic3QncyB0byBnZXQgdG8gcmFtICovCisJYmxyCisKKy8qCisgKiBXcml0ZSBhbnkgbW9kaWZpZWQgZGF0YSBjYWNoZSBibG9ja3Mgb3V0IHRvIG1lbW9yeQorICogYW5kIGludmFsaWRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgaW5zdHJ1Y3Rpb24gY2FjaGUgYmxvY2tzLgorICoKKyAqIGZsdXNoX2RjYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHN0b3ApCisgKi8KK19HTE9CQUwoZmx1c2hfZGNhY2hlX3JhbmdlKQorCWxpCXI1LENBQ0hFX0xJTkVfU0laRS0xCisJYW5kYwlyMyxyMyxyNQorCXN1YmYJcjQscjMscjQKKwlhZGQJcjQscjQscjUKKwlzcndpLglyNCxyNCxMR19DQUNIRV9MSU5FX1NJWkUKKwliZXFscgorCW10Y3RyCXI0CisKKwlzeW5jCisxOglkY2JmCTAscjMKKwlhZGRpCXIzLHIzLENBQ0hFX0xJTkVfU0laRQorCWJkbnoJMWIKKwlzeW5jCQkJCS8qIHdhaXQgZm9yIGRjYmYncyB0byBnZXQgdG8gcmFtICovCisJYmxyCisKKy8qCisgKiBMaWtlIGFib3ZlLCBidXQgaW52YWxpZGF0ZSB0aGUgRC1jYWNoZS4gIFRoaXMgaXMgdXNlZCBieSB0aGUgOHh4CisgKiB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZSBzbyB0aGUgUFBDIGNvcmUgZG9lc24ndCBnZXQgc3RhbGUgZGF0YQorICogZnJvbSB0aGUgQ1BNIChubyBjYWNoZSBzbm9vcGluZyBoZXJlIDotKS4KKyAqCisgKiBpbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHN0b3ApCisgKi8KK19HTE9CQUwoaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UpCisJbGkJcjUsQ0FDSEVfTElORV9TSVpFLTEKKwlhbmRjCXIzLHIzLHI1CisJc3ViZglyNCxyMyxyNAorCWFkZAlyNCxyNCxyNQorCXNyd2kuCXI0LHI0LExHX0NBQ0hFX0xJTkVfU0laRQorCWJlcWxyCisJbXRjdHIJcjQKKworCXN5bmMKKzE6CWRjYmkJMCxyMworCWFkZGkJcjMscjMsQ0FDSEVfTElORV9TSVpFCisJYmRuegkxYgorCXN5bmMJCQkJLyogd2FpdCBmb3IgZGNiaSdzIHRvIGdldCB0byByYW0gKi8KKwlibHIKKworLyoKKyAqIEZsdXNoIGEgcGFydGljdWxhciBwYWdlIGZyb20gdGhlIGRhdGEgY2FjaGUgdG8gUkFNLgorICogTm90ZTogdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgZG9lcyAqbm90KgorICogc25vb3AgZnJvbSB0aGUgZGF0YSBjYWNoZS4KKyAqCisgKgl2b2lkIF9fZmx1c2hfcGFnZV90b19yYW0odm9pZCAqcGFnZSkKKyAqLworX0dMT0JBTChfX2ZsdXNoX3BhZ2VfdG9fcmFtKQorCXJsd2lubQlyMyxyMywwLDAsMTkJCS8qIEdldCBwYWdlIGJhc2UgYWRkcmVzcyAqLworCWxpCXI0LDQwOTYvQ0FDSEVfTElORV9TSVpFCS8qIE51bWJlciBvZiBsaW5lcyBpbiBhIHBhZ2UgKi8KKwltdGN0cglyNAorCW1yCXI2LHIzCiswOglkY2JzdAkwLHIzCQkJLyogV3JpdGUgbGluZSB0byByYW0gKi8KKwlhZGRpCXIzLHIzLENBQ0hFX0xJTkVfU0laRQorCWJkbnoJMGIKKwlzeW5jCisJbXRjdHIJcjQKKzE6CWljYmkJMCxyNgorCWFkZGkJcjYscjYsQ0FDSEVfTElORV9TSVpFCisJYmRuegkxYgorCXN5bmMKKwlpc3luYworCWJscgorCisvKgorICogRmx1c2ggYSBwYXJ0aWN1bGFyIHBhZ2UgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCisgKiBOb3RlOiB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSBkb2VzICpub3QqCisgKiBzbm9vcCBmcm9tIHRoZSBkYXRhIGNhY2hlLgorICoKKyAqCXZvaWQgX19mbHVzaF9pY2FjaGVfcGFnZSh2b2lkICpwYWdlKQorICovCitfR0xPQkFMKF9fZmx1c2hfaWNhY2hlX3BhZ2UpCisJbGkJcjQsNDA5Ni9DQUNIRV9MSU5FX1NJWkUJLyogTnVtYmVyIG9mIGxpbmVzIGluIGEgcGFnZSAqLworCW10Y3RyCXI0CisxOglpY2JpCTAscjMKKwlhZGRpCXIzLHIzLENBQ0hFX0xJTkVfU0laRQorCWJkbnoJMWIKKwlzeW5jCisJaXN5bmMKKwlibHIKKworLyoKKyAqIENsZWFyIGEgcGFnZSB1c2luZyB0aGUgZGNieiBpbnN0cnVjdGlvbiwgd2hpY2ggZG9lc24ndCBjYXVzZSBhbnkKKyAqIG1lbW9yeSB0cmFmZmljIChleGNlcHQgdG8gd3JpdGUgb3V0IGFueSBjYWNoZSBsaW5lcyB3aGljaCBnZXQKKyAqIGRpc3BsYWNlZCkuICBUaGlzIG9ubHkgd29ya3Mgb24gY2FjaGVhYmxlIG1lbW9yeS4KKyAqLworX0dMT0JBTChjbGVhcl9wYWdlKQorCWxpCXIwLDQwOTYvQ0FDSEVfTElORV9TSVpFCisJbXRjdHIJcjAKKzE6CWRjYnoJMCxyMworCWFkZGkJcjMscjMsQ0FDSEVfTElORV9TSVpFCisJYmRuegkxYgorCWJscgorCisvKgorICogRW5hYmxlIEwxIEluc3RydWN0aW9uIGNhY2hlCisgKi8KK19HTE9CQUwoaWNhY2hlX2VuYWJsZSkKKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0lDRkl8SElEMF9JTE9DSworCWFuZGMJcjMsIHIzLCByNQorCW9yaQlyMywgcjMsIEhJRDBfSUNFCisJb3JpCXI1LCByMywgSElEMF9JQ0ZJCisJbXRzcHIJSElEMCwgcjUKKwltdHNwcglISUQwLCByMworCWlzeW5jCisJYmxyCisKKy8qCisgKiBEaXNhYmxlIEwxIEluc3RydWN0aW9uIGNhY2hlCisgKi8KK19HTE9CQUwoaWNhY2hlX2Rpc2FibGUpCisJbWZscglyNAorCWJsCWludmFsaWRhdGVfbDFfaW5zdHJ1Y3Rpb25fY2FjaGUJCS8qIHVzZXMgcjMgKi8KKwlzeW5jCisJbXRscglyNAorCW1mc3ByCXIzLCBISUQwCisJbGkJcjUsIDAKKwlvcmkJcjUsIHI1LCBISUQwX0lDRQorCWFuZGMJcjMsIHIzLCByNQorCW10c3ByCUhJRDAsIHIzCisJaXN5bmMKKwlibHIKKworLyoKKyAqIElzIGluc3RydWN0aW9uIGNhY2hlIGVuYWJsZWQ/CisgKi8KK19HTE9CQUwoaWNhY2hlX3N0YXR1cykKKwltZnNwcglyMywgSElEMAorCWFuZGkuCXIzLCByMywgSElEMF9JQ0UKKwlibHIKKworCitfR0xPQkFMKGwxZGNhY2hlX2VuYWJsZSkKKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0RDRkl8SElEMF9ETE9DSworCWFuZGMJcjMsIHIzLCByNQorCW10c3ByCUhJRDAsIHIzCQkvKiBubyBpbnZhbGlkYXRlLCB1bmxvY2sgKi8KKwlvcmkJcjMsIHIzLCBISUQwX0RDRQorCW9yaQlyNSwgcjMsIEhJRDBfRENGSQorCW10c3ByCUhJRDAsIHI1CQkvKiBlbmFibGUgKyBpbnZhbGlkYXRlICovCisJbXRzcHIJSElEMCwgcjMJCS8qIGVuYWJsZSAqLworCXN5bmMKKwlibHIKKworLyoKKyAqIEVuYWJsZSBkYXRhIGNhY2hlKHMpIC0gTDEgYW5kIG9wdGlvbmFsbHkgTDIKKyAqIENhbGxzIGwyY2FjaGVfZW5hYmxlLiBMUiBzYXZlZCBpbiByNQorICovCitfR0xPQkFMKGRjYWNoZV9lbmFibGUpCisJbWZzcHIJcjMsIEhJRDAKKwlsaQlyNSwgSElEMF9EQ0ZJfEhJRDBfRExPQ0sKKwlhbmRjCXIzLCByMywgcjUKKwltdHNwcglISUQwLCByMwkJLyogbm8gaW52YWxpZGF0ZSwgdW5sb2NrICovCisJb3JpCXIzLCByMywgSElEMF9EQ0UKKwlvcmkJcjUsIHIzLCBISUQwX0RDRkkKKwltdHNwcglISUQwLCByNQkJLyogZW5hYmxlICsgaW52YWxpZGF0ZSAqLworCW10c3ByCUhJRDAsIHIzCQkvKiBlbmFibGUgKi8KKwlzeW5jCisjaWZkZWYgQ09ORklHX1NZU19MMgorCW1mbHIJcjUKKwlibAlsMmNhY2hlX2VuYWJsZQkJLyogdXNlcyByMyBhbmQgcjQgKi8KKwlzeW5jCisJbXRscglyNQorI2VuZGlmCisJYmxyCisKKworLyoKKyAqIERpc2FibGUgZGF0YSBjYWNoZShzKSAtIEwxIGFuZCBvcHRpb25hbGx5IEwyCisgKiBDYWxscyBmbHVzaF9kY2FjaGUgYW5kIGwyY2FjaGVfZGlzYWJsZV9ub19mbHVzaC4KKyAqIExSIHNhdmVkIGluIHI0CisgKi8KK19HTE9CQUwoZGNhY2hlX2Rpc2FibGUpCisJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlciAqLworCWJsCWZsdXNoX2RjYWNoZQkvKiB1c2VzIHIzIGFuZCByNSAqLworCXN5bmMKKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0RDRkl8SElEMF9ETE9DSworCWFuZGMJcjMsIHIzLCByNQorCW10c3ByCUhJRDAsIHIzCQkvKiBubyBpbnZhbGlkYXRlLCB1bmxvY2sgKi8KKwlsaQlyNSwgSElEMF9EQ0V8SElEMF9EQ0ZJCisJYW5kYwlyMywgcjMsIHI1CQkvKiBubyBlbmFibGUsIG5vIGludmFsaWRhdGUgKi8KKwltdHNwcglISUQwLCByMworCXN5bmMKKyNpZmRlZiBDT05GSUdfU1lTX0wyCisJYmwJbDJjYWNoZV9kaXNhYmxlX25vX2ZsdXNoIC8qIHVzZXMgcjMgKi8KKyNlbmRpZgorCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIgKi8KKwlibHIKKworLyoKKyAqIElzIGRhdGEgY2FjaGUgZW5hYmxlZD8KKyAqLworX0dMT0JBTChkY2FjaGVfc3RhdHVzKQorCW1mc3ByCXIzLCBISUQwCisJYW5kaS4JcjMsIHIzLCBISUQwX0RDRQorCWJscgorCisvKgorICogSW52YWxpZGF0ZSBMMiBjYWNoZSB1c2luZyBMMkksIGFzc3VtZSBMMiBpcyBlbmFibGVkCisgKi8KK19HTE9CQUwobDJjYWNoZV9pbnZhbGlkYXRlKQorCW1mc3ByCXIzLCBsMmNyCisJcmx3aW5tLglyMywgcjMsIDAsIDAsIDAKKwliZXEJMWYKKworCW1mc3ByCXIzLCBsMmNyCisJcmx3aW5tCXIzLCByMywgMCwgMSwgMzEKKworI2lmZGVmCUNPTkZJR19BTFRJVkVDCisJZHNzYWxsCisjZW5kaWYKKwlzeW5jCisJbXRzcHIJbDJjciwgcjMKKwlzeW5jCisxOgltZnNwcglyMywgbDJjcgorCW9yaXMJcjMsIHIzLCBMMkNSX0wySUBoCisJbXRzcHIJbDJjciwgcjMKKworaW52bDI6CisJbWZzcHIJcjMsIGwyY3IKKwlhbmRpcy4JcjMsIHIzLCBMMkNSX0wySUBoCisJYm5lCWludmwyCisJYmxyCisKKy8qCisgKiBFbmFibGUgTDIgY2FjaGUKKyAqIENhbGxzIGwyY2FjaGVfaW52YWxpZGF0ZS4gTFIgaXMgc2F2ZWQgaW4gcjQKKyAqLworX0dMT0JBTChsMmNhY2hlX2VuYWJsZSkKKwltZmxyCXI0CQkJLyogc2F2ZSBsaW5rIHJlZ2lzdGVyICovCisJYmwJbDJjYWNoZV9pbnZhbGlkYXRlCS8qIHVzZXMgcjMgKi8KKwlzeW5jCisJbGlzCXIzLCBMMl9FTkFCTEVAaAorCW9yaQlyMywgcjMsIEwyX0VOQUJMRUBsCisJbXRzcHIJbDJjciwgcjMKKwlpc3luYworCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIgKi8KKwlibHIKKworLyoKKyAqIERpc2FibGUgTDIgY2FjaGUKKyAqIENhbGxzIGZsdXNoX2RjYWNoZS4gTFIgaXMgc2F2ZWQgaW4gcjQKKyAqLworX0dMT0JBTChsMmNhY2hlX2Rpc2FibGUpCisJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlciAqLworCWJsCWZsdXNoX2RjYWNoZQkJLyogdXNlcyByMyBhbmQgcjUgKi8KKwlzeW5jCisJbXRscglyNAkJCS8qIHJlc3RvcmUgbGluayByZWdpc3RlciAqLworbDJjYWNoZV9kaXNhYmxlX25vX2ZsdXNoOgkJLyogcHJvdmlkZSB3YXkgdG8gZGlzYWJsZSBMMiB3L28gZmx1c2hpbmcgKi8KKwlsaXMJcjMsIEwyX0lOSVRAaAorCW9yaQlyMywgcjMsIEwyX0lOSVRAbAorCW10c3ByCWwyY3IsIHIzCisJaXN5bmMKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9jb25maWcubWsgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMmY4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLgorIyBKZWZmIEJyb3duCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mUElDIC1tZWFiaQorCitQTEFURk9STV9DUFBGTEFHUyArPSAtZmZpeGVkLXIyIC1tc3RyaW5nCitQTEFURk9STV9DUFBGTEFHUyArPSAtbWFsdGl2ZWMgLW1hYmk9YWx0aXZlYyAtbXNvZnQtZmxvYXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODg3NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L2NwdS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDYsMjAwOS0yMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBKZWZmIEJyb3duCisgKiBTcmlrYW50aCBTcmluaXZhc2FuIChzcmlrYW50aC5zcmluaXZhc2FuQGZyZWVzY2FsZS5jb20pCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNpbmNsdWRlIDxtcGM4Nnh4Lmg+CisjaW5jbHVkZSA8YXNtL2ZzbF9sYXcuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qCisgKiBEZWZhdWx0IGJvYXJkIHJlc2V0IGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitfX2JvYXJkX3Jlc2V0KHZvaWQpCit7CisJLyogRG8gbm90aGluZyAqLworfQordm9pZCBib2FyZF9yZXNldCh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19ib2FyZF9yZXNldCIpKSk7CisKKworaW50CitjaGVja2NwdSh2b2lkKQoreworCXN5c19pbmZvX3Qgc3lzaW5mbzsKKwl1aW50IHB2ciwgc3ZyOworCXVpbnQgdmVyOworCXVpbnQgbWFqb3IsIG1pbm9yOworCWNoYXIgYnVmMVszMl0sIGJ1ZjJbMzJdOworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICZpbW1hcC0+aW1fZ3VyOworCXN0cnVjdCBjcHVfdHlwZSAqY3B1OworCXVpbnQgbXNzY3IwID0gbWZzcHIoTVNTQ1IwKTsKKworCXN2ciA9IGdldF9zdnIoKTsKKwl2ZXIgPSBTVlJfU09DX1ZFUihzdnIpOworCW1ham9yID0gU1ZSX01BSihzdnIpOworCW1pbm9yID0gU1ZSX01JTihzdnIpOworCisJaWYgKGNwdV9udW1jb3JlcygpID4gMSkgeworI2lmbmRlZiBDT05GSUdfTVAKKwkJcHV0cygiVW5pY29yZSBzb2Z0d2FyZSBvbiBtdWx0aXByb2Nlc3NvciBzeXN0ZW0hIVxuIgorCQkgICAgICJUbyBlbmFibGUgbXV0bHRpY29yZSBidWlsZCBkZWZpbmUgQ09ORklHX01QXG4iKTsKKyNlbmRpZgorCX0KKwlwdXRzKCJDUFU6ICAgIik7CisKKwljcHUgPSBnZC0+Y3B1OworCisJcHV0cyhjcHUtPm5hbWUpOworCisJcHJpbnRmKCIsIFZlcnNpb246ICVkLiVkLCAoMHglMDh4KVxuIiwgbWFqb3IsIG1pbm9yLCBzdnIpOworCXB1dHMoIkNvcmU6ICAiKTsKKworCXB2ciA9IGdldF9wdnIoKTsKKwl2ZXIgPSBQVlJfRTYwMF9WRVIocHZyKTsKKwltYWpvciA9IFBWUl9FNjAwX01BSihwdnIpOworCW1pbm9yID0gUFZSX0U2MDBfTUlOKHB2cik7CisKKwlwcmludGYoIkU2MDAgQ29yZSAlZCIsIChtc3NjcjAgJiAweDIwKSA/IDEgOiAwICk7CisJaWYgKGd1ci0+cG9yZGV2c3IgJiBNUEM4Nnh4X1BPUkRFVlNSX0NPUkUxVEUpCisJCXB1dHMoIlxuICAgIENvcmUxVHJhbnNsYXRpb24gRW5hYmxlZCIpOworCWRlYnVnKCIgKE1TU0NSMD0leCwgUE9SREVWU1I9JXgpIiwgbXNzY3IwLCBndXItPnBvcmRldnNyKTsKKworCXByaW50ZigiLCBWZXJzaW9uOiAlZC4lZCwgKDB4JTA4eClcbiIsIG1ham9yLCBtaW5vciwgcHZyKTsKKworCWdldF9zeXNfaW5mbygmc3lzaW5mbyk7CisKKwlwdXRzKCJDbG9jayBDb25maWd1cmF0aW9uOlxuIik7CisJcHJpbnRmKCIgICAgICAgQ1BVOiUtNHMgTUh6LCAiLCBzdHJtaHooYnVmMSwgc3lzaW5mby5mcmVxUHJvY2Vzc29yKSk7CisJcHJpbnRmKCJNUFg6JS00cyBNSHpcbiIsIHN0cm1oeihidWYxLCBzeXNpbmZvLmZyZXFTeXN0ZW1CdXMpKTsKKwlwcmludGYoIiAgICAgICBERFI6JS00cyBNSHogKCVzIE1UL3MgZGF0YSByYXRlKSwgIiwKKwkJc3RybWh6KGJ1ZjEsIHN5c2luZm8uZnJlcVN5c3RlbUJ1cyAvIDIpLAorCQlzdHJtaHooYnVmMiwgc3lzaW5mby5mcmVxU3lzdGVtQnVzKSk7CisKKwlpZiAoc3lzaW5mby5mcmVxTG9jYWxCdXMgPiBMQ1JSX0NMS0RJVikgeworCQlwcmludGYoIkxCQzolLTRzIE1IelxuIiwgc3RybWh6KGJ1ZjEsIHN5c2luZm8uZnJlcUxvY2FsQnVzKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJMQkM6IHVua25vd24gKExDUlJbQ0xLRElWXSA9IDB4JTAybHgpXG4iLAorCQkgICAgICAgc3lzaW5mby5mcmVxTG9jYWxCdXMpOworCX0KKworCXB1dHMoIkwxOiAgICBELWNhY2hlIDMyIEtCIGVuYWJsZWRcbiIpOworCXB1dHMoIiAgICAgICBJLWNhY2hlIDMyIEtCIGVuYWJsZWRcbiIpOworCisJcHV0cygiTDI6ICAgICIpOworCWlmIChnZXRfbDJjcigpICYgMHg4MDAwMDAwMCkgeworI2lmIGRlZmluZWQoQ09ORklHX01QQzg2MTApCisJCXB1dHMoIjI1NiIpOworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODY0MSkKKwkJcHV0cygiNTEyIik7CisjZW5kaWYKKwkJcHV0cygiIEtCIGVuYWJsZWRcbiIpOworCX0gZWxzZSB7CisJCXB1dHMoIkRpc2FibGVkXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkCitkb19yZXNldChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGNjc3JfZ3VyX3QgKmd1ciA9ICZpbW1hcC0+aW1fZ3VyOworCisJLyogQXR0ZW1wdCBib2FyZC1zcGVjaWZpYyByZXNldCAqLworCWJvYXJkX3Jlc2V0KCk7CisKKwkvKiBOZXh0IHRyeSBhc3NlcnRpbmcgSFJFU0VUX1JFUSAqLworCW91dF9iZTMyKCZndXItPnJzdGNyLCBNUEM4Nnh4X1JTVENSX0hSU1RfUkVRKTsKKworCXdoaWxlICgxKQorCQk7Cit9CisKKworLyoKKyAqIEdldCB0aW1lYmFzZSBjbG9jayBmcmVxdWVuY3kKKyAqLwordW5zaWduZWQgbG9uZworZ2V0X3RiY2xrKHZvaWQpCit7CisJc3lzX2luZm9fdCBzeXNfaW5mbzsKKworCWdldF9zeXNfaW5mbygmc3lzX2luZm8pOworCXJldHVybiAoc3lzX2luZm8uZnJlcVN5c3RlbUJ1cyArIDNMKSAvIDRMOworfQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKK3ZvaWQKK3dhdGNoZG9nX3Jlc2V0KHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfTVBDODYxMCkKKwkvKgorCSAqIFRoaXMgYWN0dWFsbHkgZmVlZCB0aGUgaGFyZCBlbmFibGVkIHdhdGNoZG9nLgorCSAqLworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgY2Nzcl93ZHRfdCAqd2R0ID0gJmltbWFwLT5pbV93ZHQ7CisJdm9sYXRpbGUgY2Nzcl9ndXJfdCAqZ3VyID0gJmltbWFwLT5pbV9ndXI7CisJdTMyIHRtcCA9IGd1ci0+cG9yZGV2c3I7CisKKwlpZiAodG1wICYgMHg0MDAwKSB7CisJCXdkdC0+c3dzcnIgPSAweDU1NmM7CisJCXdkdC0+c3dzcnIgPSAweGFhMzk7CisJfQorI2VuZGlmCit9CisjZW5kaWYJLyogQ09ORklHX1dBVENIRE9HICovCisKKy8qCisgKiBQcmludCBvdXQgdGhlIHN0YXRlIG9mIHZhcmlvdXMgbWFjaGluZSByZWdpc3RlcnMuCisgKiBDdXJyZW50bHkgcHJpbnRzIG91dCBMQVdzLCBCUjAvT1IwLCBhbmQgQkFUcworICovCit2b2lkIG1wYzg2eHhfcmVnaW5mbyh2b2lkKQoreworCWltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJY2Nzcl9sYmNfdCAqbGJjID0gJmltbWFwLT5pbV9sYmM7CisKKwlwcmludF9iYXRzKCk7CisJcHJpbnRfbGF3cygpOworCisJcHJpbnRmICgiTG9jYWwgQnVzIENvbnRyb2xsZXIgUmVnaXN0ZXJzXG4iCisJCSJcdEJSMFx0MHglMDhYXHRPUjBcdDB4JTA4WCBcbiIsIGluX2JlMzIoJmxiYy0+YnIwKSwgaW5fYmUzMigmbGJjLT5vcjApKTsKKwlwcmludGYoIlx0QlIxXHQweCUwOFhcdE9SMVx0MHglMDhYIFxuIiwgaW5fYmUzMigmbGJjLT5icjEpLCBpbl9iZTMyKCZsYmMtPm9yMSkpOworCXByaW50ZigiXHRCUjJcdDB4JTA4WFx0T1IyXHQweCUwOFggXG4iLCBpbl9iZTMyKCZsYmMtPmJyMiksIGluX2JlMzIoJmxiYy0+b3IyKSk7CisJcHJpbnRmKCJcdEJSM1x0MHglMDhYXHRPUjNcdDB4JTA4WCBcbiIsIGluX2JlMzIoJmxiYy0+YnIzKSwgaW5fYmUzMigmbGJjLT5vcjMpKTsKKwlwcmludGYoIlx0QlI0XHQweCUwOFhcdE9SNFx0MHglMDhYIFxuIiwgaW5fYmUzMigmbGJjLT5icjQpLCBpbl9iZTMyKCZsYmMtPm9yNCkpOworCXByaW50ZigiXHRCUjVcdDB4JTA4WFx0T1I1XHQweCUwOFggXG4iLCBpbl9iZTMyKCZsYmMtPmJyNSksIGluX2JlMzIoJmxiYy0+b3I1KSk7CisJcHJpbnRmKCJcdEJSNlx0MHglMDhYXHRPUjZcdDB4JTA4WCBcbiIsIGluX2JlMzIoJmxiYy0+YnI2KSwgaW5fYmUzMigmbGJjLT5vcjYpKTsKKwlwcmludGYoIlx0QlI3XHQweCUwOFhcdE9SN1x0MHglMDhYIFxuIiwgaW5fYmUzMigmbGJjLT5icjcpLCBpbl9iZTMyKCZsYmMtPm9yNykpOworCit9CisKKy8qCisgKiBTZXQgdGhlIEREUiBCQVRzIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBzaXplIG9mIEREUi4KKyAqCisgKiBkcmFtX3NpemUgaXMgdGhlIGFjdHVhbCBzaXplIG9mIEREUiwgaW4gYnl0ZXMKKyAqCisgKiBOb3RlOiB3ZSBhc3N1bWUgdGhhdCBDT05GSUdfTUFYX01FTV9NQVBQRUQgaXMgMkcgb3Igc21hbGxlciBhcyB3ZSBvbmx5CisgKiBhcmUgdXNpbmcgYSBzaW5nbGUgQkFUIHRvIGNvdmVyIEREUi4KKyAqCisgKiBJZiB0aGlzIGlzIG5vdCB0cnVlLCAoZS5nLiBDT05GSUdfTUFYX01FTV9NQVBQRUQgaXMgMkdCIGJ1dCBISUQwX1hCU0VOCisgKiBpcyBub3QgZGVmaW5lZCkgdGhlbiB3ZSBtaWdodCBoYXZlIGEgc2l0dWF0aW9uIHdoZXJlIFUtQm9vdCB3aWxsIGF0dGVtcHQKKyAqIHRvIHJlbG9jYXRlZCBpdHNlbGYgb3V0c2lkZSBvZiB0aGUgcmVnaW9uIG1hcHBlZCBieSBEQkFUMC4KKyAqIFRoaXMgd2lsbCBjYXVzZSBhIG1hY2hpbmUgY2hlY2suCisgKgorICogQ3VycmVudGx5IHdlIGFyZSBsaW1pdGVkIHRvIHBvd2VyIG9mIHR3byBzaXplZCBERFIgc2luY2Ugd2Ugb25seSB1c2UgYQorICogc2luZ2xlIGJhdC4gIElmIGEgbm9uLXBvd2VyIG9mIHR3byBzaXplIGlzIHVzZWQgdGhhdCBpcyBsZXNzIHRoYW4KKyAqIENPTkZJR19NQVhfTUVNX01BUFBFRCB1LWJvb3Qgd2lsbCBjcmFzaC4KKyAqCisgKi8KK3ZvaWQgc2V0dXBfZGRyX2JhdChwaHlzX2FkZHJfdCBkcmFtX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBiYXR1LCBibDsKKworCWJsID0gVE9fQkFUVV9CTChtaW4oZHJhbV9zaXplLCBDT05GSUdfTUFYX01FTV9NQVBQRUQpKTsKKworCWlmIChCQVRVX1NJWkUoYmwpICE9IGRyYW1fc2l6ZSkgeworCQl1NjQgc3ogPSAodTY0KWRyYW1fc2l6ZSAtIEJBVFVfU0laRShibCk7CisJCXByaW50X3NpemUoc3osICIgbGVmdCB1bm1hcHBlZFxuIik7CisJfQorCisJYmF0dSA9IGJsIHwgQkFUVV9WUyB8IEJBVFVfVlA7CisJd3JpdGVfYmF0KERCQVQwLCBiYXR1LCBDT05GSUdfU1lTX0RCQVQwTCk7CisJd3JpdGVfYmF0KElCQVQwLCBiYXR1LCBDT05GSUdfU1lTX0lCQVQwTCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvY3B1X2luaXQuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9jcHVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjA0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvY3B1X2luaXQuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA0LDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIEplZmYgQnJvd24KKyAqIFNyaWthbnRoIFNyaW5pdmFzYW4gKHNyaWthbnRoLnNyaW5pdmFzYW5AZnJlZXNjYWxlLmNvbSkKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogY3B1X2luaXQuYyAtIGxvdyBsZXZlbCBjcHUgaW5pdAorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4Nnh4Lmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9mc2xfbGF3Lmg+CisjaW5jbHVkZSA8YXNtL21wLmg+CisKK3ZvaWQgc2V0dXBfYmF0cyh2b2lkKTsKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qCisgKiBCcmVhdGhlIHNvbWUgbGlmZSBpbnRvIHRoZSBDUFUuLi4KKyAqCisgKiBTZXQgdXAgdGhlIG1lbW9yeSBtYXAKKyAqIGluaXRpYWxpemUgYSBidW5jaCBvZiByZWdpc3RlcnMKKyAqLworCit2b2lkIGNwdV9pbml0X2Yodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICAgICppbW1hcCA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGNjc3JfbGJjX3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbGJjOworCisJLyogUG9pbnRlciBpcyB3cml0YWJsZSBzaW5jZSB3ZSBhbGxvY2F0ZWQgYSByZWdpc3RlciBmb3IgaXQgKi8KKwlnZCA9IChnZF90ICopIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgKyBDT05GSUdfU1lTX0dCTF9EQVRBX09GRlNFVCk7CisKKwkvKiBDbGVhciBpbml0aWFsIGdsb2JhbCBkYXRhICovCisJbWVtc2V0ICgodm9pZCAqKSBnZCwgMCwgc2l6ZW9mIChnZF90KSk7CisKKyNpZmRlZiBDT05GSUdfRlNMX0xBVworCWluaXRfbGF3cygpOworI2VuZGlmCisKKwlzZXR1cF9iYXRzKCk7CisKKwkvKiBNYXAgYmFua3MgMCBhbmQgMSB0byB0aGUgRkxBU0ggYmFua3MgMCBhbmQgMSBhdCBwcmVsaW1pbmFyeQorCSAqIGFkZHJlc3NlcyAtIHRoZXNlIGhhdmUgdG8gYmUgbW9kaWZpZWQgbGF0ZXIgd2hlbiBGTEFTSCBzaXplCisJICogaGFzIGJlZW4gZGV0ZXJtaW5lZAorCSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX09SMF9SRU1BUCkKKwltZW1jdGwtPm9yMCA9IENPTkZJR19TWVNfT1IwX1JFTUFQOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX09SMV9SRU1BUCkKKwltZW1jdGwtPm9yMSA9IENPTkZJR19TWVNfT1IxX1JFTUFQOworI2VuZGlmCisKKwkvKiBub3cgcmVzdHJpY3QgdG8gcHJlbGltaW5hcnkgcmFuZ2UgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIwX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SMF9QUkVMSU0pCisJbWVtY3RsLT5icjAgPSBDT05GSUdfU1lTX0JSMF9QUkVMSU07CisJbWVtY3RsLT5vcjAgPSBDT05GSUdfU1lTX09SMF9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjFfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IxX1BSRUxJTSkKKwltZW1jdGwtPm9yMSA9IENPTkZJR19TWVNfT1IxX1BSRUxJTTsKKwltZW1jdGwtPmJyMSA9IENPTkZJR19TWVNfQlIxX1BSRUxJTTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSMl9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjJfUFJFTElNKQorCW1lbWN0bC0+b3IyID0gQ09ORklHX1NZU19PUjJfUFJFTElNOworCW1lbWN0bC0+YnIyID0gQ09ORklHX1NZU19CUjJfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlIzX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SM19QUkVMSU0pCisJbWVtY3RsLT5vcjMgPSBDT05GSUdfU1lTX09SM19QUkVMSU07CisJbWVtY3RsLT5icjMgPSBDT05GSUdfU1lTX0JSM19QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjRfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I0X1BSRUxJTSkKKwltZW1jdGwtPm9yNCA9IENPTkZJR19TWVNfT1I0X1BSRUxJTTsKKwltZW1jdGwtPmJyNCA9IENPTkZJR19TWVNfQlI0X1BSRUxJTTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0JSNV9QUkVMSU0pICYmIGRlZmluZWQoQ09ORklHX1NZU19PUjVfUFJFTElNKQorCW1lbWN0bC0+b3I1ID0gQ09ORklHX1NZU19PUjVfUFJFTElNOworCW1lbWN0bC0+YnI1ID0gQ09ORklHX1NZU19CUjVfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfQlI2X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SNl9QUkVMSU0pCisJbWVtY3RsLT5vcjYgPSBDT05GSUdfU1lTX09SNl9QUkVMSU07CisJbWVtY3RsLT5icjYgPSBDT05GSUdfU1lTX0JSNl9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjdfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I3X1BSRUxJTSkKKwltZW1jdGwtPm9yNyA9IENPTkZJR19TWVNfT1I3X1BSRUxJTTsKKwltZW1jdGwtPmJyNyA9IENPTkZJR19TWVNfQlI3X1BSRUxJTTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ETUEpCisJZG1hX2luaXQoKTsKKyNlbmRpZgorCisJLyogZW5hYmxlIHRoZSB0aW1lYmFzZSBiaXQgaW4gSElEMCAqLworCXNldF9oaWQwKGdldF9oaWQwKCkgfCAweDQwMDAwMDApOworCisJLyogZW5hYmxlIEVNQ1AsIFNZTkNCRSB8IEFCRSBiaXRzIGluIEhJRDEgKi8KKwlzZXRfaGlkMShnZXRfaGlkMSgpIHwgMHg4MDAwMEMwMCk7Cit9CisKKy8qCisgKiBpbml0aWFsaXplIGhpZ2hlciBsZXZlbCBwYXJ0cyBvZiBDUFUgbGlrZSB0aW1lcnMKKyAqLworaW50IGNwdV9pbml0X3Iodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19NUCkKKwlzZXR1cF9tcCgpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCB1cCBCQVQgcmVnaXN0ZXJzICovCit2b2lkIHNldHVwX2JhdHModm9pZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfREJBVDBVKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfREJBVDBMKQorCXdyaXRlX2JhdChEQkFUMCwgQ09ORklHX1NZU19EQkFUMFUsIENPTkZJR19TWVNfREJBVDBMKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19JQkFUMFUpICYmIGRlZmluZWQoQ09ORklHX1NZU19JQkFUMEwpCisJd3JpdGVfYmF0KElCQVQwLCBDT05GSUdfU1lTX0lCQVQwVSwgQ09ORklHX1NZU19JQkFUMEwpOworI2VuZGlmCisJd3JpdGVfYmF0KERCQVQxLCBDT05GSUdfU1lTX0RCQVQxVSwgQ09ORklHX1NZU19EQkFUMUwpOworCXdyaXRlX2JhdChJQkFUMSwgQ09ORklHX1NZU19JQkFUMVUsIENPTkZJR19TWVNfSUJBVDFMKTsKKwl3cml0ZV9iYXQoREJBVDIsIENPTkZJR19TWVNfREJBVDJVLCBDT05GSUdfU1lTX0RCQVQyTCk7CisJd3JpdGVfYmF0KElCQVQyLCBDT05GSUdfU1lTX0lCQVQyVSwgQ09ORklHX1NZU19JQkFUMkwpOworCXdyaXRlX2JhdChEQkFUMywgQ09ORklHX1NZU19EQkFUM1UsIENPTkZJR19TWVNfREJBVDNMKTsKKwl3cml0ZV9iYXQoSUJBVDMsIENPTkZJR19TWVNfSUJBVDNVLCBDT05GSUdfU1lTX0lCQVQzTCk7CisJd3JpdGVfYmF0KERCQVQ0LCBDT05GSUdfU1lTX0RCQVQ0VSwgQ09ORklHX1NZU19EQkFUNEwpOworCXdyaXRlX2JhdChJQkFUNCwgQ09ORklHX1NZU19JQkFUNFUsIENPTkZJR19TWVNfSUJBVDRMKTsKKwl3cml0ZV9iYXQoREJBVDUsIENPTkZJR19TWVNfREJBVDVVLCBDT05GSUdfU1lTX0RCQVQ1TCk7CisJd3JpdGVfYmF0KElCQVQ1LCBDT05GSUdfU1lTX0lCQVQ1VSwgQ09ORklHX1NZU19JQkFUNUwpOworCXdyaXRlX2JhdChEQkFUNiwgQ09ORklHX1NZU19EQkFUNlUsIENPTkZJR19TWVNfREJBVDZMKTsKKwl3cml0ZV9iYXQoSUJBVDYsIENPTkZJR19TWVNfSUJBVDZVLCBDT05GSUdfU1lTX0lCQVQ2TCk7CisJd3JpdGVfYmF0KERCQVQ3LCBDT05GSUdfU1lTX0RCQVQ3VSwgQ09ORklHX1NZU19EQkFUN0wpOworCXdyaXRlX2JhdChJQkFUNywgQ09ORklHX1NZU19JQkFUN1UsIENPTkZJR19TWVNfSUJBVDdMKTsKKworCXJldHVybjsKK30KKworI2lmZGVmIENPTkZJR19BRERSX01BUAorLyogSW5pdGlhbGl6ZSBhZGRyZXNzIG1hcHBpbmcgYXJyYXkgKi8KK3ZvaWQgaW5pdF9hZGRyX21hcCh2b2lkKQoreworCWludCBpOworCXBwY19iYXRfdCBiYXQgPSBEQkFUMDsKKwlwaHlzX3NpemVfdCBzaXplOworCXVuc2lnbmVkIGxvbmcgdXBwZXIsIGxvd2VyOworCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19TWVNfTlVNX0FERFJfTUFQOyBpKyssIGJhdCsrKSB7CisJCWlmIChyZWFkX2JhdChiYXQsICZ1cHBlciwgJmxvd2VyKSAhPSAtMSkgeworCQkJaWYgKCFCQVRVX1ZBTElEKHVwcGVyKSkKKwkJCQlzaXplID0gMDsKKwkJCWVsc2UKKwkJCQlzaXplID0gQkFUVV9TSVpFKHVwcGVyKTsKKwkJCWFkZHJtYXBfc2V0X2VudHJ5KEJBVFVfVkFERFIodXBwZXIpLCBCQVRMX1BBRERSKGxvd2VyKSwKKwkJCQkJICBzaXplLCBpKTsKKwkJfQorI2lmZGVmIENPTkZJR19ISUdIX0JBVFMKKwkJLyogSGlnaCBiYXRzIGFyZSBub3QgY29udGlndW91cyB3aXRoIGxvdyBCQVQgbnVtYmVycyAqLworCQlpZiAoYmF0ID09IERCQVQzKQorCQkJYmF0ID0gREJBVDQgLSAxOworI2VuZGlmCisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvZGRyLTg2NDEuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9kZHItODY0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZjJjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvZGRyLTg2NDEuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2Rkcl9zZHJhbS5oPgorCisjaWYgKENPTkZJR19DSElQX1NFTEVDVFNfUEVSX0NUUkwgPiA0KQorI2Vycm9yIEludmFsaWQgc2V0dGluZyBmb3IgQ09ORklHX0NISVBfU0VMRUNUU19QRVJfQ1RSTAorI2VuZGlmCisKK3ZvaWQgZnNsX2Rkcl9zZXRfbWVtY3RsX3JlZ3MoY29uc3QgZnNsX2Rkcl9jZmdfcmVnc190ICpyZWdzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY3RybF9udW0pCit7CisJdW5zaWduZWQgaW50IGk7CisJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyOworCisJc3dpdGNoIChjdHJsX251bSkgeworCWNhc2UgMDoKKwkJZGRyID0gKHZvaWQgKilDT05GSUdfU1lTX01QQzg2eHhfRERSX0FERFI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZGRyID0gKHZvaWQgKilDT05GSUdfU1lTX01QQzg2eHhfRERSMl9BRERSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiVzIHVuZXhwZWN0ZWQgY3RybF9udW0gPSAldVxuIiwgX19GVU5DVElPTl9fLCBjdHJsX251bSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX0NISVBfU0VMRUNUU19QRVJfQ1RSTDsgaSsrKSB7CisJCWlmIChpID09IDApIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzMF9ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzMF9jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisKKwkJfSBlbHNlIGlmIChpID09IDEpIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzMV9ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzMV9jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisKKwkJfSBlbHNlIGlmIChpID09IDIpIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzMl9ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzMl9jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisKKwkJfSBlbHNlIGlmIChpID09IDMpIHsKKwkJCW91dF9iZTMyKCZkZHItPmNzM19ibmRzLCByZWdzLT5jc1tpXS5ibmRzKTsKKwkJCW91dF9iZTMyKCZkZHItPmNzM19jb25maWcsIHJlZ3MtPmNzW2ldLmNvbmZpZyk7CisJCX0KKwl9CisKKwlvdXRfYmUzMigmZGRyLT50aW1pbmdfY2ZnXzMsIHJlZ3MtPnRpbWluZ19jZmdfMyk7CisJb3V0X2JlMzIoJmRkci0+dGltaW5nX2NmZ18wLCByZWdzLT50aW1pbmdfY2ZnXzApOworCW91dF9iZTMyKCZkZHItPnRpbWluZ19jZmdfMSwgcmVncy0+dGltaW5nX2NmZ18xKTsKKwlvdXRfYmUzMigmZGRyLT50aW1pbmdfY2ZnXzIsIHJlZ3MtPnRpbWluZ19jZmdfMik7CisJb3V0X2JlMzIoJmRkci0+c2RyYW1fY2ZnXzIsIHJlZ3MtPmRkcl9zZHJhbV9jZmdfMik7CisJb3V0X2JlMzIoJmRkci0+c2RyYW1fbW9kZSwgcmVncy0+ZGRyX3NkcmFtX21vZGUpOworCW91dF9iZTMyKCZkZHItPnNkcmFtX21vZGVfMiwgcmVncy0+ZGRyX3NkcmFtX21vZGVfMik7CisJb3V0X2JlMzIoJmRkci0+c2RyYW1fbW9kZV9jbnRsLCByZWdzLT5kZHJfc2RyYW1fbWRfY250bCk7CisJb3V0X2JlMzIoJmRkci0+c2RyYW1faW50ZXJ2YWwsIHJlZ3MtPmRkcl9zZHJhbV9pbnRlcnZhbCk7CisJb3V0X2JlMzIoJmRkci0+c2RyYW1fZGF0YV9pbml0LCByZWdzLT5kZHJfZGF0YV9pbml0KTsKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9jbGtfY250bCwgcmVncy0+ZGRyX3NkcmFtX2Nsa19jbnRsKTsKKwlvdXRfYmUzMigmZGRyLT5pbml0X2FkZHIsIHJlZ3MtPmRkcl9pbml0X2FkZHIpOworCW91dF9iZTMyKCZkZHItPmluaXRfZXh0X2FkZHIsIHJlZ3MtPmRkcl9pbml0X2V4dF9hZGRyKTsKKworCWRlYnVnKCJiZWZvcmUgZ29cbiIpOworCisJLyoKKwkgKiAyMDAgcGFpbmZ1bCBtaWNyby1zZWNvbmRzIG11c3QgZWxhcHNlIGJldHdlZW4KKwkgKiB0aGUgRERSIGNsb2NrIHNldHVwIGFuZCB0aGUgRERSIGNvbmZpZyBlbmFibGUuCisJICovCisJdWRlbGF5KDIwMCk7CisJYXNtIHZvbGF0aWxlKCJzeW5jO2lzeW5jIik7CisKKwlvdXRfYmUzMigmZGRyLT5zZHJhbV9jZmcsIHJlZ3MtPmRkcl9zZHJhbV9jZmcpOworCisJLyoKKwkgKiBQb2xsIEREUl9TRFJBTV9DRkdfMltEX0lOSVRdIGJpdCB1bnRpbCBhdXRvLWRhdGEgaW5pdCBpcyBkb25lCisJICovCisJd2hpbGUgKGluX2JlMzIoJmRkci0+c2RyYW1fY2ZnXzIpICYgMHgxMCkgeworCQl1ZGVsYXkoMTAwMDApOwkJLyogdGhyb3R0bGUgcG9sbGluZyByYXRlICovCisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L2ZkdC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L2ZkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjNmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvZmR0LmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8ZmR0X3N1cHBvcnQuaD4KKyNpbmNsdWRlIDxhc20vbXAuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK2V4dGVybiB2b2lkIGZ0X2ZpeHVwX251bV9jb3Jlcyh2b2lkICpibG9iKTsKKwordm9pZCBmdF9jcHVfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisjaWZkZWYgQ09ORklHX01QCisJaW50IG9mZjsKKwl1MzIgYm9vdHBnID0gZGV0ZXJtaW5lX21wX2Jvb3RwZygpOworI2VuZGlmCisKKwlkb19maXh1cF9ieV9wcm9wX3UzMihibG9iLCAiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNCwKKwkJCSAgICAgInRpbWViYXNlLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxIC8gNCwgMSk7CisJZG9fZml4dXBfYnlfcHJvcF91MzIoYmxvYiwgImRldmljZV90eXBlIiwgImNwdSIsIDQsCisJCQkgICAgICJidXMtZnJlcXVlbmN5IiwgYmQtPmJpX2J1c2ZyZXEsIDEpOworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LAorCQkJICAgICAiY2xvY2stZnJlcXVlbmN5IiwgYmQtPmJpX2ludGZyZXEsIDEpOworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJzb2MiLCA0LAorCQkJICAgICAiYnVzLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKworI2lmIGRlZmluZWQoQ09ORklHX01QQzg2NDEpCisJZG9fZml4dXBfYnlfY29tcGF0X3UzMihibG9iLCAiZnNsLG1wYzg2NDEtbG9jYWxidXMiLAorCQkJICAgICAgICJidXMtZnJlcXVlbmN5IiwgZ2QtPmxiY19jbGssIDEpOworI2VuZGlmCisJZG9fZml4dXBfYnlfY29tcGF0X3UzMihibG9iLCAiZnNsLGVsYmMiLAorCQkJICAgICAgICJidXMtZnJlcXVlbmN5IiwgZ2QtPmxiY19jbGssIDEpOworCisJZmR0X2ZpeHVwX21lbW9yeShibG9iLCAodTY0KWJkLT5iaV9tZW1zdGFydCwgKHU2NCliZC0+YmlfbWVtc2l6ZSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19IQVNfRVRIMCkgfHwgZGVmaW5lZChDT05GSUdfSEFTX0VUSDEpIFwKKyAgICB8fCBkZWZpbmVkKENPTkZJR19IQVNfRVRIMikgfHwgZGVmaW5lZChDT05GSUdfSEFTX0VUSDMpCisJZmR0X2ZpeHVwX2V0aGVybmV0KGJsb2IpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1lTX05TMTY1NTAKKwlkb19maXh1cF9ieV9jb21wYXRfdTMyKGJsb2IsICJuczE2NTUwIiwKKwkJCSAgICAgICAiY2xvY2stZnJlcXVlbmN5IiwgQ09ORklHX1NZU19OUzE2NTUwX0NMSywgMSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NUAorCS8qIFJlc2VydmUgdGhlIGJvb3QgcGFnZSBzbyBPU2VzIGRvbnQgdXNlIGl0ICovCisJb2ZmID0gZmR0X2FkZF9tZW1fcnN2KGJsb2IsIGJvb3RwZywgKHU2NCk0MDk2KTsKKwlpZiAob2ZmIDwgMCkKKwkJcHJpbnRmKCIlczogJXNcbiIsIF9fRlVOQ1RJT05fXywgZmR0X3N0cmVycm9yKG9mZikpOworI2VuZGlmCisJZnRfZml4dXBfbnVtX2NvcmVzKGJsb2IpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L2ludGVycnVwdHMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4ZmM3MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgKDQ0MCBwb3J0KQorICogU2NvdHQgTWNOdXR0LCBBcnRlc3luIENvbW11bmljYXRpb24gUHJvZHVjcywgc21jbnV0dEBhcnRzeW5jcC5jb20KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDMgTW90b3JvbGEgSW5jLiAoTVBDODV4eCBwb3J0KQorICogWGlhbmdodWEgWGlhbyAoWC5YaWFvQG1vdG9yb2xhLmNvbSkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQsIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuIChNUEM4Nnh4IFBvcnQpCisgKiBKZWZmIEJyb3duCisgKiBTcmlrYW50aCBTcmluaXZhc2FuIChzcmlrYW50aC5zcmluaXZhc2FuQGZyZWVzY2FsZS5jb20pCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzg2eHguaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitpbnQgaW50ZXJydXB0X2luaXRfY3B1KHVuc2lnbmVkIGxvbmcgKmRlY3JlbWVudGVyX2NvdW50KQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBjY3NyX3BpY190ICpwaWMgPSAmaW1tci0+aW1fcGljOworCisJcGljLT5nY3IgPSBNUEM4Nnh4X1BJQ0dDUl9SU1Q7CisJd2hpbGUgKHBpYy0+Z2NyICYgTVBDODZ4eF9QSUNHQ1JfUlNUKQorCQk7CisJcGljLT5nY3IgPSBNUEM4Nnh4X1BJQ0dDUl9NT0RFOworCisJKmRlY3JlbWVudGVyX2NvdW50ID0gZ2V0X3RiY2xrKCkgLyBDT05GSUdfU1lTX0haOworCWRlYnVnKCJpbnRlcnJ1cHQgaW5pdDogdGJjbGsoKSA9ICVkIE1IeiwgZGVjcmVtZW50ZXJfY291bnQgPSAlbGRcbiIsCisJICAgICAgKGdldF90YmNsaygpIC8gMTAwMDAwMCksCisJICAgICAgKmRlY3JlbWVudGVyX2NvdW50KTsKKworI2lmZGVmIENPTkZJR19JTlRFUlJVUFRTCisKKwlwaWMtPmlpdnByMSA9IDB4ODEwMDAxOwkvKiA1MDIyMCBlbmFibGUgbWNtIGludGVycnVwdHMgKi8KKwlkZWJ1ZygiaWl2cHIxQCV4ID0gJXhcbiIsICZwaWMtPmlpdnByMSwgcGljLT5paXZwcjEpOworCisJcGljLT5paXZwcjIgPSAweDgxMDAwMjsJLyogNTAyNDAgZW5hYmxlIGRkciBpbnRlcnJ1cHRzICovCisJZGVidWcoImlpdnByMkAleCA9ICV4XG4iLCAmcGljLT5paXZwcjIsIHBpYy0+aWl2cHIyKTsKKworCXBpYy0+aWl2cHIzID0gMHg4MTAwMDM7CS8qIDUwMjYwIGVuYWJsZSBsYmMgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjNAJXggPSAleFxuIiwgJnBpYy0+aWl2cHIzLCBwaWMtPmlpdnByMyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kxKSB8fCBkZWZpbmVkKENPTkZJR19QQ0lFMSkKKwlwaWMtPmlpdnByOCA9IDB4ODEwMDA4OwkvKiBlbmFibGUgcGNpZTEgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjhAJXggPSAleFxuIiwgJnBpYy0+aWl2cHI4LCBwaWMtPmlpdnByOCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kyKSB8fCBkZWZpbmVkKENPTkZJR19QQ0lFMikKKwlwaWMtPmlpdnByOSA9IDB4ODEwMDA5OwkvKiBlbmFibGUgcGNpZTIgaW50ZXJydXB0cyAqLworCWRlYnVnKCJpaXZwcjlAJXggPSAleFxuIiwgJnBpYy0+aWl2cHI5LCBwaWMtPmlpdnByOSk7CisjZW5kaWYKKworCXBpYy0+Y3RwciA9IDA7CS8qIDQwMDgwIGNsZWFyIGN1cnJlbnQgdGFzayBwcmlvcml0eSByZWdpc3RlciAqLworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHRpbWVyX2ludGVycnVwdCAtIGdldHMgY2FsbGVkIHdoZW4gdGhlIGRlY3JlbWVudGVyIG92ZXJmbG93cywKKyAqIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqIFRyaXZpYWwgaW1wbGVtZW50YXRpb24gLSBubyBuZWVkIHRvIGJlIHJlYWxseSBhY2N1cmF0ZS4KKyAqLwordm9pZCB0aW1lcl9pbnRlcnJ1cHRfY3B1KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworfQorCisvKgorICogSW5zdGFsbCBhbmQgZnJlZSBhIGludGVycnVwdCBoYW5kbGVyLiBOb3QgaW1wbGVtZW50ZWQgeWV0LgorICovCit2b2lkIGlycV9pbnN0YWxsX2hhbmRsZXIoaW50IHZlYywgaW50ZXJydXB0X2hhbmRsZXJfdCAqaGFuZGxlciwgdm9pZCAqYXJnKQoreworfQorCit2b2lkIGlycV9mcmVlX2hhbmRsZXIoaW50IHZlYykKK3sKK30KKworLyoKKyAqIGlycWluZm8gLSBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBQQ0kgZGV2aWNlcyxub3QgaW1wbGVtZW50ZWQuCisgKi8KK2ludCBkb19pcnFpbmZvKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXJldHVybiAwOworfQorCisvKgorICogSGFuZGxlIGV4dGVybmFsIGludGVycnVwdHMKKyAqLwordm9pZCBleHRlcm5hbF9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcHV0cygiZXh0ZXJuYWxfaW50ZXJydXB0IChvb3BzISlcbiIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L21wLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGEwZmFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L21wLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8aW9wb3J0cy5oPgorI2luY2x1ZGUgPGxtYi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tcC5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworaW50IGNwdV9yZXNldChpbnQgbnIpCit7CisJLyogZHVtbXkgZnVuY3Rpb24gc28gY29tbW9uL2NtZF9tcC5jIHdpbGwgYnVpbGQKKwkgKiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGZ1dHVyZSwgd2hlbiBjcHVfcmVsZWFzZSgpCisJICogaXMgc3VwcG9ydGVkLiAgQmUgYXdhcmUgdGhlcmUgbWF5IGJlIGEgc2ltaWxpYXIgYnVnCisJICogYXMgZXhpc3RzIG9uIE1QQzg1eHggdy9pdHMgUElDIGhhdmluZyBhIHRpbWluZyB3aW5kb3cKKwkgKiBhc3NvY2lhdGVkIHRvIHJlc2V0dGluZyB0aGUgY29yZSAqLworCXJldHVybiAxOworfQorCitpbnQgY3B1X3N0YXR1cyhpbnQgbnIpCit7CisJLyogZHVtbXkgZnVuY3Rpb24gc28gY29tbW9uL2NtZF9tcC5jIHdpbGwgYnVpbGQgKi8KKwlyZXR1cm4gMDsKK30KKworaW50IGNwdV9kaXNhYmxlKGludCBucikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfQ0NTUkJBUjsKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKKworCXN3aXRjaCAobnIpIHsKKwljYXNlIDA6CisJCXNldGJpdHNfYmUzMigmZ3VyLT5kZXZkaXNyLCBNUEM4Nnh4X0RFVkRJU1JfQ1BVMCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2V0Yml0c19iZTMyKCZndXItPmRldmRpc3IsIE1QQzg2eHhfREVWRElTUl9DUFUxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJJbnZhbGlkIGNwdSBudW1iZXIgZm9yIGRpc2FibGUgJWRcbiIsIG5yKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBjcHVfcmVsZWFzZShpbnQgbnIsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJLyogZHVtbXkgZnVuY3Rpb24gc28gY29tbW9uL2NtZF9tcC5jIHdpbGwgYnVpbGQKKwkgKiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGZ1dHVyZSAqLworCXJldHVybiAxOworfQorCit1MzIgZGV0ZXJtaW5lX21wX2Jvb3RwZyh2b2lkKQoreworCS8qIGlmIHdlIGhhdmUgNEcgb3IgbW9yZSBvZiBtZW1vcnksIHB1dCB0aGUgYm9vdCBwYWdlIGF0IDRHYi0xTSAqLworCWlmICgodTY0KWdkLT5yYW1fc2l6ZSA+IDB4ZmZmZmYwMDApCisJCXJldHVybiAoMHhmZmYwMDAwMCk7CisKKwlyZXR1cm4gKGdkLT5yYW1fc2l6ZSAtICgxMDI0ICogMTAyNCkpOworfQorCit2b2lkIGNwdV9tcF9sbWJfcmVzZXJ2ZShzdHJ1Y3QgbG1iICpsbWIpCit7CisJdTMyIGJvb3RwZyA9IGRldGVybWluZV9tcF9ib290cGcoKTsKKworCS8qIHRlbGwgdS1ib290IHdlIHN0b2xlIGEgcGFnZSAqLworCWxtYl9yZXNlcnZlKGxtYiwgYm9vdHBnLCA0MDk2KTsKK30KKworLyoKKyAqIENvcHkgdGhlIGNvZGUgZm9yIG90aGVyIGNwdXMgdG8gZXhlY3V0ZSBpbnRvIGFuCisgKiBhbGlnbmVkIGxvY2F0aW9uIGFjY2Vzc2libGUgdmlhIEJQVFIKKyAqLwordm9pZCBzZXR1cF9tcCh2b2lkKQoreworCWV4dGVybiB1bG9uZyBfX3NlY29uZGFyeV9zdGFydF9wYWdlOworCXVsb25nIGZpeHVwID0gKHVsb25nKSZfX3NlY29uZGFyeV9zdGFydF9wYWdlOworCXUzMiBib290cGcgPSBkZXRlcm1pbmVfbXBfYm9vdHBnKCk7CisJdTMyIGJvb3RwZ192YTsKKworCWlmIChib290cGcgPj0gQ09ORklHX1NZU19NQVhfRERSX0JBVF9TSVpFKSB7CisJCS8qIFdlJ3JlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBERFIgbWFwcGluZywgc2V0IHVwIEJBVCAgKi8KKwkJd3JpdGVfYmF0KERCQVQ3LCBDT05GSUdfU1lTX1NDUkFUQ0hfVkEgfCBCQVRVX0JMXzEyOEsgfAorCQkJICBCQVRVX1ZTIHwgQkFUVV9WUCwKKwkJCSAgYm9vdHBnIHwgQkFUTF9QUF9SVyB8IEJBVExfTUVNQ09IRVJFTkNFKTsKKwkJYm9vdHBnX3ZhID0gQ09ORklHX1NZU19TQ1JBVENIX1ZBOworCX0gZWxzZSB7CisJCWJvb3RwZ192YSA9IGJvb3RwZzsKKwl9CisKKwltZW1jcHkoKHZvaWQgKilib290cGdfdmEsICh2b2lkICopZml4dXAsIDQwOTYpOworCWZsdXNoX2NhY2hlKGJvb3RwZ192YSwgNDA5Nik7CisKKwkvKiByZW1vdmUgdGhlIHRlbXBvcmFyeSBCQVQgbWFwcGluZyAqLworCWlmIChib290cGcgPj0gQ09ORklHX1NZU19NQVhfRERSX0JBVF9TSVpFKQorCQl3cml0ZV9iYXQoREJBVDcsIDAsIDApOworCisJLyogSWYgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIGJvb3RwZyBpcyBub3QgYXQgZmZmMDAwMDAsIHNldCBCUFRSICovCisJaWYgKGJvb3RwZyAhPSAweGZmZjAwMDAwKQorCQlvdXRfYmUzMigodWludCAqKShDT05GSUdfU1lTX0NDU1JCQVIgKyAweDIwKSwgMHg4MDAwMDAwMCB8CisJCQkgKGJvb3RwZyA+PiAxMikpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L3JlbGVhc2UuUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9yZWxlYXNlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhNmYyYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9yZWxlYXNlLlMKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNCwgMjAwNywgMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIFNyaWthbnRoIFNyaW5pdmFzYW4gPHNyaWthbnRoLnNyaW5pdmFhbkBmcmVlc2NhbGUuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bXBjODZ4eC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisvKiBJZiB0aGlzIGlzIGEgbXVsdGktY3B1IHN5c3RlbSB0aGVuIHdlIG5lZWQgdG8gaGFuZGxlIHRoZQorICogMm5kIGNwdS4gIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIDJuZCBjcHUgaXMgYmVpbmcKKyAqIGhlbGQgaW4gYm9vdCBob2xkb2ZmIG1vZGUgdW50aWwgdGhlIDFzdCBjcHUgdW5sb2NrcyBpdAorICogZnJvbSBMaW51eC4JV2UnbGwgZG8gc29tZSBiYXNpYyBjcHUgaW5pdCBhbmQgdGhlbiBwYXNzCisgKiBpdCB0byB0aGUgTGludXggUmVzZXQgVmVjdG9yLgorICogU3JpOgkgTXVjaCBvZiB0aGlzIGluaXRpYWxpemF0aW9uIGlzIG5vdCByZXF1aXJlZC4gTGludXgKKyAqIHJld3JpdGVzIHRoZSBiYXRzLCBhbmQgdGhlIHNwcnMgYW5kIGFsc28gZW5hYmxlcyB0aGUgTDEgY2FjaGUuCisgKgorICogQ29yZSAwIG11c3QgY29weSB0aGlzIHRvIGEgMU0gYWxpZ25lZCByZWdpb24gYW5kIHNldCBCUFRSCisgKiB0byBwb2ludCB0byBpdC4KKyAqLworCS5hbGlnbiAxMgorLmdsb2JsIF9fc2Vjb25kYXJ5X3N0YXJ0X3BhZ2UKK19fc2Vjb25kYXJ5X3N0YXJ0X3BhZ2U6CisJLnNwYWNlIDB4MTAwCS8qIHNwYWNlIG92ZXIgdG8gcmVzZXQgdmVjdG9yIGxvYyAqLworCW1mc3ByCXIwLCBNU1NDUjAKKwlhbmRpLglyMCwgcjAsIDB4MDAyMAorCXJsd2lubQlyMCxyMCwyNywzMSwzMQorCW10c3ByCVBJUiwgcjAKKworCS8qIEludmFsaWRhdGUgQkFUcyAqLworCWxpCXIwLCAwCisJbXRzcHIJSUJBVDBVLCByMAorCW10c3ByCUlCQVQxVSwgcjAKKwltdHNwcglJQkFUMlUsIHIwCisJbXRzcHIJSUJBVDNVLCByMAorCW10c3ByCUlCQVQ0VSwgcjAKKwltdHNwcglJQkFUNVUsIHIwCisJbXRzcHIJSUJBVDZVLCByMAorCW10c3ByCUlCQVQ3VSwgcjAKKwlpc3luYworCW10c3ByCURCQVQwVSwgcjAKKwltdHNwcglEQkFUMVUsIHIwCisJbXRzcHIJREJBVDJVLCByMAorCW10c3ByCURCQVQzVSwgcjAKKwltdHNwcglEQkFUNFUsIHIwCisJbXRzcHIJREJBVDVVLCByMAorCW10c3ByCURCQVQ2VSwgcjAKKwltdHNwcglEQkFUN1UsIHIwCisJaXN5bmMKKwlzeW5jCisKKwkvKiBlbmFibGUgZXh0ZW5kZWQgYWRkcmVzc2luZyAqLworCW1mc3ByCXIwLCBISUQwCisJbGlzCXIwLCAoSElEMF9ISUdIX0JBVF9FTiB8IEhJRDBfWEJTRU4gfCBISUQwX1hBRU4pQGgKKwlvcmkJcjAsIHIwLCAoSElEMF9ISUdIX0JBVF9FTiB8IEhJRDBfWEJTRU4gfCBISUQwX1hBRU4pQGwKKwltdHNwcglISUQwLCByMAorCXN5bmMKKwlpc3luYworCisjaWZkZWYgQ09ORklHX1NZU19MMgorCS8qIGluaXQgdGhlIEwyIGNhY2hlICovCisJYWRkaXMJcjMsIHIwLCBMMl9JTklUQGgKKwlvcmkJcjMsIHIzLCBMMl9JTklUQGwKKwlzeW5jCisJbXRzcHIJbDJjciwgcjMKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCWRzc2FsbAorI2VuZGlmCisJLyogaW52YWxpZGF0ZSB0aGUgTDIgY2FjaGUgKi8KKwltZnNwcglyMywgbDJjcgorCXJsd2lubS4JcjMsIHIzLCAwLCAwLCAwCisJYmVxCTFmCisKKwltZnNwcglyMywgbDJjcgorCXJsd2lubQlyMywgcjMsIDAsIDEsIDMxCisKKyNpZmRlZglDT05GSUdfQUxUSVZFQworCWRzc2FsbAorI2VuZGlmCisJc3luYworCW10c3ByCWwyY3IsIHIzCisJc3luYworMToJbWZzcHIJcjMsIGwyY3IKKwlvcmlzCXIzLCByMywgTDJDUl9MMklAaAorCW10c3ByCWwyY3IsIHIzCisKK2ludmwyOgorCW1mc3ByCXIzLCBsMmNyCisJYW5kaXMuCXIzLCByMywgTDJDUl9MMklAaAorCWJuZQlpbnZsMgorCXN5bmMKKyNlbmRpZgorCisJLyogZW5hYmxlIGFuZCBpbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlICovCisJbWZzcHIJcjMsIEhJRDAKKwlsaQlyNSwgSElEMF9EQ0ZJfEhJRDBfRExPQ0sKKwlhbmRjCXIzLCByMywgcjUKKwltdHNwcglISUQwLCByMwkJLyogbm8gaW52YWxpZGF0ZSwgdW5sb2NrICovCisJb3JpCXIzLCByMywgSElEMF9EQ0UKKwlvcmkJcjUsIHIzLCBISUQwX0RDRkkKKwltdHNwcglISUQwLCByNQkJLyogZW5hYmxlICsgaW52YWxpZGF0ZSAqLworCW10c3ByCUhJRDAsIHIzCQkvKiBlbmFibGUgKi8KKwlzeW5jCisjaWZkZWYgQ09ORklHX1NZU19MMgorCXN5bmMKKwlsaXMJcjMsIEwyX0VOQUJMRUBoCisJb3JpCXIzLCByMywgTDJfRU5BQkxFQGwKKwltdHNwcglsMmNyLCByMworCWlzeW5jCisJc3luYworI2VuZGlmCisKKwkvKiBlbmFibGUgYW5kIGludmFsaWRhdGUgdGhlIGluc3RydWN0aW9uIGNhY2hlKi8KKwltZnNwcglyMywgSElEMAorCWxpCXI1LCBISUQwX0lDRkl8SElEMF9JTE9DSworCWFuZGMJcjMsIHIzLCByNQorCW9yaQlyMywgcjMsIEhJRDBfSUNFCisJb3JpCXI1LCByMywgSElEMF9JQ0ZJCisJbXRzcHIJSElEMCwgcjUKKwltdHNwcglISUQwLCByMworCWlzeW5jCisJc3luYworCisJLyogVEJFTiBpbiBISUQwICovCisJbWZzcHIJcjQsIEhJRDAKKwlvcmlzCXI0LCByNCwgMHgwNDAwCisJbXRzcHIJSElEMCwgcjQKKwlzeW5jCisJaXN5bmMKKworCS8qIE1DUHxTWU5DQkV8QUJFIGluIEhJRDEgKi8KKwltZnNwcglyNCwgSElEMQorCW9yaXMJcjQsIHI0LCAweDgwMDAKKwlvcmkJcjQsIHI0LCAweDBDMDAKKwltdHNwcglISUQxLCByNAorCXN5bmMKKwlpc3luYworCisJbGlzCXIzLCBDT05GSUdfTElOVVhfUkVTRVRfVkVDQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfTElOVVhfUkVTRVRfVkVDQGwKKwltdGxyCXIzCisJYmxyCisKKwkvKiBOZXZlciBSZXR1cm5zLCBSdW5uaW5nIGluIExpbnV4IE5vdyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L3NwZWVkLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGEzNDc5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L3NwZWVkLmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIEplZmYgQnJvd24KKyAqIFNyaWthbnRoIFNyaW5pdmFzYW4gKHNyaWthbnRoLnNyaW5pdmFzYW5AZnJlZXNjYWxlLmNvbSkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODZ4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qIHVzZWQgaW4gc29tZSBkZWZpbnRpaW9ucyBvZiBDT05GSUdfU1lTX0NMS19GUkVRICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfYm9hcmRfc3lzX2Nsayh1bnNpZ25lZCBsb25nIGR1bW15KTsKKwordm9pZCBnZXRfc3lzX2luZm8oc3lzX2luZm9fdCAqc3lzSW5mbykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBjY3NyX2d1cl90ICpndXIgPSAmaW1tYXAtPmltX2d1cjsKKwl1aW50IHBsYXRfcmF0aW8sIGU2MDBfcmF0aW87CisJdWludCBsY3JyX2RpdjsKKworCXBsYXRfcmF0aW8gPSAoZ3VyLT5wb3JwbGxzcikgJiAweDAwMDAwMDNlOworCXBsYXRfcmF0aW8gPj49IDE7CisKKwlzd2l0Y2ggKHBsYXRfcmF0aW8pIHsKKwljYXNlIDB4MDoKKwkJc3lzSW5mby0+ZnJlcVN5c3RlbUJ1cyA9IDE2ICogQ09ORklHX1NZU19DTEtfRlJFUTsKKwkJYnJlYWs7CisJY2FzZSAweDAyOgorCWNhc2UgMHgwMzoKKwljYXNlIDB4MDQ6CisJY2FzZSAweDA1OgorCWNhc2UgMHgwNjoKKwljYXNlIDB4MDg6CisJY2FzZSAweDA5OgorCWNhc2UgMHgwYToKKwljYXNlIDB4MGM6CisJY2FzZSAweDEwOgorCQlzeXNJbmZvLT5mcmVxU3lzdGVtQnVzID0gcGxhdF9yYXRpbyAqIENPTkZJR19TWVNfQ0xLX0ZSRVE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN5c0luZm8tPmZyZXFTeXN0ZW1CdXMgPSAwOworCQlicmVhazsKKwl9CisKKwllNjAwX3JhdGlvID0gKGd1ci0+cG9ycGxsc3IpICYgMHgwMDNmMDAwMDsKKwllNjAwX3JhdGlvID4+PSAxNjsKKworCXN3aXRjaCAoZTYwMF9yYXRpbykgeworCWNhc2UgMHgxMDoKKwkJc3lzSW5mby0+ZnJlcVByb2Nlc3NvciA9IDIgKiBzeXNJbmZvLT5mcmVxU3lzdGVtQnVzOworCQlicmVhazsKKwljYXNlIDB4MTk6CisJCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSA1ICogc3lzSW5mby0+ZnJlcVN5c3RlbUJ1cyAvIDI7CisJCWJyZWFrOworCWNhc2UgMHgyMDoKKwkJc3lzSW5mby0+ZnJlcVByb2Nlc3NvciA9IDMgKiBzeXNJbmZvLT5mcmVxU3lzdGVtQnVzOworCQlicmVhazsKKwljYXNlIDB4Mzk6CisJCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSA3ICogc3lzSW5mby0+ZnJlcVN5c3RlbUJ1cyAvIDI7CisJCWJyZWFrOworCWNhc2UgMHgyODoKKwkJc3lzSW5mby0+ZnJlcVByb2Nlc3NvciA9IDQgKiBzeXNJbmZvLT5mcmVxU3lzdGVtQnVzOworCQlicmVhazsKKwljYXNlIDB4MWQ6CisJCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSA5ICogc3lzSW5mby0+ZnJlcVN5c3RlbUJ1cyAvIDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSBlNjAwX3JhdGlvICsgc3lzSW5mby0+ZnJlcVN5c3RlbUJ1czsKKwkJYnJlYWs7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0xCQ19MQ1JSKQorCS8qIFdlIHdpbGwgcHJvZ3JhbSBMQ1JSIHRvIHRoaXMgdmFsdWUgbGF0ZXIgKi8KKwlsY3JyX2RpdiA9IENPTkZJR19TWVNfTEJDX0xDUlIgJiBMQ1JSX0NMS0RJVjsKKyNlbHNlCisJeworCQl2b2xhdGlsZSBjY3NyX2xiY190ICpsYmMgPSAmaW1tYXAtPmltX2xiYzsKKwkJbGNycl9kaXYgPSBpbl9iZTMyKCZsYmMtPmxjcnIpICYgTENSUl9DTEtESVY7CisJfQorI2VuZGlmCisJaWYgKGxjcnJfZGl2ID09IDIgfHwgbGNycl9kaXYgPT0gNCB8fCBsY3JyX2RpdiA9PSA4KSB7CisJCXN5c0luZm8tPmZyZXFMb2NhbEJ1cyA9IHN5c0luZm8tPmZyZXFTeXN0ZW1CdXMgLyAobGNycl9kaXYgKiAyKTsKKwl9IGVsc2UgeworCQkvKiBJbiBjYXNlIGFueW9uZSBjYXJlcyB3aGF0IHRoZSB1bmtub3duIHZhbHVlIGlzICovCisJCXN5c0luZm8tPmZyZXFMb2NhbEJ1cyA9IGxjcnJfZGl2OworCX0KK30KKworCisvKgorICogTWVhc3VyZSBDUFUgY2xvY2sgc3BlZWQgKGNvcmUgY2xvY2sgR0NMSzEsIEdDTEsyKQorICogKEFwcHJveC4gR0NMSyBmcmVxdWVuY3kgaW4gSHopCisgKi8KKworaW50IGdldF9jbG9ja3Modm9pZCkKK3sKKwlzeXNfaW5mb190IHN5c19pbmZvOworCisJZ2V0X3N5c19pbmZvKCZzeXNfaW5mbyk7CisJZ2QtPmNwdV9jbGsgPSBzeXNfaW5mby5mcmVxUHJvY2Vzc29yOworCWdkLT5idXNfY2xrID0gc3lzX2luZm8uZnJlcVN5c3RlbUJ1czsKKwlnZC0+bGJjX2NsayA9IHN5c19pbmZvLmZyZXFMb2NhbEJ1czsKKworCS8qCisJICogVGhlIGJhc2UgY2xvY2sgZm9yIEkyQyBkZXBlbmRzIG9uIHRoZSBhY3R1YWwgU09DLiAgVW5mb3J0dW5hdGVseSwKKwkgKiB0aGVyZSBpcyBubyBwYXR0ZXJuIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY3ksIHNvCisJICogdGhlIG9ubHkgY2hvaWNlIGlzIHRvIGxvb2sgdXAgdGhlIGFjdHVhbCBTT0MgbnVtYmVyIGFuZCB1c2UgdGhlIHZhbHVlCisJICogZm9yIHRoYXQgU09DLiBUaGlzIGluZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gYXBwbGljYXRpb24gbm90ZQorCSAqIEFOMjkxOS4KKwkgKi8KKyNpZmRlZiBDT05GSUdfTVBDODYxMAorCWdkLT5pMmMxX2NsayA9IHN5c19pbmZvLmZyZXFTeXN0ZW1CdXM7CisjZWxzZQorCWdkLT5pMmMxX2NsayA9IHN5c19pbmZvLmZyZXFTeXN0ZW1CdXMgLyAyOworI2VuZGlmCisJZ2QtPmkyYzJfY2xrID0gZ2QtPmkyYzFfY2xrOworCisJaWYgKGdkLT5jcHVfY2xrICE9IDApCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIGdldF9idXNfZnJlcQorICoJUmV0dXJuIHN5c3RlbSBidXMgZnJlcSBpbiBIegorICovCisKK3Vsb25nIGdldF9idXNfZnJlcSh1bG9uZyBkdW1teSkKK3sKKwl1bG9uZyB2YWw7CisJc3lzX2luZm9fdCBzeXNfaW5mbzsKKworCWdldF9zeXNfaW5mbygmc3lzX2luZm8pOworCXZhbCA9IHN5c19pbmZvLmZyZXFTeXN0ZW1CdXM7CisKKwlyZXR1cm4gdmFsOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L3N0YXJ0LlMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDFlNGNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L3N0YXJ0LlMKQEAgLTAsMCArMSw5NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNCwgMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3Rvci4KKyAqIFNyaWthbnRoIFNyaW5pdmFzYW4gPHNyaWthbnRoLnNyaW5pdmFhbkBmcmVlc2NhbGUuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qICBVLUJvb3QgLSBTdGFydHVwIENvZGUgZm9yIDg2eHggUG93ZXJQQyBiYXNlZCBFbWJlZGRlZCBCb2FyZHMKKyAqCisgKgorICogIFRoZSBwcm9jZXNzb3Igc3RhcnRzIGF0IDB4ZmZmMDAxMDAgYW5kIHRoZSBjb2RlIGlzIGV4ZWN1dGVkCisgKiAgZnJvbSBmbGFzaC4gVGhlIGNvZGUgaXMgb3JnYW5pemVkIHRvIGJlIGF0IGFuIG90aGVyIGFkZHJlc3MKKyAqICBpbiBtZW1vcnksIGJ1dCBhcyBsb25nIHdlIGRvbid0IGp1bXAgYXJvdW5kIGJlZm9yZSByZWxvY2F0aW5nLgorICogIGJvYXJkX2luaXQgbGllcyBhdCBhIHF1aXRlIGhpZ2ggYWRkcmVzcyBhbmQgd2hlbiB0aGUgY3B1IGhhcworICogIGp1bXBlZCB0aGVyZSwgZXZlcnl0aGluZyBpcyBvay4KKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzg2eHguaD4KKyNpbmNsdWRlIDx0aW1lc3RhbXAuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKworI2lmbmRlZglDT05GSUdfSURFTlRfU1RSSU5HCisjZGVmaW5lIENPTkZJR19JREVOVF9TVFJJTkcgIiIKKyNlbmRpZgorCisvKgorICogTmVlZCBNU1JfRFIgfCBNU1JfSVIgZW5hYmxlZCB0byBhY2Nlc3MgSS9PIChwcmludGYpIGluIGV4Y2VwdGlvbnMKKyAqLworCisvKgorICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQorICoKKyAqIFVzZSByMTIgdG8gYWNjZXNzIHRoZSBHT1QKKyAqLworCVNUQVJUX0dPVAorCUdPVF9FTlRSWShfR09UMl9UQUJMRV8pCisJR09UX0VOVFJZKF9GSVhVUF9UQUJMRV8pCisKKwlHT1RfRU5UUlkoX3N0YXJ0KQorCUdPVF9FTlRSWShfc3RhcnRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkoX2VuZF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWSh0cmFuc2Zlcl90b19oYW5kbGVyKQorCisJR09UX0VOVFJZKF9faW5pdF9lbmQpCisJR09UX0VOVFJZKF9lbmQpCisJR09UX0VOVFJZKF9fYnNzX3N0YXJ0KQorCUVORF9HT1QKKworLyoKKyAqIHIzIC0gMXN0IGFyZyB0byBib2FyZF9pbml0KCk6IElNTVAgcG9pbnRlcgorICogcjQgLSAybmQgYXJnIHRvIGJvYXJkX2luaXQoKTogYm9vdCBmbGFnCisgKi8KKwkudGV4dAorCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQm9vdCBNYWdpYyBOdW1iZXIgKi8KKwkuZ2xvYmwJdmVyc2lvbl9zdHJpbmcKK3ZlcnNpb25fc3RyaW5nOgorCS5hc2NpaQlVX0JPT1RfVkVSU0lPTgorCS5hc2NpaQkiICgiLCBVX0JPT1RfREFURSwgIiAtICIsIFVfQk9PVF9USU1FLCAiKSIKKwkuYXNjaWkJQ09ORklHX0lERU5UX1NUUklORywgIlwwIgorCisJLiA9IEVYQ19PRkZfU1lTX1JFU0VUCisJLmdsb2JsCV9zdGFydAorX3N0YXJ0OgorCWxpCXIyMSwgQk9PVEZMQUdfQ09MRAkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCAqLworCWIJYm9vdF9jb2xkCisJc3luYworCisJLiA9IEVYQ19PRkZfU1lTX1JFU0VUICsgMHgxMAorCisJLmdsb2JsCV9zdGFydF93YXJtCitfc3RhcnRfd2FybToKKwlsaQlyMjEsIEJPT1RGTEFHX1dBUk0JLyogU29mdHdhcmUgcmVib290ICovCisJYglib290X3dhcm0KKwlzeW5jCisKKwkvKiB0aGUgYm9vdCBjb2RlIGlzIGxvY2F0ZWQgYmVsb3cgdGhlIGV4Y2VwdGlvbiB0YWJsZSAqLworCisJLmdsb2JsCV9zdGFydF9vZl92ZWN0b3JzCitfc3RhcnRfb2ZfdmVjdG9yczoKKworLyogTWFjaGluZSBjaGVjayAqLworCVNURF9FWENFUFRJT04oMHgyMDAsIE1hY2hpbmVDaGVjaywgTWFjaGluZUNoZWNrRXhjZXB0aW9uKQorCisvKiBEYXRhIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHgzMDAsIERhdGFTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBJbnN0cnVjdGlvbiBTdG9yYWdlIGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4NDAwLCBJbnN0U3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogRXh0ZXJuYWwgSW50ZXJydXB0IGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4NTAwLCBFeHRJbnRlcnJ1cHQsIGV4dGVybmFsX2ludGVycnVwdCkKKworLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KKwkuID0gMHg2MDAKK0FsaWdubWVudDoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJbWZzcHIJcjQsREFSCisJc3R3CXI0LF9EQVIocjIxKQorCW1mc3ByCXI1LERTSVNSCisJc3R3CXI1LF9EU0lTUihyMjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKEFsaWdubWVudCwgQWxpZ25tZW50RXhjZXB0aW9uLCBNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLworCS4gPSAweDcwMAorUHJvZ3JhbUNoZWNrOgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRVhDX1hGRVJfVEVNUExBVEUoUHJvZ3JhbUNoZWNrLCBQcm9ncmFtQ2hlY2tFeGNlcHRpb24sCisJCU1TUl9LRVJORUwsIENPUFlfRUUpCisKKwlTVERfRVhDRVBUSU9OKDB4ODAwLCBGUFVuYXZhaWxhYmxlLCBVbmtub3duRXhjZXB0aW9uKQorCisJLyogSSBndWVzcyB3ZSBjb3VsZCBpbXBsZW1lbnQgZGVjcmVtZW50ZXIsIGFuZCBtYXkgaGF2ZQorCSAqIHRvIHNvbWVkYXkgZm9yIHRpbWVrZWVwaW5nLgorCSAqLworCVNURF9FWENFUFRJT04oMHg5MDAsIERlY3JlbWVudGVyLCB0aW1lcl9pbnRlcnJ1cHQpCisJU1REX0VYQ0VQVElPTigweGEwMCwgVHJhcF8wYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4YjAwLCBUcmFwXzBiLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhjMDAsIFN5c3RlbUNhbGwsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGQwMCwgU2luZ2xlU3RlcCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4ZTAwLCBUcmFwXzBlLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhmMDAsIFRyYXBfMGYsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDEwMDAsIFNvZnRFbXUsIFNvZnRFbXVFeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDExMDAsIEluc3RydWN0aW9uVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTIwMCwgRGF0YVRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDEzMDAsIEluc3RydWN0aW9uVExCRXJyb3IsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE0MDAsIERhdGFUTEJFcnJvciwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTUwMCwgUmVzZXJ2ZWQ1LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxNjAwLCBSZXNlcnZlZDYsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE3MDAsIFJlc2VydmVkNywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTgwMCwgUmVzZXJ2ZWQ4LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxOTAwLCBSZXNlcnZlZDksIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFhMDAsIFJlc2VydmVkQSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWIwMCwgUmVzZXJ2ZWRCLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxYzAwLCBEYXRhQnJlYWtwb2ludCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWQwMCwgSW5zdHJ1Y3Rpb25CcmVha3BvaW50LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxZTAwLCBQZXJpcGhlcmFsQnJlYWtwb2ludCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWYwMCwgRGV2UG9ydEJyZWFrcG9pbnQsIFVua25vd25FeGNlcHRpb24pCisKKwkuZ2xvYmwJX2VuZF9vZl92ZWN0b3JzCitfZW5kX29mX3ZlY3RvcnM6CisKKwkuID0gMHgyMDAwCisKK2Jvb3RfY29sZDoKK2Jvb3Rfd2FybToKKwkvKgorCSAqIE5PVEU6IE9ubHkgQ3B1IDAgd2lsbCBldmVyIGNvbWUgaGVyZS4gIE90aGVyIGNvcmVzIGdvIHRvIGFuCisJICogYWRkcmVzcyBzcGVjaWZpZWQgYnkgdGhlIEJQVFIKKwkgKi8KKzE6CisjaWZkZWYgQ09ORklHX1NZU19SQU1CT09UCisJLyogZGlzYWJsZSBldmVyeXRoaW5nICovCisJbGkJcjAsIDAKKwltdHNwcglISUQwLCByMAorCXN5bmMKKwltdG1zcgkwCisjZW5kaWYKKworCS8qIEludmFsaWRhdGUgQkFUcyAqLworCWJsCWludmFsaWRhdGVfYmF0cworCXN5bmMKKwkvKiBJbnZhbGlkYXRlIGFsbCBvZiBUTEIgYmVmb3JlIE1NVSB0dXJuIG9uICovCisJYmwgICAgICBjbGVhcl90bGJzCisJc3luYworCisjaWZkZWYgQ09ORklHX1NZU19MMgorCS8qIGluaXQgdGhlIEwyIGNhY2hlICovCisJbGlzCXIzLCBMMl9JTklUQGgKKwlvcmkJcjMsIHIzLCBMMl9JTklUQGwKKwltdHNwcglsMmNyLCByMworCS8qIGludmFsaWRhdGUgdGhlIEwyIGNhY2hlICovCisJYmwJbDJjYWNoZV9pbnZhbGlkYXRlCisJc3luYworI2VuZGlmCisKKwkvKgorCSAqIENhbGN1bGF0ZSBhYnNvbHV0ZSBhZGRyZXNzIGluIEZMQVNIIGFuZCBqdW1wIHRoZXJlCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpcwlyMywgQ09ORklHX1NZU19NT05JVE9SX0JBU0VfRUFSTFlAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFX0VBUkxZQGwKKwlhZGRpCXIzLCByMywgaW5fZmxhc2ggLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCW10bHIJcjMKKwlibHIKKworaW5fZmxhc2g6CisJLyogbGV0IHRoZSBDLWNvZGUgc2V0IHVwIHRoZSByZXN0CQkJKi8KKwkvKgkJCQkJCQkqLworCS8qIEJlIGNhcmVmdWwgdG8ga2VlcCBjb2RlIHJlbG9jYXRhYmxlICEJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qIHBlcmZvcm0gbG93LWxldmVsIGluaXQgKi8KKworCS8qIGVuYWJsZSBleHRlbmRlZCBhZGRyZXNzaW5nICovCisJYmwJZW5hYmxlX2V4dF9hZGRyCisKKwkvKiBzZXR1cCB0aGUgYmF0cyAqLworCWJsCWVhcmx5X2JhdHMKKworCS8qCisJICogQ2FjaGUgbXVzdCBiZSBlbmFibGVkIGhlcmUgZm9yIHN0YWNrLWluLWNhY2hlIHRyaWNrLgorCSAqIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBlbmFibGUgdGhlIEJBVFMuCisJICogQ2FjaGUgc2hvdWxkIGJlIHR1cm5lZCBvbiBhZnRlciBCQVRzLCBzaW5jZSBieSBkZWZhdWx0CisJICogZXZlcnl0aGluZyBpcyB3cml0ZS10aHJvdWdoLgorCSAqLworCisJLyogZW5hYmxlIGFkZHJlc3MgdHJhbnNsYXRpb24gKi8KKwltZm1zcglyNQorCW9yaQlyNSwgcjUsIChNU1JfSVIgfCBNU1JfRFIpCisJbGlzCXIzLGFkZHJfdHJhbnNfZW5hYmxlZEBoCisJb3JpCXIzLCByMywgYWRkcl90cmFuc19lbmFibGVkQGwKKwltdHNwcglTUFJOX1NSUjAscjMKKwltdHNwcglTUFJOX1NSUjEscjUKKwlyZmkKKworYWRkcl90cmFuc19lbmFibGVkOgorCS8qIGVuYWJsZSBhbmQgaW52YWxpZGF0ZSB0aGUgZGF0YSBjYWNoZSAqLworLyoJYmwJbDFkY2FjaGVfZW5hYmxlICovCisJYmwJZGNhY2hlX2VuYWJsZQorCXN5bmMKKworI2lmIDEKKwlibAlpY2FjaGVfZW5hYmxlCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TWVNfSU5JVF9SQU1fTE9DSworCWJsCWxvY2tfcmFtX2luX2NhY2hlCisJc3luYworI2VuZGlmCisKKyNpZiAoQ09ORklHX1NZU19DQ1NSQkFSX0RFRkFVTFQgIT0gQ09ORklHX1NZU19DQ1NSQkFSKQorCWJsICAgICAgc2V0dXBfY2NzcmJhcgorI2VuZGlmCisKKwkvKiBzZXQgdXAgdGhlIHN0YWNrIHBvaW50ZXIgaW4gb3VyIG5ld2x5IGNyZWF0ZWQKKwkgKiBjYWNoZS1yYW0gKHIxKSAqLworCWxpcwlyMSwgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfR0JMX0RBVEFfT0ZGU0VUKUBoCisJb3JpCXIxLCByMSwgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfR0JMX0RBVEFfT0ZGU0VUKUBsCisKKwlsaQlyMCwgMAkJLyogTWFrZSByb29tIGZvciBzdGFjayBmcmFtZSBoZWFkZXIgYW5kICovCisJc3R3dQlyMCwgLTQocjEpCS8qIGNsZWFyIGZpbmFsIHN0YWNrIGZyYW1lIHNvIHRoYXQJKi8KKwlzdHd1CXIwLCAtNChyMSkJLyogc3RhY2sgYmFja3RyYWNlcyB0ZXJtaW5hdGUgY2xlYW5seQkqLworCisJR0VUX0dPVAkJCS8qIGluaXRpYWxpemUgR09UIGFjY2VzcwkqLworCisJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlCSAgIChmcm9tIEZsYXNoKSAqLworCWJsCWNwdV9pbml0X2YKKwlzeW5jCisKKyNpZmRlZglSVU5fRElBRworCisJLyogTG9hZCBQWF9BVVggcmVnaXN0ZXIgYWRkcmVzcyBpbiByNCAqLworCWxpcwlyNCwgUElYSVNfQkFTRUBoCisJb3JpCXI0LCByNCwgMHg2CisJLyogTG9hZCBjb250ZW50cyBvZiBQWF9BVVggaW4gcjMgYml0cyAyNCB0byAzMSovCisJbGJ6CXIzLCAwKHI0KQorCisJLyogTWFzayBhbmQgb2J0YWluIHRoZSBiaXQgaW4gcjMgKi8KKwlybHdpbm0uIHIzLCByMywgMCwgMjQsIDI0CisJLyogSWYgbm90IHplcm8sIGp1bXAgYW5kIGNvbnRpbnVlIHdpdGggdS1ib290ICovCisJYm5lCWRpYWdfZG9uZQorCisJLyogTG9hZCBiYWNrIGNvbnRlbnRzIG9mIFBYX0FVWCBpbiByMyBiaXRzIDI0IHRvIDMxICovCisJbGJ6CXIzLCAwKHI0KQorCS8qIFNldCB0aGUgTVNCIG9mIHRoZSByZWdpc3RlciB2YWx1ZSAqLworCW9yaQlyMywgcjMsIDB4ODAKKwkvKiBXcml0ZSB2YWx1ZSBpbiByMyBiYWNrIHRvIFBYX0FVWCAqLworCXN0YglyMywgMChyNCkKKworCS8qIEdldCB0aGUgYWRkcmVzcyB0byBqdW1wIHRvIGluIHIzKi8KKwlsaXMJcjMsIENPTkZJR19TWVNfRElBR19BRERSQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0RJQUdfQUREUkBsCisKKwkvKiBMb2FkIHRoZSBMUiB3aXRoIHRoZSBicmFuY2ggYWRkcmVzcyAqLworCW10bHIJcjMKKworCS8qIEJyYW5jaCB0byBkaWFnbm9zdGljICovCisJYmxyCisKK2RpYWdfZG9uZToKKyNlbmRpZgorCisvKglibAlsMmNhY2hlX2VuYWJsZSAqLworCW1yCXIzLCByMjEKKworCS8qIHIzOiBCT09URkxBRyAqLworCS8qIHJ1biAxc3QgcGFydCBvZiBib2FyZCBpbml0IGNvZGUgKGZyb20gRmxhc2gpCSAgKi8KKwlibAlib2FyZF9pbml0X2YKKwlzeW5jCisKKwkvKiBOT1RSRUFDSEVEICovCisKKwkuZ2xvYmwJaW52YWxpZGF0ZV9iYXRzCitpbnZhbGlkYXRlX2JhdHM6CisKKwlsaQlyMCwgMAorCS8qIGludmFsaWRhdGUgQkFUcyAqLworCW10c3ByCUlCQVQwVSwgcjAKKwltdHNwcglJQkFUMVUsIHIwCisJbXRzcHIJSUJBVDJVLCByMAorCW10c3ByCUlCQVQzVSwgcjAKKwltdHNwcglJQkFUNFUsIHIwCisJbXRzcHIJSUJBVDVVLCByMAorCW10c3ByCUlCQVQ2VSwgcjAKKwltdHNwcglJQkFUN1UsIHIwCisKKwlpc3luYworCW10c3ByCURCQVQwVSwgcjAKKwltdHNwcglEQkFUMVUsIHIwCisJbXRzcHIJREJBVDJVLCByMAorCW10c3ByCURCQVQzVSwgcjAKKwltdHNwcglEQkFUNFUsIHIwCisJbXRzcHIJREJBVDVVLCByMAorCW10c3ByCURCQVQ2VSwgcjAKKwltdHNwcglEQkFUN1UsIHIwCisKKwlpc3luYworCXN5bmMKKwlibHIKKworLyoKKyAqIGVhcmx5X2JhdHM6CisgKgorICogU2V0IHVwIGJhdHMgbmVlZGVkIGVhcmx5IG9uIC0gdGhpcyBpcyB1c3VhbGx5IHRoZSBCQVQgZm9yIHRoZQorICogc3RhY2staW4tY2FjaGUsIHRoZSBGbGFzaCwgYW5kIENDU1Igc3BhY2UKKyAqLworCS5nbG9ibCAgZWFybHlfYmF0cworZWFybHlfYmF0czoKKwkvKiBJQkFUIDMgKi8KKwlsaXMJcjQsIENPTkZJR19TWVNfSUJBVDNMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19JQkFUM0xAbAorCWxpcwlyMywgQ09ORklHX1NZU19JQkFUM1VAaAorCW9yaSAgICAgcjMsIHIzLCBDT05GSUdfU1lTX0lCQVQzVUBsCisJbXRzcHIgICBJQkFUM0wsIHI0CisJbXRzcHIgICBJQkFUM1UsIHIzCisJaXN5bmMKKworCS8qIERCQVQgMyAqLworCWxpcwlyNCwgQ09ORklHX1NZU19EQkFUM0xAaAorCW9yaSAgICAgcjQsIHI0LCBDT05GSUdfU1lTX0RCQVQzTEBsCisJbGlzCXIzLCBDT05GSUdfU1lTX0RCQVQzVUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfREJBVDNVQGwKKwltdHNwciAgIERCQVQzTCwgcjQKKwltdHNwciAgIERCQVQzVSwgcjMKKwlpc3luYworCisJLyogSUJBVCA1ICovCisJbGlzCXI0LCBDT05GSUdfU1lTX0lCQVQ1TEBoCisJb3JpICAgICByNCwgcjQsIENPTkZJR19TWVNfSUJBVDVMQGwKKwlsaXMJcjMsIENPTkZJR19TWVNfSUJBVDVVQGgKKwlvcmkgICAgIHIzLCByMywgQ09ORklHX1NZU19JQkFUNVVAbAorCW10c3ByICAgSUJBVDVMLCByNAorCW10c3ByICAgSUJBVDVVLCByMworCWlzeW5jCisKKwkvKiBEQkFUIDUgKi8KKwlsaXMJcjQsIENPTkZJR19TWVNfREJBVDVMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19EQkFUNUxAbAorCWxpcwlyMywgQ09ORklHX1NZU19EQkFUNVVAaAorCW9yaSAgICAgcjMsIHIzLCBDT05GSUdfU1lTX0RCQVQ1VUBsCisJbXRzcHIgICBEQkFUNUwsIHI0CisJbXRzcHIgICBEQkFUNVUsIHIzCisJaXN5bmMKKworCS8qIElCQVQgNiAqLworCWxpcwlyNCwgQ09ORklHX1NZU19JQkFUNkxfRUFSTFlAaAorCW9yaSAgICAgcjQsIHI0LCBDT05GSUdfU1lTX0lCQVQ2TF9FQVJMWUBsCisJbGlzCXIzLCBDT05GSUdfU1lTX0lCQVQ2VV9FQVJMWUBoCisJb3JpICAgICByMywgcjMsIENPTkZJR19TWVNfSUJBVDZVX0VBUkxZQGwKKwltdHNwciAgIElCQVQ2TCwgcjQKKwltdHNwciAgIElCQVQ2VSwgcjMKKwlpc3luYworCisJLyogREJBVCA2ICovCisJbGlzCXI0LCBDT05GSUdfU1lTX0RCQVQ2TF9FQVJMWUBoCisJb3JpICAgICByNCwgcjQsIENPTkZJR19TWVNfREJBVDZMX0VBUkxZQGwKKwlsaXMJcjMsIENPTkZJR19TWVNfREJBVDZVX0VBUkxZQGgKKwlvcmkgICAgIHIzLCByMywgQ09ORklHX1NZU19EQkFUNlVfRUFSTFlAbAorCW10c3ByICAgREJBVDZMLCByNAorCW10c3ByICAgREJBVDZVLCByMworCWlzeW5jCisKKyNpZihDT05GSUdfU1lTX0NDU1JCQVJfREVGQVVMVCAhPSBDT05GSUdfU1lTX0NDU1JCQVIpCisJLyogSUJBVCA3ICovCisJbGlzCXI0LCBDT05GSUdfU1lTX0NDU1JfREVGQVVMVF9JQkFUTEBoCisJb3JpICAgICByNCwgcjQsIENPTkZJR19TWVNfQ0NTUl9ERUZBVUxUX0lCQVRMQGwKKwlsaXMJcjMsIENPTkZJR19TWVNfQ0NTUl9ERUZBVUxUX0lCQVRVQGgKKwlvcmkgICAgIHIzLCByMywgQ09ORklHX1NZU19DQ1NSX0RFRkFVTFRfSUJBVFVAbAorCW10c3ByICAgSUJBVDdMLCByNAorCW10c3ByICAgSUJBVDdVLCByMworCWlzeW5jCisKKwkvKiBEQkFUIDcgKi8KKwlsaXMJcjQsIENPTkZJR19TWVNfQ0NTUl9ERUZBVUxUX0RCQVRMQGgKKwlvcmkgICAgIHI0LCByNCwgQ09ORklHX1NZU19DQ1NSX0RFRkFVTFRfREJBVExAbAorCWxpcwlyMywgQ09ORklHX1NZU19DQ1NSX0RFRkFVTFRfREJBVFVAaAorCW9yaSAgICAgcjMsIHIzLCBDT05GSUdfU1lTX0NDU1JfREVGQVVMVF9EQkFUVUBsCisJbXRzcHIgICBEQkFUN0wsIHI0CisJbXRzcHIgICBEQkFUN1UsIHIzCisJaXN5bmMKKyNlbmRpZgorCWJscgorCisJLmdsb2JsIGNsZWFyX3RsYnMKK2NsZWFyX3RsYnM6CisJYWRkaXMgICByMywgMCwgMHgwMDAwCisJYWRkaXMgICByNSwgMCwgMHg0CisJaXN5bmMKK3RsYmxwOgorCXRsYmllICAgcjMKKwlzeW5jCisJYWRkaSAgICByMywgcjMsIDB4MTAwMAorCWNtcCAgICAgMCwgMCwgcjMsIHI1CisJYmx0IHRsYmxwCisJYmxyCisKKwkuZ2xvYmwgZGlzYWJsZV9hZGRyX3RyYW5zCitkaXNhYmxlX2FkZHJfdHJhbnM6CisJLyogZGlzYWJsZSBhZGRyZXNzIHRyYW5zbGF0aW9uICovCisJbWZscglyNAorCW1mbXNyCXIzCisJYW5kaS4JcjAsIHIzLCAoTVNSX0lSIHwgTVNSX0RSKQorCWJlcWxyCisJYW5kYwlyMywgcjMsIHIwCisJbXRzcHIJU1JSMCwgcjQKKwltdHNwcglTUlIxLCByMworCXJmaQorCisvKgorICogVGhpcyBjb2RlIGZpbmlzaGVzIHNhdmluZyB0aGUgcmVnaXN0ZXJzIHRvIHRoZSBleGNlcHRpb24gZnJhbWUKKyAqIGFuZCBqdW1wcyB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAqIFJlZ2lzdGVyIHIyMSBpcyBwb2ludGVyIGludG8gdHJhcCBmcmFtZSwgcjEgaGFzIG5ldyBzdGFjayBwb2ludGVyLgorICovCisJLmdsb2JsCXRyYW5zZmVyX3RvX2hhbmRsZXIKK3RyYW5zZmVyX3RvX2hhbmRsZXI6CisJc3R3CXIyMixfTklQKHIyMSkKKwlsaXMJcjIyLE1TUl9QT1dAaAorCWFuZGMJcjIzLHIyMyxyMjIKKwlzdHcJcjIzLF9NU1IocjIxKQorCVNBVkVfR1BSKDcsIHIyMSkKKwlTQVZFXzRHUFJTKDgsIHIyMSkKKwlTQVZFXzhHUFJTKDEyLCByMjEpCisJU0FWRV84R1BSUygyNCwgcjIxKQorCW1mbHIJcjIzCisJYW5kaS4JcjI0LHIyMywweDNmMDAJCS8qIGdldCB2ZWN0b3Igb2Zmc2V0ICovCisJc3R3CXIyNCxUUkFQKHIyMSkKKwlsaQlyMjIsMAorCXN0dwlyMjIsUkVTVUxUKHIyMSkKKwltdHNwcglTUFJHMixyMjIJCS8qIHIxIGlzIG5vdyBrZXJuZWwgc3AgKi8KKwlsd3oJcjI0LDAocjIzKQkJLyogdmlydHVhbCBhZGRyZXNzIG9mIGhhbmRsZXIgKi8KKwlsd3oJcjIzLDQocjIzKQkJLyogd2hlcmUgdG8gZ28gd2hlbiBkb25lICovCisJbXRzcHIJU1JSMCxyMjQKKwltdHNwcglTUlIxLHIyMAorCW10bHIJcjIzCisJU1lOQworCXJmaQkJCQkvKiBqdW1wIHRvIGhhbmRsZXIsIGVuYWJsZSBNTVUgKi8KKworaW50X3JldHVybjoKKwltZm1zcglyMjgJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXI0LDAKKwlvcmkJcjQscjQsTVNSX0VFCisJYW5kYwlyMjgscjI4LHI0CisJU1lOQwkJCS8qIFNvbWUgY2hpcCByZXZzIG5lZWQgdGhpcy4uLiAqLworCW10bXNyCXIyOAorCVNZTkMKKwlsd3oJcjIsX0NUUihyMSkKKwlsd3oJcjAsX0xJTksocjEpCisJbXRjdHIJcjIKKwltdGxyCXIwCisJbHd6CXIyLF9YRVIocjEpCisJbHd6CXIwLF9DQ1IocjEpCisJbXRzcHIJWEVSLHIyCisJbXRjcmYJMHhGRixyMAorCVJFU1RfMTBHUFJTKDMsIHIxKQorCVJFU1RfMTBHUFJTKDEzLCByMSkKKwlSRVNUXzhHUFJTKDIzLCByMSkKKwlSRVNUX0dQUigzMSwgcjEpCisJbHd6CXIyLF9OSVAocjEpCS8qIFJlc3RvcmUgZW52aXJvbm1lbnQgKi8KKwlsd3oJcjAsX01TUihyMSkKKwltdHNwcglTUlIwLHIyCisJbXRzcHIJU1JSMSxyMAorCWx3eglyMCxHUFIwKHIxKQorCWx3eglyMixHUFIyKHIxKQorCWx3eglyMSxHUFIxKHIxKQorCVNZTkMKKwlyZmkKKworCS5nbG9ibAlkY19yZWFkCitkY19yZWFkOgorCWJscgorCisJLmdsb2JsIGdldF9wdnIKK2dldF9wdnI6CisJbWZzcHIJcjMsIFBWUgorCWJscgorCisJLmdsb2JsIGdldF9zdnIKK2dldF9zdnI6CisJbWZzcHIJcjMsIFNWUgorCWJscgorCisKKy8qCisgKiBGdW5jdGlvbjoJaW44CisgKiBEZXNjcmlwdGlvbjoJSW5wdXQgOCBiaXRzCisgKi8KKwkuZ2xvYmwJaW44Citpbjg6CisJbGJ6CXIzLDB4MDAwMChyMykKKwlibHIKKworLyoKKyAqIEZ1bmN0aW9uOglvdXQ4CisgKiBEZXNjcmlwdGlvbjoJT3V0cHV0IDggYml0cworICovCisJLmdsb2JsCW91dDgKK291dDg6CisJc3RiCXI0LDB4MDAwMChyMykKKwlibHIKKworLyoKKyAqIEZ1bmN0aW9uOglvdXQxNgorICogRGVzY3JpcHRpb246CU91dHB1dCAxNiBiaXRzCisgKi8KKwkuZ2xvYmwJb3V0MTYKK291dDE2OgorCXN0aAlyNCwweDAwMDAocjMpCisJYmxyCisKKy8qCisgKiBGdW5jdGlvbjoJb3V0MTZyCisgKiBEZXNjcmlwdGlvbjoJQnl0ZSByZXZlcnNlIGFuZCBvdXRwdXQgMTYgYml0cworICovCisJLmdsb2JsCW91dDE2cgorb3V0MTZyOgorCXN0aGJyeAlyNCxyMCxyMworCWJscgorCisvKgorICogRnVuY3Rpb246CW91dDMyCisgKiBEZXNjcmlwdGlvbjoJT3V0cHV0IDMyIGJpdHMKKyAqLworCS5nbG9ibAlvdXQzMgorb3V0MzI6CisJc3R3CXI0LDB4MDAwMChyMykKKwlibHIKKworLyoKKyAqIEZ1bmN0aW9uOglvdXQzMnIKKyAqIERlc2NyaXB0aW9uOglCeXRlIHJldmVyc2UgYW5kIG91dHB1dCAzMiBiaXRzCisgKi8KKwkuZ2xvYmwJb3V0MzJyCitvdXQzMnI6CisJc3R3YnJ4CXI0LHIwLHIzCisJYmxyCisKKy8qCisgKiBGdW5jdGlvbjoJaW4xNgorICogRGVzY3JpcHRpb246CUlucHV0IDE2IGJpdHMKKyAqLworCS5nbG9ibAlpbjE2CitpbjE2OgorCWxoeglyMywweDAwMDAocjMpCisJYmxyCisKKy8qCisgKiBGdW5jdGlvbjoJaW4xNnIKKyAqIERlc2NyaXB0aW9uOglJbnB1dCAxNiBiaXRzIGFuZCBieXRlIHJldmVyc2UKKyAqLworCS5nbG9ibAlpbjE2cgoraW4xNnI6CisJbGhicngJcjMscjAscjMKKwlibHIKKworLyoKKyAqIEZ1bmN0aW9uOglpbjMyCisgKiBEZXNjcmlwdGlvbjoJSW5wdXQgMzIgYml0cworICovCisJLmdsb2JsCWluMzIKK2luMzI6CisJbHd6CTMsMHgwMDAwKDMpCisJYmxyCisKKy8qCisgKiBGdW5jdGlvbjoJaW4zMnIKKyAqIERlc2NyaXB0aW9uOglJbnB1dCAzMiBiaXRzIGFuZCBieXRlIHJldmVyc2UKKyAqLworCS5nbG9ibAlpbjMycgoraW4zMnI6CisJbHdicngJcjMscjAscjMKKwlibHIKKworLyoKKyAqIHZvaWQgcmVsb2NhdGVfY29kZSAoYWRkcl9zcCwgZ2QsIGFkZHJfbW9uaSkKKyAqCisgKiBUaGlzICJmdW5jdGlvbiIgZG9lcyBub3QgcmV0dXJuLCBpbnN0ZWFkIGl0IGNvbnRpbnVlcyBpbiBSQU0KKyAqIGFmdGVyIHJlbG9jYXRpbmcgdGhlIG1vbml0b3IgY29kZS4KKyAqCisgKiByMyA9IGRlc3QKKyAqIHI0ID0gc3JjCisgKiByNSA9IGxlbmd0aCBpbiBieXRlcworICogcjYgPSBjYWNoZWxpbmVzaXplCisgKi8KKwkuZ2xvYmwJcmVsb2NhdGVfY29kZQorcmVsb2NhdGVfY29kZToKKworCW1yCXIxLCAgcjMJCS8qIFNldCBuZXcgc3RhY2sgcG9pbnRlcgkJKi8KKwltcglyOSwgIHI0CQkvKiBTYXZlIGNvcHkgb2YgR2xvYmFsIERhdGEgcG9pbnRlcgkqLworCW1yCXIxMCwgcjUJCS8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisKKwlHRVRfR09UCisJbXIJcjMsICByNQkJCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisJbGlzCXI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWx3eglyNSwgR09UKF9faW5pdF9lbmQpCisJc3ViCXI1LCByNSwgcjQKKwlsaQlyNiwgQ09ORklHX1NZU19DQUNIRUxJTkVfU0laRQkJLyogQ2FjaGUgTGluZSBTaXplCSovCisKKwkvKgorCSAqIEZpeCBHT1QgcG9pbnRlcjoKKwkgKgorCSAqIE5ldyBHT1QtUFRSID0gKG9sZCBHT1QtUFRSIC0gQ09ORklHX1NZU19NT05JVE9SX0JBU0UpICsgRGVzdGluYXRpb24gQWRkcmVzcworCSAqCisJICogT2Zmc2V0OgorCSAqLworCXN1YglyMTUsIHIxMCwgcjQKKworCS8qIEZpcnN0IG91ciBvd24gR09UICovCisJYWRkCXIxMiwgcjEyLCByMTUKKwkvKiB0aGVuIHRoZSBvbmUgdXNlZCBieSB0aGUgQyBjb2RlICovCisJYWRkCXIzMCwgcjMwLCByMTUKKworCS8qCisJICogTm93IHJlbG9jYXRlIGNvZGUKKwkgKi8KKwljbXBsdwljcjEscjMscjQKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJYmVxCWNyMSw0ZgkJLyogSW4gcGxhY2UgY29weSBpcyBub3QgbmVjZXNzYXJ5CSovCisJYmVxCTdmCQkvKiBQcm90ZWN0IGFnYWluc3QgMCBjb3VudAkJKi8KKwltdGN0cglyMAorCWJnZQljcjEsMmYKKworCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisJYgk0ZgorCisyOglzbHdpCXIwLHIwLDIKKwlhZGQJcjgscjQscjAKKwlhZGQJcjcscjMscjAKKzM6CWx3enUJcjAsLTQocjgpCisJc3R3dQlyMCwtNChyNykKKwliZG56CTNiCisvKgorICogTm93IGZsdXNoIHRoZSBjYWNoZTogbm90ZSB0aGF0IHdlIG11c3Qgc3RhcnQgZnJvbSBhIGNhY2hlIGFsaWduZWQKKyAqIGFkZHJlc3MuIE90aGVyd2lzZSB3ZSBtaWdodCBtaXNzIG9uZSBjYWNoZSBsaW5lLgorICovCis0OgljbXB3aQlyNiwwCisJYWRkCXI1LHIzLHI1CisJYmVxCTdmCQkvKiBBbHdheXMgZmx1c2ggcHJlZmV0Y2ggcXVldWUgaW4gYW55IGNhc2UgKi8KKwlzdWJpCXIwLHI2LDEKKwlhbmRjCXIzLHIzLHIwCisJbXIJcjQscjMKKzU6CWRjYnN0CTAscjQKKwlhZGQJcjQscjQscjYKKwljbXBsdwlyNCxyNQorCWJsdAk1YgorCXN5bmMJCQkvKiBXYWl0IGZvciBhbGwgZGNic3QgdG8gY29tcGxldGUgb24gYnVzICovCisJbXIJcjQscjMKKzY6CWljYmkJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTZiCis3OglzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGljYmkgdG8gY29tcGxldGUgb24gYnVzICovCisJaXN5bmMKKworLyoKKyAqIFdlIGFyZSBkb25lLiBEbyBub3QgcmV0dXJuLCBpbnN0ZWFkIGJyYW5jaCB0byBzZWNvbmQgcGFydCBvZiBib2FyZAorICogaW5pdGlhbGl6YXRpb24sIG5vdyBydW5uaW5nIGZyb20gUkFNLgorICovCisJYWRkaQlyMCwgcjEwLCBpbl9yYW0gLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCW10bHIJcjAKKwlibHIKKworaW5fcmFtOgorCS8qCisJICogUmVsb2NhdGlvbiBGdW5jdGlvbiwgcjEyIHBvaW50IHRvIGdvdDIrMHg4MDAwCisJICoKKwkgKiBBZGp1c3QgZ290MiBwb2ludGVycywgbm8gbmVlZCB0byBjaGVjayBmb3IgMCwgdGhpcyBjb2RlCisJICogYWxyZWFkeSBwdXRzIGEgZmV3IGVudHJpZXMgaW4gdGhlIHRhYmxlLgorCSAqLworCWxpCXIwLF9fZ290Ml9lbnRyaWVzQHNlY3RvZmZAbAorCWxhCXIzLEdPVChfR09UMl9UQUJMRV8pCisJbHd6CXIxMSxHT1QoX0dPVDJfVEFCTEVfKQorCW10Y3RyCXIwCisJc3ViCXIxMSxyMyxyMTEKKwlhZGRpCXIzLHIzLC00CisxOglsd3p1CXIwLDQocjMpCisJY21wd2kJcjAsMAorCWJlcS0JMmYKKwlhZGQJcjAscjAscjExCisJc3R3CXIwLDAocjMpCisyOgliZG56CTFiCisKKwkvKgorCSAqIE5vdyBhZGp1c3QgdGhlIGZpeHVwcyBhbmQgdGhlIHBvaW50ZXJzIHRvIHRoZSBmaXh1cHMKKwkgKiBpbiBjYXNlIHdlIG5lZWQgdG8gbW92ZSBvdXJzZWx2ZXMgYWdhaW4uCisJICovCisJbGkJcjAsX19maXh1cF9lbnRyaWVzQHNlY3RvZmZAbAorCWx3eglyMyxHT1QoX0ZJWFVQX1RBQkxFXykKKwljbXB3aQlyMCwwCisJbXRjdHIJcjAKKwlhZGRpCXIzLHIzLC00CisJYmVxCTRmCiszOglsd3p1CXI0LDQocjMpCisJbHd6dXgJcjAscjQscjExCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMTAsMChyMykKKwlzdHcJcjAsMChyNCkKKwliZG56CTNiCis0OgorLyogY2xlYXJfYnNzOiAqLworCS8qCisJICogTm93IGNsZWFyIEJTUyBzZWdtZW50CisJICovCisJbHd6CXIzLEdPVChfX2Jzc19zdGFydCkKKwlsd3oJcjQsR09UKF9lbmQpCisKKwljbXBsdwkwLCByMywgcjQKKwliZXEJNmYKKworCWxpCXIwLCAwCis1OgorCXN0dwlyMCwgMChyMykKKwlhZGRpCXIzLCByMywgNAorCWNtcGx3CTAsIHIzLCByNAorCWJuZQk1YgorNjoKKwltcglyMywgcjkJCS8qIEluaXQgRGF0ZSBwb2ludGVyCQkqLworCW1yCXI0LCByMTAJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJCSovCisJYmwJYm9hcmRfaW5pdF9yCisKKwkvKiBub3QgcmVhY2hlZCAtIGVuZCByZWxvY2F0ZV9jb2RlICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qCisJICogQ29weSBleGNlcHRpb24gdmVjdG9yIGNvZGUgdG8gbG93IG1lbW9yeQorCSAqCisJICogcjM6IGRlc3RfYWRkcgorCSAqIHI3OiBzb3VyY2UgYWRkcmVzcywgcjg6IGVuZCBhZGRyZXNzLCByOTogdGFyZ2V0IGFkZHJlc3MKKwkgKi8KKwkuZ2xvYmwJdHJhcF9pbml0Cit0cmFwX2luaXQ6CisJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlcgkJKi8KKwlHRVRfR09UCisJbHd6CXI3LCBHT1QoX3N0YXJ0KQorCWx3eglyOCwgR09UKF9lbmRfb2ZfdmVjdG9ycykKKworCWxpCXI5LCAweDEwMAkJLyogcmVzZXQgdmVjdG9yIGFsd2F5cyBhdCAweDEwMCAqLworCisJY21wbHcJMCwgcjcsIHI4CisJYmdlbHIJCQkJLyogcmV0dXJuIGlmIHI3Pj1yOCAtIGp1c3QgaW4gY2FzZSAqLworMToKKwlsd3oJcjAsIDAocjcpCisJc3R3CXIwLCAwKHI5KQorCWFkZGkJcjcsIHI3LCA0CisJYWRkaQlyOSwgcjksIDQKKwljbXBsdwkwLCByNywgcjgKKwlibmUJMWIKKworCS8qCisJICogcmVsb2NhdGUgYGhkbHInIGFuZCBgaW50X3JldHVybicgZW50cmllcworCSAqLworCWxpCXI3LCAuTF9NYWNoaW5lQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBBbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMjoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJMmIKKworCWxpCXI3LCAuTF9BbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9Qcm9ncmFtQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgU3lzdGVtQ2FsbCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCiszOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkzYgorCisJbGkJcjcsIC5MX1NpbmdsZVN0ZXAgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorNDoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJNGIKKworCS8qIGVuYWJsZSBleGVjcHRpb25zIGZyb20gUkFNIHZlY3RvcnMgKi8KKwltZm1zcglyNworCWxpCXI4LE1TUl9JUAorCWFuZGMJcjcscjcscjgKKwlvcmkJcjcscjcsTVNSX01FCQkvKiBFbmFibGUgTWFjaGluZSBDaGVjayAqLworCW10bXNyCXI3CisKKwltdGxyCXI0CQkJLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyCSovCisJYmxyCisKKy5nbG9ibCBlbmFibGVfZXh0X2FkZHIKK2VuYWJsZV9leHRfYWRkcjoKKwltZnNwcglyMCwgSElEMAorCWxpcwlyMCwgKEhJRDBfSElHSF9CQVRfRU4gfCBISUQwX1hCU0VOIHwgSElEMF9YQUVOKUBoCisJb3JpCXIwLCByMCwgKEhJRDBfSElHSF9CQVRfRU4gfCBISUQwX1hCU0VOIHwgSElEMF9YQUVOKUBsCisJbXRzcHIJSElEMCwgcjAKKwlzeW5jCisJaXN5bmMKKwlibHIKKworI2lmIChDT05GSUdfU1lTX0NDU1JCQVJfREVGQVVMVCAhPSBDT05GSUdfU1lTX0NDU1JCQVIpCisuZ2xvYmwgc2V0dXBfY2NzcmJhcgorc2V0dXBfY2NzcmJhcjoKKwkvKiBTcGVjaWFsIHNlcXVlbmNlIG5lZWRlZCB0byB1cGRhdGUgQ0NTUkJBUiBpdHNlbGYgKi8KKwlsaXMJcjQsIENPTkZJR19TWVNfQ0NTUkJBUl9ERUZBVUxUQGgKKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX0NDU1JCQVJfREVGQVVMVEBsCisKKwlsaXMJcjUsIENPTkZJR19TWVNfQ0NTUkJBUl9QSFlTX0xPV0BoCisJb3JpCXI1LCByNSwgQ09ORklHX1NZU19DQ1NSQkFSX1BIWVNfTE9XQGwKKwlzcndpCXI1LHI1LDEyCisJbGkJcjYsIENPTkZJR19TWVNfQ0NTUkJBUl9QSFlTX0hJR0hAbAorCXJsd2ltaQlyNSxyNiwyMCw4LDExCisJc3R3CXI1LCAwKHI0KSAvKiBTdG9yZSBwaHlzaWNhbCB2YWx1ZSBvZiBDQ1NSICovCisJaXN5bmMKKworCWxpcwlyNSwgVEVYVF9CQVNFQGgKKwlvcmkJcjUscjUsVEVYVF9CQVNFQGwKKwlsd3oJcjUsIDAocjUpCisJaXN5bmMKKworCS8qIFVzZSBWQSBvZiBDQ1NSIHRvIGRvIHJlYWQgKi8KKwlsaXMJcjMsIENPTkZJR19TWVNfQ0NTUkJBUkBoCisJbHd6CXI1LCBDT05GSUdfU1lTX0NDU1JCQVJAbChyMykKKwlpc3luYworCisJYmxyCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TWVNfSU5JVF9SQU1fTE9DSworbG9ja19yYW1faW5fY2FjaGU6CisJLyogQWxsb2NhdGUgSW5pdGlhbCBSQU0gaW4gZGF0YSBjYWNoZS4KKwkgKi8KKwlsaXMJcjMsIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgJiB+MzEpQGgKKwlvcmkJcjMsIHIzLCAoQ09ORklHX1NZU19JTklUX1JBTV9BRERSICYgfjMxKUBsCisJbGkJcjQsICgoQ09ORklHX1NZU19JTklUX1JBTV9FTkQgJiB+MzEpICsgXAorCQkgICAgIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgJiAzMSkgKyAzMSkgLyAzMgorCW10Y3RyCXI0CisxOgorCWRjYnoJcjAsIHIzCisJYWRkaQlyMywgcjMsIDMyCisJYmRuegkxYgorI2lmIDEKKy8qIExvY2sgdGhlIGRhdGEgY2FjaGUgKi8KKwltZnNwcglyMCwgSElEMAorCW9yaQlyMCwgcjAsIDB4MTAwMAorCXN5bmMKKwltdHNwcglISUQwLCByMAorCXN5bmMKKwlibHIKKyNlbmRpZgorI2lmIDAKKwkvKiBMb2NrIHRoZSBmaXJzdCB3YXkgb2YgdGhlIGRhdGEgY2FjaGUgKi8KKwltZnNwcglyMCwgTERTVENSCisJb3JpCXIwLCByMCwgMHgwMDgwCisjaWYgZGVmaW5lZChDT05GSUdfQUxUSVZFQykKKwlkc3NhbGwKKyNlbmRpZgorCXN5bmMKKwltdHNwcglMRFNUQ1IsIHIwCisJc3luYworCWlzeW5jCisJYmxyCisjZW5kaWYKKworLmdsb2JsIHVubG9ja19yYW1faW5fY2FjaGUKK3VubG9ja19yYW1faW5fY2FjaGU6CisJLyogaW52YWxpZGF0ZSB0aGUgSU5JVF9SQU0gc2VjdGlvbiAqLworCWxpcwlyMywgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiAmIH4zMSlAaAorCW9yaQlyMywgcjMsIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgJiB+MzEpQGwKKwlsaQlyNCwgKChDT05GSUdfU1lTX0lOSVRfUkFNX0VORCAmIH4zMSkgKyBcCisJCSAgICAgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiAmIDMxKSArIDMxKSAvIDMyCisJbXRjdHIJcjQKKzE6CWljYmkJcjAsIHIzCisJYWRkaQlyMywgcjMsIDMyCisJYmRuegkxYgorCXN5bmMJCQkvKiBXYWl0IGZvciBhbGwgaWNiaSB0byBjb21wbGV0ZSBvbiBidXMgKi8KKwlpc3luYworI2lmIDEKKy8qIFVubG9jayB0aGUgZGF0YSBjYWNoZSBhbmQgaW52YWxpZGF0ZSBpdCAqLworCW1mc3ByCXIwLCBISUQwCisJbGkJcjMsMHgxMDAwCisJYW5kYwlyMCxyMCxyMworCWxpCXIzLDB4MDQwMAorCW9yCXIwLHIwLHIzCisJc3luYworCW10c3ByCUhJRDAsIHIwCisJc3luYworCWJscgorI2VuZGlmCisjaWYgMAorCS8qIFVubG9jayB0aGUgZmlyc3Qgd2F5IG9mIHRoZSBkYXRhIGNhY2hlICovCisJbWZzcHIJcjAsIExEU1RDUgorCWxpCXIzLDB4MDA4MAorCWFuZGMJcjAscjAscjMKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCWRzc2FsbAorI2VuZGlmCisJc3luYworCW10c3ByCUxEU1RDUiwgcjAKKwlzeW5jCisJaXN5bmMKKwlsaQlyMywweDA0MDAKKwlvcglyMCxyMCxyMworCXN5bmMKKwltdHNwcglISUQwLCByMAorCXN5bmMKKwlibHIKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC90cmFwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjQwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzg2eHgvdHJhcHMuYwpAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2ICBHYXJ5IFRob21hcyAoZ2R0QGxpbnV4cHBjLm9yZykKKyAqCisgKiBNb2RpZmllZCBieSBDb3J0IERvdWdhbiAoY29ydEBjcy5ubXQuZWR1KQorICogYW5kIFBhdWwgTWFja2VycmFzIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIGhhcmR3YXJlIGV4Y2VwdGlvbnMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGtnZGIuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisvKiBSZXR1cm5zIDAgaWYgZXhjZXB0aW9uIG5vdCBmb3VuZCBhbmQgZml4dXAgb3RoZXJ3aXNlLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHNlYXJjaF9leGNlcHRpb25fdGFibGUodW5zaWduZWQgbG9uZyk7CisKKy8qCisgKiBFbmQgb2YgYWRkcmVzc2FibGUgbWVtb3J5LiAgVGhpcyBtYXkgYmUgbGVzcyB0aGFuIHRoZSBhY3R1YWwKKyAqIGFtb3VudCBvZiBtZW1vcnkgb24gdGhlIHN5c3RlbSBpZiB3ZSdyZSB1bmFibGUgdG8ga2VlcCBhbGwKKyAqIHRoZSBtZW1vcnkgbWFwcGVkIGluLgorICovCitleHRlcm4gdWxvbmcgZ2V0X2VmZmVjdGl2ZV9tZW1zaXplKHZvaWQpOworI2RlZmluZSBFTkRfT0ZfTUVNIChnZC0+YmQtPmJpX21lbXN0YXJ0ICsgZ2V0X2VmZmVjdGl2ZV9tZW1zaXplKCkpCisKKy8qCisgKiBUcmFwICYgRXhjZXB0aW9uIHN1cHBvcnQKKyAqLworCit2b2lkCitwcmludF9iYWNrdHJhY2UodW5zaWduZWQgbG9uZyAqc3ApCit7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHJpbnRmKCJDYWxsIGJhY2t0cmFjZTogIik7CisJd2hpbGUgKHNwKSB7CisJCWlmICgodWludCkgc3AgPiBFTkRfT0ZfTUVNKQorCQkJYnJlYWs7CisKKwkJaSA9IHNwWzFdOworCQlpZiAoY250KysgJSA3ID09IDApCisJCQlwcmludGYoIlxuIik7CisJCXByaW50ZigiJTA4bFggIiwgaSk7CisJCWlmIChjbnQgPiAzMikKKwkJCWJyZWFrOworCQlzcCA9ICh1bnNpZ25lZCBsb25nICopKnNwOworCX0KKwlwcmludGYoIlxuIik7Cit9CisKK3ZvaWQKK3Nob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKworCXByaW50ZigiTklQOiAlMDhsWCBYRVI6ICUwOGxYIExSOiAlMDhsWCBSRUdTOiIKKwkgICAgICAgIiAlcCBUUkFQOiAlMDRseCBEQVI6ICUwOGxYXG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPnhlciwgcmVncy0+bGluaywgcmVncywgcmVncy0+dHJhcCwgcmVncy0+ZGFyKTsKKwlwcmludGYoIk1TUjogJTA4bHggRUU6ICUwMXggUFI6ICUwMXggRlA6IgorCSAgICAgICAiICUwMXggTUU6ICUwMXggSVIvRFI6ICUwMXglMDF4XG4iLAorCSAgICAgICByZWdzLT5tc3IsIHJlZ3MtPm1zciAmIE1TUl9FRSA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3IgJiBNU1JfUFIgPyAxIDogMCwgcmVncy0+bXNyICYgTVNSX0ZQID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciAmIE1TUl9NRSA/IDEgOiAwLCByZWdzLT5tc3IgJiBNU1JfSVIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyICYgTVNSX0RSID8gMSA6IDApOworCisJcHJpbnRmKCJcbiIpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmICgoaSAlIDgpID09IDApIHsKKwkJCXByaW50ZigiR1BSJTAyZDogIiwgaSk7CisJCX0KKworCQlwcmludGYoIiUwOGxYICIsIHJlZ3MtPmdwcltpXSk7CisJCWlmICgoaSAlIDgpID09IDcpIHsKKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCX0KK30KKworCit2b2lkCitfZXhjZXB0aW9uKGludCBzaWduciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMoIkV4Y2VwdGlvbiBpbiBrZXJuZWwgcGMgJWx4IHNpZ25hbCAlZCIsIHJlZ3MtPm5pcCwgc2lnbnIpOworfQorCit2b2lkCitNYWNoaW5lQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmaXh1cDsKKworCS8qIFByb2JpbmcgUENJIHVzaW5nIGNvbmZpZyBjeWNsZXMgY2F1c2UgdGhpcyBleGNlcHRpb24KKwkgKiB3aGVuIGEgZGV2aWNlIGlzIG5vdCBwcmVzZW50LiAgQ2F0Y2ggaXQgYW5kIHJldHVybiB0bworCSAqIHRoZSBQQ0kgZXhjZXB0aW9uIGhhbmRsZXIuCisJICovCisJaWYgKChmaXh1cCA9IHNlYXJjaF9leGNlcHRpb25fdGFibGUocmVncy0+bmlwKSkgIT0gMCkgeworCQlyZWdzLT5uaXAgPSBmaXh1cDsKKwkJcmV0dXJuOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKSAocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCisJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIGluIGtlcm5lbCBtb2RlLlxuIik7CisJcHJpbnRmKCJDYXVzZWQgYnkgKGZyb20gbXNyKTogIik7CisJcHJpbnRmKCJyZWdzICVwICIsIHJlZ3MpOworCXN3aXRjaCAoIHJlZ3MtPm1zciAmIDB4MDAxRjAwMDApIHsKKwljYXNlICgweDgwMDAwMDAwPj4xMSk6CisJCXByaW50ZigiTVNTIGVycm9yLiBNU1NTUjA6ICUwOHhcbiIsIG1mc3ByKFNQUk5fTVNTU1IwKSk7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjEyKToKKwkJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIHNpZ25hbCAtIHByb2JhYmx5IGR1ZSB0byBtbSBmYXVsdFxuIgorCQkgICAgICAgIndpdGggbW11IG9mZlxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDAgPj4gMTMpOgorCQlwcmludGYoIlRyYW5zZmVyIGVycm9yIGFjayBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDE0KToKKwkJcHJpbnRmKCJEYXRhIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwljYXNlICgweDgwMDAwMDAwID4+IDE1KToKKwkJcHJpbnRmKCJBZGRyZXNzIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlVua25vd24gdmFsdWVzIGluIG1zclxuIik7CisJfQorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJtYWNoaW5lIGNoZWNrIik7Cit9CisKK3ZvaWQKK0FsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikgKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygiQWxpZ25tZW50IEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitQcm9ncmFtQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgY2hhciAqcCA9IHJlZ3MgPyAodW5zaWduZWQgY2hhciAqKShyZWdzLT5uaXApIDogTlVMTDsKKwlpbnQgaSwgajsKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKSAocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKworCXAgPSAodW5zaWduZWQgY2hhciAqKSgodW5zaWduZWQgbG9uZylwICYgMHhGRkZGRkZFMCk7CisJcCAtPSAzMjsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDE2KSB7CisJCXByaW50ZigiJTA4eDogIiwgKHVuc2lnbmVkIGludClwICsgaSk7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlwcmludGYoIiUwMnggIiwgcFtpICsgal0pOworCQl9CisJCXByaW50ZigiXG4iKTsKKwl9CisKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJQcm9ncmFtIENoZWNrIEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKSAocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJTb2Z0d2FyZSBFbXVsYXRpb24gRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQKK1Vua25vd25FeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpIChyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJcHJpbnRmKCJVbmtub3duRXhjZXB0aW9uIHJlZ3NAJWx4XG4iLCAodWxvbmcpcmVncyk7CisJcHJpbnRmKCJCYWQgdHJhcCBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4XG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CisJX2V4Y2VwdGlvbigwLCByZWdzKTsKK30KKworLyoKKyAqIFByb2JlIGFuIGFkZHJlc3MgYnkgcmVhZGluZy4KKyAqIElmIG5vdCBwcmVzZW50LCByZXR1cm4gLTEsCisgKiBvdGhlcndpc2UgcmV0dXJuIDAuCisgKi8KK2ludAorYWRkcl9wcm9iZSh1aW50ICphZGRyKQoreworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjcwNDU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvTWFrZWZpbGUKQEAgLTAsMCArMSw2NiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworIyBDRkxBR1MgKz0gLURFVF9ERUJVRworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVC15CSs9IHN0YXJ0Lm8KK1NUQVJULXkJKz0ga2dkYi5vCitDT0JKUy15CSs9IGJlZGJ1Z184NjAubworQ09CSlMteQkrPSBjb21tcHJvYy5vCitDT0JKUy15CSs9IGNwdS5vCitDT0JKUy15CSs9IGNwdV9pbml0Lm8KK0NPQkpTLXkJKz0gZmVjLm8KK0NPQkpTLSQoQ09ORklHX09GX0xJQkZEVCkgKz0gZmR0Lm8KK0NPQkpTLXkJKz0gaTJjLm8KK0NPQkpTLXkJKz0gaW50ZXJydXB0cy5vCitDT0JKUy15CSs9IGxjZC5vCitDT0JKUy15CSs9IHNjYy5vCitDT0JKUy15CSs9IHNlcmlhbC5vCitDT0JKUy15CSs9IHNwZWVkLm8KK0NPQkpTLXkJKz0gc3BpLm8KK0NPQkpTLXkJKz0gdHJhcHMubworQ09CSlMteQkrPSB1cGF0Y2gubworQ09CSlMteQkrPSB2aWRlby5vCitTT0JKUy15CSs9IHBscHJjcl93cml0ZS5vCisKK1NSQ1MJOj0gJChTVEFSVC15Oi5vPS5TKSAkKFNPQkpTLXk6Lm89LlMpICQoQ09CSlMteToubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMteSkgJChDT0JKUy15KSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJULXkpKQorCithbGw6CSQob2JqKS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKSAkKG9iailrZ2RiLm8KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2JlZGJ1Z184NjAuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2JlZGJ1Z184NjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA4YmJiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvYmVkYnVnXzg2MC5jCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogQmVkYnVnIEZ1bmN0aW9ucyBzcGVjaWZpYyB0byB0aGUgTVBDODYwIGNoaXAKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8YmVkYnVnL2JlZGJ1Zy5oPgorI2luY2x1ZGUgPGJlZGJ1Zy9yZWdzLmg+CisjaW5jbHVkZSA8YmVkYnVnL3BwYy5oPgorI2luY2x1ZGUgPGJlZGJ1Zy90eXBlLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKSAmJiBkZWZpbmVkKENPTkZJR184eHgpCisKKyNkZWZpbmUgTUFYX0JSRUFLX1BPSU5UUyAyCisKK2V4dGVybiBDUFVfREVCVUdfQ1RYIGJ1Z19jdHg7CisKK3ZvaWQgYmVkYnVnODYwX2luaXQgX19QKCh2b2lkKSk7Cit2b2lkIGJlZGJ1Zzg2MF9kb19icmVhayBfX1AoKGNtZF90YmxfdCosaW50LGludCxjaGFyKltdKSk7Cit2b2lkIGJlZGJ1Zzg2MF9icmVha19pc3IgX19QKChzdHJ1Y3QgcHRfcmVncyopKTsKK2ludCAgYmVkYnVnODYwX2ZpbmRfZW1wdHkgX19QKCh2b2lkKSk7CitpbnQgIGJlZGJ1Zzg2MF9zZXQgX19QKChpbnQsdW5zaWduZWQgbG9uZykpOworaW50ICBiZWRidWc4NjBfY2xlYXIgX19QKChpbnQpKTsKKworDAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIGJ1Z19jdHggc3RydWN0dXJlIGZvciB0aGUgTVBDODYwLiAgQ2xlYXIgYWxsCisgKiBvZiB0aGUgYnJlYWtwb2ludHMuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgYmVkYnVnODYwX2luaXQoIHZvaWQgKQoreworICBpbnQJaTsKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICBidWdfY3R4Lmh3X2RlYnVnX2VuYWJsZWQgPSAwOworICBidWdfY3R4LnN0b3BwZWQgPSAwOworICBidWdfY3R4LmN1cnJlbnRfYnAgPSAwOworICBidWdfY3R4LnJlZ3MgPSBOVUxMOworCisgIGJ1Z19jdHguZG9fYnJlYWsgICA9IGJlZGJ1Zzg2MF9kb19icmVhazsKKyAgYnVnX2N0eC5icmVha19pc3IgID0gYmVkYnVnODYwX2JyZWFrX2lzcjsKKyAgYnVnX2N0eC5maW5kX2VtcHR5ID0gYmVkYnVnODYwX2ZpbmRfZW1wdHk7CisgIGJ1Z19jdHguc2V0ICAgICAgICA9IGJlZGJ1Zzg2MF9zZXQ7CisgIGJ1Z19jdHguY2xlYXIgICAgICA9IGJlZGJ1Zzg2MF9jbGVhcjsKKworICBmb3IoIGkgPSAxOyBpIDw9IE1BWF9CUkVBS19QT0lOVFM7ICsraSApCisgICAgKCpidWdfY3R4LmNsZWFyKSggaSApOworCisgIHB1dHMgKCJCRURCVUc6cmVhZHlcbiIpOworICByZXR1cm47Cit9IC8qIGJlZGJ1Z19pbml0X2JyZWFrcG9pbnRzICovCisKKworDAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0L2NsZWFyL3Nob3cgb25lIG9mIHRoZSBoYXJkd2FyZSBicmVha3BvaW50cyBmb3IgdGhlIDg2MC4gIFRoZSAib2ZmIgorICogc3RyaW5nIHdpbGwgZGlzYWJsZSBhIHNwZWNpZmljIGJyZWFrcG9pbnQuICBUaGUgInNob3ciIHN0cmluZyB3aWxsCisgKiBkaXNwbGF5IHRoZSBjdXJyZW50IGJyZWFrcG9pbnRzLiAgT3RoZXJ3aXNlIGFuIGFkZHJlc3Mgd2lsbCBzZXQgYQorICogYnJlYWtwb2ludCBhdCB0aGF0IGFkZHJlc3MuICBTZXR0aW5nIGEgYnJlYWtwb2ludCB1c2VzIHRoZSBDUFUtc3BlY2lmaWMKKyAqIHNldCByb3V0aW5lIHdoaWNoIHdpbGwgYXNzaWduIGEgYnJlYWtwb2ludCBudW1iZXIuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgYmVkYnVnODYwX2RvX2JyZWFrIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsCisJCQkgY2hhciAqYXJndltdKQoreworICBsb25nCQlhZGRyID0gMDsgICAgICAgLyogQWRkcmVzcyB0byBicmVhayBhdCAgKi8KKyAgaW50CQl3aGljaF9icDsgICAgICAgLyogQnJlYWtwb2ludCBudW1iZXIgICAgKi8KKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICBpZiAoYXJnYyA8IDIpCisgIHsKKyAgICBjbWRfdXNhZ2UoY21kdHApOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFR1cm4gb2ZmIGEgYnJlYWtwb2ludCAqLworCisgIGlmKCBzdHJjbXAoIGFyZ3ZbIDEgXSwgIm9mZiIgKSA9PSAwICkKKyAgeworICAgIGlmKCBidWdfY3R4Lmh3X2RlYnVnX2VuYWJsZWQgPT0gMCApCisgICAgeworICAgICAgcHJpbnRmKCAiTm8gYnJlYWtwb2ludHMgZW5hYmxlZFxuIiApOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWNoX2JwID0gc2ltcGxlX3N0cnRvdWwoIGFyZ3ZbIDIgXSwgTlVMTCwgMTAgKTsKKworICAgIGlmKCBidWdfY3R4LmNsZWFyICkKKyAgICAgICgqYnVnX2N0eC5jbGVhcikoIHdoaWNoX2JwICk7CisKKyAgICBwcmludGYoICJCcmVha3BvaW50ICVkIHJlbW92ZWRcbiIsIHdoaWNoX2JwICk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogU2hvdyBhIGxpc3Qgb2YgYnJlYWtwb2ludHMgKi8KKworICBpZiggc3RyY21wKCBhcmd2WyAxIF0sICJzaG93IiApID09IDAgKQorICB7CisgICAgZm9yKCB3aGljaF9icCA9IDE7IHdoaWNoX2JwIDw9IE1BWF9CUkVBS19QT0lOVFM7ICsrd2hpY2hfYnAgKQorICAgIHsKKworICAgICAgc3dpdGNoKCB3aGljaF9icCApCisgICAgICB7CisgICAgICBjYXNlIDE6IGFkZHIgPSBHRVRfQ01QQSgpOyBicmVhazsKKyAgICAgIGNhc2UgMjogYWRkciA9IEdFVF9DTVBCKCk7IGJyZWFrOworICAgICAgY2FzZSAzOiBhZGRyID0gR0VUX0NNUEMoKTsgYnJlYWs7CisgICAgICBjYXNlIDQ6IGFkZHIgPSBHRVRfQ01QRCgpOyBicmVhazsKKyAgICAgIH0KKworICAgICAgcHJpbnRmKCAiQnJlYWtwb2ludCBbJWRdOiAiLCB3aGljaF9icCApOworICAgICAgaWYoIGFkZHIgPT0gMCApCisJcHJpbnRmKCAiTk9UIFNFVFxuIiApOworICAgICAgZWxzZQorCWRpc3BwYyggKHVuc2lnbmVkIGNoYXIgKilhZGRyLCAwLCAxLCBiZWRidWdfcHV0cywgRl9SQURIRVggKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLyogU2V0IGEgYnJlYWtwb2ludCBhdCB0aGUgYWRkcmVzcyAqLworCisgIGlmKCAhaXNkaWdpdCggYXJndlsgMSBdWyAwIF0pKQorICB7CisgICAgY21kX3VzYWdlKGNtZHRwKTsKKyAgICByZXR1cm47CisgIH0KKworICBhZGRyID0gc2ltcGxlX3N0cnRvdWwoIGFyZ3ZbIDEgXSwgTlVMTCwgMTYgKSAmIDB4ZmZmZmZmZmM7CisKKyAgaWYoKCBidWdfY3R4LnNldCApICYmICggd2hpY2hfYnAgPSAoKmJ1Z19jdHguc2V0KSggMCwgYWRkciApKSA+IDAgKQorICB7CisgICAgcHJpbnRmKCAiQnJlYWtwb2ludCBbJWRdOiAiLCB3aGljaF9icCApOworICAgIGRpc3BwYyggKHVuc2lnbmVkIGNoYXIgKilhZGRyLCAwLCAxLCBiZWRidWdfcHV0cywgRl9SQURIRVggKTsKKyAgfQorCisgIHJldHVybjsKK30gLyogYmVkYnVnODYwX2RvX2JyZWFrICovCisKKworDAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSGFuZGxlIGEgYnJlYWtwb2ludC4gIEZpcnN0IGRldGVybWluZSB3aGljaCBicmVha3BvaW50IHdhcyBoaXQgYnkKKyAqIGxvb2tpbmcgYXQgdGhlIERlQnVnIFN0YXR1cyBSZWdpc3RlciAoREJTUiksIGNsZWFyIHRoZSBicmVha3BvaW50CisgKiBhbmQgZW50ZXIgYSBtaW5pIG1haW4gbG9vcC4gIFN0YXkgaW4gdGhlIGxvb3AgdW50aWwgdGhlIHN0b3BwZWQgZmxhZworICogaW4gdGhlIGRlYnVnIGNvbnRleHQgaXMgY2xlYXJlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBiZWRidWc4NjBfYnJlYWtfaXNyKCBzdHJ1Y3QgcHRfcmVncyAqcmVncyApCit7CisgIHVuc2lnbmVkIGxvbmcJYWRkcjsgICAgIC8qIEFkZHJlc3Mgc3RvcHBlZCBhdCAgICovCisgIHVuc2lnbmVkIGxvbmcJY2F1c2U7ICAgICAvKiBBZGRyZXNzIHN0b3BwZWQgYXQgICAqLworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIGNhdXNlID0gR0VUX0lDUigpOworCisgIGlmKCAhKGNhdXNlICYgMHgwMDAwMDAwNCkpIHsKKyAgICBwcmludGYoICJOb3QgYW4gaW5zdHJ1Y3Rpb24gYnJlYWtwb2ludCAoSUNSIDB4JTA4bHgpXG4iLCBjYXVzZSApOworICAgIHJldHVybjsKKyAgfQorCisgIGFkZHIgPSByZWdzLT5uaXA7CisKKyAgaWYoIGFkZHIgPT0gR0VUX0NNUEEoKSApCisgIHsKKyAgICBidWdfY3R4LmN1cnJlbnRfYnAgPSAxOworICB9CisgIGVsc2UgaWYoIGFkZHIgPT0gR0VUX0NNUEIoKSApCisgIHsKKyAgICBidWdfY3R4LmN1cnJlbnRfYnAgPSAyOworICB9CisgIGVsc2UgaWYoIGFkZHIgPT0gR0VUX0NNUEMoKSApCisgIHsKKyAgICBidWdfY3R4LmN1cnJlbnRfYnAgPSAzOworICB9CisgIGVsc2UgaWYoIGFkZHIgPT0gR0VUX0NNUEQoKSApCisgIHsKKyAgICBidWdfY3R4LmN1cnJlbnRfYnAgPSA0OworICB9CisKKyAgYmVkYnVnX21haW5fbG9vcCggYWRkciwgcmVncyApOworICByZXR1cm47Cit9IC8qIGJlZGJ1Zzg2MF9icmVha19pc3IgKi8KKworCisMCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb29rIHRocm91Z2ggYWxsIG9mIHRoZSBoYXJkd2FyZSBicmVha3BvaW50cyBhdmFpbGFibGUgdG8gc2VlIGlmIG9uZQorICogaXMgdW51c2VkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitpbnQgYmVkYnVnODYwX2ZpbmRfZW1wdHkoIHZvaWQgKQoreworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIGlmKCBHRVRfQ01QQSgpID09IDAgKQorICAgIHJldHVybiAxOworCisgIGlmKCBHRVRfQ01QQigpID09IDAgKQorICAgIHJldHVybiAyOworCisgIGlmKCBHRVRfQ01QQygpID09IDAgKQorICAgIHJldHVybiAzOworCisgIGlmKCBHRVRfQ01QRCgpID09IDAgKQorICAgIHJldHVybiA0OworCisgIHJldHVybiAwOworfSAvKiBiZWRidWc4NjBfZmluZF9lbXB0eSAqLworCisKKwwKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBhIGJyZWFrcG9pbnQuICBJZiAnd2hpY2hfYnAnIGlzIHplcm8gdGhlbiBmaW5kIGFuIHVudXNlZCBicmVha3BvaW50CisgKiBudW1iZXIsIG90aGVyd2lzZSByZWFzc2lnbiB0aGUgZ2l2ZW4gYnJlYWtwb2ludC4gIElmIGhhcmR3YXJlIGRlYnVnZ2luZworICogaXMgbm90IGVuYWJsZWQsIHRoZW4gdHVybiBpdCBvbiB2aWEgdGhlIE1TUiBhbmQgREJDUjAuICBTZXQgdGhlIGJyZWFrCisgKiBhZGRyZXNzIGluIHRoZSBhcHByb3ByaWF0ZSBJQUN4IHJlZ2lzdGVyIGFuZCBlbmFibGUgcHJvcGVyIGFkZHJlc3MKKyAqIGJlYWtwb2ludCBpbiBEQkNSMC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworaW50IGJlZGJ1Zzg2MF9zZXQoIGludCB3aGljaF9icCwgdW5zaWduZWQgbG9uZyBhZGRyICkKK3sKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAvKiBPbmx5IGxvb2sgaWYgd2hpY2hfYnAgPT0gMCwgZWxzZSB1c2Ugd2hpY2hfYnAgKi8KKyAgaWYoKCBidWdfY3R4LmZpbmRfZW1wdHkgKSAmJiAoICF3aGljaF9icCApICYmCisgICAgICggd2hpY2hfYnAgPSAoKmJ1Z19jdHguZmluZF9lbXB0eSkoKSkgPT0gMCApCisgIHsKKyAgICBwcmludGYoICJBbGwgYnJlYWtwb2ludHMgaW4gdXNlXG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiggd2hpY2hfYnAgPCAxIHx8IHdoaWNoX2JwID4gTUFYX0JSRUFLX1BPSU5UUyApCisgIHsKKyAgICBwcmludGYoICJJbnZhbGlkIGJyZWFrIHBvaW50ICMgJWRcbiIsIHdoaWNoX2JwICk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiggISBidWdfY3R4Lmh3X2RlYnVnX2VuYWJsZWQgKQorICB7CisgICAgYnVnX2N0eC5od19kZWJ1Z19lbmFibGVkID0gMTsKKyAgICBTRVRfREVSKCBHRVRfREVSKCkgfCAweDAwMDAwMDA0ICk7CisgIH0KKworICBzd2l0Y2goIHdoaWNoX2JwICkKKyAgeworICBjYXNlIDE6CisgICAgU0VUX0NNUEEoIGFkZHIgKTsKKyAgICBTRVRfSUNUUkwoIEdFVF9JQ1RSTCgpIHwgMHg4MDA4MDgwMCApOyAvKiBDVEE9RXF1YWwsSVcwPU1hdGNoIEEsU0lXMEVOICovCisgICAgYnJlYWs7CisKKyAgY2FzZSAyOgorICAgIFNFVF9DTVBCKCBhZGRyICk7CisgICAgU0VUX0lDVFJMKCBHRVRfSUNUUkwoKSB8IDB4MTAwMjA0MDAgKTsgLyogQ1RCPUVxdWFsLElXMT1NYXRjaCBCLFNJVzFFTiAqLworICAgIGJyZWFrOworCisgIGNhc2UgMzoKKyAgICBTRVRfQ01QQyggYWRkciApOworICAgIFNFVF9JQ1RSTCggR0VUX0lDVFJMKCkgfCAweDAyMDA4MjAwICk7IC8qIENUQz1FcXVhbCxJVzI9TWF0Y2ggQyxTSVcyRU4gKi8KKyAgICBicmVhazsKKworICBjYXNlIDQ6CisgICAgU0VUX0NNUEQoIGFkZHIgKTsKKyAgICBTRVRfSUNUUkwoIEdFVF9JQ1RSTCgpIHwgMHgwMDQwNDEwMCApOyAvKiBDVEQ9RXF1YWwsSVczPU1hdGNoIEQsU0lXM0VOICovCisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gd2hpY2hfYnA7Cit9IC8qIGJlZGJ1Zzg2MF9zZXQgKi8KKworCisMCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEaXNhYmxlIGEgc3BlY2lmaWMgYnJlYWtvaW50IGJ5IHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIElBQ3ggcmVnaXN0ZXIKKyAqIHRvIHplcm8gYW5kIGNsYXJpbmcgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MgYnJlYWtwb2ludCBpbiBEQkNSMC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworaW50IGJlZGJ1Zzg2MF9jbGVhciggaW50IHdoaWNoX2JwICkKK3sKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICBpZiggd2hpY2hfYnAgPCAxIHx8IHdoaWNoX2JwID4gTUFYX0JSRUFLX1BPSU5UUyApCisgIHsKKyAgICBwcmludGYoICJJbnZhbGlkIGJyZWFrIHBvaW50ICMgKCVkKVxuIiwgd2hpY2hfYnAgKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBzd2l0Y2goIHdoaWNoX2JwICkKKyAgeworICBjYXNlIDE6CisgICAgU0VUX0NNUEEoIDAgKTsKKyAgICBTRVRfSUNUUkwoIEdFVF9JQ1RSTCgpICYgfjB4ODAwODA4MDAgKTsgLyogQ1RBPUVxdWFsLElXMD1NYXRjaCBBLFNJVzBFTiAqLworICAgIGJyZWFrOworCisgIGNhc2UgMjoKKyAgICBTRVRfQ01QQiggMCApOworICAgIFNFVF9JQ1RSTCggR0VUX0lDVFJMKCkgJiB+MHgxMDAyMDQwMCApOyAvKiBDVEI9RXF1YWwsSVcxPU1hdGNoIEIsU0lXMUVOICovCisgICAgYnJlYWs7CisKKyAgY2FzZSAzOgorICAgIFNFVF9DTVBDKCAwICk7CisgICAgU0VUX0lDVFJMKCBHRVRfSUNUUkwoKSAmIH4weDAyMDA4MjAwICk7IC8qIENUQz1FcXVhbCxJVzI9TWF0Y2ggQyxTSVcyRU4gKi8KKyAgICBicmVhazsKKworICBjYXNlIDQ6CisgICAgU0VUX0NNUEQoIDAgKTsKKyAgICBTRVRfSUNUUkwoIEdFVF9JQ1RSTCgpICYgfjB4MDA0MDQxMDAgKTsgLyogQ1REPUVxdWFsLElXMz1NYXRjaCBELFNJVzNFTiAqLworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIDA7Cit9IC8qIGJlZGJ1Zzg2MF9jbGVhciAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvY29tbXByb2MuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2NvbW1wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3YTBkYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2NvbW1wcm9jLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZmRlZiBDT05GSUdfU1lTX0FMTE9DX0RQUkFNCisKK2ludCBkcHJhbV9pbml0ICh2b2lkKQoreworCS8qIFJlY2xhaW0gdGhlIERQIG1lbW9yeSBmb3Igb3VyIHVzZS4gKi8KKwlnZC0+ZHBfYWxsb2NfYmFzZSA9IENQTV9EQVRBT05MWV9CQVNFOworCWdkLT5kcF9hbGxvY190b3AgID0gQ1BNX0RBVEFPTkxZX0JBU0UgKyBDUE1fREFUQU9OTFlfU0laRTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5IGZyb20gdGhlIGR1YWwgcG9ydGVkIHJhbS4gIFdlIG1heSB3YW50IHRvCisgKiBlbmZvcmNlIGFsaWdubWVudCByZXN0cmljdGlvbnMsIGJ1dCByaWdodCBub3cgZXZlcnlvbmUgaXMgYSBnb29kCisgKiBjaXRpemVuLgorICovCit1aW50IGRwcmFtX2FsbG9jICh1aW50IHNpemUpCit7CisJdWludCBhZGRyID0gZ2QtPmRwX2FsbG9jX2Jhc2U7CisKKwlpZiAoKGdkLT5kcF9hbGxvY19iYXNlICsgc2l6ZSkgPj0gZ2QtPmRwX2FsbG9jX3RvcCkKKwkJcmV0dXJuIChDUE1fRFBfTk9TUEFDRSk7CisKKwlnZC0+ZHBfYWxsb2NfYmFzZSArPSBzaXplOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3VpbnQgZHByYW1fYmFzZSAodm9pZCkKK3sKKwlyZXR1cm4gZ2QtPmRwX2FsbG9jX2Jhc2U7Cit9CisKKy8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5IGZyb20gdGhlIGR1YWwgcG9ydGVkIHJhbS4gIFdlIG1heSB3YW50IHRvCisgKiBlbmZvcmNlIGFsaWdubWVudCByZXN0cmljdGlvbnMsIGJ1dCByaWdodCBub3cgZXZlcnlvbmUgaXMgYSBnb29kCisgKiBjaXRpemVuLgorICovCit1aW50IGRwcmFtX2FsbG9jX2FsaWduICh1aW50IHNpemUsIHVpbnQgYWxpZ24pCit7CisJdWludCBhZGRyLCBtYXNrID0gYWxpZ24gLSAxOworCisJYWRkciA9IChnZC0+ZHBfYWxsb2NfYmFzZSArIG1hc2spICYgfm1hc2s7CisKKwlpZiAoKGFkZHIgKyBzaXplKSA+PSBnZC0+ZHBfYWxsb2NfdG9wKQorCQlyZXR1cm4gKENQTV9EUF9OT1NQQUNFKTsKKworCWdkLT5kcF9hbGxvY19iYXNlID0gYWRkciArIHNpemU7CisKKwlyZXR1cm4gYWRkcjsKK30KKwordWludCBkcHJhbV9iYXNlX2FsaWduICh1aW50IGFsaWduKQoreworCXVpbnQgbWFzayA9IGFsaWduIC0gMTsKKworCXJldHVybiAoZ2QtPmRwX2FsbG9jX2Jhc2UgKyBtYXNrKSAmIH5tYXNrOworfQorI2VuZGlmCS8qIENPTkZJR19TWVNfQUxMT0NfRFBSQU0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1BPU1QpIHx8IGRlZmluZWQoQ09ORklHX0xPR0JVRkZFUikKKwordm9pZCBwb3N0X3dvcmRfc3RvcmUgKHVsb25nIGEpCit7CisJdm9sYXRpbGUgdm9pZCAqc2F2ZV9hZGRyID0KKwkJKChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUiktPmltX2NwbS5jcF9kcG1lbSArIENQTV9QT1NUX1dPUkRfQUREUjsKKworCSoodm9sYXRpbGUgdWxvbmcgKikgc2F2ZV9hZGRyID0gYTsKK30KKwordWxvbmcgcG9zdF93b3JkX2xvYWQgKHZvaWQpCit7CisJdm9sYXRpbGUgdm9pZCAqc2F2ZV9hZGRyID0KKwkJKChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUiktPmltX2NwbS5jcF9kcG1lbSArIENQTV9QT1NUX1dPUkRfQUREUjsKKworCXJldHVybiAqKHZvbGF0aWxlIHVsb25nICopIHNhdmVfYWRkcjsKK30KKworI2VuZGlmCS8qIENPTkZJR19QT1NUIHx8IENPTkZJR19MT0dCVUZGRVIqLworCisjaWZkZWYgQ09ORklHX0JPT1RDT1VOVF9MSU1JVAorCit2b2lkIGJvb3Rjb3VudF9zdG9yZSAodWxvbmcgYSkKK3sKKwl2b2xhdGlsZSB1bG9uZyAqc2F2ZV9hZGRyID0KKwkJKHZvbGF0aWxlIHVsb25nICopKCAoKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SKS0+aW1fY3BtLmNwX2RwbWVtICsKKwkJICAgICAgICAgICAgICAgICAgICBDUE1fQk9PVENPVU5UX0FERFIgKTsKKworCXNhdmVfYWRkclswXSA9IGE7CisJc2F2ZV9hZGRyWzFdID0gQk9PVENPVU5UX01BR0lDOworfQorCit1bG9uZyBib290Y291bnRfbG9hZCAodm9pZCkKK3sKKwl2b2xhdGlsZSB1bG9uZyAqc2F2ZV9hZGRyID0KKwkJKHZvbGF0aWxlIHVsb25nICopKCAoKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SKS0+aW1fY3BtLmNwX2RwbWVtICsKKwkJICAgICAgICAgICAgICAgICAgICBDUE1fQk9PVENPVU5UX0FERFIgKTsKKworCWlmIChzYXZlX2FkZHJbMV0gIT0gQk9PVENPVU5UX01BR0lDKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiBzYXZlX2FkZHJbMF07Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQk9PVENPVU5UX0xJTUlUICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9jb25maWcubWsgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0MGQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2NvbmZpZy5tawpAQCAtMCwwICsxLDI2IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMAorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitQTEFURk9STV9SRUxGTEFHUyArPSAtZlBJQyAtbWVhYmkKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfOHh4IC1mZml4ZWQtcjIgLW1zdHJpbmcgLW1jcHU9ODYwIC1tc29mdC1mbG9hdApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvY3B1LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWI4NDhiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvY3B1LmMKQEAgLTAsMCArMSw2NTQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogbTh4eC5jCisgKgorICogQ1BVIHNwZWNpZmljIGNvZGUKKyAqCisgKiB3cml0dGVuIG9yIGNvbGxlY3RlZCBhbmQgc29tZXRpbWVzIHJld3JpdHRlbiBieQorICogTWFnbnVzIERhbW0gPGRhbW1AYml0c21hcnQuY29tPgorICoKKyAqIG1pbm9yIG1vZGlmaWNhdGlvbnMgYnkKKyAqIFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1wYzh4eC5oPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSA8bmV0ZGV2Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZW5kaWYKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3N0YXRpYyBjaGFyICpjcHVfd2FybmluZyA9ICJcbiAgICAgICAgICIgXAorCSIqKiogV2FybmluZzogQ1BVIENvcmUgaGFzIFNpbGljb24gQnVncyAtLSBDaGVjayB0aGUgRXJyYXRhICoqKiI7CisKKyNpZiAoKGRlZmluZWQoQ09ORklHX01QQzg2eCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODU1KSkgJiYgXAorICAgICAhZGVmaW5lZChDT05GSUdfTVBDODYyKSkKKworc3RhdGljIGludCBjaGVja19DUFUgKGxvbmcgY2xvY2ssIHVpbnQgcHZyLCB1aW50IGltbXIpCit7CisJY2hhciAqaWRfc3RyID0KKyMgaWYgZGVmaW5lZChDT05GSUdfTVBDODU1KQorCSJQQzg1NSI7CisjIGVsaWYgZGVmaW5lZChDT05GSUdfTVBDODYwUCkKKwkiUEM4NjBQIjsKKyMgZWxzZQorCU5VTEw7CisjIGVuZGlmCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSAoaW1tciAmIDB4RkZGRjAwMDApOworCXVpbnQgaywgbTsKKwljaGFyIGJ1ZlszMl07CisJY2hhciBwcmUgPSAnWCc7CisJY2hhciAqbWlkID0gInh4IjsKKwljaGFyICpzdWY7CisKKwkvKiB0aGUgaGlnaGVzdCAxNiBiaXRzIHNob3VsZCBiZSAweDAwNTAgZm9yIGEgODYwICovCisKKwlpZiAoKHB2ciA+PiAxNikgIT0gMHgwMDUwKQorCQlyZXR1cm4gLTE7CisKKwlrID0gKGltbXIgPDwgMTYpIHwgKigodXNob3J0ICopICYgaW1tYXAtPmltX2NwbS5jcF9kcGFyYW1bMHhCMF0pOworCW0gPSAwOworCXN1ZiA9ICIiOworCisJLyoKKwkgKiBTb21lIGJvYXJkcyB1c2Ugc29ja2V0cyBzbyBkaWZmZXJlbnQgQ1BVcyBjYW4gYmUgdXNlZC4KKwkgKiBXZSBoYXZlIHRvIGNoZWNrIGNoaXAgdmVyc2lvbiBpbiBydW4gdGltZS4KKwkgKi8KKwlzd2l0Y2ggKGspIHsKKwljYXNlIDB4MDAwMjAwMDE6IHByZSA9ICdQJzsgYnJlYWs7CisJY2FzZSAweDAwMDMwMDAxOiBicmVhazsKKwljYXNlIDB4MDAxMjAwMDM6IHN1ZiA9ICJBIjsgYnJlYWs7CisJY2FzZSAweDAwMTMwMDAzOiBzdWYgPSAiQTMiOyBicmVhazsKKworCWNhc2UgMHgwMDIwMDAwNDogc3VmID0gIkIiOyBicmVhazsKKworCWNhc2UgMHgwMDMwMDAwNDogc3VmID0gIkMiOyBicmVhazsKKwljYXNlIDB4MDAzMTAwMDQ6IHN1ZiA9ICJDMSI7IG0gPSAxOyBicmVhazsKKworCWNhc2UgMHgwMDIwMDA2NDogbWlkID0gIlNSIjsgc3VmID0gIkIiOyBicmVhazsKKwljYXNlIDB4MDAzMDAwNjU6IG1pZCA9ICJTUiI7IHN1ZiA9ICJDIjsgYnJlYWs7CisJY2FzZSAweDAwMzEwMDY1OiBtaWQgPSAiU1IiOyBzdWYgPSAiQzEiOyBtID0gMTsgYnJlYWs7CisJY2FzZSAweDA1MDEwMDAwOiBzdWYgPSAiRDMiOyBtID0gMTsgYnJlYWs7CisJY2FzZSAweDA1MDIwMDAwOiBzdWYgPSAiRDQiOyBtID0gMTsgYnJlYWs7CisJCS8qIHRoaXMgdmFsdWUgaXMgbm90IGRvY3VtZW50ZWQgYW55d2hlcmUgKi8KKwljYXNlIDB4NDAwMDAwMDA6IHByZSA9ICdQJzsgc3VmID0gIkQiOyBtID0gMTsgYnJlYWs7CisJCS8qIE1QQzg2NlAvTVBDODY2VC9NUEM4NTlUL01QQzg1OURTTC9NUEM4NTJUICovCisJY2FzZSAweDA4MDEwMDA0OgkJLyogUmV2LiBBLjAgKi8KKwkJc3VmID0gIkEiOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDB4MDgwMDAwMDM6CQkvKiBSZXYuIDAuMyAqLworCQlwcmUgPSAnTSc7IG0gPSAxOworCQlpZiAoaWRfc3RyID09IE5VTEwpCisJCQlpZF9zdHIgPQorIyBpZiBkZWZpbmVkKENPTkZJR19NUEM4NTJUKQorCQkiUEM4NTJUIjsKKyMgZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4NTlUKQorCQkiUEM4NTlUIjsKKyMgZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4NTlEU0wpCisJCSJQQzg1OURTTCI7CisjIGVsaWYgZGVmaW5lZChDT05GSUdfTVBDODY2VCkKKwkJIlBDODY2VCI7CisjIGVsc2UKKwkJIlBDODY2eCI7IC8qIFVua25vd24gY2hpcCBmcm9tIE1QQzg2NiBmYW1pbHkgKi8KKyMgZW5kaWYKKwkJYnJlYWs7CisJY2FzZSAweDA5MDAwMDAwOiBwcmUgPSAnTSc7IG1pZCA9IHN1ZiA9ICIiOyBtID0gMTsKKwkJaWYgKGlkX3N0ciA9PSBOVUxMKQorCQkJaWRfc3RyID0gIlBDODg1IjsgLyogODcwLzg3NS84ODAvODg1ICovCisJCWJyZWFrOworCisJZGVmYXVsdDogc3VmID0gTlVMTDsgYnJlYWs7CisJfQorCisJaWYgKGlkX3N0ciA9PSBOVUxMKQorCQlpZF9zdHIgPSAiUEM4NngiOwkvKiBVbmtub3duIDg2eCBjaGlwICovCisJaWYgKHN1ZikKKwkJcHJpbnRmICgiJWMlcyVzWlBubiVzIiwgcHJlLCBpZF9zdHIsIG1pZCwgc3VmKTsKKwllbHNlCisJCXByaW50ZiAoInVua25vd24gTSVzICgweCUwOHgpIiwgaWRfc3RyLCBrKTsKKworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTXzh4eF9DUFVDTEtfTUlOKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfOHh4X0NQVUNMS19NQVgpCisJcHJpbnRmICgiIGF0ICVzIE1IeiBbJWQuJWQuLi4lZC4lZCBNSHpdXG4gICAgICAgIiwKKwkJc3RybWh6IChidWYsIGNsb2NrKSwKKwkJQ09ORklHX1NZU184eHhfQ1BVQ0xLX01JTiAvIDEwMDAwMDAsCisJCSgoQ09ORklHX1NZU184eHhfQ1BVQ0xLX01JTiAlIDEwMDAwMDApICsgNTAwMDApIC8gMTAwMDAwLAorCQlDT05GSUdfU1lTXzh4eF9DUFVDTEtfTUFYIC8gMTAwMDAwMCwKKwkJKChDT05GSUdfU1lTXzh4eF9DUFVDTEtfTUFYICUgMTAwMDAwMCkgKyA1MDAwMCkgLyAxMDAwMDAKKwkpOworI2Vsc2UKKwlwcmludGYgKCIgYXQgJXMgTUh6OiAiLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKyNlbmRpZgorCXByaW50ZiAoIiV1IGtCIEktQ2FjaGUgJXUga0IgRC1DYWNoZSIsCisJCWNoZWNraWNhY2hlICgpID4+IDEwLAorCQljaGVja2RjYWNoZSAoKSA+PiAxMAorCSk7CisKKwkvKiBkbyB3ZSBoYXZlIGEgRkVDICg4NjBUL1Agb3IgODUyLzg1OS84NjYvODg1KT8gKi8KKworCWltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9IDB4MTIzNDU2Nzg7CisJaWYgKGltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9PSAweDEyMzQ1Njc4KSB7CisJCXByaW50ZiAoIiBGRUMgcHJlc2VudCIpOworCX0KKworCWlmICghbSkgeworCQlwdXRzIChjcHVfd2FybmluZyk7CisJfQorCisJcHV0YyAoJ1xuJyk7CisKKyNpZmRlZiBERUJVRworCWlmKGNsb2NrICE9IG1lYXN1cmVfZ2NsaygpKSB7CisJICAgIHByaW50ZiAoImNsb2NrICVsZEh6ICE9ICVkSHpcbiIsIGNsb2NrLCBtZWFzdXJlX2djbGsoKSk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODYyKQorCitzdGF0aWMgaW50IGNoZWNrX0NQVSAobG9uZyBjbG9jaywgdWludCBwdnIsIHVpbnQgaW1tcikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIChpbW1yICYgMHhGRkZGMDAwMCk7CisJdWludCBrLCBtOworCWNoYXIgYnVmWzMyXTsKKwljaGFyIHByZSA9ICdYJzsKKwljaGFyICptaWQgPSAieHgiOworCWNoYXIgKnN1ZjsKKworCS8qIHRoZSBoaWdoZXN0IDE2IGJpdHMgc2hvdWxkIGJlIDB4MDA1MCBmb3IgYSA4eHggKi8KKworCWlmICgocHZyID4+IDE2KSAhPSAweDAwNTApCisJCXJldHVybiAtMTsKKworCWsgPSAoaW1tciA8PCAxNikgfCAqKCh1c2hvcnQgKikgJiBpbW1hcC0+aW1fY3BtLmNwX2RwYXJhbVsweEIwXSk7CisJbSA9IDA7CisKKwlzd2l0Y2ggKGspIHsKKworCQkvKiB0aGlzIHZhbHVlIGlzIG5vdCBkb2N1bWVudGVkIGFueXdoZXJlICovCisJY2FzZSAweDA2MDAwMDAwOiBtaWQgPSAiUCI7IHN1ZiA9ICIwIjsgYnJlYWs7CisJY2FzZSAweDA2MDEwMDAxOiBtaWQgPSAiUCI7IHN1ZiA9ICJBIjsgbSA9IDE7IGJyZWFrOworCWNhc2UgMHgwNzAwMDAwMzogbWlkID0gIlAiOyBzdWYgPSAiQiI7IG0gPSAxOyBicmVhazsKKwlkZWZhdWx0OiBzdWYgPSBOVUxMOyBicmVhazsKKwl9CisKKyNpZm5kZWYgQ09ORklHX01QQzg1NworCWlmIChzdWYpCisJCXByaW50ZiAoIiVjUEM4NjIlc1pQbm4lcyIsIHByZSwgbWlkLCBzdWYpOworCWVsc2UKKwkJcHJpbnRmICgidW5rbm93biBNUEM4NjIgKDB4JTA4eCkiLCBrKTsKKyNlbHNlCisJaWYgKHN1ZikKKwkJcHJpbnRmICgiJWNQQzg1N1RaUG5uJXMiLCBwcmUsIHN1Zik7IC8qIG9ubHkgODU3VCB0ZXN0ZWQgcmlnaHQgbm93ISAqLworCWVsc2UKKwkJcHJpbnRmICgidW5rbm93biBNUEM4NTcgKDB4JTA4eCkiLCBrKTsKKyNlbmRpZgorCisJcHJpbnRmICgiIGF0ICVzIE1IejoiLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKworCXByaW50ZiAoIiAldSBrQiBJLUNhY2hlIiwgY2hlY2tpY2FjaGUgKCkgPj4gMTApOworCXByaW50ZiAoIiAldSBrQiBELUNhY2hlIiwgY2hlY2tkY2FjaGUgKCkgPj4gMTApOworCisJLyogbGV0cyBjaGVjayBhbmQgc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgb24gYSA4NjJUIChvciBQPykgKi8KKworCWltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9IDB4MTIzNDU2Nzg7CisJaWYgKGltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9PSAweDEyMzQ1Njc4KSB7CisJCXByaW50ZiAoIiBGRUMgcHJlc2VudCIpOworCX0KKworCWlmICghbSkgeworCQlwdXRzIChjcHVfd2FybmluZyk7CisJfQorCisJcHV0YyAoJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODIzKQorCitzdGF0aWMgaW50IGNoZWNrX0NQVSAobG9uZyBjbG9jaywgdWludCBwdnIsIHVpbnQgaW1tcikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIChpbW1yICYgMHhGRkZGMDAwMCk7CisJdWludCBrLCBtOworCWNoYXIgYnVmWzMyXTsKKwljaGFyICpzdWY7CisKKwkvKiB0aGUgaGlnaGVzdCAxNiBiaXRzIHNob3VsZCBiZSAweDAwNTAgZm9yIGEgOHh4ICovCisKKwlpZiAoKHB2ciA+PiAxNikgIT0gMHgwMDUwKQorCQlyZXR1cm4gLTE7CisKKwlrID0gKGltbXIgPDwgMTYpIHwgKigodXNob3J0ICopICYgaW1tYXAtPmltX2NwbS5jcF9kcGFyYW1bMHhCMF0pOworCW0gPSAwOworCisJc3dpdGNoIChrKSB7CisJCS8qIE1QQzgyMyAqLworCWNhc2UgMHgyMDAwMDAwMDogc3VmID0gIjAiOyBicmVhazsKKwljYXNlIDB4MjAwMTAwMDA6IHN1ZiA9ICIwLjEiOyBicmVhazsKKwljYXNlIDB4MjAwMjAwMDA6IHN1ZiA9ICJaMi8zIjsgYnJlYWs7CisJY2FzZSAweDIwMDIwMDAxOiBzdWYgPSAiWjMiOyBicmVhazsKKwljYXNlIDB4MjEwMDAwMDA6IHN1ZiA9ICJBIjsgYnJlYWs7CisJY2FzZSAweDIxMDEwMDAwOiBzdWYgPSAiQiI7IG0gPSAxOyBicmVhazsKKwljYXNlIDB4MjEwMTAwMDE6IHN1ZiA9ICJCMiI7IG0gPSAxOyBicmVhazsKKwkJLyogTVBDODIzRSAqLworCWNhc2UgMHgyNDAxMDAwMDogc3VmID0gTlVMTDsKKwkJCXB1dHMgKCJQUEM4MjNFWlRubkIyIik7CisJCQltID0gMTsKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCQlzdWYgPSBOVUxMOworCQkJcHJpbnRmICgidW5rbm93biBNUEM4MjMgKDB4JTA4eCkiLCBrKTsKKwkJCWJyZWFrOworCX0KKwlpZiAoc3VmKQorCQlwcmludGYgKCJQUEM4MjNaVG5uJXMiLCBzdWYpOworCisJcHJpbnRmICgiIGF0ICVzIE1IejoiLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKworCXByaW50ZiAoIiAldSBrQiBJLUNhY2hlIiwgY2hlY2tpY2FjaGUgKCkgPj4gMTApOworCXByaW50ZiAoIiAldSBrQiBELUNhY2hlIiwgY2hlY2tkY2FjaGUgKCkgPj4gMTApOworCisJLyogbGV0cyBjaGVjayBhbmQgc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgb24gYSA4NjBUIChvciBQPykgKi8KKworCWltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9IDB4MTIzNDU2Nzg7CisJaWYgKGltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9PSAweDEyMzQ1Njc4KSB7CisJCXB1dHMgKCIgRkVDIHByZXNlbnQiKTsKKwl9CisKKwlpZiAoIW0pIHsKKwkJcHV0cyAoY3B1X3dhcm5pbmcpOworCX0KKworCXB1dGMgKCdcbicpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg1MCkKKworc3RhdGljIGludCBjaGVja19DUFUgKGxvbmcgY2xvY2ssIHVpbnQgcHZyLCB1aW50IGltbXIpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSAoaW1tciAmIDB4RkZGRjAwMDApOworCXVpbnQgaywgbTsKKwljaGFyIGJ1ZlszMl07CisKKwkvKiB0aGUgaGlnaGVzdCAxNiBiaXRzIHNob3VsZCBiZSAweDAwNTAgZm9yIGEgOHh4ICovCisKKwlpZiAoKHB2ciA+PiAxNikgIT0gMHgwMDUwKQorCQlyZXR1cm4gLTE7CisKKwlrID0gKGltbXIgPDwgMTYpIHwgKigodXNob3J0ICopICYgaW1tYXAtPmltX2NwbS5jcF9kcGFyYW1bMHhCMF0pOworCW0gPSAwOworCisJc3dpdGNoIChrKSB7CisJY2FzZSAweDIwMDIwMDAxOgorCQlwcmludGYgKCJYUEM4NTB4eFpUIik7CisJCWJyZWFrOworCWNhc2UgMHgyMTAwMDA2NToKKwkJcHJpbnRmICgiWFBDODUweHhaVEEiKTsKKwkJYnJlYWs7CisJY2FzZSAweDIxMDEwMDY3OgorCQlwcmludGYgKCJYUEM4NTB4eFpUQiIpOworCQltID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweDIxMDIwMDY4OgorCQlwcmludGYgKCJYUEM4NTB4eFpUQyIpOworCQltID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgidW5rbm93biBNUEM4NTAgKDB4JTA4eCkiLCBrKTsKKwl9CisJcHJpbnRmICgiIGF0ICVzIE1IejoiLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKworCXByaW50ZiAoIiAldSBrQiBJLUNhY2hlIiwgY2hlY2tpY2FjaGUgKCkgPj4gMTApOworCXByaW50ZiAoIiAldSBrQiBELUNhY2hlIiwgY2hlY2tkY2FjaGUgKCkgPj4gMTApOworCisJLyogbGV0cyBjaGVjayBhbmQgc2VlIGlmIHdlJ3JlIHJ1bm5pbmcgb24gYSA4NTBUIChvciBQPykgKi8KKworCWltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9IDB4MTIzNDU2Nzg7CisJaWYgKGltbWFwLT5pbV9jcG0uY3BfZmVjLmZlY19hZGRyX2xvdyA9PSAweDEyMzQ1Njc4KSB7CisJCXByaW50ZiAoIiBGRUMgcHJlc2VudCIpOworCX0KKworCWlmICghbSkgeworCQlwdXRzIChjcHVfd2FybmluZyk7CisJfQorCisJcHV0YyAoJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZXJyb3IgQ1BVIHVuZGVmaW5lZAorI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBjaGVja2NwdSAodm9pZCkKK3sKKwl1bG9uZyBjbG9jayA9IGdkLT5jcHVfY2xrOworCXVpbnQgaW1tciA9IGdldF9pbW1yICgwKTsJLyogUmV0dXJuIGZ1bGwgSU1NUiBjb250ZW50cyAqLworCXVpbnQgcHZyID0gZ2V0X3B2ciAoKTsKKworCXB1dHMgKCJDUFU6ICAgIik7CisKKwkvKiA4NTAgaGFzIFBBUlROVU0gMjAgKi8KKwkvKiA4MDEgaGFzIFBBUlROVU0gMTAgKi8KKwlyZXR1cm4gY2hlY2tfQ1BVIChjbG9jaywgcHZyLCBpbW1yKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogTDEgaS1jYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogdGhlIHN0YW5kYXJkIDg2MCBoYXMgMTI4IHNldHMgb2YgMTYgYnl0ZXMgaW4gMiB3YXlzICg9IDQga0IpICAgICAgICAgICAgICAqLworLyogdGhlIDg2MCBQIChwbHVzKSBoYXMgMjU2IHNldHMgb2YgMTYgYnl0ZXMgaW4gNCB3YXlzICg9IDE2IGtCKSAgICAgICAgICAgICAqLworCitpbnQgY2hlY2tpY2FjaGUgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworCXUzMiBjYWNoZW9uID0gcmRfaWNfY3N0ICgpICYgSURDX0VOQUJMRUQ7CisKKyNpZmRlZiBDT05GSUdfSVA4NngKKwl1MzIgayA9IG1lbWN0bC0+bWVtY19icjEgJiB+MHgwMDAwN2ZmZjsJLyogcHJvYmUgaW4gZmxhc2ggbWVtb3J5YXJlYSAqLworI2Vsc2UKKwl1MzIgayA9IG1lbWN0bC0+bWVtY19icjAgJiB+MHgwMDAwN2ZmZjsJLyogcHJvYmUgaW4gZmxhc2ggbWVtb3J5YXJlYSAqLworI2VuZGlmCisJdTMyIG07CisJdTMyIGxpbmVzID0gLTE7CisKKwl3cl9pY19jc3QgKElEQ19VTkFMTCk7CisJd3JfaWNfY3N0IChJRENfSU5WQUxMKTsKKwl3cl9pY19jc3QgKElEQ19ESVNBQkxFKTsKKwlfX2FzbV9fIHZvbGF0aWxlICgiaXN5bmMiKTsKKworCXdoaWxlICghKChtID0gcmRfaWNfY3N0ICgpKSAmIElEQ19DRVJSMikpIHsKKwkJd3JfaWNfYWRyIChrKTsKKwkJd3JfaWNfY3N0IChJRENfTERMQ0spOworCQlfX2FzbV9fIHZvbGF0aWxlICgiaXN5bmMiKTsKKworCQlsaW5lcysrOworCQlrICs9IDB4MTA7CQkJCS8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBjYWNoZWxpbmUgKi8KKwl9CisKKwl3cl9pY19jc3QgKElEQ19VTkFMTCk7CisJd3JfaWNfY3N0IChJRENfSU5WQUxMKTsKKworCWlmIChjYWNoZW9uKQorCQl3cl9pY19jc3QgKElEQ19FTkFCTEUpOworCWVsc2UKKwkJd3JfaWNfY3N0IChJRENfRElTQUJMRSk7CisKKwlfX2FzbV9fIHZvbGF0aWxlICgiaXN5bmMiKTsKKworCXJldHVybiBsaW5lcyA8PCA0OworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogTDEgZC1jYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogdGhlIHN0YW5kYXJkIDg2MCBoYXMgMTI4IHNldHMgb2YgMTYgYnl0ZXMgaW4gMiB3YXlzICg9IDQga0IpICAgICAgICAgICAgICAqLworLyogdGhlIDg2MCBQIChwbHVzKSBoYXMgMjU2IHNldHMgb2YgMTYgYnl0ZXMgaW4gMiB3YXlzICg9IDgga0IpICAgICAgICAgICAgICAqLworLyogY2FsbCB3aXRoIGNhY2hlIGRpc2FibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgY2hlY2tkY2FjaGUgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgbWVtY3RsOHh4X3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworCXUzMiBjYWNoZW9uID0gcmRfZGNfY3N0ICgpICYgSURDX0VOQUJMRUQ7CisKKyNpZmRlZiBDT05GSUdfSVA4NngKKwl1MzIgayA9IG1lbWN0bC0+bWVtY19icjEgJiB+MHgwMDAwN2ZmZjsJLyogcHJvYmUgaW4gZmxhc2ggbWVtb3J5YXJlYSAqLworI2Vsc2UKKwl1MzIgayA9IG1lbWN0bC0+bWVtY19icjAgJiB+MHgwMDAwN2ZmZjsJLyogcHJvYmUgaW4gZmxhc2ggbWVtb3J5YXJlYSAqLworI2VuZGlmCisJdTMyIG07CisJdTMyIGxpbmVzID0gLTE7CisKKwl3cl9kY19jc3QgKElEQ19VTkFMTCk7CisJd3JfZGNfY3N0IChJRENfSU5WQUxMKTsKKwl3cl9kY19jc3QgKElEQ19ESVNBQkxFKTsKKworCXdoaWxlICghKChtID0gcmRfZGNfY3N0ICgpKSAmIElEQ19DRVJSMikpIHsKKwkJd3JfZGNfYWRyIChrKTsKKwkJd3JfZGNfY3N0IChJRENfTERMQ0spOworCQlsaW5lcysrOworCQlrICs9IDB4MTA7CS8qIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBjYWNoZWxpbmUgKi8KKwl9CisKKwl3cl9kY19jc3QgKElEQ19VTkFMTCk7CisJd3JfZGNfY3N0IChJRENfSU5WQUxMKTsKKworCWlmIChjYWNoZW9uKQorCQl3cl9kY19jc3QgKElEQ19FTkFCTEUpOworCWVsc2UKKwkJd3JfZGNfY3N0IChJRENfRElTQUJMRSk7CisKKwlyZXR1cm4gbGluZXMgPDwgNDsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCB1cG1jb25maWcgKHVpbnQgdXBtLCB1aW50ICogdGFibGUsIHVpbnQgc2l6ZSkKK3sKKwl1aW50IGk7CisJdWludCBhZGRyID0gMDsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBtZW1jdGw4eHhfdCAqbWVtY3RsID0gJmltbWFwLT5pbV9tZW1jdGw7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCW1lbWN0bC0+bWVtY19tZHIgPSB0YWJsZVtpXTsJLyogKDE2LTE1KSAqLworCQltZW1jdGwtPm1lbWNfbWNyID0gYWRkciB8IHVwbTsJLyogKDE2LTE2KSAqLworCQlhZGRyKys7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgQ09ORklHX0xXTU9OCisKK2ludCBkb19yZXNldCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdWxvbmcgbXNyLCBhZGRyOworCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisKKwlpbW1hcC0+aW1fY2xrcnN0LmNhcl9wbHByY3IgfD0gUExQUkNSX0NTUjsJLyogQ2hlY2tzdG9wIFJlc2V0IGVuYWJsZSAqLworCisJLyogSW50ZXJydXB0cyBhbmQgTU1VIG9mZiAqLworCV9fYXNtX18gdm9sYXRpbGUgKCJtdHNwciAgICA4MSwgMCIpOworCV9fYXNtX18gdm9sYXRpbGUgKCJtZm1zciAgICAlMCI6Ij1yIiAobXNyKSk7CisKKwltc3IgJj0gfjB4MTAzMDsKKwlfX2FzbV9fIHZvbGF0aWxlICgibXRtc3IgICAgJTAiOjoiciIgKG1zcikpOworCisJLyoKKwkgKiBUcnlpbmcgdG8gZXhlY3V0ZSB0aGUgbmV4dCBpbnN0cnVjdGlvbiBhdCBhIG5vbi1leGlzdGluZyBhZGRyZXNzCisJICogc2hvdWxkIGNhdXNlIGEgbWFjaGluZSBjaGVjaywgcmVzdWx0aW5nIGluIHJlc2V0CisJICovCisjaWZkZWYgQ09ORklHX1NZU19SRVNFVF9BRERSRVNTCisJYWRkciA9IENPTkZJR19TWVNfUkVTRVRfQUREUkVTUzsKKyNlbHNlCisJLyoKKwkgKiBub3RlOiB3aGVuIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFIHBvaW50cyB0byBhIFJBTSBhZGRyZXNzLCBDT05GSUdfU1lTX01PTklUT1JfQkFTRQorCSAqIC0gc2l6ZW9mICh1bG9uZykgaXMgdXN1YWxseSBhIHZhbGlkIGFkZHJlc3MuIEJldHRlciBwaWNrIGFuIGFkZHJlc3MKKwkgKiBrbm93biB0byBiZSBpbnZhbGlkIG9uIHlvdXIgc3lzdGVtIGFuZCBhc3NpZ24gaXQgdG8gQ09ORklHX1NZU19SRVNFVF9BRERSRVNTLgorCSAqICIodWxvbmcpLTEiIHVzZWQgdG8gYmUgYSBnb29kIGNob2ljZSBmb3IgbWFueSBzeXN0ZW1zLi4uCisJICovCisJYWRkciA9IENPTkZJR19TWVNfTU9OSVRPUl9CQVNFIC0gc2l6ZW9mICh1bG9uZyk7CisjZW5kaWYKKwkoKHZvaWQgKCopKHZvaWQpKSBhZGRyKSAoKTsKKwlyZXR1cm4gMTsKK30KKworI2Vsc2UJLyogQ09ORklHX0xXTU9OICovCisKKy8qCisgKiBPbiB0aGUgTFdNT04gYm9hcmQsIHRoZSBNQ0xSIHJlc2V0IGlucHV0IG9mIHRoZSBQSUMncyBvbiB0aGUgYm9hcmQKKyAqIHVzZXMgYSA0N0svMW4gUkMgY29tYmluYXRpb24gd2hpY2ggaGFzIGEgNDd1cyB0aW1lICBjb25zdGFudC4gIFRoZQorICogbG93ICBzaWduYWwgb24gdGhlIEhSRVNFVCBwaW4gb2YgdGhlIENQVSBpcyBvbmx5IDUxMiBjbG9ja3MgPSA4IHVzCisgKiBhbmQgdGh1cyB0b28gc2hvcnQgdG8gcmVzZXQgdGhlIGV4dGVybmFsIGhhcmR3YXJlLiBTbyB3ZSAgdXNlICB0aGUKKyAqIHdhdGNoZG9nIHRvIHJlc2V0IHRoZSBib2FyZC4KKyAqLworaW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwkvKiBwcmV2ZW50IHRyaWdnZXJpbmcgdGhlIHdhdGNoZG9nICovCisJZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJLyogbWFrZSBzdXJlIHRoZSB3YXRjaGRvZyBpcyBydW5uaW5nICovCisJcmVzZXRfOHh4X3dhdGNoZG9nICgoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVIpOworCisJLyogd2FpdCBmb3Igd2F0Y2hkb2cgcmVzZXQgKi8KKwl3aGlsZSAoMSkge307CisKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfTFdNT04gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogR2V0IHRpbWViYXNlIGNsb2NrIGZyZXF1ZW5jeSAobGlrZSBjcHVfY2xrIGluIEh6KQorICoKKyAqIFNlZSBzZWN0aW9ucyAxNC4yIGFuZCAxNC42IG9mIHRoZSBVc2VyJ3MgTWFudWFsCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RiY2xrICh2b2lkKQoreworCXVpbnQgaW1tciA9IGdldF9pbW1yICgwKTsJLyogUmV0dXJuIGZ1bGwgSU1NUiBjb250ZW50cyAqLworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKHZvbGF0aWxlIGltbWFwX3QgKikoaW1tciAmIDB4RkZGRjAwMDApOworCXVsb25nIG9zY2NsaywgZmFjdG9yLCBwbGw7CisKKwlpZiAoaW1tYXAtPmltX2Nsa3JzdC5jYXJfc2NjciAmIFNDQ1JfVEJTKSB7CisJCXJldHVybiAoZ2QtPmNwdV9jbGsgLyAxNik7CisJfQorCisJcGxsID0gaW1tYXAtPmltX2Nsa3JzdC5jYXJfcGxwcmNyOworCisjZGVmaW5lIFBMUFJDUl92YWwoYSkgKChwbGwgJiBQTFBSQ1JfICMjIGEgIyMgX01TSykgPj4gUExQUkNSXyAjIyBhICMjIF9TSElGVCkKKworCS8qCisJICogRm9yIG5ld2VyIFBRMSBjaGlwcyAoTVBDODY2Lzg3eC84OHggZmFtaWxpZXMpLCBQTEwgbXVsdGlwbGljYXRpb24KKwkgKiBmYWN0b3IgaXMgY2FsY3VsYXRlZCBhcyBmb2xsb3dzOgorCSAqCisJICoJCSAgICAgTUZOCisJICoJICAgICBNRkkgKyAtLS0tLS0tCisJICoJCSAgIE1GRCArIDEKKwkgKiBmYWN0b3IgPSAgLS0tLS0tLS0tLS0tLS0tLS0KKwkgKgkgICAgIChQREYgKyAxKSAqIDJeUworCSAqCisJICogRm9yIG9sZGVyIGNoaXBzLCBpdCdzIGp1c3QgTUYgZmllbGQgb2YgUExQUkNSIHBsdXMgb25lLgorCSAqLworCWlmICgoaW1tciAmIDB4MEZGRikgPj0gTVBDOHh4X05FV19DTEspIHsgLyogTVBDODY2Lzg3eC84OHggc2VyaWVzICovCisJCWZhY3RvciA9IChQTFBSQ1JfdmFsKE1GSSkgKyBQTFBSQ1JfdmFsKE1GTikvKFBMUFJDUl92YWwoTUZEKSsxKSkvCisJCQkoUExQUkNSX3ZhbChQREYpKzEpIC8gKDE8PFBMUFJDUl92YWwoUykpOworCX0gZWxzZSB7CisJCWZhY3RvciA9IFBMUFJDUl92YWwoTUYpKzE7CisJfQorCisJb3NjY2xrID0gZ2QtPmNwdV9jbGsgLyBmYWN0b3I7CisKKwlpZiAoKGltbWFwLT5pbV9jbGtyc3QuY2FyX3NjY3IgJiBTQ0NSX1JUU0VMKSA9PSAwIHx8IGZhY3RvciA+IDIpIHsKKwkJcmV0dXJuIChvc2NjbGsgLyA0KTsKKwl9CisJcmV0dXJuIChvc2NjbGsgLyAxNik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQordm9pZCB3YXRjaGRvZ19yZXNldCAodm9pZCkKK3sKKwlpbnQgcmVfZW5hYmxlID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJcmVzZXRfOHh4X3dhdGNoZG9nICgoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVIpOworCWlmIChyZV9lbmFibGUpCisJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOworfQorI2VuZGlmIC8qIENPTkZJR19XQVRDSERPRyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX0xXTU9OKQorCit2b2lkIHJlc2V0Xzh4eF93YXRjaGRvZyAodm9sYXRpbGUgaW1tYXBfdCAqIGltbXIpCit7CisjIGlmIGRlZmluZWQoQ09ORklHX0xXTU9OKQorCS8qCisJICogVGhlIExXTU9OIGJvYXJkIHVzZXMgYSBNQVg2MzAxIFdhdGNoZG9nCisJICogd2l0aCB0aGUgdHJpZ2dlciBwaW4gY29ubmVjdGVkIHRvIHBvcnQgUEEuNworCSAqCisJICogKFRoZSBvbGQgYm9hcmQgdmVyc2lvbiB1c2VkIGEgTUFYNzA2VEVTQSBXYXRjaGRvZywgd2hpY2gKKwkgKiBoYWQgdG8gYmUgaGFuZGxlZCBleGFjdGx5IHRoZSBzYW1lLikKKwkgKi8KKyMgZGVmaW5lIFdBVENIRE9HX0JJVAkweDAxMDAKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhcGFyICY9IH4oV0FUQ0hET0dfQklUKTsJLyogR1BJTyAgICAgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyIHw9IFdBVENIRE9HX0JJVDsJLyogT3V0cHV0ICAgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3Bhb2RyICY9IH4oV0FUQ0hET0dfQklUKTsJLyogYWN0aXZlIG91dHB1dCAqLworCisJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRhdCBePSBXQVRDSERPR19CSVQ7CS8qIFRvZ2dsZSBXREkgICAqLworIyBlbGlmIGRlZmluZWQoQ09ORklHX0tVUDRLKSB8fCBkZWZpbmVkKENPTkZJR19LVVA0WCkKKwkvKgorCSAqIFRoZSBLVVA0IGJvYXJkcyB1c2VzIGEgVFBTMzcwNSBXYXRjaGRvZworCSAqIHdpdGggdGhlIHRyaWdnZXIgcGluIGNvbm5lY3RlZCB0byBwb3J0IFBBLjUKKwkgKi8KKyMgZGVmaW5lIFdBVENIRE9HX0JJVAkweDA0MDAKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhcGFyICY9IH4oV0FUQ0hET0dfQklUKTsJLyogR1BJTyAgICAgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyIHw9IFdBVENIRE9HX0JJVDsJLyogT3V0cHV0ICAgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3Bhb2RyICY9IH4oV0FUQ0hET0dfQklUKTsJLyogYWN0aXZlIG91dHB1dCAqLworCisJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRhdCBePSBXQVRDSERPR19CSVQ7CS8qIFRvZ2dsZSBXREkgICAqLworIyBlbHNlCisJLyoKKwkgKiBBbGwgb3RoZXIgYm9hcmRzIHVzZSB0aGUgTVBDOHh4IEludGVybmFsIFdhdGNoZG9nCisJICovCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc3dzciA9IDB4NTU2YzsJLyogd3JpdGUgbWFnaWMxICovCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc3dzciA9IDB4YWEzOTsJLyogd3JpdGUgbWFnaWMyICovCisjIGVuZGlmIC8qIENPTkZJR19MV01PTiAqLworfQorI2VuZGlmIC8qIENPTkZJR19XQVRDSERPRyAqLworCisvKgorICogSW5pdGlhbGl6ZXMgb24tY2hpcCBldGhlcm5ldCBjb250cm9sbGVycy4KKyAqIHRvIG92ZXJyaWRlLCBpbXBsZW1lbnQgYm9hcmRfZXRoX2luaXQoKQorICovCitpbnQgY3B1X2V0aF9pbml0KGJkX3QgKmJpcykKK3sKKyNpZiBkZWZpbmVkKFNDQ19FTkVUKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkVUKQorCXNjY19pbml0aWFsaXplKGJpcyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKEZFQ19FTkVUKQorCWZlY19pbml0aWFsaXplKGJpcyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2NwdV9pbml0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9jcHVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMDA5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9jcHVfaW5pdC5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisKKyNpbmNsdWRlIDxtcGM4eHguaD4KKyNpbmNsdWRlIDxjb21tcHJvYy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX1JUQ1NDKSB8fCBkZWZpbmVkKENPTkZJR19TWVNfUk1EUykKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfSTJDX1VDT0RFX1BBVENIKSB8fCBkZWZpbmVkKENPTkZJR19TWVNfU1BJX1VDT0RFX1BBVENIKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfU1lTX1NNQ19VQ09ERV9QQVRDSCkKK3ZvaWQgY3BtX2xvYWRfcGF0Y2ggKHZvbGF0aWxlIGltbWFwX3QgKiBpbW1yKTsKKyNlbmRpZgorCisvKgorICogQnJlYXRoIHNvbWUgbGlmZSBpbnRvIHRoZSBDUFUuLi4KKyAqCisgKiBTZXQgdXAgdGhlIG1lbW9yeSBtYXAsCisgKiBpbml0aWFsaXplIGEgYnVuY2ggb2YgcmVnaXN0ZXJzLAorICogaW5pdGlhbGl6ZSB0aGUgVVBNJ3MKKyAqLwordm9pZCBjcHVfaW5pdF9mICh2b2xhdGlsZSBpbW1hcF90ICogaW1tcikKK3sKKyNpZm5kZWYgQ09ORklHX01CWAorCXZvbGF0aWxlIG1lbWN0bDh4eF90ICptZW1jdGwgPSAmaW1tci0+aW1fbWVtY3RsOworIyBpZmRlZiBDT05GSUdfU1lTX1BMUFJDUgorCXVsb25nIG1mbWFzazsKKyMgZW5kaWYKKyNlbmRpZgorCXVsb25nIHJlZzsKKworCS8qIFNZUENSIC0gY29udGFpbnMgd2F0Y2hkb2cgY29udHJvbCAoMTEtOSkgKi8KKworCWltbXItPmltX3NpdV9jb25mLnNjX3N5cGNyID0gQ09ORklHX1NZU19TWVBDUjsKKworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCXJlc2V0Xzh4eF93YXRjaGRvZyAoaW1tcik7CisjZW5kaWYgLyogQ09ORklHX1dBVENIRE9HICovCisKKwkvKiBTSVVNQ1IgLSBjb250YWlucyBkZWJ1ZyBwaW4gY29uZmlndXJhdGlvbiAoMTEtNikgKi8KKyNpZm5kZWYgQ09ORklHX1NWTV9TQzh4eAorCWltbXItPmltX3NpdV9jb25mLnNjX3NpdW1jciB8PSBDT05GSUdfU1lTX1NJVU1DUjsKKyNlbHNlCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyID0gQ09ORklHX1NZU19TSVVNQ1I7CisjZW5kaWYKKwkvKiBpbml0aWFsaXplIHRpbWViYXNlIHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlciAoMTEtMjYpICovCisJLyogdW5sb2NrIFRCU0NSSyAqLworCisJaW1tci0+aW1fc2l0ay5zaXRrX3Ric2NyayA9IEtBUFdSX0tFWTsKKwlpbW1yLT5pbV9zaXQuc2l0X3Ric2NyID0gQ09ORklHX1NZU19UQlNDUjsKKworCS8qIGluaXRpYWxpemUgdGhlIFBJVCAoMTEtMzEpICovCisKKwlpbW1yLT5pbV9zaXRrLnNpdGtfcGlzY3JrID0gS0FQV1JfS0VZOworCWltbXItPmltX3NpdC5zaXRfcGlzY3IgPSBDT05GSUdfU1lTX1BJU0NSOworCisJLyogU3lzdGVtIGludGVncmF0aW9uIHRpbWVycy4gRG9uJ3QgY2hhbmdlIEVCREYhICgxNS0yNykgKi8KKworCWltbXItPmltX2Nsa3JzdGsuY2Fya19zY2NyayA9IEtBUFdSX0tFWTsKKwlyZWcgPSBpbW1yLT5pbV9jbGtyc3QuY2FyX3NjY3I7CisJcmVnICY9IFNDQ1JfTUFTSzsKKwlyZWcgfD0gQ09ORklHX1NZU19TQ0NSOworCWltbXItPmltX2Nsa3JzdC5jYXJfc2NjciA9IHJlZzsKKworCS8qIFBMTCAoQ1BVIGNsb2NrKSBzZXR0aW5ncyAoMTUtMzApICovCisKKwlpbW1yLT5pbV9jbGtyc3RrLmNhcmtfcGxwcmNyayA9IEtBUFdSX0tFWTsKKworI2lmbmRlZiBDT05GSUdfTUJYCQkvKiBNQlggYm9hcmQgZG9lcyB0aGluZ3MgZGlmZmVyZW50ICovCisKKwkvKiBJZiBDT05GSUdfU1lTX1BMUFJDUiAoc2V0IGluIHRoZSB2YXJpb3VzICpfY29uZmlnLmggZmlsZXMpIHRyaWVzIHRvCisJICogc2V0IHRoZSBNRiBmaWVsZCwgdGhlbiBqdXN0IGNvcHkgQ09ORklHX1NZU19QTFBSQ1Igb3ZlciBjYXJfcGxwcmNyLAorCSAqIG90aGVyd2lzZSBPUiBpbiBDT05GSUdfU1lTX1BMUFJDUiBzbyB3ZSBkbyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IE1GCisJICogZmllbGQgdmFsdWUuCisJICoKKwkgKiBGb3IgbmV3ZXIgKHN0YXJ0aW5nIE1QQzg2NikgY2hpcHMgUExQUkNSIGxheW91dCBpcyBkaWZmZXJlbnQuCisJICovCisjaWZkZWYgQ09ORklHX1NZU19QTFBSQ1IKKwlpZiAoZ2V0X2ltbXIoMHhGRkZGKSA+PSBNUEM4eHhfTkVXX0NMSykKKwkgICBtZm1hc2sgPSBQTFBSQ1JfTUZBQ1RfTVNLOworCWVsc2UKKwkgICBtZm1hc2sgPSBQTFBSQ1JfTUZfTVNLOworCisJaWYgKChDT05GSUdfU1lTX1BMUFJDUiAmIG1mbWFzaykgIT0gMCkKKwkgICByZWcgPSBDT05GSUdfU1lTX1BMUFJDUjsJCQkvKiByZXNldCBjb250cm9sIGJpdHMgICAqLworCWVsc2UgeworCSAgIHJlZyA9IGltbXItPmltX2Nsa3JzdC5jYXJfcGxwcmNyOworCSAgIHJlZyAmPSBtZm1hc2s7CQkJLyogaXNvbGF0ZSBNRi1yZWxhdGVkIGZpZWxkcyAqLworCSAgIHJlZyB8PSBDT05GSUdfU1lTX1BMUFJDUjsJCQkvKiByZXNldCBjb250cm9sIGJpdHMgICAqLworCX0KKwlpbW1yLT5pbV9jbGtyc3QuY2FyX3BscHJjciA9IHJlZzsKKyNlbmRpZgorCisJLyoKKwkgKiBNZW1vcnkgQ29udHJvbGxlcjoKKwkgKi8KKworCS8qIHBlcmZvcm0gQlIwIHJlc2V0IHRoYXQgTVBDODUwIFJldi4gQSBjYW4ndCBndWFyYW50ZWUgKi8KKwlyZWcgPSBtZW1jdGwtPm1lbWNfYnIwOworCXJlZyAmPSBCUl9QU19NU0s7CS8qIENsZWFyIGV2ZXJ5dGhpbmcgZXhjZXB0IFBvcnQgU2l6ZSBiaXRzICovCisJcmVnIHw9IEJSX1Y7CQkvKiB0aGVuIGFkZCBqdXN0IHRoZSAiQmFuayBWYWxpZCIgYml0ICAgICAqLworCW1lbWN0bC0+bWVtY19icjAgPSByZWc7CisKKwkvKiBNYXAgYmFua3MgMCAoYW5kIG1heWJlIDEpIHRvIHRoZSBGTEFTSCBiYW5rcyAwIChhbmQgMSkgYXQKKwkgKiBwcmVsaW1pbmFyeSBhZGRyZXNzZXMgLSB0aGVzZSBoYXZlIHRvIGJlIG1vZGlmaWVkIGxhdGVyCisJICogd2hlbiBGTEFTSCBzaXplIGhhcyBiZWVuIGRldGVybWluZWQKKwkgKgorCSAqIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbiBkZWZpbmVkIGJ5CisJICogQ09ORklHX1NZU19PUjBfUkVNQVAgc29tZSBib2FyZHMgKHdpZGUgYWRkcmVzcyBtYXNrKSBhbGxvdyB0byBtYXAgdGhlCisJICogQ09ORklHX1NZU19NT05JVE9SX0JBU0UsIHdoaWxlIG90aGVycyAobmFycm93ZXIgYWRkcmVzcyBtYXNrKSBjYW4ndAorCSAqIG1hcCBDT05GSUdfU1lTX01PTklUT1JfQkFTRS4KKwkgKgorCSAqIEZvciBleGFtcGxlLCBmb3IgQ09ORklHX0lWTVM4LCB0aGUgQ09ORklHX1NZU19NT05JVE9SX0JBU0UgaXMKKwkgKiAweGZmMDAwMDAwLCBidXQgQ09ORklHX1NZU19PUjBfUkVNQVAncyBhZGRyZXNzIG1hc2sgaXMgMHhmZmY4MDAwMC4KKwkgKgorCSAqIElmIEJSMCB3YXNuJ3QgbG9hZGVkIHdpdGggYWRkcmVzcyBiYXNlIDB4ZmYwMDAwMDAsIHRoZW4gQlIwJ3MKKwkgKiBiYXNlIGFkZHJlc3MgcmVtYWlucyBhcyAweDAwMDAwMDAwLiBIb3dldmVyLCB0aGUgYWRkcmVzcyBtYXNrCisJICogaGF2ZSBiZWVuIG5hcnJvd2VkIHRvIDUxMktiLCBzbyBDT05GSUdfU1lTX01PTklUT1JfQkFTRSB3YXNuJ3QgbWFwcGVkCisJICogaW50byB0aGUgQmFuazAuCisJICoKKwkgKiBUaGlzIGlzIHdoeSBDT05GSUdfSVZNUzggYW5kIHNpbWlsYXIgYm9hcmRzIG11c3QgbG9hZCBCUjAgd2l0aAorCSAqIENPTkZJR19TWVNfQlIwX1BSRUxJTSBpbiBhZHZhbmNlLgorCSAqCisJICogW1RoYW5rcyB0byBNaWNoYWVsIExpYW8gZm9yIHRoaXMgZXhwbGFuYXRpb24uCisJICogIEkgb3dlIGhpbSBhIGZyZWUgYmVlci4gLSB3ZF0KKwkgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0dUSCkJICAgICAgICB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSEVSTUVTKQl8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSUNVODYyKQl8fCBcCisgICAgZGVmaW5lZChDT05GSUdfSVA4NjApCXx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19JVk1MMjQpCXx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19JVk1TOCkJfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0xXTU9OKQl8fCBcCisgICAgZGVmaW5lZChDT05GSUdfTUhQQykJfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1BDVV9FKQl8fCBcCisgICAgZGVmaW5lZChDT05GSUdfUjM2ME1QSSkJfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1JNVSkJCXx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19SUFhDTEFTU0lDKQl8fCBcCisgICAgZGVmaW5lZChDT05GSUdfUlBYTElURSkJfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1NQQzE5MjApCXx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19TUEQ4MjNUUykKKworCW1lbWN0bC0+bWVtY19icjAgPSBDT05GSUdfU1lTX0JSMF9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19PUjBfUkVNQVApCisJbWVtY3RsLT5tZW1jX29yMCA9IENPTkZJR19TWVNfT1IwX1JFTUFQOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX09SMV9SRU1BUCkKKwltZW1jdGwtPm1lbWNfb3IxID0gQ09ORklHX1NZU19PUjFfUkVNQVA7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1I1X1JFTUFQKQorCW1lbWN0bC0+bWVtY19vcjUgPSBDT05GSUdfU1lTX09SNV9SRU1BUDsKKyNlbmRpZgorCisJLyogbm93IHJlc3RyaWN0IHRvIHByZWxpbWluYXJ5IHJhbmdlICovCisJbWVtY3RsLT5tZW1jX2JyMCA9IENPTkZJR19TWVNfQlIwX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfb3IwID0gQ09ORklHX1NZU19PUjBfUFJFTElNOworCisjaWYgKGRlZmluZWQoQ09ORklHX1NZU19PUjFfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfQlIxX1BSRUxJTSkpCisJbWVtY3RsLT5tZW1jX29yMSA9IENPTkZJR19TWVNfT1IxX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIxID0gQ09ORklHX1NZU19CUjFfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19JUDg2MCkgLyogZGlzYWJsZSBDUzAgbm93IHRoYXQgRmxhc2ggaXMgbWFwcGVkIG9uIENTMSAqLworCW1lbWN0bC0+bWVtY19icjAgPSAwOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1IyX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0JSMl9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yMiA9IENPTkZJR19TWVNfT1IyX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIyID0gQ09ORklHX1NZU19CUjJfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1IzX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0JSM19QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yMyA9IENPTkZJR19TWVNfT1IzX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIzID0gQ09ORklHX1NZU19CUjNfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1I0X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0JSNF9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNCA9IENPTkZJR19TWVNfT1I0X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI0ID0gQ09ORklHX1NZU19CUjRfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1I1X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0JSNV9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNSA9IENPTkZJR19TWVNfT1I1X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI1ID0gQ09ORklHX1NZU19CUjVfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1I2X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0JSNl9QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNiA9IENPTkZJR19TWVNfT1I2X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI2ID0gQ09ORklHX1NZU19CUjZfUFJFTElNOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT1I3X1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0JSN19QUkVMSU0pCisJbWVtY3RsLT5tZW1jX29yNyA9IENPTkZJR19TWVNfT1I3X1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnI3ID0gQ09ORklHX1NZU19CUjdfUFJFTElNOworI2VuZGlmCisKKyNlbmRpZiAvKiAhIENPTkZJR19NQlggKi8KKworCS8qCisJICogUmVzZXQgQ1BNCisJICovCisJaW1tci0+aW1fY3BtLmNwX2NwY3IgPSBDUE1fQ1JfUlNUIHwgQ1BNX0NSX0ZMRzsKKwlkbyB7CQkJLyogU3BpbiB1bnRpbCBjb21tYW5kIHByb2Nlc3NlZCAgICAgKi8KKwkJX19hc21fXyAoImVpZWlvIik7CisJfSB3aGlsZSAoaW1tci0+aW1fY3BtLmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKKworI2lmZGVmIENPTkZJR19NQlgKKwkvKgorCSAqIG9uIHRoZSBNQlgsIHRoaW5ncyBhcmUgYSBsaXR0bGUgYml0IGRpZmZlcmVudDoKKwkgKiAtIHdlIG5lZWQgdG8gcmVhZCB0aGUgVlBEIHRvIGdldCBib2FyZCBpbmZvcm1hdGlvbgorCSAqIC0gdGhlIHBscHJjciBpcyBzZXQgdXAgZHluYW1pY2FsbHkKKwkgKiAtIHRoZSBtZW1vcnkgY29udHJvbGxlciBpcyBzZXQgdXAgZHluYW1pY2FsbHkKKwkgKi8KKwltYnhfaW5pdCAoKTsKKyNlbmRpZiAvKiBDT05GSUdfTUJYICovCisKKyNpZmRlZiBDT05GSUdfUlBYQ0xBU1NJQworCXJweGNsYXNzaWNfaW5pdCAoKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUlBYTElURSkgJiYgZGVmaW5lZChDT05GSUdfRU5WX0lTX0lOX05WUkFNKQorCXJweGxpdGVfaW5pdCAoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NZU19SQ0NSCQkJLyogbXVzdCBiZSBkb25lIGJlZm9yZSBjcG1fbG9hZF9wYXRjaCgpICovCisJLyogd3JpdGUgY29uZmlnIHZhbHVlICovCisJaW1tci0+aW1fY3BtLmNwX3JjY3IgPSBDT05GSUdfU1lTX1JDQ1I7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19JMkNfVUNPREVfUEFUQ0gpIHx8IGRlZmluZWQoQ09ORklHX1NZU19TUElfVUNPREVfUEFUQ0gpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19TWVNfU01DX1VDT0RFX1BBVENIKQorCWNwbV9sb2FkX3BhdGNoIChpbW1yKTsJLyogbG9hZCBtcGM4eHggIG1pY3JvY29kZSBwYXRjaCAqLworI2VuZGlmCit9CisKKy8qCisgKiBpbml0aWFsaXplIGhpZ2hlciBsZXZlbCBwYXJ0cyBvZiBDUFUgbGlrZSB0aW1lcnMKKyAqLworaW50IGNwdV9pbml0X3IgKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfU1lTX1JUQ1NDKSB8fCBkZWZpbmVkKENPTkZJR19TWVNfUk1EUykKKwliZF90ICpiZCA9IGdkLT5iZDsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKHZvbGF0aWxlIGltbWFwX3QgKikgKGJkLT5iaV9pbW1yX2Jhc2UpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1lTX1JUQ1NDCisJLyogVW5sb2NrIFJUU0MgcmVnaXN0ZXIgKi8KKwlpbW1yLT5pbV9zaXRrLnNpdGtfcnRjc2NrID0gS0FQV1JfS0VZOworCS8qIHdyaXRlIGNvbmZpZyB2YWx1ZSAqLworCWltbXItPmltX3NpdC5zaXRfcnRjc2MgPSBDT05GSUdfU1lTX1JUQ1NDOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1lTX1JNRFMKKwkvKiB3cml0ZSBjb25maWcgdmFsdWUgKi8KKwlpbW1yLT5pbV9jcG0uY3Bfcm1kcyA9IENPTkZJR19TWVNfUk1EUzsKKyNlbmRpZgorCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9mZHQuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2ZkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzA5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9mZHQuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggKEMpIEJyeWFuIE8nRG9ub2dodWUKKyAqCisgKiBDb2RlIGNvcGllZCAmIGVkaXRlZCBmcm9tIEZyZWVzY2FsZSBtcGM4NXh4IHN0dWZmLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwordm9pZCBmdF9jcHVfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJZG9fZml4dXBfYnlfcHJvcF91MzIoYmxvYiwgImRldmljZV90eXBlIiwgImNwdSIsIDQsCisJCSJ0aW1lYmFzZS1mcmVxdWVuY3kiLCBnZXRfdGJjbGsoKSwgMSk7CisJZG9fZml4dXBfYnlfcHJvcF91MzIoYmxvYiwgImRldmljZV90eXBlIiwgImNwdSIsIDQsCisJCSJidXMtZnJlcXVlbmN5IiwgYmQtPmJpX2J1c2ZyZXEsIDEpOworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LAorCQkiY2xvY2stZnJlcXVlbmN5IiwgYmQtPmJpX2ludGZyZXEsIDEpOworCWRvX2ZpeHVwX2J5X2NvbXBhdF91MzIoYmxvYiwgImZzbCxjcG0tYnJnIiwgImNsb2NrLWZyZXF1ZW5jeSIsCisJCWdkLT5icmdfY2xrLCAxKTsKKworCS8qIEZpeHVwIGV0aGVybmV0IE1BQyBhZGRyZXNzZXMgKi8KKwlmZHRfZml4dXBfZXRoZXJuZXQoYmxvYik7CisKKwlmZHRfZml4dXBfbWVtb3J5KGJsb2IsICh1NjQpYmQtPmJpX21lbXN0YXJ0LCAodTY0KWJkLT5iaV9tZW1zaXplKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2ZlYy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvZmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljMWZmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2ZlYy5jCkBAIC0wLDAgKzEsMTAyNiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjdW5kZWYJRVRfREVCVUcKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9ORVQpICYmIFwKKwkoZGVmaW5lZChGRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMSkgfHwgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMikpCisKKy8qIGNvbXBhdGliaWxpdHkgdGVzdCwgaWYgb25seSBGRUNfRU5FVCBkZWZpbmVkIGFzc3VtZSBFVEhFUiBvbiBGRUMxICovCisjaWYgZGVmaW5lZChGRUNfRU5FVCkgJiYgIWRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZFQzEpICYmICFkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GRUMyKQorI2RlZmluZSBDT05GSUdfRVRIRVJfT05fRkVDMSAxCisjZW5kaWYKKworLyogZGVmaW5lIFdBTlRfTUlJIHdoZW4gTUlJIHN1cHBvcnQgaXMgcmVxdWlyZWQgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfRElTQ09WRVJfUEhZKSB8fCBkZWZpbmVkKENPTkZJR19GRUMxX1BIWSkgfHwgZGVmaW5lZChDT05GSUdfRkVDMl9QSFkpCisjZGVmaW5lIFdBTlRfTUlJCisjZWxzZQorI3VuZGVmIFdBTlRfTUlJCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0FOVF9NSUkpCisjaW5jbHVkZSA8bWlpcGh5Lmg+CisKKyNpZiAhKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpCisjZXJyb3IgIkNPTkZJR19NSUkgaGFzIHRvIGJlIGRlZmluZWQhIgorI2VuZGlmCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUk1JSSkgJiYgIWRlZmluZWQoV0FOVF9NSUkpCisjZXJyb3IgUk1JSSBzdXBwb3J0IGlzIHVudXNhYmxlIHdpdGhvdXQgYSB3b3JraW5nIFBIWS4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NZU19ESVNDT1ZFUl9QSFkKK3N0YXRpYyBpbnQgbWlpX2Rpc2NvdmVyX3BoeShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KTsKKyNlbmRpZgorCitpbnQgZmVjOHh4X21paXBoeV9yZWFkKGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgYWRkciwKKwkJdW5zaWduZWQgY2hhciAgcmVnLCB1bnNpZ25lZCBzaG9ydCAqdmFsdWUpOworaW50IGZlYzh4eF9taWlwaHlfd3JpdGUoY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciAgYWRkciwKKwkJdW5zaWduZWQgY2hhciAgcmVnLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZXRoZXJfZmNjX2luZm9fcworeworCWludCBldGhlcl9pbmRleDsKKwlpbnQgZmVjcF9vZmZzZXQ7CisJaW50IHBoeV9hZGRyOworCWludCBhY3R1YWxfcGh5X2FkZHI7CisJaW50IGluaXRpYWxpemVkOworfQorCWV0aGVyX2ZjY19pbmZvW10gPSB7CisjaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMSkKKwl7CisJCTAsCisJCW9mZnNldG9mKGltbWFwX3QsIGltX2NwbS5jcF9mZWMxKSwKKyNpZiBkZWZpbmVkKENPTkZJR19GRUMxX1BIWSkKKwkJQ09ORklHX0ZFQzFfUEhZLAorI2Vsc2UKKwkJLTEsCS8qIGRpc2NvdmVyICovCisjZW5kaWYKKwkJLTEsCisJCTAsCisKKwl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkVDMikKKwl7CisJCTEsCisJCW9mZnNldG9mKGltbWFwX3QsIGltX2NwbS5jcF9mZWMyKSwKKyNpZiBkZWZpbmVkKENPTkZJR19GRUMyX1BIWSkKKwkJQ09ORklHX0ZFQzJfUEhZLAorI2Vsc2UKKwkJLTEsCisjZW5kaWYKKwkJLTEsCisJCTAsCisJfSwKKyNlbmRpZgorfTsKKworLyogRXRoZXJuZXQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQnVmZmVycyAqLworI2RlZmluZSBEQlVGX0xFTkdUSCAgMTUyMAorCisjZGVmaW5lIFRYX0JVRl9DTlQgMgorCisjZGVmaW5lIFRPVVRfTE9PUCAxMDAKKworI2RlZmluZSBQS1RfTUFYQlVGX1NJWkUJCTE1MTgKKyNkZWZpbmUgUEtUX01JTkJVRl9TSVpFCQk2NAorI2RlZmluZSBQS1RfTUFYQkxSX1NJWkUJCTE1MjAKKworI2lmZGVmIF9fR05VQ19fCitzdGF0aWMgY2hhciB0eGJ1ZltEQlVGX0xFTkdUSF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKKyNlbHNlCisjZXJyb3IgdHhidWYgbXVzdCBiZSBhbGlnbmVkLgorI2VuZGlmCisKK3N0YXRpYyB1aW50IHJ4SWR4OwkvKiBpbmRleCBvZiB0aGUgY3VycmVudCBSWCBidWZmZXIgKi8KK3N0YXRpYyB1aW50IHR4SWR4OwkvKiBpbmRleCBvZiB0aGUgY3VycmVudCBUWCBidWZmZXIgKi8KKworLyoKKyAgKiBGRUMgRXRoZXJuZXQgVHggYW5kIFJ4IGJ1ZmZlciBkZXNjcmlwdG9ycyBhbGxvY2F0ZWQgYXQgdGhlCisgICogIGltbXItPnVkYXRhX2JkIGFkZHJlc3Mgb24gRHVhbC1Qb3J0IFJBTQorICAqIFByb3ZpZGUgZm9yIERvdWJsZSBCdWZmZXJpbmcKKyAgKi8KKwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgQ29tbW9uQnVmZmVyRGVzY3JpcHRvciB7CisgICAgY2JkX3QgcnhiZFtQS1RCVUZTUlhdOwkJLyogUnggQkQgKi8KKyAgICBjYmRfdCB0eGJkW1RYX0JVRl9DTlRdOwkJLyogVHggQkQgKi8KK30gUlRYQkQ7CisKK3N0YXRpYyBSVFhCRCAqcnR4ID0gTlVMTDsKKworc3RhdGljIGludCBmZWNfc2VuZChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpOworc3RhdGljIGludCBmZWNfcmVjdihzdHJ1Y3QgZXRoX2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgZmVjX2luaXQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCAqIGJkKTsKK3N0YXRpYyB2b2lkIGZlY19oYWx0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpOworI2lmIGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkKK3N0YXRpYyB2b2lkIF9fbWlpX2luaXQodm9pZCk7CisjZW5kaWYKKworaW50IGZlY19pbml0aWFsaXplKGJkX3QgKmJpcykKK3sKKwlzdHJ1Y3QgZXRoX2RldmljZSogZGV2OworCXN0cnVjdCBldGhlcl9mY2NfaW5mb19zICplZmlzOworCWludCAgICAgICAgICAgICBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihldGhlcl9mY2NfaW5mbykgLyBzaXplb2YoZXRoZXJfZmNjX2luZm9bMF0pOyBpKyspIHsKKworCQlkZXYgPSBtYWxsb2Moc2l6ZW9mKCpkZXYpKTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJaGFuZygpOworCisJCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisKKwkJLyogZm9yIEZFQzEgbWFrZSBzdXJlIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSBpcyB0aGUgc2FtZQorCQkgICBhcyB0aGUgb2xkIG9uZSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zICovCisJCWlmIChpID09IDApIHsKKwkJCXNwcmludGYgKGRldi0+bmFtZSwgIkZFQyBFVEhFUk5FVCIpOworCQl9IGVsc2UgeworCQkJc3ByaW50ZiAoZGV2LT5uYW1lLCAiRkVDJWQgRVRIRVJORVQiLAorCQkJCWV0aGVyX2ZjY19pbmZvW2ldLmV0aGVyX2luZGV4ICsgMSk7CisJCX0KKworCQllZmlzID0gJmV0aGVyX2ZjY19pbmZvW2ldOworCisJCS8qCisJCSAqIHJlc2V0IGFjdHVhbCBwaHkgYWRkcgorCQkgKi8KKwkJZWZpcy0+YWN0dWFsX3BoeV9hZGRyID0gLTE7CisKKwkJZGV2LT5wcml2ID0gZWZpczsKKwkJZGV2LT5pbml0ID0gZmVjX2luaXQ7CisJCWRldi0+aGFsdCA9IGZlY19oYWx0OworCQlkZXYtPnNlbmQgPSBmZWNfc2VuZDsKKwkJZGV2LT5yZWN2ID0gZmVjX3JlY3Y7CisKKwkJZXRoX3JlZ2lzdGVyKGRldik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCisJCW1paXBoeV9yZWdpc3RlcihkZXYtPm5hbWUsCisJCQlmZWM4eHhfbWlpcGh5X3JlYWQsIGZlYzh4eF9taWlwaHlfd3JpdGUpOworI2VuZGlmCisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZlY19zZW5kKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaiwgcmM7CisJc3RydWN0IGV0aGVyX2ZjY19pbmZvX3MgKmVmaXMgPSBkZXYtPnByaXY7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3AgPSAodm9sYXRpbGUgZmVjX3QgKikoQ09ORklHX1NZU19JTU1SICsgZWZpcy0+ZmVjcF9vZmZzZXQpOworCisJLyogc2VjdGlvbiAxNi45LjIzLjMKKwkgKiBXYWl0IGZvciByZWFkeQorCSAqLworCWogPSAwOworCXdoaWxlICgocnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1JFQURZKSAmJiAoajxUT1VUX0xPT1ApKSB7CisJCXVkZWxheSgxKTsKKwkJaisrOworCX0KKwlpZiAoaj49VE9VVF9MT09QKSB7CisJCXByaW50ZigiVFggbm90IHJlYWR5XG4iKTsKKwl9CisKKwlydHgtPnR4YmRbdHhJZHhdLmNiZF9idWZhZGRyID0gKHVpbnQpcGFja2V0OworCXJ0eC0+dHhiZFt0eElkeF0uY2JkX2RhdGxlbiAgPSBsZW5ndGg7CisJcnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgfD0gQkRfRU5FVF9UWF9SRUFEWSB8IEJEX0VORVRfVFhfTEFTVDsKKwlfX2FzbV9fICgiZWllaW8iKTsKKworCS8qIEFjdGl2YXRlIHRyYW5zbWl0IEJ1ZmZlciBEZXNjcmlwdG9yIHBvbGxpbmcgKi8KKwlmZWNwLT5mZWNfeF9kZXNfYWN0aXZlID0gMHgwMTAwMDAwMDsJLyogRGVzY3JpcHRvciBwb2xsaW5nIGFjdGl2ZQkqLworCisJaiA9IDA7CisJd2hpbGUgKChydHgtPnR4YmRbdHhJZHhdLmNiZF9zYyAmIEJEX0VORVRfVFhfUkVBRFkpICYmIChqPFRPVVRfTE9PUCkpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19JQ1U4NjIpCisJCXVkZWxheSgxMCk7CisjZWxzZQorCQl1ZGVsYXkoMSk7CisjZW5kaWYKKwkJaisrOworCX0KKwlpZiAoaj49VE9VVF9MT09QKSB7CisJCXByaW50ZigiVFggdGltZW91dFxuIik7CisJfQorI2lmZGVmIEVUX0RFQlVHCisJcHJpbnRmKCIlc1slZF0gJXM6IGN5Y2xlczogJWQgICAgc3RhdHVzOiAleCAgcmV0cnkgY250OiAlZFxuIiwKKwlfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18saixydHgtPnR4YmRbdHhJZHhdLmNiZF9zYywKKwkocnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiAweDAwM0MpPj4yKTsKKyNlbmRpZgorCS8qIHJldHVybiBvbmx5IHN0YXR1cyBiaXRzICovOworCXJjID0gKHJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjICYgQkRfRU5FVF9UWF9TVEFUUyk7CisKKwl0eElkeCA9ICh0eElkeCArIDEpICUgVFhfQlVGX0NOVDsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBmZWNfcmVjdiAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXRoZXJfZmNjX2luZm9fcyAqZWZpcyA9IGRldi0+cHJpdjsKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcCA9CisJCSh2b2xhdGlsZSBmZWNfdCAqKSAoQ09ORklHX1NZU19JTU1SICsgZWZpcy0+ZmVjcF9vZmZzZXQpOworCWludCBsZW5ndGg7CisKKwlmb3IgKDs7KSB7CisJCS8qIHNlY3Rpb24gMTYuOS4yMy4yICovCisJCWlmIChydHgtPnJ4YmRbcnhJZHhdLmNiZF9zYyAmIEJEX0VORVRfUlhfRU1QVFkpIHsKKwkJCWxlbmd0aCA9IC0xOworCQkJYnJlYWs7CS8qIG5vdGhpbmcgcmVjZWl2ZWQgLSBsZWF2ZSBmb3IoKSBsb29wICovCisJCX0KKworCQlsZW5ndGggPSBydHgtPnJ4YmRbcnhJZHhdLmNiZF9kYXRsZW47CisKKwkJaWYgKHJ0eC0+cnhiZFtyeElkeF0uY2JkX3NjICYgMHgwMDNmKSB7CisjaWZkZWYgRVRfREVCVUcKKwkJCXByaW50ZiAoIiVzWyVkXSBlcnI6ICV4XG4iLAorCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sCisJCQkJcnR4LT5yeGJkW3J4SWR4XS5jYmRfc2MpOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQl2b2xhdGlsZSB1Y2hhciAqcnggPSBOZXRSeFBhY2tldHNbcnhJZHhdOworCisJCQlsZW5ndGggLT0gNDsKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCisJCQlpZiAoKHJ4WzBdICYgMSkgIT0gMAorCQkJICAgICYmIG1lbWNtcCAoKHVjaGFyICopIHJ4LCBOZXRCY2FzdEFkZHIsIDYpICE9IDAKKwkJCSAgICAmJiBtZW1jbXAgKCh1Y2hhciAqKSByeCwgTmV0Q0RQQWRkciwgNikgIT0gMCkKKwkJCQlyeCA9IE5VTEw7CisjZW5kaWYKKwkJCS8qCisJCQkgKiBQYXNzIHRoZSBwYWNrZXQgdXAgdG8gdGhlIHByb3RvY29sIGxheWVycy4KKwkJCSAqLworCQkJaWYgKHJ4ICE9IE5VTEwpCisJCQkJTmV0UmVjZWl2ZSAocngsIGxlbmd0aCk7CisJCX0KKworCQkvKiBHaXZlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgRkVDLiAqLworCQlydHgtPnJ4YmRbcnhJZHhdLmNiZF9kYXRsZW4gPSAwOworCisJCS8qIHdyYXAgYXJvdW5kIGJ1ZmZlciBpbmRleCB3aGVuIG5lY2Vzc2FyeSAqLworCQlpZiAoKHJ4SWR4ICsgMSkgPj0gUEtUQlVGU1JYKSB7CisJCQlydHgtPnJ4YmRbUEtUQlVGU1JYIC0gMV0uY2JkX3NjID0KKwkJCQkoQkRfRU5FVF9SWF9XUkFQIHwgQkRfRU5FVF9SWF9FTVBUWSk7CisJCQlyeElkeCA9IDA7CisJCX0gZWxzZSB7CisJCQlydHgtPnJ4YmRbcnhJZHhdLmNiZF9zYyA9IEJEX0VORVRfUlhfRU1QVFk7CisJCQlyeElkeCsrOworCQl9CisKKwkJX19hc21fXyAoImVpZWlvIik7CisKKwkJLyogVHJ5IHRvIGZpbGwgQnVmZmVyIERlc2NyaXB0b3JzICovCisJCWZlY3AtPmZlY19yX2Rlc19hY3RpdmUgPSAweDAxMDAwMDAwOwkvKiBEZXNjcmlwdG9yIHBvbGxpbmcgYWN0aXZlICAgICovCisJfQorCisJcmV0dXJuIGxlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRkVDIEV0aGVybmV0IEluaXRpYWxpemF0aW9uIFJvdXRpbmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQlGRUNfRUNOVFJMX1BJTk1VWAkweDAwMDAwMDA0CisjZGVmaW5lIEZFQ19FQ05UUkxfRVRIRVJfRU4JMHgwMDAwMDAwMgorI2RlZmluZSBGRUNfRUNOVFJMX1JFU0VUCTB4MDAwMDAwMDEKKworI2RlZmluZSBGRUNfUkNOVFJMX0JDX1JFSgkweDAwMDAwMDEwCisjZGVmaW5lIEZFQ19SQ05UUkxfUFJPTQkJMHgwMDAwMDAwOAorI2RlZmluZSBGRUNfUkNOVFJMX01JSV9NT0RFCTB4MDAwMDAwMDQKKyNkZWZpbmUgRkVDX1JDTlRSTF9EUlQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRkVDX1JDTlRSTF9MT09QCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgRkVDX1RDTlRSTF9GREVOCQkweDAwMDAwMDA0CisjZGVmaW5lIEZFQ19UQ05UUkxfSEJDCQkweDAwMDAwMDAyCisjZGVmaW5lIEZFQ19UQ05UUkxfR1RTCQkweDAwMDAwMDAxCisKKyNkZWZpbmUJRkVDX1JFU0VUX0RFTEFZCQk1MAorCisjaWYgZGVmaW5lZChDT05GSUdfUk1JSSkKKworc3RhdGljIGlubGluZSB2b2lkIGZlY18xME1icHMoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXRoZXJfZmNjX2luZm9fcyAqZWZpcyA9IGRldi0+cHJpdjsKKwlpbnQgZmVjaWR4ID0gZWZpcy0+ZXRoZXJfaW5kZXg7CisJdWludCBtYXNrID0gKGZlY2lkeCA9PSAwKSA/IDB4MDAwMDAxMCA6IDB4MDAwMDAwODsKKworCWlmICgodW5zaWduZWQgaW50KWZlY2lkeCA+PSAyKQorCQloYW5nKCk7CisKKwkoKHZvbGF0aWxlIGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIpLT5pbV9jcG0uY3BfY3B0ciB8PSAgbWFzazsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZlY18xMDBNYnBzKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aGVyX2ZjY19pbmZvX3MgKmVmaXMgPSBkZXYtPnByaXY7CisJaW50IGZlY2lkeCA9IGVmaXMtPmV0aGVyX2luZGV4OworCXVpbnQgbWFzayA9IChmZWNpZHggPT0gMCkgPyAweDAwMDAwMTAgOiAweDAwMDAwMDg7CisKKwlpZiAoKHVuc2lnbmVkIGludClmZWNpZHggPj0gMikKKwkJaGFuZygpOworCisJKCh2b2xhdGlsZSBpbW1hcF90ICopQ09ORklHX1NZU19JTU1SKS0+aW1fY3BtLmNwX2NwdHIgJj0gfm1hc2s7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgZmVjX2Z1bGxfZHVwbGV4KHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aGVyX2ZjY19pbmZvX3MgKmVmaXMgPSBkZXYtPnByaXY7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3AgPSAodm9sYXRpbGUgZmVjX3QgKikoQ09ORklHX1NZU19JTU1SICsgZWZpcy0+ZmVjcF9vZmZzZXQpOworCisJZmVjcC0+ZmVjX3JfY250cmwgJj0gfkZFQ19SQ05UUkxfRFJUOworCWZlY3AtPmZlY194X2NudHJsIHw9ICBGRUNfVENOVFJMX0ZERU47CS8qIEZEIGVuYWJsZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmVjX2hhbGZfZHVwbGV4KHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aGVyX2ZjY19pbmZvX3MgKmVmaXMgPSBkZXYtPnByaXY7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3AgPSAodm9sYXRpbGUgZmVjX3QgKikoQ09ORklHX1NZU19JTU1SICsgZWZpcy0+ZmVjcF9vZmZzZXQpOworCisJZmVjcC0+ZmVjX3JfY250cmwgfD0gIEZFQ19SQ05UUkxfRFJUOworCWZlY3AtPmZlY194X2NudHJsICY9IH5GRUNfVENOVFJMX0ZERU47CS8qIEZEIGRpc2FibGUgKi8KK30KKworc3RhdGljIHZvaWQgZmVjX3Bpbl9pbml0KGludCBmZWNpZHgpCit7CisJYmRfdCAgICAgICAgICAgKmJkID0gZ2QtPmJkOworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisKKwkvKgorCSAqIG9ubHkgdHdvIEZFQ3MgcGxlYXNlCisJICovCisJaWYgKCh1bnNpZ25lZCBpbnQpZmVjaWR4ID49IDIpCisJCWhhbmcoKTsKKworCWlmIChmZWNpZHggPT0gMCkKKwkJZmVjcCA9ICZpbW1yLT5pbV9jcG0uY3BfZmVjMTsKKwllbHNlCisJCWZlY3AgPSAmaW1tci0+aW1fY3BtLmNwX2ZlYzI7CisKKwkvKgorCSAqIFNldCBNSUkgc3BlZWQgdG8gMi41IE1IeiBvciBzbGlnaHRseSBiZWxvdy4KKwkgKiAqIEFjY29yZGluZyB0byB0aGUgTVBDODYwVCAoUmV2LiBEKSBGYXN0IGV0aGVybmV0IGNvbnRyb2xsZXIgdXNlcgorCSAqICogbWFudWFsICg2LjIuMTQpLAorCSAqICogdGhlIE1JSSBtYW5hZ2VtZW50IGludGVyZmFjZSBjbG9jayBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbAorCSAqICogdG8gMi41IE1Iei4KKwkgKiAqIFRoaXMgTURDIGZyZXF1ZW5jeSBpcyBlcXVhbCB0byBzeXN0ZW0gY2xvY2sgLyAoMiAqIE1JSV9TUEVFRCkuCisJICogKiBUaGVuIE1JSV9TUEVFRCA9IHN5c3RlbV9jbG9jayAvIDIgKiAyLDUgTUh6LgorCSAqCisJICogQWxsIE1JSSBjb25maWd1cmF0aW9uIGlzIGRvbmUgdmlhIEZFQzEgcmVnaXN0ZXJzOgorCSAqLworCWltbXItPmltX2NwbS5jcF9mZWMxLmZlY19taWlfc3BlZWQgPSAoKGJkLT5iaV9pbnRmcmVxICsgNDk5OTk5OSkgLyA1MDAwMDAwKSA8PCAxOworCisjaWYgZGVmaW5lZChDT05GSUdfTkVUVEEpIHx8IGRlZmluZWQoQ09ORklHX05FVFBIT05FKSB8fCBkZWZpbmVkKENPTkZJR19ORVRUQTIpCisJLyogb3VyIFBIWXMgYXJlIHRoZSBsaW1pdCBhdCAyLjUgTUh6ICovCisJZmVjcC0+ZmVjX21paV9zcGVlZCA8PD0gMTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODg1X0ZBTUlMWSkgJiYgZGVmaW5lZChXQU5UX01JSSkKKwkvKiB1c2UgTURDIGZvciBNSUkgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkcGFyIHw9ICAweDAwODA7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wZGRpciAmPSB+MHgwMDgwOworI2VuZGlmCisKKwlpZiAoZmVjaWR4ID09IDApIHsKKyNpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GRUMxKQorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODg1X0ZBTUlMWSkgLyogTVBDODd4Lzg4eCBoYXZlIGdvdCAyIEZFQ3MgYW5kIGRpZmZlcmVudCBwaW5vdXQgKi8KKworI2lmICFkZWZpbmVkKENPTkZJR19STUlJKQorCisJCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgfD0gIDB4ZjgzMDsKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciB8PSAgMHgwODMwOworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4weGYwMDA7CisKKwkJaW1tci0+aW1fY3BtLmNwX3BicGFyICAgICB8PSAgMHgwMDAwMTAwMTsKKwkJaW1tci0+aW1fY3BtLmNwX3BiZGlyICAgICAmPSB+MHgwMDAwMTAwMTsKKworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyIHw9ICAweDAwMGM7CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgJj0gfjB4MDAwYzsKKworCQlpbW1yLT5pbV9jcG0uY3BfcGVwYXIgICAgIHw9ICAweDAwMDAwMDAzOworCQlpbW1yLT5pbV9jcG0uY3BfcGVkaXIgICAgIHw9ICAweDAwMDAwMDAzOworCQlpbW1yLT5pbV9jcG0uY3BfcGVzbyAgICAgICY9IH4weDAwMDAwMDAzOworCisJCWltbXItPmltX2NwbS5jcF9jcHRyICAgICAgJj0gfjB4MDAwMDAxMDA7CisKKyNlbHNlCisKKyNpZiAhZGVmaW5lZChDT05GSUdfRkVDMV9QSFlfTk9SWEVSUikKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAgMHgxMDAwOworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyICY9IH4weDEwMDA7CisjZW5kaWYKKwkJaW1tci0+aW1faW9wb3J0LmlvcF9wYXBhciB8PSAgMHhlODEwOworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BhZGlyIHw9ICAweDA4MTA7CisJCWltbXItPmltX2lvcG9ydC5pb3BfcGFkaXIgJj0gfjB4ZTAwMDsKKworCQlpbW1yLT5pbV9jcG0uY3BfcGJwYXIgICAgIHw9ICAweDAwMDAwMDAxOworCQlpbW1yLT5pbV9jcG0uY3BfcGJkaXIgICAgICY9IH4weDAwMDAwMDAxOworCisJCWltbXItPmltX2NwbS5jcF9jcHRyICAgICAgfD0gIDB4MDAwMDAxMDA7CisJCWltbXItPmltX2NwbS5jcF9jcHRyICAgICAgJj0gfjB4MDAwMDAwNTA7CisKKyNlbmRpZiAvKiAhQ09ORklHX1JNSUkgKi8KKworI2VsaWYgIWRlZmluZWQoQ09ORklHX0lDVTg2MikgJiYgIWRlZmluZWQoQ09ORklHX0lBRDIxMCkKKwkJLyoKKwkJICogQ29uZmlndXJlIGFsbCBvZiBwb3J0IEQgZm9yIE1JSS4KKwkJICovCisJCWltbXItPmltX2lvcG9ydC5pb3BfcGRwYXIgPSAweDFmZmY7CisKKwkJLyoKKwkJICogQml0cyBtb3ZlZCBmcm9tIFJldi4gRCBvbndhcmQKKwkJICovCisJCWlmICgoZ2V0X2ltbXIoMCkgJiAweGZmZmYpIDwgMHgwNTAxKQorCQkJaW1tci0+aW1faW9wb3J0LmlvcF9wZGRpciA9IDB4MWM1ODsJLyogUHJlIHJldi4gRCAqLworCQllbHNlCisJCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGlyID0gMHgxZmZmOwkvKiBSZXYuIEQgYW5kIGxhdGVyICovCisjZWxzZQorCQkvKgorCQkgKiBDb25maWd1cmUgcG9ydCBBIGZvciBNSUkuCisJCSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfSUNVODYyKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfRElTQ09WRVJfUEhZKQorCisJCS8qCisJCSAqIE9uIHRoZSBJQ1U4NjIgYm9hcmQgdGhlIE1JSS1NREMgcGluIGlzIHJvdXRlZCB0byBQRDggcGluCisJCSAqICogb2YgQ1BVLCBzbyBmb3IgdGhpcyBib2FyZCB3ZSBuZWVkIHRvIGNvbmZpZ3VyZSBVdG9waWEgYW5kCisJCSAqICogZW5hYmxlIFBEOCB0byBNSUktTURDIGZ1bmN0aW9uCisJCSAqLworCQlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkcGFyIHw9IDB4NDA4MDsKKyNlbmRpZgorCisJCS8qCisJCSAqIEhhcyBVdG9waWEgYmVlbiBjb25maWd1cmVkPworCQkgKi8KKwkJaWYgKGltbXItPmltX2lvcG9ydC5pb3BfcGRwYXIgJiAoMHg4MDAwID4+IDEpKSB7CisJCQkvKgorCQkJICogWUVTIC0gVXNlIE1VWEVEIG1vZGUgZm9yIFVUT1BJQSBidXMuCisJCQkgKiBUaGlzIGZyZWVzIFBvcnQgQSBmb3IgdXNlIGJ5IE1JSSAoc2VlIDg2MlVNIHRhYmxlIDQxLTYpLgorCQkJICovCisJCQlpbW1yLT5pbV9pb3BvcnQudXRtb2RlICY9IH4weDgwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5PIC0gc2V0IFNQTElUIG1vZGUgZm9yIFVUT1BJQSBidXMuCisJCQkgKgorCQkJICogVGhpcyBkb2Vzbid0IHJlYWxseSBlZmZlY3QgVVRPUElBICh3aGljaCBpc24ndAorCQkJICogZW5hYmxlZCBhbnl3YXkpIGJ1dCBqdXN0IHRlbGxzIHRoZSA4NjIKKwkJCSAqIHRvIHVzZSBwb3J0IEEgZm9yIE1JSSAoc2VlIDg2MlVNIHRhYmxlIDQxLTYpLgorCQkJICovCisJCQlpbW1yLT5pbV9pb3BvcnQudXRtb2RlIHw9IDB4ODA7CisJCX0KKyNlbmRpZgkJCQkvKiAhZGVmaW5lZChDT05GSUdfSUNVODYyKSAqLworCisjZW5kaWYJLyogQ09ORklHX0VUSEVSX09OX0ZFQzEgKi8KKwl9IGVsc2UgaWYgKGZlY2lkeCA9PSAxKSB7CisKKyNpZiBkZWZpbmVkKENPTkZJR19FVEhFUl9PTl9GRUMyKQorCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODg1X0ZBTUlMWSkgLyogTVBDODd4Lzg4eCBoYXZlIGdvdCAyIEZFQ3MgYW5kIGRpZmZlcmVudCBwaW5vdXQgKi8KKworI2lmICFkZWZpbmVkKENPTkZJR19STUlJKQorCQlpbW1yLT5pbV9jcG0uY3BfcGVwYXIgICAgIHw9ICAweDAwMDNmZmZjOworCQlpbW1yLT5pbV9jcG0uY3BfcGVkaXIgICAgIHw9ICAweDAwMDNmZmZjOworCQlpbW1yLT5pbV9jcG0uY3BfcGVzbyAgICAgICY9IH4weDAwMDA4N2ZjOworCQlpbW1yLT5pbV9jcG0uY3BfcGVzbyAgICAgIHw9ICAweDAwMDM3ODAwOworCisJCWltbXItPmltX2NwbS5jcF9jcHRyICAgICAgJj0gfjB4MDAwMDAwODA7CisjZWxzZQorCisjaWYgIWRlZmluZWQoQ09ORklHX0ZFQzJfUEhZX05PUlhFUlIpCisJCWltbXItPmltX2NwbS5jcF9wZXBhciAgICAgfD0gIDB4MDAwMDAwMTA7CisJCWltbXItPmltX2NwbS5jcF9wZWRpciAgICAgfD0gIDB4MDAwMDAwMTA7CisJCWltbXItPmltX2NwbS5jcF9wZXNvICAgICAgJj0gfjB4MDAwMDAwMTA7CisjZW5kaWYKKwkJaW1tci0+aW1fY3BtLmNwX3BlcGFyICAgICB8PSAgMHgwMDAzOTYyMDsKKwkJaW1tci0+aW1fY3BtLmNwX3BlZGlyICAgICB8PSAgMHgwMDAzOTYyMDsKKwkJaW1tci0+aW1fY3BtLmNwX3Blc28gICAgICB8PSAgMHgwMDAzMTAwMDsKKwkJaW1tci0+aW1fY3BtLmNwX3Blc28gICAgICAmPSB+MHgwMDAwODYyMDsKKworCQlpbW1yLT5pbV9jcG0uY3BfY3B0ciAgICAgIHw9ICAweDAwMDAwMDgwOworCQlpbW1yLT5pbV9jcG0uY3BfY3B0ciAgICAgICY9IH4weDAwMDAwMDI4OworI2VuZGlmIC8qIENPTkZJR19STUlJICovCisKKyNlbmRpZiAvKiBDT05GSUdfTVBDODg1X0ZBTUlMWSAqLworCisjZW5kaWYgLyogQ09ORklHX0VUSEVSX09OX0ZFQzIgKi8KKworCX0KK30KKworc3RhdGljIGludCBmZWNfcmVzZXQodm9sYXRpbGUgZmVjX3QgKmZlY3ApCit7CisJaW50IGk7CisKKwkvKiBXaGFjayBhIHJlc2V0LgorCSAqIEEgZGVsYXkgaXMgcmVxdWlyZWQgYmV0d2VlbiBhIHJlc2V0IG9mIHRoZSBGRUMgYmxvY2sgYW5kCisJICogaW5pdGlhbGl6YXRpb24gb2Ygb3RoZXIgRkVDIHJlZ2lzdGVycyBiZWNhdXNlIHRoZSByZXNldCB0YWtlcworCSAqIHNvbWUgdGltZSB0byBjb21wbGV0ZS4gSWYgeW91IGRvbid0IGRlbGF5LCBzdWJzZXF1ZW50IHdyaXRlcworCSAqIHRvIEZFQyByZWdpc3RlcnMgbWlnaHQgZ2V0IGtpbGxlZCBieSB0aGUgcmVzZXQgcm91dGluZSB3aGljaCBpcworCSAqIHN0aWxsIGluIHByb2dyZXNzLgorCSAqLworCisJZmVjcC0+ZmVjX2VjbnRybCA9IEZFQ19FQ05UUkxfUElOTVVYIHwgRkVDX0VDTlRSTF9SRVNFVDsKKwlmb3IgKGkgPSAwOworCSAgICAgKGZlY3AtPmZlY19lY250cmwgJiBGRUNfRUNOVFJMX1JFU0VUKSAmJiAoaSA8IEZFQ19SRVNFVF9ERUxBWSk7CisJICAgICArK2kpIHsKKwkJdWRlbGF5ICgxKTsKKwl9CisJaWYgKGkgPT0gRkVDX1JFU0VUX0RFTEFZKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZWNfaW5pdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgYmRfdCAqIGJkKQoreworCXN0cnVjdCBldGhlcl9mY2NfaW5mb19zICplZmlzID0gZGV2LT5wcml2OworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3AgPQorCQkodm9sYXRpbGUgZmVjX3QgKikgKENPTkZJR19TWVNfSU1NUiArIGVmaXMtPmZlY3Bfb2Zmc2V0KTsKKwlpbnQgaTsKKworCWlmIChlZmlzLT5ldGhlcl9pbmRleCA9PSAwKSB7CisjaWYgZGVmaW5lZChDT05GSUdfRkFEUykJLyogRkFEUyBmYW1pbHkgdXNlcyBGUEdBIChCQ1NSKSB0byBjb250cm9sIFBIWXMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4ODVBRFMpCisJCSoodnVfY2hhciAqKSBCQ1NSNSAmPSB+KEJDU1I1X01JSTFfRU4gfCBCQ1NSNV9NSUkxX1JTVCk7CisjZWxzZQorCQkvKiBjb25maWd1cmUgRkFEUyBmb3IgZmFzdCAoRkVDKSBldGhlcm5ldCwgaGFsZi1kdXBsZXggKi8KKwkJLyogVGhlIExYVDk3MCBuZWVkcyBhYm91dCA1MG1zIHRvIHJlY292ZXIgZnJvbSByZXNldCwgc28KKwkJICogd2FpdCBmb3IgaXQgYnkgZGlzY292ZXJpbmcgdGhlIFBIWSBiZWZvcmUgbGVhdmluZyBldGhfaW5pdCgpLgorCQkgKi8KKwkJeworCQkJdm9sYXRpbGUgdWludCAqYmNzcjQgPSAodm9sYXRpbGUgdWludCAqKSBCQ1NSNDsKKworCQkJKmJjc3I0ID0gKCpiY3NyNCAmIH4oQkNTUjRfRkVUSF9FTiB8IEJDU1I0X0ZFVEhDRkcxKSkKKwkJCQl8IChCQ1NSNF9GRVRIQ0ZHMCB8IEJDU1I0X0ZFVEhGREUgfAorCQkJCSAgIEJDU1I0X0ZFVEhSU1QpOworCisJCQkvKiByZXNldCB0aGUgTFhUOTcwIFBIWSAqLworCQkJKmJjc3I0ICY9IH5CQ1NSNF9GRVRIUlNUOworCQkJdWRlbGF5ICgxMCk7CisJCQkqYmNzcjQgfD0gQkNTUjRfRkVUSFJTVDsKKwkJCXVkZWxheSAoMTApOworCQl9CisjZW5kaWYgLyogQ09ORklHX01QQzg4NUFEUyAqLworI2VuZGlmIC8qIENPTkZJR19GQURTICovCisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQorCS8qIHRoZSBNSUkgaW50ZXJmYWNlIGlzIGNvbm5lY3RlZCB0byBGRUMxCisJICogc28gZm9yIHRoZSBtaWlwaHlfeHh4IGZ1bmN0aW9uIHRvIHdvcmsgd2UgbXVzdAorCSAqIGNhbGwgbWlpX2luaXQgc2luY2UgZmVjX2hhbHQgbWVzc2VzIHRoZSB0aGluZyB1cAorCSAqLworCWlmIChlZmlzLT5ldGhlcl9pbmRleCAhPSAwKQorCQlfX21paV9pbml0KCk7CisjZW5kaWYKKworCWlmIChmZWNfcmVzZXQoZmVjcCkgPCAwKQorCQlwcmludGYgKCJGRUNfUkVTRVRfREVMQVkgdGltZW91dFxuIik7CisKKwkvKiBXZSB1c2Ugc3RyaWN0bHkgcG9sbGluZyBtb2RlIG9ubHkKKwkgKi8KKwlmZWNwLT5mZWNfaW1hc2sgPSAwOworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0CisJICovCisJZmVjcC0+ZmVjX2lldmVudCA9IDB4ZmZjMDsKKworCS8qIE5vIG5lZWQgdG8gc2V0IHRoZSBJVkVDIHJlZ2lzdGVyICovCisKKwkvKiBTZXQgc3RhdGlvbiBhZGRyZXNzCisJICovCisjZGVmaW5lIGVhIGRldi0+ZW5ldGFkZHIKKwlmZWNwLT5mZWNfYWRkcl9sb3cgPSAoZWFbMF0gPDwgMjQpIHwgKGVhWzFdIDw8IDE2KSB8IChlYVsyXSA8PCA4KSB8IChlYVszXSk7CisJZmVjcC0+ZmVjX2FkZHJfaGlnaCA9IChlYVs0XSA8PCA4KSB8IChlYVs1XSk7CisjdW5kZWYgZWEKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9DRFApCisJLyoKKwkgKiBUdXJuIG9uIG11bHRpY2FzdCBhZGRyZXNzIGhhc2ggdGFibGUKKwkgKi8KKwlmZWNwLT5mZWNfaGFzaF90YWJsZV9oaWdoID0gMHhmZmZmZmZmZjsKKwlmZWNwLT5mZWNfaGFzaF90YWJsZV9sb3cgPSAweGZmZmZmZmZmOworI2Vsc2UKKwkvKiBDbGVhciBtdWx0aWNhc3QgYWRkcmVzcyBoYXNoIHRhYmxlCisJICovCisJZmVjcC0+ZmVjX2hhc2hfdGFibGVfaGlnaCA9IDA7CisJZmVjcC0+ZmVjX2hhc2hfdGFibGVfbG93ID0gMDsKKyNlbmRpZgorCisJLyogU2V0IG1heGltdW0gcmVjZWl2ZSBidWZmZXIgc2l6ZS4KKwkgKi8KKwlmZWNwLT5mZWNfcl9idWZmX3NpemUgPSBQS1RfTUFYQkxSX1NJWkU7CisKKwkvKiBTZXQgbWF4aW11bSBmcmFtZSBsZW5ndGgKKwkgKi8KKwlmZWNwLT5mZWNfcl9oYXNoID0gUEtUX01BWEJVRl9TSVpFOworCisJLyoKKwkgKiBTZXR1cCBCdWZmZXJzIGFuZCBCdWZmZXIgRGVzcmlwdG9ycworCSAqLworCXJ4SWR4ID0gMDsKKwl0eElkeCA9IDA7CisKKwlpZiAoIXJ0eCkgeworI2lmZGVmIENPTkZJR19TWVNfQUxMT0NfRFBSQU0KKwkJcnR4ID0gKFJUWEJEICopIChpbW1yLT5pbV9jcG0uY3BfZHBtZW0gKworCQkJCSBkcHJhbV9hbGxvY19hbGlnbiAoc2l6ZW9mIChSVFhCRCksIDgpKTsKKyNlbHNlCisJCXJ0eCA9IChSVFhCRCAqKSAoaW1tci0+aW1fY3BtLmNwX2RwbWVtICsgQ1BNX0ZFQ19CQVNFKTsKKyNlbmRpZgorCX0KKwkvKgorCSAqIFNldHVwIFJlY2VpdmVyIEJ1ZmZlciBEZXNjcmlwdG9ycyAoMTMuMTQuMjQuMTgpCisJICogU2V0dGluZ3M6CisJICogICAgIEVtcHR5LCBXcmFwCisJICovCisJZm9yIChpID0gMDsgaSA8IFBLVEJVRlNSWDsgaSsrKSB7CisJCXJ0eC0+cnhiZFtpXS5jYmRfc2MgPSBCRF9FTkVUX1JYX0VNUFRZOworCQlydHgtPnJ4YmRbaV0uY2JkX2RhdGxlbiA9IDA7CS8qIFJlc2V0ICovCisJCXJ0eC0+cnhiZFtpXS5jYmRfYnVmYWRkciA9ICh1aW50KSBOZXRSeFBhY2tldHNbaV07CisJfQorCXJ0eC0+cnhiZFtQS1RCVUZTUlggLSAxXS5jYmRfc2MgfD0gQkRfRU5FVF9SWF9XUkFQOworCisJLyoKKwkgKiBTZXR1cCBFdGhlcm5ldCBUcmFuc21pdHRlciBCdWZmZXIgRGVzY3JpcHRvcnMgKDEzLjE0LjI0LjE5KQorCSAqIFNldHRpbmdzOgorCSAqICAgIExhc3QsIFR4IENSQworCSAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9CVUZfQ05UOyBpKyspIHsKKwkJcnR4LT50eGJkW2ldLmNiZF9zYyA9IEJEX0VORVRfVFhfTEFTVCB8IEJEX0VORVRfVFhfVEM7CisJCXJ0eC0+dHhiZFtpXS5jYmRfZGF0bGVuID0gMDsJLyogUmVzZXQgKi8KKwkJcnR4LT50eGJkW2ldLmNiZF9idWZhZGRyID0gKHVpbnQpICgmdHhidWZbMF0pOworCX0KKwlydHgtPnR4YmRbVFhfQlVGX0NOVCAtIDFdLmNiZF9zYyB8PSBCRF9FTkVUX1RYX1dSQVA7CisKKwkvKiBTZXQgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgZGVzY3JpcHRvciBiYXNlCisJICovCisJZmVjcC0+ZmVjX3JfZGVzX3N0YXJ0ID0gKHVuc2lnbmVkIGludCkgKCZydHgtPnJ4YmRbMF0pOworCWZlY3AtPmZlY194X2Rlc19zdGFydCA9ICh1bnNpZ25lZCBpbnQpICgmcnR4LT50eGJkWzBdKTsKKworCS8qIEVuYWJsZSBNSUkgbW9kZQorCSAqLworI2lmIDAJCQkJLyogRnVsbCBkdXBsZXggbW9kZSAqLworCWZlY3AtPmZlY19yX2NudHJsID0gRkVDX1JDTlRSTF9NSUlfTU9ERTsKKwlmZWNwLT5mZWNfeF9jbnRybCA9IEZFQ19UQ05UUkxfRkRFTjsKKyNlbHNlICAvKiBIYWxmIGR1cGxleCBtb2RlICovCisJZmVjcC0+ZmVjX3JfY250cmwgPSBGRUNfUkNOVFJMX01JSV9NT0RFIHwgRkVDX1JDTlRSTF9EUlQ7CisJZmVjcC0+ZmVjX3hfY250cmwgPSAwOworI2VuZGlmCisKKwkvKiBFbmFibGUgYmlnIGVuZGlhbiBhbmQgZG9uJ3QgY2FyZSBhYm91dCBTRE1BIEZDLgorCSAqLworCWZlY3AtPmZlY19mdW5fY29kZSA9IDB4NzgwMDAwMDA7CisKKwkvKgorCSAqIFNldHVwIHRoZSBwaW4gY29uZmlndXJhdGlvbiBvZiB0aGUgRkVDCisJICovCisJZmVjX3Bpbl9pbml0IChlZmlzLT5ldGhlcl9pbmRleCk7CisKKwlyeElkeCA9IDA7CisJdHhJZHggPSAwOworCisJLyoKKwkgKiBOb3cgZW5hYmxlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzaW5nCisJICovCisJZmVjcC0+ZmVjX2VjbnRybCA9IEZFQ19FQ05UUkxfUElOTVVYIHwgRkVDX0VDTlRSTF9FVEhFUl9FTjsKKworCWlmIChlZmlzLT5waHlfYWRkciA9PSAtMSkgeworI2lmZGVmIENPTkZJR19TWVNfRElTQ09WRVJfUEhZCisJCS8qCisJCSAqIHdhaXQgZm9yIHRoZSBQSFkgdG8gd2FrZSB1cCBhZnRlciByZXNldAorCQkgKi8KKwkJZWZpcy0+YWN0dWFsX3BoeV9hZGRyID0gbWlpX2Rpc2NvdmVyX3BoeSAoZGV2KTsKKworCQlpZiAoZWZpcy0+YWN0dWFsX3BoeV9hZGRyID09IC0xKSB7CisJCQlwcmludGYgKCJVbmFibGUgdG8gZGlzY292ZXIgcGh5IVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKyNlbHNlCisJCWVmaXMtPmFjdHVhbF9waHlfYWRkciA9IC0xOworI2VuZGlmCisJfSBlbHNlIHsKKwkJZWZpcy0+YWN0dWFsX3BoeV9hZGRyID0gZWZpcy0+cGh5X2FkZHI7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSAmJiBkZWZpbmVkKENPTkZJR19STUlJKQorCS8qCisJICogYWRhcHQgdGhlIFJNSUkgc3BlZWQgdG8gdGhlIHNwZWVkIG9mIHRoZSBwaHkKKwkgKi8KKwlpZiAobWlpcGh5X3NwZWVkIChkZXYtPm5hbWUsIGVmaXMtPmFjdHVhbF9waHlfYWRkcikgPT0gXzEwMEJBU0VUKSB7CisJCWZlY18xMDBNYnBzIChkZXYpOworCX0gZWxzZSB7CisJCWZlY18xME1icHMgKGRldik7CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NSUkpCisJLyoKKwkgKiBhZGFwdCB0byB0aGUgaGFsZi9mdWxsIHNwZWVkIHNldHRpbmdzCisJICovCisJaWYgKG1paXBoeV9kdXBsZXggKGRldi0+bmFtZSwgZWZpcy0+YWN0dWFsX3BoeV9hZGRyKSA9PSBGVUxMKSB7CisJCWZlY19mdWxsX2R1cGxleCAoZGV2KTsKKwl9IGVsc2UgeworCQlmZWNfaGFsZl9kdXBsZXggKGRldik7CisJfQorI2VuZGlmCisKKwkvKiBBbmQgbGFzdCwgdHJ5IHRvIGZpbGwgUnggQnVmZmVyIERlc2NyaXB0b3JzICovCisJZmVjcC0+ZmVjX3JfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CS8qIERlc2NyaXB0b3IgcG9sbGluZyBhY3RpdmUgICAgKi8KKworCWVmaXMtPmluaXRpYWxpemVkID0gMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGZlY19oYWx0KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IGV0aGVyX2ZjY19pbmZvX3MgKmVmaXMgPSBkZXYtPnByaXY7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3AgPSAodm9sYXRpbGUgZmVjX3QgKikoQ09ORklHX1NZU19JTU1SICsgZWZpcy0+ZmVjcF9vZmZzZXQpOworCWludCBpOworCisJLyogYXZvaWQgaGFsdCBpZiBpbml0aWFsaXplZDsgbWlpIGdldHMgc3R1Y2sgb3RoZXJ3aXNlICovCisJaWYgKCFlZmlzLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJLyogV2hhY2sgYSByZXNldC4KKwkgKiBBIGRlbGF5IGlzIHJlcXVpcmVkIGJldHdlZW4gYSByZXNldCBvZiB0aGUgRkVDIGJsb2NrIGFuZAorCSAqIGluaXRpYWxpemF0aW9uIG9mIG90aGVyIEZFQyByZWdpc3RlcnMgYmVjYXVzZSB0aGUgcmVzZXQgdGFrZXMKKwkgKiBzb21lIHRpbWUgdG8gY29tcGxldGUuIElmIHlvdSBkb24ndCBkZWxheSwgc3Vic2VxdWVudCB3cml0ZXMKKwkgKiB0byBGRUMgcmVnaXN0ZXJzIG1pZ2h0IGdldCBraWxsZWQgYnkgdGhlIHJlc2V0IHJvdXRpbmUgd2hpY2ggaXMKKwkgKiBzdGlsbCBpbiBwcm9ncmVzcy4KKwkgKi8KKworCWZlY3AtPmZlY19lY250cmwgPSBGRUNfRUNOVFJMX1BJTk1VWCB8IEZFQ19FQ05UUkxfUkVTRVQ7CisJZm9yIChpID0gMDsKKwkgICAgIChmZWNwLT5mZWNfZWNudHJsICYgRkVDX0VDTlRSTF9SRVNFVCkgJiYgKGkgPCBGRUNfUkVTRVRfREVMQVkpOworCSAgICAgKytpKSB7CisJCXVkZWxheSAoMSk7CisJfQorCWlmIChpID09IEZFQ19SRVNFVF9ERUxBWSkgeworCQlwcmludGYgKCJGRUNfUkVTRVRfREVMQVkgdGltZW91dFxuIik7CisJCXJldHVybjsKKwl9CisKKwllZmlzLT5pbml0aWFsaXplZCA9IDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfRElTQ09WRVJfUEhZKSB8fCBkZWZpbmVkKENPTkZJR19NSUkpIHx8IGRlZmluZWQoQ09ORklHX0NNRF9NSUkpCisKKy8qIE1ha2UgTUlJIHJlYWQvd3JpdGUgY29tbWFuZHMgZm9yIHRoZSBGRUMuCisqLworCisjZGVmaW5lIG1rX21paV9yZWFkKEFERFIsIFJFRykJKDB4NjAwMjAwMDAgfCAoKEFERFIgPDwgMjMpIHwgXAorCQkJCQkJKFJFRyAmIDB4MWYpIDw8IDE4KSkKKworI2RlZmluZSBta19taWlfd3JpdGUoQUREUiwgUkVHLCBWQUwpCSgweDUwMDIwMDAwIHwgKChBRERSIDw8IDIzKSB8IFwKKwkJCQkJCShSRUcgJiAweDFmKSA8PCAxOCkgfCBcCisJCQkJCQkoVkFMICYgMHhmZmZmKSkKKworLyogSW50ZXJydXB0IGV2ZW50cy9tYXNrcy4KKyovCisjZGVmaW5lIEZFQ19FTkVUX0hCRVJSCSgodWludCkweDgwMDAwMDAwKQkvKiBIZWFydGJlYXQgZXJyb3IgKi8KKyNkZWZpbmUgRkVDX0VORVRfQkFCUgkoKHVpbnQpMHg0MDAwMDAwMCkJLyogQmFiYmxpbmcgcmVjZWl2ZXIgKi8KKyNkZWZpbmUgRkVDX0VORVRfQkFCVAkoKHVpbnQpMHgyMDAwMDAwMCkJLyogQmFiYmxpbmcgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgRkVDX0VORVRfR1JBCSgodWludCkweDEwMDAwMDAwKQkvKiBHcmFjZWZ1bCBzdG9wIGNvbXBsZXRlICovCisjZGVmaW5lIEZFQ19FTkVUX1RYRgkoKHVpbnQpMHgwODAwMDAwMCkJLyogRnVsbCBmcmFtZSB0cmFuc21pdHRlZCAqLworI2RlZmluZSBGRUNfRU5FVF9UWEIJKCh1aW50KTB4MDQwMDAwMDApCS8qIEEgYnVmZmVyIHdhcyB0cmFuc21pdHRlZCAqLworI2RlZmluZSBGRUNfRU5FVF9SWEYJKCh1aW50KTB4MDIwMDAwMDApCS8qIEZ1bGwgZnJhbWUgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRkVDX0VORVRfUlhCCSgodWludCkweDAxMDAwMDAwKQkvKiBBIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRkVDX0VORVRfTUlJCSgodWludCkweDAwODAwMDAwKQkvKiBNSUkgaW50ZXJydXB0ICovCisjZGVmaW5lIEZFQ19FTkVUX0VCRVJSCSgodWludCkweDAwNDAwMDAwKQkvKiBTRE1BIGJ1cyBlcnJvciAqLworCisvKiBQSFkgaWRlbnRpZmljYXRpb24KKyAqLworI2RlZmluZSBQSFlfSURfTFhUOTcwCQkweDc4MTAwMDAwCS8qIExYVDk3MCAqLworI2RlZmluZSBQSFlfSURfTFhUOTcxCQkweDAwMTM3OGUwCS8qIExYVDk3MSBhbmQgOTcyICovCisjZGVmaW5lIFBIWV9JRF84MjU1NQkJMHgwMmE4MDE1MAkvKiBJbnRlbCA4MjU1NSAqLworI2RlZmluZSBQSFlfSURfUVM2NjEyCQkweDAxODE0NDAwCS8qIFFTNjYxMiAqLworI2RlZmluZSBQSFlfSURfQU1ENzlDNzg0CTB4MDAyMjU2MTAJLyogQU1EIDc5Qzc4NCAqLworI2RlZmluZSBQSFlfSURfTFNJODAyMjUJCTB4MDAxNmY4NzAJLyogTFNJIDgwMjI1ICovCisjZGVmaW5lIFBIWV9JRF9MU0k4MDIyNUIJMHgwMDE2Zjg4MAkvKiBMU0kgODAyMjUvQiAqLworI2RlZmluZSBQSFlfSURfRE05MTYxCQkweDAxODFCODgwCS8qIERhdmljb20gRE05MTYxICovCisjZGVmaW5lIFBIWV9JRF9LU004OTk1TQkJMHgwMDIyMTQ1MAkvKiBNSUNSRUwgS1M4OTk1TUEgKi8KKworLyogc2VuZCBjb21tYW5kIHRvIHBoeSB1c2luZyBtaWksIHdhaXQgZm9yIHJlc3VsdCAqLworc3RhdGljIHVpbnQKK21paV9zZW5kKHVpbnQgbWlpX2NtZCkKK3sKKwl1aW50IG1paV9yZXBseTsKKwl2b2xhdGlsZSBmZWNfdAkqZXA7CisJaW50IGNudDsKKworCWVwID0gJigoKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIpLT5pbV9jcG0uY3BfZmVjKTsKKworCWVwLT5mZWNfbWlpX2RhdGEgPSBtaWlfY21kOwkvKiBjb21tYW5kIHRvIHBoeSAqLworCisJLyogd2FpdCBmb3IgbWlpIGNvbXBsZXRlICovCisJY250ID0gMDsKKwl3aGlsZSAoIShlcC0+ZmVjX2lldmVudCAmIEZFQ19FTkVUX01JSSkpIHsKKwkJaWYgKCsrY250ID4gMTAwMCkgeworCQkJcHJpbnRmKCJtaWlfc2VuZCBTVFVDSyFcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJbWlpX3JlcGx5ID0gZXAtPmZlY19taWlfZGF0YTsJCS8qIHJlc3VsdCBmcm9tIHBoeSAqLworCWVwLT5mZWNfaWV2ZW50ID0gRkVDX0VORVRfTUlJOwkJLyogY2xlYXIgTUlJIGNvbXBsZXRlICovCisjaWYgMAorCXByaW50ZigiJXNbJWRdICVzOiBzZW50PTB4JTguOHgsIHJlcGx5PTB4JTguOHhcbiIsCisJCV9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyxtaWlfY21kLG1paV9yZXBseSk7CisjZW5kaWYKKwlyZXR1cm4gKG1paV9yZXBseSAmIDB4ZmZmZik7CQkvKiBkYXRhIHJlYWQgZnJvbSBwaHkgKi8KK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0RJU0NPVkVSX1BIWSkKK3N0YXRpYyBpbnQgbWlpX2Rpc2NvdmVyX3BoeShzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworI2RlZmluZSBNQVhfUEhZX1BBU1NFUyAxMQorCXVpbnQgcGh5bm87CisJaW50ICBwYXNzOworCXVpbnQgcGh5dHlwZTsKKwlpbnQgcGh5YWRkcjsKKworCXBoeWFkZHIgPSAtMTsJLyogZGlkbid0IGZpbmQgYSBQSFkgeWV0ICovCisJZm9yIChwYXNzID0gMTsgcGFzcyA8PSBNQVhfUEhZX1BBU1NFUyAmJiBwaHlhZGRyIDwgMDsgKytwYXNzKSB7CisJCWlmIChwYXNzID4gMSkgeworCQkJLyogUEhZIG1heSBuZWVkIG1vcmUgdGltZSB0byByZWNvdmVyIGZyb20gcmVzZXQuCisJCQkgKiBUaGUgTFhUOTcwIG5lZWRzIDUwbXMgdHlwaWNhbCwgbm8gbWF4aW11bSBpcworCQkJICogc3BlY2lmaWVkLCBzbyB3YWl0IDEwbXMgYmVmb3JlIHRyeSBhZ2Fpbi4KKwkJCSAqIFdpdGggMTEgcGFzc2VzIHRoaXMgZ2l2ZXMgaXQgMTAwbXMgdG8gd2FrZSB1cC4KKwkJCSAqLworCQkJdWRlbGF5KDEwMDAwKTsJLyogd2FpdCAxMG1zICovCisJCX0KKwkJZm9yIChwaHlubyA9IDA7IHBoeW5vIDwgMzIgJiYgcGh5YWRkciA8IDA7ICsrcGh5bm8pIHsKKwkJCXBoeXR5cGUgPSBtaWlfc2VuZChta19taWlfcmVhZChwaHlubywgUEhZX1BIWUlEUjIpKTsKKyNpZmRlZiBFVF9ERUJVRworCQkJcHJpbnRmKCJQSFkgdHlwZSAweCV4IHBhc3MgJWQgdHlwZSAiLCBwaHl0eXBlLCBwYXNzKTsKKyNlbmRpZgorCQkJaWYgKHBoeXR5cGUgIT0gMHhmZmZmKSB7CisJCQkJcGh5YWRkciA9IHBoeW5vOworCQkJCXBoeXR5cGUgfD0gbWlpX3NlbmQobWtfbWlpX3JlYWQocGh5bm8sCisJCQkJCQkJCVBIWV9QSFlJRFIxKSkgPDwgMTY7CisKKyNpZmRlZiBFVF9ERUJVRworCQkJCXByaW50ZigiUEhZIEAgMHgleCBwYXNzICVkIHR5cGUgIixwaHlubyxwYXNzKTsKKwkJCQlzd2l0Y2ggKHBoeXR5cGUgJiAweGZmZmZmZmYwKSB7CisJCQkJY2FzZSBQSFlfSURfTFhUOTcwOgorCQkJCQlwcmludGYoIkxYVDk3MFxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUEhZX0lEX0xYVDk3MToKKwkJCQkJcHJpbnRmKCJMWFQ5NzFcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBIWV9JRF84MjU1NToKKwkJCQkJcHJpbnRmKCI4MjU1NVxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUEhZX0lEX1FTNjYxMjoKKwkJCQkJcHJpbnRmKCJRUzY2MTJcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBIWV9JRF9BTUQ3OUM3ODQ6CisJCQkJCXByaW50ZigiQU1ENzlDNzg0XG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQSFlfSURfTFNJODAyMjVCOgorCQkJCQlwcmludGYoIkxTSSBMODAyMjUvQlxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUEhZX0lEX0RNOTE2MToKKwkJCQkJcHJpbnRmKCJEYXZpY29tIERNOTE2MVxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUEhZX0lEX0tTTTg5OTVNOgorCQkJCQlwcmludGYoIk1JQ1JFTCBLUzg5OTVNXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRmKCIweCUwOHhcbiIsIHBoeXR5cGUpOworCQkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCX0KKwkJfQorCX0KKwlpZiAocGh5YWRkciA8IDApIHsKKwkJcHJpbnRmKCJObyBQSFkgZGV2aWNlIGZvdW5kLlxuIik7CisJfQorCXJldHVybiBwaHlhZGRyOworfQorI2VuZGlmCS8qIENPTkZJR19TWVNfRElTQ09WRVJfUEhZICovCisKKyNpZiAoZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKSkgJiYgIWRlZmluZWQoQ09ORklHX0JJVEJBTkdNSUkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtaWlfaW5pdCAtLSBJbml0aWFsaXplIHRoZSBNSUkgdmlhIEZFQyAxIGZvciBNSUkgY29tbWFuZCB3aXRob3V0IGV0aGVybmV0CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgc3Vic2V0IG9mIGV0aF9pbml0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdGF0aWMgdm9pZCBfX21paV9pbml0KHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcCA9ICYoaW1tci0+aW1fY3BtLmNwX2ZlYyk7CisKKwlpZiAoZmVjX3Jlc2V0KGZlY3ApIDwgMCkKKwkJcHJpbnRmICgiRkVDX1JFU0VUX0RFTEFZIHRpbWVvdXRcbiIpOworCisJLyogV2UgdXNlIHN0cmljdGx5IHBvbGxpbmcgbW9kZSBvbmx5CisJICovCisJZmVjcC0+ZmVjX2ltYXNrID0gMDsKKworCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdAorCSAqLworCWZlY3AtPmZlY19pZXZlbnQgPSAweGZmYzA7CisKKwkvKiBOb3cgZW5hYmxlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzaW5nCisJICovCisJZmVjcC0+ZmVjX2VjbnRybCA9IEZFQ19FQ05UUkxfUElOTVVYIHwgRkVDX0VDTlRSTF9FVEhFUl9FTjsKK30KKwordm9pZCBtaWlfaW5pdCAodm9pZCkKK3sKKwlpbnQgaTsKKworCV9fbWlpX2luaXQoKTsKKworCS8qIFNldHVwIHRoZSBwaW4gY29uZmlndXJhdGlvbiBvZiB0aGUgRkVDKHMpCisJKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGV0aGVyX2ZjY19pbmZvKSAvIHNpemVvZihldGhlcl9mY2NfaW5mb1swXSk7IGkrKykKKwkJZmVjX3Bpbl9pbml0KGV0aGVyX2ZjY19pbmZvW2ldLmV0aGVyX2luZGV4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkIGFuZCB3cml0ZSBhIE1JSSBQSFkgcmVnaXN0ZXIsIHJvdXRpbmVzIHVzZWQgYnkgTUlJIFV0aWxpdGllcworICoKKyAqIEZJWE1FOiBUaGVzZSByb3V0aW5lcyBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuIDAgb24gc3VjY2VzcywgYnV0IG1paV9zZW5kCisgKgkgIGRvZXMgX25vdF8gcmV0dXJuIGFuIGVycm9yIGNvZGUuIE1heWJlIDB4RkZGRiBtZWFucyBlcnJvciwgaS5lLgorICoJICBubyBQSFkgY29ubmVjdGVkLi4uCisgKgkgIEZvciBub3cgYWx3YXlzIHJldHVybiAwLgorICogRklYTUU6IFRoZXNlIHJvdXRpbmVzIG9ubHkgd29yayBhZnRlciBjYWxsaW5nIGV0aF9pbml0KCkgYXQgbGVhc3Qgb25jZSEKKyAqCSAgT3RoZXJ3aXNlIHRoZXkgaGFuZyBpbiBtaWlfc2VuZCgpICEhISBTb3JyeSEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGZlYzh4eF9taWlwaHlfcmVhZChjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGFkZHIsCisJCXVuc2lnbmVkIGNoYXIgIHJlZywgdW5zaWduZWQgc2hvcnQgKnZhbHVlKQoreworCXNob3J0IHJkcmVnOyAgICAvKiByZWdpc3RlciB3b3JraW5nIHZhbHVlICovCisKKyNpZmRlZiBNSUlfREVCVUcKKwlwcmludGYgKCJtaWlwaHlfcmVhZCgweCV4KSBAIDB4JXggPSAiLCByZWcsIGFkZHIpOworI2VuZGlmCisJcmRyZWcgPSBtaWlfc2VuZChta19taWlfcmVhZChhZGRyLCByZWcpKTsKKworCSp2YWx1ZSA9IHJkcmVnOworI2lmZGVmIE1JSV9ERUJVRworCXByaW50ZiAoIjB4JTA0eFxuIiwgKnZhbHVlKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitpbnQgZmVjOHh4X21paXBoeV93cml0ZShjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyICBhZGRyLAorCQl1bnNpZ25lZCBjaGFyICByZWcsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCXNob3J0IHJkcmVnOyAgICAvKiByZWdpc3RlciB3b3JraW5nIHZhbHVlICovCisjaWZkZWYgTUlJX0RFQlVHCisJcHJpbnRmICgibWlpcGh5X3dyaXRlKDB4JXgpIEAgMHgleCA9ICIsIHJlZywgYWRkcik7CisjZW5kaWYKKwlyZHJlZyA9IG1paV9zZW5kKG1rX21paV93cml0ZShhZGRyLCByZWcsIHZhbHVlKSk7CisKKyNpZmRlZiBNSUlfREVCVUcKKwlwcmludGYgKCIweCUwNHhcbiIsIHZhbHVlKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvZmVjLmggYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9mZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDk0MTdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvZmVjLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmCV9GRUNfSF8KKyNkZWZpbmUJX0ZFQ19IXworCisKKyNlbmRpZgkvKiBfRkVDX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9pMmMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzOGNhYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9pMmMuYwpAQCAtMCwwICsxLDcwNyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogUGFvbG8gU2NhZmZhcmRpLCBBSVJWRU5UIFNBTSBzLnAuYSAtIFJJTUlOSShJVEFMWSksIGFyc2VuaW9AdGluLml0CisgKgorICogKEMpIENvcHlyaWdodCAyMDAwIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEJhY2sgcG9ydGVkIHRvIHRoZSA4eHggcGxhdGZvcm0gKGZyb20gdGhlIDgyNjAgcGxhdGZvcm0pIGJ5CisgKiBNdXJyYXkuSmVuc2VuQGNtc3QuY3Npcm8uYXUsIDI3LUphbi0wMS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDT05GSUdfSEFSRF9JMkMKKworI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSA8aTJjLmg+CisjaWZkZWYgQ09ORklHX0xXTU9OCisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKyNlbmRpZgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworLyogZGVmaW5lIHRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyAqLworI3VuZGVmCURFQlVHX0kyQworCisvKiB0eC9yeCB0aW1lb3V0ICh3ZSBuZWVkIHRoZSBpMmMgZWFybHksIHNvIHdlIGRvbid0IHVzZSBnZXRfdGltZXIoKSkgKi8KKyNkZWZpbmUgVE9VVF9MT09QIDEwMDAwMDAKKworI2RlZmluZSBOVU1fUlhfQkRTIDQKKyNkZWZpbmUgTlVNX1RYX0JEUyA0CisjZGVmaW5lIE1BWF9UWF9TUEFDRSAyNTYKKyNkZWZpbmUgSTJDX1JYVFhfTEVOIDEyOAkvKiBtYXhpbXVtIHR4L3J4IGJ1ZmZlciBsZW5ndGggKi8KKwordHlwZWRlZiBzdHJ1Y3QgSTJDX0JECit7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworICB1bnNpZ25lZCBjaGFyICphZGRyOworfSBJMkNfQkQ7CisjZGVmaW5lIEJEX0kyQ19UWF9TVEFSVCAweDA0MDAgIC8qIHNwZWNpYWwgc3RhdHVzIGZvciBpMmM6IFN0YXJ0IGNvbmRpdGlvbiAqLworCisjZGVmaW5lIEJEX0kyQ19UWF9DTAkweDAwMDEJLyogY29sbGlzaW9uIGVycm9yICovCisjZGVmaW5lIEJEX0kyQ19UWF9VTgkweDAwMDIJLyogdW5kZXJmbG93IGVycm9yICovCisjZGVmaW5lIEJEX0kyQ19UWF9OQUsJMHgwMDA0CS8qIG5vIGFja25vd2xlZGdlIGVycm9yICovCisjZGVmaW5lIEJEX0kyQ19UWF9FUlIJKEJEX0kyQ19UWF9OQUt8QkRfSTJDX1RYX1VOfEJEX0kyQ19UWF9DTCkKKworI2RlZmluZSBCRF9JMkNfUlhfRVJSCUJEX1NDX09WCisKK3R5cGVkZWYgdm9pZCAoKmkyY19lY2JfdCkoaW50LCBpbnQpOwkvKiBlcnJvciBjYWxsYmFjayBmdW5jdGlvbiAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyB0cmFjayBvZiB0aGUgYmQgYW5kIGJ1ZmZlciBzcGFjZSB1c2FnZS4gKi8KK3R5cGVkZWYgc3RydWN0IGkyY19zdGF0ZSB7CisJaW50CQlyeF9pZHg7CQkvKiBpbmRleCAgIHRvIG5leHQgZnJlZSBSeCBCRCAqLworCWludAkJdHhfaWR4OwkJLyogaW5kZXggICB0byBuZXh0IGZyZWUgVHggQkQgKi8KKwl2b2lkCQkqcnhiZDsJCS8qIHBvaW50ZXIgdG8gbmV4dCBmcmVlIFJ4IEJEICovCisJdm9pZAkJKnR4YmQ7CQkvKiBwb2ludGVyIHRvIG5leHQgZnJlZSBUeCBCRCAqLworCWludAkJdHhfc3BhY2U7CS8qIG51bWJlciAgb2YgVHggYnl0ZXMgbGVmdCAgICovCisJdW5zaWduZWQgY2hhcgkqdHhfYnVmOwkvKiBwb2ludGVyIHRvIGZyZWUgVHggYXJlYSAgICAqLworCWkyY19lY2JfdAllcnJfY2I7CQkvKiBlcnJvciBjYWxsYmFjayBmdW5jdGlvbiAgICAqLworfSBpMmNfc3RhdGVfdDsKKworCisvKiBmbGFncyBmb3IgaTJjX3NlbmQoKSBhbmQgaTJjX3JlY2VpdmUoKSAqLworI2RlZmluZSBJMkNGX0VOQUJMRV9TRUNPTkRBUlkJMHgwMQkvKiBzZWNvbmRhcnlfYWRkcmVzcyBpcyB2YWxpZAkJKi8KKyNkZWZpbmUgSTJDRl9TVEFSVF9DT05ECQkweDAyCS8qIHR4OiBnZW5lcmF0ZSBzdGFydCBjb25kaXRpb24JCSovCisjZGVmaW5lIEkyQ0ZfU1RPUF9DT05ECQkweDA0CS8qIHR4OiBnZW5lcmF0ZSBzdG9wICBjb25kaXRpb24JCSovCisKKy8qIHJldHVybiBjb2RlcyAqLworI2RlZmluZSBJMkNFUlJfTk9fQlVGRkVSUwkweDAxCS8qIG5vIG1vcmUgQkRzIG9yIGJ1ZmZlciBzcGFjZQkJKi8KKyNkZWZpbmUgSTJDRVJSX01TR19UT09fTE9ORwkweDAyCS8qIHRyaWVkIHRvIHNlbmQvcmVjZWl2ZSB0byBtdWNoIGRhdGEJKi8KKyNkZWZpbmUgSTJDRVJSX1RJTUVPVVQJCTB4MDMJLyogdGltZW91dCBpbiBpMmNfZG9pbygpCQkqLworI2RlZmluZSBJMkNFUlJfUVVFVUVfRU1QVFkJMHgwNAkvKiBpMmNfZG9pbyBjYWxsZWQgd2l0aG91dCBzZW5kL3JlY2VpdmUgKi8KKworLyogZXJyb3IgY2FsbGJhY2sgZmxhZ3MgKi8KKyNkZWZpbmUgSTJDRUNCX1JYX0VSUgkJMHgxMAkvKiB0aGlzIGlzIGEgcmVjZWl2ZSBlcnJvcgkJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9SWF9FUlJfT1YJMHgwMgkvKiByZWNlaXZlIG92ZXJydW4gZXJyb3IJCSovCisjZGVmaW5lICAgICBJMkNFQ0JfUlhfTUFTSwkweDBmCS8qIG1hc2sgZm9yIGVycm9yIGJpdHMJCQkqLworI2RlZmluZSBJMkNFQ0JfVFhfRVJSCQkweDIwCS8qIHRoaXMgaXMgYSB0cmFuc21pdCBlcnJvcgkJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9UWF9DTAkweDAxCS8qIHRyYW5zbWl0IGNvbGxpc2lvbiBlcnJvcgkJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9UWF9VTgkweDAyCS8qIHRyYW5zbWl0IHVuZGVyZmxvdyBlcnJvcgkJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9UWF9OQUsJMHgwNAkvKiB0cmFuc21pdCBubyBhY2sgZXJyb3IJCSovCisjZGVmaW5lICAgICBJMkNFQ0JfVFhfTUFTSwkweDBmCS8qIG1hc2sgZm9yIGVycm9yIGJpdHMJCQkqLworI2RlZmluZSBJMkNFQ0JfVElNRU9VVAkJMHg0MAkvKiB0aGlzIGlzIGEgdGltZW91dCBlcnJvcgkJKi8KKworI2lmZGVmIERFQlVHX0kyQworI2RlZmluZSBQUklOVEQoeCkgcHJpbnRmIHgKKyNlbHNlCisjZGVmaW5lIFBSSU5URCh4KQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm5zIHRoZSBiZXN0IHZhbHVlIG9mIEkyQlJHIHRvIG1lZXQgZGVzaXJlZCBjbG9jayBzcGVlZCBvZiBJMkMgd2l0aAorICogaW5wdXQgcGFyYW1ldGVycyAoY2xvY2sgc3BlZWQsIGZpbHRlciwgYW5kIHByZWRpdmlkZXIgdmFsdWUpLgorICogSXQgcmV0dXJucyBjb21wdXRlciBzcGVlZCB2YWx1ZSBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpdCBhbmQgZGVzaXJlZAorICogc3BlZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpMmNfcm91bmRyYXRlKGludCBoeiwgaW50IHNwZWVkLCBpbnQgZmlsdGVyLCBpbnQgbW9kdmFsLAorCQlpbnQgKmJyZ3ZhbCwgaW50ICp0b3RzcGVlZCkKK3sKKyAgICBpbnQgbW9kZGl2ID0gMSA8PCAoNS0obW9kdmFsICYgMykpLCBicmdkaXYsIGRpdjsKKworICAgIFBSSU5URCgoIlx0W0kyQ10gdHJ5aW5nIGh6PSVkLCBzcGVlZD0lZCwgZmlsdGVyPSVkLCBtb2R2YWw9JWRcbiIsCisJaHosIHNwZWVkLCBmaWx0ZXIsIG1vZHZhbCkpOworCisgICAgZGl2ID0gbW9kZGl2ICogc3BlZWQ7CisgICAgYnJnZGl2ID0gKGh6ICsgZGl2IC0gMSkgLyBkaXY7CisKKyAgICBQUklOVEQoKCJcdFx0bW9kZGl2PSVkLCBicmdkaXY9JWRcbiIsIG1vZGRpdiwgYnJnZGl2KSk7CisKKyAgICAqYnJndmFsID0gKChicmdkaXYgKyAxKSAvIDIpIC0gMyAtICgyKmZpbHRlcik7CisKKyAgICBpZiAoKCpicmd2YWwgPCAwKSB8fCAoKmJyZ3ZhbCA+IDI1NSkpIHsKKwkgIFBSSU5URCgoIlx0XHRyZWplY3RlZCBicmd2YWw9JWRcbiIsICpicmd2YWwpKTsKKwkgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBicmdkaXYgPSAyICogKCpicmd2YWwgKyAzICsgKDIgKiBmaWx0ZXIpKTsKKyAgICBkaXYgPSBtb2RkaXYgKiBicmdkaXYgOworICAgICp0b3RzcGVlZCA9IGh6IC8gZGl2OworCisgICAgUFJJTlREKCgiXHRcdGFjY2VwdGVkIGJyZ3ZhbD0lZCwgdG90c3BlZWQ9JWRcbiIsICpicmd2YWwsICp0b3RzcGVlZCkpOworCisgICAgcmV0dXJuICAwOworfQorCisvKgorICogU2V0cyB0aGUgSTJDIGNsb2NrIHByZWRpdmlkZXIgYW5kIGRpdmlkZXIgdG8gbWVldCByZXF1aXJlZCBjbG9jayBzcGVlZC4KKyAqLworc3RhdGljIGludAoraTJjX3NldHJhdGUgKGludCBoeiwgaW50IHNwZWVkKQoreworCWltbWFwX3QJCSppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBpMmM4eHhfdCAqaTJjID0gKGkyYzh4eF90ICopICYgaW1tYXAtPmltX2kyYzsKKwlpbnQJCWJyZ3ZhbCwKKwkJCW1vZHZhbCwJCS8qIDAtMyAqLworCQkJYmVzdHNwZWVkX2RpZmYgPSBzcGVlZCwKKwkJCWJlc3RzcGVlZF9icmd2YWwgPSAwLAorCQkJYmVzdHNwZWVkX21vZHZhbCA9IDAsCisJCQliZXN0c3BlZWRfZmlsdGVyID0gMCwKKwkJCXRvdHNwZWVkLAorCQkJZmlsdGVyID0gMDsJLyogVXNlIHRoaXMgZml4ZWQgdmFsdWUgKi8KKworCWZvciAobW9kdmFsID0gMDsgbW9kdmFsIDwgNDsgbW9kdmFsKyspIHsKKwkJaWYgKGkyY19yb3VuZHJhdGUoaHosc3BlZWQsZmlsdGVyLG1vZHZhbCwmYnJndmFsLCZ0b3RzcGVlZCkgPT0gMCkgeworCQkJaW50IGRpZmYgPSBzcGVlZCAtIHRvdHNwZWVkOworCisJCQlpZiAoKGRpZmYgPj0gMCkgJiYgKGRpZmYgPCBiZXN0c3BlZWRfZGlmZikpIHsKKwkJCQliZXN0c3BlZWRfZGlmZiA9IGRpZmY7CisJCQkJYmVzdHNwZWVkX21vZHZhbCA9IG1vZHZhbDsKKwkJCQliZXN0c3BlZWRfYnJndmFsID0gYnJndmFsOworCQkJCWJlc3RzcGVlZF9maWx0ZXIgPSBmaWx0ZXI7CisJCQl9CisJCX0KKwl9CisKKwlQUklOVEQgKCgiW0kyQ10gQmVzdCBpczpcbiIpKTsKKwlQUklOVEQgKCgiW0kyQ10gQ1BVPSVkaHogUkFURT0lZCBGPSVkIEkyTU9EPSUwOHggSTJCUkc9JTA4eCBESUZGPSVkaHpcbiIsCisJCWh6LAorCQlzcGVlZCwKKwkJYmVzdHNwZWVkX2ZpbHRlciwKKwkJYmVzdHNwZWVkX21vZHZhbCwKKwkJYmVzdHNwZWVkX2JyZ3ZhbCwKKwkJYmVzdHNwZWVkX2RpZmYpKTsKKworCWkyYy0+aTJjX2kybW9kIHw9ICgoYmVzdHNwZWVkX21vZHZhbCAmIDMpIDw8IDEpIHwgKGJlc3RzcGVlZF9maWx0ZXIgPDwgMyk7CisJaTJjLT5pMmNfaTJicmcgPSBiZXN0c3BlZWRfYnJndmFsICYgMHhmZjsKKworCVBSSU5URCAoKCJbSTJDXSBpMm1vZD0lMDh4IGkyYnJnPSUwOHhcbiIsIGkyYy0+aTJjX2kybW9kLAorCQkJIGkyYy0+aTJjX2kyYnJnKSk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZAoraTJjX2luaXQoaW50IHNwZWVkLCBpbnQgc2xhdmVhZGRyKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIgOworCXZvbGF0aWxlIGNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKSZpbW1hcC0+aW1fY3BtOworCXZvbGF0aWxlIGkyYzh4eF90ICppMmMJPSAoaTJjOHh4X3QgKikmaW1tYXAtPmltX2kyYzsKKwl2b2xhdGlsZSBpaWNfdCAqaWlwID0gKGlpY190ICopJmNwLT5jcF9kcGFyYW1bUFJPRkZfSUlDXTsKKwl1bG9uZyByYmFzZSwgdGJhc2U7CisJdm9sYXRpbGUgSTJDX0JEICpyeGJkLCAqdHhiZDsKKwl1aW50IGRwYWRkcjsKKworI2lmZGVmIENPTkZJR19TWVNfSTJDX0lOSVRfQk9BUkQKKwkvKiBjYWxsIGJvYXJkIHNwZWNpZmljIGkyYyBidXMgcmVzZXQgcm91dGluZSBiZWZvcmUgYWNjZXNzaW5nIHRoZSAgICovCisJLyogZW52aXJvbm1lbnQsIHdoaWNoIG1pZ2h0IGJlIGluIGEgY2hpcCBvbiB0aGF0IGJ1cy4gRm9yIGRldGFpbHMgICAqLworCS8qIGFib3V0IHRoaXMgcHJvYmxlbSBzZWUgZG9jL0kyQ19FZGdlX0NvbmRpdGlvbnMuICAgICAgICAgICAgICAgICAgKi8KKwlpMmNfaW5pdF9ib2FyZCgpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1lTX0kyQ19VQ09ERV9QQVRDSAorCWlpcCA9IChpaWNfdCAqKSZjcC0+Y3BfZHBtZW1baWlwLT5paWNfcnBiYXNlXTsKKyNlbHNlCisJLyogRGlzYWJsZSByZWxvY2F0aW9uICovCisJaWlwLT5paWNfcnBiYXNlID0gMDsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NZU19BTExPQ19EUFJBTQorCWRwYWRkciA9IGlpcC0+aWljX3JiYXNlOworCWlmIChkcGFkZHIgPT0gMCkgeworCSAgICAvKiBuZWVkIHRvIGFsbG9jYXRlIGR1YWwgcG9ydCByYW0gKi8KKwkgICAgZHBhZGRyID0gZHByYW1fYWxsb2NfYWxpZ24oCisJCShOVU1fUlhfQkRTICogc2l6ZW9mKEkyQ19CRCkpICsgKE5VTV9UWF9CRFMgKiBzaXplb2YoSTJDX0JEKSkgKworCQlNQVhfVFhfU1BBQ0UsIDgpOworCX0KKyNlbHNlCisJZHBhZGRyID0gQ1BNX0kyQ19CQVNFOworI2VuZGlmCisKKwkvKgorCSAqIGluaXRpYWxpc2UgZGF0YSBpbiBkdWFsIHBvcnQgcmFtOgorCSAqCisJICogZHBhZGRyLT5yYmFzZSAtPiByeCBCRCAgICAgICAgIChOVU1fUlhfQkRTICogc2l6ZW9mKEkyQ19CRCkgYnl0ZXMpCisJICogICAgICAgICB0YmFzZSAtPiB0eCBCRCAgICAgICAgIChOVU1fVFhfQkRTICogc2l6ZW9mKEkyQ19CRCkgYnl0ZXMpCisJICogICAgICAgICAgICAgICAgICB0eCBidWZmZXIgICAgIChNQVhfVFhfU1BBQ0UgYnl0ZXMpCisJICovCisKKwlyYmFzZSA9IGRwYWRkcjsKKwl0YmFzZSA9IHJiYXNlICsgTlVNX1JYX0JEUyAqIHNpemVvZihJMkNfQkQpOworCisJLyogSW5pdGlhbGl6ZSBQb3J0IEIgSTJDIHBpbnMuICovCisJY3AtPmNwX3BicGFyIHw9IDB4MDAwMDAwMzA7CisJY3AtPmNwX3BiZGlyIHw9IDB4MDAwMDAwMzA7CisJY3AtPmNwX3Bib2RyIHw9IDB4MDAwMDAwMzA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlpMmMtPmkyY19pMm1vZCA9IDB4MDA7CisJaTJjLT5pMmNfaTJjbXIgPSAweDAwOworCWkyYy0+aTJjX2kyY2VyID0gMHhmZjsKKwlpMmMtPmkyY19pMmFkZCA9IHNsYXZlYWRkcjsKKworCS8qCisJICogU2V0IHRoZSBJMkMgQlJHIENsb2NrIGRpdmlzaW9uIGZhY3RvciBmcm9tIGRlc2lyZWQgaTJjIHJhdGUKKwkgKiBhbmQgY3VycmVudCBDUFUgcmF0ZSAod2UgYXNzdW1lIHNjY3IgZGZiZ3IgZmllbGQgaXMgMDsKKwkgKiBkaXZpZGUgQlJHQ0xLIGJ5IDEpCisJICovCisJUFJJTlREKCgiW0kyQ10gU2V0dGluZyByYXRlLi4uXG4iKSk7CisJaTJjX3NldHJhdGUgKGdkLT5jcHVfY2xrLCBDT05GSUdfU1lTX0kyQ19TUEVFRCkgOworCisJLyogU2V0IEkyQyBjb250cm9sbGVyIGluIG1hc3RlciBtb2RlICovCisJaTJjLT5pMmNfaTJjb20gPSAweDAxOworCisJLyogU2V0IFNETUEgYnVzIGFyYml0cmF0aW9uIGxldmVsIHRvIDUgKFNEQ1IpICovCisJaW1tYXAtPmltX3NpdV9jb25mLnNjX3NkY3IgPSAweDAwMDEgOworCisJLyogSW5pdGlhbGl6ZSBUeC9SeCBwYXJhbWV0ZXJzICovCisJaWlwLT5paWNfcmJhc2UgPSByYmFzZTsKKwlpaXAtPmlpY190YmFzZSA9IHRiYXNlOworCXJ4YmQgPSAoSTJDX0JEICopKCh1bnNpZ25lZCBjaGFyICopJmNwLT5jcF9kcG1lbVtpaXAtPmlpY19yYmFzZV0pOworCXR4YmQgPSAoSTJDX0JEICopKCh1bnNpZ25lZCBjaGFyICopJmNwLT5jcF9kcG1lbVtpaXAtPmlpY190YmFzZV0pOworCisJUFJJTlREKCgiW0kyQ10gcmJhc2UgPSAlMDR4XG4iLCBpaXAtPmlpY19yYmFzZSkpOworCVBSSU5URCgoIltJMkNdIHRiYXNlID0gJTA0eFxuIiwgaWlwLT5paWNfdGJhc2UpKTsKKwlQUklOVEQoKCJbSTJDXSByeGJkID0gJTA4eFxuIiwgKGludClyeGJkKSk7CisJUFJJTlREKCgiW0kyQ10gdHhiZCA9ICUwOHhcbiIsIChpbnQpdHhiZCkpOworCisJLyogU2V0IGJpZyBlbmRpYW4gYnl0ZSBvcmRlciAqLworCWlpcC0+aWljX3RmY3IgPSAweDEwOworCWlpcC0+aWljX3JmY3IgPSAweDEwOworCisJLyogU2V0IG1heGltdW0gcmVjZWl2ZSBzaXplLiAqLworCWlpcC0+aWljX21yYmxyID0gSTJDX1JYVFhfTEVOOworCisjaWZkZWYgQ09ORklHX1NZU19JMkNfVUNPREVfUEFUQ0gKKwkvKgorCSAqICBJbml0aWFsaXplIHJlcXVpcmVkIHBhcmFtZXRlcnMgaWYgdXNpbmcgbWljcm9jb2RlIHBhdGNoLgorCSAqLworCWlpcC0+aWljX3JicHRyICA9IGlpcC0+aWljX3JiYXNlOworCWlpcC0+aWljX3RicHRyICA9IGlpcC0+aWljX3RiYXNlOworCWlpcC0+aWljX3JzdGF0ZSA9IDA7CisJaWlwLT5paWNfdHN0YXRlID0gMDsKKyNlbHNlCisJY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoQ1BNX0NSX0NIX0kyQywgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisJZG8geworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisJfSB3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKKyNlbmRpZgorCisJLyogQ2xlYXIgZXZlbnRzIGFuZCBpbnRlcnJ1cHRzICovCisJaTJjLT5pMmNfaTJjZXIgPSAweGZmOworCWkyYy0+aTJjX2kyY21yID0gMHgwMDsKK30KKworc3RhdGljIHZvaWQKK2kyY19uZXdpbyhpMmNfc3RhdGVfdCAqc3RhdGUpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUiA7CisJdm9sYXRpbGUgY3BtOHh4X3QgKmNwID0gKGNwbTh4eF90ICopJmltbWFwLT5pbV9jcG07CisJdm9sYXRpbGUgaWljX3QgKmlpcCA9IChpaWNfdCAqKSZjcC0+Y3BfZHBhcmFtW1BST0ZGX0lJQ107CisKKwlQUklOVEQoKCJbSTJDXSBpMmNfbmV3aW9cbiIpKTsKKworI2lmZGVmIENPTkZJR19TWVNfSTJDX1VDT0RFX1BBVENICisJaWlwID0gKGlpY190ICopJmNwLT5jcF9kcG1lbVtpaXAtPmlpY19ycGJhc2VdOworI2VuZGlmCisJc3RhdGUtPnJ4X2lkeCA9IDA7CisJc3RhdGUtPnR4X2lkeCA9IDA7CisJc3RhdGUtPnJ4YmQgPSAodm9pZCopJmNwLT5jcF9kcG1lbVtpaXAtPmlpY19yYmFzZV07CisJc3RhdGUtPnR4YmQgPSAodm9pZCopJmNwLT5jcF9kcG1lbVtpaXAtPmlpY190YmFzZV07CisJc3RhdGUtPnR4X3NwYWNlID0gTUFYX1RYX1NQQUNFOworCXN0YXRlLT50eF9idWYgPSAodWNoYXIqKXN0YXRlLT50eGJkICsgTlVNX1RYX0JEUyAqIHNpemVvZihJMkNfQkQpOworCXN0YXRlLT5lcnJfY2IgPSBOVUxMOworCisJUFJJTlREKCgiW0kyQ10gcnhiZCA9ICUwOHhcbiIsIChpbnQpc3RhdGUtPnJ4YmQpKTsKKwlQUklOVEQoKCJbSTJDXSB0eGJkID0gJTA4eFxuIiwgKGludClzdGF0ZS0+dHhiZCkpOworCVBSSU5URCgoIltJMkNdIHR4X2J1ZiA9ICUwOHhcbiIsIChpbnQpc3RhdGUtPnR4X2J1ZikpOworCisJLyogY2xlYXIgdGhlIGJ1ZmZlciBtZW1vcnkgKi8KKwltZW1zZXQoKGNoYXIgKilzdGF0ZS0+dHhfYnVmLCAwLCBNQVhfVFhfU1BBQ0UpOworfQorCitzdGF0aWMgaW50CitpMmNfc2VuZChpMmNfc3RhdGVfdCAqc3RhdGUsCisJIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkgdW5zaWduZWQgY2hhciBzZWNvbmRhcnlfYWRkcmVzcywKKwkgdW5zaWduZWQgaW50IGZsYWdzLAorCSB1bnNpZ25lZCBzaG9ydCBzaXplLAorCSB1bnNpZ25lZCBjaGFyICpkYXRhb3V0KQoreworCXZvbGF0aWxlIEkyQ19CRCAqdHhiZDsKKwlpbnQgaSxqOworCisJUFJJTlREKCgiW0kyQ10gaTJjX3NlbmQgYWRkPSUwMmQgc2VjPSUwMmQgZmxhZz0lMDJkIHNpemU9JWRcbiIsCisJCQlhZGRyZXNzLCBzZWNvbmRhcnlfYWRkcmVzcywgZmxhZ3MsIHNpemUpKTsKKworCS8qIHRyeWluZyB0byBzZW5kIG1lc3NhZ2UgbGFyZ2VyIHRoYW4gQkQgKi8KKwlpZiAoc2l6ZSA+IEkyQ19SWFRYX0xFTikKKwkgIHJldHVybiBJMkNFUlJfTVNHX1RPT19MT05HOworCisJLyogbm8gbW9yZSBmcmVlIGJkcyAqLworCWlmIChzdGF0ZS0+dHhfaWR4ID49IE5VTV9UWF9CRFMgfHwgc3RhdGUtPnR4X3NwYWNlIDwgKDIgKyBzaXplKSkKKwkgIHJldHVybiBJMkNFUlJfTk9fQlVGRkVSUzsKKworCXR4YmQgPSAoSTJDX0JEICopc3RhdGUtPnR4YmQ7CisJdHhiZC0+YWRkciA9IHN0YXRlLT50eF9idWY7CisKKwlQUklOVEQoKCJbSTJDXSB0eGJkID0gJTA4eFxuIiwgKGludCl0eGJkKSk7CisKKwlpZiAoZmxhZ3MgJiBJMkNGX1NUQVJUX0NPTkQpIHsKKwkJUFJJTlREKCgiW0kyQ10gRm9ybWF0dGluZyBhZGRyZXNzZXMuLi5cbiIpKTsKKwkJaWYgKGZsYWdzICYgSTJDRl9FTkFCTEVfU0VDT05EQVJZKSB7CisJCQl0eGJkLT5sZW5ndGggPSBzaXplICsgMjsgIC8qIExlbmd0aCBvZiBtc2cgKyBkZXN0IGFkZHIgKi8KKwkJCXR4YmQtPmFkZHJbMF0gPSBhZGRyZXNzIDw8IDE7CisJCQl0eGJkLT5hZGRyWzFdID0gc2Vjb25kYXJ5X2FkZHJlc3M7CisJCQlpID0gMjsKKwkJfSBlbHNlIHsKKwkJCXR4YmQtPmxlbmd0aCA9IHNpemUgKyAxOyAgLyogTGVuZ3RoIG9mIG1zZyArIGRlc3QgYWRkciAqLworCQkJdHhiZC0+YWRkclswXSA9IGFkZHJlc3MgPDwgMTsgIC8qIFdyaXRlIGRlc3QgYWRkciB0byBCRCAqLworCQkJaSA9IDE7CisJCX0KKwl9IGVsc2UgeworCQl0eGJkLT5sZW5ndGggPSBzaXplOyAgLyogTGVuZ3RoIG9mIG1lc3NhZ2UgKi8KKwkJaSA9IDA7CisJfQorCisJLyogc2V0IHVwIHR4YmQgKi8KKwl0eGJkLT5zdGF0dXMgPSBCRF9TQ19SRUFEWTsKKwlpZiAoZmxhZ3MgJiBJMkNGX1NUQVJUX0NPTkQpCisJICB0eGJkLT5zdGF0dXMgfD0gQkRfSTJDX1RYX1NUQVJUOworCWlmIChmbGFncyAmIEkyQ0ZfU1RPUF9DT05EKQorCSAgdHhiZC0+c3RhdHVzIHw9IEJEX1NDX0xBU1QgfCBCRF9TQ19XUkFQOworCisJLyogQ29weSBkYXRhIHRvIHNlbmQgaW50byBidWZmZXIgKi8KKwlQUklOVEQoKCJbSTJDXSBjb3B5IGRhdGEuLi5cbiIpKTsKKwlmb3IoaiA9IDA7IGogPCBzaXplOyBpKyssIGorKykKKwkgIHR4YmQtPmFkZHJbaV0gPSBkYXRhb3V0W2pdOworCisJUFJJTlREKCgiW0kyQ10gdHhiZDogbGVuZ3RoPTB4JTA0eCBzdGF0dXM9MHglMDR4IGFkZHJbMF09MHglMDJ4IGFkZHJbMV09MHglMDJ4XG4iLAorCQkgICB0eGJkLT5sZW5ndGgsCisJCSAgIHR4YmQtPnN0YXR1cywKKwkJICAgdHhiZC0+YWRkclswXSwKKwkJICAgdHhiZC0+YWRkclsxXSkpOworCisJLyogYWR2YW5jZSBzdGF0ZSAqLworCXN0YXRlLT50eF9idWYgKz0gdHhiZC0+bGVuZ3RoOworCXN0YXRlLT50eF9zcGFjZSAtPSB0eGJkLT5sZW5ndGg7CisJc3RhdGUtPnR4X2lkeCsrOworCXN0YXRlLT50eGJkID0gKHZvaWQqKSh0eGJkICsgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraTJjX3JlY2VpdmUoaTJjX3N0YXRlX3QgKnN0YXRlLAorCSAgICB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCisJICAgIHVuc2lnbmVkIGNoYXIgc2Vjb25kYXJ5X2FkZHJlc3MsCisJICAgIHVuc2lnbmVkIGludCBmbGFncywKKwkgICAgdW5zaWduZWQgc2hvcnQgc2l6ZV90b19leHBlY3QsCisJICAgIHVuc2lnbmVkIGNoYXIgKmRhdGFpbikKK3sKKwl2b2xhdGlsZSBJMkNfQkQgKnJ4YmQsICp0eGJkOworCisJUFJJTlREKCgiW0kyQ10gaTJjX3JlY2VpdmUgJTAyZCAlMDJkICUwMmRcbiIsIGFkZHJlc3MsIHNlY29uZGFyeV9hZGRyZXNzLCBmbGFncykpOworCisJLyogRXhwZWN0ZWQgdG8gcmVjZWl2ZSB0b28gbXVjaCAqLworCWlmIChzaXplX3RvX2V4cGVjdCA+IEkyQ19SWFRYX0xFTikKKwkgIHJldHVybiBJMkNFUlJfTVNHX1RPT19MT05HOworCisJLyogbm8gbW9yZSBmcmVlIGJkcyAqLworCWlmIChzdGF0ZS0+dHhfaWR4ID49IE5VTV9UWF9CRFMgfHwgc3RhdGUtPnJ4X2lkeCA+PSBOVU1fUlhfQkRTCisJCSB8fCBzdGF0ZS0+dHhfc3BhY2UgPCAyKQorCSAgcmV0dXJuIEkyQ0VSUl9OT19CVUZGRVJTOworCisJcnhiZCA9IChJMkNfQkQgKilzdGF0ZS0+cnhiZDsKKwl0eGJkID0gKEkyQ19CRCAqKXN0YXRlLT50eGJkOworCisJUFJJTlREKCgiW0kyQ10gcnhiZCA9ICUwOHhcbiIsIChpbnQpcnhiZCkpOworCVBSSU5URCgoIltJMkNdIHR4YmQgPSAlMDh4XG4iLCAoaW50KXR4YmQpKTsKKworCXR4YmQtPmFkZHIgPSBzdGF0ZS0+dHhfYnVmOworCisJLyogc2V0IHVwIFRYQkQgZm9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlpZiAoZmxhZ3MgJiBJMkNGX0VOQUJMRV9TRUNPTkRBUlkpIHsKKwkJdHhiZC0+bGVuZ3RoID0gMjsKKwkJdHhiZC0+YWRkclswXSA9IGFkZHJlc3MgPDwgMTsgICAvKiBXcml0ZSBkYXRhICovCisJCXR4YmQtPmFkZHJbMV0gPSBzZWNvbmRhcnlfYWRkcmVzczsgIC8qIEludGVybmFsIGFkZHJlc3MgKi8KKwkJdHhiZC0+c3RhdHVzID0gQkRfU0NfUkVBRFk7CisJfSBlbHNlIHsKKwkJdHhiZC0+bGVuZ3RoID0gMSArIHNpemVfdG9fZXhwZWN0OworCQl0eGJkLT5hZGRyWzBdID0gKGFkZHJlc3MgPDwgMSkgfCAweDAxOworCQl0eGJkLT5zdGF0dXMgPSBCRF9TQ19SRUFEWTsKKwkJbWVtc2V0KCZ0eGJkLT5hZGRyWzFdLCAwLCB0eGJkLT5sZW5ndGgpOworCX0KKworCS8qIHNldCB1cCByeGJkIGZvciByZWNlcHRpb24gKi8KKwlyeGJkLT5zdGF0dXMgPSBCRF9TQ19FTVBUWTsKKwlyeGJkLT5sZW5ndGggPSBzaXplX3RvX2V4cGVjdDsKKwlyeGJkLT5hZGRyID0gZGF0YWluOworCisJdHhiZC0+c3RhdHVzIHw9IEJEX0kyQ19UWF9TVEFSVDsKKwlpZiAoZmxhZ3MgJiBJMkNGX1NUT1BfQ09ORCkgeworCQl0eGJkLT5zdGF0dXMgfD0gQkRfU0NfTEFTVCB8IEJEX1NDX1dSQVA7CisJCXJ4YmQtPnN0YXR1cyB8PSBCRF9TQ19XUkFQOworCX0KKworCVBSSU5URCgoIltJMkNdIHR4YmQ6IGxlbmd0aD0weCUwNHggc3RhdHVzPTB4JTA0eCBhZGRyWzBdPTB4JTAyeCBhZGRyWzFdPTB4JTAyeFxuIiwKKwkJICAgdHhiZC0+bGVuZ3RoLAorCQkgICB0eGJkLT5zdGF0dXMsCisJCSAgIHR4YmQtPmFkZHJbMF0sCisJCSAgIHR4YmQtPmFkZHJbMV0pKTsKKwlQUklOVEQoKCJbSTJDXSByeGJkOiBsZW5ndGg9MHglMDR4IHN0YXR1cz0weCUwNHggYWRkclswXT0weCUwMnggYWRkclsxXT0weCUwMnhcbiIsCisJCSAgIHJ4YmQtPmxlbmd0aCwKKwkJICAgcnhiZC0+c3RhdHVzLAorCQkgICByeGJkLT5hZGRyWzBdLAorCQkgICByeGJkLT5hZGRyWzFdKSk7CisKKwkvKiBhZHZhbmNlIHN0YXRlICovCisJc3RhdGUtPnR4X2J1ZiArPSB0eGJkLT5sZW5ndGg7CisJc3RhdGUtPnR4X3NwYWNlIC09IHR4YmQtPmxlbmd0aDsKKwlzdGF0ZS0+dHhfaWR4Kys7CisJc3RhdGUtPnR4YmQgPSAodm9pZCopKHR4YmQgKyAxKTsKKwlzdGF0ZS0+cnhfaWR4Kys7CisJc3RhdGUtPnJ4YmQgPSAodm9pZCopKHJ4YmQgKyAxKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaTJjX2RvaW8oaTJjX3N0YXRlX3QgKnN0YXRlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIgOworCXZvbGF0aWxlIGNwbTh4eF90ICpjcCA9IChjcG04eHhfdCAqKSZpbW1hcC0+aW1fY3BtOworCXZvbGF0aWxlIGkyYzh4eF90ICppMmMJPSAoaTJjOHh4X3QgKikmaW1tYXAtPmltX2kyYzsKKwl2b2xhdGlsZSBpaWNfdCAqaWlwID0gKGlpY190ICopJmNwLT5jcF9kcGFyYW1bUFJPRkZfSUlDXTsKKwl2b2xhdGlsZSBJMkNfQkQgKnR4YmQsICpyeGJkOworCXZvbGF0aWxlIGludCBqID0gMDsKKworCVBSSU5URCgoIltJMkNdIGkyY19kb2lvXG4iKSk7CisKKyNpZmRlZiBDT05GSUdfU1lTX0kyQ19VQ09ERV9QQVRDSAorCWlpcCA9IChpaWNfdCAqKSZjcC0+Y3BfZHBtZW1baWlwLT5paWNfcnBiYXNlXTsKKyNlbmRpZgorCisJaWYgKHN0YXRlLT50eF9pZHggPD0gMCAmJiBzdGF0ZS0+cnhfaWR4IDw9IDApIHsKKwkJUFJJTlREKCgiW0kyQ10gTm8gSS9PIGlzIHF1ZXVlZFxuIikpOworCQlyZXR1cm4gSTJDRVJSX1FVRVVFX0VNUFRZOworCX0KKworCWlpcC0+aWljX3JicHRyID0gaWlwLT5paWNfcmJhc2U7CisJaWlwLT5paWNfdGJwdHIgPSBpaXAtPmlpY190YmFzZTsKKworCS8qIEVuYWJsZSBJMkMgKi8KKwlQUklOVEQoKCJbSTJDXSBFbmFibGluZyBJMkMuLi5cbiIpKTsKKwlpMmMtPmkyY19pMm1vZCB8PSAweDAxOworCisJLyogQmVnaW4gdHJhbnNtaXNzaW9uICovCisJaTJjLT5pMmNfaTJjb20gfD0gMHg4MDsKKworCS8qIExvb3AgdW50aWwgdHJhbnNtaXQgJiByZWNlaXZlIGNvbXBsZXRlZCAqLworCisJaWYgKHN0YXRlLT50eF9pZHggPiAwKSB7CisJCXR4YmQgPSAoKEkyQ19CRCopc3RhdGUtPnR4YmQpIC0gMTsKKwkJUFJJTlREKCgiW0kyQ10gVHJhbnNtaXR0aW5nLi4uKHR4YmQ9MHglMDhseClcbiIsICh1bG9uZyl0eGJkKSk7CisJCXdoaWxlKCh0eGJkLT5zdGF0dXMgJiBCRF9TQ19SRUFEWSkgJiYgKGorKyA8IFRPVVRfTE9PUCkpIHsKKwkJCWlmIChjdHJsYygpKSB7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisJCX0KKwl9CisKKwlpZiAoKHN0YXRlLT5yeF9pZHggPiAwKSAmJiAoaiA8IFRPVVRfTE9PUCkpIHsKKwkJcnhiZCA9ICgoSTJDX0JEKilzdGF0ZS0+cnhiZCkgLSAxOworCQlQUklOVEQoKCJbSTJDXSBSZWNlaXZpbmcuLi4ocnhiZD0weCUwOGx4KVxuIiwgKHVsb25nKXJ4YmQpKTsKKwkJd2hpbGUoKHJ4YmQtPnN0YXR1cyAmIEJEX1NDX0VNUFRZKSAmJiAoaisrIDwgVE9VVF9MT09QKSkgeworCQkJaWYgKGN0cmxjKCkpIHsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKwkJfQorCX0KKworCS8qIFR1cm4gb2ZmIEkyQyAqLworCWkyYy0+aTJjX2kybW9kICY9IH4weDAxOworCisJaWYgKHN0YXRlLT5lcnJfY2IgIT0gTlVMTCkgeworCQlpbnQgbiwgaSwgYjsKKworCQkvKgorCQkgKiBpZiB3ZSBoYXZlIGFuIGVycm9yIGNhbGxiYWNrIGZ1bmN0aW9uLCBsb29rIGF0IHRoZQorCQkgKiBlcnJvciBiaXRzIGluIHRoZSBiZCBzdGF0dXMgYW5kIHBhc3MgdGhlbSBiYWNrCisJCSAqLworCisJCWlmICgobiA9IHN0YXRlLT50eF9pZHgpID4gMCkgeworCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJCXR4YmQgPSAoKEkyQ19CRCopc3RhdGUtPnR4YmQpIC0gKG4gLSBpKTsKKwkJCQlpZiAoKGIgPSB0eGJkLT5zdGF0dXMgJiBCRF9JMkNfVFhfRVJSKSAhPSAwKQorCQkJCQkoKnN0YXRlLT5lcnJfY2IpKEkyQ0VDQl9UWF9FUlJ8YiwgaSk7CisJCQl9CisJCX0KKworCQlpZiAoKG4gPSBzdGF0ZS0+cnhfaWR4KSA+IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCQlyeGJkID0gKChJMkNfQkQqKXN0YXRlLT5yeGJkKSAtIChuIC0gaSk7CisJCQkJaWYgKChiID0gcnhiZC0+c3RhdHVzICYgQkRfSTJDX1JYX0VSUikgIT0gMCkKKwkJCQkJKCpzdGF0ZS0+ZXJyX2NiKShJMkNFQ0JfUlhfRVJSfGIsIGkpOworCQkJfQorCQl9CisKKwkJaWYgKGogPj0gVE9VVF9MT09QKQorCQkJKCpzdGF0ZS0+ZXJyX2NiKShJMkNFQ0JfVElNRU9VVCwgMCk7CisJfQorCisJcmV0dXJuIChqID49IFRPVVRfTE9PUCkgPyBJMkNFUlJfVElNRU9VVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGFkX3R4X25hazsKKworc3RhdGljIHZvaWQKK2kyY190ZXN0X2NhbGxiYWNrKGludCBmbGFncywgaW50IHhudW0pCit7CisJaWYgKChmbGFncyAmIEkyQ0VDQl9UWF9FUlIpICYmIChmbGFncyAmIEkyQ0VDQl9UWF9OQUspKQorCQloYWRfdHhfbmFrID0gMTsKK30KKworaW50IGkyY19wcm9iZSh1Y2hhciBjaGlwKQoreworCWkyY19zdGF0ZV90IHN0YXRlOworCWludCByYzsKKwl1Y2hhciBidWZbMV07CisKKwlpMmNfaW5pdChDT05GSUdfU1lTX0kyQ19TUEVFRCwgQ09ORklHX1NZU19JMkNfU0xBVkUpOworCisJaTJjX25ld2lvKCZzdGF0ZSk7CisKKwlzdGF0ZS5lcnJfY2IgPSBpMmNfdGVzdF9jYWxsYmFjazsKKwloYWRfdHhfbmFrID0gMDsKKworCXJjID0gaTJjX3JlY2VpdmUoJnN0YXRlLCBjaGlwLCAwLCBJMkNGX1NUQVJUX0NPTkR8STJDRl9TVE9QX0NPTkQsIDEsIGJ1Zik7CisKKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuIChyYyk7CisKKwlyYyA9IGkyY19kb2lvKCZzdGF0ZSk7CisKKwlpZiAoKHJjICE9IDApICYmIChyYyAhPSBJMkNFUlJfVElNRU9VVCkpCisJCXJldHVybiAocmMpOworCisJcmV0dXJuIChoYWRfdHhfbmFrKTsKK30KKworaW50IGkyY19yZWFkKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJaTJjX3N0YXRlX3Qgc3RhdGU7CisJdWNoYXIgeGFkZHJbNF07CisJaW50IHJjOworCisjaWZkZWYgQ09ORklHX0xXTU9OCisJV0FUQ0hET0dfUkVTRVQoKTsKKyNlbmRpZgorCisJeGFkZHJbMF0gPSAoYWRkciA+PiAyNCkgJiAweEZGOworCXhhZGRyWzFdID0gKGFkZHIgPj4gMTYpICYgMHhGRjsKKwl4YWRkclsyXSA9IChhZGRyID4+ICA4KSAmIDB4RkY7CisJeGFkZHJbM10gPSAgYWRkciAgICAgICAgJiAweEZGOworCisjaWZkZWYgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cKKwkvKgorCSAqIEVFUFJPTSBjaGlwcyB0aGF0IGltcGxlbWVudCAiYWRkcmVzcyBvdmVyZmxvdyIgYXJlIG9uZXMgbGlrZQorCSAqIENhdGFseXN0IDI0V0MwNC8wOC8xNiB3aGljaCBoYXMgOS8xMC8xMSBiaXRzIG9mIGFkZHJlc3MgYW5kIHRoZQorCSAqIGV4dHJhIGJpdHMgZW5kIHVwIGluIHRoZSAiY2hpcCBhZGRyZXNzIiBiaXQgc2xvdHMuICBUaGlzIG1ha2VzCisJICogYSAyNFdDMDggKDFLYnl0ZSkgY2hpcCBsb29rIGxpa2UgZm91ciAyNTYgYnl0ZSBjaGlwcy4KKwkgKgorCSAqIE5vdGUgdGhhdCB3ZSBjb25zaWRlciB0aGUgbGVuZ3RoIG9mIHRoZSBhZGRyZXNzIGZpZWxkIHRvIHN0aWxsCisJICogYmUgb25lIGJ5dGUgYmVjYXVzZSB0aGUgZXh0cmEgYWRkcmVzcyBiaXRzIGFyZSBoaWRkZW4gaW4gdGhlCisJICogY2hpcCBhZGRyZXNzLgorCSAqLworCSBjaGlwIHw9ICgoYWRkciA+PiAoYWxlbiAqIDgpKSAmIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX09WRVJGTE9XKTsKKyNlbmRpZgorCisJaTJjX25ld2lvKCZzdGF0ZSk7CisKKwlyYyA9IGkyY19zZW5kKCZzdGF0ZSwgY2hpcCwgMCwgSTJDRl9TVEFSVF9DT05ELCBhbGVuLCAmeGFkZHJbNC1hbGVuXSk7CisJaWYgKHJjICE9IDApIHsKKwkJaWYgKGdkLT5oYXZlX2NvbnNvbGUpCisJCQlwcmludGYoImkyY19yZWFkOiBpMmNfc2VuZCBmYWlsZWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyYyA9IGkyY19yZWNlaXZlKCZzdGF0ZSwgY2hpcCwgMCwgSTJDRl9TVE9QX0NPTkQsIGxlbiwgYnVmZmVyKTsKKwlpZiAocmMgIT0gMCkgeworCQlpZiAoZ2QtPmhhdmVfY29uc29sZSkKKwkJCXByaW50ZigiaTJjX3JlYWQ6IGkyY19yZWNlaXZlIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiAxOworCX0KKworCXJjID0gaTJjX2RvaW8oJnN0YXRlKTsKKwlpZiAocmMgIT0gMCkgeworCQlpZiAoZ2QtPmhhdmVfY29uc29sZSkKKwkJCXByaW50ZigiaTJjX3JlYWQ6IGkyY19kb2lvIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGkyY193cml0ZSh1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWkyY19zdGF0ZV90IHN0YXRlOworCXVjaGFyIHhhZGRyWzRdOworCWludCByYzsKKworCXhhZGRyWzBdID0gKGFkZHIgPj4gMjQpICYgMHhGRjsKKwl4YWRkclsxXSA9IChhZGRyID4+IDE2KSAmIDB4RkY7CisJeGFkZHJbMl0gPSAoYWRkciA+PiAgOCkgJiAweEZGOworCXhhZGRyWzNdID0gIGFkZHIgICAgICAgICYgMHhGRjsKKworI2lmZGVmIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX09WRVJGTE9XCisJLyoKKwkgKiBFRVBST00gY2hpcHMgdGhhdCBpbXBsZW1lbnQgImFkZHJlc3Mgb3ZlcmZsb3ciIGFyZSBvbmVzIGxpa2UKKwkgKiBDYXRhbHlzdCAyNFdDMDQvMDgvMTYgd2hpY2ggaGFzIDkvMTAvMTEgYml0cyBvZiBhZGRyZXNzIGFuZCB0aGUKKwkgKiBleHRyYSBiaXRzIGVuZCB1cCBpbiB0aGUgImNoaXAgYWRkcmVzcyIgYml0IHNsb3RzLiAgVGhpcyBtYWtlcworCSAqIGEgMjRXQzA4ICgxS2J5dGUpIGNoaXAgbG9vayBsaWtlIGZvdXIgMjU2IGJ5dGUgY2hpcHMuCisJICoKKwkgKiBOb3RlIHRoYXQgd2UgY29uc2lkZXIgdGhlIGxlbmd0aCBvZiB0aGUgYWRkcmVzcyBmaWVsZCB0byBzdGlsbAorCSAqIGJlIG9uZSBieXRlIGJlY2F1c2UgdGhlIGV4dHJhIGFkZHJlc3MgYml0cyBhcmUgaGlkZGVuIGluIHRoZQorCSAqIGNoaXAgYWRkcmVzcy4KKwkgKi8KKwkgY2hpcCB8PSAoKGFkZHIgPj4gKGFsZW4gKiA4KSkgJiBDT05GSUdfU1lTX0kyQ19FRVBST01fQUREUl9PVkVSRkxPVyk7CisjZW5kaWYKKworCWkyY19uZXdpbygmc3RhdGUpOworCisJcmMgPSBpMmNfc2VuZCgmc3RhdGUsIGNoaXAsIDAsIEkyQ0ZfU1RBUlRfQ09ORCwgYWxlbiwgJnhhZGRyWzQtYWxlbl0pOworCWlmIChyYyAhPSAwKSB7CisJCWlmIChnZC0+aGF2ZV9jb25zb2xlKQorCQkJcHJpbnRmKCJpMmNfd3JpdGU6IGZpcnN0IGkyY19zZW5kIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiAxOworCX0KKworCXJjID0gaTJjX3NlbmQoJnN0YXRlLCAwLCAwLCBJMkNGX1NUT1BfQ09ORCwgbGVuLCBidWZmZXIpOworCWlmIChyYyAhPSAwKSB7CisJCWlmIChnZC0+aGF2ZV9jb25zb2xlKQorCQkJcHJpbnRmKCJpMmNfd3JpdGU6IHNlY29uZCBpMmNfc2VuZCBmYWlsZWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyYyA9IGkyY19kb2lvKCZzdGF0ZSk7CisJaWYgKHJjICE9IDApIHsKKwkJaWYgKGdkLT5oYXZlX2NvbnNvbGUpCisJCQlwcmludGYoImkyY193cml0ZTogaTJjX2RvaW8gZmFpbGVkICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYJLyogQ09ORklHX0hBUkRfSTJDICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9pbnRlcnJ1cHRzLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhYTZiMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2ludGVycnVwdHMuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4eHguaD4KKyNpbmNsdWRlIDxtcGM4eHhfaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDUE0gaW50ZXJydXB0IHZlY3RvciBmdW5jdGlvbnMuCisgKi8KK3N0cnVjdCBpbnRlcnJ1cHRfYWN0aW9uIHsKKwlpbnRlcnJ1cHRfaGFuZGxlcl90ICpoYW5kbGVyOworCXZvaWQgKmFyZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJydXB0X2FjdGlvbiBjcG1fdmVjc1tDUE1WRUNfTlJdOworc3RhdGljIHN0cnVjdCBpbnRlcnJ1cHRfYWN0aW9uIGlycV92ZWNzW05SX0lSUVNdOworCitzdGF0aWMgdm9pZCBjcG1faW50ZXJydXB0X2luaXQgKHZvaWQpOworc3RhdGljIHZvaWQgY3BtX2ludGVycnVwdCAodm9pZCAqcmVncyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBpbnRlcnJ1cHRfaW5pdF9jcHUgKHVuc2lnbmVkICpkZWNyZW1lbnRlcl9jb3VudCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCisJKmRlY3JlbWVudGVyX2NvdW50ID0gZ2V0X3RiY2xrICgpIC8gQ09ORklHX1NZU19IWjsKKworCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zaW1hc2sgPSAwOworCisJLyogQ29uZmlndXJlIENQTSBpbnRlcnJ1cHRzICovCisJY3BtX2ludGVycnVwdF9pbml0ICgpOworCisJcmV0dXJuICgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhhbmRsZSBleHRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgZXh0ZXJuYWxfaW50ZXJydXB0IChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCWludCBpcnE7CisJdWxvbmcgc2ltYXNrLCBuZXdtYXNrOworCXVsb25nIHZlYywgdl9iaXQ7CisKKwkvKgorCSAqIHJlYWQgdGhlIFNJVkVDIHJlZ2lzdGVyIGFuZCBzaGlmdCB0aGUgYml0cyBkb3duCisJICogdG8gZ2V0IHRoZSBpcnEgbnVtYmVyCisJICovCisJdmVjID0gaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2l2ZWM7CisJaXJxID0gdmVjID4+IDI2OworCXZfYml0ID0gMHg4MDAwMDAwMFVMID4+IGlycTsKKworCS8qCisJICogUmVhZCBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciBhbmQgTWFzayBJbnRlcnJ1cHRzCisJICovCisJc2ltYXNrID0gaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2ltYXNrOworCW5ld21hc2sgPSBzaW1hc2sgJiAofigweEZGRkYwMDAwID4+IGlycSkpOworCWltbXItPmltX3NpdV9jb25mLnNjX3NpbWFzayA9IG5ld21hc2s7CisKKwlpZiAoIShpcnEgJiAweDEpKSB7CQkvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgPyAgICAgKi8KKwkJdWxvbmcgc2llbDsKKworCQkvKgorCQkgKiBSZWFkIEludGVycnVwdCBFZGdlL0xldmVsIFJlZ2lzdGVyCisJCSAqLworCQlzaWVsID0gaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2llbDsKKworCQlpZiAoc2llbCAmIHZfYml0KSB7CS8qIGVkZ2UgdHJpZ2dlcmVkIGludGVycnVwdCA/ICAgKi8KKwkJCS8qCisJCQkgKiBSZXdyaXRlIFNJUEVORCBSZWdpc3RlciB0byBjbGVhciBpbnRlcnJ1cHQKKwkJCSAqLworCQkJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2lwZW5kID0gdl9iaXQ7CisJCX0KKwl9CisKKwlpZiAoaXJxX3ZlY3NbaXJxXS5oYW5kbGVyICE9IE5VTEwpIHsKKwkJaXJxX3ZlY3NbaXJxXS5oYW5kbGVyIChpcnFfdmVjc1tpcnFdLmFyZyk7CisJfSBlbHNlIHsKKwkJcHJpbnRmICgiXG5Cb2d1cyBFeHRlcm5hbCBJbnRlcnJ1cHQgSVJRICVkIFZlY3RvciAlbGRcbiIsCisJCQkJaXJxLCB2ZWMpOworCQkvKiB0dXJuIG9mZiB0aGUgYm9ndXMgaW50ZXJydXB0IHRvIGF2b2lkIGl0IGZyb20gbm93ICovCisJCXNpbWFzayAmPSB+dl9iaXQ7CisJfQorCS8qCisJICogUmUtRW5hYmxlIG9sZCBJbnRlcnJ1cHQgTWFzaworCSAqLworCWltbXItPmltX3NpdV9jb25mLnNjX3NpbWFzayA9IHNpbWFzazsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENQTSBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZCBjcG1faW50ZXJydXB0ICh2b2lkICpyZWdzKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdWludCB2ZWM7CisKKwkvKgorCSAqIEdldCB0aGUgdmVjdG9yIGJ5IHNldHRpbmcgdGhlIEFDSyBiaXQKKwkgKiBhbmQgdGhlbiByZWFkaW5nIHRoZSByZWdpc3Rlci4KKwkgKi8KKwlpbW1yLT5pbV9jcGljLmNwaWNfY2l2ciA9IDE7CisJdmVjID0gaW1tci0+aW1fY3BpYy5jcGljX2NpdnI7CisJdmVjID4+PSAxMTsKKworCWlmIChjcG1fdmVjc1t2ZWNdLmhhbmRsZXIgIT0gTlVMTCkgeworCQkoKmNwbV92ZWNzW3ZlY10uaGFuZGxlcikgKGNwbV92ZWNzW3ZlY10uYXJnKTsKKwl9IGVsc2UgeworCQlpbW1yLT5pbV9jcGljLmNwaWNfY2ltciAmPSB+KDEgPDwgdmVjKTsKKwkJcHJpbnRmICgiTWFza2luZyBib2d1cyBDUE0gaW50ZXJydXB0IHZlY3RvciAweCV4XG4iLCB2ZWMpOworCX0KKwkvKgorCSAqIEFmdGVyIHNlcnZpY2luZyB0aGUgaW50ZXJydXB0LAorCSAqIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBzdGF0dXMgaW5kaWNhdG9yLgorCSAqLworCWltbXItPmltX2NwaWMuY3BpY19jaXNyIHw9ICgxIDw8IHZlYyk7Cit9CisKKy8qCisgKiBUaGUgQ1BNIGNhbiBnZW5lcmF0ZSB0aGUgZXJyb3IgaW50ZXJydXB0IHdoZW4gdGhlcmUgaXMgYSByYWNlCisgKiBjb25kaXRpb24gYmV0d2VlbiBnZW5lcmF0aW5nIGFuZCBtYXNraW5nIGludGVycnVwdHMuIEFsbCB3ZSBoYXZlCisgKiB0byBkbyBpcyBBQ0sgaXQgYW5kIHJldHVybi4gVGhpcyBpcyBhIG5vLW9wIGZ1bmN0aW9uIHNvIHdlIGRvbid0CisgKiBuZWVkIGFueSBzcGVjaWFsIHRlc3RzIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgY3BtX2Vycm9yX2ludGVycnVwdCAodm9pZCAqZHVtbXkpCit7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSW5zdGFsbCBhbmQgZnJlZSBhbiBpbnRlcnJ1cHQgaGFuZGxlcgorICovCit2b2lkIGlycV9pbnN0YWxsX2hhbmRsZXIgKGludCB2ZWMsIGludGVycnVwdF9oYW5kbGVyX3QgKiBoYW5kbGVyLAorCQkJCQkJICB2b2lkICphcmcpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKworCWlmICgodmVjICYgQ1BNVkVDX09GRlNFVCkgIT0gMCkgeworCQkvKiBDUE0gaW50ZXJydXB0ICovCisJCXZlYyAmPSAweGZmZmY7CisJCWlmIChjcG1fdmVjc1t2ZWNdLmhhbmRsZXIgIT0gTlVMTCkgeworCQkJcHJpbnRmICgiQ1BNIGludGVycnVwdCAweCV4IHJlcGxhY2luZyAweCV4XG4iLAorCQkJCSh1aW50KSBoYW5kbGVyLAorCQkJCSh1aW50KSBjcG1fdmVjc1t2ZWNdLmhhbmRsZXIpOworCQl9CisJCWNwbV92ZWNzW3ZlY10uaGFuZGxlciA9IGhhbmRsZXI7CisJCWNwbV92ZWNzW3ZlY10uYXJnID0gYXJnOworCQlpbW1yLT5pbV9jcGljLmNwaWNfY2ltciB8PSAoMSA8PCB2ZWMpOworI2lmIDAKKwkJcHJpbnRmICgiSW5zdGFsbCBDUE0gaW50ZXJydXB0IGZvciB2ZWN0b3IgJWQgPT0+ICVwXG4iLAorCQkJdmVjLCBoYW5kbGVyKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCS8qIFNJVSBpbnRlcnJ1cHQgKi8KKwkJaWYgKGlycV92ZWNzW3ZlY10uaGFuZGxlciAhPSBOVUxMKSB7CisJCQlwcmludGYgKCJTSVUgaW50ZXJydXB0ICVkIDB4JXggcmVwbGFjaW5nIDB4JXhcbiIsCisJCQkJdmVjLAorCQkJCSh1aW50KSBoYW5kbGVyLAorCQkJCSh1aW50KSBjcG1fdmVjc1t2ZWNdLmhhbmRsZXIpOworCQl9CisJCWlycV92ZWNzW3ZlY10uaGFuZGxlciA9IGhhbmRsZXI7CisJCWlycV92ZWNzW3ZlY10uYXJnID0gYXJnOworCQlpbW1yLT5pbV9zaXVfY29uZi5zY19zaW1hc2sgfD0gMSA8PCAoMzEgLSB2ZWMpOworI2lmIDAKKwkJcHJpbnRmICgiSW5zdGFsbCBTSVUgaW50ZXJydXB0IGZvciB2ZWN0b3IgJWQgPT0+ICVwXG4iLAorCQkJdmVjLCBoYW5kbGVyKTsKKyNlbmRpZgorCX0KK30KKwordm9pZCBpcnFfZnJlZV9oYW5kbGVyIChpbnQgdmVjKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisKKwlpZiAoKHZlYyAmIENQTVZFQ19PRkZTRVQpICE9IDApIHsKKwkJLyogQ1BNIGludGVycnVwdCAqLworCQl2ZWMgJj0gMHhmZmZmOworI2lmIDAKKwkJcHJpbnRmICgiRnJlZSBDUE0gaW50ZXJydXB0IGZvciB2ZWN0b3IgJWQgPT0+ICVwXG4iLAorCQkJdmVjLCBjcG1fdmVjc1t2ZWNdLmhhbmRsZXIpOworI2VuZGlmCisJCWltbXItPmltX2NwaWMuY3BpY19jaW1yICY9IH4oMSA8PCB2ZWMpOworCQljcG1fdmVjc1t2ZWNdLmhhbmRsZXIgPSBOVUxMOworCQljcG1fdmVjc1t2ZWNdLmFyZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogU0lVIGludGVycnVwdCAqLworI2lmIDAKKwkJcHJpbnRmICgiRnJlZSBDUE0gaW50ZXJydXB0IGZvciB2ZWN0b3IgJWQgPT0+ICVwXG4iLAorCQkJdmVjLCBjcG1fdmVjc1t2ZWNdLmhhbmRsZXIpOworI2VuZGlmCisJCWltbXItPmltX3NpdV9jb25mLnNjX3NpbWFzayAmPSB+KDEgPDwgKDMxIC0gdmVjKSk7CisJCWlycV92ZWNzW3ZlY10uaGFuZGxlciA9IE5VTEw7CisJCWlycV92ZWNzW3ZlY10uYXJnID0gTlVMTDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNwbV9pbnRlcnJ1cHRfaW5pdCAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBDUE0gaW50ZXJydXB0IGNvbnRyb2xsZXIuCisJICovCisKKwlpbW1yLT5pbV9jcGljLmNwaWNfY2ljciA9CisJCShDSUNSX1NDRF9TQ0M0IHwKKwkJIENJQ1JfU0NDX1NDQzMgfAorCQkgQ0lDUl9TQ0JfU0NDMiB8CisJCSBDSUNSX1NDQV9TQ0MxKSB8ICgoQ1BNX0lOVEVSUlVQVCAvIDIpIDw8IDEzKSB8IENJQ1JfSFBfTUFTSzsKKworCWltbXItPmltX2NwaWMuY3BpY19jaW1yID0gMDsKKworCS8qCisJICogSW5zdGFsbCB0aGUgZXJyb3IgaGFuZGxlci4KKwkgKi8KKwlpcnFfaW5zdGFsbF9oYW5kbGVyIChDUE1WRUNfRVJST1IsIGNwbV9lcnJvcl9pbnRlcnJ1cHQsIE5VTEwpOworCisJaW1tci0+aW1fY3BpYy5jcGljX2NpY3IgfD0gQ0lDUl9JRU47CisKKwkvKgorCSAqIEluc3RhbGwgdGhlIGNwbSBpbnRlcnJ1cHQgaGFuZGxlcgorCSAqLworCWlycV9pbnN0YWxsX2hhbmRsZXIgKENQTV9JTlRFUlJVUFQsIGNwbV9pbnRlcnJ1cHQsIE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogdGltZXJfaW50ZXJydXB0IC0gZ2V0cyBjYWxsZWQgd2hlbiB0aGUgZGVjcmVtZW50ZXIgb3ZlcmZsb3dzLAorICogd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICogVHJpdmlhbCBpbXBsZW1lbnRhdGlvbiAtIG5vIG5lZWQgdG8gYmUgcmVhbGx5IGFjY3VyYXRlLgorICovCit2b2lkIHRpbWVyX2ludGVycnVwdF9jcHUgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisKKyNpZiAwCisJcHJpbnRmICgiKioqIFRpbWVyIEludGVycnVwdCAqKiogIik7CisjZW5kaWYKKwkvKiBSZXNldCBUaW1lciBFeHBpcmVkIGFuZCBUaW1lcnMgSW50ZXJydXB0IFN0YXR1cyAqLworCWltbXItPmltX2Nsa3JzdGsuY2Fya19wbHByY3JrID0gS0FQV1JfS0VZOworCV9fYXNtX18gKCJub3AiKTsKKwkvKgorCSAgQ2xlYXIgVEVYUFMgKGFuZCBUTUlTVCBvbiBvbGRlciBjaGlwcykuIFNQTFNTIChvbiBvbGRlcgorCSAgY2hpcHMpIGlzIGNsZWFyZWQgdG9vLgorCisJICBCaXR3aXNlIE9SIGlzIGEgcmVhZC1tb2RpZnktd3JpdGUgb3BlcmF0aW9uIHNvIEFMTCBiaXRzCisJICB3aGljaCBhcmUgY2xlYXJlZCBieSB3cml0aW5nIGAxJyB3b3VsZCBiZSBjbGVhcmVkIGJ5CisJICBvcGVyYXRpb25zIGxpa2UKKworCSAgaW1tci0+aW1fY2xrcnN0LmNhcl9wbHByY3IgfD0gUExQUkNSX1RFWFBTOworCisJICBUaGUgc2FtZSBjYW4gYmUgYWNoaWV2ZWQgYnkgc2ltcGxlIHdyaXRpbmcgb2YgdGhlIFBMUFJDUgorCSAgdG8gaXRzZWxmLiBJZiBhIGJpdCB2YWx1ZSBzaG91bGQgYmUgcHJlc2VydmVkLCByZWFkIHRoZQorCSAgcmVnaXN0ZXIsIFpFUk8gdGhlIGJpdCBhbmQgd3JpdGUsIG5vdCBPUiwgdGhlIHJlc3VsdCBiYWNrLgorCSovCisJaW1tci0+aW1fY2xrcnN0LmNhcl9wbHByY3IgPSBpbW1yLT5pbV9jbGtyc3QuY2FyX3BscHJjcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2tnZGIuUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L2tnZGIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M4ZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgva2dkYi5TCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwCU11cnJheSBKZW5zZW4gPE11cnJheS5KZW5zZW5AY21zdC5jc2lyby5hdT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1wYzh4eC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2RlZmluZSBDT05GSUdfOHh4IDEJCS8qIG5lZWRlZCBmb3IgTGludXgga2VybmVsIGhlYWRlciBmaWxlcyAqLworI2RlZmluZSBfTElOVVhfQ09ORklHX0ggMQkvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZQkqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKworIC8qCisgKiBjYWNoZSBmbHVzaGluZyByb3V0aW5lcyBmb3Iga2dkYgorICovCisKKwkuZ2xvYmwJa2dkYl9mbHVzaF9jYWNoZV9hbGwKK2tnZGJfZmx1c2hfY2FjaGVfYWxsOgorCWxpcwlyMywgSURDX0lOVkFMTEBoCisJbXRzcHIJRENfQ1NULCByMworCXN5bmMKKwlsaXMJcjMsIElEQ19JTlZBTExAaAorCW10c3ByCUlDX0NTVCwgcjMKKwlTWU5DCisJYmxyCisKKwkuZ2xvYmwJa2dkYl9mbHVzaF9jYWNoZV9yYW5nZQora2dkYl9mbHVzaF9jYWNoZV9yYW5nZToKKwlsaQlyNSxDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFLTEKKwlhbmRjCXIzLHIzLHI1CisJc3ViZglyNCxyMyxyNAorCWFkZAlyNCxyNCxyNQorCXNyd2kuCXI0LHI0LENPTkZJR19TWVNfQ0FDSEVMSU5FX1NISUZUCisJYmVxbHIKKwltdGN0cglyNAorCW1yCXI2LHIzCisxOglkY2JzdAkwLHIzCisJYWRkaQlyMyxyMyxDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCisJYmRuegkxYgorCXN5bmMJCQkJLyogd2FpdCBmb3IgZGNic3QncyB0byBnZXQgdG8gcmFtICovCisJbXRjdHIJcjQKKzI6CWljYmkJMCxyNgorCWFkZGkJcjYscjYsQ09ORklHX1NZU19DQUNIRUxJTkVfU0laRQorCWJkbnoJMmIKKwlTWU5DCisJYmxyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvbGNkLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9sY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjg4YjIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvbGNkLmMKQEAgLTAsMCArMSw2MjEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyAtLSB3ZEBkZW54LmRlCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICoqIEhFQURFUiBGSUxFUwkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogI2RlZmluZSBERUJVRyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGxjZHZpZGVvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpb19kZXYuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19QT1NUKQorI2luY2x1ZGUgPHBvc3QuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxjZC5oPgorCisjaWZkZWYgQ09ORklHX0xDRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKiogQ09ORklHIFNUVUZGIC0tIHNob3VsZCBiZSBtb3ZlZCB0byBib2FyZCBjb25maWcgZmlsZQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIENPTkZJR19MQ0RfSU5GTworI2RlZmluZSBDT05GSUdfTENEX0lORk8JCS8qIERpc3BsYXkgTG9nbywgKEMpIGFuZCBzeXN0ZW0gaW5mbwkqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19WMzcpIHx8IGRlZmluZWQoQ09ORklHX0VEVDMyRjEwKQorI3VuZGVmIENPTkZJR19MQ0RfTE9HTworI3VuZGVmIENPTkZJR19MQ0RfSU5GTworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQ09ORklHX0tZT0NFUkFfS0NTMDU3UVYxQUoKKy8qCisgKiAgS3lvY2VyYSBLQ1MwNTdRVjFBSi1HMjMuIFBhc3NpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKyAqLworI2RlZmluZSBMQ0RfQlBQCUxDRF9DT0xPUjQKKwordmlkaW5mb190IHBhbmVsX2luZm8gPSB7CisgICAgNjQwLCA0ODAsIDEzMiwgOTksIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILAorICAgIExDRF9CUFAsIDEsIDAsIDEsIDAsICA1LCAwLCAwLCAwCisJCS8qIHdibCwgdnB3LCBsY2RhYywgd2JmICovCit9OworI2VuZGlmIC8qIENPTkZJR19LWU9DRVJBX0tDUzA1N1FWMUFKICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIENPTkZJR19ISVRBQ0hJX1NQMTlYMDAxX1oxQQorLyoKKyAqICBIaXRhY2hpIFNQMTlYMDAxLS4gQWN0aXZlLCBjb2xvciwgc2luZ2xlIHNjYW4uCisgKi8KK3ZpZGluZm9fdCBwYW5lbF9pbmZvID0geworICAgIDY0MCwgNDgwLCAxNTQsIDExNiwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsCisgICAgTENEX0NPTE9SOCwgMSwgMCwgMSwgMCwgMCwgMCwgMCwgMAorCQkvKiB3YmwsIHZwdywgbGNkYWMsIHdiZiAqLworfTsKKyNlbmRpZiAvKiBDT05GSUdfSElUQUNISV9TUDE5WDAwMV9aMUEgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgQ09ORklHX05FQ19OTDY0NDhBQzMzCisvKgorICogIE5FQyBOTDY0NDhBQzMzLTE4LiBBY3RpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKyAqLwordmlkaW5mb190IHBhbmVsX2luZm8gPSB7CisgICAgNjQwLCA0ODAsIDEzMiwgOTksIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0xPVywgQ09ORklHX1NZU19MT1csIENPTkZJR19TWVNfSElHSCwKKyAgICAzLCAwLCAwLCAxLCAxLCAxNDQsIDIsIDAsIDMzCisJCS8qIHdibCwgdnB3LCBsY2RhYywgd2JmICovCit9OworI2VuZGlmIC8qIENPTkZJR19ORUNfTkw2NDQ4QUMzMyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19ORUNfTkw2NDQ4QkMyMAorLyoKKyAqICBORUMgTkw2NDQ4QkMyMC0wOC4gIDYuNSIsIDY0MHg0ODAuIEFjdGl2ZSwgY29sb3IsIHNpbmdsZSBzY2FuLgorICovCit2aWRpbmZvX3QgcGFuZWxfaW5mbyA9IHsKKyAgICA2NDAsIDQ4MCwgMTMyLCA5OSwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfTE9XLCBDT05GSUdfU1lTX0xPVywgQ09ORklHX1NZU19ISUdILAorICAgIDMsIDAsIDAsIDEsIDEsIDE0NCwgMiwgMCwgMzMKKwkJLyogd2JsLCB2cHcsIGxjZGFjLCB3YmYgKi8KK307CisjZW5kaWYgLyogQ09ORklHX05FQ19OTDY0NDhCQzIwICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX05FQ19OTDY0NDhCQzMzXzU0CisvKgorICogIE5FQyBOTDY0NDhCQzMzLTU0LiAxMC40IiwgNjQweDQ4MC4gQWN0aXZlLCBjb2xvciwgc2luZ2xlIHNjYW4uCisgKi8KK3ZpZGluZm9fdCBwYW5lbF9pbmZvID0geworICAgIDY0MCwgNDgwLCAyMTIsIDE1OCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfTE9XLCBDT05GSUdfU1lTX0xPVywgQ09ORklHX1NZU19ISUdILAorICAgIDMsIDAsIDAsIDEsIDEsIDE0NCwgMiwgMCwgMzMKKwkJLyogd2JsLCB2cHcsIGxjZGFjLCB3YmYgKi8KK307CisjZW5kaWYgLyogQ09ORklHX05FQ19OTDY0NDhCQzMzXzU0ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX1NIQVJQX0xRMTA0VjdEUzAxCisvKgorICogIFNIQVJQIExRMTA0VjdEUzAxLiA2LjUiLCA2NDB4NDgwLiBBY3RpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKyAqLwordmlkaW5mb190IHBhbmVsX2luZm8gPSB7CisgICAgNjQwLCA0ODAsIDEzMiwgOTksIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0xPVywgQ09ORklHX1NZU19MT1csIENPTkZJR19TWVNfTE9XLAorICAgIDMsIDAsIDAsIDEsIDEsIDI1LCAxLCAwLCAzMworCQkvKiB3YmwsIHZwdywgbGNkYWMsIHdiZiAqLworfTsKKyNlbmRpZiAvKiBDT05GSUdfU0hBUlBfTFExMDRWN0RTMDEgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBDT05GSUdfU0hBUlBfMTZ4OQorLyoKKyAqIFNoYXJwIDMyMHgyNDAuIEFjdGl2ZSwgY29sb3IsIHNpbmdsZSBzY2FuLiAgSXQgaXNuJ3QgMTZ4OSwgYW5kIEkgYW0KKyAqIG5vdCBzdXJlIHdoYXQgaXQgaXMuLi4uLi4uCisgKi8KK3ZpZGluZm9fdCBwYW5lbF9pbmZvID0geworICAgIDMyMCwgMjQwLCAwLCAwLCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfSElHSCwKKyAgICAzLCAwLCAwLCAxLCAxLCAxNSwgNCwgMCwgMworfTsKKyNlbmRpZiAvKiBDT05GSUdfU0hBUlBfMTZ4OSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19TSEFSUF9MUTA1N1EzREMwMgorLyoKKyAqIFNoYXJwIExRMDU3UTNEQzAyIGRpc3BsYXkuIEFjdGl2ZSwgY29sb3IsIHNpbmdsZSBzY2FuLgorICovCisjdW5kZWYgTENEX0RGCisjZGVmaW5lIExDRF9ERiAxMgorCit2aWRpbmZvX3QgcGFuZWxfaW5mbyA9IHsKKyAgICAzMjAsIDI0MCwgMCwgMCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfTE9XLCBDT05GSUdfU1lTX0xPVywgQ09ORklHX1NZU19ISUdILAorICAgIDMsIDAsIDAsIDEsIDEsIDE1LCA0LCAwLCAzCisJCS8qIHdibCwgdnB3LCBsY2RhYywgd2JmICovCit9OworI2RlZmluZSBDT05GSUdfTENEX0lORk9fQkVMT1dfTE9HTworI2VuZGlmIC8qIENPTkZJR19TSEFSUF9MUTA1N1EzREMwMiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19TSEFSUF9MUTY0RDM0MQorLyoKKyAqIFNoYXJwIExRNjREMzQxIGRpc3BsYXksIDY0MHg0ODAuIEFjdGl2ZSwgY29sb3IsIHNpbmdsZSBzY2FuLgorICovCit2aWRpbmZvX3QgcGFuZWxfaW5mbyA9IHsKKyAgICA2NDAsIDQ4MCwgMCwgMCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfTE9XLCBDT05GSUdfU1lTX0xPVywgQ09ORklHX1NZU19ISUdILAorICAgIDMsIDAsIDAsIDEsIDEsIDEyOCwgMTYsIDAsIDMyCisJCS8qIHdibCwgdnB3LCBsY2RhYywgd2JmICovCit9OworI2VuZGlmIC8qIENPTkZJR19TSEFSUF9MUTY0RDM0MSAqLworCisjaWZkZWYgQ09ORklHX1NIQVJQX0xRMDY1VDlEUjUxVQorLyoKKyAqIFNoYXJwIExRMDY1VDlEUjUxVSBkaXNwbGF5LCA0MDB4MjQwLiBBY3RpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKyAqLwordmlkaW5mb190IHBhbmVsX2luZm8gPSB7CisgICAgNDAwLCAyNDAsIDE0MywgNzksIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILAorICAgIDMsIDAsIDAsIDEsIDEsIDI0OCwgNCwgMCwgMzUKKwkJLyogd2JsLCB2cHcsIGxjZGFjLCB3YmYgKi8KK307CisjZGVmaW5lIENPTkZJR19MQ0RfSU5GT19CRUxPV19MT0dPCisjZW5kaWYgLyogQ09ORklHX1NIQVJQX0xRMDY1VDlEUjUxVSAqLworCisjaWZkZWYgQ09ORklHX1NIQVJQX0xRMDg0VjFERzIxCisvKgorICogU2hhcnAgTFEwODRWMURHMjEgZGlzcGxheSwgNjQweDQ4MC4gQWN0aXZlLCBjb2xvciwgc2luZ2xlIHNjYW4uCisgKi8KK3ZpZGluZm9fdCBwYW5lbF9pbmZvID0geworICAgIDY0MCwgNDgwLCAxNzEsIDEyOSwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfTE9XLCBDT05GSUdfU1lTX0xPVywgQ09ORklHX1NZU19MT1csCisgICAgMywgMCwgMCwgMSwgMSwgMTYwLCAzLCAwLCA0OAorCQkvKiB3YmwsIHZwdywgbGNkYWMsIHdiZiAqLworfTsKKyNlbmRpZiAvKiBDT05GSUdfU0hBUlBfTFEwODRWMURHMjEgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19ITEQxMDQ1CisvKgorICogSExEMTA0NSBkaXNwbGF5LCA2NDB4NDgwLiBBY3RpdmUsIGNvbG9yLCBzaW5nbGUgc2Nhbi4KKyAqLwordmlkaW5mb190IHBhbmVsX2luZm8gPSB7CisgICAgNjQwLCA0ODAsIDAsIDAsIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0xPVywgQ09ORklHX1NZU19MT1csIENPTkZJR19TWVNfSElHSCwKKyAgICAzLCAwLCAwLCAxLCAxLCAxNjAsIDMsIDAsIDQ4CisJCS8qIHdibCwgdnB3LCBsY2RhYywgd2JmICovCit9OworI2VuZGlmIC8qIENPTkZJR19ITEQxMDQ1ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX1BSSU1FVklFV19WMTZDNjQ0OEFDCisvKgorICogUHJpbWUgVmlldyBWMTZDNjQ0OEFDCisgKi8KK3ZpZGluZm9fdCBwYW5lbF9pbmZvID0geworICAgIDY0MCwgNDgwLCAxMzAsIDk4LCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19MT1csIENPTkZJR19TWVNfTE9XLCBDT05GSUdfU1lTX0hJR0gsCisgICAgMywgMCwgMCwgMSwgMSwgMTQ0LCAyLCAwLCAzNQorCQkvKiB3YmwsIHZwdywgbGNkYWMsIHdiZiAqLworfTsKKyNlbmRpZiAvKiBDT05GSUdfUFJJTUVWSUVXX1YxNkM2NDQ4QUMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19PUFRSRVhfQlcKKy8qCisgKiBPcHRyZXggICBDQkw1MDg0MC0yIE5GLUZXIDk5IDIyIE01CisgKiBvcgorICogSGl0YWNoaSAgTE1HNjkxMlJQRkMtMDBUCisgKiBvcgorICogSGl0YWNoaSAgU1AxNFEwMDIKKyAqCisgKiAzMjB4MjQwLiBCbGFjayAmIHdoaXRlLgorICovCisjZGVmaW5lIE9QVFJFWF9CUFAJMAkvKiAwIC0gbW9ub2Nocm9tZSwgICAgIDEgYnBwICovCisJCQkJLyogMSAtICA0IGdyZXkgbGV2ZWxzLCAyIGJwcCAqLworCQkJCS8qIDIgLSAxNiBncmV5IGxldmVscywgNCBicHAgKi8KK3ZpZGluZm9fdCBwYW5lbF9pbmZvID0geworICAgIDMyMCwgMjQwLCAwLCAwLCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfTE9XLAorICAgIE9QVFJFWF9CUFAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQKK307CisjZW5kaWYgLyogQ09ORklHX09QVFJFWF9CVyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBDT05GSUdfRURUMzJGMTAKKy8qCisgKiBFbWVyZ2luZyBEaXNwbGF5IFRlY2hub2xvZ2llcyAzMjB4MjQwLiBQYXNzaXZlLCBtb25vY2hyb21lLCBzaW5nbGUgc2Nhbi4KKyAqLworI2RlZmluZSBMQ0RfQlBQCQlMQ0RfTU9OT0NIUk9NRQorI2RlZmluZSBMQ0RfREYJCTEwCisKK3ZpZGluZm9fdCBwYW5lbF9pbmZvID0geworICAgIDMyMCwgMjQwLCAwLCAwLCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfSElHSCwgQ09ORklHX1NZU19ISUdILCBDT05GSUdfU1lTX0hJR0gsIENPTkZJR19TWVNfTE9XLAorICAgIExDRF9CUFAsICAwLCAwLCAwLCAwLCAzMywgMCwgMCwgMAorfTsKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCitpbnQgbGNkX2xpbmVfbGVuZ3RoOworCitpbnQgbGNkX2NvbG9yX2ZnOworaW50IGxjZF9jb2xvcl9iZzsKKworLyoKKyAqIEZyYW1lIGJ1ZmZlciBtZW1vcnkgaW5mb3JtYXRpb24KKyAqLwordm9pZCAqbGNkX2Jhc2U7CQkJLyogU3RhcnQgb2YgZnJhbWVidWZmZXIgbWVtb3J5CSovCit2b2lkICpsY2RfY29uc29sZV9hZGRyZXNzOwkvKiBTdGFydCBvZiBjb25zb2xlIGJ1ZmZlcgkqLworCitzaG9ydCBjb25zb2xlX2NvbDsKK3Nob3J0IGNvbnNvbGVfcm93OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGxjZF9jdHJsX2luaXQgKHZvaWQgKmxjZGJhc2UpOwordm9pZCBsY2RfZW5hYmxlICh2b2lkKTsKKyNpZiBMQ0RfQlBQID09IExDRF9DT0xPUjgKK3ZvaWQgbGNkX3NldGNvbHJlZyAodXNob3J0IHJlZ25vLAorCQkJCXVzaG9ydCByZWQsIHVzaG9ydCBncmVlbiwgdXNob3J0IGJsdWUpOworI2VuZGlmCisjaWYgTENEX0JQUCA9PSBMQ0RfTU9OT0NIUk9NRQordm9pZCBsY2RfaW5pdGNvbHJlZ3MgKHZvaWQpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19SQkM4MjMpCit2b2lkIGxjZF9kaXNhYmxlICh2b2lkKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogLS0tLS0tLS0tLS0tLS0tLS0gY2hpcHNldCBzcGVjaWZpYyBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDYWxjdWxhdGUgZmIgc2l6ZSBmb3IgVklERU9MRkJfQVRBRy4KKyAqLwordWxvbmcgY2FsY19mYnNpemUgKHZvaWQpCit7CisJdWxvbmcgc2l6ZTsKKwlpbnQgbGluZV9sZW5ndGggPSAocGFuZWxfaW5mby52bF9jb2wgKiBOQklUUyAocGFuZWxfaW5mby52bF9icGl4KSkgLyA4OworCisJc2l6ZSA9IGxpbmVfbGVuZ3RoICogcGFuZWxfaW5mby52bF9yb3c7CisKKwlyZXR1cm4gc2l6ZTsKK30KKwordm9pZCBsY2RfY3RybF9pbml0ICh2b2lkICpsY2RiYXNlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgbGNkODIzX3QgKmxjZHAgPSAmaW1tci0+aW1fbGNkOworCisJdWludCBsY2NydG1wOworCXVpbnQgbGNoY3JfaHBjX3RtcDsKKworCS8qIEluaXRpYWxpemUgdGhlIExDRCBjb250cm9sIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgTENECisJICogcGFyYW1ldGVycyBkZWZpbmVkLiAgV2UgZG8gZXZlcnl0aGluZyBoZXJlIGJ1dCBlbmFibGUKKwkgKiB0aGUgY29udHJvbGxlci4KKwkgKi8KKworI2lmZGVmIENPTkZJR19SUFhMSVRFCisJLyogVGhpcyBpcyBzcGVjaWFsIGZvciBSUFhsaXRlX0RXIFNvZnR3YXJlIERldmVsb3BtZW50IFBsYXRmb3JtICoqW1NhbV0qKiAqLworCXBhbmVsX2luZm8udmxfZHAgPSBDT05GSUdfU1lTX0xPVzsKKyNlbmRpZgorCisJbGNjcnRtcCAgPSBMQ0RCSVQgKExDQ1JfQk5VTV9CSVQsCisJCSAgICgoKHBhbmVsX2luZm8udmxfcm93ICogcGFuZWxfaW5mby52bF9jb2wpICogKDEgPDwgTENEX0JQUCkpIC8gMTI4KSk7CisKKwlsY2NydG1wIHw9IExDREJJVCAoTENDUl9DTEtQX0JJVCwgcGFuZWxfaW5mby52bF9jbGtwKQl8CisJCSAgIExDREJJVCAoTENDUl9PRVBfQklULCAgcGFuZWxfaW5mby52bF9vZXApCXwKKwkJICAgTENEQklUIChMQ0NSX0hTUF9CSVQsICBwYW5lbF9pbmZvLnZsX2hzcCkJfAorCQkgICBMQ0RCSVQgKExDQ1JfVlNQX0JJVCwgIHBhbmVsX2luZm8udmxfdnNwKQl8CisJCSAgIExDREJJVCAoTENDUl9EUF9CSVQsICAgcGFuZWxfaW5mby52bF9kcCkJfAorCQkgICBMQ0RCSVQgKExDQ1JfQlBJWF9CSVQsIHBhbmVsX2luZm8udmxfYnBpeCkJfAorCQkgICBMQ0RCSVQgKExDQ1JfTEJXX0JJVCwgIHBhbmVsX2luZm8udmxfbGJ3KQl8CisJCSAgIExDREJJVCAoTENDUl9TUExUX0JJVCwgcGFuZWxfaW5mby52bF9zcGx0KQl8CisJCSAgIExDREJJVCAoTENDUl9DTE9SX0JJVCwgcGFuZWxfaW5mby52bF9jbG9yKQl8CisJCSAgIExDREJJVCAoTENDUl9URlRfQklULCAgcGFuZWxfaW5mby52bF90ZnQpOworCisjaWYgMAorCWxjY3J0bXAgfD0gKChTSVVfTEVWRUw1IC8gMikgPDwgMTIpOworCWxjY3J0bXAgfD0gTENDUl9FSUVOOworI2VuZGlmCisKKwlsY2RwLT5sY2RfbGNjciA9IGxjY3J0bXA7CisJbGNkcC0+bGNkX2xjc3IgPSAweEZGOwkJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisKKwkvKiBJbml0aWFsaXplIExDRCBjb250cm9sbGVyIGJ1cyBwcmlvcml0aWVzLgorCSAqLworI2lmZGVmIENPTkZJR19SQkM4MjMKKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zZGNyID0gKGltbXItPmltX3NpdV9jb25mLnNjX3NkY3IgJiB+MHgwZikgfCAxOwkvKiBSQUlEID0gMDEsIExBSUQgPSAwMCAqLworI2Vsc2UKKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zZGNyICY9IH4weDBmOwkvKiBSQUlEID0gTEFJRCA9IDAgKi8KKworCS8qIHNldCBTSEZUL0NMT0NLIGRpdmlzaW9uIGZhY3RvciA0CisJICogVGhpcyBuZWVkcyB0byBiZSBzZXQgYmFzZWQgdXBvbiBkaXNwbGF5IHR5cGUgYW5kIHByb2Nlc3NvcgorCSAqIHNwZWVkLiAgVGhlIFRGVCBkaXNwbGF5cyBydW4gYWJvdXQgMjAgdG8gMzAgTUh6LgorCSAqIEkgd2FzIHJ1bm5pbmcgNjQgTUh6IHByb2Nlc3NvciBzcGVlZC4KKwkgKiBUaGUgdmFsdWUgZm9yIHRoaXMgZGl2aWRlciBtdXN0IGJlIGNob3NlbiBzbyB0aGUgcmVzdWx0IGlzCisJICogYW4gaW50ZWdlciBvZiB0aGUgcHJvY2Vzc29yIHNwZWVkIChpLmUuLCBkaXZpZGUgYnkgMyB3aXRoCisJICogNjQgTUh6IHdvdWxkIGJlIGJhZCkuCisJICovCisJaW1tci0+aW1fY2xrcnN0LmNhcl9zY2NyICY9IH4weDFGOworCWltbXItPmltX2Nsa3JzdC5jYXJfc2NjciB8PSBMQ0RfREY7CS8qIHdhcyA4ICovCisKKyNlbmRpZiAvKiBDT05GSUdfUkJDODIzICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19SQkM4MjMpCisJLyogRW5hYmxlIExDRCBvbiBwb3J0IEQuCisJICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wZGRhdCAmPSAweDAzMDA7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wZHBhciB8PSAweDFDRkY7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wZGRpciB8PSAweDFDRkY7CisKKwkvKiBDb25maWd1cmUgTENEX09OLCBWRUVfT04sIENDRkxfT04gb24gcG9ydCBCLgorCSAqLworCWltbXItPmltX2NwbS5jcF9wYmRhdCAmPSB+MHgwMDAwNTAwMTsKKwlpbW1yLT5pbV9jcG0uY3BfcGJwYXIgJj0gfjB4MDAwMDUwMDE7CisJaW1tci0+aW1fY3BtLmNwX3BiZGlyIHw9ICAweDAwMDA1MDAxOworI2VsaWYgIWRlZmluZWQoQ09ORklHX0VEVDMyRjEwKQorCS8qIEVuYWJsZSBMQ0Qgb24gcG9ydCBELgorCSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGRwYXIgfD0gMHgxRkZGOworCWltbXItPmltX2lvcG9ydC5pb3BfcGRkaXIgfD0gMHgxRkZGOworCisJLyogRW5hYmxlIExDRF9BL0IvQyBvbiBwb3J0IEIuCisJICovCisJaW1tci0+aW1fY3BtLmNwX3BicGFyIHw9IDB4MDAwMDUwMDE7CisJaW1tci0+aW1fY3BtLmNwX3BiZGlyIHw9IDB4MDAwMDUwMDE7CisjZWxzZQorCS8qIEVuYWJsZSBMQ0Qgb24gcG9ydCBELgorCSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGRwYXIgfD0gMHgxREZGOworCWltbXItPmltX2lvcG9ydC5pb3BfcGRwYXIgJj0gfjB4MDIwMDsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGlyIHw9IDB4MUZGRjsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGF0IHw9IDB4MDIwMDsKKyNlbmRpZgorCisJLyogTG9hZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbGluZWFyIGZyYW1lIGJ1ZmZlcgorCSAqIGludG8gdGhlIExDRCBjb250cm9sbGVyLgorCSAqIEJJRyBOT1RFOiAgVGhpcyBoYXMgdG8gYmUgbW9kaWZpZWQgdG8gbG9hZCBBIGFuZCBCIGRlcGVuZGluZworCSAqIHVwb24gdGhlIHNwbGl0IG1vZGUgb2YgdGhlIExDRC4KKwkgKi8KKwlsY2RwLT5sY2RfbGNmYWEgPSAodWxvbmcpbGNkX2Jhc2U7CisJbGNkcC0+bGNkX2xjZmJhID0gKHVsb25nKWxjZF9iYXNlOworCisJLyogTU9SRSBIQUNLUy4uLlRoaXMgbXVzdCBiZSB1cGRhdGVkIGFjY29yZGluZyB0byA4MjMgbWFudWFsCisJICogZm9yIGRpZmZlcmVudCBwYW5lbHMuCisJICogVWRpIEZpbmtlbHN0ZWluIC0gZG9uZSAtIHNlZSBiZWxvdzoKKwkgKiBOb3RlOiBZb3UgYmV0dGVyIG5vdCB0cnkgdW5zdXBwb3J0ZWQgY29tYmluYXRpb25zIHN1Y2ggYXMKKwkgKiA0LWJpdCB3aWRlIHBhc3NpdmUgZHVhbCBzY2FuIExDRCBhdCA0LzggQml0IGNvbG9yLgorCSAqLworCWxjaGNyX2hwY190bXAgPQorCQkocGFuZWxfaW5mby52bF9jb2wgKgorCQkgKHBhbmVsX2luZm8udmxfdGZ0ID8gOCA6CisJCQkoKCgyIC0gcGFuZWxfaW5mby52bF9sYncpIDw8IC8qIDQgYml0PTIsIDgtYml0ID0gMSAqLworCQkJIC8qIHVzZSA8PCB0byBtdWx0IGJ5OiBzaW5nbGUgc2NhbiA9IDEsIGR1YWwgc2NhbiA9IDIgKi8KKwkJCSAgcGFuZWxfaW5mby52bF9zcGx0KSAqCisJCQkgKHBhbmVsX2luZm8udmxfYnBpeCB8IDEpKSkpID4+IDM7IC8qIDIvNCBCUFAgPSAxLCA4LzE2IEJQUCA9IDMgKi8KKworCWxjZHAtPmxjZF9sY2hjciA9IExDSENSX0JPIHwKKwkJCSAgTENEQklUIChMQ0hDUl9BVF9CSVQsIDQpIHwKKwkJCSAgTENEQklUIChMQ0hDUl9IUENfQklULCBsY2hjcl9ocGNfdG1wKSB8CisJCQkgIHBhbmVsX2luZm8udmxfd2JsOworCisJbGNkcC0+bGNkX2xjdmNyID0gTENEQklUIChMQ1ZDUl9WUFdfQklULCBwYW5lbF9pbmZvLnZsX3ZwdykgfAorCQkJICBMQ0RCSVQgKExDVkNSX0xDRF9BQ19CSVQsIHBhbmVsX2luZm8udmxfbGNkYWMpIHwKKwkJCSAgTENEQklUIChMQ1ZDUl9WUENfQklULCBwYW5lbF9pbmZvLnZsX3JvdykgfAorCQkJICBwYW5lbF9pbmZvLnZsX3diZjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYJTk9UX1VTRURfU09fRkFSCitzdGF0aWMgdm9pZAorbGNkX2dldGNvbHJlZyAodXNob3J0IHJlZ25vLCB1c2hvcnQgKnJlZCwgdXNob3J0ICpncmVlbiwgdXNob3J0ICpibHVlKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgY3BtOHh4X3QgKmNwID0gJihpbW1yLT5pbV9jcG0pOworCXVuc2lnbmVkIHNob3J0IGNvbHJlZywgKmNtYXBfcHRyOworCisJY21hcF9wdHIgPSAodW5zaWduZWQgc2hvcnQgKikmY3AtPmxjZF9jbWFwW3JlZ25vICogMl07CisKKwljb2xyZWcgPSAqY21hcF9wdHI7CisjaWZkZWYJQ09ORklHX1NZU19JTlZFUlRfQ09MT1JTCisJY29scmVnIF49IDB4MEZGRjsKKyNlbmRpZgorCisJKnJlZCAgID0gKGNvbHJlZyA+PiA4KSAmIDB4MEY7CisJKmdyZWVuID0gKGNvbHJlZyA+PiA0KSAmIDB4MEY7CisJKmJsdWUgID0gIGNvbHJlZyAgICAgICAmIDB4MEY7Cit9CisjZW5kaWYJLyogTk9UX1VTRURfU09fRkFSICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBMQ0RfQlBQID09IExDRF9DT0xPUjgKK3ZvaWQKK2xjZF9zZXRjb2xyZWcgKHVzaG9ydCByZWdubywgdXNob3J0IHJlZCwgdXNob3J0IGdyZWVuLCB1c2hvcnQgYmx1ZSkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGNwbTh4eF90ICpjcCA9ICYoaW1tci0+aW1fY3BtKTsKKwl1bnNpZ25lZCBzaG9ydCBjb2xyZWcsICpjbWFwX3B0cjsKKworCWNtYXBfcHRyID0gKHVuc2lnbmVkIHNob3J0ICopJmNwLT5sY2RfY21hcFtyZWdubyAqIDJdOworCisJY29scmVnID0gKChyZWQgICAmIDB4MEYpIDw8IDgpIHwKKwkJICgoZ3JlZW4gJiAweDBGKSA8PCA0KSB8CisJCSAgKGJsdWUgICYgMHgwRikgOworI2lmZGVmCUNPTkZJR19TWVNfSU5WRVJUX0NPTE9SUworCWNvbHJlZyBePSAweDBGRkY7CisjZW5kaWYKKwkqY21hcF9wdHIgPSBjb2xyZWc7CisKKwlkZWJ1ZyAoInNldGNvbHJlZzogcmVnICUyZCBAICVwOiBSPSUwMlggRz0lMDJYIEI9JTAyWCA9PiAlMDJYJTAyWFxuIiwKKwkJcmVnbm8sICYoY3AtPmxjZF9jbWFwW3JlZ25vICogMl0pLAorCQlyZWQsIGdyZWVuLCBibHVlLAorCQljcC0+bGNkX2NtYXBbIHJlZ25vICogMiBdLCBjcC0+bGNkX2NtYXBbKHJlZ25vICogMikgKyAxXSk7Cit9CisjZW5kaWYJLyogTENEX0NPTE9SOCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgTENEX0JQUCA9PSBMQ0RfTU9OT0NIUk9NRQorc3RhdGljCit2b2lkIGxjZF9pbml0Y29scmVncyAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGNwbTh4eF90ICpjcCA9ICYoaW1tci0+aW1fY3BtKTsKKwl1c2hvcnQgcmVnbm87CisKKwlmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCAxNjsgcmVnbm8rKykgeworCQljcC0+bGNkX2NtYXBbcmVnbm8gKiAyXSA9IDA7CisJCWNwLT5sY2RfY21hcFsocmVnbm8gKiAyKSArIDFdID0gcmVnbm8gJiAweDBmOworCX0KK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIGxjZF9lbmFibGUgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBsY2Q4MjNfdCAqbGNkcCA9ICZpbW1yLT5pbV9sY2Q7CisKKwkvKiBFbmFibGUgdGhlIExDRCBwYW5lbCAqLworI2lmbmRlZiBDT05GSUdfUkJDODIzCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2RjciB8PSAoMSA8PCAoMzEgLSAyNSkpOwkJLyogTEFNID0gMSAqLworI2VuZGlmCisJbGNkcC0+bGNkX2xjY3IgfD0gTENDUl9QT047CisKKyNpZmRlZiBDT05GSUdfVjM3CisJLyogVHVybiBvbiBkaXNwbGF5IGJhY2tsaWdodCAqLworCWltbXItPmltX2NwbS5jcF9wYnBhciB8PSAweDAwMDA4MDAwOworCWltbXItPmltX2NwbS5jcF9wYmRpciB8PSAweDAwMDA4MDAwOworI2VsaWYgZGVmaW5lZChDT05GSUdfUkJDODIzKQorCS8qIFR1cm4gb24gZGlzcGxheSBiYWNrbGlnaHQgKi8KKwlpbW1yLT5pbV9jcG0uY3BfcGJkYXQgfD0gMHgwMDAwNDAwMDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTFdNT04pCisgICAgewl1Y2hhciBjID0gcGljX3JlYWQgKDB4NjApOworI2lmIGRlZmluZWQoQ09ORklHX0xDRCkgJiYgZGVmaW5lZChDT05GSUdfTFdNT04pICYmIChDT05GSUdfUE9TVCAmIENPTkZJR19TWVNfUE9TVF9TWVNNT04pCisJLyogRW5hYmxlIExDRCBsYXRlciBpbiBzeXNtb24gdGVzdCwgb25seSBpZiB0ZW1wZXJhdHVyZSBpcyBPSyAqLworI2Vsc2UKKwljIHw9IDB4MDc7CS8qIFBvd2VyIG9uIENDRkwsIEVuYWJsZSBDQ0ZMLCBDaGlwIEVuYWJsZSBMQ0QgKi8KKyNlbmRpZgorCXBpY193cml0ZSAoMHg2MCwgYyk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19MV01PTiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfUjM2ME1QSSkKKyAgICB7CisJZXh0ZXJuIHZvaWQgcjM2MF9pMmNfbGNkX3dyaXRlICh1Y2hhciBkYXRhMCwgdWNoYXIgZGF0YTEpOworCXVuc2lnbmVkIGxvbmcgYmdpLCBjdHI7CisJY2hhciAqcDsKKworCWlmICgocCA9IGdldGVudigibGNkYmdpIikpICE9IE5VTEwpIHsKKwkJYmdpID0gc2ltcGxlX3N0cnRvdWwgKHAsIDAsIDEwKSAmIDB4RkZGOworCX0gZWxzZSB7CisJCWJnaSA9IDB4RkZGOworCX0KKworCWlmICgocCA9IGdldGVudigibGNkY3RyIikpICE9IE5VTEwpIHsKKwkJY3RyID0gc2ltcGxlX3N0cnRvdWwgKHAsIDAsIDEwKSAmIDB4RkZGOworCX0gZWxzZSB7CisJCWN0cj0weDdGRjsKKwl9CisKKwlyMzYwX2kyY19sY2Rfd3JpdGUoMHgxMCwgMHgwMSk7CisJcjM2MF9pMmNfbGNkX3dyaXRlKDB4MjAsIDB4MDEpOworCXIzNjBfaTJjX2xjZF93cml0ZSgweDMwIHwgKChiZ2k+PjgpICYgMHhGKSwgYmdpICYgMHhGRik7CisJcjM2MF9pMmNfbGNkX3dyaXRlKDB4NDAgfCAoKGN0cj4+OCkgJiAweEYpLCBjdHIgJiAweEZGKTsKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX1IzNjBNUEkgKi8KKyNpZmRlZiBDT05GSUdfUkJDODIzCisJdWRlbGF5KDIwMDAwMCk7IC8qIHdhaXQgMjAwbXMgKi8KKwkvKiBUdXJuIFZFRV9PTiBmaXJzdCAqLworCWltbXItPmltX2NwbS5jcF9wYmRhdCB8PSAweDAwMDAwMDAxOworCXVkZWxheSgyMDAwMDApOyAvKiB3YWl0IDIwMG1zICovCisJLyogTm93IHR1cm4gb24gTENEX09OICovCisJaW1tci0+aW1fY3BtLmNwX3BiZGF0IHw9IDB4MDAwMDEwMDA7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUlJWSVNJT04KKwlkZWJ1ZyAoIlBDNC0+T3V0cHV0KDEpOiBlbmFibGUgTFZEU1xuIik7CisJZGVidWcgKCJQQzUtPk91dHB1dCgwKTogZGlzYWJsZSBQQUwgY2xvY2tcbiIpOworCWltbXItPmltX2lvcG9ydC5pb3BfcGRkaXIgfD0gIDB4MTAwMDsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH4oMHgwQzAwKTsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGlyIHw9ICAgMHgwQzAwIDsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGF0IHw9ICAgMHgwODAwIDsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGF0ICY9IH4oMHgwNDAwKTsKKwlkZWJ1ZyAoIlBEUEFSPTB4JTA0WCBQRERJUj0weCUwNFggUEREQVQ9MHglMDRYXG4iLAorCSAgICAgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3BkcGFyLAorCSAgICAgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGlyLAorCSAgICAgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGF0KTsKKwlkZWJ1ZyAoIlBDUEFSPTB4JTA0WCBQQ0RJUj0weCUwNFggUENEQVQ9MHglMDRYXG4iLAorCSAgICAgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyLAorCSAgICAgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGlyLAorCSAgICAgICBpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGF0KTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZCAoQ09ORklHX1JCQzgyMykKK3ZvaWQgbGNkX2Rpc2FibGUgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBsY2Q4MjNfdCAqbGNkcCA9ICZpbW1yLT5pbV9sY2Q7CisKKyNpZiBkZWZpbmVkKENPTkZJR19MV01PTikKKyAgICB7CXVjaGFyIGMgPSBwaWNfcmVhZCAoMHg2MCk7CisJYyAmPSB+MHgwNzsJLyogUG93ZXIgb2ZmIENDRkwsIERpc2FibGUgQ0NGTCwgQ2hpcCBEaXNhYmxlIExDRCAqLworCXBpY193cml0ZSAoMHg2MCwgYyk7CisgICAgfQorI2VsaWYgZGVmaW5lZChDT05GSUdfUjM2ME1QSSkKKyAgICB7CisJZXh0ZXJuIHZvaWQgcjM2MF9pMmNfbGNkX3dyaXRlICh1Y2hhciBkYXRhMCwgdWNoYXIgZGF0YTEpOworCisJcjM2MF9pMmNfbGNkX3dyaXRlKDB4MTAsIDB4MDApOworCXIzNjBfaTJjX2xjZF93cml0ZSgweDIwLCAweDAwKTsKKwlyMzYwX2kyY19sY2Rfd3JpdGUoMHgzMCwgMHgwMCk7CisJcjM2MF9pMmNfbGNkX3dyaXRlKDB4NDAsIDB4MDApOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfTFdNT04gKi8KKwkvKiBEaXNhYmxlIHRoZSBMQ0QgcGFuZWwgKi8KKwlsY2RwLT5sY2RfbGNjciAmPSB+TENDUl9QT047CisjaWZkZWYgQ09ORklHX1JCQzgyMworCS8qIFR1cm4gb2ZmIGRpc3BsYXkgYmFja2xpZ2h0LCBWRUUgYW5kIExDRF9PTiAqLworCWltbXItPmltX2NwbS5jcF9wYmRhdCAmPSB+MHgwMDAwNTAwMTsKKyNlbHNlCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2RjciAmPSB+KDEgPDwgKDMxIC0gMjUpKTsJLyogTEFNID0gMCAqLworI2VuZGlmIC8qIENPTkZJR19SQkM4MjMgKi8KK30KKyNlbmRpZgkvKiBOT1RfVVNFRF9TT19GQVIgfHwgQ09ORklHX1JCQzgyMyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvKiBDT05GSUdfTENEICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9wbHByY3Jfd3JpdGUuUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L3BscHJjcl93cml0ZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjU2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9wbHByY3Jfd3JpdGUuUwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCisjZGVmaW5lIENBQ0hFX0NNRF9FTkFCTEUJMHgwMjAwMDAwMAorI2RlZmluZSBDQUNIRV9DTURfRElTQUJMRQkweDA0MDAwMDAwCisjZGVmaW5lIENBQ0hFX0NNRF9MT0FEX0xPQ0sJMHgwNjAwMDAwMAorI2RlZmluZSBDQUNIRV9DTURfVU5MT0NLX0xJTkUJMHgwODAwMDAwMAorI2RlZmluZSBDQUNIRV9DTURfVU5MT0NLX0FMTAkweDBBMDAwMDAwCisjZGVmaW5lIENBQ0hFX0NNRF9JTlZBTElEQVRFCTB4MEMwMDAwMDAKKyNkZWZpbmUgU1BFRURfUExQUkNSX1dBSVRfNUNZQwkxNTAKKyNkZWZpbmUgX0NBQ0hFX0FMSUdOX1NJWkUJMTYKKworCisJLnRleHQKKwkuYWxpZ24gMgorCS5nbG9ibCBwbHByY3Jfd3JpdGVfODY2CisKKy8qCisgKiB2b2lkIHBscHJjcl93cml0ZV84NjYgKGxvbmcgcGxwcmNyKQorICogV3JpdGUgUExQUkNSLCBpbmNsdWRpbmcgd29ya2Fyb3VuZCBmb3IgZGV2aWNlIGVycmF0YSBTSVU0IGFuZCBTSVU5LgorICovCisKK3BscHJjcl93cml0ZV84NjY6CisJbWZzcHIJcjEwLCBMUgkJLyogc2F2ZSB0aGUgTGluayBSZWdpc3RlciB2YWx1ZSAqLworCisJLyogdHVybiBpbnN0cnVjdGlvbiBjYWNoZSBvbiAobm8gTU1VIHJlcXVpcmVkIGZvciBpbnN0cnVjdGlvbnMpCisJICovCisJbGlzCXI0LCBDQUNIRV9DTURfRU5BQkxFQGgKKwlvcmkJcjQsIHI0LCBDQUNIRV9DTURfRU5BQkxFQGwKKwltdHNwcglJQ19DU1QsIHI0CisJaXN5bmMKKworCS8qIGNsZWFyIElDX0NTVCBlcnJvciBiaXRzCisJICovCisJbWZzcHIJcjQsIElDX0NTVAorCisJYmwJcGxwcmNyX2hlcmUKKworcGxwcmNyX2hlcmU6CisJbWZscglyNQorCisJLyogY2FsY3VsYXRlIHJlbG9jYXRpb24gb2Zmc2V0CisJICovCisJbGlzCXI0LCBwbHByY3JfaGVyZUBoCisJb3JpCXI0LCByNCwgcGxwcmNyX2hlcmVAbAorCXN1YglyNSwgcjUsIHI0CisKKwkvKiBjYWxjdWxhdGUgZmlyc3QgYWRkcmVzcyBvZiB0aGlzIGZ1bmN0aW9uCisJICovCisJbGlzCXI2LCBwbHByY3Jfd3JpdGVfODY2QGgKKwlvcmkJcjYsIHI2LCBwbHByY3Jfd3JpdGVfODY2QGwKKwlhZGQJcjYsIHI2LCByNQorCisJLyogY2FsY3VsYXRlIGVuZCBhZGRyZXNzIG9mIHRoaXMgZnVuY3Rpb24KKwkgKi8KKwlsaXMJcjcsIHBscHJjcl9lbmRAaAorCW9yaQlyNywgcjcsIHBscHJjcl9lbmRAbAorCWFkZAlyNywgcjcsIHI1CisKKwkvKiBsb2FkIGFuZCBsb2NrIGNvZGUgYWRkcmVzc2VzCisJICovCisJbXIJcjUsIHI2CisKK3BscHJjcl9sb29wOgorCW10c3ByCUlDX0FEUiwgcjUKKwlhZGRpCXI1LCByNSwgX0NBQ0hFX0FMSUdOX1NJWkUJLyogaW5jcmVtZW50IGJ5IG9uZSBsaW5lICovCisKKwlsaXMJcjQsIENBQ0hFX0NNRF9MT0FEX0xPQ0tAaAorCW9yaQlyNCwgcjQsIENBQ0hFX0NNRF9MT0FEX0xPQ0tAbAorCW10c3ByCUlDX0NTVCwgcjQKKwlpc3luYworCisJY21wdwlyNSwgcjcKKwlibHQJcGxwcmNyX2xvb3AKKworCS8qIElDX0NTVCBlcnJvciBiaXRzIG5vdCBldmFsdWF0ZWQKKwkgKi8KKworCS8qIHN3aXRjaCBQTFBSQ1IKKwkgKi8KKwltZnNwcglyNCwgSU1NUgkJLyogcmVhZCBJTU1SICovCisJcmx3aW5tCXI0LCByNCwgMCwgMCwgMTUJLyogb25seSBoaWdoIDE2IGJpdHMgY291bnQgKi8KKworCS8qIHdyaXRlIHNlcXVlbmNlIGFjY29yZGluZyB0byBNUEM4NjYgRXJyYXRhCisJICovCisJc3R3CXIzLCBQTFBSQ1IocjQpCisJaXN5bmMKKworCWxpcwlyMywgU1BFRURfUExQUkNSX1dBSVRfNUNZQ0BoCisJb3JpCXIzLCByMywgU1BFRURfUExQUkNSX1dBSVRfNUNZQ0BsCisKK3BscHJjcl93YWl0OgorCWNtcHdpCXIzLCAwCisJYmVxCXBscHJjcl93YWl0X2VuZAorCW5vcAorCXN1YmkJcjMsIHIzLCAxCisJYglwbHByY3Jfd2FpdAorCitwbHByY3Jfd2FpdF9lbmQ6CisKKwkvKiB1bmxvY2sgaW5zdHJ1Y3Rpb24gY2FjaGUgYnV0IGxlYXZlIGl0IGVuYWJsZWQKKwkgKi8KKwlsaXMJcjQsIENBQ0hFX0NNRF9VTkxPQ0tfQUxMQGgKKwlvcmkJcjQsIHI0LCBDQUNIRV9DTURfVU5MT0NLX0FMTEBsCisJbXRzcHIJSUNfQ1NULCByNAorCWlzeW5jCisKKwltdHNwcglMUiwgcjEwCQkvKiByZXN0b3JlIG9yaWdpbmFsIExpbmsgUmVnaXN0ZXIgdmFsdWUgKi8KKwlibHIKKworcGxwcmNyX2VuZDoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L3NjYy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvc2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmYjk2NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L3NjYy5jCkBAIC0wLDAgKzEsNTcyIEBACisvKgorICogRmlsZTogIHNjYy5jCisgKiBEZXNjcmlwdGlvbjoKKyAqCUJhc2ljIEVUIEhXIGluaXRpYWxpemF0aW9uIGFuZCBwYWNrZXQgUlgvVFggcm91dGluZXMKKyAqCisgKiBOT1RFICA8PDxJTVBPUlRBTlQ6ICBQTEVBU0UgUkVBRD4+PjoKKyAqICAgICBEbyBub3QgY2FjaGUgUngvVHggYnVmZmVycyEKKyAqLworCisvKgorICogTVBDODIzIDwtPiBNQzY4MTYwIENvbm5lY3Rpb25zOgorICoKKyAqIFNldHVwIE1QQzgyMyB0byB3b3JrIHdpdGggTUM2ODE2MCBFbmhhbmNlZCBFdGhlcm5ldAorICogU2VyaWFsIFRyYW5jZWl2ZXIgYXMgZm9sbG93czoKKyAqCisgKiBNUEM4MjMgU2lnbmFsICAgICAgICAgICAgICAgIE1DNjgxNjAgIENvbW1lbnRzCisgKiAtLS0tLS0gLS0tLS0tICAgICAgICAgICAgICAgIC0tLS0tLS0gIC0tLS0tLS0tCisgKiBQQS0xMiBFVEhUWCAgICAtLS0tLS0tLT4gICBUWCAgICAgICBFdGguIFBvcnQgVHJhbnNtaXQgRGF0YQorICogUEItMTggRV9URU5BICAgLS0tLS0tLS0+ICAgVEVOQSAgICAgRXRoLiBUcmFuc21pdCBQb3J0IEVuYWJsZQorICogUEEtNSBFVEhUQ0sgICAgPC0tLS0tLS0tICAgVENMSyAgICAgRXRoLiBQb3J0IFRyYW5zbWl0IENsb2NrCisgKiBQQS0xMyBFVEhSWCAgICA8LS0tLS0tLS0gICBSWCAgICAgICBFdGguIFBvcnQgUmVjZWl2ZSBEYXRhCisgKiBQQy04IEVfUkVOQSAgICA8LS0tLS0tLS0gICBSRU5BICAgICBFdGguIFJlY2VpdmUgRW5hYmxlCisgKiBQQS02IEVUSFJDSyAgICA8LS0tLS0tLS0gICBSQ0xLICAgICBFdGguIFBvcnQgUmVjZWl2ZSBDbG9jaworICogUEMtOSBFX0NMU04gICAgPC0tLS0tLS0tICAgQ0xTTiAgICAgRXRoLiBQb3J0IENvbGxpc2lvbiBJbmRpY2F0aW9uCisgKgorICogRkFEUyBCb2FyZCBTaWduYWwgICAgICAgICAgICAgIE1DNjgxNjAgIENvbW1lbnRzCisgKiAtLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgLS0tLS0tLSAgLS0tLS0tLS0KKyAqIChCQ1NSMSkgRVRIRU4qICAgICAtLS0tLS0tLT4gIENTMiAgICAgIEV0aC4gUG9ydCBFbmFibGUKKyAqIChCU0NSNCkgVFBTUUVMKiAgICAtLS0tLS0tLT4gIFRQU1FFTCAgIFR3aXN0ZWQgUGFpciBTaWduYWwgUXVhbGl0eSBFcnJvciBUZXN0IEVuYWJsZQorICogKEJDU1I0KSBUUEZMREwqICAgIC0tLS0tLS0tPiAgVFBGTERMICAgVHdpc3RlZCBQYWlyIEZ1bGwtRHVwbGV4CisgKiAoQkNTUjQpIEVUSExPT1AgICAgLS0tLS0tLS0+ICBMT09QICAgICBFdGguIFBvcnQgRGlhZ25vc3RpYyBMb29wLUJhY2sKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX05FVCkgJiYgZGVmaW5lZChTQ0NfRU5FVCkKKworLyogRXRoZXJuZXQgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQnVmZmVycyAqLworI2RlZmluZSBEQlVGX0xFTkdUSCAgMTUyMAorCisjZGVmaW5lIFRYX0JVRl9DTlQgMgorCisjZGVmaW5lIFRPVVRfTE9PUCAxMDAwMAkvKiAxMCBtcyB0byBoYXZlIGEgcGFja2V0IHNlbnQgKi8KKworc3RhdGljIGNoYXIgdHhidWZbREJVRl9MRU5HVEhdOworCitzdGF0aWMgdWludCByeElkeDsJLyogaW5kZXggb2YgdGhlIGN1cnJlbnQgUlggYnVmZmVyICovCitzdGF0aWMgdWludCB0eElkeDsJLyogaW5kZXggb2YgdGhlIGN1cnJlbnQgVFggYnVmZmVyICovCisKKy8qCisgICogU0NDIEV0aGVybmV0IFR4IGFuZCBSeCBidWZmZXIgZGVzY3JpcHRvcnMgYWxsb2NhdGVkIGF0IHRoZQorICAqICBpbW1yLT51ZGF0YV9iZCBhZGRyZXNzIG9uIER1YWwtUG9ydCBSQU0KKyAgKiBQcm92aWRlIGZvciBEb3VibGUgQnVmZmVyaW5nCisgICovCisKK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IENvbW1vbkJ1ZmZlckRlc2NyaXB0b3IgeworICAgIGNiZF90IHJ4YmRbUEtUQlVGU1JYXTsJLyogUnggQkQgKi8KKyAgICBjYmRfdCB0eGJkW1RYX0JVRl9DTlRdOwkvKiBUeCBCRCAqLworfSBSVFhCRDsKKworc3RhdGljIFJUWEJEICpydHg7CisKK3N0YXRpYyBpbnQgc2NjX3NlbmQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgc2NjX3JlY3Yoc3RydWN0IGV0aF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IHNjY19pbml0IChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCBiZF90ICogYmQpOworc3RhdGljIHZvaWQgc2NjX2hhbHQoc3RydWN0IGV0aF9kZXZpY2UqIGRldik7CisKK2ludCBzY2NfaW5pdGlhbGl6ZShiZF90ICpiaXMpCit7CisJc3RydWN0IGV0aF9kZXZpY2UqIGRldjsKKworCWRldiA9IChzdHJ1Y3QgZXRoX2RldmljZSopIG1hbGxvYyhzaXplb2YgKmRldik7CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mICpkZXYpOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJTQ0MgRVRIRVJORVQiKTsKKwlkZXYtPmlvYmFzZSA9IDA7CisJZGV2LT5wcml2ICAgPSAwOworCWRldi0+aW5pdCAgID0gc2NjX2luaXQ7CisJZGV2LT5oYWx0ICAgPSBzY2NfaGFsdDsKKwlkZXYtPnNlbmQgICA9IHNjY19zZW5kOworCWRldi0+cmVjdiAgID0gc2NjX3JlY3Y7CisKKwlldGhfcmVnaXN0ZXIoZGV2KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNjY19zZW5kKHN0cnVjdCBldGhfZGV2aWNlKiBkZXYsIHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaSwgaj0wOworI2lmIDAKKwl2b2xhdGlsZSBjaGFyICppbiwgKm91dDsKKyNlbmRpZgorCisJLyogc2VjdGlvbiAxNi45LjIzLjMKKwkgKiBXYWl0IGZvciByZWFkeQorCSAqLworI2lmIDAKKwl3aGlsZSAocnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1JFQURZKTsKKwlvdXQgPSAoY2hhciAqKShydHgtPnR4YmRbdHhJZHhdLmNiZF9idWZhZGRyKTsKKwlpbiA9IHBhY2tldDsKKwlmb3IoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkqb3V0KysgPSAqaW4rKzsKKwl9CisJcnR4LT50eGJkW3R4SWR4XS5jYmRfZGF0bGVuID0gbGVuZ3RoOworCXJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjIHw9IChCRF9FTkVUX1RYX1JFQURZIHwgQkRfRU5FVF9UWF9MQVNUKTsKKwl3aGlsZSAocnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1JFQURZKSBqKys7CisKKyNpZmRlZiBFVF9ERUJVRworCXByaW50ZigiY3ljbGVzOiAlZCAgICBzdGF0dXM6ICV4XG4iLCBqLCBydHgtPnR4YmRbdHhJZHhdLmNiZF9zYyk7CisjZW5kaWYKKwlpID0gKHJ0eC0+dHhiZFt0eElkeCsrXS5jYmRfc2MgJiBCRF9FTkVUX1RYX1NUQVRTKSAvKiByZXR1cm4gb25seSBzdGF0dXMgYml0cyAqLzsKKworCS8qIHdyYXAgYXJvdW5kIGJ1ZmZlciBpbmRleCB3aGVuIG5lY2Vzc2FyeSAqLworCWlmICh0eElkeCA+PSBUWF9CVUZfQ05UKSB0eElkeCA9IDA7CisjZW5kaWYKKworCXdoaWxlICgocnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1JFQURZKSAmJiAoajxUT1VUX0xPT1ApKSB7CisJCXVkZWxheSAoMSk7CS8qIHdpbGwgYWxzbyB0cmlnZ2VyIFdkIGlmIG5lZWRlZCAqLworCQlqKys7CisJfQorCWlmIChqPj1UT1VUX0xPT1ApIHByaW50ZigiVFggbm90IHJlYWR5XG4iKTsKKwlydHgtPnR4YmRbdHhJZHhdLmNiZF9idWZhZGRyID0gKHVpbnQpcGFja2V0OworCXJ0eC0+dHhiZFt0eElkeF0uY2JkX2RhdGxlbiA9IGxlbmd0aDsKKwlydHgtPnR4YmRbdHhJZHhdLmNiZF9zYyB8PSAoQkRfRU5FVF9UWF9SRUFEWSB8IEJEX0VORVRfVFhfTEFTVCB8QkRfRU5FVF9UWF9XUkFQKTsKKwl3aGlsZSAoKHJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjICYgQkRfRU5FVF9UWF9SRUFEWSkgJiYgKGo8VE9VVF9MT09QKSkgeworCQl1ZGVsYXkgKDEpOwkvKiB3aWxsIGFsc28gdHJpZ2dlciBXZCBpZiBuZWVkZWQgKi8KKwkJaisrOworCX0KKwlpZiAoaj49VE9VVF9MT09QKSBwcmludGYoIlRYIHRpbWVvdXRcbiIpOworI2lmZGVmIEVUX0RFQlVHCisJcHJpbnRmKCJjeWNsZXM6ICVkICAgIHN0YXR1czogJXhcbiIsIGosIHJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjKTsKKyNlbmRpZgorCWkgPSAocnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1NUQVRTKSAvKiByZXR1cm4gb25seSBzdGF0dXMgYml0cyAqLzsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBzY2NfcmVjdiAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlpbnQgbGVuZ3RoOworCisJZm9yICg7OykgeworCQkvKiBzZWN0aW9uIDE2LjkuMjMuMiAqLworCQlpZiAocnR4LT5yeGJkW3J4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1JYX0VNUFRZKSB7CisJCQlsZW5ndGggPSAtMTsKKwkJCWJyZWFrOwkvKiBub3RoaW5nIHJlY2VpdmVkIC0gbGVhdmUgZm9yKCkgbG9vcCAqLworCQl9CisKKwkJbGVuZ3RoID0gcnR4LT5yeGJkW3J4SWR4XS5jYmRfZGF0bGVuOworCisJCWlmIChydHgtPnJ4YmRbcnhJZHhdLmNiZF9zYyAmIDB4MDAzZikgeworI2lmZGVmIEVUX0RFQlVHCisJCQlwcmludGYgKCJlcnI6ICV4XG4iLCBydHgtPnJ4YmRbcnhJZHhdLmNiZF9zYyk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCS8qIFBhc3MgdGhlIHBhY2tldCB1cCB0byB0aGUgcHJvdG9jb2wgbGF5ZXJzLiAqLworCQkJTmV0UmVjZWl2ZSAoTmV0UnhQYWNrZXRzW3J4SWR4XSwgbGVuZ3RoIC0gNCk7CisJCX0KKworCisJCS8qIEdpdmUgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBTQ0MuICovCisJCXJ0eC0+cnhiZFtyeElkeF0uY2JkX2RhdGxlbiA9IDA7CisKKwkJLyogd3JhcCBhcm91bmQgYnVmZmVyIGluZGV4IHdoZW4gbmVjZXNzYXJ5ICovCisJCWlmICgocnhJZHggKyAxKSA+PSBQS1RCVUZTUlgpIHsKKwkJCXJ0eC0+cnhiZFtQS1RCVUZTUlggLSAxXS5jYmRfc2MgPQorCQkJCShCRF9FTkVUX1JYX1dSQVAgfCBCRF9FTkVUX1JYX0VNUFRZKTsKKwkJCXJ4SWR4ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJ0eC0+cnhiZFtyeElkeF0uY2JkX3NjID0gQkRfRU5FVF9SWF9FTVBUWTsKKwkJCXJ4SWR4Kys7CisJCX0KKwl9CisJcmV0dXJuIGxlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiBTQ0MgRXRoZXJuZXQgSW5pdGlhbGl6YXRpb24gUm91dGluZQorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc2NjX2luaXQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIGJkX3QgKiBiaXMpCit7CisKKwlpbnQgaTsKKwlzY2NfZW5ldF90ICpwcmFtX3B0cjsKKworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19MV01PTikKKwlyZXNldF9waHkoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0ZBRFMKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NnhBRFMpIHx8IGRlZmluZWQoQ09ORklHX01QQzg2MFQpCisJLyogVGhlIE1QQzg2eEFEUy9GQURTODYwVCBkb24ndCB1c2UgdGhlIE1PREVNX0VOIG9yIERBVEFfVk9JQ0Ugc2lnbmFscy4gKi8KKwkqKCh1aW50ICopIEJDU1I0KSAmPSB+QkNTUjRfRVRITE9PUDsKKwkqKCh1aW50ICopIEJDU1I0KSB8PSBCQ1NSNF9URlBMREwgfCBCQ1NSNF9UUFNRRUw7CisJKigodWludCAqKSBCQ1NSMSkgJj0gfkJDU1IxX0VUSEVOOworI2Vsc2UKKwkqKCh1aW50ICopIEJDU1I0KSAmPSB+KEJDU1I0X0VUSExPT1AgfCBCQ1NSNF9NT0RFTV9FTik7CisJKigodWludCAqKSBCQ1NSNCkgfD0gQkNTUjRfVEZQTERMIHwgQkNTUjRfVFBTUUVMIHwgQkNTUjRfREFUQV9WT0lDRTsKKwkqKCh1aW50ICopIEJDU1IxKSAmPSB+QkNTUjFfRVRIRU47CisjZW5kaWYKKyNlbmRpZgorCisJcHJhbV9wdHIgPSAoc2NjX2VuZXRfdCAqKSAmIChpbW1yLT5pbV9jcG0uY3BfZHBhcmFtW1BST0ZGX0VORVRdKTsKKworCXJ4SWR4ID0gMDsKKwl0eElkeCA9IDA7CisKKwlpZiAoIXJ0eCkgeworI2lmZGVmIENPTkZJR19TWVNfQUxMT0NfRFBSQU0KKwkJcnR4ID0gKFJUWEJEICopIChpbW1yLT5pbV9jcG0uY3BfZHBtZW0gKworCQkJCSBkcHJhbV9hbGxvY19hbGlnbiAoc2l6ZW9mIChSVFhCRCksIDgpKTsKKyNlbHNlCisJCXJ0eCA9IChSVFhCRCAqKSAoaW1tci0+aW1fY3BtLmNwX2RwbWVtICsgQ1BNX1NDQ19CQVNFKTsKKyNlbmRpZgorCX0KKworI2lmIChkZWZpbmVkKFBBX0VORVRfUlhEKSAmJiBkZWZpbmVkKFBBX0VORVRfVFhEKSkKKwkvKiBDb25maWd1cmUgcG9ydCBBIHBpbnMgZm9yIFR4ZCBhbmQgUnhkLgorCSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgfD0gKFBBX0VORVRfUlhEIHwgUEFfRU5FVF9UWEQpOworCWltbXItPmltX2lvcG9ydC5pb3BfcGFkaXIgJj0gfihQQV9FTkVUX1JYRCB8IFBBX0VORVRfVFhEKTsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3Bhb2RyICY9IH5QQV9FTkVUX1RYRDsKKyNlbGlmIChkZWZpbmVkKFBCX0VORVRfUlhEKSAmJiBkZWZpbmVkKFBCX0VORVRfVFhEKSkKKwkvKiBDb25maWd1cmUgcG9ydCBCIHBpbnMgZm9yIFR4ZCBhbmQgUnhkLgorCSAqLworCWltbXItPmltX2NwbS5jcF9wYnBhciB8PSAoUEJfRU5FVF9SWEQgfCBQQl9FTkVUX1RYRCk7CisJaW1tci0+aW1fY3BtLmNwX3BiZGlyICY9IH4oUEJfRU5FVF9SWEQgfCBQQl9FTkVUX1RYRCk7CisJaW1tci0+aW1fY3BtLmNwX3Bib2RyICY9IH5QQl9FTkVUX1RYRDsKKyNlbHNlCisjZXJyb3IgQ29uZmlndXJhdGlvbiBFcnJvcjogZXhhY3RseSBPTkUgb2YgUEFfRU5FVF9bUlRdWEQsIFBCX0VORVRfW1JUXVhEIG11c3QgYmUgZGVmaW5lZAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBDX0VORVRfTEJLKQorCS8qIENvbmZpZ3VyZSBwb3J0IEMgcGlucyB0byBkaXNhYmxlIEV4dGVybmFsIExvb3BiYWNrCisJICovCisJaW1tci0+aW1faW9wb3J0LmlvcF9wY3BhciAmPSB+UENfRU5FVF9MQks7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RpciB8PSBQQ19FTkVUX0xCSzsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3Bjc28gJj0gflBDX0VORVRfTEJLOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkYXQgJj0gflBDX0VORVRfTEJLOwkvKiBEaXNhYmxlIExvb3BiYWNrICovCisjZW5kaWYgLyogUENfRU5FVF9MQksgKi8KKworCS8qIENvbmZpZ3VyZSBwb3J0IEMgcGlucyB0byBlbmFibGUgQ0xTTiBhbmQgUkVOQS4KKwkgKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH4oUENfRU5FVF9DTFNOIHwgUENfRU5FVF9SRU5BKTsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGlyICY9IH4oUENfRU5FVF9DTFNOIHwgUENfRU5FVF9SRU5BKTsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3Bjc28gfD0gKFBDX0VORVRfQ0xTTiB8IFBDX0VORVRfUkVOQSk7CisKKwkvKiBDb25maWd1cmUgcG9ydCBBIGZvciBUQ0xLIGFuZCBSQ0xLLgorCSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgfD0gKFBBX0VORVRfVENMSyB8IFBBX0VORVRfUkNMSyk7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+KFBBX0VORVRfVENMSyB8IFBBX0VORVRfUkNMSyk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBTZXJpYWwgSW50ZXJmYWNlIGNsb2NrIHJvdXRpbmcgLS0gc2VlIHNlY3Rpb24gMTYuNy41LjMKKwkgKiBGaXJzdCwgY2xlYXIgYWxsIFNDQyBiaXRzIHRvIHplcm8sIHRoZW4gc2V0IHRoZSBvbmVzIHdlIHdhbnQuCisJICovCisKKwlpbW1yLT5pbV9jcG0uY3Bfc2ljciAmPSB+U0lDUl9FTkVUX01BU0s7CisJaW1tci0+aW1fY3BtLmNwX3NpY3IgfD0gU0lDUl9FTkVUX0NMS1JUOworCisKKwkvKgorCSAqIEluaXRpYWxpemUgU0RDUiAtLSBzZWUgc2VjdGlvbiAxNi45LjIzLjcKKwkgKiBTRE1BIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwkgKi8KKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zZGNyID0gMHgwMTsKKworCisJLyoKKwkgKiBTZXR1cCBTQ0MgRXRoZXJuZXQgUGFyYW1ldGVyIFJBTQorCSAqLworCisJcHJhbV9wdHItPnNlbl9nZW5zY2Muc2NjX3JmY3IgPSAweDE4OwkvKiBOb3JtYWwgT3BlcmF0aW9uIGFuZCBNb3QgYnl0ZSBvcmRlcmluZyAqLworCXByYW1fcHRyLT5zZW5fZ2Vuc2NjLnNjY190ZmNyID0gMHgxODsJLyogTW90IGJ5dGUgb3JkZXJpbmcsIE5vcm1hbCBhY2Nlc3MgKi8KKworCXByYW1fcHRyLT5zZW5fZ2Vuc2NjLnNjY19tcmJsciA9IERCVUZfTEVOR1RIOwkvKiBtYXguIEVUIHBhY2thZ2UgbGVuIDE1MjAgKi8KKworCXByYW1fcHRyLT5zZW5fZ2Vuc2NjLnNjY19yYmFzZSA9ICh1bnNpZ25lZCBpbnQpICgmcnR4LT5yeGJkWzBdKTsJLyogU2V0IFJYQkQgdGJsIHN0YXJ0IGF0IER1YWwgUG9ydCAqLworCXByYW1fcHRyLT5zZW5fZ2Vuc2NjLnNjY190YmFzZSA9ICh1bnNpZ25lZCBpbnQpICgmcnR4LT50eGJkWzBdKTsJLyogU2V0IFRYQkQgdGJsIHN0YXJ0IGF0IER1YWwgUG9ydCAqLworCisJLyoKKwkgKiBTZXR1cCBSZWNlaXZlciBCdWZmZXIgRGVzY3JpcHRvcnMgKDEzLjE0LjI0LjE4KQorCSAqIFNldHRpbmdzOgorCSAqICAgICBFbXB0eSwgV3JhcAorCSAqLworCisJZm9yIChpID0gMDsgaSA8IFBLVEJVRlNSWDsgaSsrKSB7CisJCXJ0eC0+cnhiZFtpXS5jYmRfc2MgPSBCRF9FTkVUX1JYX0VNUFRZOworCQlydHgtPnJ4YmRbaV0uY2JkX2RhdGxlbiA9IDA7CS8qIFJlc2V0ICovCisJCXJ0eC0+cnhiZFtpXS5jYmRfYnVmYWRkciA9ICh1aW50KSBOZXRSeFBhY2tldHNbaV07CisJfQorCisJcnR4LT5yeGJkW1BLVEJVRlNSWCAtIDFdLmNiZF9zYyB8PSBCRF9FTkVUX1JYX1dSQVA7CisKKwkvKgorCSAqIFNldHVwIEV0aGVybmV0IFRyYW5zbWl0dGVyIEJ1ZmZlciBEZXNjcmlwdG9ycyAoMTMuMTQuMjQuMTkpCisJICogU2V0dGluZ3M6CisJICogICAgQWRkIFBBRHMgdG8gU2hvcnQgRlJBTUVTLCBXcmFwLCBMYXN0LCBUeCBDUkMKKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBUWF9CVUZfQ05UOyBpKyspIHsKKwkJcnR4LT50eGJkW2ldLmNiZF9zYyA9CisJCQkoQkRfRU5FVF9UWF9QQUQgfCBCRF9FTkVUX1RYX0xBU1QgfCBCRF9FTkVUX1RYX1RDKTsKKwkJcnR4LT50eGJkW2ldLmNiZF9kYXRsZW4gPSAwOwkvKiBSZXNldCAqLworCQlydHgtPnR4YmRbaV0uY2JkX2J1ZmFkZHIgPSAodWludCkgKCZ0eGJ1ZlswXSk7CisJfQorCisJcnR4LT50eGJkW1RYX0JVRl9DTlQgLSAxXS5jYmRfc2MgfD0gQkRfRU5FVF9UWF9XUkFQOworCisJLyoKKwkgKiBFbnRlciBDb21tYW5kOiAgSW5pdGlhbGl6ZSBSeCBQYXJhbXMgZm9yIFNDQworCSAqLworCisJZG8gewkJCS8qIFNwaW4gdW50aWwgcmVhZHkgdG8gaXNzdWUgY29tbWFuZCAgICAqLworCQlfX2FzbV9fICgiZWllaW8iKTsKKwl9IHdoaWxlIChpbW1yLT5pbV9jcG0uY3BfY3BjciAmIENQTV9DUl9GTEcpOworCS8qIElzc3VlIGNvbW1hbmQgKi8KKwlpbW1yLT5pbV9jcG0uY3BfY3BjciA9CisJCSgoQ1BNX0NSX0lOSVRfUlggPDwgOCkgfCAoQ1BNX0NSX0VORVQgPDwgNCkgfCBDUE1fQ1JfRkxHKTsKKwlkbyB7CQkJLyogU3BpbiB1bnRpbCBjb21tYW5kIHByb2Nlc3NlZCAgICAgICAgICovCisJCV9fYXNtX18gKCJlaWVpbyIpOworCX0gd2hpbGUgKGltbXItPmltX2NwbS5jcF9jcGNyICYgQ1BNX0NSX0ZMRyk7CisKKwkvKgorCSAqIEV0aGVybmV0IFNwZWNpZmljIFBhcmFtZXRlciBSQU0KKwkgKiAgICAgc2VlIHRhYmxlIDEzLTE2LCBwZy4gNjYwLAorCSAqICAgICBwZy4gNjgxIChleGFtcGxlIHdpdGggc3VnZ2VzdGVkIHNldHRpbmdzKQorCSAqLworCisJcHJhbV9wdHItPnNlbl9jcHJlcyA9IH4oMHgwKTsJLyogUHJlc2V0IENSQyAqLworCXByYW1fcHRyLT5zZW5fY21hc2sgPSAweGRlYmIyMGUzOwkvKiBDb25zdGFudCBNYXNrIGZvciBDUkMgKi8KKwlwcmFtX3B0ci0+c2VuX2NyY2VjID0gMHgwOwkvKiBFcnJvciBDb3VudGVyIENSQyAodW51c2VkKSAqLworCXByYW1fcHRyLT5zZW5fYWxlYyA9IDB4MDsJLyogQWxpZ25tZW50IEVycm9yIENvdW50ZXIgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX2Rpc2ZjID0gMHgwOwkvKiBEaXNjYXJkIEZyYW1lIENvdW50ZXIgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX3BhZHMgPSAweDg4ODg7CS8qIFNob3J0IEZyYW1lIFBBRCBDaGFyYWN0ZXJzICovCisKKwlwcmFtX3B0ci0+c2VuX3JldGxpbSA9IDE1OwkvKiBSZXRyeSBMaW1pdCBUaHJlc2hvbGQgKi8KKwlwcmFtX3B0ci0+c2VuX21heGZsciA9IDE1MTg7CS8qIE1BWCBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KKwlwcmFtX3B0ci0+c2VuX21pbmZsciA9IDY0OwkvKiBNSU4gRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyICovCisKKwlwcmFtX3B0ci0+c2VuX21heGQxID0gREJVRl9MRU5HVEg7CS8qIE1BWCBETUExIExlbmd0aCBSZWdpc3RlciAqLworCXByYW1fcHRyLT5zZW5fbWF4ZDIgPSBEQlVGX0xFTkdUSDsJLyogTUFYIERNQTIgTGVuZ3RoIFJlZ2lzdGVyICovCisKKwlwcmFtX3B0ci0+c2VuX2dhZGRyMSA9IDB4MDsJLyogR3JvdXAgQWRkcmVzcyBGaWx0ZXIgMSAodW51c2VkKSAqLworCXByYW1fcHRyLT5zZW5fZ2FkZHIyID0gMHgwOwkvKiBHcm91cCBBZGRyZXNzIEZpbHRlciAyICh1bnVzZWQpICovCisJcHJhbV9wdHItPnNlbl9nYWRkcjMgPSAweDA7CS8qIEdyb3VwIEFkZHJlc3MgRmlsdGVyIDMgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX2dhZGRyNCA9IDB4MDsJLyogR3JvdXAgQWRkcmVzcyBGaWx0ZXIgNCAodW51c2VkKSAqLworCisjZGVmaW5lIGVhIGV0aF9nZXRfZGV2KCktPmVuZXRhZGRyCisJcHJhbV9wdHItPnNlbl9wYWRkcmggPSAoZWFbNV0gPDwgOCkgKyBlYVs0XTsKKwlwcmFtX3B0ci0+c2VuX3BhZGRybSA9IChlYVszXSA8PCA4KSArIGVhWzJdOworCXByYW1fcHRyLT5zZW5fcGFkZHJsID0gKGVhWzFdIDw8IDgpICsgZWFbMF07CisjdW5kZWYgZWEKKworCXByYW1fcHRyLT5zZW5fcHBlciA9IDB4MDsJLyogUGVyc2lzdGVuY2UgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX2lhZGRyMSA9IDB4MDsJLyogSW5kaXZpZHVhbCBBZGRyZXNzIEZpbHRlciAxICh1bnVzZWQpICovCisJcHJhbV9wdHItPnNlbl9pYWRkcjIgPSAweDA7CS8qIEluZGl2aWR1YWwgQWRkcmVzcyBGaWx0ZXIgMiAodW51c2VkKSAqLworCXByYW1fcHRyLT5zZW5faWFkZHIzID0gMHgwOwkvKiBJbmRpdmlkdWFsIEFkZHJlc3MgRmlsdGVyIDMgKHVudXNlZCkgKi8KKwlwcmFtX3B0ci0+c2VuX2lhZGRyNCA9IDB4MDsJLyogSW5kaXZpZHVhbCBBZGRyZXNzIEZpbHRlciA0ICh1bnVzZWQpICovCisJcHJhbV9wdHItPnNlbl90YWRkcmggPSAweDA7CS8qIFRtcCBBZGRyZXNzIChNU0IpICh1bnVzZWQpICovCisJcHJhbV9wdHItPnNlbl90YWRkcm0gPSAweDA7CS8qIFRtcCBBZGRyZXNzICh1bnVzZWQpICovCisJcHJhbV9wdHItPnNlbl90YWRkcmwgPSAweDA7CS8qIFRtcCBBZGRyZXNzIChMU0IpICh1bnVzZWQpICovCisKKwkvKgorCSAqIEVudGVyIENvbW1hbmQ6ICBJbml0aWFsaXplIFR4IFBhcmFtcyBmb3IgU0NDCisJICovCisKKwlkbyB7CQkJLyogU3BpbiB1bnRpbCByZWFkeSB0byBpc3N1ZSBjb21tYW5kICAgICovCisJCV9fYXNtX18gKCJlaWVpbyIpOworCX0gd2hpbGUgKGltbXItPmltX2NwbS5jcF9jcGNyICYgQ1BNX0NSX0ZMRyk7CisJLyogSXNzdWUgY29tbWFuZCAqLworCWltbXItPmltX2NwbS5jcF9jcGNyID0KKwkJKChDUE1fQ1JfSU5JVF9UWCA8PCA4KSB8IChDUE1fQ1JfRU5FVCA8PCA0KSB8IENQTV9DUl9GTEcpOworCWRvIHsJCQkvKiBTcGluIHVudGlsIGNvbW1hbmQgcHJvY2Vzc2VkICAgICAgICAgKi8KKwkJX19hc21fXyAoImVpZWlvIik7CisJfSB3aGlsZSAoaW1tci0+aW1fY3BtLmNwX2NwY3IgJiBDUE1fQ1JfRkxHKTsKKworCS8qCisJICogTWFzayBhbGwgRXZlbnRzIGluIFNDQ00gLSB3ZSB1c2UgcG9sbGluZyBtb2RlCisJICovCisJaW1tci0+aW1fY3BtLmNwX3NjY1tTQ0NfRU5FVF0uc2NjX3NjY20gPSAwOworCisJLyoKKwkgKiBDbGVhciBFdmVudHMgaW4gU0NDRSAtLSBDbGVhciBiaXRzIGJ5IHdyaXRpbmcgMSdzCisJICovCisKKwlpbW1yLT5pbV9jcG0uY3Bfc2NjW1NDQ19FTkVUXS5zY2Nfc2NjZSA9IH4oMHgwKTsKKworCisJLyoKKwkgKiBJbml0aWFsaXplIEdTTVIgSGlnaCAzMi1CaXRzCisJICogU2V0dGluZ3M6ICBOb3JtYWwgTW9kZQorCSAqLworCisJaW1tci0+aW1fY3BtLmNwX3NjY1tTQ0NfRU5FVF0uc2NjX2dzbXJoID0gMDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBHU01SIExvdyAzMi1CaXRzLCBidXQgZG8gbm90IEVuYWJsZSBUcmFuc21pdC9SZWNlaXZlCisJICogU2V0dGluZ3M6CisJICogICAgIFRDSSA9IEludmVydAorCSAqICAgICBUUEwgPSAgNDggYml0cworCSAqICAgICBUUFAgPSBSZXBlYXRpbmcgMTAncworCSAqICAgICBNT0RFID0gRXRoZXJuZXQKKwkgKi8KKworCWltbXItPmltX2NwbS5jcF9zY2NbU0NDX0VORVRdLnNjY19nc21ybCA9IChTQ0NfR1NNUkxfVENJIHwKKwkJCQkJCSAgIFNDQ19HU01STF9UUExfNDggfAorCQkJCQkJICAgU0NDX0dTTVJMX1RQUF8xMCB8CisJCQkJCQkgICBTQ0NfR1NNUkxfTU9ERV9FTkVUKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgRFNSIC0tIHNlZSBzZWN0aW9uIDEzLjE0LjQgKHBnLiA1MTMpIHYwLjQKKwkgKi8KKworCWltbXItPmltX2NwbS5jcF9zY2NbU0NDX0VORVRdLnNjY19kc3IgPSAweGQ1NTU7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIFBTTVIKKwkgKiBTZXR0aW5nczoKKwkgKiAgQ1JDID0gMzItQml0IENDSVRUCisJICogIE5JQiA9IEJlZ2luIHNlYXJjaGluZyBmb3IgU0ZEIDIyIGJpdHMgYWZ0ZXIgUkVOQQorCSAqICBGREUgPSBGdWxsIER1cGxleCBFbmFibGUKKwkgKiAgTFBCID0gTG9vcGJhY2sgRW5hYmxlIChOZWVkZWQgd2hlbiBGREUgaXMgc2V0KQorCSAqICBCUk8gPSBSZWplY3QgYnJvYWRjYXN0IHBhY2tldHMKKwkgKiAgUFJPTUlTQ09VUyA9IENhdGNoIGFsbCBwYWNrZXRzIHJlZ2FyZGxlc3Mgb2YgZGVzdC4gTUFDIGFkcmVzcworCSAqLworCWltbXItPmltX2NwbS5jcF9zY2NbU0NDX0VORVRdLnNjY19wc21yID0gU0NDX1BTTVJfRU5DUkMgfAorCQlTQ0NfUFNNUl9OSUIyMiB8CisjaWYgZGVmaW5lZChDT05GSUdfU0NDX0VORVRfRlVMTF9EVVBMRVgpCisJCVNDQ19QU01SX0ZERSB8IFNDQ19QU01SX0xQQiB8CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0NfRU5FVF9OT19CUk9BRENBU1QpCisJCVNDQ19QU01SX0JSTyB8CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0NfRU5FVF9QUk9NSVNDT1VTKQorCQlTQ0NfUFNNUl9QUk8gfAorI2VuZGlmCisJCTA7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBFdGhlcm5ldCBURU5BIFNpZ25hbAorCSAqLworCisjaWYgKGRlZmluZWQoUENfRU5FVF9URU5BKSAmJiAhZGVmaW5lZChQQl9FTkVUX1RFTkEpKQorCWltbXItPmltX2lvcG9ydC5pb3BfcGNwYXIgfD0gUENfRU5FVF9URU5BOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgJj0gflBDX0VORVRfVEVOQTsKKyNlbGlmIChkZWZpbmVkKFBCX0VORVRfVEVOQSkgJiYgIWRlZmluZWQoUENfRU5FVF9URU5BKSkKKwlpbW1yLT5pbV9jcG0uY3BfcGJwYXIgfD0gUEJfRU5FVF9URU5BOworCWltbXItPmltX2NwbS5jcF9wYmRpciB8PSBQQl9FTkVUX1RFTkE7CisjZWxzZQorI2Vycm9yIENvbmZpZ3VyYXRpb24gRXJyb3I6IGV4YWN0bHkgT05FIG9mIFBCX0VORVRfVEVOQSwgUENfRU5FVF9URU5BIG11c3QgYmUgZGVmaW5lZAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BRFMpICYmIGRlZmluZWQoQ09ORklHX01QQzg2MCkKKwkvKgorCSAqIFBvcnQgQyBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIFBIWSxNQzY4MTYwLgorCSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkaXIgfD0KKwkJKFBDX0VORVRfRVRITE9PUCB8IFBDX0VORVRfVFBGTERMIHwgUENfRU5FVF9UUFNRRUwpOworCisJaW1tci0+aW1faW9wb3J0LmlvcF9wY2RhdCB8PSBQQ19FTkVUX1RQRkxETDsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGF0ICY9IH4oUENfRU5FVF9FVEhMT09QIHwgUENfRU5FVF9UUFNRRUwpOworCSooKHVpbnQgKikgQkNTUjEpICY9IH5CQ1NSMV9FVEhFTjsKKyNlbmRpZiAvKiBNUEM4NjBBRFMgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FNWDg2MCkKKwkvKgorCSAqIFBvcnQgQiBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIFBIWSxNQzY4MTYwLgorCSAqLworCWltbXItPmltX2NwbS5jcF9wYmRpciB8PQorCQkoUEJfRU5FVF9FVEhMT09QIHwgUEJfRU5FVF9UUEZMREwgfCBQQl9FTkVUX1RQU1FFTCk7CisKKwlpbW1yLT5pbV9jcG0uY3BfcGJkYXQgfD0gUEJfRU5FVF9UUEZMREw7CisJaW1tci0+aW1fY3BtLmNwX3BiZGF0ICY9IH4oUEJfRU5FVF9FVEhMT09QIHwgUEJfRU5FVF9UUFNRRUwpOworCisJaW1tci0+aW1faW9wb3J0LmlvcF9wZGRpciB8PSBQRF9FTkVUX0VUSF9FTjsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BkZGF0ICY9IH5QRF9FTkVUX0VUSF9FTjsKKyNlbmRpZiAvKiBBTVg4NjAgKi8KKworI2lmZGVmIENPTkZJR19SUFhDTEFTU0lDCisJKigodWNoYXIgKikgQkNTUjApICY9IH5CQ1NSMF9FVEhMUEJLOworCSooKHVjaGFyICopIEJDU1IwKSB8PSAoQkNTUjBfRVRIRU4gfCBCQ1NSMF9DT0xURVNUIHwgQkNTUjBfRlVMTERQTFgpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlBYTElURQorCSooKHVjaGFyICopIEJDU1IwKSB8PSBCQ1NSMF9FVEhFTjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUVM4NjBUKQorCS8qCisJICogUEIyNz1GREUtLCBzZXQgb3V0cHV0IGxvdyBmb3IgZnVsbCBkdXBsZXgKKwkgKiBQQjI2PUxpbmsgVGVzdCBFbmFibGUsIG5vcm1hbGx5IGhpZ2ggb3V0cHV0CisJICovCisJaW1tci0+aW1fY3BtLmNwX3BiZGlyIHw9IDB4MDAwMDAwMzA7CisJaW1tci0+aW1fY3BtLmNwX3BiZGF0IHw9IDB4MDAwMDAwMjA7CisJaW1tci0+aW1fY3BtLmNwX3BiZGF0ICY9IH4weDAwMDAwMDEwOworI2VuZGlmIC8qIFFTODYwVCAqLworCisjaWZkZWYgQ09ORklHX01CWAorCWJvYXJkX2V0aGVyX2luaXQgKCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX05FVFZJQSkKKyNpZiBkZWZpbmVkKFBBX0VORVRfUEROKQorCWltbXItPmltX2lvcG9ydC5pb3BfcGFwYXIgJj0gflBBX0VORVRfUEROOworCWltbXItPmltX2lvcG9ydC5pb3BfcGFkaXIgfD0gUEFfRU5FVF9QRE47CisJaW1tci0+aW1faW9wb3J0LmlvcF9wYWRhdCB8PSBQQV9FTkVUX1BETjsKKyNlbGlmIGRlZmluZWQoUEJfRU5FVF9QRE4pCisJaW1tci0+aW1fY3BtLmNwX3BicGFyICY9IH5QQl9FTkVUX1BETjsKKwlpbW1yLT5pbV9jcG0uY3BfcGJkaXIgfD0gUEJfRU5FVF9QRE47CisJaW1tci0+aW1fY3BtLmNwX3BiZGF0IHw9IFBCX0VORVRfUEROOworI2VsaWYgZGVmaW5lZChQQ19FTkVUX1BETikKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH5QQ19FTkVUX1BETjsKKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3BjZGlyIHw9IFBDX0VORVRfUEROOworCWltbXItPmltX2lvcG9ydC5pb3BfcGNkYXQgfD0gUENfRU5FVF9QRE47CisjZWxpZiBkZWZpbmVkKFBEX0VORVRfUEROKQorCWltbXItPmltX2lvcG9ydC5pb3BfcGRwYXIgJj0gflBEX0VORVRfUEROOworCWltbXItPmltX2lvcG9ydC5pb3BfcGRkaXIgfD0gUERfRU5FVF9QRE47CisJaW1tci0+aW1faW9wb3J0LmlvcF9wZGRhdCB8PSBQRF9FTkVUX1BETjsKKyNlbmRpZgorI2VuZGlmCisKKwkvKgorCSAqIFNldCB0aGUgRU5UL0VOUiBiaXRzIGluIHRoZSBHU01SIExvdyAtLSBFbmFibGUgVHJhbnNtaXQvUmVjZWl2ZQorCSAqLworCisJaW1tci0+aW1fY3BtLmNwX3NjY1tTQ0NfRU5FVF0uc2NjX2dzbXJsIHw9CisJCShTQ0NfR1NNUkxfRU5SIHwgU0NDX0dTTVJMX0VOVCk7CisKKwkvKgorCSAqIFdvcmsgYXJvdW5kIHRyYW5zbWl0IHByb2JsZW0gd2l0aCBmaXJzdCBldGggcGFja2V0CisJICovCisjaWYgZGVmaW5lZCAoQ09ORklHX0ZBRFMpCisJdWRlbGF5ICgxMDAwMCk7CQkvKiB3YWl0IDEwIG1zICovCisjZWxpZiBkZWZpbmVkIChDT05GSUdfQU1YODYwKSB8fCBkZWZpbmVkKENPTkZJR19SUFhDTEFTU0lDKQorCXVkZWxheSAoMTAwMDAwKTsJLyogd2FpdCAxMDAgbXMgKi8KKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgc2NjX2hhbHQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKworCWltbXItPmltX2NwbS5jcF9zY2NbU0NDX0VORVRdLnNjY19nc21ybCAmPQorCQl+KFNDQ19HU01STF9FTlIgfCBTQ0NfR1NNUkxfRU5UKTsKKworCWltbXItPmltX2lvcG9ydC5pb3BfcGNzbyAgJj0gIH4oUENfRU5FVF9DTFNOIHwgUENfRU5FVF9SRU5BKTsKK30KKworI2lmIDAKK3ZvaWQgcmVzdGFydCAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCisJaW1tci0+aW1fY3BtLmNwX3NjY1tTQ0NfRU5FVF0uc2NjX2dzbXJsIHw9CisJCShTQ0NfR1NNUkxfRU5SIHwgU0NDX0dTTVJMX0VOVCk7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvc2VyaWFsLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRkYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvc2VyaWFsLmMKQEAgLTAsMCArMSw3NDUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHNlcmlhbC5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgIWRlZmluZWQoQ09ORklHXzh4eF9DT05TX05PTkUpCS8qIE5vIENvbnNvbGUgYXQgYWxsICovCisKKyNpZiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TTUMxKQkvKiBDb25zb2xlIG9uIFNNQzEgKi8KKyNkZWZpbmUJU01DX0lOREVYCTAKKyNkZWZpbmUgUFJPRkZfU01DCVBST0ZGX1NNQzEKKyNkZWZpbmUgQ1BNX0NSX0NIX1NNQwlDUE1fQ1JfQ0hfU01DMQorCisjZWxpZiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TTUMyKQkvKiBDb25zb2xlIG9uIFNNQzIgKi8KKyNkZWZpbmUgU01DX0lOREVYCTEKKyNkZWZpbmUgUFJPRkZfU01DCVBST0ZGX1NNQzIKKyNkZWZpbmUgQ1BNX0NSX0NIX1NNQwlDUE1fQ1JfQ0hfU01DMgorCisjZW5kaWYgLyogQ09ORklHXzh4eF9DT05TX1NNQ3ggKi8KKworI2lmIGRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NDQzEpCS8qIENvbnNvbGUgb24gU0NDMSAqLworI2RlZmluZSBTQ0NfSU5ERVgJMAorI2RlZmluZSBQUk9GRl9TQ0MJUFJPRkZfU0NDMQorI2RlZmluZSBDUE1fQ1JfQ0hfU0NDCUNQTV9DUl9DSF9TQ0MxCisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NDQzIpCS8qIENvbnNvbGUgb24gU0NDMiAqLworI2RlZmluZSBTQ0NfSU5ERVgJMQorI2RlZmluZSBQUk9GRl9TQ0MJUFJPRkZfU0NDMgorI2RlZmluZSBDUE1fQ1JfQ0hfU0NDCUNQTV9DUl9DSF9TQ0MyCisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NDQzMpCS8qIENvbnNvbGUgb24gU0NDMyAqLworI2RlZmluZSBTQ0NfSU5ERVgJMgorI2RlZmluZSBQUk9GRl9TQ0MJUFJPRkZfU0NDMworI2RlZmluZSBDUE1fQ1JfQ0hfU0NDCUNQTV9DUl9DSF9TQ0MzCisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NDQzQpCS8qIENvbnNvbGUgb24gU0NDNCAqLworI2RlZmluZSBTQ0NfSU5ERVgJMworI2RlZmluZSBQUk9GRl9TQ0MJUFJPRkZfU0NDNAorI2RlZmluZSBDUE1fQ1JfQ0hfU0NDCUNQTV9DUl9DSF9TQ0M0CisKKyNlbmRpZiAvKiBDT05GSUdfOHh4X0NPTlNfU0NDeCAqLworCisjaWYgIWRlZmluZWQoQ09ORklHX1NZU19TTUNfUlhCVUZMRU4pCisjZGVmaW5lIENPTkZJR19TWVNfU01DX1JYQlVGTEVOCTEKKyNkZWZpbmUgQ09ORklHX1NZU19NQVhJRExFCTAKKyNlbHNlCisjaWYgIWRlZmluZWQoQ09ORklHX1NZU19NQVhJRExFKQorI2Vycm9yICJ5b3UgbXVzdCBkZWZpbmUgQ09ORklHX1NZU19NQVhJRExFIgorI2VuZGlmCisjZW5kaWYKKwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3Qgc2VyaWFsYnVmZmVyIHsKKwljYmRfdAlyeGJkOwkJLyogUnggQkQgKi8KKwljYmRfdAl0eGJkOwkJLyogVHggQkQgKi8KKwl1aW50CXJ4aW5kZXg7CS8qIGluZGV4IGZvciBuZXh0IGNoYXJhY3RlciB0byByZWFkICovCisJdm9sYXRpbGUgdWNoYXIJcnhidWZbQ09ORklHX1NZU19TTUNfUlhCVUZMRU5dOy8qIHJ4IGJ1ZmZlcnMgKi8KKwl2b2xhdGlsZSB1Y2hhcgl0eGJ1ZjsJLyogdHggYnVmZmVycyAqLworfSBzZXJpYWxidWZmZXJfdDsKKworc3RhdGljIHZvaWQgc2VyaWFsX3NldGRpdmlzb3Iodm9sYXRpbGUgY3BtOHh4X3QgKmNwKQoreworCWludCBkaXZpc29yPShnZC0+Y3B1X2NsayArIDgqZ2QtPmJhdWRyYXRlKS8xNi9nZC0+YmF1ZHJhdGU7CisKKwlpZihkaXZpc29yLzE2PjB4MTAwMCkgeworCQkvKiBiYWQgZGl2aXNvciwgYXNzdW1lIDUwTUh6IGNsb2NrIGFuZCA5NjAwIGJhdWQgKi8KKwkJZGl2aXNvcj0oNTAqMTAwMCoxMDAwICsgOCo5NjAwKS8xNi85NjAwOworCX0KKworI2lmZGVmIENPTkZJR19TWVNfQlJHQ0xLX1BSRVNDQUxFCisJZGl2aXNvciAvPSBDT05GSUdfU1lTX0JSR0NMS19QUkVTQ0FMRTsKKyNlbmRpZgorCisJaWYoZGl2aXNvcjw9MHgxMDAwKSB7CisJCWNwLT5jcF9icmdjMT0oKGRpdmlzb3ItMSk8PDEpIHwgQ1BNX0JSR19FTjsKKwl9IGVsc2UgeworCQljcC0+Y3BfYnJnYzE9KChkaXZpc29yLzE2LTEpPDwxKSB8IENQTV9CUkdfRU4gfCBDUE1fQlJHX0RJVjE2OworCX0KK30KKworI2lmIChkZWZpbmVkIChDT05GSUdfOHh4X0NPTlNfU01DMSkgfHwgZGVmaW5lZCAoQ09ORklHXzh4eF9DT05TX1NNQzIpKQorCisvKgorICogTWluaW1hbCBzZXJpYWwgZnVuY3Rpb25zIG5lZWRlZCB0byB1c2Ugb25lIG9mIHRoZSBTTUMgcG9ydHMKKyAqIGFzIHNlcmlhbCBjb25zb2xlIGludGVyZmFjZS4KKyAqLworCitzdGF0aWMgdm9pZCBzbWNfc2V0YnJnICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgY3BtOHh4X3QgKmNwID0gJihpbS0+aW1fY3BtKTsKKworCS8qIFNldCB1cCB0aGUgYmF1ZCByYXRlIGdlbmVyYXRvci4KKwkgKiBTZWUgOHh4X2lvL2NvbW1wcm9jLmMgZm9yIGRldGFpbHMuCisJICoKKwkgKiBXaXJlIEJSRzEgdG8gU01DeAorCSAqLworCisJY3AtPmNwX3NpbW9kZSA9IDB4MDAwMDAwMDA7CisKKwlzZXJpYWxfc2V0ZGl2aXNvcihjcCk7Cit9CisKK3N0YXRpYyBpbnQgc21jX2luaXQgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBzbWNfdCAqc3A7CisJdm9sYXRpbGUgc21jX3VhcnRfdCAqdXA7CisJdm9sYXRpbGUgY3BtOHh4X3QgKmNwID0gJihpbS0+aW1fY3BtKTsKKyNpZiAoIWRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NNQzEpKSAmJiAoZGVmaW5lZChDT05GSUdfTVBDODIzKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4NTApKQorCXZvbGF0aWxlIGlvcDh4eF90ICppcCA9IChpb3A4eHhfdCAqKSYoaW0tPmltX2lvcG9ydCk7CisjZW5kaWYKKwl1aW50CWRwYWRkcjsKKwl2b2xhdGlsZSBzZXJpYWxidWZmZXJfdCAqcnR4OworCisJLyogaW5pdGlhbGl6ZSBwb2ludGVycyB0byBTTUMgKi8KKworCXNwID0gKHNtY190ICopICYoY3AtPmNwX3NtY1tTTUNfSU5ERVhdKTsKKwl1cCA9IChzbWNfdWFydF90ICopICZjcC0+Y3BfZHBhcmFtW1BST0ZGX1NNQ107CisjaWZkZWYgQ09ORklHX1NZU19TTUNfVUNPREVfUEFUQ0gKKwl1cCA9IChzbWNfdWFydF90ICopICZjcC0+Y3BfZHBtZW1bdXAtPnNtY19ycGJhc2VdOworI2Vsc2UKKwkvKiBEaXNhYmxlIHJlbG9jYXRpb24gKi8KKwl1cC0+c21jX3JwYmFzZSA9IDA7CisjZW5kaWYKKworCS8qIERpc2FibGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIuICovCisJc3AtPnNtY19zbWNtciAmPSB+KFNNQ01SX1JFTiB8IFNNQ01SX1RFTik7CisKKwkvKiBFbmFibGUgU0RNQS4gKi8KKwlpbS0+aW1fc2l1X2NvbmYuc2Nfc2RjciA9IDE7CisKKwkvKiBjbGVhciBlcnJvciBjb25kaXRpb25zICovCisjaWZkZWYJQ09ORklHX1NZU19TRFNSCisJaW0tPmltX3NkbWEuc2RtYV9zZHNyID0gQ09ORklHX1NZU19TRFNSOworI2Vsc2UKKwlpbS0+aW1fc2RtYS5zZG1hX3Nkc3IgPSAweDgzOworI2VuZGlmCisKKwkvKiBjbGVhciBTRE1BIGludGVycnVwdCBtYXNrICovCisjaWZkZWYJQ09ORklHX1NZU19TRE1SCisJaW0tPmltX3NkbWEuc2RtYV9zZG1yID0gQ09ORklHX1NZU19TRE1SOworI2Vsc2UKKwlpbS0+aW1fc2RtYS5zZG1hX3NkbXIgPSAweDAwOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TTUMxKQorCS8qIFVzZSBQb3J0IEIgZm9yIFNNQzEgaW5zdGVhZCBvZiBvdGhlciBmdW5jdGlvbnMuICovCisJY3AtPmNwX3BicGFyIHw9ICAweDAwMDAwMGMwOworCWNwLT5jcF9wYmRpciAmPSB+MHgwMDAwMDBjMDsKKwljcC0+Y3BfcGJvZHIgJj0gfjB4MDAwMDAwYzA7CisjZWxzZQkvKiBDT05GSUdfOHh4X0NPTlNfU01DMiAqLworIyBpZiBkZWZpbmVkKENPTkZJR19NUEM4MjMpIHx8IGRlZmluZWQoQ09ORklHX01QQzg1MCkKKwkvKiBVc2UgUG9ydCBBIGZvciBTTUMyIGluc3RlYWQgb2Ygb3RoZXIgZnVuY3Rpb25zLiAqLworCWlwLT5pb3BfcGFwYXIgfD0gIDB4MDBjMDsKKwlpcC0+aW9wX3BhZGlyICY9IH4weDAwYzA7CisJaXAtPmlvcF9wYW9kciAmPSB+MHgwMGMwOworIyBlbHNlCS8qIG11c3QgYmUgYSA4NjAgdGhlbiAqLworCS8qIFVzZSBQb3J0IEIgZm9yIFNNQzIgaW5zdGVhZCBvZiBvdGhlciBmdW5jdGlvbnMuCisJICovCisJY3AtPmNwX3BicGFyIHw9ICAweDAwMDAwYzAwOworCWNwLT5jcF9wYmRpciAmPSB+MHgwMDAwMGMwMDsKKwljcC0+Y3BfcGJvZHIgJj0gfjB4MDAwMDBjMDA7CisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZBRFMpIHx8IGRlZmluZWQoQ09ORklHX0FEUykKKwkvKiBFbmFibGUgUlMyMzIgKi8KKyNpZiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TTUMxKQorCSooKHVpbnQgKikgQkNTUjEpICY9IH5CQ1NSMV9SUzIzMkVOXzE7CisjZWxzZQorCSooKHVpbnQgKikgQkNTUjEpICY9IH5CQ1NSMV9SUzIzMkVOXzI7CisjZW5kaWYKKyNlbmRpZgkvKiBDT05GSUdfRkFEUyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfUlBYTElURSkgfHwgZGVmaW5lZChDT05GSUdfUlBYQ0xBU1NJQykKKwkvKiBFbmFibGUgTW9uaXRvciBQb3J0IFRyYW5zY2VpdmVyICovCisJKigodWNoYXIgKikgQkNTUjApIHw9IEJDU1IwX0VOTU9OWENWUiA7CisjZW5kaWYgLyogQ09ORklHX1JQWExJVEUgKi8KKworCS8qIFNldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVycyBpbgorCSAqIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMuCisJICovCisKKyNpZmRlZiBDT05GSUdfU1lTX0FMTE9DX0RQUkFNCisJLyogYWxsb2NhdGUKKwkgKiBzaXplIG9mIHN0cnVjdCBzZXJpYWxidWZmZXIgd2l0aCBiZCByeC90eCwgYnVmZmVyIHJ4L3R4IGFuZCByeCBpbmRleAorCSAqLworCWRwYWRkciA9IGRwcmFtX2FsbG9jX2FsaWduKChzaXplb2Yoc2VyaWFsYnVmZmVyX3QpKSwgOCk7CisjZWxzZQorCWRwYWRkciA9IENQTV9TRVJJQUxfQkFTRSA7CisjZW5kaWYKKworCXJ0eCA9IChzZXJpYWxidWZmZXJfdCAqKSZjcC0+Y3BfZHBtZW1bZHBhZGRyXTsKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdHdvIGJ1ZmZlciBkZXNjcmlwdG9ycyBpbiB0aGUgRFAgcmFtLgorCSAqIEZvciBub3csIHRoaXMgYWRkcmVzcyBzZWVtcyBPSywgYnV0IGl0IG1heSBoYXZlIHRvCisJICogY2hhbmdlIHdpdGggbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIGZpcm13YXJlLgorCSAqIGRhbW06IGFsbG9jYXRpbmcgc3BhY2UgYWZ0ZXIgdGhlIHR3byBidWZmZXJzIGZvciByeC90eCBkYXRhCisJICovCisKKwlydHgtPnJ4YmQuY2JkX2J1ZmFkZHIgPSAodWludCkgJnJ0eC0+cnhidWY7CisJcnR4LT5yeGJkLmNiZF9zYyAgICAgID0gMDsKKworCXJ0eC0+dHhiZC5jYmRfYnVmYWRkciA9ICh1aW50KSAmcnR4LT50eGJ1ZjsKKwlydHgtPnR4YmQuY2JkX3NjICAgICAgPSAwOworCisJLyogU2V0IHVwIHRoZSB1YXJ0IHBhcmFtZXRlcnMgaW4gdGhlIHBhcmFtZXRlciByYW0uICovCisJdXAtPnNtY19yYmFzZSA9IGRwYWRkcjsKKwl1cC0+c21jX3RiYXNlID0gZHBhZGRyK3NpemVvZihjYmRfdCk7CisJdXAtPnNtY19yZmNyID0gU01DX0VCOworCXVwLT5zbWNfdGZjciA9IFNNQ19FQjsKKyNpZiBkZWZpbmVkIChDT05GSUdfU1lTX1NNQ19VQ09ERV9QQVRDSCkKKwl1cC0+c21jX3JicHRyID0gdXAtPnNtY19yYmFzZTsKKwl1cC0+c21jX3RicHRyID0gdXAtPnNtY190YmFzZTsKKwl1cC0+c21jX3JzdGF0ZSA9IDA7CisJdXAtPnNtY190c3RhdGUgPSAwOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NQlgpCisJYm9hcmRfc2VyaWFsX2luaXQoKTsKKyNlbmRpZgkvKiBDT05GSUdfTUJYICovCisKKwkvKiBTZXQgVUFSVCBtb2RlLCA4IGJpdCwgbm8gcGFyaXR5LCBvbmUgc3RvcC4KKwkgKiBFbmFibGUgcmVjZWl2ZSBhbmQgdHJhbnNtaXQuCisJICovCisJc3AtPnNtY19zbWNtciA9IHNtY3JfbWtfY2xlbig5KSB8ICBTTUNNUl9TTV9VQVJUOworCisJLyogTWFzayBhbGwgaW50ZXJydXB0cyBhbmQgcmVtb3ZlIGFueXRoaW5nIHBlbmRpbmcuCisJKi8KKwlzcC0+c21jX3NtY20gPSAwOworCXNwLT5zbWNfc21jZSA9IDB4ZmY7CisKKyNpZmRlZiBDT05GSUdfU1lTX1NQQzE5MjBfU01DMV9DTEs0CisJLyogY2xvY2sgc291cmNlIGlzIFBMRCAqLworCisJLyogc2V0IGZyZXEgdG8gMTkyMDAgQmF1ZCAqLworCSooKHZvbGF0aWxlIHVjaGFyICopIENPTkZJR19TWVNfU1BDMTkyMF9QTERfQkFTRSs2KSA9IDB4MzsKKwkvKiBjb25maWd1cmUgY2xrNCBhcyBpbnB1dCAqLworCWltLT5pbV9pb3BvcnQuaW9wX3BkcGFyIHw9IDB4ODAwOworCWltLT5pbV9pb3BvcnQuaW9wX3BkZGlyICY9IH4weDgwMDsKKworCWNwLT5jcF9zaW1vZGUgPSAoKGNwLT5jcF9zaW1vZGUgJiB+MHhmMDAwKSB8IDB4NzAwMCk7CisjZWxzZQorCS8qIFNldCB1cCB0aGUgYmF1ZCByYXRlIGdlbmVyYXRvciAqLworCXNtY19zZXRicmcgKCk7CisjZW5kaWYKKworCS8qIE1ha2UgdGhlIGZpcnN0IGJ1ZmZlciB0aGUgb25seSBidWZmZXIuICovCisJcnR4LT50eGJkLmNiZF9zYyB8PSBCRF9TQ19XUkFQOworCXJ0eC0+cnhiZC5jYmRfc2MgfD0gQkRfU0NfRU1QVFkgfCBCRF9TQ19XUkFQOworCisJLyogc2luZ2xlL211bHRpIGNoYXJhY3RlciByZWNlaXZlLiAqLworCXVwLT5zbWNfbXJibHIgPSBDT05GSUdfU1lTX1NNQ19SWEJVRkxFTjsKKwl1cC0+c21jX21heGlkbCA9IENPTkZJR19TWVNfTUFYSURMRTsKKwlydHgtPnJ4aW5kZXggPSAwOworCisJLyogSW5pdGlhbGl6ZSBUeC9SeCBwYXJhbWV0ZXJzLgkqLworCXdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpICAvKiB3YWl0IGlmIGNwIGlzIGJ1c3kgKi8KKwkgIDsKKworCWNwLT5jcF9jcGNyID0gbWtfY3JfY21kKENQTV9DUl9DSF9TTUMsIENQTV9DUl9JTklUX1RSWCkgfCBDUE1fQ1JfRkxHOworCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykgIC8qIHdhaXQgaWYgY3AgaXMgYnVzeSAqLworCSAgOworCisJLyogRW5hYmxlIHRyYW5zbWl0dGVyL3JlY2VpdmVyLgkqLworCXNwLT5zbWNfc21jbXIgfD0gU01DTVJfUkVOIHwgU01DTVJfVEVOOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3NtY19wdXRjKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBzbWNfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBpbW1hcF90CSppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGNwbTh4eF90CSpjcG1wID0gJihpbS0+aW1fY3BtKTsKKwl2b2xhdGlsZSBzZXJpYWxidWZmZXJfdAkqcnR4OworCisjaWZkZWYgQ09ORklHX01PREVNX1NVUFBPUlQKKwlpZiAoZ2QtPmJlX3F1aWV0KQorCQlyZXR1cm47CisjZW5kaWYKKworCWlmIChjID09ICdcbicpCisJCXNtY19wdXRjICgnXHInKTsKKworCXVwID0gKHNtY191YXJ0X3QgKikmY3BtcC0+Y3BfZHBhcmFtW1BST0ZGX1NNQ107CisjaWZkZWYgQ09ORklHX1NZU19TTUNfVUNPREVfUEFUQ0gKKwl1cCA9IChzbWNfdWFydF90ICopICZjcG1wLT5jcF9kcG1lbVt1cC0+c21jX3JwYmFzZV07CisjZW5kaWYKKworCXJ0eCA9IChzZXJpYWxidWZmZXJfdCAqKSZjcG1wLT5jcF9kcG1lbVt1cC0+c21jX3JiYXNlXTsKKworCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLiAqLworCXJ0eC0+dHhidWYgPSBjOworCXJ0eC0+dHhiZC5jYmRfZGF0bGVuID0gMTsKKwlydHgtPnR4YmQuY2JkX3NjIHw9IEJEX1NDX1JFQURZOworCV9fYXNtX18oImVpZWlvIik7CisKKwl3aGlsZSAocnR4LT50eGJkLmNiZF9zYyAmIEJEX1NDX1JFQURZKSB7CisJCVdBVENIRE9HX1JFU0VUICgpOworCQlfX2FzbV9fKCJlaWVpbyIpOworCX0KK30KKworc3RhdGljIHZvaWQKK3NtY19wdXRzIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzbWNfcHV0YyAoKnMrKyk7CisJfQorfQorCitzdGF0aWMgaW50CitzbWNfZ2V0Yyh2b2lkKQoreworCXZvbGF0aWxlIHNtY191YXJ0X3QJKnVwOworCXZvbGF0aWxlIGltbWFwX3QJKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgY3BtOHh4X3QJKmNwbXAgPSAmKGltLT5pbV9jcG0pOworCXZvbGF0aWxlIHNlcmlhbGJ1ZmZlcl90CSpydHg7CisJdW5zaWduZWQgY2hhciAgYzsKKworCXVwID0gKHNtY191YXJ0X3QgKikmY3BtcC0+Y3BfZHBhcmFtW1BST0ZGX1NNQ107CisjaWZkZWYgQ09ORklHX1NZU19TTUNfVUNPREVfUEFUQ0gKKwl1cCA9IChzbWNfdWFydF90ICopICZjcG1wLT5jcF9kcG1lbVt1cC0+c21jX3JwYmFzZV07CisjZW5kaWYKKwlydHggPSAoc2VyaWFsYnVmZmVyX3QgKikmY3BtcC0+Y3BfZHBtZW1bdXAtPnNtY19yYmFzZV07CisKKwkvKiBXYWl0IGZvciBjaGFyYWN0ZXIgdG8gc2hvdyB1cC4gKi8KKwl3aGlsZSAocnR4LT5yeGJkLmNiZF9zYyAmIEJEX1NDX0VNUFRZKQorCQlXQVRDSERPR19SRVNFVCAoKTsKKworCS8qIHRoZSBjaGFyYWN0ZXJzIGFyZSByZWFkIG9uZSBieSBvbmUsCisJICogdXNlIHRoZSByeGluZGV4IHRvIGtub3cgdGhlIG5leHQgY2hhciB0byBkZWxpdmVyCisJICovCisJYyA9ICoodW5zaWduZWQgY2hhciAqKSAocnR4LT5yeGJkLmNiZF9idWZhZGRyK3J0eC0+cnhpbmRleCk7CisJcnR4LT5yeGluZGV4Kys7CisKKwkvKiBjaGVjayBpZiBhbGwgY2hhciBhcmUgcmVhZG91dCwgdGhlbiBtYWtlIHByZXBhcmUgZm9yIG5leHQgcmVjZWl2ZSAqLworCWlmIChydHgtPnJ4aW5kZXggPj0gcnR4LT5yeGJkLmNiZF9kYXRsZW4pIHsKKwkJcnR4LT5yeGluZGV4ID0gMDsKKwkJcnR4LT5yeGJkLmNiZF9zYyB8PSBCRF9TQ19FTVBUWTsKKwl9CisJcmV0dXJuKGMpOworfQorCitzdGF0aWMgaW50CitzbWNfdHN0Yyh2b2lkKQoreworCXZvbGF0aWxlIHNtY191YXJ0X3QJKnVwOworCXZvbGF0aWxlIGltbWFwX3QJKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgY3BtOHh4X3QJKmNwbXAgPSAmKGltLT5pbV9jcG0pOworCXZvbGF0aWxlIHNlcmlhbGJ1ZmZlcl90CSpydHg7CisKKwl1cCA9IChzbWNfdWFydF90ICopJmNwbXAtPmNwX2RwYXJhbVtQUk9GRl9TTUNdOworI2lmZGVmIENPTkZJR19TWVNfU01DX1VDT0RFX1BBVENICisJdXAgPSAoc21jX3VhcnRfdCAqKSAmY3BtcC0+Y3BfZHBtZW1bdXAtPnNtY19ycGJhc2VdOworI2VuZGlmCisKKwlydHggPSAoc2VyaWFsYnVmZmVyX3QgKikmY3BtcC0+Y3BfZHBtZW1bdXAtPnNtY19yYmFzZV07CisKKwlyZXR1cm4gIShydHgtPnJ4YmQuY2JkX3NjICYgQkRfU0NfRU1QVFkpOworfQorCitzdHJ1Y3Qgc2VyaWFsX2RldmljZSBzZXJpYWxfc21jX2RldmljZSA9Cit7CisJInNlcmlhbF9zbWMiLAorCSJTTUMiLAorCXNtY19pbml0LAorCXNtY19zZXRicmcsCisJc21jX2dldGMsCisJc21jX3RzdGMsCisJc21jX3B1dGMsCisJc21jX3B1dHMsCit9OworCisjZW5kaWYgLyogQ09ORklHXzh4eF9DT05TX1NNQzEgfHwgQ09ORklHXzh4eF9DT05TX1NNQzIgKi8KKworI2lmIGRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NDQzEpIHx8IGRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NDQzIpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TQ0MzKSB8fCBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TQ0M0KQorCitzdGF0aWMgdm9pZAorc2NjX3NldGJyZyAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIGNwbTh4eF90ICpjcCA9ICYoaW0tPmltX2NwbSk7CisKKwkvKiBTZXQgdXAgdGhlIGJhdWQgcmF0ZSBnZW5lcmF0b3IuCisJICogU2VlIDh4eF9pby9jb21tcHJvYy5jIGZvciBkZXRhaWxzLgorCSAqCisJICogV2lyZSBCUkcxIHRvIFNDQ3gKKwkgKi8KKworCWNwLT5jcF9zaWNyICY9IH4oMHgwMDAwMDBGRiA8PCAoOCAqIFNDQ19JTkRFWCkpOworCisJc2VyaWFsX3NldGRpdmlzb3IoY3ApOworfQorCitzdGF0aWMgaW50IHNjY19pbml0ICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgc2NjX3QgKnNwOworCXZvbGF0aWxlIHNjY191YXJ0X3QgKnVwOworCXZvbGF0aWxlIGNiZF90ICp0YmRmLCAqcmJkZjsKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3AgPSAmKGltLT5pbV9jcG0pOworCXVpbnQJIGRwYWRkcjsKKyNpZiAoU0NDX0lOREVYICE9IDIpIHx8ICFkZWZpbmVkKENPTkZJR19NUEM4NTApCisJdm9sYXRpbGUgaW9wOHh4X3QgKmlwID0gKGlvcDh4eF90ICopJihpbS0+aW1faW9wb3J0KTsKKyNlbmRpZgorCisJLyogaW5pdGlhbGl6ZSBwb2ludGVycyB0byBTQ0MgKi8KKworCXNwID0gKHNjY190ICopICYoY3AtPmNwX3NjY1tTQ0NfSU5ERVhdKTsKKwl1cCA9IChzY2NfdWFydF90ICopICZjcC0+Y3BfZHBhcmFtW1BST0ZGX1NDQ107CisKKyNpZiBkZWZpbmVkKENPTkZJR19MV01PTikgJiYgZGVmaW5lZChDT05GSUdfOHh4X0NPTlNfU0NDMikKKyAgICB7CS8qIERpc2FibGUgRXRoZXJuZXQsIGVuYWJsZSBTZXJpYWwgKi8KKwl1Y2hhciBjOworCisJYyA9IHBpY19yZWFkICAoMHg2MSk7CisJYyAmPSB+MHg0MDsJLyogZW5hYmxlIENPTTMgKi8KKwljIHw9ICAweDgwOwkvKiBkaXNhYmxlIEV0aGVybmV0ICovCisJcGljX3dyaXRlICgweDYxLCBjKTsKKworCS8qIGVuYWJsZSBSVFMyICovCisJY3AtPmNwX3BicGFyIHw9ICAweDIwMDA7CisJY3AtPmNwX3BiZGF0IHw9ICAweDIwMDA7CisJY3AtPmNwX3BiZGlyIHw9ICAweDIwMDA7CisgICAgfQorI2VuZGlmCS8qIENPTkZJR19MV01PTiAqLworCisJLyogRGlzYWJsZSB0cmFuc21pdHRlci9yZWNlaXZlci4gKi8KKwlzcC0+c2NjX2dzbXJsICY9IH4oU0NDX0dTTVJMX0VOUiB8IFNDQ19HU01STF9FTlQpOworCisjaWYgKFNDQ19JTkRFWCA9PSAyKSAmJiBkZWZpbmVkKENPTkZJR19NUEM4NTApCisJLyoKKwkgKiBUaGUgTVBDODUwIGhhcyBTQ0MzIG9uIFBvcnQgQgorCSAqLworCWNwLT5jcF9wYnBhciB8PSAgMHgwNjsKKwljcC0+Y3BfcGJkaXIgJj0gfjB4MDY7CisJY3AtPmNwX3Bib2RyICY9IH4weDA2OworCisjZWxpZiAoU0NDX0lOREVYIDwgMikgfHwgIWRlZmluZWQoQ09ORklHX0lQODYwKQorCS8qCisJICogU3RhbmRhcmQgY29uZmlndXJhdGlvbiBmb3IgU0NDJ3MgaXMgb24gUGFydCBBCisJICovCisJaXAtPmlvcF9wYXBhciB8PSAgKCgzIDw8ICgyICogU0NDX0lOREVYKSkpOworCWlwLT5pb3BfcGFkaXIgJj0gfigoMyA8PCAoMiAqIFNDQ19JTkRFWCkpKTsKKwlpcC0+aW9wX3Bhb2RyICY9IH4oKDMgPDwgKDIgKiBTQ0NfSU5ERVgpKSk7CisjZWxzZQorCS8qCisJICogVGhlIElQODYwIGhhcyBTQ0MzIGFuZCBTQ0M0IG9uIFBvcnQgRAorCSAqLworCWlwLT5pb3BfcGRwYXIgfD0gICgoMyA8PCAoMiAqIFNDQ19JTkRFWCkpKTsKKyNlbmRpZgorCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHR3byBidWZmZXIgZGVzY3JpcHRvcnMgaW4gdGhlIERQIHJhbS4gKi8KKworI2lmZGVmIENPTkZJR19TWVNfQUxMT0NfRFBSQU0KKwlkcGFkZHIgPSBkcHJhbV9hbGxvY19hbGlnbiAoc2l6ZW9mKGNiZF90KSoyICsgMiwgOCkgOworI2Vsc2UKKwlkcGFkZHIgPSBDUE1fU0VSSUFMMl9CQVNFIDsKKyNlbmRpZgorCisJLyogRW5hYmxlIFNETUEuCSovCisJaW0tPmltX3NpdV9jb25mLnNjX3NkY3IgPSAweDAwMDE7CisKKwkvKiBTZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGhvc3QgbWVtb3J5IGJ1ZmZlcnMgaW4KKwkgKiB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzLgorCSAqLworCisJcmJkZiA9IChjYmRfdCAqKSZjcC0+Y3BfZHBtZW1bZHBhZGRyXTsKKwlyYmRmLT5jYmRfYnVmYWRkciA9ICh1aW50KSAocmJkZisyKTsKKwlyYmRmLT5jYmRfc2MgPSAwOworCXRiZGYgPSByYmRmICsgMTsKKwl0YmRmLT5jYmRfYnVmYWRkciA9ICgodWludCkgKHJiZGYrMikpICsgMTsKKwl0YmRmLT5jYmRfc2MgPSAwOworCisJLyogU2V0IHVwIHRoZSBiYXVkIHJhdGUgZ2VuZXJhdG9yLiAqLworCXNjY19zZXRicmcgKCk7CisKKwkvKiBTZXQgdXAgdGhlIHVhcnQgcGFyYW1ldGVycyBpbiB0aGUgcGFyYW1ldGVyIHJhbS4gKi8KKwl1cC0+c2NjX2dlbnNjYy5zY2NfcmJhc2UgPSBkcGFkZHI7CisJdXAtPnNjY19nZW5zY2Muc2NjX3RiYXNlID0gZHBhZGRyK3NpemVvZihjYmRfdCk7CisKKwkvKiBJbml0aWFsaXplIFR4L1J4IHBhcmFtZXRlcnMuICovCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykgIC8qIHdhaXQgaWYgY3AgaXMgYnVzeSAqLworCQk7CisJY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoQ1BNX0NSX0NIX1NDQywgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisKKwl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKSAgLyogd2FpdCBpZiBjcCBpcyBidXN5ICovCisJCTsKKworCXVwLT5zY2NfZ2Vuc2NjLnNjY19yZmNyICA9IFNDQ19FQiB8IDB4MDU7CisJdXAtPnNjY19nZW5zY2Muc2NjX3RmY3IgID0gU0NDX0VCIHwgMHgwNTsKKworCXVwLT5zY2NfZ2Vuc2NjLnNjY19tcmJsciA9IDE7CS8qIFNpbmdsZSBjaGFyYWN0ZXIgcmVjZWl2ZSAqLworCXVwLT5zY2NfbWF4aWRsID0gMDsJCS8qIGRpc2FibGUgbWF4IGlkbGUgKi8KKwl1cC0+c2NjX2Jya2NyICA9IDE7CQkvKiBzZW5kIG9uZSBicmVhayBjaGFyYWN0ZXIgb24gc3RvcCBUWCAqLworCXVwLT5zY2NfcGFyZWMgID0gMDsKKwl1cC0+c2NjX2ZybWVjICA9IDA7CisJdXAtPnNjY19ub3NlYyAgPSAwOworCXVwLT5zY2NfYnJrZWMgID0gMDsKKwl1cC0+c2NjX3VhZGRyMSA9IDA7CisJdXAtPnNjY191YWRkcjIgPSAwOworCXVwLT5zY2NfdG9zZXEgID0gMDsKKwl1cC0+c2NjX2NoYXIxICA9IDB4ODAwMDsKKwl1cC0+c2NjX2NoYXIyICA9IDB4ODAwMDsKKwl1cC0+c2NjX2NoYXIzICA9IDB4ODAwMDsKKwl1cC0+c2NjX2NoYXI0ICA9IDB4ODAwMDsKKwl1cC0+c2NjX2NoYXI1ICA9IDB4ODAwMDsKKwl1cC0+c2NjX2NoYXI2ICA9IDB4ODAwMDsKKwl1cC0+c2NjX2NoYXI3ICA9IDB4ODAwMDsKKwl1cC0+c2NjX2NoYXI4ICA9IDB4ODAwMDsKKwl1cC0+c2NjX3JjY20gICA9IDB4YzBmZjsKKworCS8qIFNldCBsb3cgbGF0ZW5jeSAvIHNtYWxsIGZpZm8uICovCisJc3AtPnNjY19nc21yaCA9IFNDQ19HU01SSF9SRlc7CisKKwkvKiBTZXQgU0NDKHgpIGNsb2NrIG1vZGUgdG8gMTZ4CisJICogU2VlIDh4eF9pby9jb21tcHJvYy5jIGZvciBkZXRhaWxzLgorCSAqCisJICogV2lyZSBCUkcxIHRvIFNDQ24KKwkgKi8KKworCS8qIFNldCBVQVJUIG1vZGUsIGNsb2NrIGRpdmlkZXIgMTYgb24gVHggYW5kIFJ4ICovCisJc3AtPnNjY19nc21ybCAmPSB+MHhGOworCXNwLT5zY2NfZ3NtcmwgfD0KKwkJKFNDQ19HU01STF9NT0RFX1VBUlQgfCBTQ0NfR1NNUkxfVERDUl8xNiB8IFNDQ19HU01STF9SRENSXzE2KTsKKworCXNwLT5zY2NfcHNtciAgPSAwOworCXNwLT5zY2NfcHNtciAgfD0gU0NVX1BTTVJfQ0w7CisKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzIGFuZCByZW1vdmUgYW55dGhpbmcgcGVuZGluZy4gKi8KKwlzcC0+c2NjX3NjY20gPSAwOworCXNwLT5zY2Nfc2NjZSA9IDB4ZmZmZjsKKwlzcC0+c2NjX2RzciAgPSAweDdlN2U7CisJc3AtPnNjY19wc21yID0gMHgzMDAwOworCisJLyogTWFrZSB0aGUgZmlyc3QgYnVmZmVyIHRoZSBvbmx5IGJ1ZmZlci4gKi8KKwl0YmRmLT5jYmRfc2MgfD0gQkRfU0NfV1JBUDsKKwlyYmRmLT5jYmRfc2MgfD0gQkRfU0NfRU1QVFkgfCBCRF9TQ19XUkFQOworCisJLyogRW5hYmxlIHRyYW5zbWl0dGVyL3JlY2VpdmVyLgkqLworCXNwLT5zY2NfZ3NtcmwgfD0gKFNDQ19HU01STF9FTlIgfCBTQ0NfR1NNUkxfRU5UKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzY2NfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisJdm9sYXRpbGUgY2JkX3QJCSp0YmRmOworCXZvbGF0aWxlIGNoYXIJCSpidWY7CisJdm9sYXRpbGUgc2NjX3VhcnRfdAkqdXA7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBjcG04eHhfdAkqY3BtcCA9ICYoaW0tPmltX2NwbSk7CisKKyNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVAorCWlmIChnZC0+YmVfcXVpZXQpCisJCXJldHVybjsKKyNlbmRpZgorCisJaWYgKGMgPT0gJ1xuJykKKwkJc2NjX3B1dGMgKCdccicpOworCisJdXAgPSAoc2NjX3VhcnRfdCAqKSZjcG1wLT5jcF9kcGFyYW1bUFJPRkZfU0NDXTsKKworCXRiZGYgPSAoY2JkX3QgKikmY3BtcC0+Y3BfZHBtZW1bdXAtPnNjY19nZW5zY2Muc2NjX3RiYXNlXTsKKworCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLiAqLworCisJYnVmID0gKGNoYXIgKil0YmRmLT5jYmRfYnVmYWRkcjsKKworCSpidWYgPSBjOworCXRiZGYtPmNiZF9kYXRsZW4gPSAxOworCXRiZGYtPmNiZF9zYyB8PSBCRF9TQ19SRUFEWTsKKwlfX2FzbV9fKCJlaWVpbyIpOworCisJd2hpbGUgKHRiZGYtPmNiZF9zYyAmIEJEX1NDX1JFQURZKSB7CisJCV9fYXNtX18oImVpZWlvIik7CisJCVdBVENIRE9HX1JFU0VUICgpOworCX0KK30KKworc3RhdGljIHZvaWQKK3NjY19wdXRzIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzY2NfcHV0YyAoKnMrKyk7CisJfQorfQorCitzdGF0aWMgaW50CitzY2NfZ2V0Yyh2b2lkKQoreworCXZvbGF0aWxlIGNiZF90CQkqcmJkZjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpidWY7CisJdm9sYXRpbGUgc2NjX3VhcnRfdAkqdXA7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBjcG04eHhfdAkqY3BtcCA9ICYoaW0tPmltX2NwbSk7CisJdW5zaWduZWQgY2hhcgkJYzsKKworCXVwID0gKHNjY191YXJ0X3QgKikmY3BtcC0+Y3BfZHBhcmFtW1BST0ZGX1NDQ107CisKKwlyYmRmID0gKGNiZF90ICopJmNwbXAtPmNwX2RwbWVtW3VwLT5zY2NfZ2Vuc2NjLnNjY19yYmFzZV07CisKKwkvKiBXYWl0IGZvciBjaGFyYWN0ZXIgdG8gc2hvdyB1cC4gKi8KKwlidWYgPSAodW5zaWduZWQgY2hhciAqKXJiZGYtPmNiZF9idWZhZGRyOworCisJd2hpbGUgKHJiZGYtPmNiZF9zYyAmIEJEX1NDX0VNUFRZKQorCQlXQVRDSERPR19SRVNFVCAoKTsKKworCWMgPSAqYnVmOworCXJiZGYtPmNiZF9zYyB8PSBCRF9TQ19FTVBUWTsKKworCXJldHVybihjKTsKK30KKworc3RhdGljIGludAorc2NjX3RzdGModm9pZCkKK3sKKwl2b2xhdGlsZSBjYmRfdAkJKnJiZGY7CisJdm9sYXRpbGUgc2NjX3VhcnRfdAkqdXA7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBjcG04eHhfdAkqY3BtcCA9ICYoaW0tPmltX2NwbSk7CisKKwl1cCA9IChzY2NfdWFydF90ICopJmNwbXAtPmNwX2RwYXJhbVtQUk9GRl9TQ0NdOworCisJcmJkZiA9IChjYmRfdCAqKSZjcG1wLT5jcF9kcG1lbVt1cC0+c2NjX2dlbnNjYy5zY2NfcmJhc2VdOworCisJcmV0dXJuKCEocmJkZi0+Y2JkX3NjICYgQkRfU0NfRU1QVFkpKTsKK30KKworc3RydWN0IHNlcmlhbF9kZXZpY2Ugc2VyaWFsX3NjY19kZXZpY2UgPQoreworCSJzZXJpYWxfc2NjIiwKKwkiU0NDIiwKKwlzY2NfaW5pdCwKKwlzY2Nfc2V0YnJnLAorCXNjY19nZXRjLAorCXNjY190c3RjLAorCXNjY19wdXRjLAorCXNjY19wdXRzLAorfTsKKworI2VuZGlmCS8qIENPTkZJR184eHhfQ09OU19TQ0N4ICovCisKKyNpZmRlZiBDT05GSUdfTU9ERU1fU1VQUE9SVAordm9pZCBkaXNhYmxlX3B1dGModm9pZCkKK3sKKwlnZC0+YmVfcXVpZXQgPSAxOworfQorCit2b2lkIGVuYWJsZV9wdXRjKHZvaWQpCit7CisJZ2QtPmJlX3F1aWV0ID0gMDsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisKK3ZvaWQKK2tnZGJfc2VyaWFsX2luaXQodm9pZCkKK3sKKwlpbnQgaSA9IC0xOworCisJaWYgKHN0cmNtcChkZWZhdWx0X3NlcmlhbF9jb25zb2xlKCktPmN0bHIsICJTTUMiKSA9PSAwKQorCXsKKyNpZiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TTUMxKQorCQlpID0gMTsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NNQzIpCisJCWkgPSAyOworI2VuZGlmCisJfQorCWVsc2UgaWYgKHN0cmNtcChkZWZhdWx0X3NlcmlhbF9jb25zb2xlKCktPmN0bHIsICJTTUMiKSA9PSAwKQorCXsKKyNpZiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TQ0MxKQorCQlpID0gMTsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzh4eF9DT05TX1NDQzIpCisJCWkgPSAyOworI2VsaWYgZGVmaW5lZChDT05GSUdfOHh4X0NPTlNfU0NDMykKKwkJaSA9IDM7CisjZWxpZiBkZWZpbmVkKENPTkZJR184eHhfQ09OU19TQ0M0KQorCQlpID0gNDsKKyNlbmRpZgorCX0KKworCWlmIChpID49IDApCisJeworCQlzZXJpYWxfcHJpbnRmKCJbb24gJXMlZF0gIiwgZGVmYXVsdF9zZXJpYWxfY29uc29sZSgpLT5jdGxyLCBpKTsKKwl9Cit9CisKK3ZvaWQKK3B1dERlYnVnQ2hhciAoaW50IGMpCit7CisJc2VyaWFsX3B1dGMgKGMpOworfQorCit2b2lkCitwdXREZWJ1Z1N0ciAoY29uc3QgY2hhciAqc3RyKQoreworCXNlcmlhbF9wdXRzIChzdHIpOworfQorCitpbnQKK2dldERlYnVnQ2hhciAodm9pZCkKK3sKKwlyZXR1cm4gc2VyaWFsX2dldGMoKTsKK30KKwordm9pZAora2dkYl9pbnRlcnJ1cHRpYmxlIChpbnQgeWVzKQoreworCXJldHVybjsKK30KKyNlbmRpZgorCisjZW5kaWYJLyogQ09ORklHXzh4eF9DT05TX05PTkUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L3NwZWVkLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9zcGVlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDlmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9zcGVlZC5jCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDQKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzh4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfOHh4X0NQVUNMS19ERUZBVUxUKSB8fCBkZWZpbmVkKENPTkZJR19TWVNfTUVBU1VSRV9DUFVDTEspIHx8IGRlZmluZWQoREVCVUcpCisKKyNkZWZpbmUgUElUQ19TSElGVCAxNgorI2RlZmluZSBQSVRSX1NISUZUIDE2CisvKiBwaXRjIHZhbHVlcyB0byB0aW1lIGZvciA1OC84MTkyIHNlY29uZHMgKGFib3V0IDcwLjggbWlsbGlzZWNvbmRzKSAqLworI2RlZmluZSBTUEVFRF9QSVRfQ09VTlRTIDU4CisjZGVmaW5lIFNQRUVEX1BJVEMJICgoU1BFRURfUElUX0NPVU5UUyAtIDEpIDw8IFBJVENfU0hJRlQpCisjZGVmaW5lIFNQRUVEX1BJVENfSU5JVAkgKChTUEVFRF9QSVRfQ09VTlRTICsgMSkgPDwgUElUQ19TSElGVCkKKworLyogQWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIE1hY2hpbmUgU3RhdGUgUmVnaXN0ZXIgKi8KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgZ2V0X21zcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbXNyOworCisJYXNtIHZvbGF0aWxlKCJtZm1zciAlMCIgOiAiPXIiIChtc3IpIDopOworCXJldHVybiBtc3I7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X21zcih1bnNpZ25lZCBsb25nIG1zcikKK3sKKwlhc20gdm9sYXRpbGUoIm10bXNyICUwIiA6IDogInIiIChtc3IpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogTWVhc3VyZSBDUFUgY2xvY2sgc3BlZWQgKGNvcmUgY2xvY2sgR0NMSzEsIEdDTEsyKSwKKyAqIGFsc28gZGV0ZXJtaW5lIGJ1cyBjbG9jayBzcGVlZCAoY2hlY2tpbmcgYnVzIGRpdmlkZXIgZmFjdG9yKQorICoKKyAqIChBcHByb3guIEdDTEsgZnJlcXVlbmN5IGluIEh6KQorICoKKyAqIEluaXRpYWxpemVzIHRpbWVyIDIgYW5kIFBJVCwgYnV0IGRpc2FibGVzIHRoZW0gYmVmb3JlIHJldHVybi4KKyAqIFtVc2UgdGltZXIgMiwgYmVjYXVzZSBNUEM4MjMgQ1BVcyBtYXNrIDAueCBkbyBub3QgaGF2ZSB0aW1lcnMgMyBhbmQgNF0KKyAqCisgKiBXaGVuIG1lYXN1cmluZyB0aGUgQ1BVIGNsb2NrIGFnYWluc3QgdGhlIFBJVCwgd2UgY291bnQgY3B1IGNsb2NrcworICogZm9yIDU4LzgxOTIgc2Vjb25kcyB3aXRoIGEgcHJlc2NhbGUgZGl2aWRlIGJ5IDE3NyBmb3IgdGhlIGNwdSBjbG9jay4KKyAqIFRoZXNlIHN0cmFuZ2UgdmFsdWVzIGZvciB0aGUgdGltaW5nIGludGVydmFsIGFuZCBwcmVzY2FsaW5nIGFyZSB1c2VkCisgKiBiZWNhdXNlIHRoZSBmb3JtdWxhIGZvciB0aGUgQ1BVIGNsb2NrIGlzOgorICoKKyAqICAgIENQVSBjbG9jayA9IGNvdW50ICogKDE3NyAqICg4MTkyIC8gNTgpKQorICoKKyAqCQk9IGNvdW50ICogMjQ5OTkuNzI0MQorICoKKyAqICAgIHdoaWNoIGlzIHZlcnkgY2xvc2UgdG8KKyAqCisgKgkJPSBjb3VudCAqIDI1MDAwCisgKgorICogU2luY2UgdGhlIGNvdW50IGdpdmVzIHRoZSBDUFUgY2xvY2sgZGl2aWRlZCBieSAyNTAwMCwgd2UgY2FuIGdldAorICogdGhlIENQVSBjbG9jayByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IDAuMSBNSHogYnkKKyAqCisgKiAgICBDUFUgY2xvY2sgPSAoKGNvdW50ICsgMikgLyA0KSAqIDEwMDAwMDsKKyAqCisgKiBUaGUgcm91bmRpbmcgaXMgaW1wb3J0YW50IHNpbmNlIHRoZSBtZWFzdXJlbWVudCBpcyBzb21ldGltZXMgZ29pbmcKKyAqIHRvIGJlIGhpZ2ggb3IgbG93IGJ5IDAuMDI1IE1IeiwgZGVwZW5kaW5nIG9uIGV4YWN0bHkgaG93IHRoZSBjbG9ja3MKKyAqIGFuZCBjb3VudGVycyBpbnRlcmFjdC4gQnkgcm91bmRpbmcgd2UgZ2V0IHRoZSBleGFjdCBhbnN3ZXIgZm9yIGFueQorICogQ1BVIGNsb2NrIHRoYXQgaXMgYW4gZXZlbiBtdWx0aXBsZSBvZiAwLjEgTUh6LgorICovCisKK3Vuc2lnbmVkIGxvbmcgbWVhc3VyZV9nY2xrKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBjcG10aW1lcjh4eF90ICp0aW1lcnAgPSAmaW1tci0+aW1fY3BtdGltZXI7CisJdWxvbmcgdGltZXIyX3ZhbDsKKwl1bG9uZyBtc3JfdmFsOworCisjaWZkZWYgQ09ORklHX1NZU184WFhfWElOCisJLyogZG9udCB1c2UgT1NDTSwgb25seSB1c2UgRVhUQ0xLLzUxMiAqLworCWltbXItPmltX2Nsa3JzdC5jYXJfc2NjciB8PSBTQ0NSX1JUU0VMIHwgU0NDUl9SVERJVjsKKyNlbHNlCisJaW1tci0+aW1fY2xrcnN0LmNhcl9zY2NyICY9IH4oU0NDUl9SVFNFTCB8IFNDQ1JfUlRESVYpOworI2VuZGlmCisKKwkvKiBSZXNldCArIFN0b3AgVGltZXIgMiwgbm8gY2FzY2FkaW5nCisJICovCisJdGltZXJwLT5jcG10X3RnY3IgJj0gfihUR0NSX0NBUzIgfCBUR0NSX1JTVDIpOworCisJLyogS2VlcCBzdG9wcGVkLCBoYWx0IGluIGRlYnVnIG1vZGUKKwkgKi8KKwl0aW1lcnAtPmNwbXRfdGdjciB8PSAoVEdDUl9GUloyIHwgVEdDUl9TVFAyKTsKKworCS8qIFRpbWVyIDIgc2V0dXA6CisJICogT3V0cHV0IHJlZi4gaW50ZXJydXB0IGRpc2FibGUsIGludC4gY2xvY2sKKwkgKiBQcmVzY2FsZSBieSAxNzcuIE5vdGUgdGhhdCBwcmVzY2FsZXIgZGl2aWRlcyBieSB2YWx1ZSArIDEKKwkgKiBzbyB3ZSBtdXN0IHN1YnRyYWN0IDEgaGVyZS4KKwkgKi8KKwl0aW1lcnAtPmNwbXRfdG1yMiA9ICgoMTc3IC0gMSkgPDwgVE1SX1BTX1NISUZUKSB8IFRNUl9JQ0xLX0lOX0dFTjsKKworCXRpbWVycC0+Y3BtdF90Y24yID0gMDsJCS8qIHJlc2V0IHN0YXRlCQkqLworCXRpbWVycC0+Y3BtdF90Z2NyIHw9IFRHQ1JfUlNUMjsJLyogZW5hYmxlIHRpbWVyIDIJKi8KKworCS8qCisJICogUElUIHNldHVwOgorCSAqCisJICogV2Ugd2FudCB0byB0aW1lIGZvciBTUEVFRF9QSVRDX0NPVU5UUyBjb3VudHMgKG9mIDgxOTIgSHopLAorCSAqIHNvIHRoZSBjb3VudCB2YWx1ZSB3b3VsZCBiZSBTUEVFRF9QSVRDX0NPVU5UUyAtIDEuCisJICogQnV0IHRoZXJlIHdvdWxkIGJlIGFuIHVuY2VydGFpbnR5IGluIHRoZSBzdGFydCB0aW1lIG9mIDEvNAorCSAqIGNvdW50IHNpbmNlIHdoZW4gd2UgZW5hYmxlIHRoZSBQSVQgdGhlIGNvdW50IGlzIG5vdAorCSAqIHN5bmNocm9uaXplZCB0byB0aGUgMzI3NjggSHogb3NjaWxsYXRvci4gVGhlIHRyaWNrIGhlcmUgaXMKKwkgKiB0byBzdGFydCB0aGUgY291bnQgaGlnaGVyIGFuZCB3YWl0IHVudGlsIHRoZSBQSVQgY291bnQKKwkgKiBjaGFuZ2VzIHRvIHRoZSByZXF1aXJlZCB2YWx1ZSBiZWZvcmUgc3RhcnRpbmcgdGltZXIgMi4KKwkgKgorCSAqIE9uZSBjb3VudCBoaWdoIHNob3VsZCBiZSBlbm91Z2gsIGJ1dCBvY2Nhc2lvbmFsbHkgdGhlIHN0YXJ0CisJICogaXMgb2ZmIGJ5IDEgb3IgMiBjb3VudHMgb2YgMzI3NjggSHouIFdpdGggdGhlIHN0YXJ0IHZhbHVlCisJICogc2V0IHR3byBjb3VudHMgaGlnaCBpdCBzZWVtcyB2ZXJ5IHJlbGlhYmxlLgorCSAqLworCisJaW1tci0+aW1fc2l0ay5zaXRrX3BpdGNrID0gS0FQV1JfS0VZOwkvKiBQSVQgaW5pdGlhbGl6YXRpb24gKi8KKwlpbW1yLT5pbV9zaXQuc2l0X3BpdGMgPSBTUEVFRF9QSVRDX0lOSVQ7CisKKwlpbW1yLT5pbV9zaXRrLnNpdGtfcGlzY3JrID0gS0FQV1JfS0VZOworCWltbXItPmltX3NpdC5zaXRfcGlzY3IgPSBDT05GSUdfU1lTX1BJU0NSOworCisJLyoKKwkgKiBTdGFydCBtZWFzdXJlbWVudCAtIGRpc2FibGUgaW50ZXJydXB0cywganVzdCBpbiBjYXNlCisJICovCisJbXNyX3ZhbCA9IGdldF9tc3IgKCk7CisJc2V0X21zciAobXNyX3ZhbCAmIH5NU1JfRUUpOworCisJaW1tci0+aW1fc2l0LnNpdF9waXNjciB8PSBQSVNDUl9QVEU7CisKKwkvKiBzcGluIHVudGlsIGdldCBleGFjdCBjb3VudCB3aGVuIHdlIHdhbnQgdG8gc3RhcnQgKi8KKwl3aGlsZSAoaW1tci0+aW1fc2l0LnNpdF9waXRyID4gU1BFRURfUElUQyk7CisKKwl0aW1lcnAtPmNwbXRfdGdjciAmPSB+VEdDUl9TVFAyOwkvKiBTdGFydCBUaW1lciAyCSovCisJd2hpbGUgKChpbW1yLT5pbV9zaXQuc2l0X3Bpc2NyICYgUElTQ1JfUFMpID09IDApOworCXRpbWVycC0+Y3BtdF90Z2NyIHw9IFRHQ1JfU1RQMjsJCS8qIFN0b3AgIFRpbWVyIDIJKi8KKworCS8qIHJlLWVuYWJsZSBleHRlcm5hbCBpbnRlcnJ1cHRzIGlmIHRoZXkgd2VyZSBvbiAqLworCXNldF9tc3IgKG1zcl92YWwpOworCisJLyogRGlzYWJsZSB0aW1lciBhbmQgUElUCisJICovCisJdGltZXIyX3ZhbCA9IHRpbWVycC0+Y3BtdF90Y24yOwkJLyogc2F2ZSBiZWZvcmUgcmVzZXQgdGltZXIgKi8KKworCXRpbWVycC0+Y3BtdF90Z2NyICY9IH4oVEdDUl9SU1QyIHwgVEdDUl9GUloyIHwgVEdDUl9TVFAyKTsKKwlpbW1yLT5pbV9zaXQuc2l0X3Bpc2NyICY9IH5QSVNDUl9QVEU7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfOFhYX1hJTikKKwkvKiBub3QgdXNpbmcgT1NDTSwgdXNpbmcgWElOLCBzbyBzY2FsZSBhcHByb3ByaWF0ZWx5ICovCisJcmV0dXJuICgoKHRpbWVyMl92YWwgKyAyKSAvIDQpICogKENPTkZJR19TWVNfOFhYX1hJTi81MTIpKS84MTkyICogMTAwMDAwTDsKKyNlbHNlCisJcmV0dXJuICgodGltZXIyX3ZhbCArIDIpIC8gNCkgKiAxMDAwMDBMOwkvKiBjb252ZXJ0IHRvIEh6CSovCisjZW5kaWYKK30KKworI2VuZGlmCisKK3ZvaWQgZ2V0X2JyZ2Nsayh1aW50IHNjY3IpCit7CisJdWludCBkaXZpZGVyID0gMDsKKworCXN3aXRjaCgoc2NjciZTQ0NSX0RGQlJHMTEpPj4xMSl7CisJCWNhc2UgMDoKKwkJCWRpdmlkZXIgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWRpdmlkZXIgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWRpdmlkZXIgPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlkaXZpZGVyID0gNjQ7CisJCQlicmVhazsKKwl9CisJZ2QtPmJyZ19jbGsgPSBnZC0+Y3B1X2Nsay9kaXZpZGVyOworfQorCisjaWYgIWRlZmluZWQoQ09ORklHXzh4eF9DUFVDTEtfREVGQVVMVCkKKworLyoKKyAqIGdldF9jbG9ja3MoKSBmaWxscyBpbiBnZC0+Y3B1X2Nsb2NrIGRlcGVuZGluZyBvbiBDT05GSUdfOHh4X0dDTEtfRlJFUQorICogb3IgKGlmIGl0IGlzIG5vdCBkZWZpbmVkKSBtZWFzdXJlX2djbGsoKSAod2hpY2ggdXNlcyB0aGUgcmVmIGNsb2NrKQorICogZnJvbSBhYm92ZS4KKyAqLworaW50IGdldF9jbG9ja3MgKHZvaWQpCit7CisJdWludCBpbW1yID0gZ2V0X2ltbXIgKDApOwkvKiBSZXR1cm4gZnVsbCBJTU1SIGNvbnRlbnRzICovCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSAoaW1tciAmIDB4RkZGRjAwMDApOworCXVpbnQgc2NjciA9IGltbWFwLT5pbV9jbGtyc3QuY2FyX3NjY3I7CisJLyoKKwkgKiBJZiBmb3Igc29tZSByZWFzb24gbWVhc3VyaW5nIHRoZSBnY2xrIGZyZXF1ZW5jeSB3b24ndAorCSAqIHdvcmssIHdlIHJldHVybiB0aGUgaGFyZHdpcmVkIHZhbHVlLgorCSAqIChGb3IgZXhhbXBsZSwgdGhlIGNvZ2VudCBDTUEyODYtNjAgQ1BVIG1vZHVsZSBoYXMgbm8KKwkgKiBzZXBhcmF0ZSBvc2NpbGxhdG9yIGZvciBQSVRSVENMSykKKwkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR184eHhfR0NMS19GUkVRKQorCWdkLT5jcHVfY2xrID0gQ09ORklHXzh4eF9HQ0xLX0ZSRVE7CisjZWxpZiBkZWZpbmVkKENPTkZJR184eHhfT1NDTEspCisjZGVmaW5lIFBMUFJDUl92YWwoYSkgKChwbGwgJiBQTFBSQ1JfICMjIGEgIyMgX01TSykgPj4gUExQUkNSXyAjIyBhICMjIF9TSElGVCkKKwl1aW50IHBsbCA9IGltbWFwLT5pbV9jbGtyc3QuY2FyX3BscHJjcjsKKwl1aW50IGNsazsKKworCWlmICgoaW1tciAmIDB4MEZGRikgPj0gTVBDOHh4X05FV19DTEspIHsgLyogTVBDODY2Lzg3eC84OHggc2VyaWVzICovCisJCWNsayA9ICgoQ09ORklHXzh4eF9PU0NMSyAvIChQTFBSQ1JfdmFsKFBERikrMSkpICoKKwkJICAgICAgIChQTFBSQ1JfdmFsKE1GSSkgKyBQTFBSQ1JfdmFsKE1GTikgLyAoUExQUkNSX3ZhbChNRkQpKzEpKSkgLworCQkJKDE8PFBMUFJDUl92YWwoUykpOworCX0gZWxzZSB7CisJCWNsayA9IENPTkZJR184eHhfT1NDTEsgKiAoUExQUkNSX3ZhbChNRikrMSk7CisJfQorCWlmIChwbGwgJiBQTFBSQ1JfQ1NSQykgewkvKiBMb3cgZnJlcXVlbmN5IGRpdmlzaW9uIGZhY3RvciBpcyB1c2VkICAqLworCQlnZC0+Y3B1X2NsayA9IGNsayAvICgyIDw8ICgoc2NjciA+PiA4KSAmIDcpKTsKKwl9IGVsc2UgewkJCS8qIEhpZ2ggZnJlcXVlbmN5IGRpdmlzaW9uIGZhY3RvciBpcyB1c2VkICovCisJCWdkLT5jcHVfY2xrID0gY2xrIC8gKDEgPDwgKChzY2NyID4+IDUpICYgNykpOworCX0KKyNlbHNlCisJZ2QtPmNwdV9jbGsgPSBtZWFzdXJlX2djbGsoKTsKKyNlbmRpZiAvKiBDT05GSUdfOHh4X0dDTEtfRlJFUSAqLworCisJaWYgKChzY2NyICYgU0NDUl9FQkRGMTEpID09IDApIHsKKwkJLyogTm8gQnVzIERpdmlkZXIgYWN0aXZlICovCisJCWdkLT5idXNfY2xrID0gZ2QtPmNwdV9jbGs7CisJfSBlbHNlIHsKKwkJLyogVGhlIE1QQzh4eCBoYXMgb25seSBvbmUgQkRGOiBoYWxmIGNsb2NrIHNwZWVkICovCisJCWdkLT5idXNfY2xrID0gZ2QtPmNwdV9jbGsgLyAyOworCX0KKworCWdldF9icmdjbGsoc2Njcik7CisKKwlyZXR1cm4gKDApOworfQorCisjZWxzZSAvKiBDT05GSUdfOHh4X0NQVUNMS19ERUZBVUxUIGRlZmluZWQsIHVzZSBkeW5hbWljIGNsb2NrIHNldHRpbmcgKi8KKworc3RhdGljIGxvbmcgaW5pdF9wbGxfODY2IChsb25nIGNsayk7CisKKy8qIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBQTEwgKGluaXRfcGxsXzg2NigpIGlzIGNhbGxlZCkgYW5kCisgKiBmaWxscyBnZC0+Y3B1X2NsayBhbmQgZ2QtPmJ1c19jbGsgYWNjb3JkaW5nIHRvIHRoZSBlbnZpcm9ubWVudAorICogdmFyaWFibGUgJ2NwdWNsaycgb3IgdG8gQ09ORklHXzh4eF9DUFVDTEtfREVGQVVMVCAoaWYgJ2NwdWNsaycKKyAqIGNvbnRhaW5zIGludmFsaWQgdmFsdWUpLgorICogVGhpcyBmdW5jdGlvbnMgcmVxdWlyZXMgYW4gTVBDODY2IG9yIG5ld2VyIHNlcmllcyBDUFUuCisgKi8KK2ludCBnZXRfY2xvY2tzXzg2NiAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCWNoYXIJCSAgdG1wWzY0XTsKKwlsb25nCQkgIGNwdWNsayA9IDA7CisJbG9uZwkJICBzY2NyX3JlZzsKKworCWlmIChnZXRlbnZfciAoImNwdWNsayIsIHRtcCwgc2l6ZW9mICh0bXApKSA+IDApCisJCWNwdWNsayA9IHNpbXBsZV9zdHJ0b3VsICh0bXAsIE5VTEwsIDEwKSAqIDEwMDAwMDA7CisKKwlpZiAoKENPTkZJR19TWVNfOHh4X0NQVUNMS19NSU4gPiBjcHVjbGspIHx8IChDT05GSUdfU1lTXzh4eF9DUFVDTEtfTUFYIDwgY3B1Y2xrKSkKKwkJY3B1Y2xrID0gQ09ORklHXzh4eF9DUFVDTEtfREVGQVVMVDsKKworCWdkLT5jcHVfY2xrID0gaW5pdF9wbGxfODY2IChjcHVjbGspOworI2lmIGRlZmluZWQoQ09ORklHX1NZU19NRUFTVVJFX0NQVUNMSykKKwlnZC0+Y3B1X2NsayA9IG1lYXN1cmVfZ2NsayAoKTsKKyNlbmRpZgorCisJZ2V0X2JyZ2NsayhpbW1yLT5pbV9jbGtyc3QuY2FyX3NjY3IpOworCisJLyogaWYgY3B1IGNsb2NrIDw9IDY2IE1IeiB0aGVuIHNldCBidXMgZGl2aXNpb24gZmFjdG9yIHRvIDEsCisJICogb3RoZXJ3aXNlIHNldCBpdCB0byAyCisJICovCisJc2Njcl9yZWcgPSBpbW1yLT5pbV9jbGtyc3QuY2FyX3NjY3I7CisJc2Njcl9yZWcgJj0gflNDQ1JfRUJERjExOworCisJaWYgKGdkLT5jcHVfY2xrIDw9IDY2MDAwMDAwKSB7CisJCXNjY3JfcmVnIHw9IFNDQ1JfRUJERjAwOwkvKiBidXMgZGl2aXNpb24gZmFjdG9yID0gMSAqLworCQlnZC0+YnVzX2NsayA9IGdkLT5jcHVfY2xrOworCX0gZWxzZSB7CisJCXNjY3JfcmVnIHw9IFNDQ1JfRUJERjAxOwkvKiBidXMgZGl2aXNpb24gZmFjdG9yID0gMiAqLworCQlnZC0+YnVzX2NsayA9IGdkLT5jcHVfY2xrIC8gMjsKKwl9CisJaW1tci0+aW1fY2xrcnN0LmNhcl9zY2NyID0gc2Njcl9yZWc7CisKKwlyZXR1cm4gKDApOworfQorCisvKiBBZGp1c3Qgc2RyYW0gcmVmcmVzaCByYXRlIHRvIGFjdHVhbCBDUFUgY2xvY2suCisgKi8KK2ludCBzZHJhbV9hZGp1c3RfODY2ICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJbG9uZwkJICBtYW1yOworCisJbWFtciA9IGltbXItPmltX21lbWN0bC5tZW1jX21hbXI7CisJbWFtciAmPSB+TUFNUl9QVEFfTVNLOworCW1hbXIgfD0gKChnZC0+Y3B1X2NsayAvIENPTkZJR19TWVNfUFRBX1BFUl9DTEspIDw8IE1BTVJfUFRBX1NISUZUKTsKKwlpbW1yLT5pbV9tZW1jdGwubWVtY19tYW1yID0gbWFtcjsKKworCXJldHVybiAoMCk7Cit9CisKKy8qIENvbmZpZ3VyZSBQTEwgZm9yIE1QQzg2Ni84NTkvODg1IENQVSBzZXJpZXMKKyAqIFBMTCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgaXMgc2V0IHRvIHRoZSB2YWx1ZSBuZWFyZXN0IHRvIHRoZSBkZXNpcmVkIGNsaywKKyAqIGFzc3VtaW5nIGEgb3NjY2xrIG9mIDEwIE1Iei4KKyAqLworc3RhdGljIGxvbmcgaW5pdF9wbGxfODY2IChsb25nIGNsaykKK3sKKwlleHRlcm4gdm9pZCBwbHByY3Jfd3JpdGVfODY2IChsb25nKTsKKworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJbG9uZwkJICBuLCBwbHByY3I7CisJY2hhcgkJICBtZmksIG1mbiwgbWZkLCBzLCBwZGY7CisJbG9uZwkJICBzdGVwX21maSwgc3RlcF9tZm47CisKKwlpZiAoY2xrIDwgMjAwMDAwMDApIHsKKwkJY2xrICo9IDI7CisJCXBkZiA9IDE7CisJfSBlbHNlIHsKKwkJcGRmID0gMDsKKwl9CisKKwlpZiAoY2xrIDwgNDAwMDAwMDApIHsKKwkJcyA9IDI7CisJCXN0ZXBfbWZpID0gQ09ORklHXzh4eF9PU0NMSyAvIDQ7CisJCW1mZCA9IDc7CisJCXN0ZXBfbWZuID0gQ09ORklHXzh4eF9PU0NMSyAvIDMwOworCX0gZWxzZSBpZiAoY2xrIDwgODAwMDAwMDApIHsKKwkJcyA9IDE7CisJCXN0ZXBfbWZpID0gQ09ORklHXzh4eF9PU0NMSyAvIDI7CisJCW1mZCA9IDE0OworCQlzdGVwX21mbiA9IENPTkZJR184eHhfT1NDTEsgLyAzMDsKKwl9IGVsc2UgeworCQlzID0gMDsKKwkJc3RlcF9tZmkgPSBDT05GSUdfOHh4X09TQ0xLOworCQltZmQgPSAyOTsKKwkJc3RlcF9tZm4gPSBDT05GSUdfOHh4X09TQ0xLIC8gMzA7CisJfQorCisJLyogQ2FsY3VsYXRlIGludGVnZXIgcGFydCBvZiBtdWx0aXBsaWNhdGlvbiBmYWN0b3IKKwkgKi8KKwluID0gY2xrIC8gc3RlcF9tZmk7CisJbWZpID0gKGNoYXIpbjsKKworCS8qIENhbGN1bGF0ZSBudW1lcmF0b3Igb2YgZnJhY3Rpb25hbCBwYXJ0IG9mIG11bHRpcGxpY2F0aW9uIGZhY3RvcgorCSAqLworCW4gPSBjbGsgLSAobiAqIHN0ZXBfbWZpKTsKKwltZm4gPSAoY2hhcikobiAvIHN0ZXBfbWZuKTsKKworCS8qIENhbGN1bGF0ZSBlZmZlY3RpdmUgY2xrCisJICovCisJbiA9ICgobWZpICogc3RlcF9tZmkpICsgKG1mbiAqIHN0ZXBfbWZuKSkgLyAocGRmICsgMSk7CisKKwlpbW1yLT5pbV9jbGtyc3RrLmNhcmtfcGxwcmNyayA9IEtBUFdSX0tFWTsKKworCXBscHJjciA9IChpbW1yLT5pbV9jbGtyc3QuY2FyX3BscHJjciAmIH4oUExQUkNSX01GTl9NU0sKKwkJCXwgUExQUkNSX01GRF9NU0sgfCBQTFBSQ1JfU19NU0sKKwkJCXwgUExQUkNSX01GSV9NU0sgfCBQTFBSQ1JfREJSTU8KKwkJCXwgUExQUkNSX1BERl9NU0spKQorCQkJfCAobWZuIDw8IFBMUFJDUl9NRk5fU0hJRlQpCisJCQl8IChtZmQgPDwgUExQUkNSX01GRF9TSElGVCkKKwkJCXwgKHMgPDwgUExQUkNSX1NfU0hJRlQpCisJCQl8IChtZmkgPDwgUExQUkNSX01GSV9TSElGVCkKKwkJCXwgKHBkZiA8PCBQTFBSQ1JfUERGX1NISUZUKTsKKworCWlmKCAobWZuID4gMCkgJiYgKChtZmQgLyBtZm4pID4gMTApICkKKwkJcGxwcmNyIHw9IFBMUFJDUl9EQlJNTzsKKworCXBscHJjcl93cml0ZV84NjYgKHBscHJjcik7CQkvKiBzZXQgdmFsdWUgdXNpbmcgU0lVNC85IHdvcmthcm91bmQgKi8KKwlpbW1yLT5pbV9jbGtyc3RrLmNhcmtfcGxwcmNyayA9IDB4MDAwMDAwMDA7CisKKwlyZXR1cm4gKG4pOworfQorCisjZW5kaWYgLyogQ09ORklHXzh4eF9DUFVDTEtfREVGQVVMVCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfVFFNOHh4TCkgJiYgIWRlZmluZWQoQ09ORklHX1RRTTg2Nk0pIFwKKyAgICAmJiAhZGVmaW5lZChDT05GSUdfVFFNODg1RCkKKy8qCisgKiBBZGp1c3Qgc2RyYW0gcmVmcmVzaCByYXRlIHRvIGFjdHVhbCBDUFUgY2xvY2sKKyAqIGFuZCBzZXQgdGltZWJhc2Ugc291cmNlIGFjY29yZGluZyB0byBhY3R1YWwgQ1BVIGNsb2NrCisgKi8KK2ludCBhZGp1c3Rfc2RyYW1fdGJzXzh4eCAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCWxvbmcJCSAgbWFtcjsKKwlsb25nICAgICAgICAgICAgICBzY2NyOworCisJbWFtciA9IGltbXItPmltX21lbWN0bC5tZW1jX21hbXI7CisJbWFtciAmPSB+TUFNUl9QVEFfTVNLOworCW1hbXIgfD0gKChnZC0+Y3B1X2NsayAvIENPTkZJR19TWVNfUFRBX1BFUl9DTEspIDw8IE1BTVJfUFRBX1NISUZUKTsKKwlpbW1yLT5pbV9tZW1jdGwubWVtY19tYW1yID0gbWFtcjsKKworCWlmIChnZC0+Y3B1X2NsayA8IDY3MDAwMDAwKSB7CisJCXNjY3IgPSBpbW1yLT5pbV9jbGtyc3QuY2FyX3NjY3I7CisJCXNjY3IgfD0gU0NDUl9UQlM7CisJCWltbXItPmltX2Nsa3JzdC5jYXJfc2NjciA9IHNjY3I7CisJfQorCisJcmV0dXJuICgwKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfVFFNOHh4TC9NLCAhVFFNODY2TSwgIVRRTTg4NUQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvc3BpLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmFjMjNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvc3BpLmMKQEAgLTAsMCArMSw1NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTmF2aW4gQm9wcHVyaSAvIFByYXNoYW50IFBhdGVsCisgKgk8bmJvcHB1cmlAdHJpbmV0Y29tbXVuaWNhdGlvbi5jb20+LAorICoJPHBtcGF0ZWxAdHJpbmV0Y29tbXVuaWNhdGlvbi5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgR2VyZCBNZW5uY2hlbiA8R2VyZC5NZW5uY2hlbkBpY24uc2llbWVucy5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8d2RAZGVueC5kZT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIE1QQzh4eCBDUE0gU1BJIGludGVyZmFjZS4KKyAqCisgKiBQYXJ0cyBvZiB0aGlzIGNvZGUgYXJlIHByb2JhYmx5IG5vdCBwb3J0YWJsZSBhbmQvb3Igc3BlY2lmaWMgdG8KKyAqIHRoZSBib2FyZCB3aGljaCBJIHVzZWQgZm9yIHRoZSB0ZXN0cy4gUGxlYXNlIHNlbmQgZml4ZXMvY29tcGxhaW50cworICogdG8gd2RAZGVueC5kZQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHBvc3QuaD4KKyNpbmNsdWRlIDxzZXJpYWwuaD4KKworI2lmIChkZWZpbmVkKENPTkZJR19TUEkpKSB8fCAoQ09ORklHX1BPU1QgJiBDT05GSUdfU1lTX1BPU1RfU1BJKQorCisvKiBXYXJuaW5nOgorICogWW91IGNhbm5vdCBlbmFibGUgREVCVUcgZm9yIGVhcmx5IHN5c3RlbSBpbml0YWxpemF0aW9uLCBpLiBlLiB3aGVuCisgKiB0aGlzIGRyaXZlciBpcyB1c2VkIHRvIHJlYWQgZW52aXJvbm1lbnQgcGFyYW1ldGVycyBsaWtlICJiYXVkcmF0ZSIKKyAqIGZyb20gRUVQUk9NIHdoaWNoIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbCBwb3J0IHdoaWNoIGlzCisgKiBuZWVkZWQgdG8gcHJpbnQgdGhlIGRlYnVnIG1lc3NhZ2VzLi4uCisgKi8KKyN1bmRlZglERUJVRworCisjZGVmaW5lIFNQSV9FRVBST01fV1JFTgkJMHgwNgorI2RlZmluZSBTUElfRUVQUk9NX1JEU1IJCTB4MDUKKyNkZWZpbmUgU1BJX0VFUFJPTV9SRUFECQkweDAzCisjZGVmaW5lIFNQSV9FRVBST01fV1JJVEUJMHgwMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9mZnNldCBmb3IgaW5pdGlhbCBTUEkgYnVmZmVycyBpbiBEUFJBTToKKyAqIFdlIG5lZWQgYSA1MjAgYnl0ZSBzY3JhdGNoIERQUkFNIGFyZWEgdG8gdXNlIGF0IGFuIGVhcmx5IHN0YWdlLgorICogSXQgaXMgdXNlZCBiZXR3ZWVuIHRoZSB0d28gaW5pdGlhbGl6YXRpb24gY2FsbHMgKHNwaV9pbml0X2YoKQorICogYW5kIHNwaV9pbml0X3IoKSkuCisgKiBUaGUgdmFsdWUgMHhiMDAgbWFrZXMgaXQgZmFyIGVub3VnaCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGF0YQorICogYXJlYSAoYXMgd2VsbCBhcyBmcm9tIHRoZSBzdGFjayBwb2ludGVyKS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmbmRlZglDT05GSUdfU1lTX1NQSV9JTklUX09GRlNFVAorI2RlZmluZQlDT05GSUdfU1lTX1NQSV9JTklUX09GRlNFVAkweEIwMAorI2VuZGlmCisKKyNpZmRlZglERUJVRworCisjZGVmaW5lCURQUklOVChhKQlwcmludGYgYTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIHBlZWsgaW50byB0eCBhbmQgcnggYnVmZmVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGV4X2RpZ2l0ID0gIjAxMjM0NTY3ODlBQkNERUYiOworCitzdGF0aWMgY2hhciBxdWlja2hleCAoaW50IGkpCit7CisJcmV0dXJuIGhleF9kaWdpdFtpXTsKK30KKworc3RhdGljIHZvaWQgbWVtZHVtcCAodm9pZCAqcHYsIGludCBudW0pCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqcGMgPSAodW5zaWduZWQgY2hhciAqKSBwdjsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJcHJpbnRmICgiJWMlYyAiLCBxdWlja2hleCAocGNbaV0gPj4gNCksIHF1aWNraGV4IChwY1tpXSAmIDB4MGYpKTsKKwlwcmludGYgKCJcdCIpOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJcHJpbnRmICgiJWMiLCBpc3ByaW50IChwY1tpXSkgPyBwY1tpXSA6ICcuJyk7CisJcHJpbnRmICgiXG4iKTsKK30KKyNlbHNlCS8qICFERUJVRyAqLworCisjZGVmaW5lCURQUklOVChhKQorCisjZW5kaWYJLyogREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb24gcHJvdG90eXBlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZCBzcGlfaW5pdCAodm9pZCk7CisKK3NzaXplX3Qgc3BpX3JlYWQgKHVjaGFyICosIGludCwgdWNoYXIgKiwgaW50KTsKK3NzaXplX3Qgc3BpX3dyaXRlICh1Y2hhciAqLCBpbnQsIHVjaGFyICosIGludCk7Citzc2l6ZV90IHNwaV94ZmVyIChzaXplX3QpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWYXJpYWJsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNQVhfQlVGRkVSCTB4MTA0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluaXRpYWxseSB3ZSBwbGFjZSB0aGUgUlggYW5kIFRYIGJ1ZmZlcnMgYXQgYSBmaXhlZCBsb2NhdGlvbiBpbiBEUFJBTSEKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB1Y2hhciAqcnhidWYgPQorICAodWNoYXIgKikmKChjcG04eHhfdCAqKSYoKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIpLT5pbV9jcG0pLT5jcF9kcG1lbQorCQkJW0NPTkZJR19TWVNfU1BJX0lOSVRfT0ZGU0VUXTsKK3N0YXRpYyB1Y2hhciAqdHhidWYgPQorICAodWNoYXIgKikmKChjcG04eHhfdCAqKSYoKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIpLT5pbV9jcG0pLT5jcF9kcG1lbQorCQkJW0NPTkZJR19TWVNfU1BJX0lOSVRfT0ZGU0VUK01BWF9CVUZGRVJdOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGdW5jdGlvbjogICAgc3BpX2luaXRfZgorICoKKyAqICBEZXNjcmlwdGlvbjogSW5pdCBTUEktQ29udHJvbGxlciAoUk9NIHBhcnQpCisgKgorICogIHJldHVybjogICAgICAtLS0KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZCBzcGlfaW5pdF9mICh2b2lkKQoreworCXVuc2lnbmVkIGludCBkcGFkZHI7CisKKwl2b2xhdGlsZSBzcGlfdCAqc3BpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbXI7CisJdm9sYXRpbGUgY3BpYzh4eF90ICpjcGk7CisJdm9sYXRpbGUgY3BtOHh4X3QgKmNwOworCXZvbGF0aWxlIGlvcDh4eF90ICppb3A7CisJdm9sYXRpbGUgY2JkX3QgKnRiZGYsICpyYmRmOworCisJaW1tciA9IChpbW1hcF90ICopICBDT05GSUdfU1lTX0lNTVI7CisJY3BpICA9IChjcGljOHh4X3QgKikmaW1tci0+aW1fY3BpYzsKKwlpb3AgID0gKGlvcDh4eF90ICopICZpbW1yLT5pbV9pb3BvcnQ7CisJY3AgICA9IChjcG04eHhfdCAqKSAmaW1tci0+aW1fY3BtOworCisjaWZkZWYgQ09ORklHX1NZU19TUElfVUNPREVfUEFUQ0gKKwlzcGkgID0gKHNwaV90ICopJmNwLT5jcF9kcG1lbVtzcGktPnNwaV9ycGJhc2VdOworI2Vsc2UKKwlzcGkgID0gKHNwaV90ICopJmNwLT5jcF9kcGFyYW1bUFJPRkZfU1BJXTsKKwkvKiBEaXNhYmxlIHJlbG9jYXRpb24gKi8KKwlzcGktPnNwaV9ycGJhc2UgPSAwOworI2VuZGlmCisKKy8qIDEgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBJbml0aWFsaXplIFBvcnQgQiBTUEkgcGlucyAtPiBwYWdlIDM0LTggTVBDODYwVU0KKwkgKiAod2UgYXJlIG9ubHkgaW4gTWFzdGVyIE1vZGUgISkKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogR1BJTyBvciBwZXIuIEZ1bmN0aW9uCisJICogUEJQQVJbMjhdID0gMSBbMHgwMDAwMDAwOF0gLT4gUEVSSTogKFNQSU1JU08pCisJICogUEJQQVJbMjldID0gMSBbMHgwMDAwMDAwNF0gLT4gUEVSSTogKFNQSU1PU0kpCisJICogUEJQQVJbMzBdID0gMSBbMHgwMDAwMDAwMl0gLT4gUEVSSTogKFNQSUNMSykKKwkgKiBQQlBBUlszMV0gPSAwIFsweDAwMDAwMDAxXSAtPiBHUElPOiAoQ1MgZm9yIFBDVUUvQ0NNLUVFUFJPTSkKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNwLT5jcF9wYnBhciB8PSAgMHgwMDAwMDAwRTsJLyogc2V0ICBiaXRzCSovCisJY3AtPmNwX3BicGFyICY9IH4weDAwMDAwMDAxOwkvKiByZXNldCBiaXQJKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBJbi9PdXQgb3IgcGVyLiBGdW5jdGlvbiAwLzEKKwkgKiBQQkRJUlsyOF0gPSAxIFsweDAwMDAwMDA4XSAtPiBQRVJJMTogU1BJTUlTTworCSAqIFBCRElSWzI5XSA9IDEgWzB4MDAwMDAwMDRdIC0+IFBFUkkxOiBTUElNT1NJCisJICogUEJESVJbMzBdID0gMSBbMHgwMDAwMDAwMl0gLT4gUEVSSTE6IFNQSUNMSworCSAqIFBCRElSWzMxXSA9IDEgWzB4MDAwMDAwMDFdIC0+IEdQSU8gT1VUOiBDUyBmb3IgUENVRS9DQ00tRUVQUk9NCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNwLT5jcF9wYmRpciB8PSAweDAwMDAwMDBGOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIG9wZW4gZHJhaW4gb3IgYWN0aXZlIG91dHB1dAorCSAqIFBCT0RSWzI4XSA9IDEgWzB4MDAwMDAwMDhdIC0+IG9wZW4gZHJhaW46IFNQSU1JU08KKwkgKiBQQk9EUlsyOV0gPSAwIFsweDAwMDAwMDA0XSAtPiBhY3RpdmUgb3V0cHV0IFNQSU1PU0kKKwkgKiBQQk9EUlszMF0gPSAwIFsweDAwMDAwMDAyXSAtPiBhY3RpdmUgb3V0cHV0OiBTUElDTEsKKwkgKiBQQk9EUlszMV0gPSAwIFsweDAwMDAwMDAxXSAtPiBhY3RpdmUgb3V0cHV0OiBHUElPIE9VVDogQ1MgZm9yIFBDVUUvQ0NNCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJY3AtPmNwX3Bib2RyIHw9ICAweDAwMDAwMDA4OworCWNwLT5jcF9wYm9kciAmPSB+MHgwMDAwMDAwNzsKKworCS8qIEluaXRpYWxpemUgdGhlIHBhcmFtZXRlciByYW0uCisJICogV2UgbmVlZCB0byBtYWtlIHN1cmUgbWFueSB0aGluZ3MgYXJlIGluaXRpYWxpemVkIHRvIHplcm8KKwkgKi8KKwlzcGktPnNwaV9yc3RhdGUJPSAwOworCXNwaS0+c3BpX3JkcAk9IDA7CisJc3BpLT5zcGlfcmJwdHIJPSAwOworCXNwaS0+c3BpX3JiYwk9IDA7CisJc3BpLT5zcGlfcnh0bXAJPSAwOworCXNwaS0+c3BpX3RzdGF0ZQk9IDA7CisJc3BpLT5zcGlfdGRwCT0gMDsKKwlzcGktPnNwaV90YnB0cgk9IDA7CisJc3BpLT5zcGlfdGJjCT0gMDsKKwlzcGktPnNwaV90eHRtcAk9IDA7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igb25lIHRyYW5zbWl0IGFuZCBvbmUgcmVjZWl2ZSBidWZmZXIKKwkgKiBkZXNjcmlwdG9yIGluIHRoZSBEUCByYW0KKwkgKi8KKyNpZmRlZiBDT05GSUdfU1lTX0FMTE9DX0RQUkFNCisJZHBhZGRyID0gZHByYW1fYWxsb2NfYWxpZ24gKHNpemVvZihjYmRfdCkqMiwgOCk7CisjZWxzZQorCWRwYWRkciA9IENQTV9TUElfQkFTRTsKKyNlbmRpZgorCisvKiAzICovCisJLyogU2V0IHVwIHRoZSBTUEkgcGFyYW1ldGVycyBpbiB0aGUgcGFyYW1ldGVyIHJhbSAqLworCXNwaS0+c3BpX3JiYXNlID0gZHBhZGRyOworCXNwaS0+c3BpX3RiYXNlID0gZHBhZGRyICsgc2l6ZW9mIChjYmRfdCk7CisKKwkvKioqKioqKioqKipJTVBPUlRBTlQqKioqKioqKioqKioqKioqKiovCisKKwkvKgorCSAqIFNldHRpbmcgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3IgcG9pbnRlcnMKKwkgKiBpbml0aWFsbHkgdG8gcmJhc2UgYW5kIHRiYXNlLiBPbmx5IHRoZSBtaWNyb2NvZGUgcGF0Y2hlcworCSAqIGRvY3VtZW50YXRpb24gdGFsa3MgYWJvdXQgaW5pdGlhbGl6aW5nIHRoaXMgcG9pbnRlci4gVGhpcworCSAqIGlzIG1pc3NpbmcgZnJvbSB0aGUgc2FtcGxlIEkyQyBkcml2ZXIuIElmIHlvdSBkb250CisJICogaW5pdGlhbGl6ZSB0aGVzZSBwb2ludGVycywgdGhlIGtlcm5lbCBoYW5ncy4KKwkgKi8KKwlzcGktPnNwaV9yYnB0ciA9IHNwaS0+c3BpX3JiYXNlOworCXNwaS0+c3BpX3RicHRyID0gc3BpLT5zcGlfdGJhc2U7CisKKy8qIDQgKi8KKyNpZmRlZiBDT05GSUdfU1lTX1NQSV9VQ09ERV9QQVRDSAorCS8qCisJICogIEluaXRpYWxpemUgcmVxdWlyZWQgcGFyYW1ldGVycyBpZiB1c2luZyBtaWNyb2NvZGUgcGF0Y2guCisJICovCisJc3BpLT5zcGlfcnN0YXRlID0gMDsKKwlzcGktPnNwaV90c3RhdGUgPSAwOworI2Vsc2UKKwkvKiBJbml0IFNQSSBUeCArIFJ4IFBhcmFtZXRlcnMgKi8KKwl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKQorCQk7CisJY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoQ1BNX0NSX0NIX1NQSSwgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykKKwkJOworI2VuZGlmCS8qIENPTkZJR19TWVNfU1BJX1VDT0RFX1BBVENIICovCisKKy8qIDUgKi8KKwkvKiBTZXQgU0RNQSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJaW1tci0+aW1fc2l1X2NvbmYuc2Nfc2RjciA9IDB4MDAwMTsKKworLyogNiAqLworCS8qIFNldCB0byBiaWcgZW5kaWFuLiAqLworCXNwaS0+c3BpX3RmY3IgPSBTTUNfRUI7CisJc3BpLT5zcGlfcmZjciA9IFNNQ19FQjsKKworLyogNyAqLworCS8qIFNldCBtYXhpbXVtIHJlY2VpdmUgc2l6ZS4gKi8KKwlzcGktPnNwaV9tcmJsciA9IE1BWF9CVUZGRVI7CisKKy8qIDggKyA5ICovCisJLyogdHggYW5kIHJ4IGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworCXRiZGYgPSAoY2JkX3QgKikgJiBjcC0+Y3BfZHBtZW1bc3BpLT5zcGlfdGJhc2VdOworCXJiZGYgPSAoY2JkX3QgKikgJiBjcC0+Y3BfZHBtZW1bc3BpLT5zcGlfcmJhc2VdOworCisJdGJkZi0+Y2JkX3NjICY9IH5CRF9TQ19SRUFEWTsKKwlyYmRmLT5jYmRfc2MgJj0gfkJEX1NDX0VNUFRZOworCisJLyogU2V0IHRoZSBiZCdzIHJ4IGFuZCB0eCBidWZmZXIgYWRkcmVzcyBwb2ludGVycyAqLworCXJiZGYtPmNiZF9idWZhZGRyID0gKHVsb25nKSByeGJ1ZjsKKwl0YmRmLT5jYmRfYnVmYWRkciA9ICh1bG9uZykgdHhidWY7CisKKy8qIDEwICsgMTEgKi8KKwljcC0+Y3Bfc3BpbSA9IDA7CQkJLyogTWFzayAgYWxsIFNQSSBldmVudHMgKi8KKwljcC0+Y3Bfc3BpZSA9IFNQSV9FTUFTSzsJCS8qIENsZWFyIGFsbCBTUEkgZXZlbnRzCSovCisKKwlyZXR1cm47Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uOiAgICBzcGlfaW5pdF9yCisgKgorICogIERlc2NyaXB0aW9uOiBJbml0IFNQSS1Db250cm9sbGVyIChSQU0gcGFydCkgLQorICoJCSBUaGUgbWFsbG9jIGVuZ2luZSBpcyByZWFkeSBhbmQgd2UgY2FuIG1vdmUgb3VyIGJ1ZmZlcnMgdG8KKyAqCQkgbm9ybWFsIFJBTQorICoKKyAqICByZXR1cm46ICAgICAgLS0tCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQgc3BpX2luaXRfciAodm9pZCkKK3sKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3A7CisJdm9sYXRpbGUgc3BpX3QgKnNwaTsKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yOworCXZvbGF0aWxlIGNiZF90ICp0YmRmLCAqcmJkZjsKKworCWltbXIgPSAoaW1tYXBfdCAqKSAgQ09ORklHX1NZU19JTU1SOworCWNwICAgPSAoY3BtOHh4X3QgKikgJmltbXItPmltX2NwbTsKKworI2lmZGVmIENPTkZJR19TWVNfU1BJX1VDT0RFX1BBVENICisJc3BpICA9IChzcGlfdCAqKSZjcC0+Y3BfZHBtZW1bc3BpLT5zcGlfcnBiYXNlXTsKKyNlbHNlCisJc3BpICA9IChzcGlfdCAqKSZjcC0+Y3BfZHBhcmFtW1BST0ZGX1NQSV07CisJLyogRGlzYWJsZSByZWxvY2F0aW9uICovCisJc3BpLT5zcGlfcnBiYXNlID0gMDsKKyNlbmRpZgorCisJLyogdHggYW5kIHJ4IGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworCXRiZGYgPSAoY2JkX3QgKikgJiBjcC0+Y3BfZHBtZW1bc3BpLT5zcGlfdGJhc2VdOworCXJiZGYgPSAoY2JkX3QgKikgJiBjcC0+Y3BfZHBtZW1bc3BpLT5zcGlfcmJhc2VdOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBSWCBhbmQgVFggYnVmZmVycyAqLworCXJ4YnVmID0gKHVjaGFyICopIG1hbGxvYyAoTUFYX0JVRkZFUik7CisJdHhidWYgPSAodWNoYXIgKikgbWFsbG9jIChNQVhfQlVGRkVSKTsKKworCXJiZGYtPmNiZF9idWZhZGRyID0gKHVsb25nKSByeGJ1ZjsKKwl0YmRmLT5jYmRfYnVmYWRkciA9ICh1bG9uZykgdHhidWY7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRnVuY3Rpb246ICAgIHNwaV93cml0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3NzaXplX3Qgc3BpX3dyaXRlICh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJaW50IGk7CisKKwltZW1zZXQocnhidWYsIDAsIE1BWF9CVUZGRVIpOworCW1lbXNldCh0eGJ1ZiwgMCwgTUFYX0JVRkZFUik7CisJKnR4YnVmID0gU1BJX0VFUFJPTV9XUkVOOwkJLyogd3JpdGUgZW5hYmxlCQkqLworCXNwaV94ZmVyKDEpOworCW1lbWNweSh0eGJ1ZiwgYWRkciwgYWxlbik7CisJKnR4YnVmID0gU1BJX0VFUFJPTV9XUklURTsJCS8qIFdSSVRFIG1lbW9yeSBhcnJheQkqLworCW1lbWNweShhbGVuICsgdHhidWYsIGJ1ZmZlciwgbGVuKTsKKwlzcGlfeGZlcihhbGVuICsgbGVuKTsKKwkJCQkJCS8qIGlnbm9yZSByZWNlaXZlZCBkYXRhCSovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQkqdHhidWYgPSBTUElfRUVQUk9NX1JEU1I7CS8qIHJlYWQgc3RhdHVzCQkqLworCQl0eGJ1ZlsxXSA9IDA7CisJCXNwaV94ZmVyKDIpOworCQlpZiAoIShyeGJ1ZlsxXSAmIDEpKSB7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoMTAwMCk7CisJfQorCWlmIChpID49IDEwMDApIHsKKwkJcHJpbnRmICgiKioqIHNwaV93cml0ZTogVGltZSBvdXQgd2hpbGUgd3JpdGluZyFcbiIpOworCX0KKworCXJldHVybiBsZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRnVuY3Rpb246ICAgIHNwaV9yZWFkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3NpemVfdCBzcGlfcmVhZCAodWNoYXIgKmFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCW1lbXNldChyeGJ1ZiwgMCwgTUFYX0JVRkZFUik7CisJbWVtc2V0KHR4YnVmLCAwLCBNQVhfQlVGRkVSKTsKKwltZW1jcHkodHhidWYsIGFkZHIsIGFsZW4pOworCSp0eGJ1ZiA9IFNQSV9FRVBST01fUkVBRDsJCS8qIFJFQUQgbWVtb3J5IGFycmF5CSovCisKKwkvKgorCSAqIFRoZXJlIGlzIGEgYnVnIGluIDg2MFQgKD8pIHRoYXQgY3V0cyB0aGUgbGFzdCBieXRlIG9mIGlucHV0CisJICogaWYgd2UncmUgcmVhZGluZyBpbnRvIERQUkFNLiBUaGUgc29sdXRpb24gd2UgY2hvb3NlIGhlcmUgaXMKKwkgKiB0byBhbHdheXMgcmVhZCBsZW4rMSBieXRlcyAod2UgaGF2ZSBvbmUgZXh0cmEgYnl0ZSBhdCB0aGUKKwkgKiBlbmQgb2YgdGhlIGJ1ZmZlcikuCisJICovCisJc3BpX3hmZXIoYWxlbiArIGxlbiArIDEpOworCW1lbWNweShidWZmZXIsIGFsZW4gKyByeGJ1ZiwgbGVuKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRnVuY3Rpb246ICAgIHNwaV94ZmVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3NpemVfdCBzcGlfeGZlciAoc2l6ZV90IGNvdW50KQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXI7CisJdm9sYXRpbGUgY3BtOHh4X3QgKmNwOworCXZvbGF0aWxlIHNwaV90ICpzcGk7CisJY2JkX3QgKnRiZGYsICpyYmRmOworCXVzaG9ydCBsb29wOworCWludCB0bTsKKworCURQUklOVCAoKCIqKiogc3BpX3hmZXIgZW50ZXJlZCAqKipcbiIpKTsKKworCWltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJY3AgICA9IChjcG04eHhfdCAqKSAmaW1tci0+aW1fY3BtOworCisjaWZkZWYgQ09ORklHX1NZU19TUElfVUNPREVfUEFUQ0gKKwlzcGkgID0gKHNwaV90ICopJmNwLT5jcF9kcG1lbVtzcGktPnNwaV9ycGJhc2VdOworI2Vsc2UKKwlzcGkgID0gKHNwaV90ICopJmNwLT5jcF9kcGFyYW1bUFJPRkZfU1BJXTsKKwkvKiBEaXNhYmxlIHJlbG9jYXRpb24gKi8KKwlzcGktPnNwaV9ycGJhc2UgPSAwOworI2VuZGlmCisKKwl0YmRmID0gKGNiZF90ICopICYgY3AtPmNwX2RwbWVtW3NwaS0+c3BpX3RiYXNlXTsKKwlyYmRmID0gKGNiZF90ICopICYgY3AtPmNwX2RwbWVtW3NwaS0+c3BpX3JiYXNlXTsKKworCS8qIFNldCBDUyBmb3IgZGV2aWNlICovCisJY3AtPmNwX3BiZGF0ICY9IH4weDAwMDE7CisKKwkvKiBTZXR0aW5nIHR4IGJkIHN0YXR1cyBhbmQgZGF0YSBsZW5ndGggKi8KKwl0YmRmLT5jYmRfc2MgID0gQkRfU0NfUkVBRFkgfCBCRF9TQ19MQVNUIHwgQkRfU0NfV1JBUDsKKwl0YmRmLT5jYmRfZGF0bGVuID0gY291bnQ7CisKKwlEUFJJTlQgKCgiKioqIHNwaV94ZmVyOiBCeXRlcyB0byBiZSB4ZmVycmVkOiAlZCAqKipcbiIsCisJCQkJCQkJdGJkZi0+Y2JkX2RhdGxlbikpOworCisJLyogU2V0dGluZyByeCBiZCBzdGF0dXMgYW5kIGRhdGEgbGVuZ3RoICovCisJcmJkZi0+Y2JkX3NjID0gQkRfU0NfRU1QVFkgfCBCRF9TQ19XUkFQOworCXJiZGYtPmNiZF9kYXRsZW4gPSAwOwkgLyogcnggbGVuZ3RoIGhhcyBubyBzaWduaWZpY2FuY2UgKi8KKworCWxvb3AgPSBjcC0+Y3Bfc3Btb2RlICYgU1BNT0RFX0xPT1A7CisJY3AtPmNwX3NwbW9kZSA9IC8qU1BNT0RFX0RJVjE2CXwqLwkvKiBCUkcvMTYgbW9kZSBub3QgdXNlZCBoZXJlICovCisJCQlsb29wCQl8CisJCQlTUE1PREVfUkVWCXwKKwkJCVNQTU9ERV9NU1RSCXwKKwkJCVNQTU9ERV9FTgl8CisJCQlTUE1PREVfTEVOKDgpCXwJLyogOCBCaXRzIHBlciBjaGFyICovCisJCQlTUE1PREVfUE0oMHg4KSA7CS8qIG1lZGl1bSBzcGVlZCAqLworCWNwLT5jcF9zcGltID0gMDsJCQkvKiBNYXNrICBhbGwgU1BJIGV2ZW50cyAqLworCWNwLT5jcF9zcGllID0gU1BJX0VNQVNLOwkJLyogQ2xlYXIgYWxsIFNQSSBldmVudHMJKi8KKworCS8qIHN0YXJ0IHNwaSB0cmFuc2ZlciAqLworCURQUklOVCAoKCIqKiogc3BpX3hmZXI6IFBlcmZvcm1pbmcgdHJhbnNmZXIgLi4uXG4iKSk7CisJY3AtPmNwX3NwY29tIHw9IFNQSV9TVFI7CQkvKiBTdGFydCB0cmFuc21pdCAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBXYWl0IGZvciBTUEkgdHJhbnNtaXQgdG8gZ2V0IG91dAorCSAqIG9yIHRpbWUgb3V0ICgxIHNlY29uZCA9IDEwMDAgbXMpCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlmb3IgKHRtPTA7IHRtPDEwMDA7ICsrdG0pIHsKKwkJaWYgKGNwLT5jcF9zcGllICYgU1BJX1RYQikgewkvKiBUeCBCdWZmZXIgRW1wdHkgKi8KKwkJCURQUklOVCAoKCIqKiogc3BpX3hmZXI6IFR4IGJ1ZmZlciBlbXB0eVxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCh0YmRmLT5jYmRfc2MgJiBCRF9TQ19SRUFEWSkgPT0gMCkgeworCQkJRFBSSU5UICgoIioqKiBzcGlfeGZlcjogVHggQkQgZG9uZVxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5ICgxMDAwKTsKKwl9CisJaWYgKHRtID49IDEwMDApIHsKKwkJcHJpbnRmICgiKioqIHNwaV94ZmVyOiBUaW1lIG91dCB3aGlsZSB4ZmVycmluZyB0by9mcm9tIFNQSSFcbiIpOworCX0KKwlEUFJJTlQgKCgiKioqIHNwaV94ZmVyOiAuLi4gdHJhbnNmZXIgZW5kZWRcbiIpKTsKKworI2lmZGVmCURFQlVHCisJcHJpbnRmICgiXG5zcGlfeGZlcjogdHhidWYgYWZ0ZXIgeGZlclxuIik7CisJbWVtZHVtcCAoKHZvaWQgKikgdHhidWYsIDE2KTsJLyogZHVtcCBvZiB0eGJ1ZiBiZWZvcmUgdHJhbnNtaXQgKi8KKwlwcmludGYgKCJzcGlfeGZlcjogcnhidWYgYWZ0ZXIgeGZlclxuIik7CisJbWVtZHVtcCAoKHZvaWQgKikgcnhidWYsIDE2KTsJLyogZHVtcCBvZiByeGJ1ZiBhZnRlciB0cmFuc21pdCAqLworCXByaW50ZiAoIlxuIik7CisjZW5kaWYKKworCS8qIENsZWFyIENTIGZvciBkZXZpY2UgKi8KKwljcC0+Y3BfcGJkYXQgfD0gMHgwMDAxOworCisJcmV0dXJuIGNvdW50OworfQorI2VuZGlmCS8qIENPTkZJR19TUEkgfHwgKENPTkZJR19QT1NUICYgQ09ORklHX1NZU19QT1NUX1NQSSkgKi8KKworLyoKKyAqIFNQSSB0ZXN0CisgKgorICogVGhlIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKSBpcyB0ZXN0ZWQgaW4gdGhlIGxvY2FsIGxvb3BiYWNrIG1vZGUuCisgKiBUaGUgaW50ZXJmYWNlIGlzIGNvbmZpZ3VyZWQgYWNjb3JkaW5nbHkgYW5kIHNldmVyYWwgcGFja2V0cworICogYXJlIHRyYW5zZmVyZWQuIFRoZSBjb25maWd1cmFibGUgdGVzdCBwYXJhbWV0ZXJzIGFyZToKKyAqICAgVEVTVF9NSU5fTEVOR1RIIC0gbWluaW11bSBzaXplIG9mIHBhY2tldCB0byB0cmFuc2ZlcgorICogICBURVNUX01BWF9MRU5HVEggLSBtYXhpbXVtIHNpemUgb2YgcGFja2V0IHRvIHRyYW5zZmVyCisgKiAgIFRFU1RfTlVNIC0gbnVtYmVyIG9mIHRlc3RzCisgKi8KKworI2lmIENPTkZJR19QT1NUICYgQ09ORklHX1NZU19QT1NUX1NQSQorCisjZGVmaW5lIFRFU1RfTUlOX0xFTkdUSAkJMQorI2RlZmluZSBURVNUX01BWF9MRU5HVEgJCU1BWF9CVUZGRVIKKyNkZWZpbmUgVEVTVF9OVU0JCTEKKworc3RhdGljIHZvaWQgcGFja2V0X2ZpbGwgKGNoYXIgKiBwYWNrZXQsIGludCBsZW5ndGgpCit7CisJY2hhciBjID0gKGNoYXIpIGxlbmd0aDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKwl7CisJICAgIHBhY2tldFtpXSA9IGMrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGFja2V0X2NoZWNrIChjaGFyICogcGFja2V0LCBpbnQgbGVuZ3RoKQoreworCWNoYXIgYyA9IChjaGFyKSBsZW5ndGg7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkgICAgaWYgKHBhY2tldFtpXSAhPSBjKyspIHJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNwaV9wb3N0X3Rlc3QgKGludCBmbGFncykKK3sKKwlpbnQgcmVzID0gLTE7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBjcG04eHhfdCAqY3AgPSAoY3BtOHh4X3QgKikgJiBpbW1yLT5pbV9jcG07CisJaW50IGk7CisJaW50IGw7CisKKwlzcGlfaW5pdF9mICgpOworCXNwaV9pbml0X3IgKCk7CisKKwljcC0+Y3Bfc3Btb2RlIHw9IFNQTU9ERV9MT09QOworCisJZm9yIChpID0gMDsgaSA8IFRFU1RfTlVNOyBpKyspIHsKKwkJZm9yIChsID0gVEVTVF9NSU5fTEVOR1RIOyBsIDw9IFRFU1RfTUFYX0xFTkdUSDsgbCArPSA4KSB7CisJCQlwYWNrZXRfZmlsbCAoKGNoYXIgKil0eGJ1ZiwgbCk7CisKKwkJCXNwaV94ZmVyIChsKTsKKworCQkJaWYgKHBhY2tldF9jaGVjayAoKGNoYXIgKilyeGJ1ZiwgbCkgPCAwKSB7CisJCQkJZ290byBEb25lOworCQkJfQorCQl9CisJfQorCisJcmVzID0gMDsKKworICAgICAgRG9uZToKKworCWNwLT5jcF9zcG1vZGUgJj0gflNQTU9ERV9MT09QOworCisJLyoKKwkgKiBTQ0MyIHBhcmFtZXRlciBSQU0gc3BhY2Ugb3ZlcmxhcHMKKwkgKiB0aGUgU1BJIHBhcmFtZXRlciBSQU0gc3BhY2UuIFNvIHdlIG5lZWQgdG8gcmVzdG9yZQorCSAqIHRoZSBTQ0MyIGNvbmZpZ3VyYXRpb24gaWYgaXQgaXMgdXNlZCBieSBVQVJULgorCSAqLworCisjaWYgIWRlZmluZWQoQ09ORklHXzh4eF9DT05TX05PTkUpCisJc2VyaWFsX3JlaW5pdF9hbGwgKCk7CisjZW5kaWYKKworCWlmIChyZXMgIT0gMCkgeworCQlwb3N0X2xvZyAoIlNQSSB0ZXN0IGZhaWxlZFxuIik7CisJfQorCisJcmV0dXJuIHJlczsKK30KKyNlbmRpZgkvKiBDT05GSUdfUE9TVCAmIENPTkZJR19TWVNfUE9TVF9TUEkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L3N0YXJ0LlMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjYwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC9zdGFydC5TCkBAIC0wLDAgKzEsNjg0IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5OAlEYW4gTWFsZWsgPGRtYWxla0BqbGMubmV0PgorICogIENvcHlyaWdodCAoQykgMTk5OQlNYWdudXMgRGFtbSA8a2llcmF5cGMwMS5wLnkua2llLmVyYS5lcmljc3Nvbi5zZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSwyMDAyIFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogIFUtQm9vdCAtIFN0YXJ0dXAgQ29kZSBmb3IgUG93ZXJQQyBiYXNlZCBFbWJlZGRlZCBCb2FyZHMKKyAqCisgKgorICogIFRoZSBwcm9jZXNzb3Igc3RhcnRzIGF0IDB4MDAwMDAxMDAgYW5kIHRoZSBjb2RlIGlzIGV4ZWN1dGVkCisgKiAgZnJvbSBmbGFzaC4gVGhlIGNvZGUgaXMgb3JnYW5pemVkIHRvIGJlIGF0IGFuIG90aGVyIGFkZHJlc3MKKyAqICBpbiBtZW1vcnksIGJ1dCBhcyBsb25nIHdlIGRvbid0IGp1bXAgYXJvdW5kIGJlZm9yZSByZWxvY2F0aW5nLAorICogIGJvYXJkX2luaXQgbGllcyBhdCBhIHF1aXRlIGhpZ2ggYWRkcmVzcyBhbmQgd2hlbiB0aGUgY3B1IGhhcworICogIGp1bXBlZCB0aGVyZSwgZXZlcnl0aGluZyBpcyBvay4KKyAqICBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGNwdSBnaXZlcyB0aGUgRkxBU0ggKENTMCkgdGhlIHdob2xlCisgKiAgYWRkcmVzcyBzcGFjZSBhdCBzdGFydHVwLCBhbmQgYm9hcmRfaW5pdCBsaWVzIGFzIGEgZWNobyBvZgorICogIHRoZSBmbGFzaCBzb21ld2hlcmUgdXAgdGhlcmUgaW4gdGhlIG1lbW9yeSBtYXAuCisgKgorICogIGJvYXJkX2luaXQgd2lsbCBjaGFuZ2UgQ1MwIHRvIGJlIHBvc2l0aW9uZWQgYXQgdGhlIGNvcnJlY3QKKyAqICBhZGRyZXNzIGFuZCAocylkcmFtIHdpbGwgYmUgcG9zaXRpb25lZCBhdCBhZGRyZXNzIDAKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzh4eC5oPgorI2luY2x1ZGUgPHRpbWVzdGFtcC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworI2RlZmluZSBDT05GSUdfOHh4IDEJCS8qIG5lZWRlZCBmb3IgTGludXgga2VybmVsIGhlYWRlciBmaWxlcyAqLworI2RlZmluZSBfTElOVVhfQ09ORklHX0ggMQkvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZQkqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZm5kZWYgIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUgIENPTkZJR19JREVOVF9TVFJJTkcgIiIKKyNlbmRpZgorCisvKiBXZSBkb24ndCB3YW50IHRoZSAgTU1VIHlldC4KKyovCisjdW5kZWYJTVNSX0tFUk5FTAorI2RlZmluZSBNU1JfS0VSTkVMICggTVNSX01FIHwgTVNSX1JJICkJLyogTWFjaGluZSBDaGVjayBhbmQgUmVjb3ZlcmFibGUgSW50ZXJyLiAqLworCisvKgorICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQorICoKKyAqIFVzZSByMTIgdG8gYWNjZXNzIHRoZSBHT1QKKyAqLworCVNUQVJUX0dPVAorCUdPVF9FTlRSWShfR09UMl9UQUJMRV8pCisJR09UX0VOVFJZKF9GSVhVUF9UQUJMRV8pCisKKwlHT1RfRU5UUlkoX3N0YXJ0KQorCUdPVF9FTlRSWShfc3RhcnRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkoX2VuZF9vZl92ZWN0b3JzKQorCUdPVF9FTlRSWSh0cmFuc2Zlcl90b19oYW5kbGVyKQorCisJR09UX0VOVFJZKF9faW5pdF9lbmQpCisJR09UX0VOVFJZKF9lbmQpCisJR09UX0VOVFJZKF9fYnNzX3N0YXJ0KQorCUVORF9HT1QKKworLyoKKyAqIHIzIC0gMXN0IGFyZyB0byBib2FyZF9pbml0KCk6IElNTVAgcG9pbnRlcgorICogcjQgLSAybmQgYXJnIHRvIGJvYXJkX2luaXQoKTogYm9vdCBmbGFnCisgKi8KKwkudGV4dAorCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQm9vdCBNYWdpYyBOdW1iZXIJCQkqLworCS5nbG9ibAl2ZXJzaW9uX3N0cmluZwordmVyc2lvbl9zdHJpbmc6CisJLmFzY2lpIFVfQk9PVF9WRVJTSU9OCisJLmFzY2lpICIgKCIsIFVfQk9PVF9EQVRFLCAiIC0gIiwgVV9CT09UX1RJTUUsICIpIgorCS5hc2NpaSBDT05GSUdfSURFTlRfU1RSSU5HLCAiXDAiCisKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKwkuZ2xvYmwJX3N0YXJ0Citfc3RhcnQ6CisJbGlzCXIzLCBDT05GSUdfU1lTX0lNTVJAaAkJLyogcG9zaXRpb24gSU1NUiAqLworCW10c3ByCTYzOCwgcjMKKwlsaQlyMjEsIEJPT1RGTEFHX0NPTEQJLyogTm9ybWFsIFBvd2VyLU9uOiBCb290IGZyb20gRkxBU0gJKi8KKwliCWJvb3RfY29sZAorCisJLiA9IEVYQ19PRkZfU1lTX1JFU0VUICsgMHgxMAorCisJLmdsb2JsCV9zdGFydF93YXJtCitfc3RhcnRfd2FybToKKwlsaQlyMjEsIEJPT1RGTEFHX1dBUk0JLyogU29mdHdhcmUgcmVib290CQkJKi8KKwliCWJvb3Rfd2FybQorCitib290X2NvbGQ6Citib290X3dhcm06CisKKwkvKiBJbml0aWFsaXplIG1hY2hpbmUgc3RhdHVzOyBlbmFibGUgbWFjaGluZSBjaGVjayBpbnRlcnJ1cHQJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsaQlyMywgTVNSX0tFUk5FTAkJLyogU2V0IE1FLCBSSSBmbGFncyAqLworCW10bXNyCXIzCisJbXRzcHIJU1JSMSwgcjMJCS8qIE1ha2UgU1JSMSBtYXRjaCBNU1IgKi8KKworCW1mc3ByCXIzLCBJQ1IJCQkvKiBjbGVhciBJbnRlcnJ1cHQgQ2F1c2UgUmVnaXN0ZXIgKi8KKworCS8qIEluaXRpYWxpemUgZGVidWcgcG9ydCByZWdpc3RlcnMJCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwl4b3IJcjAsIHIwLCByMAkJLyogQ2xlYXIgUjAgKi8KKwltdHNwcglMQ1RSTDEsIHIwCQkvKiBJbml0aWFsaXplIGRlYnVnIHBvcnQgcmVncyAqLworCW10c3ByCUxDVFJMMiwgcjAKKwltdHNwcglDT1VOVEEsIHIwCisJbXRzcHIJQ09VTlRCLCByMAorCisJLyogUmVzZXQgdGhlIGNhY2hlcwkJCQkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwltZnNwcglyMywgSUNfQ1NUCQkvKiBDbGVhciBlcnJvciBiaXRzICovCisJbWZzcHIJcjMsIERDX0NTVAorCisJbGlzCXIzLCBJRENfVU5BTExAaAkJLyogVW5sb2NrIGFsbCAqLworCW10c3ByCUlDX0NTVCwgcjMKKwltdHNwcglEQ19DU1QsIHIzCisKKwlsaXMJcjMsIElEQ19JTlZBTExAaAkvKiBJbnZhbGlkYXRlIGFsbCAqLworCW10c3ByCUlDX0NTVCwgcjMKKwltdHNwcglEQ19DU1QsIHIzCisKKwlsaXMJcjMsIElEQ19ESVNBQkxFQGgJLyogRGlzYWJsZSBkYXRhIGNhY2hlICovCisJbXRzcHIJRENfQ1NULCByMworCisjaWYgIWRlZmluZWQoQ09ORklHX1NZU19ERUxBWUVEX0lDQUNIRSkKKwkJCQkJLyogT24gSVA4NjAgYW5kIFBDVSBFLAorCQkJCQkgKiB3ZSBjYW5ub3QgZW5hYmxlIElDIHlldAorCQkJCQkgKi8KKwlsaXMJcjMsIElEQ19FTkFCTEVAaAkvKiBFbmFibGUgaW5zdHJ1Y3Rpb24gY2FjaGUgKi8KKyNlbmRpZgorCW10c3ByCUlDX0NTVCwgcjMKKworCS8qIGludmFsaWRhdGUgYWxsIHRsYidzCQkJCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCXRsYmlhCisJaXN5bmMKKworCS8qCisJICogQ2FsY3VsYXRlIGFic29sdXRlIGFkZHJlc3MgaW4gRkxBU0ggYW5kIGp1bXAgdGhlcmUKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGlzCXIzLCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWFkZGkJcjMsIHIzLCBpbl9mbGFzaCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbXRscglyMworCWJscgorCitpbl9mbGFzaDoKKworCS8qIGluaXRpYWxpemUgc29tZSBTUFJzIHRoYXQgYXJlIGhhcmQgdG8gYWNjZXNzIGZyb20gQwkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpcwlyMywgQ09ORklHX1NZU19JTU1SQGgJCS8qIHBhc3MgSU1NUiBhcyBhcmcxIHRvIEMgcm91dGluZSAqLworCW9yaQlyMSwgcjMsIENPTkZJR19TWVNfSU5JVF9TUF9PRkZTRVQgLyogc2V0IHVwIHRoZSBzdGFjayBpbiBpbnRlcm5hbCBEUFJBTSAqLworCS8qIE5vdGU6IFIwIGlzIHN0aWxsIDAgaGVyZSAqLworCXN0d3UJcjAsIC00KHIxKQkJLyogY2xlYXIgZmluYWwgc3RhY2sgZnJhbWUgc28gdGhhdAkqLworCXN0d3UJcjAsIC00KHIxKQkJLyogc3RhY2sgYmFja3RyYWNlcyB0ZXJtaW5hdGUgY2xlYW5seQkqLworCisJLyoKKwkgKiBEaXNhYmxlIHNlcmlhbGl6ZWQgaWZldGNoIGFuZCBzaG93IGN5Y2xlcworCSAqIChpLmUuIHNldCBwcm9jZXNzb3IgdG8gbm9ybWFsIG1vZGUpLgorCSAqIFRoaXMgaXMgYWxzbyBhIHNpbGljb24gYnVnIHdvcmthcm91bmQsIHNlZSBlcnJhdGEKKwkgKi8KKworCWxpCXIyLCAweDAwMDcKKwltdHNwcglJQ1RSTCwgcjIKKworCS8qIFNldCB1cCBkZWJ1ZyBtb2RlIGVudHJ5ICovCisKKwlsaXMJcjIsIENPTkZJR19TWVNfREVSQGgKKwlvcmkJcjIsIHIyLCBDT05GSUdfU1lTX0RFUkBsCisJbXRzcHIJREVSLCByMgorCisJLyogbGV0IHRoZSBDLWNvZGUgc2V0IHVwIHRoZSByZXN0CQkJCQkqLworCS8qCQkJCQkJCQkJKi8KKwkvKiBCZSBjYXJlZnVsIHRvIGtlZXAgY29kZSByZWxvY2F0YWJsZSAhCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCUdFVF9HT1QJCQkvKiBpbml0aWFsaXplIEdPVCBhY2Nlc3MJCQkqLworCisJLyogcjM6IElNTVIgKi8KKwlibAljcHVfaW5pdF9mCS8qIHJ1biBsb3ctbGV2ZWwgQ1BVIGluaXQgY29kZSAgICAgKGZyb20gRmxhc2gpCSovCisKKwltcglyMywgcjIxCisJLyogcjM6IEJPT1RGTEFHICovCisJYmwJYm9hcmRfaW5pdF9mCS8qIHJ1biAxc3QgcGFydCBvZiBib2FyZCBpbml0IGNvZGUgKGZyb20gRmxhc2gpICovCisKKworCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycworX3N0YXJ0X29mX3ZlY3RvcnM6CisKKy8qIE1hY2hpbmUgY2hlY2sgKi8KKwlTVERfRVhDRVBUSU9OKDB4MjAwLCBNYWNoaW5lQ2hlY2ssIE1hY2hpbmVDaGVja0V4Y2VwdGlvbikKKworLyogRGF0YSBTdG9yYWdlIGV4Y2VwdGlvbi4gICJOZXZlciIgZ2VuZXJhdGVkIG9uIHRoZSA4NjAuICovCisJU1REX0VYQ0VQVElPTigweDMwMCwgRGF0YVN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEluc3RydWN0aW9uIFN0b3JhZ2UgZXhjZXB0aW9uLiAgIk5ldmVyIiBnZW5lcmF0ZWQgb24gdGhlIDg2MC4gKi8KKwlTVERfRVhDRVBUSU9OKDB4NDAwLCBJbnN0U3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogRXh0ZXJuYWwgSW50ZXJydXB0IGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4NTAwLCBFeHRJbnRlcnJ1cHQsIGV4dGVybmFsX2ludGVycnVwdCkKKworLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KKwkuID0gMHg2MDAKK0FsaWdubWVudDoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJbWZzcHIJcjQsREFSCisJc3R3CXI0LF9EQVIocjIxKQorCW1mc3ByCXI1LERTSVNSCisJc3R3CXI1LF9EU0lTUihyMjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKEFsaWdubWVudCwgQWxpZ25tZW50RXhjZXB0aW9uLCBNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLworCS4gPSAweDcwMAorUHJvZ3JhbUNoZWNrOgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRVhDX1hGRVJfVEVNUExBVEUoUHJvZ3JhbUNoZWNrLCBQcm9ncmFtQ2hlY2tFeGNlcHRpb24sCisJCU1TUl9LRVJORUwsIENPUFlfRUUpCisKKwkvKiBObyBGUFUgb24gTVBDOHh4LiAgVGhpcyBleGNlcHRpb24gaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KKwkqLworCVNURF9FWENFUFRJT04oMHg4MDAsIEZQVW5hdmFpbGFibGUsIFVua25vd25FeGNlcHRpb24pCisKKwkvKiBJIGd1ZXNzIHdlIGNvdWxkIGltcGxlbWVudCBkZWNyZW1lbnRlciwgYW5kIG1heSBoYXZlCisJICogdG8gc29tZWRheSBmb3IgdGltZWtlZXBpbmcuCisJICovCisJU1REX0VYQ0VQVElPTigweDkwMCwgRGVjcmVtZW50ZXIsIHRpbWVyX2ludGVycnVwdCkKKwlTVERfRVhDRVBUSU9OKDB4YTAwLCBUcmFwXzBhLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhiMDAsIFRyYXBfMGIsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGMwMCwgU3lzdGVtQ2FsbCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4ZDAwLCBTaW5nbGVTdGVwLCBVbmtub3duRXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTigweGUwMCwgVHJhcF8wZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4ZjAwLCBUcmFwXzBmLCBVbmtub3duRXhjZXB0aW9uKQorCisJLyogT24gdGhlIE1QQzh4eCwgdGhpcyBpcyBhIHNvZnR3YXJlIGVtdWxhdGlvbiBpbnRlcnJ1cHQuICBJdCBvY2N1cnMKKwkgKiBmb3IgYWxsIHVuaW1wbGVtZW50ZWQgYW5kIGlsbGVnYWwgaW5zdHJ1Y3Rpb25zLgorCSAqLworCVNURF9FWENFUFRJT04oMHgxMDAwLCBTb2Z0RW11LCBTb2Z0RW11RXhjZXB0aW9uKQorCisJU1REX0VYQ0VQVElPTigweDExMDAsIEluc3RydWN0aW9uVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTIwMCwgRGF0YVRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDEzMDAsIEluc3RydWN0aW9uVExCRXJyb3IsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE0MDAsIERhdGFUTEJFcnJvciwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHgxNTAwLCBSZXNlcnZlZDUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE2MDAsIFJlc2VydmVkNiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTcwMCwgUmVzZXJ2ZWQ3LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxODAwLCBSZXNlcnZlZDgsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDE5MDAsIFJlc2VydmVkOSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWEwMCwgUmVzZXJ2ZWRBLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxYjAwLCBSZXNlcnZlZEIsIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKDB4MWMwMCwgRGF0YUJyZWFrcG9pbnQsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFkMDAsIEluc3RydWN0aW9uQnJlYWtwb2ludCwgRGVidWdFeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDFlMDAsIFBlcmlwaGVyYWxCcmVha3BvaW50LCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxZjAwLCBEZXZQb3J0QnJlYWtwb2ludCwgVW5rbm93bkV4Y2VwdGlvbikKKworCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisKKwkuID0gMHgyMDAwCisKKy8qCisgKiBUaGlzIGNvZGUgZmluaXNoZXMgc2F2aW5nIHRoZSByZWdpc3RlcnMgdG8gdGhlIGV4Y2VwdGlvbiBmcmFtZQorICogYW5kIGp1bXBzIHRvIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVyIGZvciB0aGUgZXhjZXB0aW9uLgorICogUmVnaXN0ZXIgcjIxIGlzIHBvaW50ZXIgaW50byB0cmFwIGZyYW1lLCByMSBoYXMgbmV3IHN0YWNrIHBvaW50ZXIuCisgKi8KKwkuZ2xvYmwJdHJhbnNmZXJfdG9faGFuZGxlcgordHJhbnNmZXJfdG9faGFuZGxlcjoKKwlzdHcJcjIyLF9OSVAocjIxKQorCWxpcwlyMjIsTVNSX1BPV0BoCisJYW5kYwlyMjMscjIzLHIyMgorCXN0dwlyMjMsX01TUihyMjEpCisJU0FWRV9HUFIoNywgcjIxKQorCVNBVkVfNEdQUlMoOCwgcjIxKQorCVNBVkVfOEdQUlMoMTIsIHIyMSkKKwlTQVZFXzhHUFJTKDI0LCByMjEpCisJbWZscglyMjMKKwlhbmRpLglyMjQscjIzLDB4M2YwMAkJLyogZ2V0IHZlY3RvciBvZmZzZXQgKi8KKwlzdHcJcjI0LFRSQVAocjIxKQorCWxpCXIyMiwwCisJc3R3CXIyMixSRVNVTFQocjIxKQorCW10c3ByCVNQUkcyLHIyMgkJLyogcjEgaXMgbm93IGtlcm5lbCBzcCAqLworCWx3eglyMjQsMChyMjMpCQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgaGFuZGxlciAqLworCWx3eglyMjMsNChyMjMpCQkvKiB3aGVyZSB0byBnbyB3aGVuIGRvbmUgKi8KKwltdHNwcglTUlIwLHIyNAorCW10c3ByCVNSUjEscjIwCisJbXRscglyMjMKKwlTWU5DCisJcmZpCQkJCS8qIGp1bXAgdG8gaGFuZGxlciwgZW5hYmxlIE1NVSAqLworCitpbnRfcmV0dXJuOgorCW1mbXNyCXIyOAkJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXI0LDAKKwlvcmkJcjQscjQsTVNSX0VFCisJYW5kYwlyMjgscjI4LHI0CisJU1lOQwkJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkJLyogUmVzdG9yZSBlbnZpcm9ubWVudCAqLworCWx3eglyMCxfTVNSKHIxKQorCW10c3ByCVNSUjAscjIKKwltdHNwcglTUlIxLHIwCisJbHd6CXIwLEdQUjAocjEpCisJbHd6CXIyLEdQUjIocjEpCisJbHd6CXIxLEdQUjEocjEpCisJU1lOQworCXJmaQorCisvKiBDYWNoZSBmdW5jdGlvbnMuCisqLworCS5nbG9ibAlpY2FjaGVfZW5hYmxlCitpY2FjaGVfZW5hYmxlOgorCVNZTkMKKwlsaXMJcjMsIElEQ19JTlZBTExAaAorCW10c3ByCUlDX0NTVCwgcjMKKwlsaXMJcjMsIElEQ19FTkFCTEVAaAorCW10c3ByCUlDX0NTVCwgcjMKKwlibHIKKworCS5nbG9ibAlpY2FjaGVfZGlzYWJsZQoraWNhY2hlX2Rpc2FibGU6CisJU1lOQworCWxpcwlyMywgSURDX0RJU0FCTEVAaAorCW10c3ByCUlDX0NTVCwgcjMKKwlibHIKKworCS5nbG9ibAlpY2FjaGVfc3RhdHVzCitpY2FjaGVfc3RhdHVzOgorCW1mc3ByCXIzLCBJQ19DU1QKKwlzcndpCXIzLCByMywgMzEJLyogPj4zMSA9PiBzZWxlY3QgYml0IDAgKi8KKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZW5hYmxlCitkY2FjaGVfZW5hYmxlOgorI2lmIDAKKwlTWU5DCisjZW5kaWYKKyNpZiAxCisJbGlzCXIzLCAweDA0MDAJCS8qIFNldCBjYWNoZSBtb2RlIHdpdGggTU1VIG9mZiAqLworCW10c3ByCU1EX0NUUiwgcjMKKyNlbmRpZgorCisJbGlzCXIzLCBJRENfSU5WQUxMQGgKKwltdHNwcglEQ19DU1QsIHIzCisjaWYgMAorCWxpcwlyMywgRENfU0ZXVEBoCisJbXRzcHIJRENfQ1NULCByMworI2VuZGlmCisJbGlzCXIzLCBJRENfRU5BQkxFQGgKKwltdHNwcglEQ19DU1QsIHIzCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX2Rpc2FibGUKK2RjYWNoZV9kaXNhYmxlOgorCVNZTkMKKwlsaXMJcjMsIElEQ19ESVNBQkxFQGgKKwltdHNwcglEQ19DU1QsIHIzCisJbGlzCXIzLCBJRENfSU5WQUxMQGgKKwltdHNwcglEQ19DU1QsIHIzCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX3N0YXR1cworZGNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgRENfQ1NUCisJc3J3aQlyMywgcjMsIDMxCS8qID4+MzEgPT4gc2VsZWN0IGJpdCAwICovCisJYmxyCisKKwkuZ2xvYmwJZGNfcmVhZAorZGNfcmVhZDoKKwltdHNwcglEQ19BRFIsIHIzCisJbWZzcHIJcjMsIERDX0RBVAorCWJscgorCisvKgorICogdW5zaWduZWQgaW50IGdldF9pbW1yICh1bnNpZ25lZCBpbnQgbWFzaykKKyAqCisgKiByZXR1cm4gKG1hc2sgPyAoSU1NUiAmIG1hc2spIDogSU1NUik7CisgKi8KKwkuZ2xvYmwJZ2V0X2ltbXIKK2dldF9pbW1yOgorCW1yCXI0LHIzCQkvKiBzYXZlIG1hc2sgKi8KKwltZnNwcglyMywgSU1NUgkvKiBJTU1SICovCisJY21wd2kJMCxyNCwwCQkvKiBtYXNrICE9IDAgPyAqLworCWJlcQk0ZgorCWFuZAlyMyxyMyxyNAkvKiBJTU1SICYgbWFzayAqLworNDoKKwlibHIKKworCS5nbG9ibCBnZXRfcHZyCitnZXRfcHZyOgorCW1mc3ByCXIzLCBQVlIKKwlibHIKKworCisJLmdsb2JsIHdyX2ljX2NzdAord3JfaWNfY3N0OgorCW10c3ByCUlDX0NTVCwgcjMKKwlibHIKKworCS5nbG9ibCByZF9pY19jc3QKK3JkX2ljX2NzdDoKKwltZnNwcglyMywgSUNfQ1NUCisJYmxyCisKKwkuZ2xvYmwgd3JfaWNfYWRyCit3cl9pY19hZHI6CisJbXRzcHIJSUNfQURSLCByMworCWJscgorCisKKwkuZ2xvYmwgd3JfZGNfY3N0Cit3cl9kY19jc3Q6CisJbXRzcHIJRENfQ1NULCByMworCWJscgorCisJLmdsb2JsIHJkX2RjX2NzdAorcmRfZGNfY3N0OgorCW1mc3ByCXIzLCBEQ19DU1QKKwlibHIKKworCS5nbG9ibCB3cl9kY19hZHIKK3dyX2RjX2FkcjoKKwltdHNwcglEQ19BRFIsIHIzCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIHZvaWQgcmVsb2NhdGVfY29kZSAoYWRkcl9zcCwgZ2QsIGFkZHJfbW9uaSkKKyAqCisgKiBUaGlzICJmdW5jdGlvbiIgZG9lcyBub3QgcmV0dXJuLCBpbnN0ZWFkIGl0IGNvbnRpbnVlcyBpbiBSQU0KKyAqIGFmdGVyIHJlbG9jYXRpbmcgdGhlIG1vbml0b3IgY29kZS4KKyAqCisgKiByMyA9IGRlc3QKKyAqIHI0ID0gc3JjCisgKiByNSA9IGxlbmd0aCBpbiBieXRlcworICogcjYgPSBjYWNoZWxpbmVzaXplCisgKi8KKwkuZ2xvYmwJcmVsb2NhdGVfY29kZQorcmVsb2NhdGVfY29kZToKKwltcglyMSwgIHIzCQkvKiBTZXQgbmV3IHN0YWNrIHBvaW50ZXIJCSovCisJbXIJcjksICByNAkJLyogU2F2ZSBjb3B5IG9mIEdsb2JhbCBEYXRhIHBvaW50ZXIJKi8KKwltcglyMTAsIHI1CQkvKiBTYXZlIGNvcHkgb2YgRGVzdGluYXRpb24gQWRkcmVzcwkqLworCisJR0VUX0dPVAorCW1yCXIzLCAgcjUJCQkJLyogRGVzdGluYXRpb24gQWRkcmVzcwkqLworCWxpcwlyNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAaAkJLyogU291cmNlICAgICAgQWRkcmVzcwkqLworCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGwKKwlsd3oJcjUsIEdPVChfX2luaXRfZW5kKQorCXN1YglyNSwgcjUsIHI0CisJbGkJcjYsIENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUJCS8qIENhY2hlIExpbmUgU2l6ZQkqLworCisJLyoKKwkgKiBGaXggR09UIHBvaW50ZXI6CisJICoKKwkgKiBOZXcgR09ULVBUUiA9IChvbGQgR09ULVBUUiAtIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFKSArIERlc3RpbmF0aW9uIEFkZHJlc3MKKwkgKgorCSAqIE9mZnNldDoKKwkgKi8KKwlzdWIJcjE1LCByMTAsIHI0CisKKwkvKiBGaXJzdCBvdXIgb3duIEdPVCAqLworCWFkZAlyMTIsIHIxMiwgcjE1CisJLyogdGhlbiB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLworCWFkZAlyMzAsIHIzMCwgcjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisKKwljbXBsdwljcjEscjMscjQKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJYmVxCWNyMSw0ZgkJLyogSW4gcGxhY2UgY29weSBpcyBub3QgbmVjZXNzYXJ5CSovCisJYmVxCTdmCQkvKiBQcm90ZWN0IGFnYWluc3QgMCBjb3VudAkJKi8KKwltdGN0cglyMAorCWJnZQljcjEsMmYKKworCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisJYgk0ZgorCisyOglzbHdpCXIwLHIwLDIKKwlhZGQJcjgscjQscjAKKwlhZGQJcjcscjMscjAKKzM6CWx3enUJcjAsLTQocjgpCisJc3R3dQlyMCwtNChyNykKKwliZG56CTNiCisKKy8qCisgKiBOb3cgZmx1c2ggdGhlIGNhY2hlOiBub3RlIHRoYXQgd2UgbXVzdCBzdGFydCBmcm9tIGEgY2FjaGUgYWxpZ25lZAorICogYWRkcmVzcy4gT3RoZXJ3aXNlIHdlIG1pZ2h0IG1pc3Mgb25lIGNhY2hlIGxpbmUuCisgKi8KKzQ6CWNtcHdpCXI2LDAKKwlhZGQJcjUscjMscjUKKwliZXEJN2YJCS8qIEFsd2F5cyBmbHVzaCBwcmVmZXRjaCBxdWV1ZSBpbiBhbnkgY2FzZSAqLworCXN1YmkJcjAscjYsMQorCWFuZGMJcjMscjMscjAKKwltcglyNCxyMworNToJZGNic3QJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTViCisJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBkY2JzdCB0byBjb21wbGV0ZSBvbiBidXMgKi8KKwltcglyNCxyMworNjoJaWNiaQkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNmIKKzc6CXN5bmMJCQkvKiBXYWl0IGZvciBhbGwgaWNiaSB0byBjb21wbGV0ZSBvbiBidXMJKi8KKwlpc3luYworCisvKgorICogV2UgYXJlIGRvbmUuIERvIG5vdCByZXR1cm4sIGluc3RlYWQgYnJhbmNoIHRvIHNlY29uZCBwYXJ0IG9mIGJvYXJkCisgKiBpbml0aWFsaXphdGlvbiwgbm93IHJ1bm5pbmcgZnJvbSBSQU0uCisgKi8KKworCWFkZGkJcjAsIHIxMCwgaW5fcmFtIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwltdGxyCXIwCisJYmxyCisKK2luX3JhbToKKworCS8qCisJICogUmVsb2NhdGlvbiBGdW5jdGlvbiwgcjEyIHBvaW50IHRvIGdvdDIrMHg4MDAwCisJICoKKwkgKiBBZGp1c3QgZ290MiBwb2ludGVycywgbm8gbmVlZCB0byBjaGVjayBmb3IgMCwgdGhpcyBjb2RlCisJICogYWxyZWFkeSBwdXRzIGEgZmV3IGVudHJpZXMgaW4gdGhlIHRhYmxlLgorCSAqLworCWxpCXIwLF9fZ290Ml9lbnRyaWVzQHNlY3RvZmZAbAorCWxhCXIzLEdPVChfR09UMl9UQUJMRV8pCisJbHd6CXIxMSxHT1QoX0dPVDJfVEFCTEVfKQorCW10Y3RyCXIwCisJc3ViCXIxMSxyMyxyMTEKKwlhZGRpCXIzLHIzLC00CisxOglsd3p1CXIwLDQocjMpCisJY21wd2kJcjAsMAorCWJlcS0JMmYKKwlhZGQJcjAscjAscjExCisJc3R3CXIwLDAocjMpCisyOgliZG56CTFiCisKKwkvKgorCSAqIE5vdyBhZGp1c3QgdGhlIGZpeHVwcyBhbmQgdGhlIHBvaW50ZXJzIHRvIHRoZSBmaXh1cHMKKwkgKiBpbiBjYXNlIHdlIG5lZWQgdG8gbW92ZSBvdXJzZWx2ZXMgYWdhaW4uCisJICovCisJbGkJcjAsX19maXh1cF9lbnRyaWVzQHNlY3RvZmZAbAorCWx3eglyMyxHT1QoX0ZJWFVQX1RBQkxFXykKKwljbXB3aQlyMCwwCisJbXRjdHIJcjAKKwlhZGRpCXIzLHIzLC00CisJYmVxCTRmCiszOglsd3p1CXI0LDQocjMpCisJbHd6dXgJcjAscjQscjExCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMTAsMChyMykKKwlzdHcJcjAsMChyNCkKKwliZG56CTNiCis0OgorY2xlYXJfYnNzOgorCS8qCisJICogTm93IGNsZWFyIEJTUyBzZWdtZW50CisJICovCisJbHd6CXIzLEdPVChfX2Jzc19zdGFydCkKKwlsd3oJcjQsR09UKF9lbmQpCisKKwljbXBsdwkwLCByMywgcjQKKwliZXEJNmYKKworCWxpCXIwLCAwCis1OgorCXN0dwlyMCwgMChyMykKKwlhZGRpCXIzLCByMywgNAorCWNtcGx3CTAsIHIzLCByNAorCWJuZQk1YgorNjoKKworCW1yCXIzLCByOQkJLyogR2xvYmFsIERhdGEgcG9pbnRlcgkJKi8KKwltcglyNCwgcjEwCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCQkqLworCWJsCWJvYXJkX2luaXRfcgorCisJLyoKKwkgKiBDb3B5IGV4Y2VwdGlvbiB2ZWN0b3IgY29kZSB0byBsb3cgbWVtb3J5CisJICoKKwkgKiByMzogZGVzdF9hZGRyCisJICogcjc6IHNvdXJjZSBhZGRyZXNzLCByODogZW5kIGFkZHJlc3MsIHI5OiB0YXJnZXQgYWRkcmVzcworCSAqLworCS5nbG9ibAl0cmFwX2luaXQKK3RyYXBfaW5pdDoKKwltZmxyCXI0CQkJLyogc2F2ZSBsaW5rIHJlZ2lzdGVyCQkqLworCUdFVF9HT1QKKwlsd3oJcjcsIEdPVChfc3RhcnQpCisJbHd6CXI4LCBHT1QoX2VuZF9vZl92ZWN0b3JzKQorCisJbGkJcjksIDB4MTAwCQkvKiByZXNldCB2ZWN0b3IgYWx3YXlzIGF0IDB4MTAwICovCisKKwljbXBsdwkwLCByNywgcjgKKwliZ2VscgkJCQkvKiByZXR1cm4gaWYgcjc+PXI4IC0ganVzdCBpbiBjYXNlICovCisxOgorCWx3eglyMCwgMChyNykKKwlzdHcJcjAsIDAocjkpCisJYWRkaQlyNywgcjcsIDQKKwlhZGRpCXI5LCByOSwgNAorCWNtcGx3CTAsIHI3LCByOAorCWJuZQkxYgorCisJLyoKKwkgKiByZWxvY2F0ZSBgaGRscicgYW5kIGBpbnRfcmV0dXJuJyBlbnRyaWVzCisJICovCisJbGkJcjcsIC5MX01hY2hpbmVDaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIEFsaWdubWVudCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisyOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkyYgorCisJbGkJcjcsIC5MX0FsaWdubWVudCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJYmwJdHJhcF9yZWxvYworCisJbGkJcjcsIC5MX1Byb2dyYW1DaGVjayAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJYmwJdHJhcF9yZWxvYworCisJbGkJcjcsIC5MX0ZQVW5hdmFpbGFibGUgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBTeXN0ZW1DYWxsIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKzM6CisJYmwJdHJhcF9yZWxvYworCWFkZGkJcjcsIHI3LCAweDEwMAkJLyogbmV4dCBleGNlcHRpb24gdmVjdG9yCSovCisJY21wbHcJMCwgcjcsIHI4CisJYmx0CTNiCisKKwlsaQlyNywgLkxfU2luZ2xlU3RlcCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbGkJcjgsIF9lbmRfb2ZfdmVjdG9ycyAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCis0OgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAk0YgorCisJbXRscglyNAkJCS8qIHJlc3RvcmUgbGluayByZWdpc3RlcgkqLworCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L3RyYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzZGNlZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L3RyYXBzLmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBsaW51eC9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiAgR2FyeSBUaG9tYXMgKGdkdEBsaW51eHBwYy5vcmcpCisgKgorICogTW9kaWZpZWQgYnkgQ29ydCBEb3VnYW4gKGNvcnRAY3Mubm10LmVkdSkKKyAqIGFuZCBQYXVsIE1hY2tlcnJhcyAocGF1bHVzQGNzLmFudS5lZHUuYXUpCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBoYXJkd2FyZSBleGNlcHRpb25zCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxrZ2RiLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKK2V4dGVybiB2b2lkIGRvX2JlZGJ1Z19icmVha3BvaW50KHN0cnVjdCBwdF9yZWdzICopOworI2VuZGlmCisKKy8qIFJldHVybnMgMCBpZiBleGNlcHRpb24gbm90IGZvdW5kIGFuZCBmaXh1cCBvdGhlcndpc2UuICAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VhcmNoX2V4Y2VwdGlvbl90YWJsZSh1bnNpZ25lZCBsb25nKTsKKworLyogVEhJUyBORUVEUyBDSEFOR0lORyB0byB1c2UgdGhlIGJvYXJkIGluZm8gc3RydWN0dXJlLgorKi8KKyNkZWZpbmUgRU5EX09GX01FTQkweDAyMDAwMDAwCisKKy8qCisgKiBUcmFwICYgRXhjZXB0aW9uIHN1cHBvcnQKKyAqLworCit2b2lkCitwcmludF9iYWNrdHJhY2UodW5zaWduZWQgbG9uZyAqc3ApCit7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgbG9uZyBpOworCisJcHJpbnRmKCJDYWxsIGJhY2t0cmFjZTogIik7CisJd2hpbGUgKHNwKSB7CisJCWlmICgodWludClzcCA+IEVORF9PRl9NRU0pCisJCQlicmVhazsKKworCQlpID0gc3BbMV07CisJCWlmIChjbnQrKyAlIDcgPT0gMCkKKwkJCXByaW50ZigiXG4iKTsKKwkJcHJpbnRmKCIlMDhsWCAiLCBpKTsKKwkJaWYgKGNudCA+IDMyKSBicmVhazsKKwkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSpzcDsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGk7CisKKwlwcmludGYoIk5JUDogJTA4bFggWEVSOiAlMDhsWCBMUjogJTA4bFggUkVHUzogJXAgVFJBUDogJTA0bHggREFSOiAlMDhsWFxuIiwKKwkgICAgICAgcmVncy0+bmlwLCByZWdzLT54ZXIsIHJlZ3MtPmxpbmssIHJlZ3MsIHJlZ3MtPnRyYXAsIHJlZ3MtPmRhcik7CisJcHJpbnRmKCJNU1I6ICUwOGx4IEVFOiAlMDF4IFBSOiAlMDF4IEZQOiAlMDF4IE1FOiAlMDF4IElSL0RSOiAlMDF4JTAxeFxuIiwKKwkgICAgICAgcmVncy0+bXNyLCByZWdzLT5tc3ImTVNSX0VFID8gMSA6IDAsIHJlZ3MtPm1zciZNU1JfUFIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyICYgTVNSX0ZQID8gMSA6IDAscmVncy0+bXNyJk1TUl9NRSA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3ImTVNSX0lSID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciZNU1JfRFIgPyAxIDogMCk7CisKKwlwcmludGYoIlxuIik7CisJZm9yIChpID0gMDsgIGkgPCAzMjsgIGkrKykgeworCQlpZiAoKGkgJSA4KSA9PSAwKQorCQl7CisJCQlwcmludGYoIkdQUiUwMmQ6ICIsIGkpOworCQl9CisKKwkJcHJpbnRmKCIlMDhsWCAiLCByZWdzLT5ncHJbaV0pOworCQlpZiAoKGkgJSA4KSA9PSA3KQorCQl7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwl9Cit9CisKKwordm9pZAorX2V4Y2VwdGlvbihpbnQgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJFeGNlcHRpb24gaW4ga2VybmVsIHBjICVseCBzaWduYWwgJWQiLHJlZ3MtPm5pcCxzaWducik7Cit9CisKK3ZvaWQKK01hY2hpbmVDaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGZpeHVwOworCisJLyogUHJvYmluZyBQQ0kgdXNpbmcgY29uZmlnIGN5Y2xlcyBjYXVzZSB0aGlzIGV4Y2VwdGlvbgorCSAqIHdoZW4gYSBkZXZpY2UgaXMgbm90IHByZXNlbnQuICBDYXRjaCBpdCBhbmQgcmV0dXJuIHRvCisJICogdGhlIFBDSSBleGNlcHRpb24gaGFuZGxlci4KKwkgKi8KKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZShyZWdzLT5uaXApKSAhPSAwKSB7CisJCXJlZ3MtPm5pcCA9IGZpeHVwOworCQlyZXR1cm47CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ZigiTWFjaGluZSBjaGVjayBpbiBrZXJuZWwgbW9kZS5cbiIpOworCXByaW50ZigiQ2F1c2VkIGJ5IChmcm9tIG1zcik6ICIpOworCXByaW50ZigicmVncyAlcCAiLHJlZ3MpOworCXN3aXRjaCggcmVncy0+bXNyICYgMHgwMDBGMDAwMCkgeworCWNhc2UgKDB4ODAwMDAwMDA+PjEyKToKKwkJcHJpbnRmKCJNYWNoaW5lIGNoZWNrIHNpZ25hbCAtIHByb2JhYmx5IGR1ZSB0byBtbSBmYXVsdFxuIgorCQkJIndpdGggbW11IG9mZlxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjEzKToKKwkJcHJpbnRmKCJUcmFuc2ZlciBlcnJvciBhY2sgc2lnbmFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTQpOgorCQlwcmludGYoIkRhdGEgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjE1KToKKwkJcHJpbnRmKCJBZGRyZXNzIHBhcml0eSBzaWduYWxcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlVua25vd24gdmFsdWVzIGluIG1zclxuIik7CisJfQorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJtYWNoaW5lIGNoZWNrIik7Cit9CisKK3ZvaWQKK0FsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJBbGlnbm1lbnQgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQKK1Byb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJQcm9ncmFtIENoZWNrIEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMoIlNvZnR3YXJlIEVtdWxhdGlvbiBFeGNlcHRpb24iKTsKK30KKworCit2b2lkCitVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJcHJpbnRmKCJCYWQgdHJhcCBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4XG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CisJX2V4Y2VwdGlvbigwLCByZWdzKTsKK30KKwordm9pZAorRGVidWdFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHByaW50ZigiRGVidWdnZXIgdHJhcCBhdCBAICVseFxuIiwgcmVncy0+bmlwICk7CisgIHNob3dfcmVncyhyZWdzKTsKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQorICBkb19iZWRidWdfYnJlYWtwb2ludCggcmVncyApOworI2VuZGlmCit9CisKKy8qIFByb2JlIGFuIGFkZHJlc3MgYnkgcmVhZGluZy4gIElmIG5vdCBwcmVzZW50LCByZXR1cm4gLTEsIG90aGVyd2lzZQorICogcmV0dXJuIDAuCisgKi8KK2ludAorYWRkcl9wcm9iZSh1aW50ICphZGRyKQoreworI2lmIDAKKwlpbnQJcmV0dmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJXAorCQkiMToJbHd6ICUwLDAoJTEpXG4iCQlcCisJCSIJZWllaW9cbiIJCVwKKwkJIglsaSAlMCwwXG4iCQlcCisJCSIyOlxuIgkJCQlcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCVwKKwkJIjM6CWxpICUwLC0xXG4iCQlcCisJCSIJYiAyYlxuIgkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJXAorCQkiCS5hbGlnbiAyXG4iCQlcCisJCSIJLmxvbmcgMWIsM2JcbiIJCVwKKwkJIi50ZXh0IgkJCQlcCisJCTogIj1yIiAocmV0dmFsKSA6ICJyIihhZGRyKSk7CisKKwlyZXR1cm4gKHJldHZhbCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L3VwYXRjaC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvdXBhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjYjczNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4L3VwYXRjaC5jCkBAIC0wLDAgKzEsMTk0IEBACisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19JMkNfVUNPREVfUEFUQ0gpIHx8IGRlZmluZWQoQ09ORklHX1NZU19TUElfVUNPREVfUEFUQ0gpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19TWVNfU01DX1VDT0RFX1BBVENIKQorCitzdGF0aWMgdm9pZCBVY29kZUNvcHkgKHZvbGF0aWxlIGNwbTh4eF90ICpjcG0pOworCit2b2lkIGNwbV9sb2FkX3BhdGNoICh2b2xhdGlsZSBpbW1hcF90ICppbW1yKQoreworCWltbXItPmltX2NwbS5jcF9yY2NyICY9IH4weDAwMDM7CS8qIERpc2FibGUgbWljcm9jb2RlIHByb2dyYW0gYXJlYSAqLworCisJVWNvZGVDb3B5ICgoY3BtOHh4X3QgKikmaW1tci0+aW1fY3BtKTsJLyogQ29weSB1Y29kZSBwYXRjaCB0byBEUFJBTSAgICovCisjaWZkZWYgQ09ORklHX1NZU19TUElfVUNPREVfUEFUQ0gKKyAgICB7CisJdm9sYXRpbGUgc3BpX3QgKnNwaSA9IChzcGlfdCAqKSAmIGltbXItPmltX2NwbS5jcF9kcGFyYW1bUFJPRkZfU1BJXTsKKwkvKiBBY3RpdmF0ZSB0aGUgbWljcm9jb2RlIHBlciB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBtaWNyb2NvZGUgbWFudWFsICovCisJLyogTk9URTogIFdlJ3JlIG9ubHkgcmVsb2NhdGluZyB0aGUgU1BJIHBhcmFtZXRlcnMgKG5vdCBJMkMpLiAgICAgICAgICAqLworCWltbXItPmltX2NwbS5jcF9jcG1jcjEgPSAweDgwMmE7CS8qIFdyaXRlIFRyYXAgcmVnaXN0ZXIgMSB2YWx1ZSAqLworCWltbXItPmltX2NwbS5jcF9jcG1jcjIgPSAweDgwMjg7CS8qIFdyaXRlIFRyYXAgcmVnaXN0ZXIgMiB2YWx1ZSAqLworCXNwaS0+c3BpX3JwYmFzZSA9IENPTkZJR19TWVNfU1BJX0RQTUVNX09GRlNFVDsJLyogV2hlcmUgdG8gcmVsb2N0ZSBTUEkgcGFyYW1zICovCisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1lTX0kyQ19VQ09ERV9QQVRDSAorICAgIHsKKwl2b2xhdGlsZSBpaWNfdCAqaWlwID0gKGlpY190ICopICYgaW1tci0+aW1fY3BtLmNwX2RwYXJhbVtQUk9GRl9JSUNdOworCS8qIEFjdGl2YXRlIHRoZSBtaWNyb2NvZGUgcGVyIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIG1pY3JvY29kZSBtYW51YWwgKi8KKwkvKiBOT1RFOiAgV2UncmUgb25seSByZWxvY2F0aW5nIHRoZSBJMkMgcGFyYW1ldGVycyAobm90IFNQSSkuICAgICAgICAgICovCisJaW1tci0+aW1fY3BtLmNwX2NwbWNyMyA9IDB4ODAyZTsJLyogV3JpdGUgVHJhcCByZWdpc3RlciAzIHZhbHVlICovCisJaW1tci0+aW1fY3BtLmNwX2NwbWNyNCA9IDB4ODAyYzsJLyogV3JpdGUgVHJhcCByZWdpc3RlciA0IHZhbHVlICovCisJaWlwLT5paWNfcnBiYXNlID0gQ09ORklHX1NZU19JMkNfRFBNRU1fT0ZGU0VUOwkvKiBXaGVyZSB0byByZWxvY3RlIEkyQyBwYXJhbXMgKi8KKyAgICB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TWVNfU01DX1VDT0RFX1BBVENICisgICAgeworCXZvbGF0aWxlIHNtY191YXJ0X3QgKnVwID0gKHNtY191YXJ0X3QgKikgJiBpbW1yLT5pbV9jcG0uY3BfZHBhcmFtW1BST0ZGX1NNQzFdOworCS8qIEFjdGl2YXRlIHRoZSBtaWNyb2NvZGUgcGVyIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIG1pY3JvY29kZSBtYW51YWwgKi8KKwkvKiBOT1RFOiAgV2UncmUgb25seSByZWxvY2F0aW5nIHRoZSBTTUMgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICovCisJaW1tci0+aW1fY3BtLmNwX2NwbWNyMSA9IDB4ODA4MDsJLyogV3JpdGUgVHJhcCByZWdpc3RlciAxIHZhbHVlICovCisJaW1tci0+aW1fY3BtLmNwX2NwbWNyMiA9IDB4ODA4ODsJLyogV3JpdGUgVHJhcCByZWdpc3RlciAyIHZhbHVlICovCisJdXAtPnNtY19ycGJhc2UgPSBDT05GSUdfU1lTX1NNQ19EUE1FTV9PRkZTRVQ7CS8qIFdoZXJlIHRvIHJlbG9jdGUgU01DIHBhcmFtcyAqLworICAgIH0KKyNlbmRpZgorCisJLyoKKwkgKiBFbmFibGUgRFBSQU0gbWljcm9jb2RlIHRvIGV4ZWN1dGUgZnJvbSB0aGUgZmlyc3QgNTEyIGJ5dGVzCisJICogYW5kIGEgMjU2IGJ5dGUgZXh0ZW5zaW9uIG9mIERQUkFNLgorCSAqLworI2lmZGVmIENPTkZJR19TWVNfU01DX1VDT0RFX1BBVENICisJaW1tci0+aW1fY3BtLmNwX3JjY3IgfD0gMHgwMDAyOworI2Vsc2UKKwlpbW1yLT5pbV9jcG0uY3BfcmNjciB8PSAweDAwMDE7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19JMkNfVUNPREVfUEFUQ0gpIHx8IGRlZmluZWQoQ09ORklHX1NZU19TUElfVUNPREVfUEFUQ2gpCitzdGF0aWMgdWxvbmcgcGF0Y2hfMjAwMFtdID0geworCTB4N0ZGRkVGRDksIDB4M0ZGRDAwMDAsIDB4N0ZGQjQ5RjcsIDB4N0ZGOTAwMDAsCisJMHg1RkVGQURGNywgMHg1Rjg4QURGNywgMHg1RkVGQUZGNywgMHg1Rjg4QUZGNywKKwkweDNBOUNGQkM4LCAweDc3Q0FFMUJCLCAweEY0REU3RkFELCAweEFCQUU5MzMwLAorCTB4NEUwOEZEQ0YsIDB4NkUwRkFGRjgsIDB4N0NDRjc2Q0YsIDB4RkRBRkY5Q0YsCisJMHhBQkY4OERDOCwgMHhBQjU4NzlGNywgMHhCMDkyNzM4MywgMHhERkQwNzlGNywKKwkweEIwOTBFNkJCLCAweEU1QkJFNzRGLCAweEIzRkE2RjBGLCAweDZGRkI3NkNFLAorCTB4RUUwQ0Y5Q0YsIDB4MkJGQkVGRUYsIDB4Q0ZFRUY5Q0YsIDB4NzZDRUFEMjMsCisJMHg5MEIzREY5OSwgMHg3RkRERDBDMSwgMHg0QkY4NDdGRCwgMHg3Q0NGNzZDRSwKKwkweENGRUY3N0NBLCAweDdFQUY3RkFELCAweDdERkRGMEI3LCAweEVGN0E3RkNBLAorCTB4NzdDQUZCQzgsIDB4NjA3OUU3MjIsIDB4RkJDODVGRkYsIDB4REZGRjVGQjMsCisJMHhGRkZCRkJDOCwgMHhGM0M4OTRBNSwgMHhFN0M5RURGOSwgMHg3RjlBN0ZBRCwKKwkweDVGMzZBRkU4LCAweDVGNUJGRkRGLCAweERGOTVDQjlFLCAweEFGN0Q1RkMzLAorCTB4QUZFRDhDMUIsIDB4NUZDM0FGREQsIDB4NUZDNURGOTksIDB4N0VGREIwQjMsCisJMHg1RkIzRkZGRSwgMHhBQkFFNUZCMywgMHhGRkZFNUZEMCwgMHg2MDBCRTZCQiwKKwkweDYwMEI1RkQwLCAweERGQzgyN0ZCLCAweEVGREY1RkNBLCAweENGREUzQTlDLAorCTB4RTdDOUVERjksIDB4RjNDODdGOUUsIDB4NTRDQTdGRUQsIDB4MkQzQTM2MzcsCisJMHg3NTZGN0U5QSwgMHhGMUNFMzdFRiwgMHgyRTY3N0ZFRSwgMHgxMEVCQURGOCwKKwkweEVGREVDRkVBLCAweEU1MkY3RDlGLCAweEUxMkJGMUNFLCAweDVGNjQ3RTlBLAorCTB4NERGOENGRUEsIDB4NUY3MTdEOUIsIDB4RUZFRUNGRUEsIDB4NUY3M0U1MjIsCisJMHhFRkRFNUY3MywgMHhDRkRBMEI2MSwgMHg3Mzg1REY2MSwgMHhFN0M5RURGOSwKKwkweDdFOUEzMEQ1LCAweDE0NThCRkZGLCAweEYzQzg1RkZGLCAweERGRkZBN0Y4LAorCTB4NUY1QkJGRkUsIDB4N0Y3RDEwRDAsIDB4MTQ0RDVGMzMsIDB4QkZGRkFGNzgsCisJMHg1RjVCQkZGRCwgMHhBN0Y4NUYzMywgMHhCRkZFNzdGRCwgMHgzMEJENEUwOCwKKwkweEZEQ0ZFNUZGLCAweDZFMEZBRkY4LCAweDdFRUY3RTlGLCAweEZERUZGMUNGLAorCTB4NUYxN0FCRjgsIDB4MEQ1QjVGNUIsIDB4RkZFRjc5RjcsIDB4MzA5RUFGREQsCisJMHg1RjMxNDdGOCwgMHg1RjMxQUZFRCwgMHg3RkRENTBBRiwgMHg0OTc4NDdGRCwKKwkweDdGOUU3RkVELCAweDdERkQ3MEE5LCAweEVGN0U3RUNFLCAweDZCQTA3RjlFLAorCTB4MkQyMjdFRkQsIDB4MzBEQjVGNUIsIDB4RkZGRDVGNUIsIDB4RkZFRjVGNUIsCisJMHhGRkRGMEM5QywgMHhBRkVEMEE5QSwgMHhBRkREMEMzNywgMHg1RjM3QUZCRCwKKwkweDdGQkRCMDgxLCAweDVGODE0N0Y4LAorfTsKKworc3RhdGljIHVsb25nIHBhdGNoXzJGMDBbXSA9IHsKKwkweDNFMzAzNDMwLCAweDM0MzQzNzM3LCAweEFCQkY5Qjk5LCAweDRCNEZCREJELAorCTB4NTk5NDkzMzQsIDB4OUZGRjM3RkIsIDB4OUIxNzdERDksIDB4OTM2OTU2QkIsCisJMHhGQkRENjk3QiwgMHhERDJGRDExMywgMHgxREI5RjdCQiwgMHgzNjMxMzk2MywKKwkweDc5MzczMzY5LCAweDMxOTMxMzdGLCAweDczMzE3MzdBLCAweEY3QkI5Qjk5LAorCTB4OUJCMTk3OTUsIDB4NzdGREZEM0QsIDB4NTczQjc3M0YsIDB4NzM3OTMzRjcsCisJMHhCOTkxRDExNSwgMHgzMTY5OTMxNSwgMHgzMTUzMTY5NCwgMHhCRjRGQkRCRCwKKwkweDM1OTMxNDk3LCAweDM1Mzc2OTU2LCAweEJENjk3QjlELCAweDk2OTMxMzEzLAorCTB4MTk3OTc5MzcsIDB4NjkzNTAwMDAsCit9OworI2Vsc2UKKworc3RhdGljIHVsb25nIHBhdGNoXzIwMDBbXSA9IHsKKwkweDNmZmYwMDAwLCAweDNmZmQwMDAwLCAweDNmZmIwMDAwLCAweDNmZjkwMDAwLAorCTB4NWZlZmVmZjgsIDB4NWY5MWVmZjgsIDB4M2ZmMzAwMDAsIDB4M2ZmMTAwMDAsCisJMHgzYTExZTcxMCwgMHhlZGYwY2NiOSwgMHhmMzE4ZWQ2NiwgMHg3ZjBlNWZlMiwKKwkweDdmZWRiYjM4LCAweDNhZmU3NDY4LCAweDdmZWRmNGQ4LCAweDhmZmJiOTJkLAorCTB4YjgzYjc3ZmQsIDB4YjBiYjVlYjksIDB4ZGZkYTdmZWQsIDB4OTBiZGU3NGQsCisJMHg2ZjBkY2JkMywgMHhlN2RlY2ZlZCwgMHhjYjUwY2ZlZCwgMHhjZmVkZGY2ZCwKKwkweDkxNGQ0Zjc0LCAweDVlYWVkZmNiLCAweDllZTBlN2RmLCAweGVmYmI2ZmZiLAorCTB4ZTdlZjdmMGUsIDB4OWVlNTdmZWQsIDB4ZWJiN2VmZmEsIDB4ZWIzMGFmZmIsCisJMHg3ZmVhOTBiMywgMHg3ZTBjZjA5ZiwgMHhiZmZmZjMxOCwgMHg1ZmZmZGZmZiwKKwkweGFjMzVlZmVhLCAweDdmY2UxZmMxLCAweGUyZmY1ZmJkLCAweGFmZmJlMmZmLAorCTB4NWZiZmFmZmIsIDB4ZjlhODdkMGYsIDB4YWVmODc3MGYsIDB4N2QwZmIwYTIsCisJMHhlZmZiYmZmZiwgMHhjZmVmNWZiYSwgMHg3ZDBmYmZmZiwgMHg1ZmJhNGNmOCwKKwkweDdmZGRkMDliLCAweDQ5Zjg0N2ZkLCAweDdlZmRmMDk3LCAweDdmZWRmZmZkLAorCTB4N2RmZGYwOTMsIDB4ZWY3ZTdlMWUsIDB4NWZiYTdmMGUsIDB4M2ExMWU3MTAsCisJMHhlZGYwY2M4NywgMHhmYjE4YWQwYSwgMHgxZjg1YmJiOCwgMHg3NDI4M2I3ZSwKKwkweDczNzVlNGJiLCAweDJhYjY0ZmI4LCAweDVjN2RlNGJiLCAweDMyZmRmZmJmLAorCTB4NWYwODQzZjgsIDB4N2NlM2UxYmIsIDB4ZTc0ZjdkZWQsIDB4NmYwZjRmZTgsCisJMHhjN2JhMzJiZSwgMHg3M2YyZWZlYiwgMHg2MDBiNGY3OCwgMHhlNWJiNzYwYiwKKwkweDUzODhhZWY4LCAweDRlZjgwYjZhLCAweGNmZWY5ZWU1LCAweGFiZjg3NTFmLAorCTB4ZWZlZjViODgsIDB4NzQxZjRmZTgsIDB4NzUxZTc2MGQsIDB4N2ZkYjcwZGQsCisJMHg3NDFjYWZjZSwgMHhlZmNjN2ZjZSwgMHg3NTFlNzA4OCwgMHg3NDFjZTdiYiwKKwkweDMzNGVjZmVkLCAweGFmZGJlZmViLCAweGU1YmI3NjBiLCAweDUzY2VhZWY4LAorCTB4YWZlOGU3ZWIsIDB4NGJmODc3MWUsIDB4N2UwMDdmZWQsIDB4NGZjYmUyY2MsCisJMHg3ZmJjMzA4NSwgMHg3YjBmN2EwZiwgMHgzNGIxNzdmZCwgMHhiMGU3NWU5MywKKwkweGRmMzEzZTNiLCAweGFmNzg3NDFmLCAweDc0MWYzMGNjLCAweGNmZWY1ZjA4LAorCTB4NzQxZjNlODgsIDB4YWZiODc3MWUsIDB4NWY0MzdmZWQsIDB4MGJhZmUyY2MsCisJMHg3NDFjY2ZlYywgMHhlNWNhNTNhOSwgMHg2ZmNiNGY3NCwgMHg1ZTg5ZGYyNywKKwkweDJhOTIzZDE0LCAweDRiOGZkZjBjLCAweDc1MWY3NDFjLCAweDZjMWVlZmZhLAorCTB4ZWZlYTdmY2UsIDB4NmZmYzMwOWEsIDB4ZWZlYzNmY2EsIDB4MzA4ZmRmMGEsCisJMHhhZGY4NWU3YSwgMHhhZjdkYWVmZCwgMHg1ZTdhZGYwYSwgMHg1ZTdhYWZkZCwKKwkweDc2MWYxMDg4LCAweDFlN2M3ZWZkLCAweDMwODlmZmZlLCAweDQ5MDhmYjE4LAorCTB4NWZmZmRmZmYsIDB4YWZiYmYwZjcsIDB4NGVmODVmNDMsIDB4YWRmODE0ODksCisJMHg3YTBmNzA4OSwgMHhjZmVmNTA4OSwgMHg3YTBmZGYwYywgMHg1ZTdjYWZlZCwKKwkweGJjNmU3ODBmLCAweGVmZWY3ODBmLCAweGVmZWY3OTBmLCAweGE3Zjg1ZWViLAorCTB4ZmZlZjc5MGYsIDB4ZWZlZjc5MGYsIDB4MTQ4OWRmMGEsIDB4NWU3YWFkZmQsCisJMHg1ZjA5ZmZmYiwgMHhlNzlhZGVkOSwgMHhlZmY5NjA3OSwgMHg2MDdhZTc5YSwKKwkweGRlZDhlZmY5LCAweDYwNzk1ZWRiLCAweDYwN2FjZmVmLCAweGVmZWZlZmRmLAorCTB4ZWZiZmVmN2YsIDB4ZWVmZmVkZmYsIDB4ZWJmZmU3ZmYsIDB4YWZlZmFmZGYsCisJMHhhZmJmYWY3ZiwgMHhhZWZmYWRmZiwgMHhhYmZmYTdmZiwgMHg2ZmVmNmZkZiwKKwkweDZmYmY2ZjdmLCAweDZlZmY2ZGZmLCAweDZiZmY2N2ZmLCAweDJmZWYyZmRmLAorCTB4MmZiZjJmN2YsIDB4MmVmZjJkZmYsIDB4MmJmZjI3ZmYsIDB4NGUwOGZkMWYsCisJMHhlNWZmNmUwZiwgMHhhZmY4N2VlZiwgMHg3ZTBmZmRlZiwgMHhmMTFmNjA3OSwKKwkweGFiZjhmNTFlLCAweDdlMGFmMTFjLCAweDM3Y2ZhZTE2LCAweDdmZWM5MDlhLAorCTB4YWRmOGVmZGMsIDB4Y2ZlYWU1MmYsIDB4N2QwZmUxMmIsIDB4ZjExYzYwNzksCisJMHg3ZTBhNGRmOCwgMHhjZmVhNWVhMCwgMHg3ZDBiZWZlYywgMHhjZmVhNWVhMiwKKwkweGU1MjJlZmRjLCAweDVlYTJjZmRhLCAweDRlMDhmZDFmLCAweDZlMGZhZmY4LAorCTB4N2MxZjc2MWYsIDB4ZmRlZmY5MWYsIDB4NjA3OWFiZjgsIDB4NzYxY2VlMDAsCisJMHhmOTFmMmJmYiwgMHhlZmVmY2ZlYywgMHhmOTFmNjA3OSwgMHg3NjFjMjdmYiwKKwkweGVmZGY1ZTgzLCAweGNmZGM3ZmRkLCAweDUwZjg0YmY4LCAweDQ3ZmQ3YzFmLAorCTB4NzYxY2NmY2YsIDB4N2VlZjdmZWQsIDB4N2RmZDcwZWYsIDB4ZWY3ZTdmMWUsCisJMHg3NzFlZmIxOCwgMHg2MDc5ZTcyMiwgMHhlNmJiZTViYiwgMHgyZTY2ZTViYiwKKwkweDYwMGIyZWUxLCAweGUyYmJlMmJiLCAweGUyYmJlMmJiLCAweDJmNWVlMmJiLAorCTB4ZTJiYjJmZjksIDB4NjA3OWUyYmIsCit9OworCitzdGF0aWMgdWxvbmcgcGF0Y2hfMkYwMFtdID0geworCTB4MzAzMDMwMzAsIDB4M2UzZTMwMzAsIDB4YWY3OWI5YjMsIDB4YmFhM2I5NzksCisJMHg5NjkzMzY5ZiwgMHg3OWY3OTc3NywgMHg5NzMzM2ZmZiwgMHhmYjNiOWU5ZiwKKwkweDc5YjkxZDExLCAweDllMTNmM2ZmLCAweDNmOWI2YmQ5LCAweGUxNzNkMTM2LAorCTB4Njk1NjY5ZDEsIDB4Njk3YjNkYWYsIDB4NzliOTNhM2EsIDB4M2Y5NzlmOTEsCisJMHgzNzlmZjk3NiwgMHhmOTk3NzdmZCwgMHg5Nzc5NzM3ZCwgMHhlOWQ2YmJmOSwKKwkweGJmZmZkOWRmLCAweDk3ZjdmZDk3LCAweDZmN2I5YmZmLCAweGY5YmQ5NjgzLAorCTB4Mzk3ZGI5NzMsIDB4ZDk3YjNiOWYsIDB4ZDdmOWY3MzMsIDB4OTk5M2JiOWUsCisJMHhlMWY5ZWY5MywgMHg3Mzc3MzMzNywgMHhiOTM2OTE3ZCwgMHgxMWY4NzM3OSwKKwkweGI5NzlkMzM2LCAweDhiN2RlZDczLCAweDFiN2Q5MzM3LCAweDMxZjNmMjJmLAorCTB4M2YyMzI3ZWUsIDB4ZWVlZWVlZWUsIDB4ZWVlZWVlZWUsIDB4ZWVlZWVlZWUsCisJMHhlZWVlZWU0YiwgMHhmNGZiZGJkMiwgMHg1OGJiMTg3OCwgMHg1NzdmZGZkMiwKKwkweGQ1NzNiNzczLCAweGY3Mzc0YjRmLCAweGJkYmQyNWI4LCAweGIxNzdkMmQxLAorCTB4NzM3Njg1NmIsIDB4YmZkZDY4N2IsIDB4ZGQyZmZmOGYsIDB4NzhmZmZmOGYsCisJMHhmMjJmMDAwMCwKK307CisjZW5kaWYKKworc3RhdGljIHZvaWQgVWNvZGVDb3B5ICh2b2xhdGlsZSBjcG04eHhfdCAqY3BtKQoreworCXZ1X2xvbmcgKnA7CisJaW50IGk7CisKKwlwID0gKHZ1X2xvbmcgKikmKGNwbS0+Y3BfZHBtZW1bMHgwMDAwXSk7CisJZm9yIChpPTA7IGkgPCBzaXplb2YocGF0Y2hfMjAwMCkvNDsgKytpKSB7CisJCXBbaV0gPSBwYXRjaF8yMDAwW2ldOworCX0KKworCXAgPSAodnVfbG9uZyAqKSYoY3BtLT5jcF9kcG1lbVsweDBGMDBdKTsKKwlmb3IgKGk9MDsgaSA8IHNpemVvZihwYXRjaF8yRjAwKS80OyArK2kpIHsKKwkJcFtpXSA9IHBhdGNoXzJGMDBbaV07CisJfQorfQorCisjZW5kaWYJLyogQ09ORklHX1NZU19JMkNfVUNPREVfUEFUQ0gsIENPTkZJR19TWVNfU1BJX1VDT0RFX1BBVENIICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC92aWRlby5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzljNDk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvdmlkZW8uYwpAQCAtMCwwICsxLDEzMzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFBhb2xvIFNjYWZmYXJkaSwgQUlSVkVOVCBTQU0gcy5wLmEgLSBSSU1JTkkoSVRBTFkpLCBhcnNlbmlvQHRpbi5pdAorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCB3ZEBkZW54LmRlCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogI2RlZmluZSBERUJVRyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKiogSEVBREVSIEZJTEVTCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorI2luY2x1ZGUgPHRpbWVzdGFtcC5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW9fZGV2Lmg+CisKKyNpZmRlZiBDT05GSUdfVklERU8KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBERUJVRyBTRVRUSU5HUwkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIDAKKyNkZWZpbmUgVklERU9fREVCVUdfQ09MT1JCQVJTCS8qIEZvcmNlIGNvbG9yYmFycyBvdXRwdXQgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKiogVklERU8gTU9ERSBTRVRUSU5HUwkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMAorI2RlZmluZSBWSURFT19NT0RFX0VYVEVOREVECQkvKiBBbGxvdyBzY3JlZW4gc2l6ZSBiaWdnZXIgdGhhbiB2aXNpYmxlIGFyZWEgKi8KKyNkZWZpbmUgVklERU9fTU9ERV9OVFNDCisjZW5kaWYKKworI2RlZmluZSBWSURFT19NT0RFX1BBTAorCisjaWYgMAorI2RlZmluZSBWSURFT19CTElOSwkJCS8qIFRoaXMgZW5hYmxlcyBjdXJzb3IgYmxpbmtpbmcgKHVuZGVyIGNvbnN0cnVjdGlvbikgKi8KKyNlbmRpZgorCisjZGVmaW5lIFZJREVPX0lORk8JCQkvKiBTaG93IFUtQm9vdCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBWSURFT19JTkZPX1gJCVZJREVPX0xPR09fV0lEVEgrOAorI2RlZmluZSBWSURFT19JTkZPX1kJCTE2CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBWSURFTyBFTkNPREVSIENPTlNUQU5UUwkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX1ZJREVPX0VOQ09ERVJfQUQ3MTc2CisKKyNpbmNsdWRlIDx2aWRlb19hZDcxNzYuaD4JLyogU2V0cyBlbmNvZGVyIGRhdGEsIG1vZGUsIGFuZCB2aXNpYmxlIGFuZCBhY3RpdmUgYXJlYSAqLworCisjZGVmaW5lIFZJREVPX0kyQwkJMQorI2RlZmluZSBWSURFT19JMkNfQUREUgkJQ09ORklHX1ZJREVPX0VOQ09ERVJfQUQ3MTc2X0FERFIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZJREVPX0VOQ09ERVJfQUQ3MTc3CisKKyNpbmNsdWRlIDx2aWRlb19hZDcxNzcuaD4JLyogU2V0cyBlbmNvZGVyIGRhdGEsIG1vZGUsIGFuZCB2aXNpYmxlIGFuZCBhY3RpdmUgYXJlYSAqLworCisjZGVmaW5lIFZJREVPX0kyQwkJMQorI2RlZmluZSBWSURFT19JMkNfQUREUgkJQ09ORklHX1ZJREVPX0VOQ09ERVJfQUQ3MTc3X0FERFIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZJREVPX0VOQ09ERVJfQUQ3MTc5CisKKyNpbmNsdWRlIDx2aWRlb19hZDcxNzkuaD4JLyogU2V0cyBlbmNvZGVyIGRhdGEsIG1vZGUsIGFuZCB2aXNpYmxlIGFuZCBhY3RpdmUgYXJlYSAqLworCisjZGVmaW5lIFZJREVPX0kyQwkJMQorI2RlZmluZSBWSURFT19JMkNfQUREUgkJQ09ORklHX1ZJREVPX0VOQ09ERVJfQUQ3MTc5X0FERFIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKiogVklERU8gTU9ERSBDT05TVEFOVFMJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFZJREVPX01PREVfRVhURU5ERUQKKyNkZWZpbmUgVklERU9fQ09MUwlWSURFT19BQ1RJVkVfQ09MUworI2RlZmluZSBWSURFT19ST1dTCVZJREVPX0FDVElWRV9ST1dTCisjZWxzZQorI2RlZmluZSBWSURFT19DT0xTCVZJREVPX1ZJU0lCTEVfQ09MUworI2RlZmluZSBWSURFT19ST1dTCVZJREVPX1ZJU0lCTEVfUk9XUworI2VuZGlmCisKKyNkZWZpbmUgVklERU9fUElYRUxfU0laRQkoVklERU9fTU9ERV9CUFAvOCkKKyNkZWZpbmUgVklERU9fU0laRQkJKFZJREVPX1JPV1MqVklERU9fQ09MUypWSURFT19QSVhFTF9TSVpFKQkvKiBUb3RhbCBzaXplIG9mIGJ1ZmZlciAqLworI2RlZmluZSBWSURFT19QSVhfQkxPQ0tTCShWSURFT19TSVpFID4+IDIpCS8qIE51bWJlciBvZiBpbnRzICovCisjZGVmaW5lIFZJREVPX0xJTkVfTEVOCQkoVklERU9fQ09MUypWSURFT19QSVhFTF9TSVpFKQkvKiBOdW1iZXIgb2YgYnl0ZXMgcGVyIGxpbmUgKi8KKyNkZWZpbmUgVklERU9fQlVSU1RfTEVOCQkoVklERU9fQ09MUy84KQorCisjaWZkZWYgVklERU9fTU9ERV9ZVVlWCisjZGVmaW5lIFZJREVPX0JHX0NPTAkweDgwRDg4MEQ4CS8qIEJhY2tncm91bmQgY29sb3IgaW4gWVVZViBmb3JtYXQgKi8KKyNlbHNlCisjZGVmaW5lIFZJREVPX0JHX0NPTAkweEY4RjhGOEY4CS8qIEJhY2tncm91bmQgY29sb3IgaW4gUkdCIGZvcm1hdCAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBGT05UIEFORCBMT0dPIERBVEEJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHZpZGVvX2ZvbnQuaD4JCQkvKiBHZXQgZm9udCBkYXRhLCB3aWR0aCBhbmQgaGVpZ2h0ICovCisKKyNpZmRlZiBDT05GSUdfVklERU9fTE9HTworI2luY2x1ZGUgPHZpZGVvX2xvZ28uaD4JCQkvKiBHZXQgbG9nbyBkYXRhLCB3aWR0aCBhbmQgaGVpZ2h0ICovCisKKyNkZWZpbmUgVklERU9fTE9HT19XSURUSAlERUZfVV9CT09UX0xPR09fV0lEVEgKKyNkZWZpbmUgVklERU9fTE9HT19IRUlHSFQJREVGX1VfQk9PVF9MT0dPX0hFSUdIVAorI2RlZmluZSBWSURFT19MT0dPX0FERFIJCSZ1X2Jvb3RfbG9nbworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBWSURFTyBDT05UUk9MTEVSIENPTlNUQU5UUwkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFZDQ1IgLSBWSURFTyBDT05UUk9MTEVSIENPTkZJR1VSQVRJT04gUkVHSVNURVIgKi8KKworI2RlZmluZSBWSURFT19WQ0NSX1ZPTgkwCQkvKiBWaWRlbyBjb250cm9sbGVyIE9OICovCisjZGVmaW5lIFZJREVPX1ZDQ1JfQ1NSQwkxCQkvKiBDbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgVklERU9fVkNDUl9QREYJMTMJCS8qIFBpeGVsIGRpc3BsYXkgZm9ybWF0ICovCisjZGVmaW5lIFZJREVPX1ZDQ1JfSUVOCTExCQkvKiBJbnRlcnJ1cHQgZW5hYmxlICovCisKKy8qIFZTUiAtIFZJREVPIFNUQVRVUyBSRUdJU1RFUiAqLworCisjZGVmaW5lIFZJREVPX1ZTUl9DQVMJNgkJLyogQWN0aXZlIHNldCAqLworI2RlZmluZSBWSURFT19WU1JfRU9GCTAJCS8qIEVuZCBvZiBmcmFtZSAqLworCisvKiBWQ01SIC0gVklERU8gQ09NTUFORCBSRUdJU1RFUiAqLworCisjZGVmaW5lIFZJREVPX1ZDTVJfQkQJMAkJLyogQmxhbmsgZGlzcGxheSAqLworI2RlZmluZSBWSURFT19WQ01SX0FTRUwJMQkJLyogQWN0aXZlIHNldCBzZWxlY3Rpb24gKi8KKworLyogVkJDQiAtIFZJREVPIEJBQ0tHUk9VTkQgQ09MT1IgQlVGRkVSIFJFR0lTVEVSICovCisKKyNkZWZpbmUgVklERU9fQkNTUjRfUkVTRVRfQklUCTIxCS8qIEJDU1I0IC0gRXh0ZXJuIHZpZGVvIGVuY29kZXIgcmVzZXQgKi8KKyNkZWZpbmUgVklERU9fQkNTUjRfRVhUQ0xLX0JJVAkyMgkvKiBCQ1NSNCAtIEV4dGVybiBjbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgVklERU9fQkNTUjRfVklETEVEX0JJVAkyMwkvKiBCQ1NSNCAtIFZpZGVvIGxlZCBkaXNhYmxlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBDT05TT0xFIENPTlNUQU5UUwkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmCUNPTkZJR19WSURFT19MT0dPCisjZGVmaW5lIENPTlNPTEVfUk9XUwkJKChWSURFT19ST1dTIC0gVklERU9fTE9HT19IRUlHSFQpIC8gVklERU9fRk9OVF9IRUlHSFQpCisjZGVmaW5lIFZJREVPX0xPR09fU0tJUAkJKFZJREVPX0NPTFMgLSBWSURFT19MT0dPX1dJRFRIKQorI2Vsc2UKKyNkZWZpbmUgQ09OU09MRV9ST1dTCQkoVklERU9fUk9XUyAvIFZJREVPX0ZPTlRfSEVJR0hUKQorI2VuZGlmCisKKyNkZWZpbmUgQ09OU09MRV9DT0xTCQkoVklERU9fQ09MUyAvIFZJREVPX0ZPTlRfV0lEVEgpCisjZGVmaW5lIENPTlNPTEVfUk9XX1NJWkUJKFZJREVPX0ZPTlRfSEVJR0hUICogVklERU9fTElORV9MRU4pCisjZGVmaW5lIENPTlNPTEVfUk9XX0ZJUlNUCSh2aWRlb19jb25zb2xlX2FkZHJlc3MpCisjZGVmaW5lIENPTlNPTEVfUk9XX1NFQ09ORAkodmlkZW9fY29uc29sZV9hZGRyZXNzICsgQ09OU09MRV9ST1dfU0laRSkKKyNkZWZpbmUgQ09OU09MRV9ST1dfTEFTVAkodmlkZW9fY29uc29sZV9hZGRyZXNzICsgQ09OU09MRV9TSVpFIC0gQ09OU09MRV9ST1dfU0laRSkKKyNkZWZpbmUgQ09OU09MRV9TSVpFCQkoQ09OU09MRV9ST1dfU0laRSAqIENPTlNPTEVfUk9XUykKKyNkZWZpbmUgQ09OU09MRV9TQ1JPTExfU0laRQkoQ09OU09MRV9TSVpFIC0gQ09OU09MRV9ST1dfU0laRSkKKworLyoKKyAqIFNpbXBsZSBjb2xvciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIENPTlNPTEVfQ09MT1JfQkxBQ0sJIDAKKyNkZWZpbmUgQ09OU09MRV9DT0xPUl9SRUQJIDEKKyNkZWZpbmUgQ09OU09MRV9DT0xPUl9HUkVFTgkgMgorI2RlZmluZSBDT05TT0xFX0NPTE9SX1lFTExPVwkgMworI2RlZmluZSBDT05TT0xFX0NPTE9SX0JMVUUJIDQKKyNkZWZpbmUgQ09OU09MRV9DT0xPUl9NQUdFTlRBCSA1CisjZGVmaW5lIENPTlNPTEVfQ09MT1JfQ1lBTgkgNgorI2RlZmluZSBDT05TT0xFX0NPTE9SX0dSRVkJMTMKKyNkZWZpbmUgQ09OU09MRV9DT0xPUl9HUkVZMgkxNAorI2RlZmluZSBDT05TT0xFX0NPTE9SX1dISVRFCTE1CS8qIE11c3QgcmVtYWluIGxhc3QgLyBoaWdoZXN0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBCSVRPUFMgTUFDUk9TCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEhJU0hPUlQoaSkJKChpID4+IDE2KSYweGZmZmYpCisjZGVmaW5lIExPU0hPUlQoaSkJKGkgJiAweGZmZmYpCisjZGVmaW5lIEhJQ0hBUihzKQkoKGkgPj4gOCkmMHhmZikKKyNkZWZpbmUgTE9DSEFSKHMpCShpICYgMHhmZikKKyNkZWZpbmUgSEkoYykJCSgoYyA+PiA0KSYweGYpCisjZGVmaW5lIExPKGMpCQkoYyAmIDB4ZikKKyNkZWZpbmUgU1dBUElOVChpKQkoSElTSE9SVChpKSB8IChMT1NIT1JUKGkpIDw8IDE2KSkKKyNkZWZpbmUgU1dBUFNIT1JUKHMpCShISUNIQVIocykgfCAoTE9DSEFSKHMpIDw8IDgpKQorI2RlZmluZSBTV0FQQ0hBUihjKQkoSEkoYykgfCAoTE8oYykgPDwgNCkpCisjZGVmaW5lIEJJVE1BU0soYikJKDEgPDwgKGIpKQorI2RlZmluZSBHRVRCSVQodixiKQkoKCh2KSAmIEJJVE1BU0soYikpID4gMCkKKyNkZWZpbmUgU0VUQklUKHYsYixkKQkodiA9ICgoKGQpPjApID8gKHYpIHwgQklUTUFTSyhiKTogKHYpICYgfkJJVE1BU0soYikpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKiogU1RSVUNUVVJFUwkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgViwgWTEsIFUsIFkyOworfSB0WVVZVjsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgYmFzZWQgb24gdGhlIFZpZGVvIFJhbSBpbiB0aGUgTVBDODIzLiAqLwordHlwZWRlZiBzdHJ1Y3QgVlJBTSB7CisJdW5zaWduZWQJaHg6MiwJCS8qIEhvcml6b250YWwgc3luYyAqLworCQkJdng6MiwJCS8qIFZlcnRpY2FsIHN5bmMgKi8KKwkJCWZ4OjIsCQkvKiBGcmFtZSAqLworCQkJYng6MiwJCS8qIEJsYW5rICovCisJCQlyZXMxOjYsCQkvKiBSZXNlcnZlZCAqLworCQkJdmRzOjIsCQkvKiBWaWRlbyBEYXRhIFNlbGVjdCAqLworCQkJaW50ZXI6MSwJLyogSW50ZXJydXB0ICovCisJCQlyZXMyOjIsCQkvKiBSZXNlcnZlZCAqLworCQkJbGN5YzoxMSwJLyogTG9vcC92aWRlbyBjeWNsZXMgKi8KKwkJCWxwOjEsCQkvKiBMb29wIHN0YXJ0L2VuZCAqLworCQkJbHN0OjE7CQkvKiBMYXN0IGVudHJ5ICovCit9IFZSQU07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBWQVJJQUJMRVMJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CisJdmlkZW9fcGFubmluZ19yYW5nZV94ID0gMCwJLyogVmlkZW8gbW9kZSBpbnZpc2libGUgcGl4ZWxzIHggcmFuZ2UgKi8KKwl2aWRlb19wYW5uaW5nX3JhbmdlX3kgPSAwLAkvKiBWaWRlbyBtb2RlIGludmlzaWJsZSBwaXhlbHMgeSByYW5nZSAqLworCXZpZGVvX3Bhbm5pbmdfdmFsdWVfeCA9IDAsCS8qIFZpZGVvIG1vZGUgeCBwYW5uaW5nIHZhbHVlIChhYnNvbHV0ZSkgKi8KKwl2aWRlb19wYW5uaW5nX3ZhbHVlX3kgPSAwLAkvKiBWaWRlbyBtb2RlIHkgcGFubmluZyB2YWx1ZSAoYWJzb2x1dGUpICovCisJdmlkZW9fcGFubmluZ19mYWN0b3JfeCA9IDAsCS8qIFZpZGVvIG1vZGUgeCBwYW5uaW5nIHZhbHVlICgtMTI3ICsxMjcpICovCisJdmlkZW9fcGFubmluZ19mYWN0b3JfeSA9IDAsCS8qIFZpZGVvIG1vZGUgeSBwYW5uaW5nIHZhbHVlICgtMTI3ICsxMjcpICovCisJY29uc29sZV9jb2wgPSAwLAkJLyogQ3Vyc29yIGNvbCAqLworCWNvbnNvbGVfcm93ID0gMCwJCS8qIEN1cnNvciByb3cgKi8KKwl2aWRlb19wYWxldHRlWzE2XTsJCS8qIE91ciBwYWxldHRlICovCisKK3N0YXRpYyBjb25zdCBpbnQgdmlkZW9fZm9udF9kcmF3X3RhYmxlW10gPQorCXsgMHgwMDAwMDAwMCwgMHgwMDAwZmZmZiwgMHhmZmZmMDAwMCwgMHhmZmZmZmZmZiB9OworCitzdGF0aWMgY2hhcgorCXZpZGVvX2NvbG9yX2ZnID0gMCwJCS8qIEN1cnJlbnQgZmcgY29sb3IgaW5kZXggKDAtMTUpICovCisJdmlkZW9fY29sb3JfYmcgPSAwLAkJLyogQ3VycmVudCBiZyBjb2xvciBpbmRleCAoMC0xNSkgKi8KKwl2aWRlb19lbmFibGUgPSAwOwkJLyogVmlkZW8gaGFzIGJlZW4gaW5pdGlhbGl6ZWQ/ICovCisKK3N0YXRpYyB2b2lkCisJKnZpZGVvX2ZiX2FkZHJlc3MsCQkvKiBGcmFtZSBidWZmZXIgYWRkcmVzcyAqLworCSp2aWRlb19jb25zb2xlX2FkZHJlc3M7CQkvKiBDb25zb2xlIGZyYW1lIGJ1ZmZlciBzdGFydCBhZGRyZXNzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBNRU1PUlkgRlVOQ1RJT05TICgzMmJpdCkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgbWVtc2V0bCAoaW50ICpwLCBpbnQgYywgaW50IHYpCit7CisJd2hpbGUgKGMtLSkKKwkJKihwKyspID0gdjsKK30KKworc3RhdGljIHZvaWQgbWVtY3B5bCAoaW50ICpkLCBpbnQgKnMsIGludCBjKQoreworCXdoaWxlIChjLS0pCisJCSooZCsrKSA9ICoocysrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICoqIFZJREVPIERSQVdJTkcgQU5EIENPTE9SIEZVTkNUSU9OUwkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdmlkZW9fbWFwcmdiIChpbnQgciwgaW50IGcsIGludCBiKQoreworI2lmZGVmIFZJREVPX01PREVfWVVZVgorCXVuc2lnbmVkIGludCBwUiwgcEcsIHBCOworCXRZVVlWIFlVWVY7CisJdW5zaWduZWQgaW50ICpyZXQgPSAodW5zaWduZWQgaW50ICopICZZVVlWOworCisJLyogVHJhbnNmb3JtICgwLTI1NSkgY29tcG9uZW50cyB0byAoMC0xMDApICovCisKKwlwUiA9IHIgKiAxMDAgLyAyNTU7CisJcEcgPSBnICogMTAwIC8gMjU1OworCXBCID0gYiAqIDEwMCAvIDI1NTsKKworCS8qIENhbGN1bGF0ZSBZVVYgdmFsdWVzICgwLTI1NSkgZnJvbSBSR0IgYmVldHdlZW4gMC0xMDAgKi8KKworCVlVWVYuWTEgPSBZVVlWLlkyID0gMjA5ICogKHBSICsgcEcgKyBwQikgLyAzMDAgKyAxNjsKKwlZVVlWLlUJPSBwUiAtIChwRyAqIDMgLyA0KSAtIChwQiAvIDQpICsgMTI4OworCVlVWVYuVgk9IHBCIC0gKHBSIC8gNCkgLSAocEcgKiAzIC8gNCkgKyAxMjg7CisJcmV0dXJuICpyZXQ7CisjZW5kaWYKKyNpZmRlZiBWSURFT19NT0RFX1JHQgorCXJldHVybiAoKHIgPj4gMykgPDwgMTEpIHwgKChnID4gMikgPDwgNikgfCAoYiA+PiAzKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB2aWRlb19zZXRwYWxldHRlIChpbnQgY29sb3IsIGludCByLCBpbnQgZywgaW50IGIpCit7CisJY29sb3IgJj0gMHhmOworCisJdmlkZW9fcGFsZXR0ZVtjb2xvcl0gPSB2aWRlb19tYXByZ2IgKHIsIGcsIGIpOworCisJLyogU3dhcCB2YWx1ZXMgaWYgb3VyIHBhbm5pbmcgb2Zmc2V0IGlzIG9kZCAqLworCWlmICh2aWRlb19wYW5uaW5nX3ZhbHVlX3ggJiAxKQorCQl2aWRlb19wYWxldHRlW2NvbG9yXSA9IFNXQVBJTlQgKHZpZGVvX3BhbGV0dGVbY29sb3JdKTsKK30KKworc3RhdGljIHZvaWQgdmlkZW9fZmlsbCAoaW50IGNvbG9yKQoreworCW1lbXNldGwgKHZpZGVvX2ZiX2FkZHJlc3MsIFZJREVPX1BJWF9CTE9DS1MsIGNvbG9yKTsKK30KKworc3RhdGljIHZvaWQgdmlkZW9fc2V0Zmdjb2xvciAoaW50IGkpCit7CisJdmlkZW9fY29sb3JfZmcgPSBpICYgMHhmOworfQorCitzdGF0aWMgdm9pZCB2aWRlb19zZXRiZ2NvbG9yIChpbnQgaSkKK3sKKwl2aWRlb19jb2xvcl9iZyA9IGkgJiAweGY7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW9fcGlja2NvbG9yIChpbnQgaSkKK3sKKwlyZXR1cm4gdmlkZW9fcGFsZXR0ZVtpICYgMHhmXTsKK30KKworLyogQWJzb2x1dGUgY29uc29sZSBwbG90dGluZyBmdW5jdGlvbnMgKi8KKworI2lmZGVmIFZJREVPX0JMSU5LCitzdGF0aWMgdm9pZCB2aWRlb19yZXZjaGFyIChpbnQgeHgsIGludCB5eSkKK3sKKwlpbnQgcm93czsKKwl1OCAqZGVzdDsKKworCWRlc3QgPSB2aWRlb19mYl9hZGRyZXNzICsgeXkgKiBWSURFT19MSU5FX0xFTiArIHh4ICogMjsKKworCWZvciAocm93cyA9IFZJREVPX0ZPTlRfSEVJR0hUOyByb3dzLS07IGRlc3QgKz0gVklERU9fTElORV9MRU4pIHsKKwkJc3dpdGNoIChWSURFT19GT05UX1dJRFRIKSB7CisJCWNhc2UgMTY6CisJCQkoKHUzMiAqKSBkZXN0KVs2XSBePSAweGZmZmZmZmZmOworCQkJKCh1MzIgKikgZGVzdClbN10gXj0gMHhmZmZmZmZmZjsKKwkJCS8qIEZBTEwgVEhST1VHSCAqLworCQljYXNlIDEyOgorCQkJKCh1MzIgKikgZGVzdClbNF0gXj0gMHhmZmZmZmZmZjsKKwkJCSgodTMyICopIGRlc3QpWzVdIF49IDB4ZmZmZmZmZmY7CisJCQkvKiBGQUxMIFRIUk9VR0ggKi8KKwkJY2FzZSA4OgorCQkJKCh1MzIgKikgZGVzdClbMl0gXj0gMHhmZmZmZmZmZjsKKwkJCSgodTMyICopIGRlc3QpWzNdIF49IDB4ZmZmZmZmZmY7CisJCQkvKiBGQUxMIFRIUk9VR0ggKi8KKwkJY2FzZSA0OgorCQkJKCh1MzIgKikgZGVzdClbMF0gXj0gMHhmZmZmZmZmZjsKKwkJCSgodTMyICopIGRlc3QpWzFdIF49IDB4ZmZmZmZmZmY7CisJCX0KKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdmlkZW9fZHJhd2NoYXJzIChpbnQgeHgsIGludCB5eSwgdW5zaWduZWQgY2hhciAqcywgaW50IGNvdW50KQoreworCXU4ICpjZGF0LCAqZGVzdCwgKmRlc3QwOworCWludCByb3dzLCBvZmZzZXQsIGM7CisJdTMyIGVvcngsIGZneCwgYmd4OworCisJb2Zmc2V0ID0geXkgKiBWSURFT19MSU5FX0xFTiArIHh4ICogMjsKKwlkZXN0MCA9IHZpZGVvX2ZiX2FkZHJlc3MgKyBvZmZzZXQ7CisKKwlmZ3ggPSB2aWRlb19waWNrY29sb3IgKHZpZGVvX2NvbG9yX2ZnKTsKKwliZ3ggPSB2aWRlb19waWNrY29sb3IgKHZpZGVvX2NvbG9yX2JnKTsKKworCWlmICh4eCAmIDEpIHsKKwkJZmd4ID0gU1dBUElOVCAoZmd4KTsKKwkJYmd4ID0gU1dBUElOVCAoYmd4KTsKKwl9CisKKwllb3J4ID0gZmd4IF4gYmd4OworCisJc3dpdGNoIChWSURFT19GT05UX1dJRFRIKSB7CisJY2FzZSA0OgorCWNhc2UgODoKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCWMgPSAqczsKKwkJCWNkYXQgPSB2aWRlb19mb250ZGF0YSArIGMgKiBWSURFT19GT05UX0hFSUdIVDsKKwkJCWZvciAocm93cyA9IFZJREVPX0ZPTlRfSEVJR0hULCBkZXN0ID0gZGVzdDA7CisJCQkgICAgIHJvd3MtLTsKKwkJCSAgICAgZGVzdCArPSBWSURFT19MSU5FX0xFTikgeworCQkJCXU4IGJpdHMgPSAqY2RhdCsrOworCisJCQkJKCh1MzIgKikgZGVzdClbMF0gPQorCQkJCQkodmlkZW9fZm9udF9kcmF3X3RhYmxlW2JpdHMgPj4gNl0gJiBlb3J4KSBeIGJneDsKKwkJCQkoKHUzMiAqKSBkZXN0KVsxXSA9CisJCQkJCSh2aWRlb19mb250X2RyYXdfdGFibGVbYml0cyA+PiA0ICYgM10gJiBlb3J4KSBeIGJneDsKKwkJCQlpZiAoVklERU9fRk9OVF9XSURUSCA9PSA4KSB7CisJCQkJCSgodTMyICopIGRlc3QpWzJdID0KKwkJCQkJCSh2aWRlb19mb250X2RyYXdfdGFibGVbYml0cyA+PiAyICYgM10gJiBlb3J4KSBeIGJneDsKKwkJCQkJKCh1MzIgKikgZGVzdClbM10gPQorCQkJCQkJKHZpZGVvX2ZvbnRfZHJhd190YWJsZVtiaXRzICYgM10gJiBlb3J4KSBeIGJneDsKKwkJCQl9CisJCQl9CisJCQlkZXN0MCArPSBWSURFT19GT05UX1dJRFRIICogMjsKKwkJCXMrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIDEyOgorCWNhc2UgMTY6CisJCXdoaWxlIChjb3VudC0tKSB7CisJCQljZGF0ID0gdmlkZW9fZm9udGRhdGEgKyAoKnMpICogKFZJREVPX0ZPTlRfSEVJR0hUIDw8IDEpOworCQkJZm9yIChyb3dzID0gVklERU9fRk9OVF9IRUlHSFQsIGRlc3QgPSBkZXN0MDsgcm93cy0tOworCQkJCSBkZXN0ICs9IFZJREVPX0xJTkVfTEVOKSB7CisJCQkJdTggYml0cyA9ICpjZGF0Kys7CisKKwkJCQkoKHUzMiAqKSBkZXN0KVswXSA9CisJCQkJCSh2aWRlb19mb250X2RyYXdfdGFibGVbYml0cyA+PiA2XSAmIGVvcngpIF4gYmd4OworCQkJCSgodTMyICopIGRlc3QpWzFdID0KKwkJCQkJKHZpZGVvX2ZvbnRfZHJhd190YWJsZVtiaXRzID4+IDQgJiAzXSAmIGVvcngpIF4gYmd4OworCQkJCSgodTMyICopIGRlc3QpWzJdID0KKwkJCQkJKHZpZGVvX2ZvbnRfZHJhd190YWJsZVtiaXRzID4+IDIgJiAzXSAmIGVvcngpIF4gYmd4OworCQkJCSgodTMyICopIGRlc3QpWzNdID0KKwkJCQkJKHZpZGVvX2ZvbnRfZHJhd190YWJsZVtiaXRzICYgM10gJiBlb3J4KSBeIGJneDsKKwkJCQliaXRzID0gKmNkYXQrKzsKKwkJCQkoKHUzMiAqKSBkZXN0KVs0XSA9CisJCQkJCSh2aWRlb19mb250X2RyYXdfdGFibGVbYml0cyA+PiA2XSAmIGVvcngpIF4gYmd4OworCQkJCSgodTMyICopIGRlc3QpWzVdID0KKwkJCQkJKHZpZGVvX2ZvbnRfZHJhd190YWJsZVtiaXRzID4+IDQgJiAzXSAmIGVvcngpIF4gYmd4OworCQkJCWlmIChWSURFT19GT05UX1dJRFRIID09IDE2KSB7CisJCQkJCSgodTMyICopIGRlc3QpWzZdID0KKwkJCQkJCSh2aWRlb19mb250X2RyYXdfdGFibGVbYml0cyA+PiAyICYgM10gJiBlb3J4KSBeIGJneDsKKwkJCQkJKCh1MzIgKikgZGVzdClbN10gPQorCQkJCQkJKHZpZGVvX2ZvbnRfZHJhd190YWJsZVtiaXRzICYgM10gJiBlb3J4KSBeIGJneDsKKwkJCQl9CisJCQl9CisJCQlzKys7CisJCQlkZXN0MCArPSBWSURFT19GT05UX1dJRFRIICogMjsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2aWRlb19kcmF3c3RyaW5nIChpbnQgeHgsIGludCB5eSwgY2hhciAqcykKK3sKKwl2aWRlb19kcmF3Y2hhcnMgKHh4LCB5eSwgKHVuc2lnbmVkIGNoYXIgKilzLCBzdHJsZW4gKHMpKTsKK30KKworLyogUmVsYXRpdmUgdG8gY29uc29sZSBwbG90dGluZyBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgdmlkZW9fcHV0Y2hhcnMgKGludCB4eCwgaW50IHl5LCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgY291bnQpCit7CisjaWZkZWYgQ09ORklHX1ZJREVPX0xPR08KKwl2aWRlb19kcmF3Y2hhcnMgKHh4LCB5eSArIFZJREVPX0xPR09fSEVJR0hULCBzLCBjb3VudCk7CisjZWxzZQorCXZpZGVvX2RyYXdjaGFycyAoeHgsIHl5LCBzLCBjb3VudCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdmlkZW9fcHV0Y2hhciAoaW50IHh4LCBpbnQgeXksIHVuc2lnbmVkIGNoYXIgYykKK3sKKyNpZmRlZiBDT05GSUdfVklERU9fTE9HTworCXZpZGVvX2RyYXdjaGFycyAoeHgsIHl5ICsgVklERU9fTE9HT19IRUlHSFQsICZjLCAxKTsKKyNlbHNlCisJdmlkZW9fZHJhd2NoYXJzICh4eCwgeXksICZjLCAxKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmlkZW9fcHV0c3RyaW5nIChpbnQgeHgsIGludCB5eSwgdW5zaWduZWQgY2hhciAqcykKK3sKKwl2aWRlb19wdXRjaGFycyAoeHgsIHl5LCAodW5zaWduZWQgY2hhciAqKXMsIHN0cmxlbiAoKGNoYXIgKilzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBWSURFTyBDT05UUk9MTEVSIExPVy1MRVZFTCBGVU5DVElPTlMJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhZGVmaW5lZChDT05GSUdfUlJWSVNJT04pCitzdGF0aWMgdm9pZCB2aWRlb19tb2RlX2R1cGVmaWVsZCAoVlJBTSAqIHNvdXJjZSwgVlJBTSAqIGRlc3QsIGludCBlbnRyaWVzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlkZXN0W2ldID0gc291cmNlW2ldOwkvKiBDb3B5IHRoZSBlbnRpcmUgcmVjb3JkICovCisJCWRlc3RbaV0uZnggPSAoIWRlc3RbaV0uZngpICogMzsJLyogTmVnYXRlIGZpZWxkIGJpdCAqLworCX0KKworCWRlc3RbMF0ubGN5YysrOwkJCS8qIEFkZCBhIGN5Y2xlIHRvIHRoZSBmaXJzdCBlbnRyeSAqLworCWRlc3RbZW50cmllcyAtIDFdLmxzdCA9IDE7CS8qIFNldCBlbmQgb2YgcmFtIGVudHJpZXMgKi8KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbmxpbmUgdmlkZW9fbW9kZV9hZGRlbnRyeSAoVlJBTSAqIHZyLAorCWludCBIeCwgaW50IFZ4LCBpbnQgRngsIGludCBCeCwKKwlpbnQgVkRTLCBpbnQgSU5ULCBpbnQgTENZQywgaW50IExQLCBpbnQgTFNUKQoreworCXZyLT5oeCA9IEh4OworCXZyLT52eCA9IFZ4OworCXZyLT5meCA9IEZ4OworCXZyLT5ieCA9IEJ4OworCXZyLT52ZHMgPSBWRFM7CisJdnItPmludGVyID0gSU5UOworCXZyLT5sY3ljID0gTENZQzsKKwl2ci0+bHAgPSBMUDsKKwl2ci0+bHN0ID0gTFNUOworfQorCisjZGVmaW5lIEFEREVOVFJZKGEsYixjLGQsZSxmLGcsaCxpKQl2aWRlb19tb2RlX2FkZGVudHJ5KCZ2cltlbnRyeSsrXSxhLGIsYyxkLGUsZixnLGgsaSkKKworc3RhdGljIGludCB2aWRlb19tb2RlX2dlbmVyYXRlICh2b2lkKQoreworCWltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCVZSQU0gKnZyID0gKFZSQU0gKikgKCgodm9pZCAqKSBpbW1hcCkgKyAweGIwMCk7CS8qIFBvaW50ZXIgdG8gdGhlIFZSQU0gdGFibGUgKi8KKwlpbnQgRFgsIFgxLCBYMiwgRFksIFkxLCBZMiwgZW50cnkgPSAwLCBmaWZvOworCisJLyogQ0hFQ0tJTkcgUEFSQU1FVEVSUyAqLworCisJaWYgKHZpZGVvX3Bhbm5pbmdfZmFjdG9yX3kgPCAtMTI4KQorCQl2aWRlb19wYW5uaW5nX2ZhY3Rvcl95ID0gLTEyODsKKworCWlmICh2aWRlb19wYW5uaW5nX2ZhY3Rvcl95ID4gMTI4KQorCQl2aWRlb19wYW5uaW5nX2ZhY3Rvcl95ID0gMTI4OworCisJaWYgKHZpZGVvX3Bhbm5pbmdfZmFjdG9yX3ggPCAtMTI4KQorCQl2aWRlb19wYW5uaW5nX2ZhY3Rvcl94ID0gLTEyODsKKworCWlmICh2aWRlb19wYW5uaW5nX2ZhY3Rvcl94ID4gMTI4KQorCQl2aWRlb19wYW5uaW5nX2ZhY3Rvcl94ID0gMTI4OworCisJLyogU2V0dGluZyBwYW5uaW5nICovCisKKwlEWCA9IHZpZGVvX3Bhbm5pbmdfcmFuZ2VfeCA9IChWSURFT19BQ1RJVkVfQ09MUyAtIFZJREVPX0NPTFMpICogMjsKKwlEWSA9IHZpZGVvX3Bhbm5pbmdfcmFuZ2VfeSA9IChWSURFT19BQ1RJVkVfUk9XUyAtIFZJREVPX1JPV1MpIC8gMjsKKworCXZpZGVvX3Bhbm5pbmdfdmFsdWVfeCA9ICh2aWRlb19wYW5uaW5nX2ZhY3Rvcl94ICsgMTI4KSAqIERYIC8gMjU2OworCXZpZGVvX3Bhbm5pbmdfdmFsdWVfeSA9ICh2aWRlb19wYW5uaW5nX2ZhY3Rvcl95ICsgMTI4KSAqIERZIC8gMjU2OworCisJLyogV2UgYXNzdW1lIHRoZXNlIGFyZSBidXJzdCB1bml0cyAobXVsdGlwbGllZCBieSAyLCB3ZSBuZWVkIGl0IHBhcmkpICovCisJWDEgPSB2aWRlb19wYW5uaW5nX3ZhbHVlX3ggJiAweGZmZmU7CisJWDIgPSBEWCAtIFgxOworCisJLyogV2UgYXNzdW1lIHRoZXNlIGFyZSBmaWVsZCBsaW5lIHVuaXRzIChkaXZpZGVkIGJ5IDIsIHdlIG5lZWQgaXQgcGFyaSkgKi8KKwlZMSA9IHZpZGVvX3Bhbm5pbmdfdmFsdWVfeSAmIDB4ZmZmZTsKKwlZMiA9IERZIC0gWTE7CisKKwlkZWJ1ZygiWDE9JWQsIFgyPSVkLCBZMT0lZCwgWTI9JWQsIERYPSVkLCBEWT0lZCBWSURFT19DT0xTPSVkIFxuIiwKKwkgICAgICBYMSwgWDIsIFkxLCBZMiwgRFgsIERZLCBWSURFT19DT0xTKTsKKworI2lmZGVmIFZJREVPX01PREVfTlRTQworLyoKKyAqCSAgICAgSHggVnggRnggQnggVkRTIElOVCBMQ1lDIExQIExTVAorICoKKyAqIFJldHJhY2UgYmxhbmtpbmcKKyAqLworCUFEREVOVFJZICgwLCAwLCAzLCAwLCAxLCAwLCAzLCAxLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMywgMCwgMSwgMCwgMjQzLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMywgMCwgMSwgMCwgMTQ0MCwgMCwgMCk7CisJQURERU5UUlkgKDMsIDAsIDMsIDAsIDEsIDAsIDMyLCAxLCAwKTsKKy8qCisgKiBWZXJ0aWNhbCBibGFua2luZworICovCisJQURERU5UUlkgKDAsIDAsIDAsIDAsIDEsIDAsIDE4LCAxLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMCwgMCwgMSwgMCwgMjQzLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMCwgMCwgMSwgMCwgMTQ0MCwgMCwgMCk7CisJQURERU5UUlkgKDMsIDAsIDAsIDAsIDEsIDAsIDMyLCAxLCAwKTsKKy8qCisgKiBPZGQgZmllbGQgYWN0aXZlIGFyZWEgKFRPUCkKKyAqLworCWlmIChZMSA+IDApIHsKKwkJQURERU5UUlkgKDAsIDAsIDAsIDAsIDEsIDAsIFkxLCAxLCAwKTsKKwkJQURERU5UUlkgKDMsIDAsIDAsIDAsIDEsIDAsIDIzNSwgMCwgMCk7CisJCUFEREVOVFJZICgzLCAwLCAwLCAzLCAxLCAwLCAxNDQ4LCAwLCAwKTsKKwkJQURERU5UUlkgKDMsIDAsIDAsIDAsIDEsIDAsIDMyLCAxLCAwKTsKKwl9CisvKgorICogT2RkIGZpZWxkIGFjdGl2ZSBhcmVhCisgKi8KKwlBRERFTlRSWSAoMCwgMCwgMCwgMCwgMSwgMCwgMjQwIC0gRFksIDEsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAwLCAxLCAwLCAyMzUsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAzLCAxLCAwLCA4ICsgWDEsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAzLCAwLCAwLCBWSURFT19DT0xTICogMiwgMCwgMCk7CisKKwlpZiAoWDIgPiAwKQorCQlBRERFTlRSWSAoMywgMCwgMCwgMywgMSwgMCwgWDIsIDAsIDApOworCisJQURERU5UUlkgKDMsIDAsIDAsIDAsIDEsIDAsIDMyLCAxLCAwKTsKKworLyoKKyAqIE9kZCBmaWVsZCBhY3RpdmUgYXJlYSAoQk9UVE9NKQorICovCisJaWYgKFkxID4gMCkgeworCQlBRERFTlRSWSAoMCwgMCwgMCwgMCwgMSwgMCwgWTIsIDEsIDApOworCQlBRERFTlRSWSAoMywgMCwgMCwgMCwgMSwgMCwgMjM1LCAwLCAwKTsKKwkJQURERU5UUlkgKDMsIDAsIDAsIDMsIDEsIDAsIDE0NDgsIDAsIDApOworCQlBRERFTlRSWSAoMywgMCwgMCwgMCwgMSwgMCwgMzIsIDEsIDApOworCX0KKy8qCisgKiBWZXJ0aWNhbCBibGFua2luZworICovCisJQURERU5UUlkgKDAsIDAsIDAsIDAsIDEsIDAsIDQsIDEsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAwLCAxLCAwLCAyNDMsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAwLCAxLCAwLCAxNDQwLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMCwgMCwgMSwgMCwgMzIsIDEsIDApOworLyoKKyAqIFZlcnRpY2FsIGJsYW5raW5nCisgKi8KKwlBRERFTlRSWSAoMCwgMCwgMywgMCwgMSwgMCwgMTksIDEsIDApOworCUFEREVOVFJZICgzLCAwLCAzLCAwLCAxLCAwLCAyNDMsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAzLCAwLCAxLCAwLCAxNDQwLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMywgMCwgMSwgMCwgMzIsIDEsIDApOworLyoKKyAqIEV2ZW4gZmllbGQgYWN0aXZlIGFyZWEgKFRPUCkKKyAqLworCWlmIChZMSA+IDApIHsKKwkJQURERU5UUlkgKDAsIDAsIDMsIDAsIDEsIDAsIFkxLCAxLCAwKTsKKwkJQURERU5UUlkgKDMsIDAsIDMsIDAsIDEsIDAsIDIzNSwgMCwgMCk7CisJCUFEREVOVFJZICgzLCAwLCAzLCAzLCAxLCAwLCAxNDQ4LCAwLCAwKTsKKwkJQURERU5UUlkgKDMsIDAsIDMsIDAsIDEsIDAsIDMyLCAxLCAwKTsKKwl9CisvKgorICogRXZlbiBmaWVsZCBhY3RpdmUgYXJlYSAoQ0VOVEVSKQorICovCisJQURERU5UUlkgKDAsIDAsIDMsIDAsIDEsIDAsIDI0MCAtIERZLCAxLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMywgMCwgMSwgMCwgMjM1LCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMywgMywgMSwgMCwgOCArIFgxLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMywgMywgMCwgMCwgVklERU9fQ09MUyAqIDIsIDAsIDApOworCisJaWYgKFgyID4gMCkKKwkJQURERU5UUlkgKDMsIDAsIDMsIDMsIDEsIDAsIFgyLCAwLCAwKTsKKworCUFEREVOVFJZICgzLCAwLCAzLCAwLCAxLCAwLCAzMiwgMSwgMCk7CisvKgorICogRXZlbiBmaWVsZCBhY3RpdmUgYXJlYSAoQk9UVE9NKQorICovCisJaWYgKFkxID4gMCkgeworCQlBRERFTlRSWSAoMCwgMCwgMywgMCwgMSwgMCwgWTIsIDEsIDApOworCQlBRERFTlRSWSAoMywgMCwgMywgMCwgMSwgMCwgMjM1LCAwLCAwKTsKKwkJQURERU5UUlkgKDMsIDAsIDMsIDMsIDEsIDAsIDE0NDgsIDAsIDApOworCQlBRERFTlRSWSAoMywgMCwgMywgMCwgMSwgMCwgMzIsIDEsIDApOworCX0KKy8qCisgKiBWZXJ0aWNhbCBibGFua2luZworICovCisJQURERU5UUlkgKDAsIDAsIDMsIDAsIDEsIDAsIDEsIDEsIDApOworCUFEREVOVFJZICgzLCAwLCAzLCAwLCAxLCAwLCAyNDMsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAzLCAwLCAxLCAwLCAxNDQwLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMywgMCwgMSwgMSwgMzIsIDEsIDEpOworI2VuZGlmCisKKyNpZmRlZiBWSURFT19NT0RFX1BBTAorCisjaWYgZGVmaW5lZChDT05GSUdfUlJWSVNJT04pCisKKyNkZWZpbmUgSFBXICAgMTYwICAvKiBob3Jpem9udGFsIHB1bHNlIHdpZHRoICh3YXMgMTM5KQkqLworI2RlZmluZSBWUFcJMiAgLyogdmVydGljYWwgcHVsc2Ugd2lkdGgJCSovCisjZGVmaW5lIEhCUCAgIDEwNCAgLyogaG9yaXpvbnRhbCBiYWNrIHBvcmNoICh3YXMgMTEyKQkqLworI2RlZmluZSBWQlAgICAgMTkgIC8qIHZlcnRpY2FsIGJhY2sgcG9yY2ggKHdhcyAxOSkJKi8KKyNkZWZpbmUgVklEX1IgMjQwICAvKiBudW1iZXIgb2Ygcm93cwkJCSovCisKKwlkZWJ1ZyAoIltWSURFTyBDVFJMXSBTdGFydGluZyB0byBhZGQgY29udHJvbGxlciBlbnRyaWVzLi4uIik7CisvKgorICogRXZlbiBmaWVsZAorICovCisJQURERU5UUlkgKDAsIDMsIDAsIDMsIDEsIDAsIDIsIDAsIDApOworCUFEREVOVFJZICgwLCAwLCAwLCAzLCAxLCAwLCBIUFcsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAzLCAxLCAwLCBIQlAgKyAoVklERU9fQ09MUyAqIDIpICsgNzIsIDAsIDApOworCisJQURERU5UUlkgKDAsIDAsIDAsIDMsIDEsIDAsIFZQVywgMSwgMCk7CisJQURERU5UUlkgKDAsIDAsIDAsIDMsIDEsIDAsIEhQVy0xLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMCwgMywgMSwgMCwgSEJQICsgKFZJREVPX0NPTFMgKiAyKSArIDcyLCAxLCAwKTsKKworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCBWQlAsIDEsIDApOworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCBIUFctMSwgMCwgMCk7CisJQURERU5UUlkgKDMsIDMsIDAsIDMsIDEsIDAsIEhCUCArIChWSURFT19DT0xTICogMikgKyA3MiwgMSwgMCk7CisvKgorICogQWN0aXZlIGFyZWEKKyAqLworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCBWSURfUiAsIDEsIDApOworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCBIUFctMSwgMCwgMCk7CisJQURERU5UUlkgKDMsIDMsIDAsIDMsIDEsIDAsIEhCUCwgMCwgMCk7CisJQURERU5UUlkgKDMsIDMsIDAsIDMsIDAsIDAsIFZJREVPX0NPTFMqMiwgMCwgMCk7CisJQURERU5UUlkgKDMsIDMsIDAsIDMsIDEsIDAsIDcyLCAxLCAxKTsKKworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCA1MSwgMSwgMCk7CisJQURERU5UUlkgKDAsIDMsIDAsIDMsIDEsIDAsIEhQVy0xLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMywgMCwgMywgMSwgMCwgSEJQICsoVklERU9fQ09MUyAqIDIpICsgNzIgLCAxLCAwKTsKKy8qCisgKiBPZGQgZmllbGQKKyAqLworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCAyLCAwLCAwKTsKKwlBRERFTlRSWSAoMCwgMCwgMCwgMywgMSwgMCwgSFBXLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMCwgMywgMSwgMCwgSEJQICsgKFZJREVPX0NPTFMgKiAyKSArIDcyLCAwLCAwKTsKKworCUFEREVOVFJZICgwLCAwLCAwLCAzLCAxLCAwLCBWUFcrMSwgMSwgMCk7CisJQURERU5UUlkgKDAsIDAsIDAsIDMsIDEsIDAsIEhQVy0xLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMCwgMywgMSwgMCwgSEJQICsgKFZJREVPX0NPTFMgKiAyKSArIDcyLCAxLCAwKTsKKworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCBWQlAsIDEsIDApOworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCBIUFctMSwgMCwgMCk7CisJQURERU5UUlkgKDMsIDMsIDAsIDMsIDEsIDAsIEhCUCArIChWSURFT19DT0xTICogMikgKyA3MiwgMSwgMCk7CisvKgorICogQWN0aXZlIGFyZWEKKyAqLworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCBWSURfUiAsIDEsIDApOworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCBIUFctMSwgMCwgMCk7CisJQURERU5UUlkgKDMsIDMsIDAsIDMsIDEsIDAsIEhCUCwgMCwgMCk7CisJQURERU5UUlkgKDMsIDMsIDAsIDMsIDAsIDAsIFZJREVPX0NPTFMqMiwgMCwgMCk7CisJQURERU5UUlkgKDMsIDMsIDAsIDMsIDEsIDAsIDcyLCAxLCAxKTsKKworCUFEREVOVFJZICgwLCAzLCAwLCAzLCAxLCAwLCA1MSwgMSwgMCk7CisJQURERU5UUlkgKDAsIDMsIDAsIDMsIDEsIDAsIEhQVy0xLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMywgMCwgMywgMSwgMCwgSEJQICsoVklERU9fQ09MUyAqIDIpICsgNzIgLCAxLCAwKTsKKworCWRlYnVnICgiZG9uZVxuIik7CisKKyNlbHNlICAvKiAhQ09ORklHX1JSVklTSU9OICovCisKKy8qCisgKglIeCBWeCBGeCBCeCBWRFMgSU5UIExDWUMgTFAgTFNUCisgKgorICogdmVydGljYWw7IGJsYW5raW5nCisgKi8KKwlBRERFTlRSWSAoMCwgMCwgMCwgMCwgMSwgMCwgMjIsIDEsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAwLCAxLCAwLCAyNjMsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAwLCAxLCAwLCAxNDQwLCAwLCAwKTsKKwlBRERFTlRSWSAoMywgMCwgMCwgMCwgMSwgMCwgMjQsIDEsIDApOworLyoKKyAqIGFjdGl2ZSBhcmVhIChUT1ApCisgKi8KKwlpZiAoWTEgPiAwKSB7CisJCUFEREVOVFJZICgwLCAwLCAwLCAwLCAxLCAwLCBZMSwgMSwgMCk7CS8qIDExPyAqLworCQlBRERFTlRSWSAoMywgMCwgMCwgMCwgMSwgMCwgMjU1LCAwLCAwKTsKKwkJQURERU5UUlkgKDMsIDAsIDAsIDMsIDEsIDAsIDE0NDgsIDAsIDApOworCQlBRERFTlRSWSAoMywgMCwgMCwgMCwgMSwgMCwgMjQsIDEsIDApOworCX0KKy8qCisgKiBmaWVsZCBhY3RpdmUgYXJlYSAoQ0VOVEVSKQorICovCisJQURERU5UUlkgKDAsIDAsIDAsIDAsIDEsIDAsIDI4OCAtIERZLCAxLCAwKTsJLyogMjY1PyAqLworCUFEREVOVFJZICgzLCAwLCAwLCAwLCAxLCAwLCAyNTUsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAzLCAxLCAwLCA4ICsgWDEsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAzLCAwLCAwLCBWSURFT19DT0xTICogMiwgMCwgMCk7CisKKwlpZiAoWDIgPiAwKQorCQlBRERFTlRSWSAoMywgMCwgMCwgMSwgMSwgMCwgWDIsIDAsIDApOworCisJQURERU5UUlkgKDMsIDAsIDAsIDAsIDEsIDAsIDI0LCAxLCAwKTsKKy8qCisgKiBmaWVsZCBhY3RpdmUgYXJlYSAoQk9UVE9NKQorICovCisJaWYgKFkyID4gMCkgeworCQlBRERFTlRSWSAoMCwgMCwgMCwgMCwgMSwgMCwgWTIsIDEsIDApOwkvKiAxMj8gKi8KKwkJQURERU5UUlkgKDMsIDAsIDAsIDAsIDEsIDAsIDI1NSwgMCwgMCk7CisJCUFEREVOVFJZICgzLCAwLCAwLCAzLCAxLCAwLCAxNDQ4LCAwLCAwKTsKKwkJQURERU5UUlkgKDMsIDAsIDAsIDAsIDEsIDAsIDI0LCAxLCAwKTsKKwl9CisvKgorICogZmllbGQgdmVydGljYWw7IGJsYW5raW5nCisgKi8KKwlBRERFTlRSWSAoMCwgMCwgMCwgMCwgMSwgMCwgMiwgMSwgMCk7CisJQURERU5UUlkgKDMsIDAsIDAsIDAsIDEsIDAsIDI2MywgMCwgMCk7CisJQURERU5UUlkgKDMsIDAsIDAsIDAsIDEsIDAsIDE0NDAsIDAsIDApOworCUFEREVOVFJZICgzLCAwLCAwLCAwLCAxLCAwLCAyNCwgMSwgMCk7CisvKgorICogQ3JlYXRlIHRoZSBvdGhlciBmaWVsZCAobGlrZSB0aGlzLCBidXQgd2hpdCBvdGhlciBmaWVsZCBzZWxlY3RlZCwKKyAqIG9uZSBtb3JlIGN5Y2xlIGxvb3AgYW5kIGEgbGFzdCBpZGVudGlmaWVyKQorICovCisJdmlkZW9fbW9kZV9kdXBlZmllbGQgKHZyLCAmdnJbZW50cnldLCBlbnRyeSk7CisjZW5kaWYgLyogQ09ORklHX1JSVklTSU9OICovCisKKyNlbmRpZiAvKiBWSURFT19NT0RFX1BBTCAqLworCisJLyogU2VlIHdoYXQgRklGTyBhcmUgd2UgdXNpbmcgKi8KKwlmaWZvID0gR0VUQklUIChpbW1hcC0+aW1fdmlkLnZpZF92c3IsIFZJREVPX1ZTUl9DQVMpOworCisJLyogU2V0IG51bWJlciBvZiBsaW5lcyBhbmQgYnVyc3QgKG9ubHkgb25lIGZyYW1lIGZvciBub3cpICovCisJaWYgKGZpZm8pIHsKKwkJaW1tYXAtPmltX3ZpZC52aWRfdmZjcjAgPSBWSURFT19CVVJTVF9MRU4gfAorCQkJKFZJREVPX0JVUlNUX0xFTiA8PCA4KSB8ICgoVklERU9fUk9XUyAvIDIpIDw8IDE5KTsKKwl9IGVsc2UgeworCQlpbW1hcC0+aW1fdmlkLnZpZF92ZmNyMSA9IFZJREVPX0JVUlNUX0xFTiB8CisJCQkoVklERU9fQlVSU1RfTEVOIDw8IDgpIHwgKChWSURFT19ST1dTIC8gMikgPDwgMTkpOworCX0KKworCVNFVEJJVCAoaW1tYXAtPmltX3ZpZC52aWRfdmNtciwgVklERU9fVkNNUl9BU0VMLCAhZmlmbyk7CisKKy8qCisgKiBXYWl0IHVudGlsIGNoYW5nZXMgYXJlIGFwcGxpZWQgKG5vdCBkb25lKQorICogd2hpbGUgKEdFVEJJVChpbW1hcC0+aW1fdmlkLnZpZF92c3IsIFZJREVPX1ZTUl9DQVMpID09IGZpZm8pIDsKKyAqLworCisJLyogUmV0dXJuIG51bWJlciBvZiBWUkFNIGVudHJpZXMgKi8KKwlyZXR1cm4gZW50cnkgKiAyOworfQorCitzdGF0aWMgdm9pZCB2aWRlb19lbmNvZGVyX2luaXQgKHZvaWQpCit7CisjaWZkZWYgVklERU9fSTJDCisJaW50IHJjOworCisJLyogSW5pdGlhbGl6ZSB0aGUgSTJDICovCisJZGVidWcgKCJbVklERU8gRU5DT0RFUl0gSW5pdGlhbGl6aW5nIEkyQyBidXMuLi5cbiIpOworCWkyY19pbml0IChDT05GSUdfU1lTX0kyQ19TUEVFRCwgQ09ORklHX1NZU19JMkNfU0xBVkUpOworCisjaWZkZWYgQ09ORklHX0ZBRFMKKwkvKiBSZXNldCBBRFY3MTc2IGNoaXAgKi8KKwlkZWJ1ZyAoIltWSURFTyBFTkNPREVSXSBSZXNldHRpbmcgZW5jb2Rlci4uLlxuIik7CisJKCooaW50ICopIEJDU1I0KSAmPSB+KDEgPDwgMjEpOworCisJLyogV2FpdCBmb3IgNSBtcyBpbnNpZGUgdGhlIHJlc2V0ICovCisJZGVidWcgKCJbVklERU8gRU5DT0RFUl0gV2FpdGluZyBmb3IgZW5jb2RlciByZXNldC4uLlxuIik7CisJdWRlbGF5ICg1MDAwKTsKKworCS8qIFRha2UgQURWNzE3NiBvdXQgb2YgcmVzZXQgKi8KKwkoKihpbnQgKikgQkNTUjQpIHw9IDEgPDwgMjE7CisKKwkvKiBXYWl0IGZvciA1IG1zIGFmdGVyIHRoZSByZXNldCAqLworCXVkZWxheSAoNTAwMCk7CisjZW5kaWYJLyogQ09ORklHX0ZBRFMgKi8KKworCS8qIFNlbmQgY29uZmlndXJhdGlvbiAqLworI2lmZGVmIERFQlVHCisJeworCQlpbnQgaTsKKworCQlwdXRzICgiW1ZJREVPIEVOQ09ERVJdIENvbmZpZ3VyaW5nIHRoZSBlbmNvZGVyLi4uXG4iKTsKKworCQlwcmludGYgKCJTZW5kaW5nICV6dSBieXRlcyAoQCAlMDhsWCkgdG8gSTJDIDB4JWxYOlxuICAgIiwKKwkJCXNpemVvZih2aWRlb19lbmNvZGVyX2RhdGEpLAorCQkJKHVsb25nKXZpZGVvX2VuY29kZXJfZGF0YSwKKwkJCSh1bG9uZylWSURFT19JMkNfQUREUik7CisJCWZvciAoaT0wOyBpPHNpemVvZih2aWRlb19lbmNvZGVyX2RhdGEpOyArK2kpIHsKKwkJCXByaW50ZigiICUwMlgiLCB2aWRlb19lbmNvZGVyX2RhdGFbaV0pOworCQl9CisJCXB1dGMgKCdcbicpOworCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCisJaWYgKChyYyA9IGkyY193cml0ZSAoVklERU9fSTJDX0FERFIsIDAsIDEsCisJCQkgdmlkZW9fZW5jb2Rlcl9kYXRhLAorCQkJIHNpemVvZih2aWRlb19lbmNvZGVyX2RhdGEpKSkgIT0gMCkgeworCQlwcmludGYgKCJpMmNfc2VuZCBlcnJvcjogcmM9JWRcbiIsIHJjKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgkvKiBWSURFT19JMkMgKi8KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHZpZGVvX2N0cmxfaW5pdCAodm9pZCAqbWVtcHRyKQoreworCWltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCisJdmlkZW9fZmJfYWRkcmVzcyA9IG1lbXB0cjsKKworCS8qIFNldCBiYWNrZ3JvdW5kICovCisJZGVidWcgKCJbVklERU8gQ1RSTF0gU2V0dGluZyBiYWNrZ3JvdW5kIGNvbG9yLi4uXG4iKTsKKwlpbW1hcC0+aW1fdmlkLnZpZF92YmNiID0gVklERU9fQkdfQ09MOworCisJLyogU2hvdyB0aGUgYmFja2dyb3VuZCAqLworCWRlYnVnICgiW1ZJREVPIENUUkxdIEZvcmNpbmcgYmFja2dyb3VuZC4uLlxuIik7CisJU0VUQklUIChpbW1hcC0+aW1fdmlkLnZpZF92Y21yLCBWSURFT19WQ01SX0JELCAxKTsKKworCS8qIFR1cm4gb2ZmIHZpZGVvIGNvbnRyb2xsZXIgKi8KKwlkZWJ1ZyAoIltWSURFTyBDVFJMXSBUdXJuaW5nIG9mZiB2aWRlbyBjb250cm9sbGVyLi4uXG4iKTsKKwlTRVRCSVQgKGltbWFwLT5pbV92aWQudmlkX3ZjY3IsIFZJREVPX1ZDQ1JfVk9OLCAwKTsKKworI2lmZGVmIENPTkZJR19GQURTCisJLyogVHVybiBvbiBWaWRlbyBQb3J0IExFRCAqLworCWRlYnVnICgiW1ZJREVPIENUUkxdIFR1cm5pbmcgb2ZmIHZpZGVvIHBvcnQgbGVkLi4uXG4iKTsKKwlTRVRCSVQgKCooaW50ICopIEJDU1I0LCBWSURFT19CQ1NSNF9WSURMRURfQklULCAxKTsKKworCS8qIERpc2FibGUgaW50ZXJuYWwgY2xvY2sgKi8KKwlkZWJ1ZyAoIltWSURFTyBDVFJMXSBEaXNhYmxpbmcgaW50ZXJuYWwgY2xvY2suLi5cbiIpOworCVNFVEJJVCAoKihpbnQgKikgQkNTUjQsIFZJREVPX0JDU1I0X0VYVENMS19CSVQsIDApOworI2VuZGlmCisKKwkvKiBHZW5lcmF0ZSBhbmQgbWFrZSBhY3RpdmUgYSBuZXcgdmlkZW8gbW9kZSAqLworCWRlYnVnICgiW1ZJREVPIENUUkxdIEdlbmVyYXRpbmcgdmlkZW8gbW9kZS4uLlxuIik7CisJdmlkZW9fbW9kZV9nZW5lcmF0ZSAoKTsKKworCS8qIFN0YXJ0IG9mIGZyYW1lIGJ1ZmZlciAoZXZlbiBhbmQgb2RkIGZyYW1lLCB0byBtYWtlIGl0IHdvcmtpbmcgd2l0aCAqLworCS8qIGFueSBzZWxlY3RlZCBhY3RpdmUgc2V0KSAqLworCWRlYnVnICgiW1ZJREVPIENUUkxdIFNldHRpbmcgZnJhbWUgYnVmZmVyIGFkZHJlc3MuLi5cbiIpOworCWltbWFwLT5pbV92aWQudmlkX3ZmYWExID0KKwkJaW1tYXAtPmltX3ZpZC52aWRfdmZhYTAgPSAodTMyKSB2aWRlb19mYl9hZGRyZXNzOworCWltbWFwLT5pbV92aWQudmlkX3ZmYmExID0KKwlpbW1hcC0+aW1fdmlkLnZpZF92ZmJhMCA9CisJCSh1MzIpIHZpZGVvX2ZiX2FkZHJlc3MgKyBWSURFT19MSU5FX0xFTjsKKworCS8qIFlVViwgQmlnIGVuZGlhbiwgU0hJRlQvQ0xLL0NMSyBpbnB1dCAoQkVGT1JFIEVOQUJMSU5HIDI3TUhaIEVYVCBDTE9DSykgKi8KKwlkZWJ1ZyAoIltWSURFTyBDVFJMXSBTZXR0aW5nIHBpeGVsIG1vZGUgYW5kIGNsb2Nrcy4uLlxuIik7CisJaW1tYXAtPmltX3ZpZC52aWRfdmNjciA9IDB4MjA0MjsKKworCS8qIENvbmZpZ3VyZSBwb3J0IHBpbnMgKi8KKwlkZWJ1ZyAoIltWSURFTyBDVFJMXSBDb25maWd1cmluZyBpbnB1dC9vdXRwdXQgcGlucy4uLlxuIik7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGRwYXIgPSAweDFmZmY7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGRkaXIgPSAweDAwMDA7CisKKyNpZmRlZiBDT05GSUdfRkFEUworCS8qIFR1cm4gb24gVmlkZW8gUG9ydCBDbG9jayAtIE9OTFkgQUZURVIgU0VUIFZDQ1IgVE8gRU5BQkxFIEVYVEVSTkFMIENMT0NLICovCisJZGVidWcgKCJbVklERU8gQ1RSTF0gVHVybmluZyBvbiB2aWRlbyBjbG9jay4uLlxuIik7CisJU0VUQklUICgqKGludCAqKSBCQ1NSNCwgVklERU9fQkNTUjRfRVhUQ0xLX0JJVCwgMSk7CisKKwkvKiBUdXJuIG9uIFZpZGVvIFBvcnQgTEVEICovCisJZGVidWcgKCJbVklERU8gQ1RSTF0gVHVybmluZyBvbiB2aWRlbyBwb3J0IGxlZC4uLlxuIik7CisJU0VUQklUICgqKGludCAqKSBCQ1NSNCwgVklERU9fQkNTUjRfVklETEVEX0JJVCwgMCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUlJWSVNJT04KKwlkZWJ1ZyAoIlBDNS0+T3V0cHV0KDEpOiBlbmFibGUgUEFMIGNsb2NrIik7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNwYXIgJj0gfigweDA0MDApOworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGlyIHw9ICAgMHgwNDAwIDsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RhdCB8PSAgIDB4MDQwMCA7CisJZGVidWcgKCJQRFBBUj0weCUwNFggUERESVI9MHglMDRYIFBEREFUPTB4JTA0WFxuIiwKKwkgICAgICAgaW1tYXAtPmltX2lvcG9ydC5pb3BfcGRwYXIsCisJICAgICAgIGltbWFwLT5pbV9pb3BvcnQuaW9wX3BkZGlyLAorCSAgICAgICBpbW1hcC0+aW1faW9wb3J0LmlvcF9wZGRhdCk7CisJZGVidWcgKCJQQ1BBUj0weCUwNFggUENESVI9MHglMDRYIFBDREFUPTB4JTA0WFxuIiwKKwkgICAgICAgaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNwYXIsCisJICAgICAgIGltbWFwLT5pbV9pb3BvcnQuaW9wX3BjZGlyLAorCSAgICAgICBpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RhdCk7CisjZW5kaWYJLyogQ09ORklHX1JSVklTSU9OICovCisKKwkvKiBCbGFua2luZyB0aGUgc2NyZWVuLiAqLworCWRlYnVnICgiW1ZJREVPIENUUkxdIEJsYW5raW5nIHRoZSBzY3JlZW4uLi5cbiIpOworCXZpZGVvX2ZpbGwgKFZJREVPX0JHX0NPTCk7CisKKwkvKgorCSAqIFR1cm5zIG9uIEFnZ3Jlc3NpdmUgTW9kZS4gTm9ybWFsbHksIHR1cm5pbmcgb24gdGhlIGNhY2hlcworCSAqIHdpbGwgY2F1c2UgdGhlIHNjcmVlbiB0byBmbGlja2VyIHdoZW4gdGhlIGNhY2hlcyB0cnkgdG8KKwkgKiBmaWxsLiBUaGlzIGdpdmVzIHRoZSBGSUZPJ3MgZm9yIHRoZSBWaWRlbyBDb250cm9sbGVyCisJICogaGlnaGVyIHByaW9yaXR5IGFuZCBwcmV2ZW50cyBmbGlja2VyaW5nIGJlY2F1c2Ugb2YKKwkgKiB1bmRlcnJ1bi4gVGhpcyBtYXkgc3RpbGwgYmUgYW4gaXNzdWUgd2hlbiB1c2luZyBGTEFTSCwKKwkgKiBzaW5jZSBhY2Nlc3NpbmcgZGF0YSBmcm9tIEZsYXNoIGlzIHNvIHNsb3cuCisJICovCisJZGVidWcgKCJbVklERU8gQ1RSTF0gVHVybmluZyBvbiBhZ2dyZXNzaXZlIG1vZGUuLi5cbiIpOworCWltbWFwLT5pbV9zaXVfY29uZi5zY19zZGNyID0gMHg0MDsKKworCS8qIFR1cm4gb24gdmlkZW8gY29udHJvbGxlciAqLworCWRlYnVnICgiW1ZJREVPIENUUkxdIFR1cm5pbmcgb24gdmlkZW8gY29udHJvbGxlci4uLlxuIik7CisJU0VUQklUIChpbW1hcC0+aW1fdmlkLnZpZF92Y2NyLCBWSURFT19WQ0NSX1ZPTiwgMSk7CisKKwkvKiBTaG93IHRoZSBkaXNwbGF5ICovCisJZGVidWcgKCJbVklERU8gQ1RSTF0gRW5hYmxpbmcgdGhlIHZpZGVvLi4uXG4iKTsKKwlTRVRCSVQgKGltbWFwLT5pbV92aWQudmlkX3ZjbXIsIFZJREVPX1ZDTVJfQkQsIDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKiogQ09OU09MRSBGVU5DVElPTlMJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNvbnNvbGVfc2Nyb2xsdXAgKHZvaWQpCit7CisJLyogQ29weSB1cCByb3dzIGlnbm9yaW5nIHRoZSBmaXJzdCBvbmUgKi8KKwltZW1jcHlsIChDT05TT0xFX1JPV19GSVJTVCwgQ09OU09MRV9ST1dfU0VDT05ELCBDT05TT0xFX1NDUk9MTF9TSVpFID4+IDIpOworCisJLyogQ2xlYXIgdGhlIGxhc3Qgb25lICovCisJbWVtc2V0bCAoQ09OU09MRV9ST1dfTEFTVCwgQ09OU09MRV9ST1dfU0laRSA+PiAyLCBWSURFT19CR19DT0wpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29uc29sZV9iYWNrICh2b2lkKQoreworCWNvbnNvbGVfY29sLS07CisKKwlpZiAoY29uc29sZV9jb2wgPCAwKSB7CisJCWNvbnNvbGVfY29sID0gQ09OU09MRV9DT0xTIC0gMTsKKwkJY29uc29sZV9yb3ctLTsKKwkJaWYgKGNvbnNvbGVfcm93IDwgMCkKKwkJCWNvbnNvbGVfcm93ID0gMDsKKwl9CisKKwl2aWRlb19wdXRjaGFyICggY29uc29sZV9jb2wgKiBWSURFT19GT05UX1dJRFRILAorCQkJY29uc29sZV9yb3cgKiBWSURFT19GT05UX0hFSUdIVCwgJyAnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbnNvbGVfbmV3bGluZSAodm9pZCkKK3sKKwljb25zb2xlX3JvdysrOworCWNvbnNvbGVfY29sID0gMDsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc2Nyb2xsIHRoZSB0ZXJtaW5hbCAqLworCWlmIChjb25zb2xlX3JvdyA+PSBDT05TT0xFX1JPV1MpIHsKKwkJLyogU2Nyb2xsIGV2ZXJ5dGhpbmcgdXAgKi8KKwkJY29uc29sZV9zY3JvbGx1cCAoKTsKKworCQkvKiBEZWNyZW1lbnQgcm93IG51bWJlciAqLworCQljb25zb2xlX3Jvdy0tOworCX0KK30KKwordm9pZCB2aWRlb19wdXRjIChjb25zdCBjaGFyIGMpCit7CisJaWYgKCF2aWRlb19lbmFibGUpIHsKKwkJc2VyaWFsX3B1dGMgKGMpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChjKSB7CisJY2FzZSAxMzoJCQkvKiBTaW1wbHkgaWdub3JlIHRoaXMgKi8KKwkJYnJlYWs7CisKKwljYXNlICdcbic6CQkJLyogTmV4dCBsaW5lLCBwbGVhc2UgKi8KKwkJY29uc29sZV9uZXdsaW5lICgpOworCQlicmVhazsKKworCWNhc2UgOToJCQkJLyogVGFiICg4IGNoYXJzIGFsaWdubWVudCkgKi8KKwkJY29uc29sZV9jb2wgfD0gMHgwMDA4OwkvKiBOZXh0IDggY2hhcnMgYm91bmRhcnkgKi8KKwkJY29uc29sZV9jb2wgJj0gfjB4MDAwNzsJLyogU2V0IHRoaXMgYml0IHRvIHplcm8gKi8KKworCQlpZiAoY29uc29sZV9jb2wgPj0gQ09OU09MRV9DT0xTKQorCQkJY29uc29sZV9uZXdsaW5lICgpOworCQlicmVhazsKKworCWNhc2UgODoJCQkJLyogRWF0IGxhc3QgY2hhcmFjdGVyICovCisJCWNvbnNvbGVfYmFjayAoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJCS8qIEFkZCB0byB0aGUgY29uc29sZSAqLworCQl2aWRlb19wdXRjaGFyICggY29uc29sZV9jb2wgKiBWSURFT19GT05UX1dJRFRILAorCQkJCWNvbnNvbGVfcm93ICogVklERU9fRk9OVF9IRUlHSFQsIGMpOworCQljb25zb2xlX2NvbCsrOworCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGdvIHRvIG5leHQgcm93ICovCisJCWlmIChjb25zb2xlX2NvbCA+PSBDT05TT0xFX0NPTFMpCisJCQljb25zb2xlX25ld2xpbmUgKCk7CisJfQorfQorCit2b2lkIHZpZGVvX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGNvdW50ID0gc3RybGVuIChzKTsKKworCWlmICghdmlkZW9fZW5hYmxlKQorCQl3aGlsZSAoY291bnQtLSkKKwkJCXNlcmlhbF9wdXRjICgqcysrKTsKKwllbHNlCisJCXdoaWxlIChjb3VudC0tKQorCQkJdmlkZW9fcHV0YyAoKnMrKyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBDVVJTT1IgQkxJTktJTkcgRlVOQ1RJT05TCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBWSURFT19CTElOSworCisjZGVmaW5lIEJMSU5LX1RJTUVSX0lECQkwCisjZGVmaW5lIEJMSU5LX1RJTUVSX0haCQkyCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJsaW5rX2VuYWJsZWQgPSAwOworc3RhdGljIHRpbWVyX3QgYmxpbmtfdGltZXI7CisKK3N0YXRpYyB2b2lkIGJsaW5rX3VwZGF0ZSAodm9pZCkKK3sKKwlzdGF0aWMgaW50IGJsaW5rX3JvdyA9IC0xLCBibGlua19jb2wgPSAtMSwgYmxpbmtfb2xkID0gMDsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBuZXcgcG9zaXRpb24gdG8gaW52ZXJ0ICovCisJaWYgKChjb25zb2xlX3JvdyAhPSBibGlua19yb3cpIHx8IChjb25zb2xlX2NvbCAhPSBibGlua19jb2wpKSB7CisJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gcmV2ZXJzZSBsYXN0IGNoYXJhY3RlciAqLworCQlpZiAoYmxpbmtfb2xkKQorCQkJdmlkZW9fcmV2Y2hhciAoIGJsaW5rX2NvbCAqIFZJREVPX0ZPTlRfV0lEVEgsCisJCQkJCShibGlua19yb3cKKyNpZmRlZiBDT05GSUdfVklERU9fTE9HTworCQkJCQkgKyBWSURFT19MT0dPX0hFSUdIVAorI2VuZGlmCisJCQkJCSkgKiBWSURFT19GT05UX0hFSUdIVCk7CisKKwkJLyogVXBkYXRlIHZhbHVlcyAqLworCQlibGlua19yb3cgPSBjb25zb2xlX3JvdzsKKwkJYmxpbmtfY29sID0gY29uc29sZV9jb2w7CisJCWJsaW5rX29sZCA9IDA7CisJfQorCisvKiBSZXZlcnNlIHRoaXMgY2hhcmFjdGVyICovCisJYmxpbmtfb2xkID0gIWJsaW5rX29sZDsKKwl2aWRlb19yZXZjaGFyICggY29uc29sZV9jb2wgKiBWSURFT19GT05UX1dJRFRILAorCQkJKGNvbnNvbGVfcm93CisjaWZkZWYgQ09ORklHX1ZJREVPX0xPR08KKwkJCSsgVklERU9fTE9HT19IRUlHSFQKKyNlbmRpZgorCQkJKSAqIFZJREVPX0ZPTlRfSEVJR0hUKTsKKworfQorCisvKgorICogSGFuZGxlciBmb3IgYmxpbmtpbmcgY3Vyc29yCisgKi8KK3N0YXRpYyB2b2lkIGJsaW5rX2hhbmRsZXIgKHZvaWQgKmFyZykKK3sKKy8qIEJsaW5rICovCisJYmxpbmtfdXBkYXRlICgpOworLyogQWNrIHRoZSB0aW1lciAqLworCXRpbWVyX2FjayAoJmJsaW5rX3RpbWVyKTsKK30KKworaW50IGJsaW5rX3NldCAoaW50IGJsaW5rKQoreworCWludCByZXQgPSBibGlua19lbmFibGVkOworCisJaWYgKGJsaW5rKQorCQl0aW1lcl9lbmFibGUgKCZibGlua190aW1lcik7CisJZWxzZQorCQl0aW1lcl9kaXNhYmxlICgmYmxpbmtfdGltZXIpOworCisJYmxpbmtfZW5hYmxlZCA9IGJsaW5rOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJsaW5rX2Nsb3NlICh2b2lkKQoreworCXRpbWVyX2Nsb3NlICgmYmxpbmtfdGltZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmxpbmtfaW5pdCAodm9pZCkKK3sKKwl0aW1lcl9pbml0ICgmYmxpbmtfdGltZXIsCisJCQlCTElOS19USU1FUl9JRCwgQkxJTktfVElNRVJfSFosCisJCQlibGlua19oYW5kbGVyKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKiogTE9HTyBQTE9UVElORyBGVU5DVElPTlMJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19WSURFT19MT0dPCit2b2lkIGVhc3lsb2dvX3Bsb3QgKGZhc3RpbWFnZV90ICogaW1hZ2UsIHZvaWQgKnNjcmVlbiwgaW50IHdpZHRoLCBpbnQgeCwKKwkJCQkJaW50IHkpCit7CisJaW50IHNraXAgPSB3aWR0aCAtIGltYWdlLT53aWR0aCwgeGNvdW50LCB5Y291bnQgPSBpbWFnZS0+aGVpZ2h0OworCisjaWZkZWYgVklERU9fTU9ERV9ZVVlWCisJdXNob3J0ICpzb3VyY2UgPSAodXNob3J0ICopIGltYWdlLT5kYXRhOworCXVzaG9ydCAqZGVzdCAgID0gKHVzaG9ydCAqKSBzY3JlZW4gKyB5ICogd2lkdGggKyB4OworCisJd2hpbGUgKHljb3VudC0tKSB7CisJCXhjb3VudCA9IGltYWdlLT53aWR0aDsKKwkJd2hpbGUgKHhjb3VudC0tKQorCQkJKmRlc3QrKyA9ICpzb3VyY2UrKzsKKwkJZGVzdCArPSBza2lwOworCX0KKyNlbmRpZgorI2lmZGVmIFZJREVPX01PREVfUkdCCisJdW5zaWduZWQgY2hhcgorCSpzb3VyY2UgPSAodW5zaWduZWQgc2hvcnQgKikgaW1hZ2UtPmRhdGEsCisJCQkqZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBzY3JlZW4gKyAoKHkgKiB3aWR0aCkgKyB4KSAqIDM7CisKKwl3aGlsZSAoeWNvdW50LS0pIHsKKwkJeGNvdW50ID0gaW1hZ2UtPndpZHRoICogMzsKKwkJbWVtY3B5IChkZXN0LCBzb3VyY2UsIHhjb3VudCk7CisJCXNvdXJjZSArPSB4Y291bnQ7CisJCWRlc3QgKz0geWNvdW50OworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCAqdmlkZW9fbG9nbyAodm9pZCkKK3sKKwl1MTYgKnNjcmVlbiA9IHZpZGVvX2ZiX2FkZHJlc3MsIHdpZHRoID0gVklERU9fQ09MUzsKKyNpZmRlZiBWSURFT19JTkZPCisjIGlmbmRlZiBDT05GSUdfRkFEUworCWNoYXIgdGVtcFszMl07CisjIGVuZGlmCisJY2hhciBpbmZvWzgwXTsKKyNlbmRpZiAvKiBWSURFT19JTkZPICovCisKKwllYXN5bG9nb19wbG90IChWSURFT19MT0dPX0FERFIsIHNjcmVlbiwgd2lkdGgsIDAsIDApOworCisjaWZkZWYgVklERU9fSU5GTworCXNwcmludGYgKGluZm8sICIlcyAoJXMgLSAlcykgIiwKKwkJIFVfQk9PVF9WRVJTSU9OLCBVX0JPT1RfREFURSwgVV9CT09UX1RJTUUpOworCXZpZGVvX2RyYXdzdHJpbmcgKFZJREVPX0lORk9fWCwgVklERU9fSU5GT19ZLCBpbmZvKTsKKworCXNwcmludGYgKGluZm8sICIoQykgMjAwMiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIik7CisJdmlkZW9fZHJhd3N0cmluZyAoVklERU9fSU5GT19YLCBWSURFT19JTkZPX1kgKyBWSURFT19GT05UX0hFSUdIVCwKKwkJCQkJaW5mbyk7CisKKwlzcHJpbnRmIChpbmZvLCAiICAgIFdvbGZnYW5nIERFTkssIHdkQGRlbnguZGUiKTsKKwl2aWRlb19kcmF3c3RyaW5nIChWSURFT19JTkZPX1gsIFZJREVPX0lORk9fWSArIFZJREVPX0ZPTlRfSEVJR0hUICogMiwKKwkJCQkJaW5mbyk7CisjaWZuZGVmIENPTkZJR19GQURTCQkvKiBhbGwgbm9ybWFsIGJvYXJkcyAqLworCS8qIGxlYXZlIG9uZSBibGFuayBsaW5lICovCisKKwlzcHJpbnRmIChpbmZvLCAiTVBDODIzIENQVSBhdCAlcyBNSHosICVsZCBNQiBSQU0sICVsZCBNQiBGbGFzaCIsCisJCXN0cm1oeih0ZW1wLCBnZC0+Y3B1X2NsayksCisJCWdkLT5yYW1fc2l6ZSA+PiAyMCwKKwkJZ2QtPmJkLT5iaV9mbGFzaHNpemUgPj4gMjAgKTsKKwl2aWRlb19kcmF3c3RyaW5nIChWSURFT19JTkZPX1gsIFZJREVPX0lORk9fWSArIFZJREVPX0ZPTlRfSEVJR0hUICogNCwKKwkJCQkJaW5mbyk7CisjZWxzZQkJCQkvKiBGQURTIDotKCAqLworCXNwcmludGYgKGluZm8sICJNUEM4MjMgQ1BVIGF0IDUwIE1IeiBvbiBGQURTODIzIGJvYXJkIik7CisJdmlkZW9fZHJhd3N0cmluZyAoVklERU9fSU5GT19YLCBWSURFT19JTkZPX1kgKyBWSURFT19GT05UX0hFSUdIVCwKKwkJCQkJICBpbmZvKTsKKworCXNwcmludGYgKGluZm8sICIyTUIgRkxBU0ggLSA4TUIgRFJBTSAtIDRNQiBTUkFNIik7CisJdmlkZW9fZHJhd3N0cmluZyAoVklERU9fSU5GT19YLCBWSURFT19JTkZPX1kgKyBWSURFT19GT05UX0hFSUdIVCAqIDIsCisJCQkJCSAgaW5mbyk7CisjZW5kaWYKKyNlbmRpZgorCisJcmV0dXJuIHZpZGVvX2ZiX2FkZHJlc3MgKyBWSURFT19MT0dPX0hFSUdIVCAqIFZJREVPX0xJTkVfTEVOOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBWSURFTyBISUdILUxFVkVMIEZVTkNUSU9OUwkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdmlkZW9faW5pdCAodm9pZCAqdmlkZW9iYXNlKQoreworCS8qIEluaXRpYWxpemUgdGhlIGVuY29kZXIgKi8KKwlkZWJ1ZyAoIltWSURFT10gSW5pdGlhbGl6aW5nIHZpZGVvIGVuY29kZXIuLi5cbiIpOworCXZpZGVvX2VuY29kZXJfaW5pdCAoKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHZpZGVvIGNvbnRyb2xsZXIgKi8KKwlkZWJ1ZyAoIltWSURFT10gSW5pdGlhbGl6aW5nIHZpZGVvIGNvbnRyb2xsZXIgYXQgJTA4eC4uLlxuIiwKKwkJICAgKGludCkgdmlkZW9iYXNlKTsKKwl2aWRlb19jdHJsX2luaXQgKHZpZGVvYmFzZSk7CisKKwkvKiBTZXR0aW5nIHRoZSBwYWxldHRlICovCisJdmlkZW9fc2V0cGFsZXR0ZSAgKENPTlNPTEVfQ09MT1JfQkxBQ0ssCSAgICAgMCwJICAgMCwJIDApOworCXZpZGVvX3NldHBhbGV0dGUgIChDT05TT0xFX0NPTE9SX1JFRCwJICAweEZGLAkgICAwLAkgMCk7CisJdmlkZW9fc2V0cGFsZXR0ZSAgKENPTlNPTEVfQ09MT1JfR1JFRU4sCSAgICAgMCwgMHhGRiwJIDApOworCXZpZGVvX3NldHBhbGV0dGUgIChDT05TT0xFX0NPTE9SX1lFTExPVywgIDB4RkYsIDB4RkYsCSAwKTsKKwl2aWRlb19zZXRwYWxldHRlICAoQ09OU09MRV9DT0xPUl9CTFVFLAkgICAgIDAsCSAgIDAsIDB4RkYpOworCXZpZGVvX3NldHBhbGV0dGUgIChDT05TT0xFX0NPTE9SX01BR0VOVEEsIDB4RkYsCSAgIDAsIDB4RkYpOworCXZpZGVvX3NldHBhbGV0dGUgIChDT05TT0xFX0NPTE9SX0NZQU4sCSAgICAgMCwgMHhGRiwgMHhGRik7CisJdmlkZW9fc2V0cGFsZXR0ZSAgKENPTlNPTEVfQ09MT1JfR1JFWSwJICAweEFBLCAweEFBLCAweEFBKTsKKwl2aWRlb19zZXRwYWxldHRlICAoQ09OU09MRV9DT0xPUl9HUkVZMiwJICAweEY4LCAweEY4LCAweEY4KTsKKwl2aWRlb19zZXRwYWxldHRlICAoQ09OU09MRV9DT0xPUl9XSElURSwJICAweEZGLCAweEZGLCAweEZGKTsKKworI2lmbmRlZiBDT05GSUdfU1lTX1dISVRFX09OX0JMQUNLCisJdmlkZW9fc2V0Zmdjb2xvciAoQ09OU09MRV9DT0xPUl9CTEFDSyk7CisJdmlkZW9fc2V0Ymdjb2xvciAoQ09OU09MRV9DT0xPUl9HUkVZMik7CisjZWxzZQorCXZpZGVvX3NldGZnY29sb3IgKENPTlNPTEVfQ09MT1JfR1JFWTIpOworCXZpZGVvX3NldGJnY29sb3IgKENPTlNPTEVfQ09MT1JfQkxBQ0spOworI2VuZGlmCS8qIENPTkZJR19TWVNfV0hJVEVfT05fQkxBQ0sgKi8KKworI2lmZGVmIENPTkZJR19WSURFT19MT0dPCisJLyogUGFpbnQgdGhlIGxvZ28gYW5kIHJldHJpZXZlIHR2IGJhc2UgYWRkcmVzcyAqLworCWRlYnVnICgiW1ZJREVPXSBEcmF3aW5nIHRoZSBsb2dvLi4uXG4iKTsKKwl2aWRlb19jb25zb2xlX2FkZHJlc3MgPSB2aWRlb19sb2dvICgpOworI2Vsc2UKKwl2aWRlb19jb25zb2xlX2FkZHJlc3MgPSB2aWRlb19mYl9hZGRyZXNzOworI2VuZGlmCisKKyNpZmRlZiBWSURFT19CTElOSworCS8qIEVuYWJsZSB0aGUgYmxpbmtpbmcgKHVuZGVyIGNvbnN0cnVjdGlvbikgKi8KKwlibGlua19pbml0ICgpOworCWJsaW5rX3NldCAoMCk7CQkJCS8qIFRvIEZpeCEgKi8KKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSB0aGUgY29uc29sZSAqLworCWNvbnNvbGVfY29sID0gMDsKKwljb25zb2xlX3JvdyA9IDA7CisJdmlkZW9fZW5hYmxlID0gMTsKKworI2lmZGVmIFZJREVPX01PREVfUEFMCisjIGRlZmluZSBWSURFT19NT0RFX1RNUDEJIlBBTCIKKyNlbmRpZgorI2lmZGVmIFZJREVPX01PREVfTlRTQworIyBkZWZpbmUgVklERU9fTU9ERV9UTVAxCSJOVFNDIgorI2VuZGlmCisjaWZkZWYgVklERU9fTU9ERV9ZVVlWCisjIGRlZmluZSBWSURFT19NT0RFX1RNUDIJIllDYllDciIKKyNlbmRpZgorI2lmZGVmIFZJREVPX01PREVfUkdCCisjIGRlZmluZSBWSURFT19NT0RFX1RNUDIJIlJHQiIKKyNlbmRpZgorCWRlYnVnICggVklERU9fTU9ERV9UTVAxCisJCSIgJWR4JWR4JWQgKCIgVklERU9fTU9ERV9UTVAyICIpIG9uICVzIC0gY29uc29sZSAlZHglZFxuIiwKKwkJCVZJREVPX0NPTFMsIFZJREVPX1JPV1MsIFZJREVPX01PREVfQlBQLAorCQkJVklERU9fRU5DT0RFUl9OQU1FLCBDT05TT0xFX0NPTFMsIENPTlNPTEVfUk9XUyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcnZfdmlkZW9faW5pdCAodm9pZCkKK3sKKwlpbnQgZXJyb3IsIGRldmljZXMgPSAxOworCisJc3RydWN0IHN0ZGlvX2RldiB2aWRlb2RldjsKKworCXZpZGVvX2luaXQgKCh2b2lkICopKGdkLT5mYl9iYXNlKSk7CS8qIFZpZGVvIGluaXRpYWxpemF0aW9uICovCisKKy8qIERldmljZSBpbml0aWFsaXphdGlvbiAqLworCisJbWVtc2V0ICgmdmlkZW9kZXYsIDAsIHNpemVvZiAodmlkZW9kZXYpKTsKKworCXN0cmNweSAodmlkZW9kZXYubmFtZSwgInZpZGVvIik7CisJdmlkZW9kZXYuZXh0ID0gREVWX0VYVF9WSURFTzsJLyogVmlkZW8gZXh0ZW5zaW9ucyAqLworCXZpZGVvZGV2LmZsYWdzID0gREVWX0ZMQUdTX09VVFBVVDsJLyogT3V0cHV0IG9ubHkgKi8KKwl2aWRlb2Rldi5wdXRjID0gdmlkZW9fcHV0YzsJLyogJ3B1dGMnIGZ1bmN0aW9uICovCisJdmlkZW9kZXYucHV0cyA9IHZpZGVvX3B1dHM7CS8qICdwdXRzJyBmdW5jdGlvbiAqLworCisJZXJyb3IgPSBzdGRpb19yZWdpc3RlciAoJnZpZGVvZGV2KTsKKworCXJldHVybiAoZXJyb3IgPT0gMCkgPyBkZXZpY2VzIDogZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAqKiBST00gY2FwYWJsZSBpbml0aWFsaXphdGlvbiBwYXJ0IC0gbmVlZGVkIHRvIHJlc2VydmUgRkIgbWVtb3J5CSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBpcyBjYWxsZWQgZWFybHkgaW4gdGhlIHN5c3RlbSBpbml0aWFsaXphdGlvbiB0byBncmFiIG1lbW9yeQorICogZm9yIHRoZSB2aWRlbyBjb250cm9sbGVyLgorICogUmV0dXJucyBuZXcgYWRkcmVzcyBmb3IgbW9uaXRvciwgYWZ0ZXIgcmVzZXJ2aW5nIHZpZGVvIGJ1ZmZlciBtZW1vcnkKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpcyBydW5uaW5nIGZyb20gUk9NLCBzbyBubyB3cml0ZSBhY2Nlc3MgdG8gZ2xvYmFsIGRhdGEuCisgKi8KK3Vsb25nIHZpZGVvX3NldG1lbSAodWxvbmcgYWRkcikKK3sKKwkvKiBBbGxvY2F0ZSBwYWdlcyBmb3IgdGhlIGZyYW1lIGJ1ZmZlci4gKi8KKwlhZGRyIC09IFZJREVPX1NJWkU7CisKKwlkZWJ1ZyAoIlJlc2VydmluZyAlZGsgZm9yIFZpZGVvIEZyYW1lYnVmZmVyIGF0OiAlMDhseFxuIiwKKwkJVklERU9fU0laRT4+MTAsIGFkZHIpOworCisJcmV0dXJuIChhZGRyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eC93bGtiZC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvd2xrYmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzAwOWUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHgvd2xrYmQuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBQYW9sbyBTY2FmZmFyZGksIEFJUlZFTlQgU0FNIHMucC5hIC0gUklNSU5JKElUQUxZKSwgYXJzZW5pb0B0aW4uaXQKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfV0xfNFBQTV9LRVlCT0FSRAorCisvKiBXSVA6IFdpcmVsZXNzIGtleWJvYXJkIG9uIFNNQworICovCitpbnQJZHJ2X3dsa2JkX2luaXQgKHZvaWQpCit7CisgICAgcmV0dXJuIDAgOworfQorCisjZW5kaWYJLyogQ09ORklHX1dMXzRQUE1fS0VZQk9BUkQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODFmOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L01ha2VmaWxlCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBWZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWI4eHh4LmEKKworQ09CSlMteQkrPSBjcHUubworQ09CSlMtJChDT05GSUdfT0ZfTElCRkRUKSArPSBmZHQubworQ09CSlMtJChDT05GSUdfUENJKQkrPSBwY2lfY2ZnLm8KKworU1JDUwk6PSAkKFNUQVJUOi5vPS5TKSAkKFNPQkpTLXk6Lm89LlMpICQoQ09CSlMteToubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMteSkgJChDT0JKUy15KSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworaW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmYzNDIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2NwdS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDktMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYXJjaC9wb3dlcnBjL2NwdS9tcGM4NXh4L2NwdS5jIGFuZAorICogYXJjaC9wb3dlcnBjL2NwdS9tcGM4Nnh4L2NwdS5jLiBCYXNpY2FsbHkgdGhpcyBmaWxlIGNvbnRhaW5zCisgKiBjcHUgc3BlY2lmaWMgY29tbW9uIGNvZGUgZm9yIDg1eHgvODZ4eCBwcm9jZXNzb3JzLgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDx0c2VjLmg+CisjaW5jbHVkZSA8bmV0ZGV2Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCitzdHJ1Y3QgY3B1X3R5cGUgY3B1X3R5cGVfbGlzdCBbXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NXh4KQorCUNQVV9UWVBFX0VOVFJZKDg1MzMsIDg1MzMsIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1MzMsIDg1MzNfRSwgMSksCisJQ1BVX1RZUEVfRU5UUlkoODUzNSwgODUzNSwgMSksCisJQ1BVX1RZUEVfRU5UUlkoODUzNSwgODUzNV9FLCAxKSwKKwlDUFVfVFlQRV9FTlRSWSg4NTM2LCA4NTM2LCAxKSwKKwlDUFVfVFlQRV9FTlRSWSg4NTM2LCA4NTM2X0UsIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1NDAsIDg1NDAsIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1NDEsIDg1NDEsIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1NDEsIDg1NDFfRSwgMSksCisJQ1BVX1RZUEVfRU5UUlkoODU0MywgODU0MywgMSksCisJQ1BVX1RZUEVfRU5UUlkoODU0MywgODU0M19FLCAxKSwKKwlDUFVfVFlQRV9FTlRSWSg4NTQ0LCA4NTQ0LCAxKSwKKwlDUFVfVFlQRV9FTlRSWSg4NTQ0LCA4NTQ0X0UsIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1NDUsIDg1NDUsIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1NDUsIDg1NDVfRSwgMSksCisJQ1BVX1RZUEVfRU5UUlkoODU0NywgODU0N19FLCAxKSwKKwlDUFVfVFlQRV9FTlRSWSg4NTQ4LCA4NTQ4LCAxKSwKKwlDUFVfVFlQRV9FTlRSWSg4NTQ4LCA4NTQ4X0UsIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1NTUsIDg1NTUsIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1NTUsIDg1NTVfRSwgMSksCisJQ1BVX1RZUEVfRU5UUlkoODU2MCwgODU2MCwgMSksCisJQ1BVX1RZUEVfRU5UUlkoODU2NywgODU2NywgMSksCisJQ1BVX1RZUEVfRU5UUlkoODU2NywgODU2N19FLCAxKSwKKwlDUFVfVFlQRV9FTlRSWSg4NTY4LCA4NTY4LCAxKSwKKwlDUFVfVFlQRV9FTlRSWSg4NTY4LCA4NTY4X0UsIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1NjksIDg1NjksIDEpLAorCUNQVV9UWVBFX0VOVFJZKDg1NjksIDg1NjlfRSwgMSksCisJQ1BVX1RZUEVfRU5UUlkoODU3MiwgODU3MiwgMiksCisJQ1BVX1RZUEVfRU5UUlkoODU3MiwgODU3Ml9FLCAyKSwKKwlDUFVfVFlQRV9FTlRSWShQMTAxMSwgUDEwMTEsIDEpLAorCUNQVV9UWVBFX0VOVFJZKFAxMDExLCBQMTAxMV9FLCAxKSwKKwlDUFVfVFlQRV9FTlRSWShQMTAxMiwgUDEwMTIsIDEpLAorCUNQVV9UWVBFX0VOVFJZKFAxMDEyLCBQMTAxMl9FLCAxKSwKKwlDUFVfVFlQRV9FTlRSWShQMTAxMywgUDEwMTMsIDEpLAorCUNQVV9UWVBFX0VOVFJZKFAxMDEzLCBQMTAxM19FLCAxKSwKKwlDUFVfVFlQRV9FTlRSWShQMTAyMCwgUDEwMjAsIDIpLAorCUNQVV9UWVBFX0VOVFJZKFAxMDIwLCBQMTAyMF9FLCAyKSwKKwlDUFVfVFlQRV9FTlRSWShQMTAyMSwgUDEwMjEsIDIpLAorCUNQVV9UWVBFX0VOVFJZKFAxMDIxLCBQMTAyMV9FLCAyKSwKKwlDUFVfVFlQRV9FTlRSWShQMTAyMiwgUDEwMjIsIDIpLAorCUNQVV9UWVBFX0VOVFJZKFAxMDIyLCBQMTAyMl9FLCAyKSwKKwlDUFVfVFlQRV9FTlRSWShQMjAxMCwgUDIwMTAsIDEpLAorCUNQVV9UWVBFX0VOVFJZKFAyMDEwLCBQMjAxMF9FLCAxKSwKKwlDUFVfVFlQRV9FTlRSWShQMjAyMCwgUDIwMjAsIDIpLAorCUNQVV9UWVBFX0VOVFJZKFAyMDIwLCBQMjAyMF9FLCAyKSwKKwlDUFVfVFlQRV9FTlRSWShQNDA0MCwgUDQwNDAsIDQpLAorCUNQVV9UWVBFX0VOVFJZKFA0MDQwLCBQNDA0MF9FLCA0KSwKKwlDUFVfVFlQRV9FTlRSWShQNDA4MCwgUDQwODAsIDgpLAorCUNQVV9UWVBFX0VOVFJZKFA0MDgwLCBQNDA4MF9FLCA4KSwKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg2eHgpCisJQ1BVX1RZUEVfRU5UUlkoODYxMCwgODYxMCwgMSksCisJQ1BVX1RZUEVfRU5UUlkoODY0MSwgODY0MSwgMiksCisJQ1BVX1RZUEVfRU5UUlkoODY0MUQsIDg2NDFELCAyKSwKKyNlbmRpZgorfTsKKworc3RydWN0IGNwdV90eXBlIGNwdV90eXBlX3Vua25vd24gPSBDUFVfVFlQRV9FTlRSWShVbmtub3duLCBVbmtub3duLCAxKTsKKworc3RydWN0IGNwdV90eXBlICppZGVudGlmeV9jcHUodTMyIHZlcikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcHVfdHlwZV9saXN0KTsgaSsrKSB7CisJCWlmIChjcHVfdHlwZV9saXN0W2ldLnNvY192ZXIgPT0gdmVyKQorCQkJcmV0dXJuICZjcHVfdHlwZV9saXN0W2ldOworCX0KKwlyZXR1cm4gJmNwdV90eXBlX3Vua25vd247Cit9CisKK2ludCBjcHVfbnVtY29yZXMoKSB7CisJc3RydWN0IGNwdV90eXBlICpjcHU7CisJY3B1ID0gZ2QtPmNwdTsKKwlyZXR1cm4gY3B1LT5udW1fY29yZXM7Cit9CisKK2ludCBwcm9iZWNwdSAodm9pZCkKK3sKKwl1aW50IHN2cjsKKwl1aW50IHZlcjsKKworCXN2ciA9IGdldF9zdnIoKTsKKwl2ZXIgPSBTVlJfU09DX1ZFUihzdnIpOworCisJZ2QtPmNwdSA9IGlkZW50aWZ5X2NwdSh2ZXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXplcyBvbi1jaGlwIGV0aGVybmV0IGNvbnRyb2xsZXJzLgorICogdG8gb3ZlcnJpZGUsIGltcGxlbWVudCBib2FyZF9ldGhfaW5pdCgpCisgKi8KK2ludCBjcHVfZXRoX2luaXQoYmRfdCAqYmlzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKKwlmZWNfaW5pdGlhbGl6ZShiaXMpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19VRUNfRVRIKQorCXVlY19zdGFuZGFyZF9pbml0KGJpcyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1RTRUNfRU5FVCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODVYWF9GRUMpCisJdHNlY19zdGFuZGFyZF9pbml0KGJpcyk7CisjZW5kaWYKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3Zjg1NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIworIyBDb3B5cmlnaHQgMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIFZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYmRkci5hCisKK0NPQkpTLSQoQ09ORklHX0ZTTF9ERFIxKQkrPSBtYWluLm8gdXRpbC5vIGN0cmxfcmVncy5vIG9wdGlvbnMubyBcCisJCQkJICAgbGNfY29tbW9uX2RpbW1fcGFyYW1zLm8KK0NPQkpTLSQoQ09ORklHX0ZTTF9ERFIxKQkrPSBkZHIxX2RpbW1fcGFyYW1zLm8KKworQ09CSlMtJChDT05GSUdfRlNMX0REUjIpCSs9IG1haW4ubyB1dGlsLm8gY3RybF9yZWdzLm8gb3B0aW9ucy5vIFwKKwkJCQkgICBsY19jb21tb25fZGltbV9wYXJhbXMubworQ09CSlMtJChDT05GSUdfRlNMX0REUjIpCSs9IGRkcjJfZGltbV9wYXJhbXMubworCitDT0JKUy0kKENPTkZJR19GU0xfRERSMykJKz0gbWFpbi5vIHV0aWwubyBjdHJsX3JlZ3MubyBvcHRpb25zLm8gXAorCQkJCSAgIGxjX2NvbW1vbl9kaW1tX3BhcmFtcy5vCitDT0JKUy0kKENPTkZJR19GU0xfRERSMykJKz0gZGRyM19kaW1tX3BhcmFtcy5vCisKK1NSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUy15Oi5vPS5TKSAkKENPQkpTLXk6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTLXkpICQoQ09CSlMteSkpCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvZGRyL2NvbW1vbl90aW1pbmdfcGFyYW1zLmggYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvZGRyL2NvbW1vbl90aW1pbmdfcGFyYW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlYTUxNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvY29tbW9uX3RpbWluZ19wYXJhbXMuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgQ09NTU9OX1RJTUlOR19QQVJBTVNfSAorI2RlZmluZSBDT01NT05fVElNSU5HX1BBUkFNU19ICisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBwYXJhbWV0ZXJzIHRvIGNvbnN0cmljdCAqLworCisJdW5zaWduZWQgaW50IHRDS21pbl9YX3BzOworCXVuc2lnbmVkIGludCB0Q0ttYXhfcHM7CisJdW5zaWduZWQgaW50IHRDS21heF9tYXhfcHM7CisJdW5zaWduZWQgaW50IHRSQ0RfcHM7CisJdW5zaWduZWQgaW50IHRSUF9wczsKKwl1bnNpZ25lZCBpbnQgdFJBU19wczsKKworCXVuc2lnbmVkIGludCB0V1JfcHM7CS8qIG1heGltdW0gPSA2Mzc1MCBwcyAqLworCXVuc2lnbmVkIGludCB0V1RSX3BzOwkvKiBtYXhpbXVtID0gNjM3NTAgcHMgKi8KKwl1bnNpZ25lZCBpbnQgdFJGQ19wczsJLyogbWF4aW11bSA9IDI1NSBucyArIDI1NiBucyArIC43NSBucworCQkJCQkgICA9IDUxMTc1MCBwcyAqLworCisJdW5zaWduZWQgaW50IHRSUkRfcHM7CS8qIG1heGltdW0gPSA2Mzc1MCBwcyAqLworCXVuc2lnbmVkIGludCB0UkNfcHM7CS8qIG1heGltdW0gPSAyNTQgbnMgKyAuNzUgbnMgPSAyNTQ3NTAgcHMgKi8KKworCXVuc2lnbmVkIGludCByZWZyZXNoX3JhdGVfcHM7CisKKwl1bnNpZ25lZCBpbnQgdElTX3BzOwkvKiBieXRlIDMyLCBzcGQtPmNhX3NldHVwICovCisJdW5zaWduZWQgaW50IHRJSF9wczsJLyogYnl0ZSAzMywgc3BkLT5jYV9ob2xkICovCisJdW5zaWduZWQgaW50IHREU19wczsJLyogYnl0ZSAzNCwgc3BkLT5kYXRhX3NldHVwICovCisJdW5zaWduZWQgaW50IHRESF9wczsJLyogYnl0ZSAzNSwgc3BkLT5kYXRhX2hvbGQgKi8KKwl1bnNpZ25lZCBpbnQgdFJUUF9wczsJLyogYnl0ZSAzOCwgc3BkLT50cnRwICovCisJdW5zaWduZWQgaW50IHREUVNRX21heF9wczsJLyogYnl0ZSA0NCwgc3BkLT50ZHFzcSAqLworCXVuc2lnbmVkIGludCB0UUhTX3BzOwkvKiBieXRlIDQ1LCBzcGQtPnRxaHMgKi8KKworCXVuc2lnbmVkIGludCBuZGltbXNfcHJlc2VudDsKKwl1bnNpZ25lZCBpbnQgbG93ZXN0X2NvbW1vbl9TUERfY2FzbGF0OworCXVuc2lnbmVkIGludCBoaWdoZXN0X2NvbW1vbl9kZXJhdGVkX2Nhc2xhdDsKKwl1bnNpZ25lZCBpbnQgYWRkaXRpdmVfbGF0ZW5jeTsKKwl1bnNpZ25lZCBpbnQgYWxsX0RJTU1zX2J1cnN0X2xlbmd0aHNfYml0bWFzazsKKwl1bnNpZ25lZCBpbnQgYWxsX0RJTU1zX3JlZ2lzdGVyZWQ7CisJdW5zaWduZWQgaW50IGFsbF9ESU1Nc191bmJ1ZmZlcmVkOworCXVuc2lnbmVkIGludCBhbGxfRElNTXNfRUNDX2NhcGFibGU7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfbWVtOworCXVuc2lnbmVkIGxvbmcgbG9uZyBiYXNlX2FkZHJlc3M7Cit9IGNvbW1vbl90aW1pbmdfcGFyYW1zX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9jdHJsX3JlZ3MuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvY3RybF9yZWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmOWM0MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvY3RybF9yZWdzLmMKQEAgLTAsMCArMSwxMzY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoKKyAqIEdlbmVyaWMgZHJpdmVyIGZvciBGcmVlc2NhbGUgRERSL0REUjIvRERSMyBtZW1vcnkgY29udHJvbGxlci4KKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSBzcGRfc2RyYW0uYworICogQXV0aG9yOiBKYW1lcyBZYW5nIFthdCBmcmVlc2NhbGUuY29tXQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2Rkcl9zZHJhbS5oPgorCisjaW5jbHVkZSAiZGRyLmgiCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgcGljb3NfdG9fbWNsayh1bnNpZ25lZCBpbnQgcGljb3MpOworLyoKKyAqIERldGVybWluZSBSdHQgdmFsdWUuCisgKgorICogVGhpcyBzaG91bGQgbGlrZWx5IGJlIGVpdGhlciBib2FyZCBvciBjb250cm9sbGVyIHNwZWNpZmljLgorICoKKyAqIFJ0dChub21pbmFsKSAtIEREUjI6CisgKgkwID0gUnR0IGRpc2FibGVkCisgKgkxID0gNzUgb2htCisgKgkyID0gMTUwIG9obQorICoJMyA9IDUwIG9obQorICogUnR0KG5vbWluYWwpIC0gRERSMzoKKyAqCTAgPSBSdHQgZGlzYWJsZWQKKyAqCTEgPSA2MCBvaG0KKyAqCTIgPSAxMjAgb2htCisgKgkzID0gNDAgb2htCisgKgk0ID0gMjAgb2htCisgKgk1ID0gMzAgb2htCisgKgorICogRklYTUU6IEFwcGFyZW50bHkgODY0MSBuZWVkcyBhIHZhbHVlIG9mIDIKKyAqIEZJWE1FOiBPbGQgY29kZSBzZXlzIGlmIDY2NyBNSHogb3IgaGlnaGVyLCB1c2UgMyBvbiA4NTcyCisgKgorICogRklYTUU6IFRoZXJlIHdhcyBzb21lIGVmZm9ydCBkb3duIHRoaXMgbGluZSBlYXJsaWVyOgorICoKKyAqCXVuc2lnbmVkIGludCBpOworICoJZm9yIChpID0gMDsgaSA8IENPTkZJR19DSElQX1NFTEVDVFNfUEVSX0NUUkwvMjsgaSsrKSB7CisgKgkJaWYgKHBvcHRzLT5kaW1tc2xvdFtpXS5udW1fdmFsaWRfY3MKKyAqCQkgICAgJiYgKHBvcHRzLT5jc19sb2NhbF9vcHRzWzIqaV0ub2R0X3JkX2NmZworICoJCQl8fCBwb3B0cy0+Y3NfbG9jYWxfb3B0c1syKmldLm9kdF93cl9jZmcpKSB7CisgKgkJCXJ0dCA9IDI7CisgKgkJCWJyZWFrOworICoJCX0KKyAqCX0KKyAqLworc3RhdGljIGlubGluZSBpbnQgZnNsX2Rkcl9nZXRfcnR0KHZvaWQpCit7CisJaW50IHJ0dDsKKworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIxKQorCXJ0dCA9IDA7CisjZWxpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMikKKwlydHQgPSAzOworI2Vsc2UKKwlydHQgPSAwOworI2VuZGlmCisKKwlyZXR1cm4gcnR0OworfQorCisvKgorICogY29tcHV0ZSB0aGUgQ0FTIHdyaXRlIGxhdGVuY3kgYWNjb3JkaW5nIHRvIEREUjMgc3BlYworICogQ1dMID0gNSBpZiB0Q0sgPj0gMi41bnMKKyAqICAgICAgIDYgaWYgMi41bnMgPiB0Q0sgPj0gMS44NzVucworICogICAgICAgNyBpZiAxLjg3NW5zID4gdENLID49IDEuNW5zCisgKiAgICAgICA4IGlmIDEuNW5zID4gdENLID49IDEuMjVucworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjb21wdXRlX2Nhc193cml0ZV9sYXRlbmN5KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGN3bDsKKwljb25zdCB1bnNpZ25lZCBpbnQgbWNsa19wcyA9IGdldF9tZW1vcnlfY2xrX3BlcmlvZF9wcygpOworCisJaWYgKG1jbGtfcHMgPj0gMjUwMCkKKwkJY3dsID0gNTsKKwllbHNlIGlmIChtY2xrX3BzID49IDE4NzUpCisJCWN3bCA9IDY7CisJZWxzZSBpZiAobWNsa19wcyA+PSAxNTAwKQorCQljd2wgPSA3OworCWVsc2UgaWYgKG1jbGtfcHMgPj0gMTI1MCkKKwkJY3dsID0gODsKKwllbHNlCisJCWN3bCA9IDg7CisJcmV0dXJuIGN3bDsKK30KKworLyogQ2hpcCBTZWxlY3QgQ29uZmlndXJhdGlvbiAoQ1NuX0NPTkZJRykgKi8KK3N0YXRpYyB2b2lkIHNldF9jc25fY29uZmlnKGludCBpLCBmc2xfZGRyX2NmZ19yZWdzX3QgKmRkciwKKwkJCSAgICAgICBjb25zdCBtZW1jdGxfb3B0aW9uc190ICpwb3B0cywKKwkJCSAgICAgICBjb25zdCBkaW1tX3BhcmFtc190ICpkaW1tX3BhcmFtcykKK3sKKwl1bnNpZ25lZCBpbnQgY3Nfbl9lbiA9IDA7IC8qIENoaXAgU2VsZWN0IGVuYWJsZSAqLworCXVuc2lnbmVkIGludCBpbnRsdl9lbiA9IDA7IC8qIE1lbW9yeSBjb250cm9sbGVyIGludGVybGVhdmUgZW5hYmxlICovCisJdW5zaWduZWQgaW50IGludGx2X2N0bCA9IDA7IC8qIEludGVybGVhdmluZyBjb250cm9sICovCisJdW5zaWduZWQgaW50IGFwX25fZW4gPSAwOyAvKiBDaGlwIHNlbGVjdCBuIGF1dG8tcHJlY2hhcmdlIGVuYWJsZSAqLworCXVuc2lnbmVkIGludCBvZHRfcmRfY2ZnID0gMDsgLyogT0RUIGZvciByZWFkcyBjb25maWd1cmF0aW9uICovCisJdW5zaWduZWQgaW50IG9kdF93cl9jZmcgPSAwOyAvKiBPRFQgZm9yIHdyaXRlcyBjb25maWd1cmF0aW9uICovCisJdW5zaWduZWQgaW50IGJhX2JpdHNfY3NfbiA9IDA7IC8qIE51bSBvZiBiYW5rIGJpdHMgZm9yIFNEUkFNIG9uIENTbiAqLworCXVuc2lnbmVkIGludCByb3dfYml0c19jc19uID0gMDsgLyogTnVtIG9mIHJvdyBiaXRzIGZvciBTRFJBTSBvbiBDU24gKi8KKwl1bnNpZ25lZCBpbnQgY29sX2JpdHNfY3NfbiA9IDA7IC8qIE51bSBvZiBvY2wgYml0cyBmb3IgU0RSQU0gb24gQ1NuICovCisKKwkvKiBDb21wdXRlIENTX0NPTkZJRyBvbmx5IGZvciBleGlzdGluZyByYW5rcyBvZiBlYWNoIERJTU0uICAqLworCWlmICgoKChpJjEpID09IDApCisJICAgICYmIChkaW1tX3BhcmFtc1tpLzJdLm5fcmFua3MgPT0gMSkpCisJICAgIHx8IChkaW1tX3BhcmFtc1tpLzJdLm5fcmFua3MgPT0gMikpIHsKKwkJdW5zaWduZWQgaW50IG5fYmFua3NfcGVyX3NkcmFtX2RldmljZTsKKwkJY3Nfbl9lbiA9IDE7CisJCWlmIChpID09IDApIHsKKwkJCS8qIFRoZXNlIGZpZWxkcyBvbmx5IGF2YWlsYWJsZSBpbiBDUzBfQ09ORklHICovCisJCQlpbnRsdl9lbiA9IHBvcHRzLT5tZW1jdGxfaW50ZXJsZWF2aW5nOworCQkJaW50bHZfY3RsID0gcG9wdHMtPm1lbWN0bF9pbnRlcmxlYXZpbmdfbW9kZTsKKwkJfQorCQlhcF9uX2VuID0gcG9wdHMtPmNzX2xvY2FsX29wdHNbaV0uYXV0b19wcmVjaGFyZ2U7CisJCW9kdF9yZF9jZmcgPSBwb3B0cy0+Y3NfbG9jYWxfb3B0c1tpXS5vZHRfcmRfY2ZnOworCQlvZHRfd3JfY2ZnID0gcG9wdHMtPmNzX2xvY2FsX29wdHNbaV0ub2R0X3dyX2NmZzsKKwkJbl9iYW5rc19wZXJfc2RyYW1fZGV2aWNlCisJCQk9IGRpbW1fcGFyYW1zW2kvMl0ubl9iYW5rc19wZXJfc2RyYW1fZGV2aWNlOworCQliYV9iaXRzX2NzX24gPSBfX2lsb2cyKG5fYmFua3NfcGVyX3NkcmFtX2RldmljZSkgLSAyOworCQlyb3dfYml0c19jc19uID0gZGltbV9wYXJhbXNbaS8yXS5uX3Jvd19hZGRyIC0gMTI7CisJCWNvbF9iaXRzX2NzX24gPSBkaW1tX3BhcmFtc1tpLzJdLm5fY29sX2FkZHIgLSA4OworCX0KKworCWRkci0+Y3NbaV0uY29uZmlnID0gKDAKKwkJfCAoKGNzX25fZW4gJiAweDEpIDw8IDMxKQorCQl8ICgoaW50bHZfZW4gJiAweDMpIDw8IDI5KQorCQl8ICgoaW50bHZfY3RsICYgMHhmKSA8PCAyNCkKKwkJfCAoKGFwX25fZW4gJiAweDEpIDw8IDIzKQorCisJCS8qIFhYWDogc29tZSBpbXBsZW1lbnRhdGlvbiBvbmx5IGhhdmUgMSBiaXQgc3RhcnRpbmcgYXQgbGVmdCAqLworCQl8ICgob2R0X3JkX2NmZyAmIDB4NykgPDwgMjApCisKKwkJLyogWFhYOiBTb21lIGltcGxlbWVudGF0aW9uIG9ubHkgaGF2ZSAxIGJpdCBzdGFydGluZyBhdCBsZWZ0ICovCisJCXwgKChvZHRfd3JfY2ZnICYgMHg3KSA8PCAxNikKKworCQl8ICgoYmFfYml0c19jc19uICYgMHgzKSA8PCAxNCkKKwkJfCAoKHJvd19iaXRzX2NzX24gJiAweDcpIDw8IDgpCisJCXwgKChjb2xfYml0c19jc19uICYgMHg3KSA8PCAwKQorCQkpOworCWRlYnVnKCJGU0xERFI6IGNzWyVkXV9jb25maWcgPSAweCUwOHhcbiIsIGksZGRyLT5jc1tpXS5jb25maWcpOworfQorCisvKiBDaGlwIFNlbGVjdCBDb25maWd1cmF0aW9uIDIgKENTbl9DT05GSUdfMikgKi8KKy8qIEZJWE1FOiA4NTcyICovCitzdGF0aWMgdm9pZCBzZXRfY3NuX2NvbmZpZ18yKGludCBpLCBmc2xfZGRyX2NmZ19yZWdzX3QgKmRkcikKK3sKKwl1bnNpZ25lZCBpbnQgcGFzcl9jZmcgPSAwOwkvKiBQYXJ0aWFsIGFycmF5IHNlbGYgcmVmcmVzaCBjb25maWcgKi8KKworCWRkci0+Y3NbaV0uY29uZmlnXzIgPSAoKHBhc3JfY2ZnICYgNykgPDwgMjQpOworCWRlYnVnKCJGU0xERFI6IGNzWyVkXV9jb25maWdfMiA9IDB4JTA4eFxuIiwgaSwgZGRyLT5jc1tpXS5jb25maWdfMik7Cit9CisKKy8qIC0zRSA9IDY2NyBDTDUsIC0yNSA9IENMNiA4MDAsIC0yNUUgPSBDTDUgODAwICovCisKKyNpZiAhZGVmaW5lZChDT05GSUdfRlNMX0REUjEpCisvKgorICogRERSIFNEUkFNIFRpbWluZyBDb25maWd1cmF0aW9uIDAgKFRJTUlOR19DRkdfMCkKKyAqCisgKiBBdm9pZCB3cml0aW5nIGZvciBERFIgSS4gIFRoZSBuZXcgUFEzOCBERFIgY29udHJvbGxlcgorICogZHJlYW1zIHVwIG5vbi16ZXJvIGRlZmF1bHQgdmFsdWVzIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlLgorICovCitzdGF0aWMgdm9pZCBzZXRfdGltaW5nX2NmZ18wKGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyKQoreworCXVuc2lnbmVkIGNoYXIgdHJ3dF9tY2xrID0gMDsgICAvKiBSZWFkLXRvLXdyaXRlIHR1cm5hcm91bmQgKi8KKwl1bnNpZ25lZCBjaGFyIHR3cnRfbWNsayA9IDA7ICAgLyogV3JpdGUtdG8tcmVhZCB0dXJuYXJvdW5kICovCisJLyogNy41IG5zIG9uIC0zRTsgMCBtZWFucyBXTCAtIENMICsgQkwvMiArIDEgKi8KKwl1bnNpZ25lZCBjaGFyIHRycnRfbWNsayA9IDA7ICAgLyogUmVhZC10by1yZWFkIHR1cm5hcm91bmQgKi8KKwl1bnNpZ25lZCBjaGFyIHR3d3RfbWNsayA9IDA7ICAgLyogV3JpdGUtdG8td3JpdGUgdHVybmFyb3VuZCAqLworCisJLyogQWN0aXZlIHBvd2VyZG93biBleGl0IHRpbWluZyAodFhBUkQgYW5kIHRYQVJEUykuICovCisJdW5zaWduZWQgY2hhciBhY3RfcGRfZXhpdF9tY2xrOworCS8qIFByZWNoYXJnZSBwb3dlcmRvd24gZXhpdCB0aW1pbmcgKHRYUCkuICovCisJdW5zaWduZWQgY2hhciBwcmVfcGRfZXhpdF9tY2xrOworCS8qIFByZWNoYXJnZSBwb3dlcmRvd24gZXhpdCB0aW1pbmcgKHRBWFBEKS4gKi8KKwl1bnNpZ25lZCBjaGFyIHRheHBkX21jbGs7CisJLyogTW9kZSByZWdpc3RlciBzZXQgY3ljbGUgdGltZSAodE1SRCkuICovCisJdW5zaWduZWQgY2hhciB0bXJkX21jbGs7CisKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKwkvKgorCSAqICh0WEFSRCBhbmQgdFhBUkRTKS4gRW1waXJpY2FsPworCSAqIFRoZSBERFIzIHNwZWMgaGFzIG5vdCB0WEFSRCwKKwkgKiB3ZSB1c2UgdGhlIHRYUCBpbnN0ZWFkIG9mIGl0LgorCSAqIHRYUD1tYXgoM25DSywgNy41bnMpIGZvciBERFIzLgorCSAqIHNwZWMgaGFzIG5vdCB0aGUgdEFYUEQsIHdlIHVzZQorCSAqIHRBWFBEPTgsIG5lZWQgZGVzaWduIHRvIGNvbmZpcm0uCisJICovCisJaW50IHRYUCA9IG1heCgoZ2V0X21lbW9yeV9jbGtfcGVyaW9kX3BzKCkgKiAzKSwgNzUwMCk7IC8qIHVuaXQ9cHMgKi8KKwlhY3RfcGRfZXhpdF9tY2xrID0gcGljb3NfdG9fbWNsayh0WFApOworCS8qIE1vZGUgcmVnaXN0ZXIgTVIwW0ExMl0gaXMgJzEnIC0gZmFzdCBleGl0ICovCisJcHJlX3BkX2V4aXRfbWNsayA9IGFjdF9wZF9leGl0X21jbGs7CisJdGF4cGRfbWNsayA9IDg7CisJdG1yZF9tY2xrID0gNDsKKyNlbHNlIC8qIENPTkZJR19GU0xfRERSMiAqLworCS8qCisJICogKHRYQVJEIGFuZCB0WEFSRFMpLiBFbXBpcmljYWw/CisJICogdFhBUkQgPSAyIGZvciBERFIyCisJICogdFhQPTIKKwkgKiB0QVhQRD04CisJICovCisJYWN0X3BkX2V4aXRfbWNsayA9IDI7CisJcHJlX3BkX2V4aXRfbWNsayA9IDI7CisJdGF4cGRfbWNsayA9IDg7CisJdG1yZF9tY2xrID0gMjsKKyNlbmRpZgorCisJZGRyLT50aW1pbmdfY2ZnXzAgPSAoMAorCQl8ICgodHJ3dF9tY2xrICYgMHgzKSA8PCAzMCkJLyogUldUICovCisJCXwgKCh0d3J0X21jbGsgJiAweDMpIDw8IDI4KQkvKiBXUlQgKi8KKwkJfCAoKHRycnRfbWNsayAmIDB4MykgPDwgMjYpCS8qIFJSVCAqLworCQl8ICgodHd3dF9tY2xrICYgMHgzKSA8PCAyNCkJLyogV1dUICovCisJCXwgKChhY3RfcGRfZXhpdF9tY2xrICYgMHg3KSA8PCAyMCkgIC8qIEFDVF9QRF9FWElUICovCisJCXwgKChwcmVfcGRfZXhpdF9tY2xrICYgMHhGKSA8PCAxNikgIC8qIFBSRV9QRF9FWElUICovCisJCXwgKCh0YXhwZF9tY2xrICYgMHhmKSA8PCA4KQkvKiBPRFRfUERfRVhJVCAqLworCQl8ICgodG1yZF9tY2xrICYgMHhmKSA8PCAwKQkvKiBNUlNfQ1lDICovCisJCSk7CisJZGVidWcoIkZTTEREUjogdGltaW5nX2NmZ18wID0gMHglMDh4XG4iLCBkZHItPnRpbWluZ19jZmdfMCk7Cit9CisjZW5kaWYJLyogZGVmaW5lZChDT05GSUdfRlNMX0REUjIpICovCisKKy8qIEREUiBTRFJBTSBUaW1pbmcgQ29uZmlndXJhdGlvbiAzIChUSU1JTkdfQ0ZHXzMpICovCitzdGF0aWMgdm9pZCBzZXRfdGltaW5nX2NmZ18zKGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyLAorCQkJICAgICAgIGNvbnN0IGNvbW1vbl90aW1pbmdfcGFyYW1zX3QgKmNvbW1vbl9kaW1tLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjYXNfbGF0ZW5jeSkKK3sKKwkvKiBFeHRlbmRlZCBBY3RpdmF0ZSB0byBwcmVjaGFyZ2UgaW50ZXJ2YWwgKHRSQVMpICovCisJdW5zaWduZWQgaW50IGV4dF9hY3R0b3ByZSA9IDA7CisJdW5zaWduZWQgaW50IGV4dF9yZWZyZWM7IC8qIEV4dGVuZGVkIHJlZnJlc2ggcmVjb3ZlcnkgdGltZSAodFJGQykgKi8KKwl1bnNpZ25lZCBpbnQgZXh0X2Nhc2xhdCA9IDA7IC8qIEV4dGVuZGVkIE1DQVMgbGF0ZW5jeSBmcm9tIFJFQUQgY21kICovCisJdW5zaWduZWQgaW50IGNudGxfYWRqID0gMDsgLyogQ29udHJvbCBBZGp1c3QgKi8KKworCS8qIElmIHRoZSB0UkFTID4gMTkgTUNMSywgd2UgdXNlIHRoZSBleHQgbW9kZSAqLworCWlmIChwaWNvc190b19tY2xrKGNvbW1vbl9kaW1tLT50UkFTX3BzKSA+IDB4MTMpCisJCWV4dF9hY3R0b3ByZSA9IDE7CisKKwlleHRfcmVmcmVjID0gKHBpY29zX3RvX21jbGsoY29tbW9uX2RpbW0tPnRSRkNfcHMpIC0gOCkgPj4gNDsKKworCS8qIElmIHRoZSBDQVMgbGF0ZW5jeSBtb3JlIHRoYW4gOCwgdXNlIHRoZSBleHQgbW9kZSAqLworCWlmIChjYXNfbGF0ZW5jeSA+IDgpCisJCWV4dF9jYXNsYXQgPSAxOworCisJZGRyLT50aW1pbmdfY2ZnXzMgPSAoMAorCQl8ICgoZXh0X2FjdHRvcHJlICYgMHgxKSA8PCAyNCkKKwkJfCAoKGV4dF9yZWZyZWMgJiAweEYpIDw8IDE2KQorCQl8ICgoZXh0X2Nhc2xhdCAmIDB4MSkgPDwgMTIpCisJCXwgKChjbnRsX2FkaiAmIDB4NykgPDwgMCkKKwkJKTsKKwlkZWJ1ZygiRlNMRERSOiB0aW1pbmdfY2ZnXzMgPSAweCUwOHhcbiIsIGRkci0+dGltaW5nX2NmZ18zKTsKK30KKworLyogRERSIFNEUkFNIFRpbWluZyBDb25maWd1cmF0aW9uIDEgKFRJTUlOR19DRkdfMSkgKi8KK3N0YXRpYyB2b2lkIHNldF90aW1pbmdfY2ZnXzEoZnNsX2Rkcl9jZmdfcmVnc190ICpkZHIsCisJCQkgICAgICAgY29uc3QgbWVtY3RsX29wdGlvbnNfdCAqcG9wdHMsCisJCQkgICAgICAgY29uc3QgY29tbW9uX3RpbWluZ19wYXJhbXNfdCAqY29tbW9uX2RpbW0sCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNhc19sYXRlbmN5KQoreworCS8qIFByZWNoYXJnZS10by1hY3RpdmF0ZSBpbnRlcnZhbCAodFJQKSAqLworCXVuc2lnbmVkIGNoYXIgcHJldG9hY3RfbWNsazsKKwkvKiBBY3RpdmF0ZSB0byBwcmVjaGFyZ2UgaW50ZXJ2YWwgKHRSQVMpICovCisJdW5zaWduZWQgY2hhciBhY3R0b3ByZV9tY2xrOworCS8qICBBY3RpdmF0ZSB0byByZWFkL3dyaXRlIGludGVydmFsICh0UkNEKSAqLworCXVuc2lnbmVkIGNoYXIgYWN0dG9yd19tY2xrOworCS8qIENBU0xBVCAqLworCXVuc2lnbmVkIGNoYXIgY2FzbGF0X2N0cmw7CisJLyogIFJlZnJlc2ggcmVjb3ZlcnkgdGltZSAodFJGQykgOyB0cmZjX2xvdyAqLworCXVuc2lnbmVkIGNoYXIgcmVmcmVjX2N0cmw7CisJLyogTGFzdCBkYXRhIHRvIHByZWNoYXJnZSBtaW5pbXVtIGludGVydmFsICh0V1IpICovCisJdW5zaWduZWQgY2hhciB3cnJlY19tY2xrOworCS8qIEFjdGl2YXRlLXRvLWFjdGl2YXRlIGludGVydmFsICh0UlJEKSAqLworCXVuc2lnbmVkIGNoYXIgYWN0dG9hY3RfbWNsazsKKwkvKiBMYXN0IHdyaXRlIGRhdGEgcGFpciB0byByZWFkIGNvbW1hbmQgaXNzdWUgaW50ZXJ2YWwgKHRXVFIpICovCisJdW5zaWduZWQgY2hhciB3cnRvcmRfbWNsazsKKworCXByZXRvYWN0X21jbGsgPSBwaWNvc190b19tY2xrKGNvbW1vbl9kaW1tLT50UlBfcHMpOworCWFjdHRvcHJlX21jbGsgPSBwaWNvc190b19tY2xrKGNvbW1vbl9kaW1tLT50UkFTX3BzKTsKKwlhY3R0b3J3X21jbGsgPSBwaWNvc190b19tY2xrKGNvbW1vbl9kaW1tLT50UkNEX3BzKTsKKworCS8qCisJICogVHJhbnNsYXRlIENBUyBMYXRlbmN5IHRvIGEgRERSIGNvbnRyb2xsZXIgZmllbGQgdmFsdWU6CisJICoKKwkgKiAgICAgIENBUyBMYXQgRERSIEkgICBERFIgSUkgIEN0cmwKKwkgKiAgICAgIENsb2NrcyAgU1BEIEJpdCBTUEQgQml0IFZhbHVlCisJICogICAgICAtLS0tLS0tIC0tLS0tLS0gLS0tLS0tLSAtLS0tLQorCSAqICAgICAgMS4wICAgICAwICAgICAgICAgICAgICAgMDAwMQorCSAqICAgICAgMS41ICAgICAxICAgICAgICAgICAgICAgMDAxMAorCSAqICAgICAgMi4wICAgICAyICAgICAgIDIgICAgICAgMDAxMQorCSAqICAgICAgMi41ICAgICAzICAgICAgICAgICAgICAgMDEwMAorCSAqICAgICAgMy4wICAgICA0ICAgICAgIDMgICAgICAgMDEwMQorCSAqICAgICAgMy41ICAgICA1ICAgICAgICAgICAgICAgMDExMAorCSAqICAgICAgNC4wICAgICAgICAgICAgIDQgICAgICAgMDExMQorCSAqICAgICAgNC41ICAgICAgICAgICAgICAgICAgICAgMTAwMAorCSAqICAgICAgNS4wICAgICAgICAgICAgIDUgICAgICAgMTAwMQorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIxKQorCWNhc2xhdF9jdHJsID0gKGNhc19sYXRlbmN5ICsgMSkgJiAweDA3OworI2VsaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjIpCisJY2FzbGF0X2N0cmwgPSAyICogY2FzX2xhdGVuY3kgLSAxOworI2Vsc2UKKwkvKgorCSAqIGlmIHRoZSBDQVMgbGF0ZW5jeSBtb3JlIHRoYW4gOCBjeWNsZSwKKwkgKiB3ZSBuZWVkIHNldCBleHRlbmQgYml0IGZvciBpdCBhdAorCSAqIFRJTUlOR19DRkdfM1tFWFRfQ0FTTEFUXQorCSAqLworCWlmIChjYXNfbGF0ZW5jeSA+IDgpCisJCWNhc19sYXRlbmN5IC09IDg7CisJY2FzbGF0X2N0cmwgPSAyICogY2FzX2xhdGVuY3kgLSAxOworI2VuZGlmCisKKwlyZWZyZWNfY3RybCA9IHBpY29zX3RvX21jbGsoY29tbW9uX2RpbW0tPnRSRkNfcHMpIC0gODsKKwl3cnJlY19tY2xrID0gcGljb3NfdG9fbWNsayhjb21tb25fZGltbS0+dFdSX3BzKTsKKwlpZiAocG9wdHMtPk9URl9idXJzdF9jaG9wX2VuKQorCQl3cnJlY19tY2xrICs9IDI7CisKKwlhY3R0b2FjdF9tY2xrID0gcGljb3NfdG9fbWNsayhjb21tb25fZGltbS0+dFJSRF9wcyk7CisJLyoKKwkgKiBKRURFQyBoYXMgbWluIHJlcXVpcmVtZW50IGZvciB0UlJECisJICovCisjaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjMpCisJaWYgKGFjdHRvYWN0X21jbGsgPCA0KQorCQlhY3R0b2FjdF9tY2xrID0gNDsKKyNlbmRpZgorCXdydG9yZF9tY2xrID0gcGljb3NfdG9fbWNsayhjb21tb25fZGltbS0+dFdUUl9wcyk7CisJLyoKKwkgKiBKRURFQyBoYXMgc29tZSBtaW4gcmVxdWlyZW1lbnRzIGZvciB0V1RSCisJICovCisjaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjIpCisJaWYgKHdydG9yZF9tY2xrIDwgMikKKwkJd3J0b3JkX21jbGsgPSAyOworI2VsaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjMpCisJaWYgKHdydG9yZF9tY2xrIDwgNCkKKwkJd3J0b3JkX21jbGsgPSA0OworI2VuZGlmCisJaWYgKHBvcHRzLT5PVEZfYnVyc3RfY2hvcF9lbikKKwkJd3J0b3JkX21jbGsgKz0gMjsKKworCWRkci0+dGltaW5nX2NmZ18xID0gKDAKKwkJfCAoKHByZXRvYWN0X21jbGsgJiAweDBGKSA8PCAyOCkKKwkJfCAoKGFjdHRvcHJlX21jbGsgJiAweDBGKSA8PCAyNCkKKwkJfCAoKGFjdHRvcndfbWNsayAmIDB4RikgPDwgMjApCisJCXwgKChjYXNsYXRfY3RybCAmIDB4RikgPDwgMTYpCisJCXwgKChyZWZyZWNfY3RybCAmIDB4RikgPDwgMTIpCisJCXwgKCh3cnJlY19tY2xrICYgMHgwRikgPDwgOCkKKwkJfCAoKGFjdHRvYWN0X21jbGsgJiAweDA3KSA8PCA0KQorCQl8ICgod3J0b3JkX21jbGsgJiAweDA3KSA8PCAwKQorCQkpOworCWRlYnVnKCJGU0xERFI6IHRpbWluZ19jZmdfMSA9IDB4JTA4eFxuIiwgZGRyLT50aW1pbmdfY2ZnXzEpOworfQorCisvKiBERFIgU0RSQU0gVGltaW5nIENvbmZpZ3VyYXRpb24gMiAoVElNSU5HX0NGR18yKSAqLworc3RhdGljIHZvaWQgc2V0X3RpbWluZ19jZmdfMihmc2xfZGRyX2NmZ19yZWdzX3QgKmRkciwKKwkJCSAgICAgICBjb25zdCBtZW1jdGxfb3B0aW9uc190ICpwb3B0cywKKwkJCSAgICAgICBjb25zdCBjb21tb25fdGltaW5nX3BhcmFtc190ICpjb21tb25fZGltbSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2FzX2xhdGVuY3ksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGFkZGl0aXZlX2xhdGVuY3kpCit7CisJLyogQWRkaXRpdmUgbGF0ZW5jeSAqLworCXVuc2lnbmVkIGNoYXIgYWRkX2xhdF9tY2xrOworCS8qIENBUy10by1wcmVhbWJsZSBvdmVycmlkZSAqLworCXVuc2lnbmVkIHNob3J0IGNwbzsKKwkvKiBXcml0ZSBsYXRlbmN5ICovCisJdW5zaWduZWQgY2hhciB3cl9sYXQ7CisJLyogIFJlYWQgdG8gcHJlY2hhcmdlICh0UlRQKSAqLworCXVuc2lnbmVkIGNoYXIgcmRfdG9fcHJlOworCS8qIFdyaXRlIGNvbW1hbmQgdG8gd3JpdGUgZGF0YSBzdHJvYmUgdGltaW5nIGFkanVzdG1lbnQgKi8KKwl1bnNpZ25lZCBjaGFyIHdyX2RhdGFfZGVsYXk7CisJLyogTWluaW11bSBDS0UgcHVsc2Ugd2lkdGggKHRDS0UpICovCisJdW5zaWduZWQgY2hhciBja2VfcGxzOworCS8qIFdpbmRvdyBmb3IgZm91ciBhY3RpdmF0ZXMgKHRGQVcpICovCisJdW5zaWduZWQgc2hvcnQgZm91cl9hY3Q7CisKKwkvKiBGSVhNRSBhZGQgY2hlY2sgdGhhdCB0aGlzIG11c3QgYmUgbGVzcyB0aGFuIGFjdHRvcndfbWNsayAqLworCWFkZF9sYXRfbWNsayA9IGFkZGl0aXZlX2xhdGVuY3k7CisJY3BvID0gcG9wdHMtPmNwb19vdmVycmlkZTsKKworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIxKQorCS8qCisJICogVGhpcyBpcyBhIGxpZS4gIEl0IHNob3VsZCByZWFsbHkgYmUgMSwgYnV0IGlmIGl0IGlzCisJICogc2V0IHRvIDEsIGJpdHMgb3ZlcmxhcCBpbnRvIHRoZSBvbGQgY29udHJvbGxlcidzCisJICogb3RoZXJ3aXNlIHVudXNlZCBBQ1NNIGZpZWxkLiAgSWYgd2UgbGVhdmUgaXQgMCwgdGhlbgorCSAqIHRoZSBIVyB3aWxsIG1hZ2ljYWxseSB0cmVhdCBpdCBhcyAxIGZvciBERFIgMS4gIE9oIFllYS4KKwkgKi8KKwl3cl9sYXQgPSAwOworI2VsaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjIpCisJd3JfbGF0ID0gY2FzX2xhdGVuY3kgLSAxOworI2Vsc2UKKwl3cl9sYXQgPSBjb21wdXRlX2Nhc193cml0ZV9sYXRlbmN5KCk7CisjZW5kaWYKKworCXJkX3RvX3ByZSA9IHBpY29zX3RvX21jbGsoY29tbW9uX2RpbW0tPnRSVFBfcHMpOworCS8qCisJICogSkVERUMgaGFzIHNvbWUgbWluIHJlcXVpcmVtZW50cyBmb3IgdFJUUAorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIyKQorCWlmIChyZF90b19wcmUgIDwgMikKKwkJcmRfdG9fcHJlICA9IDI7CisjZWxpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKwlpZiAocmRfdG9fcHJlIDwgNCkKKwkJcmRfdG9fcHJlID0gNDsKKyNlbmRpZgorCWlmIChhZGRpdGl2ZV9sYXRlbmN5KQorCQlyZF90b19wcmUgKz0gYWRkaXRpdmVfbGF0ZW5jeTsKKwlpZiAocG9wdHMtPk9URl9idXJzdF9jaG9wX2VuKQorCQlyZF90b19wcmUgKz0gMjsgLyogYWNjb3JkaW5nIHRvIFVNICovCisKKwl3cl9kYXRhX2RlbGF5ID0gcG9wdHMtPndyaXRlX2RhdGFfZGVsYXk7CisJY2tlX3BscyA9IHBpY29zX3RvX21jbGsocG9wdHMtPnRDS0VfY2xvY2tfcHVsc2Vfd2lkdGhfcHMpOworCWZvdXJfYWN0ID0gcGljb3NfdG9fbWNsayhwb3B0cy0+dEZBV193aW5kb3dfZm91cl9hY3RpdmF0ZXNfcHMpOworCisJZGRyLT50aW1pbmdfY2ZnXzIgPSAoMAorCQl8ICgoYWRkX2xhdF9tY2xrICYgMHhmKSA8PCAyOCkKKwkJfCAoKGNwbyAmIDB4MWYpIDw8IDIzKQorCQl8ICgod3JfbGF0ICYgMHhmKSA8PCAxOSkKKwkJfCAoKHJkX3RvX3ByZSAmIFJEX1RPX1BSRV9NQVNLKSA8PCBSRF9UT19QUkVfU0hJRlQpCisJCXwgKCh3cl9kYXRhX2RlbGF5ICYgV1JfREFUQV9ERUxBWV9NQVNLKSA8PCBXUl9EQVRBX0RFTEFZX1NISUZUKQorCQl8ICgoY2tlX3BscyAmIDB4NykgPDwgNikKKwkJfCAoKGZvdXJfYWN0ICYgMHgzZikgPDwgMCkKKwkJKTsKKwlkZWJ1ZygiRlNMRERSOiB0aW1pbmdfY2ZnXzIgPSAweCUwOHhcbiIsIGRkci0+dGltaW5nX2NmZ18yKTsKK30KKworLyogRERSIFNEUkFNIGNvbnRyb2wgY29uZmlndXJhdGlvbiAoRERSX1NEUkFNX0NGRykgKi8KK3N0YXRpYyB2b2lkIHNldF9kZHJfc2RyYW1fY2ZnKGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyLAorCQkJICAgICAgIGNvbnN0IG1lbWN0bF9vcHRpb25zX3QgKnBvcHRzLAorCQkJICAgICAgIGNvbnN0IGNvbW1vbl90aW1pbmdfcGFyYW1zX3QgKmNvbW1vbl9kaW1tKQoreworCXVuc2lnbmVkIGludCBtZW1fZW47CQkvKiBERFIgU0RSQU0gaW50ZXJmYWNlIGxvZ2ljIGVuYWJsZSAqLworCXVuc2lnbmVkIGludCBzcmVuOwkJLyogU2VsZiByZWZyZXNoIGVuYWJsZSAoZHVyaW5nIHNsZWVwKSAqLworCXVuc2lnbmVkIGludCBlY2NfZW47CQkvKiBFQ0MgZW5hYmxlLiAqLworCXVuc2lnbmVkIGludCByZF9lbjsJCS8qIFJlZ2lzdGVyZWQgRElNTSBlbmFibGUgKi8KKwl1bnNpZ25lZCBpbnQgc2RyYW1fdHlwZTsJLyogVHlwZSBvZiBTRFJBTSAqLworCXVuc2lnbmVkIGludCBkeW5fcHdyOwkJLyogRHluYW1pYyBwb3dlciBtYW5hZ2VtZW50IG1vZGUgKi8KKwl1bnNpZ25lZCBpbnQgZGJ3OwkJLyogRFJBTSBkdGEgYnVzIHdpZHRoICovCisJdW5zaWduZWQgaW50IGVpZ2h0X2JlID0gMDsJLyogOC1iZWF0IGJ1cnN0IGVuYWJsZSwgRERSMiBpcyB6ZXJvICovCisJdW5zaWduZWQgaW50IG5jYXAgPSAwOwkJLyogTm9uLWNvbmN1cnJlbnQgYXV0by1wcmVjaGFyZ2UgKi8KKwl1bnNpZ25lZCBpbnQgdGhyZWVUX2VuOwkJLyogRW5hYmxlIDNUIHRpbWluZyAqLworCXVuc2lnbmVkIGludCB0d29UX2VuOwkJLyogRW5hYmxlIDJUIHRpbWluZyAqLworCXVuc2lnbmVkIGludCBiYV9pbnRsdl9jdGw7CS8qIEJhbmsgKENTKSBpbnRlcmxlYXZpbmcgY29udHJvbCAqLworCXVuc2lnbmVkIGludCB4MzJfZW4gPSAwOwkvKiB4MzIgZW5hYmxlICovCisJdW5zaWduZWQgaW50IHBjaGI4ID0gMDsJCS8qIHByZWNoYXJnZSBiaXQgOCBlbmFibGUgKi8KKwl1bnNpZ25lZCBpbnQgaHNlOwkJLyogR2xvYmFsIGhhbGYgc3RyZW5ndGggb3ZlcnJpZGUgKi8KKwl1bnNpZ25lZCBpbnQgbWVtX2hhbHQgPSAwOwkvKiBtZW1vcnkgY29udHJvbGxlciBoYWx0ICovCisJdW5zaWduZWQgaW50IGJpID0gMDsJCS8qIEJ5cGFzcyBpbml0aWFsaXphdGlvbiAqLworCisJbWVtX2VuID0gMTsKKwlzcmVuID0gcG9wdHMtPnNlbGZfcmVmcmVzaF9pbl9zbGVlcDsKKwlpZiAoY29tbW9uX2RpbW0tPmFsbF9ESU1Nc19FQ0NfY2FwYWJsZSkgeworCQkvKiBBbGxvdyBzZXR0aW5nIG9mIEVDQyBvbmx5IGlmIGFsbCBESU1NcyBhcmUgRUNDLiAqLworCQllY2NfZW4gPSBwb3B0cy0+RUNDX21vZGU7CisJfSBlbHNlIHsKKwkJZWNjX2VuID0gMDsKKwl9CisKKwlyZF9lbiA9IChjb21tb25fZGltbS0+YWxsX0RJTU1zX3JlZ2lzdGVyZWQKKwkJICYmICFjb21tb25fZGltbS0+YWxsX0RJTU1zX3VuYnVmZmVyZWQpOworCisJc2RyYW1fdHlwZSA9IENPTkZJR19GU0xfU0RSQU1fVFlQRTsKKworCWR5bl9wd3IgPSBwb3B0cy0+ZHluYW1pY19wb3dlcjsKKwlkYncgPSBwb3B0cy0+ZGF0YV9idXNfd2lkdGg7CisJLyogOC1iZWF0IGJ1cnN0IGVuYWJsZSBERFItSUlJIGNhc2UKKwkgKiB3ZSBtdXN0IGNsZWFyIGl0IHdoZW4gdXNlIHRoZSBvbi10aGUtZmx5IG1vZGUsCisJICogbXVzdCBzZXQgaXQgd2hlbiB1c2UgdGhlIDMyLWJpdHMgYnVzIG1vZGUuCisJICovCisJaWYgKHNkcmFtX3R5cGUgPT0gU0RSQU1fVFlQRV9ERFIzKSB7CisJCWlmIChwb3B0cy0+YnVyc3RfbGVuZ3RoID09IEREUl9CTDgpCisJCQllaWdodF9iZSA9IDE7CisJCWlmIChwb3B0cy0+YnVyc3RfbGVuZ3RoID09IEREUl9PVEYpCisJCQllaWdodF9iZSA9IDA7CisJCWlmIChkYncgPT0gMHgxKQorCQkJZWlnaHRfYmUgPSAxOworCX0KKworCXRocmVlVF9lbiA9IHBvcHRzLT50aHJlZVRfZW47CisJdHdvVF9lbiA9IHBvcHRzLT50d29UX2VuOworCWJhX2ludGx2X2N0bCA9IHBvcHRzLT5iYV9pbnRsdl9jdGw7CisJaHNlID0gcG9wdHMtPmhhbGZfc3RyZW5ndGhfZHJpdmVyX2VuYWJsZTsKKworCWRkci0+ZGRyX3NkcmFtX2NmZyA9ICgwCisJCQl8ICgobWVtX2VuICYgMHgxKSA8PCAzMSkKKwkJCXwgKChzcmVuICYgMHgxKSA8PCAzMCkKKwkJCXwgKChlY2NfZW4gJiAweDEpIDw8IDI5KQorCQkJfCAoKHJkX2VuICYgMHgxKSA8PCAyOCkKKwkJCXwgKChzZHJhbV90eXBlICYgMHg3KSA8PCAyNCkKKwkJCXwgKChkeW5fcHdyICYgMHgxKSA8PCAyMSkKKwkJCXwgKChkYncgJiAweDMpIDw8IDE5KQorCQkJfCAoKGVpZ2h0X2JlICYgMHgxKSA8PCAxOCkKKwkJCXwgKChuY2FwICYgMHgxKSA8PCAxNykKKwkJCXwgKCh0aHJlZVRfZW4gJiAweDEpIDw8IDE2KQorCQkJfCAoKHR3b1RfZW4gJiAweDEpIDw8IDE1KQorCQkJfCAoKGJhX2ludGx2X2N0bCAmIDB4N0YpIDw8IDgpCisJCQl8ICgoeDMyX2VuICYgMHgxKSA8PCA1KQorCQkJfCAoKHBjaGI4ICYgMHgxKSA8PCA0KQorCQkJfCAoKGhzZSAmIDB4MSkgPDwgMykKKwkJCXwgKChtZW1faGFsdCAmIDB4MSkgPDwgMSkKKwkJCXwgKChiaSAmIDB4MSkgPDwgMCkKKwkJCSk7CisJZGVidWcoIkZTTEREUjogZGRyX3NkcmFtX2NmZyA9IDB4JTA4eFxuIiwgZGRyLT5kZHJfc2RyYW1fY2ZnKTsKK30KKworLyogRERSIFNEUkFNIGNvbnRyb2wgY29uZmlndXJhdGlvbiAyIChERFJfU0RSQU1fQ0ZHXzIpICovCitzdGF0aWMgdm9pZCBzZXRfZGRyX3NkcmFtX2NmZ18yKGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyLAorCQkJICAgICAgIGNvbnN0IG1lbWN0bF9vcHRpb25zX3QgKnBvcHRzKQoreworCXVuc2lnbmVkIGludCBmcmNfc3IgPSAwOwkvKiBGb3JjZSBzZWxmIHJlZnJlc2ggKi8KKwl1bnNpZ25lZCBpbnQgc3JfaWUgPSAwOwkJLyogU2VsZi1yZWZyZXNoIGludGVycnVwdCBlbmFibGUgKi8KKwl1bnNpZ25lZCBpbnQgZGxsX3JzdF9kaXM7CS8qIERMTCByZXNldCBkaXNhYmxlICovCisJdW5zaWduZWQgaW50IGRxc19jZmc7CQkvKiBEUVMgY29uZmlndXJhdGlvbiAqLworCXVuc2lnbmVkIGludCBvZHRfY2ZnOwkJLyogT0RUIGNvbmZpZ3VyYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgbnVtX3ByOwkJLyogTnVtYmVyIG9mIHBvc3RlZCByZWZyZXNoZXMgKi8KKwl1bnNpZ25lZCBpbnQgb2JjX2NmZzsJCS8qIE9uLVRoZS1GbHkgQnVyc3QgQ2hvcCBDZmcgKi8KKwl1bnNpZ25lZCBpbnQgYXBfZW47CQkvKiBBZGRyZXNzIFBhcml0eSBFbmFibGUgKi8KKwl1bnNpZ25lZCBpbnQgZF9pbml0OwkJLyogRFJBTSBkYXRhIGluaXRpYWxpemF0aW9uICovCisJdW5zaWduZWQgaW50IHJjd19lbiA9IDA7CS8qIFJlZ2lzdGVyIENvbnRyb2wgV29yZCBFbmFibGUgKi8KKwl1bnNpZ25lZCBpbnQgbWRfZW4gPSAwOwkJLyogTWlycm9yZWQgRElNTSBFbmFibGUgKi8KKworCWRsbF9yc3RfZGlzID0gMTsJLyogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSAqLworCWRxc19jZmcgPSBwb3B0cy0+RFFTX2NvbmZpZzsKKwlpZiAocG9wdHMtPmNzX2xvY2FsX29wdHNbMF0ub2R0X3JkX2NmZworCSAgICB8fCBwb3B0cy0+Y3NfbG9jYWxfb3B0c1swXS5vZHRfd3JfY2ZnKSB7CisJCS8qIEZJWE1FICovCisJCW9kdF9jZmcgPSAyOworCX0gZWxzZSB7CisJCW9kdF9jZmcgPSAwOworCX0KKworCW51bV9wciA9IDE7CS8qIE1ha2UgdGhpcyBjb25maWd1cmFibGUgKi8KKworCS8qCisJICogODU3MiBtYW51YWwgc2F5cworCSAqICAgICB7VElNSU5HX0NGR18xW1BSRVRPQUNUXQorCSAqICAgICAgKyBbRERSX1NEUkFNX0NGR18yW05VTV9QUl0KKwkgKiAgICAgICAgKiAoe0VYVF9SRUZSRUMgfHwgUkVGUkVDfSArIDggKyAyKV19CisJICogICAgICA8PCBERFJfU0RSQU1fSU5URVJWQUxbUkVGSU5UXQorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIzKQorCW9iY19jZmcgPSBwb3B0cy0+T1RGX2J1cnN0X2Nob3BfZW47CisjZWxzZQorCW9iY19jZmcgPSAwOworI2VuZGlmCisKKwlhcF9lbiA9IDA7CS8qIE1ha2UgdGhpcyBjb25maWd1cmFibGU/ICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19FQ0NfSU5JVF9WSUFfRERSQ09OVFJPTExFUikKKwkvKiBVc2UgdGhlIEREUiBjb250cm9sbGVyIHRvIGF1dG8gaW5pdGlhbGl6ZSBtZW1vcnkuICovCisJZF9pbml0ID0gMTsKKwlkZHItPmRkcl9kYXRhX2luaXQgPSBDT05GSUdfTUVNX0lOSVRfVkFMVUU7CisJZGVidWcoIkREUjogZGRyX2RhdGFfaW5pdCA9IDB4JTA4eFxuIiwgZGRyLT5kZHJfZGF0YV9pbml0KTsKKyNlbHNlCisJLyogTWVtb3J5IHdpbGwgYmUgaW5pdGlhbGl6ZWQgdmlhIERNQSwgb3Igbm90IGF0IGFsbC4gKi8KKwlkX2luaXQgPSAwOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKwltZF9lbiA9IHBvcHRzLT5taXJyb3JlZF9kaW1tOworI2VuZGlmCisJZGRyLT5kZHJfc2RyYW1fY2ZnXzIgPSAoMAorCQl8ICgoZnJjX3NyICYgMHgxKSA8PCAzMSkKKwkJfCAoKHNyX2llICYgMHgxKSA8PCAzMCkKKwkJfCAoKGRsbF9yc3RfZGlzICYgMHgxKSA8PCAyOSkKKwkJfCAoKGRxc19jZmcgJiAweDMpIDw8IDI2KQorCQl8ICgob2R0X2NmZyAmIDB4MykgPDwgMjEpCisJCXwgKChudW1fcHIgJiAweGYpIDw8IDEyKQorCQl8ICgob2JjX2NmZyAmIDB4MSkgPDwgNikKKwkJfCAoKGFwX2VuICYgMHgxKSA8PCA1KQorCQl8ICgoZF9pbml0ICYgMHgxKSA8PCA0KQorCQl8ICgocmN3X2VuICYgMHgxKSA8PCAyKQorCQl8ICgobWRfZW4gJiAweDEpIDw8IDApCisJCSk7CisJZGVidWcoIkZTTEREUjogZGRyX3NkcmFtX2NmZ18yID0gMHglMDh4XG4iLCBkZHItPmRkcl9zZHJhbV9jZmdfMik7Cit9CisKKy8qIEREUiBTRFJBTSBNb2RlIGNvbmZpZ3VyYXRpb24gMiAoRERSX1NEUkFNX01PREVfMikgKi8KK3N0YXRpYyB2b2lkIHNldF9kZHJfc2RyYW1fbW9kZV8yKGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyLAorCQkJCWNvbnN0IG1lbWN0bF9vcHRpb25zX3QgKnBvcHRzKQoreworCXVuc2lnbmVkIHNob3J0IGVzZG1vZGUyID0gMDsJLyogRXh0ZW5kZWQgU0RSQU0gbW9kZSAyICovCisJdW5zaWduZWQgc2hvcnQgZXNkbW9kZTMgPSAwOwkvKiBFeHRlbmRlZCBTRFJBTSBtb2RlIDMgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIzKQorCXVuc2lnbmVkIGludCBydHRfd3IgPSAwOwkvKiBSdHRfV1IgLSBkeW5hbWljIE9EVCBvZmYgKi8KKwl1bnNpZ25lZCBpbnQgc3J0ID0gMDsJLyogc2VsZi1yZWZyZXNoIHRlbWVyYXR1cmUsIG5vcm1hbCByYW5nZSAqLworCXVuc2lnbmVkIGludCBhc3IgPSAwOwkvKiBhdXRvIHNlbGYtcmVmcmVzaCBkaXNhYmxlICovCisJdW5zaWduZWQgaW50IGN3bCA9IGNvbXB1dGVfY2FzX3dyaXRlX2xhdGVuY3koKSAtIDU7CisJdW5zaWduZWQgaW50IHBhc3IgPSAwOwkvKiBwYXJ0aWFsIGFycmF5IHNlbGYgcmVmcmVzaCBkaXNhYmxlICovCisKKwlpZiAocG9wdHMtPnJ0dF9vdmVycmlkZSkKKwkJcnR0X3dyID0gcG9wdHMtPnJ0dF93cl9vdmVycmlkZV92YWx1ZTsKKworCWVzZG1vZGUyID0gKDAKKwkJfCAoKHJ0dF93ciAmIDB4MykgPDwgOSkKKwkJfCAoKHNydCAmIDB4MSkgPDwgNykKKwkJfCAoKGFzciAmIDB4MSkgPDwgNikKKwkJfCAoKGN3bCAmIDB4NykgPDwgMykKKwkJfCAoKHBhc3IgJiAweDcpIDw8IDApKTsKKyNlbmRpZgorCWRkci0+ZGRyX3NkcmFtX21vZGVfMiA9ICgwCisJCQkJIHwgKChlc2Rtb2RlMiAmIDB4RkZGRikgPDwgMTYpCisJCQkJIHwgKChlc2Rtb2RlMyAmIDB4RkZGRikgPDwgMCkKKwkJCQkgKTsKKwlkZWJ1ZygiRlNMRERSOiBkZHJfc2RyYW1fbW9kZV8yID0gMHglMDh4XG4iLCBkZHItPmRkcl9zZHJhbV9tb2RlXzIpOworfQorCisvKiBERFIgU0RSQU0gSW50ZXJ2YWwgQ29uZmlndXJhdGlvbiAoRERSX1NEUkFNX0lOVEVSVkFMKSAqLworc3RhdGljIHZvaWQgc2V0X2Rkcl9zZHJhbV9pbnRlcnZhbChmc2xfZGRyX2NmZ19yZWdzX3QgKmRkciwKKwkJCSAgICAgICBjb25zdCBtZW1jdGxfb3B0aW9uc190ICpwb3B0cywKKwkJCSAgICAgICBjb25zdCBjb21tb25fdGltaW5nX3BhcmFtc190ICpjb21tb25fZGltbSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVmaW50OwkvKiBSZWZyZXNoIGludGVydmFsICovCisJdW5zaWduZWQgaW50IGJzdG9wcmU7CS8qIFByZWNoYXJnZSBpbnRlcnZhbCAqLworCisJcmVmaW50ID0gcGljb3NfdG9fbWNsayhjb21tb25fZGltbS0+cmVmcmVzaF9yYXRlX3BzKTsKKworCWJzdG9wcmUgPSBwb3B0cy0+YnN0b3ByZTsKKworCS8qIHJlZmludCBmaWVsZCB1c2VkIDB4M0ZGRiBpbiBlYXJsaWVyIGNvbnRyb2xsZXJzICovCisJZGRyLT5kZHJfc2RyYW1faW50ZXJ2YWwgPSAoMAorCQkJCSAgIHwgKChyZWZpbnQgJiAweEZGRkYpIDw8IDE2KQorCQkJCSAgIHwgKChic3RvcHJlICYgMHgzRkZGKSA8PCAwKQorCQkJCSAgICk7CisJZGVidWcoIkZTTEREUjogZGRyX3NkcmFtX2ludGVydmFsID0gMHglMDh4XG4iLCBkZHItPmRkcl9zZHJhbV9pbnRlcnZhbCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKy8qIEREUiBTRFJBTSBNb2RlIGNvbmZpZ3VyYXRpb24gc2V0IChERFJfU0RSQU1fTU9ERSkgKi8KK3N0YXRpYyB2b2lkIHNldF9kZHJfc2RyYW1fbW9kZShmc2xfZGRyX2NmZ19yZWdzX3QgKmRkciwKKwkJCSAgICAgICBjb25zdCBtZW1jdGxfb3B0aW9uc190ICpwb3B0cywKKwkJCSAgICAgICBjb25zdCBjb21tb25fdGltaW5nX3BhcmFtc190ICpjb21tb25fZGltbSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2FzX2xhdGVuY3ksCisJCQkgICAgICAgdW5zaWduZWQgaW50IGFkZGl0aXZlX2xhdGVuY3kpCit7CisJdW5zaWduZWQgc2hvcnQgZXNkbW9kZTsJCS8qIEV4dGVuZGVkIFNEUkFNIG1vZGUgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZG1vZGU7CQkvKiBTRFJBTSBtb2RlICovCisKKwkvKiBNb2RlIFJlZ2lzdGVyIC0gTVIxICovCisJdW5zaWduZWQgaW50IHFvZmYgPSAwOwkJLyogT3V0cHV0IGJ1ZmZlciBlbmFibGUgMD15ZXMsIDE9bm8gKi8KKwl1bnNpZ25lZCBpbnQgdGRxc19lbiA9IDA7CS8qIFREUVMgRW5hYmxlOiAwPW5vLCAxPXllcyAqLworCXVuc2lnbmVkIGludCBydHQ7CisJdW5zaWduZWQgaW50IHdybHZsX2VuID0gMDsJLyogV3JpdGUgbGV2ZWwgZW5hYmxlOiAwPW5vLCAxPXllcyAqLworCXVuc2lnbmVkIGludCBhbCA9IDA7CQkvKiBQb3N0ZWQgQ0FTIyBhZGRpdGl2ZSBsYXRlbmN5IChBTCkgKi8KKwl1bnNpZ25lZCBpbnQgZGljID0gMTsJCS8qIE91dHB1dCBkcml2ZXIgaW1wZWRhbmNlLCAzNG9obSAqLworCXVuc2lnbmVkIGludCBkbGxfZW4gPSAwOwkvKiBETEwgRW5hYmxlICAwPUVuYWJsZSAoTm9ybWFsKSwKKwkJCQkJCSAgICAgICAxPURpc2FibGUgKFRlc3QvRGVidWcpICovCisKKwkvKiBNb2RlIFJlZ2lzdGVyIC0gTVIwICovCisJdW5zaWduZWQgaW50IGRsbF9vbjsJLyogRExMIGNvbnRyb2wgZm9yIHByZWNoYXJnZSBQRCwgMD1vZmYsIDE9b24gKi8KKwl1bnNpZ25lZCBpbnQgd3I7CS8qIFdyaXRlIFJlY292ZXJ5ICovCisJdW5zaWduZWQgaW50IGRsbF9yc3Q7CS8qIERMTCBSZXNldCAqLworCXVuc2lnbmVkIGludCBtb2RlOwkvKiBOb3JtYWw9MCBvciBUZXN0PTEgKi8KKwl1bnNpZ25lZCBpbnQgY2FzbGF0ID0gNDsvKiBDQVMjIGxhdGVuY3ksIGRlZmF1bHQgc2V0IGFzIDYgY3ljbGVzICovCisJLyogQlQ6IEJ1cnN0IFR5cGUgKDA9TmliYmxlIFNlcXVlbnRpYWwsIDE9SW50ZXJsZWF2ZWQpICovCisJdW5zaWduZWQgaW50IGJ0OworCXVuc2lnbmVkIGludCBibDsJLyogQkw6IEJ1cnN0IExlbmd0aCAqLworCisJdW5zaWduZWQgaW50IHdyX21jbGs7CisKKwljb25zdCB1bnNpZ25lZCBpbnQgbWNsa19wcyA9IGdldF9tZW1vcnlfY2xrX3BlcmlvZF9wcygpOworCisJcnR0ID0gZnNsX2Rkcl9nZXRfcnR0KCk7CisJaWYgKHBvcHRzLT5ydHRfb3ZlcnJpZGUpCisJCXJ0dCA9IHBvcHRzLT5ydHRfb3ZlcnJpZGVfdmFsdWU7CisKKwlpZiAoYWRkaXRpdmVfbGF0ZW5jeSA9PSAoY2FzX2xhdGVuY3kgLSAxKSkKKwkJYWwgPSAxOworCWlmIChhZGRpdGl2ZV9sYXRlbmN5ID09IChjYXNfbGF0ZW5jeSAtIDIpKQorCQlhbCA9IDI7CisKKwkvKgorCSAqIFRoZSBlc2Rtb2RlIHZhbHVlIHdpbGwgYWxzbyBiZSB1c2VkIGZvciB3cml0aW5nCisJICogTVIxIGR1cmluZyB3cml0ZSBsZXZlbGluZyBmb3IgRERSMywgYWx0aG91Z2ggdGhlCisJICogYml0cyBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgd3JpdGUgbGV2ZWxpbmcKKwkgKiBzY2hlbWUgd2lsbCBiZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIEREUgorCSAqIGNvbnRyb2xsZXIuIHNvIHdlIHNldCB0aGUgd3JsdmxfZW4gPSAwIGhlcmUuCisJICovCisJZXNkbW9kZSA9ICgwCisJCXwgKChxb2ZmICYgMHgxKSA8PCAxMikKKwkJfCAoKHRkcXNfZW4gJiAweDEpIDw8IDExKQorCQl8ICgocnR0ICYgMHg0KSA8PCA3KSAgIC8qIHJ0dCBmaWVsZCBpcyBzcGxpdCAqLworCQl8ICgod3JsdmxfZW4gJiAweDEpIDw8IDcpCisJCXwgKChydHQgJiAweDIpIDw8IDUpICAgLyogcnR0IGZpZWxkIGlzIHNwbGl0ICovCisJCXwgKChkaWMgJiAweDIpIDw8IDQpICAgLyogRElDIGZpZWxkIGlzIHNwbGl0ICovCisJCXwgKChhbCAmIDB4MykgPDwgMykKKwkJfCAoKHJ0dCAmIDB4MSkgPDwgMikgIC8qIHJ0dCBmaWVsZCBpcyBzcGxpdCAqLworCQl8ICgoZGljICYgMHgxKSA8PCAxKSAgIC8qIERJQyBmaWVsZCBpcyBzcGxpdCAqLworCQl8ICgoZGxsX2VuICYgMHgxKSA8PCAwKQorCQkpOworCisJLyoKKwkgKiBETEwgY29udHJvbCBmb3IgcHJlY2hhcmdlIFBECisJICogMD1zbG93IGV4aXQgRExMIG9mZiAodFhQRExMKQorCSAqIDE9ZmFzdCBleGl0IERMTCBvbiAodFhQKQorCSAqLworCWRsbF9vbiA9IDE7CisJd3JfbWNsayA9IChjb21tb25fZGltbS0+dFdSX3BzICsgbWNsa19wcyAtIDEpIC8gbWNsa19wczsKKwlpZiAod3JfbWNsayA+PSAxMikKKwkJd3IgPSA2OworCWVsc2UgaWYgKHdyX21jbGsgPj0gOSkKKwkJd3IgPSA1OworCWVsc2UKKwkJd3IgPSB3cl9tY2xrIC0gNDsKKwlkbGxfcnN0ID0gMDsJLyogZGxsIG5vIHJlc2V0ICovCisJbW9kZSA9IDA7CS8qIG5vcm1hbCBtb2RlICovCisKKwkvKiBsb29rIHVwIHRhYmxlIHRvIGdldCB0aGUgY2FzIGxhdGVuY3kgYml0cyAqLworCWlmIChjYXNfbGF0ZW5jeSA+PSA1ICYmIGNhc19sYXRlbmN5IDw9IDExKSB7CisJCXVuc2lnbmVkIGNoYXIgY2FzX2xhdGVuY3lfdGFibGVbN10gPSB7CisJCQkweDIsCS8qIDUgY2xvY2tzICovCisJCQkweDQsCS8qIDYgY2xvY2tzICovCisJCQkweDYsCS8qIDcgY2xvY2tzICovCisJCQkweDgsCS8qIDggY2xvY2tzICovCisJCQkweGEsCS8qIDkgY2xvY2tzICovCisJCQkweGMsCS8qIDEwIGNsb2NrcyAqLworCQkJMHhlCS8qIDExIGNsb2NrcyAqLworCQl9OworCQljYXNsYXQgPSBjYXNfbGF0ZW5jeV90YWJsZVtjYXNfbGF0ZW5jeSAtIDVdOworCX0KKwlidCA9IDA7CS8qIE5pYmJsZSBzZXF1ZW50aWFsICovCisKKwlzd2l0Y2ggKHBvcHRzLT5idXJzdF9sZW5ndGgpIHsKKwljYXNlIEREUl9CTDg6CisJCWJsID0gMDsKKwkJYnJlYWs7CisJY2FzZSBERFJfT1RGOgorCQlibCA9IDE7CisJCWJyZWFrOworCWNhc2UgRERSX0JDNDoKKwkJYmwgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIkVycm9yOiBpbnZhbGlkIGJ1cnN0IGxlbmd0aCBvZiAldSBzcGVjaWZpZWQuICIKKwkJCSIgRGVmYXVsdGluZyB0byBvbi10aGUtZmx5IEJDNCBvciBCTDggYmVhdHMuXG4iLAorCQkJcG9wdHMtPmJ1cnN0X2xlbmd0aCk7CisJCWJsID0gMTsKKwkJYnJlYWs7CisJfQorCisJc2Rtb2RlID0gKDAKKwkJICB8ICgoZGxsX29uICYgMHgxKSA8PCAxMikKKwkJICB8ICgod3IgJiAweDcpIDw8IDkpCisJCSAgfCAoKGRsbF9yc3QgJiAweDEpIDw8IDgpCisJCSAgfCAoKG1vZGUgJiAweDEpIDw8IDcpCisJCSAgfCAoKChjYXNsYXQgPj4gMSkgJiAweDcpIDw8IDQpCisJCSAgfCAoKGJ0ICYgMHgxKSA8PCAzKQorCQkgIHwgKChibCAmIDB4MykgPDwgMCkKKwkJICApOworCisJZGRyLT5kZHJfc2RyYW1fbW9kZSA9ICgwCisJCQkgICAgICAgfCAoKGVzZG1vZGUgJiAweEZGRkYpIDw8IDE2KQorCQkJICAgICAgIHwgKChzZG1vZGUgJiAweEZGRkYpIDw8IDApCisJCQkgICAgICAgKTsKKworCWRlYnVnKCJGU0xERFI6IGRkcl9zZHJhbV9tb2RlID0gMHglMDh4XG4iLCBkZHItPmRkcl9zZHJhbV9tb2RlKTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19GU0xfRERSMyAqLworCisvKiBERFIgU0RSQU0gTW9kZSBjb25maWd1cmF0aW9uIHNldCAoRERSX1NEUkFNX01PREUpICovCitzdGF0aWMgdm9pZCBzZXRfZGRyX3NkcmFtX21vZGUoZnNsX2Rkcl9jZmdfcmVnc190ICpkZHIsCisJCQkgICAgICAgY29uc3QgbWVtY3RsX29wdGlvbnNfdCAqcG9wdHMsCisJCQkgICAgICAgY29uc3QgY29tbW9uX3RpbWluZ19wYXJhbXNfdCAqY29tbW9uX2RpbW0sCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNhc19sYXRlbmN5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBhZGRpdGl2ZV9sYXRlbmN5KQoreworCXVuc2lnbmVkIHNob3J0IGVzZG1vZGU7CQkvKiBFeHRlbmRlZCBTRFJBTSBtb2RlICovCisJdW5zaWduZWQgc2hvcnQgc2Rtb2RlOwkJLyogU0RSQU0gbW9kZSAqLworCisJLyoKKwkgKiBGSVhNRTogVGhpcyBvdWdodCB0byBiZSBwcmUtY2FsY3VsYXRlZCBpbiBhCisJICogdGVjaG5vbG9neS1zcGVjaWZpYyByb3V0aW5lLAorCSAqIGUuZy4gY29tcHV0ZV9ERFIyX21vZGVfcmVnaXN0ZXIoKSwgYW5kIHRoZW4gdGhlCisJICogc2Rtb2RlIGFuZCBlc2Rtb2RlIHBhc3NlZCBpbiBhcyBwYXJ0IG9mIGNvbW1vbl9kaW1tLgorCSAqLworCisJLyogRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciAqLworCXVuc2lnbmVkIGludCBtcnMgPSAwOwkJLyogTW9kZSBSZWdpc3RlciBTZXQgKi8KKwl1bnNpZ25lZCBpbnQgb3V0cHV0cyA9IDA7CS8qIDA9RW5hYmxlZCwgMT1EaXNhYmxlZCAqLworCXVuc2lnbmVkIGludCByZHFzX2VuID0gMDsJLyogUkRRUyBFbmFibGU6IDA9bm8sIDE9eWVzICovCisJdW5zaWduZWQgaW50IGRxc19lbiA9IDA7CS8qIERRUyMgRW5hYmxlOiAwPWVuYWJsZSwgMT1kaXNhYmxlICovCisJdW5zaWduZWQgaW50IG9jZCA9IDA7CQkvKiAweDA9T0NEIG5vdCBzdXBwb3J0ZWQsCisJCQkJCSAgIDB4Nz1PQ0QgZGVmYXVsdCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBydHQ7CisJdW5zaWduZWQgaW50IGFsOwkJLyogUG9zdGVkIENBUyMgYWRkaXRpdmUgbGF0ZW5jeSAoQUwpICovCisJdW5zaWduZWQgaW50IG9kcyA9IDA7CQkvKiBPdXRwdXQgRHJpdmUgU3RyZW5ndGg6CisJCQkJCQkwID0gRnVsbCBzdHJlbmd0aCAoMThvaG0pCisJCQkJCQkxID0gUmVkdWNlZCBzdHJlbmd0aCAoNG9obSkgKi8KKwl1bnNpZ25lZCBpbnQgZGxsX2VuID0gMDsJLyogRExMIEVuYWJsZSAgMD1FbmFibGUgKE5vcm1hbCksCisJCQkJCQkgICAgICAgMT1EaXNhYmxlIChUZXN0L0RlYnVnKSAqLworCisJLyogTW9kZSBSZWdpc3RlciAoTVIpICovCisJdW5zaWduZWQgaW50IG1yOwkvKiBNb2RlIFJlZ2lzdGVyIERlZmluaXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgcGQ7CS8qIFBvd2VyLURvd24gTW9kZSAqLworCXVuc2lnbmVkIGludCB3cjsJLyogV3JpdGUgUmVjb3ZlcnkgKi8KKwl1bnNpZ25lZCBpbnQgZGxsX3JlczsJLyogRExMIFJlc2V0ICovCisJdW5zaWduZWQgaW50IG1vZGU7CS8qIE5vcm1hbD0wIG9yIFRlc3Q9MSAqLworCXVuc2lnbmVkIGludCBjYXNsYXQgPSAwOy8qIENBUyMgbGF0ZW5jeSAqLworCS8qIEJUOiBCdXJzdCBUeXBlICgwPVNlcXVlbnRpYWwsIDE9SW50ZXJsZWF2ZWQpICovCisJdW5zaWduZWQgaW50IGJ0OworCXVuc2lnbmVkIGludCBibDsJLyogQkw6IEJ1cnN0IExlbmd0aCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjIpCisJY29uc3QgdW5zaWduZWQgaW50IG1jbGtfcHMgPSBnZXRfbWVtb3J5X2Nsa19wZXJpb2RfcHMoKTsKKyNlbmRpZgorCisJcnR0ID0gZnNsX2Rkcl9nZXRfcnR0KCk7CisKKwlhbCA9IGFkZGl0aXZlX2xhdGVuY3k7CisKKwllc2Rtb2RlID0gKDAKKwkJfCAoKG1ycyAmIDB4MykgPDwgMTQpCisJCXwgKChvdXRwdXRzICYgMHgxKSA8PCAxMikKKwkJfCAoKHJkcXNfZW4gJiAweDEpIDw8IDExKQorCQl8ICgoZHFzX2VuICYgMHgxKSA8PCAxMCkKKwkJfCAoKG9jZCAmIDB4NykgPDwgNykKKwkJfCAoKHJ0dCAmIDB4MikgPDwgNSkgICAvKiBydHQgZmllbGQgaXMgc3BsaXQgKi8KKwkJfCAoKGFsICYgMHg3KSA8PCAzKQorCQl8ICgocnR0ICYgMHgxKSA8PCAyKSAgIC8qIHJ0dCBmaWVsZCBpcyBzcGxpdCAqLworCQl8ICgob2RzICYgMHgxKSA8PCAxKQorCQl8ICgoZGxsX2VuICYgMHgxKSA8PCAwKQorCQkpOworCisJbXIgPSAwOwkJIC8qIEZJWE1FOiBDSEVDS01FICovCisKKwkvKgorCSAqIDAgPSBGYXN0IEV4aXQgKE5vcm1hbCkKKwkgKiAxID0gU2xvdyBFeGl0IChMb3cgUG93ZXIpCisJICovCisJcGQgPSAwOworCisjaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjEpCisJd3IgPSAwOyAgICAgICAvKiBIaXN0b3JpY2FsICovCisjZWxpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMikKKwl3ciA9IChjb21tb25fZGltbS0+dFdSX3BzICsgbWNsa19wcyAtIDEpIC8gbWNsa19wcyAtIDE7CisjZW5kaWYKKwlkbGxfcmVzID0gMDsKKwltb2RlID0gMDsKKworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIxKQorCWlmICgxIDw9IGNhc19sYXRlbmN5ICYmIGNhc19sYXRlbmN5IDw9IDQpIHsKKwkJdW5zaWduZWQgY2hhciBtb2RlX2Nhc2xhdF90YWJsZVs0XSA9IHsKKwkJCTB4NSwJLyogMS41IGNsb2NrcyAqLworCQkJMHgyLAkvKiAyLjAgY2xvY2tzICovCisJCQkweDYsCS8qIDIuNSBjbG9ja3MgKi8KKwkJCTB4MwkvKiAzLjAgY2xvY2tzICovCisJCX07CisJCWNhc2xhdCA9IG1vZGVfY2FzbGF0X3RhYmxlW2Nhc19sYXRlbmN5IC0gMV07CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJXYXJuaW5nOiB1bmtub3duIGNhc19sYXRlbmN5ICVkXG4iLCBjYXNfbGF0ZW5jeSk7CisJfQorI2VsaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjIpCisJY2FzbGF0ID0gY2FzX2xhdGVuY3k7CisjZW5kaWYKKwlidCA9IDA7CisKKwlzd2l0Y2ggKHBvcHRzLT5idXJzdF9sZW5ndGgpIHsKKwljYXNlIEREUl9CTDQ6CisJCWJsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBERFJfQkw4OgorCQlibCA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiRXJyb3I6IGludmFsaWQgYnVyc3QgbGVuZ3RoIG9mICV1IHNwZWNpZmllZC4gIgorCQkJIiBEZWZhdWx0aW5nIHRvIDQgYmVhdHMuXG4iLAorCQkJcG9wdHMtPmJ1cnN0X2xlbmd0aCk7CisJCWJsID0gMjsKKwkJYnJlYWs7CisJfQorCisJc2Rtb2RlID0gKDAKKwkJICB8ICgobXIgJiAweDMpIDw8IDE0KQorCQkgIHwgKChwZCAmIDB4MSkgPDwgMTIpCisJCSAgfCAoKHdyICYgMHg3KSA8PCA5KQorCQkgIHwgKChkbGxfcmVzICYgMHgxKSA8PCA4KQorCQkgIHwgKChtb2RlICYgMHgxKSA8PCA3KQorCQkgIHwgKChjYXNsYXQgJiAweDcpIDw8IDQpCisJCSAgfCAoKGJ0ICYgMHgxKSA8PCAzKQorCQkgIHwgKChibCAmIDB4NykgPDwgMCkKKwkJICApOworCisJZGRyLT5kZHJfc2RyYW1fbW9kZSA9ICgwCisJCQkgICAgICAgfCAoKGVzZG1vZGUgJiAweEZGRkYpIDw8IDE2KQorCQkJICAgICAgIHwgKChzZG1vZGUgJiAweEZGRkYpIDw8IDApCisJCQkgICAgICAgKTsKKwlkZWJ1ZygiRlNMRERSOiBkZHJfc2RyYW1fbW9kZSA9IDB4JTA4eFxuIiwgZGRyLT5kZHJfc2RyYW1fbW9kZSk7Cit9CisjZW5kaWYKKworLyogRERSIFNEUkFNIERhdGEgSW5pdGlhbGl6YXRpb24gKEREUl9EQVRBX0lOSVQpICovCitzdGF0aWMgdm9pZCBzZXRfZGRyX2RhdGFfaW5pdChmc2xfZGRyX2NmZ19yZWdzX3QgKmRkcikKK3sKKwl1bnNpZ25lZCBpbnQgaW5pdF92YWx1ZTsJLyogSW5pdGlhbGl6YXRpb24gdmFsdWUgKi8KKworCWluaXRfdmFsdWUgPSAweERFQURCRUVGOworCWRkci0+ZGRyX2RhdGFfaW5pdCA9IGluaXRfdmFsdWU7Cit9CisKKy8qCisgKiBERFIgU0RSQU0gQ2xvY2sgQ29udHJvbCAoRERSX1NEUkFNX0NMS19DTlRMKQorICogVGhlIG9sZCBjb250cm9sbGVyIG9uIHRoZSA4NTQwLzYwIGRvZXNuJ3QgaGF2ZSB0aGlzIHJlZ2lzdGVyLgorICogSG9wZSBpdCdzIE9LIHRvIHNldCBpdCAodG8gMCkgYW55d2F5LgorICovCitzdGF0aWMgdm9pZCBzZXRfZGRyX3NkcmFtX2Nsa19jbnRsKGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyLAorCQkJCQkgY29uc3QgbWVtY3RsX29wdGlvbnNfdCAqcG9wdHMpCit7CisJdW5zaWduZWQgaW50IGNsa19hZGp1c3Q7CS8qIENsb2NrIGFkanVzdCAqLworCisJY2xrX2FkanVzdCA9IHBvcHRzLT5jbGtfYWRqdXN0OworCWRkci0+ZGRyX3NkcmFtX2Nsa19jbnRsID0gKGNsa19hZGp1c3QgJiAweEYpIDw8IDIzOworfQorCisvKiBERFIgSW5pdGlhbGl6YXRpb24gQWRkcmVzcyAoRERSX0lOSVRfQUREUikgKi8KK3N0YXRpYyB2b2lkIHNldF9kZHJfaW5pdF9hZGRyKGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyKQoreworCXVuc2lnbmVkIGludCBpbml0X2FkZHIgPSAwOwkvKiBJbml0aWFsaXphdGlvbiBhZGRyZXNzICovCisKKwlkZHItPmRkcl9pbml0X2FkZHIgPSBpbml0X2FkZHI7Cit9CisKKy8qIEREUiBJbml0aWFsaXphdGlvbiBBZGRyZXNzIChERFJfSU5JVF9FWFRfQUREUikgKi8KK3N0YXRpYyB2b2lkIHNldF9kZHJfaW5pdF9leHRfYWRkcihmc2xfZGRyX2NmZ19yZWdzX3QgKmRkcikKK3sKKwl1bnNpZ25lZCBpbnQgdWlhID0gMDsJLyogVXNlIGluaXRpYWxpemF0aW9uIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgaW5pdF9leHRfYWRkciA9IDA7CS8qIEluaXRpYWxpemF0aW9uIGFkZHJlc3MgKi8KKworCWRkci0+ZGRyX2luaXRfZXh0X2FkZHIgPSAoMAorCQkJCSAgfCAoKHVpYSAmIDB4MSkgPDwgMzEpCisJCQkJICB8IChpbml0X2V4dF9hZGRyICYgMHhGKQorCQkJCSAgKTsKK30KKworLyogRERSIFNEUkFNIFRpbWluZyBDb25maWd1cmF0aW9uIDQgKFRJTUlOR19DRkdfNCkgKi8KK3N0YXRpYyB2b2lkIHNldF90aW1pbmdfY2ZnXzQoZnNsX2Rkcl9jZmdfcmVnc190ICpkZHIsCisJCQkJY29uc3QgbWVtY3RsX29wdGlvbnNfdCAqcG9wdHMpCit7CisJdW5zaWduZWQgaW50IHJ3dCA9IDA7IC8qIFJlYWQtdG8td3JpdGUgdHVybmFyb3VuZCBmb3Igc2FtZSBDUyAqLworCXVuc2lnbmVkIGludCB3cnQgPSAwOyAvKiBXcml0ZS10by1yZWFkIHR1cm5hcm91bmQgZm9yIHNhbWUgQ1MgKi8KKwl1bnNpZ25lZCBpbnQgcnJ0ID0gMDsgLyogUmVhZC10by1yZWFkIHR1cm5hcm91bmQgZm9yIHNhbWUgQ1MgKi8KKwl1bnNpZ25lZCBpbnQgd3d0ID0gMDsgLyogV3JpdGUtdG8td3JpdGUgdHVybmFyb3VuZCBmb3Igc2FtZSBDUyAqLworCXVuc2lnbmVkIGludCBkbGxfbG9jayA9IDA7IC8qIEREUiBTRFJBTSBETEwgTG9jayBUaW1lICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKwlpZiAocG9wdHMtPmJ1cnN0X2xlbmd0aCA9PSBERFJfQkw4KSB7CisJCS8qIFdlIHNldCBCTC8yIGZvciBmaXhlZCBCTDggKi8KKwkJcnJ0ID0gMDsJLyogQkwvMiBjbG9ja3MgKi8KKwkJd3d0ID0gMDsJLyogQkwvMiBjbG9ja3MgKi8KKwl9IGVsc2UgeworCQkvKiBXZSBuZWVkIHRvIHNldCBCTC8yICsgMiB0byBCQzQgYW5kIE9URiAqLworCQlycnQgPSAyOwkvKiBCTC8yICsgMiBjbG9ja3MgKi8KKwkJd3d0ID0gMjsJLyogQkwvMiArIDIgY2xvY2tzICovCisJfQorCWRsbF9sb2NrID0gMTsJLyogdERMTEsgPSA1MTIgY2xvY2tzIGZyb20gc3BlYyAqLworI2VuZGlmCisJZGRyLT50aW1pbmdfY2ZnXzQgPSAoMAorCQkJICAgICB8ICgocnd0ICYgMHhmKSA8PCAyOCkKKwkJCSAgICAgfCAoKHdydCAmIDB4ZikgPDwgMjQpCisJCQkgICAgIHwgKChycnQgJiAweGYpIDw8IDIwKQorCQkJICAgICB8ICgod3d0ICYgMHhmKSA8PCAxNikKKwkJCSAgICAgfCAoZGxsX2xvY2sgJiAweDMpCisJCQkgICAgICk7CisJZGVidWcoIkZTTEREUjogdGltaW5nX2NmZ180ID0gMHglMDh4XG4iLCBkZHItPnRpbWluZ19jZmdfNCk7Cit9CisKKy8qIEREUiBTRFJBTSBUaW1pbmcgQ29uZmlndXJhdGlvbiA1IChUSU1JTkdfQ0ZHXzUpICovCitzdGF0aWMgdm9pZCBzZXRfdGltaW5nX2NmZ181KGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyKQoreworCXVuc2lnbmVkIGludCByb2R0X29uID0gMDsJLyogUmVhZCB0byBPRFQgb24gKi8KKwl1bnNpZ25lZCBpbnQgcm9kdF9vZmYgPSAwOwkvKiBSZWFkIHRvIE9EVCBvZmYgKi8KKwl1bnNpZ25lZCBpbnQgd29kdF9vbiA9IDA7CS8qIFdyaXRlIHRvIE9EVCBvbiAqLworCXVuc2lnbmVkIGludCB3b2R0X29mZiA9IDA7CS8qIFdyaXRlIHRvIE9EVCBvZmYgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIzKQorCXJvZHRfb24gPSAzOwkvKiAgMiBjbG9ja3MgKi8KKwlyb2R0X29mZiA9IDQ7CS8qICA0IGNsb2NrcyAqLworCXdvZHRfb24gPSAyOwkvKiAgMSBjbG9ja3MgKi8KKwl3b2R0X29mZiA9IDQ7CS8qICA0IGNsb2NrcyAqLworI2VuZGlmCisKKwlkZHItPnRpbWluZ19jZmdfNSA9ICgwCisJCQkgICAgIHwgKChyb2R0X29uICYgMHgxZikgPDwgMjQpCisJCQkgICAgIHwgKChyb2R0X29mZiAmIDB4NykgPDwgMjApCisJCQkgICAgIHwgKCh3b2R0X29uICYgMHgxZikgPDwgMTIpCisJCQkgICAgIHwgKCh3b2R0X29mZiAmIDB4NykgPDwgOCkKKwkJCSAgICAgKTsKKwlkZWJ1ZygiRlNMRERSOiB0aW1pbmdfY2ZnXzUgPSAweCUwOHhcbiIsIGRkci0+dGltaW5nX2NmZ181KTsKK30KKworLyogRERSIFpRIENhbGlicmF0aW9uIENvbnRyb2wgKEREUl9aUV9DTlRMKSAqLworc3RhdGljIHZvaWQgc2V0X2Rkcl96cV9jbnRsKGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyLCB1bnNpZ25lZCBpbnQgenFfZW4pCit7CisJdW5zaWduZWQgaW50IHpxaW5pdCA9IDA7LyogUE9SIFpRIENhbGlicmF0aW9uIFRpbWUgKHRaUWluaXQpICovCisJLyogTm9ybWFsIE9wZXJhdGlvbiBGdWxsIENhbGlicmF0aW9uIFRpbWUgKHRaUW9wZXIpICovCisJdW5zaWduZWQgaW50IHpxb3BlciA9IDA7CisJLyogTm9ybWFsIE9wZXJhdGlvbiBTaG9ydCBDYWxpYnJhdGlvbiBUaW1lICh0WlFDUykgKi8KKwl1bnNpZ25lZCBpbnQgenFjcyA9IDA7CisKKwlpZiAoenFfZW4pIHsKKwkJenFpbml0ID0gOTsJLyogNTEyIGNsb2NrcyAqLworCQl6cW9wZXIgPSA4OwkvKiAyNTYgY2xvY2tzICovCisJCXpxY3MgPSA2OwkvKiA2NCBjbG9ja3MgKi8KKwl9CisKKwlkZHItPmRkcl96cV9jbnRsID0gKDAKKwkJCSAgICB8ICgoenFfZW4gJiAweDEpIDw8IDMxKQorCQkJICAgIHwgKCh6cWluaXQgJiAweEYpIDw8IDI0KQorCQkJICAgIHwgKCh6cW9wZXIgJiAweEYpIDw8IDE2KQorCQkJICAgIHwgKCh6cWNzICYgMHhGKSA8PCA4KQorCQkJICAgICk7Cit9CisKKy8qIEREUiBXcml0ZSBMZXZlbGluZyBDb250cm9sIChERFJfV1JMVkxfQ05UTCkgKi8KK3N0YXRpYyB2b2lkIHNldF9kZHJfd3JsdmxfY250bChmc2xfZGRyX2NmZ19yZWdzX3QgKmRkciwgdW5zaWduZWQgaW50IHdybHZsX2VuLAorCQkJCWNvbnN0IG1lbWN0bF9vcHRpb25zX3QgKnBvcHRzKQoreworCS8qCisJICogRmlyc3QgRFFTIHB1bHNlIHJpc2luZyBlZGdlIGFmdGVyIG1hcmdpbmluZyBtb2RlCisJICogaXMgcHJvZ3JhbW1lZCAodFdMX01SRCkKKwkgKi8KKwl1bnNpZ25lZCBpbnQgd3JsdmxfbXJkID0gMDsKKwkvKiBPRFQgZGVsYXkgYWZ0ZXIgbWFyZ2luaW5nIG1vZGUgaXMgcHJvZ3JhbW1lZCAodFdMX09EVEVOKSAqLworCXVuc2lnbmVkIGludCB3cmx2bF9vZHRlbiA9IDA7CisJLyogRFFTL0RRU18gZGVsYXkgYWZ0ZXIgbWFyZ2luaW5nIG1vZGUgaXMgcHJvZ3JhbW1lZCAodFdMX0RRU0VOKSAqLworCXVuc2lnbmVkIGludCB3cmx2bF9kcXNlbiA9IDA7CisJLyogV1JMVkxfU01QTDogV3JpdGUgbGV2ZWxpbmcgc2FtcGxlIHRpbWUgKi8KKwl1bnNpZ25lZCBpbnQgd3Jsdmxfc21wbCA9IDA7CisJLyogV1JMVkxfV0xSOiBXcml0ZSBsZXZlbGluZyByZXBlaXRpb24gdGltZSAqLworCXVuc2lnbmVkIGludCB3cmx2bF93bHIgPSAwOworCS8qIFdSTFZMX1NUQVJUOiBXcml0ZSBsZXZlbGluZyBzdGFydCB0aW1lICovCisJdW5zaWduZWQgaW50IHdybHZsX3N0YXJ0ID0gMDsKKworCS8qIHN1Z2dlc3QgZW5hYmxlIHdyaXRlIGxldmVsaW5nIGZvciBERFIzIGR1ZSB0byBmbHktYnkgdG9wb2xvZ3kgKi8KKwlpZiAod3JsdmxfZW4pIHsKKwkJLyogdFdMX01SRCBtaW4gPSA0MCBuQ0ssIHdlIHNldCBpdCA2NCAqLworCQl3cmx2bF9tcmQgPSAweDY7CisJCS8qIHRXTF9PRFRFTiAxMjggKi8KKwkJd3Jsdmxfb2R0ZW4gPSAweDc7CisJCS8qIHRXTF9EUVNFTiBtaW4gPSAyNSBuQ0ssIHdlIHNldCBpdCAzMiAqLworCQl3cmx2bF9kcXNlbiA9IDB4NTsKKwkJLyoKKwkJICogV3JpdGUgbGV2ZWxpbmcgc2FtcGxlIHRpbWUgYXQgbGVhc3QgbmVlZCA2IGNsb2NrcworCQkgKiBoaWdoZXIgdGhhbiB0V0xPIHRvIGFsbG93IGVub3VnaCB0aW1lIGZvciBwcm9nYWdhdGlvbgorCQkgKiBkZWxheSBhbmQgc2FtcGxpbmcgdGhlIHByaW1lIGRhdGEgYml0cy4KKwkJICovCisJCXdybHZsX3NtcGwgPSAweGY7CisJCS8qCisJCSAqIFdyaXRlIGxldmVsaW5nIHJlcGV0aXRpb24gdGltZQorCQkgKiBhdCBsZWFzdCB0V0xPICsgNiBjbG9ja3MgY2xvY2tzCisJCSAqIHdlIHNldCBpdCAzMgorCQkgKi8KKwkJd3Jsdmxfd2xyID0gMHg1OworCQkvKgorCQkgKiBXcml0ZSBsZXZlbGluZyBzdGFydCB0aW1lCisJCSAqIFRoZSB2YWx1ZSB1c2UgZm9yIHRoZSBEUVNfQURKVVNUIGZvciB0aGUgZmlyc3Qgc2FtcGxlCisJCSAqIHdoZW4gd3JpdGUgbGV2ZWxpbmcgaXMgZW5hYmxlZC4KKwkJICovCisJCXdybHZsX3N0YXJ0ID0gMHg4OworCQkvKgorCQkgKiBPdmVycmlkZSB0aGUgd3JpdGUgbGV2ZWxpbmcgc2FtcGxlIGFuZCBzdGFydCB0aW1lCisJCSAqIGFjY29yZGluZyB0byBzcGVjaWZpYyBib2FyZAorCQkgKi8KKwkJaWYgKHBvcHRzLT53cmx2bF9vdmVycmlkZSkgeworCQkJd3Jsdmxfc21wbCA9IHBvcHRzLT53cmx2bF9zYW1wbGU7CisJCQl3cmx2bF9zdGFydCA9IHBvcHRzLT53cmx2bF9zdGFydDsKKwkJfQorCX0KKworCWRkci0+ZGRyX3dybHZsX2NudGwgPSAoMAorCQkJICAgICAgIHwgKCh3cmx2bF9lbiAmIDB4MSkgPDwgMzEpCisJCQkgICAgICAgfCAoKHdybHZsX21yZCAmIDB4NykgPDwgMjQpCisJCQkgICAgICAgfCAoKHdybHZsX29kdGVuICYgMHg3KSA8PCAyMCkKKwkJCSAgICAgICB8ICgod3JsdmxfZHFzZW4gJiAweDcpIDw8IDE2KQorCQkJICAgICAgIHwgKCh3cmx2bF9zbXBsICYgMHhmKSA8PCAxMikKKwkJCSAgICAgICB8ICgod3Jsdmxfd2xyICYgMHg3KSA8PCA4KQorCQkJICAgICAgIHwgKCh3cmx2bF9zdGFydCAmIDB4MUYpIDw8IDApCisJCQkgICAgICAgKTsKK30KKworLyogRERSIFNlbGYgUmVmcmVzaCBDb3VudGVyIChERFJfU1JfQ05UUikgKi8KK3N0YXRpYyB2b2lkIHNldF9kZHJfc3JfY250cihmc2xfZGRyX2NmZ19yZWdzX3QgKmRkciwgdW5zaWduZWQgaW50IHNyX2l0KQoreworCS8qIFNlbGYgUmVmcmVzaCBJZGxlIFRocmVzaG9sZCAqLworCWRkci0+ZGRyX3NyX2NudHIgPSAoc3JfaXQgJiAweEYpIDw8IDE2OworfQorCisvKiBERFIgU0RSQU0gUmVnaXN0ZXIgQ29udHJvbCBXb3JkIDEgKEREUl9TRFJBTV9SQ1dfMSkgKi8KK3N0YXRpYyB2b2lkIHNldF9kZHJfc2RyYW1fcmN3XzEoZnNsX2Rkcl9jZmdfcmVnc190ICpkZHIpCit7CisJdW5zaWduZWQgaW50IHJjdzAgPSAwOwkvKiBSQ1cwOiBSZWdpc3RlciBDb250cm9sIFdvcmQgMCAqLworCXVuc2lnbmVkIGludCByY3cxID0gMDsJLyogUkNXMTogUmVnaXN0ZXIgQ29udHJvbCBXb3JkIDEgKi8KKwl1bnNpZ25lZCBpbnQgcmN3MiA9IDA7CS8qIFJDVzI6IFJlZ2lzdGVyIENvbnRyb2wgV29yZCAyICovCisJdW5zaWduZWQgaW50IHJjdzMgPSAwOwkvKiBSQ1czOiBSZWdpc3RlciBDb250cm9sIFdvcmQgMyAqLworCXVuc2lnbmVkIGludCByY3c0ID0gMDsJLyogUkNXNDogUmVnaXN0ZXIgQ29udHJvbCBXb3JkIDQgKi8KKwl1bnNpZ25lZCBpbnQgcmN3NSA9IDA7CS8qIFJDVzU6IFJlZ2lzdGVyIENvbnRyb2wgV29yZCA1ICovCisJdW5zaWduZWQgaW50IHJjdzYgPSAwOwkvKiBSQ1c2OiBSZWdpc3RlciBDb250cm9sIFdvcmQgNiAqLworCXVuc2lnbmVkIGludCByY3c3ID0gMDsJLyogUkNXNzogUmVnaXN0ZXIgQ29udHJvbCBXb3JkIDcgKi8KKworCWRkci0+ZGRyX3NkcmFtX3Jjd18xID0gKDAKKwkJCQl8ICgocmN3MCAmIDB4RikgPDwgMjgpCisJCQkJfCAoKHJjdzEgJiAweEYpIDw8IDI0KQorCQkJCXwgKChyY3cyICYgMHhGKSA8PCAyMCkKKwkJCQl8ICgocmN3MyAmIDB4RikgPDwgMTYpCisJCQkJfCAoKHJjdzQgJiAweEYpIDw8IDEyKQorCQkJCXwgKChyY3c1ICYgMHhGKSA8PCA4KQorCQkJCXwgKChyY3c2ICYgMHhGKSA8PCA0KQorCQkJCXwgKChyY3c3ICYgMHhGKSA8PCAwKQorCQkJCSk7Cit9CisKKy8qIEREUiBTRFJBTSBSZWdpc3RlciBDb250cm9sIFdvcmQgMiAoRERSX1NEUkFNX1JDV18yKSAqLworc3RhdGljIHZvaWQgc2V0X2Rkcl9zZHJhbV9yY3dfMihmc2xfZGRyX2NmZ19yZWdzX3QgKmRkcikKK3sKKwl1bnNpZ25lZCBpbnQgcmN3OCA9IDA7CS8qIFJDVzA6IFJlZ2lzdGVyIENvbnRyb2wgV29yZCA4ICovCisJdW5zaWduZWQgaW50IHJjdzkgPSAwOwkvKiBSQ1cxOiBSZWdpc3RlciBDb250cm9sIFdvcmQgOSAqLworCXVuc2lnbmVkIGludCByY3cxMCA9IDA7CS8qIFJDVzI6IFJlZ2lzdGVyIENvbnRyb2wgV29yZCAxMCAqLworCXVuc2lnbmVkIGludCByY3cxMSA9IDA7CS8qIFJDVzM6IFJlZ2lzdGVyIENvbnRyb2wgV29yZCAxMSAqLworCXVuc2lnbmVkIGludCByY3cxMiA9IDA7CS8qIFJDVzQ6IFJlZ2lzdGVyIENvbnRyb2wgV29yZCAxMiAqLworCXVuc2lnbmVkIGludCByY3cxMyA9IDA7CS8qIFJDVzU6IFJlZ2lzdGVyIENvbnRyb2wgV29yZCAxMyAqLworCXVuc2lnbmVkIGludCByY3cxNCA9IDA7CS8qIFJDVzY6IFJlZ2lzdGVyIENvbnRyb2wgV29yZCAxNCAqLworCXVuc2lnbmVkIGludCByY3cxNSA9IDA7CS8qIFJDVzc6IFJlZ2lzdGVyIENvbnRyb2wgV29yZCAxNSAqLworCisJZGRyLT5kZHJfc2RyYW1fcmN3XzIgPSAoMAorCQkJCXwgKChyY3c4ICYgMHhGKSA8PCAyOCkKKwkJCQl8ICgocmN3OSAmIDB4RikgPDwgMjQpCisJCQkJfCAoKHJjdzEwICYgMHhGKSA8PCAyMCkKKwkJCQl8ICgocmN3MTEgJiAweEYpIDw8IDE2KQorCQkJCXwgKChyY3cxMiAmIDB4RikgPDwgMTIpCisJCQkJfCAoKHJjdzEzICYgMHhGKSA8PCA4KQorCQkJCXwgKChyY3cxNCAmIDB4RikgPDwgNCkKKwkJCQl8ICgocmN3MTUgJiAweEYpIDw8IDApCisJCQkJKTsKK30KKwordW5zaWduZWQgaW50CitjaGVja19mc2xfbWVtY3RsX2NvbmZpZ19yZWdzKGNvbnN0IGZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyKQoreworCXVuc2lnbmVkIGludCByZXMgPSAwOworCisJLyoKKwkgKiBDaGVjayB0aGF0IEREUl9TRFJBTV9DRkdbUkRfRU5dIGFuZCBERFJfU0RSQU1fQ0ZHWzJUX0VOXSBhcmUKKwkgKiBub3Qgc2V0IGF0IHRoZSBzYW1lIHRpbWUuCisJICovCisJaWYgKGRkci0+ZGRyX3NkcmFtX2NmZyAmIDB4MTAwMDAwMDAKKwkgICAgJiYgZGRyLT5kZHJfc2RyYW1fY2ZnICYgMHgwMDAwODAwMCkgeworCQlwcmludGYoIkVycm9yOiBERFJfU0RSQU1fQ0ZHW1JEX0VOXSBhbmQgRERSX1NEUkFNX0NGR1syVF9FTl0gIgorCQkJCSIgc2hvdWxkIG5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZS5cbiIpOworCQlyZXMrKzsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCit1bnNpZ25lZCBpbnQKK2NvbXB1dGVfZnNsX21lbWN0bF9jb25maWdfcmVncyhjb25zdCBtZW1jdGxfb3B0aW9uc190ICpwb3B0cywKKwkJCSAgICAgICBmc2xfZGRyX2NmZ19yZWdzX3QgKmRkciwKKwkJCSAgICAgICBjb25zdCBjb21tb25fdGltaW5nX3BhcmFtc190ICpjb21tb25fZGltbSwKKwkJCSAgICAgICBjb25zdCBkaW1tX3BhcmFtc190ICpkaW1tX3BhcmFtcywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgZGJ3X2NhcF9hZGopCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGNhc19sYXRlbmN5OworCXVuc2lnbmVkIGludCBhZGRpdGl2ZV9sYXRlbmN5OworCXVuc2lnbmVkIGludCBzcl9pdDsKKwl1bnNpZ25lZCBpbnQgenFfZW47CisJdW5zaWduZWQgaW50IHdybHZsX2VuOworCisJbWVtc2V0KGRkciwgMCwgc2l6ZW9mKGZzbF9kZHJfY2ZnX3JlZ3NfdCkpOworCisJaWYgKGNvbW1vbl9kaW1tID09IE5VTEwpIHsKKwkJcHJpbnRmKCJFcnJvcjogc3Vic2V0IERJTU0gcGFyYW1zIHN0cnVjdCBudWxsIHBvaW50ZXJcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFByb2Nlc3Mgb3ZlcnJpZGVzIGZpcnN0LgorCSAqCisJICogRklYTUU6IHNvbWVob3cgYWRkIGRlcmVhdGVkIGNhc2xhdCB0byB0aGlzCisJICovCisJY2FzX2xhdGVuY3kgPSAocG9wdHMtPmNhc19sYXRlbmN5X292ZXJyaWRlKQorCQk/IHBvcHRzLT5jYXNfbGF0ZW5jeV9vdmVycmlkZV92YWx1ZQorCQk6IGNvbW1vbl9kaW1tLT5sb3dlc3RfY29tbW9uX1NQRF9jYXNsYXQ7CisKKwlhZGRpdGl2ZV9sYXRlbmN5ID0gKHBvcHRzLT5hZGRpdGl2ZV9sYXRlbmN5X292ZXJyaWRlKQorCQk/IHBvcHRzLT5hZGRpdGl2ZV9sYXRlbmN5X292ZXJyaWRlX3ZhbHVlCisJCTogY29tbW9uX2RpbW0tPmFkZGl0aXZlX2xhdGVuY3k7CisKKwlzcl9pdCA9IChwb3B0cy0+YXV0b19zZWxmX3JlZnJlc2hfZW4pCisJCT8gcG9wdHMtPnNyX2l0CisJCTogMDsKKwkvKiBaUSBjYWxpYnJhdGlvbiAqLworCXpxX2VuID0gKHBvcHRzLT56cV9lbikgPyAxIDogMDsKKwkvKiB3cml0ZSBsZXZlbGluZyAqLworCXdybHZsX2VuID0gKHBvcHRzLT53cmx2bF9lbikgPyAxIDogMDsKKworCS8qIENoaXAgU2VsZWN0IE1lbW9yeSBCb3VuZHMgKENTbl9CTkRTKSAqLworCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfQ0hJUF9TRUxFQ1RTX1BFUl9DVFJMOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGVhID0gMCwgc2EgPSAwOworCisJCWlmIChwb3B0cy0+YmFfaW50bHZfY3RsICYmIChpID4gMCkgJiYKKwkJCSgocG9wdHMtPmJhX2ludGx2X2N0bCAmIDB4NjApICE9IEZTTF9ERFJfQ1MyX0NTMyApKSB7CisJCQkvKiBEb24ndCBzZXQgdXAgYm91bmRhcmllcyBmb3Igb3RoZXIgQ1MKKwkJCSAqIG90aGVyIHRoYW4gQ1MwLCBpZiBiYW5rIGludGVybGVhdmluZworCQkJICogaXMgZW5hYmxlZCBhbmQgbm90IENTMitDUzMgaW50ZXJsZWF2ZWQuCisJCQkgKiBCdXQgd2UgbmVlZCB0byBzZXQgdGhlIE9EVF9SRF9DRkcgYW5kCisJCQkgKiBPRFRfV1JfQ0ZHIGZvciBDUzFfQ09ORklHIGhlcmUuCisJCQkgKi8KKwkJCXNldF9jc25fY29uZmlnKGksIGRkciwgcG9wdHMsIGRpbW1fcGFyYW1zKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGRpbW1fcGFyYW1zW2kvMl0ubl9yYW5rcyA9PSAwKSB7CisJCQlkZWJ1ZygiU2tpcHBpbmcgc2V0dXAgb2YgQ1MldSAiCisJCQkJImJlY2F1c2Ugbl9yYW5rcyBvbiBESU1NICV1IGlzIDBcbiIsIGksIGkvMik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocG9wdHMtPm1lbWN0bF9pbnRlcmxlYXZpbmcgJiYgcG9wdHMtPmJhX2ludGx2X2N0bCkgeworCQkJLyoKKwkJCSAqIFRoaXMgd29ya3Mgc3VwZXJiYW5rIDJDUworCQkJICogVGhlcmUgYXJlIDIgbWVtb3J5IGNvbnRyb2xsZXJzIGNvbmZpZ3VyZWQKKwkJCSAqIGlkZW50aWNhbGx5LCBtZW1vcnkgaXMgaW50ZXJsZWF2ZWQgYmV0d2VlbiB0aGVtLAorCQkJICogYW5kIGVhY2ggY29udHJvbGxlciB1c2VzIHJhbmsgaW50ZXJsZWF2aW5nIHdpdGhpbgorCQkJICogaXRzZWxmLiBUaGVyZWZvcmUgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgYWRkcmVzcworCQkJICogb24gZWFjaCBjb250cm9sbGVyIGlzIHR3aWNlIHRoZSBhbW91bnQgcHJlc2VudCBvbgorCQkJICogZWFjaCBjb250cm9sbGVyLgorCQkJICovCisJCQl1bnNpZ25lZCBsb25nIGxvbmcgcmFua19kZW5zaXR5CisJCQkJCT0gZGltbV9wYXJhbXNbMF0uY2FwYWNpdHk7CisJCQllYSA9ICgyICogKHJhbmtfZGVuc2l0eSA+PiBkYndfY2FwX2FkaikpIC0gMTsKKwkJfQorCQllbHNlIGlmICghcG9wdHMtPm1lbWN0bF9pbnRlcmxlYXZpbmcgJiYgcG9wdHMtPmJhX2ludGx2X2N0bCkgeworCQkJLyoKKwkJCSAqIElmIG1lbW9yeSBpbnRlcmxlYXZpbmcgYmV0d2VlbiBjb250cm9sbGVycyBpcyBOT1QKKwkJCSAqIGVuYWJsZWQsIHRoZSBzdGFydGluZyBhZGRyZXNzIGZvciBlYWNoIG1lbW9yeQorCQkJICogY29udHJvbGxlciBpcyBkaXN0aW5jdC4gIEhvd2V2ZXIsIGJlY2F1c2UgcmFuaworCQkJICogaW50ZXJsZWF2aW5nIGlzIGVuYWJsZWQsIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nCisJCQkgKiBhZGRyZXNzZXMgb2YgdGhlIHRvdGFsIG1lbW9yeSBvbiB0aGF0IG1lbW9yeQorCQkJICogY29udHJvbGxlciBuZWVkcyB0byBiZSBwcm9ncmFtbWVkIGludG8gaXRzCisJCQkgKiByZXNwZWN0aXZlIENTMF9CTkRTLgorCQkJICovCisJCQl1bnNpZ25lZCBsb25nIGxvbmcgcmFua19kZW5zaXR5CisJCQkJCQk9IGRpbW1fcGFyYW1zW2kvMl0ucmFua19kZW5zaXR5OworCQkJc3dpdGNoIChwb3B0cy0+YmFfaW50bHZfY3RsICYgRlNMX0REUl9DUzBfQ1MxX0NTMl9DUzMpIHsKKwkJCWNhc2UgRlNMX0REUl9DUzBfQ1MxX0NTMl9DUzM6CisJCQkJLyogQ1MwK0NTMStDUzIrQ1MzIGludGVybGVhdmluZywgb25seSBDUzBfQ05EUworCQkJCSAqIG5lZWRzIHRvIGJlIHNldC4KKwkJCQkgKi8KKwkJCQlzYSA9IGNvbW1vbl9kaW1tLT5iYXNlX2FkZHJlc3M7CisJCQkJZWEgPSBzYSArICg0ICogKHJhbmtfZGVuc2l0eSA+PiBkYndfY2FwX2FkaikpLTE7CisJCQkJYnJlYWs7CisJCQljYXNlIEZTTF9ERFJfQ1MwX0NTMV9BTkRfQ1MyX0NTMzoKKwkJCQkvKiBDUzArQ1MxIGFuZCBDUzIrQ1MzIGludGVybGVhdmluZywgQ1MwX0NORFMKKwkJCQkgKiBhbmQgQ1MyX0NORFMgbmVlZCB0byBiZSBzZXQuCisJCQkJICovCisJCQkJaWYgKCEoaSYxKSkgeworCQkJCQlzYSA9IGRpbW1fcGFyYW1zW2kvMl0uYmFzZV9hZGRyZXNzOworCQkJCQllYSA9IHNhICsgKGkgKiAocmFua19kZW5zaXR5ID4+CisJCQkJCQlkYndfY2FwX2FkaikpIC0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEZTTF9ERFJfQ1MwX0NTMToKKwkJCQkvKiBDUzArQ1MxIGludGVybGVhdmluZywgQ1MwX0NORFMgbmVlZHMKKwkJCQkgKiB0byBiZSBzZXQKKwkJCQkgKi8KKwkJCQlzYSA9IGNvbW1vbl9kaW1tLT5iYXNlX2FkZHJlc3M7CisJCQkJZWEgPSBzYSArICgyICogKHJhbmtfZGVuc2l0eSA+PiBkYndfY2FwX2FkaikpLTE7CisJCQkJYnJlYWs7CisJCQljYXNlIEZTTF9ERFJfQ1MyX0NTMzoKKwkJCQkvKiBDUzIrQ1MzIGludGVybGVhdmluZyovCisJCQkJaWYgKGkgPT0gMikgeworCQkJCQlzYSA9IGRpbW1fcGFyYW1zW2kvMl0uYmFzZV9hZGRyZXNzOworCQkJCQllYSA9IHNhICsgKDIgKiAocmFua19kZW5zaXR5ID4+CisJCQkJCQlkYndfY2FwX2FkaikpIC0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAgLyogTm8gYmFuayhjaGlwLXNlbGVjdCkgaW50ZXJsZWF2aW5nICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAocG9wdHMtPm1lbWN0bF9pbnRlcmxlYXZpbmcgJiYgIXBvcHRzLT5iYV9pbnRsdl9jdGwpIHsKKwkJCS8qCisJCQkgKiBPbmx5IHRoZSByYW5rIG9uIENTMCBvZiBlYWNoIG1lbW9yeSBjb250cm9sbGVyIG1heQorCQkJICogYmUgdXNlZCBpZiBtZW1vcnkgY29udHJvbGxlciBpbnRlcmxlYXZpbmcgaXMgdXNlZAorCQkJICogd2l0aG91dCByYW5rIGludGVybGVhdmluZyB3aXRoaW4gZWFjaCBtZW1vcnkKKwkJCSAqIGNvbnRyb2xsZXIuICBIb3dldmVyLCB0aGUgZW5kaW5nIGFkZHJlc3MgcHJvZ3JhbW1lZAorCQkJICogaW50byBlYWNoIENTMCBtdXN0IGJlIHRoZSBzdW0gb2YgdGhlIGFtb3VudCBvZgorCQkJICogbWVtb3J5IGluIHRoZSB0d28gQ1MwIHJhbmtzLgorCQkJICovCisJCQlpZiAoaSA9PSAwKSB7CisJCQkJdW5zaWduZWQgbG9uZyBsb25nIHJhbmtfZGVuc2l0eQorCQkJCQkJPSBkaW1tX3BhcmFtc1swXS5yYW5rX2RlbnNpdHk7CisJCQkJZWEgPSAoMiAqIChyYW5rX2RlbnNpdHkgPj4gZGJ3X2NhcF9hZGopKSAtIDE7CisJCQl9CisKKwkJfQorCQllbHNlIGlmICghcG9wdHMtPm1lbWN0bF9pbnRlcmxlYXZpbmcgJiYgIXBvcHRzLT5iYV9pbnRsdl9jdGwpIHsKKwkJCS8qCisJCQkgKiBObyByYW5rIGludGVybGVhdmluZyBhbmQgbm8gbWVtb3J5IGNvbnRyb2xsZXIKKwkJCSAqIGludGVybGVhdmluZy4KKwkJCSAqLworCQkJdW5zaWduZWQgbG9uZyBsb25nIHJhbmtfZGVuc2l0eQorCQkJCQkJPSBkaW1tX3BhcmFtc1tpLzJdLnJhbmtfZGVuc2l0eTsKKwkJCXNhID0gZGltbV9wYXJhbXNbaS8yXS5iYXNlX2FkZHJlc3M7CisJCQllYSA9IHNhICsgKHJhbmtfZGVuc2l0eSA+PiBkYndfY2FwX2FkaikgLSAxOworCQkJaWYgKGkmMSkgeworCQkJCWlmICgoZGltbV9wYXJhbXNbaS8yXS5uX3JhbmtzID09IDEpKSB7CisJCQkJCS8qIE9kZCBjaGlwIHNlbGVjdCwgc2luZ2xlLXJhbmsgZGltbSAqLworCQkJCQlzYSA9IDA7CisJCQkJCWVhID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBPZGQgY2hpcCBzZWxlY3QsIGR1YWwtcmFuayBESU1NICovCisJCQkJCXNhICs9IHJhbmtfZGVuc2l0eSA+PiBkYndfY2FwX2FkajsKKwkJCQkJZWEgKz0gcmFua19kZW5zaXR5ID4+IGRid19jYXBfYWRqOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXNhID4+PSAyNDsKKwkJZWEgPj49IDI0OworCisJCWRkci0+Y3NbaV0uYm5kcyA9ICgwCisJCQl8ICgoc2EgJiAweEZGRikgPDwgMTYpCS8qIHN0YXJ0aW5nIGFkZHJlc3MgTVNCICovCisJCQl8ICgoZWEgJiAweEZGRikgPDwgMCkJLyogZW5kaW5nIGFkZHJlc3MgTVNCICovCisJCQkpOworCisJCWRlYnVnKCJGU0xERFI6IGNzWyVkXV9ibmRzID0gMHglMDh4XG4iLCBpLCBkZHItPmNzW2ldLmJuZHMpOworCQlzZXRfY3NuX2NvbmZpZyhpLCBkZHIsIHBvcHRzLCBkaW1tX3BhcmFtcyk7CisJCXNldF9jc25fY29uZmlnXzIoaSwgZGRyKTsKKwl9CisKKyNpZiAhZGVmaW5lZChDT05GSUdfRlNMX0REUjEpCisJc2V0X3RpbWluZ19jZmdfMChkZHIpOworI2VuZGlmCisKKwlzZXRfdGltaW5nX2NmZ18zKGRkciwgY29tbW9uX2RpbW0sIGNhc19sYXRlbmN5KTsKKwlzZXRfdGltaW5nX2NmZ18xKGRkciwgcG9wdHMsIGNvbW1vbl9kaW1tLCBjYXNfbGF0ZW5jeSk7CisJc2V0X3RpbWluZ19jZmdfMihkZHIsIHBvcHRzLCBjb21tb25fZGltbSwKKwkJCQljYXNfbGF0ZW5jeSwgYWRkaXRpdmVfbGF0ZW5jeSk7CisKKwlzZXRfZGRyX3NkcmFtX2NmZyhkZHIsIHBvcHRzLCBjb21tb25fZGltbSk7CisKKwlzZXRfZGRyX3NkcmFtX2NmZ18yKGRkciwgcG9wdHMpOworCXNldF9kZHJfc2RyYW1fbW9kZShkZHIsIHBvcHRzLCBjb21tb25fZGltbSwKKwkJCQljYXNfbGF0ZW5jeSwgYWRkaXRpdmVfbGF0ZW5jeSk7CisJc2V0X2Rkcl9zZHJhbV9tb2RlXzIoZGRyLCBwb3B0cyk7CisJc2V0X2Rkcl9zZHJhbV9pbnRlcnZhbChkZHIsIHBvcHRzLCBjb21tb25fZGltbSk7CisJc2V0X2Rkcl9kYXRhX2luaXQoZGRyKTsKKwlzZXRfZGRyX3NkcmFtX2Nsa19jbnRsKGRkciwgcG9wdHMpOworCXNldF9kZHJfaW5pdF9hZGRyKGRkcik7CisJc2V0X2Rkcl9pbml0X2V4dF9hZGRyKGRkcik7CisJc2V0X3RpbWluZ19jZmdfNChkZHIsIHBvcHRzKTsKKwlzZXRfdGltaW5nX2NmZ181KGRkcik7CisKKwlzZXRfZGRyX3pxX2NudGwoZGRyLCB6cV9lbik7CisJc2V0X2Rkcl93cmx2bF9jbnRsKGRkciwgd3JsdmxfZW4sIHBvcHRzKTsKKworCXNldF9kZHJfc3JfY250cihkZHIsIHNyX2l0KTsKKworCXNldF9kZHJfc2RyYW1fcmN3XzEoZGRyKTsKKwlzZXRfZGRyX3NkcmFtX3Jjd18yKGRkcik7CisKKwlyZXR1cm4gY2hlY2tfZnNsX21lbWN0bF9jb25maWdfcmVncyhkZHIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9kZHIuaCBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvZGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyMjA3NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvZGRyLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIEZTTF9ERFJfTUFJTl9ICisjZGVmaW5lIEZTTF9ERFJfTUFJTl9ICisKKyNpbmNsdWRlIDxhc20vZnNsX2Rkcl9zZHJhbS5oPgorI2luY2x1ZGUgPGFzbS9mc2xfZGRyX2RpbW1fcGFyYW1zLmg+CisKKyNpbmNsdWRlICJjb21tb25fdGltaW5nX3BhcmFtcy5oIgorCisvKgorICogQmluZCB0aGUgbWFpbiBERFIgc2V0dXAgZHJpdmVyJ3MgZ2VuZXJpYyBuYW1lcworICogdG8gdGhpcyBzcGVjaWZpYyBERFIgdGVjaG5vbG9neS4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50Citjb21wdXRlX2RpbW1fcGFyYW1ldGVycyhjb25zdCBnZW5lcmljX3NwZF9lZXByb21fdCAqc3BkLAorCQkJZGltbV9wYXJhbXNfdCAqcGRpbW0sCisJCQl1bnNpZ25lZCBpbnQgZGltbV9udW1iZXIpCit7CisJcmV0dXJuIGRkcl9jb21wdXRlX2RpbW1fcGFyYW1ldGVycyhzcGQsIHBkaW1tLCBkaW1tX251bWJlcik7Cit9CisKKy8qCisgKiBEYXRhIFN0cnVjdHVyZXMKKyAqCisgKiBBbGwgZGF0YSBzdHJ1Y3R1cmVzIGhhdmUgdG8gYmUgb24gdGhlIHN0YWNrCisgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19OVU1fRERSX0NUTFJTIENPTkZJR19OVU1fRERSX0NPTlRST0xMRVJTCisjZGVmaW5lIENPTkZJR19TWVNfRElNTV9TTE9UU19QRVJfQ1RMUiBDT05GSUdfRElNTV9TTE9UU19QRVJfQ1RMUgorCit0eXBlZGVmIHN0cnVjdCB7CisJZ2VuZXJpY19zcGRfZWVwcm9tX3QKKwkgICBzcGRfaW5zdGFsbGVkX2RpbW1zW0NPTkZJR19TWVNfTlVNX0REUl9DVExSU11bQ09ORklHX1NZU19ESU1NX1NMT1RTX1BFUl9DVExSXTsKKwlzdHJ1Y3QgZGltbV9wYXJhbXNfcworCSAgIGRpbW1fcGFyYW1zW0NPTkZJR19TWVNfTlVNX0REUl9DVExSU11bQ09ORklHX1NZU19ESU1NX1NMT1RTX1BFUl9DVExSXTsKKwltZW1jdGxfb3B0aW9uc190IG1lbWN0bF9vcHRzW0NPTkZJR19TWVNfTlVNX0REUl9DVExSU107CisJY29tbW9uX3RpbWluZ19wYXJhbXNfdCBjb21tb25fdGltaW5nX3BhcmFtc1tDT05GSUdfU1lTX05VTV9ERFJfQ1RMUlNdOworCWZzbF9kZHJfY2ZnX3JlZ3NfdCBmc2xfZGRyX2NvbmZpZ19yZWdbQ09ORklHX1NZU19OVU1fRERSX0NUTFJTXTsKK30gZnNsX2Rkcl9pbmZvX3Q7CisKKy8qIENvbXB1dGUgc3RlcHMgKi8KKyNkZWZpbmUgU1RFUF9HRVRfU1BEICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBTVEVQX0NPTVBVVEVfRElNTV9QQVJNUyAgICAgICgxIDw8IDEpCisjZGVmaW5lIFNURVBfQ09NUFVURV9DT01NT05fUEFSTVMgICAgKDEgPDwgMikKKyNkZWZpbmUgU1RFUF9HQVRIRVJfT1BUUyAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBTVEVQX0FTU0lHTl9BRERSRVNTRVMgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIFNURVBfQ09NUFVURV9SRUdTICAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgU1RFUF9QUk9HUkFNX1JFR1MgICAgICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBTVEVQX0FMTCAgICAgICAgICAgICAgICAgICAgIDB4RkZGCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcKK2ZzbF9kZHJfY29tcHV0ZShmc2xfZGRyX2luZm9fdCAqcGluZm8sIHVuc2lnbmVkIGludCBzdGFydF9zdGVwKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKiBzdGVwX3RvX3N0cmluZyh1bnNpZ25lZCBpbnQgc3RlcCk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQKK2NvbXB1dGVfZnNsX21lbWN0bF9jb25maWdfcmVncyhjb25zdCBtZW1jdGxfb3B0aW9uc190ICpwb3B0cywKKwkJCSAgICAgICBmc2xfZGRyX2NmZ19yZWdzX3QgKmRkciwKKwkJCSAgICAgICBjb25zdCBjb21tb25fdGltaW5nX3BhcmFtc190ICpjb21tb25fZGltbSwKKwkJCSAgICAgICBjb25zdCBkaW1tX3BhcmFtc190ICpkaW1tX3BhcmFtZXRlcnMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGRid19jYXBhY2l0eV9hZGp1c3QpOworZXh0ZXJuIHVuc2lnbmVkIGludAorY29tcHV0ZV9sb3dlc3RfY29tbW9uX2RpbW1fcGFyYW1ldGVycyhjb25zdCBkaW1tX3BhcmFtc190ICpkaW1tX3BhcmFtcywKKwkJCQkgICAgICBjb21tb25fdGltaW5nX3BhcmFtc190ICpvdXRwZGltbSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpbW1zKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcG9wdWxhdGVfbWVtY3RsX29wdGlvbnMoaW50IGFsbF9ESU1Nc19yZWdpc3RlcmVkLAorCQkJCW1lbWN0bF9vcHRpb25zX3QgKnBvcHRzLAorCQkJCWRpbW1fcGFyYW1zX3QgKnBkaW1tLAorCQkJCXVuc2lnbmVkIGludCBjdHJsX251bSk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgbWNsa190b19waWNvcyh1bnNpZ25lZCBpbnQgbWNsayk7CitleHRlcm4gdW5zaWduZWQgaW50IGdldF9tZW1vcnlfY2xrX3BlcmlvZF9wcyh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcGljb3NfdG9fbWNsayh1bnNpZ25lZCBpbnQgcGljb3MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvZGRyMV9kaW1tX3BhcmFtcy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9kZHIxX2RpbW1fcGFyYW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4NDc2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvZGRyMV9kaW1tX3BhcmFtcy5jCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2Rkcl9zZHJhbS5oPgorCisjaW5jbHVkZSAiZGRyLmgiCisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIERlbnNpdHkgb2YgZWFjaCBQaHlzaWNhbCBSYW5rLgorICogUmV0dXJuZWQgc2l6ZSBpcyBpbiBieXRlcy4KKyAqCisgKiBTdHVkeSB0aGVzZSB0YWJsZSBmcm9tIEJ5dGUgMzEgb2YgSkVERUMgU1BEIFNwZWMuCisgKgorICoJCUREUiBJCUREUiBJSQorICoJQml0CVNpemUJU2l6ZQorICoJLS0tCS0tLS0tCS0tLS0tLQorICoJNyBoaWdoCTUxMk1CCTUxMk1CCisgKgk2CTI1Nk1CCTI1Nk1CCisgKgk1CTEyOE1CCTEyOE1CCisgKgk0CSA2NE1CCSAxNkdCCisgKgkzCSAzMk1CCSAgOEdCCisgKgkyCSAxNk1CCSAgNEdCCisgKgkxCSAgMkdCCSAgMkdCCisgKgkwIGxvdwkgIDFHQgkgIDFHQgorICoKKyAqIFJlb3JkZXIgVGFibGUgdG8gYmUgbGluZWFyIGJ5IHN0cmlwcGluZyB0aGUgYm90dG9tCisgKiAyIG9yIDUgYml0cyBvZmYgYW5kIHNoaWZ0aW5nIHRoZW0gdXAgdG8gdGhlIHRvcC4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nCitjb21wdXRlX3JhbmtzaXplKHVuc2lnbmVkIGludCBtZW1fdHlwZSwgdW5zaWduZWQgY2hhciByb3dfZGVucykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgYnNpemU7CisKKwkvKiBCb3R0b20gMiBiaXRzIHVwIHRvIHRoZSB0b3AuICovCisJYnNpemUgPSAoKHJvd19kZW5zID4+IDIpIHwgKChyb3dfZGVucyAmIDMpIDw8IDYpKTsKKwlic2l6ZSA8PD0gMjRVTEw7CisJZGVidWcoIkREUjogRERSIEkgcmFuayBkZW5zaXR5ID0gMHglMDh4XG4iLCBic2l6ZSk7CisKKwlyZXR1cm4gYnNpemU7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgdHdvLW5pYmJsZSBCQ0QgdmFsdWUgaW50byBhIGN5Y2xlIHRpbWUuCisgKiBXaGlsZSB0aGUgc3BlYyBjYWxscyBmb3IgbmFuby1zZWNvbmRzLCBwaWNvcyBhcmUgcmV0dXJuZWQuCisgKgorICogVGhpcyBpbXBsZW1lbnRzIHRoZSB0YWJsZXMgZm9yIGJ5dGVzIDksIDIzIGFuZCAyNSBmb3IgYm90aAorICogRERSIEkgYW5kIElJLiAgTm8gYWxsb3dhbmNlIGZvciBkaXN0aW5ndWlzaGluZyB0aGUgaW52YWxpZAorICogZmllbGRzIGFic2VudCBmb3IgRERSIEkgeWV0IHByZXNlbnQgaW4gRERSIElJIGlzIG1hZGUuCisgKiAoVGhhdCBpcywgY3ljbGUgdGltZXMgb2YgLjI1LCAuMzMsIC42NiBhbmQgLjc1IG5zIGFyZQorICogYWxsb3dlZCBmb3IgYm90aCBERFIgSUkgYW5kIEkuKQorICovCitzdGF0aWMgdW5zaWduZWQgaW50Citjb252ZXJ0X2JjZF90ZW50aHNfdG9fY3ljbGVfdGltZV9wcyh1bnNpZ25lZCBpbnQgc3BkX3ZhbCkKK3sKKwkvKiBUYWJsZSBsb29rIHVwIHRoZSBsb3dlciBuaWJibGUsIGFsbG93IEREUiBJICYgSUkuICovCisJdW5zaWduZWQgaW50IHRlbnRoc19wc1sxNl0gPSB7CisJCTAsCisJCTEwMCwKKwkJMjAwLAorCQkzMDAsCisJCTQwMCwKKwkJNTAwLAorCQk2MDAsCisJCTcwMCwKKwkJODAwLAorCQk5MDAsCisJCTI1MCwJLyogVGhpcyBhbmQgdGhlIG5leHQgMyBlbnRyaWVzIHZhbGlkIC4uLiAqLworCQkzMzAsCS8qIC4uLiAgb25seSBmb3IgdENLIGNhbGN1bGF0aW9ucy4gKi8KKwkJNjYwLAorCQk3NTAsCisJCTAsCS8qIHVuZGVmaW5lZCAqLworCQkwCS8qIHVuZGVmaW5lZCAqLworCX07CisKKwl1bnNpZ25lZCBpbnQgd2hvbGVfbnMgPSAoc3BkX3ZhbCAmIDB4RjApID4+IDQ7CisJdW5zaWduZWQgaW50IHRlbnRoX25zID0gc3BkX3ZhbCAmIDB4MEY7CisJdW5zaWduZWQgaW50IHBzID0gd2hvbGVfbnMgKiAxMDAwICsgdGVudGhzX3BzW3RlbnRoX25zXTsKKworCXJldHVybiBwczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorY29udmVydF9iY2RfaHVuZHJlZHRoc190b19jeWNsZV90aW1lX3BzKHVuc2lnbmVkIGludCBzcGRfdmFsKQoreworCXVuc2lnbmVkIGludCB0ZW50aF9ucyA9IChzcGRfdmFsICYgMHhGMCkgPj4gNDsKKwl1bnNpZ25lZCBpbnQgaHVuZHJlZHRoX25zID0gc3BkX3ZhbCAmIDB4MEY7CisJdW5zaWduZWQgaW50IHBzID0gdGVudGhfbnMgKiAxMDAgKyBodW5kcmVkdGhfbnMgKiAxMDsKKworCXJldHVybiBwczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBieXRlNDBfdGFibGVfcHNbOF0gPSB7CisJMCwKKwkyNTAsCisJMzMwLAorCTUwMCwKKwk2NjAsCisJNzUwLAorCTAsCS8qIHN1cHBvc2VkIHRvIGJlIFJGQywgYnV0IG5vdCBzdXJlIHdoYXQgdGhhdCBtZWFucyAqLworCTAJLyogVW5kZWZpbmVkICovCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50Citjb21wdXRlX3RyZmNfcHNfZnJvbV9zcGQodW5zaWduZWQgY2hhciB0cmN0cmZjX2V4dCwgdW5zaWduZWQgY2hhciB0cmZjKQoreworCXVuc2lnbmVkIGludCB0cmZjX3BzOworCisJdHJmY19wcyA9ICgoKHRyY3RyZmNfZXh0ICYgMHgxKSAqIDI1NikgKyB0cmZjKSAqIDEwMDAKKwkJKyBieXRlNDBfdGFibGVfcHNbKHRyY3RyZmNfZXh0ID4+IDEpICYgMHg3XTsKKworCXJldHVybiB0cmZjX3BzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Citjb21wdXRlX3RyY19wc19mcm9tX3NwZCh1bnNpZ25lZCBjaGFyIHRyY3RyZmNfZXh0LCB1bnNpZ25lZCBjaGFyIHRyYykKK3sKKwl1bnNpZ25lZCBpbnQgdHJjX3BzOworCisJdHJjX3BzID0gdHJjICogMTAwMCArIGJ5dGU0MF90YWJsZV9wc1sodHJjdHJmY19leHQgPj4gNCkgJiAweDddOworCisJcmV0dXJuIHRyY19wczsKK30KKworLyoKKyAqIHRDS21heCBmcm9tIEREUiBJIFNQRCBCeXRlIDQzCisgKgorICogQml0cyA3OjIgPT0gd2hvbGUgbnMKKyAqIEJpdHMgMTowID09IHF1YXJ0ZXIgbnMKKyAqICAgIDAwICAgID09IDAuMDAgbnMKKyAqICAgIDAxICAgID09IDAuMjUgbnMKKyAqICAgIDEwICAgID09IDAuNTAgbnMKKyAqICAgIDExICAgID09IDAuNzUgbnMKKyAqCisgKiBSZXR1cm5zIHBpY29zZWNvbmRzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50Citjb21wdXRlX3Rja21heF9mcm9tX3NwZF9wcyh1bnNpZ25lZCBpbnQgYnl0ZTQzKQoreworCXJldHVybiAoYnl0ZTQzID4+IDIpICogMTAwMCArIChieXRlNDMgJiAweDMpICogMjUwOworfQorCisvKgorICogRGV0ZXJtaW5lIFJlZnJlc2ggUmF0ZS4gIElnbm9yZSBzZWxmIHJlZnJlc2ggYml0IG9uIEREUiBJLgorICogVGFibGUgZnJvbSBTUEQgU3BlYywgQnl0ZSAxMiwgY29udmVydGVkIHRvIHBpY29zZWNvbmRzIGFuZAorICogZmlsbGVkIGluIHdpdGggImRlZmF1bHQiIG5vcm1hbCB2YWx1ZXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2RldGVybWluZV9yZWZyZXNoX3JhdGVfcHMoY29uc3QgdW5zaWduZWQgaW50IHNwZF9yZWZyZXNoKQoreworCXVuc2lnbmVkIGludCByZWZyZXNoX3RpbWVfcHNbOF0gPSB7CisJCTE1NjI1MDAwLAkvKiAwIE5vcm1hbCAgICAxLjAweCAqLworCQkzOTAwMDAwLAkvKiAxIFJlZHVjZWQgICAgLjI1eCAqLworCQk3ODAwMDAwLAkvKiAyIEV4dGVuZGVkICAgLjUweCAqLworCQkzMTMwMDAwMCwJLyogMyBFeHRlbmRlZCAgMi4wMHggKi8KKwkJNjI1MDAwMDAsCS8qIDQgRXh0ZW5kZWQgIDQuMDB4ICovCisJCTEyNTAwMDAwMCwJLyogNSBFeHRlbmRlZCAgOC4wMHggKi8KKwkJMTU2MjUwMDAsCS8qIDYgTm9ybWFsICAgIDEuMDB4ICBmaWxsZXIgKi8KKwkJMTU2MjUwMDAsCS8qIDcgTm9ybWFsICAgIDEuMDB4ICBmaWxsZXIgKi8KKwl9OworCisJcmV0dXJuIHJlZnJlc2hfdGltZV9wc1tzcGRfcmVmcmVzaCAmIDB4N107Cit9CisKKy8qCisgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGNvbXB1dGUgYSBzdWl0YWJsZQorICogQ0FTIGxhdGVuY3kgZ2l2ZW4gdGhlIERSQU0gY2xvY2sgcGVyaW9kLiAgVGhlIFNQRCBvbmx5CisgKiBkZWZpbmVzIGF0IG1vc3QgMyBDQVMgbGF0ZW5jaWVzLiAgVHlwaWNhbGx5IHRoZSBzbG93ZXIgaW4KKyAqIGZyZXF1ZW5jeSB0aGUgRElNTSBydW5zIGF0LCB0aGUgc2hvcnRlciBpdHMgQ0FTIGxhdGVuY3kgY2FuIGJlLgorICogSWYgdGhlIERJTU0gaXMgb3BlcmF0aW5nIGF0IGEgc3VmZmljaWVudGx5IGxvdyBmcmVxdWVuY3ksCisgKiBpdCBtYXkgYmUgYWJsZSB0byBydW4gYXQgYSBDQVMgbGF0ZW5jeSBzaG9ydGVyIHRoYW4gdGhlCisgKiBzaG9ydGVzdCBTUEQtZGVmaW5lZCBDQVMgbGF0ZW5jeS4KKyAqCisgKiBJZiBhIENBUyBsYXRlbmN5IGlzIG5vdCBmb3VuZCwgMCBpcyByZXR1cm5lZC4KKyAqCisgKiBEbyB0aGlzIGJ5IGZpbmRpbmcgaW4gdGhlIHN0YW5kYXJkIHNwZWVkIGJpbiB0YWJsZSB0aGUgbG9uZ2VzdAorICogdENLbWluIHRoYXQgZG9lc24ndCBleGNlZWQgdGhlIHZhbHVlIG9mIG1jbGtfcHMgKHRDSykuCisgKgorICogQW4gYXNzdW1wdGlvbiBtYWRlIGlzIHRoYXQgdGhlIFNEUkFNIGRldmljZSBhbGxvd3MgdGhlCisgKiBDTCB0byBiZSBwcm9ncmFtbWVkIGZvciBhIHZhbHVlIHRoYXQgaXMgbG93ZXIgdGhhbiB0aG9zZQorICogYWR2ZXJ0aXNlZCBieSB0aGUgU1BELiAgVGhpcyBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLAorICogYXMgdGhvc2UgbW9kZXMgbm90IGRlZmluZWQgaW4gdGhlIFNQRCBhcmUgb3B0aW9uYWwuCisgKgorICogQ0FTIGxhdGVuY3kgZGUtcmF0aW5nIGJhc2VkIHVwb24gdmFsdWVzIEpFREVDIFN0YW5kYXJkIE5vLiA3OS1FCisgKiBUYWJsZSAxMS4KKyAqCisgKiBvcmRpbmFsIDIsIGRkcjFfc3BlZWRfYmluc1sxXSBjb250YWlucyB0Q0sgZm9yIENMPTIKKyAqLworCQkJCSAgLyogICBDTDIuMCBDTDIuNSBDTDMuMCAgKi8KK3Vuc2lnbmVkIHNob3J0IGRkcjFfc3BlZWRfYmluc1tdID0gezAsIDc1MDAsIDYwMDAsIDUwMDAgfTsKKwordW5zaWduZWQgaW50Citjb21wdXRlX2RlcmF0ZWRfRERSMV9DQVNfbGF0ZW5jeSh1bnNpZ25lZCBpbnQgbWNsa19wcykKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgbnVtX3NwZWVkX2JpbnMgPSBBUlJBWV9TSVpFKGRkcjFfc3BlZWRfYmlucyk7CisJdW5zaWduZWQgaW50IGxvd2VzdF90Q0ttaW5fZm91bmQgPSAwOworCXVuc2lnbmVkIGludCBsb3dlc3RfdENLbWluX0NMID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWRlYnVnKCJtY2xrX3BzID0gJXVcbiIsIG1jbGtfcHMpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9zcGVlZF9iaW5zOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHggPSBkZHIxX3NwZWVkX2JpbnNbaV07CisJCWRlYnVnKCJpPSV1LCB4ID0gJXUsIGxvd2VzdF90Q0ttaW5fZm91bmQgPSAldVxuIiwKKwkJICAgICAgaSwgeCwgbG93ZXN0X3RDS21pbl9mb3VuZCk7CisJCWlmICh4ICYmIGxvd2VzdF90Q0ttaW5fZm91bmQgPD0geCAmJiB4IDw9IG1jbGtfcHMpIHsKKwkJCWxvd2VzdF90Q0ttaW5fZm91bmQgPSB4OworCQkJbG93ZXN0X3RDS21pbl9DTCA9IGkgKyAxOworCQl9CisJfQorCisJZGVidWcoImxvd2VzdF90Q0ttaW5fQ0wgPSAldVxuIiwgbG93ZXN0X3RDS21pbl9DTCk7CisKKwlyZXR1cm4gbG93ZXN0X3RDS21pbl9DTDsKK30KKworLyoKKyAqIGRkcl9jb21wdXRlX2RpbW1fcGFyYW1ldGVycyBmb3IgRERSMSBTUEQKKyAqCisgKiBDb21wdXRlIERJTU0gcGFyYW1ldGVycyBiYXNlZCB1cG9uIHRoZSBTUEQgaW5mb3JtYXRpb24gaW4gc3BkLgorICogV3JpdGVzIHRoZSByZXN1bHRzIHRvIHRoZSBkaW1tX3BhcmFtc190IHN0cnVjdHVyZSBwb2ludGVkIGJ5IHBkaW1tLgorICoKKyAqIEZJWE1FOiB1c2UgI2RlZmluZSBmb3IgdGhlIHJldHZhbHMKKyAqLwordW5zaWduZWQgaW50CitkZHJfY29tcHV0ZV9kaW1tX3BhcmFtZXRlcnMoY29uc3QgZGRyMV9zcGRfZWVwcm9tX3QgKnNwZCwKKwkJCSAgICAgZGltbV9wYXJhbXNfdCAqcGRpbW0sCisJCQkgICAgIHVuc2lnbmVkIGludCBkaW1tX251bWJlcikKK3sKKwl1bnNpZ25lZCBpbnQgcmV0dmFsOworCisJaWYgKHNwZC0+bWVtX3R5cGUpIHsKKwkJaWYgKHNwZC0+bWVtX3R5cGUgIT0gU1BEX01FTVRZUEVfRERSKSB7CisJCQlwcmludGYoIkRJTU0gJXU6IGlzIG5vdCBhIEREUjEgU1BELlxuIiwgZGltbV9udW1iZXIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQltZW1zZXQocGRpbW0sIDAsIHNpemVvZihkaW1tX3BhcmFtc190KSk7CisJCXJldHVybiAxOworCX0KKworCXJldHZhbCA9IGRkcjFfc3BkX2NoZWNrKHNwZCk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGYoIkRJTU0gJXU6IGZhaWxlZCBjaGVja3N1bVxuIiwgZGltbV9udW1iZXIpOworCQlyZXR1cm4gMjsKKwl9CisKKwkvKgorCSAqIFRoZSBwYXJ0IG5hbWUgaW4gQVNDSUkgaW4gdGhlIFNQRCBFRVBST00gaXMgbm90IG51bGwgdGVybWluYXRlZC4KKwkgKiBHdWFyYW50ZWUgbnVsbCB0ZXJtaW5hdGlvbiBoZXJlIGJ5IHByZXNldHRpbmcgYWxsIGJ5dGVzIHRvIDAKKwkgKiBhbmQgY29weWluZyB0aGUgcGFydCBuYW1lIGluIEFTQ0lJIGZyb20gdGhlIFNQRCBvbnRvIGl0CisJICovCisJbWVtc2V0KHBkaW1tLT5tcGFydCwgMCwgc2l6ZW9mKHBkaW1tLT5tcGFydCkpOworCW1lbWNweShwZGltbS0+bXBhcnQsIHNwZC0+bXBhcnQsIHNpemVvZihwZGltbS0+bXBhcnQpIC0gMSk7CisKKwkvKiBESU1NIG9yZ2FuaXphdGlvbiBwYXJhbWV0ZXJzICovCisJcGRpbW0tPm5fcmFua3MgPSBzcGQtPm5yb3dzOworCXBkaW1tLT5yYW5rX2RlbnNpdHkgPSBjb21wdXRlX3JhbmtzaXplKHNwZC0+bWVtX3R5cGUsIHNwZC0+YmFua19kZW5zKTsKKwlwZGltbS0+Y2FwYWNpdHkgPSBwZGltbS0+bl9yYW5rcyAqIHBkaW1tLT5yYW5rX2RlbnNpdHk7CisJcGRpbW0tPmRhdGFfd2lkdGggPSBzcGQtPmRhdGF3X2xzYjsKKwlwZGltbS0+cHJpbWFyeV9zZHJhbV93aWR0aCA9IHNwZC0+cHJpbXc7CisJcGRpbW0tPmVjX3NkcmFtX3dpZHRoID0gc3BkLT5lY3c7CisKKwkvKgorCSAqIEZJWE1FOiBOZWVkIHRvIGRldGVybWluZSByZWdpc3RlcmVkX2RpbW0gc3RhdHVzLgorCSAqICAgICAxID09IHJlZ2lzdGVyIGJ1ZmZlcmVkCisJICogICAgIDAgPT0gdW5idWZmZXJlZAorCSAqLworCXBkaW1tLT5yZWdpc3RlcmVkX2RpbW0gPSAwOwkvKiB1bmJ1ZmZlcmVkICovCisKKwkvKiBTRFJBTSBkZXZpY2UgcGFyYW1ldGVycyAqLworCXBkaW1tLT5uX3Jvd19hZGRyID0gc3BkLT5ucm93X2FkZHI7CisJcGRpbW0tPm5fY29sX2FkZHIgPSBzcGQtPm5jb2xfYWRkcjsKKwlwZGltbS0+bl9iYW5rc19wZXJfc2RyYW1fZGV2aWNlID0gc3BkLT5uYmFua3M7CisJcGRpbW0tPmVkY19jb25maWcgPSBzcGQtPmNvbmZpZzsKKwlwZGltbS0+YnVyc3RfbGVuZ3Roc19iaXRtYXNrID0gc3BkLT5idXJzdGw7CisJcGRpbW0tPnJvd19kZW5zaXR5ID0gc3BkLT5iYW5rX2RlbnM7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgTWF4aW11bSBEYXRhIFJhdGUgYmFzZWQgb24gdGhlIE1pbmltdW0gQ3ljbGUgdGltZS4KKwkgKiBUaGUgU1BEIGNsa19jeWNsZSBmaWVsZCAodENLbWluKSBpcyBtZWFzdXJlZCBpbiB0ZW50aHMgb2YKKwkgKiBuYW5vc2Vjb25kcyBhbmQgcmVwcmVzZW50ZWQgYXMgQkNELgorCSAqLworCXBkaW1tLT50Q0ttaW5fWF9wcworCQk9IGNvbnZlcnRfYmNkX3RlbnRoc190b19jeWNsZV90aW1lX3BzKHNwZC0+Y2xrX2N5Y2xlKTsKKwlwZGltbS0+dENLbWluX1hfbWludXNfMV9wcworCQk9IGNvbnZlcnRfYmNkX3RlbnRoc190b19jeWNsZV90aW1lX3BzKHNwZC0+Y2xrX2N5Y2xlMik7CisJcGRpbW0tPnRDS21pbl9YX21pbnVzXzJfcHMKKwkJPSBjb252ZXJ0X2JjZF90ZW50aHNfdG9fY3ljbGVfdGltZV9wcyhzcGQtPmNsa19jeWNsZTMpOworCisJcGRpbW0tPnRDS21heF9wcyA9IGNvbXB1dGVfdGNrbWF4X2Zyb21fc3BkX3BzKHNwZC0+dGNrbWF4KTsKKworCS8qCisJICogQ29tcHV0ZSBDQVMgbGF0ZW5jaWVzIGRlZmluZWQgYnkgU1BECisJICogVGhlIFNQRCBjYXNsYXRfWCBzaG91bGQgaGF2ZSBhdCBsZWFzdCAxIGFuZCBhdCBtb3N0IDMgYml0cyBzZXQuCisJICoKKwkgKiBJZiBjYXNfbGF0IGFmdGVyIG1hc2tpbmcgaXMgMCwgdGhlIF9faWxvZzIgZnVuY3Rpb24gcmV0dXJucworCSAqIDI1NSBpbnRvIHRoZSB2YXJpYWJsZS4gICBUaGlzIGJlaGF2aW9yIGlzIGFidXNlZCBvbmNlLgorCSAqLworCXBkaW1tLT5jYXNsYXRfWCAgPSBfX2lsb2cyKHNwZC0+Y2FzX2xhdCk7CisJcGRpbW0tPmNhc2xhdF9YX21pbnVzXzEgPSBfX2lsb2cyKHNwZC0+Y2FzX2xhdAorCQkJCQkgICYgfigxIDw8IHBkaW1tLT5jYXNsYXRfWCkpOworCXBkaW1tLT5jYXNsYXRfWF9taW51c18yID0gX19pbG9nMihzcGQtPmNhc19sYXQKKwkJCQkJICAmIH4oMSA8PCBwZGltbS0+Y2FzbGF0X1gpCisJCQkJCSAgJiB+KDEgPDwgcGRpbW0tPmNhc2xhdF9YX21pbnVzXzEpKTsKKworCS8qIENvbXB1dGUgQ0FTIGxhdGVuY2llcyBiZWxvdyB0aGF0IGRlZmluZWQgYnkgU1BEICovCisJcGRpbW0tPmNhc2xhdF9sb3dlc3RfZGVyYXRlZAorCQk9IGNvbXB1dGVfZGVyYXRlZF9ERFIxX0NBU19sYXRlbmN5KGdldF9tZW1vcnlfY2xrX3BlcmlvZF9wcygpKTsKKworCS8qIENvbXB1dGUgdGltaW5nIHBhcmFtZXRlcnMgKi8KKwlwZGltbS0+dFJDRF9wcyA9IHNwZC0+dHJjZCAqIDI1MDsKKwlwZGltbS0+dFJQX3BzID0gc3BkLT50cnAgKiAyNTA7CisJcGRpbW0tPnRSQVNfcHMgPSBzcGQtPnRyYXMgKiAxMDAwOworCisJcGRpbW0tPnRXUl9wcyA9IG1jbGtfdG9fcGljb3MoMyk7CisJcGRpbW0tPnRXVFJfcHMgPSBtY2xrX3RvX3BpY29zKDEpOworCXBkaW1tLT50UkZDX3BzID0gY29tcHV0ZV90cmZjX3BzX2Zyb21fc3BkKDAsIHNwZC0+dHJmYyk7CisKKwlwZGltbS0+dFJSRF9wcyA9IHNwZC0+dHJyZCAqIDI1MDsKKwlwZGltbS0+dFJDX3BzID0gY29tcHV0ZV90cmNfcHNfZnJvbV9zcGQoMCwgc3BkLT50cmMpOworCisJcGRpbW0tPnJlZnJlc2hfcmF0ZV9wcyA9IGRldGVybWluZV9yZWZyZXNoX3JhdGVfcHMoc3BkLT5yZWZyZXNoKTsKKworCXBkaW1tLT50SVNfcHMgPSBjb252ZXJ0X2JjZF9odW5kcmVkdGhzX3RvX2N5Y2xlX3RpbWVfcHMoc3BkLT5jYV9zZXR1cCk7CisJcGRpbW0tPnRJSF9wcyA9IGNvbnZlcnRfYmNkX2h1bmRyZWR0aHNfdG9fY3ljbGVfdGltZV9wcyhzcGQtPmNhX2hvbGQpOworCXBkaW1tLT50RFNfcHMKKwkJPSBjb252ZXJ0X2JjZF9odW5kcmVkdGhzX3RvX2N5Y2xlX3RpbWVfcHMoc3BkLT5kYXRhX3NldHVwKTsKKwlwZGltbS0+dERIX3BzCisJCT0gY29udmVydF9iY2RfaHVuZHJlZHRoc190b19jeWNsZV90aW1lX3BzKHNwZC0+ZGF0YV9ob2xkKTsKKworCXBkaW1tLT50UlRQX3BzID0gbWNsa190b19waWNvcygyKTsJLyogQnkgdGhlIGJvb2suICovCisJcGRpbW0tPnREUVNRX21heF9wcyA9IHNwZC0+dGRxc3EgKiAxMDsKKwlwZGltbS0+dFFIU19wcyA9IHNwZC0+dHFocyAqIDEwOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvZGRyL2RkcjJfZGltbV9wYXJhbXMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvZGRyMl9kaW1tX3BhcmFtcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDBmYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvZGRyL2RkcjJfZGltbV9wYXJhbXMuYwpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2ZzbF9kZHJfc2RyYW0uaD4KKworI2luY2x1ZGUgImRkci5oIgorLyoKKyAqIENhbGN1bGF0ZSB0aGUgRGVuc2l0eSBvZiBlYWNoIFBoeXNpY2FsIFJhbmsuCisgKiBSZXR1cm5lZCBzaXplIGlzIGluIGJ5dGVzLgorICoKKyAqIFN0dWR5IHRoZXNlIHRhYmxlIGZyb20gQnl0ZSAzMSBvZiBKRURFQyBTUEQgU3BlYy4KKyAqCisgKgkJRERSIEkJRERSIElJCisgKglCaXQJU2l6ZQlTaXplCisgKgktLS0JLS0tLS0JLS0tLS0tCisgKgk3IGhpZ2gJNTEyTUIJNTEyTUIKKyAqCTYJMjU2TUIJMjU2TUIKKyAqCTUJMTI4TUIJMTI4TUIKKyAqCTQJIDY0TUIJIDE2R0IKKyAqCTMJIDMyTUIJICA4R0IKKyAqCTIJIDE2TUIJICA0R0IKKyAqCTEJICAyR0IJICAyR0IKKyAqCTAgbG93CSAgMUdCCSAgMUdCCisgKgorICogUmVvcmRlciBUYWJsZSB0byBiZSBsaW5lYXIgYnkgc3RyaXBwaW5nIHRoZSBib3R0b20KKyAqIDIgb3IgNSBiaXRzIG9mZiBhbmQgc2hpZnRpbmcgdGhlbSB1cCB0byB0aGUgdG9wLgorICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZworY29tcHV0ZV9yYW5rc2l6ZSh1bnNpZ25lZCBpbnQgbWVtX3R5cGUsIHVuc2lnbmVkIGNoYXIgcm93X2RlbnMpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGJzaXplOworCisJLyogQm90dG9tIDUgYml0cyB1cCB0byB0aGUgdG9wLiAqLworCWJzaXplID0gKChyb3dfZGVucyA+PiA1KSB8ICgocm93X2RlbnMgJiAzMSkgPDwgMykpOworCWJzaXplIDw8PSAyN1VMTDsKKwlkZWJ1ZygiRERSOiBERFIgSUkgcmFuayBkZW5zaXR5ID0gMHglMDh4XG4iLCBic2l6ZSk7CisKKwlyZXR1cm4gYnNpemU7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgdHdvLW5pYmJsZSBCQ0QgdmFsdWUgaW50byBhIGN5Y2xlIHRpbWUuCisgKiBXaGlsZSB0aGUgc3BlYyBjYWxscyBmb3IgbmFuby1zZWNvbmRzLCBwaWNvcyBhcmUgcmV0dXJuZWQuCisgKgorICogVGhpcyBpbXBsZW1lbnRzIHRoZSB0YWJsZXMgZm9yIGJ5dGVzIDksIDIzIGFuZCAyNSBmb3IgYm90aAorICogRERSIEkgYW5kIElJLiAgTm8gYWxsb3dhbmNlIGZvciBkaXN0aW5ndWlzaGluZyB0aGUgaW52YWxpZAorICogZmllbGRzIGFic2VudCBmb3IgRERSIEkgeWV0IHByZXNlbnQgaW4gRERSIElJIGlzIG1hZGUuCisgKiAoVGhhdCBpcywgY3ljbGUgdGltZXMgb2YgLjI1LCAuMzMsIC42NiBhbmQgLjc1IG5zIGFyZQorICogYWxsb3dlZCBmb3IgYm90aCBERFIgSUkgYW5kIEkuKQorICovCitzdGF0aWMgdW5zaWduZWQgaW50Citjb252ZXJ0X2JjZF90ZW50aHNfdG9fY3ljbGVfdGltZV9wcyh1bnNpZ25lZCBpbnQgc3BkX3ZhbCkKK3sKKwkvKiBUYWJsZSBsb29rIHVwIHRoZSBsb3dlciBuaWJibGUsIGFsbG93IEREUiBJICYgSUkuICovCisJdW5zaWduZWQgaW50IHRlbnRoc19wc1sxNl0gPSB7CisJCTAsCisJCTEwMCwKKwkJMjAwLAorCQkzMDAsCisJCTQwMCwKKwkJNTAwLAorCQk2MDAsCisJCTcwMCwKKwkJODAwLAorCQk5MDAsCisJCTI1MCwJLyogVGhpcyBhbmQgdGhlIG5leHQgMyBlbnRyaWVzIHZhbGlkIC4uLiAqLworCQkzMzAsCS8qIC4uLiAgb25seSBmb3IgdENLIGNhbGN1bGF0aW9ucy4gKi8KKwkJNjYwLAorCQk3NTAsCisJCTAsCS8qIHVuZGVmaW5lZCAqLworCQkwCS8qIHVuZGVmaW5lZCAqLworCX07CisKKwl1bnNpZ25lZCBpbnQgd2hvbGVfbnMgPSAoc3BkX3ZhbCAmIDB4RjApID4+IDQ7CisJdW5zaWduZWQgaW50IHRlbnRoX25zID0gc3BkX3ZhbCAmIDB4MEY7CisJdW5zaWduZWQgaW50IHBzID0gd2hvbGVfbnMgKiAxMDAwICsgdGVudGhzX3BzW3RlbnRoX25zXTsKKworCXJldHVybiBwczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorY29udmVydF9iY2RfaHVuZHJlZHRoc190b19jeWNsZV90aW1lX3BzKHVuc2lnbmVkIGludCBzcGRfdmFsKQoreworCXVuc2lnbmVkIGludCB0ZW50aF9ucyA9IChzcGRfdmFsICYgMHhGMCkgPj4gNDsKKwl1bnNpZ25lZCBpbnQgaHVuZHJlZHRoX25zID0gc3BkX3ZhbCAmIDB4MEY7CisJdW5zaWduZWQgaW50IHBzID0gdGVudGhfbnMgKiAxMDAgKyBodW5kcmVkdGhfbnMgKiAxMDsKKworCXJldHVybiBwczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBieXRlNDBfdGFibGVfcHNbOF0gPSB7CisJMCwKKwkyNTAsCisJMzMwLAorCTUwMCwKKwk2NjAsCisJNzUwLAorCTAsCS8qIHN1cHBvc2VkIHRvIGJlIFJGQywgYnV0IG5vdCBzdXJlIHdoYXQgdGhhdCBtZWFucyAqLworCTAJLyogVW5kZWZpbmVkICovCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50Citjb21wdXRlX3RyZmNfcHNfZnJvbV9zcGQodW5zaWduZWQgY2hhciB0cmN0cmZjX2V4dCwgdW5zaWduZWQgY2hhciB0cmZjKQoreworCXVuc2lnbmVkIGludCB0cmZjX3BzOworCisJdHJmY19wcyA9ICgoKHRyY3RyZmNfZXh0ICYgMHgxKSAqIDI1NikgKyB0cmZjKSAqIDEwMDAKKwkJKyBieXRlNDBfdGFibGVfcHNbKHRyY3RyZmNfZXh0ID4+IDEpICYgMHg3XTsKKworCXJldHVybiB0cmZjX3BzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Citjb21wdXRlX3RyY19wc19mcm9tX3NwZCh1bnNpZ25lZCBjaGFyIHRyY3RyZmNfZXh0LCB1bnNpZ25lZCBjaGFyIHRyYykKK3sKKwl1bnNpZ25lZCBpbnQgdHJjX3BzOworCisJdHJjX3BzID0gdHJjICogMTAwMCArIGJ5dGU0MF90YWJsZV9wc1sodHJjdHJmY19leHQgPj4gNCkgJiAweDddOworCisJcmV0dXJuIHRyY19wczsKK30KKworLyoKKyAqIERldGVybWluZSBSZWZyZXNoIFJhdGUuICBJZ25vcmUgc2VsZiByZWZyZXNoIGJpdCBvbiBERFIgSS4KKyAqIFRhYmxlIGZyb20gU1BEIFNwZWMsIEJ5dGUgMTIsIGNvbnZlcnRlZCB0byBwaWNvc2Vjb25kcyBhbmQKKyAqIGZpbGxlZCBpbiB3aXRoICJkZWZhdWx0IiBub3JtYWwgdmFsdWVzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitkZXRlcm1pbmVfcmVmcmVzaF9yYXRlX3BzKGNvbnN0IHVuc2lnbmVkIGludCBzcGRfcmVmcmVzaCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVmcmVzaF90aW1lX3BzWzhdID0geworCQkxNTYyNTAwMCwJLyogMCBOb3JtYWwgICAgMS4wMHggKi8KKwkJMzkwMDAwMCwJLyogMSBSZWR1Y2VkICAgIC4yNXggKi8KKwkJNzgwMDAwMCwJLyogMiBFeHRlbmRlZCAgIC41MHggKi8KKwkJMzEzMDAwMDAsCS8qIDMgRXh0ZW5kZWQgIDIuMDB4ICovCisJCTYyNTAwMDAwLAkvKiA0IEV4dGVuZGVkICA0LjAweCAqLworCQkxMjUwMDAwMDAsCS8qIDUgRXh0ZW5kZWQgIDguMDB4ICovCisJCTE1NjI1MDAwLAkvKiA2IE5vcm1hbCAgICAxLjAweCAgZmlsbGVyICovCisJCTE1NjI1MDAwLAkvKiA3IE5vcm1hbCAgICAxLjAweCAgZmlsbGVyICovCisJfTsKKworCXJldHVybiByZWZyZXNoX3RpbWVfcHNbc3BkX3JlZnJlc2ggJiAweDddOworfQorCisvKgorICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBjb21wdXRlIGEgc3VpdGFibGUKKyAqIENBUyBsYXRlbmN5IGdpdmVuIHRoZSBEUkFNIGNsb2NrIHBlcmlvZC4gIFRoZSBTUEQgb25seQorICogZGVmaW5lcyBhdCBtb3N0IDMgQ0FTIGxhdGVuY2llcy4gIFR5cGljYWxseSB0aGUgc2xvd2VyIGluCisgKiBmcmVxdWVuY3kgdGhlIERJTU0gcnVucyBhdCwgdGhlIHNob3J0ZXIgaXRzIENBUyBsYXRlbmN5IGNhbi4KKyAqIGJlLiAgSWYgdGhlIERJTU0gaXMgb3BlcmF0aW5nIGF0IGEgc3VmZmljaWVudGx5IGxvdyBmcmVxdWVuY3ksCisgKiBpdCBtYXkgYmUgYWJsZSB0byBydW4gYXQgYSBDQVMgbGF0ZW5jeSBzaG9ydGVyIHRoYW4gdGhlCisgKiBzaG9ydGVzdCBTUEQtZGVmaW5lZCBDQVMgbGF0ZW5jeS4KKyAqCisgKiBJZiBhIENBUyBsYXRlbmN5IGlzIG5vdCBmb3VuZCwgMCBpcyByZXR1cm5lZC4KKyAqCisgKiBEbyB0aGlzIGJ5IGZpbmRpbmcgaW4gdGhlIHN0YW5kYXJkIHNwZWVkIGJpbiB0YWJsZSB0aGUgbG9uZ2VzdAorICogdENLbWluIHRoYXQgZG9lc24ndCBleGNlZWQgdGhlIHZhbHVlIG9mIG1jbGtfcHMgKHRDSykuCisgKgorICogQW4gYXNzdW1wdGlvbiBtYWRlIGlzIHRoYXQgdGhlIFNEUkFNIGRldmljZSBhbGxvd3MgdGhlCisgKiBDTCB0byBiZSBwcm9ncmFtbWVkIGZvciBhIHZhbHVlIHRoYXQgaXMgbG93ZXIgdGhhbiB0aG9zZQorICogYWR2ZXJ0aXNlZCBieSB0aGUgU1BELiAgVGhpcyBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLAorICogYXMgdGhvc2UgbW9kZXMgbm90IGRlZmluZWQgaW4gdGhlIFNQRCBhcmUgb3B0aW9uYWwuCisgKgorICogQ0FTIGxhdGVuY3kgZGUtcmF0aW5nIGJhc2VkIHVwb24gdmFsdWVzIEpFREVDIFN0YW5kYXJkIE5vLiA3OS0yQworICogVGFibGUgNDAsICJERFIyIFNEUkFNIHN0YW5hZGFyZCBzcGVlZCBiaW5zIGFuZCB0Q0ssIHRSQ0QsIHRSUCwgdFJBUywKKyAqIGFuZCB0UkMgZm9yIGNvcnJlc3BvbmRpbmcgYmluIgorICoKKyAqIG9yZGluYWwgMiwgZGRyMl9zcGVlZF9iaW5zWzFdIGNvbnRhaW5zIHRDSyBmb3IgQ0w9MworICogTm90IGNlcnRhaW4gaWYgYW55IGdvb2QgdmFsdWUgZXhpc3RzIGZvciBDTD0yCisgKi8KKwkJCQkgLyogQ0wyICAgQ0wzICAgQ0w0ICAgQ0w1ICAgQ0w2ICovCit1bnNpZ25lZCBzaG9ydCBkZHIyX3NwZWVkX2JpbnNbXSA9IHsgICAwLCA1MDAwLCAzNzUwLCAzMDAwLCAyNTAwIH07CisKK3Vuc2lnbmVkIGludAorY29tcHV0ZV9kZXJhdGVkX0REUjJfQ0FTX2xhdGVuY3kodW5zaWduZWQgaW50IG1jbGtfcHMpCit7CisJY29uc3QgdW5zaWduZWQgaW50IG51bV9zcGVlZF9iaW5zID0gQVJSQVlfU0laRShkZHIyX3NwZWVkX2JpbnMpOworCXVuc2lnbmVkIGludCBsb3dlc3RfdENLbWluX2ZvdW5kID0gMDsKKwl1bnNpZ25lZCBpbnQgbG93ZXN0X3RDS21pbl9DTCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlkZWJ1ZygibWNsa19wcyA9ICV1XG4iLCBtY2xrX3BzKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc3BlZWRfYmluczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB4ID0gZGRyMl9zcGVlZF9iaW5zW2ldOworCQlkZWJ1ZygiaT0ldSwgeCA9ICV1LCBsb3dlc3RfdENLbWluX2ZvdW5kID0gJXVcbiIsCisJCSAgICAgIGksIHgsIGxvd2VzdF90Q0ttaW5fZm91bmQpOworCQlpZiAoeCAmJiB4IDw9IG1jbGtfcHMgJiYgeCA+PSBsb3dlc3RfdENLbWluX2ZvdW5kICkgeworCQkJbG93ZXN0X3RDS21pbl9mb3VuZCA9IHg7CisJCQlsb3dlc3RfdENLbWluX0NMID0gaSArIDI7CisJCX0KKwl9CisKKwlkZWJ1ZygibG93ZXN0X3RDS21pbl9DTCA9ICV1XG4iLCBsb3dlc3RfdENLbWluX0NMKTsKKworCXJldHVybiBsb3dlc3RfdENLbWluX0NMOworfQorCisvKgorICogZGRyX2NvbXB1dGVfZGltbV9wYXJhbWV0ZXJzIGZvciBERFIyIFNQRAorICoKKyAqIENvbXB1dGUgRElNTSBwYXJhbWV0ZXJzIGJhc2VkIHVwb24gdGhlIFNQRCBpbmZvcm1hdGlvbiBpbiBzcGQuCisgKiBXcml0ZXMgdGhlIHJlc3VsdHMgdG8gdGhlIGRpbW1fcGFyYW1zX3Qgc3RydWN0dXJlIHBvaW50ZWQgYnkgcGRpbW0uCisgKgorICogRklYTUU6IHVzZSAjZGVmaW5lIGZvciB0aGUgcmV0dmFscworICovCit1bnNpZ25lZCBpbnQKK2Rkcl9jb21wdXRlX2RpbW1fcGFyYW1ldGVycyhjb25zdCBkZHIyX3NwZF9lZXByb21fdCAqc3BkLAorCQkJICAgICBkaW1tX3BhcmFtc190ICpwZGltbSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGRpbW1fbnVtYmVyKQoreworCXVuc2lnbmVkIGludCByZXR2YWw7CisKKwlpZiAoc3BkLT5tZW1fdHlwZSkgeworCQlpZiAoc3BkLT5tZW1fdHlwZSAhPSBTUERfTUVNVFlQRV9ERFIyKSB7CisJCQlwcmludGYoIkRJTU0gJXU6IGlzIG5vdCBhIEREUjIgU1BELlxuIiwgZGltbV9udW1iZXIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQltZW1zZXQocGRpbW0sIDAsIHNpemVvZihkaW1tX3BhcmFtc190KSk7CisJCXJldHVybiAxOworCX0KKworCXJldHZhbCA9IGRkcjJfc3BkX2NoZWNrKHNwZCk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGYoIkRJTU0gJXU6IGZhaWxlZCBjaGVja3N1bVxuIiwgZGltbV9udW1iZXIpOworCQlyZXR1cm4gMjsKKwl9CisKKwkvKgorCSAqIFRoZSBwYXJ0IG5hbWUgaW4gQVNDSUkgaW4gdGhlIFNQRCBFRVBST00gaXMgbm90IG51bGwgdGVybWluYXRlZC4KKwkgKiBHdWFyYW50ZWUgbnVsbCB0ZXJtaW5hdGlvbiBoZXJlIGJ5IHByZXNldHRpbmcgYWxsIGJ5dGVzIHRvIDAKKwkgKiBhbmQgY29weWluZyB0aGUgcGFydCBuYW1lIGluIEFTQ0lJIGZyb20gdGhlIFNQRCBvbnRvIGl0CisJICovCisJbWVtc2V0KHBkaW1tLT5tcGFydCwgMCwgc2l6ZW9mKHBkaW1tLT5tcGFydCkpOworCW1lbWNweShwZGltbS0+bXBhcnQsIHNwZC0+bXBhcnQsIHNpemVvZihwZGltbS0+bXBhcnQpIC0gMSk7CisKKwkvKiBESU1NIG9yZ2FuaXphdGlvbiBwYXJhbWV0ZXJzICovCisJcGRpbW0tPm5fcmFua3MgPSAoc3BkLT5tb2RfcmFua3MgJiAweDcpICsgMTsKKwlwZGltbS0+cmFua19kZW5zaXR5ID0gY29tcHV0ZV9yYW5rc2l6ZShzcGQtPm1lbV90eXBlLCBzcGQtPnJhbmtfZGVucyk7CisJcGRpbW0tPmNhcGFjaXR5ID0gcGRpbW0tPm5fcmFua3MgKiBwZGltbS0+cmFua19kZW5zaXR5OworCXBkaW1tLT5kYXRhX3dpZHRoID0gc3BkLT5kYXRhdzsKKwlwZGltbS0+cHJpbWFyeV9zZHJhbV93aWR0aCA9IHNwZC0+cHJpbXc7CisJcGRpbW0tPmVjX3NkcmFtX3dpZHRoID0gc3BkLT5lY3c7CisKKwkvKiBGSVhNRTogd2hhdCBhYm91dCByZWdpc3RlcmVkIFNPLURJTU0/ICovCisJc3dpdGNoIChzcGQtPmRpbW1fdHlwZSkgeworCWNhc2UgMHgwMToJLyogUkRJTU0gKi8KKwljYXNlIDB4MTA6CS8qIE1pbmktUkRJTU0gKi8KKwkJcGRpbW0tPnJlZ2lzdGVyZWRfZGltbSA9IDE7IC8qIHJlZ2lzdGVyIGJ1ZmZlcmVkICovCisJCWJyZWFrOworCisJY2FzZSAweDAyOgkvKiBVRElNTSAqLworCWNhc2UgMHgwNDoJLyogU08tRElNTSAqLworCWNhc2UgMHgwODoJLyogTWljcm8tRElNTSAqLworCWNhc2UgMHgyMDoJLyogTWluaS1VRElNTSAqLworCQlwZGltbS0+cmVnaXN0ZXJlZF9kaW1tID0gMDsJLyogdW5idWZmZXJlZCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZigidW5rbm93biBkaW1tX3R5cGUgMHglMDJYXG4iLCBzcGQtPmRpbW1fdHlwZSk7CisJCXJldHVybiAxOworCQlicmVhazsKKwl9CisKKwkvKiBTRFJBTSBkZXZpY2UgcGFyYW1ldGVycyAqLworCXBkaW1tLT5uX3Jvd19hZGRyID0gc3BkLT5ucm93X2FkZHI7CisJcGRpbW0tPm5fY29sX2FkZHIgPSBzcGQtPm5jb2xfYWRkcjsKKwlwZGltbS0+bl9iYW5rc19wZXJfc2RyYW1fZGV2aWNlID0gc3BkLT5uYmFua3M7CisJcGRpbW0tPmVkY19jb25maWcgPSBzcGQtPmNvbmZpZzsKKwlwZGltbS0+YnVyc3RfbGVuZ3Roc19iaXRtYXNrID0gc3BkLT5idXJzdGw7CisJcGRpbW0tPnJvd19kZW5zaXR5ID0gc3BkLT5yYW5rX2RlbnM7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgTWF4aW11bSBEYXRhIFJhdGUgYmFzZWQgb24gdGhlIE1pbmltdW0gQ3ljbGUgdGltZS4KKwkgKiBUaGUgU1BEIGNsa19jeWNsZSBmaWVsZCAodENLbWluKSBpcyBtZWFzdXJlZCBpbiB0ZW50aHMgb2YKKwkgKiBuYW5vc2Vjb25kcyBhbmQgcmVwcmVzZW50ZWQgYXMgQkNELgorCSAqLworCXBkaW1tLT50Q0ttaW5fWF9wcworCQk9IGNvbnZlcnRfYmNkX3RlbnRoc190b19jeWNsZV90aW1lX3BzKHNwZC0+Y2xrX2N5Y2xlKTsKKwlwZGltbS0+dENLbWluX1hfbWludXNfMV9wcworCQk9IGNvbnZlcnRfYmNkX3RlbnRoc190b19jeWNsZV90aW1lX3BzKHNwZC0+Y2xrX2N5Y2xlMik7CisJcGRpbW0tPnRDS21pbl9YX21pbnVzXzJfcHMKKwkJPSBjb252ZXJ0X2JjZF90ZW50aHNfdG9fY3ljbGVfdGltZV9wcyhzcGQtPmNsa19jeWNsZTMpOworCisJcGRpbW0tPnRDS21heF9wcyA9IGNvbnZlcnRfYmNkX3RlbnRoc190b19jeWNsZV90aW1lX3BzKHNwZC0+dGNrbWF4KTsKKworCS8qCisJICogQ29tcHV0ZSBDQVMgbGF0ZW5jaWVzIGRlZmluZWQgYnkgU1BECisJICogVGhlIFNQRCBjYXNsYXRfWCBzaG91bGQgaGF2ZSBhdCBsZWFzdCAxIGFuZCBhdCBtb3N0IDMgYml0cyBzZXQuCisJICoKKwkgKiBJZiBjYXNfbGF0IGFmdGVyIG1hc2tpbmcgaXMgMCwgdGhlIF9faWxvZzIgZnVuY3Rpb24gcmV0dXJucworCSAqIDI1NSBpbnRvIHRoZSB2YXJpYWJsZS4gICBUaGlzIGJlaGF2aW9yIGlzIGFidXNlZCBvbmNlLgorCSAqLworCXBkaW1tLT5jYXNsYXRfWCAgPSBfX2lsb2cyKHNwZC0+Y2FzX2xhdCk7CisJcGRpbW0tPmNhc2xhdF9YX21pbnVzXzEgPSBfX2lsb2cyKHNwZC0+Y2FzX2xhdAorCQkJCQkgICYgfigxIDw8IHBkaW1tLT5jYXNsYXRfWCkpOworCXBkaW1tLT5jYXNsYXRfWF9taW51c18yID0gX19pbG9nMihzcGQtPmNhc19sYXQKKwkJCQkJICAmIH4oMSA8PCBwZGltbS0+Y2FzbGF0X1gpCisJCQkJCSAgJiB+KDEgPDwgcGRpbW0tPmNhc2xhdF9YX21pbnVzXzEpKTsKKworCS8qIENvbXB1dGUgQ0FTIGxhdGVuY2llcyBiZWxvdyB0aGF0IGRlZmluZWQgYnkgU1BEICovCisJcGRpbW0tPmNhc2xhdF9sb3dlc3RfZGVyYXRlZAorCQk9IGNvbXB1dGVfZGVyYXRlZF9ERFIyX0NBU19sYXRlbmN5KGdldF9tZW1vcnlfY2xrX3BlcmlvZF9wcygpKTsKKworCS8qIENvbXB1dGUgdGltaW5nIHBhcmFtZXRlcnMgKi8KKwlwZGltbS0+dFJDRF9wcyA9IHNwZC0+dHJjZCAqIDI1MDsKKwlwZGltbS0+dFJQX3BzID0gc3BkLT50cnAgKiAyNTA7CisJcGRpbW0tPnRSQVNfcHMgPSBzcGQtPnRyYXMgKiAxMDAwOworCisJcGRpbW0tPnRXUl9wcyA9IHNwZC0+dHdyICogMjUwOworCXBkaW1tLT50V1RSX3BzID0gc3BkLT50d3RyICogMjUwOworCXBkaW1tLT50UkZDX3BzID0gY29tcHV0ZV90cmZjX3BzX2Zyb21fc3BkKHNwZC0+dHJjdHJmY19leHQsIHNwZC0+dHJmYyk7CisKKwlwZGltbS0+dFJSRF9wcyA9IHNwZC0+dHJyZCAqIDI1MDsKKwlwZGltbS0+dFJDX3BzID0gY29tcHV0ZV90cmNfcHNfZnJvbV9zcGQoc3BkLT50cmN0cmZjX2V4dCwgc3BkLT50cmMpOworCisJcGRpbW0tPnJlZnJlc2hfcmF0ZV9wcyA9IGRldGVybWluZV9yZWZyZXNoX3JhdGVfcHMoc3BkLT5yZWZyZXNoKTsKKworCXBkaW1tLT50SVNfcHMgPSBjb252ZXJ0X2JjZF9odW5kcmVkdGhzX3RvX2N5Y2xlX3RpbWVfcHMoc3BkLT5jYV9zZXR1cCk7CisJcGRpbW0tPnRJSF9wcyA9IGNvbnZlcnRfYmNkX2h1bmRyZWR0aHNfdG9fY3ljbGVfdGltZV9wcyhzcGQtPmNhX2hvbGQpOworCXBkaW1tLT50RFNfcHMKKwkJPSBjb252ZXJ0X2JjZF9odW5kcmVkdGhzX3RvX2N5Y2xlX3RpbWVfcHMoc3BkLT5kYXRhX3NldHVwKTsKKwlwZGltbS0+dERIX3BzCisJCT0gY29udmVydF9iY2RfaHVuZHJlZHRoc190b19jeWNsZV90aW1lX3BzKHNwZC0+ZGF0YV9ob2xkKTsKKworCXBkaW1tLT50UlRQX3BzID0gc3BkLT50cnRwICogMjUwOworCXBkaW1tLT50RFFTUV9tYXhfcHMgPSBzcGQtPnRkcXNxICogMTA7CisJcGRpbW0tPnRRSFNfcHMgPSBzcGQtPnRxaHMgKiAxMDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9kZHIzX2RpbW1fcGFyYW1zLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvZGRyL2RkcjNfZGltbV9wYXJhbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE5OWJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9kZHIzX2RpbW1fcGFyYW1zLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKglEYXZlIExpdSA8ZGF2ZWxpdUBmcmVlc2NhbGUuY29tPgorICoKKyAqIGNhbGN1bGF0ZSB0aGUgb3JnYW5pemF0aW9uIGFuZCB0aW1pbmcgcGFyYW1ldGVyCisgKiBmcm9tIGRkcjMgc3BkLCBwbGVhc2UgcmVmZXIgdG8gdGhlIHNwZWMKKyAqIEpFREVDIHN0YW5kYXJkIE5vLjIxLUMgNF8wMV8wMl8xMVIxOC5wZGYKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2Rkcl9zZHJhbS5oPgorCisjaW5jbHVkZSAiZGRyLmgiCisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIERlbnNpdHkgb2YgZWFjaCBQaHlzaWNhbCBSYW5rLgorICogUmV0dXJuZWQgc2l6ZSBpcyBpbiBieXRlcy4KKyAqCisgKiBlYWNoIHJhbmsgc2l6ZSA9CisgKiBzZHJhbSBjYXBhY2l0eShiaXQpIC8gOCAqIHByaW1hcnkgYnVzIHdpZHRoIC8gc2RyYW0gd2lkdGgKKyAqCisgKiB3aGVyZTogc2RyYW0gY2FwYWNpdHkgID0gc3BkIGJ5dGU0WzM6MF0KKyAqICAgICAgICBwcmltYXJ5IGJ1cyB3aWR0aCA9IHNwZCBieXRlOFsyOjBdCisgKiAgICAgICAgc2RyYW0gd2lkdGggPSBzcGQgYnl0ZTdbMjowXQorICoKKyAqIFNQRCBieXRlNCAtIHNkcmFtIGRlbnNpdHkgYW5kIGJhbmtzCisgKgliaXRbMzowXQlzaXplKGJpdCkJc2l6ZShieXRlKQorICoJMDAwMAkJMjU2TWIJCTMyTUIKKyAqCTAwMDEJCTUxMk1iCQk2NE1CCisgKgkwMDEwCQkxR2IJCTEyOE1CCisgKgkwMDExCQkyR2IJCTI1Nk1CCisgKgkwMTAwCQk0R2IJCTUxMk1CCisgKgkwMTAxCQk4R2IJCTFHQgorICoJMDExMAkJMTZHYgkJMkdCCisgKgorICogU1BEIGJ5dGU4IC0gbW9kdWxlIG1lbW9yeSBidXMgd2lkdGgKKyAqIAliaXRbMjowXQlwcmltYXJ5IGJ1cyB3aWR0aAorICoJMDAwCQk4Yml0cworICogCTAwMQkJMTZiaXRzCisgKiAJMDEwCQkzMmJpdHMKKyAqIAkwMTEJCTY0Yml0cworICoKKyAqIFNQRCBieXRlNyAtIG1vZHVsZSBvcmdhbml6dGlvbgorICogCWJpdFsyOjBdCXNkcmFtIGRldmljZSB3aWR0aAorICogCTAwMAkJNGJpdHMKKyAqIAkwMDEJCThiaXRzCisgKiAJMDEwCQkxNmJpdHMKKyAqIAkwMTEJCTMyYml0cworICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZworY29tcHV0ZV9yYW5rc2l6ZShjb25zdCBkZHIzX3NwZF9lZXByb21fdCAqc3BkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBic2l6ZTsKKworCWludCBuYml0X3NkcmFtX2NhcF9ic2l6ZSA9IDA7CisJaW50IG5iaXRfcHJpbWFyeV9idXNfd2lkdGggPSAwOworCWludCBuYml0X3NkcmFtX3dpZHRoID0gMDsKKworCWlmICgoc3BkLT5kZW5zaXR5X2JhbmtzICYgMHhmKSA8IDcpCisJCW5iaXRfc2RyYW1fY2FwX2JzaXplID0gKHNwZC0+ZGVuc2l0eV9iYW5rcyAmIDB4ZikgKyAyODsKKwlpZiAoKHNwZC0+YnVzX3dpZHRoICYgMHg3KSA8IDQpCisJCW5iaXRfcHJpbWFyeV9idXNfd2lkdGggPSAoc3BkLT5idXNfd2lkdGggJiAweDcpICsgMzsKKwlpZiAoKHNwZC0+b3JnYW5pemF0aW9uICYgMHg3KSA8IDQpCisJCW5iaXRfc2RyYW1fd2lkdGggPSAoc3BkLT5vcmdhbml6YXRpb24gJiAweDcpICsgMjsKKworCWJzaXplID0gMVVMTCA8PCAobmJpdF9zZHJhbV9jYXBfYnNpemUgLSAzCisJCSAgICArIG5iaXRfcHJpbWFyeV9idXNfd2lkdGggLSBuYml0X3NkcmFtX3dpZHRoKTsKKworCWRlYnVnKCJERFI6IEREUiBJSUkgcmFuayBkZW5zaXR5ID0gMHglMTZseFxuIiwgYnNpemUpOworCisJcmV0dXJuIGJzaXplOworfQorCisvKgorICogZGRyX2NvbXB1dGVfZGltbV9wYXJhbWV0ZXJzIGZvciBERFIzIFNQRAorICoKKyAqIENvbXB1dGUgRElNTSBwYXJhbWV0ZXJzIGJhc2VkIHVwb24gdGhlIFNQRCBpbmZvcm1hdGlvbiBpbiBzcGQuCisgKiBXcml0ZXMgdGhlIHJlc3VsdHMgdG8gdGhlIGRpbW1fcGFyYW1zX3Qgc3RydWN0dXJlIHBvaW50ZWQgYnkgcGRpbW0uCisgKgorICovCit1bnNpZ25lZCBpbnQKK2Rkcl9jb21wdXRlX2RpbW1fcGFyYW1ldGVycyhjb25zdCBkZHIzX3NwZF9lZXByb21fdCAqc3BkLAorCQkJICAgICBkaW1tX3BhcmFtc190ICpwZGltbSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGRpbW1fbnVtYmVyKQoreworCXVuc2lnbmVkIGludCByZXR2YWw7CisJdW5zaWduZWQgaW50IG10Yl9wczsKKworCWlmIChzcGQtPm1lbV90eXBlKSB7CisJCWlmIChzcGQtPm1lbV90eXBlICE9IFNQRF9NRU1UWVBFX0REUjMpIHsKKwkJCXByaW50ZigiRElNTSAldTogaXMgbm90IGEgRERSMyBTUEQuXG4iLCBkaW1tX251bWJlcik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCW1lbXNldChwZGltbSwgMCwgc2l6ZW9mKGRpbW1fcGFyYW1zX3QpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dmFsID0gZGRyM19zcGRfY2hlY2soc3BkKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ZigiRElNTSAldTogZmFpbGVkIGNoZWNrc3VtXG4iLCBkaW1tX251bWJlcik7CisJCXJldHVybiAyOworCX0KKworCS8qCisJICogVGhlIHBhcnQgbmFtZSBpbiBBU0NJSSBpbiB0aGUgU1BEIEVFUFJPTSBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkLgorCSAqIEd1YXJhbnRlZSBudWxsIHRlcm1pbmF0aW9uIGhlcmUgYnkgcHJlc2V0dGluZyBhbGwgYnl0ZXMgdG8gMAorCSAqIGFuZCBjb3B5aW5nIHRoZSBwYXJ0IG5hbWUgaW4gQVNDSUkgZnJvbSB0aGUgU1BEIG9udG8gaXQKKwkgKi8KKwltZW1zZXQocGRpbW0tPm1wYXJ0LCAwLCBzaXplb2YocGRpbW0tPm1wYXJ0KSk7CisJbWVtY3B5KHBkaW1tLT5tcGFydCwgc3BkLT5tcGFydCwgc2l6ZW9mKHBkaW1tLT5tcGFydCkgLSAxKTsKKworCS8qIERJTU0gb3JnYW5pemF0aW9uIHBhcmFtZXRlcnMgKi8KKwlwZGltbS0+bl9yYW5rcyA9ICgoc3BkLT5vcmdhbml6YXRpb24gPj4gMykgJiAweDcpICsgMTsKKwlwZGltbS0+cmFua19kZW5zaXR5ID0gY29tcHV0ZV9yYW5rc2l6ZShzcGQpOworCXBkaW1tLT5jYXBhY2l0eSA9IHBkaW1tLT5uX3JhbmtzICogcGRpbW0tPnJhbmtfZGVuc2l0eTsKKwlwZGltbS0+cHJpbWFyeV9zZHJhbV93aWR0aCA9IDEgPDwgKDMgKyAoc3BkLT5idXNfd2lkdGggJiAweDcpKTsKKwlpZiAoKHNwZC0+YnVzX3dpZHRoID4+IDMpICYgMHgzKQorCQlwZGltbS0+ZWNfc2RyYW1fd2lkdGggPSA4OworCWVsc2UKKwkJcGRpbW0tPmVjX3NkcmFtX3dpZHRoID0gMDsKKwlwZGltbS0+ZGF0YV93aWR0aCA9IHBkaW1tLT5wcmltYXJ5X3NkcmFtX3dpZHRoCisJCQkgICsgcGRpbW0tPmVjX3NkcmFtX3dpZHRoOworCisJc3dpdGNoIChzcGQtPm1vZHVsZV90eXBlICYgMHhmKSB7CisJY2FzZSAweDAxOgkvKiBSRElNTSAqLworCWNhc2UgMHgwNToJLyogTWluaS1SRElNTSAqLworCQlwZGltbS0+cmVnaXN0ZXJlZF9kaW1tID0gMTsgLyogcmVnaXN0ZXIgYnVmZmVyZWQgKi8KKwkJYnJlYWs7CisKKwljYXNlIDB4MDI6CS8qIFVESU1NICovCisJY2FzZSAweDAzOgkvKiBTTy1ESU1NICovCisJY2FzZSAweDA0OgkvKiBNaWNyby1ESU1NICovCisJY2FzZSAweDA2OgkvKiBNaW5pLVVESU1NICovCisJCXBkaW1tLT5yZWdpc3RlcmVkX2RpbW0gPSAwOwkvKiB1bmJ1ZmZlcmVkICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCJ1bmtub3duIGRpbW1fdHlwZSAweCUwMlhcbiIsIHNwZC0+bW9kdWxlX3R5cGUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBTRFJBTSBkZXZpY2UgcGFyYW1ldGVycyAqLworCXBkaW1tLT5uX3Jvd19hZGRyID0gKChzcGQtPmFkZHJlc3NpbmcgPj4gMykgJiAweDcpICsgMTI7CisJcGRpbW0tPm5fY29sX2FkZHIgPSAoc3BkLT5hZGRyZXNzaW5nICYgMHg3KSArIDk7CisJcGRpbW0tPm5fYmFua3NfcGVyX3NkcmFtX2RldmljZSA9IDggPDwgKChzcGQtPmRlbnNpdHlfYmFua3MgPj4gNCkgJiAweDcpOworCisJLyoKKwkgKiBUaGUgU1BEIHNwZWMgaGFzIG5vdCB0aGUgRUNDIGJpdCwKKwkgKiBXZSBjb25zaWRlciB0aGUgRElNTSBhcyBFQ0MgY2FwYWJpbGl0eQorCSAqIHdoZW4gdGhlIGV4dGVuc2lvbiBidXMgZXhpc3QKKwkgKi8KKwlpZiAocGRpbW0tPmVjX3NkcmFtX3dpZHRoKQorCQlwZGltbS0+ZWRjX2NvbmZpZyA9IDB4MDI7CisJZWxzZQorCQlwZGltbS0+ZWRjX2NvbmZpZyA9IDB4MDA7CisKKwkvKgorCSAqIFRoZSBTUEQgc3BlYyBoYXMgbm90IHRoZSBidXJzdCBsZW5ndGggYnl0ZQorCSAqIGJ1dCBERFIzIHNwZWMgaGFzIG5hdHVyZSBCTDggYW5kIEJDNCwKKwkgKiBCTDggLWJpdDMsIEJDNCAtYml0MgorCSAqLworCXBkaW1tLT5idXJzdF9sZW5ndGhzX2JpdG1hc2sgPSAweDBjOworCXBkaW1tLT5yb3dfZGVuc2l0eSA9IF9faWxvZzIocGRpbW0tPnJhbmtfZGVuc2l0eSk7CisKKwkvKiBNVEIgLSBtZWRpdW0gdGltZWJhc2UKKwkgKiBUaGUgdW5pdCBpbiB0aGUgU1BEIHNwZWMgaXMgbnMsCisJICogV2UgY29udmVydCBpdCB0byBwcy4KKwkgKiBlZzogTVRCID0gMC4xMjVucyAoMTI1cHMpCisJICovCisJbXRiX3BzID0gKHNwZC0+bXRiX2RpdmlkZW5kICogMTAwMCkgL3NwZC0+bXRiX2Rpdmlzb3I7CisJcGRpbW0tPm10Yl9wcyA9IG10Yl9wczsKKworCS8qCisJICogc2RyYW0gbWluaW11bSBjeWNsZSB0aW1lCisJICogd2UgYXNzdW1lIHRoZSBNVEIgaXMgMC4xMjVucworCSAqIGVnOgorCSAqIHRDS19taW49MTUgTVRCICgxLjg3NW5zKSAtPkREUjMtMTA2NgorCSAqICAgICAgICA9MTIgTVRCICgxLjVucykgLT5ERFIzLTEzMzMKKwkgKiAgICAgICAgPTEwIE1UQiAoMS4yNW5zKSAtPkREUjMtMTYwMAorCSAqLworCXBkaW1tLT50Q0ttaW5fWF9wcyA9IHNwZC0+dENLX21pbiAqIG10Yl9wczsKKworCS8qCisJICogQ0FTIGxhdGVuY3kgc3VwcG9ydGVkCisJICogYml0NCAtIENMNAorCSAqIGJpdDUgLSBDTDUKKwkgKiBiaXQxOCAtIENMMTgKKwkgKi8KKwlwZGltbS0+Y2FzbGF0X1ggID0gKChzcGQtPmNhc2xhdF9tc2IgPDwgOCkgfCBzcGQtPmNhc2xhdF9sc2IpIDw8IDQ7CisKKwkvKgorCSAqIG1pbiBDQVMgbGF0ZW5jeSB0aW1lCisJICogZWc6IHRBQV9taW4gPQorCSAqIEREUjMtODAwRAkxMDAgTVRCICgxMi41bnMpCisJICogRERSMy0xMDY2RgkxMDUgTVRCICgxMy4xMjVucykKKwkgKiBERFIzLTEzMzNICTEwOCBNVEIgKDEzLjVucykKKwkgKiBERFIzLTE2MDBICTkwIE1UQiAoMTEuMjVucykKKwkgKi8KKwlwZGltbS0+dEFBX3BzID0gc3BkLT50QUFfbWluICogbXRiX3BzOworCisJLyoKKwkgKiBtaW4gd3JpdGUgcmVjb3ZlcnkgdGltZQorCSAqIGVnOgorCSAqIHRXUl9taW4gPSAxMjAgTVRCICgxNW5zKSAtPiBhbGwgc3BlZWQgZ3JhZGVzLgorCSAqLworCXBkaW1tLT50V1JfcHMgPSBzcGQtPnRXUl9taW4gKiBtdGJfcHM7CisKKwkvKgorCSAqIG1pbiBSQVMgdG8gQ0FTIGRlbGF5IHRpbWUKKwkgKiBlZzogdFJDRF9taW4gPQorCSAqIEREUjMtODAwCTEwMCBNVEIgKDEyLjVucykKKwkgKiBERFIzLTEwNjZGCTEwNSBNVEIgKDEzLjEyNW5zKQorCSAqIEREUjMtMTMzM0gJMTA4IE1UQiAoMTMuNW5zKQorCSAqIEREUjMtMTYwMEgJOTAgTVRCICgxMS4yNSkKKwkgKi8KKwlwZGltbS0+dFJDRF9wcyA9IHNwZC0+dFJDRF9taW4gKiBtdGJfcHM7CisKKwkvKgorCSAqIG1pbiByb3cgYWN0aXZlIHRvIHJvdyBhY3RpdmUgZGVsYXkgdGltZQorCSAqIGVnOiB0UlJEX21pbiA9CisJICogRERSMy04MDAoMUtCIHBhZ2UpCTgwIE1UQiAoMTBucykKKwkgKiBERFIzLTEzMzMoMUtCIHBhZ2UpCTQ4IE1UQiAoNm5zKQorCSAqLworCXBkaW1tLT50UlJEX3BzID0gc3BkLT50UlJEX21pbiAqIG10Yl9wczsKKworCS8qCisJICogbWluIHJvdyBwcmVjaGFyZ2UgZGVsYXkgdGltZQorCSAqIGVnOiB0UlBfbWluID0KKwkgKiBERFIzLTgwMEQJMTAwIE1UQiAoMTIuNW5zKQorCSAqIEREUjMtMTA2NkYJMTA1IE1UQiAoMTMuMTI1bnMpCisJICogRERSMy0xMzMzSAkxMDggTVRCICgxMy41bnMpCisJICogRERSMy0xNjAwSAk5MCBNVEIgKDExLjI1bnMpCisJICovCisJcGRpbW0tPnRSUF9wcyA9IHNwZC0+dFJQX21pbiAqIG10Yl9wczsKKworCS8qIG1pbiBhY3RpdmUgdG8gcHJlY2hhcmdlIGRlbGF5IHRpbWUKKwkgKiBlZzogdFJBU19taW4gPQorCSAqIEREUjMtODAwRAkzMDAgTVRCICgzNy41bnMpCisJICogRERSMy0xMDY2RgkzMDAgTVRCICgzNy41bnMpCisJICogRERSMy0xMzMzSAkyODggTVRCICgzNm5zKQorCSAqIEREUjMtMTYwMEgJMjgwIE1UQiAoMzVucykKKwkgKi8KKwlwZGltbS0+dFJBU19wcyA9ICgoKHNwZC0+dFJBU190UkNfZXh0ICYgMHhmKSA8PCA4KSB8IHNwZC0+dFJBU19taW5fbHNiKQorCQkJKiBtdGJfcHM7CisJLyoKKwkgKiBtaW4gYWN0aXZlIHRvIGFjdGljZS9yZWZyZXNoIGRlbGF5IHRpbWUKKwkgKiBlZzogdFJDX21pbiA9CisJICogRERSMy04MDBECTQwMCBNVEIgKDUwbnMpCisJICogRERSMy0xMDY2Rgk0MDUgTVRCICg1MC42MjVucykKKwkgKiBERFIzLTEzMzNICTM5NiBNVEIgKDQ5LjVucykKKwkgKiBERFIzLTE2MDBICTM3MCBNVEIgKDQ2LjI1bnMpCisJICovCisJcGRpbW0tPnRSQ19wcyA9ICgoKHNwZC0+dFJBU190UkNfZXh0ICYgMHhmMCkgPDwgNCkgfCBzcGQtPnRSQ19taW5fbHNiKQorCQkJKiBtdGJfcHM7CisJLyoKKwkgKiBtaW4gcmVmcmVzaCByZWNvdmVyeSBkZWxheSB0aW1lCisJICogZWc6IHRSRkNfbWluID0KKwkgKiA1MTJNYgk3MjAgTVRCICg5MG5zKQorCSAqIDFHYgkJODgwIE1UQiAoMTEwbnMpCisJICogMkdiCQkxMjgwIE1UQiAoMTYwbnMpCisJICovCisJcGRpbW0tPnRSRkNfcHMgPSAoKHNwZC0+dFJGQ19taW5fbXNiIDw8IDgpIHwgc3BkLT50UkZDX21pbl9sc2IpCisJCQkqIG10Yl9wczsKKwkvKgorCSAqIG1pbiBpbnRlcm5hbCB3cml0ZSB0byByZWFkIGNvbW1hbmQgZGVsYXkgdGltZQorCSAqIGVnOiB0V1RSX21pbiA9IDQwIE1UQiAoNy41bnMpIC0gYWxsIHNwZWVkIGJpbnMuCisJICogdFdSVCBpcyBhdCBsZWFzdCA0IG1jbGsgaW5kZXBlbmRlbnQgb2Ygb3BlcmF0aW5nIGZyZXEuCisJICovCisJcGRpbW0tPnRXVFJfcHMgPSBzcGQtPnRXVFJfbWluICogbXRiX3BzOworCisJLyoKKwkgKiBtaW4gaW50ZXJuYWwgcmVhZCB0byBwcmVjaGFyZ2UgY29tbWFuZCBkZWxheSB0aW1lCisJICogZWc6IHRSVFBfbWluID0gNDAgTVRCICg3LjVucykgLSBhbGwgc3BlZWQgYmlucy4KKwkgKiB0UlRQIGlzIGF0IGxlYXN0IDQgbWNsayBpbmRlcGVuZGVudCBvZiBvcGVyYXRpbmcgZnJlcS4KKwkgKi8KKwlwZGltbS0+dFJUUF9wcyA9IHNwZC0+dFJUUF9taW4gKiBtdGJfcHM7CisKKwkvKgorCSAqIEF2ZXJhZ2UgcGVyaW9kaWMgcmVmcmVzaCBpbnRlcnZhbAorCSAqIHRSRUZJID0gNy44IHVzIGF0IG5vcm1hbCB0ZW1wZXJhdHVyZSByYW5nZQorCSAqICAgICAgID0gMy45IHVzIGF0IGV4dCB0ZW1wZXJhdHVyZSByYW5nZQorCSAqLworCXBkaW1tLT5yZWZyZXNoX3JhdGVfcHMgPSA3ODAwMDAwOworCisJLyoKKwkgKiBtaW4gZm91ciBhY3RpdmUgd2luZG93IGRlbGF5IHRpbWUKKwkgKiBlZzogdEZBV19taW4gPQorCSAqIEREUjMtODAwKDFLQiBwYWdlKQkzMjAgTVRCICg0MG5zKQorCSAqIEREUjMtMTA2NigxS0IgcGFnZSkJMzAwIE1UQiAoMzcuNW5zKQorCSAqIEREUjMtMTMzMygxS0IgcGFnZSkJMjQwIE1UQiAoMzBucykKKwkgKiBERFIzLTE2MDAoMUtCIHBhZ2UpCTI0MCBNVEIgKDMwbnMpCisJICovCisJcGRpbW0tPnRGQVdfcHMgPSAoKChzcGQtPnRGQVdfbXNiICYgMHhmKSA8PCA4KSB8IHNwZC0+dEZBV19taW4pCisJCQkqIG10Yl9wczsKKworCS8qCisJICogV2UgbmVlZCBjaGVjayB0aGUgYWRkcmVzcyBtaXJyb3IgZm9yIHVuYnVmZmVyZWQgRElNTQorCSAqIElmIFNQRCBpbmRpY2F0ZSB0aGUgYWRkcmVzcyBtYXAgbWlycm9yLCBUaGUgRERSIGNvbnRyb2xsZXIKKwkgKiBuZWVkIGNhcmUgaXQuCisJICovCisJaWYgKChzcGQtPm1vZHVsZV90eXBlID09IFNQRF9NT0RVTEVUWVBFX1VESU1NKSB8fAorCSAgICAoc3BkLT5tb2R1bGVfdHlwZSA9PSBTUERfTU9EVUxFVFlQRV9TT0RJTU0pIHx8CisJICAgIChzcGQtPm1vZHVsZV90eXBlID09IFNQRF9NT0RVTEVUWVBFX01JQ1JPRElNTSkgfHwKKwkgICAgKHNwZC0+bW9kdWxlX3R5cGUgPT0gU1BEX01PRFVMRVRZUEVfTUlOSVVESU1NKSkKKwkJcGRpbW0tPm1pcnJvcmVkX2RpbW0gPSBzcGQtPm1vZF9zZWN0aW9uLnVuYnVmZmVyZWQuYWRkcl9tYXBwaW5nICYgMHgxOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvZGRyL2xjX2NvbW1vbl9kaW1tX3BhcmFtcy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9sY19jb21tb25fZGltbV9wYXJhbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg4ZTNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9sY19jb21tb25fZGltbV9wYXJhbXMuYwpAQCAtMCwwICsxLDQ2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2ZzbF9kZHJfc2RyYW0uaD4KKworI2luY2x1ZGUgImRkci5oIgorCit1bnNpZ25lZCBpbnQKK2NvbXB1dGVfY2FzX2xhdGVuY3lfZGRyMyhjb25zdCBkaW1tX3BhcmFtc190ICpkaW1tX3BhcmFtcywKKwkJCSBjb21tb25fdGltaW5nX3BhcmFtc190ICpvdXRwZGltbSwKKwkJCSB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpbW1zKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCB0QUFtaW5fcHMgPSAwOworCXVuc2lnbmVkIGludCB0Q0ttaW5fWF9wcyA9IDA7CisJdW5zaWduZWQgaW50IGNvbW1vbl9jYXNsYXQ7CisJdW5zaWduZWQgaW50IGNhc2xhdF9hY3R1YWw7CisJdW5zaWduZWQgaW50IHJldHJ5ID0gMTY7CisJdW5zaWduZWQgaW50IHRtcDsKKwljb25zdCB1bnNpZ25lZCBpbnQgbWNsa19wcyA9IGdldF9tZW1vcnlfY2xrX3BlcmlvZF9wcygpOworCisJLyogY29tcHV0ZSB0aGUgY29tbW9uIENBUyBsYXRlbmN5IHN1cHBvcnRlZCBiZXR3ZWVuIHNsb3RzICovCisJdG1wID0gZGltbV9wYXJhbXNbMF0uY2FzbGF0X1g7CisJZm9yIChpID0gMTsgaSA8IG51bWJlcl9vZl9kaW1tczsgaSsrKQorCQkgdG1wICY9IGRpbW1fcGFyYW1zW2ldLmNhc2xhdF9YOworCWNvbW1vbl9jYXNsYXQgPSB0bXA7CisKKwkvKiBjb21wdXRlIHRoZSBtYXggdEFBbWluIHRDS21pbiBiZXR3ZWVuIHNsb3RzICovCisJZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9kaW1tczsgaSsrKSB7CisJCXRBQW1pbl9wcyA9IG1heCh0QUFtaW5fcHMsIGRpbW1fcGFyYW1zW2ldLnRBQV9wcyk7CisJCXRDS21pbl9YX3BzID0gbWF4KHRDS21pbl9YX3BzLCBkaW1tX3BhcmFtc1tpXS50Q0ttaW5fWF9wcyk7CisJfQorCS8qIHZhbGlkYXRlIGlmIHRoZSBtZW1vcnkgY2xrIGlzIGluIHRoZSByYW5nZSBvZiBkaW1tcyAqLworCWlmIChtY2xrX3BzIDwgdENLbWluX1hfcHMpIHsKKwkJcHJpbnRmKCJUaGUgRElNTSBtYXggdENLbWluIGlzICVkIHBzLCIKKwkJCSJkb2Vzbid0IHN1cHBvcnQgdGhlIE1DTEsgY3ljbGUgJWQgcHNcbiIsCisJCQl0Q0ttaW5fWF9wcywgbWNsa19wcyk7CisJCXJldHVybiAxOworCX0KKwkvKiBkZXRlcm1pbmUgdGhlIGFjdXRhbCBjYXMgbGF0ZW5jeSAqLworCWNhc2xhdF9hY3R1YWwgPSAodEFBbWluX3BzICsgbWNsa19wcyAtIDEpIC8gbWNsa19wczsKKwkvKiBjaGVjayBpZiB0aGUgZGltbXMgc3VwcG9ydCB0aGUgQ0FTIGxhdGVuY3kgKi8KKwl3aGlsZSAoIShjb21tb25fY2FzbGF0ICYgKDEgPDwgY2FzbGF0X2FjdHVhbCkpICYmIHJldHJ5ID4gMCkgeworCQljYXNsYXRfYWN0dWFsKys7CisJCXJldHJ5LS07CisJfQorCS8qIG9uY2UgdGhlIGNhY3VsYXRpb24gb2YgY2FzbGF0X2FjdHVhbCBpcyBjb21wbGV0ZWQKKwkgKiB3ZSBtdXN0IHZlcmlmeSB0aGF0IHRoaXMgQ0FTIGxhdGVuY3kgdmFsdWUgZG9lcyBub3QKKwkgKiBleGNlZWQgdEFBbWF4LCB3aGljaCBpcyAyMCBucyBmb3IgYWxsIEREUjMgc3BlZWQgZ3JhZGVzCisJICovCisJaWYgKGNhc2xhdF9hY3R1YWwgKiBtY2xrX3BzID4gMjAwMDApIHsKKwkJcHJpbnRmKCJUaGUgY2hvb3NlbiBjYXMgbGF0ZW5jeSAlZCBpcyB0b28gbGFyZ2VcbiIsCisJCQljYXNsYXRfYWN0dWFsKTsKKwkJcmV0dXJuIDE7CisJfQorCW91dHBkaW1tLT5sb3dlc3RfY29tbW9uX1NQRF9jYXNsYXQgPSBjYXNsYXRfYWN0dWFsOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjb21wdXRlX2xvd2VzdF9jb21tb25fZGltbV9wYXJhbWV0ZXJzKCkKKyAqCisgKiBEZXRlcm1pbmUgdGhlIHdvcnN0LWNhc2UgRElNTSB0aW1pbmcgcGFyYW1ldGVycyBmcm9tIHRoZSBzZXQgb2YgRElNTXMKKyAqIHdob3NlIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNvbXB1dGVkIGludG8gdGhlIGFycmF5IHBvaW50ZWQgdG8KKyAqIGJ5IGRpbW1fcGFyYW1zLgorICovCit1bnNpZ25lZCBpbnQKK2NvbXB1dGVfbG93ZXN0X2NvbW1vbl9kaW1tX3BhcmFtZXRlcnMoY29uc3QgZGltbV9wYXJhbXNfdCAqZGltbV9wYXJhbXMsCisJCQkJICAgICAgY29tbW9uX3RpbWluZ19wYXJhbXNfdCAqb3V0cGRpbW0sCisJCQkJICAgICAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9kaW1tcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCXVuc2lnbmVkIGludCB0Q0ttaW5fWF9wcyA9IDA7CisJdW5zaWduZWQgaW50IHRDS21heF9wcyA9IDB4RkZGRkZGRkY7CisJdW5zaWduZWQgaW50IHRDS21heF9tYXhfcHMgPSAwOworCXVuc2lnbmVkIGludCB0UkNEX3BzID0gMDsKKwl1bnNpZ25lZCBpbnQgdFJQX3BzID0gMDsKKwl1bnNpZ25lZCBpbnQgdFJBU19wcyA9IDA7CisJdW5zaWduZWQgaW50IHRXUl9wcyA9IDA7CisJdW5zaWduZWQgaW50IHRXVFJfcHMgPSAwOworCXVuc2lnbmVkIGludCB0UkZDX3BzID0gMDsKKwl1bnNpZ25lZCBpbnQgdFJSRF9wcyA9IDA7CisJdW5zaWduZWQgaW50IHRSQ19wcyA9IDA7CisJdW5zaWduZWQgaW50IHJlZnJlc2hfcmF0ZV9wcyA9IDA7CisJdW5zaWduZWQgaW50IHRJU19wcyA9IDA7CisJdW5zaWduZWQgaW50IHRJSF9wcyA9IDA7CisJdW5zaWduZWQgaW50IHREU19wcyA9IDA7CisJdW5zaWduZWQgaW50IHRESF9wcyA9IDA7CisJdW5zaWduZWQgaW50IHRSVFBfcHMgPSAwOworCXVuc2lnbmVkIGludCB0RFFTUV9tYXhfcHMgPSAwOworCXVuc2lnbmVkIGludCB0UUhTX3BzID0gMDsKKworCXVuc2lnbmVkIGludCB0ZW1wMSwgdGVtcDI7CisJdW5zaWduZWQgaW50IGFkZGl0aXZlX2xhdGVuY3kgPSAwOworI2lmICFkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKwljb25zdCB1bnNpZ25lZCBpbnQgbWNsa19wcyA9IGdldF9tZW1vcnlfY2xrX3BlcmlvZF9wcygpOworCXVuc2lnbmVkIGludCBsb3dlc3RfZ29vZF9jYXNsYXQ7CisJdW5zaWduZWQgaW50IG5vdF9vazsKKworCWRlYnVnKCJ1c2luZyBtY2xrX3BzID0gJXVcbiIsIG1jbGtfcHMpOworI2VuZGlmCisKKwl0ZW1wMSA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9kaW1tczsgaSsrKSB7CisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBubyByYW5rcyBvbiB0aGlzIERJTU0sCisJCSAqIGl0IHByb2JhYmx5IGRvZXNuJ3QgZXhpc3QsIHNvIHNraXAgaXQuCisJCSAqLworCQlpZiAoZGltbV9wYXJhbXNbaV0ubl9yYW5rcyA9PSAwKSB7CisJCQl0ZW1wMSsrOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBGaW5kIG1pbmltdW0gdENLbWF4X3BzIHRvIGZpbmQgZmFzdGVzdCBzbG93IHNwZWVkLAorCQkgKiBpLmUuLCB0aGlzIGlzIHRoZSBzbG93ZXN0IHRoZSB3aG9sZSBzeXN0ZW0gY2FuIGdvLgorCQkgKi8KKwkJdENLbWF4X3BzID0gbWluKHRDS21heF9wcywgZGltbV9wYXJhbXNbaV0udENLbWF4X3BzKTsKKworCQkvKiBFaXRoZXIgZmluZCBtYXhpbXVtIHZhbHVlIHRvIGRldGVybWluZSBzbG93ZXN0CisJCSAqIHNwZWVkLCBkZWxheSwgdGltZSwgcGVyaW9kLCBldGMgKi8KKwkJdENLbWluX1hfcHMgPSBtYXgodENLbWluX1hfcHMsIGRpbW1fcGFyYW1zW2ldLnRDS21pbl9YX3BzKTsKKwkJdENLbWF4X21heF9wcyA9IG1heCh0Q0ttYXhfbWF4X3BzLCBkaW1tX3BhcmFtc1tpXS50Q0ttYXhfcHMpOworCQl0UkNEX3BzID0gbWF4KHRSQ0RfcHMsIGRpbW1fcGFyYW1zW2ldLnRSQ0RfcHMpOworCQl0UlBfcHMgPSBtYXgodFJQX3BzLCBkaW1tX3BhcmFtc1tpXS50UlBfcHMpOworCQl0UkFTX3BzID0gbWF4KHRSQVNfcHMsIGRpbW1fcGFyYW1zW2ldLnRSQVNfcHMpOworCQl0V1JfcHMgPSBtYXgodFdSX3BzLCBkaW1tX3BhcmFtc1tpXS50V1JfcHMpOworCQl0V1RSX3BzID0gbWF4KHRXVFJfcHMsIGRpbW1fcGFyYW1zW2ldLnRXVFJfcHMpOworCQl0UkZDX3BzID0gbWF4KHRSRkNfcHMsIGRpbW1fcGFyYW1zW2ldLnRSRkNfcHMpOworCQl0UlJEX3BzID0gbWF4KHRSUkRfcHMsIGRpbW1fcGFyYW1zW2ldLnRSUkRfcHMpOworCQl0UkNfcHMgPSBtYXgodFJDX3BzLCBkaW1tX3BhcmFtc1tpXS50UkNfcHMpOworCQl0SVNfcHMgPSBtYXgodElTX3BzLCBkaW1tX3BhcmFtc1tpXS50SVNfcHMpOworCQl0SUhfcHMgPSBtYXgodElIX3BzLCBkaW1tX3BhcmFtc1tpXS50SUhfcHMpOworCQl0RFNfcHMgPSBtYXgodERTX3BzLCBkaW1tX3BhcmFtc1tpXS50RFNfcHMpOworCQl0REhfcHMgPSBtYXgodERIX3BzLCBkaW1tX3BhcmFtc1tpXS50REhfcHMpOworCQl0UlRQX3BzID0gbWF4KHRSVFBfcHMsIGRpbW1fcGFyYW1zW2ldLnRSVFBfcHMpOworCQl0UUhTX3BzID0gbWF4KHRRSFNfcHMsIGRpbW1fcGFyYW1zW2ldLnRRSFNfcHMpOworCQlyZWZyZXNoX3JhdGVfcHMgPSBtYXgocmVmcmVzaF9yYXRlX3BzLAorCQkJCSAgICAgIGRpbW1fcGFyYW1zW2ldLnJlZnJlc2hfcmF0ZV9wcyk7CisKKwkJLyoKKwkJICogRmluZCBtYXhpbXVtIHREUVNRX21heF9wcyB0byBmaW5kIHNsb3dlc3QuCisJCSAqCisJCSAqIEZJWE1FOiBpcyBmaW5kaW5nIHRoZSBzbG93ZXN0IHZhbHVlIHRoZSBjb3JyZWN0CisJCSAqIHN0cmF0ZWd5IGZvciB0aGlzIHBhcmFtZXRlcj8KKwkJICovCisJCXREUVNRX21heF9wcyA9IG1heCh0RFFTUV9tYXhfcHMsIGRpbW1fcGFyYW1zW2ldLnREUVNRX21heF9wcyk7CisJfQorCisJb3V0cGRpbW0tPm5kaW1tc19wcmVzZW50ID0gbnVtYmVyX29mX2RpbW1zIC0gdGVtcDE7CisKKwlpZiAodGVtcDEgPT0gbnVtYmVyX29mX2RpbW1zKSB7CisJCWRlYnVnKCJubyBkaW1tcyB0aGlzIG1lbW9yeSBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJb3V0cGRpbW0tPnRDS21pbl9YX3BzID0gdENLbWluX1hfcHM7CisJb3V0cGRpbW0tPnRDS21heF9wcyA9IHRDS21heF9wczsKKwlvdXRwZGltbS0+dENLbWF4X21heF9wcyA9IHRDS21heF9tYXhfcHM7CisJb3V0cGRpbW0tPnRSQ0RfcHMgPSB0UkNEX3BzOworCW91dHBkaW1tLT50UlBfcHMgPSB0UlBfcHM7CisJb3V0cGRpbW0tPnRSQVNfcHMgPSB0UkFTX3BzOworCW91dHBkaW1tLT50V1JfcHMgPSB0V1JfcHM7CisJb3V0cGRpbW0tPnRXVFJfcHMgPSB0V1RSX3BzOworCW91dHBkaW1tLT50UkZDX3BzID0gdFJGQ19wczsKKwlvdXRwZGltbS0+dFJSRF9wcyA9IHRSUkRfcHM7CisJb3V0cGRpbW0tPnRSQ19wcyA9IHRSQ19wczsKKwlvdXRwZGltbS0+cmVmcmVzaF9yYXRlX3BzID0gcmVmcmVzaF9yYXRlX3BzOworCW91dHBkaW1tLT50SVNfcHMgPSB0SVNfcHM7CisJb3V0cGRpbW0tPnRJSF9wcyA9IHRJSF9wczsKKwlvdXRwZGltbS0+dERTX3BzID0gdERTX3BzOworCW91dHBkaW1tLT50REhfcHMgPSB0REhfcHM7CisJb3V0cGRpbW0tPnRSVFBfcHMgPSB0UlRQX3BzOworCW91dHBkaW1tLT50RFFTUV9tYXhfcHMgPSB0RFFTUV9tYXhfcHM7CisJb3V0cGRpbW0tPnRRSFNfcHMgPSB0UUhTX3BzOworCisJLyogRGV0ZXJtaW5lIGNvbW1vbiBidXJzdCBsZW5ndGggZm9yIGFsbCBESU1Ncy4gKi8KKwl0ZW1wMSA9IDB4ZmY7CisJZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9kaW1tczsgaSsrKSB7CisJCWlmIChkaW1tX3BhcmFtc1tpXS5uX3JhbmtzKSB7CisJCQl0ZW1wMSAmPSBkaW1tX3BhcmFtc1tpXS5idXJzdF9sZW5ndGhzX2JpdG1hc2s7CisJCX0KKwl9CisJb3V0cGRpbW0tPmFsbF9ESU1Nc19idXJzdF9sZW5ndGhzX2JpdG1hc2sgPSB0ZW1wMTsKKworCS8qIERldGVybWluZSBpZiBhbGwgRElNTXMgcmVnaXN0ZXJlZCBidWZmZXJlZC4gKi8KKwl0ZW1wMSA9IHRlbXAyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX29mX2RpbW1zOyBpKyspIHsKKwkJaWYgKGRpbW1fcGFyYW1zW2ldLm5fcmFua3MpIHsKKwkJCWlmIChkaW1tX3BhcmFtc1tpXS5yZWdpc3RlcmVkX2RpbW0pCisJCQkJdGVtcDEgPSAxOworCQkJaWYgKCFkaW1tX3BhcmFtc1tpXS5yZWdpc3RlcmVkX2RpbW0pCisJCQkJdGVtcDIgPSAxOworCQl9CisJfQorCisJb3V0cGRpbW0tPmFsbF9ESU1Nc19yZWdpc3RlcmVkID0gMDsKKwlpZiAodGVtcDEgJiYgIXRlbXAyKSB7CisJCW91dHBkaW1tLT5hbGxfRElNTXNfcmVnaXN0ZXJlZCA9IDE7CisJfQorCisJb3V0cGRpbW0tPmFsbF9ESU1Nc191bmJ1ZmZlcmVkID0gMDsKKwlpZiAoIXRlbXAxICYmIHRlbXAyKSB7CisJCW91dHBkaW1tLT5hbGxfRElNTXNfdW5idWZmZXJlZCA9IDE7CisJfQorCisJLyogQ0hFQ0tNRTogKi8KKwlpZiAoIW91dHBkaW1tLT5hbGxfRElNTXNfcmVnaXN0ZXJlZAorCSAgICAmJiAhb3V0cGRpbW0tPmFsbF9ESU1Nc191bmJ1ZmZlcmVkKSB7CisJCXByaW50ZigiRVJST1I6ICBNaXggb2YgcmVnaXN0ZXJlZCBidWZmZXJlZCBhbmQgdW5idWZmZXJlZCAiCisJCQkJIkRJTU1zIGRldGVjdGVkIVxuIik7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjMpCisJaWYgKGNvbXB1dGVfY2FzX2xhdGVuY3lfZGRyMyhkaW1tX3BhcmFtcywgb3V0cGRpbW0sIG51bWJlcl9vZl9kaW1tcykpCisJCXJldHVybiAxOworI2Vsc2UKKwkvKgorCSAqIENvbXB1dGUgYSBDQVMgbGF0ZW5jeSBzdWl0YWJsZSBmb3IgYWxsIERJTU1zCisJICoKKwkgKiBTdHJhdGVneSBmb3IgU1BELWRlZmluZWQgbGF0ZW5jaWVzOiBjb21wdXRlIG9ubHkKKwkgKiBDQVMgbGF0ZW5jeSBkZWZpbmVkIGJ5IGFsbCBESU1Ncy4KKwkgKi8KKworCS8qCisJICogU3RlcCAxOiBmaW5kIENBUyBsYXRlbmN5IGNvbW1vbiB0byBhbGwgRElNTXMgdXNpbmcgYml0d2lzZQorCSAqIG9wZXJhdGlvbi4KKwkgKi8KKwl0ZW1wMSA9IDB4RkY7CisJZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9kaW1tczsgaSsrKSB7CisJCWlmIChkaW1tX3BhcmFtc1tpXS5uX3JhbmtzKSB7CisJCQl0ZW1wMiA9IDA7CisJCQl0ZW1wMiB8PSAxIDw8IGRpbW1fcGFyYW1zW2ldLmNhc2xhdF9YOworCQkJdGVtcDIgfD0gMSA8PCBkaW1tX3BhcmFtc1tpXS5jYXNsYXRfWF9taW51c18xOworCQkJdGVtcDIgfD0gMSA8PCBkaW1tX3BhcmFtc1tpXS5jYXNsYXRfWF9taW51c18yOworCQkJLyoKKwkJCSAqIEZJWE1FOiBJZiB0aGVyZSB3YXMgbm8gZW50cnkgZm9yIFgtMiAoWC0xKSBpbgorCQkJICogdGhlIFNQRCwgdGhlbiBjYXNsYXRfWF9taW51c18yCisJCQkgKiAoY2FzbGF0X1hfbWludXNfMSkgY29udGFpbnMgZWl0aGVyIDI1NSBvcgorCQkJICogMHhGRkZGRkZGRiBiZWNhdXNlIHRoYXQncyB3aGF0IHRoZSBnbG9yaW91cworCQkJICogX19pbG9nMiBmdW5jdGlvbiByZXR1cm5zIGZvciBhbiBpbnB1dCBvZiAwLgorCQkJICogT24gMzItYml0IFBvd2VyUEMsIGxlZnQgc2hpZnQgY291bnRzIHdpdGggYml0CisJCQkgKiAyNiBzZXQgKHRoYXQgdGhlIHZhbHVlIG9mIDI1NSBvciAweEZGRkZGRkZGCisJCQkgKiB3aWxsIGhhdmUpLCBjYXVzZSB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgdG8KKwkJCSAqIGJlIDAuICBUaGF0IGlzIHdoeSB0aGlzIHdvcmtzLgorCQkJICovCisJCQl0ZW1wMSAmPSB0ZW1wMjsKKwkJfQorCX0KKworCS8qCisJICogU3RlcCAyOiBjaGVjayBlYWNoIGNvbW1vbiBDQVMgbGF0ZW5jeSBhZ2FpbnN0IHRDSyBvZiBlYWNoCisJICogRElNTSdzIFNQRC4KKwkgKi8KKwlsb3dlc3RfZ29vZF9jYXNsYXQgPSAwOworCXRlbXAyID0gMDsKKwl3aGlsZSAodGVtcDEpIHsKKwkJbm90X29rID0gMDsKKwkJdGVtcDIgPSAgX19pbG9nMih0ZW1wMSk7CisJCWRlYnVnKCJjaGVja2luZyBjb21tb24gY2FzbGF0ID0gJXVcbiIsIHRlbXAyKTsKKworCQkvKiBDaGVjayBpZiB0aGlzIENBUyBsYXRlbmN5IHdpbGwgd29yayBvbiBhbGwgRElNTXMgYXQgdENLLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX29mX2RpbW1zOyBpKyspIHsKKwkJCWlmICghZGltbV9wYXJhbXNbaV0ubl9yYW5rcykgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGRpbW1fcGFyYW1zW2ldLmNhc2xhdF9YID09IHRlbXAyKSB7CisJCQkJaWYgKG1jbGtfcHMgPj0gZGltbV9wYXJhbXNbaV0udENLbWluX1hfcHMpIHsKKwkJCQkJZGVidWcoIkNMID0gJXUgb2sgb24gRElNTSAldSBhdCB0Q0s9JXUiCisJCQkJCSAgICAiIHBzIHdpdGggaXRzIHRDS21pbl9YX3BzIG9mICV1XG4iLAorCQkJCQkgICAgICAgdGVtcDIsIGksIG1jbGtfcHMsCisJCQkJCSAgICAgICBkaW1tX3BhcmFtc1tpXS50Q0ttaW5fWF9wcyk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSB7CisJCQkJCW5vdF9vaysrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGRpbW1fcGFyYW1zW2ldLmNhc2xhdF9YX21pbnVzXzEgPT0gdGVtcDIpIHsKKwkJCQl1bnNpZ25lZCBpbnQgdENLbWluX1hfbWludXNfMV9wcworCQkJCQk9IGRpbW1fcGFyYW1zW2ldLnRDS21pbl9YX21pbnVzXzFfcHM7CisJCQkJaWYgKG1jbGtfcHMgPj0gdENLbWluX1hfbWludXNfMV9wcykgeworCQkJCQlkZWJ1ZygiQ0wgPSAldSBvayBvbiBESU1NICV1IGF0ICIKKwkJCQkJCSJ0Q0s9JXUgcHMgd2l0aCBpdHMgIgorCQkJCQkJInRDS21pbl9YX21pbnVzXzFfcHMgb2YgJXVcbiIsCisJCQkJCSAgICAgICB0ZW1wMiwgaSwgbWNsa19wcywKKwkJCQkJICAgICAgIHRDS21pbl9YX21pbnVzXzFfcHMpOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlub3Rfb2srKzsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChkaW1tX3BhcmFtc1tpXS5jYXNsYXRfWF9taW51c18yID09IHRlbXAyKSB7CisJCQkJdW5zaWduZWQgaW50IHRDS21pbl9YX21pbnVzXzJfcHMKKwkJCQkJPSBkaW1tX3BhcmFtc1tpXS50Q0ttaW5fWF9taW51c18yX3BzOworCQkJCWlmIChtY2xrX3BzID49IHRDS21pbl9YX21pbnVzXzJfcHMpIHsKKwkJCQkJZGVidWcoIkNMID0gJXUgb2sgb24gRElNTSAldSBhdCAiCisJCQkJCQkidENLPSV1IHBzIHdpdGggaXRzICIKKwkJCQkJCSJ0Q0ttaW5fWF9taW51c18yX3BzIG9mICV1XG4iLAorCQkJCQkgICAgICAgdGVtcDIsIGksIG1jbGtfcHMsCisJCQkJCSAgICAgICB0Q0ttaW5fWF9taW51c18yX3BzKTsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJbm90X29rKys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCFub3Rfb2spIHsKKwkJCWxvd2VzdF9nb29kX2Nhc2xhdCA9IHRlbXAyOworCQl9CisKKwkJdGVtcDEgJj0gfigxIDw8IHRlbXAyKTsKKwl9CisKKwlkZWJ1ZygibG93ZXN0IGNvbW1vbiBTUEQtZGVmaW5lZCBDQVMgbGF0ZW5jeSA9ICV1XG4iLAorCSAgICAgICBsb3dlc3RfZ29vZF9jYXNsYXQpOworCW91dHBkaW1tLT5sb3dlc3RfY29tbW9uX1NQRF9jYXNsYXQgPSBsb3dlc3RfZ29vZF9jYXNsYXQ7CisKKworCS8qCisJICogQ29tcHV0ZSBhIGNvbW1vbiAnZGUtcmF0ZWQnIENBUyBsYXRlbmN5LgorCSAqCisJICogVGhlIHN0cmF0ZWd5IGhlcmUgaXMgdG8gZmluZCB0aGUgKmhpZ2hlc3QqIGRlcmVhdGVkIGNhcyBsYXRlbmN5CisJICogd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBvZiB0aGUgRElNTXMgd2lsbCBzdXBwb3J0IGEgZGVyZWF0ZWQKKwkgKiBDQVMgbGF0ZW5jeSBoaWdoZXIgdGhhbiBvciBlcXVhbCB0byB0aGVpciBsb3dlc3QgZGVyZWF0ZWQgdmFsdWUuCisJICovCisJdGVtcDEgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfZGltbXM7IGkrKykgeworCQl0ZW1wMSA9IG1heCh0ZW1wMSwgZGltbV9wYXJhbXNbaV0uY2FzbGF0X2xvd2VzdF9kZXJhdGVkKTsKKwl9CisJb3V0cGRpbW0tPmhpZ2hlc3RfY29tbW9uX2RlcmF0ZWRfY2FzbGF0ID0gdGVtcDE7CisJZGVidWcoImhpZ2hlc3QgY29tbW9uIGRlcmVhdGVkIENBUyBsYXRlbmN5ID0gJXVcbiIsIHRlbXAxKTsKKyNlbmRpZiAvKiAjaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjMpICovCisKKwkvKiBEZXRlcm1pbmUgaWYgYWxsIERJTU1zIEVDQyBjYXBhYmxlLiAqLworCXRlbXAxID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX29mX2RpbW1zOyBpKyspIHsKKwkJaWYgKGRpbW1fcGFyYW1zW2ldLm5fcmFua3MgJiYgZGltbV9wYXJhbXNbaV0uZWRjX2NvbmZpZyAhPSAyKSB7CisJCQl0ZW1wMSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAodGVtcDEpIHsKKwkJZGVidWcoImFsbCBESU1NcyBFQ0MgY2FwYWJsZVxuIik7CisJfSBlbHNlIHsKKwkJZGVidWcoIldhcm5pbmc6IG5vdCBhbGwgRElNTXMgRUNDIGNhcGFibGUsIGNhbnQgZW5hYmxlIEVDQ1xuIik7CisJfQorCW91dHBkaW1tLT5hbGxfRElNTXNfRUNDX2NhcGFibGUgPSB0ZW1wMTsKKworI2lmbmRlZiBDT05GSUdfRlNMX0REUjMKKwkvKiBGSVhNRTogbW92ZSB0byBzb21ld2hlcmUgZWxzZSB0byB2YWxpZGF0ZS4gKi8KKwlpZiAobWNsa19wcyA+IHRDS21heF9tYXhfcHMpIHsKKwkJcHJpbnRmKCJXYXJuaW5nOiBzb21lIG9mIHRoZSBpbnN0YWxsZWQgRElNTXMgIgorCQkJCSJjYW4gbm90IG9wZXJhdGUgdGhpcyBzbG93bHkuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJLyoKKwkgKiBDb21wdXRlIGFkZGl0aXZlIGxhdGVuY3kuCisJICoKKwkgKiBGb3IgRERSMSwgYWRkaXRpdmUgbGF0ZW5jeSBzaG91bGQgYmUgMC4KKwkgKgorCSAqIEZvciBERFIyLCB3aXRoIE9EVCBlbmFibGVkLCB1c2UgImEgdmFsdWUiIGxlc3MgdGhhbiBBQ1RUT1JXLAorCSAqCXdoaWNoIGNvbWVzIGZyb20gVHJjZCwgYW5kIGFsc28gbm90ZSB0aGF0OgorCSAqCSAgICBhZGRfbGF0ICsgY2FzbGF0IG11c3QgYmUgPj0gNAorCSAqCisJICogRm9yIEREUjMsIHdlIHVzZSB0aGUgQUw9MAorCSAqCisJICogV2hlbiB0byB1c2UgYWRkaXRpdmUgbGF0ZW5jeSBmb3IgRERSMjoKKwkgKgorCSAqIEkuIEJlY2F1c2UgeW91IGFyZSB1c2luZyBDTD0zIGFuZCBuZWVkIHRvIGRvIE9EVCBvbiB3cml0ZXMgYW5kCisJICogICAgd2FudCBmdW5jdGlvbmFsaXR5LgorCSAqICAgIDEuIEFyZSB5b3UgZ29pbmcgdG8gdXNlIE9EVD8gKERvZXMgeW91ciBib2FyZCBub3QgaGF2ZQorCSAqICAgICAgYWRkaXRpb25hbCB0ZXJtaW5hdGlvbiBjaXJjdWl0cnkgZm9yIERRLCBEUVMsIERRU18sCisJICogICAgICBETSwgUkRRUywgUkRRU18gZm9yIHg0L3g4IGNvbmZpZ3M/KQorCSAqICAgIDIuIElmIHNvLCBpcyB5b3VyIGxvd2VzdCBzdXBwb3J0ZWQgQ0wgZ29pbmcgdG8gYmUgMz8KKwkgKiAgICAzLiBJZiBzbywgdGhlbiB5b3UgbXVzdCBzZXQgQUw9MSBiZWNhdXNlCisJICoKKwkgKiAgICAgICBXTCA+PSAzIGZvciBPRFQgb24gd3JpdGVzCisJICogICAgICAgUkwgPSBBTCArIENMCisJICogICAgICAgV0wgPSBSTCAtIDEKKwkgKiAgICAgICAtPgorCSAqICAgICAgIFdMID0gQUwgKyBDTCAtIDEKKwkgKiAgICAgICBBTCArIENMIC0gMSA+PSAzCisJICogICAgICAgQUwgKyBDTCA+PSA0CisJICogIFFFRAorCSAqCisJICogIFJMID49IDMgZm9yIE9EVCBvbiByZWFkcworCSAqICBSTCA9IEFMICsgQ0wKKwkgKgorCSAqICBTaW5jZSBDTCBhcmVuJ3QgdXN1YWxseSBsZXNzIHRoYW4gMiwgQUw9MCBpcyBhIG1pbmltdW0sCisJICogIHNvIHRoZSBXTC1kZXJpdmVkIEFMIHNob3VsZCBiZSB0aGUgIC0tIEZJWE1FPworCSAqCisJICogSUkuIEJlY2F1c2UgeW91IGFyZSB1c2luZyBhdXRvLXByZWNoYXJnZSBnbG9iYWxseSBhbmQgd2FudCB0bworCSAqICAgICB1c2UgYWRkaXRpdmUgbGF0ZW5jeSAocG9zdGVkIENBUykgdG8gZ2V0IG1vcmUgYmFuZHdpZHRoLgorCSAqICAgICAxLiBBcmUgeW91IGdvaW5nIHRvIHVzZSBhdXRvLXByZWNoYXJnZSBtb2RlIGdsb2JhbGx5PworCSAqCisJICogICAgICAgIFVzZSBhZGR0aXZpZSBsYXRlbmN5IGFuZCBjb21wdXRlIEFMIHRvIGJlIDEgY3ljbGUgbGVzcyB0aGFuCisJICogICAgICAgIHRSQ0QsIGkuZS4gdGhlIFJFQUQgb3IgV1JJVEUgY29tbWFuZCBpcyBpbiB0aGUgY3ljbGUKKwkgKiAgICAgICAgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBBQ1RJVkFURSBjb21tYW5kLi4KKwkgKgorCSAqIElJSS4gQmVjYXVzZSB5b3UgZmVlbCBsaWtlIGl0IG9yIHdhbnQgdG8gZG8gc29tZSBzb3J0IG9mCisJICogICAgICBkZWdyYWRlZC1wZXJmb3JtYW5jZSBleHBlcmltZW50LgorCSAqICAgICAxLiAgRG8geW91IGp1c3Qgd2FudCB0byB1c2UgYWRkaXRpdmUgbGF0ZW5jeSBiZWNhdXNlIHlvdSBmZWVsCisJICogICAgICAgICBsaWtlIGl0PworCSAqCisJICogVmFsaWRhdGlvbjogIEFMIGlzIGxlc3MgdGhhbiB0UkNELCBhbmQgd2l0aGluIHRoZSBvdGhlcgorCSAqIHJlYWQtdG8tcHJlY2hhcmdlIGNvbnN0cmFpbnRzLgorCSAqLworCisJYWRkaXRpdmVfbGF0ZW5jeSA9IDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMikKKwlpZiAobG93ZXN0X2dvb2RfY2FzbGF0IDwgNCkgeworCQlhZGRpdGl2ZV9sYXRlbmN5ID0gcGljb3NfdG9fbWNsayh0UkNEX3BzKSAtIGxvd2VzdF9nb29kX2Nhc2xhdDsKKwkJaWYgKG1jbGtfdG9fcGljb3MoYWRkaXRpdmVfbGF0ZW5jeSkgPiB0UkNEX3BzKSB7CisJCQlhZGRpdGl2ZV9sYXRlbmN5ID0gcGljb3NfdG9fbWNsayh0UkNEX3BzKTsKKwkJCWRlYnVnKCJzZXR0aW5nIGFkZGl0aXZlX2xhdGVuY3kgdG8gJXUgYmVjYXVzZSBpdCB3YXMgIgorCQkJCSIgZ3JlYXRlciB0aGFuIHRSQ0RfcHNcbiIsIGFkZGl0aXZlX2xhdGVuY3kpOworCQl9CisJfQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKwkvKgorCSAqIFRoZSBzeXN0ZW0gd2lsbCBub3QgdXNlIHRoZSBnbG9iYWwgYXV0by1wcmVjaGFyZ2UgbW9kZS4KKwkgKiBIb3dldmVyLCBpdCB1c2VzIHRoZSBwYWdlIG1vZGUsIHNvIHdlIHNldCBBTD0wCisJICovCisJYWRkaXRpdmVfbGF0ZW5jeSA9IDA7CisjZW5kaWYKKworCS8qCisJICogVmFsaWRhdGUgYWRkaXRpdmUgbGF0ZW5jeQorCSAqIEZJWE1FOiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlIHRvIHZhbGlkYXRlCisJICoKKwkgKiBBTCA8PSB0UkNEKG1pbikKKwkgKi8KKwlpZiAobWNsa190b19waWNvcyhhZGRpdGl2ZV9sYXRlbmN5KSA+IHRSQ0RfcHMpIHsKKwkJcHJpbnRmKCJFcnJvcjogaW52YWxpZCBhZGRpdGl2ZSBsYXRlbmN5IGV4Y2VlZHMgdFJDRChtaW4pLlxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogUkwgPSBDTCArIEFMOyAgUkwgPj0gMyBmb3IgT0RUX1JEX0NGRyB0byBiZSBlbmFibGVkCisJICogV0wgPSBSTCAtIDE7ICBXTCA+PSAzIGZvciBPRFRfV0xfQ0ZHIHRvIGJlIGVuYWJsZWQKKwkgKiBBRERfTEFUICh0aGUgcmVnaXN0ZXIpIG11c3QgYmUgc2V0IHRvIGEgdmFsdWUgbGVzcworCSAqIHRoYW4gQUNUVE9SVyBpZiBXTCA9IDEsIHRoZW4gQUwgbXVzdCBiZSBzZXQgdG8gMQorCSAqIFJEX1RPX1BSRSAodGhlIHJlZ2lzdGVyKSBtdXN0IGJlIHNldCB0byBhIG1pbmltdW0KKwkgKiB0UlRQICsgQUwgaWYgQUwgaXMgbm9uemVybworCSAqLworCisJLyoKKwkgKiBBZGRpdGl2ZSBsYXRlbmN5IHdpbGwgYmUgYXBwbGllZCBvbmx5IGlmIHRoZSBtZW1jdGwgb3B0aW9uIHRvCisJICogdXNlIGl0LgorCSAqLworCW91dHBkaW1tLT5hZGRpdGl2ZV9sYXRlbmN5ID0gYWRkaXRpdmVfbGF0ZW5jeTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9tYWluLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvZGRyL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWExYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9tYWluLmMKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworLyoKKyAqIEdlbmVyaWMgZHJpdmVyIGZvciBGcmVlc2NhbGUgRERSL0REUjIvRERSMyBtZW1vcnkgY29udHJvbGxlci4KKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSBzcGRfc2RyYW0uYworICogQXV0aG9yOiBKYW1lcyBZYW5nIFthdCBmcmVlc2NhbGUuY29tXQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2Rkcl9zZHJhbS5oPgorCisjaW5jbHVkZSAiZGRyLmgiCisKK2V4dGVybiB2b2lkIGZzbF9kZHJfc2V0X2xhd2JhcigKKwkJY29uc3QgY29tbW9uX3RpbWluZ19wYXJhbXNfdCAqbWVtY3RsX2NvbW1vbl9wYXJhbXMsCisJCXVuc2lnbmVkIGludCBtZW1jdGxfaW50ZXJsZWF2ZWQsCisJCXVuc2lnbmVkIGludCBjdHJsX251bSk7CisKKy8qIHByb2Nlc3NvciBzcGVjaWZpYyBmdW5jdGlvbiAqLworZXh0ZXJuIHZvaWQgZnNsX2Rkcl9zZXRfbWVtY3RsX3JlZ3MoY29uc3QgZnNsX2Rkcl9jZmdfcmVnc190ICpyZWdzLAorCQkJCSAgIHVuc2lnbmVkIGludCBjdHJsX251bSk7CisKKy8qIEJvYXJkLXNwZWNpZmljIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGVhY2ggYm9hcmQncyBkZHIuYyAqLworZXh0ZXJuIHZvaWQgZnNsX2Rkcl9nZXRfc3BkKGdlbmVyaWNfc3BkX2VlcHJvbV90ICpjdHJsX2RpbW1zX3NwZCwKKwkJCSAgIHVuc2lnbmVkIGludCBjdHJsX251bSk7CisKKy8qCisgKiBBU1NVTVBUSU9OUzoKKyAqICAgIC0gU2FtZSBudW1iZXIgb2YgQ09ORklHX0RJTU1fU0xPVFNfUEVSX0NUTFIgb24gZWFjaCBjb250cm9sbGVyCisgKiAgICAtIFNhbWUgbWVtb3J5IGRhdGEgYnVzIHdpZHRoIG9uIGFsbCBjb250cm9sbGVycworICoKKyAqIE5PVEVTOgorICoKKyAqIFRoZSBtZW1vcnkgY29udHJvbGxlciBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIHVzZSBjb25mdXNpbmcKKyAqIHRlcm1pbm9sb2d5IHdoZW4gcmVmZXJyaW5nIHRvIHRoZSBvcmdyYW5pemF0aW9uIG9mIERSQU0uCisgKgorICogSGVyZSBpcyBhIHRlcm1pbm9sb2d5IHRyYW5zbGF0aW9uIHRhYmxlOgorICoKKyAqIG1lbW9yeSBjb250cm9sbGVyL2RvY3VtZW50aW9uICB8aW5kdXN0cnkgICB8dGhpcyBjb2RlICB8c2lnbmFscworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLQorICogcGh5c2ljYWwgYmFuay9iYW5rCQkgIHxyYW5rICAgICAgIHxyYW5rCSAgfGNoaXAgc2VsZWN0IChDUykKKyAqIGxvZ2ljYWwgYmFuay9zdWItYmFuawkgIHxiYW5rICAgICAgIHxiYW5rCSAgfGJhbmsgYWRkcmVzcyAoQkEpCisgKiBwYWdlL3JvdwkJCSAgfHJvdwkgICAgICB8cGFnZQkgIHxyb3cgYWRkcmVzcworICogPz8/CQkJCSAgfGNvbHVtbiAgICAgfGNvbHVtbgkgIHxjb2x1bW4gYWRkcmVzcworICoKKyAqIFRoZSBuYW1pbmcgY29uZnVzaW9uIGlzIGZ1cnRoZXIgZXhhY2VyYmF0ZWQgYnkgdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUKKyAqIG1lbW9yeSBjb250cm9sbGVyIGludGVybGVhdmluZyBmZWF0dXJlLCB3aGVyZSBhY2Nlc3NlcyBhcmUgaW50ZXJsZWF2ZWQKKyAqIF9CRVRXRUVOXyB0d28gc2VwZXJhdGUgbWVtb3J5IGNvbnRyb2xsZXJzLiAgVGhpcyBpcyBjb25maWd1cmVkIG9ubHkgaW4KKyAqIENTMF9DT05GSUdbSU5UTFZfQ1RMXSBvZiBlYWNoIG1lbW9yeSBjb250cm9sbGVyLgorICoKKyAqIG1lbW9yeSBjb250cm9sbGVyIGRvY3VtZW50YXRpb24gfCBudW1iZXIgb2YgY2hpcCBzZWxlY3RzCisgKgkJCQkgICB8IHBlciBtZW1vcnkgY29udHJvbGxlciBzdXBwb3J0ZWQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjYWNoZSBsaW5lIGludGVybGVhdmluZwkgICB8IDEgKENTMCBvbmx5KQorICogcGFnZSBpbnRlcmxlYXZpbmcJCSAgIHwgMSAoQ1MwIG9ubHkpCisgKiBiYW5rIGludGVybGVhdmluZwkJICAgfCAxIChDUzAgb25seSkKKyAqIHN1cGVyYmFuayBpbnRlcmxlcmF2aW5nCSAgIHwgZGVwZW5kcyBvbiBiYW5rIChjaGlwIHNlbGVjdCkKKyAqCQkJCSAgIHwgICBpbnRlcmxlcmF2aW5nIFtyYW5rIGludGVybGVhdmluZ10KKyAqCQkJCSAgIHwgICBtb2RlIHVzZWQgb24gZXZlcnkgbWVtb3J5IGNvbnRyb2xsZXIKKyAqCisgKiBFdmVuIGZ1cnRoZXIgY29uZnVzaW5nIGlzIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGludGVybGVhdmluZyBmZWF0dXJlCisgKiBfV0lUSElOXyBlYWNoIG1lbW9yeSBjb250cm9sbGVyLiAgVGhlIGZlYXR1cmUgaXMgcmVmZXJyZWQgdG8gaW4KKyAqIGRvY3VtZW50YXRpb24gYXMgY2hpcCBzZWxlY3QgaW50ZXJsZWF2aW5nIG9yIGJhbmsgaW50ZXJsZWF2aW5nLAorICogYWx0aG91Z2ggaXQgaXMgY29uZmlndXJlZCBpbiB0aGUgRERSX1NEUkFNX0NGRyBmaWVsZC4KKyAqCisgKiBOYW1lIG9mIGZpZWxkCQl8IGRvY3VtZW50YXRpb24gbmFtZQl8IHRoaXMgY29kZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tCisgKiBERFJfU0RSQU1fQ0ZHW0JBX0lOVExWX0NUTF0JfCBCYW5rIChjaGlwIHNlbGVjdCkJfCByYW5rIGludGVybGVhdmluZworICoJCQkJfCAgaW50ZXJsZWF2aW5nCisgKi8KKworI2lmZGVmIERFQlVHCitjb25zdCBjaGFyICpzdGVwX3N0cmluZ190YmxbXSA9IHsKKwkiU1RFUF9HRVRfU1BEIiwKKwkiU1RFUF9DT01QVVRFX0RJTU1fUEFSTVMiLAorCSJTVEVQX0NPTVBVVEVfQ09NTU9OX1BBUk1TIiwKKwkiU1RFUF9HQVRIRVJfT1BUUyIsCisJIlNURVBfQVNTSUdOX0FERFJFU1NFUyIsCisJIlNURVBfQ09NUFVURV9SRUdTIiwKKwkiU1RFUF9QUk9HUkFNX1JFR1MiLAorCSJTVEVQX0FMTCIKK307CisKK2NvbnN0IGNoYXIgKiBzdGVwX3RvX3N0cmluZyh1bnNpZ25lZCBpbnQgc3RlcCkgeworCisJdW5zaWduZWQgaW50IHMgPSBfX2lsb2cyKHN0ZXApOworCisJaWYgKCgxIDw8IHMpICE9IHN0ZXApCisJCXJldHVybiBzdGVwX3N0cmluZ190YmxbN107CisKKwlyZXR1cm4gc3RlcF9zdHJpbmdfdGJsW3NdOworfQorI2VuZGlmCisKK2ludCBzdGVwX2Fzc2lnbl9hZGRyZXNzZXMoZnNsX2Rkcl9pbmZvX3QgKnBpbmZvLAorCQkJICB1bnNpZ25lZCBpbnQgZGJ3X2NhcF9hZGpbXSwKKwkJCSAgdW5zaWduZWQgaW50ICptZW1jdGxfaW50ZXJsZWF2aW5nLAorCQkJICB1bnNpZ25lZCBpbnQgKnJhbmtfaW50ZXJsZWF2aW5nKQoreworCWludCBpLCBqOworCisJLyoKKwkgKiBJZiBhIHJlZHVjZWQgZGF0YSB3aWR0aCBpcyByZXF1ZXN0ZWQsIGJ1dCB0aGUgU1BECisJICogc3BlY2lmaWVzIGEgcGh5c2ljYWxseSB3aWRlciBkZXZpY2UsIGFkanVzdCB0aGUKKwkgKiBjb21wdXRlZCBkaW1tIGNhcGFjaXRpZXMgYWNjb3JkaW5nbHkgYmVmb3JlCisJICogYXNzaWduaW5nIGFkZHJlc3Nlcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX05VTV9ERFJfQ09OVFJPTExFUlM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgZm91bmQgPSAwOworCisJCXN3aXRjaCAocGluZm8tPm1lbWN0bF9vcHRzW2ldLmRhdGFfYnVzX3dpZHRoKSB7CisJCWNhc2UgMjoKKwkJCS8qIDE2LWJpdCAqLworCQkJcHJpbnRmKCJjYW4ndCBoYW5kbGUgMTYtYml0IG1vZGUgeWV0XG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCS8qIDMyLWJpdCAqLworCQkJZm9yIChqID0gMDsgaiA8IENPTkZJR19ESU1NX1NMT1RTX1BFUl9DVExSOyBqKyspIHsKKwkJCQl1bnNpZ25lZCBpbnQgZHc7CisJCQkJZHcgPSBwaW5mby0+ZGltbV9wYXJhbXNbaV1bal0uZGF0YV93aWR0aDsKKwkJCQlpZiAocGluZm8tPmRpbW1fcGFyYW1zW2ldW2pdLm5fcmFua3MKKwkJCQkgICAgJiYgKGR3ID09IDcyIHx8IGR3ID09IDY0KSkgeworCQkJCQkvKgorCQkJCQkgKiBGSVhNRTogY2FuJ3QgcmVhbGx5IGRvIGl0CisJCQkJCSAqIGxpa2UgdGhpcyBiZWNhdXNlIHRoaXMganVzdAorCQkJCQkgKiBmdXJ0aGVyIHJlZHVjZXMgdGhlIG1lbW9yeQorCQkJCQkgKi8KKwkJCQkJZm91bmQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoZm91bmQpIHsKKwkJCQlkYndfY2FwX2FkaltpXSA9IDE7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDA6CisJCQkvKiA2NC1iaXQgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGYoInVuZXhwZWN0ZWQgZGF0YSBidXMgd2lkdGggIgorCQkJCSJzcGVjaWZpZWQgY29udHJvbGxlciAldVxuIiwgaSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgaWYgYWxsIGNvbnRyb2xsZXJzIGFyZSBjb25maWd1cmVkIGZvciBtZW1vcnkKKwkgKiBjb250cm9sbGVyIGludGVybGVhdmluZy4KKwkgKi8KKwlqID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX05VTV9ERFJfQ09OVFJPTExFUlM7IGkrKykgeworCQlpZiAocGluZm8tPm1lbWN0bF9vcHRzW2ldLm1lbWN0bF9pbnRlcmxlYXZpbmcpIHsKKwkJCWorKzsKKwkJfQorCX0KKwlpZiAoaiA9PSAyKQorCQkqbWVtY3RsX2ludGVybGVhdmluZyA9IDE7CisKKwkvKiBDaGVjayB0aGF0IGFsbCBjb250cm9sbGVycyBhcmUgcmFuayBpbnRlcmxlYXZpbmcuICovCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IENPTkZJR19OVU1fRERSX0NPTlRST0xMRVJTOyBpKyspIHsKKwkJaWYgKHBpbmZvLT5tZW1jdGxfb3B0c1tpXS5iYV9pbnRsdl9jdGwpIHsKKwkJCWorKzsKKwkJfQorCX0KKwlpZiAoaiA9PSAyKQorCQkqcmFua19pbnRlcmxlYXZpbmcgPSAxOworCisJaWYgKCptZW1jdGxfaW50ZXJsZWF2aW5nKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyLCB0b3RhbF9tZW1fcGVyX2N0bHIgPSAwOworCQkvKgorCQkgKiBJZiBpbnRlcmxlYXZpbmcgYmV0d2VlbiBtZW1vcnkgY29udHJvbGxlcnMsCisJCSAqIG1ha2UgZWFjaCBjb250cm9sbGVyIHN0YXJ0IGF0IGEgYmFzZSBhZGRyZXNzCisJCSAqIG9mIDAuCisJCSAqCisJCSAqIEFsc28sIGlmIGJhbmsgaW50ZXJsZWF2aW5nIChjaGlwIHNlbGVjdAorCQkgKiBpbnRlcmxlYXZpbmcpIGlzIGVuYWJsZWQgb24gZWFjaCBtZW1vcnkKKwkJICogY29udHJvbGxlciwgQ1MwIG5lZWRzIHRvIGJlIHByb2dyYW1tZWQgdG8KKwkJICogY292ZXIgdGhlIGVudGlyZSBtZW1vcnkgcmFuZ2Ugb24gdGhhdCBtZW1vcnkKKwkJICogY29udHJvbGxlcgorCQkgKgorCQkgKiBCYW5rIGludGVybGVhdmluZyBhbHNvIGltcGxpZXMgdGhhdCBlYWNoCisJCSAqIGFkZHJlc3NlZCBjaGlwIHNlbGVjdCBpcyBpZGVudGljYWwgaW4gc2l6ZS4KKwkJICovCisKKwkJZm9yIChpID0gMDsgaSA8IENPTkZJR19OVU1fRERSX0NPTlRST0xMRVJTOyBpKyspIHsKKwkJCWFkZHIgPSAwOworCQkJcGluZm8tPmNvbW1vbl90aW1pbmdfcGFyYW1zW2ldLmJhc2VfYWRkcmVzcyA9IDB1bGw7CisJCQlmb3IgKGogPSAwOyBqIDwgQ09ORklHX0RJTU1fU0xPVFNfUEVSX0NUTFI7IGorKykgeworCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBjYXAKKwkJCQkJPSBwaW5mby0+ZGltbV9wYXJhbXNbaV1bal0uY2FwYWNpdHk7CisKKwkJCQlwaW5mby0+ZGltbV9wYXJhbXNbaV1bal0uYmFzZV9hZGRyZXNzID0gYWRkcjsKKwkJCQlhZGRyICs9IGNhcCA+PiBkYndfY2FwX2FkaltpXTsKKwkJCQl0b3RhbF9tZW1fcGVyX2N0bHIgKz0gY2FwID4+IGRid19jYXBfYWRqW2ldOworCQkJfQorCQl9CisJCXBpbmZvLT5jb21tb25fdGltaW5nX3BhcmFtc1swXS50b3RhbF9tZW0gPSB0b3RhbF9tZW1fcGVyX2N0bHI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2ltcGxlIGxpbmVhciBhc3NpZ25tZW50IGlmIG1lbW9yeQorCQkgKiBjb250cm9sbGVycyBhcmUgbm90IGludGVybGVhdmVkLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nIGN1cl9tZW1zaXplID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IENPTkZJR19OVU1fRERSX0NPTlRST0xMRVJTOyBpKyspIHsKKwkJCXU2NCB0b3RhbF9tZW1fcGVyX2N0bHIgPSAwOworCQkJcGluZm8tPmNvbW1vbl90aW1pbmdfcGFyYW1zW2ldLmJhc2VfYWRkcmVzcyA9CisJCQkJCQljdXJfbWVtc2l6ZTsKKwkJCWZvciAoaiA9IDA7IGogPCBDT05GSUdfRElNTV9TTE9UU19QRVJfQ1RMUjsgaisrKSB7CisJCQkJLyogQ29tcHV0ZSBESU1NIGJhc2UgYWRkcmVzc2VzLiAqLworCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBjYXAgPQorCQkJCQlwaW5mby0+ZGltbV9wYXJhbXNbaV1bal0uY2FwYWNpdHk7CisJCQkJcGluZm8tPmRpbW1fcGFyYW1zW2ldW2pdLmJhc2VfYWRkcmVzcyA9CisJCQkJCWN1cl9tZW1zaXplOworCQkJCWN1cl9tZW1zaXplICs9IGNhcCA+PiBkYndfY2FwX2FkaltpXTsKKwkJCQl0b3RhbF9tZW1fcGVyX2N0bHIgKz0gY2FwID4+IGRid19jYXBfYWRqW2ldOworCQkJfQorCQkJcGluZm8tPmNvbW1vbl90aW1pbmdfcGFyYW1zW2ldLnRvdGFsX21lbSA9CisJCQkJCQkJdG90YWxfbWVtX3Blcl9jdGxyOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZworZnNsX2Rkcl9jb21wdXRlKGZzbF9kZHJfaW5mb190ICpwaW5mbywgdW5zaWduZWQgaW50IHN0YXJ0X3N0ZXApCit7CisJdW5zaWduZWQgaW50IGksIGo7CisJdW5zaWduZWQgaW50IGFsbF9jb250cm9sbGVyc19tZW1jdGxfaW50ZXJsZWF2aW5nID0gMDsKKwl1bnNpZ25lZCBpbnQgYWxsX2NvbnRyb2xsZXJzX3JhbmtfaW50ZXJsZWF2aW5nID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfbWVtID0gMDsKKworCWZzbF9kZHJfY2ZnX3JlZ3NfdCAqZGRyX3JlZyA9IHBpbmZvLT5mc2xfZGRyX2NvbmZpZ19yZWc7CisJY29tbW9uX3RpbWluZ19wYXJhbXNfdCAqdGltaW5nX3BhcmFtcyA9IHBpbmZvLT5jb21tb25fdGltaW5nX3BhcmFtczsKKworCS8qIGRhdGEgYnVzIHdpZHRoIGNhcGFjaXR5IGFkanVzdCBzaGlmdCBhbW91bnQgKi8KKwl1bnNpZ25lZCBpbnQgZGJ3X2NhcGFjaXR5X2FkanVzdFtDT05GSUdfTlVNX0REUl9DT05UUk9MTEVSU107CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX05VTV9ERFJfQ09OVFJPTExFUlM7IGkrKykgeworCQlkYndfY2FwYWNpdHlfYWRqdXN0W2ldID0gMDsKKwl9CisKKwlkZWJ1Zygic3RhcnRpbmcgYXQgc3RlcCAldSAoJXMpXG4iLAorCSAgICAgIHN0YXJ0X3N0ZXAsIHN0ZXBfdG9fc3RyaW5nKHN0YXJ0X3N0ZXApKTsKKworCXN3aXRjaCAoc3RhcnRfc3RlcCkgeworCWNhc2UgU1RFUF9HRVRfU1BEOgorCQkvKiBTVEVQIDE6ICBHYXRoZXIgYWxsIERJTU0gU1BEIGRhdGEgKi8KKwkJZm9yIChpID0gMDsgaSA8IENPTkZJR19OVU1fRERSX0NPTlRST0xMRVJTOyBpKyspIHsKKwkJCWZzbF9kZHJfZ2V0X3NwZChwaW5mby0+c3BkX2luc3RhbGxlZF9kaW1tc1tpXSwgaSk7CisJCX0KKworCWNhc2UgU1RFUF9DT01QVVRFX0RJTU1fUEFSTVM6CisJCS8qIFNURVAgMjogIENvbXB1dGUgRElNTSBwYXJhbWV0ZXJzIGZyb20gU1BEIGRhdGEgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX05VTV9ERFJfQ09OVFJPTExFUlM7IGkrKykgeworCQkJZm9yIChqID0gMDsgaiA8IENPTkZJR19ESU1NX1NMT1RTX1BFUl9DVExSOyBqKyspIHsKKwkJCQl1bnNpZ25lZCBpbnQgcmV0dmFsOworCQkJCWdlbmVyaWNfc3BkX2VlcHJvbV90ICpzcGQgPQorCQkJCQkmKHBpbmZvLT5zcGRfaW5zdGFsbGVkX2RpbW1zW2ldW2pdKTsKKwkJCQlkaW1tX3BhcmFtc190ICpwZGltbSA9CisJCQkJCSYocGluZm8tPmRpbW1fcGFyYW1zW2ldW2pdKTsKKworCQkJCXJldHZhbCA9IGNvbXB1dGVfZGltbV9wYXJhbWV0ZXJzKHNwZCwgcGRpbW0sIGkpOworCQkJCWlmIChyZXR2YWwgPT0gMikgeworCQkJCQlwcmludGYoIkVycm9yOiBjb21wdXRlX2RpbW1fcGFyYW1ldGVycyIKKwkJCQkJIiBub24temVybyByZXR1cm5lZCBGQVRBTCB2YWx1ZSAiCisJCQkJCSJmb3IgbWVtY3RsPSV1IGRpbW09JXVcbiIsIGksIGopOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlkZWJ1ZygiV2FybmluZzogY29tcHV0ZV9kaW1tX3BhcmFtZXRlcnMiCisJCQkJCSIgbm9uLXplcm8gcmV0dXJuIHZhbHVlIGZvciBtZW1jdGw9JXUgIgorCQkJCQkiZGltbT0ldVxuIiwgaSwgaik7CisJCQkJfQorCQkJfQorCQl9CisKKwljYXNlIFNURVBfQ09NUFVURV9DT01NT05fUEFSTVM6CisJCS8qCisJCSAqIFNURVAgMzogQ29tcHV0ZSBhIGNvbW1vbiBzZXQgb2YgdGltaW5nIHBhcmFtZXRlcnMKKwkJICogc3VpdGFibGUgZm9yIGFsbCBvZiB0aGUgRElNTXMgb24gZWFjaCBtZW1vcnkgY29udHJvbGxlcgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IENPTkZJR19OVU1fRERSX0NPTlRST0xMRVJTOyBpKyspIHsKKwkJCWRlYnVnKCJDb21wdXRpbmcgbG93ZXN0IGNvbW1vbiBESU1NIgorCQkJCSIgcGFyYW1ldGVycyBmb3IgbWVtY3RsPSV1XG4iLCBpKTsKKwkJCWNvbXB1dGVfbG93ZXN0X2NvbW1vbl9kaW1tX3BhcmFtZXRlcnMoCisJCQkJcGluZm8tPmRpbW1fcGFyYW1zW2ldLAorCQkJCSZ0aW1pbmdfcGFyYW1zW2ldLAorCQkJCUNPTkZJR19ESU1NX1NMT1RTX1BFUl9DVExSKTsKKwkJfQorCisJY2FzZSBTVEVQX0dBVEhFUl9PUFRTOgorCQkvKiBTVEVQIDQ6ICBHYXRoZXIgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMgZnJvbSB1c2VyICovCisJCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfTlVNX0REUl9DT05UUk9MTEVSUzsgaSsrKSB7CisJCQlkZWJ1ZygiUmVsb2FkaW5nIG1lbW9yeSBjb250cm9sbGVyICIKKwkJCQkiY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBtZW1jdGw9JXVcbiIsIGkpOworCQkJLyoKKwkJCSAqIFRoaXMgInJlbG9hZHMiIHRoZSBtZW1vcnkgY29udHJvbGxlciBvcHRpb25zCisJCQkgKiB0byBkZWZhdWx0cy4gIElmIHRoZSB1c2VyICJlZGl0cyIgYW4gb3B0aW9uLAorCQkJICogbmV4dF9zdGVwIHBvaW50cyB0byB0aGUgc3RlcCBhZnRlciB0aGlzLAorCQkJICogd2hpY2ggaXMgY3VycmVudGx5IFNURVBfQVNTSUdOX0FERFJFU1NFUy4KKwkJCSAqLworCQkJcG9wdWxhdGVfbWVtY3RsX29wdGlvbnMoCisJCQkJCXRpbWluZ19wYXJhbXNbaV0uYWxsX0RJTU1zX3JlZ2lzdGVyZWQsCisJCQkJCSZwaW5mby0+bWVtY3RsX29wdHNbaV0sCisJCQkJCXBpbmZvLT5kaW1tX3BhcmFtc1tpXSwgaSk7CisJCX0KKworCWNhc2UgU1RFUF9BU1NJR05fQUREUkVTU0VTOgorCQkvKiBTVEVQIDU6ICBBc3NpZ24gYWRkcmVzc2VzIHRvIGNoaXAgc2VsZWN0cyAqLworCQlzdGVwX2Fzc2lnbl9hZGRyZXNzZXMocGluZm8sCisJCQkJZGJ3X2NhcGFjaXR5X2FkanVzdCwKKwkJCQkmYWxsX2NvbnRyb2xsZXJzX21lbWN0bF9pbnRlcmxlYXZpbmcsCisJCQkJJmFsbF9jb250cm9sbGVyc19yYW5rX2ludGVybGVhdmluZyk7CisKKwljYXNlIFNURVBfQ09NUFVURV9SRUdTOgorCQkvKiBTVEVQIDY6ICBjb21wdXRlIGNvbnRyb2xsZXIgcmVnaXN0ZXIgdmFsdWVzICovCisJCWRlYnVnKCJGU0wgTWVtb3J5IGN0cmwgY2cgcmVnaXN0ZXIgY29tcHV0YXRpb25cbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX05VTV9ERFJfQ09OVFJPTExFUlM7IGkrKykgeworCQkJaWYgKHRpbWluZ19wYXJhbXNbaV0ubmRpbW1zX3ByZXNlbnQgPT0gMCkgeworCQkJCW1lbXNldCgmZGRyX3JlZ1tpXSwgMCwKKwkJCQkJc2l6ZW9mKGZzbF9kZHJfY2ZnX3JlZ3NfdCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQljb21wdXRlX2ZzbF9tZW1jdGxfY29uZmlnX3JlZ3MoCisJCQkJCSZwaW5mby0+bWVtY3RsX29wdHNbaV0sCisJCQkJCSZkZHJfcmVnW2ldLCAmdGltaW5nX3BhcmFtc1tpXSwKKwkJCQkJcGluZm8tPmRpbW1fcGFyYW1zW2ldLAorCQkJCQlkYndfY2FwYWNpdHlfYWRqdXN0W2ldKTsKKwkJfQorCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogQ29tcHV0ZSB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeS4gKi8KKworCS8qCisJICogSWYgYmFuayBpbnRlcmxlYXZpbmcgYnV0IE5PVCBtZW1vcnkgY29udHJvbGxlciBpbnRlcmxlYXZpbmcKKwkgKiBDU19CTkRTIGRlc2NyaWJlIHRoZSBxdWFudGl0eSBvZiBtZW1vcnkgb24gZWFjaCBtZW1vcnkKKwkgKiBjb250cm9sbGVyLCBzbyB0aGUgdG90YWwgaXMgdGhlIHN1bSBhY3Jvc3MuCisJICovCisJaWYgKCFhbGxfY29udHJvbGxlcnNfbWVtY3RsX2ludGVybGVhdmluZworCSAgICAmJiBhbGxfY29udHJvbGxlcnNfcmFua19pbnRlcmxlYXZpbmcpIHsKKwkJdG90YWxfbWVtID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IENPTkZJR19OVU1fRERSX0NPTlRST0xMRVJTOyBpKyspIHsKKwkJCXRvdGFsX21lbSArPSB0aW1pbmdfcGFyYW1zW2ldLnRvdGFsX21lbTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyoKKwkJICogQ29tcHV0ZSB0aGUgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUganVzdCBieQorCQkgKiBsb29raW5nIGZvciB0aGUgaGlnaGVzdCB2YWxpZCBDU25fQk5EUyB2YWx1ZS4KKwkJICogVGhpcyBhbGxvd3MgdXMgdG8gYWxzbyBleHBlcmltZW50IHdpdGggdXNpbmcKKwkJICogb25seSBDUzAgd2hlbiB1c2luZyBkdWFsLXJhbmsgRElNTXMuCisJCSAqLworCQl1bnNpZ25lZCBpbnQgbWF4X2VuZCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IENPTkZJR19OVU1fRERSX0NPTlRST0xMRVJTOyBpKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCBDT05GSUdfQ0hJUF9TRUxFQ1RTX1BFUl9DVFJMOyBqKyspIHsKKwkJCQlmc2xfZGRyX2NmZ19yZWdzX3QgKnJlZyA9ICZkZHJfcmVnW2ldOworCQkJCWlmIChyZWctPmNzW2pdLmNvbmZpZyAmIDB4ODAwMDAwMDApIHsKKwkJCQkJdW5zaWduZWQgaW50IGVuZDsKKwkJCQkJZW5kID0gcmVnLT5jc1tqXS5ibmRzICYgMHhGRkY7CisJCQkJCWlmIChlbmQgPiBtYXhfZW5kKSB7CisJCQkJCQltYXhfZW5kID0gZW5kOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJdG90YWxfbWVtID0gMSArICgoKHVuc2lnbmVkIGxvbmcgbG9uZyltYXhfZW5kIDw8IDI0VUxMKQorCQkJCSAgICB8IDB4RkZGRkZGVUxMKTsKKwl9CisKKwlyZXR1cm4gdG90YWxfbWVtOworfQorCisvKgorICogZnNsX2Rkcl9zZHJhbSgpIC0tIHRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5CisgKglpbml0ZHJhbSgpIGluIHRoZSBib2FyZCBmaWxlLgorICoKKyAqIEl0IHJldHVybnMgYW1vdW50IG9mIG1lbW9yeSBjb25maWd1cmVkIGluIGJ5dGVzLgorICovCitwaHlzX3NpemVfdCBmc2xfZGRyX3NkcmFtKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IG1lbWN0bF9pbnRlcmxlYXZlZDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfbWVtb3J5OworCWZzbF9kZHJfaW5mb190IGluZm87CisKKwkvKiBSZXNldCBpbmZvIHN0cnVjdHVyZS4gKi8KKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihmc2xfZGRyX2luZm9fdCkpOworCisJLyogQ29tcHV0ZSBpdCBvbmNlIG5vcm1hbGx5LiAqLworCXRvdGFsX21lbW9yeSA9IGZzbF9kZHJfY29tcHV0ZSgmaW5mbywgU1RFUF9HRVRfU1BEKTsKKworCS8qIENoZWNrIGZvciBtZW1vcnkgY29udHJvbGxlciBpbnRlcmxlYXZpbmcuICovCisJbWVtY3RsX2ludGVybGVhdmVkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX05VTV9ERFJfQ09OVFJPTExFUlM7IGkrKykgeworCQltZW1jdGxfaW50ZXJsZWF2ZWQgKz0KKwkJCWluZm8ubWVtY3RsX29wdHNbaV0ubWVtY3RsX2ludGVybGVhdmluZzsKKwl9CisKKwlpZiAobWVtY3RsX2ludGVybGVhdmVkKSB7CisJCWlmIChtZW1jdGxfaW50ZXJsZWF2ZWQgPT0gQ09ORklHX05VTV9ERFJfQ09OVFJPTExFUlMpIHsKKwkJCWRlYnVnKCJtZW1jdGwgaW50ZXJsZWF2aW5nXG4iKTsKKwkJCS8qCisJCQkgKiBDaGFuZ2UgdGhlIG1lYW5pbmcgb2YgbWVtY3RsX2ludGVybGVhdmVkCisJCQkgKiB0byBiZSAiYm9vbGVhbiIuCisJCQkgKi8KKwkJCW1lbWN0bF9pbnRlcmxlYXZlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIldhcm5pbmc6IG1lbWN0bCBpbnRlcmxlYXZpbmcgbm90ICIKKwkJCQkicHJvcGVybHkgY29uZmlndXJlZCBvbiBhbGwgY29udHJvbGxlcnNcbiIpOworCQkJbWVtY3RsX2ludGVybGVhdmVkID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfTlVNX0REUl9DT05UUk9MTEVSUzsgaSsrKQorCQkJCWluZm8ubWVtY3RsX29wdHNbaV0ubWVtY3RsX2ludGVybGVhdmluZyA9IDA7CisJCQlkZWJ1ZygiUmVjb21wdXRpbmcgd2l0aCBtZW1jdGxfaW50ZXJsZWF2aW5nIG9mZi5cbiIpOworCQkJdG90YWxfbWVtb3J5ID0gZnNsX2Rkcl9jb21wdXRlKCZpbmZvLAorCQkJCQkJICAgICAgIFNURVBfQVNTSUdOX0FERFJFU1NFUyk7CisJCX0KKwl9CisKKwkvKiBQcm9ncmFtIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfTlVNX0REUl9DT05UUk9MTEVSUzsgaSsrKSB7CisJCWRlYnVnKCJQcm9ncmFtbWluZyBjb250cm9sbGVyICV1XG4iLCBpKTsKKwkJaWYgKGluZm8uY29tbW9uX3RpbWluZ19wYXJhbXNbaV0ubmRpbW1zX3ByZXNlbnQgPT0gMCkgeworCQkJZGVidWcoIk5vIGRpbW1zIHByZXNlbnQgb24gY29udHJvbGxlciAldTsgIgorCQkJCQkic2tpcHBpbmcgcHJvZ3JhbW1pbmdcbiIsIGkpOworCQkJY29udGludWU7CisJCX0KKworCQlmc2xfZGRyX3NldF9tZW1jdGxfcmVncygmKGluZm8uZnNsX2Rkcl9jb25maWdfcmVnW2ldKSwgaSk7CisJfQorCisJaWYgKG1lbWN0bF9pbnRlcmxlYXZlZCkgeworCQljb25zdCB1bnNpZ25lZCBpbnQgY3RybF9udW0gPSAwOworCisJCS8qIE9ubHkgc2V0IExBV0JBUjEgaWYgbWVtb3J5IGNvbnRyb2xsZXIgaW50ZXJsZWF2aW5nIGlzIG9uLiAqLworCQlmc2xfZGRyX3NldF9sYXdiYXIoJmluZm8uY29tbW9uX3RpbWluZ19wYXJhbXNbMF0sCisJCQkJCSBtZW1jdGxfaW50ZXJsZWF2ZWQsIGN0cmxfbnVtKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBNZW1vcnkgY29udHJvbGxlciBpbnRlcmxlYXZpbmcgaXMgTk9UIG9uOworCQkgKiBzZXQgZWFjaCBsYXdiYXIgaW5kaXZpZHVhbGx5LgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IENPTkZJR19OVU1fRERSX0NPTlRST0xMRVJTOyBpKyspIHsKKwkJCWZzbF9kZHJfc2V0X2xhd2JhcigmaW5mby5jb21tb25fdGltaW5nX3BhcmFtc1tpXSwKKwkJCQkJCSAwLCBpKTsKKwkJfQorCX0KKworCWRlYnVnKCJ0b3RhbF9tZW1vcnkgPSAlbGx1XG4iLCB0b3RhbF9tZW1vcnkpOworCisjaWYgIWRlZmluZWQoQ09ORklHX1BIWVNfNjRCSVQpCisJLyogQ2hlY2sgZm9yIDRHIG9yIG1vcmUuICBCYWQuICovCisJaWYgKHRvdGFsX21lbW9yeSA+PSAoMXVsbCA8PCAzMikpIHsKKwkJcHJpbnRmKCJEZXRlY3RlZCAlbGxkIE1CIG9mIG1lbW9yeVxuIiwgdG90YWxfbWVtb3J5ID4+IDIwKTsKKwkJcHJpbnRmKCJUaGlzIFUtQm9vdCBvbmx5IHN1cHBvcnRzIDwgNEcgb2YgRERSXG4iKTsKKwkJcHJpbnRmKCJZb3UgY291bGQgcmVidWlsZCBpdCB3aXRoIENPTkZJR19QSFlTXzY0QklUXG4iKTsKKwkJdG90YWxfbWVtb3J5ID0gQ09ORklHX01BWF9NRU1fTUFQUEVEOworCX0KKyNlbmRpZgorCisJcmV0dXJuIHRvdGFsX21lbW9yeTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvb3B0aW9ucy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci9vcHRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3MzFjOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvb3B0aW9ucy5jCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIDIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2Rkcl9zZHJhbS5oPgorCisjaW5jbHVkZSAiZGRyLmgiCisKKy8qIEJvYXJkLXNwZWNpZmljIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGVhY2ggYm9hcmQncyBkZHIuYyAqLworZXh0ZXJuIHZvaWQgZnNsX2Rkcl9ib2FyZF9vcHRpb25zKG1lbWN0bF9vcHRpb25zX3QgKnBvcHRzLAorCQlkaW1tX3BhcmFtc190ICpwZGltbSwKKwkJdW5zaWduZWQgaW50IGN0cmxfbnVtKTsKKwordW5zaWduZWQgaW50IHBvcHVsYXRlX21lbWN0bF9vcHRpb25zKGludCBhbGxfRElNTXNfcmVnaXN0ZXJlZCwKKwkJCW1lbWN0bF9vcHRpb25zX3QgKnBvcHRzLAorCQkJZGltbV9wYXJhbXNfdCAqcGRpbW0sCisJCQl1bnNpZ25lZCBpbnQgY3RybF9udW0pCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciAqcDsKKworCS8qIENoaXAgc2VsZWN0IG9wdGlvbnMuICovCisKKwkvKiBQaWNrIGNoaXAtc2VsZWN0IGxvY2FsIG9wdGlvbnMuICovCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19DSElQX1NFTEVDVFNfUEVSX0NUUkw7IGkrKykgeworCQkvKiBJZiBub3QgRERSMiwgb2R0X3JkX2NmZyBhbmQgb2R0X3dyX2NmZyBuZWVkIHRvIGJlIDAuICovCisKKwkJLyogb25seSBmb3Igc2luZ2xlIENTPyAqLworCQlwb3B0cy0+Y3NfbG9jYWxfb3B0c1tpXS5vZHRfcmRfY2ZnID0gMDsKKworCQlwb3B0cy0+Y3NfbG9jYWxfb3B0c1tpXS5vZHRfd3JfY2ZnID0gMTsKKwkJcG9wdHMtPmNzX2xvY2FsX29wdHNbaV0uYXV0b19wcmVjaGFyZ2UgPSAwOworCX0KKworCS8qIFBpY2sgaW50ZXJsZWF2aW5nIG1vZGUuICovCisKKwkvKgorCSAqIDAgPSBubyBpbnRlcmxlYXZpbmcKKwkgKiAxID0gaW50ZXJsZWF2aW5nIGJldHdlZW4gMiBjb250cm9sbGVycworCSAqLworCXBvcHRzLT5tZW1jdGxfaW50ZXJsZWF2aW5nID0gMDsKKworCS8qCisJICogMCA9IGNhY2hlbGluZQorCSAqIDEgPSBwYWdlCisJICogMiA9IChsb2dpY2FsKSBiYW5rCisJICogMyA9IHN1cGVyYmFuayAob25seSBpZiBDUyBpbnRlcmxlYXZpbmcgaXMgZW5hYmxlZCkKKwkgKi8KKwlwb3B0cy0+bWVtY3RsX2ludGVybGVhdmluZ19tb2RlID0gMDsKKworCS8qCisJICogMDogY2FjaGVsaW5lOiBiaXQgMzAgb2YgdGhlIDM2LWJpdCBwaHlzaWNhbCBhZGRyIHNlbGVjdHMgdGhlIG1lbWN0bAorCSAqIDE6IHBhZ2U6ICAgICAgYml0IHRvIHRoZSBsZWZ0IG9mIHRoZSBjb2x1bW4gYml0cyBzZWxlY3RzIHRoZSBtZW1jdGwKKwkgKiAyOiBiYW5rOiAgICAgIGJpdCB0byB0aGUgbGVmdCBvZiB0aGUgYmFuayBiaXRzIHNlbGVjdHMgdGhlIG1lbWN0bAorCSAqIDM6IHN1cGVyYmFuazogYml0IHRvIHRoZSBsZWZ0IG9mIHRoZSBjaGlwIHNlbGVjdCBzZWxlY3RzIHRoZSBtZW1jdGwKKwkgKgorCSAqIE5PVEU6IGJhX2ludGx2IChyYW5rIGludGVybGVhdmluZykgaXMgaW5kZXBlbmRlbnQgb2YgbWVtb3J5CisJICogY29udHJvbGxlciBpbnRlcmxlYXZpbmc7IGl0IGlzIG9ubHkgd2l0aGluIGEgbWVtb3J5IGNvbnRyb2xsZXIuCisJICogTXVzdCB1c2Ugc3VwZXJiYW5rIGludGVybGVhdmluZyBpZiByYW5rIGludGVybGVhdmluZyBpcyB1c2VkIGFuZAorCSAqIG1lbW9yeSBjb250cm9sbGVyIGludGVybGVhdmluZyBpcyBlbmFibGVkLgorCSAqLworCisJLyoKKwkgKiAwID0gbm8KKwkgKiAweDQwID0gQ1MwLENTMQorCSAqIDB4MjAgPSBDUzIsQ1MzCisJICogMHg2MCA9IENTMCxDUzEgKyBDUzIsQ1MzCisJICogMHgwNCA9IENTMCxDUzEsQ1MyLENTMworCSAqLworCXBvcHRzLT5iYV9pbnRsdl9jdGwgPSAwOworCisJLyogTWVtb3J5IE9yZ2FuaXphdGlvbiBQYXJhbWV0ZXJzICovCisJcG9wdHMtPnJlZ2lzdGVyZWRfZGltbV9lbiA9IGFsbF9ESU1Nc19yZWdpc3RlcmVkOworCisJLyogT3BlcmF0aW9uYWwgTW9kZSBQYXJhbXRlcnMgKi8KKworCS8qIFBpY2sgRUNDIG1vZGVzICovCisjaWZkZWYgQ09ORklHX0REUl9FQ0MKKwlwb3B0cy0+RUNDX21vZGUgPSAxOwkJICAvKiAwID0gZGlzYWJsZWQsIDEgPSBlbmFibGVkICovCisjZWxzZQorCXBvcHRzLT5FQ0NfbW9kZSA9IDA7CQkgIC8qIDAgPSBkaXNhYmxlZCwgMSA9IGVuYWJsZWQgKi8KKyNlbmRpZgorCXBvcHRzLT5FQ0NfaW5pdF91c2luZ19tZW1jdGwgPSAxOyAvKiAwID0gdXNlIERNQSwgMSA9IHVzZSBtZW1jdGwgKi8KKworCS8qCisJICogQ2hvb3NlIERRUyBjb25maWcKKwkgKiAwIGZvciBERFIxCisJICogMSBmb3IgRERSMgorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIxKQorCXBvcHRzLT5EUVNfY29uZmlnID0gMDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIyKSB8fCBkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKwlwb3B0cy0+RFFTX2NvbmZpZyA9IDE7CisjZW5kaWYKKworCS8qIENob29zZSBzZWxmLXJlZnJlc2ggZHVyaW5nIHNsZWVwLiAqLworCXBvcHRzLT5zZWxmX3JlZnJlc2hfaW5fc2xlZXAgPSAxOworCisJLyogQ2hvb3NlIGR5bmFtaWMgcG93ZXIgbWFuYWdlbWVudCBtb2RlLiAqLworCXBvcHRzLT5keW5hbWljX3Bvd2VyID0gMDsKKworCS8qIDAgPSA2NC1iaXQsIDEgPSAzMi1iaXQsIDIgPSAxNi1iaXQgKi8KKwlwb3B0cy0+ZGF0YV9idXNfd2lkdGggPSAwOworCisJLyogQ2hvb3NlIGJ1cnN0IGxlbmd0aC4gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKyNpZiBkZWZpbmVkKENPTkZJR19FNTAwTUMpCisJcG9wdHMtPk9URl9idXJzdF9jaG9wX2VuID0gMDsJLyogb24tdGhlLWZseSBidXJzdCBjaG9wIGRpc2FibGUgKi8KKwlwb3B0cy0+YnVyc3RfbGVuZ3RoID0gRERSX0JMODsJLyogRml4ZWQgOC1iZWF0IGJ1cnN0IGxlbiAqLworI2Vsc2UKKwlwb3B0cy0+T1RGX2J1cnN0X2Nob3BfZW4gPSAxOwkvKiBvbi10aGUtZmx5IGJ1cnN0IGNob3AgKi8KKwlwb3B0cy0+YnVyc3RfbGVuZ3RoID0gRERSX09URjsJLyogb24tdGhlLWZseSBCQzQgYW5kIEJMOCAqLworI2VuZGlmCisjZWxzZQorCXBvcHRzLT5idXJzdF9sZW5ndGggPSBERFJfQkw0OwkvKiBoYXMgdG8gYmUgNCBmb3IgRERSMiAqLworI2VuZGlmCisKKwkvKiBDaG9vc2UgZGRyIGNvbnRyb2xsZXIgYWRkcmVzcyBtaXJyb3IgbW9kZSAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIzKQorCXBvcHRzLT5taXJyb3JlZF9kaW1tID0gcGRpbW1bMF0ubWlycm9yZWRfZGltbTsKKyNlbmRpZgorCisJLyogR2xvYmFsIFRpbWluZyBQYXJhbWV0ZXJzLiAqLworCWRlYnVnKCJtY2xrX3BzID0gJXUgcHNcbiIsIGdldF9tZW1vcnlfY2xrX3BlcmlvZF9wcygpKTsKKworCS8qIFBpY2sgYSBjYXNsYXQgb3ZlcnJpZGUuICovCisJcG9wdHMtPmNhc19sYXRlbmN5X292ZXJyaWRlID0gMDsKKwlwb3B0cy0+Y2FzX2xhdGVuY3lfb3ZlcnJpZGVfdmFsdWUgPSAzOworCWlmIChwb3B0cy0+Y2FzX2xhdGVuY3lfb3ZlcnJpZGUpIHsKKwkJZGVidWcoInVzaW5nIGNhc2xhdCBvdmVycmlkZSB2YWx1ZSA9ICV1XG4iLAorCQkgICAgICAgcG9wdHMtPmNhc19sYXRlbmN5X292ZXJyaWRlX3ZhbHVlKTsKKwl9CisKKwkvKiBEZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIGNvbXB1dGVkIGRlcmF0ZWQgbGF0ZW5jeSAqLworCXBvcHRzLT51c2VfZGVyYXRlZF9jYXNsYXQgPSAwOworCisJLyogQ2hvb3NlIGFuIGFkZGl0aXZlIGxhdGVuY3kuICovCisJcG9wdHMtPmFkZGl0aXZlX2xhdGVuY3lfb3ZlcnJpZGUgPSAwOworCXBvcHRzLT5hZGRpdGl2ZV9sYXRlbmN5X292ZXJyaWRlX3ZhbHVlID0gMzsKKwlpZiAocG9wdHMtPmFkZGl0aXZlX2xhdGVuY3lfb3ZlcnJpZGUpIHsKKwkJZGVidWcoInVzaW5nIGFkZGl0aXZlIGxhdGVuY3kgb3ZlcnJpZGUgdmFsdWUgPSAldVxuIiwKKwkJICAgICAgIHBvcHRzLT5hZGRpdGl2ZV9sYXRlbmN5X292ZXJyaWRlX3ZhbHVlKTsKKwl9CisKKwkvKgorCSAqIDJUX0VOIHNldHRpbmcKKwkgKgorCSAqIEZhY3RvcnMgdG8gY29uc2lkZXIgZm9yIDJUX0VOOgorCSAqCS0gbnVtYmVyIG9mIERJTU1zIGluc3RhbGxlZAorCSAqCS0gbnVtYmVyIG9mIGNvbXBvbmVudHMsIG51bWJlciBvZiBhY3RpdmUgcmFua3MKKwkgKgktIGhvdyBtdWNoIHRpbWUgeW91IHdhbnQgdG8gc3BlbmQgcGxheWluZyBhcm91bmQKKwkgKi8KKwlwb3B0cy0+dHdvVF9lbiA9IDA7CisJcG9wdHMtPnRocmVlVF9lbiA9IDA7CisKKwkvKgorCSAqIEJTVFRPUFJFIHByZWNoYXJnZSBpbnRlcnZhbAorCSAqCisJICogU2V0IHRoaXMgdG8gMCBmb3IgZ2xvYmFsIGF1dG8gcHJlY2hhcmdlCisJICoKKwkgKiBGSVhNRTogU2hvdWxkIHRoaXMgYmUgY29uZmlndXJlZCBpbiBwaWNvc2Vjb25kcz8KKwkgKiBXaHkgaXQgc2hvdWxkIGJlIGluIHBzOiAgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgdGhpcworCSAqIHJlbGF0aXZlIHRvIGFjdHVhbCBEUkFNIHRpbWluZyBwYXJhbWV0ZXJzIHN1Y2ggYXMgdFJBUy4KKwkgKiBlLmcuIHRSQVMobWluKSA9IDQwIG5zCisJICovCisJcG9wdHMtPmJzdG9wcmUgPSAweDEwMDsKKworCS8qIE1pbmltdW0gQ0tFIHB1bHNlIHdpZHRoIC0tIHRDS0UoTUlOKSAqLworCXBvcHRzLT50Q0tFX2Nsb2NrX3B1bHNlX3dpZHRoX3BzCisJCT0gbWNsa190b19waWNvcyhGU0xfRERSX01JTl9UQ0tFX1BVTFNFX1dJRFRIX0REUik7CisKKwkvKgorCSAqIFdpbmRvdyBmb3IgZm91ciBhY3RpdmF0ZXMgLS0gdEZBVworCSAqCisJICogRklYTUU6IFVNOiBhcHBsaWVzIG9ubHkgdG8gRERSMi9ERFIzIHdpdGggZWlnaHQgbG9naWNhbCBiYW5rcyBvbmx5CisJICogRklYTUU6IHZhcmllcyBkZXBlbmRpbmcgdXBvbiBudW1iZXIgb2YgY29sdW1uIGFkZHJlc3NlcyBvciBkYXRhCisJICogRklYTUU6IHdpZHRoLCB3YXMgY29uc2lkZXJpbmcgbG9va2luZyBhdCBwZGltbS0+cHJpbWFyeV9zZHJhbV93aWR0aAorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIxKQorCXBvcHRzLT50RkFXX3dpbmRvd19mb3VyX2FjdGl2YXRlc19wcyA9IG1jbGtfdG9fcGljb3MoMSk7CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0ZTTF9ERFIyKQorCS8qCisJICogeDQveDg7ICBzb21lIGRhdGFzaGVldHMgaGF2ZSAzNTAwMAorCSAqIHgxNiB3aWRlIGNvbHVtbnMgb25seT8gIFVzZSA1MDAwMD8KKwkgKi8KKwlwb3B0cy0+dEZBV193aW5kb3dfZm91cl9hY3RpdmF0ZXNfcHMgPSAzNzUwMDsKKworI2VsaWYgZGVmaW5lZChDT05GSUdfRlNMX0REUjMpCisJcG9wdHMtPnRGQVdfd2luZG93X2ZvdXJfYWN0aXZhdGVzX3BzID0gcGRpbW1bMF0udEZBV19wczsKKyNlbmRpZgorCXBvcHRzLT56cV9lbiA9IDA7CisJcG9wdHMtPndybHZsX2VuID0gMDsKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRERSMykKKwkvKgorCSAqIGR1ZSB0byBkZHIzIGRpbW0gaXMgZmx5LWJ5IHRvcG9sb2d5CisJICogd2Ugc3VnZ2VzdCB0byBlbmFibGUgd3JpdGUgbGV2ZWxpbmcgdG8KKwkgKiBtZWV0IHRoZSB0UURTUyB1bmRlciBkaWZmZXJlbnQgbG9hZGluZy4KKwkgKi8KKwlwb3B0cy0+d3JsdmxfZW4gPSAxOworCXBvcHRzLT53cmx2bF9vdmVycmlkZSA9IDA7CisjZW5kaWYKKworCS8qCisJICogQ2hlY2sgaW50ZXJsZWF2aW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBlbnZpcm9ubWVudC4KKwkgKiBQbGVhc2UgcmVmZXIgdG8gZG9jL1JFQURNRS5mc2wtZGRyIGZvciB0aGUgZGV0YWlsLgorCSAqCisJICogSWYgbWVtb3J5IGNvbnRyb2xsZXIgaW50ZXJsZWF2aW5nIGlzIGVuYWJsZWQsIHRoZW4gdGhlIGRhdGEKKwkgKiBidXMgd2lkdGhzIG11c3QgYmUgcHJvZ3JhbW1lZCBpZGVudGljYWxseSBmb3IgdGhlIDIgbWVtb3J5CisJICogY29udHJvbGxlcnMuCisJICoKKwkgKiBYWFg6IEF0dGVtcHQgdG8gc2V0IGJvdGggY29udHJvbGxlcnMgdG8gdGhlIHNhbWUgY2hpcCBzZWxlY3QKKwkgKiBpbnRlcmxlYXZpbmcgbW9kZS4gSXQgd2lsbCBkbyBhIGJlc3QgZWZmb3J0IHRvIGdldCB0aGUKKwkgKiByZXF1ZXN0ZWQgcmFua3MgaW50ZXJsZWF2ZWQgdG9nZXRoZXIgc3VjaCB0aGF0IHRoZSByZXN1bHQKKwkgKiBzaG91bGQgYmUgYSBzdWJzZXQgb2YgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLgorCSAqLworI2lmIChDT05GSUdfTlVNX0REUl9DT05UUk9MTEVSUyA+IDEpCisJaWYgKChwID0gZ2V0ZW52KCJtZW1jdGxfaW50bHZfY3RsIikpICE9IE5VTEwpIHsKKwkJaWYgKHBkaW1tWzBdLm5fcmFua3MgPT0gMCkgeworCQkJcHJpbnRmKCJUaGVyZSBpcyBubyByYW5rIG9uIENTMC4gQmVjYXVzZSBvbmx5IHJhbmsgb24gIgorCQkJCSJDUzAgYW5kIHJhbmtzIGNoaXAtc2VsZWN0IGludGVybGVhdmVkIHdpdGggQ1MwIgorCQkJCSIgYXJlIGNvbnRyb2xsZXIgaW50ZXJsZWF2ZWQsIGZvcmNlIG5vbiBtZW1vcnkgIgorCQkJCSJjb250cm9sbGVyIGludGVybGVhdmluZ1xuIik7CisJCQlwb3B0cy0+bWVtY3RsX2ludGVybGVhdmluZyA9IDA7CisJCX0gZWxzZSB7CisJCQlwb3B0cy0+bWVtY3RsX2ludGVybGVhdmluZyA9IDE7CisJCQlpZiAoc3RyY21wKHAsICJjYWNoZWxpbmUiKSA9PSAwKQorCQkJCXBvcHRzLT5tZW1jdGxfaW50ZXJsZWF2aW5nX21vZGUgPQorCQkJCQlGU0xfRERSX0NBQ0hFX0xJTkVfSU5URVJMRUFWSU5HOworCQkJZWxzZSBpZiAoc3RyY21wKHAsICJwYWdlIikgPT0gMCkKKwkJCQlwb3B0cy0+bWVtY3RsX2ludGVybGVhdmluZ19tb2RlID0KKwkJCQkJRlNMX0REUl9QQUdFX0lOVEVSTEVBVklORzsKKwkJCWVsc2UgaWYgKHN0cmNtcChwLCAiYmFuayIpID09IDApCisJCQkJcG9wdHMtPm1lbWN0bF9pbnRlcmxlYXZpbmdfbW9kZSA9CisJCQkJCUZTTF9ERFJfQkFOS19JTlRFUkxFQVZJTkc7CisJCQllbHNlIGlmIChzdHJjbXAocCwgInN1cGVyYmFuayIpID09IDApCisJCQkJcG9wdHMtPm1lbWN0bF9pbnRlcmxlYXZpbmdfbW9kZSA9CisJCQkJCUZTTF9ERFJfU1VQRVJCQU5LX0lOVEVSTEVBVklORzsKKwkJCWVsc2UKKwkJCQlwb3B0cy0+bWVtY3RsX2ludGVybGVhdmluZ19tb2RlID0KKwkJCQkJCXNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDApOworCQl9CisJfQorI2VuZGlmCisKKwlpZiggKChwID0gZ2V0ZW52KCJiYV9pbnRsdl9jdGwiKSkgIT0gTlVMTCkgJiYKKwkJKENPTkZJR19DSElQX1NFTEVDVFNfUEVSX0NUUkwgPiAxKSkgeworCQlpZiAoc3RyY21wKHAsICJjczBfY3MxIikgPT0gMCkKKwkJCXBvcHRzLT5iYV9pbnRsdl9jdGwgPSBGU0xfRERSX0NTMF9DUzE7CisJCWVsc2UgaWYgKHN0cmNtcChwLCAiY3MyX2NzMyIpID09IDApCisJCQlwb3B0cy0+YmFfaW50bHZfY3RsID0gRlNMX0REUl9DUzJfQ1MzOworCQllbHNlIGlmIChzdHJjbXAocCwgImNzMF9jczFfYW5kX2NzMl9jczMiKSA9PSAwKQorCQkJcG9wdHMtPmJhX2ludGx2X2N0bCA9IEZTTF9ERFJfQ1MwX0NTMV9BTkRfQ1MyX0NTMzsKKwkJZWxzZSBpZiAoc3RyY21wKHAsICJjczBfY3MxX2NzMl9jczMiKSA9PSAwKQorCQkJcG9wdHMtPmJhX2ludGx2X2N0bCA9IEZTTF9ERFJfQ1MwX0NTMV9DUzJfQ1MzOworCQllbHNlCisJCQlwb3B0cy0+YmFfaW50bHZfY3RsID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMCk7CisKKwkJc3dpdGNoIChwb3B0cy0+YmFfaW50bHZfY3RsICYgRlNMX0REUl9DUzBfQ1MxX0NTMl9DUzMpIHsKKwkJY2FzZSBGU0xfRERSX0NTMF9DUzFfQ1MyX0NTMzoKKwkJY2FzZSBGU0xfRERSX0NTMF9DUzE6CisJCQlpZiAocGRpbW1bMF0ubl9yYW5rcyAhPSAyKSB7CisJCQkJcG9wdHMtPmJhX2ludGx2X2N0bCA9IDA7CisJCQkJcHJpbnRmKCJOb3QgZW5vdWdoIGJhbmsoY2hpcC1zZWxlY3QpIGZvciAiCisJCQkJCSJDUzArQ1MxLCBmb3JjZSBub24taW50ZXJsZWF2aW5nIVxuIik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBGU0xfRERSX0NTMl9DUzM6CisJCQlpZiAocGRpbW1bMV0ubl9yYW5rcyAhPTIpeworCQkJCXBvcHRzLT5iYV9pbnRsdl9jdGwgPSAwOworCQkJCXByaW50ZigiTm90IGVub3VnaCBiYW5rKENTKSBmb3IgQ1MyK0NTMywgIgorCQkJCQkiZm9yY2Ugbm9uLWludGVybGVhdmluZyFcbiIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRlNMX0REUl9DUzBfQ1MxX0FORF9DUzJfQ1MzOgorCQkJaWYgKChwZGltbVswXS5uX3JhbmtzICE9IDIpfHwocGRpbW1bMV0ubl9yYW5rcyAhPSAyKSkgeworCQkJCXBvcHRzLT5iYV9pbnRsdl9jdGwgPSAwOworCQkJCXByaW50ZigiTm90IGVub3VnaCBiYW5rKENTKSBmb3IgQ1MwK0NTMSBvciAiCisJCQkJCSJDUzIrQ1MzLCBmb3JjZSBub24taW50ZXJsZWF2aW5nIVxuIik7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBvcHRzLT5iYV9pbnRsdl9jdGwgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmc2xfZGRyX2JvYXJkX29wdGlvbnMocG9wdHMsIHBkaW1tLCBjdHJsX251bSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvdXRpbC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L2Rkci91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyZDkyMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9kZHIvdXRpbC5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2xhdy5oPgorCisjaW5jbHVkZSAiZGRyLmgiCisKK3Vuc2lnbmVkIGludCBmc2xfZGRyX2dldF9tZW1fZGF0YV9yYXRlKHZvaWQpOworCisvKgorICogUm91bmQgbWNsa19wcyB0byBuZWFyZXN0IDEwIHBzIGluIG1lbW9yeSBjb250cm9sbGVyIGNvZGUuCisgKgorICogSWYgYW4gaW1wcmVjaXNlIGRhdGEgcmF0ZSBpcyB0b28gaGlnaCBkdWUgdG8gcm91bmRpbmcgZXJyb3IKKyAqIHByb3BhZ2F0aW9uLCBjb21wdXRlIGEgc3VpdGFibHkgcm91bmRlZCBtY2xrX3BzIHRvIGNvbXB1dGUKKyAqIGEgd29ya2luZyBtZW1vcnkgY29udHJvbGxlciBjb25maWd1cmF0aW9uLgorICovCit1bnNpZ25lZCBpbnQgZ2V0X21lbW9yeV9jbGtfcGVyaW9kX3BzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG1jbGtfcHM7CisKKwltY2xrX3BzID0gMjAwMDAwMDAwMDAwMFVMTCAvIGZzbF9kZHJfZ2V0X21lbV9kYXRhX3JhdGUoKTsKKwkvKiByb3VuZCB0byBuZWFyZXN0IDEwIHBzICovCisJcmV0dXJuIDEwICogKChtY2xrX3BzICsgNSkgLyAxMCk7Cit9CisKKy8qIENvbnZlcnQgcGljb3NlY29uZHMgaW50byBEUkFNIGNsb2NrIGN5Y2xlcyAocm91bmRpbmcgdXAgaWYgbmVlZGVkKS4gKi8KK3Vuc2lnbmVkIGludCBwaWNvc190b19tY2xrKHVuc2lnbmVkIGludCBwaWNvcykKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgVUxMXzJlMTIgPSAyMDAwMDAwMDAwMDAwVUxMOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBVTExfOEZzID0gMHhGRkZGRkZGRlVMTDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2xrczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2xrc190ZW1wOworCisJaWYgKCFwaWNvcykKKwkJcmV0dXJuIDA7CisKKwljbGtzID0gZnNsX2Rkcl9nZXRfbWVtX2RhdGFfcmF0ZSgpICogKHVuc2lnbmVkIGxvbmcgbG9uZykgcGljb3M7CisJY2xrc190ZW1wID0gY2xrczsKKwljbGtzID0gY2xrcyAvIFVMTF8yZTEyOworCWlmIChjbGtzX3RlbXAgJSBVTExfMmUxMikgeworCQljbGtzKys7CisJfQorCisJaWYgKGNsa3MgPiBVTExfOEZzKSB7CisJCWNsa3MgPSBVTExfOEZzOworCX0KKworCXJldHVybiAodW5zaWduZWQgaW50KSBjbGtzOworfQorCit1bnNpZ25lZCBpbnQgbWNsa190b19waWNvcyh1bnNpZ25lZCBpbnQgbWNsaykKK3sKKwlyZXR1cm4gZ2V0X21lbW9yeV9jbGtfcGVyaW9kX3BzKCkgKiBtY2xrOworfQorCit2b2lkCitfX2ZzbF9kZHJfc2V0X2xhd2Jhcihjb25zdCBjb21tb25fdGltaW5nX3BhcmFtc190ICptZW1jdGxfY29tbW9uX3BhcmFtcywKKwkJCSAgIHVuc2lnbmVkIGludCBtZW1jdGxfaW50ZXJsZWF2ZWQsCisJCQkgICB1bnNpZ25lZCBpbnQgY3RybF9udW0pCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGJhc2UgPSBtZW1jdGxfY29tbW9uX3BhcmFtcy0+YmFzZV9hZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplID0gbWVtY3RsX2NvbW1vbl9wYXJhbXMtPnRvdGFsX21lbTsKKworCS8qCisJICogSWYgbm8gRElNTXMgb24gdGhpcyBjb250cm9sbGVyLCBkbyBub3QgcHJvY2VlZCBhbnkgZnVydGhlci4KKwkgKi8KKwlpZiAoIW1lbWN0bF9jb21tb25fcGFyYW1zLT5uZGltbXNfcHJlc2VudCkgeworCQlyZXR1cm47CisJfQorCisjaWYgIWRlZmluZWQoQ09ORklHX1BIWVNfNjRCSVQpCisJaWYgKGJhc2UgPj0gQ09ORklHX01BWF9NRU1fTUFQUEVEKQorCQlyZXR1cm47CisJaWYgKChiYXNlICsgc2l6ZSkgPj0gQ09ORklHX01BWF9NRU1fTUFQUEVEKQorCQlzaXplID0gQ09ORklHX01BWF9NRU1fTUFQUEVEIC0gYmFzZTsKKyNlbmRpZgorCisJaWYgKGN0cmxfbnVtID09IDApIHsKKwkJLyoKKwkJICogU2V0IHVwIExBVyBmb3IgRERSIGNvbnRyb2xsZXIgMSBzcGFjZS4KKwkJICovCisJCXVuc2lnbmVkIGludCBsYXdiYXIxX3RhcmdldF9pZCA9IG1lbWN0bF9pbnRlcmxlYXZlZAorCQkJPyBMQVdfVFJHVF9JRl9ERFJfSU5UUkxWIDogTEFXX1RSR1RfSUZfRERSXzE7CisKKwkJaWYgKHNldF9kZHJfbGF3cyhiYXNlLCBzaXplLCBsYXdiYXIxX3RhcmdldF9pZCkgPCAwKSB7CisJCQlwcmludGYoIiVzOiBFUlJPUiAoY3RybCAjMCwgaW50cmx2PSVkKVxuIiwgX19mdW5jX18sCisJCQkJbWVtY3RsX2ludGVybGVhdmVkKTsKKwkJCXJldHVybiA7CisJCX0KKwl9IGVsc2UgaWYgKGN0cmxfbnVtID09IDEpIHsKKwkJaWYgKHNldF9kZHJfbGF3cyhiYXNlLCBzaXplLCBMQVdfVFJHVF9JRl9ERFJfMikgPCAwKSB7CisJCQlwcmludGYoIiVzOiBFUlJPUiAoY3RybCAjMSlcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiA7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoIiVzOiB1bmV4cGVjdGVkIEREUiBjb250cm9sbGVyIG51bWJlciAoJXUpXG4iLCBfX2Z1bmNfXywKKwkJCWN0cmxfbnVtKTsKKwl9Cit9CisKK19fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2ZzbF9kZHJfc2V0X2xhd2JhciIpKSkgdm9pZAorZnNsX2Rkcl9zZXRfbGF3YmFyKGNvbnN0IGNvbW1vbl90aW1pbmdfcGFyYW1zX3QgKm1lbWN0bF9jb21tb25fcGFyYW1zLAorCQkJIHVuc2lnbmVkIGludCBtZW1jdGxfaW50ZXJsZWF2ZWQsCisJCQkgdW5zaWduZWQgaW50IGN0cmxfbnVtKTsKKwordm9pZCBib2FyZF9hZGRfcmFtX2luZm8oaW50IHVzZV9kZWZhdWx0KQoreworI2lmIGRlZmluZWQoQ09ORklHX01QQzg1eHgpCisJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyID0gKHZvaWQgKikoQ09ORklHX1NZU19NUEM4NXh4X0REUl9BRERSKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg2eHgpCisJdm9sYXRpbGUgY2Nzcl9kZHJfdCAqZGRyID0gKHZvaWQgKikoQ09ORklHX1NZU19NUEM4Nnh4X0REUl9BRERSKTsKKyNlbmRpZgorI2lmIChDT05GSUdfTlVNX0REUl9DT05UUk9MTEVSUyA+IDEpCisJdWludDMyX3QgY3MwX2NvbmZpZyA9IGluX2JlMzIoJmRkci0+Y3MwX2NvbmZpZyk7CisjZW5kaWYKKwl1aW50MzJfdCBzZHJhbV9jZmcgPSBpbl9iZTMyKCZkZHItPnNkcmFtX2NmZyk7CisJaW50IGNhc19sYXQ7CisKKwlwdXRzKCIgKEREUiIpOworCXN3aXRjaCAoKHNkcmFtX2NmZyAmIFNEUkFNX0NGR19TRFJBTV9UWVBFX01BU0spID4+CisJCVNEUkFNX0NGR19TRFJBTV9UWVBFX1NISUZUKSB7CisJY2FzZSBTRFJBTV9UWVBFX0REUjE6CisJCXB1dHMoIjEiKTsKKwkJYnJlYWs7CisJY2FzZSBTRFJBTV9UWVBFX0REUjI6CisJCXB1dHMoIjIiKTsKKwkJYnJlYWs7CisJY2FzZSBTRFJBTV9UWVBFX0REUjM6CisJCXB1dHMoIjMiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHV0cygiPyIpOworCQlicmVhazsKKwl9CisKKwlpZiAoc2RyYW1fY2ZnICYgU0RSQU1fQ0ZHXzMyX0JFKQorCQlwdXRzKCIsIDMyLWJpdCIpOworCWVsc2UKKwkJcHV0cygiLCA2NC1iaXQiKTsKKworCS8qIENhbGN1bGF0ZSBDQVMgbGF0ZW5jeSBiYXNlZCBvbiB0aW1pbmcgY2ZnIHZhbHVlcyAqLworCWNhc19sYXQgPSAoKGluX2JlMzIoJmRkci0+dGltaW5nX2NmZ18xKSA+PiAxNikgJiAweGYpICsgMTsKKwlpZiAoKGluX2JlMzIoJmRkci0+dGltaW5nX2NmZ18zKSA+PiAxMikgJiAxKQorCQljYXNfbGF0ICs9ICg4IDw8IDEpOworCXByaW50ZigiLCBDTD0lZCIsIGNhc19sYXQgPj4gMSk7CisJaWYgKGNhc19sYXQgJiAweDEpCisJCXB1dHMoIi41Iik7CisKKwlpZiAoc2RyYW1fY2ZnICYgU0RSQU1fQ0ZHX0VDQ19FTikKKwkJcHV0cygiLCBFQ0Mgb24pIik7CisJZWxzZQorCQlwdXRzKCIsIEVDQyBvZmYpIik7CisKKyNpZiAoQ09ORklHX05VTV9ERFJfQ09OVFJPTExFUlMgPiAxKQorCWlmIChjczBfY29uZmlnICYgMHgyMDAwMDAwMCkgeworCQlwdXRzKCJcbiIpOworCQlwdXRzKCIgICAgICAgRERSIENvbnRyb2xsZXIgSW50ZXJsZWF2aW5nIE1vZGU6ICIpOworCisJCXN3aXRjaCAoKGNzMF9jb25maWcgPj4gMjQpICYgMHhmKSB7CisJCWNhc2UgRlNMX0REUl9DQUNIRV9MSU5FX0lOVEVSTEVBVklORzoKKwkJCXB1dHMoImNhY2hlIGxpbmUiKTsKKwkJCWJyZWFrOworCQljYXNlIEZTTF9ERFJfUEFHRV9JTlRFUkxFQVZJTkc6CisJCQlwdXRzKCJwYWdlIik7CisJCQlicmVhazsKKwkJY2FzZSBGU0xfRERSX0JBTktfSU5URVJMRUFWSU5HOgorCQkJcHV0cygiYmFuayIpOworCQkJYnJlYWs7CisJCWNhc2UgRlNMX0REUl9TVVBFUkJBTktfSU5URVJMRUFWSU5HOgorCQkJcHV0cygic3VwZXItYmFuayIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwdXRzKCJpbnZhbGlkIik7CisJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKChzZHJhbV9jZmcgPj4gOCkgJiAweDdmKSB7CisJCXB1dHMoIlxuIik7CisJCXB1dHMoIiAgICAgICBERFIgQ2hpcC1TZWxlY3QgSW50ZXJsZWF2aW5nIE1vZGU6ICIpOworCQlzd2l0Y2goc2RyYW1fY2ZnID4+IDggJiAweDdmKSB7CisJCWNhc2UgRlNMX0REUl9DUzBfQ1MxX0NTMl9DUzM6CisJCQlwdXRzKCJDUzArQ1MxK0NTMitDUzMiKTsKKwkJCWJyZWFrOworCQljYXNlIEZTTF9ERFJfQ1MwX0NTMToKKwkJCXB1dHMoIkNTMCtDUzEiKTsKKwkJCWJyZWFrOworCQljYXNlIEZTTF9ERFJfQ1MyX0NTMzoKKwkJCXB1dHMoIkNTMitDUzMiKTsKKwkJCWJyZWFrOworCQljYXNlIEZTTF9ERFJfQ1MwX0NTMV9BTkRfQ1MyX0NTMzoKKwkJCXB1dHMoIkNTMCtDUzEgYW5kIENTMitDUzMiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHV0cygiaW52YWxpZCIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvZmR0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvZmR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlZmFmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjOHh4eC9mZHQuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIGFyY2gvcG93ZXJwYy9jcHUvbXBjODV4eC9jcHUuYyBhbmQKKyAqIGFyY2gvcG93ZXJwYy9jcHUvbXBjODZ4eC9jcHUuYy4gQmFzaWNhbGx5IHRoaXMgZmlsZSBjb250YWlucworICogY3B1IHNwZWNpZmljIGNvbW1vbiBjb2RlIGZvciA4NXh4Lzg2eHggcHJvY2Vzc29ycy4KKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorCit2b2lkIGZ0X2ZpeHVwX251bV9jb3Jlcyh2b2lkICpibG9iKSB7CisJaW50IG9mZiwgbnVtX2NvcmVzLCBkZWxfY29yZXM7CisKKwlkZWxfY29yZXMgPSAwOworCW51bV9jb3JlcyA9IGNwdV9udW1jb3JlcygpOworCisJb2ZmID0gZmR0X25vZGVfb2Zmc2V0X2J5X3Byb3BfdmFsdWUoYmxvYiwgLTEsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0KTsKKwl3aGlsZSAob2ZmICE9IC1GRFRfRVJSX05PVEZPVU5EKSB7CisJCXUzMiAqcmVnID0gKHUzMiAqKWZkdF9nZXRwcm9wKGJsb2IsIG9mZiwgInJlZyIsIDApOworCisJCS8qIGlmIHdlIGZpbmQgYSBjcHUgbm9kZSBvdXRzaWRlIG9mIHdoYXQgd2UgZXhwZWN0IGRlbGV0ZSBpdAorCQkgKiBhbmQgcmVzZXQgdGhlIG9mZnNldCBiYWNrIHRvIHRoZSBzdGFydCBzaW5jZSB3ZSBjYW4ndAorCQkgKiB0cnVzdCB0aGUgb2Zmc2V0cyBhbnltb3JlCisJCSAqLworCQlpZiAoKnJlZyA+IG51bV9jb3Jlcy0xKSB7CisJCQlmZHRfZGVsX25vZGUoYmxvYiwgb2ZmKTsKKwkJCWRlbF9jb3JlcysrOworCQkJb2ZmID0gLTE7CisJCX0KKwkJb2ZmID0gZmR0X25vZGVfb2Zmc2V0X2J5X3Byb3BfdmFsdWUoYmxvYiwgb2ZmLAorCQkJCSJkZXZpY2VfdHlwZSIsICJjcHUiLCA0KTsKKwl9CisJZGVidWcgKCIleCBjb3JlIHN5c3RlbSBmb3VuZFxuIiwgbnVtX2NvcmVzKTsKKwlkZWJ1ZyAoImRlbGV0ZWQgJWQgZXh0cmEgY29yZSBlbnRyeSBlbnRyaWVzIGZyb20gZGV2aWNlIHRyZWVcbiIsCisJCQkJCQkJCWRlbF9jb3Jlcyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzh4eHgvcGNpX2NmZy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L3BjaV9jZmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjcxODFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4eHh4L3BjaV9jZmcuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2ZzbF9sYXcuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKworc3RydWN0IHBjaV9pbmZvIHsKKwl1MzIJY2ZnOworfTsKKworLyogVGhlIGNmZyBmaWVsZCBpcyBhIGJpdCBtYXNrIGluIHdoaWNoIGVhY2ggYml0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mCisgKiBjZmdfSU9fcG9ydHNbXSBzaWduYWwgYW5kIHRoZSBiaXQgaXMgc2V0IGlmIHRoZSBpbnRlcmZhY2Ugd291bGQgYmUKKyAqIGVuYWJsZWQgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGNmZ19JT19wb3J0c1tdIHNpZ25hbAorICoKKyAqIE9uIE1QQzg2eHgvUFEzIGJhc2VkIHN5c3RlbXM6CisgKiAgIHdlIGV4dHJhY3QgY2ZnX0lPX3BvcnRzIGZyb20gR1VUUyByZWdpc3RlciBQT1JERVZTUgorICoKKyAqIGNmZ19JT19wb3J0cyBvbmx5IGV4aXN0IG9uIHN5c3RlbXMgdy9QQ0llICh3ZSBzZXQgY2ZnIDAgZm9yIHN5c3RlbXMKKyAqIHdpdGhvdXQgUENJZSkKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfTVBDODU0MCkgfHwgZGVmaW5lZChDT05GSUdfTVBDODU2MCkKK3N0YXRpYyBzdHJ1Y3QgcGNpX2luZm8gcGNpX2NvbmZpZ19pbmZvW10gPQoreworCVtMQVdfVFJHVF9JRl9QQ0ldID0geworCQkuY2ZnID0gICAwLAorCX0sCit9OworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODU0MSkgfHwgZGVmaW5lZChDT05GSUdfTVBDODU1NSkKK3N0YXRpYyBzdHJ1Y3QgcGNpX2luZm8gcGNpX2NvbmZpZ19pbmZvW10gPQoreworCVtMQVdfVFJHVF9JRl9QQ0ldID0geworCQkuY2ZnID0gICAwLAorCX0sCit9OworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODUzNikKK3N0YXRpYyBzdHJ1Y3QgcGNpX2luZm8gcGNpX2NvbmZpZ19pbmZvW10gPQoreworCVtMQVdfVFJHVF9JRl9QQ0ldID0geworCQkuY2ZnID0gICAwLAorCX0sCisJW0xBV19UUkdUX0lGX1BDSUVfMV0gPSB7CisJCS5jZmcgPSAgICgxIDw8IDIpIHwgKDEgPDwgMykgfCAoMSA8PCA1KSB8ICgxIDw8IDcpLAorCX0sCisJW0xBV19UUkdUX0lGX1BDSUVfMl0gPSB7CisJCS5jZmcgPSAgICgxIDw8IDUpIHwgKDEgPDwgNyksCisJfSwKKwlbTEFXX1RSR1RfSUZfUENJRV8zXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgNyksCisJfSwKK307CisjZWxpZiBkZWZpbmVkKENPTkZJR19NUEM4NTQ0KQorc3RhdGljIHN0cnVjdCBwY2lfaW5mbyBwY2lfY29uZmlnX2luZm9bXSA9Cit7CisJW0xBV19UUkdUX0lGX1BDSV0gPSB7CisJCS5jZmcgPSAgIDAsCisJfSwKKwlbTEFXX1RSR1RfSUZfUENJRV8xXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMikgfCAoMSA8PCAzKSB8ICgxIDw8IDQpIHwgKDEgPDwgNSkgfAorCQkJICgxIDw8IDYpIHwgKDEgPDwgNyksCisJfSwKKwlbTEFXX1RSR1RfSUZfUENJRV8yXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgNCkgfCAoMSA8PCA1KSB8ICgxIDw8IDYpIHwgKDEgPDwgNyksCisJfSwKKwlbTEFXX1RSR1RfSUZfUENJRV8zXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgNikgfCAoMSA8PCA3KSwKKwl9LAorfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg1NDgpCitzdGF0aWMgc3RydWN0IHBjaV9pbmZvIHBjaV9jb25maWdfaW5mb1tdID0KK3sKKwlbTEFXX1RSR1RfSUZfUENJXzFdID0geworCQkuY2ZnID0gICAwLAorCX0sCisJW0xBV19UUkdUX0lGX1BDSV8yXSA9IHsKKwkJLmNmZyA9ICAgMCwKKwl9LAorCS8qIFBDSV8yIGlzIGFsd2F5cyBob3N0IGFuZCB3ZSBkb250IHVzZSBpb3NlbCB0byBkZXRlcm1pbmUgZW5hYmxlL2Rpc2FibGUgKi8KKwlbTEFXX1RSR1RfSUZfUENJRV8xXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMykgfCAoMSA8PCA0KSB8ICgxIDw8IDcpLAorCX0sCit9OworI2VsaWYgZGVmaW5lZChDT05GSUdfTVBDODU2OCkKK3N0YXRpYyBzdHJ1Y3QgcGNpX2luZm8gcGNpX2NvbmZpZ19pbmZvW10gPQoreworCVtMQVdfVFJHVF9JRl9QQ0ldID0geworCQkuY2ZnID0gICAwLAorCX0sCisJW0xBV19UUkdUX0lGX1BDSUVfMV0gPSB7CisJCS5jZmcgPSAgICgxIDw8IDMpIHwgKDEgPDwgNCkgfCAoMSA8PCA3KSwKKwl9LAorfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg1NjkpCitzdGF0aWMgc3RydWN0IHBjaV9pbmZvIHBjaV9jb25maWdfaW5mb1tdID0KK3sKKwlbTEFXX1RSR1RfSUZfUENJRV8xXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMCkgfCAoMSA8PCA0KSB8ICgxIDw8IDUpIHwgKDEgPDwgNikgfCAoMSA8PCA3KSB8CisJCQkgKDEgPDwgOCkgfCAoMSA8PCAweGMpIHwgKDEgPDwgMHhmKSwKKwl9LAorfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg1NzIpCitzdGF0aWMgc3RydWN0IHBjaV9pbmZvIHBjaV9jb25maWdfaW5mb1tdID0KK3sKKwlbTEFXX1RSR1RfSUZfUENJRV8xXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMikgfCAoMSA8PCAzKSB8ICgxIDw8IDcpIHwKKwkJCSAoMSA8PCAweGIpIHwgKDEgPDwgMHhjKSB8ICgxIDw8IDB4ZiksCisJfSwKKwlbTEFXX1RSR1RfSUZfUENJRV8yXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMykgfCAoMSA8PCA3KSwKKwl9LAorCVtMQVdfVFJHVF9JRl9QQ0lFXzNdID0geworCQkuY2ZnID0gICAoMSA8PCA3KSwKKwl9LAorfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg2MTApCitzdGF0aWMgc3RydWN0IHBjaV9pbmZvIHBjaV9jb25maWdfaW5mb1tdID0KK3sKKwlbTEFXX1RSR1RfSUZfUENJXzFdID0geworCQkuY2ZnID0gICAwLAorCX0sCisJW0xBV19UUkdUX0lGX1BDSUVfMV0gPSB7CisJCS5jZmcgPSAgICgxIDw8IDEpIHwgKDEgPDwgNCksCisJfSwKKwlbTEFXX1RSR1RfSUZfUENJRV8yXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMCkgfCAoMSA8PCA0KSwKKwl9LAorfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX01QQzg2NDEpCitzdGF0aWMgc3RydWN0IHBjaV9pbmZvIHBjaV9jb25maWdfaW5mb1tdID0KK3sKKwlbTEFXX1RSR1RfSUZfUENJRV8xXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMikgfCAoMSA8PCAzKSB8ICgxIDw8IDUpIHwgKDEgPDwgNikgfAorCQkJICgxIDw8IDcpIHwgKDEgPDwgMHhlKSB8ICgxIDw8IDB4ZiksCisJfSwKK307CisjZWxpZiBkZWZpbmVkKENPTkZJR19QMTAxMSkgfHwgZGVmaW5lZChDT05GSUdfUDEwMjApIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX1AxMDEyKSB8fCBkZWZpbmVkKENPTkZJR19QMTAyMSkKK3N0YXRpYyBzdHJ1Y3QgcGNpX2luZm8gcGNpX2NvbmZpZ19pbmZvW10gPQoreworCVtMQVdfVFJHVF9JRl9QQ0lFXzFdID0geworCQkuY2ZnID0gICAoMSA8PCAwKSB8ICgxIDw8IDYpIHwgKDEgPDwgMHhlKSB8ICgxIDw8IDB4ZiksCisJfSwKKwlbTEFXX1RSR1RfSUZfUENJRV8yXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMHhlKSwKKwl9LAorfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1AxMDEzKSB8fCBkZWZpbmVkKENPTkZJR19QMTAyMikKK3N0YXRpYyBzdHJ1Y3QgcGNpX2luZm8gcGNpX2NvbmZpZ19pbmZvW10gPQoreworCVtMQVdfVFJHVF9JRl9QQ0lFXzFdID0geworCQkuY2ZnID0gICAoMSA8PCA2KSB8ICgxIDw8IDcpIHwgKDEgPDwgOSkgfCAoMSA8PCAweGEpIHwKKwkJCSAoMSA8PCAweGIpIHwgKDEgPDwgMHhkKSB8ICgxIDw8IDB4ZSkgfAorCQkJICgxIDw8IDB4ZikgfCAoMSA8PCAweDE1KSB8ICgxIDw8IDB4MTYpIHwKKwkJCSAoMSA8PCAweDE3KSB8ICgxIDw8IDB4MTgpIHwgKDEgPDwgMHgxOSkgfAorCQkJICgxIDw8IDB4MWEpIHwgKDEgPDwgMHgxYikgfCAoMSA8PCAweDFjKSB8CisJCQkgKDEgPDwgMHgxZCkgfCAoMSA8PCAweDFlKSB8ICgxIDw8IDB4MWYpLAorCX0sCisJW0xBV19UUkdUX0lGX1BDSUVfMl0gPSB7CisJCS5jZmcgPSAgICgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCA2KSB8ICgxIDw8IDcpIHwKKwkJCSAoMSA8PCA5KSB8ICgxIDw8IDB4YSkgfCAoMSA8PCAweGIpIHwgKDEgPDwgMHhkKSB8CisJCQkgKDEgPDwgMHgxNSkgfCAoMSA8PCAweDE2KSB8ICgxIDw8IDB4MTcpIHwKKwkJCSAoMSA8PCAweDE4KSB8ICgxIDw8IDB4MWMpLAorCX0sCisJW0xBV19UUkdUX0lGX1BDSUVfM10gPSB7CisJCS5jZmcgPSAgICgxIDw8IDYpIHwgKDEgPDwgNykgfCAoMSA8PCA5KSB8ICgxIDw8IDB4ZCkgfAorCQkJICgxIDw8IDB4MTUpIHwgKDEgPDwgMHgxNikgfCAoMSA8PCAweDE3KSB8ICgxIDw8IDB4MTgpIHwKKwkJCSAoMSA8PCAweDE5KSB8ICgxIDw8IDB4MWEpIHwgKDEgPDwgMHgxYiksCisJfSwKK307CisjZWxpZiBkZWZpbmVkKENPTkZJR19QMjAxMCkgfHwgZGVmaW5lZChDT05GSUdfUDIwMjApCitzdGF0aWMgc3RydWN0IHBjaV9pbmZvIHBjaV9jb25maWdfaW5mb1tdID0KK3sKKwlbTEFXX1RSR1RfSUZfUENJRV8xXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMCkgfCAoMSA8PCAyKSB8ICgxIDw8IDQpIHwgKDEgPDwgNikgfAorCQkJICgxIDw8IDB4ZCkgfCAoMSA8PCAweGUpIHwgKDEgPDwgMHhmKSwKKwl9LAorCVtMQVdfVFJHVF9JRl9QQ0lFXzJdID0geworCQkuY2ZnID0gICAoMSA8PCAyKSB8ICgxIDw8IDB4ZSksCisJfSwKKwlbTEFXX1RSR1RfSUZfUENJRV8zXSA9IHsKKwkJLmNmZyA9ICAgKDEgPDwgMikgfCAoMSA8PCA0KSwKKwl9LAorfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0ZTTF9DT1JFTkVUKQorI2Vsc2UKKyNlcnJvciBOZWVkIHRvIGRlZmluZSBwY2lfY29uZmlnX2luZm8gZm9yIHByb2Nlc3NvcgorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0ZTTF9DT1JFTkVUCitpbnQgaXNfZnNsX3BjaV9jZmcoZW51bSBsYXdfdHJndF9pZiB0cmd0LCB1MzIgaW9fc2VsKQoreworCXJldHVybiAoKDEgPDwgaW9fc2VsKSAmIHBjaV9jb25maWdfaW5mb1t0cmd0XS5jZmcpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80MHhfc3BkX3NkcmFtLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80MHhfc3BkX3NkcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1Y2Q4OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4LzQweF9zcGRfc2RyYW0uYwpAQCAtMCwwICsxLDQ2NCBAQAorLyoKKyAqIGFyY2gvcG93ZXJwYy9jcHUvcHBjNHh4LzQweF9zcGRfc2RyYW0uYworICogVGhpcyBTUEQgU0RSQU0gZGV0ZWN0aW9uIGNvZGUgc3VwcG9ydHMgSUJNL0FNQ0MgUFBDNDR4IGNwdSB3aXRoIGEKKyAqIFNEUkFNIGNvbnRyb2xsZXIuIFRob3NlIGFyZSBhbGwgY3VycmVudCA0MDUgUFBDJ3MuCisgKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBCaWxsIEh1bnRlciwgV2F2ZSA3IE9wdGljcywgd2lsbGlhbWh1bnRlckBhdHRiaS5jb20KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGJ5OgorICoKKyAqIEtlbm5ldGggSm9oYW5zc29uICxFcmljc3NvbiBBQi4KKyAqIGtlbm5ldGguam9oYW5zc29uQGV0eC5lcmljc3Nvbi5zZQorICoKKyAqIGhhY2tlZCB1cCBieSBiaWxsIGh1bnRlci4gZml4ZWQgc28gd2UgY291bGQgcnVuIGJlZm9yZQorICogc2VyaWFsX2luaXQgYW5kIGNvbnNvbGVfaW5pdC4gcHJldmlvdXMgdmVyc2lvbiBhdm9pZGVkIHRoaXMgYnkKKyAqIHJ1bm5pbmcgb3V0IG9mIGNhY2hlIG1lbW9yeSBkdXJpbmcgc2VyaWFsL2NvbnNvbGUgaW5pdCwgdGhlbiBydW5uaW5nCisgKiB0aGlzIGNvZGUgbGF0ZXIuCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBKdW4gR3UsIEFydGVzeW4gVGVjaG5vbG9neSwganVuZ0BhcnRlc3luY3AuY29tCisgKiBTdXBwb3J0IGZvciBBTUNDIDQ0MCBiYXNlZCBvbiBPcGVuQklPUyBkcmFtaW5pdC5jIGZyb20gSUJNLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNQorICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8aTJjLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKSAmJiAhZGVmaW5lZChDT05GSUdfNDQwKQorCisvKgorICogU2V0IGRlZmF1bHQgdmFsdWVzCisgKi8KKyNpZm5kZWYgQ09ORklHX1NZU19JMkNfU1BFRUQKKyNkZWZpbmUgQ09ORklHX1NZU19JMkNfU1BFRUQJNTAwMDAKKyNlbmRpZgorCisjZGVmaW5lIE9ORV9CSUxMSU9OCTEwMDAwMDAwMDAKKworI2RlZmluZQkgU0RSQU0wX0NGR19EQ0UJCTB4ODAwMDAwMDAKKyNkZWZpbmUJIFNEUkFNMF9DRkdfU1JFCQkweDQwMDAwMDAwCisjZGVmaW5lCSBTRFJBTTBfQ0ZHX1BNRQkJMHgyMDAwMDAwMAorI2RlZmluZQkgU0RSQU0wX0NGR19NRU1DSEsJMHgxMDAwMDAwMAorI2RlZmluZQkgU0RSQU0wX0NGR19SRUdFTgkweDA4MDAwMDAwCisjZGVmaW5lCSBTRFJBTTBfQ0ZHX0VDQ0RECTB4MDA0MDAwMDAKKyNkZWZpbmUJIFNEUkFNMF9DRkdfRU1EVUxSCTB4MDAyMDAwMDAKKyNkZWZpbmUJIFNEUkFNMF9DRkdfRFJXX1NISUZUCSgzMS02KQorI2RlZmluZQkgU0RSQU0wX0NGR19CUlBGX1NISUZUCSgzMS04KQorCisjZGVmaW5lCSBTRFJBTTBfVFJfQ0FTTF9TSElGVAkoMzEtOCkKKyNkZWZpbmUJIFNEUkFNMF9UUl9QVEFfU0hJRlQJKDMxLTEzKQorI2RlZmluZQkgU0RSQU0wX1RSX0NUUF9TSElGVAkoMzEtMTUpCisjZGVmaW5lCSBTRFJBTTBfVFJfTERGX1NISUZUCSgzMS0xNykKKyNkZWZpbmUJIFNEUkFNMF9UUl9SRlRBX1NISUZUCSgzMS0yOSkKKyNkZWZpbmUJIFNEUkFNMF9UUl9SQ0RfU0hJRlQJKDMxLTMxKQorCisjZGVmaW5lCSBTRFJBTTBfUlRSX1NISUZUCSgzMS0xNSkKKyNkZWZpbmUJIFNEUkFNMF9FQ0NDRkdfU0hJRlQJKDMxLTExKQorCisvKiBTRFJBTTBfQ0ZHIGVuYWJsZSBtYWNybyAgKi8KKyNkZWZpbmUgU0RSQU0wX0NGR19CUlBGKHgpICggKCB4ICYgMHgzKTw8IFNEUkFNMF9DRkdfQlJQRl9TSElGVCApCisKKyNkZWZpbmUgU0RSQU0wX0JYQ1JfU1pfTUFTSwkweDAwMGUwMDAwCisjZGVmaW5lIFNEUkFNMF9CWENSX0FNX01BU0sJMHgwMDAwZTAwMAorCisjZGVmaW5lIFNEUkFNMF9CWENSX1NaX1NISUZUCSgzMS0xNCkKKyNkZWZpbmUgU0RSQU0wX0JYQ1JfQU1fU0hJRlQJKDMxLTE4KQorCisjZGVmaW5lIFNEUkFNMF9CWENSX1NaKHgpCSggKCggeCA8PCBTRFJBTTBfQlhDUl9TWl9TSElGVCkgJiBTRFJBTTBfQlhDUl9TWl9NQVNLKSApCisjZGVmaW5lIFNEUkFNMF9CWENSX0FNKHgpCSggKCggeCA8PCBTRFJBTTBfQlhDUl9BTV9TSElGVCkgJiBTRFJBTTBfQlhDUl9BTV9NQVNLKSApCisKKyNpZmRlZiBDT05GSUdfU1BERFJBTV9TSUxFTlQKKyMgZGVmaW5lIFNQRF9FUlIoeCkgZG8geyByZXR1cm4gMDsgfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBTUERfRVJSKHgpIGRvIHsgcHJpbnRmKHgpOyByZXR1cm4oMCk7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBzZHJhbV9IWl90b19ucyhoZXJ0eikgKDEwMDAwMDAwMDAvKGhlcnR6KSkKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworaW50IHNwZF9yZWFkKHVpbnQgYWRkcik7CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmVhZGluZyBkYXRhIGZyb20gdGhlIERJTU0gbW9kdWxlIEVFUFJPTSBvdmVyIHRoZSBTUEQgYnVzCisgKiBhbmQgdXNlcyB0aGF0IHRvIHByb2dyYW0gdGhlIHNkcmFtIGNvbnRyb2xsZXIuCisgKgorICogVGhpcyB3b3JrcyBvbiBib2FyZHMgdGhhdCBoYXMgdGhlIHNhbWUgc2NoZW1hdGljcyB0aGF0IHRoZSBBTUNDIHdhbG51dCBoYXMuCisgKgorICogSW5wdXQ6IG51bGwgZm9yIGRlZmF1bHQgSTJDIHNwZCBmdW5jdGlvbnMgb3IgYSBwb2ludGVyIHRvIGEgY3VzdG9tIGZ1bmN0aW9uCisgKiByZXR1cm5pbmcgc3BkX2RhdGEuCisgKi8KKworbG9uZyBpbnQgc3BkX3NkcmFtKGludChyZWFkX3NwZCkodWludCBhZGRyKSkKK3sKKwlpbnQgdG1wLHJvdyxjb2w7CisJaW50IHRvdGFsX3NpemUsYmFua19zaXplLGJhbmtfY29kZTsKKwlpbnQgZWNjX29uOworCWludCBtb2RlOworCWludCBiYW5rX2NudDsKKworCWludCBzZHJhbTBfcG1pdD0weDA3YzAwMDAwOworI2lmbmRlZiBDT05GSUdfNDA1RVAgLyogbm90IG9uIFBQQzQwNUVQICovCisJaW50IHNkcmFtMF9iZXNyMCA9IC0xOworCWludCBzZHJhbTBfYmVzcjEgPSAtMTsKKwlpbnQgc2RyYW0wX2VjY2VzciA9IC0xOworI2VuZGlmCisJaW50IHNkcmFtMF9lY2NjZmc7CisKKwlpbnQgc2RyYW0wX3J0cj0wOworCWludCBzZHJhbTBfdHI9MDsKKworCWludCBzZHJhbTBfYjBjcjsKKwlpbnQgc2RyYW0wX2IxY3I7CisJaW50IHNkcmFtMF9iMmNyOworCWludCBzZHJhbTBfYjNjcjsKKworCWludCBzZHJhbTBfY2ZnPTA7CisKKwlpbnQgdF9ycDsKKwlpbnQgdF9yY2Q7CisJaW50IHRfcmFzOworCWludCB0X3JjOworCWludCBtaW5fY2FzOworCisJUFBDNHh4X1NZU19JTkZPIHN5c19pbmZvOworCXVuc2lnbmVkIGxvbmcgYnVzX3BlcmlvZF94XzEwOworCisJLyoKKwkgKiBnZXQgdGhlIGJvYXJkIGluZm8KKwkgKi8KKwlnZXRfc3lzX2luZm8oJnN5c19pbmZvKTsKKwlidXNfcGVyaW9kX3hfMTAgPSBPTkVfQklMTElPTiAvIChzeXNfaW5mby5mcmVxUExCIC8gMTApOworCisJaWYgKHJlYWRfc3BkID09IDApeworCQlyZWFkX3NwZD1zcGRfcmVhZDsKKwkJLyoKKwkJICogTWFrZSBzdXJlIEkyQyBjb250cm9sbGVyIGlzIGluaXRpYWxpemVkCisJCSAqIGJlZm9yZSBjb250aW51aW5nLgorCQkgKi8KKwkJaTJjX2luaXQoQ09ORklHX1NZU19JMkNfU1BFRUQsIENPTkZJR19TWVNfSTJDX1NMQVZFKTsKKwl9CisKKwkvKiBNYWtlIHNodXJlIHdlIGFyZSB1c2luZyBTRFJBTSAqLworCWlmIChyZWFkX3NwZCgyKSAhPSAweDA0KSB7CisJCVNQRF9FUlIoIlNEUkFNIC0gbm9uIFNEUkFNIG1lbW9yeSBtb2R1bGUgZm91bmRcbiIpOworCX0KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIGNvbmZpZ3VyZSBtZW1vcnkgdGltaW5nIHJlZ2lzdGVyCisJICoKKwkgKiBkYXRhIGZyb20gRElNTToKKwkgKiAyNwlJTiBSb3cgUHJlY2hhcmdlIFRpbWUgKCB0IFJQKQorCSAqIDI5CU1JTiBSQVMgdG8gQ0FTIERlbGF5ICggdCBSQ0QpCisJICogMTI3CSBDb21wb25lbnQgYW5kIENsb2NrIERldGFpbCAsY2xrMC1jbGszLCBqdW5jdGlvbiB0ZW1wLCBDQVMKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qCisJICogZmlyc3QgZmlndXJlIG91dCB3aGljaCBjYXMgbGF0ZW5jeSBtb2RlIHRvIHVzZQorCSAqIHVzZSB0aGUgbWluIHN1cHBvcnRlZCBtb2RlCisJICovCisKKwl0bXAgPSByZWFkX3NwZCgxMjcpICYgMHg2OworCWlmICh0bXAgPT0gMHgwMikgewkJLyogb25seSBjYXMgPSAyIHN1cHBvcnRlZCAqLworCQltaW5fY2FzID0gMjsKKy8qCQl0X2NrID0gcmVhZF9zcGQoOSk7ICovCisvKgkJdF9hYyA9IHJlYWRfc3BkKDEwKTsgKi8KKwl9IGVsc2UgaWYgKHRtcCA9PSAweDA0KSB7CS8qIG9ubHkgY2FzID0gMyBzdXBwb3J0ZWQgKi8KKwkJbWluX2NhcyA9IDM7CisvKgkJdF9jayA9IHJlYWRfc3BkKDkpOyAqLworLyoJCXRfYWMgPSByZWFkX3NwZCgxMCk7ICovCisJfSBlbHNlIGlmICh0bXAgPT0gMHgwNikgewkvKiAyLDMgc3VwcG9ydGVkLCBzbyB1c2UgMiAqLworCQltaW5fY2FzID0gMjsKKy8qCQl0X2NrID0gcmVhZF9zcGQoMjMpOyAqLworLyoJCXRfYWMgPSByZWFkX3NwZCgyNCk7ICovCisJfSBlbHNlIHsKKwkJU1BEX0VSUigiU0RSQU0gLSB1bnN1cHBvcnRlZCBDQVMgbGF0ZW5jeSBcbiIpOworCX0KKworCS8qIGdldCBzb21lIHRpbWluZyB2YWx1ZXMsIHRfcnAsdF9yY2QsdF9yYXMsdF9yYworCSAqLworCXRfcnAgPSByZWFkX3NwZCgyNyk7CisJdF9yY2QgPSByZWFkX3NwZCgyOSk7CisJdF9yYXMgPSByZWFkX3NwZCgzMCk7CisJdF9yYyA9IHRfcmFzICsgdF9ycDsKKworCS8qIFRoZSBmb2xsb3dpbmcgdGltaW5nIGNhbGNzIHN1YnRyYWN0IDEgYmVmb3JlIGRldmlkaW5nLgorCSAqIHRoaXMgaGFzIGVmZmVjdCBvZiB1c2luZyBjZWlsaW5nIGluc3RlYWQgb2YgZmxvb3Igcm91bmRpbmcsCisJICogYW5kIGFsc28gc3VidHJhY3RpbmcgMSB0byBjb252ZXJ0IG51bWJlciB0byByZWcgdmFsdWUKKwkgKi8KKwkvKiBzZXQgdXAgQ0FTTCAqLworCXNkcmFtMF90ciA9IChtaW5fY2FzIC0gMSkgPDwgU0RSQU0wX1RSX0NBU0xfU0hJRlQ7CisJLyogc2V0IHVwIFBUQSAqLworCXNkcmFtMF90ciB8PSAoKCgodF9ycCAtIDEpICogMTApL2J1c19wZXJpb2RfeF8xMCkgJiAweDMpIDw8IFNEUkFNMF9UUl9QVEFfU0hJRlQ7CisJLyogc2V0IHVwIENUUCAqLworCXRtcCA9ICgoKHRfcmMgLSB0X3JjZCAtIHRfcnAgLTEpICogMTApIC8gYnVzX3BlcmlvZF94XzEwKSAmIDB4MzsKKwlpZiAodG1wIDwgMSkKKwkJdG1wID0gMTsKKwlzZHJhbTBfdHIgfD0gdG1wIDw8IFNEUkFNMF9UUl9DVFBfU0hJRlQ7CisJLyogc2V0IExERgk9IDIgY3ljbGVzLCByZWcgdmFsdWUgPSAxICovCisJc2RyYW0wX3RyIHw9IDEgPDwgU0RSQU0wX1RSX0xERl9TSElGVDsKKwkvKiBzZXQgUkZUQSA9IHRfcmZjL2J1c19wZXJpb2QsIHVzZSB0X3JmYyA9IHRfcmMgKi8KKwl0bXAgPSAoKCh0X3JjIC0gMSkgKiAxMCkgLyBidXNfcGVyaW9kX3hfMTApIC0gMzsKKwlpZiAodG1wIDwgMCkKKwkJdG1wID0gMDsKKwlpZiAodG1wID4gNikKKwkJdG1wID0gNjsKKwlzZHJhbTBfdHIgfD0gdG1wIDw8IFNEUkFNMF9UUl9SRlRBX1NISUZUOworCS8qIHNldCBSQ0QgPSB0X3JjZC9idXNfcGVyaW9kKi8KKwlzZHJhbTBfdHIgfD0gKCgoKHRfcmNkIC0gMSkgKiAxMCkgLyBidXNfcGVyaW9kX3hfMTApICYweDMpIDw8IFNEUkFNMF9UUl9SQ0RfU0hJRlQgOworCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIGNvbmZpZ3VyZSBSVFIgcmVnaXN0ZXIKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlyb3cgPSByZWFkX3NwZCgzKTsKKwljb2wgPSByZWFkX3NwZCg0KTsKKwl0bXAgPSByZWFkX3NwZCgxMikgJiAweDdmIDsgLyogcmVmcmVzaCB0eXBlIGxlc3Mgc2VsZiByZWZyZXNoIGJpdCAqLworCXN3aXRjaCAodG1wKSB7CisJY2FzZSAweDAwOgorCQl0bXAgPSAxNTYyNTsKKwkJYnJlYWs7CisJY2FzZSAweDAxOgorCQl0bXAgPSAxNTYyNSAvIDQ7CisJCWJyZWFrOworCWNhc2UgMHgwMjoKKwkJdG1wID0gMTU2MjUgLyAyOworCQlicmVhazsKKwljYXNlIDB4MDM6CisJCXRtcCA9IDE1NjI1ICogMjsKKwkJYnJlYWs7CisJY2FzZSAweDA0OgorCQl0bXAgPSAxNTYyNSAqIDQ7CisJCWJyZWFrOworCWNhc2UgMHgwNToKKwkJdG1wID0gMTU2MjUgKiA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlTUERfRVJSKCJTRFJBTSAtIEJhZCByZWZyZXNoIHBlcmlvZCBcbiIpOworCX0KKwkvKiBjb252ZXJ0IGZyb20gbnNlYyB0byBidXMgY3ljbGVzICovCisJdG1wID0gKHRtcCAqIDEwKSAvIGJ1c19wZXJpb2RfeF8xMDsKKwlzZHJhbTBfcnRyID0gKHRtcCAmIDB4M2ZmOCkgPDwJU0RSQU0wX1JUUl9TSElGVDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYmFua3MgdXNlZAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qIGJ5dGUgNzo2IGlzIG1vZHVsZSBkYXRhIHdpZHRoICovCisJaWYgKHJlYWRfc3BkKDcpICE9IDApCisJCVNQRF9FUlIoIlNEUkFNIC0gdW5zdXBwb3J0ZWQgbW9kdWxlIHdpZHRoXG4iKTsKKwl0bXAgPSByZWFkX3NwZCg2KTsKKwlpZiAodG1wIDwgMzIpCisJCVNQRF9FUlIoIlNEUkFNIC0gdW5zdXBwb3J0ZWQgbW9kdWxlIHdpZHRoXG4iKTsKKwllbHNlIGlmICh0bXAgPCA2NCkKKwkJYmFua19jbnQgPSAxOwkJLyogb25lIGJhbmsgcGVyIHNkcmFtIHNpZGUgKi8KKwllbHNlIGlmICh0bXAgPCA3MykKKwkJYmFua19jbnQgPSAyOwkvKiBuZWVkIHR3byBiYW5rcyBwZXIgc2lkZSAqLworCWVsc2UgaWYgKHRtcCA8IDE2MSkKKwkJYmFua19jbnQgPSA0OwkvKiBuZWVkIGZvdXIgYmFua3MgcGVyIHNpZGUgKi8KKwllbHNlCisJCVNQRF9FUlIoIlNEUkFNIC0gdW5zdXBwb3J0ZWQgbW9kdWxlIHdpZHRoXG4iKTsKKworCS8qIGJ5dGUgNSBpcyB0aGUgbW9kdWxlIHJvdyBjb3VudCAocmVmZXJlZCB0byBhcyBkaW1tICJzaWRlcyIpICovCisJdG1wID0gcmVhZF9zcGQoNSk7CisJaWYgKHRtcCA9PSAxKQorCQk7CisJZWxzZSBpZiAodG1wPT0yKQorCQliYW5rX2NudCAqPSAyOworCWVsc2UgaWYgKHRtcD09NCkKKwkJYmFua19jbnQgKj0gNDsKKwllbHNlCisJCWJhbmtfY250ID0gODsJCS8qIDggaXMgYW4gZXJyb3IgY29kZSAqLworCisJaWYgKGJhbmtfY250ID4gNCkJLyogd2Ugb25seSBoYXZlIDQgYmFua3MgdG8gd29yayB3aXRoICovCisJCVNQRF9FUlIoIlNEUkFNIC0gdW5zdXBwb3J0ZWQgbW9kdWxlIHJvd3MgZm9yIHRoaXMgd2lkdGhcbiIpOworCisJLyogbm93IGNoZWNrIGZvciBFQ0MgYWJpbGl0eSBvZiBtb2R1bGUuIFdlIG9ubHkgc3VwcG9ydCBFQ0MKKwkgKiAgIG9uIDMyIGJpdCB3aWRlIGRldmljZXMgd2l0aCA4IGJpdCBFQ0MuCisJICovCisJaWYgKChyZWFkX3NwZCgxMSk9PTIpICYmIChyZWFkX3NwZCg2KT09NDApICYmIChyZWFkX3NwZCgxNCk9PTgpKSB7CisJCXNkcmFtMF9lY2NjZmcgPSAweGYgPDwgU0RSQU0wX0VDQ0NGR19TSElGVDsKKwkJZWNjX29uID0gMTsKKwl9IGVsc2UgeworCQlzZHJhbTBfZWNjY2ZnID0gMDsKKwkJZWNjX29uID0gMDsKKwl9CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIGNhbGN1bGF0ZSB0b3RhbCBzaXplCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogY2FsY3VsYXRlIHRvdGFsIHNpemUgYW5kIGRvIHNhbml0eSBjaGVjayAqLworCXRtcCA9IHJlYWRfc3BkKDMxKTsKKwl0b3RhbF9zaXplID0gMSA8PCAyMjsJLyogdG90YWxfc2l6ZSA9IDRNQiAqLworCS8qIG5vdyBtdWx0aXBseSA0TSBieSB0aGUgc21hbGxlc3QgZGV2aWNlIHJvdyBkZW5zaXR5ICovCisJLyogbm90ZSB0aGF0IHdlIGRvbid0IHN1cHBvcnQgYXN5bWV0cmljIHJvd3MgKi8KKwl3aGlsZSAoKCh0bXAgJiAweDAwMDEpID09IDApICYmICh0bXAgIT0gMCkpIHsKKwkJdG90YWxfc2l6ZSA9IHRvdGFsX3NpemUgPDwgMTsKKwkJdG1wID0gdG1wID4+IDE7CisJfQorCXRvdGFsX3NpemUgKj0gcmVhZF9zcGQoNSk7CS8qIG11bHQgYnkgbW9kdWxlIHJvd3MgKGRpbW0gc2lkZXMpICovCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIG1hcAlyb3dzICogY29scyAqIGJhbmtzIHRvIGEgbW9kZQorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJc3dpdGNoIChyb3cpIHsKKwljYXNlIDExOgorCQlzd2l0Y2ggKGNvbCkgeworCQljYXNlIDg6CisJCQltb2RlPTQ7IC8qIG1vZGUgNSAqLworCQkJYnJlYWs7CisJCWNhc2UgOToKKwkJY2FzZSAxMDoKKwkJCW1vZGU9MDsgLyogbW9kZSAxICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNQRF9FUlIoIlNEUkFNIC0gdW5zdXBwb3J0ZWQgbW9kZVxuIik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJc3dpdGNoIChjb2wpIHsKKwkJY2FzZSA4OgorCQkJbW9kZT0zOyAvKiBtb2RlIDQgKi8KKwkJCWJyZWFrOworCQljYXNlIDk6CisJCWNhc2UgMTA6CisJCQltb2RlPTE7IC8qIG1vZGUgMiAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTUERfRVJSKCJTRFJBTSAtIHVuc3VwcG9ydGVkIG1vZGVcbiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgMTM6CisJCXN3aXRjaCAoY29sKSB7CisJCWNhc2UgODoKKwkJCW1vZGU9NTsgLyogbW9kZSA2ICovCisJCQlicmVhazsKKwkJY2FzZSA5OgorCQljYXNlIDEwOgorCQkJaWYgKHJlYWRfc3BkKDE3KSA9PSAyKQorCQkJCW1vZGUgPSA2OyAvKiBtb2RlIDcgKi8KKwkJCWVsc2UKKwkJCQltb2RlID0gMjsgLyogbW9kZSAzICovCisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCW1vZGUgPSAyOyAvKiBtb2RlIDMgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU1BEX0VSUigiU0RSQU0gLSB1bnN1cHBvcnRlZCBtb2RlXG4iKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlTUERfRVJSKCJTRFJBTSAtIHVuc3VwcG9ydGVkIG1vZGVcbiIpOworCX0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogdXNpbmcgdGhlIGNhbGN1bGF0ZWQgdmFsdWVzLCBjb21wdXRlIHRoZSBiYW5rCisJICogY29uZmlnIHJlZ2lzdGVyIHZhbHVlcy4KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlzZHJhbTBfYjFjciA9IDA7CisJc2RyYW0wX2IyY3IgPSAwOworCXNkcmFtMF9iM2NyID0gMDsKKworCS8qIGNvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCBiYW5rICovCisJYmFua19zaXplID0gdG90YWxfc2l6ZSAvIGJhbmtfY250OworCS8qIGNvbnZlcnQgYmFuayBzaXplIHRvIGJhbmsgc2l6ZSBjb2RlIGZvciBwcGM0eHgKKwkgICBieSB0YWtlaW5nIGxvZzIoYmFua19zaXplKSAtIDIyICovCisJdG1wID0gYmFua19zaXplOwkJLyogc3RhcnQgd2l0aCB0bXAgPSBiYW5rX3NpemUgKi8KKwliYW5rX2NvZGUgPSAwOwkJCS8qIGFuZCBiYW5rX2NvZGUgPSAwICovCisJd2hpbGUgKHRtcCA+IDEpIHsJCS8qIHRoaXMgdGFrZXMgbG9nMiBvZiB0bXAgKi8KKwkJYmFua19jb2RlKys7CQkvKiBhbmQgc3RvcmVzIHJlc3VsdCBpbiBiYW5rX2NvZGUgKi8KKwkJdG1wID0gdG1wID4+IDE7CisJfQkJCQkvKiBiYW5rX2NvZGUgaXMgbm93IGxvZzIoYmFua19zaXplKSAqLworCWJhbmtfY29kZSAtPSAyMjsJCS8qIHN1YnRyYWN0IDIyIHRvIGdldCB0aGUgY29kZSAqLworCisJdG1wID0gU0RSQU0wX0JYQ1JfU1ooYmFua19jb2RlKSB8IFNEUkFNMF9CWENSX0FNKG1vZGUpIHwgMTsKKwlzZHJhbTBfYjBjciA9IChiYW5rX3NpemUgKiAwKSB8IHRtcDsKKyNpZm5kZWYgQ09ORklHXzQwNUVQIC8qIG5vdCBvbiBQUEM0MDVFUCAqLworCWlmIChiYW5rX2NudCA+IDEpCisJCXNkcmFtMF9iMmNyID0gKGJhbmtfc2l6ZSAqIDEpIHwgdG1wOworCWlmIChiYW5rX2NudCA+IDIpCisJCXNkcmFtMF9iMWNyID0gKGJhbmtfc2l6ZSAqIDIpIHwgdG1wOworCWlmIChiYW5rX2NudCA+IDMpCisJCXNkcmFtMF9iM2NyID0gKGJhbmtfc2l6ZSAqIDMpIHwgdG1wOworI2Vsc2UKKwkvKiBQUEM0MDVFUCBjaGlwIG9ubHkgc3VwcG9ydHMgdHdvIFNEUkFNIGJhbmtzICovCisJaWYgKGJhbmtfY250ID4gMSkKKwkJc2RyYW0wX2IxY3IgPSAoYmFua19zaXplICogMSkgfCB0bXA7CisJaWYgKGJhbmtfY250ID4gMikKKwkJdG90YWxfc2l6ZSA9IDIgKiBiYW5rX3NpemU7CisjZW5kaWYKKworCS8qCisJICogICBlbmFibGUgc2RyYW0gY29udHJvbGxlciBEQ0U9MQorCSAqICBlbmFibGUgYnVyc3QgcmVhZCBwcmVmZXRjaCB0byAzMiBieXRlcyBCUlBGPTIKKwkgKiAgbGVhdmUgb3RoZXIgZnVuY3Rpb25zIG9mZgorCSAqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBub3cgdGhhdCB3ZSd2ZSBkb25lIG91ciBjYWxjdWxhdGlvbnMsIHdlIGFyZSByZWFkeSB0bworCSAqIHByb2dyYW0gYWxsIHRoZSByZWdpc3RlcnMuCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBkaXNhYmxlIG1lbWNvbnRyb2xsZXIgc28gdXBkYXRlcyB3b3JrICovCisJbXRzZHJhbShTRFJBTTBfQ0ZHLCAwKTsKKworI2lmbmRlZiBDT05GSUdfNDA1RVAgLyogbm90IG9uIFBQQzQwNUVQICovCisJbXRzZHJhbShTRFJBTTBfQkVTUjAsIHNkcmFtMF9iZXNyMCk7CisJbXRzZHJhbShTRFJBTTBfQkVTUjEsIHNkcmFtMF9iZXNyMSk7CisJbXRzZHJhbShTRFJBTTBfRUNDQ0ZHLCBzZHJhbTBfZWNjY2ZnKTsKKwltdHNkcmFtKFNEUkFNMF9FQ0NFU1IsIHNkcmFtMF9lY2Nlc3IpOworI2VuZGlmCisJbXRzZHJhbShTRFJBTTBfUlRSLCBzZHJhbTBfcnRyKTsKKwltdHNkcmFtKFNEUkFNMF9QTUlULCBzZHJhbTBfcG1pdCk7CisJbXRzZHJhbShTRFJBTTBfQjBDUiwgc2RyYW0wX2IwY3IpOworCW10c2RyYW0oU0RSQU0wX0IxQ1IsIHNkcmFtMF9iMWNyKTsKKyNpZm5kZWYgQ09ORklHXzQwNUVQIC8qIG5vdCBvbiBQUEM0MDVFUCAqLworCW10c2RyYW0oU0RSQU0wX0IyQ1IsIHNkcmFtMF9iMmNyKTsKKwltdHNkcmFtKFNEUkFNMF9CM0NSLCBzZHJhbTBfYjNjcik7CisjZW5kaWYKKwltdHNkcmFtKFNEUkFNMF9UUiwgc2RyYW0wX3RyKTsKKworCS8qIFNEUkFNIGhhdmUgYSBwb3dlciBvbiBkZWxheSwJIDUwMCBtaWNybyBzaG91bGQgZG8gKi8KKwl1ZGVsYXkoNTAwKTsKKwlzZHJhbTBfY2ZnID0gU0RSQU0wX0NGR19EQ0UgfCBTRFJBTTBfQ0ZHX0JSUEYoMSkgfCBTRFJBTTBfQ0ZHX0VDQ0REIHwgU0RSQU0wX0NGR19FTURVTFI7CisJaWYgKGVjY19vbikKKwkJc2RyYW0wX2NmZyB8PSBTRFJBTTBfQ0ZHX01FTUNISzsKKwltdHNkcmFtKFNEUkFNMF9DRkcsIHNkcmFtMF9jZmcpOworCisJcmV0dXJuICh0b3RhbF9zaXplKTsKK30KKworaW50IHNwZF9yZWFkKHVpbnQgYWRkcikKK3sKKwl1Y2hhciBkYXRhWzJdOworCisJaWYgKGkyY19yZWFkKFNQRF9FRVBST01fQUREUkVTUywgYWRkciwgMSwgZGF0YSwgMSkgPT0gMCkKKwkJcmV0dXJuIChpbnQpZGF0YVswXTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1NQRF9FRVBST00gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4LzQ0eF9zcGRfZGRyLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80NHhfc3BkX2Rkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTMxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80NHhfc3BkX2Rkci5jCkBAIC0wLDAgKzEsMTI0OCBAQAorLyoKKyAqIGFyY2gvcG93ZXJwYy9jcHUvcHBjNHh4LzQ0eF9zcGRfZGRyLmMKKyAqIFRoaXMgU1BEIEREUiBkZXRlY3Rpb24gY29kZSBzdXBwb3J0cyBJQk0vQU1DQyBQUEM0NHggY3B1IHdpdGggYQorICogRERSIGNvbnRyb2xsZXIuIFRob3NlIGFyZSA0NDBHUC9HWC9FUC9HUi4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEJpbGwgSHVudGVyLCBXYXZlIDcgT3B0aWNzLCB3aWxsaWFtaHVudGVyQGF0dGJpLmNvbQorICoKKyAqIEJhc2VkIG9uIGNvZGUgYnk6CisgKgorICogS2VubmV0aCBKb2hhbnNzb24gLEVyaWNzc29uIEFCLgorICoga2VubmV0aC5qb2hhbnNzb25AZXR4LmVyaWNzc29uLnNlCisgKgorICogaGFja2VkIHVwIGJ5IGJpbGwgaHVudGVyLiBmaXhlZCBzbyB3ZSBjb3VsZCBydW4gYmVmb3JlCisgKiBzZXJpYWxfaW5pdCBhbmQgY29uc29sZV9pbml0LiBwcmV2aW91cyB2ZXJzaW9uIGF2b2lkZWQgdGhpcyBieQorICogcnVubmluZyBvdXQgb2YgY2FjaGUgbWVtb3J5IGR1cmluZyBzZXJpYWwvY29uc29sZSBpbml0LCB0aGVuIHJ1bm5pbmcKKyAqIHRoaXMgY29kZSBsYXRlci4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEp1biBHdSwgQXJ0ZXN5biBUZWNobm9sb2d5LCBqdW5nQGFydGVzeW5jcC5jb20KKyAqIFN1cHBvcnQgZm9yIEFNQ0MgNDQwIGJhc2VkIG9uIE9wZW5CSU9TIGRyYW1pbml0LmMgZnJvbSBJQk0uCisgKgorICogKEMpIENvcHlyaWdodCAyMDA1LTIwMDcKKyAqIFN0ZWZhbiBSb2VzZSwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgc3JAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBkZWZpbmUgREVCVUcgZm9yIGRlYnVnZ2luZyBvdXRwdXQgKG9idmlvdXNseSA7LSkpICovCisjaWYgMAorI2RlZmluZSBERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8aTJjLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisjaW5jbHVkZSAiZWNjLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKSAmJgkJCQkJXAorCShkZWZpbmVkKENPTkZJR180NDBHUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1gpIHx8CQlcCisJIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikpCisKKy8qCisgKiBTZXQgZGVmYXVsdCB2YWx1ZXMKKyAqLworI2lmbmRlZiBDT05GSUdfU1lTX0kyQ19TUEVFRAorI2RlZmluZSBDT05GSUdfU1lTX0kyQ19TUEVFRAk1MDAwMAorI2VuZGlmCisKKyNkZWZpbmUgT05FX0JJTExJT04JMTAwMDAwMDAwMAorCisvKgorICogQm9hcmQtc3BlY2lmaWMgUGxhdGZvcm0gY29kZSBjYW4gcmVpbXBsZW1lbnQgc3BkX2Rkcl9pbml0X2hhbmcgKCkgaWYgbmVlZGVkCisgKi8KK3ZvaWQgX19zcGRfZGRyX2luaXRfaGFuZyAodm9pZCkKK3sKKwloYW5nICgpOworfQordm9pZCBzcGRfZGRyX2luaXRfaGFuZyAodm9pZCkgX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fc3BkX2Rkcl9pbml0X2hhbmciKSkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8ICBHZW5lcmFsIERlZmluaXRpb24KKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgREVGQVVMVF9TUERfQUREUjEJMHg1MworI2RlZmluZSBERUZBVUxUX1NQRF9BRERSMgkweDUyCisjZGVmaW5lIE1BWEJBTktTCQk0CQkvKiBhdCBtb3N0IDQgZGltbSBiYW5rcyAqLworI2RlZmluZSBNQVhfU1BEX0JZVEVTCQkyNTYKKyNkZWZpbmUgTlVNSEFMRkNZQ0xFUwkJNAorI2RlZmluZSBOVU1NRU1URVNUUwkJOAorI2RlZmluZSBOVU1NRU1XT1JEUwkJOAorI2RlZmluZSBNQVhCWENSCQkJNAorI2RlZmluZSBUUlVFCQkJMQorI2RlZmluZSBGQUxTRQkJCTAKKworLyoKKyAqIFRoaXMgRERSMiBzZXR1cCBjb2RlIGNhbiBkeW5hbWljYWxseSBzZXR1cCB0aGUgVExCIGVudHJpZXMgZm9yIHRoZSBERFIyIG1lbW9yeQorICogcmVnaW9uLiBSaWdodCBub3cgdGhlIGNhY2hlIHNob3VsZCBzdGlsbCBiZSBkaXNhYmxlZCBpbiBVLUJvb3QgYmVjYXVzZSBvZiB0aGUKKyAqIEVNQUMgZHJpdmVyLCB0aGF0IG5lZWQgaXQncyBidWZmZXIgZGVzY3JpcHRvciB0byBiZSBsb2NhdGVkIGluIG5vbiBjYWNoZWQKKyAqIG1lbW9yeS4KKyAqCisgKiBJZiBhdCBzb21lIHRpbWUgdGhpcyByZXN0cmljdGlvbiBkb2Vzbid0IGFwcGx5IGFueW1vcmUsIGp1c3QgZGVmaW5lCisgKiBDT05GSUdfNHh4X0RDQUNIRSBpbiB0aGUgYm9hcmQgY29uZmlnIGZpbGUgYW5kIHRoaXMgY29kZSBzaG91bGQgc2V0dXAKKyAqIGV2ZXJ5dGhpbmcgY29ycmVjdGx5LgorICovCisjaWZkZWYgQ09ORklHXzR4eF9EQ0FDSEUKKyNkZWZpbmUgTVlfVExCX1dPUkQyX0lfRU5BQkxFCTAJCQkvKiBlbmFibGUgY2FjaGluZyBvbiBTRFJBTSAqLworI2Vsc2UKKyNkZWZpbmUgTVlfVExCX1dPUkQyX0lfRU5BQkxFCVRMQl9XT1JEMl9JX0VOQUJMRQkvKiBkaXNhYmxlIGNhY2hpbmcgb24gU0RSQU0gKi8KKyNlbmRpZgorCisvKiBiYW5rX3Bhcm1zIGlzIHVzZWQgdG8gc29ydCB0aGUgYmFuayBzaXplcyBieSBkZXNjZW5kaW5nIG9yZGVyICovCitzdHJ1Y3QgYmFua19wYXJhbSB7CisJdW5zaWduZWQgbG9uZyBjcjsKKwl1bnNpZ25lZCBsb25nIGJhbmtfc2l6ZV9ieXRlczsKK307CisKK3R5cGVkZWYgc3RydWN0IGJhbmtfcGFyYW0gQkFOS1BBUk1TOworCisjaWZkZWYgQ09ORklHX1NZU19TSU1VTEFURV9TUERfRUVQUk9NCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBjZmdfc2ltdWxhdGVfc3BkX2VlcHJvbVsxMjhdOworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNwZF9yZWFkKHVjaGFyIGNoaXAsIHVpbnQgYWRkcik7CitzdGF0aWMgdm9pZCBnZXRfc3BkX2luZm8odW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcyk7CitzdGF0aWMgdm9pZCBjaGVja19tZW1fdHlwZSh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJICAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcyk7CitzdGF0aWMgdm9pZCBjaGVja192b2x0X3R5cGUodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgICAgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgICAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcyk7CitzdGF0aWMgdm9pZCBwcm9ncmFtX2NmZzAodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyAgbnVtX2RpbW1fYmFua3MpOworc3RhdGljIHZvaWQgcHJvZ3JhbV9jZmcxKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpOworc3RhdGljIHZvaWQgcHJvZ3JhbV9ydHIodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQl1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCXVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpOworc3RhdGljIHZvaWQgcHJvZ3JhbV90cjAodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQl1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCXVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpOworc3RhdGljIHZvaWQgcHJvZ3JhbV90cjEodm9pZCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHByb2dyYW1fYnhjcih1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJCSAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcyk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBESU1NIG1vZHVsZSBFRVBST00gb3ZlciB0aGUgU1BEIGJ1cworICogYW5kIHVzZXMgdGhhdCB0byBwcm9ncmFtIHRoZSBzZHJhbSBjb250cm9sbGVyLgorICoKKyAqIFRoaXMgd29ya3Mgb24gYm9hcmRzIHRoYXQgaGFzIHRoZSBzYW1lIHNjaGVtYXRpY3MgdGhhdCB0aGUgQU1DQyB3YWxudXQgaGFzLgorICoKKyAqIEJVRzogRG9uJ3QgaGFuZGxlIEVDQyBtZW1vcnkKKyAqIEJVRzogQSBmZXcgdmFsdWVzIGluIHRoZSBUUiByZWdpc3RlciBpcyBjdXJyZW50bHkgaGFyZGNvZGVkCisgKi8KK2xvbmcgaW50IHNwZF9zZHJhbSh2b2lkKSB7CisJdW5zaWduZWQgY2hhciBpaWMwX2RpbW1fYWRkcltdID0gU1BEX0VFUFJPTV9BRERSRVNTOworCXVuc2lnbmVkIGxvbmcgZGltbV9wb3B1bGF0ZWRbc2l6ZW9mKGlpYzBfZGltbV9hZGRyKV07CisJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOworCXVuc2lnbmVkIGxvbmcgY2ZnMDsKKwl1bnNpZ25lZCBsb25nIG1jc3RzOworCXVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3M7CQkgICAgLyogb24gYm9hcmQgZGltbSBiYW5rcyAqLworCisJbnVtX2RpbW1fYmFua3MgPSBzaXplb2YoaWljMF9kaW1tX2FkZHIpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgSTJDIGNvbnRyb2xsZXIgaXMgaW5pdGlhbGl6ZWQKKwkgKiBiZWZvcmUgY29udGludWluZy4KKwkgKi8KKwlpMmNfaW5pdChDT05GSUdfU1lTX0kyQ19TUEVFRCwgQ09ORklHX1NZU19JMkNfU0xBVkUpOworCisJLyoKKwkgKiBSZWFkIHRoZSBTUEQgaW5mb3JtYXRpb24gdXNpbmcgSTJDIGludGVyZmFjZS4gQ2hlY2sgdG8gc2VlIGlmIHRoZQorCSAqIERJTU0gc2xvdHMgYXJlIHBvcHVsYXRlZC4KKwkgKi8KKwlnZXRfc3BkX2luZm8oZGltbV9wb3B1bGF0ZWQsIGlpYzBfZGltbV9hZGRyLCBudW1fZGltbV9iYW5rcyk7CisKKwkvKgorCSAqIENoZWNrIHRoZSBtZW1vcnkgdHlwZSBmb3IgdGhlIGRpbW1zIHBsdWdnZWQuCisJICovCisJY2hlY2tfbWVtX3R5cGUoZGltbV9wb3B1bGF0ZWQsIGlpYzBfZGltbV9hZGRyLCBudW1fZGltbV9iYW5rcyk7CisKKwkvKgorCSAqIENoZWNrIHRoZSB2b2x0YWdlIHR5cGUgZm9yIHRoZSBkaW1tcyBwbHVnZ2VkLgorCSAqLworCWNoZWNrX3ZvbHRfdHlwZShkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1IpCisJLyoKKwkgKiBTb2Z0LXJlc2V0IFNEUkFNIGNvbnRyb2xsZXIuCisJICovCisJbXRzZHIoU0RSMF9TUlNULCBTRFIwX1NSU1RfRE1DKTsKKwltdHNkcihTRFIwX1NSU1QsIDB4MDAwMDAwMDApOworI2VuZGlmCisKKwkvKgorCSAqIHByb2dyYW0gNDQwR1AgU0RSQU0gY29udHJvbGxlciBvcHRpb25zIChTRFJBTTBfQ0ZHMCkKKwkgKi8KKwlwcm9ncmFtX2NmZzAoZGltbV9wb3B1bGF0ZWQsIGlpYzBfZGltbV9hZGRyLCBudW1fZGltbV9iYW5rcyk7CisKKwkvKgorCSAqIHByb2dyYW0gNDQwR1AgU0RSQU0gY29udHJvbGxlciBvcHRpb25zIChTRFJBTTBfQ0ZHMSkKKwkgKi8KKwlwcm9ncmFtX2NmZzEoZGltbV9wb3B1bGF0ZWQsIGlpYzBfZGltbV9hZGRyLCBudW1fZGltbV9iYW5rcyk7CisKKwkvKgorCSAqIHByb2dyYW0gU0RSQU0gcmVmcmVzaCByZWdpc3RlciAoU0RSQU0wX1JUUikKKwkgKi8KKwlwcm9ncmFtX3J0cihkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qCisJICogcHJvZ3JhbSBTRFJBTSBUaW1pbmcgUmVnaXN0ZXIgMCAoU0RSQU0wX1RSMCkKKwkgKi8KKwlwcm9ncmFtX3RyMChkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qCisJICogcHJvZ3JhbSB0aGUgQnhDUiByZWdpc3RlcnMgdG8gZmluZCBvdXQgdG90YWwgc2RyYW0gaW5zdGFsbGVkCisJICovCisJdG90YWxfc2l6ZSA9IHByb2dyYW1fYnhjcihkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsCisJCQkJICBudW1fZGltbV9iYW5rcyk7CisKKyNpZmRlZiBDT05GSUdfUFJPR19TRFJBTV9UTEIgLyogdGhpcyBkZWZpbmUgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZCAqLworCS8qIGFuZCBwcm9ncmFtIHRsYiBlbnRyaWVzIGZvciB0aGlzIHNpemUgKGR5bmFtaWMpICovCisJcHJvZ3JhbV90bGIoMCwgMCwgdG90YWxfc2l6ZSwgTVlfVExCX1dPUkQyX0lfRU5BQkxFKTsKKyNlbmRpZgorCisJLyoKKwkgKiBwcm9ncmFtIFNEUkFNIENsb2NrIFRpbWluZyBSZWdpc3RlciAoU0RSQU0wX0NMS1RSKQorCSAqLworCW10c2RyYW0oU0RSQU0wX0NMS1RSLCAweDQwMDAwMDAwKTsKKworCS8qCisJICogZGVsYXkgdG8gZW5zdXJlIDIwMCB1c2VjIGhhcyBlbGFwc2VkCisJICovCisJdWRlbGF5KDQwMCk7CisKKwkvKgorCSAqIGVuYWJsZSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIKKwkgKi8KKwltZnNkcmFtKFNEUkFNMF9DRkcwLCBjZmcwKTsKKwltdHNkcmFtKFNEUkFNMF9DRkcwLCBjZmcwIHwgU0RSQU1fQ0ZHMF9EQ0VOKTsKKworCS8qCisJICogd2FpdCBmb3IgU0RSQU1fQ0ZHMF9EQ19FTiB0byBjb21wbGV0ZQorCSAqLworCXdoaWxlICgxKSB7CisJCW1mc2RyYW0oU0RSQU0wX01DU1RTLCBtY3N0cyk7CisJCWlmICgobWNzdHMgJiBTRFJBTV9NQ1NUU19NUlNDKSAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBwcm9ncmFtIFNEUkFNIFRpbWluZyBSZWdpc3RlciAxLCBhZGRpbmcgc29tZSBkZWxheXMKKwkgKi8KKwlwcm9ncmFtX3RyMSgpOworCisjaWZkZWYgQ09ORklHX0REUl9FQ0MKKwkvKgorCSAqIElmIGVjYyBpcyBlbmFibGVkLCBpbml0aWFsaXplIHRoZSBwYXJpdHkgYml0cy4KKwkgKi8KKwllY2NfaW5pdChDT05GSUdfU1lTX1NEUkFNX0JBU0UsIHRvdGFsX3NpemUpOworI2VuZGlmCisKKwlyZXR1cm4gdG90YWxfc2l6ZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3BkX3JlYWQodWNoYXIgY2hpcCwgdWludCBhZGRyKQoreworCXVuc2lnbmVkIGNoYXIgZGF0YVsyXTsKKworI2lmZGVmIENPTkZJR19TWVNfU0lNVUxBVEVfU1BEX0VFUFJPTQorCWlmIChjaGlwID09IENPTkZJR19TWVNfU0lNVUxBVEVfU1BEX0VFUFJPTSkgeworCQkvKgorCQkgKiBPbmJvYXJkIHNwZCBlZXByb20gcmVxdWVzdGVkIC0+IHNpbXVsYXRlIHZhbHVlcworCQkgKi8KKwkJcmV0dXJuIGNmZ19zaW11bGF0ZV9zcGRfZWVwcm9tW2FkZHJdOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU1lTX1NJTVVMQVRFX1NQRF9FRVBST00gKi8KKworCWlmIChpMmNfcHJvYmUoY2hpcCkgPT0gMCkgeworCQlpZiAoaTJjX3JlYWQoY2hpcCwgYWRkciwgMSwgZGF0YSwgMSkgPT0gMCkgeworCQkJcmV0dXJuIGRhdGFbMF07CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X3NwZF9pbmZvKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBsb25nIGRpbW1fZm91bmQ7CisJdW5zaWduZWQgY2hhciBudW1fb2ZfYnl0ZXM7CisJdW5zaWduZWQgY2hhciB0b3RhbF9zaXplOworCisJZGltbV9mb3VuZCA9IEZBTFNFOworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCW51bV9vZl9ieXRlcyA9IDA7CisJCXRvdGFsX3NpemUgPSAwOworCisJCW51bV9vZl9ieXRlcyA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMCk7CisJCXRvdGFsX3NpemUgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDEpOworCisJCWlmICgobnVtX29mX2J5dGVzICE9IDApICYmICh0b3RhbF9zaXplICE9IDApKSB7CisJCQlkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gPSBUUlVFOworCQkJZGltbV9mb3VuZCA9IFRSVUU7CisJCQlkZWJ1ZygiRElNTSBzbG90ICVsdTogcG9wdWxhdGVkXG4iLCBkaW1tX251bSk7CisJCX0gZWxzZSB7CisJCQlkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gPSBGQUxTRTsKKwkJCWRlYnVnKCJESU1NIHNsb3QgJWx1OiBOb3QgcG9wdWxhdGVkXG4iLCBkaW1tX251bSk7CisJCX0KKwl9CisKKwlpZiAoZGltbV9mb3VuZCA9PSBGQUxTRSkgeworCQlwcmludGYoIkVSUk9SIC0gTm8gbWVtb3J5IGluc3RhbGxlZC4gSW5zdGFsbCBhIEREUi1TRFJBTSBESU1NLlxuXG4iKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19tZW1fdHlwZSh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJICAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGNoYXIgZGltbV90eXBlOworCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSA9PSBUUlVFKSB7CisJCQlkaW1tX3R5cGUgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDIpOworCQkJc3dpdGNoIChkaW1tX3R5cGUpIHsKKwkJCWNhc2UgNzoKKwkJCQlkZWJ1ZygiRElNTSBzbG90ICVsdTogRERSIFNEUkFNIGRldGVjdGVkXG4iLCBkaW1tX251bSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiRVJST1I6IFVuc3VwcG9ydGVkIERJTU0gZGV0ZWN0ZWQgaW4gc2xvdCAlbHUuXG4iLAorCQkJCSAgICAgICBkaW1tX251bSk7CisJCQkJcHJpbnRmKCJPbmx5IEREUiBTRFJBTSBESU1NcyBhcmUgc3VwcG9ydGVkLlxuIik7CisJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGVja192b2x0X3R5cGUodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgICAgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgICAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgdm9sdGFnZV90eXBlOworCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSA9PSBUUlVFKSB7CisJCQl2b2x0YWdlX3R5cGUgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDgpOworCQkJaWYgKHZvbHRhZ2VfdHlwZSAhPSAweDA0KSB7CisJCQkJcHJpbnRmKCJFUlJPUjogRElNTSAlbHUgd2l0aCB1bnN1cHBvcnRlZCB2b2x0YWdlIGxldmVsLlxuIiwKKwkJCQkgICAgICAgZGltbV9udW0pOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCQkJfSBlbHNlIHsKKwkJCQlkZWJ1ZygiRElNTSAlbHUgdm9sdGFnZSBsZXZlbCBzdXBwb3J0ZWQuXG4iLCBkaW1tX251bSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcHJvZ3JhbV9jZmcwKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBsb25nIGNmZzA7CisJdW5zaWduZWQgbG9uZyBlY2NfZW5hYmxlZDsKKwl1bnNpZ25lZCBjaGFyIGVjYzsKKwl1bnNpZ25lZCBjaGFyIGF0dHJpYnV0ZXM7CisJdW5zaWduZWQgbG9uZyBkYXRhX3dpZHRoOworCXVuc2lnbmVkIGxvbmcgZGltbV8zMmJpdDsKKwl1bnNpZ25lZCBsb25nIGRpbW1fNjRiaXQ7CisKKwkvKgorCSAqIGdldCBNZW1vcnkgQ29udHJvbGxlciBPcHRpb25zIDAgZGF0YQorCSAqLworCW1mc2RyYW0oU0RSQU0wX0NGRzAsIGNmZzApOworCisJLyoKKwkgKiBjbGVhciBiaXRzCisJICovCisJY2ZnMCAmPSB+KFNEUkFNX0NGRzBfRENFTiB8IFNEUkFNX0NGRzBfTUNIS19NQVNLIHwKKwkJICBTRFJBTV9DRkcwX1JERU4gfCBTRFJBTV9DRkcwX1BNVUQgfAorCQkgIFNEUkFNX0NGRzBfRE1XRF9NQVNLIHwKKwkJICBTRFJBTV9DRkcwX1VJT1NfTUFTSyB8IFNEUkFNX0NGRzBfUERQKTsKKworCisJLyoKKwkgKiBGSVhNRTogYXNzdW1lIHRoZSBERFIgU0RSQU1zIGluIGJvdGggYmFua3MgYXJlIHRoZSBzYW1lCisJICovCisJZWNjX2VuYWJsZWQgPSBUUlVFOworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCWlmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gPT0gVFJVRSkgeworCQkJZWNjID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAxMSk7CisJCQlpZiAoZWNjICE9IDB4MDIpIHsKKwkJCQllY2NfZW5hYmxlZCA9IEZBTFNFOworCQkJfQorCisJCQkvKgorCQkJICogcHJvZ3JhbSBSZWdpc3RlcmVkIERJTU0gRW5hYmxlCisJCQkgKi8KKwkJCWF0dHJpYnV0ZXMgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDIxKTsKKwkJCWlmICgoYXR0cmlidXRlcyAmIDB4MDIpICE9IDB4MDApIHsKKwkJCQljZmcwIHw9IFNEUkFNX0NGRzBfUkRFTjsKKwkJCX0KKworCQkJLyoKKwkJCSAqIHByb2dyYW0gRERSIFNEUkFNIERhdGEgV2lkdGgKKwkJCSAqLworCQkJZGF0YV93aWR0aCA9CisJCQkJKHVuc2lnbmVkIGxvbmcpc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLDYpICsKKwkJCQkoKCh1bnNpZ25lZCBsb25nKXNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSw3KSkgPDwgOCk7CisJCQlpZiAoZGF0YV93aWR0aCA9PSA2NCB8fCBkYXRhX3dpZHRoID09IDcyKSB7CisJCQkJZGltbV82NGJpdCA9IFRSVUU7CisJCQkJY2ZnMCB8PSBTRFJBTV9DRkcwX0RNV0RfNjQ7CisJCQl9IGVsc2UgaWYgKGRhdGFfd2lkdGggPT0gMzIgfHwgZGF0YV93aWR0aCA9PSA0MCkgeworCQkJCWRpbW1fMzJiaXQgPSBUUlVFOworCQkJCWNmZzAgfD0gU0RSQU1fQ0ZHMF9ETVdEXzMyOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIldBUk5JTkc6IERJTU0gd2l0aCBkYXRhd2lkdGggb2YgJWx1IGJpdHMuXG4iLAorCQkJCSAgICAgICBkYXRhX3dpZHRoKTsKKwkJCQlwcmludGYoIk9ubHkgRElNTXMgd2l0aCAzMiBvciA2NCBiaXQgZGF0YXdpZHRocyBzdXBwb3J0ZWQuXG4iKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBwcm9ncmFtIE1lbW9yeSBEYXRhIEVycm9yIENoZWNraW5nCisJICovCisJaWYgKGVjY19lbmFibGVkID09IFRSVUUpIHsKKwkJY2ZnMCB8PSBTRFJBTV9DRkcwX01DSEtfR0VOOworCX0gZWxzZSB7CisJCWNmZzAgfD0gU0RSQU1fQ0ZHMF9NQ0hLX05PTjsKKwl9CisKKwkvKgorCSAqIHByb2dyYW0gUGFnZSBNYW5hZ2VtZW50IFVuaXQgKDAgPT0gZW5hYmxlZCkKKwkgKi8KKwljZmcwICY9IH5TRFJBTV9DRkcwX1BNVUQ7CisKKwkvKgorCSAqIHByb2dyYW0gTWVtb3J5IENvbnRyb2xsZXIgT3B0aW9ucyAwCisJICogTm90ZTogRENFTiBtdXN0IGJlIGVuYWJsZWQgYWZ0ZXIgYWxsIEREUiBTRFJBTSBjb250cm9sbGVyCisJICogY29uZmlndXJhdGlvbiByZWdpc3RlcnMgZ2V0IGluaXRpYWxpemVkLgorCSAqLworCW10c2RyYW0oU0RSQU0wX0NGRzAsIGNmZzApOworfQorCitzdGF0aWMgdm9pZCBwcm9ncmFtX2NmZzEodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGNmZzE7CisJbWZzZHJhbShTRFJBTTBfQ0ZHMSwgY2ZnMSk7CisKKwkvKgorCSAqIFNlbGYtcmVmcmVzaCBleGl0LCBkaXNhYmxlIFBNCisJICovCisJY2ZnMSAmPSB+KFNEUkFNX0NGRzFfU1JFIHwgU0RSQU1fQ0ZHMV9QTUVOKTsKKworCS8qCisJICogcHJvZ3JhbSBNZW1vcnkgQ29udHJvbGxlciBPcHRpb25zIDEKKwkgKi8KKwltdHNkcmFtKFNEUkFNMF9DRkcxLCBjZmcxKTsKK30KKworc3RhdGljIHZvaWQgcHJvZ3JhbV9ydHIodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQl1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCXVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBsb25nIGJ1c19wZXJpb2RfeF8xMDsKKwl1bnNpZ25lZCBsb25nIHJlZnJlc2hfcmF0ZSA9IDA7CisJdW5zaWduZWQgY2hhciByZWZyZXNoX3JhdGVfdHlwZTsKKwl1bnNpZ25lZCBsb25nIHJlZnJlc2hfaW50ZXJ2YWw7CisJdW5zaWduZWQgbG9uZyBzZHJhbV9ydHI7CisJUFBDNHh4X1NZU19JTkZPIHN5c19pbmZvOworCisJLyoKKwkgKiBnZXQgdGhlIGJvYXJkIGluZm8KKwkgKi8KKwlnZXRfc3lzX2luZm8oJnN5c19pbmZvKTsKKwlidXNfcGVyaW9kX3hfMTAgPSBPTkVfQklMTElPTiAvIChzeXNfaW5mby5mcmVxUExCIC8gMTApOworCisJZm9yIChkaW1tX251bSA9IDA7ICBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCWlmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gPT0gVFJVRSkgeworCQkJcmVmcmVzaF9yYXRlX3R5cGUgPSAweDdGICYgc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAxMik7CisJCQlzd2l0Y2ggKHJlZnJlc2hfcmF0ZV90eXBlKSB7CisJCQljYXNlIDB4MDA6CisJCQkJcmVmcmVzaF9yYXRlID0gMTU2MjU7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDE6CisJCQkJcmVmcmVzaF9yYXRlID0gMTU2MjUvNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMjoKKwkJCQlyZWZyZXNoX3JhdGUgPSAxNTYyNS8yOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAzOgorCQkJCXJlZnJlc2hfcmF0ZSA9IDE1NjI2KjI7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDQ6CisJCQkJcmVmcmVzaF9yYXRlID0gMTU2MjUqNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwNToKKwkJCQlyZWZyZXNoX3JhdGUgPSAxNTYyNSo4OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIkVSUk9SOiBESU1NICVsdSwgdW5zdXBwb3J0ZWQgcmVmcmVzaCByYXRlL3R5cGUuXG4iLAorCQkJCSAgICAgICBkaW1tX251bSk7CisJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZWZyZXNoX2ludGVydmFsID0gcmVmcmVzaF9yYXRlICogMTAgLyBidXNfcGVyaW9kX3hfMTA7CisJc2RyYW1fcnRyID0gKHJlZnJlc2hfaW50ZXJ2YWwgJiAweDNmZjgpIDw8ICAxNjsKKworCS8qCisJICogcHJvZ3JhbSBSZWZyZXNoIFRpbWVyIFJlZ2lzdGVyIChTRFJBTTBfUlRSKQorCSAqLworCW10c2RyYW0oU0RSQU0wX1JUUiwgc2RyYW1fcnRyKTsKK30KKworc3RhdGljIHZvaWQgcHJvZ3JhbV90cjAodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgdHIwOworCXVuc2lnbmVkIGNoYXIgd2NzYmM7CisJdW5zaWduZWQgY2hhciB0X3JwX25zOworCXVuc2lnbmVkIGNoYXIgdF9yY2RfbnM7CisJdW5zaWduZWQgY2hhciB0X3Jhc19uczsKKwl1bnNpZ25lZCBsb25nIHRfcnBfY2xrOworCXVuc2lnbmVkIGxvbmcgdF9yYXNfcmNkX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfcmNkX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfcmZjX2NsazsKKwl1bnNpZ25lZCBsb25nIHBsYl9jaGVjazsKKwl1bnNpZ25lZCBjaGFyIGNhc19iaXQ7CisJdW5zaWduZWQgbG9uZyBjYXNfaW5kZXg7CisJdW5zaWduZWQgY2hhciBjYXNfMl8wX2F2YWlsYWJsZTsKKwl1bnNpZ25lZCBjaGFyIGNhc18yXzVfYXZhaWxhYmxlOworCXVuc2lnbmVkIGNoYXIgY2FzXzNfMF9hdmFpbGFibGU7CisJdW5zaWduZWQgbG9uZyBjeWNsZV90aW1lX25zX3hfMTBbM107CisJdW5zaWduZWQgbG9uZyB0Y3ljXzNfMF9uc194XzEwOworCXVuc2lnbmVkIGxvbmcgdGN5Y18yXzVfbnNfeF8xMDsKKwl1bnNpZ25lZCBsb25nIHRjeWNfMl8wX25zX3hfMTA7CisJdW5zaWduZWQgbG9uZyB0Y3ljX3JlZzsKKwl1bnNpZ25lZCBsb25nIGJ1c19wZXJpb2RfeF8xMDsKKwlQUEM0eHhfU1lTX0lORk8gc3lzX2luZm87CisJdW5zaWduZWQgbG9uZyByZXNpZHVlOworCisJLyoKKwkgKiBnZXQgdGhlIGJvYXJkIGluZm8KKwkgKi8KKwlnZXRfc3lzX2luZm8oJnN5c19pbmZvKTsKKwlidXNfcGVyaW9kX3hfMTAgPSBPTkVfQklMTElPTiAvIChzeXNfaW5mby5mcmVxUExCIC8gMTApOworCisJLyoKKwkgKiBnZXQgU0RSQU0gVGltaW5nIFJlZ2lzdGVyIDAgKFNEUkFNX1RSMCkgYW5kIGNsZWFyIGJpdHMKKwkgKi8KKwltZnNkcmFtKFNEUkFNMF9UUjAsIHRyMCk7CisJdHIwICY9IH4oU0RSQU1fVFIwX1NEV1JfTUFTSyB8IFNEUkFNX1RSMF9TRFdEX01BU0sgfAorCQkgU0RSQU1fVFIwX1NEQ0xfTUFTSyB8IFNEUkFNX1RSMF9TRFBBX01BU0sgfAorCQkgU0RSQU1fVFIwX1NEQ1BfTUFTSyB8IFNEUkFNX1RSMF9TRExEX01BU0sgfAorCQkgU0RSQU1fVFIwX1NEUkFfTUFTSyB8IFNEUkFNX1RSMF9TRFJEX01BU0spOworCisJLyoKKwkgKiBpbml0aWFsaXphdGlvbgorCSAqLworCXdjc2JjID0gMDsKKwl0X3JwX25zID0gMDsKKwl0X3JjZF9ucyA9IDA7CisJdF9yYXNfbnMgPSAwOworCWNhc18yXzBfYXZhaWxhYmxlID0gVFJVRTsKKwljYXNfMl81X2F2YWlsYWJsZSA9IFRSVUU7CisJY2FzXzNfMF9hdmFpbGFibGUgPSBUUlVFOworCXRjeWNfMl8wX25zX3hfMTAgPSAwOworCXRjeWNfMl81X25zX3hfMTAgPSAwOworCXRjeWNfM18wX25zX3hfMTAgPSAwOworCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSA9PSBUUlVFKSB7CisJCQl3Y3NiYyA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMTUpOworCQkJdF9ycF9ucwkgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDI3KSA+PiAyOworCQkJdF9yY2RfbnMgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDI5KSA+PiAyOworCQkJdF9yYXNfbnMgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDMwKTsKKwkJCWNhc19iaXQgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDE4KTsKKworCQkJZm9yIChjYXNfaW5kZXggPSAwOyBjYXNfaW5kZXggPCAzOyBjYXNfaW5kZXgrKykgeworCQkJCXN3aXRjaCAoY2FzX2luZGV4KSB7CisJCQkJY2FzZSAwOgorCQkJCQl0Y3ljX3JlZyA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgOSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMToKKwkJCQkJdGN5Y19yZWcgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDIzKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdGN5Y19yZWcgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDI1KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKCh0Y3ljX3JlZyAmIDB4MEYpID49IDEwKSB7CisJCQkJCXByaW50ZigiRVJST1I6IFRjeWMgaW5jb3JyZWN0IGZvciBESU1NIGluIHNsb3QgJWx1XG4iLAorCQkJCQkgICAgICAgZGltbV9udW0pOworCQkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJCQl9CisKKwkJCQljeWNsZV90aW1lX25zX3hfMTBbY2FzX2luZGV4XSA9CisJCQkJCSgoKHRjeWNfcmVnICYgMHhGMCkgPj4gNCkgKiAxMCkgKyAodGN5Y19yZWcgJiAweDBGKTsKKwkJCX0KKworCQkJY2FzX2luZGV4ID0gMDsKKworCQkJaWYgKChjYXNfYml0ICYgMHg4MCkgIT0gMCkgeworCQkJCWNhc19pbmRleCArPSAzOworCQkJfSBlbHNlIGlmICgoY2FzX2JpdCAmIDB4NDApICE9IDApIHsKKwkJCQljYXNfaW5kZXggKz0gMjsKKwkJCX0gZWxzZSBpZiAoKGNhc19iaXQgJiAweDIwKSAhPSAwKSB7CisJCQkJY2FzX2luZGV4ICs9IDE7CisJCQl9CisKKwkJCWlmICgoKGNhc19iaXQgJiAweDEwKSAhPSAwKSAmJiAoY2FzX2luZGV4IDwgMykpIHsKKwkJCQl0Y3ljXzNfMF9uc194XzEwID0gY3ljbGVfdGltZV9uc194XzEwW2Nhc19pbmRleF07CisJCQkJY2FzX2luZGV4Kys7CisJCQl9IGVsc2UgeworCQkJCWlmIChjYXNfaW5kZXggIT0gMCkgeworCQkJCQljYXNfaW5kZXgrKzsKKwkJCQl9CisJCQkJY2FzXzNfMF9hdmFpbGFibGUgPSBGQUxTRTsKKwkJCX0KKworCQkJaWYgKCgoY2FzX2JpdCAmIDB4MDgpICE9IDApIHx8IChjYXNfaW5kZXggPCAzKSkgeworCQkJCXRjeWNfMl81X25zX3hfMTAgPSBjeWNsZV90aW1lX25zX3hfMTBbY2FzX2luZGV4XTsKKwkJCQljYXNfaW5kZXgrKzsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNhc19pbmRleCAhPSAwKSB7CisJCQkJCWNhc19pbmRleCsrOworCQkJCX0KKwkJCQljYXNfMl81X2F2YWlsYWJsZSA9IEZBTFNFOworCQkJfQorCisJCQlpZiAoKChjYXNfYml0ICYgMHgwNCkgIT0gMCkgfHwgKGNhc19pbmRleCA8IDMpKSB7CisJCQkJdGN5Y18yXzBfbnNfeF8xMCA9IGN5Y2xlX3RpbWVfbnNfeF8xMFtjYXNfaW5kZXhdOworCQkJCWNhc19pbmRleCsrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoY2FzX2luZGV4ICE9IDApIHsKKwkJCQkJY2FzX2luZGV4Kys7CisJCQkJfQorCQkJCWNhc18yXzBfYXZhaWxhYmxlID0gRkFMU0U7CisJCQl9CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBQcm9ncmFtIFNEX1dSIGFuZCBTRF9XQ1NCQyBmaWVsZHMKKwkgKi8KKwl0cjAgfD0gU0RSQU1fVFIwX1NEV1JfMl9DTEs7CQkgICAgLyogV3JpdGUgUmVjb3Zlcnk6IDIgQ0xLICovCisJc3dpdGNoICh3Y3NiYykgeworCWNhc2UgMDoKKwkJdHIwIHw9IFNEUkFNX1RSMF9TRFdEXzBfQ0xLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0cjAgfD0gU0RSQU1fVFIwX1NEV0RfMV9DTEs7CisJCWJyZWFrOworCX0KKworCS8qCisJICogUHJvZ3JhbSBTRF9DQVNMIGZpZWxkCisJICovCisJaWYgKChjYXNfMl8wX2F2YWlsYWJsZSA9PSBUUlVFKSAmJgorCSAgICAoYnVzX3BlcmlvZF94XzEwID49IHRjeWNfMl8wX25zX3hfMTApKSB7CisJCXRyMCB8PSBTRFJBTV9UUjBfU0RDTF8yXzBfQ0xLOworCX0gZWxzZSBpZiAoKGNhc18yXzVfYXZhaWxhYmxlID09IFRSVUUpICYmCisJCSAoYnVzX3BlcmlvZF94XzEwID49IHRjeWNfMl81X25zX3hfMTApKSB7CisJCXRyMCB8PSBTRFJBTV9UUjBfU0RDTF8yXzVfQ0xLOworCX0gZWxzZSBpZiAoKGNhc18zXzBfYXZhaWxhYmxlID09IFRSVUUpICYmCisJCSAoYnVzX3BlcmlvZF94XzEwID49IHRjeWNfM18wX25zX3hfMTApKSB7CisJCXRyMCB8PSBTRFJBTV9UUjBfU0RDTF8zXzBfQ0xLOworCX0gZWxzZSB7CisJCXByaW50ZigiRVJST1I6IE5vIHN1cHBvcnRlZCBDQVMgbGF0ZW5jeSB3aXRoIHRoZSBpbnN0YWxsZWQgRElNTXMuXG4iKTsKKwkJcHJpbnRmKCJPbmx5IENBUyBsYXRlbmNpZXMgb2YgMi4wLCAyLjUsIGFuZCAzLjAgYXJlIHN1cHBvcnRlZC5cbiIpOworCQlwcmludGYoIk1ha2Ugc3VyZSB0aGUgUExCIHNwZWVkIGlzIHdpdGhpbiB0aGUgc3VwcG9ydGVkIHJhbmdlLlxuIik7CisJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIFRycCBpbiBjbG9jayBjeWNsZXMgYW5kIHJvdW5kIHVwIGlmIG5lY2Vzc2FyeQorCSAqIFByb2dyYW0gU0RfUFRBIGZpZWxkCisJICovCisJdF9ycF9jbGsgPSBzeXNfaW5mby5mcmVxUExCICogdF9ycF9ucyAvIE9ORV9CSUxMSU9OOworCXBsYl9jaGVjayA9IE9ORV9CSUxMSU9OICogdF9ycF9jbGsgLyB0X3JwX25zOworCWlmIChzeXNfaW5mby5mcmVxUExCICE9IHBsYl9jaGVjaykgeworCQl0X3JwX2NsaysrOworCX0KKwlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKXRfcnBfY2xrKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwljYXNlIDI6CisJCXRyMCB8PSBTRFJBTV9UUjBfU0RQQV8yX0NMSzsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl0cjAgfD0gU0RSQU1fVFIwX1NEUEFfM19DTEs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRyMCB8PSBTRFJBTV9UUjBfU0RQQV80X0NMSzsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBQcm9ncmFtIFNEX0NUUCBmaWVsZAorCSAqLworCXRfcmFzX3JjZF9jbGsgPSBzeXNfaW5mby5mcmVxUExCICogKHRfcmFzX25zIC0gdF9yY2RfbnMpIC8gT05FX0JJTExJT047CisJcGxiX2NoZWNrID0gT05FX0JJTExJT04gKiB0X3Jhc19yY2RfY2xrIC8gKHRfcmFzX25zIC0gdF9yY2RfbnMpOworCWlmIChzeXNfaW5mby5mcmVxUExCICE9IHBsYl9jaGVjaykgeworCQl0X3Jhc19yY2RfY2xrKys7CisJfQorCXN3aXRjaCAodF9yYXNfcmNkX2NsaykgeworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCQl0cjAgfD0gU0RSQU1fVFIwX1NEQ1BfMl9DTEs7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdHIwIHw9IFNEUkFNX1RSMF9TRENQXzNfQ0xLOworCQlicmVhazsKKwljYXNlIDQ6CisJCXRyMCB8PSBTRFJBTV9UUjBfU0RDUF80X0NMSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHIwIHw9IFNEUkFNX1RSMF9TRENQXzVfQ0xLOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFByb2dyYW0gU0RfTERGIGZpZWxkCisJICovCisJdHIwIHw9IFNEUkFNX1RSMF9TRExEXzJfQ0xLOworCisJLyoKKwkgKiBQcm9ncmFtIFNEX1JGVEEgZmllbGQKKwkgKiBGSVhNRSB0UkZDIGhhcmRjb2RlZCBhcyA3NSBuYW5vc2Vjb25kcworCSAqLworCXRfcmZjX2NsayA9IHN5c19pbmZvLmZyZXFQTEIgLyAoT05FX0JJTExJT04gLyA3NSk7CisJcmVzaWR1ZSA9IHN5c19pbmZvLmZyZXFQTEIgJSAoT05FX0JJTExJT04gLyA3NSk7CisJaWYgKHJlc2lkdWUgPj0gKE9ORV9CSUxMSU9OIC8gMTUwKSkgeworCQl0X3JmY19jbGsrKzsKKwl9CisJc3dpdGNoICh0X3JmY19jbGspIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJCXRyMCB8PSBTRFJBTV9UUjBfU0RSQV82X0NMSzsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl0cjAgfD0gU0RSQU1fVFIwX1NEUkFfN19DTEs7CisJCWJyZWFrOworCWNhc2UgODoKKwkJdHIwIHw9IFNEUkFNX1RSMF9TRFJBXzhfQ0xLOworCQlicmVhazsKKwljYXNlIDk6CisJCXRyMCB8PSBTRFJBTV9UUjBfU0RSQV85X0NMSzsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJdHIwIHw9IFNEUkFNX1RSMF9TRFJBXzEwX0NMSzsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJdHIwIHw9IFNEUkFNX1RSMF9TRFJBXzExX0NMSzsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJdHIwIHw9IFNEUkFNX1RSMF9TRFJBXzEyX0NMSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHIwIHw9IFNEUkFNX1RSMF9TRFJBXzEzX0NMSzsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBQcm9ncmFtIFNEX1JDRCBmaWVsZAorCSAqLworCXRfcmNkX2NsayA9IHN5c19pbmZvLmZyZXFQTEIgKiB0X3JjZF9ucyAvIE9ORV9CSUxMSU9OOworCXBsYl9jaGVjayA9IE9ORV9CSUxMSU9OICogdF9yY2RfY2xrIC8gdF9yY2RfbnM7CisJaWYgKHN5c19pbmZvLmZyZXFQTEIgIT0gcGxiX2NoZWNrKSB7CisJCXRfcmNkX2NsaysrOworCX0KKwlzd2l0Y2ggKHRfcmNkX2NsaykgeworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCQl0cjAgfD0gU0RSQU1fVFIwX1NEUkRfMl9DTEs7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJdHIwIHw9IFNEUkFNX1RSMF9TRFJEXzNfQ0xLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0cjAgfD0gU0RSQU1fVFIwX1NEUkRfNF9DTEs7CisJCWJyZWFrOworCX0KKworCWRlYnVnKCJ0cjA6ICV4XG4iLCB0cjApOworCW10c2RyYW0oU0RSQU0wX1RSMCwgdHIwKTsKK30KKworc3RhdGljIGludCBzaG9ydF9tZW1fdGVzdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaSwgajsKKwl1bnNpZ25lZCBsb25nIGJ4Y3JfbnVtOworCXVuc2lnbmVkIGxvbmcgKm1lbWJhc2U7CisJY29uc3QgdW5zaWduZWQgbG9uZyB0ZXN0W05VTU1FTVRFU1RTXVtOVU1NRU1XT1JEU10gPSB7CisJCXsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorCQkgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRn0sCisJCXsweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCQkgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJCXsweEFBQUFBQUFBLCAweEFBQUFBQUFBLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LAorCQkgMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NX0sCisJCXsweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweEFBQUFBQUFBLCAweEFBQUFBQUFBLAorCQkgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhBQUFBQUFBQSwgMHhBQUFBQUFBQX0sCisJCXsweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAorCQkgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwgMHg1QTVBNUE1QSwgMHg1QTVBNUE1QX0sCisJCXsweDVBNUE1QTVBLCAweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweEE1QTVBNUE1LAorCQkgMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNX0sCisJCXsweEFBNTVBQTU1LCAweEFBNTVBQTU1LCAweDU1QUE1NUFBLCAweDU1QUE1NUFBLAorCQkgMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwgMHg1NUFBNTVBQSwgMHg1NUFBNTVBQX0sCisJCXsweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1LAorCQkgMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwgMHhBQTU1QUE1NSwgMHhBQTU1QUE1NX19OworCisJZm9yIChieGNyX251bSA9IDA7IGJ4Y3JfbnVtIDwgTUFYQlhDUjsgYnhjcl9udW0rKykgeworCQltdGRjcihTRFJBTTBfQ0ZHQUREUiwgU0RSQU0wX0IwQ1IgKyAoYnhjcl9udW0gPDwgMikpOworCQlpZiAoKG1mZGNyKFNEUkFNMF9DRkdEQVRBKSAmIFNEUkFNX0JYQ1JfU0RCRSkgPT0gU0RSQU1fQlhDUl9TREJFKSB7CisJCQkvKiBCYW5rIGlzIGVuYWJsZWQgKi8KKwkJCW1lbWJhc2UgPSAodW5zaWduZWQgbG9uZyopCisJCQkJKG1mZGNyKFNEUkFNMF9DRkdEQVRBKSAmIFNEUkFNX0JYQ1JfU0RCQV9NQVNLKTsKKworCQkJLyoKKwkJCSAqIFJ1biB0aGUgc2hvcnQgbWVtb3J5IHRlc3QKKwkJCSAqLworCQkJZm9yIChpID0gMDsgaSA8IE5VTU1FTVRFU1RTOyBpKyspIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTlVNTUVNV09SRFM7IGorKykgeworCQkJCQkvKiBwcmludGYoImJhbmsgZW5hYmxlZCBiYXNlOiV4XG4iLCAmbWVtYmFzZVtqXSk7ICovCisJCQkJCW1lbWJhc2Vbal0gPSB0ZXN0W2ldW2pdOworCQkJCQlwcGNEY2JmKCh1bnNpZ25lZCBsb25nKSYobWVtYmFzZVtqXSkpOworCQkJCX0KKworCQkJCWZvciAoaiA9IDA7IGogPCBOVU1NRU1XT1JEUzsgaisrKSB7CisJCQkJCWlmIChtZW1iYXNlW2pdICE9IHRlc3RbaV1bal0pIHsKKwkJCQkJCXBwY0RjYmYoKHVuc2lnbmVkIGxvbmcpJihtZW1iYXNlW2pdKSk7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCQlwcGNEY2JmKCh1bnNpZ25lZCBsb25nKSYobWVtYmFzZVtqXSkpOworCQkJCX0KKworCQkJCWlmIChqIDwgTlVNTUVNV09SRFMpCisJCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKgorCQkJICogc2VlIGlmIHRoZSByZGNsdCB2YWx1ZSBwYXNzZWQKKwkJCSAqLworCQkJaWYgKGkgPCBOVU1NRU1URVNUUykKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBwcm9ncmFtX3RyMSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdHIwOworCXVuc2lnbmVkIGxvbmcgdHIxOworCXVuc2lnbmVkIGxvbmcgY2ZnMDsKKwl1bnNpZ25lZCBsb25nIGVjY190ZW1wOworCXVuc2lnbmVkIGxvbmcgZGx5Y2FsOworCXVuc2lnbmVkIGxvbmcgZGx5X3ZhbDsKKwl1bnNpZ25lZCBsb25nIGs7CisJdW5zaWduZWQgbG9uZyBtYXhfcGFzc19sZW5ndGg7CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X3Bhc3NfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgY3VycmVudF9mYWlsX2xlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyByZGNsdDsKKwl1bnNpZ25lZCBsb25nIHJkY2x0X29mZnNldDsKKwlsb25nIG1heF9zdGFydDsKKwlsb25nIG1heF9lbmQ7CisJbG9uZyByZGNsdF9hdmVyYWdlOworCXVuc2lnbmVkIGNoYXIgd2luZG93X2ZvdW5kOworCXVuc2lnbmVkIGNoYXIgZmFpbF9mb3VuZDsKKwl1bnNpZ25lZCBjaGFyIHBhc3NfZm91bmQ7CisJUFBDNHh4X1NZU19JTkZPIHN5c19pbmZvOworCisJLyoKKwkgKiBnZXQgdGhlIGJvYXJkIGluZm8KKwkgKi8KKwlnZXRfc3lzX2luZm8oJnN5c19pbmZvKTsKKworCS8qCisJICogZ2V0IFNEUkFNIFRpbWluZyBSZWdpc3RlciAwIChTRFJBTV9UUjApIGFuZCBjbGVhciBiaXRzCisJICovCisJbWZzZHJhbShTRFJBTTBfVFIxLCB0cjEpOworCXRyMSAmPSB+KFNEUkFNX1RSMV9SRFNTX01BU0sgfCBTRFJBTV9UUjFfUkRTTF9NQVNLIHwKKwkJIFNEUkFNX1RSMV9SRENEX01BU0sgfCBTRFJBTV9UUjFfUkRDVF9NQVNLKTsKKworCW1mc2RyYW0oU0RSQU0wX1RSMCwgdHIwKTsKKwlpZiAoKCh0cjAgJiBTRFJBTV9UUjBfU0RDTF9NQVNLKSA9PSBTRFJBTV9UUjBfU0RDTF8yXzVfQ0xLKSAmJgorCSAgICAoc3lzX2luZm8uZnJlcVBMQiA+IDEwMDAwMDAwMCkpIHsKKwkJdHIxIHw9IFNEUkFNX1RSMV9SRFNTX1RSMjsKKwkJdHIxIHw9IFNEUkFNX1RSMV9SRFNMX1NUQUdFMzsKKwkJdHIxIHw9IFNEUkFNX1RSMV9SRENEX1JDRF8xXzI7CisJfSBlbHNlIHsKKwkJdHIxIHw9IFNEUkFNX1RSMV9SRFNTX1RSMTsKKwkJdHIxIHw9IFNEUkFNX1RSMV9SRFNMX1NUQUdFMjsKKwkJdHIxIHw9IFNEUkFNX1RSMV9SRENEX1JDRF8wXzA7CisJfQorCisJLyoKKwkgKiBzYXZlIENGRzAgRUNDIHNldHRpbmcgdG8gYSB0ZW1wb3JhcnkgdmFyaWFibGUgYW5kIHR1cm4gRUNDIG9mZgorCSAqLworCW1mc2RyYW0oU0RSQU0wX0NGRzAsIGNmZzApOworCWVjY190ZW1wID0gY2ZnMCAmIFNEUkFNX0NGRzBfTUNIS19NQVNLOworCW10c2RyYW0oU0RSQU0wX0NGRzAsIChjZmcwICYgflNEUkFNX0NGRzBfTUNIS19NQVNLKSB8IFNEUkFNX0NGRzBfTUNIS19OT04pOworCisJLyoKKwkgKiBnZXQgdGhlIGRlbGF5IGxpbmUgY2FsaWJyYXRpb24gcmVnaXN0ZXIgdmFsdWUKKwkgKi8KKwltZnNkcmFtKFNEUkFNMF9ETFlDQUwsIGRseWNhbCk7CisJZGx5X3ZhbCA9IFNEUkFNX0RMWUNBTF9ETENWX0RFQ09ERShkbHljYWwpIDw8IDI7CisKKwltYXhfcGFzc19sZW5ndGggPSAwOworCW1heF9zdGFydCA9IDA7CisJbWF4X2VuZCA9IDA7CisJY3VycmVudF9wYXNzX2xlbmd0aCA9IDA7CisJY3VycmVudF9mYWlsX2xlbmd0aCA9IDA7CisJY3VycmVudF9zdGFydCA9IDA7CisJcmRjbHRfb2Zmc2V0ID0gMDsKKwl3aW5kb3dfZm91bmQgPSBGQUxTRTsKKwlmYWlsX2ZvdW5kID0gRkFMU0U7CisJcGFzc19mb3VuZCA9IEZBTFNFOworCWRlYnVnKCJTdGFydGluZyBtZW1vcnkgdGVzdCAiKTsKKworCWZvciAoayA9IDA7IGsgPCBOVU1IQUxGQ1lDTEVTOyBrKyspIHsKKwkJZm9yIChyZGNsdCA9IDA7IHJkY2x0IDwgZGx5X3ZhbDsgcmRjbHQrKykgeworCQkJLyoKKwkJCSAqIFNldCB0aGUgdGltaW5nIHJlZyBmb3IgdGhlIHRlc3QuCisJCQkgKi8KKwkJCW10c2RyYW0oU0RSQU0wX1RSMSwgKHRyMSB8IFNEUkFNX1RSMV9SRENUX0VOQ09ERShyZGNsdCkpKTsKKworCQkJaWYgKHNob3J0X21lbV90ZXN0KCkpIHsKKwkJCQlpZiAoZmFpbF9mb3VuZCA9PSBUUlVFKSB7CisJCQkJCXBhc3NfZm91bmQgPSBUUlVFOworCQkJCQlpZiAoY3VycmVudF9wYXNzX2xlbmd0aCA9PSAwKSB7CisJCQkJCQljdXJyZW50X3N0YXJ0ID0gcmRjbHRfb2Zmc2V0ICsgcmRjbHQ7CisJCQkJCX0KKworCQkJCQljdXJyZW50X2ZhaWxfbGVuZ3RoID0gMDsKKwkJCQkJY3VycmVudF9wYXNzX2xlbmd0aCsrOworCisJCQkJCWlmIChjdXJyZW50X3Bhc3NfbGVuZ3RoID4gbWF4X3Bhc3NfbGVuZ3RoKSB7CisJCQkJCQltYXhfcGFzc19sZW5ndGggPSBjdXJyZW50X3Bhc3NfbGVuZ3RoOworCQkJCQkJbWF4X3N0YXJ0ID0gY3VycmVudF9zdGFydDsKKwkJCQkJCW1heF9lbmQgPSByZGNsdF9vZmZzZXQgKyByZGNsdDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY3VycmVudF9wYXNzX2xlbmd0aCA9IDA7CisJCQkJY3VycmVudF9mYWlsX2xlbmd0aCsrOworCisJCQkJaWYgKGN1cnJlbnRfZmFpbF9sZW5ndGggPj0gKGRseV92YWw+PjIpKSB7CisJCQkJCWlmIChmYWlsX2ZvdW5kID09IEZBTFNFKSB7CisJCQkJCQlmYWlsX2ZvdW5kID0gVFJVRTsKKwkJCQkJfSBlbHNlIGlmIChwYXNzX2ZvdW5kID09IFRSVUUpIHsKKwkJCQkJCXdpbmRvd19mb3VuZCA9IFRSVUU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlkZWJ1ZygiLiIpOworCisJCWlmICh3aW5kb3dfZm91bmQgPT0gVFJVRSkgeworCQkJYnJlYWs7CisJCX0KKworCQl0cjEgPSB0cjEgXiBTRFJBTV9UUjFfUkRDRF9NQVNLOworCQlyZGNsdF9vZmZzZXQgKz0gZGx5X3ZhbDsKKwl9CisJZGVidWcoIlxuIik7CisKKwkvKgorCSAqIG1ha2Ugc3VyZSB3ZSBmaW5kIHRoZSB3aW5kb3cKKwkgKi8KKwlpZiAod2luZG93X2ZvdW5kID09IEZBTFNFKSB7CisJCXByaW50ZigiRVJST1I6IENhbm5vdCBkZXRlcm1pbmUgYSBjb21tb24gcmVhZCBkZWxheS5cbiIpOworCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwl9CisKKwkvKgorCSAqIHJlc3RvcmUgdGhlIG9yaWduYWwgRUNDIHNldHRpbmcKKwkgKi8KKwltdHNkcmFtKFNEUkFNMF9DRkcwLCAoY2ZnMCAmIH5TRFJBTV9DRkcwX01DSEtfTUFTSykgfCBlY2NfdGVtcCk7CisKKwkvKgorCSAqIHNldCB0aGUgU0RSQU0gVFIxIFJEQ0QgdmFsdWUKKwkgKi8KKwl0cjEgJj0gflNEUkFNX1RSMV9SRENEX01BU0s7CisJaWYgKCh0cjAgJiBTRFJBTV9UUjBfU0RDTF9NQVNLKSA9PSBTRFJBTV9UUjBfU0RDTF8yXzVfQ0xLKSB7CisJCXRyMSB8PSBTRFJBTV9UUjFfUkRDRF9SQ0RfMV8yOworCX0gZWxzZSB7CisJCXRyMSB8PSBTRFJBTV9UUjFfUkRDRF9SQ0RfMF8wOworCX0KKworCS8qCisJICogc2V0IHRoZSBTRFJBTSBUUjEgUkRDTFQgdmFsdWUKKwkgKi8KKwl0cjEgJj0gflNEUkFNX1RSMV9SRENUX01BU0s7CisJd2hpbGUgKG1heF9lbmQgPj0gKGRseV92YWwgPDwgMSkpIHsKKwkJbWF4X2VuZCAtPSAoZGx5X3ZhbCA8PCAxKTsKKwkJbWF4X3N0YXJ0IC09IChkbHlfdmFsIDw8IDEpOworCX0KKworCXJkY2x0X2F2ZXJhZ2UgPSAoKG1heF9zdGFydCArIG1heF9lbmQpID4+IDEpOworCisJaWYgKHJkY2x0X2F2ZXJhZ2UgPCAwKSB7CisJCXJkY2x0X2F2ZXJhZ2UgPSAwOworCX0KKworCWlmIChyZGNsdF9hdmVyYWdlID49IGRseV92YWwpIHsKKwkJcmRjbHRfYXZlcmFnZSAtPSBkbHlfdmFsOworCQl0cjEgPSB0cjEgXiBTRFJBTV9UUjFfUkRDRF9NQVNLOworCX0KKwl0cjEgfD0gU0RSQU1fVFIxX1JEQ1RfRU5DT0RFKHJkY2x0X2F2ZXJhZ2UpOworCisJZGVidWcoInRyMTogJXhcbiIsIHRyMSk7CisKKwkvKgorCSAqIHByb2dyYW0gU0RSQU0gVGltaW5nIFJlZ2lzdGVyIDEgVFIxCisJICovCisJbXRzZHJhbShTRFJBTTBfVFIxLCB0cjEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwcm9ncmFtX2J4Y3IodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkJICB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBsb25nIGJhbmtfYmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgY3I7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgajsKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisJdW5zaWduZWQgY2hhciBudW1fcm93X2FkZHI7CisJdW5zaWduZWQgY2hhciBudW1fY29sX2FkZHI7CisJdW5zaWduZWQgY2hhciBudW1fYmFua3M7CisJdW5zaWduZWQgY2hhciBiYW5rX3NpemVfaWQ7CisJdW5zaWduZWQgbG9uZyBjdHJsX2JhbmtfbnVtW01BWEJBTktTXTsKKwl1bnNpZ25lZCBsb25nIGJ4X2NyX251bTsKKwl1bnNpZ25lZCBsb25nIGxhcmdlc3Rfc2l6ZV9pbmRleDsKKwl1bnNpZ25lZCBsb25nIGxhcmdlc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfc2l6ZV9pbmRleDsKKwlCQU5LUEFSTVMgYmFua19wYXJtc1tNQVhCWENSXTsKKwl1bnNpZ25lZCBsb25nIHNvcnRlZF9iYW5rX251bVtNQVhCWENSXTsgLyogRERSIENvbnRyb2xsZXIgYmFuayBudW1iZXIgdGFibGUgKHNvcnRlZCBieSBzaXplKSAqLworCXVuc2lnbmVkIGxvbmcgc29ydGVkX2Jhbmtfc2l6ZVtNQVhCWENSXTsgLyogRERSIENvbnRyb2xsZXIgYmFuayBzaXplIHRhYmxlIChzb3J0ZWQgYnkgc2l6ZSkqLworCisJLyoKKwkgKiBTZXQgdGhlIEJ4Q1IgcmVncy4gIEZpcnN0LCB3aXBlIG91dCB0aGUgYmFuayBjb25maWcgcmVnaXN0ZXJzLgorCSAqLworCWZvciAoYnhfY3JfbnVtID0gMDsgYnhfY3JfbnVtIDwgTUFYQlhDUjsgYnhfY3JfbnVtKyspIHsKKwkJbXRkY3IoU0RSQU0wX0NGR0FERFIsIFNEUkFNMF9CMENSICsgKGJ4X2NyX251bSA8PCAyKSk7CisJCW10ZGNyKFNEUkFNMF9DRkdEQVRBLCAweDAwMDAwMDAwKTsKKwkJYmFua19wYXJtc1tieF9jcl9udW1dLmJhbmtfc2l6ZV9ieXRlcyA9IDA7CisJfQorCisjaWZkZWYgQ09ORklHX0JBTUJPTworCS8qCisJICogVGhpcyBuZXh0IHNlY3Rpb24gaXMgaGFyZHdhcmUgZGVwZW5kZW50IGFuZCBtdXN0IGJlIHByb2dyYW1tZWQKKwkgKiB0byBtYXRjaCB0aGUgaGFyZHdhcmUuICBGb3IgYmFtYm9vLCB0aGUgZm9sbG93aW5nIGhvbGRzLi4uCisJICogMS4gU0RSQU0wX0IwQ1I6IEJhbmsgMCBvZiBkaW1tIDAgY3RybF9iYW5rX251bSA6IDAgKHNvbGRlcmVkIG9uYm9hcmQpCisJICogMi4gU0RSQU0wX0IxQ1I6IEJhbmsgMCBvZiBkaW1tIDEgY3RybF9iYW5rX251bSA6IDEKKwkgKiAzLiBTRFJBTTBfQjJDUjogQmFuayAxIG9mIGRpbW0gMSBjdHJsX2JhbmtfbnVtIDogMQorCSAqIDQuIFNEUkFNMF9CM0NSOiBCYW5rIDAgb2YgZGltbSAyIGN0cmxfYmFua19udW0gOiAzCisJICogY3RybF9iYW5rX251bSBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgdXNhYmxlIEREUiBjb250cm9sbGVyIGJhbmsgbnVtYmVyIGJ5IERJTU0KKwkgKi8KKwljdHJsX2JhbmtfbnVtWzBdID0gMDsKKwljdHJsX2JhbmtfbnVtWzFdID0gMTsKKwljdHJsX2JhbmtfbnVtWzJdID0gMzsKKyNlbHNlCisJLyoKKwkgKiBPY290ZWEsIEVib255IGFuZCB0aGUgb3RoZXIgSUJNL0FNQ0MgZXZhbCBib2FyZHMgaGF2ZQorCSAqIDIgRElNTSBzbG90cyB3aXRoIGVhY2ggbWF4IDIgYmFua3MKKwkgKi8KKwljdHJsX2JhbmtfbnVtWzBdID0gMDsKKwljdHJsX2JhbmtfbnVtWzFdID0gMjsKKyNlbmRpZgorCisJLyoKKwkgKiByZXNldCB0aGUgYmFua19iYXNlIGFkZHJlc3MKKwkgKi8KKwliYW5rX2Jhc2VfYWRkciA9IENPTkZJR19TWVNfU0RSQU1fQkFTRTsKKworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCWlmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gPT0gVFJVRSkgeworCQkJbnVtX3Jvd19hZGRyID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAzKTsKKwkJCW51bV9jb2xfYWRkciA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgNCk7CisJCQludW1fYmFua3MgICAgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDUpOworCQkJYmFua19zaXplX2lkID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAzMSk7CisJCQlkZWJ1ZygiRElNTSVkOiByb3c9JWQgY29sPSVkIGJhbmtzPSVkXG4iLCBkaW1tX251bSwKKwkJCSAgICAgIG51bV9yb3dfYWRkciwgbnVtX2NvbF9hZGRyLCBudW1fYmFua3MpOworCisJCQkvKgorCQkJICogU2V0IHRoZSBTRFJBTTBfQnhDUiByZWdzCisJCQkgKi8KKwkJCWNyID0gMDsKKwkJCXN3aXRjaCAoYmFua19zaXplX2lkKSB7CisJCQljYXNlIDB4MDI6CisJCQkJY3IgfD0gU0RSQU1fQlhDUl9TRFNaXzg7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDQ6CisJCQkJY3IgfD0gU0RSQU1fQlhDUl9TRFNaXzE2OworCQkJCWJyZWFrOworCQkJY2FzZSAweDA4OgorCQkJCWNyIHw9IFNEUkFNX0JYQ1JfU0RTWl8zMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgxMDoKKwkJCQljciB8PSBTRFJBTV9CWENSX1NEU1pfNjQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MjA6CisJCQkJY3IgfD0gU0RSQU1fQlhDUl9TRFNaXzEyODsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg0MDoKKwkJCQljciB8PSBTRFJBTV9CWENSX1NEU1pfMjU2OworCQkJCWJyZWFrOworCQkJY2FzZSAweDgwOgorCQkJCWNyIHw9IFNEUkFNX0JYQ1JfU0RTWl81MTI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiRERSLVNEUkFNOiBESU1NICVsdSBCeENSIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJCSAgICAgICBkaW1tX251bSk7CisJCQkJcHJpbnRmKCJFUlJPUjogVW5zdXBwb3J0ZWQgdmFsdWUgZm9yIHRoZSBiYW5rc2l6ZTogJWQuXG4iLAorCQkJCSAgICAgICBiYW5rX3NpemVfaWQpOworCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJCX0KKworCQkJc3dpdGNoIChudW1fY29sX2FkZHIpIHsKKwkJCWNhc2UgMHgwODoKKwkJCQljciB8PSBTRFJBTV9CWENSX1NEQU1fMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwOToKKwkJCQljciB8PSBTRFJBTV9CWENSX1NEQU1fMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwQToKKwkJCQljciB8PSBTRFJBTV9CWENSX1NEQU1fMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwQjoKKwkJCQljciB8PSBTRFJBTV9CWENSX1NEQU1fNDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCJERFItU0RSQU06IERJTU0gJWx1IEJ4Q1IgY29uZmlndXJhdGlvbi5cbiIsCisJCQkJICAgICAgIGRpbW1fbnVtKTsKKwkJCQlwcmludGYoIkVSUk9SOiBVbnN1cHBvcnRlZCB2YWx1ZSBmb3IgbnVtYmVyIG9mICIKKwkJCQkgICAgICAgImNvbHVtbiBhZGRyZXNzZXM6ICVkLlxuIiwgbnVtX2NvbF9hZGRyKTsKKwkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBlbmFibGUgdGhlIGJhbmsKKwkJCSAqLworCQkJY3IgfD0gU0RSQU1fQlhDUl9TREJFOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2JhbmtzOyBpKyspIHsKKwkJCQliYW5rX3Bhcm1zW2N0cmxfYmFua19udW1bZGltbV9udW1dK2ldLmJhbmtfc2l6ZV9ieXRlcyA9CisJCQkJCSg0IDw8IDIwKSAqIGJhbmtfc2l6ZV9pZDsKKwkJCQliYW5rX3Bhcm1zW2N0cmxfYmFua19udW1bZGltbV9udW1dK2ldLmNyID0gY3I7CisJCQkJZGVidWcoIkRJTU0lZC1iYW5rICVkIChTRFJBTTBfQiVkQ1IpOiBiYW5rX3NpemVfYnl0ZXM9JWRcbiIsCisJCQkJICAgICAgZGltbV9udW0sIGksIGN0cmxfYmFua19udW1bZGltbV9udW1dK2ksCisJCQkJICAgICAgYmFua19wYXJtc1tjdHJsX2JhbmtfbnVtW2RpbW1fbnVtXStpXS5iYW5rX3NpemVfYnl0ZXMpOworCQkJfQorCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBzb3J0IHRhYmxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhCWENSOyBpKyspIHsKKwkJc29ydGVkX2JhbmtfbnVtW2ldID0gaTsKKwkJc29ydGVkX2Jhbmtfc2l6ZVtpXSA9IGJhbmtfcGFybXNbaV0uYmFua19zaXplX2J5dGVzOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhCWENSLTE7IGkrKykgeworCQlsYXJnZXN0X3NpemUgPSBzb3J0ZWRfYmFua19zaXplW2ldOworCQlsYXJnZXN0X3NpemVfaW5kZXggPSAyNTU7CisKKwkJLyogRmluZCB0aGUgbGFyZ2VzdCByZW1haW5pbmcgdmFsdWUgKi8KKwkJZm9yIChqID0gaSArIDE7IGogPCBNQVhCWENSOyBqKyspIHsKKwkJCWlmIChzb3J0ZWRfYmFua19zaXplW2pdID4gbGFyZ2VzdF9zaXplKSB7CisJCQkJLyogU2F2ZSBsYXJnZXN0IHJlbWFpbmluZyB2YWx1ZSBhbmQgaXRzIGluZGV4ICovCisJCQkJbGFyZ2VzdF9zaXplID0gc29ydGVkX2Jhbmtfc2l6ZVtqXTsKKwkJCQlsYXJnZXN0X3NpemVfaW5kZXggPSBqOworCQkJfQorCQl9CisKKwkJaWYgKGxhcmdlc3Rfc2l6ZV9pbmRleCAhPSAyNTUpIHsKKwkJCS8qIFN3YXAgdGhlIGN1cnJlbnQgYW5kIGxhcmdlc3QgdmFsdWVzICovCisJCQljdXJyZW50X3NpemVfaW5kZXggPSBzb3J0ZWRfYmFua19udW1bbGFyZ2VzdF9zaXplX2luZGV4XTsKKwkJCXNvcnRlZF9iYW5rX3NpemVbbGFyZ2VzdF9zaXplX2luZGV4XSA9IHNvcnRlZF9iYW5rX3NpemVbaV07CisJCQlzb3J0ZWRfYmFua19zaXplW2ldID0gbGFyZ2VzdF9zaXplOworCQkJc29ydGVkX2JhbmtfbnVtW2xhcmdlc3Rfc2l6ZV9pbmRleF0gPSBzb3J0ZWRfYmFua19udW1baV07CisJCQlzb3J0ZWRfYmFua19udW1baV0gPSBjdXJyZW50X3NpemVfaW5kZXg7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIFNEUkFNMF9CeENSIHJlZ3MgdGhhbmtzIHRvIHNvcnQgdGFibGVzICovCisJZm9yIChieF9jcl9udW0gPSAwLCBiYW5rX2Jhc2VfYWRkciA9IDA7IGJ4X2NyX251bSA8IE1BWEJYQ1I7IGJ4X2NyX251bSsrKSB7CisJCWlmIChiYW5rX3Bhcm1zW3NvcnRlZF9iYW5rX251bVtieF9jcl9udW1dXS5iYW5rX3NpemVfYnl0ZXMpIHsKKwkJCW10ZGNyKFNEUkFNMF9DRkdBRERSLCBTRFJBTTBfQjBDUiArIChzb3J0ZWRfYmFua19udW1bYnhfY3JfbnVtXSA8PCAyKSk7CisJCQl0ZW1wID0gbWZkY3IoU0RSQU0wX0NGR0RBVEEpICYgfihTRFJBTV9CWENSX1NEQkFfTUFTSyB8IFNEUkFNX0JYQ1JfU0RTWl9NQVNLIHwKKwkJCQkJCSAgU0RSQU1fQlhDUl9TREFNX01BU0sgfCBTRFJBTV9CWENSX1NEQkUpOworCQkJdGVtcCA9IHRlbXAgfCAoYmFua19iYXNlX2FkZHIgJiBTRFJBTV9CWENSX1NEQkFfTUFTSykgfAorCQkJCWJhbmtfcGFybXNbc29ydGVkX2JhbmtfbnVtW2J4X2NyX251bV1dLmNyOworCQkJbXRkY3IoU0RSQU0wX0NGR0RBVEEsIHRlbXApOworCQkJYmFua19iYXNlX2FkZHIgKz0gYmFua19wYXJtc1tzb3J0ZWRfYmFua19udW1bYnhfY3JfbnVtXV0uYmFua19zaXplX2J5dGVzOworCQkJZGVidWcoIlNEUkFNMF9CJWRDUj0weCUwOGx4XG4iLCBzb3J0ZWRfYmFua19udW1bYnhfY3JfbnVtXSwgdGVtcCk7CisJCX0KKwl9CisKKwlyZXR1cm4oYmFua19iYXNlX2FkZHIpOworfQorI2VuZGlmIC8qIENPTkZJR19TUERfRUVQUk9NICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80NHhfc3BkX2RkcjIuYyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4LzQ0eF9zcGRfZGRyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZGRlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80NHhfc3BkX2RkcjIuYwpAQCAtMCwwICsxLDMxNzQgQEAKKy8qCisgKiBhcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80NHhfc3BkX2RkcjIuYworICogVGhpcyBTUEQgU0RSQU0gZGV0ZWN0aW9uIGNvZGUgc3VwcG9ydHMgQU1DQyBQUEM0NHggY3B1J3Mgd2l0aCBhCisgKiBERFIyIGNvbnRyb2xsZXIgKG5vbiBEZW5hbGkgQ29yZSkuIFRob3NlIGN1cnJlbnRseSBhcmU6CisgKgorICogNDA1OgkJNDA1RVgocikKKyAqIDQ0MC80NjA6CTQ0MFNQLzQ0MFNQZS80NjBFWC80NjBHVAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBOdW92YXRpb24gU3lzdGVtIERlc2lnbnMsIExMQworICogICBHcmFudCBFcmlja3NvbiA8Z2VyaWNrc29uQG51b3ZhdGlvbnMuY29tPgorCisgKiAoQykgQ29weXJpZ2h0IDIwMDctMjAwOQorICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIENPUFlSSUdIVCAgIEFNQ0MgICBDT1JQT1JBVElPTiAyMDA0CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qIGRlZmluZSBERUJVRyBmb3IgZGVidWdnaW5nIG91dHB1dCAob2J2aW91c2x5IDstKSkgKi8KKyNpZiAwCisjZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwcGM0eHguaD4KKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCisjaW5jbHVkZSAiZWNjLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19TRFJBTV9QUEM0eHhfSUJNX0REUjIpCisKKyNkZWZpbmUgUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIobW5lbW9uaWMpCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXUzMiBkYXRhOwkJCQkJCVwKKwkJbWZzZHJhbShTRFJBTV8jI21uZW1vbmljLCBkYXRhKTsJCQlcCisJCXByaW50ZigiJTIwc1slMDJ4XSA9IDB4JTA4WFxuIiwJCQkJXAorCQkgICAgICAgIlNEUkFNXyIgI21uZW1vbmljLCBTRFJBTV8jI21uZW1vbmljLCBkYXRhKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUFBDNHh4X0lCTV9ERFIyX0RVTVBfTVFfUkVHSVNURVIobW5lbW9uaWMpCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdTMyIGRhdGE7CQkJCQkJXAorCQlkYXRhID0gbWZkY3IoU0RSQU1fIyNtbmVtb25pYyk7CQkJCVwKKwkJcHJpbnRmKCIlMjBzWyUwMnhdID0gMHglMDhYXG4iLAkJCQlcCisJCSAgICAgICAiU0RSQU1fIiAjbW5lbW9uaWMsIFNEUkFNXyMjbW5lbW9uaWMsIGRhdGEpOwlcCisJfSB3aGlsZSAoMCkKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKy8qCisgKiBUaGlzIEREUjIgc2V0dXAgY29kZSBjYW4gZHluYW1pY2FsbHkgc2V0dXAgdGhlIFRMQiBlbnRyaWVzIGZvciB0aGUgRERSMgorICogbWVtb3J5IHJlZ2lvbi4gUmlnaHQgbm93IHRoZSBjYWNoZSBzaG91bGQgc3RpbGwgYmUgZGlzYWJsZWQgaW4gVS1Cb290CisgKiBiZWNhdXNlIG9mIHRoZSBFTUFDIGRyaXZlciwgdGhhdCBuZWVkIGl0cyBidWZmZXIgZGVzY3JpcHRvciB0byBiZSBsb2NhdGVkCisgKiBpbiBub24gY2FjaGVkIG1lbW9yeS4KKyAqCisgKiBJZiBhdCBzb21lIHRpbWUgdGhpcyByZXN0cmljdGlvbiBkb2Vzbid0IGFwcGx5IGFueW1vcmUsIGp1c3QgZGVmaW5lCisgKiBDT05GSUdfNHh4X0RDQUNIRSBpbiB0aGUgYm9hcmQgY29uZmlnIGZpbGUgYW5kIHRoaXMgY29kZSBzaG91bGQgc2V0dXAKKyAqIGV2ZXJ5dGhpbmcgY29ycmVjdGx5LgorICovCisjaWZkZWYgQ09ORklHXzR4eF9EQ0FDSEUKKy8qIGVuYWJsZSBjYWNoaW5nIG9uIFNEUkFNICovCisjZGVmaW5lIE1ZX1RMQl9XT1JEMl9JX0VOQUJMRQkJMAorI2Vsc2UKKy8qIGRpc2FibGUgY2FjaGluZyBvbiBTRFJBTSAqLworI2RlZmluZSBNWV9UTEJfV09SRDJfSV9FTkFCTEUJCVRMQl9XT1JEMl9JX0VOQUJMRQorI2VuZGlmIC8qIENPTkZJR180eHhfRENBQ0hFICovCisKK3ZvaWQgZGNiel9hcmVhKHUzMiBzdGFydF9hZGRyZXNzLCB1MzIgbnVtX2J5dGVzKTsKKyNlbmRpZiAvKiBDT05GSUdfNDQwICovCisKKyNkZWZpbmUgTUFYUkFOS1MJNAorI2RlZmluZSBNQVhCWENGCQk0CisKKyNkZWZpbmUgTVVMRElWNjQobTEsIG0yLCBkKQkodTMyKSgoKHU2NCkobTEpICogKHU2NCkobTIpKSAvICh1NjQpKGQpKQorCisjaWYgIWRlZmluZWQoQ09ORklHX05BTkRfU1BMKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHNkcmFtX21lbXNpemUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcGh5c19zaXplX3Qgc2RyYW1fbWVtc2l6ZSh2b2lkKQoreworCXBoeXNfc2l6ZV90IG1lbV9zaXplOworCXVuc2lnbmVkIGxvbmcgbWNvcHQyOworCXVuc2lnbmVkIGxvbmcgbWNzdGF0OworCXVuc2lnbmVkIGxvbmcgbWIwY2Y7CisJdW5zaWduZWQgbG9uZyBzZHN6OworCXVuc2lnbmVkIGxvbmcgaTsKKworCW1lbV9zaXplID0gMDsKKworCW1mc2RyYW0oU0RSQU1fTUNPUFQyLCBtY29wdDIpOworCW1mc2RyYW0oU0RSQU1fTUNTVEFULCBtY3N0YXQpOworCisJLyogRERSIGNvbnRyb2xsZXIgbXVzdCBiZSBlbmFibGVkIGFuZCBub3QgaW4gc2VsZi1yZWZyZXNoLiAqLworCS8qIE90aGVyd2lzZSBtZW1zaXplIGlzIHplcm8uICovCisJaWYgKCgobWNvcHQyICYgU0RSQU1fTUNPUFQyX0RDRU5fTUFTSykgPT0gU0RSQU1fTUNPUFQyX0RDRU5fRU5BQkxFKQorCSAgICAmJiAoKG1jb3B0MiAmIFNEUkFNX01DT1BUMl9TUkVOX01BU0spID09IFNEUkFNX01DT1BUMl9TUkVOX0VYSVQpCisJICAgICYmICgobWNzdGF0ICYgKFNEUkFNX01DU1RBVF9NSUNfTUFTSyB8IFNEUkFNX01DU1RBVF9TUk1TX01BU0spKQorCQk9PSAoU0RSQU1fTUNTVEFUX01JQ19DT01QIHwgU0RSQU1fTUNTVEFUX1NSTVNfTk9UX1NGKSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IE1BWEJYQ0Y7IGkrKykgeworCQkJbWZzZHJhbShTRFJBTV9NQjBDRiArIChpIDw8IDIpLCBtYjBjZik7CisJCQkvKiBCYW5rcyBlbmFibGVkICovCisJCQlpZiAoKG1iMGNmICYgU0RSQU1fQlhDRl9NX0JFX01BU0spID09IFNEUkFNX0JYQ0ZfTV9CRV9FTkFCTEUpIHsKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisJCQkJc2RzeiA9IG1mZGNyX2FueShTRFJBTV9SMEJBUyArIGkpICYgU0RSQU1fUlhCQVNfU0RTWl9NQVNLOworI2Vsc2UKKwkJCQlzZHN6ID0gbWIwY2YgJiBTRFJBTV9SWEJBU19TRFNaX01BU0s7CisjZW5kaWYKKwkJCQlzd2l0Y2goc2RzeikgeworCQkJCWNhc2UgU0RSQU1fUlhCQVNfU0RTWl84OgorCQkJCQltZW1fc2l6ZSs9ODsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRFJBTV9SWEJBU19TRFNaXzE2OgorCQkJCQltZW1fc2l6ZSs9MTY7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RSQU1fUlhCQVNfU0RTWl8zMjoKKwkJCQkJbWVtX3NpemUrPTMyOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNEUkFNX1JYQkFTX1NEU1pfNjQ6CisJCQkJCW1lbV9zaXplKz02NDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRFJBTV9SWEJBU19TRFNaXzEyODoKKwkJCQkJbWVtX3NpemUrPTEyODsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRFJBTV9SWEJBU19TRFNaXzI1NjoKKwkJCQkJbWVtX3NpemUrPTI1NjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRFJBTV9SWEJBU19TRFNaXzUxMjoKKwkJCQkJbWVtX3NpemUrPTUxMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTRFJBTV9SWEJBU19TRFNaXzEwMjQ6CisJCQkJCW1lbV9zaXplKz0xMDI0OworCQkJCQlicmVhazsKKwkJCQljYXNlIFNEUkFNX1JYQkFTX1NEU1pfMjA0ODoKKwkJCQkJbWVtX3NpemUrPTIwNDg7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0RSQU1fUlhCQVNfU0RTWl80MDk2OgorCQkJCQltZW1fc2l6ZSs9NDA5NjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRmKCJXQVJOSU5HOiBVbnN1cHBvcnRlZCBiYW5rIHNpemUgKFNEU1o9MHglbHgpIVxuIgorCQkJCQkgICAgICAgLCBzZHN6KTsKKwkJCQkJbWVtX3NpemU9MDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG1lbV9zaXplIDw8IDIwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogaXNfZWNjX2VuYWJsZWQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXNfZWNjX2VuYWJsZWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCW1mc2RyYW0oU0RSQU1fTUNPUFQxLCB2YWwpOworCisJcmV0dXJuIFNEUkFNX01DT1BUMV9NQ0hLX0NIS19ERUNPREUodmFsKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIGJvYXJkX2FkZF9yYW1faW5mbworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGJvYXJkX2FkZF9yYW1faW5mbyhpbnQgdXNlX2RlZmF1bHQpCit7CisJUFBDNHh4X1NZU19JTkZPIGJvYXJkX2NmZzsKKwl1MzIgdmFsOworCisJaWYgKGlzX2VjY19lbmFibGVkKCkpCisJCXB1dHMoIiAoRUNDIik7CisJZWxzZQorCQlwdXRzKCIgKEVDQyBub3QiKTsKKworCWdldF9zeXNfaW5mbygmYm9hcmRfY2ZnKTsKKworI2lmIGRlZmluZWQoQ09ORklHXzQwNUVYKQorCXZhbCA9IGJvYXJkX2NmZy5mcmVxUExCOworI2Vsc2UKKwltZnNkcihTRFIwX0REUjAsIHZhbCk7CisJdmFsID0gTVVMRElWNjQoKGJvYXJkX2NmZy5mcmVxUExCKSwgU0RSMF9ERFIwX0REUk1fREVDT0RFKHZhbCksIDEpOworI2VuZGlmCisJcHJpbnRmKCIgZW5hYmxlZCwgJWQgTUh6IiwgKHZhbCAqIDIpIC8gMTAwMDAwMCk7CisKKwltZnNkcmFtKFNEUkFNX01NT0RFLCB2YWwpOworCXZhbCA9ICh2YWwgJiBTRFJBTV9NTU9ERV9EQ0xfTUFTSykgPj4gNDsKKwlwcmludGYoIiwgQ0wlZCkiLCB2YWwpOworfQorI2VuZGlmIC8qICFDT05GSUdfTkFORF9TUEwgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NQRF9FRVBST00pCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBEZWZpbmVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYJVFJVRQorI2RlZmluZSBUUlVFCQkxCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UJCTAKKyNlbmRpZgorCisjZGVmaW5lIFNEUkFNX0REUjEJMQorI2RlZmluZSBTRFJBTV9ERFIyCTIKKyNkZWZpbmUgU0RSQU1fTk9ORQkwCisKKyNkZWZpbmUgTUFYRElNTVMJMgorI2RlZmluZSBNQVhfU1BEX0JZVEVTCTI1NiAgIC8qIE1heCBudW1iZXIgb2YgYnl0ZXMgb24gdGhlIERJTU0ncyBTUEQgRUVQUk9NICovCisKKyNkZWZpbmUgT05FX0JJTExJT04JMTAwMDAwMDAwMAorCisjZGVmaW5lIENNRF9OT1AJCSg3IDw8IDE5KQorI2RlZmluZSBDTURfUFJFQ0hBUkdFCSgyIDw8IDE5KQorI2RlZmluZSBDTURfUkVGUkVTSAkoMSA8PCAxOSkKKyNkZWZpbmUgQ01EX0VNUgkJKDAgPDwgMTkpCisjZGVmaW5lIENNRF9SRUFECSg1IDw8IDE5KQorI2RlZmluZSBDTURfV1JJVEUJKDQgPDwgMTkpCisKKyNkZWZpbmUgU0VMRUNUX01SCSgwIDw8IDE2KQorI2RlZmluZSBTRUxFQ1RfRU1SCSgxIDw8IDE2KQorI2RlZmluZSBTRUxFQ1RfRU1SMgkoMiA8PCAxNikKKyNkZWZpbmUgU0VMRUNUX0VNUjMJKDMgPDwgMTYpCisKKy8qIE1SICovCisjZGVmaW5lIERMTF9SRVNFVAkweDAwMDAwMTAwCisKKyNkZWZpbmUgV1JJVEVfUkVDT1ZfMgkoMSA8PCA5KQorI2RlZmluZSBXUklURV9SRUNPVl8zCSgyIDw8IDkpCisjZGVmaW5lIFdSSVRFX1JFQ09WXzQJKDMgPDwgOSkKKyNkZWZpbmUgV1JJVEVfUkVDT1ZfNQkoNCA8PCA5KQorI2RlZmluZSBXUklURV9SRUNPVl82CSg1IDw8IDkpCisKKyNkZWZpbmUgQlVSU1RfTEVOXzQJMHgwMDAwMDAwMgorCisvKiBFTVIgKi8KKyNkZWZpbmUgT0RUXzBfT0hNCTB4MDAwMDAwMDAKKyNkZWZpbmUgT0RUXzUwX09ITQkweDAwMDAwMDQ0CisjZGVmaW5lIE9EVF83NV9PSE0JMHgwMDAwMDAwNAorI2RlZmluZSBPRFRfMTUwX09ITQkweDAwMDAwMDQwCisKKyNkZWZpbmUgT0RTX0ZVTEwJMHgwMDAwMDAwMAorI2RlZmluZSBPRFNfUkVEVUNFRAkweDAwMDAwMDAyCisjZGVmaW5lIE9DRF9DQUxJQl9ERUYJMHgwMDAwMDM4MAorCisvKiBkZWZpbmVzIGZvciBPRFQgKE9uIERpZSBUZXJtaW5hdGlvbikgb2YgdGhlIDQ0MFNQKGUpIEREUjIgY29udHJvbGxlciAqLworI2RlZmluZSBPRFRfRUIwUgkoMHg4MDAwMDAwMCA+PiA4KQorI2RlZmluZSBPRFRfRUIwVwkoMHg4MDAwMDAwMCA+PiA3KQorI2RlZmluZSBDQUxDX09EVF9SKG4pCShPRFRfRUIwUiA8PCAobiA8PCAxKSkKKyNkZWZpbmUgQ0FMQ19PRFRfVyhuKQkoT0RUX0VCMFcgPDwgKG4gPDwgMSkpCisjZGVmaW5lIENBTENfT0RUX1JXKG4pCShDQUxDX09EVF9SKG4pIHwgQ0FMQ19PRFRfVyhuKSkKKworLyogRGVmaW5lcyBmb3IgdGhlIFJlYWQgQ3ljbGUgRGVsYXkgdGVzdCAqLworI2RlZmluZSBOVU1NRU1URVNUUwk4CisjZGVmaW5lIE5VTU1FTVdPUkRTCTgKKyNkZWZpbmUgTlVNTE9PUFMJNjQJCS8qIG1lbW9yeSB0ZXN0IGxvb3BzICovCisKKy8qCisgKiBOZXdlciBQUEMncyBsaWtlIDQ0MFNQZSwgNDYwRVgvR1QgY2FuIGJlIGVxdWlwcGVkIHdpdGggbW9yZSB0aGFuIDJHQiBvZiBTRFJBTS4KKyAqIFRvIHN1cHBvcnQgc3VjaCBjb25maWd1cmF0aW9ucywgd2UgIm9ubHkiIG1hcCB0aGUgZmlyc3QgMkdCIHZpYSB0aGUgVExCJ3MuIFdlCisgKiBuZWVkIHNvbWUgZnJlZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgZm9yIHRoZSByZW1haW5pbmcgcGVyaXBoZXJhbHMgbGlrZSwgU29DCisgKiBkZXZpY2VzLCBGTEFTSCBldGMuCisgKgorICogTm90ZSB0aGF0IEVDQyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiBjb25maWd1cmF0aW9ucyB3aXRoIG1vcmUgdGhhbiAyR0IKKyAqIFNEUkFNLiBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBtYXAgdGhlIGZpcnN0IDJHQiBvbiBzdWNoIHN5c3RlbXMsIGFuZCB0aGVyZWZvcmUKKyAqIHRoZSBFQ0MgcGFyaXR5IGJ5dGUgb2YgdGhlIHJlbWFpbmluZyBhcmVhIGNhbid0IGJlIHdyaXR0ZW4uCisgKi8KKworLyoKKyAqIEJvYXJkLXNwZWNpZmljIFBsYXRmb3JtIGNvZGUgY2FuIHJlaW1wbGVtZW50IHNwZF9kZHJfaW5pdF9oYW5nICgpIGlmIG5lZWRlZAorICovCit2b2lkIF9fc3BkX2Rkcl9pbml0X2hhbmcgKHZvaWQpCit7CisJaGFuZyAoKTsKK30KK3ZvaWQgc3BkX2Rkcl9pbml0X2hhbmcgKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3NwZF9kZHJfaW5pdF9oYW5nIikpKTsKKworLyoKKyAqIFRvIHByb3ZpZGUgYW4gaW50ZXJmYWNlIGZvciBib2FyZCBzcGVjaWZpYyBjb25maWcgdmFsdWVzIGluIHRoaXMgY29tbW9uCisgKiBERFIgc2V0dXAgY29kZSwgd2UgaW1wbGVtZW50IGhlICJ3ZWFrIiBkZWZhdWx0IGZ1bmN0aW9ucyBoZXJlLiBUaGV5IHJldHVybgorICogdGhlIGRlZmF1bHQgdmFsdWUgYmFjayB0byB0aGUgY2FsbGVyLgorICoKKyAqIFBsZWFzZSBzZWUgaW5jbHVkZS9jb25maWdzL3l1Y2NhLmggZm9yIGFuIGV4YW1wbGUgZm9yYSBib2FyZCBzcGVjaWZpYworICogaW1wbGVtZW50YXRpb24uCisgKi8KK3UzMiBfX2Rkcl93cmR0cih1MzIgZGVmYXVsdF92YWwpCit7CisJcmV0dXJuIGRlZmF1bHRfdmFsOworfQordTMyIGRkcl93cmR0cih1MzIpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2Rkcl93cmR0ciIpKSk7CisKK3UzMiBfX2Rkcl9jbGt0cih1MzIgZGVmYXVsdF92YWwpCit7CisJcmV0dXJuIGRlZmF1bHRfdmFsOworfQordTMyIGRkcl9jbGt0cih1MzIpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2Rkcl9jbGt0ciIpKSk7CisKKworLyogUHJpdmF0ZSBTdHJ1Y3R1cmUgRGVmaW5pdGlvbnMgKi8KKworLyogZW51bSBvbmx5IHRvIGVhc2UgY29kZSBmb3IgY2FzIGxhdGVuY3kgc2V0dGluZyAqLwordHlwZWRlZiBlbnVtIGRkcl9jYXNfaWQgeworCUREUl9DQVNfMiAgICAgID0gMjAsCisJRERSX0NBU18yXzUgICAgPSAyNSwKKwlERFJfQ0FTXzMgICAgICA9IDMwLAorCUREUl9DQVNfNCAgICAgID0gNDAsCisJRERSX0NBU181ICAgICAgPSA1MAorfSBkZHJfY2FzX2lkX3Q7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBQcm90b3R5cGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGdldF9zcGRfaW5mbyh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCSB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCSB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzKTsKK3N0YXRpYyB2b2lkIGNoZWNrX21lbV90eXBlKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJICAgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgICB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzKTsKK3N0YXRpYyB2b2lkIGNoZWNrX2ZyZXF1ZW5jeSh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzKTsKK3N0YXRpYyB2b2lkIGNoZWNrX3JhbmtfbnVtYmVyKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzKTsKK3N0YXRpYyB2b2lkIGNoZWNrX3ZvbHRhZ2VfdHlwZSh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzKTsKK3N0YXRpYyB2b2lkIHByb2dyYW1fbWVtb3J5X3F1ZXVlKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJCSB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcyk7CitzdGF0aWMgdm9pZCBwcm9ncmFtX2NvZHQodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcyk7CitzdGF0aWMgdm9pZCBwcm9ncmFtX21vZGUodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcywKKwkJCSBkZHJfY2FzX2lkX3QgKnNlbGVjdGVkX2NhcywKKwkJCSBpbnQgKndyaXRlX3JlY292ZXJ5KTsKK3N0YXRpYyB2b2lkIHByb2dyYW1fdHIodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpOworc3RhdGljIHZvaWQgcHJvZ3JhbV9ydHIodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQl1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCXVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpOworc3RhdGljIHZvaWQgcHJvZ3JhbV9ieGNmKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpOworc3RhdGljIHZvaWQgcHJvZ3JhbV9jb3B0MSh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCSAgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpOworc3RhdGljIHZvaWQgcHJvZ3JhbV9pbml0cGxyKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MsCisJCQkgICAgZGRyX2Nhc19pZF90IHNlbGVjdGVkX2NhcywKKwkJCSAgICBpbnQgd3JpdGVfcmVjb3ZlcnkpOworI2lmZGVmIENPTkZJR19ERFJfRUNDCitzdGF0aWMgdm9pZCBwcm9ncmFtX2VjYyh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCXVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcywKKwkJCXVuc2lnbmVkIGxvbmcgdGxiX3dvcmQyX2lfdmFsdWUpOworI2VuZGlmCisjaWYgIWRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfQVVUT0NBTElCUkFUSU9OKQorc3RhdGljIHZvaWQgcHJvZ3JhbV9EUVNfY2FsaWJyYXRpb24odW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkJdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkJdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcyk7CisjaWZkZWYgSEFSRF9DT0RFRF9EUVMgLyogY2FsaWJyYXRpb24gdGVzdCB3aXRoIGhhcmR2YWx1ZXMgKi8KK3N0YXRpYyB2b2lkCXRlc3Qodm9pZCk7CisjZWxzZQorc3RhdGljIHZvaWQJRFFTX2NhbGlicmF0aW9uX3Byb2Nlc3Modm9pZCk7CisjZW5kaWYKKyNlbmRpZgoraW50IGRvX3Jlc2V0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNwZF9yZWFkKHVjaGFyIGNoaXAsIHVpbnQgYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMl07CisKKwlpZiAoaTJjX3Byb2JlKGNoaXApID09IDApCisJCWlmIChpMmNfcmVhZChjaGlwLCBhZGRyLCAxLCBkYXRhLCAxKSA9PSAwKQorCQkJcmV0dXJuIGRhdGFbMF07CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIGluaXRkcmFtLiAgSW5pdGlhbGl6ZXMgdGhlIDQ0MFNQIE1lbW9yeSBRdWV1ZSBhbmQgRERSIFNEUkFNIGNvbnRyb2xsZXIuCisgKiBOb3RlOiBUaGlzIHJvdXRpbmUgcnVucyBmcm9tIGZsYXNoIHdpdGggYSBzdGFjayBzZXQgdXAgaW4gdGhlIGNoaXAncworICogc3JhbSBzcGFjZS4gIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSByb3V0aW5lIGRvZXMgbm90IHJlcXVpcmUgLnNic3MsIC5ic3Mgb3IKKyAqIC5kYXRhIHNlY3Rpb25zLiAgSXQgYWxzbyBjYW5ub3QgY2FsbCByb3V0aW5lcyB0aGF0IHJlcXVpcmUgdGhlc2Ugc2VjdGlvbnMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOgkgaW5pdGRyYW0KKyAqIERlc2NyaXB0aW9uOiAgQ29uZmlndXJlcyBTRFJBTSBtZW1vcnkgYmFua3MgZm9yIEREUiBvcGVyYXRpb24uCisgKgkJIEF1dG8gTWVtb3J5IENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlYWRzIHRoZSBERFIgU0RSQU0gRUVQUk9NcworICoJCSB2aWEgdGhlIElJQyBidXMgYW5kIHRoZW4gY29uZmlndXJlcyB0aGUgRERSIFNEUkFNIG1lbW9yeQorICoJCSBiYW5rcyBhcHByb3ByaWF0ZWx5LiBJZiBBdXRvIE1lbW9yeSBDb25maWd1cmF0aW9uIGlzCisgKgkJIG5vdCB1c2VkLCBpdCBpcyBhc3N1bWVkIHRoYXQgbm8gRElNTSBpcyBwbHVnZ2VkCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3BoeXNfc2l6ZV90IGluaXRkcmFtKGludCBib2FyZF90eXBlKQoreworCXVuc2lnbmVkIGNoYXIgaWljMF9kaW1tX2FkZHJbXSA9IFNQRF9FRVBST01fQUREUkVTUzsKKwl1bnNpZ25lZCBjaGFyIHNwZDBbTUFYX1NQRF9CWVRFU107CisJdW5zaWduZWQgY2hhciBzcGQxW01BWF9TUERfQllURVNdOworCXVuc2lnbmVkIGNoYXIgKmRpbW1fc3BkW01BWERJTU1TXTsKKwl1bnNpZ25lZCBsb25nIGRpbW1fcG9wdWxhdGVkW01BWERJTU1TXSA9IHtTRFJBTV9OT05FLCBTRFJBTV9OT05FfTsKKwl1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzOwkJLyogb24gYm9hcmQgZGltbSBiYW5rcyAqLworCXVuc2lnbmVkIGxvbmcgdmFsOworCWRkcl9jYXNfaWRfdCBzZWxlY3RlZF9jYXMgPSBERFJfQ0FTXzU7CS8qIHByZXNldCB0byBzaWxlbmNlIGNvbXBpbGVyICovCisJaW50IHdyaXRlX3JlY292ZXJ5OworCXBoeXNfc2l6ZV90IGRyYW1fc2l6ZSA9IDA7CisKKwludW1fZGltbV9iYW5rcyA9IHNpemVvZihpaWMwX2RpbW1fYWRkcik7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFNldCB1cCBhbiBhcnJheSBvZiBTUEQgbWF0cml4ZXMuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZGltbV9zcGRbMF0gPSBzcGQwOworCWRpbW1fc3BkWzFdID0gc3BkMTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogUmVzZXQgdGhlIEREUi1TRFJBTSBjb250cm9sbGVyLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW10c2RyKFNEUjBfU1JTVCwgKDB4ODAwMDAwMDAgPj4gMTApKTsKKwltdHNkcihTRFIwX1NSU1QsIDB4MDAwMDAwMDApOworCisJLyoKKwkgKiBNYWtlIHN1cmUgSTJDIGNvbnRyb2xsZXIgaXMgaW5pdGlhbGl6ZWQKKwkgKiBiZWZvcmUgY29udGludWluZy4KKwkgKi8KKworCS8qIHN3aXRjaCB0byBjb3JyZWN0IEkyQyBidXMgKi8KKwlJMkNfU0VUX0JVUyhDT05GSUdfU1lTX1NQRF9CVVNfTlVNKTsKKwlpMmNfaW5pdChDT05GSUdfU1lTX0kyQ19TUEVFRCwgQ09ORklHX1NZU19JMkNfU0xBVkUpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBDbGVhciBvdXQgdGhlIHNlcmlhbCBwcmVzZW5jZSBkZXRlY3QgYnVmZmVycy4KKwkgKiBQZXJmb3JtIElJQyByZWFkcyBmcm9tIHRoZSBkaW1tLiAgRmlsbCBpbiB0aGUgc3Bkcy4KKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGRpbW0gc2xvdHMgYXJlIHBvcHVsYXRlZAorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWdldF9zcGRfaW5mbyhkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogQ2hlY2sgdGhlIG1lbW9yeSB0eXBlIGZvciB0aGUgZGltbXMgcGx1Z2dlZC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwljaGVja19tZW1fdHlwZShkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogQ2hlY2sgdGhlIGZyZXF1ZW5jeSBzdXBwb3J0ZWQgZm9yIHRoZSBkaW1tcyBwbHVnZ2VkLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWNoZWNrX2ZyZXF1ZW5jeShkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogQ2hlY2sgdGhlIHRvdGFsIHJhbmsgbnVtYmVyLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWNoZWNrX3JhbmtfbnVtYmVyKGRpbW1fcG9wdWxhdGVkLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBDaGVjayB0aGUgdm9sdGFnZSB0eXBlIGZvciB0aGUgZGltbXMgcGx1Z2dlZC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwljaGVja192b2x0YWdlX3R5cGUoZGltbV9wb3B1bGF0ZWQsIGlpYzBfZGltbV9hZGRyLCBudW1fZGltbV9iYW5rcyk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFByb2dyYW0gU0RSQU0gY29udHJvbGxlciBvcHRpb25zIDIgcmVnaXN0ZXIKKwkgKiBFeGNlcHQgRW5hYmxpbmcgb2YgdGhlIG1lbW9yeSBjb250cm9sbGVyLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW1mc2RyYW0oU0RSQU1fTUNPUFQyLCB2YWwpOworCW10c2RyYW0oU0RSQU1fTUNPUFQyLAorCQkodmFsICYKKwkJIH4oU0RSQU1fTUNPUFQyX1NSRU5fTUFTSyB8IFNEUkFNX01DT1BUMl9QTUVOX01BU0sgfAorCQkgICBTRFJBTV9NQ09QVDJfSVBUUl9NQVNLIHwgU0RSQU1fTUNPUFQyX1hTUlBfTUFTSyB8CisJCSAgIFNEUkFNX01DT1BUMl9JU0lFX01BU0spKQorCQl8IChTRFJBTV9NQ09QVDJfU1JFTl9FTlRFUiB8IFNEUkFNX01DT1BUMl9QTUVOX0RJU0FCTEUgfAorCQkgICBTRFJBTV9NQ09QVDJfSVBUUl9JRExFIHwgU0RSQU1fTUNPUFQyX1hTUlBfQUxMT1cgfAorCQkgICBTRFJBTV9NQ09QVDJfSVNJRV9FTkFCTEUpKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogUHJvZ3JhbSBTRFJBTSBjb250cm9sbGVyIG9wdGlvbnMgMSByZWdpc3RlcgorCSAqIE5vdGU6IERvZXMgbm90IGVuYWJsZSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcHJvZ3JhbV9jb3B0MShkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0IHRoZSBTRFJBTSBDb250cm9sbGVyIE9uIERpZSBUZXJtaW5hdGlvbiBSZWdpc3RlcgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXByb2dyYW1fY29kdChkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogUHJvZ3JhbSBTRFJBTSByZWZyZXNoIHJlZ2lzdGVyLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXByb2dyYW1fcnRyKGRpbW1fcG9wdWxhdGVkLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBQcm9ncmFtIFNEUkFNIG1vZGUgcmVnaXN0ZXIuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcHJvZ3JhbV9tb2RlKGRpbW1fcG9wdWxhdGVkLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MsCisJCSAgICAgJnNlbGVjdGVkX2NhcywgJndyaXRlX3JlY292ZXJ5KTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0IHRoZSBTRFJBTSBXcml0ZSBEYXRhL0RNL0RRUyBDbG9jayBUaW1pbmcgUmVnCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbWZzZHJhbShTRFJBTV9XUkRUUiwgdmFsKTsKKwltdHNkcmFtKFNEUkFNX1dSRFRSLCAodmFsICYgfihTRFJBTV9XUkRUUl9MTFdQX01BU0sgfCBTRFJBTV9XUkRUUl9XVFJfTUFTSykpIHwKKwkJZGRyX3dyZHRyKFNEUkFNX1dSRFRSX0xMV1BfMV9DWUMgfCBTRFJBTV9XUkRUUl9XVFJfOTBfREVHX0FEVikpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXQgdGhlIFNEUkFNIENsb2NrIFRpbWluZyBSZWdpc3RlcgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW1mc2RyYW0oU0RSQU1fQ0xLVFIsIHZhbCk7CisJbXRzZHJhbShTRFJBTV9DTEtUUiwgKHZhbCAmIH5TRFJBTV9DTEtUUl9DTEtQX01BU0spIHwKKwkJZGRyX2Nsa3RyKFNEUkFNX0NMS1RSX0NMS1BfMF9ERUcpKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogUHJvZ3JhbSB0aGUgQnhDRiByZWdpc3RlcnMuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcHJvZ3JhbV9ieGNmKGRpbW1fcG9wdWxhdGVkLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBQcm9ncmFtIFNEUkFNIHRpbWluZyByZWdpc3RlcnMuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcHJvZ3JhbV90cihkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0IHRoZSBFeHRlbmRlZCBNb2RlIHJlZ2lzdGVyCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbWZzZHJhbShTRFJBTV9NRU1PREUsIHZhbCk7CisJbXRzZHJhbShTRFJBTV9NRU1PREUsCisJCSh2YWwgJiB+KFNEUkFNX01FTU9ERV9ESUNfTUFTSyAgfCBTRFJBTV9NRU1PREVfRExMX01BU0sgfAorCQkJIFNEUkFNX01FTU9ERV9SVFRfTUFTSyB8IFNEUkFNX01FTU9ERV9EUVNfTUFTSykpIHwKKwkJKFNEUkFNX01FTU9ERV9ESUNfTk9STUFMIHwgU0RSQU1fTUVNT0RFX0RMTF9FTkFCTEUKKwkJIHwgU0RSQU1fTUVNT0RFX1JUVF8xNTBPSE0gfCBTRFJBTV9NRU1PREVfRFFTX0VOQUJMRSkpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBQcm9ncmFtIEluaXRpYWxpemF0aW9uIHByZWxvYWQgcmVnaXN0ZXJzLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXByb2dyYW1faW5pdHBscihkaW1tX3BvcHVsYXRlZCwgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzLAorCQkJc2VsZWN0ZWRfY2FzLCB3cml0ZV9yZWNvdmVyeSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIERlbGF5IHRvIGVuc3VyZSAyMDB1c2VjIGhhdmUgZWxhcHNlZCBzaW5jZSByZXNldC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwl1ZGVsYXkoNDAwKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0IHRoZSBtZW1vcnkgcXVldWUgY29yZSBiYXNlIGFkZHIuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcHJvZ3JhbV9tZW1vcnlfcXVldWUoZGltbV9wb3B1bGF0ZWQsIGlpYzBfZGltbV9hZGRyLCBudW1fZGltbV9iYW5rcyk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFByb2dyYW0gU0RSQU0gY29udHJvbGxlciBvcHRpb25zIDIgcmVnaXN0ZXIKKwkgKiBFbmFibGUgdGhlIG1lbW9yeSBjb250cm9sbGVyLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW1mc2RyYW0oU0RSQU1fTUNPUFQyLCB2YWwpOworCW10c2RyYW0oU0RSQU1fTUNPUFQyLAorCQkodmFsICYgfihTRFJBTV9NQ09QVDJfU1JFTl9NQVNLIHwgU0RSQU1fTUNPUFQyX0RDRU5fTUFTSyB8CisJCQkgU0RSQU1fTUNPUFQyX0lQVFJfTUFTSyB8IFNEUkFNX01DT1BUMl9JU0lFX01BU0spKSB8CisJCQkgU0RSQU1fTUNPUFQyX0lQVFJfRVhFQ1VURSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFdhaXQgZm9yIElQVFJfRVhFQ1VURSBpbml0IHNlcXVlbmNlIHRvIGNvbXBsZXRlLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWRvIHsKKwkJbWZzZHJhbShTRFJBTV9NQ1NUQVQsIHZhbCk7CisJfSB3aGlsZSAoKHZhbCAmIFNEUkFNX01DU1RBVF9NSUNfTUFTSykgPT0gU0RSQU1fTUNTVEFUX01JQ19OT1RDT01QKTsKKworCS8qIGVuYWJsZSB0aGUgY29udHJvbGxlciBvbmx5IGFmdGVyIGluaXQgc2VxdWVuY2UgY29tcGxldGVzICovCisJbWZzZHJhbShTRFJBTV9NQ09QVDIsIHZhbCk7CisJbXRzZHJhbShTRFJBTV9NQ09QVDIsICh2YWwgfCBTRFJBTV9NQ09QVDJfRENFTl9FTkFCTEUpKTsKKworCS8qIE1ha2Ugc3VyZSBkZWxheS1saW5lIGNhbGlicmF0aW9uIGlzIGRvbmUgYmVmb3JlIHByb2NlZWRpbmcgKi8KKwlkbyB7CisJCW1mc2RyYW0oU0RSQU1fRExDUiwgdmFsKTsKKwl9IHdoaWxlICghKHZhbCAmIFNEUkFNX0RMQ1JfRExDU19DT01QTEVURSkpOworCisJLyogZ2V0IGluc3RhbGxlZCBtZW1vcnkgc2l6ZSAqLworCWRyYW1fc2l6ZSA9IHNkcmFtX21lbXNpemUoKTsKKworCS8qCisJICogTGltaXQgc2l6ZSB0byAyR0IKKwkgKi8KKwlpZiAoZHJhbV9zaXplID4gQ09ORklHX01BWF9NRU1fTUFQUEVEKQorCQlkcmFtX3NpemUgPSBDT05GSUdfTUFYX01FTV9NQVBQRUQ7CisKKwkvKiBhbmQgcHJvZ3JhbSB0bGIgZW50cmllcyBmb3IgdGhpcyBzaXplIChkeW5hbWljKSAqLworCisJLyoKKwkgKiBQcm9ncmFtIFRMQiBlbnRyaWVzIHdpdGggY2FjaGVzIGVuYWJsZWQsIGZvciBiZXN0IHBlcmZvcm1hY2UKKwkgKiB3aGlsZSBhdXRvLWNhbGlicmF0aW5nIGFuZCBFQ0MgZ2VuZXJhdGlvbgorCSAqLworCXByb2dyYW1fdGxiKDAsIDAsIGRyYW1fc2l6ZSwgMCk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIERRUyBjYWxpYnJhdGlvbi4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QUEM0eHhfRERSX0FVVE9DQUxJQlJBVElPTikKKwlEUVNfYXV0b2NhbGlicmF0aW9uKCk7CisjZWxzZQorCXByb2dyYW1fRFFTX2NhbGlicmF0aW9uKGRpbW1fcG9wdWxhdGVkLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRERSX0VDQworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogSWYgZWNjIGlzIGVuYWJsZWQsIGluaXRpYWxpemUgdGhlIHBhcml0eSBiaXRzLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXByb2dyYW1fZWNjKGRpbW1fcG9wdWxhdGVkLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MsIDApOworI2VuZGlmCisKKwkvKgorCSAqIE5vdyBhZnRlciBpbml0aWFsaXphdGlvbiAoYXV0by1jYWxpYnJhdGlvbiBhbmQgRUNDIGdlbmVyYXRpb24pCisJICogcmVtb3ZlIHRoZSBUTEIgZW50cmllcyB3aXRoIGNhY2hlcyBlbmFibGVkIGFuZCBwcm9ncmFtIGFnYWluIHdpdGgKKwkgKiBkZXNpcmVkIGNhY2hlIGZ1bmN0aW9uYWxpdHkKKwkgKi8KKwlyZW1vdmVfdGxiKDAsIGRyYW1fc2l6ZSk7CisJcHJvZ3JhbV90bGIoMCwgMCwgZHJhbV9zaXplLCBNWV9UTEJfV09SRDJfSV9FTkFCTEUpOworCisJcHBjNHh4X2libV9kZHIyX3JlZ2lzdGVyX2R1bXAoKTsKKworCS8qCisJICogQ2xlYXIgcG90ZW50aWFsIGVycm9ycyByZXN1bHRpbmcgZnJvbSBhdXRvLWNhbGlicmF0aW9uLgorCSAqIElmIG5vdCBkb25lLCB0aGVuIHdlIGNvdWxkIGdldCBhbiBpbnRlcnJ1cHQgbGF0ZXIgb24gd2hlbgorCSAqIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCisJICovCisJc2V0X21jc3IoZ2V0X21jc3IoKSk7CisKKwlyZXR1cm4gc2RyYW1fbWVtc2l6ZSgpOworfQorCitzdGF0aWMgdm9pZCBnZXRfc3BkX2luZm8odW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgZGltbV9mb3VuZDsKKwl1bnNpZ25lZCBjaGFyIG51bV9vZl9ieXRlczsKKwl1bnNpZ25lZCBjaGFyIHRvdGFsX3NpemU7CisKKwlkaW1tX2ZvdW5kID0gRkFMU0U7CisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJbnVtX29mX2J5dGVzID0gMDsKKwkJdG90YWxfc2l6ZSA9IDA7CisKKwkJbnVtX29mX2J5dGVzID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAwKTsKKwkJZGVidWcoIlxuc3BkX3JlYWQoMHgleCkgcmV0dXJuZWQgJWRcbiIsCisJCSAgICAgIGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgbnVtX29mX2J5dGVzKTsKKwkJdG90YWxfc2l6ZSA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMSk7CisJCWRlYnVnKCJzcGRfcmVhZCgweCV4KSByZXR1cm5lZCAlZFxuIiwKKwkJICAgICAgaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCB0b3RhbF9zaXplKTsKKworCQlpZiAoKG51bV9vZl9ieXRlcyAhPSAwKSAmJiAodG90YWxfc2l6ZSAhPSAwKSkgeworCQkJZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dID0gVFJVRTsKKwkJCWRpbW1fZm91bmQgPSBUUlVFOworCQkJZGVidWcoIkRJTU0gc2xvdCAlbHU6IHBvcHVsYXRlZFxuIiwgZGltbV9udW0pOworCQl9IGVsc2UgeworCQkJZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dID0gRkFMU0U7CisJCQlkZWJ1ZygiRElNTSBzbG90ICVsdTogTm90IHBvcHVsYXRlZFxuIiwgZGltbV9udW0pOworCQl9CisJfQorCisJaWYgKGRpbW1fZm91bmQgPT0gRkFMU0UpIHsKKwkJcHJpbnRmKCJFUlJPUiAtIE5vIG1lbW9yeSBpbnN0YWxsZWQuIEluc3RhbGwgYSBERFItU0RSQU0gRElNTS5cblxuIik7CisJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRm9yIHRoZSBtZW1vcnkgRElNTXMgaW5zdGFsbGVkLCB0aGlzIHJvdXRpbmUgdmVyaWZpZXMgdGhhdCB0aGV5CisgKiByZWFsbHkgYXJlIEREUiBzcGVjaWZpYyBESU1Ncy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgY2hlY2tfbWVtX3R5cGUodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgICB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBsb25nIGRpbW1fdHlwZTsKKworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCWlmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gPT0gVFJVRSkgeworCQkJZGltbV90eXBlID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyKTsKKwkJCXN3aXRjaCAoZGltbV90eXBlKSB7CisJCQljYXNlIDE6CisJCQkJcHJpbnRmKCJFUlJPUjogU3RhbmRhcmQgRmFzdCBQYWdlIE1vZGUgRFJBTSBESU1NIGRldGVjdGVkIGluICIKKwkJCQkgICAgICAgInNsb3QgJWQuXG4iLCAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKKwkJCQlwcmludGYoIk9ubHkgRERSIGFuZCBERFIyIFNEUkFNIERJTU1zIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKwkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcHJpbnRmKCJFUlJPUjogRURPIERJTU0gZGV0ZWN0ZWQgaW4gc2xvdCAlZC5cbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOworCQkJCXByaW50ZigiT25seSBERFIgYW5kIEREUjIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOworCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwcmludGYoIkVSUk9SOiBQaXBlbGluZWQgTmliYmxlIERJTU0gZGV0ZWN0ZWQgaW4gc2xvdCAlZC5cbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOworCQkJCXByaW50ZigiT25seSBERFIgYW5kIEREUjIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOworCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlwcmludGYoIkVSUk9SOiBTRFJBTSBESU1NIGRldGVjdGVkIGluIHNsb3QgJWQuXG4iLAorCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKKwkJCQlwcmludGYoIk9ubHkgRERSIGFuZCBERFIyIFNEUkFNIERJTU1zIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKwkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJcHJpbnRmKCJFUlJPUjogTXVsdGlwbGV4ZWQgUk9NIERJTU0gZGV0ZWN0ZWQgaW4gc2xvdCAlZC5cbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOworCQkJCXByaW50ZigiT25seSBERFIgYW5kIEREUjIgU0RSQU0gRElNTXMgYXJlIHN1cHBvcnRlZC5cbiIpOworCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjoKKwkJCQlwcmludGYoIkVSUk9SOiBTR1JBTSBESU1NIGRldGVjdGVkIGluIHNsb3QgJWQuXG4iLAorCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKKwkJCQlwcmludGYoIk9ubHkgRERSIGFuZCBERFIyIFNEUkFNIERJTU1zIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKwkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJZGVidWcoIkRJTU0gc2xvdCAlbHU6IEREUjEgU0RSQU0gZGV0ZWN0ZWRcbiIsIGRpbW1fbnVtKTsKKwkJCQlkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gPSBTRFJBTV9ERFIxOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCWRlYnVnKCJESU1NIHNsb3QgJWx1OiBERFIyIFNEUkFNIGRldGVjdGVkXG4iLCBkaW1tX251bSk7CisJCQkJZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dID0gU0RSQU1fRERSMjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCJFUlJPUjogVW5rbm93biBESU1NIGRldGVjdGVkIGluIHNsb3QgJWQuXG4iLAorCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKKwkJCQlwcmludGYoIk9ubHkgRERSMSBhbmQgRERSMiBTRFJBTSBESU1NcyBhcmUgc3VwcG9ydGVkLlxuIik7CisJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWZvciAoZGltbV9udW0gPSAxOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCWlmICgoZGltbV9wb3B1bGF0ZWRbZGltbV9udW0tMV0gIT0gU0RSQU1fTk9ORSkKKwkJICAgICYmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gICAhPSBTRFJBTV9OT05FKQorCQkgICAgJiYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtLTFdICE9IGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSkpIHsKKwkJCXByaW50ZigiRVJST1I6IERJTU0ncyBERFIxIGFuZCBERFIyIHR5cGUgY2FuIG5vdCBiZSBtaXhlZC5cbiIpOworCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGb3IgdGhlIG1lbW9yeSBESU1NcyBpbnN0YWxsZWQsIHRoaXMgcm91dGluZSB2ZXJpZmllcyB0aGF0CisgKiBmcmVxdWVuY3kgcHJldmlvdXNseSBjYWxjdWxhdGVkIGlzIHN1cHBvcnRlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgY2hlY2tfZnJlcXVlbmN5KHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBsb25nIHRjeWNfcmVnOworCXVuc2lnbmVkIGxvbmcgY3ljbGVfdGltZTsKKwl1bnNpZ25lZCBsb25nIGNhbGNfY3ljbGVfdGltZTsKKwl1bnNpZ25lZCBsb25nIHNkcmFtX2ZyZXE7CisJdW5zaWduZWQgbG9uZyBzZHJfZGRycGxsOworCVBQQzR4eF9TWVNfSU5GTyBib2FyZF9jZmc7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEdldCB0aGUgYm9hcmQgY29uZmlndXJhdGlvbiBpbmZvLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWdldF9zeXNfaW5mbygmYm9hcmRfY2ZnKTsKKworCW1mc2RyKFNEUjBfRERSMCwgc2RyX2RkcnBsbCk7CisJc2RyYW1fZnJlcSA9ICgoYm9hcmRfY2ZnLmZyZXFQTEIpICogU0RSMF9ERFIwX0REUk1fREVDT0RFKHNkcl9kZHJwbGwpKTsKKworCS8qCisJICogY2FsY19jeWNsZV90aW1lIGlzIGNhbGN1bGF0ZWQgZnJvbSBERFIgZnJlcXVlbmN5IHNldCBieSBib2FyZC9jaGlwCisJICogYW5kIGlzIGV4cHJlc3NlZCBpbiBtdWx0aXBsZSBvZiAxMCBwaWNvc2Vjb25kcworCSAqIHRvIG1hdGNoIHRoZSB3YXkgRElNTSBjeWNsZSB0aW1lIGlzIGNhbGN1bGF0ZWQgYmVsb3cuCisJICovCisJY2FsY19jeWNsZV90aW1lID0gTVVMRElWNjQoT05FX0JJTExJT04sIDEwMCwgc2RyYW1fZnJlcSk7CisKKwlmb3IgKGRpbW1fbnVtID0gMDsgZGltbV9udW0gPCBudW1fZGltbV9iYW5rczsgZGltbV9udW0rKykgeworCQlpZiAoZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dICE9IFNEUkFNX05PTkUpIHsKKwkJCXRjeWNfcmVnID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCA5KTsKKwkJCS8qCisJCQkgKiBCeXRlIDksIEN5Y2xlIHRpbWUgZm9yIENBUyBMYXRlbmN5PVgsIGlzIHNwbGl0IGludG8gdHdvIG5pYmJsZXM6CisJCQkgKiB0aGUgaGlnaGVyIG9yZGVyIG5pYmJsZSAoYml0cyA0LTcpIGRlc2lnbmF0ZXMgdGhlIGN5Y2xlIHRpbWUKKwkJCSAqIHRvIGEgZ3JhbnVsYXJpdHkgb2YgMW5zOworCQkJICogdGhlIHZhbHVlIHByZXNlbnRlZCBieSB0aGUgbG93ZXIgb3JkZXIgbmliYmxlIChiaXRzIDAtMykKKwkJCSAqIGhhcyBhIGdyYW51bGFyaXR5IG9mIC4xbnMgYW5kIGlzIGFkZGVkIHRvIHRoZSB2YWx1ZSBkZXNpZ25hdGVkCisJCQkgKiBieSB0aGUgaGlnaGVyIG5pYmJsZS4gSW4gYWRkaXRpb24sIGZvdXIgbGluZXMgb2YgdGhlIGxvd2VyIG9yZGVyCisJCQkgKiBuaWJibGUgYXJlIGFzc2lnbmVkIHRvIHN1cHBvcnQgKy4yNSwrLjMzLCArLjY2IGFuZCArLjc1LgorCQkJICovCisJCQkgLyogQ29udmVydCBmcm9tIGhleCB0byBkZWNpbWFsICovCisJCQlpZiAoKHRjeWNfcmVnICYgMHgwRikgPT0gMHgwRCkKKwkJCQljeWNsZV90aW1lID0gKCgodGN5Y19yZWcgJiAweEYwKSA+PiA0KSAqIDEwMCkgKyA3NTsKKwkJCWVsc2UgaWYgKCh0Y3ljX3JlZyAmIDB4MEYpID09IDB4MEMpCisJCQkJY3ljbGVfdGltZSA9ICgoKHRjeWNfcmVnICYgMHhGMCkgPj4gNCkgKiAxMDApICsgNjY7CisJCQllbHNlIGlmICgodGN5Y19yZWcgJiAweDBGKSA9PSAweDBCKQorCQkJCWN5Y2xlX3RpbWUgPSAoKCh0Y3ljX3JlZyAmIDB4RjApID4+IDQpICogMTAwKSArIDMzOworCQkJZWxzZSBpZiAoKHRjeWNfcmVnICYgMHgwRikgPT0gMHgwQSkKKwkJCQljeWNsZV90aW1lID0gKCgodGN5Y19yZWcgJiAweEYwKSA+PiA0KSAqIDEwMCkgKyAyNTsKKwkJCWVsc2UKKwkJCQljeWNsZV90aW1lID0gKCgodGN5Y19yZWcgJiAweEYwKSA+PiA0KSAqIDEwMCkgKworCQkJCQkoKHRjeWNfcmVnICYgMHgwRikqMTApOworCQkJZGVidWcoImN5Y2xlX3RpbWU9JWx1IFsxMCBwaWNvc2Vjb25kc11cbiIsIGN5Y2xlX3RpbWUpOworCisJCQlpZiAgKGN5Y2xlX3RpbWUgPiAoY2FsY19jeWNsZV90aW1lICsgMTApKSB7CisJCQkJLyoKKwkJCQkgKiB0aGUgcHJvdmlkZWQgc2RyYW0gY3ljbGVfdGltZSBpcyB0b28gc21hbGwKKwkJCQkgKiBmb3IgdGhlIGF2YWlsYWJsZSBESU1NIGN5Y2xlX3RpbWUuCisJCQkJICogVGhlIGFkZGl0aW9ubmFsIDEwMHBzIGlzIGhlcmUgdG8gYWNjZXB0IGEgc21hbGwgaW5jZXJ0YWludHkuCisJCQkJICovCisJCQkJcHJpbnRmKCJFUlJPUjogRFJBTSBESU1NIGRldGVjdGVkIHdpdGggY3ljbGVfdGltZSAlZCBwcyBpbiAiCisJCQkJICAgICAgICJzbG90ICVkIFxuIHdoaWxlIGNhbGN1bGF0ZWQgY3ljbGUgdGltZSBpcyAlZCBwcy5cbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpKGN5Y2xlX3RpbWUqMTApLAorCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtLAorCQkJCSAgICAgICAodW5zaWduZWQgaW50KShjYWxjX2N5Y2xlX3RpbWUqMTApKTsKKwkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0sIG9yIGNoYW5nZSBERFIgZnJlcXVlbmN5IHZpYSAiCisJCQkJICAgICAgICJzdHJhcHBpbmcgYml0cy5cblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGb3IgdGhlIG1lbW9yeSBESU1NcyBpbnN0YWxsZWQsIHRoaXMgcm91dGluZSB2ZXJpZmllcyB0d28KKyAqIHJhbmtzL2JhbmtzIG1heGltdW0gYXJlIGF2YWlsYWJsZXMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3JhbmtfbnVtYmVyKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzKQoreworCXVuc2lnbmVkIGxvbmcgZGltbV9udW07CisJdW5zaWduZWQgbG9uZyBkaW1tX3Jhbms7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9yYW5rID0gMDsKKworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCWlmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gIT0gU0RSQU1fTk9ORSkgeworCQkJZGltbV9yYW5rID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCA1KTsKKwkJCWlmICgoKHVuc2lnbmVkIGxvbmcpc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyKSkgPT0gMHgwOCkKKwkJCQlkaW1tX3JhbmsgPSAoZGltbV9yYW5rICYgMHgwRikgKzE7CisJCQllbHNlCisJCQkJZGltbV9yYW5rID0gZGltbV9yYW5rICYgMHgwRjsKKworCisJCQlpZiAoZGltbV9yYW5rID4gTUFYUkFOS1MpIHsKKwkJCQlwcmludGYoIkVSUk9SOiBEUkFNIERJTU0gZGV0ZWN0ZWQgd2l0aCAlbHUgcmFua3MgaW4gIgorCQkJCSAgICAgICAic2xvdCAlbHUgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGRpbW1fcmFuaywgZGltbV9udW0pOworCQkJCXByaW50ZigiT25seSAlZCByYW5rcyBhcmUgc3VwcG9ydGVkIGZvciBhbGwgRElNTS5cbiIsIE1BWFJBTktTKTsKKwkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCQl9IGVsc2UKKwkJCQl0b3RhbF9yYW5rICs9IGRpbW1fcmFuazsKKwkJfQorCQlpZiAodG90YWxfcmFuayA+IE1BWFJBTktTKSB7CisJCQlwcmludGYoIkVSUk9SOiBEUkFNIERJTU0gZGV0ZWN0ZWQgd2l0aCBhIHRvdGFsIG9mICVkIHJhbmtzICIKKwkJCSAgICAgICAiZm9yIGFsbCBzbG90cy5cbiIsICh1bnNpZ25lZCBpbnQpdG90YWxfcmFuayk7CisJCQlwcmludGYoIk9ubHkgJWQgcmFua3MgYXJlIHN1cHBvcnRlZCBmb3IgYWxsIERJTU0uXG4iLCBNQVhSQU5LUyk7CisJCQlwcmludGYoIlJlbW92ZSBvbmUgb2YgdGhlIERJTU0gbW9kdWxlcy5cblxuIik7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJfQorCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9ubHkgc3VwcG9ydCAyLjVWIG1vZHVsZXMuCisgKiBUaGlzIHJvdXRpbmUgdmVyaWZpZXMgdGhpcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgY2hlY2tfdm9sdGFnZV90eXBlKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBsb25nIHZvbHRhZ2VfdHlwZTsKKworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCWlmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gIT0gU0RSQU1fTk9ORSkgeworCQkJdm9sdGFnZV90eXBlID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCA4KTsKKwkJCXN3aXRjaCAodm9sdGFnZV90eXBlKSB7CisJCQljYXNlIDB4MDA6CisJCQkJcHJpbnRmKCJFUlJPUjogT25seSBESU1NcyBERFIgMi41ViBvciBERFIyIDEuOFYgYXJlIHN1cHBvcnRlZC5cbiIpOworCQkJCXByaW50ZigiVGhpcyBESU1NIGlzIDUuMCBWb2x0L1RUTC5cbiIpOworCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgaW4gc2xvdCAlZCB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAxOgorCQkJCXByaW50ZigiRVJST1I6IE9ubHkgRElNTXMgRERSIDIuNVYgb3IgRERSMiAxLjhWIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKwkJCQlwcmludGYoIlRoaXMgRElNTSBpcyBMVlRUTC5cbiIpOworCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgaW4gc2xvdCAlZCB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAyOgorCQkJCXByaW50ZigiRVJST1I6IE9ubHkgRElNTXMgRERSIDIuNVYgb3IgRERSMiAxLjhWIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKwkJCQlwcmludGYoIlRoaXMgRElNTSBpcyAxLjUgVm9sdC5cbiIpOworCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgaW4gc2xvdCAlZCB3aXRoIGEgc3VwcG9ydGVkIERJTU0uXG5cbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAzOgorCQkJCXByaW50ZigiRVJST1I6IE9ubHkgRElNTXMgRERSIDIuNVYgb3IgRERSMiAxLjhWIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKwkJCQlwcmludGYoIlRoaXMgRElNTSBpcyAzLjMgVm9sdC9UVEwuXG4iKTsKKwkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIGluIHNsb3QgJWQgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iLAorCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwNDoKKwkJCQkvKiAyLjUgVm9sdGFnZSBvbmx5IGZvciBERFIxICovCisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDU6CisJCQkJLyogMS44IFZvbHRhZ2Ugb25seSBmb3IgRERSMiAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIkVSUk9SOiBPbmx5IERJTU1zIEREUiAyLjVWIG9yIEREUjIgMS44ViBhcmUgc3VwcG9ydGVkLlxuIik7CisJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBESU1NIG1vZHVsZSBpbiBzbG90ICVkIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBwcm9ncmFtX2NvcHQxLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBwcm9ncmFtX2NvcHQxKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJICB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCSAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgbWNvcHQxOworCXVuc2lnbmVkIGxvbmcgZWNjX2VuYWJsZWQ7CisJdW5zaWduZWQgbG9uZyBlY2MgPSAwOworCXVuc2lnbmVkIGxvbmcgZGF0YV93aWR0aCA9IDA7CisJdW5zaWduZWQgbG9uZyBkaW1tXzMyYml0OworCXVuc2lnbmVkIGxvbmcgZGltbV82NGJpdDsKKwl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgYXR0cmlidXRlID0gMDsKKwl1bnNpZ25lZCBsb25nIGJ1ZjAsIGJ1ZjE7IC8qIFRPRE86IGNvZGUgdG8gYmUgY2hhbmdlZCBmb3IgSU9QMS42IHRvIHN1cHBvcnQgNCBESU1NcyAqLworCXVuc2lnbmVkIGxvbmcgYmFua2NvdW50OworCXVuc2lnbmVkIGxvbmcgZGRydHlwZTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworI2lmZGVmIENPTkZJR19ERFJfRUNDCisJZWNjX2VuYWJsZWQgPSBUUlVFOworI2Vsc2UKKwllY2NfZW5hYmxlZCA9IEZBTFNFOworI2VuZGlmCisJZGltbV8zMmJpdCA9IEZBTFNFOworCWRpbW1fNjRiaXQgPSBGQUxTRTsKKwlidWYwID0gRkFMU0U7CisJYnVmMSA9IEZBTFNFOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXQgbWVtb3J5IGNvbnRyb2xsZXIgb3B0aW9ucyByZWcgMSwgU0RSQU1fTUNPUFQxLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW1mc2RyYW0oU0RSQU1fTUNPUFQxLCB2YWwpOworCW1jb3B0MSA9IHZhbCAmIH4oU0RSQU1fTUNPUFQxX01DSEtfTUFTSyB8IFNEUkFNX01DT1BUMV9SREVOX01BU0sgfAorCQkJIFNEUkFNX01DT1BUMV9QTVVfTUFTSyAgfCBTRFJBTV9NQ09QVDFfRE1XRF9NQVNLIHwKKwkJCSBTRFJBTV9NQ09QVDFfVUlPU19NQVNLIHwgU0RSQU1fTUNPUFQxX0JDTlRfTUFTSyB8CisJCQkgU0RSQU1fTUNPUFQxX0REUl9UWVBFX01BU0sgfCBTRFJBTV9NQ09QVDFfUldPT19NQVNLIHwKKwkJCSBTRFJBTV9NQ09QVDFfV09PT19NQVNLIHwgU0RSQU1fTUNPUFQxX0RDT09fTUFTSyB8CisJCQkgU0RSQU1fTUNPUFQxX0RSRUZfTUFTSyk7CisKKwltY29wdDEgfD0gU0RSQU1fTUNPUFQxX1FERVA7CisJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9QTVVfT1BFTjsKKwltY29wdDEgfD0gU0RSQU1fTUNPUFQxX1JXT09fRElTQUJMRUQ7CisJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9XT09PX0RJU0FCTEVEOworCW1jb3B0MSB8PSBTRFJBTV9NQ09QVDFfRENPT19ESVNBQkxFRDsKKwltY29wdDEgfD0gU0RSQU1fTUNPUFQxX0RSRUZfTk9STUFMOworCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSAhPSBTRFJBTV9OT05FKSB7CisJCQkvKiB0ZXN0IGVjYyBzdXBwb3J0ICovCisJCQllY2MgPSAodW5zaWduZWQgbG9uZylzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDExKTsKKwkJCWlmIChlY2MgIT0gMHgwMikgLyogZWNjIG5vdCBzdXBwb3J0ZWQgKi8KKwkJCQllY2NfZW5hYmxlZCA9IEZBTFNFOworCisJCQkvKiB0ZXN0IGJhbmsgY291bnQgKi8KKwkJCWJhbmtjb3VudCA9ICh1bnNpZ25lZCBsb25nKXNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMTcpOworCQkJaWYgKGJhbmtjb3VudCA9PSAweDA0KSAvKiBiYW5rIGNvdW50ID0gNCAqLworCQkJCW1jb3B0MSB8PSBTRFJBTV9NQ09QVDFfNF9CQU5LUzsKKwkJCWVsc2UgLyogYmFuayBjb3VudCA9IDggKi8KKwkJCQltY29wdDEgfD0gU0RSQU1fTUNPUFQxXzhfQkFOS1M7CisKKwkJCS8qIHRlc3QgRERSIHR5cGUgKi8KKwkJCWRkcnR5cGUgPSAodW5zaWduZWQgbG9uZylzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDIpOworCQkJLyogdGVzdCBmb3IgYnVmZmVyZWQvdW5idWZmZXJlZCwgcmVnaXN0ZXJlZCwgZGlmZmVyZW50aWFsIGNsb2NrcyAqLworCQkJcmVnaXN0ZXJlZCA9ICh1bnNpZ25lZCBsb25nKXNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMjApOworCQkJYXR0cmlidXRlID0gKHVuc2lnbmVkIGxvbmcpc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyMSk7CisKKwkJCS8qIFRPRE86IGNvZGUgdG8gYmUgY2hhbmdlZCBmb3IgSU9QMS42IHRvIHN1cHBvcnQgNCBESU1NcyAqLworCQkJaWYgKGRpbW1fbnVtID09IDApIHsKKwkJCQlpZiAoZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dID09IFNEUkFNX0REUjEpIC8qIEREUjEgdHlwZSAqLworCQkJCQltY29wdDEgfD0gU0RSQU1fTUNPUFQxX0REUjFfVFlQRTsKKwkJCQlpZiAoZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dID09IFNEUkFNX0REUjIpIC8qIEREUjIgdHlwZSAqLworCQkJCQltY29wdDEgfD0gU0RSQU1fTUNPUFQxX0REUjJfVFlQRTsKKwkJCQlpZiAocmVnaXN0ZXJlZCA9PSAxKSB7IC8qIEREUjIgYWx3YXlzIGJ1ZmZlcmVkICovCisJCQkJCS8qIFRPRE86IHdoYXQgYWJvdXQgYWJvdmUgIGNvbW1lbnRzID8gKi8KKwkJCQkJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9SREVOOworCQkJCQlidWYwID0gVFJVRTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBUT0RPOiB0aGUgbWFzayAweDAyIGRvZXNuJ3QgbWF0Y2ggU2Ftc3VuZyBkZWYgZm9yIGJ5dGUgMjEuICovCisJCQkJCWlmICgoYXR0cmlidXRlICYgMHgwMikgPT0gMHgwMCkgeworCQkJCQkJLyogYnVmZmVyZWQgbm90IHN1cHBvcnRlZCAqLworCQkJCQkJYnVmMCA9IEZBTFNFOworCQkJCQl9IGVsc2UgeworCQkJCQkJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9SREVOOworCQkJCQkJYnVmMCA9IFRSVUU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkaW1tX251bSA9PSAxKSB7CisJCQkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSA9PSBTRFJBTV9ERFIxKSAvKiBERFIxIHR5cGUgKi8KKwkJCQkJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9ERFIxX1RZUEU7CisJCQkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSA9PSBTRFJBTV9ERFIyKSAvKiBERFIyIHR5cGUgKi8KKwkJCQkJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9ERFIyX1RZUEU7CisJCQkJaWYgKHJlZ2lzdGVyZWQgPT0gMSkgeworCQkJCQkvKiBERFIyIGFsd2F5cyBidWZmZXJlZCAqLworCQkJCQltY29wdDEgfD0gU0RSQU1fTUNPUFQxX1JERU47CisJCQkJCWJ1ZjEgPSBUUlVFOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoYXR0cmlidXRlICYgMHgwMikgPT0gMHgwMCkgeworCQkJCQkJLyogYnVmZmVyZWQgbm90IHN1cHBvcnRlZCAqLworCQkJCQkJYnVmMSA9IEZBTFNFOworCQkJCQl9IGVsc2UgeworCQkJCQkJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9SREVOOworCQkJCQkJYnVmMSA9IFRSVUU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8qIE5vdGUgdGhhdCBmb3IgRERSMiB0aGUgYnl0ZSA3IGlzIHJlc2VydmVkLCBidXQgT0sgdG8ga2VlcCBjb2RlIGFzIGlzLiAqLworCQkJZGF0YV93aWR0aCA9ICh1bnNpZ25lZCBsb25nKXNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgNikgKworCQkJCSgoKHVuc2lnbmVkIGxvbmcpc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCA3KSkgPDwgOCk7CisKKwkJCXN3aXRjaCAoZGF0YV93aWR0aCkgeworCQkJY2FzZSA3MjoKKwkJCWNhc2UgNjQ6CisJCQkJZGltbV82NGJpdCA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQljYXNlIDQwOgorCQkJY2FzZSAzMjoKKwkJCQlkaW1tXzMyYml0ID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCJXQVJOSU5HOiBEZXRlY3RlZCBhIERJTU0gd2l0aCBhIGRhdGEgd2lkdGggb2YgJWx1IGJpdHMuXG4iLAorCQkJCSAgICAgICBkYXRhX3dpZHRoKTsKKwkJCQlwcmludGYoIk9ubHkgRElNTXMgd2l0aCAzMiBvciA2NCBiaXQgRERSLVNEUkFNIHdpZHRocyBhcmUgc3VwcG9ydGVkLlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiB2ZXJpZnkgbWF0Y2hpbmcgcHJvcGVydGllcyAqLworCWlmICgoZGltbV9wb3B1bGF0ZWRbMF0gIT0gU0RSQU1fTk9ORSkgJiYgKGRpbW1fcG9wdWxhdGVkWzFdICE9IFNEUkFNX05PTkUpKSB7CisJCWlmIChidWYwICE9IGJ1ZjEpIHsKKwkJCXByaW50ZigiRVJST1I6IERJTU0ncyBidWZmZXJlZC91bmJ1ZmZlcmVkLCByZWdpc3RlcmVkLCBjbG9ja2luZyBkb24ndCBtYXRjaC5cbiIpOworCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCX0KKwl9CisKKwlpZiAoKGRpbW1fNjRiaXQgPT0gVFJVRSkgJiYgKGRpbW1fMzJiaXQgPT0gVFJVRSkpIHsKKwkJcHJpbnRmKCJFUlJPUjogQ2Fubm90IG1peCAzMiBiaXQgYW5kIDY0IGJpdCBERFItU0RSQU0gRElNTXMgdG9nZXRoZXIuXG4iKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJfQorCWVsc2UgaWYgKChkaW1tXzY0Yml0ID09IFRSVUUpICYmIChkaW1tXzMyYml0ID09IEZBTFNFKSkgeworCQltY29wdDEgfD0gU0RSQU1fTUNPUFQxX0RNV0RfNjQ7CisJfSBlbHNlIGlmICgoZGltbV82NGJpdCA9PSBGQUxTRSkgJiYgKGRpbW1fMzJiaXQgPT0gVFJVRSkpIHsKKwkJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9ETVdEXzMyOworCX0gZWxzZSB7CisJCXByaW50ZigiRVJST1I6IFBsZWFzZSBpbnN0YWxsIG9ubHkgMzIgb3IgNjQgYml0IEREUi1TRFJBTSBESU1Ncy5cblxuIik7CisJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCX0KKworCWlmIChlY2NfZW5hYmxlZCA9PSBUUlVFKQorCQltY29wdDEgfD0gU0RSQU1fTUNPUFQxX01DSEtfR0VOOworCWVsc2UKKwkJbWNvcHQxIHw9IFNEUkFNX01DT1BUMV9NQ0hLX05PTjsKKworCW10c2RyYW0oU0RSQU1fTUNPUFQxLCBtY29wdDEpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogcHJvZ3JhbV9jb2R0LgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBwcm9ncmFtX2NvZHQodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGNvZHQ7CisJdW5zaWduZWQgbG9uZyBtb2R0MCA9IDA7CisJdW5zaWduZWQgbG9uZyBtb2R0MSA9IDA7CisJdW5zaWduZWQgbG9uZyBtb2R0MiA9IDA7CisJdW5zaWduZWQgbG9uZyBtb2R0MyA9IDA7CisJdW5zaWduZWQgY2hhciBkaW1tX251bTsKKwl1bnNpZ25lZCBjaGFyIGRpbW1fcmFuazsKKwl1bnNpZ25lZCBjaGFyIHRvdGFsX3JhbmsgPSAwOworCXVuc2lnbmVkIGNoYXIgdG90YWxfZGltbSA9IDA7CisJdW5zaWduZWQgY2hhciBkaW1tX3R5cGUgPSAwOworCXVuc2lnbmVkIGNoYXIgZmlyc3RTbG90ID0gMDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0IHRoZSBTRFJBTSBDb250cm9sbGVyIE9uIERpZSBUZXJtaW5hdGlvbiBSZWdpc3RlcgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW1mc2RyYW0oU0RSQU1fQ09EVCwgY29kdCk7CisJY29kdCAmPSB+KFNEUkFNX0NPRFRfRFFTX1NJTkdMRV9FTkQgfCBTRFJBTV9DT0RUX0NLU0VfU0lOR0xFX0VORCk7CisJY29kdCB8PSBTRFJBTV9DT0RUX0lPX05NT0RFOworCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSAhPSBTRFJBTV9OT05FKSB7CisJCQlkaW1tX3JhbmsgPSAodW5zaWduZWQgbG9uZylzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDUpOworCQkJaWYgKCgodW5zaWduZWQgbG9uZylzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDIpKSA9PSAweDA4KSB7CisJCQkJZGltbV9yYW5rID0gKGRpbW1fcmFuayAmIDB4MEYpICsgMTsKKwkJCQlkaW1tX3R5cGUgPSBTRFJBTV9ERFIyOworCQkJfSBlbHNlIHsKKwkJCQlkaW1tX3JhbmsgPSBkaW1tX3JhbmsgJiAweDBGOworCQkJCWRpbW1fdHlwZSA9IFNEUkFNX0REUjE7CisJCQl9CisKKwkJCXRvdGFsX3JhbmsgKz0gZGltbV9yYW5rOworCQkJdG90YWxfZGltbSsrOworCQkJaWYgKChkaW1tX251bSA9PSAwKSAmJiAodG90YWxfZGltbSA9PSAxKSkKKwkJCQlmaXJzdFNsb3QgPSBUUlVFOworCQkJZWxzZQorCQkJCWZpcnN0U2xvdCA9IEZBTFNFOworCQl9CisJfQorCWlmIChkaW1tX3R5cGUgPT0gU0RSQU1fRERSMikgeworCQljb2R0IHw9IFNEUkFNX0NPRFRfRFFTXzFfOF9WX0REUjI7CisJCWlmICgodG90YWxfZGltbSA9PSAxKSAmJiAoZmlyc3RTbG90ID09IFRSVUUpKSB7CisJCQlpZiAodG90YWxfcmFuayA9PSAxKSB7CS8qIFBVVVUgKi8KKwkJCQljb2R0IHw9IENBTENfT0RUX1IoMCk7CisJCQkJbW9kdDAgPSBDQUxDX09EVF9XKDApOworCQkJCW1vZHQxID0gMHgwMDAwMDAwMDsKKwkJCQltb2R0MiA9IDB4MDAwMDAwMDA7CisJCQkJbW9kdDMgPSAweDAwMDAwMDAwOworCQkJfQorCQkJaWYgKHRvdGFsX3JhbmsgPT0gMikgewkvKiBQUFVVICovCisJCQkJY29kdCB8PSBDQUxDX09EVF9SKDApIHwgQ0FMQ19PRFRfUigxKTsKKwkJCQltb2R0MCA9IENBTENfT0RUX1coMCkgfCBDQUxDX09EVF9XKDEpOworCQkJCW1vZHQxID0gMHgwMDAwMDAwMDsKKwkJCQltb2R0MiA9IDB4MDAwMDAwMDA7CisJCQkJbW9kdDMgPSAweDAwMDAwMDAwOworCQkJfQorCQl9IGVsc2UgaWYgKCh0b3RhbF9kaW1tID09IDEpICYmIChmaXJzdFNsb3QgIT0gVFJVRSkpIHsKKwkJCWlmICh0b3RhbF9yYW5rID09IDEpIHsJLyogVVVQVSAqLworCQkJCWNvZHQgfD0gQ0FMQ19PRFRfUigyKTsKKwkJCQltb2R0MCA9IDB4MDAwMDAwMDA7CisJCQkJbW9kdDEgPSAweDAwMDAwMDAwOworCQkJCW1vZHQyID0gQ0FMQ19PRFRfVygyKTsKKwkJCQltb2R0MyA9IDB4MDAwMDAwMDA7CisJCQl9CisJCQlpZiAodG90YWxfcmFuayA9PSAyKSB7CS8qIFVVUFAgKi8KKwkJCQljb2R0IHw9IENBTENfT0RUX1IoMikgfCBDQUxDX09EVF9SKDMpOworCQkJCW1vZHQwID0gMHgwMDAwMDAwMDsKKwkJCQltb2R0MSA9IDB4MDAwMDAwMDA7CisJCQkJbW9kdDIgPSBDQUxDX09EVF9XKDIpIHwgQ0FMQ19PRFRfVygzKTsKKwkJCQltb2R0MyA9IDB4MDAwMDAwMDA7CisJCQl9CisJCX0KKwkJaWYgKHRvdGFsX2RpbW0gPT0gMikgeworCQkJaWYgKHRvdGFsX3JhbmsgPT0gMikgewkvKiBQVVBVICovCisJCQkJY29kdCB8PSBDQUxDX09EVF9SKDApIHwgQ0FMQ19PRFRfUigyKTsKKwkJCQltb2R0MCA9IENBTENfT0RUX1JXKDIpOworCQkJCW1vZHQxID0gMHgwMDAwMDAwMDsKKwkJCQltb2R0MiA9IENBTENfT0RUX1JXKDApOworCQkJCW1vZHQzID0gMHgwMDAwMDAwMDsKKwkJCX0KKwkJCWlmICh0b3RhbF9yYW5rID09IDQpIHsJLyogUFBQUCAqLworCQkJCWNvZHQgfD0gQ0FMQ19PRFRfUigwKSB8IENBTENfT0RUX1IoMSkgfAorCQkJCQlDQUxDX09EVF9SKDIpIHwgQ0FMQ19PRFRfUigzKTsKKwkJCQltb2R0MCA9IENBTENfT0RUX1JXKDIpIHwgQ0FMQ19PRFRfUlcoMyk7CisJCQkJbW9kdDEgPSAweDAwMDAwMDAwOworCQkJCW1vZHQyID0gQ0FMQ19PRFRfUlcoMCkgfCBDQUxDX09EVF9SVygxKTsKKwkJCQltb2R0MyA9IDB4MDAwMDAwMDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQljb2R0IHw9IFNEUkFNX0NPRFRfRFFTXzJfNV9WX0REUjE7CisJCW1vZHQwID0gMHgwMDAwMDAwMDsKKwkJbW9kdDEgPSAweDAwMDAwMDAwOworCQltb2R0MiA9IDB4MDAwMDAwMDA7CisJCW1vZHQzID0gMHgwMDAwMDAwMDsKKworCQlpZiAodG90YWxfZGltbSA9PSAxKSB7CisJCQlpZiAodG90YWxfcmFuayA9PSAxKQorCQkJCWNvZHQgfD0gMHgwMDgwMDAwMDsKKwkJCWlmICh0b3RhbF9yYW5rID09IDIpCisJCQkJY29kdCB8PSAweDAyODAwMDAwOworCQl9CisJCWlmICh0b3RhbF9kaW1tID09IDIpIHsKKwkJCWlmICh0b3RhbF9yYW5rID09IDIpCisJCQkJY29kdCB8PSAweDA4ODAwMDAwOworCQkJaWYgKHRvdGFsX3JhbmsgPT0gNCkKKwkJCQljb2R0IHw9IDB4MmE4MDAwMDA7CisJCX0KKwl9CisKKwlkZWJ1ZygibmIgb2YgZGltbSAlZFxuIiwgdG90YWxfZGltbSk7CisJZGVidWcoIm5iIG9mIHJhbmsgJWRcbiIsIHRvdGFsX3JhbmspOworCWlmICh0b3RhbF9kaW1tID09IDEpCisJCWRlYnVnKCJkaW1tIGluIHNsb3QgJWRcbiIsIGZpcnN0U2xvdCk7CisKKwltdHNkcmFtKFNEUkFNX0NPRFQsIGNvZHQpOworCW10c2RyYW0oU0RSQU1fTU9EVDAsIG1vZHQwKTsKKwltdHNkcmFtKFNEUkFNX01PRFQxLCBtb2R0MSk7CisJbXRzZHJhbShTRFJBTV9NT0RUMiwgbW9kdDIpOworCW10c2RyYW0oU0RSQU1fTU9EVDMsIG1vZHQzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHByb2dyYW1faW5pdHBsci4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgcHJvZ3JhbV9pbml0cGxyKHVuc2lnbmVkIGxvbmcgKmRpbW1fcG9wdWxhdGVkLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MsCisJCQkgICAgZGRyX2Nhc19pZF90IHNlbGVjdGVkX2NhcywKKwkJCSAgICBpbnQgd3JpdGVfcmVjb3ZlcnkpCit7CisJdTMyIGNhcyA9IDA7CisJdTMyIG9kdCA9IDA7CisJdTMyIG9kcyA9IDA7CisJdTMyIG1yOworCXUzMiB3cjsKKwl1MzIgZW1yOworCXUzMiBlbXIyOworCXUzMiBlbXIzOworCWludCBkaW1tX251bTsKKwlpbnQgdG90YWxfZGltbSA9IDA7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoqIEFzc3VtcHRpb246IGlmIG1vcmUgdGhhbiBvbmUgRElNTSwgYWxsIERJTU1zIGFyZSB0aGUgc2FtZQorCSAqKgkJYXMgYWxyZWFkeSBjaGVja2VkIGluIGNoZWNrX21lbW9yeV90eXBlCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWlmICgoZGltbV9wb3B1bGF0ZWRbMF0gPT0gU0RSQU1fRERSMSkgfHwgKGRpbW1fcG9wdWxhdGVkWzFdID09IFNEUkFNX0REUjEpKSB7CisJCW10c2RyYW0oU0RSQU1fSU5JVFBMUjAsIDB4ODFCODAwMDApOworCQltdHNkcmFtKFNEUkFNX0lOSVRQTFIxLCAweDgxOTAwNDAwKTsKKwkJbXRzZHJhbShTRFJBTV9JTklUUExSMiwgMHg4MTgxMDAwMCk7CisJCW10c2RyYW0oU0RSQU1fSU5JVFBMUjMsIDB4ZmY4MDAxNjIpOworCQltdHNkcmFtKFNEUkFNX0lOSVRQTFI0LCAweDgxOTAwNDAwKTsKKwkJbXRzZHJhbShTRFJBTV9JTklUUExSNSwgMHg4NjA4MDAwMCk7CisJCW10c2RyYW0oU0RSQU1fSU5JVFBMUjYsIDB4ODYwODAwMDApOworCQltdHNkcmFtKFNEUkFNX0lOSVRQTFI3LCAweDgxMDAwMDYyKTsKKwl9IGVsc2UgaWYgKChkaW1tX3BvcHVsYXRlZFswXSA9PSBTRFJBTV9ERFIyKSB8fCAoZGltbV9wb3B1bGF0ZWRbMV0gPT0gU0RSQU1fRERSMikpIHsKKwkJc3dpdGNoIChzZWxlY3RlZF9jYXMpIHsKKwkJY2FzZSBERFJfQ0FTXzM6CisJCQljYXMgPSAzIDw8IDQ7CisJCQlicmVhazsKKwkJY2FzZSBERFJfQ0FTXzQ6CisJCQljYXMgPSA0IDw8IDQ7CisJCQlicmVhazsKKwkJY2FzZSBERFJfQ0FTXzU6CisJCQljYXMgPSA1IDw8IDQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiRVJST1I6IHVjb2RlIGVycm9yIG9uIHNlbGVjdGVkX2NhcyB2YWx1ZSAlZCIsIHNlbGVjdGVkX2Nhcyk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJCWJyZWFrOworCQl9CisKKyNpZiAwCisJCS8qCisJCSAqIFRvRG8gLSBTdGlsbCBhIHByb2JsZW0gd2l0aCB0aGUgd3JpdGUgcmVjb3Zlcnk6CisJCSAqIE9uIHRoZSBDb3JzYWlyIENNMlg1MTItNTQwMEM0IG1vZHVsZSwgc2V0dGluZyB3cml0ZSByZWNvdmVyeQorCQkgKiBpbiB0aGUgSU5JVFBMUiByZWcgdG8gdGhlIHZhbHVlIGNhbGN1bGF0ZWQgaW4gcHJvZ3JhbV9tb2RlKCkKKwkJICogcmVzdWx0cyBpbiBub3QgY29ycmVjdGx5IHdvcmtpbmcgRERSMiBtZW1vcnkgKGNyYXNoIGFmdGVyCisJCSAqIHJlbG9jYXRpb24pLgorCQkgKgorCQkgKiBTbyBmb3Igbm93LCBzZXQgdGhlIHdyaXRlIHJlY292ZXJ5IHRvIDMuIFRoaXMgc2VlbXMgdG8gd29yaworCQkgKiBvbiB0aGUgQ29yYWlyIG1vZHVsZSB0b28uCisJCSAqCisJCSAqIDIwMDctMDMtMDEsIHNyCisJCSAqLworCQlzd2l0Y2ggKHdyaXRlX3JlY292ZXJ5KSB7CisJCWNhc2UgMzoKKwkJCXdyID0gV1JJVEVfUkVDT1ZfMzsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQl3ciA9IFdSSVRFX1JFQ09WXzQ7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJd3IgPSBXUklURV9SRUNPVl81OworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCXdyID0gV1JJVEVfUkVDT1ZfNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJFUlJPUjogd3JpdGUgcmVjb3Zlcnkgbm90IHN1cHBvcnQgKCVkKSIsIHdyaXRlX3JlY292ZXJ5KTsKKwkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCQkJYnJlYWs7CisJCX0KKyNlbHNlCisJCXdyID0gV1JJVEVfUkVDT1ZfMzsgLyogdGVzdC1vbmx5LCBzZWUgZGVzY3JpcHRpb24gYWJvdmUgKi8KKyNlbmRpZgorCisJCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKQorCQkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSAhPSBTRFJBTV9OT05FKQorCQkJCXRvdGFsX2RpbW0rKzsKKwkJaWYgKHRvdGFsX2RpbW0gPT0gMSkgeworCQkJb2R0ID0gT0RUXzE1MF9PSE07CisJCQlvZHMgPSBPRFNfRlVMTDsKKwkJfSBlbHNlIGlmICh0b3RhbF9kaW1tID09IDIpIHsKKwkJCW9kdCA9IE9EVF83NV9PSE07CisJCQlvZHMgPSBPRFNfUkVEVUNFRDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiRVJST1I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBESU1NJ3MgKCVkKSIsIHRvdGFsX2RpbW0pOworCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCX0KKworCQltciA9IENNRF9FTVIgfCBTRUxFQ1RfTVIgfCBCVVJTVF9MRU5fNCB8IHdyIHwgY2FzOworCQllbXIgPSBDTURfRU1SIHwgU0VMRUNUX0VNUiB8IG9kdCB8IG9kczsKKwkJZW1yMiA9IENNRF9FTVIgfCBTRUxFQ1RfRU1SMjsKKwkJZW1yMyA9IENNRF9FTVIgfCBTRUxFQ1RfRU1SMzsKKwkJLyogTk9QIC0gV2FpdCAxMDYgTWVtQ2xrIGN5Y2xlcyAqLworCQltdHNkcmFtKFNEUkFNX0lOSVRQTFIwLCBTRFJBTV9JTklUUExSX0VOQUJMRSB8IENNRF9OT1AgfAorCQkJCQlTRFJBTV9JTklUUExSX0lNV1RfRU5DT0RFKDEwNikpOworCQl1ZGVsYXkoMTAwMCk7CisJCS8qIHByZWNoYXJnZSA0IE1lbUNsayBjeWNsZXMgKi8KKwkJbXRzZHJhbShTRFJBTV9JTklUUExSMSwgU0RSQU1fSU5JVFBMUl9FTkFCTEUgfCBDTURfUFJFQ0hBUkdFIHwKKwkJCQkJU0RSQU1fSU5JVFBMUl9JTVdUX0VOQ09ERSg0KSk7CisJCS8qIEVNUjIgLSBXYWl0IHRNUkQgKDIgTWVtQ2xrIGN5Y2xlcykgKi8KKwkJbXRzZHJhbShTRFJBTV9JTklUUExSMiwgU0RSQU1fSU5JVFBMUl9FTkFCTEUgfCBlbXIyIHwKKwkJCQkJU0RSQU1fSU5JVFBMUl9JTVdUX0VOQ09ERSgyKSk7CisJCS8qIEVNUjMgLSBXYWl0IHRNUkQgKDIgTWVtQ2xrIGN5Y2xlcykgKi8KKwkJbXRzZHJhbShTRFJBTV9JTklUUExSMywgU0RSQU1fSU5JVFBMUl9FTkFCTEUgfCBlbXIzIHwKKwkJCQkJU0RSQU1fSU5JVFBMUl9JTVdUX0VOQ09ERSgyKSk7CisJCS8qIEVNUiBETEwgRU5BQkxFIC0gV2FpdCB0TVJEICgyIE1lbUNsayBjeWNsZXMpICovCisJCW10c2RyYW0oU0RSQU1fSU5JVFBMUjQsIFNEUkFNX0lOSVRQTFJfRU5BQkxFIHwgZW1yIHwKKwkJCQkJU0RSQU1fSU5JVFBMUl9JTVdUX0VOQ09ERSgyKSk7CisJCS8qIE1SIHcvIERMTCByZXNldCAtIDIwMCBjeWNsZSB3YWl0IGZvciBETEwgcmVzZXQgKi8KKwkJbXRzZHJhbShTRFJBTV9JTklUUExSNSwgU0RSQU1fSU5JVFBMUl9FTkFCTEUgfCBtciB8IERMTF9SRVNFVCB8CisJCQkJCVNEUkFNX0lOSVRQTFJfSU1XVF9FTkNPREUoMjAwKSk7CisJCXVkZWxheSgxMDAwKTsKKwkJLyogcHJlY2hhcmdlIDQgTWVtQ2xrIGN5Y2xlcyAqLworCQltdHNkcmFtKFNEUkFNX0lOSVRQTFI2LCBTRFJBTV9JTklUUExSX0VOQUJMRSB8IENNRF9QUkVDSEFSR0UgfAorCQkJCQlTRFJBTV9JTklUUExSX0lNV1RfRU5DT0RFKDQpKTsKKwkJLyogUmVmcmVzaCAyNSBNZW1DbGsgY3ljbGVzICovCisJCW10c2RyYW0oU0RSQU1fSU5JVFBMUjcsIFNEUkFNX0lOSVRQTFJfRU5BQkxFIHwgQ01EX1JFRlJFU0ggfAorCQkJCQlTRFJBTV9JTklUUExSX0lNV1RfRU5DT0RFKDI1KSk7CisJCS8qIFJlZnJlc2ggMjUgTWVtQ2xrIGN5Y2xlcyAqLworCQltdHNkcmFtKFNEUkFNX0lOSVRQTFI4LCBTRFJBTV9JTklUUExSX0VOQUJMRSB8IENNRF9SRUZSRVNIIHwKKwkJCQkJU0RSQU1fSU5JVFBMUl9JTVdUX0VOQ09ERSgyNSkpOworCQkvKiBSZWZyZXNoIDI1IE1lbUNsayBjeWNsZXMgKi8KKwkJbXRzZHJhbShTRFJBTV9JTklUUExSOSwgU0RSQU1fSU5JVFBMUl9FTkFCTEUgfCBDTURfUkVGUkVTSCB8CisJCQkJCVNEUkFNX0lOSVRQTFJfSU1XVF9FTkNPREUoMjUpKTsKKwkJLyogUmVmcmVzaCAyNSBNZW1DbGsgY3ljbGVzICovCisJCW10c2RyYW0oU0RSQU1fSU5JVFBMUjEwLCBTRFJBTV9JTklUUExSX0VOQUJMRSB8IENNRF9SRUZSRVNIIHwKKwkJCQkJIFNEUkFNX0lOSVRQTFJfSU1XVF9FTkNPREUoMjUpKTsKKwkJLyogTVIgdy9vIERMTCByZXNldCAtIFdhaXQgdE1SRCAoMiBNZW1DbGsgY3ljbGVzKSAqLworCQltdHNkcmFtKFNEUkFNX0lOSVRQTFIxMSwgU0RSQU1fSU5JVFBMUl9FTkFCTEUgfCBtciB8CisJCQkJCSBTRFJBTV9JTklUUExSX0lNV1RfRU5DT0RFKDIpKTsKKwkJLyogRU1SIE9DRCBEZWZhdWx0IC0gV2FpdCB0TVJEICgyIE1lbUNsayBjeWNsZXMpICovCisJCW10c2RyYW0oU0RSQU1fSU5JVFBMUjEyLCBTRFJBTV9JTklUUExSX0VOQUJMRSB8IE9DRF9DQUxJQl9ERUYgfAorCQkJCQkgU0RSQU1fSU5JVFBMUl9JTVdUX0VOQ09ERSgyKSB8IGVtcik7CisJCS8qIEVNUiBPQ0QgRXhpdCAqLworCQltdHNkcmFtKFNEUkFNX0lOSVRQTFIxMywgU0RSQU1fSU5JVFBMUl9FTkFCTEUgfCBlbXIgfAorCQkJCQkgU0RSQU1fSU5JVFBMUl9JTVdUX0VOQ09ERSgyKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJFUlJPUjogdWNvZGUgZXJyb3IgYXMgdW5rbm93biBERFIgdHlwZSBpbiBwcm9ncmFtX2luaXRwbHIiKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyByb3V0aW5lIHByb2dyYW1zIHRoZSBTRFJBTV9NTU9ERSByZWdpc3Rlci4KKyAqIHRoZSBzZWxlY3RlZF9jYXMgaXMgYW4gb3V0cHV0IHBhcmFtZXRlciwgdGhhdCB3aWxsIGJlIHBhc3NlZAorICogYnkgY2FsbGVyIHRvIGNhbGwgdGhlIGFib3ZlIHByb2dyYW1faW5pdHBsciggKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBwcm9ncmFtX21vZGUodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcywKKwkJCSBkZHJfY2FzX2lkX3QgKnNlbGVjdGVkX2NhcywKKwkJCSBpbnQgKndyaXRlX3JlY292ZXJ5KQoreworCXVuc2lnbmVkIGxvbmcgZGltbV9udW07CisJdW5zaWduZWQgbG9uZyBzZHJhbV9kZHIxOworCXVuc2lnbmVkIGxvbmcgdF93cl9uczsKKwl1bnNpZ25lZCBsb25nIHRfd3JfY2xrOworCXVuc2lnbmVkIGxvbmcgY2FzX2JpdDsKKwl1bnNpZ25lZCBsb25nIGNhc19pbmRleDsKKwl1bnNpZ25lZCBsb25nIHNkcmFtX2ZyZXE7CisJdW5zaWduZWQgbG9uZyBkZHJfY2hlY2s7CisJdW5zaWduZWQgbG9uZyBtbW9kZTsKKwl1bnNpZ25lZCBsb25nIHRjeWNfcmVnOworCXVuc2lnbmVkIGxvbmcgY3ljbGVfMl8wX2NsazsKKwl1bnNpZ25lZCBsb25nIGN5Y2xlXzJfNV9jbGs7CisJdW5zaWduZWQgbG9uZyBjeWNsZV8zXzBfY2xrOworCXVuc2lnbmVkIGxvbmcgY3ljbGVfNF8wX2NsazsKKwl1bnNpZ25lZCBsb25nIGN5Y2xlXzVfMF9jbGs7CisJdW5zaWduZWQgbG9uZyBtYXhfMl8wX3RjeWNfbnNfeF8xMDA7CisJdW5zaWduZWQgbG9uZyBtYXhfMl81X3RjeWNfbnNfeF8xMDA7CisJdW5zaWduZWQgbG9uZyBtYXhfM18wX3RjeWNfbnNfeF8xMDA7CisJdW5zaWduZWQgbG9uZyBtYXhfNF8wX3RjeWNfbnNfeF8xMDA7CisJdW5zaWduZWQgbG9uZyBtYXhfNV8wX3RjeWNfbnNfeF8xMDA7CisJdW5zaWduZWQgbG9uZyBjeWNsZV90aW1lX25zX3hfMTAwWzNdOworCVBQQzR4eF9TWVNfSU5GTyBib2FyZF9jZmc7CisJdW5zaWduZWQgY2hhciBjYXNfMl8wX2F2YWlsYWJsZTsKKwl1bnNpZ25lZCBjaGFyIGNhc18yXzVfYXZhaWxhYmxlOworCXVuc2lnbmVkIGNoYXIgY2FzXzNfMF9hdmFpbGFibGU7CisJdW5zaWduZWQgY2hhciBjYXNfNF8wX2F2YWlsYWJsZTsKKwl1bnNpZ25lZCBjaGFyIGNhc181XzBfYXZhaWxhYmxlOworCXVuc2lnbmVkIGxvbmcgc2RyX2RkcnBsbDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogR2V0IHRoZSBib2FyZCBjb25maWd1cmF0aW9uIGluZm8uCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZ2V0X3N5c19pbmZvKCZib2FyZF9jZmcpOworCisJbWZzZHIoU0RSMF9ERFIwLCBzZHJfZGRycGxsKTsKKwlzZHJhbV9mcmVxID0gTVVMRElWNjQoKGJvYXJkX2NmZy5mcmVxUExCKSwgU0RSMF9ERFIwX0REUk1fREVDT0RFKHNkcl9kZHJwbGwpLCAxKTsKKwlkZWJ1Zygic2RyYW1fZnJlcT0lbHVcbiIsIHNkcmFtX2ZyZXEpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBIYW5kbGUgdGhlIHRpbWluZy4gIFdlIG5lZWQgdG8gZmluZCB0aGUgd29yc3QgY2FzZSB0aW1pbmcgb2YgYWxsCisJICogdGhlIGRpbW0gbW9kdWxlcyBpbnN0YWxsZWQuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJdF93cl9ucyA9IDA7CisJY2FzXzJfMF9hdmFpbGFibGUgPSBUUlVFOworCWNhc18yXzVfYXZhaWxhYmxlID0gVFJVRTsKKwljYXNfM18wX2F2YWlsYWJsZSA9IFRSVUU7CisJY2FzXzRfMF9hdmFpbGFibGUgPSBUUlVFOworCWNhc181XzBfYXZhaWxhYmxlID0gVFJVRTsKKwltYXhfMl8wX3RjeWNfbnNfeF8xMDAgPSAxMDsKKwltYXhfMl81X3RjeWNfbnNfeF8xMDAgPSAxMDsKKwltYXhfM18wX3RjeWNfbnNfeF8xMDAgPSAxMDsKKwltYXhfNF8wX3RjeWNfbnNfeF8xMDAgPSAxMDsKKwltYXhfNV8wX3RjeWNfbnNfeF8xMDAgPSAxMDsKKwlzZHJhbV9kZHIxID0gVFJVRTsKKworCS8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIERJTU0gc2xvdHMgb24gdGhlIGJvYXJkICovCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJLyogSWYgYSBkaW1tIGlzIGluc3RhbGxlZCBpbiBhIHBhcnRpY3VsYXIgc2xvdCAuLi4gKi8KKwkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSAhPSBTRFJBTV9OT05FKSB7CisJCQlpZiAoZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dID09IFNEUkFNX0REUjEpCisJCQkJc2RyYW1fZGRyMSA9IFRSVUU7CisJCQllbHNlCisJCQkJc2RyYW1fZGRyMSA9IEZBTFNFOworCisJCQkvKiB0X3dyX25zID0gbWF4KHRfd3JfbnMsICh1bnNpZ25lZCBsb25nKWRpbW1fc3BkW2RpbW1fbnVtXVszNl0gPj4gMik7ICovIC8qICBub3QgdXNlZCBpbiB0aGlzIGxvb3AuICovCisJCQljYXNfYml0ID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAxOCk7CisJCQlkZWJ1ZygiY2FzX2JpdFtTUEQgYnl0ZSAxOF09JTAybHhcbiIsIGNhc19iaXQpOworCisJCQkvKiBGb3IgYSBwYXJ0aWN1bGFyIERJTU0sIGdyYWIgdGhlIHRocmVlIENBUyB2YWx1ZXMgaXQgc3VwcG9ydHMgKi8KKwkJCWZvciAoY2FzX2luZGV4ID0gMDsgY2FzX2luZGV4IDwgMzsgY2FzX2luZGV4KyspIHsKKwkJCQlzd2l0Y2ggKGNhc19pbmRleCkgeworCQkJCWNhc2UgMDoKKwkJCQkJdGN5Y19yZWcgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDkpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXRjeWNfcmVnID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyMyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXRjeWNfcmVnID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyNSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICgodGN5Y19yZWcgJiAweDBGKSA+PSAxMCkgeworCQkJCQlpZiAoKHRjeWNfcmVnICYgMHgwRikgPT0gMHgwRCkgeworCQkJCQkJLyogQ29udmVydCBmcm9tIGhleCB0byBkZWNpbWFsICovCisJCQkJCQljeWNsZV90aW1lX25zX3hfMTAwW2Nhc19pbmRleF0gPQorCQkJCQkJCSgoKHRjeWNfcmVnICYgMHhGMCkgPj4gNCkgKiAxMDApICsgNzU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGYoIkVSUk9SOiBTUEQgcmVwb3J0ZWQgVGN5YyBpcyBpbmNvcnJlY3QgZm9yIERJTU0gIgorCQkJCQkJICAgICAgICJpbiBzbG90ICVkXG4iLCAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKKwkJCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogQ29udmVydCBmcm9tIGhleCB0byBkZWNpbWFsICovCisJCQkJCWN5Y2xlX3RpbWVfbnNfeF8xMDBbY2FzX2luZGV4XSA9CisJCQkJCQkoKCh0Y3ljX3JlZyAmIDB4RjApID4+IDQpICogMTAwKSArCisJCQkJCQkoKHRjeWNfcmVnICYgMHgwRikqMTApOworCQkJCX0KKwkJCQlkZWJ1ZygiY2FzX2luZGV4PSVsdTogY3ljbGVfdGltZV9uc194XzEwMD0lbHVcbiIsIGNhc19pbmRleCwKKwkJCQkgICAgICBjeWNsZV90aW1lX25zX3hfMTAwW2Nhc19pbmRleF0pOworCQkJfQorCisJCQkvKiBUaGUgcmVzdCBvZiB0aGlzIHJvdXRpbmUgZGV0ZXJtaW5lcyBpZiBDQVMgMi4wLCAyLjUsIDMuMCwgNC4wIGFuZCA1LjAgYXJlICovCisJCQkvKiBzdXBwb3J0ZWQgZm9yIGEgcGFydGljdWxhciBESU1NLiAqLworCQkJY2FzX2luZGV4ID0gMDsKKworCQkJaWYgKHNkcmFtX2RkcjEpIHsKKwkJCQkvKgorCQkJCSAqIEREUiBkZXZpY2VzIHVzZSB0aGUgZm9sbG93aW5nIGJpdG1hc2sgZm9yIENBUyBsYXRlbmN5OgorCQkJCSAqICBCaXQgICA3ICAgIDYgICAgNSAgICA0ICAgIDMgICAgMiAgICAxICAgIDAKKwkJCQkgKiAgICAgICBUQkQgIDQuMCAgMy41ICAzLjAgIDIuNSAgMi4wICAxLjUgIDEuMAorCQkJCSAqLworCQkJCWlmICgoKGNhc19iaXQgJiAweDQwKSA9PSAweDQwKSAmJiAoY2FzX2luZGV4IDwgMykgJiYKKwkJCQkgICAgKGN5Y2xlX3RpbWVfbnNfeF8xMDBbY2FzX2luZGV4XSAhPSAwKSkgeworCQkJCQltYXhfNF8wX3RjeWNfbnNfeF8xMDAgPSBtYXgobWF4XzRfMF90Y3ljX25zX3hfMTAwLAorCQkJCQkJCQkgICAgY3ljbGVfdGltZV9uc194XzEwMFtjYXNfaW5kZXhdKTsKKwkJCQkJY2FzX2luZGV4Kys7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGNhc19pbmRleCAhPSAwKQorCQkJCQkJY2FzX2luZGV4Kys7CisJCQkJCWNhc180XzBfYXZhaWxhYmxlID0gRkFMU0U7CisJCQkJfQorCisJCQkJaWYgKCgoY2FzX2JpdCAmIDB4MTApID09IDB4MTApICYmIChjYXNfaW5kZXggPCAzKSAmJgorCQkJCSAgICAoY3ljbGVfdGltZV9uc194XzEwMFtjYXNfaW5kZXhdICE9IDApKSB7CisJCQkJCW1heF8zXzBfdGN5Y19uc194XzEwMCA9IG1heChtYXhfM18wX3RjeWNfbnNfeF8xMDAsCisJCQkJCQkJCSAgICBjeWNsZV90aW1lX25zX3hfMTAwW2Nhc19pbmRleF0pOworCQkJCQljYXNfaW5kZXgrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY2FzX2luZGV4ICE9IDApCisJCQkJCQljYXNfaW5kZXgrKzsKKwkJCQkJY2FzXzNfMF9hdmFpbGFibGUgPSBGQUxTRTsKKwkJCQl9CisKKwkJCQlpZiAoKChjYXNfYml0ICYgMHgwOCkgPT0gMHgwOCkgJiYgKGNhc19pbmRleCA8IDMpICYmCisJCQkJICAgIChjeWNsZV90aW1lX25zX3hfMTAwW2Nhc19pbmRleF0gIT0gMCkpIHsKKwkJCQkJbWF4XzJfNV90Y3ljX25zX3hfMTAwID0gbWF4KG1heF8yXzVfdGN5Y19uc194XzEwMCwKKwkJCQkJCQkJICAgIGN5Y2xlX3RpbWVfbnNfeF8xMDBbY2FzX2luZGV4XSk7CisJCQkJCWNhc19pbmRleCsrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjYXNfaW5kZXggIT0gMCkKKwkJCQkJCWNhc19pbmRleCsrOworCQkJCQljYXNfMl81X2F2YWlsYWJsZSA9IEZBTFNFOworCQkJCX0KKworCQkJCWlmICgoKGNhc19iaXQgJiAweDA0KSA9PSAweDA0KSAmJiAoY2FzX2luZGV4IDwgMykgJiYKKwkJCQkgICAgKGN5Y2xlX3RpbWVfbnNfeF8xMDBbY2FzX2luZGV4XSAhPSAwKSkgeworCQkJCQltYXhfMl8wX3RjeWNfbnNfeF8xMDAgPSBtYXgobWF4XzJfMF90Y3ljX25zX3hfMTAwLAorCQkJCQkJCQkgICAgY3ljbGVfdGltZV9uc194XzEwMFtjYXNfaW5kZXhdKTsKKwkJCQkJY2FzX2luZGV4Kys7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGNhc19pbmRleCAhPSAwKQorCQkJCQkJY2FzX2luZGV4Kys7CisJCQkJCWNhc18yXzBfYXZhaWxhYmxlID0gRkFMU0U7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIEREUjIgZGV2aWNlcyB1c2UgdGhlIGZvbGxvd2luZyBiaXRtYXNrIGZvciBDQVMgbGF0ZW5jeToKKwkJCQkgKiAgQml0ICAgNyAgICA2ICAgIDUgICAgNCAgICAzICAgIDIgICAgMSAgICAwCisJCQkJICogICAgICAgVEJEICA2LjAgIDUuMCAgNC4wICAzLjAgIDIuMCAgVEJEICBUQkQKKwkJCQkgKi8KKwkJCQlpZiAoKChjYXNfYml0ICYgMHgyMCkgPT0gMHgyMCkgJiYgKGNhc19pbmRleCA8IDMpICYmCisJCQkJICAgIChjeWNsZV90aW1lX25zX3hfMTAwW2Nhc19pbmRleF0gIT0gMCkpIHsKKwkJCQkJbWF4XzVfMF90Y3ljX25zX3hfMTAwID0gbWF4KG1heF81XzBfdGN5Y19uc194XzEwMCwKKwkJCQkJCQkJICAgIGN5Y2xlX3RpbWVfbnNfeF8xMDBbY2FzX2luZGV4XSk7CisJCQkJCWNhc19pbmRleCsrOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjYXNfaW5kZXggIT0gMCkKKwkJCQkJCWNhc19pbmRleCsrOworCQkJCQljYXNfNV8wX2F2YWlsYWJsZSA9IEZBTFNFOworCQkJCX0KKworCQkJCWlmICgoKGNhc19iaXQgJiAweDEwKSA9PSAweDEwKSAmJiAoY2FzX2luZGV4IDwgMykgJiYKKwkJCQkgICAgKGN5Y2xlX3RpbWVfbnNfeF8xMDBbY2FzX2luZGV4XSAhPSAwKSkgeworCQkJCQltYXhfNF8wX3RjeWNfbnNfeF8xMDAgPSBtYXgobWF4XzRfMF90Y3ljX25zX3hfMTAwLAorCQkJCQkJCQkgICAgY3ljbGVfdGltZV9uc194XzEwMFtjYXNfaW5kZXhdKTsKKwkJCQkJY2FzX2luZGV4Kys7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGNhc19pbmRleCAhPSAwKQorCQkJCQkJY2FzX2luZGV4Kys7CisJCQkJCWNhc180XzBfYXZhaWxhYmxlID0gRkFMU0U7CisJCQkJfQorCisJCQkJaWYgKCgoY2FzX2JpdCAmIDB4MDgpID09IDB4MDgpICYmIChjYXNfaW5kZXggPCAzKSAmJgorCQkJCSAgICAoY3ljbGVfdGltZV9uc194XzEwMFtjYXNfaW5kZXhdICE9IDApKSB7CisJCQkJCW1heF8zXzBfdGN5Y19uc194XzEwMCA9IG1heChtYXhfM18wX3RjeWNfbnNfeF8xMDAsCisJCQkJCQkJCSAgICBjeWNsZV90aW1lX25zX3hfMTAwW2Nhc19pbmRleF0pOworCQkJCQljYXNfaW5kZXgrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY2FzX2luZGV4ICE9IDApCisJCQkJCQljYXNfaW5kZXgrKzsKKwkJCQkJY2FzXzNfMF9hdmFpbGFibGUgPSBGQUxTRTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFNldCB0aGUgU0RSQU0gbW9kZSwgU0RSQU1fTU1PREUKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltZnNkcmFtKFNEUkFNX01NT0RFLCBtbW9kZSk7CisJbW1vZGUgPSBtbW9kZSAmIH4oU0RSQU1fTU1PREVfV1JfTUFTSyB8IFNEUkFNX01NT0RFX0RDTF9NQVNLKTsKKworCS8qIGFkZCAxMCBoZXJlIGJlY2F1c2Ugb2Ygcm91bmRpbmcgcHJvYmxlbXMgKi8KKwljeWNsZV8yXzBfY2xrID0gTVVMRElWNjQoT05FX0JJTExJT04sIDEwMCwgbWF4XzJfMF90Y3ljX25zX3hfMTAwKSArIDEwOworCWN5Y2xlXzJfNV9jbGsgPSBNVUxESVY2NChPTkVfQklMTElPTiwgMTAwLCBtYXhfMl81X3RjeWNfbnNfeF8xMDApICsgMTA7CisJY3ljbGVfM18wX2NsayA9IE1VTERJVjY0KE9ORV9CSUxMSU9OLCAxMDAsIG1heF8zXzBfdGN5Y19uc194XzEwMCkgKyAxMDsKKwljeWNsZV80XzBfY2xrID0gTVVMRElWNjQoT05FX0JJTExJT04sIDEwMCwgbWF4XzRfMF90Y3ljX25zX3hfMTAwKSArIDEwOworCWN5Y2xlXzVfMF9jbGsgPSBNVUxESVY2NChPTkVfQklMTElPTiwgMTAwLCBtYXhfNV8wX3RjeWNfbnNfeF8xMDApICsgMTA7CisJZGVidWcoImN5Y2xlXzNfMF9jbGs9JWx1XG4iLCBjeWNsZV8zXzBfY2xrKTsKKwlkZWJ1ZygiY3ljbGVfNF8wX2Nsaz0lbHVcbiIsIGN5Y2xlXzRfMF9jbGspOworCWRlYnVnKCJjeWNsZV81XzBfY2xrPSVsdVxuIiwgY3ljbGVfNV8wX2Nsayk7CisKKwlpZiAoc2RyYW1fZGRyMSA9PSBUUlVFKSB7IC8qIEREUjEgKi8KKwkJaWYgKChjYXNfMl8wX2F2YWlsYWJsZSA9PSBUUlVFKSAmJiAoc2RyYW1fZnJlcSA8PSBjeWNsZV8yXzBfY2xrKSkgeworCQkJbW1vZGUgfD0gU0RSQU1fTU1PREVfRENMX0REUjFfMl8wX0NMSzsKKwkJCSpzZWxlY3RlZF9jYXMgPSBERFJfQ0FTXzI7CisJCX0gZWxzZSBpZiAoKGNhc18yXzVfYXZhaWxhYmxlID09IFRSVUUpICYmIChzZHJhbV9mcmVxIDw9IGN5Y2xlXzJfNV9jbGspKSB7CisJCQltbW9kZSB8PSBTRFJBTV9NTU9ERV9EQ0xfRERSMV8yXzVfQ0xLOworCQkJKnNlbGVjdGVkX2NhcyA9IEREUl9DQVNfMl81OworCQl9IGVsc2UgaWYgKChjYXNfM18wX2F2YWlsYWJsZSA9PSBUUlVFKSAmJiAoc2RyYW1fZnJlcSA8PSBjeWNsZV8zXzBfY2xrKSkgeworCQkJbW1vZGUgfD0gU0RSQU1fTU1PREVfRENMX0REUjFfM18wX0NMSzsKKwkJCSpzZWxlY3RlZF9jYXMgPSBERFJfQ0FTXzM7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIkVSUk9SOiBDYW5ub3QgZmluZCBhIHN1cHBvcnRlZCBDQVMgbGF0ZW5jeSB3aXRoIHRoZSBpbnN0YWxsZWQgRElNTXMuXG4iKTsKKwkJCXByaW50ZigiT25seSBESU1NcyBERFIxIHdpdGggQ0FTIGxhdGVuY2llcyBvZiAyLjAsIDIuNSwgYW5kIDMuMCBhcmUgc3VwcG9ydGVkLlxuIik7CisJCQlwcmludGYoIk1ha2Ugc3VyZSB0aGUgUExCIHNwZWVkIGlzIHdpdGhpbiB0aGUgc3VwcG9ydGVkIHJhbmdlIG9mIHRoZSBESU1Ncy5cblxuIik7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJfQorCX0gZWxzZSB7IC8qIEREUjIgKi8KKwkJZGVidWcoImNhc18zXzBfYXZhaWxhYmxlPSVkXG4iLCBjYXNfM18wX2F2YWlsYWJsZSk7CisJCWRlYnVnKCJjYXNfNF8wX2F2YWlsYWJsZT0lZFxuIiwgY2FzXzRfMF9hdmFpbGFibGUpOworCQlkZWJ1ZygiY2FzXzVfMF9hdmFpbGFibGU9JWRcbiIsIGNhc181XzBfYXZhaWxhYmxlKTsKKwkJaWYgKChjYXNfM18wX2F2YWlsYWJsZSA9PSBUUlVFKSAmJiAoc2RyYW1fZnJlcSA8PSBjeWNsZV8zXzBfY2xrKSkgeworCQkJbW1vZGUgfD0gU0RSQU1fTU1PREVfRENMX0REUjJfM18wX0NMSzsKKwkJCSpzZWxlY3RlZF9jYXMgPSBERFJfQ0FTXzM7CisJCX0gZWxzZSBpZiAoKGNhc180XzBfYXZhaWxhYmxlID09IFRSVUUpICYmIChzZHJhbV9mcmVxIDw9IGN5Y2xlXzRfMF9jbGspKSB7CisJCQltbW9kZSB8PSBTRFJBTV9NTU9ERV9EQ0xfRERSMl80XzBfQ0xLOworCQkJKnNlbGVjdGVkX2NhcyA9IEREUl9DQVNfNDsKKwkJfSBlbHNlIGlmICgoY2FzXzVfMF9hdmFpbGFibGUgPT0gVFJVRSkgJiYgKHNkcmFtX2ZyZXEgPD0gY3ljbGVfNV8wX2NsaykpIHsKKwkJCW1tb2RlIHw9IFNEUkFNX01NT0RFX0RDTF9ERFIyXzVfMF9DTEs7CisJCQkqc2VsZWN0ZWRfY2FzID0gRERSX0NBU181OworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJFUlJPUjogQ2Fubm90IGZpbmQgYSBzdXBwb3J0ZWQgQ0FTIGxhdGVuY3kgd2l0aCB0aGUgaW5zdGFsbGVkIERJTU1zLlxuIik7CisJCQlwcmludGYoIk9ubHkgRElNTXMgRERSMiB3aXRoIENBUyBsYXRlbmNpZXMgb2YgMy4wLCA0LjAsIGFuZCA1LjAgYXJlIHN1cHBvcnRlZC5cbiIpOworCQkJcHJpbnRmKCJNYWtlIHN1cmUgdGhlIFBMQiBzcGVlZCBpcyB3aXRoaW4gdGhlIHN1cHBvcnRlZCByYW5nZSBvZiB0aGUgRElNTXMuXG4iKTsKKwkJCXByaW50ZigiY2FzMz0lZCBjYXM0PSVkIGNhczU9JWRcbiIsCisJCQkgICAgICAgY2FzXzNfMF9hdmFpbGFibGUsIGNhc180XzBfYXZhaWxhYmxlLCBjYXNfNV8wX2F2YWlsYWJsZSk7CisJCQlwcmludGYoInNkcmFtX2ZyZXE9JWx1IGN5Y2xlMz0lbHUgY3ljbGU0PSVsdSBjeWNsZTU9JWx1XG5cbiIsCisJCQkgICAgICAgc2RyYW1fZnJlcSwgY3ljbGVfM18wX2NsaywgY3ljbGVfNF8wX2NsaywgY3ljbGVfNV8wX2Nsayk7CisJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJfQorCX0KKworCWlmIChzZHJhbV9kZHIxID09IFRSVUUpCisJCW1tb2RlIHw9IFNEUkFNX01NT0RFX1dSX0REUjE7CisJZWxzZSB7CisKKwkJLyogbG9vcCB0aHJvdWdoIGFsbCB0aGUgRElNTSBzbG90cyBvbiB0aGUgYm9hcmQgKi8KKwkJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJCS8qIElmIGEgZGltbSBpcyBpbnN0YWxsZWQgaW4gYSBwYXJ0aWN1bGFyIHNsb3QgLi4uICovCisJCQlpZiAoZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dICE9IFNEUkFNX05PTkUpCisJCQkJdF93cl9ucyA9IG1heCh0X3dyX25zLAorCQkJCQkgICAgICBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDM2KSA+PiAyKTsKKwkJfQorCisJCS8qCisJCSAqIGNvbnZlcnQgZnJvbSBuYW5vc2Vjb25kcyB0byBkZHIgY2xvY2tzCisJCSAqIHJvdW5kIHVwIGlmIG5lY2Vzc2FyeQorCQkgKi8KKwkJdF93cl9jbGsgPSBNVUxESVY2NChzZHJhbV9mcmVxLCB0X3dyX25zLCBPTkVfQklMTElPTik7CisJCWRkcl9jaGVjayA9IE1VTERJVjY0KE9ORV9CSUxMSU9OLCB0X3dyX2NsaywgdF93cl9ucyk7CisJCWlmIChzZHJhbV9mcmVxICE9IGRkcl9jaGVjaykKKwkJCXRfd3JfY2xrKys7CisKKwkJc3dpdGNoICh0X3dyX2NsaykgeworCQljYXNlIDA6CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDM6CisJCQltbW9kZSB8PSBTRFJBTV9NTU9ERV9XUl9ERFIyXzNfQ1lDOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCW1tb2RlIHw9IFNEUkFNX01NT0RFX1dSX0REUjJfNF9DWUM7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJbW1vZGUgfD0gU0RSQU1fTU1PREVfV1JfRERSMl81X0NZQzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbW1vZGUgfD0gU0RSQU1fTU1PREVfV1JfRERSMl82X0NZQzsKKwkJCWJyZWFrOworCQl9CisJCSp3cml0ZV9yZWNvdmVyeSA9IHRfd3JfY2xrOworCX0KKworCWRlYnVnKCJDQVMgbGF0ZW5jeSA9ICVkXG4iLCAqc2VsZWN0ZWRfY2FzKTsKKwlkZWJ1ZygiV3JpdGUgcmVjb3ZlcnkgPSAlZFxuIiwgKndyaXRlX3JlY292ZXJ5KTsKKworCW10c2RyYW0oU0RSQU1fTU1PREUsIG1tb2RlKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHByb2dyYW1fcnRyLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBwcm9ncmFtX3J0cih1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCXVuc2lnbmVkIGNoYXIgKmlpYzBfZGltbV9hZGRyLAorCQkJdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwlQUEM0eHhfU1lTX0lORk8gYm9hcmRfY2ZnOworCXVuc2lnbmVkIGxvbmcgbWF4X3JlZnJlc2hfcmF0ZTsKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgcmVmcmVzaF9yYXRlX3R5cGU7CisJdW5zaWduZWQgbG9uZyByZWZyZXNoX3JhdGU7CisJdW5zaWduZWQgbG9uZyByaW50OworCXVuc2lnbmVkIGxvbmcgc2RyYW1fZnJlcTsKKwl1bnNpZ25lZCBsb25nIHNkcl9kZHJwbGw7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEdldCB0aGUgYm9hcmQgY29uZmlndXJhdGlvbiBpbmZvLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWdldF9zeXNfaW5mbygmYm9hcmRfY2ZnKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogU2V0IHRoZSBTRFJBTSBSZWZyZXNoIFRpbWluZyBSZWdpc3RlciwgU0RSQU1fUlRSCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbWZzZHIoU0RSMF9ERFIwLCBzZHJfZGRycGxsKTsKKwlzZHJhbV9mcmVxID0gKChib2FyZF9jZmcuZnJlcVBMQikgKiBTRFIwX0REUjBfRERSTV9ERUNPREUoc2RyX2RkcnBsbCkpOworCisJbWF4X3JlZnJlc2hfcmF0ZSA9IDA7CisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSAhPSBTRFJBTV9OT05FKSB7CisKKwkJCXJlZnJlc2hfcmF0ZV90eXBlID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAxMik7CisJCQlyZWZyZXNoX3JhdGVfdHlwZSAmPSAweDdGOworCQkJc3dpdGNoIChyZWZyZXNoX3JhdGVfdHlwZSkgeworCQkJY2FzZSAwOgorCQkJCXJlZnJlc2hfcmF0ZSA9ICAxNTYyNTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlyZWZyZXNoX3JhdGUgPSAgIDM5MDY7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcmVmcmVzaF9yYXRlID0gICA3ODEyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXJlZnJlc2hfcmF0ZSA9ICAzMTI1MDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlyZWZyZXNoX3JhdGUgPSAgNjI1MDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJcmVmcmVzaF9yYXRlID0gMTI1MDAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZWZyZXNoX3JhdGUgPSAwOworCQkJCXByaW50ZigiRVJST1I6IERJTU0gJWQgdW5zdXBwb3J0ZWQgcmVmcmVzaCByYXRlL3R5cGUuXG4iLAorCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtKTsKKwkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcgKCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW1heF9yZWZyZXNoX3JhdGUgPSBtYXgobWF4X3JlZnJlc2hfcmF0ZSwgcmVmcmVzaF9yYXRlKTsKKwkJfQorCX0KKworCXJpbnQgPSBNVUxESVY2NChzZHJhbV9mcmVxLCBtYXhfcmVmcmVzaF9yYXRlLCBPTkVfQklMTElPTik7CisJbWZzZHJhbShTRFJBTV9SVFIsIHZhbCk7CisJbXRzZHJhbShTRFJBTV9SVFIsICh2YWwgJiB+U0RSQU1fUlRSX1JJTlRfTUFTSykgfAorCQkoU0RSQU1fUlRSX1JJTlRfRU5DT0RFKHJpbnQpKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIHJvdXRpbmUgcHJvZ3JhbXMgdGhlIFNEUkFNX1RSeCByZWdpc3RlcnMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHByb2dyYW1fdHIodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBsb25nIHNkcmFtX2RkcjE7CisJdW5zaWduZWQgbG9uZyB0X3JwX25zOworCXVuc2lnbmVkIGxvbmcgdF9yY2RfbnM7CisJdW5zaWduZWQgbG9uZyB0X3JyZF9uczsKKwl1bnNpZ25lZCBsb25nIHRfcmFzX25zOworCXVuc2lnbmVkIGxvbmcgdF9yY19uczsKKwl1bnNpZ25lZCBsb25nIHRfcmZjX25zOworCXVuc2lnbmVkIGxvbmcgdF93cGNfbnM7CisJdW5zaWduZWQgbG9uZyB0X3d0cl9uczsKKwl1bnNpZ25lZCBsb25nIHRfcnBjX25zOworCXVuc2lnbmVkIGxvbmcgdF9ycF9jbGs7CisJdW5zaWduZWQgbG9uZyB0X3JjZF9jbGs7CisJdW5zaWduZWQgbG9uZyB0X3JyZF9jbGs7CisJdW5zaWduZWQgbG9uZyB0X3Jhc19jbGs7CisJdW5zaWduZWQgbG9uZyB0X3JjX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfcmZjX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfd3BjX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfd3RyX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfcnBjX2NsazsKKwl1bnNpZ25lZCBsb25nIHNkdHIxLCBzZHRyMiwgc2R0cjM7CisJdW5zaWduZWQgbG9uZyBkZHJfY2hlY2s7CisJdW5zaWduZWQgbG9uZyBzZHJhbV9mcmVxOworCXVuc2lnbmVkIGxvbmcgc2RyX2RkcnBsbDsKKworCVBQQzR4eF9TWVNfSU5GTyBib2FyZF9jZmc7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEdldCB0aGUgYm9hcmQgY29uZmlndXJhdGlvbiBpbmZvLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWdldF9zeXNfaW5mbygmYm9hcmRfY2ZnKTsKKworCW1mc2RyKFNEUjBfRERSMCwgc2RyX2RkcnBsbCk7CisJc2RyYW1fZnJlcSA9ICgoYm9hcmRfY2ZnLmZyZXFQTEIpICogU0RSMF9ERFIwX0REUk1fREVDT0RFKHNkcl9kZHJwbGwpKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogSGFuZGxlIHRoZSB0aW1pbmcuICBXZSBuZWVkIHRvIGZpbmQgdGhlIHdvcnN0IGNhc2UgdGltaW5nIG9mIGFsbAorCSAqIHRoZSBkaW1tIG1vZHVsZXMgaW5zdGFsbGVkLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXRfcnBfbnMgPSAwOworCXRfcnJkX25zID0gMDsKKwl0X3JjZF9ucyA9IDA7CisJdF9yYXNfbnMgPSAwOworCXRfcmNfbnMgPSAwOworCXRfcmZjX25zID0gMDsKKwl0X3dwY19ucyA9IDA7CisJdF93dHJfbnMgPSAwOworCXRfcnBjX25zID0gMDsKKwlzZHJhbV9kZHIxID0gVFJVRTsKKworCS8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIERJTU0gc2xvdHMgb24gdGhlIGJvYXJkICovCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJLyogSWYgYSBkaW1tIGlzIGluc3RhbGxlZCBpbiBhIHBhcnRpY3VsYXIgc2xvdCAuLi4gKi8KKwkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSAhPSBTRFJBTV9OT05FKSB7CisJCQlpZiAoZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dID09IFNEUkFNX0REUjIpCisJCQkJc2RyYW1fZGRyMSA9IFRSVUU7CisJCQllbHNlCisJCQkJc2RyYW1fZGRyMSA9IEZBTFNFOworCisJCQl0X3JjZF9ucyA9IG1heCh0X3JjZF9ucywgc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyOSkgPj4gMik7CisJCQl0X3JyZF9ucyA9IG1heCh0X3JyZF9ucywgc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyOCkgPj4gMik7CisJCQl0X3JwX25zICA9IG1heCh0X3JwX25zLCAgc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyNykgPj4gMik7CisJCQl0X3Jhc19ucyA9IG1heCh0X3Jhc19ucywgc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAzMCkpOworCQkJdF9yY19ucyAgPSBtYXgodF9yY19ucywgIHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgNDEpKTsKKwkJCXRfcmZjX25zID0gbWF4KHRfcmZjX25zLCBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDQyKSk7CisJCX0KKwl9CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFNldCB0aGUgU0RSQU0gVGltaW5nIFJlZyAxLCBTRFJBTV9UUjEKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltZnNkcmFtKFNEUkFNX1NEVFIxLCBzZHRyMSk7CisJc2R0cjEgJj0gfihTRFJBTV9TRFRSMV9MRE9GX01BU0sgfCBTRFJBTV9TRFRSMV9SVFdfTUFTSyB8CisJCSAgIFNEUkFNX1NEVFIxX1dUV09fTUFTSyB8IFNEUkFNX1NEVFIxX1JUUk9fTUFTSyk7CisKKwkvKiBkZWZhdWx0IHZhbHVlcyAqLworCXNkdHIxIHw9IFNEUkFNX1NEVFIxX0xET0ZfMl9DTEs7CisJc2R0cjEgfD0gU0RSQU1fU0RUUjFfUlRXXzJfQ0xLOworCisJLyogbm9ybWFsIG9wZXJhdGlvbnMgKi8KKwlzZHRyMSB8PSBTRFJBTV9TRFRSMV9XVFdPXzBfQ0xLOworCXNkdHIxIHw9IFNEUkFNX1NEVFIxX1JUUk9fMV9DTEs7CisKKwltdHNkcmFtKFNEUkFNX1NEVFIxLCBzZHRyMSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFNldCB0aGUgU0RSQU0gVGltaW5nIFJlZyAyLCBTRFJBTV9UUjIKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltZnNkcmFtKFNEUkFNX1NEVFIyLCBzZHRyMik7CisJc2R0cjIgJj0gfihTRFJBTV9TRFRSMl9SQ0RfTUFTSyAgfCBTRFJBTV9TRFRSMl9XVFJfTUFTSyB8CisJCSAgIFNEUkFNX1NEVFIyX1hTTlJfTUFTSyB8IFNEUkFNX1NEVFIyX1dQQ19NQVNLIHwKKwkJICAgU0RSQU1fU0RUUjJfUlBDX01BU0sgIHwgU0RSQU1fU0RUUjJfUlBfTUFTSyAgfAorCQkgICBTRFJBTV9TRFRSMl9SUkRfTUFTSyk7CisKKwkvKgorCSAqIGNvbnZlcnQgdF9yY2QgZnJvbSBuYW5vc2Vjb25kcyB0byBkZHIgY2xvY2tzCisJICogcm91bmQgdXAgaWYgbmVjZXNzYXJ5CisJICovCisJdF9yY2RfY2xrID0gTVVMRElWNjQoc2RyYW1fZnJlcSwgdF9yY2RfbnMsIE9ORV9CSUxMSU9OKTsKKwlkZHJfY2hlY2sgPSBNVUxESVY2NChPTkVfQklMTElPTiwgdF9yY2RfY2xrLCB0X3JjZF9ucyk7CisJaWYgKHNkcmFtX2ZyZXEgIT0gZGRyX2NoZWNrKQorCQl0X3JjZF9jbGsrKzsKKworCXN3aXRjaCAodF9yY2RfY2xrKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfUkNEXzFfQ0xLOworCQlicmVhazsKKwljYXNlIDI6CisJCXNkdHIyIHw9IFNEUkFNX1NEVFIyX1JDRF8yX0NMSzsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9SQ0RfM19DTEs7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfUkNEXzRfQ0xLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9SQ0RfNV9DTEs7CisJCWJyZWFrOworCX0KKworCWlmIChzZHJhbV9kZHIxID09IFRSVUUpIHsgLyogRERSMSAqLworCQlpZiAoc2RyYW1fZnJlcSA8IDIwMDAwMDAwMCkgeworCQkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfV1RSXzFfQ0xLOworCQkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfV1BDXzJfQ0xLOworCQkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfUlBDXzJfQ0xLOworCQl9IGVsc2UgeworCQkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfV1RSXzJfQ0xLOworCQkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfV1BDXzNfQ0xLOworCQkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfUlBDXzJfQ0xLOworCQl9CisJfSBlbHNlIHsgLyogRERSMiAqLworCQkvKiBsb29wIHRocm91Z2ggYWxsIHRoZSBESU1NIHNsb3RzIG9uIHRoZSBib2FyZCAqLworCQlmb3IgKGRpbW1fbnVtID0gMDsgZGltbV9udW0gPCBudW1fZGltbV9iYW5rczsgZGltbV9udW0rKykgeworCQkJLyogSWYgYSBkaW1tIGlzIGluc3RhbGxlZCBpbiBhIHBhcnRpY3VsYXIgc2xvdCAuLi4gKi8KKwkJCWlmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gIT0gU0RSQU1fTk9ORSkgeworCQkJCXRfd3BjX25zID0gbWF4KHRfd3RyX25zLCBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDM2KSA+PiAyKTsKKwkJCQl0X3d0cl9ucyA9IG1heCh0X3d0cl9ucywgc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAzNykgPj4gMik7CisJCQkJdF9ycGNfbnMgPSBtYXgodF9ycGNfbnMsIHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMzgpID4+IDIpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogY29udmVydCBmcm9tIG5hbm9zZWNvbmRzIHRvIGRkciBjbG9ja3MKKwkJICogcm91bmQgdXAgaWYgbmVjZXNzYXJ5CisJCSAqLworCQl0X3dwY19jbGsgPSBNVUxESVY2NChzZHJhbV9mcmVxLCB0X3dwY19ucywgT05FX0JJTExJT04pOworCQlkZHJfY2hlY2sgPSBNVUxESVY2NChPTkVfQklMTElPTiwgdF93cGNfY2xrLCB0X3dwY19ucyk7CisJCWlmIChzZHJhbV9mcmVxICE9IGRkcl9jaGVjaykKKwkJCXRfd3BjX2NsaysrOworCisJCXN3aXRjaCAodF93cGNfY2xrKSB7CisJCWNhc2UgMDoKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9XUENfMl9DTEs7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfV1BDXzNfQ0xLOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXNkdHIyIHw9IFNEUkFNX1NEVFIyX1dQQ180X0NMSzsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9XUENfNV9DTEs7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNkdHIyIHw9IFNEUkFNX1NEVFIyX1dQQ182X0NMSzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogY29udmVydCBmcm9tIG5hbm9zZWNvbmRzIHRvIGRkciBjbG9ja3MKKwkJICogcm91bmQgdXAgaWYgbmVjZXNzYXJ5CisJCSAqLworCQl0X3d0cl9jbGsgPSBNVUxESVY2NChzZHJhbV9mcmVxLCB0X3d0cl9ucywgT05FX0JJTExJT04pOworCQlkZHJfY2hlY2sgPSBNVUxESVY2NChPTkVfQklMTElPTiwgdF93dHJfY2xrLCB0X3d0cl9ucyk7CisJCWlmIChzZHJhbV9mcmVxICE9IGRkcl9jaGVjaykKKwkJCXRfd3RyX2NsaysrOworCisJCXN3aXRjaCAodF93dHJfY2xrKSB7CisJCWNhc2UgMDoKKwkJY2FzZSAxOgorCQkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfV1RSXzFfQ0xLOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXNkdHIyIHw9IFNEUkFNX1NEVFIyX1dUUl8yX0NMSzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9XVFJfM19DTEs7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNkdHIyIHw9IFNEUkFNX1NEVFIyX1dUUl80X0NMSzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogY29udmVydCBmcm9tIG5hbm9zZWNvbmRzIHRvIGRkciBjbG9ja3MKKwkJICogcm91bmQgdXAgaWYgbmVjZXNzYXJ5CisJCSAqLworCQl0X3JwY19jbGsgPSBNVUxESVY2NChzZHJhbV9mcmVxLCB0X3JwY19ucywgT05FX0JJTExJT04pOworCQlkZHJfY2hlY2sgPSBNVUxESVY2NChPTkVfQklMTElPTiwgdF9ycGNfY2xrLCB0X3JwY19ucyk7CisJCWlmIChzZHJhbV9mcmVxICE9IGRkcl9jaGVjaykKKwkJCXRfcnBjX2NsaysrOworCisJCXN3aXRjaCAodF9ycGNfY2xrKSB7CisJCWNhc2UgMDoKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9SUENfMl9DTEs7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJc2R0cjIgfD0gU0RSQU1fU0RUUjJfUlBDXzNfQ0xLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9SUENfNF9DTEs7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGRlZmF1bHQgdmFsdWUgKi8KKwlzZHRyMiB8PSBTRFJBTV9TRFRSMl9YU05SXzE2X0NMSzsKKworCS8qCisJICogY29udmVydCB0X3JyZCBmcm9tIG5hbm9zZWNvbmRzIHRvIGRkciBjbG9ja3MKKwkgKiByb3VuZCB1cCBpZiBuZWNlc3NhcnkKKwkgKi8KKwl0X3JyZF9jbGsgPSBNVUxESVY2NChzZHJhbV9mcmVxLCB0X3JyZF9ucywgT05FX0JJTExJT04pOworCWRkcl9jaGVjayA9IE1VTERJVjY0KE9ORV9CSUxMSU9OLCB0X3JyZF9jbGssIHRfcnJkX25zKTsKKwlpZiAoc2RyYW1fZnJlcSAhPSBkZHJfY2hlY2spCisJCXRfcnJkX2NsaysrOworCisJaWYgKHRfcnJkX2NsayA9PSAzKQorCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9SUkRfM19DTEs7CisJZWxzZQorCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9SUkRfMl9DTEs7CisKKwkvKgorCSAqIGNvbnZlcnQgdF9ycCBmcm9tIG5hbm9zZWNvbmRzIHRvIGRkciBjbG9ja3MKKwkgKiByb3VuZCB1cCBpZiBuZWNlc3NhcnkKKwkgKi8KKwl0X3JwX2NsayA9IE1VTERJVjY0KHNkcmFtX2ZyZXEsIHRfcnBfbnMsIE9ORV9CSUxMSU9OKTsKKwlkZHJfY2hlY2sgPSBNVUxESVY2NChPTkVfQklMTElPTiwgdF9ycF9jbGssIHRfcnBfbnMpOworCWlmIChzZHJhbV9mcmVxICE9IGRkcl9jaGVjaykKKwkJdF9ycF9jbGsrKzsKKworCXN3aXRjaCAodF9ycF9jbGspIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMjoKKwljYXNlIDM6CisJCXNkdHIyIHw9IFNEUkFNX1NEVFIyX1JQXzNfQ0xLOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNkdHIyIHw9IFNEUkFNX1NEVFIyX1JQXzRfQ0xLOworCQlicmVhazsKKwljYXNlIDU6CisJCXNkdHIyIHw9IFNEUkFNX1NEVFIyX1JQXzVfQ0xLOworCQlicmVhazsKKwljYXNlIDY6CisJCXNkdHIyIHw9IFNEUkFNX1NEVFIyX1JQXzZfQ0xLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZHRyMiB8PSBTRFJBTV9TRFRSMl9SUF83X0NMSzsKKwkJYnJlYWs7CisJfQorCisJbXRzZHJhbShTRFJBTV9TRFRSMiwgc2R0cjIpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXQgdGhlIFNEUkFNIFRpbWluZyBSZWcgMywgU0RSQU1fVFIzCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbWZzZHJhbShTRFJBTV9TRFRSMywgc2R0cjMpOworCXNkdHIzICY9IH4oU0RSQU1fU0RUUjNfUkFTX01BU0sgIHwgU0RSQU1fU0RUUjNfUkNfTUFTSyB8CisJCSAgIFNEUkFNX1NEVFIzX1hDU19NQVNLIHwgU0RSQU1fU0RUUjNfUkZDX01BU0spOworCisJLyoKKwkgKiBjb252ZXJ0IHRfcmFzIGZyb20gbmFub3NlY29uZHMgdG8gZGRyIGNsb2NrcworCSAqIHJvdW5kIHVwIGlmIG5lY2Vzc2FyeQorCSAqLworCXRfcmFzX2NsayA9IE1VTERJVjY0KHNkcmFtX2ZyZXEsIHRfcmFzX25zLCBPTkVfQklMTElPTik7CisJZGRyX2NoZWNrID0gTVVMRElWNjQoT05FX0JJTExJT04sIHRfcmFzX2NsaywgdF9yYXNfbnMpOworCWlmIChzZHJhbV9mcmVxICE9IGRkcl9jaGVjaykKKwkJdF9yYXNfY2xrKys7CisKKwlzZHRyMyB8PSBTRFJBTV9TRFRSM19SQVNfRU5DT0RFKHRfcmFzX2Nsayk7CisKKwkvKgorCSAqIGNvbnZlcnQgdF9yYyBmcm9tIG5hbm9zZWNvbmRzIHRvIGRkciBjbG9ja3MKKwkgKiByb3VuZCB1cCBpZiBuZWNlc3NhcnkKKwkgKi8KKwl0X3JjX2NsayA9IE1VTERJVjY0KHNkcmFtX2ZyZXEsIHRfcmNfbnMsIE9ORV9CSUxMSU9OKTsKKwlkZHJfY2hlY2sgPSBNVUxESVY2NChPTkVfQklMTElPTiwgdF9yY19jbGssIHRfcmNfbnMpOworCWlmIChzZHJhbV9mcmVxICE9IGRkcl9jaGVjaykKKwkJdF9yY19jbGsrKzsKKworCXNkdHIzIHw9IFNEUkFNX1NEVFIzX1JDX0VOQ09ERSh0X3JjX2Nsayk7CisKKwkvKiBkZWZhdWx0IHhjcyB2YWx1ZSAqLworCXNkdHIzIHw9IFNEUkFNX1NEVFIzX1hDUzsKKworCS8qCisJICogY29udmVydCB0X3JmYyBmcm9tIG5hbm9zZWNvbmRzIHRvIGRkciBjbG9ja3MKKwkgKiByb3VuZCB1cCBpZiBuZWNlc3NhcnkKKwkgKi8KKwl0X3JmY19jbGsgPSBNVUxESVY2NChzZHJhbV9mcmVxLCB0X3JmY19ucywgT05FX0JJTExJT04pOworCWRkcl9jaGVjayA9IE1VTERJVjY0KE9ORV9CSUxMSU9OLCB0X3JmY19jbGssIHRfcmZjX25zKTsKKwlpZiAoc2RyYW1fZnJlcSAhPSBkZHJfY2hlY2spCisJCXRfcmZjX2NsaysrOworCisJc2R0cjMgfD0gU0RSQU1fU0RUUjNfUkZDX0VOQ09ERSh0X3JmY19jbGspOworCisJbXRzZHJhbShTRFJBTV9TRFRSMywgc2R0cjMpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogcHJvZ3JhbV9ieGNmLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBwcm9ncmFtX2J4Y2YodW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgbnVtX2NvbF9hZGRyOworCXVuc2lnbmVkIGxvbmcgbnVtX3JhbmtzOworCXVuc2lnbmVkIGxvbmcgbnVtX2JhbmtzOworCXVuc2lnbmVkIGxvbmcgbW9kZTsKKwl1bnNpZ25lZCBsb25nIGluZF9yYW5rOworCXVuc2lnbmVkIGxvbmcgaW5kOworCXVuc2lnbmVkIGxvbmcgaW5kX2Jhbms7CisJdW5zaWduZWQgbG9uZyBiYW5rXzBfcG9wdWxhdGVkOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXQgdGhlIEJ4Q0YgcmVncy4gIEZpcnN0LCB3aXBlIG91dCB0aGUgYmFuayBjb25maWcgcmVnaXN0ZXJzLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW10c2RyYW0oU0RSQU1fTUIwQ0YsIDB4MDAwMDAwMDApOworCW10c2RyYW0oU0RSQU1fTUIxQ0YsIDB4MDAwMDAwMDApOworCW10c2RyYW0oU0RSQU1fTUIyQ0YsIDB4MDAwMDAwMDApOworCW10c2RyYW0oU0RSQU1fTUIzQ0YsIDB4MDAwMDAwMDApOworCisJbW9kZSA9IFNEUkFNX0JYQ0ZfTV9CRV9FTkFCTEU7CisKKwliYW5rXzBfcG9wdWxhdGVkID0gMDsKKworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCWlmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gIT0gU0RSQU1fTk9ORSkgeworCQkJbnVtX2NvbF9hZGRyID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCA0KTsKKwkJCW51bV9yYW5rcyA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgNSk7CisJCQlpZiAoKHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMikpID09IDB4MDgpCisJCQkJbnVtX3JhbmtzID0gKG51bV9yYW5rcyAmIDB4MEYpICsxOworCQkJZWxzZQorCQkJCW51bV9yYW5rcyA9IG51bV9yYW5rcyAmIDB4MEY7CisKKwkJCW51bV9iYW5rcyA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMTcpOworCisJCQlmb3IgKGluZF9iYW5rID0gMDsgaW5kX2JhbmsgPCAyOyBpbmRfYmFuaysrKSB7CisJCQkJaWYgKG51bV9iYW5rcyA9PSA0KQorCQkJCQlpbmQgPSAwOworCQkJCWVsc2UKKwkJCQkJaW5kID0gNSA8PCA4OworCQkJCXN3aXRjaCAobnVtX2NvbF9hZGRyKSB7CisJCQkJY2FzZSAweDA4OgorCQkJCQltb2RlIHw9IChTRFJBTV9CWENGX01fQU1fMCArIGluZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgwOToKKwkJCQkJbW9kZSB8PSAoU0RSQU1fQlhDRl9NX0FNXzEgKyBpbmQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEE6CisJCQkJCW1vZGUgfD0gKFNEUkFNX0JYQ0ZfTV9BTV8yICsgaW5kKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDBCOgorCQkJCQltb2RlIHw9IChTRFJBTV9CWENGX01fQU1fMyArIGluZCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgwQzoKKwkJCQkJbW9kZSB8PSAoU0RSQU1fQlhDRl9NX0FNXzQgKyBpbmQpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGYoIkREUi1TRFJBTTogRElNTSAlZCBCeENGIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJCQkgICAgICAgKHVuc2lnbmVkIGludClkaW1tX251bSk7CisJCQkJCXByaW50ZigiRVJST1I6IFVuc3VwcG9ydGVkIHZhbHVlIGZvciBudW1iZXIgb2YgIgorCQkJCQkgICAgICAgImNvbHVtbiBhZGRyZXNzZXM6ICVkLlxuIiwgKHVuc2lnbmVkIGludCludW1fY29sX2FkZHIpOworCQkJCQlwcmludGYoIlJlcGxhY2UgdGhlIERJTU0gbW9kdWxlIHdpdGggYSBzdXBwb3J0ZWQgRElNTS5cblxuIik7CisJCQkJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gIT0gU0RSQU1fTk9ORSkmJiAoZGltbV9udW0gPT0xKSkKKwkJCQliYW5rXzBfcG9wdWxhdGVkID0gMTsKKworCQkJZm9yIChpbmRfcmFuayA9IDA7IGluZF9yYW5rIDwgbnVtX3JhbmtzOyBpbmRfcmFuaysrKSB7CisJCQkJbXRzZHJhbShTRFJBTV9NQjBDRiArCisJCQkJCSgoZGltbV9udW0gKyBiYW5rXzBfcG9wdWxhdGVkICsgaW5kX3JhbmspIDw8IDIpLAorCQkJCQltb2RlKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHByb2dyYW0gbWVtb3J5IHF1ZXVlLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBwcm9ncmFtX21lbW9yeV9xdWV1ZSh1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCQkgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkJIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwlwaHlzX3NpemVfdCByYW5rX2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHJhbmtfcmVnOworCXBoeXNfc2l6ZV90IHJhbmtfc2l6ZV9ieXRlczsKKwl1bnNpZ25lZCBsb25nIHJhbmtfc2l6ZV9pZDsKKwl1bnNpZ25lZCBsb25nIG51bV9yYW5rczsKKwl1bnNpZ25lZCBsb25nIGJhc2VhZGRfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBiYW5rXzBfcG9wdWxhdGVkID0gMDsKKwlwaHlzX3NpemVfdCB0b3RhbF9zaXplID0gMDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogUmVzZXQgdGhlIHJhbmtfYmFzZV9hZGRyZXNzLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXJhbmtfcmVnICAgPSBTRFJBTV9SMEJBUzsKKworCXJhbmtfYmFzZV9hZGRyID0gMHgwMDAwMDAwMDsKKworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCWlmIChkaW1tX3BvcHVsYXRlZFtkaW1tX251bV0gIT0gU0RSQU1fTk9ORSkgeworCQkJbnVtX3JhbmtzID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCA1KTsKKwkJCWlmICgoc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyKSkgPT0gMHgwOCkKKwkJCQludW1fcmFua3MgPSAobnVtX3JhbmtzICYgMHgwRikgKyAxOworCQkJZWxzZQorCQkJCW51bV9yYW5rcyA9IG51bV9yYW5rcyAmIDB4MEY7CisKKwkJCXJhbmtfc2l6ZV9pZCA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMzEpOworCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICogU2V0IHRoZSBzaXplcworCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQliYXNlYWRkX3NpemUgPSAwOworCQkJc3dpdGNoIChyYW5rX3NpemVfaWQpIHsKKwkJCWNhc2UgMHgwMToKKwkJCQliYXNlYWRkX3NpemUgfD0gU0RSQU1fUlhCQVNfU0RTWl8xMDI0OworCQkJCXRvdGFsX3NpemUgPSAxMDI0OworCQkJCWJyZWFrOworCQkJY2FzZSAweDAyOgorCQkJCWJhc2VhZGRfc2l6ZSB8PSBTRFJBTV9SWEJBU19TRFNaXzIwNDg7CisJCQkJdG90YWxfc2l6ZSA9IDIwNDg7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDQ6CisJCQkJYmFzZWFkZF9zaXplIHw9IFNEUkFNX1JYQkFTX1NEU1pfNDA5NjsKKwkJCQl0b3RhbF9zaXplID0gNDA5NjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwODoKKwkJCQliYXNlYWRkX3NpemUgfD0gU0RSQU1fUlhCQVNfU0RTWl8zMjsKKwkJCQl0b3RhbF9zaXplID0gMzI7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTA6CisJCQkJYmFzZWFkZF9zaXplIHw9IFNEUkFNX1JYQkFTX1NEU1pfNjQ7CisJCQkJdG90YWxfc2l6ZSA9IDY0OworCQkJCWJyZWFrOworCQkJY2FzZSAweDIwOgorCQkJCWJhc2VhZGRfc2l6ZSB8PSBTRFJBTV9SWEJBU19TRFNaXzEyODsKKwkJCQl0b3RhbF9zaXplID0gMTI4OworCQkJCWJyZWFrOworCQkJY2FzZSAweDQwOgorCQkJCWJhc2VhZGRfc2l6ZSB8PSBTRFJBTV9SWEJBU19TRFNaXzI1NjsKKwkJCQl0b3RhbF9zaXplID0gMjU2OworCQkJCWJyZWFrOworCQkJY2FzZSAweDgwOgorCQkJCWJhc2VhZGRfc2l6ZSB8PSBTRFJBTV9SWEJBU19TRFNaXzUxMjsKKwkJCQl0b3RhbF9zaXplID0gNTEyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIkREUi1TRFJBTTogRElNTSAlZCBtZW1vcnkgcXVldWUgY29uZmlndXJhdGlvbi5cbiIsCisJCQkJICAgICAgICh1bnNpZ25lZCBpbnQpZGltbV9udW0pOworCQkJCXByaW50ZigiRVJST1I6IFVuc3VwcG9ydGVkIHZhbHVlIGZvciB0aGUgYmFua3NpemU6ICVkLlxuIiwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGludClyYW5rX3NpemVfaWQpOworCQkJCXByaW50ZigiUmVwbGFjZSB0aGUgRElNTSBtb2R1bGUgd2l0aCBhIHN1cHBvcnRlZCBESU1NLlxuXG4iKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwkJCX0KKwkJCXJhbmtfc2l6ZV9ieXRlcyA9IHRvdGFsX3NpemUgPDwgMjA7CisKKwkJCWlmICgoZGltbV9wb3B1bGF0ZWRbZGltbV9udW1dICE9IFNEUkFNX05PTkUpICYmIChkaW1tX251bSA9PSAxKSkKKwkJCQliYW5rXzBfcG9wdWxhdGVkID0gMTsKKworCQkJZm9yIChpID0gMDsgaSA8IG51bV9yYW5rczsgaSsrKQl7CisJCQkJbXRkY3JfYW55KHJhbmtfcmVnK2krZGltbV9udW0rYmFua18wX3BvcHVsYXRlZCwKKwkJCQkJICAoU0RSQU1fUlhCQVNfU0RCQV9FTkNPREUocmFua19iYXNlX2FkZHIpIHwKKwkJCQkJICAgYmFzZWFkZF9zaXplKSk7CisJCQkJcmFua19iYXNlX2FkZHIgKz0gcmFua19zaXplX2J5dGVzOworCQkJfQorCQl9CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfNDQwU1ApIHx8IGRlZmluZWQoQ09ORklHXzQ0MFNQRSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ2MEVYKSB8fCBkZWZpbmVkKENPTkZJR180NjBHVCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ2MFNYKQorCS8qCisJICogRW5hYmxlIGhpZ2ggYmFuZHdpZHRoIGFjY2VzcworCSAqIFRoaXMgaXMgY3VycmVudGx5IG5vdCB1c2VkLCBidXQgd2l0aCB0aGlzIHNldHVwCisJICogaXQgaXMgcG9zc2libGUgdG8gdXNlIGl0IGxhdGVyIG9uIGluIGUuZy4gdGhlIExpbnV4CisJICogRU1BQyBkcml2ZXIgZm9yIHBlcmZvcm1hbmNlIGdhaW4uCisJICovCisJbXRkY3IoU0RSQU1fUExCQUREVUxMLCAweDAwMDAwMDAwKTsgLyogTVEwX0JBVUwgKi8KKwltdGRjcihTRFJBTV9QTEJBRERVSEIsIDB4MDAwMDAwMDgpOyAvKiBNUTBfQkFVSCAqLworCisJLyoKKwkgKiBTZXQgb3B0aW1hbCB2YWx1ZSBmb3IgTWVtb3J5IFF1ZXVlIEhCL0xMIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisJICovCisJbXRkY3IoU0RSQU1fQ09ORjFIQiwgKG1mZGNyKFNEUkFNX0NPTkYxSEIpICYgflNEUkFNX0NPTkYxSEJfTUFTSykgfAorCSAgICAgIFNEUkFNX0NPTkYxSEJfQUFGUiB8IFNEUkFNX0NPTkYxSEJfUlBFTiB8IFNEUkFNX0NPTkYxSEJfUkZURSB8CisJICAgICAgU0RSQU1fQ09ORjFIQl9SUExNIHwgU0RSQU1fQ09ORjFIQl9XUkNMKTsKKwltdGRjcihTRFJBTV9DT05GMUxMLCAobWZkY3IoU0RSQU1fQ09ORjFMTCkgJiB+U0RSQU1fQ09ORjFMTF9NQVNLKSB8CisJICAgICAgU0RSQU1fQ09ORjFMTF9BQUZSIHwgU0RSQU1fQ09ORjFMTF9SUEVOIHwgU0RSQU1fQ09ORjFMTF9SRlRFIHwKKwkgICAgICBTRFJBTV9DT05GMUxMX1JQTE0pOworCW10ZGNyKFNEUkFNX0NPTkZQQVRIQiwgbWZkY3IoU0RSQU1fQ09ORlBBVEhCKSB8IFNEUkFNX0NPTkZQQVRIQl9UUEVOKTsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX0REUl9FQ0MKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBwcm9ncmFtX2VjYy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgcHJvZ3JhbV9lY2ModW5zaWduZWQgbG9uZyAqZGltbV9wb3B1bGF0ZWQsCisJCQl1bnNpZ25lZCBjaGFyICppaWMwX2RpbW1fYWRkciwKKwkJCXVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MsCisJCQl1bnNpZ25lZCBsb25nIHRsYl93b3JkMl9pX3ZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZGltbV9udW07CisJdW5zaWduZWQgbG9uZyBlY2M7CisKKwllY2MgPSAwOworCS8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIERJTU0gc2xvdHMgb24gdGhlIGJvYXJkICovCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgTUFYRElNTVM7IGRpbW1fbnVtKyspIHsKKwkJLyogSWYgYSBkaW1tIGlzIGluc3RhbGxlZCBpbiBhIHBhcnRpY3VsYXIgc2xvdCAuLi4gKi8KKwkJaWYgKGRpbW1fcG9wdWxhdGVkW2RpbW1fbnVtXSAhPSBTRFJBTV9OT05FKQorCQkJZWNjID0gbWF4KGVjYywgc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAxMSkpOworCX0KKwlpZiAoZWNjID09IDApCisJCXJldHVybjsKKworCWRvX3Byb2dyYW1fZWNjKHRsYl93b3JkMl9pX3ZhbHVlKTsKK30KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfQVVUT0NBTElCUkFUSU9OKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHByb2dyYW1fRFFTX2NhbGlicmF0aW9uLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBwcm9ncmFtX0RRU19jYWxpYnJhdGlvbih1bnNpZ25lZCBsb25nICpkaW1tX3BvcHVsYXRlZCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciAqaWljMF9kaW1tX2FkZHIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKyNpZmRlZiBIQVJEX0NPREVEX0RRUyAvKiBjYWxpYnJhdGlvbiB0ZXN0IHdpdGggaGFyZHZhbHVlcyAqLworCW10c2RyYW0oU0RSQU1fUlFEQywgMHg4MDAwMDAzNyk7CisJbXRzZHJhbShTRFJBTV9SRENDLCAweDQwMDAwMDAwKTsKKwltdHNkcmFtKFNEUkFNX1JGREMsIDB4MDAwMDAxREYpOworCisJdGVzdCgpOworI2Vsc2UKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFByb2dyYW0gUkRDQyByZWdpc3RlcgorCSAqIFJlYWQgc2FtcGxlIGN5Y2xlIGF1dG8tdXBkYXRlIGVuYWJsZQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbWZzZHJhbShTRFJBTV9SRENDLCB2YWwpOworCW10c2RyYW0oU0RSQU1fUkRDQywKKwkJKHZhbCAmIH4oU0RSQU1fUkRDQ19SRFNTX01BU0sgfCBTRFJBTV9SRENDX1JTQUVfTUFTSykpCisJCXwgU0RSQU1fUkRDQ19SU0FFX0VOQUJMRSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFByb2dyYW0gUlFEQyByZWdpc3RlcgorCSAqIEludGVybmFsIERRUyBkZWxheSBtZWNoYW5pc20gZW5hYmxlCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRzZHJhbShTRFJBTV9SUURDLCAoU0RSQU1fUlFEQ19SUURFX0VOQUJMRXxTRFJBTV9SUURDX1JRRkRfRU5DT0RFKDB4MzgpKSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFByb2dyYW0gUkZEQyByZWdpc3RlcgorCSAqIFNldCBGZWVkYmFjayBGcmFjdGlvbmFsIE92ZXJzYW1wbGUKKwkgKiBBdXRvLWRldGVjdCByZWFkIHNhbXBsZSBjeWNsZSBlbmFibGUKKwkgKiBTZXQgUkZPUyB0byAxLzQgb2YgbWVtY2xrIGN5Y2xlICgweDNmKQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW1mc2RyYW0oU0RSQU1fUkZEQywgdmFsKTsKKwltdHNkcmFtKFNEUkFNX1JGREMsCisJCSh2YWwgJiB+KFNEUkFNX1JGRENfQVJTRV9NQVNLIHwgU0RSQU1fUkZEQ19SRk9TX01BU0sgfAorCQkJIFNEUkFNX1JGRENfUkZGRF9NQVNLKSkKKwkJfCAoU0RSQU1fUkZEQ19BUlNFX0VOQUJMRSB8IFNEUkFNX1JGRENfUkZPU19FTkNPREUoMHgzZikgfAorCQkgICBTRFJBTV9SRkRDX1JGRkRfRU5DT0RFKDApKSk7CisKKwlEUVNfY2FsaWJyYXRpb25fcHJvY2VzcygpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc2hvcnRfbWVtX3Rlc3Qodm9pZCkKK3sKKwl1MzIgKm1lbWJhc2U7CisJdTMyIGJ4Y3JfbnVtOworCXUzMiBieGNmOworCWludCBpOworCWludCBqOworCXBoeXNfc2l6ZV90IGJhc2VfYWRkcjsKKwl1MzIgdGVzdFtOVU1NRU1URVNUU11bTlVNTUVNV09SRFNdID0geworCQl7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwKKwkJIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LAorCQl7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkJIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCQl7MHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwKKwkJIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTV9LAorCQl7MHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwKKwkJIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUF9LAorCQl7MHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwgMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwKKwkJIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUF9LAorCQl7MHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwKKwkJIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTV9LAorCQl7MHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwgMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwKKwkJIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUF9LAorCQl7MHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwgMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwKKwkJIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTV9IH07CisJaW50IGw7CisKKwlmb3IgKGJ4Y3JfbnVtID0gMDsgYnhjcl9udW0gPCBNQVhCWENGOyBieGNyX251bSsrKSB7CisJCW1mc2RyYW0oU0RSQU1fTUIwQ0YgKyAoYnhjcl9udW0gPDwgMiksIGJ4Y2YpOworCisJCS8qIEJhbmtzIGVuYWJsZWQgKi8KKwkJaWYgKChieGNmICYgU0RSQU1fQlhDRl9NX0JFX01BU0spID09IFNEUkFNX0JYQ0ZfTV9CRV9FTkFCTEUpIHsKKwkJCS8qIEJhbmsgaXMgZW5hYmxlZCAqLworCisJCQkvKgorCQkJICogT25seSBydW4gdGVzdCBvbiBhY2Nlc3NhYmxlIG1lbW9yeSAoYmVsb3cgMkdCKQorCQkJICovCisJCQliYXNlX2FkZHIgPSBTRFJBTV9SWEJBU19TREJBX0RFQ09ERShtZmRjcl9hbnkoU0RSQU1fUjBCQVMrYnhjcl9udW0pKTsKKwkJCWlmIChiYXNlX2FkZHIgPj0gQ09ORklHX01BWF9NRU1fTUFQUEVEKQorCQkJCWNvbnRpbnVlOworCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICogUnVuIHRoZSBzaG9ydCBtZW1vcnkgdGVzdC4KKwkJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJbWVtYmFzZSA9ICh1MzIgKikodTMyKWJhc2VfYWRkcjsKKworCQkJZm9yIChpID0gMDsgaSA8IE5VTU1FTVRFU1RTOyBpKyspIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTlVNTUVNV09SRFM7IGorKykgeworCQkJCQltZW1iYXNlW2pdID0gdGVzdFtpXVtqXTsKKwkJCQkJcHBjRGNiZigodTMyKSYobWVtYmFzZVtqXSkpOworCQkJCX0KKwkJCQlzeW5jKCk7CisJCQkJZm9yIChsPTA7IGw8TlVNTE9PUFM7IGwrKykgeworCQkJCQlmb3IgKGogPSAwOyBqIDwgTlVNTUVNV09SRFM7IGorKykgeworCQkJCQkJaWYgKG1lbWJhc2Vbal0gIT0gdGVzdFtpXVtqXSkgeworCQkJCQkJCXBwY0RjYmYoKHUzMikmKG1lbWJhc2Vbal0pKTsKKwkJCQkJCQlyZXR1cm4gMDsKKwkJCQkJCX0KKwkJCQkJCXBwY0RjYmYoKHUzMikmKG1lbWJhc2Vbal0pKTsKKwkJCQkJfQorCQkJCQlzeW5jKCk7CisJCQkJfQorCQkJfQorCQl9CS8qIGlmIGJhbmsgZW5hYmxlZCAqLworCX0JCS8qIGZvciBieGNmX251bSAqLworCisJcmV0dXJuIDE7Cit9CisKKyNpZm5kZWYgSEFSRF9DT0RFRF9EUVMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBEUVNfY2FsaWJyYXRpb25fcHJvY2Vzcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgRFFTX2NhbGlicmF0aW9uX3Byb2Nlc3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJmZGNfcmVnOworCXVuc2lnbmVkIGxvbmcgcmZmZDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlsb25nIHJmZmRfYXZlcmFnZTsKKwlsb25nIG1heF9zdGFydDsKKwlsb25nIG1pbl9lbmQ7CisJdW5zaWduZWQgbG9uZyBiZWdpbl9ycWZkW01BWFJBTktTXTsKKwl1bnNpZ25lZCBsb25nIGJlZ2luX3JmZmRbTUFYUkFOS1NdOworCXVuc2lnbmVkIGxvbmcgZW5kX3JxZmRbTUFYUkFOS1NdOworCXVuc2lnbmVkIGxvbmcgZW5kX3JmZmRbTUFYUkFOS1NdOworCWNoYXIgd2luZG93X2ZvdW5kOworCXVuc2lnbmVkIGxvbmcgZGx5Y2FsOworCXVuc2lnbmVkIGxvbmcgZGx5X3ZhbDsKKwl1bnNpZ25lZCBsb25nIG1heF9wYXNzX2xlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGN1cnJlbnRfcGFzc19sZW5ndGg7CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X2ZhaWxfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgY3VycmVudF9zdGFydDsKKwlsb25nIG1heF9lbmQ7CisJdW5zaWduZWQgY2hhciBmYWlsX2ZvdW5kOworCXVuc2lnbmVkIGNoYXIgcGFzc19mb3VuZDsKKyNpZiAhZGVmaW5lZChDT05GSUdfRERSX1JRRENfRklYRUQpCisJdTMyIHJxZGNfcmVnOworCXUzMiBycWZkOworCXUzMiBycWZkX3N0YXJ0OworCXUzMiBycWZkX2F2ZXJhZ2U7CisJaW50IGxvb3BpID0gMDsKKwljaGFyIHN0cltdID0gIkF1dG8gY2FsaWJyYXRpb24gLSI7CisJY2hhciBzbGFzaFtdID0gIlxcfC8tXFx8Ly0iOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBUZXN0IHRvIGRldGVybWluZSB0aGUgYmVzdCByZWFkIGNsb2NrIGRlbGF5IHR1bmluZyBiaXRzLgorCSAqCisJICogQmVmb3JlIHRoZSBERFIgY29udHJvbGxlciBjYW4gYmUgdXNlZCwgdGhlIHJlYWQgY2xvY2sgZGVsYXkgbmVlZHMgdG8gYmUKKwkgKiBzZXQuICBUaGlzIGlzIFNEUkFNX1JRRENbUlFGRF0gYW5kIFNEUkFNX1JGRENbUkZGRF0uCisJICogVGhpcyB2YWx1ZSBjYW5ub3QgYmUgaGFyZGNvZGVkIGludG8gdGhlIHByb2dyYW0gYmVjYXVzZSBpdCBjaGFuZ2VzCisJICogZGVwZW5kaW5nIG9uIHRoZSBib2FyZCdzIHNldHVwIGFuZCBlbnZpcm9ubWVudC4KKwkgKiBUbyBkbyB0aGlzLCBhbGwgZGVsYXkgdmFsdWVzIGFyZSB0ZXN0ZWQgdG8gc2VlIGlmIHRoZXkKKwkgKiB3b3JrIG9yIG5vdC4gIEJ5IGRvaW5nIHRoaXMsIHlvdSBnZXQgZ3JvdXBzIG9mIGZhaWxzIHdpdGggZ3JvdXBzIG9mCisJICogcGFzc2luZyB2YWx1ZXMuICBUaGUgaWRlYSBpcyB0byBmaW5kIHRoZSBzdGFydCBhbmQgZW5kIG9mIGEgcGFzc2luZworCSAqIHdpbmRvdyBhbmQgdGFrZSB0aGUgY2VudGVyIG9mIGl0IHRvIHVzZSBhcyB0aGUgcmVhZCBjbG9jayBkZWxheS4KKwkgKgorCSAqIEEgZmFpbHVyZSBoYXMgdG8gYmUgc2VlbiBmaXJzdCBzbyB0aGF0IHdoZW4gd2UgaGl0IGEgcGFzcywgd2Uga25vdworCSAqIHRoYXQgaXQgaXMgdHJ1ZWx5IHRoZSBzdGFydCBvZiB0aGUgd2luZG93LiAgSWYgd2UgZ2V0IHBhc3NpbmcgdmFsdWVzCisJICogdG8gc3RhcnQgb2ZmIHdpdGgsIHdlIGRvbid0IGtub3cgaWYgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiB0aGUgd2luZG93LgorCSAqCisJICogVGhlIGNvZGUgYXNzdW1lcyB0aGF0IGEgZmFpbHVyZSB3aWxsIGFsd2F5cyBiZSBmb3VuZC4KKwkgKiBJZiBhIGZhaWx1cmUgaXMgbm90IGZvdW5kLCB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBnZXQgdGhlIG1pZGRsZQorCSAqIG9mIHRoZSBwYXNzaW5nIHdpbmRvdy4gIEkgZ3Vlc3Mgd2UgY2FuIHByZXR0eSBtdWNoIHBpY2sgYW55IHZhbHVlCisJICogYnV0IHNvbWUgdmFsdWVzIHdpbGwgYmUgYmV0dGVyIHRoYW4gb3RoZXJzLiAgU2luY2UgdGhlIGxvd2VzdCBzcGVlZAorCSAqIHdlIGNhbiBjbG9jayB0aGUgRERSIGludGVyZmFjZSBhdCBpcyAyMDAgTUh6ICgyeCAxMDAgTUh6IFBMQiBzcGVlZCksCisJICogZnJvbSBleHBlcmltZW50YXRpb24gaXQgaXMgc2FmZSB0byBzYXkgeW91IHdpbGwgYWx3YXlzIGhhdmUgYSBmYWlsdXJlLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogZmlyc3QgZml4IFJRRENbUlFGRF0gdG8gYW4gYXZlcmFnZSBvZiA4MCBkZWdyZSBwaGFzZSBzaGlmdCB0byBmaW5kIFJGRENbUkZGRF0gKi8KKwlycWZkX3N0YXJ0ID0gNjQ7IC8qIHRlc3Qtb25seTogZG9uJ3Qga25vdyBpZiB0aGlzIGlzIHRoZSBfYmVzdF8gc3RhcnQgdmFsdWUgKi8KKworCXB1dHMoc3RyKTsKKworY2FsaWJyYXRpb25fbG9vcDoKKwltZnNkcmFtKFNEUkFNX1JRREMsIHJxZGNfcmVnKTsKKwltdHNkcmFtKFNEUkFNX1JRREMsIChycWRjX3JlZyAmIH5TRFJBTV9SUURDX1JRRkRfTUFTSykgfAorCQlTRFJBTV9SUURDX1JRRkRfRU5DT0RFKHJxZmRfc3RhcnQpKTsKKyNlbHNlIC8qIENPTkZJR19ERFJfUlFEQ19GSVhFRCAqLworCS8qCisJICogT24gS2F0bWFpIHRoZSBjb21wbGV0ZSBhdXRvLWNhbGlicmF0aW9uIHNvbWVob3cgZG9lc24ndCBzZWVtIHRvCisJICogcHJvZHVjZSB0aGUgYmVzdCByZXN1bHRzLCBtZWFuaW5nIG9wdGltYWwgdmFsdWVzIGZvciBSUUZEL1JGRkQuCisJICogVGhpcyB3YXMgZGlzY292ZXJlZCBieSBHREEgdXNpbmcgYSBoaWdoIGJhbmR3aWR0aCBzY29wZSwKKwkgKiBhbmFseXppbmcgdGhlIEREUjIgc2lnbmFscy4gR0RBIHByb3ZpZGVkIGEgZml4ZWQgdmFsdWUgZm9yIFJRRkQsCisJICogc28gbm93IG9uIEthdG1haSAib25seSIgUkZGRCBpcyBhdXRvLWNhbGlicmF0ZWQuCisJICovCisJbXRzZHJhbShTRFJBTV9SUURDLCBDT05GSUdfRERSX1JRRENfRklYRUQpOworI2VuZGlmIC8qIENPTkZJR19ERFJfUlFEQ19GSVhFRCAqLworCisJbWF4X3N0YXJ0ID0gMDsKKwltaW5fZW5kID0gMDsKKwliZWdpbl9ycWZkWzBdID0gMDsKKwliZWdpbl9yZmZkWzBdID0gMDsKKwliZWdpbl9ycWZkWzFdID0gMDsKKwliZWdpbl9yZmZkWzFdID0gMDsKKwllbmRfcnFmZFswXSA9IDA7CisJZW5kX3JmZmRbMF0gPSAwOworCWVuZF9ycWZkWzFdID0gMDsKKwllbmRfcmZmZFsxXSA9IDA7CisJd2luZG93X2ZvdW5kID0gRkFMU0U7CisKKwltYXhfcGFzc19sZW5ndGggPSAwOworCW1heF9zdGFydCA9IDA7CisJbWF4X2VuZCA9IDA7CisJY3VycmVudF9wYXNzX2xlbmd0aCA9IDA7CisJY3VycmVudF9mYWlsX2xlbmd0aCA9IDA7CisJY3VycmVudF9zdGFydCA9IDA7CisJd2luZG93X2ZvdW5kID0gRkFMU0U7CisJZmFpbF9mb3VuZCA9IEZBTFNFOworCXBhc3NfZm91bmQgPSBGQUxTRTsKKworCS8qCisJICogZ2V0IHRoZSBkZWxheSBsaW5lIGNhbGlicmF0aW9uIHJlZ2lzdGVyIHZhbHVlCisJICovCisJbWZzZHJhbShTRFJBTV9ETENSLCBkbHljYWwpOworCWRseV92YWwgPSBTRFJBTV9ETFlDQUxfRExDVl9ERUNPREUoZGx5Y2FsKSA8PCAyOworCisJZm9yIChyZmZkID0gMDsgcmZmZCA8PSBTRFJBTV9SRkRDX1JGRkRfTUFYOyByZmZkKyspIHsKKwkJbWZzZHJhbShTRFJBTV9SRkRDLCByZmRjX3JlZyk7CisJCXJmZGNfcmVnICY9IH4oU0RSQU1fUkZEQ19SRkZEX01BU0spOworCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCSAqIFNldCB0aGUgdGltaW5nIHJlZyBmb3IgdGhlIHRlc3QuCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQltdHNkcmFtKFNEUkFNX1JGREMsIHJmZGNfcmVnIHwgU0RSQU1fUkZEQ19SRkZEX0VOQ09ERShyZmZkKSk7CisKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICogU2VlIGlmIHRoZSByZmZkIHZhbHVlIHBhc3NlZC4KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCWlmIChzaG9ydF9tZW1fdGVzdCgpKSB7CisJCQlpZiAoZmFpbF9mb3VuZCA9PSBUUlVFKSB7CisJCQkJcGFzc19mb3VuZCA9IFRSVUU7CisJCQkJaWYgKGN1cnJlbnRfcGFzc19sZW5ndGggPT0gMCkKKwkJCQkJY3VycmVudF9zdGFydCA9IHJmZmQ7CisKKwkJCQljdXJyZW50X2ZhaWxfbGVuZ3RoID0gMDsKKwkJCQljdXJyZW50X3Bhc3NfbGVuZ3RoKys7CisKKwkJCQlpZiAoY3VycmVudF9wYXNzX2xlbmd0aCA+IG1heF9wYXNzX2xlbmd0aCkgeworCQkJCQltYXhfcGFzc19sZW5ndGggPSBjdXJyZW50X3Bhc3NfbGVuZ3RoOworCQkJCQltYXhfc3RhcnQgPSBjdXJyZW50X3N0YXJ0OworCQkJCQltYXhfZW5kID0gcmZmZDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQljdXJyZW50X3Bhc3NfbGVuZ3RoID0gMDsKKwkJCWN1cnJlbnRfZmFpbF9sZW5ndGgrKzsKKworCQkJaWYgKGN1cnJlbnRfZmFpbF9sZW5ndGggPj0gKGRseV92YWwgPj4gMikpIHsKKwkJCQlpZiAoZmFpbF9mb3VuZCA9PSBGQUxTRSkgeworCQkJCQlmYWlsX2ZvdW5kID0gVFJVRTsKKwkJCQl9IGVsc2UgaWYgKHBhc3NfZm91bmQgPT0gVFJVRSkgeworCQkJCQl3aW5kb3dfZm91bmQgPSBUUlVFOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CQkvKiBmb3IgcmZmZCAqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXQgdGhlIGF2ZXJhZ2UgUkZGRCB2YWx1ZQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXJmZmRfYXZlcmFnZSA9ICgobWF4X3N0YXJ0ICsgbWF4X2VuZCkgPj4gMSk7CisKKwlpZiAocmZmZF9hdmVyYWdlIDwgMCkKKwkJcmZmZF9hdmVyYWdlID0gMDsKKworCWlmIChyZmZkX2F2ZXJhZ2UgPiBTRFJBTV9SRkRDX1JGRkRfTUFYKQorCQlyZmZkX2F2ZXJhZ2UgPSBTRFJBTV9SRkRDX1JGRkRfTUFYOworCS8qIG5vdyBmaXggUkZEQ1tSRkZEXSBmb3VuZCBhbmQgZmluZCBSUURDW1JRRkRdICovCisJbXRzZHJhbShTRFJBTV9SRkRDLCByZmRjX3JlZyB8IFNEUkFNX1JGRENfUkZGRF9FTkNPREUocmZmZF9hdmVyYWdlKSk7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfRERSX1JRRENfRklYRUQpCisJbWF4X3Bhc3NfbGVuZ3RoID0gMDsKKwltYXhfc3RhcnQgPSAwOworCW1heF9lbmQgPSAwOworCWN1cnJlbnRfcGFzc19sZW5ndGggPSAwOworCWN1cnJlbnRfZmFpbF9sZW5ndGggPSAwOworCWN1cnJlbnRfc3RhcnQgPSAwOworCXdpbmRvd19mb3VuZCA9IEZBTFNFOworCWZhaWxfZm91bmQgPSBGQUxTRTsKKwlwYXNzX2ZvdW5kID0gRkFMU0U7CisKKwlmb3IgKHJxZmQgPSAwOyBycWZkIDw9IFNEUkFNX1JRRENfUlFGRF9NQVg7IHJxZmQrKykgeworCQltZnNkcmFtKFNEUkFNX1JRREMsIHJxZGNfcmVnKTsKKwkJcnFkY19yZWcgJj0gfihTRFJBTV9SUURDX1JRRkRfTUFTSyk7CisKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICogU2V0IHRoZSB0aW1pbmcgcmVnIGZvciB0aGUgdGVzdC4KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCW10c2RyYW0oU0RSQU1fUlFEQywgcnFkY19yZWcgfCBTRFJBTV9SUURDX1JRRkRfRU5DT0RFKHJxZmQpKTsKKworCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgKiBTZWUgaWYgdGhlIHJmZmQgdmFsdWUgcGFzc2VkLgorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJaWYgKHNob3J0X21lbV90ZXN0KCkpIHsKKwkJCWlmIChmYWlsX2ZvdW5kID09IFRSVUUpIHsKKwkJCQlwYXNzX2ZvdW5kID0gVFJVRTsKKwkJCQlpZiAoY3VycmVudF9wYXNzX2xlbmd0aCA9PSAwKQorCQkJCQljdXJyZW50X3N0YXJ0ID0gcnFmZDsKKworCQkJCWN1cnJlbnRfZmFpbF9sZW5ndGggPSAwOworCQkJCWN1cnJlbnRfcGFzc19sZW5ndGgrKzsKKworCQkJCWlmIChjdXJyZW50X3Bhc3NfbGVuZ3RoID4gbWF4X3Bhc3NfbGVuZ3RoKSB7CisJCQkJCW1heF9wYXNzX2xlbmd0aCA9IGN1cnJlbnRfcGFzc19sZW5ndGg7CisJCQkJCW1heF9zdGFydCA9IGN1cnJlbnRfc3RhcnQ7CisJCQkJCW1heF9lbmQgPSBycWZkOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnRfcGFzc19sZW5ndGggPSAwOworCQkJY3VycmVudF9mYWlsX2xlbmd0aCsrOworCisJCQlpZiAoZmFpbF9mb3VuZCA9PSBGQUxTRSkgeworCQkJCWZhaWxfZm91bmQgPSBUUlVFOworCQkJfSBlbHNlIGlmIChwYXNzX2ZvdW5kID09IFRSVUUpIHsKKwkJCQl3aW5kb3dfZm91bmQgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcnFmZF9hdmVyYWdlID0gKChtYXhfc3RhcnQgKyBtYXhfZW5kKSA+PiAxKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogTWFrZSBzdXJlIHdlIGZvdW5kIHRoZSB2YWxpZCByZWFkIHBhc3Npbmcgd2luZG93LiAgSGFsdCBpZiBub3QKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAod2luZG93X2ZvdW5kID09IEZBTFNFKSB7CisJCWlmIChycWZkX3N0YXJ0IDwgU0RSQU1fUlFEQ19SUUZEX01BWCkgeworCQkJcHV0YygnXGInKTsKKwkJCXB1dGMoc2xhc2hbbG9vcGkrKyAlIDhdKTsKKworCQkJLyogdHJ5IGFnYWluIGZyb20gd2l0aCBhIGRpZmZlcmVudCBSUUZEIHN0YXJ0IHZhbHVlICovCisJCQlycWZkX3N0YXJ0Kys7CisJCQlnb3RvIGNhbGlicmF0aW9uX2xvb3A7CisJCX0KKworCQlwcmludGYoIlxuRVJST1I6IENhbm5vdCBkZXRlcm1pbmUgYSBjb21tb24gcmVhZCBkZWxheSBmb3IgdGhlICIKKwkJICAgICAgICJESU1NKHMpIGluc3RhbGxlZC5cbiIpOworCQlkZWJ1ZygiJXNbJWRdIEVSUk9SIDogXG4iLCBfX0ZVTkNUSU9OX18sX19MSU5FX18pOworCQlwcGM0eHhfaWJtX2RkcjJfcmVnaXN0ZXJfZHVtcCgpOworCQlzcGRfZGRyX2luaXRfaGFuZyAoKTsKKwl9CisKKwlpZiAocnFmZF9hdmVyYWdlIDwgMCkKKwkJcnFmZF9hdmVyYWdlID0gMDsKKworCWlmIChycWZkX2F2ZXJhZ2UgPiBTRFJBTV9SUURDX1JRRkRfTUFYKQorCQlycWZkX2F2ZXJhZ2UgPSBTRFJBTV9SUURDX1JRRkRfTUFYOworCisJbXRzZHJhbShTRFJBTV9SUURDLAorCQkocnFkY19yZWcgJiB+U0RSQU1fUlFEQ19SUUZEX01BU0spIHwKKwkJU0RSQU1fUlFEQ19SUUZEX0VOQ09ERShycWZkX2F2ZXJhZ2UpKTsKKworCWJsYW5rX3N0cmluZyhzdHJsZW4oc3RyKSk7CisjZW5kaWYgLyogQ09ORklHX0REUl9SUURDX0ZJWEVEICovCisKKwkvKgorCSAqIE5vdyBjb21wbGV0ZSBSRFNTIGNvbmZpZ3VyYXRpb24gYXMgbWVudGlvbmVkIG9uIHBhZ2UgNyBvZiB0aGUgQU1DQworCSAqIFBvd2VyUEM0NDBTUC9TUGUgRERSMiBhcHBsaWNhdGlvbiBub3RlOgorCSAqICJERFIxL0REUjIgSW5pdGlhbGl6YXRpb24gU2VxdWVuY2UgYW5kIER5bmFtaWMgVHVuaW5nIgorCSAqLworCW1mc2RyYW0oU0RSQU1fUlRTUiwgdmFsKTsKKwlpZiAoKHZhbCAmIFNEUkFNX1JUU1JfVFJLMVNNX01BU0spID09IFNEUkFNX1JUU1JfVFJLMVNNX0FUUExTMSkgeworCQltZnNkcmFtKFNEUkFNX1JEQ0MsIHZhbCk7CisJCWlmICgodmFsICYgU0RSQU1fUkRDQ19SRFNTX01BU0spICE9IFNEUkFNX1JEQ0NfUkRTU19UNCkgeworCQkJdmFsICs9IDB4NDAwMDAwMDA7CisJCQltdHNkcmFtKFNEUkFNX1JEQ0MsIHZhbCk7CisJCX0KKwl9CisKKwltZnNkcmFtKFNEUkFNX0RMQ1IsIHZhbCk7CisJZGVidWcoIiVzWyVkXSBETENSOiAweCUwOGxYXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCB2YWwpOworCW1mc2RyYW0oU0RSQU1fUlFEQywgdmFsKTsKKwlkZWJ1ZygiJXNbJWRdIFJRREM6IDB4JTA4bFhcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHZhbCk7CisJbWZzZHJhbShTRFJBTV9SRkRDLCB2YWwpOworCWRlYnVnKCIlc1slZF0gUkZEQzogMHglMDhsWFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgdmFsKTsKKwltZnNkcmFtKFNEUkFNX1JEQ0MsIHZhbCk7CisJZGVidWcoIiVzWyVkXSBSRENDOiAweCUwOGxYXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCB2YWwpOworfQorI2Vsc2UgLyogY2FsaWJyYXRpb24gdGVzdCB3aXRoIGhhcmR2YWx1ZXMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBEUVNfY2FsaWJyYXRpb25fcHJvY2Vzcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgdGVzdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZGltbV9udW07CisJdW5zaWduZWQgbG9uZyBlY2NfdGVtcDsKKwl1bnNpZ25lZCBsb25nIGksIGo7CisJdW5zaWduZWQgbG9uZyAqbWVtYmFzZTsKKwl1bnNpZ25lZCBsb25nIGJ4Y2ZbTUFYUkFOS1NdOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWNoYXIgd2luZG93X2ZvdW5kOworCWNoYXIgYmVnaW5fZm91bmRbTUFYRElNTVNdOworCWNoYXIgZW5kX2ZvdW5kW01BWERJTU1TXTsKKwljaGFyIHNlYXJjaF9lbmRbTUFYRElNTVNdOworCXVuc2lnbmVkIGxvbmcgdGVzdFtOVU1NRU1URVNUU11bTlVNTUVNV09SRFNdID0geworCQl7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwKKwkJIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LAorCQl7MHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkJIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCQl7MHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwKKwkJIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTV9LAorCQl7MHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwKKwkJIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUF9LAorCQl7MHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwgMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwKKwkJIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUF9LAorCQl7MHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwKKwkJIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTV9LAorCQl7MHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwgMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwKKwkJIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUF9LAorCQl7MHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwgMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwKKwkJIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTV9IH07CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIFRlc3QgdG8gZGV0ZXJtaW5lIHRoZSBiZXN0IHJlYWQgY2xvY2sgZGVsYXkgdHVuaW5nIGJpdHMuCisJICoKKwkgKiBCZWZvcmUgdGhlIEREUiBjb250cm9sbGVyIGNhbiBiZSB1c2VkLCB0aGUgcmVhZCBjbG9jayBkZWxheSBuZWVkcyB0byBiZQorCSAqIHNldC4gIFRoaXMgaXMgU0RSQU1fUlFEQ1tSUUZEXSBhbmQgU0RSQU1fUkZEQ1tSRkZEXS4KKwkgKiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBoYXJkY29kZWQgaW50byB0aGUgcHJvZ3JhbSBiZWNhdXNlIGl0IGNoYW5nZXMKKwkgKiBkZXBlbmRpbmcgb24gdGhlIGJvYXJkJ3Mgc2V0dXAgYW5kIGVudmlyb25tZW50LgorCSAqIFRvIGRvIHRoaXMsIGFsbCBkZWxheSB2YWx1ZXMgYXJlIHRlc3RlZCB0byBzZWUgaWYgdGhleQorCSAqIHdvcmsgb3Igbm90LiAgQnkgZG9pbmcgdGhpcywgeW91IGdldCBncm91cHMgb2YgZmFpbHMgd2l0aCBncm91cHMgb2YKKwkgKiBwYXNzaW5nIHZhbHVlcy4gIFRoZSBpZGVhIGlzIHRvIGZpbmQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgYSBwYXNzaW5nCisJICogd2luZG93IGFuZCB0YWtlIHRoZSBjZW50ZXIgb2YgaXQgdG8gdXNlIGFzIHRoZSByZWFkIGNsb2NrIGRlbGF5LgorCSAqCisJICogQSBmYWlsdXJlIGhhcyB0byBiZSBzZWVuIGZpcnN0IHNvIHRoYXQgd2hlbiB3ZSBoaXQgYSBwYXNzLCB3ZSBrbm93CisJICogdGhhdCBpdCBpcyB0cnVlbHkgdGhlIHN0YXJ0IG9mIHRoZSB3aW5kb3cuICBJZiB3ZSBnZXQgcGFzc2luZyB2YWx1ZXMKKwkgKiB0byBzdGFydCBvZmYgd2l0aCwgd2UgZG9uJ3Qga25vdyBpZiB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB3aW5kb3cuCisJICoKKwkgKiBUaGUgY29kZSBhc3N1bWVzIHRoYXQgYSBmYWlsdXJlIHdpbGwgYWx3YXlzIGJlIGZvdW5kLgorCSAqIElmIGEgZmFpbHVyZSBpcyBub3QgZm91bmQsIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGdldCB0aGUgbWlkZGxlCisJICogb2YgdGhlIHBhc3Npbmcgd2luZG93LiAgSSBndWVzcyB3ZSBjYW4gcHJldHR5IG11Y2ggcGljayBhbnkgdmFsdWUKKwkgKiBidXQgc29tZSB2YWx1ZXMgd2lsbCBiZSBiZXR0ZXIgdGhhbiBvdGhlcnMuICBTaW5jZSB0aGUgbG93ZXN0IHNwZWVkCisJICogd2UgY2FuIGNsb2NrIHRoZSBERFIgaW50ZXJmYWNlIGF0IGlzIDIwMCBNSHogKDJ4IDEwMCBNSHogUExCIHNwZWVkKSwKKwkgKiBmcm9tIGV4cGVyaW1lbnRhdGlvbiBpdCBpcyBzYWZlIHRvIHNheSB5b3Ugd2lsbCBhbHdheXMgaGF2ZSBhIGZhaWx1cmUuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbWZzZHJhbShTRFJBTV9NQ09QVDEsIGVjY190ZW1wKTsKKwllY2NfdGVtcCAmPSBTRFJBTV9NQ09QVDFfTUNIS19NQVNLOworCW1mc2RyYW0oU0RSQU1fTUNPUFQxLCB2YWwpOworCW10c2RyYW0oU0RSQU1fTUNPUFQxLCAodmFsICYgflNEUkFNX01DT1BUMV9NQ0hLX01BU0spIHwKKwkJU0RSQU1fTUNPUFQxX01DSEtfTk9OKTsKKworCXdpbmRvd19mb3VuZCA9IEZBTFNFOworCWJlZ2luX2ZvdW5kWzBdID0gRkFMU0U7CisJZW5kX2ZvdW5kWzBdID0gRkFMU0U7CisJc2VhcmNoX2VuZFswXSA9IEZBTFNFOworCWJlZ2luX2ZvdW5kWzFdID0gRkFMU0U7CisJZW5kX2ZvdW5kWzFdID0gRkFMU0U7CisJc2VhcmNoX2VuZFsxXSA9IEZBTFNFOworCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgTUFYRElNTVM7IGRpbW1fbnVtKyspIHsKKwkJbWZzZHJhbShTRFJBTV9NQjBDRiArIChieGNyX251bSA8PCAyKSwgYnhjZltieGNyX251bV0pOworCisJCS8qIEJhbmtzIGVuYWJsZWQgKi8KKwkJaWYgKChieGNmW2RpbW1fbnVtXSAmIFNEUkFNX0JYQ0ZfTV9CRV9NQVNLKSA9PSBTRFJBTV9CWENGX01fQkVfRU5BQkxFKSB7CisKKwkJCS8qIEJhbmsgaXMgZW5hYmxlZCAqLworCQkJbWVtYmFzZSA9CisJCQkJKHVuc2lnbmVkIGxvbmcqKShTRFJBTV9SWEJBU19TREJBX0RFQ09ERShtZmRjcl9hbnkoU0RSQU1fUjBCQVMrZGltbV9udW0pKSk7CisKKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkgKiBSdW4gdGhlIHNob3J0IG1lbW9yeSB0ZXN0LgorCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCQlmb3IgKGkgPSAwOyBpIDwgTlVNTUVNVEVTVFM7IGkrKykgeworCQkJCWZvciAoaiA9IDA7IGogPCBOVU1NRU1XT1JEUzsgaisrKSB7CisJCQkJCW1lbWJhc2Vbal0gPSB0ZXN0W2ldW2pdOworCQkJCQlwcGNEY2JmKCh1MzIpJihtZW1iYXNlW2pdKSk7CisJCQkJfQorCQkJCXN5bmMoKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTlVNTUVNV09SRFM7IGorKykgeworCQkJCQlpZiAobWVtYmFzZVtqXSAhPSB0ZXN0W2ldW2pdKSB7CisJCQkJCQlwcGNEY2JmKCh1MzIpJihtZW1iYXNlW2pdKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlwcGNEY2JmKCh1MzIpJihtZW1iYXNlW2pdKSk7CisJCQkJfQorCQkJCXN5bmMoKTsKKwkJCQlpZiAoaiA8IE5VTU1FTVdPUkRTKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAqIFNlZSBpZiB0aGUgcmZmZCB2YWx1ZSBwYXNzZWQuCisJCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCWlmIChpIDwgTlVNTUVNVEVTVFMpIHsKKwkJCQlpZiAoKGVuZF9mb3VuZFtkaW1tX251bV0gPT0gRkFMU0UpICYmCisJCQkJICAgIChzZWFyY2hfZW5kW2RpbW1fbnVtXSA9PSBUUlVFKSkgeworCQkJCQllbmRfZm91bmRbZGltbV9udW1dID0gVFJVRTsKKwkJCQl9CisJCQkJaWYgKChlbmRfZm91bmRbMF0gPT0gVFJVRSkgJiYKKwkJCQkgICAgKGVuZF9mb3VuZFsxXSA9PSBUUlVFKSkKKwkJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWlmIChiZWdpbl9mb3VuZFtkaW1tX251bV0gPT0gRkFMU0UpIHsKKwkJCQkJYmVnaW5fZm91bmRbZGltbV9udW1dID0gVFJVRTsKKwkJCQkJc2VhcmNoX2VuZFtkaW1tX251bV0gPSBUUlVFOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJlZ2luX2ZvdW5kW2RpbW1fbnVtXSA9IFRSVUU7CisJCQllbmRfZm91bmRbZGltbV9udW1dID0gVFJVRTsKKwkJfQorCX0KKworCWlmICgoYmVnaW5fZm91bmRbMF0gPT0gVFJVRSkgJiYgKGJlZ2luX2ZvdW5kWzFdID09IFRSVUUpKQorCQl3aW5kb3dfZm91bmQgPSBUUlVFOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBNYWtlIHN1cmUgd2UgZm91bmQgdGhlIHZhbGlkIHJlYWQgcGFzc2luZyB3aW5kb3cuICBIYWx0IGlmIG5vdAorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWlmICh3aW5kb3dfZm91bmQgPT0gRkFMU0UpIHsKKwkJcHJpbnRmKCJFUlJPUjogQ2Fubm90IGRldGVybWluZSBhIGNvbW1vbiByZWFkIGRlbGF5IGZvciB0aGUgIgorCQkgICAgICAgIkRJTU0ocykgaW5zdGFsbGVkLlxuIik7CisJCXNwZF9kZHJfaW5pdF9oYW5nICgpOworCX0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogUmVzdG9yZSB0aGUgRUNDIHZhcmlhYmxlIHRvIHdoYXQgaXQgb3JpZ2luYWxseSB3YXMKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltdHNkcmFtKFNEUkFNX01DT1BUMSwKKwkJKHBwY01mZGNyX3NkcmFtKFNEUkFNX01DT1BUMSkgJiB+U0RSQU1fTUNPUFQxX01DSEtfTUFTSykKKwkJfCBlY2NfdGVtcCk7Cit9CisjZW5kaWYgLyogIUhBUkRfQ09ERURfRFFTICovCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfQVVUT0NBTElCUkFUSU9OKSAqLworCisjZWxzZSAvKiBDT05GSUdfU1BEX0VFUFJPTSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJaW5pdGRyYW0KKyAqIERlc2NyaXB0aW9uOiBDb25maWd1cmVzIHRoZSBQUEM0eHggSUJNIEREUjEvRERSMiBTRFJBTSBtZW1vcnkgY29udHJvbGxlci4KKyAqIAkJVGhlIGNvbmZpZ3VyYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIHN0YXRpYywgY29tcGlsZS0KKyAqCQl0aW1lIHBhcmFtZXRlcnMuCisgKiAJCUNvbmZpZ3VyZXMgdGhlIFBQQzQwNUVYKHIpIGFuZCBQUEM0NjBFWC9HVAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworcGh5c19zaXplX3QgaW5pdGRyYW0oaW50IGJvYXJkX3R5cGUpCit7CisJLyoKKwkgKiBPbmx5IHJ1biB0aGlzIFNEUkFNIGluaXQgY29kZSBvbmNlLiBGb3IgTkFORCBib290aW5nCisJICogdGFyZ2V0cyBsaWtlIEtpbGF1ZWEsIHdlIGNhbGwgaW5pdGRyYW0oKSBlYXJseSBmcm9tIHRoZQorCSAqIDRrIE5BTkQgYm9vdGluZyBpbWFnZSAoQ09ORklHX05BTkRfU1BMKSBmcm9tIG5hbmRfYm9vdCgpLgorCSAqIExhdGVyIG9uIHRoZSBOQU5EIFUtQm9vdCBpbWFnZSBydW5zIChDT05GSUdfTkFORF9VX0JPT1QpCisJICogd2hpY2ggY2FsbHMgaW5pdGRyYW0oKSBhZ2Fpbi4gVGhpcyB0aW1lIHRoZSBjb250cm9sbGVyCisJICogbXVzdG4ndCBiZSByZWNvbmZpZ3VyZWQgYWdhaW4gc2luY2Ugd2UncmUgYWxyZWFkeSBydW5uaW5nCisJICogZnJvbSBTRFJBTS4KKwkgKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfTkFORF9VX0JPT1QpIHx8IGRlZmluZWQoQ09ORklHX05BTkRfU1BMKQorCXVuc2lnbmVkIGxvbmcgdmFsOworCisjaWYgZGVmaW5lZChDT05GSUdfNDQwKQorCW10ZGNyKFNEUkFNX1IwQkFTLAlDT05GSUdfU1lTX1NEUkFNX1IwQkFTKTsKKwltdGRjcihTRFJBTV9SMUJBUywJQ09ORklHX1NZU19TRFJBTV9SMUJBUyk7CisJbXRkY3IoU0RSQU1fUjJCQVMsCUNPTkZJR19TWVNfU0RSQU1fUjJCQVMpOworCW10ZGNyKFNEUkFNX1IzQkFTLAlDT05GSUdfU1lTX1NEUkFNX1IzQkFTKTsKKwltdGRjcihTRFJBTV9QTEJBRERVTEwsCUNPTkZJR19TWVNfU0RSQU1fUExCQUREVUxMKTsJLyogTVEwX0JBVUwgKi8KKwltdGRjcihTRFJBTV9QTEJBRERVSEIsCUNPTkZJR19TWVNfU0RSQU1fUExCQUREVUhCKTsJLyogTVEwX0JBVUggKi8KKwltdGRjcihTRFJBTV9DT05GMUxMLAlDT05GSUdfU1lTX1NEUkFNX0NPTkYxTEwpOworCW10ZGNyKFNEUkFNX0NPTkYxSEIsCUNPTkZJR19TWVNfU0RSQU1fQ09ORjFIQik7CisJbXRkY3IoU0RSQU1fQ09ORlBBVEhCLAlDT05GSUdfU1lTX1NEUkFNX0NPTkZQQVRIQik7CisjZW5kaWYKKworCS8qIFNldCBNZW1vcnkgQmFuayBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworCisJbXRzZHJhbShTRFJBTV9NQjBDRiwgQ09ORklHX1NZU19TRFJBTTBfTUIwQ0YpOworCW10c2RyYW0oU0RSQU1fTUIxQ0YsIENPTkZJR19TWVNfU0RSQU0wX01CMUNGKTsKKwltdHNkcmFtKFNEUkFNX01CMkNGLCBDT05GSUdfU1lTX1NEUkFNMF9NQjJDRik7CisJbXRzZHJhbShTRFJBTV9NQjNDRiwgQ09ORklHX1NZU19TRFJBTTBfTUIzQ0YpOworCisJLyogU2V0IE1lbW9yeSBDbG9jayBUaW1pbmcgUmVnaXN0ZXIgKi8KKworCW10c2RyYW0oU0RSQU1fQ0xLVFIsIENPTkZJR19TWVNfU0RSQU0wX0NMS1RSKTsKKworCS8qIFNldCBSZWZyZXNoIFRpbWUgUmVnaXN0ZXIgKi8KKworCW10c2RyYW0oU0RSQU1fUlRSLCBDT05GSUdfU1lTX1NEUkFNMF9SVFIpOworCisJLyogU2V0IFNEUkFNIFRpbWluZyBSZWdpc3RlcnMgKi8KKworCW10c2RyYW0oU0RSQU1fU0RUUjEsIENPTkZJR19TWVNfU0RSQU0wX1NEVFIxKTsKKwltdHNkcmFtKFNEUkFNX1NEVFIyLCBDT05GSUdfU1lTX1NEUkFNMF9TRFRSMik7CisJbXRzZHJhbShTRFJBTV9TRFRSMywgQ09ORklHX1NZU19TRFJBTTBfU0RUUjMpOworCisJLyogU2V0IE1vZGUgYW5kIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXJzICovCisKKwltdHNkcmFtKFNEUkFNX01NT0RFLCBDT05GSUdfU1lTX1NEUkFNMF9NTU9ERSk7CisJbXRzZHJhbShTRFJBTV9NRU1PREUsIENPTkZJR19TWVNfU0RSQU0wX01FTU9ERSk7CisKKwkvKiBTZXQgTWVtb3J5IENvbnRyb2xsZXIgT3B0aW9ucyAxIFJlZ2lzdGVyICovCisKKwltdHNkcmFtKFNEUkFNX01DT1BUMSwgQ09ORklHX1NZU19TRFJBTTBfTUNPUFQxKTsKKworCS8qIFNldCBNYW51YWwgSW5pdGlhbGl6YXRpb24gQ29udHJvbCBSZWdpc3RlcnMgKi8KKworCW10c2RyYW0oU0RSQU1fSU5JVFBMUjAsIENPTkZJR19TWVNfU0RSQU0wX0lOSVRQTFIwKTsKKwltdHNkcmFtKFNEUkFNX0lOSVRQTFIxLCBDT05GSUdfU1lTX1NEUkFNMF9JTklUUExSMSk7CisJbXRzZHJhbShTRFJBTV9JTklUUExSMiwgQ09ORklHX1NZU19TRFJBTTBfSU5JVFBMUjIpOworCW10c2RyYW0oU0RSQU1fSU5JVFBMUjMsIENPTkZJR19TWVNfU0RSQU0wX0lOSVRQTFIzKTsKKwltdHNkcmFtKFNEUkFNX0lOSVRQTFI0LCBDT05GSUdfU1lTX1NEUkFNMF9JTklUUExSNCk7CisJbXRzZHJhbShTRFJBTV9JTklUUExSNSwgQ09ORklHX1NZU19TRFJBTTBfSU5JVFBMUjUpOworCW10c2RyYW0oU0RSQU1fSU5JVFBMUjYsIENPTkZJR19TWVNfU0RSQU0wX0lOSVRQTFI2KTsKKwltdHNkcmFtKFNEUkFNX0lOSVRQTFI3LCBDT05GSUdfU1lTX1NEUkFNMF9JTklUUExSNyk7CisJbXRzZHJhbShTRFJBTV9JTklUUExSOCwgQ09ORklHX1NZU19TRFJBTTBfSU5JVFBMUjgpOworCW10c2RyYW0oU0RSQU1fSU5JVFBMUjksIENPTkZJR19TWVNfU0RSQU0wX0lOSVRQTFI5KTsKKwltdHNkcmFtKFNEUkFNX0lOSVRQTFIxMCwgQ09ORklHX1NZU19TRFJBTTBfSU5JVFBMUjEwKTsKKwltdHNkcmFtKFNEUkFNX0lOSVRQTFIxMSwgQ09ORklHX1NZU19TRFJBTTBfSU5JVFBMUjExKTsKKwltdHNkcmFtKFNEUkFNX0lOSVRQTFIxMiwgQ09ORklHX1NZU19TRFJBTTBfSU5JVFBMUjEyKTsKKwltdHNkcmFtKFNEUkFNX0lOSVRQTFIxMywgQ09ORklHX1NZU19TRFJBTTBfSU5JVFBMUjEzKTsKKwltdHNkcmFtKFNEUkFNX0lOSVRQTFIxNCwgQ09ORklHX1NZU19TRFJBTTBfSU5JVFBMUjE0KTsKKwltdHNkcmFtKFNEUkFNX0lOSVRQTFIxNSwgQ09ORklHX1NZU19TRFJBTTBfSU5JVFBMUjE1KTsKKworCS8qIFNldCBPbi1EaWUgVGVybWluYXRpb24gUmVnaXN0ZXJzICovCisKKwltdHNkcmFtKFNEUkFNX0NPRFQsIENPTkZJR19TWVNfU0RSQU0wX0NPRFQpOworCW10c2RyYW0oU0RSQU1fTU9EVDAsIENPTkZJR19TWVNfU0RSQU0wX01PRFQwKTsKKwltdHNkcmFtKFNEUkFNX01PRFQxLCBDT05GSUdfU1lTX1NEUkFNMF9NT0RUMSk7CisKKwkvKiBTZXQgV3JpdGUgVGltaW5nIFJlZ2lzdGVyICovCisKKwltdHNkcmFtKFNEUkFNX1dSRFRSLCBDT05GSUdfU1lTX1NEUkFNMF9XUkRUUik7CisKKwkvKgorCSAqIFN0YXJ0IEluaXRpYWxpemF0aW9uIGJ5IFNEUkFNMF9NQ09QVDJbU1JFTl0gPSAwIGFuZAorCSAqIFNEUkFNMF9NQ09QVDJbSVBUUl0gPSAxCisJICovCisKKwltdHNkcmFtKFNEUkFNX01DT1BUMiwgKFNEUkFNX01DT1BUMl9TUkVOX0VYSVQgfAorCQkJICAgICAgIFNEUkFNX01DT1BUMl9JUFRSX0VYRUNVVEUpKTsKKworCS8qCisJICogUG9sbCBTRFJBTTBfTUNTVEFUW01JQ10gZm9yIGFzc2VydGlvbiB0byBpbmRpY2F0ZSB0aGUKKwkgKiBjb21wbGV0aW9uIG9mIGluaXRpYWxpemF0aW9uLgorCSAqLworCisJZG8geworCQltZnNkcmFtKFNEUkFNX01DU1RBVCwgdmFsKTsKKwl9IHdoaWxlICgodmFsICYgU0RSQU1fTUNTVEFUX01JQ19NQVNLKSAhPSBTRFJBTV9NQ1NUQVRfTUlDX0NPTVApOworCisJLyogU2V0IERlbGF5IENvbnRyb2wgUmVnaXN0ZXJzICovCisKKwltdHNkcmFtKFNEUkFNX0RMQ1IsIENPTkZJR19TWVNfU0RSQU0wX0RMQ1IpOworCisjaWYgIWRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfQVVUT0NBTElCUkFUSU9OKQorCW10c2RyYW0oU0RSQU1fUkRDQywgQ09ORklHX1NZU19TRFJBTTBfUkRDQyk7CisJbXRzZHJhbShTRFJBTV9SUURDLCBDT05GSUdfU1lTX1NEUkFNMF9SUURDKTsKKwltdHNkcmFtKFNEUkFNX1JGREMsIENPTkZJR19TWVNfU0RSQU0wX1JGREMpOworI2VuZGlmIC8qICFDT05GSUdfUFBDNHh4X0REUl9BVVRPQ0FMSUJSQVRJT04gKi8KKworCS8qCisJICogRW5hYmxlIENvbnRyb2xsZXIgYnkgU0RSQU0wX01DT1BUMltEQ0VOXSA9IDE6CisJICovCisKKwltZnNkcmFtKFNEUkFNX01DT1BUMiwgdmFsKTsKKwltdHNkcmFtKFNEUkFNX01DT1BUMiwgdmFsIHwgU0RSQU1fTUNPUFQyX0RDRU5fRU5BQkxFKTsKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKwkvKgorCSAqIFByb2dyYW0gVExCIGVudHJpZXMgd2l0aCBjYWNoZXMgZW5hYmxlZCwgZm9yIGJlc3QgcGVyZm9ybWFjZQorCSAqIHdoaWxlIGF1dG8tY2FsaWJyYXRpbmcgYW5kIEVDQyBnZW5lcmF0aW9uCisJICovCisJcHJvZ3JhbV90bGIoMCwgMCwgKENPTkZJR19TWVNfTUJZVEVTX1NEUkFNIDw8IDIwKSwgMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfQVVUT0NBTElCUkFUSU9OKQorI2lmICFkZWZpbmVkKENPTkZJR19OQU5EX1VfQk9PVCkgJiYgIWRlZmluZWQoQ09ORklHX05BTkRfU1BMKQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJIHwgRFFTIGNhbGlicmF0aW9uLgorCSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURRU19hdXRvY2FsaWJyYXRpb24oKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfTkFORF9VX0JPT1QpICYmICFkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkgKi8KKyNlbmRpZiAvKiBDT05GSUdfUFBDNHh4X0REUl9BVVRPQ0FMSUJSQVRJT04gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpCisJZG9fcHJvZ3JhbV9lY2MoMCk7CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRERSX0VDQykgKi8KKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKwkvKgorCSAqIE5vdyBhZnRlciBpbml0aWFsaXphdGlvbiAoYXV0by1jYWxpYnJhdGlvbiBhbmQgRUNDIGdlbmVyYXRpb24pCisJICogcmVtb3ZlIHRoZSBUTEIgZW50cmllcyB3aXRoIGNhY2hlcyBlbmFibGVkIGFuZCBwcm9ncmFtIGFnYWluIHdpdGgKKwkgKiBkZXNpcmVkIGNhY2hlIGZ1bmN0aW9uYWxpdHkKKwkgKi8KKwlyZW1vdmVfdGxiKDAsIChDT05GSUdfU1lTX01CWVRFU19TRFJBTSA8PCAyMCkpOworCXByb2dyYW1fdGxiKDAsIDAsIChDT05GSUdfU1lTX01CWVRFU19TRFJBTSA8PCAyMCksIE1ZX1RMQl9XT1JEMl9JX0VOQUJMRSk7CisjZW5kaWYKKworCXBwYzR4eF9pYm1fZGRyMl9yZWdpc3Rlcl9kdW1wKCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUEM0eHhfRERSX0FVVE9DQUxJQlJBVElPTikKKwkvKgorCSAqIENsZWFyIHBvdGVudGlhbCBlcnJvcnMgcmVzdWx0aW5nIGZyb20gYXV0by1jYWxpYnJhdGlvbi4KKwkgKiBJZiBub3QgZG9uZSwgdGhlbiB3ZSBjb3VsZCBnZXQgYW4gaW50ZXJydXB0IGxhdGVyIG9uIHdoZW4KKwkgKiBleGNlcHRpb25zIGFyZSBlbmFibGVkLgorCSAqLworCXNldF9tY3NyKGdldF9tY3NyKCkpOworI2VuZGlmIC8qIENPTkZJR19QUEM0eHhfRERSX0FVVE9DQUxJQlJBVElPTiAqLworCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX05BTkRfVV9CT09UKSB8fCBkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkgKi8KKworCXJldHVybiAoQ09ORklHX1NZU19NQllURVNfU0RSQU0gPDwgMjApOworfQorI2VuZGlmIC8qIENPTkZJR19TUERfRUVQUk9NICovCisKKyNpZiAhZGVmaW5lZChDT05GSUdfTkFORF9VX0JPT1QpICYmICFkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCit1MzIgbWZkY3JfYW55KHUzMiBkY3IpCit7CisJdTMyIHZhbDsKKworCXN3aXRjaCAoZGNyKSB7CisJY2FzZSBTRFJBTV9SMEJBUyArIDA6CisJCXZhbCA9IG1mZGNyKFNEUkFNX1IwQkFTICsgMCk7CisJCWJyZWFrOworCWNhc2UgU0RSQU1fUjBCQVMgKyAxOgorCQl2YWwgPSBtZmRjcihTRFJBTV9SMEJBUyArIDEpOworCQlicmVhazsKKwljYXNlIFNEUkFNX1IwQkFTICsgMjoKKwkJdmFsID0gbWZkY3IoU0RSQU1fUjBCQVMgKyAyKTsKKwkJYnJlYWs7CisJY2FzZSBTRFJBTV9SMEJBUyArIDM6CisJCXZhbCA9IG1mZGNyKFNEUkFNX1IwQkFTICsgMyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiRENSICVkIG5vdCBkZWZpbmVkIGluIGNhc2Ugc3RhdGVtZW50ISEhXG4iLCBkY3IpOworCQl2YWwgPSAwOyAvKiBqdXN0IHRvIHNhdGlzZnkgdGhlIGNvbXBpbGVyICovCisJfQorCisJcmV0dXJuIHZhbDsKK30KKwordm9pZCBtdGRjcl9hbnkodTMyIGRjciwgdTMyIHZhbCkKK3sKKwlzd2l0Y2ggKGRjcikgeworCWNhc2UgU0RSQU1fUjBCQVMgKyAwOgorCQltdGRjcihTRFJBTV9SMEJBUyArIDAsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgU0RSQU1fUjBCQVMgKyAxOgorCQltdGRjcihTRFJBTV9SMEJBUyArIDEsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgU0RSQU1fUjBCQVMgKyAyOgorCQltdGRjcihTRFJBTV9SMEJBUyArIDIsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgU0RSQU1fUjBCQVMgKyAzOgorCQltdGRjcihTRFJBTV9SMEJBUyArIDMsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiRENSICVkIG5vdCBkZWZpbmVkIGluIGNhc2Ugc3RhdGVtZW50ISEhXG4iLCBkY3IpOworCX0KK30KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR180NDApICovCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX05BTkRfVV9CT09UKSAmJiAgIWRlZmluZWQoQ09ORklHX05BTkRfU1BMKSAqLworCitpbmxpbmUgdm9pZCBwcGM0eHhfaWJtX2RkcjJfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworI2lmIGRlZmluZWQoREVCVUcpCisJcHJpbnRmKCJcblBQQzR4eCBJQk0gRERSMiBSZWdpc3RlciBEdW1wOlxuIik7CisKKyNpZiAoZGVmaW5lZChDT05GSUdfNDQwU1ApIHx8IGRlZmluZWQoQ09ORklHXzQ0MFNQRSkgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpKQorCVBQQzR4eF9JQk1fRERSMl9EVU1QX01RX1JFR0lTVEVSKFIwQkFTKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9NUV9SRUdJU1RFUihSMUJBUyk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfTVFfUkVHSVNURVIoUjJCQVMpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX01RX1JFR0lTVEVSKFIzQkFTKTsKKyNlbmRpZiAvKiAoZGVmaW5lZChDT05GSUdfNDQwU1ApIHx8IC4uLiAqLworI2lmIGRlZmluZWQoQ09ORklHXzQwNUVYKQorCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKEJFU1IpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKEJFQVJMKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihCRUFSSCk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoV01JUlEpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKFBMQk9QVCk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoUFVBQkEpOworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHXzQwNUVYKSAqLworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKE1CMENGKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihNQjFDRik7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoTUIyQ0YpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKE1CM0NGKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihNQ1NUQVQpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKE1DT1BUMSk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoTUNPUFQyKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihNT0RUMCk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoTU9EVDEpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKE1PRFQyKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihNT0RUMyk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoQ09EVCk7CisjaWYgKGRlZmluZWQoQ09ORklHXzQ0MFNQKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUEUpIHx8CVwKKyAgICAgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKSkKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihWVlBSKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihPUEFSUyk7CisJLyoKKwkgKiBPUEFSVCBpcyBvbmx5IHVzZWQgYXMgYSB0cmlnZ2VyIHJlZ2lzdGVyLgorCSAqCisJICogTm8gZGF0YSBpcyBjb250YWluZWQgaW4gdGhpcyByZWdpc3RlciwgYW5kIHJlYWRpbmcgb3Igd3JpdGluZworCSAqIHRvIGlzIGNhbiBjYXVzZSBiYWQgdGhpbmdzIHRvIGhhcHBlbiAoaGFuZ3MpLiBKdXN0IHNraXAgaXQgYW5kCisJICogcmVwb3J0ICJOL0EiLgorCSAqLworCXByaW50ZigiJTIwcyA9IE4vQVxuIiwgIlNEUkFNX09QQVJUIik7CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfNDQwU1ApIHx8IC4uLiAqLworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKFJUUik7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoSU5JVFBMUjApOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKElOSVRQTFIxKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihJTklUUExSMik7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoSU5JVFBMUjMpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKElOSVRQTFI0KTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihJTklUUExSNSk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoSU5JVFBMUjYpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKElOSVRQTFI3KTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihJTklUUExSOCk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoSU5JVFBMUjkpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKElOSVRQTFIxMCk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoSU5JVFBMUjExKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihJTklUUExSMTIpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKElOSVRQTFIxMyk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoSU5JVFBMUjE0KTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihJTklUUExSMTUpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKFJRREMpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKFJGREMpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKFJEQ0MpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKERMQ1IpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKENMS1RSKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihXUkRUUik7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoU0RUUjEpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKFNEVFIyKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihTRFRSMyk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoTU1PREUpOworCVBQQzR4eF9JQk1fRERSMl9EVU1QX1JFR0lTVEVSKE1FTU9ERSk7CisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoRUNDRVMpOworI2lmIChkZWZpbmVkKENPTkZJR180NDBTUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHXzQ2MEVYKSB8fCBkZWZpbmVkKENPTkZJR180NjBHVCkpCisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoQ0lEKTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR180NDBTUCkgfHwgLi4uICovCisJUFBDNHh4X0lCTV9ERFIyX0RVTVBfUkVHSVNURVIoUklEKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihGQ1NSKTsKKwlQUEM0eHhfSUJNX0REUjJfRFVNUF9SRUdJU1RFUihSVFNSKTsKKyNlbmRpZiAvKiBkZWZpbmVkKERFQlVHKSAqLworfQorCisjZW5kaWYgLyogQ09ORklHX1NEUkFNX1BQQzR4eF9JQk1fRERSMiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvNHh4X2libV9kZHIyX2F1dG9jYWxpYi5jIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvNHh4X2libV9kZHIyX2F1dG9jYWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZDBlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80eHhfaWJtX2RkcjJfYXV0b2NhbGliLmMKQEAgLTAsMCArMSwxMjUxIEBACisvKgorICogYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvNHh4X2libV9kZHIyX2F1dG9jYWxpYi5jCisgKiBUaGlzIFNQRCBTRFJBTSBkZXRlY3Rpb24gY29kZSBzdXBwb3J0cyBBTUNDIFBQQzQ0eCBjcHUncyB3aXRoIGEKKyAqIEREUjIgY29udHJvbGxlciAobm9uIERlbmFsaSBDb3JlKS4gVGhvc2UgY3VycmVudGx5IGFyZToKKyAqCisgKiA0MDU6CQk0MDVFWAorICogNDQwLzQ2MDoJNDQwU1AvNDQwU1BlLzQ2MEVYLzQ2MEdULzQ2MFNYCisgKgorICogKEMpIENvcHlyaWdodCAyMDA4IEFwcGxpZWQgTWljcm8gQ2lyY3VpdHMgQ29ycG9yYXRpb24KKyAqIEFkYW0gR3JhaGFtICA8YWdyYWhhbUBhbWNjLmNvbT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDctMjAwOAorICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIENPUFlSSUdIVCAgIEFNQ0MgICBDT1JQT1JBVElPTiAyMDA0CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qIGRlZmluZSBERUJVRyBmb3IgZGVidWdnaW5nIG91dHB1dCAob2J2aW91c2x5IDstKSkgKi8KKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjaW5jbHVkZSAiZWNjLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19QUEM0eHhfRERSX0FVVE9DQUxJQlJBVElPTikKKworLyoKKyAqIE9ubHkgY29tcGlsZSB0aGUgRERSIGF1dG8tY2FsaWJyYXRpb24gY29kZSBmb3IgTk9SIGJvb3QgYW5kCisgKiBub3QgZm9yIE5BTkQgYm9vdCAoTkFORCBTUEwgYW5kIE5BTkQgVS1Cb290IC0gTlVCKQorICovCisjaWYgIWRlZmluZWQoQ09ORklHX05BTkRfVV9CT09UKSAmJiAhZGVmaW5lZChDT05GSUdfTkFORF9TUEwpCisKKyNkZWZpbmUgTUFYQlhDRgkJCTQKKyNkZWZpbmUgU0RSQU1fUlhCQVNfU0hJRlRfMU0JMjAKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19ERUNSRU1FTlRfUEFUVEVSTlMpCisjZGVmaW5lIE5VTU1FTVRFU1RTCQkyNAorI2Vsc2UKKyNkZWZpbmUgTlVNTUVNVEVTVFMJCTgKKyNlbmRpZiAvKiBDT05GSUdfU1lTX0RFQ1JFTUVOVF9QQVRURVJOUyAqLworI2RlZmluZSBOVU1MT09QUwkJMQkvKiBjb25maWd1cmUgYXMgeW91IGRlZW0gYXBwcm9wb3JpYXRlICovCisjZGVmaW5lIE5VTU1FTVdPUkRTCQkxNgorCisjZGVmaW5lIFNEUkFNX1JEQ0NfUkRTU19WQUwobikJU0RSQU1fUkRDQ19SRFNTX0RFQ09ERShkZHJfcmRzc19vcHQobikpCisKKy8qIFByaXZhdGUgU3RydWN0dXJlIERlZmluaXRpb25zICovCisKK3N0cnVjdCBhdXRvY2FsX3JlZ3MgeworCXUzMiByZmZkOworCXUzMiBycWZkOworfTsKKworc3RydWN0IGRkcmF1dG9jYWwgeworCXUzMiByZmZkOworCXUzMiByZmZkX21pbjsKKwl1MzIgcmZmZF9tYXg7CisJdTMyIHJmZmRfc2l6ZTsKKwl1MzIgcnFmZDsKKwl1MzIgcnFmZF9zaXplOworCXUzMiByZGNjOworCXUzMiBmbGFnczsKK307CisKK3N0cnVjdCBzZHJhbV90aW1pbmcgeworCXUzMiB3cmR0cjsKKwl1MzIgY2xrdHI7Cit9OworCitzdHJ1Y3Qgc2RyYW1fdGltaW5nX2Nsa3MgeworCXUzMiB3cmR0cjsKKwl1MzIgY2xrdHI7CisJdTMyIHJkY2M7CisJdTMyIGZsYWdzOworfTsKKworc3RydWN0IGF1dG9jYWxfY2xrcyB7CisJc3RydWN0IHNkcmFtX3RpbWluZ19jbGtzIGNsb2NrczsKKwlzdHJ1Y3QgZGRyYXV0b2NhbAkgYXV0b2NhbDsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBQcm90b3R5cGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKENPTkZJR19QUEM0eHhfRERSX01FVEhPRF9BKQorc3RhdGljIHUzMiBEUVNfY2FsaWJyYXRpb25fbWV0aG9kQShzdHJ1Y3QgZGRyYXV0b2NhbCAqKTsKK3N0YXRpYyB1MzIgcHJvZ3JhbV9EUVNfY2FsaWJyYXRpb25fbWV0aG9kQShzdHJ1Y3QgZGRyYXV0b2NhbCAqKTsKKyNlbHNlCitzdGF0aWMgdTMyIERRU19jYWxpYnJhdGlvbl9tZXRob2RCKHN0cnVjdCBkZHJhdXRvY2FsICopOworc3RhdGljIHUzMiBwcm9ncmFtX0RRU19jYWxpYnJhdGlvbl9tZXRob2RCKHN0cnVjdCBkZHJhdXRvY2FsICopOworI2VuZGlmCitzdGF0aWMgaW50IHNob3J0X21lbV90ZXN0KHUzMiAqKTsKKworLyoKKyAqIFRvIHByb3ZpZGUgYW4gaW50ZXJmYWNlIGZvciBib2FyZCBzcGVjaWZpYyBjb25maWcgdmFsdWVzIGluIHRoaXMgY29tbW9uCisgKiBERFIgc2V0dXAgY29kZSwgd2UgaW1wbGVtZW50IGhlICJ3ZWFrIiBkZWZhdWx0IGZ1bmN0aW9ucyBoZXJlLiBUaGV5IHJldHVybgorICogdGhlIGRlZmF1bHQgdmFsdWUgYmFjayB0byB0aGUgY2FsbGVyLgorICoKKyAqIFBsZWFzZSBzZWUgaW5jbHVkZS9jb25maWdzL3l1Y2NhLmggZm9yIGFuIGV4YW1wbGUgZm9yYSBib2FyZCBzcGVjaWZpYworICogaW1wbGVtZW50YXRpb24uCisgKi8KKworI2lmICFkZWZpbmVkKENPTkZJR19TUERfRUVQUk9NKQordTMyIF9fZGRyX3dyZHRyKHUzMiBkZWZhdWx0X3ZhbCkKK3sKKwlyZXR1cm4gZGVmYXVsdF92YWw7Cit9Cit1MzIgZGRyX3dyZHRyKHUzMikgX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fZGRyX3dyZHRyIikpKTsKKwordTMyIF9fZGRyX2Nsa3RyKHUzMiBkZWZhdWx0X3ZhbCkKK3sKKwlyZXR1cm4gZGVmYXVsdF92YWw7Cit9Cit1MzIgZGRyX2Nsa3RyKHUzMikgX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fZGRyX2Nsa3RyIikpKTsKKworLyoKKyAqIEJvYXJkLXNwZWNpZmljIFBsYXRmb3JtIGNvZGUgY2FuIHJlaW1wbGVtZW50IHNwZF9kZHJfaW5pdF9oYW5nICgpIGlmIG5lZWRlZAorICovCit2b2lkIF9fc3BkX2Rkcl9pbml0X2hhbmcodm9pZCkKK3sKKwloYW5nKCk7Cit9Cit2b2lkCitzcGRfZGRyX2luaXRfaGFuZyh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19zcGRfZGRyX2luaXRfaGFuZyIpKSk7CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkgKi8KKwordWxvbmcgX19kZHJfc2Nhbl9vcHRpb24odWxvbmcgZGVmYXVsdF92YWwpCit7CisJcmV0dXJuIGRlZmF1bHRfdmFsOworfQordWxvbmcgZGRyX3NjYW5fb3B0aW9uKHVsb25nKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19kZHJfc2Nhbl9vcHRpb24iKSkpOworCit1MzIgX19kZHJfcmRzc19vcHQodTMyIGRlZmF1bHRfdmFsKQoreworCXJldHVybiBkZWZhdWx0X3ZhbDsKK30KK3UzMiBkZHJfcmRzc19vcHQodWxvbmcpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2Rkcl9yZHNzX29wdCIpKSk7CisKKworc3RhdGljIHUzMiAqZ2V0X21lbWJhc2UoaW50IGJ4Y3JfbnVtKQoreworCXVsb25nIGJ4Y2Y7CisJdTMyICptZW1iYXNlOworCisjaWYgZGVmaW5lZChTRFJBTV9SMEJBUykKKwkvKiBCQVMgZnJvbSBNZW1vcnkgUXVldWUgcmFuayByZWcuICovCisJbWVtYmFzZSA9CisJICAgICh1MzIgKikoU0RSQU1fUlhCQVNfU0RCQV9ERUNPREUobWZkY3JfYW55KFNEUkFNX1IwQkFTK2J4Y3JfbnVtKSkpOworCWJ4Y2YgPSAwOwkvKiBqdXN0IHRvIHNhdGlzZnkgdGhlIGNvbXBpbGVyICovCisjZWxzZQorCS8qIEJBUyBmcm9tIFNEUkFNX01CeENGIG1lbSByYW5rIHJlZy4gKi8KKwltZnNkcmFtKFNEUkFNX01CMENGICsgKGJ4Y3JfbnVtPDwyKSwgYnhjZik7CisJbWVtYmFzZSA9ICh1MzIgKikoKGJ4Y2YgJiAweGZmZjgwMDAwKSA8PCAzKTsKKyNlbmRpZgorCisJcmV0dXJuIG1lbWJhc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlY2NfY2xlYXJfc3RhdHVzX3JlZyh2b2lkKQoreworCW10c2RyYW0oU0RSQU1fRUNDRVMsIDB4ZmZmZmZmZmYpOworI2lmIGRlZmluZWQoU0RSQU1fUjBCQVMpCisJbXRkY3IoU0RSQU1fRVJSU1RBVExMLCAweGZmZmZmZmZmKTsKKyNlbmRpZgorfQorCisvKgorICogUmVzZXQgYW5kIHJlbG9jayBtZW1vcnkgRExMIGFmdGVyIFNEUkFNX0NMS1RSIGNoYW5nZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVsb2NrX21lbW9yeV9ETEwodm9pZCkKK3sKKwl1MzIgcmVnOworCisJbXRzZHJhbShTRFJBTV9NQ09QVDIsIFNEUkFNX01DT1BUMl9JUFRSX0VYRUNVVEUpOworCisJZG8geworCQltZnNkcmFtKFNEUkFNX01DU1RBVCwgcmVnKTsKKwl9IHdoaWxlICghKHJlZyAmIFNEUkFNX01DU1RBVF9NSUNfQ09NUCkpOworCisJbWZzZHJhbShTRFJBTV9NQ09QVDIsIHJlZyk7CisJbXRzZHJhbShTRFJBTV9NQ09QVDIsIHJlZyB8IFNEUkFNX01DT1BUMl9EQ0VOX0VOQUJMRSk7Cit9CisKK3N0YXRpYyBpbnQgZWNjX2NoZWNrX3N0YXR1c19yZWcodm9pZCkKK3sKKwl1MzIgZWNjX3N0YXR1czsKKworCS8qCisJICogQ29tcGFyZSBzdWNlZWRlZCwgbm93IGNoZWNrCisJICogaWYgZ290IGVjYyBlcnJvci4gSWYgZ290IGFuCisJICogZWNjIGVycm9yLCB0aGVuIGRvbid0IGNvdW50CisJICogdGhpcyBhcyBhIHBhc3NpbmcgdmFsdWUKKwkgKi8KKwltZnNkcmFtKFNEUkFNX0VDQ0VTLCBlY2Nfc3RhdHVzKTsKKwlpZiAoZWNjX3N0YXR1cyAhPSAweDAwMDAwMDAwKSB7CisJCS8qIGNsZWFyIG9uIGVycm9yICovCisJCWVjY19jbGVhcl9zdGF0dXNfcmVnKCk7CisJCS8qIGVjYyBjaGVjayBmYWlsdXJlICovCisJCXJldHVybiAwOworCX0KKwllY2NfY2xlYXJfc3RhdHVzX3JlZygpOworCXN5bmMoKTsKKworCXJldHVybiAxOworfQorCisvKiByZXR1cm4gMSBpZiBwYXNzZXMsIDAgaWYgZmFpbCAqLworc3RhdGljIGludCBzaG9ydF9tZW1fdGVzdCh1MzIgKmJhc2VfYWRkcmVzcykKK3sKKwlpbnQgaSwgaiwgbDsKKwl1MzIgZWNjX21vZGUgPSAwOworCisJdWxvbmcgdGVzdFtOVU1NRU1URVNUU11bTlVNTUVNV09SRFNdID0geworCS8qIDAgKi8JezB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCisJCSAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorCQkgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwKKwkJIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkZ9LAorCS8qIDEgKi8JezB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJCSAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCQkgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkJIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCS8qIDIgKi8JezB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsCisJCSAweEFBQUFBQUFBLCAweEFBQUFBQUFBLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LAorCQkgMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwKKwkJIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTV9LAorCS8qIDMgKi8JezB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsCisJCSAweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweEFBQUFBQUFBLCAweEFBQUFBQUFBLAorCQkgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwKKwkJIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUF9LAorCS8qIDQgKi8JezB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsCisJCSAweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAorCQkgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwgMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwKKwkJIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUF9LAorCS8qIDUgKi8JezB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsCisJCSAweDVBNUE1QTVBLCAweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweEE1QTVBNUE1LAorCQkgMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwKKwkJIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTV9LAorCS8qIDYgKi8JezB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsCisJCSAweEFBNTVBQTU1LCAweEFBNTVBQTU1LCAweDU1QUE1NUFBLCAweDU1QUE1NUFBLAorCQkgMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwgMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwKKwkJIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUF9LAorCS8qIDcgKi8JezB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsCisJCSAweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1LAorCQkgMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwgMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwKKwkJIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTV9LAorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0RFQ1JFTUVOVF9QQVRURVJOUykKKwkvKiA4ICovCXsweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwKKwkJIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsCisJCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmfSwKKwkvKiA5ICovCXsweGZmZmVmZmZlLCAweGZmZmVmZmZlLCAweGZmZmVmZmZlLCAweGZmZmVmZmZlLAorCQkgMHhmZmZlZmZmZSwgMHhmZmZlZmZmZSwgMHhmZmZlZmZmZSwgMHhmZmZlZmZmZSwKKwkJIDB4ZmZmZWZmZmUsIDB4ZmZmZWZmZmUsIDB4ZmZmZWZmZmUsIDB4ZmZmZWZmZmUsCisJCSAweGZmZmVmZmZlLCAweGZmZmVmZmZlLCAweGZmZmVmZmZlLCAweGZmZmVmZmZlfSwKKwkvKiAxMCAqL3sweGZmZmRmZmZkLCAweGZmZmRmZmZkLCAweGZmZmRmZmZmLCAweGZmZmRmZmZkLAorCQkgMHhmZmZkZmZmZCwgMHhmZmZkZmZmZCwgMHhmZmZkZmZmZiwgMHhmZmZkZmZmZCwKKwkJIDB4ZmZmZGZmZmQsIDB4ZmZmZGZmZmQsIDB4ZmZmZGZmZmYsIDB4ZmZmZGZmZmQsCisJCSAweGZmZmRmZmZkLCAweGZmZmRmZmZkLCAweGZmZmRmZmZmLCAweGZmZmRmZmZkfSwKKwkvKiAxMSAqL3sweGZmZmNmZmZjLCAweGZmZmNmZmZjLCAweGZmZmNmZmZjLCAweGZmZmNmZmZjLAorCQkgMHhmZmZjZmZmYywgMHhmZmZjZmZmYywgMHhmZmZjZmZmYywgMHhmZmZjZmZmYywKKwkJIDB4ZmZmY2ZmZmMsIDB4ZmZmY2ZmZmMsIDB4ZmZmY2ZmZmMsIDB4ZmZmY2ZmZmMsCisJCSAweGZmZmNmZmZjLCAweGZmZmNmZmZjLCAweGZmZmNmZmZjLCAweGZmZmNmZmZjfSwKKwkvKiAxMiAqL3sweGZmZmJmZmZiLCAweGZmZmZmZmZiLCAweGZmZmZmZmZiLCAweGZmZmZmZmZiLAorCQkgMHhmZmZiZmZmYiwgMHhmZmZmZmZmYiwgMHhmZmZmZmZmYiwgMHhmZmZmZmZmYiwKKwkJIDB4ZmZmYmZmZmIsIDB4ZmZmZmZmZmIsIDB4ZmZmZmZmZmIsIDB4ZmZmZmZmZmIsCisJCSAweGZmZmJmZmZiLCAweGZmZmZmZmZiLCAweGZmZmZmZmZiLCAweGZmZmZmZmZifSwKKwkvKiAxMyAqL3sweGZmZmFmZmZhLCAweGZmZmFmZmZhLCAweGZmZmZmZmZhLCAweGZmZmFmZmZhLAorCQkgMHhmZmZhZmZmYSwgMHhmZmZhZmZmYSwgMHhmZmZhZmZmYSwgMHhmZmZhZmZmYSwKKwkJIDB4ZmZmYWZmZmEsIDB4ZmZmYWZmZmEsIDB4ZmZmYWZmZmEsIDB4ZmZmYWZmZmEsCisJCSAweGZmZmFmZmZhLCAweGZmZmFmZmZhLCAweGZmZmFmZmZhLCAweGZmZmFmZmZhfSwKKwkvKiAxNCAqL3sweGZmZjlmZmY5LCAweGZmZjlmZmY5LCAweGZmZjlmZmY5LCAweGZmZjlmZmY5LAorCQkgMHhmZmY5ZmZmOSwgMHhmZmY5ZmZmOSwgMHhmZmY5ZmZmOSwgMHhmZmY5ZmZmOSwKKwkJIDB4ZmZmOWZmZjksIDB4ZmZmOWZmZjksIDB4ZmZmOWZmZjksIDB4ZmZmOWZmZjksCisJCSAweGZmZjlmZmY5LCAweGZmZjlmZmY5LCAweGZmZjlmZmY5LCAweGZmZjlmZmY5fSwKKwkvKiAxNSAqL3sweGZmZjhmZmY4LCAweGZmZjhmZmY4LCAweGZmZjhmZmY4LCAweGZmZjhmZmY4LAorCQkgMHhmZmY4ZmZmOCwgMHhmZmY4ZmZmOCwgMHhmZmY4ZmZmOCwgMHhmZmY4ZmZmOCwKKwkJIDB4ZmZmOGZmZjgsIDB4ZmZmOGZmZjgsIDB4ZmZmOGZmZjgsIDB4ZmZmOGZmZjgsCisJCSAweGZmZjhmZmY4LCAweGZmZjhmZmY4LCAweGZmZjhmZmY4LCAweGZmZjhmZmY4fSwKKwkvKiAxNiAqL3sweGZmZjdmZmY3LCAweGZmZjdmZmZmLCAweGZmZjdmZmY3LCAweGZmZjdmZmY3LAorCQkgMHhmZmY3ZmZmNywgMHhmZmY3ZmZmZiwgMHhmZmY3ZmZmNywgMHhmZmY3ZmZmNywKKwkJIDB4ZmZmN2ZmZjcsIDB4ZmZmN2ZmZmYsIDB4ZmZmN2ZmZjcsIDB4ZmZmN2ZmZjcsCisJCSAweGZmZjdmZmZmLCAweGZmZjdmZmZmLCAweGZmZjdmZmY3LCAweGZmZjdmZmY3fSwKKwkvKiAxNyAqL3sweGZmZjZmZmY1LCAweGZmZjZmZmZmLCAweGZmZjZmZmY2LCAweGZmZjZmZmY3LAorCQkgMHhmZmY2ZmZmNSwgMHhmZmY2ZmZmZiwgMHhmZmY2ZmZmNiwgMHhmZmY2ZmZmNywKKwkJIDB4ZmZmNmZmZjUsIDB4ZmZmNmZmZmYsIDB4ZmZmNmZmZjYsIDB4ZmZmNmZmZjcsCisJCSAweGZmZjZmZmY1LCAweGZmZjZmZmZmLCAweGZmZjZmZmY2LCAweGZmZjZmZmY3fSwKKwkvKiAxOCAqL3sweGZmZjVmZmY0LCAweGZmZjVmZmZmLCAweGZmZjVmZmY1LCAweGZmZjVmZmY1LAorCQkgMHhmZmY1ZmZmNCwgMHhmZmY1ZmZmZiwgMHhmZmY1ZmZmNSwgMHhmZmY1ZmZmNSwKKwkJIDB4ZmZmNWZmZjQsIDB4ZmZmNWZmZmYsIDB4ZmZmNWZmZjUsIDB4ZmZmNWZmZjUsCisJCSAweGZmZjVmZmY0LCAweGZmZjVmZmZmLCAweGZmZjVmZmY1LCAweGZmZjVmZmY1fSwKKwkvKiAxOSAqL3sweGZmZjRmZmYzLCAweGZmZjRmZmZmLCAweGZmZjRmZmY0LCAweGZmZjRmZmY0LAorCQkgMHhmZmY0ZmZmMywgMHhmZmY0ZmZmZiwgMHhmZmY0ZmZmNCwgMHhmZmY0ZmZmNCwKKwkJIDB4ZmZmNGZmZjMsIDB4ZmZmNGZmZmYsIDB4ZmZmNGZmZjQsIDB4ZmZmNGZmZjQsCisJCSAweGZmZjRmZmYzLCAweGZmZjRmZmZmLCAweGZmZjRmZmY0LCAweGZmZjRmZmY0fSwKKwkvKiAyMCAqL3sweGZmZjNmZmYyLCAweGZmZjNmZmZmLCAweGZmZjNmZmYzLCAweGZmZjNmZmYzLAorCQkgMHhmZmYzZmZmMiwgMHhmZmYzZmZmZiwgMHhmZmYzZmZmMywgMHhmZmYzZmZmMywKKwkJIDB4ZmZmM2ZmZjIsIDB4ZmZmM2ZmZmYsIDB4ZmZmM2ZmZjMsIDB4ZmZmM2ZmZjMsCisJCSAweGZmZjNmZmYyLCAweGZmZjNmZmZmLCAweGZmZjNmZmYzLCAweGZmZjNmZmYzfSwKKwkvKiAyMSAqL3sweGZmZjJmZmZmLCAweGZmZjJmZmZmLCAweGZmZjJmZmYyLCAweGZmZjJmZmYyLAorCQkgMHhmZmYyZmZmZiwgMHhmZmYyZmZmZiwgMHhmZmYyZmZmMiwgMHhmZmYyZmZmMiwKKwkJIDB4ZmZmMmZmZmYsIDB4ZmZmMmZmZmYsIDB4ZmZmMmZmZjIsIDB4ZmZmMmZmZjIsCisJCSAweGZmZjJmZmZmLCAweGZmZjJmZmZmLCAweGZmZjJmZmYyLCAweGZmZjJmZmYyfSwKKwkvKiAyMiAqL3sweGZmZjFmZmZmLCAweGZmZjFmZmZmLCAweGZmZjFmZmYxLCAweGZmZjFmZmYxLAorCQkgMHhmZmYxZmZmZiwgMHhmZmYxZmZmZiwgMHhmZmYxZmZmMSwgMHhmZmYxZmZmMSwKKwkJIDB4ZmZmMWZmZmYsIDB4ZmZmMWZmZmYsIDB4ZmZmMWZmZjEsIDB4ZmZmMWZmZjEsCisJCSAweGZmZjFmZmZmLCAweGZmZjFmZmZmLCAweGZmZjFmZmYxLCAweGZmZjFmZmYxfSwKKwkvKiAyMyAqL3sweGZmZjBmZmYwLCAweGZmZjBmZmYwLCAweGZmZjBmZmYwLCAweGZmZjBmZmYwLAorCQkgMHhmZmYwZmZmMCwgMHhmZmYwZmZmMCwgMHhmZmYwZmZmMCwgMHhmZmYwZmZmMCwKKwkJIDB4ZmZmMGZmZjAsIDB4ZmZmMGZmZjAsIDB4ZmZmMGZmZjAsIDB4ZmZmMGZmZjAsCisJCSAweGZmZjBmZmYwLCAweGZmZjBmZmZlLCAweGZmZjBmZmYwLCAweGZmZjBmZmYwfSwKKyNlbmRpZiAvKiBDT05GSUdfU1lTX0RFQ1JFTUVOVF9QQVRURVJOUyAqLworCQkJCQkJCQkgfTsKKworCW1mc2RyYW0oU0RSQU1fTUNPUFQxLCBlY2NfbW9kZSk7CisJaWYgKChlY2NfbW9kZSAmIFNEUkFNX01DT1BUMV9NQ0hLX0NIS19SRVApID09CisJCQkJCQlTRFJBTV9NQ09QVDFfTUNIS19DSEtfUkVQKSB7CisJCWVjY19jbGVhcl9zdGF0dXNfcmVnKCk7CisJCXN5bmMoKTsKKwkJZWNjX21vZGUgPSAxOworCX0gZWxzZSB7CisJCWVjY19tb2RlID0gMDsKKwl9CisKKwkvKgorCSAqIFJ1biB0aGUgc2hvcnQgbWVtb3J5IHRlc3QuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5VTU1FTVRFU1RTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IE5VTU1FTVdPUkRTOyBqKyspIHsKKwkJCWJhc2VfYWRkcmVzc1tqXSA9IHRlc3RbaV1bal07CisJCQlwcGNEY2JmKCh1bG9uZykmKGJhc2VfYWRkcmVzc1tqXSkpOworCQl9CisJCXN5bmMoKTsKKwkJaW9iYXJyaWVyX3J3KCk7CisJCWZvciAobCA9IDA7IGwgPCBOVU1MT09QUzsgbCsrKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgTlVNTUVNV09SRFM7IGorKykgeworCQkJCWlmIChiYXNlX2FkZHJlc3Nbal0gIT0gdGVzdFtpXVtqXSkgeworCQkJCQlwcGNEY2JmKCh1MzIpJihiYXNlX2FkZHJlc3Nbal0pKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGVjY19tb2RlKSB7CisJCQkJCQlpZiAoIWVjY19jaGVja19zdGF0dXNfcmVnKCkpCisJCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQl9CisJCQkJcHBjRGNiZigodTMyKSYoYmFzZV9hZGRyZXNzW2pdKSk7CisJCQl9IC8qIGZvciAoaiA9IDA7IGogPCBOVU1NRU1XT1JEUzsgaisrKSAqLworCQkJc3luYygpOworCQkJaW9iYXJyaWVyX3J3KCk7CisJCX0gLyogZm9yIChsPTA7IGw8TlVNTE9PUFM7IGwrKykgKi8KKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfTUVUSE9EX0EpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBwcm9ncmFtX0RRU19jYWxpYnJhdGlvbl9tZXRob2RBLgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB1MzIgcHJvZ3JhbV9EUVNfY2FsaWJyYXRpb25fbWV0aG9kQShzdHJ1Y3QgZGRyYXV0b2NhbCAqZGRyY2FsKQoreworCXUzMiBwYXNzX3Jlc3VsdCA9IDA7CisKKyNpZmRlZiBERUJVRworCXVsb25nIHRlbXA7CisKKwltZnNkcmFtKFNEUkFNX1JEQ0MsIHRlbXApOworCWRlYnVnKCI8JXM+U0RSQU1fUkRDQz0weCUwOHhcbiIsIF9fZnVuY19fLCB0ZW1wKTsKKyNlbmRpZgorCisJcGFzc19yZXN1bHQgPSBEUVNfY2FsaWJyYXRpb25fbWV0aG9kQShkZHJjYWwpOworCisJcmV0dXJuIHBhc3NfcmVzdWx0OworfQorCisvKgorICogRFFTX2NhbGlicmF0aW9uX21ldGhvZEEoKQorICoKKyAqIEF1dG9jYWxpYnJhdGlvbiBNZXRob2QgQQorICoKKyAqICBBUlJBWSBbRW50aXJlIERRUyBSYW5nZV0gRFFTX1ZhbGlkX1dpbmRvdyA7ICAgIGluaXRpYWxpemVkIHRvIGFsbCB6ZXJvcworICogIEFSUkFZIFtFbnRpcmUgRkRCSyBSYW5nZV0gRkRCS19WYWxpZF9XaW5kb3c7ICAgaW5pdGlhbGl6ZWQgdG8gYWxsIHplcm9zCisgKiAgTUVNV1JJVEUoYWRkciwgZXhwZWN0ZWRfZGF0YSk7CisgKiAgZm9yIChpID0gMDsgaSA8IEVudGlyZSBEUVMgUmFuZ2U7IGkrKykgeyAgICAgICBSUURDLlJRRkQKKyAqICAgICAgZm9yIChqID0gMDsgaiA8IEVudGlyZSBGREJLIFJhbmdlOyBqKyspIHsgIFJGREMuUkZGRAorICogICAgICAgICBNRU1SRUFEKGFkZHIsIGFjdHVhbF9kYXRhKTsKKyAqICAgICAgICAgaWYgKGFjdHVhbF9kYXRhID09IGV4cGVjdGVkX2RhdGEpIHsKKyAqICAgICAgICAgICAgIERRU19WYWxpZF9XaW5kb3dbaV0gPSAxOyAgICAgICAgICAgIFJRREMuUlFGRAorICogICAgICAgICAgICAgRkRCS19WYWxpZF9XaW5kb3dbaV1bal0gPSAxOyAgICAgICAgUkZEQy5SRkZECisgKiAgICAgICAgIH0KKyAqICAgICAgfQorICogIH0KKyAqLworc3RhdGljIHUzMiBEUVNfY2FsaWJyYXRpb25fbWV0aG9kQShzdHJ1Y3QgZGRyYXV0b2NhbCAqY2FsKQoreworCXVsb25nIHJmZGNfcmVnOworCXVsb25nIHJmZmQ7CisKKwl1bG9uZyBycWRjX3JlZzsKKwl1bG9uZyBycWZkOworCisJdTMyICptZW1iYXNlOworCXVsb25nIGJ4Y2Y7CisJaW50IHJxZmRfYXZlcmFnZTsKKwlpbnQgYnhjcl9udW07CisJaW50IHJmZmRfYXZlcmFnZTsKKwlpbnQgcGFzczsKKwl1MzIgcGFzc2VkID0gMDsKKworCWludCBpbl93aW5kb3c7CisJc3RydWN0IGF1dG9jYWxfcmVncyBjdXJyX3dpbl9taW47CisJc3RydWN0IGF1dG9jYWxfcmVncyBjdXJyX3dpbl9tYXg7CisJc3RydWN0IGF1dG9jYWxfcmVncyBiZXN0X3dpbl9taW47CisJc3RydWN0IGF1dG9jYWxfcmVncyBiZXN0X3dpbl9tYXg7CisJc3RydWN0IGF1dG9jYWxfcmVncyBsb29wX3dpbl9taW47CisJc3RydWN0IGF1dG9jYWxfcmVncyBsb29wX3dpbl9tYXg7CisKKyNpZmRlZiBERUJVRworCXVsb25nIHRlbXA7CisjZW5kaWYKKwl1bG9uZyByZGNjOworCisJY2hhciBzbGFzaFtdID0gIlxcfC8tXFx8Ly0iOworCWludCBsb29waSA9IDA7CisKKwkvKiBzdGFydCAqLworCWluX3dpbmRvdyA9IDA7CisKKwltZW1zZXQoJmN1cnJfd2luX21pbiwgMCwgc2l6ZW9mKGN1cnJfd2luX21pbikpOworCW1lbXNldCgmY3Vycl93aW5fbWF4LCAwLCBzaXplb2YoY3Vycl93aW5fbWF4KSk7CisJbWVtc2V0KCZiZXN0X3dpbl9taW4sIDAsIHNpemVvZihiZXN0X3dpbl9taW4pKTsKKwltZW1zZXQoJmJlc3Rfd2luX21heCwgMCwgc2l6ZW9mKGJlc3Rfd2luX21heCkpOworCW1lbXNldCgmbG9vcF93aW5fbWluLCAwLCBzaXplb2YobG9vcF93aW5fbWluKSk7CisJbWVtc2V0KCZsb29wX3dpbl9tYXgsIDAsIHNpemVvZihsb29wX3dpbl9tYXgpKTsKKworCXJkY2MgPSAwOworCisJLyoKKwkgKiBQcm9ncmFtIFJEQ0MgcmVnaXN0ZXIKKwkgKiBSZWFkIHNhbXBsZSBjeWNsZSBhdXRvLXVwZGF0ZSBlbmFibGUKKwkgKi8KKwltdHNkcmFtKFNEUkFNX1JEQ0MsCisJCWRkcl9yZHNzX29wdChTRFJBTV9SRENDX1JEU1NfVDIpIHwgU0RSQU1fUkRDQ19SU0FFX0VOQUJMRSk7CisKKyNpZmRlZiBERUJVRworCW1mc2RyYW0oU0RSQU1fUkRDQywgdGVtcCk7CisJZGVidWcoIjwlcz5TRFJBTV9SRENDPTB4JXhcbiIsIF9fZnVuY19fLCB0ZW1wKTsKKwltZnNkcmFtKFNEUkFNX1JUU1IsIHRlbXApOworCWRlYnVnKCI8JXM+U0RSQU1fUlRTUj0weCV4XG4iLCBfX2Z1bmNfXywgdGVtcCk7CisJbWZzZHJhbShTRFJBTV9GQ1NSLCB0ZW1wKTsKKwlkZWJ1ZygiPCVzPlNEUkFNX0ZDU1I9MHgleFxuIiwgX19mdW5jX18sIHRlbXApOworI2VuZGlmCisKKwkvKgorCSAqIFByb2dyYW0gUlFEQyByZWdpc3RlcgorCSAqIEludGVybmFsIERRUyBkZWxheSBtZWNoYW5pc20gZW5hYmxlCisJICovCisJbXRzZHJhbShTRFJBTV9SUURDLAorCQlTRFJBTV9SUURDX1JRREVfRU5BQkxFIHwgU0RSQU1fUlFEQ19SUUZEX0VOQ09ERSgweDAwKSk7CisKKyNpZmRlZiBERUJVRworCW1mc2RyYW0oU0RSQU1fUlFEQywgdGVtcCk7CisJZGVidWcoIjwlcz5TRFJBTV9SUURDPTB4JXhcbiIsIF9fZnVuY19fLCB0ZW1wKTsKKyNlbmRpZgorCisJLyoKKwkgKiBQcm9ncmFtIFJGREMgcmVnaXN0ZXIKKwkgKiBTZXQgRmVlZGJhY2sgRnJhY3Rpb25hbCBPdmVyc2FtcGxlCisJICogQXV0by1kZXRlY3QgcmVhZCBzYW1wbGUgY3ljbGUgZW5hYmxlCisJICovCisJbXRzZHJhbShTRFJBTV9SRkRDLCBTRFJBTV9SRkRDX0FSU0VfRU5BQkxFIHwKKwkJU0RSQU1fUkZEQ19SRk9TX0VOQ09ERSgwKSB8IFNEUkFNX1JGRENfUkZGRF9FTkNPREUoMCkpOworCisjaWZkZWYgREVCVUcKKwltZnNkcmFtKFNEUkFNX1JGREMsIHRlbXApOworCWRlYnVnKCI8JXM+U0RSQU1fUkZEQz0weCV4XG4iLCBfX2Z1bmNfXywgdGVtcCk7CisjZW5kaWYKKworCXB1dGMoJyAnKTsKKwlmb3IgKHJxZmQgPSAwOyBycWZkIDw9IFNEUkFNX1JRRENfUlFGRF9NQVg7IHJxZmQrKykgeworCisJCW1mc2RyYW0oU0RSQU1fUlFEQywgcnFkY19yZWcpOworCQlycWRjX3JlZyAmPSB+KFNEUkFNX1JRRENfUlFGRF9NQVNLKTsKKwkJbXRzZHJhbShTRFJBTV9SUURDLCBycWRjX3JlZyB8IFNEUkFNX1JRRENfUlFGRF9FTkNPREUocnFmZCkpOworCisJCXB1dGMoJ1xiJyk7CisJCXB1dGMoc2xhc2hbbG9vcGkrKyAlIDhdKTsKKworCQljdXJyX3dpbl9taW4ucmZmZCA9IDA7CisJCWN1cnJfd2luX21heC5yZmZkID0gMDsKKwkJaW5fd2luZG93ID0gMDsKKworCQlmb3IgKHJmZmQgPSAwLCBwYXNzID0gMDsgcmZmZCA8PSBTRFJBTV9SRkRDX1JGRkRfTUFYOyByZmZkKyspIHsKKwkJCW1mc2RyYW0oU0RSQU1fUkZEQywgcmZkY19yZWcpOworCQkJcmZkY19yZWcgJj0gfihTRFJBTV9SRkRDX1JGRkRfTUFTSyk7CisJCQltdHNkcmFtKFNEUkFNX1JGREMsCisJCQkJICAgIHJmZGNfcmVnIHwgU0RSQU1fUkZEQ19SRkZEX0VOQ09ERShyZmZkKSk7CisKKwkJCWZvciAoYnhjcl9udW0gPSAwOyBieGNyX251bSA8IE1BWEJYQ0Y7IGJ4Y3JfbnVtKyspIHsKKwkJCQltZnNkcmFtKFNEUkFNX01CMENGICsgKGJ4Y3JfbnVtPDwyKSwgYnhjZik7CisKKwkJCQkvKiBCYW5rcyBlbmFibGVkICovCisJCQkJaWYgKGJ4Y2YgJiBTRFJBTV9CWENGX01fQkVfTUFTSykgeworCQkJCQkvKiBCYW5rIGlzIGVuYWJsZWQgKi8KKwkJCQkJbWVtYmFzZSA9IGdldF9tZW1iYXNlKGJ4Y3JfbnVtKTsKKwkJCQkJcGFzcyA9IHNob3J0X21lbV90ZXN0KG1lbWJhc2UpOworCQkJCX0gLyogaWYgYmFuayBlbmFibGVkICovCisJCQl9IC8qIGZvciBieGNyX251bSAqLworCisJCQkvKiBJZiB0aGlzIHZhbHVlIHBhc3NlZCB1cGRhdGUgUkZGRCB3aW5kb3dzICovCisJCQlpZiAocGFzcyAmJiAhaW5fd2luZG93KSB7IC8qIGF0IHRoZSBzdGFydCBvZiB3aW5kb3cgKi8KKwkJCQlpbl93aW5kb3cgPSAxOworCQkJCWN1cnJfd2luX21pbi5yZmZkID0gY3Vycl93aW5fbWF4LnJmZmQgPSByZmZkOworCQkJCWN1cnJfd2luX21pbi5ycWZkID0gY3Vycl93aW5fbWF4LnJxZmQgPSBycWZkOworCQkJCW1mc2RyYW0oU0RSQU1fUkRDQywgcmRjYyk7IC8qcmVjb3JkIHRoaXMgdmFsdWUqLworCQkJfSBlbHNlIGlmICghcGFzcyAmJiBpbl93aW5kb3cpIHsgLyogYXQgZW5kIG9mIHdpbmRvdyAqLworCQkJCWluX3dpbmRvdyA9IDA7CisJCQl9IGVsc2UgaWYgKHBhc3MgJiYgaW5fd2luZG93KSB7IC8qIHdpdGhpbiB0aGUgd2luZG93ICovCisJCQkJY3Vycl93aW5fbWF4LnJmZmQgPSByZmZkOworCQkJCWN1cnJfd2luX21heC5ycWZkID0gcnFmZDsKKwkJCX0KKwkJCS8qIGVsc2UgaWYgKCFwYXNzICYmICFpbl93aW5kb3cpCisJCQkJc2tpcCAtIG5vIHBhc3MsIG5vdCBjdXJyZW50bHkgaW4gYSB3aW5kb3cgKi8KKworCQkJaWYgKGluX3dpbmRvdykgeworCQkJCWlmICgoY3Vycl93aW5fbWF4LnJmZmQgLSBjdXJyX3dpbl9taW4ucmZmZCkgPgorCQkJCSAgICAoYmVzdF93aW5fbWF4LnJmZmQgLSBiZXN0X3dpbl9taW4ucmZmZCkpIHsKKwkJCQkJYmVzdF93aW5fbWluLnJmZmQgPSBjdXJyX3dpbl9taW4ucmZmZDsKKwkJCQkJYmVzdF93aW5fbWF4LnJmZmQgPSBjdXJyX3dpbl9tYXgucmZmZDsKKworCQkJCQliZXN0X3dpbl9taW4ucnFmZCA9IGN1cnJfd2luX21pbi5ycWZkOworCQkJCQliZXN0X3dpbl9tYXgucnFmZCA9IGN1cnJfd2luX21heC5ycWZkOworCQkJCQljYWwtPnJkY2MJICA9IHJkY2M7CisJCQkJfQorCQkJCXBhc3NlZCA9IDE7CisJCQl9CisJCX0gLyogUkZEQy5SRkZEICovCisKKwkJLyoKKwkJICogc2F2ZS1vZmYgdGhlIGJlc3Qgd2luZG93IHJlc3VsdHMgb2YgdGhlIFJGREMuUkZGRAorCQkgKiBmb3IgdGhpcyBSUURDLlJRRkQgc2V0dGluZworCQkgKi8KKwkJLyoKKwkJICogaWYgKGp1c3QgZW5kZWQgUkZEQy5SRkRDIGxvb3AgcGFzcyB3aW5kb3cpID4KKwkJICoJKHByaW9yIFJGREMuUkZGRCBsb29wIHBhc3Mgd2luZG93KQorCQkgKi8KKwkJaWYgKChiZXN0X3dpbl9tYXgucmZmZCAtIGJlc3Rfd2luX21pbi5yZmZkKSA+CisJCSAgICAobG9vcF93aW5fbWF4LnJmZmQgLSBsb29wX3dpbl9taW4ucmZmZCkpIHsKKwkJCWxvb3Bfd2luX21pbi5yZmZkID0gYmVzdF93aW5fbWluLnJmZmQ7CisJCQlsb29wX3dpbl9tYXgucmZmZCA9IGJlc3Rfd2luX21heC5yZmZkOworCQkJbG9vcF93aW5fbWluLnJxZmQgPSBycWZkOworCQkJbG9vcF93aW5fbWF4LnJxZmQgPSBycWZkOworCQkJZGVidWcoIlJRRkQubWluIDB4JTA4eCwgUlFGRC5tYXggMHglMDh4LCAiCisJCQkgICAgICAiUkZGRC5taW4gMHglMDh4LCBSRkZELm1heCAweCUwOHhcbiIsCisJCQkJCWxvb3Bfd2luX21pbi5ycWZkLCBsb29wX3dpbl9tYXgucnFmZCwKKwkJCQkJbG9vcF93aW5fbWluLnJmZmQsIGxvb3Bfd2luX21heC5yZmZkKTsKKwkJfQorCX0gLyogUlFEQy5SUUZEICovCisKKwlwdXRjKCdcYicpOworCisJZGVidWcoIlxuIik7CisKKwlpZiAoKGxvb3Bfd2luX21pbi5yZmZkID09IDApICYmIChsb29wX3dpbl9tYXgucmZmZCA9PSAwKSAmJgorCSAgICAoYmVzdF93aW5fbWluLnJmZmQgPT0gMCkgJiYgKGJlc3Rfd2luX21heC5yZmZkID09IDApICYmCisJICAgIChiZXN0X3dpbl9taW4ucnFmZCA9PSAwKSAmJiAoYmVzdF93aW5fbWF4LnJxZmQgPT0gMCkpIHsKKwkJcGFzc2VkID0gMDsKKwl9CisKKwkvKgorCSAqIE5lZWQgdG8gcHJvZ3JhbSBSUURDIGJlZm9yZSBSRkRDLgorCSAqLworCWRlYnVnKCI8JXM+IFJRRkQgTWluOiAweCV4XG4iLCBfX2Z1bmNfXywgbG9vcF93aW5fbWluLnJxZmQpOworCWRlYnVnKCI8JXM+IFJRRkQgTWF4OiAweCV4XG4iLCBfX2Z1bmNfXywgbG9vcF93aW5fbWF4LnJxZmQpOworCXJxZmRfYXZlcmFnZSA9IGxvb3Bfd2luX21heC5ycWZkOworCisJaWYgKHJxZmRfYXZlcmFnZSA8IDApCisJCXJxZmRfYXZlcmFnZSA9IDA7CisKKwlpZiAocnFmZF9hdmVyYWdlID4gU0RSQU1fUlFEQ19SUUZEX01BWCkKKwkJcnFmZF9hdmVyYWdlID0gU0RSQU1fUlFEQ19SUUZEX01BWDsKKworCWRlYnVnKCI8JXM+IFJGRkQgYXZlcmFnZTogMHglMDh4XG4iLCBfX2Z1bmNfXywgcnFmZF9hdmVyYWdlKTsKKwltdHNkcmFtKFNEUkFNX1JRREMsIChycWRjX3JlZyAmIH5TRFJBTV9SUURDX1JRRkRfTUFTSykgfAorCQkJCVNEUkFNX1JRRENfUlFGRF9FTkNPREUocnFmZF9hdmVyYWdlKSk7CisKKwlkZWJ1ZygiPCVzPiBSRkZEIE1pbjogMHglMDh4XG4iLCBfX2Z1bmNfXywgbG9vcF93aW5fbWluLnJmZmQpOworCWRlYnVnKCI8JXM+IFJGRkQgTWF4OiAweCUwOHhcbiIsIF9fZnVuY19fLCBsb29wX3dpbl9tYXgucmZmZCk7CisJcmZmZF9hdmVyYWdlID0gKChsb29wX3dpbl9taW4ucmZmZCArIGxvb3Bfd2luX21heC5yZmZkKSAvIDIpOworCisJaWYgKHJmZmRfYXZlcmFnZSA8IDApCisJCXJmZmRfYXZlcmFnZSA9IDA7CisKKwlpZiAocmZmZF9hdmVyYWdlID4gU0RSQU1fUkZEQ19SRkZEX01BWCkKKwkJcmZmZF9hdmVyYWdlID0gU0RSQU1fUkZEQ19SRkZEX01BWDsKKworCWRlYnVnKCI8JXM+IFJGRkQgYXZlcmFnZTogMHglMDh4XG4iLCBfX2Z1bmNfXywgcmZmZF9hdmVyYWdlKTsKKwltdHNkcmFtKFNEUkFNX1JGREMsIHJmZGNfcmVnIHwgU0RSQU1fUkZEQ19SRkZEX0VOQ09ERShyZmZkX2F2ZXJhZ2UpKTsKKworCS8qIGlmIHNvbWV0aGluZyBwYXNzZWQsIHRoZW4gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IHdpbmRvdyAqLworCWlmIChwYXNzZWQgIT0gMCkgeworCQlwYXNzZWQJCT0gbG9vcF93aW5fbWF4LnJmZmQgLSBsb29wX3dpbl9taW4ucmZmZDsKKwkJY2FsLT5ycWZkCT0gcnFmZF9hdmVyYWdlOworCQljYWwtPnJmZmQJPSByZmZkX2F2ZXJhZ2U7CisJCWNhbC0+cmZmZF9taW4JPSBsb29wX3dpbl9taW4ucmZmZDsKKwkJY2FsLT5yZmZkX21heAk9IGxvb3Bfd2luX21heC5yZmZkOworCX0KKworCXJldHVybiAodTMyKXBhc3NlZDsKK30KKworI2Vsc2UJLyogIWRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfTUVUSE9EX0EpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IHByb2dyYW1fRFFTX2NhbGlicmF0aW9uX21ldGhvZEIuCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHUzMiBwcm9ncmFtX0RRU19jYWxpYnJhdGlvbl9tZXRob2RCKHN0cnVjdCBkZHJhdXRvY2FsICpkZHJjYWwpCit7CisJdTMyIHBhc3NfcmVzdWx0ID0gMDsKKworI2lmZGVmIERFQlVHCisJdWxvbmcgdGVtcDsKKyNlbmRpZgorCisJLyoKKwkgKiBQcm9ncmFtIFJEQ0MgcmVnaXN0ZXIKKwkgKiBSZWFkIHNhbXBsZSBjeWNsZSBhdXRvLXVwZGF0ZSBlbmFibGUKKwkgKi8KKwltdHNkcmFtKFNEUkFNX1JEQ0MsCisJCWRkcl9yZHNzX29wdChTRFJBTV9SRENDX1JEU1NfVDIpIHwgU0RSQU1fUkRDQ19SU0FFX0VOQUJMRSk7CisKKyNpZmRlZiBERUJVRworCW1mc2RyYW0oU0RSQU1fUkRDQywgdGVtcCk7CisJZGVidWcoIjwlcz5TRFJBTV9SRENDPTB4JTA4eFxuIiwgX19mdW5jX18sIHRlbXApOworI2VuZGlmCisKKwkvKgorCSAqIFByb2dyYW0gUlFEQyByZWdpc3RlcgorCSAqIEludGVybmFsIERRUyBkZWxheSBtZWNoYW5pc20gZW5hYmxlCisJICovCisJbXRzZHJhbShTRFJBTV9SUURDLAorI2lmIGRlZmluZWQoQ09ORklHX0REUl9SUURDX1NUQVJUX1ZBTCkKKwkJCVNEUkFNX1JRRENfUlFERV9FTkFCTEUgfAorCQkJICAgIFNEUkFNX1JRRENfUlFGRF9FTkNPREUoQ09ORklHX0REUl9SUURDX1NUQVJUX1ZBTCkpOworI2Vsc2UKKwkJCVNEUkFNX1JRRENfUlFERV9FTkFCTEUgfCBTRFJBTV9SUURDX1JRRkRfRU5DT0RFKDB4MzgpKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKwltZnNkcmFtKFNEUkFNX1JRREMsIHRlbXApOworCWRlYnVnKCI8JXM+U0RSQU1fUlFEQz0weCUwOHhcbiIsIF9fZnVuY19fLCB0ZW1wKTsKKyNlbmRpZgorCisJLyoKKwkgKiBQcm9ncmFtIFJGREMgcmVnaXN0ZXIKKwkgKiBTZXQgRmVlZGJhY2sgRnJhY3Rpb25hbCBPdmVyc2FtcGxlCisJICogQXV0by1kZXRlY3QgcmVhZCBzYW1wbGUgY3ljbGUgZW5hYmxlCisJICovCisJbXRzZHJhbShTRFJBTV9SRkRDLAlTRFJBTV9SRkRDX0FSU0VfRU5BQkxFIHwKKwkJCQlTRFJBTV9SRkRDX1JGT1NfRU5DT0RFKDApIHwKKwkJCQlTRFJBTV9SRkRDX1JGRkRfRU5DT0RFKDApKTsKKworI2lmZGVmIERFQlVHCisJbWZzZHJhbShTRFJBTV9SRkRDLCB0ZW1wKTsKKwlkZWJ1ZygiPCVzPlNEUkFNX1JGREM9MHglMDh4XG4iLCBfX2Z1bmNfXywgdGVtcCk7CisjZW5kaWYKKworCXBhc3NfcmVzdWx0ID0gRFFTX2NhbGlicmF0aW9uX21ldGhvZEIoZGRyY2FsKTsKKworCXJldHVybiBwYXNzX3Jlc3VsdDsKK30KKworLyoKKyAqIERRU19jYWxpYnJhdGlvbl9tZXRob2RCKCkKKyAqCisgKiBBdXRvY2FsaWJyYXRpb24gTWV0aG9kIEIKKyAqCisgKiBBUlJBWSBbRW50aXJlIERRUyBSYW5nZV0gRFFTX1ZhbGlkX1dpbmRvdyA7ICAgICAgIGluaXRpYWxpemVkIHRvIGFsbCB6ZXJvcworICogQVJSQVkgW0VudGlyZSBGZWVkYmFjayBSYW5nZV0gRkRCS19WYWxpZF9XaW5kb3c7ICBpbml0aWFsaXplZCB0byBhbGwgemVyb3MKKyAqIE1FTVdSSVRFKGFkZHIsIGV4cGVjdGVkX2RhdGEpOworICogSW5pdGlhbGlhbGl6ZSB0aGUgRFFTIGRlbGF5IHRvIDgwIGRlZ3JlZXMgKE1DSUYwX1JSUURDW1JRRkRdPTB4MzgpLgorICoKKyAqICBmb3IgKGogPSAwOyBqIDwgRW50aXJlIEZlZWRiYWNrIFJhbmdlOyBqKyspIHsKKyAqICAgICAgTUVNUkVBRChhZGRyLCBhY3R1YWxfZGF0YSk7CisgKiAgICAgICBpZiAoYWN0dWFsX2RhdGEgPT0gZXhwZWN0ZWRfZGF0YSkgeworICogICAgICAgICAgIEZEQktfVmFsaWRfV2luZG93W2pdID0gMTsKKyAqICAgICAgIH0KKyAqIH0KKyAqCisgKiBTZXQgTUNJRjBfUkZEQ1tSRkZEXSB0byB0aGUgbWlkZGxlIG9mIHRoZSBGREJLX1ZhbGlkX1dpbmRvdy4KKyAqCisgKiBmb3IgKGkgPSAwOyBpIDwgRW50aXJlIERRUyBSYW5nZTsgaSsrKSB7CisgKiAgICAgTUVNUkVBRChhZGRyLCBhY3R1YWxfZGF0YSk7CisgKiAgICAgaWYgKGFjdHVhbF9kYXRhID09IGV4cGVjdGVkX2RhdGEpIHsKKyAqICAgICAgICAgRFFTX1ZhbGlkX1dpbmRvd1tpXSA9IDE7CisgKiAgICAgIH0KKyAqIH0KKyAqCisgKiBTZXQgTUNJRjBfUlJRRENbUlFGRF0gdG8gdGhlIG1pZGRsZSBvZiB0aGUgRFFTX1ZhbGlkX1dpbmRvdy4KKyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgRFFTX2NhbGlicmF0aW9uX21ldGhvZEIuCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHUzMiBEUVNfY2FsaWJyYXRpb25fbWV0aG9kQihzdHJ1Y3QgZGRyYXV0b2NhbCAqY2FsKQoreworCXVsb25nIHJmZGNfcmVnOworCXVsb25nIHJmZmQ7CisKKwl1bG9uZyBycWRjX3JlZzsKKwl1bG9uZyBycWZkOworCisJdWxvbmcgcmRjYzsKKworCXUzMiAqbWVtYmFzZTsKKwl1bG9uZyBieGNmOworCWludCBycWZkX2F2ZXJhZ2U7CisJaW50IGJ4Y3JfbnVtOworCWludCByZmZkX2F2ZXJhZ2U7CisJaW50IHBhc3M7CisJdWludCBwYXNzZWQgPSAwOworCisJaW50IGluX3dpbmRvdzsKKwl1MzIgY3Vycl93aW5fbWluLCBjdXJyX3dpbl9tYXg7CisJdTMyIGJlc3Rfd2luX21pbiwgYmVzdF93aW5fbWF4OworCXUzMiBzaXplID0gMDsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJIHwgVGVzdCB0byBkZXRlcm1pbmUgdGhlIGJlc3QgcmVhZCBjbG9jayBkZWxheSB0dW5pbmcgYml0cy4KKwkgfAorCSB8IEJlZm9yZSB0aGUgRERSIGNvbnRyb2xsZXIgY2FuIGJlIHVzZWQsIHRoZSByZWFkIGNsb2NrIGRlbGF5IG5lZWRzIHRvCisJIHwgYmUgc2V0LiAgVGhpcyBpcyBTRFJBTV9SUURDW1JRRkRdIGFuZCBTRFJBTV9SRkRDW1JGRkRdLgorCSB8IFRoaXMgdmFsdWUgY2Fubm90IGJlIGhhcmRjb2RlZCBpbnRvIHRoZSBwcm9ncmFtIGJlY2F1c2UgaXQgY2hhbmdlcworCSB8IGRlcGVuZGluZyBvbiB0aGUgYm9hcmQncyBzZXR1cCBhbmQgZW52aXJvbm1lbnQuCisJIHwgVG8gZG8gdGhpcywgYWxsIGRlbGF5IHZhbHVlcyBhcmUgdGVzdGVkIHRvIHNlZSBpZiB0aGV5CisJIHwgd29yayBvciBub3QuICBCeSBkb2luZyB0aGlzLCB5b3UgZ2V0IGdyb3VwcyBvZiBmYWlscyB3aXRoIGdyb3VwcyBvZgorCSB8IHBhc3NpbmcgdmFsdWVzLiAgVGhlIGlkZWEgaXMgdG8gZmluZCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhIHBhc3NpbmcKKwkgfCB3aW5kb3cgYW5kIHRha2UgdGhlIGNlbnRlciBvZiBpdCB0byB1c2UgYXMgdGhlIHJlYWQgY2xvY2sgZGVsYXkuCisJIHwKKwkgfCBBIGZhaWx1cmUgaGFzIHRvIGJlIHNlZW4gZmlyc3Qgc28gdGhhdCB3aGVuIHdlIGhpdCBhIHBhc3MsIHdlIGtub3cKKwkgfCB0aGF0IGl0IGlzIHRydWVseSB0aGUgc3RhcnQgb2YgdGhlIHdpbmRvdy4gIElmIHdlIGdldCBwYXNzaW5nIHZhbHVlcworCSB8IHRvIHN0YXJ0IG9mZiB3aXRoLCB3ZSBkb24ndCBrbm93IGlmIHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHdpbmRvdworCSB8CisJIHwgVGhlIGNvZGUgYXNzdW1lcyB0aGF0IGEgZmFpbHVyZSB3aWxsIGFsd2F5cyBiZSBmb3VuZC4KKwkgfCBJZiBhIGZhaWx1cmUgaXMgbm90IGZvdW5kLCB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBnZXQgdGhlIG1pZGRsZQorCSB8IG9mIHRoZSBwYXNzaW5nIHdpbmRvdy4gIEkgZ3Vlc3Mgd2UgY2FuIHByZXR0eSBtdWNoIHBpY2sgYW55IHZhbHVlCisJIHwgYnV0IHNvbWUgdmFsdWVzIHdpbGwgYmUgYmV0dGVyIHRoYW4gb3RoZXJzLiAgU2luY2UgdGhlIGxvd2VzdCBzcGVlZAorCSB8IHdlIGNhbiBjbG9jayB0aGUgRERSIGludGVyZmFjZSBhdCBpcyAyMDAgTUh6ICgyeCAxMDAgTUh6IFBMQiBzcGVlZCksCisJIHwgZnJvbSBleHBlcmltZW50YXRpb24gaXQgaXMgc2FmZSB0byBzYXkgeW91IHdpbGwgYWx3YXlzIGhhdmUgYSBmYWlsdXJlCisJICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlkZWJ1ZygiXG5cbiIpOworCisJaW5fd2luZG93ID0gMDsKKwlyZGNjID0gMDsKKworCWN1cnJfd2luX21pbiA9IGN1cnJfd2luX21heCA9IDA7CisJYmVzdF93aW5fbWluID0gYmVzdF93aW5fbWF4ID0gMDsKKwlmb3IgKHJmZmQgPSAwOyByZmZkIDw9IFNEUkFNX1JGRENfUkZGRF9NQVg7IHJmZmQrKykgeworCQltZnNkcmFtKFNEUkFNX1JGREMsIHJmZGNfcmVnKTsKKwkJcmZkY19yZWcgJj0gfihTRFJBTV9SRkRDX1JGRkRfTUFTSyk7CisJCW10c2RyYW0oU0RSQU1fUkZEQywgcmZkY19yZWcgfCBTRFJBTV9SRkRDX1JGRkRfRU5DT0RFKHJmZmQpKTsKKworCQlwYXNzID0gMTsKKwkJZm9yIChieGNyX251bSA9IDA7IGJ4Y3JfbnVtIDwgTUFYQlhDRjsgYnhjcl9udW0rKykgeworCQkJbWZzZHJhbShTRFJBTV9NQjBDRiArIChieGNyX251bTw8MiksIGJ4Y2YpOworCisJCQkvKiBCYW5rcyBlbmFibGVkICovCisJCQlpZiAoYnhjZiAmIFNEUkFNX0JYQ0ZfTV9CRV9NQVNLKSB7CisJCQkJLyogQmFuayBpcyBlbmFibGVkICovCisJCQkJbWVtYmFzZSA9IGdldF9tZW1iYXNlKGJ4Y3JfbnVtKTsKKwkJCQlwYXNzICY9IHNob3J0X21lbV90ZXN0KG1lbWJhc2UpOworCQkJfSAvKiBpZiBiYW5rIGVuYWJsZWQgKi8KKwkJfSAvKiBmb3IgYnhjZl9udW0gKi8KKworCQkvKiBJZiB0aGlzIHZhbHVlIHBhc3NlZCAqLworCQlpZiAocGFzcyAmJiAhaW5fd2luZG93KSB7CS8qIHN0YXJ0IG9mIHBhc3Npbmcgd2luZG93ICovCisJCQlpbl93aW5kb3cgPSAxOworCQkJY3Vycl93aW5fbWluID0gY3Vycl93aW5fbWF4ID0gcmZmZDsKKwkJCW1mc2RyYW0oU0RSQU1fUkRDQywgcmRjYyk7CS8qIHJlY29yZCB0aGlzIHZhbHVlICovCisJCX0gZWxzZSBpZiAoIXBhc3MgJiYgaW5fd2luZG93KSB7CS8qIGVuZCBwYXNzaW5nIHdpbmRvdyAqLworCQkJaW5fd2luZG93ID0gMDsKKwkJfSBlbHNlIGlmIChwYXNzICYmIGluX3dpbmRvdykgewkvKiB3aXRoaW4gdGhlIHBhc3Npbmcgd2luZG93ICovCisJCQljdXJyX3dpbl9tYXggPSByZmZkOworCQl9CisKKwkJaWYgKGluX3dpbmRvdykgeworCQkJaWYgKChjdXJyX3dpbl9tYXggLSBjdXJyX3dpbl9taW4pID4KKwkJCSAgICAoYmVzdF93aW5fbWF4IC0gYmVzdF93aW5fbWluKSkgeworCQkJCWJlc3Rfd2luX21pbiA9IGN1cnJfd2luX21pbjsKKwkJCQliZXN0X3dpbl9tYXggPSBjdXJyX3dpbl9tYXg7CisJCQkJY2FsLT5yZGNjICAgID0gcmRjYzsKKwkJCX0KKwkJCXBhc3NlZCA9IDE7CisJCX0KKwl9IC8qIGZvciByZmZkICovCisKKwlpZiAoKGJlc3Rfd2luX21pbiA9PSAwKSAmJiAoYmVzdF93aW5fbWF4ID09IDApKQorCQlwYXNzZWQgPSAwOworCWVsc2UKKwkJc2l6ZSA9IGJlc3Rfd2luX21heCAtIGJlc3Rfd2luX21pbjsKKworCWRlYnVnKCJSRkZEIE1pbjogMHgleFxuIiwgYmVzdF93aW5fbWluKTsKKwlkZWJ1ZygiUkZGRCBNYXg6IDB4JXhcbiIsIGJlc3Rfd2luX21heCk7CisJcmZmZF9hdmVyYWdlID0gKChiZXN0X3dpbl9taW4gKyBiZXN0X3dpbl9tYXgpIC8gMik7CisKKwljYWwtPnJmZmRfbWluID0gYmVzdF93aW5fbWluOworCWNhbC0+cmZmZF9tYXggPSBiZXN0X3dpbl9tYXg7CisKKwlpZiAocmZmZF9hdmVyYWdlIDwgMCkKKwkJcmZmZF9hdmVyYWdlID0gMDsKKworCWlmIChyZmZkX2F2ZXJhZ2UgPiBTRFJBTV9SRkRDX1JGRkRfTUFYKQorCQlyZmZkX2F2ZXJhZ2UgPSBTRFJBTV9SRkRDX1JGRkRfTUFYOworCisJbXRzZHJhbShTRFJBTV9SRkRDLCByZmRjX3JlZyB8IFNEUkFNX1JGRENfUkZGRF9FTkNPREUocmZmZF9hdmVyYWdlKSk7CisKKwlyZmZkID0gcmZmZF9hdmVyYWdlOworCWluX3dpbmRvdyA9IDA7CisKKwljdXJyX3dpbl9taW4gPSBjdXJyX3dpbl9tYXggPSAwOworCWJlc3Rfd2luX21pbiA9IGJlc3Rfd2luX21heCA9IDA7CisJZm9yIChycWZkID0gMDsgcnFmZCA8PSBTRFJBTV9SUURDX1JRRkRfTUFYOyBycWZkKyspIHsKKwkJbWZzZHJhbShTRFJBTV9SUURDLCBycWRjX3JlZyk7CisJCXJxZGNfcmVnICY9IH4oU0RSQU1fUlFEQ19SUUZEX01BU0spOworCQltdHNkcmFtKFNEUkFNX1JRREMsIHJxZGNfcmVnIHwgU0RSQU1fUlFEQ19SUUZEX0VOQ09ERShycWZkKSk7CisKKwkJcGFzcyA9IDE7CisJCWZvciAoYnhjcl9udW0gPSAwOyBieGNyX251bSA8IE1BWEJYQ0Y7IGJ4Y3JfbnVtKyspIHsKKworCQkJbWZzZHJhbShTRFJBTV9NQjBDRiArIChieGNyX251bTw8MiksIGJ4Y2YpOworCisJCQkvKiBCYW5rcyBlbmFibGVkICovCisJCQlpZiAoYnhjZiAmIFNEUkFNX0JYQ0ZfTV9CRV9NQVNLKSB7CisJCQkJLyogQmFuayBpcyBlbmFibGVkICovCisJCQkJbWVtYmFzZSA9IGdldF9tZW1iYXNlKGJ4Y3JfbnVtKTsKKwkJCQlwYXNzICY9IHNob3J0X21lbV90ZXN0KG1lbWJhc2UpOworCQkJfSAvKiBpZiBiYW5rIGVuYWJsZWQgKi8KKwkJfSAvKiBmb3IgYnhjZl9udW0gKi8KKworCQkvKiBJZiB0aGlzIHZhbHVlIHBhc3NlZCAqLworCQlpZiAocGFzcyAmJiAhaW5fd2luZG93KSB7CisJCQlpbl93aW5kb3cgPSAxOworCQkJY3Vycl93aW5fbWluID0gY3Vycl93aW5fbWF4ID0gcnFmZDsKKwkJfSBlbHNlIGlmICghcGFzcyAmJiBpbl93aW5kb3cpIHsKKwkJCWluX3dpbmRvdyA9IDA7CisJCX0gZWxzZSBpZiAocGFzcyAmJiBpbl93aW5kb3cpIHsKKwkJCWN1cnJfd2luX21heCA9IHJxZmQ7CisJCX0KKworCQlpZiAoaW5fd2luZG93KSB7CisJCQlpZiAoKGN1cnJfd2luX21heCAtIGN1cnJfd2luX21pbikgPgorCQkJICAgIChiZXN0X3dpbl9tYXggLSBiZXN0X3dpbl9taW4pKSB7CisJCQkJYmVzdF93aW5fbWluID0gY3Vycl93aW5fbWluOworCQkJCWJlc3Rfd2luX21heCA9IGN1cnJfd2luX21heDsKKwkJCX0KKwkJCXBhc3NlZCA9IDE7CisJCX0KKwl9IC8qIGZvciBycWZkICovCisKKwlpZiAoKGJlc3Rfd2luX21pbiA9PSAwKSAmJiAoYmVzdF93aW5fbWF4ID09IDApKQorCQlwYXNzZWQgPSAwOworCisJZGVidWcoIlJRRkQgTWluOiAweCV4XG4iLCBiZXN0X3dpbl9taW4pOworCWRlYnVnKCJSUUZEIE1heDogMHgleFxuIiwgYmVzdF93aW5fbWF4KTsKKwlycWZkX2F2ZXJhZ2UgPSAoKGJlc3Rfd2luX21pbiArIGJlc3Rfd2luX21heCkgLyAyKTsKKworCWlmIChycWZkX2F2ZXJhZ2UgPCAwKQorCQlycWZkX2F2ZXJhZ2UgPSAwOworCisJaWYgKHJxZmRfYXZlcmFnZSA+IFNEUkFNX1JRRENfUlFGRF9NQVgpCisJCXJxZmRfYXZlcmFnZSA9IFNEUkFNX1JRRENfUlFGRF9NQVg7CisKKwltdHNkcmFtKFNEUkFNX1JRREMsIChycWRjX3JlZyAmIH5TRFJBTV9SUURDX1JRRkRfTUFTSykgfAorCQkJCQlTRFJBTV9SUURDX1JRRkRfRU5DT0RFKHJxZmRfYXZlcmFnZSkpOworCisJbWZzZHJhbShTRFJBTV9SUURDLCBycWRjX3JlZyk7CisJbWZzZHJhbShTRFJBTV9SRkRDLCByZmRjX3JlZyk7CisKKwkvKgorCSAqIE5lZWQgdG8gcHJvZ3JhbSBSUURDIGJlZm9yZSBSRkRDLiBUaGUgdmFsdWUgaXMgcmVhZCBhYm92ZS4KKwkgKiBUaGF0IGlzIHRoZSByZWFzb24gd2h5IGF1dG8gY2FsIG5vdCB3b3JrLgorCSAqIFNlZSwgY29tbWVudHMgYmVsb3cuCisJICovCisJbXRzZHJhbShTRFJBTV9SUURDLCBycWRjX3JlZyk7CisJbXRzZHJhbShTRFJBTV9SRkRDLCByZmRjX3JlZyk7CisKKwlkZWJ1ZygiUlFEQzogMHglMDhYXG4iLCBycWRjX3JlZyk7CisJZGVidWcoIlJGREM6IDB4JTA4WFxuIiwgcmZkY19yZWcpOworCisJLyogaWYgc29tZXRoaW5nIHBhc3NlZCwgdGhlbiByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhcmdlc3Qgd2luZG93ICovCisJaWYgKHBhc3NlZCAhPSAwKSB7CisJCXBhc3NlZAkJPSBzaXplOworCQljYWwtPnJxZmQJPSBycWZkX2F2ZXJhZ2U7CisJCWNhbC0+cmZmZAk9IHJmZmRfYXZlcmFnZTsKKwl9CisKKwlyZXR1cm4gKHVpbnQpcGFzc2VkOworfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfTUVUSE9EX0EpICovCisKKy8qCisgKiBEZWZhdWx0IHRhYmxlIGZvciBERFIgYXV0by1jYWxpYnJhdGlvbiBvZiBhbGwKKyAqIHBvc3NpYmxlIFdSRFRSIGFuZCBDTEtUUiB2YWx1ZXMuCisgKiBUYWJsZSBmb3JtYXQgaXM6CisgKgkge1NEUkFNX1dSRFRSLltXRFRSXSwgU0RSQU1fQ0xLVFIuW0NLVFJdfQorICoKKyAqIFRhYmxlIGlzIHRlcm1pbmF0ZWQgd2l0aCB7LTEsIC0xfSB2YWx1ZSBwYWlyLgorICoKKyAqIEJvYXJkIHZlbmRvcnMgY2FuIHNwZWNpZnkgdGhlaXIgb3duIGJvYXJkIHNwZWNpZmljIHN1YnNldCBvZgorICoga25vd24gd29ya2luZyB7U0RSQU1fV1JEVFIuW1dEVFJdLCBTRFJBTV9DTEtUUi5bQ0tUUl19IHZhbHVlCisgKiBwYWlycyB2aWEgYSBib2FyZCBkZWZpbmVkIGRkcl9zY2FuX29wdGlvbigpIGZ1bmN0aW9uLgorICovCitzdHJ1Y3Qgc2RyYW1fdGltaW5nIGZ1bGxfc2Nhbl9vcHRpb25zW10gPSB7CisJezAsIDB9LCB7MCwgMX0sIHswLCAyfSwgezAsIDN9LAorCXsxLCAwfSwgezEsIDF9LCB7MSwgMn0sIHsxLCAzfSwKKwl7MiwgMH0sIHsyLCAxfSwgezIsIDJ9LCB7MiwgM30sCisJezMsIDB9LCB7MywgMX0sIHszLCAyfSwgezMsIDN9LAorCXs0LCAwfSwgezQsIDF9LCB7NCwgMn0sIHs0LCAzfSwKKwl7NSwgMH0sIHs1LCAxfSwgezUsIDJ9LCB7NSwgM30sCisJezYsIDB9LCB7NiwgMX0sIHs2LCAyfSwgezYsIDN9LAorCXstMSwgLTF9Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgRFFTX2NhbGlicmF0aW9uLgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordTMyIERRU19hdXRvY2FsaWJyYXRpb24odm9pZCkKK3sKKwl1MzIgd2R0cjsKKwl1MzIgY2xrcDsKKwl1MzIgcmVzdWx0ID0gMDsKKwl1MzIgYmVzdF9yZXN1bHQgPSAwOworCXUzMiBiZXN0X3JkY2M7CisJc3RydWN0IGRkcmF1dG9jYWwgZGRyY2FsOworCXN0cnVjdCBhdXRvY2FsX2Nsa3MgdGNhbDsKKwl1bG9uZyByZmRjX3JlZzsKKwl1bG9uZyBycWRjX3JlZzsKKwl1MzIgdmFsOworCWludCB2ZXJib3NlX2x2bCA9IDA7CisJY2hhciAqc3RyOworCWNoYXIgc2xhc2hbXSA9ICJcXHwvLVxcfC8tIjsKKwlpbnQgbG9vcGkgPSAwOworCXN0cnVjdCBzZHJhbV90aW1pbmcgKnNjYW5fbGlzdDsKKworI2lmIGRlZmluZWQoREVCVUdfUFBDNHh4X0REUl9BVVRPQ0FMSUJSQVRJT04pCisJaW50IGk7CisJY2hhciB0bXBbNjRdOwkvKiBsb25nIGVub3VnaCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisjZW5kaWYKKworCW1lbXNldCgmdGNhbCwgMCwgc2l6ZW9mKHRjYWwpKTsKKworCWRkcl9zY2FuX29wdGlvbigodWxvbmcpZnVsbF9zY2FuX29wdGlvbnMpOworCisJc2Nhbl9saXN0ID0KKwkgICAgICAoc3RydWN0IHNkcmFtX3RpbWluZyAqKWRkcl9zY2FuX29wdGlvbigodWxvbmcpZnVsbF9zY2FuX29wdGlvbnMpOworCisJbWZzZHJhbShTRFJBTV9NQ09QVDEsIHZhbCk7CisJaWYgKCh2YWwgJiBTRFJBTV9NQ09QVDFfTUNIS19DSEtfUkVQKSA9PSBTRFJBTV9NQ09QVDFfTUNIS19DSEtfUkVQKQorCQlzdHIgPSAiRUNDIEF1dG8gY2FsaWJyYXRpb24gLSI7CisJZWxzZQorCQlzdHIgPSAiQXV0byBjYWxpYnJhdGlvbiAtIjsKKworCXB1dHMoc3RyKTsKKworI2lmIGRlZmluZWQoREVCVUdfUFBDNHh4X0REUl9BVVRPQ0FMSUJSQVRJT04pCisJaSA9IGdldGVudl9yKCJhdXRvY2FsaWIiLCB0bXAsIHNpemVvZih0bXApKTsKKwlpZiAoaSA8IDApCisJCXN0cmNweSh0bXAsIENPTkZJR19BVVRPQ0FMSUIpOworCisJaWYgKHN0cmNtcCh0bXAsICJmaW5hbCIpID09IDApIHsKKwkJLyogZGlzcGxheSB0aGUgZmluYWwgYXV0b2NhbGlicmF0aW9uIHJlc3VsdHMgb25seSAqLworCQl2ZXJib3NlX2x2bCA9IDE7CisJfSBlbHNlIGlmIChzdHJjbXAodG1wLCAibG9vcCIpID09IDApIHsKKwkJLyogZGlzcGxheSBzdW1tYXJ5IGF1dG9jYWxpYnJhdGlvbiBpbmZvIHBlciBpdGVyYXRpb24gKi8KKwkJdmVyYm9zZV9sdmwgPSAyOworCX0gZWxzZSBpZiAoc3RyY21wKHRtcCwgImRpc3BsYXkiKSA9PSAwKSB7CisJCS8qIGRpc3BsYXkgZnVsbCBkZWJ1ZyBhdXRvY2FsaWJyYXRpb24gd2luZG93IGluZm8uICovCisJCXZlcmJvc2VfbHZsID0gMzsKKwl9CisjZW5kaWYgLyogKERFQlVHX1BQQzR4eF9ERFJfQVVUT0NBTElCUkFUSU9OKSAqLworCisJYmVzdF9yZGNjID0gKFNEUkFNX1JEQ0NfUkRTU19UNCA+PiAzMCk7CisKKwl3aGlsZSAoKHNjYW5fbGlzdC0+d3JkdHIgIT0gLTEpICYmIChzY2FuX2xpc3QtPmNsa3RyICE9IC0xKSkgeworCQl3ZHRyID0gc2Nhbl9saXN0LT53cmR0cjsKKwkJY2xrcCA9IHNjYW5fbGlzdC0+Y2xrdHI7CisKKwkJbWZzZHJhbShTRFJBTV9XUkRUUiwgdmFsKTsKKwkJdmFsICY9IH4oU0RSQU1fV1JEVFJfTExXUF9NQVNLIHwgU0RSQU1fV1JEVFJfV1RSX01BU0spOworCQltdHNkcmFtKFNEUkFNX1dSRFRSLCAodmFsIHwKKwkJCWRkcl93cmR0cihTRFJBTV9XUkRUUl9MTFdQXzFfQ1lDIHwgKHdkdHIgPDwgMjUpKSkpOworCisJCW10c2RyYW0oU0RSQU1fQ0xLVFIsIGNsa3AgPDwgMzApOworCisJCXJlbG9ja19tZW1vcnlfRExMKCk7CisKKwkJcHV0YygnXGInKTsKKwkJcHV0YyhzbGFzaFtsb29waSsrICUgOF0pOworCisjaWZkZWYgREVCVUcKKwkJZGVidWcoIlxuIik7CisJCWRlYnVnKCIqKiogLS0tLS0tLS0tLS0tLS1cbiIpOworCQltZnNkcmFtKFNEUkFNX1dSRFRSLCB2YWwpOworCQlkZWJ1ZygiKioqIFNEUkFNX1dSRFRSIHNldCB0byAweCUwOHhcbiIsIHZhbCk7CisJCW1mc2RyYW0oU0RSQU1fQ0xLVFIsIHZhbCk7CisJCWRlYnVnKCIqKiogU0RSQU1fQ0xLVFIgc2V0IHRvIDB4JTA4eFxuIiwgdmFsKTsKKyNlbmRpZgorCisJCWRlYnVnKCJcbiIpOworCQlpZiAodmVyYm9zZV9sdmwgPiAyKSB7CisJCQlwcmludGYoIioqKiBTRFJBTV9XUkRUUiAod2R0cikgc2V0IHRvICVkXG4iLCB3ZHRyKTsKKwkJCXByaW50ZigiKioqIFNEUkFNX0NMS1RSIChjbGtwKSBzZXQgdG8gJWRcbiIsIGNsa3ApOworCQl9CisKKwkJbWVtc2V0KCZkZHJjYWwsIDAsIHNpemVvZihkZHJjYWwpKTsKKworCQkvKgorCQkgKiBEUVMgY2FsaWJyYXRpb24uCisJCSAqLworCQkvKgorCQkgKiBwcm9ncmFtX0RRU19jYWxpYnJhdGlvbl9tZXRob2RbQXxCXSgpIHJldHVybnMgMCBpZiBubworCQkgKiBwYXNzaW5nIFJGREMuW1JGRkRdIHdpbmRvdyBpcyBmb3VuZCBvciByZXR1cm5zIHRoZSBzaXplCisJCSAqIG9mIHRoZSBiZXN0IHBhc3Npbmcgd2luZG93OyBpbiB0aGUgY2FzZSBvZiBhIGZvdW5kIHBhc3NpbmcKKwkJICogd2luZG93LCB0aGUgZGRyY2FsIHdpbGwgY29udGFpbiB0aGUgdmFsdWVzIG9mIHRoZSBiZXN0CisJCSAqIHdpbmRvdyBSUURDLltSUUZEXSBhbmQgUkZEQy5bUkZGRF0uCisJCSAqLworCisJCS8qCisJCSAqIENhbGwgUFBDNHh4IFNEUkFNIEREUiBhdXRvY2FsaWJyYXRpb24gbWV0aG9kQSBvciBtZXRob2RCLgorCQkgKiBEZWZhdWx0IGlzIG1ldGhvZEIuCisJCSAqIERlZmluZWQgdGhlIGF1dG9jYWxpYnJhdGlvbiBtZXRob2QgaW4gdGhlIGJvYXJkIHNwZWNpZmljCisJCSAqIGhlYWRlciBmaWxlLgorCQkgKiBQbGVhc2Ugc2VlIGluY2x1ZGUvY29uZmlncy9raWxhdWVhLmggZm9yIGFuIGV4YW1wbGUgZm9yCisJCSAqIGEgYm9hcmQgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCisJCSAqLworI2lmIGRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfTUVUSE9EX0EpCisJCXJlc3VsdCA9IHByb2dyYW1fRFFTX2NhbGlicmF0aW9uX21ldGhvZEEoJmRkcmNhbCk7CisjZWxzZQorCQlyZXN1bHQgPSBwcm9ncmFtX0RRU19jYWxpYnJhdGlvbl9tZXRob2RCKCZkZHJjYWwpOworI2VuZGlmCisKKwkJc3luYygpOworCisJCS8qCisJCSAqIENsZWFyIHBvdGVudGlhbCBlcnJvcnMgcmVzdWx0aW5nIGZyb20gYXV0by1jYWxpYnJhdGlvbi4KKwkJICogSWYgbm90IGRvbmUsIHRoZW4gd2UgY291bGQgZ2V0IGFuIGludGVycnVwdCBsYXRlciBvbiB3aGVuCisJCSAqIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQuCisJCSAqLworCQlzZXRfbWNzcihnZXRfbWNzcigpKTsKKworCQl2YWwgPSBkZHJjYWwucmRjYzsJLyogUkRDQyBmcm9tIHRoZSBiZXN0IHBhc3Npbmcgd2luZG93ICovCisKKwkJdWRlbGF5KDEwMCk7CisKKwkJaWYgKHZlcmJvc2VfbHZsID4gMSkgeworCQkJY2hhciAqdHN0cjsKKwkJCXN3aXRjaCAoKHZhbCA+PiAzMCkpIHsKKwkJCWNhc2UgMDoKKwkJCQlpZiAocmVzdWx0ICE9IDApCisJCQkJCXRzdHIgPSAiVDEiOworCQkJCWVsc2UKKwkJCQkJdHN0ciA9ICJOL0EiOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXRzdHIgPSAiVDIiOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXRzdHIgPSAiVDMiOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXRzdHIgPSAiVDQiOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0c3RyID0gInVua25vd24iOworCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRmKCIqKiBXUkRUUiglZCkgQ0xLVFIoJWQpLCBXaW5kICglZCksIGJlc3QgKCVkKSwgIgorCQkJICAgICAgICJtYXgtbWluKDB4JTA0eCkoMHglMDR4KSwgUkRDQzogJXNcbiIsCisJCQkJd2R0ciwgY2xrcCwgcmVzdWx0LCBiZXN0X3Jlc3VsdCwKKwkJCQlkZHJjYWwucmZmZF9taW4sIGRkcmNhbC5yZmZkX21heCwgdHN0cik7CisJCX0KKworCQkvKgorCQkgKiBUaGUgRFFTIGNhbGlicmF0aW9uICJyZXN1bHQiIGlzIGVpdGhlciAiMCIKKwkJICogaWYgbm8gcGFzc2luZyB3aW5kb3cgd2FzIGZvdW5kLCBvciBpcyB0aGUKKwkJICogc2l6ZSBvZiB0aGUgUkZGRCBwYXNzaW5nIHdpbmRvdy4KKwkJICovCisJCS8qCisJCSAqIHdhbnQgdGhlIGxvd2VzdCBSZWFkIFNhbXBsZSBDeWNsZSBTZWxlY3QKKwkJICovCisJCXZhbCA9IFNEUkFNX1JEQ0NfUkRTU19ERUNPREUodmFsKTsKKwkJZGVidWcoIioqKiAoJWQpICglZCkgY3VycmVudF9yZGNjLCBiZXN0X3JkY2NcbiIsCisJCQl2YWwsIGJlc3RfcmRjYyk7CisKKwkJaWYgKChyZXN1bHQgIT0gMCkgJiYKKwkJICAgICh2YWwgPj0gU0RSQU1fUkRDQ19SRFNTX1ZBTChTRFJBTV9SRENDX1JEU1NfVDIpKSkgeworCQkJaWYgKCgocmVzdWx0ID09IGJlc3RfcmVzdWx0KSAmJiAodmFsIDwgYmVzdF9yZGNjKSkgfHwKKwkJCSAgICAoKHJlc3VsdCA+IGJlc3RfcmVzdWx0KSAmJiAodmFsIDw9IGJlc3RfcmRjYykpKSB7CisJCQkJdGNhbC5hdXRvY2FsLmZsYWdzID0gMTsKKwkJCQlkZWJ1ZygiKioqICglZCkoJWQpIHJlc3VsdCBwYXNzZWQgd2luZG93ICIKKwkJCQkJInNpemU6IDB4JTA4eCwgcnFmZCA9IDB4JTA4eCwgIgorCQkJCQkicmZmZCA9IDB4JTA4eCwgcmRjYyA9IDB4JTA4eFxuIiwKKwkJCQkJd2R0ciwgY2xrcCwgcmVzdWx0LCBkZHJjYWwucnFmZCwKKwkJCQkJZGRyY2FsLnJmZmQsIGRkcmNhbC5yZGNjKTsKKworCQkJCS8qCisJCQkJICogU2F2ZSB0aGUgU0RSQU1fV1JEVFIgYW5kIFNEUkFNX0NMS1RSCisJCQkJICogc2V0dGluZ3MgZm9yIHRoZSBsYXJnZXN0IHJldHVybmVkCisJCQkJICogUkZGRCBwYXNzaW5nIHdpbmRvdyBzaXplLgorCQkJCSAqLworCQkJCWJlc3RfcmRjYyA9IHZhbDsKKwkJCQl0Y2FsLmNsb2Nrcy53cmR0ciA9IHdkdHI7CisJCQkJdGNhbC5jbG9ja3MuY2xrdHIgPSBjbGtwOworCQkJCXRjYWwuY2xvY2tzLnJkY2MgPSBTRFJBTV9SRENDX1JEU1NfRU5DT0RFKHZhbCk7CisJCQkJdGNhbC5hdXRvY2FsLnJxZmQgPSBkZHJjYWwucnFmZDsKKwkJCQl0Y2FsLmF1dG9jYWwucmZmZCA9IGRkcmNhbC5yZmZkOworCQkJCWJlc3RfcmVzdWx0ID0gcmVzdWx0OworCisJCQkJCWlmICh2ZXJib3NlX2x2bCA+IDIpIHsKKwkJCQkJCXByaW50ZigiKiogKCVkKSglZCkgICIKKwkJCQkJCSAgICAgICAiYmVzdCByZXN1bHQ6IDB4JTA0eFxuIiwKKwkJCQkJCQl3ZHRyLCBjbGtwLAorCQkJCQkJCWJlc3RfcmVzdWx0KTsKKwkJCQkJCXByaW50ZigiKiogKCVkKSglZCkgICIKKwkJCQkJCSAgICAgICAiYmVzdCBXUkRUUjogMHglMDR4XG4iLAorCQkJCQkJCXdkdHIsIGNsa3AsCisJCQkJCQkJdGNhbC5jbG9ja3Mud3JkdHIpOworCQkJCQkJcHJpbnRmKCIqKiAoJWQpKCVkKSAgIgorCQkJCQkJICAgICAgICJiZXN0IENMS1RSOiAweCUwNHhcbiIsCisJCQkJCQkJd2R0ciwgY2xrcCwKKwkJCQkJCQl0Y2FsLmNsb2Nrcy5jbGt0cik7CisJCQkJCQlwcmludGYoIioqICglZCkoJWQpICAiCisJCQkJCQkgICAgICAgImJlc3QgUlFEQzogMHglMDR4XG4iLAorCQkJCQkJCXdkdHIsIGNsa3AsCisJCQkJCQkJdGNhbC5hdXRvY2FsLnJxZmQpOworCQkJCQkJcHJpbnRmKCIqKiAoJWQpKCVkKSAgIgorCQkJCQkJICAgICAgICJiZXN0IFJGREM6IDB4JTA0eFxuIiwKKwkJCQkJCQl3ZHRyLCBjbGtwLAorCQkJCQkJCXRjYWwuYXV0b2NhbC5yZmZkKTsKKwkJCQkJCXByaW50ZigiKiogKCVkKSglZCkgICIKKwkJCQkJCSAgICAgICAiYmVzdCBSRENDOiAweCUwOHhcbiIsCisJCQkJCQkJd2R0ciwgY2xrcCwKKwkJCQkJCQkodTMyKXRjYWwuY2xvY2tzLnJkY2MpOworCQkJCQkJbWZzZHJhbShTRFJBTV9SVFNSLCB2YWwpOworCQkJCQkJcHJpbnRmKCIqKiAoJWQpKCVkKSAgYmVzdCAiCisJCQkJCQkgICAgICAgImxvb3AgUlRTUjogMHglMDh4XG4iLAorCQkJCQkJCXdkdHIsIGNsa3AsIHZhbCk7CisJCQkJCQltZnNkcmFtKFNEUkFNX0ZDU1IsIHZhbCk7CisJCQkJCQlwcmludGYoIioqICglZCkoJWQpICBiZXN0ICIKKwkJCQkJCSAgICAgICAibG9vcCBGQ1NSOiAweCUwOHhcbiIsCisJCQkJCQkJd2R0ciwgY2xrcCwgdmFsKTsKKwkJCQkJfQorCQkJfQorCQl9IC8qIGlmICgocmVzdWx0ICE9IDApICYmICh2YWwgPj0gKGRkcl9yZHNzX29wdCgpKSkpICovCisJCXNjYW5fbGlzdCsrOworCX0gLyogd2hpbGUgKChzY2FuX2xpc3QtPndyZHRyICE9IC0xKSAmJiAoc2Nhbl9saXN0LT5jbGt0ciAhPSAtMSkpICovCisKKwlpZiAodGNhbC5hdXRvY2FsLmZsYWdzID09IDEpIHsKKwkJaWYgKHZlcmJvc2VfbHZsID4gMCkgeworCQkJcHJpbnRmKCIqKiogLS0tLS0tLS0tLS0tLS1cbiIpOworCQkJcHJpbnRmKCIqKiogYmVzdF9yZXN1bHQgd2luZG93IHNpemU6ICVkXG4iLAorCQkJCQkJCWJlc3RfcmVzdWx0KTsKKwkJCXByaW50ZigiKioqIGJlc3RfcmVzdWx0IFdSRFRSOiAweCUwNHhcbiIsCisJCQkJCQkJdGNhbC5jbG9ja3Mud3JkdHIpOworCQkJcHJpbnRmKCIqKiogYmVzdF9yZXN1bHQgQ0xLVFI6IDB4JTA0eFxuIiwKKwkJCQkJCQl0Y2FsLmNsb2Nrcy5jbGt0cik7CisJCQlwcmludGYoIioqKiBiZXN0X3Jlc3VsdCBSUUZEOiAweCUwNHhcbiIsCisJCQkJCQkJdGNhbC5hdXRvY2FsLnJxZmQpOworCQkJcHJpbnRmKCIqKiogYmVzdF9yZXN1bHQgUkZGRDogMHglMDR4XG4iLAorCQkJCQkJCXRjYWwuYXV0b2NhbC5yZmZkKTsKKwkJCXByaW50ZigiKioqIGJlc3RfcmVzdWx0IFJEQ0M6IDB4JTA0eFxuIiwKKwkJCQkJCQl0Y2FsLmNsb2Nrcy5yZGNjKTsKKwkJCXByaW50ZigiKioqIC0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCisJCS8qCisJCSAqIGlmIGdvdCBiZXN0IHBhc3NpbmcgcmVzdWx0IHdpbmRvdywgdGhlbiBsb2NrIGluIHRoZQorCQkgKiBiZXN0IENMS1RSLCBXUkRUUiwgUlFGRCwgYW5kIFJGRkQgdmFsdWVzCisJCSAqLworCQltZnNkcmFtKFNEUkFNX1dSRFRSLCB2YWwpOworCQltdHNkcmFtKFNEUkFNX1dSRFRSLCAodmFsICYKKwkJICAgIH4oU0RSQU1fV1JEVFJfTExXUF9NQVNLIHwgU0RSQU1fV1JEVFJfV1RSX01BU0spKSB8CisJCSAgICBkZHJfd3JkdHIoU0RSQU1fV1JEVFJfTExXUF8xX0NZQyB8CisJCQkJCSh0Y2FsLmNsb2Nrcy53cmR0ciA8PCAyNSkpKTsKKworCQltdHNkcmFtKFNEUkFNX0NMS1RSLCB0Y2FsLmNsb2Nrcy5jbGt0ciA8PCAzMCk7CisKKwkJcmVsb2NrX21lbW9yeV9ETEwoKTsKKworCQltZnNkcmFtKFNEUkFNX1JRREMsIHJxZGNfcmVnKTsKKwkJcnFkY19yZWcgJj0gfihTRFJBTV9SUURDX1JRRkRfTUFTSyk7CisJCW10c2RyYW0oU0RSQU1fUlFEQywgcnFkY19yZWcgfAorCQkJCVNEUkFNX1JRRENfUlFGRF9FTkNPREUodGNhbC5hdXRvY2FsLnJxZmQpKTsKKworCQltZnNkcmFtKFNEUkFNX1JRREMsIHJxZGNfcmVnKTsKKwkJZGVidWcoIioqKiBiZXN0X3Jlc3VsdDogcmVhZCB2YWx1ZSBTRFJBTV9SUURDIDB4JTA4eFxuIiwKKwkJCQlycWRjX3JlZyk7CisKKwkJbWZzZHJhbShTRFJBTV9SRkRDLCByZmRjX3JlZyk7CisJCXJmZGNfcmVnICY9IH4oU0RSQU1fUkZEQ19SRkZEX01BU0spOworCQltdHNkcmFtKFNEUkFNX1JGREMsIHJmZGNfcmVnIHwKKwkJCQlTRFJBTV9SRkRDX1JGRkRfRU5DT0RFKHRjYWwuYXV0b2NhbC5yZmZkKSk7CisKKwkJbWZzZHJhbShTRFJBTV9SRkRDLCByZmRjX3JlZyk7CisJCWRlYnVnKCIqKiogYmVzdF9yZXN1bHQ6IHJlYWQgdmFsdWUgU0RSQU1fUkZEQyAweCUwOHhcbiIsCisJCQkJcmZkY19yZWcpOworCQltZnNkcmFtKFNEUkFNX1JEQ0MsIHZhbCk7CisJCWRlYnVnKCIqKiogIFNEUkFNX1JEQ0MgMHglMDh4XG4iLCB2YWwpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIG5vIHZhbGlkIHdpbmRvd3Mgd2VyZSBmb3VuZAorCQkgKi8KKwkJcHJpbnRmKCJEUVMgbWVtb3J5IGNhbGlicmF0aW9uIHdpbmRvdyBjYW4gbm90IGJlIGRldGVybWluZWQsICIKKwkJICAgICAgICJ0ZXJtaW5hdGluZyB1LWJvb3QuXG4iKTsKKwkJcHBjNHh4X2libV9kZHIyX3JlZ2lzdGVyX2R1bXAoKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcoKTsKKwl9CisKKwlibGFua19zdHJpbmcoc3RybGVuKHN0cikpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZSAvKiBkZWZpbmVkKENPTkZJR19OQU5EX1VfQk9PVCkgfHwgZGVmaW5lZChDT05GSUdfTkFORF9TUEwpICovCit1MzIgRFFTX2F1dG9jYWxpYnJhdGlvbih2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qICFkZWZpbmVkKENPTkZJR19OQU5EX1VfQk9PVCkgJiYgIWRlZmluZWQoQ09ORklHX05BTkRfU1BMKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BQQzR4eF9ERFJfQVVUT0NBTElCUkFUSU9OKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvNHh4X3BjaS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvNHh4X3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDQ1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80eHhfcGNpLmMKQEAgLTAsMCArMSw4NzMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICAgICBUaGlzIHNvdXJjZSBjb2RlIGlzIGR1YWwtbGljZW5zZWQuICBZb3UgbWF5IHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqICAgICAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgbGljZW5zZSB2ZXJzaW9uIDIsIG9yIHVuZGVyIHRoZSBsaWNlbnNlIGJlbG93LgorICoKKyAqICAgICAgIFRoaXMgc291cmNlIGNvZGUgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8geW91IGJ5IElCTSBvbiBhbiBBUy1JUworICogICAgICAgYmFzaXMuICBBbnlvbmUgcmVjZWl2aW5nIHRoaXMgc291cmNlIGlzIGxpY2Vuc2VkIHVuZGVyIElCTQorICogICAgICAgY29weXJpZ2h0cyB0byB1c2UgaXQgaW4gYW55IHdheSBoZSBvciBzaGUgZGVlbXMgZml0LCBpbmNsdWRpbmcKKyAqICAgICAgIGNvcHlpbmcgaXQsIG1vZGlmeWluZyBpdCwgY29tcGlsaW5nIGl0LCBhbmQgcmVkaXN0cmlidXRpbmcgaXQgZWl0aGVyCisgKiAgICAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucy4gIE5vIGxpY2Vuc2UgdW5kZXIgSUJNIHBhdGVudHMgb3IKKyAqICAgICAgIHBhdGVudCBhcHBsaWNhdGlvbnMgaXMgdG8gYmUgaW1wbGllZCBieSB0aGUgY29weXJpZ2h0IGxpY2Vuc2UuCisgKgorICogICAgICAgQW55IHVzZXIgb2YgdGhpcyBzb2Z0d2FyZSBzaG91bGQgdW5kZXJzdGFuZCB0aGF0IElCTSBjYW5ub3QgcHJvdmlkZQorICogICAgICAgdGVjaG5pY2FsIHN1cHBvcnQgZm9yIHRoaXMgc29mdHdhcmUgYW5kIHdpbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvcgorICogICAgICAgYW55IGNvbnNlcXVlbmNlcyByZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogICAgICAgQW55IHBlcnNvbiB3aG8gdHJhbnNmZXJzIHRoaXMgc291cmNlIGNvZGUgb3IgYW55IGRlcml2YXRpdmUgd29yaworICogICAgICAgbXVzdCBpbmNsdWRlIHRoZSBJQk0gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBwYXJhZ3JhcGgsIGFuZCB0aGUKKyAqICAgICAgIHByZWNlZGluZyB0d28gcGFyYWdyYXBocyBpbiB0aGUgdHJhbnNmZXJyZWQgc29mdHdhcmUuCisgKgorICogICAgICAgQ09QWVJJR0hUICAgSSBCIE0gICBDT1JQT1JBVElPTiAxOTk1CisgKiAgICAgICBMSUNFTlNFRCBNQVRFUklBTCAgLSAgUFJPR1JBTSBQUk9QRVJUWSBPRiBJIEIgTQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogIEZpbGUgTmFtZTogICA0MDVncF9wY2kuYworICoKKyAqICBGdW5jdGlvbjogICAgSW5pdGlhbGl6YXRpb24gY29kZSBmb3IgdGhlIDQwNUdQIFBDSSBDb25maWd1cmF0aW9uIHJlZ3MuCisgKgorICogIEF1dGhvcjogICAgICBNYXJrIEdhbWUKKyAqCisgKiAgQ2hhbmdlIEFjdGl2aXR5LQorICoKKyAqICBEYXRlICAgICAgICBEZXNjcmlwdGlvbiBvZiBDaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWQorICogIC0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLQorICogIDA5LVNlcC05OCAgIENyZWF0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DRworICogIDAyLU5vdi05OCAgIFJlbW92ZWQgRXh0ZXJuYWwgYXJiaXRlciBzZWxlY3RlZCBtZXNzYWdlICAgICAgICAgICAgICAgICAgIEpXQgorICogIDI3LU5vdi05OCAgIFplcm8gb3V0IFBUTUJBUjIgYW5kIGRpc2FibGUgaW4gUFRNMk1TICAgICAgICAgICAgICAgICAgICAgIEpXQgorICogIDA0LUphbi05OSAgIFplcm8gb3V0IG90aGVyIHVudXNlZCBQTU0gYW5kIFBUTSByZWdzLiBDaGFuZ2UgYnVzIHNjYW4gICAgIE1DRworICogICAgICAgICAgICAgIGZyb20gKDAgdG8gbikgdG8gKDEgdG8gbikuCisgKiAgMTctTWF5LTk5ICAgUG9ydCB0byBXYWxudXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSldCCisgKiAgMTctSnVuLTk5ICAgVXBkYXRlZCBmb3IgVkdBIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSldCCisgKiAgMjEtSnVuLTk5ICAgVXBkYXRlZCB0byBhbGxvdyBTUkFNIHJlZ2lvbiB0byBiZSBhIHRhcmdldCBmcm9tIFBDSSBidXMgICAgSldCCisgKiAgMTktSnVsLTk5ICAgVXBkYXRlZCBmb3IgNDA1R1AgcGFzcyAxIGVycmF0YSAjMjYgKExvdyBQQ0kgc3Vic2VxdWVudCAgICAgTUNHCisgKiAgICAgICAgICAgICAgdGFyZ2V0IGxhdGVuY3kgdGltZXIgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkKS4KKyAqICAgICAgICAgICAgICBTaG91bGQgYmUgZml4ZWQgaW4gcGFzcyAyLgorICogIDA5LVNlcC05OSAgIFJlbW92ZWQgdXNlIG9mIFBUTTIgc2luY2UgdGhlIFNSQU0gcmVnaW9uIG5vIGxvbmdlciBuZWVkcyAgIEpXQgorICogICAgICAgICAgICAgIHRvIGJlIGEgUENJIHRhcmdldC4gWmVybyBvdXQgUFRNQkFSMiBhbmQgZGlzYWJsZSBpbiBQVE0yTVMuCisgKiAgMTAtRGVjLTk5ICAgVXBkYXRlZCBQQ0lfV3JpdGVfQ0ZHX1JlZyBmb3IgcGFzczIgZXJyYXRhICM2ICAgICAgICAgICAgICAgSldCCisgKiAgMTEtSmFuLTAwICAgRW5zdXJlIFBNTXhNQXMgZGlzYWJsZWQgYmVmb3JlIHNldHRpbmcgUE1NeExBcy4gVGhpcyBpcyBub3QKKyAqICAgICAgICAgICAgICByZWFsbHkgcmVxdWlyZWQgYWZ0ZXIgYSByZXNldCBzaW5jZSBQTU14TUFzIGFyZSBhbHJlYWR5CisgKgkgICAgICAgIGRpc2FibGVkIGJ1dCBpcyBhIGdvb2QgcHJhY3RpY2Ugbm9uZXRoZWxlc3MuICAgICAgICAgICAgICAgIEpXQgorICogIDEyLUp1bi0wMSAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICAgICAgLSBQQ0kgaG9zdC9hZGFwdGVyIGhhbmRsaW5nIHJld29ya2VkCisgKiAgMDktSnVsLTAxICAgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqICAgICAgICAgICAgICAtIFBDSSBob3N0IG5vdyBjb25maWd1cmVzIGZyb20gZGV2aWNlIDAgKG5vdCAxKSB0byBtYXhfZGV2LAorICogICAgICAgICAgICAgICAgKGhvc3QgY29uZmlndXJlcyBpdHNlbGYpCisgKiAgICAgICAgICAgICAgLSBPbiBDUENJLTQwNSBwY2kgYmFzZSBhZGRyZXNzIGFuZCBzaXplIGlzIGdlbmVyYXRlZCBmcm9tCisgKiAgICAgICAgICAgICAgICBTRFJBTSBhbmQgRkxBU0ggc2l6ZSAoQ0ZHIHJlZ3Mgbm90IHVzZWQgYW55bW9yZSkKKyAqICAgICAgICAgICAgICAtIFNvbWUgbWlub3IgY2hhbmdlcyBmb3IgQ1BDSS00MDUtQSAoYWRhcHRlciB2ZXJzaW9uKQorICogIDE0LVNlcC0wMSAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICAgICAgLSBDT05GSUdfUENJX1NDQU5fU0hPVyBhZGRlZCB0byBwcmludCBwY2kgZGV2aWNlcyB1cG9uIHN0YXJ0dXAKKyAqICAyOC1TZXAtMDEgICBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICogICAgICAgICAgICAgIC0gQ2hhbmdlZCBwY2kgbWFzdGVyIGNvbmZpZ3VyYXRpb24gZm9yIGxpbnV4IGNvbXBhdGliaWxpdHkKKyAqICAgICAgICAgICAgICAgIChubyBuZWVkIGZvciBiaW9zX2ZpeHVwKCkgYW55bW9yZSkKKyAqICAyNi1GZWItMDIgICBzdGVmYW4ucm9lc2VAZXNkLWVsZWN0cm9uaWNzLmNvbQorICogICAgICAgICAgICAgIC0gQnVnIGZpeGVkIGluIHBjaSBjb25maWd1cmF0aW9uIChBbmRyZXcgTWF5KQorICogICAgICAgICAgICAgIC0gUmVtb3ZlZCBwY2kgY2xhc3MgY29kZSBpbml0IGZvciBDUENJNDA1IGJvYXJkCisgKiAgMTUtTWF5LTAyICAgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqICAgICAgICAgICAgICAtIE5ldyB2Z2EgZGV2aWNlIGhhbmRsaW5nCisgKiAgMjktTWF5LTAyICAgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KKyAqICAgICAgICAgICAgICAtIFBDSSBjbGFzcyBjb2RlIGluaXQgYWRkZWQgKGlmIGRlZmluZWQpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS80eHhfcGNpLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisjaWZkZWYgQ09ORklHX1BDSQorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBkZWZpbmVkKENPTkZJR180MDVFUCkKKworI2lmIGRlZmluZWQoQ09ORklHX1BNQzQwNSkKK3VzaG9ydCBwbWM0MDVfcGNpX3N1YnN5c19kZXZpY2VpZCh2b2lkKTsKKyNlbmRpZgorCisvKiNkZWZpbmUgREVCVUcqLworCisvKgorICogQm9hcmQtc3BlY2lmaWMgcGNpIGluaXRpYWxpemF0aW9uCisgKiBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBwY2lfcHJlX2luaXQoKSBpZiBuZWVkZWQKKyAqLworaW50IF9fcGNpX3ByZV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR180MDVFUCkKKwkvKgorCSAqIEVuYWJsZSB0aGUgaW50ZXJuYWwgUENJIGFyYml0ZXIgYnkgZGVmYXVsdC4KKwkgKgorCSAqIE9uIDQwNUVQIENQVXMgdGhlIGludGVybmFsIGFyYml0ZXIgY2FuIGJlIGNvbnRyb2xsZWQKKwkgKiBieSB0aGUgSTJDIHN0cmFwcGluZyBFRVBST00uIElmIHlvdSB3YW50IHRvIGRvIHNvCisJICogb3IgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGUgYXJiaXRlciBwY2lfcHJlX2luaXQoKQorCSAqIG11c3QgYmUgcmVpbXBsZW1lbnRlZCB3aXRob3V0IGVuYWJsaW5nIHRoZSBhcmJpdGVyLgorCSAqIFRoZSBhcmJpdGVyIGlzIGVuYWJsZWQgaW4gdGhpcyBwbGFjZSBiZWNhdXNlIG9mCisJICogY29tcGF0aWJpbGl0eSByZWFzb25zLgorCSAqLworCW10ZGNyKENQQzBfUENJLCBtZmRjcihDUEMwX1BDSSkgfCBDUEMwX1BDSV9BUkJJVF9FTik7CisjZW5kaWYgLyogQ09ORklHXzQwNUVQICovCisKKwlyZXR1cm4gMTsKK30KK2ludCBwY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQorCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3BjaV9wcmVfaW5pdCIpKSk7CisKK2ludCBfX2lzX3BjaV9ob3N0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR180MDVHUCkKKwlpZiAobWZkY3IoQ1BDMF9QU1IpICYgUFNSX1BDSV9BUkJJVF9FTikKKwkJcmV0dXJuIDE7CisjZWxpZiBkZWZpbmVkIChDT05GSUdfNDA1RVApCisJaWYgKG1mZGNyKENQQzBfUENJKSAmIENQQzBfUENJX0FSQklUX0VOKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworfQoraW50IGlzX3BjaV9ob3N0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkgX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9faXNfcGNpX2hvc3QiKSkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogcGNpX2luaXQuICBJbml0aWFsaXplcyB0aGUgNDA1R1AgUENJIENvbmZpZ3VyYXRpb24gcmVncy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBwY2lfNDA1Z3BfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJaW50IGksIHJlZ19udW0gPSAwOworCWJkX3QgKmJkID0gZ2QtPmJkOworCisJdW5zaWduZWQgc2hvcnQgdGVtcF9zaG9ydDsKKwl1bnNpZ25lZCBsb25nIHB0bXBjaWxhWzJdID0ge0NPTkZJR19TWVNfUENJX1BUTTFQQ0ksIENPTkZJR19TWVNfUENJX1BUTTJQQ0l9OworI2lmIGRlZmluZWQoQ09ORklHX1BDSV80eHhfUFRNX09WRVJXUklURSkKKwljaGFyICpwdG1sYV9zdHIsICpwdG1tc19zdHI7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIHB0bWxhWzJdICAgID0ge0NPTkZJR19TWVNfUENJX1BUTTFMQSwgQ09ORklHX1NZU19QQ0lfUFRNMkxBfTsKKwl1bnNpZ25lZCBsb25nIHB0bW1zWzJdICAgID0ge0NPTkZJR19TWVNfUENJX1BUTTFNUywgQ09ORklHX1NZU19QQ0lfUFRNMk1TfTsKKyNpZiBkZWZpbmVkKENPTkZJR19QSVA0MDUpIHx8IGRlZmluZWQgKENPTkZJR19NSVA0MDUpCisJdW5zaWduZWQgbG9uZyBwbW1sYVszXSAgICA9IHsweDgwMDAwMDAwLCAweEEwMDAwMDAwLCAwfTsKKwl1bnNpZ25lZCBsb25nIHBtbW1hWzNdICAgID0gezB4RTAwMDAwMDEsIDB4RTAwMDAwMDEsIDB9OworCXVuc2lnbmVkIGxvbmcgcG1tcGNpbGFbM10gPSB7MHg4MDAwMDAwMCwgMHgwMDAwMDAwMCwgMH07CisJdW5zaWduZWQgbG9uZyBwbW1wY2loYVszXSA9IHsweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAwfTsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBwbW1sYVszXSAgICA9IHsweDgwMDAwMDAwLCAwLDB9OworCXVuc2lnbmVkIGxvbmcgcG1tbWFbM10gICAgPSB7MHhDMDAwMDAwMSwgMCwwfTsKKwl1bnNpZ25lZCBsb25nIHBtbXBjaWxhWzNdID0gezB4ODAwMDAwMDAsIDAsMH07CisJdW5zaWduZWQgbG9uZyBwbW1wY2loYVszXSA9IHsweDAwMDAwMDAwLCAwLDB9OworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSV9QTlAKKyNpZiAoQ09ORklHX1BDSV9IT1NUID09IFBDSV9IT1NUX0FVVE8pCisJY2hhciAqczsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0lfNHh4X1BUTV9PVkVSV1JJVEUpCisJcHRtbGFfc3RyID0gZ2V0ZW52KCJwdG0xbGEiKTsKKwlwdG1tc19zdHIgPSBnZXRlbnYoInB0bTFtcyIpOworCWlmKE5VTEwgIT0gcHRtbGFfc3RyICYmIE5VTEwgIT0gcHRtbXNfc3RyICkgeworCSAgICAgICAgcHRtbGFbMF0gPSBzaW1wbGVfc3RydG91bCAocHRtbGFfc3RyLCBOVUxMLCAxNik7CisJCXB0bW1zWzBdID0gc2ltcGxlX3N0cnRvdWwgKHB0bW1zX3N0ciwgTlVMTCwgMTYpOworCX0KKworCXB0bWxhX3N0ciA9IGdldGVudigicHRtMmxhIik7CisJcHRtbXNfc3RyID0gZ2V0ZW52KCJwdG0ybXMiKTsKKwlpZihOVUxMICE9IHB0bWxhX3N0ciAmJiBOVUxMICE9IHB0bW1zX3N0ciApIHsKKwkgICAgICAgIHB0bWxhWzFdID0gc2ltcGxlX3N0cnRvdWwgKHB0bWxhX3N0ciwgTlVMTCwgMTYpOworCQlwdG1tc1sxXSA9IHNpbXBsZV9zdHJ0b3VsIChwdG1tc19zdHIsIE5VTEwsIDE2KTsKKwl9CisjZW5kaWYKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIGhvc2UKKwkgKi8KKwlob3NlLT5maXJzdF9idXNubyA9IDA7CisJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CisKKwkvKiBJU0EvUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyByZWdfbnVtKyssCisJCSAgICAgICBNSU5fUENJX1BDSV9JT0FERFIsCisJCSAgICAgICBNSU5fUExCX1BDSV9JT0FERFIsCisJCSAgICAgICAweDEwMDAwLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkvKiBQQ0kgSS9PIHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIHJlZ19udW0rKywKKwkJICAgICAgIDB4MDA4MDAwMDAsCisJCSAgICAgICAweGU4ODAwMDAwLAorCQkgICAgICAgMHgwMzgwMDAwMCwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJcmVnX251bSA9IDI7CisKKwkvKiBNZW1vcnkgc3BhY2VzICovCisJZm9yIChpPTA7IGk8MjsgaSsrKQorCQlpZiAocHRtbXNbaV0gJiAxKQorCQl7CisJCQlpZiAoIWkpIGhvc2UtPnBjaV9mYiA9IGhvc2UtPnJlZ2lvbnMgKyByZWdfbnVtOworCisJCQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgcmVnX251bSsrLAorCQkJCSAgICAgICBwdG1wY2lsYVtpXSwgcHRtbGFbaV0sCisJCQkJICAgICAgIH4ocHRtbXNbaV0gJiAweGZmZmZmMDAwKSArIDEsCisJCQkJICAgICAgIFBDSV9SRUdJT05fTUVNIHwKKwkJCQkgICAgICAgUENJX1JFR0lPTl9TWVNfTUVNT1JZKTsKKwkJfQorCisJLyogUENJIG1lbW9yeSBzcGFjZXMgKi8KKwlmb3IgKGk9MDsgaTwzOyBpKyspCisJCWlmIChwbW1tYVtpXSAmIDEpCisJCXsKKwkJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyByZWdfbnVtKyssCisJCQkJICAgICAgIHBtbXBjaWxhW2ldLCBwbW1sYVtpXSwKKwkJCQkgICAgICAgfihwbW1tYVtpXSAmIDB4ZmZmZmYwMDApICsgMSwKKwkJCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOworCQl9CisKKwlob3NlLT5yZWdpb25fY291bnQgPSByZWdfbnVtOworCisJcGNpX3NldHVwX2luZGlyZWN0KGhvc2UsCisJCQkgICBQQ0lDRkdBRFIsCisJCQkgICBQQ0lDRkdEQVRBKTsKKworCWlmIChob3NlLT5wY2lfZmIpCisJCXBjaWF1dG9fcmVnaW9uX2luaXQoaG9zZS0+cGNpX2ZiKTsKKworCS8qIExldCBib2FyZCBjaGFuZ2UvbW9kaWZ5IGhvc2UgJiBkbyBpbml0aWFsIGNoZWNrcyAqLworCWlmIChwY2lfcHJlX2luaXQoaG9zZSkgPT0gMCkgeworCQlwcmludGYoIlBDSTogQm9hcmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJCXByaW50ZigiUENJOiBDb25maWd1cmF0aW9uIGFib3J0ZWQuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXBjaV9yZWdpc3Rlcl9ob3NlKGhvc2UpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiA0MDVHUCBQQ0kgTWFzdGVyIGNvbmZpZ3VyYXRpb24uCisJICogTWFwIG9uZSA1MTIgTUIgcmFuZ2Ugb2YgUExCL3Byb2Nlc3NvciBhZGRyZXNzZXMgdG8gUENJIG1lbW9yeSBzcGFjZS4KKwkgKiBQTEIgYWRkcmVzcyAweDgwMDAwMDAwLTB4QkZGRkZGRkYgPT0+IFBDSSBhZGRyZXNzIDB4ODAwMDAwMDAtMHhCRkZGRkZGRgorCSAqIFVzZSBieXRlIHJldmVyc2VkIG91dCByb3V0aW5lcyB0byBoYW5kbGUgZW5kaWFuZXNzLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW91dDMycihQTU0wTUEsICAgIChwbW1tYVswXSZ+MHgxKSk7IC8qIGRpc2FibGUsIGNvbmZpZ3VyZSBQTU14TEEsIFBNTXhQQ0lMQSBmaXJzdCAqLworCW91dDMycihQTU0wTEEsICAgIHBtbWxhWzBdKTsKKwlvdXQzMnIoUE1NMFBDSUxBLCBwbW1wY2lsYVswXSk7CisJb3V0MzJyKFBNTTBQQ0lIQSwgcG1tcGNpaGFbMF0pOworCW91dDMycihQTU0wTUEsICAgIHBtbW1hWzBdKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogUE1NMSBpcyBub3QgdXNlZC4gIEluaXRpYWxpemUgdGhlbSB0byB6ZXJvLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW91dDMycihQTU0xTUEsICAgIChwbW1tYVsxXSZ+MHgxKSk7CisJb3V0MzJyKFBNTTFMQSwgICAgcG1tbGFbMV0pOworCW91dDMycihQTU0xUENJTEEsIHBtbXBjaWxhWzFdKTsKKwlvdXQzMnIoUE1NMVBDSUhBLCBwbW1wY2loYVsxXSk7CisJb3V0MzJyKFBNTTFNQSwgICAgcG1tbWFbMV0pOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBQTU0yIGlzIG5vdCB1c2VkLiAgSW5pdGlhbGl6ZSB0aGVtIHRvIHplcm8uCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJb3V0MzJyKFBNTTJNQSwgICAgKHBtbW1hWzJdJn4weDEpKTsKKwlvdXQzMnIoUE1NMkxBLCAgICBwbW1sYVsyXSk7CisJb3V0MzJyKFBNTTJQQ0lMQSwgcG1tcGNpbGFbMl0pOworCW91dDMycihQTU0yUENJSEEsIHBtbXBjaWhhWzJdKTsKKwlvdXQzMnIoUE1NMk1BLCAgICBwbW1tYVsyXSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIDQwNUdQIFBDSSBUYXJnZXQgY29uZmlndXJhdGlvbi4gIChQVE0xKQorCSAqIE5vdGU6IFBUTTFNUyBpcyBoYXJkd2lyZSBlbmFibGVkIGJ1dCB3ZSBzZXQgdGhlIGVuYWJsZSBiaXQgYW55d2F5LgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW91dDMycihQVE0xTEEsICAgIHB0bWxhWzBdKTsgICAgICAgICAvKiBpbnNlcnQgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICovCisJb3V0MzJyKFBUTTFNUywgICAgcHRtbXNbMF0pOyAgICAgICAgIC8qIGluc2VydCBzaXplLCBlbmFibGUgYml0IGlzIDEgICAgICAgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lfQkFTRV9BRERSRVNTXzEsIHB0bXBjaWxhWzBdKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogNDA1R1AgUENJIFRhcmdldCBjb25maWd1cmF0aW9uLiAgKFBUTTIpCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJb3V0MzJyKFBUTTJMQSwgcHRtbGFbMV0pOyAgICAgICAgICAgIC8qIGluc2VydCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lfQkFTRV9BRERSRVNTXzIsIHB0bXBjaWxhWzFdKTsKKworCWlmIChwdG1tc1sxXSA9PSAwKQorCXsKKwkJb3V0MzJyKFBUTTJNUywgICAgMHgwMDAwMDAwMSk7ICAgLyogc2V0IGVuYWJsZSBiaXQgICAgICAgICAgICAgICAgICAgICAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lfQkFTRV9BRERSRVNTXzIsIDB4MDAwMDAwMDApOworCQlvdXQzMnIoUFRNMk1TLCAgICAweDAwMDAwMDAwKTsgICAvKiBkaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJfQorCWVsc2UKKwl7CisJCW91dDMycihQVE0yTVMsIHB0bW1zWzFdKTsgICAgICAgIC8qIGluc2VydCBzaXplLCBlbmFibGUgYml0IGlzIDEgICAgICAgKi8KKwl9CisKKwkvKgorCSAqIEluc2VydCBTdWJzeXN0ZW0gVmVuZG9yIGFuZCBEZXZpY2UgSUQKKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCBDT05GSUdfU1lTX1BDSV9TVUJTWVNfVkVORE9SSUQpOworI2lmZGVmIENPTkZJR19DUENJNDA1CisJaWYgKGlzX3BjaV9ob3N0KGhvc2UpKQorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSV9TVUJTWVNURU1fSUQsIENPTkZJR19TWVNfUENJX1NVQlNZU19ERVZJQ0VJRCk7CisJZWxzZQorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSV9TVUJTWVNURU1fSUQsIENPTkZJR19TWVNfUENJX1NVQlNZU19ERVZJQ0VJRDIpOworI2Vsc2UKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSV9TVUJTWVNURU1fSUQsIENPTkZJR19TWVNfUENJX1NVQlNZU19ERVZJQ0VJRCk7CisjZW5kaWYKKworCS8qCisJICogSW5zZXJ0IENsYXNzLWNvZGUKKwkgKi8KKyNpZmRlZiBDT05GSUdfU1lTX1BDSV9DTEFTU0NPREUKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSV9DTEFTU19TVUJfQ09ERSwgQ09ORklHX1NZU19QQ0lfQ0xBU1NDT0RFKTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTX1BDSV9DTEFTU0NPREUgKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogSWYgUENJIHNwZWVkID0gNjZNSHosIHNldCA2Nk1IeiBjYXBhYmxlIGJpdC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoYmQtPmJpX3BjaV9idXNmcmVxID49IDY2MDAwMDAwKSB7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lfU1RBVFVTLCAmdGVtcF9zaG9ydCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChQQ0lERVZJRF80MDVHUCxQQ0lfU1RBVFVTLCh0ZW1wX3Nob3J0fFBDSV9TVEFUVVNfNjZNSFopKTsKKwl9CisKKyNpZiAoQ09ORklHX1BDSV9IT1NUICE9IFBDSV9IT1NUX0FEQVBURVIpCisjaWYgKENPTkZJR19QQ0lfSE9TVCA9PSBQQ0lfSE9TVF9BVVRPKQorCWlmIChpc19wY2lfaG9zdChob3NlKSB8fAorCSAgICAoKChzID0gZ2V0ZW52KCJwY2lzY2FuIikpICE9IE5VTEwpICYmIChzdHJjbXAocywgInllcyIpID09IDApKSkKKyNlbmRpZgorCXsKKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJICogV3JpdGUgdGhlIDQwNUdQIFBDSSBDb25maWd1cmF0aW9uIHJlZ3MuCisJCSAqIEVuYWJsZSA0MDVHUCB0byBiZSBhIG1hc3RlciBvbiB0aGUgUENJIGJ1cyAoUE1NKS4KKwkJICogRW5hYmxlIDQwNUdQIHRvIGFjdCBhcyBhIFBDSSBtZW1vcnkgdGFyZ2V0IChQVE0pLgorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSV9DT01NQU5ELCAmdGVtcF9zaG9ydCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChQQ0lERVZJRF80MDVHUCwgUENJX0NPTU1BTkQsIHRlbXBfc2hvcnQgfAorCQkJCSAgICAgIFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSk7CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVFUCkKKwkvKgorCSAqIG9uIHBwYzQwNWVwIHZlbmRvci9kZXZpY2UgaWQgaXMgbm90IHNldAorCSAqIFRoZSB1c2VyIG1hbnVhbCBzYXlzIDB4MTAxNCAoSUJNKSAvIDB4MDE1NiAoNDA1R1AhKQorCSAqIGFyZSB0aGUgY29ycmVjdCB2YWx1ZXMuCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKFBDSURFVklEXzQwNUdQLCBQQ0lfVkVORE9SX0lELCBQQ0lfVkVORE9SX0lEX0lCTSk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKFBDSURFVklEXzQwNUdQLAorCQkJICAgICAgUENJX0RFVklDRV9JRCwgUENJX0RFVklDRV9JRF9JQk1fNDA1R1ApOworI2VuZGlmCisKKwkvKgorCSAqIFNldCBIQ0UgYml0IChIb3N0IENvbmZpZ3VyYXRpb24gRW5hYmxlZCkKKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChQQ0lERVZJRF80MDVHUCwgUENJQlJER09QVDIsICZ0ZW1wX3Nob3J0KTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoUENJREVWSURfNDA1R1AsIFBDSUJSREdPUFQyLCAodGVtcF9zaG9ydCB8IDB4MDAwMSkpOworCisjaWZkZWYgQ09ORklHX1BDSV9QTlAKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIFNjYW4gdGhlIFBDSSBidXMgYW5kIGNvbmZpZ3VyZSBkZXZpY2VzIGZvdW5kLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIChDT05GSUdfUENJX0hPU1QgPT0gUENJX0hPU1RfQVVUTykKKwlpZiAoaXNfcGNpX2hvc3QoaG9zZSkgfHwKKwkgICAgKCgocyA9IGdldGVudigicGNpc2NhbiIpKSAhPSBOVUxMKSAmJiAoc3RyY21wKHMsICJ5ZXMiKSA9PSAwKSkpCisjZW5kaWYKKwl7CisjaWZkZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cKKwkJcHJpbnRmKCJQQ0k6ICAgQnVzIERldiBWZW5JZCBEZXZJZCBDbGFzcyBJbnRcbiIpOworI2VuZGlmCisJCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKGhvc2UpOworCX0KKyNlbmRpZiAgLyogQ09ORklHX1BDSV9QTlAgKi8KKworfQorCisvKgorICogZHJpdmVycy9wY2kvcGNpLmMgc2tpcHMgZXZlcnkgaG9zdCBicmlkZ2UgYnV0IHRoZSA0MDVHUCBzaW5jZSBpdCBjb3VsZAorICogYmUgc2V0IGFzIGFuIEFkYXB0ZXIuCisgKgorICogSSAoQW5kcmV3IE1heSkgZG9uJ3Qga25vdyB3aGF0IHdlIHNob3VsZCBkbyBoZXJlLCBidXQgSSBkb24ndCB3YW50CisgKiB0aGUgYXV0byBzZXR1cCBvZiBhIFBDSSBkZXZpY2UgZGlzYWJsaW5nIHdoYXQgaXMgZG9uZSBwY2lfNDA1Z3BfaW5pdAorICogYXMgaGFzIGhhcHBlbmVkIGJlZm9yZS4KKyAqLwordm9pZCBwY2lfNDA1Z3Bfc2V0dXBfYnJpZGdlKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldiwKKwkJCSAgICBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqZW50cnkpCit7CisjaWZkZWYgREVCVUcKKwlwcmludGYoIjQwNWdwX3NldHVwX2JyaWRnZVxuIik7CisjZW5kaWYKK30KKworLyoKKyAqCisgKi8KKwordm9pZCBwY2lfNDA1Z3BfZml4dXBfaXJxKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKK3sKKwl1bnNpZ25lZCBjaGFyIGludF9saW5lID0gMHhmZjsKKworCS8qCisJICogV3JpdGUgcGNpIGludGVycnVwdCBsaW5lIHJlZ2lzdGVyIChjcGNpNDA1IHNwZWNpZmljKQorCSAqLworCXN3aXRjaCAoUENJX0RFVihkZXYpICYgMHgwMykKKwl7CisJY2FzZSAwOgorCQlpbnRfbGluZSA9IDI3ICsgMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpbnRfbGluZSA9IDI3ICsgMzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbnRfbGluZSA9IDI3ICsgMDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpbnRfbGluZSA9IDI3ICsgMTsKKwkJYnJlYWs7CisJfQorCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIGludF9saW5lKTsKK30KKwordm9pZCBwY2lfNDA1Z3Bfc2V0dXBfdmdhKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldiwKKwkJCSBzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSAqZW50cnkpCit7CisJdW5zaWduZWQgaW50IGNtZHN0YXQgPSAwOworCisJcGNpYXV0b19zZXR1cF9kZXZpY2UoaG9zZSwgZGV2LCA2LCBob3NlLT5wY2lfbWVtLCBob3NlLT5wY2lfcHJlZmV0Y2gsIGhvc2UtPnBjaV9pbyk7CisKKwkvKiBhbHdheXMgZW5hYmxlIGlvIHNwYWNlIG9uIHZnYSBib2FyZHMgKi8KKwlwY2lfaG9zZV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCBkZXYsIFBDSV9DT01NQU5ELCAmY21kc3RhdCk7CisJY21kc3RhdCB8PSBQQ0lfQ09NTUFORF9JTzsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgZGV2LCBQQ0lfQ09NTUFORCwgY21kc3RhdCk7Cit9CisKKyNpZiAhKGRlZmluZWQoQ09ORklHX1BJUDQwNSkgfHwgZGVmaW5lZCAoQ09ORklHX01JUDQwNSkpICYmICEoZGVmaW5lZCAoQ09ORklHX1NDMykpCisKKy8qCisgKkFzIGlzIHRoZXNlIGZ1bmN0cyBnZXQgY2FsbGVkIG91dCBvZiBmbGFzaCBOb3QgYSBob3JyaWJsZQorICp0aGluZywgYnV0IHNvbWV0aGluZyB0byBrZWVwIGluIG1pbmQuIChubyBzdGF0aWNzPykKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlIHBjaV80MDVncF9jb25maWdfdGFibGVbXSA9IHsKKy8qaWYgVmVuZElEIGlzIDAgaXQgdGVybWluYXRlcyB0aGUgdGFibGUgc2VhcmNoIChpZSBXYWxudXQpKi8KKyNpZmRlZiBDT05GSUdfU1lTX1BDSV9TVUJTWVNfVkVORE9SSUQKKwl7Q09ORklHX1NZU19QQ0lfU1VCU1lTX1ZFTkRPUklELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV80MDVncF9zZXR1cF9icmlkZ2V9LAorI2VuZGlmCisJe1BDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ESVNQTEFZX1ZHQSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpXzQwNWdwX3NldHVwX3ZnYX0sCisKKwl7UENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05PVF9ERUZJTkVEX1ZHQSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpXzQwNWdwX3NldHVwX3ZnYX0sCisKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgaG9zZSA9IHsKKwlmaXh1cF9pcnE6IHBjaV80MDVncF9maXh1cF9pcnEsCisJY29uZmlnX3RhYmxlOiBwY2lfNDA1Z3BfY29uZmlnX3RhYmxlLAorfTsKKwordm9pZCBwY2lfaW5pdF9ib2FyZCh2b2lkKQoreworCS8qd2Ugd2FudCB0aGUgcHRycyB0byBSQU0gbm90IGZsYXNoIChpZSBkb24ndCB1c2UgaW5pdCBsaXN0KSovCisJaG9zZS5maXh1cF9pcnEgICAgPSBwY2lfNDA1Z3BfZml4dXBfaXJxOworCWhvc2UuY29uZmlnX3RhYmxlID0gcGNpXzQwNWdwX2NvbmZpZ190YWJsZTsKKwlwY2lfNDA1Z3BfaW5pdCgmaG9zZSk7Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogQ09ORklHXzQwNUdQICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBDT05GSUdfNDQwCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcHBjNDQwX2hvc2UgPSB7MH07CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGRldGVybWluZSBpZiBhIHBjaSBzY2FuIHNob3VsZCBiZQorICogcGVyZm9ybWVkLiBXaXRoIHZhcmlvdXMgaGFyZHdhcmUgZW52aXJvbm1lbnRzIChlc3BlY2lhbGx5IGNQQ0kgYW5kCisgKiBQUE1DKSBpdCdzIGluc3VmZmljaWVudCB0byBkZXBlbmQgb24gdGhlIHN0YXRlIG9mIHRoZSBhcmJpdGVyIGVuYWJsZQorICogYml0IGluIHRoZSBzdHJhcCByZWdpc3Rlciwgb3IgZ2VuZXJpYyBob3N0L2FkYXB0ZXIgYXNzdW1wdGlvbnMuCisgKgorICogUmF0aGVyIHRoYW4gaGFyZC1jb2RlIGEgYmFkIGFzc3VtcHRpb24gaW4gdGhlIGdlbmVyYWwgNDQwIGNvZGUsIHRoZQorICogNDQwIHBjaSBjb2RlIHJlcXVpcmVzIHRoZSBib2FyZCB0byBkZWNpZGUgYXQgcnVudGltZS4KKyAqCisgKiBSZXR1cm4gMCBmb3IgYWRhcHRlciBtb2RlLCBub24temVybyBmb3IgaG9zdCAobW9uYXJjaCkgbW9kZS4KKyAqCisgKiBXZWFrIGRlZmF1bHQgaW1wbGVtZW50YXRpb246ICJOb3JtYWwiIGJvYXJkcyBpbXBsZW1lbnQgdGhlIFBDSQorICogaG9zdCBmdW5jdGlvbmFsaXR5LiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGZvciBQQ0kgYWRhcHRlciBib2FyZHMuCisgKi8KK2ludCBfX2lzX3BjaV9ob3N0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwlyZXR1cm4gMTsKK30KK2ludCBpc19wY2lfaG9zdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCisJX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9faXNfcGNpX2hvc3QiKSkpOworCisjaWYgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MEdSKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfUENJX1RBUkdFVF9JTklUKQorLyoKKyAqIHBjaV90YXJnZXRfaW5pdAorICoKKyAqIFRoZSBib290c3RyYXAgY29uZmlndXJhdGlvbiBwcm92aWRlcyBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgcGNpCisgKiBpbmJvdW5kIG1hcCAoUElNKS4gQnV0IHRoZSBib290c3RyYXAgY29uZmlnIGNob2ljZXMgYXJlIGxpbWl0ZWQgYW5kCisgKiBtYXkgbm90IGJlIHN1ZmZpY2llbnQgZm9yIGEgZ2l2ZW4gYm9hcmQuCisgKi8KK3ZvaWQgX19wY2lfdGFyZ2V0X2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCS8qCisJICogU2V0IHVwIERpcmVjdCBNTUlPIHJlZ2lzdGVycworCSAqLworCisJLyoKKwkgKiBQb3dlclBDNDQwIEVQIFBDSSBNYXN0ZXIgY29uZmlndXJhdGlvbi4KKwkgKiBNYXAgb25lIDFHaWcgcmFuZ2Ugb2YgUExCL3Byb2Nlc3NvciBhZGRyZXNzZXMgdG8gUENJIG1lbW9yeSBzcGFjZS4KKwkgKiBQTEIgYWRkcmVzcyAweEEwMDAwMDAwLTB4REZGRkZGRkYgPT0+IFBDSSBhZGRyZXNzIDB4QTAwMDAwMDAtMHhERkZGRkZGRgorCSAqIFVzZSBieXRlIHJldmVyc2VkIG91dCByb3V0aW5lcyB0byBoYW5kbGUgZW5kaWFuZXNzLgorCSAqIE1ha2UgdGhpcyByZWdpb24gbm9uLXByZWZldGNoYWJsZS4KKwkgKi8KKwkvKiBQTU0wIE1hc2svQXR0cmlidXRlIC0gZGlzYWJsZWQgYjQgc2V0dGluZyAqLworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUE1NME1BLCAweDAwMDAwMDAwKTsKKwkvKiBQTU0wIExvY2FsIEFkZHJlc3MgKi8KKwlvdXRfbGUzMigodm9pZCAqKVBDSUwwX1BNTTBMQSwgQ09ORklHX1NZU19QQ0lfTUVNQkFTRSk7CisJLyogUE1NMCBQQ0kgTG93IEFkZHJlc3MgKi8KKwlvdXRfbGUzMigodm9pZCAqKVBDSUwwX1BNTTBQQ0lMQSwgQ09ORklHX1NZU19QQ0lfTUVNQkFTRSk7CisJLyogUE1NMCBQQ0kgSGlnaCBBZGRyZXNzICovCisJb3V0X2xlMzIoKHZvaWQgKilQQ0lMMF9QTU0wUENJSEEsIDB4MDAwMDAwMDApOworCS8qIDUxMk0gKyBObyBwcmVmZXRjaGluZywgYW5kIGVuYWJsZSByZWdpb24gKi8KKwlvdXRfbGUzMigodm9pZCAqKVBDSUwwX1BNTTBNQSwgMHhFMDAwMDAwMSk7CisKKwkvKiBQTU0xIE1hc2svQXR0cmlidXRlIC0gZGlzYWJsZWQgYjQgc2V0dGluZyAqLworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUE1NMU1BLCAweDAwMDAwMDAwKTsKKwkvKiBQTU0xIExvY2FsIEFkZHJlc3MgKi8KKwlvdXRfbGUzMigodm9pZCAqKVBDSUwwX1BNTTFMQSwgQ09ORklHX1NZU19QQ0lfTUVNQkFTRTIpOworCS8qIFBNTTEgUENJIExvdyBBZGRyZXNzICovCisJb3V0X2xlMzIoKHZvaWQgKilQQ0lMMF9QTU0xUENJTEEsIENPTkZJR19TWVNfUENJX01FTUJBU0UyKTsKKwkvKiBQTU0xIFBDSSBIaWdoIEFkZHJlc3MgKi8KKwlvdXRfbGUzMigodm9pZCAqKVBDSUwwX1BNTTFQQ0lIQSwgMHgwMDAwMDAwMCk7CisJLyogNTEyTSArIE5vIHByZWZldGNoaW5nLCBhbmQgZW5hYmxlIHJlZ2lvbiAqLworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUE1NMU1BLCAweEUwMDAwMDAxKTsKKworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUFRNMU1TLCAweDAwMDAwMDAxKTsgLyogTWVtb3J5IFNpemUvQXR0cmlidXRlICovCisJb3V0X2xlMzIoKHZvaWQgKilQQ0lMMF9QVE0xTEEsIDApOwkvKiBMb2NhbCBBZGRyLiBSZWcgKi8KKwlvdXRfbGUzMigodm9pZCAqKVBDSUwwX1BUTTJNUywgMCk7CS8qIE1lbW9yeSBTaXplL0F0dHJpYnV0ZSAqLworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUFRNMkxBLCAwKTsJLyogTG9jYWwgQWRkci4gUmVnICovCisKKwkvKgorCSAqIFNldCB1cCBDb25maWd1cmF0aW9uIHJlZ2lzdGVycworCSAqLworCisJLyogUHJvZ3JhbSB0aGUgYm9hcmQncyBzdWJzeXN0ZW0gaWQvdmVuZG9yIGlkICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKDAsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELAorCQkJICAgICAgQ09ORklHX1NZU19QQ0lfU1VCU1lTX1ZFTkRPUklEKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoMCwgUENJX1NVQlNZU1RFTV9JRCwgQ09ORklHX1NZU19QQ0lfU1VCU1lTX0lEKTsKKworCS8qIENvbmZpZ3VyZSBjb21tYW5kIHJlZ2lzdGVyIGFzIGJ1cyBtYXN0ZXIgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoMCwgUENJX0NPTU1BTkQsIFBDSV9DT01NQU5EX01BU1RFUik7CisKKwkvKiAyNDBuUyBQQ0kgY2xvY2sgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoMCwgUENJX0xBVEVOQ1lfVElNRVIsIDEpOworCisJLyogTm8gZXJyb3IgcmVwb3J0aW5nICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKDAsIFBDSV9FUlJFTiwgMCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKDAsIFBDSV9CUkRHT1BUMiwgMHgwMDAwMDEwMSk7Cit9CisjZW5kaWYgLyogQ09ORklHX1NZU19QQ0lfVEFSR0VUX0lOSVQgKi8KKworLyoKKyAqIHBjaV9wcmVfaW5pdAorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQganVzdCBwcmlvciB0byByZWdpc3RlcmluZyB0aGUgaG9zZSBhbmQgZ2l2ZXMKKyAqIHRoZSBib2FyZCB0aGUgb3Bwb3J0dW5pdHkgdG8gY2hlY2sgdGhpbmdzLiBSZXR1cm5pbmcgYSB2YWx1ZSBvZiB6ZXJvCisgKiBpbmRpY2F0ZXMgdGhhdCB0aGluZ3MgYXJlIGJhZCAmIFBDSSBpbml0aWFsaXphdGlvbiBzaG91bGQgYmUgYWJvcnRlZC4KKyAqCisgKiBEaWZmZXJlbnQgYm9hcmRzIG1heSB3aXNoIHRvIGN1c3RvbWl6ZSB0aGUgcGNpIGNvbnRyb2xsZXIgc3RydWN0dXJlCisgKiAoYWRkIHJlZ2lvbnMsIG92ZXJyaWRlIGRlZmF1bHQgYWNjZXNzIHJvdXRpbmVzLCBldGMpIG9yIHBlcmZvcm0KKyAqIGNlcnRhaW4gcHJlLWluaXRpYWxpemF0aW9uIGFjdGlvbnMuCisgKgorICovCitpbnQgX19wY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXUzMiByZWc7CisKKwkvKgorCSAqIFNldCBwcmlvcml0eSBmb3IgYWxsIFBMQjMgZGV2aWNlcyB0byAwLgorCSAqIFNldCBQTEIzIGFyYml0ZXIgdG8gZmFpciBtb2RlLgorCSAqLworCW1mc2RyKFNEMF9BTVAxLCByZWcpOworCW10c2RyKFNEMF9BTVAxLCAocmVnICYgMHgwMDAwMDBGRikgfCAweDAwMDBGRjAwKTsKKwlyZWcgPSBtZmRjcihQTEIzX0FDUik7CisJbXRkY3IoUExCM19BQ1IsIHJlZyB8IDB4ODAwMDAwMDApOworCisJLyoKKwkgKiBTZXQgcHJpb3JpdHkgZm9yIGFsbCBQTEI0IGRldmljZXMgdG8gMC4KKwkgKi8KKwltZnNkcihTRDBfQU1QMCwgcmVnKTsKKwltdHNkcihTRDBfQU1QMCwgKHJlZyAmIDB4MDAwMDAwRkYpIHwgMHgwMDAwRkYwMCk7CisJcmVnID0gbWZkY3IoUExCNF9BQ1IpIHwgMHhhMDAwMDAwMDsKKwltdGRjcihQTEI0X0FDUiwgcmVnKTsKKworCS8qCisJICogU2V0IE5lYnVsYSBQTEI0IGFyYml0ZXIgdG8gZmFpciBtb2RlLgorCSAqLworCS8qIFNlZ21lbnQwICovCisJcmVnID0gKG1mZGNyKFBMQjBfQUNSKSAmIH5QTEIwX0FDUl9QUE1fTUFTSykgfCBQTEIwX0FDUl9QUE1fRkFJUjsKKwlyZWcgPSAocmVnICYgflBMQjBfQUNSX0hCVV9NQVNLKSB8IFBMQjBfQUNSX0hCVV9FTkFCTEVEOworCXJlZyA9IChyZWcgJiB+UExCMF9BQ1JfUkRQX01BU0spIHwgUExCMF9BQ1JfUkRQXzRERUVQOworCXJlZyA9IChyZWcgJiB+UExCMF9BQ1JfV1JQX01BU0spIHwgUExCMF9BQ1JfV1JQXzJERUVQOworCW10ZGNyKFBMQjBfQUNSLCByZWcpOworCisJLyogU2VnbWVudDEgKi8KKwlyZWcgPSAobWZkY3IoUExCMV9BQ1IpICYgflBMQjFfQUNSX1BQTV9NQVNLKSB8IFBMQjFfQUNSX1BQTV9GQUlSOworCXJlZyA9IChyZWcgJiB+UExCMV9BQ1JfSEJVX01BU0spIHwgUExCMV9BQ1JfSEJVX0VOQUJMRUQ7CisJcmVnID0gKHJlZyAmIH5QTEIxX0FDUl9SRFBfTUFTSykgfCBQTEIxX0FDUl9SRFBfNERFRVA7CisJcmVnID0gKHJlZyAmIH5QTEIxX0FDUl9XUlBfTUFTSykgfCBQTEIxX0FDUl9XUlBfMkRFRVA7CisJbXRkY3IoUExCMV9BQ1IsIHJlZyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfUENJX0JPQVJEX0ZJWFVQX0lSUSkKKwlob3NlLT5maXh1cF9pcnEgPSBib2FyZF9wY2lfZml4dXBfaXJxOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KKworI2Vsc2UgLyogZGVmaW5lZChDT05GSUdfNDQwRVApIC4uLiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX1BDSV9UQVJHRVRfSU5JVCkKK3ZvaWQgX19wY2lfdGFyZ2V0X2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICogaG9zZSkKK3sKKwkvKgorCSAqIERpc2FibGUgZXZlcnl0aGluZworCSAqLworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUElNMFNBLCAwKTsgLyogZGlzYWJsZSAqLworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUElNMVNBLCAwKTsgLyogZGlzYWJsZSAqLworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUElNMlNBLCAwKTsgLyogZGlzYWJsZSAqLworCW91dF9sZTMyKCh2b2lkICopUENJTDBfRVJPTUJBLCAwKTsgLyogZGlzYWJsZSBleHBhbnNpb24gcm9tICovCisKKwkvKgorCSAqIE1hcCBhbGwgb2YgU0RSQU0gdG8gUENJIGFkZHJlc3MgMHgwMDAwXzAwMDAuIE5vdGUgdGhhdCB0aGUgNDQwCisJICogc3RyYXBwaW5nIG9wdGlvbnMgZG8gbm90IHN1cHBvcnQgc2l6ZXMgc3VjaCBhcyAxMjgvMjU2IE1CLgorCSAqLworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUElNMExBTCwgQ09ORklHX1NZU19TRFJBTV9CQVNFKTsKKwlvdXRfbGUzMigodm9pZCAqKVBDSUwwX1BJTTBMQUgsIDApOworCW91dF9sZTMyKCh2b2lkICopUENJTDBfUElNMFNBLCB+KGdkLT5yYW1fc2l6ZSAtIDEpIHwgMSk7CisJb3V0X2xlMzIoKHZvaWQgKilQQ0lMMF9CQVIwLCAwKTsKKworCS8qCisJICogUHJvZ3JhbSB0aGUgYm9hcmQncyBzdWJzeXN0ZW0gaWQvdmVuZG9yIGlkCisJICovCisJb3V0X2xlMTYoKHZvaWQgKilQQ0lMMF9TQlNZU1ZJRCwgQ09ORklHX1NZU19QQ0lfU1VCU1lTX1ZFTkRPUklEKTsKKwlvdXRfbGUxNigodm9pZCAqKVBDSUwwX1NCU1lTSUQsIENPTkZJR19TWVNfUENJX1NVQlNZU19ERVZJQ0VJRCk7CisKKwlvdXRfbGUxNigodm9pZCAqKVBDSUwwX0NNRCwgaW5fbGUxNigodm9pZCAqKVBDSUwwX0NNRCkgfAorCQkgUENJX0NPTU1BTkRfTUVNT1JZKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU1lTX1BDSV9UQVJHRVRfSU5JVCAqLworCitpbnQgX19wY2lfcHJlX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCS8qCisJICogVGhpcyBib2FyZCBpcyBhbHdheXMgY29uZmlndXJlZCBhcyB0aGUgaG9zdCAmIHJlcXVpcmVzIHRoZQorCSAqIFBDSSBhcmJpdGVyIHRvIGJlIGVuYWJsZWQuCisJICovCisJaWYgKCFwY2lfYXJiaXRlcl9lbmFibGVkKCkpIHsKKwkJcHJpbnRmKCJQQ0k6IFBDSSBBcmJpdGVyIGRpc2FibGVkIVxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfNDQwRVApIC4uLiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX1BDSV9UQVJHRVRfSU5JVCkKK3ZvaWQgcGNpX3RhcmdldF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqIGhvc2UpCisJX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fcGNpX3RhcmdldF9pbml0IikpKTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTX1BDSV9UQVJHRVRfSU5JVCAqLworCitpbnQgcGNpX3ByZV9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKKwlfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19wY2lfcHJlX2luaXQiKSkpOworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX1BDSV9NQVNURVJfSU5JVCkKK3ZvaWQgX19wY2lfbWFzdGVyX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCXUxNiByZWc7CisKKwkvKgorCSAqIFdyaXRlIHRoZSBQb3dlclBDNDQwIEVQIFBDSSBDb25maWd1cmF0aW9uIHJlZ3MuCisJICogRW5hYmxlIFBvd2VyUEM0NDAgRVAgdG8gYmUgYSBtYXN0ZXIgb24gdGhlIFBDSSBidXMgKFBNTSkuCisJICogRW5hYmxlIFBvd2VyUEM0NDAgRVAgdG8gYWN0IGFzIGEgUENJIG1lbW9yeSB0YXJnZXQgKFBUTSkuCisJICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoMCwgUENJX0NPTU1BTkQsICZyZWcpOworCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfQ09NTUFORCwgcmVnIHwKKwkJCSAgICAgIFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSk7Cit9Cit2b2lkIHBjaV9tYXN0ZXJfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCisJX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fcGNpX21hc3Rlcl9pbml0IikpKTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTX1BDSV9NQVNURVJfSU5JVCAqLworCitpbnQgcGNpXzQ0MF9pbml0IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJaW50IHJlZ19udW0gPSAwOworCisjaWZuZGVmIENPTkZJR19ESVNBQkxFX1BJU0VfVEVTVAorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogVGhlIFBDSSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBlbmFibGUgYml0IG11c3QgYmUgc2V0IC4uLiBpZiBub3QgYWJvcnQKKwkgKiBwY2kgc2V0dXAgc2luY2UgdXBkYXRpbmcgdGhlIGJpdCByZXF1aXJlcyBjaGlwIHJlc2V0LgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKQorCXVuc2lnbmVkIGxvbmcgc3RyYXA7CisKKwltZnNkcihTRFIwX1NEU1RQMSxzdHJhcCk7CisJaWYgKChzdHJhcCAmIFNEUjBfU0RTVFAxX1BJU0VfTUFTSykgPT0gMCkgeworCQlwcmludGYoIlBDSTogU0RSMF9TVFJQMVtQSVNFXSBub3Qgc2V0LlxuIik7CisJCXByaW50ZigiUENJOiBDb25maWd1cmF0aW9uIGFib3J0ZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbGlmIGRlZmluZWQoQ09ORklHXzQ0MEdQKQorCXVuc2lnbmVkIGxvbmcgc3RyYXA7CisKKwlzdHJhcCA9IG1mZGNyKENQQzBfU1RSUDEpOworCWlmICgoc3RyYXAgJiBDUEMwX1NUUlAxX1BJU0VfTUFTSykgPT0gMCkgeworCQlwcmludGYoIlBDSTogQ1BDMF9TVFJQMVtQSVNFXSBub3Qgc2V0LlxuIik7CisJCXByaW50ZigiUENJOiBDb25maWd1cmF0aW9uIGFib3J0ZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19ESVNBQkxFX1BJU0VfVEVTVCAqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBQQ0kgY29udHJvbGxlciBpbml0CisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaG9zZS0+Zmlyc3RfYnVzbm8gPSAwOworCWhvc2UtPmxhc3RfYnVzbm8gPSAwOworCisJLyogUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyByZWdfbnVtKyssCisJCSAgICAgICAweDAwMDAwMDAwLAorCQkgICAgICAgUENJTDBfSU9CQVNFLAorCQkgICAgICAgMHgxMDAwMCwKKwkJICAgICAgIFBDSV9SRUdJT05fSU8pOworCisJLyogUENJIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyByZWdfbnVtKyssCisJCSAgICAgICBDT05GSUdfU1lTX1BDSV9UQVJHQkFTRSwKKwkJICAgICAgIENPTkZJR19TWVNfUENJX01FTUJBU0UsCisjaWZkZWYgQ09ORklHX1NZU19QQ0lfTUVNU0laRQorCQkgICAgICAgQ09ORklHX1NZU19QQ0lfTUVNU0laRSwKKyNlbHNlCisJCSAgICAgICAweDEwMDAwMDAwLAorI2VuZGlmCisJCSAgICAgICBQQ0lfUkVHSU9OX01FTSApOworCisjaWYgZGVmaW5lZChDT05GSUdfUENJX1NZU19NRU1fQlVTKSAmJiBkZWZpbmVkKENPTkZJR19QQ0lfU1lTX01FTV9QSFlTKSAmJiBcCisJZGVmaW5lZChDT05GSUdfUENJX1NZU19NRU1fU0laRSkKKwkvKiBTeXN0ZW0gbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIHJlZ19udW0rKywKKwkJICAgICAgIENPTkZJR19QQ0lfU1lTX01FTV9CVVMsCisJCSAgICAgICBDT05GSUdfUENJX1NZU19NRU1fUEhZUywKKwkJICAgICAgIENPTkZJR19QQ0lfU1lTX01FTV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX1NZU19NRU1PUlkgKTsKKyNlbmRpZgorCisJaG9zZS0+cmVnaW9uX2NvdW50ID0gcmVnX251bTsKKworCXBjaV9zZXR1cF9pbmRpcmVjdChob3NlLCBQQ0lMMF9DRkdBRFIsIFBDSUwwX0NGR0RBVEEpOworCisJLyogTGV0IGJvYXJkIGNoYW5nZS9tb2RpZnkgaG9zZSAmIGRvIGluaXRpYWwgY2hlY2tzICovCisJaWYgKHBjaV9wcmVfaW5pdChob3NlKSA9PSAwKSB7CisJCXByaW50ZigiUENJOiBCb2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKwkJcHJpbnRmKCJQQ0k6IENvbmZpZ3VyYXRpb24gYWJvcnRlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcGNpX3JlZ2lzdGVyX2hvc2UoIGhvc2UgKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogUENJIHRhcmdldCBpbml0CisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX1BDSV9UQVJHRVRfSU5JVCkKKwlwY2lfdGFyZ2V0X2luaXQoaG9zZSk7ICAgICAgICAgICAgICAgIC8qIExldCBib2FyZCBzZXR1cCBwY2kgdGFyZ2V0ICovCisjZWxzZQorCW91dDE2ciggUENJTDBfU0JTWVNWSUQsIENPTkZJR19TWVNfUENJX1NVQlNZU19WRU5ET1JJRCApOworCW91dDE2ciggUENJTDBfU0JTWVNJRCwgQ09ORklHX1NZU19QQ0lfU1VCU1lTX0lEICk7CisJb3V0MTZyKCBQQ0lMMF9DTFMsIDB4MDAwNjAwMDAgKTsgLyogQnJpZGdlLCBob3N0IGJyaWRnZSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDBHWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKQorCW91dDMyciggUENJTDBfQlJER09QVDEsIDB4MDQwMDAwNjAgKTsgICAgICAgICAgICAgICAvKiBQTEIgUnEgcHJpIGhpZ2hlc3QgICAqLworCW91dDMyciggUENJTDBfQlJER09QVDIsIGluMzIoUENJTDBfQlJER09QVDIpIHwgMHg4MyApOyAvKiBFbmFibGUgaG9zdCBjb25maWcsIGNsZWFyIFRpbWVvdXQsIGVuc3VyZSBpbnQgc3JjMSAgKi8KKyNlbGlmIGRlZmluZWQoUENJTDBfQlJER09QVDEpCisJb3V0MzJyKCBQQ0lMMF9CUkRHT1BUMSwgMHgxMDAwMDA2MCApOyAgICAgICAgICAgICAgIC8qIFBMQiBScSBwcmkgaGlnaGVzdCAgICovCisJb3V0MzJyKCBQQ0lMMF9CUkRHT1BUMiwgaW4zMihQQ0lMMF9CUkRHT1BUMikgfCAxICk7IC8qIEVuYWJsZSBob3N0IGNvbmZpZyAgICovCisjZW5kaWYKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogUENJIG1hc3RlciBpbml0OiBkZWZhdWx0IGlzIG9uZSAyNTZNQiByZWdpb24gZm9yIFBDSSBtZW1vcnk6CisJICogMHgzXzAwMDAwMDAwIC0gMHgzXzBGRkZGRkZGICA9PT4gQ09ORklHX1NZU19QQ0lfTUVNQkFTRQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoQ09ORklHX1NZU19QQ0lfTUFTVEVSX0lOSVQpCisJcGNpX21hc3Rlcl9pbml0KGhvc2UpOyAgICAgICAgICAvKiBMZXQgYm9hcmQgc2V0dXAgcGNpIG1hc3RlciAqLworI2Vsc2UKKwlvdXQzMnIoIFBDSUwwX1BPTTBTQSwgMCApOyAvKiBkaXNhYmxlICovCisJb3V0MzJyKCBQQ0lMMF9QT00xU0EsIDAgKTsgLyogZGlzYWJsZSAqLworCW91dDMyciggUENJTDBfUE9NMlNBLCAwICk7IC8qIGRpc2FibGUgKi8KKyNpZiBkZWZpbmVkKENPTkZJR180NDBTUEUpCisJb3V0MzJyKCBQQ0lMMF9QT00wTEFMLCAweDEwMDAwMDAwICk7CisJb3V0MzJyKCBQQ0lMMF9QT00wTEFILCAweDAwMDAwMDBjICk7CisjZWxpZiBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpCisJb3V0MzJyKCBQQ0lMMF9QT00wTEFMLCAweDIwMDAwMDAwICk7CisJb3V0MzJyKCBQQ0lMMF9QT00wTEFILCAweDAwMDAwMDBjICk7CisjZWxzZQorCW91dDMyciggUENJTDBfUE9NMExBTCwgMHgwMDAwMDAwMCApOworCW91dDMyciggUENJTDBfUE9NMExBSCwgMHgwMDAwMDAwMyApOworI2VuZGlmCisJb3V0MzJyKCBQQ0lMMF9QT00wUENJQUwsIENPTkZJR19TWVNfUENJX01FTUJBU0UgKTsKKwlvdXQzMnIoIFBDSUwwX1BPTTBQQ0lBSCwgMHgwMDAwMDAwMCApOworCW91dDMyciggUENJTDBfUE9NMFNBLCAweGYwMDAwMDAxICk7IC8qIDI1Nk1CLCBlbmFibGVkICovCisJb3V0MzJyKCBQQ0lMMF9TVFMsIGluMzJyKCBQQ0lMMF9TVFMgKSAmIH4weDAwMDBmZmY4ICk7CisjZW5kaWYKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogUENJIGhvc3QgY29uZmlndXJhdGlvbiAtLSB3ZSBkb24ndCBtYWtlIGFueSBhc3N1bXB0aW9ucyBoZXJlIC4uLiB0aGUKKwkgKiBfYm9hcmRfbXVzdF9pbmRpY2F0ZV8gd2hhdCB0byBkbyAtLSB0aGVyZSdzIGp1c3QgdG9vIG1hbnkgcnVudGltZQorCSAqIHNjZW5hcmlvcyBpbiBlbnZpcm9ubWVudHMgbGlrZSBjUENJLCBQUE1DLCBldGMuIHRvIG1ha2UgYSBkZXRlcm1pbmF0aW9uCisJICogYmFzZWQgb24gaGFyZC1jb2RlZCB2YWx1ZXMgb3Igc3RhdGUgb2YgYXJiaXRlciBlbmFibGUuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKGlzX3BjaV9ob3N0KGhvc2UpKSB7CisjaWZkZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cKKwkJcHJpbnRmKCJQQ0k6ICAgQnVzIERldiBWZW5JZCBEZXZJZCBDbGFzcyBJbnRcbiIpOworI2VuZGlmCisjaWYgIWRlZmluZWQoQ09ORklHXzQ0MEVQKSAmJiAhZGVmaW5lZChDT05GSUdfNDQwR1IpICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfNDQwRVBYKSAmJiAhZGVmaW5lZChDT05GSUdfNDQwR1JYKQorCQlvdXQxNnIoIFBDSUwwX0NNRCwgaW4xNnIoIFBDSUwwX0NNRCApIHwgUENJX0NPTU1BTkRfTUFTVEVSKTsKKyNlbmRpZgorCQlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbihob3NlKTsKKwl9CisJcmV0dXJuIGhvc2UtPmxhc3RfYnVzbm87Cit9CisKK3ZvaWQgcGNpX2luaXRfYm9hcmQodm9pZCkKK3sKKwlpbnQgYnVzbm87CisKKwlidXNubyA9IHBjaV80NDBfaW5pdCAoJnBwYzQ0MF9ob3NlKTsKKyNpZiAoZGVmaW5lZChDT05GSUdfNDQwU1BFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKSkgJiYgXAorICAgICFkZWZpbmVkKENPTkZJR19QQ0lfRElTQUJMRV9QQ0lFKQorCXBjaWVfc2V0dXBfaG9zZXMoYnVzbm8gKyAxKTsKKyNlbmRpZgorfQorCisjZW5kaWYgLyogQ09ORklHXzQ0MCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfNDA1RVgpCit2b2lkIHBjaV9pbml0X2JvYXJkKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BDSV9TQ0FOX1NIT1cKKwlwcmludGYoIlBDSTogICBCdXMgRGV2IFZlbklkIERldklkIENsYXNzIEludFxuIik7CisjZW5kaWYKKwlwY2llX3NldHVwX2hvc2VzKDApOworfQorI2VuZGlmIC8qIENPTkZJR180MDVFWCAqLworCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvNHh4X3BjaWUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4LzR4eF9wY2llLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiNThiNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4LzR4eF9wY2llLmMKQEAgLTAsMCArMSwxMjk4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2IC0gMjAwOAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBSb2xhbmQgRHJlaWVyIDxyb2xhbmRkQGNpc2NvLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworLyogZGVmaW5lIERFQlVHIGZvciBkZWJ1Z2dpbmcgb3V0cHV0IChvYnZpb3VzbHkgOy0pKSAqLworI2lmIDAKKyNkZWZpbmUgREVCVUcKKyNlbmRpZgorCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjaWYgKGRlZmluZWQoQ09ORklHXzQ0MFNQRSkgfHwgZGVmaW5lZChDT05GSUdfNDA1RVgpIHx8CVwKKyAgICBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpKSAmJiBcCisgICAgZGVmaW5lZChDT05GSUdfUENJKSAmJiAhZGVmaW5lZChDT05GSUdfUENJX0RJU0FCTEVfUENJRSkKKworI2luY2x1ZGUgPGFzbS80eHhfcGNpZS5oPgorCitlbnVtIHsKKwlQVFlQRV9FTkRQT0lOVAkJPSAweDAsCisJUFRZUEVfTEVHQUNZX0VORFBPSU5UCT0gMHgxLAorCVBUWVBFX1JPT1RfUE9SVAkJPSAweDQsCisKKwlMTktXX1gxCQkJPSAweDEsCisJTE5LV19YNAkJCT0gMHg0LAorCUxOS1dfWDgJCQk9IDB4OAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfY29udHJvbGxlciBwY2llX2hvc2VbQ09ORklHX1NZU19QQ0lFX05SX1BPUlRTXTsKKworLyoKKyAqIFBlciBkZWZhdWx0LCBhbGwgY2FyZHMgYXJlIHByZXNlbnQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlCisgKiBsaW5rIGNvbWVzIHVwLgorICovCitpbnQgX19ib2FyZF9wY2llX2NhcmRfcHJlc2VudChpbnQgcG9ydCkKK3sKKwlyZXR1cm4gMTsKK30KK2ludCBib2FyZF9wY2llX2NhcmRfcHJlc2VudChpbnQgcG9ydCkKKwlfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19ib2FyZF9wY2llX2NhcmRfcHJlc2VudCIpKSk7CisKKy8qCisgKiBTb21lIGJvYXJkcyBoYXZlIHJ1bnRpbWUgZGV0ZWN0aW9uIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBQQ0llCisgKiBzbG90IHVzZWQsIHNvIGxldCdzIHByb3ZpZGUgd2VhayBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgdGhlCisgKiBjb21tb24gdmVyc2lvbi4KKyAqLworaW50IF9fYm9hcmRfcGNpZV9maXJzdCh2b2lkKQoreworCXJldHVybiAwOworfQoraW50IGJvYXJkX3BjaWVfZmlyc3Qodm9pZCkKKwlfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19ib2FyZF9wY2llX2ZpcnN0IikpKTsKKworaW50IF9fYm9hcmRfcGNpZV9sYXN0KHZvaWQpCit7CisJcmV0dXJuIENPTkZJR19TWVNfUENJRV9OUl9QT1JUUyAtIDE7Cit9CitpbnQgYm9hcmRfcGNpZV9sYXN0KHZvaWQpCisJX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoIl9fYm9hcmRfcGNpZV9sYXN0IikpKTsKKwordm9pZCBfX2JvYXJkX3BjaWVfc2V0dXBfcG9ydChpbnQgcG9ydCwgaW50IHJvb3Rwb2ludCkKK3sKKwkvKiBub3RpbmcgaW4gdGhpcyB3ZWFrIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKi8KK30KK3ZvaWQgYm9hcmRfcGNpZV9zZXR1cF9wb3J0KGludCBwb3J0LCBpbnQgcm9vdHBvaW50KQorCV9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX2JvYXJkX3BjaWVfc2V0dXBfcG9ydCIpKSk7CisKK3ZvaWQgcGNpZV9zZXR1cF9ob3NlcyhpbnQgYnVzbm8pCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCWludCBpLCBidXM7CisJaW50IHJldCA9IDA7CisJY2hhciAqZW52OworCXVuc2lnbmVkIGludCBkZWxheTsKKwlpbnQgZmlyc3QgPSBib2FyZF9wY2llX2ZpcnN0KCk7CisJaW50IGxhc3QgPSBib2FyZF9wY2llX2xhc3QoKTsKKworCS8qCisJICogQXNzdW1lIHdlJ3JlIGNhbGxlZCBhZnRlciB0aGUgUENJKFgpIGhvc2UocykgYXJlIGluaXRpYWxpemVkLAorCSAqIHdoaWNoIHRha2VzIGJ1cyBJRCAwLi4uIGFuZCB0aGVyZWZvcmUgc3RhcnQgbnVtYmVyaW5nIFBDSWUncworCSAqIGZyb20gdGhlIG5leHQgbnVtYmVyLgorCSAqLworCWJ1cyA9IGJ1c25vOworCisJZm9yIChpID0gZmlyc3Q7IGkgPD0gbGFzdDsgaSsrKSB7CisJCS8qCisJCSAqIFNvbWUgYm9hcmRzIChlLmcuIEthdG1haSkgY2FuIGRldGVjdHMgdmlhIGhhcmR3YXJlCisJCSAqIGlmIGEgUENJZSBjYXJkIGlzIHBsdWdnZWQsIHNvIGxldCdzIGNoZWNrIHRoaXMuCisJCSAqLworCQlpZiAoIWJvYXJkX3BjaWVfY2FyZF9wcmVzZW50KGkpKQorCQkJY29udGludWU7CisKKwkJaWYgKGlzX2VuZF9wb2ludChpKSkgeworCQkJYm9hcmRfcGNpZV9zZXR1cF9wb3J0KGksIDApOworCQkJcmV0ID0gcHBjNHh4X2luaXRfcGNpZV9lbmRwb3J0KGkpOworCQl9IGVsc2UgeworCQkJYm9hcmRfcGNpZV9zZXR1cF9wb3J0KGksIDEpOworCQkJcmV0ID0gcHBjNHh4X2luaXRfcGNpZV9yb290cG9ydChpKTsKKwkJfQorCQlpZiAocmV0ID09IC1FTk9ERVYpCisJCQljb250aW51ZTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRmKCJQQ0lFJWQ6IGluaXRpYWxpemF0aW9uIGFzICVzIGZhaWxlZFxuIiwgaSwKKwkJCSAgICAgICBpc19lbmRfcG9pbnQoaSkgPyAiZW5kcG9pbnQiIDogInJvb3QtY29tcGxleCIpOworCQkJY29udGludWU7CisJCX0KKworCQlob3NlID0gJnBjaWVfaG9zZVtpXTsKKwkJaG9zZS0+Zmlyc3RfYnVzbm8gPSBidXM7CisJCWhvc2UtPmxhc3RfYnVzbm8gPSBidXM7CisJCWhvc2UtPmN1cnJlbnRfYnVzbm8gPSBidXM7CisKKwkJLyogc2V0dXAgbWVtIHJlc291cmNlICovCisJCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQkJICAgICAgIENPTkZJR19TWVNfUENJRV9NRU1CQVNFICsgaSAqIENPTkZJR19TWVNfUENJRV9NRU1TSVpFLAorCQkJICAgICAgIENPTkZJR19TWVNfUENJRV9NRU1CQVNFICsgaSAqIENPTkZJR19TWVNfUENJRV9NRU1TSVpFLAorCQkJICAgICAgIENPTkZJR19TWVNfUENJRV9NRU1TSVpFLAorCQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKwkJaG9zZS0+cmVnaW9uX2NvdW50ID0gMTsKKwkJcGNpX3JlZ2lzdGVyX2hvc2UoaG9zZSk7CisKKwkJaWYgKGlzX2VuZF9wb2ludChpKSkgeworCQkJcHBjNHh4X3NldHVwX3BjaWVfZW5kcG9pbnQoaG9zZSwgaSk7CisJCQkvKgorCQkJICogUmVzb24gZm9yIG5vIHNjYW5uaW5nIGlzIGVuZHBvaW50IGNhbiBub3QgZ2VuZXJhdGUKKwkJCSAqIHVwc3RyZWFtIGNvbmZpZ3VyYXRpb24gYWNjZXNzZXMuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCXBwYzR4eF9zZXR1cF9wY2llX3Jvb3Rwb2ludChob3NlLCBpKTsKKwkJCWVudiA9IGdldGVudiAoInBjaXNjYW5kZWxheSIpOworCQkJaWYgKGVudiAhPSBOVUxMKSB7CisJCQkJZGVsYXkgPSBzaW1wbGVfc3RydG91bChlbnYsIE5VTEwsIDEwKTsKKwkJCQlpZiAoZGVsYXkgPiA1KQorCQkJCQlwcmludGYoIldhcm5pbmcsIGV4cGVjdCBub3RpY2FibGUgZGVsYXkgYmVmb3JlICIKKwkJCQkJICAgICAgICJQQ0llIHNjYW4gZHVlIHRvICdwY2lzY2FuZGVsYXknIHZhbHVlIVxuIik7CisJCQkJbWRlbGF5KGRlbGF5ICogMTAwMCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBDb25maWcgYWNjZXNzIGNhbiBvbmx5IGdvIGRvd24gc3RyZWFtCisJCQkgKi8KKwkJCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuKGhvc2UpOworCQkJYnVzID0gaG9zZS0+bGFzdF9idXNubyArIDE7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfZW5kcG9pbnQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCWlmIChob3NlLT5jZmdfZGF0YSA9PSAodTggKilDT05GSUdfU1lTX1BDSUUwX0NGR0JBU0UpCisJCXJldHVybiAoaXNfZW5kX3BvaW50KDApKTsKKwllbHNlIGlmIChob3NlLT5jZmdfZGF0YSA9PSAodTggKilDT05GSUdfU1lTX1BDSUUxX0NGR0JBU0UpCisJCXJldHVybiAoaXNfZW5kX3BvaW50KDEpKTsKKyNpZiBDT05GSUdfU1lTX1BDSUVfTlJfUE9SVFMgPiAyCisJZWxzZSBpZiAoaG9zZS0+Y2ZnX2RhdGEgPT0gKHU4ICopQ09ORklHX1NZU19QQ0lFMl9DRkdCQVNFKQorCQlyZXR1cm4gKGlzX2VuZF9wb2ludCgyKSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTgqIHBjaWVfZ2V0X2Jhc2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1bnNpZ25lZCBpbnQgZGV2Zm4pCit7CisJdTggKmJhc2UgPSAodTgqKWhvc2UtPmNmZ19kYXRhOworCisJLyogdXNlIGxvY2FsIGNvbmZpZ3VyYXRpb24gc3BhY2UgZm9yIHRoZSBmaXJzdCBidXMgKi8KKwlpZiAoUENJX0JVUyhkZXZmbikgPT0gMCkgeworCQlpZiAoaG9zZS0+Y2ZnX2RhdGEgPT0gKHU4KilDT05GSUdfU1lTX1BDSUUwX0NGR0JBU0UpCisJCQliYXNlID0gKHU4KilDT05GSUdfU1lTX1BDSUUwX1hDRkdCQVNFOworCQlpZiAoaG9zZS0+Y2ZnX2RhdGEgPT0gKHU4KilDT05GSUdfU1lTX1BDSUUxX0NGR0JBU0UpCisJCQliYXNlID0gKHU4KilDT05GSUdfU1lTX1BDSUUxX1hDRkdCQVNFOworI2lmIENPTkZJR19TWVNfUENJRV9OUl9QT1JUUyA+IDIKKwkJaWYgKGhvc2UtPmNmZ19kYXRhID09ICh1OCopQ09ORklHX1NZU19QQ0lFMl9DRkdCQVNFKQorCQkJYmFzZSA9ICh1OCopQ09ORklHX1NZU19QQ0lFMl9YQ0ZHQkFTRTsKKyNlbmRpZgorCX0KKworCXJldHVybiBiYXNlOworfQorCitzdGF0aWMgdm9pZCBwY2llX2RtZXJfZGlzYWJsZSh2b2lkKQoreworCW10ZGNyIChEQ1JOX1BFR1BMX0NGRyhEQ1JOX1BDSUUwX0JBU0UpLAorCQltZmRjciAoRENSTl9QRUdQTF9DRkcoRENSTl9QQ0lFMF9CQVNFKSkgfCBHUExfRE1FUl9NQVNLX0RJU0EpOworCW10ZGNyIChEQ1JOX1BFR1BMX0NGRyhEQ1JOX1BDSUUxX0JBU0UpLAorCQltZmRjciAoRENSTl9QRUdQTF9DRkcoRENSTl9QQ0lFMV9CQVNFKSkgfCBHUExfRE1FUl9NQVNLX0RJU0EpOworI2lmIENPTkZJR19TWVNfUENJRV9OUl9QT1JUUyA+IDIKKwltdGRjciAoRENSTl9QRUdQTF9DRkcoRENSTl9QQ0lFMl9CQVNFKSwKKwkJbWZkY3IgKERDUk5fUEVHUExfQ0ZHKERDUk5fUENJRTJfQkFTRSkpIHwgR1BMX0RNRVJfTUFTS19ESVNBKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwY2llX2RtZXJfZW5hYmxlKHZvaWQpCit7CisJbXRkY3IgKERDUk5fUEVHUExfQ0ZHIChEQ1JOX1BDSUUwX0JBU0UpLAorCQltZmRjciAoRENSTl9QRUdQTF9DRkcoRENSTl9QQ0lFMF9CQVNFKSkgJiB+R1BMX0RNRVJfTUFTS19ESVNBKTsKKwltdGRjciAoRENSTl9QRUdQTF9DRkcgKERDUk5fUENJRTFfQkFTRSksCisJCW1mZGNyIChEQ1JOX1BFR1BMX0NGRyhEQ1JOX1BDSUUxX0JBU0UpKSAmIH5HUExfRE1FUl9NQVNLX0RJU0EpOworI2lmIENPTkZJR19TWVNfUENJRV9OUl9QT1JUUyA+IDIKKwltdGRjciAoRENSTl9QRUdQTF9DRkcgKERDUk5fUENJRTJfQkFTRSksCisJCW1mZGNyIChEQ1JOX1BFR1BMX0NGRyhEQ1JOX1BDSUUyX0JBU0UpKSAmIH5HUExfRE1FUl9NQVNLX0RJU0EpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgcGNpZV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHVuc2lnbmVkIGludCBkZXZmbiwKKwlpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1MzIgKnZhbCkgeworCisJdTggKmFkZHJlc3M7CisJKnZhbCA9IDA7CisKKwlpZiAodmFsaWRhdGVfZW5kcG9pbnQoaG9zZSkpCisJCXJldHVybiAwOwkJLyogTm8gdXBzdHJlYW0gY29uZmlnIGFjY2VzcyAqLworCisJLyoKKwkgKiBCdXMgbnVtYmVycyBhcmUgcmVsYXRpdmUgdG8gaG9zZS0+Zmlyc3RfYnVzbm8KKwkgKi8KKwlkZXZmbiAtPSBQQ0lfQkRGKGhvc2UtPmZpcnN0X2J1c25vLCAwLCAwKTsKKworCS8qCisJICogTk9USUNFOiBjb25maWd1cmF0aW9uIHNwYWNlIHJhbmdlcyBhcmUgY3VycmVubHR5IG1hcHBlZCBvbmx5IGZvcgorCSAqIHRoZSBmaXJzdCAxNiBidXNlcywgc28gc3VjaCBsaW1pdCBtdXN0IGJlIGltcG9zZWQuIEluIGNhc2UgbW9yZQorCSAqIGJ1c2VzIGFyZSByZXF1aXJlZCB0aGUgVExCIHNldHRpbmdzIGluIGJvYXJkL2FtY2MvPGJvYXJkPi9pbml0LlMKKwkgKiBuZWVkIHRvIGJlIGFsdGVyZWQgYWNjb3JkaW5nbHkgKG9uZSBidXMgdGFrZXMgMSBNQiBvZiBtZW1vcnkgc3BhY2UpLgorCSAqLworCWlmIChQQ0lfQlVTKGRldmZuKSA+PSAxNikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE9ubHkgc2luZ2xlIGRldmljZS9zaW5nbGUgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGZvciB0aGUgcHJpbWFyeSBhbmQKKwkgKiBzZWNvbmRhcnkgYnVzZXMgb2YgdGhlIDQ0MFNQZSBob3N0IGJyaWRnZS4KKwkgKi8KKwlpZiAoKCEoKFBDSV9GVU5DKGRldmZuKSA9PSAwKSAmJiAoUENJX0RFVihkZXZmbikgPT0gMCkpKSAmJgorCQkoKFBDSV9CVVMoZGV2Zm4pID09IDApIHx8IChQQ0lfQlVTKGRldmZuKSA9PSAxKSkpCisJCXJldHVybiAwOworCisJYWRkcmVzcyA9IHBjaWVfZ2V0X2Jhc2UoaG9zZSwgZGV2Zm4pOworCW9mZnNldCArPSBkZXZmbiA8PCA0OworCisJLyoKKwkgKiBSZWFkaW5nIGZyb20gY29uZmlndXJhdGlvbiBzcGFjZSBvZiBub24tZXhpc3RpbmcgZGV2aWNlIGNhbgorCSAqIGdlbmVyYXRlIHRyYW5zYWN0aW9uIGVycm9ycy4gRm9yIHRoZSByZWFkIGR1cmF0aW9uIHdlIHN1cHByZXNzCisJICogYXNzZXJ0aW9uIG9mIG1hY2hpbmUgY2hlY2sgZXhjZXB0aW9ucyB0byBhdm9pZCB0aG9zZS4KKwkgKi8KKwlwY2llX2RtZXJfZGlzYWJsZSAoKTsKKworCWRlYnVnKCIlczogY2ZnX2RhdGE9JTA4eCBvZmZzZXQ9JTA4eFxuIiwgX19mdW5jX18sIGhvc2UtPmNmZ19kYXRhLCBvZmZzZXQpOworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQkqdmFsID0gaW5fOChob3NlLT5jZmdfZGF0YSArIG9mZnNldCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKnZhbCA9IGluX2xlMTYoKHUxNiAqKShob3NlLT5jZmdfZGF0YSArIG9mZnNldCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqdmFsID0gaW5fbGUzMigodTMyKikoaG9zZS0+Y2ZnX2RhdGEgKyBvZmZzZXQpKTsKKwkJYnJlYWs7CisJfQorCisJcGNpZV9kbWVyX2VuYWJsZSAoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjaWVfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdW5zaWduZWQgaW50IGRldmZuLAorCWludCBvZmZzZXQsIGludCBsZW4sIHUzMiB2YWwpIHsKKworCXU4ICphZGRyZXNzOworCisJaWYgKHZhbGlkYXRlX2VuZHBvaW50KGhvc2UpKQorCQlyZXR1cm4gMDsJCS8qIE5vIHVwc3RyZWFtIGNvbmZpZyBhY2Nlc3MgKi8KKworCS8qCisJICogQnVzIG51bWJlcnMgYXJlIHJlbGF0aXZlIHRvIGhvc2UtPmZpcnN0X2J1c25vCisJICovCisJZGV2Zm4gLT0gUENJX0JERihob3NlLT5maXJzdF9idXNubywgMCwgMCk7CisKKwkvKgorCSAqIFNhbWUgY29uc3RyYWludHMgYXMgaW4gcGNpZV9yZWFkX2NvbmZpZygpLgorCSAqLworCWlmIChQQ0lfQlVTKGRldmZuKSA+PSAxNikKKwkJcmV0dXJuIDA7CisKKwlpZiAoKCEoKFBDSV9GVU5DKGRldmZuKSA9PSAwKSAmJiAoUENJX0RFVihkZXZmbikgPT0gMCkpKSAmJgorCQkoKFBDSV9CVVMoZGV2Zm4pID09IDApIHx8IChQQ0lfQlVTKGRldmZuKSA9PSAxKSkpCisJCXJldHVybiAwOworCisJYWRkcmVzcyA9IHBjaWVfZ2V0X2Jhc2UoaG9zZSwgZGV2Zm4pOworCW9mZnNldCArPSBkZXZmbiA8PCA0OworCisJLyoKKwkgKiBTdXBwcmVzcyBNQ0sgZXhjZXB0aW9ucywgc2ltaWxhciB0byBwY2llX3JlYWRfY29uZmlnKCkKKwkgKi8KKwlwY2llX2RtZXJfZGlzYWJsZSAoKTsKKworCXN3aXRjaCAobGVuKSB7CisJY2FzZSAxOgorCQlvdXRfOChob3NlLT5jZmdfZGF0YSArIG9mZnNldCwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlvdXRfbGUxNigodTE2ICopKGhvc2UtPmNmZ19kYXRhICsgb2Zmc2V0KSwgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJb3V0X2xlMzIoKHUzMiAqKShob3NlLT5jZmdfZGF0YSArIG9mZnNldCksIHZhbCk7CisJCWJyZWFrOworCX0KKworCXBjaWVfZG1lcl9lbmFibGUgKCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBjaWVfcmVhZF9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UscGNpX2Rldl90IGRldixpbnQgb2Zmc2V0LHU4ICp2YWwpCit7CisJdTMyIHY7CisJaW50IHJ2OworCisJcnYgPSBwY2llX3JlYWRfY29uZmlnKGhvc2UsIGRldiwgb2Zmc2V0LCAxLCAmdik7CisJKnZhbCA9ICh1OCl2OworCXJldHVybiBydjsKK30KKworaW50IHBjaWVfcmVhZF9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UscGNpX2Rldl90IGRldixpbnQgb2Zmc2V0LHUxNiAqdmFsKQoreworCXUzMiB2OworCWludCBydjsKKworCXJ2ID0gcGNpZV9yZWFkX2NvbmZpZyhob3NlLCBkZXYsIG9mZnNldCwgMiwgJnYpOworCSp2YWwgPSAodTE2KXY7CisJcmV0dXJuIHJ2OworfQorCitpbnQgcGNpZV9yZWFkX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UscGNpX2Rldl90IGRldixpbnQgb2Zmc2V0LHUzMiAqdmFsKQoreworCXUzMiB2OworCWludCBydjsKKworCXJ2ID0gcGNpZV9yZWFkX2NvbmZpZyhob3NlLCBkZXYsIG9mZnNldCwgMywgJnYpOworCSp2YWwgPSAodTMyKXY7CisJcmV0dXJuIHJ2OworfQorCitpbnQgcGNpZV93cml0ZV9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UscGNpX2Rldl90IGRldixpbnQgb2Zmc2V0LHU4IHZhbCkKK3sKKwlyZXR1cm4gcGNpZV93cml0ZV9jb25maWcoaG9zZSwodTMyKWRldixvZmZzZXQsMSx2YWwpOworfQorCitpbnQgcGNpZV93cml0ZV9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UscGNpX2Rldl90IGRldixpbnQgb2Zmc2V0LHUxNiB2YWwpCit7CisJcmV0dXJuIHBjaWVfd3JpdGVfY29uZmlnKGhvc2UsKHUzMilkZXYsb2Zmc2V0LDIsKHUzMiApdmFsKTsKK30KKworaW50IHBjaWVfd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSxwY2lfZGV2X3QgZGV2LGludCBvZmZzZXQsdTMyIHZhbCkKK3sKKwlyZXR1cm4gcGNpZV93cml0ZV9jb25maWcoaG9zZSwodTMyKWRldixvZmZzZXQsMywodTMyICl2YWwpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfNDQwU1BFKQorc3RhdGljIHZvaWQgcHBjNHh4X3NldHVwX3V0bCh1MzIgcG9ydCkgeworCisJdm9sYXRpbGUgdm9pZCAqdXRsX2Jhc2UgPSBOVUxMOworCisJLyoKKwkgKiBNYXAgVVRMIHJlZ2lzdGVycworCSAqLworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMDoKKwkJbXRkY3IoRENSTl9QRUdQTF9SRUdCQUgoUENJRTApLCAweDAwMDAwMDBjKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9SRUdCQUwoUENJRTApLCAweDIwMDAwMDAwKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9SRUdNU0soUENJRTApLCAweDAwMDA3MDAxKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9TUEVDSUFMKFBDSUUwKSwgMHg2ODc4MjgwMCk7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQltdGRjcihEQ1JOX1BFR1BMX1JFR0JBSChQQ0lFMSksIDB4MDAwMDAwMGMpOworCQltdGRjcihEQ1JOX1BFR1BMX1JFR0JBTChQQ0lFMSksIDB4MjAwMDEwMDApOworCQltdGRjcihEQ1JOX1BFR1BMX1JFR01TSyhQQ0lFMSksIDB4MDAwMDcwMDEpOworCQltdGRjcihEQ1JOX1BFR1BMX1NQRUNJQUwoUENJRTEpLCAweDY4NzgyODAwKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCW10ZGNyKERDUk5fUEVHUExfUkVHQkFIKFBDSUUyKSwgMHgwMDAwMDAwYyk7CisJCW10ZGNyKERDUk5fUEVHUExfUkVHQkFMKFBDSUUyKSwgMHgyMDAwMjAwMCk7CisJCW10ZGNyKERDUk5fUEVHUExfUkVHTVNLKFBDSUUyKSwgMHgwMDAwNzAwMSk7CisJCW10ZGNyKERDUk5fUEVHUExfU1BFQ0lBTChQQ0lFMiksIDB4Njg3ODI4MDApOworCQlicmVhazsKKwl9CisJdXRsX2Jhc2UgPSAodW5zaWduZWQgaW50ICopKENPTkZJR19TWVNfUENJRV9CQVNFICsgMHgxMDAwICogcG9ydCk7CisKKwkvKgorCSAqIFNldCBidWZmZXIgYWxsb2NhdGlvbnMgYW5kIHRoZW4gYXNzZXJ0IFZSQiBhbmQgVFhFLgorCSAqLworCW91dF9iZTMyKHV0bF9iYXNlICsgUEVVVExfT1VUVFIsICAgMHgwODAwMDAwMCk7CisJb3V0X2JlMzIodXRsX2Jhc2UgKyBQRVVUTF9JTlRSLCAgICAweDAyMDAwMDAwKTsKKwlvdXRfYmUzMih1dGxfYmFzZSArIFBFVVRMX09QREJTWiwgIDB4MTAwMDAwMDApOworCW91dF9iZTMyKHV0bF9iYXNlICsgUEVVVExfUEJCU1osICAgMHg1MzAwMDAwMCk7CisJb3V0X2JlMzIodXRsX2Jhc2UgKyBQRVVUTF9JUEhCU1osICAweDA4MDAwMDAwKTsKKwlvdXRfYmUzMih1dGxfYmFzZSArIFBFVVRMX0lQREJTWiwgIDB4MTAwMDAwMDApOworCW91dF9iZTMyKHV0bF9iYXNlICsgUEVVVExfUkNJUlFFTiwgMHgwMGYwMDAwMCk7CisJb3V0X2JlMzIodXRsX2Jhc2UgKyBQRVVUTF9QQ1RMLCAgICAweDgwODAwMDY2KTsKK30KKworc3RhdGljIGludCBjaGVja19lcnJvcih2b2lkKQoreworCXUzMiB2YWxQRTAsIHZhbFBFMSwgdmFsUEUyOworCWludCBlcnIgPSAwOworCisJLyogU0RSMF9QRUdQTExMQ1QxIHJlc2V0ICovCisJaWYgKCEodmFsUEUwID0gU0RSX1JFQUQoUEVTRFIwX1BMTExDVDEpICYgMHgwMTAwMDAwMCkpCisJCXByaW50ZigiUENJRTogU0RSMF9QRUdQTExMQ1QxIHJlc2V0IGVycm9yIDB4JXhcbiIsIHZhbFBFMCk7CisKKwl2YWxQRTAgPSBTRFJfUkVBRChQRVNEUjBfUkNTU0VUKTsKKwl2YWxQRTEgPSBTRFJfUkVBRChQRVNEUjFfUkNTU0VUKTsKKwl2YWxQRTIgPSBTRFJfUkVBRChQRVNEUjJfUkNTU0VUKTsKKworCS8qIFNEUjBfUEV4UkNTU0VUIHJzdGd1ICovCisJaWYgKCEodmFsUEUwICYgMHgwMTAwMDAwMCkgfHwKKwkgICAgISh2YWxQRTEgJiAweDAxMDAwMDAwKSB8fAorCSAgICAhKHZhbFBFMiAmIDB4MDEwMDAwMDApKSB7CisJCXByaW50ZigiUENJRTogIFNEUjBfUEV4UkNTU0VUIHJzdGd1IGVycm9yXG4iKTsKKwkJZXJyID0gLTE7CisJfQorCisJLyogU0RSMF9QRXhSQ1NTRVQgcnN0ZGwgKi8KKwlpZiAoISh2YWxQRTAgJiAweDAwMDEwMDAwKSB8fAorCSAgICAhKHZhbFBFMSAmIDB4MDAwMTAwMDApIHx8CisJICAgICEodmFsUEUyICYgMHgwMDAxMDAwMCkpIHsKKwkJcHJpbnRmKCJQQ0lFOiAgU0RSMF9QRXhSQ1NTRVQgcnN0ZGwgZXJyb3JcbiIpOworCQllcnIgPSAtMTsKKwl9CisKKwkvKiBTRFIwX1BFeFJDU1NFVCByc3RweW4gKi8KKwlpZiAoKHZhbFBFMCAmIDB4MDAwMDEwMDApIHx8CisJICAgICh2YWxQRTEgJiAweDAwMDAxMDAwKSB8fAorCSAgICAodmFsUEUyICYgMHgwMDAwMTAwMCkpIHsKKwkJcHJpbnRmKCJQQ0lFOiAgU0RSMF9QRXhSQ1NTRVQgcnN0cHluIGVycm9yXG4iKTsKKwkJZXJyID0gLTE7CisJfQorCisJLyogU0RSMF9QRXhSQ1NTRVQgaGxkcGxiICovCisJaWYgKCh2YWxQRTAgJiAweDEwMDAwMDAwKSB8fAorCSAgICAodmFsUEUxICYgMHgxMDAwMDAwMCkgfHwKKwkgICAgKHZhbFBFMiAmIDB4MTAwMDAwMDApKSB7CisJCXByaW50ZigiUENJRTogIFNEUjBfUEV4UkNTU0VUIGhsZHBsYiBlcnJvclxuIik7CisJCWVyciA9IC0xOworCX0KKworCS8qIFNEUjBfUEV4UkNTU0VUIHJkeSAqLworCWlmICgodmFsUEUwICYgMHgwMDEwMDAwMCkgfHwKKwkgICAgKHZhbFBFMSAmIDB4MDAxMDAwMDApIHx8CisJICAgICh2YWxQRTIgJiAweDAwMTAwMDAwKSkgeworCQlwcmludGYoIlBDSUU6ICBTRFIwX1BFeFJDU1NFVCByZHkgZXJyb3JcbiIpOworCQllcnIgPSAtMTsKKwl9CisKKwkvKiBTRFIwX1BFeFJDU1NFVCBzaHV0ZG93biAqLworCWlmICgodmFsUEUwICYgMHgwMDAwMDEwMCkgfHwKKwkgICAgKHZhbFBFMSAmIDB4MDAwMDAxMDApIHx8CisJICAgICh2YWxQRTIgJiAweDAwMDAwMTAwKSkgeworCQlwcmludGYoIlBDSUU6ICBTRFIwX1BFeFJDU1NFVCBzaHV0ZG93biBlcnJvclxuIik7CisJCWVyciA9IC0xOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogSW5pdGlhbGl6ZSBQQ0kgRXhwcmVzcyBjb3JlCisgKi8KK2ludCBwcGM0eHhfaW5pdF9wY2llKHZvaWQpCit7CisJaW50IHRpbWVfb3V0ID0gMjA7CisKKwkvKiBTZXQgUExMIGNsb2NrIHJlY2VpdmVyIHRvIExWUEVDTCAqLworCVNEUl9XUklURShQRVNEUjBfUExMTENUMSwgU0RSX1JFQUQoUEVTRFIwX1BMTExDVDEpIHwgMSA8PCAyOCk7CisKKwlpZiAoY2hlY2tfZXJyb3IoKSkgeworCQlwcmludGYoIkVSUk9SOiBmYWlsZWQgdG8gc2V0IFBDSWUgcmVmZXJlbmNlIGNsb2NrIHJlY2VpdmVyIC0tIgorCQkJIlBFU0RSMF9QTExMQ1QxID0gMHglMDh4XG4iLCBTRFJfUkVBRChQRVNEUjBfUExMTENUMSkpOworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBEaWQgcmVzaXN0YW5jZSBjYWxpYnJhdGlvbiB3b3JrPyAqLworCWlmICghKFNEUl9SRUFEKFBFU0RSMF9QTExMQ1QyKSAmIDB4MTAwMDApKSB7CisJCXByaW50ZigiRVJST1I6IFBDSWUgcmVzaXN0YW5jZSBjYWxpYnJhdGlvbiBmYWlsZWQgLS0iCisJCQkiUEVTRFIwX1BMTExDVDIgPSAweCUwOHhcbiIsIFNEUl9SRUFEKFBFU0RSMF9QTExMQ1QyKSk7CisKKwkJcmV0dXJuIC0xOworCX0KKwkvKiBEZS1hc3NlcnQgcmVzZXQgb2YgUENJZSBQTEwsIHdhaXQgZm9yIGxvY2sgKi8KKwlTRFJfV1JJVEUoUEVTRFIwX1BMTExDVDEsIFNEUl9SRUFEKFBFU0RSMF9QTExMQ1QxKSAmIH4oMSA8PCAyNCkpOworCXVkZWxheSgzMDApOwkvKiAzMDAgdVMgaXMgbWF4aW11bSB0aW1lIGxvY2sgc2hvdWxkIHRha2UgKi8KKworCXdoaWxlICh0aW1lX291dCkgeworCQlpZiAoIShTRFJfUkVBRChQRVNEUjBfUExMTENUMykgJiAweDEwMDAwMDAwKSkgeworCQkJdGltZV9vdXQtLTsKKwkJCXVkZWxheSgyMCk7CS8qIFdhaXQgMjAgdVMgbW9yZSBpZiBuZWVkZWQgKi8KKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJaWYgKCF0aW1lX291dCkgeworCQlwcmludGYoIkVSUk9SOiBQQ0llIFBMTCBWQ08gb3V0cHV0IG5vdCBsb2NrZWQgdG8gcmVmIGNsb2NrIC0tIgorCQkJIlBFU0RSMF9QTExMQ1RTPTB4JTA4eFxuIiwgU0RSX1JFQUQoUEVTRFIwX1BMTExDVDMpKTsKKworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpCitzdGF0aWMgdm9pZCBwcGM0eHhfc2V0dXBfdXRsKHUzMiBwb3J0KQoreworCXZvbGF0aWxlIHZvaWQgKnV0bF9iYXNlID0gTlVMTDsKKworCS8qCisJICogTWFwIFVUTCByZWdpc3RlcnMgYXQgMHgwODAxX24wMDAgKDRLIDB4ZmZmIG1hc2spIFBFR1BMbl9SRUdNU0sKKwkgKi8KKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIDA6CisJCW10ZGNyKERDUk5fUEVHUExfUkVHQkFIKFBDSUUwKSwgVTY0X1RPX1UzMl9ISUdIKENPTkZJR19TWVNfUENJRTBfVVRMQkFTRSkpOworCQltdGRjcihEQ1JOX1BFR1BMX1JFR0JBTChQQ0lFMCksIFU2NF9UT19VMzJfTE9XKENPTkZJR19TWVNfUENJRTBfVVRMQkFTRSkpOworCQltdGRjcihEQ1JOX1BFR1BMX1JFR01TSyhQQ0lFMCksIDB4MDAwMDcwMDEpOwkvKiBCQU0gMTExMDAwMDA9NEtCICovCisJCW10ZGNyKERDUk5fUEVHUExfU1BFQ0lBTChQQ0lFMCksIDApOworCQlicmVhazsKKworCWNhc2UgMToKKwkJbXRkY3IoRENSTl9QRUdQTF9SRUdCQUgoUENJRTEpLCBVNjRfVE9fVTMyX0hJR0goQ09ORklHX1NZU19QQ0lFMF9VVExCQVNFKSk7CisJCW10ZGNyKERDUk5fUEVHUExfUkVHQkFMKFBDSUUxKSwgVTY0X1RPX1UzMl9MT1coQ09ORklHX1NZU19QQ0lFMF9VVExCQVNFKQorCQkJKyAweDEwMDApOworCQltdGRjcihEQ1JOX1BFR1BMX1JFR01TSyhQQ0lFMSksIDB4MDAwMDcwMDEpOwkvKiBCQU0gMTExMDAwMDA9NEtCICovCisJCW10ZGNyKERDUk5fUEVHUExfU1BFQ0lBTChQQ0lFMSksIDApOworCQlicmVhazsKKwl9CisJdXRsX2Jhc2UgPSAodW5zaWduZWQgaW50ICopKENPTkZJR19TWVNfUENJRV9CQVNFICsgMHgxMDAwICogcG9ydCk7CisKKwkvKgorCSAqIFNldCBidWZmZXIgYWxsb2NhdGlvbnMgYW5kIHRoZW4gYXNzZXJ0IFZSQiBhbmQgVFhFLgorCSAqLworCW91dF9iZTMyKHV0bF9iYXNlICsgUEVVVExfUEJDVEwsIDB4MDgwMDAwMGMpOwkvKiBQTEJNRSwgQ1JSRSAqLworCW91dF9iZTMyKHV0bF9iYXNlICsgUEVVVExfT1VUVFIsIDB4MDgwMDAwMDApOworCW91dF9iZTMyKHV0bF9iYXNlICsgUEVVVExfSU5UUiwgMHgwMjAwMDAwMCk7CisJb3V0X2JlMzIodXRsX2Jhc2UgKyBQRVVUTF9PUERCU1osIDB4MDQwMDAwMDApOwkvKiBPUEQgPSA1MTIgQnl0ZXMgKi8KKwlvdXRfYmUzMih1dGxfYmFzZSArIFBFVVRMX1BCQlNaLCAweDAwMDAwMDAwKTsJLyogTWF4IDUxMiBCeXRlcyAqLworCW91dF9iZTMyKHV0bF9iYXNlICsgUEVVVExfSVBIQlNaLCAweDAyMDAwMDAwKTsKKwlvdXRfYmUzMih1dGxfYmFzZSArIFBFVVRMX0lQREJTWiwgMHgwNDAwMDAwMCk7CS8qIElQRCA9IDUxMiBCeXRlcyAqLworCW91dF9iZTMyKHV0bF9iYXNlICsgUEVVVExfUkNJUlFFTiwgMHgwMGYwMDAwMCk7CisJb3V0X2JlMzIodXRsX2Jhc2UgKyBQRVVUTF9QQ1RMLCAweDgwODAwMDY2KTsJLyogVlJCLFRYRSx0aW1lb3V0PWRlZmF1bHQgKi8KK30KKworLyoKKyAqIFRPRE86IGRvdWJsZSBjaGVjayBQQ0kgZXhwcmVzcyBTRFIgYmFzZWQgb24gdGhlIGxhdGVzdCB1c2VyIG1hbnVhbAorICoJCSBTb21lIHJlZ2lzdGVycyBzcGVjaWZpZWQgaGVyZSBubyBsb25nZXIgZXhpc3QuLiBoYXMgdG8gYmUKKyAqCQkgdXBkYXRlZCBiYXNlZCBvbiB0aGUgZmluYWwgRUFTIHNwZWMuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZXJyb3Iodm9pZCkKK3sKKwl1MzIgdmFsUEUwLCB2YWxQRTE7CisJaW50IGVyciA9IDA7CisKKwl2YWxQRTAgPSBTRFJfUkVBRChTRFJOX1BFU0RSX1JDU1NFVCgwKSk7CisJdmFsUEUxID0gU0RSX1JFQUQoU0RSTl9QRVNEUl9SQ1NTRVQoMSkpOworCisJLyogU0RSMF9QRXhSQ1NTRVQgcnN0Z3UgKi8KKwlpZiAoISh2YWxQRTAgJiBQRVNEUnhfUkNTU0VUX1JTVEdVKSB8fCAhKHZhbFBFMSAmIFBFU0RSeF9SQ1NTRVRfUlNUR1UpKSB7CisJCXByaW50ZigiUENJRTogIFNEUjBfUEV4UkNTU0VUIHJzdGd1IGVycm9yXG4iKTsKKwkJZXJyID0gLTE7CisJfQorCisJLyogU0RSMF9QRXhSQ1NTRVQgcnN0ZGwgKi8KKwlpZiAoISh2YWxQRTAgJiBQRVNEUnhfUkNTU0VUX1JTVERMKSB8fCAhKHZhbFBFMSAmIFBFU0RSeF9SQ1NTRVRfUlNUREwpKSB7CisJCXByaW50ZigiUENJRTogIFNEUjBfUEV4UkNTU0VUIHJzdGRsIGVycm9yXG4iKTsKKwkJZXJyID0gLTE7CisJfQorCisJLyogU0RSMF9QRXhSQ1NTRVQgcnN0cHluICovCisJaWYgKCh2YWxQRTAgJiBQRVNEUnhfUkNTU0VUX1JTVFBZTikgfHwgKHZhbFBFMSAmIFBFU0RSeF9SQ1NTRVRfUlNUUFlOKSkgeworCQlwcmludGYoIlBDSUU6ICBTRFIwX1BFeFJDU1NFVCByc3RweW4gZXJyb3JcbiIpOworCQllcnIgPSAtMTsKKwl9CisKKwkvKiBTRFIwX1BFeFJDU1NFVCBobGRwbGIgKi8KKwlpZiAoKHZhbFBFMCAmIFBFU0RSeF9SQ1NTRVRfSExEUExCKSB8fCAodmFsUEUxICYgUEVTRFJ4X1JDU1NFVF9ITERQTEIpKSB7CisJCXByaW50ZigiUENJRTogIFNEUjBfUEV4UkNTU0VUIGhsZHBsYiBlcnJvclxuIik7CisJCWVyciA9IC0xOworCX0KKworCS8qIFNEUjBfUEV4UkNTU0VUIHJkeSAqLworCWlmICgodmFsUEUwICYgUEVTRFJ4X1JDU1NFVF9SRFkpIHx8ICh2YWxQRTEgJiBQRVNEUnhfUkNTU0VUX1JEWSkpIHsKKwkJcHJpbnRmKCJQQ0lFOiAgU0RSMF9QRXhSQ1NTRVQgcmR5IGVycm9yXG4iKTsKKwkJZXJyID0gLTE7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEluaXRpYWxpemUgUENJIEV4cHJlc3MgY29yZSBhcyBkZXNjcmliZWQgaW4gVXNlciBNYW51YWwKKyAqIFRPRE86IGRvdWJsZSBjaGVjayBQRSBTRFIgUExMIFJlZ2lzdGVyIHdpdGggdGhlIHVwZGF0ZWQgdXNlciBtYW51YWwuCisgKi8KK2ludCBwcGM0eHhfaW5pdF9wY2llKHZvaWQpCit7CisJaWYgKGNoZWNrX2Vycm9yKCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR180NjBFWCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfNDA1RVgpCitzdGF0aWMgdm9pZCBwcGM0eHhfc2V0dXBfdXRsKHUzMiBwb3J0KQoreworCXUzMiB1dGxfYmFzZTsKKworCS8qCisJICogTWFwIFVUTCByZWdpc3RlcnMgYXQgMHhlZjRmX24wMDAgKDRLIDB4ZmZmIG1hc2spIFBFR1BMbl9SRUdNU0sKKwkgKi8KKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIDA6CisJCW10ZGNyKERDUk5fUEVHUExfUkVHQkFIKFBDSUUwKSwgMHgwMDAwMDAwMCk7CisJCW10ZGNyKERDUk5fUEVHUExfUkVHQkFMKFBDSUUwKSwgQ09ORklHX1NZU19QQ0lFMF9VVExCQVNFKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9SRUdNU0soUENJRTApLCAweDAwMDA3MDAxKTsgLyogNGsgcmVnaW9uLCB2YWxpZCAqLworCQltdGRjcihEQ1JOX1BFR1BMX1NQRUNJQUwoUENJRTApLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCW10ZGNyKERDUk5fUEVHUExfUkVHQkFIKFBDSUUxKSwgMHgwMDAwMDAwMCk7CisJCW10ZGNyKERDUk5fUEVHUExfUkVHQkFMKFBDSUUxKSwgQ09ORklHX1NZU19QQ0lFMV9VVExCQVNFKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9SRUdNU0soUENJRTEpLCAweDAwMDA3MDAxKTsgLyogNGsgcmVnaW9uLCB2YWxpZCAqLworCQltdGRjcihEQ1JOX1BFR1BMX1NQRUNJQUwoUENJRTEpLCAwKTsKKworCQlicmVhazsKKwl9CisJdXRsX2Jhc2UgPSAocG9ydD09MCkgPyBDT05GSUdfU1lTX1BDSUUwX1VUTEJBU0UgOiBDT05GSUdfU1lTX1BDSUUxX1VUTEJBU0U7CisKKwkvKgorCSAqIFNldCBidWZmZXIgYWxsb2NhdGlvbnMgYW5kIHRoZW4gYXNzZXJ0IFZSQiBhbmQgVFhFLgorCSAqLworCW91dF9iZTMyKCh1MzIgKikodXRsX2Jhc2UgKyBQRVVUTF9PVVRUUiksICAgMHgwMjAwMDAwMCk7CisJb3V0X2JlMzIoKHUzMiAqKSh1dGxfYmFzZSArIFBFVVRMX0lOVFIpLCAgICAweDAyMDAwMDAwKTsKKwlvdXRfYmUzMigodTMyICopKHV0bF9iYXNlICsgUEVVVExfT1BEQlNaKSwgIDB4MDQwMDAwMDApOworCW91dF9iZTMyKCh1MzIgKikodXRsX2Jhc2UgKyBQRVVUTF9QQkJTWiksICAgMHgyMTAwMDAwMCk7CisJb3V0X2JlMzIoKHUzMiAqKSh1dGxfYmFzZSArIFBFVVRMX0lQSEJTWiksICAweDAyMDAwMDAwKTsKKwlvdXRfYmUzMigodTMyICopKHV0bF9iYXNlICsgUEVVVExfSVBEQlNaKSwgIDB4MDQwMDAwMDApOworCW91dF9iZTMyKCh1MzIgKikodXRsX2Jhc2UgKyBQRVVUTF9SQ0lSUUVOKSwgMHgwMGYwMDAwMCk7CisJb3V0X2JlMzIoKHUzMiAqKSh1dGxfYmFzZSArIFBFVVRMX1BDVEwpLCAgICAweDgwODAwMDY2KTsKKworCW91dF9iZTMyKCh1MzIgKikodXRsX2Jhc2UgKyBQRVVUTF9QQkNUTCksICAgMHgwODAwMDAwYyk7CisJb3V0X2JlMzIoKHUzMiAqKSh1dGxfYmFzZSArIFBFVVRMX1JDU1RBKSwKKwkJIGluX2JlMzIoKHUzMiAqKSh1dGxfYmFzZSArIFBFVVRMX1JDU1RBKSkgfCAweDAwMDA0MDAwMCk7Cit9CisKK2ludCBwcGM0eHhfaW5pdF9wY2llKHZvaWQpCit7CisJLyoKKwkgKiBOb3RoaW5nIHRvIGRvIG9uIDQwNUVYCisJICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHXzQwNUVYICovCisKKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBwY2llIGluaXRpYWxpemF0aW9uCisgKiBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBwcGM0eHhfaW5pdF9wY2llX3BvcnRfaHcoKSBpZiBuZWVkZWQKKyAqLworCisvKgorICogSW5pdGlhbGl6ZSB2YXJpb3VzIHBhcnRzIG9mIHRoZSBQQ0kgRXhwcmVzcyBjb3JlIGZvciBvdXIgcG9ydDoKKyAqCisgKiAtIFNldCBhcyBhIHJvb3QgcG9ydCBhbmQgZW5hYmxlIG1heCB3aWR0aAorICogICAoUFhJRTAgLT4gWDgsIFBDSUUxIGFuZCBQQ0lFMiAtPiBYNCkuCisgKiAtIFNldCB1cCBVVEwgY29uZmlndXJhdGlvbi4KKyAqIC0gSW5jcmVhc2UgU0VSREVTIGRyaXZlIHN0cmVuZ3RoIHRvIGxldmVscyBzdWdnZXN0ZWQgYnkgQU1DQy4KKyAqIC0gRGUtYXNzZXJ0IFJTVFBZTiwgUlNUREwgYW5kIFJTVEdVLgorICoKKyAqIE5PVElDRSBmb3IgNDQwU1BFIHJldkIgY2hpcDogUEVTRFJuX1VUTFNFVDIgaXMgbm90IHNldCAtIHdlIGxlYXZlIGl0CisgKiB3aXRoIGRlZmF1bHQgc2V0dGluZyAweDExMzEwMDAwLiBUaGUgcmVnaXN0ZXIgaGFzIG5ldyBmaWVsZHMsCisgKiBQRVNEUm5fVVRMU0VUMltMS0lORV0gaW4gcGFydGljdWxhcjogY2xlYXJpbmcgaXQgbGVhZHMgdG8gUENJRSBjb3JlCisgKiBoYW5nLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfNDQwU1BFKQoraW50IF9fcHBjNHh4X2luaXRfcGNpZV9wb3J0X2h3KGludCBwb3J0LCBpbnQgcm9vdHBvcnQpCit7CisJdTMyIHZhbCA9IDEgPDwgMjQ7CisJdTMyIHV0bHNldDE7CisKKwlpZiAocm9vdHBvcnQpIHsKKwkJdmFsID0gUFRZUEVfUk9PVF9QT1JUIDw8IDIwOworCQl1dGxzZXQxID0gMHgyMTIyMjIyMjsKKwl9IGVsc2UgeworCQl2YWwgPSBQVFlQRV9MRUdBQ1lfRU5EUE9JTlQgPDwgMjA7CisJCXV0bHNldDEgPSAweDIwMjIyMjIyOworCX0KKworCWlmIChwb3J0ID09IDApCisJCXZhbCB8PSBMTktXX1g4IDw8IDEyOworCWVsc2UKKwkJdmFsIHw9IExOS1dfWDQgPDwgMTI7CisKKwlTRFJfV1JJVEUoU0RSTl9QRVNEUl9ETFBTRVQocG9ydCksIHZhbCk7CisJU0RSX1dSSVRFKFNEUk5fUEVTRFJfVVRMU0VUMShwb3J0KSwgdXRsc2V0MSk7CisJaWYgKCFwcGM0NDBzcGVfcmV2QigpKQorCQlTRFJfV1JJVEUoU0RSTl9QRVNEUl9VVExTRVQyKHBvcnQpLCAweDExMDAwMDAwKTsKKwlTRFJfV1JJVEUoU0RSTl9QRVNEUl9IU1NMMFNFVDEocG9ydCksIDB4MzUwMDAwMDApOworCVNEUl9XUklURShTRFJOX1BFU0RSX0hTU0wxU0VUMShwb3J0KSwgMHgzNTAwMDAwMCk7CisJU0RSX1dSSVRFKFNEUk5fUEVTRFJfSFNTTDJTRVQxKHBvcnQpLCAweDM1MDAwMDAwKTsKKwlTRFJfV1JJVEUoU0RSTl9QRVNEUl9IU1NMM1NFVDEocG9ydCksIDB4MzUwMDAwMDApOworCWlmIChwb3J0ID09IDApIHsKKwkJU0RSX1dSSVRFKFBFU0RSMF9IU1NMNFNFVDEsIDB4MzUwMDAwMDApOworCQlTRFJfV1JJVEUoUEVTRFIwX0hTU0w1U0VUMSwgMHgzNTAwMDAwMCk7CisJCVNEUl9XUklURShQRVNEUjBfSFNTTDZTRVQxLCAweDM1MDAwMDAwKTsKKwkJU0RSX1dSSVRFKFBFU0RSMF9IU1NMN1NFVDEsIDB4MzUwMDAwMDApOworCX0KKwlTRFJfV1JJVEUoU0RSTl9QRVNEUl9SQ1NTRVQocG9ydCksIChTRFJfUkVBRChTRFJOX1BFU0RSX1JDU1NFVChwb3J0KSkgJgorCQkJCQkgICAgfigxIDw8IDI0IHwgMSA8PCAxNikpIHwgMSA8PCAxMik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfNDQwU1BFICovCisKKyNpZiBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpCitpbnQgX19wcGM0eHhfaW5pdF9wY2llX3BvcnRfaHcoaW50IHBvcnQsIGludCByb290cG9ydCkKK3sKKwl1MzIgdmFsOworCXUzMiB1dGxzZXQxOworCisJaWYgKHJvb3Rwb3J0KQorCQl2YWwgPSBQVFlQRV9ST09UX1BPUlQgPDwgMjA7CisJZWxzZQorCQl2YWwgPSBQVFlQRV9MRUdBQ1lfRU5EUE9JTlQgPDwgMjA7CisKKwlpZiAocG9ydCA9PSAwKSB7CisJCXZhbCB8PSBMTktXX1gxIDw8IDEyOworCQl1dGxzZXQxID0gMHgyMDAwMDAwMDsKKwl9IGVsc2UgeworCQl2YWwgfD0gTE5LV19YNCA8PCAxMjsKKwkJdXRsc2V0MSA9IDB4MjAxMDExMDE7CisJfQorCisJU0RSX1dSSVRFKFNEUk5fUEVTRFJfRExQU0VUKHBvcnQpLCB2YWwpOworCVNEUl9XUklURShTRFJOX1BFU0RSX1VUTFNFVDEocG9ydCksIHV0bHNldDEpOworCVNEUl9XUklURShTRFJOX1BFU0RSX1VUTFNFVDIocG9ydCksIDB4MDEyMTAwMDApOworCisJc3dpdGNoIChwb3J0KSB7CisJY2FzZSAwOgorCQlTRFJfV1JJVEUoUEVTRFIwX0wwQ0RSQ1RMLCAweDAwMDAzMjMwKTsKKwkJU0RSX1dSSVRFKFBFU0RSMF9MMERSViwgMHgwMDAwMDEzMCk7CisJCVNEUl9XUklURShQRVNEUjBfTDBDTEssIDB4MDAwMDAwMDYpOworCisJCVNEUl9XUklURShQRVNEUjBfUEhZX0NUTF9SU1QsMHgxMDAwMDAwMCk7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQlTRFJfV1JJVEUoUEVTRFIxX0wwQ0RSQ1RMLCAweDAwMDAzMjMwKTsKKwkJU0RSX1dSSVRFKFBFU0RSMV9MMUNEUkNUTCwgMHgwMDAwMzIzMCk7CisJCVNEUl9XUklURShQRVNEUjFfTDJDRFJDVEwsIDB4MDAwMDMyMzApOworCQlTRFJfV1JJVEUoUEVTRFIxX0wzQ0RSQ1RMLCAweDAwMDAzMjMwKTsKKwkJU0RSX1dSSVRFKFBFU0RSMV9MMERSViwgMHgwMDAwMDEzMCk7CisJCVNEUl9XUklURShQRVNEUjFfTDFEUlYsIDB4MDAwMDAxMzApOworCQlTRFJfV1JJVEUoUEVTRFIxX0wyRFJWLCAweDAwMDAwMTMwKTsKKwkJU0RSX1dSSVRFKFBFU0RSMV9MM0RSViwgMHgwMDAwMDEzMCk7CisJCVNEUl9XUklURShQRVNEUjFfTDBDTEssIDB4MDAwMDAwMDYpOworCQlTRFJfV1JJVEUoUEVTRFIxX0wxQ0xLLCAweDAwMDAwMDA2KTsKKwkJU0RSX1dSSVRFKFBFU0RSMV9MMkNMSywgMHgwMDAwMDAwNik7CisJCVNEUl9XUklURShQRVNEUjFfTDNDTEssIDB4MDAwMDAwMDYpOworCisJCVNEUl9XUklURShQRVNEUjFfUEhZX0NUTF9SU1QsMHgxMDAwMDAwMCk7CisJCWJyZWFrOworCX0KKworCVNEUl9XUklURShTRFJOX1BFU0RSX1JDU1NFVChwb3J0KSwgU0RSX1JFQUQoU0RSTl9QRVNEUl9SQ1NTRVQocG9ydCkpIHwKKwkJICAoUEVTRFJ4X1JDU1NFVF9SU1RHVSB8IFBFU0RSeF9SQ1NTRVRfUlNUUFlOKSk7CisKKwkvKiBQb2xsIGZvciBQSFkgcmVzZXQgKi8KKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIDA6CisJCXdoaWxlICghKFNEUl9SRUFEKFBFU0RSMF9SU1RTVEEpICYgMHgxKSkKKwkJCXVkZWxheSgxMCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJd2hpbGUgKCEoU0RSX1JFQUQoUEVTRFIxX1JTVFNUQSkgJiAweDEpKQorCQkJdWRlbGF5KDEwKTsKKwkJYnJlYWs7CisJfQorCisJU0RSX1dSSVRFKFNEUk5fUEVTRFJfUkNTU0VUKHBvcnQpLAorCQkgIChTRFJfUkVBRChTRFJOX1BFU0RSX1JDU1NFVChwb3J0KSkgJgorCQkgICB+KFBFU0RSeF9SQ1NTRVRfUlNUR1UgfCBQRVNEUnhfUkNTU0VUX1JTVERMKSkgfAorCQkgIFBFU0RSeF9SQ1NTRVRfUlNUUFlOKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR180NDBTUEUgKi8KKworI2lmIGRlZmluZWQoQ09ORklHXzQwNUVYKQoraW50IF9fcHBjNHh4X2luaXRfcGNpZV9wb3J0X2h3KGludCBwb3J0LCBpbnQgcm9vdHBvcnQpCit7CisJdTMyIHZhbDsKKworCWlmIChyb290cG9ydCkKKwkJdmFsID0gMHgwMDQwMTAwMDsKKwllbHNlCisJCXZhbCA9IDB4MDAxMDEwMDA7CisKKwlTRFJfV1JJVEUoU0RSTl9QRVNEUl9ETFBTRVQocG9ydCksIHZhbCk7CisJU0RSX1dSSVRFKFNEUk5fUEVTRFJfVVRMU0VUMShwb3J0KSwgMHgwMDAwMDAwMCk7CisJU0RSX1dSSVRFKFNEUk5fUEVTRFJfVVRMU0VUMihwb3J0KSwgMHgwMTAxMDAwMCk7CisJU0RSX1dSSVRFKFNEUk5fUEVTRFJfUEhZU0VUMShwb3J0KSwgMHg3MjBGMDAwMCk7CisJU0RSX1dSSVRFKFNEUk5fUEVTRFJfUEhZU0VUMihwb3J0KSwgMHg3MDYwMDAwMyk7CisKKwkvKiBBc3NlcnQgdGhlIFBFMF9QSFkgcmVzZXQgKi8KKwlTRFJfV1JJVEUoU0RSTl9QRVNEUl9SQ1NTRVQocG9ydCksIDB4MDEwMTAwMDApOworCXVkZWxheSgxMDAwKTsKKworCS8qIGRlYXNzZXJ0IHRoZSBQRTBfaG90cmVzZXQgKi8KKwlpZiAoaXNfZW5kX3BvaW50KHBvcnQpKQorCQlTRFJfV1JJVEUoU0RSTl9QRVNEUl9SQ1NTRVQocG9ydCksIDB4MDExMTEwMDApOworCWVsc2UKKwkJU0RSX1dSSVRFKFNEUk5fUEVTRFJfUkNTU0VUKHBvcnQpLCAweDAxMTAxMDAwKTsKKworCS8qIHBvbGwgZm9yIHBoeSAhcmVzZXQgKi8KKwl3aGlsZSAoIShTRFJfUkVBRChTRFJOX1BFU0RSX1BIWVNUQShwb3J0KSkgJiAweDAwMDAxMDAwKSkKKwkJOworCisJLyogZGVhc3NlcnQgdGhlIFBFMF9ncGxfdXRsX3Jlc2V0ICovCisJU0RSX1dSSVRFKFNEUk5fUEVTRFJfUkNTU0VUKHBvcnQpLCAweDAwMTAxMDAwKTsKKworCWlmIChwb3J0ID09IDApCisJCW10ZGNyKERDUk5fUEVHUExfQ0ZHKFBDSUUwKSwgMHgxMDAwMDAwMCk7ICAvKiBndWFyZGVkIG9uICovCisJZWxzZQorCQltdGRjcihEQ1JOX1BFR1BMX0NGRyhQQ0lFMSksIDB4MTAwMDAwMDApOyAgLyogZ3VhcmRlZCBvbiAqLworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHXzQwNUVYICovCisKK2ludCBwcGM0eHhfaW5pdF9wY2llX3BvcnRfaHcoaW50IHBvcnQsIGludCByb290cG9ydCkKK19fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3BwYzR4eF9pbml0X3BjaWVfcG9ydF9odyIpKSk7CisKKy8qCisgKiBXZSBtYXAgUENJIEV4cHJlc3MgY29uZmlndXJhdGlvbiBhY2Nlc3MgaW50byB0aGUgNTEyTUIgcmVnaW9ucworICoKKyAqIE5PVElDRTogcmV2QiBpcyB2ZXJ5IHN0cmljdCBhYm91dCBQTEIgcmVhbCBhZGRyZXNzZXNzIGFuZCByYW5nZXMgdG8KKyAqIGJlIG1hcHBlZCBmb3IgY29uZmlnIHNwYWNlOyBpdCBzZWVtcyB0byBvbmx5IHdvcmsgd2l0aCBkX25ubm5fbm5ubgorICogcmFuZ2UgKGhhbmdzIHRoZSBjb3JlIHVwb24gY29uZmlnIHRyYW5zYWN0aW9uIGF0dGVtcHRzIHdoZW4gc2V0CisgKiBvdGhlcndpc2UpIHdoaWxlIHJldkEgdXNlcyBjX25ubm5fbm5ubi4KKyAqCisgKiBGb3IgNDQwU1BlIHJldkE6CisgKiAgICAgUENJRTA6IDB4Y180MDAwXzAwMDAKKyAqICAgICBQQ0lFMTogMHhjXzgwMDBfMDAwMAorICogICAgIFBDSUUyOiAweGNfYzAwMF8wMDAwCisgKgorICogRm9yIDQ0MFNQZSByZXZCOgorICogICAgIFBDSUUwOiAweGRfMDAwMF8wMDAwCisgKiAgICAgUENJRTE6IDB4ZF8yMDAwXzAwMDAKKyAqICAgICBQQ0lFMjogMHhkXzQwMDBfMDAwMAorICoKKyAqIEZvciA0MDVFWDoKKyAqICAgICBQQ0lFMDogMHhhMDAwXzAwMDAKKyAqICAgICBQQ0lFMTogMHhjMDAwXzAwMDAKKyAqCisgKiBGb3IgNDYwRVgvR1Q6CisgKiAgICAgUENJRTA6IDB4ZF8wMDAwXzAwMDAKKyAqICAgICBQQ0lFMTogMHhkXzIwMDBfMDAwMAorICovCitzdGF0aWMgaW5saW5lIHU2NCBwcGM0eHhfZ2V0X2NmZ2FkZHIoaW50IHBvcnQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfNDA1RVgpCisJaWYgKHBvcnQgPT0gMCkKKwkJcmV0dXJuICh1NjQpQ09ORklHX1NZU19QQ0lFMF9DRkdCQVNFOworCWVsc2UKKwkJcmV0dXJuICh1NjQpQ09ORklHX1NZU19QQ0lFMV9DRkdCQVNFOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfNDQwU1BFKQorCWlmIChwcGM0NDBzcGVfcmV2QigpKSB7CisJCXN3aXRjaCAocG9ydCkgeworCQlkZWZhdWx0OgkvKiB0byBzYXRpc2Z5IGNvbXBpbGVyICovCisJCWNhc2UgMDoKKwkJCXJldHVybiAweDAwMDAwMDBkMDAwMDAwMDBVTEw7CisJCWNhc2UgMToKKwkJCXJldHVybiAweDAwMDAwMDBkMjAwMDAwMDBVTEw7CisJCWNhc2UgMjoKKwkJCXJldHVybiAweDAwMDAwMDBkNDAwMDAwMDBVTEw7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBvcnQpIHsKKwkJZGVmYXVsdDoJLyogdG8gc2F0aXNmeSBjb21waWxlciAqLworCQljYXNlIDA6CisJCQlyZXR1cm4gMHgwMDAwMDAwYzQwMDAwMDAwVUxMOworCQljYXNlIDE6CisJCQlyZXR1cm4gMHgwMDAwMDAwYzgwMDAwMDAwVUxMOworCQljYXNlIDI6CisJCQlyZXR1cm4gMHgwMDAwMDAwY2MwMDAwMDAwVUxMOworCQl9CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKQorCWlmIChwb3J0ID09IDApCisJCXJldHVybiAweDAwMDAwMDBkMDAwMDAwMDBVTEw7CisJZWxzZQorCQlyZXR1cm4gMHgwMDAwMDAwZDIwMDAwMDAwVUxMOworI2VuZGlmCit9CisKKy8qCisgKiAgNHh4IGJvYXJkcyBhcyBlbmRwb2ludCBhbmQgcm9vdCBwb2ludCBzZXR1cAorICogICAgICAgICAgICAgICAgICAgIGFuZAorICogICAgdGVzdGluZyBpbmJvdW5kIGFuZCBvdXQgYm91bmQgd2luZG93cworICoKKyAqICA0eHggYm9hcmRzIGNhbiBiZSBwbHVnZ2VkIGludG8gYW5vdGhlciA0eHggYm9hcmRzIG9yIHlvdSBjYW4gZ2V0IFBDSS1FCisgKiAgY2FibGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2V0dXAgbG9vcCBiYWNrIGZyb20gb25lIHBvcnQgdG8gYW5vdGhlciBwb3J0LgorICogIFBsZWFzZSByZW1lbWViZXIgdGhhdCB1bmxlc3MgdGhlcmUgaXMgYSBlbmRwb2ludCBwbHVnZ2VkIGluIHRvIHJvb3QgcG9ydCBpdAorICogIHdpbGwgbm90IGluaXRpYWxpemUuIEl0IGlzIHRoZSBzYW1lIGluIGNhc2Ugb2YgZW5kcG9pbnQgLCB1bmxlc3MgdGhlcmUgaXMKKyAqICByb290IHBvcnQgYXR0YWNoZWQgaXQgd2lsbCBub3QgaW5pdGlhbGl6ZS4KKyAqCisgKiAgSW4gdGhpcyByZWxlYXNlIG9mIHNvZnR3YXJlIGFsbCB0aGUgUENJLUUgcG9ydHMgYXJlIGNvbmZpZ3VyZWQgYXMgZWl0aGVyCisgKiAgZW5kcG9pbnQgb3Igcm9vdHBvaW50LkluIGZ1dHVyZSB3ZSB3aWxsIGhhdmUgc3VwcG9ydCBmb3Igc2VsZWN0aXZlIHBvcnRzCisgKiAgc2V0dXAgYXMgZW5kcG9pbnQgYW5kIHJvb3QgcG9pbnQgaW4gc2luZ2xlIGJvYXJkLgorICoKKyAqICBPbmNlIHlvdXIgYm9hcmQgY2FtZSB1cCBhcyByb290IHBvaW50ICwgeW91IGNhbiB2ZXJpZnkgYnkgcmVhZGluZworICogIC9wcm9jL2J1cy9wY2kvZGV2aWNlcy4gV2hlcmUgeW91IGNhbiBzZWUgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgKiAgb2YgZW5kcG9pbnQgZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBwb3J0LgorICoKKyAqICBFbnBvaW50IGNvZmlndXJhdGlvbiBjYW4gYmUgdmVyaWZpZWQgYnkgY29ubmVjdGluZyA0eHggYm9hcmQgdG8gYW55CisgKiAgaG9zdCBvciBhbm90aGVyIDR4eCBib2FyZC4gVGhlbiB0cnkgdG8gc2NhbiB0aGUgZGV2aWNlLiBJbiBjYXNlIG9mCisgKiAgbGludXggdXNlICJsc3BjaSIgb3IgYXBwcmlwcmlhdGUgb3MgY29tbWFuZC4KKyAqCisgKiAgSG93IGRvIEkgdmVyaWZ5IHRoZSBpbmJvdW5kIGFuZCBvdXQgYm91bmQgd2luZG93cyA/ICg0eHggdG8gNHh4KQorICogIGluIHRoaXMgY29uZmlndXJhdGlvbiBpbmJvdW5kIGFuZCBvdXRib3VuZCB3aW5kb3dzIGFyZSBzZXR1cCB0byBhY2Nlc3MKKyAqICBzcmFtIG1lbXJveSBhcmVhLiBTUkFNIGlzIGF0IDB4NCAwMDAwIDAwMDAgLCBvbiBQTEIgYnVzLiBUaGlzIGFkZHJlc3MKKyAqICBpcyBtYXBwZWQgYXQgMHg5MDAwMDAwMC4gRnJvbSB1LWJvb3QgcHJvbXB0IHdyaXRlIGRhdGEgMHhiMDAwIDAwMDAsCisgKiAgVGhpcyBpcyB3YWVyZSB5b3VyIFBPTShQTEIgb3V0IGJvdW5kIG1lbW9yeSB3aW5kb3cpIG1hcHBlZC4gdGhlbgorICogIHJlYWQgdGhlIGRhdGEgZnJvbSBvdGhlciA0eHggYm9hcmQncyB1LWJvb3QgcHJvbXB0IGF0IGFkZHJlc3MKKyAqICAweDkwMDAgMDAwMChTUkFNKS4gRGF0YSBzaG91bGQgbWF0Y2guCisgKiAgSW4gY2FzZSBvZiBpbmJvdW5kICwgd3JpdGUgZGF0YSB0byB1LWJvb3QgY29tbWFuZCBwcm9tcHQgYXQgMHhiMDAwIDAwMDAKKyAqICB3aGljaCBpcyBtYXBwZWQgdG8gMHg0IDAwMDAgMDAwMC4gTm93IG9uIHJvb3Rwb2ludCB5dWNjYSB1LWJvb3QgcHJvbXB0IGNoZWNrCisgKiAgZGF0YSBhdCAweDkwMDAgMDAwMChTUkFNKS5EYXRhIHNob3VsZCBtYXRjaC4KKyAqLworaW50IHBwYzR4eF9pbml0X3BjaWVfcG9ydChpbnQgcG9ydCwgaW50IHJvb3Rwb3J0KQoreworCXN0YXRpYyBpbnQgY29yZV9pbml0OworCXZvbGF0aWxlIHUzMiB2YWwgPSAwOworCWludCBhdHRlbXB0czsKKwl1NjQgYWRkcjsKKwl1MzIgbG93LCBoaWdoOworCisJaWYgKCFjb3JlX2luaXQpIHsKKwkJaWYgKHBwYzR4eF9pbml0X3BjaWUoKSkKKwkJCXJldHVybiAtMTsKKwkJKytjb3JlX2luaXQ7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHZhcmlvdXMgcGFydHMgb2YgdGhlIFBDSSBFeHByZXNzIGNvcmUgZm9yIG91ciBwb3J0CisJICovCisJcHBjNHh4X2luaXRfcGNpZV9wb3J0X2h3KHBvcnQsIHJvb3Rwb3J0KTsKKworCS8qCisJICogTm90aWNlOiB0aGUgZm9sbG93aW5nIGRlbGF5IGhhcyBjcml0aWNhbCBpbXBhY3Qgb24gZGV2aWNlCisJICogaW5pdGlhbGl6YXRpb24gLSBpZiB0b28gc2hvcnQgKDw1MG1zKSB0aGUgbGluayBkb2Vzbid0IGdldCB1cC4KKwkgKi8KKwltZGVsYXkoMTAwKTsKKworCXZhbCA9IFNEUl9SRUFEKFNEUk5fUEVTRFJfUkNTU1RTKHBvcnQpKTsKKwlpZiAodmFsICYgKDEgPDwgMjApKSB7CisJCXByaW50ZigiUENJRSVkOiBQR1JTVCBmYWlsZWQgJTA4eFxuIiwgcG9ydCwgdmFsKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogVmVyaWZ5IGxpbmsgaXMgdXAKKwkgKi8KKwl2YWwgPSBTRFJfUkVBRChTRFJOX1BFU0RSX0xPT1AocG9ydCkpOworCWlmICghKHZhbCAmIDB4MDAwMDEwMDApKSB7CisJCXByaW50ZigiUENJRSVkOiBsaW5rIGlzIG5vdCB1cC5cbiIsIHBvcnQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqIFNldHVwIFVUTCByZWdpc3RlcnMgLSBidXQgb25seSBvbiByZXZBIQorCSAqIFdlIHVzZSBkZWZhdWx0IHNldHRpbmdzIGZvciByZXZCIGNoaXAuCisJICovCisJaWYgKCFwcGM0NDBzcGVfcmV2QigpKQorCQlwcGM0eHhfc2V0dXBfdXRsKHBvcnQpOworCisJLyoKKwkgKiBXZSBtYXAgUENJIEV4cHJlc3MgY29uZmlndXJhdGlvbiBhY2Nlc3MgaW50byB0aGUgNTEyTUIgcmVnaW9ucworCSAqLworCWFkZHIgPSBwcGM0eHhfZ2V0X2NmZ2FkZHIocG9ydCk7CisJbG93ID0gVTY0X1RPX1UzMl9MT1coYWRkcik7CisJaGlnaCA9IFU2NF9UT19VMzJfSElHSChhZGRyKTsKKworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMDoKKwkJbXRkY3IoRENSTl9QRUdQTF9DRkdCQUgoUENJRTApLCBoaWdoKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9DRkdCQUwoUENJRTApLCBsb3cpOworCQltdGRjcihEQ1JOX1BFR1BMX0NGR01TSyhQQ0lFMCksIDB4ZTAwMDAwMDEpOyAvKiA1MTJNQiByZWdpb24sIHZhbGlkICovCisJCWJyZWFrOworCWNhc2UgMToKKwkJbXRkY3IoRENSTl9QRUdQTF9DRkdCQUgoUENJRTEpLCBoaWdoKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9DRkdCQUwoUENJRTEpLCBsb3cpOworCQltdGRjcihEQ1JOX1BFR1BMX0NGR01TSyhQQ0lFMSksIDB4ZTAwMDAwMDEpOyAvKiA1MTJNQiByZWdpb24sIHZhbGlkICovCisJCWJyZWFrOworI2lmIENPTkZJR19TWVNfUENJRV9OUl9QT1JUUyA+IDIKKwljYXNlIDI6CisJCW10ZGNyKERDUk5fUEVHUExfQ0ZHQkFIKFBDSUUyKSwgaGlnaCk7CisJCW10ZGNyKERDUk5fUEVHUExfQ0ZHQkFMKFBDSUUyKSwgbG93KTsKKwkJbXRkY3IoRENSTl9QRUdQTF9DRkdNU0soUENJRTIpLCAweGUwMDAwMDAxKTsgLyogNTEyTUIgcmVnaW9uLCB2YWxpZCAqLworCQlicmVhazsKKyNlbmRpZgorCX0KKworCS8qCisJICogQ2hlY2sgZm9yIFZDMCBhY3RpdmUgYW5kIGFzc2VydCBSRFkuCisJICovCisJYXR0ZW1wdHMgPSAxMDsKKwl3aGlsZSghKFNEUl9SRUFEKFNEUk5fUEVTRFJfUkNTU1RTKHBvcnQpKSAmICgxIDw8IDE2KSkpIHsKKwkJaWYgKCEoYXR0ZW1wdHMtLSkpIHsKKwkJCXByaW50ZigiUENJRSVkOiBWQzAgbm90IGFjdGl2ZVxuIiwgcG9ydCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWRlbGF5KDEwMDApOworCX0KKwlTRFJfV1JJVEUoU0RSTl9QRVNEUl9SQ1NTRVQocG9ydCksCisJCSAgU0RSX1JFQUQoU0RSTl9QRVNEUl9SQ1NTRVQocG9ydCkpIHwgMSA8PCAyMCk7CisJbWRlbGF5KDEwMCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBwYzR4eF9pbml0X3BjaWVfcm9vdHBvcnQoaW50IHBvcnQpCit7CisJcmV0dXJuIHBwYzR4eF9pbml0X3BjaWVfcG9ydChwb3J0LCAxKTsKK30KKworaW50IHBwYzR4eF9pbml0X3BjaWVfZW5kcG9ydChpbnQgcG9ydCkKK3sKKwlyZXR1cm4gcHBjNHh4X2luaXRfcGNpZV9wb3J0KHBvcnQsIDApOworfQorCit2b2lkIHBwYzR4eF9zZXR1cF9wY2llX3Jvb3Rwb2ludChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBwb3J0KQoreworCXZvbGF0aWxlIHZvaWQgKm1iYXNlID0gTlVMTDsKKwl2b2xhdGlsZSB2b2lkICpybWJhc2UgPSBOVUxMOworCisJcGNpX3NldF9vcHMoaG9zZSwKKwkJICAgIHBjaWVfcmVhZF9jb25maWdfYnl0ZSwKKwkJICAgIHBjaWVfcmVhZF9jb25maWdfd29yZCwKKwkJICAgIHBjaWVfcmVhZF9jb25maWdfZHdvcmQsCisJCSAgICBwY2llX3dyaXRlX2NvbmZpZ19ieXRlLAorCQkgICAgcGNpZV93cml0ZV9jb25maWdfd29yZCwKKwkJICAgIHBjaWVfd3JpdGVfY29uZmlnX2R3b3JkKTsKKworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMDoKKwkJbWJhc2UgPSAodTMyICopQ09ORklHX1NZU19QQ0lFMF9YQ0ZHQkFTRTsKKwkJcm1iYXNlID0gKHUzMiAqKUNPTkZJR19TWVNfUENJRTBfQ0ZHQkFTRTsKKwkJaG9zZS0+Y2ZnX2RhdGEgPSAodTggKilDT05GSUdfU1lTX1BDSUUwX0NGR0JBU0U7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbWJhc2UgPSAodTMyICopQ09ORklHX1NZU19QQ0lFMV9YQ0ZHQkFTRTsKKwkJcm1iYXNlID0gKHUzMiAqKUNPTkZJR19TWVNfUENJRTFfQ0ZHQkFTRTsKKwkJaG9zZS0+Y2ZnX2RhdGEgPSAodTggKilDT05GSUdfU1lTX1BDSUUxX0NGR0JBU0U7CisJCWJyZWFrOworI2lmIENPTkZJR19TWVNfUENJRV9OUl9QT1JUUyA+IDIKKwljYXNlIDI6CisJCW1iYXNlID0gKHUzMiAqKUNPTkZJR19TWVNfUENJRTJfWENGR0JBU0U7CisJCXJtYmFzZSA9ICh1MzIgKilDT05GSUdfU1lTX1BDSUUyX0NGR0JBU0U7CisJCWhvc2UtPmNmZ19kYXRhID0gKHU4ICopQ09ORklHX1NZU19QQ0lFMl9DRkdCQVNFOworCQlicmVhazsKKyNlbmRpZgorCX0KKworCS8qCisJICogU2V0IGJ1cyBudW1iZXJzIG9uIG91ciByb290IHBvcnQKKwkgKi8KKwlvdXRfOCgodTggKiltYmFzZSArIFBDSV9QUklNQVJZX0JVUywgMCk7CisJb3V0XzgoKHU4ICopbWJhc2UgKyBQQ0lfU0VDT05EQVJZX0JVUywgMSk7CisJb3V0XzgoKHU4ICopbWJhc2UgKyBQQ0lfU1VCT1JESU5BVEVfQlVTLCAxKTsKKworCS8qCisJICogU2V0IHVwIG91dGJvdW5kIHRyYW5zbGF0aW9uIHRvIGhvc2UtPm1lbV9zcGFjZSBmcm9tIFBMQgorCSAqIGFkZHJlc3NlcyBhdCBhbiBvZmZzZXQgb2YgMHhkXzAwMDBfMDAwMC4gIFdlIHNldCB0aGUgbG93CisJICogYml0cyBvZiB0aGUgbWFzayB0byAxMSB0byB0dXJuIG9mZiBzcGxpdHRpbmcgaW50byA4CisJICogc3VicmVnaW9ucyBhbmQgdG8gZW5hYmxlIHRoZSBvdXRib3VuZCB0cmFuc2xhdGlvbi4KKwkgKi8KKwlvdXRfbGUzMihtYmFzZSArIFBFQ0ZHX1BPTTBMQUgsIDB4MDAwMDAwMDApOworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfUE9NMExBTCwgQ09ORklHX1NZU19QQ0lFX01FTUJBU0UgKworCQkgcG9ydCAqIENPTkZJR19TWVNfUENJRV9NRU1TSVpFKTsKKwlkZWJ1ZygiUEVDRkdfUE9NMExBPSUwOHguJTA4eFxuIiwgaW5fbGUzMihtYmFzZSArIFBFQ0ZHX1BPTTBMQUgpLAorCSAgICAgIGluX2xlMzIobWJhc2UgKyBQRUNGR19QT00wTEFMKSk7CisKKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIDA6CisJCW10ZGNyKERDUk5fUEVHUExfT01SMUJBSChQQ0lFMCksIENPTkZJR19TWVNfUENJRV9BRERSX0hJR0gpOworCQltdGRjcihEQ1JOX1BFR1BMX09NUjFCQUwoUENJRTApLCBDT05GSUdfU1lTX1BDSUVfTUVNQkFTRSArCisJCSAgICAgIHBvcnQgKiBDT05GSUdfU1lTX1BDSUVfTUVNU0laRSk7CisJCW10ZGNyKERDUk5fUEVHUExfT01SMU1TS0goUENJRTApLCAweDdmZmZmZmZmKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9PTVIxTVNLTChQQ0lFMCksCisJCSAgICAgIH4oQ09ORklHX1NZU19QQ0lFX01FTVNJWkUgLSAxKSB8IDMpOworCQlkZWJ1ZygiMDpQRUdQTF9PTVIxQkE9JTA4eC4lMDh4IE1TSz0lMDh4LiUwOHhcbiIsCisJCSAgICAgIG1mZGNyKERDUk5fUEVHUExfT01SMUJBSChQQ0lFMCkpLAorCQkgICAgICBtZmRjcihEQ1JOX1BFR1BMX09NUjFCQUwoUENJRTApKSwKKwkJICAgICAgbWZkY3IoRENSTl9QRUdQTF9PTVIxTVNLSChQQ0lFMCkpLAorCQkgICAgICBtZmRjcihEQ1JOX1BFR1BMX09NUjFNU0tMKFBDSUUwKSkpOworCQlicmVhazsKKwljYXNlIDE6CisJCW10ZGNyKERDUk5fUEVHUExfT01SMUJBSChQQ0lFMSksIENPTkZJR19TWVNfUENJRV9BRERSX0hJR0gpOworCQltdGRjcihEQ1JOX1BFR1BMX09NUjFCQUwoUENJRTEpLCBDT05GSUdfU1lTX1BDSUVfTUVNQkFTRSArCisJCSAgICAgIHBvcnQgKiBDT05GSUdfU1lTX1BDSUVfTUVNU0laRSk7CisJCW10ZGNyKERDUk5fUEVHUExfT01SMU1TS0goUENJRTEpLCAweDdmZmZmZmZmKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9PTVIxTVNLTChQQ0lFMSksCisJCSAgICAgIH4oQ09ORklHX1NZU19QQ0lFX01FTVNJWkUgLSAxKSB8IDMpOworCQlkZWJ1ZygiMTpQRUdQTF9PTVIxQkE9JTA4eC4lMDh4IE1TSz0lMDh4LiUwOHhcbiIsCisJCSAgICAgIG1mZGNyKERDUk5fUEVHUExfT01SMUJBSChQQ0lFMSkpLAorCQkgICAgICBtZmRjcihEQ1JOX1BFR1BMX09NUjFCQUwoUENJRTEpKSwKKwkJICAgICAgbWZkY3IoRENSTl9QRUdQTF9PTVIxTVNLSChQQ0lFMSkpLAorCQkgICAgICBtZmRjcihEQ1JOX1BFR1BMX09NUjFNU0tMKFBDSUUxKSkpOworCQlicmVhazsKKyNpZiBDT05GSUdfU1lTX1BDSUVfTlJfUE9SVFMgPiAyCisJY2FzZSAyOgorCQltdGRjcihEQ1JOX1BFR1BMX09NUjFCQUgoUENJRTIpLCBDT05GSUdfU1lTX1BDSUVfQUREUl9ISUdIKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9PTVIxQkFMKFBDSUUyKSwgQ09ORklHX1NZU19QQ0lFX01FTUJBU0UgKworCQkgICAgICBwb3J0ICogQ09ORklHX1NZU19QQ0lFX01FTVNJWkUpOworCQltdGRjcihEQ1JOX1BFR1BMX09NUjFNU0tIKFBDSUUyKSwgMHg3ZmZmZmZmZik7CisJCW10ZGNyKERDUk5fUEVHUExfT01SMU1TS0woUENJRTIpLAorCQkgICAgICB+KENPTkZJR19TWVNfUENJRV9NRU1TSVpFIC0gMSkgfCAzKTsKKwkJZGVidWcoIjI6UEVHUExfT01SMUJBPSUwOHguJTA4eCBNU0s9JTA4eC4lMDh4XG4iLAorCQkgICAgICBtZmRjcihEQ1JOX1BFR1BMX09NUjFCQUgoUENJRTIpKSwKKwkJICAgICAgbWZkY3IoRENSTl9QRUdQTF9PTVIxQkFMKFBDSUUyKSksCisJCSAgICAgIG1mZGNyKERDUk5fUEVHUExfT01SMU1TS0goUENJRTIpKSwKKwkJICAgICAgbWZkY3IoRENSTl9QRUdQTF9PTVIxTVNLTChQQ0lFMikpKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisKKwkvKiBTZXQgdXAgNEdCIGluYm91bmQgbWVtb3J5IHdpbmRvdyBhdCAwICovCisJb3V0X2xlMzIobWJhc2UgKyBQQ0lfQkFTRV9BRERSRVNTXzAsIDApOworCW91dF9sZTMyKG1iYXNlICsgUENJX0JBU0VfQUREUkVTU18xLCAwKTsKKwlvdXRfbGUzMihtYmFzZSArIFBFQ0ZHX0JBUjBITVBBLCAweDdmZmZmZmYpOworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfQkFSMExNUEEsIDApOworCisJb3V0X2xlMzIobWJhc2UgKyBQRUNGR19QSU0wMVNBSCwgMHhmZmZmMDAwMCk7CisJb3V0X2xlMzIobWJhc2UgKyBQRUNGR19QSU0wMVNBTCwgMHgwMDAwMDAwMCk7CisJb3V0X2xlMzIobWJhc2UgKyBQRUNGR19QSU0wTEFMLCAwKTsKKwlvdXRfbGUzMihtYmFzZSArIFBFQ0ZHX1BJTTBMQUgsIDApOworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfUElNMUxBTCwgMHgwMDAwMDAwMCk7CisJb3V0X2xlMzIobWJhc2UgKyBQRUNGR19QSU0xTEFILCAweDAwMDAwMDA0KTsKKwlvdXRfbGUzMihtYmFzZSArIFBFQ0ZHX1BJTUVOLCAweDEpOworCisJLyogRW5hYmxlIEkvTywgTWVtLCBhbmQgQnVzbWFzdGVyIGN5Y2xlcyAqLworCW91dF9sZTE2KCh1MTYgKikobWJhc2UgKyBQQ0lfQ09NTUFORCksCisJCSBpbl9sZTE2KCh1MTYgKikobWJhc2UgKyBQQ0lfQ09NTUFORCkpIHwKKwkJIFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSKTsKKworCS8qIFNldCBEZXZpY2UgYW5kIFZlbmRvciBJZCAqLworCW91dF9sZTE2KG1iYXNlICsgMHgyMDAsIDB4YWFhMCArIHBvcnQpOworCW91dF9sZTE2KG1iYXNlICsgMHgyMDIsIDB4YmVkMCArIHBvcnQpOworCisJLyogU2V0IENsYXNzIENvZGUgdG8gUENJLVBDSSBicmlkZ2UgYW5kIFJldmlzaW9uIElkIHRvIDEgKi8KKwlvdXRfbGUzMihtYmFzZSArIDB4MjA4LCAweDA2MDQwMDAxKTsKKworCXByaW50ZigiUENJRSVkOiBzdWNjZXNzZnVsbHkgc2V0IGFzIHJvb3QtY29tcGxleFxuIiwgcG9ydCk7Cit9CisKK2ludCBwcGM0eHhfc2V0dXBfcGNpZV9lbmRwb2ludChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBwb3J0KQoreworCXZvbGF0aWxlIHZvaWQgKm1iYXNlID0gTlVMTDsKKwlpbnQgYXR0ZW1wdHMgPSAwOworCisJcGNpX3NldF9vcHMoaG9zZSwKKwkJICAgIHBjaWVfcmVhZF9jb25maWdfYnl0ZSwKKwkJICAgIHBjaWVfcmVhZF9jb25maWdfd29yZCwKKwkJICAgIHBjaWVfcmVhZF9jb25maWdfZHdvcmQsCisJCSAgICBwY2llX3dyaXRlX2NvbmZpZ19ieXRlLAorCQkgICAgcGNpZV93cml0ZV9jb25maWdfd29yZCwKKwkJICAgIHBjaWVfd3JpdGVfY29uZmlnX2R3b3JkKTsKKworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMDoKKwkJbWJhc2UgPSAodTMyICopQ09ORklHX1NZU19QQ0lFMF9YQ0ZHQkFTRTsKKwkJaG9zZS0+Y2ZnX2RhdGEgPSAodTggKilDT05GSUdfU1lTX1BDSUUwX0NGR0JBU0U7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbWJhc2UgPSAodTMyICopQ09ORklHX1NZU19QQ0lFMV9YQ0ZHQkFTRTsKKwkJaG9zZS0+Y2ZnX2RhdGEgPSAodTggKilDT05GSUdfU1lTX1BDSUUxX0NGR0JBU0U7CisJCWJyZWFrOworI2lmIGRlZmluZWQoQ09ORklHX1NZU19QQ0lFMl9DRkdCQVNFKQorCWNhc2UgMjoKKwkJbWJhc2UgPSAodTMyICopQ09ORklHX1NZU19QQ0lFMl9YQ0ZHQkFTRTsKKwkJaG9zZS0+Y2ZnX2RhdGEgPSAodTggKilDT05GSUdfU1lTX1BDSUUyX0NGR0JBU0U7CisJCWJyZWFrOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBTZXQgdXAgb3V0Ym91bmQgdHJhbnNsYXRpb24gdG8gaG9zZS0+bWVtX3NwYWNlIGZyb20gUExCCisJICogYWRkcmVzc2VzIGF0IGFuIG9mZnNldCBvZiAweGRfMDAwMF8wMDAwLiAgV2Ugc2V0IHRoZSBsb3cKKwkgKiBiaXRzIG9mIHRoZSBtYXNrIHRvIDExIHRvIHR1cm4gb2ZmIHNwbGl0dGluZyBpbnRvIDgKKwkgKiBzdWJyZWdpb25zIGFuZCB0byBlbmFibGUgdGhlIG91dGJvdW5kIHRyYW5zbGF0aW9uLgorCSAqLworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfUE9NMExBSCwgMHgwMDAwMWZmOCk7CisJb3V0X2xlMzIobWJhc2UgKyBQRUNGR19QT00wTEFMLCAweDAwMDAxMDAwKTsKKworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMDoKKwkJbXRkY3IoRENSTl9QRUdQTF9PTVIxQkFIKFBDSUUwKSwgQ09ORklHX1NZU19QQ0lFX0FERFJfSElHSCk7CisJCW10ZGNyKERDUk5fUEVHUExfT01SMUJBTChQQ0lFMCksIENPTkZJR19TWVNfUENJRV9NRU1CQVNFICsKKwkJICAgICAgcG9ydCAqIENPTkZJR19TWVNfUENJRV9NRU1TSVpFKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9PTVIxTVNLSChQQ0lFMCksIDB4N2ZmZmZmZmYpOworCQltdGRjcihEQ1JOX1BFR1BMX09NUjFNU0tMKFBDSUUwKSwKKwkJICAgICAgfihDT05GSUdfU1lTX1BDSUVfTUVNU0laRSAtIDEpIHwgMyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJbXRkY3IoRENSTl9QRUdQTF9PTVIxQkFIKFBDSUUxKSwgQ09ORklHX1NZU19QQ0lFX0FERFJfSElHSCk7CisJCW10ZGNyKERDUk5fUEVHUExfT01SMUJBTChQQ0lFMSksIENPTkZJR19TWVNfUENJRV9NRU1CQVNFICsKKwkJICAgICAgcG9ydCAqIENPTkZJR19TWVNfUENJRV9NRU1TSVpFKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9PTVIxTVNLSChQQ0lFMSksIDB4N2ZmZmZmZmYpOworCQltdGRjcihEQ1JOX1BFR1BMX09NUjFNU0tMKFBDSUUxKSwKKwkJICAgICAgfihDT05GSUdfU1lTX1BDSUVfTUVNU0laRSAtIDEpIHwgMyk7CisJCWJyZWFrOworI2lmIENPTkZJR19TWVNfUENJRV9OUl9QT1JUUyA+IDIKKwljYXNlIDI6CisJCW10ZGNyKERDUk5fUEVHUExfT01SMUJBSChQQ0lFMiksIENPTkZJR19TWVNfUENJRV9BRERSX0hJR0gpOworCQltdGRjcihEQ1JOX1BFR1BMX09NUjFCQUwoUENJRTIpLCBDT05GSUdfU1lTX1BDSUVfTUVNQkFTRSArCisJCSAgICAgIHBvcnQgKiBDT05GSUdfU1lTX1BDSUVfTUVNU0laRSk7CisJCW10ZGNyKERDUk5fUEVHUExfT01SMU1TS0goUENJRTIpLCAweDdmZmZmZmZmKTsKKwkJbXRkY3IoRENSTl9QRUdQTF9PTVIxTVNLTChQQ0lFMiksCisJCSAgICAgIH4oQ09ORklHX1NZU19QQ0lFX01FTVNJWkUgLSAxKSB8IDMpOworCQlicmVhazsKKyNlbmRpZgorCX0KKworCS8qIFNldCB1cCA2NE1CIGluYm91bmQgbWVtb3J5IHdpbmRvdyBhdCAwICovCisJb3V0X2xlMzIobWJhc2UgKyBQQ0lfQkFTRV9BRERSRVNTXzAsIDApOworCW91dF9sZTMyKG1iYXNlICsgUENJX0JBU0VfQUREUkVTU18xLCAwKTsKKworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfUElNMDFTQUgsIDB4ZmZmZmZmZmYpOworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfUElNMDFTQUwsIDB4ZmMwMDAwMDApOworCisJLyogU2V0dXAgQkFSMCAqLworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfQkFSMEhNUEEsIDB4N2ZmZmZmZmYpOworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfQkFSMExNUEEsIDB4ZmMwMDAwMDAgfCBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KTsKKworCS8qIERpc2FibGUgQkFSMSAmIEJBUjIgKi8KKwlvdXRfbGUzMihtYmFzZSArIFBFQ0ZHX0JBUjFNUEEsIDApOworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfQkFSMkhNUEEsIDApOworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfQkFSMkxNUEEsIDApOworCisJb3V0X2xlMzIobWJhc2UgKyBQRUNGR19QSU0wTEFMLCBVNjRfVE9fVTMyX0xPVyhDT05GSUdfU1lTX1BDSUVfSU5CT1VORF9CQVNFKSk7CisJb3V0X2xlMzIobWJhc2UgKyBQRUNGR19QSU0wTEFILCBVNjRfVE9fVTMyX0hJR0goQ09ORklHX1NZU19QQ0lFX0lOQk9VTkRfQkFTRSkpOworCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfUElNRU4sIDB4MSk7CisKKwkvKiBFbmFibGUgSS9PLCBNZW0sIGFuZCBCdXNtYXN0ZXIgY3ljbGVzICovCisJb3V0X2xlMTYoKHUxNiAqKShtYmFzZSArIFBDSV9DT01NQU5EKSwKKwkJIGluX2xlMTYoKHUxNiAqKShtYmFzZSArIFBDSV9DT01NQU5EKSkgfAorCQkgUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIpOworCW91dF9sZTE2KG1iYXNlICsgMHgyMDAsIDB4Y2FhZCk7CQkvKiBTZXR0aW5nIHZlbmRvciBJRCAqLworCW91dF9sZTE2KG1iYXNlICsgMHgyMDIsIDB4ZmVlZCk7CQkvKiBTZXR0aW5nIGRldmljZSBJRCAqLworCisJLyogU2V0IENsYXNzIENvZGUgdG8gUHJvY2Vzc29yL1BQQyAqLworCW91dF9sZTMyKG1iYXNlICsgMHgyMDgsIDB4MGIyMDAwMDEpOworCisJYXR0ZW1wdHMgPSAxMDsKKwl3aGlsZSghKFNEUl9SRUFEKFNEUk5fUEVTRFJfUkNTU1RTKHBvcnQpKSAmICgxIDw8IDgpKSkgeworCQlpZiAoIShhdHRlbXB0cy0tKSkgeworCQkJcHJpbnRmKCJQQ0lFJWQ6IEJNRSBub3QgYWN0aXZlXG4iLCBwb3J0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZGVsYXkoMTAwMCk7CisJfQorCisJcHJpbnRmKCJQQ0lFJWQ6IHN1Y2Nlc3NmdWxseSBzZXQgYXMgZW5kcG9pbnRcbiIsIHBvcnQpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHXzQ0MFNQRSAmJiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC80eHhfdWFydC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvNHh4X3VhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU2NTQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvNHh4X3VhcnQuYwpAQCAtMCwwICsxLDg3OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGR1YWwtbGljZW5zZWQuICBZb3UgbWF5IHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIG9yIHVuZGVyIHRoZSBsaWNlbnNlIGJlbG93LgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgdG8geW91IGJ5IElCTSBvbiBhbiBBUy1JUworICogYmFzaXMuICBBbnlvbmUgcmVjZWl2aW5nIHRoaXMgc291cmNlIGlzIGxpY2Vuc2VkIHVuZGVyIElCTQorICogY29weXJpZ2h0cyB0byB1c2UgaXQgaW4gYW55IHdheSBoZSBvciBzaGUgZGVlbXMgZml0LCBpbmNsdWRpbmcKKyAqIGNvcHlpbmcgaXQsIG1vZGlmeWluZyBpdCwgY29tcGlsaW5nIGl0LCBhbmQgcmVkaXN0cmlidXRpbmcgaXQgZWl0aGVyCisgKiB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucy4gIE5vIGxpY2Vuc2UgdW5kZXIgSUJNIHBhdGVudHMgb3IKKyAqIHBhdGVudCBhcHBsaWNhdGlvbnMgaXMgdG8gYmUgaW1wbGllZCBieSB0aGUgY29weXJpZ2h0IGxpY2Vuc2UuCisgKgorICogQW55IHVzZXIgb2YgdGhpcyBzb2Z0d2FyZSBzaG91bGQgdW5kZXJzdGFuZCB0aGF0IElCTSBjYW5ub3QgcHJvdmlkZQorICogdGVjaG5pY2FsIHN1cHBvcnQgZm9yIHRoaXMgc29mdHdhcmUgYW5kIHdpbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvcgorICogYW55IGNvbnNlcXVlbmNlcyByZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogQW55IHBlcnNvbiB3aG8gdHJhbnNmZXJzIHRoaXMgc291cmNlIGNvZGUgb3IgYW55IGRlcml2YXRpdmUgd29yaworICogbXVzdCBpbmNsdWRlIHRoZSBJQk0gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBwYXJhZ3JhcGgsIGFuZCB0aGUKKyAqIHByZWNlZGluZyB0d28gcGFyYWdyYXBocyBpbiB0aGUgdHJhbnNmZXJyZWQgc29mdHdhcmUuCisgKgorICogQ09QWVJJR0hUICAgSSBCIE0gICBDT1JQT1JBVElPTiAxOTk1CisgKiBMSUNFTlNFRCBNQVRFUklBTCAgLSAgUFJPR1JBTSBQUk9QRVJUWSBPRiBJIEIgTQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tcHJvYy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorCisjaWZkZWYgQ09ORklHX1NFUklBTF9NVUxUSQorI2luY2x1ZGUgPHNlcmlhbC5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBkZWZpbmVkKENPTkZJR180MDVDUikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQwNUVQKSB8fCBkZWZpbmVkKENPTkZJR180MDVFWikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQwNUVYKSB8fCBkZWZpbmVkKENPTkZJR180NDApCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisjaWYgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpCisjZGVmaW5lIFVBUlQwX0JBU0UJKENPTkZJR19TWVNfUEVSSVBIRVJBTF9CQVNFICsgMHgwMDAwMDMwMCkKKyNkZWZpbmUgVUFSVDFfQkFTRQkoQ09ORklHX1NZU19QRVJJUEhFUkFMX0JBU0UgKyAweDAwMDAwNDAwKQorI2Vsc2UKKyNkZWZpbmUgVUFSVDBfQkFTRQkoQ09ORklHX1NZU19QRVJJUEhFUkFMX0JBU0UgKyAweDAwMDAwMjAwKQorI2RlZmluZSBVQVJUMV9CQVNFCShDT05GSUdfU1lTX1BFUklQSEVSQUxfQkFTRSArIDB4MDAwMDAzMDApCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MFNQKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUEUpCisjZGVmaW5lIFVBUlQyX0JBU0UJKENPTkZJR19TWVNfUEVSSVBIRVJBTF9CQVNFICsgMHgwMDAwMDYwMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKQorI2RlZmluZSBVQVJUMl9CQVNFCShDT05GSUdfU1lTX1BFUklQSEVSQUxfQkFTRSArIDB4MDAwMDA1MDApCisjZGVmaW5lIFVBUlQzX0JBU0UJKENPTkZJR19TWVNfUEVSSVBIRVJBTF9CQVNFICsgMHgwMDAwMDYwMCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfNDQwR1ApCisjZGVmaW5lIENSMF9NQVNLICAgICAgICAweDNmZmYwMDAwCisjZGVmaW5lIENSMF9FWFRDTEtfRU5BICAweDAwNjAwMDAwCisjZGVmaW5lIENSMF9VRElWX1BPUyAgICAxNgorI2RlZmluZSBVRElWX1NVQlRSQUNUCTEKKyNkZWZpbmUgVUFSVDBfU0RSCUNQQzBfQ1IwCisjZGVmaW5lIE1GUkVHKGEsIGQpCWQgPSBtZmRjcihhKQorI2RlZmluZSBNVFJFRyhhLCBkKQltdGRjcihhLCBkKQorI2Vsc2UgLyogI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdQKSAqLworLyogYWxsIG90aGVyIDQ0MCBQUEMncyBhY2Nlc3MgY2xvY2sgZGl2aWRlciB2aWEgc2RyIHJlZ2lzdGVyICovCisjZGVmaW5lIENSMF9NQVNLICAgICAgICAweGRmZmZmZmZmCisjZGVmaW5lIENSMF9FWFRDTEtfRU5BICAweDAwODAwMDAwCisjZGVmaW5lIENSMF9VRElWX1BPUyAgICAwCisjZGVmaW5lIFVESVZfU1VCVFJBQ1QJMAorI2RlZmluZSBVQVJUMF9TRFIJU0RSMF9VQVJUMAorI2RlZmluZSBVQVJUMV9TRFIJU0RSMF9VQVJUMQorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDQwU1ApIHx8IGRlZmluZWQoQ09ORklHXzQ0MFNQRSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ2MEVYKSB8fCBkZWZpbmVkKENPTkZJR180NjBHVCkKKyNkZWZpbmUgVUFSVDJfU0RSCVNEUjBfVUFSVDIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKQorI2RlZmluZSBVQVJUM19TRFIJU0RSMF9VQVJUMworI2VuZGlmCisjZGVmaW5lIE1GUkVHKGEsIGQpCW1mc2RyKGEsIGQpCisjZGVmaW5lIE1UUkVHKGEsIGQpCW10c2RyKGEsIGQpCisjZW5kaWYgLyogI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdQKSAqLworI2VsaWYgZGVmaW5lZChDT05GSUdfNDA1RVApIHx8IGRlZmluZWQoQ09ORklHXzQwNUVaKQorI2RlZmluZSBVQVJUMF9CQVNFICAgICAgMHhlZjYwMDMwMAorI2RlZmluZSBVQVJUMV9CQVNFICAgICAgMHhlZjYwMDQwMAorI2RlZmluZSBVQ1IwX01BU0sgICAgICAgMHgwMDAwMDA3ZgorI2RlZmluZSBVQ1IxX01BU0sgICAgICAgMHgwMDAwN2YwMAorI2RlZmluZSBVQ1IwX1VESVZfUE9TICAgMAorI2RlZmluZSBVQ1IxX1VESVZfUE9TICAgOAorI2RlZmluZSBVRElWX01BWCAgICAgICAgMTI3CisjZWxpZiBkZWZpbmVkKENPTkZJR180MDVFWCkKKyNkZWZpbmUgVUFSVDBfQkFTRQkweGVmNjAwMjAwCisjZGVmaW5lIFVBUlQxX0JBU0UJMHhlZjYwMDMwMAorI2RlZmluZSBDUjBfTUFTSwkweDAwMDAwMGZmCisjZGVmaW5lIENSMF9FWFRDTEtfRU5BCTB4MDA4MDAwMDAKKyNkZWZpbmUgQ1IwX1VESVZfUE9TCTAKKyNkZWZpbmUgVURJVl9TVUJUUkFDVAkwCisjZGVmaW5lIFVBUlQwX1NEUglTRFIwX1VBUlQwCisjZGVmaW5lIFVBUlQxX1NEUglTRFIwX1VBUlQxCisjZWxzZSAvKiBDT05GSUdfNDA1R1AgfHwgQ09ORklHXzQwNUNSICovCisjZGVmaW5lIFVBUlQwX0JBU0UgICAgICAweGVmNjAwMzAwCisjZGVmaW5lIFVBUlQxX0JBU0UgICAgICAweGVmNjAwNDAwCisjZGVmaW5lIENSMF9NQVNLICAgICAgICAweDAwMDAxZmZmCisjZGVmaW5lIENSMF9FWFRDTEtfRU5BICAweDAwMDAwMGMwCisjZGVmaW5lIENSMF9VRElWX1BPUyAgICAxCisjZGVmaW5lIFVESVZfTUFYICAgICAgICAzMgorI2VuZGlmCisKKy8qIHVzaW5nIHNlcmlhbCBwb3J0IDAgb3IgMSBhcyBVLUJvb3QgY29uc29sZSA/ICovCisjaWYgZGVmaW5lZChDT05GSUdfVUFSVDFfQ09OU09MRSkKKyNkZWZpbmUgQUNUSU5HX1VBUlQwX0JBU0UJVUFSVDFfQkFTRQorI2RlZmluZSBBQ1RJTkdfVUFSVDFfQkFTRQlVQVJUMF9CQVNFCisjZWxzZQorI2RlZmluZSBBQ1RJTkdfVUFSVDBfQkFTRQlVQVJUMF9CQVNFCisjZGVmaW5lIEFDVElOR19VQVJUMV9CQVNFCVVBUlQxX0JBU0UKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfNDA1RVApICYmIGRlZmluZWQoQ09ORklHX1NZU19FWFRfU0VSSUFMX0NMT0NLKQorI2Vycm9yICJFeHRlcm5hbCBzZXJpYWwgY2xvY2sgbm90IHN1cHBvcnRlZCBvbiBBTUNDIFBQQzQwNUVQISIKKyNlbmRpZgorCisjZGVmaW5lIFVBUlRfUkJSICAgIDB4MDAKKyNkZWZpbmUgVUFSVF9USFIgICAgMHgwMAorI2RlZmluZSBVQVJUX0lFUiAgICAweDAxCisjZGVmaW5lIFVBUlRfSUlSICAgIDB4MDIKKyNkZWZpbmUgVUFSVF9GQ1IgICAgMHgwMgorI2RlZmluZSBVQVJUX0xDUiAgICAweDAzCisjZGVmaW5lIFVBUlRfTUNSICAgIDB4MDQKKyNkZWZpbmUgVUFSVF9MU1IgICAgMHgwNQorI2RlZmluZSBVQVJUX01TUiAgICAweDA2CisjZGVmaW5lIFVBUlRfU0NSICAgIDB4MDcKKyNkZWZpbmUgVUFSVF9ETEwgICAgMHgwMAorI2RlZmluZSBVQVJUX0RMTSAgICAweDAxCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgTGluZSBTdGF0dXMgUmVnaXN0ZXIuCisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIGFzeW5jTFNSRGF0YVJlYWR5MSAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgYXN5bmNMU1JPdmVycnVuRXJyb3IxICAgICAgICAgMHgwMgorI2RlZmluZSBhc3luY0xTUlBhcml0eUVycm9yMSAgICAgICAgICAweDA0CisjZGVmaW5lIGFzeW5jTFNSRnJhbWluZ0Vycm9yMSAgICAgICAgIDB4MDgKKyNkZWZpbmUgYXN5bmNMU1JCcmVha0ludGVycnVwdDEgICAgICAgMHgxMAorI2RlZmluZSBhc3luY0xTUlR4SG9sZEVtcHR5MSAgICAgICAgICAweDIwCisjZGVmaW5lIGFzeW5jTFNSVHhTaGlmdEVtcHR5MSAgICAgICAgIDB4NDAKKyNkZWZpbmUgYXN5bmNMU1JSeEZpZm9FcnJvcjEgICAgICAgICAgMHg4MAorCisjaWZkZWYgQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8IEZpZm8KKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyICpyeF9idWZmZXI7CisJdWxvbmcgcnhfcHV0OworCXVsb25nIHJ4X2dldDsKK30gc2VyaWFsX2J1ZmZlcl90OworCit2b2xhdGlsZSBzdGF0aWMgc2VyaWFsX2J1ZmZlcl90IGJ1Zl9pbmZvOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNlcmlhbF9pbml0X2NvbW1vbih1MzIgYmFzZSwgdTMyIHVkaXYsIHUxNiBiZGl2KQoreworCVBQQzR4eF9TWVNfSU5GTyBzeXNfaW5mbzsKKwl1OCB2YWw7CisKKwlnZXRfc3lzX2luZm8oJnN5c19pbmZvKTsKKworCS8qIENvcnJlY3QgVUFSVCBmcmVxdWVuY3kgaW4gYmQtaW5mbyBzdHJ1Y3Qgbm93IHRoYXQKKwkgKiB0aGUgVUFSVCBkaXZpc29yIGlzIGF2YWlsYWJsZQorCSAqLworI2lmZGVmIENPTkZJR19TWVNfRVhUX1NFUklBTF9DTE9DSworCWdkLT51YXJ0X2NsayA9IENPTkZJR19TWVNfRVhUX1NFUklBTF9DTE9DSzsKKyNlbHNlCisJZ2QtPnVhcnRfY2xrID0gc3lzX2luZm8uZnJlcVVBUlQgLyB1ZGl2OworI2VuZGlmCisKKwlvdXRfOCgodTggKiliYXNlICsgVUFSVF9MQ1IsIDB4ODApOwkvKiBzZXQgRExBQiBiaXQgKi8KKwlvdXRfOCgodTggKiliYXNlICsgVUFSVF9ETEwsIGJkaXYpOwkvKiBzZXQgYmF1ZHJhdGUgZGl2aXNvciAqLworCW91dF84KCh1OCAqKWJhc2UgKyBVQVJUX0RMTSwgYmRpdiA+PiA4KTsgLyogc2V0IGJhdWRyYXRlIGRpdmlzb3IgKi8KKwlvdXRfOCgodTggKiliYXNlICsgVUFSVF9MQ1IsIDB4MDMpOwkvKiBjbGVhciBETEFCOyBzZXQgOCBiaXRzLCBubyBwYXJpdHkgKi8KKwlvdXRfOCgodTggKiliYXNlICsgVUFSVF9GQ1IsIDB4MDApOwkvKiBkaXNhYmxlIEZJRk8gKi8KKwlvdXRfOCgodTggKiliYXNlICsgVUFSVF9NQ1IsIDB4MDApOwkvKiBubyBtb2RlbSBjb250cm9sIERUUiBSVFMgKi8KKwl2YWwgPSBpbl84KCh1OCAqKWJhc2UgKyBVQVJUX0xTUik7CS8qIGNsZWFyIGxpbmUgc3RhdHVzICovCisJdmFsID0gaW5fOCgodTggKiliYXNlICsgVUFSVF9SQlIpOwkvKiByZWFkIHJlY2VpdmUgYnVmZmVyICovCisJb3V0XzgoKHU4ICopYmFzZSArIFVBUlRfU0NSLCAweDAwKTsJLyogc2V0IHNjcmF0Y2hwYWQgKi8KKwlvdXRfOCgodTggKiliYXNlICsgVUFSVF9JRVIsIDB4MDApOwkvKiBzZXQgaW50ZXJydXB0IGVuYWJsZSByZWcgKi8KK30KKworI2lmIChkZWZpbmVkKENPTkZJR180NDApIHx8IGRlZmluZWQoQ09ORklHXzQwNUVYKSkgJiYJXAorICAgICFkZWZpbmVkKENPTkZJR19TWVNfRVhUX1NFUklBTF9DTE9DSykKK3N0YXRpYyB2b2lkIHNlcmlhbF9kaXZzIChpbnQgYmF1ZHJhdGUsIHVuc2lnbmVkIGxvbmcgKnB1ZGl2LAorCQkJIHVuc2lnbmVkIHNob3J0ICpwYmRpdikKK3sKKwlzeXNfaW5mb190IHN5c2luZm87CisJdW5zaWduZWQgbG9uZyBkaXY7CQkvKiB0b3RhbCBkaXZpc29yIHVkaXYgKiBiZGl2ICovCisJdW5zaWduZWQgbG9uZyB1bWluOwkJLyogbWluaW11bSB1ZGl2CSovCisJdW5zaWduZWQgc2hvcnQgZGlmZjsJCS8qIHNtYWxsZXN0IGRpZmYgKi8KKwl1bnNpZ25lZCBsb25nIHVkaXY7CQkvKiBiZXN0IHVkaXYgKi8KKwl1bnNpZ25lZCBzaG9ydCBpZGlmZjsJCS8qIGN1cnJlbnQgZGlmZiAqLworCXVuc2lnbmVkIHNob3J0IGliZGl2OwkJLyogY3VycmVudCBiZGl2ICovCisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgZXN0OwkJLyogY3VycmVudCBlc3RpbWF0ZSAqLworCisJZ2V0X3N5c19pbmZvKCZzeXNpbmZvKTsKKworCXVkaXYgPSAzMjsJCQkvKiBBc3N1bWUgbG93ZXN0IHBvc3NpYmxlIHNlcmlhbCBjbGsgKi8KKwlkaXYgPSBzeXNpbmZvLmZyZXFQTEIgLyAoMTYgKiBiYXVkcmF0ZSk7IC8qIHRvdGFsIGRpdmlzb3IgKi8KKwl1bWluID0gc3lzaW5mby5wbGxPcGJEaXYgPDwgMTsJLyogMiB4IE9QQiBkaXZpc29yICovCisJZGlmZiA9IDMyOwkJCS8qIGhpZ2hlc3QgcG9zc2libGUgKi8KKworCS8qIGkgaXMgdGhlIHRlc3QgdWRpdiB2YWx1ZSAtLSBzdGFydCB3aXRoIHRoZSBsYXJnZXN0CisJICogcG9zc2libGUgKDMyKSB0byBtaW5pbWl6ZSBzZXJpYWwgY2xvY2sgYW5kIGNvbnN0cmFpbgorCSAqIHNlYXJjaCB0byB1bWluLgorCSAqLworCWZvciAoaSA9IDMyOyBpID4gdW1pbjsgaS0tKSB7CisJCWliZGl2ID0gZGl2IC8gaTsKKwkJZXN0ID0gaSAqIGliZGl2OworCQlpZGlmZiA9IChlc3QgPiBkaXYpID8gKGVzdC1kaXYpIDogKGRpdi1lc3QpOworCQlpZiAoaWRpZmYgPT0gMCkgeworCQkJdWRpdiA9IGk7CisJCQlicmVhazsgICAgICAvKiBjYW4ndCBkbyBiZXR0ZXIgKi8KKwkJfSBlbHNlIGlmIChpZGlmZiA8IGRpZmYpIHsKKwkJCXVkaXYgPSBpOyAgICAgICAvKiBiZXN0IHNvIGZhciAqLworCQkJZGlmZiA9IGlkaWZmOyAgIC8qIHVwZGF0ZSBsb3dlc3QgZGlmZiovCisJCX0KKwl9CisKKwkqcHVkaXYgPSB1ZGl2OworCSpwYmRpdiA9IGRpdiAvIHVkaXY7Cit9CisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzQwNUVaKQorCitzdGF0aWMgdm9pZCBzZXJpYWxfZGl2cyAoaW50IGJhdWRyYXRlLCB1bnNpZ25lZCBsb25nICpwdWRpdiwKKwkJCSB1bnNpZ25lZCBzaG9ydCAqcGJkaXYpCit7CisJc3lzX2luZm9fdCBzeXNpbmZvOworCXVuc2lnbmVkIGxvbmcgZGl2OwkJLyogdG90YWwgZGl2aXNvciB1ZGl2ICogYmRpdiAqLworCXVuc2lnbmVkIGxvbmcgdW1pbjsJCS8qIG1pbmltdW0gdWRpdgkqLworCXVuc2lnbmVkIHNob3J0IGRpZmY7CQkvKiBzbWFsbGVzdCBkaWZmICovCisJdW5zaWduZWQgbG9uZyB1ZGl2OwkJLyogYmVzdCB1ZGl2ICovCisJdW5zaWduZWQgc2hvcnQgaWRpZmY7CQkvKiBjdXJyZW50IGRpZmYgKi8KKwl1bnNpZ25lZCBzaG9ydCBpYmRpdjsJCS8qIGN1cnJlbnQgYmRpdiAqLworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIGVzdDsJCS8qIGN1cnJlbnQgZXN0aW1hdGUgKi8KKwl1bnNpZ25lZCBsb25nIHBsbG91dGI7CisJdW5zaWduZWQgbG9uZyBjcHJfcGxsYzsKKwl1MzIgcmVnOworCisJLyogY2hlY2sgdGhlIHBsbCBmZWVkYmFjayBzb3VyY2UgKi8KKwltZmNwcihDUFIwX1BMTEMsIGNwcl9wbGxjKTsKKworCWdldF9zeXNfaW5mbygmc3lzaW5mbyk7CisKKwlwbGxvdXRiID0gKChDT05GSUdfU1lTX0NMS19GUkVRICogKChjcHJfcGxsYyAmIFBMTENfU1JDX01BU0spID8KKwkJCQkJICAgc3lzaW5mby5wbGxGd2REaXZCIDogc3lzaW5mby5wbGxGd2REaXYpICoKKwkJICAgIHN5c2luZm8ucGxsRmJrRGl2KSAvIHN5c2luZm8ucGxsRndkRGl2Qik7CisJdWRpdiA9IDI1NjsJCQkvKiBBc3N1bWUgbG93ZXN0IHBvc3NpYmxlIHNlcmlhbCBjbGsgKi8KKwlkaXYgPSBwbGxvdXRiIC8gKDE2ICogYmF1ZHJhdGUpOyAvKiB0b3RhbCBkaXZpc29yICovCisJdW1pbiA9IChwbGxvdXRiIC8gZ2V0X09QQl9mcmVxKCkpIDw8IDE7CS8qIDIgeCBPUEIgZGl2aXNvciAqLworCWRpZmYgPSAyNTY7CQkJLyogaGlnaGVzdCBwb3NzaWJsZSAqLworCisJLyogaSBpcyB0aGUgdGVzdCB1ZGl2IHZhbHVlIC0tIHN0YXJ0IHdpdGggdGhlIGxhcmdlc3QKKwkgKiBwb3NzaWJsZSAoMjU2KSB0byBtaW5pbWl6ZSBzZXJpYWwgY2xvY2sgYW5kIGNvbnN0cmFpbgorCSAqIHNlYXJjaCB0byB1bWluLgorCSAqLworCWZvciAoaSA9IDI1NjsgaSA+IHVtaW47IGktLSkgeworCQlpYmRpdiA9IGRpdiAvIGk7CisJCWVzdCA9IGkgKiBpYmRpdjsKKwkJaWRpZmYgPSAoZXN0ID4gZGl2KSA/IChlc3QtZGl2KSA6IChkaXYtZXN0KTsKKwkJaWYgKGlkaWZmID09IDApIHsKKwkJCXVkaXYgPSBpOworCQkJYnJlYWs7ICAgICAgLyogY2FuJ3QgZG8gYmV0dGVyICovCisJCX0gZWxzZSBpZiAoaWRpZmYgPCBkaWZmKSB7CisJCQl1ZGl2ID0gaTsgICAgICAgLyogYmVzdCBzbyBmYXIgKi8KKwkJCWRpZmYgPSBpZGlmZjsgICAvKiB1cGRhdGUgbG93ZXN0IGRpZmYqLworCQl9CisJfQorCisJKnB1ZGl2ID0gdWRpdjsKKwltZmNwcihDUEMwX1BFUkQwLCByZWcpOworCXJlZyAmPSB+MHgwMDAwZmZmZjsKKwlyZWcgfD0gKCh1ZGl2IC0gMCkgPDwgOCkgfCAodWRpdiAtIDApOworCW10Y3ByKENQQzBfUEVSRDAsIHJlZyk7CisJKnBiZGl2ID0gZGl2IC8gdWRpdjsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR180NDApICYmICFkZWZpbmVkKENPTkZJR19TWVNfRVhUX1NFUklBTF9DTEspICovCisKKy8qCisgKiBNaW5pbWFsIHNlcmlhbCBmdW5jdGlvbnMgbmVlZGVkIHRvIHVzZSBvbmUgb2YgdGhlIFNNQyBwb3J0cworICogYXMgc2VyaWFsIGNvbnNvbGUgaW50ZXJmYWNlLgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCitpbnQgc2VyaWFsX2luaXRfZGV2KHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZzsKKwl1bnNpZ25lZCBsb25nIHVkaXY7CisJdW5zaWduZWQgc2hvcnQgYmRpdjsKKyNpZmRlZiBDT05GSUdfU1lTX0VYVF9TRVJJQUxfQ0xPQ0sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKyNlbmRpZgorCisJTUZSRUcoVUFSVDBfU0RSLCByZWcpOworCXJlZyAmPSB+Q1IwX01BU0s7CisKKyNpZmRlZiBDT05GSUdfU1lTX0VYVF9TRVJJQUxfQ0xPQ0sKKwlyZWcgfD0gQ1IwX0VYVENMS19FTkE7CisJdWRpdiA9IDE7CisJdG1wICA9IGdkLT5iYXVkcmF0ZSAqIDE2OworCWJkaXYgPSAoQ09ORklHX1NZU19FWFRfU0VSSUFMX0NMT0NLICsgdG1wIC8gMikgLyB0bXA7CisjZWxzZQorCS8qIEZvciA0NDAsIHRoZSBjcHUgY2xvY2sgaXMgb24gZGl2aWRlciBjaGFpbiBBLCBVQVJUIG9uIGRpdmlkZXIKKwkgKiBjaGFpbiBCIC4uLiBzbyBjcHUgY2xvY2sgaXMgaXJyZWxldmFudC4gR2V0IHRoZSAib3B0aW1pemVkIgorCSAqIHZhbHVlcyB0aGF0IGFyZSBzdWJqZWN0IHRvIHRoZSAxLzIgb3BiIGNsb2NrIGNvbnN0cmFpbnQKKwkgKi8KKwlzZXJpYWxfZGl2cyAoZ2QtPmJhdWRyYXRlLCAmdWRpdiwgJmJkaXYpOworI2VuZGlmCisKKwlyZWcgfD0gKHVkaXYgLSBVRElWX1NVQlRSQUNUKSA8PCBDUjBfVURJVl9QT1M7CS8qIHNldCB0aGUgVUFSVCBkaXZpc29yICovCisKKwkvKgorCSAqIENvbmZpZ3VyZSBpbnB1dCBjbG9jayB0byBiYXVkcmF0ZSBnZW5lcmF0b3IgZm9yIGFsbAorCSAqIGF2YWlsYWJsZSBzZXJpYWwgcG9ydHMgaGVyZQorCSAqLworCU1UUkVHKFVBUlQwX1NEUiwgcmVnKTsKKyNpZiBkZWZpbmVkKFVBUlQxX1NEUikKKwlNVFJFRyhVQVJUMV9TRFIsIHJlZyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFVBUlQyX1NEUikKKwlNVFJFRyhVQVJUMl9TRFIsIHJlZyk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFVBUlQzX1NEUikKKwlNVFJFRyhVQVJUM19TRFIsIHJlZyk7CisjZW5kaWYKKworCXNlcmlhbF9pbml0X2NvbW1vbihiYXNlLCB1ZGl2LCBiZGl2KTsKKworCXJldHVybiAoMCk7Cit9CisKKyNlbHNlIC8qICFkZWZpbmVkKENPTkZJR180NDApICovCisKK2ludCBzZXJpYWxfaW5pdF9kZXYgKHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZzsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIGNsazsKKwl1bnNpZ25lZCBsb25nIHVkaXY7CisJdW5zaWduZWQgc2hvcnQgYmRpdjsKKworI2lmZGVmIENPTkZJR180MDVFWAorCWNsayA9IHRtcCA9IDA7CisJbWZzZHIoVUFSVDBfU0RSLCByZWcpOworCXJlZyAmPSB+Q1IwX01BU0s7CisjaWZkZWYgQ09ORklHX1NZU19FWFRfU0VSSUFMX0NMT0NLCisJcmVnIHw9IENSMF9FWFRDTEtfRU5BOworCXVkaXYgPSAxOworCXRtcCAgPSBnZC0+YmF1ZHJhdGUgKiAxNjsKKwliZGl2ID0gKENPTkZJR19TWVNfRVhUX1NFUklBTF9DTE9DSyArIHRtcCAvIDIpIC8gdG1wOworI2Vsc2UKKwlzZXJpYWxfZGl2cyhnZC0+YmF1ZHJhdGUsICZ1ZGl2LCAmYmRpdik7CisjZW5kaWYKKwlyZWcgfD0gKHVkaXYgLSBVRElWX1NVQlRSQUNUKSA8PCBDUjBfVURJVl9QT1M7ICAvKiBzZXQgdGhlIFVBUlQgZGl2aXNvciAqLworCisJLyoKKwkgKiBDb25maWd1cmUgaW5wdXQgY2xvY2sgdG8gYmF1ZHJhdGUgZ2VuZXJhdG9yIGZvciBhbGwKKwkgKiBhdmFpbGFibGUgc2VyaWFsIHBvcnRzIGhlcmUKKwkgKi8KKwltdHNkcihVQVJUMF9TRFIsIHJlZyk7CisKKyNpZiBkZWZpbmVkKFVBUlQxX1NEUikKKwltdHNkcihVQVJUMV9TRFIsIHJlZyk7CisjZW5kaWYKKworI2VsaWYgZGVmaW5lZChDT05GSUdfNDA1RVopCisJc2VyaWFsX2RpdnMoZ2QtPmJhdWRyYXRlLCAmdWRpdiwgJmJkaXYpOworCWNsayA9IHRtcCA9IHJlZyA9IDA7CisjZWxzZQorI2lmZGVmIENPTkZJR180MDVFUAorCXJlZyA9IG1mZGNyKENQQzBfVUNSKSAmIH4oVUNSMF9NQVNLIHwgVUNSMV9NQVNLKTsKKwljbGsgPSBnZC0+Y3B1X2NsazsKKwl0bXAgPSBDT05GSUdfU1lTX0JBU0VfQkFVRCAqIDE2OworCXVkaXYgPSAoY2xrICsgdG1wIC8gMikgLyB0bXA7CisJaWYgKHVkaXYgPiBVRElWX01BWCkgICAgICAgICAgICAgICAgICAgIC8qIG1heC4gbiBiaXRzIGZvciB1ZGl2ICovCisJCXVkaXYgPSBVRElWX01BWDsKKwlyZWcgfD0gKHVkaXYpIDw8IFVDUjBfVURJVl9QT1M7CSAgICAgICAgLyogc2V0IHRoZSBVQVJUIGRpdmlzb3IgKi8KKwlyZWcgfD0gKHVkaXYpIDw8IFVDUjFfVURJVl9QT1M7CSAgICAgICAgLyogc2V0IHRoZSBVQVJUIGRpdmlzb3IgKi8KKwltdGRjciAoQ1BDMF9VQ1IsIHJlZyk7CisjZWxzZSAvKiBDT05GSUdfNDA1RVAgKi8KKwlyZWcgPSBtZmRjcihDUEMwX0NSMCkgJiB+Q1IwX01BU0s7CisjaWZkZWYgQ09ORklHX1NZU19FWFRfU0VSSUFMX0NMT0NLCisJY2xrID0gQ09ORklHX1NZU19FWFRfU0VSSUFMX0NMT0NLOworCXVkaXYgPSAxOworCXJlZyB8PSBDUjBfRVhUQ0xLX0VOQTsKKyNlbHNlCisJY2xrID0gZ2QtPmNwdV9jbGs7CisjaWZkZWYgQ09ORklHX1NZU180MDVfVUFSVF9FUlJBVEFfNTkKKwl1ZGl2ID0gMzE7CQkJLyogRXJyYXRhIDU5OiBzdHVjayBhdCAzMSAqLworI2Vsc2UKKwl0bXAgPSBDT05GSUdfU1lTX0JBU0VfQkFVRCAqIDE2OworCXVkaXYgPSAoY2xrICsgdG1wIC8gMikgLyB0bXA7CisJaWYgKHVkaXYgPiBVRElWX01BWCkgICAgICAgICAgICAgICAgICAgIC8qIG1heC4gbiBiaXRzIGZvciB1ZGl2ICovCisJCXVkaXYgPSBVRElWX01BWDsKKyNlbmRpZgorI2VuZGlmCisJcmVnIHw9ICh1ZGl2IC0gMSkgPDwgQ1IwX1VESVZfUE9TOwkvKiBzZXQgdGhlIFVBUlQgZGl2aXNvciAqLworCW10ZGNyIChDUEMwX0NSMCwgcmVnKTsKKyNlbmRpZiAvKiBDT05GSUdfNDA1RVAgKi8KKwl0bXAgPSBnZC0+YmF1ZHJhdGUgKiB1ZGl2ICogMTY7CisJYmRpdiA9IChjbGsgKyB0bXAgLyAyKSAvIHRtcDsKKyNlbmRpZiAvKiBDT05GSUdfNDA1RVggKi8KKworCXNlcmlhbF9pbml0X2NvbW1vbihiYXNlLCB1ZGl2LCBiZGl2KTsKKworCXJldHVybiAoMCk7Cit9CisKKyNlbmRpZiAvKiBpZiBkZWZpbmVkKENPTkZJR180NDApICovCisKK3ZvaWQgc2VyaWFsX3NldGJyZ19kZXYodW5zaWduZWQgbG9uZyBiYXNlKQoreworCXNlcmlhbF9pbml0X2RldihiYXNlKTsKK30KKwordm9pZCBzZXJpYWxfcHV0Y19kZXYodW5zaWduZWQgbG9uZyBiYXNlLCBjb25zdCBjaGFyIGMpCit7CisJaW50IGk7CisKKwlpZiAoYyA9PSAnXG4nKQorCQlzZXJpYWxfcHV0Y19kZXYoYmFzZSwgJ1xyJyk7CisKKwkvKiBjaGVjayBUSFJFIGJpdCwgd2FpdCBmb3IgdHJhbnNtaXRlciBhdmFpbGFibGUgKi8KKwlmb3IgKGkgPSAxOyBpIDwgMzUwMDsgaSsrKSB7CisJCWlmICgoaW5fOCgodTggKiliYXNlICsgVUFSVF9MU1IpICYgMHgyMCkgPT0gMHgyMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkgKDEwMCk7CisJfQorCisJb3V0XzgoKHU4ICopYmFzZSArIFVBUlRfVEhSLCBjKTsJLyogcHV0IGNoYXJhY3RlciBvdXQgKi8KK30KKwordm9pZCBzZXJpYWxfcHV0c19kZXYgKHVuc2lnbmVkIGxvbmcgYmFzZSwgY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpCisJCXNlcmlhbF9wdXRjX2RldiAoYmFzZSwgKnMrKyk7Cit9CisKK2ludCBzZXJpYWxfZ2V0Y19kZXYgKHVuc2lnbmVkIGxvbmcgYmFzZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisKKwl3aGlsZSAoMSkgeworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKQorCQlXQVRDSERPR19SRVNFVCAoKTsJLyogUmVzZXQgSFcgV2F0Y2hkb2csIGlmIG5lZWRlZCAqLworI2VuZGlmCS8qIENPTkZJR19IV19XQVRDSERPRyAqLworCisJCXN0YXR1cyA9IGluXzgoKHU4ICopYmFzZSArIFVBUlRfTFNSKTsKKwkJaWYgKChzdGF0dXMgJiBhc3luY0xTUkRhdGFSZWFkeTEpICE9IDB4MCkKKwkJCWJyZWFrOworCisJCWlmICgoc3RhdHVzICYgKCBhc3luY0xTUkZyYW1pbmdFcnJvcjEgfAorCQkJCWFzeW5jTFNST3ZlcnJ1bkVycm9yMSB8CisJCQkJYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKKwkJCQlhc3luY0xTUkJyZWFrSW50ZXJydXB0MSApKSAhPSAwKSB7CisJCQlvdXRfOCgodTggKiliYXNlICsgVUFSVF9MU1IsCisJCQkgICAgICBhc3luY0xTUkZyYW1pbmdFcnJvcjEgfAorCQkJICAgICAgYXN5bmNMU1JPdmVycnVuRXJyb3IxIHwKKwkJCSAgICAgIGFzeW5jTFNSUGFyaXR5RXJyb3IxICB8CisJCQkgICAgICBhc3luY0xTUkJyZWFrSW50ZXJydXB0MSk7CisJCX0KKwl9CisKKwlyZXR1cm4gKDB4MDAwMDAwZmYgJiAoaW50KSBpbl84KCh1OCAqKWJhc2UpKTsKK30KKworaW50IHNlcmlhbF90c3RjX2RldiAodW5zaWduZWQgbG9uZyBiYXNlKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJc3RhdHVzID0gaW5fOCgodTggKiliYXNlICsgVUFSVF9MU1IpOworCWlmICgoc3RhdHVzICYgYXN5bmNMU1JEYXRhUmVhZHkxKSAhPSAweDApCisJCXJldHVybiAoMSk7CisKKwlpZiAoKHN0YXR1cyAmICggYXN5bmNMU1JGcmFtaW5nRXJyb3IxIHwKKwkJCWFzeW5jTFNST3ZlcnJ1bkVycm9yMSB8CisJCQlhc3luY0xTUlBhcml0eUVycm9yMSAgfAorCQkJYXN5bmNMU1JCcmVha0ludGVycnVwdDEgKSkgIT0gMCkgeworCQlvdXRfOCgodTggKiliYXNlICsgVUFSVF9MU1IsCisJCSAgICAgIGFzeW5jTFNSRnJhbWluZ0Vycm9yMSB8CisJCSAgICAgIGFzeW5jTFNST3ZlcnJ1bkVycm9yMSB8CisJCSAgICAgIGFzeW5jTFNSUGFyaXR5RXJyb3IxICB8CisJCSAgICAgIGFzeW5jTFNSQnJlYWtJbnRlcnJ1cHQxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTworCit2b2lkIHNlcmlhbF9pc3IgKHZvaWQgKmFyZykKK3sKKwlpbnQgc3BhY2U7CisJaW50IGM7CisJY29uc3QgaW50IHJ4X2dldCA9IGJ1Zl9pbmZvLnJ4X2dldDsKKwlpbnQgcnhfcHV0ID0gYnVmX2luZm8ucnhfcHV0OworCisJaWYgKHJ4X2dldCA8PSByeF9wdXQpCisJCXNwYWNlID0gQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPIC0gKHJ4X3B1dCAtIHJ4X2dldCk7CisJZWxzZQorCQlzcGFjZSA9IHJ4X2dldCAtIHJ4X3B1dDsKKworCXdoaWxlIChzZXJpYWxfdHN0Y19kZXYgKEFDVElOR19VQVJUMF9CQVNFKSkgeworCQljID0gc2VyaWFsX2dldGNfZGV2IChBQ1RJTkdfVUFSVDBfQkFTRSk7CisJCWlmIChzcGFjZSkgeworCQkJYnVmX2luZm8ucnhfYnVmZmVyW3J4X3B1dCsrXSA9IGM7CisJCQlzcGFjZS0tOworCQl9CisJCWlmIChyeF9wdXQgPT0gQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPKQorCQkJcnhfcHV0ID0gMDsKKwkJaWYgKHNwYWNlIDwgQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPIC8gNCkgeworCQkJLyogU3RvcCBmbG93IGJ5IHNldHRpbmcgUlRTIGluYWN0aXZlICovCisJCQlvdXRfOCgodTggKilBQ1RJTkdfVUFSVDBfQkFTRSArIFVBUlRfTUNSLAorCQkJICAgICAgaW5fOCgodTggKilBQ1RJTkdfVUFSVDBfQkFTRSArIFVBUlRfTUNSKSAmCisJCQkgICAgICAoMHhGRiBeIDB4MDIpKTsKKwkJfQorCX0KKwlidWZfaW5mby5yeF9wdXQgPSByeF9wdXQ7Cit9CisKK3ZvaWQgc2VyaWFsX2J1ZmZlcmVkX2luaXQgKHZvaWQpCit7CisJc2VyaWFsX3B1dHMgKCJTd2l0Y2hpbmcgdG8gaW50ZXJydXB0IGRyaXZlbiBzZXJpYWwgaW5wdXQgbW9kZS5cbiIpOworCWJ1Zl9pbmZvLnJ4X2J1ZmZlciA9IG1hbGxvYyAoQ09ORklHX1NFUklBTF9TT0ZUV0FSRV9GSUZPKTsKKwlidWZfaW5mby5yeF9wdXQgPSAwOworCWJ1Zl9pbmZvLnJ4X2dldCA9IDA7CisKKwlpZiAoaW5fOCgodTggKilBQ1RJTkdfVUFSVDBfQkFTRSArIFVBUlRfTVNSKSAmIDB4MTApCisJCXNlcmlhbF9wdXRzICgiQ2hlY2sgQ1RTIHNpZ25hbCBwcmVzZW50IG9uIHNlcmlhbCBwb3J0OiBPSy5cbiIpOworCWVsc2UKKwkJc2VyaWFsX3B1dHMgKCJXQVJOSU5HOiBDVFMgc2lnbmFsIG5vdCBwcmVzZW50IG9uIHNlcmlhbCBwb3J0LlxuIik7CisKKwlpcnFfaW5zdGFsbF9oYW5kbGVyICggVkVDTlVNX1UwIC8qVUFSVDAgKi8gLyppbnQgdmVjICovICwKKwkJCSAgICAgIHNlcmlhbF9pc3IgLyppbnRlcnJ1cHRfaGFuZGxlcl90ICpoYW5kbGVyICovICwKKwkJCSAgICAgICh2b2lkICopICZidWZfaW5mbyAvKnZvaWQgKmFyZyAqLyApOworCisJLyogRW5hYmxlICJSWCBEYXRhIEF2YWlsYWJsZSIgSW50ZXJydXB0IG9uIFVBUlQgKi8KKwlvdXRfOChBQ1RJTkdfVUFSVDBfQkFTRSArIFVBUlRfSUVSLCAweDAxKTsKKwkvKiBTZXQgRFRSIGFjdGl2ZSAqLworCW91dF84KEFDVElOR19VQVJUMF9CQVNFICsgVUFSVF9NQ1IsCisJICAgICAgaW5fOCgodTggKilBQ1RJTkdfVUFSVDBfQkFTRSArIFVBUlRfTUNSKSB8IDB4MDEpOworCS8qIFN0YXJ0IGZsb3cgYnkgc2V0dGluZyBSVFMgYWN0aXZlICovCisJb3V0XzgoQUNUSU5HX1VBUlQwX0JBU0UgKyBVQVJUX01DUiwKKwkgICAgICBpbl84KCh1OCAqKUFDVElOR19VQVJUMF9CQVNFICsgVUFSVF9NQ1IpIHwgMHgwMik7CisJLyogU2V0dXAgVUFSVCBGSUZPOiBSWCB0cmlnZ2VyIGxldmVsOiA0IGJ5dGUsIEVuYWJsZSBGSUZPICovCisJb3V0XzgoQUNUSU5HX1VBUlQwX0JBU0UgKyBVQVJUX0ZDUiwgKDEgPDwgNikgfCAxKTsKK30KKwordm9pZCBzZXJpYWxfYnVmZmVyZWRfcHV0YyAoY29uc3QgY2hhciBjKQoreworCS8qIFdhaXQgZm9yIENUUyAqLworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKQorCXdoaWxlICghKGluXzgoKHU4ICopQUNUSU5HX1VBUlQwX0JBU0UgKyBVQVJUX01TUikgJiAweDEwKSkKKwkJV0FUQ0hET0dfUkVTRVQgKCk7CisjZWxzZQorCXdoaWxlICghKGluXzgoKHU4ICopQUNUSU5HX1VBUlQwX0JBU0UgKyBVQVJUX01TUikgJiAweDEwKSk7CisjZW5kaWYKKwlzZXJpYWxfcHV0YyAoYyk7Cit9CisKK3ZvaWQgc2VyaWFsX2J1ZmZlcmVkX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJc2VyaWFsX3B1dHMgKHMpOworfQorCitpbnQgc2VyaWFsX2J1ZmZlcmVkX2dldGMgKHZvaWQpCit7CisJaW50IHNwYWNlOworCWludCBjOworCWludCByeF9nZXQgPSBidWZfaW5mby5yeF9nZXQ7CisJaW50IHJ4X3B1dDsKKworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKQorCXdoaWxlIChyeF9nZXQgPT0gYnVmX2luZm8ucnhfcHV0KQorCQlXQVRDSERPR19SRVNFVCAoKTsKKyNlbHNlCisJd2hpbGUgKHJ4X2dldCA9PSBidWZfaW5mby5yeF9wdXQpOworI2VuZGlmCisJYyA9IGJ1Zl9pbmZvLnJ4X2J1ZmZlcltyeF9nZXQrK107CisJaWYgKHJ4X2dldCA9PSBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8pCisJCXJ4X2dldCA9IDA7CisJYnVmX2luZm8ucnhfZ2V0ID0gcnhfZ2V0OworCisJcnhfcHV0ID0gYnVmX2luZm8ucnhfcHV0OworCWlmIChyeF9nZXQgPD0gcnhfcHV0KQorCQlzcGFjZSA9IENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAtIChyeF9wdXQgLSByeF9nZXQpOworCWVsc2UKKwkJc3BhY2UgPSByeF9nZXQgLSByeF9wdXQ7CisKKwlpZiAoc3BhY2UgPiBDT05GSUdfU0VSSUFMX1NPRlRXQVJFX0ZJRk8gLyAyKSB7CisJCS8qIFN0YXJ0IGZsb3cgYnkgc2V0dGluZyBSVFMgYWN0aXZlICovCisJCW91dF84KEFDVElOR19VQVJUMF9CQVNFICsgVUFSVF9NQ1IsCisJCSAgICAgIGluXzgoKHU4ICopQUNUSU5HX1VBUlQwX0JBU0UgKyBVQVJUX01DUikgfCAweDAyKTsKKwl9CisKKwlyZXR1cm4gYzsKK30KKworaW50IHNlcmlhbF9idWZmZXJlZF90c3RjICh2b2lkKQoreworCXJldHVybiAoYnVmX2luZm8ucnhfZ2V0ICE9IGJ1Zl9pbmZvLnJ4X3B1dCkgPyAxIDogMDsKK30KKworI2VuZGlmCS8qIENPTkZJR19TRVJJQUxfU09GVFdBUkVfRklGTyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisvKgorICBBUyBIQVJOT0lTIDogYWNjb3JkaW5nIHRvIENPTkZJR19LR0RCX1NFUl9JTkRFWCBrZ2RiIHVzZXMgc2VyaWFsIHBvcnQKKyAgbnVtYmVyIDAgb3IgbnVtYmVyIDEKKyAgLSBpZiBDT05GSUdfS0dEQl9TRVJfSU5ERVggPSAxID0+IHNlcmlhbCBwb3J0IG51bWJlciAwIDoKKyAgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhbHJlYWR5IGRvbmUKKyAgLSBpZiBDT05GSUdfS0dEQl9TRVJfSU5ERVggPSAyID0+IHNlcmlhbCBwb3J0IG51bWJlciAxIDoKKyAgY29uZmlndXJlIHBvcnQgMSBmb3Igc2VyaWFsIEkvTyB3aXRoIHJhdGUgPSBDT05GSUdfS0dEQl9CQVVEUkFURQorKi8KKyNpZiAoQ09ORklHX0tHREJfU0VSX0lOREVYICYgMikKK3ZvaWQga2dkYl9zZXJpYWxfaW5pdCAodm9pZCkKK3sKKwl1OCB2YWw7CisJdTE2IGJyX3JlZzsKKworCWdldF9jbG9ja3MgKCk7CisJYnJfcmVnID0gKCgoKChnZC0+Y3B1X2NsayAvIDE2KSAvIDE4KSAqIDEwKSAvIENPTkZJR19LR0RCX0JBVURSQVRFKSArCisJCSAgNSkgLyAxMDsKKwkvKgorCSAqIEluaXQgb25ib2FyZCAxNjU1MCBVQVJUCisJICovCisJb3V0XzgoKHU4ICopQUNUSU5HX1VBUlQxX0JBU0UgKyBVQVJUX0xDUiwgMHg4MCk7CS8qIHNldCBETEFCIGJpdCAqLworCW91dF84KCh1OCAqKUFDVElOR19VQVJUMV9CQVNFICsgVUFSVF9ETEwsIChicl9yZWcgJiAweDAwZmYpKTsgLyogc2V0IGRpdmlzb3IgZm9yIDk2MDAgYmF1ZCAqLworCW91dF84KCh1OCAqKUFDVElOR19VQVJUMV9CQVNFICsgVUFSVF9ETE0sICgoYnJfcmVnICYgMHhmZjAwKSA+PiA4KSk7IC8qIHNldCBkaXZpc29yIGZvciA5NjAwIGJhdWQgKi8KKwlvdXRfOCgodTggKilBQ1RJTkdfVUFSVDFfQkFTRSArIFVBUlRfTENSLCAweDAzKTsJLyogbGluZSBjb250cm9sIDggYml0cyBubyBwYXJpdHkgKi8KKwlvdXRfOCgodTggKilBQ1RJTkdfVUFSVDFfQkFTRSArIFVBUlRfRkNSLCAweDAwKTsJLyogZGlzYWJsZSBGSUZPICovCisJb3V0XzgoKHU4ICopQUNUSU5HX1VBUlQxX0JBU0UgKyBVQVJUX01DUiwgMHgwMCk7CS8qIG5vIG1vZGVtIGNvbnRyb2wgRFRSIFJUUyAqLworCXZhbCA9IGluXzgoKHU4ICopQUNUSU5HX1VBUlQxX0JBU0UgKyBVQVJUX0xTUik7CQkvKiBjbGVhciBsaW5lIHN0YXR1cyAqLworCXZhbCA9IGluXzgoKHU4ICopQUNUSU5HX1VBUlQxX0JBU0UgKyBVQVJUX1JCUik7CQkvKiByZWFkIHJlY2VpdmUgYnVmZmVyICovCisJb3V0XzgoKHU4ICopQUNUSU5HX1VBUlQxX0JBU0UgKyBVQVJUX1NDUiwgMHgwMCk7CS8qIHNldCBzY3JhdGNocGFkICovCisJb3V0XzgoKHU4ICopQUNUSU5HX1VBUlQxX0JBU0UgKyBVQVJUX0lFUiwgMHgwMCk7CS8qIHNldCBpbnRlcnJ1cHQgZW5hYmxlIHJlZyAqLworfQorCit2b2lkIHB1dERlYnVnQ2hhciAoY29uc3QgY2hhciBjKQoreworCWlmIChjID09ICdcbicpCisJCXNlcmlhbF9wdXRjICgnXHInKTsKKworCW91dF84KCh1OCAqKUFDVElOR19VQVJUMV9CQVNFICsgVUFSVF9USFIsIGMpOwkvKiBwdXQgY2hhcmFjdGVyIG91dCAqLworCisJLyogY2hlY2sgVEhSRSBiaXQsIHdhaXQgZm9yIHRyYW5zZmVyIGRvbmUgKi8KKwl3aGlsZSAoKGluXzgoKHU4ICopQUNUSU5HX1VBUlQxX0JBU0UgKyBVQVJUX0xTUikgJiAweDIwKSAhPSAweDIwKTsKK30KKwordm9pZCBwdXREZWJ1Z1N0ciAoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpCisJCXNlcmlhbF9wdXRjICgqcysrKTsKK30KKworaW50IGdldERlYnVnQ2hhciAodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlzdGF0dXMgPSBpbl84KCh1OCAqKUFDVElOR19VQVJUMV9CQVNFICsgVUFSVF9MU1IpOworCQlpZiAoKHN0YXR1cyAmIGFzeW5jTFNSRGF0YVJlYWR5MSkgIT0gMHgwKQorCQkJYnJlYWs7CisKKwkJaWYgKChzdGF0dXMgJiAoYXN5bmNMU1JGcmFtaW5nRXJyb3IxIHwKKwkJCSAgICAgICBhc3luY0xTUk92ZXJydW5FcnJvcjEgfAorCQkJICAgICAgIGFzeW5jTFNSUGFyaXR5RXJyb3IxICB8CisJCQkgICAgICAgYXN5bmNMU1JCcmVha0ludGVycnVwdDEgKSkgIT0gMCkgeworCQkJb3V0XzgoKHU4ICopQUNUSU5HX1VBUlQxX0JBU0UgKyBVQVJUX0xTUiwKKwkJCSAgICAgIGFzeW5jTFNSRnJhbWluZ0Vycm9yMSB8CisJCQkgICAgICBhc3luY0xTUk92ZXJydW5FcnJvcjEgfAorCQkJICAgICAgYXN5bmNMU1JQYXJpdHlFcnJvcjEgIHwKKwkJCSAgICAgIGFzeW5jTFNSQnJlYWtJbnRlcnJ1cHQxKTsKKwkJfQorCX0KKworCXJldHVybiAoMHgwMDAwMDBmZiAmIChpbnQpIGluXzgoKHU4ICopQUNUSU5HX1VBUlQxX0JBU0UpKTsKK30KKwordm9pZCBrZ2RiX2ludGVycnVwdGlibGUgKGludCB5ZXMpCit7CisJcmV0dXJuOworfQorCisjZWxzZQkvKiAhIChDT05GSUdfS0dEQl9TRVJfSU5ERVggJiAyKSAqLworCit2b2lkIGtnZGJfc2VyaWFsX2luaXQgKHZvaWQpCit7CisJc2VyaWFsX3ByaW50ZiAoIltvbiBzZXJpYWxdICIpOworfQorCit2b2lkIHB1dERlYnVnQ2hhciAoaW50IGMpCit7CisJc2VyaWFsX3B1dGMgKGMpOworfQorCit2b2lkIHB1dERlYnVnU3RyIChjb25zdCBjaGFyICpzdHIpCit7CisJc2VyaWFsX3B1dHMgKHN0cik7Cit9CisKK2ludCBnZXREZWJ1Z0NoYXIgKHZvaWQpCit7CisJcmV0dXJuIHNlcmlhbF9nZXRjICgpOworfQorCit2b2lkIGtnZGJfaW50ZXJydXB0aWJsZSAoaW50IHllcykKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYJLyogKENPTkZJR19LR0RCX1NFUl9JTkRFWCAmIDIpICovCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01VTFRJKQoraW50IHNlcmlhbDBfaW5pdCh2b2lkKQoreworCXJldHVybiAoc2VyaWFsX2luaXRfZGV2KFVBUlQwX0JBU0UpKTsKK30KKworaW50IHNlcmlhbDFfaW5pdCh2b2lkKQoreworCXJldHVybiAoc2VyaWFsX2luaXRfZGV2KFVBUlQxX0JBU0UpKTsKK30KKwordm9pZCBzZXJpYWwwX3NldGJyZyAodm9pZCkKK3sKKwlzZXJpYWxfc2V0YnJnX2RldihVQVJUMF9CQVNFKTsKK30KKwordm9pZCBzZXJpYWwxX3NldGJyZyAodm9pZCkKK3sKKwlzZXJpYWxfc2V0YnJnX2RldihVQVJUMV9CQVNFKTsKK30KKwordm9pZCBzZXJpYWwwX3B1dGMoY29uc3QgY2hhciBjKQoreworCXNlcmlhbF9wdXRjX2RldihVQVJUMF9CQVNFLGMpOworfQorCit2b2lkIHNlcmlhbDFfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisJc2VyaWFsX3B1dGNfZGV2KFVBUlQxX0JBU0UsIGMpOworfQorCit2b2lkIHNlcmlhbDBfcHV0cyhjb25zdCBjaGFyICpzKQoreworCXNlcmlhbF9wdXRzX2RldihVQVJUMF9CQVNFLCBzKTsKK30KKwordm9pZCBzZXJpYWwxX3B1dHMoY29uc3QgY2hhciAqcykKK3sKKwlzZXJpYWxfcHV0c19kZXYoVUFSVDFfQkFTRSwgcyk7Cit9CisKK2ludCBzZXJpYWwwX2dldGModm9pZCkKK3sKKwlyZXR1cm4oc2VyaWFsX2dldGNfZGV2KFVBUlQwX0JBU0UpKTsKK30KKworaW50IHNlcmlhbDFfZ2V0Yyh2b2lkKQoreworCXJldHVybihzZXJpYWxfZ2V0Y19kZXYoVUFSVDFfQkFTRSkpOworfQorCitpbnQgc2VyaWFsMF90c3RjKHZvaWQpCit7CisJcmV0dXJuIChzZXJpYWxfdHN0Y19kZXYoVUFSVDBfQkFTRSkpOworfQorCitpbnQgc2VyaWFsMV90c3RjKHZvaWQpCit7CisJcmV0dXJuIChzZXJpYWxfdHN0Y19kZXYoVUFSVDFfQkFTRSkpOworfQorCitzdHJ1Y3Qgc2VyaWFsX2RldmljZSBzZXJpYWwwX2RldmljZSA9Cit7CisJInNlcmlhbDAiLAorCSJVQVJUMCIsCisJc2VyaWFsMF9pbml0LAorCXNlcmlhbDBfc2V0YnJnLAorCXNlcmlhbDBfZ2V0YywKKwlzZXJpYWwwX3RzdGMsCisJc2VyaWFsMF9wdXRjLAorCXNlcmlhbDBfcHV0cywKK307CisKK3N0cnVjdCBzZXJpYWxfZGV2aWNlIHNlcmlhbDFfZGV2aWNlID0KK3sKKwkic2VyaWFsMSIsCisJIlVBUlQxIiwKKwlzZXJpYWwxX2luaXQsCisJc2VyaWFsMV9zZXRicmcsCisJc2VyaWFsMV9nZXRjLAorCXNlcmlhbDFfdHN0YywKKwlzZXJpYWwxX3B1dGMsCisJc2VyaWFsMV9wdXRzLAorfTsKKyNlbHNlCisvKgorICogV3JhcHBlciBmdW5jdGlvbnMKKyAqLworaW50IHNlcmlhbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNlcmlhbF9pbml0X2RldihBQ1RJTkdfVUFSVDBfQkFTRSk7Cit9CisKK3ZvaWQgc2VyaWFsX3NldGJyZyh2b2lkKQoreworCXNlcmlhbF9zZXRicmdfZGV2KEFDVElOR19VQVJUMF9CQVNFKTsKK30KKwordm9pZCBzZXJpYWxfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisJc2VyaWFsX3B1dGNfZGV2KEFDVElOR19VQVJUMF9CQVNFLCBjKTsKK30KKwordm9pZCBzZXJpYWxfcHV0cyhjb25zdCBjaGFyICpzKQoreworCXNlcmlhbF9wdXRzX2RldihBQ1RJTkdfVUFSVDBfQkFTRSwgcyk7Cit9CisKK2ludCBzZXJpYWxfZ2V0Yyh2b2lkKQoreworCXJldHVybiBzZXJpYWxfZ2V0Y19kZXYoQUNUSU5HX1VBUlQwX0JBU0UpOworfQorCitpbnQgc2VyaWFsX3RzdGModm9pZCkKK3sKKwlyZXR1cm4gc2VyaWFsX3RzdGNfZGV2KEFDVElOR19VQVJUMF9CQVNFKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0VSSUFMX01VTFRJICovCisKKyNlbmRpZgkvKiBDT05GSUdfNDA1R1AgfHwgQ09ORklHXzQwNUNSICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDUzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDkyIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk6PSByZXNldHZlYy5vCitTVEFSVAkrPSBzdGFydC5vCisKK1NPQkpTCTo9IGNhY2hlLm8KK1NPQkpTCSs9IGRjci5vCitTT0JKUwkrPSBrZ2RiLm8KKworQ09CSlMJOj0gNDB4X3NwZF9zZHJhbS5vCisKK0NPQkpTCSs9IDQ0eF9zcGRfZGRyLm8KK0NPQkpTCSs9IDQ0eF9zcGRfZGRyMi5vCitpZmRlZiBDT05GSUdfUFBDNHh4X0REUl9BVVRPQ0FMSUJSQVRJT04KK0NPQkpTCSs9IDR4eF9pYm1fZGRyMl9hdXRvY2FsaWIubworZW5kaWYKK0NPQkpTCSs9IDR4eF9wY2kubworQ09CSlMJKz0gNHh4X3BjaWUubworQ09CSlMJKz0gYmVkYnVnXzQwNS5vCitpZmRlZiBDT05GSUdfQ01EX0NISVBfQ09ORklHCitDT0JKUwkrPSBjbWRfY2hpcF9jb25maWcubworZW5kaWYKK0NPQkpTCSs9IGNvbW1wcm9jLm8KK0NPQkpTCSs9IGNwdS5vCitDT0JKUwkrPSBjcHVfaW5pdC5vCitDT0JKUwkrPSBkZW5hbGlfZGF0YV9leWUubworQ09CSlMJKz0gZGVuYWxpX3NwZF9kZHIyLm8KK0NPQkpTCSs9IGVjYy5vCitDT0JKUwkrPSBmZHQubworQ09CSlMJKz0gaW50ZXJydXB0cy5vCitDT0JKUwkrPSBpb3A0ODBfdWFydC5vCitpZmRlZiBDT05GSUdfQ01EX1JFR0lORk8KK0NPQkpTCSs9IHJlZ2luZm8ubworZW5kaWYKK0NPQkpTCSs9IHNkcmFtLm8KK0NPQkpTCSs9IHNwZWVkLm8KK0NPQkpTCSs9IHRsYi5vCitDT0JKUwkrPSB0cmFwcy5vCitDT0JKUwkrPSB1c2IubworQ09CSlMJKz0gdXNiX29oY2kubworQ09CSlMJKz0gdXNiZGV2Lm8KK2lmbmRlZiBDT05GSUdfWElMSU5YXzQ0MAorQ09CSlMJKz0gNHh4X3VhcnQubworQ09CSlMJKz0gZ3Bpby5vCitDT0JKUwkrPSBtaWlwaHkubworQ09CSlMJKz0gdWljLm8KK2Vsc2UKK0NPQkpTCSs9IHhpbGlueF9pcnEubworZW5kaWYKKworU1JDUwk6PSAkKFNUQVJUOi5vPS5TKSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykgJChDT0JKUykpCitTVEFSVAk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTVEFSVCkpCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9iZWRidWdfNDA1LmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9iZWRidWdfNDA1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxMWNiNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L2JlZGJ1Z180MDUuYwpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIEJlZGJ1ZyBGdW5jdGlvbnMgc3BlY2lmaWMgdG8gdGhlIFBQQzQwNSBjaGlwCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGJlZGJ1Zy90eXBlLmg+CisjaW5jbHVkZSA8YmVkYnVnL2JlZGJ1Zy5oPgorI2luY2x1ZGUgPGJlZGJ1Zy9yZWdzLmg+CisjaW5jbHVkZSA8YmVkYnVnL3BwYy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykgJiYgZGVmaW5lZChDT05GSUdfNHh4KQorCisjZGVmaW5lIE1BWF9CUkVBS19QT0lOVFMgNAorCitleHRlcm4gQ1BVX0RFQlVHX0NUWCBidWdfY3R4OworCit2b2lkIGJlZGJ1ZzQwNV9pbml0IF9fUCAoKHZvaWQpKTsKK3ZvaWQgYmVkYnVnNDA1X2RvX2JyZWFrIF9fUCAoKGNtZF90YmxfdCAqLCBpbnQsIGludCwgY2hhciAqW10pKTsKK3ZvaWQgYmVkYnVnNDA1X2JyZWFrX2lzciBfX1AgKChzdHJ1Y3QgcHRfcmVncyAqKSk7CitpbnQgYmVkYnVnNDA1X2ZpbmRfZW1wdHkgX19QICgodm9pZCkpOworaW50IGJlZGJ1ZzQwNV9zZXQgX19QICgoaW50LCB1bnNpZ25lZCBsb25nKSk7CitpbnQgYmVkYnVnNDA1X2NsZWFyIF9fUCAoKGludCkpOworDAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgYnVnX2N0eCBzdHJ1Y3R1cmUgZm9yIHRoZSBBTUNDIFBQQzQwNS4JQ2xlYXIgYWxsCisgKiBvZiB0aGUgYnJlYWtwb2ludHMuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgYmVkYnVnNDA1X2luaXQgKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJYnVnX2N0eC5od19kZWJ1Z19lbmFibGVkID0gMDsKKwlidWdfY3R4LnN0b3BwZWQgPSAwOworCWJ1Z19jdHguY3VycmVudF9icCA9IDA7CisJYnVnX2N0eC5yZWdzID0gTlVMTDsKKworCWJ1Z19jdHguZG9fYnJlYWsgPSBiZWRidWc0MDVfZG9fYnJlYWs7CisJYnVnX2N0eC5icmVha19pc3IgPSBiZWRidWc0MDVfYnJlYWtfaXNyOworCWJ1Z19jdHguZmluZF9lbXB0eSA9IGJlZGJ1ZzQwNV9maW5kX2VtcHR5OworCWJ1Z19jdHguc2V0ID0gYmVkYnVnNDA1X3NldDsKKwlidWdfY3R4LmNsZWFyID0gYmVkYnVnNDA1X2NsZWFyOworCisJZm9yIChpID0gMTsgaSA8PSBNQVhfQlJFQUtfUE9JTlRTOyArK2kpCisJCSgqYnVnX2N0eC5jbGVhcikgKGkpOworCisJcHV0cyAoIkJFREJVRzpyZWFkeVxuIik7CisJcmV0dXJuOworfQkvKiBiZWRidWdfaW5pdF9icmVha3BvaW50cyAqLworDAorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldC9jbGVhci9zaG93IG9uZSBvZiB0aGUgaGFyZHdhcmUgYnJlYWtwb2ludHMgZm9yIHRoZSA0MDUuCVRoZSAib2ZmIgorICogc3RyaW5nIHdpbGwgZGlzYWJsZSBhIHNwZWNpZmljIGJyZWFrcG9pbnQuICBUaGUgInNob3ciIHN0cmluZyB3aWxsCisgKiBkaXNwbGF5IHRoZSBjdXJyZW50IGJyZWFrcG9pbnRzLiAgT3RoZXJ3aXNlIGFuIGFkZHJlc3Mgd2lsbCBzZXQgYQorICogYnJlYWtwb2ludCBhdCB0aGF0IGFkZHJlc3MuCVNldHRpbmcgYSBicmVha3BvaW50IHVzZXMgdGhlIENQVS1zcGVjaWZpYworICogc2V0IHJvdXRpbmUgd2hpY2ggd2lsbCBhc3NpZ24gYSBicmVha3BvaW50IG51bWJlci4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBiZWRidWc0MDVfZG9fYnJlYWsgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlsb25nIGFkZHIgPSAwOwkJLyogQWRkcmVzcyB0byBicmVhayBhdCAgKi8KKwlpbnQgd2hpY2hfYnA7CQkvKiBCcmVha3BvaW50IG51bWJlciAgICAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmIChhcmdjIDwgMikgeworCQljbWRfdXNhZ2UoY21kdHApOworCQlyZXR1cm47CisJfQorCisJLyogVHVybiBvZmYgYSBicmVha3BvaW50ICovCisKKwlpZiAoc3RyY21wIChhcmd2WzFdLCAib2ZmIikgPT0gMCkgeworCQlpZiAoYnVnX2N0eC5od19kZWJ1Z19lbmFibGVkID09IDApIHsKKwkJCXByaW50ZiAoIk5vIGJyZWFrcG9pbnRzIGVuYWJsZWRcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJd2hpY2hfYnAgPSBzaW1wbGVfc3RydG91bCAoYXJndlsyXSwgTlVMTCwgMTApOworCisJCWlmIChidWdfY3R4LmNsZWFyKQorCQkJKCpidWdfY3R4LmNsZWFyKSAod2hpY2hfYnApOworCisJCXByaW50ZiAoIkJyZWFrcG9pbnQgJWQgcmVtb3ZlZFxuIiwgd2hpY2hfYnApOworCQlyZXR1cm47CisJfQorCisJLyogU2hvdyBhIGxpc3Qgb2YgYnJlYWtwb2ludHMgKi8KKworCWlmIChzdHJjbXAgKGFyZ3ZbMV0sICJzaG93IikgPT0gMCkgeworCQlmb3IgKHdoaWNoX2JwID0gMTsgd2hpY2hfYnAgPD0gTUFYX0JSRUFLX1BPSU5UUzsgKyt3aGljaF9icCkgeworCisJCQlzd2l0Y2ggKHdoaWNoX2JwKSB7CisJCQljYXNlIDE6CisJCQkJYWRkciA9IEdFVF9JQUMxICgpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWFkZHIgPSBHRVRfSUFDMiAoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlhZGRyID0gR0VUX0lBQzMgKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJYWRkciA9IEdFVF9JQUM0ICgpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwcmludGYgKCJCcmVha3BvaW50IFslZF06ICIsIHdoaWNoX2JwKTsKKwkJCWlmIChhZGRyID09IDApCisJCQkJcHJpbnRmICgiTk9UIFNFVFxuIik7CisJCQllbHNlCisJCQkJZGlzcHBjICgodW5zaWduZWQgY2hhciAqKSBhZGRyLCAwLCAxLCBiZWRidWdfcHV0cywKKwkJCQkJCUZfUkFESEVYKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogU2V0IGEgYnJlYWtwb2ludCBhdCB0aGUgYWRkcmVzcyAqLworCisJaWYgKCFpc2RpZ2l0IChhcmd2WzFdWzBdKSkgeworCQljbWRfdXNhZ2UoY21kdHApOworCQlyZXR1cm47CisJfQorCisJYWRkciA9IHNpbXBsZV9zdHJ0b3VsIChhcmd2WzFdLCBOVUxMLCAxNikgJiAweGZmZmZmZmZjOworCisJaWYgKChidWdfY3R4LnNldCkgJiYgKHdoaWNoX2JwID0gKCpidWdfY3R4LnNldCkgKDAsIGFkZHIpKSA+IDApIHsKKwkJcHJpbnRmICgiQnJlYWtwb2ludCBbJWRdOiAiLCB3aGljaF9icCk7CisJCWRpc3BwYyAoKHVuc2lnbmVkIGNoYXIgKikgYWRkciwgMCwgMSwgYmVkYnVnX3B1dHMsIEZfUkFESEVYKTsKKwl9CisKKwlyZXR1cm47Cit9CS8qIGJlZGJ1ZzQwNV9kb19icmVhayAqLworDAorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSBhIGJyZWFrcG9pbnQuCSBGaXJzdCBkZXRlcm1pbmUgd2hpY2ggYnJlYWtwb2ludCB3YXMgaGl0IGJ5CisgKiBsb29raW5nIGF0IHRoZSBEZUJ1ZyBTdGF0dXMgUmVnaXN0ZXIgKERCU1IpLCBjbGVhciB0aGUgYnJlYWtwb2ludAorICogYW5kIGVudGVyIGEgbWluaSBtYWluIGxvb3AuCVN0YXkgaW4gdGhlIGxvb3AgdW50aWwgdGhlIHN0b3BwZWQgZmxhZworICogaW4gdGhlIGRlYnVnIGNvbnRleHQgaXMgY2xlYXJlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBiZWRidWc0MDVfYnJlYWtfaXNyIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGRic3JfdmFsOwkJLyogVmFsdWUgb2YgdGhlIERCU1IgICAgKi8KKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOwkJLyogQWRkcmVzcyBzdG9wcGVkIGF0ICAgKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlkYnNyX3ZhbCA9IEdFVF9EQlNSICgpOworCisJaWYgKGRic3JfdmFsICYgREJTUl9JQTEpIHsKKwkJYnVnX2N0eC5jdXJyZW50X2JwID0gMTsKKwkJYWRkciA9IEdFVF9JQUMxICgpOworCQlTRVRfREJTUiAoREJTUl9JQTEpOwkvKiBXcml0ZSBhIDEgdG8gY2xlYXIgKi8KKwl9IGVsc2UgaWYgKGRic3JfdmFsICYgREJTUl9JQTIpIHsKKwkJYnVnX2N0eC5jdXJyZW50X2JwID0gMjsKKwkJYWRkciA9IEdFVF9JQUMyICgpOworCQlTRVRfREJTUiAoREJTUl9JQTIpOwkvKiBXcml0ZSBhIDEgdG8gY2xlYXIgKi8KKwl9IGVsc2UgaWYgKGRic3JfdmFsICYgREJTUl9JQTMpIHsKKwkJYnVnX2N0eC5jdXJyZW50X2JwID0gMzsKKwkJYWRkciA9IEdFVF9JQUMzICgpOworCQlTRVRfREJTUiAoREJTUl9JQTMpOwkvKiBXcml0ZSBhIDEgdG8gY2xlYXIgKi8KKwl9IGVsc2UgaWYgKGRic3JfdmFsICYgREJTUl9JQTQpIHsKKwkJYnVnX2N0eC5jdXJyZW50X2JwID0gNDsKKwkJYWRkciA9IEdFVF9JQUM0ICgpOworCQlTRVRfREJTUiAoREJTUl9JQTQpOwkvKiBXcml0ZSBhIDEgdG8gY2xlYXIgKi8KKwl9CisKKwliZWRidWdfbWFpbl9sb29wIChhZGRyLCByZWdzKTsKKwlyZXR1cm47Cit9CS8qIGJlZGJ1ZzQwNV9icmVha19pc3IgKi8KKwwKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb29rIHRocm91Z2ggYWxsIG9mIHRoZSBoYXJkd2FyZSBicmVha3BvaW50cyBhdmFpbGFibGUgdG8gc2VlIGlmIG9uZQorICogaXMgdW51c2VkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitpbnQgYmVkYnVnNDA1X2ZpbmRfZW1wdHkgKHZvaWQpCit7CisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmIChHRVRfSUFDMSAoKSA9PSAwKQorCQlyZXR1cm4gMTsKKworCWlmIChHRVRfSUFDMiAoKSA9PSAwKQorCQlyZXR1cm4gMjsKKworCWlmIChHRVRfSUFDMyAoKSA9PSAwKQorCQlyZXR1cm4gMzsKKworCWlmIChHRVRfSUFDNCAoKSA9PSAwKQorCQlyZXR1cm4gNDsKKworCXJldHVybiAwOworfQkvKiBiZWRidWc0MDVfZmluZF9lbXB0eSAqLworDAorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBhIGJyZWFrcG9pbnQuICBJZiAnd2hpY2hfYnAnIGlzIHplcm8gdGhlbiBmaW5kIGFuIHVudXNlZCBicmVha3BvaW50CisgKiBudW1iZXIsIG90aGVyd2lzZSByZWFzc2lnbiB0aGUgZ2l2ZW4gYnJlYWtwb2ludC4gIElmIGhhcmR3YXJlIGRlYnVnZ2luZworICogaXMgbm90IGVuYWJsZWQsIHRoZW4gdHVybiBpdCBvbiB2aWEgdGhlIE1TUiBhbmQgREJDUjAuICBTZXQgdGhlIGJyZWFrCisgKiBhZGRyZXNzIGluIHRoZSBhcHByb3ByaWF0ZSBJQUN4IHJlZ2lzdGVyIGFuZCBlbmFibGUgcHJvcGVyIGFkZHJlc3MKKyAqIGJlYWtwb2ludCBpbiBEQkNSMC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworaW50IGJlZGJ1ZzQwNV9zZXQgKGludCB3aGljaF9icCwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBPbmx5IGxvb2sgaWYgd2hpY2hfYnAgPT0gMCwgZWxzZSB1c2Ugd2hpY2hfYnAgKi8KKwlpZiAoKGJ1Z19jdHguZmluZF9lbXB0eSkgJiYgKCF3aGljaF9icCkgJiYKKwkJKHdoaWNoX2JwID0gKCpidWdfY3R4LmZpbmRfZW1wdHkpICgpKSA9PSAwKSB7CisJCXByaW50ZiAoIkFsbCBicmVha3BvaW50cyBpbiB1c2VcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAod2hpY2hfYnAgPCAxIHx8IHdoaWNoX2JwID4gTUFYX0JSRUFLX1BPSU5UUykgeworCQlwcmludGYgKCJJbnZhbGlkIGJyZWFrIHBvaW50ICMgJWRcbiIsIHdoaWNoX2JwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFidWdfY3R4Lmh3X2RlYnVnX2VuYWJsZWQpIHsKKwkJU0VUX01TUiAoR0VUX01TUiAoKSB8IDB4MjAwKTsJLyogc2V0IE1TUlsgREUgXSAqLworCQlTRVRfREJDUjAgKEdFVF9EQkNSMCAoKSB8IERCQ1IwX0lETSk7CisJCWJ1Z19jdHguaHdfZGVidWdfZW5hYmxlZCA9IDE7CisJfQorCisJc3dpdGNoICh3aGljaF9icCkgeworCWNhc2UgMToKKwkJU0VUX0lBQzEgKGFkZHIpOworCQlTRVRfREJDUjAgKEdFVF9EQkNSMCAoKSB8IERCQ1IwX0lBMSk7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlTRVRfSUFDMiAoYWRkcik7CisJCVNFVF9EQkNSMCAoR0VUX0RCQ1IwICgpIHwgREJDUjBfSUEyKTsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCVNFVF9JQUMzIChhZGRyKTsKKwkJU0VUX0RCQ1IwIChHRVRfREJDUjAgKCkgfCBEQkNSMF9JQTMpOworCQlicmVhazsKKworCWNhc2UgNDoKKwkJU0VUX0lBQzQgKGFkZHIpOworCQlTRVRfREJDUjAgKEdFVF9EQkNSMCAoKSB8IERCQ1IwX0lBNCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiB3aGljaF9icDsKK30JLyogYmVkYnVnNDA1X3NldCAqLworDAorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpc2FibGUgYSBzcGVjaWZpYyBicmVha29pbnQgYnkgc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgSUFDeCByZWdpc3RlcgorICogdG8gemVybyBhbmQgY2xhcmluZyB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcyBicmVha3BvaW50IGluIERCQ1IwLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitpbnQgYmVkYnVnNDA1X2NsZWFyIChpbnQgd2hpY2hfYnApCit7CisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWlmICh3aGljaF9icCA8IDEgfHwgd2hpY2hfYnAgPiBNQVhfQlJFQUtfUE9JTlRTKSB7CisJCXByaW50ZiAoIkludmFsaWQgYnJlYWsgcG9pbnQgIyAoJWQpXG4iLCB3aGljaF9icCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzd2l0Y2ggKHdoaWNoX2JwKSB7CisJY2FzZSAxOgorCQlTRVRfSUFDMSAoMCk7CisJCVNFVF9EQkNSMCAoR0VUX0RCQ1IwICgpICYgfkRCQ1IwX0lBMSk7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlTRVRfSUFDMiAoMCk7CisJCVNFVF9EQkNSMCAoR0VUX0RCQ1IwICgpICYgfkRCQ1IwX0lBMik7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlTRVRfSUFDMyAoMCk7CisJCVNFVF9EQkNSMCAoR0VUX0RCQ1IwICgpICYgfkRCQ1IwX0lBMyk7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlTRVRfSUFDNCAoMCk7CisJCVNFVF9EQkNSMCAoR0VUX0RCQ1IwICgpICYgfkRCQ1IwX0lBNCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQkvKiBiZWRidWc0MDVfY2xlYXIgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L2NhY2hlLlMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9jYWNoZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OTcxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9jYWNoZS5TCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1pc2NlbGxhbmVvdXMgbG93LWxldmVsIGZ1bmN0aW9ucy4KKyAqICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEdhcnkgVGhvbWFzIChnZHRAbGludXhwcGMub3JnKQorICoKKyAqIExhcmdlbHkgcmV3cml0dGVuIGJ5IENvcnQgRG91Z2FuIChjb3J0QGNzLm5tdC5lZHUpCisgKiBhbmQgUGF1bCBNYWNrZXJyYXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxwcGNfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKworLyoKKyAqIEZsdXNoIGluc3RydWN0aW9uIGNhY2hlLgorICovCitfR0xPQkFMKGludmFsaWRhdGVfaWNhY2hlKQorCWljY2NpCXIwLHIwCisJaXN5bmMKKwlibHIKKworLyoKKyAqIFdyaXRlIGFueSBtb2RpZmllZCBkYXRhIGNhY2hlIGJsb2NrcyBvdXQgdG8gbWVtb3J5CisgKiBhbmQgaW52YWxpZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBpbnN0cnVjdGlvbiBjYWNoZSBibG9ja3MuCisgKgorICogZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc3RvcCkKKyAqLworX0dMT0JBTChmbHVzaF9pY2FjaGVfcmFuZ2UpCisJbGkJcjUsTDFfQ0FDSEVfQllURVMtMQorCWFuZGMJcjMscjMscjUKKwlzdWJmCXI0LHIzLHI0CisJYWRkCXI0LHI0LHI1CisJc3J3aS4JcjQscjQsTDFfQ0FDSEVfU0hJRlQKKwliZXFscgorCW10Y3RyCXI0CisJbXIJcjYscjMKKzE6CWRjYnN0CTAscjMKKwlhZGRpCXIzLHIzLEwxX0NBQ0hFX0JZVEVTCisJYmRuegkxYgorCXN5bmMJCQkJLyogd2FpdCBmb3IgZGNic3QncyB0byBnZXQgdG8gcmFtICovCisJbXRjdHIJcjQKKzI6CWljYmkJMCxyNgorCWFkZGkJcjYscjYsTDFfQ0FDSEVfQllURVMKKwliZG56CTJiCisJc3luYwkJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCisJaXN5bmMKKwlibHIKKworLyoKKyAqIFdyaXRlIGFueSBtb2RpZmllZCBkYXRhIGNhY2hlIGJsb2NrcyBvdXQgdG8gbWVtb3J5LgorICogRG9lcyBub3QgaW52YWxpZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSBsaW5lcyAoZXNwZWNpYWxseSBmb3IKKyAqIGFueSBjb3JyZXNwb25kaW5nIGluc3RydWN0aW9uIGNhY2hlKS4KKyAqCisgKiBjbGVhbl9kY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzdG9wKQorICovCitfR0xPQkFMKGNsZWFuX2RjYWNoZV9yYW5nZSkKKwlsaQlyNSxMMV9DQUNIRV9CWVRFUy0xCisJYW5kYwlyMyxyMyxyNQorCXN1YmYJcjQscjMscjQKKwlhZGQJcjQscjQscjUKKwlzcndpLglyNCxyNCxMMV9DQUNIRV9TSElGVAorCWJlcWxyCisJbXRjdHIJcjQKKworMToJZGNic3QJMCxyMworCWFkZGkJcjMscjMsTDFfQ0FDSEVfQllURVMKKwliZG56CTFiCisJc3luYwkJCQkvKiB3YWl0IGZvciBkY2JzdCdzIHRvIGdldCB0byByYW0gKi8KKwlibHIKKworLyoKKyAqIFdyaXRlIGFueSBtb2RpZmllZCBkYXRhIGNhY2hlIGJsb2NrcyBvdXQgdG8gbWVtb3J5IGFuZCBpbnZhbGlkYXRlIHRoZW0uCisgKiBEb2VzIG5vdCBpbnZhbGlkYXRlIHRoZSBjb3JyZXNwb25kaW5nIGluc3RydWN0aW9uIGNhY2hlIGJsb2Nrcy4KKyAqCisgKiBmbHVzaF9kY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzdG9wKQorICovCitfR0xPQkFMKGZsdXNoX2RjYWNoZV9yYW5nZSkKKwlsaQlyNSxMMV9DQUNIRV9CWVRFUy0xCisJYW5kYwlyMyxyMyxyNQorCXN1YmYJcjQscjMscjQKKwlhZGQJcjQscjQscjUKKwlzcndpLglyNCxyNCxMMV9DQUNIRV9TSElGVAorCWJlcWxyCisJbXRjdHIJcjQKKworMToJZGNiZgkwLHIzCisJYWRkaQlyMyxyMyxMMV9DQUNIRV9CWVRFUworCWJkbnoJMWIKKwlzeW5jCQkJCS8qIHdhaXQgZm9yIGRjYnN0J3MgdG8gZ2V0IHRvIHJhbSAqLworCWJscgorCisvKgorICogTGlrZSBhYm92ZSwgYnV0IGludmFsaWRhdGUgdGhlIEQtY2FjaGUuICBUaGlzIGlzIHVzZWQgYnkgdGhlIDh4eAorICogdG8gaW52YWxpZGF0ZSB0aGUgY2FjaGUgc28gdGhlIFBQQyBjb3JlIGRvZXNuJ3QgZ2V0IHN0YWxlIGRhdGEKKyAqIGZyb20gdGhlIENQTSAobm8gY2FjaGUgc25vb3BpbmcgaGVyZSA6LSkuCisgKgorICogaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzdG9wKQorICovCitfR0xPQkFMKGludmFsaWRhdGVfZGNhY2hlX3JhbmdlKQorCWxpCXI1LEwxX0NBQ0hFX0JZVEVTLTEKKwlhbmRjCXIzLHIzLHI1CisJc3ViZglyNCxyMyxyNAorCWFkZAlyNCxyNCxyNQorCXNyd2kuCXI0LHI0LEwxX0NBQ0hFX1NISUZUCisJYmVxbHIKKwltdGN0cglyNAorCisxOglkY2JpCTAscjMKKwlhZGRpCXIzLHIzLEwxX0NBQ0hFX0JZVEVTCisJYmRuegkxYgorCXN5bmMJCQkJLyogd2FpdCBmb3IgZGNiaSdzIHRvIGdldCB0byByYW0gKi8KKwlibHIKKworLyoKKyAqIDQweCBjb3JlcyBoYXZlIDhLIG9yIDE2SyBkY2FjaGUgYW5kIDMyIGJ5dGUgbGluZSBzaXplLgorICogNDR4IGhhcyBhIDMySyBkY2FjaGUgYW5kIDMyIGJ5dGUgbGluZSBzaXplLgorICogOHh4IGhhcyAxLCAyLCA0LCA4SyB2YXJpYW50cy4KKyAqIEZvciBub3csIGNvdmVyIHRoZSB3b3JzdCBjYXNlIG9mIHRoZSA0NHguCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGV4dGVybmFsIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KKyNkZWZpbmUgQ0FDSEVfTldBWVMgICAgIDY0CisjZGVmaW5lIENBQ0hFX05MSU5FUyAgICAzMgorCitfR0xPQkFMKGZsdXNoX2RjYWNoZSkKKwlsaQlyNCwoMiAqIENBQ0hFX05XQVlTICogQ0FDSEVfTkxJTkVTKQorCW10Y3RyCXI0CisJbGlzCXI1LDAKKzE6CWx3eglyMywwKHI1KQkJLyogTG9hZCBvbmUgd29yZCBmcm9tIGV2ZXJ5IGxpbmUgKi8KKwlhZGRpCXI1LHI1LEwxX0NBQ0hFX0JZVEVTCisJYmRuegkxYgorCXN5bmMKKwlibHIKKworX0dMT0JBTChpbnZhbGlkYXRlX2RjYWNoZSkKKwlhZGRpCXI2LDAsMHgwMDAwCQkvKiBjbGVhciBHUFIgNiAqLworCS8qIERvIGxvb3AgZm9yICMgb2YgZGNhY2hlIGNvbmdydWVuY2UgY2xhc3Nlcy4gKi8KKwlsaXMJcjcsKENPTkZJR19TWVNfRENBQ0hFX1NJWkUgLyBMMV9DQUNIRV9CWVRFUyAvIDIpQGhhCS8qIFRCUyBmb3IgbGFyZ2Ugc2l6ZWQgY2FjaGUgKi8KKwlvcmkJcjcscjcsKENPTkZJR19TWVNfRENBQ0hFX1NJWkUgLyBMMV9DQUNIRV9CWVRFUyAvIDIpQGwKKwkJCQkJLyogTk9URTogZGNjY2kgaW52YWxpZGF0ZXMgYm90aCAqLworCW10Y3RyCXI3CQkJLyogd2F5cyBpbiB0aGUgRCBjYWNoZSAqLworLi5kY2xvb3A6CisJZGNjY2kJMCxyNgkJCS8qIGludmFsaWRhdGUgbGluZSAqLworCWFkZGkJcjYscjYsTDFfQ0FDSEVfQllURVMJLyogYnVtcCB0byBuZXh0IGxpbmUgKi8KKwliZG56CS4uZGNsb29wCisJc3luYworCWJscgorCisvKgorICogQ2FjaGUgZnVuY3Rpb25zLgorICoKKyAqIE5PVEU6IGN1cnJlbnRseSB0aGUgNDQwcyBydW4gd2l0aCBkY2FjaGUgX2Rpc2FibGVkXyBvbmNlIHJlbG9jYXRlZCB0byBEUkFNLAorICogYWx0aG91Z2ggZm9yIHNvbWUgY2FjaGUtcmFsYXRlZCBjYWxscyBzdHVicyBoYXZlIHRvIGJlIHByb3ZpZGVkIHRvIHNhdGlzZnkKKyAqIHN5bWJvbHMgcmVzb2x1dGlvbi4KKyAqIEljYWNoZS1yZWxhdGVkIGZ1bmN0aW9ucyBhcmUgdXNlZCBpbiBQT1NUIGZyYW1ld29yay4KKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfNDQwCisKKyAgICAgICAuZ2xvYmwgIGRjYWNoZV9kaXNhYmxlCisgICAgICAgLmdsb2JsICBkY2FjaGVfZW5hYmxlCisgICAgICAgLmdsb2JsICBpY2FjaGVfZGlzYWJsZQorICAgICAgIC5nbG9ibCAgaWNhY2hlX2VuYWJsZQorZGNhY2hlX2Rpc2FibGU6CitkY2FjaGVfZW5hYmxlOgoraWNhY2hlX2Rpc2FibGU6CitpY2FjaGVfZW5hYmxlOgorCWJscgorCisJLmdsb2JsCWRjYWNoZV9zdGF0dXMKKwkuZ2xvYmwJaWNhY2hlX3N0YXR1cworZGNhY2hlX3N0YXR1czoKK2ljYWNoZV9zdGF0dXM6CisJbXIJcjMsICAwCisJYmxyCisKKyNlbHNlIC8qIENPTkZJR180NDAgKi8KKworCS5nbG9ibAlpY2FjaGVfZW5hYmxlCitpY2FjaGVfZW5hYmxlOgorCW1mbHIJcjgKKwlibAlpbnZhbGlkYXRlX2ljYWNoZQorCW10bHIJcjgKKwlpc3luYworCWFkZGlzCXIzLHIwLCAweGMwMDAJICAgICAgLyogc2V0IGJpdCAwICovCisJbXRpY2NyCXIzCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX2Rpc2FibGUKK2ljYWNoZV9kaXNhYmxlOgorCWFkZGlzCXIzLHIwLCAweDAwMDAJICAgICAgLyogY2xlYXIgYml0IDAgKi8KKwltdGljY3IJcjMKKwlpc3luYworCWJscgorCisJLmdsb2JsCWljYWNoZV9zdGF0dXMKK2ljYWNoZV9zdGF0dXM6CisJbWZpY2NyCXIzCisJc3J3aQlyMywgcjMsIDMxCS8qID4+MzEgPT4gc2VsZWN0IGJpdCAwICovCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX2VuYWJsZQorZGNhY2hlX2VuYWJsZToKKwltZmxyCXI4CisJYmwJaW52YWxpZGF0ZV9kY2FjaGUKKwltdGxyCXI4CisJaXN5bmMKKwlhZGRpcwlyMyxyMCwgMHg4MDAwCSAgICAgIC8qIHNldCBiaXQgMCAqLworCW10ZGNjcglyMworCWJscgorCisJLmdsb2JsCWRjYWNoZV9kaXNhYmxlCitkY2FjaGVfZGlzYWJsZToKKwltZmxyCXI4CisJYmwJZmx1c2hfZGNhY2hlCisJbXRscglyOAorCWFkZGlzCXIzLHIwLCAweDAwMDAJICAgICAgLyogY2xlYXIgYml0IDAgKi8KKwltdGRjY3IJcjMKKwlibHIKKworCS5nbG9ibAlkY2FjaGVfc3RhdHVzCitkY2FjaGVfc3RhdHVzOgorCW1mZGNjcglyMworCXNyd2kJcjMsIHIzLCAzMQkvKiA+PjMxID0+IHNlbGVjdCBiaXQgMCAqLworCWJscgorCisjZW5kaWYgLyogQ09ORklHXzQ0MCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvY21kX2NoaXBfY29uZmlnLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9jbWRfY2hpcF9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU3MjExCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvY21kX2NoaXBfY29uZmlnLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDgtMjAwOQorICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOQorICogRGlyayBFaWJhY2gsICBHdW50ZXJtYW5uICYgRHJ1bmNrIEdtYkgsIGVpYmFjaEBnZHN5cy5kZQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGkyYy5oPgorI2luY2x1ZGUgPGFzbS9wcGM0eHhfY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyB2b2lkIHByaW50X2NvbmZpZ3MoaW50IGN1cl9jb25maWdfbnIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHBjNHh4X2NvbmZpZ19jb3VudDsgaSsrKSB7CisJCXByaW50ZigiJS0xNnMgLSAlcyIsIHBwYzR4eF9jb25maWdfdmFsW2ldLmxhYmVsLAorCQkgICAgICAgcHBjNHh4X2NvbmZpZ192YWxbaV0uZGVzY3JpcHRpb24pOworCQlpZiAoaSA9PSBjdXJfY29uZmlnX25yKQorCQkJcHJpbnRmKCIgKioqIik7CisJCXByaW50ZigiXG4iKTsKKwl9CisKK30KKworc3RhdGljIGludCBkb19jaGlwX2NvbmZpZyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCWludCBjdXJfY29uZmlnX25yID0gLTE7CisJdTggY3VyX2NvbmZpZ1tDT05GSUdfNHh4X0NPTkZJR19CTE9DS1NJWkVdOworCisJLyoKKwkgKiBGaXJzdCBzd2l0Y2ggdG8gY29ycmVjdCBJMkMgYnVzLiBUaGlzIGlzIEkyQyBidXMgMAorCSAqIGZvciBhbGwgY3VycmVudGx5IGF2YWlsYWJsZSA0eHggZGVyaXZhdHMuCisJICovCisJSTJDX1NFVF9CVVMoMCk7CisKKyNpZmRlZiBDT05GSUdfQ01EX0VFUFJPTQorCXJldCA9IGVlcHJvbV9yZWFkKENPTkZJR180eHhfQ09ORklHX0kyQ19FRVBST01fQUREUiwKKwkJCSAgQ09ORklHXzR4eF9DT05GSUdfSTJDX0VFUFJPTV9PRkZTRVQsCisJCQkgIGN1cl9jb25maWcsIENPTkZJR180eHhfQ09ORklHX0JMT0NLU0laRSk7CisjZWxzZQorCXJldCA9IGkyY19yZWFkKENPTkZJR180eHhfQ09ORklHX0kyQ19FRVBST01fQUREUiwKKwkJICAgICAgIENPTkZJR180eHhfQ09ORklHX0kyQ19FRVBST01fT0ZGU0VULAorCQkgICAgICAgMSwgY3VyX2NvbmZpZywgQ09ORklHXzR4eF9DT05GSUdfQkxPQ0tTSVpFKTsKKyNlbmRpZgorCWlmIChyZXQpIHsKKwkJcHJpbnRmKCJFcnJvciByZWFkaW5nIEVFUFJPTSBhdCBhZGRyIDB4JXhcbiIsCisJCSAgICAgICBDT05GSUdfNHh4X0NPTkZJR19JMkNfRUVQUk9NX0FERFIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBTZWFyY2ggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwcGM0eHhfY29uZmlnX2NvdW50OyBpKyspIHsKKwkJaWYgKG1lbWNtcChjdXJfY29uZmlnLCBwcGM0eHhfY29uZmlnX3ZhbFtpXS52YWwsCisJCQkgICBDT05GSUdfNHh4X0NPTkZJR19CTE9DS1NJWkUpID09IDApCisJCQljdXJfY29uZmlnX25yID0gaTsKKwl9CisKKwlpZiAoY3VyX2NvbmZpZ19uciA9PSAtMSkgeworCQlwcmludGYoIldhcm5pbmc6IFRoZSBJMkMgYm9vdHN0cmFwIHZhbHVlcyBkb24ndCBtYXRjaCBhbnkiCisJCSAgICAgICAiIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucyFcbiIpOworCQlwcmludGYoIkkyQyBib290c3RyYXAgRUVQUk9NIHZhbHVlcyBhcmUgKEkyQyBhZGRyZXNzIDB4JTAyeCk6XG4iLAorCQkJQ09ORklHXzR4eF9DT05GSUdfSTJDX0VFUFJPTV9BRERSKTsKKwkJZm9yIChpID0gMDsgaSA8IENPTkZJR180eHhfQ09ORklHX0JMT0NLU0laRTsgaSsrKSB7CisJCQlwcmludGYoIiUwMnggIiwgY3VyX2NvbmZpZ1tpXSk7CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCX0KKworCWlmIChhcmdjIDwgMikgeworCQlwcmludGYoIkF2YWlsYWJsZSBjb25maWd1cmF0aW9ucyAoSTJDIGFkZHJlc3MgMHglMDJ4KTpcbiIsCisJCSAgICAgICBDT05GSUdfNHh4X0NPTkZJR19JMkNfRUVQUk9NX0FERFIpOworCQlwcmludF9jb25maWdzKGN1cl9jb25maWdfbnIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcHBjNHh4X2NvbmZpZ19jb3VudDsgaSsrKSB7CisJCS8qCisJCSAqIFNlYXJjaCBmb3IgY29uZmlndXJhdGlvbiBuYW1lL2xhYmVsCisJCSAqLworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sIHBwYzR4eF9jb25maWdfdmFsW2ldLmxhYmVsKSA9PSAwKSB7CisJCQlwcmludGYoIlVzaW5nIGNvbmZpZ3VyYXRpb246XG4lLTE2cyAtICVzXG4iLAorCQkJICAgICAgIHBwYzR4eF9jb25maWdfdmFsW2ldLmxhYmVsLAorCQkJICAgICAgIHBwYzR4eF9jb25maWdfdmFsW2ldLmRlc2NyaXB0aW9uKTsKKworI2lmZGVmIENPTkZJR19DTURfRUVQUk9NCisJCQlyZXQgPSBlZXByb21fd3JpdGUoQ09ORklHXzR4eF9DT05GSUdfSTJDX0VFUFJPTV9BRERSLAorCQkJCQkgICBDT05GSUdfNHh4X0NPTkZJR19JMkNfRUVQUk9NX09GRlNFVCwKKwkJCQkJICAgcHBjNHh4X2NvbmZpZ192YWxbaV0udmFsLAorCQkJCQkgICBDT05GSUdfNHh4X0NPTkZJR19CTE9DS1NJWkUpOworI2Vsc2UKKwkJCXJldCA9IGkyY193cml0ZShDT05GSUdfNHh4X0NPTkZJR19JMkNfRUVQUk9NX0FERFIsCisJCQkJCUNPTkZJR180eHhfQ09ORklHX0kyQ19FRVBST01fT0ZGU0VULAorCQkJCQkxLCBwcGM0eHhfY29uZmlnX3ZhbFtpXS52YWwsCisJCQkJCUNPTkZJR180eHhfQ09ORklHX0JMT0NLU0laRSk7CisjZW5kaWYKKwkJCXVkZWxheShDT05GSUdfU1lTX0VFUFJPTV9QQUdFX1dSSVRFX0RFTEFZX01TICogMTAwMCk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRmKCJFcnJvciB1cGRhdGluZyBFRVBST00gYXQgYWRkciAweCV4XG4iLAorCQkJCSAgICAgICBDT05GSUdfNHh4X0NPTkZJR19JMkNfRUVQUk9NX0FERFIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJcHJpbnRmKCJkb25lIChkdW1wIHZpYSAnaTJjIG1kICV4IDAuMSAleCcpXG4iLAorCQkJICAgICAgIENPTkZJR180eHhfQ09ORklHX0kyQ19FRVBST01fQUREUiwKKwkJCSAgICAgICBDT05GSUdfNHh4X0NPTkZJR19CTE9DS1NJWkUpOworCQkJcHJpbnRmKCJSZXNldCB0aGUgYm9hcmQgZm9yIHRoZSBjaGFuZ2VzIHRvIgorCQkJICAgICAgICIgdGFrZSBlZmZlY3RcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlwcmludGYoIkNvbmZpZ3VyYXRpb24gJXMgbm90IGZvdW5kIVxuIiwgYXJndlsxXSk7CisJcHJpbnRfY29uZmlncyhjdXJfY29uZmlnX25yKTsKKwlyZXR1cm4gLTE7Cit9CisKK1VfQk9PVF9DTUQoCisJY2hpcF9jb25maWcsCTIsCTAsCWRvX2NoaXBfY29uZmlnLAorCSJwcm9ncmFtIHRoZSBJMkMgYm9vdHN0cmFwIEVFUFJPTSIsCisJIltjb25maWctbGFiZWxdIgorKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L2NvbW1wcm9jLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9jb21tcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNjk2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9jb21tcHJvYy5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKgorICogQXRhcHRlZCBmb3IgcHBjNFhYIGJ5IERlbmlzIFBldGVyCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19QT1NUKSB8fCBkZWZpbmVkKENPTkZJR19MT0dCVUZGRVIpCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfUE9TVF9XT1JEX0FERFIpCisjIGRlZmluZSBfUE9TVF9BRERSCSgoQ09ORklHX1NZU19PQ01fREFUQV9BRERSKSArIChDT05GSUdfU1lTX1BPU1RfV09SRF9BRERSKSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19QT1NUX0FMVF9XT1JEX0FERFIpCisjIGRlZmluZSBfUE9TVF9BRERSCShDT05GSUdfU1lTX1BPU1RfQUxUX1dPUkRfQUREUikKKyNlbmRpZgorCit2b2lkIHBvc3Rfd29yZF9zdG9yZSAodWxvbmcgYSkKK3sKKwl2b2xhdGlsZSB2b2lkICpzYXZlX2FkZHIgPSAodm9sYXRpbGUgdm9pZCAqKShfUE9TVF9BRERSKTsKKworCW91dF9iZTMyKHNhdmVfYWRkciwgYSk7Cit9CisKK3Vsb25nIHBvc3Rfd29yZF9sb2FkICh2b2lkKQoreworCXZvbGF0aWxlIHZvaWQgKnNhdmVfYWRkciA9ICh2b2xhdGlsZSB2b2lkICopKF9QT1NUX0FERFIpOworCisJcmV0dXJuIGluX2JlMzIoc2F2ZV9hZGRyKTsKK30KKworI2VuZGlmCS8qIENPTkZJR19QT1NUIHx8IENPTkZJR19MT0dCVUZGRVIqLworCisjaWZkZWYgQ09ORklHX0JPT1RDT1VOVF9MSU1JVAorCit2b2lkIGJvb3Rjb3VudF9zdG9yZSAodWxvbmcgYSkKK3sKKwl2b2xhdGlsZSB1bG9uZyAqc2F2ZV9hZGRyID0KKwkJKHZvbGF0aWxlIHVsb25nICopKENPTkZJR19TWVNfT0NNX0RBVEFfQUREUiArIENPTkZJR19TWVNfQk9PVENPVU5UX0FERFIpOworCisJc2F2ZV9hZGRyWzBdID0gYTsKKwlzYXZlX2FkZHJbMV0gPSBCT09UQ09VTlRfTUFHSUM7Cit9CisKK3Vsb25nIGJvb3Rjb3VudF9sb2FkICh2b2lkKQoreworCXZvbGF0aWxlIHVsb25nICpzYXZlX2FkZHIgPQorCQkodm9sYXRpbGUgdWxvbmcgKikoQ09ORklHX1NZU19PQ01fREFUQV9BRERSICsgQ09ORklHX1NZU19CT09UQ09VTlRfQUREUik7CisKKwlpZiAoc2F2ZV9hZGRyWzFdICE9IEJPT1RDT1VOVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gc2F2ZV9hZGRyWzBdOworfQorCisjZW5kaWYgLyogQ09ORklHX0JPT1RDT1VOVF9MSU1JVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvY29uZmlnLm1rIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZGE3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9jb25maWcubWsKQEAgLTAsMCArMSwzNyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLW1lYWJpCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR180eHggLWZmaXhlZC1yMiAtbXN0cmluZyAtbXNvZnQtZmxvYXQKKworY2ZnPSQoc2hlbGwgZ3JlcCBjb25maWdzICQoT0JKVFJFRSkvaW5jbHVkZS9jb25maWcuaCB8IHNlZCAncy8uKjxcKGNvbmZpZ3MuKlwpPi9cMS8nKQoraXM0NDA6PSQoc2hlbGwgZ3JlcCBDT05GSUdfNDQwICQoVE9QRElSKS9pbmNsdWRlLyQoY2ZnKSkKKworaWZuZXEgKCwkKGZpbmRzdHJpbmcgQ09ORklHXzQ0MCwkKGlzNDQwKSkpCitQTEFURk9STV9DUFBGTEFHUyArPSAtV2EsLW00NDAgLW1jcHU9NDQwCitlbHNlCitQTEFURk9STV9DUFBGTEFHUyArPSAtV2EsLW00MDUgLW1jcHU9NDA1CitlbmRpZgorCisjIFVzZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQuICBCb2FyZCBwb3J0IGNhbiBvdmVycmlkZSBpbiBib2FyZC8qL2NvbmZpZy5taworTERTQ1JJUFQgOj0gJChTUkNUUkVFKS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC91LWJvb3QubGRzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTAyM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9jcHUuYwpAQCAtMCwwICsxLDc1NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBDUFUgc3BlY2lmaWMgY29kZQorICoKKyAqIHdyaXR0ZW4gb3IgY29sbGVjdGVkIGFuZCBzb21ldGltZXMgcmV3cml0dGVuIGJ5CisgKiBNYWdudXMgRGFtbSA8ZGFtbUBiaXRzbWFydC5jb20+CisgKgorICogbWlub3IgbW9kaWZpY2F0aW9ucyBieQorICogV29sZmdhbmcgRGVuayA8d2RAZGVueC5kZT4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8d2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8bmV0ZGV2Lmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCit2b2lkIGJvYXJkX3Jlc2V0KHZvaWQpOworCisvKgorICogVG8gcHJvdmlkZSBhbiBpbnRlcmZhY2UgdG8gZGV0ZWN0IENQVSBudW1iZXIgZm9yIGJvYXJkcyB0aGF0IHN1cHBvcnQKKyAqIG1vcmUgdGhlbiBvbmUgQ1BVLCB3ZSBpbXBsZW1lbnQgdGhlICJ3ZWFrIiBkZWZhdWx0IGZ1bmN0aW9ucyBoZXJlLgorICoKKyAqIFJldHVybnMgQ1BVIG51bWJlcgorICovCitpbnQgX19nZXRfY3B1X251bSh2b2lkKQoreworCXJldHVybiBOQV9PUl9VTktOT1dOX0NQVTsKK30KK2ludCBnZXRfY3B1X251bSh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19nZXRfY3B1X251bSIpKSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCisjaWYgZGVmaW5lZChDT05GSUdfNDA1R1ApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBFUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1IpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSWCkKKworI2RlZmluZSBQQ0lfQVNZTkMKKworc3RhdGljIGludCBwY2lfYXN5bmNfZW5hYmxlZCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKQorCXJldHVybiAobWZkY3IoQ1BDMF9QU1IpICYgUFNSX1BDSV9BU1lOQ19FTik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKQorCXVuc2lnbmVkIGxvbmcgdmFsOworCisJbWZzZHIoU0RSMF9TRFNUUDEsIHZhbCk7CisJcmV0dXJuICh2YWwgJiBTRFIwX1NEU1RQMV9QQU1FX01BU0spOworI2VuZGlmCit9CisjZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmICFkZWZpbmVkKENPTkZJR19JT1A0ODApICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfNDA1KSAmJiAhZGVmaW5lZChDT05GSUdfNDA1RVgpCitpbnQgcGNpX2FyYml0ZXJfZW5hYmxlZCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKQorCXJldHVybiAobWZkY3IoQ1BDMF9QU1IpICYgUFNSX1BDSV9BUkJJVF9FTik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQwNUVQKQorCXJldHVybiAobWZkY3IoQ1BDMF9QQ0kpICYgQ1BDMF9QQ0lfQVJCSVRfRU4pOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDBHUCkKKwlyZXR1cm4gKG1mZGNyKENQQzBfU1RSUDEpICYgQ1BDMF9TVFJQMV9QQUVfTUFTSyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKQorCXVuc2lnbmVkIGxvbmcgdmFsOworCisJbWZzZHIoU0RSMF9YQ1IsIHZhbCk7CisJcmV0dXJuICh2YWwgJiAweDgwMDAwMDAwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKQorCXVuc2lnbmVkIGxvbmcgdmFsOworCisJbWZzZHIoU0RSMF9QQ0kwLCB2YWwpOworCXJldHVybiAodmFsICYgMHg4MDAwMDAwMCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfNDA1RVApCisjZGVmaW5lIEkyQ19CT09UUk9NCisKK3N0YXRpYyBpbnQgaTJjX2Jvb3Ryb21fZW5hYmxlZCh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHXzQwNUVQKQorCXJldHVybiAobWZkY3IoQ1BDMF9CT09UKSAmIENQQzBfQk9PVF9TRVApOworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCW1mc2RyKFNEUjBfU0RDUzAsIHZhbCk7CisJcmV0dXJuICh2YWwgJiBTRFIwX1NEQ1NfU0REKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDBHWCkKKyNkZWZpbmUgU0RSMF9QSU5TVFBfU0hJRlQJMjkKK3N0YXRpYyBjaGFyICpib290c3RyYXBfc3RyW10gPSB7CisJIkVCQyAoMTYgYml0cykiLAorCSJFQkMgKDggYml0cykiLAorCSJFQkMgKDMyIGJpdHMpIiwKKwkiRUJDICg4IGJpdHMpIiwKKwkiUENJIiwKKwkiSTJDIChBZGRyIDB4NTQpIiwKKwkiUmVzZXJ2ZWQiLAorCSJJMkMgKEFkZHIgMHg1MCkiLAorfTsKK3N0YXRpYyBjaGFyIGJvb3RzdHJhcF9jaGFyW10gPSB7ICdBJywgJ0InLCAnQycsICdCJywgJ0QnLCAnRScsICd4JywgJ0YnIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MFNQKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUEUpCisjZGVmaW5lIFNEUjBfUElOU1RQX1NISUZUCTMwCitzdGF0aWMgY2hhciAqYm9vdHN0cmFwX3N0cltdID0geworCSJFQkMgKDggYml0cykiLAorCSJQQ0kiLAorCSJJMkMgKEFkZHIgMHg1NCkiLAorCSJJMkMgKEFkZHIgMHg1MCkiLAorfTsKK3N0YXRpYyBjaGFyIGJvb3RzdHJhcF9jaGFyW10gPSB7ICdBJywgJ0InLCAnQycsICdEJ307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikKKyNkZWZpbmUgU0RSMF9QSU5TVFBfU0hJRlQJMjkKK3N0YXRpYyBjaGFyICpib290c3RyYXBfc3RyW10gPSB7CisJIkVCQyAoOCBiaXRzKSIsCisJIlBDSSIsCisJIk5BTkQgKDggYml0cykiLAorCSJFQkMgKDE2IGJpdHMpIiwKKwkiRUJDICgxNiBiaXRzKSIsCisJIkkyQyAoQWRkciAweDU0KSIsCisJIlBDSSIsCisJIkkyQyAoQWRkciAweDUyKSIsCit9Oworc3RhdGljIGNoYXIgYm9vdHN0cmFwX2NoYXJbXSA9IHsgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdHJywgJ0YnLCAnSCcgfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpCisjZGVmaW5lIFNEUjBfUElOU1RQX1NISUZUCTI5CitzdGF0aWMgY2hhciAqYm9vdHN0cmFwX3N0cltdID0geworCSJFQkMgKDggYml0cykiLAorCSJFQkMgKDE2IGJpdHMpIiwKKwkiRUJDICgxNiBiaXRzKSIsCisJIk5BTkQgKDggYml0cykiLAorCSJQQ0kiLAorCSJJMkMgKEFkZHIgMHg1NCkiLAorCSJQQ0kiLAorCSJJMkMgKEFkZHIgMHg1MikiLAorfTsKK3N0YXRpYyBjaGFyIGJvb3RzdHJhcF9jaGFyW10gPSB7ICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRycsICdGJywgJ0gnIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ2MEVYKSB8fCBkZWZpbmVkKENPTkZJR180NjBHVCkKKyNkZWZpbmUgU0RSMF9QSU5TVFBfU0hJRlQJMjkKK3N0YXRpYyBjaGFyICpib290c3RyYXBfc3RyW10gPSB7CisJIkVCQyAoOCBiaXRzKSIsCisJIkVCQyAoMTYgYml0cykiLAorCSJQQ0kiLAorCSJQQ0kiLAorCSJFQkMgKDE2IGJpdHMpIiwKKwkiTkFORCAoOCBiaXRzKSIsCisJIkkyQyAoQWRkciAweDU0KSIsCS8qIEE4ICovCisJIkkyQyAoQWRkciAweDUyKSIsCS8qIEE0ICovCit9Oworc3RhdGljIGNoYXIgYm9vdHN0cmFwX2NoYXJbXSA9IHsgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcgfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfNDYwU1gpCisjZGVmaW5lIFNEUjBfUElOU1RQX1NISUZUCTI5CitzdGF0aWMgY2hhciAqYm9vdHN0cmFwX3N0cltdID0geworCSJFQkMgKDggYml0cykiLAorCSJFQkMgKDE2IGJpdHMpIiwKKwkiRUJDICgzMiBiaXRzKSIsCisJIk5BTkQgKDggYml0cykiLAorCSJJMkMgKEFkZHIgMHg1NCkiLCAgICAgIC8qIEE4ICovCisJIkkyQyAoQWRkciAweDUyKSIsICAgICAgLyogQTQgKi8KK307CitzdGF0aWMgY2hhciBib290c3RyYXBfY2hhcltdID0geyAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0cnIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQwNUVaKQorI2RlZmluZSBTRFIwX1BJTlNUUF9TSElGVAkyOAorc3RhdGljIGNoYXIgKmJvb3RzdHJhcF9zdHJbXSA9IHsKKwkiRUJDICg4IGJpdHMpIiwKKwkiU1BJIChmYXN0KSIsCisJIk5BTkQgKDUxMiBwYWdlLCA0IGFkZHIgY3ljbGUpIiwKKwkiSTJDIChBZGRyIDB4NTApIiwKKwkiRUJDICgzMiBiaXRzKSIsCisJIkkyQyAoQWRkciAweDUwKSIsCisJIk5BTkQgKDJLIHBhZ2UsIDUgYWRkciBjeWNsZSkiLAorCSJJMkMgKEFkZHIgMHg1MCkiLAorCSJFQkMgKDE2IGJpdHMpIiwKKwkiUmVzZXJ2ZWQiLAorCSJOQU5EICgySyBwYWdlLCA0IGFkZHIgY3ljbGUpIiwKKwkiSTJDIChBZGRyIDB4NTApIiwKKwkiTkFORCAoNTEyIHBhZ2UsIDMgYWRkciBjeWNsZSkiLAorCSJJMkMgKEFkZHIgMHg1MCkiLAorCSJTUEkgKHNsb3cpIiwKKwkiSTJDIChBZGRyIDB4NTApIiwKK307CitzdGF0aWMgY2hhciBib290c3RyYXBfY2hhcltdID0geyAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgXAorCQkJCSAnSScsICd4JywgJ0snLCAnTCcsICdNJywgJ04nLCAnTycsICdQJyB9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVFWCkKKyNkZWZpbmUgU0RSMF9QSU5TVFBfU0hJRlQJMjkKK3N0YXRpYyBjaGFyICpib290c3RyYXBfc3RyW10gPSB7CisJIkVCQyAoOCBiaXRzKSIsCisJIkVCQyAoMTYgYml0cykiLAorCSJFQkMgKDE2IGJpdHMpIiwKKwkiTkFORCAoOCBiaXRzKSIsCisJIk5BTkQgKDggYml0cykiLAorCSJJMkMgKEFkZHIgMHg1NCkiLAorCSJFQkMgKDggYml0cykiLAorCSJJMkMgKEFkZHIgMHg1MikiLAorfTsKK3N0YXRpYyBjaGFyIGJvb3RzdHJhcF9jaGFyW10gPSB7ICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRycsICdGJywgJ0gnIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoU0RSMF9QSU5TVFBfU0hJRlQpCitzdGF0aWMgaW50IGJvb3RzdHJhcF9vcHRpb24odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCW1mc2RyKFNEUjBfUElOU1RQLCB2YWwpOworCXJldHVybiAoKHZhbCAmIDB4ZjAwMDAwMDApID4+IFNEUjBfUElOU1RQX1NISUZUKTsKK30KKyNlbmRpZiAvKiBTRFIwX1BJTlNUUF9TSElGVCAqLworCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCitzdGF0aWMgaW50IGRvX2NoaXBfcmVzZXQgKHVuc2lnbmVkIGxvbmcgc3lzMCwgdW5zaWduZWQgbG9uZyBzeXMxKQoreworCS8qIENoYW5nZXMgdG8gQ1BDMF9TWVMwIGFuZCBDUEMwX1NZUzEgcmVxdWlyZSBjaGlwCisJICogcmVzZXQuCisJICovCisJbXRkY3IgKENQQzBfQ1IwLCBtZmRjciAoQ1BDMF9DUjApIHwgMHg4MDAwMDAwMCk7CS8qIFNldCBTV0UgKi8KKwltdGRjciAoQ1BDMF9TWVMwLCBzeXMwKTsKKwltdGRjciAoQ1BDMF9TWVMxLCBzeXMxKTsKKwltdGRjciAoQ1BDMF9DUjAsIG1mZGNyIChDUEMwX0NSMCkgJiB+MHg4MDAwMDAwMCk7CS8qIENsciBTV0UgKi8KKwltdHNwciAoU1BSTl9EQkNSMCwgMHgyMDAwMDAwMCk7CS8qIFJlc2V0IHRoZSBjaGlwICovCisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisKK2ludCBjaGVja2NwdSAodm9pZCkKK3sKKyNpZiAhZGVmaW5lZChDT05GSUdfNDA1KQkvKiBub3QgdXNlZCBvbiBYaWxpbnggNDA1IEZQR0EgaW1wbGVtZW50YXRpb25zICovCisJdWludCBwdnIgPSBnZXRfcHZyKCk7CisJdWxvbmcgY2xvY2sgPSBnZC0+Y3B1X2NsazsKKwljaGFyIGJ1ZlszMl07CisjaWYgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKQorCXUzMiByZWc7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19JT1A0ODApCisJY2hhciBhZGRzdHJbNjRdID0gIiI7CisJc3lzX2luZm9fdCBzeXNfaW5mbzsKKwlpbnQgY3B1X251bTsKKworCWNwdV9udW0gPSBnZXRfY3B1X251bSgpOworCWlmIChjcHVfbnVtID49IDApCisJCXByaW50ZigiQ1BVJWQ6ICAiLCBjcHVfbnVtKTsKKwllbHNlCisJCXB1dHMoIkNQVTogICAiKTsKKworCWdldF9zeXNfaW5mbygmc3lzX2luZm8pOworCisjaWYgZGVmaW5lZChDT05GSUdfWElMSU5YXzQ0MCkKKwlwdXRzKCJJQk0gUG93ZXJQQyA0Iik7CisjZWxzZQorCXB1dHMoIkFNQ0MgUG93ZXJQQyA0Iik7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBkZWZpbmVkKENPTkZJR180MDVDUikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQwNUVQKSB8fCBkZWZpbmVkKENPTkZJR180MDVFWikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQwNUVYKQorCXB1dHMoIjA1Iik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisjaWYgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKQorCXB1dHMoIjYwIik7CisjZWxzZQorCXB1dHMoIjQwIik7CisjZW5kaWYKKyNlbmRpZgorCisJc3dpdGNoIChwdnIpIHsKKwljYXNlIFBWUl80MDVHUF9SQjoKKwkJcHV0cygiR1AgUmV2LiBCIik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDA1R1BfUkM6CisJCXB1dHMoIkdQIFJldi4gQyIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQwNUdQX1JEOgorCQlwdXRzKCJHUCBSZXYuIEQiKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfNDA1R1AKKwljYXNlIFBWUl80MDVHUF9SRTogLyogNDA1R1AgcmV2IEUgYW5kIDQwNUNSIHJldiBDIGhhdmUgc2FtZSBQVlIgKi8KKwkJcHV0cygiR1AgUmV2LiBFIik7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIFBWUl80MDVDUl9SQToKKwkJcHV0cygiQ1IgUmV2LiBBIik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDA1Q1JfUkI6CisJCXB1dHMoIkNSIFJldi4gQiIpOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR180MDVDUgorCWNhc2UgUFZSXzQwNUNSX1JDOiAvKiA0MDVHUCByZXYgRSBhbmQgNDA1Q1IgcmV2IEMgaGF2ZSBzYW1lIFBWUiAqLworCQlwdXRzKCJDUiBSZXYuIEMiKTsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgUFZSXzQwNUdQUl9SQjoKKwkJcHV0cygiR1ByIFJldi4gQiIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQwNUVQX1JCOgorCQlwdXRzKCJFUCBSZXYuIEIiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80MDVFWl9SQToKKwkJcHV0cygiRVogUmV2LiBBIik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDA1RVgxX1JBOgorCQlwdXRzKCJFWCBSZXYuIEEiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIlNlY3VyaXR5IHN1cHBvcnQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80MDVFWFIyX1JBOgorCQlwdXRzKCJFWHIgUmV2LiBBIik7CisJCXN0cmNweShhZGRzdHIsICJObyBTZWN1cml0eSBzdXBwb3J0Iik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDA1RVgxX1JDOgorCQlwdXRzKCJFWCBSZXYuIEMiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIlNlY3VyaXR5IHN1cHBvcnQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80MDVFWDJfUkM6CisJCXB1dHMoIkVYIFJldi4gQyIpOworCQlzdHJjcHkoYWRkc3RyLCAiTm8gU2VjdXJpdHkgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQwNUVYUjFfUkM6CisJCXB1dHMoIkVYciBSZXYuIEMiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIlNlY3VyaXR5IHN1cHBvcnQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80MDVFWFIyX1JDOgorCQlwdXRzKCJFWHIgUmV2LiBDIik7CisJCXN0cmNweShhZGRzdHIsICJObyBTZWN1cml0eSBzdXBwb3J0Iik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDA1RVgxX1JEOgorCQlwdXRzKCJFWCBSZXYuIEQiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIlNlY3VyaXR5IHN1cHBvcnQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80MDVFWDJfUkQ6CisJCXB1dHMoIkVYIFJldi4gRCIpOworCQlzdHJjcHkoYWRkc3RyLCAiTm8gU2VjdXJpdHkgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQwNUVYUjFfUkQ6CisJCXB1dHMoIkVYciBSZXYuIEQiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIlNlY3VyaXR5IHN1cHBvcnQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80MDVFWFIyX1JEOgorCQlwdXRzKCJFWHIgUmV2LiBEIik7CisJCXN0cmNweShhZGRzdHIsICJObyBTZWN1cml0eSBzdXBwb3J0Iik7CisJCWJyZWFrOworCisjaWYgZGVmaW5lZChDT05GSUdfNDQwKQorCWNhc2UgUFZSXzQ0MEdQX1JCOgorCQlwdXRzKCJHUCBSZXYuIEIiKTsKKwkJLyogU2VlIGVycmF0YSAxLjEyOiBDSElQXzQgKi8KKwkJaWYgKChtZmRjcihDUEMwX1NZUzApICE9IG1mZGNyKENQQzBfU1RSUDApKSB8fAorCQkgICAgKG1mZGNyKENQQzBfU1lTMSkgIT0gbWZkY3IoQ1BDMF9TVFJQMSkpICl7CisJCQlwdXRzICggICJcblx0IENQQzBfU1lTeCBEQ1JzIGNvcnJ1cHRlZC4gIgorCQkJCSJSZXNldHRpbmcgY2hpcCAuLi5cbiIpOworCQkJdWRlbGF5KCAxMDAwICogMTAwMCApOyAvKiBHaXZlIHRpbWUgZm9yIHNlcmlhbCBidWYgdG8gY2xlYXIgKi8KKwkJCWRvX2NoaXBfcmVzZXQgKCBtZmRjcihDUEMwX1NUUlAwKSwKKwkJCQkJbWZkY3IoQ1BDMF9TVFJQMSkgKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUFZSXzQ0MEdQX1JDOgorCQlwdXRzKCJHUCBSZXYuIEMiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80NDBHWF9SQToKKwkJcHV0cygiR1ggUmV2LiBBIik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDQwR1hfUkI6CisJCXB1dHMoIkdYIFJldi4gQiIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQ0MEdYX1JDOgorCQlwdXRzKCJHWCBSZXYuIEMiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80NDBHWF9SRjoKKwkJcHV0cygiR1ggUmV2LiBGIik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDQwRVBfUkE6CisJCXB1dHMoIkVQIFJldi4gQSIpOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR180NDBFUAorCWNhc2UgUFZSXzQ0MEVQX1JCOiAvKiA0NDBFUCByZXYgQiBhbmQgNDQwR1IgcmV2IEEgaGF2ZSBzYW1lIFBWUiAqLworCQlwdXRzKCJFUCBSZXYuIEIiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80NDBFUF9SQzogLyogNDQwRVAgcmV2IEMgYW5kIDQ0MEdSIHJldiBCIGhhdmUgc2FtZSBQVlIgKi8KKwkJcHV0cygiRVAgUmV2LiBDIik7CisJCWJyZWFrOworI2VuZGlmIC8qICBDT05GSUdfNDQwRVAgKi8KKworI2lmZGVmIENPTkZJR180NDBHUgorCWNhc2UgUFZSXzQ0MEdSX1JBOiAvKiA0NDBFUCByZXYgQiBhbmQgNDQwR1IgcmV2IEEgaGF2ZSBzYW1lIFBWUiAqLworCQlwdXRzKCJHUiBSZXYuIEEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80NDBHUl9SQjogLyogNDQwRVAgcmV2IEMgYW5kIDQ0MEdSIHJldiBCIGhhdmUgc2FtZSBQVlIgKi8KKwkJcHV0cygiR1IgUmV2LiBCIik7CisJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR180NDBHUiAqLworI2VuZGlmIC8qIENPTkZJR180NDAgKi8KKworI2lmZGVmIENPTkZJR180NDBFUFgKKwljYXNlIFBWUl80NDBFUFgxX1JBOiAvKiA0NDBFUHggcmV2IEEgYW5kIDQ0MEdSeCByZXYgQSBoYXZlIHNhbWUgUFZSICovCisJCXB1dHMoIkVQeCBSZXYuIEEiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIlNlY3VyaXR5L0thc3VtaSBzdXBwb3J0Iik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDQwRVBYMl9SQTogLyogNDQwRVB4IHJldiBBIGFuZCA0NDBHUnggcmV2IEEgaGF2ZSBzYW1lIFBWUiAqLworCQlwdXRzKCJFUHggUmV2LiBBIik7CisJCXN0cmNweShhZGRzdHIsICJObyBTZWN1cml0eS9LYXN1bWkgc3VwcG9ydCIpOworCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfNDQwRVBYICovCisKKyNpZmRlZiBDT05GSUdfNDQwR1JYCisJY2FzZSBQVlJfNDQwR1JYMV9SQTogLyogNDQwRVB4IHJldiBBIGFuZCA0NDBHUnggcmV2IEEgaGF2ZSBzYW1lIFBWUiAqLworCQlwdXRzKCJHUnggUmV2LiBBIik7CisJCXN0cmNweShhZGRzdHIsICJTZWN1cml0eS9LYXN1bWkgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQ0MEdSWDJfUkE6IC8qIDQ0MEVQeCByZXYgQSBhbmQgNDQwR1J4IHJldiBBIGhhdmUgc2FtZSBQVlIgKi8KKwkJcHV0cygiR1J4IFJldi4gQSIpOworCQlzdHJjcHkoYWRkc3RyLCAiTm8gU2VjdXJpdHkvS2FzdW1pIHN1cHBvcnQiKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHXzQ0MEdSWCAqLworCisJY2FzZSBQVlJfNDQwU1BfNl9SQUI6CisJCXB1dHMoIlNQIFJldi4gQS9CIik7CisJCXN0cmNweShhZGRzdHIsICJSQUlEIDYgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQ0MFNQX1JBQjoKKwkJcHV0cygiU1AgUmV2LiBBL0IiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIk5vIFJBSUQgNiBzdXBwb3J0Iik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDQwU1BfNl9SQzoKKwkJcHV0cygiU1AgUmV2LiBDIik7CisJCXN0cmNweShhZGRzdHIsICJSQUlEIDYgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQ0MFNQX1JDOgorCQlwdXRzKCJTUCBSZXYuIEMiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIk5vIFJBSUQgNiBzdXBwb3J0Iik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDQwU1BlXzZfUkE6CisJCXB1dHMoIlNQZSBSZXYuIEEiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIlJBSUQgNiBzdXBwb3J0Iik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDQwU1BlX1JBOgorCQlwdXRzKCJTUGUgUmV2LiBBIik7CisJCXN0cmNweShhZGRzdHIsICJObyBSQUlEIDYgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQ0MFNQZV82X1JCOgorCQlwdXRzKCJTUGUgUmV2LiBCIik7CisJCXN0cmNweShhZGRzdHIsICJSQUlEIDYgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQ0MFNQZV9SQjoKKwkJcHV0cygiU1BlIFJldi4gQiIpOworCQlzdHJjcHkoYWRkc3RyLCAiTm8gUkFJRCA2IHN1cHBvcnQiKTsKKwkJYnJlYWs7CisKKyNpZiBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpCisJY2FzZSBQVlJfNDYwRVhfUkE6CisJCXB1dHMoIkVYIFJldi4gQSIpOworCQlzdHJjcHkoYWRkc3RyLCAiTm8gU2VjdXJpdHkvS2FzdW1pIHN1cHBvcnQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80NjBFWF9TRV9SQToKKwkJcHV0cygiRVggUmV2LiBBIik7CisJCXN0cmNweShhZGRzdHIsICJTZWN1cml0eS9LYXN1bWkgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQ2MEVYX1JCOgorCQlwdXRzKCJFWCBSZXYuIEIiKTsKKwkJbWZzZHIoU0RSMF9FQ0lEMywgcmVnKTsKKwkJaWYgKHJlZyAmIDB4MDAxMDAwMDApCisJCQlzdHJjcHkoYWRkc3RyLCAiTm8gU2VjdXJpdHkvS2FzdW1pIHN1cHBvcnQiKTsKKwkJZWxzZQorCQkJc3RyY3B5KGFkZHN0ciwgIlNlY3VyaXR5L0thc3VtaSBzdXBwb3J0Iik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDYwR1RfUkE6CisJCXB1dHMoIkdUIFJldi4gQSIpOworCQlzdHJjcHkoYWRkc3RyLCAiTm8gU2VjdXJpdHkvS2FzdW1pIHN1cHBvcnQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80NjBHVF9TRV9SQToKKwkJcHV0cygiR1QgUmV2LiBBIik7CisJCXN0cmNweShhZGRzdHIsICJTZWN1cml0eS9LYXN1bWkgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQ2MEdUX1JCOgorCQlwdXRzKCJHVCBSZXYuIEIiKTsKKwkJbWZzZHIoU0RSMF9FQ0lEMywgcmVnKTsKKwkJaWYgKHJlZyAmIDB4MDAxMDAwMDApCisJCQlzdHJjcHkoYWRkc3RyLCAiTm8gU2VjdXJpdHkvS2FzdW1pIHN1cHBvcnQiKTsKKwkJZWxzZQorCQkJc3RyY3B5KGFkZHN0ciwgIlNlY3VyaXR5L0thc3VtaSBzdXBwb3J0Iik7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIFBWUl80NjBTWF9SQToKKwkJcHV0cygiU1ggUmV2LiBBIik7CisJCXN0cmNweShhZGRzdHIsICJTZWN1cml0eSBzdXBwb3J0Iik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfNDYwU1hfUkFfVjE6CisJCXB1dHMoIlNYIFJldi4gQSIpOworCQlzdHJjcHkoYWRkc3RyLCAiTm8gU2VjdXJpdHkgc3VwcG9ydCIpOworCQlicmVhazsKKworCWNhc2UgUFZSXzQ2MEdYX1JBOgorCQlwdXRzKCJHWCBSZXYuIEEiKTsKKwkJc3RyY3B5KGFkZHN0ciwgIlNlY3VyaXR5IHN1cHBvcnQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBWUl80NjBHWF9SQV9WMToKKwkJcHV0cygiR1ggUmV2LiBBIik7CisJCXN0cmNweShhZGRzdHIsICJObyBTZWN1cml0eSBzdXBwb3J0Iik7CisJCWJyZWFrOworCisJY2FzZSBQVlJfVklSVEVYNToKKwkJcHV0cygieDUgVklSVEVYNSIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZiAoIiBVTktOT1dOIChQVlI9JTA4eCkiLCBwdnIpOworCQlicmVhazsKKwl9CisKKwlwcmludGYgKCIgYXQgJXMgTUh6IChQTEI9JWx1IE9QQj0lbHUgRUJDPSVsdSIsCisJCXN0cm1oeihidWYsIGNsb2NrKSwKKwkJc3lzX2luZm8uZnJlcVBMQiAvIDEwMDAwMDAsCisJCWdldF9PUEJfZnJlcSgpIC8gMTAwMDAwMCwKKwkJc3lzX2luZm8uZnJlcUVCQyAvIDEwMDAwMDApOworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgXAorCShkZWZpbmVkKENPTkZJR180NDBFUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBcCisJIGRlZmluZWQoQ09ORklHXzQ0MEdSKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUlgpKQorCXByaW50ZigiIFBDST0lbHUgTUh6Iiwgc3lzX2luZm8uZnJlcVBDSSAvIDEwMDAwMDApOworI2VuZGlmCisJcHJpbnRmKCIpXG4iKTsKKworCWlmIChhZGRzdHJbMF0gIT0gMCkKKwkJcHJpbnRmKCIgICAgICAgJXNcbiIsIGFkZHN0cik7CisKKyNpZiBkZWZpbmVkKEkyQ19CT09UUk9NKQorCXByaW50ZiAoIiAgICAgICBJMkMgYm9vdCBFRVBST00gJXNhYmxlZFxuIiwgaTJjX2Jvb3Ryb21fZW5hYmxlZCgpID8gImVuIiA6ICJkaXMiKTsKKyNlbmRpZgkvKiBJMkNfQk9PVFJPTSAqLworI2lmIGRlZmluZWQoU0RSMF9QSU5TVFBfU0hJRlQpCisJcHJpbnRmICgiICAgICAgIEJvb3RzdHJhcCBPcHRpb24gJWMgLSAiLCBib290c3RyYXBfY2hhcltib290c3RyYXBfb3B0aW9uKCldKTsKKwlwcmludGYgKCJCb290IFJPTSBMb2NhdGlvbiAlcyIsIGJvb3RzdHJhcF9zdHJbYm9vdHN0cmFwX29wdGlvbigpXSk7CisjaWZkZWYgQ09ORklHX05BTkRfVV9CT09UCisJcHV0cygiLCBib290aW5nIGZyb20gTkFORCIpOworI2VuZGlmIC8qIENPTkZJR19OQU5EX1VfQk9PVCAqLworCXB1dGMoJ1xuJyk7CisjZW5kaWYJLyogU0RSMF9QSU5TVFBfU0hJRlQgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkgJiYgIWRlZmluZWQoQ09ORklHXzQwNUVYKQorCXByaW50ZiAoIiAgICAgICBJbnRlcm5hbCBQQ0kgYXJiaXRlciAlc2FibGVkIiwgcGNpX2FyYml0ZXJfZW5hYmxlZCgpID8gImVuIiA6ICJkaXMiKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKFBDSV9BU1lOQykKKwlpZiAocGNpX2FzeW5jX2VuYWJsZWQoKSkgeworCQlwcmludGYgKCIsIFBDSSBhc3luYyBleHQgY2xvY2sgdXNlZCIpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIiwgUENJIHN5bmMgY2xvY2sgYXQgJWx1IE1IeiIsCisJCSAgICAgICBzeXNfaW5mby5mcmVxUExCIC8gc3lzX2luZm8ucGxsUGNpRGl2IC8gMTAwMDAwMCk7CisJfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmICFkZWZpbmVkKENPTkZJR180MDVFWCkKKwlwdXRjKCdcbicpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVFUCkgfHwgZGVmaW5lZChDT05GSUdfNDA1RVopIHx8IGRlZmluZWQoQ09ORklHXzQwNUVYKQorCXByaW50ZiAoIiAgICAgICAxNiBrQiBJLUNhY2hlIDE2IGtCIEQtQ2FjaGUiKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzQ0MCkKKwlwcmludGYgKCIgICAgICAgMzIga0IgSS1DYWNoZSAzMiBrQiBELUNhY2hlIik7CisjZWxzZQorCXByaW50ZiAoIiAgICAgICAxNiBrQiBJLUNhY2hlICVkIGtCIEQtQ2FjaGUiLAorCQkoKHB2ciB8IDB4MDAwMDAwMDEpID09IFBWUl80MDVHUFJfUkIpID8gMTYgOiA4KTsKKyNlbmRpZgorI2VuZGlmIC8qICFkZWZpbmVkKENPTkZJR19JT1A0ODApICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19JT1A0ODApCisJcHJpbnRmICgiUExYIElPUDQ4MCAoUFZSPSUwOHgpIiwgcHZyKTsKKwlwcmludGYgKCIgYXQgJXMgTUh6OiIsIHN0cm1oeihidWYsIGNsb2NrKSk7CisJcHJpbnRmICgiICV1IGtCIEktQ2FjaGUiLCA0KTsKKwlwcmludGYgKCIgJXUga0IgRC1DYWNoZSIsIDIpOworI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfNDA1KSAqLworCisJcHV0YyAoJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBwYzQ0MHNwZV9yZXZCKCkgeworCXVuc2lnbmVkIGludCBwdnI7CisKKwlwdnIgPSBnZXRfcHZyKCk7CisJaWYgKChwdnIgPT0gUFZSXzQ0MFNQZV82X1JCKSB8fCAocHZyID09IFBWUl80NDBTUGVfUkIpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBkb19yZXNldCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgZGVmaW5lZChDT05GSUdfQk9BUkRfUkVTRVQpCisJYm9hcmRfcmVzZXQoKTsKKyNlbHNlCisjaWYgZGVmaW5lZChDT05GSUdfU1lTXzR4eF9SRVNFVF9UWVBFKQorCW10c3ByKFNQUk5fREJDUjAsIENPTkZJR19TWVNfNHh4X1JFU0VUX1RZUEUgPDwgMjgpOworI2Vsc2UKKwkvKgorCSAqIEluaXRpYXRlIHN5c3RlbSByZXNldCBpbiBkZWJ1ZyBjb250cm9sIHJlZ2lzdGVyIERCQ1IKKwkgKi8KKwltdHNwcihTUFJOX0RCQ1IwLCAweDMwMDAwMDAwKTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfNHh4X1JFU0VUX1RZUEUpICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQk9BUkRfUkVTRVQpICovCisKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogR2V0IHRpbWViYXNlIGNsb2NrIGZyZXF1ZW5jeQorICovCit1bnNpZ25lZCBsb25nIGdldF90YmNsayAodm9pZCkKK3sKKyNpZiAhZGVmaW5lZChDT05GSUdfSU9QNDgwKQorCXN5c19pbmZvX3QgIHN5c19pbmZvOworCisJZ2V0X3N5c19pbmZvKCZzeXNfaW5mbyk7CisJcmV0dXJuIChzeXNfaW5mby5mcmVxUHJvY2Vzc29yKTsKKyNlbHNlCisJcmV0dXJuICg2NjAwMDAwMCk7CisjZW5kaWYKKworfQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKK3ZvaWQgd2F0Y2hkb2dfcmVzZXQodm9pZCkKK3sKKwlpbnQgcmVfZW5hYmxlID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CisJcmVzZXRfNHh4X3dhdGNoZG9nKCk7CisJaWYgKHJlX2VuYWJsZSkgZW5hYmxlX2ludGVycnVwdHMoKTsKK30KKwordm9pZCByZXNldF80eHhfd2F0Y2hkb2codm9pZCkKK3sKKwkvKgorCSAqIENsZWFyIFRTUihXSVMpIGJpdAorCSAqLworCW10c3ByKFNQUk5fVFNSLCAweDQwMDAwMDAwKTsKK30KKyNlbmRpZgkvKiBDT05GSUdfV0FUQ0hET0cgKi8KKworLyoKKyAqIEluaXRpYWxpemVzIG9uLWNoaXAgZXRoZXJuZXQgY29udHJvbGxlcnMuCisgKiB0byBvdmVycmlkZSwgaW1wbGVtZW50IGJvYXJkX2V0aF9pbml0KCkKKyAqLworaW50IGNwdV9ldGhfaW5pdChiZF90ICpiaXMpCit7CisjaWYgZGVmaW5lZChDT05GSUdfUFBDNHh4X0VNQUMpCisJcHBjXzR4eF9ldGhfaW5pdGlhbGl6ZShiaXMpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9jcHVfaW5pdC5jIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvY3B1X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTZlNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvY3B1X2luaXQuYwpAQCAtMCwwICsxLDQ1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorI2luY2x1ZGUgPHBwYzR4eF9lbmV0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVHUCkgIHx8IGRlZmluZWQoQ09ORklHXzQwNUVQKQorREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BMTF9SRUNPTkZJRworI2RlZmluZSBDT05GSUdfU1lTX1BMTF9SRUNPTkZJRwkwCisjZW5kaWYKKwordm9pZCByZWNvbmZpZ3VyZV9wbGwodTMyIG5ld19jcHVfZnJlcSkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR180NDBFUFgpCisJaW50CXJlc2V0X25lZWRlZCA9IDA7CisJdTMyCXJlZywgdGVtcDsKKwl1MzIJcHJiZHYwLCB0YXJnZXRfcHJiZHYwLAkJCQkvKiBDTEtfUFJJTUJEICovCisJCWZ3ZHZhLCB0YXJnZXRfZndkdmEsIGZ3ZHZiLCB0YXJnZXRfZndkdmIsCS8qIENMS19QTExEICovCisJCWZiZHYsIHRhcmdldF9mYmR2LCBsZmJkdiwgdGFyZ2V0X2xmYmR2LAorCQlwZXJkdjAsCXRhcmdldF9wZXJkdjAsCQkJCS8qIENMS19QRVJEICovCisJCXNwY2lkMCwJdGFyZ2V0X3NwY2lkMDsJCQkJLyogQ0xLX1NQQ0lEICovCisKKwkvKiBSZWNvbmZpZ3VyZSBjbG9ja3MgaWYgbmVjZXNzYXJ5LgorCSAqIFNlZSBQUEM0NDBFUHggVXNlcidzIE1hbnVhbCwgc2VjdGlvbnMgOC4yIGFuZCAxNCAqLworCWlmIChuZXdfY3B1X2ZyZXEgPT0gNjY3KSB7CisJCXRhcmdldF9wcmJkdjAgPSAyOworCQl0YXJnZXRfZndkdmEgPSAyOworCQl0YXJnZXRfZndkdmIgPSA0OworCQl0YXJnZXRfZmJkdiA9IDIwOworCQl0YXJnZXRfbGZiZHYgPSAxOworCQl0YXJnZXRfcGVyZHYwID0gNDsKKwkJdGFyZ2V0X3NwY2lkMCA9IDQ7CisKKwkJbWZjcHIoQ1BSMF9QUklNQkQwLCByZWcpOworCQl0ZW1wID0gKHJlZyAmIFBSQkRWX01BU0spID4+IDI0OworCQlwcmJkdjAgPSB0ZW1wID8gdGVtcCA6IDg7CisJCWlmIChwcmJkdjAgIT0gdGFyZ2V0X3ByYmR2MCkgeworCQkJcmVnICY9IH5QUkJEVl9NQVNLOworCQkJcmVnIHw9ICgodGFyZ2V0X3ByYmR2MCA9PSA4ID8gMCA6IHRhcmdldF9wcmJkdjApIDw8IDI0KTsKKwkJCW10Y3ByKENQUjBfUFJJTUJEMCwgcmVnKTsKKwkJCXJlc2V0X25lZWRlZCA9IDE7CisJCX0KKworCQltZmNwcihDUFIwX1BMTEQsIHJlZyk7CisKKwkJdGVtcCA9IChyZWcgJiBQTExEX0ZXRFZBX01BU0spID4+IDE2OworCQlmd2R2YSA9IHRlbXAgPyB0ZW1wIDogMTY7CisKKwkJdGVtcCA9IChyZWcgJiBQTExEX0ZXRFZCX01BU0spID4+IDg7CisJCWZ3ZHZiID0gdGVtcCA/IHRlbXAgOiA4OworCisJCXRlbXAgPSAocmVnICYgUExMRF9GQkRWX01BU0spID4+IDI0OworCQlmYmR2ID0gdGVtcCA/IHRlbXAgOiAzMjsKKworCQl0ZW1wID0gKHJlZyAmIFBMTERfTEZCRFZfTUFTSyk7CisJCWxmYmR2ID0gdGVtcCA/IHRlbXAgOiA2NDsKKworCQlpZiAoZndkdmEgIT0gdGFyZ2V0X2Z3ZHZhIHx8IGZiZHYgIT0gdGFyZ2V0X2ZiZHYgfHwgbGZiZHYgIT0gdGFyZ2V0X2xmYmR2KSB7CisJCQlyZWcgJj0gfihQTExEX0ZXRFZBX01BU0sgfCBQTExEX0ZXRFZCX01BU0sgfAorCQkJCSBQTExEX0ZCRFZfTUFTSyB8IFBMTERfTEZCRFZfTUFTSyk7CisJCQlyZWcgfD0gKCh0YXJnZXRfZndkdmEgPT0gMTYgPyAwIDogdGFyZ2V0X2Z3ZHZhKSA8PCAxNikgfAorCQkJCSgodGFyZ2V0X2Z3ZHZiID09IDggPyAwIDogdGFyZ2V0X2Z3ZHZiKSA8PCA4KSB8CisJCQkJKCh0YXJnZXRfZmJkdiA9PSAzMiA/IDAgOiB0YXJnZXRfZmJkdikgPDwgMjQpIHwKKwkJCQkodGFyZ2V0X2xmYmR2ID09IDY0ID8gMCA6IHRhcmdldF9sZmJkdik7CisJCQltdGNwcihDUFIwX1BMTEQsIHJlZyk7CisJCQlyZXNldF9uZWVkZWQgPSAxOworCQl9CisKKwkJbWZjcHIoQ1BSMF9QRVJELCByZWcpOworCQlwZXJkdjAgPSAocmVnICYgQ1BSMF9QRVJEX1BFUkRWMF9NQVNLKSA+PiAyNDsKKwkJaWYgKHBlcmR2MCAhPSB0YXJnZXRfcGVyZHYwKSB7CisJCQlyZWcgJj0gfkNQUjBfUEVSRF9QRVJEVjBfTUFTSzsKKwkJCXJlZyB8PSAodGFyZ2V0X3BlcmR2MCA8PCAyNCk7CisJCQltdGNwcihDUFIwX1BFUkQsIHJlZyk7CisJCQlyZXNldF9uZWVkZWQgPSAxOworCQl9CisKKwkJbWZjcHIoQ1BSMF9TUENJRCwgcmVnKTsKKwkJdGVtcCA9IChyZWcgJiBDUFIwX1NQQ0lEX1NQQ0lEVjBfTUFTSykgPj4gMjQ7CisJCXNwY2lkMCA9IHRlbXAgPyB0ZW1wIDogNDsKKwkJaWYgKHNwY2lkMCAhPSB0YXJnZXRfc3BjaWQwKSB7CisJCQlyZWcgJj0gfkNQUjBfU1BDSURfU1BDSURWMF9NQVNLOworCQkJcmVnIHw9ICgodGFyZ2V0X3NwY2lkMCA9PSA0ID8gMCA6IHRhcmdldF9zcGNpZDApIDw8IDI0KTsKKwkJCW10Y3ByKENQUjBfU1BDSUQsIHJlZyk7CisJCQlyZXNldF9uZWVkZWQgPSAxOworCQl9CisJfQorCisJLyogR2V0IGN1cnJlbnQgdmFsdWUgb2YgRldEVkEuKi8KKwltZmNwcihDUFIwX1BMTEQsIHJlZyk7CisJdGVtcCA9IChyZWcgJiBQTExEX0ZXRFZBX01BU0spID4+IDE2OworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgRldEVkEgaGFzIGJlZW4gc2V0IHRvIHZhbHVlIG9mIDEuIGlmIGl0IGhhcyB3ZSBtdXN0CisJICogbW9kaWZ5IGl0LgorCSAqLworCWlmICh0ZW1wID09IDEpIHsKKwkJbWZjcHIoQ1BSMF9QTExELCByZWcpOworCQkvKiBHZXQgY3VycmVudCB2YWx1ZSBvZiBmYmR2LiAgKi8KKwkJdGVtcCA9IChyZWcgJiBQTExEX0ZCRFZfTUFTSykgPj4gMjQ7CisJCWZiZHYgPSB0ZW1wID8gdGVtcCA6IDMyOworCQkvKiBHZXQgY3VycmVudCB2YWx1ZSBvZiBsZmJkdi4gKi8KKwkJdGVtcCA9IChyZWcgJiBQTExEX0xGQkRWX01BU0spOworCQlsZmJkdiA9IHRlbXAgPyB0ZW1wIDogNjQ7CisJCS8qCisJCSAqIExvYWQgcmVnaXN0ZXIgdGhhdCBjb250YWlucyBjdXJyZW50IGJvb3Qgc3RyYXBwaW5nIG9wdGlvbi4KKwkJICovCisJCW1mY3ByKENQUjBfSUNGRywgcmVnKTsKKwkJLyogU2hpZnQgc3RyYXBwaW5nIG9wdGlvbiBpbnRvIGxvdyAzIGJpdHMuKi8KKwkJcmVnID0gKHJlZyA+PiAyOCk7CisKKwkJaWYgKChyZWcgPT0gQk9PVF9TVFJBUF9PUFRJT05fQSkgfHwgKHJlZyA9PSBCT09UX1NUUkFQX09QVElPTl9CKSB8fAorCQkgICAgKHJlZyA9PSBCT09UX1NUUkFQX09QVElPTl9EKSB8fCAocmVnID09IEJPT1RfU1RSQVBfT1BUSU9OX0UpKSB7CisJCQkvKgorCQkJICogR2V0IGN1cnJlbnQgdmFsdWUgb2YgRldEVkEuIEFzc2lnbiBjdXJyZW50IEZXRFZBIHRvCisJCQkgKiBuZXcgRldEVkIuCisJCQkgKi8KKwkJCW1mY3ByKENQUjBfUExMRCwgcmVnKTsKKwkJCXRhcmdldF9md2R2YiA9IChyZWcgJiBQTExEX0ZXRFZBX01BU0spID4+IDE2OworCQkJZndkdmIgPSB0YXJnZXRfZndkdmIgPyB0YXJnZXRfZndkdmIgOiA4OworCQkJLyoKKwkJCSAqIEdldCBjdXJyZW50IHZhbHVlIG9mIEZXRFZCLiBBc3NpZ24gY3VycmVudCBGV0RWQiB0bworCQkJICogbmV3IEZXRFZBLgorCQkJICovCisJCQl0YXJnZXRfZndkdmEgPSAocmVnICYgUExMRF9GV0RWQl9NQVNLKSA+PiA4OworCQkJZndkdmEgPSB0YXJnZXRfZndkdmEgPyB0YXJnZXRfZndkdmEgOiAxNjsKKwkJCS8qCisJCQkgKiBVcGRhdGUgQ1BSMF9QTExEIHdpdGggc3dpdGNoZWQgRldEVkEgYW5kIEZXRFZCLgorCQkJICovCisJCQlyZWcgJj0gfihQTExEX0ZXRFZBX01BU0sgfCBQTExEX0ZXRFZCX01BU0sgfAorCQkJCVBMTERfRkJEVl9NQVNLIHwgUExMRF9MRkJEVl9NQVNLKTsKKwkJCXJlZyB8PSAoKGZ3ZHZhID09IDE2ID8gMCA6IGZ3ZHZhKSA8PCAxNikgfAorCQkJCSgoZndkdmIgPT0gOCA/IDAgOiBmd2R2YikgPDwgOCkgfAorCQkJCSgoZmJkdiA9PSAzMiA/IDAgOiBmYmR2KSA8PCAyNCkgfAorCQkJCShsZmJkdiA9PSA2NCA/IDAgOiBsZmJkdik7CisJCQltdGNwcihDUFIwX1BMTEQsIHJlZyk7CisJCQkvKiBBY2tub3dsZWRnZSB0aGF0IGEgcmVzZXQgaXMgcmVxdWlyZWQuICovCisJCQlyZXNldF9uZWVkZWQgPSAxOworCQl9CisJfQorCisJaWYgKHJlc2V0X25lZWRlZCkgeworCQkvKgorCQkgKiBTZXQgcmVsb2FkIGluaGliaXQgc28gY29uZmlndXJhdGlvbiB3aWxsIHBlcnNpc3QgYWNyb3NzCisJCSAqIHByb2Nlc3NvciByZXNldHMKKwkJICovCisJCW1mY3ByKENQUjBfSUNGRywgcmVnKTsKKwkJcmVnICY9IH5DUFIwX0lDRkdfUkxJX01BU0s7CisJCXJlZyB8PSAxIDw8IDMxOworCQltdGNwcihDUFIwX0lDRkcsIHJlZyk7CisKKwkJLyogUmVzZXQgcHJvY2Vzc29yIGlmIGNvbmZpZ3VyYXRpb24gY2hhbmdlZCAqLworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmM7IGlzeW5jIik7CisJCW10c3ByKFNQUk5fREJDUjAsIDB4MjAwMDAwMDApOworCX0KKyNlbmRpZgorfQorCisvKgorICogQnJlYXRoIHNvbWUgbGlmZSBpbnRvIHRoZSBDUFUuLi4KKyAqCisgKiBSZWNvbmZpZ3VyZSBQTEwgaWYgbmVjZXNzYXJ5LAorICogc2V0IHVwIHRoZSBtZW1vcnkgbWFwLAorICogaW5pdGlhbGl6ZSBhIGJ1bmNoIG9mIHJlZ2lzdGVycworICovCit2b2lkCitjcHVfaW5pdF9mICh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR180NDBHWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwRVgpCisJdTMyIHZhbDsKKyNlbmRpZgorCisJcmVjb25maWd1cmVfcGxsKENPTkZJR19TWVNfUExMX1JFQ09ORklHKTsKKworI2lmIChkZWZpbmVkKENPTkZJR180MDVFUCkgfHwgZGVmaW5lZCAoQ09ORklHXzQwNUVYKSkgJiYgIWRlZmluZWQoQ09ORklHX1NZU180eHhfR1BJT19UQUJMRSkKKwkvKgorCSAqIEdQSU8wIHNldHVwIChzZWxlY3QgR1BJTyBvciBhbHRlcm5hdGUgZnVuY3Rpb24pCisJICovCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0dQSU8wX09SKQorCW91dDMyKEdQSU8wX09SLCBDT05GSUdfU1lTX0dQSU8wX09SKTsJCS8qIHNldCBpbml0aWFsIHN0YXRlIG9mIG91dHB1dCBwaW5zCSovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfR1BJTzBfT0RSKQorCW91dDMyKEdQSU8wX09EUiwgQ09ORklHX1NZU19HUElPMF9PRFIpOwkvKiBvcGVuLWRyYWluIHNlbGVjdAkJCSovCisjZW5kaWYKKwlvdXQzMihHUElPMF9PU1JILCBDT05GSUdfU1lTX0dQSU8wX09TUkgpOwkvKiBvdXRwdXQgc2VsZWN0CQkJKi8KKwlvdXQzMihHUElPMF9PU1JMLCBDT05GSUdfU1lTX0dQSU8wX09TUkwpOworCW91dDMyKEdQSU8wX0lTUjFILCBDT05GSUdfU1lTX0dQSU8wX0lTUjFIKTsJLyogaW5wdXQgc2VsZWN0CQkJCSovCisJb3V0MzIoR1BJTzBfSVNSMUwsIENPTkZJR19TWVNfR1BJTzBfSVNSMUwpOworCW91dDMyKEdQSU8wX1RTUkgsIENPTkZJR19TWVNfR1BJTzBfVFNSSCk7CS8qIHRocmVlLXN0YXRlIHNlbGVjdAkJCSovCisJb3V0MzIoR1BJTzBfVFNSTCwgQ09ORklHX1NZU19HUElPMF9UU1JMKTsKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfR1BJTzBfSVNSMkgpCisJb3V0MzIoR1BJTzBfSVNSMkgsIENPTkZJR19TWVNfR1BJTzBfSVNSMkgpOworCW91dDMyKEdQSU8wX0lTUjJMLCBDT05GSUdfU1lTX0dQSU8wX0lTUjJMKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKENPTkZJR19TWVNfR1BJTzBfVENSKQorCW91dDMyKEdQSU8wX1RDUiwgQ09ORklHX1NZU19HUElPMF9UQ1IpOwkvKiBlbmFibGUgb3V0cHV0IGRyaXZlciBmb3Igb3V0cHV0cwkqLworI2VuZGlmCisjZW5kaWYgLyogQ09ORklHXzQwNUVQIC4uLiAmJiAhQ09ORklHX1NZU180eHhfR1BJT19UQUJMRSAqLworCisjaWYgZGVmaW5lZCAoQ09ORklHXzQwNUVQKQorCS8qCisJICogU2V0IEVNQUMgbm9pc2UgZmlsdGVyIGJpdHMKKwkgKi8KKwltdGRjcihDUEMwX0VQQ1RMLCBDUEMwX0VQUkNTUl9FME5GRSB8IENQQzBfRVBSQ1NSX0UxTkZFKTsKKyNlbmRpZiAvKiBDT05GSUdfNDA1RVAgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NZU180eHhfR1BJT19UQUJMRSkKKwlncGlvX3NldF9jaGlwX2NvbmZpZ3VyYXRpb24oKTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTXzR4eF9HUElPX1RBQkxFICovCisKKwkvKgorCSAqIEV4dGVybmFsIEJ1cyBDb250cm9sbGVyIChFQkMpIFNldHVwCisJICovCisjaWYgKGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEIwQVApICYmIGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEIwQ1IpKQorI2lmIChkZWZpbmVkKENPTkZJR180MDVHUCkgfHwgZGVmaW5lZChDT05GSUdfNDA1Q1IpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfNDA1RVApIHx8IGRlZmluZWQoQ09ORklHXzQwNUVaKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHXzQwNUVYKSB8fCBkZWZpbmVkKENPTkZJR180MDUpKQorCS8qCisJICogTW92ZSB0aGUgbmV4dCBpbnN0cnVjdGlvbnMgaW50byBpY2FjaGUsIHNpbmNlIHRoZXNlIG1vZGlmeSB0aGUgZmxhc2gKKwkgKiB3ZSBhcmUgcnVubmluZyBmcm9tIQorCSAqLworCWFzbSB2b2xhdGlsZSgiCWJsCTBmIgkJOjo6ICJsciIpOworCWFzbSB2b2xhdGlsZSgiMDoJbWZscgkzIgkJOjo6ICJyMyIpOworCWFzbSB2b2xhdGlsZSgiCWFkZGkJNCwgMCwgMTQiCTo6OiAicjQiKTsKKwlhc20gdm9sYXRpbGUoIgltdGN0cgk0IgkJOjo6ICJjdHIiKTsKKwlhc20gdm9sYXRpbGUoIjE6CWljYnQJMCwgMyIpOworCWFzbSB2b2xhdGlsZSgiCWFkZGkJMywgMywgMzIiCTo6OiAicjMiKTsKKwlhc20gdm9sYXRpbGUoIgliZG56CTFiIgkJOjo6ICJjdHIiLCAiY3IwIik7CisJYXNtIHZvbGF0aWxlKCIJYWRkaXMJMywgMCwgMHgwIgk6OjogInIzIik7CisJYXNtIHZvbGF0aWxlKCIJb3JpCTMsIDMsIDB4QTAwMCIJOjo6ICJyMyIpOworCWFzbSB2b2xhdGlsZSgiCW10Y3RyCTMiCQk6OjogImN0ciIpOworCWFzbSB2b2xhdGlsZSgiMjoJYmRuegkyYiIJCTo6OiAiY3RyIiwgImNyMCIpOworI2VuZGlmCisKKwltdGViYyhQQjBBUCwgQ09ORklHX1NZU19FQkNfUEIwQVApOworCW10ZWJjKFBCMENSLCBDT05GSUdfU1lTX0VCQ19QQjBDUik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCMUFQKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCMUNSKSAmJiAhKENPTkZJR19TWVNfSU5JVF9EQ0FDSEVfQ1MgPT0gMSkpCisJbXRlYmMoUEIxQVAsIENPTkZJR19TWVNfRUJDX1BCMUFQKTsKKwltdGViYyhQQjFDUiwgQ09ORklHX1NZU19FQkNfUEIxQ1IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjJBUCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjJDUikgJiYgIShDT05GSUdfU1lTX0lOSVRfRENBQ0hFX0NTID09IDIpKQorCW10ZWJjKFBCMkFQLCBDT05GSUdfU1lTX0VCQ19QQjJBUCk7CisJbXRlYmMoUEIyQ1IsIENPTkZJR19TWVNfRUJDX1BCMkNSKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEIzQVApICYmIGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEIzQ1IpICYmICEoQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUyA9PSAzKSkKKwltdGViYyhQQjNBUCwgQ09ORklHX1NZU19FQkNfUEIzQVApOworCW10ZWJjKFBCM0NSLCBDT05GSUdfU1lTX0VCQ19QQjNDUik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCNEFQKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCNENSKSAmJiAhKENPTkZJR19TWVNfSU5JVF9EQ0FDSEVfQ1MgPT0gNCkpCisJbXRlYmMoUEI0QVAsIENPTkZJR19TWVNfRUJDX1BCNEFQKTsKKwltdGViYyhQQjRDUiwgQ09ORklHX1NZU19FQkNfUEI0Q1IpOworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjVBUCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjVDUikgJiYgIShDT05GSUdfU1lTX0lOSVRfRENBQ0hFX0NTID09IDUpKQorCW10ZWJjKFBCNUFQLCBDT05GSUdfU1lTX0VCQ19QQjVBUCk7CisJbXRlYmMoUEI1Q1IsIENPTkZJR19TWVNfRUJDX1BCNUNSKTsKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEI2QVApICYmIGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEI2Q1IpICYmICEoQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUyA9PSA2KSkKKwltdGViYyhQQjZBUCwgQ09ORklHX1NZU19FQkNfUEI2QVApOworCW10ZWJjKFBCNkNSLCBDT05GSUdfU1lTX0VCQ19QQjZDUik7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCN0FQKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCN0NSKSAmJiAhKENPTkZJR19TWVNfSU5JVF9EQ0FDSEVfQ1MgPT0gNykpCisJbXRlYmMoUEI3QVAsIENPTkZJR19TWVNfRUJDX1BCN0FQKTsKKwltdGViYyhQQjdDUiwgQ09ORklHX1NZU19FQkNfUEI3Q1IpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChDT05GSUdfU1lTX0VCQ19DRkcpCisJbXRlYmMoRUJDMF9DRkcsIENPTkZJR19TWVNfRUJDX0NGRyk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCXZhbCA9IG1mc3ByKHRjcik7CisjaWYgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSKQorCXZhbCB8PSAweGI4MDAwMDAwOyAgICAgIC8qIGdlbmVyYXRlIHN5c3RlbSByZXNldCBhZnRlciAxLjM0IHNlY29uZHMgKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkKKwl2YWwgfD0gMHhiMDAwMDAwMDsgICAgICAvKiBnZW5lcmF0ZSBzeXN0ZW0gcmVzZXQgYWZ0ZXIgMS4zNCBzZWNvbmRzICovCisjZWxzZQorCXZhbCB8PSAweGYwMDAwMDAwOyAgICAgIC8qIGdlbmVyYXRlIHN5c3RlbSByZXNldCBhZnRlciAyLjY4NCBzZWNvbmRzICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfNHh4X1JFU0VUX1RZUEUpCisJdmFsICY9IH4weDMwMDAwMDAwOwkJCS8qIGNsZWFyIFdSQyBiaXRzICovCisJdmFsIHw9IENPTkZJR19TWVNfNHh4X1JFU0VUX1RZUEUgPDwgMjg7CS8qIHNldCBib2FyZCBzcGVjaWZpYyBXUkMgdHlwZSAqLworI2VuZGlmCisJbXRzcHIodGNyLCB2YWwpOworCisJdmFsID0gbWZzcHIodHNyKTsKKwl2YWwgfD0gMHg4MDAwMDAwMDsgICAgICAvKiBlbmFibGUgd2F0Y2hkb2cgdGltZXIgKi8KKwltdHNwcih0c3IsIHZhbCk7CisKKwlyZXNldF80eHhfd2F0Y2hkb2coKTsKKyNlbmRpZiAvKiBDT05GSUdfV0FUQ0hET0cgKi8KKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKQorCS8qIFRha2UgdGhlIEdYIG91dCBvZiBjb21wYXRpYmlsaXR5IG1vZGUKKwkgKiBUcmF2aXMgU2F3eWVyLCA5IE1hciAyMDA0CisJICogTk9URTogNDQwZ3ggdXNlciBtYW51YWwgaW5jb25zaXN0ZW5jeSBoZXJlCisJICogICAgICAgQ29tcGF0aWJpbGl0eSBtb2RlIGFuZCBFdGhlcm5ldCBDbG9jayBzZWxlY3QgYXJlIG5vdAorCSAqICAgICAgIGNvcnJlY3QgaW4gdGhlIG1hbnVhbAorCSAqLworCW1mc2RyKFNEUjBfTUZSLCB2YWwpOworCXZhbCAmPSB+MHgxMDAwMDAwMDsKKwltdHNkcihTRFIwX01GUix2YWwpOworI2VuZGlmIC8qIENPTkZJR180NDBHWCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfNDYwRVgpCisJLyoKKwkgKiBTZXQgU0RSMF9BSEJfQ0ZHW0EyUF9JTkNSNF0gKGJpdCAyNCkgYW5kCisJICogY2xlYXIgU0RSMF9BSEJfQ0ZHW0EyUF9QUk9UMl0gKGJpdCAyNSkgZm9yIGEgbmV3IDQ2MEVYIGVycmF0YQorCSAqIHJlZ2FyZGluZyBjb25jdXJyZW50IHVzZSBvZiBBSEIgVVNCIE9URywgVVNCIDIuMCBob3N0IGFuZCBTQVRBCisJICovCisJbWZzZHIoU0RSMF9BSEJfQ0ZHLCB2YWwpOworCXZhbCB8PSAweDgwOworCXZhbCAmPSB+MHg0MDsKKwltdHNkcihTRFIwX0FIQl9DRkcsIHZhbCk7CisJbWZzZHIoU0RSMF9VU0IySE9TVF9DRkcsIHZhbCk7CisJdmFsICY9IH4weGYwMDsKKwl2YWwgfD0gMHg0MDA7CisJbXRzZHIoU0RSMF9VU0IySE9TVF9DRkcsIHZhbCk7CisjZW5kaWYgLyogQ09ORklHXzQ2MEVYICovCisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVFWCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MFNQKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpICB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDYwU1gpCisJLyoKKwkgKiBTZXQgUExCNCBhcmJpdGVyIChTZWdtZW50IDAgYW5kIDEpIHRvIDQgZGVlcCBwaXBlbGluZSByZWFkCisJICovCisJbXRkY3IoUExCMF9BQ1IsIChtZmRjcihQTEIwX0FDUikgJiB+UExCMF9BQ1JfUkRQX01BU0spIHwKKwkgICAgICBQTEIwX0FDUl9SRFBfNERFRVApOworCW10ZGNyKFBMQjFfQUNSLCAobWZkY3IoUExCMV9BQ1IpICYgflBMQjFfQUNSX1JEUF9NQVNLKSB8CisJICAgICAgUExCMV9BQ1JfUkRQXzRERUVQKTsKKyNlbmRpZiAvKiBDT05GSUdfNDQwU1AvU1BFIHx8IENPTkZJR180NjBFWC9HVCB8fCBDT05GSUdfNDA1RVggKi8KK30KKworLyoKKyAqIGluaXRpYWxpemUgaGlnaGVyIGxldmVsIHBhcnRzIG9mIENQVSBsaWtlIHRpbWUgYmFzZSBhbmQgdGltZXJzCisgKi8KK2ludCBjcHVfaW5pdF9yICh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKQorCXVpbnQgcHZyID0gZ2V0X3B2cigpOworCisJLyoKKwkgKiBTZXQgZWRnZSBjb25kaXRpb25pbmcgY2lyY3VpdHJ5IG9uIFBQQzQwNUdQcgorCSAqIGZvciBjb21wYXRpYmlsaXR5IHRvIGV4aXN0aW5nIFBQQzQwNUdQIGRlc2lnbnMuCisJICovCisJaWYgKChwdnIgJiAweGZmZmZmZmYwKSA9PSAoUFZSXzQwNUdQUl9SQiAmIDB4ZmZmZmZmZjApKSB7CisJCW10ZGNyKENQQzBfRUNSLCAweDYwNjA2MDAwKTsKKwl9CisjZW5kaWYgIC8qIGRlZmluZWQoQ09ORklHXzQwNUdQKSAqLworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIFwKKwkoZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgXAorCSBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSkKKy8qCisgKiA0NDBFUCh4KS9HUih4KSBQQ0kgYXN5bmMvc3luYyBjbG9ja2luZyByZXN0cmljdGlvbjoKKyAqCisgKiBJbiBhc3luY2hyb25vdXMgUENJIG1vZGUsIHRoZSBzeW5jaHJvbm91cyBQQ0kgY2xvY2sgbXVzdCBtZWV0CisgKiBjZXJ0YWluIHJlcXVpcmVtZW50cy4gVGhlIGZvbGxvd2luZyBlcXVhdGlvbiBkZXNjcmliZXMgdGhlCisgKiByZWxhdGlvbnNoaXAgdGhhdCBtdXN0IGJlIG1haW50YWluZWQgYmV0d2VlbiB0aGUgYXN5bmNocm9ub3VzIFBDSQorICogY2xvY2sgYW5kIHN5bmNocm9ub3VzIFBDSSBjbG9jay4gU2VsZWN0IGFuIGFwcHJvcHJpYXRlIFBDSTpQTEIKKyAqIHJhdGlvIHRvIG1haW50YWluIHRoZSByZWxhdGlvbnNoaXA6CisgKgorICogQXN5bmNQQ0lDbGsgLSAxTUh6IDw9IFN5bmNQQ0ljbG9jayA8PSAoMiAqIEFzeW5jUENJQ2xrKSAtIDFNSHoKKyAqLworc3RhdGljIGludCBwcGM0eHhfcGNpX3N5bmNfY2xvY2tfb2sodTMyIHN5bmMsIHUzMiBhc3luYykKK3sKKwlpZiAoKChhc3luYyAtIDEwMDAwMDApID4gc3luYykgfHwgKHN5bmMgPiAoKDIgKiBhc3luYykgLSAxMDAwMDAwKSkpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK2ludCBwcGM0eHhfcGNpX3N5bmNfY2xvY2tfY29uZmlnKHUzMiBhc3luYykKK3sKKwlzeXNfaW5mb190IHN5c19pbmZvOworCXUzMiBzeW5jOworCWludCBkaXY7CisJdTMyIHJlZzsKKwl1MzIgc3BjaWRfdmFsW10gPSB7CisJCUNQUjBfU1BDSURfU1BDSURWMF9ESVYxLCBDUFIwX1NQQ0lEX1NQQ0lEVjBfRElWMiwKKwkJQ1BSMF9TUENJRF9TUENJRFYwX0RJVjMsIENQUjBfU1BDSURfU1BDSURWMF9ESVY0IH07CisKKwlnZXRfc3lzX2luZm8oJnN5c19pbmZvKTsKKwlzeW5jID0gc3lzX2luZm8uZnJlcVBDSTsKKworCS8qCisJICogRmlyc3QgY2hlY2sgaWYgdGhlIGVxdWF0aW9uIGFib3ZlIGlzIG1ldAorCSAqLworCWlmICghcHBjNHh4X3BjaV9zeW5jX2Nsb2NrX29rKHN5bmMsIGFzeW5jKSkgeworCQkvKgorCQkgKiBSZWNvbmZpZ3VyZSBQQ0kgc3luYyBjbG9jayB0byBtZWV0IHRoZSBlcXVhdGlvbi4KKwkJICogU3RhcnQgd2l0aCBoaWdoZXN0IHBvc3NpYmxlIFBDSSBzeW5jIGZyZXF1ZW5jeQorCQkgKiAoZGl2aWRlciAxKS4KKwkJICovCisJCWZvciAoZGl2ID0gMTsgZGl2IDw9IDQ7IGRpdisrKSB7CisJCQlzeW5jID0gc3lzX2luZm8uZnJlcVBMQiAvIGRpdjsKKwkJCWlmIChwcGM0eHhfcGNpX3N5bmNfY2xvY2tfb2soc3luYywgYXN5bmMpKQorCQkJICAgIGJyZWFrOworCQl9CisKKwkJaWYgKGRpdiA8PSA0KSB7CisJCQltdGNwcihDUFIwX1NQQ0lELCBzcGNpZF92YWxbZGl2XSk7CisKKwkJCW1mY3ByKENQUjBfSUNGRywgcmVnKTsKKwkJCXJlZyB8PSBDUFIwX0lDRkdfUkxJX01BU0s7CisJCQltdGNwcihDUFIwX0lDRkcsIHJlZyk7CisKKwkJCS8qIGRvIGNoaXAgcmVzZXQgKi8KKwkJCW10c3ByKFNQUk5fREJDUjAsIDB4MjAwMDAwMDApOworCQl9IGVsc2UgeworCQkJLyogSW1wb3NzaWJsZSB0byBjb25maWd1cmUgdGhlIFBDSSBzeW5jIGNsb2NrICovCisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZGNyLlMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9kY3IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ2NWEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZGNyLlMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEVyaWsgVGhlaXNlbiwgV2F2ZSA3IE9wdGljcywgZXRoZWlzZW5AbWluZHNwcmluZy5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfNHh4KSAmJiBkZWZpbmVkKENPTkZJR19DTURfU0VUR0VURENSKQorCisjaW5jbHVkZSA8cHBjNHh4Lmg+CisKKyNkZWZpbmUgX0xJTlVYX0NPTkZJR19IIDEgICAgICAgLyogYXZvaWQgcmVhZGluZyBMaW51eCBhdXRvY29uZi5oIGZpbGUgICovCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKworI2RlZmluZSBfQVNNTEFOR1VBR0UKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIFhYWCAtIERBTkdFUgorICogICAgICAgIFRoZXNlIHJvdXRpbmVzIG1ha2UgdXNlIG9mIHNlbGYgbW9kaWZ5aW5nIGNvZGUuICBETyBOT1QgQ0FMTCBUSEVNCisgKgkgIFVOVElMIFRIRVkgQVJFIFJFTE9DQVRFRCBUTyBSQU0uICBBZGRpdGlvbmFsbHksIEkgZG8gbm90CisgKgkgIHJlY29tbWVuZCB0aGVtIGZvciB1c2UgaW4gYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBpbnRlcmFjdGl2ZQorICogICAgICAgIGRlYnVnZ2luZyBlbnZpcm9ubWVudC4gIFRoaXMgaXMgbWFpbmx5IGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogc3RhdGljIHZvaWQgX2NyZWF0ZV9NRkRDUih1bnNpZ25lZCBzaG9ydCBkY3JuKQorICoKKyAqIEJ1aWxkcyBhICdtZmRjcicgaW5zdHJ1Y3Rpb24gZm9yIGdldF9kY3IKKyAqIGZ1bmN0aW9uLgorICovCisJCS5zZWN0aW9uICIudGV4dCIKKwkJLmFsaWduIDIKKwkJLnR5cGUJIF9jcmVhdGVfTUZEQ1IsQGZ1bmN0aW9uCitfY3JlYXRlX01GRENSOgorCQkvKgorCQkgKiBCdWlsZCB1cCBhICdtZmRjcicgaW5zdHJ1Y3Rpb24gZm9ybWF0dGVkIGFzIGZvbGxvd3M6CisJCSAqCisJCSAqICBPUENEIHwgICBSVCAgIHwgICAgRENSRiAgICAgIHwgICAgIFhPICAgICAgIHwgQ1IgfAorCQkgKiAtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLXwKKwkJICogMCAgIDUgfCA2ICAgMTAgfCAxMSAgICAgICAgMjAgfCAyMSAgICAgICAgMzAgfCAzMSB8CisJCSAqICAgICAgIHwgICAgICAgIHwgICAgRENSTiAgICAgIHwgICAgICAgICAgICAgIHwgICAgfAorCQkgKiAgIDMxICB8ICAlcjMgICB8ICg1Li45fDAuLjQpICB8ICAgICAgMzIzICAgICB8ICAwIHwKKwkJICoKKwkJICogV2hlcmU6CisJCSAqCU9QQ0QgPSBvcGNvZGUgLSAzMQorCQkgKglSVCAgID0gZGVzdGluYXRpb24gcmVnaXN0ZXIgLSAlcjMgcmV0dXJuIHJlZ2lzdGVyCisJCSAqCURDUkYgPSBEQ1JOICMgd2l0aCB1cHBlciBhbmQgbG93ZXIgaGFsdmVzIHN3YXBwZWQKKwkJICoJWE8gICA9IGV4dGVuZGVkIG9wY29kZSAtIDMyMworCQkgKglDUiAgID0gQ1JbQ1IwXSBOT1QgdW5kZWZpbmVkIC0gMAorCQkgKi8KKwkJcmx3aW5tCXIwLCByMywgMjcsIDI3LCAzMQkvKiBPUENEID0gMzEgKi8KKwkJcmx3aW5tCXIzLCByMywgNSwgMjIsIDI2CisJCW9yCXIzLCByMywgcjAKKwkJc2x3aQlyMywgcjMsIDEwCisJCW9yaXMJcjMsIHIzLCAweDNlMzAJCS8qIFJUID0gJXIzICovCisJCW9yaQlyMywgcjMsIDMyMwkJLyogWE8gPSAzMjMgKi8KKwkJc2x3aQlyMywgcjMsIDEJCS8qIENSID0gMCAqLworCisJCW1mbHIJcjQKKwkJc3R3CXIzLCAwKHI0KQkJLyogU3RvcmUgaW5zdHIgaW4gZ2V0X2RjcigpICovCisJCWRjYnN0CXIwLCByNAkJCS8qIE1ha2Ugc3VyZSB2YWwgaXMgd3JpdHRlbiBvdXQgKi8KKwkJc3luYwkJCQkvKiBXYWl0IGZvciB3cml0ZSB0byBjb21wbGV0ZSAqLworCQlpY2JpCXIwLCByNAkJCS8qIE1ha2Ugc3VyZSBvbGQgaW5zdHIgaXMgZHVtcGVkICovCisJCWlzeW5jCQkJCS8qIFdhaXQgZm9yIGljYmkgdG8gY29tcGxldGUgKi8KKworCQlibHIKKy5MZmUxOgkJLnNpemUJIF9jcmVhdGVfTUZEQ1IsLkxmZTEtX2NyZWF0ZV9NRkRDUgorLyogZW5kIF9jcmVhdGVfTUZEQ1IoKSAqLworCisvKgorICogc3RhdGljIHZvaWQgX2NyZWF0ZV9NVERDUih1bnNpZ25lZCBzaG9ydCBkY3JuLCB1bnNpZ25lZCBsb25nIHZhbHVlKQorICoKKyAqIEJ1aWxkcyBhICdtdGRjcicgaW5zdHJ1Y3Rpb24gZm9yIHNldF9kY3IKKyAqIGZ1bmN0aW9uLgorICovCisJCS5zZWN0aW9uICIudGV4dCIKKwkJLmFsaWduIDIKKwkJLnR5cGUJIF9jcmVhdGVfTVREQ1IsQGZ1bmN0aW9uCitfY3JlYXRlX01URENSOgorCQkvKgorCQkgKiBCdWlsZCB1cCBhICdtdGRjcicgaW5zdHJ1Y3Rpb24gZm9ybWF0dGVkIGFzIGZvbGxvd3M6CisJCSAqCisJCSAqICBPUENEIHwgICBSUyAgIHwgICAgRENSRiAgICAgIHwgICAgIFhPICAgICAgIHwgQ1IgfAorCQkgKiAtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLXwKKwkJICogMCAgIDUgfCA2ICAgMTAgfCAxMSAgICAgICAgMjAgfCAyMSAgICAgICAgMzAgfCAzMSB8CisJCSAqICAgICAgIHwgICAgICAgIHwgICAgRENSTiAgICAgIHwgICAgICAgICAgICAgIHwgICAgfAorCQkgKiAgIDMxICB8ICAlcjMgICB8ICg1Li45fDAuLjQpICB8ICAgICAgNDUxICAgICB8ICAwIHwKKwkJICoKKwkJICogV2hlcmU6CisJCSAqCU9QQ0QgPSBvcGNvZGUgLSAzMQorCQkgKglSUyAgID0gc291cmNlIHJlZ2lzdGVyIC0gJXI0CisJCSAqCURDUkYgPSBkZXN0LiBEQ1JOICMgd2l0aCB1cHBlciBhbmQgbG93ZXIgaGFsdmVzIHN3YXBwZWQKKwkJICoJWE8gICA9IGV4dGVuZGVkIG9wY29kZSAtIDQ1MQorCQkgKglDUiAgID0gQ1JbQ1IwXSBOT1QgdW5kZWZpbmVkIC0gMAorCQkgKi8KKwkJcmx3aW5tCXIwLCByMywgMjcsIDI3LCAzMQkvKiBPUENEID0gMzEgKi8KKwkJcmx3aW5tCXIzLCByMywgNSwgMjIsIDI2CisJCW9yCXIzLCByMywgcjAKKwkJc2x3aQlyMywgcjMsIDEwCisJCW9yaXMJcjMsIHIzLCAweDNlNDAJCS8qIFJTID0gJXI0ICovCisJCW9yaQlyMywgcjMsIDQ1MQkJLyogWE8gPSA0NTEgKi8KKwkJc2x3aQlyMywgcjMsIDEJCS8qIENSID0gMCAqLworCisJCW1mbHIJcjUKKwkJc3R3CXIzLCAwKHI1KQkJLyogU3RvcmUgaW5zdHIgaW4gc2V0X2RjcigpICovCisJCWRjYnN0CXIwLCByNQkJCS8qIE1ha2Ugc3VyZSB2YWwgaXMgd3JpdHRlbiBvdXQgKi8KKwkJc3luYwkJCQkvKiBXYWl0IGZvciB3cml0ZSB0byBjb21wbGV0ZSAqLworCQlpY2JpCXIwLCByNQkJCS8qIE1ha2Ugc3VyZSBvbGQgaW5zdHIgaXMgZHVtcGVkICovCisJCWlzeW5jCQkJCS8qIFdhaXQgZm9yIGljYmkgdG8gY29tcGxldGUgKi8KKworCQlibHIKKy5MZmUyOgkJLnNpemUJIF9jcmVhdGVfTVREQ1IsLkxmZTItX2NyZWF0ZV9NVERDUgorLyogZW5kIF9jcmVhdGVfTVREQ1IoKSAqLworCisKKy8qCisgKiB1bnNpZ25lZCBsb25nIGdldF9kY3IodW5zaWduZWQgc2hvcnQgZGNybikKKyAqCisgKiBSZXR1cm4gYSBnaXZlbiBEQ1IncyB2YWx1ZS4KKyAqLworCQkvKiAqLworCQkvKiBYWFggLSBUaGlzIGlzIHNlbGYgbW9kaWZ5aW5nIGNvZGUsIGhlbmNlICovCisJCS8qIGl0IGlzIGluIHRoZSBkYXRhIHNlY3Rpb24uICovCisJCS8qICovCisJCS5zZWN0aW9uICIuZGF0YSIKKwkJLmFsaWduCTIKKwkJLmdsb2JsCWdldF9kY3IKKwkJLnR5cGUJZ2V0X2RjcixAZnVuY3Rpb24KK2dldF9kY3I6CisJCW1mbHIJcjAJCQkvKiBHZXQgbGluayByZWdpc3RlciAqLworCQlzdHd1CXIxLCAtMzIocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KKwkJc3R3CXIwLCArMzYocjEpCQkvKiBTYXZlIGxpbmsgcmVnaXN0ZXIgKi8KKworCQlibAlfY3JlYXRlX01GRENSCQkvKiBCdWlsZCBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gKi8KKwkJLyogWFhYIC0gd2UgYnVpbGQgdGhpcyBpbnN0dWN0aW9uIHVwIG9uIHRoZSBmbHkuICovCisJCS5sb25nCTAJCQkvKiBHZXQgRENSJ3MgdmFsdWUgKi8KKworCQlsd3oJcjAsICszNihyMSkJCS8qIEdldCBzYXZlZCBsaW5rIHJlZ2lzdGVyICovCisJCW10bHIJcjAJCQkvKiBSZXN0b3JlIGxpbmsgcmVnaXN0ZXIgKi8KKwkJYWRkaQlyMSwgcjEsICszMgkJLyogUmVtb3ZlIGZyYW1lIGZyb20gc3RhY2sgKi8KKwkJYmxyCQkJCS8qIFJldHVybiB0byBjYWxsaW5nIGZ1bmN0aW9uICovCisuTGZlMzoJCS5zaXplCWdldF9kY3IsLkxmZTMtZ2V0X2RjcgorLyogZW5kIGdldF9kY3IoKSAqLworCisKKy8qCisgKiB1bnNpZ25lZCB2b2lkIHNldF9kY3IodW5zaWduZWQgc2hvcnQgZGNybiwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKKyAqCisgKiBSZXR1cm4gYSBnaXZlbiBEQ1IncyB2YWx1ZS4KKyAqLworCQkvKgorCQkgKiBYWFggLSBUaGlzIGlzIHNlbGYgbW9kaWZ5aW5nIGNvZGUsIGhlbmNlCisJCSAqIGl0IGlzIGluIHRoZSBkYXRhIHNlY3Rpb24uCisJCSAqLworCQkuc2VjdGlvbiAiLmRhdGEiCisJCS5hbGlnbgkyCisJCS5nbG9ibAlzZXRfZGNyCisJCS50eXBlCXNldF9kY3IsQGZ1bmN0aW9uCitzZXRfZGNyOgorCQltZmxyCXIwCQkJLyogR2V0IGxpbmsgcmVnaXN0ZXIgKi8KKwkJc3R3dQlyMSwgLTMyKHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCisJCXN0dwlyMCwgKzM2KHIxKQkJLyogU2F2ZSBsaW5rIHJlZ2lzdGVyICovCisKKwkJYmwJX2NyZWF0ZV9NVERDUgkJLyogQnVpbGQgZm9sbG93aW5nIGluc3RydWN0aW9uICovCisJCS8qIFhYWCAtIHdlIGJ1aWxkIHRoaXMgaW5zdHVjdGlvbiB1cCBvbiB0aGUgZmx5LiAqLworCQkubG9uZwkwCQkJLyogU2V0IERDUidzIHZhbHVlICovCisKKwkJbHd6CXIwLCArMzYocjEpCQkvKiBHZXQgc2F2ZWQgbGluayByZWdpc3RlciAqLworCQltdGxyCXIwCQkJLyogUmVzdG9yZSBsaW5rIHJlZ2lzdGVyICovCisJCWFkZGkJcjEsIHIxLCArMzIJCS8qIFJlbW92ZSBmcmFtZSBmcm9tIHN0YWNrICovCisJCWJscgkJCQkvKiBSZXR1cm4gdG8gY2FsbGluZyBmdW5jdGlvbiAqLworLkxmZTQ6CQkuc2l6ZQlzZXRfZGNyLC5MZmU0LXNldF9kY3IKKy8qIGVuZCBzZXRfZGNyKCkgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZGVuYWxpX2RhdGFfZXllLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9kZW5hbGlfZGF0YV9leWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2I4ZDNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZGVuYWxpX2RhdGFfZXllLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBhcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9kZW5hbGlfZGF0YV9leWUuYworICogRXh0cmFjdGVkIGZyb20gYm9hcmQvYW1jYy9zZXF1b2lhL3NkcmFtLmMgYnkgTGFycnkgSm9obnNvbiA8bHJqQGFjbS5vcmc+LgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogU3lsdmllIEdvaGwsICAgICAgICAgICAgIEFNQ0MvSUJNLCBnb2hsLnN5bHZpZUBmci5pYm0uY29tCisgKiBKYWNxdWVsaW5lIFBpcmEtRmVycmlvbCwgQU1DQy9JQk0sIGpwaXJhLWZlcnJpb2xAZnIuaWJtLmNvbQorICogVGhpZXJyeSBSb21hbiwgICAgICAgICAgIEFNQ0MvSUJNLCB0aGllcnJ5X3JvbWFuQGZyLmlibS5jb20KKyAqIEFsYWluIFNhdXJlbCwgICAgICAgICAgICBBTUNDL0lCTSwgYWxhaW4uc2F1cmVsQGZyLmlibS5jb20KKyAqIFJvYmVydCBTbnlkZXIsICAgICAgICAgICBBTUNDL0lCTSwgcm9iLnNueWRlckBmci5pYm0uY29tCisgKgorICogKEMpIENvcHlyaWdodCAyMDA2LTIwMDcKKyAqIFN0ZWZhbiBSb2VzZSwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgc3JAZGVueC5kZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBkZWZpbmUgREVCVUcgZm9yIGRlYnVnZ2luZyBvdXRwdXQgKG9idmlvdXNseSA7LSkpICovCisjaWYgMAorI2RlZmluZSBERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSWCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBkZW5hbGlfd2FpdF9mb3JfZGxsbG9jay4KKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgZGVuYWxpX3dhaXRfZm9yX2RsbGxvY2sodm9pZCkKK3sKKwl1MzIgdmFsOworCWludCB3YWl0OworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogV2FpdCBmb3IgdGhlIERDQyBtYXN0ZXIgZGVsYXkgbGluZSB0byBmaW5pc2ggY2FsaWJyYXRpb24KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlmb3IgKHdhaXQgPSAwOyB3YWl0ICE9IDB4ZmZmZjsgKyt3YWl0KSB7CisJCW1mc2RyYW0oRERSMF8xNywgdmFsKTsKKwkJaWYgKEREUjBfMTdfRExMTE9DS1JFR19ERUNPREUodmFsKSkgeworCQkJLyogZGxsbG9ja3JlZyBiaXQgb24gKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCWRlYnVnKCIweCUwNHg6IEREUjBfMTcgVmFsdWUgKGRsbGxvY2tyZWcgYml0KTogMHglMDh4XG4iLCB3YWl0LCB2YWwpOworCWRlYnVnKCJXYWl0aW5nIGZvciBkbGxsb2NrcmVnIGJpdCB0byByYWlzZVxuIik7CisJcmV0dXJuIC0xOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0RBVEFfRVlFKQorI2RlZmluZSBERFJfRENSX0JBU0UgMHgxMAorI2RlZmluZSBkZHJjZmdhICAoRERSX0RDUl9CQVNFKzB4MCkJLyogRERSIGNvbmZpZ3VyYXRpb24gYWRkcmVzcyByZWcgKi8KKyNkZWZpbmUgZGRyY2ZnZCAgKEREUl9EQ1JfQkFTRSsweDEpCS8qIEREUiBjb25maWd1cmF0aW9uIGRhdGEgcmVnICAgICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB3YWl0X2Zvcl9kcmFtX2luaXRfY29tcGxldGUuCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3YWl0X2Zvcl9kcmFtX2luaXRfY29tcGxldGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgd2FpdCA9IDA7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBXYWl0IGZvciAnRFJBTSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZScgYml0IGluIHN0YXR1cyByZWdpc3RlcgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW10ZGNyKGRkcmNmZ2EsIEREUjBfMDApOworCisJd2hpbGUgKHdhaXQgIT0gMHhmZmZmKSB7CisJCXZhbCA9IG1mZGNyKGRkcmNmZ2QpOworCQlpZiAoKHZhbCAmIEREUjBfMDBfSU5UX1NUQVRVU19CSVQ2KSA9PSBERFIwXzAwX0lOVF9TVEFUVVNfQklUNikKKwkJCS8qICdEUkFNIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlJyBiaXQgKi8KKwkJCXJldHVybiAwOworCQllbHNlCisJCQl3YWl0Kys7CisJfQorCWRlYnVnKCJEUkFNIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlIGJpdCBpbiBzdGF0dXMgcmVnaXN0ZXIgZGlkIG5vdCAiCisJICAgICAgInJpc2VcbiIpOworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBOVU1fVFJJRVMgNjQKKyNkZWZpbmUgTlVNX1JFQURTIDEwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBkZW5hbGlfY29yZV9zZWFyY2hfZGF0YV9leWUuCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBkZW5hbGlfY29yZV9zZWFyY2hfZGF0YV9leWUodm9pZCkKK3sKKwlpbnQgaywgajsKKwl1MzIgdmFsOworCXUzMiB3cl9kcXNfc2hpZnQsIGRxc19vdXRfc2hpZnQsIGRsbF9kcXNfZGVsYXlfWDsKKwl1MzIgbWF4X3Bhc3NpbmdfY2FzZXMgPSAwLCB3cl9kcXNfc2hpZnRfd2l0aF9tYXhfcGFzc2luZ19jYXNlcyA9IDA7CisJdTMyIHBhc3NpbmdfY2FzZXMgPSAwLCBkbGxfZHFzX2RlbGF5X1hfc3dfdmFsID0gMDsKKwl1MzIgZGxsX2Rxc19kZWxheV9YX3N0YXJ0X3dpbmRvdyA9IDAsIGRsbF9kcXNfZGVsYXlfWF9lbmRfd2luZG93ID0gMDsKKwl2b2xhdGlsZSB1MzIgKnJhbV9wb2ludGVyOworCXUzMiB0ZXN0W05VTV9UUklFU10gPSB7CisJCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCisJCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCisJCTB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJCTB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJCTB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsCisJCTB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsCisJCTB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsCisJCTB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsCisJCTB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsCisJCTB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsCisJCTB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsCisJCTB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsCisJCTB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsCisJCTB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsCisJCTB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsCisJCTB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTUKKwl9OworCisJcmFtX3BvaW50ZXIgPSAodm9sYXRpbGUgdTMyICopKENPTkZJR19TWVNfU0RSQU1fQkFTRSk7CisKKwlmb3IgKHdyX2Rxc19zaGlmdCA9IDY0OyB3cl9kcXNfc2hpZnQgPCA5Njsgd3JfZHFzX3NoaWZ0KyspIHsKKwkJLyogZm9yICh3cl9kcXNfc2hpZnQ9MTsgd3JfZHFzX3NoaWZ0PDk2OyB3cl9kcXNfc2hpZnQrKykgeyAqLworCisJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQkgKiBEZS1hc3NlcnQgJ3N0YXJ0JyBwYXJhbWV0ZXIuCisJCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQltdGRjcihkZHJjZmdhLCBERFIwXzAyKTsKKwkJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMDJfU1RBUlRfTUFTSykgfAorCQkgICAgRERSMF8wMl9TVEFSVF9PRkY7CisJCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisKKwkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCSAqIFNldCAnd3JfZHFzX3NoaWZ0JworCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJbXRkY3IoZGRyY2ZnYSwgRERSMF8wOSk7CisJCXZhbCA9IChtZmRjcihkZHJjZmdkKSAmIH5ERFIwXzA5X1dSX0RRU19TSElGVF9NQVNLKSB8CisJCSAgICBERFIwXzA5X1dSX0RRU19TSElGVF9FTkNPREUod3JfZHFzX3NoaWZ0KTsKKwkJbXRkY3IoZGRyY2ZnZCwgdmFsKTsKKworCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJICogU2V0ICdkcXNfb3V0X3NoaWZ0JyA9IHdyX2Rxc19zaGlmdCArIDMyCisJCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQlkcXNfb3V0X3NoaWZ0ID0gd3JfZHFzX3NoaWZ0ICsgMzI7CisJCW10ZGNyKGRkcmNmZ2EsIEREUjBfMjIpOworCQl2YWwgPSAobWZkY3IoZGRyY2ZnZCkgJiB+RERSMF8yMl9EUVNfT1VUX1NISUZUX01BU0spIHwKKwkJICAgIEREUjBfMjJfRFFTX09VVF9TSElGVF9FTkNPREUoZHFzX291dF9zaGlmdCk7CisJCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisKKwkJcGFzc2luZ19jYXNlcyA9IDA7CisKKwkJZm9yIChkbGxfZHFzX2RlbGF5X1ggPSAxOyBkbGxfZHFzX2RlbGF5X1ggPCA2NDsKKwkJICAgICBkbGxfZHFzX2RlbGF5X1grKykgeworCQkJLyogZm9yIChkbGxfZHFzX2RlbGF5X1g9MTsgZGxsX2Rxc19kZWxheV9YPDEyODsKKwkJCSAgIGRsbF9kcXNfZGVsYXlfWCsrKSB7ICovCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJCSAqIFNldCAnZGxsX2Rxc19kZWxheV9YJy4KKwkJCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQkJLyogZGxsX2Rxc19kZWxheV8wICovCisJCQltdGRjcihkZHJjZmdhLCBERFIwXzE3KTsKKwkJCXZhbCA9IChtZmRjcihkZHJjZmdkKSAmIH5ERFIwXzE3X0RMTF9EUVNfREVMQVlfMF9NQVNLKQorCQkJICAgIHwgRERSMF8xN19ETExfRFFTX0RFTEFZXzBfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCk7CisJCQltdGRjcihkZHJjZmdkLCB2YWwpOworCQkJLyogZGxsX2Rxc19kZWxheV8xIHRvIGRsbF9kcXNfZGVsYXlfNCAqLworCQkJbXRkY3IoZGRyY2ZnYSwgRERSMF8xOCk7CisJCQl2YWwgPSAobWZkY3IoZGRyY2ZnZCkgJiB+RERSMF8xOF9ETExfRFFTX0RFTEFZX1hfTUFTSykKKwkJCSAgICB8IEREUjBfMThfRExMX0RRU19ERUxBWV80X0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpCisJCQkgICAgfCBERFIwXzE4X0RMTF9EUVNfREVMQVlfM19FTkNPREUoZGxsX2Rxc19kZWxheV9YKQorCQkJICAgIHwgRERSMF8xOF9ETExfRFFTX0RFTEFZXzJfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCkKKwkJCSAgICB8IEREUjBfMThfRExMX0RRU19ERUxBWV8xX0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpOworCQkJbXRkY3IoZGRyY2ZnZCwgdmFsKTsKKwkJCS8qIGRsbF9kcXNfZGVsYXlfNSB0byBkbGxfZHFzX2RlbGF5XzggKi8KKwkJCW10ZGNyKGRkcmNmZ2EsIEREUjBfMTkpOworCQkJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMTlfRExMX0RRU19ERUxBWV9YX01BU0spCisJCQkgICAgfCBERFIwXzE5X0RMTF9EUVNfREVMQVlfOF9FTkNPREUoZGxsX2Rxc19kZWxheV9YKQorCQkJICAgIHwgRERSMF8xOV9ETExfRFFTX0RFTEFZXzdfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCkKKwkJCSAgICB8IEREUjBfMTlfRExMX0RRU19ERUxBWV82X0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpCisJCQkgICAgfCBERFIwXzE5X0RMTF9EUVNfREVMQVlfNV9FTkNPREUoZGxsX2Rxc19kZWxheV9YKTsKKwkJCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisJCQkvKiBjbGVhciBhbnkgRUNDIGVycm9ycyAqLworCQkJbXRkY3IoZGRyY2ZnYSwgRERSMF8wMCk7CisJCQltdGRjcihkZHJjZmdkLAorCQkJICAgICAgbWZkY3IoZGRyY2ZnZCkgfCBERFIwXzAwX0lOVF9BQ0tfRU5DT0RFKDB4M0MpKTsKKworCQkJc3luYygpOworCQkJZWllaW8oKTsKKworCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCQkgKiBBc3NlcnQgJ3N0YXJ0JyBwYXJhbWV0ZXIuCisJCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCW10ZGNyKGRkcmNmZ2EsIEREUjBfMDIpOworCQkJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMDJfU1RBUlRfTUFTSykgfAorCQkJICAgIEREUjBfMDJfU1RBUlRfT047CisJCQltdGRjcihkZHJjZmdkLCB2YWwpOworCisJCQlzeW5jKCk7CisJCQllaWVpbygpOworCisJCQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJCSAqIFdhaXQgZm9yIHRoZSBEQ0MgbWFzdGVyIGRlbGF5IGxpbmUgdG8gZmluaXNoIGNhbGlicmF0aW9uCisJCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCWlmIChkZW5hbGlfd2FpdF9mb3JfZGxsbG9jaygpICE9IDApIHsKKwkJCQlwcmludGYoImRsbCBsb2NrIGRpZCBub3Qgb2NjdXIgISEhXG4iKTsKKwkJCQlwcmludGYoImRlbmFsaV9jb3JlX3NlYXJjaF9kYXRhX2V5ZSEhIVxuIik7CisJCQkJcHJpbnRmKCJ3cl9kcXNfc2hpZnQgPSAlZCAtIGRsbF9kcXNfZGVsYXlfWCA9ICIKKwkJCQkgICAgICAgIiVkXG4iLCB3cl9kcXNfc2hpZnQsIGRsbF9kcXNfZGVsYXlfWCk7CisJCQkJaGFuZygpOworCQkJfQorCQkJc3luYygpOworCQkJZWllaW8oKTsKKworCQkJaWYgKHdhaXRfZm9yX2RyYW1faW5pdF9jb21wbGV0ZSgpICE9IDApIHsKKwkJCQlwcmludGYoImRyYW0gaW5pdCBjb21wbGV0ZSBkaWQgbm90IG9jY3VyISEhXG4iKTsKKwkJCQlwcmludGYoImRlbmFsaV9jb3JlX3NlYXJjaF9kYXRhX2V5ZSEhIVxuIik7CisJCQkJcHJpbnRmKCJ3cl9kcXNfc2hpZnQgPSAlZCAtIGRsbF9kcXNfZGVsYXlfWCA9ICIKKwkJCQkgICAgICAgIiVkXG4iLCB3cl9kcXNfc2hpZnQsIGRsbF9kcXNfZGVsYXlfWCk7CisJCQkJaGFuZygpOworCQkJfQorCQkJdWRlbGF5KDEwMCk7IC8qIHdhaXQgMTAwdXMgdG8gZW5zdXJlIGluaXQgaXMgcmVhbGx5IGNvbXBsZXRlZCAhISEgKi8KKworCQkJLyogd3JpdGUgdmFsdWVzICovCisJCQlmb3IgKGogPSAwOyBqIDwgTlVNX1RSSUVTOyBqKyspIHsKKwkJCQlyYW1fcG9pbnRlcltqXSA9IHRlc3Rbal07CisKKwkJCQkvKiBjbGVhciBhbnkgY2FjaGUgYXQgcmFtIGxvY2F0aW9uICovCisJCQkgICAgICBfX2FzbV9fKCJkY2JmIDAsJTAiOiA6InIiKCZyYW1fcG9pbnRlcltqXSkpOworCQkJfQorCisJCQkvKiByZWFkIHZhbHVlcyBiYWNrICovCisJCQlmb3IgKGogPSAwOyBqIDwgTlVNX1RSSUVTOyBqKyspIHsKKwkJCQlmb3IgKGsgPSAwOyBrIDwgTlVNX1JFQURTOyBrKyspIHsKKwkJCQkJLyogY2xlYXIgYW55IGNhY2hlIGF0IHJhbSBsb2NhdGlvbiAqLworCQkJCSAgICAgIF9fYXNtX18oImRjYmYgMCwlMCI6IDoiciIoJnJhbV9wb2ludGVyCisJCQkJCSAgICBbal0pKTsKKworCQkJCQlpZiAocmFtX3BvaW50ZXJbal0gIT0gdGVzdFtqXSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIHJlYWQgZXJyb3IgKi8KKwkJCQlpZiAoayAhPSBOVU1fUkVBRFMpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBTZWUgaWYgdGhlIGRsbF9kcXNfZGVsYXlfWCB2YWx1ZSBwYXNzZWQuICovCisJCQltdGRjcihkZHJjZmdhLCBERFIwXzAwKTsKKwkJCWlmIChqIDwgTlVNX1RSSUVTCisJCQkgICAgfHwgKEREUjBfMDBfSU5UX1NUQVRVU19ERUNPREUobWZkY3IoZGRyY2ZnZCkpICYKKwkJCQkweDNGKSkgeworCQkJCS8qIEZhaWxlZCAqLworCQkJCXBhc3NpbmdfY2FzZXMgPSAwOworCQkJCS8qIGJyZWFrOyAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBQYXNzZWQgKi8KKwkJCQlpZiAocGFzc2luZ19jYXNlcyA9PSAwKQorCQkJCQlkbGxfZHFzX2RlbGF5X1hfc3dfdmFsID0KKwkJCQkJICAgIGRsbF9kcXNfZGVsYXlfWDsKKwkJCQlwYXNzaW5nX2Nhc2VzKys7CisJCQkJaWYgKHBhc3NpbmdfY2FzZXMgPj0gbWF4X3Bhc3NpbmdfY2FzZXMpIHsKKwkJCQkJbWF4X3Bhc3NpbmdfY2FzZXMgPSBwYXNzaW5nX2Nhc2VzOworCQkJCQl3cl9kcXNfc2hpZnRfd2l0aF9tYXhfcGFzc2luZ19jYXNlcyA9CisJCQkJCSAgICB3cl9kcXNfc2hpZnQ7CisJCQkJCWRsbF9kcXNfZGVsYXlfWF9zdGFydF93aW5kb3cgPQorCQkJCQkgICAgZGxsX2Rxc19kZWxheV9YX3N3X3ZhbDsKKwkJCQkJZGxsX2Rxc19kZWxheV9YX2VuZF93aW5kb3cgPQorCQkJCQkgICAgZGxsX2Rxc19kZWxheV9YOworCQkJCX0KKwkJCX0KKworCQkJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCQkgKiBEZS1hc3NlcnQgJ3N0YXJ0JyBwYXJhbWV0ZXIuCisJCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkJCW10ZGNyKGRkcmNmZ2EsIEREUjBfMDIpOworCQkJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMDJfU1RBUlRfTUFTSykgfAorCQkJICAgIEREUjBfMDJfU1RBUlRfT0ZGOworCQkJbXRkY3IoZGRyY2ZnZCwgdmFsKTsKKwkJfSAvKiBmb3IgKGRsbF9kcXNfZGVsYXlfWD0wOyBkbGxfZHFzX2RlbGF5X1g8MTI4OyBkbGxfZHFzX2RlbGF5X1grKykgKi8KKwl9IC8qIGZvciAod3JfZHFzX3NoaWZ0PTA7IHdyX2Rxc19zaGlmdDw5Njsgd3JfZHFzX3NoaWZ0KyspICovCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBMYXJnZXN0IHBhc3Npbmcgd2luZG93IGlzIG5vdyBkZXRlY3RlZC4KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCS8qIENvbXB1dGUgZGxsX2Rxc19kZWxheV9YIHZhbHVlICovCisJZGxsX2Rxc19kZWxheV9YID0gKGRsbF9kcXNfZGVsYXlfWF9lbmRfd2luZG93ICsKKwkJCSAgIGRsbF9kcXNfZGVsYXlfWF9zdGFydF93aW5kb3cpIC8gMjsKKwl3cl9kcXNfc2hpZnQgPSB3cl9kcXNfc2hpZnRfd2l0aF9tYXhfcGFzc2luZ19jYXNlczsKKworCWRlYnVnKCJEUVMgY2FsaWJyYXRpb24gLSBXaW5kb3cgZGV0ZWN0ZWQ6XG4iKTsKKwlkZWJ1ZygibWF4X3Bhc3NpbmdfY2FzZXMgPSAlZFxuIiwgbWF4X3Bhc3NpbmdfY2FzZXMpOworCWRlYnVnKCJ3cl9kcXNfc2hpZnQgICAgICA9ICVkXG4iLCB3cl9kcXNfc2hpZnQpOworCWRlYnVnKCJkbGxfZHFzX2RlbGF5X1ggICA9ICVkXG4iLCBkbGxfZHFzX2RlbGF5X1gpOworCWRlYnVnKCJkbGxfZHFzX2RlbGF5X1ggd2luZG93ID0gJWQgLSAlZFxuIiwKKwkgICAgICBkbGxfZHFzX2RlbGF5X1hfc3RhcnRfd2luZG93LCBkbGxfZHFzX2RlbGF5X1hfZW5kX3dpbmRvdyk7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgKiBEZS1hc3NlcnQgJ3N0YXJ0JyBwYXJhbWV0ZXIuCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRkY3IoZGRyY2ZnYSwgRERSMF8wMik7CisJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMDJfU1RBUlRfTUFTSykgfCBERFIwXzAyX1NUQVJUX09GRjsKKwltdGRjcihkZHJjZmdkLCB2YWwpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogU2V0ICd3cl9kcXNfc2hpZnQnCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRkY3IoZGRyY2ZnYSwgRERSMF8wOSk7CisJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMDlfV1JfRFFTX1NISUZUX01BU0spCisJICAgIHwgRERSMF8wOV9XUl9EUVNfU0hJRlRfRU5DT0RFKHdyX2Rxc19zaGlmdCk7CisJbXRkY3IoZGRyY2ZnZCwgdmFsKTsKKwlkZWJ1ZygiRERSMF8wOT0weCUwOGx4XG4iLCB2YWwpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogU2V0ICdkcXNfb3V0X3NoaWZ0JyA9IHdyX2Rxc19zaGlmdCArIDMyCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZHFzX291dF9zaGlmdCA9IHdyX2Rxc19zaGlmdCArIDMyOworCW10ZGNyKGRkcmNmZ2EsIEREUjBfMjIpOworCXZhbCA9IChtZmRjcihkZHJjZmdkKSAmIH5ERFIwXzIyX0RRU19PVVRfU0hJRlRfTUFTSykKKwkgICAgfCBERFIwXzIyX0RRU19PVVRfU0hJRlRfRU5DT0RFKGRxc19vdXRfc2hpZnQpOworCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisJZGVidWcoIkREUjBfMjI9MHglMDhseFxuIiwgdmFsKTsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIFNldCAnZGxsX2Rxc19kZWxheV9YJy4KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBkbGxfZHFzX2RlbGF5XzAgKi8KKwltdGRjcihkZHJjZmdhLCBERFIwXzE3KTsKKwl2YWwgPSAobWZkY3IoZGRyY2ZnZCkgJiB+RERSMF8xN19ETExfRFFTX0RFTEFZXzBfTUFTSykKKwkgICAgfCBERFIwXzE3X0RMTF9EUVNfREVMQVlfMF9FTkNPREUoZGxsX2Rxc19kZWxheV9YKTsKKwltdGRjcihkZHJjZmdkLCB2YWwpOworCWRlYnVnKCJERFIwXzE3PTB4JTA4bHhcbiIsIHZhbCk7CisKKwkvKiBkbGxfZHFzX2RlbGF5XzEgdG8gZGxsX2Rxc19kZWxheV80ICovCisJbXRkY3IoZGRyY2ZnYSwgRERSMF8xOCk7CisJdmFsID0gKG1mZGNyKGRkcmNmZ2QpICYgfkREUjBfMThfRExMX0RRU19ERUxBWV9YX01BU0spCisJICAgIHwgRERSMF8xOF9ETExfRFFTX0RFTEFZXzRfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCkKKwkgICAgfCBERFIwXzE4X0RMTF9EUVNfREVMQVlfM19FTkNPREUoZGxsX2Rxc19kZWxheV9YKQorCSAgICB8IEREUjBfMThfRExMX0RRU19ERUxBWV8yX0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpCisJICAgIHwgRERSMF8xOF9ETExfRFFTX0RFTEFZXzFfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCk7CisJbXRkY3IoZGRyY2ZnZCwgdmFsKTsKKwlkZWJ1ZygiRERSMF8xOD0weCUwOGx4XG4iLCB2YWwpOworCisJLyogZGxsX2Rxc19kZWxheV81IHRvIGRsbF9kcXNfZGVsYXlfOCAqLworCW10ZGNyKGRkcmNmZ2EsIEREUjBfMTkpOworCXZhbCA9IChtZmRjcihkZHJjZmdkKSAmIH5ERFIwXzE5X0RMTF9EUVNfREVMQVlfWF9NQVNLKQorCSAgICB8IEREUjBfMTlfRExMX0RRU19ERUxBWV84X0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpCisJICAgIHwgRERSMF8xOV9ETExfRFFTX0RFTEFZXzdfRU5DT0RFKGRsbF9kcXNfZGVsYXlfWCkKKwkgICAgfCBERFIwXzE5X0RMTF9EUVNfREVMQVlfNl9FTkNPREUoZGxsX2Rxc19kZWxheV9YKQorCSAgICB8IEREUjBfMTlfRExMX0RRU19ERUxBWV81X0VOQ09ERShkbGxfZHFzX2RlbGF5X1gpOworCW10ZGNyKGRkcmNmZ2QsIHZhbCk7CisJZGVidWcoIkREUjBfMTk9MHglMDhseFxuIiwgdmFsKTsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIEFzc2VydCAnc3RhcnQnIHBhcmFtZXRlci4KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltdGRjcihkZHJjZmdhLCBERFIwXzAyKTsKKwl2YWwgPSAobWZkY3IoZGRyY2ZnZCkgJiB+RERSMF8wMl9TVEFSVF9NQVNLKSB8IEREUjBfMDJfU1RBUlRfT047CisJbXRkY3IoZGRyY2ZnZCwgdmFsKTsKKworCXN5bmMoKTsKKwllaWVpbygpOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJICogV2FpdCBmb3IgdGhlIERDQyBtYXN0ZXIgZGVsYXkgbGluZSB0byBmaW5pc2ggY2FsaWJyYXRpb24KKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlpZiAoZGVuYWxpX3dhaXRfZm9yX2RsbGxvY2soKSAhPSAwKSB7CisJCXByaW50ZigiZGxsIGxvY2sgZGlkIG5vdCBvY2N1ciAhISFcbiIpOworCQloYW5nKCk7CisJfQorCXN5bmMoKTsKKwllaWVpbygpOworCisJaWYgKHdhaXRfZm9yX2RyYW1faW5pdF9jb21wbGV0ZSgpICE9IDApIHsKKwkJcHJpbnRmKCJkcmFtIGluaXQgY29tcGxldGUgZGlkIG5vdCBvY2N1ciAhISFcbiIpOworCQloYW5nKCk7CisJfQorCXVkZWxheSgxMDApOyAvKiB3YWl0IDEwMHVzIHRvIGVuc3VyZSBpbml0IGlzIHJlYWxseSBjb21wbGV0ZWQgISEhICovCit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRERSX0RBVEFfRVlFKSAqLworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZGVuYWxpX3NwZF9kZHIyLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9kZW5hbGlfc3BkX2RkcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBlYTBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZGVuYWxpX3NwZF9kZHIyLmMKQEAgLTAsMCArMSwxMjU2IEBACisvKgorICogYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZGVuYWxpX3NwZF9kZHIyLmMKKyAqIFRoaXMgU1BEIFNEUkFNIGRldGVjdGlvbiBjb2RlIHN1cHBvcnRzIEFNQ0MgUFBDNDR4IENQVXMgd2l0aCBhIERlbmFsaS1jb3JlCisgKiBERFIyIGNvbnRyb2xsZXIsIHNwZWNpZmljYWxseSB0aGUgNDQwRVB4L0dSeC4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDctMjAwOAorICogTGFycnkgSm9obnNvbiwgbHJqQGFjbS5vcmcuCisgKgorICogQmFzZWQgcHJpbWFyaWx5IG9uIGFyY2gvcG93ZXJwYy9jcHUvcHBjNHh4LzR4eF9zcGRfZGRyMi5jLCB3aGljaCBpcy4uLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIENPUFlSSUdIVCAgIEFNQ0MgICBDT1JQT1JBVElPTiAyMDA0CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qIGRlZmluZSBERUJVRyBmb3IgZGVidWdnaW5nIG91dHB1dCAob2J2aW91c2x5IDstKSkgKi8KKyNpZiAwCisjZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwcGM0eHguaD4KKyNpbmNsdWRlIDxpMmMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BEX0VFUFJPTSkgJiYJCQkJXAorCShkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSWCkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiBEZWZpbmVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYJVFJVRQorI2RlZmluZSBUUlVFCQkxCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UJCTAKKyNlbmRpZgorCisjZGVmaW5lIE1BWERJTU1TCTIKKyNkZWZpbmUgTUFYUkFOS1MJMgorCisjZGVmaW5lIE9ORV9CSUxMSU9OCTEwMDAwMDAwMDAKKworI2RlZmluZSBNVUxESVY2NChtMSwgbTIsIGQpCSh1MzIpKCgodTY0KShtMSkgKiAodTY0KShtMikpIC8gKHU2NCkoZCkpCisKKyNkZWZpbmUgRExMX0RRU19ERUxBWQkweDE5CisjZGVmaW5lIERMTF9EUVNfQllQQVNTCTB4MEIKKyNkZWZpbmUgRFFTX09VVF9TSElGVAkweDdGCisKKy8qCisgKiBUaGlzIEREUjIgc2V0dXAgY29kZSBjYW4gZHluYW1pY2FsbHkgc2V0dXAgdGhlIFRMQiBlbnRyaWVzIGZvciB0aGUgRERSMiBtZW1vcnkKKyAqIHJlZ2lvbi4gUmlnaHQgbm93IHRoZSBjYWNoZSBzaG91bGQgc3RpbGwgYmUgZGlzYWJsZWQgaW4gVS1Cb290IGJlY2F1c2Ugb2YgdGhlCisgKiBFTUFDIGRyaXZlciwgdGhhdCBuZWVkIGl0J3MgYnVmZmVyIGRlc2NyaXB0b3IgdG8gYmUgbG9jYXRlZCBpbiBub24gY2FjaGVkCisgKiBtZW1vcnkuCisgKgorICogSWYgYXQgc29tZSB0aW1lIHRoaXMgcmVzdHJpY3Rpb24gZG9lc24ndCBhcHBseSBhbnltb3JlLCBqdXN0IGRlZmluZQorICogQ09ORklHXzR4eF9EQ0FDSEUgaW4gdGhlIGJvYXJkIGNvbmZpZyBmaWxlIGFuZCB0aGlzIGNvZGUgc2hvdWxkIHNldHVwCisgKiBldmVyeXRoaW5nIGNvcnJlY3RseS4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHXzR4eF9EQ0FDSEUpCisjZGVmaW5lIE1ZX1RMQl9XT1JEMl9JX0VOQUJMRQkwCQkJLyogZW5hYmxlIGNhY2hpbmcgb24gU0RSQU0gKi8KKyNlbHNlCisjZGVmaW5lIE1ZX1RMQl9XT1JEMl9JX0VOQUJMRQlUTEJfV09SRDJfSV9FTkFCTEUJLyogZGlzYWJsZSBjYWNoaW5nIG9uIFNEUkFNICovCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIFByb3RvdHlwZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGludCBkZW5hbGlfd2FpdF9mb3JfZGxsbG9jayh2b2lkKTsKK2V4dGVybiB2b2lkIGRlbmFsaV9jb3JlX3NlYXJjaF9kYXRhX2V5ZSh2b2lkKTsKK2V4dGVybiB2b2lkIGRjYnpfYXJlYSh1MzIgc3RhcnRfYWRkcmVzcywgdTMyIG51bV9ieXRlcyk7CisKKy8qCisgKiBCb2FyZC1zcGVjaWZpYyBQbGF0Zm9ybSBjb2RlIGNhbiByZWltcGxlbWVudCBzcGRfZGRyX2luaXRfaGFuZyAoKSBpZiBuZWVkZWQKKyAqLwordm9pZCBfX3NwZF9kZHJfaW5pdF9oYW5nKHZvaWQpCit7CisJaGFuZygpOworfQordm9pZCBzcGRfZGRyX2luaXRfaGFuZyh2b2lkKQorICAgIF9fYXR0cmlidXRlX18gKCh3ZWFrLCBhbGlhcygiX19zcGRfZGRyX2luaXRfaGFuZyIpKSk7CisKKyNpZiBkZWZpbmVkKERFQlVHKQorc3RhdGljIHZvaWQgcHJpbnRfbWNzcih2b2lkKQoreworCXByaW50ZigiTUNTUiA9IDB4JTA4WFxuIiwgbWZzcHIoU1BSTl9NQ1NSKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlbmFsaV9zZHJhbV9yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHNkcmFtX2RhdGE7CisKKwlwcmludGYoIlxuICBSZWdpc3RlciBEdW1wOlxuIik7CisJbWZzZHJhbShERFIwXzAwLCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8wMCA9IDB4JTA4WCIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8wMSwgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMDEgPSAweCUwOFhcbiIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8wMiwgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMDIgPSAweCUwOFgiLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMDMsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzAzID0gMHglMDhYXG4iLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMDQsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzA0ID0gMHglMDhYIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzA1LCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8wNSA9IDB4JTA4WFxuIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzA2LCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8wNiA9IDB4JTA4WCIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8wNywgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMDcgPSAweCUwOFhcbiIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8wOCwgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMDggPSAweCUwOFgiLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMDksIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzA5ID0gMHglMDhYXG4iLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMTAsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzEwID0gMHglMDhYIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzExLCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8xMSA9IDB4JTA4WFxuIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzEyLCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8xMiA9IDB4JTA4WCIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8xNCwgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMTQgPSAweCUwOFhcbiIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8xNywgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMTcgPSAweCUwOFgiLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMTgsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzE4ID0gMHglMDhYXG4iLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMTksIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzE5ID0gMHglMDhYIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzIwLCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8yMCA9IDB4JTA4WFxuIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzIxLCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8yMSA9IDB4JTA4WCIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8yMiwgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMjIgPSAweCUwOFhcbiIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8yMywgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMjMgPSAweCUwOFgiLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMjQsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzI0ID0gMHglMDhYXG4iLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMjUsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzI1ID0gMHglMDhYIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzI2LCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8yNiA9IDB4JTA4WFxuIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzI3LCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8yNyA9IDB4JTA4WCIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8yOCwgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMjggPSAweCUwOFhcbiIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8zMSwgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMzEgPSAweCUwOFgiLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMzIsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzMyID0gMHglMDhYXG4iLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMzMsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzMzID0gMHglMDhYIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzM0LCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8zNCA9IDB4JTA4WFxuIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzM1LCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF8zNSA9IDB4JTA4WCIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8zNiwgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMzYgPSAweCUwOFhcbiIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF8zNywgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfMzcgPSAweCUwOFgiLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMzgsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzM4ID0gMHglMDhYXG4iLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfMzksIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzM5ID0gMHglMDhYIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzQwLCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF80MCA9IDB4JTA4WFxuIiwgc2RyYW1fZGF0YSk7CisJbWZzZHJhbShERFIwXzQxLCBzZHJhbV9kYXRhKTsKKwlwcmludGYoIiAgICAgICAgRERSMF80MSA9IDB4JTA4WCIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF80Miwgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfNDIgPSAweCUwOFhcbiIsIHNkcmFtX2RhdGEpOworCW1mc2RyYW0oRERSMF80Mywgc2RyYW1fZGF0YSk7CisJcHJpbnRmKCIgICAgICAgIEREUjBfNDMgPSAweCUwOFgiLCBzZHJhbV9kYXRhKTsKKwltZnNkcmFtKEREUjBfNDQsIHNkcmFtX2RhdGEpOworCXByaW50ZigiICAgICAgICBERFIwXzQ0ID0gMHglMDhYXG4iLCBzZHJhbV9kYXRhKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZGVuYWxpX3NkcmFtX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKK30KKworaW5saW5lIHN0YXRpYyB2b2lkIHByaW50X21jc3Iodm9pZCkKK3sKK30KKyNlbmRpZiAvKiBkZWZpbmVkKERFQlVHKSAqLworCitzdGF0aWMgaW50IGlzX2VjY19lbmFibGVkKHZvaWQpCit7CisJdTMyIHZhbDsKKworCW1mc2RyYW0oRERSMF8yMiwgdmFsKTsKKwlyZXR1cm4gMHgzID09IEREUjBfMjJfQ1RSTF9SQVdfREVDT0RFKHZhbCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNwZF9yZWFkKHU4IGNoaXAsIHVuc2lnbmVkIGludCBhZGRyKQoreworCXU4IGRhdGFbMl07CisKKwlpZiAoMCAhPSBpMmNfcHJvYmUoY2hpcCkgfHwgMCAhPSBpMmNfcmVhZChjaGlwLCBhZGRyLCAxLCBkYXRhLCAxKSkgeworCQlkZWJ1Zygic3BkX3JlYWQoMHglMDJYLCAweCUwMlgpIGZhaWxlZFxuIiwgY2hpcCwgYWRkcik7CisJCXJldHVybiAwOworCX0KKwlkZWJ1Zygic3BkX3JlYWQoMHglMDJYLCAweCUwMlgpIHJldHVybmVkIDB4JTAyWFxuIiwKKwkgICAgICBjaGlwLCBhZGRyLCBkYXRhWzBdKTsKKwlyZXR1cm4gZGF0YVswXTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X3RjeWModW5zaWduZWQgY2hhciByZWcpCit7CisJLyoKKwkgKiBCeXRlIDksIGV0IGFsOiBDeWNsZSB0aW1lIGZvciBDQVMgTGF0ZW5jeT1YLCBpcyBzcGxpdCBpbnRvIHR3bworCSAqIG5pYmJsZXM6IHRoZSBoaWdoZXIgb3JkZXIgbmliYmxlIChiaXRzIDQtNykgZGVzaWduYXRlcyB0aGUgY3ljbGUgdGltZQorCSAqIHRvIGEgZ3JhbnVsYXJpdHkgb2YgMW5zOyB0aGUgdmFsdWUgcHJlc2VudGVkIGJ5IHRoZSBsb3dlciBvcmRlcgorCSAqIG5pYmJsZSAoYml0cyAwLTMpIGhhcyBhIGdyYW51bGFyaXR5IG9mIC4xbnMgYW5kIGlzIGFkZGVkIHRvIHRoZSB2YWx1ZQorCSAqIGRlc2lnbmF0ZWQgYnkgdGhlIGhpZ2hlciBuaWJibGUuIEluIGFkZGl0aW9uLCBmb3VyIGxpbmVzIG9mIHRoZSBsb3dlcgorCSAqIG9yZGVyIG5pYmJsZSBhcmUgYXNzaWduZWQgdG8gc3VwcG9ydCArLjI1LCArLjMzLCArLjY2LCBhbmQgKy43NS4KKwkgKi8KKworCXVuc2lnbmVkIGNoYXIgc3ViZmllbGRfYiA9IHJlZyAmIDB4MEY7CisKKwlzd2l0Y2ggKHN1YmZpZWxkX2IgJiAweDBGKSB7CisJY2FzZSAweDA6CisJY2FzZSAweDE6CisJY2FzZSAweDI6CisJY2FzZSAweDM6CisJY2FzZSAweDQ6CisJY2FzZSAweDU6CisJY2FzZSAweDY6CisJY2FzZSAweDc6CisJY2FzZSAweDg6CisJY2FzZSAweDk6CisJCXJldHVybiAxMDAwICogKHJlZyA+PiA0KSArIDEwMCAqIHN1YmZpZWxkX2I7CisJY2FzZSAweEE6CisJCXJldHVybiAxMDAwICogKHJlZyA+PiA0KSArIDI1MDsKKwljYXNlIDB4QjoKKwkJcmV0dXJuIDEwMDAgKiAocmVnID4+IDQpICsgMzMzOworCWNhc2UgMHhDOgorCQlyZXR1cm4gMTAwMCAqIChyZWcgPj4gNCkgKyA2Njc7CisJY2FzZSAweEQ6CisJCXJldHVybiAxMDAwICogKHJlZyA+PiA0KSArIDc1MDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGaW5kIHRoZSBpbnN0YWxsZWQgRElNTXMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBhcmUgRERSMiwgYW5kIGZpbGwKKyAqIGluIHRoZSBkaW1tX3JhbmtzIGFycmF5LiAgVGhlbiBkaW1tX3JhbmtzW2RpbW1fbnVtXSA+IDAgaWZmIHRoZQorICogRElNTSBhbmQgZGltbV9udW0gaXMgcHJlc2VudC4KKyAqIE5vdGU6IEJlY2F1c2UgdGhlcmUgYXJlIG9ubHkgdHdvIGNoaXAtc2VsZWN0IGxpbmVzLCBpdCBpcyBhc3N1bWVkCisgKiB0aGF0IGEgYm9hcmQgd2l0aCBhIHNpbmdsZSBzb2NrZXQgY2FuIHN1cHBvcnQgdHdvIHJhbmtzIG9uIHRoYXQKKyAqIHNvY2tldCwgd2hpbGUgYSBib2FyZCB3aXRoIHR3byBzb2NrZXRzIGNhbiBzdXBwb3J0IG9ubHkgb25lIHJhbmsKKyAqIG9uIGVhY2ggc29ja2V0LgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBnZXRfc3BkX2luZm8odW5zaWduZWQgbG9uZyBkaW1tX3JhbmtzW10sCisJCQkgdW5zaWduZWQgbG9uZyAqcmFua3MsCisJCQkgdW5zaWduZWQgY2hhciBjb25zdCBpaWMwX2RpbW1fYWRkcltdLAorCQkJIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBsb25nIGRpbW1fZm91bmQgPSBGQUxTRTsKKwl1bnNpZ25lZCBsb25nIGNvbnN0IG1heF9yYW5rc19wZXJfZGltbSA9ICgxID09IG51bV9kaW1tX2JhbmtzKSA/IDIgOiAxOworCXVuc2lnbmVkIGNoYXIgbnVtX29mX2J5dGVzOworCXVuc2lnbmVkIGNoYXIgdG90YWxfc2l6ZTsKKworCSpyYW5rcyA9IDA7CisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJbnVtX29mX2J5dGVzID0gMDsKKwkJdG90YWxfc2l6ZSA9IDA7CisKKwkJbnVtX29mX2J5dGVzID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAwKTsKKwkJdG90YWxfc2l6ZSA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMSk7CisJCWlmICgobnVtX29mX2J5dGVzICE9IDApICYmICh0b3RhbF9zaXplICE9IDApKSB7CisJCQl1bnNpZ25lZCBjaGFyIGNvbnN0IGRpbW1fdHlwZSA9CisJCQkgICAgc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyKTsKKworCQkJdW5zaWduZWQgbG9uZyByYW5rc19vbl9kaW1tID0KKwkJCSAgICAoc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCA1KSAmIDB4MDcpICsgMTsKKworCQkJaWYgKDggIT0gZGltbV90eXBlKSB7CisJCQkJc3dpdGNoIChkaW1tX3R5cGUpIHsKKwkJCQljYXNlIDE6CisJCQkJCXByaW50ZigiRVJST1I6IFN0YW5kYXJkIEZhc3QgUGFnZSBNb2RlICIKKwkJCQkJICAgICAgICJEUkFNIERJTU0iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQlwcmludGYoIkVSUk9SOiBFRE8gRElNTSIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCXByaW50ZigiRVJST1I6IFBpcGVsaW5lZCBOaWJibGUgRElNTSIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCXByaW50ZigiRVJST1I6IFNEUkFNIERJTU0iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA1OgorCQkJCQlwcmludGYoIkVSUk9SOiBNdWx0aXBsZXhlZCBST00gRElNTSIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDY6CisJCQkJCXByaW50ZigiRVJST1I6IFNHUkFNIERJTU0iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA3OgorCQkJCQlwcmludGYoIkVSUk9SOiBERFIxIERJTU0iKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRmKCJFUlJPUjogVW5rbm93biBESU1NICh0eXBlICVkKSIsCisJCQkJCSAgICAgICAodW5zaWduZWQgaW50KWRpbW1fdHlwZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwcmludGYoIiBkZXRlY3RlZCBpbiBzbG90ICVsdS5cbiIsIGRpbW1fbnVtKTsKKwkJCQlwcmludGYoIk9ubHkgRERSMiBTRFJBTSBESU1NcyBhcmUgc3VwcG9ydGVkLiIKKwkJCQkgICAgICAgIlxuIik7CisJCQkJcHJpbnRmKCJSZXBsYWNlIHRoZSBtb2R1bGUgd2l0aCBhIEREUjIgRElNTS4iCisJCQkJICAgICAgICJcblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcoKTsKKwkJCX0KKwkJCWRpbW1fZm91bmQgPSBUUlVFOworCQkJZGVidWcoIkRJTU0gc2xvdCAlbHU6IHBvcHVsYXRlZCB3aXRoICVsdS1yYW5rIEREUjIgRElNTSIKKwkJCSAgICAgICJcbiIsIGRpbW1fbnVtLCByYW5rc19vbl9kaW1tKTsKKwkJCWlmIChyYW5rc19vbl9kaW1tID4gbWF4X3JhbmtzX3Blcl9kaW1tKSB7CisJCQkJcHJpbnRmKCJXQVJOSU5HOiBEUkFNIERJTU0gaW4gc2xvdCAlbHUgaGFzICVsdSAiCisJCQkJICAgICAgICJyYW5rcy5cbiIsIGRpbW1fbnVtLCByYW5rc19vbl9kaW1tKTsKKwkJCQlpZiAoMSA9PSBtYXhfcmFua3NfcGVyX2RpbW0pIHsKKwkJCQkJcHJpbnRmKCJPbmx5IG9uZSByYW5rIHdpbGwgYmUgdXNlZC5cbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ZgorCQkJCQkgICAgKCJPbmx5IHR3byByYW5rcyB3aWxsIGJlIHVzZWQuXG4iKTsKKwkJCQl9CisJCQkJcmFua3Nfb25fZGltbSA9IG1heF9yYW5rc19wZXJfZGltbTsKKwkJCX0KKwkJCWRpbW1fcmFua3NbZGltbV9udW1dID0gcmFua3Nfb25fZGltbTsKKwkJCSpyYW5rcyArPSByYW5rc19vbl9kaW1tOworCQl9IGVsc2UgeworCQkJZGltbV9yYW5rc1tkaW1tX251bV0gPSAwOworCQkJZGVidWcoIkRJTU0gc2xvdCAlbHU6IE5vdCBwb3B1bGF0ZWRcbiIsIGRpbW1fbnVtKTsKKwkJfQorCX0KKwlpZiAoZGltbV9mb3VuZCA9PSBGQUxTRSkgeworCQlwcmludGYoIkVSUk9SOiBObyBtZW1vcnkgaW5zdGFsbGVkLlxuIik7CisJCXByaW50ZigiSW5zdGFsbCBhdCBsZWFzdCBvbmUgRERSMiBESU1NLlxuXG4iKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcoKTsKKwl9CisJZGVidWcoIlRvdGFsIG51bWJlciBvZiByYW5rcyA9ICVkXG4iLCAqcmFua3MpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRm9yIHRoZSBtZW1vcnkgRElNTXMgaW5zdGFsbGVkLCB0aGlzIHJvdXRpbmUgdmVyaWZpZXMgdGhhdAorICogZnJlcXVlbmN5IHByZXZpb3VzbHkgY2FsY3VsYXRlZCBpcyBzdXBwb3J0ZWQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2ZyZXF1ZW5jeSh1bnNpZ25lZCBsb25nICpkaW1tX3JhbmtzLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgaWljMF9kaW1tX2FkZHJbXSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2RyYW1fZnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgY3ljbGVfdGltZTsKKwl1bnNpZ25lZCBsb25nIGNhbGNfY3ljbGVfdGltZTsKKworCS8qCisJICogY2FsY19jeWNsZV90aW1lIGlzIGNhbGN1bGF0ZWQgZnJvbSBERFIgZnJlcXVlbmN5IHNldCBieSBib2FyZC9jaGlwCisJICogYW5kIGlzIGV4cHJlc3NlZCBpbiBwaWNvc2Vjb25kcyB0byBtYXRjaCB0aGUgd2F5IERJTU0gY3ljbGUgdGltZSBpcworCSAqIGNhbGN1bGF0ZWQgYmVsb3cuCisJICovCisJY2FsY19jeWNsZV90aW1lID0gTVVMRElWNjQoT05FX0JJTExJT04sIDEwMDAsIHNkcmFtX2ZyZXEpOworCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJaWYgKGRpbW1fcmFua3NbZGltbV9udW1dKSB7CisJCQljeWNsZV90aW1lID0KKwkJCSAgICBnZXRfdGN5YyhzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDkpKTsKKwkJCWRlYnVnKCJjeWNsZV90aW1lPSVkIHBzXG4iLCBjeWNsZV90aW1lKTsKKworCQkJaWYgKGN5Y2xlX3RpbWUgPiAoY2FsY19jeWNsZV90aW1lICsgMTApKSB7CisJCQkJLyoKKwkJCQkgKiB0aGUgcHJvdmlkZWQgc2RyYW0gY3ljbGVfdGltZSBpcyB0b28gc21hbGwKKwkJCQkgKiBmb3IgdGhlIGF2YWlsYWJsZSBESU1NIGN5Y2xlX3RpbWUuIFRoZQorCQkJCSAqIGFkZGl0aW9ubmFsIDEwcHMgaXMgaGVyZSB0byBhY2NlcHQgYSBzbWFsbAorCQkJCSAqIGluY2VydGFpbnR5LgorCQkJCSAqLworCQkJCXByaW50ZgorCQkJCSAgICAoIkVSUk9SOiBEUkFNIERJTU0gZGV0ZWN0ZWQgd2l0aCBjeWNsZV90aW1lICVkIHBzIGluICIKKwkJCQkgICAgICJzbG90ICVkIFxuIHdoaWxlIGNhbGN1bGF0ZWQgY3ljbGUgdGltZSBpcyAlZCBwcy5cbiIsCisJCQkJICAgICAodW5zaWduZWQgaW50KWN5Y2xlX3RpbWUsCisJCQkJICAgICAodW5zaWduZWQgaW50KWRpbW1fbnVtLAorCQkJCSAgICAgKHVuc2lnbmVkIGludCljYWxjX2N5Y2xlX3RpbWUpOworCQkJCXByaW50ZgorCQkJCSAgICAoIlJlcGxhY2UgdGhlIERJTU0sIG9yIGNoYW5nZSBERFIgZnJlcXVlbmN5IHZpYSAiCisJCQkJICAgICAic3RyYXBwaW5nIGJpdHMuXG5cbiIpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nKCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIHJvdXRpbmUgZ2V0cyBzaXplIGluZm9ybWF0aW9uIGZvciB0aGUgaW5zdGFsbGVkIG1lbW9yeQorICogRElNTXMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGdldF9kaW1tX3NpemUodW5zaWduZWQgbG9uZyBkaW1tX3JhbmtzW10sCisJCQkgIHVuc2lnbmVkIGNoYXIgY29uc3QgaWljMF9kaW1tX2FkZHJbXSwKKwkJCSAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcywKKwkJCSAgdW5zaWduZWQgbG9uZyAqY29uc3Qgcm93cywKKwkJCSAgdW5zaWduZWQgbG9uZyAqY29uc3QgYmFua3MsCisJCQkgIHVuc2lnbmVkIGxvbmcgKmNvbnN0IGNvbHMsIHVuc2lnbmVkIGxvbmcgKmNvbnN0IHdpZHRoKQoreworCXVuc2lnbmVkIGxvbmcgZGltbV9udW07CisKKwkqcm93cyA9IDA7CisJKmJhbmtzID0gMDsKKwkqY29scyA9IDA7CisJKndpZHRoID0gMDsKKwlmb3IgKGRpbW1fbnVtID0gMDsgZGltbV9udW0gPCBudW1fZGltbV9iYW5rczsgZGltbV9udW0rKykgeworCQlpZiAoZGltbV9yYW5rc1tkaW1tX251bV0pIHsKKwkJCXVuc2lnbmVkIGxvbmcgdDsKKworCQkJLyogUm93cyAqLworCQkJdCA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMyk7CisJCQlpZiAoMCA9PSAqcm93cykgeworCQkJCSpyb3dzID0gdDsKKwkJCX0gZWxzZSBpZiAodCAhPSAqcm93cykgeworCQkJCXByaW50ZigiRVJST1I6IERSQU0gRElNTSBtb2R1bGVzIGRvIG5vdCBhbGwgIgorCQkJCSAgICAgICAiaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cy5cblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcoKTsKKwkJCX0KKwkJCS8qIEJhbmtzICovCisJCQl0ID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAxNyk7CisJCQlpZiAoMCA9PSAqYmFua3MpIHsKKwkJCQkqYmFua3MgPSB0OworCQkJfSBlbHNlIGlmICh0ICE9ICpiYW5rcykgeworCQkJCXByaW50ZigiRVJST1I6IERSQU0gRElNTSBtb2R1bGVzIGRvIG5vdCBhbGwgIgorCQkJCSAgICAgICAiaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYmFua3MuXG5cbiIpOworCQkJCXNwZF9kZHJfaW5pdF9oYW5nKCk7CisJCQl9CisJCQkvKiBDb2x1bW5zICovCisJCQl0ID0gc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCA0KTsKKwkJCWlmICgwID09ICpjb2xzKSB7CisJCQkJKmNvbHMgPSB0OworCQkJfSBlbHNlIGlmICh0ICE9ICpjb2xzKSB7CisJCQkJcHJpbnRmKCJFUlJPUjogRFJBTSBESU1NIG1vZHVsZXMgZG8gbm90IGFsbCAiCisJCQkJICAgICAgICJoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zLlxuXG4iKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZygpOworCQkJfQorCQkJLyogRGF0YSB3aWR0aCAqLworCQkJdCA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgNik7CisJCQlpZiAoMCA9PSAqd2lkdGgpIHsKKwkJCQkqd2lkdGggPSB0OworCQkJfSBlbHNlIGlmICh0ICE9ICp3aWR0aCkgeworCQkJCXByaW50ZigiRVJST1I6IERSQU0gRElNTSBtb2R1bGVzIGRvIG5vdCBhbGwgIgorCQkJCSAgICAgICAiaGF2ZSB0aGUgc2FtZSBkYXRhIHdpZHRoLlxuXG4iKTsKKwkJCQlzcGRfZGRyX2luaXRfaGFuZygpOworCQkJfQorCQl9CisJfQorCWRlYnVnKCJOdW1iZXIgb2Ygcm93cyA9ICVkXG4iLCAqcm93cyk7CisJZGVidWcoIk51bWJlciBvZiBjb2x1bW5zID0gJWRcbiIsICpjb2xzKTsKKwlkZWJ1ZygiTnVtYmVyIG9mIGJhbmtzID0gJWRcbiIsICpiYW5rcyk7CisJZGVidWcoIkRhdGEgd2lkdGggPSAlZFxuIiwgKndpZHRoKTsKKwlpZiAoKnJvd3MgPiAxNCkgeworCQlwcmludGYoIkVSUk9SOiBEUkFNIERJTU0gbW9kdWxlcyBoYXZlICVsdSBhZGRyZXNzIHJvd3MuXG4iLAorCQkgICAgICAgKnJvd3MpOworCQlwcmludGYoIk9ubHkgbW9kdWxlcyB3aXRoIDE0IG9yIGZld2VyIHJvd3MgYXJlIHN1cHBvcnRlZC5cblxuIik7CisJCXNwZF9kZHJfaW5pdF9oYW5nKCk7CisJfQorCWlmICg0ICE9ICpiYW5rcyAmJiA4ICE9ICpiYW5rcykgeworCQlwcmludGYoIkVSUk9SOiBEUkFNIERJTU0gbW9kdWxlcyBoYXZlICVsdSBiYW5rcy5cbiIsICpiYW5rcyk7CisJCXByaW50ZigiT25seSBtb2R1bGVzIHdpdGggNCBvciA4IGJhbmtzIGFyZSBzdXBwb3J0ZWQuXG5cbiIpOworCQlzcGRfZGRyX2luaXRfaGFuZygpOworCX0KKwlpZiAoKmNvbHMgPiAxMikgeworCQlwcmludGYoIkVSUk9SOiBEUkFNIERJTU0gbW9kdWxlcyBoYXZlICVsdSBhZGRyZXNzIGNvbHVtbnMuXG4iLAorCQkgICAgICAgKmNvbHMpOworCQlwcmludGYoIk9ubHkgbW9kdWxlcyB3aXRoIDEyIG9yIGZld2VyIGNvbHVtbnMgYXJlICIKKwkJICAgICAgICJzdXBwb3J0ZWQuXG5cbiIpOworCQlzcGRfZGRyX2luaXRfaGFuZygpOworCX0KKwlpZiAoMzIgIT0gKndpZHRoICYmIDQwICE9ICp3aWR0aCAmJiA2NCAhPSAqd2lkdGggJiYgNzIgIT0gKndpZHRoKSB7CisJCXByaW50ZigiRVJST1I6IERSQU0gRElNTSBtb2R1bGVzIGhhdmUgYSB3aWR0aCBvZiAlbHUgYml0LlxuIiwKKwkJICAgICAgICp3aWR0aCk7CisJCXByaW50ZigiT25seSBtb2R1bGVzIHdpdGggd2lkdGhzIG9mIDMyLCA0MCwgNjQsIGFuZCA3MiBiaXRzICIKKwkJICAgICAgICJhcmUgc3VwcG9ydGVkLlxuXG4iKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcoKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPbmx5IDEuOFYgbW9kdWxlcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyByb3V0aW5lIHZlcmlmaWVzIHRoaXMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3ZvbHRhZ2VfdHlwZSh1bnNpZ25lZCBsb25nIGRpbW1fcmFua3NbXSwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0IGlpYzBfZGltbV9hZGRyW10sCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgdm9sdGFnZV90eXBlOworCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJaWYgKGRpbW1fcmFua3NbZGltbV9udW1dKSB7CisJCQl2b2x0YWdlX3R5cGUgPSBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDgpOworCQkJaWYgKDB4MDUgIT0gdm9sdGFnZV90eXBlKSB7CS8qIDEuOFYgZm9yIEREUjIgKi8KKwkJCQlwcmludGYoIkVSUk9SOiBTbG90ICVsdSBwcm92aWRlcyAxLjhWIGZvciBERFIyICIKKwkJCQkgICAgICAgIkRJTU1zLlxuIiwgZGltbV9udW0pOworCQkJCXN3aXRjaCAodm9sdGFnZV90eXBlKSB7CisJCQkJY2FzZSAweDAwOgorCQkJCQlwcmludGYoIlRoaXMgRElNTSBpcyA1LjAgVm9sdC9UVEwuXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDAxOgorCQkJCQlwcmludGYoIlRoaXMgRElNTSBpcyBMVlRUTC5cbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MDI6CisJCQkJCXByaW50ZigiVGhpcyBESU1NIGlzIDEuNSBWb2x0LlxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgwMzoKKwkJCQkJcHJpbnRmKCJUaGlzIERJTU0gaXMgMy4zIFZvbHQvVFRMLlxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgwNDoKKwkJCQkJcHJpbnRmKCJUaGlzIERJTU0gaXMgMi41IFZvbHQuXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRmKCJUaGlzIERJTU0gaXMgYW4gdW5rbm93biAiCisJCQkJCSAgICAgICAidm9sdGFnZS5cbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcHJpbnRmKCJSZXBsYWNlIGl0IHdpdGggYSAxLjhWIEREUjIgRElNTS5cblxuIik7CisJCQkJc3BkX2Rkcl9pbml0X2hhbmcoKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcHJvZ3JhbV9kZHIwXzAzKHVuc2lnbmVkIGxvbmcgZGltbV9yYW5rc1tdLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgaWljMF9kaW1tX2FkZHJbXSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2RyYW1fZnJlcSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHJvd3MsIHVuc2lnbmVkIGxvbmcgKmNhc19sYXRlbmN5KQoreworCXVuc2lnbmVkIGxvbmcgZGltbV9udW07CisJdW5zaWduZWQgbG9uZyBjYXNfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBjeWNsZV8yXzBfY2xrOworCXVuc2lnbmVkIGxvbmcgY3ljbGVfM18wX2NsazsKKwl1bnNpZ25lZCBsb25nIGN5Y2xlXzRfMF9jbGs7CisJdW5zaWduZWQgbG9uZyBjeWNsZV81XzBfY2xrOworCXVuc2lnbmVkIGxvbmcgbWF4XzJfMF90Y3ljX3BzID0gMTAwOworCXVuc2lnbmVkIGxvbmcgbWF4XzNfMF90Y3ljX3BzID0gMTAwOworCXVuc2lnbmVkIGxvbmcgbWF4XzRfMF90Y3ljX3BzID0gMTAwOworCXVuc2lnbmVkIGxvbmcgbWF4XzVfMF90Y3ljX3BzID0gMTAwOworCXVuc2lnbmVkIGNoYXIgY2FzX2F2YWlsYWJsZSA9IDB4M0M7CS8qIHZhbHVlIGZvciBERFIyICovCisJdTMyIGRkcjBfMDMgPSBERFIwXzAzX0JTVExFTl9FTkNPREUoMHgyKSB8IEREUjBfMDNfSU5JVEFSRUZfRU5DT0RFKDB4Mik7CisJdW5zaWduZWQgaW50IGNvbnN0IHRjeWNfYWRkclszXSA9IHsgOSwgMjMsIDI1IH07CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEdldCB0aGUgYm9hcmQgY29uZmlndXJhdGlvbiBpbmZvLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWRlYnVnKCJzZHJhbV9mcmVxID0gJWRcbiIsIHNkcmFtX2ZyZXEpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBIYW5kbGUgdGhlIHRpbWluZy4gIFdlIG5lZWQgdG8gZmluZCB0aGUgd29yc3QgY2FzZSB0aW1pbmcgb2YgYWxsCisJICogdGhlIGRpbW0gbW9kdWxlcyBpbnN0YWxsZWQuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogbG9vcCB0aHJvdWdoIGFsbCB0aGUgRElNTSBzbG90cyBvbiB0aGUgYm9hcmQgKi8KKwlmb3IgKGRpbW1fbnVtID0gMDsgZGltbV9udW0gPCBudW1fZGltbV9iYW5rczsgZGltbV9udW0rKykgeworCQkvKiBJZiBhIGRpbW0gaXMgaW5zdGFsbGVkIGluIGEgcGFydGljdWxhciBzbG90IC4uLiAqLworCQlpZiAoZGltbV9yYW5rc1tkaW1tX251bV0pIHsKKwkJCXVuc2lnbmVkIGNoYXIgY29uc3QgY2FzX2JpdCA9CisJCQkgICAgc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAxOCk7CisJCQl1bnNpZ25lZCBjaGFyIGNhc19tYXNrOworCisJCQljYXNfYXZhaWxhYmxlICY9IGNhc19iaXQ7CisJCQlmb3IgKGNhc19tYXNrID0gMHg4MDsgY2FzX21hc2s7IGNhc19tYXNrID4+PSAxKSB7CisJCQkJaWYgKGNhc19iaXQgJiBjYXNfbWFzaykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlkZWJ1ZygiY2FzX2JpdCAoU1BEIGJ5dGUgMTgpID0gJTAyWCwgY2FzX21hc2sgPSAlMDJYXG4iLAorCQkJICAgICAgY2FzX2JpdCwgY2FzX21hc2spOworCisJCQlmb3IgKGNhc19pbmRleCA9IDA7IGNhc19pbmRleCA8IDM7CisJCQkgICAgIGNhc19tYXNrID4+PSAxLCBjYXNfaW5kZXgrKykgeworCQkJCXVuc2lnbmVkIGxvbmcgY3ljbGVfdGltZV9wczsKKworCQkJCWlmICghKGNhc19hdmFpbGFibGUgJiBjYXNfbWFzaykpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWN5Y2xlX3RpbWVfcHMgPQorCQkJCSAgICBnZXRfdGN5YyhzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sCisJCQkJCQkgICAgICB0Y3ljX2FkZHJbY2FzX2luZGV4XSkpOworCisJCQkJZGVidWcoImNhc19pbmRleCA9ICVkOiBjeWNsZV90aW1lX3BzID0gJWRcbiIsCisJCQkJICAgICAgY2FzX2luZGV4LCBjeWNsZV90aW1lX3BzKTsKKwkJCQkvKgorCQkJCSAqIEREUjIgZGV2aWNlcyB1c2UgdGhlIGZvbGxvd2luZyBiaXRtYXNrIGZvciBDQVMgbGF0ZW5jeToKKwkJCQkgKiAgQml0ICAgNyAgICA2ICAgIDUgICAgNCAgICAzICAgIDIgICAgMSAgICAwCisJCQkJICogICAgICAgVEJEICA2LjAgIDUuMCAgNC4wICAzLjAgIDIuMCAgVEJEICBUQkQKKwkJCQkgKi8KKwkJCQlzd2l0Y2ggKGNhc19tYXNrKSB7CisJCQkJY2FzZSAweDIwOgorCQkJCQltYXhfNV8wX3RjeWNfcHMgPQorCQkJCQkgICAgbWF4KG1heF81XzBfdGN5Y19wcywgY3ljbGVfdGltZV9wcyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgxMDoKKwkJCQkJbWF4XzRfMF90Y3ljX3BzID0KKwkJCQkJICAgIG1heChtYXhfNF8wX3RjeWNfcHMsIGN5Y2xlX3RpbWVfcHMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MDg6CisJCQkJCW1heF8zXzBfdGN5Y19wcyA9CisJCQkJCSAgICBtYXgobWF4XzNfMF90Y3ljX3BzLCBjeWNsZV90aW1lX3BzKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDA0OgorCQkJCQltYXhfMl8wX3RjeWNfcHMgPQorCQkJCQkgICAgbWF4KG1heF8yXzBfdGN5Y19wcywgY3ljbGVfdGltZV9wcyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlkZWJ1ZygiY2FzX2F2YWlsYWJsZSAoYml0IG1hcCkgPSAweCUwMlhcbiIsIGNhc19hdmFpbGFibGUpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTZXQgdGhlIFNEUkFNIG1vZGUsIFNEUkFNX01NT0RFCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBhZGQgMTAgaGVyZSBiZWNhdXNlIG9mIHJvdW5kaW5nIHByb2JsZW1zICovCisJY3ljbGVfMl8wX2NsayA9IE1VTERJVjY0KE9ORV9CSUxMSU9OLCAxMDAwLCBtYXhfMl8wX3RjeWNfcHMpICsgMTA7CisJY3ljbGVfM18wX2NsayA9IE1VTERJVjY0KE9ORV9CSUxMSU9OLCAxMDAwLCBtYXhfM18wX3RjeWNfcHMpICsgMTA7CisJY3ljbGVfNF8wX2NsayA9IE1VTERJVjY0KE9ORV9CSUxMSU9OLCAxMDAwLCBtYXhfNF8wX3RjeWNfcHMpICsgMTA7CisJY3ljbGVfNV8wX2NsayA9IE1VTERJVjY0KE9ORV9CSUxMSU9OLCAxMDAwLCBtYXhfNV8wX3RjeWNfcHMpICsgMTA7CisJZGVidWcoImN5Y2xlXzJfMF9jbGsgPSAlZFxuIiwgY3ljbGVfMl8wX2Nsayk7CisJZGVidWcoImN5Y2xlXzNfMF9jbGsgPSAlZFxuIiwgY3ljbGVfM18wX2Nsayk7CisJZGVidWcoImN5Y2xlXzRfMF9jbGsgPSAlZFxuIiwgY3ljbGVfNF8wX2Nsayk7CisJZGVidWcoImN5Y2xlXzVfMF9jbGsgPSAlZFxuIiwgY3ljbGVfNV8wX2Nsayk7CisKKwlpZiAoKGNhc19hdmFpbGFibGUgJiAweDA0KSAmJiAoc2RyYW1fZnJlcSA8PSBjeWNsZV8yXzBfY2xrKSkgeworCQkqY2FzX2xhdGVuY3kgPSAyOworCQlkZHIwXzAzIHw9IEREUjBfMDNfQ0FTTEFUX0VOQ09ERSgweDIpIHwKKwkJICAgIEREUjBfMDNfQ0FTTEFUX0xJTl9FTkNPREUoMHg0KTsKKwl9IGVsc2UgaWYgKChjYXNfYXZhaWxhYmxlICYgMHgwOCkgJiYgKHNkcmFtX2ZyZXEgPD0gY3ljbGVfM18wX2NsaykpIHsKKwkJKmNhc19sYXRlbmN5ID0gMzsKKwkJZGRyMF8wMyB8PSBERFIwXzAzX0NBU0xBVF9FTkNPREUoMHgzKSB8CisJCSAgICBERFIwXzAzX0NBU0xBVF9MSU5fRU5DT0RFKDB4Nik7CisJfSBlbHNlIGlmICgoY2FzX2F2YWlsYWJsZSAmIDB4MTApICYmIChzZHJhbV9mcmVxIDw9IGN5Y2xlXzRfMF9jbGspKSB7CisJCSpjYXNfbGF0ZW5jeSA9IDQ7CisJCWRkcjBfMDMgfD0gRERSMF8wM19DQVNMQVRfRU5DT0RFKDB4NCkgfAorCQkgICAgRERSMF8wM19DQVNMQVRfTElOX0VOQ09ERSgweDgpOworCX0gZWxzZSBpZiAoKGNhc19hdmFpbGFibGUgJiAweDIwKSAmJiAoc2RyYW1fZnJlcSA8PSBjeWNsZV81XzBfY2xrKSkgeworCQkqY2FzX2xhdGVuY3kgPSA1OworCQlkZHIwXzAzIHw9IEREUjBfMDNfQ0FTTEFUX0VOQ09ERSgweDUpIHwKKwkJICAgIEREUjBfMDNfQ0FTTEFUX0xJTl9FTkNPREUoMHhBKTsKKwl9IGVsc2UgeworCQlwcmludGYoIkVSUk9SOiBDYW5ub3QgZmluZCBhIHN1cHBvcnRlZCBDQVMgbGF0ZW5jeSB3aXRoIHRoZSAiCisJCSAgICAgICAiaW5zdGFsbGVkIERJTU1zLlxuIik7CisJCXByaW50ZigiT25seSBERFIyIERJTU1zIHdpdGggQ0FTIGxhdGVuY2llcyBvZiAyLjAsIDMuMCwgNC4wLCAiCisJCSAgICAgICAiYW5kIDUuMCBhcmUgc3VwcG9ydGVkLlxuIik7CisJCXByaW50ZigiTWFrZSBzdXJlIHRoZSBQTEIgc3BlZWQgaXMgd2l0aGluIHRoZSBzdXBwb3J0ZWQgcmFuZ2UgIgorCQkgICAgICAgIm9mIHRoZSBESU1Ncy5cbiIpOworCQlwcmludGYoInNkcmFtX2ZyZXE9JWxkIGN5Y2xlMj0lbGQgY3ljbGUzPSVsZCBjeWNsZTQ9JWxkICIKKwkJICAgICAgICJjeWNsZTU9JWxkXG5cbiIsIHNkcmFtX2ZyZXEsIGN5Y2xlXzJfMF9jbGssCisJCSAgICAgICBjeWNsZV8zXzBfY2xrLCBjeWNsZV80XzBfY2xrLCBjeWNsZV81XzBfY2xrKTsKKwkJc3BkX2Rkcl9pbml0X2hhbmcoKTsKKwl9CisJZGVidWcoIkNBUyBsYXRlbmN5ID0gJWRcbiIsICpjYXNfbGF0ZW5jeSk7CisJbXRzZHJhbShERFIwXzAzLCBkZHIwXzAzKTsKK30KKworc3RhdGljIHZvaWQgcHJvZ3JhbV9kZHIwXzA0KHVuc2lnbmVkIGxvbmcgZGltbV9yYW5rc1tdLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgaWljMF9kaW1tX2FkZHJbXSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2RyYW1fZnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgdF9yY19wcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0X3JyZF9wcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0X3J0cF9wcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0X3JjX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfcnJkX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfcnRwX2NsazsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogSGFuZGxlIHRoZSB0aW1pbmcuICBXZSBuZWVkIHRvIGZpbmQgdGhlIHdvcnN0IGNhc2UgdGltaW5nIG9mIGFsbAorCSAqIHRoZSBkaW1tIG1vZHVsZXMgaW5zdGFsbGVkLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIERJTU0gc2xvdHMgb24gdGhlIGJvYXJkICovCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJLyogSWYgYSBkaW1tIGlzIGluc3RhbGxlZCBpbiBhIHBhcnRpY3VsYXIgc2xvdCAuLi4gKi8KKwkJaWYgKGRpbW1fcmFua3NbZGltbV9udW1dKSB7CisJCQl1bnNpZ25lZCBsb25nIHBzOworCisJCQkvKiB0UkMgKi8KKwkJCXBzID0gMTAwMCAqIHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgNDEpOworCQkJc3dpdGNoIChzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDQwKSA+PiA0KSB7CisJCQljYXNlIDB4MToKKwkJCQlwcyArPSAyNTA7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MjoKKwkJCQlwcyArPSAzMzM7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MzoKKwkJCQlwcyArPSA1MDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NDoKKwkJCQlwcyArPSA2Njc7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NToKKwkJCQlwcyArPSA3NTA7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0X3JjX3BzID0gbWF4KHRfcmNfcHMsIHBzKTsKKwkJCS8qIHRSUkQgKi8KKwkJCXBzID0gMjUwICogc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAyOCk7CisJCQl0X3JyZF9wcyA9IG1heCh0X3JyZF9wcywgcHMpOworCQkJLyogdFJUUCAqLworCQkJcHMgPSAyNTAgKiBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDM4KTsKKwkJCXRfcnRwX3BzID0gbWF4KHRfcnRwX3BzLCBwcyk7CisJCX0KKwl9CisJZGVidWcoInRfcmNfcHMgID0gJWRcbiIsIHRfcmNfcHMpOworCXRfcmNfY2xrID0gKE1VTERJVjY0KHNkcmFtX2ZyZXEsIHRfcmNfcHMsIE9ORV9CSUxMSU9OKSArIDk5OSkgLyAxMDAwOworCWRlYnVnKCJ0X3JyZF9wcyA9ICVkXG4iLCB0X3JyZF9wcyk7CisJdF9ycmRfY2xrID0gKE1VTERJVjY0KHNkcmFtX2ZyZXEsIHRfcnJkX3BzLCBPTkVfQklMTElPTikgKyA5OTkpIC8gMTAwMDsKKwlkZWJ1ZygidF9ydHBfcHMgPSAlZFxuIiwgdF9ydHBfcHMpOworCXRfcnRwX2NsayA9IChNVUxESVY2NChzZHJhbV9mcmVxLCB0X3J0cF9wcywgT05FX0JJTExJT04pICsgOTk5KSAvIDEwMDA7CisJbXRzZHJhbShERFIwXzA0LCBERFIwXzA0X1RSQ19FTkNPREUodF9yY19jbGspIHwKKwkJRERSMF8wNF9UUlJEX0VOQ09ERSh0X3JyZF9jbGspIHwKKwkJRERSMF8wNF9UUlRQX0VOQ09ERSh0X3J0cF9jbGspKTsKK30KKworc3RhdGljIHZvaWQgcHJvZ3JhbV9kZHIwXzA1KHVuc2lnbmVkIGxvbmcgZGltbV9yYW5rc1tdLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgY29uc3QgaWljMF9kaW1tX2FkZHJbXSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIG51bV9kaW1tX2JhbmtzLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2RyYW1fZnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGRpbW1fbnVtOworCXVuc2lnbmVkIGxvbmcgdF9ycF9wcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0X3Jhc19wcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0X3JwX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfcmFzX2NsazsKKwl1MzIgZGRyMF8wNSA9IEREUjBfMDVfVE1SRF9FTkNPREUoMHgyKSB8IEREUjBfMDVfVEVNUlNfRU5DT0RFKDB4Mik7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEhhbmRsZSB0aGUgdGltaW5nLiAgV2UgbmVlZCB0byBmaW5kIHRoZSB3b3JzdCBjYXNlIHRpbWluZyBvZiBhbGwKKwkgKiB0aGUgZGltbSBtb2R1bGVzIGluc3RhbGxlZC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBsb29wIHRocm91Z2ggYWxsIHRoZSBESU1NIHNsb3RzIG9uIHRoZSBib2FyZCAqLworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCS8qIElmIGEgZGltbSBpcyBpbnN0YWxsZWQgaW4gYSBwYXJ0aWN1bGFyIHNsb3QgLi4uICovCisJCWlmIChkaW1tX3JhbmtzW2RpbW1fbnVtXSkgeworCQkJdW5zaWduZWQgbG9uZyBwczsKKworCQkJLyogdFJQICovCisJCQlwcyA9IDI1MCAqIHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgMjcpOworCQkJdF9ycF9wcyA9IG1heCh0X3JwX3BzLCBwcyk7CisJCQkvKiB0UkFTICovCisJCQlwcyA9IDEwMDAgKiBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDMwKTsKKwkJCXRfcmFzX3BzID0gbWF4KHRfcmFzX3BzLCBwcyk7CisJCX0KKwl9CisJZGVidWcoInRfcnBfcHMgID0gJWRcbiIsIHRfcnBfcHMpOworCXRfcnBfY2xrID0gKE1VTERJVjY0KHNkcmFtX2ZyZXEsIHRfcnBfcHMsIE9ORV9CSUxMSU9OKSArIDk5OSkgLyAxMDAwOworCWRlYnVnKCJ0X3Jhc19wcyA9ICVkXG4iLCB0X3Jhc19wcyk7CisJdF9yYXNfY2xrID0gKE1VTERJVjY0KHNkcmFtX2ZyZXEsIHRfcmFzX3BzLCBPTkVfQklMTElPTikgKyA5OTkpIC8gMTAwMDsKKwltdHNkcmFtKEREUjBfMDUsIGRkcjBfMDUgfCBERFIwXzA1X1RSUF9FTkNPREUodF9ycF9jbGspIHwKKwkJRERSMF8wNV9UUkFTX01JTl9FTkNPREUodF9yYXNfY2xrKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyYW1fZGRyMF8wNih1bnNpZ25lZCBsb25nIGRpbW1fcmFua3NbXSwKKwkJCSAgICB1bnNpZ25lZCBjaGFyIGNvbnN0IGlpYzBfZGltbV9hZGRyW10sCisJCQkgICAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcywKKwkJCSAgICB1bnNpZ25lZCBsb25nIHNkcmFtX2ZyZXEpCit7CisJdW5zaWduZWQgbG9uZyBkaW1tX251bTsKKwl1bnNpZ25lZCBjaGFyIHNwZF80MDsKKwl1bnNpZ25lZCBsb25nIHRfd3RyX3BzID0gMDsKKwl1bnNpZ25lZCBsb25nIHRfcmZjX3BzID0gMDsKKwl1bnNpZ25lZCBsb25nIHRfd3RyX2NsazsKKwl1bnNpZ25lZCBsb25nIHRfcmZjX2NsazsKKwl1MzIgZGRyMF8wNiA9CisJICAgIEREUjBfMDZfV1JJVEVJTlRFUlBfRU5DT0RFKDB4MSkgfCBERFIwXzA2X1RETExfRU5DT0RFKDIwMCk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEhhbmRsZSB0aGUgdGltaW5nLiAgV2UgbmVlZCB0byBmaW5kIHRoZSB3b3JzdCBjYXNlIHRpbWluZyBvZiBhbGwKKwkgKiB0aGUgZGltbSBtb2R1bGVzIGluc3RhbGxlZC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBsb29wIHRocm91Z2ggYWxsIHRoZSBESU1NIHNsb3RzIG9uIHRoZSBib2FyZCAqLworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCS8qIElmIGEgZGltbSBpcyBpbnN0YWxsZWQgaW4gYSBwYXJ0aWN1bGFyIHNsb3QgLi4uICovCisJCWlmIChkaW1tX3JhbmtzW2RpbW1fbnVtXSkgeworCQkJdW5zaWduZWQgbG9uZyBwczsKKworCQkJLyogdFdUUiAqLworCQkJcHMgPSAyNTAgKiBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDM3KTsKKwkJCXRfd3RyX3BzID0gbWF4KHRfd3RyX3BzLCBwcyk7CisJCQkvKiB0UkZDICovCisJCQlwcyA9IDEwMDAgKiBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDQyKTsKKwkJCXNwZF80MCA9IHNwZF9yZWFkKGlpYzBfZGltbV9hZGRyW2RpbW1fbnVtXSwgNDApOworCQkJcHMgKz0gMjU2MDAwICogKHNwZF80MCAmIDB4MDEpOworCQkJc3dpdGNoICgoc3BkXzQwICYgMHgwRSkgPj4gMSkgeworCQkJY2FzZSAweDE6CisJCQkJcHMgKz0gMjUwOworCQkJCWJyZWFrOworCQkJY2FzZSAweDI6CisJCQkJcHMgKz0gMzMzOworCQkJCWJyZWFrOworCQkJY2FzZSAweDM6CisJCQkJcHMgKz0gNTAwOworCQkJCWJyZWFrOworCQkJY2FzZSAweDQ6CisJCQkJcHMgKz0gNjY3OworCQkJCWJyZWFrOworCQkJY2FzZSAweDU6CisJCQkJcHMgKz0gNzUwOworCQkJCWJyZWFrOworCQkJfQorCQkJdF9yZmNfcHMgPSBtYXgodF9yZmNfcHMsIHBzKTsKKwkJfQorCX0KKwlkZWJ1ZygidF93dHJfcHMgPSAlZFxuIiwgdF93dHJfcHMpOworCXRfd3RyX2NsayA9IChNVUxESVY2NChzZHJhbV9mcmVxLCB0X3d0cl9wcywgT05FX0JJTExJT04pICsgOTk5KSAvIDEwMDA7CisJZGVidWcoInRfcmZjX3BzID0gJWRcbiIsIHRfcmZjX3BzKTsKKwl0X3JmY19jbGsgPSAoTVVMRElWNjQoc2RyYW1fZnJlcSwgdF9yZmNfcHMsIE9ORV9CSUxMSU9OKSArIDk5OSkgLyAxMDAwOworCW10c2RyYW0oRERSMF8wNiwgZGRyMF8wNiB8IEREUjBfMDZfVFdUUl9FTkNPREUodF93dHJfY2xrKSB8CisJCUREUjBfMDZfVFJGQ19FTkNPREUodF9yZmNfY2xrKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyYW1fZGRyMF8xMCh1bnNpZ25lZCBsb25nIGRpbW1fcmFua3NbXSwgdW5zaWduZWQgbG9uZyByYW5rcykKK3sKKwl1bnNpZ25lZCBsb25nIGNzbWFwOworCisJaWYgKDIgPT0gcmFua3MpIHsKKwkJLyogQm90aCBjaGlwIHNlbGVjdHMgaW4gdXNlICovCisJCWNzbWFwID0gMHgwMzsKKwl9IGVsc2UgeworCQkvKiBPbmUgY2hpcCBzZWxlY3QgaW4gdXNlICovCisJCWNzbWFwID0gKDEgPT0gZGltbV9yYW5rc1swXSkgPyAweDEgOiAweDI7CisJfQorCW10c2RyYW0oRERSMF8xMCwgRERSMF8xMF9XUklURV9NT0RFUkVHX0VOQ09ERSgweDApIHwKKwkJRERSMF8xMF9DU19NQVBfRU5DT0RFKGNzbWFwKSB8CisJCUREUjBfMTBfT0NEX0FESlVTVF9QVVBfQ1NfMF9FTkNPREUoMCkpOworfQorCitzdGF0aWMgdm9pZCBwcm9ncmFtX2RkcjBfMTEodW5zaWduZWQgbG9uZyBzZHJhbV9mcmVxKQoreworCXVuc2lnbmVkIGxvbmcgY29uc3QgdF94c25yX3BzID0gMjAwMDAwOwkvKiAyMDAgbnMgKi8KKwl1bnNpZ25lZCBsb25nIHRfeHNucl9jbGs7CisKKwlkZWJ1ZygidF94c25yX3BzID0gJWRcbiIsIHRfeHNucl9wcyk7CisJdF94c25yX2NsayA9CisJICAgIChNVUxESVY2NChzZHJhbV9mcmVxLCB0X3hzbnJfcHMsIE9ORV9CSUxMSU9OKSArIDk5OSkgLyAxMDAwOworCW10c2RyYW0oRERSMF8xMSwgRERSMF8xMV9TUkVGUkVTSF9FTkNPREUoMCkgfAorCQlERFIwXzExX1RYU05SX0VOQ09ERSh0X3hzbnJfY2xrKSB8IEREUjBfMTFfVFhTUl9FTkNPREUoMjAwKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyYW1fZGRyMF8yMih1bnNpZ25lZCBsb25nIGRpbW1fcmFua3NbXSwKKwkJCSAgICB1bnNpZ25lZCBjaGFyIGNvbnN0IGlpYzBfZGltbV9hZGRyW10sCisJCQkgICAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcywgdW5zaWduZWQgbG9uZyB3aWR0aCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19ERFJfRUNDKQorCXVuc2lnbmVkIGxvbmcgZGltbV9udW07CisJdW5zaWduZWQgbG9uZyBlY2NfYXZhaWxhYmxlID0gd2lkdGggPj0gNjQ7CisJdTMyIGRkcjBfMjIgPSBERFIwXzIyX0RRU19PVVRfU0hJRlRfQllQQVNTX0VOQ09ERSgweDI2KSB8CisJICAgIEREUjBfMjJfRFFTX09VVF9TSElGVF9FTkNPREUoRFFTX09VVF9TSElGVCkgfAorCSAgICBERFIwXzIyX0RMTF9EUVNfQllQQVNTXzhfRU5DT0RFKERMTF9EUVNfQllQQVNTKTsKKworCS8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIERJTU0gc2xvdHMgb24gdGhlIGJvYXJkICovCisJZm9yIChkaW1tX251bSA9IDA7IGRpbW1fbnVtIDwgbnVtX2RpbW1fYmFua3M7IGRpbW1fbnVtKyspIHsKKwkJLyogSWYgYSBkaW1tIGlzIGluc3RhbGxlZCBpbiBhIHBhcnRpY3VsYXIgc2xvdCAuLi4gKi8KKwkJaWYgKGRpbW1fcmFua3NbZGltbV9udW1dKSB7CisJCQkvKiBDaGVjayBmb3IgRUNDICovCisJCQlpZiAoMCA9PSAoc3BkX3JlYWQoaWljMF9kaW1tX2FkZHJbZGltbV9udW1dLCAxMSkgJgorCQkJCSAgMHgwMikpIHsKKwkJCQllY2NfYXZhaWxhYmxlID0gRkFMU0U7CisJCQl9CisJCX0KKwl9CisJaWYgKGVjY19hdmFpbGFibGUpIHsKKwkJZGVidWcoIkVDQyBmb3VuZCBvbiBhbGwgRElNTXMgcHJlc2VudFxuIik7CisJCW10c2RyYW0oRERSMF8yMiwgZGRyMF8yMiB8IEREUjBfMjJfQ1RSTF9SQVdfRU5DT0RFKDB4MykpOworCX0gZWxzZSB7CisJCWRlYnVnKCJFQ0Mgbm90IGZvdW5kIG9uIHNvbWUgb3IgYWxsIERJTU1zIHByZXNlbnRcbiIpOworCQltdHNkcmFtKEREUjBfMjIsIGRkcjBfMjIgfCBERFIwXzIyX0NUUkxfUkFXX0VOQ09ERSgweDApKTsKKwl9CisjZWxzZQorCW10c2RyYW0oRERSMF8yMiwgRERSMF8yMl9DVFJMX1JBV19FTkNPREUoMHgwKSB8CisJCUREUjBfMjJfRFFTX09VVF9TSElGVF9CWVBBU1NfRU5DT0RFKDB4MjYpIHwKKwkJRERSMF8yMl9EUVNfT1VUX1NISUZUX0VOQ09ERShEUVNfT1VUX1NISUZUKSB8CisJCUREUjBfMjJfRExMX0RRU19CWVBBU1NfOF9FTkNPREUoRExMX0RRU19CWVBBU1MpKTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ERFJfRUNDKSAqLworfQorCitzdGF0aWMgdm9pZCBwcm9ncmFtX2RkcjBfMjQodW5zaWduZWQgbG9uZyByYW5rcykKK3sKKwl1MzIgZGRyMF8yNCA9IEREUjBfMjRfUlRUX1BBRF9URVJNSU5BVElPTl9FTkNPREUoMHgxKSB8CS8qIDc1IG9obSAqLworCSAgICBERFIwXzI0X09EVF9SRF9NQVBfQ1MxX0VOQ09ERSgweDApOworCisJaWYgKDIgPT0gcmFua3MpIHsKKwkJLyogQm90aCBjaGlwIHNlbGVjdHMgaW4gdXNlICovCisJCWRkcjBfMjQgfD0gRERSMF8yNF9PRFRfV1JfTUFQX0NTMV9FTkNPREUoMHgxKSB8CisJCSAgICBERFIwXzI0X09EVF9XUl9NQVBfQ1MwX0VOQ09ERSgweDIpOworCX0gZWxzZSB7CisJCS8qIE9uZSBjaGlwIHNlbGVjdCBpbiB1c2UgKi8KKwkJLyogT25lIG9mIHRoZSB0d28gZmllbGRzIGFkZGVkIHRvIGRkcjBfMjQgaXMgYSAiZG9uJ3QgY2FyZSIgKi8KKwkJZGRyMF8yNCB8PSBERFIwXzI0X09EVF9XUl9NQVBfQ1MxX0VOQ09ERSgweDIpIHwKKwkJICAgIEREUjBfMjRfT0RUX1dSX01BUF9DUzBfRU5DT0RFKDB4MSk7CisJfQorCW10c2RyYW0oRERSMF8yNCwgZGRyMF8yNCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyYW1fZGRyMF8yNih1bnNpZ25lZCBsb25nIHNkcmFtX2ZyZXEpCit7CisJdW5zaWduZWQgbG9uZyBjb25zdCB0X3JlZl9wcyA9IDc4MDAwMDA7CS8qIDcuOCB1cy4gcmVmcmVzaCAqLworCS8qIFRPRE86IGNoZWNrIGRlZmluaXRpb24gb2YgdFJBU19NQVggKi8KKwl1bnNpZ25lZCBsb25nIGNvbnN0IHRfcmFzX21heF9wcyA9IDkgKiB0X3JlZl9wczsKKwl1bnNpZ25lZCBsb25nIHRfcmFzX21heF9jbGs7CisJdW5zaWduZWQgbG9uZyB0X3JlZl9jbGs7CisKKwkvKiBSb3VuZCBkb3duIHRfcmFzX21heF9jbGsgYW5kIHRfcmVmX2NsayAqLworCWRlYnVnKCJ0X3Jhc19tYXhfcHMgPSAlZFxuIiwgdF9yYXNfbWF4X3BzKTsKKwl0X3Jhc19tYXhfY2xrID0gTVVMRElWNjQoc2RyYW1fZnJlcSwgdF9yYXNfbWF4X3BzLCBPTkVfQklMTElPTikgLyAxMDAwOworCWRlYnVnKCJ0X3JlZl9wcyAgICAgPSAlZFxuIiwgdF9yZWZfcHMpOworCXRfcmVmX2NsayA9IE1VTERJVjY0KHNkcmFtX2ZyZXEsIHRfcmVmX3BzLCBPTkVfQklMTElPTikgLyAxMDAwOworCW10c2RyYW0oRERSMF8yNiwgRERSMF8yNl9UUkFTX01BWF9FTkNPREUodF9yYXNfbWF4X2NsaykgfAorCQlERFIwXzI2X1RSRUZfRU5DT0RFKHRfcmVmX2NsaykpOworfQorCitzdGF0aWMgdm9pZCBwcm9ncmFtX2RkcjBfMjcodW5zaWduZWQgbG9uZyBzZHJhbV9mcmVxKQoreworCXVuc2lnbmVkIGxvbmcgY29uc3QgdF9pbml0X3BzID0gMjAwMDAwMDAwOwkvKiAyMDAgdXMuIGluaXQgKi8KKwl1bnNpZ25lZCBsb25nIHRfaW5pdF9jbGs7CisKKwlkZWJ1ZygidF9pbml0X3BzID0gJWRcbiIsIHRfaW5pdF9wcyk7CisJdF9pbml0X2NsayA9CisJICAgIChNVUxESVY2NChzZHJhbV9mcmVxLCB0X2luaXRfcHMsIE9ORV9CSUxMSU9OKSArIDk5OSkgLyAxMDAwOworCW10c2RyYW0oRERSMF8yNywgRERSMF8yN19FTVJTX0RBVEFfRU5DT0RFKDB4MDAwMCkgfAorCQlERFIwXzI3X1RJTklUX0VOQ09ERSh0X2luaXRfY2xrKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyYW1fZGRyMF80Myh1bnNpZ25lZCBsb25nIGRpbW1fcmFua3NbXSwKKwkJCSAgICB1bnNpZ25lZCBjaGFyIGNvbnN0IGlpYzBfZGltbV9hZGRyW10sCisJCQkgICAgdW5zaWduZWQgbG9uZyBudW1fZGltbV9iYW5rcywKKwkJCSAgICB1bnNpZ25lZCBsb25nIHNkcmFtX2ZyZXEsCisJCQkgICAgdW5zaWduZWQgbG9uZyBjb2xzLCB1bnNpZ25lZCBsb25nIGJhbmtzKQoreworCXVuc2lnbmVkIGxvbmcgZGltbV9udW07CisJdW5zaWduZWQgbG9uZyB0X3dyX3BzID0gMDsKKwl1bnNpZ25lZCBsb25nIHRfd3JfY2xrOworCXUzMiBkZHIwXzQzID0gRERSMF80M19BUFJFQklUX0VOQ09ERSgxMCkgfAorCSAgICBERFIwXzQzX0NPTFVNTl9TSVpFX0VOQ09ERSgxMiAtIGNvbHMpIHwKKwkgICAgRERSMF80M19FSUdIVF9CQU5LX01PREVfRU5DT0RFKDggPT0gYmFua3MgPyAxIDogMCk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEhhbmRsZSB0aGUgdGltaW5nLiAgV2UgbmVlZCB0byBmaW5kIHRoZSB3b3JzdCBjYXNlIHRpbWluZyBvZiBhbGwKKwkgKiB0aGUgZGltbSBtb2R1bGVzIGluc3RhbGxlZC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBsb29wIHRocm91Z2ggYWxsIHRoZSBESU1NIHNsb3RzIG9uIHRoZSBib2FyZCAqLworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCS8qIElmIGEgZGltbSBpcyBpbnN0YWxsZWQgaW4gYSBwYXJ0aWN1bGFyIHNsb3QgLi4uICovCisJCWlmIChkaW1tX3JhbmtzW2RpbW1fbnVtXSkgeworCQkJdW5zaWduZWQgbG9uZyBwczsKKworCQkJcHMgPSAyNTAgKiBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDM2KTsKKwkJCXRfd3JfcHMgPSBtYXgodF93cl9wcywgcHMpOworCQl9CisJfQorCWRlYnVnKCJ0X3dyX3BzID0gJWRcbiIsIHRfd3JfcHMpOworCXRfd3JfY2xrID0gKE1VTERJVjY0KHNkcmFtX2ZyZXEsIHRfd3JfcHMsIE9ORV9CSUxMSU9OKSArIDk5OSkgLyAxMDAwOworCW10c2RyYW0oRERSMF80MywgZGRyMF80MyB8IEREUjBfNDNfVFdSX0VOQ09ERSh0X3dyX2NsaykpOworfQorCitzdGF0aWMgdm9pZCBwcm9ncmFtX2RkcjBfNDQodW5zaWduZWQgbG9uZyBkaW1tX3JhbmtzW10sCisJCQkgICAgdW5zaWduZWQgY2hhciBjb25zdCBpaWMwX2RpbW1fYWRkcltdLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgbnVtX2RpbW1fYmFua3MsCisJCQkgICAgdW5zaWduZWQgbG9uZyBzZHJhbV9mcmVxKQoreworCXVuc2lnbmVkIGxvbmcgZGltbV9udW07CisJdW5zaWduZWQgbG9uZyB0X3JjZF9wcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0X3JjZF9jbGs7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEhhbmRsZSB0aGUgdGltaW5nLiAgV2UgbmVlZCB0byBmaW5kIHRoZSB3b3JzdCBjYXNlIHRpbWluZyBvZiBhbGwKKwkgKiB0aGUgZGltbSBtb2R1bGVzIGluc3RhbGxlZC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBsb29wIHRocm91Z2ggYWxsIHRoZSBESU1NIHNsb3RzIG9uIHRoZSBib2FyZCAqLworCWZvciAoZGltbV9udW0gPSAwOyBkaW1tX251bSA8IG51bV9kaW1tX2JhbmtzOyBkaW1tX251bSsrKSB7CisJCS8qIElmIGEgZGltbSBpcyBpbnN0YWxsZWQgaW4gYSBwYXJ0aWN1bGFyIHNsb3QgLi4uICovCisJCWlmIChkaW1tX3JhbmtzW2RpbW1fbnVtXSkgeworCQkJdW5zaWduZWQgbG9uZyBwczsKKworCQkJcHMgPSAyNTAgKiBzcGRfcmVhZChpaWMwX2RpbW1fYWRkcltkaW1tX251bV0sIDI5KTsKKwkJCXRfcmNkX3BzID0gbWF4KHRfcmNkX3BzLCBwcyk7CisJCX0KKwl9CisJZGVidWcoInRfcmNkX3BzID0gJWRcbiIsIHRfcmNkX3BzKTsKKwl0X3JjZF9jbGsgPSAoTVVMRElWNjQoc2RyYW1fZnJlcSwgdF9yY2RfcHMsIE9ORV9CSUxMSU9OKSArIDk5OSkgLyAxMDAwOworCW10c2RyYW0oRERSMF80NCwgRERSMF80NF9UUkNEX0VOQ09ERSh0X3JjZF9jbGspKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIGluaXRkcmFtLiAgSW5pdGlhbGl6ZXMgdGhlIDQ0MEVQeC9HUHggRERSIFNEUkFNIGNvbnRyb2xsZXIuCisgKiBOb3RlOiBUaGlzIHJvdXRpbmUgcnVucyBmcm9tIGZsYXNoIHdpdGggYSBzdGFjayBzZXQgdXAgaW4gdGhlIGNoaXAncworICogc3JhbSBzcGFjZS4gIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSByb3V0aW5lIGRvZXMgbm90IHJlcXVpcmUgLnNic3MsIC5ic3Mgb3IKKyAqIC5kYXRhIHNlY3Rpb25zLiAgSXQgYWxzbyBjYW5ub3QgY2FsbCByb3V0aW5lcyB0aGF0IHJlcXVpcmUgdGhlc2Ugc2VjdGlvbnMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOgkgaW5pdGRyYW0KKyAqIERlc2NyaXB0aW9uOiAgQ29uZmlndXJlcyBTRFJBTSBtZW1vcnkgYmFua3MgZm9yIEREUiBvcGVyYXRpb24uCisgKgkJIEF1dG8gTWVtb3J5IENvbmZpZ3VyYXRpb24gb3B0aW9uIHJlYWRzIHRoZSBERFIgU0RSQU0gRUVQUk9NcworICoJCSB2aWEgdGhlIElJQyBidXMgYW5kIHRoZW4gY29uZmlndXJlcyB0aGUgRERSIFNEUkFNIG1lbW9yeQorICoJCSBiYW5rcyBhcHByb3ByaWF0ZWx5LiBJZiBBdXRvIE1lbW9yeSBDb25maWd1cmF0aW9uIGlzCisgKgkJIG5vdCB1c2VkLCBpdCBpcyBhc3N1bWVkIHRoYXQgbm8gRElNTSBpcyBwbHVnZ2VkCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3BoeXNfc2l6ZV90IGluaXRkcmFtKGludCBib2FyZF90eXBlKQoreworCXVuc2lnbmVkIGNoYXIgY29uc3QgaWljMF9kaW1tX2FkZHJbXSA9IFNQRF9FRVBST01fQUREUkVTUzsKKwl1bnNpZ25lZCBsb25nIGRpbW1fcmFua3NbTUFYRElNTVNdOworCXVuc2lnbmVkIGxvbmcgcmFua3M7CisJdW5zaWduZWQgbG9uZyByb3dzOworCXVuc2lnbmVkIGxvbmcgYmFua3M7CisJdW5zaWduZWQgbG9uZyBjb2xzOworCXVuc2lnbmVkIGxvbmcgd2lkdGg7CisJdW5zaWduZWQgbG9uZyBjb25zdCBzZHJhbV9mcmVxID0gZ2V0X2J1c19mcmVxKDApOworCXVuc2lnbmVkIGxvbmcgY29uc3QgbnVtX2RpbW1fYmFua3MgPSBzaXplb2YoaWljMF9kaW1tX2FkZHIpOwkvKiBvbiBib2FyZCBkaW1tIGJhbmtzICovCisJdW5zaWduZWQgbG9uZyBjYXNfbGF0ZW5jeSA9IDA7CS8qIHRvIHF1aWV0IGluaXRpYWxpemF0aW9uIHdhcm5pbmcgKi8KKwl1bnNpZ25lZCBsb25nIGRyYW1fc2l6ZTsKKworCWRlYnVnKCJcbkVudGVyaW5nIGluaXRkcmFtKClcbiIpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTdG9wIHRoZSBERFItU0RSQU0gY29udHJvbGxlci4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltdHNkcmFtKEREUjBfMDIsIEREUjBfMDJfU1RBUlRfRU5DT0RFKDApKTsKKworCS8qCisJICogTWFrZSBzdXJlIEkyQyBjb250cm9sbGVyIGlzIGluaXRpYWxpemVkCisJICogYmVmb3JlIGNvbnRpbnVpbmcuCisJICovCisJLyogc3dpdGNoIHRvIGNvcnJlY3QgSTJDIGJ1cyAqLworCUkyQ19TRVRfQlVTKENPTkZJR19TWVNfU1BEX0JVU19OVU0pOworCWkyY19pbml0KENPTkZJR19TWVNfSTJDX1NQRUVELCBDT05GSUdfU1lTX0kyQ19TTEFWRSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIENsZWFyIG91dCB0aGUgc2VyaWFsIHByZXNlbmNlIGRldGVjdCBidWZmZXJzLgorCSAqIFBlcmZvcm0gSUlDIHJlYWRzIGZyb20gdGhlIGRpbW0uICBGaWxsIGluIHRoZSBzcGRzLgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgZGltbSBzbG90cyBhcmUgcG9wdWxhdGVkCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZ2V0X3NwZF9pbmZvKGRpbW1fcmFua3MsICZyYW5rcywgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogQ2hlY2sgdGhlIGZyZXF1ZW5jeSBzdXBwb3J0ZWQgZm9yIHRoZSBkaW1tcyBwbHVnZ2VkLgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWNoZWNrX2ZyZXF1ZW5jeShkaW1tX3JhbmtzLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MsIHNkcmFtX2ZyZXEpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBDaGVjayBhbmQgZ2V0IHNpemUgaW5mb3JtYXRpb24uCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZ2V0X2RpbW1fc2l6ZShkaW1tX3JhbmtzLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MsICZyb3dzLCAmYmFua3MsCisJCSAgICAgICZjb2xzLCAmd2lkdGgpOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBDaGVjayB0aGUgdm9sdGFnZSB0eXBlIGZvciB0aGUgZGltbXMgcGx1Z2dlZC4KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwljaGVja192b2x0YWdlX3R5cGUoZGltbV9yYW5rcywgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzKTsKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogUHJvZ3JhbSByZWdpc3RlcnMgZm9yIFNEUkFNIGNvbnRyb2xsZXIuCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbXRzZHJhbShERFIwXzAwLCBERFIwXzAwX0RMTF9JTkNSRU1FTlRfRU5DT0RFKDB4MTkpIHwKKwkJRERSMF8wMF9ETExfU1RBUlRfUE9JTlRfREVDT0RFKDB4MEEpKTsKKworCW10c2RyYW0oRERSMF8wMSwgRERSMF8wMV9QTEIwX0RCX0NTX0xPV0VSX0VOQ09ERSgweDAxKSB8CisJCUREUjBfMDFfUExCMF9EQl9DU19VUFBFUl9FTkNPREUoMHgwMCkgfAorCQlERFIwXzAxX0lOVF9NQVNLX0VOQ09ERSgweEZGKSk7CisKKwlwcm9ncmFtX2RkcjBfMDMoZGltbV9yYW5rcywgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzLCBzZHJhbV9mcmVxLAorCQkJcm93cywgJmNhc19sYXRlbmN5KTsKKworCXByb2dyYW1fZGRyMF8wNChkaW1tX3JhbmtzLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MsIHNkcmFtX2ZyZXEpOworCisJcHJvZ3JhbV9kZHIwXzA1KGRpbW1fcmFua3MsIGlpYzBfZGltbV9hZGRyLCBudW1fZGltbV9iYW5rcywgc2RyYW1fZnJlcSk7CisKKwlwcm9ncmFtX2RkcjBfMDYoZGltbV9yYW5rcywgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzLCBzZHJhbV9mcmVxKTsKKworCS8qCisJICogVE9ETzogdEZBVyBub3QgZm91bmQgaW4gU1BELiAgVmFsdWUgb2YgMTMgdGFrZW4gZnJvbSBTZXF1b2lhCisJICogYm9hcmQgU0RSQU0sIGJ1dCBtYXkgYmUgb3Zlcmx5IGNvbnNlcnZhdGl2ZS4KKwkgKi8KKwltdHNkcmFtKEREUjBfMDcsIEREUjBfMDdfTk9fQ01EX0lOSVRfRU5DT0RFKDApIHwKKwkJRERSMF8wN19URkFXX0VOQ09ERSgxMykgfAorCQlERFIwXzA3X0FVVE9fUkVGUkVTSF9NT0RFX0VOQ09ERSgxKSB8CisJCUREUjBfMDdfQVJFRlJFU0hfRU5DT0RFKDApKTsKKworCW10c2RyYW0oRERSMF8wOCwgRERSMF8wOF9XUkxBVF9FTkNPREUoY2FzX2xhdGVuY3kgLSAxKSB8CisJCUREUjBfMDhfVENQRF9FTkNPREUoMjAwKSB8IEREUjBfMDhfRFFTX05fRU5fRU5DT0RFKDApIHwKKwkJRERSMF8wOF9ERFJJSV9FTkNPREUoMSkpOworCisJbXRzZHJhbShERFIwXzA5LCBERFIwXzA5X09DRF9BREpVU1RfUEROX0NTXzBfRU5DT0RFKDB4MDApIHwKKwkJRERSMF8wOV9SVFRfMF9FTkNPREUoMHgxKSB8CisJCUREUjBfMDlfV1JfRFFTX1NISUZUX0JZUEFTU19FTkNPREUoMHgxRCkgfAorCQlERFIwXzA5X1dSX0RRU19TSElGVF9FTkNPREUoRFFTX09VVF9TSElGVCAtIDB4MjApKTsKKworCXByb2dyYW1fZGRyMF8xMChkaW1tX3JhbmtzLCByYW5rcyk7CisKKwlwcm9ncmFtX2RkcjBfMTEoc2RyYW1fZnJlcSk7CisKKwltdHNkcmFtKEREUjBfMTIsIEREUjBfMTJfVENLRV9FTkNPREUoMykpOworCisJbXRzZHJhbShERFIwXzE0LCBERFIwXzE0X0RMTF9CWVBBU1NfTU9ERV9FTkNPREUoMCkgfAorCQlERFIwXzE0X1JFRFVDX0VOQ09ERSh3aWR0aCA8PSA0MCA/IDEgOiAwKSB8CisJCUREUjBfMTRfUkVHX0RJTU1fRU5BQkxFX0VOQ09ERSgwKSk7CisKKwltdHNkcmFtKEREUjBfMTcsIEREUjBfMTdfRExMX0RRU19ERUxBWV8wX0VOQ09ERShETExfRFFTX0RFTEFZKSk7CisKKwltdHNkcmFtKEREUjBfMTgsIEREUjBfMThfRExMX0RRU19ERUxBWV80X0VOQ09ERShETExfRFFTX0RFTEFZKSB8CisJCUREUjBfMThfRExMX0RRU19ERUxBWV8zX0VOQ09ERShETExfRFFTX0RFTEFZKSB8CisJCUREUjBfMThfRExMX0RRU19ERUxBWV8yX0VOQ09ERShETExfRFFTX0RFTEFZKSB8CisJCUREUjBfMThfRExMX0RRU19ERUxBWV8xX0VOQ09ERShETExfRFFTX0RFTEFZKSk7CisKKwltdHNkcmFtKEREUjBfMTksIEREUjBfMTlfRExMX0RRU19ERUxBWV84X0VOQ09ERShETExfRFFTX0RFTEFZKSB8CisJCUREUjBfMTlfRExMX0RRU19ERUxBWV83X0VOQ09ERShETExfRFFTX0RFTEFZKSB8CisJCUREUjBfMTlfRExMX0RRU19ERUxBWV82X0VOQ09ERShETExfRFFTX0RFTEFZKSB8CisJCUREUjBfMTlfRExMX0RRU19ERUxBWV81X0VOQ09ERShETExfRFFTX0RFTEFZKSk7CisKKwltdHNkcmFtKEREUjBfMjAsIEREUjBfMjBfRExMX0RRU19CWVBBU1NfM19FTkNPREUoRExMX0RRU19CWVBBU1MpIHwKKwkJRERSMF8yMF9ETExfRFFTX0JZUEFTU18yX0VOQ09ERShETExfRFFTX0JZUEFTUykgfAorCQlERFIwXzIwX0RMTF9EUVNfQllQQVNTXzFfRU5DT0RFKERMTF9EUVNfQllQQVNTKSB8CisJCUREUjBfMjBfRExMX0RRU19CWVBBU1NfMF9FTkNPREUoRExMX0RRU19CWVBBU1MpKTsKKworCW10c2RyYW0oRERSMF8yMSwgRERSMF8yMV9ETExfRFFTX0JZUEFTU183X0VOQ09ERShETExfRFFTX0JZUEFTUykgfAorCQlERFIwXzIxX0RMTF9EUVNfQllQQVNTXzZfRU5DT0RFKERMTF9EUVNfQllQQVNTKSB8CisJCUREUjBfMjFfRExMX0RRU19CWVBBU1NfNV9FTkNPREUoRExMX0RRU19CWVBBU1MpIHwKKwkJRERSMF8yMV9ETExfRFFTX0JZUEFTU180X0VOQ09ERShETExfRFFTX0JZUEFTUykpOworCisJcHJvZ3JhbV9kZHIwXzIyKGRpbW1fcmFua3MsIGlpYzBfZGltbV9hZGRyLCBudW1fZGltbV9iYW5rcywgd2lkdGgpOworCisJbXRzZHJhbShERFIwXzIzLCBERFIwXzIzX09EVF9SRF9NQVBfQ1MwX0VOQ09ERSgweDApIHwKKwkJRERSMF8yM19GV0NfRU5DT0RFKDApKTsKKworCXByb2dyYW1fZGRyMF8yNChyYW5rcyk7CisKKwlwcm9ncmFtX2RkcjBfMjYoc2RyYW1fZnJlcSk7CisKKwlwcm9ncmFtX2RkcjBfMjcoc2RyYW1fZnJlcSk7CisKKwltdHNkcmFtKEREUjBfMjgsIEREUjBfMjhfRU1SUzNfREFUQV9FTkNPREUoMHgwMDAwKSB8CisJCUREUjBfMjhfRU1SUzJfREFUQV9FTkNPREUoMHgwMDAwKSk7CisKKwltdHNkcmFtKEREUjBfMzEsIEREUjBfMzFfWE9SX0NIRUNLX0JJVFNfRU5DT0RFKDB4MDAwMCkpOworCisJbXRzZHJhbShERFIwXzQyLCBERFIwXzQyX0FERFJfUElOU19FTkNPREUoMTQgLSByb3dzKSB8CisJCUREUjBfNDJfQ0FTTEFUX0xJTl9HQVRFX0VOQ09ERSgyICogY2FzX2xhdGVuY3kpKTsKKworCXByb2dyYW1fZGRyMF80MyhkaW1tX3JhbmtzLCBpaWMwX2RpbW1fYWRkciwgbnVtX2RpbW1fYmFua3MsIHNkcmFtX2ZyZXEsCisJCQljb2xzLCBiYW5rcyk7CisKKwlwcm9ncmFtX2RkcjBfNDQoZGltbV9yYW5rcywgaWljMF9kaW1tX2FkZHIsIG51bV9kaW1tX2JhbmtzLCBzZHJhbV9mcmVxKTsKKworCWRlbmFsaV9zZHJhbV9yZWdpc3Rlcl9kdW1wKCk7CisKKwlkcmFtX3NpemUgPSAod2lkdGggPj0gNjQpID8gOCA6IDQ7CisJZHJhbV9zaXplICo9IDEgPDwgY29sczsKKwlkcmFtX3NpemUgKj0gYmFua3M7CisJZHJhbV9zaXplICo9IDEgPDwgcm93czsKKwlkcmFtX3NpemUgKj0gcmFua3M7CisJZGVidWcoImRyYW1fc2l6ZSA9ICVsdVxuIiwgZHJhbV9zaXplKTsKKworCS8qIFN0YXJ0IHRoZSBTRFJBTSBjb250cm9sZXIgKi8KKwltdHNkcmFtKEREUjBfMDIsIEREUjBfMDJfU1RBUlRfRU5DT0RFKDEpKTsKKwlkZW5hbGlfd2FpdF9mb3JfZGxsbG9jaygpOworCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0RBVEFfRVlFKQorCS8qCisJICogTWFwIHRoZSBmaXJzdCAxIE1pQiBvZiBtZW1vcnkgaW4gdGhlIFRMQiwgYW5kIHBlcmZvcm0gdGhlIGRhdGEgZXllCisJICogc2VhcmNoLgorCSAqLworCXByb2dyYW1fdGxiKDAsIENPTkZJR19TWVNfU0RSQU1fQkFTRSwgVExCXzFNQl9TSVpFLCBUTEJfV09SRDJfSV9FTkFCTEUpOworCWRlbmFsaV9jb3JlX3NlYXJjaF9kYXRhX2V5ZSgpOworCWRlbmFsaV9zZHJhbV9yZWdpc3Rlcl9kdW1wKCk7CisJcmVtb3ZlX3RsYihDT05GSUdfU1lTX1NEUkFNX0JBU0UsIFRMQl8xTUJfU0laRSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1pFUk9fU0RSQU0pIHx8IGRlZmluZWQoQ09ORklHX0REUl9FQ0MpCisJcHJvZ3JhbV90bGIoMCwgQ09ORklHX1NZU19TRFJBTV9CQVNFLCBkcmFtX3NpemUsIDApOworCXN5bmMoKTsKKwkvKiBaZXJvIHRoZSBtZW1vcnkgKi8KKwlkZWJ1ZygiWmVyb2luZyBTRFJBTS4uLiIpOworI2lmIGRlZmluZWQoQ09ORklHX1NZU19NRU1fVE9QX0hJREUpCisJZGNiel9hcmVhKENPTkZJR19TWVNfU0RSQU1fQkFTRSwgZHJhbV9zaXplIC0gQ09ORklHX1NZU19NRU1fVE9QX0hJREUpOworI2Vsc2UKKyNlcnJvciBQbGVhc2UgZGVmaW5lIENPTkZJR19TWVNfTUVNX1RPUF9ISURFIChzZWUgUkVBRE1FKSBpbiB5b3VyIGJvYXJkIGNvbmZpZyBmaWxlCisjZW5kaWYKKwkvKiBXcml0ZSBtb2RpZmllZCBkY2FjaGUgbGluZXMgYmFjayB0byBtZW1vcnkgKi8KKwljbGVhbl9kY2FjaGVfcmFuZ2UoQ09ORklHX1NZU19TRFJBTV9CQVNFLCBDT05GSUdfU1lTX1NEUkFNX0JBU0UgKyBkcmFtX3NpemUgLSBDT05GSUdfU1lTX01FTV9UT1BfSElERSk7CisJZGVidWcoIkNvbXBsZXRlZFxuIik7CisJc3luYygpOworCXJlbW92ZV90bGIoQ09ORklHX1NZU19TRFJBTV9CQVNFLCBkcmFtX3NpemUpOworCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykKKwkvKgorCSAqIElmIEVDQyBpcyBlbmFibGVkLCBjbGVhciBhbmQgZW5hYmxlIGludGVycnVwdHMKKwkgKi8KKwlpZiAoaXNfZWNjX2VuYWJsZWQoKSkgeworCQl1MzIgdmFsOworCisJCXN5bmMoKTsKKwkJLyogQ2xlYXIgZXJyb3Igc3RhdHVzICovCisJCW1mc2RyYW0oRERSMF8wMCwgdmFsKTsKKwkJbXRzZHJhbShERFIwXzAwLCB2YWwgfCBERFIwXzAwX0lOVF9BQ0tfQUxMKTsKKwkJLyogU2V0ICdpbnRfbWFzaycgcGFyYW1ldGVyIHRvIGZ1bmN0aW9ubmFsIHZhbHVlICovCisJCW1mc2RyYW0oRERSMF8wMSwgdmFsKTsKKwkJbXRzZHJhbShERFIwXzAxLCAodmFsICYgfkREUjBfMDFfSU5UX01BU0tfTUFTSykgfAorCQkJRERSMF8wMV9JTlRfTUFTS19BTExfT0ZGKTsKKyNpZiBkZWZpbmVkKENPTkZJR19ERFJfREFUQV9FWUUpCisJCS8qCisJCSAqIFJ1bm5pbmcgZGVuYWxpX2NvcmVfc2VhcmNoX2RhdGFfZXllKCkgd2hlbiBFQ0MgaXMgZW5hYmxlZAorCQkgKiBjYXVzZXMgbm9uLUVDQyBtYWNoaW5lIGNoZWNrcy4gIFRoaXMgY2xlYXJzIHRoZW0uCisJCSAqLworCQlwcmludF9tY3NyKCk7CisJCW10c3ByKFNQUk5fTUNTUiwgbWZzcHIoU1BSTl9NQ1NSKSk7CisJCXByaW50X21jc3IoKTsKKyNlbmRpZgorCQlzeW5jKCk7CisJfQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfWkVST19TRFJBTSkgfHwgZGVmaW5lZChDT05GSUdfRERSX0VDQykgKi8KKworCXByb2dyYW1fdGxiKDAsIENPTkZJR19TWVNfU0RSQU1fQkFTRSwgZHJhbV9zaXplLCBNWV9UTEJfV09SRDJfSV9FTkFCTEUpOworCXJldHVybiBkcmFtX3NpemU7Cit9CisKK3ZvaWQgYm9hcmRfYWRkX3JhbV9pbmZvKGludCB1c2VfZGVmYXVsdCkKK3sKKwl1MzIgdmFsOworCisJcHJpbnRmKCIgKEVDQyIpOworCWlmICghaXNfZWNjX2VuYWJsZWQoKSkgeworCQlwcmludGYoIiBub3QiKTsKKwl9CisJcHJpbnRmKCIgZW5hYmxlZCwgJWxkIE1IeiIsICgyICogZ2V0X2J1c19mcmVxKDApKSAvIDEwMDAwMDApOworCisJbWZzZHJhbShERFIwXzAzLCB2YWwpOworCXByaW50ZigiLCBDTCVkKSIsIEREUjBfMDNfQ0FTTEFUX0xJTl9ERUNPREUodmFsKSA+PiAxKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU1BEX0VFUFJPTSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZWNjLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9lY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA1NjA1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZWNjLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMDggTnVvdmF0aW9uIFN5c3RlbSBEZXNpZ25zLCBMTEMKKyAqICAgICAgR3JhbnQgRXJpY2tzb24gPGdlcmlja3NvbkBudW92YXRpb25zLmNvbT4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDUtMjAwOQorICogICAgU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwMgorICogICAgSnVuIEd1LCBBcnRlc3luIFRlY2hub2xvZ3ksIGp1bmdAYXJ0ZXN5bmNwLmNvbQorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwMQorICogICAgQmlsbCBIdW50ZXIsIFdhdmUgNyBPcHRpY3MsIHdpbGxpYW1odW50ZXJAYXR0YmkuY29tCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGFiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKglUaGlzIGZpbGUgaW1wbGVtZW50cyBnZW5lcmljIERSQU0gRUNDIGluaXRpYWxpemF0aW9uIGZvcgorICoJUG93ZXJQQyBwcm9jZXNzb3JzIHVzaW5nIGEgU0RSQU0gRERSL0REUjIgY29udHJvbGxlciwKKyAqCWluY2x1ZGluZyB0aGUgNDA1RVgociksIDQ0MEdQL0dYL0VQL0dSLCA0NDBTUChFKSwgYW5kCisgKgk0NjBFWC9HVC4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKworI2luY2x1ZGUgImVjYy5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfU0RSQU1fUFBDNHh4X0lCTV9ERFIpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19TRFJBTV9QUEM0eHhfSUJNX0REUjIpCisjaWYgZGVmaW5lZChDT05GSUdfRERSX0VDQykgfHwgZGVmaW5lZChDT05GSUdfU0RSQU1fRUNDKQorCisjaWYgZGVmaW5lZChDT05GSUdfNDA1RVgpCisvKgorICogQ3VycmVudGx5IG9ubHkgNDA1RVggdXNlcyAxNmJpdCBkYXRhIGJ1cyB3aWR0aCBhcyBhbiBhbHRlcm5hdGl2ZQorICogb3B0aW9uIHRvIDMyYml0IGRhdGEgd2lkdGggKFNEUkFNMF9NQ09QVDFfV0RUSCkKKyAqLworI2RlZmluZSBTRFJBTV9EQVRBX0FMVF9XSURUSAkyCisjZWxzZQorI2RlZmluZSBTRFJBTV9EQVRBX0FMVF9XSURUSAk4CisjZW5kaWYKKworc3RhdGljIHZvaWQgd2FpdF9kZHJfaWRsZSh2b2lkKQoreworCXUzMiB2YWw7CisKKwlkbyB7CisJCW1mc2RyYW0oU0RSQU1fTUNTVEFULCB2YWwpOworCX0gd2hpbGUgKCh2YWwgJiBTRFJBTV9NQ1NUQVRfSURMRV9NQVNLKSA9PSBTRFJBTV9NQ1NUQVRfSURMRV9OT1QpOworfQorCitzdGF0aWMgdm9pZCBwcm9ncmFtX2VjY19hZGRyKHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzcywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBudW1fYnl0ZXMsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgdGxiX3dvcmQyX2lfdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBjdXJyZW50X2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBlbmRfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3NfaW5jcmVtZW50OworCXVuc2lnbmVkIGxvbmcgbWNvcHQxOworCWNoYXIgc3RyW10gPSAiRUNDIGdlbmVyYXRpb24gLSI7CisJY2hhciBzbGFzaFtdID0gIlxcfC8tXFx8Ly0iOworCWludCBsb29wID0gMDsKKwlpbnQgbG9vcGkgPSAwOworCisJY3VycmVudF9hZGRyZXNzID0gc3RhcnRfYWRkcmVzczsKKwltZnNkcmFtKFNEUkFNX01DT1BUMSwgbWNvcHQxKTsKKwlpZiAoKG1jb3B0MSAmIFNEUkFNX01DT1BUMV9NQ0hLX01BU0spICE9IFNEUkFNX01DT1BUMV9NQ0hLX05PTikgeworCQltdHNkcmFtKFNEUkFNX01DT1BUMSwKKwkJCShtY29wdDEgJiB+U0RSQU1fTUNPUFQxX01DSEtfTUFTSykgfCBTRFJBTV9NQ09QVDFfTUNIS19HRU4pOworCQlzeW5jKCk7CisJCWVpZWlvKCk7CisJCXdhaXRfZGRyX2lkbGUoKTsKKworCQlwdXRzKHN0cik7CisKKyNpZmRlZiBDT05GSUdfNDQwCisJCWlmICh0bGJfd29yZDJfaV92YWx1ZSA9PSBUTEJfV09SRDJfSV9FTkFCTEUpIHsKKyNlbmRpZgorCQkJLyogRUNDIGJpdCBzZXQgbWV0aG9kIGZvciBub24tY2FjaGVkIG1lbW9yeSAqLworCQkJaWYgKChtY29wdDEgJiBTRFJBTV9NQ09QVDFfRE1XRF9NQVNLKSA9PSBTRFJBTV9NQ09QVDFfRE1XRF8zMikKKwkJCQlhZGRyZXNzX2luY3JlbWVudCA9IDQ7CisJCQllbHNlCisJCQkJYWRkcmVzc19pbmNyZW1lbnQgPSBTRFJBTV9EQVRBX0FMVF9XSURUSDsKKwkJCWVuZF9hZGRyZXNzID0gY3VycmVudF9hZGRyZXNzICsgbnVtX2J5dGVzOworCisJCQl3aGlsZSAoY3VycmVudF9hZGRyZXNzIDwgZW5kX2FkZHJlc3MpIHsKKwkJCQkqKCh1bnNpZ25lZCBsb25nICopY3VycmVudF9hZGRyZXNzKSA9IDA7CisJCQkJY3VycmVudF9hZGRyZXNzICs9IGFkZHJlc3NfaW5jcmVtZW50OworCisJCQkJaWYgKChsb29wKysgJSAoMiA8PCAyMCkpID09IDApIHsKKwkJCQkJcHV0YygnXGInKTsKKwkJCQkJcHV0YyhzbGFzaFtsb29waSsrICUgOF0pOworCQkJCX0KKwkJCX0KKyNpZmRlZiBDT05GSUdfNDQwCisJCX0gZWxzZSB7CisJCQkvKiBFQ0MgYml0IHNldCBtZXRob2QgZm9yIGNhY2hlZCBtZW1vcnkgKi8KKwkJCWRjYnpfYXJlYShzdGFydF9hZGRyZXNzLCBudW1fYnl0ZXMpOworCQkJLyogV3JpdGUgbW9kaWZpZWQgZGNhY2hlIGxpbmVzIGJhY2sgdG8gbWVtb3J5ICovCisJCQljbGVhbl9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcmVzcywgc3RhcnRfYWRkcmVzcyArIG51bV9ieXRlcyk7CisJCX0KKyNlbmRpZiAvKiBDT05GSUdfNDQwICovCisKKwkJYmxhbmtfc3RyaW5nKHN0cmxlbihzdHIpKTsKKworCQlzeW5jKCk7CisJCWVpZWlvKCk7CisJCXdhaXRfZGRyX2lkbGUoKTsKKworCQkvKiBjbGVhciBFQ0MgZXJyb3IgcmVwb3RpbmcgcmVnaXN0ZXJzICovCisJCW10c2RyYW0oU0RSQU1fRUNDRVMsIDB4ZmZmZmZmZmYpOworCQltdGRjcigweDRjLCAweGZmZmZmZmZmKTsKKworCQltdHNkcmFtKFNEUkFNX01DT1BUMSwKKwkJCShtY29wdDEgJiB+U0RSQU1fTUNPUFQxX01DSEtfTUFTSykgfCBTRFJBTV9NQ09QVDFfTUNIS19DSEtfUkVQKTsKKwkJc3luYygpOworCQllaWVpbygpOworCQl3YWl0X2Rkcl9pZGxlKCk7CisJfQorfQorCisjaWYgZGVmaW5lZChDT05GSUdfU0RSQU1fUFBDNHh4X0lCTV9ERFIpCit2b2lkIGVjY19pbml0KHVuc2lnbmVkIGxvbmcgKiBjb25zdCBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCS8qCisJICogSW5pdCBFQ0Mgd2l0aCBjYWNoZSBkaXNhYmxlZCAob24gUFBDJ3Mgd2l0aCBJQk0gRERSCisJICogY29udHJvbGxlciAobm9uIEREUjIpLCBub3QgdGVzdGVkIHdpdGggY2FjaGUgZW5hYmxlZCB5ZXQKKwkgKi8KKwlwcm9ncmFtX2VjY19hZGRyKCh1MzIpc3RhcnQsIHNpemUsIFRMQl9XT1JEMl9JX0VOQUJMRSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NEUkFNX1BQQzR4eF9JQk1fRERSMikKK3ZvaWQgZG9fcHJvZ3JhbV9lY2ModW5zaWduZWQgbG9uZyB0bGJfd29yZDJfaV92YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1jb3B0MTsKKwl1bnNpZ25lZCBsb25nIG1jb3B0MjsKKwl1bnNpZ25lZCBsb25nIG1jc3RhdDsKKwlwaHlzX3NpemVfdCBtZW1zaXplID0gc2RyYW1fbWVtc2l6ZSgpOworCisJaWYgKG1lbXNpemUgPiBDT05GSUdfTUFYX01FTV9NQVBQRUQpIHsKKwkJcHJpbnRmKCJcbldhcm5pbmc6IENhbid0IGVuYWJsZSBFQ0Mgb24gc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiAyR0Igb2YgU0RSQU0hXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1mc2RyYW0oU0RSQU1fTUNPUFQxLCBtY29wdDEpOworCW1mc2RyYW0oU0RSQU1fTUNPUFQyLCBtY29wdDIpOworCisJaWYgKChtY29wdDEgJiBTRFJBTV9NQ09QVDFfTUNIS19NQVNLKSAhPSBTRFJBTV9NQ09QVDFfTUNIS19OT04pIHsKKwkJLyogRERSIGNvbnRyb2xsZXIgbXVzdCBiZSBlbmFibGVkIGFuZCBub3QgaW4gc2VsZi1yZWZyZXNoLiAqLworCQltZnNkcmFtKFNEUkFNX01DU1RBVCwgbWNzdGF0KTsKKwkJaWYgKCgobWNvcHQyICYgU0RSQU1fTUNPUFQyX0RDRU5fTUFTSykgPT0gU0RSQU1fTUNPUFQyX0RDRU5fRU5BQkxFKQorCQkgICAgJiYgKChtY29wdDIgJiBTRFJBTV9NQ09QVDJfU1JFTl9NQVNLKSA9PSBTRFJBTV9NQ09QVDJfU1JFTl9FWElUKQorCQkgICAgJiYgKChtY3N0YXQgJiAoU0RSQU1fTUNTVEFUX01JQ19NQVNLIHwgU0RSQU1fTUNTVEFUX1NSTVNfTUFTSykpCisJCQk9PSAoU0RSQU1fTUNTVEFUX01JQ19DT01QIHwgU0RSQU1fTUNTVEFUX1NSTVNfTk9UX1NGKSkpIHsKKworCQkJcHJvZ3JhbV9lY2NfYWRkcigwLCBtZW1zaXplLCB0bGJfd29yZDJfaV92YWx1ZSk7CisJCX0KKwl9Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0REUl9FQ0MpIHx8IGRlZmluZWQoQ09ORklHX1NEUkFNX0VDQykgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TRFJBTV9QUEM0eHhfSUJNX0REUikuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L2VjYy5oIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZWNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1ODg5MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L2VjYy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMDggTnVvdmF0aW9uIFN5c3RlbSBEZXNpZ25zLCBMTEMKKyAqCUdyYW50IEVyaWNrc29uIDxnZXJpY2tzb25AbnVvdmF0aW9ucy5jb20+CisgKgorICogICAgQ29weXJpZ2h0IChjKSAyMDA3LTIwMDkgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgR21iSAorICoJU3RlZmFuIFJvZXNlIDxzckBkZW54LmRlPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBhYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICoJVGhpcyBmaWxlIGltcGxlbWVudHMgRUNDIGluaXRpYWxpemF0aW9uIGZvciBQb3dlclBDIHByb2Nlc3NvcnMKKyAqCXVzaW5nIHRoZSBJQk0gU0RSQU0gRERSMSAmIEREUjIgY29udHJvbGxlci4KKyAqCisgKi8KKworI2lmbmRlZiBfRUNDX0hfCisjZGVmaW5lIF9FQ0NfSF8KKworLyoKKyAqIFNpbmNlIHRoZSBJQk0gRERSIGNvbnRyb2xsZXIgdXNlZCBvbiA0NDBHUC9HWC9FUC9HUiBpcyBub3QgcmVnaXN0ZXIKKyAqIGNvbXBhdGlibGUgdG8gdGhlIElCTSBERFIvMiBjb250cm9sbGVyIHVzZWQgb24gNDA1RVgvNDQwU1AvU1BlLzQ2MEVYL0dUCisgKiB3ZSBuZWVkIHRvIG1ha2Ugc29tZSBwcm9jZXNzb3IgZGVwZW5kYW50IGRlZmluZXMgdXNlZCBsYXRlciBvbiBieSB0aGUKKyAqIGRyaXZlci4KKyAqLworCisvKiBGb3IgNDQwR1AvR1gvRVAvR1IgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TRFJBTV9QUEM0eHhfSUJNX0REUikKKyNkZWZpbmUgU0RSQU1fTUNPUFQxCQlTRFJBTV9DRkcwCisjZGVmaW5lIFNEUkFNX01DT1BUMV9NQ0hLX01BU0sJU0RSQU1fQ0ZHMF9NQ0hLX01BU0sKKyNkZWZpbmUgU0RSQU1fTUNPUFQxX01DSEtfTk9OCVNEUkFNX0NGRzBfTUNIS19OT04KKyNkZWZpbmUgU0RSQU1fTUNPUFQxX01DSEtfR0VOCVNEUkFNX0NGRzBfTUNIS19HRU4KKyNkZWZpbmUgU0RSQU1fTUNPUFQxX01DSEtfQ0hLCVNEUkFNX0NGRzBfTUNIS19DSEsKKyNkZWZpbmUgU0RSQU1fTUNPUFQxX01DSEtfQ0hLX1JFUCBTRFJBTV9DRkcwX01DSEtfQ0hLCisjZGVmaW5lIFNEUkFNX01DT1BUMV9ETVdEX01BU0sJU0RSQU1fQ0ZHMF9ETVdEX01BU0sKKyNkZWZpbmUgU0RSQU1fTUNPUFQxX0RNV0RfMzIJU0RSQU1fQ0ZHMF9ETVdEXzMyCisKKyNkZWZpbmUgU0RSQU1fTUNTVEFUCQlTRFJBTTBfTUNTVFMKKyNkZWZpbmUgU0RSQU1fTUNTVEFUX0lETEVfTUFTSwlTRFJBTV9NQ1NUU19DSVMKKyNkZWZpbmUgU0RSQU1fTUNTVEFUX0lETEVfTk9UCVNEUkFNX01DU1RTX0lETEVfTk9UCisKKyNkZWZpbmUgU0RSQU1fRUNDRVMJCVNEUkFNMF9FQ0NFU1IKKyNlbmRpZgorCit2b2lkIGVjY19pbml0KHVuc2lnbmVkIGxvbmcgKiBjb25zdCBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKK3ZvaWQgZG9fcHJvZ3JhbV9lY2ModW5zaWduZWQgbG9uZyB0bGJfd29yZDJfaV92YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGlubGluZSBibGFua19zdHJpbmcoaW50IHNpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlwdXRjKCdcYicpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXB1dGMoJyAnKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQlwdXRjKCdcYicpOworfQorCisjZW5kaWYgLyogX0VDQ19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZmR0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9mZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWExODRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvZmR0LmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDctMjAwOAorICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxwcGM0eHguaD4KKworI2lmIGRlZmluZWQoQ09ORklHX09GX0xJQkZEVCkgJiYgZGVmaW5lZChDT05GSUdfT0ZfQk9BUkRfU0VUVVApCisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjaW5jbHVkZSA8YXNtLzR4eF9wY2llLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCit2b2lkIF9fZnRfYm9hcmRfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJaW50IHJjOworCWludCBpOworCXUzMiBieGNyOworCXUzMiByYW5nZXNbRUJDX05VTV9CQU5LUyAqIDRdOworCXUzMiAqcCA9IHJhbmdlczsKKwljaGFyIGViY19wYXRoW10gPSAiL3BsYi9vcGIvZWJjIjsKKworCWZ0X2NwdV9zZXR1cChibG9iLCBiZCk7CisKKwkvKgorCSAqIFJlYWQgNHh4IEVCQyBidXMgYnJpZGdlIHJlZ2lzdGVycyB0byBnZXQgbWFwcGluZ3Mgb2YgdGhlCisJICogcGVyaXBoZXJhbCBiYW5rcyBpbnRvIHRoZSBPUEIvUExCIGFkZHJlc3Mgc3BhY2UKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRUJDX05VTV9CQU5LUzsgaSsrKSB7CisJCW10ZGNyKEVCQzBfQ0ZHQUREUiwgRUJDX0JYQ1IoaSkpOworCQlieGNyID0gbWZkY3IoRUJDMF9DRkdEQVRBKTsKKworCQlpZiAoKGJ4Y3IgJiBFQkNfQlhDUl9CVV9NQVNLKSAhPSBFQkNfQlhDUl9CVV9OT05FKSB7CisJCQkqcCsrID0gaTsKKwkJCSpwKysgPSAwOworCQkJKnArKyA9IGJ4Y3IgJiBFQkNfQlhDUl9CQVNfTUFTSzsKKwkJCSpwKysgPSBFQkNfQlhDUl9CQU5LX1NJWkUoYnhjcik7CisKKyNpZmRlZiBDT05GSUdfRkRUX0ZJWFVQX05PUl9GTEFTSF9TSVpFCisJCQkvKiBUcnkgdG8gdXBkYXRlIHJlZyBwcm9wZXJ0eSBpbiBub3IgZmxhc2ggbm9kZSB0b28gKi8KKwkJCWZkdF9maXh1cF9ub3JfZmxhc2hfc2l6ZShibG9iLCBpLAorCQkJCQkJIEVCQ19CWENSX0JBTktfU0laRShieGNyKSk7CisjZW5kaWYKKwkJfQorCX0KKworCS8qIFNvbWUgNDA1IFBQQydzIGhhdmUgRUJDIGFzIGRpcmVjdCBQTEIgY2hpbGQgaW4gdGhlIGR0cyAqLworCWlmIChmZHRfcGF0aF9vZmZzZXQoYmxvYiwgZWJjX3BhdGgpIDwgMCkKKwkJc3RyY3B5KGViY19wYXRoLCAiL3BsYi9lYmMiKTsKKwlyYyA9IGZkdF9maW5kX2FuZF9zZXRwcm9wKGJsb2IsIGViY19wYXRoLCAicmFuZ2VzIiwgcmFuZ2VzLAorCQkJCSAgKHAgLSByYW5nZXMpICogc2l6ZW9mKHUzMiksIDEpOworCWlmIChyYykgeworCQlwcmludGYoIlVuYWJsZSB0byB1cGRhdGUgcHJvcGVydHkgRUJDIG1hcHBpbmdzLCBlcnI9JXNcbiIsCisJCSAgICAgICBmZHRfc3RyZXJyb3IocmMpKTsKKwl9Cit9Cit2b2lkIGZ0X2JvYXJkX3NldHVwKHZvaWQgKmJsb2IsIGJkX3QgKmJkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19mdF9ib2FyZF9zZXR1cCIpKSk7CisKKy8qCisgKiBGaXh1cCBhbGwgUENJZSBub2RlcyBieSBzZXR0aW5nIHRoZSBkZXZpY2VfdHlwZSBwcm9wZXJ0eQorICogdG8gInBjaS1lbmRwb2ludCIgaW5zdGVhZCBpcyAicGNpIiBmb3IgZW5kcG9pbnQgcG9ydHMuCisgKiBUaGlzIHByb3BlcnR5IHdpbGwgZ2V0IGNoZWNrZWQgbGF0ZXIgYnkgdGhlIExpbnV4IGRyaXZlcgorICogdG8gcHJvcGVybHkgY29uZmlndXJlIHRoZSBQQ0llIHBvcnQgaW4gTGludXggKGFnYWluKS4KKyAqLwordm9pZCBmZHRfcGNpZV9zZXR1cCh2b2lkICpibG9iKQoreworCWNvbnN0IGNoYXIgKmNvbXBhdCA9ICJpYm0scGxiLXBjaWV4IjsKKwljb25zdCBjaGFyICpwcm9wID0gImRldmljZV90eXBlIjsKKwljb25zdCBjaGFyICpwcm9wX3ZhbCA9ICJwY2ktZW5kcG9pbnQiOworCWNvbnN0IHUzMiAqcG9ydDsKKwlpbnQgbm87CisJaW50IHJjOworCisJLyogU2VhcmNoIGZpcnN0IFBDSWUgbm9kZSAqLworCW5vID0gZmR0X25vZGVfb2Zmc2V0X2J5X2NvbXBhdGlibGUoYmxvYiwgLTEsIGNvbXBhdCk7CisJd2hpbGUgKG5vICE9IC1GRFRfRVJSX05PVEZPVU5EKSB7CisJCXBvcnQgPSBmZHRfZ2V0cHJvcChibG9iLCBubywgInBvcnQiLCBOVUxMKTsKKwkJaWYgKHBvcnQgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBwb3J0IHByb3BlcnR5XG4iKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpc19lbmRfcG9pbnQoKnBvcnQpKSB7CisJCQkJcmMgPSBmZHRfc2V0cHJvcChibG9iLCBubywgcHJvcCwgcHJvcF92YWwsCisJCQkJCQkgc3RybGVuKHByb3BfdmFsKSArIDEpOworCQkJCWlmIChyYyA8IDApCisJCQkJCXByaW50ZigiV0FSTklORzogY291bGQgbm90IHNldCAlcyBmb3IgJXM6ICVzLlxuIiwKKwkJCQkJICAgICAgIHByb3AsIGNvbXBhdCwgZmR0X3N0cmVycm9yKHJjKSk7CisJCQl9CisJCX0KKworCQkvKiBKdW1wIHRvIG5leHQgUENJZSBub2RlICovCisJCW5vID0gZmR0X25vZGVfb2Zmc2V0X2J5X2NvbXBhdGlibGUoYmxvYiwgbm8sIGNvbXBhdCk7CisJfQorfQorCit2b2lkIGZ0X2NwdV9zZXR1cCh2b2lkICpibG9iLCBiZF90ICpiZCkKK3sKKwlzeXNfaW5mb190IHN5c19pbmZvOworCWludCBvZmYsIG5kZXB0aCA9IDA7CisKKwlnZXRfc3lzX2luZm8oJnN5c19pbmZvKTsKKworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LCAidGltZWJhc2UtZnJlcXVlbmN5IiwKKwkJCSAgICAgYmQtPmJpX2ludGZyZXEsIDEpOworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LCAiY2xvY2stZnJlcXVlbmN5IiwKKwkJCSAgICAgYmQtPmJpX2ludGZyZXEsIDEpOworCWRvX2ZpeHVwX2J5X3BhdGhfdTMyKGJsb2IsICIvcGxiIiwgImNsb2NrLWZyZXF1ZW5jeSIsIHN5c19pbmZvLmZyZXFQTEIsIDEpOworCWRvX2ZpeHVwX2J5X3BhdGhfdTMyKGJsb2IsICIvcGxiL29wYiIsICJjbG9jay1mcmVxdWVuY3kiLCBzeXNfaW5mby5mcmVxT1BCLCAxKTsKKworCWlmIChmZHRfcGF0aF9vZmZzZXQoYmxvYiwgIi9wbGIvb3BiL2ViYyIpID49IDApCisJCWRvX2ZpeHVwX2J5X3BhdGhfdTMyKGJsb2IsICIvcGxiL29wYi9lYmMiLCAiY2xvY2stZnJlcXVlbmN5IiwKKwkJCXN5c19pbmZvLmZyZXFFQkMsIDEpOworCWVsc2UKKwkJZG9fZml4dXBfYnlfcGF0aF91MzIoYmxvYiwgIi9wbGIvZWJjIiwgImNsb2NrLWZyZXF1ZW5jeSIsCisJCQlzeXNfaW5mby5mcmVxRUJDLCAxKTsKKworCWZkdF9maXh1cF9tZW1vcnkoYmxvYiwgKHU2NCliZC0+YmlfbWVtc3RhcnQsICh1NjQpYmQtPmJpX21lbXNpemUpOworCisJLyoKKwkgKiBGaXh1cCBhbGwgVUFSVCBjbG9ja3MgZm9yIENQVSBpbnRlcm5hbCBVQVJUcworCSAqIChvbmx5IHRoZXNlIFVBUlRzIGFyZSBkZWZpbml0ZWx5IGNsb2NrZWQgYnkgZ2QtPnVhcnRfY2xrKQorCSAqCisJICogVGhlc2UgVUFSVHMgYXJlIGRpcmVjdCBjaGlsZHMgb2YgL3BsYi9vcGIuIFRoaXMgY29kZQorCSAqIGRvZXMgbm90IHRvdWNoIGFueSBVQVJUcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gdGhlIGViYy4KKwkgKi8KKwlvZmYgPSBmZHRfcGF0aF9vZmZzZXQoYmxvYiwgIi9wbGIvb3BiIik7CisJd2hpbGUgKChvZmYgPSBmZHRfbmV4dF9ub2RlKGJsb2IsIG9mZiwgJm5kZXB0aCkpID49IDApIHsKKwkJLyoKKwkJICogcHJvY2VzcyBhbGwgc3ViIG5vZGVzIGFuZCBzdG9wIHdoZW4gd2UgYXJlIGJhY2sKKwkJICogYXQgdGhlIHN0YXJ0aW5nIGRlcHRoCisJCSAqLworCQlpZiAobmRlcHRoIDw9IDApCisJCQlicmVhazsKKworCQkvKiBvbmx5IHVwZGF0ZSBkaXJlY3QgY2hpbGRzICovCisJCWlmICgobmRlcHRoID09IDEpICYmCisJCSAgICAoZmR0X25vZGVfY2hlY2tfY29tcGF0aWJsZShibG9iLCBvZmYsICJuczE2NTUwIikgPT0gMCkpCisJCQlmZHRfc2V0cHJvcChibG9iLCBvZmYsCisJCQkJICAgICJjbG9jay1mcmVxdWVuY3kiLAorCQkJCSAgICAodm9pZCopJihnZC0+dWFydF9jbGspLCA0KTsKKwl9CisKKwkvKgorCSAqIEZpeHVwIGFsbCBldGhlcm5ldCBub2RlcworCSAqIE5vdGU6IGFsaWFzZXMgaW4gdGhlIGR0cyBhcmUgcmVxdWlyZWQgZm9yIHRoaXMKKwkgKi8KKwlmZHRfZml4dXBfZXRoZXJuZXQoYmxvYik7CisKKwkvKgorCSAqIEZpeHVwIGFsbCBhdmFpbGFibGUgUENJZSBub2RlcyBieSBzZXR0aW5nIHRoZSBkZXZpY2VfdHlwZSBwcm9wZXJ0eQorCSAqLworCWZkdF9wY2llX3NldHVwKGJsb2IpOworfQorI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgJiYgQ09ORklHX09GX0JPQVJEX1NFVFVQICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9ncGlvLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkMzUxYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L2dwaW8uYwpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNy0yMDA4CisgKiBTdGVmYW4gUm9lc2UsIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHNyQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTXzR4eF9HUElPX1RBQkxFKQorZ3Bpb19wYXJhbV9zIGNvbnN0IGdwaW9fdGFiW0dQSU9fR1JPVVBfTUFYXVtHUElPX01BWF0gPSBDT05GSUdfU1lTXzR4eF9HUElPX1RBQkxFOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEdQSU8wX09TUkwpCisvKiBPbmx5IHNvbWUgNHh4IHZhcmlhbnRzIHN1cHBvcnQgYWx0ZXJuYXRlIGZ1bnRpb25zIG9uIHRoZSBHUElPJ3MgKi8KK3ZvaWQgZ3Bpb19jb25maWcoaW50IHBpbiwgaW50IGluX291dCwgaW50IGdwaW9fYWx0LCBpbnQgb3V0X3ZhbCkKK3sKKwl1MzIgbWFzazsKKwl1MzIgbWFzazI7CisJdTMyIHZhbDsKKwl1MzIgb2ZmcyA9IDA7CisJdTMyIG9mZnMyID0gMDsKKwlpbnQgcGluMiA9IHBpbiA8PCAxOworCisJaWYgKHBpbiA+PSBHUElPX01BWCkgeworCQlvZmZzID0gMHgxMDA7CisJCXBpbiAtPSBHUElPX01BWDsKKwl9CisKKwlpZiAocGluID49IEdQSU9fTUFYLzIpIHsKKwkJb2ZmczIgPSAweDQ7CisJCXBpbjIgPSAocGluIC0gR1BJT19NQVgvMikgPDwgMTsKKwl9CisKKwltYXNrID0gMHg4MDAwMDAwMCA+PiBwaW47CisJbWFzazIgPSAweGMwMDAwMDAwID4+IHBpbjI7CisKKwkvKiBmaXJzdCBzZXQgVENSIHRvIDAgKi8KKwlvdXRfYmUzMigodm9pZCAqKUdQSU8wX1RDUiArIG9mZnMsIGluX2JlMzIoKHZvaWQgKilHUElPMF9UQ1IgKyBvZmZzKSAmIH5tYXNrKTsKKworCWlmIChpbl9vdXQgPT0gR1BJT19PVVQpIHsKKwkJdmFsID0gaW5fYmUzMigodm9pZCAqKUdQSU8wX09TUkwgKyBvZmZzICsgb2ZmczIpICYgfm1hc2syOworCQlzd2l0Y2ggKGdwaW9fYWx0KSB7CisJCWNhc2UgR1BJT19BTFQxOgorCQkJdmFsIHw9IEdQSU9fQUxUMV9TRUwgPj4gcGluMjsKKwkJCWJyZWFrOworCQljYXNlIEdQSU9fQUxUMjoKKwkJCXZhbCB8PSBHUElPX0FMVDJfU0VMID4+IHBpbjI7CisJCQlicmVhazsKKwkJY2FzZSBHUElPX0FMVDM6CisJCQl2YWwgfD0gR1BJT19BTFQzX1NFTCA+PiBwaW4yOworCQkJYnJlYWs7CisJCX0KKwkJb3V0X2JlMzIoKHZvaWQgKilHUElPMF9PU1JMICsgb2ZmcyArIG9mZnMyLCB2YWwpOworCisJCS8qIHNldHVwIHJlcXVlc3RlZCBvdXRwdXQgdmFsdWUgKi8KKwkJaWYgKG91dF92YWwgPT0gR1BJT19PVVRfMCkKKwkJCW91dF9iZTMyKCh2b2lkICopR1BJTzBfT1IgKyBvZmZzLAorCQkJCSBpbl9iZTMyKCh2b2lkICopR1BJTzBfT1IgKyBvZmZzKSAmIH5tYXNrKTsKKwkJZWxzZSBpZiAob3V0X3ZhbCA9PSBHUElPX09VVF8xKQorCQkJb3V0X2JlMzIoKHZvaWQgKilHUElPMF9PUiArIG9mZnMsCisJCQkJIGluX2JlMzIoKHZvaWQgKilHUElPMF9PUiArIG9mZnMpIHwgbWFzayk7CisKKwkJLyogbm93IGNvbmZpZ3VyZSBUQ1IgdG8gZHJpdmUgb3V0cHV0IGlmIHNlbGVjdGVkICovCisJCW91dF9iZTMyKCh2b2lkICopR1BJTzBfVENSICsgb2ZmcywKKwkJCSBpbl9iZTMyKCh2b2lkICopR1BJTzBfVENSICsgb2ZmcykgfCBtYXNrKTsKKwl9IGVsc2UgeworCQl2YWwgPSBpbl9iZTMyKCh2b2lkICopR1BJTzBfSVNSMUwgKyBvZmZzICsgb2ZmczIpICYgfm1hc2syOworCQl2YWwgfD0gR1BJT19JTl9TRUwgPj4gcGluMjsKKwkJb3V0X2JlMzIoKHZvaWQgKilHUElPMF9JU1IxTCArIG9mZnMgKyBvZmZzMiwgdmFsKTsKKwl9Cit9CisjZW5kaWYgLyogR1BJT19PU1JMICovCisKK3ZvaWQgZ3Bpb193cml0ZV9iaXQoaW50IHBpbiwgaW50IHZhbCkKK3sKKwl1MzIgb2ZmcyA9IDA7CisKKwlpZiAocGluID49IEdQSU9fTUFYKSB7CisJCW9mZnMgPSAweDEwMDsKKwkJcGluIC09IEdQSU9fTUFYOworCX0KKworCWlmICh2YWwpCisJCW91dF9iZTMyKCh2b2lkICopR1BJTzBfT1IgKyBvZmZzLAorCQkJIGluX2JlMzIoKHZvaWQgKilHUElPMF9PUiArIG9mZnMpIHwgR1BJT19WQUwocGluKSk7CisJZWxzZQorCQlvdXRfYmUzMigodm9pZCAqKUdQSU8wX09SICsgb2ZmcywKKwkJCSBpbl9iZTMyKCh2b2lkICopR1BJTzBfT1IgKyBvZmZzKSAmIH5HUElPX1ZBTChwaW4pKTsKK30KKworaW50IGdwaW9fcmVhZF9vdXRfYml0KGludCBwaW4pCit7CisJdTMyIG9mZnMgPSAwOworCisJaWYgKHBpbiA+PSBHUElPX01BWCkgeworCQlvZmZzID0gMHgxMDA7CisJCXBpbiAtPSBHUElPX01BWDsKKwl9CisKKwlyZXR1cm4gKGluX2JlMzIoKHZvaWQgKilHUElPMF9PUiArIG9mZnMpICYgR1BJT19WQUwocGluKSA/IDEgOiAwKTsKK30KKworaW50IGdwaW9fcmVhZF9pbl9iaXQoaW50IHBpbikKK3sKKwl1MzIgb2ZmcyA9IDA7CisKKwlpZiAocGluID49IEdQSU9fTUFYKSB7CisJCW9mZnMgPSAweDEwMDsKKwkJcGluIC09IEdQSU9fTUFYOworCX0KKworCXJldHVybiAoaW5fYmUzMigodm9pZCAqKUdQSU8wX0lSICsgb2ZmcykgJiBHUElPX1ZBTChwaW4pID8gMSA6IDApOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfU1lTXzR4eF9HUElPX1RBQkxFKQordm9pZCBncGlvX3NldF9jaGlwX2NvbmZpZ3VyYXRpb24odm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGk9MCwgaj0wLCBvZmZzPTAsIGdwaW9fY29yZTsKKwl1bnNpZ25lZCBsb25nIHJlZywgY29yZV9hZGQ7CisKKwlmb3IgKGdwaW9fY29yZT0wOyBncGlvX2NvcmU8R1BJT19HUk9VUF9NQVg7IGdwaW9fY29yZSsrKSB7CisJCWogPSAwOworCQlvZmZzID0gMDsKKwkJLyogR1BJTyBjb25maWcgb2YgdGhlIEdQSU9zIDAgdG8gMzEgKi8KKwkJZm9yIChpPTA7IGk8R1BJT19NQVg7IGkrKywgaisrKSB7CisJCQlpZiAoaSA9PSBHUElPX01BWC8yKSB7CisJCQkJb2ZmcyA9IDQ7CisJCQkJaiA9IGktMTY7CisJCQl9CisKKwkJCWNvcmVfYWRkID0gZ3Bpb190YWJbZ3Bpb19jb3JlXVtpXS5hZGQ7CisKKwkJCWlmICgoZ3Bpb190YWJbZ3Bpb19jb3JlXVtpXS5pbl9vdXQgPT0gR1BJT19JTikgfHwKKwkJCSAgICAoZ3Bpb190YWJbZ3Bpb19jb3JlXVtpXS5pbl9vdXQgPT0gR1BJT19CSSkpIHsKKworCQkJCXN3aXRjaCAoZ3Bpb190YWJbZ3Bpb19jb3JlXVtpXS5hbHRfbmIpIHsKKwkJCQljYXNlIEdQSU9fU0VMOgorCQkJCQlicmVhazsKKworCQkJCWNhc2UgR1BJT19BTFQxOgorCQkJCQlyZWcgPSBpbl9iZTMyKCh2b2lkICopR1BJT19JUzEoY29yZV9hZGQrb2ZmcykpCisJCQkJCQkmIH4oR1BJT19NQVNLID4+IChqKjIpKTsKKwkJCQkJcmVnID0gcmVnIHwgKEdQSU9fSU5fU0VMID4+IChqKjIpKTsKKwkJCQkJb3V0X2JlMzIoKHZvaWQgKilHUElPX0lTMShjb3JlX2FkZCtvZmZzKSwgcmVnKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEdQSU9fQUxUMjoKKwkJCQkJcmVnID0gaW5fYmUzMigodm9pZCAqKUdQSU9fSVMyKGNvcmVfYWRkK29mZnMpKQorCQkJCQkJJiB+KEdQSU9fTUFTSyA+PiAoaioyKSk7CisJCQkJCXJlZyA9IHJlZyB8IChHUElPX0lOX1NFTCA+PiAoaioyKSk7CisJCQkJCW91dF9iZTMyKCh2b2lkICopR1BJT19JUzIoY29yZV9hZGQrb2ZmcyksIHJlZyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBHUElPX0FMVDM6CisJCQkJCXJlZyA9IGluX2JlMzIoKHZvaWQgKilHUElPX0lTMyhjb3JlX2FkZCtvZmZzKSkKKwkJCQkJCSYgfihHUElPX01BU0sgPj4gKGoqMikpOworCQkJCQlyZWcgPSByZWcgfCAoR1BJT19JTl9TRUwgPj4gKGoqMikpOworCQkJCQlvdXRfYmUzMigodm9pZCAqKUdQSU9fSVMzKGNvcmVfYWRkK29mZnMpLCByZWcpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICgoZ3Bpb190YWJbZ3Bpb19jb3JlXVtpXS5pbl9vdXQgPT0gR1BJT19PVVQpIHx8CisJCQkgICAgKGdwaW9fdGFiW2dwaW9fY29yZV1baV0uaW5fb3V0ID09IEdQSU9fQkkpKSB7CisKKwkJCQl1MzIgZ3Bpb19hbHRfc2VsID0gMDsKKworCQkJCXN3aXRjaCAoZ3Bpb190YWJbZ3Bpb19jb3JlXVtpXS5hbHRfbmIpIHsKKwkJCQljYXNlIEdQSU9fU0VMOgorCQkJCQkvKgorCQkJCQkgKiBTZXR1cCBvdXRwdXQgdmFsdWUKKwkJCQkJICogMSAtPiBoaWdoIGxldmVsCisJCQkJCSAqIDAgLT4gbG93IGxldmVsCisJCQkJCSAqIGVsc2UgLT4gZG9uJ3QgdG91Y2gKKwkJCQkJICovCisJCQkJCXJlZyA9IGluX2JlMzIoKHZvaWQgKilHUElPX09SKGNvcmVfYWRkKSk7CisJCQkJCWlmIChncGlvX3RhYltncGlvX2NvcmVdW2ldLm91dF92YWwgPT0gR1BJT19PVVRfMSkKKwkJCQkJCXJlZyB8PSAoMHg4MDAwMDAwMCA+PiAoaSkpOworCQkJCQllbHNlIGlmIChncGlvX3RhYltncGlvX2NvcmVdW2ldLm91dF92YWwgPT0gR1BJT19PVVRfMCkKKwkJCQkJCXJlZyAmPSB+KDB4ODAwMDAwMDAgPj4gKGkpKTsKKwkJCQkJb3V0X2JlMzIoKHZvaWQgKilHUElPX09SKGNvcmVfYWRkKSwgcmVnKTsKKworCQkJCQlyZWcgPSBpbl9iZTMyKCh2b2lkICopR1BJT19UQ1IoY29yZV9hZGQpKSB8CisJCQkJCQkoMHg4MDAwMDAwMCA+PiAoaSkpOworCQkJCQlvdXRfYmUzMigodm9pZCAqKUdQSU9fVENSKGNvcmVfYWRkKSwgcmVnKTsKKworCQkJCQlyZWcgPSBpbl9iZTMyKCh2b2lkICopR1BJT19PUyhjb3JlX2FkZCtvZmZzKSkKKwkJCQkJCSYgfihHUElPX01BU0sgPj4gKGoqMikpOworCQkJCQlvdXRfYmUzMigodm9pZCAqKUdQSU9fT1MoY29yZV9hZGQrb2ZmcyksIHJlZyk7CisJCQkJCXJlZyA9IGluX2JlMzIoKHZvaWQgKilHUElPX1RTKGNvcmVfYWRkK29mZnMpKQorCQkJCQkJJiB+KEdQSU9fTUFTSyA+PiAoaioyKSk7CisJCQkJCW91dF9iZTMyKCh2b2lkICopR1BJT19UUyhjb3JlX2FkZCtvZmZzKSwgcmVnKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEdQSU9fQUxUMToKKwkJCQkJZ3Bpb19hbHRfc2VsID0gR1BJT19BTFQxX1NFTDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEdQSU9fQUxUMjoKKwkJCQkJZ3Bpb19hbHRfc2VsID0gR1BJT19BTFQyX1NFTDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEdQSU9fQUxUMzoKKwkJCQkJZ3Bpb19hbHRfc2VsID0gR1BJT19BTFQzX1NFTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKDAgIT0gZ3Bpb19hbHRfc2VsKSB7CisJCQkJCXJlZyA9IGluX2JlMzIoKHZvaWQgKilHUElPX09TKGNvcmVfYWRkK29mZnMpKQorCQkJCQkJJiB+KEdQSU9fTUFTSyA+PiAoaioyKSk7CisJCQkJCXJlZyA9IHJlZyB8IChncGlvX2FsdF9zZWwgPj4gKGoqMikpOworCQkJCQlvdXRfYmUzMigodm9pZCAqKUdQSU9fT1MoY29yZV9hZGQrb2ZmcyksIHJlZyk7CisKKwkJCQkJaWYgKGdwaW9fdGFiW2dwaW9fY29yZV1baV0ub3V0X3ZhbCA9PSBHUElPX09VVF8xKSB7CisJCQkJCQlyZWcgPSBpbl9iZTMyKCh2b2lkICopR1BJT19UQ1IoY29yZV9hZGQpKQorCQkJCQkJCXwgKDB4ODAwMDAwMDAgPj4gKGkpKTsKKwkJCQkJCW91dF9iZTMyKCh2b2lkICopR1BJT19UQ1IoY29yZV9hZGQpLCByZWcpOworCQkJCQkJcmVnID0gaW5fYmUzMigodm9pZCAqKUdQSU9fVFMoY29yZV9hZGQrb2ZmcykpCisJCQkJCQkJJiB+KEdQSU9fTUFTSyA+PiAoaioyKSk7CisJCQkJCQlvdXRfYmUzMigodm9pZCAqKUdQSU9fVFMoY29yZV9hZGQrb2ZmcyksIHJlZyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZWcgPSBpbl9iZTMyKCh2b2lkICopR1BJT19UQ1IoY29yZV9hZGQpKQorCQkJCQkJCSYgfigweDgwMDAwMDAwID4+IChpKSk7CisJCQkJCQlvdXRfYmUzMigodm9pZCAqKUdQSU9fVENSKGNvcmVfYWRkKSwgcmVnKTsKKwkJCQkJCXJlZyA9IGluX2JlMzIoKHZvaWQgKilHUElPX1RTKGNvcmVfYWRkK29mZnMpKQorCQkJCQkJCSYgfihHUElPX01BU0sgPj4gKGoqMikpOworCQkJCQkJcmVnID0gcmVnIHwgKGdwaW9fYWx0X3NlbCA+PiAoaioyKSk7CisJCQkJCQlvdXRfYmUzMigodm9pZCAqKUdQSU9fVFMoY29yZV9hZGQrb2ZmcyksIHJlZyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1NZU180eHhfR1BJT19UQUJMRSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvaW50ZXJydXB0cy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvaW50ZXJydXB0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjg0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIgKDQ0MCBwb3J0KQorICogU2NvdHQgTWNOdXR0LCBBcnRlc3luIENvbW11bmljYXRpb24gUHJvZHVjcywgc21jbnV0dEBhcnRzeW5jcC5jb20KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDMgKDQ0MEdYIHBvcnQpCisgKiBUcmF2aXMgQi4gU2F3eWVyLCBTYW5kYnVyc3QgQ29ycG9yYXRpb24sIHRzYXd5ZXJAc2FuZGJ1cnN0LmNvbQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOCAoUFBDNDQwWDA1IHBvcnQgZm9yIFZpcnRleCA1IEZYKQorICogUmljYXJkbyBSaWJhbGRhLVVuaXZlcnNpZGFkIEF1dG9ub21hIGRlIE1hZHJpZC1yaWNhcmRvLnJpYmFsZGFAdWFtLmVzCisgKiBXb3JrIHN1cHBvcnRlZCBieSBRdGVjaG5vbG9neSAoaHRwcDovL3F0ZWMuY29tKQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2ludGVycnVwdC5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorI2luY2x1ZGUgPHBwY19hc20udG1wbD4KKyNpbmNsdWRlIDxjb21tcHJvYy5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworLyoKKyAqIENQTSBpbnRlcnJ1cHQgdmVjdG9yIGZ1bmN0aW9ucy4KKyAqLworc3RydWN0CWlycV9hY3Rpb24geworCWludGVycnVwdF9oYW5kbGVyX3QgKmhhbmRsZXI7CisJdm9pZCAqYXJnOworCWludCBjb3VudDsKK307CitzdGF0aWMgc3RydWN0IGlycV9hY3Rpb24gaXJxX3ZlY3NbSVJRX01BWF07CisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisKKy8qIFNQUk4gY2hhbmdlZCBpbiA0NDAgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X2V2cHIodW5zaWduZWQgbG9uZyB2YWwpCit7CisJYXNtIHZvbGF0aWxlKCJtdHNwciAweDAzZiwlMCIgOiA6ICJyIiAodmFsKSk7Cit9CisKKyNlbHNlIC8qICFkZWZpbmVkKENPTkZJR180NDApICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X3BpdCh1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm10cGl0ICUwIiA6IDogInIiICh2YWwpKTsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF90Y3IodW5zaWduZWQgbG9uZyB2YWwpCit7CisJYXNtIHZvbGF0aWxlKCJtdHRjciAlMCIgOiA6ICJyIiAodmFsKSk7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfZXZwcih1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm10ZXZwciAlMCIgOiA6ICJyIiAodmFsKSk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfNDQwICovCisKK2ludCBpbnRlcnJ1cHRfaW5pdF9jcHUgKHVuc2lnbmVkICpkZWNyZW1lbnRlcl9jb3VudCkKK3sKKwlpbnQgdmVjOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJLyogZGVjcmVtZW50ZXIgaXMgYXV0b21hdGljYWxseSByZWxvYWRlZCAqLworCSpkZWNyZW1lbnRlcl9jb3VudCA9IDA7CisKKwkvKgorCSAqIE1hcmsgYWxsIGlycXMgYXMgZnJlZQorCSAqLworCWZvciAodmVjID0gMDsgdmVjIDwgSVJRX01BWDsgdmVjKyspIHsKKwkJaXJxX3ZlY3NbdmVjXS5oYW5kbGVyID0gTlVMTDsKKwkJaXJxX3ZlY3NbdmVjXS5hcmcgPSBOVUxMOworCQlpcnFfdmVjc1t2ZWNdLmNvdW50ID0gMDsKKwl9CisKKyNpZmRlZiBDT05GSUdfNHh4CisJLyoKKwkgKiBJbml0IFBJVAorCSAqLworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKwl2YWwgPSBtZnNwciggU1BSTl9UQ1IgKTsKKwl2YWwgJj0gKH4weDA0NDAwMDAwKTsJCS8qIGNsZWFyIERJUyAmIEFSRSAqLworCW10c3ByKCBTUFJOX1RDUiwgdmFsICk7CisJbXRzcHIoIFNQUk5fREVDLCAwICk7CQkvKiBQcmV2ZW50IGV4Y2VwdGlvbiBhZnRlciBUU1IgY2xlYXIqLworCW10c3ByKCBTUFJOX0RFQ0FSLCAwICk7CQkvKiBjbGVhciByZWxvYWQgKi8KKwltdHNwciggU1BSTl9UU1IsIDB4MDgwMDAwMDAgKTsJLyogY2xlYXIgREVDIHN0YXR1cyAqLworCXZhbCA9IGdkLT5iZC0+YmlfaW50ZnJlcS8xMDAwOwkvKiAxIG1zZWMgKi8KKwltdHNwciggU1BSTl9ERUNBUiwgdmFsICk7CQkvKiBTZXQgYXV0by1yZWxvYWQgdmFsdWUgKi8KKwltdHNwciggU1BSTl9ERUMsIHZhbCApOwkJLyogU2V0IGluaXRhbCB2YWwgKi8KKyNlbHNlCisJc2V0X3BpdChnZC0+YmQtPmJpX2ludGZyZXEgLyAxMDAwKTsKKyNlbmRpZgorI2VuZGlmICAvKiBDT05GSUdfNHh4ICovCisKKyNpZmRlZiBDT05GSUdfQURDSU9QCisJLyoKKwkgKiBJbml0IFBJVAorCSAqLworCXNldF9waXQoNjYwMDApOworI2VuZGlmCisKKwkvKgorCSAqIEVuYWJsZSBQSVQKKwkgKi8KKwl2YWwgPSBtZnNwcihTUFJOX1RDUik7CisJdmFsIHw9IDB4MDQ0MDAwMDA7CisJbXRzcHIoU1BSTl9UQ1IsIHZhbCk7CisKKwkvKgorCSAqIFNldCBFVlBSIHRvIDAKKwkgKi8KKwlzZXRfZXZwcigweDAwMDAwMDAwKTsKKworCS8qCisJICogQ2FsbCB1aWMgb3IgeGlsaW54X2lycSBwaWNfZW5hYmxlCisJICovCisJcGljX2VuYWJsZSgpOworCisJcmV0dXJuICgwKTsKK30KKwordm9pZCB0aW1lcl9pbnRlcnJ1cHRfY3B1KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCXJldHVybjsKK30KKwordm9pZCBpbnRlcnJ1cHRfcnVuX2hhbmRsZXIoaW50IHZlYykKK3sKKwlpcnFfdmVjc1t2ZWNdLmNvdW50Kys7CisKKwlpZiAoaXJxX3ZlY3NbdmVjXS5oYW5kbGVyICE9IE5VTEwpIHsKKwkJLyogY2FsbCBpc3IgKi8KKwkJKCppcnFfdmVjc1t2ZWNdLmhhbmRsZXIpIChpcnFfdmVjc1t2ZWNdLmFyZyk7CisJfSBlbHNlIHsKKwkJcGljX2lycV9kaXNhYmxlKHZlYyk7CisJCXByaW50ZigiTWFza2luZyBib2d1cyBpbnRlcnJ1cHQgdmVjdG9yICVkXG4iLCB2ZWMpOworCX0KKworCXBpY19pcnFfYWNrKHZlYyk7CisJcmV0dXJuOworfQorCit2b2lkIGlycV9pbnN0YWxsX2hhbmRsZXIoaW50IHZlYywgaW50ZXJydXB0X2hhbmRsZXJfdCAqIGhhbmRsZXIsIHZvaWQgKmFyZykKK3sKKwkvKgorCSAqIFByaW50IHdhcm5pbmcgd2hlbiByZXBsYWNpbmcgd2l0aCBhIGRpZmZlcmVudCBpcnEgdmVjdG9yCisJICovCisJaWYgKChpcnFfdmVjc1t2ZWNdLmhhbmRsZXIgIT0gTlVMTCkgJiYgKGlycV92ZWNzW3ZlY10uaGFuZGxlciAhPSBoYW5kbGVyKSkgeworCQlwcmludGYoIkludGVycnVwdCB2ZWN0b3IgJWQ6IGhhbmRsZXIgMHgleCByZXBsYWNpbmcgMHgleFxuIiwKKwkJICAgICAgIHZlYywgKHVpbnQpIGhhbmRsZXIsICh1aW50KSBpcnFfdmVjc1t2ZWNdLmhhbmRsZXIpOworCX0KKwlpcnFfdmVjc1t2ZWNdLmhhbmRsZXIgPSBoYW5kbGVyOworCWlycV92ZWNzW3ZlY10uYXJnID0gYXJnOworCisJcGljX2lycV9lbmFibGUodmVjKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgaXJxX2ZyZWVfaGFuZGxlcihpbnQgdmVjKQoreworCWRlYnVnKCJGcmVlIGludGVycnVwdCBmb3IgdmVjdG9yICVkID09PiAlcFxuIiwKKwkgICAgICB2ZWMsIGlycV92ZWNzW3ZlY10uaGFuZGxlcik7CisKKwlwaWNfaXJxX2Rpc2FibGUodmVjKTsKKworCWlycV92ZWNzW3ZlY10uaGFuZGxlciA9IE5VTEw7CisJaXJxX3ZlY3NbdmVjXS5hcmcgPSBOVUxMOworCXJldHVybjsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9JUlEpCitpbnQgZG9faXJxaW5mbyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgdmVjOworCisJcHJpbnRmICgiSW50ZXJydXB0LUluZm9ybWF0aW9uOlxuIik7CisJcHJpbnRmICgiTnIgIFJvdXRpbmUgICBBcmcgICAgICAgQ291bnRcbiIpOworCisJZm9yICh2ZWMgPSAwOyB2ZWMgPCBJUlFfTUFYOyB2ZWMrKykgeworCQlpZiAoaXJxX3ZlY3NbdmVjXS5oYW5kbGVyICE9IE5VTEwpIHsKKwkJCXByaW50ZiAoIiUwMmQgICUwOGx4ICAlMDhseCAgJWRcbiIsCisJCQkJdmVjLAorCQkJCSh1bG9uZylpcnFfdmVjc1t2ZWNdLmhhbmRsZXIsCisJCQkJKHVsb25nKWlycV92ZWNzW3ZlY10uYXJnLAorCQkJCWlycV92ZWNzW3ZlY10uY291bnQpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L2lvcDQ4MF91YXJ0LmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9pb3A0ODBfdWFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzQyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9pb3A0ODBfdWFydC5jCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX01VTFRJCisjaW5jbHVkZSA8c2VyaWFsLmg+CisjZW5kaWYKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZmRlZiBDT05GSUdfSU9QNDgwCisKKyNkZWZpbmUgU1BVX0JBU0UgICAgICAgICAweDQwMDAwMDAwCisKKyNkZWZpbmUgc3B1X0xpbmVTdGF0X3JjICAweDAwCS8qIExpbmUgU3RhdHVzIFJlZ2lzdGVyIChSZWFkL0NsZWFyKSAqLworI2RlZmluZSBzcHVfTGluZVN0YXRfdyAgIDB4MDQJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKFNldCkgKi8KKyNkZWZpbmUgc3B1X0hhbmRzaGtfcmMgICAweDA4CS8qIEhhbmRzaGFrZSBTdGF0dXMgUmVnaXN0ZXIgKFJlYWQvQ2xlYXIpICovCisjZGVmaW5lIHNwdV9IYW5kc2hrX3cgICAgMHgwYwkvKiBIYW5kc2hha2UgU3RhdHVzIFJlZ2lzdGVyIChTZXQpICovCisjZGVmaW5lIHNwdV9CUmF0ZURpdmggICAgMHgxMAkvKiBCYXVkIHJhdGUgZGl2aXNvciBoaWdoICovCisjZGVmaW5lIHNwdV9CUmF0ZURpdmwgICAgMHgxNAkvKiBCYXVkIHJhdGUgZGl2aXNvciBsb3cgKi8KKyNkZWZpbmUgc3B1X0N0bFJlZyAgICAgICAweDE4CS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgc3B1X1J4Q21kICAgICAgICAweDFjCS8qIFJ4IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgc3B1X1R4Q21kICAgICAgICAweDIwCS8qIFR4IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgc3B1X1J4QnVmZiAgICAgICAweDI0CS8qIFJ4IGRhdGEgYnVmZmVyICovCisjZGVmaW5lIHNwdV9UeEJ1ZmYgICAgICAgMHgyNAkvKiBUeCBkYXRhIGJ1ZmZlciAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8IExpbmUgU3RhdHVzIFJlZ2lzdGVyLgorICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBhc3luY0xTUnBvcnQxICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIGFzeW5jTFNScG9ydDFzZXQgICAgICAgIDB4NDAwMDAwMDQKKyNkZWZpbmUgYXN5bmNMU1JEYXRhUmVhZHkgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBhc3luY0xTUkZyYW1pbmdFcnJvciAgICAgICAgICAweDQwCisjZGVmaW5lIGFzeW5jTFNST3ZlcnJ1bkVycm9yICAgICAgICAgIDB4MjAKKyNkZWZpbmUgYXN5bmNMU1JQYXJpdHlFcnJvciAgICAgICAgICAgMHgxMAorI2RlZmluZSBhc3luY0xTUkJyZWFrSW50ZXJydXB0ICAgICAgICAweDA4CisjZGVmaW5lIGFzeW5jTFNSVHhIb2xkRW1wdHkgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgYXN5bmNMU1JUeFNoaWZ0RW1wdHkgICAgICAgICAgMHgwMgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8IEhhbmRzaGFrZSBTdGF0dXMgUmVnaXN0ZXIuCisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIGFzeW5jSFNScG9ydDEgICAgICAgICAgIDB4NDAwMDAwMDgKKyNkZWZpbmUgYXN5bmNIU1Jwb3J0MXNldCAgICAgICAgMHg0MDAwMDAwYworI2RlZmluZSBhc3luY0hTUkRzciAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIGFzeW5jTFNSQ3RzICAgICAgICAgICAgICAgICAgIDB4NDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBDb250cm9sIFJlZ2lzdGVyLgorICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBhc3luY0NScG9ydDEgICAgICAgICAgICAweDQwMDAwMDE4CisjZGVmaW5lIGFzeW5jQ1JOb3JtYWwgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgYXN5bmNDUkxvb3BiYWNrICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBhc3luY0NSQXV0b0VjaG8gICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIGFzeW5jQ1JEdHIgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgYXN5bmNDUlJ0cyAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBhc3luY0NSV29yZExlbmd0aDcgICAgICAgICAgICAweDAwCisjZGVmaW5lIGFzeW5jQ1JXb3JkTGVuZ3RoOCAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgYXN5bmNDUlBhcml0eURpc2FibGUgICAgICAgICAgMHgwMAorI2RlZmluZSBhc3luY0NSUGFyaXR5RW5hYmxlICAgICAgICAgICAweDA0CisjZGVmaW5lIGFzeW5jQ1JFdmVuUGFyaXR5ICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgYXN5bmNDUk9kZFBhcml0eSAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBhc3luY0NSU3RvcEJpdHNPbmUgICAgICAgICAgICAweDAwCisjZGVmaW5lIGFzeW5jQ1JTdG9wQml0c1R3byAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgYXN5bmNDUkRpc2FibGVEdHJSdHMgICAgICAgICAgMHgwMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8IFJlY2VpdmVyIENvbW1hbmQgUmVnaXN0ZXIuCisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIGFzeW5jUkNScG9ydDEgICAgICAgICAgIDB4NDAwMDAwMWMKKyNkZWZpbmUgYXN5bmNSQ1JEaXNhYmxlICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBhc3luY1JDUkVuYWJsZSAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIGFzeW5jUkNSSW50RGlzYWJsZSAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgYXN5bmNSQ1JJbnRFbmFibGVkICAgICAgICAgICAgMHgyMAorI2RlZmluZSBhc3luY1JDUkRNQUNoMiAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIGFzeW5jUkNSRE1BQ2gzICAgICAgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgYXN5bmNSQ1JFcnJvckludCAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBhc3luY1JDUlBhdXNlRW5hYmxlICAgICAgICAgICAweDA4CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgVHJhbnNtaXR0ZXIgQ29tbWFuZCBSZWdpc3Rlci4KKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgYXN5bmNUQ1Jwb3J0MSAgICAgICAgICAgMHg0MDAwMDAyMAorI2RlZmluZSBhc3luY1RDUkRpc2FibGUgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIGFzeW5jVENSRW5hYmxlICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgYXN5bmNUQ1JJbnREaXNhYmxlICAgICAgICAgICAgMHgwMAorI2RlZmluZSBhc3luY1RDUkludEVuYWJsZWQgICAgICAgICAgICAweDIwCisjZGVmaW5lIGFzeW5jVENSRE1BQ2gyICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgYXN5bmNUQ1JETUFDaDMgICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBhc3luY1RDUlR4RW1wdHkgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIGFzeW5jVENSRXJyb3JJbnQgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgYXN5bmNUQ1JTdG9wUGF1c2UgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBhc3luY1RDUkJyZWFrR2VuICAgICAgICAgICAgICAweDAyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgTWlzY2VsbGFuaWVzIGRlZmluZXMuCisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIGFzeW5jVHhCdWZmZXJwb3J0MSAgICAgIDB4NDAwMDAwMjQKKyNkZWZpbmUgYXN5bmNSeEJ1ZmZlcnBvcnQxICAgICAgMHg0MDAwMDAyNAorI2RlZmluZSBhc3luY0RMQUJMc2Jwb3J0MSAgICAgICAweDQwMDAwMDE0CisjZGVmaW5lIGFzeW5jRExBQk1zYnBvcnQxICAgICAgIDB4NDAwMDAwMTAKKyNkZWZpbmUgYXN5bmNYT0ZGY2hhciAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBhc3luY1hPTmNoYXIgICAgICAgICAgICAgICAgICAweDExCisKKy8qCisgKiBNaW5pbWFsIHNlcmlhbCBmdW5jdGlvbnMgbmVlZGVkIHRvIHVzZSBvbmUgb2YgdGhlIFNNQyBwb3J0cworICogYXMgc2VyaWFsIGNvbnNvbGUgaW50ZXJmYWNlLgorICovCisKK2ludCBzZXJpYWxfaW5pdCAodm9pZCkKK3sKKwl2b2xhdGlsZSBjaGFyIHZhbDsKKwl1bnNpZ25lZCBzaG9ydCBicl9yZWc7CisKKwlicl9yZWcgPSAoKCgoQ09ORklHX0NQVUNMT0NLICogMTAwMDAwMCkgLyAxNikgLyBnZC0+YmF1ZHJhdGUpIC0gMSk7CisKKwkvKgorCSAqIEluaXQgb25ib2FyZCBVQVJUCisJICovCisJb3V0XzgoKHU4ICopU1BVX0JBU0UgKyBzcHVfTGluZVN0YXRfcmMsIDB4NzgpOyAvKiBDbGVhciBhbGwgYml0cyBpbiBMaW5lIFN0YXR1cyBSZWcgKi8KKwlvdXRfOCgodTggKilTUFVfQkFTRSArIHNwdV9CUmF0ZURpdmwsIChicl9yZWcgJiAweDAwZmYpKTsgLyogU2V0IGJhdWQgcmF0ZSBkaXZpc29yLi4uICovCisJb3V0XzgoKHU4ICopU1BVX0JBU0UgKyBzcHVfQlJhdGVEaXZoLCAoKGJyX3JlZyAmIDB4ZmYwMCkgPj4gOCkpOyAvKiAuLi4gKi8KKwlvdXRfOCgodTggKilTUFVfQkFTRSArIHNwdV9DdGxSZWcsIDB4MDgpOwkvKiBTZXQgOCBiaXRzLCBubyBwYXJpdHkgYW5kIDEgc3RvcCBiaXQgKi8KKwlvdXRfOCgodTggKilTUFVfQkFTRSArIHNwdV9SeENtZCwgMHhiMCk7CS8qIEVuYWJsZSBSeCAqLworCW91dF84KCh1OCAqKVNQVV9CQVNFICsgc3B1X1R4Q21kLCAweDljKTsJLyogRW5hYmxlIFR4ICovCisJb3V0XzgoKHU4ICopU1BVX0JBU0UgKyBzcHVfSGFuZHNoa19yYywgMHhmZik7CS8qIENsZWFyIEhhbmRzaGFrZSAqLworCXZhbCA9IGluXzgoKHU4ICopU1BVX0JBU0UgKyBzcHVfUnhCdWZmKTsJLyogRHVtbXkgcmVhZCwgdG8gY2xlYXIgcmVjZWl2ZXIgKi8KKworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQgc2VyaWFsX3NldGJyZyAodm9pZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBicl9yZWc7CisKKwlicl9yZWcgPSAoKCgoQ09ORklHX0NQVUNMT0NLICogMTAwMDAwMCkgLyAxNikgLyBnZC0+YmF1ZHJhdGUpIC0gMSk7CisKKwlvdXRfOCgodTggKilTUFVfQkFTRSArIHNwdV9CUmF0ZURpdmwsCisJICAgICAgKGJyX3JlZyAmIDB4MDBmZikpOyAvKiBTZXQgYmF1ZCByYXRlIGRpdmlzb3IuLi4gKi8KKwlvdXRfOCgodTggKilTUFVfQkFTRSArIHNwdV9CUmF0ZURpdmgsCisJICAgICAgKChicl9yZWcgJiAweGZmMDApID4+IDgpKTsgLyogLi4uICovCit9CisKK3ZvaWQgc2VyaWFsX3B1dGMgKGNvbnN0IGNoYXIgYykKK3sKKwlpZiAoYyA9PSAnXG4nKQorCQlzZXJpYWxfcHV0YyAoJ1xyJyk7CisKKwkvKiBsb2FkIHN0YXR1cyBmcm9tIGhhbmRzaGFrZSByZWdpc3RlciAqLworCWlmIChpbl84KCh1OCAqKVNQVV9CQVNFICsgc3B1X0hhbmRzaGtfcmMpICE9IDAwKQorCQlvdXRfOCgodTggKilTUFVfQkFTRSArIHNwdV9IYW5kc2hrX3JjLCAweGZmKTsJLyogQ2xlYXIgSGFuZHNoYWtlICovCisKKwlvdXRfOCgodTggKilTUFVfQkFTRSArIHNwdV9UeEJ1ZmYsIGMpOwkvKiBQdXQgY2hhciAqLworCisJd2hpbGUgKChpbl84KCh1OCAqKVNQVV9CQVNFICsgc3B1X0xpbmVTdGF0X3JjKSAmIDA0KSAhPSAwNCkgeworCQlpZiAoaW5fOCgodTggKilTUFVfQkFTRSArIHNwdV9IYW5kc2hrX3JjKSAhPSAwMCkKKwkJCW91dF84KCh1OCAqKVNQVV9CQVNFICsgc3B1X0hhbmRzaGtfcmMsIDB4ZmYpOwkvKiBDbGVhciBIYW5kc2hha2UgKi8KKwl9Cit9CisKK3ZvaWQgc2VyaWFsX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXNlcmlhbF9wdXRjICgqcysrKTsKKwl9Cit9CisKK2ludCBzZXJpYWxfZ2V0YyAoKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzID0gMDsKKworCXdoaWxlICgxKSB7CisJCXN0YXR1cyA9IGluXzgoKHU4ICopYXN5bmNMU1Jwb3J0MSk7CisJCWlmICgoc3RhdHVzICYgYXN5bmNMU1JEYXRhUmVhZHkpICE9IDB4MCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChzdGF0dXMgJiAoIGFzeW5jTFNSRnJhbWluZ0Vycm9yIHwKKwkJCQlhc3luY0xTUk92ZXJydW5FcnJvciB8CisJCQkJYXN5bmNMU1JQYXJpdHlFcnJvciAgfAorCQkJCWFzeW5jTFNSQnJlYWtJbnRlcnJ1cHQgKSkgIT0gMCkgeworCQkJKHZvaWQpIG91dF84KCh1OCAqKWFzeW5jTFNScG9ydDEsCisJCQkJICAgICBhc3luY0xTUkZyYW1pbmdFcnJvciB8CisJCQkJICAgICBhc3luY0xTUk92ZXJydW5FcnJvciB8CisJCQkJICAgICBhc3luY0xTUlBhcml0eUVycm9yICB8CisJCQkJICAgICBhc3luY0xTUkJyZWFrSW50ZXJydXB0ICk7CisJCX0KKwl9CisJcmV0dXJuICgweDAwMDAwMGZmICYgKGludCkgaW5fOCgodTggKilhc3luY1J4QnVmZmVycG9ydDEpKTsKK30KKworaW50IHNlcmlhbF90c3RjICgpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisKKwlzdGF0dXMgPSBpbl84KCh1OCAqKWFzeW5jTFNScG9ydDEpOworCWlmICgoc3RhdHVzICYgYXN5bmNMU1JEYXRhUmVhZHkpICE9IDB4MCkgeworCQlyZXR1cm4gKDEpOworCX0KKwlpZiAoKHN0YXR1cyAmICggYXN5bmNMU1JGcmFtaW5nRXJyb3IgfAorCQkJYXN5bmNMU1JPdmVycnVuRXJyb3IgfAorCQkJYXN5bmNMU1JQYXJpdHlFcnJvciAgfAorCQkJYXN5bmNMU1JCcmVha0ludGVycnVwdCApKSAhPSAwKSB7CisJCSh2b2lkKSBvdXRfOCgodTggKilhc3luY0xTUnBvcnQxLAorCQkJICAgICBhc3luY0xTUkZyYW1pbmdFcnJvciB8CisJCQkgICAgIGFzeW5jTFNST3ZlcnJ1bkVycm9yIHwKKwkJCSAgICAgYXN5bmNMU1JQYXJpdHlFcnJvciAgfAorCQkJICAgICBhc3luY0xTUkJyZWFrSW50ZXJydXB0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSU9QNDgwICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9rZ2RiLlMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9rZ2RiLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyN2E0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L2tnZGIuUwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMAlNdXJyYXkgSmVuc2VuIDxNdXJyYXkuSmVuc2VuQGNtc3QuY3Npcm8uYXU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwcGM0eHguaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUgQ09ORklHXzQwNUdQIDEJCS8qIG5lZWRlZCBmb3IgTGludXgga2VybmVsIGhlYWRlciBmaWxlcyAqLworI2RlZmluZSBfTElOVVhfQ09ORklHX0ggMQkvKiBhdm9pZCByZWFkaW5nIExpbnV4IGF1dG9jb25mLmggZmlsZQkqLworCisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPHBwY19kZWZzLmg+CisKKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKyAvKgorICogY2FjaGUgZmx1c2hpbmcgcm91dGluZXMgZm9yIGtnZGIKKyAqLworCisJLmdsb2JsCWtnZGJfZmx1c2hfY2FjaGVfYWxsCitrZ2RiX2ZsdXNoX2NhY2hlX2FsbDoKKwkvKiBpY2FjaGUgKi8KKwlpY2NjaSAgIHIwLHIwCQkvKiBpY2NjaSBpbnZhbGlkYXRlcyB0aGUgZW50aXJlIEkgY2FjaGUgKi8KKwkvKiBkY2FjaGUgKi8KKwlhZGRpICAgIHI2LDAsMHgwMDAwICAgICAvKiBjbGVhciBHUFIgNiAqLworCWFkZGkgICAgcjcscjAsIDEyOAkvKiBkbyBsb29wIGZvciAjIG9mIGRjYWNoZSBsaW5lcyAqLworCQkJCS8qIE5PVEU6IGRjY2NpIGludmFsaWRhdGVzIGJvdGggKi8KKwltdGN0ciAgIHI3ICAgICAgICAgICAgICAvKiB3YXlzIGluIHRoZSBEIGNhY2hlICovCisuLmRjbG9vcDoKKwlkY2NjaSAgIDAscjYgICAgICAgICAgICAvKiBpbnZhbGlkYXRlIGxpbmUgKi8KKwlhZGRpICAgIHI2LHI2LCAzMgkvKiBidW1wIHRvIG5leHQgbGluZSAqLworCWJkbnogICAgLi5kY2xvb3AKKwlibHIKKworCS5nbG9ibAlrZ2RiX2ZsdXNoX2NhY2hlX3JhbmdlCitrZ2RiX2ZsdXNoX2NhY2hlX3JhbmdlOgorCWxpCXI1LEwxX0NBQ0hFX0JZVEVTLTEKKwlhbmRjCXIzLHIzLHI1CisJc3ViZglyNCxyMyxyNAorCWFkZAlyNCxyNCxyNQorCXNyd2kuCXI0LHI0LEwxX0NBQ0hFX1NISUZUCisJYmVxbHIKKwltdGN0cglyNAorCW1yCXI2LHIzCisxOglkY2JzdAkwLHIzCisJYWRkaQlyMyxyMyxMMV9DQUNIRV9CWVRFUworCWJkbnoJMWIKKwlzeW5jCQkJLyogd2FpdCBmb3IgZGNic3QncyB0byBnZXQgdG8gcmFtICovCisJbXRjdHIJcjQKKzI6CWljYmkJMCxyNgorCWFkZGkJcjYscjYsTDFfQ0FDSEVfQllURVMKKwliZG56CTJiCisJU1lOQworCWJscgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L21paXBoeS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvbWlpcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlZDVjMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L21paXBoeS5jCkBAIC0wLDAgKzEsMzY2IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICB8ICAgVGhpcyBzb3VyY2UgY29kZSBpcyBkdWFsLWxpY2Vuc2VkLiAgWW91IG1heSB1c2UgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICB8ICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLCBvciB1bmRlciB0aGUgbGljZW5zZSBiZWxvdy4KKyAgfAorICB8CSAgVGhpcyBzb3VyY2UgY29kZSBoYXMgYmVlbiBtYWRlIGF2YWlsYWJsZSB0byB5b3UgYnkgSUJNIG9uIGFuIEFTLUlTCisgIHwJICBiYXNpcy4gIEFueW9uZSByZWNlaXZpbmcgdGhpcyBzb3VyY2UgaXMgbGljZW5zZWQgdW5kZXIgSUJNCisgIHwJICBjb3B5cmlnaHRzIHRvIHVzZSBpdCBpbiBhbnkgd2F5IGhlIG9yIHNoZSBkZWVtcyBmaXQsIGluY2x1ZGluZworICB8CSAgY29weWluZyBpdCwgbW9kaWZ5aW5nIGl0LCBjb21waWxpbmcgaXQsIGFuZCByZWRpc3RyaWJ1dGluZyBpdCBlaXRoZXIKKyAgfAkgIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLiAgTm8gbGljZW5zZSB1bmRlciBJQk0gcGF0ZW50cyBvcgorICB8CSAgcGF0ZW50IGFwcGxpY2F0aW9ucyBpcyB0byBiZSBpbXBsaWVkIGJ5IHRoZSBjb3B5cmlnaHQgbGljZW5zZS4KKyAgfAorICB8CSAgQW55IHVzZXIgb2YgdGhpcyBzb2Z0d2FyZSBzaG91bGQgdW5kZXJzdGFuZCB0aGF0IElCTSBjYW5ub3QgcHJvdmlkZQorICB8CSAgdGVjaG5pY2FsIHN1cHBvcnQgZm9yIHRoaXMgc29mdHdhcmUgYW5kIHdpbGwgbm90IGJlIHJlc3BvbnNpYmxlIGZvcgorICB8CSAgYW55IGNvbnNlcXVlbmNlcyByZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgIHwKKyAgfAkgIEFueSBwZXJzb24gd2hvIHRyYW5zZmVycyB0aGlzIHNvdXJjZSBjb2RlIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsKKyAgfAkgIG11c3QgaW5jbHVkZSB0aGUgSUJNIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgcGFyYWdyYXBoLCBhbmQgdGhlCisgIHwJICBwcmVjZWRpbmcgdHdvIHBhcmFncmFwaHMgaW4gdGhlIHRyYW5zZmVycmVkIHNvZnR3YXJlLgorICB8CisgIHwJICBDT1BZUklHSFQgICBJIEIgTSAgIENPUlBPUkFUSU9OIDE5OTUKKyAgfAkgIExJQ0VOU0VEIE1BVEVSSUFMICAtCVBST0dSQU0gUFJPUEVSVFkgT0YgSSBCIE0KKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwKKyAgfCAgRmlsZSBOYW1lOgkgbWlpcGh5LmMKKyAgfAorICB8ICBGdW5jdGlvbjoJIFRoaXMgbW9kdWxlIGhhcyB1dGlsaXRpZXMgZm9yIGFjY2Vzc2luZyB0aGUgTUlJIFBIWSB0aHJvdWdoCisgIHwJICAgICAgIHRoZSBFTUFDMyBtYWNyby4KKyAgfAorICB8ICBBdXRob3I6CSBNYXJrIFdpc25lcgorICB8CisgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGRlZmluZSBERUJVRyBmb3IgZGVidWdnaW5nIG91dHB1dCAob2J2aW91c2x5IDstKSkgKi8KKyNpZiAwCisjZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8Y29tbXByb2MuaD4KKyNpbmNsdWRlIDxwcGM0eHhfZW5ldC5oPgorI2luY2x1ZGUgPDQwNV9tYWwuaD4KKyNpbmNsdWRlIDxtaWlwaHkuaD4KKworI2lmICFkZWZpbmVkKENPTkZJR19QSFlfQ0xLX0ZSRVEpCisjZGVmaW5lIENPTkZJR19QSFlfQ0xLX0ZSRVEJMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIER1bXAgb3V0IHRvIHRoZSBzY3JlZW4gUEhZIHJlZ3MJCQkgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIG1paXBoeV9kdW1wIChjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIHNob3J0IGRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHgxQTsgaSsrKSB7CisJCWlmIChtaWlwaHlfcmVhZCAoZGV2bmFtZSwgYWRkciwgaSwgJmRhdGEpKSB7CisJCQlwcmludGYgKCJyZWFkIGVycm9yIGZvciByZWcgJWx4XG4iLCBpKTsKKwkJCXJldHVybjsKKwkJfQorCQlwcmludGYgKCJQaHkgcmVnICVseCA9PT4gJTR4XG4iLCBpLCBkYXRhKTsKKworCQkvKiBqdW1wIHRvIHRoZSBuZXh0IHNldCBvZiByZWdzICovCisJCWlmIChpID09IDB4MDcpCisJCQlpID0gMHgwZjsKKworCX0JCQkvKiBlbmQgZm9yIGxvb3AgKi8KK30JCQkJLyogZW5kIGR1bXAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogKFJlKXN0YXJ0IGF1dG9uZWdvdGlhdGlvbgkJCQkgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBoeV9zZXR1cF9hbmVnIChjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJdTE2IGJtY3I7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QSFlfRFlOQU1JQ19BTkVHKQorCS8qCisJICogU2V0IHVwIGFkdmVydGlzZW1lbnQgYmFzZWQgb24gY2FwYWJsaWxpdGllcyByZXBvcnRlZCBieSB0aGUgUEhZLgorCSAqIFRoaXMgc2hvdWxkIHdvcmsgZm9yIGJvdGggY29wcGVyIGFuZCBmaWJlci4KKwkgKi8KKwl1MTYgYm1zcjsKKyNpZiBkZWZpbmVkKENPTkZJR19QSFlfR0lHRSkKKwl1MTYgZXhzciA9IDB4MDAwMDsKKyNlbmRpZgorCisJbWlpcGh5X3JlYWQgKGRldm5hbWUsIGFkZHIsIFBIWV9CTVNSLCAmYm1zcik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QSFlfR0lHRSkKKwlpZiAoYm1zciAmIFBIWV9CTVNSX0VYVF9TVEFUKQorCQltaWlwaHlfcmVhZCAoZGV2bmFtZSwgYWRkciwgUEhZX0VYU1IsICZleHNyKTsKKworCWlmIChleHNyICYgKFBIWV9FWFNSXzEwMDBYRiB8IFBIWV9FWFNSXzEwMDBYSCkpIHsKKwkJLyogMTAwMEJBU0UtWCAqLworCQl1MTYgYW5hciA9IDB4MDAwMDsKKworCQlpZiAoZXhzciAmIFBIWV9FWFNSXzEwMDBYRikKKwkJCWFuYXIgfD0gUEhZX1hfQU5MUEFSX0ZEOworCisJCWlmIChleHNyICYgUEhZX0VYU1JfMTAwMFhIKQorCQkJYW5hciB8PSBQSFlfWF9BTkxQQVJfSEQ7CisKKwkJbWlpcGh5X3dyaXRlIChkZXZuYW1lLCBhZGRyLCBQSFlfQU5BUiwgYW5hcik7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXUxNiBhbmFyLCBidGNyOworCisJCW1paXBoeV9yZWFkIChkZXZuYW1lLCBhZGRyLCBQSFlfQU5BUiwgJmFuYXIpOworCQlhbmFyICY9IH4oMHg1MDAwIHwgUEhZX0FOTFBBUl9UNCB8IFBIWV9BTkxQQVJfVFhGRCB8CisJCQkgIFBIWV9BTkxQQVJfVFggfCBQSFlfQU5MUEFSXzEwRkQgfCBQSFlfQU5MUEFSXzEwKTsKKworCQltaWlwaHlfcmVhZCAoZGV2bmFtZSwgYWRkciwgUEhZXzEwMDBCVENSLCAmYnRjcik7CisJCWJ0Y3IgJj0gfigweDAwRkYgfCBQSFlfMTAwMEJUQ1JfMTAwMEZEIHwgUEhZXzEwMDBCVENSXzEwMDBIRCk7CisKKwkJaWYgKGJtc3IgJiBQSFlfQk1TUl8xMDBUNCkKKwkJCWFuYXIgfD0gUEhZX0FOTFBBUl9UNDsKKworCQlpZiAoYm1zciAmIFBIWV9CTVNSXzEwMFRYRikKKwkJCWFuYXIgfD0gUEhZX0FOTFBBUl9UWEZEOworCisJCWlmIChibXNyICYgUEhZX0JNU1JfMTAwVFhIKQorCQkJYW5hciB8PSBQSFlfQU5MUEFSX1RYOworCisJCWlmIChibXNyICYgUEhZX0JNU1JfMTBURikKKwkJCWFuYXIgfD0gUEhZX0FOTFBBUl8xMEZEOworCisJCWlmIChibXNyICYgUEhZX0JNU1JfMTBUSCkKKwkJCWFuYXIgfD0gUEhZX0FOTFBBUl8xMDsKKworCQltaWlwaHlfd3JpdGUgKGRldm5hbWUsIGFkZHIsIFBIWV9BTkFSLCBhbmFyKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1BIWV9HSUdFKQorCQlpZiAoZXhzciAmIFBIWV9FWFNSXzEwMDBURikKKwkJCWJ0Y3IgfD0gUEhZXzEwMDBCVENSXzEwMDBGRDsKKworCQlpZiAoZXhzciAmIFBIWV9FWFNSXzEwMDBUSCkKKwkJCWJ0Y3IgfD0gUEhZXzEwMDBCVENSXzEwMDBIRDsKKworCQltaWlwaHlfd3JpdGUgKGRldm5hbWUsIGFkZHIsIFBIWV8xMDAwQlRDUiwgYnRjcik7CisjZW5kaWYKKwl9CisKKyNlbHNlIC8qIGRlZmluZWQoQ09ORklHX1BIWV9EWU5BTUlDX0FORUcpICovCisJLyoKKwkgKiBTZXQgdXAgc3RhbmRhcmQgYWR2ZXJ0aXNlbWVudAorCSAqLworCXUxNiBhZHY7CisKKwltaWlwaHlfcmVhZCAoZGV2bmFtZSwgYWRkciwgUEhZX0FOQVIsICZhZHYpOworCWFkdiB8PSAoUEhZX0FOTFBBUl9BQ0sgIHwgUEhZX0FOTFBBUl9UWEZEIHwgUEhZX0FOTFBBUl9UWCB8CisJCVBIWV9BTkxQQVJfMTBGRCB8IFBIWV9BTkxQQVJfMTApOworCW1paXBoeV93cml0ZSAoZGV2bmFtZSwgYWRkciwgUEhZX0FOQVIsIGFkdik7CisKKwltaWlwaHlfcmVhZCAoZGV2bmFtZSwgYWRkciwgUEhZXzEwMDBCVENSLCAmYWR2KTsKKwlhZHYgfD0gKDB4MDMwMCk7CisJbWlpcGh5X3dyaXRlIChkZXZuYW1lLCBhZGRyLCBQSFlfMTAwMEJUQ1IsIGFkdik7CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QSFlfRFlOQU1JQ19BTkVHKSAqLworCisJLyogU3RhcnQvUmVzdGFydCBhbmVnICovCisJbWlpcGh5X3JlYWQgKGRldm5hbWUsIGFkZHIsIFBIWV9CTUNSLCAmYm1jcik7CisJYm1jciB8PSAoUEhZX0JNQ1JfQVVUT04gfCBQSFlfQk1DUl9SU1RfTkVHKTsKKwltaWlwaHlfd3JpdGUgKGRldm5hbWUsIGFkZHIsIFBIWV9CTUNSLCBibWNyKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiByZWFkIGEgcGh5IHJlZyBhbmQgcmV0dXJuIHRoZSB2YWx1ZSB3aXRoIGEgcmMJICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEFNQ0NfVE9ETzoKKyAqIEZpbmQgb3V0IG9mIHRoZSBjaG9pY2UgZm9yIHRoZSBlbWFjIGZvciBNRElPIGlzIGZyb20gdGhlIGJyaWRnZXMsCisgKiBpLmUuIFpNSUkgb3IgUkdNSUkgYXMgYXBwcm9wb3JpYXRlLiAgSWYgdGhlIGJyaWRnZXMgYXJlIG5vdCB1c2VkCisgKiB0byBkZXRlcm1pbmUgdGhlIGVtYWMgZm9yIE1ESU8sIHRoZW4gaXMgdGhlIFNEUjBfRVRIX0NGR1tNRElPX1NFTF0KKyAqIHVzZWQ/ICBJZiBzbywgdGhlbiB0aGlzIHJvdXRpbmUgYmVsb3cgZG9lcyBub3QgYXBwbHkgdG8gdGhlIDQ2MEVYL0dULgorICoKKyAqIHNyOiBDdXJyZW50bHkgb24gNDYwRVggb25seSBFTUFDMCB3b3JrcyB3aXRoIE1ESU8sIHNvIHdlIGFsd2F5cworICogcmV0dXJuIEVNQUMwIG9mZnNldCBoZXJlCisgKiB2ZzogRm9yIDQ2MEVYLzQ2MEdUIGlmIGludGVybmFsIEdQQ1MgUEhZIGFkZHJlc3MgaXMgc3BlY2lmaWVkCisgKiByZXR1cm4gYXBwcm9wcmlhdGUgRU1BQyBvZmZzZXQKKyAqLwordW5zaWduZWQgaW50IG1paXBoeV9nZXRlbWFjX29mZnNldCh1OCBhZGRyKQoreworI2lmIChkZWZpbmVkKENPTkZJR180NDApICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfNDQwU1ApICYmICFkZWZpbmVkKENPTkZJR180NDBTUEUpICYmIFwKKyAgICAhZGVmaW5lZChDT05GSUdfNDYwRVgpICYmICFkZWZpbmVkKENPTkZJR180NjBHVCkpICYmIFwKKyAgICBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpCisJdW5zaWduZWQgbG9uZyB6bWlpOworCXVuc2lnbmVkIGxvbmcgZW9mZnNldDsKKworCS8qIE5lZWQgdG8gZmluZCBvdXQgd2hpY2ggbWRpIHBvcnQgd2UncmUgdXNpbmcgKi8KKwl6bWlpID0gaW5fYmUzMigodm9pZCAqKVpNSUkwX0ZFUik7CisKKwlpZiAoem1paSAmIChaTUlJX0ZFUl9NREkgPDwgWk1JSV9GRVJfViAoMCkpKQorCQkvKiB1c2luZyBwb3J0IDAgKi8KKwkJZW9mZnNldCA9IDA7CisKKwllbHNlIGlmICh6bWlpICYgKFpNSUlfRkVSX01ESSA8PCBaTUlJX0ZFUl9WICgxKSkpCisJCS8qIHVzaW5nIHBvcnQgMSAqLworCQllb2Zmc2V0ID0gMHgxMDA7CisKKwllbHNlIGlmICh6bWlpICYgKFpNSUlfRkVSX01ESSA8PCBaTUlJX0ZFUl9WICgyKSkpCisJCS8qIHVzaW5nIHBvcnQgMiAqLworCQllb2Zmc2V0ID0gMHg0MDA7CisKKwllbHNlIGlmICh6bWlpICYgKFpNSUlfRkVSX01ESSA8PCBaTUlJX0ZFUl9WICgzKSkpCisJCS8qIHVzaW5nIHBvcnQgMyAqLworCQllb2Zmc2V0ID0gMHg2MDA7CisKKwllbHNlIHsKKwkJLyogTm9uZSBvZiB0aGUgbWRpIHBvcnRzIGFyZSBlbmFibGVkISAqLworCQkvKiBlbmFibGUgcG9ydCAwICovCisJCXptaWkgfD0gWk1JSV9GRVJfTURJIDw8IFpNSUlfRkVSX1YgKDApOworCQlvdXRfYmUzMigodm9pZCAqKVpNSUkwX0ZFUiwgem1paSk7CisJCWVvZmZzZXQgPSAwOworCQkvKiBuZWVkIHRvIHNvZnQgcmVzZXQgcG9ydCAwICovCisJCXptaWkgPSBpbl9iZTMyKCh2b2lkICopRU1BQzBfTVIwKTsKKwkJem1paSB8PSBFTUFDX01SMF9TUlNUOworCQlvdXRfYmUzMigodm9pZCAqKUVNQUMwX01SMCwgem1paSk7CisJfQorCisJcmV0dXJuIChlb2Zmc2V0KTsKKyNlbHNlCisKKyNpZiBkZWZpbmVkKENPTkZJR19ORVRfTVVMVEkpICYmIGRlZmluZWQoQ09ORklHXzQwNUVYKQorCXVuc2lnbmVkIGxvbmcgcmdtaWk7CisJaW50IGRldm51bSA9IDE7CisKKwlyZ21paSA9IGluX2JlMzIoKHZvaWQgKilSR01JSV9GRVIpOworCWlmIChyZ21paSAmICgxIDw8ICgxOSAtIGRldm51bSkpKQorCQlyZXR1cm4gMHgxMDA7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ2MEVYKSB8fCBkZWZpbmVkKENPTkZJR180NjBHVCkKKwl1MzIgZW9mZnNldCA9IDA7CisKKwlzd2l0Y2ggKGFkZHIpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19IQVNfRVRIMSkgJiYgZGVmaW5lZChDT05GSUdfR1BDU19QSFkxX0FERFIpCisJY2FzZSBDT05GSUdfR1BDU19QSFkxX0FERFI6CisJCWlmIChhZGRyID09IEVNQUNfTVIxX0lQUEFfR0VUKGluX2JlMzIoKHZvaWQgKilFTUFDMF9NUjEgKyAweDEwMCkpKQorCQkJZW9mZnNldCA9IDB4MTAwOworCQlicmVhazsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0hBU19FVEgyKSAmJiBkZWZpbmVkKENPTkZJR19HUENTX1BIWTJfQUREUikKKwljYXNlIENPTkZJR19HUENTX1BIWTJfQUREUjoKKwkJaWYgKGFkZHIgPT0gRU1BQ19NUjFfSVBQQV9HRVQoaW5fYmUzMigodm9pZCAqKUVNQUMwX01SMSArIDB4MzAwKSkpCisJCQllb2Zmc2V0ID0gMHgzMDA7CisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfSEFTX0VUSDMpICYmIGRlZmluZWQoQ09ORklHX0dQQ1NfUEhZM19BRERSKQorCWNhc2UgQ09ORklHX0dQQ1NfUEhZM19BRERSOgorCQlpZiAoYWRkciA9PSBFTUFDX01SMV9JUFBBX0dFVChpbl9iZTMyKCh2b2lkICopRU1BQzBfTVIxICsgMHg0MDApKSkKKwkJCWVvZmZzZXQgPSAweDQwMDsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQllb2Zmc2V0ID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBlb2Zmc2V0OworI2VuZGlmCisKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGVtYWNfbWlpcGh5X3dhaXQodTMyIGVtYWNfcmVnKQoreworCXUzMiBzdGFfcmVnOworCWludCBpOworCisJLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworCWkgPSAwOworCWRvIHsKKwkJc3RhX3JlZyA9IGluX2JlMzIoKHZvaWQgKilFTUFDMF9TVEFDUiArIGVtYWNfcmVnKTsKKwkJaWYgKGkrKyA+IDUpIHsKKwkJCWRlYnVnKCIlcyBbJWRdOiBUaW1lb3V0ISBFTUFDMF9TVEFDUj0weCUweFxuIiwgX19mdW5jX18sCisJCQkgICAgICBfX0xJTkVfXywgc3RhX3JlZyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9IHdoaWxlICgoc3RhX3JlZyAmIEVNQUNfU1RBQ1JfT0MpID09IEVNQUNfU1RBQ1JfT0NfTUFTSyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbWFjX21paXBoeV9jb21tYW5kKHU4IGFkZHIsIHU4IHJlZywgaW50IGNtZCwgdTE2IHZhbHVlKQoreworCXUzMiBlbWFjX3JlZzsKKwl1MzIgc3RhX3JlZzsKKworCWVtYWNfcmVnID0gbWlpcGh5X2dldGVtYWNfb2Zmc2V0KGFkZHIpOworCisJLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworCWlmIChlbWFjX21paXBoeV93YWl0KGVtYWNfcmVnKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlzdGFfcmVnID0gcmVnOwkJLyogcmVnIGFkZHJlc3MgKi8KKworCS8qIHNldCBjbG9jayAoNTBNSHopIGFuZCByZWFkIGZsYWdzICovCisjaWYgZGVmaW5lZChDT05GSUdfNDQwR1gpIHx8IGRlZmluZWQoQ09ORklHXzQ0MFNQRSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDYwRVgpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEdUKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDA1RVgpCisjaWYgZGVmaW5lZChDT05GSUdfSUJNX0VNQUM0X1Y0KQkvKiBFTUFDNCBWNCBjaGFuZ2VkIGJpdCBzZXR0aW5nICovCisJc3RhX3JlZyA9IChzdGFfcmVnICYgfkVNQUNfU1RBQ1JfT1BfTUFTSykgfCBjbWQ7CisjZWxzZQorCXN0YV9yZWcgfD0gY21kOworI2VuZGlmCisjZWxzZQorCXN0YV9yZWcgPSAoc3RhX3JlZyB8IGNtZCkgJiB+RU1BQ19TVEFDUl9DTEtfMTAwTUhaOworI2VuZGlmCisKKwkvKiBTb21lIGJvYXJkcyAobWFpbmx5IDQwNUVQIGJhc2VkKSBkZWZpbmUgdGhlIFBIWSBjbG9jayBmcmVxZW5jeSBmaXhlZCAqLworCXN0YV9yZWcgPSBzdGFfcmVnIHwgQ09ORklHX1BIWV9DTEtfRlJFUTsKKwlzdGFfcmVnID0gc3RhX3JlZyB8ICgodTMyKWFkZHIgPDwgNSk7CS8qIFBoeSBhZGRyZXNzICovCisJc3RhX3JlZyA9IHN0YV9yZWcgfCBFTUFDX1NUQUNSX09DX01BU0s7CS8qIG5ldyBJQk0gZW1hYyB2NCAqLworCWlmIChjbWQgPT0gRU1BQ19TVEFDUl9XUklURSkKKwkJbWVtY3B5KCZzdGFfcmVnLCAmdmFsdWUsIDIpOwkvKiBwdXQgaW4gZGF0YSAqLworCisJb3V0X2JlMzIoKHZvaWQgKilFTUFDMF9TVEFDUiArIGVtYWNfcmVnLCBzdGFfcmVnKTsKKwlkZWJ1ZygiJXMgWyVkXTogc3RhX3JlZz0lMDh4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHN0YV9yZWcpOworCisJLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworCWlmIChlbWFjX21paXBoeV93YWl0KGVtYWNfcmVnKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlkZWJ1ZygiJXMgWyVkXTogc3RhX3JlZz0lMDh4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHN0YV9yZWcpOworCWlmICgoc3RhX3JlZyAmIEVNQUNfU1RBQ1JfUEhZRSkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbWFjNHh4X21paXBoeV9yZWFkIChjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGFkZHIsIHVuc2lnbmVkIGNoYXIgcmVnLAorCQkJIHVuc2lnbmVkIHNob3J0ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YV9yZWc7CisJdW5zaWduZWQgbG9uZyBlbWFjX3JlZzsKKworCWVtYWNfcmVnID0gbWlpcGh5X2dldGVtYWNfb2Zmc2V0KGFkZHIpOworCisJaWYgKGVtYWNfbWlpcGh5X2NvbW1hbmQoYWRkciwgcmVnLCBFTUFDX1NUQUNSX1JFQUQsIDApICE9IDApCisJCXJldHVybiAtMTsKKworCXN0YV9yZWcgPSBpbl9iZTMyKCh2b2lkICopRU1BQzBfU1RBQ1IgKyBlbWFjX3JlZyk7CisJKnZhbHVlID0gc3RhX3JlZyA+PiAxNjsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB3cml0ZSBhIHBoeSByZWcgYW5kIHJldHVybiB0aGUgdmFsdWUgd2l0aCBhIHJjCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZW1hYzR4eF9taWlwaHlfd3JpdGUgKGNoYXIgKmRldm5hbWUsIHVuc2lnbmVkIGNoYXIgYWRkciwgdW5zaWduZWQgY2hhciByZWcsCisJCQkgIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCXJldHVybiBlbWFjX21paXBoeV9jb21tYW5kKGFkZHIsIHJlZywgRU1BQ19TVEFDUl9XUklURSwgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvcmVnaW5mby5jIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvcmVnaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzU2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9yZWdpbmZvLmMKQEAgLTAsMCArMSwzNzAgQEAKKy8qCisgKihDKSBDb3B5cmlnaHQgMjAwNS0yMDA5IE5ldHN0YWwgTWFzY2hpbmVuIEFHCisgKiAgICBCcnVubyBIYXJzIChCcnVuby5IYXJzQG5ldHN0YWwuY29tKQorICogICAgTmlrbGF1cyBHaWdlciAoTmlrbGF1cy5HaWdlckBuZXRzdGFsLmNvbSkKKyAqCisgKiAgICBUaGlzIHNvdXJjZSBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CisgKiAgICBhbmQvb3IgbW9kaWZ5IGl0IGluIHNvdXJjZSBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICovCisKKy8qCisgKiByZWdpbmZvLmMgLSByZWdpc3RlciBkdW1wIG9mIEhXLWNvbmZpZ3VyYXRpbiByZWdpc3RlciBmb3IgUFBDNHh4IGJhc2VkIGJvYXJkCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BwYzR4eC11aWMuaD4KKyNpbmNsdWRlIDxwcGM0eHhfZW5ldC5oPgorCitlbnVtIFJFR0lTVEVSX1RZUEUgeworCUlEQ1IxLAkvKiBJbmRpcmVjdGx5IEFjY2Vzc2VkIERDUiB2aWEgU0RSQU0wX0NGR0FERFIvU0RSQU0wX0NGR0RBVEEgKi8KKwlJRENSMiwJLyogSW5kaXJlY3RseSBBY2Nlc3NlZCBEQ1IgdmlhIEVCQzBfQ0ZHQUREUi9FQkMwX0NGR0RBVEEgKi8KKwlJRENSMywJLyogSW5kaXJlY3RseSBBY2Nlc3NlZCBEQ1IgdmlhIEVCTTBfQ0ZHQUREUi9FQk0wX0NGR0RBVEEgKi8KKwlJRENSNCwJLyogSW5kaXJlY3RseSBBY2Nlc3NlZCBEQ1IgdmlhIFBQTTBfQ0ZHQUREUi9QUE0wX0NGR0RBVEEgKi8KKwlJRENSNSwJLyogSW5kaXJlY3RseSBBY2Nlc3NlZCBEQ1IgdmlhIENQUjBfQ0ZHQUREUi9DUFIwX0NGR0RBVEEgKi8KKwlJRENSNiwJLyogSW5kaXJlY3RseSBBY2Nlc3NlZCBEQ1IgdmlhIFNEUjBfQ0ZHQUREUi9TRFIwX0NGR0RBVEEgKi8KKwlNTQkvKiBEaXJlY3RseSBBY2Nlc3NlZCBNTUlPIFJlZ2lzdGVyICovCit9OworCitzdHJ1Y3QgY3B1X3JlZ2lzdGVyIHsKKwljaGFyICpuYW1lOworCWVudW0gUkVHSVNURVJfVFlQRSB0eXBlOworCXUzMiBhZGRyZXNzOworfTsKKworLyoKKyAqIFBQQzQ0MEVQeCByZWdpc3RlcnMgb3JkZXJlZCBmb3Igb3V0cHV0CisgKiBuYW1lICAgICAgICAgICB0eXBlICAgIGFkZHIgICAgICAgICAgICBzaXplCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworY29uc3Qgc3RydWN0IGNwdV9yZWdpc3RlciBwcGM0eHhfcmVnW10gPSB7CisJeyJQQjBDUiIsCQlJRENSMiwJUEIwQ1J9LAorCXsiUEIwQVAiLAkJSURDUjIsCVBCMEFQfSwKKwl7IlBCMUNSIiwJCUlEQ1IyLAlQQjFDUn0sCisJeyJQQjFBUCIsCQlJRENSMiwJUEIxQVB9LAorCXsiUEIyQ1IiLAkJSURDUjIsCVBCMkNSfSwKKwl7IlBCMkFQIiwJCUlEQ1IyLAlQQjJBUH0sCisJeyJQQjNDUiIsCQlJRENSMiwJUEIzQ1J9LAorCXsiUEIzQVAiLAkJSURDUjIsCVBCM0FQfSwKKworCXsiUEI0Q1IiLAkJSURDUjIsCVBCNENSfSwKKwl7IlBCNEFQIiwJCUlEQ1IyLAlQQjRBUH0sCisjaWYgIWRlZmluZWQoQ09ORklHXzQwNUVQKQorCXsiUEI1Q1IiLAkJSURDUjIsCVBCNUNSfSwKKwl7IlBCNUFQIiwJCUlEQ1IyLAlQQjVBUH0sCisJeyJQQjZDUiIsCQlJRENSMiwJUEI2Q1J9LAorCXsiUEI2QVAiLAkJSURDUjIsCVBCNkFQfSwKKwl7IlBCN0NSIiwJCUlEQ1IyLAlQQjdDUn0sCisJeyJQQjdBUCIsCQlJRENSMiwJUEI3QVB9LAorI2VuZGlmCisKKwl7IlBCRUFSIiwJCUlEQ1IyLAlQQkVBUn0sCisjaWYgZGVmaW5lZChDT05GSUdfNDA1RVApIHx8IGRlZmluZWQgKENPTkZJR180MDVHUCkKKwl7IlBCRVNSMCIsCQlJRENSMiwJUEJFU1IwfSwKKwl7IlBCRVNSMSIsCQlJRENSMiwJUEJFU1IxfSwKKyNlbmRpZgorCXsiRUJDMF9DRkciLAkJSURDUjIsCUVCQzBfQ0ZHfSwKKworI2lmZGVmIENPTkZJR180MDVHUAorCXsiU0RSQU0wX0JFU1IwIiwJSURDUjEsCVNEUkFNMF9CRVNSMH0sCisJeyJTRFJBTTBfQkVTUlMwIiwJSURDUjEsCVNEUkFNMF9CRVNSUzB9LAorCXsiU0RSQU0wX0JFU1IxIiwJSURDUjEsCVNEUkFNMF9CRVNSMX0sCisJeyJTRFJBTTBfQkVTUlMxIiwJSURDUjEsCVNEUkFNMF9CRVNSUzF9LAorCXsiU0RSQU0wX0JFQVIiLAkJSURDUjEsCVNEUkFNMF9CRUFSfSwKKwl7IlNEUkFNMF9DRkciLAkJSURDUjEsCVNEUkFNMF9DRkd9LAorCXsiU0RSQU0wX1JUUiIsCQlJRENSMSwJU0RSQU0wX1JUUn0sCisJeyJTRFJBTTBfUE1JVCIsCQlJRENSMSwJU0RSQU0wX1BNSVR9LAorCisJeyJTRFJBTTBfQjBDUiIsCQlJRENSMSwJU0RSQU0wX0IwQ1J9LAorCXsiU0RSQU0wX0IxQ1IiLAkJSURDUjEsCVNEUkFNMF9CMUNSfSwKKwl7IlNEUkFNMF9CMkNSIiwJCUlEQ1IxLAlTRFJBTTBfQjJDUn0sCisJeyJTRFJBTTBfQjNDUiIsCQlJRENSMSwJU0RSQU0wX0IxQ1J9LAorCXsiU0RSQU0wX1RSIiwJCUlEQ1IxLAlTRFJBTTBfVFJ9LAorCXsiU0RSQU0wX0VDQ0NGRyIsCUlEQ1IxLAlTRFJBTTBfQjFDUn0sCisJeyJTRFJBTTBfRUNDRVNSIiwJSURDUjEsCVNEUkFNMF9FQ0NFU1J9LAorCisKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHXzQ0MEVQWAorCXsiU0RSMF9TRFNUUDAiLAkJSURDUjYsCVNEUjBfU0RTVFAwfSwKKwl7IlNEUjBfU0RTVFAxIiwJCUlEQ1I2LAlTRFIwX1NEU1RQMX0sCisJeyJTRFIwX1NEU1RQMiIsCQlJRENSNiwJU0RSMF9TRFNUUDJ9LAorCXsiU0RSMF9TRFNUUDMiLAkJSURDUjYsCVNEUjBfU0RTVFAzfSwKKwl7IlNEUjBfQ1VTVDAiLAkJSURDUjYsCVNEUjBfQ1VTVDB9LAorCXsiU0RSMF9DVVNUMSIsCQlJRENSNiwJU0RSMF9DVVNUMX0sCisJeyJTRFIwX0VCQzAiLAkJSURDUjYsCVNEUjBfRUJDMH0sCisJeyJTRFIwX0FNUDAiLAkJSURDUjYsCVNEMF9BTVAwfSwKKwl7IlNEUjBfQU1QMSIsCQlJRENSNiwJU0QwX0FNUDF9LAorCXsiU0RSMF9DUDQ0MCIsCQlJRENSNiwJU0RSMF9DUDQ0MH0sCisJeyJTRFIwX0NSWVAwIiwJCUlEQ1I2LAlTRFIwX0NSWVAwfSwKKwl7IlNEUjBfRERSQ0ZHIiwJCUlEQ1I2LAlTRFIwX0REUkNGR30sCisJeyJTRFIwX0VNQUMwUlhTVCIsCUlEQ1I2LAlTRFIwX0VNQUMwUlhTVH0sCisJeyJTRFIwX0VNQUMwVFhTVCIsCUlEQ1I2LAlTRFIwX0VNQUMwVFhTVH0sCisJeyJTRFIwX01GUiIsCQlJRENSNiwJU0RSMF9NRlJ9LAorCXsiU0RSMF9QQ0kwIiwJCUlEQ1I2LAlTRFIwX1BDSTB9LAorCXsiU0RSMF9QRkMwIiwJCUlEQ1I2LAlTRFIwX1BGQzB9LAorCXsiU0RSMF9QRkMxIiwJCUlEQ1I2LAlTRFIwX1BGQzF9LAorCXsiU0RSMF9QRkMyIiwJCUlEQ1I2LAlTRFIwX1BGQzJ9LAorCXsiU0RSMF9QRkM0IiwJCUlEQ1I2LAlTRFIwX1BGQzR9LAorCXsiU0RSMF9VQVJUMCIsCQlJRENSNiwJU0RSMF9VQVJUMH0sCisJeyJTRFIwX1VBUlQxIiwJCUlEQ1I2LAlTRFIwX1VBUlQxfSwKKwl7IlNEUjBfVUFSVDIiLAkJSURDUjYsCVNEUjBfVUFSVDJ9LAorCXsiU0RSMF9VQVJUMyIsCQlJRENSNiwJU0RSMF9VQVJUM30sCisJeyJERFIwXzAyIiwJCUlEQ1IxLAlERFIwXzAyfSwKKwl7IkREUjBfMDAiLAkJSURDUjEsCUREUjBfMDB9LAorCXsiRERSMF8wMSIsCQlJRENSMSwJRERSMF8wMX0sCisJeyJERFIwXzAzIiwJCUlEQ1IxLAlERFIwXzAzfSwKKwl7IkREUjBfMDQiLAkJSURDUjEsCUREUjBfMDR9LAorCXsiRERSMF8wNSIsCQlJRENSMSwJRERSMF8wNX0sCisJeyJERFIwXzA2IiwJCUlEQ1IxLAlERFIwXzA2fSwKKwl7IkREUjBfMDciLAkJSURDUjEsCUREUjBfMDd9LAorCXsiRERSMF8wOCIsCQlJRENSMSwJRERSMF8wOH0sCisJeyJERFIwXzA5IiwJCUlEQ1IxLAlERFIwXzA5fSwKKwl7IkREUjBfMTAiLAkJSURDUjEsCUREUjBfMTB9LAorCXsiRERSMF8xMSIsCQlJRENSMSwJRERSMF8xMX0sCisJeyJERFIwXzEyIiwJCUlEQ1IxLAlERFIwXzEyfSwKKwl7IkREUjBfMTQiLAkJSURDUjEsCUREUjBfMTR9LAorCXsiRERSMF8xNyIsCQlJRENSMSwJRERSMF8xN30sCisJeyJERFIwXzE4IiwJCUlEQ1IxLAlERFIwXzE4fSwKKwl7IkREUjBfMTkiLAkJSURDUjEsCUREUjBfMTl9LAorCXsiRERSMF8yMCIsCQlJRENSMSwJRERSMF8yMH0sCisJeyJERFIwXzIxIiwJCUlEQ1IxLAlERFIwXzIxfSwKKwl7IkREUjBfMjIiLAkJSURDUjEsCUREUjBfMjJ9LAorCXsiRERSMF8yMyIsCQlJRENSMSwJRERSMF8yM30sCisJeyJERFIwXzI0IiwJCUlEQ1IxLAlERFIwXzI0fSwKKwl7IkREUjBfMjUiLAkJSURDUjEsCUREUjBfMjV9LAorCXsiRERSMF8yNiIsCQlJRENSMSwJRERSMF8yNn0sCisJeyJERFIwXzI3IiwJCUlEQ1IxLAlERFIwXzI3fSwKKwl7IkREUjBfMjgiLAkJSURDUjEsCUREUjBfMjh9LAorCXsiRERSMF8zMSIsCQlJRENSMSwJRERSMF8zMX0sCisJeyJERFIwXzMyIiwJCUlEQ1IxLAlERFIwXzMyfSwKKwl7IkREUjBfMzMiLAkJSURDUjEsCUREUjBfMzN9LAorCXsiRERSMF8zNCIsCQlJRENSMSwJRERSMF8zNH0sCisJeyJERFIwXzM1IiwJCUlEQ1IxLAlERFIwXzM1fSwKKwl7IkREUjBfMzYiLAkJSURDUjEsCUREUjBfMzZ9LAorCXsiRERSMF8zNyIsCQlJRENSMSwJRERSMF8zN30sCisJeyJERFIwXzM4IiwJCUlEQ1IxLAlERFIwXzM4fSwKKwl7IkREUjBfMzkiLAkJSURDUjEsCUREUjBfMzl9LAorCXsiRERSMF80MCIsCQlJRENSMSwJRERSMF80MH0sCisJeyJERFIwXzQxIiwJCUlEQ1IxLAlERFIwXzQxfSwKKwl7IkREUjBfNDIiLAkJSURDUjEsCUREUjBfNDJ9LAorCXsiRERSMF80MyIsCQlJRENSMSwJRERSMF80M30sCisJeyJERFIwXzQ0IiwJCUlEQ1IxLAlERFIwXzQ0fSwKKwl7IkNQUjBfSUNGRyIsCQlJRENSNSwJQ1BSMF9JQ0ZHfSwKKwl7IkNQUjBfTUFMRCIsCQlJRENSNSwJQ1BSMF9NQUxEfSwKKwl7IkNQUjBfT1BCRDAwIiwJCUlEQ1I1LAlDUFIwX09QQkQwfSwKKwl7IkNQUjBfUEVSRDAiLAkJSURDUjUsCUNQUjBfUEVSRH0sCisJeyJDUFIwX1BMTEMwIiwJCUlEQ1I1LAlDUFIwX1BMTEN9LAorCXsiQ1BSMF9QTExEMCIsCQlJRENSNSwJQ1BSMF9QTExEfSwKKwl7IkNQUjBfUFJJTUFEMCIsCUlEQ1I1LAlDUFIwX1BSSU1BRDB9LAorCXsiQ1BSMF9QUklNQkQwIiwJSURDUjUsCUNQUjBfUFJJTUJEMH0sCisJeyJDUFIwX1NQQ0lEIiwJCUlEQ1I1LAlDUFIwX1NQQ0lEfSwKKwl7IlNQSTBfTU9ERSIsCQlNTSwJU1BJMF9NT0RFfSwKKwl7IklJQzBfQ0xLRElWIiwJCU1NLAlQQ0lMMF9QTU0xTUF9LAorCXsiUENJTDBfUE1NME1BIiwJTU0sCVBDSUwwX1BNTTBNQX0sCisJeyJQQ0lMMF9QTU0xTUEiLAlNTSwJUENJTDBfUE1NMU1BfSwKKwl7IlBDSUwwX1BUTTFMQSIsCU1NLAlQQ0lMMF9QTU0xTUF9LAorCXsiUENJTDBfUFRNMU1TIiwJTU0sCVBDSUwwX1BUTTFNU30sCisJeyJQQ0lMMF9QVE0yTEEiLAlNTSwJUENJTDBfUE1NMU1BfSwKKwl7IlBDSUwwX1BUTTJNUyIsCU1NLAlQQ0lMMF9QVE0yTVN9LAorCXsiWk1JSTBfRkVSIiwJCU1NLAlaTUlJMF9GRVJ9LAorCXsiWk1JSTBfU1NSIiwJCU1NLAlaTUlJMF9TU1J9LAorCXsiRU1BQzBfSVBHVlIiLAkJTU0sCUVNQUMwX0lQR1ZSfSwKKwl7IkVNQUMwX01SMSIsCQlNTSwJRU1BQzBfTVIxfSwKKwl7IkVNQUMwX1BUUiIsCQlNTSwJRU1BQzBfUFRSfSwKKwl7IkVNQUMwX1JXTVIiLAkJTU0sCUVNQUMwX1JXTVJ9LAorCXsiRU1BQzBfU1RBQ1IiLAkJTU0sCUVNQUMwX1NUQUNSfSwKKwl7IkVNQUMwX1RNUjAiLAkJTU0sCUVNQUMwX1RNUjB9LAorCXsiRU1BQzBfVE1SMSIsCQlNTSwJRU1BQzBfVE1SMX0sCisJeyJFTUFDMF9UUlRSIiwJCU1NLAlFTUFDMF9UUlRSfSwKKwl7IkVNQUMxX01SMSIsCQlNTSwJRU1BQzFfTVIxfSwKKwl7IkdQSU8wX09SIiwJCU1NLAlHUElPMF9PUn0sCisJeyJHUElPMV9PUiIsCQlNTSwJR1BJTzFfT1J9LAorCXsiR1BJTzBfVENSIiwJCU1NLAlHUElPMF9UQ1J9LAorCXsiR1BJTzFfVENSIiwJCU1NLAlHUElPMV9UQ1J9LAorCXsiR1BJTzBfT0RSIiwJCU1NLAlHUElPMF9PRFJ9LAorCXsiR1BJTzFfT0RSIiwJCU1NLAlHUElPMV9PRFJ9LAorCXsiR1BJTzBfT1NSTCIsCQlNTSwJR1BJTzBfT1NSTH0sCisJeyJHUElPMF9PU1JIIiwJCU1NLAlHUElPMF9PU1JIfSwKKwl7IkdQSU8xX09TUkwiLAkJTU0sCUdQSU8xX09TUkx9LAorCXsiR1BJTzFfT1NSSCIsCQlNTSwJR1BJTzFfT1NSSH0sCisJeyJHUElPMF9UU1JMIiwJCU1NLAlHUElPMF9UU1JMfSwKKwl7IkdQSU8wX1RTUkgiLAkJTU0sCUdQSU8wX1RTUkh9LAorCXsiR1BJTzFfVFNSTCIsCQlNTSwJR1BJTzFfVFNSTH0sCisJeyJHUElPMV9UU1JIIiwJCU1NLAlHUElPMV9UU1JIfSwKKwl7IkdQSU8wX0lSIiwJCU1NLAlHUElPMF9JUn0sCisJeyJHUElPMV9JUiIsCQlNTSwJR1BJTzFfSVJ9LAorCXsiR1BJTzBfSVNSMUwiLAkJTU0sCUdQSU8wX0lTUjFMfSwKKwl7IkdQSU8wX0lTUjFIIiwJCU1NLAlHUElPMF9JU1IxSH0sCisJeyJHUElPMV9JU1IxTCIsCQlNTSwJR1BJTzFfSVNSMUx9LAorCXsiR1BJTzFfSVNSMUgiLAkJTU0sCUdQSU8xX0lTUjFIfSwKKwl7IkdQSU8wX0lTUjJMIiwJCU1NLAlHUElPMF9JU1IyTH0sCisJeyJHUElPMF9JU1IySCIsCQlNTSwJR1BJTzBfSVNSMkh9LAorCXsiR1BJTzFfSVNSMkwiLAkJTU0sCUdQSU8xX0lTUjJMfSwKKwl7IkdQSU8xX0lTUjJIIiwJCU1NLAlHUElPMV9JU1IySH0sCisJeyJHUElPMF9JU1IzTCIsCQlNTSwJR1BJTzBfSVNSM0x9LAorCXsiR1BJTzBfSVNSM0giLAkJTU0sCUdQSU8wX0lTUjNIfSwKKwl7IkdQSU8xX0lTUjNMIiwJCU1NLAlHUElPMV9JU1IzTH0sCisJeyJHUElPMV9JU1IzSCIsCQlNTSwJR1BJTzFfSVNSM0h9LAorCXsiU0RSMF9VU0IyUEhZMENSIiwJSURDUjYsCVNEUjBfVVNCMlBIWTBDUn0sCisJeyJTRFIwX1VTQjJIMENSIiwJSURDUjYsCVNEUjBfVVNCMkgwQ1J9LAorCXsiU0RSMF9VU0IyRDBDUiIsCUlEQ1I2LAlTRFIwX1VTQjJEMENSfSwKKyNlbmRpZgorfTsKKworLyoKKyAqIENQVSBSZWdpc3RlciBkdW1wIG9mIFBQQzR4eCBIVyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICogT3V0cHV0OiBmaXJzdCBhbGwgRENSLXJlZ2lzdGVycywgdGhlbiBpbiBvcmRlciBvZiBzdHJ1Y3QgcHBjNHh4X3JlZworICovCisjZGVmaW5lIFBSSU5UX0RDUihkY3IpIAlwcmludGYoIjB4JTA4eCAlLTE2czogMHglMDh4XG4iLCBkY3IsI2RjciwgbWZkY3IoZGNyKSk7CisKK3ZvaWQgcHBjNHh4X3JlZ2luZm8odm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbjsKKwl1MzIgdmFsdWU7CisJZW51bSBSRUdJU1RFUl9UWVBFIHR5cGU7CisjaWYgZGVmaW5lZCAoQ09ORklHXzQwNUVQKQorCXByaW50ZigiRHVtcCBQUEM0MDVFUCBIVyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyc1xuXG4iKTsKKyNlbGlmIENPTkZJR180MDVHUAorCXByaW50ZiAoIkR1bXAgNDA1R1AgSFcgY29uZmlndXJhdGlvbiByZWdpc3RlcnNcblxuIik7CisjZWxpZiBDT05GSUdfNDQwRVBYCisJcHJpbnRmKCJEdW1wIFBQQzQ0MEVQeCBIVyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyc1xuXG4iKTsKKyNlbmRpZgorCXByaW50ZigiTVNSOiAweCUwOHhcbiIsIG1mbXNyKCkpOworCisJcHJpbnRmICgiXG5Vbml2ZXJzYWwgSW50ZXJydXB0IENvbnRyb2xsZXIgUmVnc1xuIik7CisJUFJJTlRfRENSKFVJQzBTUik7CisJUFJJTlRfRENSKFVJQzBFUik7CisJUFJJTlRfRENSKFVJQzBDUik7CisJUFJJTlRfRENSKFVJQzBQUik7CisJUFJJTlRfRENSKFVJQzBUUik7CisJUFJJTlRfRENSKFVJQzBNU1IpOworCVBSSU5UX0RDUihVSUMwVlIpOworCVBSSU5UX0RDUihVSUMwVkNSKTsKKworI2lmIChVSUNfTUFYID4gMSkKKwlQUklOVF9EQ1IoVUlDMlNSKTsKKwlQUklOVF9EQ1IoVUlDMkVSKTsKKwlQUklOVF9EQ1IoVUlDMkNSKTsKKwlQUklOVF9EQ1IoVUlDMlBSKTsKKwlQUklOVF9EQ1IoVUlDMlRSKTsKKwlQUklOVF9EQ1IoVUlDMk1TUik7CisJUFJJTlRfRENSKFVJQzJWUik7CisJUFJJTlRfRENSKFVJQzJWQ1IpOworI2VuZGlmCisKKyNpZiAoVUlDX01BWCA+IDIpCisJUFJJTlRfRENSKFVJQzJTUik7CisJUFJJTlRfRENSKFVJQzJFUik7CisJUFJJTlRfRENSKFVJQzJDUik7CisJUFJJTlRfRENSKFVJQzJQUik7CisJUFJJTlRfRENSKFVJQzJUUik7CisJUFJJTlRfRENSKFVJQzJNU1IpOworCVBSSU5UX0RDUihVSUMyVlIpOworCVBSSU5UX0RDUihVSUMyVkNSKTsKKyNlbmRpZgorCisjaWYgKFVJQ19NQVggPiAzKQorCVBSSU5UX0RDUihVSUMzU1IpOworCVBSSU5UX0RDUihVSUMzRVIpOworCVBSSU5UX0RDUihVSUMzQ1IpOworCVBSSU5UX0RDUihVSUMzUFIpOworCVBSSU5UX0RDUihVSUMzVFIpOworCVBSSU5UX0RDUihVSUMzTVNSKTsKKwlQUklOVF9EQ1IoVUlDM1ZSKTsKKwlQUklOVF9EQ1IoVUlDM1ZDUik7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKENPTkZJR180MDVFUCkgfHwgZGVmaW5lZCAoQ09ORklHXzQwNUdQKQorCXByaW50ZiAoIlxuXG5ETUEgQ2hhbm5lbHNcbiIpOworCVBSSU5UX0RDUihETUFTUik7CisJUFJJTlRfRENSKERNQVNHQyk7CisJUFJJTlRfRENSKERNQUFEUik7CisKKwlQUklOVF9EQ1IoRE1BQ1IwKTsKKwlQUklOVF9EQ1IoRE1BQ1QwKTsKKwlQUklOVF9EQ1IoRE1BREEwKTsKKwlQUklOVF9EQ1IoRE1BU0EwKTsKKwlQUklOVF9EQ1IoRE1BU0IwKTsKKworCVBSSU5UX0RDUihETUFDUjEpOworCVBSSU5UX0RDUihETUFDVDEpOworCVBSSU5UX0RDUihETUFEQTEpOworCVBSSU5UX0RDUihETUFTQTEpOworCVBSSU5UX0RDUihETUFTQjEpOworCisJUFJJTlRfRENSKERNQUNSMik7CisJUFJJTlRfRENSKERNQUNUMik7CisJUFJJTlRfRENSKERNQURBMik7CisJUFJJTlRfRENSKERNQVNBMik7CisJUFJJTlRfRENSKERNQVNCMik7CisKKwlQUklOVF9EQ1IoRE1BQ1IzKTsKKwlQUklOVF9EQ1IoRE1BQ1QzKTsKKwlQUklOVF9EQ1IoRE1BREEzKTsKKwlQUklOVF9EQ1IoRE1BU0EzKTsKKwlQUklOVF9EQ1IoRE1BU0IzKTsKKyNlbmRpZgorCisJcHJpbnRmICgiXG5cblZhcmlvdXMgSFctQ29uZmlndXJhdGlvbiByZWdpc3RlcnNcbiIpOworI2lmIGRlZmluZWQgKENPTkZJR180NDBFUFgpCisJUFJJTlRfRENSKE1BTDBfQ0ZHKTsKKwlQUklOVF9EQ1IoQ1BNMF9FUik7CisJUFJJTlRfRENSKENQTTFfRVIpOworCVBSSU5UX0RDUihQTEI0QTBfQUNSKTsKKwlQUklOVF9EQ1IoUExCNEExX0FDUik7CisJUFJJTlRfRENSKFBMQjNBMF9BQ1IpOworCVBSSU5UX0RDUihPUEIyUExCNDBfQkNUUkwpOworCVBSSU5UX0RDUihQNFAzQk8wX0NGRyk7CisjZW5kaWYKKwluID0gc2l6ZW9mKHBwYzR4eF9yZWcpIC8gc2l6ZW9mKHBwYzR4eF9yZWdbMF0pOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJdmFsdWUgPSAwOworCQl0eXBlID0gcHBjNHh4X3JlZ1tpXS50eXBlOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBJRENSMToJLyogSW5kaXJlY3QgdmlhIFNEUkFNMF9DRkdBRERSL0REUjBfQ0ZHREFUQSAqLworCQkJbXRkY3IoU0RSQU0wX0NGR0FERFIsIHBwYzR4eF9yZWdbaV0uYWRkcmVzcyk7CisJCQl2YWx1ZSA9IG1mZGNyKFNEUkFNMF9DRkdEQVRBKTsKKwkJCWJyZWFrOworCQljYXNlIElEQ1IyOgkvKiBJbmRpcmVjdCB2aWEgRUJDMF9DRkdBRERSL0VCQzBfQ0ZHREFUQSAqLworCQkJbXRkY3IoRUJDMF9DRkdBRERSLCBwcGM0eHhfcmVnW2ldLmFkZHJlc3MpOworCQkJdmFsdWUgPSBtZmRjcihFQkMwX0NGR0RBVEEpOworCQkJYnJlYWs7CisJCWNhc2UgSURDUjU6CS8qIEluZGlyZWN0IHZpYSBDUFIwX0NGR0FERFIvQ1BSMF9DRkdEQVRBICovCisJCQltdGRjcihDUFIwX0NGR0FERFIsIHBwYzR4eF9yZWdbaV0uYWRkcmVzcyk7CisJCQl2YWx1ZSA9IG1mZGNyKENQUjBfQ0ZHREFUQSk7CisJCQlicmVhazsKKwkJY2FzZSBJRENSNjoJLyogSW5kaXJlY3QgdmlhIFNEUjBfQ0ZHQUREUi9TRFIwX0NGR0RBVEEgKi8KKwkJCW10ZGNyKFNEUjBfQ0ZHQUREUiwgcHBjNHh4X3JlZ1tpXS5hZGRyZXNzKTsKKwkJCXZhbHVlID0gbWZkY3IoU0RSMF9DRkdEQVRBKTsKKwkJCWJyZWFrOworCQljYXNlIE1NOgkvKiBEaXJlY3RseSBBY2Nlc3NlZCBNTUlPIFJlZ2lzdGVyICovCisJCQl2YWx1ZSA9IGluX2JlMzIoKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIF9faW9tZW0gKikKKwkJCQlwcGM0eHhfcmVnW2ldLmFkZHJlc3MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIlxuRVJST1I6IHN0cnVjdCBlbnRyeSAlZDogdW5rbm93biByZWdpc3RlciIKKwkJCQkidHlwZVxuIiwgaSk7CisJCQlicmVhazsKKwkJfQorCQlwcmludGYoIjB4JTA4eCAlLTE2czogMHglMDh4XG4iLHBwYzR4eF9yZWdbaV0uYWRkcmVzcywKKwkJCXBwYzR4eF9yZWdbaV0ubmFtZSwgdmFsdWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3Jlc2V0dmVjLlMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9yZXNldHZlYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzA4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9yZXNldHZlYy5TCkBAIC0wLDAgKzEsMTIgQEAKKy8qIENvcHlyaWdodCBNb250YVZpc3RhIFNvZnR3YXJlIEluY29ycG9yYXRlZCwgMjAwMCAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorCS5zZWN0aW9uIC5yZXNldHZlYywiYXgiCisjaWYgZGVmaW5lZChDT05GSUdfNDQwKQorCWIgX3N0YXJ0XzQ0MAorI2Vsc2UKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UX1BDSSkgJiYgZGVmaW5lZChDT05GSUdfTUlQNDA1KQorCWIgX3N0YXJ0X3BjaQorI2Vsc2UKKwliIF9zdGFydAorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3NkcmFtLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9zZHJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzZlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9zZHJhbS5jCkBAIC0wLDAgKzEsNDY4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA1LTIwMDcKKyAqIFN0ZWZhbiBSb2VzZSwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgc3JAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIERBVkUgU3JsIDx3d3cuZGF2ZS10ZWNoLml0PgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA0CisgKiBTdGVmYW4gUm9lc2UsIGVzZCBnbWJoIGdlcm1hbnksIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBwYzR4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlICJzZHJhbS5oIgorI2luY2x1ZGUgImVjYy5oIgorCisjaWZkZWYgQ09ORklHX1NEUkFNX0JBTkswCisKKyNpZm5kZWYgQ09ORklHXzQ0MAorCisjaWZuZGVmIENPTkZJR19TWVNfU0RSQU1fVEFCTEUKK3NkcmFtX2NvbmZfdCBtYjBjZltdID0geworCXsoMTI4IDw8IDIwKSwgMTMsIDB4MDAwQTQwMDF9LAkgICAgLyogKDAtMTI4TUIpIEFkZHJlc3MgTW9kZSAzLCAxM3gxMCg0KSAqLworCXsoNjQgPDwgMjApLCAgMTMsIDB4MDAwODQwMDF9LAkgICAgLyogKDAtNjRNQikgQWRkcmVzcyBNb2RlIDMsIDEzeDkoNCkJICAqLworCXsoMzIgPDwgMjApLCAgMTIsIDB4MDAwNjIwMDF9LAkgICAgLyogKDAtMzJNQikgQWRkcmVzcyBNb2RlIDIsIDEyeDkoNCkJICAqLworCXsoMTYgPDwgMjApLCAgMTIsIDB4MDAwNDYwMDF9LAkgICAgLyogKDAtMTZNQikgQWRkcmVzcyBNb2RlIDQsIDEyeDgoNCkJICAqLworCXsoNCA8PCAyMCksICAgMTEsIDB4MDAwMDgwMDF9LAkgICAgLyogKDAtNE1CKSBBZGRyZXNzIE1vZGUgNSwgMTF4OCgyKQkgICovCit9OworI2Vsc2UKK3NkcmFtX2NvbmZfdCBtYjBjZltdID0gQ09ORklHX1NZU19TRFJBTV9UQUJMRTsKKyNlbmRpZgorCisjZGVmaW5lIE5fTUIwQ0YgKHNpemVvZihtYjBjZikgLyBzaXplb2YobWIwY2ZbMF0pKQorCisjaWZkZWYgQ09ORklHX1NZU19TRFJBTV9DQVNMCitzdGF0aWMgdWxvbmcgbnMyY2xrcyh1bG9uZyBucykKK3sKKwl1bG9uZyBidXNfcGVyaW9kX3hfMTAgPSBPTkVfQklMTElPTiAvIChnZXRfYnVzX2ZyZXEoMCkgLyAxMCk7CisKKwlyZXR1cm4gKChucyAqIDEwKSArIGJ1c19wZXJpb2RfeF8xMCkgLyBidXNfcGVyaW9kX3hfMTA7Cit9CisjZW5kaWYgLyogQ09ORklHX1NZU19TRFJBTV9DQVNMICovCisKK3N0YXRpYyB1bG9uZyBjb21wdXRlX3NkdHIxKHVsb25nIHNwZWVkKQoreworI2lmZGVmIENPTkZJR19TWVNfU0RSQU1fQ0FTTAorCXVsb25nIHRtcDsKKwl1bG9uZyBzZHRyMSA9IDA7CisKKwkvKiBDQVNMICovCisJaWYgKENPTkZJR19TWVNfU0RSQU1fQ0FTTCA8IDIpCisJCXNkdHIxIHw9ICgxIDw8IFNEUkFNMF9UUl9DQVNMKTsKKwllbHNlCisJCWlmIChDT05GSUdfU1lTX1NEUkFNX0NBU0wgPiA0KQorCQkJc2R0cjEgfD0gKDMgPDwgU0RSQU0wX1RSX0NBU0wpOworCQllbHNlCisJCQlzZHRyMSB8PSAoKENPTkZJR19TWVNfU0RSQU1fQ0FTTC0xKSA8PCBTRFJBTTBfVFJfQ0FTTCk7CisKKwkvKiBQVEEgKi8KKwl0bXAgPSBuczJjbGtzKENPTkZJR19TWVNfU0RSQU1fUFRBKTsKKwlpZiAoKHRtcCA+PSAyKSAmJiAodG1wIDw9IDQpKQorCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfUFRBKTsKKwllbHNlCisJCXNkdHIxIHw9ICgoNC0xKSA8PCBTRFJBTTBfVFJfUFRBKTsKKworCS8qIENUUCAqLworCXRtcCA9IG5zMmNsa3MoQ09ORklHX1NZU19TRFJBTV9DVFApOworCWlmICgodG1wID49IDIpICYmICh0bXAgPD0gNCkpCisJCXNkdHIxIHw9ICgodG1wLTEpIDw8IFNEUkFNMF9UUl9DVFApOworCWVsc2UKKwkJc2R0cjEgfD0gKCg0LTEpIDw8IFNEUkFNMF9UUl9DVFApOworCisJLyogTERGICovCisJdG1wID0gbnMyY2xrcyhDT05GSUdfU1lTX1NEUkFNX0xERik7CisJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKKwkJc2R0cjEgfD0gKCh0bXAtMSkgPDwgU0RSQU0wX1RSX0xERik7CisJZWxzZQorCQlzZHRyMSB8PSAoKDItMSkgPDwgU0RSQU0wX1RSX0xERik7CisKKwkvKiBSRlRBICovCisJdG1wID0gbnMyY2xrcyhDT05GSUdfU1lTX1NEUkFNX1JGVEEpOworCWlmICgodG1wID49IDQpICYmICh0bXAgPD0gMTApKQorCQlzZHRyMSB8PSAoKHRtcC00KSA8PCBTRFJBTTBfVFJfUkZUQSk7CisJZWxzZQorCQlzZHRyMSB8PSAoKDEwLTQpIDw8IFNEUkFNMF9UUl9SRlRBKTsKKworCS8qIFJDRCAqLworCXRtcCA9IG5zMmNsa3MoQ09ORklHX1NZU19TRFJBTV9SQ0QpOworCWlmICgodG1wID49IDIpICYmICh0bXAgPD0gNCkpCisJCXNkdHIxIHw9ICgodG1wLTEpIDw8IFNEUkFNMF9UUl9SQ0QpOworCWVsc2UKKwkJc2R0cjEgfD0gKCg0LTEpIDw8IFNEUkFNMF9UUl9SQ0QpOworCisJcmV0dXJuIHNkdHIxOworI2Vsc2UgLyogQ09ORklHX1NZU19TRFJBTV9DQVNMICovCisJLyoKKwkgKiBJZiBubyB2YWx1ZXMgYXJlIGNvbmZpZ3VyZWQgaW4gdGhlIGJvYXJkIGNvbmZpZyBmaWxlCisJICogdXNlIHRoZSBkZWZhdWx0IHZhbHVlcywgd2hpY2ggc2VlbSB0byBiZSBvayBmb3IgbW9zdAorCSAqIGJvYXJkcy4KKwkgKgorCSAqIFJFTUFSSzoKKwkgKiBGb3IgbmV3IGJvYXJkIHBvcnRzIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byBkZWZpbmUgdGhlCisJICogY29ycmVjdCB2YWx1ZXMgZm9yIHRoZSB1c2VkIFNEUkFNIGNoaXBzIGluIHlvdXIgYm9hcmQKKwkgKiBjb25maWcgZmlsZSAoc2VlIFBQQ2hhbWVsZW9uRVZCLmgpCisJICovCisJaWYgKHNwZWVkID4gMTAwMDAwMDAwKSB7CisJCS8qCisJCSAqIDEzMyBNSHogU0RSQU0KKwkJICovCisJCXJldHVybiAweDAxMDc0MDE1OworCX0gZWxzZSB7CisJCS8qCisJCSAqIGRlZmF1bHQ6IDEwMCBNSHogU0RSQU0KKwkJICovCisJCXJldHVybiAweDAwODY0MDBkOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU1lTX1NEUkFNX0NBU0wgKi8KK30KKworLyogcmVmcmVzaCBpcyBleHByZXNzZWQgaW4gbXMgKi8KK3N0YXRpYyB1bG9uZyBjb21wdXRlX3J0cih1bG9uZyBzcGVlZCwgdWxvbmcgcm93cywgdWxvbmcgcmVmcmVzaCkKK3sKKyNpZmRlZiBDT05GSUdfU1lTX1NEUkFNX0NBU0wKKwl1bG9uZyB0bXA7CisKKwl0bXAgPSAoKHJlZnJlc2gqMTAwMCoxMDAwKSAvICgxIDw8IHJvd3MpKSAqIChzcGVlZCAvIDEwMDApOworCXRtcCAvPSAxMDAwMDAwOworCisJcmV0dXJuICgodG1wICYgMHgwMDAwM0ZGOCkgPDwgMTYpOworI2Vsc2UgLyogQ09ORklHX1NZU19TRFJBTV9DQVNMICovCisJaWYgKHNwZWVkID4gMTAwMDAwMDAwKSB7CisJCS8qCisJCSAqIDEzMyBNSHogU0RSQU0KKwkJICovCisJCXJldHVybiAweDA3ZjAwMDAwOworCX0gZWxzZSB7CisJCS8qCisJCSAqIGRlZmF1bHQ6IDEwMCBNSHogU0RSQU0KKwkJICovCisJCXJldHVybiAweDA1ZjAwMDAwOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU1lTX1NEUkFNX0NBU0wgKi8KK30KKworLyoKKyAqIEF1dG9kZXRlY3Qgb25ib2FyZCBTRFJBTSBvbiA0MDUgcGxhdGZvcm1zCisgKi8KK3BoeXNfc2l6ZV90IGluaXRkcmFtKGludCBib2FyZF90eXBlKQoreworCXVsb25nIHNwZWVkOworCXVsb25nIHNkdHIxOworCWludCBpOworCisJLyoKKwkgKiBEZXRlcm1pbmUgU0RSQU0gc3BlZWQKKwkgKi8KKwlzcGVlZCA9IGdldF9idXNfZnJlcSgwKTsgLyogcGFyYW1ldGVyIG5vdCB1c2VkIG9uIHBwYzR4eCAqLworCisJLyoKKwkgKiBzZHRyMSAocmVnaXN0ZXIgU0RSQU0wX1RSKSBtdXN0IHRha2UgaW50byBhY2NvdW50IHRpbWluZ3MgbGlzdGVkCisJICogaW4gU0RSQU0gY2hpcCBkYXRhc2hlZXQuIHJ0ciAocmVnaXN0ZXIgU0RSQU0wX1JUUikgbXVzdCB0YWtlIGludG8KKwkgKiBhY2NvdW50IGFjdHVhbCBTRFJBTSBzaXplLiBTbyB3ZSBjYW4gc2V0IHVwIHNkdHIxIGFjY29yZGluZyB0byB3aGF0CisJICogaXMgc3BlY2lmaWVkIGluIGJvYXJkIGNvbmZpZ3VyYXRpb24gZmlsZSB3aGlsZSBydHIgZGVwZW5kZHMgb24gU0RSQU0KKwkgKiBzaXplIHdlIGFyZSBhc3N1bWluZyBiZWZvcmUgZGV0ZWN0aW9uLgorCSAqLworCXNkdHIxID0gY29tcHV0ZV9zZHRyMShzcGVlZCk7CisKKwlmb3IgKGk9MDsgaTxOX01CMENGOyBpKyspIHsKKwkJLyoKKwkJICogRGlzYWJsZSBtZW1vcnkgY29udHJvbGxlci4KKwkJICovCisJCW10c2RyYW0oU0RSQU0wX0NGRywgMHgwMDAwMDAwMCk7CisKKwkJLyoKKwkJICogU2V0IE1CMENGIGZvciBiYW5rIDAuCisJCSAqLworCQltdHNkcmFtKFNEUkFNMF9CMENSLCBtYjBjZltpXS5yZWcpOworCQltdHNkcmFtKFNEUkFNMF9UUiwgc2R0cjEpOworCQltdHNkcmFtKFNEUkFNMF9SVFIsIGNvbXB1dGVfcnRyKHNwZWVkLCBtYjBjZltpXS5yb3dzLCA2NCkpOworCisJCXVkZWxheSgyMDApOworCisJCS8qCisJCSAqIFNldCBtZW1vcnkgY29udHJvbGxlciBvcHRpb25zIHJlZywgTUNPUFQxLgorCQkgKiBTZXQgRENfRU4gdG8gJzEnIGFuZCBCUkRfUFJGIHRvICcwMScgZm9yIDE2IGJ5dGUgUExCIEJ1cnN0CisJCSAqIHJlYWQvcHJlZmV0Y2guCisJCSAqLworCQltdHNkcmFtKFNEUkFNMF9DRkcsIDB4ODA4MDAwMDApOworCisJCXVkZWxheSgxMDAwMCk7CisKKwkJaWYgKGdldF9yYW1fc2l6ZSgwLCBtYjBjZltpXS5zaXplKSA9PSBtYjBjZltpXS5zaXplKSB7CisJCQlwaHlzX3NpemVfdCBzaXplID0gbWIwY2ZbaV0uc2l6ZTsKKworCQkJLyoKKwkJCSAqIE9LLCBzaXplIGRldGVjdGVkLiAgRW5hYmxlIHNlY29uZCBiYW5rIGlmCisJCQkgKiBkZWZpbmVkIChhc3N1bWVzIHNhbWUgdHlwZSBhcyBiYW5rIDApCisJCQkgKi8KKyNpZmRlZiBDT05GSUdfU0RSQU1fQkFOSzEKKwkJCW10c2RyYW0oU0RSQU0wX0NGRywgMHgwMDAwMDAwMCk7CisJCQltdHNkcmFtKFNEUkFNMF9CMUNSLCBtYjBjZltpXS5zaXplIHwgbWIwY2ZbaV0ucmVnKTsKKwkJCW10c2RyYW0oU0RSQU0wX0NGRywgMHg4MDgwMDAwMCk7CisJCQl1ZGVsYXkoMTAwMDApOworCisJCQkvKgorCQkJICogQ2hlY2sgaWYgMm5kIGJhbmsgaXMgcmVhbGx5IGF2YWlsYWJsZS4KKwkJCSAqIElmIHRoZSBzaXplIG5vdCBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QKKwkJCSAqIGJhbmssIHRoZW4gZGlzYWJsZSB0aGUgMm5kIGJhbmsgY29tcGxldGVseS4KKwkJCSAqLworCQkJaWYgKGdldF9yYW1fc2l6ZSgobG9uZyAqKW1iMGNmW2ldLnNpemUsIG1iMGNmW2ldLnNpemUpICE9CisJCQkgICAgbWIwY2ZbaV0uc2l6ZSkgeworCQkJCW10c2RyYW0oU0RSQU0wX0IxQ1IsIDApOworCQkJCW10c2RyYW0oU0RSQU0wX0NGRywgMCk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogV2UgaGF2ZSB0d28gaWRlbnRpY2FsIGJhbmtzLCBzbyB0aGUgc2l6ZQorCQkJCSAqIGlzIHR3aWNlIHRoZSBiYW5rIHNpemUKKwkJCQkgKi8KKwkJCQlzaXplID0gMiAqIHNpemU7CisJCQl9CisjZW5kaWYKKworCQkJLyoKKwkJCSAqIE9LLCBzaXplIGRldGVjdGVkIC0+IGFsbCBkb25lCisJCQkgKi8KKwkJCXJldHVybiBzaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qIENPTkZJR180NDAgKi8KKworLyoKKyAqIERlZmluZSBzb21lIGRlZmF1bHQgdmFsdWVzLiBUaG9zZSBjYW4gYmUgb3ZlcndyaXR0ZW4gaW4gdGhlCisgKiBib2FyZCBjb25maWcgZmlsZS4KKyAqLworCisjaWZuZGVmIENPTkZJR19TWVNfU0RSQU1fVEFCTEUKK3NkcmFtX2NvbmZfdCBtYjBjZltdID0geworCXsoMjU2IDw8IDIwKSwgMTMsIDB4MDAwQzQwMDF9LAkvKiAyNTZNQiBtb2RlIDMsIDEzeDEwKDQpCSovCisJeygxMjggPDwgMjApLCAxMywgMHgwMDBBNDAwMX0sCS8qIDEyOE1CIG1vZGUgMywgMTN4MTAoNCkJKi8KKwl7KDY0IDw8IDIwKSwgIDEyLCAweDAwMDgyMDAxfQkvKiA2NE1CIG1vZGUgMiwgMTJ4OSg0KQkJKi8KK307CisjZWxzZQorc2RyYW1fY29uZl90IG1iMGNmW10gPSBDT05GSUdfU1lTX1NEUkFNX1RBQkxFOworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19TRFJBTTBfVFIwCisjZGVmaW5lCUNPTkZJR19TWVNfU0RSQU0wX1RSMAkJMHg0MTA5NDAxMgorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19TRFJBTTBfV0REQ1RSCisjZGVmaW5lIENPTkZJR19TWVNfU0RSQU0wX1dERENUUgkweDAwMDAwMDAwICAvKiB3cmNwPTAgZGNkPTAJKi8KKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfU0RSQU0wX1JUUgorI2RlZmluZSBDT05GSUdfU1lTX1NEUkFNMF9SVFIgCQkweDA0MTAwMDAwIC8qIDcuOHVzIEAgMTMzTUh6IFBMQiAqLworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19TRFJBTTBfQ0ZHMAorI2RlZmluZSBDT05GSUdfU1lTX1NEUkFNMF9DRkcwCQkweDgyMDAwMDAwIC8qIERDRU49MSwgUE1VRD0wLCA2NC1iaXQgKi8KKyNlbmRpZgorCisjZGVmaW5lIE5fTUIwQ0YgKHNpemVvZihtYjBjZikgLyBzaXplb2YobWIwY2ZbMF0pKQorCisjZGVmaW5lIE5VTV9UUklFUyA2NAorI2RlZmluZSBOVU1fUkVBRFMgMTAKKworc3RhdGljIHZvaWQgc2RyYW1fdHIxX3NldChpbnQgcmFtX2FkZHJlc3MsIGludCogdHIxX3ZhbHVlKQoreworCWludCBpOworCWludCBqLCBrOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCogcmFtX3BvaW50ZXIgPSAodW5zaWduZWQgaW50ICopcmFtX2FkZHJlc3M7CisJaW50IGZpcnN0X2dvb2QgPSAtMSwgbGFzdF9iYWQgPSAweDFmZjsKKworCXVuc2lnbmVkIGxvbmcgdGVzdFtOVU1fVFJJRVNdID0geworCQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorCQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorCQkweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCQkweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCQkweEFBQUFBQUFBLCAweEFBQUFBQUFBLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LAorCQkweEFBQUFBQUFBLCAweEFBQUFBQUFBLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LAorCQkweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweEFBQUFBQUFBLCAweEFBQUFBQUFBLAorCQkweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweEFBQUFBQUFBLCAweEFBQUFBQUFBLAorCQkweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAorCQkweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAorCQkweDVBNUE1QTVBLCAweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweEE1QTVBNUE1LAorCQkweDVBNUE1QTVBLCAweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweEE1QTVBNUE1LAorCQkweEFBNTVBQTU1LCAweEFBNTVBQTU1LCAweDU1QUE1NUFBLCAweDU1QUE1NUFBLAorCQkweEFBNTVBQTU1LCAweEFBNTVBQTU1LCAweDU1QUE1NUFBLCAweDU1QUE1NUFBLAorCQkweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1LAorCQkweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1IH07CisKKwkvKiBnbyB0aHJvdWdoIGFsbCBwb3NzaWJsZSBTRFJBTTBfVFIxW1JEQ1RdIHZhbHVlcyAqLworCWZvciAoaT0wOyBpPD0weDFmZjsgaSsrKSB7CisJCS8qIHNldCB0aGUgY3VycmVudCB2YWx1ZSBmb3IgVFIxICovCisJCW10c2RyYW0oU0RSQU0wX1RSMSwgKDB4ODA4MDA4MDAgfCBpKSk7CisKKwkJLyogd3JpdGUgdmFsdWVzICovCisJCWZvciAoaj0wOyBqPE5VTV9UUklFUzsgaisrKSB7CisJCQlyYW1fcG9pbnRlcltqXSA9IHRlc3Rbal07CisKKwkJCS8qIGNsZWFyIGFueSBjYWNoZSBhdCByYW0gbG9jYXRpb24gKi8KKwkJCV9fYXNtX18oImRjYmYgMCwlMCI6IDoiciIgKCZyYW1fcG9pbnRlcltqXSkpOworCQl9CisKKwkJLyogcmVhZCB2YWx1ZXMgYmFjayAqLworCQlmb3IgKGo9MDsgajxOVU1fVFJJRVM7IGorKykgeworCQkJZm9yIChrPTA7IGs8TlVNX1JFQURTOyBrKyspIHsKKwkJCQkvKiBjbGVhciBhbnkgY2FjaGUgYXQgcmFtIGxvY2F0aW9uICovCisJCQkJX19hc21fXygiZGNiZiAwLCUwIjogOiJyIiAoJnJhbV9wb2ludGVyW2pdKSk7CisKKwkJCQlpZiAocmFtX3BvaW50ZXJbal0gIT0gdGVzdFtqXSkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHJlYWQgZXJyb3IgKi8KKwkJCWlmIChrICE9IE5VTV9SRUFEUykKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIHdlIGhhdmUgYSBTRFJBTTBfVFIxW1JEQ1RdIHRoYXQgaXMgcGFydCBvZiB0aGUgd2luZG93ICovCisJCWlmIChqID09IE5VTV9UUklFUykgeworCQkJaWYgKGZpcnN0X2dvb2QgPT0gLTEpCisJCQkJZmlyc3RfZ29vZCA9IGk7CQkvKiBmb3VuZCBiZWdpbm5pbmcgb2Ygd2luZG93ICovCisJCX0gZWxzZSB7IC8qIGJhZCByZWFkICovCisJCQkvKiBpZiB3ZSBoYXZlIG5vdCBoYWQgYSBnb29kIHJlYWQgdGhlbiBkb24ndCBjYXJlICovCisJCQlpZiAoZmlyc3RfZ29vZCAhPSAtMSkgeworCQkJCS8qIGZpcnN0IGZhaWx1cmUgYWZ0ZXIgYSBnb29kIHJlYWQgKi8KKwkJCQlsYXN0X2JhZCA9IGktMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmb3IgVFIxICovCisJKnRyMV92YWx1ZSA9IChmaXJzdF9nb29kICsgbGFzdF9iYWQpIC8gMjsKK30KKworLyoKKyAqIEF1dG9kZXRlY3Qgb25ib2FyZCBERFIgU0RSQU0gb24gNDQwIHBsYXRmb3JtcworICoKKyAqIE5PVEU6IFNvbWUgb2YgdGhlIGhhcmRjb2RlZCB2YWx1ZXMgYXJlIGhhcmR3YXJlIGRlcGVuZGFudCwKKyAqCSBzbyB0aGlzIHNob3VsZCBiZSBleHRlbmRlZCBmb3Igb3RoZXIgZnV0dXJlIGJvYXJkcworICoJIHVzaW5nIHRoaXMgcm91dGluZSEKKyAqLworcGh5c19zaXplX3QgaW5pdGRyYW0oaW50IGJvYXJkX3R5cGUpCit7CisJaW50IGk7CisJaW50IHRyMV9iYW5rMTsKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MEdSKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUCkKKwkvKgorCSAqIFNvZnQtcmVzZXQgU0RSQU0gY29udHJvbGxlci4KKwkgKi8KKwltdHNkcihTRFIwX1NSU1QsIFNEUjBfU1JTVF9ETUMpOworCW10c2RyKFNEUjBfU1JTVCwgMHgwMDAwMDAwMCk7CisjZW5kaWYKKworCWZvciAoaT0wOyBpPE5fTUIwQ0Y7IGkrKykgeworCQkvKgorCQkgKiBEaXNhYmxlIG1lbW9yeSBjb250cm9sbGVyLgorCQkgKi8KKwkJbXRzZHJhbShTRFJBTTBfQ0ZHMCwgMHgwMDAwMDAwMCk7CisKKwkJLyoKKwkJICogU2V0dXAgc29tZSBkZWZhdWx0CisJCSAqLworCQltdHNkcmFtKFNEUkFNMF9VQUJCQSwgMHgwMDAwMDAwMCk7IC8qIHViYmE9MCAoZGVmYXVsdCkJCSovCisJCW10c2RyYW0oU0RSQU0wX1NMSU8sIDB4MDAwMDAwMDApOwkvKiByZHJlPTAgd3JyZT0wIHJhcnc9MAkJKi8KKwkJbXRzZHJhbShTRFJBTTBfREVWT1BULCAweDAwMDAwMDAwKTsgLyogZGxsPTAgZHM9MCAobm9ybWFsKQkJKi8KKwkJbXRzZHJhbShTRFJBTTBfV0REQ1RSLCBDT05GSUdfU1lTX1NEUkFNMF9XRERDVFIpOworCQltdHNkcmFtKFNEUkFNMF9DTEtUUiwgMHg0MDAwMDAwMCk7IC8qIGNsa3A9MSAoOTAgZGVnIHdyKSBkY2R0PTAJKi8KKworCQkvKgorCQkgKiBGb2xsb3dpbmcgZm9yIENBUyBMYXRlbmN5ID0gMi41IEAgMTMzIE1IeiBQTEIKKwkJICovCisJCW10c2RyYW0oU0RSQU0wX0IwQ1IsIG1iMGNmW2ldLnJlZyk7CisJCW10c2RyYW0oU0RSQU0wX1RSMCwgQ09ORklHX1NZU19TRFJBTTBfVFIwKTsKKwkJbXRzZHJhbShTRFJBTTBfVFIxLCAweDgwODAwODAwKTsJLyogU1M9VDIgU0w9U1RBR0UgMyBDRD0xIENUPTB4MDAqLworCQltdHNkcmFtKFNEUkFNMF9SVFIsIENPTkZJR19TWVNfU0RSQU0wX1JUUik7CisJCW10c2RyYW0oU0RSQU0wX0NGRzEsIDB4MDAwMDAwMDApOwkvKiBTZWxmLXJlZnJlc2ggZXhpdCwgZGlzYWJsZSBQTSovCisJCXVkZWxheSg0MDApOwkJCS8qIERlbGF5IDIwMCB1c2VjcyAobWluKQkqLworCisJCS8qCisJCSAqIEVuYWJsZSB0aGUgY29udHJvbGxlciwgdGhlbiB3YWl0IGZvciBEQ0VOIHRvIGNvbXBsZXRlCisJCSAqLworCQltdHNkcmFtKFNEUkFNMF9DRkcwLCBDT05GSUdfU1lTX1NEUkFNMF9DRkcwKTsKKwkJdWRlbGF5KDEwMDAwKTsKKworCQlpZiAoZ2V0X3JhbV9zaXplKDAsIG1iMGNmW2ldLnNpemUpID09IG1iMGNmW2ldLnNpemUpIHsKKwkJCXBoeXNfc2l6ZV90IHNpemUgPSBtYjBjZltpXS5zaXplOworCQkJLyoKKwkJCSAqIE9wdGltaXplIFRSMSB0byBjdXJyZW50IGhhcmR3YXJlIGVudmlyb25tZW50CisJCQkgKi8KKwkJCXNkcmFtX3RyMV9zZXQoMHgwMDAwMDAwMCwgJnRyMV9iYW5rMSk7CisJCQltdHNkcmFtKFNEUkFNMF9UUjEsICh0cjFfYmFuazEgfCAweDgwODAwODAwKSk7CisKKworCQkJLyoKKwkJCSAqIE9LLCBzaXplIGRldGVjdGVkLiAgRW5hYmxlIHNlY29uZCBiYW5rIGlmCisJCQkgKiBkZWZpbmVkIChhc3N1bWVzIHNhbWUgdHlwZSBhcyBiYW5rIDApCisJCQkgKi8KKyNpZmRlZiBDT05GSUdfU0RSQU1fQkFOSzEKKwkJCW10c2RyYW0oU0RSQU0wX0NGRzAsIDApOworCQkJbXRzZHJhbShTRFJBTTBfQjFDUiwgbWIwY2ZbaV0uc2l6ZSB8IG1iMGNmW2ldLnJlZyk7CisJCQltdHNkcmFtKFNEUkFNMF9DRkcwLCBDT05GSUdfU1lTX1NEUkFNMF9DRkcwKTsKKwkJCXVkZWxheSgxMDAwMCk7CisKKwkJCS8qCisJCQkgKiBDaGVjayBpZiAybmQgYmFuayBpcyByZWFsbHkgYXZhaWxhYmxlLgorCQkJICogSWYgdGhlIHNpemUgbm90IGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBmaXJzdAorCQkJICogYmFuaywgdGhlbiBkaXNhYmxlIHRoZSAybmQgYmFuayBjb21wbGV0ZWx5LgorCQkJICovCisJCQlpZiAoZ2V0X3JhbV9zaXplKChsb25nICopbWIwY2ZbaV0uc2l6ZSwgbWIwY2ZbaV0uc2l6ZSkKKwkJCSAgICAhPSBtYjBjZltpXS5zaXplKSB7CisJCQkJbXRzZHJhbShTRFJBTTBfQ0ZHMCwgMCk7CisJCQkJbXRzZHJhbShTRFJBTTBfQjFDUiwgMCk7CisJCQkJbXRzZHJhbShTRFJBTTBfQ0ZHMCwgQ09ORklHX1NZU19TRFJBTTBfQ0ZHMCk7CisJCQkJdWRlbGF5KDEwMDAwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBXZSBoYXZlIHR3byBpZGVudGljYWwgYmFua3MsIHNvIHRoZSBzaXplCisJCQkJICogaXMgdHdpY2UgdGhlIGJhbmsgc2l6ZQorCQkJCSAqLworCQkJCXNpemUgPSAyICogc2l6ZTsKKwkJCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NEUkFNX0VDQworCQkJZWNjX2luaXQoMCwgc2l6ZSk7CisjZW5kaWYKKworCQkJLyoKKwkJCSAqIE9LLCBzaXplIGRldGVjdGVkIC0+IGFsbCBkb25lCisJCQkgKi8KKwkJCXJldHVybiBzaXplOworCQl9CisJfQorCisJcmV0dXJuIDA7CQkJCS8qIG5vdGhpbmcgZm91bmQgIQkJKi8KK30KKworI2VuZGlmIC8qIENPTkZJR180NDAgKi8KKworI2VuZGlmIC8qIENPTkZJR19TRFJBTV9CQU5LMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvc2RyYW0uaCBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3NkcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhMzM3NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3NkcmFtLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogREFWRSBTcmwgPHd3dy5kYXZlLXRlY2guaXQ+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfU0RSQU1fSF8KKyNkZWZpbmUgX1NEUkFNX0hfCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2RlZmluZSBPTkVfQklMTElPTgkxMDAwMDAwMDAwCisKK3N0cnVjdCBzZHJhbV9jb25mX3MgeworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgcm93czsKKwl1bnNpZ25lZCBsb25nIHJlZzsKK307CisKK3R5cGVkZWYgc3RydWN0IHNkcmFtX2NvbmZfcyBzZHJhbV9jb25mX3Q7CisKKy8qIEJpdGZpZWxkcyBvZmZzZXRzICovCisjZGVmaW5lIFNEUkFNMF9UUl9DQVNMCQkoMzEgLSA4KQorI2RlZmluZSBTRFJBTTBfVFJfUFRBCQkoMzEgLSAxMykKKyNkZWZpbmUgU0RSQU0wX1RSX0NUUAkJKDMxIC0gMTUpCisjZGVmaW5lIFNEUkFNMF9UUl9MREYJCSgzMSAtIDE3KQorI2RlZmluZSBTRFJBTTBfVFJfUkZUQQkJKDMxIC0gMjkpCisjZGVmaW5lIFNEUkFNMF9UUl9SQ0QJCSgzMSAtIDMxKQorCisjaWZkZWYgQ09ORklHX1NZU19TRFJBTV9DTAorLyogU0RSQU0gdGltaW5ncyBbbnNdIGFjY29yZGluZyB0byBBTUNDL0lCTSBuYW1lcyAoc2VlIFNEUkFNX2ZhcS5kb2MpICovCisjZGVmaW5lIENPTkZJR19TWVNfU0RSQU1fQ0FTTAkJQ09ORklHX1NZU19TRFJBTV9DTAorI2RlZmluZSBDT05GSUdfU1lTX1NEUkFNX1BUQQkJQ09ORklHX1NZU19TRFJBTV90UlAKKyNkZWZpbmUgQ09ORklHX1NZU19TRFJBTV9DVFAJCShDT05GSUdfU1lTX1NEUkFNX3RSQyAtIENPTkZJR19TWVNfU0RSQU1fdFJDRCAtIENPTkZJR19TWVNfU0RSQU1fdFJQKQorI2RlZmluZSBDT05GSUdfU1lTX1NEUkFNX0xERgkJMAorI2lmZGVmIENPTkZJR19TWVNfU0RSQU1fdFJGQworI2RlZmluZSBDT05GSUdfU1lTX1NEUkFNX1JGVEEJCUNPTkZJR19TWVNfU0RSQU1fdFJGQworI2Vsc2UKKyNkZWZpbmUgQ09ORklHX1NZU19TRFJBTV9SRlRBCQlDT05GSUdfU1lTX1NEUkFNX3RSQworI2VuZGlmCisjZGVmaW5lIENPTkZJR19TWVNfU0RSQU1fUkNECQlDT05GSUdfU1lTX1NEUkFNX3RSQ0QKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1NZU19TRFJBTV9DTCAqLworCisvKgorICogU29tZSBkZWZpbmVzIGZvciB0aGUgNDQwIEREUiBjb250cm9sbGVyCisgKi8KKyNkZWZpbmUgU0RSQU1fQ0ZHMF9EQ19FTgkweDgwMDAwMDAwCS8qIFNEUkFNIENvbnRyb2xsZXIgRW5hYmxlCSovCisjZGVmaW5lIFNEUkFNX0NGRzBfTUVNQ0hLCTB4MzAwMDAwMDAJLyogTWVtb3J5IGRhdGEgZXJyb3IgY2hlY2tpbmcgbWFzayovCisjZGVmaW5lIFNEUkFNX0NGRzBfTUVNQ0hLX05PTgkweDAwMDAwMDAwCS8qIE5vIEVDQyBnZW5lcmF0aW9uCQkqLworI2RlZmluZSBTRFJBTV9DRkcwX01FTUNIS19HRU4JMHgyMDAwMDAwMAkvKiBFQ0MgZ2VuZXJhdGlvbgkJKi8KKyNkZWZpbmUgU0RSQU1fQ0ZHMF9NRU1DSEtfQ0hLCTB4MzAwMDAwMDAJLyogRUNDIGdlbmVyYXRpb24gYW5kIGNoZWNraW5nCSovCisjZGVmaW5lIFNEUkFNX0NGRzBfRFJBTVdEVEgJMHgwMjAwMDAwMAkvKiBEUkFNIHdpZHRoIG1hc2sJCSovCisjZGVmaW5lIFNEUkFNX0NGRzBfRFJBTVdEVEhfMzIJMHgwMDAwMDAwMAkvKiAzMiBiaXRzCQkJKi8KKyNkZWZpbmUgU0RSQU1fQ0ZHMF9EUkFNV0RUSF82NAkweDAyMDAwMDAwCS8qIDY0IGJpdHMJCQkqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3NwZWVkLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9zcGVlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNmZhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9zcGVlZC5jCkBAIC0wLDAgKzEsMTE3NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA4CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2RlZmluZSBPTkVfQklMTElPTiAgICAgICAgMTAwMDAwMDAwMAorI2lmZGVmIERFQlVHCisjZGVmaW5lIERFQlVHRihmbXQsYXJncy4uLikgcHJpbnRmKGZtdCAsIyNhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdGKGZtdCxhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVHUCkgfHwgZGVmaW5lZChDT05GSUdfNDA1Q1IpCisKK3ZvaWQgZ2V0X3N5c19pbmZvIChQUEM0eHhfU1lTX0lORk8gKiBzeXNJbmZvKQoreworCXVuc2lnbmVkIGxvbmcgcGxsbXI7CisJdW5zaWduZWQgbG9uZyBzeXNDbGtQZXJpb2RQcyA9IE9ORV9CSUxMSU9OIC8gKENPTkZJR19TWVNfQ0xLX0ZSRVEgLyAxMDAwKTsKKwl1aW50IHB2ciA9IGdldF9wdnIoKTsKKwl1bnNpZ25lZCBsb25nIHBzcjsKKwl1bnNpZ25lZCBsb25nIG07CisKKwkvKgorCSAqIFJlYWQgUExMIE1vZGUgcmVnaXN0ZXIKKwkgKi8KKwlwbGxtciA9IG1mZGNyIChDUEMwX1BMTE1SKTsKKworCS8qCisJICogUmVhZCBQaW4gU3RyYXBwaW5nIHJlZ2lzdGVyCisJICovCisJcHNyID0gbWZkY3IgKENQQzBfUFNSKTsKKworCS8qCisJICogRGV0ZXJtaW5lIEZXRF9ESVYuCisJICovCisJc3lzSW5mby0+cGxsRndkRGl2ID0gOCAtICgocGxsbXIgJiBQTExNUl9GV0RfRElWX01BU0spID4+IDI5KTsKKworCS8qCisJICogRGV0ZXJtaW5lIEZCS19ESVYuCisJICovCisJc3lzSW5mby0+cGxsRmJrRGl2ID0gKChwbGxtciAmIFBMTE1SX0ZCX0RJVl9NQVNLKSA+PiAyNSk7CisJaWYgKHN5c0luZm8tPnBsbEZia0RpdiA9PSAwKSB7CisJCXN5c0luZm8tPnBsbEZia0RpdiA9IDE2OworCX0KKworCS8qCisJICogRGV0ZXJtaW5lIFBMQl9ESVYuCisJICovCisJc3lzSW5mby0+cGxsUGxiRGl2ID0gKChwbGxtciAmIFBMTE1SX0NQVV9UT19QTEJfTUFTSykgPj4gMTcpICsgMTsKKworCS8qCisJICogRGV0ZXJtaW5lIFBDSV9ESVYuCisJICovCisJc3lzSW5mby0+cGxsUGNpRGl2ID0gKChwbGxtciAmIFBMTE1SX1BDSV9UT19QTEJfTUFTSykgPj4gMTMpICsgMTsKKworCS8qCisJICogRGV0ZXJtaW5lIEVYVEJVU19ESVYuCisJICovCisJc3lzSW5mby0+cGxsRXh0QnVzRGl2ID0gKChwbGxtciAmIFBMTE1SX0VYQl9UT19QTEJfTUFTSykgPj4gMTEpICsgMjsKKworCS8qCisJICogRGV0ZXJtaW5lIE9QQl9ESVYuCisJICovCisJc3lzSW5mby0+cGxsT3BiRGl2ID0gKChwbGxtciAmIFBMTE1SX09QQl9UT19QTEJfTUFTSykgPj4gMTUpICsgMTsKKworCS8qCisJICogQ2hlY2sgaWYgUFBDNDA1R1ByIHVzZWQgKG1hc2sgbWlub3IgcmV2aXNpb24gZmllbGQpCisJICovCisJaWYgKChwdnIgJiAweGZmZmZmZmYwKSA9PSAoUFZSXzQwNUdQUl9SQiAmIDB4ZmZmZmZmZjApKSB7CisJCS8qCisJCSAqIERldGVybWluZSBGV0RfRElWIEIgKG9ubHkgUFBDNDA1R1ByIHdpdGggbmV3IG1vZGUgc3RyYXBwaW5nKS4KKwkJICovCisJCXN5c0luZm8tPnBsbEZ3ZERpdkIgPSA4IC0gKHBsbG1yICYgUExMTVJfRldEQl9ESVZfTUFTSyk7CisKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGZhY3RvciBtIGRlcGVuZGluZyBvbiBQTEwgZmVlZGJhY2sgY2xvY2sgc291cmNlCisJCSAqLworCQlpZiAoIShwc3IgJiBQU1JfUENJX0FTWU5DX0VOKSkgeworCQkJaWYgKHBzciAmIFBTUl9ORVdfTU9ERV9FTikgeworCQkJCS8qCisJCQkJICogc3luYyBwY2kgY2xvY2sgdXNlZCBhcyBmZWVkYmFjayAobmV3IG1vZGUpCisJCQkJICovCisJCQkJbSA9IDEgKiBzeXNJbmZvLT5wbGxGd2REaXZCICogMiAqIHN5c0luZm8tPnBsbFBjaURpdjsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBzeW5jIHBjaSBjbG9jayB1c2VkIGFzIGZlZWRiYWNrIChsZWdhY3kgbW9kZSkKKwkJCQkgKi8KKwkJCQltID0gMSAqIHN5c0luZm8tPnBsbEZ3ZERpdkIgKiBzeXNJbmZvLT5wbGxQbGJEaXYgKiBzeXNJbmZvLT5wbGxQY2lEaXY7CisJCQl9CisJCX0gZWxzZSBpZiAocHNyICYgUFNSX05FV19NT0RFX0VOKSB7CisJCQlpZiAocHNyICYgUFNSX1BFUkNMS19TWU5DX01PREVfRU4pIHsKKwkJCQkvKgorCQkJCSAqIFBlckNsayB1c2VkIGFzIGZlZWRiYWNrIChuZXcgbW9kZSkKKwkJCQkgKi8KKwkJCQltID0gMSAqIHN5c0luZm8tPnBsbEZ3ZERpdkIgKiAyICogc3lzSW5mby0+cGxsRXh0QnVzRGl2OworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIENQVSBjbG9jayB1c2VkIGFzIGZlZWRiYWNrIChuZXcgbW9kZSkKKwkJCQkgKi8KKwkJCQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogc3lzSW5mby0+cGxsRndkRGl2OworCQkJfQorCQl9IGVsc2UgaWYgKHN5c0luZm8tPnBsbEV4dEJ1c0RpdiA9PSBzeXNJbmZvLT5wbGxGYmtEaXYpIHsKKwkJCS8qCisJCQkgKiBQZXJDbGsgdXNlZCBhcyBmZWVkYmFjayAobGVnYWN5IG1vZGUpCisJCQkgKi8KKwkJCW0gPSAxICogc3lzSW5mby0+cGxsRndkRGl2QiAqIHN5c0luZm8tPnBsbFBsYkRpdiAqIHN5c0luZm8tPnBsbEV4dEJ1c0RpdjsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQTEIgY2xvY2sgdXNlZCBhcyBmZWVkYmFjayAobGVnYWN5IG1vZGUpCisJCQkgKi8KKwkJCW0gPSBzeXNJbmZvLT5wbGxGYmtEaXYgKiBzeXNJbmZvLT5wbGxGd2REaXZCICogc3lzSW5mby0+cGxsUGxiRGl2OworCQl9CisKKwkJc3lzSW5mby0+ZnJlcVZDT0h6ID0gKDEwMDAwMDAwMDAwMDBMTCAqICh1bnNpZ25lZCBsb25nIGxvbmcpbSkgLworCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzeXNDbGtQZXJpb2RQczsKKwkJc3lzSW5mby0+ZnJlcVByb2Nlc3NvciA9IHN5c0luZm8tPmZyZXFWQ09IeiAvIHN5c0luZm8tPnBsbEZ3ZERpdjsKKwkJc3lzSW5mby0+ZnJlcVBMQiA9IHN5c0luZm8tPmZyZXFWQ09IeiAvIChzeXNJbmZvLT5wbGxGd2REaXZCICogc3lzSW5mby0+cGxsUGxiRGl2KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBDaGVjayBwbGxGd2REaXYgdG8gc2VlIGlmIHJ1bm5pbmcgaW4gYnlwYXNzIG1vZGUgd2hlcmUgdGhlIENQVSBzcGVlZAorCQkgKiBpcyBlcXVhbCB0byB0aGUgNDA1R1AgU1lTX0NMS19GUkVRLiBJZiBub3QgaW4gYnlwYXNzIG1vZGUsIGNoZWNrIFZDTworCQkgKiB0byBtYWtlIHN1cmUgaXQgaXMgd2l0aGluIHRoZSBwcm9wZXIgcmFuZ2UuCisJCSAqICAgIHNwZWM6ICAgIFZDTyA9IFNZU19DTE9DSyB4IEZCS0RJViB4IFBMQkRJViB4IEZXRERJVgorCQkgKiBOb3RlIGZyZXFWQ08gaXMgY2FsY3VsYXRlZCBpbiBNSHogdG8gYXZvaWQgZXJyb3JzIGludHJvZHVjZWQgYnkgcm91bmRpbmcuCisJCSAqLworCQlpZiAoc3lzSW5mby0+cGxsRndkRGl2ID09IDEpIHsKKwkJCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSBDT05GSUdfU1lTX0NMS19GUkVROworCQkJc3lzSW5mby0+ZnJlcVBMQiA9IENPTkZJR19TWVNfQ0xLX0ZSRVEgLyBzeXNJbmZvLT5wbGxQbGJEaXY7CisJCX0gZWxzZSB7CisJCQlzeXNJbmZvLT5mcmVxVkNPSHogPSAoIDEwMDAwMDAwMDAwMDBMTCAqCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN5c0luZm8tPnBsbEZ3ZERpdiAqCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN5c0luZm8tPnBsbEZia0RpdiAqCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN5c0luZm8tPnBsbFBsYkRpdgorCQkJCSkgLyAodW5zaWduZWQgbG9uZyBsb25nKXN5c0Nsa1BlcmlvZFBzOworCQkJc3lzSW5mby0+ZnJlcVBMQiA9IChPTkVfQklMTElPTiAvICgoc3lzQ2xrUGVyaW9kUHMgKiAxMCkgLworCQkJCQkJCSAgIHN5c0luZm8tPnBsbEZia0RpdikpICogMTAwMDA7CisJCQlzeXNJbmZvLT5mcmVxUHJvY2Vzc29yID0gc3lzSW5mby0+ZnJlcVBMQiAqIHN5c0luZm8tPnBsbFBsYkRpdjsKKwkJfQorCX0KKworCXN5c0luZm8tPmZyZXFPUEIgPSBzeXNJbmZvLT5mcmVxUExCIC8gc3lzSW5mby0+cGxsT3BiRGl2OworCXN5c0luZm8tPmZyZXFFQkMgPSBzeXNJbmZvLT5mcmVxUExCIC8gc3lzSW5mby0+cGxsRXh0QnVzRGl2OworCXN5c0luZm8tPmZyZXFVQVJUID0gc3lzSW5mby0+ZnJlcVByb2Nlc3NvcjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9QQ0lfZnJlcQorICogcmV0dXJuIFBDSSBidXMgZnJlcSBpbiBIegorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIGdldF9QQ0lfZnJlcSAodm9pZCkKK3sKKwl1bG9uZyB2YWw7CisJUFBDNHh4X1NZU19JTkZPIHN5c19pbmZvOworCisJZ2V0X3N5c19pbmZvICgmc3lzX2luZm8pOworCXZhbCA9IHN5c19pbmZvLmZyZXFQTEIgLyBzeXNfaW5mby5wbGxQY2lEaXY7CisJcmV0dXJuIHZhbDsKK30KKworCisjZWxpZiBkZWZpbmVkKENPTkZJR180NDApCisKKyNpZiBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NjBTWCkKK3N0YXRpYyB1OCBwbGxfZndkdl9tdWx0aV9iaXRzW10gPSB7CisJLyogdmFsdWVzIGZvcjogIDEgLSAxNiAqLworCTB4MDAsIDB4MDEsIDB4MGYsIDB4MDQsIDB4MDksIDB4MGEsIDB4MGQsIDB4MGUsIDB4MDMsIDB4MGMsCisJMHgwNSwgMHgwOCwgMHgwNywgMHgwMiwgMHgwYiwgMHgwNgorfTsKKwordTMyIGdldF9jcHIwX2Z3ZHYodW5zaWduZWQgbG9uZyBjcHJfcmVnX2Z3ZHYpCit7CisJdTMyIGluZGV4OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQVJSQVlfU0laRShwbGxfZndkdl9tdWx0aV9iaXRzKTsgaW5kZXgrKykKKwkJaWYgKGNwcl9yZWdfZndkdiA9PSAodTMyKXBsbF9md2R2X211bHRpX2JpdHNbaW5kZXhdKQorCQkJcmV0dXJuIGluZGV4ICsgMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggcGxsX2ZiZHZfbXVsdGlfYml0c1tdID0geworCS8qIHZhbHVlcyBmb3I6ICAxIC0gMTAwICovCisJMHgwMCwgMHhmZiwgMHg3ZSwgMHhmZCwgMHg3YSwgMHhmNSwgMHg2YSwgMHhkNSwgMHgyYSwgMHhkNCwKKwkweDI5LCAweGQzLCAweDI2LCAweGNjLCAweDE5LCAweGIzLCAweDY3LCAweGNlLCAweDFkLCAweGJiLAorCTB4NzcsIDB4ZWUsIDB4NWQsIDB4YmEsIDB4NzQsIDB4ZTksIDB4NTIsIDB4YTUsIDB4NGIsIDB4OTYsCisJMHgyYywgMHhkOCwgMHgzMSwgMHhlMywgMHg0NiwgMHg4ZCwgMHgxYiwgMHhiNywgMHg2ZiwgMHhkZSwKKwkweDNkLCAweGZiLCAweDc2LCAweGVkLCAweDVhLCAweGI1LCAweDZiLCAweGQ2LCAweDJkLCAweGRiLAorCTB4MzYsIDB4ZWMsIDB4NTksIDB4YjIsIDB4NjQsIDB4YzksIDB4MTIsIDB4YTQsIDB4NDgsIDB4OTEsCisJMHgyMywgMHhjNywgMHgwZSwgMHg5YywgMHgzOCwgMHhmMCwgMHg2MSwgMHhjMiwgMHgwNSwgMHg4YiwKKwkweDE3LCAweGFmLCAweDVmLCAweGJlLCAweDdjLCAweGY5LCAweDcyLCAweGU1LCAweDRhLCAweDk1LAorCTB4MmIsIDB4ZDcsIDB4MmUsIDB4ZGMsIDB4MzksIDB4ZjMsIDB4NjYsIDB4Y2QsIDB4MWEsIDB4YjQsCisJMHg2OCwgMHhkMSwgMHgyMiwgMHhjNCwgMHgwOSwgMHg5MywgMHgyNywgMHhjZiwgMHgxZSwgMHhiYywKKwkvKiB2YWx1ZXMgZm9yOiAgMTAxIC0gMjAwICovCisJMHg3OCwgMHhmMSwgMHg2MiwgMHhjNSwgMHgwYSwgMHg5NCwgMHgyOCwgMHhkMCwgMHgyMSwgMHhjMywKKwkweDA2LCAweDhjLCAweDE4LCAweGIwLCAweDYwLCAweGMxLCAweDAyLCAweDg0LCAweDA4LCAweDkwLAorCTB4MjAsIDB4YzAsIDB4MDEsIDB4ODMsIDB4MDcsIDB4OGYsIDB4MWYsIDB4YmYsIDB4N2YsIDB4ZmUsCisJMHg3ZCwgMHhmYSwgMHg3NSwgMHhlYSwgMHg1NSwgMHhhYSwgMHg1NCwgMHhhOSwgMHg1MywgMHhhNiwKKwkweDRjLCAweDk5LCAweDMzLCAweGU3LCAweDRlLCAweDlkLCAweDNiLCAweGY3LCAweDZlLCAweGRkLAorCTB4M2EsIDB4ZjQsIDB4NjksIDB4ZDIsIDB4MjUsIDB4Y2IsIDB4MTYsIDB4YWMsIDB4NTgsIDB4YjEsCisJMHg2MywgMHhjNiwgMHgwZCwgMHg5YiwgMHgzNywgMHhlZiwgMHg1ZSwgMHhiZCwgMHg3YiwgMHhmNiwKKwkweDZkLCAweGRhLCAweDM1LCAweGViLCAweDU2LCAweGFkLCAweDViLCAweGI2LCAweDZjLCAweGQ5LAorCTB4MzIsIDB4ZTQsIDB4NDksIDB4OTIsIDB4MjQsIDB4YzgsIDB4MTEsIDB4YTMsIDB4NDcsIDB4OGUsCisJMHgxYywgMHhiOCwgMHg3MCwgMHhlMSwgMHg0MiwgMHg4NSwgMHgwYiwgMHg5NywgMHgyZiwgMHhkZiwKKwkvKiB2YWx1ZXMgZm9yOiAgMjAxIC0gMjU1ICovCisJMHgzZSwgMHhmYywgMHg3OSwgMHhmMiwgMHg2NSwgMHhjYSwgMHgxNSwgMHhhYiwgMHg1NywgMHhhZSwKKwkweDVjLCAweGI5LCAweDczLCAweGU2LCAweDRkLCAweDlhLCAweDM0LCAweGU4LCAweDUxLCAweGEyLAorCTB4NDQsIDB4ODksIDB4MTMsIDB4YTcsIDB4NGYsIDB4OWUsIDB4M2MsIDB4ZjgsIDB4NzEsIDB4ZTIsCisJMHg0NSwgMHg4YSwgMHgxNCwgMHhhOCwgMHg1MCwgMHhhMSwgMHg0MywgMHg4NiwgMHgwYywgMHg5OCwKKwkweDMwLCAweGUwLCAweDQxLCAweDgyLCAweDA0LCAweDg4LCAweDEwLCAweGEwLCAweDQwLCAweDgxLAorCTB4MDMsIDB4ODcsIDB4MGYsIDB4OWYsIDB4M2YgIC8qIEVORCAqLworfTsKKwordTMyIGdldF9jcHIwX2ZiZHYodW5zaWduZWQgbG9uZyBjcHJfcmVnX2ZiZHYpCit7CisJdTMyIGluZGV4OworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQVJSQVlfU0laRShwbGxfZmJkdl9tdWx0aV9iaXRzKTsgaW5kZXgrKykKKwkJaWYgKGNwcl9yZWdfZmJkdiA9PSAodTMyKXBsbF9mYmR2X211bHRpX2JpdHNbaW5kZXhdKQorCQkJcmV0dXJuIGluZGV4ICsgMTsKKworCXJldHVybiAwOworfQorCisvKgorICogQU1DQ19UT0RPOiB2ZXJpZnkgdGhpcyByb3V0aW5lIGFnYWluc3QgbGF0ZXN0IEVBUywgY2F1c2Ugc3R1ZmYgY2hhbmdlZAorICogICAgICAgICAgICB3aXRoIGxhdGVzdCBFQVMKKyAqLwordm9pZCBnZXRfc3lzX2luZm8gKHN5c19pbmZvX3QgKiBzeXNJbmZvKQoreworCXVuc2lnbmVkIGxvbmcgc3RycDA7CisJdW5zaWduZWQgbG9uZyBzdHJwMTsKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisJdW5zaWduZWQgbG9uZyBtOworCXVuc2lnbmVkIGxvbmcgcGxiZWR2MDsKKworCS8qIEV4dHJhY3QgY29uZmlndXJlZCBkaXZpc29ycyAqLworCW1mc2RyKFNEUjBfU0RTVFAwLCBzdHJwMCk7CisJbWZzZHIoU0RSMF9TRFNUUDEsIHN0cnAxKTsKKworCXRlbXAgPSAoKHN0cnAwICYgUExMU1lTMF9GV0RfRElWX0FfTUFTSykgPj4gNCk7CisJc3lzSW5mby0+cGxsRndkRGl2QSA9IGdldF9jcHIwX2Z3ZHYodGVtcCk7CisKKwl0ZW1wID0gKHN0cnAwICYgUExMU1lTMF9GV0RfRElWX0JfTUFTSyk7CisJc3lzSW5mby0+cGxsRndkRGl2QiA9IGdldF9jcHIwX2Z3ZHYodGVtcCk7CisKKwl0ZW1wID0gKHN0cnAwICYgUExMU1lTMF9GQl9ESVZfTUFTSykgPj4gODsKKwlzeXNJbmZvLT5wbGxGYmtEaXYgPSBnZXRfY3ByMF9mYmR2KHRlbXApOworCisJdGVtcCA9IChzdHJwMSAmIFBMTFNZUzBfT1BCX0RJVl9NQVNLKSA+PiAyNjsKKwlzeXNJbmZvLT5wbGxPcGJEaXYgPSB0ZW1wID8gdGVtcCA6IDQ7CisKKwkvKiBBTUNDX1RPRE86IHZlcmlmeSB0aGUgU0RSMF9TRFNUUDEuUEVSRFYwIHZhbHVlIHN5c0luZm8tPnBsbEV4dEJ1c0RpdiAqLworCXRlbXAgPSAoc3RycDEgJiBQTExTWVMwX1BFUkNMS19ESVZfTUFTSykgPj4gMjQ7CisJc3lzSW5mby0+cGxsRXh0QnVzRGl2ID0gdGVtcCA/IHRlbXAgOiA0OworCisJdGVtcCA9IChzdHJwMSAmIFBMTFNZUzBfUExCRURWMF9ESVZfTUFTSykgPj4gMjk7CisJcGxiZWR2MCA9IHRlbXAgPyB0ZW1wOiA4OworCisJLyogQ2FsY3VsYXRlICdNJyBiYXNlZCBvbiBmZWVkYmFjayBzb3VyY2UgKi8KKwl0ZW1wID0gKHN0cnAwICYgUExMU1lTMF9TRUxfTUFTSykgPj4gMjc7CisJaWYgKHRlbXAgPT0gMCkgeworCQkvKiBQTEwgaW50ZXJuYWwgZmVlZGJhY2sgKi8KKwkJbSA9IHN5c0luZm8tPnBsbEZia0RpdjsKKwl9IGVsc2UgeworCQkvKiBQTEwgUGVyQ2xrIGZlZWRiYWNrICovCisJCW0gPSBzeXNJbmZvLT5wbGxGd2REaXZBICogcGxiZWR2MCAqIHN5c0luZm8tPnBsbE9wYkRpdiAqCisJCQlzeXNJbmZvLT5wbGxFeHRCdXNEaXY7CisJfQorCisJLyogTm93IGNhbGN1bGF0ZSB0aGUgaW5kaXZpZHVhbCBjbG9ja3MgKi8KKwlzeXNJbmZvLT5mcmVxVkNPTWh6ID0gKG0gKiBDT05GSUdfU1lTX0NMS19GUkVRKSArIChtID4+IDEpOworCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSBzeXNJbmZvLT5mcmVxVkNPTWh6L3N5c0luZm8tPnBsbEZ3ZERpdkE7CisJc3lzSW5mby0+ZnJlcVBMQiA9IHN5c0luZm8tPmZyZXFWQ09NaHogLyBzeXNJbmZvLT5wbGxGd2REaXZBIC8gcGxiZWR2MDsKKwlzeXNJbmZvLT5mcmVxT1BCID0gc3lzSW5mby0+ZnJlcVBMQiAvIHN5c0luZm8tPnBsbE9wYkRpdjsKKwlzeXNJbmZvLT5mcmVxRUJDID0gc3lzSW5mby0+ZnJlcU9QQiAvIHN5c0luZm8tPnBsbEV4dEJ1c0RpdjsKKwlzeXNJbmZvLT5mcmVxRERSID0gc3lzSW5mby0+ZnJlcVBMQjsKKwlzeXNJbmZvLT5mcmVxVUFSVCA9IHN5c0luZm8tPmZyZXFQTEI7CisKKwlyZXR1cm47Cit9CisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBHUikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQordm9pZCBnZXRfc3lzX2luZm8gKHN5c19pbmZvX3QgKnN5c0luZm8pCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCXVuc2lnbmVkIGxvbmcgcmVnOworCXVuc2lnbmVkIGxvbmcgbGZkaXY7CisJdW5zaWduZWQgbG9uZyBtOworCXVuc2lnbmVkIGxvbmcgcHJiZHYwOworCS8qCisJICBXQVJOSU5HOiBBU1NVTUVTIHRoZSBmb2xsb3dpbmc6CisJICBFTkc9MQorCSAgUFJBRFYwPTEKKwkgIFBSQkRWMD0xCisJKi8KKworCS8qIERlY29kZSBDUFIwX1BMTEQwIGZvciBkaXZpc29ycyAqLworCW1mY3ByKENQUjBfUExMRCwgcmVnKTsKKwl0ZW1wID0gKHJlZyAmIFBMTERfRldEVkFfTUFTSykgPj4gMTY7CisJc3lzSW5mby0+cGxsRndkRGl2QSA9IHRlbXAgPyB0ZW1wIDogMTY7CisJdGVtcCA9IChyZWcgJiBQTExEX0ZXRFZCX01BU0spID4+IDg7CisJc3lzSW5mby0+cGxsRndkRGl2QiA9IHRlbXAgPyB0ZW1wOiA4IDsKKwl0ZW1wID0gKHJlZyAmIFBMTERfRkJEVl9NQVNLKSA+PiAyNDsKKwlzeXNJbmZvLT5wbGxGYmtEaXYgPSB0ZW1wID8gdGVtcCA6IDMyOworCWxmZGl2ID0gcmVnICYgUExMRF9MRkJEVl9NQVNLOworCisJbWZjcHIoQ1BSMF9PUEJEMCwgcmVnKTsKKwl0ZW1wID0gKHJlZyAmIE9QQkREVl9NQVNLKSA+PiAyNDsKKwlzeXNJbmZvLT5wbGxPcGJEaXYgPSB0ZW1wID8gdGVtcCA6IDQ7CisKKwltZmNwcihDUFIwX1BFUkQsIHJlZyk7CisJdGVtcCA9IChyZWcgJiBQRVJEVl9NQVNLKSA+PiAyNDsKKwlzeXNJbmZvLT5wbGxFeHRCdXNEaXYgPSB0ZW1wID8gdGVtcCA6IDg7CisKKwltZmNwcihDUFIwX1BSSU1CRDAsIHJlZyk7CisJdGVtcCA9IChyZWcgJiBQUkJEVl9NQVNLKSA+PiAyNDsKKwlwcmJkdjAgPSB0ZW1wID8gdGVtcCA6IDg7CisKKwltZmNwcihDUFIwX1NQQ0lELCByZWcpOworCXRlbXAgPSAocmVnICYgU1BDSURfTUFTSykgPj4gMjQ7CisJc3lzSW5mby0+cGxsUGNpRGl2ID0gdGVtcCA/IHRlbXAgOiA0OworCisJLyogQ2FsY3VsYXRlICdNJyBiYXNlZCBvbiBmZWVkYmFjayBzb3VyY2UgKi8KKwltZnNkcihTRFIwX1NEU1RQMCwgcmVnKTsKKwl0ZW1wID0gKHJlZyAmIFBMTFNZUzBfU0VMX01BU0spID4+IDI3OworCWlmICh0ZW1wID09IDApIHsgLyogUExMIG91dHB1dCAqLworCQkvKiBGaWd1cmUgd2hpY2ggcGxsIHRvIHVzZSAqLworCQltZmNwcihDUFIwX1BMTEMsIHJlZyk7CisJCXRlbXAgPSAocmVnICYgUExMQ19TUkNfTUFTSykgPj4gMjk7CisJCWlmICghdGVtcCkgLyogUExMT1VUQSAqLworCQkJbSA9IHN5c0luZm8tPnBsbEZia0RpdiAqIGxmZGl2ICogc3lzSW5mby0+cGxsRndkRGl2QTsKKwkJZWxzZSAgICAgICAvKiBQTExPVVRCICovCisJCQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogbGZkaXYgKiBzeXNJbmZvLT5wbGxGd2REaXZCOworCX0KKwllbHNlIGlmICh0ZW1wID09IDEpIC8qIENQVSBvdXRwdXQgKi8KKwkJbSA9IHN5c0luZm8tPnBsbEZia0RpdiAqIHN5c0luZm8tPnBsbEZ3ZERpdkE7CisJZWxzZSAvKiBQZXJDbGsgKi8KKwkJbSA9IHN5c0luZm8tPnBsbEV4dEJ1c0RpdiAqIHN5c0luZm8tPnBsbE9wYkRpdiAqIHN5c0luZm8tPnBsbEZ3ZERpdkI7CisKKwkvKiBOb3cgY2FsY3VsYXRlIHRoZSBpbmRpdmlkdWFsIGNsb2NrcyAqLworCXN5c0luZm8tPmZyZXFWQ09NaHogPSAobSAqIENPTkZJR19TWVNfQ0xLX0ZSRVEpICsgKG0+PjEpOworCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSBzeXNJbmZvLT5mcmVxVkNPTWh6L3N5c0luZm8tPnBsbEZ3ZERpdkE7CisJc3lzSW5mby0+ZnJlcVBMQiA9IHN5c0luZm8tPmZyZXFWQ09NaHovc3lzSW5mby0+cGxsRndkRGl2Qi9wcmJkdjA7CisJc3lzSW5mby0+ZnJlcU9QQiA9IHN5c0luZm8tPmZyZXFQTEIvc3lzSW5mby0+cGxsT3BiRGl2OworCXN5c0luZm8tPmZyZXFFQkMgPSBzeXNJbmZvLT5mcmVxUExCL3N5c0luZm8tPnBsbEV4dEJ1c0RpdjsKKwlzeXNJbmZvLT5mcmVxUENJID0gc3lzSW5mby0+ZnJlcVBMQi9zeXNJbmZvLT5wbGxQY2lEaXY7CisJc3lzSW5mby0+ZnJlcVVBUlQgPSBzeXNJbmZvLT5mcmVxUExCOworCisJLyogRmlndXJlIHdoaWNoIHRpbWVyIHNvdXJjZSB0byB1c2UgKi8KKwlpZiAobWZzcHIoU1BSTl9DQ1IxKSAmIDB4MDA4MCkgeworCQkvKiBFeHRlcm5hbCBDbG9jaywgYXNzdW1lIHNhbWUgYXMgU1lTX0NMSyAqLworCQl0ZW1wID0gc3lzSW5mby0+ZnJlcVByb2Nlc3NvciAvIDI7ICAvKiBNYXggZXh0ZXJuIGNsb2NrIHNwZWVkICovCisJCWlmIChDT05GSUdfU1lTX0NMS19GUkVRID4gdGVtcCkKKwkJCXN5c0luZm8tPmZyZXFUbXJDbGsgPSB0ZW1wOworCQllbHNlCisJCQlzeXNJbmZvLT5mcmVxVG1yQ2xrID0gQ09ORklHX1NZU19DTEtfRlJFUTsKKwl9CisJZWxzZSAgLyogSW50ZXJuYWwgY2xvY2sgKi8KKwkJc3lzSW5mby0+ZnJlcVRtckNsayA9IHN5c0luZm8tPmZyZXFQcm9jZXNzb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X1BDSV9mcmVxCisgKiByZXR1cm4gUENJIGJ1cyBmcmVxIGluIEh6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWxvbmcgZ2V0X1BDSV9mcmVxICh2b2lkKQoreworCXN5c19pbmZvX3Qgc3lzX2luZm87CisJZ2V0X3N5c19pbmZvICgmc3lzX2luZm8pOworCXJldHVybiBzeXNfaW5mby5mcmVxUENJOworfQorCisjZWxpZiAhZGVmaW5lZChDT05GSUdfNDQwR1gpICYmICFkZWZpbmVkKENPTkZJR180NDBTUCkgJiYgIWRlZmluZWQoQ09ORklHXzQ0MFNQRSkgXAorCSYmICFkZWZpbmVkKENPTkZJR19YSUxJTlhfNDQwKQordm9pZCBnZXRfc3lzX2luZm8gKHN5c19pbmZvX3QgKiBzeXNJbmZvKQoreworCXVuc2lnbmVkIGxvbmcgc3RycDA7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCXVuc2lnbmVkIGxvbmcgbTsKKworCS8qIEV4dHJhY3QgY29uZmlndXJlZCBkaXZpc29ycyAqLworCXN0cnAwID0gbWZkY3IoIENQQzBfU1RSUDAgKTsKKwlzeXNJbmZvLT5wbGxGd2REaXZBID0gOCAtICgoc3RycDAgJiBQTExTWVMwX0ZXRF9ESVZfQV9NQVNLKSA+PiAxNSk7CisJc3lzSW5mby0+cGxsRndkRGl2QiA9IDggLSAoKHN0cnAwICYgUExMU1lTMF9GV0RfRElWX0JfTUFTSykgPj4gMTIpOworCXRlbXAgPSAoc3RycDAgJiBQTExTWVMwX0ZCX0RJVl9NQVNLKSA+PiAxODsKKwlzeXNJbmZvLT5wbGxGYmtEaXYgPSB0ZW1wID8gdGVtcCA6IDE2OworCXN5c0luZm8tPnBsbE9wYkRpdiA9IDEgKyAoKHN0cnAwICYgUExMU1lTMF9PUEJfRElWX01BU0spID4+IDEwKTsKKwlzeXNJbmZvLT5wbGxFeHRCdXNEaXYgPSAxICsgKChzdHJwMCAmIFBMTFNZUzBfRVBCX0RJVl9NQVNLKSA+PiA4KTsKKworCS8qIENhbGN1bGF0ZSAnTScgYmFzZWQgb24gZmVlZGJhY2sgc291cmNlICovCisJaWYoIHN0cnAwICYgUExMU1lTMF9FWFRTTF9NQVNLICkKKwkJbSA9IHN5c0luZm8tPnBsbEV4dEJ1c0RpdiAqIHN5c0luZm8tPnBsbE9wYkRpdiAqIHN5c0luZm8tPnBsbEZ3ZERpdkI7CisJZWxzZQorCQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogc3lzSW5mby0+cGxsRndkRGl2QTsKKworCS8qIE5vdyBjYWxjdWxhdGUgdGhlIGluZGl2aWR1YWwgY2xvY2tzICovCisJc3lzSW5mby0+ZnJlcVZDT01oeiA9IChtICogQ09ORklHX1NZU19DTEtfRlJFUSkgKyAobT4+MSk7CisJc3lzSW5mby0+ZnJlcVByb2Nlc3NvciA9IHN5c0luZm8tPmZyZXFWQ09NaHovc3lzSW5mby0+cGxsRndkRGl2QTsKKwlzeXNJbmZvLT5mcmVxUExCID0gc3lzSW5mby0+ZnJlcVZDT01oei9zeXNJbmZvLT5wbGxGd2REaXZCOworCWlmKCBnZXRfcHZyKCkgPT0gUFZSXzQ0MEdQX1JCICkgLyogUmV2IEIgZGl2cyBhbiBleHRyYSAyIC0tIGdlZXohICovCisJCXN5c0luZm8tPmZyZXFQTEIgPj49IDE7CisJc3lzSW5mby0+ZnJlcU9QQiA9IHN5c0luZm8tPmZyZXFQTEIvc3lzSW5mby0+cGxsT3BiRGl2OworCXN5c0luZm8tPmZyZXFFQkMgPSBzeXNJbmZvLT5mcmVxT1BCL3N5c0luZm8tPnBsbEV4dEJ1c0RpdjsKKwlzeXNJbmZvLT5mcmVxVUFSVCA9IHN5c0luZm8tPmZyZXFQTEI7Cit9CisjZWxzZQorCisjaWYgIWRlZmluZWQoQ09ORklHX1hJTElOWF80NDApCit2b2lkIGdldF9zeXNfaW5mbyAoc3lzX2luZm9fdCAqIHN5c0luZm8pCit7CisJdW5zaWduZWQgbG9uZyBzdHJwMDsKKwl1bnNpZ25lZCBsb25nIHN0cnAxOworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKwl1bnNpZ25lZCBsb25nIHRlbXAxOworCXVuc2lnbmVkIGxvbmcgbGZkaXY7CisJdW5zaWduZWQgbG9uZyBtOworCXVuc2lnbmVkIGxvbmcgcHJiZHYwOworCisjaWYgZGVmaW5lZChDT05GSUdfWVVDQ0EpCisJdW5zaWduZWQgbG9uZyBzeXNfZnJlcTsKKwl1bnNpZ25lZCBsb25nIHN5c19wZXI9MDsKKwl1bnNpZ25lZCBsb25nIG1zcjsKKwl1bnNpZ25lZCBsb25nIHBjaV9jbG9ja19wZXI7CisJdW5zaWduZWQgbG9uZyBzZHJfZGRycGxsOworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSB8IEdldCB0aGUgc3lzdGVtIGNsb2NrIHBlcmlvZC4KKwkgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCXN5c19wZXIgPSBkZXRlcm1pbmVfc3lzcGVyKCk7CisKKwltc3IgPSAobWZtc3IgKCkgJiB+KE1TUl9FRSkpOwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgfCBDYWxjdWxhdGUgdGhlIHN5c3RlbSBjbG9jayBzcGVlZCBmcm9tIHRoZSBwZXJpb2QuCisJICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlzeXNfZnJlcSA9IChPTkVfQklMTElPTiAvIHN5c19wZXIpICogMTAwMDsKKyNlbmRpZgorCisJLyogRXh0cmFjdCBjb25maWd1cmVkIGRpdmlzb3JzICovCisJbWZzZHIoIFNEUjBfU0RTVFAwLHN0cnAwICk7CisJbWZzZHIoIFNEUjBfU0RTVFAxLHN0cnAxICk7CisKKwl0ZW1wID0gKChzdHJwMCAmIFBMTFNZUzBfRldEX0RJVl9BX01BU0spID4+IDgpOworCXN5c0luZm8tPnBsbEZ3ZERpdkEgPSB0ZW1wID8gdGVtcCA6IDE2IDsKKwl0ZW1wID0gKChzdHJwMCAmIFBMTFNZUzBfRldEX0RJVl9CX01BU0spID4+IDUpOworCXN5c0luZm8tPnBsbEZ3ZERpdkIgPSB0ZW1wID8gdGVtcDogOCA7CisJdGVtcCA9IChzdHJwMCAmIFBMTFNZUzBfRkJfRElWX01BU0spID4+IDEyOworCXN5c0luZm8tPnBsbEZia0RpdiA9IHRlbXAgPyB0ZW1wIDogMzI7CisJdGVtcCA9IChzdHJwMCAmIFBMTFNZUzBfT1BCX0RJVl9NQVNLKTsKKwlzeXNJbmZvLT5wbGxPcGJEaXYgPSB0ZW1wID8gdGVtcCA6IDQ7CisJdGVtcCA9IChzdHJwMSAmIFBMTFNZUzFfUEVSQ0xLX0RJVl9NQVNLKSA+PiAyNDsKKwlzeXNJbmZvLT5wbGxFeHRCdXNEaXYgPSB0ZW1wID8gdGVtcCA6IDQ7CisJcHJiZHYwID0gKHN0cnAwID4+IDIpICYgMHg3OworCisJLyogQ2FsY3VsYXRlICdNJyBiYXNlZCBvbiBmZWVkYmFjayBzb3VyY2UgKi8KKwl0ZW1wID0gKHN0cnAwICYgUExMU1lTMF9TRUxfTUFTSykgPj4gMjc7CisJdGVtcDEgPSAoc3RycDEgJiBQTExTWVMxX0xGX0RJVl9NQVNLKSA+PiAyNjsKKwlsZmRpdiA9IHRlbXAxID8gdGVtcDEgOiA2NDsKKwlpZiAodGVtcCA9PSAwKSB7IC8qIFBMTCBvdXRwdXQgKi8KKwkJLyogRmlndXJlIHdoaWNoIHBsbCB0byB1c2UgKi8KKwkJdGVtcCA9IChzdHJwMCAmIFBMTFNZUzBfU1JDX01BU0spID4+IDMwOworCQlpZiAoIXRlbXApCisJCQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogbGZkaXYgKiBzeXNJbmZvLT5wbGxGd2REaXZBOworCQllbHNlCisJCQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogbGZkaXYgKiBzeXNJbmZvLT5wbGxGd2REaXZCOworCX0KKwllbHNlIGlmICh0ZW1wID09IDEpIC8qIENQVSBvdXRwdXQgKi8KKwkJbSA9IHN5c0luZm8tPnBsbEZia0RpdiAqIHN5c0luZm8tPnBsbEZ3ZERpdkE7CisJZWxzZSAvKiBQZXJDbGsgKi8KKwkJbSA9IHN5c0luZm8tPnBsbEV4dEJ1c0RpdiAqIHN5c0luZm8tPnBsbE9wYkRpdiAqIHN5c0luZm8tPnBsbEZ3ZERpdkI7CisKKwkvKiBOb3cgY2FsY3VsYXRlIHRoZSBpbmRpdmlkdWFsIGNsb2NrcyAqLworI2lmIGRlZmluZWQoQ09ORklHX1lVQ0NBKQorCXN5c0luZm8tPmZyZXFWQ09NaHogPSAobSAqIHN5c19mcmVxKSA7CisjZWxzZQorCXN5c0luZm8tPmZyZXFWQ09NaHogPSAobSAqIENPTkZJR19TWVNfQ0xLX0ZSRVEpICsgKG0gPj4gMSk7CisjZW5kaWYKKwlzeXNJbmZvLT5mcmVxUHJvY2Vzc29yID0gc3lzSW5mby0+ZnJlcVZDT01oei9zeXNJbmZvLT5wbGxGd2REaXZBOworCXN5c0luZm8tPmZyZXFQTEIgPSBzeXNJbmZvLT5mcmVxVkNPTWh6L3N5c0luZm8tPnBsbEZ3ZERpdkIvcHJiZHYwOworCXN5c0luZm8tPmZyZXFPUEIgPSBzeXNJbmZvLT5mcmVxUExCL3N5c0luZm8tPnBsbE9wYkRpdjsKKwlzeXNJbmZvLT5mcmVxRUJDID0gc3lzSW5mby0+ZnJlcU9QQi9zeXNJbmZvLT5wbGxFeHRCdXNEaXY7CisKKyNpZiBkZWZpbmVkKENPTkZJR19ZVUNDQSkKKwkvKiBEZXRlcm1pbmUgUENJIENsb2NrIFBlcmlvZCAqLworCXBjaV9jbG9ja19wZXIgPSBkZXRlcm1pbmVfcGNpX2Nsb2NrX3BlcigpOworCXN5c0luZm8tPmZyZXFQQ0kgPSAoT05FX0JJTExJT04vcGNpX2Nsb2NrX3BlcikgKiAxMDAwOworCW1mc2RyKFNEUjBfRERSMCwgc2RyX2RkcnBsbCk7CisJc3lzSW5mby0+ZnJlcUREUiA9ICgoc3lzSW5mby0+ZnJlcVBMQikgKiBTRFIwX0REUjBfRERSTV9ERUNPREUoc2RyX2RkcnBsbCkpOworI2VuZGlmCisKKwlzeXNJbmZvLT5mcmVxVUFSVCA9IHN5c0luZm8tPmZyZXFQTEI7Cit9CisKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19YSUxJTlhfNDQwICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19ZVUNDQSkKK3Vuc2lnbmVkIGxvbmcgZGV0ZXJtaW5lX3N5c3Blcih2b2lkKQoreworCXVuc2lnbmVkIGludCBmcGdhX2Nsb2NraW5nX3JlZzsKKwl1bnNpZ25lZCBpbnQgbWFzdGVyX2Nsb2NrX3NlbGVjdGlvbjsKKwl1bnNpZ25lZCBsb25nIG1hc3Rlcl9jbG9ja19wZXIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmJfZGl2X3NlbGVjdGlvbjsKKwl1bnNpZ25lZCBpbnQgdmNvX2Rpdl9yZWdfdmFsdWU7CisJdW5zaWduZWQgbG9uZyB2Y29fZGl2X3NlbGVjdGlvbjsKKwl1bnNpZ25lZCBsb25nIHN5c19wZXIgPSAwOworCWludCBleHRDbGtWYWw7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJIHwgUmVhZCBGUEdBIHJlZyAwIGFuZCByZWcgMSB0byBnZXQgRlBHQSByZWcgaW5mb3JtYXRpb24KKwkgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWZwZ2FfY2xvY2tpbmdfcmVnID0gaW4xNihGUEdBX1JFRzE2KTsKKworCisJLyogRGV0ZXJtaW5lIE1hc3RlciBDbG9jayBTb3VyY2UgU2VsZWN0aW9uICovCisJbWFzdGVyX2Nsb2NrX3NlbGVjdGlvbiA9IGZwZ2FfY2xvY2tpbmdfcmVnICYgRlBHQV9SRUcxNl9NQVNURVJfQ0xLX01BU0s7CisKKwlzd2l0Y2gobWFzdGVyX2Nsb2NrX3NlbGVjdGlvbikgeworCQljYXNlIEZQR0FfUkVHMTZfTUFTVEVSX0NMS182Nl82NjoKKwkJCW1hc3Rlcl9jbG9ja19wZXIgPSBQRVJJT0RfNjZfNjZNSFo7CisJCQlicmVhazsKKwkJY2FzZSBGUEdBX1JFRzE2X01BU1RFUl9DTEtfNTA6CisJCQltYXN0ZXJfY2xvY2tfcGVyID0gUEVSSU9EXzUwXzAwTUhaOworCQkJYnJlYWs7CisJCWNhc2UgRlBHQV9SRUcxNl9NQVNURVJfQ0xLXzMzXzMzOgorCQkJbWFzdGVyX2Nsb2NrX3BlciA9IFBFUklPRF8zM18zM01IWjsKKwkJCWJyZWFrOworCQljYXNlIEZQR0FfUkVHMTZfTUFTVEVSX0NMS18yNToKKwkJCW1hc3Rlcl9jbG9ja19wZXIgPSBQRVJJT0RfMjVfMDBNSFo7CisJCQlicmVhazsKKwkJY2FzZSBGUEdBX1JFRzE2X01BU1RFUl9DTEtfRVhUOgorCQkJaWYgKChleHRDbGtWYWw9PUVYVENMS18zM18zMykKKwkJCQkJJiYgKGV4dENsa1ZhbD09RVhUQ0xLXzUwKQorCQkJCQkmJiAoZXh0Q2xrVmFsPT1FWFRDTEtfNjZfNjYpCisJCQkJCSYmIChleHRDbGtWYWw9PUVYVENMS184MykpIHsKKwkJCQkvKiBjYWxjdWxhdGUgbWFzdGVyIGNsb2NrIHBlcmlvZCBmcm9tIGV4dGVybmFsIGNsb2NrIHZhbHVlICovCisJCQkJbWFzdGVyX2Nsb2NrX3Blcj0oT05FX0JJTExJT04vZXh0Q2xrVmFsKSAqIDEwMDA7CisJCQl9IGVsc2UgeworCQkJCS8qIFVuc3VwcG9ydGVkICovCisJCQkJREVCVUdGICgiJXNbJWRdICoqKiBtYXN0ZXIgY2xvY2sgc2VsZWN0aW9uIGZhaWxlZCAqKipcbiIsIF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CisJCQkJaGFuZygpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBVbnN1cHBvcnRlZCAqLworCQkJREVCVUdGICgiJXNbJWRdICoqKiBtYXN0ZXIgY2xvY2sgc2VsZWN0aW9uIGZhaWxlZCAqKipcbiIsIF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CisJCQloYW5nKCk7CisJCQlicmVhazsKKwl9CisKKwkvKiBEZXRlcm1pbmUgRkIgZGl2aXNvcnMgdmFsdWVzICovCisJaWYgKChmcGdhX2Nsb2NraW5nX3JlZyAmIEZQR0FfUkVHMTZfRkIxX0RJVl9NQVNLKSA9PSBGUEdBX1JFRzE2X0ZCMV9ESVZfTE9XKSB7CisJCWlmICgoZnBnYV9jbG9ja2luZ19yZWcgJiBGUEdBX1JFRzE2X0ZCMl9ESVZfTUFTSykgPT0gRlBHQV9SRUcxNl9GQjJfRElWX0xPVykKKwkJCWZiX2Rpdl9zZWxlY3Rpb24gPSBGUEdBX0ZCX0RJVl82OworCQllbHNlCisJCQlmYl9kaXZfc2VsZWN0aW9uID0gRlBHQV9GQl9ESVZfMTI7CisJfSBlbHNlIHsKKwkJaWYgKChmcGdhX2Nsb2NraW5nX3JlZyAmIEZQR0FfUkVHMTZfRkIyX0RJVl9NQVNLKSA9PSBGUEdBX1JFRzE2X0ZCMl9ESVZfTE9XKQorCQkJZmJfZGl2X3NlbGVjdGlvbiA9IEZQR0FfRkJfRElWXzEwOworCQllbHNlCisJCQlmYl9kaXZfc2VsZWN0aW9uID0gRlBHQV9GQl9ESVZfMjA7CisJfQorCisJLyogRGV0ZXJtaW5lIFZDTyBkaXZpc29ycyB2YWx1ZXMgKi8KKwl2Y29fZGl2X3JlZ192YWx1ZSA9IGZwZ2FfY2xvY2tpbmdfcmVnICYgRlBHQV9SRUcxNl9WQ09fRElWX01BU0s7CisKKwlzd2l0Y2godmNvX2Rpdl9yZWdfdmFsdWUpIHsKKwkJY2FzZSBGUEdBX1JFRzE2X1ZDT19ESVZfNDoKKwkJCXZjb19kaXZfc2VsZWN0aW9uID0gRlBHQV9WQ09fRElWXzQ7CisJCQlicmVhazsKKwkJY2FzZSBGUEdBX1JFRzE2X1ZDT19ESVZfNjoKKwkJCXZjb19kaXZfc2VsZWN0aW9uID0gRlBHQV9WQ09fRElWXzY7CisJCQlicmVhazsKKwkJY2FzZSBGUEdBX1JFRzE2X1ZDT19ESVZfODoKKwkJCXZjb19kaXZfc2VsZWN0aW9uID0gRlBHQV9WQ09fRElWXzg7CisJCQlicmVhazsKKwkJY2FzZSBGUEdBX1JFRzE2X1ZDT19ESVZfMTA6CisJCWRlZmF1bHQ6CisJCQl2Y29fZGl2X3NlbGVjdGlvbiA9IEZQR0FfVkNPX0RJVl8xMDsKKwkJCWJyZWFrOworCX0KKworCWlmIChtYXN0ZXJfY2xvY2tfc2VsZWN0aW9uID09IEZQR0FfUkVHMTZfTUFTVEVSX0NMS19FWFQpIHsKKwkJc3dpdGNoKG1hc3Rlcl9jbG9ja19wZXIpIHsKKwkJCWNhc2UgUEVSSU9EXzI1XzAwTUhaOgorCQkJCWlmIChmYl9kaXZfc2VsZWN0aW9uID09IEZQR0FfRkJfRElWXzEyKSB7CisJCQkJCWlmICh2Y29fZGl2X3NlbGVjdGlvbiA9PSBGUEdBX1ZDT19ESVZfNCkKKwkJCQkJCXN5c19wZXIgPSBQRVJJT0RfNzVfMDBNSFo7CisJCQkJCWlmICh2Y29fZGl2X3NlbGVjdGlvbiA9PSBGUEdBX1ZDT19ESVZfNikKKwkJCQkJCXN5c19wZXIgPSBQRVJJT0RfNTBfMDBNSFo7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQRVJJT0RfMzNfMzNNSFo6CisJCQkJaWYgKGZiX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9GQl9ESVZfNikgeworCQkJCQlpZiAodmNvX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9WQ09fRElWXzQpCisJCQkJCQlzeXNfcGVyID0gUEVSSU9EXzUwXzAwTUhaOworCQkJCQlpZiAodmNvX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9WQ09fRElWXzYpCisJCQkJCQlzeXNfcGVyID0gUEVSSU9EXzMzXzMzTUhaOworCQkJCX0KKwkJCQlpZiAoZmJfZGl2X3NlbGVjdGlvbiA9PSBGUEdBX0ZCX0RJVl8xMCkgeworCQkJCQlpZiAodmNvX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9WQ09fRElWXzQpCisJCQkJCQlzeXNfcGVyID0gUEVSSU9EXzgzXzMzTUhaOworCQkJCQlpZiAodmNvX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9WQ09fRElWXzEwKQorCQkJCQkJc3lzX3BlciA9IFBFUklPRF8zM18zM01IWjsKKwkJCQl9CisJCQkJaWYgKGZiX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9GQl9ESVZfMTIpIHsKKwkJCQkJaWYgKHZjb19kaXZfc2VsZWN0aW9uID09IEZQR0FfVkNPX0RJVl80KQorCQkJCQkJc3lzX3BlciA9IFBFUklPRF8xMDBfMDBNSFo7CisJCQkJCWlmICh2Y29fZGl2X3NlbGVjdGlvbiA9PSBGUEdBX1ZDT19ESVZfNikKKwkJCQkJCXN5c19wZXIgPSBQRVJJT0RfNjZfNjZNSFo7CisJCQkJCWlmICh2Y29fZGl2X3NlbGVjdGlvbiA9PSBGUEdBX1ZDT19ESVZfOCkKKwkJCQkJCXN5c19wZXIgPSBQRVJJT0RfNTBfMDBNSFo7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQRVJJT0RfNTBfMDBNSFo6CisJCQkJaWYgKGZiX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9GQl9ESVZfNikgeworCQkJCQlpZiAodmNvX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9WQ09fRElWXzQpCisJCQkJCQlzeXNfcGVyID0gUEVSSU9EXzc1XzAwTUhaOworCQkJCQlpZiAodmNvX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9WQ09fRElWXzYpCisJCQkJCQlzeXNfcGVyID0gUEVSSU9EXzUwXzAwTUhaOworCQkJCX0KKwkJCQlpZiAoZmJfZGl2X3NlbGVjdGlvbiA9PSBGUEdBX0ZCX0RJVl8xMCkgeworCQkJCQlpZiAodmNvX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9WQ09fRElWXzYpCisJCQkJCQlzeXNfcGVyID0gUEVSSU9EXzgzXzMzTUhaOworCQkJCQlpZiAodmNvX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9WQ09fRElWXzEwKQorCQkJCQkJc3lzX3BlciA9IFBFUklPRF81MF8wME1IWjsKKwkJCQl9CisJCQkJaWYgKGZiX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9GQl9ESVZfMTIpIHsKKwkJCQkJaWYgKHZjb19kaXZfc2VsZWN0aW9uID09IEZQR0FfVkNPX0RJVl82KQorCQkJCQkJc3lzX3BlciA9IFBFUklPRF8xMDBfMDBNSFo7CisJCQkJCWlmICh2Y29fZGl2X3NlbGVjdGlvbiA9PSBGUEdBX1ZDT19ESVZfOCkKKwkJCQkJCXN5c19wZXIgPSBQRVJJT0RfNzVfMDBNSFo7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBQRVJJT0RfNjZfNjZNSFo6CisJCQkJaWYgKGZiX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9GQl9ESVZfNikgeworCQkJCQlpZiAodmNvX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9WQ09fRElWXzQpCisJCQkJCQlzeXNfcGVyID0gUEVSSU9EXzEwMF8wME1IWjsKKwkJCQkJaWYgKHZjb19kaXZfc2VsZWN0aW9uID09IEZQR0FfVkNPX0RJVl82KQorCQkJCQkJc3lzX3BlciA9IFBFUklPRF82Nl82Nk1IWjsKKwkJCQkJaWYgKHZjb19kaXZfc2VsZWN0aW9uID09IEZQR0FfVkNPX0RJVl84KQorCQkJCQkJc3lzX3BlciA9IFBFUklPRF81MF8wME1IWjsKKwkJCQl9CisJCQkJaWYgKGZiX2Rpdl9zZWxlY3Rpb24gPT0gRlBHQV9GQl9ESVZfMTApIHsKKwkJCQkJaWYgKHZjb19kaXZfc2VsZWN0aW9uID09IEZQR0FfVkNPX0RJVl84KQorCQkJCQkJc3lzX3BlciA9IFBFUklPRF84M18zM01IWjsKKwkJCQkJaWYgKHZjb19kaXZfc2VsZWN0aW9uID09IEZQR0FfVkNPX0RJVl8xMCkKKwkJCQkJCXN5c19wZXIgPSBQRVJJT0RfNjZfNjZNSFo7CisJCQkJfQorCQkJCWlmIChmYl9kaXZfc2VsZWN0aW9uID09IEZQR0FfRkJfRElWXzEyKSB7CisJCQkJCWlmICh2Y29fZGl2X3NlbGVjdGlvbiA9PSBGUEdBX1ZDT19ESVZfOCkKKwkJCQkJCXN5c19wZXIgPSBQRVJJT0RfMTAwXzAwTUhaOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3lzX3BlciA9PSAwKSB7CisJCQkvKiBPdGhlciBjb21iaW5hdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKwkJCURFQlVHRiAoIiVzWyVkXSAqKiogc3lzIHBlcmlvZCBjb21wdXRlIGZhaWxlZCAqKipcbiIsIF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CisJCQloYW5nKCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBjYWxjdWwgc3lzdGVtIGNsb2NrIHdpdGhvdXQgY2hla2luZyAqLworCQkvKiBpZiBlbmdpbmVlcmluZyBvcHRpb24gY2xvY2sgbm8gY2hlY2sgaXMgc2VsZWN0ZWQgKi8KKwkJLyogc3lzX3BlciA9IG1hc3Rlcl9jbG9ja19wZXIgKiB2Y29fZGl2X3NlbGVjdGlvbiAvIGZiX2Rpdl9zZWxlY3Rpb24gKi8KKwkJc3lzX3BlciA9IChtYXN0ZXJfY2xvY2tfcGVyL2ZiX2Rpdl9zZWxlY3Rpb24pICogdmNvX2Rpdl9zZWxlY3Rpb247CisJfQorCisJcmV0dXJuKHN5c19wZXIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IGRldGVybWluZV9wY2lfY2xvY2tfcGVyLgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordW5zaWduZWQgbG9uZyBkZXRlcm1pbmVfcGNpX2Nsb2NrX3Blcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcGNpX2Nsb2NrX3NlbGVjdGlvbiwgIHBjaV9wZXJpb2Q7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJIHwgUmVhZCBGUEdBIHJlZyA2IHRvIGdldCBQQ0kgMCBGUEdBIHJlZyBpbmZvcm1hdGlvbgorCSArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJcGNpX2Nsb2NrX3NlbGVjdGlvbiA9IGluMTYoRlBHQV9SRUcxNik7CS8qIHdhcyByZWc2IGF2ZXJpZmllciAqLworCisKKwlwY2lfY2xvY2tfc2VsZWN0aW9uID0gcGNpX2Nsb2NrX3NlbGVjdGlvbiAmIEZQR0FfUkVHMTZfUENJMF9DTEtfTUFTSzsKKworCXN3aXRjaCAocGNpX2Nsb2NrX3NlbGVjdGlvbikgeworCQljYXNlIEZQR0FfUkVHMTZfUENJMF9DTEtfMTMzXzMzOgorCQkJcGNpX3BlcmlvZCA9IFBFUklPRF8xMzNfMzNNSFo7CisJCQlicmVhazsKKwkJY2FzZSBGUEdBX1JFRzE2X1BDSTBfQ0xLXzEwMDoKKwkJCXBjaV9wZXJpb2QgPSBQRVJJT0RfMTAwXzAwTUhaOworCQkJYnJlYWs7CisJCWNhc2UgRlBHQV9SRUcxNl9QQ0kwX0NMS182Nl82NjoKKwkJCXBjaV9wZXJpb2QgPSBQRVJJT0RfNjZfNjZNSFo7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBjaV9wZXJpb2QgPSBQRVJJT0RfMzNfMzNNSFo7OworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuKHBjaV9wZXJpb2QpOworfQorI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1hJTElOWF80MDUpCitleHRlcm4gdm9pZCBnZXRfc3lzX2luZm8gKHN5c19pbmZvX3QgKiBzeXNJbmZvKTsKK2V4dGVybiB1bG9uZyBnZXRfUENJX2ZyZXEgKHZvaWQpOworCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUDEwMDApCit2b2lkIGdldF9zeXNfaW5mbyAoc3lzX2luZm9fdCAqIHN5c0luZm8pCit7CisJc3lzSW5mby0+ZnJlcVByb2Nlc3NvciA9IDI0MCAqIDEwMDAgKiAxMDAwOworCXN5c0luZm8tPmZyZXFQTEIgPSA4MCAqIDEwMDAgKiAxMDAwOworCXN5c0luZm8tPmZyZXFQQ0kgPSAzMyAqIDEwMDAgKiAxMDAwOworfQorCisjZWxpZiBkZWZpbmVkKENPTkZJR180MDUpCisKK3ZvaWQgZ2V0X3N5c19pbmZvIChzeXNfaW5mb190ICogc3lzSW5mbykKK3sKKwlzeXNJbmZvLT5mcmVxVkNPTWh6PTMxMjUwMDA7CisJc3lzSW5mby0+ZnJlcVByb2Nlc3Nvcj0xMioxMDAwKjEwMDA7CisJc3lzSW5mby0+ZnJlcVBMQj01MCoxMDAwKjEwMDA7CisJc3lzSW5mby0+ZnJlcVBDST02NioxMDAwKjEwMDA7Cit9CisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzQwNUVQKQordm9pZCBnZXRfc3lzX2luZm8gKFBQQzR4eF9TWVNfSU5GTyAqIHN5c0luZm8pCit7CisJdW5zaWduZWQgbG9uZyBwbGxtcjA7CisJdW5zaWduZWQgbG9uZyBwbGxtcjE7CisJdW5zaWduZWQgbG9uZyBzeXNDbGtQZXJpb2RQcyA9IE9ORV9CSUxMSU9OIC8gKENPTkZJR19TWVNfQ0xLX0ZSRVEgLyAxMDAwKTsKKwl1bnNpZ25lZCBsb25nIG07CisJdW5zaWduZWQgbG9uZyBwbGxtcjBfY2NkdjsKKworCS8qCisJICogUmVhZCBQTEwgTW9kZSByZWdpc3RlcnMKKwkgKi8KKwlwbGxtcjAgPSBtZmRjciAoQ1BDMF9QTExNUjApOworCXBsbG1yMSA9IG1mZGNyIChDUEMwX1BMTE1SMSk7CisKKwkvKgorCSAqIERldGVybWluZSBmb3J3YXJkIGRpdmlkZXIgQQorCSAqLworCXN5c0luZm8tPnBsbEZ3ZERpdiA9IDggLSAoKHBsbG1yMSAmIFBMTE1SMV9GV0RWQV9NQVNLKSA+PiAxNik7CisKKwkvKgorCSAqIERldGVybWluZSBmb3J3YXJkIGRpdmlkZXIgQiAoc2hvdWxkIGJlIGVxdWFsIHRvIEEpCisJICovCisJc3lzSW5mby0+cGxsRndkRGl2QiA9IDggLSAoKHBsbG1yMSAmIFBMTE1SMV9GV0RWQl9NQVNLKSA+PiAxMik7CisKKwkvKgorCSAqIERldGVybWluZSBGQktfRElWLgorCSAqLworCXN5c0luZm8tPnBsbEZia0RpdiA9ICgocGxsbXIxICYgUExMTVIxX0ZCTVVMX01BU0spID4+IDIwKTsKKwlpZiAoc3lzSW5mby0+cGxsRmJrRGl2ID09IDApCisJCXN5c0luZm8tPnBsbEZia0RpdiA9IDE2OworCisJLyoKKwkgKiBEZXRlcm1pbmUgUExCX0RJVi4KKwkgKi8KKwlzeXNJbmZvLT5wbGxQbGJEaXYgPSAoKHBsbG1yMCAmIFBMTE1SMF9DUFVfVE9fUExCX01BU0spID4+IDE2KSArIDE7CisKKwkvKgorCSAqIERldGVybWluZSBQQ0lfRElWLgorCSAqLworCXN5c0luZm8tPnBsbFBjaURpdiA9IChwbGxtcjAgJiBQTExNUjBfUENJX1RPX1BMQl9NQVNLKSArIDE7CisKKwkvKgorCSAqIERldGVybWluZSBFWFRCVVNfRElWLgorCSAqLworCXN5c0luZm8tPnBsbEV4dEJ1c0RpdiA9ICgocGxsbXIwICYgUExMTVIwX0VYQl9UT19QTEJfTUFTSykgPj4gOCkgKyAyOworCisJLyoKKwkgKiBEZXRlcm1pbmUgT1BCX0RJVi4KKwkgKi8KKwlzeXNJbmZvLT5wbGxPcGJEaXYgPSAoKHBsbG1yMCAmIFBMTE1SMF9PUEJfVE9fUExCX01BU0spID4+IDEyKSArIDE7CisKKwkvKgorCSAqIERldGVybWluZSB0aGUgTSBmYWN0b3IKKwkgKi8KKwltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogc3lzSW5mby0+cGxsRndkRGl2QjsKKworCS8qCisJICogRGV0ZXJtaW5lIFZDTyBjbG9jayBmcmVxdWVuY3kKKwkgKi8KKwlzeXNJbmZvLT5mcmVxVkNPSHogPSAoMTAwMDAwMDAwMDAwMExMICogKHVuc2lnbmVkIGxvbmcgbG9uZyltKSAvCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpc3lzQ2xrUGVyaW9kUHM7CisKKwkvKgorCSAqIERldGVybWluZSBDUFUgY2xvY2sgZnJlcXVlbmN5CisJICovCisJcGxsbXIwX2NjZHYgPSAoKHBsbG1yMCAmIFBMTE1SMF9DUFVfRElWX01BU0spID4+IDIwKSArIDE7CisJaWYgKHBsbG1yMSAmIFBMTE1SMV9TU0NTX01BU0spIHsKKwkJLyoKKwkJICogVGhpcyBpcyB0cnVlIGlmIEZXRFZBID09IEZXRFZCOgorCQkgKiBzeXNJbmZvLT5mcmVxUHJvY2Vzc29yID0gKENPTkZJR19TWVNfQ0xLX0ZSRVEgKiBzeXNJbmZvLT5wbGxGYmtEaXYpCisJCSAqCS8gcGxsbXIwX2NjZHY7CisJCSAqLworCQlzeXNJbmZvLT5mcmVxUHJvY2Vzc29yID0gKENPTkZJR19TWVNfQ0xLX0ZSRVEgKiBzeXNJbmZvLT5wbGxGYmtEaXYgKiBzeXNJbmZvLT5wbGxGd2REaXZCKQorCQkJLyBzeXNJbmZvLT5wbGxGd2REaXYgLyBwbGxtcjBfY2NkdjsKKwl9IGVsc2UgeworCQlzeXNJbmZvLT5mcmVxUHJvY2Vzc29yID0gQ09ORklHX1NZU19DTEtfRlJFUSAvIHBsbG1yMF9jY2R2OworCX0KKworCS8qCisJICogRGV0ZXJtaW5lIFBMQiBjbG9jayBmcmVxdWVuY3kKKwkgKi8KKwlzeXNJbmZvLT5mcmVxUExCID0gc3lzSW5mby0+ZnJlcVByb2Nlc3NvciAvIHN5c0luZm8tPnBsbFBsYkRpdjsKKworCXN5c0luZm8tPmZyZXFFQkMgPSBzeXNJbmZvLT5mcmVxUExCIC8gc3lzSW5mby0+cGxsRXh0QnVzRGl2OworCisJc3lzSW5mby0+ZnJlcU9QQiA9IHN5c0luZm8tPmZyZXFQTEIgLyBzeXNJbmZvLT5wbGxPcGJEaXY7CisKKwlzeXNJbmZvLT5mcmVxVUFSVCA9IHN5c0luZm8tPmZyZXFQcm9jZXNzb3IgKiBwbGxtcjBfY2NkdjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9QQ0lfZnJlcQorICogcmV0dXJuIFBDSSBidXMgZnJlcSBpbiBIegorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIGdldF9QQ0lfZnJlcSAodm9pZCkKK3sKKwl1bG9uZyB2YWw7CisJUFBDNHh4X1NZU19JTkZPIHN5c19pbmZvOworCisJZ2V0X3N5c19pbmZvICgmc3lzX2luZm8pOworCXZhbCA9IHN5c19pbmZvLmZyZXFQTEIgLyBzeXNfaW5mby5wbGxQY2lEaXY7CisJcmV0dXJuIHZhbDsKK30KKworI2VsaWYgZGVmaW5lZChDT05GSUdfNDA1RVopCit2b2lkIGdldF9zeXNfaW5mbyAoUFBDNHh4X1NZU19JTkZPICogc3lzSW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGNwcl9wbGxkOworCXVuc2lnbmVkIGxvbmcgY3ByX3BsbGM7CisJdW5zaWduZWQgbG9uZyBjcHJfcHJpbWFkOworCXVuc2lnbmVkIGxvbmcgc3lzQ2xrUGVyaW9kUHMgPSBPTkVfQklMTElPTiAvIChDT05GSUdfU1lTX0NMS19GUkVRLzEwMDApOworCXVuc2lnbmVkIGxvbmcgcHJpbWFkX2NwdWR2OworCXVuc2lnbmVkIGxvbmcgbTsKKwl1bnNpZ25lZCBsb25nIHBsbG91dGI7CisKKwkvKgorCSAqIFJlYWQgUExMIE1vZGUgcmVnaXN0ZXJzCisJICovCisJbWZjcHIoQ1BSMF9QTExELCBjcHJfcGxsZCk7CisJbWZjcHIoQ1BSMF9QTExDLCBjcHJfcGxsYyk7CisKKwkvKgorCSAqIERldGVybWluZSBmb3J3YXJkIGRpdmlkZXIgQQorCSAqLworCXN5c0luZm8tPnBsbEZ3ZERpdiA9ICgoY3ByX3BsbGQgJiBQTExEX0ZXRFZBX01BU0spID4+IDE2KTsKKworCS8qCisJICogRGV0ZXJtaW5lIGZvcndhcmQgZGl2aWRlciBCCisJICovCisJc3lzSW5mby0+cGxsRndkRGl2QiA9ICgoY3ByX3BsbGQgJiBQTExEX0ZXRFZCX01BU0spID4+IDgpOworCWlmIChzeXNJbmZvLT5wbGxGd2REaXZCID09IDApCisJCXN5c0luZm8tPnBsbEZ3ZERpdkIgPSA4OworCisJLyoKKwkgKiBEZXRlcm1pbmUgRkJLX0RJVi4KKwkgKi8KKwlzeXNJbmZvLT5wbGxGYmtEaXYgPSAoKGNwcl9wbGxkICYgUExMRF9GQkRWX01BU0spID4+IDI0KTsKKwlpZiAoc3lzSW5mby0+cGxsRmJrRGl2ID09IDApCisJCXN5c0luZm8tPnBsbEZia0RpdiA9IDI1NjsKKworCS8qCisJICogUmVhZCBDUFJfUFJJTUFEIHJlZ2lzdGVyCisJICovCisJbWZjcHIoQ1BDMF9QUklNQUQsIGNwcl9wcmltYWQpOworCisJLyoKKwkgKiBEZXRlcm1pbmUgUExCX0RJVi4KKwkgKi8KKwlzeXNJbmZvLT5wbGxQbGJEaXYgPSAoKGNwcl9wcmltYWQgJiBQUklNQURfUExCRFZfTUFTSykgPj4gMTYpOworCWlmIChzeXNJbmZvLT5wbGxQbGJEaXYgPT0gMCkKKwkJc3lzSW5mby0+cGxsUGxiRGl2ID0gMTY7CisKKwkvKgorCSAqIERldGVybWluZSBFWFRCVVNfRElWLgorCSAqLworCXN5c0luZm8tPnBsbEV4dEJ1c0RpdiA9IChjcHJfcHJpbWFkICYgUFJJTUFEX0VCQ0RWX01BU0spOworCWlmIChzeXNJbmZvLT5wbGxFeHRCdXNEaXYgPT0gMCkKKwkJc3lzSW5mby0+cGxsRXh0QnVzRGl2ID0gMTY7CisKKwkvKgorCSAqIERldGVybWluZSBPUEJfRElWLgorCSAqLworCXN5c0luZm8tPnBsbE9wYkRpdiA9ICgoY3ByX3ByaW1hZCAmIFBSSU1BRF9PUEJEVl9NQVNLKSA+PiA4KTsKKwlpZiAoc3lzSW5mby0+cGxsT3BiRGl2ID09IDApCisJCXN5c0luZm8tPnBsbE9wYkRpdiA9IDE2OworCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIE0gZmFjdG9yCisJICovCisJaWYgKGNwcl9wbGxjICYgUExMQ19TUkNfTUFTSykKKwkJbSA9IHN5c0luZm8tPnBsbEZia0RpdiAqIHN5c0luZm8tPnBsbEZ3ZERpdkI7CisJZWxzZQorCQltID0gc3lzSW5mby0+cGxsRmJrRGl2ICogc3lzSW5mby0+cGxsRndkRGl2OworCisJLyoKKwkgKiBEZXRlcm1pbmUgVkNPIGNsb2NrIGZyZXF1ZW5jeQorCSAqLworCXN5c0luZm8tPmZyZXFWQ09IeiA9ICgxMDAwMDAwMDAwMDAwTEwgKiAodW5zaWduZWQgbG9uZyBsb25nKW0pIC8KKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylzeXNDbGtQZXJpb2RQczsKKworCS8qCisJICogRGV0ZXJtaW5lIENQVSBjbG9jayBmcmVxdWVuY3kKKwkgKi8KKwlwcmltYWRfY3B1ZHYgPSAoKGNwcl9wcmltYWQgJiBQUklNQURfQ1BVRFZfTUFTSykgPj4gMjQpOworCWlmIChwcmltYWRfY3B1ZHYgPT0gMCkKKwkJcHJpbWFkX2NwdWR2ID0gMTY7CisKKwlzeXNJbmZvLT5mcmVxUHJvY2Vzc29yID0gKENPTkZJR19TWVNfQ0xLX0ZSRVEgKiBtKSAvCisJCXN5c0luZm8tPnBsbEZ3ZERpdiAvIHByaW1hZF9jcHVkdjsKKworCS8qCisJICogRGV0ZXJtaW5lIFBMQiBjbG9jayBmcmVxdWVuY3kKKwkgKi8KKwlzeXNJbmZvLT5mcmVxUExCID0gKENPTkZJR19TWVNfQ0xLX0ZSRVEgKiBtKSAvCisJCXN5c0luZm8tPnBsbEZ3ZERpdiAvIHN5c0luZm8tPnBsbFBsYkRpdjsKKworCXN5c0luZm8tPmZyZXFPUEIgPSAoQ09ORklHX1NZU19DTEtfRlJFUSAqIHN5c0luZm8tPnBsbEZia0RpdikgLworCQlzeXNJbmZvLT5wbGxPcGJEaXY7CisKKwlzeXNJbmZvLT5mcmVxRUJDID0gKENPTkZJR19TWVNfQ0xLX0ZSRVEgKiBzeXNJbmZvLT5wbGxGYmtEaXYpIC8KKwkJc3lzSW5mby0+cGxsRXh0QnVzRGl2OworCisJcGxsb3V0YiA9ICgoQ09ORklHX1NZU19DTEtfRlJFUSAqICgoY3ByX3BsbGMgJiBQTExDX1NSQ19NQVNLKSA/CisJCXN5c0luZm8tPnBsbEZ3ZERpdkIgOiBzeXNJbmZvLT5wbGxGd2REaXYpICogc3lzSW5mby0+cGxsRmJrRGl2KSAvCisJCXN5c0luZm8tPnBsbEZ3ZERpdkIpOworCXN5c0luZm8tPmZyZXFVQVJUID0gcGxsb3V0YjsKK30KKworI2VsaWYgZGVmaW5lZChDT05GSUdfNDA1RVgpCisKKy8qCisgKiBUT0RPOiBXZSBuZWVkIHRvIGdldCB0aGUgQ1BSIHJlZ2lzdGVycyBhbmQgY2FsY3VsYXRlIHRoZXNlIHZhbHVlcyBjb3JyZWN0bHkhISEhCisgKiAgIFdlIG5lZWQgdGhlIHNwZWNzISEhIQorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBnZXRfZmJkdih1bnNpZ25lZCBjaGFyIGluZGV4KQoreworCXVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKwkvKiBUaGlzIGlzIHRhYmxlIHNob3VsZCBiZSAyNTYgYnl0ZXMuCisJICogT25seSB0YWtlIGZpcnN0IDUyIHZhbHVlcy4KKwkgKi8KKwl1bnNpZ25lZCBjaGFyIGZiZHZfdGJbXSA9IHsKKwkJMHgwMCwgMHhmZiwgMHg3ZiwgMHhmZCwKKwkJMHg3YSwgMHhmNSwgMHg2YSwgMHhkNSwKKwkJMHgyYSwgMHhkNCwgMHgyOSwgMHhkMywKKwkJMHgyNiwgMHhjYywgMHgxOSwgMHhiMywKKwkJMHg2NywgMHhjZSwgMHgxZCwgMHhiYiwKKwkJMHg3NywgMHhlZSwgMHg1ZCwgMHhiYSwKKwkJMHg3NCwgMHhlOSwgMHg1MiwgMHhhNSwKKwkJMHg0YiwgMHg5NiwgMHgyYywgMHhkOCwKKwkJMHgzMSwgMHhlMywgMHg0NiwgMHg4ZCwKKwkJMHgxYiwgMHhiNywgMHg2ZiwgMHhkZSwKKwkJMHgzZCwgMHhmYiwgMHg3NiwgMHhlZCwKKwkJMHg1YSwgMHhiNSwgMHg2YiwgMHhkNiwKKwkJMHgyZCwgMHhkYiwgMHgzNiwgMHhlYywKKworCX07CisKKwlpZiAoKGluZGV4ICYgMHg3ZikgPT0gMCkKKwkJcmV0dXJuIDE7CisJd2hpbGUgKHJldCA8IHNpemVvZiAoZmJkdl90YikpIHsKKwkJaWYgKGZiZHZfdGJbcmV0XSA9PSBpbmRleCkKKwkJCWJyZWFrOworCQlyZXQrKzsKKwl9CisJcmV0Kys7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFBMTF9GQktfUExMX0xPQ0FMCTAKKyNkZWZpbmUgUExMX0ZCS19DUFUJCTEKKyNkZWZpbmUgUExMX0ZCS19QRVJDTEsJCTUKKwordm9pZCBnZXRfc3lzX2luZm8gKHN5c19pbmZvX3QgKiBzeXNJbmZvKQoreworCXVuc2lnbmVkIGxvbmcgc3lzQ2xrUGVyaW9kUHMgPSBPTkVfQklMTElPTiAvIChDT05GSUdfU1lTX0NMS19GUkVRIC8gMTAwMCk7CisJdW5zaWduZWQgbG9uZyBtID0gMTsKKwl1bnNpZ25lZCBpbnQgIHRtcDsKKwl1bnNpZ25lZCBjaGFyIGZ3ZHZhWzE2XSA9IHsKKwkJMSwgMiwgMTQsIDksIDQsIDExLCAxNiwgMTMsCisJCTEyLCA1LCA2LCAxNSwgMTAsIDcsIDgsIDMsCisJfTsKKwl1bnNpZ25lZCBjaGFyIHNlbCwgY3B1ZHYwLCBwbGIyeERpdjsKKworCW1mY3ByKENQUjBfUExMRCwgdG1wKTsKKworCS8qCisJICogRGV0ZXJtaW5lIGZvcndhcmQgZGl2aWRlciBBCisJICovCisJc3lzSW5mby0+cGxsRndkRGl2ID0gZndkdmFbKCh0bXAgPj4gMTYpICYgMHgwZildOwkvKiBGV0RWQSAqLworCisJLyoKKwkgKiBEZXRlcm1pbmUgRkJLX0RJVi4KKwkgKi8KKwlzeXNJbmZvLT5wbGxGYmtEaXYgPSBnZXRfZmJkdigoKHRtcCA+PiAyNCkgJiAweDBmZikpOyAvKiBGQkRWICovCisKKwkvKgorCSAqIERldGVybWluZSBQTEJEVjAKKwkgKi8KKwlzeXNJbmZvLT5wbGxQbGJEaXYgPSAyOworCisJLyoKKwkgKiBEZXRlcm1pbmUgUEVSRFYwCisJICovCisJbWZjcHIoQ1BSMF9QRVJELCB0bXApOworCXRtcCA9ICh0bXAgPj4gMjQpICYgMHgwMzsKKwlzeXNJbmZvLT5wbGxFeHRCdXNEaXYgPSAodG1wID09IDApID8gNCA6IHRtcDsKKworCS8qCisJICogRGV0ZXJtaW5lIE9QQkRWMAorCSAqLworCW1mY3ByKENQUjBfT1BCRDAsIHRtcCk7CisJdG1wID0gKHRtcCA+PiAyNCkgJiAweDAzOworCXN5c0luZm8tPnBsbE9wYkRpdiA9ICh0bXAgPT0gMCkgPyA0IDogdG1wOworCisJLyogRGV0ZXJtaW5lIFBMQjJYRFYwICovCisJbWZjcHIoQ1BSMF9QTEJELCB0bXApOworCXRtcCA9ICh0bXAgPj4gMTYpICYgMHgwNzsKKwlwbGIyeERpdiA9ICh0bXAgPT0gMCkgPyA4IDogdG1wOworCisJLyogRGV0ZXJtaW5lIENQVURWMCAqLworCW1mY3ByKENQUjBfQ1BVRCwgdG1wKTsKKwl0bXAgPSAodG1wID4+IDI0KSAmIDB4MDc7CisJY3B1ZHYwID0gKHRtcCA9PSAwKSA/IDggOiB0bXA7CisKKwkvKiBEZXRlcm1pbmUgU0VMKDU6NykgaW4gQ1BSMF9QTExDICovCisJbWZjcHIoQ1BSMF9QTExDLCB0bXApOworCXNlbCA9ICh0bXAgPj4gMjQpICYgMHgwNzsKKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBNIGZhY3RvcgorCSAqIFBMTCBsb2NhbDogTSA9IEZCRFYKKwkgKiBDUFUgY2xvY2s6IE0gPSBGQkRWICogRldEVkEgKiBDUFVEVjAKKwkgKiBQZXJDbGsJOiBNID0gRkJEViAqIEZXRFZBICogUExCMlhEVjAgKiBQTEJEVjAoMikgKiBPUEJEVjAgKiBQRVJEVjAKKwkgKgorCSAqLworCXN3aXRjaCAoc2VsKSB7CisJY2FzZSBQTExfRkJLX0NQVToKKwkJbSA9IHN5c0luZm8tPnBsbEZ3ZERpdiAqIGNwdWR2MDsKKwkJYnJlYWs7CisJY2FzZSBQTExfRkJLX1BFUkNMSzoKKwkJbSA9IHN5c0luZm8tPnBsbEZ3ZERpdiAqIHBsYjJ4RGl2ICogMgorCQkJKiBzeXNJbmZvLT5wbGxPcGJEaXYgKiBzeXNJbmZvLT5wbGxFeHRCdXNEaXY7CisJCWJyZWFrOworCWNhc2UgUExMX0ZCS19QTExfTE9DQUw6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiJXMgdW5rbm93biBtXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisKKwl9CisJbSAqPSBzeXNJbmZvLT5wbGxGYmtEaXY7CisKKwkvKgorCSAqIERldGVybWluZSBWQ08gY2xvY2sgZnJlcXVlbmN5CisJICovCisJc3lzSW5mby0+ZnJlcVZDT0h6ID0gKDEwMDAwMDAwMDAwMDBMTCAqICh1bnNpZ25lZCBsb25nIGxvbmcpbSkgLworCQkodW5zaWduZWQgbG9uZyBsb25nKXN5c0Nsa1BlcmlvZFBzOworCisJLyoKKwkgKiBEZXRlcm1pbmUgQ1BVIGNsb2NrIGZyZXF1ZW5jeQorCSAqLworCXN5c0luZm8tPmZyZXFQcm9jZXNzb3IgPSBzeXNJbmZvLT5mcmVxVkNPSHogLyAoc3lzSW5mby0+cGxsRndkRGl2ICogY3B1ZHYwKTsKKworCS8qCisJICogRGV0ZXJtaW5lIFBMQiBjbG9jayBmcmVxdWVuY3ksIGRkcjF4IHNob3VsZCBiZSB0aGUgc2FtZQorCSAqLworCXN5c0luZm8tPmZyZXFQTEIgPSBzeXNJbmZvLT5mcmVxVkNPSHogLyAoc3lzSW5mby0+cGxsRndkRGl2ICogcGxiMnhEaXYgKiAyKTsKKwlzeXNJbmZvLT5mcmVxT1BCID0gc3lzSW5mby0+ZnJlcVBMQi9zeXNJbmZvLT5wbGxPcGJEaXY7CisJc3lzSW5mby0+ZnJlcUREUiA9IHN5c0luZm8tPmZyZXFQTEI7CisJc3lzSW5mby0+ZnJlcUVCQyA9IHN5c0luZm8tPmZyZXFPUEIgLyBzeXNJbmZvLT5wbGxFeHRCdXNEaXY7CisJc3lzSW5mby0+ZnJlcVVBUlQgPSBzeXNJbmZvLT5mcmVxUExCOworfQorCisjZW5kaWYKKworaW50IGdldF9jbG9ja3MgKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfNDA1R1ApIHx8IGRlZmluZWQoQ09ORklHXzQwNUNSKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDA1RVApIHx8IGRlZmluZWQoQ09ORklHXzQwNUVaKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDA1RVgpIHx8IGRlZmluZWQoQ09ORklHXzQwNSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MCkKKwlzeXNfaW5mb190IHN5c19pbmZvOworCisJZ2V0X3N5c19pbmZvICgmc3lzX2luZm8pOworCWdkLT5jcHVfY2xrID0gc3lzX2luZm8uZnJlcVByb2Nlc3NvcjsKKwlnZC0+YnVzX2NsayA9IHN5c19pbmZvLmZyZXFQTEI7CisKKyNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR180MDVHUCkgfHwgZGVmaW5lZChDT05GSUdfNDA1Q1IpICovCisKKyNpZmRlZiBDT05GSUdfSU9QNDgwCisJZ2QtPmNwdV9jbGsgPSA2NjAwMDAwMDsKKwlnZC0+YnVzX2NsayA9IDY2MDAwMDAwOworI2VuZGlmCisJcmV0dXJuICgwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9idXNfZnJlcQorICogcmV0dXJuIFBMQiBidXMgZnJlcSBpbiBIegorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vsb25nIGdldF9idXNfZnJlcSAodWxvbmcgZHVtbXkpCit7CisJdWxvbmcgdmFsOworCisjaWYgZGVmaW5lZChDT05GSUdfNDA1R1ApIHx8IGRlZmluZWQoQ09ORklHXzQwNUNSKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDA1RVApIHx8IGRlZmluZWQoQ09ORklHXzQwNUVaKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDA1RVgpIHx8IGRlZmluZWQoQ09ORklHXzQwNSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MCkKKwlzeXNfaW5mb190IHN5c19pbmZvOworCisJZ2V0X3N5c19pbmZvICgmc3lzX2luZm8pOworCXZhbCA9IHN5c19pbmZvLmZyZXFQTEI7CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0lPUDQ4MCkKKworCXZhbCA9IDY2OworCisjZWxzZQorIyBlcnJvciBnZXRfYnVzX2ZyZXEoKSBub3QgaW1wbGVtZW50ZWQKKyNlbmRpZgorCisJcmV0dXJuIHZhbDsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19JT1A0ODApCit1bG9uZyBnZXRfT1BCX2ZyZXEgKHZvaWQpCit7CisJUFBDNHh4X1NZU19JTkZPIHN5c19pbmZvOworCisJZ2V0X3N5c19pbmZvICgmc3lzX2luZm8pOworCisJcmV0dXJuIHN5c19pbmZvLmZyZXFPUEI7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3N0YXJ0LlMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzlkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC9zdGFydC5TCkBAIC0wLDAgKzEsMjE3MCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTgJRGFuIE1hbGVrIDxkbWFsZWtAamxjLm5ldD4KKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkJTWFnbnVzIERhbW0gPGtpZXJheXBjMDEucC55LmtpZS5lcmEuZXJpY3Nzb24uc2U+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorICogIENvcHlyaWdodCAoQykgMjAwNyBTdGVmYW4gUm9lc2UgPHNyQGRlbnguZGU+LCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IE51b3ZhdGlvbiBTeXN0ZW0gRGVzaWducywgTExDCisgKiAgICBHcmFudCBFcmlja3NvbiA8Z2VyaWNrc29uQG51b3ZhdGlvbnMuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgVGhpcyBzb3VyY2UgY29kZSBpcyBkdWFsLWxpY2Vuc2VkLiAgWW91IG1heSB1c2UgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIG9yIHVuZGVyIHRoZSBsaWNlbnNlIGJlbG93LgorICoKKyAqCSBUaGlzIHNvdXJjZSBjb2RlIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIHRvIHlvdSBieSBJQk0gb24gYW4gQVMtSVMKKyAqCSBiYXNpcy4JIEFueW9uZSByZWNlaXZpbmcgdGhpcyBzb3VyY2UgaXMgbGljZW5zZWQgdW5kZXIgSUJNCisgKgkgY29weXJpZ2h0cyB0byB1c2UgaXQgaW4gYW55IHdheSBoZSBvciBzaGUgZGVlbXMgZml0LCBpbmNsdWRpbmcKKyAqCSBjb3B5aW5nIGl0LCBtb2RpZnlpbmcgaXQsIGNvbXBpbGluZyBpdCwgYW5kIHJlZGlzdHJpYnV0aW5nIGl0IGVpdGhlcgorICoJIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLgkgTm8gbGljZW5zZSB1bmRlciBJQk0gcGF0ZW50cyBvcgorICoJIHBhdGVudCBhcHBsaWNhdGlvbnMgaXMgdG8gYmUgaW1wbGllZCBieSB0aGUgY29weXJpZ2h0IGxpY2Vuc2UuCisgKgorICoJIEFueSB1c2VyIG9mIHRoaXMgc29mdHdhcmUgc2hvdWxkIHVuZGVyc3RhbmQgdGhhdCBJQk0gY2Fubm90IHByb3ZpZGUKKyAqCSB0ZWNobmljYWwgc3VwcG9ydCBmb3IgdGhpcyBzb2Z0d2FyZSBhbmQgd2lsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yCisgKgkgYW55IGNvbnNlcXVlbmNlcyByZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICoJIEFueSBwZXJzb24gd2hvIHRyYW5zZmVycyB0aGlzIHNvdXJjZSBjb2RlIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsKKyAqCSBtdXN0IGluY2x1ZGUgdGhlIElCTSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIHBhcmFncmFwaCwgYW5kIHRoZQorICoJIHByZWNlZGluZyB0d28gcGFyYWdyYXBocyBpbiB0aGUgdHJhbnNmZXJyZWQgc29mdHdhcmUuCisgKgorICoJIENPUFlSSUdIVCAgIEkgQiBNICAgQ09SUE9SQVRJT04gMTk5NQorICoJIExJQ0VOU0VEIE1BVEVSSUFMICAtICBQUk9HUkFNIFBST1BFUlRZIE9GIEkgQiBNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiAgVS1Cb290IC0gU3RhcnR1cCBDb2RlIGZvciBBTUNDIDR4eCBQb3dlclBDIGJhc2VkIEVtYmVkZGVkIEJvYXJkcworICoKKyAqCisgKiAgVGhlIHByb2Nlc3NvciBzdGFydHMgYXQgMHhmZmZmZmZmYyBhbmQgdGhlIGNvZGUgaXMgZXhlY3V0ZWQKKyAqICBmcm9tIGZsYXNoL3JvbS4KKyAqICBpbiBtZW1vcnksIGJ1dCBhcyBsb25nIHdlIGRvbid0IGp1bXAgYXJvdW5kIGJlZm9yZSByZWxvY2F0aW5nLgorICogIGJvYXJkX2luaXQgbGllcyBhdCBhIHF1aXRlIGhpZ2ggYWRkcmVzcyBhbmQgd2hlbiB0aGUgY3B1IGhhcworICogIGp1bXBlZCB0aGVyZSwgZXZlcnl0aGluZyBpcyBvay4KKyAqICBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGNwdSBnaXZlcyB0aGUgRkxBU0ggKENTMCkgdGhlIHdob2xlCisgKiAgYWRkcmVzcyBzcGFjZSBhdCBzdGFydHVwLCBhbmQgYm9hcmRfaW5pdCBsaWVzIGFzIGEgZWNobyBvZgorICogIHRoZSBmbGFzaCBzb21ld2hlcmUgdXAgdGhlcmUgaW4gdGhlIG1lbW9yeW1hcC4KKyAqCisgKiAgYm9hcmRfaW5pdCB3aWxsIGNoYW5nZSBDUzAgdG8gYmUgcG9zaXRpb25lZCBhdCB0aGUgY29ycmVjdAorICogIGFkZHJlc3MgYW5kIChzKWRyYW0gd2lsbCBiZSBwb3NpdGlvbmVkIGF0IGFkZHJlc3MgMAorICovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8dGltZXN0YW1wLmg+CisjaW5jbHVkZSA8dmVyc2lvbi5oPgorCisjZGVmaW5lIF9MSU5VWF9DT05GSUdfSCAxCS8qIGF2b2lkIHJlYWRpbmcgTGludXggYXV0b2NvbmYuaCBmaWxlCSovCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKyNpbmNsdWRlIDxhc20vcHBjNHh4LWlzcmFtLmg+CisKKyNpZm5kZWYJIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUJIENPTkZJR19JREVOVF9TVFJJTkcgIiIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUworIyBpZiAoQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUyA9PSAwKQorIyAgZGVmaW5lIFBCeEFQIFBCMUFQCisjICBkZWZpbmUgUEJ4Q1IgUEIwQ1IKKyMgIGlmIChkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCMEFQKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCMENSKSkKKyMgICBkZWZpbmUgUEJ4QVBfVkFMIENPTkZJR19TWVNfRUJDX1BCMEFQCisjICAgZGVmaW5lIFBCeENSX1ZBTCBDT05GSUdfU1lTX0VCQ19QQjBDUgorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWYgKENPTkZJR19TWVNfSU5JVF9EQ0FDSEVfQ1MgPT0gMSkKKyMgIGRlZmluZSBQQnhBUCBQQjFBUAorIyAgZGVmaW5lIFBCeENSIFBCMUNSCisjICBpZiAoZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjFBUCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjFDUikpCisjICAgZGVmaW5lIFBCeEFQX1ZBTCBDT05GSUdfU1lTX0VCQ19QQjFBUAorIyAgIGRlZmluZSBQQnhDUl9WQUwgQ09ORklHX1NZU19FQkNfUEIxQ1IKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmIChDT05GSUdfU1lTX0lOSVRfRENBQ0hFX0NTID09IDIpCisjICBkZWZpbmUgUEJ4QVAgUEIyQVAKKyMgIGRlZmluZSBQQnhDUiBQQjJDUgorIyAgaWYgKGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEIyQVApICYmIGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEIyQ1IpKQorIyAgIGRlZmluZSBQQnhBUF9WQUwgQ09ORklHX1NZU19FQkNfUEIyQVAKKyMgICBkZWZpbmUgUEJ4Q1JfVkFMIENPTkZJR19TWVNfRUJDX1BCMkNSCisjICBlbmRpZgorIyBlbmRpZgorIyBpZiAoQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUyA9PSAzKQorIyAgZGVmaW5lIFBCeEFQIFBCM0FQCisjICBkZWZpbmUgUEJ4Q1IgUEIzQ1IKKyMgIGlmIChkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCM0FQKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCM0NSKSkKKyMgICBkZWZpbmUgUEJ4QVBfVkFMIENPTkZJR19TWVNfRUJDX1BCM0FQCisjICAgZGVmaW5lIFBCeENSX1ZBTCBDT05GSUdfU1lTX0VCQ19QQjNDUgorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWYgKENPTkZJR19TWVNfSU5JVF9EQ0FDSEVfQ1MgPT0gNCkKKyMgIGRlZmluZSBQQnhBUCBQQjRBUAorIyAgZGVmaW5lIFBCeENSIFBCNENSCisjICBpZiAoZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjRBUCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjRDUikpCisjICAgZGVmaW5lIFBCeEFQX1ZBTCBDT05GSUdfU1lTX0VCQ19QQjRBUAorIyAgIGRlZmluZSBQQnhDUl9WQUwgQ09ORklHX1NZU19FQkNfUEI0Q1IKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmIChDT05GSUdfU1lTX0lOSVRfRENBQ0hFX0NTID09IDUpCisjICBkZWZpbmUgUEJ4QVAgUEI1QVAKKyMgIGRlZmluZSBQQnhDUiBQQjVDUgorIyAgaWYgKGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEI1QVApICYmIGRlZmluZWQoQ09ORklHX1NZU19FQkNfUEI1Q1IpKQorIyAgIGRlZmluZSBQQnhBUF9WQUwgQ09ORklHX1NZU19FQkNfUEI1QVAKKyMgICBkZWZpbmUgUEJ4Q1JfVkFMIENPTkZJR19TWVNfRUJDX1BCNUNSCisjICBlbmRpZgorIyBlbmRpZgorIyBpZiAoQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUyA9PSA2KQorIyAgZGVmaW5lIFBCeEFQIFBCNkFQCisjICBkZWZpbmUgUEJ4Q1IgUEI2Q1IKKyMgIGlmIChkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCNkFQKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCNkNSKSkKKyMgICBkZWZpbmUgUEJ4QVBfVkFMIENPTkZJR19TWVNfRUJDX1BCNkFQCisjICAgZGVmaW5lIFBCeENSX1ZBTCBDT05GSUdfU1lTX0VCQ19QQjZDUgorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWYgKENPTkZJR19TWVNfSU5JVF9EQ0FDSEVfQ1MgPT0gNykKKyMgIGRlZmluZSBQQnhBUCBQQjdBUAorIyAgZGVmaW5lIFBCeENSIFBCN0NSCisjICBpZiAoZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjdBUCkgJiYgZGVmaW5lZChDT05GSUdfU1lTX0VCQ19QQjdDUikpCisjICAgZGVmaW5lIFBCeEFQX1ZBTCBDT05GSUdfU1lTX0VCQ19QQjdBUAorIyAgIGRlZmluZSBQQnhDUl9WQUwgQ09ORklHX1NZU19FQkNfUEI3Q1IKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmbmRlZiBQQnhBUF9WQUwKKyMgIGRlZmluZSBQQnhBUF9WQUwJMAorIyBlbmRpZgorIyBpZm5kZWYgUEJ4Q1JfVkFMCisjICBkZWZpbmUgUEJ4Q1JfVkFMCTAKKyMgZW5kaWYKKy8qCisgKiBNZW1vcnkgQmFuayB4IChub3RoaW5nbmVzcykgaW5pdGlhbGl6YXRpb24gQ09ORklHX1NZU19JTklUX1JBTV9BRERSICsgNjQgTWlCCisgKiB1c2VkIGFzIHRlbXBvcmFyeSBzdGFjayBwb2ludGVyIGZvciB0aGUgcHJpbW9yZGlhbCBzdGFjaworICovCisjIGlmbmRlZiBDT05GSUdfU1lTX0lOSVRfRENBQ0hFX1BCeEFSCisjICBkZWZpbmUgQ09ORklHX1NZU19JTklUX0RDQUNIRV9QQnhBUgkoRUJDX0JYQVBfQk1FX0RJU0FCTEVECQkJfCBcCisJCQkJIEVCQ19CWEFQX1RXVF9FTkNPREUoNykJCQl8IFwKKwkJCQkgRUJDX0JYQVBfQkNFX0RJU0FCTEUJCQl8IFwKKwkJCQkgRUJDX0JYQVBfQkNUXzJUUkFOUwkJCXwgXAorCQkJCSBFQkNfQlhBUF9DU05fRU5DT0RFKDApCQkJfCBcCisJCQkJIEVCQ19CWEFQX09FTl9FTkNPREUoMCkJCQl8IFwKKwkJCQkgRUJDX0JYQVBfV0JOX0VOQ09ERSgwKQkJCXwgXAorCQkJCSBFQkNfQlhBUF9XQkZfRU5DT0RFKDApCQkJfCBcCisJCQkJIEVCQ19CWEFQX1RIX0VOQ09ERSgyKQkJCXwgXAorCQkJCSBFQkNfQlhBUF9SRV9ESVNBQkxFRAkJCXwgXAorCQkJCSBFQkNfQlhBUF9TT1JfTk9OREVMQVlFRAkJfCBcCisJCQkJIEVCQ19CWEFQX0JFTV9XUklURU9OTFkJCQl8IFwKKwkJCQkgRUJDX0JYQVBfUEVOX0RJU0FCTEVEKQorIyBlbmRpZiAvKiBDT05GSUdfU1lTX0lOSVRfRENBQ0hFX1BCeEFSICovCisjIGlmbmRlZiBDT05GSUdfU1lTX0lOSVRfRENBQ0hFX1BCeENSCisjICBkZWZpbmUgQ09ORklHX1NZU19JTklUX0RDQUNIRV9QQnhDUgkoRUJDX0JYQ1JfQkFTX0VOQ09ERShDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIpCXwgXAorCQkJCSBFQkNfQlhDUl9CU182NE1CCQkJfCBcCisJCQkJIEVCQ19CWENSX0JVX1JXCQkJCXwgXAorCQkJCSBFQkNfQlhDUl9CV18xNkJJVCkKKyMgZW5kaWYgLyogQ09ORklHX1NZU19JTklUX0RDQUNIRV9QQnhDUiAqLworIyBpZm5kZWYgQ09ORklHX1NZU19JTklUX1JBTV9QQVRURVJOCisjICBkZWZpbmUgQ09ORklHX1NZU19JTklUX1JBTV9QQVRURVJOCTB4REVBRERFQUQKKyMgZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfU1lTX0lOSVRfRENBQ0hFX0NTICovCisKKyNpZiAoZGVmaW5lZChDT05GSUdfU1lTX0lOSVRfUkFNX0RDQUNIRSkgJiYgKENPTkZJR19TWVNfSU5JVF9SQU1fRU5EID4gKDQgPDwgMTApKSkKKyNlcnJvciBPbmx5IDRrIG9mIGluaXQtcmFtIGlzIHN1cHBvcnRlZCAtIHBsZWFzZSBhZGp1c3QgQ09ORklHX1NZU19JTklUX1JBTV9FTkQhCisjZW5kaWYKKworLyoKKyAqIFVubGVzcyBvdGhlcndpc2Ugb3ZlcnJpZGVuLCBlbmFibGUgdHdvIDEyOE1CIGNhY2hhYmxlIGluc3RydWN0aW9uIHJlZ2lvbnMKKyAqIGF0IENPTkZJR19TWVNfU0RSQU1fQkFTRSBhbmQgYW5vdGhlciAxMjhNQiBjYWNoZWFibGUgaW5zdHJ1Y3Rpb24gcmVnaW9uIGNvdmVyaW5nCisgKiBOT1IgZmxhc2ggYXQgQ09ORklHX1NZU19GTEFTSF9CQVNFLiBEaXNhYmxlIGFsbCBjYWNoZWFibGUgZGF0YSByZWdpb25zLgorICovCisjaWYgIWRlZmluZWQoQ09ORklHX1NZU19GTEFTSF9CQVNFKQorLyogSWYgbm90IGFscmVhZHkgZGVmaW5lZCwgc2V0IGl0IHRvIHRoZSAibGFzdCIgMTI4TUJ5dGUgcmVnaW9uICovCisjIGRlZmluZSBDT05GSUdfU1lTX0ZMQVNIX0JBU0UJCTB4ZjgwMDAwMDAKKyNlbmRpZgorI2lmICFkZWZpbmVkKENPTkZJR19TWVNfSUNBQ0hFX1NBQ1JfVkFMVUUpCisjIGRlZmluZSBDT05GSUdfU1lTX0lDQUNIRV9TQUNSX1ZBTFVFCQlcCisJCShQUENfMTI4TUJfU0FDUl9WQUxVRShDT05GSUdfU1lTX1NEUkFNX0JBU0UgKyAoICAwIDw8IDIwKSkgfCBcCisJCSBQUENfMTI4TUJfU0FDUl9WQUxVRShDT05GSUdfU1lTX1NEUkFNX0JBU0UgKyAoMTI4IDw8IDIwKSkgfCBcCisJCSBQUENfMTI4TUJfU0FDUl9WQUxVRShDT05GSUdfU1lTX0ZMQVNIX0JBU0UpKQorI2VuZGlmIC8qICFkZWZpbmVkKENPTkZJR19TWVNfSUNBQ0hFX1NBQ1JfVkFMVUUpICovCisKKyNpZiAhZGVmaW5lZChDT05GSUdfU1lTX0RDQUNIRV9TQUNSX1ZBTFVFKQorIyBkZWZpbmUgQ09ORklHX1NZU19EQ0FDSEVfU0FDUl9WQUxVRQkJXAorCQkoMHgwMDAwMDAwMCkKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfU1lTX0RDQUNIRV9TQUNSX1ZBTFVFKSAqLworCisjZGVmaW5lIGZ1bmN0aW9uX3Byb2xvZyhmdW5jX25hbWUpCS50ZXh0OyBcCisJCQkJCS5hbGlnbiAyOyBcCisJCQkJCS5nbG9ibCBmdW5jX25hbWU7IFwKKwkJCQkJZnVuY19uYW1lOgorI2RlZmluZSBmdW5jdGlvbl9lcGlsb2coZnVuY19uYW1lKQkudHlwZSBmdW5jX25hbWUsQGZ1bmN0aW9uOyBcCisJCQkJCS5zaXplIGZ1bmNfbmFtZSwuLWZ1bmNfbmFtZQorCisvKiBXZSBkb24ndCB3YW50IHRoZSAgTU1VIHlldC4KKyovCisjdW5kZWYJTVNSX0tFUk5FTAorI2RlZmluZSBNU1JfS0VSTkVMICggTVNSX01FICApCS8qIE1hY2hpbmUgQ2hlY2sgKi8KKworCisJLmV4dGVybiBleHRfYnVzX2NudGxyX2luaXQKKyNpZmRlZiBDT05GSUdfTkFORF9VX0JPT1QKKwkuZXh0ZXJuIHJlY29uZmlnX3RsYjAKKyNlbmRpZgorCisvKgorICogU2V0IHVwIEdPVDogR2xvYmFsIE9mZnNldCBUYWJsZQorICoKKyAqIFVzZSByMTIgdG8gYWNjZXNzIHRoZSBHT1QKKyAqLworI2lmICFkZWZpbmVkKENPTkZJR19OQU5EX1NQTCkKKwlTVEFSVF9HT1QKKwlHT1RfRU5UUlkoX0dPVDJfVEFCTEVfKQorCUdPVF9FTlRSWShfRklYVVBfVEFCTEVfKQorCisJR09UX0VOVFJZKF9zdGFydCkKKwlHT1RfRU5UUlkoX3N0YXJ0X29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKF9lbmRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkodHJhbnNmZXJfdG9faGFuZGxlcikKKworCUdPVF9FTlRSWShfX2luaXRfZW5kKQorCUdPVF9FTlRSWShfZW5kKQorCUdPVF9FTlRSWShfX2Jzc19zdGFydCkKKwlFTkRfR09UCisjZW5kaWYgLyogQ09ORklHX05BTkRfU1BMICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19OQU5EX1VfQk9PVCkgJiYgIWRlZmluZWQoQ09ORklHX05BTkRfU1BMKQorCS8qCisJICogTkFORCBVLUJvb3QgaW1hZ2UgaXMgc3RhcnRlZCBmcm9tIG9mZnNldCAwCisJICovCisJLnRleHQKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisJYmwJcmVjb25maWdfdGxiMAorI2VuZGlmCisJR0VUX0dPVAorCWJsCWNwdV9pbml0X2YJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlCSAgIChmcm9tIEZsYXNoKSAqLworCWJsCWJvYXJkX2luaXRfZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfUkFNQk9PVCkKKwkvKgorCSAqIDR4eCBSQU0tYm9vdGluZyBVLUJvb3QgaW1hZ2UgaXMgc3RhcnRlZCBmcm9tIG9mZnNldCAwCisJICovCisJLnRleHQKKwlibAlfc3RhcnRfNDQwCisjZW5kaWYKKworLyoKKyAqIDQ0MCBTdGFydHVwIC0tIG9uIHJlc2V0IG9ubHkgdGhlIHRvcCA0ayBvZiB0aGUgZWZmZWN0aXZlCisgKiBhZGRyZXNzIHNwYWNlIGlzIG1hcHBlZCBpbiBieSBhbiBlbnRyeSBpbiB0aGUgaW5zdHJ1Y3Rpb24KKyAqIGFuZCBkYXRhIHNoYWRvdyBUTEIuIFRoZSAuYm9vdHBnIHNlY3Rpb24gaXMgbG9jYXRlZCBpbiB0aGUKKyAqIHRvcCA0ayAmIGRvZXMgb25seSB3aGF0J3MgbmVjZXNzYXJ5IHRvIG1hcCBpbiB0aGUgdGhlIHJlc3QKKyAqIG9mIHRoZSBib290IHJvbS4gT25jZSB0aGUgYm9vdCByb20gaXMgbWFwcGVkIGluIHdlIGNhbgorICogcHJvY2VlZCB3aXRoIG5vcm1hbCBzdGFydHVwLgorICoKKyAqIE5PVEU6IENTMCBvbmx5IGNvdmVycyB0aGUgdG9wIDJNQiBvZiB0aGUgZWZmZWN0aXZlIGFkZHJlc3MKKyAqIHNwYWNlIGFmdGVyIHJlc2V0LgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisjaWYgIWRlZmluZWQoQ09ORklHX05BTkRfU1BMKQorICAgIC5zZWN0aW9uIC5ib290cGcsImF4IgorI2VuZGlmCisgICAgLmdsb2JsIF9zdGFydF80NDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworX3N0YXJ0XzQ0MDoKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCXwgNDQwRVBYIEJVUCBDaGFuZ2UgLSBIYXJkd2FyZSB0ZWFtIHJlcXVlc3QKKwkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQorCXN5bmMKKwlub3AKKwlub3AKKyNlbmRpZgorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8IENvcmUgYnVnIGZpeC4gIENsZWFyIHRoZSBlc3IKKwkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpCXIwLDAKKwltdHNwcglTUFJOX0VTUixyMAorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogQ2xlYXIgYW5kIHNldCB1cCBzb21lIHJlZ2lzdGVycy4gKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWljY2NpCXIwLHIwCQkvKiBOT1RFOiBvcGVyYW5kcyBub3QgdXNlZCBmb3IgNDQwICovCisJZGNjY2kJcjAscjAJCS8qIE5PVEU6IG9wZXJhbmRzIG5vdCB1c2VkIGZvciA0NDAgKi8KKwlzeW5jCisJbGkJcjAsMAorCW10c3ByCVNQUk5fU1JSMCxyMAorCW10c3ByCVNQUk5fU1JSMSxyMAorCW10c3ByCVNQUk5fQ1NSUjAscjAKKwltdHNwcglTUFJOX0NTUlIxLHIwCisJLyogTk9URTogNDQwR1ggYWRkcyBtYWNoaW5lIGNoZWNrIHN0YXR1cyByZWdzICovCisjaWYgZGVmaW5lZChDT05GSUdfNDQwKSAmJiAhZGVmaW5lZChDT05GSUdfNDQwR1ApCisJbXRzcHIJU1BSTl9NQ1NSUjAscjAKKwltdHNwcglTUFJOX01DU1JSMSxyMAorCW1mc3ByCXIxLFNQUk5fTUNTUgorCW10c3ByCVNQUk5fTUNTUixyMQorI2VuZGlmCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qIENDUjAgaW5pdCAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogRGlzYWJsZSBzdG9yZSBnYXRoZXJpbmcgJiBicm9hZGNhc3QsIGd1YXJhbnRlZSBpbnN0L2RhdGEKKwkqIGNhY2hlIGJsb2NrIHRvdWNoLCBmb3JjZSBsb2FkL3N0b3JlIGFsaWdubWVudAorCSogKHNlZSBlcnJhdGEgMS4xMjogNDQwXzMzKQorCSovCisJbGlzCXIxLDB4MDAzMAkvKiBzdG9yZSBnYXRoZXJpbmcgJiBicm9hZGNhc3QgZGlzYWJsZSAqLworCW9yaQlyMSxyMSwweDYwMDAJLyogY2FjaGUgdG91Y2ggKi8KKwltdHNwcglTUFJOX0NDUjAscjEKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogSW5pdGlhbGl6ZSBkZWJ1ZyAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbWZzcHIJcjEsU1BSTl9EQkNSMAorCWFuZGlzLglyMSwgcjEsIDB4ODAwMAkvKiB0ZXN0IERCQ1IwW0VETV0gYml0CQkJKi8KKwlibmUJc2tpcF9kZWJ1Z19pbml0CS8qIGlmIHNldCwgZG9uJ3QgY2xlYXIgZGVidWcgcmVnaXN0ZXIJKi8KKwltdHNwcglTUFJOX0RCQ1IwLHIwCisJbXRzcHIJU1BSTl9EQkNSMSxyMAorCW10c3ByCVNQUk5fREJDUjIscjAKKwltdHNwcglTUFJOX0lBQzEscjAKKwltdHNwcglTUFJOX0lBQzIscjAKKwltdHNwcglTUFJOX0lBQzMscjAKKwltdHNwcglTUFJOX0RBQzEscjAKKwltdHNwcglTUFJOX0RBQzIscjAKKwltdHNwcglTUFJOX0RWQzEscjAKKwltdHNwcglTUFJOX0RWQzIscjAKKworCW1mc3ByCXIxLFNQUk5fREJTUgorCW10c3ByCVNQUk5fREJTUixyMQkvKiBDbGVhciBhbGwgdmFsaWQgYml0cyAqLworc2tpcF9kZWJ1Z19pbml0OgorCisjaWYgZGVmaW5lZCAoQ09ORklHXzQ0MFNQRSkKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJfCBJbml0aWFsaXplIENvcmUgQ29uZmlndXJhdGlvbiBSZWcxLgorCXwgYS4gSUNEUEVJOiBSZWNvcmQgZXZlbiBwYXJpdHkuIE5vcm1hbCBvcGVyYXRpb24uCisJfCBiLiBJQ1RQRUk6IFJlY29yZCBldmVuIHBhcml0eS4gTm9ybWFsIG9wZXJhdGlvbi4KKwl8IGMuIERDVFBFSTogUmVjb3JkIGV2ZW4gcGFyaXR5LiBOb3JtYWwgb3BlcmF0aW9uLgorCXwgZC4gRENEUEVJOiBSZWNvcmQgZXZlbiBwYXJpdHkuIE5vcm1hbCBvcGVyYXRpb24uCisJfCBlLiBEQ1VQRUk6IFJlY29yZCBldmVuIHBhcml0eS4gTm9ybWFsIG9wZXJhdGlvbi4KKwl8IGYuIERDTVBFSTogUmVjb3JkIGV2ZW4gcGFyaXR5LiBOb3JtYWwgb3BlcmF0aW9uLgorCXwgZy4gRkNPTTogICBOb3JtYWwgb3BlcmF0aW9uCisJfCBoLiBNTVVQRUk6IFJlY29yZCBldmVuIHBhcml0eS4gTm9ybWFsIG9wZXJhdGlvbi4KKwl8IGkuIEZGRjogICAgRmx1c2ggb25seSBhcyBtdWNoIGRhdGEgYXMgbmVjZXNzYXJ5LgorCXwgai4gVENTOiAgICBUaW1lYmFzZSBpbmNyZW1lbnRzIGZyb20gQ1BVIGNsb2NrLgorCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGkJcjAsMAorCW10c3ByCVNQUk5fQ0NSMSwgcjAKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8IFJlc2V0IHRoZSB0aW1lYmFzZS4KKwl8IFRoZSBwcmV2aW91cyB3cml0ZSB0byBDQ1IxIHNldHMgdGhlIHRpbWViYXNlIHNvdXJjZS4KKwkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW10c3ByCVNQUk5fVEJXTCwgcjAKKwltdHNwcglTUFJOX1RCV1UsIHIwCisjZW5kaWYKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogU2V0dXAgaW50ZXJydXB0IHZlY3RvcnMgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW10c3ByCVNQUk5fSVZQUixyMAkJLyogVmVjdG9ycyBzdGFydCBhdCAweDAwMDBfMDAwMCAqLworCWxpCXIxLDB4MDEwMAorCW10c3ByCVNQUk5fSVZPUjAscjEJLyogQ3JpdGljYWwgaW5wdXQgKi8KKwlsaQlyMSwweDAyMDAKKwltdHNwcglTUFJOX0lWT1IxLHIxCS8qIE1hY2hpbmUgY2hlY2sgKi8KKwlsaQlyMSwweDAzMDAKKwltdHNwcglTUFJOX0lWT1IyLHIxCS8qIERhdGEgc3RvcmFnZSAqLworCWxpCXIxLDB4MDQwMAorCW10c3ByCVNQUk5fSVZPUjMscjEJLyogSW5zdHJ1Y3Rpb24gc3RvcmFnZSAqLworCWxpCXIxLDB4MDUwMAorCW10c3ByCVNQUk5fSVZPUjQscjEJLyogRXh0ZXJuYWwgaW50ZXJydXB0ICovCisJbGkJcjEsMHgwNjAwCisJbXRzcHIJU1BSTl9JVk9SNSxyMQkvKiBBbGlnbm1lbnQgKi8KKwlsaQlyMSwweDA3MDAKKwltdHNwcglTUFJOX0lWT1I2LHIxCS8qIFByb2dyYW0gY2hlY2sgKi8KKwlsaQlyMSwweDA4MDAKKwltdHNwcglTUFJOX0lWT1I3LHIxCS8qIEZsb2F0aW5nIHBvaW50IHVuYXZhaWxhYmxlICovCisJbGkJcjEsMHgwYzAwCisJbXRzcHIJU1BSTl9JVk9SOCxyMQkvKiBTeXN0ZW0gY2FsbCAqLworCWxpCXIxLDB4MGEwMAorCW10c3ByCVNQUk5fSVZPUjkscjEJLyogQXV4aWxpYXJ5IFByb2Nlc3NvciB1bmF2YWlsYWJsZSAqLworCWxpCXIxLDB4MDkwMAorCW10c3ByCVNQUk5fSVZPUjEwLHIxCS8qIERlY3JlbWVudGVyICovCisJbGkJcjEsMHgxMzAwCisJbXRzcHIJU1BSTl9JVk9SMTMscjEJLyogRGF0YSBUTEIgZXJyb3IgKi8KKwlsaQlyMSwweDE0MDAKKwltdHNwcglTUFJOX0lWT1IxNCxyMQkvKiBJbnN0ciBUTEIgZXJyb3IgKi8KKwlsaQlyMSwweDIwMDAKKwltdHNwcglTUFJOX0lWT1IxNSxyMQkvKiBEZWJ1ZyAqLworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBDb25maWd1cmUgY2FjaGUgcmVnaW9ucyAgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCW10c3ByCVNQUk5fSU5WMCxyMAorCW10c3ByCVNQUk5fSU5WMSxyMAorCW10c3ByCVNQUk5fSU5WMixyMAorCW10c3ByCVNQUk5fSU5WMyxyMAorCW10c3ByCVNQUk5fRE5WMCxyMAorCW10c3ByCVNQUk5fRE5WMSxyMAorCW10c3ByCVNQUk5fRE5WMixyMAorCW10c3ByCVNQUk5fRE5WMyxyMAorCW10c3ByCVNQUk5fSVRWMCxyMAorCW10c3ByCVNQUk5fSVRWMSxyMAorCW10c3ByCVNQUk5fSVRWMixyMAorCW10c3ByCVNQUk5fSVRWMyxyMAorCW10c3ByCVNQUk5fRFRWMCxyMAorCW10c3ByCVNQUk5fRFRWMSxyMAorCW10c3ByCVNQUk5fRFRWMixyMAorCW10c3ByCVNQUk5fRFRWMyxyMAorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBDYWNoZSB2aWN0aW0gbGltaXRzICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBmbG9vcnMgMCwgY2VpbGluZyBtYXggdG8gdXNlIHRoZSBlbnRpcmUgY2FjaGUgLS0gbm90aGluZyBsb2NrZWQKKwkqLworCWxpcwlyMSwweDAwMDEKKwlvcmkJcjEscjEsMHhmODAwCisJbXRzcHIJU1BSTl9JVkxJTSxyMQorCW10c3ByCVNQUk5fRFZMSU0scjEKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwl8SW5pdGlhbGl6ZSBNTVVDUltTVElEXSA9IDAuCisJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltZnNwcglyMCxTUFJOX01NVUNSCisJYWRkaXMJcjEsMCwweEZGRkYKKwlvcmkJcjEscjEsMHhGRjAwCisJYW5kCXIwLHIwLHIxCisJbXRzcHIJU1BSTl9NTVVDUixyMAorCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBDbGVhciBhbGwgVExCIGVudHJpZXMgLS0gVElEID0gMCwgVFMgPSAwICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlhZGRpcwlyMCwwLDB4MDAwMAorI2lmZGVmIENPTkZJR19TWVNfUkFNQk9PVAorCWxpCXI0LDAJCS8qIFN0YXJ0IHdpdGggVExCICMwICovCisjZWxzZQorCWxpCXI0LDEJCS8qIFN0YXJ0IHdpdGggVExCICMxICovCisjZW5kaWYKKwlsaQlyMSw2NAkJLyogNjQgVExCIGVudHJpZXMgKi8KKwlzdWIJcjEscjEscjQJLyogY2FsY3VsYXRlIGxhc3QgVExCICMgKi8KKwltdGN0cglyMQorcnN0dGxiOgorI2lmZGVmIENPTkZJR19TWVNfUkFNQk9PVAorCXRsYnJlCXIzLHI0LDAJCS8qIFJlYWQgY29udGVudHMgZnJvbSBUTEIgd29yZCAjMCB0byBnZXQgRVBOICovCisJcmx3aW5tLglyMyxyMywwLDB4ZmZmZmZjMDAJLyogTWFzayBFUE4gKi8KKwliZXEJdGxibnh0CQkvKiBTa2lwIEVQTj0wIFRMQiwgdGhpcyBpcyB0aGUgU0RSQU0gVExCICovCisjZW5kaWYKKwl0bGJ3ZQlyMCxyNCwwCQkvKiBJbnZhbGlkYXRlIGFsbCBlbnRyaWVzIChWPTApKi8KKwl0bGJ3ZQlyMCxyNCwxCisJdGxid2UJcjAscjQsMgordGxibnh0OglhZGRpCXI0LHI0LDEJCS8qIE5leHQgVExCICovCisJYmRueglyc3R0bGIKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogVExCIGVudHJ5IHNldHVwIC0tIHN0ZXAgdGhydSB0bGJ0YWIgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoQ09ORklHXzQ0MFNQRV9SRVZBKQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogV2UgaGF2ZSBkaWZmZXJlbnQgVExCIHRhYmxlcyBmb3IgcmV2QSBhbmQgcmV2IEIgb2YgNDQwU1BlICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwltZnNwcglyMSwgUFZSCisJbGlzCXIwLDB4NTM0MgorCW9yaQlyMCxyMCwweDE4OTEKKwljbXB3CXI3LHIxLHIwCisJYm5lCXI3LC4ucmV2QQorCWJsCXRsYnRhYkIKKwliCS4uZ29vbgorLi5yZXZBOgorCWJsCXRsYnRhYkEKKy4uZ29vbjoKKyNlbHNlCisJYmwJdGxidGFiCQkvKiBHZXQgdGxidGFiIHBvaW50ZXIgKi8KKyNlbmRpZgorCW1yCXI1LHIwCisJbGkJcjEsMHgwMDNmCS8qIDY0IFRMQiBlbnRyaWVzIG1heCAqLworCW10Y3RyCXIxCisJbGkJcjQsMAkJLyogVExCICMgKi8KKworCWFkZGkJcjUscjUsLTQKKzE6CisjaWZkZWYgQ09ORklHX1NZU19SQU1CT09UCisJdGxicmUJcjMscjQsMAkJLyogUmVhZCBjb250ZW50cyBmcm9tIFRMQiB3b3JkICMwICovCisJcmx3aW5tLglyMyxyMywwLDB4MDAwMDAyMDAJLyogTWFzayBWICh2YWxpZCkgYml0ICovCisJYm5lCXRsYm54MgkJLyogU2tpcCBWPTEgVExCLCB0aGlzIGlzIHRoZSBTRFJBTSBUTEIgKi8KKyNlbmRpZgorCWx3enUJcjAsNChyNSkKKwljbXB3aQlyMCwwCisJYmVxCTJmCQkvKiAwIG1hcmtzIGVuZCAqLworCWx3enUJcjEsNChyNSkKKwlsd3p1CXIyLDQocjUpCisJdGxid2UJcjAscjQsMAkJLyogVExCIFdvcmQgMCAqLworCXRsYndlCXIxLHI0LDEJCS8qIFRMQiBXb3JkIDEgKi8KKwl0bGJ3ZQlyMixyNCwyCQkvKiBUTEIgV29yZCAyICovCit0bGJueDI6CWFkZGkJcjQscjQsMQkJLyogTmV4dCBUTEIgKi8KKwliZG56CTFiCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qIENvbnRpbnVlIGZyb20gJ25vcm1hbCcgc3RhcnQgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworMjoKKwlibAkzZgorCWIJX3N0YXJ0CisKKzM6CWxpCXIwLDAKKwltdHNwcglTUFJOX1NSUjEscjAJCS8qIEtlZXAgdGhpbmdzIGRpc2FibGVkIGZvciBub3cgKi8KKwltZmxyCXIxCisJbXRzcHIJU1BSTl9TUlIwLHIxCisJcmZpCisjZW5kaWYgLyogQ09ORklHXzQ0MCAqLworCisvKgorICogcjMgLSAxc3QgYXJnIHRvIGJvYXJkX2luaXQoKTogSU1NUCBwb2ludGVyCisgKiByNCAtIDJuZCBhcmcgdG8gYm9hcmRfaW5pdCgpOiBib290IGZsYWcKKyAqLworI2lmbmRlZiBDT05GSUdfTkFORF9TUEwKKwkudGV4dAorCS5sb25nCTB4MjcwNTE5NTYJCS8qIFUtQm9vdCBNYWdpYyBOdW1iZXIJCQkqLworCS5nbG9ibAl2ZXJzaW9uX3N0cmluZwordmVyc2lvbl9zdHJpbmc6CisJLmFzY2lpIFVfQk9PVF9WRVJTSU9OCisJLmFzY2lpICIgKCIsIFVfQk9PVF9EQVRFLCAiIC0gIiwgVV9CT09UX1RJTUUsICIpIgorCS5hc2NpaSBDT05GSUdfSURFTlRfU1RSSU5HLCAiXDAiCisKKwkuID0gRVhDX09GRl9TWVNfUkVTRVQKKwkuZ2xvYmwJX3N0YXJ0X29mX3ZlY3RvcnMKK19zdGFydF9vZl92ZWN0b3JzOgorCisvKiBDcml0aWNhbCBpbnB1dC4gKi8KKwlDUklUX0VYQ0VQVElPTigweDEwMCwgQ3JpdGNhbElucHV0LCBVbmtub3duRXhjZXB0aW9uKQorCisjaWZkZWYgQ09ORklHXzQ0MAorLyogTWFjaGluZSBjaGVjayAqLworCU1DS19FWENFUFRJT04oMHgyMDAsIE1hY2hpbmVDaGVjaywgTWFjaGluZUNoZWNrRXhjZXB0aW9uKQorI2Vsc2UKKwlDUklUX0VYQ0VQVElPTigweDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCisjZW5kaWYgLyogQ09ORklHXzQ0MCAqLworCisvKiBEYXRhIFN0b3JhZ2UgZXhjZXB0aW9uLiAqLworCVNURF9FWENFUFRJT04oMHgzMDAsIERhdGFTdG9yYWdlLCBVbmtub3duRXhjZXB0aW9uKQorCisvKiBJbnN0cnVjdGlvbiBTdG9yYWdlIGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4NDAwLCBJbnN0U3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogRXh0ZXJuYWwgSW50ZXJydXB0IGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4NTAwLCBFeHRJbnRlcnJ1cHQsIGV4dGVybmFsX2ludGVycnVwdCkKKworLyogQWxpZ25tZW50IGV4Y2VwdGlvbi4gKi8KKwkuID0gMHg2MDAKK0FsaWdubWVudDoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJbWZzcHIJcjQsREFSCisJc3R3CXI0LF9EQVIocjIxKQorCW1mc3ByCXI1LERTSVNSCisJc3R3CXI1LF9EU0lTUihyMjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKEFsaWdubWVudCwgQWxpZ25tZW50RXhjZXB0aW9uLCBNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisvKiBQcm9ncmFtIGNoZWNrIGV4Y2VwdGlvbiAqLworCS4gPSAweDcwMAorUHJvZ3JhbUNoZWNrOgorCUVYQ0VQVElPTl9QUk9MT0coU1JSMCwgU1JSMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJRVhDX1hGRVJfVEVNUExBVEUoUHJvZ3JhbUNoZWNrLCBQcm9ncmFtQ2hlY2tFeGNlcHRpb24sCisJCU1TUl9LRVJORUwsIENPUFlfRUUpCisKKyNpZmRlZiBDT05GSUdfNDQwCisJU1REX0VYQ0VQVElPTigweDgwMCwgRlBVbmF2YWlsYWJsZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4OTAwLCBEZWNyZW1lbnRlciwgRGVjcmVtZW50ZXJQSVRFeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGEwMCwgQVBVLCBVbmtub3duRXhjZXB0aW9uKQorI2VuZGlmCisJU1REX0VYQ0VQVElPTigweGMwMCwgU3lzdGVtQ2FsbCwgVW5rbm93bkV4Y2VwdGlvbikKKworI2lmZGVmIENPTkZJR180NDAKKwlTVERfRVhDRVBUSU9OKDB4MTMwMCwgRGF0YVRMQkVycm9yLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxNDAwLCBJbnN0cnVjdGlvblRMQkVycm9yLCBVbmtub3duRXhjZXB0aW9uKQorI2Vsc2UKKwlTVERfRVhDRVBUSU9OKDB4MTAwMCwgUElULCBEZWNyZW1lbnRlclBJVEV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTEwMCwgSW5zdHJ1Y3Rpb25UTEJNaXNzLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHgxMjAwLCBEYXRhVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKyNlbmRpZgorCUNSSVRfRVhDRVBUSU9OKDB4MjAwMCwgRGVidWdCcmVha3BvaW50LCBEZWJ1Z0V4Y2VwdGlvbiApCisKKwkuZ2xvYmwJX2VuZF9vZl92ZWN0b3JzCitfZW5kX29mX3ZlY3RvcnM6CisJLiA9IF9TVEFSVF9PRkZTRVQKKyNlbmRpZgorCS5nbG9ibAlfc3RhcnQKK19zdGFydDoKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogQ2xlYXIgYW5kIHNldCB1cCBzb21lIHJlZ2lzdGVycy4gKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpCXIwLDB4MDAwMAorCWxpcwlyMSwweGZmZmYKKwltdHNwcglTUFJOX0RFQyxyMAkJCS8qIHByZXZlbnQgZGVjIGV4Y2VwdGlvbnMgKi8KKwltdHNwcglTUFJOX1RCV0wscjAJCQkvKiBwcmV2ZW50IGZpdCAmIHdkdCBleGNlcHRpb25zICovCisJbXRzcHIJU1BSTl9UQldVLHIwCisJbXRzcHIJU1BSTl9UU1IscjEJCQkvKiBjbGVhciBhbGwgdGltZXIgZXhjZXB0aW9uIHN0YXR1cyAqLworCW10c3ByCVNQUk5fVENSLHIwCQkJLyogZGlzYWJsZSBhbGwgKi8KKwltdHNwcglTUFJOX0VTUixyMAkJCS8qIGNsZWFyIGV4Y2VwdGlvbiBzeW5kcm9tZSByZWdpc3RlciAqLworCW10eGVyCXIwCQkJLyogY2xlYXIgaW50ZWdlciBleGNlcHRpb24gcmVnaXN0ZXIgKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogRGVidWcgc2V0dXAgLS0gc29tZSAobm90IHZlcnkgZ29vZCkgaWNlJ3MgbmVlZCBhbiBldmVudCovCisJLyogdG8gZXN0YWJsaXNoIGNvbnRyb2wgOi0oIERlZmluZSBDT05GSUdfU1lTX0lOSVRfREJDUiB0byB0aGUgZGJzciAqLworCS8qIHZhbHVlIHlvdSBuZWVkIGluIHRoaXMgY2FzZSAweDhjZmYgMDAwMCBzaG91bGQgZG8gdGhlIHRyaWNrICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfSU5JVF9EQkNSKQorCWxpcwlyMSwweGZmZmYKKwlvcmkJcjEscjEsMHhmZmZmCisJbXRzcHIJU1BSTl9EQlNSLHIxCQkJLyogQ2xlYXIgYWxsIHN0YXR1cyBiaXRzICovCisJbGlzCXIwLENPTkZJR19TWVNfSU5JVF9EQkNSQGgKKwlvcmkJcjAscjAsQ09ORklHX1NZU19JTklUX0RCQ1JAbAorCW10c3ByCVNQUk5fREJDUjAscjAKKwlpc3luYworI2VuZGlmCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qIFNldHVwIHRoZSBpbnRlcm5hbCBTUkFNICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsaQlyMCwwCisKKyNpZmRlZiBDT05GSUdfU1lTX0lOSVRfUkFNX0RDQUNIRQorCS8qIENsZWFyIERjYWNoZSB0byB1c2UgYXMgUkFNICovCisJYWRkaXMJcjMscjAsQ09ORklHX1NZU19JTklUX1JBTV9BRERSQGgKKwlvcmkJcjMscjMsQ09ORklHX1NZU19JTklUX1JBTV9BRERSQGwKKwlhZGRpcwlyNCxyMCxDT05GSUdfU1lTX0lOSVRfUkFNX0VOREBoCisJb3JpCXI0LHI0LENPTkZJR19TWVNfSU5JVF9SQU1fRU5EQGwKKwlybHdpbm0uIHI1LHI0LDAsMjcsMzEKKwlybHdpbm0JcjUscjQsMjcsNSwzMQorCWJlcQkuLmRfcmFuCisJYWRkaQlyNSxyNSwweDAwMDEKKy4uZF9yYW46CisJbXRjdHIJcjUKKy4uZF9hZzoKKwlkY2J6CXIwLHIzCisJYWRkaQlyMyxyMywzMgorCWJkbnoJLi5kX2FnCisKKwkvKgorCSAqIExvY2sgdGhlIGluaXQtcmFtL3N0YWNrIGluIGQtY2FjaGUsIHNvIHRoYXQgb3RoZXIgcmVnaW9ucworCSAqIG1heSB1c2UgZC1jYWNoZSBhcyB3ZWxsCisJICogTm90ZSwgdGhhdCB0aGlzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gbG9ja3MgZXhhY3RseSA0aworCSAqIG9mIGQtY2FjaGUsIHNvIHBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgZG9uJ3QgZGVmaW5lIGEKKwkgKiBiaWdnZXIgaW5pdC1yYW0gYXJlYS4gVGFrZSBhIGxvb2sgYXQgdGhlIGx3bW9uNSA0NDBFUHgKKwkgKiBpbXBsZW1lbnRhdGlvbiBhcyBhIHJlZmVyZW5jZS4KKwkgKi8KKwltc3luYworCWlzeW5jCisJLyogOC4gc2V0IFRGTE9PUi9ORkxPT1IgdG8gOCAoLT4gOCoxNiozMiBieXRlcyBsb2NrZWQgLT4gNGspICovCisJbGlzCXIxLDB4MDIwMQorCW9yaQlyMSxyMSwweGY4MDgKKwltdHNwcglTUFJOX0RWTElNLHIxCisJbGlzCXIxLDB4MDgwOAorCW9yaQlyMSxyMSwweDA4MDgKKwltdHNwcglTUFJOX0ROVjAscjEKKwltdHNwcglTUFJOX0ROVjEscjEKKwltdHNwcglTUFJOX0ROVjIscjEKKwltdHNwcglTUFJOX0ROVjMscjEKKwltdHNwcglTUFJOX0RUVjAscjEKKwltdHNwcglTUFJOX0RUVjEscjEKKwltdHNwcglTUFJOX0RUVjIscjEKKwltdHNwcglTUFJOX0RUVjMscjEKKwltc3luYworCWlzeW5jCisjZW5kaWYgLyogQ09ORklHX1NZU19JTklUX1JBTV9EQ0FDSEUgKi8KKworCS8qIDQ0MEVQICYgNDQwR1IgYXJlIG9ubHkgNDQwZXIgUFBDJ3Mgd2l0aG91dCBpbnRlcm5hbCBTUkFNICovCisjaWYgIWRlZmluZWQoQ09ORklHXzQ0MEVQKSAmJiAhZGVmaW5lZChDT05GSUdfNDQwR1IpCisJLyogbm90IGFsbCBQUEMncyBoYXZlIGludGVybmFsIFNSQU0gdXNhYmxlIGFzIEwyLWNhY2hlICovCisjaWYgZGVmaW5lZChDT05GSUdfNDQwR1gpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBTUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1BFKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfNDYwU1gpCisJbXRkY3IJTDJfQ0FDSEVfQ0ZHLHIwCQkvKiBFbnN1cmUgTDIgQ2FjaGUgaXMgb2ZmICovCisjZWxpZiBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpCisJbGlzCXIxLCAweDAwMDAKKwlvcmkJcjEscjEsMHgwMDA4CQkvKiBTZXQgTDJfQ0FDSEVfQ0ZHW1JEQlddPTEgKi8KKwltdGRjcglMMl9DQUNIRV9DRkcscjEKKyNlbmRpZgorCisJbGlzCXIyLDB4N2ZmZgorCW9yaQlyMixyMiwweGZmZmYKKwltZmRjcglyMSxJU1JBTTBfRFBDCisJYW5kCXIxLHIxLHIyCQkvKiBEaXNhYmxlIHBhcml0eSBjaGVjayAqLworCW10ZGNyCUlTUkFNMF9EUEMscjEKKwltZmRjcglyMSxJU1JBTTBfUE1FRworCWFuZAlyMSxyMSxyMgkJLyogRGlzYWJsZSBwd3IgbWdtdCAqLworCW10ZGNyCUlTUkFNMF9QTUVHLHIxCisKKwlsaXMJcjEsMHg4MDAwCQkvKiBCQVMgPSA4MDAwXzAwMDAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR180NDBHWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwU1ApCisJb3JpCXIxLHIxLDB4MDk4MAkJLyogZmlyc3QgNjRrICovCisJbXRkY3IJSVNSQU0wX1NCMENSLHIxCisJbGlzCXIxLDB4ODAwMQorCW9yaQlyMSxyMSwweDA5ODAJCS8qIHNlY29uZCA2NGsgKi8KKwltdGRjcglJU1JBTTBfU0IxQ1IscjEKKwlsaXMJcjEsIDB4ODAwMgorCW9yaQlyMSxyMSwgMHgwOTgwCQkvKiB0aGlyZCA2NGsgKi8KKwltdGRjcglJU1JBTTBfU0IyQ1IscjEKKwlsaXMJcjEsIDB4ODAwMworCW9yaQlyMSxyMSwgMHgwOTgwCQkvKiBmb3VydGggNjRrICovCisJbXRkY3IJSVNSQU0wX1NCM0NSLHIxCisjZWxpZiBkZWZpbmVkKENPTkZJR180NDBTUEUpIHx8IGRlZmluZWQoQ09ORklHXzQ2MEVYKSB8fCBkZWZpbmVkKENPTkZJR180NjBHVCkKKwlsaXMJcjEsMHgwMDAwCQkvKiBCQVMgPSBYXzAwMDBfMDAwMCAqLworCW9yaQlyMSxyMSwweDA5ODQJCS8qIGZpcnN0IDY0ayAqLworCW10ZGNyCUlTUkFNMF9TQjBDUixyMQorCWxpcwlyMSwweDAwMDEKKwlvcmkJcjEscjEsMHgwOTg0CQkvKiBzZWNvbmQgNjRrICovCisJbXRkY3IJSVNSQU0wX1NCMUNSLHIxCisJbGlzCXIxLCAweDAwMDIKKwlvcmkJcjEscjEsIDB4MDk4NAkJLyogdGhpcmQgNjRrICovCisJbXRkY3IJSVNSQU0wX1NCMkNSLHIxCisJbGlzCXIxLCAweDAwMDMKKwlvcmkJcjEscjEsIDB4MDk4NAkJLyogZm91cnRoIDY0ayAqLworCW10ZGNyCUlTUkFNMF9TQjNDUixyMQorI2lmIGRlZmluZWQoQ09ORklHXzQ2MEVYKSB8fCBkZWZpbmVkKENPTkZJR180NjBHVCkKKwlsaXMJcjIsMHg3ZmZmCisJb3JpCXIyLHIyLDB4ZmZmZgorCW1mZGNyCXIxLElTUkFNMV9EUEMKKwlhbmQJcjEscjEscjIJCS8qIERpc2FibGUgcGFyaXR5IGNoZWNrICovCisJbXRkY3IJSVNSQU0xX0RQQyxyMQorCW1mZGNyCXIxLElTUkFNMV9QTUVHCisJYW5kCXIxLHIxLHIyCQkvKiBEaXNhYmxlIHB3ciBtZ210ICovCisJbXRkY3IJSVNSQU0xX1BNRUcscjEKKworCWxpcwlyMSwweDAwMDQJCS8qIEJBUyA9IDRfMDAwNF8wMDAwICovCisJb3JpCXIxLHIxLDB4MDk4NAkJLyogNjRrICovCisJbXRkY3IJSVNSQU0xX1NCMENSLHIxCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoQ09ORklHXzQ2MFNYKQorCWxpcyAgICAgcjEsMHgwMDAwICAgICAgICAgICAgICAgLyogQkFTID0gMDAwMF8wMDAwICovCisJb3JpICAgICByMSxyMSwweDBCODQgICAgICAgICAgICAvKiBmaXJzdCAxMjhrICovCisJbXRkY3IgICBJU1JBTTBfU0IwQ1IscjEKKwlsaXMgICAgIHIxLDB4MDAwMQorCW9yaSAgICAgcjEscjEsMHgwQjg0ICAgICAgICAgICAgLyogc2Vjb25kIDEyOGsgKi8KKwltdGRjciAgIElTUkFNMF9TQjFDUixyMQorCWxpcyAgICAgcjEsIDB4MDAwMgorCW9yaSAgICAgcjEscjEsIDB4MEI4NCAgICAgICAgICAgLyogdGhpcmQgMTI4ayAqLworCW10ZGNyICAgSVNSQU0wX1NCMkNSLHIxCisJbGlzICAgICByMSwgMHgwMDAzCisJb3JpICAgICByMSxyMSwgMHgwQjg0ICAgICAgICAgICAvKiBmb3VydGggMTI4ayAqLworCW10ZGNyICAgSVNSQU0wX1NCM0NSLHIxCisjZWxpZiBkZWZpbmVkKENPTkZJR180NDBHUCkKKwlvcmkJcjEscjEsMHgwMzgwCQkvKiA4ayBydyAqLworCW10ZGNyCUlTUkFNMF9TQjBDUixyMQorCW10ZGNyCUlTUkFNMF9TQjFDUixyMAkJLyogRGlzYWJsZSBiYW5rIDEgKi8KKyNlbmRpZgorI2VuZGlmIC8qICNpZiAhZGVmaW5lZChDT05GSUdfNDQwRVApICYmICFkZWZpbmVkKENPTkZJR180NDBHUikgKi8KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJLyogU2V0dXAgdGhlIHN0YWNrIGluIGludGVybmFsIFNSQU0gKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpcwlyMSxDT05GSUdfU1lTX0lOSVRfUkFNX0FERFJAaAorCW9yaQlyMSxyMSxDT05GSUdfU1lTX0lOSVRfU1BfT0ZGU0VUQGwKKwlsaQlyMCwwCisJc3R3dQlyMCwtNChyMSkKKwlzdHd1CXIwLC00KHIxKQkJLyogVGVybWluYXRlIGNhbGwgY2hhaW4gKi8KKworCXN0d3UJcjEsLTgocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KKwlsaXMJcjAsUkVTRVRfVkVDVE9SQGgJLyogQWRkcmVzcyBvZiByZXNldCB2ZWN0b3IgKi8KKwlvcmkJcjAscjAsIFJFU0VUX1ZFQ1RPUkBsCisJc3R3dQlyMSwtOChyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCXN0dwlyMCwrMTIocjEpCQkvKiBTYXZlIHJldHVybiBhZGRyICh1bmRlcmZsb3cgdmVjdCkgKi8KKworI2lmZGVmIENPTkZJR19OQU5EX1NQTAorCWJsCW5hbmRfYm9vdF9jb21tb24JLyogd2lsbCBub3QgcmV0dXJuICovCisjZWxzZQorCUdFVF9HT1QKKworCWJsCWNwdV9pbml0X2YJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlCSAgIChmcm9tIEZsYXNoKSAqLworCWJsCWJvYXJkX2luaXRfZgorI2VuZGlmCisKKyNlbmRpZiAvKiBDT05GSUdfNDQwICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBDT05GSUdfSU9QNDgwCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFNldCB1cCBzb21lIG1hY2hpbmUgc3RhdGUgcmVnaXN0ZXJzLiAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlhZGRpCXIwLHIwLDB4MDAwMAkJLyogaW5pdGlhbGl6ZSByMCB0byB6ZXJvICovCisJbXRzcHIJU1BSTl9FU1IscjAJCS8qIGNsZWFyIEV4Y2VwdGlvbiBTeW5kcm9tZSBSZWcgKi8KKwltdHRjcglyMAkJCS8qIHRpbWVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwltdGV4aWVyIHIwCQkJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWFkZGlzCXI0LHIwLDB4RkZGRgkJLyogc2V0IHI0IHRvIDB4RkZGRkZGRkYgKHN0YXR1cyBpbiB0aGUgKi8KKwlvcmkJcjQscjQsMHhGRkZGCQkvKiBkYnNyIGlzIGNsZWFyZWQgYnkgc2V0dGluZyBiaXRzIHRvIDEpICovCisJbXRkYnNyCXI0CQkJLyogY2xlYXIvcmVzZXQgdGhlIGRic3IgKi8KKwltdGV4aXNyIHI0CQkJLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCWFkZGlzCXI0LHIwLDB4ODAwMAorCW10ZXhpZXIgcjQJCQkvKiBlbmFibGUgY3JpdGljYWwgZXhjZXB0aW9ucyAqLworCWFkZGlzCXI0LHIwLDB4MDAwMAkJLyogYXNzdW1lIDQwM0dDWCAtIGVuYWJsZSBjb3JlIGNsayAqLworCW9yaQlyNCxyNCwweDQwMjAJCS8qIGRibGluZyAobm8gaGFybSBkb25lIG9uIEdBIGFuZCBHQyAqLworCW10aW9jcglyNAkJCS8qIHNpbmNlIGJpdCBub3QgdXNlZCkgJiBEUkMgdG8gbGF0Y2ggKi8KKwkJCQkJLyogZGF0YSBidXMgb24gcmlzaW5nIGVkZ2Ugb2YgQ0FTICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIENsZWFyIFhFUi4gKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJbXR4ZXIJcjAKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogSW52YWxpZGF0ZSBpLWNhY2hlIGFuZCBkLWNhY2hlIFRBRyBhcnJheXMuICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWFkZGkJcjMsMCwxMDI0CQkvKiAxLzQgb2YgSS1jYWNoZSBzaXplLCBoYWxmIG9mIEQtY2FjaGUgKi8KKwlhZGRpCXI0LDAsMTAyNAkJLyogMS80IG9mIEktY2FjaGUgKi8KKy4uY2xvb3A6CisJaWNjY2kJMCxyMworCWljY2NpCXI0LHIzCisJZGNjY2kJMCxyMworCWFkZGljLglyMyxyMywtMTYJCS8qIG1vdmUgYmFjayBvbmUgY2FjaGUgbGluZSAqLworCWJuZQkuLmNsb29wCQkJLyogbG9vcCBiYWNrIHRvIGRvIHJlc3QgdW50aWwgcjMgPSAwICovCisKKwkvKiAqLworCS8qIGluaXRpYWxpemUgSU9QNDgwIHNvIGl0IGNhbiByZWFkIDEgTUIgY29kZSBhcmVhIGZvciBTUkFNIHNwYWNlcyAqLworCS8qIHRoaXMgcmVxdWlyZXMgZW5hYmxpbmcgTUFbMTcuLjBdLCBieSBkZWZhdWx0IG9ubHkgTUFbMTIuLjBdIGFyZSBlbmFibGVkLiAqLworCS8qICovCisKKwkvKiBmaXJzdCBjb3B5IElPUDQ4MCByZWdpc3RlciBiYXNlIGFkZHJlc3MgaW50byByMyAqLworCWFkZGlzCXIzLDAsMHg1MDAwCQkvKiBJT1A0ODAgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIGhpICovCisvKglvcmkJcjMscjMsMHgwMDAwCQkvICBJT1A0ODAgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIGxvICovCisKKyNpZmRlZiBDT05GSUdfQURDSU9QCisJLyogdXNlIHI0IGFzIHRoZSB3b3JraW5nIHZhcmlhYmxlICovCisJLyogdHVybiBvbiBDUzMgKExPQ0NUTC43KSAqLworCWx3eglyNCwweDg0KHIzKQkJLyogTE9DVEwgaXMgYXQgb2Zmc2V0IDB4ODQgKi8KKwlhbmRpLglyNCxyNCwweGZmN2YJCS8qIG1ha2UgYml0IDcgPSAwIC0tIENTMyBtb2RlICovCisJc3R3CXI0LDB4ODQocjMpCQkvKiBMT0NUTCBpcyBhdCBvZmZzZXQgMHg4NCAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfREFTQV9TSU0KKwkvKiB1c2UgcjQgYXMgdGhlIHdvcmtpbmcgdmFyaWFibGUgKi8KKwkvKiB0dXJuIG9uIE1BMTcgKExPQ0NUTC43KSAqLworCWx3eglyNCwweDg0KHIzKQkJLyogTE9DVEwgaXMgYXQgb2Zmc2V0IDB4ODQgKi8KKwlvcmkJcjQscjQsMHg4MAkJLyogbWFrZSBiaXQgNyA9IDEgLS0gTUExNyBtb2RlICovCisJc3R3CXI0LDB4ODQocjMpCQkvKiBMT0NUTCBpcyBhdCBvZmZzZXQgMHg4NCAqLworI2VuZGlmCisKKwkvKiB0dXJuIG9uIE1BMTYuLjEzIChMQ1MwQlJELjEyID0gMCkgKi8KKwlsd3oJcjQsMHgxMDAocjMpCQkvKiBMQ1MwQlJEIGlzIGF0IG9mZnNldCAweDEwMCAqLworCWFuZGkuCXI0LHI0LDB4ZWZmZgkJLyogbWFrZSBiaXQgMTIgPSAwICovCisJc3R3CXI0LDB4MTAwKHIzKQkJLyogTENTMEJSRCBpcyBhdCBvZmZzZXQgMHgxMDAgKi8KKworCS8qIG1ha2Ugc3VyZSBhYm92ZSBzdG9yZXMgYWxsIGNvbWxldGUgYmVmb3JlIGdvaW5nIG9uICovCisJc3luYworCisJLyogbGFzdCB0aGluZywgc2V0IGxvY2FsIGluaXQgc3RhdHVzIGRvbmUgYml0IChERVZJTklULjMxKSAqLworCWx3eglyNCwweDgwKHIzKQkJLyogREVWSU5JVCBpcyBhdCBvZmZzZXQgMHg4MCAqLworCW9yaXMJcjQscjQsMHg4MDAwCQkvKiBtYWtlIGJpdCAzMSA9IDEgKi8KKwlzdHcJcjQsMHg4MChyMykJCS8qIERFVklOSVQgaXMgYXQgb2Zmc2V0IDB4ODAgKi8KKworCS8qIGNsZWFyIGFsbCBwZW5kaW5nIGludGVycnVwdHMgYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlsaQlyNCwtMQkJCS8qIHNldCBwMSB0byAweGZmZmZmZmZmICovCisJc3R3CXI0LDB4MWIwKHIzKQkJLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXN0dwlyNCwweDFiOChyMykJCS8qIGNsZWFyIGFsbCBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCQkJLyogc2V0IHI0IHRvIDAgKi8KKwlzdHcJcjQsMHgxYjQocjMpCQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJc3R3CXI0LDB4MWJjKHIzKQkJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCisJLyogbWFrZSBzdXJlIGFib3ZlIHN0b3JlcyBhbGwgY29tbGV0ZSBiZWZvcmUgZ29pbmcgb24gKi8KKwlzeW5jCisKKwkvKiBTZXQtdXAgaWNhY2hlIGNhY2hlYWJpbGl0eS4gKi8KKwlsaXMJcjEsIENPTkZJR19TWVNfSUNBQ0hFX1NBQ1JfVkFMVUVAaAorCW9yaQlyMSwgcjEsIENPTkZJR19TWVNfSUNBQ0hFX1NBQ1JfVkFMVUVAbAorCW10aWNjcglyMQorCWlzeW5jCisKKwkvKiBTZXQtdXAgZGNhY2hlIGNhY2hlYWJpbGl0eS4gKi8KKwlsaXMJcjEsIENPTkZJR19TWVNfRENBQ0hFX1NBQ1JfVkFMVUVAaAorCW9yaQlyMSwgcjEsIENPTkZJR19TWVNfRENBQ0hFX1NBQ1JfVkFMVUVAbAorCW10ZGNjcglyMQorCisJYWRkaXMJcjEscjAsQ09ORklHX1NZU19JTklUX1JBTV9BRERSQGgKKwlvcmkJcjEscjEsQ09ORklHX1NZU19JTklUX1NQX09GRlNFVCAvKiBzZXQgdXAgdGhlIHN0YWNrIHRvIFNEUkFNICovCisJbGkJcjAsIDAJCQkvKiBNYWtlIHJvb20gZm9yIHN0YWNrIGZyYW1lIGhlYWRlciBhbmQgKi8KKwlzdHd1CXIwLCAtNChyMSkJCS8qIGNsZWFyIGZpbmFsIHN0YWNrIGZyYW1lIHNvIHRoYXQJKi8KKwlzdHd1CXIwLCAtNChyMSkJCS8qIHN0YWNrIGJhY2t0cmFjZXMgdGVybWluYXRlIGNsZWFubHkJKi8KKworCUdFVF9HT1QJCQkvKiBpbml0aWFsaXplIEdPVCBhY2Nlc3MJCQkqLworCisJYmwJYm9hcmRfaW5pdF9mCS8qIHJ1biBmaXJzdCBwYXJ0IG9mIGluaXQgY29kZSAoZnJvbSBGbGFzaCkJKi8KKworI2VuZGlmCS8qIENPTkZJR19JT1A0ODAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHXzQwNUdQKSB8fCBkZWZpbmVkKENPTkZJR180MDVDUikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQwNUVQKSB8fCBkZWZpbmVkKENPTkZJR180MDVFWikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQwNUVYKSB8fCBkZWZpbmVkKENPTkZJR180MDUpCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIENsZWFyIGFuZCBzZXQgdXAgc29tZSByZWdpc3RlcnMuICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWFkZGkJcjQscjAsMHgwMDAwCisjaWYgIWRlZmluZWQoQ09ORklHXzQwNUVYKQorCW10c3ByCVNQUk5fU0dSLHI0CisjZWxzZQorCS8qCisJICogT24gNDA1RVgsIGNvbXBsZXRlbHkgY2xlYXJpbmcgdGhlIFNHUiBsZWFkcyB0byBQUEMgaGFuZ3VwCisJICogdXBvbiBQQ0llIGNvbmZpZ3VyYXRpb24gYWNjZXNzLiBUaGUgUENJZSBtZW1vcnkgcmVnaW9ucworCSAqIG5lZWQgdG8gYmUgZ3VhcmRlZCEKKwkgKi8KKwlsaXMJcjMsMHgwMDAwCisJb3JpCXIzLHIzLDB4N0ZGQworCW10c3ByCVNQUk5fU0dSLHIzCisjZW5kaWYKKwltdHNwcglTUFJOX0RDV1IscjQKKwltdGVzcglyNAkJCS8qIGNsZWFyIEV4Y2VwdGlvbiBTeW5kcm9tZSBSZWcgKi8KKwltdHRjcglyNAkJCS8qIGNsZWFyIFRpbWVyIENvbnRyb2wgUmVnICovCisJbXR4ZXIJcjQJCQkvKiBjbGVhciBGaXhlZC1Qb2ludCBFeGNlcHRpb24gUmVnICovCisJbXRldnByCXI0CQkJLyogY2xlYXIgRXhjZXB0aW9uIFZlY3RvciBQcmVmaXggUmVnICovCisJYWRkaQlyNCxyMCwoMHhGRkZGLTB4MTAwMDApCQkvKiBzZXQgcjQgdG8gMHhGRkZGRkZGRiAoc3RhdHVzIGluIHRoZSAqLworCQkJCQkvKiBkYnNyIGlzIGNsZWFyZWQgYnkgc2V0dGluZyBiaXRzIHRvIDEpICovCisJbXRkYnNyCXI0CQkJLyogY2xlYXIvcmVzZXQgdGhlIGRic3IgKi8KKworCS8qIEludmFsaWRhdGUgdGhlIGktIGFuZCBkLWNhY2hlcy4gKi8KKwlibAlpbnZhbGlkYXRlX2ljYWNoZQorCWJsCWludmFsaWRhdGVfZGNhY2hlCisKKwkvKiBTZXQtdXAgaWNhY2hlIGNhY2hlYWJpbGl0eS4gKi8KKwlsaXMJcjQsIENPTkZJR19TWVNfSUNBQ0hFX1NBQ1JfVkFMVUVAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfSUNBQ0hFX1NBQ1JfVkFMVUVAbAorCW10aWNjcglyNAorCWlzeW5jCisKKwkvKiBTZXQtdXAgZGNhY2hlIGNhY2hlYWJpbGl0eS4gKi8KKwlsaXMJcjQsIENPTkZJR19TWVNfRENBQ0hFX1NBQ1JfVkFMVUVAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfRENBQ0hFX1NBQ1JfVkFMVUVAbAorCW10ZGNjcglyNAorCisjaWYgIShkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCMEFQKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfRUJDX1BCMENSKSlcCisJCQkJJiYgIWRlZmluZWQgKENPTkZJR19YSUxJTlhfNDA1KQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBUdW5lIHRoZSBzcGVlZCBhbmQgc2l6ZSBmb3IgZmxhc2ggQ1MwICAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlibAlleHRfYnVzX2NudGxyX2luaXQKKyNlbmRpZgorCisjaWYgIShkZWZpbmVkKENPTkZJR19TWVNfSU5JVF9EQ0FDSEVfQ1MpIHx8IGRlZmluZWQoQ09ORklHX1NZU19URU1QX1NUQUNLX09DTSkpCisJLyoKKwkgKiBGb3IgYm9hcmRzIHRoYXQgZG9uJ3QgaGF2ZSBPQ00gYW5kIGNhbid0IHVzZSB0aGUgZGF0YSBjYWNoZQorCSAqIGZvciB0aGVpciBwcmltb3JkaWFsIHN0YWNrLCBzZXR1cCBzdGFjayBoZXJlIGRpcmVjdGx5IGFmdGVyIHRoZQorCSAqIFNEUkFNIGlzIGluaXRpYWxpemVkIGluIGV4dF9idXNfY250bHJfaW5pdC4KKwkgKi8KKwlsaXMJcjEsIENPTkZJR19TWVNfSU5JVF9SQU1fQUREUkBoCisJb3JpCXIxLHIxLENPTkZJR19TWVNfSU5JVF9TUF9PRkZTRVQgLyogc2V0IHVwIHRoZSBzdGFjayBpbiBTRFJBTSAqLworCisJbGkJcjAsIDAJCQkvKiBNYWtlIHJvb20gZm9yIHN0YWNrIGZyYW1lIGhlYWRlciBhbmQgKi8KKwlzdHd1CXIwLCAtNChyMSkJCS8qIGNsZWFyIGZpbmFsIHN0YWNrIGZyYW1lIHNvIHRoYXQJKi8KKwlzdHd1CXIwLCAtNChyMSkJCS8qIHN0YWNrIGJhY2t0cmFjZXMgdGVybWluYXRlIGNsZWFubHkJKi8KKwkvKgorCSAqIFNldCB1cCBhIGR1bW15IGZyYW1lIHRvIHN0b3JlIHJlc2V0IHZlY3RvciBhcyByZXR1cm4gYWRkcmVzcy4KKwkgKiB0aGlzIGNhdXNlcyBzdGFjayB1bmRlcmZsb3cgdG8gcmVzZXQgYm9hcmQuCisJICovCisJc3R3dQlyMSwgLTgocjEpCQkvKiBTYXZlIGJhY2sgY2hhaW4gYW5kIG1vdmUgU1AgKi8KKwlsaXMJcjAsIFJFU0VUX1ZFQ1RPUkBoCS8qIEFkZHJlc3Mgb2YgcmVzZXQgdmVjdG9yICovCisJb3JpCXIwLCByMCwgUkVTRVRfVkVDVE9SQGwKKwlzdHd1CXIxLCAtOChyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCXN0dwlyMCwgKzEyKHIxKQkJLyogU2F2ZSByZXR1cm4gYWRkciAodW5kZXJmbG93IHZlY3QpICovCisjZW5kaWYgLyogIShDT05GSUdfU1lTX0lOSVRfRENBQ0hFX0NTCXx8ICFDT05GSUdfU1lTX1RFTV9TVEFDS19PQ00pICovCisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVFUCkKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogRE1BIFN0YXR1cywgY2xlYXIgdG8gY29tZSB1cCBjbGVhbiAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlhZGRpcwlyMyxyMCwgMHhGRkZGCQkvKiBDbGVhciBhbGwgZXhpc3RpbmcgRE1BIHN0YXR1cyAqLworCW9yaQlyMyxyMywgMHhGRkZGCisJbXRkY3IJRE1BU1IsIHIzCisKKwlibAlwcGM0MDVlcF9pbml0CQkvKiBkbyBwcGM0MDVlcCBzcGVjaWZpYyBpbml0ICovCisjZW5kaWYgLyogQ09ORklHXzQwNUVQICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfT0NNX0RBVEFfQUREUikgJiYgZGVmaW5lZChDT05GSUdfU1lTX09DTV9EQVRBX1NJWkUpCisjaWYgZGVmaW5lZChDT05GSUdfNDA1RVopCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU2V0dXAgT0NNIC0gT24gQ2hpcCBNZW1vcnkgLSBQUEM0MDVFWiB1c2VzIE9DTSBDb250cm9sbGVyIFYyCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyoKKwkgKiBXZSBjYW4gbWFwIHRoZSBPQ00gb24gdGhlIFBMQjMsIHNvIG1hcCBpdCBhdAorCSAqIENPTkZJR19TWVNfT0NNX0RBVEFfQUREUiArIDB4ODAwMAorCSAqLworCWxpcwlyMyxDT05GSUdfU1lTX09DTV9EQVRBX0FERFJAaAkvKiBPQ00gbG9jYXRpb24gKi8KKwlvcmkJcjMscjMsQ09ORklHX1NZU19PQ01fREFUQV9BRERSQGwKKwlvcmkJcjMscjMsMHgwMjcwCQkvKiAxNksgZm9yIEJhbmsgMSwgUi9XL0VuYWJsZSAqLworCW10ZGNyCU9DTTBfUExCQ1IxLHIzCQkvKiBTZXQgUExCIEFjY2VzcyAqLworCW9yaQlyMyxyMywweDQwMDAJCS8qIEFkZCAweDQwMDAgZm9yIGJhbmsgMiAqLworCW10ZGNyCU9DTTBfUExCQ1IyLHIzCQkvKiBTZXQgUExCIEFjY2VzcyAqLworCWlzeW5jCisKKwlsaXMJcjMsQ09ORklHX1NZU19PQ01fREFUQV9BRERSQGgJLyogT0NNIGxvY2F0aW9uICovCisJb3JpCXIzLHIzLENPTkZJR19TWVNfT0NNX0RBVEFfQUREUkBsCisJb3JpCXIzLHIzLDB4MDI3MAkJLyogMTZLIGZvciBCYW5rIDEsIFIvVy9FbmFibGUgKi8KKwltdGRjcglPQ00wX0RTUkMxLCByMwkJLyogU2V0IERhdGEgU2lkZSAqLworCW10ZGNyCU9DTTBfSVNSQzEsIHIzCQkvKiBTZXQgSW5zdHJ1Y3Rpb24gU2lkZSAqLworCW9yaQlyMyxyMywweDQwMDAJCS8qIEFkZCAweDQwMDAgZm9yIGJhbmsgMiAqLworCW10ZGNyCU9DTTBfRFNSQzIsIHIzCQkvKiBTZXQgRGF0YSBTaWRlICovCisJbXRkY3IJT0NNMF9JU1JDMiwgcjMJCS8qIFNldCBJbnN0cnVjdGlvbiBTaWRlICovCisJYWRkaXMJcjMsMCwweDA4MDAJCS8qIE9DTSBEYXRhIFBhcml0eSBEaXNhYmxlIC0gMSBXYWl0IFN0YXRlICovCisJbXRkY3IJT0NNMF9ESVNEUEMscjMKKworCWlzeW5jCisjZWxzZSAvKiBDT05GSUdfNDA1RVogKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBTZXR1cCBPQ00gLSBPbiBDaGlwIE1lbW9yeQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIFNldHVwIE9DTSAqLworCWxpcwlyMCwgMHg3RkZGCisJb3JpCXIwLCByMCwgMHhGRkZGCisJbWZkY3IJcjMsIE9DTTBfSVNDTlRMCQkvKiBnZXQgaW5zdHItc2lkZSBJUkFNIGNvbmZpZyAqLworCW1mZGNyCXI0LCBPQ00wX0RTQ05UTAkJLyogZ2V0IGRhdGEtc2lkZSBJUkFNIGNvbmZpZyAqLworCWFuZAlyMywgcjMsIHIwCQkvKiBkaXNhYmxlIGRhdGEtc2lkZSBJUkFNICovCisJYW5kCXI0LCByNCwgcjAJCS8qIGRpc2FibGUgZGF0YS1zaWRlIElSQU0gKi8KKwltdGRjcglPQ00wX0lTQ05UTCwgcjMJCS8qIHNldCBpbnN0ci1zaWRlIElSQU0gY29uZmlnICovCisJbXRkY3IJT0NNMF9EU0NOVEwsIHI0CQkvKiBzZXQgZGF0YS1zaWRlIElSQU0gY29uZmlnICovCisJaXN5bmMKKworCWxpcwlyMyxDT05GSUdfU1lTX09DTV9EQVRBX0FERFJAaAkvKiBPQ00gbG9jYXRpb24gKi8KKwlvcmkJcjMscjMsQ09ORklHX1NZU19PQ01fREFUQV9BRERSQGwKKwltdGRjcglPQ00wX0RTQVJDLCByMworCWFkZGlzCXI0LCAwLCAweEMwMDAJCS8qIE9DTSBkYXRhIGFyZWEgZW5hYmxlZCAqLworCW10ZGNyCU9DTTBfRFNDTlRMLCByNAorCWlzeW5jCisjZW5kaWYgLyogQ09ORklHXzQwNUVaICovCisjZW5kaWYKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTZXR1cCB0ZW1wb3Jhcnkgc3RhY2sgaW4gRENBQ0hFIG9yIE9DTSBpZiBuZWVkZWQgZm9yIFNEUkFNIFNQRC4gKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUworCWxpCXI0LCBQQnhBUAorCW10ZGNyCUVCQzBfQ0ZHQUREUiwgcjQKKwlsaXMJcjQsIENPTkZJR19TWVNfSU5JVF9EQ0FDSEVfUEJ4QVJAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfSU5JVF9EQ0FDSEVfUEJ4QVJAbAorCW10ZGNyCUVCQzBfQ0ZHREFUQSwgcjQKKworCWFkZGkJcjQsIDAsIFBCeENSCisJbXRkY3IJRUJDMF9DRkdBRERSLCByNAorCWxpcwlyNCwgQ09ORklHX1NZU19JTklUX0RDQUNIRV9QQnhDUkBoCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19JTklUX0RDQUNIRV9QQnhDUkBsCisJbXRkY3IJRUJDMF9DRkdEQVRBLCByNAorCisJLyoKKwkgKiBFbmFibGUgdGhlIGRhdGEgY2FjaGUgZm9yIHRoZSAxMjhNQiBzdG9yYWdlIGFjY2VzcyBjb250cm9sIHJlZ2lvbgorCSAqIGF0IENPTkZJR19TWVNfSU5JVF9SQU1fQUREUi4KKwkgKi8KKwltZmRjY3IJcjQKKwlvcmlzCXI0LCByNCwgUFBDXzEyOE1CX1NBQ1JfVkFMVUUoQ09ORklHX1NZU19JTklUX1JBTV9BRERSKUBoCisJb3JpCXI0LCByNCwgUFBDXzEyOE1CX1NBQ1JfVkFMVUUoQ09ORklHX1NZU19JTklUX1JBTV9BRERSKUBsCisJbXRkY2NyCXI0CisKKwkvKgorCSAqIFByZWFsbG9jYXRlIGRhdGEgY2FjaGUgbGluZXMgdG8gYmUgdXNlZCB0byBhdm9pZCBhIHN1YnNlcXVlbnQKKwkgKiBjYWNoZSBtaXNzIGFuZCBhbiBlbnN1aW5nIG1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIHdoZW4gZXhjZXB0aW9ucworCSAqIGFyZSBlbmFibGVkLgorCSAqLworCWxpCXIwLCAwCisKKwlsaXMJcjMsIENPTkZJR19TWVNfSU5JVF9SQU1fQUREUkBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19JTklUX1JBTV9BRERSQGwKKworCWxpcwlyNCwgQ09ORklHX1NZU19JTklUX1JBTV9FTkRAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfSU5JVF9SQU1fRU5EQGwKKworCS8qCisJICogQ29udmVydCB0aGUgc2l6ZSwgaW4gYnl0ZXMsIHRvIHRoZSBudW1iZXIgb2YgY2FjaGUgbGluZXMvYmxvY2tzCisJICogdG8gcHJlYWxsb2NhdGUuCisJICovCisJY2xybHdpLiByNSwgcjQsICgzMiAtIEwxX0NBQ0hFX1NISUZUKQorCXNyd2kJcjUsIHI0LCBMMV9DQUNIRV9TSElGVAorCWJlcQkuLmxvYWRfY291bnRlcgorCWFkZGkJcjUsIHI1LCAweDAwMDEKKy4ubG9hZF9jb3VudGVyOgorCW10Y3RyCXI1CisKKwkvKiBQcmVhbGxvY2F0ZSB0aGUgY29tcHV0ZWQgbnVtYmVyIG9mIGNhY2hlIGJsb2Nrcy4gKi8KKy4uYWxsb2NfZGNhY2hlX2Jsb2NrOgorCWRjYmEJcjAsIHIzCisJYWRkaQlyMywgcjMsIEwxX0NBQ0hFX0JZVEVTCisJYmRuegkuLmFsbG9jX2RjYWNoZV9ibG9jaworCXN5bmMKKworCS8qCisJICogTG9hZCB0aGUgaW5pdGlhbCBzdGFjayBwb2ludGVyIGFuZCBkYXRhIGFyZWEgYW5kIGNvbnZlcnQgdGhlIHNpemUsCisJICogaW4gYnl0ZXMsIHRvIHRoZSBudW1iZXIgb2Ygd29yZHMgdG8gaW5pdGlhbGl6ZSB0byBhIGtub3duIHZhbHVlLgorCSAqLworCWxpcwlyMSwgQ09ORklHX1NZU19JTklUX1JBTV9BRERSQGgKKwlvcmkJcjEsIHIxLCBDT05GSUdfU1lTX0lOSVRfU1BfT0ZGU0VUQGwKKworCWxpcwlyNCwgKENPTkZJR19TWVNfSU5JVF9SQU1fRU5EID4+IDIpQGgKKwlvcmkJcjQsIHI0LCAoQ09ORklHX1NZU19JTklUX1JBTV9FTkQgPj4gMilAbAorCW10Y3RyCXI0CisKKwlsaXMJcjIsIENPTkZJR19TWVNfSU5JVF9SQU1fQUREUkBoCisJb3JpCXIyLCByMiwgQ09ORklHX1NZU19JTklUX1JBTV9FTkRAbAorCisJbGlzCXI0LCBDT05GSUdfU1lTX0lOSVRfUkFNX1BBVFRFUk5AaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfSU5JVF9SQU1fUEFUVEVSTkBsCisKKy4uc3RhY2tsb29wOgorCXN0d3UJcjQsIC00KHIyKQorCWJkbnoJLi5zdGFja2xvb3AKKworCS8qCisJICogTWFrZSByb29tIGZvciBzdGFjayBmcmFtZSBoZWFkZXIgYW5kIGNsZWFyIGZpbmFsIHN0YWNrIGZyYW1lIHNvCisJICogdGhhdCBzdGFjayBiYWNrdHJhY2VzIHRlcm1pbmF0ZSBjbGVhbmx5LgorCSAqLworCXN0d3UJcjAsIC00KHIxKQorCXN0d3UJcjAsIC00KHIxKQorCisJLyoKKwkgKiBTZXQgdXAgYSBkdW1teSBmcmFtZSB0byBzdG9yZSByZXNldCB2ZWN0b3IgYXMgcmV0dXJuIGFkZHJlc3MuCisJICogdGhpcyBjYXVzZXMgc3RhY2sgdW5kZXJmbG93IHRvIHJlc2V0IGJvYXJkLgorCSAqLworCXN0d3UJcjEsIC04KHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCisJYWRkaXMJcjAsIDAsIFJFU0VUX1ZFQ1RPUkBoCS8qIEFkZHJlc3Mgb2YgcmVzZXQgdmVjdG9yICovCisJb3JpCXIwLCByMCwgUkVTRVRfVkVDVE9SQGwKKwlzdHd1CXIxLCAtOChyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCXN0dwlyMCwgKzEyKHIxKQkJLyogU2F2ZSByZXR1cm4gYWRkciAodW5kZXJmbG93IHZlY3QpICovCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19URU1QX1NUQUNLX09DTSkgJiYgXAorCShkZWZpbmVkKENPTkZJR19TWVNfT0NNX0RBVEFfQUREUikgJiYgZGVmaW5lZChDT05GSUdfU1lTX09DTV9EQVRBX1NJWkUpKQorCS8qCisJICogU3RhY2sgaW4gT0NNLgorCSAqLworCisJLyogU2V0IHVwIFN0YWNrIGF0IHRvcCBvZiBPQ00gKi8KKwlsaXMJcjEsIChDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIgKyBDT05GSUdfU1lTX0lOSVRfU1BfT0ZGU0VUKUBoCisJb3JpCXIxLCByMSwgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfSU5JVF9TUF9PRkZTRVQpQGwKKworCS8qIFNldCB1cCBhIHplcm9pemVkIHN0YWNrIGZyYW1lIHNvIHRoYXQgYmFja3RyYWNlIHdvcmtzIHJpZ2h0ICovCisJbGkJcjAsIDAKKwlzdHd1CXIwLCAtNChyMSkKKwlzdHd1CXIwLCAtNChyMSkKKworCS8qCisJICogU2V0IHVwIGEgZHVtbXkgZnJhbWUgdG8gc3RvcmUgcmVzZXQgdmVjdG9yIGFzIHJldHVybiBhZGRyZXNzLgorCSAqIHRoaXMgY2F1c2VzIHN0YWNrIHVuZGVyZmxvdyB0byByZXNldCBib2FyZC4KKwkgKi8KKwlzdHd1CXIxLCAtOChyMSkJCS8qIFNhdmUgYmFjayBjaGFpbiBhbmQgbW92ZSBTUCAqLworCWxpcwlyMCwgUkVTRVRfVkVDVE9SQGgJLyogQWRkcmVzcyBvZiByZXNldCB2ZWN0b3IgKi8KKwlvcmkJcjAsIHIwLCBSRVNFVF9WRUNUT1JAbAorCXN0d3UJcjEsIC04KHIxKQkJLyogU2F2ZSBiYWNrIGNoYWluIGFuZCBtb3ZlIFNQICovCisJc3R3CXIwLCArMTIocjEpCQkvKiBTYXZlIHJldHVybiBhZGRyICh1bmRlcmZsb3cgdmVjdCkgKi8KKyNlbmRpZiAvKiBDT05GSUdfU1lTX0lOSVRfRENBQ0hFX0NTICovCisKKyNpZmRlZiBDT05GSUdfTkFORF9TUEwKKwlibAluYW5kX2Jvb3RfY29tbW9uCS8qIHdpbGwgbm90IHJldHVybiAqLworI2Vsc2UKKwlHRVRfR09UCQkJLyogaW5pdGlhbGl6ZSBHT1QgYWNjZXNzCQkJKi8KKworCWJsCWNwdV9pbml0X2YJLyogcnVuIGxvdy1sZXZlbCBDUFUgaW5pdCBjb2RlCSAgIChmcm9tIEZsYXNoKSAqLworCisJLyogTkVWRVIgUkVUVVJOUyEgKi8KKwlibAlib2FyZF9pbml0X2YJLyogcnVuIGZpcnN0IHBhcnQgb2YgaW5pdCBjb2RlIChmcm9tIEZsYXNoKQkqLworI2VuZGlmIC8qIENPTkZJR19OQU5EX1NQTCAqLworCisjZW5kaWYJLyogQ09ORklHXzQwNUdQIHx8IENPTkZJR180MDVDUiB8fCBDT05GSUdfNDA1IHx8IENPTkZJR180MDVFUCAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjaWZuZGVmIENPTkZJR19OQU5EX1NQTAorLyoKKyAqIFRoaXMgY29kZSBmaW5pc2hlcyBzYXZpbmcgdGhlIHJlZ2lzdGVycyB0byB0aGUgZXhjZXB0aW9uIGZyYW1lCisgKiBhbmQganVtcHMgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgZm9yIHRoZSBleGNlcHRpb24uCisgKiBSZWdpc3RlciByMjEgaXMgcG9pbnRlciBpbnRvIHRyYXAgZnJhbWUsIHIxIGhhcyBuZXcgc3RhY2sgcG9pbnRlci4KKyAqLworCS5nbG9ibAl0cmFuc2Zlcl90b19oYW5kbGVyCit0cmFuc2Zlcl90b19oYW5kbGVyOgorCXN0dwlyMjIsX05JUChyMjEpCisJbGlzCXIyMixNU1JfUE9XQGgKKwlhbmRjCXIyMyxyMjMscjIyCisJc3R3CXIyMyxfTVNSKHIyMSkKKwlTQVZFX0dQUig3LCByMjEpCisJU0FWRV80R1BSUyg4LCByMjEpCisJU0FWRV84R1BSUygxMiwgcjIxKQorCVNBVkVfOEdQUlMoMjQsIHIyMSkKKwltZmxyCXIyMworCWFuZGkuCXIyNCxyMjMsMHgzZjAwCQkvKiBnZXQgdmVjdG9yIG9mZnNldCAqLworCXN0dwlyMjQsVFJBUChyMjEpCisJbGkJcjIyLDAKKwlzdHcJcjIyLFJFU1VMVChyMjEpCisJbXRzcHIJU1BSRzIscjIyCQkvKiByMSBpcyBub3cga2VybmVsIHNwICovCisJbHd6CXIyNCwwKHIyMykJCS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBoYW5kbGVyICovCisJbHd6CXIyMyw0KHIyMykJCS8qIHdoZXJlIHRvIGdvIHdoZW4gZG9uZSAqLworCW10c3ByCVNSUjAscjI0CisJbXRzcHIJU1JSMSxyMjAKKwltdGxyCXIyMworCVNZTkMKKwlyZmkJCQkJLyoganVtcCB0byBoYW5kbGVyLCBlbmFibGUgTU1VICovCisKK2ludF9yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1JSMCxyMgorCW10c3ByCVNSUjEscjAKKwlsd3oJcjAsR1BSMChyMSkKKwlsd3oJcjIsR1BSMihyMSkKKwlsd3oJcjEsR1BSMShyMSkKKwlTWU5DCisJcmZpCisKK2NyaXRfcmV0dXJuOgorCW1mbXNyCXIyOAkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbGkJcjQsMAorCW9yaQlyNCxyNCxNU1JfRUUKKwlhbmRjCXIyOCxyMjgscjQKKwlTWU5DCQkJLyogU29tZSBjaGlwIHJldnMgbmVlZCB0aGlzLi4uICovCisJbXRtc3IJcjI4CisJU1lOQworCWx3eglyMixfQ1RSKHIxKQorCWx3eglyMCxfTElOSyhyMSkKKwltdGN0cglyMgorCW10bHIJcjAKKwlsd3oJcjIsX1hFUihyMSkKKwlsd3oJcjAsX0NDUihyMSkKKwltdHNwcglYRVIscjIKKwltdGNyZgkweEZGLHIwCisJUkVTVF8xMEdQUlMoMywgcjEpCisJUkVTVF8xMEdQUlMoMTMsIHIxKQorCVJFU1RfOEdQUlMoMjMsIHIxKQorCVJFU1RfR1BSKDMxLCByMSkKKwlsd3oJcjIsX05JUChyMSkJLyogUmVzdG9yZSBlbnZpcm9ubWVudCAqLworCWx3eglyMCxfTVNSKHIxKQorCW10c3ByCVNQUk5fQ1NSUjAscjIKKwltdHNwcglTUFJOX0NTUlIxLHIwCisJbHd6CXIwLEdQUjAocjEpCisJbHd6CXIyLEdQUjIocjEpCisJbHd6CXIxLEdQUjEocjEpCisJU1lOQworCXJmY2kKKworI2lmZGVmIENPTkZJR180NDAKK21ja19yZXR1cm46CisJbWZtc3IJcjI4CQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlsaQlyNCwwCisJb3JpCXI0LHI0LE1TUl9FRQorCWFuZGMJcjI4LHIyOCxyNAorCVNZTkMJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMjgKKwlTWU5DCisJbHd6CXIyLF9DVFIocjEpCisJbHd6CXIwLF9MSU5LKHIxKQorCW10Y3RyCXIyCisJbXRscglyMAorCWx3eglyMixfWEVSKHIxKQorCWx3eglyMCxfQ0NSKHIxKQorCW10c3ByCVhFUixyMgorCW10Y3JmCTB4RkYscjAKKwlSRVNUXzEwR1BSUygzLCByMSkKKwlSRVNUXzEwR1BSUygxMywgcjEpCisJUkVTVF84R1BSUygyMywgcjEpCisJUkVTVF9HUFIoMzEsIHIxKQorCWx3eglyMixfTklQKHIxKQkvKiBSZXN0b3JlIGVudmlyb25tZW50ICovCisJbHd6CXIwLF9NU1IocjEpCisJbXRzcHIJU1BSTl9NQ1NSUjAscjIKKwltdHNwcglTUFJOX01DU1JSMSxyMAorCWx3eglyMCxHUFIwKHIxKQorCWx3eglyMixHUFIyKHIxKQorCWx3eglyMSxHUFIxKHIxKQorCVNZTkMKKwlyZm1jaQorI2VuZGlmIC8qIENPTkZJR180NDAgKi8KKworCisJLmdsb2JsIGdldF9wdnIKK2dldF9wdnI6CisJbWZzcHIJcjMsIFBWUgorCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgb3V0MTYgKi8KKy8qIERlc2NyaXB0aW9uOgkgT3V0cHV0IDE2IGJpdHMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlvdXQxNgorb3V0MTY6CisJc3RoCXI0LDB4MDAwMChyMykKKwlibHIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBGdW5jdGlvbjoJIG91dDE2ciAqLworLyogRGVzY3JpcHRpb246CSBCeXRlIHJldmVyc2UgYW5kIG91dHB1dCAxNiBiaXRzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJb3V0MTZyCitvdXQxNnI6CisJc3RoYnJ4CXI0LHIwLHIzCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBvdXQzMnIgKi8KKy8qIERlc2NyaXB0aW9uOgkgQnl0ZSByZXZlcnNlIGFuZCBvdXRwdXQgMzIgYml0cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCW91dDMycgorb3V0MzJyOgorCXN0d2JyeAlyNCxyMCxyMworCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgaW4xNiAqLworLyogRGVzY3JpcHRpb246CSBJbnB1dCAxNiBiaXRzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJaW4xNgoraW4xNjoKKwlsaHoJcjMsMHgwMDAwKHIzKQorCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgaW4xNnIgKi8KKy8qIERlc2NyaXB0aW9uOgkgSW5wdXQgMTYgYml0cyBhbmQgYnl0ZSByZXZlcnNlICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJaW4xNnIKK2luMTZyOgorCWxoYnJ4CXIzLHIwLHIzCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBpbjMyciAqLworLyogRGVzY3JpcHRpb246CSBJbnB1dCAzMiBiaXRzIGFuZCBieXRlIHJldmVyc2UgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlpbjMycgoraW4zMnI6CisJbHdicngJcjMscjAscjMKKwlibHIKKworLyoKKyAqIHZvaWQgcmVsb2NhdGVfY29kZSAoYWRkcl9zcCwgZ2QsIGFkZHJfbW9uaSkKKyAqCisgKiBUaGlzICJmdW5jdGlvbiIgZG9lcyBub3QgcmV0dXJuLCBpbnN0ZWFkIGl0IGNvbnRpbnVlcyBpbiBSQU0KKyAqIGFmdGVyIHJlbG9jYXRpbmcgdGhlIG1vbml0b3IgY29kZS4KKyAqCisgKiByMyA9IFJlbG9jYXRlZCBzdGFjayBwb2ludGVyCisgKiByNCA9IFJlbG9jYXRlZCBnbG9iYWwgZGF0YSBwb2ludGVyCisgKiByNSA9IFJlbG9jYXRlZCB0ZXh0IHBvaW50ZXIKKyAqLworCS5nbG9ibAlyZWxvY2F0ZV9jb2RlCityZWxvY2F0ZV9jb2RlOgorI2lmIGRlZmluZWQoQ09ORklHXzR4eF9EQ0FDSEUpIHx8IGRlZmluZWQoQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUykKKwkvKgorCSAqIFdlIG5lZWQgdG8gZmx1c2ggdGhlIGluaXRpYWwgZ2xvYmFsIGRhdGEgKGdkX3QpIGJlZm9yZSB0aGUgZGNhY2hlCisJICogd2lsbCBiZSBpbnZhbGlkYXRlZC4KKwkgKi8KKworCS8qIFNhdmUgcmVnaXN0ZXJzICovCisJbXIJcjksIHIzCisJbXIJcjEwLCByNAorCW1yCXIxMSwgcjUKKworCS8qIEZsdXNoIGluaXRpYWwgZ2xvYmFsIGRhdGEgcmFuZ2UgKi8KKwltcglyMywgcjQKKwlhZGRpCXI0LCByNCwgQ09ORklHX1NZU19HQkxfREFUQV9TSVpFQGwKKwlibAlmbHVzaF9kY2FjaGVfcmFuZ2UKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUykKKwkvKgorCSAqIFVuZG8gdGhlIGVhcmxpZXIgZGF0YSBjYWNoZSBzZXQtdXAgZm9yIHRoZSBwcmltb3JkaWFsIHN0YWNrIGFuZAorCSAqIGRhdGEgYXJlYS4gRmlyc3QsIGludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUgYW5kIHRoZW4gZGlzYWJsZSBkYXRhCisJICogY2FjaGVhYmlsaXR5IGZvciB0aGF0IGFyZWEuIEZpbmFsbHksIHJlc3RvcmUgdGhlIEVCQyB2YWx1ZXMsIGlmCisJICogYW55LgorCSAqLworCisJLyogSW52YWxpZGF0ZSB0aGUgcHJpbW9yZGlhbCBzdGFjayBhbmQgZGF0YSBhcmVhIGluIGNhY2hlICovCisJbGlzCXIzLCBDT05GSUdfU1lTX0lOSVRfUkFNX0FERFJAaAorCW9yaQlyMywgcjMsIENPTkZJR19TWVNfSU5JVF9SQU1fQUREUkBsCisKKwlsaXMJcjQsIENPTkZJR19TWVNfSU5JVF9SQU1fRU5EQGgKKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX0lOSVRfUkFNX0VOREBsCisJYWRkCXI0LCByNCwgcjMKKworCWJsCWludmFsaWRhdGVfZGNhY2hlX3JhbmdlCisKKwkvKiBEaXNhYmxlIGNhY2hlYWJpbGl0eSBmb3IgdGhlIHJlZ2lvbiAqLworCW1mZGNjcglyMworCWxpcyAgICAgcjQsIH5QUENfMTI4TUJfU0FDUl9WQUxVRShDT05GSUdfU1lTX0lOSVRfUkFNX0FERFIpQGgKKwlvcmkgICAgIHI0LCByNCwgflBQQ18xMjhNQl9TQUNSX1ZBTFVFKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUilAbAorCWFuZCAgICAgcjMsIHIzLCByNAorCW10ZGNjciAgcjMKKworCS8qIFJlc3RvcmUgdGhlIEVCQyBwYXJhbWV0ZXJzICovCisJbGkJcjMsIFBCeEFQCisJbXRkY3IJRUJDMF9DRkdBRERSLCByMworCWxpcwlyMywgUEJ4QVBfVkFMQGgKKwlvcmkJcjMsIHIzLCBQQnhBUF9WQUxAbAorCW10ZGNyCUVCQzBfQ0ZHREFUQSwgcjMKKworCWxpCXIzLCBQQnhDUgorCW10ZGNyCUVCQzBfQ0ZHQUREUiwgcjMKKwlsaXMJcjMsIFBCeENSX1ZBTEBoCisJb3JpCXIzLCByMywgUEJ4Q1JfVkFMQGwKKwltdGRjcglFQkMwX0NGR0RBVEEsIHIzCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX0lOSVRfRENBQ0hFX0NTKSAqLworCisJLyogUmVzdG9yZSByZWdpc3RlcnMgKi8KKwltcglyMywgcjkKKwltcglyNCwgcjEwCisJbXIJcjUsIHIxMQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHXzR4eF9EQ0FDSEUpIHx8IGRlZmluZWQoQ09ORklHX1NZU19JTklUX0RDQUNIRV9DUykgKi8KKworI2lmZGVmIENPTkZJR19TWVNfSU5JVF9SQU1fRENBQ0hFCisJLyoKKwkgKiBVbmxvY2sgdGhlIHByZXZpb3VzbHkgbG9ja2VkIGQtY2FjaGUKKwkgKi8KKwltc3luYworCWlzeW5jCisJLyogc2V0IFRGTE9PUi9ORkxPT1IgdG8gMCBhZ2FpbiAqLworCWxpcwlyNiwweDAwMDEKKwlvcmkJcjYscjYsMHhmODAwCisJbXRzcHIJU1BSTl9EVkxJTSxyNgorCWxpcwlyNiwweDAwMDAKKwlvcmkJcjYscjYsMHgwMDAwCisJbXRzcHIJU1BSTl9ETlYwLHI2CisJbXRzcHIJU1BSTl9ETlYxLHI2CisJbXRzcHIJU1BSTl9ETlYyLHI2CisJbXRzcHIJU1BSTl9ETlYzLHI2CisJbXRzcHIJU1BSTl9EVFYwLHI2CisJbXRzcHIJU1BSTl9EVFYxLHI2CisJbXRzcHIJU1BSTl9EVFYyLHI2CisJbXRzcHIJU1BSTl9EVFYzLHI2CisJbXN5bmMKKwlpc3luYworI2VuZGlmIC8qIENPTkZJR19TWVNfSU5JVF9SQU1fRENBQ0hFICovCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDBFUCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1IpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NDBFUFgpIHx8IGRlZmluZWQoQ09ORklHXzQ0MEdSWCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHXzQ0MFNQKSB8fCBkZWZpbmVkKENPTkZJR180NDBTUEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NjBFWCkgfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR180NjBTWCkKKwkvKgorCSAqIE9uIHNvbWUgNDQwZXIgcGxhdGZvcm1zIHRoZSBjYWNoZSBpcyBlbmFibGVkIGluIHRoZSBmaXJzdCBUTEIgKEJvb3QtQ1MpCisJICogdG8gc3BlZWQgdXAgdGhlIGJvb3QgcHJvY2Vzcy4gTm93IHRoaXMgY2FjaGUgbmVlZHMgdG8gYmUgZGlzYWJsZWQuCisJICovCisJaWNjY2kJMCwwCQkJLyogSW52YWxpZGF0ZSBpbnN0IGNhY2hlICovCisJZGNjY2kJMCwwCQkJLyogSW52YWxpZGF0ZSBkYXRhIGNhY2hlLCBub3cgbm8gbG9uZ2VyIG91ciBzdGFjayAqLworCXN5bmMKKwlpc3luYworCisJLyogQ2xlYXIgYWxsIHBvdGVudGlhbCBwZW5kaW5nIGV4Y2VwdGlvbnMgKi8KKwltZnNwcglyMSxTUFJOX01DU1IKKwltdHNwcglTUFJOX01DU1IscjEKKyNpZmRlZiBDT05GSUdfU1lTX1RMQl9GT1JfQk9PVF9GTEFTSAorCWFkZGkJcjEscjAsQ09ORklHX1NZU19UTEJfRk9SX0JPT1RfRkxBU0gJLyogVXNlIGRlZmluZWQgVExCICovCisjZWxzZQorCWFkZGkJcjEscjAsMHgwMDAwCQkvKiBEZWZhdWx0IFRMQiBlbnRyeSBpcyAjMCAqLworI2VuZGlmIC8qIENPTkZJR19TWVNfVExCX0ZPUl9CT09UX0ZMQVNIICovCisJdGxicmUJcjAscjEsMHgwMDAyCQkvKiBSZWFkIGNvbnRlbnRzICovCisJb3JpCXIwLHIwLDB4MGMwMAkJLyogT3IgaW4gdGhlIGluaGliaXQsIHdyaXRlIHRocm91Z2ggYml0ICovCisJdGxid2UJcjAscjEsMHgwMDAyCQkvKiBTYXZlIGl0IG91dCAqLworCXN5bmMKKwlpc3luYworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCAuLi4gfHwgZGVmaW5lZChDT05GSUdfNDYwR1QpICovCisJbXIJcjEsICByMwkJLyogU2V0IG5ldyBzdGFjayBwb2ludGVyCQkqLworCW1yCXI5LCAgcjQJCS8qIFNhdmUgY29weSBvZiBJbml0IERhdGEgcG9pbnRlcgkqLworCW1yCXIxMCwgcjUJCS8qIFNhdmUgY29weSBvZiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisKKwlHRVRfR09UCisJbXIJcjMsICByNQkJCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCSovCisJbGlzCXI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBoCQkvKiBTb3VyY2UgICAgICBBZGRyZXNzCSovCisJb3JpCXI0LCByNCwgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWx3eglyNSwgR09UKF9faW5pdF9lbmQpCisJc3ViCXI1LCByNSwgcjQKKwlsaQlyNiwgTDFfQ0FDSEVfQllURVMJCS8qIENhY2hlIExpbmUgU2l6ZQkqLworCisJLyoKKwkgKiBGaXggR09UIHBvaW50ZXI6CisJICoKKwkgKiBOZXcgR09ULVBUUiA9IChvbGQgR09ULVBUUiAtIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFKSArIERlc3RpbmF0aW9uIEFkZHJlc3MKKwkgKgorCSAqIE9mZnNldDoKKwkgKi8KKwlzdWIJcjE1LCByMTAsIHI0CisKKwkvKiBGaXJzdCBvdXIgb3duIEdPVCAqLworCWFkZAlyMTIsIHIxMiwgcjE1CisJLyogdGhlbiB0aGUgb25lIHVzZWQgYnkgdGhlIEMgY29kZSAqLworCWFkZAlyMzAsIHIzMCwgcjE1CisKKwkvKgorCSAqIE5vdyByZWxvY2F0ZSBjb2RlCisJICovCisKKwljbXBsdwljcjEscjMscjQKKwlhZGRpCXIwLHI1LDMKKwlzcndpLglyMCxyMCwyCisJYmVxCWNyMSw0ZgkJLyogSW4gcGxhY2UgY29weSBpcyBub3QgbmVjZXNzYXJ5CSovCisJYmVxCTdmCQkvKiBQcm90ZWN0IGFnYWluc3QgMCBjb3VudAkJKi8KKwltdGN0cglyMAorCWJnZQljcjEsMmYKKworCWxhCXI4LC00KHI0KQorCWxhCXI3LC00KHIzKQorMToJbHd6dQlyMCw0KHI4KQorCXN0d3UJcjAsNChyNykKKwliZG56CTFiCisJYgk0ZgorCisyOglzbHdpCXIwLHIwLDIKKwlhZGQJcjgscjQscjAKKwlhZGQJcjcscjMscjAKKzM6CWx3enUJcjAsLTQocjgpCisJc3R3dQlyMCwtNChyNykKKwliZG56CTNiCisKKy8qCisgKiBOb3cgZmx1c2ggdGhlIGNhY2hlOiBub3RlIHRoYXQgd2UgbXVzdCBzdGFydCBmcm9tIGEgY2FjaGUgYWxpZ25lZAorICogYWRkcmVzcy4gT3RoZXJ3aXNlIHdlIG1pZ2h0IG1pc3Mgb25lIGNhY2hlIGxpbmUuCisgKi8KKzQ6CWNtcHdpCXI2LDAKKwlhZGQJcjUscjMscjUKKwliZXEJN2YJCS8qIEFsd2F5cyBmbHVzaCBwcmVmZXRjaCBxdWV1ZSBpbiBhbnkgY2FzZSAqLworCXN1YmkJcjAscjYsMQorCWFuZGMJcjMscjMscjAKKwltcglyNCxyMworNToJZGNic3QJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTViCisJc3luYwkJCS8qIFdhaXQgZm9yIGFsbCBkY2JzdCB0byBjb21wbGV0ZSBvbiBidXMgKi8KKwltcglyNCxyMworNjoJaWNiaQkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNmIKKzc6CXN5bmMJCQkvKiBXYWl0IGZvciBhbGwgaWNiaSB0byBjb21wbGV0ZSBvbiBidXMgKi8KKwlpc3luYworCisvKgorICogV2UgYXJlIGRvbmUuIERvIG5vdCByZXR1cm4sIGluc3RlYWQgYnJhbmNoIHRvIHNlY29uZCBwYXJ0IG9mIGJvYXJkCisgKiBpbml0aWFsaXphdGlvbiwgbm93IHJ1bm5pbmcgZnJvbSBSQU0uCisgKi8KKworCWFkZGkJcjAsIHIxMCwgaW5fcmFtIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCW10bHIJcjAKKwlibHIJCQkJLyogTkVWRVIgUkVUVVJOUyEgKi8KKworaW5fcmFtOgorCisJLyoKKwkgKiBSZWxvY2F0aW9uIEZ1bmN0aW9uLCByMTIgcG9pbnQgdG8gZ290MisweDgwMDAKKwkgKgorCSAqIEFkanVzdCBnb3QyIHBvaW50ZXJzLCBubyBuZWVkIHRvIGNoZWNrIGZvciAwLCB0aGlzIGNvZGUKKwkgKiBhbHJlYWR5IHB1dHMgYSBmZXcgZW50cmllcyBpbiB0aGUgdGFibGUuCisJICovCisJbGkJcjAsX19nb3QyX2VudHJpZXNAc2VjdG9mZkBsCisJbGEJcjMsR09UKF9HT1QyX1RBQkxFXykKKwlsd3oJcjExLEdPVChfR09UMl9UQUJMRV8pCisJbXRjdHIJcjAKKwlzdWIJcjExLHIzLHIxMQorCWFkZGkJcjMscjMsLTQKKzE6CWx3enUJcjAsNChyMykKKwljbXB3aQlyMCwwCisJYmVxLQkyZgorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjAsMChyMykKKzI6CWJkbnoJMWIKKworCS8qCisJICogTm93IGFkanVzdCB0aGUgZml4dXBzIGFuZCB0aGUgcG9pbnRlcnMgdG8gdGhlIGZpeHVwcworCSAqIGluIGNhc2Ugd2UgbmVlZCB0byBtb3ZlIG91cnNlbHZlcyBhZ2Fpbi4KKwkgKi8KKwlsaQlyMCxfX2ZpeHVwX2VudHJpZXNAc2VjdG9mZkBsCisJbHd6CXIzLEdPVChfRklYVVBfVEFCTEVfKQorCWNtcHdpCXIwLDAKKwltdGN0cglyMAorCWFkZGkJcjMscjMsLTQKKwliZXEJNGYKKzM6CWx3enUJcjQsNChyMykKKwlsd3p1eAlyMCxyNCxyMTEKKwlhZGQJcjAscjAscjExCisJc3R3CXIxMCwwKHIzKQorCXN0dwlyMCwwKHI0KQorCWJkbnoJM2IKKzQ6CitjbGVhcl9ic3M6CisJLyoKKwkgKiBOb3cgY2xlYXIgQlNTIHNlZ21lbnQKKwkgKi8KKwlsd3oJcjMsR09UKF9fYnNzX3N0YXJ0KQorCWx3eglyNCxHT1QoX2VuZCkKKworCWNtcGx3CTAsIHIzLCByNAorCWJlcQk3ZgorCisJbGkJcjAsIDAKKworCWFuZGkuCXI1LCByNCwgMworCWJlcQk2ZgorCXN1YglyNCwgcjQsIHI1CisJbXRjdHIJcjUKKwltcglyNSwgcjQKKzU6CXN0YglyMCwgMChyNSkKKwlhZGRpCXI1LCByNSwgMQorCWJkbnoJNWIKKzY6CisJc3R3CXIwLCAwKHIzKQorCWFkZGkJcjMsIHIzLCA0CisJY21wbHcJMCwgcjMsIHI0CisJYm5lCTZiCisKKzc6CisJbXIJcjMsIHI5CQkvKiBJbml0IERhdGEgcG9pbnRlcgkJKi8KKwltcglyNCwgcjEwCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzCQkqLworCWJsCWJvYXJkX2luaXRfcgorCisJLyoKKwkgKiBDb3B5IGV4Y2VwdGlvbiB2ZWN0b3IgY29kZSB0byBsb3cgbWVtb3J5CisJICoKKwkgKiByMzogZGVzdF9hZGRyCisJICogcjc6IHNvdXJjZSBhZGRyZXNzLCByODogZW5kIGFkZHJlc3MsIHI5OiB0YXJnZXQgYWRkcmVzcworCSAqLworCS5nbG9ibAl0cmFwX2luaXQKK3RyYXBfaW5pdDoKKwltZmxyCXI0CQkJLyogc2F2ZSBsaW5rIHJlZ2lzdGVyCQkqLworCUdFVF9HT1QKKwlsd3oJcjcsIEdPVChfc3RhcnRfb2ZfdmVjdG9ycykKKwlsd3oJcjgsIEdPVChfZW5kX29mX3ZlY3RvcnMpCisKKwlsaQlyOSwgMHgxMDAJCS8qIHJlc2V0IHZlY3RvciBhbHdheXMgYXQgMHgxMDAgKi8KKworCWNtcGx3CTAsIHI3LCByOAorCWJnZWxyCQkJCS8qIHJldHVybiBpZiByNz49cjggLSBqdXN0IGluIGNhc2UgKi8KKzE6CisJbHd6CXIwLCAwKHI3KQorCXN0dwlyMCwgMChyOSkKKwlhZGRpCXI3LCByNywgNAorCWFkZGkJcjksIHI5LCA0CisJY21wbHcJMCwgcjcsIHI4CisJYm5lCTFiCisKKwkvKgorCSAqIHJlbG9jYXRlIGBoZGxyJyBhbmQgYGludF9yZXR1cm4nIGVudHJpZXMKKwkgKi8KKwlsaQlyNywgLkxfTWFjaGluZUNoZWNrIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWxpCXI4LCBBbGlnbm1lbnQgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisyOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvciAqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkyYgorCisJbGkJcjcsIC5MX0FsaWdubWVudCAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfUHJvZ3JhbUNoZWNrIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKworI2lmZGVmIENPTkZJR180NDAKKwlsaQlyNywgLkxfRlBVbmF2YWlsYWJsZSAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfRGVjcmVtZW50ZXIgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJYmwJdHJhcF9yZWxvYworCisJbGkJcjcsIC5MX0FQVSAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfSW5zdHJ1Y3Rpb25UTEJFcnJvciAtIF9zdGFydCArIF9TVEFSVF9PRkZTRVQKKwlibAl0cmFwX3JlbG9jCisKKwlsaQlyNywgLkxfRGF0YVRMQkVycm9yIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKyNlbHNlIC8qIENPTkZJR180NDAgKi8KKwlsaQlyNywgLkxfUElUIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9JbnN0cnVjdGlvblRMQk1pc3MgLSBfc3RhcnQgKyBfU1RBUlRfT0ZGU0VUCisJYmwJdHJhcF9yZWxvYworCisJbGkJcjcsIC5MX0RhdGFUTEJNaXNzIC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKyNlbmRpZiAvKiBDT05GSUdfNDQwICovCisKKwlsaQlyNywgLkxfRGVidWdCcmVha3BvaW50IC0gX3N0YXJ0ICsgX1NUQVJUX09GRlNFVAorCWJsCXRyYXBfcmVsb2MKKworI2lmICFkZWZpbmVkKENPTkZJR180NDApCisJYWRkaQlyNyxyMCwweDEwMDAJCS8qIHNldCBNRSBiaXQgKE1hY2hpbmUgRXhjZXB0aW9ucykgKi8KKwlvcmlzCXI3LHI3LDB4MDAwMgkJLyogc2V0IENFIGJpdCAoQ3JpdGljYWwgRXhjZXB0aW9ucykgKi8KKwltdG1zcglyNwkJCS8qIGNoYW5nZSBNU1IgKi8KKyNlbHNlCisJYmwJX180NDBfbXNyX3NldAorCWIJX180NDBfbXNyX2NvbnRpbnVlCisKK19fNDQwX21zcl9zZXQ6CisJYWRkaQlyNyxyMCwweDEwMDAJCS8qIHNldCBNRSBiaXQgKE1hY2hpbmUgRXhjZXB0aW9ucykgKi8KKwlvcmlzCXI3LHI3LDB4MDAwMgkJLyogc2V0IENFIGJpdCAoQ3JpdGljYWwgRXhjZXB0aW9ucykgKi8KKwltdHNwcglTUFJOX1NSUjEscjcKKwltZmxyCXI3CisJbXRzcHIJU1BSTl9TUlIwLHI3CisJcmZpCitfXzQ0MF9tc3JfY29udGludWU6CisjZW5kaWYKKworCW10bHIJcjQJCQkvKiByZXN0b3JlIGxpbmsgcmVnaXN0ZXIJKi8KKwlibHIKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgZGNiel9hcmVhLgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWZ1bmN0aW9uX3Byb2xvZyhkY2J6X2FyZWEpCisJcmx3aW5tLiByNSxyNCwwLDI3LDMxCisJcmx3aW5tCXI1LHI0LDI3LDUsMzEKKwliZXEJLi5kX3JhMgorCWFkZGkJcjUscjUsMHgwMDAxCisuLmRfcmEyOm10Y3RyCXI1CisuLmRfYWcyOmRjYnoJcjAscjMKKwlhZGRpCXIzLHIzLDMyCisJYmRuegkuLmRfYWcyCisJc3luYworCWJscgorCWZ1bmN0aW9uX2VwaWxvZyhkY2J6X2FyZWEpCisjZW5kaWYgLyogQ09ORklHXzQ0MCAqLworI2VuZGlmIC8qIENPTkZJR19OQU5EX1NQTCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgaW44ICovCisvKiBEZXNjcmlwdGlvbjoJIElucHV0IDggYml0cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCWluOAoraW44OgorCWxieglyMywweDAwMDAocjMpCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBvdXQ4ICovCisvKiBEZXNjcmlwdGlvbjoJIE91dHB1dCA4IGJpdHMgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS5nbG9ibAlvdXQ4CitvdXQ4OgorCXN0YglyNCwweDAwMDAocjMpCisJYmxyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb246CSBvdXQzMiAqLworLyogRGVzY3JpcHRpb246CSBPdXRwdXQgMzIgYml0cyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLmdsb2JsCW91dDMyCitvdXQzMjoKKwlzdHcJcjQsMHgwMDAwKHIzKQorCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEZ1bmN0aW9uOgkgaW4zMiAqLworLyogRGVzY3JpcHRpb246CSBJbnB1dCAzMiBiaXRzICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkuZ2xvYmwJaW4zMgoraW4zMjoKKwlsd3oJMywweDAwMDAoMykKKwlibHIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUFBDNDA1RVAgc3BlY2lmaWMgc3R1ZmYJCQkJCQkgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHXzQwNUVQCitwcGM0MDVlcF9pbml0OgorCisjaWZkZWYgQ09ORklHX0JVQklOR0EKKwkvKgorCSAqIEluaXRpYWxpemUgRUJDIGNoaXAgc2VsZWN0cyAxICYgNCBhbmQgR1BJTyBwaW5zIChmb3IgYWx0ZXJuYXRlCisJICogZnVuY3Rpb24pIHRvIHN1cHBvcnQgRlBHQSBhbmQgTlZSQU0gYWNjZXNzZXMgYmVsb3cuCisJICovCisKKwlsaXMJcjMsR1BJTzBfT1NSSEBoCQkvKiBjb25maWcgR1BJTyBvdXRwdXQgc2VsZWN0ICovCisJb3JpCXIzLHIzLEdQSU8wX09TUkhAbAorCWxpcwlyNCxDT05GSUdfU1lTX0dQSU8wX09TUkhAaAorCW9yaQlyNCxyNCxDT05GSUdfU1lTX0dQSU8wX09TUkhAbAorCXN0dwlyNCwwKHIzKQorCWxpcwlyMyxHUElPMF9PU1JMQGgKKwlvcmkJcjMscjMsR1BJTzBfT1NSTEBsCisJbGlzCXI0LENPTkZJR19TWVNfR1BJTzBfT1NSTEBoCisJb3JpCXI0LHI0LENPTkZJR19TWVNfR1BJTzBfT1NSTEBsCisJc3R3CXI0LDAocjMpCisKKwlsaXMJcjMsR1BJTzBfSVNSMUhAaAkvKiBjb25maWcgR1BJTyBpbnB1dCBzZWxlY3QgKi8KKwlvcmkJcjMscjMsR1BJTzBfSVNSMUhAbAorCWxpcwlyNCxDT05GSUdfU1lTX0dQSU8wX0lTUjFIQGgKKwlvcmkJcjQscjQsQ09ORklHX1NZU19HUElPMF9JU1IxSEBsCisJc3R3CXI0LDAocjMpCisJbGlzCXIzLEdQSU8wX0lTUjFMQGgKKwlvcmkJcjMscjMsR1BJTzBfSVNSMUxAbAorCWxpcwlyNCxDT05GSUdfU1lTX0dQSU8wX0lTUjFMQGgKKwlvcmkJcjQscjQsQ09ORklHX1NZU19HUElPMF9JU1IxTEBsCisJc3R3CXI0LDAocjMpCisKKwlsaXMJcjMsR1BJTzBfVFNSSEBoCQkvKiBjb25maWcgR1BJTyB0aHJlZS1zdGF0ZSBzZWxlY3QgKi8KKwlvcmkJcjMscjMsR1BJTzBfVFNSSEBsCisJbGlzCXI0LENPTkZJR19TWVNfR1BJTzBfVFNSSEBoCisJb3JpCXI0LHI0LENPTkZJR19TWVNfR1BJTzBfVFNSSEBsCisJc3R3CXI0LDAocjMpCisJbGlzCXIzLEdQSU8wX1RTUkxAaAorCW9yaQlyMyxyMyxHUElPMF9UU1JMQGwKKwlsaXMJcjQsQ09ORklHX1NZU19HUElPMF9UU1JMQGgKKwlvcmkJcjQscjQsQ09ORklHX1NZU19HUElPMF9UU1JMQGwKKwlzdHcJcjQsMChyMykKKworCWxpcwlyMyxHUElPMF9UQ1JAaAkJLyogY29uZmlnIEdQSU8gZHJpdmVyIG91dHB1dCBlbmFibGVzICovCisJb3JpCXIzLHIzLEdQSU8wX1RDUkBsCisJbGlzCXI0LENPTkZJR19TWVNfR1BJTzBfVENSQGgKKwlvcmkJcjQscjQsQ09ORklHX1NZU19HUElPMF9UQ1JAbAorCXN0dwlyNCwwKHIzKQorCisJbGkJcjMsUEIxQVAJCS8qIHByb2dyYW0gRUJDIGJhbmsgMSBmb3IgUlRDIGFjY2VzcyAqLworCW10ZGNyCUVCQzBfQ0ZHQUREUixyMworCWxpcwlyMyxDT05GSUdfU1lTX0VCQ19QQjFBUEBoCisJb3JpCXIzLHIzLENPTkZJR19TWVNfRUJDX1BCMUFQQGwKKwltdGRjcglFQkMwX0NGR0RBVEEscjMKKwlsaQlyMyxQQjFDUgorCW10ZGNyCUVCQzBfQ0ZHQUREUixyMworCWxpcwlyMyxDT05GSUdfU1lTX0VCQ19QQjFDUkBoCisJb3JpCXIzLHIzLENPTkZJR19TWVNfRUJDX1BCMUNSQGwKKwltdGRjcglFQkMwX0NGR0RBVEEscjMKKworCWxpCXIzLFBCMUFQCQkvKiBwcm9ncmFtIEVCQyBiYW5rIDEgZm9yIFJUQyBhY2Nlc3MgKi8KKwltdGRjcglFQkMwX0NGR0FERFIscjMKKwlsaXMJcjMsQ09ORklHX1NZU19FQkNfUEIxQVBAaAorCW9yaQlyMyxyMyxDT05GSUdfU1lTX0VCQ19QQjFBUEBsCisJbXRkY3IJRUJDMF9DRkdEQVRBLHIzCisJbGkJcjMsUEIxQ1IKKwltdGRjcglFQkMwX0NGR0FERFIscjMKKwlsaXMJcjMsQ09ORklHX1NZU19FQkNfUEIxQ1JAaAorCW9yaQlyMyxyMyxDT05GSUdfU1lTX0VCQ19QQjFDUkBsCisJbXRkY3IJRUJDMF9DRkdEQVRBLHIzCisKKwlsaQlyMyxQQjRBUAkJLyogcHJvZ3JhbSBFQkMgYmFuayA0IGZvciBGUEdBIGFjY2VzcyAqLworCW10ZGNyCUVCQzBfQ0ZHQUREUixyMworCWxpcwlyMyxDT05GSUdfU1lTX0VCQ19QQjRBUEBoCisJb3JpCXIzLHIzLENPTkZJR19TWVNfRUJDX1BCNEFQQGwKKwltdGRjcglFQkMwX0NGR0RBVEEscjMKKwlsaQlyMyxQQjRDUgorCW10ZGNyCUVCQzBfQ0ZHQUREUixyMworCWxpcwlyMyxDT05GSUdfU1lTX0VCQ19QQjRDUkBoCisJb3JpCXIzLHIzLENPTkZJR19TWVNfRUJDX1BCNENSQGwKKwltdGRjcglFQkMwX0NGR0RBVEEscjMKKyNlbmRpZgorCisJLyoKKwkhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkhIENoZWNrIHRvIHNlZSBpZiBjaGlwIGlzIGluIGJ5cGFzcyBtb2RlLgorCSEgSWYgc28sIHdyaXRlIHN0b3JlZCBDUEMwX1BMTE1SMCBhbmQgQ1BDMF9QTExNUjEgdmFsdWVzIGFuZCBwZXJmb3JtIGEKKwkhIENQVSByZXNldCAgIE90aGVyd2lzZSwgc2tpcCB0aGlzIHN0ZXAgYW5kIGtlZXAgZ29pbmcuCisJISBOb3RlOgkgUnVubmluZyBCSU9TIGluIGJ5cGFzcyBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgc2luY2UgUExCIHNwZWVkCisJIQkgd2lsbCBub3QgYmUgZmFzdCBlbm91Z2ggZm9yIHRoZSBTRFJBTSAobWluIDY2TUh6KQorCSEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSovCisJbWZkY3IJcjUsIENQQzBfUExMTVIxCisJcmx3aW5tCXI0LHI1LDEsMHgxCQkvKiBnZXQgc3lzdGVtIGNsb2NrIHNvdXJjZSAoU1NDUykgKi8KKwljbXBpCWNyMCwwLHI0LDB4MQorCisJYmVxICAgIHBsbF9kb25lCQkJLyogaWYgU1NDUyA9YicxJyB0aGVuIFBMTCBoYXMgKi8KKwkJCQkJLyogYWxyZWFkeSBiZWVuIHNldCAqLworCQkJCQkvKiBhbmQgQ1BVIGhhcyBiZWVuIHJlc2V0ICovCisJCQkJCS8qIHNvIHNraXAgdG8gbmV4dCBzZWN0aW9uICovCisKKyNpZmRlZiBDT05GSUdfQlVCSU5HQQorCS8qCisJIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJISBSZWFkIE5WUkFNIHRvIGdldCB2YWx1ZSB0byB3cml0ZSBpbiBQTExNUi4KKwkhIElmIHZhbHVlIGhhcyBub3QgYmVlbiBjb3JyZWN0bHkgc2F2ZWQsIHdyaXRlIGRlZmF1bHQgdmFsdWUKKwkhIERlZmF1bHQgY29uZmlnIHZhbHVlcyAoYXNzdW1pbmcgb24tYm9hcmQgMzNNSHogU1lTX0NMSykgYXJlIGFib3ZlLgorCSEgU2VlIENQVV9ERUZBVUxUXzIwMCBhbmQgQ1BVX0RFRkFVTFRfMjY2IGFib3ZlLgorCSEKKwkhIFdBUk5JTkc6ICBUaGlzIGNvZGUgYXNzdW1lcyB0aGUgZmlyc3QgdGhyZWUgd29yZHMgaW4gdGhlIG52cmFtX3QKKwkhCSAgICBzdHJ1Y3R1cmUgaW4gb3BlbmJpb3MuaC4gIENoYW5naW5nIHRoZSBiZWdpbm5pbmcgb2YKKwkhCSAgICB0aGUgc3RydWN0dXJlIHdpbGwgYnJlYWsgdGhpcyBjb2RlLgorCSEKKwkhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqLworCWFkZGlzCXIzLDAsTlZSQU1fQkFTRUBoCisJYWRkaQlyMyxyMyxOVlJBTV9CQVNFQGwKKworCWx3eglyNCwgMChyMykKKwlhZGRpcwlyNSwwLE5WUlZGWTFAaAorCWFkZGkJcjUscjUsTlZSVkZZMUBsCisJY21wCWNyMCwwLHI0LHI1CQkvKiBDb21wYXJlIDFzdCBOVlJBTSBNYWdpYyBudW1iZXIqLworCWJuZQkuLm5vX3BsbHNldAorCWFkZGkJcjMscjMsNAorCWx3eglyNCwgMChyMykKKwlhZGRpcwlyNSwwLE5WUlZGWTJAaAorCWFkZGkJcjUscjUsTlZSVkZZMkBsCisJY21wCWNyMCwwLHI0LHI1CQkvKiBDb21wYXJlIDIgTlZSQU0gTWFnaWMgbnVtYmVyICovCisJYm5lCS4ubm9fcGxsc2V0CisJYWRkaQlyMyxyMyw4CQkJLyogU2tpcCBvdmVyIGNvbmZfc2l6ZSAqLworCWx3eglyNCwgNChyMykJCS8qIExvYWQgUExMTVIxIHZhbHVlIGZyb20gTlZSQU0gKi8KKwlsd3oJcjMsIDAocjMpCQkvKiBMb2FkIFBMTE1SMCB2YWx1ZSBmcm9tIE5WUkFNICovCisJcmx3aW5tCXI1LHI0LDEsMHgxCQkvKiBnZXQgc3lzdGVtIGNsb2NrIHNvdXJjZSAoU1NDUykgKi8KKwljbXBpCSBjcjAsMCxyNSwxCQkvKiBTZWUgaWYgUExMIGlzIGxvY2tlZCAqLworCWJlcQlwbGxfd3JpdGUKKy4ubm9fcGxsc2V0OgorI2VuZGlmIC8qIENPTkZJR19CVUJJTkdBICovCisKKyNpZmRlZiBDT05GSUdfVEFJSFUKKwltZmRjcglyNCwgQ1BDMF9CT09UCisJYW5kaS4JcjUsIHI0LCBDUEMwX0JPT1RfU0VQQGwKKwlibmUJc3RyYXBfMQkJCS8qIHNlcmlhbCBlZXByb20gcHJlc2VudCAqLworCWFkZGlzCXI1LDAsQ1BMRF9SRUcwX0FERFJAaAorCW9yaQlyNSxyNSxDUExEX1JFRzBfQUREUkBsCisJYW5kaS4JcjUsIHI1LCAweDEwCisJYm5lCV9wY2lfNjZtaHoKKyNlbmRpZiAvKiBDT05GSUdfVEFJSFUgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1pFVVMpCisJbWZkY3IJcjQsIENQQzBfQk9PVAorCWFuZGkuCXI1LCByNCwgQ1BDMF9CT09UX1NFUEBsCisJYm5lCXN0cmFwXzEJCQkvKiBzZXJpYWwgZWVwcm9tIHByZXNlbnQgKi8KKwlsaXMJcjMsMHgwMDAwCisJYWRkaQlyMyxyMywweDMwMzAKKwlsaXMJcjQsMHg4MDQyCisJYWRkaQlyNCxyNCwweDIyM2UKKwliCTFmCitzdHJhcF8xOgorCW1mZGNyCXIzLCBDUEMwX1BMTE1SMAorCW1mZGNyCXI0LCBDUEMwX1BMTE1SMQorCWIJMWYKKyNlbmRpZgorCisJYWRkaXMJcjMsMCxQTExNUjBfREVGQVVMVEBoCS8qIFBMTE1SMCBkZWZhdWx0IHZhbHVlICovCisJb3JpCXIzLHIzLFBMTE1SMF9ERUZBVUxUQGwJLyogKi8KKwlhZGRpcwlyNCwwLFBMTE1SMV9ERUZBVUxUQGgJLyogUExMTVIxIGRlZmF1bHQgdmFsdWUgKi8KKwlvcmkJcjQscjQsUExMTVIxX0RFRkFVTFRAbAkvKiAqLworCisjaWZkZWYgQ09ORklHX1RBSUhVCisJYgkxZgorX3BjaV82Nm1oejoKKwlhZGRpcwlyMywwLFBMTE1SMF9ERUZBVUxUX1BDSTY2QGgKKwlvcmkJcjMscjMsUExMTVIwX0RFRkFVTFRfUENJNjZAbAorCWFkZGlzCXI0LDAsUExMTVIxX0RFRkFVTFRfUENJNjZAaAorCW9yaQlyNCxyNCxQTExNUjFfREVGQVVMVF9QQ0k2NkBsCisJYgkxZgorc3RyYXBfMToKKwltZmRjcglyMywgQ1BDMF9QTExNUjAKKwltZmRjcglyNCwgQ1BDMF9QTExNUjEKKyNlbmRpZiAvKiBDT05GSUdfVEFJSFUgKi8KKworMToKKwliCXBsbF93cml0ZQkJLyogV3JpdGUgdGhlIENQQzBfUExMTVIgd2l0aCBuZXcgdmFsdWUgKi8KKworcGxsX2RvbmU6CisJLyoKKwkhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkhIENsZWFyIFNvZnQgUmVzZXQgUmVnaXN0ZXIKKwkhIFRoaXMgaXMgbmVlZGVkIHRvIGVuYWJsZSBQQ0kgaWYgbm90IGJvb3RpbmcgZnJvbSBzZXJpYWwgRVBST00KKwkhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJKi8KKwlhZGRpCXIzLCAwLCAweDAKKwltdGRjcglDUEMwX1NSUiwgcjMKKworCWFkZGlzCSByMywwLDB4MDAxMAorCW10Y3RyCXIzCitwY2lfd2FpdDoKKwliZG56CXBjaV93YWl0CisKKwlibHIJCQkJLyogcmV0dXJuIHRvIG1haW4gY29kZSAqLworCisvKgorIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCishIEZ1bmN0aW9uOglwbGxfd3JpdGUKKyEgRGVzY3JpcHRpb246CVVwZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBDUEMwX1BMTE1SIGFjY29yZGluZyB0byBDTU9TMjdFIGRvY3VtZW50YXRpb24KKyEJCVRoYXQgaXM6CishCQkJICAxLiAgUGxsIGlzIGZpcnN0IGRpc2FibGVkIChkZS1hY3RpdmF0ZWQgYnkgcHV0dGluZyBpbiBieXBhc3MgbW9kZSkKKyEJCQkgIDIuICBQTEwgaXMgcmVzZXQKKyEJCQkgIDMuICBDbG9jayBkaXZpZGVycyBhcmUgc2V0IHdoaWxlIFBMTCBpcyBoZWxkIGluIHJlc2V0IGFuZCBieXBhc3NlZAorIQkJCSAgNC4gIFBMTCBSZXNldCBpcyBjbGVhcmVkCishCQkJICA1LiAgV2FpdCAxMDB1cyBmb3IgUExMIHRvIGxvY2sKKyEJCQkgIDYuICBBIGNvcmUgcmVzZXQgaXMgcGVyZm9ybWVkCishIElucHV0OiByMyA9IFZhbHVlIHRvIHdyaXRlIHRvIENQQzBfUExMTVIwCishIElucHV0OiByNCA9IFZhbHVlIHRvIHdyaXRlIHRvIENQQzBfUExMTVIxCishIE91dHB1dCByMyA9IG5vbmUKKyEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwkuZ2xvYmwJcGxsX3dyaXRlCitwbGxfd3JpdGU6CisJbWZkY3IgIHI1LCBDUEMwX1VDUgorCWFuZGlzLiByNSxyNSwweEZGRkYKKwlvcmkgICAgcjUscjUsMHgwMTAxCQkvKiBTdG9wIHRoZSBVQVJUIGNsb2NrcyAqLworCW10ZGNyICBDUEMwX1VDUixyNQkJLyogQmVmb3JlIGNoYW5naW5nIFBMTCAqLworCisJbWZkY3IgIHI1LCBDUEMwX1BMTE1SMQorCXJsd2lubSByNSxyNSwwLDB4N0ZGRkZGRkYJLyogRGlzYWJsZSBQTEwgKi8KKwltdGRjcglDUEMwX1BMTE1SMSxyNQorCW9yaXMgICByNSxyNSwweDQwMDAJCS8qIFNldCBQTEwgUmVzZXQgKi8KKwltdGRjcglDUEMwX1BMTE1SMSxyNQorCisJbXRkY3IJQ1BDMF9QTExNUjAscjMJCS8qIFNldCBjbG9jayBkaXZpZGVycyAqLworCXJsd2lubSByNSxyNCwwLDB4M0ZGRkZGRkYJLyogUmVzZXQgJiBCeXBhc3MgbmV3IFBMTCBkaXZpZGVycyAqLworCW9yaXMgICByNSxyNSwweDQwMDAJCS8qIFNldCBQTEwgUmVzZXQgKi8KKwltdGRjcglDUEMwX1BMTE1SMSxyNQkJLyogU2V0IGNsb2NrIGRpdmlkZXJzICovCisJcmx3aW5tIHI1LHI1LDAsMHhCRkZGRkZGRgkvKiBDbGVhciBQTEwgUmVzZXQgKi8KKwltdGRjcglDUEMwX1BMTE1SMSxyNQorCisJCS8qCisJISBXYWl0IG1pbiBvZiAxMDB1cyBmb3IgUExMIHRvIGxvY2suCisJISBTZWUgQ01PUyAyN0UgZGF0YWJvb2sgZm9yIG1vcmUgaW5mby4KKwkhIEF0IDIwME1IeiwgdGhhdCBtZWFucyB3YWl0aW5nIDIwLDAwMCBpbnN0cnVjdGlvbnMKKwkJICovCisJYWRkaQlyMywwLDIwMDAwCQkvKiAyMDAwID0gMHg0ZTIwICovCisJbXRjdHIJcjMKK3BsbF93YWl0OgorCWJkbnoJcGxsX3dhaXQKKworCW9yaXMgICByNSxyNSwweDgwMDAJCS8qIEVuYWJsZSBQTEwgKi8KKwltdGRjcglDUEMwX1BMTE1SMSxyNQkJLyogRW5nYWdlICovCisKKwkvKgorCSAqIFJlc2V0IENQVSB0byBndWFyYW50ZWUgdGltaW5ncyBhcmUgT0sKKwkgKiBOb3Qgc3VyZSBpZiB0aGlzIGlzIG5lZWRlZC4uLgorCSAqLworCWFkZGlzIHIzLDAsMHgxMDAwCisJbXRzcHIgU1BSTl9EQkNSMCxyMwkJLyogVGhpcyB3aWxsIGNhdXNlIGEgQ1BVIGNvcmUgcmVzZXQsIGFuZCAqLworCQkJCQkvKiBleGVjdXRpb24gd2lsbCBjb250aW51ZSBmcm9tIHRoZSBwb3dlcm9uICovCisJCQkJCS8qIHZlY3RvciBvZiAweGZmZmZmZmZjICovCisjZW5kaWYgLyogQ09ORklHXzQwNUVQICovCisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IG10dGxiMy4KKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlmdW5jdGlvbl9wcm9sb2cobXR0bGIzKQorCVRMQldFKDQsMywyKQorCWJscgorCWZ1bmN0aW9uX2VwaWxvZyhtdHRsYjMpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgbWZ0bGIzLgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWZ1bmN0aW9uX3Byb2xvZyhtZnRsYjMpCisJVExCUkUoMywzLDIpCisJYmxyCisJZnVuY3Rpb25fZXBpbG9nKG1mdGxiMykKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBtdHRsYjIuCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZnVuY3Rpb25fcHJvbG9nKG10dGxiMikKKwlUTEJXRSg0LDMsMSkKKwlibHIKKwlmdW5jdGlvbl9lcGlsb2cobXR0bGIyKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IG1mdGxiMi4KKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlmdW5jdGlvbl9wcm9sb2cobWZ0bGIyKQorCVRMQlJFKDMsMywxKQorCWJscgorCWZ1bmN0aW9uX2VwaWxvZyhtZnRsYjIpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgbXR0bGIxLgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWZ1bmN0aW9uX3Byb2xvZyhtdHRsYjEpCisJVExCV0UoNCwzLDApCisJYmxyCisJZnVuY3Rpb25fZXBpbG9nKG10dGxiMSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBtZnRsYjEuCisrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZnVuY3Rpb25fcHJvbG9nKG1mdGxiMSkKKwlUTEJSRSgzLDMsMCkKKwlibHIKKwlmdW5jdGlvbl9lcGlsb2cobWZ0bGIxKQorI2VuZGlmIC8qIENPTkZJR180NDAgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX05BTkRfU1BMKQorLyoKKyAqIHZvaWQgbmFuZF9ib290X3JlbG9jYXRlKGRzdCwgc3JjLCBieXRlcykKKyAqCisgKiByMyA9IERlc3RpbmF0aW9uIGFkZHJlc3MgdG8gY29weSBjb2RlIHRvIChpbiBTRFJBTSkKKyAqIHI0ID0gU291cmNlIGFkZHJlc3MgdG8gY29weSBjb2RlIGZyb20KKyAqIHI1ID0gc2l6ZSB0byBjb3B5IGluIGJ5dGVzCisgKi8KK25hbmRfYm9vdF9yZWxvY2F0ZToKKwltcglyNixyMworCW1yCXI3LHI0CisJbWZscglyOAorCisJLyoKKwkgKiBDb3B5IFNQTCBmcm9tIGljYWNoZSBpbnRvIFNEUkFNCisJICovCisJc3ViaQlyMyxyMyw0CisJc3ViaQlyNCxyNCw0CisJc3J3aQlyNSxyNSwyCisJbXRjdHIJcjUKKy4uc3BsX2xvb3A6CisJbHd6dQlyMCw0KHI0KQorCXN0d3UJcjAsNChyMykKKwliZG56CS4uc3BsX2xvb3AKKworCS8qCisJICogQ2FsY3VsYXRlICJjb3JyZWN0ZWQiIGxpbmsgcmVnaXN0ZXIsIHNvIHRoYXQgd2UgImNvbnRpbnVlIgorCSAqIGluIGV4ZWN1dGlvbiBpbiBkZXN0aW5hdGlvbiByYW5nZQorCSAqLworCXN1YglyMyxyNyxyNgkvKiByMyA9IHNyYyAtIGRzdCAqLworCXN1YglyOCxyOCxyMwkvKiByOCA9IGxpbmstcmVnIC0gKHNyYyAtIGRzdCkgKi8KKwltdGxyCXI4CisJYmxyCisKK25hbmRfYm9vdF9jb21tb246CisJLyoKKwkgKiBGaXJzdCBpbml0aWFsaXplIFNEUkFNLiBJdCBoYXMgdG8gYmUgYXZhaWxhYmxlICpiZWZvcmUqIGNhbGxpbmcKKwkgKiBuYW5kX2Jvb3QoKS4KKwkgKi8KKwlsaXMJcjMsQ09ORklHX1NZU19TRFJBTV9CQVNFQGgKKwlvcmkJcjMscjMsQ09ORklHX1NZU19TRFJBTV9CQVNFQGwKKwlibAlpbml0ZHJhbQorCisJLyoKKwkgKiBOb3cgY29weSB0aGUgNGsgU1BMIGNvZGUgaW50byBTRFJBTSBhbmQgY29udGludWUgZXhlY3V0aW9uCisJICogZnJvbSB0aGVyZS4KKwkgKi8KKwlsaXMJcjMsQ09ORklHX1NZU19OQU5EX0JPT1RfU1BMX0RTVEBoCisJb3JpCXIzLHIzLENPTkZJR19TWVNfTkFORF9CT09UX1NQTF9EU1RAbAorCWxpcwlyNCxDT05GSUdfU1lTX05BTkRfQk9PVF9TUExfU1JDQGgKKwlvcmkJcjQscjQsQ09ORklHX1NZU19OQU5EX0JPT1RfU1BMX1NSQ0BsCisJbGlzCXI1LENPTkZJR19TWVNfTkFORF9CT09UX1NQTF9TSVpFQGgKKwlvcmkJcjUscjUsQ09ORklHX1NZU19OQU5EX0JPT1RfU1BMX1NJWkVAbAorCWJsCW5hbmRfYm9vdF9yZWxvY2F0ZQorCisJLyoKKwkgKiBXZSdyZSBydW5uaW5nIGZyb20gU0RSQU0gbm93ISEhCisJICoKKwkgKiBJdCBpcyBuZWNlc3NhcnkgZm9yIDR4eCBzeXN0ZW1zIHRvIHJlbG9jYXRlIGZyb20gcnVubmluZyBhdAorCSAqIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiAoMHhmZmZmZnh4eCkgdG8gc29tZXdoZXJlIGVsc2UgKFNEUkFNCisJICogcHJlZmVyYWJseSkuIFRoaXMgaXMgYmVjYXVzZSBDUzAgbmVlZHMgdG8gYmUgcmVjb25maWd1cmVkIGZvcgorCSAqIE5BTkQgYWNjZXNzLiBBbmQgd2UgY2FuJ3QgcmVjb25maWd1cmUgdGhpcyBDUyB3aGVuIGN1cnJlbnRseQorCSAqICJydW5uaW5nIiBmcm9tIGl0LgorCSAqLworCisJLyoKKwkgKiBGaW5hbGx5IGNhbGwgbmFuZF9ib290KCkgdG8gbG9hZCBtYWluIE5BTkQgVS1Cb290IGltYWdlIGZyb20KKwkgKiBOQU5EIGFuZCBqdW1wIHRvIGl0LgorCSAqLworCWJsCW5hbmRfYm9vdAkJLyogd2lsbCBub3QgcmV0dXJuICovCisjZW5kaWYgLyogQ09ORklHX05BTkRfU1BMICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC90bGIuYyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3RsYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTlhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC90bGIuYwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MCkKKworI2luY2x1ZGUgPHBwYzQ0MC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKwordHlwZWRlZiBzdHJ1Y3QgcmVnaW9uIHsKKwl1NjQgYmFzZTsKKwl1MzIgc2l6ZTsKKwl1MzIgdGxiX3dvcmQyX2lfdmFsdWU7Cit9IHJlZ2lvbl90OworCit2b2lkIHJlbW92ZV90bGIodTMyIHZhZGRyLCB1MzIgc2l6ZSkKK3sKKwlpbnQgaTsKKwl1MzIgdGxiX3dvcmQwX3ZhbHVlOworCXUzMiB0bGJfdmFkZHI7CisJdTMyIHRsYl9zaXplID0gMDsKKworCWZvciAoaT0wOyBpPFBQQzRYWF9UTEJfU0laRTsgaSsrKSB7CisJCXRsYl93b3JkMF92YWx1ZSA9IG1mdGxiMShpKTsKKwkJdGxiX3ZhZGRyID0gVExCX1dPUkQwX0VQTl9ERUNPREUodGxiX3dvcmQwX3ZhbHVlKTsKKwkJaWYgKCgodGxiX3dvcmQwX3ZhbHVlICYgVExCX1dPUkQwX1ZfTUFTSykgPT0gVExCX1dPUkQwX1ZfRU5BQkxFKSAmJgorCQkgICAgKHRsYl92YWRkciA+PSB2YWRkcikpIHsKKwkJCS8qCisJCQkgKiBUTEIgaXMgZW5hYmxlZCBhbmQgc3RhcnQgYWRkcmVzcyBpcyBsb3dlciBvciBlcXVhbAorCQkJICogdGhhbiB0aGUgYXJlYSB3ZSBhcmUgbG9va2luZyBmb3IuIE5vdyB3ZSBvbmx5IGhhdmUKKwkJCSAqIHRvIGNoZWNrIHRoZSBzaXplL2VuZCBhZGRyZXNzIGZvciBhIG1hdGNoLgorCQkJICovCisJCQlzd2l0Y2ggKHRsYl93b3JkMF92YWx1ZSAmIFRMQl9XT1JEMF9TSVpFX01BU0spIHsKKwkJCWNhc2UgVExCX1dPUkQwX1NJWkVfMUtCOgorCQkJCXRsYl9zaXplID0gMSA8PCAxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVExCX1dPUkQwX1NJWkVfNEtCOgorCQkJCXRsYl9zaXplID0gNCA8PCAxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVExCX1dPUkQwX1NJWkVfMTZLQjoKKwkJCQl0bGJfc2l6ZSA9IDE2IDw8IDEwOworCQkJCWJyZWFrOworCQkJY2FzZSBUTEJfV09SRDBfU0laRV82NEtCOgorCQkJCXRsYl9zaXplID0gNjQgPDwgMTA7CisJCQkJYnJlYWs7CisJCQljYXNlIFRMQl9XT1JEMF9TSVpFXzI1NktCOgorCQkJCXRsYl9zaXplID0gMjU2IDw8IDEwOworCQkJCWJyZWFrOworCQkJY2FzZSBUTEJfV09SRDBfU0laRV8xTUI6CisJCQkJdGxiX3NpemUgPSAxIDw8IDIwOworCQkJCWJyZWFrOworCQkJY2FzZSBUTEJfV09SRDBfU0laRV8xNk1COgorCQkJCXRsYl9zaXplID0gMTYgPDwgMjA7CisJCQkJYnJlYWs7CisJCQljYXNlIFRMQl9XT1JEMF9TSVpFXzI1Nk1COgorCQkJCXRsYl9zaXplID0gMjU2IDw8IDIwOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogTm93IGNoZWNrIHRoZSBlbmQtYWRkcmVzcyBpZiBpdCdzIGluIHRoZSByYW5nZQorCQkJICovCisJCQlpZiAoKHRsYl92YWRkciArIHRsYl9zaXplIC0gMSkgPD0gKHZhZGRyICsgc2l6ZSAtIDEpKQorCQkJCS8qCisJCQkJICogRm91bmQgYSBUTEIgaW4gdGhlIHJhbmdlLgorCQkJCSAqIERpc2FibGUgaXQgYnkgd3JpdGluZyAwIHRvIHRsYjAgd29yZC4KKwkJCQkgKi8KKwkJCQltdHRsYjEoaSwgMCk7CisJCX0KKwl9CisKKwkvKiBFeGVjdXRlIGFuIElTWU5DIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIG5ldyBUTEIgZW50cnkgdGFrZXMgZWZmZWN0ICovCisJYXNtKCJpc3luYyIpOworfQorCisvKgorICogQ2hhbmdlIHRoZSBJIGF0dHJpYnV0ZSAoY2FjaGUgaW5oaWJpdGVkKSBvZiBhIFRMQiBvciBtdWx0aXBsZSBUTEIncy4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBlaXRoZXIgdHVybiBjYWNoZSBvbiBvciBvZmYgaW4gYSBzcGVjaWZpYworICogbWVtb3J5IGFyZWEuCisgKi8KK3ZvaWQgY2hhbmdlX3RsYih1MzIgdmFkZHIsIHUzMiBzaXplLCB1MzIgdGxiX3dvcmQyX2lfdmFsdWUpCit7CisJaW50IGk7CisJdTMyIHRsYl93b3JkMF92YWx1ZTsKKwl1MzIgdGxiX3dvcmQyX3ZhbHVlOworCXUzMiB0bGJfdmFkZHI7CisJdTMyIHRsYl9zaXplID0gMDsKKworCWZvciAoaT0wOyBpPFBQQzRYWF9UTEJfU0laRTsgaSsrKSB7CisJCXRsYl93b3JkMF92YWx1ZSA9IG1mdGxiMShpKTsKKwkJdGxiX3ZhZGRyID0gVExCX1dPUkQwX0VQTl9ERUNPREUodGxiX3dvcmQwX3ZhbHVlKTsKKwkJaWYgKCgodGxiX3dvcmQwX3ZhbHVlICYgVExCX1dPUkQwX1ZfTUFTSykgPT0gVExCX1dPUkQwX1ZfRU5BQkxFKSAmJgorCQkgICAgKHRsYl92YWRkciA+PSB2YWRkcikpIHsKKwkJCS8qCisJCQkgKiBUTEIgaXMgZW5hYmxlZCBhbmQgc3RhcnQgYWRkcmVzcyBpcyBsb3dlciBvciBlcXVhbAorCQkJICogdGhhbiB0aGUgYXJlYSB3ZSBhcmUgbG9va2luZyBmb3IuIE5vdyB3ZSBvbmx5IGhhdmUKKwkJCSAqIHRvIGNoZWNrIHRoZSBzaXplL2VuZCBhZGRyZXNzIGZvciBhIG1hdGNoLgorCQkJICovCisJCQlzd2l0Y2ggKHRsYl93b3JkMF92YWx1ZSAmIFRMQl9XT1JEMF9TSVpFX01BU0spIHsKKwkJCWNhc2UgVExCX1dPUkQwX1NJWkVfMUtCOgorCQkJCXRsYl9zaXplID0gMSA8PCAxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVExCX1dPUkQwX1NJWkVfNEtCOgorCQkJCXRsYl9zaXplID0gNCA8PCAxMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgVExCX1dPUkQwX1NJWkVfMTZLQjoKKwkJCQl0bGJfc2l6ZSA9IDE2IDw8IDEwOworCQkJCWJyZWFrOworCQkJY2FzZSBUTEJfV09SRDBfU0laRV82NEtCOgorCQkJCXRsYl9zaXplID0gNjQgPDwgMTA7CisJCQkJYnJlYWs7CisJCQljYXNlIFRMQl9XT1JEMF9TSVpFXzI1NktCOgorCQkJCXRsYl9zaXplID0gMjU2IDw8IDEwOworCQkJCWJyZWFrOworCQkJY2FzZSBUTEJfV09SRDBfU0laRV8xTUI6CisJCQkJdGxiX3NpemUgPSAxIDw8IDIwOworCQkJCWJyZWFrOworCQkJY2FzZSBUTEJfV09SRDBfU0laRV8xNk1COgorCQkJCXRsYl9zaXplID0gMTYgPDwgMjA7CisJCQkJYnJlYWs7CisJCQljYXNlIFRMQl9XT1JEMF9TSVpFXzI1Nk1COgorCQkJCXRsYl9zaXplID0gMjU2IDw8IDIwOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogTm93IGNoZWNrIHRoZSBlbmQtYWRkcmVzcyBpZiBpdCdzIGluIHRoZSByYW5nZQorCQkJICovCisJCQlpZiAoKCh0bGJfdmFkZHIgKyB0bGJfc2l6ZSAtIDEpIDw9ICh2YWRkciArIHNpemUgLSAxKSkgfHwKKwkJCSAgICAoKHRsYl92YWRkciA8ICh2YWRkciArIHNpemUgLSAxKSkgJiYKKwkJCSAgICAgKCh0bGJfdmFkZHIgKyB0bGJfc2l6ZSAtIDEpID4gKHZhZGRyICsgc2l6ZSAtIDEpKSkpIHsKKwkJCQkvKgorCQkJCSAqIEZvdW5kIGEgVExCIGluIHRoZSByYW5nZS4KKwkJCQkgKiBDaGFuZ2UgY2FjaGUgYXR0cmlidXRlIGluIHRsYjIgd29yZC4KKwkJCQkgKi8KKwkJCQl0bGJfd29yZDJfdmFsdWUgPQorCQkJCQlUTEJfV09SRDJfVTBfRElTQUJMRSB8IFRMQl9XT1JEMl9VMV9ESVNBQkxFIHwKKwkJCQkJVExCX1dPUkQyX1UyX0RJU0FCTEUgfCBUTEJfV09SRDJfVTNfRElTQUJMRSB8CisJCQkJCVRMQl9XT1JEMl9XX0RJU0FCTEUgfCB0bGJfd29yZDJfaV92YWx1ZSB8CisJCQkJCVRMQl9XT1JEMl9NX0RJU0FCTEUgfCBUTEJfV09SRDJfR19ESVNBQkxFIHwKKwkJCQkJVExCX1dPUkQyX0VfRElTQUJMRSB8IFRMQl9XT1JEMl9VWF9FTkFCTEUgfAorCQkJCQlUTEJfV09SRDJfVVdfRU5BQkxFIHwgVExCX1dPUkQyX1VSX0VOQUJMRSB8CisJCQkJCVRMQl9XT1JEMl9TWF9FTkFCTEUgfCBUTEJfV09SRDJfU1dfRU5BQkxFIHwKKwkJCQkJVExCX1dPUkQyX1NSX0VOQUJMRTsKKworCQkJCS8qCisJCQkJICogTm93IGVpdGhlciBmbHVzaCBvciBpbnZhbGlkYXRlIHRoZSBkY2FjaGUKKwkJCQkgKi8KKwkJCQlpZiAodGxiX3dvcmQyX2lfdmFsdWUpCisJCQkJCWZsdXNoX2RjYWNoZSgpOworCQkJCWVsc2UKKwkJCQkJaW52YWxpZGF0ZV9kY2FjaGUoKTsKKworCQkJCW10dGxiMyhpLCB0bGJfd29yZDJfdmFsdWUpOworCQkJCWFzbSgiaWNjY2kgMCwwIik7CisJCQl9CisJCX0KKwl9CisKKwkvKiBFeGVjdXRlIGFuIElTWU5DIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIG5ldyBUTEIgZW50cnkgdGFrZXMgZWZmZWN0ICovCisJYXNtKCJpc3luYyIpOworfQorCitzdGF0aWMgaW50IGFkZF90bGJfZW50cnkodTY0IHBoeXNfYWRkciwKKwkJCSB1MzIgdmlydF9hZGRyLAorCQkJIHUzMiB0bGJfd29yZDBfc2l6ZV92YWx1ZSwKKwkJCSB1MzIgdGxiX3dvcmQyX2lfdmFsdWUpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyB0bGJfd29yZDBfdmFsdWU7CisJdW5zaWduZWQgbG9uZyB0bGJfd29yZDFfdmFsdWU7CisJdW5zaWduZWQgbG9uZyB0bGJfd29yZDJfdmFsdWU7CisKKwkvKiBGaXJzdCwgZmluZCB0aGUgaW5kZXggb2YgYSBUTEIgZW50cnkgbm90IGJlaW5nIHVzZWQgKi8KKwlmb3IgKGk9MDsgaTxQUEM0WFhfVExCX1NJWkU7IGkrKykgeworCQl0bGJfd29yZDBfdmFsdWUgPSBtZnRsYjEoaSk7CisJCWlmICgodGxiX3dvcmQwX3ZhbHVlICYgVExCX1dPUkQwX1ZfTUFTSykgPT0gVExCX1dPUkQwX1ZfRElTQUJMRSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA+PSBQUEM0WFhfVExCX1NJWkUpCisJCXJldHVybiAtMTsKKworCS8qIFNlY29uZCwgY3JlYXRlIHRoZSBUTEIgZW50cnkgKi8KKwl0bGJfd29yZDBfdmFsdWUgPSBUTEJfV09SRDBfRVBOX0VOQ09ERSh2aXJ0X2FkZHIpIHwgVExCX1dPUkQwX1ZfRU5BQkxFIHwKKwkJVExCX1dPUkQwX1RTXzAgfCB0bGJfd29yZDBfc2l6ZV92YWx1ZTsKKwl0bGJfd29yZDFfdmFsdWUgPSBUTEJfV09SRDFfUlBOX0VOQ09ERSgodTMyKXBoeXNfYWRkcikgfAorCQlUTEJfV09SRDFfRVJQTl9FTkNPREUocGh5c19hZGRyID4+IDMyKTsKKwl0bGJfd29yZDJfdmFsdWUgPSBUTEJfV09SRDJfVTBfRElTQUJMRSB8IFRMQl9XT1JEMl9VMV9ESVNBQkxFIHwKKwkJVExCX1dPUkQyX1UyX0RJU0FCTEUgfCBUTEJfV09SRDJfVTNfRElTQUJMRSB8CisJCVRMQl9XT1JEMl9XX0RJU0FCTEUgfCB0bGJfd29yZDJfaV92YWx1ZSB8CisJCVRMQl9XT1JEMl9NX0RJU0FCTEUgfCBUTEJfV09SRDJfR19ESVNBQkxFIHwKKwkJVExCX1dPUkQyX0VfRElTQUJMRSB8IFRMQl9XT1JEMl9VWF9FTkFCTEUgfAorCQlUTEJfV09SRDJfVVdfRU5BQkxFIHwgVExCX1dPUkQyX1VSX0VOQUJMRSB8CisJCVRMQl9XT1JEMl9TWF9FTkFCTEUgfCBUTEJfV09SRDJfU1dfRU5BQkxFIHwKKwkJVExCX1dPUkQyX1NSX0VOQUJMRTsKKworCS8qIFdhaXQgZm9yIGFsbCBtZW1vcnkgYWNjZXNzZXMgdG8gY29tcGxldGUgKi8KKwlzeW5jKCk7CisKKwkvKiBUaGlyZCwgYWRkIHRoZSBUTEIgZW50cmllcyAqLworCW10dGxiMShpLCB0bGJfd29yZDBfdmFsdWUpOworCW10dGxiMihpLCB0bGJfd29yZDFfdmFsdWUpOworCW10dGxiMyhpLCB0bGJfd29yZDJfdmFsdWUpOworCisJLyogRXhlY3V0ZSBhbiBJU1lOQyBpbnN0cnVjdGlvbiBzbyB0aGF0IHRoZSBuZXcgVExCIGVudHJ5IHRha2VzIGVmZmVjdCAqLworCWFzbSgiaXN5bmMiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9ncmFtX3RsYl9hZGRyKHU2NCBwaHlzX2FkZHIsCisJCQkgICAgIHUzMiB2aXJ0X2FkZHIsCisJCQkgICAgIHUzMiBtZW1fc2l6ZSwKKwkJCSAgICAgdTMyIHRsYl93b3JkMl9pX3ZhbHVlKQoreworCWludCByYzsKKwlpbnQgdGxiX2k7CisKKwl0bGJfaSA9IHRsYl93b3JkMl9pX3ZhbHVlOworCXdoaWxlIChtZW1fc2l6ZSAhPSAwKSB7CisJCXJjID0gMDsKKwkJLyogQWRkIHRoZSBUTEIgZW50cmllcyBpbiB0byBtYXAgdGhlIHJlZ2lvbi4gKi8KKwkJaWYgKCgocGh5c19hZGRyICYgVExCXzI1Nk1CX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKKwkJICAgIChtZW1fc2l6ZSA+PSBUTEJfMjU2TUJfU0laRSkpIHsKKwkJCS8qIEFkZCBhIDI1Nk1CIFRMQiBlbnRyeSAqLworCQkJaWYgKChyYyA9IGFkZF90bGJfZW50cnkocGh5c19hZGRyLCB2aXJ0X2FkZHIsCisJCQkJCQlUTEJfV09SRDBfU0laRV8yNTZNQiwgdGxiX2kpKSA9PSAwKSB7CisJCQkJbWVtX3NpemUgLT0gVExCXzI1Nk1CX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl8yNTZNQl9TSVpFOworCQkJCXZpcnRfYWRkciArPSBUTEJfMjU2TUJfU0laRTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoKHBoeXNfYWRkciAmIFRMQl8xNk1CX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKKwkJCSAgIChtZW1fc2l6ZSA+PSBUTEJfMTZNQl9TSVpFKSkgeworCQkJLyogQWRkIGEgMTZNQiBUTEIgZW50cnkgKi8KKwkJCWlmICgocmMgPSBhZGRfdGxiX2VudHJ5KHBoeXNfYWRkciwgdmlydF9hZGRyLAorCQkJCQkJVExCX1dPUkQwX1NJWkVfMTZNQiwgdGxiX2kpKSA9PSAwKSB7CisJCQkJbWVtX3NpemUgLT0gVExCXzE2TUJfU0laRTsKKwkJCQlwaHlzX2FkZHIgKz0gVExCXzE2TUJfU0laRTsKKwkJCQl2aXJ0X2FkZHIgKz0gVExCXzE2TUJfU0laRTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoKHBoeXNfYWRkciAmIFRMQl8xTUJfQUxJR05fTUFTSykgPT0gcGh5c19hZGRyKSAmJgorCQkJICAgKG1lbV9zaXplID49IFRMQl8xTUJfU0laRSkpIHsKKwkJCS8qIEFkZCBhIDFNQiBUTEIgZW50cnkgKi8KKwkJCWlmICgocmMgPSBhZGRfdGxiX2VudHJ5KHBoeXNfYWRkciwgdmlydF9hZGRyLAorCQkJCQkJVExCX1dPUkQwX1NJWkVfMU1CLCB0bGJfaSkpID09IDApIHsKKwkJCQltZW1fc2l6ZSAtPSBUTEJfMU1CX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl8xTUJfU0laRTsKKwkJCQl2aXJ0X2FkZHIgKz0gVExCXzFNQl9TSVpFOworCQkJfQorCQl9IGVsc2UgaWYgKCgocGh5c19hZGRyICYgVExCXzI1NktCX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKKwkJCSAgIChtZW1fc2l6ZSA+PSBUTEJfMjU2S0JfU0laRSkpIHsKKwkJCS8qIEFkZCBhIDI1NktCIFRMQiBlbnRyeSAqLworCQkJaWYgKChyYyA9IGFkZF90bGJfZW50cnkocGh5c19hZGRyLCB2aXJ0X2FkZHIsCisJCQkJCQlUTEJfV09SRDBfU0laRV8yNTZLQiwgdGxiX2kpKSA9PSAwKSB7CisJCQkJbWVtX3NpemUgLT0gVExCXzI1NktCX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl8yNTZLQl9TSVpFOworCQkJCXZpcnRfYWRkciArPSBUTEJfMjU2S0JfU0laRTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoKHBoeXNfYWRkciAmIFRMQl82NEtCX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKKwkJCSAgIChtZW1fc2l6ZSA+PSBUTEJfNjRLQl9TSVpFKSkgeworCQkJLyogQWRkIGEgNjRLQiBUTEIgZW50cnkgKi8KKwkJCWlmICgocmMgPSBhZGRfdGxiX2VudHJ5KHBoeXNfYWRkciwgdmlydF9hZGRyLAorCQkJCQkJVExCX1dPUkQwX1NJWkVfNjRLQiwgdGxiX2kpKSA9PSAwKSB7CisJCQkJbWVtX3NpemUgLT0gVExCXzY0S0JfU0laRTsKKwkJCQlwaHlzX2FkZHIgKz0gVExCXzY0S0JfU0laRTsKKwkJCQl2aXJ0X2FkZHIgKz0gVExCXzY0S0JfU0laRTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoKHBoeXNfYWRkciAmIFRMQl8xNktCX0FMSUdOX01BU0spID09IHBoeXNfYWRkcikgJiYKKwkJCSAgIChtZW1fc2l6ZSA+PSBUTEJfMTZLQl9TSVpFKSkgeworCQkJLyogQWRkIGEgMTZLQiBUTEIgZW50cnkgKi8KKwkJCWlmICgocmMgPSBhZGRfdGxiX2VudHJ5KHBoeXNfYWRkciwgdmlydF9hZGRyLAorCQkJCQkJVExCX1dPUkQwX1NJWkVfMTZLQiwgdGxiX2kpKSA9PSAwKSB7CisJCQkJbWVtX3NpemUgLT0gVExCXzE2S0JfU0laRTsKKwkJCQlwaHlzX2FkZHIgKz0gVExCXzE2S0JfU0laRTsKKwkJCQl2aXJ0X2FkZHIgKz0gVExCXzE2S0JfU0laRTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoKHBoeXNfYWRkciAmIFRMQl80S0JfQUxJR05fTUFTSykgPT0gcGh5c19hZGRyKSAmJgorCQkJICAgKG1lbV9zaXplID49IFRMQl80S0JfU0laRSkpIHsKKwkJCS8qIEFkZCBhIDRLQiBUTEIgZW50cnkgKi8KKwkJCWlmICgocmMgPSBhZGRfdGxiX2VudHJ5KHBoeXNfYWRkciwgdmlydF9hZGRyLAorCQkJCQkJVExCX1dPUkQwX1NJWkVfNEtCLCB0bGJfaSkpID09IDApIHsKKwkJCQltZW1fc2l6ZSAtPSBUTEJfNEtCX1NJWkU7CisJCQkJcGh5c19hZGRyICs9IFRMQl80S0JfU0laRTsKKwkJCQl2aXJ0X2FkZHIgKz0gVExCXzRLQl9TSVpFOworCQkJfQorCQl9IGVsc2UgaWYgKCgocGh5c19hZGRyICYgVExCXzFLQl9BTElHTl9NQVNLKSA9PSBwaHlzX2FkZHIpICYmCisJCQkgICAobWVtX3NpemUgPj0gVExCXzFLQl9TSVpFKSkgeworCQkJLyogQWRkIGEgMUtCIFRMQiBlbnRyeSAqLworCQkJaWYgKChyYyA9IGFkZF90bGJfZW50cnkocGh5c19hZGRyLCB2aXJ0X2FkZHIsCisJCQkJCQlUTEJfV09SRDBfU0laRV8xS0IsIHRsYl9pKSkgPT0gMCkgeworCQkJCW1lbV9zaXplIC09IFRMQl8xS0JfU0laRTsKKwkJCQlwaHlzX2FkZHIgKz0gVExCXzFLQl9TSVpFOworCQkJCXZpcnRfYWRkciArPSBUTEJfMUtCX1NJWkU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGYoIkVSUk9SOiBubyBUTEIgc2l6ZSBleGlzdHMgZm9yIHRoZSBiYXNlIGFkZHJlc3MgMHglbGx4LlxuIiwKKwkJCQlwaHlzX2FkZHIpOworCQl9CisKKwkJaWYgKHJjICE9IDApCisJCQlwcmludGYoIkVSUk9SOiBubyBUTEIgZW50cmllcyBhdmFpbGFibGUgZm9yIHRoZSBiYXNlIGFkZHIgMHglbGx4LlxuIiwKKwkJCQlwaHlzX2FkZHIpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIFByb2dyYW0gb25lIChvciBtdWx0aXBsZSkgVExCIGVudHJpZXMgZm9yIG9uZSBtZW1vcnkgcmVnaW9uCisgKgorICogQ29tbW9uIHVzYWdlIGZvciBib2FyZHMgd2l0aCBTRFJBTSBESU1NIG1vZHVsZXMgdG8gZHluYW1pY2FsbHkKKyAqIGNvbmZpZ3VyZSB0aGUgVExCJ3MgZm9yIHRoZSBTRFJBTQorICovCit2b2lkIHByb2dyYW1fdGxiKHU2NCBwaHlzX2FkZHIsIHUzMiB2aXJ0X2FkZHIsIHUzMiBzaXplLCB1MzIgdGxiX3dvcmQyX2lfdmFsdWUpCit7CisJcmVnaW9uX3QgcmVnaW9uX2FycmF5OworCisJcmVnaW9uX2FycmF5LmJhc2UgPSBwaHlzX2FkZHI7CisJcmVnaW9uX2FycmF5LnNpemUgPSBzaXplOworCXJlZ2lvbl9hcnJheS50bGJfd29yZDJfaV92YWx1ZSA9IHRsYl93b3JkMl9pX3ZhbHVlOwkvKiBlbi0vZGlzYWJsZSBjYWNoZSAqLworCisJLyogQ2FsbCB0aGUgcm91dGluZSB0byBhZGQgaW4gdGhlIHRsYiBlbnRyaWVzIGZvciB0aGUgbWVtb3J5IHJlZ2lvbnMgKi8KKwlwcm9ncmFtX3RsYl9hZGRyKHJlZ2lvbl9hcnJheS5iYXNlLCB2aXJ0X2FkZHIsIHJlZ2lvbl9hcnJheS5zaXplLAorCQkJIHJlZ2lvbl9hcnJheS50bGJfd29yZDJfaV92YWx1ZSk7CisKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfNDQwICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjE2NzcyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvdHJhcHMuYwpAQCAtMCwwICsxLDQwOSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2ICBHYXJ5IFRob21hcyAoZ2R0QGxpbnV4cHBjLm9yZykKKyAqCisgKiBNb2RpZmllZCBieSBDb3J0IERvdWdhbiAoY29ydEBjcy5ubXQuZWR1KQorICogYW5kIFBhdWwgTWFja2VycmFzIChwYXVsdXNAY3MuYW51LmVkdS5hdSkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIGhhcmR3YXJlIGV4Y2VwdGlvbnMKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGtnZGIuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisvKiBSZXR1cm5zIDAgaWYgZXhjZXB0aW9uIG5vdCBmb3VuZCBhbmQgZml4dXAgb3RoZXJ3aXNlLiAgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHNlYXJjaF9leGNlcHRpb25fdGFibGUodW5zaWduZWQgbG9uZyk7CisKKy8qIFRISVMgTkVFRFMgQ0hBTkdJTkcgdG8gdXNlIHRoZSBib2FyZCBpbmZvIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBFTkRfT0ZfTUVNCShnZC0+YmQtPmJpX21lbXN0YXJ0ICsgZ2QtPmJkLT5iaV9tZW1zaXplKQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNldF90c3IodW5zaWduZWQgbG9uZyB2YWwpCit7CisjaWYgZGVmaW5lZChDT05GSUdfNDQwKQorCWFzbSB2b2xhdGlsZSgibXRzcHIgMHgxNTAsICUwIiA6IDogInIiICh2YWwpKTsKKyNlbHNlCisJYXNtIHZvbGF0aWxlKCJtdHRzciAlMCIgOiA6ICJyIiAodmFsKSk7CisjZW5kaWYKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBnZXRfZXNyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKyNpZiBkZWZpbmVkKENPTkZJR180NDApCisJYXNtIHZvbGF0aWxlKCJtZnNwciAlMCwgMHgwM2UiIDogIj1yIiAodmFsKSA6KTsKKyNlbHNlCisJYXNtIHZvbGF0aWxlKCJtZmVzciAlMCIgOiAiPXIiICh2YWwpIDopOworI2VuZGlmCisJcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBFU1JfTUNJIDB4ODAwMDAwMDAKKyNkZWZpbmUgRVNSX1BJTCAweDA4MDAwMDAwCisjZGVmaW5lIEVTUl9QUFIgMHgwNDAwMDAwMAorI2RlZmluZSBFU1JfUFRSIDB4MDIwMDAwMDAKKyNkZWZpbmUgRVNSX0RTVCAweDAwODAwMDAwCisjZGVmaW5lIEVTUl9ESVogMHgwMDQwMDAwMAorI2RlZmluZSBFU1JfVTBGIDB4MDAwMDgwMDAKKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCitleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZgorCisvKgorICogVHJhcCAmIEV4Y2VwdGlvbiBzdXBwb3J0CisgKi8KKwordm9pZAorcHJpbnRfYmFja3RyYWNlKHVuc2lnbmVkIGxvbmcgKnNwKQoreworCWludCBjbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgaTsKKworCXByaW50ZigiQ2FsbCBiYWNrdHJhY2U6ICIpOworCXdoaWxlIChzcCkgeworCQlpZiAoKHVpbnQpc3AgPiBFTkRfT0ZfTUVNKQorCQkJYnJlYWs7CisKKwkJaSA9IHNwWzFdOworCQlpZiAoY250KysgJSA3ID09IDApCisJCQlwcmludGYoIlxuIik7CisJCXByaW50ZigiJTA4bFggIiwgaSk7CisJCWlmIChjbnQgPiAzMikgYnJlYWs7CisJCXNwID0gKHVuc2lnbmVkIGxvbmcgKikqc3A7CisJfQorCXByaW50ZigiXG4iKTsKK30KKwordm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBpOworCisJcHJpbnRmKCJOSVA6ICUwOGxYIFhFUjogJTA4bFggTFI6ICUwOGxYIFJFR1M6ICVwIFRSQVA6ICUwNGx4IERFQVI6ICUwOGxYXG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPnhlciwgcmVncy0+bGluaywgcmVncywgcmVncy0+dHJhcCwgcmVncy0+ZGFyKTsKKwlwcmludGYoIk1TUjogJTA4bHggRUU6ICUwMXggUFI6ICUwMXggRlA6ICUwMXggTUU6ICUwMXggSVIvRFI6ICUwMXglMDF4XG4iLAorCSAgICAgICByZWdzLT5tc3IsIHJlZ3MtPm1zciZNU1JfRUUgPyAxIDogMCwgcmVncy0+bXNyJk1TUl9QUiA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3IgJiBNU1JfRlAgPyAxIDogMCxyZWdzLT5tc3ImTVNSX01FID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciZNU1JfSVIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyJk1TUl9EUiA/IDEgOiAwKTsKKworCXByaW50ZigiXG4iKTsKKwlmb3IgKGkgPSAwOyAgaSA8IDMyOyAgaSsrKSB7CisJCWlmICgoaSAlIDgpID09IDApIHsKKwkJCXByaW50ZigiR1BSJTAyZDogIiwgaSk7CisJCX0KKworCQlwcmludGYoIiUwOGxYICIsIHJlZ3MtPmdwcltpXSk7CisJCWlmICgoaSAlIDgpID09IDcpIHsKKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCX0KK30KKworCit2b2lkCitfZXhjZXB0aW9uKGludCBzaWduciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMoIkV4Y2VwdGlvbiIpOworfQorCit2b2lkCitNYWNoaW5lQ2hlY2tFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmaXh1cCwgdmFsOworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQorCXUzMiB2YWx1ZTI7CisJaW50IGNvcnJfZWNjID0gMDsKKwlpbnQgdW5jb3JyX2VjYyA9IDA7CisjZW5kaWYKKworCWlmICgoZml4dXAgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlKHJlZ3MtPm5pcCkpICE9IDApIHsKKwkJcmVncy0+bmlwID0gZml4dXA7CisJCXZhbCA9IG1mc3ByKE1DU1IpOworCQkvKiBDbGVhciBNQ1NSICovCisJCW10c3ByKFNQUk5fTUNTUiwgdmFsKTsKKwkJcmV0dXJuOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwcmludGYoIk1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uLlxuIik7CisJcHJpbnRmKCJDYXVzZWQgYnkgKGZyb20gbXNyKTogIik7CisJcHJpbnRmKCJyZWdzICVwICIsIHJlZ3MpOworCisJdmFsID0gZ2V0X2VzcigpOworCisjaWYgIWRlZmluZWQoQ09ORklHXzQ0MCkgJiYgIWRlZmluZWQoQ09ORklHXzQwNUVYKQorCWlmICh2YWwmIEVTUl9JTUNQKSB7CisJCXByaW50ZigiSW5zdHJ1Y3Rpb24iKTsKKwkJbXRzcHIoRVNSLCB2YWwgJiB+RVNSX0lNQ1ApOworCX0gZWxzZSB7CisJCXByaW50ZigiRGF0YSIpOworCX0KKwlwcmludGYoIiBtYWNoaW5lIGNoZWNrLlxuIik7CisKKyNlbGlmIGRlZmluZWQoQ09ORklHXzQ0MCkgfHwgZGVmaW5lZChDT05GSUdfNDA1RVgpCisJaWYgKHZhbCYgRVNSX0lNQ1ApeworCQlwcmludGYoIkluc3RydWN0aW9uIFN5bmNocm9ub3VzIE1hY2hpbmUgQ2hlY2sgZXhjZXB0aW9uXG4iKTsKKwkJbXRzcHIoU1BSTl9FU1IsIHZhbCAmIH5FU1JfSU1DUCk7CisJfSBlbHNlIHsKKwkJdmFsID0gbWZzcHIoTUNTUik7CisJCWlmICh2YWwgJiBNQ1NSX0lCKQorCQkJcHJpbnRmKCJJbnN0cnVjdGlvbiBSZWFkIFBMQiBFcnJvclxuIik7CisjaWYgZGVmaW5lZChDT05GSUdfNDQwKQorCQlpZiAodmFsICYgTUNTUl9EUkIpCisJCQlwcmludGYoIkRhdGEgUmVhZCBQTEIgRXJyb3JcbiIpOworCQlpZiAodmFsICYgTUNTUl9EV0IpCisJCQlwcmludGYoIkRhdGEgV3JpdGUgUExCIEVycm9yXG4iKTsKKyNlbHNlCisJCWlmICh2YWwgJiBNQ1NSX0RCKQorCQkJcHJpbnRmKCJEYXRhIFBMQiBFcnJvclxuIik7CisjZW5kaWYKKwkJaWYgKHZhbCAmIE1DU1JfVExCUCkKKwkJCXByaW50ZigiVExCIFBhcml0eSBFcnJvclxuIik7CisJCWlmICh2YWwgJiBNQ1NSX0lDUCl7CisJCQkvKmZsdXNoX2luc3RydWN0aW9uX2NhY2hlKCk7ICovCisJCQlwcmludGYoIkktQ2FjaGUgUGFyaXR5IEVycm9yXG4iKTsKKwkJfQorCQlpZiAodmFsICYgTUNTUl9EQ1NQKQorCQkJcHJpbnRmKCJELUNhY2hlIFNlYXJjaCBQYXJpdHkgRXJyb3JcbiIpOworCQlpZiAodmFsICYgTUNTUl9EQ0ZQKQorCQkJcHJpbnRmKCJELUNhY2hlIEZsdXNoIFBhcml0eSBFcnJvclxuIik7CisJCWlmICh2YWwgJiBNQ1NSX0lNUEUpCisJCQlwcmludGYoIk1hY2hpbmUgQ2hlY2sgZXhjZXB0aW9uIGlzIGltcHJlY2lzZVxuIik7CisKKwkJLyogQ2xlYXIgTUNTUiAqLworCQltdHNwcihTUFJOX01DU1IsIHZhbCk7CisJfQorI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkgfHwgZGVmaW5lZChDT05GSUdfNDQwR1JYKQorCW1mc2RyYW0oRERSMF8wMCwgdmFsKSA7CisJcHJpbnRmKCJERFIwOiBERFIwXzAwICVseFxuIiwgdmFsKTsKKwl2YWwgPSAodmFsID4+IDE2KSAmIDB4ZmY7CisJaWYgKHZhbCAmIDB4ODApCisJCXByaW50ZigiRERSMDogQXQgbGVhc3Qgb25lIGludGVycnVwdCBhY3RpdmVcbiIpOworCWlmICh2YWwgJiAweDQwKQorCQlwcmludGYoIkREUjA6IERSQU0gaW5pdGlhbGl6YXRpb24gY29tcGxldGUuXG4iKTsKKwlpZiAodmFsICYgMHgyMCkgeworCQlwcmludGYoIkREUjA6IE11bHRpcGxlIHVuY29ycmVjdGFibGUgRUNDIGV2ZW50cy5cbiIpOworCQl1bmNvcnJfZWNjID0gMTsKKwl9CisJaWYgKHZhbCAmIDB4MTApIHsKKwkJcHJpbnRmKCJERFIwOiBTaW5nbGUgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnQuXG4iKTsKKwkJdW5jb3JyX2VjYyA9IDE7CisJfQorCWlmICh2YWwgJiAweDA4KSB7CisJCXByaW50ZigiRERSMDogTXVsdGlwbGUgY29ycmVjdGFibGUgRUNDIGV2ZW50cy5cbiIpOworCQljb3JyX2VjYyA9IDE7CisJfQorCWlmICh2YWwgJiAweDA0KSB7CisJCXByaW50ZigiRERSMDogU2luZ2xlIGNvcnJlY3RhYmxlIEVDQyBldmVudC5cbiIpOworCQljb3JyX2VjYyA9IDE7CisJfQorCWlmICh2YWwgJiAweDAyKQorCQlwcmludGYoIk11bHRpcGxlIGFjY2Vzc2VzIG91dHNpZGUgdGhlIGRlZmluZWQiCisJCSAgICAgICAiIHBoeXNpY2FsIG1lbW9yeSBzcGFjZSBkZXRlY3RlZFxuIik7CisJaWYgKHZhbCAmIDB4MDEpCisJCXByaW50ZigiRERSMDogU2luZ2xlIGFjY2VzcyBvdXRzaWRlIHRoZSBkZWZpbmVkIgorCQkgICAgICAgIiBwaHlzaWNhbCBtZW1vcnkgc3BhY2UgZGV0ZWN0ZWQuXG4iKTsKKworCW1mc2RyYW0oRERSMF8wMSwgdmFsKTsKKwl2YWwgPSAodmFsID4+IDgpICYgMHg3OworCXN3aXRjaCAodmFsICkgeworCWNhc2UgMDoKKwkJcHJpbnRmKCJERFIwOiBXcml0ZSBPdXQtb2YtUmFuZ2UgY29tbWFuZFxuIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcHJpbnRmKCJERFIwOiBSZWFkIE91dC1vZi1SYW5nZSBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwcmludGYoIkREUjA6IE1hc2tlZCB3cml0ZSBPdXQtb2YtUmFuZ2UgY29tbWFuZFxuIik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcHJpbnRmKCJERFIwOiBXcmFwIHdyaXRlIE91dC1vZi1SYW5nZSBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlwcmludGYoIkREUjA6IFdyYXAgcmVhZCBPdXQtb2YtUmFuZ2UgY29tbWFuZFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1mc2RyYW0oRERSMF8wMSwgdmFsdWUyKTsKKwkJcHJpbnRmKCJERFIwOiBObyBERFIwIGVycm9yIGtub3cgMHglbHggJXhcbiIsIHZhbCwgdmFsdWUyKTsKKwl9CisJbWZzZHJhbShERFIwXzIzLCB2YWwpOworCWlmICgoKHZhbCA+PiAxNikgJiAweGZmKSAmJiBjb3JyX2VjYykKKwkJcHJpbnRmKCJERFIwOiBTeW5kcm9tZSBmb3IgY29ycmVjdGFibGUgRUNDIGV2ZW50IDB4JWx4XG4iLAorCQkgICAgICAgKHZhbCA+PiAxNikgJiAweGZmKTsKKwltZnNkcmFtKEREUjBfMjMsIHZhbCk7CisJaWYgKCgodmFsID4+IDgpICYgMHhmZikgJiYgdW5jb3JyX2VjYykKKwkJcHJpbnRmKCJERFIwOiBTeW5kcm9tZSBmb3IgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnQgMHglbHhcbiIsCisJCSAgICAgICAodmFsID4+IDgpICYgMHhmZik7CisJbWZzZHJhbShERFIwXzMzLCB2YWwpOworCWlmICh2YWwpCisJCXByaW50ZigiRERSMDogQWRkcmVzcyBvZiBjb21tYW5kIHRoYXQgY2F1c2VkIGFuICIKKwkJICAgICAgICJPdXQtb2YtUmFuZ2UgaW50ZXJydXB0ICVseFxuIiwgdmFsKTsKKwltZnNkcmFtKEREUjBfMzQsIHZhbCk7CisJaWYgKHZhbCAmJiB1bmNvcnJfZWNjKQorCQlwcmludGYoIkREUjA6IEFkZHJlc3Mgb2YgdW5jb3JyZWN0YWJsZSBFQ0MgZXZlbnQgJWx4XG4iLCB2YWwpOworCW1mc2RyYW0oRERSMF8zNSwgdmFsKTsKKwlpZiAodmFsICYmIHVuY29ycl9lY2MpCisJCXByaW50ZigiRERSMDogQWRkcmVzcyBvZiB1bmNvcnJlY3RhYmxlIEVDQyBldmVudCAlbHhcbiIsIHZhbCk7CisJbWZzZHJhbShERFIwXzM2LCB2YWwpOworCWlmICh2YWwgJiYgdW5jb3JyX2VjYykKKwkJcHJpbnRmKCJERFIwOiBEYXRhIG9mIHVuY29ycmVjdGFibGUgRUNDIGV2ZW50IDB4JTA4bHhcbiIsIHZhbCk7CisJbWZzZHJhbShERFIwXzM3LCB2YWwpOworCWlmICh2YWwgJiYgdW5jb3JyX2VjYykKKwkJcHJpbnRmKCJERFIwOiBEYXRhIG9mIHVuY29ycmVjdGFibGUgRUNDIGV2ZW50IDB4JTA4bHhcbiIsIHZhbCk7CisJbWZzZHJhbShERFIwXzM4LCB2YWwpOworCWlmICh2YWwgJiYgY29ycl9lY2MpCisJCXByaW50ZigiRERSMDogQWRkcmVzcyBvZiBjb3JyZWN0YWJsZSBFQ0MgZXZlbnQgJWx4XG4iLCB2YWwpOworCW1mc2RyYW0oRERSMF8zOSwgdmFsKTsKKwlpZiAodmFsICYmIGNvcnJfZWNjKQorCQlwcmludGYoIkREUjA6IEFkZHJlc3Mgb2YgY29ycmVjdGFibGUgRUNDIGV2ZW50ICVseFxuIiwgdmFsKTsKKwltZnNkcmFtKEREUjBfNDAsIHZhbCk7CisJaWYgKHZhbCAmJiBjb3JyX2VjYykKKwkJcHJpbnRmKCJERFIwOiBEYXRhIG9mIGNvcnJlY3RhYmxlIEVDQyBldmVudCAweCUwOGx4XG4iLCB2YWwpOworCW1mc2RyYW0oRERSMF80MSwgdmFsKTsKKwlpZiAodmFsICYmIGNvcnJfZWNjKQorCQlwcmludGYoIkREUjA6IERhdGEgb2YgY29ycmVjdGFibGUgRUNDIGV2ZW50IDB4JTA4bHhcbiIsIHZhbCk7CisjZW5kaWYgLyogQ09ORklHXzQ0MEVQWCAqLworI2VuZGlmIC8qIENPTkZJR180NDAgKi8KKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKwlwYW5pYygibWFjaGluZSBjaGVjayIpOworfQorCit2b2lkCitBbGlnbm1lbnRFeGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJBbGlnbm1lbnQgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQKK1Byb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlsb25nIGVzcl92YWw7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCisJc2hvd19yZWdzKHJlZ3MpOworCisJZXNyX3ZhbCA9IGdldF9lc3IoKTsKKwlpZiggZXNyX3ZhbCAmIEVTUl9QSUwgKQorCQlwcmludGYoICIqKiBJbGxlZ2FsIEluc3RydWN0aW9uICoqXG4iICk7CisJZWxzZSBpZiggZXNyX3ZhbCAmIEVTUl9QUFIgKQorCQlwcmludGYoICIqKiBQcml2aWxlZ2VkIEluc3RydWN0aW9uICoqXG4iICk7CisJZWxzZSBpZiggZXNyX3ZhbCAmIEVTUl9QVFIgKQorCQlwcmludGYoICIqKiBUcmFwIEluc3RydWN0aW9uICoqXG4iICk7CisKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJQcm9ncmFtIENoZWNrIEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitEZWNyZW1lbnRlclBJVEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKgorCSAqIFJlc2V0IFBJVCBpbnRlcnJ1cHQKKwkgKi8KKwlzZXRfdHNyKDB4MDgwMDAwMDApOworCisJLyoKKwkgKiBDYWxsIHRpbWVyX2ludGVycnVwdCByb3V0aW5lIGluIGludGVycnVwdHMuYworCSAqLworCXRpbWVyX2ludGVycnVwdChOVUxMKTsKK30KKworCit2b2lkCitVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwcmludGYoIkJhZCB0cmFwIGF0IFBDOiAlbHgsIFNSOiAlbHgsIHZlY3Rvcj0lbHhcbiIsCisJICAgICAgIHJlZ3MtPm5pcCwgcmVncy0+bXNyLCByZWdzLT50cmFwKTsKKwlfZXhjZXB0aW9uKDAsIHJlZ3MpOworfQorCit2b2lkCitEZWJ1Z0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOworCXNob3dfcmVncyhyZWdzKTsKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfQkVEQlVHKQorCWRvX2JlZGJ1Z19icmVha3BvaW50KCByZWdzICk7CisjZW5kaWYKK30KKworLyogUHJvYmUgYW4gYWRkcmVzcyBieSByZWFkaW5nLiAgSWYgbm90IHByZXNlbnQsIHJldHVybiAtMSwgb3RoZXJ3aXNlCisgKiByZXR1cm4gMC4KKyAqLworaW50CithZGRyX3Byb2JlKHVpbnQgKmFkZHIpCit7CisjaWYgMAorCWludAlyZXR2YWw7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJCSIxOglsd3ogJTAsMCglMSlcbiIJCVwKKwkJIgllaWVpb1xuIgkJXAorCQkiCWxpICUwLDBcbiIJCVwKKwkJIjI6XG4iCQkJCVwKKwkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJXAorCQkiMzoJbGkgJTAsLTFcbiIJCVwKKwkJIgliIDJiXG4iCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIglcCisJCSIJLmFsaWduIDJcbiIJCVwKKwkJIgkubG9uZyAxYiwzYlxuIgkJXAorCQkiLnRleHQiCQkJCVwKKwkJOiAiPXIiIChyZXR2YWwpIDogInIiKGFkZHIpKTsKKworCXJldHVybiAocmV0dmFsKTsKKyNlbmRpZgorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvdS1ib290LmxkcyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhMWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgkvKiBDT05GSUdfQk9BUkRESVIgKi8KKworI2lmbmRlZiBSRVNFVF9WRUNUT1JfQUREUkVTUworI2RlZmluZSBSRVNFVF9WRUNUT1JfQUREUkVTUwkweGZmZmZmZmZjCisjZW5kaWYKKworT1VUUFVUX0FSQ0gocG93ZXJwYykKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworUEhEUlMKK3sKKyAgdGV4dCBQVF9MT0FEOworICBic3MgUFRfTE9BRDsKK30KKworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpCX0KKyAgLnJlbC5yb2RhdGEgICAgOiB7ICooLnJlbC5yb2RhdGEpCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKQl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgICB9IDp0ZXh0CisgICAgX2V0ZXh0ID0gLjsKKyAgICBQUk9WSURFIChldGV4dCA9IC4pOworICAgIC5yb2RhdGEgICAgOgorICAgeworICAgICooLmVoX2ZyYW1lKQorICAgICooU09SVF9CWV9BTElHTk1FTlQoU09SVF9CWV9OQU1FKC5yb2RhdGEqKSkpCisgIH0gOnRleHQKKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+IDI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXykgPj4gMjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICAuID0gLjsKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisjaWZkZWYgQ09ORklHXzQ0MAorICAuYm9vdHBnIFJFU0VUX1ZFQ1RPUl9BRERSRVNTIC0gMHhmZmMgOgorICB7CisgICAgYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvc3RhcnQubwkoLmJvb3RwZykKKworICAgIC8qCisgICAgICogUFBDNDQwIGJvYXJkIG5lZWQgYSBib2FyZCBzcGVjaWZpYyBvYmplY3Qgd2l0aCB0aGUKKyAgICAgKiBUTEIgZGVmaW5pdGlvbnMuIFRoaXMgbmVlZHMgdG8gZ2V0IGluY2x1ZGVkIHJpZ2h0IGFmdGVyCisgICAgICogc3RhcnQubywgc2luY2UgdGhlIGZpcnN0IHNoYWRvdyBUTEIgb25seSBjb3ZlcnMgNGsKKyAgICAgKiBvZiBhZGRyZXNzIHNwYWNlLgorICAgICAqLworICAgIENPTkZJR19CT0FSRERJUi9pbml0Lm8JKC5ib290cGcpCisgIH0gOnRleHQgPSAweGZmZmYKKyNlbmRpZgorCisgIC5yZXNldHZlYyBSRVNFVF9WRUNUT1JfQUREUkVTUyA6CisgIHsKKyAgICAqKC5yZXNldHZlYykKKyAgfSA6dGV4dCA9IDB4ZmZmZgorCisgIC4gPSBSRVNFVF9WRUNUT1JfQUREUkVTUyArIDB4NDsKKworICAvKgorICAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgYnNzIHNlZ21lbnQgaXNuJ3QgbGlua2VkIGF0IDB4MCwgb3RoZXJ3aXNlIGl0cworICAgKiBhZGRyZXNzIHdvbid0IGJlIHVwZGF0ZWQgZHVyaW5nIHJlbG9jYXRpb24gZml4dXBzLiAgTm90ZSB0aGF0CisgICAqIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4LiAgQ29kZSB0byBkeW5hbWljYWxseSB0aGUgZml4dXAgdGhlIGJzcworICAgKiBsb2NhdGlvbiB3aWxsIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuICBXaGVuIHRoZSBic3MgcmVsb2NhdGlvbgorICAgKiBmaXh1cCBjb2RlIGlzIHByZXNlbnQgdGhpcyB3b3JrYXJvdW5kIHNob3VsZCBiZSByZW1vdmVkLgorICAgKi8KKyNpZiAoUkVTRVRfVkVDVE9SX0FERFJFU1MgPT0gMHhmZmZmZmZmYykKKyAgLiB8PSAweDEwOworI2VuZGlmCisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzIChOT0xPQUQpICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICB9IDpic3MKKworICAuID0gQUxJR04oNCk7CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC91aWMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3VpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMWIyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC91aWMuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMiAoNDQwIHBvcnQpCisgKiBTY290dCBNY051dHQsIEFydGVzeW4gQ29tbXVuaWNhdGlvbiBQcm9kdWNzLCBzbWNudXR0QGFydHN5bmNwLmNvbQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMyAoNDQwR1ggcG9ydCkKKyAqIFRyYXZpcyBCLiBTYXd5ZXIsIFNhbmRidXJzdCBDb3Jwb3JhdGlvbiwgdHNhd3llckBzYW5kYnVyc3QuY29tCisgKgorICogKEMpIENvcHlyaWdodCAyMDA4IChQUEM0NDBYMDUgcG9ydCBmb3IgVmlydGV4IDUgRlgpCisgKiBSaWNhcmRvIFJpYmFsZGEtVW5pdmVyc2lkYWQgQXV0b25vbWEgZGUgTWFkcmlkLXJpY2FyZG8ucmliYWxkYUB1YW0uZXMKKyAqIFdvcmsgc3VwcG9ydGVkIGJ5IFF0ZWNobm9sb2d5IChodHBwOi8vcXRlYy5jb20pCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisKKyNpZiAoVUlDX01BWCA+IDMpCisjZGVmaW5lIFVJQ0IwX0FMTAkoVUlDX01BU0soVkVDTlVNX1VJQzFDSSkgfCBVSUNfTUFTSyhWRUNOVU1fVUlDMU5DSSkgfCBcCisJCQkgVUlDX01BU0soVkVDTlVNX1VJQzJDSSkgfCBVSUNfTUFTSyhWRUNOVU1fVUlDMk5DSSkgfCBcCisJCQkgVUlDX01BU0soVkVDTlVNX1VJQzNDSSkgfCBVSUNfTUFTSyhWRUNOVU1fVUlDM05DSSkpCisjZWxpZiAoVUlDX01BWCA+IDIpCisjZGVmaW5lIFVJQ0IwX0FMTAkoVUlDX01BU0soVkVDTlVNX1VJQzFDSSkgfCBVSUNfTUFTSyhWRUNOVU1fVUlDMU5DSSkgfCBcCisJCQkgVUlDX01BU0soVkVDTlVNX1VJQzJDSSkgfCBVSUNfTUFTSyhWRUNOVU1fVUlDMk5DSSkpCisjZWxpZiAoVUlDX01BWCA+IDEpCisjZGVmaW5lIFVJQ0IwX0FMTAkoVUlDX01BU0soVkVDTlVNX1VJQzFDSSkgfCBVSUNfTUFTSyhWRUNOVU1fVUlDMU5DSSkpCisjZWxzZQorI2RlZmluZSBVSUNCMF9BTEwJMAorI2VuZGlmCisKK3UzMiBnZXRfZGNyKHUxNik7CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCit2b2lkIHBpY19lbmFibGUodm9pZCkKK3sKKyNpZiAoVUlDX01BWCA+IDEpCisJLyogSW5zdGFsbCB0aGUgVUlDMSBoYW5kbGVycyAqLworCWlycV9pbnN0YWxsX2hhbmRsZXIoVkVDTlVNX1VJQzFOQ0ksICh2b2lkICopKHZvaWQgKilleHRlcm5hbF9pbnRlcnJ1cHQsIDApOworCWlycV9pbnN0YWxsX2hhbmRsZXIoVkVDTlVNX1VJQzFDSSwgKHZvaWQgKikodm9pZCAqKWV4dGVybmFsX2ludGVycnVwdCwgMCk7CisjZW5kaWYKKyNpZiAoVUlDX01BWCA+IDIpCisJaXJxX2luc3RhbGxfaGFuZGxlcihWRUNOVU1fVUlDMk5DSSwgKHZvaWQgKikodm9pZCAqKWV4dGVybmFsX2ludGVycnVwdCwgMCk7CisJaXJxX2luc3RhbGxfaGFuZGxlcihWRUNOVU1fVUlDMkNJLCAodm9pZCAqKSh2b2lkICopZXh0ZXJuYWxfaW50ZXJydXB0LCAwKTsKKyNlbmRpZgorI2lmIChVSUNfTUFYID4gMykKKwlpcnFfaW5zdGFsbF9oYW5kbGVyKFZFQ05VTV9VSUMzTkNJLCAodm9pZCAqKSh2b2lkICopZXh0ZXJuYWxfaW50ZXJydXB0LCAwKTsKKwlpcnFfaW5zdGFsbF9oYW5kbGVyKFZFQ05VTV9VSUMzQ0ksICh2b2lkICopKHZvaWQgKilleHRlcm5hbF9pbnRlcnJ1cHQsIDApOworI2VuZGlmCit9CisKKy8qIEhhbmRsZXIgZm9yIFVJQyBpbnRlcnJ1cHQgKi8KK3N0YXRpYyB2b2lkIHVpY19pbnRlcnJ1cHQodTMyIHVpY19iYXNlLCBpbnQgdmVjX2Jhc2UpCit7CisJdTMyIHVpY19tc3I7CisJdTMyIG1zcl9zaGlmdDsKKwlpbnQgdmVjOworCisJLyoKKwkgKiBSZWFkIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHRvIGRldGVybWluZSBpbnRlcnJ1cHQgc291cmNlCisJICovCisJdWljX21zciA9IGdldF9kY3IodWljX2Jhc2UgKyBVSUNfTVNSKTsKKwltc3Jfc2hpZnQgPSB1aWNfbXNyOworCXZlYyA9IHZlY19iYXNlOworCisJd2hpbGUgKG1zcl9zaGlmdCAhPSAwKSB7CisJCWlmIChtc3Jfc2hpZnQgJiAweDgwMDAwMDAwKQorCQkJaW50ZXJydXB0X3J1bl9oYW5kbGVyKHZlYyk7CisJCS8qCisJCSAqIFNoaWZ0IG1zciB0byBuZXh0IHBvc2l0aW9uIGFuZCBpbmNyZW1lbnQgdmVjdG9yCisJCSAqLworCQltc3Jfc2hpZnQgPDw9IDE7CisJCXZlYysrOworCX0KK30KKworLyoKKyAqIEhhbmRsZSBleHRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgZXh0ZXJuYWxfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiB1aWNfbXNyOworCisJLyoKKwkgKiBSZWFkIG1hc2tlZCBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHRvIGRldGVybWluZSBpbnRlcnJ1cHQgc291cmNlCisJICovCisJdWljX21zciA9IG1mZGNyKFVJQzBNU1IpOworCisjaWYgKFVJQ19NQVggPiAxKQorCWlmICgoVUlDX01BU0soVkVDTlVNX1VJQzFDSSkgJiB1aWNfbXNyKSB8fAorCSAgICAoVUlDX01BU0soVkVDTlVNX1VJQzFOQ0kpICYgdWljX21zcikpCisJCXVpY19pbnRlcnJ1cHQoVUlDMV9EQ1JfQkFTRSwgMzIpOworI2VuZGlmCisKKyNpZiAoVUlDX01BWCA+IDIpCisJaWYgKChVSUNfTUFTSyhWRUNOVU1fVUlDMkNJKSAmIHVpY19tc3IpIHx8CisJICAgIChVSUNfTUFTSyhWRUNOVU1fVUlDMk5DSSkgJiB1aWNfbXNyKSkKKwkJdWljX2ludGVycnVwdChVSUMyX0RDUl9CQVNFLCA2NCk7CisjZW5kaWYKKworI2lmIChVSUNfTUFYID4gMykKKwlpZiAoKFVJQ19NQVNLKFZFQ05VTV9VSUMzQ0kpICYgdWljX21zcikgfHwKKwkgICAgKFVJQ19NQVNLKFZFQ05VTV9VSUMzTkNJKSAmIHVpY19tc3IpKQorCQl1aWNfaW50ZXJydXB0KFVJQzNfRENSX0JBU0UsIDk2KTsKKyNlbmRpZgorCisJbXRkY3IoVUlDMFNSLCAodWljX21zciAmIFVJQ0IwX0FMTCkpOworCisJaWYgKHVpY19tc3IgJiB+KFVJQ0IwX0FMTCkpCisJCXVpY19pbnRlcnJ1cHQoVUlDMF9EQ1JfQkFTRSwgMCk7CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgcGljX2lycV9hY2sodW5zaWduZWQgaW50IHZlYykKK3sKKwlpZiAoKHZlYyA+PSAwKSAmJiAodmVjIDwgMzIpKQorCQltdGRjcihVSUMwU1IsIFVJQ19NQVNLKHZlYykpOworCWVsc2UgaWYgKCh2ZWMgPj0gMzIpICYmICh2ZWMgPCA2NCkpCisJCW10ZGNyKFVJQzFTUiwgVUlDX01BU0sodmVjKSk7CisJZWxzZSBpZiAoKHZlYyA+PSA2NCkgJiYgKHZlYyA8IDk2KSkKKwkJbXRkY3IoVUlDMlNSLCBVSUNfTUFTSyh2ZWMpKTsKKwllbHNlIGlmICh2ZWMgPj0gOTYpCisJCW10ZGNyKFVJQzNTUiwgVUlDX01BU0sodmVjKSk7Cit9CisKKy8qCisgKiBJbnN0YWxsIGFuZCBmcmVlIGEgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3ZvaWQgcGljX2lycV9lbmFibGUodW5zaWduZWQgaW50IHZlYykKK3sKKworCWlmICgodmVjID49IDApICYmICh2ZWMgPCAzMikpCisJCW10ZGNyKFVJQzBFUiwgbWZkY3IoVUlDMEVSKSB8IFVJQ19NQVNLKHZlYykpOworCWVsc2UgaWYgKCh2ZWMgPj0gMzIpICYmICh2ZWMgPCA2NCkpCisJCW10ZGNyKFVJQzFFUiwgbWZkY3IoVUlDMUVSKSB8IFVJQ19NQVNLKHZlYykpOworCWVsc2UgaWYgKCh2ZWMgPj0gNjQpICYmICh2ZWMgPCA5NikpCisJCW10ZGNyKFVJQzJFUiwgbWZkY3IoVUlDMkVSKSB8IFVJQ19NQVNLKHZlYykpOworCWVsc2UgaWYgKHZlYyA+PSA5NikKKwkJbXRkY3IoVUlDM0VSLCBtZmRjcihVSUMzRVIpIHwgVUlDX01BU0sodmVjKSk7CisKKwlkZWJ1ZygiSW5zdGFsbCBpbnRlcnJ1cHQgdmVjdG9yICVkXG4iLCB2ZWMpOworfQorCit2b2lkIHBpY19pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmVjKQoreworCWlmICgodmVjID49IDApICYmICh2ZWMgPCAzMikpCisJCW10ZGNyKFVJQzBFUiwgbWZkY3IoVUlDMEVSKSAmIH5VSUNfTUFTSyh2ZWMpKTsKKwllbHNlIGlmICgodmVjID49IDMyKSAmJiAodmVjIDwgNjQpKQorCQltdGRjcihVSUMxRVIsIG1mZGNyKFVJQzFFUikgJiB+VUlDX01BU0sodmVjKSk7CisJZWxzZSBpZiAoKHZlYyA+PSA2NCkgJiYgKHZlYyA8IDk2KSkKKwkJbXRkY3IoVUlDMkVSLCBtZmRjcihVSUMyRVIpICYgflVJQ19NQVNLKHZlYykpOworCWVsc2UgaWYgKHZlYyA+PSA5NikKKwkJbXRkY3IoVUlDM0VSLCBtZmRjcihVSUMzRVIpICYgflVJQ19NQVNLKHZlYykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvdXNiLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTJlZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvdXNiLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogTWFya3VzIEtsb3R6YnVlY2hlciwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZyA8bWtAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9ORVcpICYmIGRlZmluZWQoQ09ORklHX1NZU19VU0JfT0hDSV9DUFVfSU5JVCkKKworI2lmZGVmIENPTkZJR180eHhfRENBQ0hFCisjaW5jbHVkZSA8YXNtL21tdS5oPgorREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisjZW5kaWYKKworI2luY2x1ZGUgInVzYmRldi5oIgorCitpbnQgdXNiX2NwdV9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHXzR4eF9EQ0FDSEUKKwkvKiBkaXNhYmxlIGNhY2hlICovCisJY2hhbmdlX3RsYihnZC0+YmQtPmJpX21lbXN0YXJ0LCBnZC0+YmQtPmJpX21lbXNpemUsIFRMQl9XT1JEMl9JX0VOQUJMRSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUFgpCisJdXNiX2Rldl9pbml0KCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9jcHVfc3RvcCh2b2lkKQoreworI2lmZGVmIENPTkZJR180eHhfRENBQ0hFCisJLyogZW5hYmxlIGNhY2hlICovCisJY2hhbmdlX3RsYihnZC0+YmQtPmJpX21lbXN0YXJ0LCBnZC0+YmQtPmJpX21lbXNpemUsIDApOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2ludCB1c2JfY3B1X2luaXRfZmFpbCh2b2lkKQoreworI2lmZGVmIENPTkZJR180eHhfRENBQ0hFCisJLyogZW5hYmxlIGNhY2hlICovCisJY2hhbmdlX3RsYihnZC0+YmQtPmJpX21lbXN0YXJ0LCBnZC0+YmQtPmJpX21lbXNpemUsIDApOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0JfT0hDSSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX1VTQl9PSENJX0NQVV9JTklUKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvdXNiX29oY2kuYyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3VzYl9vaGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllZGFjZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3VzYl9vaGNpLmMKQEAgLTAsMCArMSwxNjQ4IEBACisvKgorICogVVJCIE9IQ0kgSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCIG9uIHRoZSBQUEM0NDBFUC4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDMtMjAwNAorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcgPGdhcnlqQGRlbnguZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBQaWVycmUgQXViZXJ0LCBTdGF1YmxpIEZhdmVyZ2VzIDxwLmF1YmVydEBzdGF1YmxpLmNvbT4KKyAqCisgKiBOb3RlOiBNdWNoIG9mIHRoaXMgY29kZSBoYXMgYmVlbiBkZXJpdmVkIGZyb20gTGludXggMi40CisgKiAoQykgQ29weXJpZ2h0IDE5OTkgUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKy8qCisgKiBJTVBPUlRBTlQgTk9URVMKKyAqIDEgLSB0aGlzIGRyaXZlciBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggVVNCIE1hc3MgU3RvcmFnZSBEZXZpY2VzCisgKiAgICAgKEJCQikgT05MWS4gVGhlcmUgaXMgTk8gc3VwcG9ydCBmb3IgSW50ZXJydXB0IG9yIElzb2Nocm9ub3VzIHBpcGVzIQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENPTkZJR19VU0JfT0hDSQorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8dXNiLmg+CisjaW5jbHVkZSAidXNiX29oY2kuaCIKKworI2luY2x1ZGUgInVzYmRldi5oIgorCisjZGVmaW5lIE9IQ0lfVVNFX05QUwkJLyogZm9yY2UgTm9Qb3dlclN3aXRjaGluZyBtb2RlICovCisjdW5kZWYgT0hDSV9WRVJCT1NFX0RFQlVHCS8qIG5vdCBhbHdheXMgaGVscGZ1bCAqLworI3VuZGVmIERFQlVHCisjdW5kZWYgU0hPV19JTkZPCisjdW5kZWYgT0hDSV9GSUxMX1RSQUNFCisKKy8qIEZvciBpbml0aWFsaXppbmcgY29udHJvbGxlciAobWFzayBpbiBhbiBIQ0ZTIG1vZGUgdG9vKSAqLworI2RlZmluZSBPSENJX0NPTlRST0xfSU5JVCBcCisJKE9IQ0lfQ1RSTF9DQlNSICYgMHgzKSB8IE9IQ0lfQ1RSTF9JRSB8IE9IQ0lfQ1RSTF9QTEUKKworI2RlZmluZSByZWFkbChhKSAoKigodm9sYXRpbGUgdTMyICopKGEpKSkKKyNkZWZpbmUgd3JpdGVsKGEsIGIpICgqKCh2b2xhdGlsZSB1MzIgKikoYikpID0gKCh2b2xhdGlsZSB1MzIpYSkpCisKKyNkZWZpbmUgbWluX3QodHlwZSx4LHkpICh7IHR5cGUgX194ID0gKHgpOyB0eXBlIF9feSA9ICh5KTsgX194IDwgX195ID8gX194OiBfX3k7IH0pCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIHByaW50ZigiREVCVUc6ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZiAvKiBERUJVRyAqLworI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ZigiRVJST1I6ICIgZm9ybWF0ICJcbiIsICMjIGFyZykKKyNpZmRlZiBTSE9XX0lORk8KKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRmKCJJTkZPOiAiIGZvcm1hdCAiXG4iLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgbTE2X3N3YXAoeCkgc3dhcF8xNih4KQorI2RlZmluZSBtMzJfc3dhcCh4KSBzd2FwXzMyKHgpCisKKyNpZiBkZWZpbmVkKENPTkZJR180MDVFWikgfHwgZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkKKyNkZWZpbmUgb2hjaV9jcHVfdG9fbGUxNih4KSAoeCkKKyNkZWZpbmUgb2hjaV9jcHVfdG9fbGUzMih4KSAoeCkKKyNlbHNlCisjZGVmaW5lIG9oY2lfY3B1X3RvX2xlMTYoeCkgc3dhcF8xNih4KQorI2RlZmluZSBvaGNpX2NwdV90b19sZTMyKHgpIHN3YXBfMzIoeCkKKyNlbmRpZgorCisvKiBnbG9iYWwgb2hjaV90ICovCitzdGF0aWMgb2hjaV90IGdvaGNpOworLyogdGhpcyBtdXN0IGJlIGFsaWduZWQgdG8gYSAyNTYgYnl0ZSBib3VuZGFyeSAqLworc3RydWN0IG9oY2lfaGNjYSBnaGNjYVsxXTsKKy8qIGEgcG9pbnRlciB0byB0aGUgYWxpZ25lZCBzdG9yYWdlICovCitzdHJ1Y3Qgb2hjaV9oY2NhICpwaGNjYTsKKy8qIHRoaXMgYWxsb2NhdGVzIEVEcyBmb3IgYWxsIHBvc3NpYmxlIGVuZHBvaW50cyAqLworc3RydWN0IG9oY2lfZGV2aWNlIG9oY2lfZGV2OworLyogdXJiX3ByaXYgKi8KK3VyYl9wcml2X3QgdXJiX3ByaXY7CisvKiBSSFNDIGZsYWcgKi8KK2ludCBnb3RfcmhzYzsKKy8qIGRldmljZSB3aGljaCB3YXMgZGlzY29ubmVjdGVkICovCitzdHJ1Y3QgdXNiX2RldmljZSAqZGV2Z29uZTsKKy8qIGZsYWcgZ3VhcmRpbmcgVVJCIHRyYW5zYXRpb24gKi8KK2ludCB1cmJfZmluaXNoZWQgPSAwOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBTUQtNzU2IChEMiByZXYpIHJlcG9ydHMgY29ycnVwdCByZWdpc3RlciBjb250ZW50cyBpbiBzb21lIGNhc2VzLgorICogVGhlIGVycmF0dW0gKCM0KSBkZXNjcmlwdGlvbiBpcyBpbmNvcnJlY3QuICBBTUQncyB3b3JrYXJvdW5kIHdhaXRzCisgKiB0aWxsIHNvbWUgYml0cyAobW9zdGx5IHJlc2VydmVkKSBhcmUgY2xlYXI7IG9rIGZvciBhbGwgcmV2cy4KKyAqLworI2RlZmluZSBPSENJX1FVSVJLX0FNRDc1NiAweGFiY2QKKyNkZWZpbmUgcmVhZF9yb290aHViKGhjLCByZWdpc3RlciwgbWFzaykgKHsgXAorCXUzMiB0ZW1wID0gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5yZWdpc3Rlcik7IFwKKwlpZiAoaGMtPmZsYWdzICYgT0hDSV9RVUlSS19BTUQ3NTYpIFwKKwkJd2hpbGUgKHRlbXAgJiBtYXNrKSBcCisJCQl0ZW1wID0gcmVhZGwgKCZoYy0+cmVncy0+cm9vdGh1Yi5yZWdpc3Rlcik7IFwKKwl0ZW1wOyB9KQorCitzdGF0aWMgdTMyIHJvb3RodWJfYSAoc3RydWN0IG9oY2kgKmhjKQorCXsgcmV0dXJuIHJlYWRfcm9vdGh1YiAoaGMsIGEsIDB4ZmMwZmUwMDApOyB9CitzdGF0aWMgaW5saW5lIHUzMiByb290aHViX2IgKHN0cnVjdCBvaGNpICpoYykKKwl7IHJldHVybiByZWFkbCAoJmhjLT5yZWdzLT5yb290aHViLmIpOyB9CitzdGF0aWMgaW5saW5lIHUzMiByb290aHViX3N0YXR1cyAoc3RydWN0IG9oY2kgKmhjKQorCXsgcmV0dXJuIHJlYWRsICgmaGMtPnJlZ3MtPnJvb3RodWIuc3RhdHVzKTsgfQorc3RhdGljIHUzMiByb290aHViX3BvcnRzdGF0dXMgKHN0cnVjdCBvaGNpICpoYywgaW50IGkpCisJeyByZXR1cm4gcmVhZF9yb290aHViIChoYywgcG9ydHN0YXR1cyBbaV0sIDB4ZmZlMGZjZTApOyB9CisKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIGludCBoY19pbnRlcnJ1cHQgKHZvaWQpOworc3RhdGljIHZvaWQKK3RkX3N1Ym1pdF9qb2IgKHN0cnVjdCB1c2JfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKiBidWZmZXIsCisJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKiBzZXR1cCwgdXJiX3ByaXZfdCAqIHVyYiwgaW50IGludGVydmFsKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogVVJCIHN1cHBvcnQgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBmcmVlIEhDRC1wcml2YXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVVJCICovCisKK3N0YXRpYyB2b2lkIHVyYl9mcmVlX3ByaXYgKHVyYl9wcml2X3QgKiB1cmIpCit7CisJaW50CQlpOworCWludAkJbGFzdDsKKwlzdHJ1Y3QgdGQJKiB0ZDsKKworCWxhc3QgPSB1cmItPmxlbmd0aCAtIDE7CisJaWYgKGxhc3QgPj0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgeworCQkJdGQgPSB1cmItPnRkW2ldOworCQkJaWYgKHRkKSB7CisJCQkJdGQtPnVzYl9kZXYgPSBOVUxMOworCQkJCXVyYi0+dGRbaV0gPSBOVUxMOworCQkJfQorCQl9CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgREVCVUcKK3N0YXRpYyBpbnQgc29oY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyIChzdHJ1Y3QgdXNiX2RldmljZSAqIGRldik7CisKKy8qIGRlYnVnfCBwcmludCB0aGUgbWFpbiBjb21wb25lbnRzIG9mIGFuIFVSQgorICogc21hbGw6IDApIGhlYWRlciArIGRhdGEgcGFja2V0cyAxKSBqdXN0IGhlYWRlciAqLworCitzdGF0aWMgdm9pZCBwa3RfcHJpbnQgKHN0cnVjdCB1c2JfZGV2aWNlICogZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKiBidWZmZXIsCisJaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKiBzZXR1cCwgY2hhciAqIHN0ciwgaW50IHNtYWxsKQoreworCXVyYl9wcml2X3QgKiBwdXJiID0gJnVyYl9wcml2OworCisJZGJnKCIlcyBVUkI6WyU0eF0gZGV2OiUyZCxlcDolMmQtJWMsdHlwZTolcyxsZW46JWQvJWQgc3RhdDolI2x4IiwKKwkJCXN0ciwKKwkJCXNvaGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlciAoZGV2KSwKKwkJCXVzYl9waXBlZGV2aWNlIChwaXBlKSwKKwkJCXVzYl9waXBlZW5kcG9pbnQgKHBpcGUpLAorCQkJdXNiX3BpcGVvdXQgKHBpcGUpPyAnTyc6ICdJJywKKwkJCXVzYl9waXBldHlwZSAocGlwZSkgPCAyPyAodXNiX3BpcGVpbnQgKHBpcGUpPyAiSU5UUiI6ICJJU09DIik6CisJCQkJKHVzYl9waXBlY29udHJvbCAocGlwZSk/ICJDVFJMIjogIkJVTEsiKSwKKwkJCXB1cmItPmFjdHVhbF9sZW5ndGgsCisJCQl0cmFuc2Zlcl9sZW4sIGRldi0+c3RhdHVzKTsKKyNpZmRlZglPSENJX1ZFUkJPU0VfREVCVUcKKwlpZiAoIXNtYWxsKSB7CisJCWludCBpLCBsZW47CisKKwkJaWYgKHVzYl9waXBlY29udHJvbCAocGlwZSkpIHsKKwkJCXByaW50ZiAoX19GSUxFX18gIjogY21kKDgpOiIpOworCQkJZm9yIChpID0gMDsgaSA8IDggOyBpKyspCisJCQkJcHJpbnRmICgiICUwMngiLCAoKF9fdTggKikgc2V0dXApIFtpXSk7CisJCQlwcmludGYgKCJcbiIpOworCQl9CisJCWlmICh0cmFuc2Zlcl9sZW4gPiAwICYmIGJ1ZmZlcikgeworCQkJcHJpbnRmIChfX0ZJTEVfXyAiOiBkYXRhKCVkLyVkKToiLAorCQkJCXB1cmItPmFjdHVhbF9sZW5ndGgsCisJCQkJdHJhbnNmZXJfbGVuKTsKKwkJCWxlbiA9IHVzYl9waXBlb3V0IChwaXBlKT8KKwkJCQkJdHJhbnNmZXJfbGVuOiBwdXJiLT5hY3R1YWxfbGVuZ3RoOworCQkJZm9yIChpID0gMDsgaSA8IDE2ICYmIGkgPCBsZW47IGkrKykKKwkJCQlwcmludGYgKCIgJTAyeCIsICgoX191OCAqKSBidWZmZXIpIFtpXSk7CisJCQlwcmludGYgKCIlc1xuIiwgaSA8IGxlbj8gIi4uLiI6ICIiKTsKKwkJfQorCX0KKyNlbmRpZgorfQorCisvKiBqdXN0IGZvciBkZWJ1Z2dpbmc7IHByaW50cyBub24tZW1wdHkgYnJhbmNoZXMgb2YgdGhlIGludCBlZCB0cmVlIGluY2x1c2l2ZSBpc28gZWRzKi8KK3ZvaWQgZXBfcHJpbnRfaW50X2VkcyAob2hjaV90ICpvaGNpLCBjaGFyICogc3RyKSB7CisJaW50IGksIGo7CisJIF9fdTMyICogZWRfcDsKKwlmb3IgKGk9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWogPSA1OworCQllZF9wID0gJihvaGNpLT5oY2NhLT5pbnRfdGFibGUgW2ldKTsKKwkJaWYgKCplZF9wID09IDApCisJCSAgICBjb250aW51ZTsKKwkJcHJpbnRmIChfX0ZJTEVfXyAiOiAlcyBicmFuY2ggaW50ICUyZCglMngpOiIsIHN0ciwgaSwgaSk7CisJCXdoaWxlICgqZWRfcCAhPSAwICYmIGotLSkgeworCQkJZWRfdCAqZWQgPSAoZWRfdCAqKW9oY2lfY3B1X3RvX2xlMzIoZWRfcCk7CisJCQlwcmludGYgKCIgZWQ6ICU0eDsiLCBlZC0+aHdJTkZPKTsKKwkJCWVkX3AgPSAmZWQtPmh3TmV4dEVEOworCQl9CisJCXByaW50ZiAoIlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBvaGNpX2R1bXBfaW50cl9tYXNrIChjaGFyICpsYWJlbCwgX191MzIgbWFzaykKK3sKKwlkYmcgKCIlczogMHglMDh4JXMlcyVzJXMlcyVzJXMlcyVzIiwKKwkJbGFiZWwsCisJCW1hc2ssCisJCShtYXNrICYgT0hDSV9JTlRSX01JRSkgPyAiIE1JRSIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfT0MpID8gIiBPQyIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfUkhTQykgPyAiIFJIU0MiIDogIiIsCisJCShtYXNrICYgT0hDSV9JTlRSX0ZOTykgPyAiIEZOTyIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfVUUpID8gIiBVRSIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfUkQpID8gIiBSRCIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfU0YpID8gIiBTRiIgOiAiIiwKKwkJKG1hc2sgJiBPSENJX0lOVFJfV0RIKSA/ICIgV0RIIiA6ICIiLAorCQkobWFzayAmIE9IQ0lfSU5UUl9TTykgPyAiIFNPIiA6ICIiCisJCSk7Cit9CisKK3N0YXRpYyB2b2lkIG1heWJlX3ByaW50X2VkcyAoY2hhciAqbGFiZWwsIF9fdTMyIHZhbHVlKQoreworCWVkX3QgKmVkcCA9IChlZF90ICopdmFsdWU7CisKKwlpZiAodmFsdWUpIHsKKwkJZGJnICgiJXMgJTA4eCIsIGxhYmVsLCB2YWx1ZSk7CisJCWRiZyAoIiUwOHgiLCBlZHAtPmh3SU5GTyk7CisJCWRiZyAoIiUwOHgiLCBlZHAtPmh3VGFpbFApOworCQlkYmcgKCIlMDh4IiwgZWRwLT5od0hlYWRQKTsKKwkJZGJnICgiJTA4eCIsIGVkcC0+aHdOZXh0RUQpOworCX0KK30KKworc3RhdGljIGNoYXIgKiBoY2ZzMnN0cmluZyAoaW50IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBPSENJX1VTQl9SRVNFVDoJcmV0dXJuICJyZXNldCI7CisJCWNhc2UgT0hDSV9VU0JfUkVTVU1FOglyZXR1cm4gInJlc3VtZSI7CisJCWNhc2UgT0hDSV9VU0JfT1BFUjoJcmV0dXJuICJvcGVyYXRpb25hbCI7CisJCWNhc2UgT0hDSV9VU0JfU1VTUEVORDoJcmV0dXJuICJzdXNwZW5kIjsKKwl9CisJcmV0dXJuICI/IjsKK30KKworLyogZHVtcCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZCBvaGNpX2R1bXBfc3RhdHVzIChvaGNpX3QgKmNvbnRyb2xsZXIpCit7CisJc3RydWN0IG9oY2lfcmVncwkqcmVncyA9IGNvbnRyb2xsZXItPnJlZ3M7CisJX191MzIJCQl0ZW1wOworCisJdGVtcCA9IHJlYWRsICgmcmVncy0+cmV2aXNpb24pICYgMHhmZjsKKwlpZiAodGVtcCAhPSAweDEwKQorCQlkYmcgKCJzcGVjICVkLiVkIiwgKHRlbXAgPj4gNCksICh0ZW1wICYgMHgwZikpOworCisJdGVtcCA9IHJlYWRsICgmcmVncy0+Y29udHJvbCk7CisJZGJnICgiY29udHJvbDogMHglMDh4JXMlcyVzIEhDRlM9JXMlcyVzJXMlcyBDQlNSPSVkIiwgdGVtcCwKKwkJKHRlbXAgJiBPSENJX0NUUkxfUldFKSA/ICIgUldFIiA6ICIiLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9SV0MpID8gIiBSV0MiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX0lSKSA/ICIgSVIiIDogIiIsCisJCWhjZnMyc3RyaW5nICh0ZW1wICYgT0hDSV9DVFJMX0hDRlMpLAorCQkodGVtcCAmIE9IQ0lfQ1RSTF9CTEUpID8gIiBCTEUiIDogIiIsCisJCSh0ZW1wICYgT0hDSV9DVFJMX0NMRSkgPyAiIENMRSIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NUUkxfSUUpID8gIiBJRSIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NUUkxfUExFKSA/ICIgUExFIiA6ICIiLAorCQl0ZW1wICYgT0hDSV9DVFJMX0NCU1IKKwkJKTsKKworCXRlbXAgPSByZWFkbCAoJnJlZ3MtPmNtZHN0YXR1cyk7CisJZGJnICgiY21kc3RhdHVzOiAweCUwOHggU09DPSVkJXMlcyVzJXMiLCB0ZW1wLAorCQkodGVtcCAmIE9IQ0lfU09DKSA+PiAxNiwKKwkJKHRlbXAgJiBPSENJX09DUikgPyAiIE9DUiIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0JMRikgPyAiIEJMRiIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0NMRikgPyAiIENMRiIgOiAiIiwKKwkJKHRlbXAgJiBPSENJX0hDUikgPyAiIEhDUiIgOiAiIgorCQkpOworCisJb2hjaV9kdW1wX2ludHJfbWFzayAoImludHJzdGF0dXMiLCByZWFkbCAoJnJlZ3MtPmludHJzdGF0dXMpKTsKKwlvaGNpX2R1bXBfaW50cl9tYXNrICgiaW50cmVuYWJsZSIsIHJlYWRsICgmcmVncy0+aW50cmVuYWJsZSkpOworCisJbWF5YmVfcHJpbnRfZWRzICgiZWRfcGVyaW9kY3VycmVudCIsIHJlYWRsICgmcmVncy0+ZWRfcGVyaW9kY3VycmVudCkpOworCisJbWF5YmVfcHJpbnRfZWRzICgiZWRfY29udHJvbGhlYWQiLCByZWFkbCAoJnJlZ3MtPmVkX2NvbnRyb2xoZWFkKSk7CisJbWF5YmVfcHJpbnRfZWRzICgiZWRfY29udHJvbGN1cnJlbnQiLCByZWFkbCAoJnJlZ3MtPmVkX2NvbnRyb2xjdXJyZW50KSk7CisKKwltYXliZV9wcmludF9lZHMgKCJlZF9idWxraGVhZCIsIHJlYWRsICgmcmVncy0+ZWRfYnVsa2hlYWQpKTsKKwltYXliZV9wcmludF9lZHMgKCJlZF9idWxrY3VycmVudCIsIHJlYWRsICgmcmVncy0+ZWRfYnVsa2N1cnJlbnQpKTsKKworCW1heWJlX3ByaW50X2VkcyAoImRvbmVoZWFkIiwgcmVhZGwgKCZyZWdzLT5kb25laGVhZCkpOworfQorCitzdGF0aWMgdm9pZCBvaGNpX2R1bXBfcm9vdGh1YiAob2hjaV90ICpjb250cm9sbGVyLCBpbnQgdmVyYm9zZSkKK3sKKwlfX3UzMgkJCXRlbXAsIG5kcCwgaTsKKworCXRlbXAgPSByb290aHViX2EgKGNvbnRyb2xsZXIpOworCW5kcCA9ICh0ZW1wICYgUkhfQV9ORFApOworCisJaWYgKHZlcmJvc2UpIHsKKwkJZGJnICgicm9vdGh1Yi5hOiAlMDh4IFBPVFBHVD0lZCVzJXMlcyVzJXMgTkRQPSVkIiwgdGVtcCwKKwkJCSgodGVtcCAmIFJIX0FfUE9UUEdUKSA+PiAyNCkgJiAweGZmLAorCQkJKHRlbXAgJiBSSF9BX05PQ1ApID8gIiBOT0NQIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9BX09DUE0pID8gIiBPQ1BNIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9BX0RUKSA/ICIgRFQiIDogIiIsCisJCQkodGVtcCAmIFJIX0FfTlBTKSA/ICIgTlBTIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9BX1BTTSkgPyAiIFBTTSIgOiAiIiwKKwkJCW5kcAorCQkJKTsKKwkJdGVtcCA9IHJvb3RodWJfYiAoY29udHJvbGxlcik7CisJCWRiZyAoInJvb3RodWIuYjogJTA4eCBQUENNPSUwNHggRFI9JTA0eCIsCisJCQl0ZW1wLAorCQkJKHRlbXAgJiBSSF9CX1BQQ00pID4+IDE2LAorCQkJKHRlbXAgJiBSSF9CX0RSKQorCQkJKTsKKwkJdGVtcCA9IHJvb3RodWJfc3RhdHVzIChjb250cm9sbGVyKTsKKwkJZGJnICgicm9vdGh1Yi5zdGF0dXM6ICUwOHglcyVzJXMlcyVzJXMiLAorCQkJdGVtcCwKKwkJCSh0ZW1wICYgUkhfSFNfQ1JXRSkgPyAiIENSV0UiIDogIiIsCisJCQkodGVtcCAmIFJIX0hTX09DSUMpID8gIiBPQ0lDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9IU19MUFNDKSA/ICIgTFBTQyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfSFNfRFJXRSkgPyAiIERSV0UiIDogIiIsCisJCQkodGVtcCAmIFJIX0hTX09DSSkgPyAiIE9DSSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfSFNfTFBTKSA/ICIgTFBTIiA6ICIiCisJCQkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuZHA7IGkrKykgeworCQl0ZW1wID0gcm9vdGh1Yl9wb3J0c3RhdHVzIChjb250cm9sbGVyLCBpKTsKKwkJZGJnICgicm9vdGh1Yi5wb3J0c3RhdHVzIFslZF0gPSAweCUwOHglcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMiLAorCQkJaSwKKwkJCXRlbXAsCisJCQkodGVtcCAmIFJIX1BTX1BSU0MpID8gIiBQUlNDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19PQ0lDKSA/ICIgT0NJQyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUFNTQykgPyAiIFBTU0MiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX1BFU0MpID8gIiBQRVNDIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19DU0MpID8gIiBDU0MiIDogIiIsCisKKwkJCSh0ZW1wICYgUkhfUFNfTFNEQSkgPyAiIExTREEiIDogIiIsCisJCQkodGVtcCAmIFJIX1BTX1BQUykgPyAiIFBQUyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUFJTKSA/ICIgUFJTIiA6ICIiLAorCQkJKHRlbXAgJiBSSF9QU19QT0NJKSA/ICIgUE9DSSIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfUFNTKSA/ICIgUFNTIiA6ICIiLAorCisJCQkodGVtcCAmIFJIX1BTX1BFUykgPyAiIFBFUyIgOiAiIiwKKwkJCSh0ZW1wICYgUkhfUFNfQ0NTKSA/ICIgQ0NTIiA6ICIiCisJCQkpOworCX0KK30KKworc3RhdGljIHZvaWQgb2hjaV9kdW1wIChvaGNpX3QgKmNvbnRyb2xsZXIsIGludCB2ZXJib3NlKQoreworCWRiZyAoIk9IQ0kgY29udHJvbGxlciB1c2ItJXMgc3RhdGUiLCBjb250cm9sbGVyLT5zbG90X25hbWUpOworCisJLyogZHVtcHMgc29tZSBvZiB0aGUgc3RhdGUgd2Uga25vdyBhYm91dCAqLworCW9oY2lfZHVtcF9zdGF0dXMgKGNvbnRyb2xsZXIpOworCWlmICh2ZXJib3NlKQorCQllcF9wcmludF9pbnRfZWRzIChjb250cm9sbGVyLCAiaGNjYSIpOworCWRiZyAoImhjY2EgZnJhbWUgIyUwNHgiLCBjb250cm9sbGVyLT5oY2NhLT5mcmFtZV9ubyk7CisJb2hjaV9kdW1wX3Jvb3RodWIgKGNvbnRyb2xsZXIsIDEpOworfQorCisKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBJbnRlcmZhY2UgZnVuY3Rpb25zIChVUkIpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBnZXQgYSB0cmFuc2ZlciByZXF1ZXN0ICovCisKK2ludCBzb2hjaV9zdWJtaXRfam9iKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXAsIGludCBpbnRlcnZhbCkKK3sKKwlvaGNpX3QgKm9oY2k7CisJZWRfdCAqIGVkOworCXVyYl9wcml2X3QgKnB1cmJfcHJpdjsKKwlpbnQgaSwgc2l6ZSA9IDA7CisKKwlvaGNpID0gJmdvaGNpOworCisJLyogd2hlbiBjb250cm9sbGVyJ3MgaHVuZywgcGVybWl0IG9ubHkgcm9vdGh1YiBjbGVhbnVwIGF0dGVtcHRzCisJICogc3VjaCBhcyBwb3dlcmluZyBkb3duIHBvcnRzICovCisJaWYgKG9oY2ktPmRpc2FibGVkKSB7CisJCWVycigic29oY2lfc3VibWl0X2pvYjogRVBJUEUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGlmIHdlIGhhdmUgYW4gdW5maW5pc2hlZCBVUkIgZnJvbSBwcmV2aW91cyB0cmFuc2FjdGlvbiBsZXQncworCSAqIGZhaWwgYW5kIHNjcmVhbSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIHNvIGFzIG5vdCB0byBjb3JydXB0CisJICogZnVydGhlciBjb21tdW5pY2F0aW9uICovCisJaWYgKCF1cmJfZmluaXNoZWQpIHsKKwkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBVUkIgTk9UIEZJTklTSEVEIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogd2UncmUgYWJvdXQgdG8gYmVnaW4gYSBuZXcgdHJhbnNhY3Rpb24gaGVyZSBzbyBtYXJrIHRoZSBVUkIgdW5maW5pc2hlZCAqLworCXVyYl9maW5pc2hlZCA9IDA7CisKKwkvKiBldmVyeSBlbmRwb2ludCBoYXMgYSBlZCwgbG9jYXRlIGFuZCBmaWxsIGl0ICovCisJaWYgKCEoZWQgPSBlcF9hZGRfZWQgKGRldiwgcGlwZSkpKSB7CisJCWVycigic29oY2lfc3VibWl0X2pvYjogRU5PTUVNIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBmb3IgdGhlIHByaXZhdGUgcGFydCBvZiB0aGUgVVJCIHdlIG5lZWQgdGhlIG51bWJlciBvZiBURHMgKHNpemUpICovCisJc3dpdGNoICh1c2JfcGlwZXR5cGUgKHBpcGUpKSB7CisJCWNhc2UgUElQRV9CVUxLOiAvKiBvbmUgVEQgZm9yIGV2ZXJ5IDQwOTYgQnl0ZSAqLworCQkJc2l6ZSA9ICh0cmFuc2Zlcl9sZW4gLSAxKSAvIDQwOTYgKyAxOworCQkJYnJlYWs7CisJCWNhc2UgUElQRV9DT05UUk9MOiAvKiAxIFREIGZvciBzZXR1cCwgMSBmb3IgQUNLIGFuZCAxIGZvciBldmVyeSA0MDk2IEIgKi8KKwkJCXNpemUgPSAodHJhbnNmZXJfbGVuID09IDApPyAyOgorCQkJCQkJKHRyYW5zZmVyX2xlbiAtIDEpIC8gNDA5NiArIDM7CisJCQlicmVhazsKKwl9CisKKwlpZiAoc2l6ZSA+PSAoTl9VUkJfVEQgLSAxKSkgeworCQllcnIoIm5lZWQgJWQgVERzLCBvbmx5IGhhdmUgJWQiLCBzaXplLCBOX1VSQl9URCk7CisJCXJldHVybiAtMTsKKwl9CisJcHVyYl9wcml2ID0gJnVyYl9wcml2OworCXB1cmJfcHJpdi0+cGlwZSA9IHBpcGU7CisKKwkvKiBmaWxsIHRoZSBwcml2YXRlIHBhcnQgb2YgdGhlIFVSQiAqLworCXB1cmJfcHJpdi0+bGVuZ3RoID0gc2l6ZTsKKwlwdXJiX3ByaXYtPmVkID0gZWQ7CisJcHVyYl9wcml2LT5hY3R1YWxfbGVuZ3RoID0gMDsKKworCS8qIGFsbG9jYXRlIHRoZSBURHMgKi8KKwkvKiBub3RlIHRoYXQgdGRbMF0gd2FzIGFsbG9jYXRlZCBpbiBlcF9hZGRfZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXB1cmJfcHJpdi0+dGRbaV0gPSB0ZF9hbGxvYyAoZGV2KTsKKwkJaWYgKCFwdXJiX3ByaXYtPnRkW2ldKSB7CisJCQlwdXJiX3ByaXYtPmxlbmd0aCA9IGk7CisJCQl1cmJfZnJlZV9wcml2IChwdXJiX3ByaXYpOworCQkJZXJyKCJzb2hjaV9zdWJtaXRfam9iOiBFTk9NRU0iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChlZC0+c3RhdGUgPT0gRURfTkVXIHx8IChlZC0+c3RhdGUgJiBFRF9ERUwpKSB7CisJCXVyYl9mcmVlX3ByaXYgKHB1cmJfcHJpdik7CisJCWVycigic29oY2lfc3VibWl0X2pvYjogRUlOVkFMIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBsaW5rIHRoZSBlZCBpbnRvIGEgY2hhaW4gaWYgaXMgbm90IGFscmVhZHkgKi8KKwlpZiAoZWQtPnN0YXRlICE9IEVEX09QRVIpCisJCWVwX2xpbmsgKG9oY2ksIGVkKTsKKworCS8qIGZpbGwgdGhlIFREcyBhbmQgbGluayBpdCB0byB0aGUgZWQgKi8KKwl0ZF9zdWJtaXRfam9iKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCBwdXJiX3ByaXYsIGludGVydmFsKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgREVCVUcKKy8qIHRlbGwgdXMgdGhlIGN1cnJlbnQgVVNCIGZyYW1lIG51bWJlciAqLworCitzdGF0aWMgaW50IHNvaGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlciAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCit7CisJb2hjaV90ICpvaGNpID0gJmdvaGNpOworCisJcmV0dXJuIG9oY2lfY3B1X3RvX2xlMTYgKG9oY2ktPmhjY2EtPmZyYW1lX25vKTsKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBFRCBoYW5kbGluZyBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGxpbmsgYW4gZWQgaW50byBvbmUgb2YgdGhlIEhDIGNoYWlucyAqLworCitzdGF0aWMgaW50IGVwX2xpbmsgKG9oY2lfdCAqb2hjaSwgZWRfdCAqZWRpKQoreworCXZvbGF0aWxlIGVkX3QgKmVkID0gZWRpOworCisJZWQtPnN0YXRlID0gRURfT1BFUjsKKworCXN3aXRjaCAoZWQtPnR5cGUpIHsKKwljYXNlIFBJUEVfQ09OVFJPTDoKKwkJZWQtPmh3TmV4dEVEID0gMDsKKwkJaWYgKG9oY2ktPmVkX2NvbnRyb2x0YWlsID09IE5VTEwpIHsKKwkJCXdyaXRlbCAoZWQsICZvaGNpLT5yZWdzLT5lZF9jb250cm9saGVhZCk7CisJCX0gZWxzZSB7CisJCQlvaGNpLT5lZF9jb250cm9sdGFpbC0+aHdOZXh0RUQgPSBvaGNpX2NwdV90b19sZTMyICgodW5zaWduZWQgbG9uZyllZCk7CisJCX0KKwkJZWQtPmVkX3ByZXYgPSBvaGNpLT5lZF9jb250cm9sdGFpbDsKKwkJaWYgKCFvaGNpLT5lZF9jb250cm9sdGFpbCAmJiAhb2hjaS0+ZWRfcm1fbGlzdFswXSAmJgorCQkJIW9oY2ktPmVkX3JtX2xpc3RbMV0gJiYgIW9oY2ktPnNsZWVwaW5nKSB7CisJCQlvaGNpLT5oY19jb250cm9sIHw9IE9IQ0lfQ1RSTF9DTEU7CisJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwkJfQorCQlvaGNpLT5lZF9jb250cm9sdGFpbCA9IGVkaTsKKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfQlVMSzoKKwkJZWQtPmh3TmV4dEVEID0gMDsKKwkJaWYgKG9oY2ktPmVkX2J1bGt0YWlsID09IE5VTEwpIHsKKwkJCXdyaXRlbCAoZWQsICZvaGNpLT5yZWdzLT5lZF9idWxraGVhZCk7CisJCX0gZWxzZSB7CisJCQlvaGNpLT5lZF9idWxrdGFpbC0+aHdOZXh0RUQgPSBvaGNpX2NwdV90b19sZTMyICgodW5zaWduZWQgbG9uZyllZCk7CisJCX0KKwkJZWQtPmVkX3ByZXYgPSBvaGNpLT5lZF9idWxrdGFpbDsKKwkJaWYgKCFvaGNpLT5lZF9idWxrdGFpbCAmJiAhb2hjaS0+ZWRfcm1fbGlzdFswXSAmJgorCQkJIW9oY2ktPmVkX3JtX2xpc3RbMV0gJiYgIW9oY2ktPnNsZWVwaW5nKSB7CisJCQlvaGNpLT5oY19jb250cm9sIHw9IE9IQ0lfQ1RSTF9CTEU7CisJCQl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKwkJfQorCQlvaGNpLT5lZF9idWxrdGFpbCA9IGVkaTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiB1bmxpbmsgYW4gZWQgZnJvbSBvbmUgb2YgdGhlIEhDIGNoYWlucy4KKyAqIGp1c3QgdGhlIGxpbmsgdG8gdGhlIGVkIGlzIHVubGlua2VkLgorICogdGhlIGxpbmsgZnJvbSB0aGUgZWQgc3RpbGwgcG9pbnRzIHRvIGFub3RoZXIgb3BlcmF0aW9uYWwgZWQgb3IgMAorICogc28gdGhlIEhDIGNhbiBldmVudHVhbGx5IGZpbmlzaCB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgdW5saW5rZWQgZWQgKi8KKworc3RhdGljIGludCBlcF91bmxpbmsgKG9oY2lfdCAqb2hjaSwgZWRfdCAqZWRpKQoreworCXZvbGF0aWxlIGVkX3QgKmVkID0gZWRpOworCisJZWQtPmh3SU5GTyB8PSBvaGNpX2NwdV90b19sZTMyIChPSENJX0VEX1NLSVApOworCisJc3dpdGNoIChlZC0+dHlwZSkgeworCWNhc2UgUElQRV9DT05UUk9MOgorCQlpZiAoZWQtPmVkX3ByZXYgPT0gTlVMTCkgeworCQkJaWYgKCFlZC0+aHdOZXh0RUQpIHsKKwkJCQlvaGNpLT5oY19jb250cm9sICY9IH5PSENJX0NUUkxfQ0xFOworCQkJCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCQkJfQorCQkJd3JpdGVsIChvaGNpX2NwdV90b19sZTMyICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSwgJm9oY2ktPnJlZ3MtPmVkX2NvbnRyb2xoZWFkKTsKKwkJfSBlbHNlIHsKKwkJCWVkLT5lZF9wcmV2LT5od05leHRFRCA9IGVkLT5od05leHRFRDsKKwkJfQorCQlpZiAob2hjaS0+ZWRfY29udHJvbHRhaWwgPT0gZWQpIHsKKwkJCW9oY2ktPmVkX2NvbnRyb2x0YWlsID0gZWQtPmVkX3ByZXY7CisJCX0gZWxzZSB7CisJCQkoKGVkX3QgKilvaGNpX2NwdV90b19sZTMyICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSktPmVkX3ByZXYgPSBlZC0+ZWRfcHJldjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUElQRV9CVUxLOgorCQlpZiAoZWQtPmVkX3ByZXYgPT0gTlVMTCkgeworCQkJaWYgKCFlZC0+aHdOZXh0RUQpIHsKKwkJCQlvaGNpLT5oY19jb250cm9sICY9IH5PSENJX0NUUkxfQkxFOworCQkJCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCQkJfQorCQkJd3JpdGVsIChvaGNpX2NwdV90b19sZTMyICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKKwkJfSBlbHNlIHsKKwkJCWVkLT5lZF9wcmV2LT5od05leHRFRCA9IGVkLT5od05leHRFRDsKKwkJfQorCQlpZiAob2hjaS0+ZWRfYnVsa3RhaWwgPT0gZWQpIHsKKwkJCW9oY2ktPmVkX2J1bGt0YWlsID0gZWQtPmVkX3ByZXY7CisJCX0gZWxzZSB7CisJCQkoKGVkX3QgKilvaGNpX2NwdV90b19sZTMyICgqKChfX3UzMiAqKSZlZC0+aHdOZXh0RUQpKSktPmVkX3ByZXYgPSBlZC0+ZWRfcHJldjsKKwkJfQorCQlicmVhazsKKwl9CisJZWQtPnN0YXRlID0gRURfVU5MSU5LOworCXJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGFkZC9yZWluaXQgYW4gZW5kcG9pbnQ7IHRoaXMgc2hvdWxkIGJlIGRvbmUgb25jZSBhdCB0aGUgdXNiX3NldF9jb25maWd1cmF0aW9uIGNvbW1hbmQsCisgKiBidXQgdGhlIFVTQiBzdGFjayBpcyBhIGxpdHRsZSBiaXQgc3RhdGVsZXNzCXNvIHdlIGRvIGl0IGF0IGV2ZXJ5IHRyYW5zYWN0aW9uCisgKiBpZiB0aGUgc3RhdGUgb2YgdGhlIGVkIGlzIEVEX05FVyB0aGVuIGEgZHVtbXkgdGQgaXMgYWRkZWQgYW5kIHRoZSBzdGF0ZSBpcyBjaGFuZ2VkIHRvIEVEX1VOTElOSworICogaW4gYWxsIG90aGVyIGNhc2VzIHRoZSBzdGF0ZSBpcyBsZWZ0IHVuY2hhbmdlZAorICogdGhlIGVkIGluZm8gZmllbGRzIGFyZSBzZXR0ZWQgYW55d2F5IGV2ZW4gdGhvdWdoIG1vc3Qgb2YgdGhlbSBzaG91bGQgbm90IGNoYW5nZSAqLworCitzdGF0aWMgZWRfdCAqIGVwX2FkZF9lZCAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSkKK3sKKwl0ZF90ICp0ZDsKKwllZF90ICplZF9yZXQ7CisJdm9sYXRpbGUgZWRfdCAqZWQ7CisKKwllZCA9IGVkX3JldCA9ICZvaGNpX2Rldi5lZFsodXNiX3BpcGVlbmRwb2ludCAocGlwZSkgPDwgMSkgfAorCQkJKHVzYl9waXBlY29udHJvbCAocGlwZSk/IDA6IHVzYl9waXBlb3V0IChwaXBlKSldOworCisJaWYgKChlZC0+c3RhdGUgJiBFRF9ERUwpIHx8IChlZC0+c3RhdGUgJiBFRF9VUkJfREVMKSkgeworCQllcnIoImVwX2FkZF9lZDogcGVuZGluZyBkZWxldGUiKTsKKwkJLyogcGVuZGluZyBkZWxldGUgcmVxdWVzdCAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoZWQtPnN0YXRlID09IEVEX05FVykgeworCQllZC0+aHdJTkZPID0gb2hjaV9jcHVfdG9fbGUzMiAoT0hDSV9FRF9TS0lQKTsgLyogc2tpcCBlZCAqLworCQkvKiBkdW1teSB0ZDsgZW5kIG9mIHRkIGxpc3QgZm9yIGVkICovCisJCXRkID0gdGRfYWxsb2MgKHVzYl9kZXYpOworCQllZC0+aHdUYWlsUCA9IG9oY2lfY3B1X3RvX2xlMzIgKCh1bnNpZ25lZCBsb25nKXRkKTsKKwkJZWQtPmh3SGVhZFAgPSBlZC0+aHdUYWlsUDsKKwkJZWQtPnN0YXRlID0gRURfVU5MSU5LOworCQllZC0+dHlwZSA9IHVzYl9waXBldHlwZSAocGlwZSk7CisJCW9oY2lfZGV2LmVkX2NudCsrOworCX0KKworCWVkLT5od0lORk8gPSBvaGNpX2NwdV90b19sZTMyICh1c2JfcGlwZWRldmljZSAocGlwZSkKKwkJCXwgdXNiX3BpcGVlbmRwb2ludCAocGlwZSkgPDwgNworCQkJfCAodXNiX3BpcGVpc29jIChwaXBlKT8gMHg4MDAwOiAwKQorCQkJfCAodXNiX3BpcGVjb250cm9sIChwaXBlKT8gMDogKHVzYl9waXBlb3V0IChwaXBlKT8gMHg4MDA6IDB4MTAwMCkpCisJCQl8IHVzYl9waXBlc2xvdyAocGlwZSkgPDwgMTMKKwkJCXwgdXNiX21heHBhY2tldCAodXNiX2RldiwgcGlwZSkgPDwgMTYpOworCisJcmV0dXJuIGVkX3JldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogVEQgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnF1ZXVlIG5leHQgVEQgZm9yIHRoaXMgVVJCIChPSENJIHNwZWMgNS4yLjguMikgKi8KKworc3RhdGljIHZvaWQgdGRfZmlsbCAob2hjaV90ICpvaGNpLCB1bnNpZ25lZCBpbnQgaW5mbywKKwl2b2lkICpkYXRhLCBpbnQgbGVuLAorCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpbmRleCwgdXJiX3ByaXZfdCAqdXJiX3ByaXYpCit7CisJdm9sYXRpbGUgdGRfdCAgKnRkLCAqdGRfcHQ7CisjaWZkZWYgT0hDSV9GSUxMX1RSQUNFCisJaW50IGk7CisjZW5kaWYKKworCWlmIChpbmRleCA+IHVyYl9wcml2LT5sZW5ndGgpIHsKKwkJZXJyKCJpbmRleCA+IGxlbmd0aCIpOworCQlyZXR1cm47CisJfQorCS8qIHVzZSB0aGlzIHRkIGFzIHRoZSBuZXh0IGR1bW15ICovCisJdGRfcHQgPSB1cmJfcHJpdi0+dGQgW2luZGV4XTsKKwl0ZF9wdC0+aHdOZXh0VEQgPSAwOworCisJLyogZmlsbCB0aGUgb2xkIGR1bW15IFREICovCisJdGQgPSB1cmJfcHJpdi0+dGQgW2luZGV4XSA9ICh0ZF90ICopKG9oY2lfY3B1X3RvX2xlMzIgKHVyYl9wcml2LT5lZC0+aHdUYWlsUCkgJiB+MHhmKTsKKworCXRkLT5lZCA9IHVyYl9wcml2LT5lZDsKKwl0ZC0+bmV4dF9kbF90ZCA9IE5VTEw7CisJdGQtPmluZGV4ID0gaW5kZXg7CisJdGQtPmRhdGEgPSAoX191MzIpZGF0YTsKKyNpZmRlZiBPSENJX0ZJTExfVFJBQ0UKKwlpZiAodXNiX3BpcGVidWxrKHVyYl9wcml2LT5waXBlKSAmJiB1c2JfcGlwZW91dCh1cmJfcHJpdi0+cGlwZSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlwcmludGYoInRkLT5kYXRhWyVkXSAlIzJ4ICIsaSwgKCh1bnNpZ25lZCBjaGFyICopdGQtPmRhdGEpW2ldKTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKyNlbmRpZgorCWlmICghbGVuKQorCQlkYXRhID0gMDsKKworCXRkLT5od0lORk8gPSBvaGNpX2NwdV90b19sZTMyIChpbmZvKTsKKwl0ZC0+aHdDQlAgPSBvaGNpX2NwdV90b19sZTMyICgodW5zaWduZWQgbG9uZylkYXRhKTsKKwlpZiAoZGF0YSkKKwkJdGQtPmh3QkUgPSBvaGNpX2NwdV90b19sZTMyICgodW5zaWduZWQgbG9uZykoZGF0YSArIGxlbiAtIDEpKTsKKwllbHNlCisJCXRkLT5od0JFID0gMDsKKwl0ZC0+aHdOZXh0VEQgPSBvaGNpX2NwdV90b19sZTMyICgodW5zaWduZWQgbG9uZyl0ZF9wdCk7CisKKwkvKiBhcHBlbmQgdG8gcXVldWUgKi8KKwl0ZC0+ZWQtPmh3VGFpbFAgPSB0ZC0+aHdOZXh0VEQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHByZXBhcmUgYWxsIFREcyBvZiBhIHRyYW5zZmVyICovCitzdGF0aWMgdm9pZCB0ZF9zdWJtaXRfam9iIChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXAsIHVyYl9wcml2X3QgKnVyYiwgaW50IGludGVydmFsKQoreworCW9oY2lfdCAqb2hjaSA9ICZnb2hjaTsKKwlpbnQgZGF0YV9sZW4gPSB0cmFuc2Zlcl9sZW47CisJdm9pZCAqZGF0YTsKKwlpbnQgY250ID0gMDsKKwlfX3UzMiBpbmZvID0gMDsKKwl1bnNpZ25lZCBpbnQgdG9nZ2xlID0gMDsKKworCS8qIE9IQ0kgaGFuZGxlcyB0aGUgREFUQS10b2dnbGVzIGl0c2VsZiwgd2UganVzdCB1c2UgdGhlIFVTQi10b2dnbGUgYml0cyBmb3IgcmVzZXRpbmcgKi8KKwlpZih1c2JfZ2V0dG9nZ2xlKGRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwgdXNiX3BpcGVvdXQocGlwZSkpKSB7CisJCXRvZ2dsZSA9IFREX1RfVE9HR0xFOworCX0gZWxzZSB7CisJCXRvZ2dsZSA9IFREX1RfREFUQTA7CisJCXVzYl9zZXR0b2dnbGUoZGV2LCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLCB1c2JfcGlwZW91dChwaXBlKSwgMSk7CisJfQorCXVyYi0+dGRfY250ID0gMDsKKwlpZiAoZGF0YV9sZW4pCisJCWRhdGEgPSBidWZmZXI7CisJZWxzZQorCQlkYXRhID0gMDsKKworCXN3aXRjaCAodXNiX3BpcGV0eXBlIChwaXBlKSkgeworCWNhc2UgUElQRV9CVUxLOgorCQlpbmZvID0gdXNiX3BpcGVvdXQgKHBpcGUpPworCQkJVERfQ0MgfCBURF9EUF9PVVQgOiBURF9DQyB8IFREX0RQX0lOIDsKKwkJd2hpbGUoZGF0YV9sZW4gPiA0MDk2KSB7CisJCQl0ZF9maWxsIChvaGNpLCBpbmZvIHwgKGNudD8gVERfVF9UT0dHTEU6dG9nZ2xlKSwgZGF0YSwgNDA5NiwgZGV2LCBjbnQsIHVyYik7CisJCQlkYXRhICs9IDQwOTY7IGRhdGFfbGVuIC09IDQwOTY7IGNudCsrOworCQl9CisJCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/CisJCQlURF9DQyB8IFREX0RQX09VVCA6IFREX0NDIHwgVERfUiB8IFREX0RQX0lOIDsKKwkJdGRfZmlsbCAob2hjaSwgaW5mbyB8IChjbnQ/IFREX1RfVE9HR0xFOnRvZ2dsZSksIGRhdGEsIGRhdGFfbGVuLCBkZXYsIGNudCwgdXJiKTsKKwkJY250Kys7CisKKwkJaWYgKCFvaGNpLT5zbGVlcGluZykKKwkJCXdyaXRlbCAoT0hDSV9CTEYsICZvaGNpLT5yZWdzLT5jbWRzdGF0dXMpOyAvKiBzdGFydCBidWxrIGxpc3QgKi8KKwkJYnJlYWs7CisKKwljYXNlIFBJUEVfQ09OVFJPTDoKKwkJaW5mbyA9IFREX0NDIHwgVERfRFBfU0VUVVAgfCBURF9UX0RBVEEwOworCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBzZXR1cCwgOCwgZGV2LCBjbnQrKywgdXJiKTsKKwkJaWYgKGRhdGFfbGVuID4gMCkgeworCQkJaW5mbyA9IHVzYl9waXBlb3V0IChwaXBlKT8KKwkJCQlURF9DQyB8IFREX1IgfCBURF9EUF9PVVQgfCBURF9UX0RBVEExIDogVERfQ0MgfCBURF9SIHwgVERfRFBfSU4gfCBURF9UX0RBVEExOworCQkJLyogTk9URTogIG1pc2hhbmRsZXMgdHJhbnNmZXJzID44Sywgc29tZSA+NEsgKi8KKwkJCXRkX2ZpbGwgKG9oY2ksIGluZm8sIGRhdGEsIGRhdGFfbGVuLCBkZXYsIGNudCsrLCB1cmIpOworCQl9CisJCWluZm8gPSB1c2JfcGlwZW91dCAocGlwZSk/CisJCQlURF9DQyB8IFREX0RQX0lOIHwgVERfVF9EQVRBMTogVERfQ0MgfCBURF9EUF9PVVQgfCBURF9UX0RBVEExOworCQl0ZF9maWxsIChvaGNpLCBpbmZvLCBkYXRhLCAwLCBkZXYsIGNudCsrLCB1cmIpOworCQlpZiAoIW9oY2ktPnNsZWVwaW5nKQorCQkJd3JpdGVsIChPSENJX0NMRiwgJm9oY2ktPnJlZ3MtPmNtZHN0YXR1cyk7IC8qIHN0YXJ0IENvbnRyb2wgbGlzdCAqLworCQlicmVhazsKKwl9CisJaWYgKHVyYi0+bGVuZ3RoICE9IGNudCkKKwkJZGJnKCJURCBMRU5HVEggJWQgIT0gQ05UICVkIiwgdXJiLT5sZW5ndGgsIGNudCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIERvbmUgTGlzdCBoYW5kbGluZyBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyogY2FsY3VsYXRlIHRoZSB0cmFuc2ZlciBsZW5ndGggYW5kIHVwZGF0ZSB0aGUgdXJiICovCisKK3N0YXRpYyB2b2lkIGRsX3RyYW5zZmVyX2xlbmd0aCh0ZF90ICogdGQpCit7CisJX191MzIgdGRJTkZPLCB0ZEJFLCB0ZENCUDsKKwl1cmJfcHJpdl90ICpsdXJiX3ByaXYgPSAmdXJiX3ByaXY7CisKKwl0ZElORk8gPSBvaGNpX2NwdV90b19sZTMyICh0ZC0+aHdJTkZPKTsKKwl0ZEJFICAgPSBvaGNpX2NwdV90b19sZTMyICh0ZC0+aHdCRSk7CisJdGRDQlAgID0gb2hjaV9jcHVfdG9fbGUzMiAodGQtPmh3Q0JQKTsKKworCisJaWYgKCEodXNiX3BpcGVjb250cm9sKGx1cmJfcHJpdi0+cGlwZSkgJiYKKwkgICAgKCh0ZC0+aW5kZXggPT0gMCkgfHwgKHRkLT5pbmRleCA9PSBsdXJiX3ByaXYtPmxlbmd0aCAtIDEpKSkpIHsKKwkJaWYgKHRkQkUgIT0gMCkgeworCQkJaWYgKHRkLT5od0NCUCA9PSAwKQorCQkJCWx1cmJfcHJpdi0+YWN0dWFsX2xlbmd0aCArPSB0ZEJFIC0gdGQtPmRhdGEgKyAxOworCQkJZWxzZQorCQkJCWx1cmJfcHJpdi0+YWN0dWFsX2xlbmd0aCArPSB0ZENCUCAtIHRkLT5kYXRhOworCQl9CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiByZXBsaWVzIHRvIHRoZSByZXF1ZXN0IGhhdmUgdG8gYmUgb24gYSBGSUZPIGJhc2lzIHNvCisgKiB3ZSByZXZlcnNlIHRoZSByZXZlcnNlZCBkb25lLWxpc3QgKi8KKworc3RhdGljIHRkX3QgKiBkbF9yZXZlcnNlX2RvbmVfbGlzdCAob2hjaV90ICpvaGNpKQoreworCV9fdTMyIHRkX2xpc3RfaGM7CisJdGRfdCAqdGRfcmV2ID0gTlVMTDsKKwl0ZF90ICp0ZF9saXN0ID0gTlVMTDsKKwl1cmJfcHJpdl90ICpsdXJiX3ByaXYgPSBOVUxMOworCisJdGRfbGlzdF9oYyA9IG9oY2lfY3B1X3RvX2xlMzIgKG9oY2ktPmhjY2EtPmRvbmVfaGVhZCkgJiAweGZmZmZmZmYwOworCW9oY2ktPmhjY2EtPmRvbmVfaGVhZCA9IDA7CisKKwl3aGlsZSAodGRfbGlzdF9oYykgeworCQl0ZF9saXN0ID0gKHRkX3QgKil0ZF9saXN0X2hjOworCisJCWlmIChURF9DQ19HRVQgKG9oY2lfY3B1X3RvX2xlMzIgKHRkX2xpc3QtPmh3SU5GTykpKSB7CisJCQlsdXJiX3ByaXYgPSAmdXJiX3ByaXY7CisJCQlkYmcoIiBVU0ItZXJyb3Ivc3RhdHVzOiAleCA6ICVwIiwKKwkJCQkJVERfQ0NfR0VUIChvaGNpX2NwdV90b19sZTMyICh0ZF9saXN0LT5od0lORk8pKSwgdGRfbGlzdCk7CisJCQlpZiAodGRfbGlzdC0+ZWQtPmh3SGVhZFAgJiBvaGNpX2NwdV90b19sZTMyICgweDEpKSB7CisJCQkJaWYgKGx1cmJfcHJpdiAmJiAoKHRkX2xpc3QtPmluZGV4ICsgMSkgPCBsdXJiX3ByaXYtPmxlbmd0aCkpIHsKKwkJCQkJdGRfbGlzdC0+ZWQtPmh3SGVhZFAgPQorCQkJCQkJKGx1cmJfcHJpdi0+dGRbbHVyYl9wcml2LT5sZW5ndGggLSAxXS0+aHdOZXh0VEQgJiBvaGNpX2NwdV90b19sZTMyICgweGZmZmZmZmYwKSkgfAorCQkJCQkJCQkJKHRkX2xpc3QtPmVkLT5od0hlYWRQICYgb2hjaV9jcHVfdG9fbGUzMiAoMHgyKSk7CisJCQkJCWx1cmJfcHJpdi0+dGRfY250ICs9IGx1cmJfcHJpdi0+bGVuZ3RoIC0gdGRfbGlzdC0+aW5kZXggLSAxOworCQkJCX0gZWxzZQorCQkJCQl0ZF9saXN0LT5lZC0+aHdIZWFkUCAmPSBvaGNpX2NwdV90b19sZTMyICgweGZmZmZmZmYyKTsKKwkJCX0KKyNpZmRlZiBDT05GSUdfTVBDNTIwMAorCQkJdGRfbGlzdC0+aHdOZXh0VEQgPSAwOworI2VuZGlmCisJCX0KKworCQl0ZF9saXN0LT5uZXh0X2RsX3RkID0gdGRfcmV2OworCQl0ZF9yZXYgPSB0ZF9saXN0OworCQl0ZF9saXN0X2hjID0gb2hjaV9jcHVfdG9fbGUzMiAodGRfbGlzdC0+aHdOZXh0VEQpICYgMHhmZmZmZmZmMDsKKwl9CisJcmV0dXJuIHRkX2xpc3Q7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHRkIGRvbmUgbGlzdCAqLworc3RhdGljIGludCBkbF9kb25lX2xpc3QgKG9oY2lfdCAqb2hjaSwgdGRfdCAqdGRfbGlzdCkKK3sKKwl0ZF90ICp0ZF9saXN0X25leHQgPSBOVUxMOworCWVkX3QgKmVkOworCWludCBjYyA9IDA7CisJaW50IHN0YXQgPSAwOworCS8qIHVyYl90ICp1cmI7ICovCisJdXJiX3ByaXZfdCAqbHVyYl9wcml2OworCV9fdTMyIHRkSU5GTywgZWRIZWFkUCwgZWRUYWlsUDsKKworCXdoaWxlICh0ZF9saXN0KSB7CisJCXRkX2xpc3RfbmV4dCA9IHRkX2xpc3QtPm5leHRfZGxfdGQ7CisKKwkJbHVyYl9wcml2ID0gJnVyYl9wcml2OworCQl0ZElORk8gPSBvaGNpX2NwdV90b19sZTMyICh0ZF9saXN0LT5od0lORk8pOworCisJCWVkID0gdGRfbGlzdC0+ZWQ7CisKKwkJZGxfdHJhbnNmZXJfbGVuZ3RoKHRkX2xpc3QpOworCisJCS8qIGVycm9yIGNvZGUgb2YgdHJhbnNmZXIgKi8KKwkJY2MgPSBURF9DQ19HRVQgKHRkSU5GTyk7CisJCWlmICgrKyhsdXJiX3ByaXYtPnRkX2NudCkgPT0gbHVyYl9wcml2LT5sZW5ndGgpIHsKKwkJCWlmICgoZWQtPnN0YXRlICYgKEVEX09QRVIgfCBFRF9VTkxJTkspKQorCQkJCQkmJiAobHVyYl9wcml2LT5zdGF0ZSAhPSBVUkJfREVMKSkgeworCQkJCWRiZygiQ29uZGl0aW9uQ29kZSAlI3giLCBjYyk7CisJCQkJc3RhdCA9IGNjX3RvX2Vycm9yW2NjXTsKKwkJCQl1cmJfZmluaXNoZWQgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKGVkLT5zdGF0ZSAhPSBFRF9ORVcpIHsKKwkJCWVkSGVhZFAgPSBvaGNpX2NwdV90b19sZTMyIChlZC0+aHdIZWFkUCkgJiAweGZmZmZmZmYwOworCQkJZWRUYWlsUCA9IG9oY2lfY3B1X3RvX2xlMzIgKGVkLT5od1RhaWxQKTsKKworCQkJLyogdW5saW5rIGVkcyBpZiB0aGV5IGFyZSBub3QgYnVzeSAqLworCQkJaWYgKChlZEhlYWRQID09IGVkVGFpbFApICYmIChlZC0+c3RhdGUgPT0gRURfT1BFUikpCisJCQkJZXBfdW5saW5rIChvaGNpLCBlZCk7CisJCX0KKworCQl0ZF9saXN0ID0gdGRfbGlzdF9uZXh0OworCX0KKwlyZXR1cm4gc3RhdDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogVmlydHVhbCBSb290IEh1YgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRGV2aWNlIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBfX3U4IHJvb3RfaHViX2Rldl9kZXNbXSA9Cit7CisJMHgxMiwJICAgIC8qCV9fdTggIGJMZW5ndGg7ICovCisJMHgwMSwJICAgIC8qCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsgRGV2aWNlICovCisJMHgxMCwJICAgIC8qCV9fdTE2IGJjZFVTQjsgdjEuMSAqLworCTB4MDEsCisJMHgwOSwJICAgIC8qCV9fdTggIGJEZXZpY2VDbGFzczsgSFVCX0NMQVNTQ09ERSAqLworCTB4MDAsCSAgICAvKglfX3U4ICBiRGV2aWNlU3ViQ2xhc3M7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGJEZXZpY2VQcm90b2NvbDsgKi8KKwkweDA4LAkgICAgLyoJX191OCAgYk1heFBhY2tldFNpemUwOyA4IEJ5dGVzICovCisJMHgwMCwJICAgIC8qCV9fdTE2IGlkVmVuZG9yOyAqLworCTB4MDAsCisJMHgwMCwJICAgIC8qCV9fdTE2IGlkUHJvZHVjdDsgKi8KKwkweDAwLAorCTB4MDAsCSAgICAvKglfX3UxNiBiY2REZXZpY2U7ICovCisJMHgwMCwKKwkweDAwLAkgICAgLyoJX191OCAgaU1hbnVmYWN0dXJlcjsgKi8KKwkweDAxLAkgICAgLyoJX191OCAgaVByb2R1Y3Q7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlTZXJpYWxOdW1iZXI7ICovCisJMHgwMQkgICAgLyoJX191OCAgYk51bUNvbmZpZ3VyYXRpb25zOyAqLworfTsKKworCisvKiBDb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBfX3U4IHJvb3RfaHViX2NvbmZpZ19kZXNbXSA9Cit7CisJMHgwOSwJICAgIC8qCV9fdTggIGJMZW5ndGg7ICovCisJMHgwMiwJICAgIC8qCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsgQ29uZmlndXJhdGlvbiAqLworCTB4MTksCSAgICAvKglfX3UxNiB3VG90YWxMZW5ndGg7ICovCisJMHgwMCwKKwkweDAxLAkgICAgLyoJX191OCAgYk51bUludGVyZmFjZXM7ICovCisJMHgwMSwJICAgIC8qCV9fdTggIGJDb25maWd1cmF0aW9uVmFsdWU7ICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlDb25maWd1cmF0aW9uOyAqLworCTB4NDAsCSAgICAvKglfX3U4ICBibUF0dHJpYnV0ZXM7CisJCSBCaXQgNzogQnVzLXBvd2VyZWQsIDY6IFNlbGYtcG93ZXJlZCwgNSBSZW1vdGUtd2Frd3VwLCA0Li4wOiByZXN2ZCAqLworCTB4MDAsCSAgICAvKglfX3U4ICBNYXhQb3dlcjsgKi8KKworCS8qIGludGVyZmFjZSAqLworCTB4MDksCSAgICAvKglfX3U4ICBpZl9iTGVuZ3RoOyAqLworCTB4MDQsCSAgICAvKglfX3U4ICBpZl9iRGVzY3JpcHRvclR5cGU7IEludGVyZmFjZSAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iSW50ZXJmYWNlTnVtYmVyOyAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9iQWx0ZXJuYXRlU2V0dGluZzsgKi8KKwkweDAxLAkgICAgLyoJX191OCAgaWZfYk51bUVuZHBvaW50czsgKi8KKwkweDA5LAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJICAgIC8qCV9fdTggIGlmX2JJbnRlcmZhY2VTdWJDbGFzczsgKi8KKwkweDAwLAkgICAgLyoJX191OCAgaWZfYkludGVyZmFjZVByb3RvY29sOyAqLworCTB4MDAsCSAgICAvKglfX3U4ICBpZl9pSW50ZXJmYWNlOyAqLworCisJLyogZW5kcG9pbnQgKi8KKwkweDA3LAkgICAgLyoJX191OCAgZXBfYkxlbmd0aDsgKi8KKwkweDA1LAkgICAgLyoJX191OCAgZXBfYkRlc2NyaXB0b3JUeXBlOyBFbmRwb2ludCAqLworCTB4ODEsCSAgICAvKglfX3U4ICBlcF9iRW5kcG9pbnRBZGRyZXNzOyBJTiBFbmRwb2ludCAxICovCisJMHgwMywJICAgIC8qCV9fdTggIGVwX2JtQXR0cmlidXRlczsgSW50ZXJydXB0ICovCisJMHgwMiwJICAgIC8qCV9fdTE2IGVwX3dNYXhQYWNrZXRTaXplOyAoKE1BWF9ST09UX1BPUlRTICsgMSkgLyA4ICovCisJMHgwMCwKKwkweGZmCSAgICAvKglfX3U4ICBlcF9iSW50ZXJ2YWw7IDI1NSBtcyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MFtdID0KK3sKKwkweDA0LAkJCS8qICBfX3U4ICBiTGVuZ3RoOyAqLworCTB4MDMsCQkJLyogIF9fdTggIGJEZXNjcmlwdG9yVHlwZTsgU3RyaW5nLWRlc2NyaXB0b3IgKi8KKwkweDA5LAkJCS8qICBfX3U4ICBsYW5nIElEICovCisJMHgwNCwJCQkvKiAgX191OCAgbGFuZyBJRCAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MVtdID0KK3sKKwkyOCwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAzLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IFN0cmluZy1kZXNjcmlwdG9yICovCisJJ08nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdDJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0knLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknICcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdSJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ28nLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknbycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd0JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJyAnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSd1JywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ2InLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KK307CisKKy8qIEh1YiBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9yIGlzIGNvbnN0cnVjdGVkIGR5bmFtaWNhbGx5ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBPSyh4KQkJCWxlbiA9ICh4KTsgYnJlYWsKKyNpZmRlZiBERUJVRworI2RlZmluZSBXUl9SSF9TVEFUKHgpCQl7aW5mbygiV1I6c3RhdHVzICUjOHgiLCAoeCkpO3dyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnN0YXR1cyk7fQorI2RlZmluZSBXUl9SSF9QT1JUU1RBVCh4KQl7aW5mbygiV1I6cG9ydHN0YXR1c1slZF0gJSM4eCIsIHdJbmRleC0xLCAoeCkpO3dyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnBvcnRzdGF0dXNbd0luZGV4LTFdKTt9CisjZWxzZQorI2RlZmluZSBXUl9SSF9TVEFUKHgpCQl3cml0ZWwoKHgpLCAmZ29oY2kucmVncy0+cm9vdGh1Yi5zdGF0dXMpCisjZGVmaW5lIFdSX1JIX1BPUlRTVEFUKHgpCXdyaXRlbCgoeCksICZnb2hjaS5yZWdzLT5yb290aHViLnBvcnRzdGF0dXNbd0luZGV4LTFdKQorI2VuZGlmCisjZGVmaW5lIFJEX1JIX1NUQVQJCXJvb3RodWJfc3RhdHVzKCZnb2hjaSkKKyNkZWZpbmUgUkRfUkhfUE9SVFNUQVQJCXJvb3RodWJfcG9ydHN0YXR1cygmZ29oY2ksd0luZGV4LTEpCisKKy8qIHJlcXVlc3QgdG8gdmlydHVhbCByb290IGh1YiAqLworCitpbnQgcmhfY2hlY2tfcG9ydF9zdGF0dXMob2hjaV90ICpjb250cm9sbGVyKQoreworCV9fdTMyIHRlbXAsIG5kcCwgaTsKKwlpbnQgcmVzOworCisJcmVzID0gLTE7CisJdGVtcCA9IHJvb3RodWJfYSAoY29udHJvbGxlcik7CisJbmRwID0gKHRlbXAgJiBSSF9BX05EUCk7CisJZm9yIChpID0gMDsgaSA8IG5kcDsgaSsrKSB7CisJCXRlbXAgPSByb290aHViX3BvcnRzdGF0dXMgKGNvbnRyb2xsZXIsIGkpOworCQkvKiBjaGVjayBmb3IgYSBkZXZpY2UgZGlzY29ubmVjdCAqLworCQlpZiAoKCh0ZW1wICYgKFJIX1BTX1BFU0MgfCBSSF9QU19DU0MpKSA9PQorCQkJKFJIX1BTX1BFU0MgfCBSSF9QU19DU0MpKSAmJgorCQkJKCh0ZW1wICYgUkhfUFNfQ0NTKSA9PSAwKSkgeworCQkJcmVzID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgb2hjaV9zdWJtaXRfcmhfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwKKwkJdm9pZCAqYnVmZmVyLCBpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqY21kKQoreworCXZvaWQgKiBkYXRhID0gYnVmZmVyOworCWludCBsZW5pID0gdHJhbnNmZXJfbGVuOworCWludCBsZW4gPSAwOworCWludCBzdGF0ID0gMDsKKwlfX3UzMiBkYXRhYls0XTsKKwlfX3U4ICpkYXRhX2J1ZiA9IChfX3U4ICopZGF0YWI7CisJX191MTYgYm1SVHlwZV9iUmVxOworCV9fdTE2IHdWYWx1ZTsKKwlfX3UxNiB3SW5kZXg7CisJX191MTYgd0xlbmd0aDsKKworI2lmZGVmIERFQlVHCit1cmJfcHJpdi5hY3R1YWxfbGVuZ3RoID0gMDsKK3BrdF9wcmludChkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBjbWQsICJTVUIocmgpIiwgdXNiX3BpcGVpbihwaXBlKSk7CisjZW5kaWYKKwlpZiAodXNiX3BpcGVpbnQocGlwZSkpIHsKKwkJaW5mbygiUm9vdC1IdWIgc3VibWl0IElSUTogTk9UIGltcGxlbWVudGVkIik7CisJCXJldHVybiAwOworCX0KKworCWJtUlR5cGVfYlJlcSAgPSBjbWQtPnJlcXVlc3R0eXBlIHwgKGNtZC0+cmVxdWVzdCA8PCA4KTsKKwl3VmFsdWUJICAgICAgPSBtMTZfc3dhcCAoY21kLT52YWx1ZSk7CisJd0luZGV4CSAgICAgID0gbTE2X3N3YXAgKGNtZC0+aW5kZXgpOworCXdMZW5ndGgJICAgICAgPSBtMTZfc3dhcCAoY21kLT5sZW5ndGgpOworCisJaW5mbygiUm9vdC1IdWI6IGFkcjogJTJ4IGNtZCglMXgpOiAlMDh4ICUwNHggJTA0eCAlMDR4IiwKKwkJZGV2LT5kZXZudW0sIDgsIGJtUlR5cGVfYlJlcSwgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgpOworCisJc3dpdGNoIChibVJUeXBlX2JSZXEpIHsKKwkvKiBSZXF1ZXN0IERlc3RpbmF0aW9uOgorCSAgIHdpdGhvdXQgZmxhZ3M6IERldmljZSwKKwkgICBSSF9JTlRFUkZBQ0U6IGludGVyZmFjZSwKKwkgICBSSF9FTkRQT0lOVDogZW5kcG9pbnQsCisJICAgUkhfQ0xBU1MgbWVhbnMgSFVCIGhlcmUsCisJICAgUkhfT1RIRVIgfCBSSF9DTEFTUwlhbG1vc3QgZXZlciBtZWFucyBIVUJfUE9SVCBoZXJlCisJKi8KKworCWNhc2UgUkhfR0VUX1NUQVRVUzoKKwkJCSooX191MTYgKikgZGF0YV9idWYgPSBtMTZfc3dhcCAoMSk7IE9LICgyKTsKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9JTlRFUkZBQ0U6CisJCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gbTE2X3N3YXAgKDApOyBPSyAoMik7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfRU5EUE9JTlQ6CisJCQkqKF9fdTE2ICopIGRhdGFfYnVmID0gbTE2X3N3YXAgKDApOyBPSyAoMik7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfQ0xBU1M6CisJCQkqKF9fdTMyICopIGRhdGFfYnVmID0gbTMyX3N3YXAgKAorCQkJCVJEX1JIX1NUQVQgJiB+KFJIX0hTX0NSV0UgfCBSSF9IU19EUldFKSk7CisJCQlPSyAoNCk7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJCSooX191MzIgKikgZGF0YV9idWYgPSBtMzJfc3dhcCAoUkRfUkhfUE9SVFNUQVQpOyBPSyAoNCk7CisKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9FTkRQT0lOVDoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX0VORFBPSU5UX1NUQUxMKTogT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfQ0xBU1M6CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCQljYXNlIFJIX0NfSFVCX0xPQ0FMX1BPV0VSOgorCQkJCU9LKDApOworCQkJY2FzZSAoUkhfQ19IVUJfT1ZFUl9DVVJSRU5UKToKKwkJCQkJV1JfUkhfU1RBVChSSF9IU19PQ0lDKTsgT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX1BPUlRfRU5BQkxFKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NDUyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX1NVU1BFTkQpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfUE9DSSk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX1BPUlRfUE9XRVIpOgorCQkJCQlXUl9SSF9QT1JUU1RBVCAoUkhfUFNfTFNEQSk7IE9LICgwKTsKKwkJCWNhc2UgKFJIX0NfUE9SVF9DT05ORUNUSU9OKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX0NTQyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9DX1BPUlRfRU5BQkxFKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BFU0MpOyBPSyAoMCk7CisJCQljYXNlIChSSF9DX1BPUlRfU1VTUEVORCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1NDKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX09WRVJfQ1VSUkVOVCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19PQ0lDKTsgT0sgKDApOworCQkJY2FzZSAoUkhfQ19QT1JUX1JFU0VUKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BSU0MpOyBPSyAoMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJCWNhc2UgKFJIX1BPUlRfU1VTUEVORCk6CisJCQkJCVdSX1JIX1BPUlRTVEFUIChSSF9QU19QU1MgKTsgT0sgKDApOworCQkJY2FzZSAoUkhfUE9SVF9SRVNFVCk6IC8qIEJVRyBJTiBIVVAgQ09ERSAqKioqKioqKiovCisJCQkJCWlmIChSRF9SSF9QT1JUU1RBVCAmIFJIX1BTX0NDUykKKwkJCQkJICAgIFdSX1JIX1BPUlRTVEFUIChSSF9QU19QUlMpOworCQkJCQlPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX1BPV0VSKToKKwkJCQkJV1JfUkhfUE9SVFNUQVQgKFJIX1BTX1BQUyApOyBPSyAoMCk7CisJCQljYXNlIChSSF9QT1JUX0VOQUJMRSk6IC8qIEJVRyBJTiBIVVAgQ09ERSAqKioqKioqKiovCisJCQkJCWlmIChSRF9SSF9QT1JUU1RBVCAmIFJIX1BTX0NDUykKKwkJCQkJICAgIFdSX1JIX1BPUlRTVEFUIChSSF9QU19QRVMgKTsKKwkJCQkJT0sgKDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfQUREUkVTUzogZ29oY2kucmguZGV2bnVtID0gd1ZhbHVlOyBPSygwKTsKKworCWNhc2UgUkhfR0VUX0RFU0NSSVBUT1I6CisJCXN3aXRjaCAoKHdWYWx1ZSAmIDB4ZmYwMCkgPj4gOCkgeworCQkJY2FzZSAoMHgwMSk6IC8qIGRldmljZSBkZXNjcmlwdG9yICovCisJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgIGxlbmksCisJCQkJCSAgbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX2Rldl9kZXMpLAorCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJZGF0YV9idWYgPSByb290X2h1Yl9kZXZfZGVzOyBPSyhsZW4pOworCQkJY2FzZSAoMHgwMik6IC8qIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworCQkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJICBsZW5pLAorCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJICAgICAgc2l6ZW9mIChyb290X2h1Yl9jb25maWdfZGVzKSwKKwkJCQkJICAgICAgd0xlbmd0aCkpOworCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfY29uZmlnX2RlczsgT0sobGVuKTsKKwkJCWNhc2UgKDB4MDMpOiAvKiBzdHJpbmcgZGVzY3JpcHRvcnMgKi8KKwkJCQlpZih3VmFsdWU9PTB4MDMwMCkgeworCQkJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQkgIGxlbmksCisJCQkJCQkgIG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCSAgICAgIHNpemVvZiAocm9vdF9odWJfc3RyX2luZGV4MCksCisJCQkJCQkgICAgICB3TGVuZ3RoKSk7CisJCQkJCWRhdGFfYnVmID0gcm9vdF9odWJfc3RyX2luZGV4MDsKKwkJCQkJT0sobGVuKTsKKwkJCQl9CisJCQkJaWYod1ZhbHVlPT0weDAzMDEpIHsKKwkJCQkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LAorCQkJCQkJICBsZW5pLAorCQkJCQkJICBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJCQkgICAgICBzaXplb2YgKHJvb3RfaHViX3N0cl9pbmRleDEpLAorCQkJCQkJICAgICAgd0xlbmd0aCkpOworCQkJCQlkYXRhX2J1ZiA9IHJvb3RfaHViX3N0cl9pbmRleDE7CisJCQkJCU9LKGxlbik7CisJCQl9CisJCQlkZWZhdWx0OgorCQkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkhfR0VUX0RFU0NSSVBUT1IgfCBSSF9DTEFTUzoKKwkgICAgeworCQkgICAgX191MzIgdGVtcCA9IHJvb3RodWJfYSAoJmdvaGNpKTsKKworCQkgICAgZGF0YV9idWYgWzBdID0gOTsJCS8qIG1pbiBsZW5ndGg7ICovCisJCSAgICBkYXRhX2J1ZiBbMV0gPSAweDI5OworCQkgICAgZGF0YV9idWYgWzJdID0gdGVtcCAmIFJIX0FfTkRQOworCQkgICAgZGF0YV9idWYgWzNdID0gMDsKKwkJICAgIGlmICh0ZW1wICYgUkhfQV9QU00pCS8qIHBlci1wb3J0IHBvd2VyIHN3aXRjaGluZz8gKi8KKwkJCWRhdGFfYnVmIFszXSB8PSAweDE7CisJCSAgICBpZiAodGVtcCAmIFJIX0FfTk9DUCkJLyogbm8gb3ZlcmN1cnJlbnQgcmVwb3J0aW5nPyAqLworCQkJZGF0YV9idWYgWzNdIHw9IDB4MTA7CisJCSAgICBlbHNlIGlmICh0ZW1wICYgUkhfQV9PQ1BNKQkvKiBwZXItcG9ydCBvdmVyY3VycmVudCByZXBvcnRpbmc/ICovCisJCQlkYXRhX2J1ZiBbM10gfD0gMHg4OworCisJCSAgICAvKiBjb3JyZXNwb25kcyB0byBkYXRhX2J1Zls0LTddICovCisJCSAgICBkYXRhYiBbMV0gPSAwOworCQkgICAgZGF0YV9idWYgWzVdID0gKHRlbXAgJiBSSF9BX1BPVFBHVCkgPj4gMjQ7CisJCSAgICB0ZW1wID0gcm9vdGh1Yl9iICgmZ29oY2kpOworCQkgICAgZGF0YV9idWYgWzddID0gdGVtcCAmIFJIX0JfRFI7CisJCSAgICBpZiAoZGF0YV9idWYgWzJdIDwgNykgeworCQkJZGF0YV9idWYgWzhdID0gMHhmZjsKKwkJICAgIH0gZWxzZSB7CisJCQlkYXRhX2J1ZiBbMF0gKz0gMjsKKwkJCWRhdGFfYnVmIFs4XSA9ICh0ZW1wICYgUkhfQl9EUikgPj4gODsKKwkJCWRhdGFfYnVmIFsxMF0gPSBkYXRhX2J1ZiBbOV0gPSAweGZmOworCQkgICAgfQorCisJCSAgICBsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbmksCisJCQkgICAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIGRhdGFfYnVmIFswXSwgd0xlbmd0aCkpOworCQkgICAgT0sgKGxlbik7CisJCX0KKworCWNhc2UgUkhfR0VUX0NPTkZJR1VSQVRJT046CSooX191OCAqKSBkYXRhX2J1ZiA9IDB4MDE7IE9LICgxKTsKKworCWNhc2UgUkhfU0VUX0NPTkZJR1VSQVRJT046CVdSX1JIX1NUQVQgKDB4MTAwMDApOyBPSyAoMCk7CisKKwlkZWZhdWx0OgorCQlkYmcgKCJ1bnN1cHBvcnRlZCByb290IGh1YiBjb21tYW5kIik7CisJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwl9CisKKyNpZmRlZglERUJVRworCW9oY2lfZHVtcF9yb290aHViICgmZ29oY2ksIDEpOworI2VuZGlmCisKKwlsZW4gPSBtaW5fdChpbnQsIGxlbiwgbGVuaSk7CisJaWYgKGRhdGEgIT0gZGF0YV9idWYpCisJICAgIG1lbWNweSAoZGF0YSwgZGF0YV9idWYsIGxlbik7CisJZGV2LT5hY3RfbGVuID0gbGVuOworCWRldi0+c3RhdHVzID0gc3RhdDsKKworI2lmZGVmIERFQlVHCisJaWYgKHRyYW5zZmVyX2xlbikKKwkJdXJiX3ByaXYuYWN0dWFsX2xlbmd0aCA9IHRyYW5zZmVyX2xlbjsKKwlwa3RfcHJpbnQoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgY21kLCAiUkVUKHJoKSIsIDAvKnVzYl9waXBlaW4ocGlwZSkqLyk7CisjZW5kaWYKKworCXJldHVybiBzdGF0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBjb21tb24gY29kZSBmb3IgaGFuZGxpbmcgc3VibWl0IG1lc3NhZ2VzIC0gdXNlZCBmb3IgYWxsIGJ1dCByb290IGh1YiAqLworLyogYWNjZXNzZXMuICovCitpbnQgc3VibWl0X2NvbW1vbl9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCWludCB0cmFuc2Zlcl9sZW4sIHN0cnVjdCBkZXZyZXF1ZXN0ICpzZXR1cCwgaW50IGludGVydmFsKQoreworCWludCBzdGF0ID0gMDsKKwlpbnQgbWF4c2l6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlKTsKKwlpbnQgdGltZW91dDsKKworCS8qIGRldmljZSBwdWxsZWQ/IFNob3J0Y3V0IHRoZSBhY3Rpb24uICovCisJaWYgKGRldmdvbmUgPT0gZGV2KSB7CisJCWRldi0+c3RhdHVzID0gVVNCX1NUX0NSQ19FUlI7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIERFQlVHCisJdXJiX3ByaXYuYWN0dWFsX2xlbmd0aCA9IDA7CisJcGt0X3ByaW50KGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIHNldHVwLCAiU1VCIiwgdXNiX3BpcGVpbihwaXBlKSk7CisjZW5kaWYKKwlpZiAoIW1heHNpemUpIHsKKwkJZXJyKCJzdWJtaXRfY29tbW9uX21lc3NhZ2U6IHBpcGVzaXplIGZvciBwaXBlICVseCBpcyB6ZXJvIiwKKwkJCXBpcGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNvaGNpX3N1Ym1pdF9qb2IoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsIGludGVydmFsKSA8IDApIHsKKwkJZXJyKCJzb2hjaV9zdWJtaXRfam9iIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYWxsb3cgbW9yZSB0aW1lIGZvciBhIEJVTEsgZGV2aWNlIHRvIHJlYWN0IC0gc29tZSBhcmUgc2xvdyAqLworI2RlZmluZSBCVUxLX1RPCSA1MDAwCS8qIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCisJaWYgKHVzYl9waXBlYnVsayhwaXBlKSkKKwkJdGltZW91dCA9IEJVTEtfVE87CisJZWxzZQorCQl0aW1lb3V0ID0gMTAwOworCisJLyogd2FpdCBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwlmb3IgKDs7KSB7CisJCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGNvbnRyb2xsZXIgaXMgZG9uZSAqLworCQlzdGF0ID0gaGNfaW50ZXJydXB0KCk7CisJCWlmIChzdGF0IDwgMCkgeworCQkJc3RhdCA9IFVTQl9TVF9DUkNfRVJSOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBOT1RFOiBzaW5jZSB3ZSBhcmUgbm90IGludGVycnVwdCBkcml2ZW4gaW4gVS1Cb290IGFuZCBhbHdheXMKKwkJICogaGFuZGxlIG9ubHkgb25lIFVSQiBhdCBhIHRpbWUsIHdlIGNhbm5vdCBhc3N1bWUgdGhlCisJCSAqIHRyYW5zYWN0aW9uIGZpbmlzaGVkIG9uIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJldHVybiBmcm9tCisJCSAqIGhjX2ludGVycnVwdCgpLi4gdW5sZXNzIHRoZSBmbGFnIGZvciBjdXJyZW50IFVSQiBpcyBzZXQsCisJCSAqIG1lYW5pbmcgdGhhdCBhbGwgVEQncyB0by9mcm9tIGRldmljZSBnb3QgYWN0dWFsbHkKKwkJICogdHJhbnNmZXJyZWQgYW5kIHByb2Nlc3NlZC4gSWYgdGhlIGN1cnJlbnQgVVJCIGlzIG5vdAorCQkgKiBmaW5pc2hlZCB3ZSBuZWVkIHRvIHJlLWl0ZXJhdGUgdGhpcyBsb29wIHNvIGFzCisJCSAqIGhjX2ludGVycnVwdCgpIGdldHMgY2FsbGVkIGFnYWluIGFzIHRoZXJlIG5lZWRzIHRvIGJlIHNvbWUKKwkJICogbW9yZSBURCdzIHRvIHByb2Nlc3Mgc3RpbGwgKi8KKwkJaWYgKChzdGF0ID49IDApICYmIChzdGF0ICE9IDB4ZmYpICYmICh1cmJfZmluaXNoZWQpKSB7CisJCQkvKiAweGZmIGlzIHJldHVybmVkIGZvciBhbiBTRi1pbnRlcnJ1cHQgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKC0tdGltZW91dCkgeworCQkJd2FpdF9tcygxKTsKKwkJCWlmICghdXJiX2ZpbmlzaGVkKQorCQkJCWRiZygiXCUiKTsKKworCQl9IGVsc2UgeworCQkJZXJyKCJDVEw6VElNRU9VVCAiKTsKKwkJCWRiZygic3VibWl0X2NvbW1vbl9tc2c6IFRPIHN0YXR1cyAleFxuIiwgc3RhdCk7CisJCQlzdGF0ID0gVVNCX1NUX0NSQ19FUlI7CisJCQl1cmJfZmluaXNoZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisjaWYgMAorCS8qIHdlIGdvdCBhbiBSb290IEh1YiBTdGF0dXMgQ2hhbmdlIGludGVycnVwdCAqLworCWlmIChnb3RfcmhzYykgeworI2lmZGVmIERFQlVHCisJCW9oY2lfZHVtcF9yb290aHViICgmZ29oY2ksIDEpOworI2VuZGlmCisJCWdvdF9yaHNjID0gMDsKKwkJLyogYWJ1c2UgdGltZW91dCAqLworCQl0aW1lb3V0ID0gcmhfY2hlY2tfcG9ydF9zdGF0dXMoJmdvaGNpKTsKKwkJaWYgKHRpbWVvdXQgPj0gMCkgeworI2lmIDAgLyogdGhpcyBkb2VzIG5vdGhpbmcgdXNlZnVsLCBidXQgbGVhdmUgaXQgaGVyZSBpbiBjYXNlIHRoYXQgY2hhbmdlcyAqLworCQkJLyogdGhlIGNhbGxlZCByb3V0aW5lIGFkZHMgMSB0byB0aGUgcGFzc2VkIHZhbHVlICovCisJCQl1c2JfaHViX3BvcnRfY29ubmVjdF9jaGFuZ2UoZ29oY2kucmguZGV2LCB0aW1lb3V0IC0gMSk7CisjZW5kaWYKKwkJCS8qCisJCQkgKiBYWFgKKwkJCSAqIFRoaXMgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGJlY2F1c2UgaXQgYXNzdW1lcworCQkJICogdGhhdCBvbmx5IG9uZSBkZXZpY2UgaXMgZXZlciBwbHVnZ2VkIGluIQorCQkJICovCisJCQlkZXZnb25lID0gZGV2OworCQl9CisJfQorI2VuZGlmCisKKwlkZXYtPnN0YXR1cyA9IHN0YXQ7CisJZGV2LT5hY3RfbGVuID0gdHJhbnNmZXJfbGVuOworCisjaWZkZWYgREVCVUcKKwlwa3RfcHJpbnQoZGV2LCBwaXBlLCBidWZmZXIsIHRyYW5zZmVyX2xlbiwgc2V0dXAsICJSRVQoY3RscikiLCB1c2JfcGlwZWluKHBpcGUpKTsKKyNlbmRpZgorCisJLyogZnJlZSBURHMgaW4gdXJiX3ByaXYgKi8KKwl1cmJfZnJlZV9wcml2ICgmdXJiX3ByaXYpOworCXJldHVybiAwOworfQorCisvKiBzdWJtaXQgcm91dGluZXMgY2FsbGVkIGZyb20gdXNiLmMgKi8KK2ludCBzdWJtaXRfYnVsa19tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCWludCB0cmFuc2Zlcl9sZW4pCit7CisJaW5mbygic3VibWl0X2J1bGtfbXNnIik7CisJcmV0dXJuIHN1Ym1pdF9jb21tb25fbXNnKGRldiwgcGlwZSwgYnVmZmVyLCB0cmFuc2Zlcl9sZW4sIE5VTEwsIDApOworfQorCitpbnQgc3VibWl0X2NvbnRyb2xfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQlpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXApCit7CisJaW50IG1heHNpemUgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7CisKKwlpbmZvKCJzdWJtaXRfY29udHJvbF9tc2ciKTsKKyNpZmRlZiBERUJVRworCXVyYl9wcml2LmFjdHVhbF9sZW5ndGggPSAwOworCXBrdF9wcmludChkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgIlNVQiIsIHVzYl9waXBlaW4ocGlwZSkpOworI2VuZGlmCisJaWYgKCFtYXhzaXplKSB7CisJCWVycigic3VibWl0X2NvbnRyb2xfbWVzc2FnZTogcGlwZXNpemUgZm9yIHBpcGUgJWx4IGlzIHplcm8iLAorCQkJcGlwZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCgocGlwZSA+PiA4KSAmIDB4N2YpID09IGdvaGNpLnJoLmRldm51bSkgeworCQlnb2hjaS5yaC5kZXYgPSBkZXY7CisJCS8qIHJvb3QgaHViIC0gcmVkaXJlY3QgKi8KKwkJcmV0dXJuIG9oY2lfc3VibWl0X3JoX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLAorCQkJc2V0dXApOworCX0KKworCXJldHVybiBzdWJtaXRfY29tbW9uX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLCBzZXR1cCwgMCk7Cit9CisKK2ludCBzdWJtaXRfaW50X21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKKwkJaW50IHRyYW5zZmVyX2xlbiwgaW50IGludGVydmFsKQoreworCWluZm8oInN1Ym1pdF9pbnRfbXNnIik7CisJcmV0dXJuIC0xOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBIQyBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHJlc2V0IHRoZSBIQyBhbmQgQlVTICovCisKK3N0YXRpYyBpbnQgaGNfcmVzZXQgKG9oY2lfdCAqb2hjaSkKK3sKKwlpbnQgdGltZW91dCA9IDMwOworCWludCBzbW1fdGltZW91dCA9IDUwOyAvKiAwLDUgc2VjICovCisKKwlpZiAocmVhZGwgKCZvaGNpLT5yZWdzLT5jb250cm9sKSAmIE9IQ0lfQ1RSTF9JUikgeyAvKiBTTU0gb3ducyB0aGUgSEMgKi8KKwkJd3JpdGVsIChPSENJX09DUiwgJm9oY2ktPnJlZ3MtPmNtZHN0YXR1cyk7IC8qIHJlcXVlc3Qgb3duZXJzaGlwICovCisJCWluZm8oIlVTQiBIQyBUYWtlT3ZlciBmcm9tIFNNTSIpOworCQl3aGlsZSAocmVhZGwgKCZvaGNpLT5yZWdzLT5jb250cm9sKSAmIE9IQ0lfQ1RSTF9JUikgeworCQkJd2FpdF9tcyAoMTApOworCQkJaWYgKC0tc21tX3RpbWVvdXQgPT0gMCkgeworCQkJCWVycigiVVNCIEhDIFRha2VPdmVyIGZhaWxlZCEiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEaXNhYmxlIEhDIGludGVycnVwdHMgKi8KKwl3cml0ZWwgKE9IQ0lfSU5UUl9NSUUsICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7CisKKwlkYmcoIlVTQiBIQyByZXNldF9oYyB1c2ItJXM6IGN0cmwgPSAweCVYIDsiLAorCQlvaGNpLT5zbG90X25hbWUsCisJCXJlYWRsICgmb2hjaS0+cmVncy0+Y29udHJvbCkpOworCisJLyogUmVzZXQgVVNCIChuZWVkZWQgYnkgc29tZSBjb250cm9sbGVycykgKi8KKwlvaGNpLT5oY19jb250cm9sID0gMDsKKwl3cml0ZWwgKG9oY2ktPmhjX2NvbnRyb2wsICZvaGNpLT5yZWdzLT5jb250cm9sKTsKKworCS8qIEhDIFJlc2V0IHJlcXVpcmVzIG1heCAxMCB1cyBkZWxheSAqLworCXdyaXRlbCAoT0hDSV9IQ1IsICAmb2hjaS0+cmVncy0+Y21kc3RhdHVzKTsKKwl3aGlsZSAoKHJlYWRsICgmb2hjaS0+cmVncy0+Y21kc3RhdHVzKSAmIE9IQ0lfSENSKSAhPSAwKSB7CisJCWlmICgtLXRpbWVvdXQgPT0gMCkgeworCQkJZXJyKCJVU0IgSEMgcmVzZXQgdGltZWQgb3V0ISIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXVkZWxheSAoMSk7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTdGFydCBhbiBPSENJIGNvbnRyb2xsZXIsIHNldCB0aGUgQlVTIG9wZXJhdGlvbmFsCisgKiBlbmFibGUgaW50ZXJydXB0cworICogY29ubmVjdCB0aGUgdmlydHVhbCByb290IGh1YiAqLworCitzdGF0aWMgaW50IGhjX3N0YXJ0IChvaGNpX3QgKiBvaGNpKQoreworCV9fdTMyIG1hc2s7CisJdW5zaWduZWQgaW50IGZtaW50ZXJ2YWw7CisKKwlvaGNpLT5kaXNhYmxlZCA9IDE7CisKKwkvKiBUZWxsIHRoZSBjb250cm9sbGVyIHdoZXJlIHRoZSBjb250cm9sIGFuZCBidWxrIGxpc3RzIGFyZQorCSAqIFRoZSBsaXN0cyBhcmUgZW1wdHkgbm93LiAqLworCisJd3JpdGVsICgwLCAmb2hjaS0+cmVncy0+ZWRfY29udHJvbGhlYWQpOworCXdyaXRlbCAoMCwgJm9oY2ktPnJlZ3MtPmVkX2J1bGtoZWFkKTsKKworCXdyaXRlbCAoKF9fdTMyKW9oY2ktPmhjY2EsICZvaGNpLT5yZWdzLT5oY2NhKTsgLyogYSByZXNldCBjbGVhcnMgdGhpcyAqLworCisJZm1pbnRlcnZhbCA9IDB4MmVkZjsKKwl3cml0ZWwgKChmbWludGVydmFsICogOSkgLyAxMCwgJm9oY2ktPnJlZ3MtPnBlcmlvZGljc3RhcnQpOworCWZtaW50ZXJ2YWwgfD0gKCgoKGZtaW50ZXJ2YWwgLSAyMTApICogNikgLyA3KSA8PCAxNik7CisJd3JpdGVsIChmbWludGVydmFsLCAmb2hjaS0+cmVncy0+Zm1pbnRlcnZhbCk7CisJd3JpdGVsICgweDYyOCwgJm9oY2ktPnJlZ3MtPmxzdGhyZXNoKTsKKworCS8qIHN0YXJ0IGNvbnRyb2xsZXIgb3BlcmF0aW9ucyAqLworCW9oY2ktPmhjX2NvbnRyb2wgPSBPSENJX0NPTlRST0xfSU5JVCB8IE9IQ0lfVVNCX09QRVI7CisJb2hjaS0+ZGlzYWJsZWQgPSAwOworCXdyaXRlbCAob2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCW1hc2sgPSAoT0hDSV9JTlRSX1NPIHwgT0hDSV9JTlRSX1dESCB8IE9IQ0lfSU5UUl9TRiB8IE9IQ0lfSU5UUl9SRCB8CisJCQlPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfRk5PIHwgT0hDSV9JTlRSX1JIU0MgfAorCQkJT0hDSV9JTlRSX09DIHwgT0hDSV9JTlRSX01JRSk7CisJd3JpdGVsIChtYXNrLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJbWFzayAmPSB+T0hDSV9JTlRSX01JRTsKKwl3cml0ZWwgKG1hc2ssICZvaGNpLT5yZWdzLT5pbnRyc3RhdHVzKTsKKwkvKiBDaG9vc2UgdGhlIGludGVycnVwdHMgd2UgY2FyZSBhYm91dCBub3cgIC0gYnV0IHcvbyBNSUUgKi8KKwltYXNrID0gT0hDSV9JTlRSX1JIU0MgfCBPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfV0RIIHwgT0hDSV9JTlRSX1NPOworCXdyaXRlbCAobWFzaywgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworCisjaWZkZWYJT0hDSV9VU0VfTlBTCisJLyogcmVxdWlyZWQgZm9yIEFNRC03NTYgYW5kIHNvbWUgTWFjIHBsYXRmb3JtcyAqLworCXdyaXRlbCAoKHJvb3RodWJfYSAob2hjaSkgfCBSSF9BX05QUykgJiB+UkhfQV9QU00sCisJCSZvaGNpLT5yZWdzLT5yb290aHViLmEpOworCXdyaXRlbCAoUkhfSFNfTFBTQywgJm9oY2ktPnJlZ3MtPnJvb3RodWIuc3RhdHVzKTsKKyNlbmRpZgkvKiBPSENJX1VTRV9OUFMgKi8KKworI2RlZmluZSBtZGVsYXkobikgKHt1bnNpZ25lZCBsb25nIG1zZWM9KG4pOyB3aGlsZSAobXNlYy0tKSB1ZGVsYXkoMTAwMCk7fSkKKwkvKiBQT1RQR1QgZGVsYXkgaXMgYml0cyAyNC0zMSwgaW4gMiBtcyB1bml0cy4gKi8KKwltZGVsYXkgKChyb290aHViX2EgKG9oY2kpID4+IDIzKSAmIDB4MWZlKTsKKworCS8qIGNvbm5lY3QgdGhlIHZpcnR1YWwgcm9vdCBodWIgKi8KKwlvaGNpLT5yaC5kZXZudW0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIGFuIGludGVycnVwdCBoYXBwZW5zICovCisKK3N0YXRpYyBpbnQKK2hjX2ludGVycnVwdCAodm9pZCkKK3sKKwlvaGNpX3QgKm9oY2kgPSAmZ29oY2k7CisJc3RydWN0IG9oY2lfcmVncyAqcmVncyA9IG9oY2ktPnJlZ3M7CisJaW50IGludHM7CisJaW50IHN0YXQgPSAtMTsKKworCWlmICgob2hjaS0+aGNjYS0+ZG9uZV9oZWFkICE9IDApICYmCisJICAgICAhKG9oY2lfY3B1X3RvX2xlMzIob2hjaS0+aGNjYS0+ZG9uZV9oZWFkKSAmIDB4MDEpKSB7CisKKwkJaW50cyA9ICBPSENJX0lOVFJfV0RIOworCisJfSBlbHNlIGlmICgoaW50cyA9IHJlYWRsICgmcmVncy0+aW50cnN0YXR1cykpID09IH4odTMyKTApIHsKKwkJb2hjaS0+ZGlzYWJsZWQrKzsKKwkJZXJyICgiJXMgZGV2aWNlIHJlbW92ZWQhIiwgb2hjaS0+c2xvdF9uYW1lKTsKKwkJcmV0dXJuIC0xOworCisJfSBlbHNlIGlmICgoaW50cyAmPSByZWFkbCAoJnJlZ3MtPmludHJlbmFibGUpKSA9PSAwKSB7CisJCWRiZygiaGNfaW50ZXJydXB0OiByZXR1cm5pbmcuLlxuIik7CisJCXJldHVybiAweGZmOworCX0KKworCS8qIGRiZygiSW50ZXJydXB0OiAleCBmcmFtZTogJXgiLCBpbnRzLCBsZTE2X3RvX2NwdSAob2hjaS0+aGNjYS0+ZnJhbWVfbm8pKTsgKi8KKworCWlmIChpbnRzICYgT0hDSV9JTlRSX1JIU0MpIHsKKwkJZ290X3Joc2MgPSAxOworCQlzdGF0ID0gMHhmZjsKKwl9CisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9VRSkgeworCQlvaGNpLT5kaXNhYmxlZCsrOworCQllcnIgKCJPSENJIFVucmVjb3ZlcmFibGUgRXJyb3IsIGNvbnRyb2xsZXIgdXNiLSVzIGRpc2FibGVkIiwKKwkJCW9oY2ktPnNsb3RfbmFtZSk7CisJCS8qIGUuZy4gZHVlIHRvIFBDSSBNYXN0ZXIvVGFyZ2V0IEFib3J0ICovCisKKyNpZmRlZglERUJVRworCQlvaGNpX2R1bXAgKG9oY2ksIDEpOworI2VuZGlmCisJCS8qIEZJWE1FOiBiZSBvcHRpbWlzdGljLCBob3BlIHRoYXQgYnVnIHdvbid0IHJlcGVhdCBvZnRlbi4gKi8KKwkJLyogTWFrZSBzb21lIG5vbi1pbnRlcnJ1cHQgY29udGV4dCByZXN0YXJ0IHRoZSBjb250cm9sbGVyLiAqLworCQkvKiBDb3VudCBhbmQgbGltaXQgdGhlIHJldHJpZXMgdGhvdWdoOyBlaXRoZXIgaGFyZHdhcmUgb3IgKi8KKwkJLyogc29mdHdhcmUgZXJyb3JzIGNhbiBnbyBmb3JldmVyLi4uICovCisJCWhjX3Jlc2V0IChvaGNpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChpbnRzICYgT0hDSV9JTlRSX1dESCkgeworCQl3cml0ZWwgKE9IQ0lfSU5UUl9XREgsICZyZWdzLT5pbnRyZGlzYWJsZSk7CisJCXN0YXQgPSBkbF9kb25lX2xpc3QgKCZnb2hjaSwgZGxfcmV2ZXJzZV9kb25lX2xpc3QgKCZnb2hjaSkpOworCQl3cml0ZWwgKE9IQ0lfSU5UUl9XREgsICZyZWdzLT5pbnRyZW5hYmxlKTsKKwl9CisKKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9TTykgeworCQlkYmcoIlVTQiBTY2hlZHVsZSBvdmVycnVuXG4iKTsKKwkJd3JpdGVsIChPSENJX0lOVFJfU08sICZyZWdzLT5pbnRyZW5hYmxlKTsKKwkJc3RhdCA9IC0xOworCX0KKworCS8qIEZJWE1FOiAgdGhpcyBhc3N1bWVzIFNPRiAoMS9tcykgaW50ZXJydXB0cyBkb24ndCBnZXQgbG9zdC4uLiAqLworCWlmIChpbnRzICYgT0hDSV9JTlRSX1NGKSB7CisJCXVuc2lnbmVkIGludCBmcmFtZSA9IG9oY2lfY3B1X3RvX2xlMTYgKG9oY2ktPmhjY2EtPmZyYW1lX25vKSAmIDE7CisJCXdhaXRfbXMoMSk7CisJCXdyaXRlbCAoT0hDSV9JTlRSX1NGLCAmcmVncy0+aW50cmRpc2FibGUpOworCQlpZiAob2hjaS0+ZWRfcm1fbGlzdFtmcmFtZV0gIT0gTlVMTCkKKwkJCXdyaXRlbCAoT0hDSV9JTlRSX1NGLCAmcmVncy0+aW50cmVuYWJsZSk7CisJCXN0YXQgPSAweGZmOworCX0KKworCXdyaXRlbCAoaW50cywgJnJlZ3MtPmludHJzdGF0dXMpOworCXJldHVybiBzdGF0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBEZS1hbGxvY2F0ZSBhbGwgcmVzb3VyY2VzLi4gKi8KKworc3RhdGljIHZvaWQgaGNfcmVsZWFzZV9vaGNpIChvaGNpX3QgKm9oY2kpCit7CisJZGJnICgiVVNCIEhDIHJlbGVhc2Ugb2hjaSB1c2ItJXMiLCBvaGNpLT5zbG90X25hbWUpOworCisJaWYgKCFvaGNpLT5kaXNhYmxlZCkKKwkJaGNfcmVzZXQgKG9oY2kpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogbG93IGxldmVsIGluaXRhbGlzYXRpb24gcm91dGluZSwgY2FsbGVkIGZyb20gdXNiLmMKKyAqLworc3RhdGljIGNoYXIgb2hjaV9pbml0ZWQgPSAwOworCitpbnQgdXNiX2xvd2xldmVsX2luaXQodm9pZCkKK3sKKwltZW1zZXQgKCZnb2hjaSwgMCwgc2l6ZW9mIChvaGNpX3QpKTsKKwltZW1zZXQgKCZ1cmJfcHJpdiwgMCwgc2l6ZW9mICh1cmJfcHJpdl90KSk7CisKKwkvKiBhbGlnbiB0aGUgc3RvcmFnZSAqLworCWlmICgoX191MzIpJmdoY2NhWzBdICYgMHhmZikgeworCQllcnIoIkhDQ0Egbm90IGFsaWduZWQhISIpOworCQlyZXR1cm4gLTE7CisJfQorCXBoY2NhID0gJmdoY2NhWzBdOworCWluZm8oImFsaWduZWQgZ2hjY2EgJXAiLCBwaGNjYSk7CisJbWVtc2V0KCZvaGNpX2RldiwgMCwgc2l6ZW9mKHN0cnVjdCBvaGNpX2RldmljZSkpOworCWlmICgoX191MzIpJm9oY2lfZGV2LmVkWzBdICYgMHg3KSB7CisJCWVycigiRURzIG5vdCBhbGlnbmVkISEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoZ3RkLCAwLCBzaXplb2YodGRfdCkgKiAoTlVNX1REICsgMSkpOworCWlmICgoX191MzIpZ3RkICYgMHg3KSB7CisJCWVycigiVERzIG5vdCBhbGlnbmVkISEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwdGQgPSBndGQ7CisJZ29oY2kuaGNjYSA9IHBoY2NhOworCW1lbXNldCAocGhjY2EsIDAsIHNpemVvZiAoc3RydWN0IG9oY2lfaGNjYSkpOworCisJZ29oY2kuZGlzYWJsZWQgPSAxOworCWdvaGNpLnNsZWVwaW5nID0gMDsKKwlnb2hjaS5pcnEgPSAtMTsKKyNpZiBkZWZpbmVkKENPTkZJR180NDBFUCkKKwlnb2hjaS5yZWdzID0gKHN0cnVjdCBvaGNpX3JlZ3MgKikoQ09ORklHX1NZU19QRVJJUEhFUkFMX0JBU0UgfCAweDEwMDApOworI2VsaWYgZGVmaW5lZChDT05GSUdfNDQwRVBYKSB8fCBkZWZpbmVkKENPTkZJR19TWVNfVVNCX0hPU1QpCisJZ29oY2kucmVncyA9IChzdHJ1Y3Qgb2hjaV9yZWdzICopKENPTkZJR19TWVNfVVNCX0hPU1QpOworI2VuZGlmCisKKwlnb2hjaS5mbGFncyA9IDA7CisJZ29oY2kuc2xvdF9uYW1lID0gInBwYzQ0MCI7CisKKwlpZiAoaGNfcmVzZXQgKCZnb2hjaSkgPCAwKSB7CisJCWhjX3JlbGVhc2Vfb2hjaSAoJmdvaGNpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChoY19zdGFydCAoJmdvaGNpKSA8IDApIHsKKwkJZXJyICgiY2FuJ3Qgc3RhcnQgdXNiLSVzIiwgZ29oY2kuc2xvdF9uYW1lKTsKKwkJaGNfcmVsZWFzZV9vaGNpICgmZ29oY2kpOworCQlyZXR1cm4gLTE7CisJfQorCisjaWZkZWYJREVCVUcKKwlvaGNpX2R1bXAgKCZnb2hjaSwgMSk7CisjZW5kaWYKKwlvaGNpX2luaXRlZCA9IDE7CisJdXJiX2ZpbmlzaGVkID0gMTsKKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUFgpCisJLyogaW5pdCB0aGUgZGV2aWNlIGRyaXZlciAqLworCXVzYl9kZXZfaW5pdCgpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9sb3dsZXZlbF9zdG9wKHZvaWQpCit7CisJLyogdGhpcyBnZXRzIGNhbGxlZCByZWFsbHkgZWFybHkgLSBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgaGFzICovCisJLyogZXZlbiBiZWVuIGluaXRpYWxpemVkISAqLworCWlmICghb2hjaV9pbml0ZWQpCisJCXJldHVybiAwOworCS8qIFRPRE8gcmVsZWFzZSBhbnkgaW50ZXJydXB0cywgZXRjLiAqLworCS8qIGNhbGwgaGNfcmVsZWFzZV9vaGNpKCkgaGVyZSA/ICovCisJaGNfcmVzZXQgKCZnb2hjaSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfVVNCX09IQ0kgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3VzYl9vaGNpLmggYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC91c2Jfb2hjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjM2RjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC91c2Jfb2hjaS5oCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogVVJCIE9IQ0kgSENEIChIb3N0IENvbnRyb2xsZXIgRHJpdmVyKSBmb3IgVVNCLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIgPHdlaXNzZ0B2aWVubmEuYXQ+CisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMSBEYXZpZCBCcm93bmVsbCA8ZGJyb3duZWxsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiB1c2Itb2hjaS5oCisgKi8KKworc3RhdGljIGludCBjY190b19lcnJvclsxNl0gPSB7CisKKy8qIG1hcHBpbmcgb2YgdGhlIE9IQ0kgQ0Mgc3RhdHVzIHRvIGVycm9yIGNvZGVzICovCisJLyogTm8gIEVycm9yICAqLyAwLAorCS8qIENSQyBFcnJvciAgKi8gVVNCX1NUX0NSQ19FUlIsCisJLyogQml0IFN0dWZmICAqLyBVU0JfU1RfQklUX0VSUiwKKwkvKiBEYXRhIFRvZ2cgICovIFVTQl9TVF9DUkNfRVJSLAorCS8qIFN0YWxsICAgICAgKi8gVVNCX1NUX1NUQUxMRUQsCisJLyogRGV2Tm90UmVzcCAqLyAtMSwKKwkvKiBQSURDaGVjayAgICovIFVTQl9TVF9CSVRfRVJSLAorCS8qIFVuRXhwUElEICAgKi8gVVNCX1NUX0JJVF9FUlIsCisJLyogRGF0YU92ZXIgICAqLyBVU0JfU1RfQlVGX0VSUiwKKwkvKiBEYXRhVW5kZXIgICovIFVTQl9TVF9CVUZfRVJSLAorCS8qIHJlc2VydmQgICAgKi8gLTEsCisJLyogcmVzZXJ2ZCAgICAqLyAtMSwKKwkvKiBCdWZmZXJPdmVyICovIFVTQl9TVF9CVUZfRVJSLAorCS8qIEJ1ZmZVbmRlciAgKi8gVVNCX1NUX0JVRl9FUlIsCisJLyogTm90IEFjY2VzcyAqLyAtMSwKKwkvKiBOb3QgQWNjZXNzICovIC0xCit9OworCisvKiBFRCBTdGF0ZXMgKi8KKworI2RlZmluZSBFRF9ORVcJCTB4MDAKKyNkZWZpbmUgRURfVU5MSU5LCTB4MDEKKyNkZWZpbmUgRURfT1BFUgkJMHgwMgorI2RlZmluZSBFRF9ERUwJCTB4MDQKKyNkZWZpbmUgRURfVVJCX0RFTAkweDA4CisKKy8qIHVzYl9vaGNpX2VkICovCitzdHJ1Y3QgZWQgeworCV9fdTMyIGh3SU5GTzsKKwlfX3UzMiBod1RhaWxQOworCV9fdTMyIGh3SGVhZFA7CisJX191MzIgaHdOZXh0RUQ7CisKKwlzdHJ1Y3QgZWQgKmVkX3ByZXY7CisJX191OCBpbnRfcGVyaW9kOworCV9fdTggaW50X2JyYW5jaDsKKwlfX3U4IGludF9sb2FkOworCV9fdTggaW50X2ludGVydmFsOworCV9fdTggc3RhdGU7CisJX191OCB0eXBlOworCV9fdTE2IGxhc3RfaXNvOworCXN0cnVjdCBlZCAqZWRfcm1fbGlzdDsKKworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OworCV9fdTMyIHVudXNlZFszXTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKK3R5cGVkZWYgc3RydWN0IGVkIGVkX3Q7CisKKy8qIFREIGluZm8gZmllbGQgKi8KKyNkZWZpbmUgVERfQ0MJICAgIDB4ZjAwMDAwMDAKKyNkZWZpbmUgVERfQ0NfR0VUKHRkX3ApICgodGRfcCA+PjI4KSAmIDB4MGYpCisjZGVmaW5lIFREX0NDX1NFVCh0ZF9wLCBjYykgKHRkX3ApID0gKCh0ZF9wKSAmIDB4MGZmZmZmZmYpIHwgKCgoY2MpICYgMHgwZikgPDwgMjgpCisjZGVmaW5lIFREX0VDCSAgICAweDBDMDAwMDAwCisjZGVmaW5lIFREX1QJICAgIDB4MDMwMDAwMDAKKyNkZWZpbmUgVERfVF9EQVRBMCAgMHgwMjAwMDAwMAorI2RlZmluZSBURF9UX0RBVEExICAweDAzMDAwMDAwCisjZGVmaW5lIFREX1RfVE9HR0xFIDB4MDAwMDAwMDAKKyNkZWZpbmUgVERfUgkgICAgMHgwMDA0MDAwMAorI2RlZmluZSBURF9ESQkgICAgMHgwMEUwMDAwMAorI2RlZmluZSBURF9ESV9TRVQoWCkgKCgoWCkgJiAweDA3KTw8IDIxKQorI2RlZmluZSBURF9EUAkgICAgMHgwMDE4MDAwMAorI2RlZmluZSBURF9EUF9TRVRVUCAweDAwMDAwMDAwCisjZGVmaW5lIFREX0RQX0lOICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgVERfRFBfT1VUICAgMHgwMDA4MDAwMAorCisjZGVmaW5lIFREX0lTTwkgICAgMHgwMDAxMDAwMAorI2RlZmluZSBURF9ERUwJICAgIDB4MDAwMjAwMDAKKworLyogQ0MgQ29kZXMgKi8KKyNkZWZpbmUgVERfQ0NfTk9FUlJPUgkgICAweDAwCisjZGVmaW5lIFREX0NDX0NSQwkgICAweDAxCisjZGVmaW5lIFREX0NDX0JJVFNUVUZGSU5HICAweDAyCisjZGVmaW5lIFREX0NDX0RBVEFUT0dHTEVNICAweDAzCisjZGVmaW5lIFREX0NDX1NUQUxMCSAgIDB4MDQKKyNkZWZpbmUgVERfREVWTk9UUkVTUAkgICAweDA1CisjZGVmaW5lIFREX1BJRENIRUNLRkFJTAkgICAweDA2CisjZGVmaW5lIFREX1VORVhQRUNURURQSUQgICAweDA3CisjZGVmaW5lIFREX0RBVEFPVkVSUlVOCSAgIDB4MDgKKyNkZWZpbmUgVERfREFUQVVOREVSUlVOCSAgIDB4MDkKKyNkZWZpbmUgVERfQlVGRkVST1ZFUlJVTiAgIDB4MEMKKyNkZWZpbmUgVERfQlVGRkVSVU5ERVJSVU4gIDB4MEQKKyNkZWZpbmUgVERfTk9UQUNDRVNTRUQJICAgMHgwRgorCisjZGVmaW5lIE1BWFBTVyAxCisKK3N0cnVjdCB0ZCB7CisJX191MzIgaHdJTkZPOworCV9fdTMyIGh3Q0JQOwkJLyogQ3VycmVudCBCdWZmZXIgUG9pbnRlciAqLworCV9fdTMyIGh3TmV4dFREOwkJLyogTmV4dCBURCBQb2ludGVyICovCisJX191MzIgaHdCRTsJCS8qIE1lbW9yeSBCdWZmZXIgRW5kIFBvaW50ZXIgKi8KKworCV9fdTE2IGh3UFNXW01BWFBTV107CisJX191OCB1bnVzZWQ7CisJX191OCBpbmRleDsKKwlzdHJ1Y3QgZWQgKmVkOworCXN0cnVjdCB0ZCAqbmV4dF9kbF90ZDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKKwlpbnQgdHJhbnNmZXJfbGVuOworCV9fdTMyIGRhdGE7CisKKwlfX3UzMiB1bnVzZWQyWzJdOworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwordHlwZWRlZiBzdHJ1Y3QgdGQgdGRfdDsKKworI2RlZmluZSBPSENJX0VEX1NLSVAJKDEgPDwgMTQpCisKKy8qCisgKiBUaGUgSENDQSAoSG9zdCBDb250cm9sbGVyIENvbW11bmljYXRpb25zIEFyZWEpIGlzIGEgMjU2IGJ5dGUKKyAqIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoZSBPSENJIHNwZWMuIHRoYXQgdGhlIGhvc3QgY29udHJvbGxlciBpcworICogdG9sZCB0aGUgYmFzZSBhZGRyZXNzIG9mLiAgSXQgbXVzdCBiZSAyNTYtYnl0ZSBhbGlnbmVkLgorICovCisKKyNkZWZpbmUgTlVNX0lOVFMgMzIJCS8qIHBhcnQgb2YgdGhlIE9IQ0kgc3RhbmRhcmQgKi8KK3N0cnVjdCBvaGNpX2hjY2EgeworCV9fdTMyIGludF90YWJsZVtOVU1fSU5UU107CS8qIEludGVycnVwdCBFRCB0YWJsZSAqLworI2lmIGRlZmluZWQoQ09ORklHX01QQzUyMDApCisJX191MTYgcGFkMTsJCS8qIHNldCB0byAwIG9uIGVhY2ggZnJhbWVfbm8gY2hhbmdlICovCisJX191MTYgZnJhbWVfbm87CQkvKiBjdXJyZW50IGZyYW1lIG51bWJlciAqLworI2Vsc2UKKwlfX3UxNiBmcmFtZV9ubzsJCS8qIGN1cnJlbnQgZnJhbWUgbnVtYmVyICovCisJX191MTYgcGFkMTsJCS8qIHNldCB0byAwIG9uIGVhY2ggZnJhbWVfbm8gY2hhbmdlICovCisjZW5kaWYKKwlfX3UzMiBkb25lX2hlYWQ7CS8qIGluZm8gcmV0dXJuZWQgZm9yIGFuIGludGVycnVwdCAqLworCXU4IHJlc2VydmVkX2Zvcl9oY1sxMTZdOworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDI1NikpKTsKKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIHJvb3QgaHViIHBvcnRzLgorICovCisjZGVmaW5lIE1BWF9ST09UX1BPUlRTCTE1CS8qIG1heGltdW0gT0hDSSByb290IGh1YiBwb3J0cyAqLworCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBPSENJIGNvbnRyb2xsZXIncyBtZW1vcnkgbWFwcGVkIEkvTworICogcmVnaW9uLiAgVGhpcyBpcyBNZW1vcnkgTWFwcGVkIEkvTy4JWW91IG11c3QgdXNlIHRoZSByZWFkbCgpIGFuZAorICogd3JpdGVsKCkgbWFjcm9zIGRlZmluZWQgaW4gYXNtL2lvLmggdG8gYWNjZXNzIHRoZXNlISEKKyAqLworc3RydWN0IG9oY2lfcmVncyB7CisJLyogY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLworCV9fdTMyIHJldmlzaW9uOworCV9fdTMyIGNvbnRyb2w7CisJX191MzIgY21kc3RhdHVzOworCV9fdTMyIGludHJzdGF0dXM7CisJX191MzIgaW50cmVuYWJsZTsKKwlfX3UzMiBpbnRyZGlzYWJsZTsKKwkvKiBtZW1vcnkgcG9pbnRlcnMgKi8KKwlfX3UzMiBoY2NhOworCV9fdTMyIGVkX3BlcmlvZGN1cnJlbnQ7CisJX191MzIgZWRfY29udHJvbGhlYWQ7CisJX191MzIgZWRfY29udHJvbGN1cnJlbnQ7CisJX191MzIgZWRfYnVsa2hlYWQ7CisJX191MzIgZWRfYnVsa2N1cnJlbnQ7CisJX191MzIgZG9uZWhlYWQ7CisJLyogZnJhbWUgY291bnRlcnMgKi8KKwlfX3UzMiBmbWludGVydmFsOworCV9fdTMyIGZtcmVtYWluaW5nOworCV9fdTMyIGZtbnVtYmVyOworCV9fdTMyIHBlcmlvZGljc3RhcnQ7CisJX191MzIgbHN0aHJlc2g7CisJLyogUm9vdCBodWIgcG9ydHMgKi8KKwlzdHJ1Y3Qgb2hjaV9yb290aHViX3JlZ3MgeworCQlfX3UzMiBhOworCQlfX3UzMiBiOworCQlfX3UzMiBzdGF0dXM7CisJCV9fdTMyIHBvcnRzdGF0dXNbTUFYX1JPT1RfUE9SVFNdOworCX0gcm9vdGh1YjsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKworLyogT0hDSSBDT05UUk9MIEFORCBTVEFUVVMgUkVHSVNURVIgTUFTS1MgKi8KKworLyoKKyAqIEhjQ29udHJvbCAoY29udHJvbCkgcmVnaXN0ZXIgbWFza3MKKyAqLworI2RlZmluZSBPSENJX0NUUkxfQ0JTUgkoMyA8PCAwKQkvKiBjb250cm9sL2J1bGsgc2VydmljZSByYXRpbyAqLworI2RlZmluZSBPSENJX0NUUkxfUExFCSgxIDw8IDIpCS8qIHBlcmlvZGljIGxpc3QgZW5hYmxlICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9JRQkoMSA8PCAzKQkvKiBpc29jaHJvbm91cyBlbmFibGUgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX0NMRQkoMSA8PCA0KQkvKiBjb250cm9sIGxpc3QgZW5hYmxlICovCisjZGVmaW5lIE9IQ0lfQ1RSTF9CTEUJKDEgPDwgNSkJLyogYnVsayBsaXN0IGVuYWJsZSAqLworI2RlZmluZSBPSENJX0NUUkxfSENGUwkoMyA8PCA2KQkvKiBob3N0IGNvbnRyb2xsZXIgZnVuY3Rpb25hbCBzdGF0ZSAqLworI2RlZmluZSBPSENJX0NUUkxfSVIJKDEgPDwgOCkJLyogaW50ZXJydXB0IHJvdXRpbmcgKi8KKyNkZWZpbmUgT0hDSV9DVFJMX1JXQwkoMSA8PCA5KQkvKiByZW1vdGUgd2FrZXVwIGNvbm5lY3RlZCAqLworI2RlZmluZSBPSENJX0NUUkxfUldFCSgxIDw8IDEwKQkvKiByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLworCisvKiBwcmUtc2hpZnRlZCB2YWx1ZXMgZm9yIEhDRlMgKi8KKyMJZGVmaW5lIE9IQ0lfVVNCX1JFU0VUCSgwIDw8IDYpCisjCWRlZmluZSBPSENJX1VTQl9SRVNVTUUJKDEgPDwgNikKKyMJZGVmaW5lIE9IQ0lfVVNCX09QRVIJKDIgPDwgNikKKyMJZGVmaW5lIE9IQ0lfVVNCX1NVU1BFTkQgKDMgPDwgNikKKworLyoKKyAqIEhjQ29tbWFuZFN0YXR1cyAoY21kc3RhdHVzKSByZWdpc3RlciBtYXNrcworICovCisjZGVmaW5lIE9IQ0lfSENSCSgxIDw8IDApCS8qIGhvc3QgY29udHJvbGxlciByZXNldCAqLworI2RlZmluZSBPSENJX0NMRgkoMSA8PCAxKQkvKiBjb250cm9sIGxpc3QgZmlsbGVkICovCisjZGVmaW5lIE9IQ0lfQkxGCSgxIDw8IDIpCS8qIGJ1bGsgbGlzdCBmaWxsZWQgKi8KKyNkZWZpbmUgT0hDSV9PQ1IJKDEgPDwgMykJLyogb3duZXJzaGlwIGNoYW5nZSByZXF1ZXN0ICovCisjZGVmaW5lIE9IQ0lfU09DCSgzIDw8IDE2KQkvKiBzY2hlZHVsaW5nIG92ZXJydW4gY291bnQgKi8KKworLyoKKyAqIG1hc2tzIHVzZWQgd2l0aCBpbnRlcnJ1cHQgcmVnaXN0ZXJzOgorICogSGNJbnRlcnJ1cHRTdGF0dXMgKGludHJzdGF0dXMpCisgKiBIY0ludGVycnVwdEVuYWJsZSAoaW50cmVuYWJsZSkKKyAqIEhjSW50ZXJydXB0RGlzYWJsZSAoaW50cmRpc2FibGUpCisgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX1NPCSgxIDw8IDApCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biAqLworI2RlZmluZSBPSENJX0lOVFJfV0RICSgxIDw8IDEpCS8qIHdyaXRlYmFjayBvZiBkb25lX2hlYWQgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX1NGCSgxIDw8IDIpCS8qIHN0YXJ0IGZyYW1lICovCisjZGVmaW5lIE9IQ0lfSU5UUl9SRAkoMSA8PCAzKQkvKiByZXN1bWUgZGV0ZWN0ICovCisjZGVmaW5lIE9IQ0lfSU5UUl9VRQkoMSA8PCA0KQkvKiB1bnJlY292ZXJhYmxlIGVycm9yICovCisjZGVmaW5lIE9IQ0lfSU5UUl9GTk8JKDEgPDwgNSkJLyogZnJhbWUgbnVtYmVyIG92ZXJmbG93ICovCisjZGVmaW5lIE9IQ0lfSU5UUl9SSFNDCSgxIDw8IDYpCS8qIHJvb3QgaHViIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUgT0hDSV9JTlRSX09DCSgxIDw8IDMwKQkvKiBvd25lcnNoaXAgY2hhbmdlICovCisjZGVmaW5lIE9IQ0lfSU5UUl9NSUUJKDEgPDwgMzEpCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCisKKy8qIFZpcnR1YWwgUm9vdCBIVUIgKi8KK3N0cnVjdCB2aXJ0X3Jvb3RfaHViIHsKKwlpbnQgZGV2bnVtOwkJLyogQWRkcmVzcyBvZiBSb290IEh1YiBlbmRwb2ludCAqLworCXZvaWQgKmRldjsJCS8qIHdhcyB1cmIgKi8KKwl2b2lkICppbnRfYWRkcjsKKwlpbnQgc2VuZDsKKwlpbnQgaW50ZXJ2YWw7Cit9OworCisvKiBVU0IgSFVCIENPTlNUQU5UUyAobm90IE9IQ0ktc3BlY2lmaWM7IHNlZSBodWIuaCkgKi8KKworLyogZGVzdGluYXRpb24gb2YgcmVxdWVzdCAqLworI2RlZmluZSBSSF9JTlRFUkZBQ0UJCSAgIDB4MDEKKyNkZWZpbmUgUkhfRU5EUE9JTlQJCSAgIDB4MDIKKyNkZWZpbmUgUkhfT1RIRVIJCSAgIDB4MDMKKworI2RlZmluZSBSSF9DTEFTUwkJICAgMHgyMAorI2RlZmluZSBSSF9WRU5ET1IJCSAgIDB4NDAKKworLyogUmVxdWVzdHM6IGJSZXF1ZXN0IDw8IDggfCBibVJlcXVlc3RUeXBlICovCisjZGVmaW5lIFJIX0dFVF9TVEFUVVMJCTB4MDA4MAorI2RlZmluZSBSSF9DTEVBUl9GRUFUVVJFCTB4MDEwMAorI2RlZmluZSBSSF9TRVRfRkVBVFVSRQkJMHgwMzAwCisjZGVmaW5lIFJIX1NFVF9BRERSRVNTCQkweDA1MDAKKyNkZWZpbmUgUkhfR0VUX0RFU0NSSVBUT1IJMHgwNjgwCisjZGVmaW5lIFJIX1NFVF9ERVNDUklQVE9SCTB4MDcwMAorI2RlZmluZSBSSF9HRVRfQ09ORklHVVJBVElPTgkweDA4ODAKKyNkZWZpbmUgUkhfU0VUX0NPTkZJR1VSQVRJT04JMHgwOTAwCisjZGVmaW5lIFJIX0dFVF9TVEFURQkJMHgwMjgwCisjZGVmaW5lIFJIX0dFVF9JTlRFUkZBQ0UJMHgwQTgwCisjZGVmaW5lIFJIX1NFVF9JTlRFUkZBQ0UJMHgwQjAwCisjZGVmaW5lIFJIX1NZTkNfRlJBTUUJCTB4MEM4MAorLyogT3VyIFZlbmRvciBTcGVjaWZpYyBSZXF1ZXN0ICovCisjZGVmaW5lIFJIX1NFVF9FUAkJMHgyMDAwCisKKy8qIEh1YiBwb3J0IGZlYXR1cmVzICovCisjZGVmaW5lIFJIX1BPUlRfQ09OTkVDVElPTgkgICAweDAwCisjZGVmaW5lIFJIX1BPUlRfRU5BQkxFCQkgICAweDAxCisjZGVmaW5lIFJIX1BPUlRfU1VTUEVORAkJICAgMHgwMgorI2RlZmluZSBSSF9QT1JUX09WRVJfQ1VSUkVOVAkgICAweDAzCisjZGVmaW5lIFJIX1BPUlRfUkVTRVQJCSAgIDB4MDQKKyNkZWZpbmUgUkhfUE9SVF9QT1dFUgkJICAgMHgwOAorI2RlZmluZSBSSF9QT1JUX0xPV19TUEVFRAkgICAweDA5CisKKyNkZWZpbmUgUkhfQ19QT1JUX0NPTk5FQ1RJT04JICAgMHgxMAorI2RlZmluZSBSSF9DX1BPUlRfRU5BQkxFCSAgIDB4MTEKKyNkZWZpbmUgUkhfQ19QT1JUX1NVU1BFTkQJICAgMHgxMgorI2RlZmluZSBSSF9DX1BPUlRfT1ZFUl9DVVJSRU5UCSAgIDB4MTMKKyNkZWZpbmUgUkhfQ19QT1JUX1JFU0VUCQkgICAweDE0CisKKy8qIEh1YiBmZWF0dXJlcyAqLworI2RlZmluZSBSSF9DX0hVQl9MT0NBTF9QT1dFUgkgICAweDAwCisjZGVmaW5lIFJIX0NfSFVCX09WRVJfQ1VSUkVOVAkgICAweDAxCisKKyNkZWZpbmUgUkhfREVWSUNFX1JFTU9URV9XQUtFVVAJICAgMHgwMAorI2RlZmluZSBSSF9FTkRQT0lOVF9TVEFMTAkgICAweDAxCisKKyNkZWZpbmUgUkhfQUNLCQkJICAgMHgwMQorI2RlZmluZSBSSF9SRVFfRVJSCQkgICAtMQorI2RlZmluZSBSSF9OQUNLCQkJICAgMHgwMAorCisvKiBPSENJIFJPT1QgSFVCIFJFR0lTVEVSIE1BU0tTICovCisKKy8qIHJvb3RodWIucG9ydHN0YXR1cyBbaV0gYml0cyAqLworI2RlZmluZSBSSF9QU19DQ1MJICAgICAweDAwMDAwMDAxCS8qIGN1cnJlbnQgY29ubmVjdCBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfUFNfUEVTCSAgICAgMHgwMDAwMDAwMgkvKiBwb3J0IGVuYWJsZSBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfUFNfUFNTCSAgICAgMHgwMDAwMDAwNAkvKiBwb3J0IHN1c3BlbmQgc3RhdHVzICovCisjZGVmaW5lIFJIX1BTX1BPQ0kJICAgICAweDAwMDAwMDA4CS8qIHBvcnQgb3ZlciBjdXJyZW50IGluZGljYXRvciAqLworI2RlZmluZSBSSF9QU19QUlMJICAgICAweDAwMDAwMDEwCS8qIHBvcnQgcmVzZXQgc3RhdHVzICovCisjZGVmaW5lIFJIX1BTX1BQUwkgICAgIDB4MDAwMDAxMDAJLyogcG9ydCBwb3dlciBzdGF0dXMgKi8KKyNkZWZpbmUgUkhfUFNfTFNEQQkgICAgIDB4MDAwMDAyMDAJLyogbG93IHNwZWVkIGRldmljZSBhdHRhY2hlZCAqLworI2RlZmluZSBSSF9QU19DU0MJICAgICAweDAwMDEwMDAwCS8qIGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBSSF9QU19QRVNDCSAgICAgMHgwMDAyMDAwMAkvKiBwb3J0IGVuYWJsZSBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lIFJIX1BTX1BTU0MJICAgICAweDAwMDQwMDAwCS8qIHBvcnQgc3VzcGVuZCBzdGF0dXMgY2hhbmdlICovCisjZGVmaW5lIFJIX1BTX09DSUMJICAgICAweDAwMDgwMDAwCS8qIG92ZXIgY3VycmVudCBpbmRpY2F0b3IgY2hhbmdlICovCisjZGVmaW5lIFJIX1BTX1BSU0MJICAgICAweDAwMTAwMDAwCS8qIHBvcnQgcmVzZXQgc3RhdHVzIGNoYW5nZSAqLworCisvKiByb290aHViLnN0YXR1cyBiaXRzICovCisjZGVmaW5lIFJIX0hTX0xQUwkgICAgIDB4MDAwMDAwMDEJLyogbG9jYWwgcG93ZXIgc3RhdHVzICovCisjZGVmaW5lIFJIX0hTX09DSQkgICAgIDB4MDAwMDAwMDIJLyogb3ZlciBjdXJyZW50IGluZGljYXRvciAqLworI2RlZmluZSBSSF9IU19EUldFCSAgICAgMHgwMDAwODAwMAkvKiBkZXZpY2UgcmVtb3RlIHdha2V1cCBlbmFibGUgKi8KKyNkZWZpbmUgUkhfSFNfTFBTQwkgICAgIDB4MDAwMTAwMDAJLyogbG9jYWwgcG93ZXIgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZSBSSF9IU19PQ0lDCSAgICAgMHgwMDAyMDAwMAkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yIGNoYW5nZSAqLworI2RlZmluZSBSSF9IU19DUldFCSAgICAgMHg4MDAwMDAwMAkvKiBjbGVhciByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLworCisvKiByb290aHViLmIgbWFza3MgKi8KKyNkZWZpbmUgUkhfQl9EUgkJMHgwMDAwZmZmZgkvKiBkZXZpY2UgcmVtb3ZhYmxlIGZsYWdzICovCisjZGVmaW5lIFJIX0JfUFBDTQkweGZmZmYwMDAwCS8qIHBvcnQgcG93ZXIgY29udHJvbCBtYXNrICovCisKKy8qIHJvb3RodWIuYSBtYXNrcyAqLworI2RlZmluZSBSSF9BX05EUAkoMHhmZiA8PCAwKQkvKiBudW1iZXIgb2YgZG93bnN0cmVhbSBwb3J0cyAqLworI2RlZmluZSBSSF9BX1BTTQkoMSA8PCA4KQkvKiBwb3dlciBzd2l0Y2hpbmcgbW9kZSAqLworI2RlZmluZSBSSF9BX05QUwkoMSA8PCA5KQkvKiBubyBwb3dlciBzd2l0Y2hpbmcgKi8KKyNkZWZpbmUgUkhfQV9EVAkJKDEgPDwgMTApCS8qIGRldmljZSB0eXBlIChtYnopICovCisjZGVmaW5lIFJIX0FfT0NQTQkoMSA8PCAxMSkJLyogb3ZlciBjdXJyZW50IHByb3RlY3Rpb24gbW9kZSAqLworI2RlZmluZSBSSF9BX05PQ1AJKDEgPDwgMTIpCS8qIG5vIG92ZXIgY3VycmVudCBwcm90ZWN0aW9uICovCisjZGVmaW5lIFJIX0FfUE9UUEdUCSgweGZmIDw8IDI0KQkvKiBwb3dlciBvbiB0byBwb3dlciBnb29kIHRpbWUgKi8KKworLyogdXJiICovCisjZGVmaW5lIE5fVVJCX1REIDQ4Cit0eXBlZGVmIHN0cnVjdCB7CisJZWRfdCAqZWQ7CisJX191MTYgbGVuZ3RoOwkJLyogbnVtYmVyIG9mIHRkcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0ICovCisJX191MTYgdGRfY250OwkJLyogbnVtYmVyIG9mIHRkcyBhbHJlYWR5IHNlcnZpY2VkICovCisJaW50IHN0YXRlOworCXVuc2lnbmVkIGxvbmcgcGlwZTsKKwlpbnQgYWN0dWFsX2xlbmd0aDsKKwl0ZF90ICp0ZFtOX1VSQl9URF07CS8qIGxpc3QgcG9pbnRlciB0byBhbGwgY29ycmVzcG9uZGluZyBURHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCAqLworfSB1cmJfcHJpdl90OworI2RlZmluZSBVUkJfREVMIDEKKworLyoKKyAqIFRoaXMgaXMgdGhlIGZ1bGwgb2hjaSBjb250cm9sbGVyIGRlc2NyaXB0aW9uCisgKgorICogTm90ZSBob3cgdGhlICJwcm9wZXIiIFVTQiBpbmZvcm1hdGlvbiBpcyBqdXN0CisgKiBhIHN1YnNldCBvZiB3aGF0IHRoZSBmdWxsIGltcGxlbWVudGF0aW9uIG5lZWRzLiAoTGludXMpCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgb2hjaSB7CisJc3RydWN0IG9oY2lfaGNjYSAqaGNjYTsJLyogaGNjYSAqLworCS8qZG1hX2FkZHJfdCBoY2NhX2RtYTsgKi8KKworCWludCBpcnE7CisJaW50IGRpc2FibGVkOwkJLyogZS5nLiBnb3QgYSBVRSwgd2UncmUgaHVuZyAqLworCWludCBzbGVlcGluZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBmb3IgSEMgYnVncyAqLworCisJc3RydWN0IG9oY2lfcmVncyAqcmVnczsJLyogT0hDSSBjb250cm9sbGVyJ3MgbWVtb3J5ICovCisKKwllZF90ICplZF9ybV9saXN0WzJdOwkvKiBsaXN0cyBvZiBhbGwgZW5kcG9pbnRzIHRvIGJlIHJlbW92ZWQgKi8KKwllZF90ICplZF9idWxrdGFpbDsJLyogbGFzdCBlbmRwb2ludCBvZiBidWxrIGxpc3QgKi8KKwllZF90ICplZF9jb250cm9sdGFpbDsJLyogbGFzdCBlbmRwb2ludCBvZiBjb250cm9sIGxpc3QgKi8KKwlpbnQgaW50cnN0YXR1czsKKwlfX3UzMiBoY19jb250cm9sOwkvKiBjb3B5IG9mIHRoZSBoYyBjb250cm9sIHJlZyAqLworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZbMzJdOworCXN0cnVjdCB2aXJ0X3Jvb3RfaHViIHJoOworCisJY29uc3QgY2hhciAqc2xvdF9uYW1lOworfSBvaGNpX3Q7CisKKyNkZWZpbmUgTlVNX0VEUyA4CQkvKiBudW0gb2YgcHJlYWxsb2NhdGVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCisKK3N0cnVjdCBvaGNpX2RldmljZSB7CisJZWRfdCBlZFtOVU1fRURTXTsKKwlpbnQgZWRfY250OworfTsKKworLyogaGNkICovCisvKiBlbmRwb2ludCAqLworc3RhdGljIGludCBlcF9saW5rKG9oY2lfdCAqIG9oY2ksIGVkX3QgKiBlZCk7CitzdGF0aWMgaW50IGVwX3VubGluayhvaGNpX3QgKiBvaGNpLCBlZF90ICogZWQpOworc3RhdGljIGVkX3QgKmVwX2FkZF9lZChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdW5zaWduZWQgbG9uZyBwaXBlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogd2UgbmVlZCBtb3JlIFREcyB0aGFuIEVEcyAqLworI2RlZmluZSBOVU1fVEQgNjQKKworLyogKzEgc28gd2UgY2FuIGFsaWduIHRoZSBzdG9yYWdlICovCit0ZF90IGd0ZFtOVU1fVEQgKyAxXTsKKy8qIHBvaW50ZXJzIHRvIGFsaWduZWQgc3RvcmFnZSAqLwordGRfdCAqcHRkOworCisvKiBURHMgLi4uICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZCAqdGRfYWxsb2Moc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCit7CisJaW50IGk7CisJc3RydWN0IHRkICp0ZDsKKworCXRkID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1REOyBpKyspIHsKKwkJaWYgKHB0ZFtpXS51c2JfZGV2ID09IE5VTEwpIHsKKwkJCXRkID0gJnB0ZFtpXTsKKwkJCXRkLT51c2JfZGV2ID0gdXNiX2RldjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHRkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZWRfZnJlZShzdHJ1Y3QgZWQgKmVkKQoreworCWVkLT51c2JfZGV2ID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3VzYmRldi5jIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvdXNiZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzOThhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3VzYmRldi5jCkBAIC0wLDAgKzEsMjMwIEBACisvKlVTQiAxLjEsMi4wIGRldmljZSovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpZiAoZGVmaW5lZChDT05GSUdfNDQwRVApIHx8IGRlZmluZWQoQ09ORklHXzQ0MEVQWCkpICYmIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpCisKKyNpbmNsdWRlIDx1c2IuaD4KKyNpbmNsdWRlIDxhc20vcHBjNHh4LXVpYy5oPgorI2luY2x1ZGUgInVzYmRldi5oIgorCisjZGVmaW5lIFVTQl9EVF9ERVZJQ0UgICAgICAgIDB4MDEKKyNkZWZpbmUgVVNCX0RUX0NPTkZJRyAgICAgICAgMHgwMgorI2RlZmluZSBVU0JfRFRfU1RSSU5HICAgICAgICAweDAzCisjZGVmaW5lIFVTQl9EVF9JTlRFUkZBQ0UgICAgIDB4MDQKKyNkZWZpbmUgVVNCX0RUX0VORFBPSU5UICAgICAgMHgwNQorCitpbnQgc2V0X3ZhbHVlID0gLTE7CisKK3ZvaWQgcHJvY2Vzc19lbmRwb2ludHModW5zaWduZWQgc2hvcnQgdXNiMmQwX2ludHJpbikKK3sKKwkvKndpbGwgaG9sZCB0aGUgcGFja2V0IHJlY2VpdmVkICovCisJc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciB1c2JfZGV2aWNlX3BhY2tldDsKKwlzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb25fZGVzY3JpcHRvciB1c2JfY29uZmlnX3BhY2tldDsKKwlzdHJ1Y3QgdXNiX3N0cmluZ19kZXNjcmlwdG9yIHVzYl9zdHJpbmdfcGFja2V0OworCXN0cnVjdCBkZXZyZXF1ZXN0IHNldHVwX3BhY2tldDsKKwl1bnNpZ25lZCBpbnQgKnNldHVwX3BhY2tldF9wdDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXRfcHQgPSBOVUxMOworCWludCB0ZW1wLCB0ZW1wMTsKKworCWludCBpOworCisJLypwcmludGYoIntVU0IgZGV2aWNlfSAtIGVuZHBvaW50IDB4JVggXG4iLCB1c2IyZDBfaW50cmluKTsgKi8KKworCS8qc2V0IHVzYiBhZGRyZXNzLCBzZWVtcyB0byBub3Qgd29yayB1bmxlc3MgaXQgaXMgZG9uZSBpbiB0aGUgbmV4dAorCSAgIGludGVycnVwdCwgc28gdGhhdCBpcyB3aHkgaXQgaXMgZG9uZSB0aGlzIHdheSAqLworCWlmIChzZXRfdmFsdWUgIT0gLTEpCisJCSoodW5zaWduZWQgY2hhciAqKVVTQjJEMF9GQUREUl84ID0gKHVuc2lnbmVkIGNoYXIpc2V0X3ZhbHVlOworCisJLyplbmRwb2ludCAxICovCisJaWYgKHVzYjJkMF9pbnRyaW4gJiAweDAxKSB7CisJCXNldHVwX3BhY2tldF9wdCA9ICh1bnNpZ25lZCBpbnQgKikmc2V0dXBfcGFja2V0OworCisJCS8qY29weSBwYWNrZXQgKi8KKwkJc2V0dXBfcGFja2V0X3B0WzBdID0gKih1bnNpZ25lZCBpbnQgKilVU0IyRDBfRklGT18wOworCQlzZXR1cF9wYWNrZXRfcHRbMV0gPSAqKHVuc2lnbmVkIGludCAqKVVTQjJEMF9GSUZPXzA7CisJCXRlbXAgPSAqKHVuc2lnbmVkIGludCAqKVVTQjJEMF9GSUZPXzA7CisJCXRlbXAxID0gKih1bnNpZ25lZCBpbnQgKilVU0IyRDBfRklGT18wOworCisJCS8qZG8gc29tZSBzd2FwcGluZyAqLworCQlzZXR1cF9wYWNrZXQudmFsdWUgPSBzd2FwXzE2KHNldHVwX3BhY2tldC52YWx1ZSk7CisJCXNldHVwX3BhY2tldC5pbmRleCA9IHN3YXBfMTYoc2V0dXBfcGFja2V0LmluZGV4KTsKKwkJc2V0dXBfcGFja2V0Lmxlbmd0aCA9IHN3YXBfMTYoc2V0dXBfcGFja2V0Lmxlbmd0aCk7CisKKwkJLypjbGVhciByeCBwYWNrZXQgKi8KKwkJKih1bnNpZ25lZCBzaG9ydCAqKVVTQjJEMF9JTkNTUjBfOCA9IDB4NDg7CisKKwkJLypwcmludGYoIjB4JVggMHglWCAweCVYIDB4JVggMHglWCAweCVYIDB4JVhcbiIsIHNldHVwX3BhY2tldC5yZXF1ZXN0dHlwZSwKKwkJICAgc2V0dXBfcGFja2V0LnJlcXVlc3QsIHNldHVwX3BhY2tldC52YWx1ZSwKKwkJICAgc2V0dXBfcGFja2V0LmluZGV4LCBzZXR1cF9wYWNrZXQubGVuZ3RoLCB0ZW1wLCB0ZW1wMSApOyAqLworCisJCXN3aXRjaCAoc2V0dXBfcGFja2V0LnJlcXVlc3QpIHsKKwkJY2FzZSBVU0JfUkVRX0dFVF9ERVNDUklQVE9SOgorCisJCQlzd2l0Y2ggKHNldHVwX3BhY2tldC52YWx1ZSA+PiA4KSB7CisJCQljYXNlIFVTQl9EVF9ERVZJQ0U6CisJCQkJLypjcmVhdGUgcGFja2V0ICovCisJCQkJdXNiX2RldmljZV9wYWNrZXQuYkxlbmd0aCA9IDE4OworCQkJCXVzYl9kZXZpY2VfcGFja2V0LmJEZXNjcmlwdG9yVHlwZSA9CisJCQkJICAgIFVTQl9EVF9ERVZJQ0U7CisjaWZkZWYgVVNCXzJfMF9ERVZJQ0UKKwkJCQl1c2JfZGV2aWNlX3BhY2tldC5iY2RVU0IgPSBzd2FwXzE2KDB4MjAwKTsKKyNlbHNlCisJCQkJdXNiX2RldmljZV9wYWNrZXQuYmNkVVNCID0gc3dhcF8xNigweDExMCk7CisjZW5kaWYKKwkJCQl1c2JfZGV2aWNlX3BhY2tldC5iRGV2aWNlQ2xhc3MgPSAweGZmOworCQkJCXVzYl9kZXZpY2VfcGFja2V0LmJEZXZpY2VTdWJDbGFzcyA9IDA7CisJCQkJdXNiX2RldmljZV9wYWNrZXQuYkRldmljZVByb3RvY29sID0gMDsKKwkJCQl1c2JfZGV2aWNlX3BhY2tldC5iTWF4UGFja2V0U2l6ZTAgPSAzMjsKKwkJCQl1c2JfZGV2aWNlX3BhY2tldC5pZFZlbmRvciA9IHN3YXBfMTYoMSk7CisJCQkJdXNiX2RldmljZV9wYWNrZXQuaWRQcm9kdWN0ID0gc3dhcF8xNigyKTsKKwkJCQl1c2JfZGV2aWNlX3BhY2tldC5iY2REZXZpY2UgPSBzd2FwXzE2KDB4MzAwKTsKKwkJCQl1c2JfZGV2aWNlX3BhY2tldC5pTWFudWZhY3R1cmVyID0gMTsKKwkJCQl1c2JfZGV2aWNlX3BhY2tldC5pUHJvZHVjdCA9IDE7CisJCQkJdXNiX2RldmljZV9wYWNrZXQuaVNlcmlhbE51bWJlciA9IDE7CisJCQkJdXNiX2RldmljZV9wYWNrZXQuYk51bUNvbmZpZ3VyYXRpb25zID0gMTsKKworCQkJCS8qcHV0IHBhY2tldCBpbiBmaWZvICovCisJCQkJcGFja2V0X3B0ID0gKHVuc2lnbmVkIGNoYXIgKikmdXNiX2RldmljZV9wYWNrZXQ7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVVNCX0RUX0NPTkZJRzoKKwkJCQkvKmNyZWF0ZSBwYWNrZXQgKi8KKwkJCQl1c2JfY29uZmlnX3BhY2tldC5iTGVuZ3RoID0gOTsKKwkJCQl1c2JfY29uZmlnX3BhY2tldC5iRGVzY3JpcHRvclR5cGUgPQorCQkJCSAgICBVU0JfRFRfQ09ORklHOworCQkJCXVzYl9jb25maWdfcGFja2V0LndUb3RhbExlbmd0aCA9IHN3YXBfMTYoMjUpOworCQkJCXVzYl9jb25maWdfcGFja2V0LmJOdW1JbnRlcmZhY2VzID0gMTsKKwkJCQl1c2JfY29uZmlnX3BhY2tldC5iQ29uZmlndXJhdGlvblZhbHVlID0gMTsKKwkJCQl1c2JfY29uZmlnX3BhY2tldC5pQ29uZmlndXJhdGlvbiA9IDA7CisJCQkJdXNiX2NvbmZpZ19wYWNrZXQuYm1BdHRyaWJ1dGVzID0gMHg0MDsKKwkJCQl1c2JfY29uZmlnX3BhY2tldC5iTWF4UG93ZXIgPSAwOworCisJCQkJLypwdXQgcGFja2V0IGluIGZpZm8gKi8KKwkJCQlwYWNrZXRfcHQgPSAodW5zaWduZWQgY2hhciAqKSZ1c2JfY29uZmlnX3BhY2tldDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBVU0JfRFRfU1RSSU5HOgorCQkJCS8qY3JlYXRlIHBhY2tldCAqLworCQkJCXVzYl9zdHJpbmdfcGFja2V0LmJMZW5ndGggPSAyOworCQkJCXVzYl9zdHJpbmdfcGFja2V0LmJEZXNjcmlwdG9yVHlwZSA9CisJCQkJICAgIFVTQl9EVF9TVFJJTkc7CisJCQkJdXNiX3N0cmluZ19wYWNrZXQud0RhdGFbMF0gPSAweDAwOTQ7CisKKwkJCQkvKnB1dCBwYWNrZXQgaW4gZmlmbyAqLworCQkJCXBhY2tldF9wdCA9ICh1bnNpZ25lZCBjaGFyICopJnVzYl9zdHJpbmdfcGFja2V0OworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKnB1dCBwYWNrZXQgaW4gZmlmbyAqLworCQkJZm9yIChpID0gMDsgaSA8IChzZXR1cF9wYWNrZXQubGVuZ3RoKTsgaSsrKSB7CisJCQkJKih1bnNpZ25lZCBjaGFyICopVVNCMkQwX0ZJRk9fMCA9IHBhY2tldF9wdFtpXTsKKwkJCX0KKworCQkJLypnaXZlIHR4IGNvbW1hbmQgKi8KKwkJCSoodW5zaWduZWQgc2hvcnQgKilVU0IyRDBfSU5DU1IwXzggPSAweDBhOworCisJCQlicmVhazsKKworCQljYXNlIFVTQl9SRVFfU0VUX0FERFJFU1M6CisKKwkJCS8qY29weSB1c2IgYWRkcmVzcyAqLworCQkJc2V0X3ZhbHVlID0gc2V0dXBfcGFja2V0LnZhbHVlOworCisJCQlicmVhazsKKwkJfQorCisJfQorfQorCit2b2lkIHByb2Nlc3Nfb3RoZXIodW5zaWduZWQgY2hhciB1c2IyZDBfaW50cnVzYikKK3sKKworCS8qY2hlY2sgZm9yIHNvZiAqLworCWlmICh1c2IyZDBfaW50cnVzYiAmIDB4MDgpIHsKKwkJLypwcmludGYoIntVU0IgZGV2aWNlfSAtIHNvZiBkZXRlY3RlZFxuIik7ICovCisJfQorCisJLypjaGVjayBmb3IgcmVzZXQgKi8KKwlpZiAodXNiMmQwX2ludHJ1c2IgJiAweDA0KSB7CisJCS8qcHJpbnRmKCJ7VVNCIGRldmljZX0gLSByZXNldCBkZXRlY3RlZFxuIik7ICovCisKKwkJLypjb3B5IHVzYiBhZGRyZXNzIG9mIHplcm8sIG5lZWQgdG8gZG8gdGhpcyB3aGVuIHVzYiByZXNldCAqLworCQlzZXRfdmFsdWUgPSAwOworCX0KKworCWlmICh1c2IyZDBfaW50cnVzYiAmIDB4MDIpIHsKKwkJLypwcmludGYoIntVU0IgZGV2aWNlfSAtIHJlc3VtZSBkZXRlY3RlZFxuIik7ICovCisJfQorCisJaWYgKHVzYjJkMF9pbnRydXNiICYgMHgwMSkgeworCQkvKnByaW50Zigie1VTQiBkZXZpY2V9IC0gc3VzcGVuZCBkZXRlY3RlZFxuIik7ICovCisJfQorfQorCitpbnQgdXNiSW50KHZvaWQpCit7CisJLypNdXN0IHJlYWQgdGhlc2UgMiByZWdpc3RlcnMgYW5kIHVzZSB2YWx1ZXMgdG8gY2xlYXIgaW50ZXJydXB0cy4gIElmIHlvdQorCSAgIGRvIG5vdCByZWFkIHRoZW0gdGhlbiB0aGUgaW50ZXJydXB0IHdpbGwgbm90IGJlIGNsZWFyZWQuICBJZiB5b3UgZG8gbm90CisJICAgdXNlIHRoZSB2YXJpYWJsZSB0aGUgb3B0aW1pemVyIHdpbGwgbm90IGRvIGEgcmVhZC4gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCB1c2IyZDBfaW50cmluID0KKwkgICAgKih1bnNpZ25lZCBzaG9ydCAqKVVTQjJEMF9JTlRSSU5fMTY7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciB1c2IyZDBfaW50cnVzYiA9CisJICAgICoodW5zaWduZWQgY2hhciAqKVVTQjJEMF9JTlRSVVNCXzg7CisKKwkvKmNoZWNrIGlmIHRoZXJlIHdhcyBhbiBlbmRwb2ludCBpbnRlcnJ1cHQgKi8KKwlpZiAodXNiMmQwX2ludHJpbiAhPSAwKSB7CisJCXByb2Nlc3NfZW5kcG9pbnRzKHVzYjJkMF9pbnRyaW4pOworCX0KKworCS8qY2hlY2sgZm9yIG90aGVyIGludGVycnVwdHMgKi8KKwlpZiAodXNiMmQwX2ludHJ1c2IgIT0gMCkgeworCQlwcm9jZXNzX290aGVyKHVzYjJkMF9pbnRydXNiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEVQWCkKK3ZvaWQgdXNiX2Rldl9pbml0KCkKK3sKKwlwcmludGYoIlVTQiAyLjAgRGV2aWNlIGluaXRcbiIpOworCisJLyp1c2IgZGV2IGluaXQgKi8KKwkqKHVuc2lnbmVkIGNoYXIgKilVU0IyRDBfUE9XRVJfOCA9IDB4YTE7CS8qIDIuMCAqLworCisJLyplbmFibGUgaW50ZXJydXB0cyAqLworCSoodW5zaWduZWQgY2hhciAqKVVTQjJEMF9JTlRSVVNCRV84ID0gMHgwZjsKKworCWlycV9pbnN0YWxsX2hhbmRsZXIoVkVDTlVNX1VTQkRFViwgKGludGVycnVwdF9oYW5kbGVyX3QgKikgdXNiSW50LAorCQkJICAgIE5VTEwpOworfQorI2Vsc2UKK3ZvaWQgdXNiX2Rldl9pbml0KCkKK3sKKyNpZmRlZiBVU0JfMl8wX0RFVklDRQorCXByaW50ZigiVVNCIDIuMCBEZXZpY2UgaW5pdFxuIik7CisJLypzZWxlY3QgMi4wIGRldmljZSAqLworCW10c2RyKFNEUjBfVVNCMCwgMHgwKTsJLyogMi4wICovCisKKwkvKnVzYiBkZXYgaW5pdCAqLworCSoodW5zaWduZWQgY2hhciAqKVVTQjJEMF9QT1dFUl84ID0gMHhhMTsJLyogMi4wICovCisjZWxzZQorCXByaW50ZigiVVNCIDEuMSBEZXZpY2UgaW5pdFxuIik7CisJLypzZWxlY3QgMS4xIGRldmljZSAqLworCW10c2RyKFNEUjBfVVNCMCwgMHgyKTsJLyogMS4xICovCisKKwkvKnVzYiBkZXYgaW5pdCAqLworCSoodW5zaWduZWQgY2hhciAqKVVTQjJEMF9QT1dFUl84ID0gMHhjMDsJLyogMS4xICovCisjZW5kaWYKKworCS8qZW5hYmxlIGludGVycnVwdHMgKi8KKwkqKHVuc2lnbmVkIGNoYXIgKilVU0IyRDBfSU5UUlVTQkVfOCA9IDB4MGY7CisKKwlpcnFfaW5zdGFsbF9oYW5kbGVyKFZFQ05VTV9VU0JERVYsIChpbnRlcnJ1cHRfaGFuZGxlcl90ICopIHVzYkludCwKKwkJCSAgICBOVUxMKTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQ09ORklHXzQ0MEVQIHx8IENPTkZJR180NDBFUFggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3VzYmRldi5oIGIvYXJjaC9wb3dlcnBjL2NwdS9wcGM0eHgvdXNiZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2YTJkYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3VzYmRldi5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLypDb21tb24gUmVnaXN0ZXJzKi8KKyNkZWZpbmUgVVNCMkQwX0lOVFJJTl8xNiAgIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwMCkKKyNkZWZpbmUgVVNCMkQwX1BPV0VSXzggICAgIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwMikKKyNkZWZpbmUgVVNCMkQwX0ZBRERSXzggICAgIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwMykKKyNkZWZpbmUgVVNCMkQwX0lOVFJJTkVfMTYgIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwNCkKKyNkZWZpbmUgVVNCMkQwX0lOVFJPVVRfMTYgIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwNikKKyNkZWZpbmUgVVNCMkQwX0lOVFJVU0JFXzggIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwOCkKKyNkZWZpbmUgVVNCMkQwX0lOVFJVU0JfOCAgIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwOSkKKyNkZWZpbmUgVVNCMkQwX0lOVFJPVVRFXzE2IChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwYSkKKyNkZWZpbmUgVVNCMkQwX1RTVE1PREVfOCAgIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwYykKKyNkZWZpbmUgVVNCMkQwX0lOREVYXzggICAgIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwZCkKKyNkZWZpbmUgVVNCMkQwX0ZSQU1FXzE2ICAgIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEwZSkKKworLypJbmRleGVkIFJlZ2lzdGVycyovCisjZGVmaW5lIFVTQjJEMF9JTkNTUjBfOCAgICAoQ09ORklHX1NZU19VU0JfREVWSUNFIHwgMHgxMTApCisjZGVmaW5lIFVTQjJEMF9JTkNTUl8xNiAgICAoQ09ORklHX1NZU19VU0JfREVWSUNFIHwgMHgxMTApCisjZGVmaW5lIFVTQjJEMF9JTk1BWFBfMTYgICAoQ09ORklHX1NZU19VU0JfREVWSUNFIHwgMHgxMTIpCisjZGVmaW5lIFVTQjJEMF9PVVRDU1JfMTYgICAoQ09ORklHX1NZU19VU0JfREVWSUNFIHwgMHgxMTQpCisjZGVmaW5lIFVTQjJEMF9PVVRNQVhQXzE2ICAoQ09ORklHX1NZU19VU0JfREVWSUNFIHwgMHgxMTYpCisjZGVmaW5lIFVTQjJEMF9PVVRDT1VOVDBfOCAoQ09ORklHX1NZU19VU0JfREVWSUNFIHwgMHgxMWEpCisjZGVmaW5lIFVTQjJEMF9PVVRDT1VOVF8xNiAoQ09ORklHX1NZU19VU0JfREVWSUNFIHwgMHgxMWEpCisKKy8qRklGT3MqLworI2RlZmluZSBVU0IyRDBfRklGT18wIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEyMCkKKyNkZWZpbmUgVVNCMkQwX0ZJRk9fMSAoQ09ORklHX1NZU19VU0JfREVWSUNFIHwgMHgxMjQpCisjZGVmaW5lIFVTQjJEMF9GSUZPXzIgKENPTkZJR19TWVNfVVNCX0RFVklDRSB8IDB4MTI4KQorI2RlZmluZSBVU0IyRDBfRklGT18zIChDT05GSUdfU1lTX1VTQl9ERVZJQ0UgfCAweDEyYykKKwordm9pZCB1c2JfZGV2X2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC94aWxpbnhfaXJxLmMgYi9hcmNoL3Bvd2VycGMvY3B1L3BwYzR4eC94aWxpbnhfaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwODc3NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvcHBjNHh4L3hpbGlueF9pcnEuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOAorICogUmljYWRvIFJpYmFsZGEtVW5pdmVyc2lkYWQgQXV0b25vbWEgZGUgTWFkcmlkLXJpY2FyZG8ucmliYWxkYUB1YW0uZXMKKyAqIFRoaXMgd29yayBoYXMgYmVlbiBzdXBwb3J0ZWQgYnk6IFFUZWNobm9sb2d5ICBodHRwOi8vcXRlYy5jb20vCisgKiBCYXNlZCBvbiBpbnRlcnJ1cHRzLmMgV29sZmdhbmcgRGVuay1ERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLXdkQGRlbnguZGUKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8cHBjNHh4Lmg+CisjaW5jbHVkZSA8cHBjX2FzbS50bXBsPgorI2luY2x1ZGUgPGNvbW1wcm9jLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3hpbGlueF9pcnEuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK3ZvaWQgcGljX2VuYWJsZSh2b2lkKQoreworCWRlYnVnKCJYaWxpbnggUElDIGF0IDB4JTh4XG4iLCBpbnRjKTsKKworCS8qCisJICogRGlzYWJsZSBhbGwgZXh0ZXJuYWwgaW50ZXJydXB0cyB1bnRpbCB0aGV5IGFyZQorCSAqIGV4cGxpY2l0bHkgcmVxdWVzdGVkLgorCSAqLworCW91dF9iZTMyKCh1MzIgKikgSUVSLCAwKTsKKworCS8qIEFja25vd2xlZGdlIGFueSBwZW5kaW5nIGludGVycnVwdHMganVzdCBpbiBjYXNlLiAqLworCW91dF9iZTMyKCh1MzIgKikgSUFSLCAweGZmZmZmZmZmKTsKKworCS8qIFR1cm4gb24gdGhlIE1hc3RlciBFbmFibGUuICovCisJb3V0X2JlMzIoKHUzMiAqKSBNRVIsIDB4M1VMKTsKKworCXJldHVybjsKK30KKworaW50IHhpbGlueF9waWNfaXJxX2dldCh2b2lkKQoreworCXUzMiBpcnE7CisJaXJxID0gaW5fYmUzMigodTMyICopIElWUik7CisKKwkvKiBJZiBubyBpbnRlcnJ1cHQgaXMgcGVuZGluZyB0aGVuIGFsbCBiaXRzIG9mIHRoZSBJVlIgYXJlIHNldCB0byAxLiBBcworCSAqIHRoZSBJVlIgaXMgYXMgbWFueSBiaXRzIHdpZGUgYXMgbnVtYmVycyBvZiBpbnB1dHMgYXJlIGF2YWlsYWJsZS4KKwkgKiBUaGVyZWZvcmUsIGlmIGFsbCBiaXRzIG9mIHRoZSBJVlIgYXJlIHNldCB0byBvbmUsIGl0cyBjb250ZW50IHdpbGwKKwkgKiBiZSBiaWdnZXIgdGhhbiBYUEFSX0lOVENfTUFYX05VTV9JTlRSX0lOUFVUUy4KKwkgKi8KKwlpZiAoaXJxID49IFhQQVJfSU5UQ19NQVhfTlVNX0lOVFJfSU5QVVRTKQorCQlpcnEgPSAtMTsJLyogcmVwb3J0IG5vIHBlbmRpbmcgaW50ZXJydXB0LiAqLworCisJZGVidWcoImdldF9pcnE6ICVkXG4iLCBpcnEpOworCXJldHVybiAoaXJxKTsKK30KKwordm9pZCBwaWNfaXJxX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUzMiBtYXNrID0gSVJRX01BU0soaXJxKTsKKwlkZWJ1ZygiZW5hYmxlOiAlZFxuIiwgaXJxKTsKKwlvdXRfYmUzMigodTMyICopIFNJRSwgbWFzayk7Cit9CisKK3ZvaWQgcGljX2lycV9kaXNhYmxlKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTMyIG1hc2sgPSBJUlFfTUFTSyhpcnEpOworCWRlYnVnKCJkaXNhYmxlOiAlZFxuIiwgaXJxKTsKKwlvdXRfYmUzMigodTMyICopIENJRSwgbWFzayk7Cit9CisKK3ZvaWQgcGljX2lycV9hY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MzIgbWFzayA9IElSUV9NQVNLKGlycSk7CisJZGVidWcoImFjazogJWRcbiIsIGlycSk7CisJb3V0X2JlMzIoKHUzMiAqKSBJQVIsIG1hc2spOworfQorCit2b2lkIGV4dGVybmFsX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaXJxOworCisJaXJxID0geGlsaW54X3BpY19pcnFfZ2V0KCk7CisJaWYgKGlycSA8IDApCisJCXJldHVybjsKKworCWludGVycnVwdF9ydW5faGFuZGxlcihpcnEpOworCisJcmV0dXJuOworfQo=