LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX0RPU0VYRV9ICiNkZWZpbmUgX19XSU5FX0RPU0VYRV9ICgojaW5jbHVkZSA8c3RkYXJnLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5lL3dpbmRlZjE2LmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5udC5oIiAgICAgLyogZm9yIFBDT05URVhUICovCiNpbmNsdWRlICJ3aW5jb24uaCIgICAgLyogZm9yIE1PVVNFX0VWRU5UX1JFQ09SRCAqLwojaW5jbHVkZSAibWlzY2VtdS5oIgoKI2RlZmluZSBNQVhfRE9TX0RSSVZFUyAgMjYKCnN0cnVjdCBfRE9TRVZFTlQ7CgovKiBhbW91bnQgb2Ygc3BhY2UgcmVzZXJ2ZWQgZm9yIHJlbGF5IHN0YWNrICovCiNkZWZpbmUgRE9TVk1fUkVMQVlfREFUQV9TSVpFIDQwOTYKCi8qIHZhcmlvdXMgcmVhbC1tb2RlIGNvZGUgc3R1YnMgKi8Kc3RydWN0IERQTUlfc2VnbWVudHMKewogICAgV09SRCB3cmFwX3NlZzsKICAgIFdPUkQgeG1zX3NlZzsKICAgIFdPUkQgZHBtaV9zZWc7CiAgICBXT1JEIGRwbWlfc2VsOwogICAgV09SRCBpbnQ0OF9zZWw7CiAgICBXT1JEIGludDE2X3NlbDsKICAgIFdPUkQgcmVsYXlfY29kZV9zZWw7CiAgICBXT1JEIHJlbGF5X2RhdGFfc2VsOwp9OwoKLyogNDgtYml0IHNlZ21lbnRlZCBwb2ludGVycyBmb3IgRE9TIERQTUkzMiAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgV09SRCAgc2VsZWN0b3I7CiAgRFdPUkQgb2Zmc2V0Owp9IFNFR1BUUjQ4LCBGQVJQUk9DNDg7CgojZGVmaW5lIERPU0NPTkZfTUVNX0hJR0ggICAgICAgIDB4MDAwMQojZGVmaW5lIERPU0NPTkZfTUVNX1VNQiAgICAgICAgIDB4MDAwMgojZGVmaW5lIERPU0NPTkZfTlVNTE9DSyAgICAgICAgIDB4MDAwNAojZGVmaW5lIERPU0NPTkZfS0VZQl9DT05WICAgICAgIDB4MDAwOAoKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciBsYXN0ZHJpdmU7CiAgICBpbnQgYnJrX2ZsYWc7CiAgICBpbnQgZmlsZXM7CiAgICBpbnQgc3RhY2tzX25yOwogICAgaW50IHN0YWNrc19zejsKICAgIGludCBidWY7CiAgICBpbnQgYnVmMjsKICAgIGludCBmY2JzOwogICAgaW50IGZsYWdzOwogICAgY2hhciAqc2hlbGw7CiAgICBjaGFyICpjb3VudHJ5Owp9IERPU0NPTkY7Cgp0eXBlZGVmIHZvaWQgKCpET1NSRUxBWSkoQ09OVEVYVDg2Kix2b2lkKik7CnR5cGVkZWYgdm9pZCAoV0lOQVBJICpSTUNCUFJPQykoQ09OVEVYVDg2Kik7CnR5cGVkZWYgdm9pZCAoV0lOQVBJICpJTlRQUk9DKShDT05URVhUODYqKTsKCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1JFQUxUSU1FIDAgIC8qIElSUTAgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfS0VZQk9BUkQgMSAgLyogSVJRMSAqLwojZGVmaW5lIERPU19QUklPUklUWV9WR0EgICAgICAyICAvKiBJUlE5ICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX01PVVNFICAgIDUgIC8qIElSUTEyICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1NFUklBTCAgIDEwIC8qIElSUTQgKi8KCmV4dGVybiBXT1JEIERPU1ZNX3BzcDsgICAgIC8qIHBzcCBvZiBjdXJyZW50IERPUyB0YXNrICovCmV4dGVybiBXT1JEIERPU1ZNX3JldHZhbDsgIC8qIHJldHVybiB2YWx1ZSBvZiBwcmV2aW91cyBET1MgdGFzayAqLwpleHRlcm4gc3RydWN0IERQTUlfc2VnbWVudHMgKkRPU1ZNX2RwbWlfc2VnbWVudHM7CgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChIQVZFX1NZU19WTTg2X0gpCiMgZGVmaW5lIE1aX1NVUFBPUlRFRAojZW5kaWYgLyogbGludXgtaTM4NiAqLwoKLyoKICogRGVjbGFyZSBzb21lIENPTlRFWFQ4Ni5FRmxhZ3MgYml0cy4KICogSUZfTUFTSyBpcyBvbmx5IHB1c2hlZCBpbnRvIHJlYWwgbW9kZSBzdGFjay4KICovCiNkZWZpbmUgVjg2X0ZMQUcgMHgwMDAyMDAwMAojZGVmaW5lIElGX01BU0sgIDB4MDAwMDAyMDAKI2RlZmluZSBWSUZfTUFTSyAweDAwMDgwMDAwCiNkZWZpbmUgVklQX01BU0sgMHgwMDEwMDAwMAoKI2RlZmluZSBBRERfTE9XT1JEKGR3LHZhbCkgICgoZHcpID0gKChkdykgJiAweGZmZmYwMDAwKSB8IExPV09SRCgoRFdPUkQpKGR3KSsodmFsKSkpCgojZGVmaW5lIFBUUl9SRUFMX1RPX0xJTihzZWcsb2ZmKSAoKHZvaWQqKSgoKHVuc2lnbmVkIGludCkoc2VnKSA8PCA0KSArIExPV09SRChvZmYpKSkKCi8qIE5PVEU6IEludGVycnVwdHMgbWlnaHQgZ2V0IGNhbGxlZCBmcm9tIGZvdXIgbW9kZXM6IHJlYWwgbW9kZSwgMTYtYml0LAogKiAgICAgICAzMi1iaXQgc2VnbWVudGVkIChEUE1JMzIpIGFuZCAzMi1iaXQgbGluZWFyICh2aWEgRGV2aWNlSW9Db250cm9sKS4KICogICAgICAgRm9yIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIHBvaW50ZXIKICogICAgICAgcGFyYW1ldGVycywgaW50ZXJydXB0IGhhbmRsZXJzIHNob3VsZCB1c2UgQ1RYX1NFR19PRkZfVE9fTElOIHdpdGgKICogICAgICAgdGhlIGNvbnRlbnRzIG9mIGEgc2VnbWVudCByZWdpc3RlciBhcyBzZWNvbmQgYW5kIHRoZSBjb250ZW50cyBvZgogKiAgICAgICBhICozMi1iaXQqIGdlbmVyYWwgcmVnaXN0ZXIgYXMgdGhpcmQgcGFyYW1ldGVyLCBlLmcuCiAqICAgICAgICAgIENUWF9TRUdfT0ZGX1RPX0xJTiggY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLCBFRFhfcmVnKGNvbnRleHQpICkKICogICAgICAgVGhpcyB3aWxsIGdlbmVyYXRlIGEgbGluZWFyIHBvaW50ZXIgaW4gYWxsIHRocmVlIGNhc2VzOgogKiAgICAgICAgIFJlYWwtTW9kZTogICBTZWcqMTYgKyBMT1dPUkQoT2Zmc2V0KQogKiAgICAgICAgIDE2LWJpdDogICAgICBjb252ZXJ0IChTZWcsIExPV09SRChPZmZzZXQpKSB0byBsaW5lYXIKICogICAgICAgICAzMi1iaXQgc2VnbWVudGVkOiBjb252ZXJ0IChTZWcsIE9mZnNldCkgdG8gbGluZWFyCiAqICAgICAgICAgMzItYml0IGxpbmVhcjogICAgdXNlIE9mZnNldCBhcyBsaW5lYXIgYWRkcmVzcyAoRGV2aWNlSW9Db250cm9sISkKICoKICogICAgICAgUmVhbC1tb2RlIGlzIHJlY29nbml6ZWQgYnkgY2hlY2tpbmcgdGhlIFY4NiBiaXQgaW4gdGhlIGZsYWdzIHJlZ2lzdGVyLAogKiAgICAgICAzMi1iaXQgbGluZWFyIG1vZGUgaXMgcmVjb2duaXplZCBieSBjaGVja2luZyB3aGV0aGVyICdzZWcnIGlzCiAqICAgICAgIGEgc3lzdGVtIHNlbGVjdG9yICgwIGNvdW50cyBhbHNvIGFzIDMyLWJpdCBzZWdtZW50KSBhbmQgMzItYml0CiAqICAgICAgIHNlZ21lbnRlZCBtb2RlIGlzIHJlY29nbml6ZWQgYnkgY2hlY2tpbmcgd2hldGhlciAnc2VnJyBpcyAzMi1iaXQKICogICAgICAgc2VsZWN0b3Igd2hpY2ggaXMgbmVpdGhlciBzeXN0ZW0gc2VsZWN0b3Igbm9yIHplcm8uCiAqLwojZGVmaW5lIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LHNlZyxvZmYpIFwKICAgIChJU1Y4Nihjb250ZXh0KSA/IFBUUl9SRUFMX1RPX0xJTigoc2VnKSwob2ZmKSkgOiB3aW5lX2xkdF9nZXRfcHRyKChzZWcpLChvZmYpKSkKCiNkZWZpbmUgSU5UX0JBUkYoY29udGV4dCxudW0pIFwKICAgIEVSUiggImludCV4OiB1bmtub3duL25vdCBpbXBsZW1lbnRlZCBwYXJhbWV0ZXJzOlxuIiBcCiAgICAgICAgICAgICAgICAgICAgICJpbnQleDogQVggJTA0eCwgQlggJTA0eCwgQ1ggJTA0eCwgRFggJTA0eCwgIiBcCiAgICAgICAgICAgICAgICAgICAgICJTSSAlMDR4LCBESSAlMDR4LCBEUyAlMDR4LCBFUyAlMDR4XG4iLCBcCiAgICAgICAgICAgICAobnVtKSwgKG51bSksIExPV09SRCgoY29udGV4dCktPkVheCksIExPV09SRCgoY29udGV4dCktPkVieCksIFwKICAgICAgICAgICAgIExPV09SRCgoY29udGV4dCktPkVjeCksIExPV09SRCgoY29udGV4dCktPkVkeCksIExPV09SRCgoY29udGV4dCktPkVzaSksIFwKICAgICAgICAgICAgIExPV09SRCgoY29udGV4dCktPkVkaSksIChXT1JEKShjb250ZXh0KS0+U2VnRHMsIChXT1JEKShjb250ZXh0KS0+U2VnRXMgKQoKLyogTWFjcm9zIGZvciBlYXNpZXIgYWNjZXNzIHRvIGkzODYgY29udGV4dCByZWdpc3RlcnMgKi8KCiNkZWZpbmUgQVhfcmVnKGNvbnRleHQpICAgICAgKChXT1JEKShjb250ZXh0KS0+RWF4KQojZGVmaW5lIEJYX3JlZyhjb250ZXh0KSAgICAgICgoV09SRCkoY29udGV4dCktPkVieCkKI2RlZmluZSBDWF9yZWcoY29udGV4dCkgICAgICAoKFdPUkQpKGNvbnRleHQpLT5FY3gpCiNkZWZpbmUgRFhfcmVnKGNvbnRleHQpICAgICAgKChXT1JEKShjb250ZXh0KS0+RWR4KQojZGVmaW5lIFNJX3JlZyhjb250ZXh0KSAgICAgICgoV09SRCkoY29udGV4dCktPkVzaSkKI2RlZmluZSBESV9yZWcoY29udGV4dCkgICAgICAoKFdPUkQpKGNvbnRleHQpLT5FZGkpCgojZGVmaW5lIEFMX3JlZyhjb250ZXh0KSAgICAgICgoQllURSkoY29udGV4dCktPkVheCkKI2RlZmluZSBBSF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKChjb250ZXh0KS0+RWF4ID4+IDgpKQojZGVmaW5lIEJMX3JlZyhjb250ZXh0KSAgICAgICgoQllURSkoY29udGV4dCktPkVieCkKI2RlZmluZSBCSF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKChjb250ZXh0KS0+RWJ4ID4+IDgpKQojZGVmaW5lIENMX3JlZyhjb250ZXh0KSAgICAgICgoQllURSkoY29udGV4dCktPkVjeCkKI2RlZmluZSBDSF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKChjb250ZXh0KS0+RWN4ID4+IDgpKQojZGVmaW5lIERMX3JlZyhjb250ZXh0KSAgICAgICgoQllURSkoY29udGV4dCktPkVkeCkKI2RlZmluZSBESF9yZWcoY29udGV4dCkgICAgICAoKEJZVEUpKChjb250ZXh0KS0+RWR4ID4+IDgpKQoKI2RlZmluZSBTRVRfQ0ZMQUcoY29udGV4dCkgICAoKGNvbnRleHQpLT5FRmxhZ3MgfD0gMHgwMDAxKQojZGVmaW5lIFJFU0VUX0NGTEFHKGNvbnRleHQpICgoY29udGV4dCktPkVGbGFncyAmPSB+MHgwMDAxKQojZGVmaW5lIFNFVF9aRkxBRyhjb250ZXh0KSAgICgoY29udGV4dCktPkVGbGFncyB8PSAweDAwNDApCiNkZWZpbmUgUkVTRVRfWkZMQUcoY29udGV4dCkgKChjb250ZXh0KS0+RUZsYWdzICY9IH4weDAwNDApCiNkZWZpbmUgSVNWODYoY29udGV4dCkgICAgICAgKChjb250ZXh0KS0+RUZsYWdzICYgMHgwMDAyMDAwMCkKCiNkZWZpbmUgU0VUX0FYKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVheCA9ICgoY29udGV4dCktPkVheCAmIH4weGZmZmYpIHwgKFdPUkQpKHZhbCkpKQojZGVmaW5lIFNFVF9CWChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FYnggPSAoKGNvbnRleHQpLT5FYnggJiB+MHhmZmZmKSB8IChXT1JEKSh2YWwpKSkKI2RlZmluZSBTRVRfQ1goY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWN4ID0gKChjb250ZXh0KS0+RWN4ICYgfjB4ZmZmZikgfCAoV09SRCkodmFsKSkpCiNkZWZpbmUgU0VUX0RYKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVkeCA9ICgoY29udGV4dCktPkVkeCAmIH4weGZmZmYpIHwgKFdPUkQpKHZhbCkpKQojZGVmaW5lIFNFVF9TSShjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5Fc2kgPSAoKGNvbnRleHQpLT5Fc2kgJiB+MHhmZmZmKSB8IChXT1JEKSh2YWwpKSkKI2RlZmluZSBTRVRfREkoY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWRpID0gKChjb250ZXh0KS0+RWRpICYgfjB4ZmZmZikgfCAoV09SRCkodmFsKSkpCgojZGVmaW5lIFNFVF9BTChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FYXggPSAoKGNvbnRleHQpLT5FYXggJiB+MHhmZikgfCAoQllURSkodmFsKSkpCiNkZWZpbmUgU0VUX0JMKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVieCA9ICgoY29udGV4dCktPkVieCAmIH4weGZmKSB8IChCWVRFKSh2YWwpKSkKI2RlZmluZSBTRVRfQ0woY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWN4ID0gKChjb250ZXh0KS0+RWN4ICYgfjB4ZmYpIHwgKEJZVEUpKHZhbCkpKQojZGVmaW5lIFNFVF9ETChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FZHggPSAoKGNvbnRleHQpLT5FZHggJiB+MHhmZikgfCAoQllURSkodmFsKSkpCgojZGVmaW5lIFNFVF9BSChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FYXggPSAoKGNvbnRleHQpLT5FYXggJiB+MHhmZjAwKSB8ICgoKEJZVEUpKHZhbCkpIDw8IDgpKSkKI2RlZmluZSBTRVRfQkgoY29udGV4dCx2YWwpICAoKHZvaWQpKChjb250ZXh0KS0+RWJ4ID0gKChjb250ZXh0KS0+RWJ4ICYgfjB4ZmYwMCkgfCAoKChCWVRFKSh2YWwpKSA8PCA4KSkpCiNkZWZpbmUgU0VUX0NIKGNvbnRleHQsdmFsKSAgKCh2b2lkKSgoY29udGV4dCktPkVjeCA9ICgoY29udGV4dCktPkVjeCAmIH4weGZmMDApIHwgKCgoQllURSkodmFsKSkgPDwgOCkpKQojZGVmaW5lIFNFVF9ESChjb250ZXh0LHZhbCkgICgodm9pZCkoKGNvbnRleHQpLT5FZHggPSAoKGNvbnRleHQpLT5FZHggJiB+MHhmZjAwKSB8ICgoKEJZVEUpKHZhbCkpIDw8IDgpKSkKCi8qIG1vZHVsZS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBNWl9Mb2FkSW1hZ2UoIExQQ1NUUiBmaWxlbmFtZSwgSEFORExFIGhGaWxlICk7CmV4dGVybiBCT09MIFdJTkFQSSBNWl9FeGVjKCBDT05URVhUODYgKmNvbnRleHQsIExQQ1NUUiBmaWxlbmFtZSwgQllURSBmdW5jLCBMUFZPSUQgcGFyYW1ibGsgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIE1aX0V4aXQoIENPTlRFWFQ4NiAqY29udGV4dCwgQk9PTCBjc19wc3AsIFdPUkQgcmV0dmFsICk7CmV4dGVybiBCT09MIFdJTkFQSSBNWl9DdXJyZW50KCB2b2lkICk7CmV4dGVybiB2b2lkIFdJTkFQSSBNWl9BbGxvY0RQTUlUYXNrKCB2b2lkICk7CmV4dGVybiB2b2lkIFdJTkFQSSBNWl9SdW5JblRocmVhZCggUEFQQ0ZVTkMgcHJvYywgVUxPTkdfUFRSIGFyZyApOwpleHRlcm4gQk9PTCBET1NWTV9Jc1dpbjE2KHZvaWQpOwoKLyogZG9zdm0uYyAqLwpleHRlcm4gdm9pZCBET1NWTV9TZW5kUXVldWVkRXZlbnRzKCBDT05URVhUODYgKiApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fQWNrbm93bGVkZ2VJUlEoIENPTlRFWFQ4NiAqICk7CmV4dGVybiBJTlQgV0lOQVBJIERPU1ZNX0VudGVyKCBDT05URVhUODYgKmNvbnRleHQgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1dhaXQoIENPTlRFWFQ4NiAqICk7CmV4dGVybiBEV09SRCBXSU5BUEkgRE9TVk1fTG9vcCggSEFORExFIGhUaHJlYWQgKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX1F1ZXVlRXZlbnQoIElOVCBpcnEsIElOVCBwcmlvcml0eSwgRE9TUkVMQVkgcmVsYXksIExQVk9JRCBkYXRhICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9QSUNfaW9wb3J0X291dCggV09SRCBwb3J0LCBCWVRFIHZhbCApOwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fU2V0VGltZXIoIFVJTlQgdGlja3MgKTsKZXh0ZXJuIFVJTlQgV0lOQVBJIERPU1ZNX0dldFRpbWVyKCB2b2lkICk7CmV4dGVybiBCSU9TREFUQSAgICpET1NWTV9CaW9zRGF0YSggdm9pZCApOwoKLyogZGV2aWNlcy5jICovCmV4dGVybiB2b2lkIERPU0RFVl9JbnN0YWxsRE9TRGV2aWNlcyh2b2lkKTsKZXh0ZXJuIERXT1JEIERPU0RFVl9Db25zb2xlKHZvaWQpOwpleHRlcm4gRFdPUkQgRE9TREVWX0ZpbmRDaGFyRGV2aWNlKGNoYXIqbmFtZSk7CmV4dGVybiBpbnQgRE9TREVWX1BlZWsoRFdPUkQgZGV2LCBCWVRFKmRhdGEpOwpleHRlcm4gaW50IERPU0RFVl9SZWFkKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKTsKZXh0ZXJuIGludCBET1NERVZfV3JpdGUoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4sIGludCB2ZXJpZnkpOwpleHRlcm4gaW50IERPU0RFVl9Jb2N0bFJlYWQoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pOwpleHRlcm4gaW50IERPU0RFVl9Jb2N0bFdyaXRlKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKTsKZXh0ZXJuIHZvaWQgRE9TREVWX1NldFNoYXJpbmdSZXRyeShXT1JEIGRlbGF5LCBXT1JEIGNvdW50KTsKZXh0ZXJuIFNFR1BUUiBET1NERVZfR2V0TE9MKEJPT0wgdjg2KTsKCi8qIGRtYS5jICovCmV4dGVybiBpbnQgRE1BX1RyYW5zZmVyKGludCBjaGFubmVsLGludCByZXFsZW5ndGgsdm9pZCogYnVmZmVyKTsKZXh0ZXJuIHZvaWQgRE1BX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKTsKZXh0ZXJuIEJZVEUgRE1BX2lvcG9ydF9pbiggV09SRCBwb3J0ICk7CgovKiBkb3Nhc3BpLmMgKi8Kdm9pZCBXSU5BUEkgRE9TVk1fQVNQSUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBkb3Njb25mLmMgKi8KRE9TQ09ORiAqRE9TQ09ORl9HZXRDb25maWcoIHZvaWQgKTsKCi8qIGZwdS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzNEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzNUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzNkhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzN0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzOEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzOUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzYUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzYkhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzY0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzZEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzZUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBoaW1lbS5jICovCmV4dGVybiB2b2lkIERPU1ZNX0luaXRTZWdtZW50cyh2b2lkKTsKZXh0ZXJuIExQVk9JRCBET1NWTV9BbGxvY1VNQihEV09SRCk7CmV4dGVybiBMUFZPSUQgRE9TVk1fQWxsb2NDb2RlVU1CKERXT1JELCBXT1JEICosIFdPUkQgKik7CmV4dGVybiBMUFZPSUQgRE9TVk1fQWxsb2NEYXRhVU1CKERXT1JELCBXT1JEICosIFdPUkQgKik7CgovKiBpbnQwOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQwOUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQwOVNlbmRTY2FuKEJZVEUgc2NhbixCWVRFIGFzY2lpKTsKZXh0ZXJuIEJZVEUgV0lOQVBJIERPU1ZNX0ludDA5UmVhZFNjYW4oQllURSphc2NpaSk7CgovKiBpbnQxMC5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxMEhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9QdXRDaGFyKEJZVEUgYXNjaWkpOwoKLyogaW50MTEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTFIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTIuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTJIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTMuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTNIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTUuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTVIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MWEuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MWFIYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50MTYuYyAqLwpleHRlcm4gdm9pZCBXSU5BUEkgRE9TVk1fSW50MTZIYW5kbGVyKENPTlRFWFQ4NiopOwpleHRlcm4gQk9PTCBXSU5BUEkgRE9TVk1fSW50MTZSZWFkQ2hhciggQllURSAqLCBCWVRFICosIENPTlRFWFQ4NiAqICk7CmV4dGVybiBpbnQgV0lOQVBJIERPU1ZNX0ludDE2QWRkQ2hhcihCWVRFIGFzY2lpLEJZVEUgc2Nhbik7CgovKiBpbnQxNy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxN0hhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQxOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQxOUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyMC5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyMEhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyMS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyMUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyNS5jICovCkJPT0wgRE9TVk1fUmF3UmVhZCggQllURSwgRFdPUkQsIERXT1JELCBCWVRFICosIEJPT0wgKTsKdm9pZCBXSU5BUEkgRE9TVk1fSW50MjVIYW5kbGVyKCBDT05URVhUODYgKiApOwoKLyogaW50MjYuYyAqLwpCT09MIERPU1ZNX1Jhd1dyaXRlKCBCWVRFLCBEV09SRCwgRFdPUkQsIEJZVEUgKiwgQk9PTCApOwp2b2lkIFdJTkFQSSBET1NWTV9JbnQyNkhhbmRsZXIoIENPTlRFWFQ4NiAqICk7CgovKiBpbnQyOS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyOUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyYS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyYUhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQyZi5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQyZkhhbmRsZXIoQ09OVEVYVDg2Kik7CgovKiBpbnQzMS5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzMUhhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9SYXdNb2RlU3dpdGNoSGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIEJPT0wgRE9TVk1fSXNEb3MzMih2b2lkKTsKZXh0ZXJuIEZBUlBST0MxNiBXSU5BUEkgRFBNSV9BbGxvY0ludGVybmFsUk1DQihSTUNCUFJPQyk7CmV4dGVybiB2b2lkIFdJTkFQSSBEUE1JX0ZyZWVJbnRlcm5hbFJNQ0IoRkFSUFJPQzE2KTsKZXh0ZXJuIGludCBEUE1JX0NhbGxSTVByb2MoQ09OVEVYVDg2KixMUFdPUkQsaW50LGludCk7CmV4dGVybiBCT09MIERPU1ZNX0NoZWNrV3JhcHBlcnMoQ09OVEVYVDg2Kik7CgovKiBpbnQzMy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM0hhbmRsZXIoQ09OVEVYVDg2Kik7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9JbnQzM01lc3NhZ2UoVUlOVCxXUEFSQU0sTFBBUkFNKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDMzQ29uc29sZShNT1VTRV9FVkVOVF9SRUNPUkQqKTsKCi8qIGludDQxLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDQxSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDRiLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDRiSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDVjLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDVjSGFuZGxlcihDT05URVhUODYqKTsKCi8qIGludDY3LmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDY3SGFuZGxlcihDT05URVhUODYqKTsKZXh0ZXJuIHZvaWQgV0lOQVBJIEVNU19Jb2N0bF9IYW5kbGVyKENPTlRFWFQ4NiopOwoKLyogaW50ZXJydXB0cy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9DYWxsQnVpbHRpbkhhbmRsZXIoIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiB2b2lkIFdJTkFQSSBET1NWTV9FbXVsYXRlSW50ZXJydXB0UE0oIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiBCT09MIFdJTkFQSSBET1NWTV9FbXVsYXRlSW50ZXJydXB0Uk0oIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiBGQVJQUk9DMTYgICBET1NWTV9HZXRQTUhhbmRsZXIxNiggQllURSApOwpleHRlcm4gRkFSUFJPQzQ4ICAgRE9TVk1fR2V0UE1IYW5kbGVyNDgoIEJZVEUgKTsKZXh0ZXJuIEZBUlBST0MxNiAgIERPU1ZNX0dldFJNSGFuZGxlciggQllURSApOwpleHRlcm4gdm9pZCAgICAgICAgRE9TVk1fSGFyZHdhcmVJbnRlcnJ1cHRQTSggQ09OVEVYVDg2ICosIEJZVEUgKTsKZXh0ZXJuIHZvaWQgICAgICAgIERPU1ZNX0hhcmR3YXJlSW50ZXJydXB0Uk0oIENPTlRFWFQ4NiAqLCBCWVRFICk7CmV4dGVybiB2b2lkICAgICAgICBET1NWTV9TZXRQTUhhbmRsZXIxNiggQllURSwgRkFSUFJPQzE2ICk7CmV4dGVybiB2b2lkICAgICAgICBET1NWTV9TZXRQTUhhbmRsZXI0OCggQllURSwgRkFSUFJPQzQ4ICk7CmV4dGVybiB2b2lkICAgICAgICBET1NWTV9TZXRSTUhhbmRsZXIoIEJZVEUsIEZBUlBST0MxNiApOwoKLyogcmVsYXkuYyAqLwp2b2lkIERPU1ZNX1JlbGF5SGFuZGxlciggQ09OVEVYVDg2ICogKTsKdm9pZCBET1NWTV9CdWlsZENhbGxGcmFtZSggQ09OVEVYVDg2ICosIERPU1JFTEFZLCBMUFZPSUQgKTsKCi8qIHNvdW5kYmxhc3Rlci5jICovCmV4dGVybiB2b2lkIFNCX2lvcG9ydF9vdXQoIFdPUkQgcG9ydCwgQllURSB2YWwgKTsKZXh0ZXJuIEJZVEUgU0JfaW9wb3J0X2luKCBXT1JEIHBvcnQgKTsKCi8qIHBwZGV2LmMgKi8KZXh0ZXJuIEJPT0wgSU9fcHBfb3V0cChpbnQgcG9ydCwgRFdPUkQqIHJlcyk7CmV4dGVybiBpbnQgSU9fcHBfaW5wKGludCBwb3J0LCBEV09SRCogcmVzKTsKZXh0ZXJuIGNoYXIgSU9fcHBfaW5pdCh2b2lkKTsKCi8qIHRpbWVyLmMgKi8KZXh0ZXJuIHZvaWQgV0lOQVBJIERPU1ZNX0ludDA4SGFuZGxlcihDT05URVhUODYqKTsKCi8qIHhtcy5jICovCmV4dGVybiB2b2lkIFdJTkFQSSBYTVNfSGFuZGxlcihDT05URVhUODYqKTsKCiNlbmRpZiAvKiBfX1dJTkVfRE9TRVhFX0ggKi8K