LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBGSVhNRTogd2UgdXNlIHJlYWR8d3JpdGUgYWNjZXNzIGluIGFsbCBjYXNlcy4gU2hvdWxkbid0IHdlIGRlcGVuZCB0aGF0CiAqIG9uIHRoZSBhY2Nlc3Mgb2YgdGhlIGN1cnJlbnQgaGFuZGxlPwogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmZGVmIEhBVkVfU1lTX0VSUk5PX0gKIyBpbmNsdWRlIDxzeXMvZXJybm8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCgojaW5jbHVkZSAicHJvY2Vzcy5oIgojaW5jbHVkZSAiZmlsZS5oIgojaW5jbHVkZSAiaGFuZGxlLmgiCiNpbmNsdWRlICJ0aHJlYWQuaCIKI2luY2x1ZGUgInJlcXVlc3QuaCIKI2luY2x1ZGUgInVzZXIuaCIKI2luY2x1ZGUgImFzeW5jLmgiCgovKiBUbyBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgVW5peCBzb2NrZXQgaGVhZGVycy4gUGx1cyB3ZSBvbmx5IG5lZWQgYSBmZXcKICogbWFjcm9zIGFueXdheS4KICovCiNkZWZpbmUgVVNFX1dTX1BSRUZJWAojaW5jbHVkZSAid2luc29jazIuaCIKCnN0cnVjdCBzb2NrCnsKICAgIHN0cnVjdCBvYmplY3QgICAgICAgb2JqOyAgICAgICAgIC8qIG9iamVjdCBoZWFkZXIgKi8KICAgIHN0cnVjdCBmZCAgICAgICAgICAqZmQ7ICAgICAgICAgIC8qIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgc3RhdGU7ICAgICAgIC8qIHN0YXR1cyBiaXRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIG1hc2s7ICAgICAgICAvKiBldmVudCBtYXNrICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIGhtYXNrOyAgICAgICAvKiBoZWxkIChibG9ja2VkKSBldmVudHMgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgcG1hc2s7ICAgICAgIC8qIHBlbmRpbmcgZXZlbnRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIGZsYWdzOyAgICAgICAvKiBzb2NrZXQgZmxhZ3MgKi8KICAgIGludCAgICAgICAgICAgICAgICAgcG9sbGluZzsgICAgIC8qIGlzIHNvY2tldCBiZWluZyBwb2xsZWQ/ICovCiAgICB1bnNpZ25lZCBzaG9ydCAgICAgIHR5cGU7ICAgICAgICAvKiBzb2NrZXQgdHlwZSAqLwogICAgdW5zaWduZWQgc2hvcnQgICAgICBmYW1pbHk7ICAgICAgLyogc29ja2V0IGZhbWlseSAqLwogICAgc3RydWN0IGV2ZW50ICAgICAgICpldmVudDsgICAgICAgLyogZXZlbnQgb2JqZWN0ICovCiAgICB1c2VyX2hhbmRsZV90ICAgICAgIHdpbmRvdzsgICAgICAvKiB3aW5kb3cgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBtZXNzYWdlOyAgICAgLyogbWVzc2FnZSB0byBzZW5kICovCiAgICBvYmpfaGFuZGxlX3QgICAgICAgIHdwYXJhbTsgICAgICAvKiBtZXNzYWdlIHdwYXJhbSAoc29ja2V0IGhhbmRsZSkgKi8KICAgIGludCAgICAgICAgICAgICAgICAgZXJyb3JzW0ZEX01BWF9FVkVOVFNdOyAvKiBldmVudCBlcnJvcnMgKi8KICAgIHN0cnVjdCBzb2NrKiAgICAgICAgZGVmZXJyZWQ7ICAgIC8qIHNvY2tldCB0aGF0IHdhaXRzIGZvciBhIGRlZmVycmVkIGFjY2VwdCAqLwogICAgc3RydWN0IGFzeW5jX3F1ZXVlICByZWFkX3E7ICAgICAgLyogUXVldWUgZm9yIGFzeW5jaHJvbm91cyByZWFkcyAqLwogICAgc3RydWN0IGFzeW5jX3F1ZXVlICB3cml0ZV9xOyAgICAgLyogUXVldWUgZm9yIGFzeW5jaHJvbm91cyB3cml0ZXMgKi8KfTsKCnN0YXRpYyB2b2lkIHNvY2tfZHVtcCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApOwpzdGF0aWMgaW50IHNvY2tfc2lnbmFsZWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHRocmVhZCAqdGhyZWFkICk7CnN0YXRpYyBzdHJ1Y3QgZmQgKnNvY2tfZ2V0X2ZkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKCnN0YXRpYyBpbnQgc29ja19nZXRfcG9sbF9ldmVudHMoIHN0cnVjdCBmZCAqZmQgKTsKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3QgZmQgKmZkLCBpbnQgZXZlbnQgKTsKc3RhdGljIGludCBzb2NrX2dldF9pbmZvKCBzdHJ1Y3QgZmQgKmZkLCBpbnQgKmZsYWdzICk7CnN0YXRpYyB2b2lkIHNvY2tfcXVldWVfYXN5bmMoIHN0cnVjdCBmZCAqZmQsIHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IHN0YXR1cywgaW50IHR5cGUsIGludCBjb3VudCApOwoKc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApOwpzdGF0aWMgdm9pZCBzb2NrX3NldF9lcnJvcih2b2lkKTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2JqZWN0X29wcyBzb2NrX29wcyA9CnsKICAgIHNpemVvZihzdHJ1Y3Qgc29jayksICAgICAgICAgIC8qIHNpemUgKi8KICAgIHNvY2tfZHVtcCwgICAgICAgICAgICAgICAgICAgIC8qIGR1bXAgKi8KICAgIGFkZF9xdWV1ZSwgICAgICAgICAgICAgICAgICAgIC8qIGFkZF9xdWV1ZSAqLwogICAgcmVtb3ZlX3F1ZXVlLCAgICAgICAgICAgICAgICAgLyogcmVtb3ZlX3F1ZXVlICovCiAgICBzb2NrX3NpZ25hbGVkLCAgICAgICAgICAgICAgICAvKiBzaWduYWxlZCAqLwogICAgbm9fc2F0aXNmaWVkLCAgICAgICAgICAgICAgICAgLyogc2F0aXNmaWVkICovCiAgICBzb2NrX2dldF9mZCwgICAgICAgICAgICAgICAgICAvKiBnZXRfZmQgKi8KICAgIHNvY2tfZGVzdHJveSAgICAgICAgICAgICAgICAgIC8qIGRlc3Ryb3kgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZmRfb3BzIHNvY2tfZmRfb3BzID0KewogICAgc29ja19nZXRfcG9sbF9ldmVudHMsICAgICAgICAgLyogZ2V0X3BvbGxfZXZlbnRzICovCiAgICBzb2NrX3BvbGxfZXZlbnQsICAgICAgICAgICAgICAvKiBwb2xsX2V2ZW50ICovCiAgICBub19mbHVzaCwgICAgICAgICAgICAgICAgICAgICAvKiBmbHVzaCAqLwogICAgc29ja19nZXRfaW5mbywgICAgICAgICAgICAgICAgLyogZ2V0X2ZpbGVfaW5mbyAqLwogICAgc29ja19xdWV1ZV9hc3luYyAgICAgICAgICAgICAgLyogcXVldWVfYXN5bmMgKi8KfTsKCgovKiBQZXJtdXRhdGlvbiBvZiAwLi5GRF9NQVhfRVZFTlRTIC0gMSByZXByZXNlbnRpbmcgdGhlIG9yZGVyIGluIHdoaWNoCiAqIHdlIHBvc3QgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGV2ZW50cy4gIFVzZWQgdG8gc2VuZAogKiBtZXNzYWdlcy4gIFRoZSBwcm9ibGVtIGlzIGlmIHRoZXJlIGlzIGJvdGggYSBGRF9DT05ORUNUIGV2ZW50IGFuZCwKICogc2F5LCBhbiBGRF9SRUFEIGV2ZW50IGF2YWlsYWJsZSBvbiB0aGUgc2FtZSBzb2NrZXQsIHdlIHdhbnQgdG8KICogbm90aWZ5IHRoZSBhcHAgb2YgdGhlIGNvbm5lY3QgZXZlbnQgZmlyc3QuICBPdGhlcndpc2UgaXQgbWF5CiAqIGRpc2NhcmQgdGhlIHJlYWQgZXZlbnQgYmVjYXVzZSBpdCB0aGlua3MgaXQgaGFzbid0IGNvbm5lY3RlZCB5ZXQuCiAqLwpzdGF0aWMgY29uc3QgaW50IGV2ZW50X2JpdG9yZGVyW0ZEX01BWF9FVkVOVFNdID0KewogICAgRkRfQ09OTkVDVF9CSVQsCiAgICBGRF9BQ0NFUFRfQklULAogICAgRkRfT09CX0JJVCwKICAgIEZEX1dSSVRFX0JJVCwKICAgIEZEX1JFQURfQklULAogICAgRkRfQ0xPU0VfQklULAogICAgNiwgNywgOCwgOSAgLyogbGVmdG92ZXJzICovCn07CgovKiBGbGFncyB0aGF0IG1ha2Ugc2Vuc2Ugb25seSBmb3IgU09DS19TVFJFQU0gc29ja2V0cyAqLwojZGVmaW5lIFNUUkVBTV9GTEFHX01BU0sgKCh1bnNpZ25lZCBpbnQpIChGRF9DT05ORUNUIHwgRkRfQUNDRVBUIHwgRkRfV0lORV9MSVNURU5JTkcgfCBGRF9XSU5FX0NPTk5FQ1RFRCkpCgp0eXBlZGVmIGVudW0gewogICAgU09DS19TSFVURE9XTl9FUlJPUiA9IC0xLAogICAgU09DS19TSFVURE9XTl9FT0YgPSAwLAogICAgU09DS19TSFVURE9XTl9QT0xMSFVQID0gMQp9IHNvY2tfc2h1dGRvd25fdDsKCnN0YXRpYyBzb2NrX3NodXRkb3duX3Qgc29ja19zaHV0ZG93bl90eXBlID0gU09DS19TSFVURE9XTl9FUlJPUjsKCnN0YXRpYyBzb2NrX3NodXRkb3duX3Qgc29ja19jaGVja19wb2xsaHVwICh2b2lkKQp7CiAgICBzb2NrX3NodXRkb3duX3QgcmV0ID0gU09DS19TSFVURE9XTl9FUlJPUjsKICAgIGludCBmZFsyXSwgbjsKICAgIHN0cnVjdCBwb2xsZmQgcGZkOwogICAgY2hhciBkdW1teTsKCiAgICBpZiAoIHNvY2tldHBhaXIgKCBBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgZmQgKSApIGdvdG8gb3V0OwogICAgaWYgKCBzaHV0ZG93biAoIGZkWzBdLCAxICkgKSBnb3RvIG91dDsKCiAgICBwZmQuZmQgPSBmZFsxXTsKICAgIHBmZC5ldmVudHMgPSBQT0xMSU47CiAgICBwZmQucmV2ZW50cyA9IDA7CgogICAgbiA9IHBvbGwgKCAmcGZkLCAxLCAwICk7CiAgICBpZiAoIG4gIT0gMSApIGdvdG8gb3V0OyAvKiBlcnJvciBvciB0aW1lb3V0ICovCiAgICBpZiAoIHBmZC5yZXZlbnRzICYgUE9MTEhVUCApCiAgICAgICAgcmV0ID0gU09DS19TSFVURE9XTl9QT0xMSFVQOwogICAgZWxzZSBpZiAoIHBmZC5yZXZlbnRzICYgUE9MTElOICYmCiAgICAgICAgICAgICAgcmVhZCAoIGZkWzFdLCAmZHVtbXksIDEgKSA9PSAwICkKICAgICAgICByZXQgPSBTT0NLX1NIVVRET1dOX0VPRjsKCm91dDoKICAgIGNsb3NlICggZmRbMF0gKTsKICAgIGNsb3NlICggZmRbMV0gKTsKICAgIHJldHVybiByZXQ7Cn0KCnZvaWQgc29ja19pbml0KHZvaWQpCnsKICAgIHNvY2tfc2h1dGRvd25fdHlwZSA9IHNvY2tfY2hlY2tfcG9sbGh1cCAoKTsKCiAgICBzd2l0Y2ggKCBzb2NrX3NodXRkb3duX3R5cGUgKQogICAgewogICAgY2FzZSBTT0NLX1NIVVRET1dOX0VPRjoKICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYgKCBzdGRlcnIsICJzb2NrX2luaXQ6IHNodXRkb3duKCkgY2F1c2VzIEVPRlxuIiApOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBTT0NLX1NIVVRET1dOX1BPTExIVVA6CiAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmICggc3RkZXJyLCAic29ja19pbml0OiBzaHV0ZG93bigpIGNhdXNlcyBQT0xMSFVQXG4iICk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJzb2NrX2luaXQ6IEVSUk9SIGluIHNvY2tfY2hlY2tfcG9sbGh1cCgpXG4iICk7CiAgICAgICAgc29ja19zaHV0ZG93bl90eXBlID0gU09DS19TSFVURE9XTl9FT0Y7CiAgICB9Cn0KCnN0YXRpYyBpbnQgc29ja19yZXNlbGVjdCggc3RydWN0IHNvY2sgKnNvY2sgKQp7CiAgICBpbnQgZXYgPSBzb2NrX2dldF9wb2xsX2V2ZW50cyggc29jay0+ZmQgKTsKCiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tfcmVzZWxlY3QoJXApOiBuZXcgbWFzayAleFxuIiwgc29jaywgZXYpOwoKICAgIGlmICghc29jay0+cG9sbGluZykgIC8qIEZJWE1FOiBzaG91bGQgZmluZCBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyAqLwogICAgewogICAgICAgIC8qIHByZXZpb3VzbHkgdW5jb25uZWN0ZWQgc29ja2V0LCBpcyB0aGlzIHJlc2VsZWN0IHN1cHBvc2VkIHRvIGNvbm5lY3QgaXQ/ICovCiAgICAgICAgaWYgKCEoc29jay0+c3RhdGUgJiB+RkRfV0lORV9OT05CTE9DS0lORykpIHJldHVybiAwOwogICAgICAgIC8qIG9rLCBpdCBpcywgYXR0YWNoIGl0IHRvIHRoZSB3aW5lc2VydmVyJ3MgbWFpbiBwb2xsIGxvb3AgKi8KICAgICAgICBzb2NrLT5wb2xsaW5nID0gMTsKICAgIH0KICAgIC8qIHVwZGF0ZSBjb25kaXRpb24gbWFzayAqLwogICAgc2V0X2ZkX2V2ZW50cyggc29jay0+ZmQsIGV2ICk7CiAgICByZXR1cm4gZXY7Cn0KCi8qIEFmdGVyIFBPTExIVVAgaXMgcmVjZWl2ZWQsIHRoZSBzb2NrZXQgd2lsbCBubyBsb25nZXIgYmUgaW4gdGhlIG1haW4gc2VsZWN0IGxvb3AuCiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzaWduYWwgcGVuZGluZyBldmVudHMgbmV2ZXJ0aGVsZXNzICovCnN0YXRpYyB2b2lkIHNvY2tfdHJ5X2V2ZW50ICggc3RydWN0IHNvY2sgKnNvY2ssIGludCBldmVudCApCnsKICAgIGV2ZW50ID0gY2hlY2tfZmRfZXZlbnRzKCBzb2NrLT5mZCwgZXZlbnQgKTsKICAgIGlmIChldmVudCkKICAgIHsKICAgICAgICBpZiAoIGRlYnVnX2xldmVsICkgZnByaW50ZiAoIHN0ZGVyciwgInNvY2tfdHJ5X2V2ZW50OiAleFxuIiwgZXZlbnQgKTsKICAgICAgICBzb2NrX3BvbGxfZXZlbnQgKCBzb2NrLT5mZCwgZXZlbnQgKTsKICAgIH0KfQoKLyogd2FrZSBhbnlib2R5IHdhaXRpbmcgb24gdGhlIHNvY2tldCBldmVudCBvciBzZW5kIHRoZSBhc3NvY2lhdGVkIG1lc3NhZ2UgKi8Kc3RhdGljIHZvaWQgc29ja193YWtlX3VwKCBzdHJ1Y3Qgc29jayAqc29jaywgaW50IHBvbGxldiApCnsKICAgIHVuc2lnbmVkIGludCBldmVudHMgPSBzb2NrLT5wbWFzayAmIHNvY2stPm1hc2s7CiAgICBpbnQgaTsKICAgIGludCBhc3luY19hY3RpdmUgPSAwOwoKICAgIGlmICggc29jay0+ZmxhZ3MgJiBGRF9GTEFHX09WRVJMQVBQRUQgKQogICAgewogICAgICAgIGlmKCBwb2xsZXYgJiAoUE9MTElOfFBPTExQUkkpICYmIElTX1JFQURZKCBzb2NrLT5yZWFkX3EgKSApCiAgICAgICAgewogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYgKCBzdGRlcnIsICJhY3RpdmF0aW5nIHJlYWQgcXVldWUgZm9yIHNvY2tldCAlcFxuIiwgc29jayApOwogICAgICAgICAgICBhc3luY19ub3RpZnkoIHNvY2stPnJlYWRfcS5oZWFkLCBTVEFUVVNfQUxFUlRFRCApOwogICAgICAgICAgICBhc3luY19hY3RpdmUgPSAxOwogICAgICAgIH0KICAgICAgICBpZiggcG9sbGV2ICYgUE9MTE9VVCAmJiBJU19SRUFEWSggc29jay0+d3JpdGVfcSApICkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZiAoIHN0ZGVyciwgImFjdGl2YXRpbmcgd3JpdGUgcXVldWUgZm9yIHNvY2tldCAlcFxuIiwgc29jayApOwogICAgICAgICAgICBhc3luY19ub3RpZnkoIHNvY2stPndyaXRlX3EuaGVhZCwgU1RBVFVTX0FMRVJURUQgKTsKICAgICAgICAgICAgYXN5bmNfYWN0aXZlID0gMTsKICAgICAgICB9CiAgICB9CgogICAgLyogRG8gbm90IHNpZ25hbCBldmVudHMgaWYgdGhlcmUgYXJlIHN0aWxsIHBlbmRpbmcgYXN5bmNocm9ub3VzIElPIHJlcXVlc3RzICovCiAgICAvKiBXZSBuZWVkIHRoaXMgdG8gZGVsYXkgRkRfQ0xPU0UgZXZlbnRzIHVudGlsIGFsbCBwZW5kaW5nIG92ZXJsYXBwZWQgcmVxdWVzdHMgYXJlIHByb2Nlc3NlZCAqLwogICAgaWYgKCAhZXZlbnRzIHx8IGFzeW5jX2FjdGl2ZSApIHJldHVybjsKCiAgICBpZiAoc29jay0+ZXZlbnQpCiAgICB7CiAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKHN0ZGVyciwgInNpZ25hbGxpbmcgZXZlbnRzICV4IHB0ciAlcFxuIiwgZXZlbnRzLCBzb2NrLT5ldmVudCApOwogICAgICAgIHNldF9ldmVudCggc29jay0+ZXZlbnQgKTsKICAgIH0KICAgIGlmIChzb2NrLT53aW5kb3cpCiAgICB7CiAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKHN0ZGVyciwgInNpZ25hbGxpbmcgZXZlbnRzICV4IHdpbiAlcFxuIiwgZXZlbnRzLCBzb2NrLT53aW5kb3cgKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkRfTUFYX0VWRU5UUzsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGV2ZW50ID0gZXZlbnRfYml0b3JkZXJbaV07CiAgICAgICAgICAgIGlmIChzb2NrLT5wbWFzayAmICgxIDw8IGV2ZW50KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxwYXJhbSA9ICgxIDw8IGV2ZW50KSB8IChzb2NrLT5lcnJvcnNbZXZlbnRdIDw8IDE2KTsKICAgICAgICAgICAgICAgIHBvc3RfbWVzc2FnZSggc29jay0+d2luZG93LCBzb2NrLT5tZXNzYWdlLCAodW5zaWduZWQgaW50KXNvY2stPndwYXJhbSwgbHBhcmFtICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29jay0+cG1hc2sgPSAwOwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIH0KfQoKaW5saW5lIHN0YXRpYyBpbnQgc29ja19lcnJvciggc3RydWN0IGZkICpmZCApCnsKICAgIHVuc2lnbmVkIGludCBvcHR2YWwgPSAwLCBvcHRsZW47CgogICAgb3B0bGVuID0gc2l6ZW9mKG9wdHZhbCk7CiAgICBnZXRzb2Nrb3B0KCBnZXRfdW5peF9mZChmZCksIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAodm9pZCAqKSAmb3B0dmFsLCAmb3B0bGVuKTsKICAgIHJldHVybiBvcHR2YWwgPyBzb2NrX2dldF9lcnJvcihvcHR2YWwpIDogMDsKfQoKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3QgZmQgKmZkLCBpbnQgZXZlbnQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgaW50IGhhbmd1cF9zZWVuID0gMDsKCiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgc2VsZWN0IGV2ZW50OiAleFxuIiwgc29jaywgZXZlbnQpOwogICAgaWYgKHNvY2stPnN0YXRlICYgRkRfQ09OTkVDVCkKICAgIHsKICAgICAgICAvKiBjb25uZWN0aW5nICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGdvdCBjb25uZWN0ZWQgKi8KICAgICAgICAgICAgc29jay0+c3RhdGUgfD0gRkRfV0lORV9DT05ORUNURUR8RkRfUkVBRHxGRF9XUklURTsKICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfkZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DT05ORUNUX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBjb25uZWN0aW9uIHN1Y2Nlc3NcbiIsIHNvY2spOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogd2UgZGlkbid0IGdldCBjb25uZWN0ZWQ/ICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gc29ja19lcnJvciggZmQgKTsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgY29ubmVjdGlvbiBmYWlsdXJlXG4iLCBzb2NrKTsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTElTVEVOSU5HKQogICAgewogICAgICAgIC8qIGxpc3RlbmluZyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExJTikKICAgICAgICB7CiAgICAgICAgICAgIC8qIGluY29taW5nIGNvbm5lY3Rpb24gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSAwOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkpCiAgICAgICAgewogICAgICAgICAgICAvKiBmYWlsZWQgaW5jb21pbmcgY29ubmVjdGlvbj8gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSBzb2NrX2Vycm9yKCBmZCApOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgfQogICAgfSBlbHNlCiAgICB7CiAgICAgICAgLyogbm9ybWFsIGRhdGEgZmxvdyAqLwogICAgICAgIGlmICggc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSAmJiAoIGV2ZW50ICYgUE9MTElOICkgKQogICAgICAgIHsKICAgICAgICAgICAgY2hhciBkdW1teTsKICAgICAgICAgICAgaW50IG5yOwoKICAgICAgICAgICAgLyogTGludXggMi40IGRvZXNuJ3QgcmVwb3J0IFBPTExIVVAgaWYgb25seSBvbmUgc2lkZSBvZiB0aGUgc29ja2V0CiAgICAgICAgICAgICAqIGhhcyBiZWVuIGNsb3NlZCwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgaXQgZXhwbGljaXRseSBoZXJlICovCiAgICAgICAgICAgIG5yICA9IHJlY3YoIGdldF91bml4X2ZkKCBmZCApLCAmZHVtbXksIDEsIE1TR19QRUVLICk7CiAgICAgICAgICAgIGlmICggbnIgPiAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogaW5jb21pbmcgZGF0YSAqLwogICAgICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfUkVBRDsKICAgICAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IChGRF9SRUFEfEZEX0NMT1NFKTsKICAgICAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9SRUFEX0JJVF0gPSAwOwogICAgICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIGlzIHJlYWRhYmxlXG4iLCBzb2NrICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIG5yID09IDAgKQogICAgICAgICAgICAgICAgaGFuZ3VwX3NlZW4gPSAxOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVBR0FJTiBjYW4gaGFwcGVuIGlmIGFuIGFzeW5jIHJlY3YoKSBmYWxscyBiZXR3ZWVuIHRoZSBzZXJ2ZXIncyBwb2xsKCkKICAgICAgICAgICAgICAgICAgIGNhbGwgYW5kIHRoZSBpbnZvY2F0aW9uIG9mIHRoaXMgcm91dGluZSAqLwogICAgICAgICAgICAgICAgaWYgKCBlcnJubyA9PSBFQUdBSU4gKQogICAgICAgICAgICAgICAgICAgIGV2ZW50ICY9IH5QT0xMSU47CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWJ1Z19sZXZlbCApCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJyZWN2IGVycm9yIG9uIHNvY2tldCAlcDogJWRcbiIsIHNvY2ssIGVycm5vICk7CiAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBQT0xMRVJSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBlbHNlIGlmICggc29ja19zaHV0ZG93bl90eXBlID09IFNPQ0tfU0hVVERPV05fUE9MTEhVUCAmJiAoZXZlbnQgJiBQT0xMSFVQKSApCiAgICAgICAgewogICAgICAgICAgICBoYW5ndXBfc2VlbiA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCBldmVudCAmIFBPTExJTiApIC8qIFBPTExJTiBmb3Igbm9uLXN0cmVhbSBzb2NrZXQgKi8KICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1JFQUQ7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IChGRF9SRUFEfEZEX0NMT1NFKTsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1JFQURfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIGlzIHJlYWRhYmxlXG4iLCBzb2NrICk7CgogICAgICAgIH0KCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1dSSVRFOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9XUklURTsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1dSSVRFX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBpcyB3cml0YWJsZVxuIiwgc29jayk7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudCAmIFBPTExQUkkpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX09PQjsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX09PQl9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgZ290IE9PQiBkYXRhXG4iLCBzb2NrKTsKICAgICAgICB9CiAgICAgICAgLyogQWNjb3JkaW5nIHRvIFdTMiBzcGVjcywgRkRfQ0xPU0UgaXMgb25seSBkZWxpdmVyZWQgd2hlbiB0aGVyZSBpcwogICAgICAgICAgIG5vIG1vcmUgZGF0YSB0byBiZSByZWFkIChpLmUuIGhhbmd1cF9zZWVuID0gMSkgKi8KICAgICAgICBlbHNlIGlmICggaGFuZ3VwX3NlZW4gJiYgKHNvY2stPnN0YXRlICYgKEZEX1JFQUR8RkRfV1JJVEUpICkpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSA9IHNvY2tfZXJyb3IoIGZkICk7CiAgICAgICAgICAgIGlmICggKGV2ZW50ICYgUE9MTEVSUikgfHwgKCBzb2NrX3NodXRkb3duX3R5cGUgPT0gU09DS19TSFVURE9XTl9FT0YgJiYgKGV2ZW50ICYgUE9MTEhVUCkgKSkKICAgICAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9XUklURTsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQ0xPU0U7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBhYm9ydGVkIGJ5IGVycm9yICVkLCBldmVudDogJXggLSByZW1vdmluZyBmcm9tIHNlbGVjdCBsb29wXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBzb2NrLCBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSwgZXZlbnQpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHNvY2stPnBtYXNrICYgRkRfQ0xPU0UgfHwgZXZlbnQgJiAoUE9MTEVSUnxQT0xMSFVQKSApCiAgICB7CiAgICAgICAgaWYgKCBkZWJ1Z19sZXZlbCApCiAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJyZW1vdmluZyBzb2NrZXQgJXAgZnJvbSBzZWxlY3QgbG9vcFxuIiwgc29jayApOwogICAgICAgIHNldF9mZF9ldmVudHMoIHNvY2stPmZkLCAtMSApOwogICAgfQogICAgZWxzZQogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKCiAgICAvKiB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciB3aGF0ZXZlciBqdXN0IGhhcHBlbmVkICovCiAgICBpZiAoIHNvY2stPnBtYXNrICYgc29jay0+bWFzayB8fCBzb2NrLT5mbGFncyAmIEZEX0ZMQUdfT1ZFUkxBUFBFRCApIHNvY2tfd2FrZV91cCggc29jaywgZXZlbnQgKTsKCiAgICAvKiBpZiBhbnlvbmUgaXMgc3R1cGlkIGVub3VnaCB0byB3YWl0IG9uIHRoZSBzb2NrZXQgb2JqZWN0IGl0c2VsZiwKICAgICAqIG1heWJlIHdlIHNob3VsZCB3YWtlIHRoZW0gdXAgdG9vLCBqdXN0IGluIGNhc2U/ICovCiAgICB3YWtlX3VwKCAmc29jay0+b2JqLCAwICk7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfZHVtcCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKICAgIHByaW50ZiggIlNvY2tldCBmZD0lcCwgc3RhdGU9JXgsIG1hc2s9JXgsIHBlbmRpbmc9JXgsIGhlbGQ9JXhcbiIsCiAgICAgICAgICAgIHNvY2stPmZkLCBzb2NrLT5zdGF0ZSwKICAgICAgICAgICAgc29jay0+bWFzaywgc29jay0+cG1hc2ssIHNvY2stPmhtYXNrICk7Cn0KCnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgcmV0dXJuIGNoZWNrX2ZkX2V2ZW50cyggc29jay0+ZmQsIHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCBzb2NrLT5mZCApICkgIT0gMDsKfQoKc3RhdGljIGludCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc3RydWN0IGZkICpmZCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICB1bnNpZ25lZCBpbnQgbWFzayA9IHNvY2stPm1hc2sgJiBzb2NrLT5zdGF0ZSAmIH5zb2NrLT5obWFzazsKICAgIGludCBldiA9IDA7CgogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwoKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX0NPTk5FQ1QpCiAgICAgICAgLyogY29ubmVjdGluZywgd2FpdCBmb3Igd3JpdGFibGUgKi8KICAgICAgICByZXR1cm4gUE9MTE9VVDsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTElTVEVOSU5HKQogICAgICAgIC8qIGxpc3RlbmluZywgd2FpdCBmb3IgcmVhZGFibGUgKi8KICAgICAgICByZXR1cm4gKHNvY2stPmhtYXNrICYgRkRfQUNDRVBUKSA/IDAgOiBQT0xMSU47CgogICAgaWYgKG1hc2sgJiAoRkRfUkVBRCkgfHwgKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCAmJiBJU19SRUFEWSAoc29jay0+cmVhZF9xKSkpCiAgICAgICAgZXYgfD0gUE9MTElOIHwgUE9MTFBSSTsKICAgIGlmIChtYXNrICYgRkRfV1JJVEUgfHwgKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCAmJiBJU19SRUFEWSAoc29jay0+d3JpdGVfcSkpKQogICAgICAgIGV2IHw9IFBPTExPVVQ7CiAgICAvKiBXZSB1c2UgUE9MTElOIHdpdGggMCBieXRlcyByZWN2KCkgYXMgRkRfQ0xPU0UgaW5kaWNhdGlvbiBmb3Igc3RyZWFtIHNvY2tldHMuICovCiAgICBpZiAoIHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0gJiYgKCBzb2NrLT5tYXNrICYgfnNvY2stPmhtYXNrICYgRkRfQ0xPU0UpICkKICAgICAgICBldiB8PSBQT0xMSU47CgogICAgcmV0dXJuIGV2Owp9CgpzdGF0aWMgaW50IHNvY2tfZ2V0X2luZm8oIHN0cnVjdCBmZCAqZmQsIGludCAqZmxhZ3MgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgYXNzZXJ0ICggc29jay0+b2JqLm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICAqZmxhZ3MgPSAwOwogICAgaWYgKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCkgKmZsYWdzIHw9IEZEX0ZMQUdfT1ZFUkxBUFBFRDsKICAgIGlmICggc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSB8fCBzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfQ09OTkVDVEVEICkKICAgIHsKICAgICAgICBpZiAoICEoc29jay0+c3RhdGUgJiBGRF9SRUFEICApICkgKmZsYWdzIHw9IEZEX0ZMQUdfUkVDVl9TSFVURE9XTjsKICAgICAgICBpZiAoICEoc29jay0+c3RhdGUgJiBGRF9XUklURSApICkgKmZsYWdzIHw9IEZEX0ZMQUdfU0VORF9TSFVURE9XTjsKICAgIH0KICAgIHJldHVybiBGRF9UWVBFX1NPQ0tFVDsKfQoKc3RhdGljIHZvaWQgc29ja19xdWV1ZV9hc3luYyhzdHJ1Y3QgZmQgKmZkLCB2b2lkICpwdHIsIHVuc2lnbmVkIGludCBzdGF0dXMsIGludCB0eXBlLCBpbnQgY291bnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgKnE7CiAgICBzdHJ1Y3QgYXN5bmMgKmFzeW5jOwogICAgaW50IHBvbGxldjsKCiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgaWYgKCAhKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCkgKQogICAgewogICAgICAgIHNldF9lcnJvciAoIFNUQVRVU19JTlZBTElEX0hBTkRMRSApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBzd2l0Y2goIHR5cGUgKQogICAgewogICAgY2FzZSBBU1lOQ19UWVBFX1JFQUQ6CiAgICAgICAgcSA9ICZzb2NrLT5yZWFkX3E7CiAgICAgICAgc29jay0+aG1hc2sgJj0gfkZEX0NMT1NFOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBBU1lOQ19UWVBFX1dSSVRFOgogICAgICAgIHEgPSAmc29jay0+d3JpdGVfcTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgc2V0X2Vycm9yKCBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgYXN5bmMgPSBmaW5kX2FzeW5jICggcSwgY3VycmVudCwgcHRyICk7CgogICAgaWYgKCBzdGF0dXMgPT0gU1RBVFVTX1BFTkRJTkcgKQogICAgewogICAgICAgIGlmICggKCAhKCBzb2NrLT5zdGF0ZSAmIEZEX1JFQUQgKSAmJiB0eXBlID09IEFTWU5DX1RZUEVfUkVBRCAgKSB8fAogICAgICAgICAgICAgKCAhKCBzb2NrLT5zdGF0ZSAmIEZEX1dSSVRFICkgJiYgdHlwZSA9PSBBU1lOQ19UWVBFX1dSSVRFICkgKQogICAgICAgIHsKICAgICAgICAgICAgc2V0X2Vycm9yICggU1RBVFVTX1BJUEVfRElTQ09OTkVDVEVEICk7CiAgICAgICAgICAgIGlmICggYXN5bmMgKSBkZXN0cm95X2FzeW5jICggYXN5bmMgKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAhYXN5bmMgKQogICAgICAgICAgICAgICAgYXN5bmMgPSBjcmVhdGVfYXN5bmMgKCAmc29jay0+b2JqLCBjdXJyZW50LCBwdHIgKTsKICAgICAgICAgICAgaWYgKCAhYXN5bmMgKQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgYXN5bmMtPnN0YXR1cyA9IFNUQVRVU19QRU5ESU5HOwogICAgICAgICAgICBpZiAoICFhc3luYy0+cSApCiAgICAgICAgICAgICAgICBhc3luY19pbnNlcnQgKCBxLCBhc3luYyApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCBhc3luYyApIGRlc3Ryb3lfYXN5bmMgKCBhc3luYyApOwogICAgZWxzZSBzZXRfZXJyb3IgKCBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgKTsKCiAgICBwb2xsZXYgPSBzb2NrX3Jlc2VsZWN0ICggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCAoIHNvY2ssIHBvbGxldiApOwp9CgpzdGF0aWMgc3RydWN0IGZkICpzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICByZXR1cm4gKHN0cnVjdCBmZCAqKWdyYWJfb2JqZWN0KCBzb2NrLT5mZCApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2Rlc3Ryb3koIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICAvKiBGSVhNRTogc3BlY2lhbCBzb2NrZXQgc2h1dGRvd24gc3R1ZmY/ICovCgogICAgaWYgKCBzb2NrLT5kZWZlcnJlZCApCiAgICAgICAgcmVsZWFzZV9vYmplY3QgKCBzb2NrLT5kZWZlcnJlZCApOwoKICAgIGlmICggc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEICkKICAgIHsKICAgICAgICBkZXN0cm95X2FzeW5jX3F1ZXVlICggJnNvY2stPnJlYWRfcSApOwogICAgICAgIGRlc3Ryb3lfYXN5bmNfcXVldWUgKCAmc29jay0+d3JpdGVfcSApOwogICAgfQogICAgaWYgKHNvY2stPmV2ZW50KSByZWxlYXNlX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgIGlmIChzb2NrLT5mZCkgcmVsZWFzZV9vYmplY3QoIHNvY2stPmZkICk7Cn0KCi8qIGNyZWF0ZSBhIG5ldyBhbmQgdW5jb25uZWN0ZWQgc29ja2V0ICovCnN0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICpjcmVhdGVfc29ja2V0KCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCB1bnNpZ25lZCBpbnQgZmxhZ3MgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludCBzb2NrZmQ7CgogICAgc29ja2ZkID0gc29ja2V0KCBmYW1pbHksIHR5cGUsIHByb3RvY29sICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tldCglZCwlZCwlZCk9JWRcbiIsZmFtaWx5LHR5cGUscHJvdG9jb2wsc29ja2ZkKTsKICAgIGlmIChzb2NrZmQgPT0gLTEpIHsKICAgICAgICBzb2NrX3NldF9lcnJvcigpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgZmNudGwoc29ja2ZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsgLyogbWFrZSBzb2NrZXQgbm9uYmxvY2tpbmcgKi8KICAgIGlmICghKHNvY2sgPSBhbGxvY19vYmplY3QoICZzb2NrX29wcyApKSkKICAgIHsKICAgICAgICBjbG9zZSggc29ja2ZkICk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBzb2NrLT5zdGF0ZSA9ICh0eXBlICE9IFNPQ0tfU1RSRUFNKSA/IChGRF9SRUFEfEZEX1dSSVRFKSA6IDA7CiAgICBzb2NrLT5tYXNrICAgID0gMDsKICAgIHNvY2stPmhtYXNrICAgPSAwOwogICAgc29jay0+cG1hc2sgICA9IDA7CiAgICBzb2NrLT5wb2xsaW5nID0gMDsKICAgIHNvY2stPmZsYWdzICAgPSBmbGFnczsKICAgIHNvY2stPnR5cGUgICAgPSB0eXBlOwogICAgc29jay0+ZmFtaWx5ICA9IGZhbWlseTsKICAgIHNvY2stPmV2ZW50ICAgPSBOVUxMOwogICAgc29jay0+d2luZG93ICA9IDA7CiAgICBzb2NrLT5tZXNzYWdlID0gMDsKICAgIHNvY2stPndwYXJhbSAgPSAwOwogICAgc29jay0+ZGVmZXJyZWQgPSBOVUxMOwogICAgaWYgKCEoc29jay0+ZmQgPSBjcmVhdGVfYW5vbnltb3VzX2ZkKCAmc29ja19mZF9vcHMsIHNvY2tmZCwgJnNvY2stPm9iaiApKSkKICAgIHsKICAgICAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgaWYgKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCkKICAgIHsKICAgICAgICBpbml0X2FzeW5jX3F1ZXVlICgmc29jay0+cmVhZF9xKTsKICAgICAgICBpbml0X2FzeW5jX3F1ZXVlICgmc29jay0+d3JpdGVfcSk7CiAgICB9CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICBjbGVhcl9lcnJvcigpOwogICAgcmV0dXJuICZzb2NrLT5vYmo7Cn0KCi8qIGFjY2VwdCBhIHNvY2tldCAoY3JlYXRlcyBhIG5ldyBmZCkgKi8Kc3RhdGljIHN0cnVjdCBzb2NrICphY2NlcHRfc29ja2V0KCBvYmpfaGFuZGxlX3QgaGFuZGxlICkKewogICAgc3RydWN0IHNvY2sgKmFjY2VwdHNvY2s7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludAlhY2NlcHRmZDsKICAgIHN0cnVjdCBzb2NrYWRkcglzYWRkcjsKICAgIGludAkJCXNsZW47CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MsaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyk7CiAgICBpZiAoIXNvY2spCiAgICAJcmV0dXJuIE5VTEw7CgogICAgaWYgKCBzb2NrLT5kZWZlcnJlZCApIHsKICAgICAgICBhY2NlcHRzb2NrID0gc29jay0+ZGVmZXJyZWQ7CiAgICAgICAgc29jay0+ZGVmZXJyZWQgPSBOVUxMOwogICAgfSBlbHNlIHsKCiAgICAgICAgLyogVHJ5IHRvIGFjY2VwdCgyKS4gV2UgY2FuJ3QgYmUgc2FmZSB0aGF0IHRoaXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0CiAgICAgICAgICogb3IgdGhhdCBhY2NlcHQoKSBpcyBhbGxvd2VkIG9uIGl0LiBJbiB0aG9zZSBjYXNlcyB3ZSB3aWxsIGdldCAtMS9lcnJubwogICAgICAgICAqIHJldHVybi4KICAgICAgICAgKi8KICAgICAgICBzbGVuID0gc2l6ZW9mKHNhZGRyKTsKICAgICAgICBhY2NlcHRmZCA9IGFjY2VwdCggZ2V0X3VuaXhfZmQoc29jay0+ZmQpLCAmc2FkZHIsICZzbGVuKTsKICAgICAgICBpZiAoYWNjZXB0ZmQ9PS0xKSB7CiAgICAgICAgICAgIHNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBpZiAoIShhY2NlcHRzb2NrID0gYWxsb2Nfb2JqZWN0KCAmc29ja19vcHMgKSkpCiAgICAgICAgewogICAgICAgICAgICBjbG9zZSggYWNjZXB0ZmQgKTsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQoKICAgICAgICAvKiBuZXdseSBjcmVhdGVkIHNvY2tldCBnZXRzIHRoZSBzYW1lIHByb3BlcnRpZXMgb2YgdGhlIGxpc3RlbmluZyBzb2NrZXQgKi8KICAgICAgICBmY250bChhY2NlcHRmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7IC8qIG1ha2Ugc29ja2V0IG5vbmJsb2NraW5nICovCiAgICAgICAgYWNjZXB0c29jay0+c3RhdGUgID0gRkRfV0lORV9DT05ORUNURUR8RkRfUkVBRHxGRF9XUklURTsKICAgICAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9XSU5FX05PTkJMT0NLSU5HKQogICAgICAgICAgICBhY2NlcHRzb2NrLT5zdGF0ZSB8PSBGRF9XSU5FX05PTkJMT0NLSU5HOwogICAgICAgIGFjY2VwdHNvY2stPm1hc2sgICAgPSBzb2NrLT5tYXNrOwogICAgICAgIGFjY2VwdHNvY2stPmhtYXNrICAgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPnBtYXNrICAgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPnBvbGxpbmcgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPnR5cGUgICAgPSBzb2NrLT50eXBlOwogICAgICAgIGFjY2VwdHNvY2stPmZhbWlseSAgPSBzb2NrLT5mYW1pbHk7CiAgICAgICAgYWNjZXB0c29jay0+ZXZlbnQgICA9IE5VTEw7CiAgICAgICAgYWNjZXB0c29jay0+d2luZG93ICA9IHNvY2stPndpbmRvdzsKICAgICAgICBhY2NlcHRzb2NrLT5tZXNzYWdlID0gc29jay0+bWVzc2FnZTsKICAgICAgICBhY2NlcHRzb2NrLT53cGFyYW0gID0gMDsKICAgICAgICBpZiAoc29jay0+ZXZlbnQpIGFjY2VwdHNvY2stPmV2ZW50ID0gKHN0cnVjdCBldmVudCAqKWdyYWJfb2JqZWN0KCBzb2NrLT5ldmVudCApOwogICAgICAgIGFjY2VwdHNvY2stPmZsYWdzID0gc29jay0+ZmxhZ3M7CiAgICAgICAgYWNjZXB0c29jay0+ZGVmZXJyZWQgPSAwOwogICAgICAgIGlmICghKGFjY2VwdHNvY2stPmZkID0gY3JlYXRlX2Fub255bW91c19mZCggJnNvY2tfZmRfb3BzLCBhY2NlcHRmZCwgJmFjY2VwdHNvY2stPm9iaiApKSkKICAgICAgICB7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBhY2NlcHRzb2NrICk7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBpZiAoIGFjY2VwdHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCApCiAgICAgICAgewogICAgICAgICAgICBpbml0X2FzeW5jX3F1ZXVlICggJmFjY2VwdHNvY2stPnJlYWRfcSApOwogICAgICAgICAgICBpbml0X2FzeW5jX3F1ZXVlICggJmFjY2VwdHNvY2stPndyaXRlX3EgKTsKICAgICAgICB9CiAgICB9CiAgICBjbGVhcl9lcnJvcigpOwogICAgc29jay0+cG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2stPmhtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgcmV0dXJuIGFjY2VwdHNvY2s7Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApCnsKICAgIHN3aXRjaCAoZXJyKQogICAgewogICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAgICAgIHJldHVybiBXU0FFSU5UUjsgYnJlYWs7CiAgICAgICAgY2FzZSBFQkFERjogICAgICAgICAgICAgcmV0dXJuIFdTQUVCQURGOyBicmVhazsKICAgICAgICBjYXNlIEVQRVJNOgogICAgICAgIGNhc2UgRUFDQ0VTOiAgICAgICAgICAgIHJldHVybiBXU0FFQUNDRVM7IGJyZWFrOwogICAgICAgIGNhc2UgRUZBVUxUOiAgICAgICAgICAgIHJldHVybiBXU0FFRkFVTFQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUlOVkFMOiAgICAgICAgICAgIHJldHVybiBXU0FFSU5WQUw7IGJyZWFrOwogICAgICAgIGNhc2UgRU1GSUxFOiAgICAgICAgICAgIHJldHVybiBXU0FFTUZJTEU7IGJyZWFrOwogICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAgICAgIHJldHVybiBXU0FFV09VTERCTE9DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSU5QUk9HUkVTUzogICAgICAgcmV0dXJuIFdTQUVJTlBST0dSRVNTOyBicmVhazsKICAgICAgICBjYXNlIEVBTFJFQURZOiAgICAgICAgICByZXR1cm4gV1NBRUFMUkVBRFk7IGJyZWFrOwogICAgICAgIGNhc2UgRU5PVFNPQ0s6ICAgICAgICAgIHJldHVybiBXU0FFTk9UU09DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFREVTVEFERFJSRVE6ICAgICAgcmV0dXJuIFdTQUVERVNUQUREUlJFUTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTVNHU0laRTogICAgICAgICAgcmV0dXJuIFdTQUVNU0dTSVpFOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT1RZUEU6ICAgICAgICByZXR1cm4gV1NBRVBST1RPVFlQRTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9QUk9UT09QVDogICAgICAgcmV0dXJuIFdTQUVOT1BST1RPT1BUOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT05PU1VQUE9SVDogICByZXR1cm4gV1NBRVBST1RPTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVTT0NLVE5PU1VQUE9SVDogICByZXR1cm4gV1NBRVNPQ0tUTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVPUE5PVFNVUFA6ICAgICAgICByZXR1cm4gV1NBRU9QTk9UU1VQUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUEZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVQRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVBRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUREUklOVVNFOiAgICAgICAgcmV0dXJuIFdTQUVBRERSSU5VU0U7IGJyZWFrOwogICAgICAgIGNhc2UgRUFERFJOT1RBVkFJTDogICAgIHJldHVybiBXU0FFQUREUk5PVEFWQUlMOyBicmVhazsKICAgICAgICBjYXNlIEVORVRET1dOOiAgICAgICAgICByZXR1cm4gV1NBRU5FVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRU5FVFVOUkVBQ0g6ICAgICAgIHJldHVybiBXU0FFTkVUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkVUUkVTRVQ6ICAgICAgICAgcmV0dXJuIFdTQUVORVRSRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQ09OTkFCT1JURUQ6ICAgICAgcmV0dXJuIFdTQUVDT05OQUJPUlRFRDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUElQRToKICAgICAgICBjYXNlIEVDT05OUkVTRVQ6ICAgICAgICByZXR1cm4gV1NBRUNPTk5SRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9CVUZTOiAgICAgICAgICAgcmV0dXJuIFdTQUVOT0JVRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRUlTQ09OTjogICAgICAgICAgIHJldHVybiBXU0FFSVNDT05OOyBicmVhazsKICAgICAgICBjYXNlIEVOT1RDT05OOiAgICAgICAgICByZXR1cm4gV1NBRU5PVENPTk47IGJyZWFrOwogICAgICAgIGNhc2UgRVNIVVRET1dOOiAgICAgICAgIHJldHVybiBXU0FFU0hVVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRVRPT01BTllSRUZTOiAgICAgIHJldHVybiBXU0FFVE9PTUFOWVJFRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAgICAgIHJldHVybiBXU0FFVElNRURPVVQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUNPTk5SRUZVU0VEOiAgICAgIHJldHVybiBXU0FFQ09OTlJFRlVTRUQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUxPT1A6ICAgICAgICAgICAgIHJldHVybiBXU0FFTE9PUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkFNRVRPT0xPTkc6ICAgICAgcmV0dXJuIFdTQUVOQU1FVE9PTE9ORzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVERPV046ICAgICAgICAgcmV0dXJuIFdTQUVIT1NURE9XTjsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVFVOUkVBQ0g6ICAgICAgcmV0dXJuIFdTQUVIT1NUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9URU1QVFk6ICAgICAgICAgcmV0dXJuIFdTQUVOT1RFTVBUWTsgYnJlYWs7CiNpZmRlZiBFUFJPQ0xJTQogICAgICAgIGNhc2UgRVBST0NMSU06ICAgICAgICAgIHJldHVybiBXU0FFUFJPQ0xJTTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVVTRVJTCiAgICAgICAgY2FzZSBFVVNFUlM6ICAgICAgICAgICAgcmV0dXJuIFdTQUVVU0VSUzsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRURRVU9UCiAgICAgICAgY2FzZSBFRFFVT1Q6ICAgICAgICAgICAgcmV0dXJuIFdTQUVEUVVPVDsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVNUQUxFCiAgICAgICAgY2FzZSBFU1RBTEU6ICAgICAgICAgICAgcmV0dXJuIFdTQUVTVEFMRTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVJFTU9URQogICAgICAgIGNhc2UgRVJFTU9URTogICAgICAgICAgIHJldHVybiBXU0FFUkVNT1RFOyBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OiBlcnJubz1lcnI7IHBlcnJvcigic29ja19zZXRfZXJyb3IiKTsgcmV0dXJuIFdTQUVGQVVMVDsgYnJlYWs7CiAgICB9Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCkKewogICAgc2V0X2Vycm9yKCBzb2NrX2dldF9lcnJvciggZXJybm8gKSApOwp9CgovKiBjcmVhdGUgYSBzb2NrZXQgKi8KREVDTF9IQU5ETEVSKGNyZWF0ZV9zb2NrZXQpCnsKICAgIHN0cnVjdCBvYmplY3QgKm9iajsKCiAgICByZXBseS0+aGFuZGxlID0gMDsKICAgIGlmICgob2JqID0gY3JlYXRlX3NvY2tldCggcmVxLT5mYW1pbHksIHJlcS0+dHlwZSwgcmVxLT5wcm90b2NvbCwgcmVxLT5mbGFncyApKSAhPSBOVUxMKQogICAgewogICAgICAgIHJlcGx5LT5oYW5kbGUgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIG9iaiwgcmVxLT5hY2Nlc3MsIHJlcS0+aW5oZXJpdCApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKICAgIH0KfQoKLyogYWNjZXB0IGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihhY2NlcHRfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICByZXBseS0+aGFuZGxlID0gMDsKICAgIGlmICgoc29jayA9IGFjY2VwdF9zb2NrZXQoIHJlcS0+bGhhbmRsZSApKSAhPSBOVUxMKQogICAgewogICAgICAgIHJlcGx5LT5oYW5kbGUgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsICZzb2NrLT5vYmosIHJlcS0+YWNjZXNzLCByZXEtPmluaGVyaXQgKTsKICAgICAgICBzb2NrLT53cGFyYW0gPSByZXBseS0+aGFuZGxlOyAgLyogd3BhcmFtIGZvciBtZXNzYWdlIGlzIHRoZSBzb2NrZXQgaGFuZGxlICovCiAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7CiAgICB9Cn0KCi8qIHNldCBzb2NrZXQgZXZlbnQgcGFyYW1ldGVycyAqLwpERUNMX0hBTkRMRVIoc2V0X3NvY2tldF9ldmVudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBzdHJ1Y3QgZXZlbnQgKm9sZF9ldmVudDsKICAgIGludCBwb2xsZXY7CgogICAgaWYgKCEoc29jayA9IChzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCAmc29ja19vcHMpKSkKICAgICAgICByZXR1cm47CiAgICBvbGRfZXZlbnQgPSBzb2NrLT5ldmVudDsKICAgIHNvY2stPm1hc2sgICAgPSByZXEtPm1hc2s7CiAgICBzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgIHNvY2stPndpbmRvdyAgPSByZXEtPndpbmRvdzsKICAgIHNvY2stPm1lc3NhZ2UgPSByZXEtPm1zZzsKICAgIHNvY2stPndwYXJhbSAgPSByZXEtPmhhbmRsZTsgIC8qIHdwYXJhbSBpcyB0aGUgc29ja2V0IGhhbmRsZSAqLwogICAgaWYgKHJlcS0+ZXZlbnQpIHNvY2stPmV2ZW50ID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5ldmVudCwgRVZFTlRfTU9ESUZZX1NUQVRFICk7CgogICAgaWYgKGRlYnVnX2xldmVsICYmIHNvY2stPmV2ZW50KSBmcHJpbnRmKHN0ZGVyciwgImV2ZW50IHB0cjogJXBcbiIsIHNvY2stPmV2ZW50KTsKCiAgICBwb2xsZXYgPSBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICBpZiAoIHBvbGxldiApIHNvY2tfdHJ5X2V2ZW50ICggc29jaywgcG9sbGV2ICk7CgogICAgaWYgKHNvY2stPm1hc2spCiAgICAgICAgc29jay0+c3RhdGUgfD0gRkRfV0lORV9OT05CTE9DS0lORzsKCiAgICAvKiBpZiBhIG5ldHdvcmsgZXZlbnQgaXMgcGVuZGluZywgc2lnbmFsIHRoZSBldmVudCBvYmplY3QKICAgICAgIGl0IGlzIHBvc3NpYmxlIHRoYXQgRkRfQ09OTkVDVCBvciBGRF9BQ0NFUFQgbmV0d29yayBldmVudHMgaGFzIGhhcHBlbmVkCiAgICAgICBiZWZvcmUgYSBXU0FFdmVudFNlbGVjdCgpIHdhcyBkb25lIG9uIGl0LgogICAgICAgKHdoZW4gZGVhbGluZyB3aXRoIEFzeW5jaHJvbm91cyBzb2NrZXQpICAqLwogICAgaWYgKHNvY2stPnBtYXNrICYgc29jay0+bWFzaykgc29ja193YWtlX3VwKCBzb2NrLCBwb2xsZXYgKTsKCiAgICBpZiAob2xkX2V2ZW50KSByZWxlYXNlX29iamVjdCggb2xkX2V2ZW50ICk7IC8qIHdlJ3JlIHRocm91Z2ggd2l0aCBpdCAqLwogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogZ2V0IHNvY2tldCBldmVudCBwYXJhbWV0ZXJzICovCkRFQ0xfSEFORExFUihnZXRfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgewogICAgICAgIHJlcGx5LT5tYXNrICA9IDA7CiAgICAgICAgcmVwbHktPnBtYXNrID0gMDsKICAgICAgICByZXBseS0+c3RhdGUgPSAwOwogICAgICAgIHNldF9lcnJvciggV1NBRU5PVFNPQ0sgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZXBseS0+bWFzayAgPSBzb2NrLT5tYXNrOwogICAgcmVwbHktPnBtYXNrID0gc29jay0+cG1hc2s7CiAgICByZXBseS0+c3RhdGUgPSBzb2NrLT5zdGF0ZTsKICAgIHNldF9yZXBseV9kYXRhKCBzb2NrLT5lcnJvcnMsIG1pbiggZ2V0X3JlcGx5X21heF9zaXplKCksIHNpemVvZihzb2NrLT5lcnJvcnMpICkpOwoKICAgIGlmIChyZXEtPnNlcnZpY2UpCiAgICB7CiAgICAgICAgaWYgKHJlcS0+Y19ldmVudCkKICAgICAgICB7CiAgICAgICAgICAgIHN0cnVjdCBldmVudCAqY2V2ZW50ID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5jX2V2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX01PRElGWV9TVEFURSApOwogICAgICAgICAgICBpZiAoY2V2ZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXNldF9ldmVudCggY2V2ZW50ICk7CiAgICAgICAgICAgICAgICByZWxlYXNlX29iamVjdCggY2V2ZW50ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29jay0+cG1hc2sgPSAwOwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIH0KICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCi8qIHJlLWVuYWJsZSBwZW5kaW5nIHNvY2tldCBldmVudHMgKi8KREVDTF9IQU5ETEVSKGVuYWJsZV9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50IHBvbGxldjsKCiAgICBpZiAoIShzb2NrID0gKHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsICZzb2NrX29wcykpKQogICAgICAgIHJldHVybjsKCiAgICBzb2NrLT5wbWFzayAmPSB+cmVxLT5tYXNrOyAvKiBpcyB0aGlzIHNhZmU/ICovCiAgICBzb2NrLT5obWFzayAmPSB+cmVxLT5tYXNrOwogICAgaWYgKCByZXEtPm1hc2sgJiBGRF9SRUFEICkKICAgICAgICBzb2NrLT5obWFzayAmPSB+RkRfQ0xPU0U7CiAgICBzb2NrLT5zdGF0ZSB8PSByZXEtPnNzdGF0ZTsKICAgIHNvY2stPnN0YXRlICY9IH5yZXEtPmNzdGF0ZTsKICAgIGlmICggc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSApIHNvY2stPnN0YXRlICY9IH5TVFJFQU1fRkxBR19NQVNLOwoKICAgIHBvbGxldiA9IHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGlmICggcG9sbGV2ICkgc29ja190cnlfZXZlbnQgKCBzb2NrLCBwb2xsZXYgKTsKCiAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwp9CgpERUNMX0hBTkRMRVIoc2V0X3NvY2tldF9kZWZlcnJlZCkKewogICAgc3RydWN0IHNvY2sgKnNvY2ssICphY2NlcHRzb2NrOwoKICAgIHNvY2s9KHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzICk7CiAgICBpZiAoICFzb2NrICkKICAgIHsKICAgICAgICBzZXRfZXJyb3IgKCBXU0FFTk9UU09DSyApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGFjY2VwdHNvY2sgPSAoc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLHJlcS0+ZGVmZXJyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzICk7CiAgICBpZiAoICFhY2NlcHRzb2NrICkKICAgIHsKICAgICAgICByZWxlYXNlX29iamVjdCAoIHNvY2sgKTsKICAgICAgICBzZXRfZXJyb3IgKCBXU0FFTk9UU09DSyApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHNvY2stPmRlZmVycmVkID0gYWNjZXB0c29jazsKICAgIHJlbGVhc2Vfb2JqZWN0ICggc29jayApOwp9Cg==