LyoKICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBMb3RzIG9mIGNvZGUgY29waWVkIGZyb206CiAqCiAqIG04eHhfcGNtY2lhLmMgLSBMaW51eCBQQ01DSUEgc29ja2V0IGRyaXZlciBmb3IgdGhlIG1wYzh4eCBzZXJpZXMuCiAqIChDKSAxOTk5LTIwMDAgTWFnbnVzIERhbW0gPGRhbW1AYml0c21hcnQuY29tPgogKgogKiAiVGhlIEV4Q0Egc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgc29ja2V0IGNvbnRyb2xsZXJzIHNob3VsZCBwcm92aWRlCiAqIHR3byBJTyBhbmQgZml2ZSBtZW1vcnkgd2luZG93cyBwZXIgc29ja2V0LCB3aGljaCBjYW4gYmUgaW5kZXBlbmRlbnRseQogKiBjb25maWd1cmVkIGFuZCBwb3NpdGlvbmVkIGluIHRoZSBob3N0IGFkZHJlc3Mgc3BhY2UgYW5kIG1hcHBlZCB0bwogKiBhcmJpdHJhcnkgc2VnbWVudHMgb2YgY2FyZCBhZGRyZXNzIHNwYWNlLiAiIC0gRGF2aWQgQSBIaW5kcy4gMTk5OQogKgogKiBUaGlzIGNvbnRyb2xsZXIgZG9lcyBfbm90XyBtZWV0IHRoZSBFeENBIHN0YW5kYXJkLgogKgogKiBtOHh4IHBjbWNpYSBjb250cm9sbGVyIGJyaWVmIGluZm86CiAqICsgOCB3aW5kb3dzIChhdHRyaWIsIG1lbSwgaS9vKQogKiArIHVwIHRvIHR3byBzbG90cyAoU0xPVF9BIGFuZCBTTE9UX0IpCiAqICsgaW5wdXRwaW5zLCBvdXRwdXRwaW5zLCBldmVudCBhbmQgbWFzayByZWdpc3RlcnMuCiAqIC0gbm8gb2Zmc2V0IHJlZ2lzdGVyLiBzaWdoLgogKgogKiBCZWNhdXNlIG9mIHRoZSBsYWNraW5nIG9mZnNldCByZWdpc3RlciB3ZSBtdXN0IG1hcCB0aGUgd2hvbGUgY2FyZC4KICogV2UgYXNzaWduIGVhY2ggbWVtb3J5IHdpbmRvdyBQQ01DSUFfTUVNX1dJTl9TSVpFIGFkZHJlc3Mgc3BhY2UuCiAqIE1ha2Ugc3VyZSB0aGVyZSBpcyAoUENNQ0lBX01FTV9XSU5fU0laRSAqIFBDTUNJQV9NRU1fV0lOX05PCiAqICogUENNQ0lBX1NPQ0tFVFNfTk8pIGJ5dGVzIGF0IFBDTUNJQV9NRU1fV0lOX0JBU0UuCiAqIFRoZSBpL28gd2luZG93cyBhcmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGF0IFBDTUNJQV9JT19XSU5fQkFTRS4KICogVGhleSBhcmUgbWF4aW11bSA2NEtCeXRlIGVhY2guLi4KICovCgoKI3VuZGVmIERFQlVHCQkvKiovCgovKgogKiBQQ01DSUEgc3VwcG9ydAogKi8KI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8Y29tbWFuZC5oPgojaW5jbHVkZSA8Y29uZmlnLmg+CiNpbmNsdWRlIDxwY2kuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKI2luY2x1ZGUgPHBjbWNpYS5oPgoKI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1RJX0NBUkRCVVMpCgppbnQgcGNtY2lhX29uKGludCBpZGVfYmFzZV9idXMpOwoKc3RhdGljIGludCAgcGNtY2lhX29mZih2b2lkKTsKc3RhdGljIGludCAgaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCk7CnN0YXRpYyBpbnQgIGhhcmR3YXJlX2VuYWJsZShpbnQgc2xvdCk7CnN0YXRpYyBpbnQgIHZvbHRhZ2Vfc2V0KGludCBzbG90LCBpbnQgdmNjLCBpbnQgdnBwKTsKc3RhdGljIHZvaWQgcHJpbnRfZnVuY2lkKGludCBmdW5jKTsKc3RhdGljIHZvaWQgcHJpbnRfZml4ZWQodm9sYXRpbGUgdWNoYXIgKnApOwpzdGF0aWMgaW50ICBpZGVudGlmeSh2b2xhdGlsZSB1Y2hhciAqcCk7CnN0YXRpYyBpbnQgIGNoZWNrX2lkZV9kZXZpY2UoaW50IHNsb3QsIGludCBpZGVfYmFzZV9idXMpOwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgpjb25zdCBjaGFyICppbmRlbnQgPSAiXHQgICAiOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCmludCBkb19waW5pdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewojaWZuZGVmIENGR19GSVJTVF9QQ01DSUFfQlVTCiMgZGVmaW5lIENGR19GSVJTVF9QQ01DSUFfQlVTIDAKI2VuZGlmCgoJaW50IHJjb2RlID0gMDsKCglpZiAoYXJnYyAhPSAyKSB7CgkJcHJpbnRmICgiVXNhZ2U6IHBpbml0IHtvbiB8IG9mZn1cbiIpOwoJCXJldHVybiAxOwoJfQoJaWYgKHN0cmNtcChhcmd2WzFdLCJvbiIpID09IDApIHsKCQlyY29kZSA9IHBjbWNpYV9vbihDRkdfRklSU1RfUENNQ0lBX0JVUyk7Cgl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCJvZmYiKSA9PSAwKSB7CgkJcmNvZGUgPSBwY21jaWFfb2ZmKCk7Cgl9IGVsc2UgewoJCXByaW50ZiAoIlVzYWdlOiBwaW5pdCB7b24gfCBvZmZ9XG4iKTsKCQlyZXR1cm4gMTsKCX0KCglyZXR1cm4gcmNvZGU7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgpzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3VwcG9ydGVkW10gPSB7Cgl7IFBDSV9WRU5ET1JfSURfVEksIDB4YWM1MCB9LCAvKiBUaSBQQ0kxNDEwQSAqLwoJeyBQQ0lfVkVORE9SX0lEX1RJLCAweGFjNTYgfSwgLyogVGkgUENJMTUxMCAqLwoJeyB9Cn07CgpzdGF0aWMgcGNpX2Rldl90IGRldmJ1c2ZuOwpzdGF0aWMgdTMyIHNvY2tldF9iYXNlOwpzdGF0aWMgdTMyIHBjbWNpYV9jaXNfcHRyOwoKaW50IHBjbWNpYV9vbihpbnQgaWRlX2Jhc2VfYnVzKQp7Cgl1MTYgZGV2X2lkOwoJdTMyIHNvY2tldF9zdGF0dXM7CglpbnQgc2xvdCA9IDA7CglpbnQgY2lzX2xlbjsKCXUxNiBpb19iYXNlOwoJdTE2IGlvX2xlbjsKCgkvKgoJICogRmluZCB0aGUgQ2FyZEJ1cyBQQ0kgZGV2aWNlKHMpLgoJICovCglpZiAoKGRldmJ1c2ZuID0gcGNpX2ZpbmRfZGV2aWNlcyhzdXBwb3J0ZWQsIDApKSA8IDApIHsKCQlwcmludGYoIlRpIENhcmRCdXM6IG5vdCBmb3VuZFxuIik7CgkJcmV0dXJuIDE7Cgl9CgoJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2YnVzZm4sIFBDSV9ERVZJQ0VfSUQsICZkZXZfaWQpOwoKCWlmIChkZXZfaWQgPT0gMHhhYzU2KSB7CgkJZGVidWcoIkVuYWJsZSBQQ01DSUEgVGkgUENJMTUxMFxuIik7Cgl9IGVsc2UgewoJCWRlYnVnKCJFbmFibGUgUENNQ0lBIFRpIFBDSTE0MTBBXG4iKTsKCX0KCglwY21jaWFfY2lzX3B0ciA9IENGR19QQ01DSUFfQ0lTX1dJTjsKCWNpc19sZW4gPSBDRkdfUENNQ0lBX0NJU19XSU5fU0laRTsKCglpb19iYXNlID0gQ0ZHX1BDTUNJQV9JT19XSU47Cglpb19sZW4gPSBDRkdfUENNQ0lBX0lPX1dJTl9TSVpFOwoKCS8qCgkgKiBTZXR1cCB0aGUgUENJIGRldmljZS4KCSAqLwoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldmJ1c2ZuLCBQQ0lfQkFTRV9BRERSRVNTXzAsICZzb2NrZXRfYmFzZSk7Cglzb2NrZXRfYmFzZSAmPSB+MHhmOwoKCXNvY2tldF9zdGF0dXMgPSByZWFkbChzb2NrZXRfYmFzZSs4KTsKCWlmICgoc29ja2V0X3N0YXR1cyAmIDYpID09IDApIHsKCQlwcmludGYoIkNhcmQgUHJlc2VudDogIik7CgoJCXN3aXRjaCAoc29ja2V0X3N0YXR1cyAmIDB4M2MwMCkgewoKCQljYXNlIDB4NDAwOgoJCQlwcmludGYoIjVWICIpOwoJCQlicmVhazsKCQljYXNlIDB4ODAwOgoJCQlwcmludGYoIjMuM1YgIik7CgkJCWJyZWFrOwoJCWNhc2UgMHhjMDA6CgkJCXByaW50ZigiMy4zLzVWICIpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlwcmludGYoInVuc3VwcG9ydGVkIFZjYyAiKTsKCQkJYnJlYWs7CgkJfQoJCXN3aXRjaCAoc29ja2V0X3N0YXR1cyAmIDB4MzApIHsKCQljYXNlIDB4MTA6CgkJCXByaW50ZigiMTZiaXQgUEMtQ2FyZFxuIik7CgkJCWJyZWFrOwoJCWNhc2UgMHgyMDoKCQkJcHJpbnRmKCIzMmJpdCBDYXJkQnVzIENhcmRcbiIpOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlwcmludGYoIjhiaXQgUEMtQ2FyZFxuIik7CgkJCWJyZWFrOwoJCX0KCX0KCgoJd3JpdGViKDB4NDEsIHNvY2tldF9iYXNlICsgMHg4MDYpOyAvKiBFbmFibGUgSS9PIHdpbmRvdyAwIGFuZCBtZW1vcnkgd2luZG93IDAgKi8KCXdyaXRlYigweDBlLCBzb2NrZXRfYmFzZSArIDB4ODA3KTsgLyogUmVzZXQgSS9PIHdpbmRvdyBvcHRpb25zICovCgoJLyogQ2FyZWZ1bDogdGhlIGxpbnV4IHllbnRhIGRyaXZlciBkbyBub3Qgc2VlbSB0byByZXNldCB0aGUgb2Zmc2V0CgkgKiBpbiB0aGUgaS9vIHdpbmRvd3MsIHNvIGxlYXZpbmcgdGhlbSBub24temVybyBpcyBhIHByb2JsZW0gKi8KCgl3cml0ZWIoaW9fYmFzZSAmIDB4ZmYsIHNvY2tldF9iYXNlICsgMHg4MDgpOyAvKiBJL08gd2luZG93IDAgYmFzZSBhZGRyZXNzICovCgl3cml0ZWIoaW9fYmFzZT4+OCwgc29ja2V0X2Jhc2UgKyAweDgwOSk7Cgl3cml0ZWIoKGlvX2Jhc2UgKyBpb19sZW4gLSAxKSAmIDB4ZmYsIHNvY2tldF9iYXNlICsgMHg4MGEpOyAvKiBJL08gd2luZG93IDAgZW5kIGFkZHJlc3MgKi8KCXdyaXRlYigoaW9fYmFzZSArIGlvX2xlbiAtIDEpPj44LCBzb2NrZXRfYmFzZSArIDB4ODBiKTsKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODM2KTsgICAgICAvKiBJL08gd2luZG93IDAgb2Zmc2V0IGFkZHJlc3MgMHgwMDAgKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODM3KTsKCgoJd3JpdGViKChwY21jaWFfY2lzX3B0ciYweDAwMGZmMDAwKSA+PiAxMiwKCSAgICAgICBzb2NrZXRfYmFzZSArIDB4ODEwKTsgLyogTWVtb3J5IHdpbmRvdyAwIHN0YXJ0IGFkZHJlc3MgYml0cyAxOS0xMiAqLwoJd3JpdGViKChwY21jaWFfY2lzX3B0ciYweDAwZjAwMDAwKSA+PiAyMCwKCSAgICAgICBzb2NrZXRfYmFzZSArIDB4ODExKTsgIC8qIE1lbW9yeSB3aW5kb3cgMCBzdGFydCBhZGRyZXNzIGJpdHMgMjMtMjAgKi8KCXdyaXRlYigoKHBjbWNpYV9jaXNfcHRyK2Npc19sZW4tMSkgJiAweDAwMGZmMDAwKSA+PiAxMiwKCQlzb2NrZXRfYmFzZSArIDB4ODEyKTsgLyogTWVtb3J5IHdpbmRvdyAwIGVuZCBhZGRyZXNzIGJpdHMgMTktMTIqLwoJd3JpdGViKCgocGNtY2lhX2Npc19wdHIrY2lzX2xlbi0xKSAmIDB4MDBmMDAwMDApID4+IDIwLAoJCXNvY2tldF9iYXNlICsgMHg4MTMpOyAvKiBNZW1vcnkgd2luZG93IDAgZW5kIGFkZHJlc3MgYml0cyAyMy0yMCovCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgxNCk7IC8qIE1lbW9yeSB3aW5kb3cgMCBvZmZzZXQgYml0cyAxOS0xMiAqLwoJd3JpdGViKDB4NDAsIHNvY2tldF9iYXNlICsgMHg4MTUpOyAvKiBNZW1vcnkgd2luZG93IDAgb2Zmc2V0IGJpdHMgMjMtMjAgYW5kCgkJCQkJICAgICogb3B0aW9ucyAocmVhZC93cml0ZSwgYXR0cmlidXRlIGFjY2VzcykgKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODE2KTsgLyogRXhDQSBjYXJkLWRldGVjdCBhbmQgZ2VuZXJhbCBjb250cm9sICAqLwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MWUpOyAvKiBFeENBIGdsb2JhbCBjb250cm9sIChpbnRlcnJ1cHQgbW9kZXMpICovCgoJd3JpdGViKChwY21jaWFfY2lzX3B0ciAmIDB4ZmYwMDAwMDApID4+IDI0LAoJICAgICAgIHNvY2tldF9iYXNlICsgMHg4NDApOyAvKiBNZW1vcnkgd2luZG93IGFkZHJlc3MgYml0cyAzMS0yNCAqLwoKCgkvKiB0dXJuIG9mZiB2b2x0YWdlICovCglpZiAodm9sdGFnZV9zZXQoc2xvdCwgMCwgMCkpIHsKCQlyZXR1cm4gMTsKCX0KCgkvKiBFbmFibGUgZXh0ZXJuYWwgaGFyZHdhcmUgKi8KCWlmIChoYXJkd2FyZV9lbmFibGUoc2xvdCkpIHsKCQlyZXR1cm4gMTsKCX0KCglpZiAoY2hlY2tfaWRlX2RldmljZShzbG90LCBpZGVfYmFzZV9idXMpKSB7CgkJcmV0dXJuIDE7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgpzdGF0aWMgaW50IHBjbWNpYV9vZmYgKHZvaWQpCnsKCWludCBzbG90ID0gMDsKCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgwNik7IC8qIGRpc2FibGUgYWxsIEkvTyBhbmQgbWVtb3J5IHdpbmRvd3MgKi8KCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgwOCk7IC8qIEkvTyB3aW5kb3cgMCBiYXNlIGFkZHJlc3MgKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODA5KTsKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODBhKTsgLyogSS9PIHdpbmRvdyAwIGVuZCBhZGRyZXNzICovCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgwYik7Cgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgzNik7IC8qIEkvTyB3aW5kb3cgMCBvZmZzZXQgYWRkcmVzcyAgKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODM3KTsKCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgwYyk7IC8qIEkvTyB3aW5kb3cgMSBiYXNlIGFkZHJlc3MgICovCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgwZCk7Cgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgwZSk7IC8qIEkvTyB3aW5kb3cgMSBlbmQgYWRkcmVzcyAgKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODBmKTsKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODM4KTsgLyogSS9PIHdpbmRvdyAxIG9mZnNldCBhZGRyZXNzICAqLwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MzkpOwoKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODEwKTsgLyogTWVtb3J5IHdpbmRvdyAwIHN0YXJ0IGFkZHJlc3MgKi8KCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODExKTsKCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODEyKTsgLyogTWVtb3J5IHdpbmRvdyAwIGVuZCBhZGRyZXNzICAqLwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTMpOwoJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTQpOyAvKiBNZW1vcnkgd2luZG93IDAgb2Zmc2V0ICovCgl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgxNSk7CgoJd3JpdGViKDB4YzAsIHNvY2tldF9iYXNlICsgMHg4NDApOyAvKiBNZW1vcnkgd2luZG93IDAgcGFnZSBhZGRyZXNzICovCgoKCS8qIHR1cm4gb2ZmIHZvbHRhZ2UgKi8KCXZvbHRhZ2Vfc2V0KHNsb3QsIDAsIDApOwoKCS8qIGRpc2FibGUgZXh0ZXJuYWwgaGFyZHdhcmUgKi8KCXByaW50ZiAoIlNodXRkb3duIGFuZCBQb3dlcm9mZiBUaSBQQ0kxNDEwQVxuIik7CgloYXJkd2FyZV9kaXNhYmxlKHNsb3QpOwoKCXJldHVybiAwOwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCiNkZWZpbmUJTUFYX1RVUEVMX1NaCTUxMgojZGVmaW5lIE1BWF9GRUFUVVJFUwk0CmludCBpZGVfZGV2aWNlc19mb3VuZDsKc3RhdGljIGludCBjaGVja19pZGVfZGV2aWNlKGludCBzbG90LCBpbnQgaWRlX2Jhc2VfYnVzKQp7Cgl2b2xhdGlsZSB1Y2hhciAqaWRlbnQgPSBOVUxMOwoJdm9sYXRpbGUgdWNoYXIgKmZlYXR1cmVfcFtNQVhfRkVBVFVSRVNdOwoJdm9sYXRpbGUgdWNoYXIgKnAsICpzdGFydDsKCWludCBuX2ZlYXR1cmVzID0gMDsKCXVjaGFyIGZ1bmNfaWQgPSB+MDsKCXVjaGFyIGNvZGUsIGxlbjsKCXVzaG9ydCBjb25maWdfYmFzZSA9IDA7CglpbnQgZm91bmQgPSAwOwoJaW50IGk7Cgl1MzIgc29ja2V0X3N0YXR1czsKCglkZWJ1ZyAoIlBDTUNJQSBNRU06ICUwOFhcbiIsIHBjbWNpYV9jaXNfcHRyKTsKCglzb2NrZXRfc3RhdHVzID0gcmVhZGwoc29ja2V0X2Jhc2UrOCk7CgoJaWYgKChzb2NrZXRfc3RhdHVzICYgNikgIT0gMCB8fCAoc29ja2V0X3N0YXR1cyAmIDB4MjApICE9IDApIHsKCQlwcmludGYoIm5vIGNhcmQgb3IgQ2FyZEJ1cyBjYXJkXG4iKTsKCQlyZXR1cm4gMTsKCX0KCglzdGFydCA9IHAgPSAodm9sYXRpbGUgdWNoYXIgKikgcGNtY2lhX2Npc19wdHI7CgoJd2hpbGUgKChwIC0gc3RhcnQpIDwgTUFYX1RVUEVMX1NaKSB7CgoJCWNvZGUgPSAqcDsgcCArPSAyOwoKCQlpZiAoY29kZSA9PSAweEZGKSB7IC8qIEVuZCBvZiBjaGFpbiAqLwoJCQlicmVhazsKCQl9CgoJCWxlbiA9ICpwOyBwICs9IDI7CiNpZiBkZWZpbmVkKERFQlVHKSAmJiAoREVCVUcgPiAxKQoJCXsKCQkJdm9sYXRpbGUgdWNoYXIgKnEgPSBwOwoJCQlwcmludGYgKCJcblR1cGxlIGNvZGUgJTAyeCAgbGVuZ3RoICVkXG5cdERhdGE6IiwKCQkJCWNvZGUsIGxlbik7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKCQkJCXByaW50ZiAoIiAlMDJ4IiwgKnEpOwoJCQkJcSs9IDI7CgkJCX0KCQl9CiNlbmRpZgkvKiBERUJVRyAqLwoJCXN3aXRjaCAoY29kZSkgewoJCWNhc2UgQ0lTVFBMX1ZFUlNfMToKCQkJaWRlbnQgPSBwICsgNDsKCQkJYnJlYWs7CgkJY2FzZSBDSVNUUExfRlVOQ0lEOgoJCQkvKiBGaXggZm9yIGJyb2tlbiBTYW5EaXNrIHdoaWNoIG1heSBoYXZlIDB4ODAgYml0IHNldCAqLwoJCQlmdW5jX2lkID0gKnAgJiAweDdGOwoJCQlicmVhazsKCQljYXNlIENJU1RQTF9GVU5DRToKCQkJaWYgKG5fZmVhdHVyZXMgPCBNQVhfRkVBVFVSRVMpCgkJCQlmZWF0dXJlX3Bbbl9mZWF0dXJlcysrXSA9IHA7CgkJCWJyZWFrOwoJCWNhc2UgQ0lTVFBMX0NPTkZJRzoKCQkJY29uZmlnX2Jhc2UgPSAoKihwKzYpIDw8IDgpICsgKCoocCs0KSk7CgkJCWRlYnVnICgiXG4jIyBDb25maWdfYmFzZSA9ICUwNHggIyMjXG4iLCBjb25maWdfYmFzZSk7CgkJZGVmYXVsdDoKCQkJYnJlYWs7CgkJfQoJCXAgKz0gMiAqIGxlbjsKCX0KCglmb3VuZCA9IGlkZW50aWZ5KGlkZW50KTsKCglpZiAoZnVuY19pZCAhPSAoKHVjaGFyKX4wKSkgewoJCXByaW50X2Z1bmNpZCAoZnVuY19pZCk7CgoJCWlmIChmdW5jX2lkID09IENJU1RQTF9GVU5DSURfRklYRUQpCgkJCWZvdW5kID0gMTsKCQllbHNlCgkJCXJldHVybiAxOwkvKiBubyBkaXNrIGRyaXZlICovCgl9CgoJZm9yIChpPTA7IGk8bl9mZWF0dXJlczsgKytpKSB7CgkJcHJpbnRfZml4ZWQoZmVhdHVyZV9wW2ldKTsKCX0KCglpZiAoIWZvdW5kKSB7CgkJcHJpbnRmKCJ1bmtub3duIGNhcmQgdHlwZVxuIik7CgkJcmV0dXJuIDE7Cgl9CgoJLyogc2VsZWN0IGNvbmZpZyBpbmRleCAxICovCgl3cml0ZWIoMSwgcGNtY2lhX2Npc19wdHIgKyBjb25maWdfYmFzZSk7CgojaWYgMAoJcHJpbnRmKCJDb25maXVyYXRpb24gT3B0aW9uIFJlZ2lzdGVyOiAlMDJ4XG4iLCByZWFkYihwY21jaWFfY2lzX3B0ciArIGNvbmZpZ19iYXNlKSk7CglwcmludGYoIkNhcmQgQ29uZml1cmF0aW9uIGFuZCBTdGF0dXMgUmVnaXN0ZXI6ICUwMnhcbiIsIHJlYWRiKHBjbWNpYV9jaXNfcHRyICsgY29uZmlnX2Jhc2UgKyAyKSk7CglwcmludGYoIlBpbiBSZXBsYWNlbWVudCBSZWdpc3RlciBSZWdpc3RlcjogJTAyeFxuIiwgcmVhZGIocGNtY2lhX2Npc19wdHIgKyBjb25maWdfYmFzZSArIDQpKTsKCXByaW50ZigiU29ja2V0IGFuZCBDb3B5IFJlZ2lzdGVyOiAlMDJ4XG4iLCByZWFkYihwY21jaWFfY2lzX3B0ciArIGNvbmZpZ19iYXNlICsgNikpOwojZW5kaWYKCWlkZV9kZXZpY2VzX2ZvdW5kIHw9ICgxIDw8IChzbG90K2lkZV9iYXNlX2J1cykpOwoKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCB2b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCkKewoJdTMyIHNvY2tldF9jb250cm9sOwoJaW50IHJlZz0wOwoKCXN3aXRjaCAoc2xvdCkgewoJY2FzZSAwOgoJCXJlZyA9IHNvY2tldF9iYXNlICsgMHgxMDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIDE7Cgl9CgoJc29ja2V0X2NvbnRyb2wgPSAwOwoKCglzd2l0Y2ggKHZjYykgewoJY2FzZSA1MDoKCQlzb2NrZXRfY29udHJvbCB8PSAweDIwOwoJCWJyZWFrOwoJY2FzZSAzMzoKCQlzb2NrZXRfY29udHJvbCB8PSAweDMwOwoJCWJyZWFrOwoJY2FzZSAwOgoJZGVmYXVsdDoKCX0KCglzd2l0Y2ggKHZwcCkgewoJY2FzZSAxMjA6CgkJc29ja2V0X2NvbnRyb2wgfD0gMHgxOwoJCWJyZWFrOwoJY2FzZSA1MDoKCQlzb2NrZXRfY29udHJvbCB8PSAweDI7CgkJYnJlYWs7CgljYXNlIDMzOgoJCXNvY2tldF9jb250cm9sIHw9IDB4MzsKCQlicmVhazsKCWNhc2UgMDoKCWRlZmF1bHQ6Cgl9CgoJd3JpdGVsKHNvY2tldF9jb250cm9sLCByZWcpOwoKCWRlYnVnICgidm9sdGFnZV9zZXQ6IFRpIFBDSTE0MTBBIFNsb3QgJWQsIFZjYz0lZC4lZCwgVnBwPSVkLiVkXG4iLAoJCXNsb3QsIHZjYy8xMCwgdmNjJTEwLCB2cHAvMTAsIHZwcCUxMCk7CgoJdWRlbGF5KDUwMCk7CglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgaGFyZHdhcmVfZW5hYmxlKGludCBzbG90KQp7Cgl1MzIgc29ja2V0X3N0YXR1czsKCXUxNiBicmdfY3RybDsKCWludCBpc184MjM2NXNsOwoKCXNvY2tldF9zdGF0dXMgPSByZWFkbChzb2NrZXRfYmFzZSs4KTsKCglpZiAoKHNvY2tldF9zdGF0dXMgJiA2KSA9PSAwKSB7CgoJCXN3aXRjaCAoc29ja2V0X3N0YXR1cyAmIDB4M2MwMCkgewoKCQljYXNlIDB4NDAwOgoJCQlwcmludGYoIjVWICIpOwoJCQl2b2x0YWdlX3NldChzbG90LCA1MCwgMCk7CgkJCWJyZWFrOwoJCWNhc2UgMHg4MDA6CgkJCXZvbHRhZ2Vfc2V0KHNsb3QsIDMzLCAwKTsKCQkJYnJlYWs7CgkJY2FzZSAweGMwMDoKCQkJdm9sdGFnZV9zZXQoc2xvdCwgMzMsIDApOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQl2b2x0YWdlX3NldChzbG90LCAwLCAwKTsKCQkJYnJlYWs7CgkJfQoJfSBlbHNlIHsKCQl2b2x0YWdlX3NldChzbG90LCAwLCAwKTsKCX0KCglwY2lfcmVhZF9jb25maWdfd29yZChkZXZidXNmbiwgUENJX0JSSURHRV9DT05UUk9MLCAmYnJnX2N0cmwpOwoJYnJnX2N0cmwgJj0gflBDSV9CUklER0VfQ1RMX0JVU19SRVNFVDsKCXBjaV93cml0ZV9jb25maWdfd29yZChkZXZidXNmbiwgUENJX0JSSURHRV9DT05UUk9MLCBicmdfY3RybCk7Cglpc184MjM2NXNsID0gKChyZWFkYihzb2NrZXRfYmFzZSsweDgwMCkgJiAweDBmKSA9PSAyKTsKCXdyaXRlYihpc184MjM2NXNsPzB4OTA6MHg5OCwgc29ja2V0X2Jhc2UrMHg4MDIpOwoJd3JpdGViKDB4NjcsIHNvY2tldF9iYXNlKzB4ODAzKTsKCXVkZWxheSgxMDAwMDApOwojaWYgMAoJcHJpbnRmKCJFeENBIElkICUwMngsIENhcmQgU3RhdHVzICUwMngsIFBvd2VyIGNvbmZpZyAlMDJ4LCBJbnRlcnJ1cHQgQ29uZmlnICUwMngsIGJyaWRnZSBjb250cm9sICUwNHggJWRcbiIsCgkgICAgICAgcmVhZGIoc29ja2V0X2Jhc2UrMHg4MDApLCByZWFkYihzb2NrZXRfYmFzZSsweDgwMSksCgkgICAgICAgcmVhZGIoc29ja2V0X2Jhc2UrMHg4MDIpLCByZWFkYihzb2NrZXRfYmFzZSsweDgwMyksIGJyZ19jdHJsLCBpc184MjM2NXNsKTsKI2VuZGlmCgoJcmV0dXJuICgocmVhZGIoc29ja2V0X2Jhc2UrMHg4MDEpJjB4NmMpPT0weDZjKT8wOjE7Cn0KCgpzdGF0aWMgaW50IGhhcmR3YXJlX2Rpc2FibGUoaW50IHNsb3QpCnsKCXZvbHRhZ2Vfc2V0KHNsb3QsIDAsIDApOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHByaW50X2Z1bmNpZChpbnQgZnVuYykKewoJcHV0cyhpbmRlbnQpOwoJc3dpdGNoIChmdW5jKSB7CgljYXNlIENJU1RQTF9GVU5DSURfTVVMVEk6CgkJcHV0cygiIE11bHRpLUZ1bmN0aW9uIik7CgkJYnJlYWs7CgljYXNlIENJU1RQTF9GVU5DSURfTUVNT1JZOgoJCXB1dHMoIiBNZW1vcnkiKTsKCQlicmVhazsKCWNhc2UgQ0lTVFBMX0ZVTkNJRF9TRVJJQUw6CgkJcHV0cygiIFNlcmlhbCBQb3J0Iik7CgkJYnJlYWs7CgljYXNlIENJU1RQTF9GVU5DSURfUEFSQUxMRUw6CgkJcHV0cygiIFBhcmFsbGVsIFBvcnQiKTsKCQlicmVhazsKCWNhc2UgQ0lTVFBMX0ZVTkNJRF9GSVhFRDoKCQlwdXRzKCIgRml4ZWQgRGlzayIpOwoJCWJyZWFrOwoJY2FzZSBDSVNUUExfRlVOQ0lEX1ZJREVPOgoJCXB1dHMoIiBWaWRlbyBBZGFwdGVyIik7CgkJYnJlYWs7CgljYXNlIENJU1RQTF9GVU5DSURfTkVUV09SSzoKCQlwdXRzKCIgTmV0d29yayBBZGFwdGVyIik7CgkJYnJlYWs7CgljYXNlIENJU1RQTF9GVU5DSURfQUlNUzoKCQlwdXRzKCIgQUlNUyBDYXJkIik7CgkJYnJlYWs7CgljYXNlIENJU1RQTF9GVU5DSURfU0NTSToKCQlwdXRzKCIgU0NTSSBBZGFwdGVyIik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXB1dHMoIiBVbmtub3duIik7CgkJYnJlYWs7Cgl9CglwdXRzKCIgQ2FyZFxuIik7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIHByaW50X2ZpeGVkKHZvbGF0aWxlIHVjaGFyICpwKQp7CglpZiAocCA9PSBOVUxMKQoJCXJldHVybjsKCglwdXRzKGluZGVudCk7CgoJc3dpdGNoICgqcCkgewoJY2FzZSBDSVNUUExfRlVOQ0VfSURFX0lGQUNFOgoJCXsgICB1Y2hhciBpZmFjZSA9ICoocCsyKTsKCgkJCXB1dHMgKChpZmFjZSA9PSBDSVNUUExfSURFX0lOVEVSRkFDRSkgPyAiIElERSIgOiAiIHVua25vd24iKTsKCQkJcHV0cyAoIiBpbnRlcmZhY2UgIik7CgkJCWJyZWFrOwoJCX0KCWNhc2UgQ0lTVFBMX0ZVTkNFX0lERV9NQVNURVI6CgljYXNlIENJU1RQTF9GVU5DRV9JREVfU0xBVkU6CgkJewoJCQl1Y2hhciBmMSA9ICoocCsyKTsKCQkJdWNoYXIgZjIgPSAqKHArNCk7CgoJCQlwdXRzKChmMSAmIENJU1RQTF9JREVfU0lMSUNPTikgPyAiIFtzaWxpY29uXSIgOiAiIFtyb3RhdGluZ10iKTsKCgkJCWlmIChmMSAmIENJU1RQTF9JREVfVU5JUVVFKSB7CgkJCQlwdXRzKCIgW3VuaXF1ZV0iKTsKCQkJfQoKCQkJcHV0cygoZjEgJiBDSVNUUExfSURFX0RVQUwpID8gIiBbZHVhbF0iIDogIiBbc2luZ2xlXSIpOwoKCQkJaWYgKGYyICYgQ0lTVFBMX0lERV9IQVNfU0xFRVApIHsKCQkJCXB1dHMoIiBbc2xlZXBdIik7CgkJCX0KCgkJCWlmIChmMiAmIENJU1RQTF9JREVfSEFTX1NUQU5EQlkpIHsKCQkJCXB1dHMoIiBbc3RhbmRieV0iKTsKCQkJfQoKCQkJaWYgKGYyICYgQ0lTVFBMX0lERV9IQVNfSURMRSkgewoJCQkJcHV0cygiIFtpZGxlXSIpOwoJCQl9CgoJCQlpZiAoZjIgJiBDSVNUUExfSURFX0xPV19QT1dFUikgewoJCQkJcHV0cygiIFtsb3cgcG93ZXJdIik7CgkJCX0KCgkJCWlmIChmMiAmIENJU1RQTF9JREVfUkVHX0lOSElCSVQpIHsKCQkJCXB1dHMoIiBbcmVnIGluaGliaXRdIik7CgkJCX0KCgkJCWlmIChmMiAmIENJU1RQTF9JREVfSEFTX0lOREVYKSB7CgkJCQlwdXRzKCIgW2luZGV4XSIpOwoJCQl9CgoJCQlpZiAoZjIgJiBDSVNUUExfSURFX0lPSVMxNikgewoJCQkJcHV0cygiIFtJT2lzMTZdIik7CgkJCX0KCgkJCWJyZWFrOwoJCX0KCX0KCXB1dGMoJ1xuJyk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiNkZWZpbmUgTUFYX0lERU5UX0NIQVJTCQk2NAojZGVmaW5lCU1BWF9JREVOVF9GSUVMRFMJNAoKc3RhdGljIHVjaGFyICprbm93bl9jYXJkc1tdID0gewoJIkFSR09TWSBQblBJREUgRDUiLAoJTlVMTAp9OwoKc3RhdGljIGludCBpZGVudGlmeSh2b2xhdGlsZSB1Y2hhciAqcCkKewoJdWNoYXIgaWRfc3RyW01BWF9JREVOVF9DSEFSU107Cgl1Y2hhciBkYXRhOwoJdWNoYXIgKnQ7Cgl1Y2hhciAqKmNhcmQ7CglpbnQgaSwgZG9uZTsKCglpZiAocCA9PSBOVUxMKQoJCXJldHVybiAoMCk7CS8qIERvbid0IGtub3cgKi8KCgl0ID0gaWRfc3RyOwoJZG9uZSA9MDsKCglmb3IgKGk9MDsgaTw9NCAmJiAhZG9uZTsgKytpLCBwKz0yKSB7CgkJd2hpbGUgKChkYXRhID0gKnApICE9ICdcMCcpIHsKCQkJaWYgKGRhdGEgPT0gMHhGRikgewoJCQkJZG9uZSA9IDE7CgkJCQlicmVhazsKCQkJfQoJCQkqdCsrID0gZGF0YTsKCQkJaWYgKHQgPT0gJmlkX3N0cltNQVhfSURFTlRfQ0hBUlMtMV0pIHsKCQkJCWRvbmUgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCQkJcCArPSAyOwoJCX0KCQlpZiAoIWRvbmUpCgkJCSp0KysgPSAnICc7Cgl9CgkqdCA9ICdcMCc7Cgl3aGlsZSAoLS10ID4gaWRfc3RyKSB7CgkJaWYgKCp0ID09ICcgJykgewoJCQkqdCA9ICdcMCc7CgkJfSBlbHNlIHsKCQkJYnJlYWs7CgkJfQoJfQoJcHV0cyhpZF9zdHIpOwoJcHV0YygnXG4nKTsKCglmb3IgKGNhcmQ9a25vd25fY2FyZHM7ICpjYXJkOyArK2NhcmQpIHsKCQlkZWJ1ZyAoIiMjIENvbXBhcmUgYWdhaW5zdCBcIiVzXCJcbiIsICpjYXJkKTsKCQlpZiAoc3RyY21wKCpjYXJkLCBpZF9zdHIpID09IDApIHsJLyogZm91bmQhICovCgkJCWRlYnVnICgiIyMgQ0FSRCBGT1VORCAjI1xuIik7CgkJCXJldHVybiAxOwoJCX0KCX0KCglyZXR1cm4gMDsJLyogZG9uJ3Qga25vdyAqLwp9CgojZW5kaWYgLyogQ09ORklHX0lERV9USV9DQVJEQlVTICovCg==