LyoKICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICovCgovKiAkSWQ6IHNucHJpbnRmLmMsdiAxLjggMjAwMy0xMS0xNiAwOTozNjo1MSBndXkgRXhwICQgKi8KCiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlIDxjb25maWcuaD4KI2VuZGlmCgojaWZuZGVmIGxpbnQKc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQogICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3Npbmcvc25wcmludGYuYyx2IDEuOCAyMDAzLTExLTE2IDA5OjM2OjUxIGd1eSBFeHAgJCI7CiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojaW5jbHVkZSA8aW50ZXJmYWNlLmg+CgplbnVtIGZvcm1hdF9mbGFncyB7CiAgICBtaW51c19mbGFnICAgICA9ICAxLAogICAgcGx1c19mbGFnICAgICAgPSAgMiwKICAgIHNwYWNlX2ZsYWcgICAgID0gIDQsCiAgICBhbHRlcm5hdGVfZmxhZyA9ICA4LAogICAgemVyb19mbGFnICAgICAgPSAxNgp9OwoKLyoKICogQ29tbW9uIHN0YXRlCiAqLwoKc3RydWN0IHN0YXRlIHsKICB1bnNpZ25lZCBjaGFyICpzdHI7CiAgdW5zaWduZWQgY2hhciAqczsKICB1bnNpZ25lZCBjaGFyICp0aGVlbmQ7CiAgc2l6ZV90IHN6OwogIHNpemVfdCBtYXhfc3o7CiAgaW50ICgqYXBwZW5kX2NoYXIpKHN0cnVjdCBzdGF0ZSAqLCB1bnNpZ25lZCBjaGFyKTsKICBpbnQgKCpyZXNlcnZlKShzdHJ1Y3Qgc3RhdGUgKiwgc2l6ZV90KTsKICAvKiBYWFggLSBtZXRob2RzICovCn07CgojaWZuZGVmIEhBVkVfVlNOUFJJTlRGCnN0YXRpYyBpbnQKc25fcmVzZXJ2ZSAoc3RydWN0IHN0YXRlICpzdGF0ZSwgc2l6ZV90IG4pCnsKICByZXR1cm4gc3RhdGUtPnMgKyBuID4gc3RhdGUtPnRoZWVuZDsKfQoKc3RhdGljIGludApzbl9hcHBlbmRfY2hhciAoc3RydWN0IHN0YXRlICpzdGF0ZSwgdW5zaWduZWQgY2hhciBjKQp7CiAgaWYgKHNuX3Jlc2VydmUgKHN0YXRlLCAxKSkgewogICAgcmV0dXJuIDE7CiAgfSBlbHNlIHsKICAgICpzdGF0ZS0+cysrID0gYzsKICAgIHJldHVybiAwOwogIH0KfQojZW5kaWYKCiNpZiAwCnN0YXRpYyBpbnQKYXNfcmVzZXJ2ZSAoc3RydWN0IHN0YXRlICpzdGF0ZSwgc2l6ZV90IG4pCnsKICBpZiAoc3RhdGUtPnMgKyBuID4gc3RhdGUtPnRoZWVuZCkgewogICAgaW50IG9mZiA9IHN0YXRlLT5zIC0gc3RhdGUtPnN0cjsKICAgIHVuc2lnbmVkIGNoYXIgKnRtcDsKCiAgICBpZiAoc3RhdGUtPm1heF9zeiAmJiBzdGF0ZS0+c3ogPj0gc3RhdGUtPm1heF9zeikKICAgICAgcmV0dXJuIDE7CgogICAgc3RhdGUtPnN6ID0gbWF4KHN0YXRlLT5zeiAqIDIsIHN0YXRlLT5zeiArIG4pOwogICAgaWYgKHN0YXRlLT5tYXhfc3opCiAgICAgIHN0YXRlLT5zeiA9IG1pbihzdGF0ZS0+c3osIHN0YXRlLT5tYXhfc3opOwogICAgdG1wID0gcmVhbGxvYyAoc3RhdGUtPnN0ciwgc3RhdGUtPnN6KTsKICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgcmV0dXJuIDE7CiAgICBzdGF0ZS0+c3RyID0gdG1wOwogICAgc3RhdGUtPnMgPSBzdGF0ZS0+c3RyICsgb2ZmOwogICAgc3RhdGUtPnRoZWVuZCA9IHN0YXRlLT5zdHIgKyBzdGF0ZS0+c3ogLSAxOwogIH0KICByZXR1cm4gMDsKfQoKc3RhdGljIGludAphc19hcHBlbmRfY2hhciAoc3RydWN0IHN0YXRlICpzdGF0ZSwgdW5zaWduZWQgY2hhciBjKQp7CiAgaWYoYXNfcmVzZXJ2ZSAoc3RhdGUsIDEpKQogICAgcmV0dXJuIDE7CiAgZWxzZSB7CiAgICAqc3RhdGUtPnMrKyA9IGM7CiAgICByZXR1cm4gMDsKICB9Cn0KI2VuZGlmCgpzdGF0aWMgaW50CmFwcGVuZF9udW1iZXIoc3RydWN0IHN0YXRlICpzdGF0ZSwKCSAgICAgIHVuc2lnbmVkIGxvbmcgbnVtLCB1bnNpZ25lZCBiYXNlLCBjaGFyICpyZXAsCgkgICAgICBpbnQgd2lkdGgsIGludCBwcmVjLCBpbnQgZmxhZ3MsIGludCBtaW51c3ApCnsKICBpbnQgbGVuID0gMDsKICBpbnQgaTsKCiAgLyogZ2l2ZW4gcHJlY2lzaW9uLCBpZ25vcmUgemVybyBmbGFnICovCiAgaWYocHJlYyAhPSAtMSkKICAgIGZsYWdzICY9IH56ZXJvX2ZsYWc7CiAgZWxzZQogICAgcHJlYyA9IDE7CiAgLyogemVybyB2YWx1ZSB3aXRoIHplcm8gcHJlY2lzaW9uIC0+ICIiICovCiAgaWYocHJlYyA9PSAwICYmIG51bSA9PSAwKQogICAgcmV0dXJuIDA7CiAgZG97CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIHJlcFtudW0gJSBiYXNlXSkpCiAgICAgIHJldHVybiAxOwogICAgbGVuKys7CiAgICBudW0gLz0gYmFzZTsKICB9d2hpbGUobnVtKTsKICBwcmVjIC09IGxlbjsKICAvKiBwYWQgd2l0aCBwcmVjIHplcm9zICovCiAgd2hpbGUocHJlYy0tID4gMCl7CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICcwJykpCiAgICAgIHJldHVybiAxOwogICAgbGVuKys7CiAgfQogIC8qIGFkZCBsZW5ndGggb2YgYWx0ZXJuYXRlIHByZWZpeCAoYWRkZWQgbGF0ZXIpIHRvIGxlbiAqLwogIGlmKGZsYWdzICYgYWx0ZXJuYXRlX2ZsYWcgJiYgKGJhc2UgPT0gMTYgfHwgYmFzZSA9PSA4KSkKICAgIGxlbiArPSBiYXNlIC8gODsKICAvKiBwYWQgd2l0aCB6ZXJvcyAqLwogIGlmKGZsYWdzICYgemVyb19mbGFnKXsKICAgIHdpZHRoIC09IGxlbjsKICAgIGlmKG1pbnVzcCB8fCAoZmxhZ3MgJiBzcGFjZV9mbGFnKSB8fCAoZmxhZ3MgJiBwbHVzX2ZsYWcpKQogICAgICB3aWR0aC0tOwogICAgd2hpbGUod2lkdGgtLSA+IDApewogICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICcwJykpCglyZXR1cm4gMTsKICAgICAgbGVuKys7CiAgICB9CiAgfQogIC8qIGFkZCBhbHRlcm5hdGUgcHJlZml4ICovCiAgaWYoZmxhZ3MgJiBhbHRlcm5hdGVfZmxhZyAmJiAoYmFzZSA9PSAxNiB8fCBiYXNlID09IDgpKXsKICAgIGlmKGJhc2UgPT0gMTYpCiAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgcmVwWzEwXSArIDIzKSkgLyogWFhYICovCglyZXR1cm4gMTsKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJzAnKSkKICAgICAgcmV0dXJuIDE7CiAgfQogIC8qIGFkZCBzaWduICovCiAgaWYobWludXNwKXsKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJy0nKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICB9IGVsc2UgaWYoZmxhZ3MgJiBwbHVzX2ZsYWcpIHsKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJysnKSkKICAgICAgcmV0dXJuIDE7CiAgICBsZW4rKzsKICB9IGVsc2UgaWYoZmxhZ3MgJiBzcGFjZV9mbGFnKSB7CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICcgJykpCiAgICAgIHJldHVybiAxOwogICAgbGVuKys7CiAgfQogIGlmKGZsYWdzICYgbWludXNfZmxhZykKICAgIC8qIHN3YXAgYmVmb3JlIHBhZGRpbmcgd2l0aCBzcGFjZXMgKi8KICAgIGZvcihpID0gMDsgaSA8IGxlbiAvIDI7IGkrKyl7CiAgICAgIGNoYXIgYyA9IHN0YXRlLT5zWy1pLTFdOwogICAgICBzdGF0ZS0+c1staS0xXSA9IHN0YXRlLT5zWy1sZW4raV07CiAgICAgIHN0YXRlLT5zWy1sZW4raV0gPSBjOwogICAgfQogIHdpZHRoIC09IGxlbjsKICB3aGlsZSh3aWR0aC0tID4gMCl7CiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICAnICcpKQogICAgICByZXR1cm4gMTsKICAgIGxlbisrOwogIH0KICBpZighKGZsYWdzICYgbWludXNfZmxhZykpCiAgICAvKiBzd2FwIGFmdGVyIHBhZGRpbmcgd2l0aCBzcGFjZXMgKi8KICAgIGZvcihpID0gMDsgaSA8IGxlbiAvIDI7IGkrKyl7CiAgICAgIGNoYXIgYyA9IHN0YXRlLT5zWy1pLTFdOwogICAgICBzdGF0ZS0+c1staS0xXSA9IHN0YXRlLT5zWy1sZW4raV07CiAgICAgIHN0YXRlLT5zWy1sZW4raV0gPSBjOwogICAgfQoKICByZXR1cm4gMDsKfQoKc3RhdGljIGludAphcHBlbmRfc3RyaW5nIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLAoJICAgICAgIHVuc2lnbmVkIGNoYXIgKmFyZywKCSAgICAgICBpbnQgd2lkdGgsCgkgICAgICAgaW50IHByZWMsCgkgICAgICAgaW50IGZsYWdzKQp7CiAgaWYocHJlYyAhPSAtMSkKICAgIHdpZHRoIC09IHByZWM7CiAgZWxzZQogICAgd2lkdGggLT0gc3RybGVuKChjaGFyICopYXJnKTsKICBpZighKGZsYWdzICYgbWludXNfZmxhZykpCiAgICB3aGlsZSh3aWR0aC0tID4gMCkKICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKCXJldHVybiAxOwogIGlmIChwcmVjICE9IC0xKSB7CiAgICB3aGlsZSAoKmFyZyAmJiBwcmVjLS0pCiAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAqYXJnKyspKQoJcmV0dXJuIDE7CiAgfSBlbHNlIHsKICAgIHdoaWxlICgqYXJnKQogICAgICBpZiAoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgKmFyZysrKSkKCXJldHVybiAxOwogIH0KICBpZihmbGFncyAmIG1pbnVzX2ZsYWcpCiAgICB3aGlsZSh3aWR0aC0tID4gMCkKICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKCXJldHVybiAxOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmFwcGVuZF9jaGFyKHN0cnVjdCBzdGF0ZSAqc3RhdGUsCgkgICAgdW5zaWduZWQgY2hhciBhcmcsCgkgICAgaW50IHdpZHRoLAoJICAgIGludCBmbGFncykKewogIHdoaWxlKCEoZmxhZ3MgJiBtaW51c19mbGFnKSAmJiAtLXdpZHRoID4gMCkKICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCiAgICAgIHJldHVybiAxOwoKICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCBhcmcpKQogICAgcmV0dXJuIDE7CiAgd2hpbGUoKGZsYWdzICYgbWludXNfZmxhZykgJiYgLS13aWR0aCA+IDApCiAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQogICAgICByZXR1cm4gMTsKCiAgcmV0dXJuIDA7Cn0KCi8qCiAqIFRoaXMgY2FuJ3QgYmUgbWFkZSBpbnRvIGEgZnVuY3Rpb24uLi4KICovCgojZGVmaW5lIFBBUlNFX0lOVF9GT1JNQVQocmVzLCBhcmcsIHVuc2lnKSBcCmlmIChsb25nX2ZsYWcpIFwKICAgICByZXMgPSAodW5zaWcgbG9uZyl2YV9hcmcoYXJnLCB1bnNpZyBsb25nKTsgXAplbHNlIGlmIChzaG9ydF9mbGFnKSBcCiAgICAgcmVzID0gKHVuc2lnIHNob3J0KXZhX2FyZyhhcmcsIHVuc2lnIGludCk7IFwKZWxzZSBcCiAgICAgcmVzID0gKHVuc2lnIGludCl2YV9hcmcoYXJnLCB1bnNpZyBpbnQpCgovKgogKiB6eXhwcmludGYgLSByZXR1cm4gMCBvciAtMQogKi8KCnN0YXRpYyBpbnQKeHl6cHJpbnRmIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpjaGFyX2Zvcm1hdCwgdmFfbGlzdCBhcCkKewogIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZvcm1hdCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopY2hhcl9mb3JtYXQ7CiAgdW5zaWduZWQgY2hhciBjOwoKICB3aGlsZSgoYyA9ICpmb3JtYXQrKykpIHsKICAgIGlmIChjID09ICclJykgewogICAgICBpbnQgZmxhZ3MgICAgICA9IDA7CiAgICAgIGludCB3aWR0aCAgICAgID0gMDsKICAgICAgaW50IHByZWMgICAgICAgPSAtMTsKICAgICAgaW50IGxvbmdfZmxhZyAgPSAwOwogICAgICBpbnQgc2hvcnRfZmxhZyA9IDA7CgogICAgICAvKiBmbGFncyAqLwogICAgICB3aGlsZSgoYyA9ICpmb3JtYXQrKykpewoJaWYoYyA9PSAnLScpCgkgIGZsYWdzIHw9IG1pbnVzX2ZsYWc7CgllbHNlIGlmKGMgPT0gJysnKQoJICBmbGFncyB8PSBwbHVzX2ZsYWc7CgllbHNlIGlmKGMgPT0gJyAnKQoJICBmbGFncyB8PSBzcGFjZV9mbGFnOwoJZWxzZSBpZihjID09ICcjJykKCSAgZmxhZ3MgfD0gYWx0ZXJuYXRlX2ZsYWc7CgllbHNlIGlmKGMgPT0gJzAnKQoJICBmbGFncyB8PSB6ZXJvX2ZsYWc7CgllbHNlCgkgIGJyZWFrOwogICAgICB9CgogICAgICBpZigoZmxhZ3MgJiBzcGFjZV9mbGFnKSAmJiAoZmxhZ3MgJiBwbHVzX2ZsYWcpKQoJZmxhZ3MgXj0gc3BhY2VfZmxhZzsKCiAgICAgIGlmKChmbGFncyAmIG1pbnVzX2ZsYWcpICYmIChmbGFncyAmIHplcm9fZmxhZykpCglmbGFncyBePSB6ZXJvX2ZsYWc7CgogICAgICAvKiB3aWR0aCAqLwogICAgICBpZiAoaXNkaWdpdChjKSkKCWRvIHsKCSAgd2lkdGggPSB3aWR0aCAqIDEwICsgYyAtICcwJzsKCSAgYyA9ICpmb3JtYXQrKzsKCX0gd2hpbGUoaXNkaWdpdChjKSk7CiAgICAgIGVsc2UgaWYoYyA9PSAnKicpIHsKCXdpZHRoID0gdmFfYXJnKGFwLCBpbnQpOwoJYyA9ICpmb3JtYXQrKzsKICAgICAgfQoKICAgICAgLyogcHJlY2lzaW9uICovCiAgICAgIGlmIChjID09ICcuJykgewoJcHJlYyA9IDA7CgljID0gKmZvcm1hdCsrOwoJaWYgKGlzZGlnaXQoYykpCgkgIGRvIHsKCSAgICBwcmVjID0gcHJlYyAqIDEwICsgYyAtICcwJzsKCSAgICBjID0gKmZvcm1hdCsrOwoJICB9IHdoaWxlKGlzZGlnaXQoYykpOwoJZWxzZSBpZiAoYyA9PSAnKicpIHsKCSAgcHJlYyA9IHZhX2FyZyhhcCwgaW50KTsKCSAgYyA9ICpmb3JtYXQrKzsKCX0KICAgICAgfQoKICAgICAgLyogc2l6ZSAqLwoKICAgICAgaWYgKGMgPT0gJ2gnKSB7CglzaG9ydF9mbGFnID0gMTsKCWMgPSAqZm9ybWF0Kys7CiAgICAgIH0gZWxzZSBpZiAoYyA9PSAnbCcpIHsKCWxvbmdfZmxhZyA9IDE7CgljID0gKmZvcm1hdCsrOwogICAgICB9CgogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgY2FzZSAnYycgOgoJaWYoYXBwZW5kX2NoYXIoc3RhdGUsIHZhX2FyZyhhcCwgaW50KSwgd2lkdGgsIGZsYWdzKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIGNhc2UgJ3MnIDoKCWlmIChhcHBlbmRfc3RyaW5nKHN0YXRlLAoJCQkgIHZhX2FyZyhhcCwgdW5zaWduZWQgY2hhciopLAoJCQkgIHdpZHRoLAoJCQkgIHByZWMsCgkJCSAgZmxhZ3MpKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgY2FzZSAnZCcgOgogICAgICBjYXNlICdpJyA6IHsKCWxvbmcgYXJnOwoJdW5zaWduZWQgbG9uZyBudW07CglpbnQgbWludXNwID0gMDsKCglQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHNpZ25lZCk7CgoJaWYgKGFyZyA8IDApIHsKCSAgbWludXNwID0gMTsKCSAgbnVtID0gLWFyZzsKCX0gZWxzZQoJICBudW0gPSBhcmc7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBudW0sIDEwLCAiMDEyMzQ1Njc4OSIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgbWludXNwKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAndScgOiB7Cgl1bnNpZ25lZCBsb25nIGFyZzsKCglQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHVuc2lnbmVkKTsKCglpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMTAsICIwMTIzNDU2Nzg5IiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAnbycgOiB7Cgl1bnNpZ25lZCBsb25nIGFyZzsKCglQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHVuc2lnbmVkKTsKCglpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMDEwLCAiMDEyMzQ1NjciLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICd4JyA6IHsKCXVuc2lnbmVkIGxvbmcgYXJnOwoKCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOwoKCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAweDEwLCAiMDEyMzQ1Njc4OWFiY2RlZiIsCgkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCgkgIHJldHVybiAtMTsKCWJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgJ1gnIDp7Cgl1bnNpZ25lZCBsb25nIGFyZzsKCglQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHVuc2lnbmVkKTsKCglpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlBQkNERUYiLAoJCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgfQogICAgICBjYXNlICdwJyA6IHsKCXVuc2lnbmVkIGxvbmcgYXJnID0gKHVuc2lnbmVkIGxvbmcpdmFfYXJnKGFwLCB2b2lkKik7CgoJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDB4MTAsICIwMTIzNDU2Nzg5QUJDREVGIiwKCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAnbicgOiB7CglpbnQgKmFyZyA9IHZhX2FyZyhhcCwgaW50Kik7CgkqYXJnID0gc3RhdGUtPnMgLSBzdGF0ZS0+c3RyOwoJYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAnXDAnIDoKCSAgLS1mb3JtYXQ7CgkgIC8qIEZBTExUSFJPVUdIICovCiAgICAgIGNhc2UgJyUnIDoKCWlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIGMpKQoJICByZXR1cm4gLTE7CglicmVhazsKICAgICAgZGVmYXVsdCA6CglpZiAoICAgKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnJScpCgkgICAgfHwgKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCBjKSkKCSAgcmV0dXJuIC0xOwoJYnJlYWs7CiAgICAgIH0KICAgIH0gZWxzZQogICAgICBpZiAoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgYykpCglyZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CgojaWZuZGVmIEhBVkVfU05QUklOVEYKaW50CnNucHJpbnRmIChjaGFyICpzdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCnsKICB2YV9saXN0IGFyZ3M7CiAgaW50IHJldDsKCiAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKICByZXQgPSB2c25wcmludGYgKHN0ciwgc3osIGZvcm1hdCwgYXJncyk7CgojaWZkZWYgUEFSQU5PSUEKICB7CiAgICBpbnQgcmV0MjsKICAgIGNoYXIgKnRtcDsKCiAgICB0bXAgPSBtYWxsb2MgKHN6KTsKICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgYWJvcnQgKCk7CgogICAgcmV0MiA9IHZzcHJpbnRmICh0bXAsIGZvcm1hdCwgYXJncyk7CiAgICBpZiAocmV0ICE9IHJldDIgfHwgc3RyY21wKHN0ciwgdG1wKSkKICAgICAgYWJvcnQgKCk7CiAgICBmcmVlICh0bXApOwogIH0KI2VuZGlmCgogIHZhX2VuZChhcmdzKTsKICByZXR1cm4gcmV0Owp9CiNlbmRpZgoKI2lmIDAKI2lmbmRlZiBIQVZFX0FTUFJJTlRGCmludAphc3ByaW50ZiAoY2hhciAqKnJldCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCnsKICB2YV9saXN0IGFyZ3M7CiAgaW50IHZhbDsKCiAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKICB2YWwgPSB2YXNwcmludGYgKHJldCwgZm9ybWF0LCBhcmdzKTsKCiNpZmRlZiBQQVJBTk9JQQogIHsKICAgIGludCByZXQyOwogICAgY2hhciAqdG1wOwogICAgdG1wID0gbWFsbG9jICh2YWwgKyAxKTsKICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgYWJvcnQgKCk7CgogICAgcmV0MiA9IHZzcHJpbnRmICh0bXAsIGZvcm1hdCwgYXJncyk7CiAgICBpZiAodmFsICE9IHJldDIgfHwgc3RyY21wKCpyZXQsIHRtcCkpCiAgICAgIGFib3J0ICgpOwogICAgZnJlZSAodG1wKTsKICB9CiNlbmRpZgoKICB2YV9lbmQoYXJncyk7CiAgcmV0dXJuIHZhbDsKfQojZW5kaWYKCiNpZm5kZWYgSEFWRV9BU05QUklOVEYKaW50CmFzbnByaW50ZiAoY2hhciAqKnJldCwgc2l6ZV90IG1heF9zeiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCnsKICB2YV9saXN0IGFyZ3M7CiAgaW50IHZhbDsKCiAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKICB2YWwgPSB2YXNucHJpbnRmIChyZXQsIG1heF9zeiwgZm9ybWF0LCBhcmdzKTsKCiNpZmRlZiBQQVJBTk9JQQogIHsKICAgIGludCByZXQyOwogICAgY2hhciAqdG1wOwogICAgdG1wID0gbWFsbG9jICh2YWwgKyAxKTsKICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgYWJvcnQgKCk7CgogICAgcmV0MiA9IHZzcHJpbnRmICh0bXAsIGZvcm1hdCwgYXJncyk7CiAgICBpZiAodmFsICE9IHJldDIgfHwgc3RyY21wKCpyZXQsIHRtcCkpCiAgICAgIGFib3J0ICgpOwogICAgZnJlZSAodG1wKTsKICB9CiNlbmRpZgoKICB2YV9lbmQoYXJncyk7CiAgcmV0dXJuIHZhbDsKfQojZW5kaWYKCiNpZm5kZWYgSEFWRV9WQVNQUklOVEYKaW50CnZhc3ByaW50ZiAoY2hhciAqKnJldCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCnsKICByZXR1cm4gdmFzbnByaW50ZiAocmV0LCAwLCBmb3JtYXQsIGFyZ3MpOwp9CiNlbmRpZgoKCiNpZm5kZWYgSEFWRV9WQVNOUFJJTlRGCmludAp2YXNucHJpbnRmIChjaGFyICoqcmV0LCBzaXplX3QgbWF4X3N6LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKewogIGludCBzdDsKICBzaXplX3QgbGVuOwogIHN0cnVjdCBzdGF0ZSBzdGF0ZTsKCiAgc3RhdGUubWF4X3N6ID0gbWF4X3N6OwogIHN0YXRlLnN6ICAgICA9IDE7CiAgc3RhdGUuc3RyICAgID0gbWFsbG9jKHN0YXRlLnN6KTsKICBpZiAoc3RhdGUuc3RyID09IE5VTEwpIHsKICAgICpyZXQgPSBOVUxMOwogICAgcmV0dXJuIC0xOwogIH0KICBzdGF0ZS5zID0gc3RhdGUuc3RyOwogIHN0YXRlLnRoZWVuZCA9IHN0YXRlLnMgKyBzdGF0ZS5zeiAtIDE7CiAgc3RhdGUuYXBwZW5kX2NoYXIgPSBhc19hcHBlbmRfY2hhcjsKICBzdGF0ZS5yZXNlcnZlICAgICA9IGFzX3Jlc2VydmU7CgogIHN0ID0geHl6cHJpbnRmICgmc3RhdGUsIGZvcm1hdCwgYXJncyk7CiAgaWYgKHN0KSB7CiAgICBmcmVlIChzdGF0ZS5zdHIpOwogICAgKnJldCA9IE5VTEw7CiAgICByZXR1cm4gLTE7CiAgfSBlbHNlIHsKICAgIGNoYXIgKnRtcDsKCiAgICAqc3RhdGUucyA9ICdcMCc7CiAgICBsZW4gPSBzdGF0ZS5zIC0gc3RhdGUuc3RyOwogICAgdG1wID0gcmVhbGxvYyAoc3RhdGUuc3RyLCBsZW4rMSk7CiAgICBpZiAodG1wID09IE5VTEwpIHsKICAgICAgZnJlZSAoc3RhdGUuc3RyKTsKICAgICAgKnJldCA9IE5VTEw7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgICpyZXQgPSB0bXA7CiAgICByZXR1cm4gbGVuOwogIH0KfQojZW5kaWYKI2VuZGlmCgojaWZuZGVmIEhBVkVfVlNOUFJJTlRGCmludAp2c25wcmludGYgKGNoYXIgKnN0ciwgc2l6ZV90IHN6LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKewogIHN0cnVjdCBzdGF0ZSBzdGF0ZTsKICBpbnQgcmV0OwogIHVuc2lnbmVkIGNoYXIgKnVzdHIgPSAodW5zaWduZWQgY2hhciAqKXN0cjsKCiAgc3RhdGUubWF4X3N6ID0gMDsKICBzdGF0ZS5zeiAgICAgPSBzejsKICBzdGF0ZS5zdHIgICAgPSB1c3RyOwogIHN0YXRlLnMgICAgICA9IHVzdHI7CiAgc3RhdGUudGhlZW5kID0gdXN0ciArIHN6IC0gMTsKICBzdGF0ZS5hcHBlbmRfY2hhciA9IHNuX2FwcGVuZF9jaGFyOwogIHN0YXRlLnJlc2VydmUgICAgID0gc25fcmVzZXJ2ZTsKCiAgcmV0ID0geHl6cHJpbnRmICgmc3RhdGUsIGZvcm1hdCwgYXJncyk7CiAgKnN0YXRlLnMgPSAnXDAnOwogIGlmIChyZXQpCiAgICByZXR1cm4gc3o7CiAgZWxzZQogICAgcmV0dXJuIHN0YXRlLnMgLSBzdGF0ZS5zdHI7Cn0KI2VuZGlmCgo=