I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAiZHAuaCIKCiNkZWZpbmUgREVCVUcgMAojZGVmaW5lIERFQlVHMiAwCiNkZWZpbmUgWFhYWFhYWCAgICAwCiNkZWZpbmUgVVNFX1BFTkFMVFlfRVggIDEKCnN0YXRpYyBpbnQgbG9jYWxzdG9wOyAvLyAwNjA5MTAKCiNpZiAxCnN0YXRpYyB2b2lkIG1hdGNoX2NhbGMoIGZsb2F0ICptYXRjaCwgY2hhciAqKnMxLCBjaGFyICoqczIsIGludCBpMSwgaW50IGxndGgyICkgCnsKCWNoYXIgKnNlcTIgPSBzMlswXTsKCWludCAqaW50cHRyOwoKCWludHB0ciA9IGFtaW5vX2Rpc1soaW50KXMxWzBdW2kxXV07Cgl3aGlsZSggbGd0aDItLSApCgkJKm1hdGNoKysgPSBpbnRwdHJbKGludCkqc2VxMisrXTsKfQojZWxzZQpzdGF0aWMgdm9pZCBtYXRjaF9jYWxjKCBmbG9hdCAqbWF0Y2gsIGNoYXIgKipzMSwgY2hhciAqKnMyLCBpbnQgaTEsIGludCBsZ3RoMiApCnsKCWludCBqOwoKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCW1hdGNoW2pdID0gYW1pbm9fZGlzWygqczEpW2kxXV1bKCpzMilbal1dOwp9CiNlbmRpZgoKI2lmIDAKc3RhdGljIHZvaWQgbWF0Y2hfY2FsY19iayggZmxvYXQgKm1hdGNoLCBmbG9hdCAqKmNwbXgxLCBmbG9hdCAqKmNwbXgyLCBpbnQgaTEsIGludCBsZ3RoMiwgZmxvYXQgKipmbG9hdHdvcmssIGludCAqKmludHdvcmssIGludCBpbml0aWFsaXplICkKewoJaW50IGosIGssIGw7CglmbG9hdCBzY2FyclsyNl07CglmbG9hdCAqKmNwbXhwZCA9IGZsb2F0d29yazsKCWludCAqKmNwbXhwZG4gPSBpbnR3b3JrOwoJaW50IGNvdW50ID0gMDsKCglpZiggaW5pdGlhbGl6ZSApCgl7CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQljb3VudCA9IDA7CgkJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCQl7CgkJCQlpZiggY3BteDJbbF1bal0gKQoJCQkJewoJCQkJCWNwbXhwZFtjb3VudF1bal0gPSBjcG14MltsXVtqXTsKCQkJCQljcG14cGRuW2NvdW50XVtqXSA9IGw7CgkJCQkJY291bnQrKzsKCQkJCX0KCQkJfQoJCQljcG14cGRuW2NvdW50XVtqXSA9IC0xOwoJCX0KCX0KCglmb3IoIGw9MDsgbDwyNjsgbCsrICkKCXsKCQlzY2FycltsXSA9IDAuMDsKCQlmb3IoIGs9MDsgazwyNjsgaysrICkKCQkJc2NhcnJbbF0gKz0gbl9kaXNba11bbF0gKiBjcG14MVtrXVtpMV07Cgl9CiNpZiAwIC8qIKSzpOyk8rvIpKakyKStpM9mbG9hdHdvcmukzqWipe2lsaG8pcik8rXVpMukuaTrICovCgl7CgkJZmxvYXQgKmZwdCwgKipmcHRwdCwgKmZwdDI7CgkJaW50ICppcHQsICoqaXB0cHQ7CgkJZnB0MiA9IG1hdGNoOwoJCWlwdHB0ID0gY3BteHBkbjsKCQlmcHRwdCA9IGNwbXhwZDsKCQl3aGlsZSggbGd0aDItLSApCgkJewoJCQkqZnB0MiA9IDAuMDsKCQkJaXB0PSppcHRwdCxmcHQ9KmZwdHB0OwoJCQl3aGlsZSggKmlwdCA+IC0xICkKCQkJCSpmcHQyICs9IHNjYXJyWyppcHQrK10gKiAqZnB0Kys7CgkJCWZwdDIrKyxpcHRwdCsrLGZwdHB0Kys7CgkJfSAKCX0KI2Vsc2UKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCW1hdGNoW2pdID0gMC4wOwoJCWZvciggaz0wOyBjcG14cGRuW2tdW2pdPi0xOyBrKysgKQoJCQltYXRjaFtqXSArPSBzY2FycltjcG14cGRuW2tdW2pdXSAqIGNwbXhwZFtrXVtqXTsKCX0gCiNlbmRpZgp9CiNlbmRpZgoKc3RhdGljIGZsb2F0IEx0cmFja2luZyggZmxvYXQgKmxhc3Rob3Jpem9udGFsdywgZmxvYXQgKmxhc3R2ZXJ0aWNhbHcsIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAqKmlqcCwgaW50ICpvZmYxcHQsIGludCAqb2ZmMnB0LCBpbnQgZW5kaSwgaW50IGVuZGogKQp7CglpbnQgaSwgaiwgbCwgaWluLCBqaW4sIGxndGgxLCBsZ3RoMiwgaywgbGltazsKCWludCBpZmk9MCwgamZpPTA7IC8vIGJ5IEQuTWF0aG9nLCBhIGd1ZXNzCgljaGFyIGdhcFtdID0gIi0iOwoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7CgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCWZwcmludGYoIHN0ZGVyciwgImxhc3R2ZXJ0aWNhbHdbJWRdID0gJWZcbiIsIGksIGxhc3R2ZXJ0aWNhbHdbaV0gKTsKCX0KI2VuZGlmCiAKICAgIGZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApIAogICAgewogICAgICAgIGlqcFtpXVswXSA9IGxvY2Fsc3RvcDsKICAgIH0KICAgIGZvciggaj0wOyBqPGxndGgyKzE7IGorKyApIAogICAgewogICAgICAgIGlqcFswXVtqXSA9IGxvY2Fsc3RvcDsKICAgIH0KCgltc2VxMVswXSArPSBsZ3RoMStsZ3RoMjsKCSptc2VxMVswXSA9IDA7Cgltc2VxMlswXSArPSBsZ3RoMStsZ3RoMjsKCSptc2VxMlswXSA9IDA7CglpaW4gPSBlbmRpOyBqaW4gPSBlbmRqOwoJbGltayA9IGxndGgxK2xndGgyOwoJZm9yKCBrPTA7IGs8PWxpbWs7IGsrKyApIAoJewoJCWlmKCBpanBbaWluXVtqaW5dIDwgMCApIAoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbitpanBbaWluXVtqaW5dOwoJCX0KCQllbHNlIGlmKCBpanBbaWluXVtqaW5dID4gMCApCgkJewoJCQlpZmkgPSBpaW4taWpwW2lpbl1bamluXTsgamZpID0gamluLTE7CgkJfQoJCWVsc2UKCQl7CgkJCWlmaSA9IGlpbi0xOyBqZmkgPSBqaW4tMTsKCQl9CgkJbCA9IGlpbiAtIGlmaTsKCQl3aGlsZSggLS1sICkgCgkJewoJCQkqLS1tc2VxMVswXSA9IHNlcTFbMF1baWZpK2xdOwoJCQkqLS1tc2VxMlswXSA9ICpnYXA7CgkJCWsrKzsKCQl9CgkJbD0gamluIC0gamZpOwoJCXdoaWxlKCAtLWwgKQoJCXsKCQkJKi0tbXNlcTFbMF0gPSAqZ2FwOwoJCQkqLS1tc2VxMlswXSA9IHNlcTJbMF1bamZpK2xdOwoJCQlrKys7CgkJfQoKCQlpZiggaWluIDw9IDAgfHwgamluIDw9IDAgKSBicmVhazsKCQkqLS1tc2VxMVswXSA9IHNlcTFbMF1baWZpXTsKCQkqLS1tc2VxMlswXSA9IHNlcTJbMF1bamZpXTsKCQlpZiggaWpwW2lmaV1bamZpXSA9PSBsb2NhbHN0b3AgKSBicmVhazsKCQlrKys7CgkJaWluID0gaWZpOyBqaW4gPSBqZmk7Cgl9CglpZiggaWZpID09IC0xICkgKm9mZjFwdCA9IDA7IGVsc2UgKm9mZjFwdCA9IGlmaTsKCWlmKCBqZmkgPT0gLTEgKSAqb2ZmMnB0ID0gMDsgZWxzZSAqb2ZmMnB0ID0gamZpOwoKLy8JZnByaW50Ziggc3RkZXJyLCAiaWZuID0gJWQsIGpmbiA9ICVkXG4iLCBpZmksIGpmaSApOwoKCglyZXR1cm4oIDAuMCApOwp9CgoKZmxvYXQgTF9fYWxpZ24xMSggY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBpbnQgYWxsb2NsZW4sIGludCAqb2ZmMXB0LCBpbnQgKm9mZjJwdCApCi8qIHNjb3JlIG5vIGtlaXNhbiBubyBzYWkgbW90b2thcmFhcnUgZ2FwIG5vIGF0dWthaSBuaSBtb25kYWkgZ2EgYXJ1ICovCnsKLy8JaW50IGs7CglyZWdpc3RlciBpbnQgaSwgajsKCWludCBsYXN0aSwgbGFzdGo7ICAgICAgICAgICAgICAgICAgICAgIC8qIG91dGdhcCA9PSAwIC0+IGxndGgxLCBvdXRnYXAgPT0gMSAtPiBsZ3RoMSsxICovCglpbnQgbGd0aDEsIGxndGgyOwoJaW50IHJlc3VsdGxlbjsKCWZsb2F0IHdtID0gMC4wOyAgIC8qIGludCA/Pz8/Pz8gKi8KCWZsb2F0IGc7CglmbG9hdCAqY3VycmVudHcsICpwcmV2aW91c3c7CiNpZiAxCglmbG9hdCAqd3RtcDsKCWludCAqaWpwcHQ7CglmbG9hdCAqbWpwdCwgKnByZXB0LCAqY3VycHQ7CglpbnQgKm1wanB0OwojZW5kaWYKCXN0YXRpYyBmbG9hdCBtaSwgKm07CglzdGF0aWMgaW50ICoqaWpwOwoJc3RhdGljIGludCBtcGksICptcDsKCXN0YXRpYyBmbG9hdCAqdzEsICp3MjsKCXN0YXRpYyBmbG9hdCAqbWF0Y2g7CglzdGF0aWMgZmxvYXQgKmluaXR2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCXN0YXRpYyBmbG9hdCAqbGFzdHZlcnRpY2FsdzsgICAgLyoga3VmdXUgc3VyZWJhIGlyYW5haSAqLwoJc3RhdGljIGNoYXIgKiptc2VxMTsKCXN0YXRpYyBjaGFyICoqbXNlcTI7CglzdGF0aWMgY2hhciAqKm1zZXE7Ci8vCXN0YXRpYyBpbnQgKippbnR3b3JrOwovLwlzdGF0aWMgZmxvYXQgKipmbG9hdHdvcms7CglzdGF0aWMgaW50IG9ybGd0aDEgPSAwLCBvcmxndGgyID0gMDsKCWZsb2F0IG1heHdtOwoJaW50IGVuZGFsaSA9IDAsIGVuZGFsaiA9IDA7IC8vIGJ5IEQuTWF0aG9nLCBhIGd1ZXNzCi8vCWludCBlbmRhbGksIGVuZGFsajsKCWZsb2F0IGxvY2FsdGhyID0gLW9mZnNldDsKCWZsb2F0IGxvY2FsdGhyMiA9IC1vZmZzZXQ7Ci8vCWZsb2F0IGxvY2FsdGhyID0gMTAwOwovLwlmbG9hdCBsb2NhbHRocjIgPSAxMDA7CglmbG9hdCBmcGVuYWx0eSA9IChmbG9hdClwZW5hbHR5OwoJZmxvYXQgZnBlbmFsdHlfZXggPSAoZmxvYXQpcGVuYWx0eV9leDsKCgoJaWYoIG9ybGd0aDEgPT0gMCApCgl7CgkJbXNlcTEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIDAgKTsKCQltc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggbmpvYiwgMCApOwoJfQoKCglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKCglpZiggbGd0aDEgPiBvcmxndGgxIHx8IGxndGgyID4gb3JsZ3RoMiApCgl7CgkJaW50IGxsMSwgbGwyOwoKCQlpZiggb3JsZ3RoMSA+IDAgJiYgb3JsZ3RoMiA+IDAgKQoJCXsKCQkJRnJlZUZsb2F0VmVjKCB3MSApOwoJCQlGcmVlRmxvYXRWZWMoIHcyICk7CgkJCUZyZWVGbG9hdFZlYyggbWF0Y2ggKTsKCQkJRnJlZUZsb2F0VmVjKCBpbml0dmVydGljYWx3ICk7CgkJCUZyZWVGbG9hdFZlYyggbGFzdHZlcnRpY2FsdyApOwoKCQkJRnJlZUZsb2F0VmVjKCBtICk7CgkJCUZyZWVJbnRWZWMoIG1wICk7CgoJCQlGcmVlQ2hhck10eCggbXNlcSApOwoKCgovLwkJCUZyZWVGbG9hdE10eCggZmxvYXR3b3JrICk7Ci8vCQkJRnJlZUludE10eCggaW50d29yayApOwoJCX0KCgkJbGwxID0gTUFYKCAoaW50KSgxLjMqbGd0aDEpLCBvcmxndGgxICkgKyAxMDA7CgkJbGwyID0gTUFYKCAoaW50KSgxLjMqbGd0aDIpLCBvcmxndGgyICkgKyAxMDA7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcbnRyeWluZyB0byBhbGxvY2F0ZSAoJWQrJWQpeG4gbWF0cmljZXMgLi4uICIsIGxsMSwgbGwyICk7CiNlbmRpZgoKCQl3MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJdzIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1hdGNoID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCgkJaW5pdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJbGFzdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgoJCW0gPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1wID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CgoJCW1zZXEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIGxsMStsbDIgKTsKCgovLwkJZmxvYXR3b3JrID0gQWxsb2NhdGVGbG9hdE10eCggMjYsIE1BWCggbGwxLCBsbDIgKSsyICk7IAovLwkJaW50d29yayA9IEFsbG9jYXRlSW50TXR4KCAyNiwgTUFYKCBsbDEsIGxsMiApKzIgKTsgCgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcbiIgKTsKI2VuZGlmCgoJCW9ybGd0aDEgPSBsbDEgLSAxMDA7CgkJb3JsZ3RoMiA9IGxsMiAtIDEwMDsKCX0KCgoJbXNlcTFbMF0gPSBtc2VxWzBdOwoJbXNlcTJbMF0gPSBtc2VxWzFdOwoKCglpZiggb3JsZ3RoMSA+IGNvbW1vbkFsbG9jMSB8fCBvcmxndGgyID4gY29tbW9uQWxsb2MyICkKCXsKCQlpbnQgbGwxLCBsbDI7CgoJCWlmKCBjb21tb25BbGxvYzEgJiYgY29tbW9uQWxsb2MyICkKCQl7CgkJCUZyZWVJbnRNdHgoIGNvbW1vbklQICk7CgkJfQoKCQlsbDEgPSBNQVgoIG9ybGd0aDEsIGNvbW1vbkFsbG9jMSApOwoJCWxsMiA9IE1BWCggb3JsZ3RoMiwgY29tbW9uQWxsb2MyICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcblxudHJ5aW5nIHRvIGFsbG9jYXRlICVkeCVkIG1hdHJpY2VzIC4uLiAiLCBsbDErMSwgbGwyKzEgKTsKI2VuZGlmCgoJCWNvbW1vbklQID0gQWxsb2NhdGVJbnRNdHgoIGxsMSsxMCwgbGwyKzEwICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcblxuIiApOwojZW5kaWYKCgkJY29tbW9uQWxsb2MxID0gbGwxOwoJCWNvbW1vbkFsbG9jMiA9IGxsMjsKCX0KCWlqcCA9IGNvbW1vbklQOwoKCiNpZiAwCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgCgkJZnByaW50Ziggc3RkZXJyLCAib2djcDFbJWRdPSVmXG4iLCBpLCBvZ2NwMVtpXSApOwojZW5kaWYKCgljdXJyZW50dyA9IHcxOwoJcHJldmlvdXN3ID0gdzI7CgoJbWF0Y2hfY2FsYyggaW5pdHZlcnRpY2Fsdywgc2VxMiwgc2VxMSwgMCwgbGd0aDEgKTsKCgltYXRjaF9jYWxjKCBjdXJyZW50dywgc2VxMSwgc2VxMiwgMCwgbGd0aDIgKTsKCgoJbGFzdGkgPSBsZ3RoMisxOwoJZm9yKCBqPTE7IGo8bGFzdGk7ICsraiApIAoJewoJCW1bal0gPSBjdXJyZW50d1tqLTFdOyBtcFtqXSA9IDA7CiNpZiAwCgkJaWYoIG1bal0gPCBsb2NhbHRociApIG1bal0gPSBsb2NhbHRocjI7CiNlbmRpZgoJfQoKCWxhc3R2ZXJ0aWNhbHdbMF0gPSBjdXJyZW50d1tsZ3RoMi0xXTsKCglsYXN0aSA9IGxndGgxKzE7CgojaWYgMApmcHJpbnRmKCBzdGRlcnIsICJjdXJyZW50dyA9IFxuIiApOwpmb3IoIGk9MDsgaTxsZ3RoMSsxOyBpKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBjdXJyZW50d1tpXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJpbml0dmVydGljYWx3ID0gXG4iICk7CmZvciggaT0wOyBpPGxndGgyKzE7IGkrKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGluaXR2ZXJ0aWNhbHdbaV0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCiNpZiBERUJVRzIKCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZnByaW50Ziggc3RkZXJyLCAiICAgICAgICIgKTsKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCWZwcmludGYoIHN0ZGVyciwgIiVjICAgICAiLCBzZXEyWzBdW2pdICk7CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgoJbG9jYWxzdG9wID0gbGd0aDErbGd0aDIrMTsKCW1heHdtID0gLTk5OTk5OTk5OS45OwojaWYgREVCVUcyCglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIiVjICAgIiwgc2VxMVswXVswXSApOwoKCWZvciggaj0wOyBqPGxndGgyKzE7IGorKyApCgkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYgIiwgY3VycmVudHdbal0gKTsKCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKCglmb3IoIGk9MTsgaTxsYXN0aTsgaSsrICkKCXsKCQl3dG1wID0gcHJldmlvdXN3OyAKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgoJCXByZXZpb3Vzd1swXSA9IGluaXR2ZXJ0aWNhbHdbaS0xXTsKCgkJbWF0Y2hfY2FsYyggY3VycmVudHcsIHNlcTEsIHNlcTIsIGksIGxndGgyICk7CiNpZiBERUJVRzIKCQlmcHJpbnRmKCBzdGRlcnIsICIlYyAgICIsIHNlcTFbMF1baV0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZiAiLCBjdXJyZW50d1swXSApOwojZW5kaWYKCiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJpPSVkXG4iLCBpICk7CmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaj0wOyBqPGxndGgyOyBqKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBjdXJyZW50d1tqXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKI2lmIFhYWFhYWFgKZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImk9JWRcbiIsIGkgKTsKZnByaW50Ziggc3RkZXJyLCAiY3VycmVudHcgPSBcbiIgKTsKZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGN1cnJlbnR3W2pdICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiNlbmRpZgoJCWN1cnJlbnR3WzBdID0gaW5pdHZlcnRpY2Fsd1tpXTsKCgkJbWkgPSBwcmV2aW91c3dbMF07IG1waSA9IDA7CgojaWYgMAoJCWlmKCBtaSA8IGxvY2FsdGhyICkgbWkgPSBsb2NhbHRocjI7CiNlbmRpZgoKCQlpanBwdCA9IGlqcFtpXSArIDE7CgkJbWpwdCA9IG0gKyAxOwoJCXByZXB0ID0gcHJldmlvdXN3OwoJCWN1cnB0ID0gY3VycmVudHcgKyAxOwoJCW1wanB0ID0gbXAgKyAxOwoJCWxhc3RqID0gbGd0aDIrMTsKCQlmb3IoIGo9MTsgajxsYXN0ajsgaisrICkKCQl7CgkJCXdtID0gKnByZXB0OwoJCQkqaWpwcHQgPSAwOwoKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYtPiIsIHdtICk7CiNlbmRpZgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgoJCQlpZiggKGc9bWkrZnBlbmFsdHkpID4gd20gKQoJCQl7CgkJCQl3bSA9IGc7CgkJCQkqaWpwcHQgPSAtKCBqIC0gbXBpICk7CgkJCX0KCQkJaWYoICpwcmVwdCA+IG1pICkKCQkJewoJCQkJbWkgPSAqcHJlcHQ7CgkJCQltcGkgPSBqLTE7CgkJCX0KCiNpZiBVU0VfUEVOQUxUWV9FWAoJCQltaSArPSBmcGVuYWx0eV9leDsKI2VuZGlmCgojaWYgMCAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGY/IiwgZyApOwojZW5kaWYKCQkJaWYoIChnPSptanB0K2ZwZW5hbHR5KSA+IHdtICkKCQkJewoJCQkJd20gPSBnOwoJCQkJKmlqcHB0ID0gKyggaSAtICptcGpwdCApOwoJCQl9CgkJCWlmKCAqcHJlcHQgPiAqbWpwdCApCgkJCXsKCQkJCSptanB0ID0gKnByZXB0OwoJCQkJKm1wanB0ID0gaS0xOwoJCQl9CiNpZiBVU0VfUEVOQUxUWV9FWAoJCQkqbWpwdCArPSBmcGVuYWx0eV9leDsKI2VuZGlmCgoJCQlpZiggbWF4d20gPCB3bSApCgkJCXsKCQkJCW1heHdtID0gd207CgkJCQllbmRhbGkgPSBpOwoJCQkJZW5kYWxqID0gajsKCQkJfQojaWYgMQoJCQlpZiggd20gPCBsb2NhbHRociApCgkJCXsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAic3RvcCBpPSVkLCBqPSVkLCBjdXJwdD0lZlxuIiwgaSwgaiwgKmN1cnB0ICk7CgkJCQkqaWpwcHQgPSBsb2NhbHN0b3A7CgkJCQl3bSA9IGxvY2FsdGhyMjsKCQkJfQojZW5kaWYKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYgIiwgKmN1cnB0ICk7CiNlbmRpZgojaWYgREVCVUcyCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmICIsIHdtICk7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiJWMtJWMgKmlqcHB0ID0gJWQsIGxvY2Fsc3RvcCA9ICVkXG4iLCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdLCAqaWpwcHQsIGxvY2Fsc3RvcCApOwojZW5kaWYKCgkJCSpjdXJwdCsrICs9IHdtOwoJCQlpanBwdCsrOwoJCQltanB0Kys7CgkJCXByZXB0Kys7CgkJCW1wanB0Kys7CgkJfQojaWYgREVCVUcyCgkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiNlbmRpZgoKCQlsYXN0dmVydGljYWx3W2ldID0gY3VycmVudHdbbGd0aDItMV07Cgl9CgoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgIm1heHdtID0gJWZcbiIsIG1heHdtICk7CglmcHJpbnRmKCBzdGRlcnIsICJlbmRhbGkgPSAlZFxuIiwgZW5kYWxpICk7CglmcHJpbnRmKCBzdGRlcnIsICJlbmRhbGogPSAlZFxuIiwgZW5kYWxqICk7CiNlbmRpZgoKCWlmKCBpanBbZW5kYWxpXVtlbmRhbGpdID09IGxvY2Fsc3RvcCApCgl7CgkJc3RyY3B5KCBzZXExWzBdLCAiIiApOwoJCXN0cmNweSggc2VxMlswXSwgIiIgKTsKCQkqb2ZmMXB0ID0gKm9mZjJwdCA9IDA7CgkJcmV0dXJuKCAwLjAgKTsKCX0KCQkKCUx0cmFja2luZyggY3VycmVudHcsIGxhc3R2ZXJ0aWNhbHcsIHNlcTEsIHNlcTIsIG1zZXExLCBtc2VxMiwgaWpwLCBvZmYxcHQsIG9mZjJwdCwgZW5kYWxpLCBlbmRhbGogKTsKCgoJcmVzdWx0bGVuID0gc3RybGVuKCBtc2VxMVswXSApOwoJaWYoIGFsbG9jbGVuIDwgcmVzdWx0bGVuIHx8IHJlc3VsdGxlbiA+IE4gKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImFsbG9jbGVuPSVkLCByZXN1bHRsZW49JWQsIE49JWRcbiIsIGFsbG9jbGVuLCByZXN1bHRsZW4sIE4gKTsKCQlFcnJvckV4aXQoICJMRU5HVEggT1ZFUiFcbiIgKTsKCX0KCgoJc3RyY3B5KCBzZXExWzBdLCBtc2VxMVswXSApOwoJc3RyY3B5KCBzZXEyWzBdLCBtc2VxMlswXSApOwoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgIndtPSVmXG4iLCB3bSApOwoJZnByaW50Ziggc3RkZXJyLCAiPlxuJXNcbiIsIG1zZXExWzBdICk7CglmcHJpbnRmKCBzdGRlcnIsICI+XG4lc1xuIiwgbXNlcTJbMF0gKTsKCglmcHJpbnRmKCBzdGRlcnIsICJtYXh3bSA9ICVmXG4iLCBtYXh3bSApOwoJZnByaW50Ziggc3RkZXJyLCAiICAgd20gPSAlZlxuIiwgICAgd20gKTsKI2VuZGlmCgoJcmV0dXJuKCBtYXh3bSApOwp9Cgo=