LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIEZJWE1FOiB3ZSB1c2UgcmVhZHx3cml0ZSBhY2Nlc3MgaW4gYWxsIGNhc2VzLiBTaG91bGRuJ3Qgd2UgZGVwZW5kIHRoYXQKICogb24gdGhlIGFjY2VzcyBvZiB0aGUgY3VycmVudCBoYW5kbGU/CiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmZGVmIEhBVkVfU1lTX0VSUk5PX0gKIyBpbmNsdWRlIDxzeXMvZXJybm8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnNvY2syLmgiCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJoYW5kbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgoKc3RydWN0IHNvY2sKewogICAgc3RydWN0IG9iamVjdCAgICAgICBvYmo7ICAgICAgICAgLyogb2JqZWN0IGhlYWRlciAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBzdGF0ZTsgICAgICAgLyogc3RhdHVzIGJpdHMgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgbWFzazsgICAgICAgIC8qIGV2ZW50IG1hc2sgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgaG1hc2s7ICAgICAgIC8qIGhlbGQgKGJsb2NrZWQpIGV2ZW50cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBwbWFzazsgICAgICAgLyogcGVuZGluZyBldmVudHMgKi8KICAgIHN0cnVjdCBldmVudCAgICAgICAqZXZlbnQ7ICAgICAgIC8qIGV2ZW50IG9iamVjdCAqLwogICAgaW50ICAgICAgICAgICAgICAgICBlcnJvcnNbRkRfTUFYX0VWRU5UU107IC8qIGV2ZW50IGVycm9ycyAqLwp9OwoKc3RhdGljIHZvaWQgc29ja19kdW1wKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICk7CnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKc3RhdGljIGludCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyB2b2lkIHNvY2tfcG9sbF9ldmVudCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgZXZlbnQgKTsKc3RhdGljIGludCBzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyB2b2lkIHNvY2tfZGVzdHJveSggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyBpbnQgc29ja19nZXRfZXJyb3IoIGludCBlcnIgKTsKc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgc29ja19vcHMgPQp7CiAgICBzaXplb2Yoc3RydWN0IHNvY2spLCAgICAgICAgICAvKiBzaXplICovCiAgICBzb2NrX2R1bXAsICAgICAgICAgICAgICAgICAgICAvKiBkdW1wICovCiAgICBhZGRfcXVldWUsICAgICAgICAgICAgICAgICAgICAvKiBhZGRfcXVldWUgKi8KICAgIHJlbW92ZV9xdWV1ZSwgICAgICAgICAgICAgICAgIC8qIHJlbW92ZV9xdWV1ZSAqLwogICAgc29ja19zaWduYWxlZCwgICAgICAgICAgICAgICAgLyogc2lnbmFsZWQgKi8KICAgIG5vX3NhdGlzZmllZCwgICAgICAgICAgICAgICAgIC8qIHNhdGlzZmllZCAqLwogICAgc29ja19nZXRfcG9sbF9ldmVudHMsICAgICAgICAgLyogZ2V0X3BvbGxfZXZlbnRzICovCiAgICBzb2NrX3BvbGxfZXZlbnQsICAgICAgICAgICAgICAvKiBwb2xsX2V2ZW50ICovCiAgICBzb2NrX2dldF9mZCwgICAgICAgICAgICAgICAgICAvKiBnZXRfZmQgKi8KICAgIG5vX2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoICovCiAgICBub19nZXRfZmlsZV9pbmZvLCAgICAgICAgICAgICAvKiBnZXRfZmlsZV9pbmZvICovCiAgICBzb2NrX2Rlc3Ryb3kgICAgICAgICAgICAgICAgICAvKiBkZXN0cm95ICovCn07CgpzdGF0aWMgdm9pZCBzb2NrX3Jlc2VsZWN0KCBzdHJ1Y3Qgc29jayAqc29jayApCnsKICAgIGludCBldiA9IHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCAmc29jay0+b2JqICk7CiAgICBzdHJ1Y3QgcG9sbGZkIHBmZDsKCiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tfcmVzZWxlY3QoJWQpOiBuZXcgbWFzayAleFxuIiwgc29jay0+b2JqLmZkLCBldik7CgogICAgaWYgKHNvY2stPm9iai5zZWxlY3QgPT0gLTEpIHsKICAgICAgICAvKiBwcmV2aW91c2x5IHVuY29ubmVjdGVkIHNvY2tldCwgaXMgdGhpcyByZXNlbGVjdCBzdXBwb3NlZCB0byBjb25uZWN0IGl0PyAqLwogICAgICAgIGlmICghc29jay0+c3RhdGUpIHJldHVybjsKICAgICAgICAvKiBvaywgaXQgaXMsIGF0dGFjaCBpdCB0byB0aGUgd2luZXNlcnZlcidzIG1haW4gcG9sbCBsb29wICovCiAgICAgICAgYWRkX3NlbGVjdF91c2VyKCAmc29jay0+b2JqICk7CiAgICB9CiAgICAvKiB1cGRhdGUgY29uZGl0aW9uIG1hc2sgKi8KICAgIHNldF9zZWxlY3RfZXZlbnRzKCAmc29jay0+b2JqLCBldiApOwoKICAgIC8qIGNoZWNrIHdoZXRoZXIgY29uZGl0aW9uIGlzIHNhdGlzZmllZCBhbHJlYWR5ICovCiAgICBwZmQuZmQgPSBzb2NrLT5vYmouZmQ7CiAgICBwZmQuZXZlbnRzID0gZXY7CiAgICBwZmQucmV2ZW50cyA9IDA7CiAgICBwb2xsKCAmcGZkLCAxLCAwICk7CiAgICBpZiAocGZkLnJldmVudHMpCiAgICAgICAgc29ja19wb2xsX2V2ZW50KCAmc29jay0+b2JqLCBwZmQucmV2ZW50cyk7Cn0KCmlubGluZSBzdGF0aWMgaW50IHNvY2tfZXJyb3IoaW50IHMpCnsKICAgIHVuc2lnbmVkIGludCBvcHR2YWwgPSAwLCBvcHRsZW47CiAgICAKICAgIG9wdGxlbiA9IHNpemVvZihvcHR2YWwpOwogICAgZ2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKHZvaWQgKikgJm9wdHZhbCwgJm9wdGxlbik7CiAgICByZXR1cm4gb3B0dmFsID8gc29ja19nZXRfZXJyb3Iob3B0dmFsKSA6IDA7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfcG9sbF9ldmVudCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgZXZlbnQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIHVuc2lnbmVkIGludCBlbWFzazsKICAgIGFzc2VydCggc29jay0+b2JqLm9wcyA9PSAmc29ja19vcHMgKTsKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBzZWxlY3QgZXZlbnQ6ICV4XG4iLCBzb2NrLT5vYmouZmQsIGV2ZW50KTsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0NPTk5FQ1QpCiAgICB7CiAgICAgICAgLyogY29ubmVjdGluZyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExPVVQpCiAgICAgICAgewogICAgICAgICAgICAvKiB3ZSBnb3QgY29ubmVjdGVkICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlIHw9IFdTX0ZEX0NPTk5FQ1RFRHxXU19GRF9SRUFEfFdTX0ZEX1dSSVRFOwogICAgICAgICAgICBzb2NrLT5zdGF0ZSAmPSB+V1NfRkRfQ09OTkVDVDsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQ09OTkVDVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NPTk5FQ1RfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGNvbm5lY3Rpb24gc3VjY2Vzc1xuIiwgc29jay0+b2JqLmZkKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXZlbnQgJiAoUE9MTEVSUnxQT0xMSFVQKSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGRpZG4ndCBnZXQgY29ubmVjdGVkPyAqLwogICAgICAgICAgICBzb2NrLT5zdGF0ZSAmPSB+V1NfRkRfQ09OTkVDVDsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQ09OTkVDVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NPTk5FQ1RfQklUXSA9IHNvY2tfZXJyb3IoIHNvY2stPm9iai5mZCApOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBjb25uZWN0aW9uIGZhaWx1cmVcbiIsIHNvY2stPm9iai5mZCk7CiAgICAgICAgfQogICAgfSBlbHNlCiAgICBpZiAoc29jay0+c3RhdGUgJiBXU19GRF9MSVNURU5JTkcpCiAgICB7CiAgICAgICAgLyogbGlzdGVuaW5nICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTElOKQogICAgICAgIHsKICAgICAgICAgICAgLyogaW5jb21pbmcgY29ubmVjdGlvbiAqLwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9BQ0NFUFRfQklUXSA9IDA7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXZlbnQgJiAoUE9MTEVSUnxQT0xMSFVQKSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIGZhaWxlZCBpbmNvbWluZyBjb25uZWN0aW9uPyAqLwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9BQ0NFUFRfQklUXSA9IHNvY2tfZXJyb3IoIHNvY2stPm9iai5mZCApOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgfQogICAgfSBlbHNlCiAgICB7CiAgICAgICAgLyogbm9ybWFsIGRhdGEgZmxvdyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExJTikKICAgICAgICB7CiAgICAgICAgICAgIC8qIGluY29taW5nIGRhdGEgKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfUkVBRDsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfUkVBRDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1JFQURfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGlzIHJlYWRhYmxlXG4iLCBzb2NrLT5vYmouZmQgKTsKICAgICAgICB9CiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1dSSVRFOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9XUklURTsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1dSSVRFX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBpcyB3cml0YWJsZVxuIiwgc29jay0+b2JqLmZkKTsKICAgICAgICB9CiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTFBSSSkKICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX09PQjsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfT09COwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfT09CX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBnb3QgT09CIGRhdGFcbiIsIHNvY2stPm9iai5mZCk7CiAgICAgICAgfQogICAgICAgIGlmICgoKGV2ZW50ICYgUE9MTEVSUikgfHwgKChldmVudCAmIChQT0xMSU58UE9MTEhVUCkpID09IFBPTExIVVApKQogICAgICAgICAgICAmJiAoc29jay0+c3RhdGUgJiAoV1NfRkRfUkVBRHxXU19GRF9XUklURSkpKSB7CiAgICAgICAgICAgIC8qIHNvY2tldCBjbG9zaW5nICovCiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DTE9TRV9CSVRdID0gc29ja19lcnJvciggc29jay0+b2JqLmZkICk7CiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH4oV1NfRkRfQ09OTkVDVEVEfFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEUpOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DTE9TRTsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgYWJvcnRlZCBieSBlcnJvciAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc29jay0+b2JqLmZkLCBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHNldF9zZWxlY3RfZXZlbnRzKCAmc29jay0+b2JqLCAtMSApOwogICAgZWxzZQogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIC8qIHdha2UgdXAgYW55b25lIHdhaXRpbmcgZm9yIHdoYXRldmVyIGp1c3QgaGFwcGVuZWQgKi8KICAgIGVtYXNrID0gc29jay0+cG1hc2sgJiBzb2NrLT5tYXNrOwogICAgaWYgKGRlYnVnX2xldmVsICYmIGVtYXNrKQogICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIHBlbmRpbmcgZXZlbnRzOiAleFxuIiwgc29jay0+b2JqLmZkLCBlbWFzayk7CiAgICBpZiAoZW1hc2sgJiYgc29jay0+ZXZlbnQpIHsKICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYoc3RkZXJyLCAic2lnbmFsbGluZyBldmVudCBwdHIgJXBcbiIsIHNvY2stPmV2ZW50KTsKICAgICAgICBzZXRfZXZlbnQoc29jay0+ZXZlbnQpOwogICAgfQoKICAgIC8qIGlmIGFueW9uZSBpcyBzdHVwaWQgZW5vdWdoIHRvIHdhaXQgb24gdGhlIHNvY2tldCBvYmplY3QgaXRzZWxmLAogICAgICogbWF5YmUgd2Ugc2hvdWxkIHdha2UgdGhlbSB1cCB0b28sIGp1c3QgaW4gY2FzZT8gKi8KICAgIHdha2VfdXAoICZzb2NrLT5vYmosIDAgKTsKfQoKc3RhdGljIHZvaWQgc29ja19kdW1wKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwogICAgcHJpbnRmKCAiU29ja2V0IGZkPSVkLCBzdGF0ZT0leCwgbWFzaz0leCwgcGVuZGluZz0leCwgaGVsZD0leFxuIiwKICAgICAgICAgICAgc29jay0+b2JqLmZkLCBzb2NrLT5zdGF0ZSwKICAgICAgICAgICAgc29jay0+bWFzaywgc29jay0+cG1hc2ssIHNvY2stPmhtYXNrICk7Cn0KCnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgcmV0dXJuIGNoZWNrX3NlbGVjdF9ldmVudHMoIHNvY2stPm9iai5mZCwgc29ja19nZXRfcG9sbF9ldmVudHMoICZzb2NrLT5vYmogKSApOwp9CgpzdGF0aWMgaW50IHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIHVuc2lnbmVkIGludCBtYXNrID0gc29jay0+bWFzayAmIHNvY2stPnN0YXRlICYgfnNvY2stPmhtYXNrOwogICAgaW50IGV2ID0gMDsKCiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0NPTk5FQ1QpCiAgICAgICAgLyogY29ubmVjdGluZywgd2FpdCBmb3Igd3JpdGFibGUgKi8KICAgICAgICByZXR1cm4gUE9MTE9VVDsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0xJU1RFTklORykKICAgICAgICAvKiBsaXN0ZW5pbmcsIHdhaXQgZm9yIHJlYWRhYmxlICovCiAgICAgICAgcmV0dXJuIChzb2NrLT5obWFzayAmIEZEX0FDQ0VQVCkgPyAwIDogUE9MTElOOwoKICAgIGlmIChtYXNrICYgRkRfUkVBRCkgIGV2IHw9IFBPTExJTiB8IFBPTExQUkk7CiAgICBpZiAobWFzayAmIEZEX1dSSVRFKSBldiB8PSBQT0xMT1VUOwogICAgcmV0dXJuIGV2Owp9CgpzdGF0aWMgaW50IHNvY2tfZ2V0X2ZkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICByZXR1cm4gc29jay0+b2JqLmZkOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2Rlc3Ryb3koIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICAvKiBGSVhNRTogc3BlY2lhbCBzb2NrZXQgc2h1dGRvd24gc3R1ZmY/ICovCiAgICBpZiAoc29jay0+ZXZlbnQpCiAgICB7CiAgICAgICAgLyogaWYgdGhlIHNlcnZpY2UgdGhyZWFkIHdhcyB3YWl0aW5nIGZvciB0aGUgZXZlbnQgb2JqZWN0LAogICAgICAgICAqIHdlIHNob3VsZCBub3cgc2lnbmFsIGl0LCB0byBsZXQgdGhlIHNlcnZpY2UgdGhyZWFkCiAgICAgICAgICogb2JqZWN0IGRldGVjdCB0aGF0IGl0IGlzIG5vdyBvcnBoYW5lZC4uLiAqLwogICAgICAgIGlmIChzb2NrLT5tYXNrICYgV1NfRkRfU0VSVkVWRU5UKQogICAgICAgICAgICBzZXRfZXZlbnQoIHNvY2stPmV2ZW50ICk7CiAgICAgICAgLyogd2UncmUgdGhyb3VnaCB3aXRoIGl0ICovCiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2stPmV2ZW50ICk7CiAgICB9Cn0KCi8qIGNyZWF0ZSBhIG5ldyBhbmQgdW5jb25uZWN0ZWQgc29ja2V0ICovCnN0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICpjcmVhdGVfc29ja2V0KCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sICkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBpbnQgc29ja2ZkOwoKICAgIHNvY2tmZCA9IHNvY2tldCggZmFtaWx5LCB0eXBlLCBwcm90b2NvbCApOwogICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgIGZwcmludGYoc3RkZXJyLCJzb2NrZXQoJWQsJWQsJWQpPSVkXG4iLGZhbWlseSx0eXBlLHByb3RvY29sLHNvY2tmZCk7CiAgICBpZiAoc29ja2ZkID09IC0xKSB7CiAgICAgICAgc29ja19zZXRfZXJyb3IoKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGZjbnRsKHNvY2tmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7IC8qIG1ha2Ugc29ja2V0IG5vbmJsb2NraW5nICovCiAgICBpZiAoIShzb2NrID0gYWxsb2Nfb2JqZWN0KCAmc29ja19vcHMsIC0xICkpKSByZXR1cm4gTlVMTDsKICAgIHNvY2stPm9iai5mZCA9IHNvY2tmZDsKICAgIHNvY2stPnN0YXRlID0gKHR5cGUgIT0gU09DS19TVFJFQU0pID8gKFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEUpIDogMDsKICAgIHNvY2stPm1hc2sgID0gMDsKICAgIHNvY2stPmhtYXNrID0gMDsKICAgIHNvY2stPnBtYXNrID0gMDsKICAgIHNvY2stPmV2ZW50ID0gTlVMTDsKICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGNsZWFyX2Vycm9yKCk7CiAgICByZXR1cm4gJnNvY2stPm9iajsKfQoKLyogYWNjZXB0IGEgc29ja2V0IChjcmVhdGVzIGEgbmV3IGZkKSAqLwpzdGF0aWMgc3RydWN0IG9iamVjdCAqYWNjZXB0X3NvY2tldCggaW50IGhhbmRsZSApCnsKICAgIHN0cnVjdCBzb2NrICphY2NlcHRzb2NrOwogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBpbnQJYWNjZXB0ZmQ7CiAgICBzdHJ1Y3Qgc29ja2FkZHIJc2FkZHI7CiAgICBpbnQJCQlzbGVuOwoKICAgIHNvY2s9KHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaihjdXJyZW50LT5wcm9jZXNzLGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgCXJldHVybiBOVUxMOwogICAgLyogVHJ5IHRvIGFjY2VwdCgyKS4gV2UgY2FuJ3QgYmUgc2FmZSB0aGF0IHRoaXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0IAogICAgICogb3IgdGhhdCBhY2NlcHQoKSBpcyBhbGxvd2VkIG9uIGl0LiBJbiB0aG9zZSBjYXNlcyB3ZSB3aWxsIGdldCAtMS9lcnJubwogICAgICogcmV0dXJuLgogICAgICovCiAgICBzbGVuID0gc2l6ZW9mKHNhZGRyKTsKICAgIGFjY2VwdGZkID0gYWNjZXB0KHNvY2stPm9iai5mZCwmc2FkZHIsJnNsZW4pOwogICAgaWYgKGFjY2VwdGZkPT0tMSkgewogICAgCXNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKCXJldHVybiBOVUxMOwogICAgfQogICAgaWYgKCEoYWNjZXB0c29jayA9IGFsbG9jX29iamVjdCggJnNvY2tfb3BzLCAtMSApKSkKICAgIHsKICAgICAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIG5ld2x5IGNyZWF0ZWQgc29ja2V0IGdldHMgdGhlIHNhbWUgcHJvcGVydGllcyBvZiB0aGUgbGlzdGVuaW5nIHNvY2tldCAqLwogICAgZmNudGwoYWNjZXB0ZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOyAvKiBtYWtlIHNvY2tldCBub25ibG9ja2luZyAqLwogICAgYWNjZXB0c29jay0+b2JqLmZkID0gYWNjZXB0ZmQ7CiAgICBhY2NlcHRzb2NrLT5zdGF0ZSAgPSBXU19GRF9DT05ORUNURUR8V1NfRkRfUkVBRHxXU19GRF9XUklURTsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX05PTkJMT0NLSU5HKQogICAgICAgIGFjY2VwdHNvY2stPnN0YXRlIHw9IFdTX0ZEX05PTkJMT0NLSU5HOyAKICAgIGFjY2VwdHNvY2stPm1hc2sgICA9IHNvY2stPm1hc2s7CiAgICBhY2NlcHRzb2NrLT5obWFzayAgPSAwOwogICAgYWNjZXB0c29jay0+cG1hc2sgID0gMDsKICAgIGFjY2VwdHNvY2stPmV2ZW50ICA9IE5VTEw7CiAgICBpZiAoc29jay0+ZXZlbnQgJiYgIShzb2NrLT5tYXNrICYgV1NfRkRfU0VSVkVWRU5UKSkKICAgICAgICBhY2NlcHRzb2NrLT5ldmVudCA9IChzdHJ1Y3QgZXZlbnQgKilncmFiX29iamVjdCggc29jay0+ZXZlbnQgKTsKCiAgICBzb2NrX3Jlc2VsZWN0KCBhY2NlcHRzb2NrICk7CiAgICBjbGVhcl9lcnJvcigpOwogICAgc29jay0+cG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2stPmhtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgcmV0dXJuICZhY2NlcHRzb2NrLT5vYmo7Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApCnsKICAgIHN3aXRjaCAoZXJyKQogICAgewogICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAgICAgIHJldHVybiBXU0FFSU5UUjsgYnJlYWs7CiAgICAgICAgY2FzZSBFQkFERjogICAgICAgICAgICAgcmV0dXJuIFdTQUVCQURGOyBicmVhazsKICAgICAgICBjYXNlIEVQRVJNOgogICAgICAgIGNhc2UgRUFDQ0VTOiAgICAgICAgICAgIHJldHVybiBXU0FFQUNDRVM7IGJyZWFrOwogICAgICAgIGNhc2UgRUZBVUxUOiAgICAgICAgICAgIHJldHVybiBXU0FFRkFVTFQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUlOVkFMOiAgICAgICAgICAgIHJldHVybiBXU0FFSU5WQUw7IGJyZWFrOwogICAgICAgIGNhc2UgRU1GSUxFOiAgICAgICAgICAgIHJldHVybiBXU0FFTUZJTEU7IGJyZWFrOwogICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAgICAgIHJldHVybiBXU0FFV09VTERCTE9DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSU5QUk9HUkVTUzogICAgICAgcmV0dXJuIFdTQUVJTlBST0dSRVNTOyBicmVhazsKICAgICAgICBjYXNlIEVBTFJFQURZOiAgICAgICAgICByZXR1cm4gV1NBRUFMUkVBRFk7IGJyZWFrOwogICAgICAgIGNhc2UgRU5PVFNPQ0s6ICAgICAgICAgIHJldHVybiBXU0FFTk9UU09DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFREVTVEFERFJSRVE6ICAgICAgcmV0dXJuIFdTQUVERVNUQUREUlJFUTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTVNHU0laRTogICAgICAgICAgcmV0dXJuIFdTQUVNU0dTSVpFOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT1RZUEU6ICAgICAgICByZXR1cm4gV1NBRVBST1RPVFlQRTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9QUk9UT09QVDogICAgICAgcmV0dXJuIFdTQUVOT1BST1RPT1BUOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT05PU1VQUE9SVDogICByZXR1cm4gV1NBRVBST1RPTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVTT0NLVE5PU1VQUE9SVDogICByZXR1cm4gV1NBRVNPQ0tUTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVPUE5PVFNVUFA6ICAgICAgICByZXR1cm4gV1NBRU9QTk9UU1VQUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUEZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVQRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVBRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUREUklOVVNFOiAgICAgICAgcmV0dXJuIFdTQUVBRERSSU5VU0U7IGJyZWFrOwogICAgICAgIGNhc2UgRUFERFJOT1RBVkFJTDogICAgIHJldHVybiBXU0FFQUREUk5PVEFWQUlMOyBicmVhazsKICAgICAgICBjYXNlIEVORVRET1dOOiAgICAgICAgICByZXR1cm4gV1NBRU5FVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRU5FVFVOUkVBQ0g6ICAgICAgIHJldHVybiBXU0FFTkVUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkVUUkVTRVQ6ICAgICAgICAgcmV0dXJuIFdTQUVORVRSRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQ09OTkFCT1JURUQ6ICAgICAgcmV0dXJuIFdTQUVDT05OQUJPUlRFRDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUElQRToKICAgICAgICBjYXNlIEVDT05OUkVTRVQ6ICAgICAgICByZXR1cm4gV1NBRUNPTk5SRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9CVUZTOiAgICAgICAgICAgcmV0dXJuIFdTQUVOT0JVRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRUlTQ09OTjogICAgICAgICAgIHJldHVybiBXU0FFSVNDT05OOyBicmVhazsKICAgICAgICBjYXNlIEVOT1RDT05OOiAgICAgICAgICByZXR1cm4gV1NBRU5PVENPTk47IGJyZWFrOwogICAgICAgIGNhc2UgRVNIVVRET1dOOiAgICAgICAgIHJldHVybiBXU0FFU0hVVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRVRPT01BTllSRUZTOiAgICAgIHJldHVybiBXU0FFVE9PTUFOWVJFRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAgICAgIHJldHVybiBXU0FFVElNRURPVVQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUNPTk5SRUZVU0VEOiAgICAgIHJldHVybiBXU0FFQ09OTlJFRlVTRUQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUxPT1A6ICAgICAgICAgICAgIHJldHVybiBXU0FFTE9PUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkFNRVRPT0xPTkc6ICAgICAgcmV0dXJuIFdTQUVOQU1FVE9PTE9ORzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVERPV046ICAgICAgICAgcmV0dXJuIFdTQUVIT1NURE9XTjsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVFVOUkVBQ0g6ICAgICAgcmV0dXJuIFdTQUVIT1NUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9URU1QVFk6ICAgICAgICAgcmV0dXJuIFdTQUVOT1RFTVBUWTsgYnJlYWs7CiNpZmRlZiBFUFJPQ0xJTQogICAgICAgIGNhc2UgRVBST0NMSU06ICAgICAgICAgIHJldHVybiBXU0FFUFJPQ0xJTTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVVTRVJTCiAgICAgICAgY2FzZSBFVVNFUlM6ICAgICAgICAgICAgcmV0dXJuIFdTQUVVU0VSUzsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRURRVU9UCiAgICAgICAgY2FzZSBFRFFVT1Q6ICAgICAgICAgICAgcmV0dXJuIFdTQUVEUVVPVDsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVNUQUxFCiAgICAgICAgY2FzZSBFU1RBTEU6ICAgICAgICAgICAgcmV0dXJuIFdTQUVTVEFMRTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVJFTU9URQogICAgICAgIGNhc2UgRVJFTU9URTogICAgICAgICAgIHJldHVybiBXU0FFUkVNT1RFOyBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OiBlcnJubz1lcnI7IHBlcnJvcigic29ja19zZXRfZXJyb3IiKTsgcmV0dXJuIEVSUk9SX1VOS05PV047IGJyZWFrOwogICAgfQp9CgovKiBzZXQgdGhlIGxhc3QgZXJyb3IgZGVwZW5kaW5nIG9uIGVycm5vICovCnN0YXRpYyB2b2lkIHNvY2tfc2V0X2Vycm9yKHZvaWQpCnsKICAgIHNldF9lcnJvciggc29ja19nZXRfZXJyb3IoIGVycm5vICkgKTsKfQoKLyogY3JlYXRlIGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihjcmVhdGVfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CiAgICBpbnQgcyA9IC0xOwoKICAgIGlmICgob2JqID0gY3JlYXRlX3NvY2tldCggcmVxLT5mYW1pbHksIHJlcS0+dHlwZSwgcmVxLT5wcm90b2NvbCApKSAhPSBOVUxMKQogICAgewogICAgICAgIHMgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIG9iaiwgcmVxLT5hY2Nlc3MsIHJlcS0+aW5oZXJpdCApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKICAgIH0KICAgIHJlcS0+aGFuZGxlID0gczsKfQoKLyogYWNjZXB0IGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihhY2NlcHRfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CiAgICBpbnQgcyA9IC0xOwoKICAgIGlmICgob2JqID0gYWNjZXB0X3NvY2tldCggcmVxLT5saGFuZGxlICkpICE9IE5VTEwpCiAgICB7CiAgICAgICAgcyA9IGFsbG9jX2hhbmRsZSggY3VycmVudC0+cHJvY2Vzcywgb2JqLCByZXEtPmFjY2VzcywgcmVxLT5pbmhlcml0ICk7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIG9iaiApOwogICAgfQogICAgcmVxLT5oYW5kbGUgPSBzOwp9CgovKiBzZXQgc29ja2V0IGV2ZW50IHBhcmFtZXRlcnMgKi8KREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgc3RydWN0IGV2ZW50ICpvZXZlbnQ7CiAgICB1bnNpZ25lZCBpbnQgb21hc2s7CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MscmVxLT5oYW5kbGUsR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzKTsKICAgIGlmICghc29jaykKCXJldHVybjsKICAgIG9ldmVudCA9IHNvY2stPmV2ZW50OwogICAgb21hc2sgID0gc29jay0+bWFzazsKICAgIHNvY2stPm1hc2sgICAgPSByZXEtPm1hc2s7CiAgICBzb2NrLT5ldmVudCAgID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5ldmVudCwgRVZFTlRfTU9ESUZZX1NUQVRFICk7CiAgICBpZiAoZGVidWdfbGV2ZWwgJiYgc29jay0+ZXZlbnQpIGZwcmludGYoc3RkZXJyLCAiZXZlbnQgcHRyOiAlcFxuIiwgc29jay0+ZXZlbnQpOwogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKHNvY2stPm1hc2spCiAgICAgICAgc29jay0+c3RhdGUgfD0gV1NfRkRfTk9OQkxPQ0tJTkc7CgogICAgLyogaWYgYSBuZXR3b3JrIGV2ZW50IGlzIHBlbmRpbmcsIHNpZ25hbCB0aGUgZXZlbnQgb2JqZWN0IAogICAgICAgaXQgaXMgcG9zc2libGUgdGhhdCBGRF9DT05ORUNUIG9yIEZEX0FDQ0VQVCBuZXR3b3JrIGV2ZW50cyBoYXMgaGFwcGVuZWQKICAgICAgIGJlZm9yZSBhIFdTQUV2ZW50U2VsZWN0KCkgd2FzIGRvbmUgb24gaXQuIAogICAgICAgKHdoZW4gZGVhbGluZyB3aXRoIEFzeW5jaHJvbm91cyBzb2NrZXQpICAqLwogICAgaWYgKHNvY2stPnBtYXNrICYgc29jay0+bWFzaykKICAgICAgICBzZXRfZXZlbnQoc29jay0+ZXZlbnQpOwogICAgCiAgICBpZiAob2V2ZW50KQogICAgewogICAgCWlmICgob2V2ZW50ICE9IHNvY2stPmV2ZW50KSAmJiAob21hc2sgJiBXU19GRF9TRVJWRVZFTlQpKQogICAgICAgICAgICAvKiBpZiB0aGUgc2VydmljZSB0aHJlYWQgd2FzIHdhaXRpbmcgZm9yIHRoZSBvbGQgZXZlbnQgb2JqZWN0LAogICAgICAgICAgICAgKiB3ZSBzaG91bGQgbm93IHNpZ25hbCBpdCwgdG8gbGV0IHRoZSBzZXJ2aWNlIHRocmVhZAogICAgICAgICAgICAgKiBvYmplY3QgZGV0ZWN0IHRoYXQgaXQgaXMgbm93IG9ycGhhbmVkLi4uICovCiAgICAgICAgICAgIHNldF9ldmVudCggb2V2ZW50ICk7CiAgICAgICAgLyogd2UncmUgdGhyb3VnaCB3aXRoIGl0ICovCiAgICAgICAgcmVsZWFzZV9vYmplY3QoIG9ldmVudCApOwogICAgfQogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogZ2V0IHNvY2tldCBldmVudCBwYXJhbWV0ZXJzICovCkRFQ0xfSEFORExFUihnZXRfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIHNpemVfdCBzaXplOwoKICAgIHNvY2s9KHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaihjdXJyZW50LT5wcm9jZXNzLHJlcS0+aGFuZGxlLEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyk7CiAgICBpZiAoIXNvY2spCiAgICB7CglyZXEtPm1hc2sgID0gMDsKCXJlcS0+cG1hc2sgPSAwOwoJcmVxLT5zdGF0ZSA9IDA7CglzZXRfZXJyb3IoV1NBRU5PVFNPQ0spOwoJcmV0dXJuOwogICAgfQogICAgcmVxLT5tYXNrICAgID0gc29jay0+bWFzazsKICAgIHJlcS0+cG1hc2sgICA9IHNvY2stPnBtYXNrOwogICAgcmVxLT5zdGF0ZSAgID0gc29jay0+c3RhdGU7CiAgICBzaXplID0gbWluKCBnZXRfcmVxX2RhdGFfc2l6ZShyZXEpLCBzaXplb2Yoc29jay0+ZXJyb3JzKSApOwogICAgbWVtY3B5KCBnZXRfcmVxX2RhdGEocmVxKSwgc29jay0+ZXJyb3JzLCBzaXplICk7CiAgICBzZXRfcmVxX2RhdGFfc2l6ZSggcmVxLCBzaXplICk7CgogICAgaWYgKHJlcS0+c2VydmljZSkKICAgIHsKICAgICAgICBpZiAocmVxLT5zX2V2ZW50KQogICAgICAgIHsKICAgICAgICAgICAgc3RydWN0IGV2ZW50ICpzZXZlbnQgPSBnZXRfZXZlbnRfb2JqKGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+c19ldmVudCwgMCk7CiAgICAgICAgICAgIGlmIChzZXZlbnQgPT0gc29jay0+ZXZlbnQpCiAgICAgICAgICAgICAgICByZXEtPnNfZXZlbnQgPSAwOwogICAgICAgICAgICByZWxlYXNlX29iamVjdCggc2V2ZW50ICk7CiAgICAgICAgfQogICAgICAgIGlmICghcmVxLT5zX2V2ZW50KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHJlcS0+Y19ldmVudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RydWN0IGV2ZW50ICpjZXZlbnQgPSBnZXRfZXZlbnRfb2JqKGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+Y19ldmVudCwgRVZFTlRfTU9ESUZZX1NUQVRFKTsKICAgICAgICAgICAgICAgIHJlc2V0X2V2ZW50KCBjZXZlbnQgKTsKICAgICAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBjZXZlbnQgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzb2NrLT5wbWFzayA9IDA7CiAgICAgICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBzZXRfZXJyb3IoV1NBRUlOVkFMKTsKICAgIH0KICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCi8qIHJlLWVuYWJsZSBwZW5kaW5nIHNvY2tldCBldmVudHMgKi8KREVDTF9IQU5ETEVSKGVuYWJsZV9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwoKICAgIHNvY2s9KHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaihjdXJyZW50LT5wcm9jZXNzLHJlcS0+aGFuZGxlLEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyk7CiAgICBpZiAoIXNvY2spCiAgICAJcmV0dXJuOwogICAgc29jay0+cG1hc2sgJj0gfnJlcS0+bWFzazsgLyogaXMgdGhpcyBzYWZlPyAqLwogICAgc29jay0+aG1hc2sgJj0gfnJlcS0+bWFzazsKICAgIHNvY2stPnN0YXRlIHw9IHJlcS0+c3N0YXRlOwogICAgc29jay0+c3RhdGUgJj0gfnJlcS0+Y3N0YXRlOwogICAgc29ja19yZXNlbGVjdCggc29jayApOwoKICAgIC8qIHNlcnZpY2UgdHJpZ2dlciAqLwogICAgaWYgKHJlcS0+bWFzayAmIFdTX0ZEX1NFUlZFVkVOVCkKICAgIHsKICAgICAgICBzb2NrLT5wbWFzayB8PSBXU19GRF9TRVJWRVZFTlQ7CiAgICAgICAgaWYgKHNvY2stPmV2ZW50KSB7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZihzdGRlcnIsICJzaWduYWxsaW5nIHNlcnZpY2UgZXZlbnQgcHRyICVwXG4iLCBzb2NrLT5ldmVudCk7CiAgICAgICAgICAgIHNldF9ldmVudChzb2NrLT5ldmVudCk7CiAgICAgICAgfQogICAgfQoKICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0K