LyoKICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICovCgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojaW5jbHVkZSAibmV0ZGlzc2VjdC5oIgoKZW51bSBmb3JtYXRfZmxhZ3MgewogICAgbWludXNfZmxhZyAgICAgPSAgMSwKICAgIHBsdXNfZmxhZyAgICAgID0gIDIsCiAgICBzcGFjZV9mbGFnICAgICA9ICA0LAogICAgYWx0ZXJuYXRlX2ZsYWcgPSAgOCwKICAgIHplcm9fZmxhZyAgICAgID0gMTYKfTsKCi8qCiAqIENvbW1vbiBzdGF0ZQogKi8KCnN0cnVjdCBzdGF0ZSB7CiAgdW5zaWduZWQgY2hhciAqc3RyOwogIHVuc2lnbmVkIGNoYXIgKnM7CiAgdW5zaWduZWQgY2hhciAqdGhlZW5kOwogIHNpemVfdCBzejsKICBzaXplX3QgbWF4X3N6OwogIGludCAoKmFwcGVuZF9jaGFyKShzdHJ1Y3Qgc3RhdGUgKiwgdW5zaWduZWQgY2hhcik7CiAgaW50ICgqcmVzZXJ2ZSkoc3RydWN0IHN0YXRlICosIHNpemVfdCk7CiAgLyogWFhYIC0gbWV0aG9kcyAqLwp9OwoKI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgpzdGF0aWMgaW50CnNuX3Jlc2VydmUgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHNpemVfdCBuKQp7CiAgcmV0dXJuIHN0YXRlLT5zICsgbiA+IHN0YXRlLT50aGVlbmQ7Cn0KCnN0YXRpYyBpbnQKc25fYXBwZW5kX2NoYXIgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgYykKewogIGlmIChzbl9yZXNlcnZlIChzdGF0ZSwgMSkpIHsKICAgIHJldHVybiAxOwogIH0gZWxzZSB7CiAgICAqc3RhdGUtPnMrKyA9IGM7CiAgICByZXR1cm4gMDsKICB9Cn0KI2VuZGlmCgojaWYgMApzdGF0aWMgaW50CmFzX3Jlc2VydmUgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHNpemVfdCBuKQp7CiAgaWYgKHN0YXRlLT5zICsgbiA+IHN0YXRlLT50aGVlbmQpIHsKICAgIGludCBvZmYgPSBzdGF0ZS0+cyAtIHN0YXRlLT5zdHI7CiAgICB1bnNpZ25lZCBjaGFyICp0bXA7CgogICAgaWYgKHN0YXRlLT5tYXhfc3ogJiYgc3RhdGUtPnN6ID49IHN0YXRlLT5tYXhfc3opCiAgICAgIHJldHVybiAxOwoKICAgIHN0YXRlLT5zeiA9IG1heChzdGF0ZS0+c3ogKiAyLCBzdGF0ZS0+c3ogKyBuKTsKICAgIGlmIChzdGF0ZS0+bWF4X3N6KQogICAgICBzdGF0ZS0+c3ogPSBtaW4oc3RhdGUtPnN6LCBzdGF0ZS0+bWF4X3N6KTsKICAgIHRtcCA9IHJlYWxsb2MgKHN0YXRlLT5zdHIsIHN0YXRlLT5zeik7CiAgICBpZiAodG1wID09IE5VTEwpCiAgICAgIHJldHVybiAxOwogICAgc3RhdGUtPnN0ciA9IHRtcDsKICAgIHN0YXRlLT5zID0gc3RhdGUtPnN0ciArIG9mZjsKICAgIHN0YXRlLT50aGVlbmQgPSBzdGF0ZS0+c3RyICsgc3RhdGUtPnN6IC0gMTsKICB9CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKYXNfYXBwZW5kX2NoYXIgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgYykKewogIGlmKGFzX3Jlc2VydmUgKHN0YXRlLCAxKSkKICAgIHJldHVybiAxOwogIGVsc2UgewogICAgKnN0YXRlLT5zKysgPSBjOwogICAgcmV0dXJuIDA7CiAgfQp9CiNlbmRpZgoKc3RhdGljIGludAphcHBlbmRfbnVtYmVyKHN0cnVjdCBzdGF0ZSAqc3RhdGUsCgkgICAgICB1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgYmFzZSwgY2hhciAqcmVwLAoJICAgICAgaW50IHdpZHRoLCBpbnQgcHJlYywgaW50IGZsYWdzLCBpbnQgbWludXNwKQp7CiAgaW50IGxlbiA9IDA7CiAgaW50IGk7CgogIC8qIGdpdmVuIHByZWNpc2lvbiwgaWdub3JlIHplcm8gZmxhZyAqLwogIGlmKHByZWMgIT0gLTEpCiAgICBmbGFncyAmPSB+emVyb19mbGFnOwogIGVsc2UKICAgIHByZWMgPSAxOwogIC8qIHplcm8gdmFsdWUgd2l0aCB6ZXJvIHByZWNpc2lvbiAtPiAiIiAqLwogIGlmKHByZWMgPT0gMCAmJiBudW0gPT0gMCkKICAgIHJldHVybiAwOwogIGRvewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCByZXBbbnVtICUgYmFzZV0pKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogICAgbnVtIC89IGJhc2U7CiAgfXdoaWxlKG51bSk7CiAgcHJlYyAtPSBsZW47CiAgLyogcGFkIHdpdGggcHJlYyB6ZXJvcyAqLwogIHdoaWxlKHByZWMtLSA+IDApewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogIH0KICAvKiBhZGQgbGVuZ3RoIG9mIGFsdGVybmF0ZSBwcmVmaXggKGFkZGVkIGxhdGVyKSB0byBsZW4gKi8KICBpZihmbGFncyAmIGFsdGVybmF0ZV9mbGFnICYmIChiYXNlID09IDE2IHx8IGJhc2UgPT0gOCkpCiAgICBsZW4gKz0gYmFzZSAvIDg7CiAgLyogcGFkIHdpdGggemVyb3MgKi8KICBpZihmbGFncyAmIHplcm9fZmxhZyl7CiAgICB3aWR0aCAtPSBsZW47CiAgICBpZihtaW51c3AgfHwgKGZsYWdzICYgc3BhY2VfZmxhZykgfHwgKGZsYWdzICYgcGx1c19mbGFnKSkKICAgICAgd2lkdGgtLTsKICAgIHdoaWxlKHdpZHRoLS0gPiAwKXsKICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQoJcmV0dXJuIDE7CiAgICAgIGxlbisrOwogICAgfQogIH0KICAvKiBhZGQgYWx0ZXJuYXRlIHByZWZpeCAqLwogIGlmKGZsYWdzICYgYWx0ZXJuYXRlX2ZsYWcgJiYgKGJhc2UgPT0gMTYgfHwgYmFzZSA9PSA4KSl7CiAgICBpZihiYXNlID09IDE2KQogICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIHJlcFsxMF0gKyAyMykpIC8qIFhYWCAqLwoJcmV0dXJuIDE7CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICcwJykpCiAgICAgIHJldHVybiAxOwogIH0KICAvKiBhZGQgc2lnbiAqLwogIGlmKG1pbnVzcCl7CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICctJykpCiAgICAgIHJldHVybiAxOwogICAgbGVuKys7CiAgfSBlbHNlIGlmKGZsYWdzICYgcGx1c19mbGFnKSB7CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICcrJykpCiAgICAgIHJldHVybiAxOwogICAgbGVuKys7CiAgfSBlbHNlIGlmKGZsYWdzICYgc3BhY2VfZmxhZykgewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnICcpKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogIH0KICBpZihmbGFncyAmIG1pbnVzX2ZsYWcpCiAgICAvKiBzd2FwIGJlZm9yZSBwYWRkaW5nIHdpdGggc3BhY2VzICovCiAgICBmb3IoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspewogICAgICBjaGFyIGMgPSBzdGF0ZS0+c1staS0xXTsKICAgICAgc3RhdGUtPnNbLWktMV0gPSBzdGF0ZS0+c1stbGVuK2ldOwogICAgICBzdGF0ZS0+c1stbGVuK2ldID0gYzsKICAgIH0KICB3aWR0aCAtPSBsZW47CiAgd2hpbGUod2lkdGgtLSA+IDApewogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAgJyAnKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICB9CiAgaWYoIShmbGFncyAmIG1pbnVzX2ZsYWcpKQogICAgLyogc3dhcCBhZnRlciBwYWRkaW5nIHdpdGggc3BhY2VzICovCiAgICBmb3IoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspewogICAgICBjaGFyIGMgPSBzdGF0ZS0+c1staS0xXTsKICAgICAgc3RhdGUtPnNbLWktMV0gPSBzdGF0ZS0+c1stbGVuK2ldOwogICAgICBzdGF0ZS0+c1stbGVuK2ldID0gYzsKICAgIH0KCiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKYXBwZW5kX3N0cmluZyAoc3RydWN0IHN0YXRlICpzdGF0ZSwKCSAgICAgICB1bnNpZ25lZCBjaGFyICphcmcsCgkgICAgICAgaW50IHdpZHRoLAoJICAgICAgIGludCBwcmVjLAoJICAgICAgIGludCBmbGFncykKewogIGlmKHByZWMgIT0gLTEpCiAgICB3aWR0aCAtPSBwcmVjOwogIGVsc2UKICAgIHdpZHRoIC09IHN0cmxlbigoY2hhciAqKWFyZyk7CiAgaWYoIShmbGFncyAmIG1pbnVzX2ZsYWcpKQogICAgd2hpbGUod2lkdGgtLSA+IDApCiAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCglyZXR1cm4gMTsKICBpZiAocHJlYyAhPSAtMSkgewogICAgd2hpbGUgKCphcmcgJiYgcHJlYy0tKQogICAgICBpZiAoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgKmFyZysrKSkKCXJldHVybiAxOwogIH0gZWxzZSB7CiAgICB3aGlsZSAoKmFyZykKICAgICAgaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICphcmcrKykpCglyZXR1cm4gMTsKICB9CiAgaWYoZmxhZ3MgJiBtaW51c19mbGFnKQogICAgd2hpbGUod2lkdGgtLSA+IDApCiAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCglyZXR1cm4gMTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludAphcHBlbmRfY2hhcihzdHJ1Y3Qgc3RhdGUgKnN0YXRlLAoJICAgIHVuc2lnbmVkIGNoYXIgYXJnLAoJICAgIGludCB3aWR0aCwKCSAgICBpbnQgZmxhZ3MpCnsKICB3aGlsZSghKGZsYWdzICYgbWludXNfZmxhZykgJiYgLS13aWR0aCA+IDApCiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQogICAgICByZXR1cm4gMTsKCiAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgYXJnKSkKICAgIHJldHVybiAxOwogIHdoaWxlKChmbGFncyAmIG1pbnVzX2ZsYWcpICYmIC0td2lkdGggPiAwKQogICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKICAgICAgcmV0dXJuIDE7CgogIHJldHVybiAwOwp9CgovKgogKiBUaGlzIGNhbid0IGJlIG1hZGUgaW50byBhIGZ1bmN0aW9uLi4uCiAqLwoKI2RlZmluZSBQQVJTRV9JTlRfRk9STUFUKHJlcywgYXJnLCB1bnNpZykgXAppZiAobG9uZ19mbGFnKSBcCiAgICAgcmVzID0gKHVuc2lnIGxvbmcpdmFfYXJnKGFyZywgdW5zaWcgbG9uZyk7IFwKZWxzZSBpZiAoc2hvcnRfZmxhZykgXAogICAgIHJlcyA9ICh1bnNpZyBzaG9ydCl2YV9hcmcoYXJnLCB1bnNpZyBpbnQpOyBcCmVsc2UgXAogICAgIHJlcyA9ICh1bnNpZyBpbnQpdmFfYXJnKGFyZywgdW5zaWcgaW50KQoKLyoKICogenl4cHJpbnRmIC0gcmV0dXJuIDAgb3IgLTEKICovCgpzdGF0aWMgaW50Cnh5enByaW50ZiAoc3RydWN0IHN0YXRlICpzdGF0ZSwgY29uc3QgY2hhciAqY2hhcl9mb3JtYXQsIHZhX2xpc3QgYXApCnsKICBjb25zdCB1bnNpZ25lZCBjaGFyICpmb3JtYXQgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWNoYXJfZm9ybWF0OwogIHVuc2lnbmVkIGNoYXIgYzsKCiAgd2hpbGUoKGMgPSAqZm9ybWF0KyspKSB7CiAgICBpZiAoYyA9PSAnJScpIHsKICAgICAgaW50IGZsYWdzICAgICAgPSAwOwogICAgICBpbnQgd2lkdGggICAgICA9IDA7CiAgICAgIGludCBwcmVjICAgICAgID0gLTE7CiAgICAgIGludCBsb25nX2ZsYWcgID0gMDsKICAgICAgaW50IHNob3J0X2ZsYWcgPSAwOwoKICAgICAgLyogZmxhZ3MgKi8KICAgICAgd2hpbGUoKGMgPSAqZm9ybWF0KyspKXsKCWlmKGMgPT0gJy0nKQoJICBmbGFncyB8PSBtaW51c19mbGFnOwoJZWxzZSBpZihjID09ICcrJykKCSAgZmxhZ3MgfD0gcGx1c19mbGFnOwoJZWxzZSBpZihjID09ICcgJykKCSAgZmxhZ3MgfD0gc3BhY2VfZmxhZzsKCWVsc2UgaWYoYyA9PSAnIycpCgkgIGZsYWdzIHw9IGFsdGVybmF0ZV9mbGFnOwoJZWxzZSBpZihjID09ICcwJykKCSAgZmxhZ3MgfD0gemVyb19mbGFnOwoJZWxzZQoJICBicmVhazsKICAgICAgfQoKICAgICAgaWYoKGZsYWdzICYgc3BhY2VfZmxhZykgJiYgKGZsYWdzICYgcGx1c19mbGFnKSkKCWZsYWdzIF49IHNwYWNlX2ZsYWc7CgogICAgICBpZigoZmxhZ3MgJiBtaW51c19mbGFnKSAmJiAoZmxhZ3MgJiB6ZXJvX2ZsYWcpKQoJZmxhZ3MgXj0gemVyb19mbGFnOwoKICAgICAgLyogd2lkdGggKi8KICAgICAgaWYgKGlzZGlnaXQoYykpCglkbyB7CgkgIHdpZHRoID0gd2lkdGggKiAxMCArIGMgLSAnMCc7CgkgIGMgPSAqZm9ybWF0Kys7Cgl9IHdoaWxlKGlzZGlnaXQoYykpOwogICAgICBlbHNlIGlmKGMgPT0gJyonKSB7Cgl3aWR0aCA9IHZhX2FyZyhhcCwgaW50KTsKCWMgPSAqZm9ybWF0Kys7CiAgICAgIH0KCiAgICAgIC8qIHByZWNpc2lvbiAqLwogICAgICBpZiAoYyA9PSAnLicpIHsKCXByZWMgPSAwOwoJYyA9ICpmb3JtYXQrKzsKCWlmIChpc2RpZ2l0KGMpKQoJICBkbyB7CgkgICAgcHJlYyA9IHByZWMgKiAxMCArIGMgLSAnMCc7CgkgICAgYyA9ICpmb3JtYXQrKzsKCSAgfSB3aGlsZShpc2RpZ2l0KGMpKTsKCWVsc2UgaWYgKGMgPT0gJyonKSB7CgkgIHByZWMgPSB2YV9hcmcoYXAsIGludCk7CgkgIGMgPSAqZm9ybWF0Kys7Cgl9CiAgICAgIH0KCiAgICAgIC8qIHNpemUgKi8KCiAgICAgIGlmIChjID09ICdoJykgewoJc2hvcnRfZmxhZyA9IDE7CgljID0gKmZvcm1hdCsrOwogICAgICB9IGVsc2UgaWYgKGMgPT0gJ2wnKSB7Cglsb25nX2ZsYWcgPSAxOwoJYyA9ICpmb3JtYXQrKzsKICAgICAgfQoKICAgICAgc3dpdGNoIChjKSB7CiAgICAgIGNhc2UgJ2MnIDoKCWlmKGFwcGVuZF9jaGFyKHN0YXRlLCB2YV9hcmcoYXAsIGludCksIHdpZHRoLCBmbGFncykpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICBjYXNlICdzJyA6CglpZiAoYXBwZW5kX3N0cmluZyhzdGF0ZSwKCQkJICB2YV9hcmcoYXAsIHVuc2lnbmVkIGNoYXIqKSwKCQkJICB3aWR0aCwKCQkJICBwcmVjLAoJCQkgIGZsYWdzKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIGNhc2UgJ2QnIDoKICAgICAgY2FzZSAnaScgOiB7Cglsb25nIGFyZzsKCXVuc2lnbmVkIGxvbmcgbnVtOwoJaW50IG1pbnVzcCA9IDA7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCBzaWduZWQpOwoKCWlmIChhcmcgPCAwKSB7CgkgIG1pbnVzcCA9IDE7CgkgIG51bSA9IC1hcmc7Cgl9IGVsc2UKCSAgbnVtID0gYXJnOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgbnVtLCAxMCwgIjAxMjM0NTY3ODkiLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIG1pbnVzcCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ3UnIDogewoJdW5zaWduZWQgbG9uZyBhcmc7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDEwLCAiMDEyMzQ1Njc4OSIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ28nIDogewoJdW5zaWduZWQgbG9uZyBhcmc7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDAxMCwgIjAxMjM0NTY3IiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAneCcgOiB7Cgl1bnNpZ25lZCBsb25nIGFyZzsKCglQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHVuc2lnbmVkKTsKCglpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlhYmNkZWYiLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICdYJyA6ewoJdW5zaWduZWQgbG9uZyBhcmc7CgoJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDB4MTAsICIwMTIzNDU2Nzg5QUJDREVGIiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAncCcgOiB7Cgl1bnNpZ25lZCBsb25nIGFyZyA9ICh1bnNpZ25lZCBsb25nKXZhX2FyZyhhcCwgdm9pZCopOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAweDEwLCAiMDEyMzQ1Njc4OUFCQ0RFRiIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ24nIDogewoJaW50ICphcmcgPSB2YV9hcmcoYXAsIGludCopOwoJKmFyZyA9IHN0YXRlLT5zIC0gc3RhdGUtPnN0cjsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ1wwJyA6CgkgIC0tZm9ybWF0OwoJICAvKiBGQUxMVEhST1VHSCAqLwogICAgICBjYXNlICclJyA6CglpZiAoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCBjKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIGRlZmF1bHQgOgoJaWYgKCAgICgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJyUnKQoJICAgIHx8ICgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgYykpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICB9IGVsc2UKICAgICAgaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsIGMpKQoJcmV0dXJuIC0xOwogIH0KICByZXR1cm4gMDsKfQoKI2lmbmRlZiBIQVZFX1NOUFJJTlRGCmludApzbnByaW50ZiAoY2hhciAqc3RyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQp7CiAgdmFfbGlzdCBhcmdzOwogIGludCByZXQ7CgogIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CiAgcmV0ID0gdnNucHJpbnRmIChzdHIsIHN6LCBmb3JtYXQsIGFyZ3MpOwoKI2lmZGVmIFBBUkFOT0lBCiAgewogICAgaW50IHJldDI7CiAgICBjaGFyICp0bXA7CgogICAgdG1wID0gbWFsbG9jIChzeik7CiAgICBpZiAodG1wID09IE5VTEwpCiAgICAgIGFib3J0ICgpOwoKICAgIHJldDIgPSB2c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOwogICAgaWYgKHJldCAhPSByZXQyIHx8IHN0cmNtcChzdHIsIHRtcCkpCiAgICAgIGFib3J0ICgpOwogICAgZnJlZSAodG1wKTsKICB9CiNlbmRpZgoKICB2YV9lbmQoYXJncyk7CiAgcmV0dXJuIHJldDsKfQojZW5kaWYKCiNpZiAwCiNpZm5kZWYgSEFWRV9BU1BSSU5URgppbnQKYXNwcmludGYgKGNoYXIgKipyZXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQp7CiAgdmFfbGlzdCBhcmdzOwogIGludCB2YWw7CgogIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CiAgdmFsID0gdmFzcHJpbnRmIChyZXQsIGZvcm1hdCwgYXJncyk7CgojaWZkZWYgUEFSQU5PSUEKICB7CiAgICBpbnQgcmV0MjsKICAgIGNoYXIgKnRtcDsKICAgIHRtcCA9IG1hbGxvYyAodmFsICsgMSk7CiAgICBpZiAodG1wID09IE5VTEwpCiAgICAgIGFib3J0ICgpOwoKICAgIHJldDIgPSB2c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOwogICAgaWYgKHZhbCAhPSByZXQyIHx8IHN0cmNtcCgqcmV0LCB0bXApKQogICAgICBhYm9ydCAoKTsKICAgIGZyZWUgKHRtcCk7CiAgfQojZW5kaWYKCiAgdmFfZW5kKGFyZ3MpOwogIHJldHVybiB2YWw7Cn0KI2VuZGlmCgojaWZuZGVmIEhBVkVfQVNOUFJJTlRGCmludAphc25wcmludGYgKGNoYXIgKipyZXQsIHNpemVfdCBtYXhfc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQp7CiAgdmFfbGlzdCBhcmdzOwogIGludCB2YWw7CgogIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CiAgdmFsID0gdmFzbnByaW50ZiAocmV0LCBtYXhfc3osIGZvcm1hdCwgYXJncyk7CgojaWZkZWYgUEFSQU5PSUEKICB7CiAgICBpbnQgcmV0MjsKICAgIGNoYXIgKnRtcDsKICAgIHRtcCA9IG1hbGxvYyAodmFsICsgMSk7CiAgICBpZiAodG1wID09IE5VTEwpCiAgICAgIGFib3J0ICgpOwoKICAgIHJldDIgPSB2c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOwogICAgaWYgKHZhbCAhPSByZXQyIHx8IHN0cmNtcCgqcmV0LCB0bXApKQogICAgICBhYm9ydCAoKTsKICAgIGZyZWUgKHRtcCk7CiAgfQojZW5kaWYKCiAgdmFfZW5kKGFyZ3MpOwogIHJldHVybiB2YWw7Cn0KI2VuZGlmCgojaWZuZGVmIEhBVkVfVkFTUFJJTlRGCmludAp2YXNwcmludGYgKGNoYXIgKipyZXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQp7CiAgcmV0dXJuIHZhc25wcmludGYgKHJldCwgMCwgZm9ybWF0LCBhcmdzKTsKfQojZW5kaWYKCgojaWZuZGVmIEhBVkVfVkFTTlBSSU5URgppbnQKdmFzbnByaW50ZiAoY2hhciAqKnJldCwgc2l6ZV90IG1heF9zeiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCnsKICBpbnQgc3Q7CiAgc2l6ZV90IGxlbjsKICBzdHJ1Y3Qgc3RhdGUgc3RhdGU7CgogIHN0YXRlLm1heF9zeiA9IG1heF9zejsKICBzdGF0ZS5zeiAgICAgPSAxOwogIHN0YXRlLnN0ciAgICA9IG1hbGxvYyhzdGF0ZS5zeik7CiAgaWYgKHN0YXRlLnN0ciA9PSBOVUxMKSB7CiAgICAqcmV0ID0gTlVMTDsKICAgIHJldHVybiAtMTsKICB9CiAgc3RhdGUucyA9IHN0YXRlLnN0cjsKICBzdGF0ZS50aGVlbmQgPSBzdGF0ZS5zICsgc3RhdGUuc3ogLSAxOwogIHN0YXRlLmFwcGVuZF9jaGFyID0gYXNfYXBwZW5kX2NoYXI7CiAgc3RhdGUucmVzZXJ2ZSAgICAgPSBhc19yZXNlcnZlOwoKICBzdCA9IHh5enByaW50ZiAoJnN0YXRlLCBmb3JtYXQsIGFyZ3MpOwogIGlmIChzdCkgewogICAgZnJlZSAoc3RhdGUuc3RyKTsKICAgICpyZXQgPSBOVUxMOwogICAgcmV0dXJuIC0xOwogIH0gZWxzZSB7CiAgICBjaGFyICp0bXA7CgogICAgKnN0YXRlLnMgPSAnXDAnOwogICAgbGVuID0gc3RhdGUucyAtIHN0YXRlLnN0cjsKICAgIHRtcCA9IHJlYWxsb2MgKHN0YXRlLnN0ciwgbGVuKzEpOwogICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgIGZyZWUgKHN0YXRlLnN0cik7CiAgICAgICpyZXQgPSBOVUxMOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAqcmV0ID0gdG1wOwogICAgcmV0dXJuIGxlbjsKICB9Cn0KI2VuZGlmCiNlbmRpZgoKI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgppbnQKdnNucHJpbnRmIChjaGFyICpzdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCnsKICBzdHJ1Y3Qgc3RhdGUgc3RhdGU7CiAgaW50IHJldDsKICB1bnNpZ25lZCBjaGFyICp1c3RyID0gKHVuc2lnbmVkIGNoYXIgKilzdHI7CgogIHN0YXRlLm1heF9zeiA9IDA7CiAgc3RhdGUuc3ogICAgID0gc3o7CiAgc3RhdGUuc3RyICAgID0gdXN0cjsKICBzdGF0ZS5zICAgICAgPSB1c3RyOwogIHN0YXRlLnRoZWVuZCA9IHVzdHIgKyBzeiAtIDE7CiAgc3RhdGUuYXBwZW5kX2NoYXIgPSBzbl9hcHBlbmRfY2hhcjsKICBzdGF0ZS5yZXNlcnZlICAgICA9IHNuX3Jlc2VydmU7CgogIHJldCA9IHh5enByaW50ZiAoJnN0YXRlLCBmb3JtYXQsIGFyZ3MpOwogICpzdGF0ZS5zID0gJ1wwJzsKICBpZiAocmV0KQogICAgcmV0dXJuIHN6OwogIGVsc2UKICAgIHJldHVybiBzdGF0ZS5zIC0gc3RhdGUuc3RyOwp9CiNlbmRpZgoK