LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIEZJWE1FOiB3ZSB1c2UgcmVhZHx3cml0ZSBhY2Nlc3MgaW4gYWxsIGNhc2VzLiBTaG91bGRuJ3Qgd2UgZGVwZW5kIHRoYXQKICogb24gdGhlIGFjY2VzcyBvZiB0aGUgY3VycmVudCBoYW5kbGU/CiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmZGVmIEhBVkVfU1lTX0VSUk5PX0gKIyBpbmNsdWRlIDxzeXMvZXJybm8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnNvY2syLmgiCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJoYW5kbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgoKc3RydWN0IHNvY2sKewogICAgc3RydWN0IG9iamVjdCAgICAgICBvYmo7ICAgICAgICAgLyogb2JqZWN0IGhlYWRlciAqLwogICAgc3RydWN0IHNlbGVjdF91c2VyICBzZWxlY3Q7ICAgICAgLyogc2VsZWN0IHVzZXIgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgc3RhdGU7ICAgICAgIC8qIHN0YXR1cyBiaXRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIG1hc2s7ICAgICAgICAvKiBldmVudCBtYXNrICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIGhtYXNrOyAgICAgICAvKiBoZWxkIChibG9ja2VkKSBldmVudHMgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgcG1hc2s7ICAgICAgIC8qIHBlbmRpbmcgZXZlbnRzICovCiAgICBzdHJ1Y3QgZXZlbnQgICAgICAgKmV2ZW50OyAgICAgICAvKiBldmVudCBvYmplY3QgKi8KICAgIGludCAgICAgICAgICAgICAgICAgZXJyb3JzW0ZEX01BWF9FVkVOVFNdOyAvKiBldmVudCBlcnJvcnMgKi8KfTsKCnN0YXRpYyB2b2lkIHNvY2tfZHVtcCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApOwpzdGF0aWMgaW50IHNvY2tfYWRkX3F1ZXVlKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB3YWl0X3F1ZXVlX2VudHJ5ICplbnRyeSApOwpzdGF0aWMgdm9pZCBzb2NrX3JlbW92ZV9xdWV1ZSggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3Qgd2FpdF9xdWV1ZV9lbnRyeSAqZW50cnkgKTsKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApOwpzdGF0aWMgaW50IHNvY2tfZ2V0X2ZkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgc29ja19vcHMgPQp7CiAgICBzaXplb2Yoc3RydWN0IHNvY2spLAogICAgc29ja19kdW1wLAogICAgc29ja19hZGRfcXVldWUsCiAgICBzb2NrX3JlbW92ZV9xdWV1ZSwKICAgIHNvY2tfc2lnbmFsZWQsCiAgICBub19zYXRpc2ZpZWQsCiAgICBzb2NrX2dldF9mZCwKICAgIHNvY2tfZ2V0X2ZkLAogICAgbm9fZmx1c2gsCiAgICBub19nZXRfZmlsZV9pbmZvLAogICAgc29ja19kZXN0cm95Cn07CgpzdGF0aWMgaW50IHNvY2tfZXZlbnQoIHN0cnVjdCBzb2NrICpzb2NrICkKewogICAgdW5zaWduZWQgaW50IG1hc2sgPSBzb2NrLT5tYXNrICYgc29jay0+c3RhdGUgJiB+c29jay0+aG1hc2s7CiAgICBpbnQgZXYgPSBFWENFUFRfRVZFTlQ7CgogICAgaWYgKHNvY2stPnN0YXRlICYgV1NfRkRfQ09OTkVDVCkKICAgICAgICAvKiBjb25uZWN0aW5nLCB3YWl0IGZvciB3cml0YWJsZSAqLwogICAgICAgIHJldHVybiBXUklURV9FVkVOVCB8IEVYQ0VQVF9FVkVOVDsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0xJU1RFTklORykKICAgICAgICAvKiBsaXN0ZW5pbmcsIHdhaXQgZm9yIHJlYWRhYmxlICovCiAgICAgICAgcmV0dXJuICgoc29jay0+aG1hc2sgJiBGRF9BQ0NFUFQpID8gMCA6IFJFQURfRVZFTlQpIHwgRVhDRVBUX0VWRU5UOwoKICAgIGlmIChtYXNrICYgRkRfUkVBRCkgIGV2IHw9IFJFQURfRVZFTlQ7CiAgICBpZiAobWFzayAmIEZEX1dSSVRFKSBldiB8PSBXUklURV9FVkVOVDsKICAgIHJldHVybiBldjsKfQoKc3RhdGljIHZvaWQgc29ja19yZXNlbGVjdCggc3RydWN0IHNvY2sgKnNvY2sgKQp7CiAgICBpbnQgZXYgPSBzb2NrX2V2ZW50KCBzb2NrICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tfcmVzZWxlY3QoJWQpOiBuZXcgbWFzayAleFxuIiwgc29jay0+c2VsZWN0LmZkLCBldik7CiAgICBzZXRfc2VsZWN0X2V2ZW50cyggJnNvY2stPnNlbGVjdCwgZXYgKTsKfQoKaW5saW5lIHN0YXRpYyBpbnQgc29ja19lcnJvcihpbnQgcykKewogICAgdW5zaWduZWQgaW50IG9wdHZhbCwgb3B0bGVuOwogICAgCiAgICBvcHRsZW4gPSBzaXplb2Yob3B0dmFsKTsKICAgIGdldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fRVJST1IsICh2b2lkICopICZvcHR2YWwsICZvcHRsZW4pOwogICAgcmV0dXJuIG9wdHZhbDsKfQoKc3RhdGljIHZvaWQgc29ja19zZWxlY3RfZXZlbnQoIGludCBldmVudCwgdm9pZCAqcHJpdmF0ZSApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopcHJpdmF0ZTsKICAgIHVuc2lnbmVkIGludCBlbWFzazsKICAgIGFzc2VydCggc29jay0+b2JqLm9wcyA9PSAmc29ja19vcHMgKTsKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBzZWxlY3QgZXZlbnQ6ICV4XG4iLCBzb2NrLT5zZWxlY3QuZmQsIGV2ZW50KTsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0NPTk5FQ1QpCiAgICB7CiAgICAgICAgLyogY29ubmVjdGluZyAqLwogICAgICAgIGlmIChldmVudCAmIFdSSVRFX0VWRU5UKQogICAgICAgIHsKICAgICAgICAgICAgLyogd2UgZ290IGNvbm5lY3RlZCAqLwogICAgICAgICAgICBzb2NrLT5zdGF0ZSB8PSBXU19GRF9DT05ORUNURUR8V1NfRkRfUkVBRHxXU19GRF9XUklURTsKICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfldTX0ZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DT05ORUNUX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBjb25uZWN0aW9uIHN1Y2Nlc3NcbiIsIHNvY2stPnNlbGVjdC5mZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV2ZW50ICYgRVhDRVBUX0VWRU5UKQogICAgICAgIHsKICAgICAgICAgICAgLyogd2UgZGlkbid0IGdldCBjb25uZWN0ZWQ/ICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5XU19GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gc29ja19lcnJvciggc29jay0+c2VsZWN0LmZkICk7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGNvbm5lY3Rpb24gZmFpbHVyZVxuIiwgc29jay0+c2VsZWN0LmZkKTsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0xJU1RFTklORykKICAgIHsKICAgICAgICAvKiBsaXN0ZW5pbmcgKi8KICAgICAgICBpZiAoZXZlbnQgJiBSRUFEX0VWRU5UKQogICAgICAgIHsKICAgICAgICAgICAgLyogaW5jb21pbmcgY29ubmVjdGlvbiAqLwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9BQ0NFUFRfQklUXSA9IDA7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXZlbnQgJiBFWENFUFRfRVZFTlQpCiAgICAgICAgewogICAgICAgICAgICAvKiBmYWlsZWQgaW5jb21pbmcgY29ubmVjdGlvbj8gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSBzb2NrX2Vycm9yKCBzb2NrLT5zZWxlY3QuZmQgKTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgIH0KICAgIH0gZWxzZQogICAgewogICAgICAgIC8qIG5vcm1hbCBkYXRhIGZsb3cgKi8KICAgICAgICBpZiAoZXZlbnQgJiBSRUFEX0VWRU5UKQogICAgICAgIHsKICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoZXJlJ3MgZGF0YSBoZXJlICovCiAgICAgICAgICAgIGludCBieXRlcyA9IDA7CiAgICAgICAgICAgIGlvY3RsKHNvY2stPnNlbGVjdC5mZCwgRklPTlJFQUQsIChjaGFyKikmYnl0ZXMpOwogICAgICAgICAgICBpZiAoYnl0ZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGluY29taW5nIGRhdGEgKi8KICAgICAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1JFQUQ7CiAgICAgICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1JFQURfQklUXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgaGFzICVkIGJ5dGVzXG4iLCBzb2NrLT5zZWxlY3QuZmQsIGJ5dGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIDAgYnl0ZXMgcmVhZGFibGUgPT0gc29ja2V0IGNsb3NlZCBjbGVhbmx5ICovCiAgICAgICAgICAgICAgICBzb2NrLT5zdGF0ZSAmPSB+KFdTX0ZEX0NPTk5FQ1RFRHxXU19GRF9SRUFEfFdTX0ZEX1dSSVRFKTsKICAgICAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0gPSAwOwogICAgICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGlzIGNsb3NpbmdcbiIsIHNvY2stPnNlbGVjdC5mZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGV2ZW50ICYgV1JJVEVfRVZFTlQpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9XUklURTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9XUklURV9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgaXMgd3JpdGFibGVcbiIsIHNvY2stPnNlbGVjdC5mZCk7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudCAmIEVYQ0VQVF9FVkVOVCkKICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DTE9TRV9CSVRdID0gc29ja19lcnJvciggc29jay0+c2VsZWN0LmZkICk7CiAgICAgICAgICAgIGlmIChzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogd2UgZ290IGFuIGVycm9yLCBzb2NrZXQgY2xvc2luZz8gKi8KICAgICAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH4oV1NfRkRfQ09OTkVDVEVEfFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEUpOwogICAgICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQ0xPU0U7CiAgICAgICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgYWJvcnRlZCBieSBlcnJvciAlZFxuIiwgc29jay0+c2VsZWN0LmZkLCBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBubyBlcnJvciwgT09CIGRhdGE/ICovCiAgICAgICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgZ290IE9PQiBkYXRhXG4iLCBzb2NrLT5zZWxlY3QuZmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIC8qIHdha2UgdXAgYW55b25lIHdhaXRpbmcgZm9yIHdoYXRldmVyIGp1c3QgaGFwcGVuZWQgKi8KICAgIGVtYXNrID0gc29jay0+cG1hc2sgJiBzb2NrLT5tYXNrOwogICAgaWYgKGRlYnVnX2xldmVsICYmIGVtYXNrKQogICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIHBlbmRpbmcgZXZlbnRzOiAleFxuIiwgc29jay0+c2VsZWN0LmZkLCBlbWFzayk7CiAgICBpZiAoZW1hc2sgJiYgc29jay0+ZXZlbnQpIHsKICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYoc3RkZXJyLCAic2lnbmFsbGluZyBldmVudCBwdHIgJXBcbiIsIHNvY2stPmV2ZW50KTsKICAgICAgICBzZXRfZXZlbnQoc29jay0+ZXZlbnQpOwogICAgfQoKICAgIC8qIGlmIGFueW9uZSBpcyBzdHVwaWQgZW5vdWdoIHRvIHdhaXQgb24gdGhlIHNvY2tldCBvYmplY3QgaXRzZWxmLAogICAgICogbWF5YmUgd2Ugc2hvdWxkIHdha2UgdGhlbSB1cCB0b28sIGp1c3QgaW4gY2FzZT8gKi8KICAgIHdha2VfdXAoICZzb2NrLT5vYmosIDAgKTsKfQoKc3RhdGljIHZvaWQgc29ja19kdW1wKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwogICAgcHJpbnRmKCAiU29ja2V0IGZkPSVkLCBzdGF0ZT0leCwgbWFzaz0leCwgcGVuZGluZz0leCwgaGVsZD0leFxuIiwKICAgICAgICAgICAgc29jay0+c2VsZWN0LmZkLCBzb2NrLT5zdGF0ZSwKICAgICAgICAgICAgc29jay0+bWFzaywgc29jay0+cG1hc2ssIHNvY2stPmhtYXNrICk7Cn0KCnN0YXRpYyBpbnQgc29ja19hZGRfcXVldWUoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHdhaXRfcXVldWVfZW50cnkgKmVudHJ5ICkKewovKiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsgKi8KICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgYWRkX3F1ZXVlKCBvYmosIGVudHJ5ICk7CiAgICByZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQgc29ja19yZW1vdmVfcXVldWUoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHdhaXRfcXVldWVfZW50cnkgKmVudHJ5ICkKewovKiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKWdyYWJfb2JqZWN0KG9iaik7ICovCiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIHJlbW92ZV9xdWV1ZSggb2JqLCBlbnRyeSApOwovKiAgICByZWxlYXNlX29iamVjdCggb2JqICk7ICovCn0KCnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgcmV0dXJuIGNoZWNrX3NlbGVjdF9ldmVudHMoICZzb2NrLT5zZWxlY3QsIHNvY2tfZXZlbnQoIHNvY2sgKSApOwp9CgpzdGF0aWMgaW50IHNvY2tfZ2V0X2ZkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGludCBmZDsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBmZCA9IGR1cCggc29jay0+c2VsZWN0LmZkICk7CiAgICBpZiAoZmQ9PS0xKQogICAgCXNvY2tfc2V0X2Vycm9yKCk7CiAgICByZXR1cm4gZmQ7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfZGVzdHJveSggc3RydWN0IG9iamVjdCAqb2JqICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIHVucmVnaXN0ZXJfc2VsZWN0X3VzZXIoICZzb2NrLT5zZWxlY3QgKTsKICAgIC8qIEZJWE1FOiBzcGVjaWFsIHNvY2tldCBzaHV0ZG93biBzdHVmZj8gKi8KICAgIGNsb3NlKCBzb2NrLT5zZWxlY3QuZmQgKTsKICAgIGlmIChzb2NrLT5ldmVudCkKICAgIHsKICAgICAgICAvKiBpZiB0aGUgc2VydmljZSB0aHJlYWQgd2FzIHdhaXRpbmcgZm9yIHRoZSBldmVudCBvYmplY3QsCiAgICAgICAgICogd2Ugc2hvdWxkIG5vdyBzaWduYWwgaXQsIHRvIGxldCB0aGUgc2VydmljZSB0aHJlYWQKICAgICAgICAgKiBvYmplY3QgZGV0ZWN0IHRoYXQgaXQgaXMgbm93IG9ycGhhbmVkLi4uICovCiAgICAgICAgaWYgKHNvY2stPm1hc2sgJiBXU19GRF9TRVJWRVZFTlQpCiAgICAgICAgICAgIHNldF9ldmVudCggc29jay0+ZXZlbnQgKTsKICAgICAgICAvKiB3ZSdyZSB0aHJvdWdoIHdpdGggaXQgKi8KICAgICAgICByZWxlYXNlX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgIH0KfQoKLyogY3JlYXRlIGEgbmV3IGFuZCB1bmNvbm5lY3RlZCBzb2NrZXQgKi8Kc3RhdGljIHN0cnVjdCBvYmplY3QgKmNyZWF0ZV9zb2NrZXQoIGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludCBzb2NrZmQ7CgogICAgc29ja2ZkID0gc29ja2V0KCBmYW1pbHksIHR5cGUsIHByb3RvY29sICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tldCglZCwlZCwlZCk9JWRcbiIsZmFtaWx5LHR5cGUscHJvdG9jb2wsc29ja2ZkKTsKICAgIGlmIChzb2NrZmQgPT0gLTEpIHsKICAgICAgICBzb2NrX3NldF9lcnJvcigpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgZmNudGwoc29ja2ZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsgLyogbWFrZSBzb2NrZXQgbm9uYmxvY2tpbmcgKi8KICAgIGlmICghKHNvY2sgPSBhbGxvY19vYmplY3QoICZzb2NrX29wcyApKSkgewogICAgICAgIGNsb3NlKCBzb2NrZmQgKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHNvY2stPnNlbGVjdC5mZCAgICAgID0gc29ja2ZkOwogICAgc29jay0+c2VsZWN0LmZ1bmMgICAgPSBzb2NrX3NlbGVjdF9ldmVudDsKICAgIHNvY2stPnNlbGVjdC5wcml2YXRlID0gc29jazsKICAgIHNvY2stPnN0YXRlICAgICAgICAgID0gKHR5cGUhPVNPQ0tfU1RSRUFNKSA/IFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEUgOiAwOwogICAgc29jay0+bWFzayAgICAgICAgICAgPSAwOwogICAgc29jay0+aG1hc2sgICAgICAgICAgPSAwOwogICAgc29jay0+cG1hc2sgICAgICAgICAgPSAwOwogICAgc29jay0+ZXZlbnQgICAgICAgICAgPSBOVUxMOwogICAgcmVnaXN0ZXJfc2VsZWN0X3VzZXIoICZzb2NrLT5zZWxlY3QgKTsKICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGNsZWFyX2Vycm9yKCk7CiAgICByZXR1cm4gJnNvY2stPm9iajsKfQoKLyogYWNjZXB0IGEgc29ja2V0IChjcmVhdGVzIGEgbmV3IGZkKSAqLwpzdGF0aWMgc3RydWN0IG9iamVjdCAqYWNjZXB0X3NvY2tldCggaW50IGhhbmRsZSApCnsKICAgIHN0cnVjdCBzb2NrICphY2NlcHRzb2NrOwogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBpbnQJYWNjZXB0ZmQ7CiAgICBzdHJ1Y3Qgc29ja2FkZHIJc2FkZHI7CiAgICBpbnQJCQlzbGVuOwoKICAgIHNvY2s9KHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaihjdXJyZW50LT5wcm9jZXNzLGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgCXJldHVybiBOVUxMOwogICAgLyogVHJ5IHRvIGFjY2VwdCgyKS4gV2UgY2FuJ3QgYmUgc2FmZSB0aGF0IHRoaXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0IAogICAgICogb3IgdGhhdCBhY2NlcHQoKSBpcyBhbGxvd2VkIG9uIGl0LiBJbiB0aG9zZSBjYXNlcyB3ZSB3aWxsIGdldCAtMS9lcnJubwogICAgICogcmV0dXJuLgogICAgICovCiAgICBzbGVuID0gc2l6ZW9mKHNhZGRyKTsKICAgIGFjY2VwdGZkID0gYWNjZXB0KHNvY2stPnNlbGVjdC5mZCwmc2FkZHIsJnNsZW4pOwogICAgaWYgKGFjY2VwdGZkPT0tMSkgewogICAgCXNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKCXJldHVybiBOVUxMOwogICAgfQogICAgaWYgKCEoYWNjZXB0c29jayA9IGFsbG9jX29iamVjdCggJnNvY2tfb3BzICkpKQogICAgewogICAgICAgIGNsb3NlKCBhY2NlcHRmZCApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgYWNjZXB0c29jay0+c2VsZWN0LmZkICAgICAgPSBhY2NlcHRmZDsKICAgIGFjY2VwdHNvY2stPnNlbGVjdC5mdW5jICAgID0gc29ja19zZWxlY3RfZXZlbnQ7CiAgICBhY2NlcHRzb2NrLT5zZWxlY3QucHJpdmF0ZSA9IGFjY2VwdHNvY2s7CiAgICBhY2NlcHRzb2NrLT5zdGF0ZSAgICAgICAgICA9IFdTX0ZEX0NPTk5FQ1RFRHxXU19GRF9SRUFEfFdTX0ZEX1dSSVRFOwogICAgYWNjZXB0c29jay0+bWFzayAgICAgICAgICAgPSBzb2NrLT5tYXNrOwogICAgYWNjZXB0c29jay0+aG1hc2sgICAgICAgICAgPSAwOwogICAgYWNjZXB0c29jay0+cG1hc2sgICAgICAgICAgPSAwOwogICAgaWYgKHNvY2stPmV2ZW50KQogICAgICAgIGFjY2VwdHNvY2stPmV2ZW50ICAgICAgICAgID0gKHN0cnVjdCBldmVudCAqKWdyYWJfb2JqZWN0KCBzb2NrLT5ldmVudCApOwogICAgZWxzZQogICAgICAgIGFjY2VwdHNvY2stPmV2ZW50ICAgICAgICAgID0gTlVMTDsKCiAgICByZWdpc3Rlcl9zZWxlY3RfdXNlciggJmFjY2VwdHNvY2stPnNlbGVjdCApOwogICAgc29ja19yZXNlbGVjdCggYWNjZXB0c29jayApOwogICAgY2xlYXJfZXJyb3IoKTsKICAgIHNvY2stPnBtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICBzb2NrLT5obWFzayAmPSB+RkRfQUNDRVBUOwogICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgIHJldHVybiAmYWNjZXB0c29jay0+b2JqOwp9CgovKiBzZXQgdGhlIGxhc3QgZXJyb3IgZGVwZW5kaW5nIG9uIGVycm5vICovCnN0YXRpYyB2b2lkIHNvY2tfc2V0X2Vycm9yKHZvaWQpCnsKICAgIHN3aXRjaCAoZXJybm8pCiAgICB7CiAgICAgICAgY2FzZSBFSU5UUjogICAgICAgICAgICAgc2V0X2Vycm9yKFdTQUVJTlRSKTticmVhazsKICAgICAgICBjYXNlIEVCQURGOiAgICAgICAgICAgICBzZXRfZXJyb3IoV1NBRUJBREYpO2JyZWFrOwogICAgICAgIGNhc2UgRVBFUk06CiAgICAgICAgY2FzZSBFQUNDRVM6ICAgICAgICAgICAgc2V0X2Vycm9yKFdTQUVBQ0NFUyk7YnJlYWs7CiAgICAgICAgY2FzZSBFRkFVTFQ6ICAgICAgICAgICAgc2V0X2Vycm9yKFdTQUVGQVVMVCk7YnJlYWs7CiAgICAgICAgY2FzZSBFSU5WQUw6ICAgICAgICAgICAgc2V0X2Vycm9yKFdTQUVJTlZBTCk7YnJlYWs7CiAgICAgICAgY2FzZSBFTUZJTEU6ICAgICAgICAgICAgc2V0X2Vycm9yKFdTQUVNRklMRSk7YnJlYWs7CiAgICAgICAgY2FzZSBFV09VTERCTE9DSzogICAgICAgc2V0X2Vycm9yKFdTQUVXT1VMREJMT0NLKTticmVhazsKICAgICAgICBjYXNlIEVJTlBST0dSRVNTOiAgICAgICBzZXRfZXJyb3IoV1NBRUlOUFJPR1JFU1MpO2JyZWFrOwogICAgICAgIGNhc2UgRUFMUkVBRFk6ICAgICAgICAgIHNldF9lcnJvcihXU0FFQUxSRUFEWSk7YnJlYWs7CiAgICAgICAgY2FzZSBFTk9UU09DSzogICAgICAgICAgc2V0X2Vycm9yKFdTQUVOT1RTT0NLKTticmVhazsKICAgICAgICBjYXNlIEVERVNUQUREUlJFUTogICAgICBzZXRfZXJyb3IoV1NBRURFU1RBRERSUkVRKTticmVhazsKICAgICAgICBjYXNlIEVNU0dTSVpFOiAgICAgICAgICBzZXRfZXJyb3IoV1NBRU1TR1NJWkUpO2JyZWFrOwogICAgICAgIGNhc2UgRVBST1RPVFlQRTogICAgICAgIHNldF9lcnJvcihXU0FFUFJPVE9UWVBFKTticmVhazsKICAgICAgICBjYXNlIEVOT1BST1RPT1BUOiAgICAgICBzZXRfZXJyb3IoV1NBRU5PUFJPVE9PUFQpO2JyZWFrOwogICAgICAgIGNhc2UgRVBST1RPTk9TVVBQT1JUOiAgIHNldF9lcnJvcihXU0FFUFJPVE9OT1NVUFBPUlQpO2JyZWFrOwogICAgICAgIGNhc2UgRVNPQ0tUTk9TVVBQT1JUOiAgIHNldF9lcnJvcihXU0FFU09DS1ROT1NVUFBPUlQpO2JyZWFrOwogICAgICAgIGNhc2UgRU9QTk9UU1VQUDogICAgICAgIHNldF9lcnJvcihXU0FFT1BOT1RTVVBQKTticmVhazsKICAgICAgICBjYXNlIEVQRk5PU1VQUE9SVDogICAgICBzZXRfZXJyb3IoV1NBRVBGTk9TVVBQT1JUKTticmVhazsKICAgICAgICBjYXNlIEVBRk5PU1VQUE9SVDogICAgICBzZXRfZXJyb3IoV1NBRUFGTk9TVVBQT1JUKTticmVhazsKICAgICAgICBjYXNlIEVBRERSSU5VU0U6ICAgICAgICBzZXRfZXJyb3IoV1NBRUFERFJJTlVTRSk7YnJlYWs7CiAgICAgICAgY2FzZSBFQUREUk5PVEFWQUlMOiAgICAgc2V0X2Vycm9yKFdTQUVBRERSTk9UQVZBSUwpO2JyZWFrOwogICAgICAgIGNhc2UgRU5FVERPV046ICAgICAgICAgIHNldF9lcnJvcihXU0FFTkVURE9XTik7YnJlYWs7CiAgICAgICAgY2FzZSBFTkVUVU5SRUFDSDogICAgICAgc2V0X2Vycm9yKFdTQUVORVRVTlJFQUNIKTticmVhazsKICAgICAgICBjYXNlIEVORVRSRVNFVDogICAgICAgICBzZXRfZXJyb3IoV1NBRU5FVFJFU0VUKTticmVhazsKICAgICAgICBjYXNlIEVDT05OQUJPUlRFRDogICAgICBzZXRfZXJyb3IoV1NBRUNPTk5BQk9SVEVEKTticmVhazsKICAgICAgICBjYXNlIEVQSVBFOgogICAgICAgIGNhc2UgRUNPTk5SRVNFVDogICAgICAgIHNldF9lcnJvcihXU0FFQ09OTlJFU0VUKTticmVhazsKICAgICAgICBjYXNlIEVOT0JVRlM6ICAgICAgICAgICBzZXRfZXJyb3IoV1NBRU5PQlVGUyk7YnJlYWs7CiAgICAgICAgY2FzZSBFSVNDT05OOiAgICAgICAgICAgc2V0X2Vycm9yKFdTQUVJU0NPTk4pO2JyZWFrOwogICAgICAgIGNhc2UgRU5PVENPTk46ICAgICAgICAgIHNldF9lcnJvcihXU0FFTk9UQ09OTik7YnJlYWs7CiAgICAgICAgY2FzZSBFU0hVVERPV046ICAgICAgICAgc2V0X2Vycm9yKFdTQUVTSFVURE9XTik7YnJlYWs7CiAgICAgICAgY2FzZSBFVE9PTUFOWVJFRlM6ICAgICAgc2V0X2Vycm9yKFdTQUVUT09NQU5ZUkVGUyk7YnJlYWs7CiAgICAgICAgY2FzZSBFVElNRURPVVQ6ICAgICAgICAgc2V0X2Vycm9yKFdTQUVUSU1FRE9VVCk7YnJlYWs7CiAgICAgICAgY2FzZSBFQ09OTlJFRlVTRUQ6ICAgICAgc2V0X2Vycm9yKFdTQUVDT05OUkVGVVNFRCk7YnJlYWs7CiAgICAgICAgY2FzZSBFTE9PUDogICAgICAgICAgICAgc2V0X2Vycm9yKFdTQUVMT09QKTticmVhazsKICAgICAgICBjYXNlIEVOQU1FVE9PTE9ORzogICAgICBzZXRfZXJyb3IoV1NBRU5BTUVUT09MT05HKTticmVhazsKICAgICAgICBjYXNlIEVIT1NURE9XTjogICAgICAgICBzZXRfZXJyb3IoV1NBRUhPU1RET1dOKTticmVhazsKICAgICAgICBjYXNlIEVIT1NUVU5SRUFDSDogICAgICBzZXRfZXJyb3IoV1NBRUhPU1RVTlJFQUNIKTticmVhazsKICAgICAgICBjYXNlIEVOT1RFTVBUWTogICAgICAgICBzZXRfZXJyb3IoV1NBRU5PVEVNUFRZKTticmVhazsKI2lmZGVmIEVQUk9DTElNCiAgICAgICAgY2FzZSBFUFJPQ0xJTTogICAgICAgICAgc2V0X2Vycm9yKFdTQUVQUk9DTElNKTticmVhazsKI2VuZGlmCiNpZmRlZiBFVVNFUlMKICAgICAgICBjYXNlIEVVU0VSUzogICAgICAgICAgICBzZXRfZXJyb3IoV1NBRVVTRVJTKTticmVhazsKI2VuZGlmCiNpZmRlZiBFRFFVT1QKICAgICAgICBjYXNlIEVEUVVPVDogICAgICAgICAgICBzZXRfZXJyb3IoV1NBRURRVU9UKTticmVhazsKI2VuZGlmCiNpZmRlZiBFU1RBTEUKICAgICAgICBjYXNlIEVTVEFMRTogICAgICAgICAgICBzZXRfZXJyb3IoV1NBRVNUQUxFKTticmVhazsKI2VuZGlmCiNpZmRlZiBFUkVNT1RFCiAgICAgICAgY2FzZSBFUkVNT1RFOiAgICAgICAgICAgc2V0X2Vycm9yKFdTQUVSRU1PVEUpO2JyZWFrOwojZW5kaWYKICAgIGRlZmF1bHQ6ICAgICAgICBwZXJyb3IoInNvY2tfc2V0X2Vycm9yIik7IHNldF9lcnJvciggRVJST1JfVU5LTk9XTiApOyBicmVhazsKICAgIH0KfQoKLyogY3JlYXRlIGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihjcmVhdGVfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CiAgICBpbnQgcyA9IC0xOwoKICAgIGlmICgob2JqID0gY3JlYXRlX3NvY2tldCggcmVxLT5mYW1pbHksIHJlcS0+dHlwZSwgcmVxLT5wcm90b2NvbCApKSAhPSBOVUxMKQogICAgewogICAgICAgIHMgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIG9iaiwgcmVxLT5hY2Nlc3MsIHJlcS0+aW5oZXJpdCApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKICAgIH0KICAgIHJlcS0+aGFuZGxlID0gczsKfQoKLyogYWNjZXB0IGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihhY2NlcHRfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CiAgICBpbnQgcyA9IC0xOwoKICAgIGlmICgob2JqID0gYWNjZXB0X3NvY2tldCggcmVxLT5saGFuZGxlICkpICE9IE5VTEwpCiAgICB7CiAgICAgICAgcyA9IGFsbG9jX2hhbmRsZSggY3VycmVudC0+cHJvY2Vzcywgb2JqLCByZXEtPmFjY2VzcywgcmVxLT5pbmhlcml0ICk7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIG9iaiApOwogICAgfQogICAgcmVxLT5oYW5kbGUgPSBzOwp9CgovKiBzZXQgc29ja2V0IGV2ZW50IHBhcmFtZXRlcnMgKi8KREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgc3RydWN0IGV2ZW50ICpvZXZlbnQ7CiAgICB1bnNpZ25lZCBpbnQgb21hc2s7CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MscmVxLT5oYW5kbGUsR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzKTsKICAgIGlmICghc29jaykKCXJldHVybjsKICAgIG9ldmVudCA9IHNvY2stPmV2ZW50OwogICAgb21hc2sgID0gc29jay0+bWFzazsKICAgIHNvY2stPm1hc2sgICAgPSByZXEtPm1hc2s7CiAgICBzb2NrLT5ldmVudCAgID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5ldmVudCwgRVZFTlRfTU9ESUZZX1NUQVRFICk7CiAgICBpZiAoZGVidWdfbGV2ZWwgJiYgc29jay0+ZXZlbnQpIGZwcmludGYoc3RkZXJyLCAiZXZlbnQgcHRyOiAlcFxuIiwgc29jay0+ZXZlbnQpOwogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKHNvY2stPm1hc2spCiAgICAgICAgc29jay0+c3RhdGUgfD0gV1NfRkRfTk9OQkxPQ0tJTkc7CiAgICBpZiAob2V2ZW50KQogICAgewogICAgCWlmICgob2V2ZW50ICE9IHNvY2stPmV2ZW50KSAmJiAob21hc2sgJiBXU19GRF9TRVJWRVZFTlQpKQogICAgICAgICAgICAvKiBpZiB0aGUgc2VydmljZSB0aHJlYWQgd2FzIHdhaXRpbmcgZm9yIHRoZSBvbGQgZXZlbnQgb2JqZWN0LAogICAgICAgICAgICAgKiB3ZSBzaG91bGQgbm93IHNpZ25hbCBpdCwgdG8gbGV0IHRoZSBzZXJ2aWNlIHRocmVhZAogICAgICAgICAgICAgKiBvYmplY3QgZGV0ZWN0IHRoYXQgaXQgaXMgbm93IG9ycGhhbmVkLi4uICovCiAgICAgICAgICAgIHNldF9ldmVudCggb2V2ZW50ICk7CiAgICAgICAgLyogd2UncmUgdGhyb3VnaCB3aXRoIGl0ICovCiAgICAgICAgcmVsZWFzZV9vYmplY3QoIG9ldmVudCApOwogICAgfQogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogZ2V0IHNvY2tldCBldmVudCBwYXJhbWV0ZXJzICovCkRFQ0xfSEFORExFUihnZXRfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgewoJcmVxLT5tYXNrICA9IDA7CglyZXEtPnBtYXNrID0gMDsKCXJlcS0+c3RhdGUgPSAwOwoJc2V0X2Vycm9yKFdTQUVOT1RTT0NLKTsKCXJldHVybjsKICAgIH0KICAgIHJlcS0+bWFzayAgICA9IHNvY2stPm1hc2s7CiAgICByZXEtPnBtYXNrICAgPSBzb2NrLT5wbWFzazsKICAgIHJlcS0+c3RhdGUgICA9IHNvY2stPnN0YXRlOwogICAgbWVtY3B5KHJlcS0+ZXJyb3JzLCBzb2NrLT5lcnJvcnMsIHNpemVvZihzb2NrLT5lcnJvcnMpKTsKICAgIGNsZWFyX2Vycm9yKCk7CiAgICBpZiAocmVxLT5zZXJ2aWNlKQogICAgewogICAgICAgIGlmIChyZXEtPnNfZXZlbnQpCiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgZXZlbnQgKnNldmVudCA9IGdldF9ldmVudF9vYmooY3VycmVudC0+cHJvY2VzcywgcmVxLT5zX2V2ZW50LCAwKTsKICAgICAgICAgICAgaWYgKHNldmVudCA9PSBzb2NrLT5ldmVudCkKICAgICAgICAgICAgICAgIHJlcS0+c19ldmVudCA9IDA7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzZXZlbnQgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFyZXEtPnNfZXZlbnQpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayA9IDA7CiAgICAgICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBzZXRfZXJyb3IoV1NBRUlOVkFMKTsKICAgIH0KICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCi8qIHJlLWVuYWJsZSBwZW5kaW5nIHNvY2tldCBldmVudHMgKi8KREVDTF9IQU5ETEVSKGVuYWJsZV9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwoKICAgIHNvY2s9KHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaihjdXJyZW50LT5wcm9jZXNzLHJlcS0+aGFuZGxlLEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyk7CiAgICBpZiAoIXNvY2spCiAgICAJcmV0dXJuOwogICAgc29jay0+cG1hc2sgJj0gfnJlcS0+bWFzazsgLyogaXMgdGhpcyBzYWZlPyAqLwogICAgc29jay0+aG1hc2sgJj0gfnJlcS0+bWFzazsKICAgIHNvY2stPnN0YXRlIHw9IHJlcS0+c3N0YXRlOwogICAgc29jay0+c3RhdGUgJj0gfnJlcS0+Y3N0YXRlOwogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQo=