LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICB1bmljb2RlZGF0YSAtLSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFVuaWNvZGUgNC4xIGRhdGEgYmFzZS4KCiAgIERhdGEgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBVbmljb2RlIDQuMSBVbmljb2RlRGF0YS50eHQgZmlsZS4KCiAgIFdyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgogICBNb2RpZmllZCBmb3IgUHl0aG9uIDIuMCBieSBGcmVkcmlrIEx1bmRoIChmcmVkcmlrQHB5dGhvbndhcmUuY29tKQogICBNb2RpZmllZCBieSBNYXJ0aW4gdi4gTPZ3aXMgKG1hcnRpbkB2LmxvZXdpcy5kZSkKCiAgIENvcHlyaWdodCAoYykgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiUHl0aG9uLmgiCiNpbmNsdWRlICJ1Y25oYXNoLmgiCiNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKCi8qIGNoYXJhY3RlciBwcm9wZXJ0aWVzICovCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OwkvKiBpbmRleCBpbnRvCgkJCQkJICAgX1B5VW5pY29kZV9DYXRlZ29yeU5hbWVzICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyCWNvbWJpbmluZzsgCS8qIGNvbWJpbmluZyBjbGFzcyB2YWx1ZSAwIC0gMjU1ICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyCWJpZGlyZWN0aW9uYWw7IAkvKiBpbmRleCBpbnRvCgkJCQkJICAgX1B5VW5pY29kZV9CaWRpcmVjdGlvbmFsTmFtZXMgKi8KICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWlycm9yZWQ7CS8qIHRydWUgaWYgbWlycm9yZWQgaW4gYmlkaXIgbW9kZSAqLwogICAgY29uc3QgdW5zaWduZWQgY2hhciBlYXN0X2FzaWFuX3dpZHRoOwkvKiBpbmRleCBpbnRvCgkJCQkJCSAgIF9QeVVuaWNvZGVfRWFzdEFzaWFuV2lkdGggKi8KfSBfUHlVbmljb2RlX0RhdGFiYXNlUmVjb3JkOwoKdHlwZWRlZiBzdHJ1Y3QgY2hhbmdlX3JlY29yZCB7CiAgICAvKiBzZXF1ZW5jZSBvZiBmaWVsZHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGluIG1lcmdlX29sZF92ZXJzaW9uICovCiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGJpZGlyX2NoYW5nZWQ7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5X2NoYW5nZWQ7CiAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGRlY2ltYWxfY2hhbmdlZDsKICAgIGNvbnN0IGludCBudW1lcmljX2NoYW5nZWQ7Cn0gY2hhbmdlX3JlY29yZDsKCi8qIGRhdGEgZmlsZSBnZW5lcmF0ZWQgYnkgVG9vbHMvdW5pY29kZS9tYWtldW5pY29kZWRhdGEucHkgKi8KI2luY2x1ZGUgInVuaWNvZGVkYXRhX2RiLmgiCgpzdGF0aWMgY29uc3QgX1B5VW5pY29kZV9EYXRhYmFzZVJlY29yZCoKX2dldHJlY29yZF9leChQeV9VQ1M0IGNvZGUpCnsKICAgIGludCBpbmRleDsKICAgIGlmIChjb2RlID49IDB4MTEwMDAwKQogICAgICAgIGluZGV4ID0gMDsKICAgIGVsc2UgewogICAgICAgIGluZGV4ID0gaW5kZXgxWyhjb2RlPj5TSElGVCldOwogICAgICAgIGluZGV4ID0gaW5kZXgyWyhpbmRleDw8U0hJRlQpKyhjb2RlJigoMTw8U0hJRlQpLTEpKV07CiAgICB9CgogICAgcmV0dXJuICZfUHlVbmljb2RlX0RhdGFiYXNlX1JlY29yZHNbaW5kZXhdOwp9CgpzdGF0aWMgY29uc3QgX1B5VW5pY29kZV9EYXRhYmFzZVJlY29yZCoKX2dldHJlY29yZChQeVVuaWNvZGVPYmplY3QqIHYpCnsKICAgIHJldHVybiBfZ2V0cmVjb3JkX2V4KCpQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0gUHJldmlvdXMtdmVyc2lvbiBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwp0eXBlZGVmIHN0cnVjdCBwcmV2aW91c192ZXJzaW9uIHsKICAgIFB5T2JqZWN0X0hFQUQKICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICBjb25zdCBjaGFuZ2VfcmVjb3JkKiAoKmdldHJlY29yZCkoUHlfVUNTNCk7CiAgICBQeV9VQ1M0ICgqbm9ybWFsaXphdGlvbikoUHlfVUNTNCk7Cn0gUHJldmlvdXNEQlZlcnNpb247CgojZGVmaW5lIGdldF9vbGRfcmVjb3JkKHNlbGYsIHYpICAgICgoKChQcmV2aW91c0RCVmVyc2lvbiopc2VsZiktPmdldHJlY29yZCkodikpCgpzdGF0aWMgUHlNZW1iZXJEZWYgREJfbWVtYmVyc1tdID0gewoJeyJ1bmlkYXRhX3ZlcnNpb24iLCBUX1NUUklORywgb2Zmc2V0b2YoUHJldmlvdXNEQlZlcnNpb24sIG5hbWUpLCBSRUFET05MWX0sCiAgICAgICAge05VTEx9Cn07CgovKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCnN0YXRpYyBQeVR5cGVPYmplY3QgVUNEX1R5cGU7CgpzdGF0aWMgUHlPYmplY3QqCm5ld19wcmV2aW91c192ZXJzaW9uKGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhbmdlX3JlY29yZCogKCpnZXRyZWNvcmQpKFB5X1VDUzQpLAogICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0ICgqbm9ybWFsaXphdGlvbikoUHlfVUNTNCkpCnsKCVByZXZpb3VzREJWZXJzaW9uICpzZWxmOwoJc2VsZiA9IFB5T2JqZWN0X05ldyhQcmV2aW91c0RCVmVyc2lvbiwgJlVDRF9UeXBlKTsKCWlmIChzZWxmID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CglzZWxmLT5uYW1lID0gbmFtZTsKCXNlbGYtPmdldHJlY29yZCA9IGdldHJlY29yZDsKICAgICAgICBzZWxmLT5ub3JtYWxpemF0aW9uID0gbm9ybWFsaXphdGlvbjsKCXJldHVybiAoUHlPYmplY3QqKXNlbGY7Cn0KCi8qIC0tLSBNb2R1bGUgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2RlY2ltYWxfX2RvY19fLAoiZGVjaW1hbCh1bmljaHJbLCBkZWZhdWx0XSlcblwKXG5cClJldHVybnMgdGhlIGRlY2ltYWwgdmFsdWUgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHVuaWNoclxuXAphcyBpbnRlZ2VyLiBJZiBubyBzdWNoIHZhbHVlIGlzIGRlZmluZWQsIGRlZmF1bHQgaXMgcmV0dXJuZWQsIG9yLCBpZlxuXApub3QgZ2l2ZW4sIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfZGVjaW1hbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIFB5T2JqZWN0ICpkZWZvYmogPSBOVUxMOwogICAgaW50IGhhdmVfb2xkID0gMDsKICAgIGxvbmcgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOmRlY2ltYWwiLCAmUHlVbmljb2RlX1R5cGUsICZ2LCAmZGVmb2JqKSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUodikgIT0gMSkgewoJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKCQkJIm5lZWQgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIgYXMgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCAqUHlVbmljb2RlX0FTX1VOSUNPREUodikpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkgewogICAgICAgICAgICAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgcmMgPSAtMTsKICAgICAgICB9IAogICAgICAgIGVsc2UgaWYgKG9sZC0+ZGVjaW1hbF9jaGFuZ2VkICE9IDB4RkYpIHsKICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICByYyA9IG9sZC0+ZGVjaW1hbF9jaGFuZ2VkOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIWhhdmVfb2xkKQogICAgICAgIHJjID0gUHlfVU5JQ09ERV9UT0RFQ0lNQUwoKlB5VW5pY29kZV9BU19VTklDT0RFKHYpKTsKICAgIGlmIChyYyA8IDApIHsKCWlmIChkZWZvYmogPT0gTlVMTCkgewoJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAoJCQkgICAgIm5vdCBhIGRlY2ltYWwiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cgl9CgllbHNlIHsKCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKCSAgICByZXR1cm4gZGVmb2JqOwoJfQogICAgfQogICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJjKTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2RpZ2l0X19kb2NfXywKImRpZ2l0KHVuaWNoclssIGRlZmF1bHRdKVxuXApcblwKUmV0dXJucyB0aGUgZGlnaXQgdmFsdWUgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHVuaWNociBhc1xuXAppbnRlZ2VyLiBJZiBubyBzdWNoIHZhbHVlIGlzIGRlZmluZWQsIGRlZmF1bHQgaXMgcmV0dXJuZWQsIG9yLCBpZlxuXApub3QgZ2l2ZW4sIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfZGlnaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBQeU9iamVjdCAqZGVmb2JqID0gTlVMTDsKICAgIGxvbmcgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOmRpZ2l0IiwgJlB5VW5pY29kZV9UeXBlLCAmdiwgJmRlZm9iaikpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBpZiAoUHlVbmljb2RlX0dFVF9TSVpFKHYpICE9IDEpIHsKCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCgkJCSJuZWVkIGEgc2luZ2xlIFVuaWNvZGUgY2hhcmFjdGVyIGFzIHBhcmFtZXRlciIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmMgPSBQeV9VTklDT0RFX1RPRElHSVQoKlB5VW5pY29kZV9BU19VTklDT0RFKHYpKTsKICAgIGlmIChyYyA8IDApIHsKCWlmIChkZWZvYmogPT0gTlVMTCkgewoJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgZGlnaXQiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cgl9CgllbHNlIHsKCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKCSAgICByZXR1cm4gZGVmb2JqOwoJfQogICAgfQogICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJjKTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX251bWVyaWNfX2RvY19fLAoibnVtZXJpYyh1bmljaHJbLCBkZWZhdWx0XSlcblwKXG5cClJldHVybnMgdGhlIG51bWVyaWMgdmFsdWUgYXNzaWduZWQgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHVuaWNoclxuXAphcyBmbG9hdC4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBkZWZhdWx0IGlzIHJldHVybmVkLCBvciwgaWZcblwKbm90IGdpdmVuLCBWYWx1ZUVycm9yIGlzIHJhaXNlZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX251bWVyaWMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBQeU9iamVjdCAqZGVmb2JqID0gTlVMTDsKICAgIGludCBoYXZlX29sZCA9IDA7CiAgICBkb3VibGUgcmM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOm51bWVyaWMiLCAmUHlVbmljb2RlX1R5cGUsICZ2LCAmZGVmb2JqKSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUodikgIT0gMSkgewoJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKCQkJIm5lZWQgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIgYXMgcGFyYW1ldGVyIik7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsICpQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKSB7CiAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICByYyA9IC0xLjA7CiAgICAgICAgfSAKICAgICAgICBlbHNlIGlmIChvbGQtPmRlY2ltYWxfY2hhbmdlZCAhPSAweEZGKSB7CiAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgcmMgPSBvbGQtPmRlY2ltYWxfY2hhbmdlZDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCFoYXZlX29sZCkKICAgICAgICByYyA9IFB5X1VOSUNPREVfVE9OVU1FUklDKCpQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSk7CiAgICBpZiAocmMgPT0gLTEuMCkgewoJaWYgKGRlZm9iaiA9PSBOVUxMKSB7CgkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJub3QgYSBudW1lcmljIGNoYXJhY3RlciIpOwoJICAgIHJldHVybiBOVUxMOwoJfQoJZWxzZSB7CgkgICAgUHlfSU5DUkVGKGRlZm9iaik7CgkgICAgcmV0dXJuIGRlZm9iajsKCX0KICAgIH0KICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocmMpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfY2F0ZWdvcnlfX2RvY19fLAoiY2F0ZWdvcnkodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgZ2VuZXJhbCBjYXRlZ29yeSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcblwKdW5pY2hyIGFzIHN0cmluZy4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2NhdGVnb3J5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgaW50IGluZGV4OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6Y2F0ZWdvcnkiLAoJCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQoJcmV0dXJuIE5VTEw7CiAgICBpZiAoUHlVbmljb2RlX0dFVF9TSVpFKHYpICE9IDEpIHsKCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCgkJCSJuZWVkIGEgc2luZ2xlIFVuaWNvZGUgY2hhcmFjdGVyIGFzIHBhcmFtZXRlciIpOwoJcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpbmRleCA9IChpbnQpIF9nZXRyZWNvcmQodiktPmNhdGVnb3J5OwogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCAqUHlVbmljb2RlX0FTX1VOSUNPREUodikpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgIT0gMHhGRikKICAgICAgICAgICAgaW5kZXggPSBvbGQtPmNhdGVnb3J5X2NoYW5nZWQ7CiAgICB9CiAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoX1B5VW5pY29kZV9DYXRlZ29yeU5hbWVzW2luZGV4XSk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsX19kb2NfXywKImJpZGlyZWN0aW9uYWwodW5pY2hyKVxuXApcblwKUmV0dXJucyB0aGUgYmlkaXJlY3Rpb25hbCBjYXRlZ29yeSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcblwKdW5pY2hyIGFzIHN0cmluZy4gSWYgbm8gc3VjaCB2YWx1ZSBpcyBkZWZpbmVkLCBhbiBlbXB0eSBzdHJpbmcgaXNcblwKcmV0dXJuZWQuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9iaWRpcmVjdGlvbmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgaW50IGluZGV4OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6YmlkaXJlY3Rpb25hbCIsCgkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCglyZXR1cm4gTlVMTDsKICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUodikgIT0gMSkgewoJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKCQkJIm5lZWQgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIgYXMgcGFyYW1ldGVyIik7CglyZXR1cm4gTlVMTDsKICAgIH0KICAgIGluZGV4ID0gKGludCkgX2dldHJlY29yZCh2KS0+YmlkaXJlY3Rpb25hbDsKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgKlB5VW5pY29kZV9BU19VTklDT0RFKHYpKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgICAgIGVsc2UgaWYgKG9sZC0+YmlkaXJfY2hhbmdlZCAhPSAweEZGKQogICAgICAgICAgICBpbmRleCA9IG9sZC0+YmlkaXJfY2hhbmdlZDsKICAgIH0KICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZyhfUHlVbmljb2RlX0JpZGlyZWN0aW9uYWxOYW1lc1tpbmRleF0pOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfY29tYmluaW5nX19kb2NfXywKImNvbWJpbmluZyh1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBjYW5vbmljYWwgY29tYmluaW5nIGNsYXNzIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlXG5cCmNoYXJhY3RlciB1bmljaHIgYXMgaW50ZWdlci4gUmV0dXJucyAwIGlmIG5vIGNvbWJpbmluZyBjbGFzcyBpc1xuXApkZWZpbmVkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfY29tYmluaW5nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlVbmljb2RlT2JqZWN0ICp2OwogICAgaW50IGluZGV4OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6Y29tYmluaW5nIiwKCQkJICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKCXJldHVybiBOVUxMOwogICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRSh2KSAhPSAxKSB7CglQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAoJCQkibmVlZCBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhcyBwYXJhbWV0ZXIiKTsKCXJldHVybiBOVUxMOwogICAgfQogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkKHYpLT5jb21iaW5pbmc7CiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsICpQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKQogICAgICAgICAgICBpbmRleCA9IDA7IC8qIHVuYXNzaWduZWQgKi8KICAgIH0KICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpbmRleCk7Cn0KClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9taXJyb3JlZF9fZG9jX18sCiJtaXJyb3JlZCh1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBtaXJyb3JlZCBwcm9wZXJ0eSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcblwKdW5pY2hyIGFzIGludGVnZXIuIFJldHVybnMgMSBpZiB0aGUgY2hhcmFjdGVyIGhhcyBiZWVuIGlkZW50aWZpZWQgYXNcblwKYSBcIm1pcnJvcmVkXCIgY2hhcmFjdGVyIGluIGJpZGlyZWN0aW9uYWwgdGV4dCwgMCBvdGhlcndpc2UuIik7CgpzdGF0aWMgUHlPYmplY3QgKgp1bmljb2RlZGF0YV9taXJyb3JlZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOm1pcnJvcmVkIiwKCQkJICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKCXJldHVybiBOVUxMOwogICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRSh2KSAhPSAxKSB7CglQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAoJCQkibmVlZCBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhcyBwYXJhbWV0ZXIiKTsKCXJldHVybiBOVUxMOwogICAgfQogICAgaW5kZXggPSAoaW50KSBfZ2V0cmVjb3JkKHYpLT5taXJyb3JlZDsKICAgIGlmIChzZWxmKSB7CiAgICAgICAgY29uc3QgY2hhbmdlX3JlY29yZCAqb2xkID0gZ2V0X29sZF9yZWNvcmQoc2VsZiwgKlB5VW5pY29kZV9BU19VTklDT0RFKHYpKTsKICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApCiAgICAgICAgICAgIGluZGV4ID0gMDsgLyogdW5hc3NpZ25lZCAqLwogICAgfQogICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGluZGV4KTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2Vhc3RfYXNpYW5fd2lkdGhfX2RvY19fLAoiZWFzdF9hc2lhbl93aWR0aCh1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBlYXN0IGFzaWFuIHdpZHRoIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuXAp1bmljaHIgYXMgc3RyaW5nLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfZWFzdF9hc2lhbl93aWR0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5VW5pY29kZU9iamVjdCAqdjsKICAgIGludCBpbmRleDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmVhc3RfYXNpYW5fd2lkdGgiLAoJCQkgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQoJcmV0dXJuIE5VTEw7CiAgICBpZiAoUHlVbmljb2RlX0dFVF9TSVpFKHYpICE9IDEpIHsKCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCgkJCSJuZWVkIGEgc2luZ2xlIFVuaWNvZGUgY2hhcmFjdGVyIGFzIHBhcmFtZXRlciIpOwoJcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpbmRleCA9IChpbnQpIF9nZXRyZWNvcmQodiktPmVhc3RfYXNpYW5fd2lkdGg7CiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsICpQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSk7CiAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKQogICAgICAgICAgICBpbmRleCA9IDA7IC8qIHVuYXNzaWduZWQgKi8KICAgIH0KICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZyhfUHlVbmljb2RlX0Vhc3RBc2lhbldpZHRoTmFtZXNbaW5kZXhdKTsKfQoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX2RlY29tcG9zaXRpb25fX2RvY19fLAoiZGVjb21wb3NpdGlvbih1bmljaHIpXG5cClxuXApSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgZGVjb21wb3NpdGlvbiBtYXBwaW5nIGFzc2lnbmVkIHRvIHRoZSBVbmljb2RlXG5cCmNoYXJhY3RlciB1bmljaHIgYXMgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW4gY2FzZSBub1xuXApzdWNoIG1hcHBpbmcgaXMgZGVmaW5lZC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCnVuaWNvZGVkYXRhX2RlY29tcG9zaXRpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICBjaGFyIGRlY29tcFsyNTZdOwogICAgaW50IGNvZGUsIGluZGV4LCBjb3VudCwgaTsKICAgIHVuc2lnbmVkIGludCBwcmVmaXhfaW5kZXg7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpkZWNvbXBvc2l0aW9uIiwKCQkJICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKCXJldHVybiBOVUxMOwogICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRSh2KSAhPSAxKSB7CglQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAoJCQkibmVlZCBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhcyBwYXJhbWV0ZXIiKTsKCXJldHVybiBOVUxMOwogICAgfQoKICAgIGNvZGUgPSAoaW50KSAqUHlVbmljb2RlX0FTX1VOSUNPREUodik7CgogICAgaWYgKHNlbGYpIHsKICAgICAgICBjb25zdCBjaGFuZ2VfcmVjb3JkICpvbGQgPSBnZXRfb2xkX3JlY29yZChzZWxmLCAqUHlVbmljb2RlX0FTX1VOSUNPREUodikpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCIiKTsgLyogdW5hc3NpZ25lZCAqLwogICAgfQoKICAgIGlmIChjb2RlIDwgMCB8fCBjb2RlID49IDB4MTEwMDAwKQogICAgICAgIGluZGV4ID0gMDsKICAgIGVsc2UgewogICAgICAgIGluZGV4ID0gZGVjb21wX2luZGV4MVsoY29kZT4+REVDT01QX1NISUZUKV07CiAgICAgICAgaW5kZXggPSBkZWNvbXBfaW5kZXgyWyhpbmRleDw8REVDT01QX1NISUZUKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZSYoKDE8PERFQ09NUF9TSElGVCktMSkpXTsKICAgIH0KCiAgICAvKiBoaWdoIGJ5dGUgaXMgbnVtYmVyIG9mIGhleCBieXRlcyAodXN1YWxseSBvbmUgb3IgdHdvKSwgbG93IGJ5dGUKICAgICAgIGlzIHByZWZpeCBjb2RlIChmcm9tKi8KICAgIGNvdW50ID0gZGVjb21wX2RhdGFbaW5kZXhdID4+IDg7CgogICAgLyogWFhYOiBjb3VsZCBhbGxvY2F0ZSB0aGUgUHlTdHJpbmcgdXAgZnJvbnQgaW5zdGVhZAogICAgICAgKHN0cmxlbihwcmVmaXgpICsgNSAqIGNvdW50ICsgMSBieXRlcykgKi8KCiAgICAvKiBCYXNlZCBvbiBob3cgaW5kZXggaXMgY2FsY3VsYXRlZCBhYm92ZSBhbmQgZGVjb21wX2RhdGEgaXMgZ2VuZXJhdGVkCiAgICAgICBmcm9tIFRvb2xzL3VuaWNvZGUvbWFrZXVuaWNvZGVkYXRhLnB5LCBpdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlCiAgICAgICB0byBvdmVyZmxvdyBkZWNvbXBfcHJlZml4LiAqLwogICAgcHJlZml4X2luZGV4ID0gZGVjb21wX2RhdGFbaW5kZXhdICYgMjU1OwogICAgYXNzZXJ0KHByZWZpeF9pbmRleCA8IChzaXplb2YoZGVjb21wX3ByZWZpeCkvc2l6ZW9mKCpkZWNvbXBfcHJlZml4KSkpOwoKICAgIC8qIGNvcHkgcHJlZml4ICovCiAgICBpID0gc3RybGVuKGRlY29tcF9wcmVmaXhbcHJlZml4X2luZGV4XSk7CiAgICBtZW1jcHkoZGVjb21wLCBkZWNvbXBfcHJlZml4W3ByZWZpeF9pbmRleF0sIGkpOwoKICAgIHdoaWxlIChjb3VudC0tID4gMCkgewogICAgICAgIGlmIChpKQogICAgICAgICAgICBkZWNvbXBbaSsrXSA9ICcgJzsKICAgICAgICBhc3NlcnQoKHNpemVfdClpIDwgc2l6ZW9mKGRlY29tcCkpOwogICAgICAgIFB5T1Nfc25wcmludGYoZGVjb21wICsgaSwgc2l6ZW9mKGRlY29tcCkgLSBpLCAiJTA0WCIsCiAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBfZGF0YVsrK2luZGV4XSk7CiAgICAgICAgaSArPSBzdHJsZW4oZGVjb21wICsgaSk7CiAgICB9CiAgICAKICAgIGRlY29tcFtpXSA9ICdcMCc7CgogICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKGRlY29tcCk7Cn0KCnN0YXRpYyB2b2lkCmdldF9kZWNvbXBfcmVjb3JkKFB5T2JqZWN0ICpzZWxmLCBQeV9VQ1M0IGNvZGUsIGludCAqaW5kZXgsIGludCAqcHJlZml4LCBpbnQgKmNvdW50KQp7CiAgICBpZiAoY29kZSA+PSAweDExMDAwMCkgewogICAgICAgICppbmRleCA9IDA7CiAgICB9IGVsc2UgaWYgKHNlbGYgJiYgZ2V0X29sZF9yZWNvcmQoc2VsZiwgY29kZSktPmNhdGVnb3J5X2NoYW5nZWQ9PTApIHsKICAgICAgICAvKiB1bmFzc2lnbmVkIGluIG9sZCB2ZXJzaW9uICovCiAgICAgICAgKmluZGV4ID0gMDsKICAgIH0KICAgIGVsc2UgewogICAgICAgICppbmRleCA9IGRlY29tcF9pbmRleDFbKGNvZGU+PkRFQ09NUF9TSElGVCldOwogICAgICAgICppbmRleCA9IGRlY29tcF9pbmRleDJbKCppbmRleDw8REVDT01QX1NISUZUKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlJigoMTw8REVDT01QX1NISUZUKS0xKSldOwogICAgfQoJCiAgICAvKiBoaWdoIGJ5dGUgaXMgbnVtYmVyIG9mIGhleCBieXRlcyAodXN1YWxseSBvbmUgb3IgdHdvKSwgbG93IGJ5dGUKICAgICAgIGlzIHByZWZpeCBjb2RlIChmcm9tKi8KICAgICpjb3VudCA9IGRlY29tcF9kYXRhWyppbmRleF0gPj4gODsKICAgICpwcmVmaXggPSBkZWNvbXBfZGF0YVsqaW5kZXhdICYgMjU1OwoKICAgICgqaW5kZXgpKys7Cn0KCiNkZWZpbmUgU0Jhc2UgICAweEFDMDAKI2RlZmluZSBMQmFzZSAgIDB4MTEwMAojZGVmaW5lIFZCYXNlICAgMHgxMTYxCiNkZWZpbmUgVEJhc2UgICAweDExQTcKI2RlZmluZSBMQ291bnQgIDE5CiNkZWZpbmUgVkNvdW50ICAyMQojZGVmaW5lIFRDb3VudCAgMjgKI2RlZmluZSBOQ291bnQgIChWQ291bnQqVENvdW50KQojZGVmaW5lIFNDb3VudCAgKExDb3VudCpOQ291bnQpCgpzdGF0aWMgUHlPYmplY3QqCm5mZF9uZmtkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5wdXQsIGludCBrKQp7CiAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgUHlfVU5JQ09ERSAqaSwgKmVuZCwgKm87CiAgICAvKiBMb25nZXN0IGRlY29tcG9zaXRpb24gaW4gVW5pY29kZSAzLjI6IFUrRkRGQSAqLwogICAgUHlfVU5JQ09ERSBzdGFja1syMF07IAogICAgUHlfc3NpemVfdCBzcGFjZSwgaXNpemU7CiAgICBpbnQgaW5kZXgsIHByZWZpeCwgY291bnQsIHN0YWNrcHRyOwogICAgdW5zaWduZWQgY2hhciBwcmV2LCBjdXI7CgkKICAgIHN0YWNrcHRyID0gMDsKICAgIGlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKGlucHV0KTsKICAgIC8qIE92ZXJhbGxvY2F0ZSBhdG1vc3QgMTAgY2hhcmFjdGVycy4gKi8KICAgIHNwYWNlID0gKGlzaXplID4gMTAgPyAxMCA6IGlzaXplKSArIGlzaXplOwogICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHNwYWNlKTsKICAgIGlmICghcmVzdWx0KQogICAgICAgIHJldHVybiBOVUxMOwogICAgaSA9IFB5VW5pY29kZV9BU19VTklDT0RFKGlucHV0KTsKICAgIGVuZCA9IGkgKyBpc2l6ZTsKICAgIG8gPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwoKICAgIHdoaWxlIChpIDwgZW5kKSB7CiAgICAgICAgc3RhY2tbc3RhY2twdHIrK10gPSAqaSsrOwogICAgICAgIHdoaWxlKHN0YWNrcHRyKSB7CiAgICAgICAgICAgIFB5X1VOSUNPREUgY29kZSA9IHN0YWNrWy0tc3RhY2twdHJdOwogICAgICAgICAgICAvKiBIYW5ndWwgRGVjb21wb3NpdGlvbiBhZGRzIHRocmVlIGNoYXJhY3RlcnMgaW4KICAgICAgICAgICAgICAgYSBzaW5nbGUgc3RlcCwgc28gd2UgbmVlZCBhdGxlYXN0IHRoYXQgbXVjaCByb29tLiAqLwogICAgICAgICAgICBpZiAoc3BhY2UgPCAzKSB7CiAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5ld3NpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KSArIDEwOwogICAgICAgICAgICAgICAgc3BhY2UgKz0gMTA7CiAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBuZXdzaXplKSA9PSAtMSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIG8gPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpICsgbmV3c2l6ZSAtIHNwYWNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEhhbmd1bCBEZWNvbXBvc2l0aW9uLiAqLwogICAgICAgICAgICBpZiAoU0Jhc2UgPD0gY29kZSAmJiBjb2RlIDwgKFNCYXNlK1NDb3VudCkpIHsKICAgICAgICAgICAgICAgIGludCBTSW5kZXggPSBjb2RlIC0gU0Jhc2U7CiAgICAgICAgICAgICAgICBpbnQgTCA9IExCYXNlICsgU0luZGV4IC8gTkNvdW50OwogICAgICAgICAgICAgICAgaW50IFYgPSBWQmFzZSArIChTSW5kZXggJSBOQ291bnQpIC8gVENvdW50OwogICAgICAgICAgICAgICAgaW50IFQgPSBUQmFzZSArIFNJbmRleCAlIFRDb3VudDsKICAgICAgICAgICAgICAgICpvKysgPSBMOwogICAgICAgICAgICAgICAgKm8rKyA9IFY7CiAgICAgICAgICAgICAgICBzcGFjZSAtPSAyOwogICAgICAgICAgICAgICAgaWYgKFQgIT0gVEJhc2UpIHsKICAgICAgICAgICAgICAgICAgICAqbysrID0gVDsKICAgICAgICAgICAgICAgICAgICBzcGFjZSAtLTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIG5vcm1hbGl6YXRpb24gY2hhbmdlcyAqLwogICAgICAgICAgICBpZiAoc2VsZikgewogICAgICAgICAgICAgICAgUHlfVUNTNCB2YWx1ZSA9ICgoUHJldmlvdXNEQlZlcnNpb24qKXNlbGYpLT5ub3JtYWxpemF0aW9uKGNvZGUpOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBzdGFja1tzdGFja3B0cisrXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBPdGhlciBkZWNvbXBvc2l0aW9ucy4gKi8KICAgICAgICAgICAgZ2V0X2RlY29tcF9yZWNvcmQoc2VsZiwgY29kZSwgJmluZGV4LCAmcHJlZml4LCAmY291bnQpOwoKICAgICAgICAgICAgLyogQ29weSBjaGFyYWN0ZXIgaWYgaXQgaXMgbm90IGRlY29tcG9zYWJsZSwgb3IgaGFzIGEKICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uLCBidXQgd2UgZG8gTkZELiAqLwogICAgICAgICAgICBpZiAoIWNvdW50IHx8IChwcmVmaXggJiYgIWspKSB7CiAgICAgICAgICAgICAgICAqbysrID0gY29kZTsKICAgICAgICAgICAgICAgIHNwYWNlLS07CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBDb3B5IGRlY29tcG9zaXRpb24gb250byB0aGUgc3RhY2ssIGluIHJldmVyc2UKICAgICAgICAgICAgICAgb3JkZXIuICAqLwogICAgICAgICAgICB3aGlsZShjb3VudCkgewogICAgICAgICAgICAgICAgY29kZSA9IGRlY29tcF9kYXRhW2luZGV4ICsgKC0tY291bnQpXTsKICAgICAgICAgICAgICAgIHN0YWNrW3N0YWNrcHRyKytdID0gY29kZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKiBEcm9wIG92ZXJhbGxvY2F0aW9uLiBDYW5ub3QgZmFpbC4gKi8KICAgIFB5VW5pY29kZV9SZXNpemUoJnJlc3VsdCwgUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCkgLSBzcGFjZSk7CgogICAgLyogU29ydCBjYW5vbmljYWxseS4gKi8KICAgIGkgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwogICAgcHJldiA9IF9nZXRyZWNvcmRfZXgoKmkpLT5jb21iaW5pbmc7CiAgICBlbmQgPSBpICsgUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCk7CiAgICBmb3IgKGkrKzsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgY3VyID0gX2dldHJlY29yZF9leCgqaSktPmNvbWJpbmluZzsKICAgICAgICBpZiAocHJldiA9PSAwIHx8IGN1ciA9PSAwIHx8IHByZXYgPD0gY3VyKSB7CiAgICAgICAgICAgIHByZXYgPSBjdXI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAvKiBOb24tY2Fub25pY2FsIG9yZGVyLiBOZWVkIHRvIHN3aXRjaCAqaSB3aXRoIHByZXZpb3VzLiAqLwogICAgICAgIG8gPSBpIC0gMTsKICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICBQeV9VTklDT0RFIHRtcCA9IG9bMV07CiAgICAgICAgICAgIG9bMV0gPSBvWzBdOwogICAgICAgICAgICBvWzBdID0gdG1wOwogICAgICAgICAgICBvLS07CiAgICAgICAgICAgIGlmIChvIDwgUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBwcmV2ID0gX2dldHJlY29yZF9leCgqbyktPmNvbWJpbmluZzsKICAgICAgICAgICAgaWYgKHByZXYgPT0gMCB8fCBwcmV2IDw9IGN1cikKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBwcmV2ID0gX2dldHJlY29yZF9leCgqaSktPmNvbWJpbmluZzsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBpbnQKZmluZF9uZmNfaW5kZXgoUHlPYmplY3QgKnNlbGYsIHN0cnVjdCByZWluZGV4KiBuZmMsIFB5X1VOSUNPREUgY29kZSkKewogICAgaW50IGluZGV4OwogICAgZm9yIChpbmRleCA9IDA7IG5mY1tpbmRleF0uc3RhcnQ7IGluZGV4KyspIHsKICAgICAgICBpbnQgc3RhcnQgPSBuZmNbaW5kZXhdLnN0YXJ0OwogICAgICAgIGlmIChjb2RlIDwgc3RhcnQpCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICBpZiAoY29kZSA8PSBzdGFydCArIG5mY1tpbmRleF0uY291bnQpIHsKICAgICAgICAgICAgaW50IGRlbHRhID0gY29kZSAtIHN0YXJ0OwogICAgICAgICAgICByZXR1cm4gbmZjW2luZGV4XS5pbmRleCArIGRlbHRhOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKfQoKc3RhdGljIFB5T2JqZWN0KgpuZmNfbmZrYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmlucHV0LCBpbnQgaykKewogICAgUHlPYmplY3QgKnJlc3VsdDsKICAgIFB5X1VOSUNPREUgKmksICppMSwgKm8sICplbmQ7CiAgICBpbnQgZixsLGluZGV4LGluZGV4MSxjb21iOwogICAgUHlfVU5JQ09ERSBjb2RlOwogICAgUHlfVU5JQ09ERSAqc2tpcHBlZFsyMF07CiAgICBpbnQgY3NraXBwZWQgPSAwOwoKICAgIHJlc3VsdCA9IG5mZF9uZmtkKHNlbGYsIGlucHV0LCBrKTsKICAgIGlmICghcmVzdWx0KQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qIFdlIGFyZSBnb2luZyB0byBtb2RpZnkgcmVzdWx0IGluLXBsYWNlLgogICAgICAgSWYgbmZkX25ma2QgaXMgY2hhbmdlZCB0byBzb21ldGltZXMgcmV0dXJuIHRoZSBpbnB1dCwKICAgICAgIHRoaXMgY29kZSBuZWVkcyB0byBiZSByZXZpZXdlZC4gKi8KICAgIGFzc2VydChyZXN1bHQgIT0gaW5wdXQpOwoKICAgIGkgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwogICAgZW5kID0gaSArIFB5VW5pY29kZV9HRVRfU0laRShyZXN1bHQpOwogICAgbyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CgkKICBhZ2FpbjoKICAgIHdoaWxlIChpIDwgZW5kKSB7CiAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNza2lwcGVkOyBpbmRleCsrKSB7CiAgICAgICAgICBpZiAoc2tpcHBlZFtpbmRleF0gPT0gaSkgewogICAgICAgICAgICAgIC8qICppIGNoYXJhY3RlciBpcyBza2lwcGVkLiAKICAgICAgICAgICAgICAgICBSZW1vdmUgZnJvbSBsaXN0LiAqLwogICAgICAgICAgICAgIHNraXBwZWRbaW5kZXhdID0gc2tpcHBlZFtjc2tpcHBlZC0xXTsKICAgICAgICAgICAgICBjc2tpcHBlZC0tOwogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICBnb3RvIGFnYWluOyAvKiBjb250aW51ZSB3aGlsZSAqLwogICAgICAgICAgfQogICAgICB9CiAgICAgIC8qIEhhbmd1bCBDb21wb3NpdGlvbi4gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgPExWLFQ+CiAgICAgICAgIHBhaXJzLCBzaW5jZSB3ZSBhbHdheXMgaGF2ZSBkZWNvbXBvc2VkIGRhdGEuICovCiAgICAgIGlmIChMQmFzZSA8PSAqaSAmJiAqaSA8IChMQmFzZStMQ291bnQpICYmCiAgICAgICAgICBpICsgMSA8IGVuZCAmJiAKICAgICAgICAgIFZCYXNlIDw9IGlbMV0gJiYgaVsxXSA8PSAoVkJhc2UrVkNvdW50KSkgewogICAgICAgICAgaW50IExJbmRleCwgVkluZGV4OwogICAgICAgICAgTEluZGV4ID0gaVswXSAtIExCYXNlOwogICAgICAgICAgVkluZGV4ID0gaVsxXSAtIFZCYXNlOwogICAgICAgICAgY29kZSA9IFNCYXNlICsgKExJbmRleCpWQ291bnQrVkluZGV4KSpUQ291bnQ7CiAgICAgICAgICBpKz0yOwogICAgICAgICAgaWYgKGkgPCBlbmQgJiYKICAgICAgICAgICAgICBUQmFzZSA8PSAqaSAmJiAqaSA8PSAoVEJhc2UrVENvdW50KSkgewogICAgICAgICAgICAgIGNvZGUgKz0gKmktVEJhc2U7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgfQogICAgICAgICAgKm8rKyA9IGNvZGU7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgZiA9IGZpbmRfbmZjX2luZGV4KHNlbGYsIG5mY19maXJzdCwgKmkpOwogICAgICBpZiAoZiA9PSAtMSkgewogICAgICAgICAgKm8rKyA9ICppKys7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvKiBGaW5kIG5leHQgdW5ibG9ja2VkIGNoYXJhY3Rlci4gKi8KICAgICAgaTEgPSBpKzE7CiAgICAgIGNvbWIgPSAwOwogICAgICB3aGlsZSAoaTEgPCBlbmQpIHsKICAgICAgICAgIGludCBjb21iMSA9IF9nZXRyZWNvcmRfZXgoKmkxKS0+Y29tYmluaW5nOwogICAgICAgICAgaWYgKGNvbWIxICYmIGNvbWIgPT0gY29tYjEpIHsKICAgICAgICAgICAgICAvKiBDaGFyYWN0ZXIgaXMgYmxvY2tlZC4gKi8KICAgICAgICAgICAgICBpMSsrOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgbCA9IGZpbmRfbmZjX2luZGV4KHNlbGYsIG5mY19sYXN0LCAqaTEpOwogICAgICAgICAgLyogKmkxIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoICppLiBJZiAqaTEKICAgICAgICAgICAgIGlzIGEgc3RhcnRlciwgd2UgZG9uJ3QgbmVlZCB0byBsb29rIGZ1cnRoZXIuCiAgICAgICAgICAgICBPdGhlcndpc2UsIHJlY29yZCB0aGUgY29tYmluaW5nIGNsYXNzLiAqLwogICAgICAgICAgaWYgKGwgPT0gLTEpIHsKICAgICAgICAgICAgbm90X2NvbWJpbmFibGU6CiAgICAgICAgICAgICAgaWYgKGNvbWIxID09IDApCiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNvbWIgPSBjb21iMTsKICAgICAgICAgICAgICBpMSsrOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaW5kZXggPSBmKlRPVEFMX0xBU1QgKyBsOwogICAgICAgICAgaW5kZXgxID0gY29tcF9pbmRleFtpbmRleCA+PiBDT01QX1NISUZUXTsKICAgICAgICAgIGNvZGUgPSBjb21wX2RhdGFbKGluZGV4MTw8Q09NUF9TSElGVCkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleCYoKDE8PENPTVBfU0hJRlQpLTEpKV07CiAgICAgICAgICBpZiAoY29kZSA9PSAwKQogICAgICAgICAgICAgIGdvdG8gbm90X2NvbWJpbmFibGU7CgkJCQogICAgICAgICAgLyogUmVwbGFjZSB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyLiAqLwogICAgICAgICAgKmkgPSBjb2RlOwogICAgICAgICAgLyogTWFyayB0aGUgc2Vjb25kIGNoYXJhY3RlciB1bnVzZWQuICovCiAgICAgICAgICBza2lwcGVkW2Nza2lwcGVkKytdID0gaTE7CiAgICAgICAgICBpMSsrOwogICAgICAgICAgZiA9IGZpbmRfbmZjX2luZGV4KHNlbGYsIG5mY19maXJzdCwgKmkpOwogICAgICAgICAgaWYgKGYgPT0gLTEpCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgKm8rKyA9ICppKys7CiAgICB9CiAgICBpZiAobyAhPSBlbmQpCiAgICAgICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBvIC0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgkJClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9ub3JtYWxpemVfX2RvY19fLAoibm9ybWFsaXplKGZvcm0sIHVuaXN0cilcblwKXG5cClJldHVybiB0aGUgbm9ybWFsIGZvcm0gJ2Zvcm0nIGZvciB0aGUgVW5pY29kZSBzdHJpbmcgdW5pc3RyLiAgVmFsaWRcblwKdmFsdWVzIGZvciBmb3JtIGFyZSAnTkZDJywgJ05GS0MnLCAnTkZEJywgYW5kICdORktEJy4iKTsKCnN0YXRpYyBQeU9iamVjdCoKdW5pY29kZWRhdGFfbm9ybWFsaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgY2hhciAqZm9ybTsKICAgIFB5T2JqZWN0ICppbnB1dDsKCiAgICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic08hOm5vcm1hbGl6ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybSwgJlB5VW5pY29kZV9UeXBlLCAmaW5wdXQpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChQeVVuaWNvZGVfR2V0U2l6ZShpbnB1dCkgPT0gMCkgewogICAgICAgIC8qIFNwZWNpYWwgY2FzZSBlbXB0eSBpbnB1dCBzdHJpbmdzLCBzaW5jZSByZXNpemluZwogICAgICAgICAgIHRoZW0gIGxhdGVyIHdvdWxkIGNhdXNlIGludGVybmFsIGVycm9ycy4gKi8KICAgICAgICBQeV9JTkNSRUYoaW5wdXQpOwogICAgICAgIHJldHVybiBpbnB1dDsKICAgIH0KCiAgICBpZiAoc3RyY21wKGZvcm0sICJORkMiKSA9PSAwKQogICAgICAgIHJldHVybiBuZmNfbmZrYyhzZWxmLCBpbnB1dCwgMCk7CiAgICBpZiAoc3RyY21wKGZvcm0sICJORktDIikgPT0gMCkKICAgICAgICByZXR1cm4gbmZjX25ma2Moc2VsZiwgaW5wdXQsIDEpOwogICAgaWYgKHN0cmNtcChmb3JtLCAiTkZEIikgPT0gMCkKICAgICAgICByZXR1cm4gbmZkX25ma2Qoc2VsZiwgaW5wdXQsIDApOwogICAgaWYgKHN0cmNtcChmb3JtLCAiTkZLRCIpID09IDApCiAgICAgICAgcmV0dXJuIG5mZF9uZmtkKHNlbGYsIGlucHV0LCAxKTsKICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBub3JtYWxpemF0aW9uIGZvcm0iKTsKICAgIHJldHVybiBOVUxMOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiB1bmljb2RlIGNoYXJhY3RlciBuYW1lIHRhYmxlcyAqLwoKLyogZGF0YSBmaWxlIGdlbmVyYXRlZCBieSBUb29scy91bmljb2RlL21ha2V1bmljb2RlZGF0YS5weSAqLwojaW5jbHVkZSAidW5pY29kZW5hbWVfZGIuaCIKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGRhdGFiYXNlIGNvZGUgKGN1dCBhbmQgcGFzdGVkIGZyb20gdGhlIHVuaWRiIHBhY2thZ2UpICovCgpzdGF0aWMgdW5zaWduZWQgbG9uZwpfZ2V0aGFzaChjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgc2NhbGUpCnsKICAgIGludCBpOwogICAgdW5zaWduZWQgbG9uZyBoID0gMDsKICAgIHVuc2lnbmVkIGxvbmcgaXg7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBoID0gKGggKiBzY2FsZSkgKyAodW5zaWduZWQgY2hhcikgdG91cHBlcihQeV9DSEFSTUFTSyhzW2ldKSk7CiAgICAgICAgaXggPSBoICYgMHhmZjAwMDAwMDsKICAgICAgICBpZiAoaXgpCiAgICAgICAgICAgIGggPSAoaCBeICgoaXg+PjI0KSAmIDB4ZmYpKSAmIDB4MDBmZmZmZmY7CiAgICB9CiAgICByZXR1cm4gaDsKfQoKc3RhdGljIGNoYXIgKmhhbmd1bF9zeWxsYWJsZXNbXVszXSA9IHsKICAgIHsgIkciLCAgIkEiLCAgICIiICAgfSwKICAgIHsgIkdHIiwgIkFFIiwgICJHIiAgfSwKICAgIHsgIk4iLCAgIllBIiwgICJHRyIgfSwKICAgIHsgIkQiLCAgIllBRSIsICJHUyIgfSwKICAgIHsgIkREIiwgIkVPIiwgICJOIiwgfSwKICAgIHsgIlIiLCAgIkUiLCAgICJOSiIgfSwKICAgIHsgIk0iLCAgIllFTyIsICJOSCIgfSwKICAgIHsgIkIiLCAgIllFIiwgICJEIiAgfSwKICAgIHsgIkJCIiwgIk8iLCAgICJMIiAgfSwKICAgIHsgIlMiLCAgIldBIiwgICJMRyIgfSwKICAgIHsgIlNTIiwgIldBRSIsICJMTSIgfSwKICAgIHsgIiIsICAgIk9FIiwgICJMQiIgfSwKICAgIHsgIkoiLCAgIllPIiwgICJMUyIgfSwKICAgIHsgIkpKIiwgIlUiLCAgICJMVCIgfSwKICAgIHsgIkMiLCAgIldFTyIsICJMUCIgfSwKICAgIHsgIksiLCAgIldFIiwgICJMSCIgfSwKICAgIHsgIlQiLCAgIldJIiwgICJNIiAgfSwKICAgIHsgIlAiLCAgIllVIiwgICJCIiAgfSwKICAgIHsgIkgiLCAgIkVVIiwgICJCUyIgfSwKICAgIHsgMCwgICAgIllJIiwgICJTIiAgfSwKICAgIHsgMCwgICAgIkkiLCAgICJTUyIgfSwKICAgIHsgMCwgICAgMCwgICAgICJORyIgfSwKICAgIHsgMCwgICAgMCwgICAgICJKIiAgfSwKICAgIHsgMCwgICAgMCwgICAgICJDIiAgfSwKICAgIHsgMCwgICAgMCwgICAgICJLIiAgfSwKICAgIHsgMCwgICAgMCwgICAgICJUIiAgfSwKICAgIHsgMCwgICAgMCwgICAgICJQIiAgfSwKICAgIHsgMCwgICAgMCwgICAgICJIIiAgfQp9OwoKc3RhdGljIGludAppc191bmlmaWVkX2lkZW9ncmFwaChQeV9VQ1M0IGNvZGUpCnsKICAgIHJldHVybiAoCiAgICAgICAgKDB4MzQwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHg0REI1KSB8fCAvKiBDSksgSWRlb2dyYXBoIEV4dGVuc2lvbiBBICovCiAgICAgICAgKDB4NEUwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHg5RkJCKSB8fCAvKiBDSksgSWRlb2dyYXBoICovCiAgICAgICAgKDB4MjAwMDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4MkE2RDYpKTsvKiBDSksgSWRlb2dyYXBoIEV4dGVuc2lvbiBCICovCn0KCnN0YXRpYyBpbnQKX2dldHVjbmFtZShQeU9iamVjdCAqc2VsZiwgUHlfVUNTNCBjb2RlLCBjaGFyKiBidWZmZXIsIGludCBidWZsZW4pCnsKICAgIGludCBvZmZzZXQ7CiAgICBpbnQgaTsKICAgIGludCB3b3JkOwogICAgdW5zaWduZWQgY2hhciogdzsKCiAgICBpZiAoY29kZSA+PSAweDExMDAwMCkKICAgICAgICByZXR1cm4gMDsKCiAgICBpZiAoc2VsZikgewogICAgICAgIGNvbnN0IGNoYW5nZV9yZWNvcmQgKm9sZCA9IGdldF9vbGRfcmVjb3JkKHNlbGYsIGNvZGUpOwogICAgICAgIGlmIChvbGQtPmNhdGVnb3J5X2NoYW5nZWQgPT0gMCkgewogICAgICAgICAgICAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gCiAgICB9CgogICAgaWYgKFNCYXNlIDw9IGNvZGUgJiYgY29kZSA8IFNCYXNlK1NDb3VudCkgewoJLyogSGFuZ3VsIHN5bGxhYmxlLiAqLwoJaW50IFNJbmRleCA9IGNvZGUgLSBTQmFzZTsKCWludCBMID0gU0luZGV4IC8gTkNvdW50OwoJaW50IFYgPSAoU0luZGV4ICUgTkNvdW50KSAvIFRDb3VudDsKCWludCBUID0gU0luZGV4ICUgVENvdW50OwoKCWlmIChidWZsZW4gPCAyNykKCSAgICAvKiBXb3JzdCBjYXNlOiBIQU5HVUwgU1lMTEFCTEUgPDEwY2hhcnM+LiAqLwoJICAgIHJldHVybiAwOwoJc3RyY3B5KGJ1ZmZlciwgIkhBTkdVTCBTWUxMQUJMRSAiKTsKCWJ1ZmZlciArPSAxNjsKCXN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbTF1bMF0pOwoJYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW0xdWzBdKTsKCXN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbVl1bMV0pOwoJYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW1ZdWzFdKTsKCXN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbVF1bMl0pOwoJYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW1RdWzJdKTsKCSpidWZmZXIgPSAnXDAnOwoJcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKGlzX3VuaWZpZWRfaWRlb2dyYXBoKGNvZGUpKSB7CiAgICAgICAgaWYgKGJ1ZmxlbiA8IDI4KQogICAgICAgICAgICAvKiBXb3JzdCBjYXNlOiBDSksgVU5JRklFRCBJREVPR1JBUEgtMjAwMDAgKi8KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgc3ByaW50ZihidWZmZXIsICJDSksgVU5JRklFRCBJREVPR1JBUEgtJVgiLCBjb2RlKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvKiBnZXQgb2Zmc2V0IGludG8gcGhyYXNlYm9vayAqLwogICAgb2Zmc2V0ID0gcGhyYXNlYm9va19vZmZzZXQxWyhjb2RlPj5waHJhc2Vib29rX3NoaWZ0KV07CiAgICBvZmZzZXQgPSBwaHJhc2Vib29rX29mZnNldDJbKG9mZnNldDw8cGhyYXNlYm9va19zaGlmdCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUmKCgxPDxwaHJhc2Vib29rX3NoaWZ0KS0xKSldOwogICAgaWYgKCFvZmZzZXQpCiAgICAgICAgcmV0dXJuIDA7CgogICAgaSA9IDA7CgogICAgZm9yICg7OykgewogICAgICAgIC8qIGdldCB3b3JkIGluZGV4ICovCiAgICAgICAgd29yZCA9IHBocmFzZWJvb2tbb2Zmc2V0XSAtIHBocmFzZWJvb2tfc2hvcnQ7CiAgICAgICAgaWYgKHdvcmQgPj0gMCkgewogICAgICAgICAgICB3b3JkID0gKHdvcmQgPDwgOCkgKyBwaHJhc2Vib29rW29mZnNldCsxXTsKICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHdvcmQgPSBwaHJhc2Vib29rW29mZnNldCsrXTsKICAgICAgICBpZiAoaSkgewogICAgICAgICAgICBpZiAoaSA+IGJ1ZmxlbikKICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgICAgICAgYnVmZmVyW2krK10gPSAnICc7CiAgICAgICAgfQogICAgICAgIC8qIGNvcHkgd29yZCBzdHJpbmcgZnJvbSBsZXhpY29uLiAgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZQogICAgICAgICAgIHdvcmQgaGFzIGJpdCA3IHNldC4gIHRoZSBsYXN0IHdvcmQgaW4gYSBzdHJpbmcgZW5kcyB3aXRoCiAgICAgICAgICAgMHg4MCAqLwogICAgICAgIHcgPSBsZXhpY29uICsgbGV4aWNvbl9vZmZzZXRbd29yZF07CiAgICAgICAgd2hpbGUgKCp3IDwgMTI4KSB7CiAgICAgICAgICAgIGlmIChpID49IGJ1ZmxlbikKICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgICAgICAgYnVmZmVyW2krK10gPSAqdysrOwogICAgICAgIH0KICAgICAgICBpZiAoaSA+PSBidWZsZW4pCiAgICAgICAgICAgIHJldHVybiAwOyAvKiBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgICBidWZmZXJbaSsrXSA9ICp3ICYgMTI3OwogICAgICAgIGlmICgqdyA9PSAxMjgpCiAgICAgICAgICAgIGJyZWFrOyAvKiBlbmQgb2Ygd29yZCAqLwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdGF0aWMgaW50Cl9jbXBuYW1lKFB5T2JqZWN0ICpzZWxmLCBpbnQgY29kZSwgY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4pCnsKICAgIC8qIGNoZWNrIGlmIGNvZGUgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIG5hbWUgKi8KICAgIGludCBpOwogICAgY2hhciBidWZmZXJbTkFNRV9NQVhMRU5dOwogICAgaWYgKCFfZ2V0dWNuYW1lKHNlbGYsIGNvZGUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKQogICAgICAgIHJldHVybiAwOwogICAgZm9yIChpID0gMDsgaSA8IG5hbWVsZW47IGkrKykgewogICAgICAgIGlmICh0b3VwcGVyKFB5X0NIQVJNQVNLKG5hbWVbaV0pKSAhPSBidWZmZXJbaV0pCiAgICAgICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIGJ1ZmZlcltuYW1lbGVuXSA9PSAnXDAnOwp9CgpzdGF0aWMgdm9pZCAKZmluZF9zeWxsYWJsZShjb25zdCBjaGFyICpzdHIsIGludCAqbGVuLCBpbnQgKnBvcywgaW50IGNvdW50LCBpbnQgY29sdW1uKQp7CiAgICBpbnQgaSwgbGVuMTsKICAgICpsZW4gPSAtMTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgljaGFyICpzID0gaGFuZ3VsX3N5bGxhYmxlc1tpXVtjb2x1bW5dOwoJbGVuMSA9IHN0cmxlbihzKTsKCWlmIChsZW4xIDw9ICpsZW4pCgkgICAgY29udGludWU7CglpZiAoc3RybmNtcChzdHIsIHMsIGxlbjEpID09IDApIHsKCSAgICAqbGVuID0gbGVuMTsKCSAgICAqcG9zID0gaTsKCX0KICAgIH0KICAgIGlmICgqbGVuID09IC0xKSB7CgkqbGVuID0gMDsKICAgIH0KfQoKc3RhdGljIGludApfZ2V0Y29kZShQeU9iamVjdCogc2VsZiwgY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4sIFB5X1VDUzQqIGNvZGUpCnsKICAgIHVuc2lnbmVkIGludCBoLCB2OwogICAgdW5zaWduZWQgaW50IG1hc2sgPSBjb2RlX3NpemUtMTsKICAgIHVuc2lnbmVkIGludCBpLCBpbmNyOwoKICAgIC8qIENoZWNrIGZvciBoYW5ndWwgc3lsbGFibGVzLiAqLwogICAgaWYgKHN0cm5jbXAobmFtZSwgIkhBTkdVTCBTWUxMQUJMRSAiLCAxNikgPT0gMCkgewoJaW50IGxlbiwgTCA9IC0xLCBWID0gLTEsIFQgPSAtMTsKCWNvbnN0IGNoYXIgKnBvcyA9IG5hbWUgKyAxNjsKCWZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmTCwgTENvdW50LCAwKTsKCXBvcyArPSBsZW47CglmaW5kX3N5bGxhYmxlKHBvcywgJmxlbiwgJlYsIFZDb3VudCwgMSk7Cglwb3MgKz0gbGVuOwoJZmluZF9zeWxsYWJsZShwb3MsICZsZW4sICZULCBUQ291bnQsIDIpOwoJcG9zICs9IGxlbjsKCWlmIChMICE9IC0xICYmIFYgIT0gLTEgJiYgVCAhPSAtMSAmJiBwb3MtbmFtZSA9PSBuYW1lbGVuKSB7CgkgICAgKmNvZGUgPSBTQmFzZSArIChMKlZDb3VudCtWKSpUQ291bnQgKyBUOwoJICAgIHJldHVybiAxOwoJfQogICAgICAgIC8qIE90aGVyd2lzZSwgaXQncyBhbiBpbGxlZ2FsIHN5bGxhYmxlIG5hbWUuICovCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogQ2hlY2sgZm9yIHVuaWZpZWQgaWRlb2dyYXBocy4gKi8KICAgIGlmIChzdHJuY21wKG5hbWUsICJDSksgVU5JRklFRCBJREVPR1JBUEgtIiwgMjIpID09IDApIHsKICAgICAgICAvKiBGb3VyIG9yIGZpdmUgaGV4ZGlnaXRzIG11c3QgZm9sbG93LiAqLwogICAgICAgIHYgPSAwOwogICAgICAgIG5hbWUgKz0gMjI7CiAgICAgICAgbmFtZWxlbiAtPSAyMjsKICAgICAgICBpZiAobmFtZWxlbiAhPSA0ICYmIG5hbWVsZW4gIT0gNSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgd2hpbGUgKG5hbWVsZW4tLSkgewogICAgICAgICAgICB2ICo9IDE2OwogICAgICAgICAgICBpZiAoKm5hbWUgPj0gJzAnICYmICpuYW1lIDw9ICc5JykKICAgICAgICAgICAgICAgIHYgKz0gKm5hbWUgLSAnMCc7CiAgICAgICAgICAgIGVsc2UgaWYgKCpuYW1lID49ICdBJyAmJiAqbmFtZSA8PSAnRicpCiAgICAgICAgICAgICAgICB2ICs9ICpuYW1lIC0gJ0EnICsgMTA7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBuYW1lKys7CiAgICAgICAgfQogICAgICAgIGlmICghaXNfdW5pZmllZF9pZGVvZ3JhcGgodikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICpjb2RlID0gdjsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvKiB0aGUgZm9sbG93aW5nIGlzIHRoZSBzYW1lIGFzIHB5dGhvbidzIGRpY3Rpb25hcnkgbG9va3VwLCB3aXRoCiAgICAgICBvbmx5IG1pbm9yIGNoYW5nZXMuICBzZWUgdGhlIG1ha2V1bmljb2RlZGF0YSBzY3JpcHQgZm9yIG1vcmUKICAgICAgIGRldGFpbHMgKi8KCiAgICBoID0gKHVuc2lnbmVkIGludCkgX2dldGhhc2gobmFtZSwgbmFtZWxlbiwgY29kZV9tYWdpYyk7CiAgICBpID0gKH5oKSAmIG1hc2s7CiAgICB2ID0gY29kZV9oYXNoW2ldOwogICAgaWYgKCF2KQogICAgICAgIHJldHVybiAwOwogICAgaWYgKF9jbXBuYW1lKHNlbGYsIHYsIG5hbWUsIG5hbWVsZW4pKSB7CiAgICAgICAgKmNvZGUgPSB2OwogICAgICAgIHJldHVybiAxOwogICAgfQogICAgaW5jciA9IChoIF4gKGggPj4gMykpICYgbWFzazsKICAgIGlmICghaW5jcikKICAgICAgICBpbmNyID0gbWFzazsKICAgIGZvciAoOzspIHsKICAgICAgICBpID0gKGkgKyBpbmNyKSAmIG1hc2s7CiAgICAgICAgdiA9IGNvZGVfaGFzaFtpXTsKICAgICAgICBpZiAoIXYpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmIChfY21wbmFtZShzZWxmLCB2LCBuYW1lLCBuYW1lbGVuKSkgewogICAgICAgICAgICAqY29kZSA9IHY7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBpbmNyID0gaW5jciA8PCAxOwogICAgICAgIGlmIChpbmNyID4gbWFzaykKICAgICAgICAgICAgaW5jciA9IGluY3IgXiBjb2RlX3BvbHk7CiAgICB9Cn0KCnN0YXRpYyBjb25zdCBfUHlVbmljb2RlX05hbWVfQ0FQSSBoYXNoQVBJID0gCnsKICAgIHNpemVvZihfUHlVbmljb2RlX05hbWVfQ0FQSSksCiAgICBfZ2V0dWNuYW1lLAogICAgX2dldGNvZGUKfTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIFB5dGhvbiBiaW5kaW5ncyAqLwoKUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX25hbWVfX2RvY19fLAoibmFtZSh1bmljaHJbLCBkZWZhdWx0XSlcblwKUmV0dXJucyB0aGUgbmFtZSBhc3NpZ25lZCB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgdW5pY2hyIGFzIGFcblwKc3RyaW5nLiBJZiBubyBuYW1lIGlzIGRlZmluZWQsIGRlZmF1bHQgaXMgcmV0dXJuZWQsIG9yLCBpZiBub3RcblwKZ2l2ZW4sIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfbmFtZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIGNoYXIgbmFtZVtOQU1FX01BWExFTl07CgogICAgUHlVbmljb2RlT2JqZWN0KiB2OwogICAgUHlPYmplY3QqIGRlZm9iaiA9IE5VTEw7CiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86bmFtZSIsICZQeVVuaWNvZGVfVHlwZSwgJnYsICZkZWZvYmopKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUodikgIT0gMSkgewoJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKCQkJIm5lZWQgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIgYXMgcGFyYW1ldGVyIik7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoIV9nZXR1Y25hbWUoc2VsZiwgKFB5X1VDUzQpICpQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKICAgICAgICAgICAgICAgICAgICBuYW1lLCBzaXplb2YobmFtZSkpKSB7CglpZiAoZGVmb2JqID09IE5VTEwpIHsKCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIHN1Y2ggbmFtZSIpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKCX0KCWVsc2UgewoJICAgIFB5X0lOQ1JFRihkZWZvYmopOwoJICAgIHJldHVybiBkZWZvYmo7Cgl9CiAgICB9CgogICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKG5hbWUpOwp9CgpQeURvY19TVFJWQVIodW5pY29kZWRhdGFfbG9va3VwX19kb2NfXywKImxvb2t1cChuYW1lKVxuXApcblwKTG9vayB1cCBjaGFyYWN0ZXIgYnkgbmFtZS4gIElmIGEgY2hhcmFjdGVyIHdpdGggdGhlXG5cCmdpdmVuIG5hbWUgaXMgZm91bmQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlXG5cCmNoYXJhY3Rlci4gIElmIG5vdCBmb3VuZCwgS2V5RXJyb3IgaXMgcmFpc2VkLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKdW5pY29kZWRhdGFfbG9va3VwKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKewogICAgUHlfVUNTNCBjb2RlOwogICAgUHlfVU5JQ09ERSBzdHJbMV07CiAgICBjaGFyIGVycmJ1ZlsyNTZdOwoKICAgIGNoYXIqIG5hbWU7CiAgICBpbnQgbmFtZWxlbjsKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6bG9va3VwIiwgJm5hbWUsICZuYW1lbGVuKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoIV9nZXRjb2RlKHNlbGYsIG5hbWUsIG5hbWVsZW4sICZjb2RlKSkgewoJLyogWFhYKG5ub3J3aXR6KTogd2h5IGFyZSB3ZSBhbGxvY2F0aW5nIGZvciB0aGUgZXJyb3IgbXNnPwoJCVdoeSBub3QgYWx3YXlzIHVzZSBzbnByaW50Zj8gKi8KICAgICAgICBjaGFyIGZtdFtdID0gInVuZGVmaW5lZCBjaGFyYWN0ZXIgbmFtZSAnJXMnIjsKICAgICAgICBjaGFyICpidWYgPSBQeU1lbV9NQUxMT0Moc2l6ZW9mKGZtdCkgKyBuYW1lbGVuKTsKICAgICAgICBpZiAoYnVmKQogICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgZm10LCBuYW1lKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYnVmID0gZXJyYnVmOwogICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGVycmJ1ZiksIGZtdCwgbmFtZSk7CiAgICAgICAgfQogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgYnVmKTsKICAgICAgICBpZiAoYnVmICE9IGVycmJ1ZikKICAgICAgICAJUHlNZW1fRlJFRShidWYpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHN0clswXSA9IChQeV9VTklDT0RFKSBjb2RlOwogICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShzdHIsIDEpOwp9CgovKiBYWFggQWRkIGRvYyBzdHJpbmdzLiAqLwoKc3RhdGljIFB5TWV0aG9kRGVmIHVuaWNvZGVkYXRhX2Z1bmN0aW9uc1tdID0gewogICAgeyJkZWNpbWFsIiwgdW5pY29kZWRhdGFfZGVjaW1hbCwgTUVUSF9WQVJBUkdTLCB1bmljb2RlZGF0YV9kZWNpbWFsX19kb2NfX30sCiAgICB7ImRpZ2l0IiwgdW5pY29kZWRhdGFfZGlnaXQsIE1FVEhfVkFSQVJHUywgdW5pY29kZWRhdGFfZGlnaXRfX2RvY19ffSwKICAgIHsibnVtZXJpYyIsIHVuaWNvZGVkYXRhX251bWVyaWMsIE1FVEhfVkFSQVJHUywgdW5pY29kZWRhdGFfbnVtZXJpY19fZG9jX199LAogICAgeyJjYXRlZ29yeSIsIHVuaWNvZGVkYXRhX2NhdGVnb3J5LCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfY2F0ZWdvcnlfX2RvY19ffSwKICAgIHsiYmlkaXJlY3Rpb25hbCIsIHVuaWNvZGVkYXRhX2JpZGlyZWN0aW9uYWwsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX2JpZGlyZWN0aW9uYWxfX2RvY19ffSwKICAgIHsiY29tYmluaW5nIiwgdW5pY29kZWRhdGFfY29tYmluaW5nLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX2NvbWJpbmluZ19fZG9jX199LAogICAgeyJtaXJyb3JlZCIsIHVuaWNvZGVkYXRhX21pcnJvcmVkLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfbWlycm9yZWRfX2RvY19ffSwKICAgIHsiZWFzdF9hc2lhbl93aWR0aCIsIHVuaWNvZGVkYXRhX2Vhc3RfYXNpYW5fd2lkdGgsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX2Vhc3RfYXNpYW5fd2lkdGhfX2RvY19ffSwKICAgIHsiZGVjb21wb3NpdGlvbiIsIHVuaWNvZGVkYXRhX2RlY29tcG9zaXRpb24sIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVkYXRhX2RlY29tcG9zaXRpb25fX2RvY19ffSwKICAgIHsibmFtZSIsIHVuaWNvZGVkYXRhX25hbWUsIE1FVEhfVkFSQVJHUywgdW5pY29kZWRhdGFfbmFtZV9fZG9jX199LAogICAgeyJsb29rdXAiLCB1bmljb2RlZGF0YV9sb29rdXAsIE1FVEhfVkFSQVJHUywgdW5pY29kZWRhdGFfbG9va3VwX19kb2NfX30sCiAgICB7Im5vcm1hbGl6ZSIsIHVuaWNvZGVkYXRhX25vcm1hbGl6ZSwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICB1bmljb2RlZGF0YV9ub3JtYWxpemVfX2RvY19ffSwKICAgIHtOVUxMLCBOVUxMfQkJLyogc2VudGluZWwgKi8KfTsKCnN0YXRpYyBQeVR5cGVPYmplY3QgVUNEX1R5cGUgPSB7CgkvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgoJICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQoJInVuaWNvZGVkYXRhLlVDRCIsCQkvKnRwX25hbWUqLwoJc2l6ZW9mKFByZXZpb3VzREJWZXJzaW9uKSwJLyp0cF9iYXNpY3NpemUqLwoJMCwJCQkvKnRwX2l0ZW1zaXplKi8KCS8qIG1ldGhvZHMgKi8KCShkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwgLyp0cF9kZWFsbG9jKi8KCTAsCQkJLyp0cF9wcmludCovCgkwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwoJMCwJCQkvKnRwX3NldGF0dHIqLwoJMCwJCQkvKnRwX2NvbXBhcmUqLwoJMCwJCQkvKnRwX3JlcHIqLwoJMCwJCQkvKnRwX2FzX251bWJlciovCgkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwoJMCwJCQkvKnRwX2FzX21hcHBpbmcqLwoJMCwJCQkvKnRwX2hhc2gqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAvKnRwX2ZsYWdzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KICAgICAgICB1bmljb2RlZGF0YV9mdW5jdGlvbnMsICAvKnRwX21ldGhvZHMqLwogICAgICAgIERCX21lbWJlcnMsICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KfTsKClB5RG9jX1NUUlZBUih1bmljb2RlZGF0YV9kb2NzdHJpbmcsCiJUaGlzIG1vZHVsZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlIHdoaWNoXG5cCmRlZmluZXMgY2hhcmFjdGVyIHByb3BlcnRpZXMgZm9yIGFsbCBVbmljb2RlIGNoYXJhY3RlcnMuIFRoZSBkYXRhIGluXG5cCnRoaXMgZGF0YWJhc2UgaXMgYmFzZWQgb24gdGhlIFVuaWNvZGVEYXRhLnR4dCBmaWxlIHZlcnNpb25cblwKNC4xLjAgd2hpY2ggaXMgcHVibGljYWxseSBhdmFpbGFibGUgZnJvbSBmdHA6Ly9mdHAudW5pY29kZS5vcmcvLlxuXApcblwKVGhlIG1vZHVsZSB1c2VzIHRoZSBzYW1lIG5hbWVzIGFuZCBzeW1ib2xzIGFzIGRlZmluZWQgYnkgdGhlXG5cClVuaWNvZGVEYXRhIEZpbGUgRm9ybWF0IDQuMS4wIChzZWVcblwKaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvNC4xLjAvdWNkL1VDRC5odG1sKS4iKTsKClB5TU9ESU5JVF9GVU5DCmluaXR1bmljb2RlZGF0YSh2b2lkKQp7CiAgICBQeU9iamVjdCAqbSwgKnY7CgogICAgUHlfVHlwZSgmVUNEX1R5cGUpID0gJlB5VHlwZV9UeXBlOwoKICAgIG0gPSBQeV9Jbml0TW9kdWxlMygKICAgICAgICAidW5pY29kZWRhdGEiLCB1bmljb2RlZGF0YV9mdW5jdGlvbnMsIHVuaWNvZGVkYXRhX2RvY3N0cmluZyk7CiAgICBpZiAoIW0pCiAgICAgICAgcmV0dXJuOwoKICAgIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJ1bmlkYXRhX3ZlcnNpb24iLCBVTklEQVRBX1ZFUlNJT04pOwogICAgUHlfSU5DUkVGKCZVQ0RfVHlwZSk7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVDRCIsIChQeU9iamVjdCopJlVDRF9UeXBlKTsKCiAgICAvKiBQcmV2aW91cyB2ZXJzaW9ucyAqLwogICAgdiA9IG5ld19wcmV2aW91c192ZXJzaW9uKCIzLjIuMCIsIGdldF9jaGFuZ2VfM18yXzAsIG5vcm1hbGl6YXRpb25fM18yXzApOwogICAgaWYgKHYgIT0gTlVMTCkKICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInVjZF8zXzJfMCIsIHYpOwoKICAgIC8qIEV4cG9ydCBDIEFQSSAqLwogICAgdiA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCAqKSAmaGFzaEFQSSwgTlVMTCk7CiAgICBpZiAodiAhPSBOVUxMKQogICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAidWNuaGFzaF9DQVBJIiwgdik7Cn0KCi8qIApMb2NhbCB2YXJpYWJsZXM6CmMtYmFzaWMtb2Zmc2V0OiA0CmluZGVudC10YWJzLW1vZGU6IG5pbApFbmQ6CiovCg==