LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCiAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE1LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCiAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwuCiAqCiAqIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKgoKClJFQ0VJVklORyBDT09LSUUgSU5GT1JNQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RydWN0IENvb2tpZUluZm8gKkN1cmxfY29va2llX2luaXQoc3RydWN0IFNlc3Npb25IYW5kbGUgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IENvb2tpZUluZm8gKmluYywgYm9vbCBuZXdzZXNzaW9uKTsKCiAgICAgICAgSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHN0b3JlIGRhdGEgaW4gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogICAgICAgIGNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2FkZChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29va2llSW5mbyAqYywgYm9vbCBodHRwaGVhZGVyLCBjaGFyICpsaW5lcHRyLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCk7CgogICAgICAgIFRoZSAnbGluZXB0cicgcGFyYW1ldGVyIGlzIGEgZnVsbCAiU2V0LWNvb2tpZToiIGxpbmUgYXMKICAgICAgICByZWNlaXZlZCBmcm9tIGEgc2VydmVyLgoKICAgICAgICBUaGUgZnVuY3Rpb24gbmVlZCB0byByZXBsYWNlIHByZXZpb3VzbHkgc3RvcmVkIGxpbmVzIHRoYXQgdGhpcyBuZXcKICAgICAgICBsaW5lIHN1cGVyY2VlZHMuCgogICAgICAgIEl0IG1heSByZW1vdmUgbGluZXMgdGhhdCBhcmUgZXhwaXJlZC4KCiAgICAgICAgSXQgc2hvdWxkIHJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MvZXJyb3IuCgoKU0VORElORyBDT09LSUUgSU5GT1JNQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVzICpDdXJsX2Nvb2tpZV9nZXRsaXN0KHN0cnVjdCBDb29raWVJbmZvICpjb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3QsIGNoYXIgKnBhdGgsIGJvb2wgc2VjdXJlKTsKCiAgICAgICAgRm9yIGEgZ2l2ZW4gaG9zdCBhbmQgcGF0aCwgcmV0dXJuIGEgbGlua2VkIGxpc3Qgb2YgY29va2llcyB0aGF0CiAgICAgICAgdGhlIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlCiAgICAgICAgYm9vbGVhbiBpbmZvcm1zIHRoZSBjb29raWUgaWYgYSBzZWN1cmUgY29ubmVjdGlvbiBpcyBhY2hpZXZlZCBvcgogICAgICAgIG5vdC4KCiAgICAgICAgSXQgc2hhbGwgb25seSByZXR1cm4gY29va2llcyB0aGF0IGhhdmVuJ3QgZXhwaXJlZC4KCgpFeGFtcGxlIHNldCBvZiBjb29raWVzOgoKICAgIFNldC1jb29raWU6IFBST0RVQ1RJTkZPPXdlYnhwcmVzczsgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBQRVJTT05BTElaRT1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vZnRndzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRIaXN0PW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRmlkT3JkZXI9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBEaXNQZW5kPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRmlkRGlzPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZToKICAgIFNlc3Npb25fS2V5QDY3OTFhOWUwLTkwMWEtMTFkMC1hMWM4LTliMDEyYzg4YWE3Nz1ub25lO2V4cGlyZXM9TW9uZGF5LAogICAgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKKioqKi8KCiNpbmNsdWRlICJjdXJsX3NldHVwLmgiCgojaWYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0hUVFApICYmICFkZWZpbmVkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKI2luY2x1ZGUgImN1cmxfcHJpbnRmLmgiCiNpbmNsdWRlICJ1cmxkYXRhLmgiCiNpbmNsdWRlICJjb29raWUuaCIKI2luY2x1ZGUgInN0cmVxdWFsLmgiCiNpbmNsdWRlICJzdHJ0b2suaCIKI2luY2x1ZGUgInNlbmRmLmgiCiNpbmNsdWRlICJzbGlzdC5oIgojaW5jbHVkZSAic2hhcmUuaCIKI2luY2x1ZGUgInN0cnRvb2ZmdC5oIgojaW5jbHVkZSAicmF3c3RyLmgiCiNpbmNsdWRlICJjdXJsX21lbXJjaHIuaCIKI2luY2x1ZGUgImluZXRfcHRvbi5oIgoKLyogVGhlIGxhc3QgI2luY2x1ZGUgZmlsZXMgc2hvdWxkIGJlOiAqLwojaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKI2luY2x1ZGUgIm1lbWRlYnVnLmgiCgpzdGF0aWMgdm9pZCBmcmVlY29va2llKHN0cnVjdCBDb29raWUgKmNvKQp7CiAgZnJlZShjby0+ZXhwaXJlc3RyKTsKICBmcmVlKGNvLT5kb21haW4pOwogIGZyZWUoY28tPnBhdGgpOwogIGZyZWUoY28tPnNwYXRoKTsKICBmcmVlKGNvLT5uYW1lKTsKICBmcmVlKGNvLT52YWx1ZSk7CiAgZnJlZShjby0+bWF4YWdlKTsKICBmcmVlKGNvLT52ZXJzaW9uKTsKICBmcmVlKGNvKTsKfQoKc3RhdGljIGJvb2wgdGFpbG1hdGNoKGNvbnN0IGNoYXIgKmNvb2tlX2RvbWFpbiwgY29uc3QgY2hhciAqaG9zdG5hbWUpCnsKICBzaXplX3QgY29va2llX2RvbWFpbl9sZW4gPSBzdHJsZW4oY29va2VfZG9tYWluKTsKICBzaXplX3QgaG9zdG5hbWVfbGVuID0gc3RybGVuKGhvc3RuYW1lKTsKCiAgaWYoaG9zdG5hbWVfbGVuIDwgY29va2llX2RvbWFpbl9sZW4pCiAgICByZXR1cm4gRkFMU0U7CgogIGlmKCFDdXJsX3Jhd19lcXVhbChjb29rZV9kb21haW4sIGhvc3RuYW1lK2hvc3RuYW1lX2xlbi1jb29raWVfZG9tYWluX2xlbikpCiAgICByZXR1cm4gRkFMU0U7CgogIC8qIEEgbGVhZCBjaGFyIG9mIGNvb2tpZV9kb21haW4gaXMgbm90ICcuJy4KICAgICBSRkM2MjY1IDQuMS4yLjMuIFRoZSBEb21haW4gQXR0cmlidXRlIHNheXM6CiAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIHZhbHVlIG9mIHRoZSBEb21haW4gYXR0cmlidXRlIGlzCiAgICAgICAiZXhhbXBsZS5jb20iLCB0aGUgdXNlciBhZ2VudCB3aWxsIGluY2x1ZGUgdGhlIGNvb2tpZSBpbiB0aGUgQ29va2llCiAgICAgICBoZWFkZXIgd2hlbiBtYWtpbmcgSFRUUCByZXF1ZXN0cyB0byBleGFtcGxlLmNvbSwgd3d3LmV4YW1wbGUuY29tLCBhbmQKICAgICAgIHd3dy5jb3JwLmV4YW1wbGUuY29tLgogICAqLwogIGlmKGhvc3RuYW1lX2xlbiA9PSBjb29raWVfZG9tYWluX2xlbikKICAgIHJldHVybiBUUlVFOwogIGlmKCcuJyA9PSAqKGhvc3RuYW1lICsgaG9zdG5hbWVfbGVuIC0gY29va2llX2RvbWFpbl9sZW4gLSAxKSkKICAgIHJldHVybiBUUlVFOwogIHJldHVybiBGQUxTRTsKfQoKLyoKICogbWF0Y2hpbmcgY29va2llIHBhdGggYW5kIHVybCBwYXRoCiAqIFJGQzYyNjUgNS4xLjQgUGF0aHMgYW5kIFBhdGgtTWF0Y2gKICovCnN0YXRpYyBib29sIHBhdGhtYXRjaChjb25zdCBjaGFyKiBjb29raWVfcGF0aCwgY29uc3QgY2hhciogcmVxdWVzdF91cmkpCnsKICBzaXplX3QgY29va2llX3BhdGhfbGVuOwogIHNpemVfdCB1cmlfcGF0aF9sZW47CiAgY2hhciogdXJpX3BhdGggPSBOVUxMOwogIGNoYXIqIHBvczsKICBib29sIHJldCA9IEZBTFNFOwoKICAvKiBjb29raWVfcGF0aCBtdXN0IG5vdCBoYXZlIGxhc3QgJy8nIHNlcGFyYXRvci4gZXg6IC9zYW1wbGUgKi8KICBjb29raWVfcGF0aF9sZW4gPSBzdHJsZW4oY29va2llX3BhdGgpOwogIGlmKDEgPT0gY29va2llX3BhdGhfbGVuKSB7CiAgICAvKiBjb29raWVfcGF0aCBtdXN0IGJlICcvJyAqLwogICAgcmV0dXJuIFRSVUU7CiAgfQoKICB1cmlfcGF0aCA9IHN0cmR1cChyZXF1ZXN0X3VyaSk7CiAgaWYoIXVyaV9wYXRoKQogICAgcmV0dXJuIEZBTFNFOwogIHBvcyA9IHN0cmNocih1cmlfcGF0aCwgJz8nKTsKICBpZihwb3MpCiAgICAqcG9zID0gMHgwOwoKICAvKiAjLWZyYWdtZW50cyBhcmUgYWxyZWFkeSBjdXQgb2ZmISAqLwogIGlmKDAgPT0gc3RybGVuKHVyaV9wYXRoKSB8fCB1cmlfcGF0aFswXSAhPSAnLycpIHsKICAgIGZyZWUodXJpX3BhdGgpOwogICAgdXJpX3BhdGggPSBzdHJkdXAoIi8iKTsKICAgIGlmKCF1cmlfcGF0aCkKICAgICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgLyogaGVyZSwgUkZDNjI2NSA1LjEuNCBzYXlzCiAgICAgNC4gT3V0cHV0IHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1cmktcGF0aCBmcm9tIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdXAKICAgICAgICB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSByaWdodC1tb3N0ICV4MkYgKCIvIikuCiAgICAgYnV0IFVSTCBwYXRoIC9ob2dlP2Z1Z2E9eHh4IG1lYW5zIC9ob2dlL2luZGV4LmNnaT9mdWdhPXh4eCBpbiBzb21lIHNpdGUKICAgICB3aXRob3V0IHJlZGlyZWN0LgogICAgIElnbm9yZSB0aGlzIGFsZ29yaXRobSBiZWNhdXNlIC9ob2dlIGlzIHVyaSBwYXRoIGZvciB0aGlzIGNhc2UKICAgICAodXJpIHBhdGggaXMgbm90IC8pLgogICAqLwoKICB1cmlfcGF0aF9sZW4gPSBzdHJsZW4odXJpX3BhdGgpOwoKICBpZih1cmlfcGF0aF9sZW4gPCBjb29raWVfcGF0aF9sZW4pIHsKICAgIHJldCA9IEZBTFNFOwogICAgZ290byBwYXRobWF0Y2hlZDsKICB9CgogIC8qIG5vdCB1c2luZyBjaGVja3ByZWZpeCgpIGJlY2F1c2UgbWF0Y2hpbmcgc2hvdWxkIGJlIGNhc2Utc2Vuc2l0aXZlICovCiAgaWYoc3RybmNtcChjb29raWVfcGF0aCwgdXJpX3BhdGgsIGNvb2tpZV9wYXRoX2xlbikpIHsKICAgIHJldCA9IEZBTFNFOwogICAgZ290byBwYXRobWF0Y2hlZDsKICB9CgogIC8qIFRoZSBjb29raWUtcGF0aCBhbmQgdGhlIHVyaS1wYXRoIGFyZSBpZGVudGljYWwuICovCiAgaWYoY29va2llX3BhdGhfbGVuID09IHVyaV9wYXRoX2xlbikgewogICAgcmV0ID0gVFJVRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICAvKiBoZXJlLCBjb29raWVfcGF0aF9sZW4gPCB1cmxfcGF0aF9sZW4gKi8KICBpZih1cmlfcGF0aFtjb29raWVfcGF0aF9sZW5dID09ICcvJykgewogICAgcmV0ID0gVFJVRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICByZXQgPSBGQUxTRTsKCnBhdGhtYXRjaGVkOgogIGZyZWUodXJpX3BhdGgpOwogIHJldHVybiByZXQ7Cn0KCi8qCiAqIGNvb2tpZSBwYXRoIHNhbml0aXplCiAqLwpzdGF0aWMgY2hhciAqc2FuaXRpemVfY29va2llX3BhdGgoY29uc3QgY2hhciAqY29va2llX3BhdGgpCnsKICBzaXplX3QgbGVuOwogIGNoYXIgKm5ld19wYXRoID0gc3RyZHVwKGNvb2tpZV9wYXRoKTsKICBpZighbmV3X3BhdGgpCiAgICByZXR1cm4gTlVMTDsKCiAgLyogc29tZSBzdHVwaWQgc2l0ZSBzZW5kcyBwYXRoIGF0dHJpYnV0ZSB3aXRoICciJy4gKi8KICBsZW4gPSBzdHJsZW4obmV3X3BhdGgpOwogIGlmKG5ld19wYXRoWzBdID09ICdcIicpIHsKICAgIG1lbW1vdmUoKHZvaWQgKiluZXdfcGF0aCwgKGNvbnN0IHZvaWQgKikobmV3X3BhdGggKyAxKSwgbGVuKTsKICAgIGxlbi0tOwogIH0KICBpZihsZW4gJiYgKG5ld19wYXRoW2xlbiAtIDFdID09ICdcIicpKSB7CiAgICBuZXdfcGF0aFtsZW4gLSAxXSA9IDB4MDsKICAgIGxlbi0tOwogIH0KCiAgLyogUkZDNjI2NSA1LjIuNCBUaGUgUGF0aCBBdHRyaWJ1dGUgKi8KICBpZihuZXdfcGF0aFswXSAhPSAnLycpIHsKICAgIC8qIExldCBjb29raWUtcGF0aCBiZSB0aGUgZGVmYXVsdC1wYXRoLiAqLwogICAgZnJlZShuZXdfcGF0aCk7CiAgICBuZXdfcGF0aCA9IHN0cmR1cCgiLyIpOwogICAgcmV0dXJuIG5ld19wYXRoOwogIH0KCiAgLyogY29udmVydCAvaG9nZS8gdG8gL2hvZ2UgKi8KICBpZihsZW4gJiYgbmV3X3BhdGhbbGVuIC0gMV0gPT0gJy8nKSB7CiAgICBuZXdfcGF0aFtsZW4gLSAxXSA9IDB4MDsKICB9CgogIHJldHVybiBuZXdfcGF0aDsKfQoKLyoKICogTG9hZCBjb29raWVzIGZyb20gYWxsIGdpdmVuIGNvb2tpZSBmaWxlcyAoQ1VSTE9QVF9DT09LSUVGSUxFKS4KICoKICogTk9URTogT09NIG9yIGNvb2tpZSBwYXJzaW5nIGZhaWx1cmVzIGFyZSBpZ25vcmVkLgogKi8Kdm9pZCBDdXJsX2Nvb2tpZV9sb2FkZmlsZXMoc3RydWN0IFNlc3Npb25IYW5kbGUgKmRhdGEpCnsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IGRhdGEtPmNoYW5nZS5jb29raWVsaXN0OwogIGlmKGxpc3QpIHsKICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKICAgIHdoaWxlKGxpc3QpIHsKICAgICAgc3RydWN0IENvb2tpZUluZm8gKm5ld2Nvb2tpZXMgPSBDdXJsX2Nvb2tpZV9pbml0KGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+Y29va2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNldC5jb29raWVzZXNzaW9uKTsKICAgICAgaWYoIW5ld2Nvb2tpZXMpCiAgICAgICAgLyogRmFpbHVyZSBtYXkgYmUgZHVlIHRvIE9PTSBvciBhIGJhZCBjb29raWU7IGJvdGggYXJlIGlnbm9yZWQKICAgICAgICAgKiBidXQgb25seSB0aGUgZmlyc3Qgc2hvdWxkIGJlCiAgICAgICAgICovCiAgICAgICAgaW5mb2YoZGF0YSwgImlnbm9yaW5nIGZhaWxlZCBjb29raWVfaW5pdCBmb3IgJXNcbiIsIGxpc3QtPmRhdGEpOwogICAgICBlbHNlCiAgICAgICAgZGF0YS0+Y29va2llcyA9IG5ld2Nvb2tpZXM7CiAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwogICAgfQogICAgY3VybF9zbGlzdF9mcmVlX2FsbChkYXRhLT5jaGFuZ2UuY29va2llbGlzdCk7IC8qIGNsZWFuIHVwIGxpc3QgKi8KICAgIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0ID0gTlVMTDsgLyogZG9uJ3QgZG8gdGhpcyBhZ2FpbiEgKi8KICAgIEN1cmxfc2hhcmVfdW5sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSk7CiAgfQp9CgovKgogKiBzdHJzdG9yZSgpIG1ha2VzIGEgc3RyZHVwKCkgb24gdGhlICduZXdzdHInIGFuZCBpZiAnKnN0cicgaXMgbm9uLU5VTEwKICogdGhhdCB3aWxsIGJlIGZyZWVkIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHN0cmluZyBpcyBzdG9yZWQgdGhlcmUuCiAqCiAqIEl0IGlzIG1lYW50IHRvIGVhc2lseSByZXBsYWNlIHN0cmR1cCgpCiAqLwpzdGF0aWMgdm9pZCBzdHJzdG9yZShjaGFyICoqc3RyLCBjb25zdCBjaGFyICpuZXdzdHIpCnsKICBmcmVlKCpzdHIpOwogICpzdHIgPSBzdHJkdXAobmV3c3RyKTsKfQoKLyoKICogcmVtb3ZlX2V4cGlyZWQoKSByZW1vdmVzIGV4cGlyZWQgY29va2llcy4KICovCnN0YXRpYyB2b2lkIHJlbW92ZV9leHBpcmVkKHN0cnVjdCBDb29raWVJbmZvICpjb29raWVzKQp7CiAgc3RydWN0IENvb2tpZSAqY28sICpueCwgKnB2OwogIGN1cmxfb2ZmX3Qgbm93ID0gKGN1cmxfb2ZmX3QpdGltZShOVUxMKTsKCiAgY28gPSBjb29raWVzLT5jb29raWVzOwogIHB2ID0gTlVMTDsKICB3aGlsZShjbykgewogICAgbnggPSBjby0+bmV4dDsKICAgIGlmKChjby0+ZXhwaXJlc3RyIHx8IGNvLT5tYXhhZ2UpICYmIGNvLT5leHBpcmVzIDwgbm93KSB7CiAgICAgIGlmKGNvID09IGNvb2tpZXMtPmNvb2tpZXMpIHsKICAgICAgICBjb29raWVzLT5jb29raWVzID0gY28tPm5leHQ7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgcHYtPm5leHQgPSBjby0+bmV4dDsKICAgICAgfQogICAgICBjb29raWVzLT5udW1jb29raWVzLS07CiAgICAgIGZyZWVjb29raWUoY28pOwogICAgfQogICAgZWxzZSB7CiAgICAgIHB2ID0gY287CiAgICB9CiAgICBjbyA9IG54OwogIH0KfQoKLyoKICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhbiBJUCh2NHx2NikgYWRkcmVzcy4KICovCnN0YXRpYyBib29sIGlzaXAoY29uc3QgY2hhciAqZG9tYWluKQp7CiAgc3RydWN0IGluX2FkZHIgYWRkcjsKI2lmZGVmIEVOQUJMRV9JUFY2CiAgc3RydWN0IGluNl9hZGRyIGFkZHI2OwojZW5kaWYKCiAgaWYoQ3VybF9pbmV0X3B0b24oQUZfSU5FVCwgZG9tYWluLCAmYWRkcikKI2lmZGVmIEVOQUJMRV9JUFY2CiAgICAgfHwgQ3VybF9pbmV0X3B0b24oQUZfSU5FVDYsIGRvbWFpbiwgJmFkZHI2KQojZW5kaWYKICAgICkgewogICAgLyogZG9tYWluIG5hbWUgZ2l2ZW4gYXMgSVAgYWRkcmVzcyAqLwogICAgcmV0dXJuIFRSVUU7CiAgfQoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2FkZCgpCiAqCiAqIEFkZCBhIHNpbmdsZSBjb29raWUgbGluZSB0byB0aGUgY29va2llIGtlZXBpbmcgb2JqZWN0LgogKgogKiBCZSBhd2FyZSB0aGF0IHNvbWV0aW1lcyB3ZSBnZXQgYW4gSVAtb25seSBob3N0IG5hbWUsIGFuZCB0aGF0IG1pZ2h0IGFsc28gYmUKICogYSBudW1lcmljYWwgSVB2NiBhZGRyZXNzLgogKgogKiBSZXR1cm5zIE5VTEwgb24gb3V0IG9mIG1lbW9yeSBvciBpbnZhbGlkIGNvb2tpZS4gVGhpcyBpcyBzdWJvcHRpbWFsLAogKiBhcyB0aGV5IHNob3VsZCBiZSB0cmVhdGVkIHNlcGFyYXRlbHkuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdHJ1Y3QgQ29va2llICoKQ3VybF9jb29raWVfYWRkKHN0cnVjdCBTZXNzaW9uSGFuZGxlICpkYXRhLAogICAgICAgICAgICAgICAgLyogVGhlICdkYXRhJyBwb2ludGVyIGhlcmUgbWF5IGJlIE5VTEwgYXQgdGltZXMsIGFuZCB0aHVzCiAgICAgICAgICAgICAgICAgICBtdXN0IG9ubHkgYmUgdXNlZCB2ZXJ5IGNhcmVmdWxseSBmb3IgdGhpbmdzIHRoYXQgY2FuIGRlYWwKICAgICAgICAgICAgICAgICAgIHdpdGggZGF0YSBiZWluZyBOVUxMLiBTdWNoIGFzIGluZm9mKCkgYW5kIHNpbWlsYXIgKi8KCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29va2llSW5mbyAqYywKICAgICAgICAgICAgICAgIGJvb2wgaHR0cGhlYWRlciwgLyogVFJVRSBpZiBIVFRQIGhlYWRlci1zdHlsZSBsaW5lICovCiAgICAgICAgICAgICAgICBjaGFyICpsaW5lcHRyLCAgIC8qIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbGluZSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZG9tYWluLCAvKiBkZWZhdWx0IGRvbWFpbiAqLwogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCkgICAvKiBmdWxsIHBhdGggdXNlZCB3aGVuIHRoaXMgY29va2llIGlzIHNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBnZXQgZGVmYXVsdCBwYXRoIGZvciB0aGUgY29va2llCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGVzcyBzZXQgKi8KewogIHN0cnVjdCBDb29raWUgKmNsaXN0OwogIGNoYXIgbmFtZVtNQVhfTkFNRV07CiAgc3RydWN0IENvb2tpZSAqY287CiAgc3RydWN0IENvb2tpZSAqbGFzdGM9TlVMTDsKICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKICBib29sIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgYm9vbCBiYWRjb29raWUgPSBGQUxTRTsgLyogY29va2llcyBhcmUgZ29vZCBieSBkZWZhdWx0LiBtbW1tbSB5dW1teSAqLwoKI2lmZGVmIENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MKICAodm9pZClkYXRhOwojZW5kaWYKCiAgLyogRmlyc3QsIGFsbG9jIGFuZCBpbml0IGEgbmV3IHN0cnVjdCBmb3IgaXQgKi8KICBjbyA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IENvb2tpZSkpOwogIGlmKCFjbykKICAgIHJldHVybiBOVUxMOyAvKiBiYWlsIG91dCBpZiB3ZSdyZSB0aGlzIGxvdyBvbiBtZW1vcnkgKi8KCiAgaWYoaHR0cGhlYWRlcikgewogICAgLyogVGhpcyBsaW5lIHdhcyByZWFkIG9mZiBhIEhUVFAtaGVhZGVyICovCiAgICBjb25zdCBjaGFyICpwdHI7CiAgICBjb25zdCBjaGFyICpzZW1pcHRyOwogICAgY2hhciAqd2hhdDsKCiAgICB3aGF0ID0gbWFsbG9jKE1BWF9DT09LSUVfTElORSk7CiAgICBpZighd2hhdCkgewogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgc2VtaXB0cj1zdHJjaHIobGluZXB0ciwgJzsnKTsgLyogZmlyc3QsIGZpbmQgYSBzZW1pY29sb24gKi8KCiAgICB3aGlsZSgqbGluZXB0ciAmJiBJU0JMQU5LKCpsaW5lcHRyKSkKICAgICAgbGluZXB0cisrOwoKICAgIHB0ciA9IGxpbmVwdHI7CiAgICBkbyB7CiAgICAgIC8qIHdlIGhhdmUgYSA8d2hhdD49PHRoaXM+IHBhaXIgb3IgYSBzdGFuZC1hbG9uZSB3b3JkIGhlcmUgKi8KICAgICAgbmFtZVswXT13aGF0WzBdPTA7IC8qIGluaXQgdGhlIGJ1ZmZlcnMgKi8KICAgICAgaWYoMSA8PSBzc2NhbmYocHRyLCAiJSIgTUFYX05BTUVfVFhUICJbXjtcclxuID1dID0lIgogICAgICAgICAgICAgICAgICAgICBNQVhfQ09PS0lFX0xJTkVfVFhUICJbXjtcclxuXSIsCiAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHdoYXQpKSB7CiAgICAgICAgLyogVXNlIHN0cnN0b3JlKCkgYmVsb3cgdG8gcHJvcGVybHkgZGVhbCB3aXRoIHJlY2VpdmVkIGNvb2tpZQogICAgICAgICAgIGhlYWRlcnMgdGhhdCBoYXZlIHRoZSBzYW1lIHN0cmluZyBwcm9wZXJ0eSBzZXQgbW9yZSB0aGFuIG9uY2UsCiAgICAgICAgICAgYW5kIHRoZW4gd2UgdXNlIHRoZSBsYXN0IG9uZS4gKi8KICAgICAgICBjb25zdCBjaGFyICp3aGF0cHRyOwogICAgICAgIGJvb2wgZG9uZSA9IEZBTFNFOwogICAgICAgIGJvb2wgc2VwOwogICAgICAgIHNpemVfdCBsZW49c3RybGVuKHdoYXQpOwogICAgICAgIGNvbnN0IGNoYXIgKmVuZG9mbiA9ICZwdHJbIHN0cmxlbihuYW1lKSBdOwoKICAgICAgICAvKiBza2lwIHRyYWlsaW5nIHNwYWNlcyBpbiBuYW1lICovCiAgICAgICAgd2hpbGUoKmVuZG9mbiAmJiBJU0JMQU5LKCplbmRvZm4pKQogICAgICAgICAgZW5kb2ZuKys7CgogICAgICAgIC8qIG5hbWUgZW5kcyB3aXRoIGEgJz0nID8gKi8KICAgICAgICBzZXAgPSAoKmVuZG9mbiA9PSAnPScpP1RSVUU6RkFMU0U7CgogICAgICAgIC8qIFN0cmlwIG9mZiB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgIHdoaWxlKGxlbiAmJiBJU0JMQU5LKHdoYXRbbGVuLTFdKSkgewogICAgICAgICAgd2hhdFtsZW4tMV09MDsKICAgICAgICAgIGxlbi0tOwogICAgICAgIH0KCiAgICAgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgJ3doYXQnICovCiAgICAgICAgd2hhdHB0cj13aGF0OwogICAgICAgIHdoaWxlKCp3aGF0cHRyICYmIElTQkxBTksoKndoYXRwdHIpKQogICAgICAgICAgd2hhdHB0cisrOwoKICAgICAgICBpZighbGVuKSB7CiAgICAgICAgICAvKiB0aGlzIHdhcyBhICI8bmFtZT49IiB3aXRoIG5vIGNvbnRlbnQsIGFuZCB3ZSBtdXN0IGFsbG93CiAgICAgICAgICAgICAnc2VjdXJlJyBhbmQgJ2h0dHBvbmx5JyBzcGVjaWZpZWQgdGhpcyB3ZWlyZGx5ICovCiAgICAgICAgICBkb25lID0gVFJVRTsKICAgICAgICAgIGlmKEN1cmxfcmF3X2VxdWFsKCJzZWN1cmUiLCBuYW1lKSkKICAgICAgICAgICAgY28tPnNlY3VyZSA9IFRSVUU7CiAgICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJodHRwb25seSIsIG5hbWUpKQogICAgICAgICAgICBjby0+aHR0cG9ubHkgPSBUUlVFOwogICAgICAgICAgZWxzZSBpZihzZXApCiAgICAgICAgICAgIC8qIHRoZXJlIHdhcyBhICc9JyBzbyB3ZSdyZSBub3QgZG9uZSBwYXJzaW5nIHRoaXMgZmllbGQgKi8KICAgICAgICAgICAgZG9uZSA9IEZBTFNFOwogICAgICAgIH0KICAgICAgICBpZihkb25lKQogICAgICAgICAgOwogICAgICAgIGVsc2UgaWYoQ3VybF9yYXdfZXF1YWwoInBhdGgiLCBuYW1lKSkgewogICAgICAgICAgc3Ryc3RvcmUoJmNvLT5wYXRoLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+cGF0aCkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOyAvKiBvdXQgb2YgbWVtb3J5IGJhZCAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgIGlmKCFjby0+c3BhdGgpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoQ3VybF9yYXdfZXF1YWwoImRvbWFpbiIsIG5hbWUpKSB7CiAgICAgICAgICBib29sIGlzX2lwOwogICAgICAgICAgY29uc3QgY2hhciAqZG90cDsKCiAgICAgICAgICAvKiBOb3csIHdlIG1ha2Ugc3VyZSB0aGF0IG91ciBob3N0IGlzIHdpdGhpbiB0aGUgZ2l2ZW4gZG9tYWluLAogICAgICAgICAgICAgb3IgdGhlIGdpdmVuIGRvbWFpbiBpcyBub3QgdmFsaWQgYW5kIHRodXMgY2Fubm90IGJlIHNldC4gKi8KCiAgICAgICAgICBpZignLicgPT0gd2hhdHB0clswXSkKICAgICAgICAgICAgd2hhdHB0cisrOyAvKiBpZ25vcmUgcHJlY2VkaW5nIGRvdCAqLwoKICAgICAgICAgIGlzX2lwID0gaXNpcChkb21haW4gPyBkb21haW4gOiB3aGF0cHRyKTsKCiAgICAgICAgICAvKiBjaGVjayBmb3IgbW9yZSBkb3RzICovCiAgICAgICAgICBkb3RwID0gc3RyY2hyKHdoYXRwdHIsICcuJyk7CiAgICAgICAgICBpZighZG90cCkKICAgICAgICAgICAgZG9tYWluPSI6IjsKCiAgICAgICAgICBpZighZG9tYWluCiAgICAgICAgICAgICB8fCAoaXNfaXAgJiYgIXN0cmNtcCh3aGF0cHRyLCBkb21haW4pKQogICAgICAgICAgICAgfHwgKCFpc19pcCAmJiB0YWlsbWF0Y2god2hhdHB0ciwgZG9tYWluKSkpIHsKICAgICAgICAgICAgc3Ryc3RvcmUoJmNvLT5kb21haW4sIHdoYXRwdHIpOwogICAgICAgICAgICBpZighY28tPmRvbWFpbikgewogICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoIWlzX2lwKQogICAgICAgICAgICAgIGNvLT50YWlsbWF0Y2g9VFJVRTsgLyogd2UgYWx3YXlzIGRvIHRoYXQgaWYgdGhlIGRvbWFpbiBuYW1lIHdhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gKi8KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiB3ZSBkaWQgbm90IGdldCBhIHRhaWxtYXRjaCBhbmQgdGhlbiB0aGUgYXR0ZW1wdGVkIHNldCBkb21haW4KICAgICAgICAgICAgICAgaXMgbm90IGEgZG9tYWluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGhvc3QgYmVsb25ncy4gTWFyayBhcwogICAgICAgICAgICAgICBiYWQuICovCiAgICAgICAgICAgIGJhZGNvb2tpZT1UUlVFOwogICAgICAgICAgICBpbmZvZihkYXRhLCAic2tpcHBlZCBjb29raWUgd2l0aCBiYWQgdGFpbG1hdGNoIGRvbWFpbjogJXNcbiIsCiAgICAgICAgICAgICAgICAgIHdoYXRwdHIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJ2ZXJzaW9uIiwgbmFtZSkpIHsKICAgICAgICAgIHN0cnN0b3JlKCZjby0+dmVyc2lvbiwgd2hhdHB0cik7CiAgICAgICAgICBpZighY28tPnZlcnNpb24pIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoQ3VybF9yYXdfZXF1YWwoIm1heC1hZ2UiLCBuYW1lKSkgewogICAgICAgICAgLyogRGVmaW5lZCBpbiBSRkMyMTA5OgoKICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIE1heC1BZ2UgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxpZmV0aW1lIG9mIHRoZQogICAgICAgICAgICAgY29va2llLCBpbiBzZWNvbmRzLiAgVGhlIGRlbHRhLXNlY29uZHMgdmFsdWUgaXMgYSBkZWNpbWFsIG5vbi0KICAgICAgICAgICAgIG5lZ2F0aXZlIGludGVnZXIuICBBZnRlciBkZWx0YS1zZWNvbmRzIHNlY29uZHMgZWxhcHNlLCB0aGUKICAgICAgICAgICAgIGNsaWVudCBzaG91bGQgZGlzY2FyZCB0aGUgY29va2llLiAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoZQogICAgICAgICAgICAgY29va2llIHNob3VsZCBiZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkuCgogICAgICAgICAgKi8KICAgICAgICAgIHN0cnN0b3JlKCZjby0+bWF4YWdlLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+bWF4YWdlKSB7CiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJleHBpcmVzIiwgbmFtZSkpIHsKICAgICAgICAgIHN0cnN0b3JlKCZjby0+ZXhwaXJlc3RyLCB3aGF0cHRyKTsKICAgICAgICAgIGlmKCFjby0+ZXhwaXJlc3RyKSB7CiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKCFjby0+bmFtZSkgewogICAgICAgICAgY28tPm5hbWUgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAod2hhdHB0cik7CiAgICAgICAgICBpZighY28tPm5hbWUgfHwgIWNvLT52YWx1ZSkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgIGVsc2UgdGhpcyBpcyB0aGUgc2Vjb25kIChvciBtb3JlKSBuYW1lIHdlIGRvbid0IGtub3cKICAgICAgICAgIGFib3V0ISAqLwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8qIHRoaXMgaXMgYW4gImlsbGVnYWwiIDx3aGF0Pj08dGhpcz4gcGFpciAqLwogICAgICB9CgogICAgICBpZighc2VtaXB0ciB8fCAhKnNlbWlwdHIpIHsKICAgICAgICAvKiB3ZSBhbHJlYWR5IGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgY29va2llcyAqLwogICAgICAgIHNlbWlwdHIgPSBOVUxMOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBwdHI9c2VtaXB0cisxOwogICAgICB3aGlsZSgqcHRyICYmIElTQkxBTksoKnB0cikpCiAgICAgICAgcHRyKys7CiAgICAgIHNlbWlwdHI9c3RyY2hyKHB0ciwgJzsnKTsgLyogbm93LCBmaW5kIHRoZSBuZXh0IHNlbWljb2xvbiAqLwoKICAgICAgaWYoIXNlbWlwdHIgJiYgKnB0cikKICAgICAgICAvKiBUaGVyZSBhcmUgbm8gbW9yZSBzZW1pY29sb25zLCBidXQgdGhlcmUncyBhIGZpbmFsIG5hbWU9dmFsdWUgcGFpcgogICAgICAgICAgIGNvbWluZyB1cCAqLwogICAgICAgIHNlbWlwdHI9c3RyY2hyKHB0ciwgJ1wwJyk7CiAgICB9IHdoaWxlKHNlbWlwdHIpOwoKICAgIGlmKGNvLT5tYXhhZ2UpIHsKICAgICAgY28tPmV4cGlyZXMgPQogICAgICAgIGN1cmx4X3N0cnRvb2ZmdCgoKmNvLT5tYXhhZ2U9PSdcIicpPwogICAgICAgICAgICAgICAgICAgICAgICAmY28tPm1heGFnZVsxXTomY28tPm1heGFnZVswXSwgTlVMTCwgMTApOwogICAgICBpZihDVVJMX09GRl9UX01BWCAtIG5vdyA8IGNvLT5leHBpcmVzKQogICAgICAgIC8qIGF2b2lkIG92ZXJmbG93ICovCiAgICAgICAgY28tPmV4cGlyZXMgPSBDVVJMX09GRl9UX01BWDsKICAgICAgZWxzZQogICAgICAgIGNvLT5leHBpcmVzICs9IG5vdzsKICAgIH0KICAgIGVsc2UgaWYoY28tPmV4cGlyZXN0cikgewogICAgICAvKiBOb3RlIHRoYXQgaWYgdGhlIGRhdGUgY291bGRuJ3QgZ2V0IHBhcnNlZCBmb3Igd2hhdGV2ZXIgcmVhc29uLAogICAgICAgICB0aGUgY29va2llIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlc3Npb24gY29va2llICovCiAgICAgIGNvLT5leHBpcmVzID0gY3VybF9nZXRkYXRlKGNvLT5leHBpcmVzdHIsIE5VTEwpOwoKICAgICAgLyogU2Vzc2lvbiBjb29raWVzIGhhdmUgZXhwaXJlcyBzZXQgdG8gMCBzbyBpZiB3ZSBnZXQgdGhhdCBiYWNrCiAgICAgICAgIGZyb20gdGhlIGRhdGUgcGFyc2VyIGxldCdzIGFkZCBhIHNlY29uZCB0byBtYWtlIGl0IGEKICAgICAgICAgbm9uLXNlc3Npb24gY29va2llICovCiAgICAgIGlmKGNvLT5leHBpcmVzID09IDApCiAgICAgICAgY28tPmV4cGlyZXMgPSAxOwogICAgICBlbHNlIGlmKGNvLT5leHBpcmVzIDwgMCkKICAgICAgICBjby0+ZXhwaXJlcyA9IDA7CiAgICB9CgogICAgaWYoIWJhZGNvb2tpZSAmJiAhY28tPmRvbWFpbikgewogICAgICBpZihkb21haW4pIHsKICAgICAgICAvKiBubyBkb21haW4gd2FzIGdpdmVuIGluIHRoZSBoZWFkZXIgbGluZSwgc2V0IHRoZSBkZWZhdWx0ICovCiAgICAgICAgY28tPmRvbWFpbj1zdHJkdXAoZG9tYWluKTsKICAgICAgICBpZighY28tPmRvbWFpbikKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgIH0KICAgIH0KCiAgICBpZighYmFkY29va2llICYmICFjby0+cGF0aCAmJiBwYXRoKSB7CiAgICAgIC8qIE5vIHBhdGggd2FzIGdpdmVuIGluIHRoZSBoZWFkZXIgbGluZSwgc2V0IHRoZSBkZWZhdWx0LgogICAgICAgICBOb3RlIHRoYXQgdGhlIHBhc3NlZC1pbiBwYXRoIHRvIHRoaXMgZnVuY3Rpb24gTUFZIGhhdmUgYSAnPycgYW5kCiAgICAgICAgIGZvbGxvd2luZyBwYXJ0IHRoYXQgTVVTVCBub3QgYmUgc3RvcmVkIGFzIHBhcnQgb2YgdGhlIHBhdGguICovCiAgICAgIGNoYXIgKnF1ZXJ5cCA9IHN0cmNocihwYXRoLCAnPycpOwoKICAgICAgLyogcXVlcnlwIGlzIHdoZXJlIHRoZSBpbnRlcmVzdGluZyBwYXJ0IG9mIHRoZSBwYXRoIGVuZHMsIHNvIG5vdyB3ZQogICAgICAgICB3YW50IHRvIHRoZSBmaW5kIHRoZSBsYXN0ICovCiAgICAgIGNoYXIgKmVuZHNsYXNoOwogICAgICBpZighcXVlcnlwKQogICAgICAgIGVuZHNsYXNoID0gc3RycmNocihwYXRoLCAnLycpOwogICAgICBlbHNlCiAgICAgICAgZW5kc2xhc2ggPSBtZW1yY2hyKHBhdGgsICcvJywgKHNpemVfdCkocXVlcnlwIC0gcGF0aCkpOwogICAgICBpZihlbmRzbGFzaCkgewogICAgICAgIHNpemVfdCBwYXRobGVuID0gKHNpemVfdCkoZW5kc2xhc2gtcGF0aCsxKTsgLyogaW5jbHVkZSBlbmRpbmcgc2xhc2ggKi8KICAgICAgICBjby0+cGF0aD1tYWxsb2MocGF0aGxlbisxKTsgLyogb25lIGV4dHJhIGZvciB0aGUgemVybyBieXRlICovCiAgICAgICAgaWYoY28tPnBhdGgpIHsKICAgICAgICAgIG1lbWNweShjby0+cGF0aCwgcGF0aCwgcGF0aGxlbik7CiAgICAgICAgICBjby0+cGF0aFtwYXRobGVuXT0wOyAvKiB6ZXJvIHRlcm1pbmF0ZSAqLwogICAgICAgICAgY28tPnNwYXRoID0gc2FuaXRpemVfY29va2llX3BhdGgoY28tPnBhdGgpOwogICAgICAgICAgaWYoIWNvLT5zcGF0aCkKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgfQogICAgfQoKICAgIGZyZWUod2hhdCk7CgogICAgaWYoYmFkY29va2llIHx8ICFjby0+bmFtZSkgewogICAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGEgY29va2llIG5hbWUgb3IgYSBiYWQgb25lLAogICAgICAgICB0aGlzIGlzIGFuIGlsbGVnYWwgbGluZSwgYmFpbCBvdXQgKi8KICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICB9CiAgZWxzZSB7CiAgICAvKiBUaGlzIGxpbmUgaXMgTk9UIGEgSFRUUCBoZWFkZXIgc3R5bGUgbGluZSwgd2UgZG8gb2ZmZXIgc3VwcG9ydCBmb3IKICAgICAgIHJlYWRpbmcgdGhlIG9kZCBuZXRzY2FwZSBjb29raWVzLWZpbGUgZm9ybWF0IGhlcmUgKi8KICAgIGNoYXIgKnB0cjsKICAgIGNoYXIgKmZpcnN0cHRyOwogICAgY2hhciAqdG9rX2J1Zj1OVUxMOwogICAgaW50IGZpZWxkczsKCiAgICAvKiBJRSBpbnRyb2R1Y2VkIEhUVFAtb25seSBjb29raWVzIHRvIHByZXZlbnQgWFNTIGF0dGFja3MuIENvb2tpZXMKICAgICAgIG1hcmtlZCB3aXRoIGh0dHBPbmx5IGFmdGVyIHRoZSBkb21haW4gbmFtZSBhcmUgbm90IGFjY2Vzc2libGUKICAgICAgIGZyb20gamF2YXNjcmlwdHMsIGJ1dCBzaW5jZSBjdXJsIGRvZXMgbm90IG9wZXJhdGUgYXQgamF2YXNjcmlwdAogICAgICAgbGV2ZWwsIHdlIGluY2x1ZGUgdGhlbSBhbnl3YXkuIEluIEZpcmVmb3gncyBjb29raWUgZmlsZXMsIHRoZXNlCiAgICAgICBsaW5lcyBhcmUgcHJlY2VkZWQgd2l0aCAjSHR0cE9ubHlfIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgaXMKICAgICAgIGFzIHVzdWFsLCBzbyB3ZSBza2lwIDEwIGNoYXJhY3RlcnMgb2YgdGhlIGxpbmUuLgogICAgKi8KICAgIGlmKHN0cm5jbXAobGluZXB0ciwgIiNIdHRwT25seV8iLCAxMCkgPT0gMCkgewogICAgICBsaW5lcHRyICs9IDEwOwogICAgICBjby0+aHR0cG9ubHkgPSBUUlVFOwogICAgfQoKICAgIGlmKGxpbmVwdHJbMF09PScjJykgewogICAgICAvKiBkb24ndCBldmVuIHRyeSB0aGUgY29tbWVudHMgKi8KICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgLyogc3RyaXAgb2ZmIHRoZSBwb3NzaWJsZSBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzICovCiAgICBwdHI9c3RyY2hyKGxpbmVwdHIsICdccicpOwogICAgaWYocHRyKQogICAgICAqcHRyPTA7IC8qIGNsZWFyIGl0ICovCiAgICBwdHI9c3RyY2hyKGxpbmVwdHIsICdcbicpOwogICAgaWYocHRyKQogICAgICAqcHRyPTA7IC8qIGNsZWFyIGl0ICovCgogICAgZmlyc3RwdHI9c3RydG9rX3IobGluZXB0ciwgIlx0IiwgJnRva19idWYpOyAvKiB0b2tlbml6ZSBpdCBvbiB0aGUgVEFCICovCgogICAgLyogTm93IGxvb3AgdGhyb3VnaCB0aGUgZmllbGRzIGFuZCBpbml0IHRoZSBzdHJ1Y3Qgd2UgYWxyZWFkeSBoYXZlCiAgICAgICBhbGxvY2F0ZWQgKi8KICAgIGZvcihwdHI9Zmlyc3RwdHIsIGZpZWxkcz0wOyBwdHIgJiYgIWJhZGNvb2tpZTsKICAgICAgICBwdHI9c3RydG9rX3IoTlVMTCwgIlx0IiwgJnRva19idWYpLCBmaWVsZHMrKykgewogICAgICBzd2l0Y2goZmllbGRzKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBpZihwdHJbMF09PScuJykgLyogc2tpcCBwcmVjZWRpbmcgZG90cyAqLwogICAgICAgICAgcHRyKys7CiAgICAgICAgY28tPmRvbWFpbiA9IHN0cmR1cChwdHIpOwogICAgICAgIGlmKCFjby0+ZG9tYWluKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIC8qIFRoaXMgZmllbGQgZ290IGl0cyBleHBsYW5hdGlvbiBvbiB0aGUgMjNyZCBvZiBNYXkgMjAwMSBieQogICAgICAgICAgIEFuZHLpcyBHYXJj7WE6CgogICAgICAgICAgIGZsYWc6IEEgVFJVRS9GQUxTRSB2YWx1ZSBpbmRpY2F0aW5nIGlmIGFsbCBtYWNoaW5lcyB3aXRoaW4gYSBnaXZlbgogICAgICAgICAgIGRvbWFpbiBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZS4gVGhpcyB2YWx1ZSBpcyBzZXQgYXV0b21hdGljYWxseSBieQogICAgICAgICAgIHRoZSBicm93c2VyLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHlvdSBzZXQgZm9yIHRoZSBkb21haW4uCgogICAgICAgICAgIEFzIGZhciBhcyBJIGNhbiBzZWUsIGl0IGlzIHNldCB0byB0cnVlIHdoZW4gdGhlIGNvb2tpZSBzYXlzCiAgICAgICAgICAgLmRvbWFpbi5jb20gYW5kIHRvIGZhbHNlIHdoZW4gdGhlIGRvbWFpbiBpcyBjb21wbGV0ZSB3d3cuZG9tYWluLmNvbQogICAgICAgICovCiAgICAgICAgY28tPnRhaWxtYXRjaCA9IEN1cmxfcmF3X2VxdWFsKHB0ciwgIlRSVUUiKT9UUlVFOkZBTFNFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgLyogSXQgdHVybnMgb3V0LCB0aGF0IHNvbWV0aW1lcyB0aGUgZmlsZSBmb3JtYXQgYWxsb3dzIHRoZSBwYXRoCiAgICAgICAgICAgZmllbGQgdG8gcmVtYWluIG5vdCBmaWxsZWQgaW4sIHdlIHRyeSB0byBkZXRlY3QgdGhpcyBhbmQgd29yawogICAgICAgICAgIGFyb3VuZCBpdCEgQW5kculzIEdhcmPtYSBtYWRlIHVzIGF3YXJlIG9mIHRoaXMuLi4gKi8KICAgICAgICBpZihzdHJjbXAoIlRSVUUiLCBwdHIpICYmIHN0cmNtcCgiRkFMU0UiLCBwdHIpKSB7CiAgICAgICAgICAvKiBvbmx5IGlmIHRoZSBwYXRoIGRvZXNuJ3QgbG9vayBsaWtlIGEgYm9vbGVhbiBvcHRpb24hICovCiAgICAgICAgICBjby0+cGF0aCA9IHN0cmR1cChwdHIpOwogICAgICAgICAgaWYoIWNvLT5wYXRoKQogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgICAgaWYoIWNvLT5zcGF0aCkgewogICAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7IC8qIG91dCBvZiBtZW1vcnkgYmFkICovCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvKiB0aGlzIGRvZXNuJ3QgbG9vayBsaWtlIGEgcGF0aCwgbWFrZSBvbmUgdXAhICovCiAgICAgICAgY28tPnBhdGggPSBzdHJkdXAoIi8iKTsKICAgICAgICBpZighY28tPnBhdGgpCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGNvLT5zcGF0aCA9IHN0cmR1cCgiLyIpOwogICAgICAgIGlmKCFjby0+c3BhdGgpCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGZpZWxkcysrOyAvKiBhZGQgYSBmaWVsZCBhbmQgZmFsbCBkb3duIHRvIHNlY3VyZSAqLwogICAgICAgIC8qIEZBTExUSFJPVUdIICovCiAgICAgIGNhc2UgMzoKICAgICAgICBjby0+c2VjdXJlID0gQ3VybF9yYXdfZXF1YWwocHRyLCAiVFJVRSIpP1RSVUU6RkFMU0U7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNDoKICAgICAgICBjby0+ZXhwaXJlcyA9IGN1cmx4X3N0cnRvb2ZmdChwdHIsIE5VTEwsIDEwKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1OgogICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKHB0cik7CiAgICAgICAgaWYoIWNvLT5uYW1lKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA2OgogICAgICAgIGNvLT52YWx1ZSA9IHN0cmR1cChwdHIpOwogICAgICAgIGlmKCFjby0+dmFsdWUpCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZig2ID09IGZpZWxkcykgewogICAgICAvKiB3ZSBnb3QgYSBjb29raWUgd2l0aCBibGFuayBjb250ZW50cywgZml4IGl0ICovCiAgICAgIGNvLT52YWx1ZSA9IHN0cmR1cCgiIik7CiAgICAgIGlmKCFjby0+dmFsdWUpCiAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgZWxzZQogICAgICAgIGZpZWxkcysrOwogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgKDcgIT0gZmllbGRzKSkKICAgICAgLyogd2UgZGlkIG5vdCBmaW5kIHRoZSBzdWZmaWNpZW50IG51bWJlciBvZiBmaWVsZHMgKi8KICAgICAgYmFkY29va2llID0gVFJVRTsKCiAgICBpZihiYWRjb29raWUpIHsKICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICB9CgogIGlmKCFjLT5ydW5uaW5nICYmICAgIC8qIHJlYWQgZnJvbSBhIGZpbGUgKi8KICAgICBjLT5uZXdzZXNzaW9uICYmICAvKiBjbGVhbiBzZXNzaW9uIGNvb2tpZXMgKi8KICAgICAhY28tPmV4cGlyZXMpIHsgICAvKiB0aGlzIGlzIGEgc2Vzc2lvbiBjb29raWUgc2luY2UgaXQgZG9lc24ndCBleHBpcmUhICovCiAgICBmcmVlY29va2llKGNvKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgY28tPmxpdmVjb29raWUgPSBjLT5ydW5uaW5nOwoKICAvKiBub3csIHdlIGhhdmUgcGFyc2VkIHRoZSBpbmNvbWluZyBsaW5lLCB3ZSBtdXN0IG5vdyBjaGVjayBpZiB0aGlzCiAgICAgc3VwZXJjZWVkcyBhbiBhbHJlYWR5IGV4aXN0aW5nIGNvb2tpZSwgd2hpY2ggaXQgbWF5IGlmIHRoZSBwcmV2aW91cyBoYXZlCiAgICAgdGhlIHNhbWUgZG9tYWluIGFuZCBwYXRoIGFzIHRoaXMgKi8KCiAgLyogYXQgZmlyc3QsIHJlbW92ZSBleHBpcmVkIGNvb2tpZXMgKi8KICByZW1vdmVfZXhwaXJlZChjKTsKCiAgY2xpc3QgPSBjLT5jb29raWVzOwogIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgd2hpbGUoY2xpc3QpIHsKICAgIGlmKEN1cmxfcmF3X2VxdWFsKGNsaXN0LT5uYW1lLCBjby0+bmFtZSkpIHsKICAgICAgLyogdGhlIG5hbWVzIGFyZSBpZGVudGljYWwgKi8KCiAgICAgIGlmKGNsaXN0LT5kb21haW4gJiYgY28tPmRvbWFpbikgewogICAgICAgIGlmKEN1cmxfcmF3X2VxdWFsKGNsaXN0LT5kb21haW4sIGNvLT5kb21haW4pKQogICAgICAgICAgLyogVGhlIGRvbWFpbnMgYXJlIGlkZW50aWNhbCAqLwogICAgICAgICAgcmVwbGFjZV9vbGQ9VFJVRTsKICAgICAgfQogICAgICBlbHNlIGlmKCFjbGlzdC0+ZG9tYWluICYmICFjby0+ZG9tYWluKQogICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKCiAgICAgIGlmKHJlcGxhY2Vfb2xkKSB7CiAgICAgICAgLyogdGhlIGRvbWFpbnMgd2VyZSBpZGVudGljYWwgKi8KCiAgICAgICAgaWYoY2xpc3QtPnNwYXRoICYmIGNvLT5zcGF0aCkgewogICAgICAgICAgaWYoQ3VybF9yYXdfZXF1YWwoY2xpc3QtPnNwYXRoLCBjby0+c3BhdGgpKSB7CiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZighY2xpc3QtPnNwYXRoICYmICFjby0+c3BhdGgpCiAgICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CiAgICAgICAgZWxzZQogICAgICAgICAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKCiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkICYmICFjby0+bGl2ZWNvb2tpZSAmJiBjbGlzdC0+bGl2ZWNvb2tpZSkgewogICAgICAgIC8qIEJvdGggY29va2llcyBtYXRjaGVkIGZpbmUsIGV4Y2VwdCB0aGF0IHRoZSBhbHJlYWR5IHByZXNlbnQKICAgICAgICAgICBjb29raWUgaXMgImxpdmUiLCB3aGljaCBtZWFucyBpdCB3YXMgc2V0IGZyb20gYSBoZWFkZXIsIHdoaWxlCiAgICAgICAgICAgdGhlIG5ldyBvbmUgaXNuJ3QgImxpdmUiIGFuZCB0aHVzIG9ubHkgcmVhZCBmcm9tIGEgZmlsZS4gV2UgbGV0CiAgICAgICAgICAgbGl2ZSBjb29raWVzIHN0YXkgYWxpdmUgKi8KCiAgICAgICAgLyogRnJlZSB0aGUgbmV3Y29tZXIgYW5kIGdldCBvdXQgb2YgaGVyZSEgKi8KICAgICAgICBmcmVlY29va2llKGNvKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgfQoKICAgICAgaWYocmVwbGFjZV9vbGQpIHsKICAgICAgICBjby0+bmV4dCA9IGNsaXN0LT5uZXh0OyAvKiBnZXQgdGhlIG5leHQtcG9pbnRlciBmaXJzdCAqLwoKICAgICAgICAvKiB0aGVuIGZyZWUgYWxsIHRoZSBvbGQgcG9pbnRlcnMgKi8KICAgICAgICBmcmVlKGNsaXN0LT5uYW1lKTsKICAgICAgICBmcmVlKGNsaXN0LT52YWx1ZSk7CiAgICAgICAgZnJlZShjbGlzdC0+ZG9tYWluKTsKICAgICAgICBmcmVlKGNsaXN0LT5wYXRoKTsKICAgICAgICBmcmVlKGNsaXN0LT5zcGF0aCk7CiAgICAgICAgZnJlZShjbGlzdC0+ZXhwaXJlc3RyKTsKICAgICAgICBmcmVlKGNsaXN0LT52ZXJzaW9uKTsKICAgICAgICBmcmVlKGNsaXN0LT5tYXhhZ2UpOwoKICAgICAgICAqY2xpc3QgPSAqY287ICAvKiB0aGVuIHN0b3JlIGFsbCB0aGUgbmV3IGRhdGEgKi8KCiAgICAgICAgZnJlZShjbyk7ICAgLyogZnJlZSB0aGUgbmV3bHkgYWxsb2NlZCBtZW1vcnkgKi8KICAgICAgICBjbyA9IGNsaXN0OyAvKiBwb2ludCB0byB0aGUgcHJldmlvdXMgc3RydWN0IGluc3RlYWQgKi8KCiAgICAgICAgLyogV2UgaGF2ZSByZXBsYWNlZCBhIGNvb2tpZSwgbm93IHNraXAgdGhlIHJlc3Qgb2YgdGhlIGxpc3QgYnV0CiAgICAgICAgICAgbWFrZSBzdXJlIHRoZSAnbGFzdGMnIHBvaW50ZXIgaXMgcHJvcGVybHkgc2V0ICovCiAgICAgICAgZG8gewogICAgICAgICAgbGFzdGMgPSBjbGlzdDsKICAgICAgICAgIGNsaXN0ID0gY2xpc3QtPm5leHQ7CiAgICAgICAgfSB3aGlsZShjbGlzdCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGxhc3RjID0gY2xpc3Q7CiAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogIH0KCiAgaWYoYy0+cnVubmluZykKICAgIC8qIE9ubHkgc2hvdyB0aGlzIHdoZW4gTk9UIHJlYWRpbmcgdGhlIGNvb2tpZXMgZnJvbSBhIGZpbGUgKi8KICAgIGluZm9mKGRhdGEsICIlcyBjb29raWUgJXM9XCIlc1wiIGZvciBkb21haW4gJXMsIHBhdGggJXMsICIKICAgICAgICAgICJleHBpcmUgJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAiXG4iLAogICAgICAgICAgcmVwbGFjZV9vbGQ/IlJlcGxhY2VkIjoiQWRkZWQiLCBjby0+bmFtZSwgY28tPnZhbHVlLAogICAgICAgICAgY28tPmRvbWFpbiwgY28tPnBhdGgsIGNvLT5leHBpcmVzKTsKCiAgaWYoIXJlcGxhY2Vfb2xkKSB7CiAgICAvKiB0aGVuIG1ha2UgdGhlIGxhc3QgaXRlbSBwb2ludCBvbiB0aGlzIG5ldyBvbmUgKi8KICAgIGlmKGxhc3RjKQogICAgICBsYXN0Yy0+bmV4dCA9IGNvOwogICAgZWxzZQogICAgICBjLT5jb29raWVzID0gY287CiAgICBjLT5udW1jb29raWVzKys7IC8qIG9uZSBtb3JlIGNvb2tpZSBpbiB0aGUgamFyICovCiAgfQoKICByZXR1cm4gY287Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9pbml0KCkKICoKICogSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHJlYWQgZGF0YSBmcm9tIGEgbG9jYWwgZmlsZS4gVGhpcyBpcyBhbHdheXMKICogY2FsbGVkIGJlZm9yZSBhbnkgY29va2llcyBhcmUgc2V0LiBGaWxlIG1heSBiZSBOVUxMLgogKgogKiBJZiAnbmV3c2Vzc2lvbicgaXMgVFJVRSwgZGlzY2FyZCBhbGwgInNlc3Npb24gY29va2llcyIgb24gcmVhZCBmcm9tIGZpbGUuCiAqCiAqIFJldHVybnMgTlVMTCBvbiBvdXQgb2YgbWVtb3J5LiBJbnZhbGlkIGNvb2tpZXMgYXJlIGlnbm9yZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgQ29va2llSW5mbyAqQ3VybF9jb29raWVfaW5pdChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENvb2tpZUluZm8gKmluYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZXdzZXNzaW9uKQp7CiAgc3RydWN0IENvb2tpZUluZm8gKmM7CiAgRklMRSAqZnAgPSBOVUxMOwogIGJvb2wgZnJvbWZpbGU9VFJVRTsKICBjaGFyICpsaW5lID0gTlVMTDsKCiAgaWYoTlVMTCA9PSBpbmMpIHsKICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBzdHJ1Y3QsIGNyZWF0ZSBvbmUgKi8KICAgIGMgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBDb29raWVJbmZvKSk7CiAgICBpZighYykKICAgICAgcmV0dXJuIE5VTEw7IC8qIGZhaWxlZCB0byBnZXQgbWVtb3J5ICovCiAgICBjLT5maWxlbmFtZSA9IHN0cmR1cChmaWxlP2ZpbGU6Im5vbmUiKTsgLyogY29weSB0aGUgbmFtZSBqdXN0IGluIGNhc2UgKi8KICAgIGlmKCFjLT5maWxlbmFtZSkKICAgICAgZ290byBmYWlsOyAvKiBmYWlsZWQgdG8gZ2V0IG1lbW9yeSAqLwogIH0KICBlbHNlIHsKICAgIC8qIHdlIGdvdCBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZSwgdXNlIHRoYXQgKi8KICAgIGMgPSBpbmM7CiAgfQogIGMtPnJ1bm5pbmcgPSBGQUxTRTsgLyogdGhpcyBpcyBub3QgcnVubmluZywgdGhpcyBpcyBpbml0ICovCgogIGlmKGZpbGUgJiYgc3RyZXF1YWwoZmlsZSwgIi0iKSkgewogICAgZnAgPSBzdGRpbjsKICAgIGZyb21maWxlPUZBTFNFOwogIH0KICBlbHNlIGlmKGZpbGUgJiYgISpmaWxlKSB7CiAgICAvKiBwb2ludHMgdG8gYSAiIiBzdHJpbmcgKi8KICAgIGZwID0gTlVMTDsKICB9CiAgZWxzZQogICAgZnAgPSBmaWxlP2ZvcGVuKGZpbGUsIEZPUEVOX1JFQURURVhUKTpOVUxMOwoKICBjLT5uZXdzZXNzaW9uID0gbmV3c2Vzc2lvbjsgLyogbmV3IHNlc3Npb24/ICovCgogIGlmKGZwKSB7CiAgICBjaGFyICpsaW5lcHRyOwogICAgYm9vbCBoZWFkZXJsaW5lOwoKICAgIGxpbmUgPSBtYWxsb2MoTUFYX0NPT0tJRV9MSU5FKTsKICAgIGlmKCFsaW5lKQogICAgICBnb3RvIGZhaWw7CiAgICB3aGlsZShmZ2V0cyhsaW5lLCBNQVhfQ09PS0lFX0xJTkUsIGZwKSkgewogICAgICBpZihjaGVja3ByZWZpeCgiU2V0LUNvb2tpZToiLCBsaW5lKSkgewogICAgICAgIC8qIFRoaXMgaXMgYSBjb29raWUgbGluZSwgZ2V0IGl0ISAqLwogICAgICAgIGxpbmVwdHI9JmxpbmVbMTFdOwogICAgICAgIGhlYWRlcmxpbmU9VFJVRTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBsaW5lcHRyPWxpbmU7CiAgICAgICAgaGVhZGVybGluZT1GQUxTRTsKICAgICAgfQogICAgICB3aGlsZSgqbGluZXB0ciAmJiBJU0JMQU5LKCpsaW5lcHRyKSkKICAgICAgICBsaW5lcHRyKys7CgogICAgICBDdXJsX2Nvb2tpZV9hZGQoZGF0YSwgYywgaGVhZGVybGluZSwgbGluZXB0ciwgTlVMTCwgTlVMTCk7CiAgICB9CiAgICBmcmVlKGxpbmUpOyAvKiBmcmVlIHRoZSBsaW5lIGJ1ZmZlciAqLwoKICAgIGlmKGZyb21maWxlKQogICAgICBmY2xvc2UoZnApOwogIH0KCiAgYy0+cnVubmluZyA9IFRSVUU7ICAgICAgICAgIC8qIG5vdywgd2UncmUgcnVubmluZyAqLwoKICByZXR1cm4gYzsKCmZhaWw6CiAgZnJlZShsaW5lKTsKICBpZighaW5jKQogICAgLyogT25seSBjbGVhbiB1cCBpZiB3ZSBhbGxvY2F0ZWQgaXQgaGVyZSwgYXMgdGhlIG9yaWdpbmFsIGNvdWxkIHN0aWxsIGJlIGluCiAgICAgKiB1c2UgYnkgYSBzaGFyZSBoYW5kbGUgKi8KICAgIEN1cmxfY29va2llX2NsZWFudXAoYyk7CiAgaWYoZnJvbWZpbGUgJiYgZnApCiAgICBmY2xvc2UoZnApOwogIHJldHVybiBOVUxMOyAvKiBvdXQgb2YgbWVtb3J5ICovCn0KCi8qIHNvcnQgdGhpcyBzbyB0aGF0IHRoZSBsb25nZXN0IHBhdGggZ2V0cyBiZWZvcmUgdGhlIHNob3J0ZXIgcGF0aCAqLwpzdGF0aWMgaW50IGNvb2tpZV9zb3J0KGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKewogIHN0cnVjdCBDb29raWUgKmMxID0gKihzdHJ1Y3QgQ29va2llICoqKXAxOwogIHN0cnVjdCBDb29raWUgKmMyID0gKihzdHJ1Y3QgQ29va2llICoqKXAyOwogIHNpemVfdCBsMSwgbDI7CgogIC8qIDEgLSBjb21wYXJlIGNvb2tpZSBwYXRoIGxlbmd0aHMgKi8KICBsMSA9IGMxLT5wYXRoID8gc3RybGVuKGMxLT5wYXRoKSA6IDA7CiAgbDIgPSBjMi0+cGF0aCA/IHN0cmxlbihjMi0+cGF0aCkgOiAwOwoKICBpZihsMSAhPSBsMikKICAgIHJldHVybiAobDIgPiBsMSkgPyAxIDogLTEgOyAvKiBhdm9pZCBzaXplX3QgPD0+IGludCBjb252ZXJzaW9ucyAqLwoKICAvKiAyIC0gY29tcGFyZSBjb29raWUgZG9tYWluIGxlbmd0aHMgKi8KICBsMSA9IGMxLT5kb21haW4gPyBzdHJsZW4oYzEtPmRvbWFpbikgOiAwOwogIGwyID0gYzItPmRvbWFpbiA/IHN0cmxlbihjMi0+ZG9tYWluKSA6IDA7CgogIGlmKGwxICE9IGwyKQogICAgcmV0dXJuIChsMiA+IGwxKSA/IDEgOiAtMSA7ICAvKiBhdm9pZCBzaXplX3QgPD0+IGludCBjb252ZXJzaW9ucyAqLwoKICAvKiAzIC0gY29tcGFyZSBjb29raWUgbmFtZXMgKi8KICBpZihjMS0+bmFtZSAmJiBjMi0+bmFtZSkKICAgIHJldHVybiBzdHJjbXAoYzEtPm5hbWUsIGMyLT5uYW1lKTsKCiAgLyogc29ycnksIGNhbid0IGJlIG1vcmUgZGV0ZXJtaW5pc3RpYyAqLwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfZ2V0bGlzdCgpCiAqCiAqIEZvciBhIGdpdmVuIGhvc3QgYW5kIHBhdGgsIHJldHVybiBhIGxpbmtlZCBsaXN0IG9mIGNvb2tpZXMgdGhhdCB0aGUKICogY2xpZW50IHNob3VsZCBzZW5kIHRvIHRoZSBzZXJ2ZXIgaWYgdXNlZCBub3cuIFRoZSBzZWN1cmUgYm9vbGVhbiBpbmZvcm1zCiAqIHRoZSBjb29raWUgaWYgYSBzZWN1cmUgY29ubmVjdGlvbiBpcyBhY2hpZXZlZCBvciBub3QuCiAqCiAqIEl0IHNoYWxsIG9ubHkgcmV0dXJuIGNvb2tpZXMgdGhhdCBoYXZlbid0IGV4cGlyZWQuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqQ3VybF9jb29raWVfZ2V0bGlzdChzdHJ1Y3QgQ29va2llSW5mbyAqYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VjdXJlKQp7CiAgc3RydWN0IENvb2tpZSAqbmV3Y287CiAgc3RydWN0IENvb2tpZSAqY287CiAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgc3RydWN0IENvb2tpZSAqbWFpbmNvPU5VTEw7CiAgc2l6ZV90IG1hdGNoZXMgPSAwOwogIGJvb2wgaXNfaXA7CgogIGlmKCFjIHx8ICFjLT5jb29raWVzKQogICAgcmV0dXJuIE5VTEw7IC8qIG5vIGNvb2tpZSBzdHJ1Y3Qgb3Igbm8gY29va2llcyBpbiB0aGUgc3RydWN0ICovCgogIC8qIGF0IGZpcnN0LCByZW1vdmUgZXhwaXJlZCBjb29raWVzICovCiAgcmVtb3ZlX2V4cGlyZWQoYyk7CgogIC8qIGNoZWNrIGlmIGhvc3QgaXMgYW4gSVAodjR8djYpIGFkZHJlc3MgKi8KICBpc19pcCA9IGlzaXAoaG9zdCk7CgogIGNvID0gYy0+Y29va2llczsKCiAgd2hpbGUoY28pIHsKICAgIC8qIG9ubHkgcHJvY2VzcyB0aGlzIGNvb2tpZSBpZiBpdCBpcyBub3QgZXhwaXJlZCBvciBoYWQgbm8gZXhwaXJlCiAgICAgICBkYXRlIEFORCB0aGF0IGlmIHRoZSBjb29raWUgcmVxdWlyZXMgd2UncmUgc2VjdXJlIHdlIG11c3Qgb25seQogICAgICAgY29udGludWUgaWYgd2UgYXJlISAqLwogICAgaWYoKCFjby0+ZXhwaXJlcyB8fCAoY28tPmV4cGlyZXMgPiBub3cpKSAmJgogICAgICAgKGNvLT5zZWN1cmU/c2VjdXJlOlRSVUUpKSB7CgogICAgICAvKiBub3cgY2hlY2sgaWYgdGhlIGRvbWFpbiBpcyBjb3JyZWN0ICovCiAgICAgIGlmKCFjby0+ZG9tYWluIHx8CiAgICAgICAgIChjby0+dGFpbG1hdGNoICYmICFpc19pcCAmJiB0YWlsbWF0Y2goY28tPmRvbWFpbiwgaG9zdCkpIHx8CiAgICAgICAgICgoIWNvLT50YWlsbWF0Y2ggfHwgaXNfaXApICYmIEN1cmxfcmF3X2VxdWFsKGhvc3QsIGNvLT5kb21haW4pKSApIHsKICAgICAgICAvKiB0aGUgcmlnaHQgcGFydCBvZiB0aGUgaG9zdCBtYXRjaGVzIHRoZSBkb21haW4gc3R1ZmYgaW4gdGhlCiAgICAgICAgICAgY29va2llIGRhdGEgKi8KCiAgICAgICAgLyogbm93IGNoZWNrIHRoZSBsZWZ0IHBhcnQgb2YgdGhlIHBhdGggd2l0aCB0aGUgY29va2llcyBwYXRoCiAgICAgICAgICAgcmVxdWlyZW1lbnQgKi8KICAgICAgICBpZighY28tPnNwYXRoIHx8IHBhdGhtYXRjaChjby0+c3BhdGgsIHBhdGgpICkgewoKICAgICAgICAgIC8qIGFuZCBub3csIHdlIGtub3cgdGhpcyBpcyBhIG1hdGNoIGFuZCB3ZSBzaG91bGQgY3JlYXRlIGFuCiAgICAgICAgICAgICBlbnRyeSBmb3IgdGhlIHJldHVybi1saW5rZWQtbGlzdCAqLwoKICAgICAgICAgIG5ld2NvID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CiAgICAgICAgICBpZihuZXdjbykgewogICAgICAgICAgICAvKiBmaXJzdCwgY29weSB0aGUgd2hvbGUgc291cmNlIGNvb2tpZTogKi8KICAgICAgICAgICAgbWVtY3B5KG5ld2NvLCBjbywgc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKCiAgICAgICAgICAgIC8qIHRoZW4gbW9kaWZ5IG91ciBuZXh0ICovCiAgICAgICAgICAgIG5ld2NvLT5uZXh0ID0gbWFpbmNvOwoKICAgICAgICAgICAgLyogcG9pbnQgdGhlIG1haW4gdG8gdXMgKi8KICAgICAgICAgICAgbWFpbmNvID0gbmV3Y287CgogICAgICAgICAgICBtYXRjaGVzKys7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZmFpbDoKICAgICAgICAgICAgLyogZmFpbHVyZSwgY2xlYXIgdXAgdGhlIGFsbG9jYXRlZCBjaGFpbiBhbmQgcmV0dXJuIE5VTEwgKi8KICAgICAgICAgICAgd2hpbGUobWFpbmNvKSB7CiAgICAgICAgICAgICAgY28gPSBtYWluY28tPm5leHQ7CiAgICAgICAgICAgICAgZnJlZShtYWluY28pOwogICAgICAgICAgICAgIG1haW5jbyA9IGNvOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvID0gY28tPm5leHQ7CiAgfQoKICBpZihtYXRjaGVzKSB7CiAgICAvKiBOb3cgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpZiB0aGVyZSBpcyBhIG5hbWUgYXBwZWFyaW5nIG1vcmUgdGhhbgogICAgICAgb25jZSwgdGhlIGxvbmdlc3Qgc3BlY2lmaWVkIHBhdGggdmVyc2lvbiBjb21lcyBmaXJzdC4gVG8gbWFrZSB0aGlzCiAgICAgICB0aGUgc3dpZnRlc3Qgd2F5LCB3ZSBqdXN0IHNvcnQgdGhlbSBhbGwgYmFzZWQgb24gcGF0aCBsZW5ndGguICovCiAgICBzdHJ1Y3QgQ29va2llICoqYXJyYXk7CiAgICBzaXplX3QgaTsKCiAgICAvKiBhbGxvYyBhbiBhcnJheSBhbmQgc3RvcmUgYWxsIGNvb2tpZSBwb2ludGVycyAqLwogICAgYXJyYXkgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBDb29raWUgKikgKiBtYXRjaGVzKTsKICAgIGlmKCFhcnJheSkKICAgICAgZ290byBmYWlsOwoKICAgIGNvID0gbWFpbmNvOwoKICAgIGZvcihpPTA7IGNvOyBjbyA9IGNvLT5uZXh0KQogICAgICBhcnJheVtpKytdID0gY287CgogICAgLyogbm93IHNvcnQgdGhlIGNvb2tpZSBwb2ludGVycyBpbiBwYXRoIGxlbmd0aCBvcmRlciAqLwogICAgcXNvcnQoYXJyYXksIG1hdGNoZXMsIHNpemVvZihzdHJ1Y3QgQ29va2llICopLCBjb29raWVfc29ydCk7CgogICAgLyogcmVtYWtlIHRoZSBsaW5rZWQgbGlzdCBvcmRlciBhY2NvcmRpbmcgdG8gdGhlIG5ldyBvcmRlciAqLwoKICAgIG1haW5jbyA9IGFycmF5WzBdOyAvKiBzdGFydCBoZXJlICovCiAgICBmb3IoaT0wOyBpPG1hdGNoZXMtMTsgaSsrKQogICAgICBhcnJheVtpXS0+bmV4dCA9IGFycmF5W2krMV07CiAgICBhcnJheVttYXRjaGVzLTFdLT5uZXh0ID0gTlVMTDsgLyogdGVybWluYXRlIHRoZSBsaXN0ICovCgogICAgZnJlZShhcnJheSk7IC8qIHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGRhdGEgYWdhaW4gKi8KICB9CgogIHJldHVybiBtYWluY287IC8qIHJldHVybiB0aGUgbmV3IGxpc3QgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFyYWxsKCkKICoKICogQ2xlYXIgYWxsIGV4aXN0aW5nIGNvb2tpZXMgYW5kIHJlc2V0IHRoZSBjb3VudGVyLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhcmFsbChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llcykKewogIGlmKGNvb2tpZXMpIHsKICAgIEN1cmxfY29va2llX2ZyZWVsaXN0KGNvb2tpZXMtPmNvb2tpZXMsIFRSVUUpOwogICAgY29va2llcy0+Y29va2llcyA9IE5VTEw7CiAgICBjb29raWVzLT5udW1jb29raWVzID0gMDsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9mcmVlbGlzdCgpCiAqCiAqIEZyZWUgYSBsaXN0IG9mIGNvb2tpZXMgcHJldmlvdXNseSByZXR1cm5lZCBieSBDdXJsX2Nvb2tpZV9nZXRsaXN0KCk7CiAqCiAqIFRoZSAnY29va2llc3RvbycgYXJndW1lbnQgdGVsbHMgdGhpcyBmdW5jdGlvbiB3aGV0aGVyIHRvIGp1c3QgZnJlZSB0aGUKICogbGlzdCBvciBhY3R1YWxseSBhbHNvIGZyZWUgYWxsIGNvb2tpZXMgd2l0aGluIHRoZSBsaXN0IGFzIHdlbGwuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBDdXJsX2Nvb2tpZV9mcmVlbGlzdChzdHJ1Y3QgQ29va2llICpjbywgYm9vbCBjb29raWVzdG9vKQp7CiAgc3RydWN0IENvb2tpZSAqbmV4dDsKICB3aGlsZShjbykgewogICAgbmV4dCA9IGNvLT5uZXh0OwogICAgaWYoY29va2llc3RvbykKICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICBlbHNlCiAgICAgIGZyZWUoY28pOyAvKiB3ZSBvbmx5IGZyZWUgdGhlIHN0cnVjdCBzaW5jZSB0aGUgIm1lbWJlcnMiIGFyZSBhbGwganVzdAogICAgICAgICAgICAgICAgICAgcG9pbnRlZCBvdXQgaW4gdGhlIG1haW4gY29va2llIGxpc3QhICovCiAgICBjbyA9IG5leHQ7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFyc2VzcygpCiAqCiAqIEZyZWUgYWxsIHNlc3Npb24gY29va2llcyBpbiB0aGUgY29va2llcyBsaXN0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhcnNlc3Moc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZXMpCnsKICBzdHJ1Y3QgQ29va2llICpmaXJzdCwgKmN1cnIsICpuZXh0LCAqcHJldiA9IE5VTEw7CgogIGlmKCFjb29raWVzIHx8ICFjb29raWVzLT5jb29raWVzKQogICAgcmV0dXJuOwoKICBmaXJzdCA9IGN1cnIgPSBwcmV2ID0gY29va2llcy0+Y29va2llczsKCiAgZm9yKDsgY3VycjsgY3VyciA9IG5leHQpIHsKICAgIG5leHQgPSBjdXJyLT5uZXh0OwogICAgaWYoIWN1cnItPmV4cGlyZXMpIHsKICAgICAgaWYoZmlyc3QgPT0gY3VycikKICAgICAgICBmaXJzdCA9IG5leHQ7CgogICAgICBpZihwcmV2ID09IGN1cnIpCiAgICAgICAgcHJldiA9IG5leHQ7CiAgICAgIGVsc2UKICAgICAgICBwcmV2LT5uZXh0ID0gbmV4dDsKCiAgICAgIGZyZWVjb29raWUoY3Vycik7CiAgICAgIGNvb2tpZXMtPm51bWNvb2tpZXMtLTsKICAgIH0KICAgIGVsc2UKICAgICAgcHJldiA9IGN1cnI7CiAgfQoKICBjb29raWVzLT5jb29raWVzID0gZmlyc3Q7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfY2xlYW51cCgpCiAqCiAqIEZyZWUgYSAiY29va2llIG9iamVjdCIgcHJldmlvdXMgY3JlYXRlZCB3aXRoIEN1cmxfY29va2llX2luaXQoKS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQ3VybF9jb29raWVfY2xlYW51cChzdHJ1Y3QgQ29va2llSW5mbyAqYykKewogIGlmKGMpIHsKICAgIGZyZWUoYy0+ZmlsZW5hbWUpOwogICAgQ3VybF9jb29raWVfZnJlZWxpc3QoYy0+Y29va2llcywgVFJVRSk7CiAgICBmcmVlKGMpOyAvKiBmcmVlIHRoZSBiYXNlIHN0cnVjdCBhcyB3ZWxsICovCiAgfQp9CgovKiBnZXRfbmV0c2NhcGVfZm9ybWF0KCkKICoKICogRm9ybWF0cyBhIHN0cmluZyBmb3IgTmV0c2NhcGUgb3V0cHV0IGZpbGUsIHcvbyBhIG5ld2xpbmUgYXQgdGhlIGVuZC4KICoKICogRnVuY3Rpb24gcmV0dXJucyBhIGNoYXIgKiB0byBhIGZvcm1hdHRlZCBsaW5lLiBIYXMgdG8gYmUgZnJlZSgpZAoqLwpzdGF0aWMgY2hhciAqZ2V0X25ldHNjYXBlX2Zvcm1hdChjb25zdCBzdHJ1Y3QgQ29va2llICpjbykKewogIHJldHVybiBhcHJpbnRmKAogICAgIiVzIiAgICAgLyogaHR0cG9ubHkgcHJlYW1ibGUgKi8KICAgICIlcyVzXHQiIC8qIGRvbWFpbiAqLwogICAgIiVzXHQiICAgLyogdGFpbG1hdGNoICovCiAgICAiJXNcdCIgICAvKiBwYXRoICovCiAgICAiJXNcdCIgICAvKiBzZWN1cmUgKi8KICAgICIlIiBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJcdCIgICAvKiBleHBpcmVzICovCiAgICAiJXNcdCIgICAvKiBuYW1lICovCiAgICAiJXMiLCAgICAvKiB2YWx1ZSAqLwogICAgY28tPmh0dHBvbmx5PyIjSHR0cE9ubHlfIjoiIiwKICAgIC8qIE1ha2Ugc3VyZSBhbGwgZG9tYWlucyBhcmUgcHJlZml4ZWQgd2l0aCBhIGRvdCBpZiB0aGV5IGFsbG93CiAgICAgICB0YWlsbWF0Y2hpbmcuIFRoaXMgaXMgTW96aWxsYS1zdHlsZS4gKi8KICAgIChjby0+dGFpbG1hdGNoICYmIGNvLT5kb21haW4gJiYgY28tPmRvbWFpblswXSAhPSAnLicpPyAiLiI6IiIsCiAgICBjby0+ZG9tYWluP2NvLT5kb21haW46InVua25vd24iLAogICAgY28tPnRhaWxtYXRjaD8iVFJVRSI6IkZBTFNFIiwKICAgIGNvLT5wYXRoP2NvLT5wYXRoOiIvIiwKICAgIGNvLT5zZWN1cmU/IlRSVUUiOiJGQUxTRSIsCiAgICBjby0+ZXhwaXJlcywKICAgIGNvLT5uYW1lLAogICAgY28tPnZhbHVlP2NvLT52YWx1ZToiIik7Cn0KCi8qCiAqIGNvb2tpZV9vdXRwdXQoKQogKgogKiBXcml0ZXMgYWxsIGludGVybmFsbHkga25vd24gY29va2llcyB0byB0aGUgc3BlY2lmaWVkIGZpbGUuIFNwZWNpZnkKICogIi0iIGFzIGZpbGUgbmFtZSB0byB3cml0ZSB0byBzdGRvdXQuCiAqCiAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIG9uIHdyaXRlIGZhaWx1cmUuCiAqLwpzdGF0aWMgaW50IGNvb2tpZV9vdXRwdXQoc3RydWN0IENvb2tpZUluZm8gKmMsIGNvbnN0IGNoYXIgKmR1bXBoZXJlKQp7CiAgc3RydWN0IENvb2tpZSAqY287CiAgRklMRSAqb3V0OwogIGJvb2wgdXNlX3N0ZG91dD1GQUxTRTsKCiAgaWYoKE5VTEwgPT0gYykgfHwgKDAgPT0gYy0+bnVtY29va2llcykpCiAgICAvKiBJZiB0aGVyZSBhcmUgbm8ga25vd24gY29va2llcywgd2UgZG9uJ3Qgd3JpdGUgb3IgZXZlbiBjcmVhdGUgYW55CiAgICAgICBkZXN0aW5hdGlvbiBmaWxlICovCiAgICByZXR1cm4gMDsKCiAgLyogYXQgZmlyc3QsIHJlbW92ZSBleHBpcmVkIGNvb2tpZXMgKi8KICByZW1vdmVfZXhwaXJlZChjKTsKCiAgaWYoc3RyZXF1YWwoIi0iLCBkdW1waGVyZSkpIHsKICAgIC8qIHVzZSBzdGRvdXQgKi8KICAgIG91dCA9IHN0ZG91dDsKICAgIHVzZV9zdGRvdXQ9VFJVRTsKICB9CiAgZWxzZSB7CiAgICBvdXQgPSBmb3BlbihkdW1waGVyZSwgRk9QRU5fV1JJVEVURVhUKTsKICAgIGlmKCFvdXQpCiAgICAgIHJldHVybiAxOyAvKiBmYWlsdXJlICovCiAgfQoKICBpZihjKSB7CiAgICBjaGFyICpmb3JtYXRfcHRyOwoKICAgIGZwdXRzKCIjIE5ldHNjYXBlIEhUVFAgQ29va2llIEZpbGVcbiIKICAgICAgICAgICIjIGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9odHRwLWNvb2tpZXMuaHRtbFxuIgogICAgICAgICAgIiMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgbGliY3VybCEgRWRpdCBhdCB5b3VyIG93biByaXNrLlxuXG4iLAogICAgICAgICAgb3V0KTsKICAgIGNvID0gYy0+Y29va2llczsKCiAgICB3aGlsZShjbykgewogICAgICBpZighY28tPmRvbWFpbikKICAgICAgICBjb250aW51ZTsKICAgICAgZm9ybWF0X3B0ciA9IGdldF9uZXRzY2FwZV9mb3JtYXQoY28pOwogICAgICBpZihmb3JtYXRfcHRyID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKG91dCwgIiNcbiMgRmF0YWwgbGliY3VybCBlcnJvclxuIik7CiAgICAgICAgaWYoIXVzZV9zdGRvdXQpCiAgICAgICAgICBmY2xvc2Uob3V0KTsKICAgICAgICByZXR1cm4gMTsKICAgICAgfQogICAgICBmcHJpbnRmKG91dCwgIiVzXG4iLCBmb3JtYXRfcHRyKTsKICAgICAgZnJlZShmb3JtYXRfcHRyKTsKICAgICAgY289Y28tPm5leHQ7CiAgICB9CiAgfQoKICBpZighdXNlX3N0ZG91dCkKICAgIGZjbG9zZShvdXQpOwoKICByZXR1cm4gMDsKfQoKc3RydWN0IGN1cmxfc2xpc3QgKkN1cmxfY29va2llX2xpc3Qoc3RydWN0IFNlc3Npb25IYW5kbGUgKmRhdGEpCnsKICBzdHJ1Y3QgY3VybF9zbGlzdCAqbGlzdCA9IE5VTEw7CiAgc3RydWN0IGN1cmxfc2xpc3QgKmJlZzsKICBzdHJ1Y3QgQ29va2llICpjOwogIGNoYXIgKmxpbmU7CgogIGlmKChkYXRhLT5jb29raWVzID09IE5VTEwpIHx8CiAgICAgIChkYXRhLT5jb29raWVzLT5udW1jb29raWVzID09IDApKQogICAgcmV0dXJuIE5VTEw7CgogIGMgPSBkYXRhLT5jb29raWVzLT5jb29raWVzOwoKICB3aGlsZShjKSB7CiAgICBpZighYy0+ZG9tYWluKQogICAgICBjb250aW51ZTsKICAgIGxpbmUgPSBnZXRfbmV0c2NhcGVfZm9ybWF0KGMpOwogICAgaWYoIWxpbmUpIHsKICAgICAgY3VybF9zbGlzdF9mcmVlX2FsbChsaXN0KTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBiZWcgPSBDdXJsX3NsaXN0X2FwcGVuZF9ub2R1cChsaXN0LCBsaW5lKTsKICAgIGlmKCFiZWcpIHsKICAgICAgZnJlZShsaW5lKTsKICAgICAgY3VybF9zbGlzdF9mcmVlX2FsbChsaXN0KTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBsaXN0ID0gYmVnOwogICAgYyA9IGMtPm5leHQ7CiAgfQoKICByZXR1cm4gbGlzdDsKfQoKdm9pZCBDdXJsX2ZsdXNoX2Nvb2tpZXMoc3RydWN0IFNlc3Npb25IYW5kbGUgKmRhdGEsIGludCBjbGVhbnVwKQp7CiAgaWYoZGF0YS0+c2V0LnN0cltTVFJJTkdfQ09PS0lFSkFSXSkgewogICAgaWYoZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QpIHsKICAgICAgLyogSWYgdGhlcmUgaXMgYSBsaXN0IG9mIGNvb2tpZSBmaWxlcyB0byByZWFkLCBkbyBpdCBmaXJzdCBzbyB0aGF0CiAgICAgICAgIHdlIGhhdmUgYWxsIHRoZSB0b2xkIGZpbGVzIHJlYWQgYmVmb3JlIHdlIHdyaXRlIHRoZSBuZXcgamFyLgogICAgICAgICBDdXJsX2Nvb2tpZV9sb2FkZmlsZXMoKSBMT0NLUyBhbmQgVU5MT0NLUyB0aGUgc2hhcmUgaXRzZWxmISAqLwogICAgICBDdXJsX2Nvb2tpZV9sb2FkZmlsZXMoZGF0YSk7CiAgICB9CgogICAgQ3VybF9zaGFyZV9sb2NrKGRhdGEsIENVUkxfTE9DS19EQVRBX0NPT0tJRSwgQ1VSTF9MT0NLX0FDQ0VTU19TSU5HTEUpOwoKICAgIC8qIGlmIHdlIGhhdmUgYSBkZXN0aW5hdGlvbiBmaWxlIGZvciBhbGwgdGhlIGNvb2tpZXMgdG8gZ2V0IGR1bXBlZCB0byAqLwogICAgaWYoY29va2llX291dHB1dChkYXRhLT5jb29raWVzLCBkYXRhLT5zZXQuc3RyW1NUUklOR19DT09LSUVKQVJdKSkKICAgICAgaW5mb2YoZGF0YSwgIldBUk5JTkc6IGZhaWxlZCB0byBzYXZlIGNvb2tpZXMgaW4gJXNcbiIsCiAgICAgICAgICAgIGRhdGEtPnNldC5zdHJbU1RSSU5HX0NPT0tJRUpBUl0pOwogIH0KICBlbHNlIHsKICAgIGlmKGNsZWFudXAgJiYgZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QpIHsKICAgICAgLyogc2luY2Ugbm90aGluZyBpcyB3cml0dGVuLCB3ZSBjYW4ganVzdCBmcmVlIHRoZSBsaXN0IG9mIGNvb2tpZSBmaWxlCiAgICAgICAgIG5hbWVzICovCiAgICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwoZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QpOyAvKiBjbGVhbiB1cCBsaXN0ICovCiAgICAgIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0ID0gTlVMTDsKICAgIH0KICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKICB9CgogIGlmKGNsZWFudXAgJiYgKCFkYXRhLT5zaGFyZSB8fCAoZGF0YS0+Y29va2llcyAhPSBkYXRhLT5zaGFyZS0+Y29va2llcykpKSB7CiAgICBDdXJsX2Nvb2tpZV9jbGVhbnVwKGRhdGEtPmNvb2tpZXMpOwogIH0KICBDdXJsX3NoYXJlX3VubG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUpOwp9CgojZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0hUVFAgfHwgQ1VSTF9ESVNBQkxFX0NPT0tJRVMgKi8K