LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICB1bmljb2RlZGF0YSAtLSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFVuaWNvZGUgNC4xIGRhdGEgYmFzZS4KCiAgIERhdGEgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBVbmljb2RlIDQuMSBVbmljb2RlRGF0YS50eHQgZmlsZS4KCiAgIFdyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgogICBNb2RpZmllZCBmb3IgUHl0aG9uIDIuMCBieSBGcmVkcmlrIEx1bmRoIChmcmVkcmlrQHB5dGhvbndhcmUuY29tKQogICBNb2RpZmllZCBieSBNYXJ0aW4gdi4gTPZ3aXMgKG1hcnRpbkB2LmxvZXdpcy5kZSkKCiAgIENvcHlyaWdodCAoYykgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiUHl0aG9uLmgiCiNpbmNsdWRlICJ1Y25oYXNoLmgiCiNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKCi8qIGNoYXJhY3RlciBwcm9wZXJ0aWVzICovCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OwkvKiBpbmRleCBpbnRvCgkJCQkJICAgX1B5VW5pY29kZV9DYXRlZ29yeU5hbWVzICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyCWNvbWJpbmluZzsgCS8qIGNvbWJpbmluZyBjbGFzcyB2YWx1ZSAwIC0gMjU1ICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyCWJpZGlyZWN0aW9uYWw7IAkvKiBpbmRleCBpbnRvCgkJCQkJICAgX1B5VW5pY29kZV9CaWRpcmVjdGlvbmFsTmFtZXMgKi8KICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWlycm9yZWQ7CS8qIHRydWUgaWYgbWlycm9yZWQgaW4gYmlkaXIgbW9kZSAqLwogICAgY29uc3QgdW5zaWduZWQgY2hhciBlYXN0X2FzaWFuX3dpZHRoOwkvKiBpbmRleCBpbnRvCgkJCQkJCSAgIF9QeVVuaWNvZGVfRWFzdEFzaWFuV2lkdGggKi8KfSBfUHlVbmljb2RlX0RhdGFiYXNlUmVjb3JkOwoKdHlwZWRlZiBzdHJ1Y3QgY2hhbmdlX3JlY29yZCB7CiAgICAvKiBzZXF1ZW5jZSBvZiBmaWVsZHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGluIG1lcmdlX29sZF92ZXJzaW9uICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGJpZGlyX2NoYW5nZWQ7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5X2NoYW5nZWQ7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGRlY2ltYWxfY2hhbmdlZDsKICAgIGNvbnN0IGludCBudW1lcmljX2NoYW5nZWQ7Cn0gY2hhbmdlX3JlY29yZDsKCi8qIGRhdGEgZmlsZSBnZW5lcmF0ZWQgYnkgVG9vbHMvdW5pY29kZS9tYWtldW5pY29kZWRhdGEucHkgKi8KI2luY2x1ZGUgInVuaWNvZGVkYXRhX2RiLmgiCgpzdGF0aWMgY29uc3QgX1B5VW5pY29kZV9EYXRhYmFzZVJlY29yZCoKX2dldHJlY29yZF9leChQeV9VQ1M0IGNvZGUpCnsKICAgIGludCBpbmRleDsKICAgIGlmIChjb2RlID49IDB4MTEwMDAwKQogICAgICAgIGluZGV4ID0gMDsKICAgIGVsc2UgewogICAgICAgIGluZGV4ID0gaW5kZXgxWyhjb2RlPj5TSElGVCldOwogICAgICAgIGluZGV4ID0gaW5kZXgyWyhpbmRleDw8U0hJRlQpKyhjb2RlJigoMTw8U0hJRlQpLTEpKV07CiAgICB9CgogICAgcmV0dXJuICZfUHlVbmljb2RlX0RhdGFiYXNlX1JlY29yZHNbaW5kZXhdOwp9CgovKiAtLS0tLS0tLS0tLS0tIFByZXZpb3VzLXZlcnNpb24gQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KdHlwZWRlZiBzdHJ1Y3QgcHJldmlvdXNfdmVyc2lvbiB7CiAgICBQeU9iamVjdF9IRUFECiAgICBjb25zdCBjaGFyICpuYW1lOwogICAgY29uc3QgY2hhbmdlX3JlY29yZCogKCpnZXRyZWNvcmQpKFB5X1VDUzQpOwogICAgUHlfVUNTNCAoKm5vcm1hbGl6YXRpb24pKFB5X1VDUzQpOwp9IFByZXZpb3VzREJWZXJzaW9uOwoKI2RlZmluZSBnZXRfb2xkX3JlY29yZChzZWxmLCB2KSAgICAoKCgoUHJldmlvdXNEQlZlcnNpb24qKXNlbGYpLT5nZXRyZWNvcmQpKHYpKQoKc3RhdGljIFB5TWVtYmVyRGVmIERCX21lbWJlcnNbXSA9IHsKCXsidW5pZGF0YV92ZXJzaW9uIiwgVF9TVFJJTkcsIG9mZnNldG9mKFByZXZpb3VzREJWZXJzaW9uLCBuYW1lKSwgUkVBRE9OTFl9LAogICAgICAgIHtOVUxMfQp9OwoKLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwpzdGF0aWMgUHlUeXBlT2JqZWN0IFVDRF9UeXBlOwoKc3RhdGljIFB5T2JqZWN0KgpuZXdfcHJldmlvdXNfdmVyc2lvbihjb25zdCBjaGFyKm5hbWUsIGNvbnN0IGNoYW5nZV9yZWNvcmQqICgqZ2V0cmVjb3JkKShQeV9VQ1M0KSwKICAgICAgICAgICAgICAgICAgICAgUHlfVUNTNCAoKm5vcm1hbGl6YXRpb24pKFB5X1VDUzQpKQp7CglQcmV2aW91c0RCVmVyc2lvbiAqc2VsZjsKCXNlbGYgPSBQeU9iamVjdF9OZXcoUHJldmlvdXNEQlZlcnNpb24sICZVQ0RfVHlwZSk7CglpZiAoc2VsZiA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoJc2VsZi0+bmFtZSA9IG5hbWU7CglzZWxmLT5nZXRyZWNvcmQgPSBnZXRyZWNvcmQ7CiAgICAgICAgc2VsZi0+bm9ybWFsaXphdGlvbiA9IG5vcm1hbGl6YXRpb247CglyZXR1cm4gKFB5T2JqZWN0KilzZWxmOwp9CgoKc3RhdGljIFB5X1VDUzQgZ2V0dWNoYXIoUHlVbmljb2RlT2JqZWN0ICpvYmopCnsKICAgIFB5X1VOSUNPREUgKnYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmopOwoKICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUob2JqKSA9PSAxKQoJcmV0dXJuICp2OwojaWZuZGVmIFB5X1VOSUNPREVfV0lERQogICAgZWxzZSBpZiAoKFB5VW5pY29kZV9HRVRfU0laRShvYmopID09IDIpICYmCiAgICAgICAgICAgICAoMHhEODAwIDw9IHZbMF0gJiYgdlswXSA8PSAweERCRkYpICYmCiAgICAgICAgICAgICAoMHhEQzAwIDw9IHZbMV0gJiYgdlsxXSA8PSAweERGRkYpKQoJcmV0dXJuICgoKHZbMF0gJiAweDNGRik8PDEwKSB8ICh2WzFdICYgMHgzRkYpKSArIDB4MTAwMDA7CiNlbmRpZgogICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAibmVlZCBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhcyBwYXJhbWV0ZXIiKTsKICAgIHJldHVybiAoUHlfVUNTNCktMTsKfQoKLyogLS0tIE1vZHVsZSBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfZGVjaW1hbF9fZG9jX18sCiJkZWNpbWFsKHVuaWNoclssIGRlZmF1bHRdKVxuXApcblwKUmV0dXJucyB0aGUgZGVjaW1hbCB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdW5pY2hyXG5cCmFzIGludGVnZXIuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgZGVmYXVsdCBpcyByZXR1cm5lZCwgb3IsIGlmXG5cCm5vdCBnaXZlbiwgVmFsdWVFcnJvciBpcyByYWlzZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9kZWNpbWFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgUHlPYmplY3QgKmRlZm9iaiA9IE5VTEw7CiAgICBpbnQgaGF2ZV9vbGQgPSAwOwogICAgbG9uZyByYzsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86ZGVjaW1hbCIsICZQeVVuaWNvZGVfVHlwZSwgJnYsICZkZWZvYmopKQogICAgICAgIHJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApIHsKICAgICAgICAgICAgLyogdW5hc3NpZ25lZCAqLwogICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgfSAKICAgICAgICBlbHNlIGlmIChvbGQtPmRlY2ltYWxfY2hhbmdlZCAhPSAweEZGKSB7CiAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgcmMgPSBvbGQtPmRlY2ltYWxfY2hhbmdlZDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFoYXZlX29sZCkKICAgICAgICByYyA9IFB5X1VOSUNPREVfVE9ERUNJTUFMKGMpOwogICAgaWYgKHJjIDwgMCkgewoJaWYgKGRlZm9iaiA9PSBOVUxMKSB7CgkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCgkJCSAgICAibm90IGEgZGVjaW1hbCIpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKCX0KCWVsc2UgewoJICAgIFB5X0lOQ1JFRihkZWZvYmopOwoJICAgIHJldHVybiBkZWZvYmo7Cgl9CiAgICB9CiAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmMpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfZGlnaXRfX2RvY19fLAoiZGlnaXQodW5pY2hyWywgZGVmYXVsdF0pXG5cClxuXApSZXR1cm5zIHRoZSBkaWdpdCB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdW5pY2hyIGFzXG5cCmludGVnZXIuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgZGVmYXVsdCBpcyByZXR1cm5lZCwgb3IsIGlmXG5cCm5vdCBnaXZlbiwgVmFsdWVFcnJvciBpcyByYWlzZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9kaWdpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIFB5T2JqZWN0ICpkZWZvYmogPSBOVUxMOwogICAgbG9uZyByYzsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86ZGlnaXQiLCAmUHlVbmljb2RlX1R5cGUsICZ2LCAmZGVmb2JqKSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgcmMgPSBQeV9VTklDT0RFX1RPRElHSVQoYyk7CiAgICBpZiAocmMgPCAwKSB7CglpZiAoZGVmb2JqID09IE5VTEwpIHsKCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vdCBhIGRpZ2l0Iik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoJfQoJZWxzZSB7CgkgICAgUHlfSU5DUkVGKGRlZm9iaik7CgkgICAgcmV0dXJuIGRlZm9iajsKCX0KICAgIH0KICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyYyk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9udW1lcmljX19kb2NfXywKIm51bWVyaWModW5pY2hyWywgZGVmYXVsdF0pXG5cClxuXApSZXR1cm5zIHRoZSBudW1lcmljIHZhbHVlIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlciB1bmljaHJcblwKYXMgZmxvYXQuIElmIG5vIHN1Y2ggdmFsdWUgaXMgZGVmaW5lZCwgZGVmYXVsdCBpcyByZXR1cm5lZCwgb3IsIGlmXG5cCm5vdCBnaXZlbiwgVmFsdWVFcnJvciBpcyByYWlzZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9udW1lcmljKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgUHlPYmplY3QgKmRlZm9iaiA9IE5VTEw7CiAgICBpbnQgaGF2ZV9vbGQgPSAwOwogICAgZG91YmxlIHJjOwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8TzpudW1lcmljIiwgJlB5VW5pY29kZV9UeXBlLCAmdiwgJmRlZm9iaikpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsIGMpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkgewogICAgICAgICAgICAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgcmMgPSAtMS4wOwogICAgICAgIH0gCiAgICAgICAgZWxzZSBpZiAob2xkLT5kZWNpbWFsX2NoYW5nZWQgIT0gMHhGRikgewogICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgIHJjID0gb2xkLT5kZWNpbWFsX2NoYW5nZWQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghaGF2ZV9vbGQpCiAgICAgICAgcmMgPSBQeV9VTklDT0RFX1RPTlVNRVJJQyhjKTsKICAgIGlmIChyYyA9PSAtMS4wKSB7CglpZiAoZGVmb2JqID09IE5VTEwpIHsKCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vdCBhIG51bWVyaWMgY2hhcmFjdGVyIik7CgkgICAgcmV0dXJuIE5VTEw7Cgl9CgllbHNlIHsKCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKCSAgICByZXR1cm4gZGVmb2JqOwoJfQogICAgfQogICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyYyk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9jYXRlZ29yeV9fZG9jX18sCiJjYXRlZ29yeSh1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBnZW5lcmFsIGNhdGVnb3J5IGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuXAp1bmljaHIgYXMgc3RyaW5nLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfY2F0ZWdvcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBpbnQgaW5kZXg7CiAgICBQeV9VQ1M0IGM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpjYXRlZ29yeSIsCgkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCglyZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5jYXRlZ29yeTsKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCAhPSAweEZGKQogICAgICAgICAgICBpbmRleCA9IG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZDsKICAgIH0KICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmcoX1B5VW5pY29kZV9DYXRlZ29yeU5hbWVzW2luZGV4XSk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsX19kb2NfXywKImJpZGlyZWN0aW9uYWwodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgYmlkaXJlY3Rpb25hbCBjYXRlZ29yeSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcblwKdW5pY2hyIGFzIHN0cmluZy4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBhbiBlbXB0eSBzdHJpbmcgaXNcblwKcmV0dXJuZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgaW50IGluZGV4OwogICAgUHlfVUNTNCBjOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6YmlkaXJlY3Rpb25hbCIsCgkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCglyZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5iaWRpcmVjdGlvbmFsOwogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCBjKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgICAgIGVsc2UgaWYgKG9sZC0+YmlkaXJfY2hhbmdlZCAhPSAweEZGKQogICAgICAgICAgICBpbmRleCA9IG9sZC0+YmlkaXJfY2hhbmdlZDsKICAgIH0KICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmcoX1B5VW5pY29kZV9CaWRpcmVjdGlvbmFsTmFtZXNbaW5kZXhdKTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2NvbWJpbmluZ19fZG9jX18sCiJjb21iaW5pbmcodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgY2Fub25pY2FsIGNvbWJpbmluZyBjbGFzcyBhc3NpZ25lZCB0byB0aGUgVW5pY29kZVxuXApjaGFyYWN0ZXIgdW5pY2hyIGFzIGludGVnZXIuIFJldHVybnMgMCBpZiBubyBjb21iaW5pbmcgY2xhc3MgaXNcblwKZGVmaW5lZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2NvbWJpbmluZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmNvbWJpbmluZyIsCgkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCglyZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5jb21iaW5pbmc7CiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsIGMpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkKICAgICAgICAgICAgaW5kZXggPSAwOyAvKiB1bmFzc2lnbmVkICovCiAgICB9CiAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaW5kZXgpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfbWlycm9yZWRfX2RvY19fLAoibWlycm9yZWQodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgbWlycm9yZWQgcHJvcGVydHkgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG5cCnVuaWNociBhcyBpbnRlZ2VyLiBSZXR1cm5zIDEgaWYgdGhlIGNoYXJhY3RlciBoYXMgYmVlbiBpZGVudGlmaWVkIGFzXG5cCmEgXCJtaXJyb3JlZFwiIGNoYXJhY3RlciBpbiBiaWRpcmVjdGlvbmFsIHRleHQsIDAgb3RoZXJ3aXNlLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfbWlycm9yZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBpbnQgaW5kZXg7CiAgICBQeV9VQ1M0IGM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITptaXJyb3JlZCIsCgkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCglyZXR1cm4gTlVMTDsKICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgIGlmIChjID09IChQeV9VQ1M0KS0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkX2V4KGMpLT5taXJyb3JlZDsKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKQogICAgICAgICAgICBpbmRleCA9IDA7IC8qIHVuYXNzaWduZWQgKi8KICAgIH0KICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpbmRleCk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9lYXN0X2FzaWFuX3dpZHRoX19kb2NfXywKImVhc3RfYXNpYW5fd2lkdGgodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgZWFzdCBhc2lhbiB3aWR0aCBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcblwKdW5pY2hyIGFzIHN0cmluZy4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2Vhc3RfYXNpYW5fd2lkdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBpbnQgaW5kZXg7CiAgICBQeV9VQ1M0IGM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITplYXN0X2FzaWFuX3dpZHRoIiwKCQkJICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKCXJldHVybiBOVUxMOwogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpbmRleCA9IChpbnQpIF9nZXRyZWNvcmRfZXgoYyktPmVhc3RfYXNpYW5fd2lkdGg7CiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsIGMpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkKICAgICAgICAgICAgaW5kZXggPSAwOyAvKiB1bmFzc2lnbmVkICovCiAgICB9CiAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nKF9QeVVuaWNvZGVfRWFzdEFzaWFuV2lkdGhOYW1lc1tpbmRleF0pOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfZGVjb21wb3NpdGlvbl9fZG9jX18sCiJkZWNvbXBvc2l0aW9uKHVuaWNocilcblwKXG5cClJldHVybnMgdGhlIGNoYXJhY3RlciBkZWNvbXBvc2l0aW9uIG1hcHBpbmcgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGVcblwKY2hhcmFjdGVyIHVuaWNociBhcyBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpbiBjYXNlIG5vXG5cCnN1Y2ggbWFwcGluZyBpcyBkZWZpbmVkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfZGVjb21wb3NpdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGNoYXIgZGVjb21wWzI1Nl07CiAgICBpbnQgY29kZSwgaW5kZXgsIGNvdW50LCBpOwogICAgdW5zaWduZWQgaW50IHByZWZpeF9pbmRleDsKICAgIFB5X1VDUzQgYzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmRlY29tcG9zaXRpb24iLAoJCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQoJcmV0dXJuIE5VTEw7CiAgICBjID0gZ2V0dWNoYXIodik7CiAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBjb2RlID0gKGludCljOwoKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgYyk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKQogICAgICAgICAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nKCIiKTsgLyogdW5hc3NpZ25lZCAqLwogICAgfQoKICAgIGlmIChjb2RlIDwgMCB8fCBjb2RlID49IDB4MTEwMDAwKQogICAgICAgIGluZGV4ID0gMDsKICAgIGVsc2UgewogICAgICAgIGluZGV4ID0gZGVjb21wX2luZGV4MVsoY29kZT4+REVDT01QX1NISUZUKV07CiAgICAgICAgaW5kZXggPSBkZWNvbXBfaW5kZXgyWyhpbmRleDw8REVDT01QX1NISUZUKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZSYoKDE8PERFQ09NUF9TSElGVCktMSkpXTsKICAgIH0KCiAgICAvKiBoaWdoIGJ5dGUgaXMgbnVtYmVyIG9mIGhleCBieXRlcyAodXN1YWxseSBvbmUgb3IgdHdvKSwgbG93IGJ5dGUKICAgICAgIGlzIHByZWZpeCBjb2RlIChmcm9tKi8KICAgIGNvdW50ID0gZGVjb21wX2RhdGFbaW5kZXhdID4+IDg7CgogICAgLyogWFhYOiBjb3VsZCBhbGxvY2F0ZSB0aGUgUHlTdHJpbmcgdXAgZnJvbnQgaW5zdGVhZAogICAgICAgKHN0cmxlbihwcmVmaXgpICsgNSAqIGNvdW50ICsgMSBieXRlcykgKi8KCiAgICAvKiBCYXNlZCBvbiBob3cgaW5kZXggaXMgY2FsY3VsYXRlZCBhYm92ZSBhbmQgZGVjb21wX2RhdGEgaXMgZ2VuZXJhdGVkCiAgICAgICBmcm9tIFRvb2xzL3VuaWNvZGUvbWFrZXVuaWNvZGVkYXRhLnB5LCBpdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlCiAgICAgICB0byBvdmVyZmxvdyBkZWNvbXBfcHJlZml4LiAqLwogICAgcHJlZml4X2luZGV4ID0gZGVjb21wX2RhdGFbaW5kZXhdICYgMjU1OwogICAgYXNzZXJ0KHByZWZpeF9pbmRleCA8IChzaXplb2YoZGVjb21wX3ByZWZpeCkvc2l6ZW9mKCpkZWNvbXBfcHJlZml4KSkpOwoKICAgIC8qIGNvcHkgcHJlZml4ICovCiAgICBpID0gc3RybGVuKGRlY29tcF9wcmVmaXhbcHJlZml4X2luZGV4XSk7CiAgICBtZW1jcHkoZGVjb21wLCBkZWNvbXBfcHJlZml4W3ByZWZpeF9pbmRleF0sIGkpOwoKICAgIHdoaWxlIChjb3VudC0tID4gMCkgewogICAgICAgIGlmIChpKQogICAgICAgICAgICBkZWNvbXBbaSsrXSA9ICcgJzsKICAgICAgICBhc3NlcnQoKHNpemVfdClpIDwgc2l6ZW9mKGRlY29tcCkpOwogICAgICAgIFB5T1Nfc25wcmludGYoZGVjb21wICsgaSwgc2l6ZW9mKGRlY29tcCkgLSBpLCAiJTA0WCIsCiAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBfZGF0YVsrK2luZGV4XSk7CiAgICAgICAgaSArPSBzdHJsZW4oZGVjb21wICsgaSk7CiAgICB9CiAgICAKICAgIGRlY29tcFtpXSA9ICdcMCc7CgogICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZyhkZWNvbXApOwp9CgpzdGF0aWMgdm9pZApnZXRfZGVjb21wX3JlY29yZChQeU9iamVjdCAqc2VsZiwgUHlfVUNTNCBjb2RlLCBpbnQgKmluZGV4LCBpbnQgKnByZWZpeCwgaW50ICpjb3VudCkKewogICAgaWYgKGNvZGUgPj0gMHgxMTAwMDApIHsKICAgICAgICAqaW5kZXggPSAwOwogICAgfSBlbHNlIGlmIChzZWxmICYmIGdldF9vbGRfcmVjb3JkKHNlbGYsIGNvZGUpLT5jYXRlZ29yeV9jaGFuZ2VkPT0wKSB7CiAgICAgICAgLyogdW5hc3NpZ25lZCBpbiBvbGQgdmVyc2lvbiAqLwogICAgICAgICppbmRleCA9IDA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAqaW5kZXggPSBkZWNvbXBfaW5kZXgxWyhjb2RlPj5ERUNPTVBfU0hJRlQpXTsKICAgICAgICAqaW5kZXggPSBkZWNvbXBfaW5kZXgyWygqaW5kZXg8PERFQ09NUF9TSElGVCkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZSYoKDE8PERFQ09NUF9TSElGVCktMSkpXTsKICAgIH0KCQogICAgLyogaGlnaCBieXRlIGlzIG51bWJlciBvZiBoZXggYnl0ZXMgKHVzdWFsbHkgb25lIG9yIHR3byksIGxvdyBieXRlCiAgICAgICBpcyBwcmVmaXggY29kZSAoZnJvbSovCiAgICAqY291bnQgPSBkZWNvbXBfZGF0YVsqaW5kZXhdID4+IDg7CiAgICAqcHJlZml4ID0gZGVjb21wX2RhdGFbKmluZGV4XSAmIDI1NTsKCiAgICAoKmluZGV4KSsrOwp9CgojZGVmaW5lIFNCYXNlICAgMHhBQzAwCiNkZWZpbmUgTEJhc2UgICAweDExMDAKI2RlZmluZSBWQmFzZSAgIDB4MTE2MQojZGVmaW5lIFRCYXNlICAgMHgxMUE3CiNkZWZpbmUgTENvdW50ICAxOQojZGVmaW5lIFZDb3VudCAgMjEKI2RlZmluZSBUQ291bnQgIDI4CiNkZWZpbmUgTkNvdW50ICAoVkNvdW50KlRDb3VudCkKI2RlZmluZSBTQ291bnQgIChMQ291bnQqTkNvdW50KQoKc3RhdGljIFB5T2JqZWN0KgpuZmRfbmZrZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmlucHV0LCBpbnQgaykKewogICAgUHlPYmplY3QgKnJlc3VsdDsKICAgIFB5X1VOSUNPREUgKmksICplbmQsICpvOwogICAgLyogTG9uZ2VzdCBkZWNvbXBvc2l0aW9uIGluIFVuaWNvZGUgMy4yOiBVK0ZERkEgKi8KICAgIFB5X1VOSUNPREUgc3RhY2tbMjBdOyAKICAgIFB5X3NzaXplX3Qgc3BhY2UsIGlzaXplOwogICAgaW50IGluZGV4LCBwcmVmaXgsIGNvdW50LCBzdGFja3B0cjsKICAgIHVuc2lnbmVkIGNoYXIgcHJldiwgY3VyOwoJCiAgICBzdGFja3B0ciA9IDA7CiAgICBpc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShpbnB1dCk7CiAgICAvKiBPdmVyYWxsb2NhdGUgYXRtb3N0IDEwIGNoYXJhY3RlcnMuICovCiAgICBzcGFjZSA9IChpc2l6ZSA+IDEwID8gMTAgOiBpc2l6ZSkgKyBpc2l6ZTsKICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzcGFjZSk7CiAgICBpZiAoIXJlc3VsdCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGkgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShpbnB1dCk7CiAgICBlbmQgPSBpICsgaXNpemU7CiAgICBvID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKCiAgICB3aGlsZSAoaSA8IGVuZCkgewogICAgICAgIHN0YWNrW3N0YWNrcHRyKytdID0gKmkrKzsKICAgICAgICB3aGlsZShzdGFja3B0cikgewogICAgICAgICAgICBQeV9VTklDT0RFIGNvZGUgPSBzdGFja1stLXN0YWNrcHRyXTsKICAgICAgICAgICAgLyogSGFuZ3VsIERlY29tcG9zaXRpb24gYWRkcyB0aHJlZSBjaGFyYWN0ZXJzIGluCiAgICAgICAgICAgICAgIGEgc2luZ2xlIHN0ZXAsIHNvIHdlIG5lZWQgYXRsZWFzdCB0aGF0IG11Y2ggcm9vbS4gKi8KICAgICAgICAgICAgaWYgKHNwYWNlIDwgMykgewogICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdzaXplID0gUHlCeXRlc19HRVRfU0laRShyZXN1bHQpICsgMTA7CiAgICAgICAgICAgICAgICBzcGFjZSArPSAxMDsKICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIG5ld3NpemUpID09IC0xKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgbyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCkgKyBuZXdzaXplIC0gc3BhY2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogSGFuZ3VsIERlY29tcG9zaXRpb24uICovCiAgICAgICAgICAgIGlmIChTQmFzZSA8PSBjb2RlICYmIGNvZGUgPCAoU0Jhc2UrU0NvdW50KSkgewogICAgICAgICAgICAgICAgaW50IFNJbmRleCA9IGNvZGUgLSBTQmFzZTsKICAgICAgICAgICAgICAgIGludCBMID0gTEJhc2UgKyBTSW5kZXggLyBOQ291bnQ7CiAgICAgICAgICAgICAgICBpbnQgViA9IFZCYXNlICsgKFNJbmRleCAlIE5Db3VudCkgLyBUQ291bnQ7CiAgICAgICAgICAgICAgICBpbnQgVCA9IFRCYXNlICsgU0luZGV4ICUgVENvdW50OwogICAgICAgICAgICAgICAgKm8rKyA9IEw7CiAgICAgICAgICAgICAgICAqbysrID0gVjsKICAgICAgICAgICAgICAgIHNwYWNlIC09IDI7CiAgICAgICAgICAgICAgICBpZiAoVCAhPSBUQmFzZSkgewogICAgICAgICAgICAgICAgICAgICpvKysgPSBUOwogICAgICAgICAgICAgICAgICAgIHNwYWNlIC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogbm9ybWFsaXphdGlvbiBjaGFuZ2VzICovCiAgICAgICAgICAgIGlmIChzZWxmKSB7CiAgICAgICAgICAgICAgICBQeV9VQ1M0IHZhbHVlID0gKChQcmV2aW91c0RCVmVyc2lvbiopc2VsZiktPm5vcm1hbGl6YXRpb24oY29kZSk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YWNrW3N0YWNrcHRyKytdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIE90aGVyIGRlY29tcG9zaXRpb25zLiAqLwogICAgICAgICAgICBnZXRfZGVjb21wX3JlY29yZChzZWxmLCBjb2RlLCAmaW5kZXgsICZwcmVmaXgsICZjb3VudCk7CgogICAgICAgICAgICAvKiBDb3B5IGNoYXJhY3RlciBpZiBpdCBpcyBub3QgZGVjb21wb3NhYmxlLCBvciBoYXMgYQogICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24sIGJ1dCB3ZSBkbyBORkQuICovCiAgICAgICAgICAgIGlmICghY291bnQgfHwgKHByZWZpeCAmJiAhaykpIHsKICAgICAgICAgICAgICAgICpvKysgPSBjb2RlOwogICAgICAgICAgICAgICAgc3BhY2UtLTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIENvcHkgZGVjb21wb3NpdGlvbiBvbnRvIHRoZSBzdGFjaywgaW4gcmV2ZXJzZQogICAgICAgICAgICAgICBvcmRlci4gICovCiAgICAgICAgICAgIHdoaWxlKGNvdW50KSB7CiAgICAgICAgICAgICAgICBjb2RlID0gZGVjb21wX2RhdGFbaW5kZXggKyAoLS1jb3VudCldOwogICAgICAgICAgICAgICAgc3RhY2tbc3RhY2twdHIrK10gPSBjb2RlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIERyb3Agb3ZlcmFsbG9jYXRpb24uIENhbm5vdCBmYWlsLiAqLwogICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KSAtIHNwYWNlKTsKCiAgICAvKiBTb3J0IGNhbm9uaWNhbGx5LiAqLwogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CiAgICBwcmV2ID0gX2dldHJlY29yZF9leCgqaSktPmNvbWJpbmluZzsKICAgIGVuZCA9IGkgKyBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KTsKICAgIGZvciAoaSsrOyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBjdXIgPSBfZ2V0cmVjb3JkX2V4KCppKS0+Y29tYmluaW5nOwogICAgICAgIGlmIChwcmV2ID09IDAgfHwgY3VyID09IDAgfHwgcHJldiA8PSBjdXIpIHsKICAgICAgICAgICAgcHJldiA9IGN1cjsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8qIE5vbi1jYW5vbmljYWwgb3JkZXIuIE5lZWQgdG8gc3dpdGNoICppIHdpdGggcHJldmlvdXMuICovCiAgICAgICAgbyA9IGkgLSAxOwogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIFB5X1VOSUNPREUgdG1wID0gb1sxXTsKICAgICAgICAgICAgb1sxXSA9IG9bMF07CiAgICAgICAgICAgIG9bMF0gPSB0bXA7CiAgICAgICAgICAgIG8tLTsKICAgICAgICAgICAgaWYgKG8gPCBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIHByZXYgPSBfZ2V0cmVjb3JkX2V4KCpvKS0+Y29tYmluaW5nOwogICAgICAgICAgICBpZiAocHJldiA9PSAwIHx8IHByZXYgPD0gY3VyKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHByZXYgPSBfZ2V0cmVjb3JkX2V4KCppKS0+Y29tYmluaW5nOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIGludApmaW5kX25mY19pbmRleChQeU9iamVjdCAqc2VsZiwgc3RydWN0IHJlaW5kZXgqIG5mYywgUHlfVU5JQ09ERSBjb2RlKQp7CiAgICBpbnQgaW5kZXg7CiAgICBmb3IgKGluZGV4ID0gMDsgbmZjW2luZGV4XS5zdGFydDsgaW5kZXgrKykgewogICAgICAgIGludCBzdGFydCA9IG5mY1tpbmRleF0uc3RhcnQ7CiAgICAgICAgaWYgKGNvZGUgPCBzdGFydCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmIChjb2RlIDw9IHN0YXJ0ICsgbmZjW2luZGV4XS5jb3VudCkgewogICAgICAgICAgICBpbnQgZGVsdGEgPSBjb2RlIC0gc3RhcnQ7CiAgICAgICAgICAgIHJldHVybiBuZmNbaW5kZXhdLmluZGV4ICsgZGVsdGE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9CgpzdGF0aWMgUHlPYmplY3QqCm5mY19uZmtjKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5wdXQsIGludCBrKQp7CiAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgUHlfVU5JQ09ERSAqaSwgKmkxLCAqbywgKmVuZDsKICAgIGludCBmLGwsaW5kZXgsaW5kZXgxLGNvbWI7CiAgICBQeV9VTklDT0RFIGNvZGU7CiAgICBQeV9VTklDT0RFICpza2lwcGVkWzIwXTsKICAgIGludCBjc2tpcHBlZCA9IDA7CgogICAgcmVzdWx0ID0gbmZkX25ma2Qoc2VsZiwgaW5wdXQsIGspOwogICAgaWYgKCFyZXN1bHQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogV2UgYXJlIGdvaW5nIHRvIG1vZGlmeSByZXN1bHQgaW4tcGxhY2UuCiAgICAgICBJZiBuZmRfbmZrZCBpcyBjaGFuZ2VkIHRvIHNvbWV0aW1lcyByZXR1cm4gdGhlIGlucHV0LAogICAgICAgdGhpcyBjb2RlIG5lZWRzIHRvIGJlIHJldmlld2VkLiAqLwogICAgYXNzZXJ0KHJlc3VsdCAhPSBpbnB1dCk7CgogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CiAgICBlbmQgPSBpICsgUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCk7CiAgICBvID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKCQogIGFnYWluOgogICAgd2hpbGUgKGkgPCBlbmQpIHsKICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3NraXBwZWQ7IGluZGV4KyspIHsKICAgICAgICAgIGlmIChza2lwcGVkW2luZGV4XSA9PSBpKSB7CiAgICAgICAgICAgICAgLyogKmkgY2hhcmFjdGVyIGlzIHNraXBwZWQuIAogICAgICAgICAgICAgICAgIFJlbW92ZSBmcm9tIGxpc3QuICovCiAgICAgICAgICAgICAgc2tpcHBlZFtpbmRleF0gPSBza2lwcGVkW2Nza2lwcGVkLTFdOwogICAgICAgICAgICAgIGNza2lwcGVkLS07CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGdvdG8gYWdhaW47IC8qIGNvbnRpbnVlIHdoaWxlICovCiAgICAgICAgICB9CiAgICAgIH0KICAgICAgLyogSGFuZ3VsIENvbXBvc2l0aW9uLiBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciA8TFYsVD4KICAgICAgICAgcGFpcnMsIHNpbmNlIHdlIGFsd2F5cyBoYXZlIGRlY29tcG9zZWQgZGF0YS4gKi8KICAgICAgaWYgKExCYXNlIDw9ICppICYmICppIDwgKExCYXNlK0xDb3VudCkgJiYKICAgICAgICAgIGkgKyAxIDwgZW5kICYmIAogICAgICAgICAgVkJhc2UgPD0gaVsxXSAmJiBpWzFdIDw9IChWQmFzZStWQ291bnQpKSB7CiAgICAgICAgICBpbnQgTEluZGV4LCBWSW5kZXg7CiAgICAgICAgICBMSW5kZXggPSBpWzBdIC0gTEJhc2U7CiAgICAgICAgICBWSW5kZXggPSBpWzFdIC0gVkJhc2U7CiAgICAgICAgICBjb2RlID0gU0Jhc2UgKyAoTEluZGV4KlZDb3VudCtWSW5kZXgpKlRDb3VudDsKICAgICAgICAgIGkrPTI7CiAgICAgICAgICBpZiAoaSA8IGVuZCAmJgogICAgICAgICAgICAgIFRCYXNlIDw9ICppICYmICppIDw9IChUQmFzZStUQ291bnQpKSB7CiAgICAgICAgICAgICAgY29kZSArPSAqaS1UQmFzZTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICB9CiAgICAgICAgICAqbysrID0gY29kZTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBmID0gZmluZF9uZmNfaW5kZXgoc2VsZiwgbmZjX2ZpcnN0LCAqaSk7CiAgICAgIGlmIChmID09IC0xKSB7CiAgICAgICAgICAqbysrID0gKmkrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIC8qIEZpbmQgbmV4dCB1bmJsb2NrZWQgY2hhcmFjdGVyLiAqLwogICAgICBpMSA9IGkrMTsKICAgICAgY29tYiA9IDA7CiAgICAgIHdoaWxlIChpMSA8IGVuZCkgewogICAgICAgICAgaW50IGNvbWIxID0gX2dldHJlY29yZF9leCgqaTEpLT5jb21iaW5pbmc7CiAgICAgICAgICBpZiAoY29tYjEgJiYgY29tYiA9PSBjb21iMSkgewogICAgICAgICAgICAgIC8qIENoYXJhY3RlciBpcyBibG9ja2VkLiAqLwogICAgICAgICAgICAgIGkxKys7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBsID0gZmluZF9uZmNfaW5kZXgoc2VsZiwgbmZjX2xhc3QsICppMSk7CiAgICAgICAgICAvKiAqaTEgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggKmkuIElmICppMQogICAgICAgICAgICAgaXMgYSBzdGFydGVyLCB3ZSBkb24ndCBuZWVkIHRvIGxvb2sgZnVydGhlci4KICAgICAgICAgICAgIE90aGVyd2lzZSwgcmVjb3JkIHRoZSBjb21iaW5pbmcgY2xhc3MuICovCiAgICAgICAgICBpZiAobCA9PSAtMSkgewogICAgICAgICAgICBub3RfY29tYmluYWJsZToKICAgICAgICAgICAgICBpZiAoY29tYjEgPT0gMCkKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY29tYiA9IGNvbWIxOwogICAgICAgICAgICAgIGkxKys7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpbmRleCA9IGYqVE9UQUxfTEFTVCArIGw7CiAgICAgICAgICBpbmRleDEgPSBjb21wX2luZGV4W2luZGV4ID4+IENPTVBfU0hJRlRdOwogICAgICAgICAgY29kZSA9IGNvbXBfZGF0YVsoaW5kZXgxPDxDT01QX1NISUZUKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGV4JigoMTw8Q09NUF9TSElGVCktMSkpXTsKICAgICAgICAgIGlmIChjb2RlID09IDApCiAgICAgICAgICAgICAgZ290byBub3RfY29tYmluYWJsZTsKCQkJCiAgICAgICAgICAvKiBSZXBsYWNlIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIuICovCiAgICAgICAgICAqaSA9IGNvZGU7CiAgICAgICAgICAvKiBNYXJrIHRoZSBzZWNvbmQgY2hhcmFjdGVyIHVudXNlZC4gKi8KICAgICAgICAgIHNraXBwZWRbY3NraXBwZWQrK10gPSBpMTsKICAgICAgICAgIGkxKys7CiAgICAgICAgICBmID0gZmluZF9uZmNfaW5kZXgoc2VsZiwgbmZjX2ZpcnN0LCAqaSk7CiAgICAgICAgICBpZiAoZiA9PSAtMSkKICAgICAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICAqbysrID0gKmkrKzsKICAgIH0KICAgIGlmIChvICE9IGVuZCkKICAgICAgICBQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIG8gLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpKTsKICAgIHJldHVybiByZXN1bHQ7Cn0KCQkKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX25vcm1hbGl6ZV9fZG9jX18sCiJub3JtYWxpemUoZm9ybSwgdW5pc3RyKVxuXApcblwKUmV0dXJuIHRoZSBub3JtYWwgZm9ybSAnZm9ybScgZm9yIHRoZSBVbmljb2RlIHN0cmluZyB1bmlzdHIuICBWYWxpZFxuXAp2YWx1ZXMgZm9yIGZvcm0gYXJlICdORkMnLCAnTkZLQycsICdORkQnLCBhbmQgJ05GS0QnLiIpOwoKc3RhdGljIFB5T2JqZWN0Kgp1bmljb2RlZGF0YV9ub3JtYWxpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBjaGFyICpmb3JtOwogICAgUHlPYmplY3QgKmlucHV0OwoKICAgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzTyE6bm9ybWFsaXplIiwKICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtLCAmUHlVbmljb2RlX1R5cGUsICZpbnB1dCkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKFB5VW5pY29kZV9HZXRTaXplKGlucHV0KSA9PSAwKSB7CiAgICAgICAgLyogU3BlY2lhbCBjYXNlIGVtcHR5IGlucHV0IHN0cmluZ3MsIHNpbmNlIHJlc2l6aW5nCiAgICAgICAgICAgdGhlbSAgbGF0ZXIgd291bGQgY2F1c2UgaW50ZXJuYWwgZXJyb3JzLiAqLwogICAgICAgIFB5X0lOQ1JFRihpbnB1dCk7CiAgICAgICAgcmV0dXJuIGlucHV0OwogICAgfQoKICAgIGlmIChzdHJjbXAoZm9ybSwgIk5GQyIpID09IDApCiAgICAgICAgcmV0dXJuIG5mY19uZmtjKHNlbGYsIGlucHV0LCAwKTsKICAgIGlmIChzdHJjbXAoZm9ybSwgIk5GS0MiKSA9PSAwKQogICAgICAgIHJldHVybiBuZmNfbmZrYyhzZWxmLCBpbnB1dCwgMSk7CiAgICBpZiAoc3RyY21wKGZvcm0sICJORkQiKSA9PSAwKQogICAgICAgIHJldHVybiBuZmRfbmZrZChzZWxmLCBpbnB1dCwgMCk7CiAgICBpZiAoc3RyY21wKGZvcm0sICJORktEIikgPT0gMCkKICAgICAgICByZXR1cm4gbmZkX25ma2Qoc2VsZiwgaW5wdXQsIDEpOwogICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIG5vcm1hbGl6YXRpb24gZm9ybSIpOwogICAgcmV0dXJuIE5VTEw7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIHVuaWNvZGUgY2hhcmFjdGVyIG5hbWUgdGFibGVzICovCgovKiBkYXRhIGZpbGUgZ2VuZXJhdGVkIGJ5IFRvb2xzL3VuaWNvZGUvbWFrZXVuaWNvZGVkYXRhLnB5ICovCiNpbmNsdWRlICJ1bmljb2RlbmFtZV9kYi5oIgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogZGF0YWJhc2UgY29kZSAoY3V0IGFuZCBwYXN0ZWQgZnJvbSB0aGUgdW5pZGIgcGFja2FnZSkgKi8KCnN0YXRpYyB1bnNpZ25lZCBsb25nCl9nZXRoYXNoKGNvbnN0IGNoYXIgKnMsIGludCBsZW4sIGludCBzY2FsZSkKewogICAgaW50IGk7CiAgICB1bnNpZ25lZCBsb25nIGggPSAwOwogICAgdW5zaWduZWQgbG9uZyBpeDsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgIGggPSAoaCAqIHNjYWxlKSArICh1bnNpZ25lZCBjaGFyKSB0b3VwcGVyKFB5X0NIQVJNQVNLKHNbaV0pKTsKICAgICAgICBpeCA9IGggJiAweGZmMDAwMDAwOwogICAgICAgIGlmIChpeCkKICAgICAgICAgICAgaCA9IChoIF4gKChpeD4+MjQpICYgMHhmZikpICYgMHgwMGZmZmZmZjsKICAgIH0KICAgIHJldHVybiBoOwp9CgpzdGF0aWMgY2hhciAqaGFuZ3VsX3N5bGxhYmxlc1tdWzNdID0gewogICAgeyAiRyIsICAiQSIsICAgIiIgICB9LAogICAgeyAiR0ciLCAiQUUiLCAgIkciICB9LAogICAgeyAiTiIsICAiWUEiLCAgIkdHIiB9LAogICAgeyAiRCIsICAiWUFFIiwgIkdTIiB9LAogICAgeyAiREQiLCAiRU8iLCAgIk4iLCB9LAogICAgeyAiUiIsICAiRSIsICAgIk5KIiB9LAogICAgeyAiTSIsICAiWUVPIiwgIk5IIiB9LAogICAgeyAiQiIsICAiWUUiLCAgIkQiICB9LAogICAgeyAiQkIiLCAiTyIsICAgIkwiICB9LAogICAgeyAiUyIsICAiV0EiLCAgIkxHIiB9LAogICAgeyAiU1MiLCAiV0FFIiwgIkxNIiB9LAogICAgeyAiIiwgICAiT0UiLCAgIkxCIiB9LAogICAgeyAiSiIsICAiWU8iLCAgIkxTIiB9LAogICAgeyAiSkoiLCAiVSIsICAgIkxUIiB9LAogICAgeyAiQyIsICAiV0VPIiwgIkxQIiB9LAogICAgeyAiSyIsICAiV0UiLCAgIkxIIiB9LAogICAgeyAiVCIsICAiV0kiLCAgIk0iICB9LAogICAgeyAiUCIsICAiWVUiLCAgIkIiICB9LAogICAgeyAiSCIsICAiRVUiLCAgIkJTIiB9LAogICAgeyAwLCAgICAiWUkiLCAgIlMiICB9LAogICAgeyAwLCAgICAiSSIsICAgIlNTIiB9LAogICAgeyAwLCAgICAwLCAgICAgIk5HIiB9LAogICAgeyAwLCAgICAwLCAgICAgIkoiICB9LAogICAgeyAwLCAgICAwLCAgICAgIkMiICB9LAogICAgeyAwLCAgICAwLCAgICAgIksiICB9LAogICAgeyAwLCAgICAwLCAgICAgIlQiICB9LAogICAgeyAwLCAgICAwLCAgICAgIlAiICB9LAogICAgeyAwLCAgICAwLCAgICAgIkgiICB9Cn07CgpzdGF0aWMgaW50CmlzX3VuaWZpZWRfaWRlb2dyYXBoKFB5X1VDUzQgY29kZSkKewogICAgcmV0dXJuICgKICAgICAgICAoMHgzNDAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDREQjUpIHx8IC8qIENKSyBJZGVvZ3JhcGggRXh0ZW5zaW9uIEEgKi8KICAgICAgICAoMHg0RTAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDlGQkIpIHx8IC8qIENKSyBJZGVvZ3JhcGggKi8KICAgICAgICAoMHgyMDAwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHgyQTZENikpOy8qIENKSyBJZGVvZ3JhcGggRXh0ZW5zaW9uIEIgKi8KfQoKc3RhdGljIGludApfZ2V0dWNuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeV9VQ1M0IGNvZGUsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmxlbikKewogICAgaW50IG9mZnNldDsKICAgIGludCBpOwogICAgaW50IHdvcmQ7CiAgICB1bnNpZ25lZCBjaGFyKiB3OwoKICAgIGlmIChjb2RlID49IDB4MTEwMDAwKQogICAgICAgIHJldHVybiAwOwoKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgY29kZSk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKSB7CiAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSAKICAgIH0KCiAgICBpZiAoU0Jhc2UgPD0gY29kZSAmJiBjb2RlIDwgU0Jhc2UrU0NvdW50KSB7CgkvKiBIYW5ndWwgc3lsbGFibGUuICovCglpbnQgU0luZGV4ID0gY29kZSAtIFNCYXNlOwoJaW50IEwgPSBTSW5kZXggLyBOQ291bnQ7CglpbnQgViA9IChTSW5kZXggJSBOQ291bnQpIC8gVENvdW50OwoJaW50IFQgPSBTSW5kZXggJSBUQ291bnQ7CgoJaWYgKGJ1ZmxlbiA8IDI3KQoJICAgIC8qIFdvcnN0IGNhc2U6IEhBTkdVTCBTWUxMQUJMRSA8MTBjaGFycz4uICovCgkgICAgcmV0dXJuIDA7CglzdHJjcHkoYnVmZmVyLCAiSEFOR1VMIFNZTExBQkxFICIpOwoJYnVmZmVyICs9IDE2OwoJc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7CglidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbTF1bMF0pOwoJc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tWXVsxXSk7CglidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVl1bMV0pOwoJc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tUXVsyXSk7CglidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVF1bMl0pOwoJKmJ1ZmZlciA9ICdcMCc7CglyZXR1cm4gMTsKICAgIH0KCiAgICBpZiAoaXNfdW5pZmllZF9pZGVvZ3JhcGgoY29kZSkpIHsKICAgICAgICBpZiAoYnVmbGVuIDwgMjgpCiAgICAgICAgICAgIC8qIFdvcnN0IGNhc2U6IENKSyBVTklGSUVEIElERU9HUkFQSC0yMDAwMCAqLwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIkNKSyBVTklGSUVEIElERU9HUkFQSC0lWCIsIGNvZGUpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8qIGdldCBvZmZzZXQgaW50byBwaHJhc2Vib29rICovCiAgICBvZmZzZXQgPSBwaHJhc2Vib29rX29mZnNldDFbKGNvZGU+PnBocmFzZWJvb2tfc2hpZnQpXTsKICAgIG9mZnNldCA9IHBocmFzZWJvb2tfb2Zmc2V0Mlsob2Zmc2V0PDxwaHJhc2Vib29rX3NoaWZ0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZSYoKDE8PHBocmFzZWJvb2tfc2hpZnQpLTEpKV07CiAgICBpZiAoIW9mZnNldCkKICAgICAgICByZXR1cm4gMDsKCiAgICBpID0gMDsKCiAgICBmb3IgKDs7KSB7CiAgICAgICAgLyogZ2V0IHdvcmQgaW5kZXggKi8KICAgICAgICB3b3JkID0gcGhyYXNlYm9va1tvZmZzZXRdIC0gcGhyYXNlYm9va19zaG9ydDsKICAgICAgICBpZiAod29yZCA+PSAwKSB7CiAgICAgICAgICAgIHdvcmQgPSAod29yZCA8PCA4KSArIHBocmFzZWJvb2tbb2Zmc2V0KzFdOwogICAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgd29yZCA9IHBocmFzZWJvb2tbb2Zmc2V0KytdOwogICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgIGlmIChpID4gYnVmbGVuKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICAgICAgICBidWZmZXJbaSsrXSA9ICcgJzsKICAgICAgICB9CiAgICAgICAgLyogY29weSB3b3JkIHN0cmluZyBmcm9tIGxleGljb24uICB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlCiAgICAgICAgICAgd29yZCBoYXMgYml0IDcgc2V0LiAgdGhlIGxhc3Qgd29yZCBpbiBhIHN0cmluZyBlbmRzIHdpdGgKICAgICAgICAgICAweDgwICovCiAgICAgICAgdyA9IGxleGljb24gKyBsZXhpY29uX29mZnNldFt3b3JkXTsKICAgICAgICB3aGlsZSAoKncgPCAxMjgpIHsKICAgICAgICAgICAgaWYgKGkgPj0gYnVmbGVuKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICAgICAgICBidWZmZXJbaSsrXSA9ICp3Kys7CiAgICAgICAgfQogICAgICAgIGlmIChpID49IGJ1ZmxlbikKICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICAgIGJ1ZmZlcltpKytdID0gKncgJiAxMjc7CiAgICAgICAgaWYgKCp3ID09IDEyOCkKICAgICAgICAgICAgYnJlYWs7IC8qIGVuZCBvZiB3b3JkICovCiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKX2NtcG5hbWUoUHlPYmplY3QgKnNlbGYsIGludCBjb2RlLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZWxlbikKewogICAgLyogY2hlY2sgaWYgY29kZSBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gbmFtZSAqLwogICAgaW50IGk7CiAgICBjaGFyIGJ1ZmZlcltOQU1FX01BWExFTl07CiAgICBpZiAoIV9nZXR1Y25hbWUoc2VsZiwgY29kZSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpCiAgICAgICAgcmV0dXJuIDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZWxlbjsgaSsrKSB7CiAgICAgICAgaWYgKHRvdXBwZXIoUHlfQ0hBUk1BU0sobmFtZVtpXSkpICE9IGJ1ZmZlcltpXSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gYnVmZmVyW25hbWVsZW5dID09ICdcMCc7Cn0KCnN0YXRpYyB2b2lkIApmaW5kX3N5bGxhYmxlKGNvbnN0IGNoYXIgKnN0ciwgaW50ICpsZW4sIGludCAqcG9zLCBpbnQgY291bnQsIGludCBjb2x1bW4pCnsKICAgIGludCBpLCBsZW4xOwogICAgKmxlbiA9IC0xOwogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCWNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07CglsZW4xID0gc3RybGVuKHMpOwoJaWYgKGxlbjEgPD0gKmxlbikKCSAgICBjb250aW51ZTsKCWlmIChzdHJuY21wKHN0ciwgcywgbGVuMSkgPT0gMCkgewoJICAgICpsZW4gPSBsZW4xOwoJICAgICpwb3MgPSBpOwoJfQogICAgfQogICAgaWYgKCpsZW4gPT0gLTEpIHsKCSpsZW4gPSAwOwogICAgfQp9CgpzdGF0aWMgaW50Cl9nZXRjb2RlKFB5T2JqZWN0KiBzZWxmLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZWxlbiwgUHlfVUNTNCogY29kZSkKewogICAgdW5zaWduZWQgaW50IGgsIHY7CiAgICB1bnNpZ25lZCBpbnQgbWFzayA9IGNvZGVfc2l6ZS0xOwogICAgdW5zaWduZWQgaW50IGksIGluY3I7CgogICAgLyogQ2hlY2sgZm9yIGhhbmd1bCBzeWxsYWJsZXMuICovCiAgICBpZiAoc3RybmNtcChuYW1lLCAiSEFOR1VMIFNZTExBQkxFICIsIDE2KSA9PSAwKSB7CglpbnQgbGVuLCBMID0gLTEsIFYgPSAtMSwgVCA9IC0xOwoJY29uc3QgY2hhciAqcG9zID0gbmFtZSArIDE2OwoJZmluZF9zeWxsYWJsZShwb3MsICZsZW4sICZMLCBMQ291bnQsIDApOwoJcG9zICs9IGxlbjsKCWZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmViwgVkNvdW50LCAxKTsKCXBvcyArPSBsZW47CglmaW5kX3N5bGxhYmxlKHBvcywgJmxlbiwgJlQsIFRDb3VudCwgMik7Cglwb3MgKz0gbGVuOwoJaWYgKEwgIT0gLTEgJiYgViAhPSAtMSAmJiBUICE9IC0xICYmIHBvcy1uYW1lID09IG5hbWVsZW4pIHsKCSAgICAqY29kZSA9IFNCYXNlICsgKEwqVkNvdW50K1YpKlRDb3VudCArIFQ7CgkgICAgcmV0dXJuIDE7Cgl9CiAgICAgICAgLyogT3RoZXJ3aXNlLCBpdCdzIGFuIGlsbGVnYWwgc3lsbGFibGUgbmFtZS4gKi8KICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBDaGVjayBmb3IgdW5pZmllZCBpZGVvZ3JhcGhzLiAqLwogICAgaWYgKHN0cm5jbXAobmFtZSwgIkNKSyBVTklGSUVEIElERU9HUkFQSC0iLCAyMikgPT0gMCkgewogICAgICAgIC8qIEZvdXIgb3IgZml2ZSBoZXhkaWdpdHMgbXVzdCBmb2xsb3cuICovCiAgICAgICAgdiA9IDA7CiAgICAgICAgbmFtZSArPSAyMjsKICAgICAgICBuYW1lbGVuIC09IDIyOwogICAgICAgIGlmIChuYW1lbGVuICE9IDQgJiYgbmFtZWxlbiAhPSA1KQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB3aGlsZSAobmFtZWxlbi0tKSB7CiAgICAgICAgICAgIHYgKj0gMTY7CiAgICAgICAgICAgIGlmICgqbmFtZSA+PSAnMCcgJiYgKm5hbWUgPD0gJzknKQogICAgICAgICAgICAgICAgdiArPSAqbmFtZSAtICcwJzsKICAgICAgICAgICAgZWxzZSBpZiAoKm5hbWUgPj0gJ0EnICYmICpuYW1lIDw9ICdGJykKICAgICAgICAgICAgICAgIHYgKz0gKm5hbWUgLSAnQScgKyAxMDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIG5hbWUrKzsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc191bmlmaWVkX2lkZW9ncmFwaCh2KSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgKmNvZGUgPSB2OwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8qIHRoZSBmb2xsb3dpbmcgaXMgdGhlIHNhbWUgYXMgcHl0aG9uJ3MgZGljdGlvbmFyeSBsb29rdXAsIHdpdGgKICAgICAgIG9ubHkgbWlub3IgY2hhbmdlcy4gIHNlZSB0aGUgbWFrZXVuaWNvZGVkYXRhIHNjcmlwdCBmb3IgbW9yZQogICAgICAgZGV0YWlscyAqLwoKICAgIGggPSAodW5zaWduZWQgaW50KSBfZ2V0aGFzaChuYW1lLCBuYW1lbGVuLCBjb2RlX21hZ2ljKTsKICAgIGkgPSAofmgpICYgbWFzazsKICAgIHYgPSBjb2RlX2hhc2hbaV07CiAgICBpZiAoIXYpCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZiAoX2NtcG5hbWUoc2VsZiwgdiwgbmFtZSwgbmFtZWxlbikpIHsKICAgICAgICAqY29kZSA9IHY7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpbmNyID0gKGggXiAoaCA+PiAzKSkgJiBtYXNrOwogICAgaWYgKCFpbmNyKQogICAgICAgIGluY3IgPSBtYXNrOwogICAgZm9yICg7OykgewogICAgICAgIGkgPSAoaSArIGluY3IpICYgbWFzazsKICAgICAgICB2ID0gY29kZV9oYXNoW2ldOwogICAgICAgIGlmICghdikKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgaWYgKF9jbXBuYW1lKHNlbGYsIHYsIG5hbWUsIG5hbWVsZW4pKSB7CiAgICAgICAgICAgICpjb2RlID0gdjsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGluY3IgPSBpbmNyIDw8IDE7CiAgICAgICAgaWYgKGluY3IgPiBtYXNrKQogICAgICAgICAgICBpbmNyID0gaW5jciBeIGNvZGVfcG9seTsKICAgIH0KfQoKc3RhdGljIGNvbnN0IF9QeVVuaWNvZGVfTmFtZV9DQVBJIGhhc2hBUEkgPSAKewogICAgc2l6ZW9mKF9QeVVuaWNvZGVfTmFtZV9DQVBJKSwKICAgIF9nZXR1Y25hbWUsCiAgICBfZ2V0Y29kZQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogUHl0aG9uIGJpbmRpbmdzICovCgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfbmFtZV9fZG9jX18sCiJuYW1lKHVuaWNoclssIGRlZmF1bHRdKVxuXApSZXR1cm5zIHRoZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlciB1bmljaHIgYXMgYVxuXApzdHJpbmcuIElmIG5vIG5hbWUgaXMgZGVmaW5lZCwgZGVmYXVsdCBpcyByZXR1cm5lZCwgb3IsIGlmIG5vdFxuXApnaXZlbiwgVmFsdWVFcnJvciBpcyByYWlzZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9uYW1lKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgY2hhciBuYW1lW05BTUVfTUFYTEVOXTsKICAgIFB5X1VDUzQgYzsKCiAgICBQeVVuaWNvZGVPYmplY3QqIHY7CiAgICBQeU9iamVjdCogZGVmb2JqID0gTlVMTDsKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8TzpuYW1lIiwgJlB5VW5pY29kZV9UeXBlLCAmdiwgJmRlZm9iaikpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgYyA9IGdldHVjaGFyKHYpOwogICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKCFfZ2V0dWNuYW1lKHNlbGYsIGMsIG5hbWUsIHNpemVvZihuYW1lKSkpIHsKCWlmIChkZWZvYmogPT0gTlVMTCkgewoJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm8gc3VjaCBuYW1lIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwoJfQoJZWxzZSB7CgkgICAgUHlfSU5DUkVGKGRlZm9iaik7CgkgICAgcmV0dXJuIGRlZm9iajsKCX0KICAgIH0KCiAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIG5hbWUpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfbG9va3VwX19kb2NfXywKImxvb2t1cChuYW1lKVxuXApcblwKTG9vayB1cCBjaGFyYWN0ZXIgYnkgbmFtZS4gIElmIGEgY2hhcmFjdGVyIHdpdGggdGhlXG5cCmdpdmVuIG5hbWUgaXMgZm91bmQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlXG5cCmNoYXJhY3Rlci4gIElmIG5vdCBmb3VuZCwgS2V5RXJyb3IgaXMgcmFpc2VkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfbG9va3VwKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlfVUNTNCBjb2RlOwogICAgUHlfVU5JQ09ERSBzdHJbMl07CgogICAgY2hhciogbmFtZTsKICAgIGludCBuYW1lbGVuOwogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpsb29rdXAiLCAmbmFtZSwgJm5hbWVsZW4pKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmICghX2dldGNvZGUoc2VsZiwgbmFtZSwgbmFtZWxlbiwgJmNvZGUpKSB7CiAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAidW5kZWZpbmVkIGNoYXJhY3RlciBuYW1lICclcyciLAogICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCiAgICBpZiAoY29kZSA+PSAweDEwMDAwKSB7CiAgICAgICAgc3RyWzBdID0gMHhkODAwICsgKChjb2RlIC0gMHgxMDAwMCkgPj4gMTApOwogICAgICAgIHN0clsxXSA9IDB4ZGMwMCArICgoY29kZSAtIDB4MTAwMDApICYgMHgzZmYpOwogICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc3RyLCAyKTsKICAgIH0KI2VuZGlmCiAgICBzdHJbMF0gPSAoUHlfVU5JQ09ERSkgY29kZTsKICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc3RyLCAxKTsgICAgCn0KCi8qIFhYWCBBZGQgZG9jIHN0cmluZ3MuICovCgpzdGF0aWMgUHlNZXRob2REZWYgdW5pY29kZWRhdGFfZnVuY3Rpb25zW10gPSB7CiAgICB7ImRlY2ltYWwiLCB1bmljb2RlZGF0YV9kZWNpbWFsLCBNRVRIX1ZBUkFSR1MsIHVuaWNvZGVkYXRhX2RlY2ltYWxfX2RvY19ffSwKICAgIHsiZGlnaXQiLCB1bmljb2RlZGF0YV9kaWdpdCwgTUVUSF9WQVJBUkdTLCB1bmljb2RlZGF0YV9kaWdpdF9fZG9jX199LAogICAgeyJudW1lcmljIiwgdW5pY29kZWRhdGFfbnVtZXJpYywgTUVUSF9WQVJBUkdTLCB1bmljb2RlZGF0YV9udW1lcmljX19kb2NfX30sCiAgICB7ImNhdGVnb3J5IiwgdW5pY29kZWRhdGFfY2F0ZWdvcnksIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9jYXRlZ29yeV9fZG9jX199LAogICAgeyJiaWRpcmVjdGlvbmFsIiwgdW5pY29kZWRhdGFfYmlkaXJlY3Rpb25hbCwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfYmlkaXJlY3Rpb25hbF9fZG9jX199LAogICAgeyJjb21iaW5pbmciLCB1bmljb2RlZGF0YV9jb21iaW5pbmcsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfY29tYmluaW5nX19kb2NfX30sCiAgICB7Im1pcnJvcmVkIiwgdW5pY29kZWRhdGFfbWlycm9yZWQsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9taXJyb3JlZF9fZG9jX199LAogICAgeyJlYXN0X2FzaWFuX3dpZHRoIiwgdW5pY29kZWRhdGFfZWFzdF9hc2lhbl93aWR0aCwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfZWFzdF9hc2lhbl93aWR0aF9fZG9jX199LAogICAgeyJkZWNvbXBvc2l0aW9uIiwgdW5pY29kZWRhdGFfZGVjb21wb3NpdGlvbiwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfZGVjb21wb3NpdGlvbl9fZG9jX199LAogICAgeyJuYW1lIiwgdW5pY29kZWRhdGFfbmFtZSwgTUVUSF9WQVJBUkdTLCB1bmljb2RlZGF0YV9uYW1lX19kb2NfX30sCiAgICB7Imxvb2t1cCIsIHVuaWNvZGVkYXRhX2xvb2t1cCwgTUVUSF9WQVJBUkdTLCB1bmljb2RlZGF0YV9sb29rdXBfX2RvY19ffSwKICAgIHsibm9ybWFsaXplIiwgdW5pY29kZWRhdGFfbm9ybWFsaXplLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX25vcm1hbGl6ZV9fZG9jX199LAogICAge05VTEwsIE5VTEx9CQkvKiBzZW50aW5lbCAqLwp9OwoKc3RhdGljIFB5VHlwZU9iamVjdCBVQ0RfVHlwZSA9IHsKCS8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCgkgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLwoJUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCgkidW5pY29kZWRhdGEuVUNEIiwJCS8qdHBfbmFtZSovCglzaXplb2YoUHJldmlvdXNEQlZlcnNpb24pLAkvKnRwX2Jhc2ljc2l6ZSovCgkwLAkJCS8qdHBfaXRlbXNpemUqLwoJLyogbWV0aG9kcyAqLwoJKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAvKnRwX2RlYWxsb2MqLwoJMCwJCQkvKnRwX3ByaW50Ki8KCTAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCgkwLAkJCS8qdHBfc2V0YXR0ciovCgkwLAkJCS8qdHBfY29tcGFyZSovCgkwLAkJCS8qdHBfcmVwciovCgkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCgkwLAkJCS8qdHBfYXNfbWFwcGluZyovCgkwLAkJCS8qdHBfaGFzaCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwogICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwogICAgICAgIHVuaWNvZGVkYXRhX2Z1bmN0aW9ucywgIC8qdHBfbWV0aG9kcyovCiAgICAgICAgREJfbWVtYmVycywgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwp9OwoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2RvY3N0cmluZywKIlRoaXMgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2Ugd2hpY2hcblwKZGVmaW5lcyBjaGFyYWN0ZXIgcHJvcGVydGllcyBmb3IgYWxsIFVuaWNvZGUgY2hhcmFjdGVycy4gVGhlIGRhdGEgaW5cblwKdGhpcyBkYXRhYmFzZSBpcyBiYXNlZCBvbiB0aGUgVW5pY29kZURhdGEudHh0IGZpbGUgdmVyc2lvblxuXAo0LjEuMCB3aGljaCBpcyBwdWJsaWNhbGx5IGF2YWlsYWJsZSBmcm9tIGZ0cDovL2Z0cC51bmljb2RlLm9yZy8uXG5cClxuXApUaGUgbW9kdWxlIHVzZXMgdGhlIHNhbWUgbmFtZXMgYW5kIHN5bWJvbHMgYXMgZGVmaW5lZCBieSB0aGVcblwKVW5pY29kZURhdGEgRmlsZSBGb3JtYXQgNC4xLjAgKHNlZVxuXApodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy80LjEuMC91Y2QvVUNELmh0bWwpLiIpOwoKUHlNT0RJTklUX0ZVTkMKaW5pdHVuaWNvZGVkYXRhKHZvaWQpCnsKICAgIFB5T2JqZWN0ICptLCAqdjsKCiAgICBQeV9UWVBFKCZVQ0RfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CgogICAgbSA9IFB5X0luaXRNb2R1bGUzKAogICAgICAgICJ1bmljb2RlZGF0YSIsIHVuaWNvZGVkYXRhX2Z1bmN0aW9ucywgdW5pY29kZWRhdGFfZG9jc3RyaW5nKTsKICAgIGlmICghbSkKICAgICAgICByZXR1cm47CgogICAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgInVuaWRhdGFfdmVyc2lvbiIsIFVOSURBVEFfVkVSU0lPTik7CiAgICBQeV9JTkNSRUYoJlVDRF9UeXBlKTsKICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUNEIiwgKFB5T2JqZWN0KikmVUNEX1R5cGUpOwoKICAgIC8qIFByZXZpb3VzIHZlcnNpb25zICovCiAgICB2ID0gbmV3X3ByZXZpb3VzX3ZlcnNpb24oIjMuMi4wIiwgZ2V0X2NoYW5nZV8zXzJfMCwgbm9ybWFsaXphdGlvbl8zXzJfMCk7CiAgICBpZiAodiAhPSBOVUxMKQogICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAidWNkXzNfMl8wIiwgdik7CgogICAgLyogRXhwb3J0IEMgQVBJICovCiAgICB2ID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKCh2b2lkICopICZoYXNoQVBJLCBOVUxMKTsKICAgIGlmICh2ICE9IE5VTEwpCiAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ1Y25oYXNoX0NBUEkiLCB2KTsKfQoKLyogCkxvY2FsIHZhcmlhYmxlczoKYy1iYXNpYy1vZmZzZXQ6IDQKaW5kZW50LXRhYnMtbW9kZTogbmlsCkVuZDoKKi8K