I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAiZHAuaCIKCiNkZWZpbmUgTUFDSElHQUkgMAojZGVmaW5lIE9VVEdBUDBUUlkgMQojZGVmaW5lIERFQlVHIDAKI2RlZmluZSBYWFhYWFhYICAgIDAKI2RlZmluZSBVU0VfUEVOQUxUWV9FWCAgMAojZGVmaW5lIEZBU1RNQVRDSENBTEMgMQoKCnN0YXRpYyBmbG9hdCAqKmltcG10eCA9IE5VTEw7CiNpZiAxIC8vIHRkaXRlcmF0aW9uIHRvIG5haXZlUnNjb3JlX2ltcCBkZSB0c3VrYXdhcmVydS4KZmxvYXQgaW1wX21hdGNoX291dF9zY1IoIGludCBpMSwgaW50IGoxICkKewovLwlmcHJpbnRmKCBzdGRlcnIsICJpbXArbWF0Y2ggPSAlZlxuIiwgaW1wbXR4W2kxXVtqMV0gKiBmYXN0YXRocmVzaG9sZCApOwovLwlmcHJpbnRmKCBzdGRlcnIsICJ2YWwgPSAlZlxuIiwgaW1wbXR4W2kxXVtqMV0gKTsKCXJldHVybiggaW1wbXR4W2kxXVtqMV0gKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGltcF9tYXRjaF9vdXRfdmVhZFIoIGZsb2F0ICppbXAsIGludCBpMSwgaW50IGxndGgyICkKewojaWYgRkFTVE1BVENIQ0FMQyAKCWZsb2F0ICpwdCA9IGltcG10eFtpMV07Cgl3aGlsZSggbGd0aDItLSApCgkJKmltcCsrICs9ICpwdCsrOwojZWxzZQoJaW50IGo7CglmbG9hdCAqcHQgPSBpbXBtdHhbaTFdOwoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJKmltcCsrICs9IHB0W2pdOwojZW5kaWYKfQpzdGF0aWMgdm9pZCBpbXBfbWF0Y2hfb3V0X3ZlYWRfdGF0ZVIoIGZsb2F0ICppbXAsIGludCBqMSwgaW50IGxndGgxICkKewoJaW50IGk7Cglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCQkqaW1wKysgKz0gaW1wbXR4W2ldW2oxXTsKfQoKI2lmIDEgLy8gdGJmYXN0LmMga2FyYSB5b2JhcmVydS4Kdm9pZCBpbXBfbWF0Y2hfaW5pdF9zdHJpY3RSKCBmbG9hdCAqaW1wLCBpbnQgY2x1czEsIGludCBjbHVzMiwgaW50IGxndGgxLCBpbnQgbGd0aDIsIGNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgZG91YmxlICplZmYxLCBkb3VibGUgKmVmZjIsIExvY2FsSG9tICoqKmxvY2FsaG9tLCBpbnQgZm9yc2NvcmUgKQp7CglpbnQgaSwgaiwgazEsIGsyLCB0bXBpbnQsIHN0YXJ0MSwgc3RhcnQyLCBlbmQxLCBlbmQyOwoJc3RhdGljIGludCBpbXBhbGxvY2xlbiA9IDA7CglmbG9hdCBlZmZpajsKCWRvdWJsZSBlZmZpang7CgljaGFyICpwdCwgKnB0MSwgKnB0MjsKCXN0YXRpYyBjaGFyICpub2NvdW50MSA9IE5VTEw7CglzdGF0aWMgY2hhciAqbm9jb3VudDIgPSBOVUxMOwoJTG9jYWxIb20gKnRtcHB0cjsKCglpZiggaW1wYWxsb2NsZW4gPCBsZ3RoMSArIDIgfHwgaW1wYWxsb2NsZW4gPCBsZ3RoMiArIDIgKQoJewoJCWlmKCBpbXBtdHggKSBGcmVlRmxvYXRNdHgoIGltcG10eCApOwoJCWlmKCBub2NvdW50MSApIGZyZWUoIG5vY291bnQxICk7CgkJaWYoIG5vY291bnQyICkgZnJlZSggbm9jb3VudDIgKTsKCQlpbXBhbGxvY2xlbiA9IE1BWCggbGd0aDEsIGxndGgyICkgKyAyOwoJCWltcG10eCA9IEFsbG9jYXRlRmxvYXRNdHgoIGltcGFsbG9jbGVuLCBpbXBhbGxvY2xlbiApOwoJCW5vY291bnQxID0gQWxsb2NhdGVDaGFyVmVjKCBpbXBhbGxvY2xlbiApOwoJCW5vY291bnQyID0gQWxsb2NhdGVDaGFyVmVjKCBpbXBhbGxvY2xlbiApOwoJfQoKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJewoJCWZvciggaj0wOyBqPGNsdXMxOyBqKysgKQoJCQlpZiggc2VxMVtqXVtpXSA9PSAnLScgKSBicmVhazsKCQlpZiggaiAhPSBjbHVzMSApIG5vY291bnQxW2ldID0gMTsgCgkJZWxzZQkJCSBub2NvdW50MVtpXSA9IDA7Cgl9Cglmb3IoIGk9MDsgaTxsZ3RoMjsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajxjbHVzMjsgaisrICkKCQkJaWYoIHNlcTJbal1baV0gPT0gJy0nICkgYnJlYWs7CgkJaWYoIGogIT0gY2x1czIgKSBub2NvdW50MltpXSA9IDE7CgkJZWxzZQkJCSBub2NvdW50MltpXSA9IDA7Cgl9CgojaWYgMApmcHJpbnRmKCBzdGRlcnIsICJub2NvdW50MiA9XG4iICk7CmZvciggaSA9IDA7IGk8aW1wYWxsb2NsZW47IGkrKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIm5vY291bnQyWyVkXSA9ICVkICglYylcbiIsIGksIG5vY291bnQyW2ldLCBzZXEyWzBdW2ldICk7Cn0KI2VuZGlmCgoKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJlZmYxIGluIF9pbml0X3N0cmljdCA9IFxuIiApOwoJZm9yKCBpPTA7IGk8Y2x1czE7IGkrKyApCgkJZnByaW50Ziggc3RkZXJyLCAiZWZmMVtdID0gJWZcbiIsIGVmZjFbaV0gKTsKCWZvciggaT0wOyBpPGNsdXMyOyBpKysgKQoJCWZwcmludGYoIHN0ZGVyciwgImVmZjJbXSA9ICVmXG4iLCBlZmYyW2ldICk7CiNlbmRpZgoKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSBmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQlpbXBtdHhbaV1bal0gPSAwLjA7CgllZmZpanggPSAgZmFzdGF0aHJlc2hvbGQ7Cglmb3IoIGk9MDsgaTxjbHVzMTsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajxjbHVzMjsgaisrICkKCQl7CgkJCWVmZmlqID0gKGZsb2F0KSggZWZmMVtpXSAqIGVmZjJbal0gKiBlZmZpanggKTsKCQkJdG1wcHRyID0gbG9jYWxob21baV1bal07CgkJCXdoaWxlKCB0bXBwdHIgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0YXJ0MSA9ICVkXG4iLCB0bXBwdHItPnN0YXJ0MSApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJlbmQxICAgPSAlZFxuIiwgdG1wcHRyLT5lbmQxICAgKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiaSA9ICVkLCBzZXExID0gXG4lc1xuIiwgaSwgc2VxMVtpXSApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJqID0gJWQsIHNlcTIgPSBcbiVzXG4iLCBqLCBzZXEyW2pdICk7CgkJCQlwdCA9IHNlcTFbaV07CgkJCQl0bXBpbnQgPSAtMTsKCQkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCQl7CgkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5zdGFydDEgKSBicmVhazsKCQkJCX0KCQkJCXN0YXJ0MSA9IHB0IC0gc2VxMVtpXSAtIDE7CgkKCQkJCWlmKCB0bXBwdHItPnN0YXJ0MSA9PSB0bXBwdHItPmVuZDEgKSBlbmQxID0gc3RhcnQxOwoJCQkJZWxzZQoJCQkJewojaWYgTUFDSElHQUkKCQkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJCXsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJ0bXBpbnQgPSAlZCwgZW5kMSA9ICVkIHBvcyA9ICVkXG4iLCB0bXBpbnQsIHRtcHB0ci0+ZW5kMSwgcHQtc2VxMVtpXSApOwoJCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+ZW5kMSApIGJyZWFrOwoJCQkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQkJfQoJCQkJCWVuZDEgPSBwdCAtIHNlcTFbaV0gLSAwOwojZWxzZQoJCQkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInRtcGludCA9ICVkLCBlbmQxID0gJWQgcG9zID0gJWRcbiIsIHRtcGludCwgdG1wcHRyLT5lbmQxLCBwdC1zZXExW2ldICk7CgkJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPmVuZDEgKSBicmVhazsKCQkJCQl9CgkJCQkJZW5kMSA9IHB0IC0gc2VxMVtpXSAtIDE7CiNlbmRpZgoJCQkJfQoJCgkJCQlwdCA9IHNlcTJbal07CgkJCQl0bXBpbnQgPSAtMTsKCQkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCQl7CgkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5zdGFydDIgKSBicmVhazsKCQkJCX0KCQkJCXN0YXJ0MiA9IHB0IC0gc2VxMltqXSAtIDE7CgkJCQlpZiggdG1wcHRyLT5zdGFydDIgPT0gdG1wcHRyLT5lbmQyICkgZW5kMiA9IHN0YXJ0MjsKCQkJCWVsc2UKCQkJCXsKI2lmIE1BQ0hJR0FJCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7CgkJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5lbmQyICkgYnJlYWs7CgkJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQl9CgkJCQkJZW5kMiA9IHB0IC0gc2VxMltqXSAtIDA7CiNlbHNlCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7CgkJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPmVuZDIgKSBicmVhazsKCQkJCQl9CgkJCQkJZW5kMiA9IHB0IC0gc2VxMltqXSAtIDE7CiNlbmRpZgoJCQkJfQovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJzdGFydDEgPSAlZCAoJWMpLCBlbmQxID0gJWQgKCVjKSwgc3RhcnQyID0gJWQgKCVjKSwgZW5kMiA9ICVkICglYylcbiIsIHN0YXJ0MSwgc2VxMVtpXVtzdGFydDFdLCBlbmQxLCBzZXExW2ldW2VuZDFdLCBzdGFydDIsIHNlcTJbal1bc3RhcnQyXSwgZW5kMiwgc2VxMltqXVtlbmQyXSApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJzdGVwIDBcbiIgKTsKCQkJCWlmKCBlbmQxIC0gc3RhcnQxICE9IGVuZDIgLSBzdGFydDIgKQoJCQkJewovLwkJCQkJZnByaW50Ziggc3RkZXJyLCAiQ0hVVUkhISwgc3RhcnQxID0gJWQsIGVuZDEgPSAlZCwgc3RhcnQyID0gJWQsIGVuZDIgPSAlZFxuIiwgc3RhcnQxLCBlbmQxLCBzdGFydDIsIGVuZDIgKTsKCQkJCX0KCiNpZiAxCgkJCQlrMSA9IHN0YXJ0MTsgazIgPSBzdGFydDI7CgkJCQlwdDEgPSBzZXExW2ldICsgazE7CgkJCQlwdDIgPSBzZXEyW2pdICsgazI7CgkJCQl3aGlsZSggKnB0MSAmJiAqcHQyICkKCQkJCXsKCQkJCQlpZiggKnB0MSAhPSAnLScgJiYgKnB0MiAhPSAnLScgKQoJCQkJCXsKLy8gvcWk36TyxvO9xaTLpKuksaTKpKSk6KSmpMvD7bDVpLekxrK8pLWkpKGjCi8vCQkJCQkJaW1wbXR4W2sxXVtrMl0gKz0gdG1wcHRyLT53aW1wb3J0YW5jZSAqIGZhc3RhdGhyZXNob2xkOwovLwkJCQkJCWltcG10eFtrMV1bazJdICs9IHRtcHB0ci0+aW1wb3J0YW5jZSAqIGVmZmlqOwoJCQkJCQlpbXBtdHhbazFdW2syXSArPSB0bXBwdHItPmZpbXBvcnRhbmNlICogZWZmaWo7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAiIyMjIyBpbXBtdHhbazFdW2syXSA9ICVmLCB0bXBwdHItPmZpbXBvcnRhbmNlPSVmLCBlZmZpaj0lZlxuIiwgaW1wbXR4W2sxXVtrMl0sIHRtcHB0ci0+ZmltcG9ydGFuY2UsIGVmZmlqICk7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAibWFyaywgJWQgKCVjKSAtICVkICglYykgXG4iLCBrMSwgKnB0MSwgazIsICpwdDIgKTsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICIlZCAoJWMpIC0gJWQgKCVjKSAgLSAlZlxuIiwgazEsICpwdDEsIGsyLCAqcHQyLCB0bXBwdHItPmZpbXBvcnRhbmNlICogZWZmaWogKTsKCQkJCQkJazErKzsgazIrKzsKCQkJCQkJcHQxKys7IHB0MisrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxICE9ICctJyAmJiAqcHQyID09ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsyKys7IHB0MisrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxID09ICctJyAmJiAqcHQyICE9ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsxKys7IHB0MSsrOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAqcHQxID09ICctJyAmJiAqcHQyID09ICctJyApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInNraXAsICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7CgkJCQkJCWsxKys7IHB0MSsrOwoJCQkJCQlrMisrOyBwdDIrKzsKCQkJCQl9CgkJCQkJaWYoIGsxID4gZW5kMSB8fCBrMiA+IGVuZDIgKSBicmVhazsKCQkJCX0KI2Vsc2UKCQkJCXdoaWxlKCBrMSA8PSBlbmQxICYmIGsyIDw9IGVuZDIgKQoJCQkJewoJCQkJCWZwcmludGYoIHN0ZGVyciwgImsxLGsyPSVkLCVkIC0gIiwgazEsIGsyICk7CgkJCQkJaWYoICFub2NvdW50MVtrMV0gJiYgIW5vY291bnQyW2syXSApCgkJCQkJewoJCQkJCQlpbXBtdHhbazFdW2syXSArPSB0bXBwdHItPndpbXBvcnRhbmNlICogZWZmMVtpXSAqIGVmZjJbal0gICogZmFzdGF0aHJlc2hvbGQ7CgkJCQkJCWZwcmludGYoIHN0ZGVyciwgIm1hcmtlZFxuIiApOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJCWZwcmludGYoIHN0ZGVyciwgIm5vIGNvdW50XG4iICk7CgkJCQkJazErKzsgazIrKzsKCQkJCX0KI2VuZGlmCgkJCQl0bXBwdHIgPSB0bXBwdHItPm5leHQ7CgkJCX0KCQl9Cgl9CiNpZiAwCglpZiggY2x1czEgPT0gMSAmJiBjbHVzMiA9PSA2ICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJzZXExWzBdID0gICVzXG4iLCBzZXExWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAic2VxMlswXSA9ICAlc1xuIiwgc2VxMlswXSApOwoJCWZwcmludGYoIHN0ZGVyciwgImltcG10eCA9IFxuIiApOwoJCWZvciggazI9MDsgazI8bGd0aDI7IGsyKysgKQoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNi4zZiAiLCAoZG91YmxlKWsyICk7CgkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJZm9yKCBrMT0wOyBrMTxsZ3RoMTsgazErKyApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICIlZCAiLCBrMSApOwoJCQlmb3IoIGsyPTA7IGsyPDM7IGsyKysgKQoJCQkJZnByaW50Ziggc3RkZXJyLCAiJTIuMWYgIiwgaW1wbXR4W2sxXVtrMl0gKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJfQoJCWV4aXQoIDEgKTsKCX0KI2VuZGlmCn0KI2VuZGlmCgoKc3RhdGljIHZvaWQgbWF0Y2hfY2FsYyggZmxvYXQgKm1hdGNoLCBmbG9hdCAqKmNwbXgxLCBmbG9hdCAqKmNwbXgyLCBpbnQgaTEsIGludCBsZ3RoMiwgZmxvYXQgKipmbG9hdHdvcmssIGludCAqKmludHdvcmssIGludCBpbml0aWFsaXplICkKewojaWYgRkFTVE1BVENIQ0FMQwoJaW50IGosIGw7CglmbG9hdCBzY2FyclsyNl07CglmbG9hdCAqKmNwbXhwZCA9IGZsb2F0d29yazsKCWludCAqKmNwbXhwZG4gPSBpbnR3b3JrOwoJZmxvYXQgKm1hdGNocHQsICpjcG14cGRwdCwgKipjcG14cGRwdHB0OwoJaW50ICpjcG14cGRucHQsICoqY3BteHBkbnB0cHQ7CglpZiggaW5pdGlhbGl6ZSApCgl7CgkJaW50IGNvdW50ID0gMDsKCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQl7CgkJCWNvdW50ID0gMDsKCQkJZm9yKCBsPTA7IGw8MjY7IGwrKyApCgkJCXsKCQkJCWlmKCBjcG14MltsXVtqXSApCgkJCQl7CgkJCQkJY3BteHBkW2pdW2NvdW50XSA9IGNwbXgyW2xdW2pdOwoJCQkJCWNwbXhwZG5bal1bY291bnRdID0gbDsKCQkJCQljb3VudCsrOwoJCQkJfQoJCQl9CgkJCWNwbXhwZG5bal1bY291bnRdID0gLTE7CgkJfQoJfQoKCXsKCQlmb3IoIGw9MDsgbDwyNjsgbCsrICkKCQl7CgkJCXNjYXJyW2xdID0gMC4wOwoJCQlmb3IoIGo9MDsgajwyNjsgaisrICkKCQkJCXNjYXJyW2xdICs9IG5fZGlzW2pdW2xdICogY3BteDFbal1baTFdOwoJCX0KCQltYXRjaHB0ID0gbWF0Y2g7CgkJY3BteHBkbnB0cHQgPSBjcG14cGRuOwoJCWNwbXhwZHB0cHQgPSBjcG14cGQ7CgkJd2hpbGUoIGxndGgyLS0gKQoJCXsKCQkJKm1hdGNocHQgPSAwLjA7CgkJCWNwbXhwZG5wdCA9ICpjcG14cGRucHRwdCsrOwoJCQljcG14cGRwdCA9ICpjcG14cGRwdHB0Kys7CgkJCXdoaWxlKCAqY3BteHBkbnB0Pi0xICkKCQkJCSptYXRjaHB0ICs9IHNjYXJyWypjcG14cGRucHQrK10gKiAqY3BteHBkcHQrKzsKCQkJbWF0Y2hwdCsrOwoJCX0gCgl9CiNlbHNlCglpbnQgaiwgaywgbDsKCWZsb2F0IHNjYXJyWzI2XTsKCWZsb2F0ICoqY3BteHBkID0gZmxvYXR3b3JrOwoJaW50ICoqY3BteHBkbiA9IGludHdvcms7Ci8vIHNpbXBsZQoJaWYoIGluaXRpYWxpemUgKQoJewoJCWludCBjb3VudCA9IDA7CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQljb3VudCA9IDA7CgkJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCQl7CgkJCQlpZiggY3BteDJbbF1bal0gKQoJCQkJewoJCQkJCWNwbXhwZFtjb3VudF1bal0gPSBjcG14MltsXVtqXTsKCQkJCQljcG14cGRuW2NvdW50XVtqXSA9IGw7CgkJCQkJY291bnQrKzsKCQkJCX0KCQkJfQoJCQljcG14cGRuW2NvdW50XVtqXSA9IC0xOwoJCX0KCX0KCWZvciggbD0wOyBsPDI2OyBsKysgKQoJewoJCXNjYXJyW2xdID0gMC4wOwoJCWZvciggaz0wOyBrPDI2OyBrKysgKQoJCQlzY2FycltsXSArPSBuX2Rpc1trXVtsXSAqIGNwbXgxW2tdW2kxXTsKCX0KCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCW1hdGNoW2pdID0gMC4wOwoJCWZvciggaz0wOyBjcG14cGRuW2tdW2pdPi0xOyBrKysgKQoJCQltYXRjaFtqXSArPSBzY2FycltjcG14cGRuW2tdW2pdXSAqIGNwbXhwZFtrXVtqXTsKCX0gCiNlbmRpZgp9CgpzdGF0aWMgdm9pZCBBdHJhY2tpbmdfbG9jYWxob20oIGZsb2F0ICppbXB3bXB0LCBmbG9hdCAqbGFzdGhvcml6b250YWx3LCBmbG9hdCAqbGFzdHZlcnRpY2FsdywgCgkJCQkJCWNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiptc2VxMSwgY2hhciAqKm1zZXEyLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKipjcG14MSwgZmxvYXQgKipjcG14MiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAqKmlqcCwgaW50IGljeWMsIGludCBqY3ljICkKewoJaW50IGksIGosIGwsIGlpbiwgamluLCBpZmksIGpmaSwgbGd0aDEsIGxndGgyLCBrOwoJZmxvYXQgd207CgljaGFyICpnYXB0YWJsZTEsICpndDFiazsKCWNoYXIgKmdhcHRhYmxlMiwgKmd0MmJrOwoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7CglndDFiayA9IEFsbG9jYXRlQ2hhclZlYyggbGd0aDErbGd0aDIrMSApOwoJZ3QyYmsgPSBBbGxvY2F0ZUNoYXJWZWMoIGxndGgxK2xndGgyKzEgKTsKCiNpZiAwCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgCgl7CgkJZnByaW50Ziggc3RkZXJyLCAibGFzdHZlcnRpY2Fsd1slZF0gPSAlZlxuIiwgaSwgbGFzdHZlcnRpY2Fsd1tpXSApOwoJfQojZW5kaWYKIAoJaWYoIG91dGdhcCA9PSAxICkKCQk7CgllbHNlCgl7CgkJd20gPSBsYXN0dmVydGljYWx3WzBdOwoJCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJCXsKCQkJaWYoIGxhc3R2ZXJ0aWNhbHdbaV0gPj0gd20gKQoJCQl7CgkJCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbaV07CgkJCQlpaW4gPSBpOyBqaW4gPSBsZ3RoMi0xOwoJCQkJaWpwW2xndGgxXVtsZ3RoMl0gPSArKCBsZ3RoMSAtIGkgKTsKCQkJfQoJCX0KCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQl7CgkJCWlmKCBsYXN0aG9yaXpvbnRhbHdbal0gPj0gd20gKQoJCQl7CgkJCQl3bSA9IGxhc3Rob3Jpem9udGFsd1tqXTsKCQkJCWlpbiA9IGxndGgxLTE7IGppbiA9IGo7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9IC0oIGxndGgyIC0gaiApOwoJCQl9CgkJfQoJfQoKICAgIGZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApIAogICAgewogICAgICAgIGlqcFtpXVswXSA9IGkgKyAxOwogICAgfQogICAgZm9yKCBqPTA7IGo8bGd0aDIrMTsgaisrICkgCiAgICB7CiAgICAgICAgaWpwWzBdW2pdID0gLSggaiArIDEgKTsKICAgIH0KCglnYXB0YWJsZTEgPSBndDFiayArIGxndGgxK2xndGgyOwoJKmdhcHRhYmxlMSA9IDA7CglnYXB0YWJsZTIgPSBndDJiayArIGxndGgxK2xndGgyOwoJKmdhcHRhYmxlMiA9IDA7CgoJaWluID0gbGd0aDE7IGppbiA9IGxndGgyOwoJKmltcHdtcHQgPSAwLjA7Cglmb3IoIGs9MDsgazw9bGd0aDErbGd0aDI7IGsrKyApIAoJewoJCWlmKCBpanBbaWluXVtqaW5dIDwgMCApIAoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbitpanBbaWluXVtqaW5dOwoJCX0KCQllbHNlIGlmKCBpanBbaWluXVtqaW5dID4gMCApCgkJewoJCQlpZmkgPSBpaW4taWpwW2lpbl1bamluXTsgamZpID0gamluLTE7CgkJfQoJCWVsc2UKCQl7CgkJCWlmaSA9IGlpbi0xOyBqZmkgPSBqaW4tMTsKCQl9CgkJbCA9IGlpbiAtIGlmaTsKCQl3aGlsZSggLS1sICkgCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJCSotLWdhcHRhYmxlMiA9ICctJzsKCQkJaysrOwoJCX0KCQlsPSBqaW4gLSBqZmk7CgkJd2hpbGUoIC0tbCApCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnLSc7CgkJCSotLWdhcHRhYmxlMiA9ICdvJzsKCQkJaysrOwoJCX0KCQlpZiggaWluID09IGxndGgxIHx8IGppbiA9PSBsZ3RoMiApCgkJCTsKCQllbHNlCgkJewoJCQkqaW1wd21wdCArPSBpbXBfbWF0Y2hfb3V0X3NjUiggaWluLCBqaW4gKTsKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJpbXB3bSA9ICVmIChpaW49JWQsIGppbj0lZCkgc2VxMT0lYywgc2VxMj0lY1xuIiwgKmltcHdtcHQsIGlpbiwgamluLCBzZXExWzBdW2lpbl0sIHNlcTJbMF1bamluXSApOwoJCX0KCQlpZiggaWluIDw9IDAgfHwgamluIDw9IDAgKSBicmVhazsKCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCWsrKzsKCQlpaW4gPSBpZmk7IGppbiA9IGpmaTsKCX0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBnYXBpcmVydSggbXNlcTFbaV0sIHNlcTFbaV0sIGdhcHRhYmxlMSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZ2FwaXJlcnUoIG1zZXEyW2pdLCBzZXEyW2pdLCBnYXB0YWJsZTIgKTsKCglmcmVlKCBndDFiayApOwoJZnJlZSggZ3QyYmsgKTsKfQoKc3RhdGljIGZsb2F0IEF0cmFja2luZyggZmxvYXQgKmxhc3Rob3Jpem9udGFsdywgZmxvYXQgKmxhc3R2ZXJ0aWNhbHcsIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgKippanAsIGludCBpY3ljLCBpbnQgamN5YyApCnsKCWludCBpLCBqLCBsLCBpaW4sIGppbiwgaWZpLCBqZmksIGxndGgxLCBsZ3RoMiwgazsKCWZsb2F0IHdtOwoJY2hhciAqZ2FwdGFibGUxLCAqZ3QxYms7CgljaGFyICpnYXB0YWJsZTIsICpndDJiazsKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwoKCWd0MWJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CglndDJiayA9IEFsbG9jYXRlQ2hhclZlYyggbGd0aDErbGd0aDIrMSApOwoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJsYXN0dmVydGljYWx3WyVkXSA9ICVmXG4iLCBpLCBsYXN0dmVydGljYWx3W2ldICk7Cgl9CiNlbmRpZgogCglpZiggb3V0Z2FwID09IDEgKQoJCTsKCWVsc2UKCXsKCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbMF07CgkJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgkJewoJCQlpZiggbGFzdHZlcnRpY2Fsd1tpXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdHZlcnRpY2Fsd1tpXTsKCQkJCWlpbiA9IGk7IGppbiA9IGxndGgyLTE7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9ICsoIGxndGgxIC0gaSApOwoJCQl9CgkJfQoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJaWYoIGxhc3Rob3Jpem9udGFsd1tqXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdGhvcml6b250YWx3W2pdOwoJCQkJaWluID0gbGd0aDEtMTsgamluID0gajsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gLSggbGd0aDIgLSBqICk7CgkJCX0KCQl9Cgl9CgogICAgZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkgCiAgICB7CiAgICAgICAgaWpwW2ldWzBdID0gaSArIDE7CiAgICB9CiAgICBmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKSAKICAgIHsKICAgICAgICBpanBbMF1bal0gPSAtKCBqICsgMSApOwogICAgfQoKCWdhcHRhYmxlMSA9IGd0MWJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUxID0gMDsKCWdhcHRhYmxlMiA9IGd0MmJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUyID0gMDsKCglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7Cglmb3IoIGs9MDsgazw9bGd0aDErbGd0aDI7IGsrKyApIAoJewoJCWlmKCBpanBbaWluXVtqaW5dIDwgMCApIAoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbitpanBbaWluXVtqaW5dOwoJCX0KCQllbHNlIGlmKCBpanBbaWluXVtqaW5dID4gMCApCgkJewoJCQlpZmkgPSBpaW4taWpwW2lpbl1bamluXTsgamZpID0gamluLTE7CgkJfQoJCWVsc2UKCQl7CgkJCWlmaSA9IGlpbi0xOyBqZmkgPSBqaW4tMTsKCQl9CgkJbCA9IGlpbiAtIGlmaTsKCQl3aGlsZSggLS1sICkgCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJCSotLWdhcHRhYmxlMiA9ICctJzsKCQkJaysrOwoJCX0KCQlsPSBqaW4gLSBqZmk7CgkJd2hpbGUoIC0tbCApCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnLSc7CgkJCSotLWdhcHRhYmxlMiA9ICdvJzsKCQkJaysrOwoJCX0KCQlpZiggaWluIDw9IDAgfHwgamluIDw9IDAgKSBicmVhazsKCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCWsrKzsKCQlpaW4gPSBpZmk7IGppbiA9IGpmaTsKCX0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBnYXBpcmVydSggbXNlcTFbaV0sIHNlcTFbaV0sIGdhcHRhYmxlMSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZ2FwaXJlcnUoIG1zZXEyW2pdLCBzZXEyW2pdLCBnYXB0YWJsZTIgKTsKCglmcmVlKCBndDFiayApOwoJZnJlZSggZ3QyYmsgKTsKCglyZXR1cm4oIDAuMCApOwp9CgpmbG9hdCBSX19hbGlnbiggY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBkb3VibGUgKmVmZjEsIGRvdWJsZSAqZWZmMiwgaW50IGljeWMsIGludCBqY3ljLCBpbnQgYWxsb2NsZW4sIExvY2FsSG9tICoqKmxvY2FsaG9tLCBmbG9hdCAqaW1wbWF0Y2gsIGNoYXIgKnNnYXAxLCBjaGFyICpzZ2FwMiwgY2hhciAqZWdhcDEsIGNoYXIgKmVnYXAyICkKLyogc2NvcmUgbm8ga2Vpc2FuIG5vIHNhaSBtb3Rva2FyYWFydSBnYXAgbm8gYXR1a2FpIG5pIG1vbmRhaSBnYSBhcnUgKi8KewovLwlpbnQgazsKCXJlZ2lzdGVyIGludCBpLCBqOwoJaW50IGxhc3RpLCBsYXN0ajsgICAgICAvKiBvdXRnYXAgPT0gMCAtPiBsZ3RoMSwgb3V0Z2FwID09IDEgLT4gbGd0aDErMSAqLwoJaW50IGxndGgxLCBsZ3RoMjsKCWludCByZXN1bHRsZW47CglmbG9hdCB3bSA9IDAuMDsgICAvKiBpbnQgPz8/Pz8/ICovCglmbG9hdCBnOwoJZmxvYXQgKmN1cnJlbnR3LCAqcHJldmlvdXN3OwovLwlmbG9hdCBmcGVuYWx0eSA9IChmbG9hdClwZW5hbHR5OwojaWYgVVNFX1BFTkFMVFlfRVgKCWZsb2F0IGZwZW5hbHR5X2V4ID0gKGZsb2F0KXBlbmFsdHlfZXg7CiNlbmRpZgojaWYgMQoJZmxvYXQgKnd0bXA7CglpbnQgKmlqcHB0OwoJZmxvYXQgKm1qcHQsICpwcmVwdCwgKmN1cnB0OwoJaW50ICptcGpwdDsKI2VuZGlmCglzdGF0aWMgZmxvYXQgbWksICptOwoJc3RhdGljIGludCAqKmlqcDsKCXN0YXRpYyBpbnQgbXBpLCAqbXA7CglzdGF0aWMgZmxvYXQgKncxLCAqdzI7CglzdGF0aWMgZmxvYXQgKm1hdGNoOwoJc3RhdGljIGZsb2F0ICppbml0dmVydGljYWx3OyAgICAvKiBrdWZ1dSBzdXJlYmEgaXJhbmFpICovCglzdGF0aWMgZmxvYXQgKmxhc3R2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCXN0YXRpYyBjaGFyICoqbXNlcTE7CglzdGF0aWMgY2hhciAqKm1zZXEyOwoJc3RhdGljIGNoYXIgKiptc2VxOwoJc3RhdGljIGZsb2F0ICpkaWdmMTsKCXN0YXRpYyBmbG9hdCAqZGlnZjI7CglzdGF0aWMgZmxvYXQgKmRpYWYxOwoJc3RhdGljIGZsb2F0ICpkaWFmMjsKCXN0YXRpYyBmbG9hdCAqZ2FwejE7CglzdGF0aWMgZmxvYXQgKmdhcHoyOwoJc3RhdGljIGZsb2F0ICpnYXBmMTsKCXN0YXRpYyBmbG9hdCAqZ2FwZjI7CglzdGF0aWMgZmxvYXQgKm9nY3AxZzsKCXN0YXRpYyBmbG9hdCAqb2djcDJnOwoJc3RhdGljIGZsb2F0ICpmZ2NwMWc7CglzdGF0aWMgZmxvYXQgKmZnY3AyZzsKCXN0YXRpYyBmbG9hdCAqb2djcDE7CglzdGF0aWMgZmxvYXQgKm9nY3AyOwoJc3RhdGljIGZsb2F0ICpmZ2NwMTsKCXN0YXRpYyBmbG9hdCAqZmdjcDI7CglzdGF0aWMgZmxvYXQgKipjcG14MTsKCXN0YXRpYyBmbG9hdCAqKmNwbXgyOwoJc3RhdGljIGludCAqKmludHdvcms7CglzdGF0aWMgZmxvYXQgKipmbG9hdHdvcms7CglzdGF0aWMgaW50IG9ybGd0aDEgPSAwLCBvcmxndGgyID0gMDsKCWZsb2F0IGZwZW5hbHR5ID0gKGZsb2F0KXBlbmFsdHk7CglmbG9hdCB0bXBwZW5hbDsKCWZsb2F0IGN1bXBlbmFsOwoJZmxvYXQgKmZnY3AycHQ7CglmbG9hdCAqb2djcDJwdDsKCWZsb2F0IGZnY3AxdmE7CglmbG9hdCBvZ2NwMXZhOwoJZmxvYXQga3lva2FpcGVuYWw7CgoKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICIjIyMjICBzZXExWzBdID0gJXNcbiIsIHNlcTFbMF0gKTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIyMgIHNlcTJbMF0gPSAlc1xuIiwgc2VxMlswXSApOwojZW5kaWYKCWlmKCBvcmxndGgxID09IDAgKQoJewoJCW1zZXExID0gQWxsb2NhdGVDaGFyTXR4KCBuam9iLCAwICk7CgkJbXNlcTIgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIDAgKTsKCX0KCgoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7CiNpZiAwCglpZiggbGd0aDEgPT0gMCB8fCBsZ3RoMiA9PSAwICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJXQVJOSU5HIChBYWxpZ25tbSk6IGxndGgxPSVkLCBsZ3RoMj0lZFxuIiwgbGd0aDEsIGxndGgyICk7Cgl9CiNlbmRpZgoKCWlmKCBsZ3RoMSA+IG9ybGd0aDEgfHwgbGd0aDIgPiBvcmxndGgyICkKCXsKCQlpbnQgbGwxLCBsbDI7CgoJCWlmKCBvcmxndGgxID4gMCAmJiBvcmxndGgyID4gMCApCgkJewoJCQlGcmVlRmxvYXRWZWMoIHcxICk7CgkJCUZyZWVGbG9hdFZlYyggdzIgKTsKCQkJRnJlZUZsb2F0VmVjKCBtYXRjaCApOwoJCQlGcmVlRmxvYXRWZWMoIGluaXR2ZXJ0aWNhbHcgKTsKCQkJRnJlZUZsb2F0VmVjKCBsYXN0dmVydGljYWx3ICk7CgoJCQlGcmVlRmxvYXRWZWMoIG0gKTsKCQkJRnJlZUludFZlYyggbXAgKTsKCgkJCUZyZWVDaGFyTXR4KCBtc2VxICk7CgoJCQlGcmVlRmxvYXRWZWMoIGRpZ2YxICk7CgkJCUZyZWVGbG9hdFZlYyggZGlnZjIgKTsKCQkJRnJlZUZsb2F0VmVjKCBkaWFmMSApOwoJCQlGcmVlRmxvYXRWZWMoIGRpYWYyICk7CgkJCUZyZWVGbG9hdFZlYyggZ2FwejEgKTsKCQkJRnJlZUZsb2F0VmVjKCBnYXB6MiApOwoJCQlGcmVlRmxvYXRWZWMoIGdhcGYxICk7CgkJCUZyZWVGbG9hdFZlYyggZ2FwZjIgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ2NwMSApOwoJCQlGcmVlRmxvYXRWZWMoIG9nY3AyICk7CgkJCUZyZWVGbG9hdFZlYyggZmdjcDEgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ2NwMiApOwoJCQlGcmVlRmxvYXRWZWMoIG9nY3AxZyApOwoJCQlGcmVlRmxvYXRWZWMoIG9nY3AyZyApOwoJCQlGcmVlRmxvYXRWZWMoIGZnY3AxZyApOwoJCQlGcmVlRmxvYXRWZWMoIGZnY3AyZyApOwoKCgkJCUZyZWVGbG9hdE10eCggY3BteDEgKTsKCQkJRnJlZUZsb2F0TXR4KCBjcG14MiApOwoKCQkJRnJlZUZsb2F0TXR4KCBmbG9hdHdvcmsgKTsKCQkJRnJlZUludE10eCggaW50d29yayApOwoJCX0KCgkJbGwxID0gTUFYKCAoaW50KSgxLjMqbGd0aDEpLCBvcmxndGgxICkgKyAxMDA7CgkJbGwyID0gTUFYKCAoaW50KSgxLjMqbGd0aDIpLCBvcmxndGgyICkgKyAxMDA7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcbnRyeWluZyB0byBhbGxvY2F0ZSAoJWQrJWQpeG4gbWF0cmljZXMgLi4uICIsIGxsMSwgbGwyICk7CiNlbmRpZgoKCQl3MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJdzIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1hdGNoID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCgkJaW5pdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJbGFzdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgoJCW0gPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1wID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CgoJCW1zZXEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIGxsMStsbDIgKTsKCgkJZGlnZjEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWRpZ2YyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlkaWFmMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZGlhZjIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCWdhcHoxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlnYXB6MiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJZ2FwZjEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWdhcGYyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlvZ2NwMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJb2djcDIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCWZnY3AxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlmZ2NwMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJb2djcDFnID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlvZ2NwMmcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCWZnY3AxZyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZmdjcDJnID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCgkJY3BteDEgPSBBbGxvY2F0ZUZsb2F0TXR4KCAyNiwgbGwxKzIgKTsKCQljcG14MiA9IEFsbG9jYXRlRmxvYXRNdHgoIDI2LCBsbDIrMiApOwoKI2lmIEZBU1RNQVRDSENBTEMKCQlmbG9hdHdvcmsgPSBBbGxvY2F0ZUZsb2F0TXR4KCBNQVgoIGxsMSwgbGwyICkrMiwgMjYgKTsgCgkJaW50d29yayA9IEFsbG9jYXRlSW50TXR4KCBNQVgoIGxsMSwgbGwyICkrMiwgMjcgKTsgCiNlbHNlCgkJZmxvYXR3b3JrID0gQWxsb2NhdGVGbG9hdE10eCggMjYsIE1BWCggbGwxLCBsbDIgKSsyICk7IAoJCWludHdvcmsgPSBBbGxvY2F0ZUludE10eCggMjYsIE1BWCggbGwxLCBsbDIgKSsyICk7IAojZW5kaWYKCiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgInN1Y2NlZWRlZFxuIiApOwojZW5kaWYKCgkJb3JsZ3RoMSA9IGxsMSAtIDEwMDsKCQlvcmxndGgyID0gbGwyIC0gMTAwOwoJfQoKCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKQoJewoJCW1zZXExW2ldID0gbXNlcVtpXTsKCQlzZXExW2ldW2xndGgxXSA9IDA7Cgl9Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKQoJewoJCW1zZXEyW2pdID0gbXNlcVtpY3ljK2pdOwoJCXNlcTJbal1bbGd0aDJdID0gMDsKCX0KCgoJaWYoIG9ybGd0aDEgPiBjb21tb25BbGxvYzEgfHwgb3JsZ3RoMiA+IGNvbW1vbkFsbG9jMiApCgl7CgkJaW50IGxsMSwgbGwyOwoKCQlpZiggY29tbW9uQWxsb2MxICYmIGNvbW1vbkFsbG9jMiApCgkJewoJCQlGcmVlSW50TXR4KCBjb21tb25JUCApOwoJCX0KCgkJbGwxID0gTUFYKCBvcmxndGgxLCBjb21tb25BbGxvYzEgKTsKCQlsbDIgPSBNQVgoIG9ybGd0aDIsIGNvbW1vbkFsbG9jMiApOwoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAiXG5cbnRyeWluZyB0byBhbGxvY2F0ZSAlZHglZCBtYXRyaWNlcyAuLi4gIiwgbGwxKzEsIGxsMisxICk7CiNlbmRpZgoKCQljb21tb25JUCA9IEFsbG9jYXRlSW50TXR4KCBsbDErMTAsIGxsMisxMCApOwoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAic3VjY2VlZGVkXG5cbiIgKTsKI2VuZGlmCgoJCWNvbW1vbkFsbG9jMSA9IGxsMTsKCQljb21tb25BbGxvYzIgPSBsbDI7Cgl9CglpanAgPSBjb21tb25JUDsKCiNpZiAwCgl7CgkJZmxvYXQgdCA9IDAuMDsKCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKQoJCQl0ICs9IGVmZjFbaV07CglmcHJpbnRmKCBzdGRlcnIsICIjIyB0b3RhbGVmZiA9ICVmXG4iLCB0ICk7Cgl9CiNlbmRpZgoKCWNwbXhfY2FsY19uZXcoIHNlcTEsIGNwbXgxLCBlZmYxLCBsZ3RoMSwgaWN5YyApOwoJY3BteF9jYWxjX25ldyggc2VxMiwgY3BteDIsIGVmZjIsIGxndGgyLCBqY3ljICk7CgoJaWYoIHNnYXAxICkKCXsKCQluZXdfT3BlbmluZ0dhcENvdW50X3p1cmUoIG9nY3AxZywgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxLCBlZ2FwMSApOwoJCW5ld19PcGVuaW5nR2FwQ291bnRfenVyZSggb2djcDJnLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDIsIGVnYXAyICk7CgkJbmV3X0ZpbmFsR2FwQ291bnRfenVyZSggZmdjcDFnLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEsIGVnYXAxICk7CgkJbmV3X0ZpbmFsR2FwQ291bnRfenVyZSggZmdjcDJnLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDIsIGVnYXAyICk7CgkJZ2V0ZGlnYXBmcmVxX3BhcnQoIGRpZ2YxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEsIGVnYXAxICk7CgkJZ2V0ZGlnYXBmcmVxX3BhcnQoIGRpZ2YyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDIsIGVnYXAyICk7CgkJZ2V0ZGlhbWlub2ZyZXFfcGFydCggZGlhZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxLCBzZ2FwMSwgZWdhcDEgKTsKCQlnZXRkaWFtaW5vZnJlcV9wYXJ0KCBkaWFmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIsIHNnYXAyLCBlZ2FwMiApOwoJCWdldGdhcGZyZXEoIGdhcGYxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCWdldGdhcGZyZXEoIGdhcGYyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJCWdldGdhcGZyZXFfenVyZV9wYXJ0KCBnYXB6MSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxICk7CgkJZ2V0Z2FwZnJlcV96dXJlX3BhcnQoIGdhcHoyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDEgKTsKCX0KCWVsc2UKCXsKCQlzdF9PcGVuaW5nR2FwQ291bnQoIG9nY3AxZywgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlzdF9PcGVuaW5nR2FwQ291bnQoIG9nY3AyZywgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlzdF9GaW5hbEdhcENvdW50X3p1cmUoIGZnY3AxZywgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlzdF9GaW5hbEdhcENvdW50X3p1cmUoIGZnY3AyZywgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRkaWdhcGZyZXFfc3QoIGRpZ2YxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCWdldGRpZ2FwZnJlcV9zdCggZGlnZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJZ2V0ZGlhbWlub2ZyZXFfeCggZGlhZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJZ2V0ZGlhbWlub2ZyZXFfeCggZGlhZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJZ2V0Z2FwZnJlcSggZ2FwZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJZ2V0Z2FwZnJlcSggZ2FwZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJZ2V0Z2FwZnJlcV96dXJlKCBnYXB6MSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlnZXRnYXBmcmVxX3p1cmUoIGdhcHoyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJfQoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCQlmcHJpbnRmKCBzdGRlcnIsICJvZ2NwMVslZF09JWZcbiIsIGksIG9nY3AxW2ldICk7CiNlbmRpZgoKCWN1cnJlbnR3ID0gdzE7CglwcmV2aW91c3cgPSB3MjsKCgltYXRjaF9jYWxjKCBpbml0dmVydGljYWx3LCBjcG14MiwgY3BteDEsIDAsIGxndGgxLCBmbG9hdHdvcmssIGludHdvcmssIDEgKTsKCWlmKCBsb2NhbGhvbSApCgkJaW1wX21hdGNoX291dF92ZWFkX3RhdGVSKCBpbml0dmVydGljYWx3LCAwLCBsZ3RoMSApOyAvLyAwNjAzMDYKCgltYXRjaF9jYWxjKCBjdXJyZW50dywgY3BteDEsIGNwbXgyLCAwLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CglpZiggbG9jYWxob20gKQoJCWltcF9tYXRjaF9vdXRfdmVhZFIoIGN1cnJlbnR3LCAwLCBsZ3RoMiApOyAvLyAwNjAzMDYKCgojaWYgMCAvLyAtPiB0YmZhc3QuYwoJaWYoIGxvY2FsaG9tICkKCQlpbXBfbWF0Y2hfY2FsYyggY3VycmVudHcsIGljeWMsIGpjeWMsIGxndGgxLCBsZ3RoMiwgc2VxMSwgc2VxMiwgZWZmMSwgZWZmMiwgbG9jYWxob20sIDEsIDAgKTsKCiNlbmRpZgoKCgoJa3lva2FpcGVuYWwgPSAwLjA7CglpZiggb3V0Z2FwID09IDEgKQoJewoJCWcgPSAwLjA7CgoJCWcgKz0gb2djcDFnWzBdICogKCAxLjAtb2djcDJnWzBdICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAiaW5pdC1tYXRjaCBwZW5hbDE9JWYsICVjLSVjXG4iLCBnLCBzZXExWzBdWzBdLCBzZXEyWzBdWzBdICk7CgoJCWcgKz0gb2djcDJnWzBdICogKCAxLjAtb2djcDFnWzBdICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAiaW5pdC1tYXRjaCBwZW5hbDI9JWYsICVjLSVjXG4iLCBnLCBzZXExWzBdWzBdLCBzZXEyWzBdWzBdICk7CgoJCWcgKz0gZmdjcDFnWzBdICogKCAxLjAtZmdjcDJnWzBdICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwxPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoKCQlnICs9IGZnY3AyZ1swXSAqICggMS4wLWZnY3AxZ1swXSApICogZnBlbmFsdHkgKiAwLjU7Ci8vCQlpZiggZyApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoIHBlbmFsMj0lZiwgJWMtJWNcbiIsIGcsIHNlcTFbMF1baV0sIHNlcTJbMF1bal0gKTsKCgkJa3lva2FpcGVuYWwgPSBnOwoJCWluaXR2ZXJ0aWNhbHdbMF0gKz0gZzsKCQljdXJyZW50d1swXSArPSBnOwoKCQljdW1wZW5hbCA9IDAuMDsKCQlmb3IoIGk9MTsgaTxsZ3RoMSsxOyBpKysgKQoJCXsKLy8JCQlpbml0dmVydGljYWx3W2ldICs9ICggb2djcDFbMF0gKyBmZ2NwMVtpLTFdICkgOwoKLy8JUQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbMF0pKigxLjAtb2djcDFnWzBdK2ZnY3AxZ1swXS1kaWdmMVswXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwZjJbai0xXSkqKDEuMC1vZ2NwMWdbaV0rZmdjcDFnW2ldKSArIGdhcGYyW2otMV0qKDEuMC1kaWdmMVtpXS1kaWFmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCgkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoyWzBdKSooMS4wLW9nY3AxZ1swXSswLjApICsgZ2FwejJbMF0qKDEuMC1kaWdmMVswXSAtIGRpYWYxWzBdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC0wLjApKigxLjAtb2djcDFnWzBdKzAuMCkgKyAwLjAqKDEuMC0wLjAtMC4wKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9IDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsIC09ICggKDEuMC0wLjApICogKDEuMC1kaWFmMVswXSkgKyAwLjAgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyAwLgovLwkJCXRtcHBlbmFsIC09ICggKDEuMC1nYXBmMltqLTFdKSAqIG9nY3AxZ1tpXSArIGdhcGYyW2otMV0gKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJCWZwcmludGYoIHN0ZGVyciwgIjAsMDwtJWQsJWQsIHRtcHBlbmFsIDEgPSAlZlxuIiwgaSwgMCwgdG1wcGVuYWwgKTsKCQkJaW5pdHZlcnRpY2Fsd1tpXSArPSB0bXBwZW5hbDsKCi8vCVEJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoyWzFdKSooMS4wLWZnY3AxZ1tpXStvZ2NwMWdbaV0tZGlnZjFbaV0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcGYyW2pdKSooMS4wLWZnY3AxZ1tpXStvZ2NwMWdbaV0pICsgZ2FwZjJbal0qKDEuMC1kaWdmMVtpXS1kaWFmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCgkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoyWzFdKSooMS4wLWZnY3AxZ1tpXStvZ2NwMWdbaV0pICsgZ2FwejJbMV0qKDEuMC1kaWdmMVtpXS1kaWFmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwZjJbMF0pKigxLjAtZmdjcDFnW2ldK29nY3AxZ1tpXSkgKyBnYXBmMlswXSooMS4wLWRpZ2YxW2ldLWRpYWYxW2ldKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9IDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsIC09ICggKDEuMC1nYXBmMlswXSkgKiAoMS4wLWRpYWYxW2ldKSArIGdhcGYyWzBdICkgKiAwLjUgKiBmcGVuYWx0eTsKLy8JCQl0bXBwZW5hbCAtPSAoICgxLjAtZ2FwZjJbal0pICogZmdjcDFnW2ldICsgZ2FwZjJbal0gKSAqIDAuNSAqIGZwZW5hbHR5OwoJCQlpbml0dmVydGljYWx3W2ldICs9IHRtcHBlbmFsOwoJCQljdW1wZW5hbCArPSAoIG9nY3AxZ1tpLTBdICsgZmdjcDFnW2ldICkgKiBmcGVuYWx0eSAqIDAuNTsKCQkJaW5pdHZlcnRpY2Fsd1tpXSArPSBjdW1wZW5hbCAtIGZnY3AxZ1tpXSAqIGZwZW5hbHR5ICogMC41OyAvLyBob250byBoYSBpcnUKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICIwLDA8LSVkLCVkLCB0bXBwZW5hbCAyID0gJWYsIGN1bXBlbmFsPSVmLCBmZ2NwMWdbaV09JWYsIG9nY3AxZ1tpXT0lZlxuIiwgaSwgMCwgdG1wcGVuYWwsIGN1bXBlbmFsLCBmZ2NwMWdbaV0sIG9nY3AxZ1tpXSApOwoKCQl9CgkJY3VtcGVuYWwgPSAwLjA7CgkJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCQl7Ci8vCQkJY3VycmVudHdbal0gKz0gKCBvZ2NwMlswXSArIGZnY3AyW2otMV0gKSA7CgovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoxWzBdKSooMS4wLW9nY3AyZ1swXStmZ2NwMmdbMF0tZGlnZjJbMF0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcGYxW2ktMV0pKigxLjAtb2djcDJnW2pdK2ZnY3AyZ1tqXSkgKyBnYXBmMVtpLTFdKigxLjAtZGlnZjJbal0tZGlhZjJbal0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQoJCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MVswXSkqKDEuMC1vZ2NwMmdbMF0rMC4wKSArIGdhcHoxWzBdKigxLjAtZGlnZjJbal0tZGlhZjJbal0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gKCAoMS4wLTAuMCkqKDEuMC1vZ2NwMmdbMF0rMC4wKSArIDAuMCooMS4wLTAuMC0wLjApICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gMC41ICogZnBlbmFsdHk7Ci8vCQkJdG1wcGVuYWwgLT0gKCAoMS4wLTAuMCkgKiAoMS4wLWRpYWYyWzBdKSArIDAuMCApICogMC41ICogZnBlbmFsdHk7IC8vIDAuCi8vCQkJdG1wcGVuYWwgLT0gKCAoMS4wLWdhcGYxWzBdKSAqIGZnY3AyZ1tqXSArIGdhcGYxWzBdICkgKiAwLjUgKiBmcGVuYWx0eTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICIwLDA8LSVkLCVkLCB0bXBwZW5hbCAzID0gJWZcbiIsIDAsIGosIHRtcHBlbmFsICk7CgkJCWN1cnJlbnR3W2pdICs9IHRtcHBlbmFsOwoKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MVsxXSkqKDEuMC1mZ2NwMmdbal0rb2djcDJnW2pdLWRpZ2YyW2pdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXBmMVtpXSkqKDEuMC1mZ2NwMmdbal0rb2djcDJnW2pdKSArIGdhcGYxW2ldKigxLjAtZGlnZjJbal0tZGlhZjJbal0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQoJCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MVsxXSkqKDEuMC1mZ2NwMmdbal0rb2djcDJnW2pdKSArIGdhcHoxWzFdKigxLjAtZGlnZjJbal0tZGlhZjJbal0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcGYxWzBdKSooMS4wLWZnY3AyZ1tqXStvZ2NwMmdbal0pICsgZ2FwZjFbMF0qKDEuMC1kaWdmMltqXS1kaWFmMltqXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAwLjUgKiBmcGVuYWx0eTsKLy8JCQl0bXBwZW5hbCAtPSAoICgxLjAtZ2FwZjFbMF0pICogKDEuMC1kaWFmMltqXSkgKyBnYXBmMVswXSApICogMC41ICogZnBlbmFsdHk7Ci8vCQkJdG1wcGVuYWwgLT0gKCAoMS4wLWdhcGYxWzBdKSAqIG9nY3AyZ1tqXSArIGdhcGYxW2ktMV0gKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJCWZwcmludGYoIHN0ZGVyciwgIjAsMDwtJWQsJWQsIHRtcHBlbmFsIDQgPSAlZlxuIiwgMCwgaiwgdG1wcGVuYWwgKTsKCQkJY3VycmVudHdbal0gKz0gdG1wcGVuYWw7CgkJCWN1bXBlbmFsICs9ICggb2djcDJnW2otMF0gKyBmZ2NwMmdbal0gKSAqIGZwZW5hbHR5ICogMC41OwoJCQljdXJyZW50d1tqXSArPSBjdW1wZW5hbCAtIGZnY3AyZ1tqXSAqIGZwZW5hbHR5ICogMC41OyAvLyBob250byBoYSBpcnUKCQl9Cgl9CiNpZiBPVVRHQVAwVFJZCgllbHNlCgl7CgkJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCQkJY3VycmVudHdbal0gLT0gb2Zmc2V0ICogaiAvIDIuMDsKCQlmb3IoIGk9MTsgaTxsZ3RoMSsxOyBpKysgKQoJCQlpbml0dmVydGljYWx3W2ldIC09IG9mZnNldCAqIGkgLyAyLjA7Cgl9CiNlbmRpZgoKCW1bMF0gPSAwLjA7IC8vIGlyYW5haQoJZm9yKCBqPTE7IGo8bGd0aDIrMTsgKytqICkgCgl7CgkJbXBbal0gPSAwOwoJCW1bal0gPSBjdXJyZW50d1tqLTFdICsgMTAwMDAgKiBmcGVuYWx0eTsgLy9paW5va2E/Cgl9CglpZiggbGd0aDIgPT0gMCApCgkJbGFzdHZlcnRpY2Fsd1swXSA9IDAuMDsgLy8gRmFsaWduIGthcmEgeW9iYXJldGF0b2tpIGtvdW5hcnVrYW5vdXNlaSBhcmkKCWVsc2UKCQlsYXN0dmVydGljYWx3WzBdID0gY3VycmVudHdbbGd0aDItMV07CgoJaWYoIG91dGdhcCApIGxhc3RpID0gbGd0aDErMTsgZWxzZSBsYXN0aSA9IGxndGgxOwoKI2lmIFhYWFhYWFgKZnByaW50Ziggc3RkZXJyLCAiY3VycmVudHcgPSBcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbaV0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaW5pdHZlcnRpY2FsdyA9IFxuIiApOwpmb3IoIGk9MDsgaTxsZ3RoMisxOyBpKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBpbml0dmVydGljYWx3W2ldICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImZjZ3BcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJZnByaW50Ziggc3RkZXJyLCAiZmdjcDFbJWRdPSVmXG4iLCBpLCBvZ2NwMVtpXSApOwpmb3IoIGk9MDsgaTxsZ3RoMjsgaSsrICkgCglmcHJpbnRmKCBzdGRlcnIsICJmZ2NwMlslZF09JWZcbiIsIGksIG9nY3AyW2ldICk7CiNlbmRpZgoKCWZvciggaT0xOyBpPGxhc3RpOyBpKysgKQoJewoJCXd0bXAgPSBwcmV2aW91c3c7IAoJCXByZXZpb3VzdyA9IGN1cnJlbnR3OwoJCWN1cnJlbnR3ID0gd3RtcDsKCgkJcHJldmlvdXN3WzBdID0gaW5pdHZlcnRpY2Fsd1tpLTFdOwoKCQltYXRjaF9jYWxjKCBjdXJyZW50dywgY3BteDEsIGNwbXgyLCBpLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAwICk7CiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJpPSVkXG4iLCBpICk7CmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaj0wOyBqPGxndGgyOyBqKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBjdXJyZW50d1tqXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKCQlpZiggbG9jYWxob20gKQoJCXsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJDYWxsaW5nIGltcF9tYXRjaF9jYWxjIChvKSBsZ3RoID0gJWQsIGkgPSAlZFxuIiwgbGd0aDEsIGkgKTsKI2lmICAwCgkJCWltcF9tYXRjaF9vdXRfdmVhZFIoIGN1cnJlbnR3LCBpLCBsZ3RoMiApOwojZWxzZQoJCQlpbXBfbWF0Y2hfb3V0X3ZlYWRSKCBjdXJyZW50dywgaSwgbGd0aDIgKTsKI2VuZGlmCgkJfQojaWYgWFhYWFhYWApmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaT0lZFxuIiwgaSApOwpmcHJpbnRmKCBzdGRlcnIsICJjdXJyZW50dyA9IFxuIiApOwpmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbal0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgkJY3VycmVudHdbMF0gPSBpbml0dmVydGljYWx3W2ldOwoKCQltcGkgPSAwOwoJCW1pID0gcHJldmlvdXN3WzBdICsgMTAwMDAgKiBmcGVuYWx0eTsKCgkJaWpwcHQgPSBpanBbaV0gKyAxOwoJCW1qcHQgPSBtICsgMTsKCQlwcmVwdCA9IHByZXZpb3VzdzsKCQljdXJwdCA9IGN1cnJlbnR3ICsgMTsKCQltcGpwdCA9IG1wICsgMTsKCQlmZ2NwMnB0ID0gZmdjcDI7CgkJb2djcDJwdCA9IG9nY3AyICsgMTsKCQlmZ2NwMXZhID0gZmdjcDFbaS0xXTsKCQlvZ2NwMXZhID0gb2djcDFbaV07CgkJbGFzdGogPSBsZ3RoMisxOwoJCWZvciggaj0xOyBqPGxhc3RqOyBqKysgKQoJCXsKCQkJd20gPSAqcHJlcHQ7CgoJCQlnID0gb2djcDFnW2ldICogKCAxLjAtb2djcDJnW2pdICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCQlpZiggZyAmJiBpPT1qICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwxPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoJCQl3bSArPSBnOwoKCQkJZyA9IG9nY3AyZ1tqXSAqICggMS4wLW9nY3AxZ1tpXSApICogZnBlbmFsdHkgKiAwLjU7Ci8vCQkJaWYoIGcgJiYgaT09aiApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoIHBlbmFsMj0lZiwgJWMtJWNcbiIsIGcsIHNlcTFbMF1baV0sIHNlcTJbMF1bal0gKTsKCQkJd20gKz0gZzsKCgkJCWcgPSBmZ2NwMWdbaV0gKiAoIDEuMC1mZ2NwMmdbal0gKSAqIGZwZW5hbHR5ICogMC41OwovLwkJCWlmKCBnICYmIGk9PWogKSBmcHJpbnRmKCBzdGRlcnIsICJtYXRjaCBwZW5hbDM9JWYsICVjLSVjXG4iLCBnLCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdICk7CgkJCXdtICs9IGc7CgoJCQlnID0gZmdjcDJnW2pdICogKCAxLjAtZmdjcDFnW2ldICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCQlpZiggZyAmJiBpPT1qICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWw0PSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoJCQl3bSArPSBnOwoKI2lmIDAKCQkJZyA9IGZnY3AyZ1tqXSAqIG9nY3AxZ1tpXSAqIGZwZW5hbHR5ICogMC41OwoJCQlpZiggZyApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoIG0tcGVuYWw1PSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoJCQl3bSAtPSBnOwoKCQkJZyA9IGZnY3AxZ1tpXSAqIG9nY3AyZ1tqXSAqIGZwZW5hbHR5ICogMC41OwoJCQlpZiggZyApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoIG0tcGVuYWw2PSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoJCQl3bSAtPSBnOwojZW5kaWYKCgkJCSppanBwdCA9IDA7CgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZi0+Iiwgd20gKTsKI2VuZGlmCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmPyIsIGcgKTsKI2VuZGlmCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejFbaSsxXSkqKDEuMC1mZ2NwMmdbal0rb2djcDJnW2pdLWRpZ2YyW2pdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXBmMVtpXSkqKDEuMC1mZ2NwMmdbal0pICsgZ2FwZjFbaV0qKDEuMC1kaWdmMltqXS1kaWFmMltqXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCgkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoxW2krMV0pKigxLjAtZmdjcDJnW2pdK29nY3AyZ1tqXSkgKyBnYXB6MVtpKzFdKigxLjAtZGlnZjJbal0tZGlhZjJbal0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcGYxW2ldKSooMS4wLWZnY3AyZ1tqXStvZ2NwMmdbal0pICsgZ2FwZjFbaV0qKDEuMC1kaWdmMltqXS1kaWFmMltqXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAwLjUgKiBmcGVuYWx0eTsKLy8JCQl0bXBwZW5hbCAtPSAoICgxLjAtZ2FwZjFbaV0pKigxLjAtZGlhZjJbal0pICsgZ2FwZjFbaV0gKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsIC09ICggKDEuMC1nYXBmMVtpXSkqZmdjcDJnW2pdICsgZ2FwZjFbaV0gKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsID0gKmZnY3AycHQtZnBlbmFsdHkqMC41KmdhcGYxW2ldOwovLwkJCXRtcHBlbmFsID0gKmZnY3AycHQ7CgkJCWlmKCAoZz1taSt0bXBwZW5hbCkgPiB3bSApCgkJCXsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAianVtcCBpIHN0YXJ0PSVmIChqPSVkLCBmZ2NwMmdbal09JWYsIGRpZ2YyW2pdPSVmLCBkaWFmMltqXT0lZiksICVjLSVjXG4iLCBnLW1pLCBqLCBmZ2NwMmdbal0sIGRpZ2YyW2pdLCBkaWFmMltqXSwgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoJCQkJd20gPSBnOwoJCQkJKmlqcHB0ID0gLSggaiAtIG1waSApOwoJCQl9Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejFbaV0pKigxLjAtb2djcDJnW2pdK2ZnY3AyZ1tqXS1kaWdmMltqXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCgkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoxW2ldKSooMS4wLW9nY3AyZ1tqXStmZ2NwMmdbal0pICsgZ2FwejFbaV0qKDEuMC1kaWdmMltqXS1kaWFmMltqXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwZjFbaS0xXSkqKDEuMC1vZ2NwMmdbal0rZmdjcDJnW2pdKSArIGdhcGYxW2ktMV0qKDEuMC1kaWdmMltqXS1kaWFmMltqXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAqb2djcDJwdC1mcGVuYWx0eSowLjUqKGdhcGYyW2otMV0rZ2FwZjFbaS0xXSk7Ci8vCQkJdG1wcGVuYWwgPSAwLjUgKiBmcGVuYWx0eTsKLy8JCQl0bXBwZW5hbCAtPSAoICgxLjAtZ2FwZjFbaS0xXSkqKDEuMC1kaWFmMltqXSkgKyBnYXBmMVtpLTFdICkgKiAwLjUgKiBmcGVuYWx0eTsKLy8JCQl0bXBwZW5hbCAtPSAoICgxLjAtZ2FwZjFbaS0xXSkqb2djcDJnW2pdICsgZ2FwZjFbaS0xXSApICogMC41ICogZnBlbmFsdHk7Ci8vCQkJdG1wcGVuYWwgPSAqcHJlcHQrKm9nY3AycHQ7CgkJCWlmKCAoZz0qcHJlcHQrdG1wcGVuYWwpID49IG1pICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJqdW1wIGkgZW5kPSVmLCAlYy0lY1xuIiwgZy0qcHJlcHQsIHNlcTFbMF1baS0xXSwgc2VxMlswXVtqLTFdICk7CgkJCQltaSA9IGc7CgkJCQltcGkgPSBqLTE7CgkJCX0KCQkJZWxzZSBpZiggaiAhPSAxICkKCQkJewoJCQkJbWkgKz0gKCBvZ2NwMmdbai0wXSArIGZnY3AyZ1tqXSApICogZnBlbmFsdHkgKiAwLjU7IC8vIENIVVVJIGhvbnRvIGhhIGlydQovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICIlYyVjLyVjJWMgZXhwLCBvZz0lZixmZz0lZlxuIiwgJz0nLCAnPScsIHNlcTJbMF1bai0xXSwgc2VxMlswXVtqXSwgb2djcDJnW2otMF0gKiBmcGVuYWx0eSowLjUsIGZnY3AyZ1tqXSAqIGZwZW5hbHR5KjAuNSApOwoJCQl9CiNpZiBVU0VfUEVOQUxUWV9FWAoJCQkJbWkgKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKI2lmIDAgCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmPyIsIGcgKTsKI2VuZGlmCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbaisxXSkqKDEuMC1mZ2NwMWdbaV0rb2djcDFnW2ldLWRpZ2YxW2ldKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbaisxXSkqKDEuMC1mZ2NwMWdbaV0rb2djcDFnW2ldKSArIGdhcHoyW2orMV0qKDEuMC1kaWdmMVtpXS1kaWFmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwZjJbal0pKigxLjAtZmdjcDFnW2ldK29nY3AxZ1tpXSkgKyBnYXBmMltqXSooMS4wLWRpZ2YxW2ldLWRpYWYxW2ldKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXBmMltqXSkqKDEuMC1mZ2NwMWdbaV0pICsgZ2FwZjJbal0qKDEuMC1kaWdmMVtpXS1kaWFmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCi8vCQkJdG1wcGVuYWwgPSAwLjUgKiBmcGVuYWx0eTsKLy8JCQl0bXBwZW5hbCAtPSAoICgxLjAtZ2FwZjJbal0pKigxLjAtZGlhZjFbaV0pICsgZ2FwZjJbal0gKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsIC09ICggKDEuMC1nYXBmMltqXSkqZmdjcDFnW2ldICsgZ2FwZjJbal0gKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsID0gZmdjcDF2YS1mcGVuYWx0eSowLjUqZ2FwZjJbal07Ci8vCQkJdG1wcGVuYWwgPSBmZ2NwMXZhOwoJCQlpZiggKGc9Km1qcHQrdG1wcGVuYWwpID4gd20gKQoJCQl7Ci8vCQkJCWlmKCBzZXExWzBdW2ldID09ICdZJyAmJiBzZXEyWzBdW2pdID09ICdCJyApCi8vCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJqdW1wIGogc3RhcnQ9JWYsICVjLSVjXG4iLCBnLSptanB0LCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdICk7CgkJCQl3bSA9IGc7CgkJCQkqaWpwcHQgPSArKCBpIC0gKm1wanB0ICk7CgkJCX0KLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MltqXSkqKDEuMC1vZ2NwMWdbaV0rZmdjcDFnW2ldLWRpZ2YxW2ldKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbal0pKigxLjAtb2djcDFnW2ldK2ZnY3AxZ1tpXSkgKyBnYXB6MltqXSooMS4wLWRpZ2YxW2ldLWRpYWYxW2ldKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXBmMltqLTFdKSooMS4wLW9nY3AxZ1tpXStmZ2NwMWdbaV0pICsgZ2FwZjJbai0xXSooMS4wLWRpZ2YxW2ldLWRpYWYxW2ldKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXBmMltqLTFdKSooMS4wLW9nY3AxZ1tpXSkgKyBnYXBmMltqLTFdKigxLjAtZGlnZjFbaV0tZGlhZjFbaV0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQovLwkJCXRtcHBlbmFsID0gb2djcDF2YS1mcGVuYWx0eSowLjUqKGdhcGYxW2ktMV0rZ2FwZjJbai0xXSk7Ci8vCQkJdG1wcGVuYWwgPSAwLjUgKiBmcGVuYWx0eTsKLy8JCQl0bXBwZW5hbCAtPSAoICgxLjAtZ2FwZjJbai0xXSkgKiAoMS4wLWRpYWYxW2ldKSArIGdhcGYyW2otMV0gKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsIC09ICggKDEuMC1nYXBmMltqLTFdKSAqIG9nY3AxZ1tpXSArIGdhcGYyW2otMV0gKSAqIDAuNSAqIGZwZW5hbHR5OwovLwkJCXRtcHBlbmFsID0gMC41ICogZnBlbmFsdHkgLSAoICgxLjAtZ2FwZjJbai0xXSkgKiAob2djcDFnW2ldKSArIGdhcGYyW2otMV0gKSAqICggMC41ICogZnBlbmFsdHkgKTsKLy8JCQl0bXBwZW5hbCA9IG9nY3AxdmEtZnBlbmFsdHkqMC41KmdhcGYyW2otMV07Ci8vCQkJdG1wcGVuYWwgPSBvZ2NwMXZhOwoJCQlpZiggKGc9KnByZXB0K3RtcHBlbmFsKSA+PSAqbWpwdCApCgkJCXsKLy8JCQkJaWYoIHNlcTFbMF1baV0gPT0gJ1QnICYmIHNlcTJbMF1bal0gPT0gJ1QnICkKLy8JCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXAgaiBlbmQ9JWYsICVjLSVjXG4iLCBnLSpwcmVwdCwgc2VxMVswXVtpLTFdLCBzZXEyWzBdW2otMV0gKTsKCQkJCSptanB0ID0gZzsKCQkJCSptcGpwdCA9IGktMTsKCQkJfQoJCQllbHNlIGlmKCBpICE9IDEgKQoJCQl7CgkJCQltW2pdICs9ICggb2djcDFnW2ktMF0gKyBmZ2NwMWdbaV0gKSAqIGZwZW5hbHR5ICogMC41OyAvLyBDSFVVSSBob250byBoYSBpcnUKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiJWMlYy8lYyVjIGV4cCwgb2c9JWYsZmc9JWZcbiIsIHNlcTFbMF1baS0xXSwgc2VxMVswXVtpXSwgJz0nLCAnPScsIG9nY3AxZ1tpLTBdICogZnBlbmFsdHkqMC41LCBmZ2NwMWdbaV0gKiBmcGVuYWx0eSowLjUgKTsKCQkJfQojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbVtqXSArPSBmcGVuYWx0eV9leDsKI2VuZGlmCgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZiAiLCB3bSApOwojZW5kaWYKCQkJKmN1cnB0KysgKz0gd207CgkJCWlqcHB0Kys7CgkJCW1qcHQrKzsKCQkJcHJlcHQrKzsKCQkJbXBqcHQrKzsKCQkJZmdjcDJwdCsrOwoJCQlvZ2NwMnB0Kys7CgkJfQoJCWxhc3R2ZXJ0aWNhbHdbaV0gPSBjdXJyZW50d1tsZ3RoMi0xXTsKCX0KCi8vCWZwcmludGYoIHN0ZGVyciwgIndtID0gJWZcbiIsIHdtICk7CgojaWYgT1VUR0FQMFRSWQoJaWYoICFvdXRnYXAgKQoJewoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJCWN1cnJlbnR3W2pdIC09IG9mZnNldCAqICggbGd0aDIgLSBqICkgLyAyLjA7CgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQkJbGFzdHZlcnRpY2Fsd1tpXSAtPSBvZmZzZXQgKiAoIGxndGgxIC0gaSAgLyAyLjApOwoJfQojZW5kaWYKCQkKCS8qCglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGZwcmludGYoIHN0ZGVyciwiJXNcbiIsIHNlcTFbaV0gKTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIyMjXG4iICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBmcHJpbnRmKCBzdGRlcnIsIiVzXG4iLCBzZXEyW2pdICk7CglmcHJpbnRmKCBzdGRlcnIsICI9PT09PiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIHN0cmNweSggbXNlcTFbaV0sIHNlcTFbaV0gKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIHN0cmNweSggbXNlcTJbal0sIHNlcTJbal0gKTsKCSovCglpZiggbG9jYWxob20gKQoJewoJCUF0cmFja2luZ19sb2NhbGhvbSggaW1wbWF0Y2gsIGN1cnJlbnR3LCBsYXN0dmVydGljYWx3LCBzZXExLCBzZXEyLCBtc2VxMSwgbXNlcTIsIGNwbXgxLCBjcG14MiwgaWpwLCBpY3ljLCBqY3ljICk7Cgl9CgllbHNlCgkJQXRyYWNraW5nKCBjdXJyZW50dywgbGFzdHZlcnRpY2Fsdywgc2VxMSwgc2VxMiwgbXNlcTEsIG1zZXEyLCBjcG14MSwgY3BteDIsIGlqcCwgaWN5YywgamN5YyApOwoKLy8JZnByaW50Ziggc3RkZXJyLCAiIyMjIGltcG1hdGNoID0gJWZcbiIsICppbXBtYXRjaCApOwoKCXJlc3VsdGxlbiA9IHN0cmxlbiggbXNlcTFbMF0gKTsKCWlmKCBhbGxvY2xlbiA8IHJlc3VsdGxlbiB8fCByZXN1bHRsZW4gPiBOICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJhbGxvY2xlbj0lZCwgcmVzdWx0bGVuPSVkLCBOPSVkXG4iLCBhbGxvY2xlbiwgcmVzdWx0bGVuLCBOICk7CgkJRXJyb3JFeGl0KCAiTEVOR1RIIE9WRVIhXG4iICk7Cgl9CgoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIHN0cmNweSggc2VxMVtpXSwgbXNlcTFbaV0gKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIHN0cmNweSggc2VxMltqXSwgbXNlcTJbal0gKTsKCS8qCglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2VxMVtpXSApOwoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyNcbiIgKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2VxMltqXSApOwoJKi8KCglmcHJpbnRmKCBzdGRlcnIsICJ3bSA9ICVmXG4iLCB3bSApOwoKCglyZXR1cm4oIHdtICk7Cn0KCgo=