LyogRGlyZWN0M0QgVGV4dHVyZQogKiBDb3B5cmlnaHQgKGMpIDE5OTggTGlvbmVsIFVMTUVSCiAqIENvcHlyaWdodCAoYykgMjAwNiBTdGVmYW4gRNZTSU5HRVIKICoKICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgRGlyZWN0M0RUZXh0dXJlMi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIENPQkpNQUNST1MKI2RlZmluZSBOT05BTUVMRVNTVU5JT04KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS9leGNlcHRpb24uaCIKI2luY2x1ZGUgImV4Y3B0LmgiCgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgImQzZC5oIgoKI2luY2x1ZGUgImRkcmF3X3ByaXZhdGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZDcpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElVbmtub3duIGludGVyZmFjZXMuIFRoZXkgYXJlIHRodW5rcyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNEVGV4dHVyZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvYmopCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9iaik7CiAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19RdWVyeUludGVyZmFjZShJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0RHJhd1N1cmZhY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9RdWVyeUludGVyZmFjZShJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMsIGRlYnVnc3RyX2d1aWQocmlpZCksIG9iaik7CgogICAgcmV0dXJuIElEaXJlY3REcmF3U3VyZmFjZTdfUXVlcnlJbnRlcmZhY2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqKTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8yX0FkZFJlZihJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXdTdXJmYWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNykpOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfQWRkUmVmKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCkgdGh1bmtpbmcgdG8gSURpcmVjdERyYXdTdXJmYWNlNyBpbnRlcmZhY2UuXG4iLCBUaGlzKTsKCiAgICByZXR1cm4gSURpcmVjdERyYXdTdXJmYWNlN19BZGRSZWYoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKSk7Cn0KCnN0YXRpYyBVTE9ORyBXSU5BUEkKVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9SZWxlYXNlKElEaXJlY3QzRFRleHR1cmUyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdERyYXdTdXJmYWNlNykpOwp9CgoKc3RhdGljIFVMT05HIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1JlbGVhc2UoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSB0aHVua2luZyB0byBJRGlyZWN0RHJhd1N1cmZhY2U3IGludGVyZmFjZS5cbiIsIFRoaXMpOwoKICAgIHJldHVybiBJRGlyZWN0RHJhd1N1cmZhY2U3X1JlbGVhc2UoQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3REcmF3U3VyZmFjZTcsIGlmYWNlKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RUZXh0dXJlIGludGVyZmFjZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVGV4dHVyZTE6OkluaXRpYWxpemUKICoKICogVGhlIHNkayBzYXlzIGl0J3Mgbm90IGltcGxlbWVudGVkCiAqCiAqIFBhcmFtczoKICogID8KICoKICogUmV0dXJucwogKiAgRERFUlJfVU5TVVBQT1JURUQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVGV4dHVyZUltcGxfMV9Jbml0aWFsaXplKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlICpEaXJlY3QzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3REcmF3U3VyZmFjZSAqRERTdXJmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7CiAgICBJRGlyZWN0M0REZXZpY2VJbXBsICpkM2QgPSBJQ09NX09CSkVDVChJRGlyZWN0M0REZXZpY2VJbXBsLCBJRGlyZWN0M0REZXZpY2UsIERpcmVjdDNERGV2aWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmYgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2UzLCBERFN1cmZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCkgTm90IGltcGxlbWVudGVkXG4iLCBUaGlzLCBkM2QsIHN1cmYpOwogICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOyAvKiBVbmNoZWNrZWQgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzRFRleHR1cmUyOjpQYWxldHRlQ2hhbmdlZAogKgogKiBJbmZvcm1zIHRoZSB0ZXh0dXJlIGFib3V0IGEgcGFsZXR0ZSBjaGFuZ2UKICoKICogUGFyYW1zOgogKiAgU3RhcnQ6IFN0YXJ0IGluZGV4IG9mIHRoZSBjaGFuZ2UKICogIENvdW50OiBUaGUgbnVtYmVyIG9mIGNoYW5nZWQgZW50cmllcwogKgogKiBSZXR1cm5zCiAqICBEM0RfT0ssIGJlY2F1c2UgaXQncyBhIHN0dWIKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVGV4dHVyZUltcGxfUGFsZXR0ZUNoYW5nZWQoSURpcmVjdDNEVGV4dHVyZTIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIENvdW50KQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpOwogICAgRklYTUUoIiglcCktPiglMDhseCwlMDhseCk6IHN0dWIhXG4iLCBUaGlzLCBTdGFydCwgQ291bnQpOwogICAgcmV0dXJuIEQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUGFsZXR0ZUNoYW5nZWQoSURpcmVjdDNEVGV4dHVyZSAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgQ291bnQpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJTA4bHgsJTA4bHgpIHRodW5raW5nIHRvIElEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZS5cbiIsIFRoaXMsIFN0YXJ0LCBDb3VudCk7CgogICAgcmV0dXJuIElEaXJlY3QzRFRleHR1cmUyX1BhbGV0dGVDaGFuZ2VkKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50KTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RUZXh0dXJlOjpVbmxvYWQKICoKICogRFg1IFNESzogIlRoZSBJRGlyZWN0M0RUZXh0dXJlMjo6VW5sb2FkIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQKICoKICoKICogUmV0dXJuczoKICogIERERVJSX1VOU1VQUE9SVEVECiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzRFRleHR1cmVJbXBsXzFfVW5sb2FkKElEaXJlY3QzRFRleHR1cmUgKmlmYWNlKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBpZmFjZSk7CiAgICBUUkFDRSgiKCVwKS0+KCk6IG5vdCBpbXBsZW1lbnRlZCFcbiIsIFRoaXMpOwogICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNEVGV4dHVyZTI6OkdldEhhbmRsZQogKgogKiBSZXR1cm5zIGhhbmRsZSBmb3IgdGhlIHRleHR1cmUuIEF0IHRoZSBtb21lbnQsIHRoZSBpbnRlcmZhY2UKICogdG8gdGhlIElXaW5lRDNEVGV4dHVyZSBpcyB1c2VkLgogKgogKiBQYXJhbXM6CiAqICBEaXJlY3QzRERldmljZTI6IERldmljZSB0aGlzIGhhbmRsZSBpcyBhc3NpZ25lZCB0bwogKiAgSGFuZGxlOiBBZGRyZXNzIHRvIHN0b3JlIHRoZSBoYW5kbGUgYXQuCiAqCiAqIFJldHVybnM6CiAqICBEM0RfT0sKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVGV4dHVyZUltcGxfR2V0SGFuZGxlKElEaXJlY3QzRFRleHR1cmUyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlMiAqRGlyZWN0M0REZXZpY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RURVhUVVJFSEFORExFICpscEhhbmRsZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdERyYXdTdXJmYWNlSW1wbCwgSURpcmVjdDNEVGV4dHVyZTIsIGlmYWNlKTsKICAgIElEaXJlY3QzRERldmljZUltcGwgKmQzZCA9IElDT01fT0JKRUNUKElEaXJlY3QzRERldmljZUltcGwsIElEaXJlY3QzRERldmljZTIsIERpcmVjdDNERGV2aWNlMik7CgogICAgVFJBQ0UoIiglcCktPiglcCwlcClcbiIsIFRoaXMsIGQzZCwgbHBIYW5kbGUpOwoKICAgIC8qIFRoZSBoYW5kbGUgaXMgdGhlIFdpbmVEM0RUZXh0dXJlIGludGVyZmFjZS4gU2V0UmVuZGVyU3RhdGUgZGVwZW5kcyBvbiB0aGlzICovCiAgICBpZihUaGlzLT5kZHJhdy0+d2luZUQzRERldmljZSkKICAgICAgICAqbHBIYW5kbGUgPSAoRDNEVEVYVFVSRUhBTkRMRSkgVGhpcy0+d2luZUQzRFRleHR1cmU7CiAgICBlbHNlCiAgICB7CiAgICAgICAgLyogVGhpcyBpcyB0byBmb29sIGFwcGxpY2F0aW9ucyB3aGljaCBjcmVhdGUgYSB0ZXh0dXJlIHdpdGhvdXQgYSBEM0REZXZpY2UgKi8KICAgICAgICAqbHBIYW5kbGUgPSAoRDNEVEVYVFVSRUhBTkRMRSkgVGhpczsKICAgIH0KCiAgICBUUkFDRSgiIHJldHVybmluZyBoYW5kbGUgJTA4bHguXG4iLCAqbHBIYW5kbGUpOwoKICAgIHJldHVybiBEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0dldEhhbmRsZShJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBESVJFQ1QzRERFVklDRSBscERpcmVjdDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEQzRFRFWFRVUkVIQU5ETEUgbHBIYW5kbGUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZS5cbiIsIFRoaXMsIGxwRGlyZWN0M0REZXZpY2UsIGxwSGFuZGxlKTsKCiAgICByZXR1cm4gSURpcmVjdDNEVGV4dHVyZTJfR2V0SGFuZGxlKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01fSU5URVJGQUNFX0NBU1QoSURpcmVjdDNERGV2aWNlSW1wbCwgSURpcmVjdDNERGV2aWNlLCBJRGlyZWN0M0REZXZpY2UyLCBscERpcmVjdDNERGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBIYW5kbGUpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGdldF9zdWJfbWltYXBsZXZlbAogKgogKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IG1pcG1hcCBsZXZlbAogKgogKiB0ZXhfcHRyOiBTdXJmYWNlIG9mIHdoaWNoIHRvIHJldHVybiB0aGUgbmV4dCBsZXZlbAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJRGlyZWN0RHJhd1N1cmZhY2VJbXBsICoKZ2V0X3N1Yl9taW1hcGxldmVsKElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnRleF9wdHIpCnsKICAgIC8qIE5vdyBnbyBkb3duIHRoZSBtaXBtYXAgY2hhaW4gdG8gdGhlIG5leHQgc3VyZmFjZSAqLwogICAgc3RhdGljIGNvbnN0IEREU0NBUFMyIG1pcG1hcF9jYXBzID0geyBERFNDQVBTX01JUE1BUCB8IEREU0NBUFNfVEVYVFVSRSwgMCwgMCwgMCB9OwogICAgTFBESVJFQ1REUkFXU1VSRkFDRTcgbmV4dF9sZXZlbDsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKnN1cmZfcHRyOwogICAgSFJFU1VMVCBocjsKCiAgICBociA9IElEaXJlY3REcmF3U3VyZmFjZTdfR2V0QXR0YWNoZWRTdXJmYWNlKElDT01fSU5URVJGQUNFKHRleF9wdHIsIElEaXJlY3REcmF3U3VyZmFjZTcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRERTQ0FQUzIgKikgJm1pcG1hcF9jYXBzLCAmbmV4dF9sZXZlbCk7CiAgICBpZiAoRkFJTEVEKGhyKSkgcmV0dXJuIE5VTEw7CgogICAgc3VyZl9wdHIgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0RHJhd1N1cmZhY2U3LCBuZXh0X2xldmVsKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZTdfUmVsZWFzZShuZXh0X2xldmVsKTsKCiAgICByZXR1cm4gc3VyZl9wdHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RUZXh0dXJlMjo6TG9hZAogKgogKiBMb2FkcyBhIHRleHR1cmUgY3JlYXRlZCB3aXRoIHRoZSBERFNDQVBTX0FMTE9DT05MT0FECiAqCiAqIFRoaXMgZnVuY3Rpb24gaXNuJ3QgcmVsYXllZCB0byBXaW5lRDNEIGJlY2F1c2UgdGhlIHdob2xlIGludGVyZmFjZSBpcwogKiBpbXBsZW1lbnRlZCBpbiBERHJhdyBvbmx5LiBGb3Igc3BlZWQgaW1wcm92ZW1lbnRzIGEgaW1wbGVtZW50YXRpb24gd2hpY2gKICogdGFrZXMgT3BlbkdMIG1vcmUgaW50byBhY2NvdW50IGNvdWxkIGJlIHBsYWNlZCBpbnRvIFdpbmVEM0QuCiAqCiAqIFBhcmFtczoKICogIEQzRFRleHR1cmUyOiBBZGRyZXNzIG9mIHRoZSB0ZXh0dXJlIHRvIGxvYWQKICoKICogUmV0dXJuczoKICogIEQzRF9PSyBvbiBzdWNjZXNzCiAqICBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRC4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNEVGV4dHVyZUltcGxfTG9hZChJRGlyZWN0M0RUZXh0dXJlMiAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVGV4dHVyZTIgKkQzRFRleHR1cmUyKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpOwogICAgSURpcmVjdERyYXdTdXJmYWNlSW1wbCAqc3JjX3B0ciA9IElDT01fT0JKRUNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUyLCBEM0RUZXh0dXJlMik7CiAgICBJV2luZUQzRFBhbGV0dGUgKndpbmVfcGFsLCAqd2luZV9wYWxfc3JjOwogICAgSURpcmVjdERyYXdQYWxldHRlICpwYWwgPSBOVUxMLCAqcGFsX3NyYyA9IE5VTEw7CiAgICBJRGlyZWN0RHJhd1BhbGV0dGVJbXBsICpwYWxfaW1wbCwgKnBhbF9pbXBsX3NyYzsKICAgIEhSRVNVTFQgcmV0X3ZhbHVlID0gRDNEX09LOwoKICAgIFRSQUNFKCIoJXApLT4oJXApXG4iLCBUaGlzLCBzcmNfcHRyKTsKCiAgICBpZiAoKChzcmNfcHRyLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkgIT0gKFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfTUlQTUFQKSkgfHwKICAgICAgICAoc3JjX3B0ci0+c3VyZmFjZV9kZXNjLnUyLmR3TWlwTWFwQ291bnQgIT0gVGhpcy0+c3VyZmFjZV9kZXNjLnUyLmR3TWlwTWFwQ291bnQpKQogICAgewogICAgICAgIEVSUigiVHJ5aW5nIHRvIGxvYWQgc3VyZmFjZXMgd2l0aCBkaWZmZXJlbnQgbWlwLW1hcCBjb3VudHMgIVxuIik7CiAgICB9CgogICAgd2hpbGUoMSkKICAgIHsKICAgICAgICBERFNVUkZBQ0VERVNDICpzcmNfZCwgKmRzdF9kOwoKICAgICAgICBUUkFDRSgiIGNvcHlpbmcgc3VyZmFjZSAlcCB0byBzdXJmYWNlICVwIChtaXBtYXAgbGV2ZWwgJWQpXG4iLCBzcmNfcHRyLCBUaGlzLCBzcmNfcHRyLT5taXBtYXBfbGV2ZWwpOwoKICAgICAgICBpZiAoIFRoaXMtPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfQUxMT0NPTkxPQUQgKQogICAgICAgICAgICAvKiBJZiB0aGUgc3VyZmFjZSBpcyBub3QgYWxsb2NhdGVkIGFuZCBpdHMgbG9jYXRpb24gaXMgbm90IHlldCBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgZm9yY2UgaXQgdG8gdmlkZW8gbWVtb3J5ICovIAogICAgICAgICAgICBpZiAoICEoVGhpcy0+c3VyZmFjZV9kZXNjLmRkc0NhcHMuZHdDYXBzICYgKEREU0NBUFNfU1lTVEVNTUVNT1JZfEREU0NBUFNfVklERU9NRU1PUlkpKSApCiAgICAgICAgICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgfD0gRERTQ0FQU19WSURFT01FTU9SWTsKCiAgICAgICAgLyogU3VwcHJlc3MgdGhlIEFMTE9DT05MT0FEIGZsYWcgKi8KICAgICAgICBUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJj0gfkREU0NBUFNfQUxMT0NPTkxPQUQ7CgogICAgICAgIC8qIEdldCB0aGUgcGFsZXR0ZXMgKi8KICAgICAgICByZXRfdmFsdWUgPSBJV2luZUQzRFN1cmZhY2VfR2V0UGFsZXR0ZShUaGlzLT5XaW5lRDNEU3VyZmFjZSwgJndpbmVfcGFsKTsKICAgICAgICBpZiggcmV0X3ZhbHVlICE9IEQzRF9PSykKICAgICAgICB7CiAgICAgICAgICAgIEVSUigiSVdpbmVEM0RTdXJmYWNlOjpHZXRQYWxldHRlIGZhaWxlZCEgVGhpcyBpcyB1bmV4cGVjdGVkXG4iKTsKICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgIH0KICAgICAgICBpZih3aW5lX3BhbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEUGFsZXR0ZV9HZXRQYXJlbnQod2luZV9wYWwsIChJVW5rbm93biAqKikgJnBhbCk7CiAgICAgICAgICAgIGlmKHJldF92YWx1ZSAhPSBEM0RfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiSVdpbmVEM0RQYWxldHRlOjpHZXRQYXJlbnQgZmFpbGVkISBUaGlzIGlzIHVuZXhwZWN0ZWRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhbF9pbXBsID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBwYWwpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgcGFsX2ltcGwgPSBOVUxMOwogICAgICAgIH0KCiAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RTdXJmYWNlX0dldFBhbGV0dGUoc3JjX3B0ci0+V2luZUQzRFN1cmZhY2UsICZ3aW5lX3BhbF9zcmMpOwogICAgICAgIGlmKCByZXRfdmFsdWUgIT0gRDNEX09LKQogICAgICAgIHsKICAgICAgICAgICAgRVJSKCJJV2luZUQzRFN1cmZhY2U6OkdldFBhbGV0dGUgZmFpbGVkISBUaGlzIGlzIHVuZXhwZWN0ZWRcbiIpOwogICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CiAgICAgICAgfQogICAgICAgIGlmKHdpbmVfcGFsX3NyYykKICAgICAgICB7CiAgICAgICAgICAgIHJldF92YWx1ZSA9IElXaW5lRDNEUGFsZXR0ZV9HZXRQYXJlbnQod2luZV9wYWxfc3JjLCAoSVVua25vd24gKiopICZwYWxfc3JjKTsKICAgICAgICAgICAgaWYocmV0X3ZhbHVlICE9IEQzRF9PSykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCJJV2luZUQzRFBhbGV0dGU6OkdldFBhcmVudCBmYWlsZWQhIFRoaXMgaXMgdW5leHBlY3RlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gRDNERVJSX1RFWFRVUkVfTE9BRF9GQUlMRUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFsX2ltcGxfc3JjID0gSUNPTV9PQkpFQ1QoSURpcmVjdERyYXdQYWxldHRlSW1wbCwgSURpcmVjdERyYXdQYWxldHRlLCBwYWxfc3JjKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcGFsX2ltcGxfc3JjID0gTlVMTDsKICAgICAgICB9CgogICAgICAgIC8qIEFmdGVyIHNlZWluZyBzb21lIGxvZ3MsIG5vdCBzdXJlIGF0IGFsbCBhYm91dCB0aGlzLi4uICovCiAgICAgICAgaWYgKHBhbF9pbXBsID09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICBJV2luZUQzRFN1cmZhY2VfU2V0UGFsZXR0ZShUaGlzLT5XaW5lRDNEU3VyZmFjZSwgd2luZV9wYWwpOwogICAgICAgICAgICBpZiAocGFsX2ltcGxfc3JjICE9IE5VTEwpIElEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UocGFsX2ltcGxfc3JjLCBJRGlyZWN0RHJhd1BhbGV0dGUpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHBhbF9pbXBsX3NyYyAhPSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQQUxFVFRFRU5UUlkgcGFsZW50WzI1Nl07CiAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcyhJQ09NX0lOVEVSRkFDRShwYWxfaW1wbF9zcmMsIElEaXJlY3REcmF3UGFsZXR0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAyNTYsIHBhbGVudCk7CiAgICAgICAgICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhJQ09NX0lOVEVSRkFDRShwYWxfaW1wbCwgSURpcmVjdERyYXdQYWxldHRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDI1NiwgcGFsZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQ29weSBvbmUgc3VyZmFjZSBvbiB0aGUgb3RoZXIgKi8KICAgICAgICBkc3RfZCA9IChERFNVUkZBQ0VERVNDICopJihUaGlzLT5zdXJmYWNlX2Rlc2MpOwogICAgICAgIHNyY19kID0gKEREU1VSRkFDRURFU0MgKikmKHNyY19wdHItPnN1cmZhY2VfZGVzYyk7CgogICAgICAgIGlmICgoc3JjX2QtPmR3V2lkdGggIT0gZHN0X2QtPmR3V2lkdGgpIHx8IChzcmNfZC0+ZHdIZWlnaHQgIT0gZHN0X2QtPmR3SGVpZ2h0KSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIFNob3VsZCBhbHNvIGNoZWNrIGZvciBzYW1lIHBpeGVsIGZvcm1hdCwgdTEubFBpdGNoLCAuLi4gKi8KICAgICAgICAgICAgRVJSKCJFcnJvciBpbiBzdXJmYWNlIHNpemVzXG4iKTsKICAgICAgICAgICAgcmV0dXJuIEQzREVSUl9URVhUVVJFX0xPQURfRkFJTEVEOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBXSU5FRDNETE9DS0VEX1JFQ1QgcFNyY1JlY3QsIHBEc3RSZWN0OwoKICAgICAgICAgICAgLyogTFBESVJFQ1QzRERFVklDRTIgZDNkZCA9IChMUERJUkVDVDNEREVWSUNFMikgVGhpcy0+RDNEZGV2aWNlOyAqLwogICAgICAgICAgICAvKiBJIHNob3VsZCBwdXQgYSBtYWNybyBmb3IgdGhlIGNhbGN1bHVzIG9mIGJwcCAqLwoKICAgICAgICAgICAgLyogQ29weSBhbHNvIHRoZSBDb2xvcktleWluZyBzdHVmZiAqLwogICAgICAgICAgICBpZiAoc3JjX2QtPmR3RmxhZ3MgJiBERFNEX0NLU1JDQkxUKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkc3RfZC0+ZHdGbGFncyB8PSBERFNEX0NLU1JDQkxUOwogICAgICAgICAgICAgICAgZHN0X2QtPmRkY2tDS1NyY0JsdC5kd0NvbG9yU3BhY2VMb3dWYWx1ZSA9IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlTG93VmFsdWU7CiAgICAgICAgICAgICAgICBkc3RfZC0+ZGRja0NLU3JjQmx0LmR3Q29sb3JTcGFjZUhpZ2hWYWx1ZSA9IHNyY19kLT5kZGNrQ0tTcmNCbHQuZHdDb2xvclNwYWNlSGlnaFZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBDb3B5IHRoZSBtYWluIG1lbW9yeSB0ZXh0dXJlIGludG8gdGhlIHN1cmZhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgT3BlbkdMCiAgICAgICAgICAgICAgdGV4dHVyZSBvYmplY3QuICovCgogICAgICAgICAgICByZXRfdmFsdWUgPSBJV2luZUQzRFN1cmZhY2VfTG9ja1JlY3Qoc3JjX3B0ci0+V2luZUQzRFN1cmZhY2UsICZwU3JjUmVjdCwgTlVMTCwgMCk7CiAgICAgICAgICAgIGlmKHJldF92YWx1ZSAhPSBEM0RfT0spCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiICglcCkgTG9ja2luZyB0aGUgc291cmNlIHN1cmZhY2UgZmFpbGVkXG4iLCBUaGlzKTsKICAgICAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0X3ZhbHVlID0gSVdpbmVEM0RTdXJmYWNlX0xvY2tSZWN0KFRoaXMtPldpbmVEM0RTdXJmYWNlLCAmcERzdFJlY3QsIE5VTEwsIDApOwogICAgICAgICAgICBpZihyZXRfdmFsdWUgIT0gRDNEX09LKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIiAoJXApIExvY2tpbmcgdGhlIGRlc3RpbmF0aW9uIHN1cmZhY2UgZmFpbGVkXG4iLCBUaGlzKTsKICAgICAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9VbmxvY2tSZWN0KHNyY19wdHItPldpbmVEM0RTdXJmYWNlKTsKICAgICAgICAgICAgICAgIHJldHVybiBEM0RFUlJfVEVYVFVSRV9MT0FEX0ZBSUxFRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKFRoaXMtPnN1cmZhY2VfZGVzYy51NC5kZHBmUGl4ZWxGb3JtYXQuZHdGbGFncyAmIEREUEZfRk9VUkNDKQogICAgICAgICAgICAgICAgbWVtY3B5KHBEc3RSZWN0LnBCaXRzLCBwU3JjUmVjdC5wQml0cywgc3JjX3B0ci0+c3VyZmFjZV9kZXNjLnUxLmR3TGluZWFyU2l6ZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIG1lbWNweShwRHN0UmVjdC5wQml0cywgcFNyY1JlY3QucEJpdHMsIHBTcmNSZWN0LlBpdGNoICogc3JjX2QtPmR3SGVpZ2h0KTsKCiAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9VbmxvY2tSZWN0KHNyY19wdHItPldpbmVEM0RTdXJmYWNlKTsKICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1VubG9ja1JlY3QoVGhpcy0+V2luZUQzRFN1cmZhY2UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNyY19wdHItPnN1cmZhY2VfZGVzYy5kZHNDYXBzLmR3Q2FwcyAmIEREU0NBUFNfTUlQTUFQKQogICAgICAgIHsKICAgICAgICAgICAgc3JjX3B0ciA9IGdldF9zdWJfbWltYXBsZXZlbChzcmNfcHRyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc3JjX3B0ciA9IE5VTEw7CiAgICAgICAgfQogICAgICAgIGlmIChUaGlzLT5zdXJmYWNlX2Rlc2MuZGRzQ2Fwcy5kd0NhcHMgJiBERFNDQVBTX01JUE1BUCkKICAgICAgICB7CiAgICAgICAgICAgIFRoaXMgPSBnZXRfc3ViX21pbWFwbGV2ZWwoVGhpcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFRoaXMgPSBOVUxMOwogICAgICAgIH0KCiAgICAgICAgaWYgKChzcmNfcHRyID09IE5VTEwpIHx8IChUaGlzID09IE5VTEwpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNyY19wdHIgIT0gVGhpcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSKCIgTG9hZGluZyBzdXJmYWNlIHdpdGggZGlmZmVyZW50IG1pcG1hcCBzdHJ1Y3R1cmUgISEhXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJldF92YWx1ZTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJClRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfTG9hZChJRGlyZWN0M0RUZXh0dXJlICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRFRleHR1cmUgKkQzRFRleHR1cmUpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIGlmYWNlKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZUltcGwgKlRleHR1cmUgPSBJQ09NX09CSkVDVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBEM0RUZXh0dXJlKTsKICAgIFRSQUNFKCIoJXApLT4oJXApIHRodW5raW5nIHRvIElEaXJlY3QzRFRleHR1cmUyIGludGVyZmFjZS5cbiIsIFRoaXMsIFRleHR1cmUpOwoKICAgIHJldHVybiBJRGlyZWN0M0RUZXh0dXJlMl9Mb2FkKENPTV9JTlRFUkZBQ0VfQ0FTVChJRGlyZWN0RHJhd1N1cmZhY2VJbXBsLCBJRGlyZWN0M0RUZXh0dXJlLCBJRGlyZWN0M0RUZXh0dXJlMiwgaWZhY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NX0lOVEVSRkFDRV9DQVNUKElEaXJlY3REcmF3U3VyZmFjZUltcGwsIElEaXJlY3QzRFRleHR1cmUsIElEaXJlY3QzRFRleHR1cmUyLCBEM0RUZXh0dXJlKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBUaGUgVlRhYmxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmNvbnN0IElEaXJlY3QzRFRleHR1cmUyVnRibCBJRGlyZWN0M0RUZXh0dXJlMl9WdGJsID0KewogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9RdWVyeUludGVyZmFjZSwKICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzJfQWRkUmVmLAogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMl9SZWxlYXNlLAogICAgSURpcmVjdDNEVGV4dHVyZUltcGxfR2V0SGFuZGxlLAogICAgSURpcmVjdDNEVGV4dHVyZUltcGxfUGFsZXR0ZUNoYW5nZWQsCiAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF9Mb2FkLAp9OwoKCmNvbnN0IElEaXJlY3QzRFRleHR1cmVWdGJsIElEaXJlY3QzRFRleHR1cmUxX1Z0YmwgPQp7CiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1F1ZXJ5SW50ZXJmYWNlLAogICAgVGh1bmtfSURpcmVjdDNEVGV4dHVyZUltcGxfMV9BZGRSZWYsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1JlbGVhc2UsCiAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0luaXRpYWxpemUsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0dldEhhbmRsZSwKICAgIFRodW5rX0lEaXJlY3QzRFRleHR1cmVJbXBsXzFfUGFsZXR0ZUNoYW5nZWQsCiAgICBUaHVua19JRGlyZWN0M0RUZXh0dXJlSW1wbF8xX0xvYWQsCiAgICBJRGlyZWN0M0RUZXh0dXJlSW1wbF8xX1VubG9hZCwKfTsK