LyoKICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICovCgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojaW5jbHVkZSAibmV0ZGlzc2VjdC5oIgoKZW51bSBmb3JtYXRfZmxhZ3MgewogICAgbWludXNfZmxhZyAgICAgPSAgMSwKICAgIHBsdXNfZmxhZyAgICAgID0gIDIsCiAgICBzcGFjZV9mbGFnICAgICA9ICA0LAogICAgYWx0ZXJuYXRlX2ZsYWcgPSAgOCwKICAgIHplcm9fZmxhZyAgICAgID0gMTYKfTsKCi8qCiAqIENvbW1vbiBzdGF0ZQogKi8KCnN0cnVjdCBzdGF0ZSB7CiAgdW5zaWduZWQgY2hhciAqc3RyOwogIHVuc2lnbmVkIGNoYXIgKnM7CiAgdW5zaWduZWQgY2hhciAqdGhlZW5kOwogIHNpemVfdCBzejsKICBzaXplX3QgbWF4X3N6OwogIGludCAoKmFwcGVuZF9jaGFyKShzdHJ1Y3Qgc3RhdGUgKiwgdW5zaWduZWQgY2hhcik7CiAgaW50ICgqcmVzZXJ2ZSkoc3RydWN0IHN0YXRlICosIHNpemVfdCk7CiAgLyogWFhYIC0gbWV0aG9kcyAqLwp9OwoKI2lmIDAKc3RhdGljIGludAphc19yZXNlcnZlIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCBzaXplX3QgbikKewogIGlmIChzdGF0ZS0+cyArIG4gPiBzdGF0ZS0+dGhlZW5kKSB7CiAgICBpbnQgb2ZmID0gc3RhdGUtPnMgLSBzdGF0ZS0+c3RyOwogICAgdW5zaWduZWQgY2hhciAqdG1wOwoKICAgIGlmIChzdGF0ZS0+bWF4X3N6ICYmIHN0YXRlLT5zeiA+PSBzdGF0ZS0+bWF4X3N6KQogICAgICByZXR1cm4gMTsKCiAgICBzdGF0ZS0+c3ogPSBtYXgoc3RhdGUtPnN6ICogMiwgc3RhdGUtPnN6ICsgbik7CiAgICBpZiAoc3RhdGUtPm1heF9zeikKICAgICAgc3RhdGUtPnN6ID0gbWluKHN0YXRlLT5zeiwgc3RhdGUtPm1heF9zeik7CiAgICB0bXAgPSByZWFsbG9jIChzdGF0ZS0+c3RyLCBzdGF0ZS0+c3opOwogICAgaWYgKHRtcCA9PSBOVUxMKQogICAgICByZXR1cm4gMTsKICAgIHN0YXRlLT5zdHIgPSB0bXA7CiAgICBzdGF0ZS0+cyA9IHN0YXRlLT5zdHIgKyBvZmY7CiAgICBzdGF0ZS0+dGhlZW5kID0gc3RhdGUtPnN0ciArIHN0YXRlLT5zeiAtIDE7CiAgfQogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmFzX2FwcGVuZF9jaGFyIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBjaGFyIGMpCnsKICBpZihhc19yZXNlcnZlIChzdGF0ZSwgMSkpCiAgICByZXR1cm4gMTsKICBlbHNlIHsKICAgICpzdGF0ZS0+cysrID0gYzsKICAgIHJldHVybiAwOwogIH0KfQojZW5kaWYKCnN0YXRpYyBpbnQKYXBwZW5kX251bWJlcihzdHJ1Y3Qgc3RhdGUgKnN0YXRlLAoJICAgICAgdW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGJhc2UsIGNoYXIgKnJlcCwKCSAgICAgIGludCB3aWR0aCwgaW50IHByZWMsIGludCBmbGFncywgaW50IG1pbnVzcCkKewogIGludCBsZW4gPSAwOwogIGludCBpOwoKICAvKiBnaXZlbiBwcmVjaXNpb24sIGlnbm9yZSB6ZXJvIGZsYWcgKi8KICBpZihwcmVjICE9IC0xKQogICAgZmxhZ3MgJj0gfnplcm9fZmxhZzsKICBlbHNlCiAgICBwcmVjID0gMTsKICAvKiB6ZXJvIHZhbHVlIHdpdGggemVybyBwcmVjaXNpb24gLT4gIiIgKi8KICBpZihwcmVjID09IDAgJiYgbnVtID09IDApCiAgICByZXR1cm4gMDsKICBkb3sKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgcmVwW251bSAlIGJhc2VdKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICAgIG51bSAvPSBiYXNlOwogIH13aGlsZShudW0pOwogIHByZWMgLT0gbGVuOwogIC8qIHBhZCB3aXRoIHByZWMgemVyb3MgKi8KICB3aGlsZShwcmVjLS0gPiAwKXsKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJzAnKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICB9CiAgLyogYWRkIGxlbmd0aCBvZiBhbHRlcm5hdGUgcHJlZml4IChhZGRlZCBsYXRlcikgdG8gbGVuICovCiAgaWYoZmxhZ3MgJiBhbHRlcm5hdGVfZmxhZyAmJiAoYmFzZSA9PSAxNiB8fCBiYXNlID09IDgpKQogICAgbGVuICs9IGJhc2UgLyA4OwogIC8qIHBhZCB3aXRoIHplcm9zICovCiAgaWYoZmxhZ3MgJiB6ZXJvX2ZsYWcpewogICAgd2lkdGggLT0gbGVuOwogICAgaWYobWludXNwIHx8IChmbGFncyAmIHNwYWNlX2ZsYWcpIHx8IChmbGFncyAmIHBsdXNfZmxhZykpCiAgICAgIHdpZHRoLS07CiAgICB3aGlsZSh3aWR0aC0tID4gMCl7CiAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJzAnKSkKCXJldHVybiAxOwogICAgICBsZW4rKzsKICAgIH0KICB9CiAgLyogYWRkIGFsdGVybmF0ZSBwcmVmaXggKi8KICBpZihmbGFncyAmIGFsdGVybmF0ZV9mbGFnICYmIChiYXNlID09IDE2IHx8IGJhc2UgPT0gOCkpewogICAgaWYoYmFzZSA9PSAxNikKICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCByZXBbMTBdICsgMjMpKSAvKiBYWFggKi8KCXJldHVybiAxOwogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQogICAgICByZXR1cm4gMTsKICB9CiAgLyogYWRkIHNpZ24gKi8KICBpZihtaW51c3ApewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnLScpKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogIH0gZWxzZSBpZihmbGFncyAmIHBsdXNfZmxhZykgewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnKycpKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogIH0gZWxzZSBpZihmbGFncyAmIHNwYWNlX2ZsYWcpIHsKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJyAnKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICB9CiAgaWYoZmxhZ3MgJiBtaW51c19mbGFnKQogICAgLyogc3dhcCBiZWZvcmUgcGFkZGluZyB3aXRoIHNwYWNlcyAqLwogICAgZm9yKGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrKXsKICAgICAgY2hhciBjID0gc3RhdGUtPnNbLWktMV07CiAgICAgIHN0YXRlLT5zWy1pLTFdID0gc3RhdGUtPnNbLWxlbitpXTsKICAgICAgc3RhdGUtPnNbLWxlbitpXSA9IGM7CiAgICB9CiAgd2lkdGggLT0gbGVuOwogIHdoaWxlKHdpZHRoLS0gPiAwKXsKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgICcgJykpCiAgICAgIHJldHVybiAxOwogICAgbGVuKys7CiAgfQogIGlmKCEoZmxhZ3MgJiBtaW51c19mbGFnKSkKICAgIC8qIHN3YXAgYWZ0ZXIgcGFkZGluZyB3aXRoIHNwYWNlcyAqLwogICAgZm9yKGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrKXsKICAgICAgY2hhciBjID0gc3RhdGUtPnNbLWktMV07CiAgICAgIHN0YXRlLT5zWy1pLTFdID0gc3RhdGUtPnNbLWxlbitpXTsKICAgICAgc3RhdGUtPnNbLWxlbitpXSA9IGM7CiAgICB9CgogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmFwcGVuZF9zdHJpbmcgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsCgkgICAgICAgdW5zaWduZWQgY2hhciAqYXJnLAoJICAgICAgIGludCB3aWR0aCwKCSAgICAgICBpbnQgcHJlYywKCSAgICAgICBpbnQgZmxhZ3MpCnsKICBpZihwcmVjICE9IC0xKQogICAgd2lkdGggLT0gcHJlYzsKICBlbHNlCiAgICB3aWR0aCAtPSBzdHJsZW4oKGNoYXIgKilhcmcpOwogIGlmKCEoZmxhZ3MgJiBtaW51c19mbGFnKSkKICAgIHdoaWxlKHdpZHRoLS0gPiAwKQogICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQoJcmV0dXJuIDE7CiAgaWYgKHByZWMgIT0gLTEpIHsKICAgIHdoaWxlICgqYXJnICYmIHByZWMtLSkKICAgICAgaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICphcmcrKykpCglyZXR1cm4gMTsKICB9IGVsc2UgewogICAgd2hpbGUgKCphcmcpCiAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAqYXJnKyspKQoJcmV0dXJuIDE7CiAgfQogIGlmKGZsYWdzICYgbWludXNfZmxhZykKICAgIHdoaWxlKHdpZHRoLS0gPiAwKQogICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQoJcmV0dXJuIDE7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKYXBwZW5kX2NoYXIoc3RydWN0IHN0YXRlICpzdGF0ZSwKCSAgICB1bnNpZ25lZCBjaGFyIGFyZywKCSAgICBpbnQgd2lkdGgsCgkgICAgaW50IGZsYWdzKQp7CiAgd2hpbGUoIShmbGFncyAmIG1pbnVzX2ZsYWcpICYmIC0td2lkdGggPiAwKQogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKICAgICAgcmV0dXJuIDE7CgogIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsIGFyZykpCiAgICByZXR1cm4gMTsKICB3aGlsZSgoZmxhZ3MgJiBtaW51c19mbGFnKSAmJiAtLXdpZHRoID4gMCkKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCiAgICAgIHJldHVybiAxOwoKICByZXR1cm4gMDsKfQoKLyoKICogVGhpcyBjYW4ndCBiZSBtYWRlIGludG8gYSBmdW5jdGlvbi4uLgogKi8KCiNkZWZpbmUgUEFSU0VfSU5UX0ZPUk1BVChyZXMsIGFyZywgdW5zaWcpIFwKaWYgKGxvbmdfZmxhZykgXAogICAgIHJlcyA9ICh1bnNpZyBsb25nKXZhX2FyZyhhcmcsIHVuc2lnIGxvbmcpOyBcCmVsc2UgaWYgKHNob3J0X2ZsYWcpIFwKICAgICByZXMgPSAodW5zaWcgc2hvcnQpdmFfYXJnKGFyZywgdW5zaWcgaW50KTsgXAplbHNlIFwKICAgICByZXMgPSAodW5zaWcgaW50KXZhX2FyZyhhcmcsIHVuc2lnIGludCkKCi8qCiAqIHp5eHByaW50ZiAtIHJldHVybiAwIG9yIC0xCiAqLwoKc3RhdGljIGludAp4eXpwcmludGYgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKmNoYXJfZm9ybWF0LCB2YV9saXN0IGFwKQp7CiAgY29uc3QgdW5zaWduZWQgY2hhciAqZm9ybWF0ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiljaGFyX2Zvcm1hdDsKICB1bnNpZ25lZCBjaGFyIGM7CgogIHdoaWxlKChjID0gKmZvcm1hdCsrKSkgewogICAgaWYgKGMgPT0gJyUnKSB7CiAgICAgIGludCBmbGFncyAgICAgID0gMDsKICAgICAgaW50IHdpZHRoICAgICAgPSAwOwogICAgICBpbnQgcHJlYyAgICAgICA9IC0xOwogICAgICBpbnQgbG9uZ19mbGFnICA9IDA7CiAgICAgIGludCBzaG9ydF9mbGFnID0gMDsKCiAgICAgIC8qIGZsYWdzICovCiAgICAgIHdoaWxlKChjID0gKmZvcm1hdCsrKSl7CglpZihjID09ICctJykKCSAgZmxhZ3MgfD0gbWludXNfZmxhZzsKCWVsc2UgaWYoYyA9PSAnKycpCgkgIGZsYWdzIHw9IHBsdXNfZmxhZzsKCWVsc2UgaWYoYyA9PSAnICcpCgkgIGZsYWdzIHw9IHNwYWNlX2ZsYWc7CgllbHNlIGlmKGMgPT0gJyMnKQoJICBmbGFncyB8PSBhbHRlcm5hdGVfZmxhZzsKCWVsc2UgaWYoYyA9PSAnMCcpCgkgIGZsYWdzIHw9IHplcm9fZmxhZzsKCWVsc2UKCSAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGlmKChmbGFncyAmIHNwYWNlX2ZsYWcpICYmIChmbGFncyAmIHBsdXNfZmxhZykpCglmbGFncyBePSBzcGFjZV9mbGFnOwoKICAgICAgaWYoKGZsYWdzICYgbWludXNfZmxhZykgJiYgKGZsYWdzICYgemVyb19mbGFnKSkKCWZsYWdzIF49IHplcm9fZmxhZzsKCiAgICAgIC8qIHdpZHRoICovCiAgICAgIGlmIChpc2RpZ2l0KGMpKQoJZG8gewoJICB3aWR0aCA9IHdpZHRoICogMTAgKyBjIC0gJzAnOwoJICBjID0gKmZvcm1hdCsrOwoJfSB3aGlsZShpc2RpZ2l0KGMpKTsKICAgICAgZWxzZSBpZihjID09ICcqJykgewoJd2lkdGggPSB2YV9hcmcoYXAsIGludCk7CgljID0gKmZvcm1hdCsrOwogICAgICB9CgogICAgICAvKiBwcmVjaXNpb24gKi8KICAgICAgaWYgKGMgPT0gJy4nKSB7CglwcmVjID0gMDsKCWMgPSAqZm9ybWF0Kys7CglpZiAoaXNkaWdpdChjKSkKCSAgZG8gewoJICAgIHByZWMgPSBwcmVjICogMTAgKyBjIC0gJzAnOwoJICAgIGMgPSAqZm9ybWF0Kys7CgkgIH0gd2hpbGUoaXNkaWdpdChjKSk7CgllbHNlIGlmIChjID09ICcqJykgewoJICBwcmVjID0gdmFfYXJnKGFwLCBpbnQpOwoJICBjID0gKmZvcm1hdCsrOwoJfQogICAgICB9CgogICAgICAvKiBzaXplICovCgogICAgICBpZiAoYyA9PSAnaCcpIHsKCXNob3J0X2ZsYWcgPSAxOwoJYyA9ICpmb3JtYXQrKzsKICAgICAgfSBlbHNlIGlmIChjID09ICdsJykgewoJbG9uZ19mbGFnID0gMTsKCWMgPSAqZm9ybWF0Kys7CiAgICAgIH0KCiAgICAgIHN3aXRjaCAoYykgewogICAgICBjYXNlICdjJyA6CglpZihhcHBlbmRfY2hhcihzdGF0ZSwgdmFfYXJnKGFwLCBpbnQpLCB3aWR0aCwgZmxhZ3MpKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgY2FzZSAncycgOgoJaWYgKGFwcGVuZF9zdHJpbmcoc3RhdGUsCgkJCSAgdmFfYXJnKGFwLCB1bnNpZ25lZCBjaGFyKiksCgkJCSAgd2lkdGgsCgkJCSAgcHJlYywKCQkJICBmbGFncykpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICBjYXNlICdkJyA6CiAgICAgIGNhc2UgJ2knIDogewoJbG9uZyBhcmc7Cgl1bnNpZ25lZCBsb25nIG51bTsKCWludCBtaW51c3AgPSAwOwoKCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgc2lnbmVkKTsKCglpZiAoYXJnIDwgMCkgewoJICBtaW51c3AgPSAxOwoJICBudW0gPSAtYXJnOwoJfSBlbHNlCgkgIG51bSA9IGFyZzsKCglpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIG51bSwgMTAsICIwMTIzNDU2Nzg5IiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCBtaW51c3ApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICd1JyA6IHsKCXVuc2lnbmVkIGxvbmcgYXJnOwoKCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAxMCwgIjAxMjM0NTY3ODkiLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICdvJyA6IHsKCXVuc2lnbmVkIGxvbmcgYXJnOwoKCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAwMTAsICIwMTIzNDU2NyIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ3gnIDogewoJdW5zaWduZWQgbG9uZyBhcmc7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDB4MTAsICIwMTIzNDU2Nzg5YWJjZGVmIiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAnWCcgOnsKCXVuc2lnbmVkIGxvbmcgYXJnOwoKCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAweDEwLCAiMDEyMzQ1Njc4OUFCQ0RFRiIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ3AnIDogewoJdW5zaWduZWQgbG9uZyBhcmcgPSAodW5zaWduZWQgbG9uZyl2YV9hcmcoYXAsIHZvaWQqKTsKCglpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlBQkNERUYiLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICduJyA6IHsKCWludCAqYXJnID0gdmFfYXJnKGFwLCBpbnQqKTsKCSphcmcgPSBzdGF0ZS0+cyAtIHN0YXRlLT5zdHI7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICdcMCcgOgoJICAtLWZvcm1hdDsKCSAgLyogRkFMTFRIUk9VR0ggKi8KICAgICAgY2FzZSAnJScgOgoJaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgYykpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICBkZWZhdWx0IDoKCWlmICggICAoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICclJykKCSAgICB8fCAoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIGMpKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgfSBlbHNlCiAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCBjKSkKCXJldHVybiAtMTsKICB9CiAgcmV0dXJuIDA7Cn0KCiNpZiAwCiNpZm5kZWYgSEFWRV9BU1BSSU5URgppbnQKYXNwcmludGYgKGNoYXIgKipyZXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQp7CiAgdmFfbGlzdCBhcmdzOwogIGludCB2YWw7CgogIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CiAgdmFsID0gdmFzcHJpbnRmIChyZXQsIGZvcm1hdCwgYXJncyk7CgojaWZkZWYgUEFSQU5PSUEKICB7CiAgICBpbnQgcmV0MjsKICAgIGNoYXIgKnRtcDsKICAgIHRtcCA9IG1hbGxvYyAodmFsICsgMSk7CiAgICBpZiAodG1wID09IE5VTEwpCiAgICAgIGFib3J0ICgpOwoKICAgIHJldDIgPSB2c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOwogICAgaWYgKHZhbCAhPSByZXQyIHx8IHN0cmNtcCgqcmV0LCB0bXApKQogICAgICBhYm9ydCAoKTsKICAgIGZyZWUgKHRtcCk7CiAgfQojZW5kaWYKCiAgdmFfZW5kKGFyZ3MpOwogIHJldHVybiB2YWw7Cn0KI2VuZGlmCgojaWZuZGVmIEhBVkVfVkFTTlBSSU5URgppbnQKbmRfdmFzbnByaW50ZiAoY2hhciAqKnJldCwgc2l6ZV90IG1heF9zeiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCnsKICBpbnQgc3Q7CiAgc2l6ZV90IGxlbjsKICBzdHJ1Y3Qgc3RhdGUgc3RhdGU7CgogIHN0YXRlLm1heF9zeiA9IG1heF9zejsKICBzdGF0ZS5zeiAgICAgPSAxOwogIHN0YXRlLnN0ciAgICA9IG1hbGxvYyhzdGF0ZS5zeik7CiAgaWYgKHN0YXRlLnN0ciA9PSBOVUxMKSB7CiAgICAqcmV0ID0gTlVMTDsKICAgIHJldHVybiAtMTsKICB9CiAgc3RhdGUucyA9IHN0YXRlLnN0cjsKICBzdGF0ZS50aGVlbmQgPSBzdGF0ZS5zICsgc3RhdGUuc3ogLSAxOwogIHN0YXRlLmFwcGVuZF9jaGFyID0gYXNfYXBwZW5kX2NoYXI7CiAgc3RhdGUucmVzZXJ2ZSAgICAgPSBhc19yZXNlcnZlOwoKICBzdCA9IHh5enByaW50ZiAoJnN0YXRlLCBmb3JtYXQsIGFyZ3MpOwogIGlmIChzdCkgewogICAgZnJlZSAoc3RhdGUuc3RyKTsKICAgICpyZXQgPSBOVUxMOwogICAgcmV0dXJuIC0xOwogIH0gZWxzZSB7CiAgICBjaGFyICp0bXA7CgogICAgKnN0YXRlLnMgPSAnXDAnOwogICAgbGVuID0gc3RhdGUucyAtIHN0YXRlLnN0cjsKICAgIHRtcCA9IHJlYWxsb2MgKHN0YXRlLnN0ciwgbGVuKzEpOwogICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgIGZyZWUgKHN0YXRlLnN0cik7CiAgICAgICpyZXQgPSBOVUxMOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAqcmV0ID0gdG1wOwogICAgcmV0dXJuIGxlbjsKICB9Cn0KI2VuZGlmCiNlbmRpZgo=