Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIE1pbmkgaW5zbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CiAqCiAqIFRoaXMgdmVyc2lvbiBvZiBpbnNtb2Qgc3VwcG9ydHMgeDg2LCBBUk0sIFNIMy80LCBwb3dlcnBjLCBtNjhrLCAKICogYW5kIE1JUFMuCiAqCiAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIGJ5IExpbmVvLCBpbmMuIGFuZCBFcmlrIEFuZGVyc2VuCiAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4KICogYW5kIFJvbiBBbGRlciA8YWxkZXJAbGluZW8uY29tPgogKgogKiBNb2RpZmllZCBieSBCcnlhbiBSaXR0bWV5ZXIgPGJyeWFuQGl4aWFjb20uY29tPiB0byBzdXBwb3J0IFNINAogKiBhbmQgKHRoZW9yZXRpY2FsbHkpIFNIMy4gSSBoYXZlIG9ubHkgdGVzdGVkIFNINCBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCiAqCiAqIE1vZGlmaWVkIGJ5IEFsY292ZSwgSnVsaWVuIEdhdWxtaW4gPGp1bGllbi5nYXVsbWluQGFsY292ZS5mcj4gYW5kCiAqIE5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYWxjb3ZlLmZyPiB0byBzdXBwb3J0IEFSTTdURE1JLiAgT25seQogKiB2ZXJ5IG1pbm9yIGNoYW5nZXMgcmVxdWlyZWQgdG8gYWxzbyB3b3JrIHdpdGggU3Ryb25nQXJtIGFuZCBwcmVzdW1hYmx5CiAqIGFsbCBBUk0gYmFzZWQgc3lzdGVtcy4KICoKICogTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4gYWRkZWQgUG93ZXJQQyBzdXBwb3J0IDIwLUZlYi0yMDAxLgogKiAgIFBvd2VyUEMgc3BlY2lmaWMgY29kZSBzdG9sZW4gZnJvbSBtb2R1dGlscy0yLjMuMTYsIAogKiAgIHdyaXR0ZW4gYnkgUGF1bCBNYWNrZXJyYXMsIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCiAqICAgSSd2ZSBvbmx5IHRlc3RlZCB0aGUgY29kZSBvbiBtcGM4eHggcGxhdGZvcm1zIGluIGJpZy1lbmRpYW4gbW9kZS4KICogICBEaWQgc29tZSBjbGVhbnVwIGFuZCBhZGRlZCBDT05GSUdfVVNFX3h4eF9FTlRSSUVTLi4uCiAqCiAqIFF1aW5uIEplbnNlbiA8amVuc2VucUBsaW5lby5jb20+IGFkZGVkIE1JUFMgc3VwcG9ydCAyMy1GZWItMjAwMS4KICogICBiYXNlZCBvbiBtb2R1dGlscy0yLjQuMgogKiAgIE1JUFMgc3BlY2lmaWMgc3VwcG9ydCBmb3IgRWxmIGxvYWRpbmcgYW5kIHJlbG9jYXRpb24uCiAqICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KICogICBDb250cmlidXRlZCBieSBSYWxmIEJhZWNobGUgPHJhbGZAZ251LmFpLm1pdC5lZHU+CiAqCiAqIEJhc2VkIGFsbW9zdCBlbnRpcmVseSBvbiB0aGUgTGludXggbW9kdXRpbHMtMi4zLjExIGltcGxlbWVudGF0aW9uLgogKiAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCiAqICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CiAqICAgQmFzZWQgb24gb3JpZ2luYWwgd29yayBieSBCam9ybiBFa3dhbGwgPGJqMHJuQGJsb3guc2U+CiAqICAgUmVzdHJ1Y3R1cmVkIChhbmQgcGFydGx5IHJld3JpdHRlbikgYnk6CiAqICAgQmr2cm4gRWt3YWxsIDxiajBybkBibG94LnNlPiBGZWJydWFyeSAxOTk5CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCiAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICoKICovCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxkaXJlbnQuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgojaW5jbHVkZSAiYnVzeWJveC5oIgoKI2lmZGVmIENPTkZJR19GRUFUVVJFX05FV19NT0RVTEVfSU5URVJGQUNFCiMgdW5kZWYgQ09ORklHX0ZFQVRVUkVfT0xEX01PRFVMRV9JTlRFUkZBQ0UKIyBkZWZpbmUgbmV3X3N5c19pbml0X21vZHVsZQlpbml0X21vZHVsZQojZWxzZQojIGRlZmluZSBvbGRfc3lzX2luaXRfbW9kdWxlCWluaXRfbW9kdWxlCiNlbmRpZgoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNCiNkZWZpbmUgTE9BREJJVFMgMAkKI2Vsc2UKI2RlZmluZSBMT0FEQklUUyAxCiNlbmRpZgoKI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCiNkZWZpbmUgQ09ORklHX1VTRV9QTFRfRU5UUklFUwojZGVmaW5lIENPTkZJR19QTFRfRU5UUllfU0laRSAxNgojZW5kaWYKCiNpZiBkZWZpbmVkKF9fYXJtX18pCiNkZWZpbmUgQ09ORklHX1VTRV9QTFRfRU5UUklFUwojZGVmaW5lIENPTkZJR19QTFRfRU5UUllfU0laRSA4CiNkZWZpbmUgQ09ORklHX1VTRV9HT1RfRU5UUklFUwojZGVmaW5lIENPTkZJR19HT1RfRU5UUllfU0laRSA4CiNlbmRpZgoKI2lmIGRlZmluZWQoX19zaF9fKQojZGVmaW5lIENPTkZJR19VU0VfR09UX0VOVFJJRVMKI2RlZmluZSBDT05GSUdfR09UX0VOVFJZX1NJWkUgNAojZW5kaWYKCiNpZiBkZWZpbmVkKF9faTM4Nl9fKQojZGVmaW5lIENPTkZJR19VU0VfR09UX0VOVFJJRVMKI2RlZmluZSBDT05GSUdfR09UX0VOVFJZX1NJWkUgNAojZW5kaWYKCiNpZiBkZWZpbmVkKF9fbWlwc19fKQovLyBuZWl0aGVyIHVzZWQKI2VuZGlmCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8tLS0tLS0tLW1vZHV0aWxzIG1vZHVsZS5oLCBsaW5lcyA0NS0yNDIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKiBEZWZpbml0aW9ucyBmb3IgdGhlIExpbnV4IG1vZHVsZSBzeXNjYWxsIGludGVyZmFjZS4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KCiAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXggbW9kdXRpbHMuCgogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgogICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKCiNpZm5kZWYgTU9EVVRJTFNfTU9EVUxFX0gKc3RhdGljIGNvbnN0IGludCBNT0RVVElMU19NT0RVTEVfSCA9IDE7CgojaWRlbnQgIiRJZDogaW5zbW9kLmMsdiAxLjc1IDIwMDEvMTEvMTIgMTY6NTc6MjYga3JhYWkgRXhwICQiCgovKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgMi4wIGFuZCAyLjEga2VybmVscy4KICAgV2UgZG8gbm90IHVzZSB0aGUga2VybmVsIGhlYWRlcnMgZGlyZWN0bHkgYmVjYXVzZSB3ZSBkbyBub3Qgd2lzaAogICB0byBiZSBkZXBlbmRhbnQgb24gYSBwYXJ0aWN1bGFyIGtlcm5lbCB2ZXJzaW9uIHRvIGNvbXBpbGUgaW5zbW9kLiAgKi8KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBUaGUgc3RydWN0dXJlcyB1c2VkIGJ5IExpbnV4IDIuMC4gICovCgovKiBUaGUgc3ltYm9sIGZvcm1hdCB1c2VkIGJ5IGdldF9rZXJuZWxfc3ltcygyKS4gICovCnN0cnVjdCBvbGRfa2VybmVsX3N5bQp7CiAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKICBjaGFyIG5hbWVbNjBdOwp9OwoKc3RydWN0IG9sZF9tb2R1bGVfcmVmCnsKICB1bnNpZ25lZCBsb25nIG1vZHVsZTsJCS8qIGtlcm5lbCBhZGRyZXNzZXMgKi8KICB1bnNpZ25lZCBsb25nIG5leHQ7Cn07CgpzdHJ1Y3Qgb2xkX21vZHVsZV9zeW1ib2wKewogIHVuc2lnbmVkIGxvbmcgYWRkcjsKICB1bnNpZ25lZCBsb25nIG5hbWU7Cn07CgpzdHJ1Y3Qgb2xkX3N5bWJvbF90YWJsZQp7CiAgaW50IHNpemU7CQkJLyogdG90YWwsIGluY2x1ZGluZyBzdHJpbmcgdGFibGUhISEgKi8KICBpbnQgbl9zeW1ib2xzOwogIGludCBuX3JlZnM7CiAgc3RydWN0IG9sZF9tb2R1bGVfc3ltYm9sIHN5bWJvbFswXTsgLyogYWN0dWFsIHNpemUgZGVmaW5lZCBieSBuX3N5bWJvbHMgKi8KICBzdHJ1Y3Qgb2xkX21vZHVsZV9yZWYgcmVmWzBdOwkvKiBhY3R1YWwgc2l6ZSBkZWZpbmVkIGJ5IG5fcmVmcyAqLwp9OwoKc3RydWN0IG9sZF9tb2Rfcm91dGluZXMKewogIHVuc2lnbmVkIGxvbmcgaW5pdDsKICB1bnNpZ25lZCBsb25nIGNsZWFudXA7Cn07CgpzdHJ1Y3Qgb2xkX21vZHVsZQp7CiAgdW5zaWduZWQgbG9uZyBuZXh0OwogIHVuc2lnbmVkIGxvbmcgcmVmOwkJLyogdGhlIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IHJlZmVyIHRvIG1lICovCiAgdW5zaWduZWQgbG9uZyBzeW10YWI7CiAgdW5zaWduZWQgbG9uZyBuYW1lOwogIGludCBzaXplOwkJCS8qIHNpemUgb2YgbW9kdWxlIGluIHBhZ2VzICovCiAgdW5zaWduZWQgbG9uZyBhZGRyOwkJLyogYWRkcmVzcyBvZiBtb2R1bGUgKi8KICBpbnQgc3RhdGU7CiAgdW5zaWduZWQgbG9uZyBjbGVhbnVwOwkvKiBjbGVhbnVwIHJvdXRpbmUgKi8KfTsKCi8qIFNlbnQgdG8gaW5pdF9tb2R1bGUoMikgb3InZWQgaW50byB0aGUgY29kZSBzaXplIHBhcmFtZXRlci4gICovCnN0YXRpYyBjb25zdCBpbnQgT0xEX01PRF9BVVRPQ0xFQU4gPSAweDQwMDAwMDAwOyAvKiBiaWcgZW5vdWdoLCBidXQgbm8gc2lnbiBwcm9ibGVtcy4uLiAqLwoKaW50IGdldF9rZXJuZWxfc3ltcyhzdHJ1Y3Qgb2xkX2tlcm5lbF9zeW0gKik7CmludCBvbGRfc3lzX2luaXRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmNvZGUsIHVuc2lnbmVkIGNvZGVzaXplLAoJCQlzdHJ1Y3Qgb2xkX21vZF9yb3V0aW5lcyAqLCBzdHJ1Y3Qgb2xkX3N5bWJvbF90YWJsZSAqKTsKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qIEZvciBzaXplb2YoKSB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgbW9kdWxlIHBsYXRmb3JtIGFuZCBub3QgdG8gdGhlCiAgIGVudmlyb25tZW50IGlzbm1vZCBpcyBydW5uaW5nIGluLCB1c2Ugc2l6ZW9mX3h4IGluc3RlYWQgb2Ygc2l6ZW9mKHh4KS4gICovCgojZGVmaW5lIHRndF9zaXplb2ZfY2hhcgkJc2l6ZW9mKGNoYXIpCiNkZWZpbmUgdGd0X3NpemVvZl9zaG9ydAlzaXplb2Yoc2hvcnQpCiNkZWZpbmUgdGd0X3NpemVvZl9pbnQJCXNpemVvZihpbnQpCiNkZWZpbmUgdGd0X3NpemVvZl9sb25nCQlzaXplb2YobG9uZykKI2RlZmluZSB0Z3Rfc2l6ZW9mX2NoYXJfcAlzaXplb2YoY2hhciAqKQojZGVmaW5lIHRndF9zaXplb2Zfdm9pZF9wCXNpemVvZih2b2lkICopCiNkZWZpbmUgdGd0X2xvbmcJCWxvbmcKCiNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgIWRlZmluZWQoX19zcGFyY192OV9fKSAmJiBkZWZpbmVkKEFSQ0hfc3BhcmM2NCkKI3VuZGVmIHRndF9zaXplb2ZfbG9uZwojdW5kZWYgdGd0X3NpemVvZl9jaGFyX3AKI3VuZGVmIHRndF9zaXplb2Zfdm9pZF9wCiN1bmRlZiB0Z3RfbG9uZwpzdGF0aWMgY29uc3QgaW50IHRndF9zaXplb2ZfbG9uZyA9IDg7CnN0YXRpYyBjb25zdCBpbnQgdGd0X3NpemVvZl9jaGFyX3AgPSA4OwpzdGF0aWMgY29uc3QgaW50IHRndF9zaXplb2Zfdm9pZF9wID0gODsKI2RlZmluZSB0Z3RfbG9uZwkJbG9uZyBsb25nCiNlbmRpZgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogVGhlIHN0cnVjdHVyZXMgdXNlZCBpbiBMaW51eCAyLjEuICAqLwoKLyogTm90ZTogbmV3X21vZHVsZV9zeW1ib2wgZG9lcyBub3QgdXNlIHRndF9sb25nIGludGVudGlvbmFsbHkgKi8Kc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sCnsKICB1bnNpZ25lZCBsb25nIHZhbHVlOwogIHVuc2lnbmVkIGxvbmcgbmFtZTsKfTsKCnN0cnVjdCBuZXdfbW9kdWxlX3BlcnNpc3Q7CgpzdHJ1Y3QgbmV3X21vZHVsZV9yZWYKewogIHVuc2lnbmVkIHRndF9sb25nIGRlcDsJCS8qIGtlcm5lbCBhZGRyZXNzZXMgKi8KICB1bnNpZ25lZCB0Z3RfbG9uZyByZWY7CiAgdW5zaWduZWQgdGd0X2xvbmcgbmV4dF9yZWY7Cn07CgpzdHJ1Y3QgbmV3X21vZHVsZQp7CiAgdW5zaWduZWQgdGd0X2xvbmcgc2l6ZV9vZl9zdHJ1Y3Q7CS8qID09IHNpemVvZihtb2R1bGUpICovCiAgdW5zaWduZWQgdGd0X2xvbmcgbmV4dDsKICB1bnNpZ25lZCB0Z3RfbG9uZyBuYW1lOwogIHVuc2lnbmVkIHRndF9sb25nIHNpemU7CgogIHRndF9sb25nIHVzZWNvdW50OwogIHVuc2lnbmVkIHRndF9sb25nIGZsYWdzOwkJLyogQVVUT0NMRUFOIGV0IGFsICovCgogIHVuc2lnbmVkIG5zeW1zOwogIHVuc2lnbmVkIG5kZXBzOwoKICB1bnNpZ25lZCB0Z3RfbG9uZyBzeW1zOwogIHVuc2lnbmVkIHRndF9sb25nIGRlcHM7CiAgdW5zaWduZWQgdGd0X2xvbmcgcmVmczsKICB1bnNpZ25lZCB0Z3RfbG9uZyBpbml0OwogIHVuc2lnbmVkIHRndF9sb25nIGNsZWFudXA7CiAgdW5zaWduZWQgdGd0X2xvbmcgZXhfdGFibGVfc3RhcnQ7CiAgdW5zaWduZWQgdGd0X2xvbmcgZXhfdGFibGVfZW5kOwojaWZkZWYgX19hbHBoYV9fCiAgdW5zaWduZWQgdGd0X2xvbmcgZ3A7CiNlbmRpZgogIC8qIEV2ZXJ5dGhpbmcgYWZ0ZXIgaGVyZSBpcyBleHRlbnNpb24uICAqLwogIHVuc2lnbmVkIHRndF9sb25nIHBlcnNpc3Rfc3RhcnQ7CiAgdW5zaWduZWQgdGd0X2xvbmcgcGVyc2lzdF9lbmQ7CiAgdW5zaWduZWQgdGd0X2xvbmcgY2FuX3VubG9hZDsKICB1bnNpZ25lZCB0Z3RfbG9uZyBydW5zaXplOwojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTkVXX01PRFVMRV9JTlRFUkZBQ0UKICBjb25zdCBjaGFyICprYWxsc3ltc19zdGFydDsgICAgIC8qIEFsbCBzeW1ib2xzIGZvciBrZXJuZWwgZGVidWdnaW5nICovCiAgY29uc3QgY2hhciAqa2FsbHN5bXNfZW5kOwogIGNvbnN0IGNoYXIgKmFyY2hkYXRhX3N0YXJ0OyAgICAgLyogYXJjaCBzcGVjaWZpYyBkYXRhIGZvciBtb2R1bGUgKi8KICBjb25zdCBjaGFyICphcmNoZGF0YV9lbmQ7CiAgY29uc3QgY2hhciAqa2VybmVsX2RhdGE7ICAgICAgICAvKiBSZXNlcnZlZCBmb3Iga2VybmVsIGludGVybmFsIHVzZSAqLwojZW5kaWYKfTsKCiNkZWZpbmUgQVJDSERBVEFfU0VDX05BTUUgIl9fYXJjaGRhdGEiCiNkZWZpbmUgS0FMTFNZTVNfU0VDX05BTUUgIl9fa2FsbHN5bXMiCgoKc3RydWN0IG5ld19tb2R1bGVfaW5mbwp7CiAgdW5zaWduZWQgbG9uZyBhZGRyOwogIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICB1bnNpZ25lZCBsb25nIGZsYWdzOwoJICAgbG9uZyB1c2Vjb3VudDsKfTsKCi8qIEJpdHMgb2YgbW9kdWxlLmZsYWdzLiAgKi8Kc3RhdGljIGNvbnN0IGludCBORVdfTU9EX1JVTk5JTkcgPSAxOwpzdGF0aWMgY29uc3QgaW50IE5FV19NT0RfREVMRVRFRCA9IDI7CnN0YXRpYyBjb25zdCBpbnQgTkVXX01PRF9BVVRPQ0xFQU4gPSA0OwpzdGF0aWMgY29uc3QgaW50IE5FV19NT0RfVklTSVRFRCA9IDg7CnN0YXRpYyBjb25zdCBpbnQgTkVXX01PRF9VU0VEX09OQ0UgPSAxNjsKCmludCBuZXdfc3lzX2luaXRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBuZXdfbW9kdWxlICopOwppbnQgcXVlcnlfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGludCB3aGljaCwgdm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6ZSwKCQkgc2l6ZV90ICpyZXQpOwoKLyogVmFsdWVzIGZvciBxdWVyeV9tb2R1bGUncyB3aGljaC4gICovCgpzdGF0aWMgY29uc3QgaW50IFFNX01PRFVMRVMgPSAxOwpzdGF0aWMgY29uc3QgaW50IFFNX0RFUFMgPSAyOwpzdGF0aWMgY29uc3QgaW50IFFNX1JFRlMgPSAzOwpzdGF0aWMgY29uc3QgaW50IFFNX1NZTUJPTFMgPSA0OwpzdGF0aWMgY29uc3QgaW50IFFNX0lORk8gPSA1OwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogVGhlIHN5c3RlbSBjYWxscyB1bmNoYW5nZWQgYmV0d2VlbiAyLjAgYW5kIDIuMS4gICovCgp1bnNpZ25lZCBsb25nIGNyZWF0ZV9tb2R1bGUoY29uc3QgY2hhciAqLCBzaXplX3QpOwppbnQgZGVsZXRlX21vZHVsZShjb25zdCBjaGFyICopOwoKCiNlbmRpZiAvKiBtb2R1bGUuaCAqLwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vLS0tLS0tLS1lbmQgb2YgbW9kdXRpbHMgbW9kdWxlLmgKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy0tLS0tLS0tbW9kdXRpbHMgb2JqLmgsIGxpbmVzIDI1My00NjIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKiBFbGYgb2JqZWN0IGZpbGUgbG9hZGluZyBhbmQgcmVsb2NhdGlvbiByb3V0aW5lcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KCiAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXggbW9kdXRpbHMuCgogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgogICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKCiNpZm5kZWYgTU9EVVRJTFNfT0JKX0gKc3RhdGljIGNvbnN0IGludCBNT0RVVElMU19PQkpfSCA9IDE7CgojaWRlbnQgIiRJZDogaW5zbW9kLmMsdiAxLjc1IDIwMDEvMTEvMTIgMTY6NTc6MjYga3JhYWkgRXhwICQiCgovKiBUaGUgcmVsb2NhdGFibGUgb2JqZWN0IGlzIG1hbmlwdWxhdGVkIHVzaW5nIGVsZmluIHR5cGVzLiAgKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZWxmLmg+CgoKLyogTWFjaGluZS1zcGVjaWZpYyBlbGYgbWFjcm9zIGZvciBpMzg2IGV0IGFsLiAgKi8KCi8qIHRoZSBTSCBjaGFuZ2VzIGhhdmUgb25seSBiZWVuIHRlc3RlZCBvbiB0aGUgU0g0IGluID1saXR0bGUgZW5kaWFuPSBtb2RlICovCi8qIEknbSBub3Qgc3VyZSBhYm91dCBiaWcgZW5kaWFuLCBzbyBsZXQncyB3YXJuOiAqLwoKI2lmIChkZWZpbmVkKF9fU0g0X18pIHx8IGRlZmluZWQoX19TSDNfXykpICYmIGRlZmluZWQoX19CSUdfRU5ESUFOX18pCiNlcnJvciBpbnNtb2QuYyBtYXkgcmVxdWlyZSBjaGFuZ2VzIGZvciB1c2Ugb24gYmlnIGVuZGlhbiBTSDQvU0gzCiNlbmRpZgoKLyogaXQgbWF5IG9yIG1heSBub3Qgd29yayBvbiB0aGUgU0gxL1NIMi4uLiBTbyBsZXQncyBlcnJvciBvbiB0aG9zZQogICBhbHNvICovCiNpZiAoZGVmaW5lZChfX3NoX18pICYmICghKGRlZmluZWQoX19TSDNfXykgfHwgZGVmaW5lZChfX1NINF9fKSkpKQojZXJyb3IgaW5zbW9kLmMgbWF5IHJlcXVpcmUgY2hhbmdlcyBmb3Igbm9uLVNIMy9TSDQgdXNlCiNlbmRpZgoKI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgoKI2lmIChkZWZpbmVkKF9fbWM2ODAwMF9fKSkJCQkJCQojZGVmaW5lIEVMRkRBVEFNCUVMRkRBVEEyTVNCCiNlbmRpZgoKCgojaWYgZGVmaW5lZChfX3NoX18pCgojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fU0gpCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZEQVRBTQlFTEZEQVRBMkxTQgoKI2VsaWYgZGVmaW5lZChfX2FybV9fKQoKI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0FSTSkKI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMCiNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWwKI2RlZmluZSBFTEZEQVRBTQlFTEZEQVRBMkxTQgoKI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9QUEMpCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbGEKI2RlZmluZSBFTEZEQVRBTSAgICBFTEZEQVRBMk1TQgoKI2VsaWYgZGVmaW5lZChfX21pcHNfXykKCi8qIEFjY291bnQgZm9yIEVMRiBzcGVjIGNoYW5nZXMuICAqLwojaWZuZGVmIEVNX01JUFNfUlMzX0xFCiNpZmRlZiBFTV9NSVBTX1JTNF9CRQojZGVmaW5lIEVNX01JUFNfUlMzX0xFCUVNX01JUFNfUlM0X0JFCiNlbHNlCiNkZWZpbmUgRU1fTUlQU19SUzNfTEUJMTAKI2VuZGlmCiNlbmRpZiAvKiAhRU1fTUlQU19SUzNfTEUgKi8KCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9NSVBTIHx8IHggPT0gRU1fTUlQU19SUzNfTEUpCiNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTAojZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsCiNpZmRlZiBfX01JUFNFQl9fCiNkZWZpbmUgRUxGREFUQU0gICAgICAgIEVMRkRBVEEyTVNCCiNlbmRpZgojaWZkZWYgX19NSVBTRUxfXwojZGVmaW5lIEVMRkRBVEFNICAgICAgICBFTEZEQVRBMkxTQgojZW5kaWYKCiNlbGlmIGRlZmluZWQoX19pMzg2X18pCgovKiBwcmVzdW1hYmx5IHdlIGNhbiB1c2UgdGhlc2UgZm9yIGFueXRoaW5nIGJ1dCB0aGUgU0ggYW5kIEFSTSovCi8qIHRoaXMgaXMgdGhlIHByZXZpb3VzIGJlaGF2aW9yLCBidXQgaXQgZG9lcyByZXN1bHQgaW4KICAgaW5zbW9kLmMgYmVpbmcgYnJva2VuIG9uIGFueXRoaW5nIGV4Y2VwdCBpMzg2ICovCiNpZm5kZWYgRU1fNDg2CiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAgKHggPT0gRU1fMzg2KQojZWxzZQojZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgICh4ID09IEVNXzM4NiB8fCB4ID09IEVNXzQ4NikKI2VuZGlmCgojZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUwKI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbAojZGVmaW5lIEVMRkRBVEFNCUVMRkRBVEEyTFNCCgojZWxpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKSAKCiNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KQkoeCA9PSBFTV82OEspCiNkZWZpbmUgU0hUX1JFTE0JCQlTSFRfUkVMQQojZGVmaW5lIEVsZjMyX1JlbE0JCQlFbGYzMl9SZWxhCgojZWxzZQojZXJyb3IgU29ycnksIGJ1dCBpbnNtb2QuYyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGFyY2hpdGVjdHVyZS4uLgojZW5kaWYKCiNpZm5kZWYgRWxmVwojIGlmIEVMRkNMQVNTTSA9PSBFTEZDTEFTUzMyCiMgIGRlZmluZSBFbGZXKHgpICBFbGYzMl8gIyMgeAojICBkZWZpbmUgRUxGVyh4KSAgRUxGMzJfICMjIHgKIyBlbHNlCiMgIGRlZmluZSBFbGZXKHgpICBFbGY2NF8gIyMgeAojICBkZWZpbmUgRUxGVyh4KSAgRUxGNjRfICMjIHgKIyBlbmRpZgojZW5kaWYKCi8qIEZvciBzb21lIHJlYXNvbiB0aGlzIGlzIG1pc3NpbmcgZnJvbSBsaWJjNS4gICovCiNpZm5kZWYgRUxGMzJfU1RfSU5GTwojIGRlZmluZSBFTEYzMl9TVF9JTkZPKGJpbmQsIHR5cGUpICAgICAgICgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4ZikpCiNlbmRpZgoKI2lmbmRlZiBFTEY2NF9TVF9JTkZPCiMgZGVmaW5lIEVMRjY0X1NUX0lORk8oYmluZCwgdHlwZSkgICAgICAgKCgoYmluZCkgPDwgNCkgKyAoKHR5cGUpICYgMHhmKSkKI2VuZGlmCgpzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaDsKc3RydWN0IG9ial9zeW1ib2xfcGF0Y2g7CgpzdHJ1Y3Qgb2JqX3NlY3Rpb24KewogIEVsZlcoU2hkcikgaGVhZGVyOwogIGNvbnN0IGNoYXIgKm5hbWU7CiAgY2hhciAqY29udGVudHM7CiAgc3RydWN0IG9ial9zZWN0aW9uICpsb2FkX25leHQ7CiAgaW50IGlkeDsKfTsKCnN0cnVjdCBvYmpfc3ltYm9sCnsKICBzdHJ1Y3Qgb2JqX3N5bWJvbCAqbmV4dDsJLyogaGFzaCB0YWJsZSBsaW5rICovCiAgY29uc3QgY2hhciAqbmFtZTsKICB1bnNpZ25lZCBsb25nIHZhbHVlOwogIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICBpbnQgc2VjaWR4OwkJCS8qIHRoZSBkZWZpbmluZyBzZWN0aW9uIGluZGV4L21vZHVsZSAqLwogIGludCBpbmZvOwogIGludCBrc3ltaWR4OwkJCS8qIGZvciBleHBvcnQgdG8gdGhlIGtlcm5lbCBzeW10YWIgKi8KICBpbnQgcmVmZXJlbmNlZDsJCS8qIGFjdHVhbGx5IHVzZWQgaW4gdGhlIGxpbmsgKi8KfTsKCi8qIEhhcmRjb2RlIHRoZSBoYXNoIHRhYmxlIHNpemUuICBXZSBzaG91bGRuJ3QgYmUgbmVlZGluZyBzbyBtYW55CiAgIHN5bWJvbHMgdGhhdCB3ZSBiZWdpbiB0byBkZWdyYWRlIHBlcmZvcm1hbmNlLCBhbmQgd2UgZ2V0IGEgYmlnIHdpbgogICBieSBnaXZpbmcgdGhlIGNvbXBpbGVyIGEgY29uc3RhbnQgZGl2aXNvci4gICovCgojZGVmaW5lIEhBU0hfQlVDS0VUUyAgNTIxCgpzdHJ1Y3Qgb2JqX2ZpbGUKewogIEVsZlcoRWhkcikgaGVhZGVyOwogIEVsZlcoQWRkcikgYmFzZWFkZHI7CiAgc3RydWN0IG9ial9zZWN0aW9uICoqc2VjdGlvbnM7CiAgc3RydWN0IG9ial9zZWN0aW9uICpsb2FkX29yZGVyOwogIHN0cnVjdCBvYmpfc2VjdGlvbiAqKmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0OwogIHN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpzdHJpbmdfcGF0Y2hlczsKICBzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaCAqc3ltYm9sX3BhdGNoZXM7CiAgaW50ICgqc3ltYm9sX2NtcCkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwogIHVuc2lnbmVkIGxvbmcgKCpzeW1ib2xfaGFzaCkoY29uc3QgY2hhciAqKTsKICB1bnNpZ25lZCBsb25nIGxvY2FsX3N5bXRhYl9zaXplOwogIHN0cnVjdCBvYmpfc3ltYm9sICoqbG9jYWxfc3ltdGFiOwogIHN0cnVjdCBvYmpfc3ltYm9sICpzeW10YWJbSEFTSF9CVUNLRVRTXTsKfTsKCmVudW0gb2JqX3JlbG9jCnsKICBvYmpfcmVsb2Nfb2ssCiAgb2JqX3JlbG9jX292ZXJmbG93LAogIG9ial9yZWxvY19kYW5nZXJvdXMsCiAgb2JqX3JlbG9jX3VuaGFuZGxlZAp9OwoKc3RydWN0IG9ial9zdHJpbmdfcGF0Y2gKewogIHN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpuZXh0OwogIGludCByZWxvY19zZWNpZHg7CiAgRWxmVyhBZGRyKSByZWxvY19vZmZzZXQ7CiAgRWxmVyhBZGRyKSBzdHJpbmdfb2Zmc2V0Owp9OwoKc3RydWN0IG9ial9zeW1ib2xfcGF0Y2gKewogIHN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpuZXh0OwogIGludCByZWxvY19zZWNpZHg7CiAgRWxmVyhBZGRyKSByZWxvY19vZmZzZXQ7CiAgc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKfTsKCgovKiBHZW5lcmljIG9iamVjdCBtYW5pcHVsYXRpb24gcm91dGluZXMuICAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2VsZl9oYXNoKGNvbnN0IGNoYXIgKik7CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2hfbihjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcgbGVuKTsKCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqb2JqX2ZpbmRfc3ltYm9sIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkJIGNvbnN0IGNoYXIgKm5hbWUpOwoKc3RhdGljIEVsZlcoQWRkcikgb2JqX3N5bWJvbF9maW5hbF92YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkgIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0pOwoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCnN0YXRpYyB2b2lkIG9ial9zZXRfc3ltYm9sX2NvbXBhcmUoc3RydWN0IG9ial9maWxlICpmLAoJCQkgICAgaW50ICgqY21wKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCgkJCSAgICB1bnNpZ25lZCBsb25nICgqaGFzaCkoY29uc3QgY2hhciAqKSk7CiNlbmRpZgoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2ZpbmRfc2VjdGlvbiAoc3RydWN0IG9ial9maWxlICpmLAoJCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpOwoKc3RhdGljIHZvaWQgb2JqX2luc2VydF9zZWN0aW9uX2xvYWRfb3JkZXIgKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCSAgICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYyk7CgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbiAoc3RydWN0IG9ial9maWxlICpmLAoJCQkJCQljb25zdCBjaGFyICpuYW1lLAoJCQkJCQl1bnNpZ25lZCBsb25nIGFsaWduLAoJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUpOwoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3QgKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKCQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbiwKCQkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKCnN0YXRpYyB2b2lkICpvYmpfZXh0ZW5kX3NlY3Rpb24gKHN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjLCB1bnNpZ25lZCBsb25nIG1vcmUpOwoKc3RhdGljIGludCBvYmpfc3RyaW5nX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCgkJICAgICBjb25zdCBjaGFyICpzdHJpbmcpOwoKc3RhdGljIGludCBvYmpfc3ltYm9sX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCgkJICAgICBzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKTsKCnN0YXRpYyBpbnQgb2JqX2NoZWNrX3VuZGVmaW5lZHMoc3RydWN0IG9ial9maWxlICpmKTsKCnN0YXRpYyB2b2lkIG9ial9hbGxvY2F0ZV9jb21tb25zKHN0cnVjdCBvYmpfZmlsZSAqZik7CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfbG9hZF9zaXplIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOwoKc3RhdGljIGludCBvYmpfcmVsb2NhdGUgKHN0cnVjdCBvYmpfZmlsZSAqZiwgRWxmVyhBZGRyKSBiYXNlKTsKCnN0YXRpYyBzdHJ1Y3Qgb2JqX2ZpbGUgKm9ial9sb2FkKEZJTEUgKmYsIGludCBsb2FkcHJvZ2JpdHMpOwoKc3RhdGljIGludCBvYmpfY3JlYXRlX2ltYWdlIChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgKmltYWdlKTsKCi8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBtYW5pcHVsYXRpb24gcm91dGluZXMuICAqLwoKc3RhdGljIHN0cnVjdCBvYmpfZmlsZSAqYXJjaF9uZXdfZmlsZSAodm9pZCk7CgpzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICphcmNoX25ld19zZWN0aW9uICh2b2lkKTsKCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqYXJjaF9uZXdfc3ltYm9sICh2b2lkKTsKCnN0YXRpYyBlbnVtIG9ial9yZWxvYyBhcmNoX2FwcGx5X3JlbG9jYXRpb24gKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCSAgICAgIHN0cnVjdCBvYmpfc2VjdGlvbiAqdGFyZ3NlYywKCQkJCSAgICAgIHN0cnVjdCBvYmpfc2VjdGlvbiAqc3ltc2VjLAoJCQkJICAgICAgc3RydWN0IG9ial9zeW1ib2wgKnN5bSwKCQkJCSAgICAgIEVsZlcoUmVsTSkgKnJlbCwgRWxmVyhBZGRyKSB2YWx1ZSk7CgpzdGF0aWMgaW50IGFyY2hfY3JlYXRlX2dvdCAoc3RydWN0IG9ial9maWxlICpmKTsKCnN0YXRpYyBpbnQgYXJjaF9pbml0X21vZHVsZSAoc3RydWN0IG9ial9maWxlICpmLCBzdHJ1Y3QgbmV3X21vZHVsZSAqKTsKCiNlbmRpZiAvKiBvYmouaCAqLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8tLS0tLS0tLWVuZCBvZiBtb2R1dGlscyBvYmouaAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgoKCgojZGVmaW5lIF9QQVRIX01PRFVMRVMJIi9saWIvbW9kdWxlcyIKc3RhdGljIGNvbnN0IGludCBTVFJWRVJTSU9OTEVOID0gMzI7CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIGludCBmbGFnX2ZvcmNlX2xvYWQgPSAwOwpzdGF0aWMgaW50IGZsYWdfYXV0b2NsZWFuID0gMDsKc3RhdGljIGludCBmbGFnX3ZlcmJvc2UgPSAwOwpzdGF0aWMgaW50IGZsYWdfZXhwb3J0ID0gMTsKCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyogcHJldmlvdXNseSwgdGhlc2Ugd2VyZSBuYW1lZCBpMzg2XyogYnV0IHNpbmNlIHdlIGNvdWxkIGJlCiAgIGNvbXBpbGluZyBmb3IgdGhlIHNoLCBJJ3ZlIHJlbmFtZWQgdGhlbSB0byB0aGUgbW9yZSBnZW5lcmFsCiAgIGFyY2hfKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB4ODYgYW5kIFNILCAKICAgYW5kIHdlIGNhbid0IHN1cHBvcnQgYW55dGhpbmcgZWxzZSByaWdodCBub3cgYW55d2F5LiBJbiB0aGUKICAgZnV0dXJlIG1heWJlIHRoZXkgc2hvdWxkIGJlICNpZiBkZWZpbmVkJ2QgKi8KCi8qIERvbmUgOy0pICovCgoKCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpCnN0cnVjdCBhcmNoX3BsdF9lbnRyeQp7CiAgaW50IG9mZnNldDsKICBpbnQgYWxsb2NhdGVkOjE7CiAgaW50IGluaXRlZDoxOyAgICAgICAgICAgICAgICAvKiBoYXMgYmVlbiBzZXQgdXAgKi8KfTsKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfVVNFX0dPVF9FTlRSSUVTKQpzdHJ1Y3QgYXJjaF9nb3RfZW50cnkgewoJaW50IG9mZnNldDsKCXVuc2lnbmVkIG9mZnNldF9kb25lOjE7Cgl1bnNpZ25lZCByZWxvY19kb25lOjE7Cn07CiNlbmRpZgoKI2lmIGRlZmluZWQoX19taXBzX18pCnN0cnVjdCBtaXBzX2hpMTYKewogIHN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7CiAgRWxmMzJfQWRkciAqYWRkcjsKICBFbGYzMl9BZGRyIHZhbHVlOwp9OwojZW5kaWYKCnN0cnVjdCBhcmNoX2ZpbGUgewoJc3RydWN0IG9ial9maWxlIHJvb3Q7CiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpCglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnBsdDsKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpCglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmdvdDsKI2VuZGlmCiNpZiBkZWZpbmVkKF9fbWlwc19fKQoJc3RydWN0IG1pcHNfaGkxNiAqbWlwc19oaTE2X2xpc3Q7CiNlbmRpZgp9OwoKc3RydWN0IGFyY2hfc3ltYm9sIHsKCXN0cnVjdCBvYmpfc3ltYm9sIHJvb3Q7CiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpCglzdHJ1Y3QgYXJjaF9wbHRfZW50cnkgcGx0ZW50OwojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9HT1RfRU5UUklFUykKCXN0cnVjdCBhcmNoX2dvdF9lbnRyeSBnb3RlbnQ7CiNlbmRpZgp9OwoKCnN0cnVjdCBleHRlcm5hbF9tb2R1bGUgewoJY29uc3QgY2hhciAqbmFtZTsKCUVsZlcoQWRkcikgYWRkcjsKCWludCB1c2VkOwoJc2l6ZV90IG5zeW1zOwoJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zOwp9OwoKc3RhdGljIHN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqa3N5bXM7CnN0YXRpYyBzaXplX3QgbmtzeW1zOwoKc3RhdGljIHN0cnVjdCBleHRlcm5hbF9tb2R1bGUgKmV4dF9tb2R1bGVzOwpzdGF0aWMgaW50IG5fZXh0X21vZHVsZXM7CnN0YXRpYyBpbnQgbl9leHRfbW9kdWxlc191c2VkOwpleHRlcm4gaW50IGRlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciAqKTsKCnN0YXRpYyBjaGFyIG1fZmlsZW5hbWVbRklMRU5BTUVfTUFYICsgMV07CnN0YXRpYyBjaGFyIG1fZnVsbE5hbWVbRklMRU5BTUVfTUFYICsgMV07CgoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoKc3RhdGljIGludCBjaGVja19tb2R1bGVfbmFtZV9tYXRjaChjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IHN0YXQgKnN0YXRidWYsCgkJCQkJCSAgIHZvaWQgKnVzZXJkYXRhKQp7CgljaGFyICpmdWxsbmFtZSA9IChjaGFyICopIHVzZXJkYXRhOwoKCWlmIChmdWxsbmFtZVswXSA9PSAnXDAnKQoJCXJldHVybiAoRkFMU0UpOwoJZWxzZSB7CgkJY2hhciAqdG1wLCAqdG1wMSA9IHhzdHJkdXAoZmlsZW5hbWUpOwoJCXRtcCA9IGdldF9sYXN0X3BhdGhfY29tcG9uZW50KHRtcDEpOwoJCWlmIChzdHJjbXAodG1wLCBmdWxsbmFtZSkgPT0gMCkgewoJCQlmcmVlKHRtcDEpOwoJCQkvKiBTdG9wIHNlYXJjaGluZyBpZiB3ZSBmaW5kIGEgbWF0Y2ggKi8KCQkJc2FmZV9zdHJuY3B5KG1fZmlsZW5hbWUsIGZpbGVuYW1lLCBzaXplb2YobV9maWxlbmFtZSkpOwoJCQlyZXR1cm4gKFRSVUUpOwoJCX0KCQlmcmVlKHRtcDEpOwoJfQoJcmV0dXJuIChGQUxTRSk7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKc3RhdGljIHN0cnVjdCBvYmpfZmlsZSAqYXJjaF9uZXdfZmlsZSh2b2lkKQp7CglzdHJ1Y3QgYXJjaF9maWxlICpmOwoJZiA9IHhtYWxsb2Moc2l6ZW9mKCpmKSk7CgojaWYgZGVmaW5lZChDT05GSUdfVVNFX1BMVF9FTlRSSUVTKQoJZi0+cGx0ID0gTlVMTDsKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpCglmLT5nb3QgPSBOVUxMOwojZW5kaWYKI2lmIGRlZmluZWQoX19taXBzX18pCglmLT5taXBzX2hpMTZfbGlzdCA9IE5VTEw7CiNlbmRpZgoKCXJldHVybiAmZi0+cm9vdDsKfQoKc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqYXJjaF9uZXdfc2VjdGlvbih2b2lkKQp7CglyZXR1cm4geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9zZWN0aW9uKSk7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqYXJjaF9uZXdfc3ltYm9sKHZvaWQpCnsKCXN0cnVjdCBhcmNoX3N5bWJvbCAqc3ltOwoJc3ltID0geG1hbGxvYyhzaXplb2YoKnN5bSkpOwoKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9QTFRfRU5UUklFUykKCW1lbXNldCgmc3ltLT5wbHRlbnQsIDAsIHNpemVvZihzeW0tPnBsdGVudCkpOwojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9HT1RfRU5UUklFUykKCW1lbXNldCgmc3ltLT5nb3RlbnQsIDAsIHNpemVvZihzeW0tPmdvdGVudCkpOwojZW5kaWYKCglyZXR1cm4gJnN5bS0+cm9vdDsKfQoKc3RhdGljIGVudW0gb2JqX3JlbG9jCmFyY2hfYXBwbHlfcmVsb2NhdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkJICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnRhcmdzZWMsCgkJCQkJICBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN5bXNlYywKCQkJCQkgIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0sCgkJCQkgICAgICBFbGZXKFJlbE0pICpyZWwsIEVsZlcoQWRkcikgdikKewoJc3RydWN0IGFyY2hfZmlsZSAqaWZpbGUgPSAoc3RydWN0IGFyY2hfZmlsZSAqKSBmOwojaWYgIShkZWZpbmVkKF9fbWlwc19fKSkKCXN0cnVjdCBhcmNoX3N5bWJvbCAqaXN5bSA9IChzdHJ1Y3QgYXJjaF9zeW1ib2wgKikgc3ltOwojZW5kaWYKCglFbGZXKEFkZHIpICpsb2MgPSAoRWxmVyhBZGRyKSAqKSAodGFyZ3NlYy0+Y29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKCUVsZlcoQWRkcikgZG90ID0gdGFyZ3NlYy0+aGVhZGVyLnNoX2FkZHIgKyByZWwtPnJfb2Zmc2V0OwojaWYgZGVmaW5lZChDT05GSUdfVVNFX0dPVF9FTlRSSUVTKQoJRWxmVyhBZGRyKSBnb3QgPSBpZmlsZS0+Z290ID8gaWZpbGUtPmdvdC0+aGVhZGVyLnNoX2FkZHIgOiAwOwojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9QTFRfRU5UUklFUykKCUVsZlcoQWRkcikgcGx0ID0gaWZpbGUtPnBsdCA/IGlmaWxlLT5wbHQtPmhlYWRlci5zaF9hZGRyIDogMDsKCXN0cnVjdCBhcmNoX3BsdF9lbnRyeSAqcGU7Cgl1bnNpZ25lZCBsb25nICppcDsKI2VuZGlmCgllbnVtIG9ial9yZWxvYyByZXQgPSBvYmpfcmVsb2Nfb2s7CgoJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pKSB7CgovKiBldmVuIHRob3VnaCB0aGVzZSBjb25zdGFudHMgc2VlbSB0byBiZSB0aGUgc2FtZSBmb3IKICAgdGhlIGkzODYgYW5kIHRoZSBzaCwgd2UgIiNpZiBkZWZpbmUiIHRoZW0gZm9yIGNsYXJpdHkKICAgYW5kIGluIGNhc2UgdGhhdCBldmVyIGNoYW5nZXMgKi8KI2lmIGRlZmluZWQoX19zaF9fKQoJY2FzZSBSX1NIX05PTkU6CiNlbGlmIGRlZmluZWQoX19hcm1fXykKCWNhc2UgUl9BUk1fTk9ORToKI2VsaWYgZGVmaW5lZChfX2kzODZfXykKCWNhc2UgUl8zODZfTk9ORToKI2VsaWYgZGVmaW5lZChfX21jNjgwMDBfXykgCgljYXNlIFJfNjhLX05PTkU6CiNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCgljYXNlIFJfUFBDX05PTkU6CiNlbGlmIGRlZmluZWQoX19taXBzX18pCgljYXNlIFJfTUlQU19OT05FOgojZW5kaWYKCQlicmVhazsKCiNpZiBkZWZpbmVkKF9fc2hfXykKCWNhc2UgUl9TSF9ESVIzMjoKI2VsaWYgZGVmaW5lZChfX2FybV9fKQoJY2FzZSBSX0FSTV9BQlMzMjoKI2VsaWYgZGVmaW5lZChfX2kzODZfXykKCWNhc2UgUl8zODZfMzI6CQojZWxpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKSAKCWNhc2UgUl82OEtfMzI6CiNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCgljYXNlIFJfUFBDX0FERFIzMjoKI2VsaWYgZGVmaW5lZChfX21pcHNfXykKCWNhc2UgUl9NSVBTXzMyOgojZW5kaWYKCQkqbG9jICs9IHY7CgkJYnJlYWs7CiNpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQogICAgY2FzZSBSXzY4S184OgoJCWlmICh2ID4gMHhmZikKCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CgkJKihjaGFyICopbG9jID0gdjsKCQlicmVhazsKICAgIGNhc2UgUl82OEtfMTY6CgkJaWYgKHYgPiAweGZmZmYpCgkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCSooc2hvcnQgKilsb2MgPSB2OwoJCWJyZWFrOwojZW5kaWYgLyogX19tYzY4MDAwX18gICAqLwoKI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCgljYXNlIFJfUFBDX0FERFIxNl9IQToKCQkqKHVuc2lnbmVkIHNob3J0ICopbG9jID0gKHYgKyAweDgwMDApID4+IDE2OwoJCWJyZWFrOwoKCWNhc2UgUl9QUENfQUREUjE2X0hJOgoJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSB2ID4+IDE2OwoJCWJyZWFrOwoKCWNhc2UgUl9QUENfQUREUjE2X0xPOgoJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSB2OwoJCWJyZWFrOwojZW5kaWYKCiNpZiBkZWZpbmVkKF9fbWlwc19fKQoJY2FzZSBSX01JUFNfMjY6CgkJaWYgKHYgJSA0KQoJCQlyZXQgPSBvYmpfcmVsb2NfZGFuZ2Vyb3VzOwoJCWlmICgodiAmIDB4ZjAwMDAwMDApICE9ICgoZG90ICsgNCkgJiAweGYwMDAwMDAwKSkKCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OwoJCSpsb2MgPQoJCSAgICAoKmxvYyAmIH4weDAzZmZmZmZmKSB8ICgoKmxvYyArICh2ID4+IDIpKSAmCgkJCQkJICAgIDB4MDNmZmZmZmYpOwoJCWJyZWFrOwoKCWNhc2UgUl9NSVBTX0hJMTY6CgkJewoJCQlzdHJ1Y3QgbWlwc19oaTE2ICpuOwoKCQkJLyogV2UgY2Fubm90IHJlbG9jYXRlIHRoaXMgb25lIG5vdyBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlCgkJCSAgIG9mIHRoZSBjYXJyeSB3ZSBuZWVkIHRvIGFkZC4gIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYKCQkJICAgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KCQkJbiA9IChzdHJ1Y3QgbWlwc19oaTE2ICopIHhtYWxsb2Moc2l6ZW9mICpuKTsKCQkJbi0+YWRkciA9IGxvYzsKCQkJbi0+dmFsdWUgPSB2OwoJCQluLT5uZXh0ID0gaWZpbGUtPm1pcHNfaGkxNl9saXN0OwoJCQlpZmlsZS0+bWlwc19oaTE2X2xpc3QgPSBuOwoJICAgICAgIAkJYnJlYWs7CgkJfQoKCWNhc2UgUl9NSVBTX0xPMTY6CgkJewoJCQl1bnNpZ25lZCBsb25nIGluc25sbyA9ICpsb2M7CgkJCUVsZjMyX0FkZHIgdmFsLCB2YWxsbzsKCgkJCS8qIFNpZ24gZXh0ZW5kIHRoZSBhZGRlbmQgd2UgZXh0cmFjdCBmcm9tIHRoZSBsbyBpbnNuLiAgKi8KCQkJdmFsbG8gPSAoKGluc25sbyAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOwoKCQkJaWYgKGlmaWxlLT5taXBzX2hpMTZfbGlzdCAhPSBOVUxMKSB7CgkJCQlzdHJ1Y3QgbWlwc19oaTE2ICpsOwoKCQkJCWwgPSBpZmlsZS0+bWlwc19oaTE2X2xpc3Q7CgkJCQl3aGlsZSAobCAhPSBOVUxMKSB7CgkJCQkJc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKCQkJCQl1bnNpZ25lZCBsb25nIGluc247CgoJCQkJCS8qIFRoZSB2YWx1ZSBmb3IgdGhlIEhJMTYgaGFkIGJlc3QgYmUgdGhlIHNhbWUuICovCgkJCQkJYXNzZXJ0KHYgPT0gbC0+dmFsdWUpOwoKCQkJCQkvKiBEbyB0aGUgSEkxNiByZWxvY2F0aW9uLiAgTm90ZSB0aGF0IHdlIGFjdHVhbGx5IGRvbid0CgkJCQkJICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBMTzE2IGl0c2VsZiwgZXhjZXB0IHdoZXJlCgkJCQkJICAgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLwoJCQkJCWluc24gPSAqbC0+YWRkcjsKCQkJCQl2YWwgPQoJCQkJCSAgICAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArCgkJCQkJICAgIHZhbGxvOwoJCQkJCXZhbCArPSB2OwoKCQkJCQkvKiBBY2NvdW50IGZvciB0aGUgc2lnbiBleHRlbnNpb24gdGhhdCB3aWxsIGhhcHBlbiBpbiB0aGUKCQkJCQkgICBsb3cgYml0cy4gICovCgkJCQkJdmFsID0KCQkJCQkgICAgKCh2YWwgPj4gMTYpICsKCQkJCQkgICAgICgodmFsICYgMHg4MDAwKSAhPQoJCQkJCSAgICAgIDApKSAmIDB4ZmZmZjsKCgkJCQkJaW5zbiA9IChpbnNuICYgfjB4ZmZmZikgfCB2YWw7CgkJCQkJKmwtPmFkZHIgPSBpbnNuOwoKCQkJCQluZXh0ID0gbC0+bmV4dDsKCQkJCQlmcmVlKGwpOwoJCQkJCWwgPSBuZXh0OwoJCQkJfQoKCQkJCWlmaWxlLT5taXBzX2hpMTZfbGlzdCA9IE5VTEw7CgkJCX0KCgkJCS8qIE9rLCB3ZSdyZSBkb25lIHdpdGggdGhlIEhJMTYgcmVsb2NzLiAgTm93IGRlYWwgd2l0aCB0aGUgTE8xNi4gICovCgkJCXZhbCA9IHYgKyB2YWxsbzsKCQkJaW5zbmxvID0gKGluc25sbyAmIH4weGZmZmYpIHwgKHZhbCAmIDB4ZmZmZik7CgkJCSpsb2MgPSBpbnNubG87CgkJCWJyZWFrOwoJCX0KI2VuZGlmCgojaWYgZGVmaW5lZChfX2FybV9fKQojZWxpZiBkZWZpbmVkKF9fc2hfXykKICAgICAgICBjYXNlIFJfU0hfUkVMMzI6CgkJKmxvYyArPSB2IC0gZG90OwoJCWJyZWFrOwojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQoJY2FzZSBSXzM4Nl9QTFQzMjoKCWNhc2UgUl8zODZfUEMzMjoKCQkqbG9jICs9IHYgLSBkb3Q7CgkJYnJlYWs7CiNlbGlmIGRlZmluZWQoX19tYzY4MDAwX18pCiAgICBjYXNlIFJfNjhLX1BDODoKCQl2IC09IGRvdDsKCQlpZiAoKEVsZjMyX1N3b3JkKXYgPiAweDdmIHx8IChFbGYzMl9Td29yZCl2IDwgLShFbGYzMl9Td29yZCkweDgwKQoJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkqKGNoYXIgKilsb2MgPSB2OwogICAgYnJlYWs7CgkJY2FzZSBSXzY4S19QQzE2OgoJCXYgLT0gZG90OwoJCWlmICgoRWxmMzJfU3dvcmQpdiA+IDB4N2ZmZiB8fCAoRWxmMzJfU3dvcmQpdiA8IC0oRWxmMzJfU3dvcmQpMHg4MDAwKQoJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKCQkqKHNob3J0ICopbG9jID0gdjsKCQlicmVhazsKICAgIGNhc2UgUl82OEtfUEMzMjoKCQkqKGludCAqKWxvYyA9IHYgLSBkb3Q7CgkJYnJlYWs7CiNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCgljYXNlIFJfUFBDX1JFTDMyOgoJCSpsb2MgPSB2IC0gZG90OwoJCWJyZWFrOwojZW5kaWYKCiNpZiBkZWZpbmVkKF9fc2hfXykKICAgICAgICBjYXNlIFJfU0hfUExUMzI6CiAgICAgICAgICAgICAgICAqbG9jID0gdiAtIGRvdDsKICAgICAgICAgICAgICAgIGJyZWFrOwojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQojZW5kaWYKCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpCgojaWYgZGVmaW5lZChfX2FybV9fKQogICAgY2FzZSBSX0FSTV9QQzI0OgogICAgY2FzZSBSX0FSTV9QTFQzMjoKI2VuZGlmCiNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQoJY2FzZSBSX1BQQ19SRUwyNDoKI2VuZGlmCiAgICAgIC8qIGZpbmQgdGhlIHBsdCBlbnRyeSBhbmQgaW5pdGlhbGl6ZSBpdCBpZiBuZWNlc3NhcnkgKi8KICAgICAgYXNzZXJ0KGlzeW0gIT0gTlVMTCk7CgogICAgICBwZSA9IChzdHJ1Y3QgYXJjaF9wbHRfZW50cnkqKSAmaXN5bS0+cGx0ZW50OwoKICAgICAgaWYgKCEgcGUtPmluaXRlZCkgewoJICAJaXAgPSAodW5zaWduZWQgbG9uZyAqKSAoaWZpbGUtPnBsdC0+Y29udGVudHMgKyBwZS0+b2Zmc2V0KTsKCgkJLyogZ2VuZXJhdGUgc29tZSBtYWNoaW5lIGNvZGUgKi8KCiNpZiBkZWZpbmVkKF9fYXJtX18pCgkgIAlpcFswXSA9IDB4ZTUxZmYwMDQ7CQkJLyogbGRyIHBjLFtwYywjLTRdICovCgkgIAlpcFsxXSA9IHY7CQkJCS8qIHN5bUAgKi8KI2VuZGlmCiNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQoJICBpcFswXSA9IDB4M2Q2MDAwMDAgKyAoKHYgKyAweDgwMDApID4+IDE2KTsgIC8qIGxpcyByMTEsc3ltQGhhICovCgkgIGlwWzFdID0gMHgzOTZiMDAwMCArICh2ICYgMHhmZmZmKTsJICAgICAgLyogYWRkaSByMTEscjExLHN5bUBsICovCgkgIGlwWzJdID0gMHg3ZDY5MDNhNjsJCQkgICAgICAvKiBtdGN0ciByMTEgKi8KCSAgaXBbM10gPSAweDRlODAwNDIwOwkJCSAgICAgIC8qIGJjdHIgKi8KI2VuZGlmCgkgIAlwZS0+aW5pdGVkID0gMTsKCSAgfQoKICAgICAgLyogcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGFyZ2V0ICovCiAgICAgIHYgLT0gZG90OwogICAgICAvKiBpZiB0aGUgdGFyZ2V0IGlzIHRvbyBmYXIgYXdheS4uLi4gKi8KICAgICAgaWYgKChpbnQpdiA8IC0weDAyMDAwMDAwIHx8IChpbnQpdiA+PSAweDAyMDAwMDAwKSB7CgkgICAgLyogZ28gdmlhIHRoZSBwbHQgKi8KCSAgICB2ID0gcGx0ICsgcGUtPm9mZnNldCAtIGRvdDsKCSAgfQogICAgICBpZiAodiAmIDMpCgkgICAgcmV0ID0gb2JqX3JlbG9jX2Rhbmdlcm91czsKCiAgICAgIC8qIG1lcmdlIHRoZSBvZmZzZXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICovCiNpZiBkZWZpbmVkKF9fYXJtX18pCiAgICAgIC8qIENvbnZlcnQgdG8gd29yZHMuICovCiAgICAgIHYgPj49IDI7CgogICAgICAqbG9jID0gKCpsb2MgJiB+MHgwMGZmZmZmZikgfCAoKHYgKyAqbG9jKSAmIDB4MDBmZmZmZmYpOwojZW5kaWYKI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCiAgICAgICpsb2MgPSAoKmxvYyAmIH4weDAzZmZmZmZjKSB8ICh2ICYgMHgwM2ZmZmZmYyk7CiNlbmRpZgogICAgICBicmVhazsKI2VuZGlmIC8qIENPTkZJR19VU0VfUExUX0VOVFJJRVMgKi8KCiNpZiBkZWZpbmVkKF9fYXJtX18pCiNlbGlmIGRlZmluZWQoX19zaF9fKQogICAgICAgIGNhc2UgUl9TSF9HTE9CX0RBVDoKICAgICAgICBjYXNlIFJfU0hfSk1QX1NMT1Q6CiAgICAgICAgICAgICAgIAkqbG9jID0gdjsKICAgICAgICAgICAgICAgIGJyZWFrOwojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQoJY2FzZSBSXzM4Nl9HTE9CX0RBVDoKCWNhc2UgUl8zODZfSk1QX1NMT1Q6CgkJKmxvYyA9IHY7CgkJYnJlYWs7CiNlbGlmIGRlZmluZWQoX19tYzY4MDAwX18pCgljYXNlIFJfNjhLX0dMT0JfREFUOgoJY2FzZSBSXzY4S19KTVBfU0xPVDoKCQkqbG9jID0gdjsKCQlicmVhazsKI2VuZGlmCgojaWYgZGVmaW5lZChfX2FybV9fKQojZWxpZiBkZWZpbmVkKF9fc2hfXykKICAgICAgICBjYXNlIFJfU0hfUkVMQVRJVkU6CgkgICAgICAgICpsb2MgKz0gZi0+YmFzZWFkZHIgKyByZWwtPnJfYWRkZW5kOwogICAgICAgICAgICAgICAgYnJlYWs7CiNlbGlmIGRlZmluZWQoX19pMzg2X18pCiAgICAgICAgY2FzZSBSXzM4Nl9SRUxBVElWRToKCQkqbG9jICs9IGYtPmJhc2VhZGRyOwoJCWJyZWFrOwojZWxpZiBkZWZpbmVkKF9fbWM2ODAwMF9fKQogICAgY2FzZSBSXzY4S19SRUxBVElWRToKICAgIAkqKGludCAqKWxvYyArPSBmLT5iYXNlYWRkcjsKICAgIAlicmVhazsKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfVVNFX0dPVF9FTlRSSUVTKQoKI2lmICFkZWZpbmVkKF9fNjhrX18pCiNpZiBkZWZpbmVkKF9fc2hfXykKICAgICAgICBjYXNlIFJfU0hfR09UUEM6CiNlbGlmIGRlZmluZWQoX19hcm1fXykKICAgIGNhc2UgUl9BUk1fR09UUEM6CiNlbGlmIGRlZmluZWQoX19pMzg2X18pCgljYXNlIFJfMzg2X0dPVFBDOgojZW5kaWYKCQlhc3NlcnQoZ290ICE9IDApOwojaWYgZGVmaW5lZChfX3NoX18pCgkJKmxvYyArPSBnb3QgLSBkb3QgKyByZWwtPnJfYWRkZW5kOzsKI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fbTY4a18pCgkJKmxvYyArPSBnb3QgLSBkb3Q7CiNlbmRpZgoJCWJyZWFrOwojZW5kaWYgLy8gX182OGtfXwoKI2lmIGRlZmluZWQoX19zaF9fKQoJY2FzZSBSX1NIX0dPVDMyOgojZWxpZiBkZWZpbmVkKF9fYXJtX18pCgljYXNlIFJfQVJNX0dPVDMyOgojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQoJY2FzZSBSXzM4Nl9HT1QzMjoKI2VsaWYgZGVmaW5lZChfX21jNjgwMDBfXykKCWNhc2UgUl82OEtfR09UMzI6CiNlbmRpZgoJCWFzc2VydChpc3ltICE9IE5VTEwpOwogICAgICAgIC8qIG5lZWRzIGFuIGVudHJ5IGluIHRoZSAuZ290OiBzZXQgaXQsIG9uY2UgKi8KCQlpZiAoIWlzeW0tPmdvdGVudC5yZWxvY19kb25lKSB7CgkJCWlzeW0tPmdvdGVudC5yZWxvY19kb25lID0gMTsKCQkJKihFbGZXKEFkZHIpICopIChpZmlsZS0+Z290LT5jb250ZW50cyArIGlzeW0tPmdvdGVudC5vZmZzZXQpID0gdjsKCQl9CiAgICAgICAgLyogbWFrZSB0aGUgcmVsb2Mgd2l0aF9yZXNwZWN0X3RvXy5nb3QgKi8KI2lmIGRlZmluZWQoX19zaF9fKQoJCSpsb2MgKz0gaXN5bS0+Z290ZW50Lm9mZnNldCArIHJlbC0+cl9hZGRlbmQ7CiNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykKCQkqbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQ7CiNlbmRpZgoJCWJyZWFrOwoKICAgIC8qIGFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIGdvdCAqLwojaWYgIWRlZmluZWQoX19tYzY4MDAwX18pCiNpZiBkZWZpbmVkKF9fc2hfXykKCWNhc2UgUl9TSF9HT1RPRkY6CiNlbGlmIGRlZmluZWQoX19hcm1fXykKCWNhc2UgUl9BUk1fR09UT0ZGOgojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQoJY2FzZSBSXzM4Nl9HT1RPRkY6CiNlbGlmIGRlZmluZWQoX19tYzY4MDAwX18pCgljYXNlIFJfNjhLX0dPVE9GRjoKI2VuZGlmCgkJYXNzZXJ0KGdvdCAhPSAwKTsKCQkqbG9jICs9IHYgLSBnb3Q7CgkJYnJlYWs7CiNlbmRpZiAvLyBfX21jNjgwMDBfXwoKI2VuZGlmIC8qIENPTkZJR19VU0VfR09UX0VOVFJJRVMgKi8KCglkZWZhdWx0OgogICAgICAgIHByaW50ZigiV2FybmluZzogdW5oYW5kbGVkIHJlbG9jICVkXG4iLChpbnQpRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSk7CgkJcmV0ID0gb2JqX3JlbG9jX3VuaGFuZGxlZDsKCQlicmVhazsKCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGFyY2hfY3JlYXRlX2dvdChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCnsKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9HT1RfRU5UUklFUykgfHwgZGVmaW5lZChDT05GSUdfVVNFX1BMVF9FTlRSSUVTKQoJc3RydWN0IGFyY2hfZmlsZSAqaWZpbGUgPSAoc3RydWN0IGFyY2hfZmlsZSAqKSBmOwoJaW50IGk7CiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpCglpbnQgZ290X29mZnNldCA9IDAsIGdvdG5lZWRlZCA9IDA7CiNlbmRpZgojaWYgZGVmaW5lZChDT05GSUdfVVNFX1BMVF9FTlRSSUVTKQoJaW50IHBsdF9vZmZzZXQgPSAwLCBwbHRuZWVkZWQgPSAwOwojZW5kaWYKICAgIHN0cnVjdCBvYmpfc2VjdGlvbiAqcmVsc2VjLCAqc3ltc2VjLCAqc3Ryc2VjOwoJRWxmVyhSZWxNKSAqcmVsLCAqcmVsZW5kOwoJRWxmVyhTeW0pICpzeW10YWIsICpleHRzeW07Cgljb25zdCBjaGFyICpzdHJ0YWIsICpuYW1lOwoJc3RydWN0IGFyY2hfc3ltYm9sICppbnRzeW07CgoJZm9yIChpID0gMDsgaSA8IGYtPmhlYWRlci5lX3NobnVtOyArK2kpIHsKCQlyZWxzZWMgPSBmLT5zZWN0aW9uc1tpXTsKCQlpZiAocmVsc2VjLT5oZWFkZXIuc2hfdHlwZSAhPSBTSFRfUkVMTSkKCQkJY29udGludWU7CgoJCXN5bXNlYyA9IGYtPnNlY3Rpb25zW3JlbHNlYy0+aGVhZGVyLnNoX2xpbmtdOwoJCXN0cnNlYyA9IGYtPnNlY3Rpb25zW3N5bXNlYy0+aGVhZGVyLnNoX2xpbmtdOwoKCQlyZWwgPSAoRWxmVyhSZWxNKSAqKSByZWxzZWMtPmNvbnRlbnRzOwoJCXJlbGVuZCA9IHJlbCArIChyZWxzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoUmVsTSkpKTsKCQlzeW10YWIgPSAoRWxmVyhTeW0pICopIHN5bXNlYy0+Y29udGVudHM7CgkJc3RydGFiID0gKGNvbnN0IGNoYXIgKikgc3Ryc2VjLT5jb250ZW50czsKCgkJZm9yICg7IHJlbCA8IHJlbGVuZDsgKytyZWwpIHsKCQkJZXh0c3ltID0gJnN5bXRhYltFTEYzMl9SX1NZTShyZWwtPnJfaW5mbyldOwoKCQkJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsLT5yX2luZm8pKSB7CiNpZiBkZWZpbmVkKF9fYXJtX18pCgkJCWNhc2UgUl9BUk1fR09UMzI6CgkJCQlicmVhazsKI2VsaWYgZGVmaW5lZChfX3NoX18pCgkJCWNhc2UgUl9TSF9HT1QzMjoKCQkJCWJyZWFrOwojZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQoJCQljYXNlIFJfMzg2X0dPVDMyOgoJCQkJYnJlYWs7CiNlbGlmIGRlZmluZWQoX19tYzY4MDAwX18pCgkJCWNhc2UgUl82OEtfR09UMzI6CgkJCQlicmVhazsKI2VuZGlmCgojaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKCQkJY2FzZSBSX1BQQ19SRUwyNDoKCQkJCXBsdG5lZWRlZCA9IDE7CgkJCQlicmVhazsKI2VuZGlmCgojaWYgZGVmaW5lZChfX2FybV9fKQoJCQljYXNlIFJfQVJNX1BDMjQ6CgkJCWNhc2UgUl9BUk1fUExUMzI6CgkJCQlwbHRuZWVkZWQgPSAxOwoJCQkJYnJlYWs7CgoJCQljYXNlIFJfQVJNX0dPVFBDOgoJCQljYXNlIFJfQVJNX0dPVE9GRjoKCQkJCWdvdG5lZWRlZCA9IDE7CgkJCQlpZiAoZ290X29mZnNldCA9PSAwKQoJCQkJCWdvdF9vZmZzZXQgPSA0OwojZWxpZiBkZWZpbmVkKF9fc2hfXykKCQkJY2FzZSBSX1NIX0dPVFBDOgoJCQljYXNlIFJfU0hfR09UT0ZGOgoJCQkJZ290bmVlZGVkID0gMTsKI2VsaWYgZGVmaW5lZChfX2kzODZfXykKCQkJY2FzZSBSXzM4Nl9HT1RQQzoKCQkJY2FzZSBSXzM4Nl9HT1RPRkY6CgkJCQlnb3RuZWVkZWQgPSAxOwojZW5kaWYKCgkJCWRlZmF1bHQ6CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKGV4dHN5bS0+c3RfbmFtZSAhPSAwKSB7CgkJCQluYW1lID0gc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lOwoJCQl9IGVsc2UgewoJCQkJbmFtZSA9IGYtPnNlY3Rpb25zW2V4dHN5bS0+c3Rfc2huZHhdLT5uYW1lOwoJCQl9CgkJCWludHN5bSA9IChzdHJ1Y3QgYXJjaF9zeW1ib2wgKikgb2JqX2ZpbmRfc3ltYm9sKGYsIG5hbWUpOwojaWYgZGVmaW5lZChDT05GSUdfVVNFX0dPVF9FTlRSSUVTKQoJCQlpZiAoIWludHN5bS0+Z290ZW50Lm9mZnNldF9kb25lKSB7CgkJCQlpbnRzeW0tPmdvdGVudC5vZmZzZXRfZG9uZSA9IDE7CgkJCQlpbnRzeW0tPmdvdGVudC5vZmZzZXQgPSBnb3Rfb2Zmc2V0OwoJCQkJZ290X29mZnNldCArPSBDT05GSUdfR09UX0VOVFJZX1NJWkU7CgkJCX0KI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfUExUX0VOVFJJRVMpCgkJCWlmIChwbHRuZWVkZWQgJiYgaW50c3ltLT5wbHRlbnQuYWxsb2NhdGVkID09IDApIHsKCQkJCWludHN5bS0+cGx0ZW50LmFsbG9jYXRlZCA9IDE7CgkJCQlpbnRzeW0tPnBsdGVudC5vZmZzZXQgPSBwbHRfb2Zmc2V0OwoJCQkJcGx0X29mZnNldCArPSBDT05GSUdfUExUX0VOVFJZX1NJWkU7CgkJCQlpbnRzeW0tPnBsdGVudC5pbml0ZWQgPSAwOwoJCQkJcGx0bmVlZGVkID0gMDsKCQkJfQojZW5kaWYKCQkJfQoJCX0KCiNpZiBkZWZpbmVkKENPTkZJR19VU0VfR09UX0VOVFJJRVMpCglpZiAoZ290X29mZnNldCkgewoJCXN0cnVjdCBvYmpfc2VjdGlvbiogbXlyZWxzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIuZ290Iik7CgoJCWlmIChteXJlbHNlYykgewoJCQlvYmpfZXh0ZW5kX3NlY3Rpb24obXlyZWxzZWMsIGdvdF9vZmZzZXQpOwoJCX0gZWxzZSB7CgkJCW15cmVsc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oZiwgIi5nb3QiLCAKCQkJCQkJCSAgICBDT05GSUdfR09UX0VOVFJZX1NJWkUsCgkJCQkJCQkgICAgZ290X29mZnNldCk7CgkJCWFzc2VydChteXJlbHNlYyk7CgkJfQoKCQlpZmlsZS0+Z290ID0gbXlyZWxzZWM7Cgl9CiNlbmRpZgoKI2lmIGRlZmluZWQoQ09ORklHX1VTRV9QTFRfRU5UUklFUykKCWlmIChwbHRfb2Zmc2V0KQoJCWlmaWxlLT5wbHQgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiLnBsdCIsIAoJCQkJCQkJQ09ORklHX1BMVF9FTlRSWV9TSVpFLCAKCQkJCQkJCXBsdF9vZmZzZXQpOwojZW5kaWYKI2VuZGlmCglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBhcmNoX2luaXRfbW9kdWxlKHN0cnVjdCBvYmpfZmlsZSAqZiwgc3RydWN0IG5ld19tb2R1bGUgKm1vZCkKewoJcmV0dXJuIDE7Cn0KCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyogU3RhbmRhcmQgRUxGIGhhc2ggZnVuY3Rpb24uICAqLwpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgb2JqX2VsZl9oYXNoX24oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBuKQp7Cgl1bnNpZ25lZCBsb25nIGggPSAwOwoJdW5zaWduZWQgbG9uZyBnOwoJdW5zaWduZWQgY2hhciBjaDsKCgl3aGlsZSAobiA+IDApIHsKCQljaCA9ICpuYW1lKys7CgkJaCA9IChoIDw8IDQpICsgY2g7CgkJaWYgKChnID0gKGggJiAweGYwMDAwMDAwKSkgIT0gMCkgewoJCQloIF49IGcgPj4gMjQ7CgkJCWggJj0gfmc7CgkJfQoJCW4tLTsKCX0KCXJldHVybiBoOwp9CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfZWxmX2hhc2goY29uc3QgY2hhciAqbmFtZSkKewoJcmV0dXJuIG9ial9lbGZfaGFzaF9uKG5hbWUsIHN0cmxlbihuYW1lKSk7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwovKiBTdHJpbmcgY29tcGFyaXNvbiBmb3Igbm9uLWNvLXZlcnNpb25lZCBrZXJuZWwgYW5kIG1vZHVsZS4gICovCgpzdGF0aWMgaW50IG5jdl9zdHJjbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKewoJc2l6ZV90IGFsZW4gPSBzdHJsZW4oYSksIGJsZW4gPSBzdHJsZW4oYik7CgoJaWYgKGJsZW4gPT0gYWxlbiArIDEwICYmIGJbYWxlbl0gPT0gJ18nICYmIGJbYWxlbiArIDFdID09ICdSJykKCQlyZXR1cm4gc3RybmNtcChhLCBiLCBhbGVuKTsKCWVsc2UgaWYgKGFsZW4gPT0gYmxlbiArIDEwICYmIGFbYmxlbl0gPT0gJ18nICYmIGFbYmxlbiArIDFdID09ICdSJykKCQlyZXR1cm4gc3RybmNtcChhLCBiLCBibGVuKTsKCWVsc2UKCQlyZXR1cm4gc3RyY21wKGEsIGIpOwp9CgovKiBTdHJpbmcgaGFzaGluZyBmb3Igbm9uLWNvLXZlcnNpb25lZCBrZXJuZWwgYW5kIG1vZHVsZS4gIEhlcmUKICAgd2UgYXJlIHNpbXBseSBmb3JjZWQgdG8gZHJvcCB0aGUgY3JjIGZyb20gdGhlIGhhc2guICAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgbmN2X3N5bWJvbF9oYXNoKGNvbnN0IGNoYXIgKnN0cikKewoJc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOwoJaWYgKGxlbiA+IDEwICYmIHN0cltsZW4gLSAxMF0gPT0gJ18nICYmIHN0cltsZW4gLSA5XSA9PSAnUicpCgkJbGVuIC09IDEwOwoJcmV0dXJuIG9ial9lbGZfaGFzaF9uKHN0ciwgbGVuKTsKfQoKc3RhdGljIHZvaWQKb2JqX3NldF9zeW1ib2xfY29tcGFyZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQkJICAgaW50ICgqY21wKSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopLAoJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKCpoYXNoKSAoY29uc3QgY2hhciAqKSkKewoJaWYgKGNtcCkKCQlmLT5zeW1ib2xfY21wID0gY21wOwoJaWYgKGhhc2gpIHsKCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqdG1wdGFiW0hBU0hfQlVDS0VUU10sICpzeW0sICpuZXh0OwoJCWludCBpOwoKCQlmLT5zeW1ib2xfaGFzaCA9IGhhc2g7CgoJCW1lbWNweSh0bXB0YWIsIGYtPnN5bXRhYiwgc2l6ZW9mKHRtcHRhYikpOwoJCW1lbXNldChmLT5zeW10YWIsIDAsIHNpemVvZihmLT5zeW10YWIpKTsKCgkJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKQoJCQlmb3IgKHN5bSA9IHRtcHRhYltpXTsgc3ltOyBzeW0gPSBuZXh0KSB7CgkJCQl1bnNpZ25lZCBsb25nIGggPSBoYXNoKHN5bS0+bmFtZSkgJSBIQVNIX0JVQ0tFVFM7CgkJCQluZXh0ID0gc3ltLT5uZXh0OwoJCQkJc3ltLT5uZXh0ID0gZi0+c3ltdGFiW2hdOwoJCQkJZi0+c3ltdGFiW2hdID0gc3ltOwoJCQl9Cgl9Cn0KCiNlbmRpZgkJCQkJCQkvKiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLwoKc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICoKb2JqX2FkZF9zeW1ib2woc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpuYW1lLAoJCQkJCQkJCSAgdW5zaWduZWQgbG9uZyBzeW1pZHgsIGludCBpbmZvLAoJCQkJCQkJCSAgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSB2YWx1ZSwKCQkJCQkJCQkgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGYtPnN5bWJvbF9oYXNoKG5hbWUpICUgSEFTSF9CVUNLRVRTOwoJaW50IG5fdHlwZSA9IEVMRlcoU1RfVFlQRSkgKGluZm8pOwoJaW50IG5fYmluZGluZyA9IEVMRlcoU1RfQklORCkgKGluZm8pOwoKCWZvciAoc3ltID0gZi0+c3ltdGFiW2hhc2hdOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkKCQlpZiAoZi0+c3ltYm9sX2NtcChzeW0tPm5hbWUsIG5hbWUpID09IDApIHsKCQkJaW50IG9fc2VjaWR4ID0gc3ltLT5zZWNpZHg7CgkJCWludCBvX2luZm8gPSBzeW0tPmluZm87CgkJCWludCBvX3R5cGUgPSBFTEZXKFNUX1RZUEUpIChvX2luZm8pOwoJCQlpbnQgb19iaW5kaW5nID0gRUxGVyhTVF9CSU5EKSAob19pbmZvKTsKCgkJCS8qIEEgcmVkZWZpbml0aW9uISAgSXMgaXQgbGVnYWw/ICAqLwoKCQkJaWYgKHNlY2lkeCA9PSBTSE5fVU5ERUYpCgkJCQlyZXR1cm4gc3ltOwoJCQllbHNlIGlmIChvX3NlY2lkeCA9PSBTSE5fVU5ERUYpCgkJCQlnb3RvIGZvdW5kOwoJCQllbHNlIGlmIChuX2JpbmRpbmcgPT0gU1RCX0dMT0JBTCAmJiBvX2JpbmRpbmcgPT0gU1RCX0xPQ0FMKSB7CgkJCQkvKiBDb3BlIHdpdGggbG9jYWwgYW5kIGdsb2JhbCBzeW1ib2xzIG9mIHRoZSBzYW1lIG5hbWUKCQkJCSAgIGluIHRoZSBzYW1lIG9iamVjdCBmaWxlLCBhcyBtaWdodCBoYXZlIGJlZW4gY3JlYXRlZAoJCQkJICAgYnkgbGQgLXIuICBUaGUgb25seSByZWFzb24gbG9jYWxzIGFyZSBub3cgc2VlbiBhdCB0aGlzCgkJCQkgICBsZXZlbCBhdCBhbGwgaXMgc28gdGhhdCB3ZSBjYW4gZG8gc2VtaS1zZW5zaWJsZSB0aGluZ3MKCQkJCSAgIHdpdGggcGFyYW1ldGVycy4gICovCgoJCQkJc3RydWN0IG9ial9zeW1ib2wgKm5zeW0sICoqcDsKCgkJCQluc3ltID0gYXJjaF9uZXdfc3ltYm9sKCk7CgkJCQluc3ltLT5uZXh0ID0gc3ltLT5uZXh0OwoJCQkJbnN5bS0+a3N5bWlkeCA9IC0xOwoKCQkJCS8qIEV4Y2lzZSB0aGUgb2xkIChsb2NhbCkgc3ltYm9sIGZyb20gdGhlIGhhc2ggY2hhaW4uICAqLwoJCQkJZm9yIChwID0gJmYtPnN5bXRhYltoYXNoXTsgKnAgIT0gc3ltOyBwID0gJigqcCktPm5leHQpCgkJCQkJY29udGludWU7CgkJCQkqcCA9IHN5bSA9IG5zeW07CgkJCQlnb3RvIGZvdW5kOwoJCQl9IGVsc2UgaWYgKG5fYmluZGluZyA9PSBTVEJfTE9DQUwpIHsKCQkJCS8qIEFub3RoZXIgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLgoJCQkJICAgSnVzdCBhZGQgdGhpcyB0byB0aGUgbG9jYWwgdGFibGUuICAqLwoJCQkJc3ltID0gYXJjaF9uZXdfc3ltYm9sKCk7CgkJCQlzeW0tPm5leHQgPSBOVUxMOwoJCQkJc3ltLT5rc3ltaWR4ID0gLTE7CgkJCQlmLT5sb2NhbF9zeW10YWJbc3ltaWR4XSA9IHN5bTsKCQkJCWdvdG8gZm91bmQ7CgkJCX0gZWxzZSBpZiAobl9iaW5kaW5nID09IFNUQl9XRUFLKQoJCQkJcmV0dXJuIHN5bTsKCQkJZWxzZSBpZiAob19iaW5kaW5nID09IFNUQl9XRUFLKQoJCQkJZ290byBmb3VuZDsKCQkJLyogRG9uJ3QgdW5pZnkgQ09NTU9OIHN5bWJvbHMgd2l0aCBvYmplY3QgdHlwZXMgdGhlIHByb2dyYW1tZXIKCQkJICAgZG9lc24ndCBleHBlY3QuICAqLwoJCQllbHNlIGlmIChzZWNpZHggPT0gU0hOX0NPTU1PTgoJCQkJCSAmJiAob190eXBlID09IFNUVF9OT1RZUEUgfHwgb190eXBlID09IFNUVF9PQkpFQ1QpKQoJCQkJcmV0dXJuIHN5bTsKCQkJZWxzZSBpZiAob19zZWNpZHggPT0gU0hOX0NPTU1PTgoJCQkJCSAmJiAobl90eXBlID09IFNUVF9OT1RZUEUgfHwgbl90eXBlID09IFNUVF9PQkpFQ1QpKQoJCQkJZ290byBmb3VuZDsKCQkJZWxzZSB7CgkJCQkvKiBEb24ndCByZXBvcnQgYW4gZXJyb3IgaWYgdGhlIHN5bWJvbCBpcyBjb21pbmcgZnJvbQoJCQkJICAgdGhlIGtlcm5lbCBvciBzb21lIGV4dGVybmFsIG1vZHVsZS4gICovCgkJCQlpZiAoc2VjaWR4IDw9IFNITl9ISVJFU0VSVkUpCgkJCQkJZXJyb3JfbXNnKCIlcyBtdWx0aXBseSBkZWZpbmVkIiwgbmFtZSk7CgkJCQlyZXR1cm4gc3ltOwoJCQl9CgkJfQoKCS8qIENvbXBsZXRlbHkgbmV3IHN5bWJvbC4gICovCglzeW0gPSBhcmNoX25ld19zeW1ib2woKTsKCXN5bS0+bmV4dCA9IGYtPnN5bXRhYltoYXNoXTsKCWYtPnN5bXRhYltoYXNoXSA9IHN5bTsKCXN5bS0+a3N5bWlkeCA9IC0xOwoKCWlmIChFTEZXKFNUX0JJTkQpKGluZm8pID09IFNUQl9MT0NBTCAmJiBzeW1pZHggIT0gLTEpIHsKCQlpZiAoc3ltaWR4ID49IGYtPmxvY2FsX3N5bXRhYl9zaXplKQoJCQllcnJvcl9tc2coImxvY2FsIHN5bWJvbCAlcyB3aXRoIGluZGV4ICVsZCBleGNlZWRzIGxvY2FsX3N5bXRhYl9zaXplICVsZCIsCgkJCQkJbmFtZSwgKGxvbmcpIHN5bWlkeCwgKGxvbmcpIGYtPmxvY2FsX3N5bXRhYl9zaXplKTsKCQllbHNlCgkJCWYtPmxvY2FsX3N5bXRhYltzeW1pZHhdID0gc3ltOwoJfQoKICBmb3VuZDoKCXN5bS0+bmFtZSA9IG5hbWU7CglzeW0tPnZhbHVlID0gdmFsdWU7CglzeW0tPnNpemUgPSBzaXplOwoJc3ltLT5zZWNpZHggPSBzZWNpZHg7CglzeW0tPmluZm8gPSBpbmZvOwoKCXJldHVybiBzeW07Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqCm9ial9maW5kX3N5bWJvbChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKm5hbWUpCnsKCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07Cgl1bnNpZ25lZCBsb25nIGhhc2ggPSBmLT5zeW1ib2xfaGFzaChuYW1lKSAlIEhBU0hfQlVDS0VUUzsKCglmb3IgKHN5bSA9IGYtPnN5bXRhYltoYXNoXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCgkJaWYgKGYtPnN5bWJvbF9jbXAoc3ltLT5uYW1lLCBuYW1lKSA9PSAwKQoJCQlyZXR1cm4gc3ltOwoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgRWxmVyhBZGRyKQoJb2JqX3N5bWJvbF9maW5hbF92YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKiBmLCBzdHJ1Y3Qgb2JqX3N5bWJvbCAqIHN5bSkKewoJaWYgKHN5bSkgewoJCWlmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFKQoJCQlyZXR1cm4gc3ltLT52YWx1ZTsKCgkJcmV0dXJuIHN5bS0+dmFsdWUgKyBmLT5zZWN0aW9uc1tzeW0tPnNlY2lkeF0tPmhlYWRlci5zaF9hZGRyOwoJfSBlbHNlIHsKCQkvKiBBcyBhIHNwZWNpYWwgY2FzZSwgYSBOVUxMIHN5bSBoYXMgdmFsdWUgemVyby4gICovCgkJcmV0dXJuIDA7Cgl9Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9maW5kX3NlY3Rpb24oc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpuYW1lKQp7CglpbnQgaSwgbiA9IGYtPmhlYWRlci5lX3NobnVtOwoKCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCgkJaWYgKHN0cmNtcChmLT5zZWN0aW9uc1tpXS0+bmFtZSwgbmFtZSkgPT0gMCkKCQkJcmV0dXJuIGYtPnNlY3Rpb25zW2ldOwoKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50IG9ial9sb2FkX29yZGVyX3ByaW8oc3RydWN0IG9ial9zZWN0aW9uICphKQp7Cgl1bnNpZ25lZCBsb25nIGFmLCBhYzsKCglhZiA9IGEtPmhlYWRlci5zaF9mbGFnczsKCglhYyA9IDA7CglpZiAoYS0+bmFtZVswXSAhPSAnLicgfHwgc3RybGVuKGEtPm5hbWUpICE9IDEwIHx8CgkJc3RyY21wKGEtPm5hbWUgKyA1LCAiLmluaXQiKSkKCQlhYyB8PSAzMjsKCWlmIChhZiAmIFNIRl9BTExPQykKCQlhYyB8PSAxNjsKCWlmICghKGFmICYgU0hGX1dSSVRFKSkKCQlhYyB8PSA4OwoJaWYgKGFmICYgU0hGX0VYRUNJTlNUUikKCQlhYyB8PSA0OwoJaWYgKGEtPmhlYWRlci5zaF90eXBlICE9IFNIVF9OT0JJVFMpCgkJYWMgfD0gMjsKCglyZXR1cm4gYWM7Cn0KCnN0YXRpYyB2b2lkCm9ial9pbnNlcnRfc2VjdGlvbl9sb2FkX29yZGVyKHN0cnVjdCBvYmpfZmlsZSAqZiwgc3RydWN0IG9ial9zZWN0aW9uICpzZWMpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqKnA7CglpbnQgcHJpbyA9IG9ial9sb2FkX29yZGVyX3ByaW8oc2VjKTsKCWZvciAocCA9IGYtPmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0OyAqcDsgcCA9ICYoKnApLT5sb2FkX25leHQpCgkJaWYgKG9ial9sb2FkX29yZGVyX3ByaW8oKnApIDwgcHJpbykKCQkJYnJlYWs7CglzZWMtPmxvYWRfbmV4dCA9ICpwOwoJKnAgPSBzZWM7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCQkJCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLAoJCQkJCQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWxpZ24sCgkJCQkJCQkJCQkJICAgdW5zaWduZWQgbG9uZyBzaXplKQp7CglpbnQgbmV3aWR4ID0gZi0+aGVhZGVyLmVfc2hudW0rKzsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoKCWYtPnNlY3Rpb25zID0geHJlYWxsb2MoZi0+c2VjdGlvbnMsIChuZXdpZHggKyAxKSAqIHNpemVvZihzZWMpKTsKCWYtPnNlY3Rpb25zW25ld2lkeF0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CgoJbWVtc2V0KHNlYywgMCwgc2l6ZW9mKCpzZWMpKTsKCXNlYy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CglzZWMtPmhlYWRlci5zaF9mbGFncyA9IFNIRl9XUklURSB8IFNIRl9BTExPQzsKCXNlYy0+aGVhZGVyLnNoX3NpemUgPSBzaXplOwoJc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gYWxpZ247CglzZWMtPm5hbWUgPSBuYW1lOwoJc2VjLT5pZHggPSBuZXdpZHg7CglpZiAoc2l6ZSkKCQlzZWMtPmNvbnRlbnRzID0geG1hbGxvYyhzaXplKTsKCglvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihmLCBzZWMpOwoKCXJldHVybiBzZWM7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKm9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uX2ZpcnN0KHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCQkJCQkJCQkJCSBjb25zdCBjaGFyICpuYW1lLAoJCQkJCQkJCQkJCQkJIHVuc2lnbmVkIGxvbmcgYWxpZ24sCgkJCQkJCQkJCQkJCQkgdW5zaWduZWQgbG9uZyBzaXplKQp7CglpbnQgbmV3aWR4ID0gZi0+aGVhZGVyLmVfc2hudW0rKzsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoKCWYtPnNlY3Rpb25zID0geHJlYWxsb2MoZi0+c2VjdGlvbnMsIChuZXdpZHggKyAxKSAqIHNpemVvZihzZWMpKTsKCWYtPnNlY3Rpb25zW25ld2lkeF0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CgoJbWVtc2V0KHNlYywgMCwgc2l6ZW9mKCpzZWMpKTsKCXNlYy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CglzZWMtPmhlYWRlci5zaF9mbGFncyA9IFNIRl9XUklURSB8IFNIRl9BTExPQzsKCXNlYy0+aGVhZGVyLnNoX3NpemUgPSBzaXplOwoJc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gYWxpZ247CglzZWMtPm5hbWUgPSBuYW1lOwoJc2VjLT5pZHggPSBuZXdpZHg7CglpZiAoc2l6ZSkKCQlzZWMtPmNvbnRlbnRzID0geG1hbGxvYyhzaXplKTsKCglzZWMtPmxvYWRfbmV4dCA9IGYtPmxvYWRfb3JkZXI7CglmLT5sb2FkX29yZGVyID0gc2VjOwoJaWYgKGYtPmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0ID09ICZmLT5sb2FkX29yZGVyKQoJCWYtPmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0ID0gJnNlYy0+bG9hZF9uZXh0OwoKCXJldHVybiBzZWM7Cn0KCnN0YXRpYyB2b2lkICpvYmpfZXh0ZW5kX3NlY3Rpb24oc3RydWN0IG9ial9zZWN0aW9uICpzZWMsIHVuc2lnbmVkIGxvbmcgbW9yZSkKewoJdW5zaWduZWQgbG9uZyBvbGRzaXplID0gc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCWlmIChtb3JlKSB7IAoJCXNlYy0+Y29udGVudHMgPSB4cmVhbGxvYyhzZWMtPmNvbnRlbnRzLCBzZWMtPmhlYWRlci5zaF9zaXplICs9IG1vcmUpOwoJfQoJcmV0dXJuIHNlYy0+Y29udGVudHMgKyBvbGRzaXplOwp9CgoKLyogQ29uZGl0aW9uYWxseSBhZGQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgZ2l2ZW4gc3ltYm9sIHNldCB0byB0aGUKICAgbmV3IG1vZHVsZS4gICovCgpzdGF0aWMgaW50CmFkZF9zeW1ib2xzX2Zyb20oCgkJCQkgc3RydWN0IG9ial9maWxlICpmLAoJCQkJIGludCBpZHgsIHN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqc3ltcywgc2l6ZV90IG5zeW1zKQp7CglzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnM7CglzaXplX3QgaTsKCWludCB1c2VkID0gMDsKCglmb3IgKGkgPSAwLCBzID0gc3ltczsgaSA8IG5zeW1zOyArK2ksICsrcykgewoKCQkvKiBPbmx5IGFkZCBzeW1ib2xzIHRoYXQgYXJlIGFscmVhZHkgbWFya2VkIGV4dGVybmFsLiAgSWYgd2UKCQkgICBvdmVycmlkZSBsb2NhbHMgd2UgbWF5IGNhdXNlIHByb2JsZW1zIGZvciBhcmd1bWVudCBpbml0aWFsaXphdGlvbi4KCQkgICBXZSB3aWxsIGFsc28gY3JlYXRlIGEgZmFsc2UgZGVwZW5kZW5jeSBvbiB0aGUgbW9kdWxlLiAgKi8KCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoKCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgKGNoYXIgKikgcy0+bmFtZSk7CgkJaWYgKHN5bSAmJiAhRUxGVyhTVF9CSU5EKSAoc3ltLT5pbmZvKSA9PSBTVEJfTE9DQUwpIHsKCQkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgKGNoYXIgKikgcy0+bmFtZSwgLTEsCgkJCQkJCQkJIEVMRlcoU1RfSU5GTykgKFNUQl9HTE9CQUwsIFNUVF9OT1RZUEUpLAoJCQkJCQkJCSBpZHgsIHMtPnZhbHVlLCAwKTsKCQkJLyogRGlkIG91ciBzeW1ib2wganVzdCBnZXQgaW5zdGFsbGVkPyAgSWYgc28sIG1hcmsgdGhlCgkJCSAgIG1vZHVsZSBhcyAidXNlZCIuICAqLwoJCQlpZiAoc3ltLT5zZWNpZHggPT0gaWR4KQoJCQkJdXNlZCA9IDE7CgkJfQoJfQoKCXJldHVybiB1c2VkOwp9CgpzdGF0aWMgdm9pZCBhZGRfa2VybmVsX3N5bWJvbHMoc3RydWN0IG9ial9maWxlICpmKQp7CglzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlICptOwoJaW50IGksIG51c2VkID0gMDsKCgkvKiBBZGQgbW9kdWxlIHN5bWJvbHMgZmlyc3QuICAqLwoKCWZvciAoaSA9IDAsIG0gPSBleHRfbW9kdWxlczsgaSA8IG5fZXh0X21vZHVsZXM7ICsraSwgKyttKQoJCWlmIChtLT5uc3ltcwoJCQkmJiBhZGRfc3ltYm9sc19mcm9tKGYsIFNITl9ISVJFU0VSVkUgKyAyICsgaSwgbS0+c3ltcywKCQkJCQkJCQltLT5uc3ltcykpIG0tPnVzZWQgPSAxLCArK251c2VkOwoKCW5fZXh0X21vZHVsZXNfdXNlZCA9IG51c2VkOwoKCS8qIEFuZCBmaW5hbGx5IHRoZSBzeW1ib2xzIGZyb20gdGhlIGtlcm5lbCBwcm9wZXIuICAqLwoKCWlmIChua3N5bXMpCgkJYWRkX3N5bWJvbHNfZnJvbShmLCBTSE5fSElSRVNFUlZFICsgMSwga3N5bXMsIG5rc3ltcyk7Cn0KCnN0YXRpYyBjaGFyICpnZXRfbW9kaW5mb192YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKmtleSkKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgljaGFyICpwLCAqdiwgKm4sICplcDsKCXNpemVfdCBrbGVuID0gc3RybGVuKGtleSk7CgoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLm1vZGluZm8iKTsKCWlmIChzZWMgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCXAgPSBzZWMtPmNvbnRlbnRzOwoJZXAgPSBwICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCXdoaWxlIChwIDwgZXApIHsKCQl2ID0gc3RyY2hyKHAsICc9Jyk7CgkJbiA9IHN0cmNocihwLCAnXDAnKTsKCQlpZiAodikgewoJCQlpZiAocCArIGtsZW4gPT0gdiAmJiBzdHJuY21wKHAsIGtleSwga2xlbikgPT0gMCkKCQkJCXJldHVybiB2ICsgMTsKCQl9IGVsc2UgewoJCQlpZiAocCArIGtsZW4gPT0gbiAmJiBzdHJjbXAocCwga2V5KSA9PSAwKQoJCQkJcmV0dXJuIG47CgkJfQoJCXAgPSBuICsgMTsKCX0KCglyZXR1cm4gTlVMTDsKfQoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qIEZ1bmN0aW9ucyByZWxhdGluZyB0byBtb2R1bGUgbG9hZGluZyBpbiBwcmUgMi4xIGtlcm5lbHMuICAqLwoKc3RhdGljIGludApvbGRfcHJvY2Vzc19tb2R1bGVfYXJndW1lbnRzKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7Cgl3aGlsZSAoYXJnYyA+IDApIHsKCQljaGFyICpwLCAqcTsKCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJCWludCAqbG9jOwoKCQlwID0gKmFyZ3Y7CgkJaWYgKChxID0gc3RyY2hyKHAsICc9JykpID09IE5VTEwpIHsKCQkJYXJnYy0tOwoJCQljb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCQkqcSsrID0gJ1wwJzsKCgkJc3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsIHApOwoKCQkvKiBBbHNvIGNoZWNrIHRoYXQgdGhlIHBhcmFtZXRlciB3YXMgbm90IHJlc29sdmVkIGZyb20gdGhlIGtlcm5lbC4gICovCgkJaWYgKHN5bSA9PSBOVUxMIHx8IHN5bS0+c2VjaWR4ID4gU0hOX0hJUkVTRVJWRSkgewoJCQllcnJvcl9tc2coInN5bWJvbCBmb3IgcGFyYW1ldGVyICVzIG5vdCBmb3VuZCIsIHApOwoJCQlyZXR1cm4gMDsKCQl9CgoJCWxvYyA9IChpbnQgKikgKGYtPnNlY3Rpb25zW3N5bS0+c2VjaWR4XS0+Y29udGVudHMgKyBzeW0tPnZhbHVlKTsKCgkJLyogRG8gQyBxdW90aW5nIGlmIHdlIGJlZ2luIHdpdGggYSAiLiAgKi8KCQlpZiAoKnEgPT0gJyInKSB7CgkJCWNoYXIgKnIsICpzdHI7CgoJCQlzdHIgPSBhbGxvY2Eoc3RybGVuKHEpKTsKCQkJZm9yIChyID0gc3RyLCBxKys7ICpxICE9ICciJzsgKytxLCArK3IpIHsKCQkJCWlmICgqcSA9PSAnXDAnKSB7CgkJCQkJZXJyb3JfbXNnKCJpbXByb3Blcmx5IHRlcm1pbmF0ZWQgc3RyaW5nIGFyZ3VtZW50IGZvciAlcyIsIHApOwoJCQkJCXJldHVybiAwOwoJCQkJfSBlbHNlIGlmICgqcSA9PSAnXFwnKQoJCQkJCXN3aXRjaCAoKisrcSkgewoJCQkJCWNhc2UgJ2EnOgoJCQkJCQkqciA9ICdcYSc7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2InOgoJCQkJCQkqciA9ICdcYic7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ2UnOgoJCQkJCQkqciA9ICdcMDMzJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnZic6CgkJCQkJCSpyID0gJ1xmJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnbic6CgkJCQkJCSpyID0gJ1xuJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAncic6CgkJCQkJCSpyID0gJ1xyJzsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAndCc6CgkJCQkJCSpyID0gJ1x0JzsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgJzAnOgoJCQkJCWNhc2UgJzEnOgoJCQkJCWNhc2UgJzInOgoJCQkJCWNhc2UgJzMnOgoJCQkJCWNhc2UgJzQnOgoJCQkJCWNhc2UgJzUnOgoJCQkJCWNhc2UgJzYnOgoJCQkJCWNhc2UgJzcnOgoJCQkJCQl7CgkJCQkJCQlpbnQgYyA9ICpxIC0gJzAnOwoJCQkJCQkJaWYgKHFbMV0gPj0gJzAnICYmIHFbMV0gPD0gJzcnKSB7CgkJCQkJCQkJYyA9IChjICogOCkgKyAqKytxIC0gJzAnOwoJCQkJCQkJCWlmIChxWzFdID49ICcwJyAmJiBxWzFdIDw9ICc3JykKCQkJCQkJCQkJYyA9IChjICogOCkgKyAqKytxIC0gJzAnOwoJCQkJCQkJfQoJCQkJCQkJKnIgPSBjOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQlkZWZhdWx0OgoJCQkJCQkqciA9ICpxOwoJCQkJCQlicmVhazsKCQkJCX0gZWxzZQoJCQkJCSpyID0gKnE7CgkJCX0KCQkJKnIgPSAnXDAnOwoJCQlvYmpfc3RyaW5nX3BhdGNoKGYsIHN5bS0+c2VjaWR4LCBzeW0tPnZhbHVlLCBzdHIpOwoJCX0gZWxzZSBpZiAoKnEgPj0gJzAnICYmICpxIDw9ICc5JykgewoJCQlkbwoJCQkJKmxvYysrID0gc3RydG91bChxLCAmcSwgMCk7CgkJCXdoaWxlICgqcSsrID09ICcsJyk7CgkJfSBlbHNlIHsKCQkJY2hhciAqY29udGVudHMgPSBmLT5zZWN0aW9uc1tzeW0tPnNlY2lkeF0tPmNvbnRlbnRzOwoJCQljaGFyICpteWxvYyA9IGNvbnRlbnRzICsgc3ltLT52YWx1ZTsKCQkJY2hhciAqcjsJCQkvKiBUbyBzZWFyY2ggZm9yIGNvbW1hcyAqLwoKCQkJLyogQnJlYWsgdGhlIHN0cmluZyB3aXRoIGNvbWFzICovCgkJCXdoaWxlICgociA9IHN0cmNocihxLCAnLCcpKSAhPSAoY2hhciAqKSBOVUxMKSB7CgkJCQkqcisrID0gJ1wwJzsKCQkJCW9ial9zdHJpbmdfcGF0Y2goZiwgc3ltLT5zZWNpZHgsIG15bG9jIC0gY29udGVudHMsIHEpOwoJCQkJbXlsb2MgKz0gc2l6ZW9mKGNoYXIgKik7CgkJCQlxID0gcjsKCQkJfQoKCQkJLyogbGFzdCBwYXJ0ICovCgkJCW9ial9zdHJpbmdfcGF0Y2goZiwgc3ltLT5zZWNpZHgsIG15bG9jIC0gY29udGVudHMsIHEpOwoJCX0KCgkJYXJnYy0tLCBhcmd2Kys7Cgl9CgoJcmV0dXJuIDE7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwpzdGF0aWMgaW50IG9sZF9pc19tb2R1bGVfY2hlY2tzdW1tZWQoc3RydWN0IG9ial9maWxlICpmKQp7CglyZXR1cm4gb2JqX2ZpbmRfc3ltYm9sKGYsICJVc2luZ19WZXJzaW9ucyIpICE9IE5VTEw7Cn0KLyogR2V0IHRoZSBtb2R1bGUncyBrZXJuZWwgdmVyc2lvbiBpbiB0aGUgY2Fub25pY2FsIGludGVnZXIgZm9ybS4gICovCgpzdGF0aWMgaW50Cm9sZF9nZXRfbW9kdWxlX3ZlcnNpb24oc3RydWN0IG9ial9maWxlICpmLCBjaGFyIHN0cltTVFJWRVJTSU9OTEVOXSkKewoJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCWNoYXIgKnAsICpxOwoJaW50IGEsIGIsIGM7CgoJc3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsICJrZXJuZWxfdmVyc2lvbiIpOwoJaWYgKHN5bSA9PSBOVUxMKQoJCXJldHVybiAtMTsKCglwID0gZi0+c2VjdGlvbnNbc3ltLT5zZWNpZHhdLT5jb250ZW50cyArIHN5bS0+dmFsdWU7CglzdHJuY3B5KHN0ciwgcCwgU1RSVkVSU0lPTkxFTik7CgoJYSA9IHN0cnRvdWwocCwgJnAsIDEwKTsKCWlmICgqcCAhPSAnLicpCgkJcmV0dXJuIC0xOwoJYiA9IHN0cnRvdWwocCArIDEsICZwLCAxMCk7CglpZiAoKnAgIT0gJy4nKQoJCXJldHVybiAtMTsKCWMgPSBzdHJ0b3VsKHAgKyAxLCAmcSwgMTApOwoJaWYgKHAgKyAxID09IHEpCgkJcmV0dXJuIC0xOwoKCXJldHVybiBhIDw8IDE2IHwgYiA8PCA4IHwgYzsKfQoKI2VuZGlmICAgLyogQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9PTERfTU9EVUxFX0lOVEVSRkFDRQoKLyogRmV0Y2ggYWxsIHRoZSBzeW1ib2xzIGFuZCBkaXZ2eSB0aGVtIHVwIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgbW9kdWxlcy4gICovCgpzdGF0aWMgaW50IG9sZF9nZXRfa2VybmVsX3N5bWJvbHMoY29uc3QgY2hhciAqbV9uYW1lKQp7CglzdHJ1Y3Qgb2xkX2tlcm5lbF9zeW0gKmtzLCAqazsKCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqczsKCXN0cnVjdCBleHRlcm5hbF9tb2R1bGUgKm1vZDsKCWludCBua3MsIG5tcywgbm1vZCwgaTsKCglua3MgPSBnZXRfa2VybmVsX3N5bXMoTlVMTCk7CglpZiAobmtzIDw9IDApIHsKCQlpZiAobmtzKQoJCQlwZXJyb3JfbXNnKCJnZXRfa2VybmVsX3N5bXM6ICVzIiwgbV9uYW1lKTsKCQllbHNlCgkJCWVycm9yX21zZygiTm8ga2VybmVsIHN5bWJvbHMiKTsKCQlyZXR1cm4gMDsKCX0KCglrcyA9IGsgPSB4bWFsbG9jKG5rcyAqIHNpemVvZigqa3MpKTsKCglpZiAoZ2V0X2tlcm5lbF9zeW1zKGtzKSAhPSBua3MpIHsKCQlwZXJyb3IoImluY29uc2lzdGVuY3kgd2l0aCBnZXRfa2VybmVsX3N5bXMgLS0gaXMgc29tZW9uZSBlbHNlICIKCQkJICAgInBsYXlpbmcgd2l0aCBtb2R1bGVzPyIpOwoJCWZyZWUoa3MpOwoJCXJldHVybiAwOwoJfQoKCS8qIENvbGxlY3QgdGhlIG1vZHVsZSBpbmZvcm1hdGlvbi4gICovCgoJbW9kID0gTlVMTDsKCW5tb2QgPSAtMTsKCgl3aGlsZSAoay0+bmFtZVswXSA9PSAnIycgJiYgay0+bmFtZVsxXSkgewoJCXN0cnVjdCBvbGRfa2VybmVsX3N5bSAqazI7CgoJCS8qIEZpbmQgb3V0IGhvdyBtYW55IHN5bWJvbHMgdGhpcyBtb2R1bGUgaGFzLiAgKi8KCQlmb3IgKGsyID0gayArIDE7IGsyLT5uYW1lWzBdICE9ICcjJzsgKytrMikKCQkJY29udGludWU7CgkJbm1zID0gazIgLSBrIC0gMTsKCgkJbW9kID0geHJlYWxsb2MobW9kLCAoKytubW9kICsgMSkgKiBzaXplb2YoKm1vZCkpOwoJCW1vZFtubW9kXS5uYW1lID0gay0+bmFtZSArIDE7CgkJbW9kW25tb2RdLmFkZHIgPSBrLT52YWx1ZTsKCQltb2Rbbm1vZF0udXNlZCA9IDA7CgkJbW9kW25tb2RdLm5zeW1zID0gbm1zOwoJCW1vZFtubW9kXS5zeW1zID0gcyA9IChubXMgPyB4bWFsbG9jKG5tcyAqIHNpemVvZigqcykpIDogTlVMTCk7CgoJCWZvciAoaSA9IDAsICsrazsgaSA8IG5tczsgKytpLCArK3MsICsraykgewoJCQlzLT5uYW1lID0gKHVuc2lnbmVkIGxvbmcpIGstPm5hbWU7CgkJCXMtPnZhbHVlID0gay0+dmFsdWU7CgkJfQoKCQlrID0gazI7Cgl9CgoJZXh0X21vZHVsZXMgPSBtb2Q7CgluX2V4dF9tb2R1bGVzID0gbm1vZCArIDE7CgoJLyogTm93IGNvbGxlY3QgdGhlIHN5bWJvbHMgZm9yIHRoZSBrZXJuZWwgcHJvcGVyLiAgKi8KCglpZiAoay0+bmFtZVswXSA9PSAnIycpCgkJKytrOwoKCW5rc3ltcyA9IG5tcyA9IG5rcyAtIChrIC0ga3MpOwoJa3N5bXMgPSBzID0gKG5tcyA/IHhtYWxsb2Mobm1zICogc2l6ZW9mKCpzKSkgOiBOVUxMKTsKCglmb3IgKGkgPSAwOyBpIDwgbm1zOyArK2ksICsrcywgKytrKSB7CgkJcy0+bmFtZSA9ICh1bnNpZ25lZCBsb25nKSBrLT5uYW1lOwoJCXMtPnZhbHVlID0gay0+dmFsdWU7Cgl9CgoJcmV0dXJuIDE7Cn0KCi8qIFJldHVybiB0aGUga2VybmVsIHN5bWJvbCBjaGVja3N1bSB2ZXJzaW9uLCBvciB6ZXJvIGlmIG5vdCB1c2VkLiAgKi8KCnN0YXRpYyBpbnQgb2xkX2lzX2tlcm5lbF9jaGVja3N1bW1lZCh2b2lkKQp7CgkvKiBVc2luZ19WZXJzaW9ucyBpcyB0aGUgZmlyc3Qgc3ltYm9sLiAgKi8KCWlmIChua3N5bXMgPiAwCgkJJiYgc3RyY21wKChjaGFyICopIGtzeW1zWzBdLm5hbWUsCgkJCQkgICJVc2luZ19WZXJzaW9ucyIpID09IDApIHJldHVybiBrc3ltc1swXS52YWx1ZTsKCWVsc2UKCQlyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgb2xkX2NyZWF0ZV9tb2RfdXNlX2NvdW50KHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb25fZmlyc3QoZiwgIi5tb2R1c2UiLCBzaXplb2YobG9uZyksCgkJCQkJCQkJCQkgICBzaXplb2YobG9uZykpOwoKCW9ial9hZGRfc3ltYm9sKGYsICJtb2RfdXNlX2NvdW50XyIsIC0xLAoJCQkJICAgRUxGVyhTVF9JTkZPKSAoU1RCX0xPQ0FMLCBTVFRfT0JKRUNUKSwgc2VjLT5pZHgsIDAsCgkJCQkgICBzaXplb2YobG9uZykpOwoKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50Cm9sZF9pbml0X21vZHVsZShjb25zdCBjaGFyICptX25hbWUsIHN0cnVjdCBvYmpfZmlsZSAqZiwKCQkJCXVuc2lnbmVkIGxvbmcgbV9zaXplKQp7CgljaGFyICppbWFnZTsKCXN0cnVjdCBvbGRfbW9kX3JvdXRpbmVzIHJvdXRpbmVzOwoJc3RydWN0IG9sZF9zeW1ib2xfdGFibGUgKnN5bXRhYjsKCWludCByZXQ7CgoJLyogQ3JlYXRlIHRoZSBzeW1ib2wgdGFibGUgKi8KCXsKCQlpbnQgbnN5bXMgPSAwLCBzdHJzaXplID0gMCwgdG90YWw7CgoJCS8qIFNpemUgdGhpbmdzIGZpcnN0Li4uICovCgkJaWYgKGZsYWdfZXhwb3J0KSB7CgkJCWludCBpOwoJCQlmb3IgKGkgPSAwOyBpIDwgSEFTSF9CVUNLRVRTOyArK2kpIHsKCQkJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgkJCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCgkJCQkJaWYgKEVMRlcoU1RfQklORCkgKHN5bS0+aW5mbykgIT0gU1RCX0xPQ0FMCgkJCQkJCSYmIHN5bS0+c2VjaWR4IDw9IFNITl9ISVJFU0VSVkUpIAoJCQkJCXsKCQkJCQkJc3ltLT5rc3ltaWR4ID0gbnN5bXMrKzsKCQkJCQkJc3Ryc2l6ZSArPSBzdHJsZW4oc3ltLT5uYW1lKSArIDE7CgkJCQkJfQoJCQl9CgkJfQoKCQl0b3RhbCA9IChzaXplb2Yoc3RydWN0IG9sZF9zeW1ib2xfdGFibGUpCgkJCQkgKyBuc3ltcyAqIHNpemVvZihzdHJ1Y3Qgb2xkX21vZHVsZV9zeW1ib2wpCgkJCQkgKyBuX2V4dF9tb2R1bGVzX3VzZWQgKiBzaXplb2Yoc3RydWN0IG9sZF9tb2R1bGVfcmVmKQoJCQkJICsgc3Ryc2l6ZSk7CgkJc3ltdGFiID0geG1hbGxvYyh0b3RhbCk7CgkJc3ltdGFiLT5zaXplID0gdG90YWw7CgkJc3ltdGFiLT5uX3N5bWJvbHMgPSBuc3ltczsKCQlzeW10YWItPm5fcmVmcyA9IG5fZXh0X21vZHVsZXNfdXNlZDsKCgkJaWYgKGZsYWdfZXhwb3J0ICYmIG5zeW1zKSB7CgkJCXN0cnVjdCBvbGRfbW9kdWxlX3N5bWJvbCAqa3N5bTsKCQkJY2hhciAqc3RyOwoJCQlpbnQgaTsKCgkJCWtzeW0gPSBzeW10YWItPnN5bWJvbDsKCQkJc3RyID0gKChjaGFyICopIGtzeW0gKyBuc3ltcyAqIHNpemVvZihzdHJ1Y3Qgb2xkX21vZHVsZV9zeW1ib2wpCgkJCQkgICArIG5fZXh0X21vZHVsZXNfdXNlZCAqIHNpemVvZihzdHJ1Y3Qgb2xkX21vZHVsZV9yZWYpKTsKCgkJCWZvciAoaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgewoJCQkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQkJCWZvciAoc3ltID0gZi0+c3ltdGFiW2ldOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkKCQkJCQlpZiAoc3ltLT5rc3ltaWR4ID49IDApIHsKCQkJCQkJa3N5bS0+YWRkciA9IG9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgc3ltKTsKCQkJCQkJa3N5bS0+bmFtZSA9CgkJCQkJCQkodW5zaWduZWQgbG9uZykgc3RyIC0gKHVuc2lnbmVkIGxvbmcpIHN5bXRhYjsKCgkJCQkJCXN0cmNweShzdHIsIHN5bS0+bmFtZSk7CgkJCQkJCXN0ciArPSBzdHJsZW4oc3ltLT5uYW1lKSArIDE7CgkJCQkJCWtzeW0rKzsKCQkJCQl9CgkJCX0KCQl9CgoJCWlmIChuX2V4dF9tb2R1bGVzX3VzZWQpIHsKCQkJc3RydWN0IG9sZF9tb2R1bGVfcmVmICpyZWY7CgkJCWludCBpOwoKCQkJcmVmID0gKHN0cnVjdCBvbGRfbW9kdWxlX3JlZiAqKQoJCQkJKChjaGFyICopIHN5bXRhYi0+c3ltYm9sICsgbnN5bXMgKiBzaXplb2Yoc3RydWN0IG9sZF9tb2R1bGVfc3ltYm9sKSk7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbl9leHRfbW9kdWxlczsgKytpKQoJCQkJaWYgKGV4dF9tb2R1bGVzW2ldLnVzZWQpCgkJCQkJcmVmKystPm1vZHVsZSA9IGV4dF9tb2R1bGVzW2ldLmFkZHI7CgkJfQoJfQoKCS8qIEZpbGwgaW4gcm91dGluZXMuICAqLwoKCXJvdXRpbmVzLmluaXQgPQoJCW9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgb2JqX2ZpbmRfc3ltYm9sKGYsICJpbml0X21vZHVsZSIpKTsKCXJvdXRpbmVzLmNsZWFudXAgPQoJCW9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgb2JqX2ZpbmRfc3ltYm9sKGYsICJjbGVhbnVwX21vZHVsZSIpKTsKCgkvKiBXaGV3ISAgQWxsIG9mIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS4gIENvbGxlY3QgdGhlIGZpbmFsCgkgICBtb2R1bGUgaW1hZ2UgYW5kIGdpdmUgaXQgdG8gdGhlIGtlcm5lbC4gICovCgoJaW1hZ2UgPSB4bWFsbG9jKG1fc2l6ZSk7CglvYmpfY3JlYXRlX2ltYWdlKGYsIGltYWdlKTsKCgkvKiBpbWFnZSBob2xkcyB0aGUgY29tcGxldGUgcmVsb2NhdGVkIG1vZHVsZSwgYWNjb3VudGluZyBjb3JyZWN0bHkgZm9yCgkgICBtb2RfdXNlX2NvdW50LiAgSG93ZXZlciB0aGUgb2xkIG1vZHVsZSBrZXJuZWwgc3VwcG9ydCBhc3N1bWUgdGhhdAoJICAgaXQgaXMgcmVjZWl2aW5nIHNvbWV0aGluZyB3aGljaCBkb2VzIG5vdCBjb250YWluIG1vZF91c2VfY291bnQuICAqLwoJcmV0ID0gb2xkX3N5c19pbml0X21vZHVsZShtX25hbWUsIGltYWdlICsgc2l6ZW9mKGxvbmcpLAoJCQkJCQkJICBtX3NpemUgfCAoZmxhZ19hdXRvY2xlYW4gPyBPTERfTU9EX0FVVE9DTEVBTgoJCQkJCQkJCQkJOiAwKSwgJnJvdXRpbmVzLCBzeW10YWIpOwoJaWYgKHJldCkKCQlwZXJyb3JfbXNnKCJpbml0X21vZHVsZTogJXMiLCBtX25hbWUpOwoKCWZyZWUoaW1hZ2UpOwoJZnJlZShzeW10YWIpOwoKCXJldHVybiByZXQgPT0gMDsKfQoKI2Vsc2UKCiNkZWZpbmUgb2xkX2NyZWF0ZV9tb2RfdXNlX2NvdW50KHgpIFRSVUUKI2RlZmluZSBvbGRfaW5pdF9tb2R1bGUoeCwgeSwgeikgVFJVRQoKI2VuZGlmCQkJCQkJCS8qIENPTkZJR19GRUFUVVJFX09MRF9NT0RVTEVfSU5URVJGQUNFICovCgoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi8qIEZ1bmN0aW9ucyByZWxhdGluZyB0byBtb2R1bGUgbG9hZGluZyBhZnRlciAyLjEuMTguICAqLwoKc3RhdGljIGludApuZXdfcHJvY2Vzc19tb2R1bGVfYXJndW1lbnRzKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7Cgl3aGlsZSAoYXJnYyA+IDApIHsKCQljaGFyICpwLCAqcSwgKmtleTsKCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJCWNoYXIgKmNvbnRlbnRzLCAqbG9jOwoJCWludCBtaW4sIG1heCwgbjsKCgkJcCA9ICphcmd2OwoJCWlmICgocSA9IHN0cmNocihwLCAnPScpKSA9PSBOVUxMKSB7CgkJCWFyZ2MtLTsKCQkJY29udGludWU7CiAgICAgICAgICAgICAgICB9CgoJCWtleSA9IGFsbG9jYShxIC0gcCArIDYpOwoJCW1lbWNweShrZXksICJwYXJtXyIsIDUpOwoJCW1lbWNweShrZXkgKyA1LCBwLCBxIC0gcCk7CgkJa2V5W3EgLSBwICsgNV0gPSAwOwoKCQlwID0gZ2V0X21vZGluZm9fdmFsdWUoZiwga2V5KTsKCQlrZXkgKz0gNTsKCQlpZiAocCA9PSBOVUxMKSB7CgkJCWVycm9yX21zZygiaW52YWxpZCBwYXJhbWV0ZXIgJXMiLCBrZXkpOwoJCQlyZXR1cm4gMDsKCQl9CgoJCXN5bSA9IG9ial9maW5kX3N5bWJvbChmLCBrZXkpOwoKCQkvKiBBbHNvIGNoZWNrIHRoYXQgdGhlIHBhcmFtZXRlciB3YXMgbm90IHJlc29sdmVkIGZyb20gdGhlIGtlcm5lbC4gICovCgkJaWYgKHN5bSA9PSBOVUxMIHx8IHN5bS0+c2VjaWR4ID4gU0hOX0hJUkVTRVJWRSkgewoJCQllcnJvcl9tc2coInN5bWJvbCBmb3IgcGFyYW1ldGVyICVzIG5vdCBmb3VuZCIsIGtleSk7CgkJCXJldHVybiAwOwoJCX0KCgkJaWYgKGlzZGlnaXQoKnApKSB7CgkJCW1pbiA9IHN0cnRvdWwocCwgJnAsIDEwKTsKCQkJaWYgKCpwID09ICctJykKCQkJCW1heCA9IHN0cnRvdWwocCArIDEsICZwLCAxMCk7CgkJCWVsc2UKCQkJCW1heCA9IG1pbjsKCQl9IGVsc2UKCQkJbWluID0gbWF4ID0gMTsKCgkJY29udGVudHMgPSBmLT5zZWN0aW9uc1tzeW0tPnNlY2lkeF0tPmNvbnRlbnRzOwoJCWxvYyA9IGNvbnRlbnRzICsgc3ltLT52YWx1ZTsKCQluID0gKCorK3EgIT0gJ1wwJyk7CgoJCXdoaWxlICgxKSB7CgkJCWlmICgoKnAgPT0gJ3MnKSB8fCAoKnAgPT0gJ2MnKSkgewoJCQkJY2hhciAqc3RyOwoKCQkJCS8qIERvIEMgcXVvdGluZyBpZiB3ZSBiZWdpbiB3aXRoIGEgIiwgZWxzZSBzbHVycCB0aGUgbG90LiAgKi8KCQkJCWlmICgqcSA9PSAnIicpIHsKCQkJCQljaGFyICpyOwoKCQkJCQlzdHIgPSBhbGxvY2Eoc3RybGVuKHEpKTsKCQkJCQlmb3IgKHIgPSBzdHIsIHErKzsgKnEgIT0gJyInOyArK3EsICsrcikgewoJCQkJCQlpZiAoKnEgPT0gJ1wwJykgewoJCQkJCQkJZXJyb3JfbXNnKCJpbXByb3Blcmx5IHRlcm1pbmF0ZWQgc3RyaW5nIGFyZ3VtZW50IGZvciAlcyIsCgkJCQkJCQkJCWtleSk7CgkJCQkJCQlyZXR1cm4gMDsKCQkJCQkJfSBlbHNlIGlmICgqcSA9PSAnXFwnKQoJCQkJCQkJc3dpdGNoICgqKytxKSB7CgkJCQkJCQljYXNlICdhJzoKCQkJCQkJCQkqciA9ICdcYSc7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdiJzoKCQkJCQkJCQkqciA9ICdcYic7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdlJzoKCQkJCQkJCQkqciA9ICdcMDMzJzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2YnOgoJCQkJCQkJCSpyID0gJ1xmJzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ24nOgoJCQkJCQkJCSpyID0gJ1xuJzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3InOgoJCQkJCQkJCSpyID0gJ1xyJzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3QnOgoJCQkJCQkJCSpyID0gJ1x0JzsKCQkJCQkJCQlicmVhazsKCgkJCQkJCQljYXNlICcwJzoKCQkJCQkJCWNhc2UgJzEnOgoJCQkJCQkJY2FzZSAnMic6CgkJCQkJCQljYXNlICczJzoKCQkJCQkJCWNhc2UgJzQnOgoJCQkJCQkJY2FzZSAnNSc6CgkJCQkJCQljYXNlICc2JzoKCQkJCQkJCWNhc2UgJzcnOgoJCQkJCQkJCXsKCQkJCQkJCQkJaW50IGMgPSAqcSAtICcwJzsKCQkJCQkJCQkJaWYgKHFbMV0gPj0gJzAnICYmIHFbMV0gPD0gJzcnKSB7CgkJCQkJCQkJCQljID0gKGMgKiA4KSArICorK3EgLSAnMCc7CgkJCQkJCQkJCQlpZiAocVsxXSA+PSAnMCcgJiYgcVsxXSA8PSAnNycpCgkJCQkJCQkJCQkJYyA9IChjICogOCkgKyAqKytxIC0gJzAnOwoJCQkJCQkJCQl9CgkJCQkJCQkJCSpyID0gYzsKCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkqciA9ICpxOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9IGVsc2UKCQkJCQkJCSpyID0gKnE7CgkJCQkJfQoJCQkJCSpyID0gJ1wwJzsKCQkJCQkrK3E7CgkJCQl9IGVsc2UgewoJCQkJCWNoYXIgKnI7CgoJCQkJCS8qIEluIHRoaXMgY2FzZSwgdGhlIHN0cmluZyBpcyBub3QgcXVvdGVkLiBXZSB3aWxsIGJyZWFrCgkJCQkJICAgaXQgdXNpbmcgdGhlIGNvbWEgKGxpa2UgZm9yIGludHMpLiBJZiB0aGUgdXNlciB3YW50cyB0bwoJCQkJCSAgIGluY2x1ZGUgY29tYXMgaW4gYSBzdHJpbmcsIGhlIGp1c3QgaGFzIHRvIHF1b3RlIGl0ICovCgoJCQkJCS8qIFNlYXJjaCB0aGUgbmV4dCBjb21hICovCgkJCQkJciA9IHN0cmNocihxLCAnLCcpOwoKCQkJCQkvKiBGb3VuZCA/ICovCgkJCQkJaWYgKHIgIT0gKGNoYXIgKikgTlVMTCkgewoJCQkJCQkvKiBSZWNvcHkgdGhlIGN1cnJlbnQgZmllbGQgKi8KCQkJCQkJc3RyID0gYWxsb2NhKHIgLSBxICsgMSk7CgkJCQkJCW1lbWNweShzdHIsIHEsIHIgLSBxKTsKCgkJCQkJCS8qIEkgZG9uJ3Qga25vdyBpZiBpdCBpcyB1c2VmdWxsLCBhcyB0aGUgcHJldmlvdXMgY2FzZQoJCQkJCQkgICBkb2Vzbid0IG51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgPz8/ICovCgkJCQkJCXN0cltyIC0gcV0gPSAnXDAnOwoKCQkJCQkJLyogS2VlcCBuZXh0IGZpZWxkcyAqLwoJCQkJCQlxID0gcjsKCQkJCQl9IGVsc2UgewoJCQkJCQkvKiBsYXN0IHN0cmluZyAqLwoJCQkJCQlzdHIgPSBxOwoJCQkJCQlxID0gIiI7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICgqcCA9PSAncycpIHsKCQkJCQkvKiBOb3JtYWwgc3RyaW5nICovCgkJCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzeW0tPnNlY2lkeCwgbG9jIC0gY29udGVudHMsIHN0cik7CgkJCQkJbG9jICs9IHRndF9zaXplb2ZfY2hhcl9wOwoJCQkJfSBlbHNlIHsKCQkJCQkvKiBBcnJheSBvZiBjaGFycyAoaW4gZmFjdCwgbWF0cml4ICEpICovCgkJCQkJdW5zaWduZWQgbG9uZyBjaGFyc3NpemU7CS8qIHNpemUgb2YgZWFjaCBtZW1iZXIgKi8KCgkJCQkJLyogR2V0IHRoZSBzaXplIG9mIGVhY2ggbWVtYmVyICovCgkJCQkJLyogUHJvYmFibHkgd2Ugc2hvdWxkIGRvIHRoYXQgb3V0c2lkZSB0aGUgbG9vcCA/ICovCgkJCQkJaWYgKCFpc2RpZ2l0KCoocCArIDEpKSkgewoJCQkJCQllcnJvcl9tc2coInBhcmFtZXRlciB0eXBlICdjJyBmb3IgJXMgbXVzdCBiZSBmb2xsb3dlZCBieSIKCQkJCQkJCQkiIHRoZSBtYXhpbXVtIHNpemUiLCBrZXkpOwoJCQkJCQlyZXR1cm4gMDsKCQkJCQl9CgkJCQkJY2hhcnNzaXplID0gc3RydG91bChwICsgMSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKCgkJCQkJLyogQ2hlY2sgbGVuZ3RoICovCgkJCQkJaWYgKHN0cmxlbihzdHIpID49IGNoYXJzc2l6ZSkgewoJCQkJCQllcnJvcl9tc2coInN0cmluZyB0b28gbG9uZyBmb3IgJXMgKG1heCAlbGQpIiwga2V5LAoJCQkJCQkJCWNoYXJzc2l6ZSAtIDEpOwoJCQkJCQlyZXR1cm4gMDsKCQkJCQl9CgoJCQkJCS8qIENvcHkgdG8gbG9jYXRpb24gKi8KCQkJCQlzdHJjcHkoKGNoYXIgKikgbG9jLCBzdHIpOwoJCQkJCWxvYyArPSBjaGFyc3NpemU7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlsb25nIHYgPSBzdHJ0b3VsKHEsICZxLCAwKTsKCQkJCXN3aXRjaCAoKnApIHsKCQkJCWNhc2UgJ2InOgoJCQkJCSpsb2MrKyA9IHY7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdoJzoKCQkJCQkqKHNob3J0ICopIGxvYyA9IHY7CgkJCQkJbG9jICs9IHRndF9zaXplb2Zfc2hvcnQ7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdpJzoKCQkJCQkqKGludCAqKSBsb2MgPSB2OwoJCQkJCWxvYyArPSB0Z3Rfc2l6ZW9mX2ludDsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2wnOgoJCQkJCSoobG9uZyAqKSBsb2MgPSB2OwoJCQkJCWxvYyArPSB0Z3Rfc2l6ZW9mX2xvbmc7CgkJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCQllcnJvcl9tc2coInVua25vd24gcGFyYW1ldGVyIHR5cGUgJyVjJyBmb3IgJXMiLCAqcCwga2V5KTsKCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJfQoKCQkgIHJldHJ5X2VuZF9vZl92YWx1ZToKCQkJc3dpdGNoICgqcSkgewoJCQljYXNlICdcMCc6CgkJCQlnb3RvIGVuZF9vZl9hcmc7CgoJCQljYXNlICcgJzoKCQkJY2FzZSAnXHQnOgoJCQljYXNlICdcbic6CgkJCWNhc2UgJ1xyJzoKCQkJCSsrcTsKCQkJCWdvdG8gcmV0cnlfZW5kX29mX3ZhbHVlOwoKCQkJY2FzZSAnLCc6CgkJCQlpZiAoKytuID4gbWF4KSB7CgkJCQkJZXJyb3JfbXNnKCJ0b28gbWFueSB2YWx1ZXMgZm9yICVzIChtYXggJWQpIiwga2V5LCBtYXgpOwoJCQkJCXJldHVybiAwOwoJCQkJfQoJCQkJKytxOwoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJZXJyb3JfbXNnKCJpbnZhbGlkIGFyZ3VtZW50IHN5bnRheCBmb3IgJXMiLCBrZXkpOwoJCQkJcmV0dXJuIDA7CgkJCX0KCQl9CgoJICBlbmRfb2ZfYXJnOgoJCWlmIChuIDwgbWluKSB7CgkJCWVycm9yX21zZygidG9vIGZldyB2YWx1ZXMgZm9yICVzIChtaW4gJWQpIiwga2V5LCBtaW4pOwoJCQlyZXR1cm4gMDsKCQl9CgoJCWFyZ2MtLSwgYXJndisrOwoJfQoKCXJldHVybiAxOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcKc3RhdGljIGludCBuZXdfaXNfbW9kdWxlX2NoZWNrc3VtbWVkKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJY29uc3QgY2hhciAqcCA9IGdldF9tb2RpbmZvX3ZhbHVlKGYsICJ1c2luZ19jaGVja3N1bXMiKTsKCWlmIChwKQoJCXJldHVybiBhdG9pKHApOwoJZWxzZQoJCXJldHVybiAwOwp9CgovKiBHZXQgdGhlIG1vZHVsZSdzIGtlcm5lbCB2ZXJzaW9uIGluIHRoZSBjYW5vbmljYWwgaW50ZWdlciBmb3JtLiAgKi8KCnN0YXRpYyBpbnQKbmV3X2dldF9tb2R1bGVfdmVyc2lvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgc3RyW1NUUlZFUlNJT05MRU5dKQp7CgljaGFyICpwLCAqcTsKCWludCBhLCBiLCBjOwoKCXAgPSBnZXRfbW9kaW5mb192YWx1ZShmLCAia2VybmVsX3ZlcnNpb24iKTsKCWlmIChwID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJc3RybmNweShzdHIsIHAsIFNUUlZFUlNJT05MRU4pOwoKCWEgPSBzdHJ0b3VsKHAsICZwLCAxMCk7CglpZiAoKnAgIT0gJy4nKQoJCXJldHVybiAtMTsKCWIgPSBzdHJ0b3VsKHAgKyAxLCAmcCwgMTApOwoJaWYgKCpwICE9ICcuJykKCQlyZXR1cm4gLTE7CgljID0gc3RydG91bChwICsgMSwgJnEsIDEwKTsKCWlmIChwICsgMSA9PSBxKQoJCXJldHVybiAtMTsKCglyZXR1cm4gYSA8PCAxNiB8IGIgPDwgOCB8IGM7Cn0KCiNlbmRpZiAgIC8qIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCgoKI2lmZGVmIENPTkZJR19GRUFUVVJFX05FV19NT0RVTEVfSU5URVJGQUNFCgovKiBGZXRjaCB0aGUgbG9hZGVkIG1vZHVsZXMsIGFuZCBhbGwgY3VycmVudGx5IGV4cG9ydGVkIHN5bWJvbHMuICAqLwoKc3RhdGljIGludCBuZXdfZ2V0X2tlcm5lbF9zeW1ib2xzKHZvaWQpCnsKCWNoYXIgKm1vZHVsZV9uYW1lcywgKm1uOwoJc3RydWN0IGV4dGVybmFsX21vZHVsZSAqbW9kdWxlcywgKm07CglzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnN5bXMsICpzOwoJc2l6ZV90IHJldCwgYnVmc2l6ZSwgbm1vZCwgbnN5bXMsIGksIGo7CgoJLyogQ29sbGVjdCB0aGUgbG9hZGVkIG1vZHVsZXMuICAqLwoKCW1vZHVsZV9uYW1lcyA9IHhtYWxsb2MoYnVmc2l6ZSA9IDI1Nik7CiAgcmV0cnlfbW9kdWxlc19sb2FkOgoJaWYgKHF1ZXJ5X21vZHVsZShOVUxMLCBRTV9NT0RVTEVTLCBtb2R1bGVfbmFtZXMsIGJ1ZnNpemUsICZyZXQpKSB7CgkJaWYgKGVycm5vID09IEVOT1NQQyAmJiBidWZzaXplIDwgcmV0KSB7CgkJCW1vZHVsZV9uYW1lcyA9IHhyZWFsbG9jKG1vZHVsZV9uYW1lcywgYnVmc2l6ZSA9IHJldCk7CgkJCWdvdG8gcmV0cnlfbW9kdWxlc19sb2FkOwoJCX0KCQlwZXJyb3JfbXNnKCJRTV9NT0RVTEVTIik7CgkJcmV0dXJuIDA7Cgl9CgoJbl9leHRfbW9kdWxlcyA9IG5tb2QgPSByZXQ7CgoJLyogQ29sbGVjdCB0aGUgbW9kdWxlcycgc3ltYm9scy4gICovCgoJaWYgKG5tb2QpewoJCWV4dF9tb2R1bGVzID0gbW9kdWxlcyA9IHhtYWxsb2Mobm1vZCAqIHNpemVvZigqbW9kdWxlcykpOwoJCW1lbXNldChtb2R1bGVzLCAwLCBubW9kICogc2l6ZW9mKCptb2R1bGVzKSk7CgkJZm9yIChpID0gMCwgbW4gPSBtb2R1bGVfbmFtZXMsIG0gPSBtb2R1bGVzOwoJCQkgaSA8IG5tb2Q7ICsraSwgKyttLCBtbiArPSBzdHJsZW4obW4pICsgMSkgewoJCQlzdHJ1Y3QgbmV3X21vZHVsZV9pbmZvIGluZm87CgkKCQkJaWYgKHF1ZXJ5X21vZHVsZShtbiwgUU1fSU5GTywgJmluZm8sIHNpemVvZihpbmZvKSwgJnJldCkpIHsKCQkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKCQkJCQkvKiBUaGUgbW9kdWxlIHdhcyByZW1vdmVkIG91dCBmcm9tIHVuZGVybmVhdGggdXMuICAqLwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJcGVycm9yX21zZygicXVlcnlfbW9kdWxlOiBRTV9JTkZPOiAlcyIsIG1uKTsKCQkJCXJldHVybiAwOwoJCQl9CgkKCQkJc3ltcyA9IHhtYWxsb2MoYnVmc2l6ZSA9IDEwMjQpOwoJCSAgcmV0cnlfbW9kX3N5bV9sb2FkOgoJCQlpZiAocXVlcnlfbW9kdWxlKG1uLCBRTV9TWU1CT0xTLCBzeW1zLCBidWZzaXplLCAmcmV0KSkgewoJCQkJc3dpdGNoIChlcnJubykgewoJCQkJY2FzZSBFTk9TUEM6CgkJCQkJc3ltcyA9IHhyZWFsbG9jKHN5bXMsIGJ1ZnNpemUgPSByZXQpOwoJCQkJCWdvdG8gcmV0cnlfbW9kX3N5bV9sb2FkOwoJCQkJY2FzZSBFTk9FTlQ6CgkJCQkJLyogVGhlIG1vZHVsZSB3YXMgcmVtb3ZlZCBvdXQgZnJvbSB1bmRlcm5lYXRoIHVzLiAgKi8KCQkJCQljb250aW51ZTsKCQkJCWRlZmF1bHQ6CgkJCQkJcGVycm9yX21zZygicXVlcnlfbW9kdWxlOiBRTV9TWU1CT0xTOiAlcyIsIG1uKTsKCQkJCQlyZXR1cm4gMDsKCQkJCX0KCQkJfQoJCQluc3ltcyA9IHJldDsKCQoJCQltLT5uYW1lID0gbW47CgkJCW0tPmFkZHIgPSBpbmZvLmFkZHI7CgkJCW0tPm5zeW1zID0gbnN5bXM7CgkJCW0tPnN5bXMgPSBzeW1zOwoJCgkJCWZvciAoaiA9IDAsIHMgPSBzeW1zOyBqIDwgbnN5bXM7ICsraiwgKytzKSB7CgkJCQlzLT5uYW1lICs9ICh1bnNpZ25lZCBsb25nKSBzeW1zOwoJCQl9CgkJfQoJfQoKCS8qIENvbGxlY3QgdGhlIGtlcm5lbCdzIHN5bWJvbHMuICAqLwoKCXN5bXMgPSB4bWFsbG9jKGJ1ZnNpemUgPSAxNiAqIDEwMjQpOwogIHJldHJ5X2tlcm5fc3ltX2xvYWQ6CglpZiAocXVlcnlfbW9kdWxlKE5VTEwsIFFNX1NZTUJPTFMsIHN5bXMsIGJ1ZnNpemUsICZyZXQpKSB7CgkJaWYgKGVycm5vID09IEVOT1NQQyAmJiBidWZzaXplIDwgcmV0KSB7CgkJCXN5bXMgPSB4cmVhbGxvYyhzeW1zLCBidWZzaXplID0gcmV0KTsKCQkJZ290byByZXRyeV9rZXJuX3N5bV9sb2FkOwoJCX0KCQlwZXJyb3JfbXNnKCJrZXJuZWw6IFFNX1NZTUJPTFMiKTsKCQlyZXR1cm4gMDsKCX0KCW5rc3ltcyA9IG5zeW1zID0gcmV0OwoJa3N5bXMgPSBzeW1zOwoKCWZvciAoaiA9IDAsIHMgPSBzeW1zOyBqIDwgbnN5bXM7ICsraiwgKytzKSB7CgkJcy0+bmFtZSArPSAodW5zaWduZWQgbG9uZykgc3ltczsKCX0KCXJldHVybiAxOwp9CgoKLyogUmV0dXJuIHRoZSBrZXJuZWwgc3ltYm9sIGNoZWNrc3VtIHZlcnNpb24sIG9yIHplcm8gaWYgbm90IHVzZWQuICAqLwoKc3RhdGljIGludCBuZXdfaXNfa2VybmVsX2NoZWNrc3VtbWVkKHZvaWQpCnsKCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqczsKCXNpemVfdCBpOwoKCS8qIFVzaW5nX1ZlcnNpb25zIGlzIG5vdCB0aGUgZmlyc3Qgc3ltYm9sLCBidXQgaXQgc2hvdWxkIGJlIGluIHRoZXJlLiAgKi8KCglmb3IgKGkgPSAwLCBzID0ga3N5bXM7IGkgPCBua3N5bXM7ICsraSwgKytzKQoJCWlmIChzdHJjbXAoKGNoYXIgKikgcy0+bmFtZSwgIlVzaW5nX1ZlcnNpb25zIikgPT0gMCkKCQkJcmV0dXJuIHMtPnZhbHVlOwoKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCBuZXdfY3JlYXRlX3RoaXNfbW9kdWxlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbV9uYW1lKQp7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCglzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbl9maXJzdChmLCAiLnRoaXMiLCB0Z3Rfc2l6ZW9mX2xvbmcsCgkJCQkJCQkJCQkgICBzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKCW1lbXNldChzZWMtPmNvbnRlbnRzLCAwLCBzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKCglvYmpfYWRkX3N5bWJvbChmLCAiX190aGlzX21vZHVsZSIsIC0xLAoJCQkJICAgRUxGVyhTVF9JTkZPKSAoU1RCX0xPQ0FMLCBTVFRfT0JKRUNUKSwgc2VjLT5pZHgsIDAsCgkJCQkgICBzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKCglvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZmZzZXRvZihzdHJ1Y3QgbmV3X21vZHVsZSwgbmFtZSksCgkJCQkJIG1fbmFtZSk7CgoJcmV0dXJuIDE7Cn0KCgpzdGF0aWMgaW50IG5ld19jcmVhdGVfbW9kdWxlX2tzeW10YWIoc3RydWN0IG9ial9maWxlICpmKQp7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCWludCBpOwoKCS8qIFdlIG11c3QgYWx3YXlzIGFkZCB0aGUgbW9kdWxlIHJlZmVyZW5jZXMuICAqLwoKCWlmIChuX2V4dF9tb2R1bGVzX3VzZWQpIHsKCQlzdHJ1Y3QgbmV3X21vZHVsZV9yZWYgKmRlcDsKCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqdG07CgoJCXNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICIua21vZHRhYiIsIHRndF9zaXplb2Zfdm9pZF9wLAoJCQkJCQkJCQkJIChzaXplb2Yoc3RydWN0IG5ld19tb2R1bGVfcmVmKQoJCQkJCQkJCQkJICAqIG5fZXh0X21vZHVsZXNfdXNlZCkpOwoJCWlmICghc2VjKQoJCQlyZXR1cm4gMDsKCgkJdG0gPSBvYmpfZmluZF9zeW1ib2woZiwgIl9fdGhpc19tb2R1bGUiKTsKCQlkZXAgPSAoc3RydWN0IG5ld19tb2R1bGVfcmVmICopIHNlYy0+Y29udGVudHM7CgkJZm9yIChpID0gMDsgaSA8IG5fZXh0X21vZHVsZXM7ICsraSkKCQkJaWYgKGV4dF9tb2R1bGVzW2ldLnVzZWQpIHsKCQkJCWRlcC0+ZGVwID0gZXh0X21vZHVsZXNbaV0uYWRkcjsKCQkJCW9ial9zeW1ib2xfcGF0Y2goZiwgc2VjLT5pZHgsCgkJCQkJCQkJIChjaGFyICopICZkZXAtPnJlZiAtIHNlYy0+Y29udGVudHMsIHRtKTsKCQkJCWRlcC0+bmV4dF9yZWYgPSAwOwoJCQkJKytkZXA7CgkJCX0KCX0KCglpZiAoZmxhZ19leHBvcnQgJiYgIW9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpKSB7CgkJc2l6ZV90IG5zeW1zOwoJCWludCAqbG9hZGVkOwoKCQlzZWMgPQoJCQlvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiX19rc3ltdGFiIiwgdGd0X3NpemVvZl92b2lkX3AsCgkJCQkJCQkJCSAgIDApOwoKCQkvKiBXZSBkb24ndCB3YW50IHRvIGV4cG9ydCBzeW1ib2xzIHJlc2lkaW5nIGluIHNlY3Rpb25zIHRoYXQKCQkgICBhcmVuJ3QgbG9hZGVkLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoZXNlIGNyZWF0ZWQgc28gdGhhdAoJCSAgIHdlIG1ha2Ugc3VyZSBjZXJ0YWluIG1vZHVsZSBvcHRpb25zIGRvbid0IGFwcGVhciB0d2ljZS4gICovCgoJCWxvYWRlZCA9IGFsbG9jYShzaXplb2YoaW50KSAqIChpID0gZi0+aGVhZGVyLmVfc2hudW0pKTsKCQl3aGlsZSAoLS1pID49IDApCgkJCWxvYWRlZFtpXSA9IChmLT5zZWN0aW9uc1tpXS0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwOwoKCQlmb3IgKG5zeW1zID0gaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgewoJCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCgkJCQlpZiAoRUxGVyhTVF9CSU5EKSAoc3ltLT5pbmZvKSAhPSBTVEJfTE9DQUwKCQkJCQkmJiBzeW0tPnNlY2lkeCA8PSBTSE5fSElSRVNFUlZFCgkJCQkJJiYgKHN5bS0+c2VjaWR4ID49IFNITl9MT1JFU0VSVkUKCQkJCQkJfHwgbG9hZGVkW3N5bS0+c2VjaWR4XSkpIHsKCQkJCQlFbGZXKEFkZHIpIG9mcyA9IG5zeW1zICogMiAqIHRndF9zaXplb2Zfdm9pZF9wOwoKCQkJCQlvYmpfc3ltYm9sX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMsIHN5bSk7CgkJCQkJb2JqX3N0cmluZ19wYXRjaChmLCBzZWMtPmlkeCwgb2ZzICsgdGd0X3NpemVvZl92b2lkX3AsCgkJCQkJCQkJCSBzeW0tPm5hbWUpOwoKCQkJCQluc3ltcysrOwoJCQkJfQoJCX0KCgkJb2JqX2V4dGVuZF9zZWN0aW9uKHNlYywgbnN5bXMgKiAyICogdGd0X3NpemVvZl9jaGFyX3ApOwoJfQoKCXJldHVybiAxOwp9CgoKc3RhdGljIGludApuZXdfaW5pdF9tb2R1bGUoY29uc3QgY2hhciAqbV9uYW1lLCBzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCgkJCQl1bnNpZ25lZCBsb25nIG1fc2l6ZSkKewoJc3RydWN0IG5ld19tb2R1bGUgKm1vZHVsZTsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoJdm9pZCAqaW1hZ2U7CglpbnQgcmV0OwoJdGd0X2xvbmcgbV9hZGRyOwoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi50aGlzIik7CglpZiAoIXNlYyB8fCAhc2VjLT5jb250ZW50cykgeyAKCQlwZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHQgbW9kdWxlICVzPyIsbV9uYW1lKTsKCX0KCW1vZHVsZSA9IChzdHJ1Y3QgbmV3X21vZHVsZSAqKSBzZWMtPmNvbnRlbnRzOwoJbV9hZGRyID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKCgltb2R1bGUtPnNpemVfb2Zfc3RydWN0ID0gc2l6ZW9mKCptb2R1bGUpOwoJbW9kdWxlLT5zaXplID0gbV9zaXplOwoJbW9kdWxlLT5mbGFncyA9IGZsYWdfYXV0b2NsZWFuID8gTkVXX01PRF9BVVRPQ0xFQU4gOiAwOwoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpOwoJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CgkJbW9kdWxlLT5zeW1zID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKCQltb2R1bGUtPm5zeW1zID0gc2VjLT5oZWFkZXIuc2hfc2l6ZSAvICgyICogdGd0X3NpemVvZl9jaGFyX3ApOwoJfQoKCWlmIChuX2V4dF9tb2R1bGVzX3VzZWQpIHsKCQlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIua21vZHRhYiIpOwoJCW1vZHVsZS0+ZGVwcyA9IHNlYy0+aGVhZGVyLnNoX2FkZHI7CgkJbW9kdWxlLT5uZGVwcyA9IG5fZXh0X21vZHVsZXNfdXNlZDsKCX0KCgltb2R1bGUtPmluaXQgPQoJCW9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgb2JqX2ZpbmRfc3ltYm9sKGYsICJpbml0X21vZHVsZSIpKTsKCW1vZHVsZS0+Y2xlYW51cCA9CgkJb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgImNsZWFudXBfbW9kdWxlIikpOwoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIl9fZXhfdGFibGUiKTsKCWlmIChzZWMpIHsKCQltb2R1bGUtPmV4X3RhYmxlX3N0YXJ0ID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKCQltb2R1bGUtPmV4X3RhYmxlX2VuZCA9IHNlYy0+aGVhZGVyLnNoX2FkZHIgKyBzZWMtPmhlYWRlci5zaF9zaXplOwoJfQoKCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi50ZXh0LmluaXQiKTsKCWlmIChzZWMpIHsKCQltb2R1bGUtPnJ1bnNpemUgPSBzZWMtPmhlYWRlci5zaF9hZGRyIC0gbV9hZGRyOwoJfQoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmRhdGEuaW5pdCIpOwoJaWYgKHNlYykgewoJCWlmICghbW9kdWxlLT5ydW5zaXplIHx8CgkJCW1vZHVsZS0+cnVuc2l6ZSA+IHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBtX2FkZHIpCgkJCQltb2R1bGUtPnJ1bnNpemUgPSBzZWMtPmhlYWRlci5zaF9hZGRyIC0gbV9hZGRyOwoJfQoJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCBBUkNIREFUQV9TRUNfTkFNRSk7CglpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKCQltb2R1bGUtPmFyY2hkYXRhX3N0YXJ0ID0gKHZvaWQqKXNlYy0+aGVhZGVyLnNoX2FkZHI7CgkJbW9kdWxlLT5hcmNoZGF0YV9lbmQgPSBtb2R1bGUtPmFyY2hkYXRhX3N0YXJ0ICsgc2VjLT5oZWFkZXIuc2hfc2l6ZTsKCX0KCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgS0FMTFNZTVNfU0VDX05BTUUpOwoJaWYgKHNlYyAmJiBzZWMtPmhlYWRlci5zaF9zaXplKSB7CgkJbW9kdWxlLT5rYWxsc3ltc19zdGFydCA9ICh2b2lkKilzZWMtPmhlYWRlci5zaF9hZGRyOwoJCW1vZHVsZS0+a2FsbHN5bXNfZW5kID0gbW9kdWxlLT5rYWxsc3ltc19zdGFydCArIHNlYy0+aGVhZGVyLnNoX3NpemU7Cgl9CgoJaWYgKCFhcmNoX2luaXRfbW9kdWxlKGYsIG1vZHVsZSkpCgkJcmV0dXJuIDA7CgoJLyogV2hldyEgIEFsbCBvZiB0aGUgaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuICBDb2xsZWN0IHRoZSBmaW5hbAoJICAgbW9kdWxlIGltYWdlIGFuZCBnaXZlIGl0IHRvIHRoZSBrZXJuZWwuICAqLwoKCWltYWdlID0geG1hbGxvYyhtX3NpemUpOwoJb2JqX2NyZWF0ZV9pbWFnZShmLCBpbWFnZSk7CgoJcmV0ID0gbmV3X3N5c19pbml0X21vZHVsZShtX25hbWUsIChzdHJ1Y3QgbmV3X21vZHVsZSAqKSBpbWFnZSk7CglpZiAocmV0KQoJCXBlcnJvcl9tc2coImluaXRfbW9kdWxlOiAlcyIsIG1fbmFtZSk7CgoJZnJlZShpbWFnZSk7CgoJcmV0dXJuIHJldCA9PSAwOwp9CgojZWxzZQoKI2RlZmluZSBuZXdfaW5pdF9tb2R1bGUoeCwgeSwgeikgVFJVRQojZGVmaW5lIG5ld19jcmVhdGVfdGhpc19tb2R1bGUoeCwgeSkgMAojZGVmaW5lIG5ld19jcmVhdGVfbW9kdWxlX2tzeW10YWIoeCkKI2RlZmluZSBxdWVyeV9tb2R1bGUodiwgdywgeCwgeSwgeikgLTEKCiNlbmRpZgkJCQkJCQkvKiBDT05GSUdfRkVBVFVSRV9ORVdfTU9EVUxFX0lOVEVSRkFDRSAqLwoKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgaW50Cm9ial9zdHJpbmdfcGF0Y2goc3RydWN0IG9ial9maWxlICpmLCBpbnQgc2VjaWR4LCBFbGZXKEFkZHIpIG9mZnNldCwKCQkJCSBjb25zdCBjaGFyICpzdHJpbmcpCnsKCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpwOwoJc3RydWN0IG9ial9zZWN0aW9uICpzdHJzZWM7CglzaXplX3QgbGVuID0gc3RybGVuKHN0cmluZykgKyAxOwoJY2hhciAqbG9jOwoKCXAgPSB4bWFsbG9jKHNpemVvZigqcCkpOwoJcC0+bmV4dCA9IGYtPnN0cmluZ19wYXRjaGVzOwoJcC0+cmVsb2Nfc2VjaWR4ID0gc2VjaWR4OwoJcC0+cmVsb2Nfb2Zmc2V0ID0gb2Zmc2V0OwoJZi0+c3RyaW5nX3BhdGNoZXMgPSBwOwoKCXN0cnNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5rc3RydGFiIik7CglpZiAoc3Ryc2VjID09IE5VTEwpIHsKCQlzdHJzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiLmtzdHJ0YWIiLCAxLCBsZW4pOwoJCXAtPnN0cmluZ19vZmZzZXQgPSAwOwoJCWxvYyA9IHN0cnNlYy0+Y29udGVudHM7Cgl9IGVsc2UgewoJCXAtPnN0cmluZ19vZmZzZXQgPSBzdHJzZWMtPmhlYWRlci5zaF9zaXplOwoJCWxvYyA9IG9ial9leHRlbmRfc2VjdGlvbihzdHJzZWMsIGxlbik7Cgl9CgltZW1jcHkobG9jLCBzdHJpbmcsIGxlbik7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKb2JqX3N5bWJvbF9wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAoJCQkJIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0pCnsKCXN0cnVjdCBvYmpfc3ltYm9sX3BhdGNoICpwOwoKCXAgPSB4bWFsbG9jKHNpemVvZigqcCkpOwoJcC0+bmV4dCA9IGYtPnN5bWJvbF9wYXRjaGVzOwoJcC0+cmVsb2Nfc2VjaWR4ID0gc2VjaWR4OwoJcC0+cmVsb2Nfb2Zmc2V0ID0gb2Zmc2V0OwoJcC0+c3ltID0gc3ltOwoJZi0+c3ltYm9sX3BhdGNoZXMgPSBwOwoKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IG9ial9jaGVja191bmRlZmluZWRzKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJdW5zaWduZWQgbG9uZyBpOwoJaW50IHJldCA9IDE7CgoJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCgkJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fVU5ERUYpIHsKCQkJCWlmIChFTEZXKFNUX0JJTkQpIChzeW0tPmluZm8pID09IFNUQl9XRUFLKSB7CgkJCQkJc3ltLT5zZWNpZHggPSBTSE5fQUJTOwoJCQkJCXN5bS0+dmFsdWUgPSAwOwoJCQkJfSBlbHNlIHsKCQkJCQllcnJvcl9tc2coInVucmVzb2x2ZWQgc3ltYm9sICVzIiwgc3ltLT5uYW1lKTsKCQkJCQlyZXQgPSAwOwoJCQkJfQoJCQl9Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgb2JqX2FsbG9jYXRlX2NvbW1vbnMoc3RydWN0IG9ial9maWxlICpmKQp7CglzdHJ1Y3QgY29tbW9uX2VudHJ5IHsKCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICpuZXh0OwoJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07Cgl9ICpjb21tb25faGVhZCA9IE5VTEw7CgoJdW5zaWduZWQgbG9uZyBpOwoKCWZvciAoaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgewoJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CgkJZm9yIChzeW0gPSBmLT5zeW10YWJbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KQoJCQlpZiAoc3ltLT5zZWNpZHggPT0gU0hOX0NPTU1PTikgewoJCQkJLyogQ29sbGVjdCBhbGwgQ09NTU9OIHN5bWJvbHMgYW5kIHNvcnQgdGhlbSBieSBzaXplIHNvIGFzIHRvCgkJCQkgICBtaW5pbWl6ZSBzcGFjZSB3YXN0ZWQgYnkgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gICovCgkJCQl7CgkJCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqKnAsICpuOwoJCQkJCWZvciAocCA9ICZjb21tb25faGVhZDsgKnA7IHAgPSAmKCpwKS0+bmV4dCkKCQkJCQkJaWYgKHN5bS0+c2l6ZSA8PSAoKnApLT5zeW0tPnNpemUpCgkJCQkJCQlicmVhazsKCgkJCQkJbiA9IGFsbG9jYShzaXplb2YoKm4pKTsKCQkJCQluLT5uZXh0ID0gKnA7CgkJCQkJbi0+c3ltID0gc3ltOwoJCQkJCSpwID0gbjsKCQkJCX0KCQkJfQoJfQoKCWZvciAoaSA9IDE7IGkgPCBmLT5sb2NhbF9zeW10YWJfc2l6ZTsgKytpKSB7CgkJc3RydWN0IG9ial9zeW1ib2wgKnN5bSA9IGYtPmxvY2FsX3N5bXRhYltpXTsKCQlpZiAoc3ltICYmIHN5bS0+c2VjaWR4ID09IFNITl9DT01NT04pIHsKCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqKnAsICpuOwoJCQlmb3IgKHAgPSAmY29tbW9uX2hlYWQ7ICpwOyBwID0gJigqcCktPm5leHQpCgkJCQlpZiAoc3ltID09ICgqcCktPnN5bSkKCQkJCQlicmVhazsKCQkJCWVsc2UgaWYgKHN5bS0+c2l6ZSA8ICgqcCktPnN5bS0+c2l6ZSkgewoJCQkJCW4gPSBhbGxvY2Eoc2l6ZW9mKCpuKSk7CgkJCQkJbi0+bmV4dCA9ICpwOwoJCQkJCW4tPnN5bSA9IHN5bTsKCQkJCQkqcCA9IG47CgkJCQkJYnJlYWs7CgkJCQl9CgkJfQoJfQoKCWlmIChjb21tb25faGVhZCkgewoJCS8qIEZpbmQgdGhlIGJzcyBzZWN0aW9uLiAgKi8KCQlmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkKCQkJaWYgKGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKQoJCQkJYnJlYWs7CgoJCS8qIElmIGZvciBzb21lIHJlYXNvbiB0aGVyZSBoYWRuJ3QgYmVlbiBvbmUsIGNyZWF0ZSBvbmUuICAqLwoJCWlmIChpID09IGYtPmhlYWRlci5lX3NobnVtKSB7CgkJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoKCQkJZi0+c2VjdGlvbnMgPSB4cmVhbGxvYyhmLT5zZWN0aW9ucywgKGkgKyAxKSAqIHNpemVvZihzZWMpKTsKCQkJZi0+c2VjdGlvbnNbaV0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CgkJCWYtPmhlYWRlci5lX3NobnVtID0gaSArIDE7CgoJCQltZW1zZXQoc2VjLCAwLCBzaXplb2YoKnNlYykpOwoJCQlzZWMtPmhlYWRlci5zaF90eXBlID0gU0hUX1BST0dCSVRTOwoJCQlzZWMtPmhlYWRlci5zaF9mbGFncyA9IFNIRl9XUklURSB8IFNIRl9BTExPQzsKCQkJc2VjLT5uYW1lID0gIi5ic3MiOwoJCQlzZWMtPmlkeCA9IGk7CgkJfQoKCQkvKiBBbGxvY2F0ZSB0aGUgQ09NTU9OUy4gICovCgkJewoJCQlFbGZXKEFkZHIpIGJzc19zaXplID0gZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9zaXplOwoJCQlFbGZXKEFkZHIpIG1heF9hbGlnbiA9IGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduOwoJCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICpjOwoKCQkJZm9yIChjID0gY29tbW9uX2hlYWQ7IGM7IGMgPSBjLT5uZXh0KSB7CgkJCQlFbGZXKEFkZHIpIGFsaWduID0gYy0+c3ltLT52YWx1ZTsKCgkJCQlpZiAoYWxpZ24gPiBtYXhfYWxpZ24pCgkJCQkJbWF4X2FsaWduID0gYWxpZ247CgkJCQlpZiAoYnNzX3NpemUgJiAoYWxpZ24gLSAxKSkKCQkJCQlic3Nfc2l6ZSA9IChic3Nfc2l6ZSB8IChhbGlnbiAtIDEpKSArIDE7CgoJCQkJYy0+c3ltLT5zZWNpZHggPSBpOwoJCQkJYy0+c3ltLT52YWx1ZSA9IGJzc19zaXplOwoKCQkJCWJzc19zaXplICs9IGMtPnN5bS0+c2l6ZTsKCQkJfQoKCQkJZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9zaXplID0gYnNzX3NpemU7CgkJCWYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfYWRkcmFsaWduID0gbWF4X2FsaWduOwoJCX0KCX0KCgkvKiBGb3IgdGhlIHNha2Ugb2YgcGF0Y2ggcmVsb2NhdGlvbiBhbmQgcGFyYW1ldGVyIGluaXRpYWxpemF0aW9uLAoJICAgYWxsb2NhdGUgemVyb2VkIGRhdGEgZm9yIE5PQklUUyBzZWN0aW9ucyBub3cuICBOb3RlIHRoYXQgYWZ0ZXIKCSAgIHRoaXMgd2UgY2Fubm90IGFzc3VtZSBOT0JJVFMgYXJlIHJlYWxseSBlbXB0eS4gICovCglmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkgewoJCXN0cnVjdCBvYmpfc2VjdGlvbiAqcyA9IGYtPnNlY3Rpb25zW2ldOwoJCWlmIChzLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKSB7CgkJCWlmIChzLT5oZWFkZXIuc2hfc2l6ZSAhPSAwKQoJCQlzLT5jb250ZW50cyA9IG1lbXNldCh4bWFsbG9jKHMtPmhlYWRlci5zaF9zaXplKSwKCQkJCQkJCQkgMCwgcy0+aGVhZGVyLnNoX3NpemUpOwoJCQllbHNlCgkJCQlzLT5jb250ZW50cyA9IE5VTEw7CgoJCQlzLT5oZWFkZXIuc2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKCQl9Cgl9Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9sb2FkX3NpemUoc3RydWN0IG9ial9maWxlICpmKQp7Cgl1bnNpZ25lZCBsb25nIGRvdCA9IDA7CglzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKCgkvKiBGaW5hbGl6ZSB0aGUgcG9zaXRpb25zIG9mIHRoZSBzZWN0aW9ucyByZWxhdGl2ZSB0byBvbmUgYW5vdGhlci4gICovCgoJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CgkJRWxmVyhBZGRyKSBhbGlnbjsKCgkJYWxpZ24gPSBzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ247CgkJaWYgKGFsaWduICYmIChkb3QgJiAoYWxpZ24gLSAxKSkpCgkJCWRvdCA9IChkb3QgfCAoYWxpZ24gLSAxKSkgKyAxOwoKCQlzZWMtPmhlYWRlci5zaF9hZGRyID0gZG90OwoJCWRvdCArPSBzZWMtPmhlYWRlci5zaF9zaXplOwoJfQoKCXJldHVybiBkb3Q7Cn0KCnN0YXRpYyBpbnQgb2JqX3JlbG9jYXRlKHN0cnVjdCBvYmpfZmlsZSAqZiwgRWxmVyhBZGRyKSBiYXNlKQp7CglpbnQgaSwgbiA9IGYtPmhlYWRlci5lX3NobnVtOwoJaW50IHJldCA9IDE7CgoJLyogRmluYWxpemUgdGhlIGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMuICAqLwoKCWYtPmJhc2VhZGRyID0gYmFzZTsKCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCgkJZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9hZGRyICs9IGJhc2U7CgoJLyogQW5kIGl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIHJlbG9jYXRpb25zLiAgKi8KCglmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CgkJc3RydWN0IG9ial9zZWN0aW9uICpyZWxzZWMsICpzeW1zZWMsICp0YXJnc2VjLCAqc3Ryc2VjOwoJCUVsZlcoUmVsTSkgKiByZWwsICpyZWxlbmQ7CgkJRWxmVyhTeW0pICogc3ltdGFiOwoJCWNvbnN0IGNoYXIgKnN0cnRhYjsKCgkJcmVsc2VjID0gZi0+c2VjdGlvbnNbaV07CgkJaWYgKHJlbHNlYy0+aGVhZGVyLnNoX3R5cGUgIT0gU0hUX1JFTE0pCgkJCWNvbnRpbnVlOwoKCQlzeW1zZWMgPSBmLT5zZWN0aW9uc1tyZWxzZWMtPmhlYWRlci5zaF9saW5rXTsKCQl0YXJnc2VjID0gZi0+c2VjdGlvbnNbcmVsc2VjLT5oZWFkZXIuc2hfaW5mb107CgkJc3Ryc2VjID0gZi0+c2VjdGlvbnNbc3ltc2VjLT5oZWFkZXIuc2hfbGlua107CgoJCXJlbCA9IChFbGZXKFJlbE0pICopIHJlbHNlYy0+Y29udGVudHM7CgkJcmVsZW5kID0gcmVsICsgKHJlbHNlYy0+aGVhZGVyLnNoX3NpemUgLyBzaXplb2YoRWxmVyhSZWxNKSkpOwoJCXN5bXRhYiA9IChFbGZXKFN5bSkgKikgc3ltc2VjLT5jb250ZW50czsKCQlzdHJ0YWIgPSAoY29uc3QgY2hhciAqKSBzdHJzZWMtPmNvbnRlbnRzOwoKCQlmb3IgKDsgcmVsIDwgcmVsZW5kOyArK3JlbCkgewoJCQlFbGZXKEFkZHIpIHZhbHVlID0gMDsKCQkJc3RydWN0IG9ial9zeW1ib2wgKmludHN5bSA9IE5VTEw7CgkJCXVuc2lnbmVkIGxvbmcgc3ltbmR4OwoJCQlFbGZXKFN5bSkgKiBleHRzeW0gPSAwOwoJCQljb25zdCBjaGFyICplcnJtc2c7CgoJCQkvKiBBdHRlbXB0IHRvIGZpbmQgYSB2YWx1ZSB0byB1c2UgZm9yIHRoaXMgcmVsb2NhdGlvbi4gICovCgoJCQlzeW1uZHggPSBFTEZXKFJfU1lNKSAocmVsLT5yX2luZm8pOwoJCQlpZiAoc3ltbmR4KSB7CgkJCQkvKiBOb3RlIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwoKCQkJCWV4dHN5bSA9ICZzeW10YWJbc3ltbmR4XTsKCQkJCWlmIChFTEZXKFNUX0JJTkQpIChleHRzeW0tPnN0X2luZm8pID09IFNUQl9MT0NBTCkgewoJCQkJCS8qIExvY2FsIHN5bWJvbHMgd2UgbG9vayB1cCBpbiB0aGUgbG9jYWwgdGFibGUgdG8gYmUgc3VyZQoJCQkJCSAgIHdlIGdldCB0aGUgb25lIHRoYXQgaXMgcmVhbGx5IGludGVuZGVkLiAgKi8KCQkJCQlpbnRzeW0gPSBmLT5sb2NhbF9zeW10YWJbc3ltbmR4XTsKCQkJCX0gZWxzZSB7CgkJCQkJLyogT3RoZXJzIHdlIGxvb2sgdXAgaW4gdGhlIGhhc2ggdGFibGUuICAqLwoJCQkJCWNvbnN0IGNoYXIgKm5hbWU7CgkJCQkJaWYgKGV4dHN5bS0+c3RfbmFtZSkKCQkJCQkJbmFtZSA9IHN0cnRhYiArIGV4dHN5bS0+c3RfbmFtZTsKCQkJCQllbHNlCgkJCQkJCW5hbWUgPSBmLT5zZWN0aW9uc1tleHRzeW0tPnN0X3NobmR4XS0+bmFtZTsKCQkJCQlpbnRzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgbmFtZSk7CgkJCQl9CgoJCQkJdmFsdWUgPSBvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKGYsIGludHN5bSk7CgkJCQlpbnRzeW0tPnJlZmVyZW5jZWQgPSAxOwoJCQl9CiNpZiBTSFRfUkVMTSA9PSBTSFRfUkVMQQojaWYgZGVmaW5lZChfX2FscGhhX18pICYmIGRlZmluZWQoQVhQX0JST0tFTl9HQVMpCgkJCS8qIFdvcmsgYXJvdW5kIGEgbmFzdHkgR0FTIGJ1ZywgdGhhdCBpcyBmaXhlZCBhcyBvZiAyLjcuMC45LiAgKi8KCQkJaWYgKCFleHRzeW0gfHwgIWV4dHN5bS0+c3RfbmFtZSB8fAoJCQkJRUxGVyhTVF9CSU5EKSAoZXh0c3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCiNlbmRpZgoJCQkJdmFsdWUgKz0gcmVsLT5yX2FkZGVuZDsKI2VuZGlmCgoJCQkvKiBEbyBpdCEgKi8KCQkJc3dpdGNoIChhcmNoX2FwcGx5X3JlbG9jYXRpb24KCQkJCQkoZiwgdGFyZ3NlYywgc3ltc2VjLCBpbnRzeW0sIHJlbCwgdmFsdWUpKSB7CgkJCWNhc2Ugb2JqX3JlbG9jX29rOgoJCQkJYnJlYWs7CgoJCQljYXNlIG9ial9yZWxvY19vdmVyZmxvdzoKCQkJCWVycm1zZyA9ICJSZWxvY2F0aW9uIG92ZXJmbG93IjsKCQkJCWdvdG8gYmFkX3JlbG9jOwoJCQljYXNlIG9ial9yZWxvY19kYW5nZXJvdXM6CgkJCQllcnJtc2cgPSAiRGFuZ2Vyb3VzIHJlbG9jYXRpb24iOwoJCQkJZ290byBiYWRfcmVsb2M7CgkJCWNhc2Ugb2JqX3JlbG9jX3VuaGFuZGxlZDoKCQkJCWVycm1zZyA9ICJVbmhhbmRsZWQgcmVsb2NhdGlvbiI7CgkJCSAgYmFkX3JlbG9jOgoJCQkJaWYgKGV4dHN5bSkgewoJCQkJCWVycm9yX21zZygiJXMgb2YgdHlwZSAlbGQgZm9yICVzIiwgZXJybXNnLAoJCQkJCQkJKGxvbmcpIEVMRlcoUl9UWVBFKSAocmVsLT5yX2luZm8pLAoJCQkJCQkJc3RydGFiICsgZXh0c3ltLT5zdF9uYW1lKTsKCQkJCX0gZWxzZSB7CgkJCQkJZXJyb3JfbXNnKCIlcyBvZiB0eXBlICVsZCIsIGVycm1zZywKCQkJCQkJCShsb25nKSBFTEZXKFJfVFlQRSkgKHJlbC0+cl9pbmZvKSk7CgkJCQl9CgkJCQlyZXQgPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJLyogRmluYWxseSwgdGFrZSBjYXJlIG9mIHRoZSBwYXRjaGVzLiAgKi8KCglpZiAoZi0+c3RyaW5nX3BhdGNoZXMpIHsKCQlzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaCAqcDsKCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN0cnNlYzsKCQlFbGZXKEFkZHIpIHN0cnNlY19iYXNlOwoJCXN0cnNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5rc3RydGFiIik7CgkJc3Ryc2VjX2Jhc2UgPSBzdHJzZWMtPmhlYWRlci5zaF9hZGRyOwoKCQlmb3IgKHAgPSBmLT5zdHJpbmdfcGF0Y2hlczsgcDsgcCA9IHAtPm5leHQpIHsKCQkJc3RydWN0IG9ial9zZWN0aW9uICp0YXJnc2VjID0gZi0+c2VjdGlvbnNbcC0+cmVsb2Nfc2VjaWR4XTsKCQkJKihFbGZXKEFkZHIpICopICh0YXJnc2VjLT5jb250ZW50cyArIHAtPnJlbG9jX29mZnNldCkKCQkJCT0gc3Ryc2VjX2Jhc2UgKyBwLT5zdHJpbmdfb2Zmc2V0OwoJCX0KCX0KCglpZiAoZi0+c3ltYm9sX3BhdGNoZXMpIHsKCQlzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaCAqcDsKCgkJZm9yIChwID0gZi0+c3ltYm9sX3BhdGNoZXM7IHA7IHAgPSBwLT5uZXh0KSB7CgkJCXN0cnVjdCBvYmpfc2VjdGlvbiAqdGFyZ3NlYyA9IGYtPnNlY3Rpb25zW3AtPnJlbG9jX3NlY2lkeF07CgkJCSooRWxmVyhBZGRyKSAqKSAodGFyZ3NlYy0+Y29udGVudHMgKyBwLT5yZWxvY19vZmZzZXQpCgkJCQk9IG9ial9zeW1ib2xfZmluYWxfdmFsdWUoZiwgcC0+c3ltKTsKCQl9Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBvYmpfY3JlYXRlX2ltYWdlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciAqaW1hZ2UpCnsKCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOwoJRWxmVyhBZGRyKSBiYXNlID0gZi0+YmFzZWFkZHI7CgoJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CgkJY2hhciAqc2VjaW1nOwoKCQlpZiAoc2VjLT5jb250ZW50cyA9PSAwIHx8IHNlYy0+aGVhZGVyLnNoX3NpemUgPT0gMCkKCQkJY29udGludWU7CgoJCXNlY2ltZyA9IGltYWdlICsgKHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBiYXNlKTsKCgkJLyogTm90ZSB0aGF0IHdlIGFsbG9jYXRlZCBkYXRhIGZvciBOT0JJVFMgc2VjdGlvbnMgZWFybGllci4gICovCgkJbWVtY3B5KHNlY2ltZywgc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSk7Cgl9CgoJcmV0dXJuIDE7Cn0KCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgc3RydWN0IG9ial9maWxlICpvYmpfbG9hZChGSUxFICogZnAsIGludCBsb2FkcHJvZ2JpdHMpCnsKCXN0cnVjdCBvYmpfZmlsZSAqZjsKCUVsZlcoU2hkcikgKiBzZWN0aW9uX2hlYWRlcnM7CglpbnQgc2hudW0sIGk7CgljaGFyICpzaHN0cnRhYjsKCgkvKiBSZWFkIHRoZSBmaWxlIGhlYWRlci4gICovCgoJZiA9IGFyY2hfbmV3X2ZpbGUoKTsKCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKCWYtPnN5bWJvbF9jbXAgPSBzdHJjbXA7CglmLT5zeW1ib2xfaGFzaCA9IG9ial9lbGZfaGFzaDsKCWYtPmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0ID0gJmYtPmxvYWRfb3JkZXI7CgoJZnNlZWsoZnAsIDAsIFNFRUtfU0VUKTsKCWlmIChmcmVhZCgmZi0+aGVhZGVyLCBzaXplb2YoZi0+aGVhZGVyKSwgMSwgZnApICE9IDEpIHsKCQlwZXJyb3JfbXNnKCJlcnJvciByZWFkaW5nIEVMRiBoZWFkZXIiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglpZiAoZi0+aGVhZGVyLmVfaWRlbnRbRUlfTUFHMF0gIT0gRUxGTUFHMAoJCXx8IGYtPmhlYWRlci5lX2lkZW50W0VJX01BRzFdICE9IEVMRk1BRzEKCQl8fCBmLT5oZWFkZXIuZV9pZGVudFtFSV9NQUcyXSAhPSBFTEZNQUcyCgkJfHwgZi0+aGVhZGVyLmVfaWRlbnRbRUlfTUFHM10gIT0gRUxGTUFHMykgewoJCWVycm9yX21zZygibm90IGFuIEVMRiBmaWxlIik7CgkJcmV0dXJuIE5VTEw7Cgl9CglpZiAoZi0+aGVhZGVyLmVfaWRlbnRbRUlfQ0xBU1NdICE9IEVMRkNMQVNTTQoJCXx8IGYtPmhlYWRlci5lX2lkZW50W0VJX0RBVEFdICE9IEVMRkRBVEFNCgkJfHwgZi0+aGVhZGVyLmVfaWRlbnRbRUlfVkVSU0lPTl0gIT0gRVZfQ1VSUkVOVAoJCXx8ICFNQVRDSF9NQUNISU5FKGYtPmhlYWRlci5lX21hY2hpbmUpKSB7CgkJZXJyb3JfbXNnKCJFTEYgZmlsZSBub3QgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlIik7CgkJcmV0dXJuIE5VTEw7Cgl9CglpZiAoZi0+aGVhZGVyLmVfdHlwZSAhPSBFVF9SRUwpIHsKCQllcnJvcl9tc2coIkVMRiBmaWxlIG5vdCBhIHJlbG9jYXRhYmxlIG9iamVjdCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qIFJlYWQgdGhlIHNlY3Rpb24gaGVhZGVycy4gICovCgoJaWYgKGYtPmhlYWRlci5lX3NoZW50c2l6ZSAhPSBzaXplb2YoRWxmVyhTaGRyKSkpIHsKCQllcnJvcl9tc2coInNlY3Rpb24gaGVhZGVyIHNpemUgbWlzbWF0Y2g6ICVsdSAhPSAlbHUiLAoJCQkJKHVuc2lnbmVkIGxvbmcpIGYtPmhlYWRlci5lX3NoZW50c2l6ZSwKCQkJCSh1bnNpZ25lZCBsb25nKSBzaXplb2YoRWxmVyhTaGRyKSkpOwoJCXJldHVybiBOVUxMOwoJfQoKCXNobnVtID0gZi0+aGVhZGVyLmVfc2hudW07CglmLT5zZWN0aW9ucyA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpfc2VjdGlvbiAqKSAqIHNobnVtKTsKCW1lbXNldChmLT5zZWN0aW9ucywgMCwgc2l6ZW9mKHN0cnVjdCBvYmpfc2VjdGlvbiAqKSAqIHNobnVtKTsKCglzZWN0aW9uX2hlYWRlcnMgPSBhbGxvY2Eoc2l6ZW9mKEVsZlcoU2hkcikpICogc2hudW0pOwoJZnNlZWsoZnAsIGYtPmhlYWRlci5lX3Nob2ZmLCBTRUVLX1NFVCk7CglpZiAoZnJlYWQoc2VjdGlvbl9oZWFkZXJzLCBzaXplb2YoRWxmVyhTaGRyKSksIHNobnVtLCBmcCkgIT0gc2hudW0pIHsKCQlwZXJyb3JfbXNnKCJlcnJvciByZWFkaW5nIEVMRiBzZWN0aW9uIGhlYWRlcnMiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCgkvKiBSZWFkIHRoZSBzZWN0aW9uIGRhdGEuICAqLwoKCWZvciAoaSA9IDA7IGkgPCBzaG51bTsgKytpKSB7CgkJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CgoJCWYtPnNlY3Rpb25zW2ldID0gc2VjID0gYXJjaF9uZXdfc2VjdGlvbigpOwoJCW1lbXNldChzZWMsIDAsIHNpemVvZigqc2VjKSk7CgoJCXNlYy0+aGVhZGVyID0gc2VjdGlvbl9oZWFkZXJzW2ldOwoJCXNlYy0+aWR4ID0gaTsKCgkJaWYoc2VjLT5oZWFkZXIuc2hfc2l6ZSkgc3dpdGNoIChzZWMtPmhlYWRlci5zaF90eXBlKSB7CgkJY2FzZSBTSFRfTlVMTDoKCQljYXNlIFNIVF9OT1RFOgoJCWNhc2UgU0hUX05PQklUUzoKCQkJLyogaWdub3JlICovCgkJCWJyZWFrOwoKCQljYXNlIFNIVF9QUk9HQklUUzoKI2lmIExPQURCSVRTCgkJCWlmICghbG9hZHByb2diaXRzKSB7CgkJCQlzZWMtPmNvbnRlbnRzID0gTlVMTDsKCQkJCWJyZWFrOwoJCQl9CiNlbmRpZgkJCQoJCWNhc2UgU0hUX1NZTVRBQjoKCQljYXNlIFNIVF9TVFJUQUI6CgkJY2FzZSBTSFRfUkVMTToKCQkJaWYgKHNlYy0+aGVhZGVyLnNoX3NpemUgPiAwKSB7CgkJCQlzZWMtPmNvbnRlbnRzID0geG1hbGxvYyhzZWMtPmhlYWRlci5zaF9zaXplKTsKCQkJCWZzZWVrKGZwLCBzZWMtPmhlYWRlci5zaF9vZmZzZXQsIFNFRUtfU0VUKTsKCQkJCWlmIChmcmVhZChzZWMtPmNvbnRlbnRzLCBzZWMtPmhlYWRlci5zaF9zaXplLCAxLCBmcCkgIT0gMSkgewoJCQkJCXBlcnJvcl9tc2coImVycm9yIHJlYWRpbmcgRUxGIHNlY3Rpb24gZGF0YSIpOwoJCQkJCXJldHVybiBOVUxMOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJc2VjLT5jb250ZW50cyA9IE5VTEw7CgkJCX0KCQkJYnJlYWs7CgojaWYgU0hUX1JFTE0gPT0gU0hUX1JFTAoJCWNhc2UgU0hUX1JFTEE6CgkJCWVycm9yX21zZygiUkVMQSByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlIik7CgkJCXJldHVybiBOVUxMOwojZWxzZQoJCWNhc2UgU0hUX1JFTDoKCQkJZXJyb3JfbXNnKCJSRUwgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZSIpOwoJCQlyZXR1cm4gTlVMTDsKI2VuZGlmCgoJCWRlZmF1bHQ6CgkJCWlmIChzZWMtPmhlYWRlci5zaF90eXBlID49IFNIVF9MT1BST0MpIHsKCQkJCS8qIEFzc3VtZSBwcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiB0eXBlcyBhcmUgZGVidWcKCQkJCSAgIGluZm8gYW5kIGNhbiBzYWZlbHkgYmUgaWdub3JlZC4gIElmIHRoaXMgaXMgZXZlciBub3QKCQkJCSAgIHRoZSBjYXNlIChIZWxsbyBNSVBTPyksIGRvbid0IHB1dCBpZmRlZnMgaGVyZSBidXQKCQkJCSAgIGNyZWF0ZSBhbiBhcmNoX2xvYWRfcHJvY19zZWN0aW9uKCkuICAqLwoJCQkJYnJlYWs7CgkJCX0KCgkJCWVycm9yX21zZygiY2FuJ3QgaGFuZGxlIHNlY3Rpb25zIG9mIHR5cGUgJWxkIiwKCQkJCQkobG9uZykgc2VjLT5oZWFkZXIuc2hfdHlwZSk7CgkJCXJldHVybiBOVUxMOwoJCX0KCX0KCgkvKiBEbyB3aGF0IHNvcnQgb2YgaW50ZXJwcmV0YXRpb24gYXMgbmVlZGVkIGJ5IGVhY2ggc2VjdGlvbi4gICovCgoJc2hzdHJ0YWIgPSBmLT5zZWN0aW9uc1tmLT5oZWFkZXIuZV9zaHN0cm5keF0tPmNvbnRlbnRzOwoKCWZvciAoaSA9IDA7IGkgPCBzaG51bTsgKytpKSB7CgkJc3RydWN0IG9ial9zZWN0aW9uICpzZWMgPSBmLT5zZWN0aW9uc1tpXTsKCQlzZWMtPm5hbWUgPSBzaHN0cnRhYiArIHNlYy0+aGVhZGVyLnNoX25hbWU7Cgl9CgoJZm9yIChpID0gMDsgaSA8IHNobnVtOyArK2kpIHsKCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYyA9IGYtPnNlY3Rpb25zW2ldOwoKCQkvKiAubW9kaW5mbyBzaG91bGQgYmUgY29udGVudHMgb25seSBidXQgZ2NjIGhhcyBubyBhdHRyaWJ1dGUgZm9yIHRoYXQuCgkJICogVGhlIGtlcm5lbCBtYXkgaGF2ZSBtYXJrZWQgLm1vZGluZm8gYXMgQUxMT0MsIGlnbm9yZSB0aGlzIGJpdC4KCQkgKi8KCQlpZiAoc3RyY21wKHNlYy0+bmFtZSwgIi5tb2RpbmZvIikgPT0gMCkKCQkJc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJj0gflNIRl9BTExPQzsKCgkJaWYgKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKQoJCQlvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihmLCBzZWMpOwoKCQlzd2l0Y2ggKHNlYy0+aGVhZGVyLnNoX3R5cGUpIHsKCQljYXNlIFNIVF9TWU1UQUI6CgkJCXsKCQkJCXVuc2lnbmVkIGxvbmcgbnN5bSwgajsKCQkJCWNoYXIgKnN0cnRhYjsKCQkJCUVsZlcoU3ltKSAqIHN5bTsKCgkJCQlpZiAoc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSAhPSBzaXplb2YoRWxmVyhTeW0pKSkgewoJCQkJCWVycm9yX21zZygic3ltYm9sIHNpemUgbWlzbWF0Y2g6ICVsdSAhPSAlbHUiLAoJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNlYy0+aGVhZGVyLnNoX2VudHNpemUsCgkJCQkJCQkodW5zaWduZWQgbG9uZykgc2l6ZW9mKEVsZlcoU3ltKSkpOwoJCQkJCXJldHVybiBOVUxMOwoJCQkJfQoKCQkJCW5zeW0gPSBzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoU3ltKSk7CgkJCQlzdHJ0YWIgPSBmLT5zZWN0aW9uc1tzZWMtPmhlYWRlci5zaF9saW5rXS0+Y29udGVudHM7CgkJCQlzeW0gPSAoRWxmVyhTeW0pICopIHNlYy0+Y29udGVudHM7CgoJCQkJLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgdGFibGUgb2YgbG9jYWwgc3ltYm9scy4gICovCgkJCQlqID0gZi0+bG9jYWxfc3ltdGFiX3NpemUgPSBzZWMtPmhlYWRlci5zaF9pbmZvOwoJCQkJZi0+bG9jYWxfc3ltdGFiID0geGNhbGxvYyhqLCBzaXplb2Yoc3RydWN0IG9ial9zeW1ib2wgKikpOwoKCQkJCS8qIEluc2VydCBhbGwgc3ltYm9scyBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KCQkJCWZvciAoaiA9IDEsICsrc3ltOyBqIDwgbnN5bTsgKytqLCArK3N5bSkgewoJCQkJCWNvbnN0IGNoYXIgKm5hbWU7CgkJCQkJaWYgKHN5bS0+c3RfbmFtZSkKCQkJCQkJbmFtZSA9IHN0cnRhYiArIHN5bS0+c3RfbmFtZTsKCQkJCQllbHNlCgkJCQkJCW5hbWUgPSBmLT5zZWN0aW9uc1tzeW0tPnN0X3NobmR4XS0+bmFtZTsKCgkJCQkJb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgaiwgc3ltLT5zdF9pbmZvLCBzeW0tPnN0X3NobmR4LAoJCQkJCQkJCSAgIHN5bS0+c3RfdmFsdWUsIHN5bS0+c3Rfc2l6ZSk7CgkJCQl9CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgU0hUX1JFTE06CgkJCWlmIChzZWMtPmhlYWRlci5zaF9lbnRzaXplICE9IHNpemVvZihFbGZXKFJlbE0pKSkgewoJCQkJZXJyb3JfbXNnKCJyZWxvY2F0aW9uIGVudHJ5IHNpemUgbWlzbWF0Y2g6ICVsdSAhPSAlbHUiLAoJCQkJCQkodW5zaWduZWQgbG9uZykgc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSwKCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihFbGZXKFJlbE0pKSk7CgkJCQlyZXR1cm4gTlVMTDsKCQkJfQoJCQlicmVhazsKCQkJLyogWFhYICBSZWxvY2F0aW9uIGNvZGUgZnJvbSBtb2R1dGlscy0yLjMuMTkgaXMgbm90IGhlcmUuCgkJCSAqIFdoeT8gIFRoYXQncyBhYm91dCAyMCBsaW5lcyBvZiBjb2RlIGZyb20gb2JqL29ial9sb2FkLmMsCgkJCSAqIHdoaWNoIGdldHMgZG9uZSBpbiBhIHNlY29uZCBwYXNzIHRocm91Z2ggdGhlIHNlY3Rpb25zLgoJCQkgKiBUaGlzIEJ1c3lCb3ggaW5zbW9kIGRvZXMgc2ltaWxhciB3b3JrIGluIG9ial9yZWxvY2F0ZSgpLiAqLwoJCX0KCX0KCglyZXR1cm4gZjsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNCi8qCiAqIGxvYWQgdGhlIHVubG9hZGVkIHNlY3Rpb25zIGRpcmVjdGx5IGludG8gdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkKICoga2VybmVsIGZvciB0aGUgbW9kdWxlCiAqLwoKc3RhdGljIGludCBvYmpfbG9hZF9wcm9nYml0cyhGSUxFICogZnAsIHN0cnVjdCBvYmpfZmlsZSogZiwgY2hhciogaW1hZ2ViYXNlKQp7CglFbGZXKEFkZHIpIGJhc2UgPSBmLT5iYXNlYWRkcjsKCXN0cnVjdCBvYmpfc2VjdGlvbiogc2VjOwoJCglmb3IgKHNlYyA9IGYtPmxvYWRfb3JkZXI7IHNlYzsgc2VjID0gc2VjLT5sb2FkX25leHQpIHsKCgkJLyogc2VjdGlvbiBhbHJlYWR5IGxvYWRlZD8gKi8KCQlpZiAoc2VjLT5jb250ZW50cyAhPSBOVUxMKQoJCQljb250aW51ZTsKCQkKCQlpZiAoc2VjLT5oZWFkZXIuc2hfc2l6ZSA9PSAwKQoJCQljb250aW51ZTsKCgkJc2VjLT5jb250ZW50cyA9IGltYWdlYmFzZSArIChzZWMtPmhlYWRlci5zaF9hZGRyIC0gYmFzZSk7CgkJZnNlZWsoZnAsIHNlYy0+aGVhZGVyLnNoX29mZnNldCwgU0VFS19TRVQpOwoJCWlmIChmcmVhZChzZWMtPmNvbnRlbnRzLCBzZWMtPmhlYWRlci5zaF9zaXplLCAxLCBmcCkgIT0gMSkgewoJCQllcnJvcl9tc2coImVycm9yIHJlYWRpbmcgRUxGIHNlY3Rpb24gZGF0YTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CgkJCXJldHVybiAwOwoJCX0KCgl9CglyZXR1cm4gMTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGhpZGVfc3BlY2lhbF9zeW1ib2xzKHN0cnVjdCBvYmpfZmlsZSAqZikKewoJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNwZWNpYWxzW10gPSB7CgkJImNsZWFudXBfbW9kdWxlIiwKCQkiaW5pdF9tb2R1bGUiLAoJCSJrZXJuZWxfdmVyc2lvbiIsCgkJTlVMTAoJfTsKCglzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOwoJY29uc3QgY2hhciAqY29uc3QgKnA7CgoJZm9yIChwID0gc3BlY2lhbHM7ICpwOyArK3ApCgkJaWYgKChzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgKnApKSAhPSBOVUxMKQoJCQlzeW0tPmluZm8gPQoJCQkJRUxGVyhTVF9JTkZPKSAoU1RCX0xPQ0FMLCBFTEZXKFNUX1RZUEUpIChzeW0tPmluZm8pKTsKfQoKCgpleHRlcm4gaW50IGluc21vZF9tYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWludCBvcHQ7CglpbnQga19jcmNzOwoJaW50IGtfbmV3X3N5c2NhbGxzOwoJaW50IGxlbjsKCWNoYXIgKnRtcDsKCXVuc2lnbmVkIGxvbmcgbV9zaXplOwoJRWxmVyhBZGRyKSBtX2FkZHI7CglGSUxFICpmcDsKCXN0cnVjdCBvYmpfZmlsZSAqZjsKCXN0cnVjdCBzdGF0IHN0OwoJY2hhciBtX25hbWVbRklMRU5BTUVfTUFYICsgMV0gPSAiXDAiOwoJaW50IGV4aXRfc3RhdHVzID0gRVhJVF9GQUlMVVJFOwoJaW50IG1faGFzX21vZGluZm87CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwoJc3RydWN0IHV0c25hbWUgdXRzX2luZm87CgljaGFyIG1fc3RydmVyc2lvbltTVFJWRVJTSU9OTEVOXTsKCWludCBtX3ZlcnNpb247CglpbnQgbV9jcmNzOwojZW5kaWYKCgkvKiBQYXJzZSBhbnkgb3B0aW9ucyAqLwoJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImZrdnhMbzoiKSkgPiAwKSB7CgkJc3dpdGNoIChvcHQpIHsKCQkJY2FzZSAnZic6CQkJLyogZm9yY2UgbG9hZGluZyAqLwoJCQkJZmxhZ19mb3JjZV9sb2FkID0gMTsKCQkJCWJyZWFrOwoJCQljYXNlICdrJzoJCQkvKiBtb2R1bGUgbG9hZGVkIGJ5IGtlcm5lbGQsIGF1dG8tY2xlYW5hYmxlICovCgkJCQlmbGFnX2F1dG9jbGVhbiA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSAndic6CQkJLyogdmVyYm9zZSBvdXRwdXQgKi8KCQkJCWZsYWdfdmVyYm9zZSA9IDE7CgkJCQlicmVhazsKCQkJY2FzZSAneCc6CQkJLyogZG8gbm90IGV4cG9ydCBleHRlcm5zICovCgkJCQlmbGFnX2V4cG9ydCA9IDA7CgkJCQlicmVhazsKCQkJY2FzZSAnbyc6CQkJLyogbmFtZSB0aGUgb3V0cHV0IG1vZHVsZSAqLwoJCQkJc3RybmNweShtX25hbWUsIG9wdGFyZywgRklMRU5BTUVfTUFYKTsKCQkJCWJyZWFrOwoJCQljYXNlICdMJzoJCQkvKiBTdHViIHdhcm5pbmcgKi8KCQkJCS8qIFRoaXMgaXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbW9kcHJvYmUuCgkJCQkgKiBJbiB0aGVvcnksIHRoaXMgZG9lcyBsb2NraW5nLCBidXQgd2UgZG9uJ3QgZG8KCQkJCSAqIHRoYXQuICBTbyBiZSBjYXJlZnVsIGFuZCBwbGFuIHlvdXIgbGlmZSBhcm91bmQgbm90CgkJCQkgKiBsb2FkaW5nIHRoZSBzYW1lIG1vZHVsZSA1MCB0aW1lcyBjb25jdXJyZW50bHkuICovCgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXNob3dfdXNhZ2UoKTsKCQl9Cgl9CgkKCWlmIChhcmd2W29wdGluZF0gPT0gTlVMTCkgewoJCXNob3dfdXNhZ2UoKTsKCX0KCgkvKiBHcmFiIHRoZSBtb2R1bGUgbmFtZSAqLwoJaWYgKCh0bXAgPSBzdHJyY2hyKGFyZ3Zbb3B0aW5kXSwgJy8nKSkgIT0gTlVMTCkgewoJCXRtcCsrOwoJfSBlbHNlIHsKCQl0bXAgPSBhcmd2W29wdGluZF07Cgl9CglsZW4gPSBzdHJsZW4odG1wKTsKCglpZiAobGVuID4gMiAmJiB0bXBbbGVuIC0gMl0gPT0gJy4nICYmIHRtcFtsZW4gLSAxXSA9PSAnbycpCgkJbGVuIC09IDI7CgltZW1jcHkobV9mdWxsTmFtZSwgdG1wLCBsZW4pOwoJbV9mdWxsTmFtZVtsZW5dPSdcMCc7CglpZiAoKm1fbmFtZSA9PSAnXDAnKSB7CgkJc3RyY3B5KG1fbmFtZSwgbV9mdWxsTmFtZSk7Cgl9CglzdHJjYXQobV9mdWxsTmFtZSwgIi5vIik7CgoJLyogR2V0IGEgZmlsZWRlc2MgZm9yIHRoZSBtb2R1bGUuICBDaGVjayB3ZSB3ZSBoYXZlIGEgY29tcGxldGUgcGF0aCAqLwoJaWYgKHN0YXQoYXJndltvcHRpbmRdLCAmc3QpIDwgMCB8fCAhU19JU1JFRyhzdC5zdF9tb2RlKSB8fAoJCQkoZnAgPSBmb3Blbihhcmd2W29wdGluZF0sICJyIikpID09IE5VTEwpIHsKCQlzdHJ1Y3QgdXRzbmFtZSBteXVuYW1lOwoKCQkvKiBIbW0uICBDb3VsZCBub3Qgb3BlbiBpdC4gIEZpcnN0IHNlYXJjaCB1bmRlciAvbGliL21vZHVsZXMvYHVuYW1lIC1yYCwKCQkgKiBidXQgZG8gbm90IGVycm9yIG91dCB5ZXQgaWYgd2UgZmFpbCB0byBmaW5kIGl0Li4uICovCgkJaWYgKHVuYW1lKCZteXVuYW1lKSA9PSAwKSB7CgkJCWNoYXIgbW9kdWxlX2RpcltGSUxFTkFNRV9NQVhdOwoJCQljaGFyIHJlYWxfbW9kdWxlX2RpcltGSUxFTkFNRV9NQVhdOwoJCQlzbnByaW50ZiAobW9kdWxlX2Rpciwgc2l6ZW9mKG1vZHVsZV9kaXIpLCAiJXMvJXMiLCAKCQkJCQlfUEFUSF9NT0RVTEVTLCBteXVuYW1lLnJlbGVhc2UpOwoJCQkvKiBKdW1wIHRocm91Z2ggaG9vcHMgaW4gY2FzZSAvbGliL21vZHVsZXMvYHVuYW1lIC1yYAoJCQkgKiBpcyBhIHN5bWxpbmsuICBXZSBkbyBub3Qgd2FudCByZWN1cnNpdmVfYWN0aW9uIHRvCgkJCSAqIGZvbGxvdyBzeW1saW5rcywgYnV0IHdlIGRvIHdhbnQgdG8gZm9sbG93IHRoZQoJCQkgKiAvbGliL21vZHVsZXMvYHVuYW1lIC1yYCBkaXIsIFNvIHJlc29sdmUgaXQgb3Vyc2VsdmVzCgkJCSAqIGlmIGl0IGlzIGEgbGluay4uLiAqLwoJCQlpZiAocmVhbHBhdGggKG1vZHVsZV9kaXIsIHJlYWxfbW9kdWxlX2RpcikgPT0gTlVMTCkKCQkJCXN0cmNweShyZWFsX21vZHVsZV9kaXIsIG1vZHVsZV9kaXIpOwoJCQlyZWN1cnNpdmVfYWN0aW9uKHJlYWxfbW9kdWxlX2RpciwgVFJVRSwgRkFMU0UsIEZBTFNFLAoJCQkJCWNoZWNrX21vZHVsZV9uYW1lX21hdGNoLCAwLCBtX2Z1bGxOYW1lKTsKCQl9CgoJCS8qIENoZWNrIGlmIHdlIGhhdmUgZm91bmQgYW55dGhpbmcgeWV0ICovCgkJaWYgKG1fZmlsZW5hbWVbMF0gPT0gJ1wwJyB8fCAoKGZwID0gZm9wZW4obV9maWxlbmFtZSwgInIiKSkgPT0gTlVMTCkpIAoJCXsKCQkJY2hhciBtb2R1bGVfZGlyW0ZJTEVOQU1FX01BWF07CgkJCWlmIChyZWFscGF0aCAoX1BBVEhfTU9EVUxFUywgbW9kdWxlX2RpcikgPT0gTlVMTCkKCQkJCXN0cmNweShtb2R1bGVfZGlyLCBfUEFUSF9NT0RVTEVTKTsKCQkJLyogTm8gbW9kdWxlIGZvdW5kIHVuZGVyIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgLCB0aGlzCgkJCSAqIHRpbWUgY2FzdCB0aGUgbmV0IGEgYml0IHdpZGVyLiAgU2VhcmNoIC9saWIvbW9kdWxlcy8gKi8KCQkJaWYgKHJlY3Vyc2l2ZV9hY3Rpb24obW9kdWxlX2RpciwgVFJVRSwgRkFMU0UsIEZBTFNFLAoJCQkJCQljaGVja19tb2R1bGVfbmFtZV9tYXRjaCwgMCwgbV9mdWxsTmFtZSkgPT0gRkFMU0UpIAoJCQl7CgkJCQlpZiAobV9maWxlbmFtZVswXSA9PSAnXDAnCgkJCQkJCXx8ICgoZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKSkgCgkJCQl7CgkJCQkJZXJyb3JfbXNnKCIlczogbm8gbW9kdWxlIGJ5IHRoYXQgbmFtZSBmb3VuZCIsIG1fZnVsbE5hbWUpOwoJCQkJCXJldHVybiBFWElUX0ZBSUxVUkU7CgkJCQl9CgkJCX0gZWxzZQoJCQkJZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBubyBtb2R1bGUgYnkgdGhhdCBuYW1lIGZvdW5kIiwgbV9mdWxsTmFtZSk7CgkJfQoJfSBlbHNlIAoJCXNhZmVfc3RybmNweShtX2ZpbGVuYW1lLCBhcmd2W29wdGluZF0sIHNpemVvZihtX2ZpbGVuYW1lKSk7CgoJcHJpbnRmKCJVc2luZyAlc1xuIiwgbV9maWxlbmFtZSk7CgoJaWYgKChmID0gb2JqX2xvYWQoZnAsIExPQURCSVRTKSkgPT0gTlVMTCkKCQlwZXJyb3JfbXNnX2FuZF9kaWUoIkNvdWxkIG5vdCBsb2FkIHRoZSBtb2R1bGUiKTsKCglpZiAoZ2V0X21vZGluZm9fdmFsdWUoZiwgImtlcm5lbF92ZXJzaW9uIikgPT0gTlVMTCkKCQltX2hhc19tb2RpbmZvID0gMDsKCWVsc2UKCQltX2hhc19tb2RpbmZvID0gMTsKCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORwoJLyogVmVyc2lvbiBjb3JyZXNwb25kZW5jZT8gICovCgoJaWYgKHVuYW1lKCZ1dHNfaW5mbykgPCAwKQoJCXV0c19pbmZvLnJlbGVhc2VbMF0gPSAnXDAnOwoJaWYgKG1faGFzX21vZGluZm8pIHsKCQltX3ZlcnNpb24gPSBuZXdfZ2V0X21vZHVsZV92ZXJzaW9uKGYsIG1fc3RydmVyc2lvbik7Cgl9IGVsc2UgewoJCW1fdmVyc2lvbiA9IG9sZF9nZXRfbW9kdWxlX3ZlcnNpb24oZiwgbV9zdHJ2ZXJzaW9uKTsKCQlpZiAobV92ZXJzaW9uID09IC0xKSB7CgkJCWVycm9yX21zZygiY291bGRuJ3QgZmluZCB0aGUga2VybmVsIHZlcnNpb24gdGhlIG1vZHVsZSB3YXMgIgoJCQkJCSJjb21waWxlZCBmb3IiKTsKCQkJZ290byBvdXQ7CgkJfQoJfQoKCWlmIChzdHJuY21wKHV0c19pbmZvLnJlbGVhc2UsIG1fc3RydmVyc2lvbiwgU1RSVkVSU0lPTkxFTikgIT0gMCkgewoJCWlmIChmbGFnX2ZvcmNlX2xvYWQpIHsKCQkJZXJyb3JfbXNnKCJXYXJuaW5nOiBrZXJuZWwtbW9kdWxlIHZlcnNpb24gbWlzbWF0Y2hcbiIKCQkJCQkiXHQlcyB3YXMgY29tcGlsZWQgZm9yIGtlcm5lbCB2ZXJzaW9uICVzXG4iCgkJCQkJIlx0d2hpbGUgdGhpcyBrZXJuZWwgaXMgdmVyc2lvbiAlcyIsCgkJCQkJbV9maWxlbmFtZSwgbV9zdHJ2ZXJzaW9uLCB1dHNfaW5mby5yZWxlYXNlKTsKCQl9IGVsc2UgewoJCQllcnJvcl9tc2coImtlcm5lbC1tb2R1bGUgdmVyc2lvbiBtaXNtYXRjaFxuIgoJCQkJCSJcdCVzIHdhcyBjb21waWxlZCBmb3Iga2VybmVsIHZlcnNpb24gJXNcbiIKCQkJCQkiXHR3aGlsZSB0aGlzIGtlcm5lbCBpcyB2ZXJzaW9uICVzLiIsCgkJCQkJbV9maWxlbmFtZSwgbV9zdHJ2ZXJzaW9uLCB1dHNfaW5mby5yZWxlYXNlKTsKCQkJZ290byBvdXQ7CgkJfQoJfQoJa19jcmNzID0gMDsKI2VuZGlmCQkJCQkJCS8qIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HICovCgoJa19uZXdfc3lzY2FsbHMgPSAhcXVlcnlfbW9kdWxlKE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwpOwoKCWlmIChrX25ld19zeXNjYWxscykgewojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTkVXX01PRFVMRV9JTlRFUkZBQ0UKCQlpZiAoIW5ld19nZXRfa2VybmVsX3N5bWJvbHMoKSkKCQkJZ290byBvdXQ7CgkJa19jcmNzID0gbmV3X2lzX2tlcm5lbF9jaGVja3N1bW1lZCgpOwojZWxzZQoJCWVycm9yX21zZygiTm90IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBuZXcga2VybmVscyIpOwoJCWdvdG8gb3V0OwojZW5kaWYKCX0gZWxzZSB7CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9PTERfTU9EVUxFX0lOVEVSRkFDRQoJCWlmICghb2xkX2dldF9rZXJuZWxfc3ltYm9scyhtX25hbWUpKQoJCQlnb3RvIG91dDsKCQlrX2NyY3MgPSBvbGRfaXNfa2VybmVsX2NoZWNrc3VtbWVkKCk7CiNlbHNlCgkJZXJyb3JfbXNnKCJOb3QgY29uZmlndXJlZCB0byBzdXBwb3J0IG9sZCBrZXJuZWxzIik7CgkJZ290byBvdXQ7CiNlbmRpZgoJfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCglpZiAobV9oYXNfbW9kaW5mbykKCQltX2NyY3MgPSBuZXdfaXNfbW9kdWxlX2NoZWNrc3VtbWVkKGYpOwoJZWxzZQoJCW1fY3JjcyA9IG9sZF9pc19tb2R1bGVfY2hlY2tzdW1tZWQoZik7CgoJaWYgKG1fY3JjcyAhPSBrX2NyY3MpCgkJb2JqX3NldF9zeW1ib2xfY29tcGFyZShmLCBuY3Zfc3RyY21wLCBuY3Zfc3ltYm9sX2hhc2gpOwojZW5kaWYJCQkJCQkJLyogQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KCgkvKiBMZXQgdGhlIG1vZHVsZSBrbm93IGFib3V0IHRoZSBrZXJuZWwgc3ltYm9scy4gICovCglhZGRfa2VybmVsX3N5bWJvbHMoZik7CgoJLyogQWxsb2NhdGUgY29tbW9uIHN5bWJvbHMsIHN5bWJvbCB0YWJsZXMsIGFuZCBzdHJpbmcgdGFibGVzLiAgKi8KCglpZiAoa19uZXdfc3lzY2FsbHMgCgkJPyAhbmV3X2NyZWF0ZV90aGlzX21vZHVsZShmLCBtX25hbWUpCgkJOiAhb2xkX2NyZWF0ZV9tb2RfdXNlX2NvdW50KGYpKSAKCXsKCQlnb3RvIG91dDsKCX0KCglpZiAoIW9ial9jaGVja191bmRlZmluZWRzKGYpKSB7CgkJZ290byBvdXQ7Cgl9CglvYmpfYWxsb2NhdGVfY29tbW9ucyhmKTsKCgkvKiBkb25lIHdpdGggdGhlIG1vZHVsZSBuYW1lLCBvbiB0byB0aGUgb3B0aW9uYWwgdmFyPXZhbHVlIGFyZ3VtZW50cyAqLwoJKytvcHRpbmQ7CgoJaWYgKG9wdGluZCA8IGFyZ2MpIHsKCQlpZiAobV9oYXNfbW9kaW5mbwoJCQk/ICFuZXdfcHJvY2Vzc19tb2R1bGVfYXJndW1lbnRzKGYsIGFyZ2MgLSBvcHRpbmQsIGFyZ3YgKyBvcHRpbmQpIAoJCQk6ICFvbGRfcHJvY2Vzc19tb2R1bGVfYXJndW1lbnRzKGYsIGFyZ2MgLSBvcHRpbmQsIGFyZ3YgKyBvcHRpbmQpKSAKCQl7CgkJCWdvdG8gb3V0OwoJCX0KCX0KCglhcmNoX2NyZWF0ZV9nb3QoZik7CgloaWRlX3NwZWNpYWxfc3ltYm9scyhmKTsKCglpZiAoa19uZXdfc3lzY2FsbHMpCgkJbmV3X2NyZWF0ZV9tb2R1bGVfa3N5bXRhYihmKTsKCgkvKiBGaW5kIGN1cnJlbnQgc2l6ZSBvZiB0aGUgbW9kdWxlICovCgltX3NpemUgPSBvYmpfbG9hZF9zaXplKGYpOwoKCgltX2FkZHIgPSBjcmVhdGVfbW9kdWxlKG1fbmFtZSwgbV9zaXplKTsKCWlmIChtX2FkZHI9PS0xKSBzd2l0Y2ggKGVycm5vKSB7CgljYXNlIEVFWElTVDoKCQllcnJvcl9tc2coIkEgbW9kdWxlIG5hbWVkICVzIGFscmVhZHkgZXhpc3RzIiwgbV9uYW1lKTsKCQlnb3RvIG91dDsKCWNhc2UgRU5PTUVNOgoJCWVycm9yX21zZygiQ2FuJ3QgYWxsb2NhdGUga2VybmVsIG1lbW9yeSBmb3IgbW9kdWxlOyBuZWVkZWQgJWx1IGJ5dGVzIiwKCQkJCW1fc2l6ZSk7CgkJZ290byBvdXQ7CglkZWZhdWx0OgoJCXBlcnJvcl9tc2coImNyZWF0ZV9tb2R1bGU6ICVzIiwgbV9uYW1lKTsKCQlnb3RvIG91dDsKCX0KCiNpZiAgIUxPQURCSVRTCgkvKgoJICogdGhlIFBST0dCSVRTIHNlY3Rpb24gd2FzIG5vdCBsb2FkZWQgYnkgdGhlIG9ial9sb2FkCgkgKiBub3cgd2UgY2FuIGxvYWQgdGhlbSBkaXJlY3RseSBpbnRvIHRoZSBrZXJuZWwgbWVtb3J5CgkgKi8KCWlmICghb2JqX2xvYWRfcHJvZ2JpdHMoZnAsIGYsIChjaGFyKiltX2FkZHIpKSB7CgkJZGVsZXRlX21vZHVsZShtX25hbWUpOwoJCWdvdG8gb3V0OwoJfQojZW5kaWYJCgoJaWYgKCFvYmpfcmVsb2NhdGUoZiwgbV9hZGRyKSkgewoJCWRlbGV0ZV9tb2R1bGUobV9uYW1lKTsKCQlnb3RvIG91dDsKCX0KCglpZiAoa19uZXdfc3lzY2FsbHMgCgkJPyAhbmV3X2luaXRfbW9kdWxlKG1fbmFtZSwgZiwgbV9zaXplKQoJCTogIW9sZF9pbml0X21vZHVsZShtX25hbWUsIGYsIG1fc2l6ZSkpIAoJewoJCWRlbGV0ZV9tb2R1bGUobV9uYW1lKTsKCQlnb3RvIG91dDsKCX0KCglleGl0X3N0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKCm91dDoKCWZjbG9zZShmcCk7CglyZXR1cm4oZXhpdF9zdGF0dXMpOwp9Cg==