LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfICAgXyBfX19fICBfICAgICAKICogIFByb2plY3QgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8ICAgIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChfX3wgfF98IHwgIF8gPHwgfF9fXyAKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CiAqCiAqIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMDMsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgYXMgZGVzY3JpYmVkIGluIHRoZSBmaWxlIENPUFlJTkcsIHdoaWNoCiAqIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKICogYXJlIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KICogCiAqIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENPUFlJTkcgZmlsZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQogKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKgogKiAkSWQkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqCgoKUkVDRUlWSU5HIENPT0tJRSBJTkZPUk1BVElPTgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llX2luaXQoY2hhciAqZmlsZSk7CgkKCUluaXRzIGEgY29va2llIHN0cnVjdCB0byBzdG9yZSBkYXRhIGluIGEgbG9jYWwgZmlsZS4gVGhpcyBpcyBhbHdheXMKCWNhbGxlZCBiZWZvcmUgYW55IGNvb2tpZXMgYXJlIHNldC4KCmludCBjb29raWVzX3NldChzdHJ1Y3QgQ29va2llSW5mbyAqY29va2llLCBjaGFyICpjb29raWVfbGluZSk7CgoJVGhlICdjb29raWVfbGluZScgcGFyYW1ldGVyIGlzIGEgZnVsbCAiU2V0LWNvb2tpZToiIGxpbmUgYXMKCXJlY2VpdmVkIGZyb20gYSBzZXJ2ZXIuCgoJVGhlIGZ1bmN0aW9uIG5lZWQgdG8gcmVwbGFjZSBwcmV2aW91c2x5IHN0b3JlZCBsaW5lcyB0aGF0IHRoaXMgbmV3CglsaW5lIHN1cGVyY2VlZHMuCgoJSXQgbWF5IHJlbW92ZSBsaW5lcyB0aGF0IGFyZSBleHBpcmVkLgoKCUl0IHNob3VsZCByZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiBzdWNjZXNzL2Vycm9yLgoKClNFTkRJTkcgQ09PS0lFIElORk9STUFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdHJ1Y3QgQ29va2llcyAqY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3QsIGNoYXIgKnBhdGgsIGJvb2wgc2VjdXJlKTsKCglGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQKCXRoZSBjbGllbnQgc2hvdWxkIHNlbmQgdG8gdGhlIHNlcnZlciBpZiB1c2VkIG5vdy4gVGhlIHNlY3VyZQoJYm9vbGVhbiBpbmZvcm1zIHRoZSBjb29raWUgaWYgYSBzZWN1cmUgY29ubmVjdGlvbiBpcyBhY2hpZXZlZCBvcgoJbm90LgoKCUl0IHNoYWxsIG9ubHkgcmV0dXJuIGNvb2tpZXMgdGhhdCBoYXZlbid0IGV4cGlyZWQuCgogICAgCkV4YW1wbGUgc2V0IG9mIGNvb2tpZXM6CiAgICAKICAgIFNldC1jb29raWU6IFBST0RVQ1RJTkZPPXdlYnhwcmVzczsgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBQRVJTT05BTElaRT1ub25lO2V4cGlyZXM9TW9uZGF5LCAxMy1KdW4tMTk4OCAwMzowNDo1NSBHTVQ7CiAgICBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vZnRndzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBGaWRIaXN0PW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRmlkT3JkZXI9bm9uZTtleHBpcmVzPU1vbmRheSwgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOwogICAgZG9tYWluPS5maWRlbGl0eS5jb207IHBhdGg9Lzsgc2VjdXJlCiAgICBTZXQtY29va2llOiBEaXNQZW5kPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZTogRmlkRGlzPW5vbmU7ZXhwaXJlcz1Nb25kYXksIDEzLUp1bi0xOTg4IDAzOjA0OjU1IEdNVDsKICAgIGRvbWFpbj0uZmlkZWxpdHkuY29tOyBwYXRoPS87IHNlY3VyZQogICAgU2V0LWNvb2tpZToKICAgIFNlc3Npb25fS2V5QDY3OTFhOWUwLTkwMWEtMTFkMC1hMWM4LTliMDEyYzg4YWE3Nz1ub25lO2V4cGlyZXM9TW9uZGF5LAogICAgMTMtSnVuLTE5ODggMDM6MDQ6NTUgR01UOyBkb21haW49LmZpZGVsaXR5LmNvbTsgcGF0aD0vOyBzZWN1cmUKKioqKi8KCgojaW5jbHVkZSAic2V0dXAuaCIKCiNpZm5kZWYgQ1VSTF9ESVNBQkxFX0hUVFAKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCiNpbmNsdWRlICJ1cmxkYXRhLmgiCiNpbmNsdWRlICJjb29raWUuaCIKI2luY2x1ZGUgImdldGRhdGUuaCIKI2luY2x1ZGUgInN0cmVxdWFsLmgiCiNpbmNsdWRlICJzdHJ0b2suaCIKI2luY2x1ZGUgInNlbmRmLmgiCgovKiBUaGUgbGFzdCAjaW5jbHVkZSBmaWxlIHNob3VsZCBiZTogKi8KI2lmZGVmIENVUkxERUJVRwojaW5jbHVkZSAibWVtZGVidWcuaCIKI2VuZGlmCgpzdGF0aWMgdm9pZApmcmVlX2Nvb2tpZW1lc3Moc3RydWN0IENvb2tpZSAqY28pCnsKICBpZihjby0+ZG9tYWluKQogICAgZnJlZShjby0+ZG9tYWluKTsKICBpZihjby0+cGF0aCkKICAgIGZyZWUoY28tPnBhdGgpOwogIGlmKGNvLT5uYW1lKQogICAgZnJlZShjby0+bmFtZSk7CiAgaWYoY28tPnZhbHVlKQogICAgZnJlZShjby0+dmFsdWUpOwoKICBmcmVlKGNvKTsKfQoKc3RhdGljIGJvb2wgdGFpbG1hdGNoKGNvbnN0IGNoYXIgKmxpdHRsZSwgY29uc3QgY2hhciAqYmlnb25lKQp7CiAgdW5zaWduZWQgaW50IGxpdHRsZWxlbiA9IHN0cmxlbihsaXR0bGUpOwogIHVuc2lnbmVkIGludCBiaWdsZW4gPSBzdHJsZW4oYmlnb25lKTsKCiAgaWYobGl0dGxlbGVuID4gYmlnbGVuKQogICAgcmV0dXJuIEZBTFNFOwoKICByZXR1cm4gc3RyZXF1YWwobGl0dGxlLCBiaWdvbmUrYmlnbGVuLWxpdHRsZWxlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2FkZCgpCiAqCiAqIEFkZCBhIHNpbmdsZSBjb29raWUgbGluZSB0byB0aGUgY29va2llIGtlZXBpbmcgb2JqZWN0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RydWN0IENvb2tpZSAqCkN1cmxfY29va2llX2FkZChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKICAgICAgICAgICAgICAgIC8qIFRoZSAnZGF0YScgcG9pbnRlciBoZXJlIG1heSBiZSBOVUxMIGF0IHRpbWVzLCBhbmQgdGh1cwogICAgICAgICAgICAgICAgICAgbXVzdCBvbmx5IGJlIHVzZWQgdmVyeSBjYXJlZnVsbHkgZm9yIHRoaW5ncyB0aGF0IGNhbiBkZWFsCiAgICAgICAgICAgICAgICAgICB3aXRoIGRhdGEgYmVpbmcgTlVMTC4gU3VjaCBhcyBpbmZvZigpIGFuZCBzaW1pbGFyICovCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBDb29raWVJbmZvICpjLAogICAgICAgICAgICAgICAgYm9vbCBodHRwaGVhZGVyLCAvKiBUUlVFIGlmIEhUVFAgaGVhZGVyLXN0eWxlIGxpbmUgKi8KICAgICAgICAgICAgICAgIGNoYXIgKmxpbmVwdHIsICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lICovCiAgICAgICAgICAgICAgICBjaGFyICpkb21haW4sICAgIC8qIGRlZmF1bHQgZG9tYWluICovCiAgICAgICAgICAgICAgICBjaGFyICpwYXRoKSAgICAgIC8qIGZ1bGwgcGF0aCB1c2VkIHdoZW4gdGhpcyBjb29raWUgaXMgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGdldCBkZWZhdWx0IHBhdGggZm9yIHRoZSBjb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHNldCAqLwp7CiAgc3RydWN0IENvb2tpZSAqY2xpc3Q7CiAgY2hhciB3aGF0W01BWF9DT09LSUVfTElORV07CiAgY2hhciBuYW1lW01BWF9OQU1FXTsKICBjaGFyICpwdHI7CiAgY2hhciAqc2VtaXB0cjsKICBzdHJ1Y3QgQ29va2llICpjbzsKICBzdHJ1Y3QgQ29va2llICpsYXN0Yz1OVUxMOwogIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwogIGJvb2wgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICBib29sIGJhZGNvb2tpZSA9IEZBTFNFOyAvKiBjb29raWVzIGFyZSBnb29kIGJ5IGRlZmF1bHQuIG1tbW1tIHl1bW15ICovCgogIC8qIEZpcnN0LCBhbGxvYyBhbmQgaW5pdCBhIG5ldyBzdHJ1Y3QgZm9yIGl0ICovCiAgY28gPSAoc3RydWN0IENvb2tpZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSkpOwogIGlmKCFjbykKICAgIHJldHVybiBOVUxMOyAvKiBiYWlsIG91dCBpZiB3ZSdyZSB0aGlzIGxvdyBvbiBtZW1vcnkgKi8KCiAgLyogY2xlYXIgdGhlIHdob2xlIHN0cnVjdCBmaXJzdCAqLwogIG1lbXNldChjbywgMCwgc2l6ZW9mKHN0cnVjdCBDb29raWUpKTsKCSAgICAKICBpZihodHRwaGVhZGVyKSB7CiAgICAvKiBUaGlzIGxpbmUgd2FzIHJlYWQgb2ZmIGEgSFRUUC1oZWFkZXIgKi8KICAgIGNoYXIgKnNlcDsKICAgIHNlbWlwdHI9c3RyY2hyKGxpbmVwdHIsICc7Jyk7IC8qIGZpcnN0LCBmaW5kIGEgc2VtaWNvbG9uICovCgogICAgd2hpbGUoKmxpbmVwdHIgJiYgaXNzcGFjZSgoaW50KSpsaW5lcHRyKSkKICAgICAgbGluZXB0cisrOwoKICAgIHB0ciA9IGxpbmVwdHI7CiAgICBkbyB7CiAgICAgIC8qIHdlIGhhdmUgYSA8d2hhdD49PHRoaXM+IHBhaXIgb3IgYSAnc2VjdXJlJyB3b3JkIGhlcmUgKi8KICAgICAgc2VwID0gc3RyY2hyKHB0ciwgJz0nKTsKICAgICAgaWYoc2VwICYmICghc2VtaXB0ciB8fCAoc2VtaXB0cj5zZXApKSApIHsKICAgICAgICAvKgogICAgICAgICAqIFRoZXJlIGlzIGEgPSBzaWduIGFuZCBpZiB0aGVyZSB3YXMgYSBzZW1pY29sb24gdG9vLCB3aGljaCBtYWtlIHN1cmUKICAgICAgICAgKiB0aGF0IHRoZSBzZW1pY29sb24gY29tZXMgX2FmdGVyXyB0aGUgZXF1YWwgc2lnbi4KICAgICAgICAgKi8KCiAgICAgICAgbmFtZVswXT13aGF0WzBdPTA7IC8qIGluaXQgdGhlIGJ1ZmZlcnMgKi8KICAgICAgICBpZigxIDw9IHNzY2FuZihwdHIsICIlIiBNQVhfTkFNRV9UWFQgIlteOz1dPSUiCiAgICAgICAgICAgICAgICAgICAgICAgTUFYX0NPT0tJRV9MSU5FX1RYVCAiW147XHJcbl0iLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHdoYXQpKSB7CiAgICAgICAgICAvKiB0aGlzIGlzIGEgPG5hbWU+PTx3aGF0PiBwYWlyICovCgogICAgICAgICAgY2hhciAqd2hhdHB0cjsKCiAgICAgICAgICAvKiBTdHJpcCBvZmYgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSAnd2hhdCcgKi8KICAgICAgICAgIGludCBsZW49c3RybGVuKHdoYXQpOwogICAgICAgICAgd2hpbGUobGVuICYmIGlzc3BhY2UoKGludCl3aGF0W2xlbi0xXSkpIHsKICAgICAgICAgICAgd2hhdFtsZW4tMV09MDsKICAgICAgICAgICAgbGVuLS07CiAgICAgICAgICB9CgogICAgICAgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgJ3doYXQnICovCiAgICAgICAgICB3aGF0cHRyPXdoYXQ7CiAgICAgICAgICB3aGlsZShpc3NwYWNlKChpbnQpKndoYXRwdHIpKSB7CiAgICAgICAgICAgIHdoYXRwdHIrKzsKICAgICAgICAgIH0KCiAgICAgICAgICBpZihzdHJlcXVhbCgicGF0aCIsIG5hbWUpKSB7CiAgICAgICAgICAgIGNvLT5wYXRoPXN0cmR1cCh3aGF0cHRyKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoc3RyZXF1YWwoImRvbWFpbiIsIG5hbWUpKSB7CiAgICAgICAgICAgIC8qIG5vdGUgdGhhdCB0aGlzIG5hbWUgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHByZWNlZWRpbmcgZG90LCBidXQKICAgICAgICAgICAgICAgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0LCB3ZSB0cmVhdCB0aGUgbmFtZXMgdGhlIHNhbWUgYW55d2F5ICovCgogICAgICAgICAgICBjaGFyICpwdHI9d2hhdHB0cjsKICAgICAgICAgICAgaW50IGRvdGNvdW50PTE7CiAgICAgICAgICAgIHVuc2lnbmVkIGludCBpOwoKICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnNldmVudGhyZWVbXT0gewogICAgICAgICAgICAgICJjb20iLCAiZWR1IiwgIm5ldCIsICJvcmciLCAiZ292IiwgIm1pbCIsICJpbnQiCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvKiBDb3VudCB0aGUgZG90cywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgVEhSRUUgZG90cwogICAgICAgICAgICAgICBpbiB0aGUgbm9ybWFsIGRvbWFpbnMsIG9yIFRXTyBpbiB0aGUgc2V2ZW50aHJlZS1kb21haW5zLiAqLwoKICAgICAgICAgICAgaWYoJy4nID09IHdoYXRwdHJbMF0pCiAgICAgICAgICAgICAgLyogZG9uJ3QgY291bnQgdGhlIGluaXRpYWwgZG90LCBhc3N1bWUgaXQgKi8KICAgICAgICAgICAgICBwdHIrKzsKCiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICBwdHIgPSBzdHJjaHIocHRyLCAnLicpOwogICAgICAgICAgICAgIGlmKHB0cikgewogICAgICAgICAgICAgICAgcHRyKys7CiAgICAgICAgICAgICAgICBkb3Rjb3VudCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZShwdHIpOwoKICAgICAgICAgICAgZm9yKGk9MDsKICAgICAgICAgICAgICAgIGk8c2l6ZW9mKHNldmVudGhyZWUpL3NpemVvZihzZXZlbnRocmVlWzBdKTsgaSsrKSB7CiAgICAgICAgICAgICAgaWYodGFpbG1hdGNoKHNldmVudGhyZWVbaV0sIHdoYXRwdHIpKSB7CiAgICAgICAgICAgICAgICBkb3Rjb3VudCsrOyAvKiB3ZSBhbGxvdyBvbmUgZG90IGxlc3MgZm9yIHRoZXNlICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogVGhlIG9yaWdpbmFsIE5ldHNjYXBlIGNvb2tpZSBzcGVjIGRlZmluZWQgdGhhdCB0aGlzIGRvbWFpbiBuYW1lCiAgICAgICAgICAgICAgIE1VU1QgaGF2ZSB0aHJlZSBkb3RzIChvciB0d28gaWYgb25lIG9mIHRoZSBzZXZlbiBob2x5IFRMRHMpLAogICAgICAgICAgICAgICBidXQgaXQgc2VlbXMgdGhhdCB0aGVzZSBraW5kcyBvZiBjb29raWVzIGFyZSBpbiB1c2UgIm91dCB0aGVyZSIKICAgICAgICAgICAgICAgc28gd2UgY2Fubm90IGJlIHRoYXQgc3RyaWN0LiBJJ3ZlIHRoZXJlZm9yZSBsb3dlcmVkIHRoZSBjaGVjawogICAgICAgICAgICAgICB0byBub3QgYWxsb3cgbGVzcyB0aGFuIHR3byBkb3RzLiAqLwogICAgICAgICAgICAKICAgICAgICAgICAgaWYoZG90Y291bnQgPCAyKSB7CiAgICAgICAgICAgICAgLyogUmVjZWl2ZWQgYW5kIHNraXBwZWQgYSBjb29raWUgd2l0aCBhIGRvbWFpbiB1c2luZyB0b28gZmV3CiAgICAgICAgICAgICAgICAgZG90cy4gKi8KICAgICAgICAgICAgICBiYWRjb29raWU9VFJVRTsgLyogbWFyayB0aGlzIGFzIGEgYmFkIGNvb2tpZSAqLwogICAgICAgICAgICAgIGluZm9mKGRhdGEsICJza2lwcGVkIGNvb2tpZSB3aXRoIGlsbGVnYWwgZG90Y291bnQgZG9tYWluOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgd2hhdHB0cik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgLyogTm93LCB3ZSBtYWtlIHN1cmUgdGhhdCBvdXIgaG9zdCBpcyB3aXRoaW4gdGhlIGdpdmVuIGRvbWFpbiwKICAgICAgICAgICAgICAgICBvciB0aGUgZ2l2ZW4gZG9tYWluIGlzIG5vdCB2YWxpZCBhbmQgdGh1cyBjYW5ub3QgYmUgc2V0LiAqLwoKICAgICAgICAgICAgICBpZighZG9tYWluIHx8IHRhaWxtYXRjaCh3aGF0cHRyLCBkb21haW4pKSB7CiAgICAgICAgICAgICAgICBjaGFyICpwdHI9d2hhdHB0cjsKICAgICAgICAgICAgICAgIGlmKHB0clswXSA9PSAnLicpCiAgICAgICAgICAgICAgICAgIHB0cisrOwogICAgICAgICAgICAgICAgY28tPmRvbWFpbj1zdHJkdXAocHRyKTsgLyogZG9udCBwcmVmaXggd2l0aCBkb3RzIGludGVybmFsbHkgKi8KICAgICAgICAgICAgICAgIGNvLT50YWlsbWF0Y2g9VFJVRTsgLyogd2UgYWx3YXlzIGRvIHRoYXQgaWYgdGhlIGRvbWFpbiBuYW1lIHdhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiAqLwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qIHdlIGRpZCBub3QgZ2V0IGEgdGFpbG1hdGNoIGFuZCB0aGVuIHRoZSBhdHRlbXB0ZWQgc2V0IGRvbWFpbgogICAgICAgICAgICAgICAgICAgaXMgbm90IGEgZG9tYWluIHRvIHdoaWNoIHRoZSBjdXJyZW50IGhvc3QgYmVsb25ncy4gTWFyayBhcwogICAgICAgICAgICAgICAgICAgYmFkLiAqLwogICAgICAgICAgICAgICAgYmFkY29va2llPVRSVUU7CiAgICAgICAgICAgICAgICBpbmZvZihkYXRhLCAic2tpcHBlZCBjb29raWUgd2l0aCBiYWQgdGFpbG1hdGNoIGRvbWFpbjogJXMiLAogICAgICAgICAgICAgICAgICAgICAgd2hhdHB0cik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKHN0cmVxdWFsKCJ2ZXJzaW9uIiwgbmFtZSkpIHsKICAgICAgICAgICAgY28tPnZlcnNpb249c3RyZHVwKHdoYXRwdHIpOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZihzdHJlcXVhbCgibWF4LWFnZSIsIG5hbWUpKSB7CiAgICAgICAgICAgIC8qIERlZmluZWQgaW4gUkZDMjEwOToKCiAgICAgICAgICAgICAgIE9wdGlvbmFsLiAgVGhlIE1heC1BZ2UgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxpZmV0aW1lIG9mIHRoZQogICAgICAgICAgICAgICBjb29raWUsIGluIHNlY29uZHMuICBUaGUgZGVsdGEtc2Vjb25kcyB2YWx1ZSBpcyBhIGRlY2ltYWwgbm9uLQogICAgICAgICAgICAgICBuZWdhdGl2ZSBpbnRlZ2VyLiAgQWZ0ZXIgZGVsdGEtc2Vjb25kcyBzZWNvbmRzIGVsYXBzZSwgdGhlCiAgICAgICAgICAgICAgIGNsaWVudCBzaG91bGQgZGlzY2FyZCB0aGUgY29va2llLiAgQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoZQogICAgICAgICAgICAgICBjb29raWUgc2hvdWxkIGJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseS4KCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjby0+bWF4YWdlID0gc3RyZHVwKHdoYXRwdHIpOwogICAgICAgICAgICBjby0+ZXhwaXJlcyA9CiAgICAgICAgICAgICAgYXRvaSgoKmNvLT5tYXhhZ2U9PSdcIicpPyZjby0+bWF4YWdlWzFdOiZjby0+bWF4YWdlWzBdKSArIG5vdzsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYoc3RyZXF1YWwoImV4cGlyZXMiLCBuYW1lKSkgewogICAgICAgICAgICBjby0+ZXhwaXJlc3RyPXN0cmR1cCh3aGF0cHRyKTsKICAgICAgICAgICAgY28tPmV4cGlyZXMgPSBjdXJsX2dldGRhdGUod2hhdCwgJm5vdyk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKCFjby0+bmFtZSkgewogICAgICAgICAgICBjby0+bmFtZSA9IHN0cmR1cChuYW1lKTsKICAgICAgICAgICAgY28tPnZhbHVlID0gc3RyZHVwKHdoYXRwdHIpOwogICAgICAgICAgfQogICAgICAgICAgLyoKICAgICAgICAgICAgZWxzZSB0aGlzIGlzIHRoZSBzZWNvbmQgKG9yIG1vcmUpIG5hbWUgd2UgZG9uJ3Qga25vdwogICAgICAgICAgICBhYm91dCEgKi8KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvKiB0aGlzIGlzIGFuICJpbGxlZ2FsIiA8d2hhdD49PHRoaXM+IHBhaXIgKi8KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYoc3NjYW5mKHB0ciwgIiUiIE1BWF9DT09LSUVfTElORV9UWFQgIlteO1xyXG5dIiwKICAgICAgICAgICAgICAgICAgd2hhdCkpIHsKICAgICAgICAgIGlmKHN0cmVxdWFsKCJzZWN1cmUiLCB3aGF0KSkKICAgICAgICAgICAgY28tPnNlY3VyZSA9IFRSVUU7CiAgICAgICAgICAvKiBlbHNlLAogICAgICAgICAgICAgdW5zdXBwb3J0ZWQga2V5d29yZCB3aXRob3V0IGFzc2lnbiEgKi8KCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmKCFzZW1pcHRyIHx8ICEqc2VtaXB0cikgewogICAgICAgIC8qIHdlIGFscmVhZHkga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBjb29raWVzICovCiAgICAgICAgc2VtaXB0ciA9IE5VTEw7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIHB0cj1zZW1pcHRyKzE7CiAgICAgIHdoaWxlKHB0ciAmJiAqcHRyICYmIGlzc3BhY2UoKGludCkqcHRyKSkKICAgICAgICBwdHIrKzsKICAgICAgc2VtaXB0cj1zdHJjaHIocHRyLCAnOycpOyAvKiBub3csIGZpbmQgdGhlIG5leHQgc2VtaWNvbG9uICovCgogICAgICBpZighc2VtaXB0ciAmJiAqcHRyKQogICAgICAgIC8qIFRoZXJlIGFyZSBubyBtb3JlIHNlbWljb2xvbnMsIGJ1dCB0aGVyZSdzIGEgZmluYWwgbmFtZT12YWx1ZSBwYWlyCiAgICAgICAgICAgY29taW5nIHVwICovCiAgICAgICAgc2VtaXB0cj1zdHJjaHIocHRyLCAnXDAnKTsKICAgIH0gd2hpbGUoc2VtaXB0cik7CgogICAgaWYoYmFkY29va2llIHx8IChOVUxMID09IGNvLT5uYW1lKSkgewogICAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGEgY29va2llIG5hbWUgb3IgYSBiYWQgb25lLAogICAgICAgICB0aGlzIGlzIGFuIGlsbGVnYWwgbGluZSwgYmFpbCBvdXQgKi8KICAgICAgaWYoY28tPmV4cGlyZXN0cikKICAgICAgICBmcmVlKGNvLT5leHBpcmVzdHIpOwogICAgICBpZihjby0+ZG9tYWluKQogICAgICAgIGZyZWUoY28tPmRvbWFpbik7CiAgICAgIGlmKGNvLT5wYXRoKQogICAgICAgIGZyZWUoY28tPnBhdGgpOwogICAgICBpZihjby0+bmFtZSkKICAgICAgICBmcmVlKGNvLT5uYW1lKTsKICAgICAgaWYoY28tPnZhbHVlKQogICAgICAgIGZyZWUoY28tPnZhbHVlKTsKICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmKE5VTEwgPT0gY28tPmRvbWFpbikKICAgICAgLyogbm8gZG9tYWluIHdhcyBnaXZlbiBpbiB0aGUgaGVhZGVyIGxpbmUsIHNldCB0aGUgZGVmYXVsdCBub3cgKi8KICAgICAgY28tPmRvbWFpbj1kb21haW4/c3RyZHVwKGRvbWFpbik6TlVMTDsKICAgIGlmKChOVUxMID09IGNvLT5wYXRoKSAmJiBwYXRoKSB7CiAgICAgIC8qIG5vIHBhdGggd2FzIGdpdmVuIGluIHRoZSBoZWFkZXIgbGluZSwgc2V0IHRoZSBkZWZhdWx0IG5vdyAqLwogICAgICBjaGFyICplbmRzbGFzaCA9IHN0cnJjaHIocGF0aCwgJy8nKTsKICAgICAgaWYoZW5kc2xhc2gpIHsKICAgICAgICBpbnQgcGF0aGxlbiA9IGVuZHNsYXNoLXBhdGgrMTsgLyogaW5jbHVkZSB0aGUgZW5kaW5nIHNsYXNoICovCiAgICAgICAgY28tPnBhdGg9bWFsbG9jKHBhdGhsZW4rMSk7IC8qIG9uZSBleHRyYSBmb3IgdGhlIHplcm8gYnl0ZSAqLwogICAgICAgIGlmKGNvLT5wYXRoKSB7CiAgICAgICAgICBtZW1jcHkoY28tPnBhdGgsIHBhdGgsIHBhdGhsZW4pOwogICAgICAgICAgY28tPnBhdGhbcGF0aGxlbl09MDsgLyogemVybyB0ZXJtaW5hdGUgKi8KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZSB7CiAgICAvKiBUaGlzIGxpbmUgaXMgTk9UIGEgSFRUUCBoZWFkZXIgc3R5bGUgbGluZSwgd2UgZG8gb2ZmZXIgc3VwcG9ydCBmb3IKICAgICAgIHJlYWRpbmcgdGhlIG9kZCBuZXRzY2FwZSBjb29raWVzLWZpbGUgZm9ybWF0IGhlcmUgKi8KICAgIGNoYXIgKmZpcnN0cHRyOwogICAgY2hhciAqdG9rX2J1ZjsKICAgIGludCBmaWVsZHM7CgogICAgaWYobGluZXB0clswXT09JyMnKSB7CiAgICAgIC8qIGRvbid0IGV2ZW4gdHJ5IHRoZSBjb21tZW50cyAqLwogICAgICBmcmVlKGNvKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAvKiBzdHJpcCBvZmYgdGhlIHBvc3NpYmxlIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xyJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KICAgIHB0cj1zdHJjaHIobGluZXB0ciwgJ1xuJyk7CiAgICBpZihwdHIpCiAgICAgICpwdHI9MDsgLyogY2xlYXIgaXQgKi8KCiAgICBmaXJzdHB0cj1zdHJ0b2tfcihsaW5lcHRyLCAiXHQiLCAmdG9rX2J1Zik7IC8qIGZpcnN0IHRva2VuaXplIGl0IG9uIHRoZSBUQUIgKi8KCiAgICAvKiBIZXJlJ3MgYSBxdWljayBjaGVjayB0byBlbGltaW5hdGUgbm9ybWFsIEhUVFAtaGVhZGVycyBmcm9tIHRoaXMgKi8KICAgIGlmKCFmaXJzdHB0ciB8fCBzdHJjaHIoZmlyc3RwdHIsICc6JykpIHsKICAgICAgZnJlZShjbyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qIE5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyBhbmQgaW5pdCB0aGUgc3RydWN0IHdlIGFscmVhZHkgaGF2ZQogICAgICAgYWxsb2NhdGVkICovCiAgICBmb3IocHRyPWZpcnN0cHRyLCBmaWVsZHM9MDsgcHRyOwogICAgICAgIHB0cj1zdHJ0b2tfcihOVUxMLCAiXHQiLCAmdG9rX2J1ZiksIGZpZWxkcysrKSB7CiAgICAgIHN3aXRjaChmaWVsZHMpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGlmKHB0clswXT09Jy4nKSAvKiBza2lwIHByZWNlZWRpbmcgZG90cyAqLwogICAgICAgICAgcHRyKys7CiAgICAgICAgY28tPmRvbWFpbiA9IHN0cmR1cChwdHIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgLyogVGhpcyBmaWVsZCBnb3QgaXRzIGV4cGxhbmF0aW9uIG9uIHRoZSAyM3JkIG9mIE1heSAyMDAxIGJ5CiAgICAgICAgICAgQW5kculzIEdhcmPtYToKCiAgICAgICAgICAgZmxhZzogQSBUUlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdpdmVuCiAgICAgICAgICAgZG9tYWluIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlLiBUaGlzIHZhbHVlIGlzIHNldCBhdXRvbWF0aWNhbGx5IGJ5CiAgICAgICAgICAgdGhlIGJyb3dzZXIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgeW91IHNldCBmb3IgdGhlIGRvbWFpbi4KCiAgICAgICAgICAgQXMgZmFyIGFzIEkgY2FuIHNlZSwgaXQgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGUgY29va2llIHNheXMKICAgICAgICAgICAuZG9tYWluLmNvbSBhbmQgdG8gZmFsc2Ugd2hlbiB0aGUgZG9tYWluIGlzIGNvbXBsZXRlIHd3dy5kb21haW4uY29tCiAgICAgICAgKi8KICAgICAgICBjby0+dGFpbG1hdGNoPXN0cmVxdWFsKHB0ciwgIlRSVUUiKTsgLyogc3RvcmUgaW5mb3JtYXRpb24gKi8KICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIC8qIEl0IHR1cm5zIG91dCwgdGhhdCBzb21ldGltZXMgdGhlIGZpbGUgZm9ybWF0IGFsbG93cyB0aGUgcGF0aAogICAgICAgICAgIGZpZWxkIHRvIHJlbWFpbiBub3QgZmlsbGVkIGluLCB3ZSB0cnkgdG8gZGV0ZWN0IHRoaXMgYW5kIHdvcmsKICAgICAgICAgICBhcm91bmQgaXQhIEFuZHLpcyBHYXJj7WEgbWFkZSB1cyBhd2FyZSBvZiB0aGlzLi4uICovCiAgICAgICAgaWYgKHN0cmNtcCgiVFJVRSIsIHB0cikgJiYgc3RyY21wKCJGQUxTRSIsIHB0cikpIHsKICAgICAgICAgIC8qIG9ubHkgaWYgdGhlIHBhdGggZG9lc24ndCBsb29rIGxpa2UgYSBib29sZWFuIG9wdGlvbiEgKi8KICAgICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKHB0cik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgLyogdGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBhIHBhdGgsIG1ha2Ugb25lIHVwISAqLwogICAgICAgIGNvLT5wYXRoID0gc3RyZHVwKCIvIik7CiAgICAgICAgZmllbGRzKys7IC8qIGFkZCBhIGZpZWxkIGFuZCBmYWxsIGRvd24gdG8gc2VjdXJlICovCiAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAzOgogICAgICAgIGNvLT5zZWN1cmUgPSBzdHJlcXVhbChwdHIsICJUUlVFIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNDoKICAgICAgICBjby0+ZXhwaXJlcyA9IGF0b2kocHRyKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1OgogICAgICAgIGNvLT5uYW1lID0gc3RyZHVwKHB0cik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNjoKICAgICAgICBjby0+dmFsdWUgPSBzdHJkdXAocHRyKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmKDYgPT0gZmllbGRzKSB7CiAgICAgIC8qIHdlIGdvdCBhIGNvb2tpZSB3aXRoIGJsYW5rIGNvbnRlbnRzLCBmaXggaXQgKi8KICAgICAgY28tPnZhbHVlID0gc3RyZHVwKCIiKTsKICAgIH0KICAgIGVsc2UgaWYoNyAhPSBmaWVsZHMpIHsKICAgICAgLyogd2UgZGlkIG5vdCBmaW5kIHRoZSBzdWZmaWNpZW50IG51bWJlciBvZiBmaWVsZHMgdG8gcmVjb2duaXplIHRoaXMKICAgICAgICAgYXMgYSB2YWxpZCBsaW5lLCBhYm9ydCBhbmQgZ28gaG9tZSAqLwogICAgICBmcmVlX2Nvb2tpZW1lc3MoY28pOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICB9CgogIGlmKCFjLT5ydW5uaW5nICYmICAgIC8qIHJlYWQgZnJvbSBhIGZpbGUgKi8KICAgICBjLT5uZXdzZXNzaW9uICYmICAvKiBjbGVhbiBzZXNzaW9uIGNvb2tpZXMgKi8KICAgICAhY28tPmV4cGlyZXMpIHsgICAvKiB0aGlzIGlzIGEgc2Vzc2lvbiBjb29raWUgc2luY2UgaXQgZG9lc24ndCBleHBpcmUhICovCiAgICBmcmVlX2Nvb2tpZW1lc3MoY28pOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICBjby0+bGl2ZWNvb2tpZSA9IGMtPnJ1bm5pbmc7CgogIC8qIG5vdywgd2UgaGF2ZSBwYXJzZWQgdGhlIGluY29taW5nIGxpbmUsIHdlIG11c3Qgbm93IGNoZWNrIGlmIHRoaXMKICAgICBzdXBlcmNlZWRzIGFuIGFscmVhZHkgZXhpc3RpbmcgY29va2llLCB3aGljaCBpdCBtYXkgaWYgdGhlIHByZXZpb3VzIGhhdmUKICAgICB0aGUgc2FtZSBkb21haW4gYW5kIHBhdGggYXMgdGhpcyAqLwoKICBjbGlzdCA9IGMtPmNvb2tpZXM7CiAgcmVwbGFjZV9vbGQgPSBGQUxTRTsKICB3aGlsZShjbGlzdCkgewogICAgaWYoc3RyZXF1YWwoY2xpc3QtPm5hbWUsIGNvLT5uYW1lKSkgewogICAgICAvKiB0aGUgbmFtZXMgYXJlIGlkZW50aWNhbCAqLwoKICAgICAgaWYoY2xpc3QtPmRvbWFpbiAmJiBjby0+ZG9tYWluKSB7CiAgICAgICAgaWYoc3RyZXF1YWwoY2xpc3QtPmRvbWFpbiwgY28tPmRvbWFpbikpCiAgICAgICAgICAvKiBUaGUgZG9tYWlucyBhcmUgaWRlbnRpY2FsICovCiAgICAgICAgICByZXBsYWNlX29sZD1UUlVFOwogICAgICB9CiAgICAgIGVsc2UgaWYoIWNsaXN0LT5kb21haW4gJiYgIWNvLT5kb21haW4pCiAgICAgICAgcmVwbGFjZV9vbGQgPSBUUlVFOwoKICAgICAgaWYocmVwbGFjZV9vbGQpIHsKICAgICAgICAvKiB0aGUgZG9tYWlucyB3ZXJlIGlkZW50aWNhbCAqLwoKICAgICAgICBpZihjbGlzdC0+cGF0aCAmJiBjby0+cGF0aCkgewogICAgICAgICAgaWYoc3RyZXF1YWwoY2xpc3QtPnBhdGgsIGNvLT5wYXRoKSkgewogICAgICAgICAgICByZXBsYWNlX29sZCA9IFRSVUU7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlcGxhY2Vfb2xkID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIWNsaXN0LT5wYXRoICYmICFjby0+cGF0aCkKICAgICAgICAgIHJlcGxhY2Vfb2xkID0gVFJVRTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXBsYWNlX29sZCA9IEZBTFNFOwogICAgICAgIAogICAgICB9CgogICAgICBpZihyZXBsYWNlX29sZCAmJiAhY28tPmxpdmVjb29raWUgJiYgY2xpc3QtPmxpdmVjb29raWUpIHsKICAgICAgICAvKiBCb3RoIGNvb2tpZXMgbWF0Y2hlZCBmaW5lLCBleGNlcHQgdGhhdCB0aGUgYWxyZWFkeSBwcmVzZW50CiAgICAgICAgICAgY29va2llIGlzICJsaXZlIiwgd2hpY2ggbWVhbnMgaXQgd2FzIHNldCBmcm9tIGEgaGVhZGVyLCB3aGlsZQogICAgICAgICAgIHRoZSBuZXcgb25lIGlzbid0ICJsaXZlIiBhbmQgdGh1cyBvbmx5IHJlYWQgZnJvbSBhIGZpbGUuIFdlIGxldAogICAgICAgICAgIGxpdmUgY29va2llcyBzdGF5IGFsaXZlICovCgogICAgICAgIC8qIEZyZWUgdGhlIG5ld2NvbWVyIGFuZCBnZXQgb3V0IG9mIGhlcmUhICovCiAgICAgICAgaWYoY28tPmRvbWFpbikKICAgICAgICAgIGZyZWUoY28tPmRvbWFpbik7CiAgICAgICAgaWYoY28tPnBhdGgpCiAgICAgICAgICBmcmVlKGNvLT5wYXRoKTsKICAgICAgICBpZihjby0+bmFtZSkKICAgICAgICAgIGZyZWUoY28tPm5hbWUpOwogICAgICAgIGlmKGNvLT52YWx1ZSkKICAgICAgICAgIGZyZWUoY28tPnZhbHVlKTsKCiAgICAgICAgZnJlZShjbyk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgIH0KCiAgICAgIGlmKHJlcGxhY2Vfb2xkKSB7CiAgICAgICAgY28tPm5leHQgPSBjbGlzdC0+bmV4dDsgLyogZ2V0IHRoZSBuZXh0LXBvaW50ZXIgZmlyc3QgKi8KCiAgICAgICAgLyogdGhlbiBmcmVlIGFsbCB0aGUgb2xkIHBvaW50ZXJzICovCiAgICAgICAgaWYoY2xpc3QtPm5hbWUpCiAgICAgICAgICBmcmVlKGNsaXN0LT5uYW1lKTsKICAgICAgICBpZihjbGlzdC0+dmFsdWUpCiAgICAgICAgICBmcmVlKGNsaXN0LT52YWx1ZSk7CiAgICAgICAgaWYoY2xpc3QtPmRvbWFpbikKICAgICAgICAgIGZyZWUoY2xpc3QtPmRvbWFpbik7CiAgICAgICAgaWYoY2xpc3QtPnBhdGgpCiAgICAgICAgICBmcmVlKGNsaXN0LT5wYXRoKTsKICAgICAgICBpZihjbGlzdC0+ZXhwaXJlc3RyKQogICAgICAgICAgZnJlZShjbGlzdC0+ZXhwaXJlc3RyKTsKCiAgICAgICAgaWYoY2xpc3QtPnZlcnNpb24pCiAgICAgICAgICBmcmVlKGNsaXN0LT52ZXJzaW9uKTsKICAgICAgICBpZihjbGlzdC0+bWF4YWdlKQogICAgICAgICAgZnJlZShjbGlzdC0+bWF4YWdlKTsKCiAgICAgICAgKmNsaXN0ID0gKmNvOyAgLyogdGhlbiBzdG9yZSBhbGwgdGhlIG5ldyBkYXRhICovCgogICAgICAgIGZyZWUoY28pOyAgIC8qIGZyZWUgdGhlIG5ld2x5IGFsbG9jZWQgbWVtb3J5ICovCiAgICAgICAgY28gPSBjbGlzdDsgLyogcG9pbnQgdG8gdGhlIHByZXZpb3VzIHN0cnVjdCBpbnN0ZWFkICovCgogICAgICAgIC8qIFdlIGhhdmUgcmVwbGFjZWQgYSBjb29raWUsIG5vdyBza2lwIHRoZSByZXN0IG9mIHRoZSBsaXN0IGJ1dAogICAgICAgICAgIG1ha2Ugc3VyZSB0aGUgJ2xhc3RjJyBwb2ludGVyIGlzIHByb3Blcmx5IHNldCAqLwogICAgICAgIGRvIHsKICAgICAgICAgIGxhc3RjID0gY2xpc3Q7CiAgICAgICAgICBjbGlzdCA9IGNsaXN0LT5uZXh0OwogICAgICAgIH0gd2hpbGUoY2xpc3QpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBsYXN0YyA9IGNsaXN0OwogICAgY2xpc3QgPSBjbGlzdC0+bmV4dDsKICB9CgogIGlmKGMtPnJ1bm5pbmcpCiAgICAvKiBPbmx5IHNob3cgdGhpcyB3aGVuIE5PVCByZWFkaW5nIHRoZSBjb29raWVzIGZyb20gYSBmaWxlICovCiAgICBpbmZvZihkYXRhLCAiJXMgY29va2llICVzPVwiJXNcIiBmb3IgZG9tYWluICVzLCBwYXRoICVzLCBleHBpcmUgJWRcbiIsCiAgICAgICAgICByZXBsYWNlX29sZD8iUmVwbGFjZWQiOiJBZGRlZCIsIGNvLT5uYW1lLCBjby0+dmFsdWUsCiAgICAgICAgICBjby0+ZG9tYWluLCBjby0+cGF0aCwgY28tPmV4cGlyZXMpOwoKICBpZighcmVwbGFjZV9vbGQpIHsKICAgIC8qIHRoZW4gbWFrZSB0aGUgbGFzdCBpdGVtIHBvaW50IG9uIHRoaXMgbmV3IG9uZSAqLwogICAgaWYobGFzdGMpCiAgICAgIGxhc3RjLT5uZXh0ID0gY287CiAgICBlbHNlCiAgICAgIGMtPmNvb2tpZXMgPSBjbzsKICB9CgogIGMtPm51bWNvb2tpZXMrKzsgLyogb25lIG1vcmUgY29va2llIGluIHRoZSBqYXIgKi8KICByZXR1cm4gY287Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9pbml0KCkKICoKICogSW5pdHMgYSBjb29raWUgc3RydWN0IHRvIHJlYWQgZGF0YSBmcm9tIGEgbG9jYWwgZmlsZS4gVGhpcyBpcyBhbHdheXMKICogY2FsbGVkIGJlZm9yZSBhbnkgY29va2llcyBhcmUgc2V0LiBGaWxlIG1heSBiZSBOVUxMLgogKgogKiBJZiAnbmV3c2Vzc2lvbicgaXMgVFJVRSwgZGlzY2FyZCBhbGwgInNlc3Npb24gY29va2llcyIgb24gcmVhZCBmcm9tIGZpbGUuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgQ29va2llSW5mbyAqQ3VybF9jb29raWVfaW5pdChzdHJ1Y3QgU2Vzc2lvbkhhbmRsZSAqZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENvb2tpZUluZm8gKmluYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZXdzZXNzaW9uKQp7CiAgY2hhciBsaW5lW01BWF9DT09LSUVfTElORV07CiAgc3RydWN0IENvb2tpZUluZm8gKmM7CiAgRklMRSAqZnA7CiAgYm9vbCBmcm9tZmlsZT1UUlVFOwogIAogIGlmKE5VTEwgPT0gaW5jKSB7CiAgICAvKiB3ZSBkaWRuJ3QgZ2V0IGEgc3RydWN0LCBjcmVhdGUgb25lICovCiAgICBjID0gKHN0cnVjdCBDb29raWVJbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgQ29va2llSW5mbykpOwogICAgaWYoIWMpCiAgICAgIHJldHVybiBOVUxMOyAvKiBmYWlsZWQgdG8gZ2V0IG1lbW9yeSAqLwogICAgbWVtc2V0KGMsIDAsIHNpemVvZihzdHJ1Y3QgQ29va2llSW5mbykpOwogICAgYy0+ZmlsZW5hbWUgPSBzdHJkdXAoZmlsZT9maWxlOiJub25lIik7IC8qIGNvcHkgdGhlIG5hbWUganVzdCBpbiBjYXNlICovCiAgfQogIGVsc2UgewogICAgLyogd2UgZ290IGFuIGFscmVhZHkgZXhpc3Rpbmcgb25lLCB1c2UgdGhhdCAqLwogICAgYyA9IGluYzsKICB9CiAgYy0+cnVubmluZyA9IEZBTFNFOyAvKiB0aGlzIGlzIG5vdCBydW5uaW5nLCB0aGlzIGlzIGluaXQgKi8KCiAgaWYoZmlsZSAmJiBzdHJlcXVhbChmaWxlLCAiLSIpKSB7CiAgICBmcCA9IHN0ZGluOwogICAgZnJvbWZpbGU9RkFMU0U7CiAgfQogIGVsc2UKICAgIGZwID0gZmlsZT9mb3BlbihmaWxlLCAiciIpOk5VTEw7CgogIGMtPm5ld3Nlc3Npb24gPSBuZXdzZXNzaW9uOyAvKiBuZXcgc2Vzc2lvbj8gKi8KCiAgaWYoZnApIHsKICAgIGNoYXIgKmxpbmVwdHI7CiAgICBib29sIGhlYWRlcmxpbmU7CiAgICB3aGlsZShmZ2V0cyhsaW5lLCBNQVhfQ09PS0lFX0xJTkUsIGZwKSkgewogICAgICBpZihjaGVja3ByZWZpeCgiU2V0LUNvb2tpZToiLCBsaW5lKSkgewogICAgICAgIC8qIFRoaXMgaXMgYSBjb29raWUgbGluZSwgZ2V0IGl0ISAqLwogICAgICAgIGxpbmVwdHI9JmxpbmVbMTFdOwogICAgICAgIGhlYWRlcmxpbmU9VFJVRTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBsaW5lcHRyPWxpbmU7CiAgICAgICAgaGVhZGVybGluZT1GQUxTRTsKICAgICAgfQogICAgICB3aGlsZSgqbGluZXB0ciAmJiBpc3NwYWNlKChpbnQpKmxpbmVwdHIpKQogICAgICAgIGxpbmVwdHIrKzsKCiAgICAgIEN1cmxfY29va2llX2FkZChkYXRhLCBjLCBoZWFkZXJsaW5lLCBsaW5lcHRyLCBOVUxMLCBOVUxMKTsKICAgIH0KICAgIGlmKGZyb21maWxlKQogICAgICBmY2xvc2UoZnApOwogIH0KCiAgYy0+cnVubmluZyA9IFRSVUU7ICAgICAgICAgIC8qIG5vdywgd2UncmUgcnVubmluZyAqLwoKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2dldGxpc3QoKQogKgogKiBGb3IgYSBnaXZlbiBob3N0IGFuZCBwYXRoLCByZXR1cm4gYSBsaW5rZWQgbGlzdCBvZiBjb29raWVzIHRoYXQgdGhlCiAqIGNsaWVudCBzaG91bGQgc2VuZCB0byB0aGUgc2VydmVyIGlmIHVzZWQgbm93LiBUaGUgc2VjdXJlIGJvb2xlYW4gaW5mb3JtcwogKiB0aGUgY29va2llIGlmIGEgc2VjdXJlIGNvbm5lY3Rpb24gaXMgYWNoaWV2ZWQgb3Igbm90LgogKgogKiBJdCBzaGFsbCBvbmx5IHJldHVybiBjb29raWVzIHRoYXQgaGF2ZW4ndCBleHBpcmVkLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0cnVjdCBDb29raWUgKkN1cmxfY29va2llX2dldGxpc3Qoc3RydWN0IENvb2tpZUluZm8gKmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgYm9vbCBzZWN1cmUpCnsKICAgc3RydWN0IENvb2tpZSAqbmV3Y287CiAgIHN0cnVjdCBDb29raWUgKmNvOwogICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKICAgc3RydWN0IENvb2tpZSAqbWFpbmNvPU5VTEw7CgogICBpZighYyB8fCAhYy0+Y29va2llcykKICAgICAgcmV0dXJuIE5VTEw7IC8qIG5vIGNvb2tpZSBzdHJ1Y3Qgb3Igbm8gY29va2llcyBpbiB0aGUgc3RydWN0ICovCgogICBjbyA9IGMtPmNvb2tpZXM7CgogICB3aGlsZShjbykgewogICAgIC8qIG9ubHkgcHJvY2VzcyB0aGlzIGNvb2tpZSBpZiBpdCBpcyBub3QgZXhwaXJlZCBvciBoYWQgbm8gZXhwaXJlCiAgICAgICAgZGF0ZSBBTkQgdGhhdCBpZiB0aGUgY29va2llIHJlcXVpcmVzIHdlJ3JlIHNlY3VyZSB3ZSBtdXN0IG9ubHkKICAgICAgICBjb250aW51ZSBpZiB3ZSBhcmUhICovCiAgICAgaWYoIChjby0+ZXhwaXJlczw9MCB8fCAoY28tPmV4cGlyZXM+IG5vdykpICYmCiAgICAgICAgIChjby0+c2VjdXJlP3NlY3VyZTpUUlVFKSApIHsKICAgICAgIAogICAgICAgLyogbm93IGNoZWNrIGlmIHRoZSBkb21haW4gaXMgY29ycmVjdCAqLwogICAgICAgaWYoIWNvLT5kb21haW4gfHwKICAgICAgICAgIChjby0+dGFpbG1hdGNoICYmIHRhaWxtYXRjaChjby0+ZG9tYWluLCBob3N0KSkgfHwKICAgICAgICAgICghY28tPnRhaWxtYXRjaCAmJiBzdHJlcXVhbChob3N0LCBjby0+ZG9tYWluKSkgKSB7CiAgICAgICAgIC8qIHRoZSByaWdodCBwYXJ0IG9mIHRoZSBob3N0IG1hdGNoZXMgdGhlIGRvbWFpbiBzdHVmZiBpbiB0aGUKICAgICAgICAgICAgY29va2llIGRhdGEgKi8KICAgICAgICAgCiAgICAgICAgIC8qIG5vdyBjaGVjayB0aGUgbGVmdCBwYXJ0IG9mIHRoZSBwYXRoIHdpdGggdGhlIGNvb2tpZXMgcGF0aAogICAgICAgICAgICByZXF1aXJlbWVudCAqLwogICAgICAgICBpZighY28tPnBhdGggfHwKICAgICAgICAgICAgY2hlY2twcmVmaXgoY28tPnBhdGgsIHBhdGgpICkgewoKICAgICAgICAgICAvKiBhbmQgbm93LCB3ZSBrbm93IHRoaXMgaXMgYSBtYXRjaCBhbmQgd2Ugc2hvdWxkIGNyZWF0ZSBhbgogICAgICAgICAgICAgIGVudHJ5IGZvciB0aGUgcmV0dXJuLWxpbmtlZC1saXN0ICovCiAgICAgICAgICAgCiAgICAgICAgICAgbmV3Y28gPSAoc3RydWN0IENvb2tpZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IENvb2tpZSkpOwogICAgICAgICAgIGlmKG5ld2NvKSB7CiAgICAgICAgICAgICAvKiBmaXJzdCwgY29weSB0aGUgd2hvbGUgc291cmNlIGNvb2tpZTogKi8KICAgICAgICAgICAgIG1lbWNweShuZXdjbywgY28sIHNpemVvZihzdHJ1Y3QgQ29va2llKSk7CgogICAgICAgICAgICAgLyogdGhlbiBtb2RpZnkgb3VyIG5leHQgKi8KICAgICAgICAgICAgIG5ld2NvLT5uZXh0ID0gbWFpbmNvOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAvKiBwb2ludCB0aGUgbWFpbiB0byB1cyAqLwogICAgICAgICAgICAgbWFpbmNvID0gbmV3Y287CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICAgIGNvID0gY28tPm5leHQ7CiAgIH0KCiAgIHJldHVybiBtYWluY287IC8qIHJldHVybiB0aGUgbmV3IGxpc3QgKi8KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDdXJsX2Nvb2tpZV9mcmVlbGlzdCgpCiAqCiAqIEZyZWUgYSBsaXN0IG9mIGNvb2tpZXMgcHJldmlvdXNseSByZXR1cm5lZCBieSBDdXJsX2Nvb2tpZV9nZXRsaXN0KCk7CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBDdXJsX2Nvb2tpZV9mcmVlbGlzdChzdHJ1Y3QgQ29va2llICpjbykKewogICBzdHJ1Y3QgQ29va2llICpuZXh0OwogICBpZihjbykgewogICAgICB3aGlsZShjbykgewoJIG5leHQgPSBjby0+bmV4dDsKCSBmcmVlKGNvKTsgLyogd2Ugb25seSBmcmVlIHRoZSBzdHJ1Y3Qgc2luY2UgdGhlICJtZW1iZXJzIiBhcmUgYWxsCgkJICAgICAganVzdCBjb3BpZWQhICovCgkgY28gPSBuZXh0OwogICAgICB9CiAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEN1cmxfY29va2llX2NsZWFudXAoKQogKgogKiBGcmVlIGEgImNvb2tpZSBvYmplY3QiIHByZXZpb3VzIGNyZWF0ZWQgd2l0aCBjb29raWVfaW5pdCgpLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBDdXJsX2Nvb2tpZV9jbGVhbnVwKHN0cnVjdCBDb29raWVJbmZvICpjKQp7CiAgIHN0cnVjdCBDb29raWUgKmNvOwogICBzdHJ1Y3QgQ29va2llICpuZXh0OwogICBpZihjKSB7CiAgICAgIGlmKGMtPmZpbGVuYW1lKQoJIGZyZWUoYy0+ZmlsZW5hbWUpOwogICAgICBjbyA9IGMtPmNvb2tpZXM7CgogICAgICB3aGlsZShjbykgewoJIGlmKGNvLT5uYW1lKQoJICAgIGZyZWUoY28tPm5hbWUpOwoJIGlmKGNvLT52YWx1ZSkKCSAgICBmcmVlKGNvLT52YWx1ZSk7CgkgaWYoY28tPmRvbWFpbikKCSAgICBmcmVlKGNvLT5kb21haW4pOwoJIGlmKGNvLT5wYXRoKQoJICAgIGZyZWUoY28tPnBhdGgpOwoJIGlmKGNvLT5leHBpcmVzdHIpCgkgICAgZnJlZShjby0+ZXhwaXJlc3RyKTsKCgkgaWYoY28tPnZlcnNpb24pCgkgICAgZnJlZShjby0+dmVyc2lvbik7CgkgaWYoY28tPm1heGFnZSkKCSAgICBmcmVlKGNvLT5tYXhhZ2UpOwoKCSBuZXh0ID0gY28tPm5leHQ7CgkgZnJlZShjbyk7CgkgY28gPSBuZXh0OwogICAgICB9CiAgICAgIGZyZWUoYyk7IC8qIGZyZWUgdGhlIGJhc2Ugc3RydWN0IGFzIHdlbGwgKi8KICAgfQp9CgovKgogKiBDdXJsX2Nvb2tpZV9vdXRwdXQoKQogKgogKiBXcml0ZXMgYWxsIGludGVybmFsbHkga25vd24gY29va2llcyB0byB0aGUgc3BlY2lmaWVkIGZpbGUuIFNwZWNpZnkKICogIi0iIGFzIGZpbGUgbmFtZSB0byB3cml0ZSB0byBzdGRvdXQuCiAqCiAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIG9uIHdyaXRlIGZhaWx1cmUuCiAqLwppbnQgQ3VybF9jb29raWVfb3V0cHV0KHN0cnVjdCBDb29raWVJbmZvICpjLCBjaGFyICpkdW1waGVyZSkKewogIHN0cnVjdCBDb29raWUgKmNvOwogIEZJTEUgKm91dDsKICBib29sIHVzZV9zdGRvdXQ9RkFMU0U7CgogIGlmKChOVUxMID09IGMpIHx8ICgwID09IGMtPm51bWNvb2tpZXMpKQogICAgLyogSWYgdGhlcmUgYXJlIG5vIGtub3duIGNvb2tpZXMsIHdlIGRvbid0IHdyaXRlIG9yIGV2ZW4gY3JlYXRlIGFueQogICAgICAgZGVzdGluYXRpb24gZmlsZSAqLwogICAgcmV0dXJuIDA7CgogIGlmKHN0cmVxdWFsKCItIiwgZHVtcGhlcmUpKSB7CiAgICAvKiB1c2Ugc3Rkb3V0ICovCiAgICBvdXQgPSBzdGRvdXQ7CiAgICB1c2Vfc3Rkb3V0PVRSVUU7CiAgfQogIGVsc2UgewogICAgb3V0ID0gZm9wZW4oZHVtcGhlcmUsICJ3Iik7CiAgICBpZighb3V0KQogICAgICByZXR1cm4gMTsgLyogZmFpbHVyZSAqLwogIH0KCiAgaWYoYykgewogICAgZnB1dHMoIiMgTmV0c2NhcGUgSFRUUCBDb29raWUgRmlsZVxuIgogICAgICAgICAgIiMgaHR0cDovL3d3dy5uZXRzY2FwZS5jb20vbmV3c3JlZi9zdGQvY29va2llX3NwZWMuaHRtbFxuIgogICAgICAgICAgIiMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgbGliY3VybCEgRWRpdCBhdCB5b3VyIG93biByaXNrLlxuXG4iLAogICAgICAgICAgb3V0KTsKICAgIGNvID0gYy0+Y29va2llczsKICAgICAKICAgIHdoaWxlKGNvKSB7CiAgICAgIGZwcmludGYob3V0LAogICAgICAgICAgICAgICIlcyVzXHQiIC8qIGRvbWFpbiAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiB0YWlsbWF0Y2ggKi8KICAgICAgICAgICAgICAiJXNcdCIgLyogcGF0aCAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiBzZWN1cmUgKi8KICAgICAgICAgICAgICAiJXVcdCIgLyogZXhwaXJlcyAqLwogICAgICAgICAgICAgICIlc1x0IiAvKiBuYW1lICovCiAgICAgICAgICAgICAgIiVzXG4iLCAvKiB2YWx1ZSAqLwoKICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgYWxsIGRvbWFpbnMgYXJlIHByZWZpeGVkIHdpdGggYSBkb3QgaWYgdGhleSBhbGxvdwogICAgICAgICAgICAgICAgIHRhaWxtYXRjaGluZy4gVGhpcyBpcyBNb3ppbGxhLXN0eWxlLiAqLwogICAgICAgICAgICAgIChjby0+dGFpbG1hdGNoICYmIGNvLT5kb21haW4gJiYgY28tPmRvbWFpblswXSAhPSAnLicpPyAiLiI6IiIsCiAgICAgICAgICAgICAgY28tPmRvbWFpbj9jby0+ZG9tYWluOiJ1bmtub3duIiwKICAgICAgICAgICAgICBjby0+dGFpbG1hdGNoPyJUUlVFIjoiRkFMU0UiLAogICAgICAgICAgICAgIGNvLT5wYXRoP2NvLT5wYXRoOiIvIiwKICAgICAgICAgICAgICBjby0+c2VjdXJlPyJUUlVFIjoiRkFMU0UiLAogICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY28tPmV4cGlyZXMsCiAgICAgICAgICAgICAgY28tPm5hbWUsCiAgICAgICAgICAgICAgY28tPnZhbHVlP2NvLT52YWx1ZToiIik7CgogICAgICBjbz1jby0+bmV4dDsKICAgIH0KICB9CgogIGlmKCF1c2Vfc3Rkb3V0KQogICAgZmNsb3NlKG91dCk7CgogIHJldHVybiAwOwp9CgojZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0hUVFAgKi8K