LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfCiAqICBQcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAogKgogKiBDb3B5cmlnaHQgKEMpIDE5OTggLSAyMDE1LCBEYW5pZWwgU3RlbmJlcmcsIDxkYW5pZWxAaGF4eC5zZT4sIGV0IGFsLgogKgogKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAogKiB5b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYXMgcGFydCBvZiB0aGlzIGRpc3RyaWJ1dGlvbi4gVGhlIHRlcm1zCiAqIGFyZSBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY29weXJpZ2h0Lmh0bWwuCiAqCiAqIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKgoKClJFQ0VJVklORyBDT09LSUUgSU5GT1JNQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RydWN0IENvb2tpZUluZm8gKkN1cmxfY29va2llX2luaXQoc3RydWN0IFNlc3Npb25IYW5kbGUgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IENvb2tpZUluZm8gKmluYywgYm9vbCBuZXdzZXNzaW9uKTsKCiAgICAgICAgSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHN0b3JlIGRhdGEgaW4gYSBsb2NhbCBmaWxlLiBUaGlzIGlzIGFsd2F5cwogICAgICAgIGNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2FkZChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29va2llSW5mbyAqYywgYm9vbCBodHRwaGVhZGVyLCBjaGFyICpsaW5lcHRyLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRvbWFpbiwgY29uc3QgY2hhciAqcGF0aCk7CgogICAgICAgIFRoZSAnbGluZXB0cicgcGFyYW1ldGVyIGlzIGEgZnVsbCAiU2V0LWNvb2tpZToiIGxpbmUgYXMKICAgICAgICByZWNlaXZlZCBmcm9tIGEgc2VydmVyLgoKICAgICAgICBUaGUgZnVuY3Rpb24gbmVlZCB0byByZXBsYWNlIHByZXZpb3VzbHkgc3RvcmVkIGxpbmVzIHRoYXQgdGhpcyBuZXcKICAgICAgICBsaW5lIHN1cGVyY2VlZHMuCgogICAgICAgIEl0IG1heSByZW1vdmUgbGluZXMgdGhhdCBhcmUgZXhwaXJlZC4KCiAgICAgICAgSXQgc2hvdWxkIHJldHVybiBhbiBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MvZXJyb3IuCgoKU0VORElORyBDT09LSUUgSU5GT1JNQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0cnVjdCBDb29raWVzICpDdXJsX2Nvb2tpZV9nZXRsaXN0KHN0cnVjdCBDb29raWVJbmZvICpjb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3QsIGNoYXIgKnBhdGgsIGJvb2wgc2VjdXJlKTsKCiAgICAgICAgRm9yIGEgZ2l2ZW4gaG9zdCBhbmQgcGF0aCwgcmV0dXJuIGEgbGlua2VkIGxpc3Qgb2YgY29va2llcyB0aGF0CiAgICAgICAgdGhlIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlCiAgICAgICAgYm9vbGVhbiBpbmZvcm1zIHRoZSBjb29raWUgaWYgYSBzZWN1cmUgY29ubmVjdGlvbiBpcyBhY2hpZXZlZCBvcgogICAgICAgIG5vdC4KCiAgICAgICAgSXQgc2hhbGwgb25seSByZXR1cm4gY29va2llcyB0aGF0IGhhdmVuJ3QgZXhwaXJlZC4KCgpFeGFtcGxlIHNldCBvZiBjb29raWVzOgoKICAgIFNldC1jb29raWU6IFBST0RVQ1RJTkZPPXdlYnhwcmVzczsgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBQRVJTT05BTElaRT1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vZnRndzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRIaXN0PW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRmlkT3JkZXI9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBEaXNQZW5kPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRmlkRGlzPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZToKICAgIFNlc3Npb25fS2V5QDY3OTFhOWUwLTkwMWEtMTFkMC1hMWM4LTliMDEyYzg4YWE3Nz1ub25lO2V4cGlyZXM9TW9uZGF5LAogICAgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKKioqKi8KCgojaW5jbHVkZSAiY3VybF9zZXR1cC5oIgoKI2lmICFkZWZpbmVkKENVUkxfRElTQUJMRV9IVFRQKSAmJiAhZGVmaW5lZChDVVJMX0RJU0FCTEVfQ09PS0lFUykKCiNpbmNsdWRlICJjdXJsX3ByaW50Zi5oIgojaW5jbHVkZSAidXJsZGF0YS5oIgojaW5jbHVkZSAiY29va2llLmgiCiNpbmNsdWRlICJzdHJlcXVhbC5oIgojaW5jbHVkZSAic3RydG9rLmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAic2xpc3QuaCIKI2luY2x1ZGUgInNoYXJlLmgiCiNpbmNsdWRlICJzdHJ0b29mZnQuaCIKI2luY2x1ZGUgInJhd3N0ci5oIgojaW5jbHVkZSAiY3VybF9tZW1yY2hyLmgiCiNpbmNsdWRlICJpbmV0X3B0b24uaCIKCi8qIFRoZSBsYXN0ICNpbmNsdWRlIGZpbGVzIHNob3VsZCBiZTogKi8KI2luY2x1ZGUgImN1cmxfbWVtb3J5LmgiCiNpbmNsdWRlICJtZW1kZWJ1Zy5oIgoKc3RhdGljIHZvaWQgZnJlZWNvb2tpZShzdHJ1Y3QgQ29va2llICpjbykKewogIGZyZWUoY28tPmV4cGlyZXN0cik7CiAgZnJlZShjby0+ZG9tYWluKTsKICBmcmVlKGNvLT5wYXRoKTsKICBmcmVlKGNvLT5zcGF0aCk7CiAgZnJlZShjby0+bmFtZSk7CiAgZnJlZShjby0+dmFsdWUpOwogIGZyZWUoY28tPm1heGFnZSk7CiAgZnJlZShjby0+dmVyc2lvbik7CiAgZnJlZShjbyk7Cn0KCnN0YXRpYyBib29sIHRhaWxtYXRjaChjb25zdCBjaGFyICpjb29rZV9kb21haW4sIGNvbnN0IGNoYXIgKmhvc3RuYW1lKQp7CiAgc2l6ZV90IGNvb2tpZV9kb21haW5fbGVuID0gc3RybGVuKGNvb2tlX2RvbWFpbik7CiAgc2l6ZV90IGhvc3RuYW1lX2xlbiA9IHN0cmxlbihob3N0bmFtZSk7CgogIGlmKGhvc3RuYW1lX2xlbiA8IGNvb2tpZV9kb21haW5fbGVuKQogICAgcmV0dXJuIEZBTFNFOwoKICBpZighQ3VybF9yYXdfZXF1YWwoY29va2VfZG9tYWluLCBob3N0bmFtZStob3N0bmFtZV9sZW4tY29va2llX2RvbWFpbl9sZW4pKQogICAgcmV0dXJuIEZBTFNFOwoKICAvKiBBIGxlYWQgY2hhciBvZiBjb29raWVfZG9tYWluIGlzIG5vdCAnLicuCiAgICAgUkZDNjI2NSA0LjEuMi4zLiBUaGUgRG9tYWluIEF0dHJpYnV0ZSBzYXlzOgogICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZSB2YWx1ZSBvZiB0aGUgRG9tYWluIGF0dHJpYnV0ZSBpcwogICAgICAgImV4YW1wbGUuY29tIiwgdGhlIHVzZXIgYWdlbnQgd2lsbCBpbmNsdWRlIHRoZSBjb29raWUgaW4gdGhlIENvb2tpZQogICAgICAgaGVhZGVyIHdoZW4gbWFraW5nIEhUVFAgcmVxdWVzdHMgdG8gZXhhbXBsZS5jb20sIHd3dy5leGFtcGxlLmNvbSwgYW5kCiAgICAgICB3d3cuY29ycC5leGFtcGxlLmNvbS4KICAgKi8KICBpZihob3N0bmFtZV9sZW4gPT0gY29va2llX2RvbWFpbl9sZW4pCiAgICByZXR1cm4gVFJVRTsKICBpZignLicgPT0gKihob3N0bmFtZSArIGhvc3RuYW1lX2xlbiAtIGNvb2tpZV9kb21haW5fbGVuIC0gMSkpCiAgICByZXR1cm4gVFJVRTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qCiAqIG1hdGNoaW5nIGNvb2tpZSBwYXRoIGFuZCB1cmwgcGF0aAogKiBSRkM2MjY1IDUuMS40IFBhdGhzIGFuZCBQYXRoLU1hdGNoCiAqLwpzdGF0aWMgYm9vbCBwYXRobWF0Y2goY29uc3QgY2hhciogY29va2llX3BhdGgsIGNvbnN0IGNoYXIqIHJlcXVlc3RfdXJpKQp7CiAgc2l6ZV90IGNvb2tpZV9wYXRoX2xlbjsKICBzaXplX3QgdXJpX3BhdGhfbGVuOwogIGNoYXIqIHVyaV9wYXRoID0gTlVMTDsKICBjaGFyKiBwb3M7CiAgYm9vbCByZXQgPSBGQUxTRTsKCiAgLyogY29va2llX3BhdGggbXVzdCBub3QgaGF2ZSBsYXN0ICcvJyBzZXBhcmF0b3IuIGV4OiAvc2FtcGxlICovCiAgY29va2llX3BhdGhfbGVuID0gc3RybGVuKGNvb2tpZV9wYXRoKTsKICBpZigxID09IGNvb2tpZV9wYXRoX2xlbikgewogICAgLyogY29va2llX3BhdGggbXVzdCBiZSAnLycgKi8KICAgIHJldHVybiBUUlVFOwogIH0KCiAgdXJpX3BhdGggPSBzdHJkdXAocmVxdWVzdF91cmkpOwogIGlmKCF1cmlfcGF0aCkKICAgIHJldHVybiBGQUxTRTsKICBwb3MgPSBzdHJjaHIodXJpX3BhdGgsICc/Jyk7CiAgaWYocG9zKQogICAgKnBvcyA9IDB4MDsKCiAgLyogIy1mcmFnbWVudHMgYXJlIGFscmVhZHkgY3V0IG9mZiEgKi8KICBpZigwID09IHN0cmxlbih1cmlfcGF0aCkgfHwgdXJpX3BhdGhbMF0gIT0gJy8nKSB7CiAgICBmcmVlKHVyaV9wYXRoKTsKICAgIHVyaV9wYXRoID0gc3RyZHVwKCIvIik7CiAgICBpZighdXJpX3BhdGgpCiAgICAgIHJldHVybiBGQUxTRTsKICB9CgogIC8qIGhlcmUsIFJGQzYyNjUgNS4xLjQgc2F5cwogICAgIDQuIE91dHB1dCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdXJpLXBhdGggZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyIHVwCiAgICAgICAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgcmlnaHQtbW9zdCAleDJGICgiLyIpLgogICAgIGJ1dCBVUkwgcGF0aCAvaG9nZT9mdWdhPXh4eCBtZWFucyAvaG9nZS9pbmRleC5jZ2k/ZnVnYT14eHggaW4gc29tZSBzaXRlCiAgICAgd2l0aG91dCByZWRpcmVjdC4KICAgICBJZ25vcmUgdGhpcyBhbGdvcml0aG0gYmVjYXVzZSAvaG9nZSBpcyB1cmkgcGF0aCBmb3IgdGhpcyBjYXNlCiAgICAgKHVyaSBwYXRoIGlzIG5vdCAvKS4KICAgKi8KCiAgdXJpX3BhdGhfbGVuID0gc3RybGVuKHVyaV9wYXRoKTsKCiAgaWYodXJpX3BhdGhfbGVuIDwgY29va2llX3BhdGhfbGVuKSB7CiAgICByZXQgPSBGQUxTRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICAvKiBub3QgdXNpbmcgY2hlY2twcmVmaXgoKSBiZWNhdXNlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlLXNlbnNpdGl2ZSAqLwogIGlmKHN0cm5jbXAoY29va2llX3BhdGgsIHVyaV9wYXRoLCBjb29raWVfcGF0aF9sZW4pKSB7CiAgICByZXQgPSBGQUxTRTsKICAgIGdvdG8gcGF0aG1hdGNoZWQ7CiAgfQoKICAvKiBUaGUgY29va2llLXBhdGggYW5kIHRoZSB1cmktcGF0aCBhcmUgaWRlbnRpY2FsLiAqLwogIGlmKGNvb2tpZV9wYXRoX2xlbiA9PSB1cmlfcGF0aF9sZW4pIHsKICAgIHJldCA9IFRSVUU7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgLyogaGVyZSwgY29va2llX3BhdGhfbGVuIDwgdXJsX3BhdGhfbGVuICovCiAgaWYodXJpX3BhdGhbY29va2llX3BhdGhfbGVuXSA9PSAnLycpIHsKICAgIHJldCA9IFRSVUU7CiAgICBnb3RvIHBhdGhtYXRjaGVkOwogIH0KCiAgcmV0ID0gRkFMU0U7CgpwYXRobWF0Y2hlZDoKICBmcmVlKHVyaV9wYXRoKTsKICByZXR1cm4gcmV0Owp9CgovKgogKiBjb29raWUgcGF0aCBzYW5pdGl6ZQogKi8Kc3RhdGljIGNoYXIgKnNhbml0aXplX2Nvb2tpZV9wYXRoKGNvbnN0IGNoYXIgKmNvb2tpZV9wYXRoKQp7CiAgc2l6ZV90IGxlbjsKICBjaGFyICpuZXdfcGF0aCA9IHN0cmR1cChjb29raWVfcGF0aCk7CiAgaWYoIW5ld19wYXRoKQogICAgcmV0dXJuIE5VTEw7CgogIC8qIHNvbWUgc3R1cGlkIHNpdGUgc2VuZHMgcGF0aCBhdHRyaWJ1dGUgd2l0aCAnIicuICovCiAgbGVuID0gc3RybGVuKG5ld19wYXRoKTsKICBpZihuZXdfcGF0aFswXSA9PSAnXCInKSB7CiAgICBtZW1tb3ZlKCh2b2lkICopbmV3X3BhdGgsIChjb25zdCB2b2lkICopKG5ld19wYXRoICsgMSksIGxlbik7CiAgICBsZW4tLTsKICB9CiAgaWYobGVuICYmIChuZXdfcGF0aFtsZW4gLSAxXSA9PSAnXCInKSkgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgICBsZW4tLTsKICB9CgogIC8qIFJGQzYyNjUgNS4yLjQgVGhlIFBhdGggQXR0cmlidXRlICovCiAgaWYobmV3X3BhdGhbMF0gIT0gJy8nKSB7CiAgICAvKiBMZXQgY29va2llLXBhdGggYmUgdGhlIGRlZmF1bHQtcGF0aC4gKi8KICAgIGZyZWUobmV3X3BhdGgpOwogICAgbmV3X3BhdGggPSBzdHJkdXAoIi8iKTsKICAgIHJldHVybiBuZXdfcGF0aDsKICB9CgogIC8qIGNvbnZlcnQgL2hvZ2UvIHRvIC9ob2dlICovCiAgaWYobGVuICYmIG5ld19wYXRoW2xlbiAtIDFdID09ICcvJykgewogICAgbmV3X3BhdGhbbGVuIC0gMV0gPSAweDA7CiAgfQoKICByZXR1cm4gbmV3X3BhdGg7Cn0KCi8qCiAqIExvYWQgY29va2llcyBmcm9tIGFsbCBnaXZlbiBjb29raWUgZmlsZXMgKENVUkxPUFRfQ09PS0lFRklMRSkuCiAqCiAqIE5PVEU6IE9PTSBvciBjb29raWUgcGFyc2luZyBmYWlsdXJlcyBhcmUgaWdub3JlZC4KICovCnZvaWQgQ3VybF9jb29raWVfbG9hZGZpbGVzKHN0cnVjdCBTZXNzaW9uSGFuZGxlICpkYXRhKQp7CiAgc3RydWN0IGN1cmxfc2xpc3QgKmxpc3QgPSBkYXRhLT5jaGFuZ2UuY29va2llbGlzdDsKICBpZihsaXN0KSB7CiAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CiAgICB3aGlsZShsaXN0KSB7CiAgICAgIHN0cnVjdCBDb29raWVJbmZvICpuZXdjb29raWVzID0gQ3VybF9jb29raWVfaW5pdChkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC0+ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmNvb2tpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5zZXQuY29va2llc2Vzc2lvbik7CiAgICAgIGlmKCFuZXdjb29raWVzKQogICAgICAgIC8qIEZhaWx1cmUgbWF5IGJlIGR1ZSB0byBPT00gb3IgYSBiYWQgY29va2llOyBib3RoIGFyZSBpZ25vcmVkCiAgICAgICAgICogYnV0IG9ubHkgdGhlIGZpcnN0IHNob3VsZCBiZQogICAgICAgICAqLwogICAgICAgIGluZm9mKGRhdGEsICJpZ25vcmluZyBmYWlsZWQgY29va2llX2luaXQgZm9yICVzXG4iLCBsaXN0LT5kYXRhKTsKICAgICAgZWxzZQogICAgICAgIGRhdGEtPmNvb2tpZXMgPSBuZXdjb29raWVzOwogICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKICAgIH0KICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwoZGF0YS0+Y2hhbmdlLmNvb2tpZWxpc3QpOyAvKiBjbGVhbiB1cCBsaXN0ICovCiAgICBkYXRhLT5jaGFuZ2UuY29va2llbGlzdCA9IE5VTEw7IC8qIGRvbid0IGRvIHRoaXMgYWdhaW4hICovCiAgICBDdXJsX3NoYXJlX3VubG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUpOwogIH0KfQoKLyoKICogc3Ryc3RvcmUoKSBtYWtlcyBhIHN0cmR1cCgpIG9uIHRoZSAnbmV3c3RyJyBhbmQgaWYgJypzdHInIGlzIG5vbi1OVUxMCiAqIHRoYXQgd2lsbCBiZSBmcmVlZCBiZWZvcmUgdGhlIGFsbG9jYXRlZCBzdHJpbmcgaXMgc3RvcmVkIHRoZXJlLgogKgogKiBJdCBpcyBtZWFudCB0byBlYXNpbHkgcmVwbGFjZSBzdHJkdXAoKQogKi8Kc3RhdGljIHZvaWQgc3Ryc3RvcmUoY2hhciAqKnN0ciwgY29uc3QgY2hhciAqbmV3c3RyKQp7CiAgZnJlZSgqc3RyKTsKICAqc3RyID0gc3RyZHVwKG5ld3N0cik7Cn0KCi8qCiAqIHJlbW92ZV9leHBpcmVkKCkgcmVtb3ZlcyBleHBpcmVkIGNvb2tpZXMuCiAqLwpzdGF0aWMgdm9pZCByZW1vdmVfZXhwaXJlZChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llcykKewogIHN0cnVjdCBDb29raWUgKmNvLCAqbngsICpwdjsKICBjdXJsX29mZl90IG5vdyA9IChjdXJsX29mZl90KXRpbWUoTlVMTCk7CgogIGNvID0gY29va2llcy0+Y29va2llczsKICBwdiA9IE5VTEw7CiAgd2hpbGUoY28pIHsKICAgIG54ID0gY28tPm5leHQ7CiAgICBpZigoY28tPmV4cGlyZXN0ciB8fCBjby0+bWF4YWdlKSAmJiBjby0+ZXhwaXJlcyA8IG5vdykgewogICAgICBpZihjbyA9PSBjb29raWVzLT5jb29raWVzKSB7CiAgICAgICAgY29va2llcy0+Y29va2llcyA9IGNvLT5uZXh0OwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHB2LT5uZXh0ID0gY28tPm5leHQ7CiAgICAgIH0KICAgICAgY29va2llcy0+bnVtY29va2llcy0tOwogICAgICBmcmVlY29va2llKGNvKTsKICAgIH0KICAgIGVsc2UgewogICAgICBwdiA9IGNvOwogICAgfQogICAgY28gPSBueDsKICB9Cn0KCi8qCiAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYW4gSVAodjR8djYpIGFkZHJlc3MuCiAqLwpzdGF0aWMgYm9vbCBpc2lwKGNvbnN0IGNoYXIgKmRvbWFpbikKewogIHN0cnVjdCBpbl9hZGRyIGFkZHI7CiNpZmRlZiBFTkFCTEVfSVBWNgogIHN0cnVjdCBpbjZfYWRkciBhZGRyNjsKI2VuZGlmCgogIGlmKEN1cmxfaW5ldF9wdG9uKEFGX0lORVQsIGRvbWFpbiwgJmFkZHIpCiNpZmRlZiBFTkFCTEVfSVBWNgogICAgIHx8IEN1cmxfaW5ldF9wdG9uKEFGX0lORVQ2LCBkb21haW4sICZhZGRyNikKI2VuZGlmCiAgICApIHsKICAgIC8qIGRvbWFpbiBuYW1lIGdpdmVuIGFzIElQIGFkZHJlc3MgKi8KICAgIHJldHVybiBUUlVFOwogIH0KCiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9hZGQoKQogKgogKiBBZGQgYSBzaW5nbGUgY29va2llIGxpbmUgdG8gdGhlIGNvb2tpZSBrZWVwaW5nIG9iamVjdC4KICoKICogQmUgYXdhcmUgdGhhdCBzb21ldGltZXMgd2UgZ2V0IGFuIElQLW9ubHkgaG9zdCBuYW1lLCBhbmQgdGhhdCBtaWdodCBhbHNvIGJlCiAqIGEgbnVtZXJpY2FsIElQdjYgYWRkcmVzcy4KICoKICogUmV0dXJucyBOVUxMIG9uIG91dCBvZiBtZW1vcnkgb3IgaW52YWxpZCBjb29raWUuIFRoaXMgaXMgc3Vib3B0aW1hbCwKICogYXMgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBzZXBhcmF0ZWx5LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqCkN1cmxfY29va2llX2FkZChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKICAgICAgICAgICAgICAgIC8qIFRoZSAnZGF0YScgcG9pbnRlciBoZXJlIG1heSBiZSBOVUxMIGF0IHRpbWVzLCBhbmQgdGh1cwogICAgICAgICAgICAgICAgICAgbXVzdCBvbmx5IGJlIHVzZWQgdmVyeSBjYXJlZnVsbHkgZm9yIHRoaW5ncyB0aGF0IGNhbiBkZWFsCiAgICAgICAgICAgICAgICAgICB3aXRoIGRhdGEgYmVpbmcgTlVMTC4gU3VjaCBhcyBpbmZvZigpIGFuZCBzaW1pbGFyICovCgogICAgICAgICAgICAgICAgc3RydWN0IENvb2tpZUluZm8gKmMsCiAgICAgICAgICAgICAgICBib29sIGh0dHBoZWFkZXIsIC8qIFRSVUUgaWYgSFRUUCBoZWFkZXItc3R5bGUgbGluZSAqLwogICAgICAgICAgICAgICAgY2hhciAqbGluZXB0ciwgICAvKiBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGxpbmUgKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRvbWFpbiwgLyogZGVmYXVsdCBkb21haW4gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgpICAgLyogZnVsbCBwYXRoIHVzZWQgd2hlbiB0aGlzIGNvb2tpZSBpcyBzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gZ2V0IGRlZmF1bHQgcGF0aCBmb3IgdGhlIGNvb2tpZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3Mgc2V0ICovCnsKICBzdHJ1Y3QgQ29va2llICpjbGlzdDsKICBjaGFyIG5hbWVbTUFYX05BTUVdOwogIHN0cnVjdCBDb29raWUgKmNvOwogIHN0cnVjdCBDb29raWUgKmxhc3RjPU5VTEw7CiAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CiAgYm9vbCByZXBsYWNlX29sZCA9IEZBTFNFOwogIGJvb2wgYmFkY29va2llID0gRkFMU0U7IC8qIGNvb2tpZXMgYXJlIGdvb2QgYnkgZGVmYXVsdC4gbW1tbW0geXVtbXkgKi8KCiNpZmRlZiBDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTCiAgKHZvaWQpZGF0YTsKI2VuZGlmCgogIC8qIEZpcnN0LCBhbGxvYyBhbmQgaW5pdCBhIG5ldyBzdHJ1Y3QgZm9yIGl0ICovCiAgY28gPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKICBpZighY28pCiAgICByZXR1cm4gTlVMTDsgLyogYmFpbCBvdXQgaWYgd2UncmUgdGhpcyBsb3cgb24gbWVtb3J5ICovCgogIGlmKGh0dHBoZWFkZXIpIHsKICAgIC8qIFRoaXMgbGluZSB3YXMgcmVhZCBvZmYgYSBIVFRQLWhlYWRlciAqLwogICAgY29uc3QgY2hhciAqcHRyOwogICAgY29uc3QgY2hhciAqc2VtaXB0cjsKICAgIGNoYXIgKndoYXQ7CgogICAgd2hhdCA9IG1hbGxvYyhNQVhfQ09PS0lFX0xJTkUpOwogICAgaWYoIXdoYXQpIHsKICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHNlbWlwdHI9c3RyY2hyKGxpbmVwdHIsICc7Jyk7IC8qIGZpcnN0LCBmaW5kIGEgc2VtaWNvbG9uICovCgogICAgd2hpbGUoKmxpbmVwdHIgJiYgSVNCTEFOSygqbGluZXB0cikpCiAgICAgIGxpbmVwdHIrKzsKCiAgICBwdHIgPSBsaW5lcHRyOwogICAgZG8gewogICAgICAvKiB3ZSBoYXZlIGEgPHdoYXQ+PTx0aGlzPiBwYWlyIG9yIGEgc3RhbmQtYWxvbmUgd29yZCBoZXJlICovCiAgICAgIG5hbWVbMF09d2hhdFswXT0wOyAvKiBpbml0IHRoZSBidWZmZXJzICovCiAgICAgIGlmKDEgPD0gc3NjYW5mKHB0ciwgIiUiIE1BWF9OQU1FX1RYVCAiW147XHJcbiA9XSA9JSIKICAgICAgICAgICAgICAgICAgICAgTUFYX0NPT0tJRV9MSU5FX1RYVCAiW147XHJcbl0iLAogICAgICAgICAgICAgICAgICAgICBuYW1lLCB3aGF0KSkgewogICAgICAgIC8qIFVzZSBzdHJzdG9yZSgpIGJlbG93IHRvIHByb3Blcmx5IGRlYWwgd2l0aCByZWNlaXZlZCBjb29raWUKICAgICAgICAgICBoZWFkZXJzIHRoYXQgaGF2ZSB0aGUgc2FtZSBzdHJpbmcgcHJvcGVydHkgc2V0IG1vcmUgdGhhbiBvbmNlLAogICAgICAgICAgIGFuZCB0aGVuIHdlIHVzZSB0aGUgbGFzdCBvbmUuICovCiAgICAgICAgY29uc3QgY2hhciAqd2hhdHB0cjsKICAgICAgICBib29sIGRvbmUgPSBGQUxTRTsKICAgICAgICBib29sIHNlcDsKICAgICAgICBzaXplX3QgbGVuPXN0cmxlbih3aGF0KTsKICAgICAgICBjb25zdCBjaGFyICplbmRvZm4gPSAmcHRyWyBzdHJsZW4obmFtZSkgXTsKCiAgICAgICAgLyogc2tpcCB0cmFpbGluZyBzcGFjZXMgaW4gbmFtZSAqLwogICAgICAgIHdoaWxlKCplbmRvZm4gJiYgSVNCTEFOSygqZW5kb2ZuKSkKICAgICAgICAgIGVuZG9mbisrOwoKICAgICAgICAvKiBuYW1lIGVuZHMgd2l0aCBhICc9JyA/ICovCiAgICAgICAgc2VwID0gKCplbmRvZm4gPT0gJz0nKT9UUlVFOkZBTFNFOwoKICAgICAgICAvKiBTdHJpcCBvZmYgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSAnd2hhdCcgKi8KICAgICAgICB3aGlsZShsZW4gJiYgSVNCTEFOSyh3aGF0W2xlbi0xXSkpIHsKICAgICAgICAgIHdoYXRbbGVuLTFdPTA7CiAgICAgICAgICBsZW4tLTsKICAgICAgICB9CgogICAgICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlICd3aGF0JyAqLwogICAgICAgIHdoYXRwdHI9d2hhdDsKICAgICAgICB3aGlsZSgqd2hhdHB0ciAmJiBJU0JMQU5LKCp3aGF0cHRyKSkKICAgICAgICAgIHdoYXRwdHIrKzsKCiAgICAgICAgaWYoIWxlbikgewogICAgICAgICAgLyogdGhpcyB3YXMgYSAiPG5hbWU+PSIgd2l0aCBubyBjb250ZW50LCBhbmQgd2UgbXVzdCBhbGxvdwogICAgICAgICAgICAgJ3NlY3VyZScgYW5kICdodHRwb25seScgc3BlY2lmaWVkIHRoaXMgd2VpcmRseSAqLwogICAgICAgICAgZG9uZSA9IFRSVUU7CiAgICAgICAgICBpZihDdXJsX3Jhd19lcXVhbCgic2VjdXJlIiwgbmFtZSkpCiAgICAgICAgICAgIGNvLT5zZWN1cmUgPSBUUlVFOwogICAgICAgICAgZWxzZSBpZihDdXJsX3Jhd19lcXVhbCgiaHR0cG9ubHkiLCBuYW1lKSkKICAgICAgICAgICAgY28tPmh0dHBvbmx5ID0gVFJVRTsKICAgICAgICAgIGVsc2UgaWYoc2VwKQogICAgICAgICAgICAvKiB0aGVyZSB3YXMgYSAnPScgc28gd2UncmUgbm90IGRvbmUgcGFyc2luZyB0aGlzIGZpZWxkICovCiAgICAgICAgICAgIGRvbmUgPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgaWYoZG9uZSkKICAgICAgICAgIDsKICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJwYXRoIiwgbmFtZSkpIHsKICAgICAgICAgIHN0cnN0b3JlKCZjby0+cGF0aCwgd2hhdHB0cik7CiAgICAgICAgICBpZighY28tPnBhdGgpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsgLyogb3V0IG9mIG1lbW9yeSBiYWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjby0+c3BhdGggPSBzYW5pdGl6ZV9jb29raWVfcGF0aChjby0+cGF0aCk7CiAgICAgICAgICBpZighY28tPnNwYXRoKSB7CiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7IC8qIG91dCBvZiBtZW1vcnkgYmFkICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJkb21haW4iLCBuYW1lKSkgewogICAgICAgICAgYm9vbCBpc19pcDsKICAgICAgICAgIGNvbnN0IGNoYXIgKmRvdHA7CgogICAgICAgICAgLyogTm93LCB3ZSBtYWtlIHN1cmUgdGhhdCBvdXIgaG9zdCBpcyB3aXRoaW4gdGhlIGdpdmVuIGRvbWFpbiwKICAgICAgICAgICAgIG9yIHRoZSBnaXZlbiBkb21haW4gaXMgbm90IHZhbGlkIGFuZCB0aHVzIGNhbm5vdCBiZSBzZXQuICovCgogICAgICAgICAgaWYoJy4nID09IHdoYXRwdHJbMF0pCiAgICAgICAgICAgIHdoYXRwdHIrKzsgLyogaWdub3JlIHByZWNlZGluZyBkb3QgKi8KCiAgICAgICAgICBpc19pcCA9IGlzaXAoZG9tYWluID8gZG9tYWluIDogd2hhdHB0cik7CgogICAgICAgICAgLyogY2hlY2sgZm9yIG1vcmUgZG90cyAqLwogICAgICAgICAgZG90cCA9IHN0cmNocih3aGF0cHRyLCAnLicpOwogICAgICAgICAgaWYoIWRvdHApCiAgICAgICAgICAgIGRvbWFpbj0iOiI7CgogICAgICAgICAgaWYoIWRvbWFpbgogICAgICAgICAgICAgfHwgKGlzX2lwICYmICFzdHJjbXAod2hhdHB0ciwgZG9tYWluKSkKICAgICAgICAgICAgIHx8ICghaXNfaXAgJiYgdGFpbG1hdGNoKHdoYXRwdHIsIGRvbWFpbikpKSB7CiAgICAgICAgICAgIHN0cnN0b3JlKCZjby0+ZG9tYWluLCB3aGF0cHRyKTsKICAgICAgICAgICAgaWYoIWNvLT5kb21haW4pIHsKICAgICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCFpc19pcCkKICAgICAgICAgICAgICBjby0+dGFpbG1hdGNoPVRSVUU7IC8qIHdlIGFsd2F5cyBkbyB0aGF0IGlmIHRoZSBkb21haW4gbmFtZSB3YXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuICovCiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyogd2UgZGlkIG5vdCBnZXQgYSB0YWlsbWF0Y2ggYW5kIHRoZW4gdGhlIGF0dGVtcHRlZCBzZXQgZG9tYWluCiAgICAgICAgICAgICAgIGlzIG5vdCBhIGRvbWFpbiB0byB3aGljaCB0aGUgY3VycmVudCBob3N0IGJlbG9uZ3MuIE1hcmsgYXMKICAgICAgICAgICAgICAgYmFkLiAqLwogICAgICAgICAgICBiYWRjb29raWU9VFJVRTsKICAgICAgICAgICAgaW5mb2YoZGF0YSwgInNraXBwZWQgY29va2llIHdpdGggYmFkIHRhaWxtYXRjaCBkb21haW46ICVzXG4iLAogICAgICAgICAgICAgICAgICB3aGF0cHRyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihDdXJsX3Jhd19lcXVhbCgidmVyc2lvbiIsIG5hbWUpKSB7CiAgICAgICAgICBzdHJzdG9yZSgmY28tPnZlcnNpb24sIHdoYXRwdHIpOwogICAgICAgICAgaWYoIWNvLT52ZXJzaW9uKSB7CiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKEN1cmxfcmF3X2VxdWFsKCJtYXgtYWdlIiwgbmFtZSkpIHsKICAgICAgICAgIC8qIERlZmluZWQgaW4gUkZDMjEwOToKCiAgICAgICAgICAgICBPcHRpb25hbC4gIFRoZSBNYXgtQWdlIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsaWZldGltZSBvZiB0aGUKICAgICAgICAgICAgIGNvb2tpZSwgaW4gc2Vjb25kcy4gIFRoZSBkZWx0YS1zZWNvbmRzIHZhbHVlIGlzIGEgZGVjaW1hbCBub24tCiAgICAgICAgICAgICBuZWdhdGl2ZSBpbnRlZ2VyLiAgQWZ0ZXIgZGVsdGEtc2Vjb25kcyBzZWNvbmRzIGVsYXBzZSwgdGhlCiAgICAgICAgICAgICBjbGllbnQgc2hvdWxkIGRpc2NhcmQgdGhlIGNvb2tpZS4gIEEgdmFsdWUgb2YgemVybyBtZWFucyB0aGUKICAgICAgICAgICAgIGNvb2tpZSBzaG91bGQgYmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5LgoKICAgICAgICAgICovCiAgICAgICAgICBzdHJzdG9yZSgmY28tPm1heGFnZSwgd2hhdHB0cik7CiAgICAgICAgICBpZighY28tPm1heGFnZSkgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihDdXJsX3Jhd19lcXVhbCgiZXhwaXJlcyIsIG5hbWUpKSB7CiAgICAgICAgICBzdHJzdG9yZSgmY28tPmV4cGlyZXN0ciwgd2hhdHB0cik7CiAgICAgICAgICBpZighY28tPmV4cGlyZXN0cikgewogICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZighY28tPm5hbWUpIHsKICAgICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKG5hbWUpOwogICAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHdoYXRwdHIpOwogICAgICAgICAgaWYoIWNvLT5uYW1lIHx8ICFjby0+dmFsdWUpIHsKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICBlbHNlIHRoaXMgaXMgdGhlIHNlY29uZCAob3IgbW9yZSkgbmFtZSB3ZSBkb24ndCBrbm93CiAgICAgICAgICBhYm91dCEgKi8KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvKiB0aGlzIGlzIGFuICJpbGxlZ2FsIiA8d2hhdD49PHRoaXM+IHBhaXIgKi8KICAgICAgfQoKICAgICAgaWYoIXNlbWlwdHIgfHwgISpzZW1pcHRyKSB7CiAgICAgICAgLyogd2UgYWxyZWFkeSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGNvb2tpZXMgKi8KICAgICAgICBzZW1pcHRyID0gTlVMTDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgcHRyPXNlbWlwdHIrMTsKICAgICAgd2hpbGUoKnB0ciAmJiBJU0JMQU5LKCpwdHIpKQogICAgICAgIHB0cisrOwogICAgICBzZW1pcHRyPXN0cmNocihwdHIsICc7Jyk7IC8qIG5vdywgZmluZCB0aGUgbmV4dCBzZW1pY29sb24gKi8KCiAgICAgIGlmKCFzZW1pcHRyICYmICpwdHIpCiAgICAgICAgLyogVGhlcmUgYXJlIG5vIG1vcmUgc2VtaWNvbG9ucywgYnV0IHRoZXJlJ3MgYSBmaW5hbCBuYW1lPXZhbHVlIHBhaXIKICAgICAgICAgICBjb21pbmcgdXAgKi8KICAgICAgICBzZW1pcHRyPXN0cmNocihwdHIsICdcMCcpOwogICAgfSB3aGlsZShzZW1pcHRyKTsKCiAgICBpZihjby0+bWF4YWdlKSB7CiAgICAgIGNvLT5leHBpcmVzID0KICAgICAgICBjdXJseF9zdHJ0b29mZnQoKCpjby0+bWF4YWdlPT0nXCInKT8KICAgICAgICAgICAgICAgICAgICAgICAgJmNvLT5tYXhhZ2VbMV06JmNvLT5tYXhhZ2VbMF0sIE5VTEwsIDEwKTsKICAgICAgaWYoQ1VSTF9PRkZfVF9NQVggLSBub3cgPCBjby0+ZXhwaXJlcykKICAgICAgICAvKiBhdm9pZCBvdmVyZmxvdyAqLwogICAgICAgIGNvLT5leHBpcmVzID0gQ1VSTF9PRkZfVF9NQVg7CiAgICAgIGVsc2UKICAgICAgICBjby0+ZXhwaXJlcyArPSBub3c7CiAgICB9CiAgICBlbHNlIGlmKGNvLT5leHBpcmVzdHIpIHsKICAgICAgLyogTm90ZSB0aGF0IGlmIHRoZSBkYXRlIGNvdWxkbid0IGdldCBwYXJzZWQgZm9yIHdoYXRldmVyIHJlYXNvbiwKICAgICAgICAgdGhlIGNvb2tpZSB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzZXNzaW9uIGNvb2tpZSAqLwogICAgICBjby0+ZXhwaXJlcyA9IGN1cmxfZ2V0ZGF0ZShjby0+ZXhwaXJlc3RyLCBOVUxMKTsKCiAgICAgIC8qIFNlc3Npb24gY29va2llcyBoYXZlIGV4cGlyZXMgc2V0IHRvIDAgc28gaWYgd2UgZ2V0IHRoYXQgYmFjawogICAgICAgICBmcm9tIHRoZSBkYXRlIHBhcnNlciBsZXQncyBhZGQgYSBzZWNvbmQgdG8gbWFrZSBpdCBhCiAgICAgICAgIG5vbi1zZXNzaW9uIGNvb2tpZSAqLwogICAgICBpZihjby0+ZXhwaXJlcyA9PSAwKQogICAgICAgIGNvLT5leHBpcmVzID0gMTsKICAgICAgZWxzZSBpZihjby0+ZXhwaXJlcyA8IDApCiAgICAgICAgY28tPmV4cGlyZXMgPSAwOwogICAgfQoKICAgIGlmKCFiYWRjb29raWUgJiYgIWNvLT5kb21haW4pIHsKICAgICAgaWYoZG9tYWluKSB7CiAgICAgICAgLyogbm8gZG9tYWluIHdhcyBnaXZlbiBpbiB0aGUgaGVhZGVyIGxpbmUsIHNldCB0aGUgZGVmYXVsdCAqLwogICAgICAgIGNvLT5kb21haW49c3RyZHVwKGRvbWFpbik7CiAgICAgICAgaWYoIWNvLT5kb21haW4pCiAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOwogICAgICB9CiAgICB9CgogICAgaWYoIWJhZGNvb2tpZSAmJiAhY28tPnBhdGggJiYgcGF0aCkgewogICAgICAvKiBObyBwYXRoIHdhcyBnaXZlbiBpbiB0aGUgaGVhZGVyIGxpbmUsIHNldCB0aGUgZGVmYXVsdC4KICAgICAgICAgTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gcGF0aCB0byB0aGlzIGZ1bmN0aW9uIE1BWSBoYXZlIGEgJz8nIGFuZAogICAgICAgICBmb2xsb3dpbmcgcGFydCB0aGF0IE1VU1Qgbm90IGJlIHN0b3JlZCBhcyBwYXJ0IG9mIHRoZSBwYXRoLiAqLwogICAgICBjaGFyICpxdWVyeXAgPSBzdHJjaHIocGF0aCwgJz8nKTsKCiAgICAgIC8qIHF1ZXJ5cCBpcyB3aGVyZSB0aGUgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgcGF0aCBlbmRzLCBzbyBub3cgd2UKICAgICAgICAgd2FudCB0byB0aGUgZmluZCB0aGUgbGFzdCAqLwogICAgICBjaGFyICplbmRzbGFzaDsKICAgICAgaWYoIXF1ZXJ5cCkKICAgICAgICBlbmRzbGFzaCA9IHN0cnJjaHIocGF0aCwgJy8nKTsKICAgICAgZWxzZQogICAgICAgIGVuZHNsYXNoID0gbWVtcmNocihwYXRoLCAnLycsIChzaXplX3QpKHF1ZXJ5cCAtIHBhdGgpKTsKICAgICAgaWYoZW5kc2xhc2gpIHsKICAgICAgICBzaXplX3QgcGF0aGxlbiA9IChzaXplX3QpKGVuZHNsYXNoLXBhdGgrMSk7IC8qIGluY2x1ZGUgZW5kaW5nIHNsYXNoICovCiAgICAgICAgY28tPnBhdGg9bWFsbG9jKHBhdGhsZW4rMSk7IC8qIG9uZSBleHRyYSBmb3IgdGhlIHplcm8gYnl0ZSAqLwogICAgICAgIGlmKGNvLT5wYXRoKSB7CiAgICAgICAgICBtZW1jcHkoY28tPnBhdGgsIHBhdGgsIHBhdGhsZW4pOwogICAgICAgICAgY28tPnBhdGhbcGF0aGxlbl09MDsgLyogemVybyB0ZXJtaW5hdGUgKi8KICAgICAgICAgIGNvLT5zcGF0aCA9IHNhbml0aXplX2Nvb2tpZV9wYXRoKGNvLT5wYXRoKTsKICAgICAgICAgIGlmKCFjby0+c3BhdGgpCiAgICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7IC8qIG91dCBvZiBtZW1vcnkgYmFkICovCiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgIH0KICAgIH0KCiAgICBmcmVlKHdoYXQpOwoKICAgIGlmKGJhZGNvb2tpZSB8fCAhY28tPm5hbWUpIHsKICAgICAgLyogd2UgZGlkbid0IGdldCBhIGNvb2tpZSBuYW1lIG9yIGEgYmFkIG9uZSwKICAgICAgICAgdGhpcyBpcyBhbiBpbGxlZ2FsIGxpbmUsIGJhaWwgb3V0ICovCiAgICAgIGZyZWVjb29raWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgfQogIGVsc2UgewogICAgLyogVGhpcyBsaW5lIGlzIE5PVCBhIEhUVFAgaGVhZGVyIHN0eWxlIGxpbmUsIHdlIGRvIG9mZmVyIHN1cHBvcnQgZm9yCiAgICAgICByZWFkaW5nIHRoZSBvZGQgbmV0c2NhcGUgY29va2llcy1maWxlIGZvcm1hdCBoZXJlICovCiAgICBjaGFyICpwdHI7CiAgICBjaGFyICpmaXJzdHB0cjsKICAgIGNoYXIgKnRva19idWY9TlVMTDsKICAgIGludCBmaWVsZHM7CgogICAgLyogSUUgaW50cm9kdWNlZCBIVFRQLW9ubHkgY29va2llcyB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLiBDb29raWVzCiAgICAgICBtYXJrZWQgd2l0aCBodHRwT25seSBhZnRlciB0aGUgZG9tYWluIG5hbWUgYXJlIG5vdCBhY2Nlc3NpYmxlCiAgICAgICBmcm9tIGphdmFzY3JpcHRzLCBidXQgc2luY2UgY3VybCBkb2VzIG5vdCBvcGVyYXRlIGF0IGphdmFzY3JpcHQKICAgICAgIGxldmVsLCB3ZSBpbmNsdWRlIHRoZW0gYW55d2F5LiBJbiBGaXJlZm94J3MgY29va2llIGZpbGVzLCB0aGVzZQogICAgICAgbGluZXMgYXJlIHByZWNlZGVkIHdpdGggI0h0dHBPbmx5XyBhbmQgdGhlbiBldmVyeXRoaW5nIGlzCiAgICAgICBhcyB1c3VhbCwgc28gd2Ugc2tpcCAxMCBjaGFyYWN0ZXJzIG9mIHRoZSBsaW5lLi4KICAgICovCiAgICBpZihzdHJuY21wKGxpbmVwdHIsICIjSHR0cE9ubHlfIiwgMTApID09IDApIHsKICAgICAgbGluZXB0ciArPSAxMDsKICAgICAgY28tPmh0dHBvbmx5ID0gVFJVRTsKICAgIH0KCiAgICBpZihsaW5lcHRyWzBdPT0nIycpIHsKICAgICAgLyogZG9uJ3QgZXZlbiB0cnkgdGhlIGNvbW1lbnRzICovCiAgICAgIGZyZWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIC8qIHN0cmlwIG9mZiB0aGUgcG9zc2libGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyAqLwogICAgcHRyPXN0cmNocihsaW5lcHRyLCAnXHInKTsKICAgIGlmKHB0cikKICAgICAgKnB0cj0wOyAvKiBjbGVhciBpdCAqLwogICAgcHRyPXN0cmNocihsaW5lcHRyLCAnXG4nKTsKICAgIGlmKHB0cikKICAgICAgKnB0cj0wOyAvKiBjbGVhciBpdCAqLwoKICAgIGZpcnN0cHRyPXN0cnRva19yKGxpbmVwdHIsICJcdCIsICZ0b2tfYnVmKTsgLyogdG9rZW5pemUgaXQgb24gdGhlIFRBQiAqLwoKICAgIC8qIE5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyBhbmQgaW5pdCB0aGUgc3RydWN0IHdlIGFscmVhZHkgaGF2ZQogICAgICAgYWxsb2NhdGVkICovCiAgICBmb3IocHRyPWZpcnN0cHRyLCBmaWVsZHM9MDsgcHRyICYmICFiYWRjb29raWU7CiAgICAgICAgcHRyPXN0cnRva19yKE5VTEwsICJcdCIsICZ0b2tfYnVmKSwgZmllbGRzKyspIHsKICAgICAgc3dpdGNoKGZpZWxkcykgewogICAgICBjYXNlIDA6CiAgICAgICAgaWYocHRyWzBdPT0nLicpIC8qIHNraXAgcHJlY2VkaW5nIGRvdHMgKi8KICAgICAgICAgIHB0cisrOwogICAgICAgIGNvLT5kb21haW4gPSBzdHJkdXAocHRyKTsKICAgICAgICBpZighY28tPmRvbWFpbikKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICAvKiBUaGlzIGZpZWxkIGdvdCBpdHMgZXhwbGFuYXRpb24gb24gdGhlIDIzcmQgb2YgTWF5IDIwMDEgYnkKICAgICAgICAgICBBbmRy6XMgR2FyY+1hOgoKICAgICAgICAgICBmbGFnOiBBIFRSVUUvRkFMU0UgdmFsdWUgaW5kaWNhdGluZyBpZiBhbGwgbWFjaGluZXMgd2l0aGluIGEgZ2l2ZW4KICAgICAgICAgICBkb21haW4gY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUuIFRoaXMgdmFsdWUgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYnkKICAgICAgICAgICB0aGUgYnJvd3NlciwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSB5b3Ugc2V0IGZvciB0aGUgZG9tYWluLgoKICAgICAgICAgICBBcyBmYXIgYXMgSSBjYW4gc2VlLCBpdCBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBjb29raWUgc2F5cwogICAgICAgICAgIC5kb21haW4uY29tIGFuZCB0byBmYWxzZSB3aGVuIHRoZSBkb21haW4gaXMgY29tcGxldGUgd3d3LmRvbWFpbi5jb20KICAgICAgICAqLwogICAgICAgIGNvLT50YWlsbWF0Y2ggPSBDdXJsX3Jhd19lcXVhbChwdHIsICJUUlVFIik/VFJVRTpGQUxTRTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIC8qIEl0IHR1cm5zIG91dCwgdGhhdCBzb21ldGltZXMgdGhlIGZpbGUgZm9ybWF0IGFsbG93cyB0aGUgcGF0aAogICAgICAgICAgIGZpZWxkIHRvIHJlbWFpbiBub3QgZmlsbGVkIGluLCB3ZSB0cnkgdG8gZGV0ZWN0IHRoaXMgYW5kIHdvcmsKICAgICAgICAgICBhcm91bmQgaXQhIEFuZHLpcyBHYXJj7WEgbWFkZSB1cyBhd2FyZSBvZiB0aGlzLi4uICovCiAgICAgICAgaWYoc3RyY21wKCJUUlVFIiwgcHRyKSAmJiBzdHJjbXAoIkZBTFNFIiwgcHRyKSkgewogICAgICAgICAgLyogb25seSBpZiB0aGUgcGF0aCBkb2Vzbid0IGxvb2sgbGlrZSBhIGJvb2xlYW4gb3B0aW9uISAqLwogICAgICAgICAgY28tPnBhdGggPSBzdHJkdXAocHRyKTsKICAgICAgICAgIGlmKCFjby0+cGF0aCkKICAgICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBjby0+c3BhdGggPSBzYW5pdGl6ZV9jb29raWVfcGF0aChjby0+cGF0aCk7CiAgICAgICAgICAgIGlmKCFjby0+c3BhdGgpIHsKICAgICAgICAgICAgICBiYWRjb29raWUgPSBUUlVFOyAvKiBvdXQgb2YgbWVtb3J5IGJhZCAqLwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogdGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBhIHBhdGgsIG1ha2Ugb25lIHVwISAqLwogICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKCIvIik7CiAgICAgICAgaWYoIWNvLT5wYXRoKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBjby0+c3BhdGggPSBzdHJkdXAoIi8iKTsKICAgICAgICBpZighY28tPnNwYXRoKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBmaWVsZHMrKzsgLyogYWRkIGEgZmllbGQgYW5kIGZhbGwgZG93biB0byBzZWN1cmUgKi8KICAgICAgICAvKiBGQUxMVEhST1VHSCAqLwogICAgICBjYXNlIDM6CiAgICAgICAgY28tPnNlY3VyZSA9IEN1cmxfcmF3X2VxdWFsKHB0ciwgIlRSVUUiKT9UUlVFOkZBTFNFOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgY28tPmV4cGlyZXMgPSBjdXJseF9zdHJ0b29mZnQocHRyLCBOVUxMLCAxMCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNToKICAgICAgICBjby0+bmFtZSA9IHN0cmR1cChwdHIpOwogICAgICAgIGlmKCFjby0+bmFtZSkKICAgICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNjoKICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAocHRyKTsKICAgICAgICBpZighY28tPnZhbHVlKQogICAgICAgICAgYmFkY29va2llID0gVFJVRTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYoNiA9PSBmaWVsZHMpIHsKICAgICAgLyogd2UgZ290IGEgY29va2llIHdpdGggYmxhbmsgY29udGVudHMsIGZpeCBpdCAqLwogICAgICBjby0+dmFsdWUgPSBzdHJkdXAoIiIpOwogICAgICBpZighY28tPnZhbHVlKQogICAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CiAgICAgIGVsc2UKICAgICAgICBmaWVsZHMrKzsKICAgIH0KCiAgICBpZighYmFkY29va2llICYmICg3ICE9IGZpZWxkcykpCiAgICAgIC8qIHdlIGRpZCBub3QgZmluZCB0aGUgc3VmZmljaWVudCBudW1iZXIgb2YgZmllbGRzICovCiAgICAgIGJhZGNvb2tpZSA9IFRSVUU7CgogICAgaWYoYmFkY29va2llKSB7CiAgICAgIGZyZWVjb29raWUoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgfQoKICBpZighYy0+cnVubmluZyAmJiAgICAvKiByZWFkIGZyb20gYSBmaWxlICovCiAgICAgYy0+bmV3c2Vzc2lvbiAmJiAgLyogY2xlYW4gc2Vzc2lvbiBjb29raWVzICovCiAgICAgIWNvLT5leHBpcmVzKSB7ICAgLyogdGhpcyBpcyBhIHNlc3Npb24gY29va2llIHNpbmNlIGl0IGRvZXNuJ3QgZXhwaXJlISAqLwogICAgZnJlZWNvb2tpZShjbyk7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIGNvLT5saXZlY29va2llID0gYy0+cnVubmluZzsKCiAgLyogbm93LCB3ZSBoYXZlIHBhcnNlZCB0aGUgaW5jb21pbmcgbGluZSwgd2UgbXVzdCBub3cgY2hlY2sgaWYgdGhpcwogICAgIHN1cGVyY2VlZHMgYW4gYWxyZWFkeSBleGlzdGluZyBjb29raWUsIHdoaWNoIGl0IG1heSBpZiB0aGUgcHJldmlvdXMgaGF2ZQogICAgIHRoZSBzYW1lIGRvbWFpbiBhbmQgcGF0aCBhcyB0aGlzICovCgogIC8qIGF0IGZpcnN0LCByZW1vdmUgZXhwaXJlZCBjb29raWVzICovCiAgcmVtb3ZlX2V4cGlyZWQoYyk7CgogIGNsaXN0ID0gYy0+Y29va2llczsKICByZXBsYWNlX29sZCA9IEZBTFNFOwogIHdoaWxlKGNsaXN0KSB7CiAgICBpZihDdXJsX3Jhd19lcXVhbChjbGlzdC0+bmFtZSwgY28tPm5hbWUpKSB7CiAgICAgIC8qIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsICovCgogICAgICBpZihjbGlzdC0+ZG9tYWluICYmIGNvLT5kb21haW4pIHsKICAgICAgICBpZihDdXJsX3Jhd19lcXVhbChjbGlzdC0+ZG9tYWluLCBjby0+ZG9tYWluKSkKICAgICAgICAgIC8qIFRoZSBkb21haW5zIGFyZSBpZGVudGljYWwgKi8KICAgICAgICAgIHJlcGxhY2Vfb2xkPVRSVUU7CiAgICAgIH0KICAgICAgZWxzZSBpZighY2xpc3QtPmRvbWFpbiAmJiAhY28tPmRvbWFpbikKICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CgogICAgICBpZihyZXBsYWNlX29sZCkgewogICAgICAgIC8qIHRoZSBkb21haW5zIHdlcmUgaWRlbnRpY2FsICovCgogICAgICAgIGlmKGNsaXN0LT5zcGF0aCAmJiBjby0+c3BhdGgpIHsKICAgICAgICAgIGlmKEN1cmxfcmF3X2VxdWFsKGNsaXN0LT5zcGF0aCwgY28tPnNwYXRoKSkgewogICAgICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIWNsaXN0LT5zcGF0aCAmJiAhY28tPnNwYXRoKQogICAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwogICAgICAgIGVsc2UKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CgogICAgICB9CgogICAgICBpZihyZXBsYWNlX29sZCAmJiAhY28tPmxpdmVjb29raWUgJiYgY2xpc3QtPmxpdmVjb29raWUpIHsKICAgICAgICAvKiBCb3RoIGNvb2tpZXMgbWF0Y2hlZCBmaW5lLCBleGNlcHQgdGhhdCB0aGUgYWxyZWFkeSBwcmVzZW50CiAgICAgICAgICAgY29va2llIGlzICJsaXZlIiwgd2hpY2ggbWVhbnMgaXQgd2FzIHNldCBmcm9tIGEgaGVhZGVyLCB3aGlsZQogICAgICAgICAgIHRoZSBuZXcgb25lIGlzbid0ICJsaXZlIiBhbmQgdGh1cyBvbmx5IHJlYWQgZnJvbSBhIGZpbGUuIFdlIGxldAogICAgICAgICAgIGxpdmUgY29va2llcyBzdGF5IGFsaXZlICovCgogICAgICAgIC8qIEZyZWUgdGhlIG5ld2NvbWVyIGFuZCBnZXQgb3V0IG9mIGhlcmUhICovCiAgICAgICAgZnJlZWNvb2tpZShjbyk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkKSB7CiAgICAgICAgY28tPm5leHQgPSBjbGlzdC0+bmV4dDsgLyogZ2V0IHRoZSBuZXh0LXBvaW50ZXIgZmlyc3QgKi8KCiAgICAgICAgLyogdGhlbiBmcmVlIGFsbCB0aGUgb2xkIHBvaW50ZXJzICovCiAgICAgICAgZnJlZShjbGlzdC0+bmFtZSk7CiAgICAgICAgZnJlZShjbGlzdC0+dmFsdWUpOwogICAgICAgIGZyZWUoY2xpc3QtPmRvbWFpbik7CiAgICAgICAgZnJlZShjbGlzdC0+cGF0aCk7CiAgICAgICAgZnJlZShjbGlzdC0+c3BhdGgpOwogICAgICAgIGZyZWUoY2xpc3QtPmV4cGlyZXN0cik7CiAgICAgICAgZnJlZShjbGlzdC0+dmVyc2lvbik7CiAgICAgICAgZnJlZShjbGlzdC0+bWF4YWdlKTsKCiAgICAgICAgKmNsaXN0ID0gKmNvOyAgLyogdGhlbiBzdG9yZSBhbGwgdGhlIG5ldyBkYXRhICovCgogICAgICAgIGZyZWUoY28pOyAgIC8qIGZyZWUgdGhlIG5ld2x5IGFsbG9jZWQgbWVtb3J5ICovCiAgICAgICAgY28gPSBjbGlzdDsgLyogcG9pbnQgdG8gdGhlIHByZXZpb3VzIHN0cnVjdCBpbnN0ZWFkICovCgogICAgICAgIC8qIFdlIGhhdmUgcmVwbGFjZWQgYSBjb29raWUsIG5vdyBza2lwIHRoZSByZXN0IG9mIHRoZSBsaXN0IGJ1dAogICAgICAgICAgIG1ha2Ugc3VyZSB0aGUgJ2xhc3RjJyBwb2ludGVyIGlzIHByb3Blcmx5IHNldCAqLwogICAgICAgIGRvIHsKICAgICAgICAgIGxhc3RjID0gY2xpc3Q7CiAgICAgICAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogICAgICAgIH0gd2hpbGUoY2xpc3QpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBsYXN0YyA9IGNsaXN0OwogICAgY2xpc3QgPSBjbGlzdC0+bmV4dDsKICB9CgogIGlmKGMtPnJ1bm5pbmcpCiAgICAvKiBPbmx5IHNob3cgdGhpcyB3aGVuIE5PVCByZWFkaW5nIHRoZSBjb29raWVzIGZyb20gYSBmaWxlICovCiAgICBpbmZvZihkYXRhLCAiJXMgY29va2llICVzPVwiJXNcIiBmb3IgZG9tYWluICVzLCBwYXRoICVzLCAiCiAgICAgICAgICAiZXhwaXJlICUiIENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgIlxuIiwKICAgICAgICAgIHJlcGxhY2Vfb2xkPyJSZXBsYWNlZCI6IkFkZGVkIiwgY28tPm5hbWUsIGNvLT52YWx1ZSwKICAgICAgICAgIGNvLT5kb21haW4sIGNvLT5wYXRoLCBjby0+ZXhwaXJlcyk7CgogIGlmKCFyZXBsYWNlX29sZCkgewogICAgLyogdGhlbiBtYWtlIHRoZSBsYXN0IGl0ZW0gcG9pbnQgb24gdGhpcyBuZXcgb25lICovCiAgICBpZihsYXN0YykKICAgICAgbGFzdGMtPm5leHQgPSBjbzsKICAgIGVsc2UKICAgICAgYy0+Y29va2llcyA9IGNvOwogICAgYy0+bnVtY29va2llcysrOyAvKiBvbmUgbW9yZSBjb29raWUgaW4gdGhlIGphciAqLwogIH0KCiAgcmV0dXJuIGNvOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfaW5pdCgpCiAqCiAqIEluaXRzIGEgY29va2llIHN0cnVjdCB0byByZWFkIGRhdGEgZnJvbSBhIGxvY2FsIGZpbGUuIFRoaXMgaXMgYWx3YXlzCiAqIGNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4gRmlsZSBtYXkgYmUgTlVMTC4KICoKICogSWYgJ25ld3Nlc3Npb24nIGlzIFRSVUUsIGRpc2NhcmQgYWxsICJzZXNzaW9uIGNvb2tpZXMiIG9uIHJlYWQgZnJvbSBmaWxlLgogKgogKiBSZXR1cm5zIE5VTEwgb24gb3V0IG9mIG1lbW9yeS4gSW52YWxpZCBjb29raWVzIGFyZSBpZ25vcmVkLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IENvb2tpZUluZm8gKkN1cmxfY29va2llX2luaXQoc3RydWN0IFNlc3Npb25IYW5kbGUgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICppbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmV3c2Vzc2lvbikKewogIHN0cnVjdCBDb29raWVJbmZvICpjOwogIEZJTEUgKmZwID0gTlVMTDsKICBib29sIGZyb21maWxlPVRSVUU7CiAgY2hhciAqbGluZSA9IE5VTEw7CgogIGlmKE5VTEwgPT0gaW5jKSB7CiAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGEgc3RydWN0LCBjcmVhdGUgb25lICovCiAgICBjID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgQ29va2llSW5mbykpOwogICAgaWYoIWMpCiAgICAgIHJldHVybiBOVUxMOyAvKiBmYWlsZWQgdG8gZ2V0IG1lbW9yeSAqLwogICAgYy0+ZmlsZW5hbWUgPSBzdHJkdXAoZmlsZT9maWxlOiJub25lIik7IC8qIGNvcHkgdGhlIG5hbWUganVzdCBpbiBjYXNlICovCiAgICBpZighYy0+ZmlsZW5hbWUpCiAgICAgIGdvdG8gZmFpbDsgLyogZmFpbGVkIHRvIGdldCBtZW1vcnkgKi8KICB9CiAgZWxzZSB7CiAgICAvKiB3ZSBnb3QgYW4gYWxyZWFkeSBleGlzdGluZyBvbmUsIHVzZSB0aGF0ICovCiAgICBjID0gaW5jOwogIH0KICBjLT5ydW5uaW5nID0gRkFMU0U7IC8qIHRoaXMgaXMgbm90IHJ1bm5pbmcsIHRoaXMgaXMgaW5pdCAqLwoKICBpZihmaWxlICYmIHN0cmVxdWFsKGZpbGUsICItIikpIHsKICAgIGZwID0gc3RkaW47CiAgICBmcm9tZmlsZT1GQUxTRTsKICB9CiAgZWxzZSBpZihmaWxlICYmICEqZmlsZSkgewogICAgLyogcG9pbnRzIHRvIGEgIiIgc3RyaW5nICovCiAgICBmcCA9IE5VTEw7CiAgfQogIGVsc2UKICAgIGZwID0gZmlsZT9mb3BlbihmaWxlLCBGT1BFTl9SRUFEVEVYVCk6TlVMTDsKCiAgYy0+bmV3c2Vzc2lvbiA9IG5ld3Nlc3Npb247IC8qIG5ldyBzZXNzaW9uPyAqLwoKICBpZihmcCkgewogICAgY2hhciAqbGluZXB0cjsKICAgIGJvb2wgaGVhZGVybGluZTsKCiAgICBsaW5lID0gbWFsbG9jKE1BWF9DT09LSUVfTElORSk7CiAgICBpZighbGluZSkKICAgICAgZ290byBmYWlsOwogICAgd2hpbGUoZmdldHMobGluZSwgTUFYX0NPT0tJRV9MSU5FLCBmcCkpIHsKICAgICAgaWYoY2hlY2twcmVmaXgoIlNldC1Db29raWU6IiwgbGluZSkpIHsKICAgICAgICAvKiBUaGlzIGlzIGEgY29va2llIGxpbmUsIGdldCBpdCEgKi8KICAgICAgICBsaW5lcHRyPSZsaW5lWzExXTsKICAgICAgICBoZWFkZXJsaW5lPVRSVUU7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgbGluZXB0cj1saW5lOwogICAgICAgIGhlYWRlcmxpbmU9RkFMU0U7CiAgICAgIH0KICAgICAgd2hpbGUoKmxpbmVwdHIgJiYgSVNCTEFOSygqbGluZXB0cikpCiAgICAgICAgbGluZXB0cisrOwoKICAgICAgQ3VybF9jb29raWVfYWRkKGRhdGEsIGMsIGhlYWRlcmxpbmUsIGxpbmVwdHIsIE5VTEwsIE5VTEwpOwogICAgfQogICAgZnJlZShsaW5lKTsgLyogZnJlZSB0aGUgbGluZSBidWZmZXIgKi8KCiAgICBpZihmcm9tZmlsZSkKICAgICAgZmNsb3NlKGZwKTsKICB9CgogIGMtPnJ1bm5pbmcgPSBUUlVFOyAgICAgICAgICAvKiBub3csIHdlJ3JlIHJ1bm5pbmcgKi8KCiAgcmV0dXJuIGM7CgpmYWlsOgogIGZyZWUobGluZSk7CiAgaWYoIWluYykKICAgIC8qIE9ubHkgY2xlYW4gdXAgaWYgd2UgYWxsb2NhdGVkIGl0IGhlcmUsIGFzIHRoZSBvcmlnaW5hbCBjb3VsZCBzdGlsbCBiZSBpbgogICAgICogdXNlIGJ5IGEgc2hhcmUgaGFuZGxlICovCiAgICBDdXJsX2Nvb2tpZV9jbGVhbnVwKGMpOwogIGlmKGZyb21maWxlICYmIGZwKQogICAgZmNsb3NlKGZwKTsKICByZXR1cm4gTlVMTDsgLyogb3V0IG9mIG1lbW9yeSAqLwp9CgovKiBzb3J0IHRoaXMgc28gdGhhdCB0aGUgbG9uZ2VzdCBwYXRoIGdldHMgYmVmb3JlIHRoZSBzaG9ydGVyIHBhdGggKi8Kc3RhdGljIGludCBjb29raWVfc29ydChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCnsKICBzdHJ1Y3QgQ29va2llICpjMSA9ICooc3RydWN0IENvb2tpZSAqKilwMTsKICBzdHJ1Y3QgQ29va2llICpjMiA9ICooc3RydWN0IENvb2tpZSAqKilwMjsKICBzaXplX3QgbDEsIGwyOwoKICAvKiAxIC0gY29tcGFyZSBjb29raWUgcGF0aCBsZW5ndGhzICovCiAgbDEgPSBjMS0+cGF0aCA/IHN0cmxlbihjMS0+cGF0aCkgOiAwOwogIGwyID0gYzItPnBhdGggPyBzdHJsZW4oYzItPnBhdGgpIDogMDsKCiAgaWYobDEgIT0gbDIpCiAgICByZXR1cm4gKGwyID4gbDEpID8gMSA6IC0xIDsgLyogYXZvaWQgc2l6ZV90IDw9PiBpbnQgY29udmVyc2lvbnMgKi8KCiAgLyogMiAtIGNvbXBhcmUgY29va2llIGRvbWFpbiBsZW5ndGhzICovCiAgbDEgPSBjMS0+ZG9tYWluID8gc3RybGVuKGMxLT5kb21haW4pIDogMDsKICBsMiA9IGMyLT5kb21haW4gPyBzdHJsZW4oYzItPmRvbWFpbikgOiAwOwoKICBpZihsMSAhPSBsMikKICAgIHJldHVybiAobDIgPiBsMSkgPyAxIDogLTEgOyAgLyogYXZvaWQgc2l6ZV90IDw9PiBpbnQgY29udmVyc2lvbnMgKi8KCiAgLyogMyAtIGNvbXBhcmUgY29va2llIG5hbWVzICovCiAgaWYoYzEtPm5hbWUgJiYgYzItPm5hbWUpCiAgICByZXR1cm4gc3RyY21wKGMxLT5uYW1lLCBjMi0+bmFtZSk7CgogIC8qIHNvcnJ5LCBjYW4ndCBiZSBtb3JlIGRldGVybWluaXN0aWMgKi8KICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2dldGxpc3QoKQogKgogKiBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQgdGhlCiAqIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlIGJvb2xlYW4gaW5mb3JtcwogKiB0aGUgY29va2llIGlmIGEgc2VjdXJlIGNvbm5lY3Rpb24gaXMgYWNoaWV2ZWQgb3Igbm90LgogKgogKiBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNlY3VyZSkKewogIHN0cnVjdCBDb29raWUgKm5ld2NvOwogIHN0cnVjdCBDb29raWUgKmNvOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIHN0cnVjdCBDb29raWUgKm1haW5jbz1OVUxMOwogIHNpemVfdCBtYXRjaGVzID0gMDsKICBib29sIGlzX2lwOwoKICBpZighYyB8fCAhYy0+Y29va2llcykKICAgIHJldHVybiBOVUxMOyAvKiBubyBjb29raWUgc3RydWN0IG9yIG5vIGNvb2tpZXMgaW4gdGhlIHN0cnVjdCAqLwoKICAvKiBhdCBmaXJzdCwgcmVtb3ZlIGV4cGlyZWQgY29va2llcyAqLwogIHJlbW92ZV9leHBpcmVkKGMpOwoKICAvKiBjaGVjayBpZiBob3N0IGlzIGFuIElQKHY0fHY2KSBhZGRyZXNzICovCiAgaXNfaXAgPSBpc2lwKGhvc3QpOwoKICBjbyA9IGMtPmNvb2tpZXM7CgogIHdoaWxlKGNvKSB7CiAgICAvKiBvbmx5IHByb2Nlc3MgdGhpcyBjb29raWUgaWYgaXQgaXMgbm90IGV4cGlyZWQgb3IgaGFkIG5vIGV4cGlyZQogICAgICAgZGF0ZSBBTkQgdGhhdCBpZiB0aGUgY29va2llIHJlcXVpcmVzIHdlJ3JlIHNlY3VyZSB3ZSBtdXN0IG9ubHkKICAgICAgIGNvbnRpbnVlIGlmIHdlIGFyZSEgKi8KICAgIGlmKCghY28tPmV4cGlyZXMgfHwgKGNvLT5leHBpcmVzID4gbm93KSkgJiYKICAgICAgIChjby0+c2VjdXJlP3NlY3VyZTpUUlVFKSkgewoKICAgICAgLyogbm93IGNoZWNrIGlmIHRoZSBkb21haW4gaXMgY29ycmVjdCAqLwogICAgICBpZighY28tPmRvbWFpbiB8fAogICAgICAgICAoY28tPnRhaWxtYXRjaCAmJiAhaXNfaXAgJiYgdGFpbG1hdGNoKGNvLT5kb21haW4sIGhvc3QpKSB8fAogICAgICAgICAoKCFjby0+dGFpbG1hdGNoIHx8IGlzX2lwKSAmJiBDdXJsX3Jhd19lcXVhbChob3N0LCBjby0+ZG9tYWluKSkgKSB7CiAgICAgICAgLyogdGhlIHJpZ2h0IHBhcnQgb2YgdGhlIGhvc3QgbWF0Y2hlcyB0aGUgZG9tYWluIHN0dWZmIGluIHRoZQogICAgICAgICAgIGNvb2tpZSBkYXRhICovCgogICAgICAgIC8qIG5vdyBjaGVjayB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBwYXRoIHdpdGggdGhlIGNvb2tpZXMgcGF0aAogICAgICAgICAgIHJlcXVpcmVtZW50ICovCiAgICAgICAgaWYoIWNvLT5zcGF0aCB8fCBwYXRobWF0Y2goY28tPnNwYXRoLCBwYXRoKSApIHsKCiAgICAgICAgICAvKiBhbmQgbm93LCB3ZSBrbm93IHRoaXMgaXMgYSBtYXRjaCBhbmQgd2Ugc2hvdWxkIGNyZWF0ZSBhbgogICAgICAgICAgICAgZW50cnkgZm9yIHRoZSByZXR1cm4tbGlua2VkLWxpc3QgKi8KCiAgICAgICAgICBuZXdjbyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSkpOwogICAgICAgICAgaWYobmV3Y28pIHsKICAgICAgICAgICAgLyogZmlyc3QsIGNvcHkgdGhlIHdob2xlIHNvdXJjZSBjb29raWU6ICovCiAgICAgICAgICAgIG1lbWNweShuZXdjbywgY28sIHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CgogICAgICAgICAgICAvKiB0aGVuIG1vZGlmeSBvdXIgbmV4dCAqLwogICAgICAgICAgICBuZXdjby0+bmV4dCA9IG1haW5jbzsKCiAgICAgICAgICAgIC8qIHBvaW50IHRoZSBtYWluIHRvIHVzICovCiAgICAgICAgICAgIG1haW5jbyA9IG5ld2NvOwoKICAgICAgICAgICAgbWF0Y2hlcysrOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZhaWw6CiAgICAgICAgICAgIC8qIGZhaWx1cmUsIGNsZWFyIHVwIHRoZSBhbGxvY2F0ZWQgY2hhaW4gYW5kIHJldHVybiBOVUxMICovCiAgICAgICAgICAgIHdoaWxlKG1haW5jbykgewogICAgICAgICAgICAgIGNvID0gbWFpbmNvLT5uZXh0OwogICAgICAgICAgICAgIGZyZWUobWFpbmNvKTsKICAgICAgICAgICAgICBtYWluY28gPSBjbzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjbyA9IGNvLT5uZXh0OwogIH0KCiAgaWYobWF0Y2hlcykgewogICAgLyogTm93IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgaXMgYSBuYW1lIGFwcGVhcmluZyBtb3JlIHRoYW4KICAgICAgIG9uY2UsIHRoZSBsb25nZXN0IHNwZWNpZmllZCBwYXRoIHZlcnNpb24gY29tZXMgZmlyc3QuIFRvIG1ha2UgdGhpcwogICAgICAgdGhlIHN3aWZ0ZXN0IHdheSwgd2UganVzdCBzb3J0IHRoZW0gYWxsIGJhc2VkIG9uIHBhdGggbGVuZ3RoLiAqLwogICAgc3RydWN0IENvb2tpZSAqKmFycmF5OwogICAgc2l6ZV90IGk7CgogICAgLyogYWxsb2MgYW4gYXJyYXkgYW5kIHN0b3JlIGFsbCBjb29raWUgcG9pbnRlcnMgKi8KICAgIGFycmF5ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llICopICogbWF0Y2hlcyk7CiAgICBpZighYXJyYXkpCiAgICAgIGdvdG8gZmFpbDsKCiAgICBjbyA9IG1haW5jbzsKCiAgICBmb3IoaT0wOyBjbzsgY28gPSBjby0+bmV4dCkKICAgICAgYXJyYXlbaSsrXSA9IGNvOwoKICAgIC8qIG5vdyBzb3J0IHRoZSBjb29raWUgcG9pbnRlcnMgaW4gcGF0aCBsZW5ndGggb3JkZXIgKi8KICAgIHFzb3J0KGFycmF5LCBtYXRjaGVzLCBzaXplb2Yoc3RydWN0IENvb2tpZSAqKSwgY29va2llX3NvcnQpOwoKICAgIC8qIHJlbWFrZSB0aGUgbGlua2VkIGxpc3Qgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBuZXcgb3JkZXIgKi8KCiAgICBtYWluY28gPSBhcnJheVswXTsgLyogc3RhcnQgaGVyZSAqLwogICAgZm9yKGk9MDsgaTxtYXRjaGVzLTE7IGkrKykKICAgICAgYXJyYXlbaV0tPm5leHQgPSBhcnJheVtpKzFdOwogICAgYXJyYXlbbWF0Y2hlcy0xXS0+bmV4dCA9IE5VTEw7IC8qIHRlcm1pbmF0ZSB0aGUgbGlzdCAqLwoKICAgIGZyZWUoYXJyYXkpOyAvKiByZW1vdmUgdGhlIHRlbXBvcmFyeSBkYXRhIGFnYWluICovCiAgfQoKICByZXR1cm4gbWFpbmNvOyAvKiByZXR1cm4gdGhlIG5ldyBsaXN0ICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9jbGVhcmFsbCgpCiAqCiAqIENsZWFyIGFsbCBleGlzdGluZyBjb29raWVzIGFuZCByZXNldCB0aGUgY291bnRlci4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQ3VybF9jb29raWVfY2xlYXJhbGwoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZXMpCnsKICBpZihjb29raWVzKSB7CiAgICBDdXJsX2Nvb2tpZV9mcmVlbGlzdChjb29raWVzLT5jb29raWVzLCBUUlVFKTsKICAgIGNvb2tpZXMtPmNvb2tpZXMgPSBOVUxMOwogICAgY29va2llcy0+bnVtY29va2llcyA9IDA7CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogQ3VybF9jb29raWVfZnJlZWxpc3QoKQogKgogKiBGcmVlIGEgbGlzdCBvZiBjb29raWVzIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgQ3VybF9jb29raWVfZ2V0bGlzdCgpOwogKgogKiBUaGUgJ2Nvb2tpZXN0b28nIGFyZ3VtZW50IHRlbGxzIHRoaXMgZnVuY3Rpb24gd2hldGhlciB0byBqdXN0IGZyZWUgdGhlCiAqIGxpc3Qgb3IgYWN0dWFsbHkgYWxzbyBmcmVlIGFsbCBjb29raWVzIHdpdGhpbiB0aGUgbGlzdCBhcyB3ZWxsLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgQ3VybF9jb29raWVfZnJlZWxpc3Qoc3RydWN0IENvb2tpZSAqY28sIGJvb2wgY29va2llc3RvbykKewogIHN0cnVjdCBDb29raWUgKm5leHQ7CiAgd2hpbGUoY28pIHsKICAgIG5leHQgPSBjby0+bmV4dDsKICAgIGlmKGNvb2tpZXN0b28pCiAgICAgIGZyZWVjb29raWUoY28pOwogICAgZWxzZQogICAgICBmcmVlKGNvKTsgLyogd2Ugb25seSBmcmVlIHRoZSBzdHJ1Y3Qgc2luY2UgdGhlICJtZW1iZXJzIiBhcmUgYWxsIGp1c3QKICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgb3V0IGluIHRoZSBtYWluIGNvb2tpZSBsaXN0ISAqLwogICAgY28gPSBuZXh0OwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9jbGVhcnNlc3MoKQogKgogKiBGcmVlIGFsbCBzZXNzaW9uIGNvb2tpZXMgaW4gdGhlIGNvb2tpZXMgbGlzdC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQ3VybF9jb29raWVfY2xlYXJzZXNzKHN0cnVjdCBDb29raWVJbmZvICpjb29raWVzKQp7CiAgc3RydWN0IENvb2tpZSAqZmlyc3QsICpjdXJyLCAqbmV4dCwgKnByZXYgPSBOVUxMOwoKICBpZighY29va2llcyB8fCAhY29va2llcy0+Y29va2llcykKICAgIHJldHVybjsKCiAgZmlyc3QgPSBjdXJyID0gcHJldiA9IGNvb2tpZXMtPmNvb2tpZXM7CgogIGZvcig7IGN1cnI7IGN1cnIgPSBuZXh0KSB7CiAgICBuZXh0ID0gY3Vyci0+bmV4dDsKICAgIGlmKCFjdXJyLT5leHBpcmVzKSB7CiAgICAgIGlmKGZpcnN0ID09IGN1cnIpCiAgICAgICAgZmlyc3QgPSBuZXh0OwoKICAgICAgaWYocHJldiA9PSBjdXJyKQogICAgICAgIHByZXYgPSBuZXh0OwogICAgICBlbHNlCiAgICAgICAgcHJldi0+bmV4dCA9IG5leHQ7CgogICAgICBmcmVlY29va2llKGN1cnIpOwogICAgICBjb29raWVzLT5udW1jb29raWVzLS07CiAgICB9CiAgICBlbHNlCiAgICAgIHByZXYgPSBjdXJyOwogIH0KCiAgY29va2llcy0+Y29va2llcyA9IGZpcnN0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFudXAoKQogKgogKiBGcmVlIGEgImNvb2tpZSBvYmplY3QiIHByZXZpb3VzIGNyZWF0ZWQgd2l0aCBDdXJsX2Nvb2tpZV9pbml0KCkuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEN1cmxfY29va2llX2NsZWFudXAoc3RydWN0IENvb2tpZUluZm8gKmMpCnsKICBpZihjKSB7CiAgICBmcmVlKGMtPmZpbGVuYW1lKTsKICAgIEN1cmxfY29va2llX2ZyZWVsaXN0KGMtPmNvb2tpZXMsIFRSVUUpOwogICAgZnJlZShjKTsgLyogZnJlZSB0aGUgYmFzZSBzdHJ1Y3QgYXMgd2VsbCAqLwogIH0KfQoKLyogZ2V0X25ldHNjYXBlX2Zvcm1hdCgpCiAqCiAqIEZvcm1hdHMgYSBzdHJpbmcgZm9yIE5ldHNjYXBlIG91dHB1dCBmaWxlLCB3L28gYSBuZXdsaW5lIGF0IHRoZSBlbmQuCiAqCiAqIEZ1bmN0aW9uIHJldHVybnMgYSBjaGFyICogdG8gYSBmb3JtYXR0ZWQgbGluZS4gSGFzIHRvIGJlIGZyZWUoKWQKKi8Kc3RhdGljIGNoYXIgKmdldF9uZXRzY2FwZV9mb3JtYXQoY29uc3Qgc3RydWN0IENvb2tpZSAqY28pCnsKICByZXR1cm4gYXByaW50ZigKICAgICIlcyIgICAgIC8qIGh0dHBvbmx5IHByZWFtYmxlICovCiAgICAiJXMlc1x0IiAvKiBkb21haW4gKi8KICAgICIlc1x0IiAgIC8qIHRhaWxtYXRjaCAqLwogICAgIiVzXHQiICAgLyogcGF0aCAqLwogICAgIiVzXHQiICAgLyogc2VjdXJlICovCiAgICAiJSIgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAiXHQiICAgLyogZXhwaXJlcyAqLwogICAgIiVzXHQiICAgLyogbmFtZSAqLwogICAgIiVzIiwgICAgLyogdmFsdWUgKi8KICAgIGNvLT5odHRwb25seT8iI0h0dHBPbmx5XyI6IiIsCiAgICAvKiBNYWtlIHN1cmUgYWxsIGRvbWFpbnMgYXJlIHByZWZpeGVkIHdpdGggYSBkb3QgaWYgdGhleSBhbGxvdwogICAgICAgdGFpbG1hdGNoaW5nLiBUaGlzIGlzIE1vemlsbGEtc3R5bGUuICovCiAgICAoY28tPnRhaWxtYXRjaCAmJiBjby0+ZG9tYWluICYmIGNvLT5kb21haW5bMF0gIT0gJy4nKT8gIi4iOiIiLAogICAgY28tPmRvbWFpbj9jby0+ZG9tYWluOiJ1bmtub3duIiwKICAgIGNvLT50YWlsbWF0Y2g/IlRSVUUiOiJGQUxTRSIsCiAgICBjby0+cGF0aD9jby0+cGF0aDoiLyIsCiAgICBjby0+c2VjdXJlPyJUUlVFIjoiRkFMU0UiLAogICAgY28tPmV4cGlyZXMsCiAgICBjby0+bmFtZSwKICAgIGNvLT52YWx1ZT9jby0+dmFsdWU6IiIpOwp9CgovKgogKiBjb29raWVfb3V0cHV0KCkKICoKICogV3JpdGVzIGFsbCBpbnRlcm5hbGx5IGtub3duIGNvb2tpZXMgdG8gdGhlIHNwZWNpZmllZCBmaWxlLiBTcGVjaWZ5CiAqICItIiBhcyBmaWxlIG5hbWUgdG8gd3JpdGUgdG8gc3Rkb3V0LgogKgogKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBvbiB3cml0ZSBmYWlsdXJlLgogKi8Kc3RhdGljIGludCBjb29raWVfb3V0cHV0KHN0cnVjdCBDb29raWVJbmZvICpjLCBjb25zdCBjaGFyICpkdW1waGVyZSkKewogIHN0cnVjdCBDb29raWUgKmNvOwogIEZJTEUgKm91dDsKICBib29sIHVzZV9zdGRvdXQ9RkFMU0U7CgogIGlmKChOVUxMID09IGMpIHx8ICgwID09IGMtPm51bWNvb2tpZXMpKQogICAgLyogSWYgdGhlcmUgYXJlIG5vIGtub3duIGNvb2tpZXMsIHdlIGRvbid0IHdyaXRlIG9yIGV2ZW4gY3JlYXRlIGFueQogICAgICAgZGVzdGluYXRpb24gZmlsZSAqLwogICAgcmV0dXJuIDA7CgogIC8qIGF0IGZpcnN0LCByZW1vdmUgZXhwaXJlZCBjb29raWVzICovCiAgcmVtb3ZlX2V4cGlyZWQoYyk7CgogIGlmKHN0cmVxdWFsKCItIiwgZHVtcGhlcmUpKSB7CiAgICAvKiB1c2Ugc3Rkb3V0ICovCiAgICBvdXQgPSBzdGRvdXQ7CiAgICB1c2Vfc3Rkb3V0PVRSVUU7CiAgfQogIGVsc2UgewogICAgb3V0ID0gZm9wZW4oZHVtcGhlcmUsIEZPUEVOX1dSSVRFVEVYVCk7CiAgICBpZighb3V0KQogICAgICByZXR1cm4gMTsgLyogZmFpbHVyZSAqLwogIH0KCiAgaWYoYykgewogICAgY2hhciAqZm9ybWF0X3B0cjsKCiAgICBmcHV0cygiIyBOZXRzY2FwZSBIVFRQIENvb2tpZSBGaWxlXG4iCiAgICAgICAgICAiIyBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvaHR0cC1jb29raWVzLmh0bWxcbiIKICAgICAgICAgICIjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGxpYmN1cmwhIEVkaXQgYXQgeW91ciBvd24gcmlzay5cblxuIiwKICAgICAgICAgIG91dCk7CiAgICBjbyA9IGMtPmNvb2tpZXM7CgogICAgd2hpbGUoY28pIHsKICAgICAgaWYoIWNvLT5kb21haW4pCiAgICAgICAgY29udGludWU7CiAgICAgIGZvcm1hdF9wdHIgPSBnZXRfbmV0c2NhcGVfZm9ybWF0KGNvKTsKICAgICAgaWYoZm9ybWF0X3B0ciA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihvdXQsICIjXG4jIEZhdGFsIGxpYmN1cmwgZXJyb3JcbiIpOwogICAgICAgIGlmKCF1c2Vfc3Rkb3V0KQogICAgICAgICAgZmNsb3NlKG91dCk7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgICAgZnByaW50ZihvdXQsICIlc1xuIiwgZm9ybWF0X3B0cik7CiAgICAgIGZyZWUoZm9ybWF0X3B0cik7CiAgICAgIGNvPWNvLT5uZXh0OwogICAgfQogIH0KCiAgaWYoIXVzZV9zdGRvdXQpCiAgICBmY2xvc2Uob3V0KTsKCiAgcmV0dXJuIDA7Cn0KCnN0cnVjdCBjdXJsX3NsaXN0ICpDdXJsX2Nvb2tpZV9saXN0KHN0cnVjdCBTZXNzaW9uSGFuZGxlICpkYXRhKQp7CiAgc3RydWN0IGN1cmxfc2xpc3QgKmxpc3QgPSBOVUxMOwogIHN0cnVjdCBjdXJsX3NsaXN0ICpiZWc7CiAgc3RydWN0IENvb2tpZSAqYzsKICBjaGFyICpsaW5lOwoKICBpZigoZGF0YS0+Y29va2llcyA9PSBOVUxMKSB8fAogICAgICAoZGF0YS0+Y29va2llcy0+bnVtY29va2llcyA9PSAwKSkKICAgIHJldHVybiBOVUxMOwoKICBjID0gZGF0YS0+Y29va2llcy0+Y29va2llczsKCiAgd2hpbGUoYykgewogICAgaWYoIWMtPmRvbWFpbikKICAgICAgY29udGludWU7CiAgICBsaW5lID0gZ2V0X25ldHNjYXBlX2Zvcm1hdChjKTsKICAgIGlmKCFsaW5lKSB7CiAgICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwobGlzdCk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgYmVnID0gQ3VybF9zbGlzdF9hcHBlbmRfbm9kdXAobGlzdCwgbGluZSk7CiAgICBpZighYmVnKSB7CiAgICAgIGZyZWUobGluZSk7CiAgICAgIGN1cmxfc2xpc3RfZnJlZV9hbGwobGlzdCk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbGlzdCA9IGJlZzsKICAgIGMgPSBjLT5uZXh0OwogIH0KCiAgcmV0dXJuIGxpc3Q7Cn0KCnZvaWQgQ3VybF9mbHVzaF9jb29raWVzKHN0cnVjdCBTZXNzaW9uSGFuZGxlICpkYXRhLCBpbnQgY2xlYW51cCkKewogIGlmKGRhdGEtPnNldC5zdHJbU1RSSU5HX0NPT0tJRUpBUl0pIHsKICAgIGlmKGRhdGEtPmNoYW5nZS5jb29raWVsaXN0KSB7CiAgICAgIC8qIElmIHRoZXJlIGlzIGEgbGlzdCBvZiBjb29raWUgZmlsZXMgdG8gcmVhZCwgZG8gaXQgZmlyc3Qgc28gdGhhdAogICAgICAgICB3ZSBoYXZlIGFsbCB0aGUgdG9sZCBmaWxlcyByZWFkIGJlZm9yZSB3ZSB3cml0ZSB0aGUgbmV3IGphci4KICAgICAgICAgQ3VybF9jb29raWVfbG9hZGZpbGVzKCkgTE9DS1MgYW5kIFVOTE9DS1MgdGhlIHNoYXJlIGl0c2VsZiEgKi8KICAgICAgQ3VybF9jb29raWVfbG9hZGZpbGVzKGRhdGEpOwogICAgfQoKICAgIEN1cmxfc2hhcmVfbG9jayhkYXRhLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUsIENVUkxfTE9DS19BQ0NFU1NfU0lOR0xFKTsKCiAgICAvKiBpZiB3ZSBoYXZlIGEgZGVzdGluYXRpb24gZmlsZSBmb3IgYWxsIHRoZSBjb29raWVzIHRvIGdldCBkdW1wZWQgdG8gKi8KICAgIGlmKGNvb2tpZV9vdXRwdXQoZGF0YS0+Y29va2llcywgZGF0YS0+c2V0LnN0cltTVFJJTkdfQ09PS0lFSkFSXSkpCiAgICAgIGluZm9mKGRhdGEsICJXQVJOSU5HOiBmYWlsZWQgdG8gc2F2ZSBjb29raWVzIGluICVzXG4iLAogICAgICAgICAgICBkYXRhLT5zZXQuc3RyW1NUUklOR19DT09LSUVKQVJdKTsKICB9CiAgZWxzZSB7CiAgICBpZihjbGVhbnVwICYmIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0KSB7CiAgICAgIC8qIHNpbmNlIG5vdGhpbmcgaXMgd3JpdHRlbiwgd2UgY2FuIGp1c3QgZnJlZSB0aGUgbGlzdCBvZiBjb29raWUgZmlsZQogICAgICAgICBuYW1lcyAqLwogICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGRhdGEtPmNoYW5nZS5jb29raWVsaXN0KTsgLyogY2xlYW4gdXAgbGlzdCAqLwogICAgICBkYXRhLT5jaGFuZ2UuY29va2llbGlzdCA9IE5VTEw7CiAgICB9CiAgICBDdXJsX3NoYXJlX2xvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFLCBDVVJMX0xPQ0tfQUNDRVNTX1NJTkdMRSk7CiAgfQoKICBpZihjbGVhbnVwICYmICghZGF0YS0+c2hhcmUgfHwgKGRhdGEtPmNvb2tpZXMgIT0gZGF0YS0+c2hhcmUtPmNvb2tpZXMpKSkgewogICAgQ3VybF9jb29raWVfY2xlYW51cChkYXRhLT5jb29raWVzKTsKICB9CiAgQ3VybF9zaGFyZV91bmxvY2soZGF0YSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFKTsKfQoKI2VuZGlmIC8qIENVUkxfRElTQUJMRV9IVFRQIHx8IENVUkxfRElTQUJMRV9DT09LSUVTICovCg==