LyoKICogbGludXgvZHJpdmVycy92aWRlby92aXJnZWZiLmMgLS0gQ3liZXJWaXNpb242NC8zRCBmcmFtZSBidWZmZXIgZGV2aWNlCiAqCiAqICAgIENvcHlyaWdodCAoQykgMTk5NyBBbmRy6SBIZXluYXR6CiAqCiAqCiAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgQ3liZXJWaXNpb24gZnJhbWUgYnVmZmVyIGRldmljZSAoY3liZXJmYi5jKToKICoKICogICAgQ29weXJpZ2h0IChDKSAxOTk2IE1hcnRpbiBBcGVsCiAqICAgICAgICAgICAgICAgICAgICAgICBHZWVydCBVeXR0ZXJob2V2ZW4KICoKICogWm9ycm8gSUkgYWRkaXRpb25zIDoKICoKICogICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgQ2hyaXN0aWFuIFQuIFN0ZWlnaWVzCiAqCiAqIEluaXRpYWxpemF0aW9uIGFkZGl0aW9ucyA6CiAqCiAqICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAwIEtlbiBUeWxlcgogKgogKiBQYXJ0cyBvZiB0aGUgSW5pdGlhbGl6YXRpb24gY29kZSBhcmUgYmFzZWQgb24gQ3liZXJmYi5jIGJ5IEFsbGFuIEJhaXIsCiAqIGFuZCBvbiB0aGUgTmV0QlNEIEN5YmVyVmlzaW9uNjQgZnJhbWUgYnVmZmVyIGRyaXZlciBieSBNaWNoYWVsIFRlc2tlIHdobyBnYXZlCiAqIHBlcm1pc3Npb24gZm9yIGl0cyB1c2UuCiAqCiAqIE1hbnkgdGhhbmtzIHRvIEZyYW5rIE1hcmlhayBmb3IgaGlzIGFzc2lzdGFuY2Ugd2l0aCBaT1JSTyAyIGFjY2VzcyBhbmQgb3RoZXIKICogbXlzdGVyaWVzLgogKgogKgogKgogKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogKiBmb3IgbW9yZSBkZXRhaWxzLgogKi8KCiN1bmRlZiBWSVJHRUZCREVCVUcKI3VuZGVmIFZJUkdFRkJEVU1QCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvem9ycm8uaD4KI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2lycS5oPgojaW5jbHVkZSA8dmlkZW8vZmJjb24uaD4KI2luY2x1ZGUgPHZpZGVvL2ZiY29uLWNmYjguaD4KI2luY2x1ZGUgPHZpZGVvL2ZiY29uLWNmYjE2Lmg+CiNpbmNsdWRlIDx2aWRlby9mYmNvbi1jZmIzMi5oPgoKI2luY2x1ZGUgInZpcmdlZmIuaCIKCiNpZmRlZiBWSVJHRUZCREVCVUcKI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwgX19GVU5DVElPTl9fICwgIyMgYXJncykKI2Vsc2UKI2RlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikKI2VuZGlmCgojaWZkZWYgVklSR0VGQkRVTVAKc3RhdGljIHZvaWQgY3Y2NF9kdW1wKHZvaWQpOwojZGVmaW5lIERVTVAgY3Y2NF9kdW1wKCkKI2Vsc2UKI2RlZmluZSBEVU1QCiNlbmRpZgoKLyoKICoJTWFjcm9zIGZvciByZWdpc3RlciBhY2Nlc3MgYW5kIHpvcnJvIGNvbnRyb2wKICovCgpzdGF0aWMgaW5saW5lIHZvaWQgbWJfaW5saW5lKHZvaWQpIHsgbWIoKTsgfQkvKiBmb3IgdXNlIGluIGNvbW1hIGV4cHJlc3Npb25zICovCgovKiBTZXQgem9ycm8gMiBtYXAgKi8KCiNkZWZpbmUgU2VsZWN0SU8gXAoJbWIoKTsgXAoJaWYgKG9uX3pvcnJvMikgeyBcCgkJKCoodm9sYXRpbGUgdTE2ICopKCh1OCAqKSh2Y29kZV9zd2l0Y2hfYmFzZSArIDB4MDQpKSA9IDB4MDEpOyBcCgkJbWIoKTsgXAoJfQoKI2RlZmluZQlTZWxlY3RNTUlPIFwKCW1iKCk7IFwKCWlmIChvbl96b3JybzIpIHsgXAoJCSgqKHZvbGF0aWxlIHUxNiAqKSgodTggKikodmNvZGVfc3dpdGNoX2Jhc2UgKyAweDA0KSkgPSAweDAyKTsgXAoJCW1iKCk7IFwKCX0KCiNkZWZpbmUJU2VsZWN0Q0ZHIFwKCW1iKCk7IFwKCWlmIChvbl96b3JybzIpIHsgXAoJCSgqKHZvbGF0aWxlIHUxNiAqKSgodTggKikodmNvZGVfc3dpdGNoX2Jhc2UgKyAweDA0KSkgPSAweDAzKTsgXAoJCW1iKCk7IFwKCX0KCi8qIFNldCBwYXNzIHRocm91Z2gsIDAgPSBhbWlnYSwgIT0wID0gY3Y2NC8zZCAqLwoKI2RlZmluZSBTZXRWU3dpdGNoKHgpIFwKCW1iKCk7IFwKCSgqKHZvbGF0aWxlIHUxNiAqKSgodTggKikodmNvZGVfc3dpdGNoX2Jhc2UpKSA9IFwKCSh1MTYpKHggPyAwIDogMSkpOyBcCgltYigpOwoKLyogWm9ycm8yIGVuZGlhbiAnYXBlcnR1cmUnICovCgojZGVmaW5lIEVORElBTl9CWVRFCTIKI2RlZmluZSBFTkRJQU5fV09SRAkxCiNkZWZpbmUgRU5ESUFOX0xPTkcJMAoKI2RlZmluZSBTZWxlY3RfWm9ycm8yX0ZyYW1lQnVmZmVyKHgpIFwKCWRvIHsgXAoJCWlmIChvbl96b3JybzIpIHsgXAoJCQltYigpOyBcCgkJCSgqKHZvbGF0aWxlIHUxNiAqKSgodTggKikodmNvZGVfc3dpdGNoX2Jhc2UgKyAweDA4KSkgPSBcCgkJCSh4ICogMHg0MCkpOyBcCgkJCW1iKCk7IFwKCQl9IFwKCX0gd2hpbGUgKDApCgovKiBTZXRQb3J0VmFsIC0gb25seSB1c2VkIGZvciBpbnRlcnJ1cHQgZW5hYmxlIChub3QgeWV0IGltcGxlbWVudGVkKSAqLwoKI2lmIDAKI2RlZmluZSBTZXRQb3J0VmFsKHgpIFwKCW1iKCk7IFwKCSgqKHZvbGF0aWxlIHUxNiAqKSgodTggKikodmNvZGVfc3dpdGNoX2Jhc2UgKyAweDBjKSkgPSBcCgkodTE2KXgpOyBcCgltYigpOwojZW5kaWYKCi8qIElPIGFjY2VzcyAqLwoKI2RlZmluZSBieXRlX2FjY2Vzc19pbyh4KQkoKCh4KSAmIDB4M2ZmYykgfCAoKCh4KSAmIDMpXjMpIHwgKCgoeCkgJiAzKSA8PDE0KSkKI2RlZmluZSBieXRlX2FjY2Vzc19tbWlvKHgpCSgoKHgpICYgMHhmZmZjKSB8ICgoKHgpICYgMyleMykpCgovKiBXcml0ZSA4IGJpdCBWR0EgcmVnaXN0ZXIgLSB1c2VkIG9uY2UgZm9yIGNoaXAgd2FrZXVwICovCgojZGVmaW5lIHdiX3ZnYWlvKHJlZywgZGF0KSBcCglTZWxlY3RJTzsgXAoJKCoodm9sYXRpbGUgdTggKikodmdhaW9fcmVncyArICgodTMyKWJ5dGVfYWNjZXNzX2lvKHJlZykgJiAweGZmZmYpKSA9IFwKCShkYXQgJiAweGZmKSk7IFwKCVNlbGVjdE1NSU87CgovKiBSZWFkIDggYml0IFZHQSByZWdpc3RlciAtIG9ubHkgdXNlZCBpbiBkdW1wIChTZWxlY3RJTyBub3QgbmVlZGVkIG9uIHJlYWQgPykgKi8KCiNpZmRlZiBWSVJHRUZCRFVNUAojZGVmaW5lIHJiX3ZnYWlvKHJlZykgXAoJKHsgXAoJdTggX196enl6eDsgXAoJU2VsZWN0SU87IFwKCV9fenp5enggPSAoKih2b2xhdGlsZSB1OCAqKSgodmdhaW9fcmVncykrKHUzMilieXRlX2FjY2Vzc19pbyhyZWcpKSk7IFwKCVNlbGVjdE1NSU87IFwKCV9fenp5eng7IFwKCX0pCiNlbmRpZgoKLyogTU1JTyBhY2Nlc3MgKi8KCi8qIFJlYWQgOCBiaXQgTU1JTyByZWdpc3RlciAqLwoKI2RlZmluZSByYl9tbWlvKHJlZykgXAoJKG1iX2lubGluZSgpLCBcCgkoKih2b2xhdGlsZSB1OCAqKShtbWlvX3JlZ3MgKyAweDgwMDAgKyAodTMyKWJ5dGVfYWNjZXNzX21taW8ocmVnKSkpKQoKLyogV3JpdGUgOCBiaXQgTU1JTyByZWdpc3RlciAqLwoKI2RlZmluZSB3Yl9tbWlvKHJlZyxkYXQpIFwKCW1iKCk7IFwKCSgqKHZvbGF0aWxlIHU4ICopKG1taW9fcmVncyArIDB4ODAwMCArIChieXRlX2FjY2Vzc19tbWlvKChyZWcpICYgMHhmZmZmKSkpID0gXAoJKGRhdCAmIDB4ZmYpKTsgXAoJbWIoKTsKCi8qIFJlYWQgMzIgYml0IE1NSU8gcmVnaXN0ZXIgKi8KCiNkZWZpbmUgcmxfbW1pbyhyZWcpIFwKCShtYl9pbmxpbmUoKSwgXAoJKCooKHZvbGF0aWxlIHUzMiAqKSgodTggKikoKG1taW9fcmVncyArIChvbl96b3JybzIgPyAweDIwMDAwIDogMCkpICsgKHJlZykpKSkpKQoKLyogV3JpdGUgMzIgYml0IE1NSU8gcmVnaXN0ZXIgKi8KCiNkZWZpbmUgd2xfbW1pbyhyZWcsZGF0KSBcCgltYigpOyBcCgkoKCoodm9sYXRpbGUgdTMyICopKCh1OCAqKSgobW1pb19yZWdzICsgKG9uX3pvcnJvMiA/IDB4MjAwMDAgOiAwKSkgKyAocmVnKSkpKSA9IFwKCSh1MzIpKGRhdCkpOyBcCgltYigpOwoKLyogV3JpdGUgdG8gdmlyZ2UgZ3JhcGhpY3MgcmVnaXN0ZXIgKi8KCiNkZWZpbmUgd2dmeChyZWcsIGRhdCkJZG8geyB3Yl9tbWlvKEdDVF9BRERSRVNTLCAocmVnKSk7IHdiX21taW8oR0NUX0FERFJFU1NfVywgKGRhdCkpOyB9IHdoaWxlICgwKQoKLyogV3JpdGUgdG8gdmlyZ2Ugc2VxdWVuY2VyIHJlZ2lzdGVyICovCgojZGVmaW5lIHdzZXEocmVnLCBkYXQpCWRvIHsgd2JfbW1pbyhTRVFfQUREUkVTUywgKHJlZykpOyB3Yl9tbWlvKFNFUV9BRERSRVNTX1csIChkYXQpKTsgfSB3aGlsZSAoMCkKCi8qIFdyaXRlIHRvIHZpcmdlIENSVCBjb250cm9sbGVyIHJlZ2lzdGVyICovCgojZGVmaW5lIHdjcnQocmVnLCBkYXQpCWRvIHsgd2JfbW1pbyhDUlRfQUREUkVTUywgKHJlZykpOyB3Yl9tbWlvKENSVF9BRERSRVNTX1csIChkYXQpKTsgfSB3aGlsZSAoMCkKCi8qIFdyaXRlIHRvIHZpcmdlIGF0dHJpYnV0ZSByZWdpc3RlciAqLwoKI2RlZmluZSB3YXRyKHJlZywgZGF0KSBcCglkbyB7IFwKCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHdhdHJfdG1wOyBcCgkJd2F0cl90bXAgPSByYl9tbWlvKEFDVF9BRERSRVNTX1JFU0VUKTsgXAoJCXdiX21taW8oQUNUX0FERFJFU1NfVywgKHJlZykpOyBcCgkJd2JfbW1pbyhBQ1RfQUREUkVTU19XLCAoZGF0KSk7IFwKCQl1ZGVsYXkoMTApOyBcCgl9IHdoaWxlICgwKQoKLyogZW5kIG9mIG1hY3JvcyAqLwoKc3RydWN0IHZpcmdlZmJfcGFyIHsKICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKICAgX191MzIgdHlwZTsKICAgX191MzIgdHlwZV9hdXg7CiAgIF9fdTMyIHZpc3VhbDsKICAgX191MzIgbGluZV9sZW5ndGg7Cn07CgpzdGF0aWMgc3RydWN0IHZpcmdlZmJfcGFyIGN1cnJlbnRfcGFyOwoKc3RhdGljIGludCBjdXJyZW50X3Bhcl92YWxpZCA9IDA7CgpzdGF0aWMgc3RydWN0IGRpc3BsYXkgZGlzcDsKc3RhdGljIHN0cnVjdCBmYl9pbmZvIGZiX2luZm87CgpzdGF0aWMgdW5pb24gewojaWZkZWYgRkJDT05fSEFTX0NGQjE2CiAgICB1MTYgY2ZiMTZbMTZdOwojZW5kaWYKI2lmZGVmIEZCQ09OX0hBU19DRkIzMgogICAgdTMyIGNmYjMyWzE2XTsKI2VuZGlmCn0gZmJjb25fY21hcDsKCi8qCiAqICAgIFN3aXRjaCBmb3IgQ2hpcHNldCBJbmRlcGVuZGVuY3kKICovCgpzdGF0aWMgc3RydWN0IGZiX2h3c3dpdGNoIHsKCiAgIC8qIEluaXRpYWxpc2F0aW9uICovCgogICBpbnQgKCppbml0KSh2b2lkKTsKCiAgIC8qIERpc3BsYXkgQ29udHJvbCAqLwoKICAgaW50ICgqZW5jb2RlX2ZpeCkoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsIHN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKTsKICAgaW50ICgqZGVjb2RlX3Zhcikoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKTsKICAgaW50ICgqZW5jb2RlX3Zhcikoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKTsKICAgaW50ICgqZ2V0Y29scmVnKSh1X2ludCByZWdubywgdV9pbnQgKnJlZCwgdV9pbnQgKmdyZWVuLCB1X2ludCAqYmx1ZSwKICAgICAgICAgICAgICAgICAgICB1X2ludCAqdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiAgIHZvaWQgKCpibGFuaykoaW50IGJsYW5rKTsKfSAqZmJodzsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyIGJsaXRfbWF5YmVfYnVzeSA9IDA7CgovKgogKiAgICBGcmFtZSBCdWZmZXIgTmFtZQogKi8KCnN0YXRpYyBjaGFyIHZpcmdlZmJfbmFtZVsxNl0gPSAiQ3liZXJWaXNpb24vM0QiOwoKLyoKICogICAgQ3liZXJWaXNpb242NC8zZCBHcmFwaGljcyBCb2FyZAogKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHZpcmdlZmJfY29sb3VyX3RhYmxlIFsyNTZdWzNdOwpzdGF0aWMgdW5zaWduZWQgbG9uZyB2X3JhbTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgdl9yYW1fc2l6ZTsKc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKm1taW9fcmVnczsKc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnZnYWlvX3JlZ3M7CgpzdGF0aWMgdW5zaWduZWQgbG9uZyB2X3JhbV9waHlzOwpzdGF0aWMgdW5zaWduZWQgbG9uZyBtbWlvX3JlZ3NfcGh5czsKc3RhdGljIHVuc2lnbmVkIGxvbmcgdmNvZGVfc3dpdGNoX2Jhc2U7CnN0YXRpYyB1bnNpZ25lZCBjaGFyIG9uX3pvcnJvMjsKCi8qCiAqIE9mZnNldHMgZnJvbSBzdGFydCBvZiB2aWRlbyByYW0gdG8gYXBwcm9wcmlhdGUgWklJSSBhcGVydHVyZQogKi8KCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAojZGVmaW5lIENZQk1FTV9PRkZTRVRfOCAgMHg4MDAwMDAJLyogQkdSWCAqLwojZW5kaWYKI2lmZGVmIEZCQ09OX0hBU19DRkIxNgojZGVmaW5lIENZQk1FTV9PRkZTRVRfMTYgMHg0MDAwMDAJLyogR0JYUiAqLwojZW5kaWYKI2lmZGVmIEZCQ09OX0hBU19DRkIzMgojZGVmaW5lIENZQk1FTV9PRkZTRVRfMzIgMHgwMDAwMDAJLyogWFJHQiAqLwojZW5kaWYKCi8qCiAqICAgIE1FTUNMT0NLIHdhcyAzMk1IeiwgNjRNSHogd29ya3MsIDcyTUh6IGRvZXNuJ3QgKG9uIG15IGJvYXJkKQogKi8KCiNkZWZpbmUgTUVNQ0xPQ0sgNTAwMDAwMDAKCi8qCiAqICAgIFByZWRlZmluZWQgVmlkZW8gTW9kZXMKICovCgpzdGF0aWMgc3RydWN0IHsKICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwp9IHZpcmdlZmJfcHJlZGVmaW5lZFtdIF9faW5pdGRhdGEgPSB7CiNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAogICAgewoJIjY0MHg0ODAtOCIsIHsJCS8qIEN5YmVydmlzaW9uIDggYnBwICovCgkgICAgNjQwLCA0ODAsIDY0MCwgNDgwLCAwLCAwLCA4LCAwLAoJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAzMTI1MCwgMTYwLCAxMzYsIDgyLCA2MSwgODgsIDIsCgkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAoJICAgIH0KICAgIH0sIHsKCSI3Njh4NTc2LTgiLCB7CQkvKiBDeWJlcnZpc2lvbiA4IGJwcCAqLwoJICAgIDc2OCwgNTc2LCA3NjgsIDU3NiwgMCwgMCwgOCwgMCwKCSAgICB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgMCwgMH0sCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMjk0MTEsIDE0NCwgMTEyLCAzMiwgMTUsIDY0LCAyLAoJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgICB9LCB7CgkiODAweDYwMC04IiwgewkJLyogQ3liZXJ2aXNpb24gOCBicHAgKi8KCSAgICA4MDAsIDYwMCwgODAwLCA2MDAsIDAsIDAsIDgsIDAsCgkgICAgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDI4NTcxLCAxNjgsIDEwNCwgMjIsIDEsIDQ4LCAyLAoJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgICB9LCB7CiAgI2lmIDAgCgkiMTAyNHg3NjgtOCIsIHsJCS8qIEN5YmVydmlzaW9uIDggYnBwICovCgkgICAgMTAyNCwgNzY4LCAxMDI0LCA3NjgsIDAsIDAsIDgsIDAsCgkgICAgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDIwODMzLCAyNzIsIDE2OCwgMzksIDIsIDcyLCAxLAoJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgI2Vsc2UKCSIxMDI0eDc2OC04IiwgewoJICAgIDEwMjQsIDc2OCwgMTAyNCwgNzY4LCAwLCAwLCA4LCAwLAoJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKICAgI2lmIDAKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxMjUwMCwgMTg0LCA0MCwgNDAsIDIsIDk2LCAxLAoJICAgIEZCX1NZTkNfQ09NUF9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgICAjZWxzZQoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDEyNjk5LCAxNzYsIDE2LCAyOCwgMSwgOTYsIDMsCgkgICAgRkJfU1lOQ19DT01QX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAoJICAgIH0KICAgICNlbmRpZgogICNlbmRpZgogICAgfSwgewoJIjExNTJ4ODg2LTgiLCB7CQkvKiBDeWJlcnZpc2lvbiA4IGJwcCAqLwoJICAgIDExNTIsIDg4NiwgMTE1MiwgODg2LCAwLCAwLCA4LCAwLAoJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxOTIzMCwgMjgwLCAxNjgsIDQ1LCAxLCA2NCwgMTAsCgkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAoJICAgIH0KICAgIH0sIHsKCSIxMjgweDEwMjQtOCIsIHsgCS8qIEN5YmVydmlzaW9uIDggYnBwICovCgkgICAgMTI4MCwgMTAyNCwgMTI4MCwgMTAyNCwgMCwgMCwgOCwgMCwKCSAgICB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgMCwgMH0sCiAgI2lmIDAKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxNzg1NywgMjMyLCAyMzIsIDcxLCAxNSwgMTc2LCAxMiwKCSAgICB9CiAgI2Vsc2UKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCA3NDE0LCAyMzIsIDY0LCAzOCwgMSwgMTEyLCAzLAoJICAgIEZCX1NZTkNfQ09NUF9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgI2VuZGlmCiAgICB9LCB7CgkiMTYwMHgxMjAwLTgiLCB7IAkvKiBDeWJlcnZpc2lvbiA4IGJwcCAqLwoJICAgIDE2MDAsIDEyMDAsIDE2MDAsIDEyMDAsIDAsIDAsIDgsIDAsCgkgICAgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAogICNpZiAwCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMTM2OTgsIDMzNiwgMjI0LCA3NywgMTUsIDE3NiwgMTIsCgkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAoJICAgIH0KICAjZWxzZQoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDY0MTEsIDI1NiwgMzIsIDUyLCAxMCwgMTYwLCA4LAoJICAgIEZCX1NZTkNfQ09NUF9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgI2VuZGlmCiAgICB9LAojZW5kaWYKCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKICAgIHsKCSI2NDB4NDgwLTE2IiwgewkJLyogQ3liZXJ2aXNpb24gMTYgYnBwICovCgkgICAgNjQwLCA0ODAsIDY0MCwgNDgwLCAwLCAwLCAxNiwgMCwKCSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDMxMjUwLCAxNTIsIDE0NCwgODIsIDYxLCA4OCwgMiwKCSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECgkgICAgfQogICAgfSwgewoJIjc2OHg1NzYtMTYiLCB7CQkvKiBDeWJlcnZpc2lvbiAxNiBicHAgKi8KCSAgICA3NjgsIDU3NiwgNzY4LCA1NzYsIDAsIDAsIDE2LCAwLAoJICAgIHsxMSwgNSwgMH0sIHs1LCA2LCAwfSwgezAsIDUsIDB9LCB7MCwgMCwgMH0sCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMjk0MTEsIDE0NCwgMTEyLCAzMiwgMTUsIDY0LCAyLAoJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgICB9LCB7CgkiODAweDYwMC0xNiIsIHsJCS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLwoJICAgIDgwMCwgNjAwLCA4MDAsIDYwMCwgMCwgMCwgMTYsIDAsCgkgICAgezExLCA1LCAwfSwgezUsIDYsIDB9LCB7MCwgNSwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyODU3MSwgMTY4LCAxMDQsIDIyLCAxLCA0OCwgMiwKCSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECgkgICAgfQogICAgfSwgewojaWYgMAoJIjEwMjR4NzY4LTE2IiwgeyAJLyogQ3liZXJ2aXNpb24gMTYgYnBwICovCgkgICAgMTAyNCwgNzY4LCAxMDI0LCA3NjgsIDAsIDAsIDE2LCAwLAoJICAgIHsxMSwgNSwgMH0sIHs1LCA2LCAwfSwgezAsIDUsIDB9LCB7MCwgMCwgMH0sCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMjA4MzMsIDI3MiwgMTY4LCAzOSwgMiwgNzIsIDEsCgkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAoJICAgIH0KI2Vsc2UKICAgICAgICAgIjEwMjR4NzY4LTE2IiwgewogICAgICAgICAgICAgMTAyNCwgNzY4LCAxMDI0LCA3NjgsIDAsIDAsIDE2LCAwLAogICAgICAgICAgICAgezExLCA1LCAwfSwgezUsIDYsIDB9LCB7MCwgNSwgMH0sIHswLCAwLCAwfSwKICAgICAgICAgICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDEyNTAwLCAxODQsIDQwLCA0MCwgMiwgOTYsIDEsCiAgICAgICAgICAgICBGQl9TWU5DX0NPTVBfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECiAgICAgICAgIH0KI2VuZGlmCiAgICB9LCB7CgkiMTE1Mng4ODYtMTYiLCB7IAkvKiBDeWJlcnZpc2lvbiAxNiBicHAgKi8KCSAgICAxMTUyLCA4ODYsIDExNTIsIDg4NiwgMCwgMCwgMTYsIDAsCgkgICAgezExLCA1LCAwfSwgezUsIDYsIDB9LCB7MCwgNSwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxOTIzMCwgMjgwLCAxNjgsIDQ1LCAxLCA2NCwgMTAsCgkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAoJICAgIH0KICAgIH0sIHsKCSIxMjgweDEwMjQtMTYiLCB7IAkvKiBDeWJlcnZpc2lvbiAxNiBicHAgKi8KCSAgICAxMjgwLCAxMDI0LCAxMjgwLCAxMDI0LCAwLCAwLCAxNiwgMCwKCSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDE3ODU3LCAyMzIsIDIzMiwgNzEsIDE1LCAxNzYsIDEyLAoJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgICB9LCB7CgkiMTYwMHgxMjAwLTE2IiwgeyAJLyogQ3liZXJ2aXNpb24gMTYgYnBwICovCgkgICAgMTYwMCwgMTIwMCwgMTYwMCwgMTIwMCwgMCwgMCwgMTYsIDAsCgkgICAgezExLCA1LCAwfSwgezUsIDYsIDB9LCB7MCwgNSwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxMzY5OCwgMzM2LCAyMjQsIDc3LCAxNSwgMTc2LCAxMiwKCSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECgkgICAgfQogICAgfSwKI2VuZGlmCgojaWZkZWYgRkJDT05fSEFTX0NGQjMyCiAgICB7CgkiNjQweDQ4MC0zMiIsIHsJCS8qIEN5YmVydmlzaW9uIDMyIGJwcCAqLwoJICAgIDY0MCwgNDgwLCA2NDAsIDQ4MCwgMCwgMCwgMzIsIDAsCgkgICAgezE2LCA4LCAwfSwgezgsIDgsIDB9LCB7MCwgOCwgMH0sIHsyNCwgMCwgMH0sCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMzEyNTAsIDE2MCwgMTM2LCA4MiwgNjEsIDg4LCAyLAoJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgICAgfSwgewoJIjc2OHg1NzYtMzIiLCB7CQkvKiBDeWJlcnZpc2lvbiAzMiBicHAgKi8KCSAgICA3NjgsIDU3NiwgNzY4LCA1NzYsIDAsIDAsIDMyLCAwLAoJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjQsIDAsIDB9LAoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDI5NDExLCAxNDQsIDExMiwgMzIsIDE1LCA2NCwgMiwKCSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECgkgICAgfQogICAgIH0sIHsKCSI4MDB4NjAwLTMyIiwgewkJLyogQ3liZXJ2aXNpb24gMzIgYnBwICovCgkgICAgODAwLCA2MDAsIDgwMCwgNjAwLCAwLCAwLCAzMiwgMCwKCSAgICB7MTYsIDgsIDB9LCB7OCwgOCwgMH0sIHswLCA4LCAwfSwgezI0LCAwLCAwfSwKICAJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDI4NTcxLCAxNjgsIDEwNCwgMjIsIDEsIDQ4LCAyLAoJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgICAgfSwgewoJIjEwMjR4NzY4LTMyIiwgewkvKiBDeWJlcnZpc2lvbiAzMiBicHAgKi8KCSAgICAxMDI0LCA3NjgsIDEwMjQsIDc2OCwgMCwgMCwgMzIsIDAsCgkgICAgezE2LCA4LCAwfSwgezgsIDgsIDB9LCB7MCwgOCwgMH0sIHsyNCwgMCwgMH0sCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMjA4MzMsIDI3MiwgMTY4LCAzOSwgMiwgNzIsIDEsCgkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAoJICAgIH0KICAgIH0sIHsKCSIxMTUyeDg4Ni0zMiIsIHsJLyogQ3liZXJ2aXNpb24gMzIgYnBwICovCgkgICAgMTE1MiwgODg2LCAxMTUyLCA4ODYsIDAsIDAsIDMyLCAwLAoJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjQsIDAsIDB9LAoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDE5MjMwLCAyODAsIDE2OCwgNDUsIDEsIDY0LCAxMCwKCSAgICAwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECgkgICAgfQogICAgfSwgewoJIjEyODB4MTAyNC0zMiIsIHsJLyogQ3liZXJ2aXNpb24gMzIgYnBwICovCgkgICAgMTI4MCwgMTAyNCwgMTI4MCwgMTAyNCwgMCwgMCwgMzIsIDAsCgkgICAgezE2LCA4LCAwfSwgezgsIDgsIDB9LCB7MCwgOCwgMH0sIHsyNCwgMCwgMH0sCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMTc4NTcsIDIzMiwgMjMyLCA3MSwgMTUsIDE3NiwgMTIsCgkgICAgMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAoJICAgIH0KICAgIH0sIHsKCSIxNjAweDEyMDAtMzIiLCB7CS8qIEN5YmVydmlzaW9uIDMyIGJwcCAqLwoJICAgIDE2MDAsIDEyMDAsIDE2MDAsIDEyMDAsIDAsIDAsIDMyLCAwLAoJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjQsIDAsIDB9LAoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDEzNjk4LCAzMzYsIDIyNCwgNzcsIDE1LCAxNzYsIDEyLAoJICAgIDAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKCSAgICB9CiAgICB9LAojZW5kaWYKCi8qIGludGVybGFjZWQgbW9kZXMgKi8KCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAogICAgewoJIjEwMjR4NzY4LThpIiwgewkvKiBDeWJlcnZpc2lvbiA4IGJwcCAqLwoJICAgIDEwMjQsIDc2OCwgMTAyNCwgNzY4LCAwLCAwLCA4LCAwLAoJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyMDgzMywgMjcyLCAxNjgsIDM5LCAyLCA3MiwgMSwKCSAgICAwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECgkgICAgfQogICAgfSwgewoJIjEyODB4MTAyNC04aSIsIHsJLyogQ3liZXJ2aXNpb24gOCBicHAgKi8KCSAgICAxMjgwLCAxMDI0LCAxMjgwLCAxMDI0LCAwLCAwLCA4LCAwLAoJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxNzg1NywgMjMyLCAyMzIsIDcxLCAxNSwgMTc2LCAxMiwKCSAgICAwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECgkgICAgfQogICAgfSwgewoJIjE2MDB4MTIwMC04aSIsIHsJLyogQ3liZXJ2aXNpb24gOCBicHAgKi8KCSAgICAxNjAwLCAxMjAwLCAxNjAwLCAxMjAwLCAwLCAwLCA4LCAwLAoJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAxMzY5OCwgMzM2LCAyMjQsIDc3LCAxNSwgMTc2LCAxMiwKCSAgICAwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECgkgICAgfQogICAgfSwKI2VuZGlmCgojaWZkZWYgRkJDT05fSEFTX0NGQjE2CiAgICB7CgkiMTAyNHg3NjgtMTZpIiwgewkvKiBDeWJlcnZpc2lvbiAxNiBicHAgKi8KCSAgICAxMDI0LCA3NjgsIDEwMjQsIDc2OCwgMCwgMCwgMTYsIDAsCgkgICAgezExLCA1LCAwfSwgezUsIDYsIDB9LCB7MCwgNSwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyMDgzMywgMjcyLCAxNjgsIDM5LCAyLCA3MiwgMSwKCSAgICAwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECgkgICAgfQogICAgfSwgewoJIjEyODB4MTAyNC0xNmkiLCB7CS8qIEN5YmVydmlzaW9uIDE2IGJwcCAqLwoJICAgIDEyODAsIDEwMjQsIDEyODAsIDEwMjQsIDAsIDAsIDE2LCAwLAoJICAgIHsxMSwgNSwgMH0sIHs1LCA2LCAwfSwgezAsIDUsIDB9LCB7MCwgMCwgMH0sCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMTc4NTcsIDIzMiwgMjMyLCA3MSwgMTUsIDE3NiwgMTIsCgkgICAgMCwgRkJfVk1PREVfSU5URVJMQUNFRAoJICAgIH0KICAgIH0sIHsKCSIxNjAweDEyMDAtMTZpIiwgewkvKiBDeWJlcnZpc2lvbiAxNiBicHAgKi8KCSAgICAxNjAwLCAxMjAwLCAxNjAwLCAxMjAwLCAwLCAwLCAxNiwgMCwKCSAgICB7MTEsIDUsIDB9LCB7NSwgNiwgMH0sIHswLCA1LCAwfSwgezAsIDAsIDB9LAoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDEzNjk4LCAzMzYsIDIyNCwgNzcsIDE1LCAxNzYsIDEyLAoJICAgIDAsIEZCX1ZNT0RFX0lOVEVSTEFDRUQKCSAgICB9CiAgICB9LAojZW5kaWYKCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKICAgIHsKCSIxMDI0eDc2OC0zMmkiLCB7CS8qIEN5YmVydmlzaW9uIDMyIGJwcCAqLwoJICAgIDEwMjQsIDc2OCwgMTAyNCwgNzY4LCAwLCAwLCAzMiwgMCwKCSAgICB7MTYsIDgsIDB9LCB7OCwgOCwgMH0sIHswLCA4LCAwfSwgezI0LCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCAyMjIyMiwgMjE2LCAxNDQsIDM5LCAyLCA3MiwgMSwKCSAgICAwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECgkgICAgfQogICAgfSwgewoJIjEyODB4MTAyNC0zMmkiLCB7CS8qIEN5YmVydmlzaW9uIDMyIGJwcCAqLwoJICAgIDEyODAsIDEwMjQsIDEyODAsIDEwMjQsIDAsIDAsIDMyLCAwLAoJICAgIHsxNiwgOCwgMH0sIHs4LCA4LCAwfSwgezAsIDgsIDB9LCB7MjMsIDAsIDB9LAoJICAgIDAsIDAsIC0xLCAtMSwgRkJfQUNDRUxGX1RFWFQsIDE3ODU3LCAyMzIsIDIzMiwgNzEsIDE1LCAxNzYsIDEyLAoJICAgIDAsIEZCX1ZNT0RFX0lOVEVSTEFDRUQKCSAgICB9CiAgICB9LCB7CgkiMTYwMHgxMjAwLTMyaSIsIHsJLyogQ3liZXJ2aXNpb24gMzIgYnBwICovCgkgICAgMTYwMCwgMTIwMCwgMTYwMCwgMTIwMCwgMCwgMCwgMzIsIDAsCgkgICAgezE2LCA4LCAwfSwgezgsIDgsIDB9LCB7MCwgOCwgMH0sIHsyNCwgMCwgMH0sCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgMTM2OTgsIDMzNiwgMjI0LCA3NywgMTUsIDE3NiwgMTIsCgkgICAgMCwgRkJfVk1PREVfSU5URVJMQUNFRAoJICAgIH0KICAgIH0sCiNlbmRpZgoKLyogZG91Ymxlc2NhbiBtb2RlcyAqLwoKI2lmZGVmIEZCQ09OX0hBU19DRkI4CiAgICB7CgkiMzIweDI0MC04ZCIsIHsJCS8qIEN5YmVydmlzaW9uIDggYnBwICovCgkgICAgMzIwLCAyNDAsIDMyMCwgMjQwLCAwLCAwLCA4LCAwLAoJICAgIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCA1OTI1OSwgODAsIDgwLCA0NSwgMjYsIDMyLCAxLAoJICAgIDAsIEZCX1ZNT0RFX0RPVUJMRQoJICAgIH0KICAgIH0sCiNlbmRpZgoKI2lmZGVmIEZCQ09OX0hBU19DRkIxNgogICAgewoJIjMyMHgyNDAtMTZkIiwgewkvKiBDeWJlcnZpc2lvbiAxNiBicHAgKi8KCSAgICAzMjAsIDI0MCwgMzIwLCAyNDAsIDAsIDAsIDE2LCAwLAoJICAgIHsxMSwgNSwgMH0sIHs1LCA2LCAwfSwgezAsIDUsIDB9LCB7MCwgMCwgMH0sCgkgICAgMCwgMCwgLTEsIC0xLCBGQl9BQ0NFTEZfVEVYVCwgNTkyNTksIDgwLCA4MCwgNDUsIDI2LCAzMiwgMSwKCSAgICAwLCBGQl9WTU9ERV9ET1VCTEUKCSAgICB9CiAgICB9LAojZW5kaWYKCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKICAgIHsKCSIzMjB4MjQwLTMyZCIsIHsJLyogQ3liZXJ2aXNpb24gMzIgYnBwICovCgkgICAgMzIwLCAyNDAsIDMyMCwgMjQwLCAwLCAwLCAzMiwgMCwKCSAgICB7MTYsIDgsIDB9LCB7OCwgOCwgMH0sIHswLCA4LCAwfSwgezI0LCAwLCAwfSwKCSAgICAwLCAwLCAtMSwgLTEsIEZCX0FDQ0VMRl9URVhULCA1OTI1OSwgODAsIDgwLCA0NSwgMjYsIDMyLCAxLAoJICAgIDAsIEZCX1ZNT0RFX0RPVUJMRQoJICAgIH0KICAgIH0sCiNlbmRpZgp9OwoKI2RlZmluZSBOVU1fVE9UQUxfTU9ERVMJQVJSQVlfU0laRSh2aXJnZWZiX3ByZWRlZmluZWQpCgovKgogKiAgICBEZWZhdWx0IHRvIDgwMHg2MDAgZm9yIHZpZGVvPXZpcmdlODosIHZpcmdlMTY6IG9yIHZpcmdlMzI6CiAqLwoKI2lmZGVmIEZCQ09OX0hBU19DRkI4CiNkZWZpbmUgVklSR0U4X0RFRk1PREUJKDIpCiNlbmRpZgoKI2lmZGVmIEZCQ09OX0hBU19DRkIxNgojZGVmaW5lIFZJUkdFMTZfREVGTU9ERQkoOSkKI2VuZGlmCgojaWZkZWYgRkJDT05fSEFTX0NGQjMyCiNkZWZpbmUgVklSR0UzMl9ERUZNT0RFCSgxNikKI2VuZGlmCgpzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZpcmdlZmJfZGVmYXVsdDsKc3RhdGljIGludCB2aXJnZWZiX2ludmVyc2UgPSAwOwoKLyoKICogICAgSW50ZXJmYWNlIHVzZWQgYnkgdGhlIHdvcmxkCiAqLwoKaW50IHZpcmdlZmJfc2V0dXAoY2hhciopOwpzdGF0aWMgaW50IHZpcmdlZmJfZ2V0X2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwgaW50IGNvbiwKCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgaW50IHZpcmdlZmJfZ2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGNvbiwKCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgaW50IHZpcmdlZmJfc2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGNvbiwKCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgaW50IHZpcmdlZmJfZ2V0X2NtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIGludCBrc3BjLCBpbnQgY29uLAoJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgdmlyZ2VmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCgkJCSAgICAgdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgdmlyZ2VmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKCi8qCiAqICAgIEludGVyZmFjZSB0byB0aGUgbG93IGxldmVsIGNvbnNvbGUgZHJpdmVyCiAqLwoKaW50IHZpcmdlZmJfaW5pdCh2b2lkKTsKc3RhdGljIGludCB2aXJnZWZiX3N3aXRjaChpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgdmlyZ2VmYl91cGRhdGV2YXIoaW50IGNvbiwgc3RydWN0IGZiX2luZm8gKmluZm8pOwoKLyoKICogICAgVGV4dCBjb25zb2xlIGFjY2VsZXJhdGlvbgogKi8KCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCOApzdGF0aWMgc3RydWN0IGRpc3BsYXlfc3dpdGNoIGZiY29uX3ZpcmdlODsKI2VuZGlmCgojaWZkZWYgRkJDT05fSEFTX0NGQjE2CnN0YXRpYyBzdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fdmlyZ2UxNjsKI2VuZGlmCgojaWZkZWYgRkJDT05fSEFTX0NGQjMyCnN0YXRpYyBzdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fdmlyZ2UzMjsKI2VuZGlmCgovKgogKiAgIEhhcmR3YXJlIFNwZWNpZmljIFJvdXRpbmVzCiAqLwoKc3RhdGljIGludCB2aXJnZV9pbml0KHZvaWQpOwpzdGF0aWMgaW50IHZpcmdlZmJfZW5jb2RlX2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwKCQkJCXN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKTsKc3RhdGljIGludCB2aXJnZWZiX2RlY29kZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCgkJCQlzdHJ1Y3QgdmlyZ2VmYl9wYXIgKnBhcik7CnN0YXRpYyBpbnQgdmlyZ2VmYl9lbmNvZGVfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAoJCQkJc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpOwpzdGF0aWMgaW50IHZpcmdlZmJfZ2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCAqcmVkLCB1X2ludCAqZ3JlZW4sIHVfaW50ICpibHVlLAoJCQkJdV9pbnQgKnRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgdm9pZCB2aXJnZWZiX2dmeF9vbl9vZmYoaW50IGJsYW5rKTsKc3RhdGljIGlubGluZSB2b2lkIHZpcmdlZmJfd2FpdF9mb3JfaWRsZSh2b2lkKTsKc3RhdGljIHZvaWQgdmlyZ2VmYl9CaXRCTFQodV9zaG9ydCBjdXJ4LCB1X3Nob3J0IGN1cnksIHVfc2hvcnQgZGVzdHgsIHVfc2hvcnQgZGVzdHksCgkJdV9zaG9ydCB3aWR0aCwgdV9zaG9ydCBoZWlnaHQsIHVfc2hvcnQgc3RyaWRlLCB1X3Nob3J0IGRlcHRoKTsKc3RhdGljIHZvaWQgdmlyZ2VmYl9SZWN0RmlsbCh1X3Nob3J0IHgsIHVfc2hvcnQgeSwgdV9zaG9ydCB3aWR0aCwgdV9zaG9ydCBoZWlnaHQsCgkJdV9zaG9ydCBjb2xvciwgdV9zaG9ydCBzdHJpZGUsIHVfc2hvcnQgZGVwdGgpOwoKLyoKICogICAgSW50ZXJuYWwgcm91dGluZXMKICovCgpzdGF0aWMgdm9pZCB2aXJnZWZiX2dldF9wYXIoc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpOwpzdGF0aWMgdm9pZCB2aXJnZWZiX3NldF9wYXIoc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpOwpzdGF0aWMgaW50IHZpcmdlZmJfZG9fZmJfc2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGlzYWN0aXZlKTsKc3RhdGljIHZvaWQgdmlyZ2VmYl9zZXRfZGlzcChpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgdmlyZ2VmYl9nZXRfdmlkZW9fbW9kZShjb25zdCBjaGFyICpuYW1lKTsKc3RhdGljIHZvaWQgdmlyZ2VmYl9zZXRfdmlkZW8oc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOwoKLyoKICogICAgQWRkaXRpb25zIGZvciBJbml0aWFsaXphdGlvbgogKi8KCnN0YXRpYyB2b2lkIHZpcmdlZmJfbG9hZF92aWRlb19tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmlkZW9fbW9kZSk7CnN0YXRpYyBpbnQgY3YzZF9oYXNfNG1iKHZvaWQpOwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmlyZ2VmYl9jb21wdXRlX2Nsb2NrKHVuc2lnbmVkIGxvbmcgZnJlcSk7CnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByYXR0cihzaG9ydCk7CnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByc2VxKHNob3J0KTsKc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJjcnQoc2hvcnQpOwpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmdmeChzaG9ydCk7CnN0YXRpYyBpbmxpbmUgdm9pZCBnZnhfb25fb2ZmKGludCB0b2dnbGUpOwpzdGF0aWMgdm9pZCB2aXJnZWZiX3BjaV9pbml0KHZvaWQpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGFyZHdhcmUgc3BlY2lmaWMgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICoJRnVuY3Rpb25zIGZvciByZWdpc3RlciBhY2Nlc3MKICovCgovKiBSZWFkIGF0dHJpYnV0ZSBjb250cm9sbGVyIHJlZ2lzdGVyICovCgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmF0dHIoc2hvcnQgaWR4KQp7Cgl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHJhdHRyX3RtcDsKCglyYXR0cl90bXAgPSByYl9tbWlvKEFDVF9BRERSRVNTX1JFU0VUKTsKCXdiX21taW8oQUNUX0FERFJFU1NfVywgaWR4KTsKCXJldHVybiAocmJfbW1pbyhBQ1RfQUREUkVTU19SKSk7Cn0KCi8qIFJlYWQgc2VxdWVuY2VyIHJlZ2lzdGVyICovCgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcnNlcShzaG9ydCBpZHgpCnsKCXdiX21taW8oU0VRX0FERFJFU1MsIGlkeCk7CglyZXR1cm4gKHJiX21taW8oU0VRX0FERFJFU1NfUikpOwp9CgovKiBSZWFkIENSVCBjb250cm9sbGVyIHJlZ2lzdGVyICovCgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmNydChzaG9ydCBpZHgpCnsKCXdiX21taW8oQ1JUX0FERFJFU1MsIGlkeCk7CglyZXR1cm4gKHJiX21taW8oQ1JUX0FERFJFU1NfUikpOwp9CgovKiBSZWFkIGdyYXBoaWNzIGNvbnRyb2xsZXIgcmVnaXN0ZXIgKi8KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByZ2Z4KHNob3J0IGlkeCkKewoJd2JfbW1pbyhHQ1RfQUREUkVTUywgaWR4KTsKCXJldHVybiAocmJfbW1pbyhHQ1RfQUREUkVTU19SKSk7Cn0KCgovKgogKglJbml0aWFsaXphdGlvbgogKi8KCi8qIFBDSSBpbml0ICovCgp2b2lkIHZpcmdlZmJfcGNpX2luaXQodm9pZCkgewoKCURQUklOVEsoIkVOVEVSXG4iKTsKCglTZWxlY3RDRkc7CgoJaWYgKG9uX3pvcnJvMikgewoJCSooKHNob3J0ICopKHZnYWlvX3JlZ3MgKyAweDAwMDAwMDEwKSkgPSAwOwoJCSooKGxvbmcgICopKHZnYWlvX3JlZ3MgKyAweDAwMDAwMDA0KSkgPSAweDAyMDAwMDAzOwoJfSBlbHNlIHsKCQkqKChzaG9ydCAqKSh2Z2Fpb19yZWdzICsgMHgwMDBlMDAxMCkpID0gMDsKCQkqKChsb25nICAqKSh2Z2Fpb19yZWdzICsgMHgwMDBlMDAwNCkpID0gMHgwMjAwMDAwMzsKCX0KCgkvKiBTZWxlY3RJTyBpcyBpbiB3Yl92Z2FpbyBtYWNybyAqLwoJd2JfdmdhaW8oU1JFR19WSURFT19TVUJTX0VOQUJMRSwgMHgwMSk7CgkvKiBTZWxlY3RNTUlPIGlzIGluIHdiX3ZnYWlvIG1hY3JvICovCgoJRFBSSU5USygiRVhJVFxuIik7CgoJcmV0dXJuOwp9CgovKiAKICogSW5pdGFsaXplIGFsbCBtb2RlIGluZGVwZW5kZW50IHJlZ3MsIGZpbmQgbWVtIHNpemUgYW5kIGNsZWFyIG1lbQoqLwoKc3RhdGljIGludCB2aXJnZV9pbml0KHZvaWQpCnsKCWludCBpOwoJdW5zaWduZWQgY2hhciB0bXA7CgoJRFBSSU5USygiRU5URVJcbiIpOwoKCXZpcmdlZmJfcGNpX2luaXQoKTsKCgl3Yl9tbWlvKEdSRUdfTUlTQ19PVVRQVVRfVywgMHgwNyk7CS8qIGNvbG91ciwgcmFtIGVuYWJsZSwgY2xrIHNlbCAqLwoKCXdzZXEoU0VRX0lEX1VOTE9DS19FWFQsIDB4MDYpOwkJLyogdW5sb2NrIGV4dGVuc2lvbnMgKi8KCXRtcCA9IHJiX21taW8oR1JFR19NSVNDX09VVFBVVF9SKTsKCXdjcnQoQ1JUX0lEX1JFR0lTVEVSX0xPQ0tfMSwgMHg0OCk7CS8qIHVubG9jayBDUjJEIHRvIENSM0YgKi8KCgl3Y3J0KENSVF9JRF9CQUNLV0FEX0NPTVBfMSwgMHgwMCk7CS8qIGlycSBkaXNhYmxlICovCgoJd2NydChDUlRfSURfUkVHSVNURVJfTE9DS18yLCAweGE1KTsJLyogdW5sb2NrIENSNDAgdG8gQ1JGRiBhbmQgbW9yZSAqLwoJd2NydChDUlRfSURfUkVHSVNURVJfTE9DSywweDAwKTsJLyogdW5sb2NrIGggYW5kIHYgdGltaW5nICovCgl3Y3J0KENSVF9JRF9TWVNURU1fQ09ORklHLCAweDAxKTsJLyogdW5sb2NrIGVuaGFuY2VkIHByb2dyYW1taW5nIHJlZ2lzdGVycyAqLwoKCXdiX21taW8oR1JFR19GRUFUVVJFX0NPTlRST0xfVywgMHgwMCk7CgoJd2NydChDUlRfSURfRVhUX01JU0NfQ05UTCwgMHgwMCk7CS8qIGIyID0gMCB0byBhbGxvdyBWREFDIG1taW8gYWNjZXNzICovCiNpZiAwCgkvKiB3cml0ZSBzdHJhcCBvcHRpb25zIC4uLiA/ICovCgl3Y3J0KENSVF9JRF9DT05GSUdfMSwgMHgwOCk7Cgl3Y3J0KENSVF9JRF9DT05GSUdfMiwgMHhmZik7CQkvKiAweDB4MiBiaXQgbmVlZHMgdG8gYmUgc2V0ID8/ICovCgl3Y3J0KENSVF9JRF9DT05GSUdfMywgMHgwZik7Cgl3Y3J0KENSVF9JRF9DT05GSUdfNCwgMHgxYSk7CiNlbmRpZgoJd2NydChDUlRfSURfRVhUX01JU0NfQ05UTF8xLCAweDgyKTsJIC8qIFBDSSBERSBhbmQgc29mdHdhcmUgcmVzZXQgUzNEIGVuZ2luZSAqLwoJLyogRVhUX01JU0NfQ05UTF8xLCBDUjY2IGJpdCAwIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBiaXQgMCBNUl9BRFZBTkNFRF9GVU5DVElPTl9DT05UUk9MIC0gY2hlY2sgKi8KCXdsX21taW8oTVJfQURWQU5DRURfRlVOQ1RJT05fQ09OVFJPTCwgMHgwMDAwMDAxMSk7IC8qIGVuaGFuY2VkIG1vZGUsIGxpbmVhciBhZGRyZXNzaW5nICovCgovKiBjcnRjIHJlZ2lzdGVycyAqLwoKCXdjcnQoQ1JUX0lEX1BSRVNFVF9ST1dfU0NBTiwgMHgwMCk7CgoJLyogRGlzYWJsZSBoL3cgY3Vyc29yICovCgoJd2NydChDUlRfSURfQ1VSU09SX1NUQVJULCAweDAwKTsKCXdjcnQoQ1JUX0lEX0NVUlNPUl9FTkQsIDB4MDApOwoJd2NydChDUlRfSURfU1RBUlRfQUREUl9ISUdILCAweDAwKTsKCXdjcnQoQ1JUX0lEX1NUQVJUX0FERFJfTE9XLCAweDAwKTsKCXdjcnQoQ1JUX0lEX0NVUlNPUl9MT0NfSElHSCwgMHgwMCk7Cgl3Y3J0KENSVF9JRF9DVVJTT1JfTE9DX0xPVywgMHgwMCk7Cgl3Y3J0KENSVF9JRF9FWFRfTU9ERSwgMHgwMCk7Cgl3Y3J0KENSVF9JRF9IV0dDX01PREUsIDB4MDApOwoJd2NydChDUlRfSURfSFdHQ19PUklHSU5fWF9ISSwgMHgwMCk7Cgl3Y3J0KENSVF9JRF9IV0dDX09SSUdJTl9YX0xPLCAweDAwKTsKCXdjcnQoQ1JUX0lEX0hXR0NfT1JJR0lOX1lfSEksIDB4MDApOwoJd2NydChDUlRfSURfSFdHQ19PUklHSU5fWV9MTywgMHgwMCk7CglpID0gcmNydChDUlRfSURfSFdHQ19NT0RFKTsKCXdjcnQoQ1JUX0lEX0hXR0NfRkdfU1RBQ0ssIDB4MDApOwoJd2NydChDUlRfSURfSFdHQ19GR19TVEFDSywgMHgwMCk7Cgl3Y3J0KENSVF9JRF9IV0dDX0ZHX1NUQUNLLCAweDAwKTsKCXdjcnQoQ1JUX0lEX0hXR0NfQkdfU1RBQ0ssIDB4MDApOwoJd2NydChDUlRfSURfSFdHQ19CR19TVEFDSywgMHgwMCk7Cgl3Y3J0KENSVF9JRF9IV0dDX0JHX1NUQUNLLCAweDAwKTsKCXdjcnQoQ1JUX0lEX0hXR0NfU1RBUlRfQURfSEksIDB4MDApOwoJd2NydChDUlRfSURfSFdHQ19TVEFSVF9BRF9MTywgMHgwMCk7Cgl3Y3J0KENSVF9JRF9IV0dDX0RTVEFSVF9YLCAweDAwKTsKCXdjcnQoQ1JUX0lEX0hXR0NfRFNUQVJUX1ksIDB4MDApOwoKCXdjcnQoQ1JUX0lEX1VOREVSTElORV9MT0MsIDB4MDApOwoKCXdjcnQoQ1JUX0lEX01PREVfQ09OVFJPTCwgMHhlMyk7Cgl3Y3J0KENSVF9JRF9CQUNLV0FEX0NPTVBfMiwgMHgyMik7CS8qIGJsYW5rIGJkciBiaXQgNSBibGFua2luZyBvbmx5IG9uIDggYml0ICovCgoJd2NydChDUlRfSURfRVhfU1lOQ18xLCAweDAwKTsKCgkvKiBtZW1vcnkgKi8KCgl3Y3J0KENSVF9JRF9FWFRfU1lTX0NOVExfMywgMHgwMCk7Cgl3Y3J0KENSVF9JRF9NRU1PUllfQ09ORiwgMHgwOCk7CQkvKiBjb25maWcgZW5oYW5jZWQgbWFwICovCgl3Y3J0KENSVF9JRF9FWFRfTUVNX0NOVExfMSwgMHgwOCk7CS8qIE1NSU8gU2VsZWN0ICgweDBjIHdvcmtzIGFzIHdlbGwpKi8KCXdjcnQoQ1JUX0lEX0VYVF9NRU1fQ05UTF8yLCAweDAyKTsJLyogd2h5IDAyIGJpZyBlbmRpYW4gMDAgd29ya3MgPyAqLwoJd2NydChDUlRfSURfRVhUX01FTV9DTlRMXzQsIDB4OWYpOwkvKiBjb25maWcgYmlnIGVuZGlhbiAtIDB4MDAgPyAgKi8KCXdjcnQoQ1JUX0lEX0xBV19QT1NfSEksIDB4MDApOwoJd2NydChDUlRfSURfTEFXX1BPU19MTywgMHgwMCk7Cgl3Y3J0KENSVF9JRF9FWFRfTUlTQ19DTlRMXzEsIDB4ODEpOwoJd2NydChDUlRfSURfTUlTQ18xLCAweDkwKTsJCS8qIG11c3QgZm9sbG93IENSVF9JRF9FWFRfTUlTQ19DTlRMXzEgKi8KCXdjcnQoQ1JUX0lEX0xBV19DTlRMLCAweDEzKTsJCS8qIGZvcmNlIDQgTWVnIGZvciB0ZXN0ICovCglpZiAoY3YzZF9oYXNfNG1iKCkpIHsKCQl2X3JhbV9zaXplID0gMHgwMDQwMDAwMDsKCQl3Y3J0KENSVF9JRF9MQVdfQ05UTCwgMHgxMyk7CS8qIDQgTUIgKi8KCX0gZWxzZSB7CgkJdl9yYW1fc2l6ZSA9IDB4MDAyMDAwMDA7CgkJd2NydChDUlRfSURfTEFXX0NOVEwsIDB4MTIpOyAJLyogMiBNQiAqLwoJfQoKCWlmIChvbl96b3JybzIpCgkJdl9yYW1fc2l6ZSAtPSAweDYwMDAwOwkJLyogd2UgbmVlZCBzb21lIHNwYWNlIGZvciB0aGUgcmVnaXN0ZXJzICovCgoJd2NydChDUlRfSURfRVhUX1NZU19DTlRMXzQsIDB4MDApOwoJd2NydChDUlRfSURfRVhUX0RBQ19DTlRMLCAweDAwKTsJLyogMHgxMCBmb3IgWDExIGN1cnNvciBtb2RlICovCgovKiBzZXF1ZW5jZXIgcmVnaXN0ZXJzICovCgoJd3NlcShTRVFfSURfQ0xPQ0tJTkdfTU9ERSwgMHgwMSk7CS8qIDggZG90IGNsb2NrICovCgl3c2VxKFNFUV9JRF9NQVBfTUFTSywgMHhmZik7Cgl3c2VxKFNFUV9JRF9DSEFSX01BUF9TRUxFQ1QsIDB4MDApOwoJd3NlcShTRVFfSURfTUVNT1JZX01PREUsIDB4MDIpOwoJd3NlcShTRVFfSURfUkFNREFDX0NOVEwsIDB4MDApOwoJd3NlcShTRVFfSURfU0lHTkFMX1NFTEVDVCwgMHgwMCk7Cgl3c2VxKFNFUV9JRF9FWFRfU0VRX1JFRzksIDB4MDApOwkvKiBNTUlPIGFuZCBQSU8gcmVnIGFjY2VzcyBlbmFibGVkICovCgl3c2VxKFNFUV9JRF9FWFRfTUlTQ19TRVEsIDB4MDApOwoJd3NlcShTRVFfSURfQ0xLU1lOX0NOVExfMSwgMHgwMCk7Cgl3c2VxKFNFUV9JRF9FWFRfU0VRLCAweDAwKTsKCi8qIGdyYXBoaWMgcmVnaXN0ZXJzICovCgoJd2dmeChHQ1RfSURfU0VUX1JFU0VULCAweDAwKTsKCXdnZngoR0NUX0lEX0VOQUJMRV9TRVRfUkVTRVQsIDB4MDApOwoJd2dmeChHQ1RfSURfQ09MT1JfQ09NUEFSRSwgMHgwMCk7Cgl3Z2Z4KEdDVF9JRF9EQVRBX1JPVEFURSwgMHgwMCk7Cgl3Z2Z4KEdDVF9JRF9SRUFEX01BUF9TRUxFQ1QsIDB4MDApOwoJd2dmeChHQ1RfSURfR1JBUEhJQ1NfTU9ERSwgMHg0MCk7Cgl3Z2Z4KEdDVF9JRF9NSVNDLCAweDAxKTsKCXdnZngoR0NUX0lEX0NPTE9SX1hDQVJFLCAweDBmKTsKCXdnZngoR0NUX0lEX0JJVE1BU0ssIDB4ZmYpOwoKLyogYXR0cmlidXRlICByZWdpc3RlcnMgKi8KCglmb3IoaSA9IDA7IGkgPD0gMTU7IGkrKykKCQl3YXRyKEFDVF9JRF9QQUxFVFRFMCArIGksIGkpOwoJd2F0cihBQ1RfSURfQVRUUl9NT0RFX0NOVEwsIDB4NDEpOwoJd2F0cihBQ1RfSURfT1ZFUlNDQU5fQ09MT1IsIDB4ZmYpOwoJd2F0cihBQ1RfSURfQ09MT1JfUExBTkVfRU5BLCAweDBmKTsKCXdhdHIoQUNUX0lEX0hPUl9QRUxfUEFOTklORywgMHgwMCk7Cgl3YXRyKEFDVF9JRF9DT0xPUl9TRUxFQ1QsIDB4MDApOwoKCXdiX21taW8oVkRBQ19NQVNLLCAweGZmKTsKCi8qIGluaXQgbG9jYWwgY21hcCBhcyBncmV5c2NhbGUgbGV2ZWxzICovCgoJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CgkJdmlyZ2VmYl9jb2xvdXJfdGFibGUgW2ldWzBdID0gaTsKCQl2aXJnZWZiX2NvbG91cl90YWJsZSBbaV1bMV0gPSBpOwoJCXZpcmdlZmJfY29sb3VyX3RhYmxlIFtpXVsyXSA9IGk7Cgl9CgovKiBjbGVhciBmcmFtZWJ1ZmZlciBtZW1vcnkgKi8KCgltZW1zZXQoKGNoYXIqKXZfcmFtLCAweDAwLCB2X3JhbV9zaXplKTsKCglEUFJJTlRLKCJFWElUXG4iKTsKCXJldHVybiAwOwp9CgoKLyoKICogICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgZmlsbCBpbiB0aGUgYGZpeCcgc3RydWN0dXJlIGJhc2VkIG9uIHRoZQogKiAgICB2YWx1ZXMgaW4gdGhlIGBwYXInIHN0cnVjdHVyZS4KICovCgpzdGF0aWMgaW50IHZpcmdlZmJfZW5jb2RlX2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwKCQkJICAgIHN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKQp7CglEUFJJTlRLKCJFTlRFUiBzZXQgdmlkZW8gcGh5cyBhZGRyXG4iKTsKCgltZW1zZXQoZml4LCAwLCBzaXplb2Yoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvKSk7CglzdHJjcHkoZml4LT5pZCwgdmlyZ2VmYl9uYW1lKTsKCWlmIChvbl96b3JybzIpCgkJZml4LT5zbWVtX3N0YXJ0ID0gdl9yYW1fcGh5czsKCXN3aXRjaCAocGFyLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKI2lmZGVmIEZCQ09OX0hBU19DRkI4CgkJY2FzZSA4OgoJCQlpZiAob25fem9ycm8yKQoJCQkJU2VsZWN0X1pvcnJvMl9GcmFtZUJ1ZmZlcihFTkRJQU5fQllURSk7CgkJCWVsc2UKCQkJCWZpeC0+c21lbV9zdGFydCA9ICh2X3JhbV9waHlzICsgQ1lCTUVNX09GRlNFVF84KTsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgRkJDT05fSEFTX0NGQjE2CgkJY2FzZSAxNjoKCQkJaWYgKG9uX3pvcnJvMikKCQkJCVNlbGVjdF9ab3JybzJfRnJhbWVCdWZmZXIoRU5ESUFOX1dPUkQpOwoJCQllbHNlCgkJCQlmaXgtPnNtZW1fc3RhcnQgPSAodl9yYW1fcGh5cyArIENZQk1FTV9PRkZTRVRfMTYpOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKCQljYXNlIDMyOgoJCQlpZiAob25fem9ycm8yKQoJCQkJU2VsZWN0X1pvcnJvMl9GcmFtZUJ1ZmZlcihFTkRJQU5fTE9ORyk7CgkJCWVsc2UKCQkJCWZpeC0+c21lbV9zdGFydCA9ICh2X3JhbV9waHlzICsgQ1lCTUVNX09GRlNFVF8zMik7CgkJCWJyZWFrOwojZW5kaWYKCX0KCglmaXgtPnNtZW1fbGVuID0gdl9yYW1fc2l6ZTsKCWZpeC0+bW1pb19zdGFydCA9IG1taW9fcmVnc19waHlzOwoJZml4LT5tbWlvX2xlbiA9IDB4MTAwMDA7IC8qIFRPRE86IHZlcmlmeSB0aGlzIGZvciB0aGUgQ1Y2NC8zRCAqLwoKCWZpeC0+dHlwZSA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKCWZpeC0+dHlwZV9hdXggPSAwOwoJaWYgKHBhci0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpCgkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfUFNFVURPQ09MT1I7CgllbHNlCgkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOwoKCWZpeC0+eHBhbnN0ZXAgPSAwOwoJZml4LT55cGFuc3RlcCA9IDA7CglmaXgtPnl3cmFwc3RlcCA9IDA7CglmaXgtPmxpbmVfbGVuZ3RoID0gcGFyLT52YXIueHJlc192aXJ0dWFsKnBhci0+dmFyLmJpdHNfcGVyX3BpeGVsLzg7CglmaXgtPmFjY2VsID0gRkJfQUNDRUxfUzNfVklSR0U7CglEUFJJTlRLKCJFWElUIHZfcmFtX3BoeXMgPSAweCU4LjhseFxuIiwgKHVuc2lnbmVkIGxvbmcpZml4LT5zbWVtX3N0YXJ0KTsKCXJldHVybiAwOwp9CgoKLyoKICoJRmlsbCB0aGUgYHBhcicgc3RydWN0dXJlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgaW4gYHZhcicuCiAqCVRPRE86IFZlcmlmeSBhbmQgYWRqdXN0IHZhbHVlcywgcmV0dXJuIC1FSU5WQUwgaWYgYmFkLgogKi8KCnN0YXRpYyBpbnQgdmlyZ2VmYl9kZWNvZGVfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAoJCQkgICAgc3RydWN0IHZpcmdlZmJfcGFyICpwYXIpCnsKCURQUklOVEsoIkVOVEVSXG4iKTsKCXBhci0+dmFyLnhyZXMgPSB2YXItPnhyZXM7CglwYXItPnZhci55cmVzID0gdmFyLT55cmVzOwoJcGFyLT52YXIueHJlc192aXJ0dWFsID0gdmFyLT54cmVzX3ZpcnR1YWw7CglwYXItPnZhci55cmVzX3ZpcnR1YWwgPSB2YXItPnlyZXNfdmlydHVhbDsKCS8qIHJvdW5kdXAgYW5kIHZhbGlkYXRlICovCglwYXItPnZhci54cmVzID0gKHBhci0+dmFyLnhyZXMrNykgJiB+NzsKCXBhci0+dmFyLnhyZXNfdmlydHVhbCA9IChwYXItPnZhci54cmVzX3ZpcnR1YWwrNykgJiB+NzsKCWlmIChwYXItPnZhci54cmVzX3ZpcnR1YWwgPCBwYXItPnZhci54cmVzKQoJCXBhci0+dmFyLnhyZXNfdmlydHVhbCA9IHBhci0+dmFyLnhyZXM7CglpZiAocGFyLT52YXIueXJlc192aXJ0dWFsIDwgcGFyLT52YXIueXJlcykKCQlwYXItPnZhci55cmVzX3ZpcnR1YWwgPSBwYXItPnZhci55cmVzOwoJcGFyLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKCXBhci0+dmFyLnlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7CglwYXItPnZhci5iaXRzX3Blcl9waXhlbCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CglpZiAocGFyLT52YXIuYml0c19wZXJfcGl4ZWwgPD0gOCkKCQlwYXItPnZhci5iaXRzX3Blcl9waXhlbCA9IDg7CgllbHNlIGlmIChwYXItPnZhci5iaXRzX3Blcl9waXhlbCA8PSAxNikKCQlwYXItPnZhci5iaXRzX3Blcl9waXhlbCA9IDE2OwoJZWxzZQoJCXBhci0+dmFyLmJpdHNfcGVyX3BpeGVsID0gMzI7CiNpZm5kZWYgRkJDT05fSEFTX0NGQjMyCglpZiAocGFyLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gMzIpCgkJcGFyLT52YXIuYml0c19wZXJfcGl4ZWwgPSAxNjsKI2VuZGlmCiNpZm5kZWYgRkJDT05fSEFTX0NGQjE2CglpZiAocGFyLT52YXIuYml0c19wZXJfcGl4ZWwgPT0gMTYpCgkJcGFyLT52YXIuYml0c19wZXJfcGl4ZWwgPSA4OwojZW5kaWYKCXBhci0+dmFyLmdyYXlzY2FsZSA9IHZhci0+Z3JheXNjYWxlOwoJcGFyLT52YXIucmVkID0gdmFyLT5yZWQ7CglwYXItPnZhci5ncmVlbiA9IHZhci0+Z3JlZW47CglwYXItPnZhci5ibHVlID0gdmFyLT5ibHVlOwoJcGFyLT52YXIudHJhbnNwID0gdmFyLT50cmFuc3A7CglwYXItPnZhci5ub25zdGQgPSB2YXItPm5vbnN0ZDsKCXBhci0+dmFyLmFjdGl2YXRlID0gdmFyLT5hY3RpdmF0ZTsKCXBhci0+dmFyLmhlaWdodCA9IHZhci0+aGVpZ2h0OwoJcGFyLT52YXIud2lkdGggPSB2YXItPndpZHRoOwoJaWYgKHZhci0+YWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkgewoJCXBhci0+dmFyLmFjY2VsX2ZsYWdzID0gRkJfQUNDRUxGX1RFWFQ7Cgl9IGVsc2UgewoJCXBhci0+dmFyLmFjY2VsX2ZsYWdzID0gMDsKCX0KCXBhci0+dmFyLnBpeGNsb2NrID0gdmFyLT5waXhjbG9jazsKCXBhci0+dmFyLmxlZnRfbWFyZ2luID0gdmFyLT5sZWZ0X21hcmdpbjsKCXBhci0+dmFyLnJpZ2h0X21hcmdpbiA9IHZhci0+cmlnaHRfbWFyZ2luOwoJcGFyLT52YXIudXBwZXJfbWFyZ2luID0gdmFyLT51cHBlcl9tYXJnaW47CglwYXItPnZhci5sb3dlcl9tYXJnaW4gPSB2YXItPmxvd2VyX21hcmdpbjsKCXBhci0+dmFyLmhzeW5jX2xlbiA9IHZhci0+aHN5bmNfbGVuOwoJcGFyLT52YXIudnN5bmNfbGVuID0gdmFyLT52c3luY19sZW47CglwYXItPnZhci5zeW5jID0gdmFyLT5zeW5jOwoJcGFyLT52YXIudm1vZGUgPSB2YXItPnZtb2RlOwoJRFBSSU5USygiRVhJVFxuIik7CglyZXR1cm4gMDsKfQoKLyoKICoJRmlsbCB0aGUgYHZhcicgc3RydWN0dXJlIGJhc2VkIG9uIHRoZSB2YWx1ZXMgaW4gYHBhcicgYW5kIG1heWJlCiAqCW90aGVyIHZhbHVlcyByZWFkIG91dCBvZiB0aGUgaGFyZHdhcmUuCiAqLwoKc3RhdGljIGludCB2aXJnZWZiX2VuY29kZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCgkJCQlzdHJ1Y3QgdmlyZ2VmYl9wYXIgKnBhcikKewoJRFBSSU5USygiRU5URVJcbiIpOwoJbWVtc2V0KHZhciwgMCwgc2l6ZW9mKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbykpOwkvKiBuZWVkIHRoaXMgPyAqLwoJdmFyLT54cmVzID0gcGFyLT52YXIueHJlczsKCXZhci0+eXJlcyA9IHBhci0+dmFyLnlyZXM7Cgl2YXItPnhyZXNfdmlydHVhbCA9IHBhci0+dmFyLnhyZXNfdmlydHVhbDsKCXZhci0+eXJlc192aXJ0dWFsID0gcGFyLT52YXIueXJlc192aXJ0dWFsOwoJdmFyLT54b2Zmc2V0ID0gcGFyLT52YXIueG9mZnNldDsKCXZhci0+eW9mZnNldCA9IHBhci0+dmFyLnlvZmZzZXQ7Cgl2YXItPmJpdHNfcGVyX3BpeGVsID0gcGFyLT52YXIuYml0c19wZXJfcGl4ZWw7Cgl2YXItPmdyYXlzY2FsZSA9IHBhci0+dmFyLmdyYXlzY2FsZTsKCXZhci0+cmVkID0gcGFyLT52YXIucmVkOwoJdmFyLT5ncmVlbiA9IHBhci0+dmFyLmdyZWVuOwoJdmFyLT5ibHVlID0gcGFyLT52YXIuYmx1ZTsKCXZhci0+dHJhbnNwID0gcGFyLT52YXIudHJhbnNwOwoJdmFyLT5ub25zdGQgPSBwYXItPnZhci5ub25zdGQ7Cgl2YXItPmFjdGl2YXRlID0gcGFyLT52YXIuYWN0aXZhdGU7Cgl2YXItPmhlaWdodCA9IHBhci0+dmFyLmhlaWdodDsKCXZhci0+d2lkdGggPSBwYXItPnZhci53aWR0aDsKCXZhci0+YWNjZWxfZmxhZ3MgPSBwYXItPnZhci5hY2NlbF9mbGFnczsKCXZhci0+cGl4Y2xvY2sgPSBwYXItPnZhci5waXhjbG9jazsKCXZhci0+bGVmdF9tYXJnaW4gPSBwYXItPnZhci5sZWZ0X21hcmdpbjsKCXZhci0+cmlnaHRfbWFyZ2luID0gcGFyLT52YXIucmlnaHRfbWFyZ2luOwoJdmFyLT51cHBlcl9tYXJnaW4gPSBwYXItPnZhci51cHBlcl9tYXJnaW47Cgl2YXItPmxvd2VyX21hcmdpbiA9IHBhci0+dmFyLmxvd2VyX21hcmdpbjsKCXZhci0+aHN5bmNfbGVuID0gcGFyLT52YXIuaHN5bmNfbGVuOwoJdmFyLT52c3luY19sZW4gPSBwYXItPnZhci52c3luY19sZW47Cgl2YXItPnN5bmMgPSBwYXItPnZhci5zeW5jOwoJdmFyLT52bW9kZSA9IHBhci0+dmFyLnZtb2RlOwoJRFBSSU5USygiRVhJVFxuIik7CglyZXR1cm4gMDsKfQoKLyoKICogICAgU2V0IGEgc2luZ2xlIGNvbG9yIHJlZ2lzdGVyLiBUaGUgdmFsdWVzIHN1cHBsaWVkIGFyZSBhbHJlYWR5CiAqICAgIHJvdW5kZWQgZG93biB0byB0aGUgaGFyZHdhcmUncyBjYXBhYmlsaXRpZXMgKGFjY29yZGluZyB0byB0aGUKICogICAgZW50cmllcyBpbiB0aGUgdmFyIHN0cnVjdHVyZSkuIFJldHVybiAhPSAwIGZvciBpbnZhbGlkIHJlZ25vLgogKi8KCnN0YXRpYyBpbnQgdmlyZ2VmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCgkJCSAgICAgdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJRFBSSU5USygiRU5URVJcbiIpOwoJaWYgKCgoY3VycmVudF9wYXIudmFyLmJpdHNfcGVyX3BpeGVsPT04KSAmJiAocmVnbm8+MjU1KSkgfHwKCQkoKGN1cnJlbnRfcGFyLnZhci5iaXRzX3Blcl9waXhlbCE9OCkgJiYgKHJlZ25vPjE1KSkpIHsKCQkJRFBSSU5USygiRVhJVFxuIik7CgkJCXJldHVybiAxOwoJfQoJaWYgKCgoY3VycmVudF9wYXIudmFyLmJpdHNfcGVyX3BpeGVsPT04KSAmJiAocmVnbm88MjU2KSkgfHwKCQkJKChjdXJyZW50X3Bhci52YXIuYml0c19wZXJfcGl4ZWwhPTgpICYmIChyZWdubzwxNikpKSB7CgkJdmlyZ2VmYl9jb2xvdXJfdGFibGUgW3JlZ25vXVswXSA9IHJlZCA+PiAxMDsKCQl2aXJnZWZiX2NvbG91cl90YWJsZSBbcmVnbm9dWzFdID0gZ3JlZW4gPj4gMTA7CgkJdmlyZ2VmYl9jb2xvdXJfdGFibGUgW3JlZ25vXVsyXSA9IGJsdWUgPj4gMTA7Cgl9CgoJc3dpdGNoIChjdXJyZW50X3Bhci52YXIuYml0c19wZXJfcGl4ZWwpIHsKI2lmZGVmIEZCQ09OX0hBU19DRkI4CgkJY2FzZSA4OgoJCQl3Yl9tbWlvKFZEQUNfQUREUkVTU19XLCAodW5zaWduZWQgY2hhcilyZWdubyk7CgkJCXdiX21taW8oVkRBQ19EQVRBLCAoKHVuc2lnbmVkIGNoYXIpKHJlZCA+PiAxMCkpKTsKCQkJd2JfbW1pbyhWREFDX0RBVEEsICgodW5zaWduZWQgY2hhcikoZ3JlZW4gPj4gMTApKSk7CgkJCXdiX21taW8oVkRBQ19EQVRBLCAoKHVuc2lnbmVkIGNoYXIpKGJsdWUgPj4gMTApKSk7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEZCQ09OX0hBU19DRkIxNgoJCWNhc2UgMTY6CgkJCWZiY29uX2NtYXAuY2ZiMTZbcmVnbm9dID0KCQkJCSgocmVkICAmIDB4ZjgwMCkgfAoJCQkJKChncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfAoJCQkJKChibHVlICAmIDB4ZjgwMCkgPj4gMTEpKTsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgRkJDT05fSEFTX0NGQjMyCgkJY2FzZSAzMjoKCQkJZmJjb25fY21hcC5jZmIzMltyZWdub10gPQoJCQkJLyogdHJhbnNwID0gMCdzIG9yIDEncyAgPyAqLwoJCQkJKCgocmVkICAmIDB4ZmYwMCkgPDwgOCkgfAoJCQkJKChncmVlbiAmIDB4ZmYwMCkgPj4gMCkgfAoJCQkJKChibHVlICAmIDB4ZmYwMCkgPj4gOCkpOwoJCQlicmVhazsKI2VuZGlmCgl9CglEUFJJTlRLKCJFWElUXG4iKTsKCXJldHVybiAwOwp9CgoKLyoKICogICAgUmVhZCBhIHNpbmdsZSBjb2xvciByZWdpc3RlciBhbmQgc3BsaXQgaXQgaW50bwogKiAgICBjb2xvcnMvdHJhbnNwYXJlbnQuIFJldHVybiAhPSAwIGZvciBpbnZhbGlkIHJlZ25vLgogKi8KCnN0YXRpYyBpbnQgdmlyZ2VmYl9nZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50ICpyZWQsIHVfaW50ICpncmVlbiwgdV9pbnQgKmJsdWUsCgkJCSAgIHVfaW50ICp0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglpbnQgdDsKCglEUFJJTlRLKCJFTlRFUlxuIik7CglpZiAocmVnbm8gPiAyNTUpIHsKCQlEUFJJTlRLKCJFWElUXG4iKTsKCQlyZXR1cm4gMTsKCX0KCWlmICgoKGN1cnJlbnRfcGFyLnZhci5iaXRzX3Blcl9waXhlbD09OCkgJiYgKHJlZ25vPDI1NikpIHx8CgkJCSgoY3VycmVudF9wYXIudmFyLmJpdHNfcGVyX3BpeGVsIT04KSAmJiAocmVnbm88MTYpKSkgewoKCQl0ID0gdmlyZ2VmYl9jb2xvdXJfdGFibGUgW3JlZ25vXVswXTsKCQkqcmVkID0gKHQ8PDEwKSB8ICh0PDw0KSB8ICh0Pj4yKTsKCQl0ID0gdmlyZ2VmYl9jb2xvdXJfdGFibGUgW3JlZ25vXVsxXTsKCQkqZ3JlZW4gPSAodDw8MTApIHwgKHQ8PDQpIHwgKHQ+PjIpOwoJCXQgPSB2aXJnZWZiX2NvbG91cl90YWJsZSBbcmVnbm9dWzJdOwoJCSpibHVlID0gKHQ8PDEwKSB8ICh0PDw0KSB8ICh0Pj4yKTsKCX0KCSp0cmFuc3AgPSAwOwoJRFBSSU5USygiRVhJVFxuIik7CglyZXR1cm4gMDsKfQoKCi8qCiAqICAgIChVbilCbGFuayB0aGUgc2NyZWVuCiAqLwoKc3RhdGljIHZvaWQgdmlyZ2VmYl9nZnhfb25fb2ZmKGludCBibGFuaykKewoJRFBSSU5USygiRU5URVJcbiIpOwoJZ2Z4X29uX29mZihibGFuayk7CglEUFJJTlRLKCJFWElUXG4iKTsKfQoKLyoKICogQ1YzRCBsb3ctbGV2ZWwgc3VwcG9ydAogKi8KCgpzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF8zZF9maWZvX3Nsb3RzKGludCBuKQkvKiBXYWl0UXVldWUgKi8KewoJZG8gewoJCW1iKCk7Cgl9IHdoaWxlICgoKHJsX21taW8oTVJfU1VCU1lTVEVNX1NUQVRVU19SKSA+PiA4KSAmIDB4MWYpIDwgKG4gKyAyKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCB2aXJnZWZiX3dhaXRfZm9yX2lkbGUodm9pZCkJLyogV2FpdElkbGUgKi8KewoJd2hpbGUoIShybF9tbWlvKE1SX1NVQlNZU1RFTV9TVEFUVVNfUikgJiAweDIwMDApKSA7CglibGl0X21heWJlX2J1c3kgPSAwOwp9CgogLyoKICAqIEJpdEJMVCAtIFRocm91Z2ggdGhlIFBsYW5lCiAgKi8KCnN0YXRpYyB2b2lkIHZpcmdlZmJfQml0QkxUKHVfc2hvcnQgY3VyeCwgdV9zaG9ydCBjdXJ5LCB1X3Nob3J0IGRlc3R4LCB1X3Nob3J0IGRlc3R5LAoJCQl1X3Nob3J0IHdpZHRoLCB1X3Nob3J0IGhlaWdodCwgdV9zaG9ydCBzdHJpZGUsIHVfc2hvcnQgZGVwdGgpCnsKCXVuc2lnbmVkIGludCBibGl0Y21kID0gUzNWX0JJVEJMVCB8IFMzVl9EUkFXIHwgUzNWX0JMVF9DT1BZOwoKCXN3aXRjaCAoZGVwdGgpIHsKI2lmZGVmIEZCQ09OX0hBU19DRkI4CgkJY2FzZSA4IDoKCQkJYmxpdGNtZCB8PSBTM1ZfRFNUXzhCUFA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEZCQ09OX0hBU19DRkIxNgoJCWNhc2UgMTYgOgoJCQlibGl0Y21kIHw9IFMzVl9EU1RfMTZCUFA7CgkJCWJyZWFrOwojZW5kaWYKI2lmZGVmIEZCQ09OX0hBU19DRkIzMgoJCWNhc2UgMzIgOgoJCQkvKiAzMiBiaXQgdXNlcyAyIGJ5IDE2IGJpdCB2YWx1ZXMsIHNlZSBmYmNvbl92aXJnZTMyX2Jtb3ZlICovCgkJCWJsaXRjbWQgfD0gUzNWX0RTVF8xNkJQUDsKCQkJYnJlYWs7CiNlbmRpZgoJfQoKCS8qIFNldCBkcmF3aW5nIGRpcmVjdGlvbiAqLwoJLyogLVksIFggbWFqLCAtWCAoZGVmYXVsdCkgKi8KCWlmIChjdXJ4ID4gZGVzdHgpIHsKCQlibGl0Y21kIHw9ICgxIDw8IDI1KTsgIC8qIERyYXdpbmcgZGlyZWN0aW9uICtYICovCgl9IGVsc2UgewoJCWN1cnggICs9ICh3aWR0aCAtIDEpOwoJCWRlc3R4ICs9ICh3aWR0aCAtIDEpOwoJfQoKCWlmIChjdXJ5ID4gZGVzdHkpIHsKCQlibGl0Y21kIHw9ICgxIDw8IDI2KTsgIC8qIERyYXdpbmcgZGlyZWN0aW9uICtZICovCgl9IGVsc2UgewoJCWN1cnkgICs9IChoZWlnaHQgLSAxKTsKCQlkZXN0eSArPSAoaGVpZ2h0IC0gMSk7Cgl9CgoJd2FpdF8zZF9maWZvX3Nsb3RzKDgpOwkJLyogd2FpdCBvbiBmaWZvIHNsb3RzIGZvciA4IHdyaXRlcyAqLwoKCWlmIChibGl0X21heWJlX2J1c3kpCgkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CglibGl0X21heWJlX2J1c3kgPSAxOwoKCXdsX21taW8oQkxUX1BBVFRFUk5fQ09MT1IsIDEpOwkvKiBwYXR0ZXJuIGZiIGNvbG9yICovCgl3bF9tbWlvKEJMVF9NT05PX1BBVFRFUk5fMCwgfjApOwoJd2xfbW1pbyhCTFRfTU9OT19QQVRURVJOXzEsIH4wKTsKCXdsX21taW8oQkxUX1NJWkVfWF9ZLCAoKHdpZHRoIDw8IDE2KSB8IGhlaWdodCkpOwoJd2xfbW1pbyhCTFRfU1JDX1hfWSwgKChjdXJ4IDw8IDE2KSAgfCBjdXJ5KSk7Cgl3bF9tbWlvKEJMVF9ERVNUX1hfWSwgKChkZXN0eCA8PCAxNikgfCBkZXN0eSkpOwoJd2xfbW1pbyhCTFRfU1JDX0RFU1RfU1RSSURFLCAoKChzdHJpZGUgPDwgMTYpIHwgc3RyaWRlKSAvKiAmIDB4MGZmODBmZjggKi8pKTsgLyogd2h5IGlzIHRoaXMgbmVlZGVkIG5vdyA/ICovCgl3bF9tbWlvKEJMVF9DT01NQU5EX1NFVCwgYmxpdGNtZCk7Cn0KCi8qCiAqIFJlY3RhbmdsZSBGaWxsIFNvbGlkCiAqLwoKc3RhdGljIHZvaWQgdmlyZ2VmYl9SZWN0RmlsbCh1X3Nob3J0IHgsIHVfc2hvcnQgeSwgdV9zaG9ydCB3aWR0aCwgdV9zaG9ydCBoZWlnaHQsCgkJCXVfc2hvcnQgY29sb3IsICB1X3Nob3J0IHN0cmlkZSwgdV9zaG9ydCBkZXB0aCkKewoJdW5zaWduZWQgaW50IGJsaXRjbWQgPSBTM1ZfUkVDVEZJTEwgfCBTM1ZfRFJBVyB8CgkJUzNWX0JMVF9DTEVBUiB8IFMzVl9NT05PX1BBVCB8ICgxIDw8IDI2KSB8ICgxIDw8IDI1KTsKCglzd2l0Y2ggKGRlcHRoKSB7CiNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAoJCWNhc2UgOCA6CgkJCWJsaXRjbWQgfD0gUzNWX0RTVF84QlBQOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKCQljYXNlIDE2IDoKCQkJYmxpdGNtZCB8PSBTM1ZfRFNUXzE2QlBQOwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKCQljYXNlIDMyIDoKCQkJLyogMzIgYml0IHVzZXMgMiB0aW1lcyAxNiBiaXQgdmFsdWVzLCBzZWUgZmJjb25fdmlyZ2UzMl9jbGVhciAqLwoJCQlibGl0Y21kIHw9IFMzVl9EU1RfMTZCUFA7CgkJCWJyZWFrOwojZW5kaWYKCX0KCgl3YWl0XzNkX2ZpZm9fc2xvdHMoNSk7CQkvKiB3YWl0IG9uIGZpZm8gc2xvdHMgZm9yIDUgd3JpdGVzICovCgoJaWYgKGJsaXRfbWF5YmVfYnVzeSkKCQl2aXJnZWZiX3dhaXRfZm9yX2lkbGUoKTsKCWJsaXRfbWF5YmVfYnVzeSA9IDE7CgoJd2xfbW1pbyhCTFRfUEFUVEVSTl9DT0xPUiwgKGNvbG9yICYgMHhmZikpOwoJd2xfbW1pbyhCTFRfU0laRV9YX1ksICgod2lkdGggPDwgMTYpIHwgaGVpZ2h0KSk7Cgl3bF9tbWlvKEJMVF9ERVNUX1hfWSwgKCh4IDw8IDE2KSB8IHkpKTsKCXdsX21taW8oQkxUX1NSQ19ERVNUX1NUUklERSwgKCgoc3RyaWRlIDw8IDE2KSB8IHN0cmlkZSkgLyogJiAweDBmZjgwZmY4ICovKSk7Cgl3bF9tbWlvKEJMVF9DT01NQU5EX1NFVCwgYmxpdGNtZCk7Cn0KCi8qCiAqIE1vdmUgY3Vyc29yIHRvIHgsIHkKICovCgojaWYgMApzdGF0aWMgdm9pZCB2aXJnZWZiX21vdmVfY3Vyc29yKHVfc2hvcnQgeCwgdV9zaG9ydCB5KQp7CglEUFJJTlRLKCJZdWNrIC4uLi4gTW92ZUN1cnNvciBvbiBhIDNEXG4iKTsKCXJldHVybiAwOwp9CiNlbmRpZgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJmYWNlcyB0byBoYXJkd2FyZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyBzdHJ1Y3QgZmJfaHdzd2l0Y2ggdmlyZ2VmYl9od19zd2l0Y2ggPSB7CgkuaW5pdAkJPSB2aXJnZV9pbml0LAoJLmVuY29kZV9maXgJPSB2aXJnZWZiX2VuY29kZV9maXgsCgkuZGVjb2RlX3Zhcgk9IHZpcmdlZmJfZGVjb2RlX3ZhciwKCS5lbmNvZGVfdmFyCT0gdmlyZ2VmYl9lbmNvZGVfdmFyLAoJLmdldGNvbHJlZwk9IHZpcmdlZmJfZ2V0Y29scmVnLAoJLmJsYW5rCQk9IHZpcmdlZmJfZ2Z4X29uX29mZgp9OwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEdlbmVyaWMgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoKLyoKICogICAgRmlsbCB0aGUgaGFyZHdhcmUncyBgcGFyJyBzdHJ1Y3R1cmUuCiAqLwoKc3RhdGljIHZvaWQgdmlyZ2VmYl9nZXRfcGFyKHN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKQp7CglEUFJJTlRLKCJFTlRFUlxuIik7CglpZiAoY3VycmVudF9wYXJfdmFsaWQpIHsKCQkqcGFyID0gY3VycmVudF9wYXI7Cgl9IGVsc2UgewoJCWZiaHctPmRlY29kZV92YXIoJnZpcmdlZmJfZGVmYXVsdCwgcGFyKTsKCX0KCURQUklOVEsoIkVYSVRcbiIpOwp9CgoKc3RhdGljIHZvaWQgdmlyZ2VmYl9zZXRfcGFyKHN0cnVjdCB2aXJnZWZiX3BhciAqcGFyKQp7CglEUFJJTlRLKCJFTlRFUlxuIik7CgljdXJyZW50X3BhciA9ICpwYXI7CgljdXJyZW50X3Bhcl92YWxpZCA9IDE7CglEUFJJTlRLKCJFWElUXG4iKTsKfQoKCnN0YXRpYyB2b2lkIHZpcmdlZmJfc2V0X3ZpZGVvKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQp7Ci8qIFNldCBjbGlwcGluZyByZWN0YW5nbGUgdG8gY3VycmVudCBzY3JlZW4gc2l6ZSAqLwoKCXVuc2lnbmVkIGludCBjbGlwOwoKCURQUklOVEsoIkVOVEVSXG4iKTsKCXdhaXRfM2RfZmlmb19zbG90cyg0KTsKCWNsaXAgPSAoKDAgPDwgMTYpIHwgKHZhci0+eHJlcyAtIDEpKTsKCXdsX21taW8oQkxUX0NMSVBfTEVGVF9SSUdIVCwgY2xpcCk7CgljbGlwID0gKCgwIDw8IDE2KSB8ICh2YXItPnlyZXMgLSAxKSk7Cgl3bF9tbWlvKEJMVF9DTElQX1RPUF9CT1RUT00sIGNsaXApOwoJd2xfbW1pbyhCTFRfU1JDX0JBU0UsIDApOwkJLyogc2VlbXMgd2UgbmVlZCB0byBjbGVhciB0aGVzZSB0d28gKi8KCXdsX21taW8oQkxUX0RFU1RfQkFTRSwgMCk7CgovKiBMb2FkIHRoZSB2aWRlbyBtb2RlIGRlZmluZWQgYnkgdGhlICd2YXInIGRhdGEgKi8KCgl2aXJnZWZiX2xvYWRfdmlkZW9fbW9kZSh2YXIpOwoJRFBSSU5USygiRVhJVFxuIik7Cn0KCi8qCk1lcmdlIHRoZXNlIHR3byBmdW5jdGlvbnMsIEdlZXJ0J3Mgc3VnZ2VzdGlvbi4Kc3RhdGljIGludCB2aXJnZWZiX3NldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCB2aXJnZWZiX2RvX2ZiX3NldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBpc2FjdGl2ZSk7CiovCgpzdGF0aWMgaW50IHZpcmdlZmJfZG9fZmJfc2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGlzYWN0aXZlKQp7CglpbnQgZXJyLCBhY3RpdmF0ZTsKCXN0cnVjdCB2aXJnZWZiX3BhciBwYXI7CgoJRFBSSU5USygiRU5URVJcbiIpOwoJaWYgKChlcnIgPSBmYmh3LT5kZWNvZGVfdmFyKHZhciwgJnBhcikpKSB7CgkJRFBSSU5USygiRVhJVFxuIik7CgkJcmV0dXJuIChlcnIpOwoJfQoKCWFjdGl2YXRlID0gdmFyLT5hY3RpdmF0ZTsKCWlmICgodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX01BU0spID09IEZCX0FDVElWQVRFX05PVyAmJiBpc2FjdGl2ZSkKCQl2aXJnZWZiX3NldF9wYXIoJnBhcik7CglmYmh3LT5lbmNvZGVfdmFyKHZhciwgJnBhcik7Cgl2YXItPmFjdGl2YXRlID0gYWN0aXZhdGU7CiAgICAgICAgaWYgKCh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfTUFTSykgPT0gRkJfQUNUSVZBVEVfTk9XICYmIGlzYWN0aXZlKQoJCXZpcmdlZmJfc2V0X3ZpZGVvKHZhcik7CglEUFJJTlRLKCJFWElUXG4iKTsKCXJldHVybiAwOwp9CgoKLyoKICogICAgR2V0IHRoZSBGaXhlZCBQYXJ0IG9mIHRoZSBEaXNwbGF5CiAqLwoKc3RhdGljIGludCB2aXJnZWZiX2dldF9maXgoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsIGludCBjb24sCgkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgdmlyZ2VmYl9wYXIgcGFyOwoJaW50IGVycm9yID0gMDsKCglEUFJJTlRLKCJFTlRFUlxuIik7CglpZiAoY29uID09IC0xKQoJCXZpcmdlZmJfZ2V0X3BhcigmcGFyKTsKCWVsc2UKCQllcnJvciA9IGZiaHctPmRlY29kZV92YXIoJmZiX2Rpc3BsYXlbY29uXS52YXIsICZwYXIpOwoKCWlmICghZXJyb3IpCgkJZXJyb3IgPSBmYmh3LT5lbmNvZGVfZml4KGZpeCwgJnBhcik7CglEUFJJTlRLKCJFWElUXG4iKTsKCXJldHVybihlcnJvcik7Cn0KCgovKgogKiAgICBHZXQgdGhlIFVzZXIgRGVmaW5lZCBQYXJ0IG9mIHRoZSBEaXNwbGF5CiAqLwoKc3RhdGljIGludCB2aXJnZWZiX2dldF92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIGludCBjb24sCgkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgdmlyZ2VmYl9wYXIgcGFyOwoJaW50IGVycm9yID0gMDsKCglEUFJJTlRLKCJFTlRFUlxuIik7CglpZiAoY29uID09IC0xKSB7CgkJdmlyZ2VmYl9nZXRfcGFyKCZwYXIpOwoJCWVycm9yID0gZmJody0+ZW5jb2RlX3Zhcih2YXIsICZwYXIpOwoJCWRpc3AudmFyID0gKnZhcjsgICAvKiArK0FuZHJlOiBkb24ndCBrbm93IGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHBsYWNlICovCgl9IGVsc2UgewoJCSp2YXIgPSBmYl9kaXNwbGF5W2Nvbl0udmFyOwoJfQoJRFBSSU5USygiRVhJVFxuIik7CglyZXR1cm4oZXJyb3IpOwp9CgpzdGF0aWMgdm9pZCB2aXJnZWZiX3NldF9kaXNwKGludCBjb24sIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gZml4OwoJc3RydWN0IGRpc3BsYXkgKmRpc3BsYXk7CgoJRFBSSU5USygiRU5URVJcbiIpOwoJaWYgKGNvbiA+PSAwKQoJCWRpc3BsYXkgPSAmZmJfZGlzcGxheVtjb25dOwoJZWxzZQoJCWRpc3BsYXkgPSAmZGlzcDsJLyogdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KCgl2aXJnZWZiX2dldF9maXgoJmZpeCwgY29uLCBpbmZvKTsKCWlmIChjb24gPT0gLTEpCgkJY29uID0gMDsKCWlmKG9uX3pvcnJvMikgewoJCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIqKXZfcmFtOwoJfSBlbHNlIHsKCSAgICAgICAgc3dpdGNoIChkaXNwbGF5LT52YXIuYml0c19wZXJfcGl4ZWwpIHsKI2lmZGVmIEZCQ09OX0hBU19DRkI4CgkJCWNhc2UgODoKCQkJCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIqKSh2X3JhbSArIENZQk1FTV9PRkZTRVRfOCk7CgkJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKCQkJY2FzZSAxNjoKCQkJCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIqKSh2X3JhbSArIENZQk1FTV9PRkZTRVRfMTYpOwoJCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgRkJDT05fSEFTX0NGQjMyCgkJCWNhc2UgMzI6CgkJCQlpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyKikodl9yYW0gKyBDWUJNRU1fT0ZGU0VUXzMyKTsKCQkJCWJyZWFrOwojZW5kaWYKCQl9Cgl9CglkaXNwbGF5LT52aXN1YWwgPSBmaXgudmlzdWFsOwoJZGlzcGxheS0+dHlwZSA9IGZpeC50eXBlOwoJZGlzcGxheS0+dHlwZV9hdXggPSBmaXgudHlwZV9hdXg7CglkaXNwbGF5LT55cGFuc3RlcCA9IGZpeC55cGFuc3RlcDsKCWRpc3BsYXktPnl3cmFwc3RlcCA9IGZpeC55d3JhcHN0ZXA7CglkaXNwbGF5LT5jYW5fc29mdF9ibGFuayA9IDE7CglkaXNwbGF5LT5pbnZlcnNlID0gdmlyZ2VmYl9pbnZlcnNlOwoJZGlzcGxheS0+bGluZV9sZW5ndGggPSBkaXNwbGF5LT52YXIueHJlc192aXJ0dWFsKgoJCQkgICAgICAgZGlzcGxheS0+dmFyLmJpdHNfcGVyX3BpeGVsLzg7CgoJc3dpdGNoIChkaXNwbGF5LT52YXIuYml0c19wZXJfcGl4ZWwpIHsKI2lmZGVmIEZCQ09OX0hBU19DRkI4CgkJY2FzZSA4OgoJCQlpZiAoZGlzcGxheS0+dmFyLmFjY2VsX2ZsYWdzICYgRkJfQUNDRUxGX1RFWFQpIHsKCQkgICAJCWRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl92aXJnZTg7CiN3YXJuaW5nIEZJWE1FOiBXZSBzaG91bGQgcmVpbml0IHRoZSBncmFwaGljcyBlbmdpbmUgaGVyZQoJCQl9IGVsc2UKCQkJCWRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl9jZmI4OwoJCQlicmVhazsKI2VuZGlmCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKCQljYXNlIDE2OgoJCQlpZiAoZGlzcGxheS0+dmFyLmFjY2VsX2ZsYWdzICYgRkJfQUNDRUxGX1RFWFQpIHsKCQkJCWRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl92aXJnZTE2OwoJCQl9IGVsc2UKCQkJCWRpc3BsYXktPmRpc3BzdyA9ICZmYmNvbl9jZmIxNjsKCQkJZGlzcGxheS0+ZGlzcHN3X2RhdGEgPSAmZmJjb25fY21hcC5jZmIxNjsKCQkJYnJlYWs7CiNlbmRpZgojaWZkZWYgRkJDT05fSEFTX0NGQjMyCgkJY2FzZSAzMjoKCQkJaWYgKGRpc3BsYXktPnZhci5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUKSB7CgkJCQlkaXNwbGF5LT5kaXNwc3cgPSAmZmJjb25fdmlyZ2UzMjsKCQkJfSBlbHNlCgkJCQlkaXNwbGF5LT5kaXNwc3cgPSAmZmJjb25fY2ZiMzI7CgkJCWRpc3BsYXktPmRpc3Bzd19kYXRhID0gJmZiY29uX2NtYXAuY2ZiMzI7CgkJCWJyZWFrOwojZW5kaWYKCQlkZWZhdWx0OgoJCQlkaXNwbGF5LT5kaXNwc3cgPSAmZmJjb25fZHVtbXk7CgkJCWJyZWFrOwoJfQoJRFBSSU5USygiRVhJVCB2X3JhbSB2aXJ0ID0gMHglOC44bHhcbiIsKHVuc2lnbmVkIGxvbmcpZGlzcGxheS0+c2NyZWVuX2Jhc2UpOwp9CgoKLyoKICogICAgU2V0IHRoZSBVc2VyIERlZmluZWQgUGFydCBvZiB0aGUgRGlzcGxheQogKi8KCnN0YXRpYyBpbnQgdmlyZ2VmYl9zZXRfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBpbnQgY29uLAoJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJaW50IGVyciwgb2xkeHJlcywgb2xkeXJlcywgb2xkdnhyZXMsIG9sZHZ5cmVzLCBvbGRicHAsIG9sZGFjY2VsOwoKCURQUklOVEsoIkVOVEVSXG4iKTsKCglpZiAoKGVyciA9IHZpcmdlZmJfZG9fZmJfc2V0X3Zhcih2YXIsIGNvbiA9PSBpbmZvLT5jdXJyY29uKSkpIHsKCQlEUFJJTlRLKCJFWElUXG4iKTsKCQlyZXR1cm4oZXJyKTsKCX0KCWlmICgodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX01BU0spID09IEZCX0FDVElWQVRFX05PVykgewoJCW9sZHhyZXMgPSBmYl9kaXNwbGF5W2Nvbl0udmFyLnhyZXM7CgkJb2xkeXJlcyA9IGZiX2Rpc3BsYXlbY29uXS52YXIueXJlczsKCQlvbGR2eHJlcyA9IGZiX2Rpc3BsYXlbY29uXS52YXIueHJlc192aXJ0dWFsOwoJCW9sZHZ5cmVzID0gZmJfZGlzcGxheVtjb25dLnZhci55cmVzX3ZpcnR1YWw7CgkJb2xkYnBwID0gZmJfZGlzcGxheVtjb25dLnZhci5iaXRzX3Blcl9waXhlbDsKCQlvbGRhY2NlbCA9IGZiX2Rpc3BsYXlbY29uXS52YXIuYWNjZWxfZmxhZ3M7CgkJZmJfZGlzcGxheVtjb25dLnZhciA9ICp2YXI7CgkJaWYgKG9sZHhyZXMgIT0gdmFyLT54cmVzIHx8IG9sZHlyZXMgIT0gdmFyLT55cmVzIHx8CgkJICAgIG9sZHZ4cmVzICE9IHZhci0+eHJlc192aXJ0dWFsIHx8CgkJICAgIG9sZHZ5cmVzICE9IHZhci0+eXJlc192aXJ0dWFsIHx8CgkJICAgIG9sZGJwcCAhPSB2YXItPmJpdHNfcGVyX3BpeGVsIHx8CgkJICAgIG9sZGFjY2VsICE9IHZhci0+YWNjZWxfZmxhZ3MpIHsKCQkJdmlyZ2VmYl9zZXRfZGlzcChjb24sIGluZm8pOwoJCQlpZiAoZmJfaW5mby5jaGFuZ2V2YXIpCgkJCQkoKmZiX2luZm8uY2hhbmdldmFyKShjb24pOwoJCQlmYl9hbGxvY19jbWFwKCZmYl9kaXNwbGF5W2Nvbl0uY21hcCwgMCwgMCk7CgkJCWRvX2luc3RhbGxfY21hcChjb24sIGluZm8pOwoJCX0KCX0KCXZhci0+YWN0aXZhdGUgPSAwOwoJRFBSSU5USygiRVhJVFxuIik7CglyZXR1cm4gMDsKfQoKCi8qCiAqICAgIEdldCB0aGUgQ29sb3JtYXAKICovCgpzdGF0aWMgaW50IHZpcmdlZmJfZ2V0X2NtYXAoc3RydWN0IGZiX2NtYXAgKmNtYXAsIGludCBrc3BjLCBpbnQgY29uLAoJCQkgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCURQUklOVEsoIkVOVEVSXG4iKTsKCWlmIChjb24gPT0gaW5mby0+Y3VycmNvbikgeyAvKiBjdXJyZW50IGNvbnNvbGU/ICovCgkJRFBSSU5USygiRVhJVCAtIGNvbnNvbGUgaXMgY3VycmVudCBjb25zb2xlLCBmYl9nZXRfY21hcFxuIik7CgkJcmV0dXJuKGZiX2dldF9jbWFwKGNtYXAsIGtzcGMsIGZiaHctPmdldGNvbHJlZywgaW5mbykpOwoJfSBlbHNlIGlmIChmYl9kaXNwbGF5W2Nvbl0uY21hcC5sZW4pIHsgLyogbm9uIGRlZmF1bHQgY29sb3JtYXA/ICovCgkJRFBSSU5USygiVXNlIGNvbnNvbGUgY21hcFxuIik7CgkJZmJfY29weV9jbWFwKCZmYl9kaXNwbGF5W2Nvbl0uY21hcCwgY21hcCwga3NwYyA/IDAgOiAyKTsKCX0gZWxzZSB7CgkJRFBSSU5USygiVXNlIGRlZmF1bHQgY21hcFxuIik7CgkJZmJfY29weV9jbWFwKGZiX2RlZmF1bHRfY21hcChmYl9kaXNwbGF5W2Nvbl0udmFyLmJpdHNfcGVyX3BpeGVsPT04ID8gMjU2IDogMTYpLAoJCQkgICAgIGNtYXAsIGtzcGMgPyAwIDogMik7Cgl9CglEUFJJTlRLKCJFWElUXG4iKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IGZiX29wcyB2aXJnZWZiX29wcyA9IHsKCS5vd25lciA9CVRISVNfTU9EVUxFLAoJLmZiX2dldF9maXggPQl2aXJnZWZiX2dldF9maXgsCgkuZmJfZ2V0X3ZhciA9CXZpcmdlZmJfZ2V0X3ZhciwKCS5mYl9zZXRfdmFyID0JdmlyZ2VmYl9zZXRfdmFyLAoJLmZiX2dldF9jbWFwID0JdmlyZ2VmYl9nZXRfY21hcCwKCS5mYl9zZXRfY21hcCA9CWdlbl9zZXRfY21hcCwKCS5mYl9zZXRjb2xyZWcgPQl2aXJnZWZiX3NldGNvbHJlZywKCS5mYl9ibGFuayA9CXZpcmdlZmJfYmxhbmssCn07CgppbnQgX19pbml0IHZpcmdlZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKewoJY2hhciAqdGhpc19vcHQ7CglmYl9pbmZvLmZvbnRuYW1lWzBdID0gJ1wwJzsKCglEUFJJTlRLKCJFTlRFUlxuIik7CglpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKSB7CgkJRFBSSU5USygiRVhJVFxuIik7CgkJcmV0dXJuIDA7Cgl9CgoJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewoJCWlmICghKnRoaXNfb3B0KQoJCQljb250aW51ZTsKCQlpZiAoIXN0cmNtcCh0aGlzX29wdCwgImludmVyc2UiKSkgewoJCQl2aXJnZWZiX2ludmVyc2UgPSAxOwoJCQlmYl9pbnZlcnRfY21hcHMoKTsKCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiZm9udDoiLCA1KSkKCQkJc3RyY3B5KGZiX2luZm8uZm9udG5hbWUsIHRoaXNfb3B0KzUpOwojaWZkZWYgRkJDT05fSEFTX0NGQjgKCQllbHNlIGlmICghc3RyY21wICh0aGlzX29wdCwgInZpcmdlOCIpKXsKCQkJdmlyZ2VmYl9kZWZhdWx0ID0gdmlyZ2VmYl9wcmVkZWZpbmVkW1ZJUkdFOF9ERUZNT0RFXS52YXI7CgkJfQojZW5kaWYKI2lmZGVmIEZCQ09OX0hBU19DRkIxNgoJCWVsc2UgaWYgKCFzdHJjbXAgKHRoaXNfb3B0LCAidmlyZ2UxNiIpKXsKCQkJdmlyZ2VmYl9kZWZhdWx0ID0gdmlyZ2VmYl9wcmVkZWZpbmVkW1ZJUkdFMTZfREVGTU9ERV0udmFyOwoJCX0KI2VuZGlmCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKCQllbHNlIGlmICghc3RyY21wICh0aGlzX29wdCwgInZpcmdlMzIiKSl7CgkJCXZpcmdlZmJfZGVmYXVsdCA9IHZpcmdlZmJfcHJlZGVmaW5lZFtWSVJHRTMyX0RFRk1PREVdLnZhcjsKCQl9CiNlbmRpZgoJCWVsc2UKCQkJdmlyZ2VmYl9nZXRfdmlkZW9fbW9kZSh0aGlzX29wdCk7Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAibW9kZSA6IHhyZXM9JWQsIHlyZXM9JWQsIGJwcD0lZFxuIiwgdmlyZ2VmYl9kZWZhdWx0LnhyZXMsCgkJCXZpcmdlZmJfZGVmYXVsdC55cmVzLCB2aXJnZWZiX2RlZmF1bHQuYml0c19wZXJfcGl4ZWwpOwoJRFBSSU5USygiRVhJVFxuIik7CglyZXR1cm4gMDsKfQoKCi8qCiAqICAgIEdldCBhIFZpZGVvIE1vZGUKICovCgpzdGF0aWMgaW50IF9faW5pdCB2aXJnZWZiX2dldF92aWRlb19tb2RlKGNvbnN0IGNoYXIgKm5hbWUpCnsKCWludCBpOwoKCURQUklOVEsoIkVOVEVSXG4iKTsKCWZvciAoaSA9IDA7IGkgPCBOVU1fVE9UQUxfTU9ERVM7IGkrKykgewoJCWlmICghc3RyY21wKG5hbWUsIHZpcmdlZmJfcHJlZGVmaW5lZFtpXS5uYW1lKSkgewoJCQl2aXJnZWZiX2RlZmF1bHQgPSB2aXJnZWZiX3ByZWRlZmluZWRbaV0udmFyOwoJCQlEUFJJTlRLKCJFWElUXG4iKTsKCQkJcmV0dXJuKGkpOwoJCX0KCX0KCS8qICsrQW5kcmU6IHNldCB2aXJnZWZiIGRlZmF1bHQgbW9kZSAqLwoKLyogcHJlZmVyIDE2IGJpdCBkZXB0aCwgOCBpZiBubyAxNiwgaWYgbm8gOCBvciAxNiB1c2UgMzIgKi8KCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKCXZpcmdlZmJfZGVmYXVsdCA9IHZpcmdlZmJfcHJlZGVmaW5lZFtWSVJHRTMyX0RFRk1PREVdLnZhcjsKI2VuZGlmCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAoJdmlyZ2VmYl9kZWZhdWx0ID0gdmlyZ2VmYl9wcmVkZWZpbmVkW1ZJUkdFOF9ERUZNT0RFXS52YXI7CiNlbmRpZgojaWZkZWYgRkJDT05fSEFTX0NGQjE2Cgl2aXJnZWZiX2RlZmF1bHQgPSB2aXJnZWZiX3ByZWRlZmluZWRbVklSR0UxNl9ERUZNT0RFXS52YXI7CiNlbmRpZgoJRFBSSU5USygiRVhJVFxuIik7CglyZXR1cm4gMDsKfQoKLyoKICogICAgSW5pdGlhbGl6YXRpb24KICovCgppbnQgX19pbml0IHZpcmdlZmJfaW5pdCh2b2lkKQp7CglzdHJ1Y3QgdmlyZ2VmYl9wYXIgcGFyOwoJdW5zaWduZWQgbG9uZyBib2FyZF9hZGRyLCBib2FyZF9zaXplOwoJc3RydWN0IHpvcnJvX2RldiAqeiA9IE5VTEw7CgoJRFBSSU5USygiRU5URVJcbiIpOwoKCXogPSB6b3Jyb19maW5kX2RldmljZShaT1JST19QUk9EX1BIQVNFNV9DWUJFUlZJU0lPTjY0XzNELCBOVUxMKTsKCWlmICgheikKCQlyZXR1cm4gLUVOT0RFVjsKCglib2FyZF9hZGRyID0gei0+cmVzb3VyY2Uuc3RhcnQ7CglpZiAoYm9hcmRfYWRkciA8IDB4MDEwMDAwMDApIHsKCgkJLyogYm9hcmQgcnVubmluZyBpbiBaMiBzcGFjZS4gVGhpcyBpbmNsdWRlcyB0aGUgdmlkZW8gbWVtb3J5CgkJICAgIGFzIHdlbGwgYXMgdGhlIFMzIHJlZ2lzdGVyIHNldCAqLwoKCQlvbl96b3JybzIgPSAxOwoJCWJvYXJkX3NpemUgPSAweDAwNDAwMDAwOwoKCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZF9hZGRyLCBib2FyZF9zaXplLCAiUzMgVmlSR0UiKSkKCQkJcmV0dXJuIC1FTk9NRU07CgoJCXZfcmFtX3BoeXMgPSBib2FyZF9hZGRyOwoJCXZfcmFtID0gWlRXT19WQUREUih2X3JhbV9waHlzKTsKCQltbWlvX3JlZ3NfcGh5cyA9ICh1bnNpZ25lZCBsb25nKShib2FyZF9hZGRyICsgMHgwMDNjMDAwMCk7CgkJdmdhaW9fcmVncyA9ICh1bnNpZ25lZCBjaGFyICopIFpUV09fVkFERFIoYm9hcmRfYWRkciArIDB4MDAzYzAwMDApOwoJCW1taW9fcmVncyA9ICh1bnNpZ25lZCBjaGFyICopWlRXT19WQUREUihtbWlvX3JlZ3NfcGh5cyk7CgkJdmNvZGVfc3dpdGNoX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgWlRXT19WQUREUihib2FyZF9hZGRyICsgMHgwMDNhMDAwMCk7CgkJcHJpbnRrKEtFUk5fSU5GTyAiQ1YzRCBkZXRlY3RlZCBydW5uaW5nIGluIFoyIG1vZGUuXG4iKTsKCgl9IGVsc2UgewoKCQkvKiBib2FyZCBydW5uaW5nIGluIFozIHNwYWNlLiBTZXBhcmF0ZSB2aWRlbyBtZW1vcnkgKDMgYXBlcnR1cmVzKQoJCSAgIGFuZCBTMyByZWdpc3RlciBzZXQgKi8KCgkJb25fem9ycm8yID0gMDsKCQlib2FyZF9zaXplID0gMHgwMTAwMDAwMDsKCgkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYm9hcmRfYWRkciwgYm9hcmRfc2l6ZSwgIlMzIFZpUkdFIikpCgkJCXJldHVybiAtRU5PTUVNOwoKCQl2X3JhbV9waHlzICA9IGJvYXJkX2FkZHIgKyAweDA0MDAwMDAwOwoJCXZfcmFtID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcCh2X3JhbV9waHlzLCAweDAxMDAwMDAwKTsKCQltbWlvX3JlZ3NfcGh5cyA9IGJvYXJkX2FkZHIgKyAweDA1MDAwMDAwOwoJCXZnYWlvX3JlZ3MgPSAodW5zaWduZWQgY2hhciAqKWlvcmVtYXAoYm9hcmRfYWRkciArMHgwYzAwMDAwMCwgMHgwMDEwMDAwMCk7IC8qIGluY2x1ZGVzIFBDSSByZWdzICovCgkJbW1pb19yZWdzID0gaW9yZW1hcChtbWlvX3JlZ3NfcGh5cywgMHgwMDAxMDAwMCk7CgkJdmNvZGVfc3dpdGNoX2Jhc2UgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKGJvYXJkX2FkZHIgKyAweDA4MDAwMDAwLCAweDEwMDApOwoJCXByaW50ayhLRVJOX0lORk8gIkNWM0QgZGV0ZWN0ZWQgcnVubmluZyBpbiBaMyBtb2RlXG4iKTsKCX0KCiNpZiBkZWZpbmVkIChWSVJHRUZCREVCVUcpCglEUFJJTlRLKCJib2FyZF9hZGRyICAgICA6IDB4JTguOGx4XG4iLGJvYXJkX2FkZHIpOwoJRFBSSU5USygiYm9hcmRfc2l6ZSAgICAgOiAweCU4LjhseFxuIixib2FyZF9zaXplKTsKCURQUklOVEsoIm1taW9fcmVnc19waHkgIDogMHglOC44bHhcbiIsbW1pb19yZWdzX3BoeXMpOwoJRFBSSU5USygidl9yYW1fcGh5cyAgICAgOiAweCU4LjhseFxuIix2X3JhbV9waHlzKTsKCURQUklOVEsoInZnYWlvX3JlZ3MgICAgIDogMHglOC44bHhcbiIsKHVuc2lnbmVkIGxvbmcpdmdhaW9fcmVncyk7CglEUFJJTlRLKCJtbWlvX3JlZ3MgICAgICA6IDB4JTguOGx4XG4iLCh1bnNpZ25lZCBsb25nKW1taW9fcmVncyk7CglEUFJJTlRLKCJ2X3JhbSAgICAgICAgICA6IDB4JTguOGx4XG4iLHZfcmFtKTsKCURQUklOVEsoInZjb2RlIHN3IGJhc2UgIDogMHglOC44bHhcbiIsdmNvZGVfc3dpdGNoX2Jhc2UpOwojZW5kaWYKCWZiaHcgPSAmdmlyZ2VmYl9od19zd2l0Y2g7CglzdHJjcHkoZmJfaW5mby5tb2RlbmFtZSwgdmlyZ2VmYl9uYW1lKTsKCWZiX2luZm8uY2hhbmdldmFyID0gTlVMTDsKCWZiX2luZm8uZmJvcHMgPSAmdmlyZ2VmYl9vcHM7CglmYl9pbmZvLmRpc3AgPSAmZGlzcDsKCWZiX2luZm8uY3VycmNvbiA9IC0xOwoJZmJfaW5mby5zd2l0Y2hfY29uID0gJnZpcmdlZmJfc3dpdGNoOwoJZmJfaW5mby51cGRhdGV2YXIgPSAmdmlyZ2VmYl91cGRhdGV2YXI7CglmYl9pbmZvLmZsYWdzID0gRkJJTkZPX0ZMQUdfREVGQVVMVDsKCWZiaHctPmluaXQoKTsKCWZiaHctPmRlY29kZV92YXIoJnZpcmdlZmJfZGVmYXVsdCwgJnBhcik7CglmYmh3LT5lbmNvZGVfdmFyKCZ2aXJnZWZiX2RlZmF1bHQsICZwYXIpOwoJdmlyZ2VmYl9kb19mYl9zZXRfdmFyKCZ2aXJnZWZiX2RlZmF1bHQsIDEpOwoJdmlyZ2VmYl9nZXRfdmFyKCZmYl9kaXNwbGF5WzBdLnZhciwgLTEsICZmYl9pbmZvKTsKCXZpcmdlZmJfc2V0X2Rpc3AoLTEsICZmYl9pbmZvKTsKCWRvX2luc3RhbGxfY21hcCgwLCAmZmJfaW5mbyk7CgoJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKSA8IDApIHsKCQkjd2FybmluZyByZWxlYXNlIHJlc291cmNlcwoJCXByaW50ayhLRVJOX0VSUiAidmlyZ2VmYi5jOiByZWdpc3Rlcl9mcmFtZWJ1ZmZlciBmYWlsZWRcbiIpOwoJCURQUklOVEsoIkVYSVRcbiIpOwoJCWdvdG8gb3V0X3VubWFwOwoJfQoKCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2UsIHVzaW5nICVsZEsgb2YgdmlkZW8gbWVtb3J5XG4iLAoJICAgICAgIGZiX2luZm8ubm9kZSwgZmJfaW5mby5tb2RlbmFtZSwgdl9yYW1fc2l6ZT4+MTApOwoKCS8qIFRPRE86IFRoaXMgZHJpdmVyIGNhbm5vdCBiZSB1bmxvYWRlZCB5ZXQgKi8KCglEUFJJTlRLKCJFWElUXG4iKTsKCXJldHVybiAwOwoKb3V0X3VubWFwOgoJaWYgKGJvYXJkX2FkZHIgPj0gMHgwMTAwMDAwMCkgewoJCWlmICh2X3JhbSkKCQkJaW91bm1hcCgodm9pZCopdl9yYW0pOwoJCWlmICh2Z2Fpb19yZWdzKQoJCQlpb3VubWFwKHZnYWlvX3JlZ3MpOwoJCWlmIChtbWlvX3JlZ3MpCgkJCWlvdW5tYXAobW1pb19yZWdzKTsKCQlpZiAodmNvZGVfc3dpdGNoX2Jhc2UpCgkJCWlvdW5tYXAoKHZvaWQqKXZjb2RlX3N3aXRjaF9iYXNlKTsKCQl2X3JhbSA9IHZjb2RlX3N3aXRjaF9iYXNlID0gMDsKCQl2Z2Fpb19yZWdzID0gbW1pb19yZWdzID0gTlVMTDsKCX0KCXJldHVybiAtRUlOVkFMOwp9CgoKc3RhdGljIGludCB2aXJnZWZiX3N3aXRjaChpbnQgY29uLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJRFBSSU5USygiRU5URVJcbiIpOwoJLyogRG8gd2UgaGF2ZSB0byBzYXZlIHRoZSBjb2xvcm1hcD8gKi8KCWlmIChmYl9kaXNwbGF5W2luZm8tPmN1cnJjb25dLmNtYXAubGVuKQoJCWZiX2dldF9jbWFwKCZmYl9kaXNwbGF5W2luZm8tPmN1cnJjb25dLmNtYXAsIDEsCgkJCSAgICBmYmh3LT5nZXRjb2xyZWcsIGluZm8pOwoJdmlyZ2VmYl9kb19mYl9zZXRfdmFyKCZmYl9kaXNwbGF5W2Nvbl0udmFyLCAxKTsKCWluZm8tPmN1cnJjb24gPSBjb247CgkvKiBJbnN0YWxsIG5ldyBjb2xvcm1hcCAqLwoJZG9faW5zdGFsbF9jbWFwKGNvbiwgaW5mbyk7CglEUFJJTlRLKCJFWElUXG4iKTsKCXJldHVybiAwOwp9CgoKLyoKICogICAgVXBkYXRlIHRoZSBgdmFyJyBzdHJ1Y3R1cmUgKGNhbGxlZCBieSBmYmNvbi5jKQogKgogKiAgICBUaGlzIGNhbGwgbG9va3Mgb25seSBhdCB5b2Zmc2V0IGFuZCB0aGUgRkJfVk1PREVfWVdSQVAgZmxhZyBpbiBgdmFyJy4KICogICAgU2luY2UgaXQncyBjYWxsZWQgYnkgYSBrZXJuZWwgZHJpdmVyLCBubyByYW5nZSBjaGVja2luZyBpcyBkb25lLgogKi8KCnN0YXRpYyBpbnQgdmlyZ2VmYl91cGRhdGV2YXIoaW50IGNvbiwgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCURQUklOVEsoIkVOVEVSXG4iKTsKCXJldHVybiAwOwoJRFBSSU5USygiRVhJVFxuIik7Cn0KCi8qCiAqICAgIEJsYW5rIHRoZSBkaXNwbGF5LgogKi8KCnN0YXRpYyBpbnQgdmlyZ2VmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglEUFJJTlRLKCJFTlRFUlxuIik7CglmYmh3LT5ibGFuayhibGFuayk7CglEUFJJTlRLKCJFWElUXG4iKTsKCXJldHVybiAwOwp9CgoKLyoKICogICAgVGV4dCBjb25zb2xlIGFjY2VsZXJhdGlvbgogKi8KCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCOApzdGF0aWMgdm9pZCBmYmNvbl92aXJnZThfYm1vdmUoc3RydWN0IGRpc3BsYXkgKnAsIGludCBzeSwgaW50IHN4LCBpbnQgZHksCgkJCSAgICAgICBpbnQgZHgsIGludCBoZWlnaHQsIGludCB3aWR0aCkKewogICAgICAgIHN4ICo9IDg7IGR4ICo9IDg7IHdpZHRoICo9IDg7CiAgICAgICAgdmlyZ2VmYl9CaXRCTFQoKHVfc2hvcnQpc3gsICh1X3Nob3J0KShzeSpmb250aGVpZ2h0KHApKSwgKHVfc2hvcnQpZHgsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfc2hvcnQpKGR5KmZvbnRoZWlnaHQocCkpLCAodV9zaG9ydCl3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCkoaGVpZ2h0KmZvbnRoZWlnaHQocCkpLCAodV9zaG9ydClwLT5uZXh0X2xpbmUsIDgpOwp9CgpzdGF0aWMgdm9pZCBmYmNvbl92aXJnZThfY2xlYXIoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgc3ksCgkJCSAgICAgICBpbnQgc3gsIGludCBoZWlnaHQsIGludCB3aWR0aCkKewogICAgICAgIHVuc2lnbmVkIGNoYXIgYmc7CgogICAgICAgIHN4ICo9IDg7IHdpZHRoICo9IDg7CiAgICAgICAgYmcgPSBhdHRyX2JnY29sX2VjKHAsY29ucCk7CiAgICAgICAgdmlyZ2VmYl9SZWN0RmlsbCgodV9zaG9ydClzeCwgKHVfc2hvcnQpKHN5KmZvbnRoZWlnaHQocCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgKHVfc2hvcnQpd2lkdGgsICh1X3Nob3J0KShoZWlnaHQqZm9udGhlaWdodChwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCliZywgKHVfc2hvcnQpcC0+bmV4dF9saW5lLCA4KTsKfQoKc3RhdGljIHZvaWQgZmJjb25fdmlyZ2U4X3B1dGMoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgYywgaW50IHl5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHgpCnsKCWlmIChibGl0X21heWJlX2J1c3kpCgkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CglmYmNvbl9jZmI4X3B1dGMoY29ucCwgcCwgYywgeXksIHh4KTsKfQoKc3RhdGljIHZvaWQgZmJjb25fdmlyZ2U4X3B1dGNzKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpzLCBpbnQgY291bnQsIGludCB5eSwgaW50IHh4KQp7CglpZiAoYmxpdF9tYXliZV9idXN5KQoJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOwoJZmJjb25fY2ZiOF9wdXRjcyhjb25wLCBwLCBzLCBjb3VudCwgeXksIHh4KTsKfQoKc3RhdGljIHZvaWQgZmJjb25fdmlyZ2U4X3JldmMoc3RydWN0IGRpc3BsYXkgKnAsIGludCB4eCwgaW50IHl5KQp7CglpZiAoYmxpdF9tYXliZV9idXN5KQoJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOwoJZmJjb25fY2ZiOF9yZXZjKHAsIHh4LCB5eSk7Cn0KCnN0YXRpYyB2b2lkIGZiY29uX3ZpcmdlOF9jbGVhcl9tYXJnaW5zKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbV9vbmx5KQp7CglpZiAoYmxpdF9tYXliZV9idXN5KQoJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOwoJZmJjb25fY2ZiOF9jbGVhcl9tYXJnaW5zKGNvbnAsIHAsIGJvdHRvbV9vbmx5KTsKfQoKc3RhdGljIHN0cnVjdCBkaXNwbGF5X3N3aXRjaCBmYmNvbl92aXJnZTggPSB7Cgkuc2V0dXAJCT0gZmJjb25fY2ZiOF9zZXR1cCwKCS5ibW92ZQkJPSBmYmNvbl92aXJnZThfYm1vdmUsCgkuY2xlYXIJCT0gZmJjb25fdmlyZ2U4X2NsZWFyLAoJLnB1dGMJCT0gZmJjb25fdmlyZ2U4X3B1dGMsCgkucHV0Y3MJCT0gZmJjb25fdmlyZ2U4X3B1dGNzLAoJLnJldmMJCT0gZmJjb25fdmlyZ2U4X3JldmMsCgkuY2xlYXJfbWFyZ2lucwk9IGZiY29uX3ZpcmdlOF9jbGVhcl9tYXJnaW5zLAoJLmZvbnR3aWR0aG1hc2sJPSBGT05UV0lEVEgoNCl8Rk9OVFdJRFRIKDgpfEZPTlRXSURUSCgxMil8Rk9OVFdJRFRIKDE2KQp9OwojZW5kaWYKCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMTYKc3RhdGljIHZvaWQgZmJjb25fdmlyZ2UxNl9ibW92ZShzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IHN5LCBpbnQgc3gsIGludCBkeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQp7CiAgICAgICAgc3ggKj0gODsgZHggKj0gODsgd2lkdGggKj0gODsKICAgICAgICB2aXJnZWZiX0JpdEJMVCgodV9zaG9ydClzeCwgKHVfc2hvcnQpKHN5KmZvbnRoZWlnaHQocCkpLCAodV9zaG9ydClkeCwKICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCkoZHkqZm9udGhlaWdodChwKSksICh1X3Nob3J0KXdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICh1X3Nob3J0KShoZWlnaHQqZm9udGhlaWdodChwKSksICh1X3Nob3J0KXAtPm5leHRfbGluZSwgMTYpOwp9CgpzdGF0aWMgdm9pZCBmYmNvbl92aXJnZTE2X2NsZWFyKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IHN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCnsKICAgICAgICB1bnNpZ25lZCBjaGFyIGJnOwoKICAgICAgICBzeCAqPSA4OyB3aWR0aCAqPSA4OwogICAgICAgIGJnID0gYXR0cl9iZ2NvbF9lYyhwLGNvbnApOwogICAgICAgIHZpcmdlZmJfUmVjdEZpbGwoKHVfc2hvcnQpc3gsICh1X3Nob3J0KShzeSpmb250aGVpZ2h0KHApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICh1X3Nob3J0KXdpZHRoLCAodV9zaG9ydCkoaGVpZ2h0KmZvbnRoZWlnaHQocCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgKHVfc2hvcnQpYmcsICh1X3Nob3J0KXAtPm5leHRfbGluZSwgMTYpOwp9CgpzdGF0aWMgdm9pZCBmYmNvbl92aXJnZTE2X3B1dGMoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgYywgaW50IHl5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHgpCnsKCWlmIChibGl0X21heWJlX2J1c3kpCgkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CglmYmNvbl9jZmIxNl9wdXRjKGNvbnAsIHAsIGMsIHl5LCB4eCk7Cn0KCnN0YXRpYyB2b2lkIGZiY29uX3ZpcmdlMTZfcHV0Y3Moc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnMsIGludCBjb3VudCwgaW50IHl5LCBpbnQgeHgpCnsKCWlmIChibGl0X21heWJlX2J1c3kpCgkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CglmYmNvbl9jZmIxNl9wdXRjcyhjb25wLCBwLCBzLCBjb3VudCwgeXksIHh4KTsKfQoKc3RhdGljIHZvaWQgZmJjb25fdmlyZ2UxNl9yZXZjKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgeHgsIGludCB5eSkKewoJaWYgKGJsaXRfbWF5YmVfYnVzeSkKCQl2aXJnZWZiX3dhaXRfZm9yX2lkbGUoKTsKCWZiY29uX2NmYjE2X3JldmMocCwgeHgsIHl5KTsKfQoKc3RhdGljIHZvaWQgZmJjb25fdmlyZ2UxNl9jbGVhcl9tYXJnaW5zKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbV9vbmx5KQp7CglpZiAoYmxpdF9tYXliZV9idXN5KQoJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOwoJZmJjb25fY2ZiMTZfY2xlYXJfbWFyZ2lucyhjb25wLCBwLCBib3R0b21fb25seSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggZmJjb25fdmlyZ2UxNiA9IHsKCS5zZXR1cAkJPSBmYmNvbl9jZmIxNl9zZXR1cCwKCS5ibW92ZQkJPSBmYmNvbl92aXJnZTE2X2Jtb3ZlLAoJLmNsZWFyCQk9IGZiY29uX3ZpcmdlMTZfY2xlYXIsCgkucHV0YwkJPSBmYmNvbl92aXJnZTE2X3B1dGMsCgkucHV0Y3MJCT0gZmJjb25fdmlyZ2UxNl9wdXRjcywKCS5yZXZjCQk9IGZiY29uX3ZpcmdlMTZfcmV2YywKCS5jbGVhcl9tYXJnaW5zCT0gZmJjb25fdmlyZ2UxNl9jbGVhcl9tYXJnaW5zLAoJLmZvbnR3aWR0aG1hc2sJPSBGT05UV0lEVEgoNCl8Rk9OVFdJRFRIKDgpfEZPTlRXSURUSCgxMil8Rk9OVFdJRFRIKDE2KQp9OwojZW5kaWYKCiNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKc3RhdGljIHZvaWQgZmJjb25fdmlyZ2UzMl9ibW92ZShzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IHN5LCBpbnQgc3gsIGludCBkeSwKCQkJICAgICAgIGludCBkeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQp7CiAgICAgICAgc3ggKj0gMTY7IGR4ICo9IDE2OyB3aWR0aCAqPSAxNjsJLyogZG91YmxlZCB0aGVzZSB2YWx1ZXMgdG8gZG8gMzIgYml0IGJsaXQgKi8KICAgICAgICB2aXJnZWZiX0JpdEJMVCgodV9zaG9ydClzeCwgKHVfc2hvcnQpKHN5KmZvbnRoZWlnaHQocCkpLCAodV9zaG9ydClkeCwKICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCkoZHkqZm9udGhlaWdodChwKSksICh1X3Nob3J0KXdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICh1X3Nob3J0KShoZWlnaHQqZm9udGhlaWdodChwKSksICh1X3Nob3J0KXAtPm5leHRfbGluZSwgMTYpOwp9CgpzdGF0aWMgdm9pZCBmYmNvbl92aXJnZTMyX2NsZWFyKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IHN5LAoJCQkgICAgICAgaW50IHN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCnsKICAgICAgICB1bnNpZ25lZCBjaGFyIGJnOwoKICAgICAgICBzeCAqPSAxNjsgd2lkdGggKj0gMTY7CQkJLyogZG91YmxlZCB0aGVzZSB2YWx1ZXMgdG8gZG8gMzIgYml0IGJsaXQgKi8KICAgICAgICBiZyA9IGF0dHJfYmdjb2xfZWMocCxjb25wKTsKICAgICAgICB2aXJnZWZiX1JlY3RGaWxsKCh1X3Nob3J0KXN4LCAodV9zaG9ydCkoc3kqZm9udGhlaWdodChwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAodV9zaG9ydCl3aWR0aCwgKHVfc2hvcnQpKGhlaWdodCpmb250aGVpZ2h0KHApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICh1X3Nob3J0KWJnLCAodV9zaG9ydClwLT5uZXh0X2xpbmUsIDE2KTsKfQoKc3RhdGljIHZvaWQgZmJjb25fdmlyZ2UzMl9wdXRjKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IGMsIGludCB5eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHh4KQp7CglpZiAoYmxpdF9tYXliZV9idXN5KQoJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOwoJZmJjb25fY2ZiMzJfcHV0Yyhjb25wLCBwLCBjLCB5eSwgeHgpOwp9CgpzdGF0aWMgdm9pZCBmYmNvbl92aXJnZTMyX3B1dGNzKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpzLCBpbnQgY291bnQsIGludCB5eSwgaW50IHh4KQp7CglpZiAoYmxpdF9tYXliZV9idXN5KQoJCXZpcmdlZmJfd2FpdF9mb3JfaWRsZSgpOwoJZmJjb25fY2ZiMzJfcHV0Y3MoY29ucCwgcCwgcywgY291bnQsIHl5LCB4eCk7Cn0KCnN0YXRpYyB2b2lkIGZiY29uX3ZpcmdlMzJfcmV2YyhzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IHh4LCBpbnQgeXkpCnsKCWlmIChibGl0X21heWJlX2J1c3kpCgkJdmlyZ2VmYl93YWl0X2Zvcl9pZGxlKCk7CglmYmNvbl9jZmIzMl9yZXZjKHAsIHh4LCB5eSk7Cn0KCnN0YXRpYyB2b2lkIGZiY29uX3ZpcmdlMzJfY2xlYXJfbWFyZ2lucyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3R0b21fb25seSkKewoJaWYgKGJsaXRfbWF5YmVfYnVzeSkKCQl2aXJnZWZiX3dhaXRfZm9yX2lkbGUoKTsKCWZiY29uX2NmYjMyX2NsZWFyX21hcmdpbnMoY29ucCwgcCwgYm90dG9tX29ubHkpOwp9CgpzdGF0aWMgc3RydWN0IGRpc3BsYXlfc3dpdGNoIGZiY29uX3ZpcmdlMzIgPSB7Cgkuc2V0dXAJCT0gZmJjb25fY2ZiMzJfc2V0dXAsCgkuYm1vdmUJCT0gZmJjb25fdmlyZ2UzMl9ibW92ZSwKCS5jbGVhcgkJPSBmYmNvbl92aXJnZTMyX2NsZWFyLAoJLnB1dGMJCT0gZmJjb25fdmlyZ2UzMl9wdXRjLAoJLnB1dGNzCQk9IGZiY29uX3ZpcmdlMzJfcHV0Y3MsCgkucmV2YwkJPSBmYmNvbl92aXJnZTMyX3JldmMsCgkuY2xlYXJfbWFyZ2lucwk9IGZiY29uX3ZpcmdlMzJfY2xlYXJfbWFyZ2lucywKCS5mb250d2lkdGhtYXNrCT0gRk9OVFdJRFRIKDQpfEZPTlRXSURUSCg4KXxGT05UV0lEVEgoMTIpfEZPTlRXSURUSCgxNikKfTsKI2VuZGlmCgojaWZkZWYgTU9EVUxFCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCmludCBpbml0X21vZHVsZSh2b2lkKQp7CglyZXR1cm4gdmlyZ2VmYl9pbml0KCk7Cn0KI2VuZGlmIC8qIE1PRFVMRSAqLwoKc3RhdGljIGludCBjdjNkX2hhc180bWIodm9pZCkKewoJLyogY3liZXJmYiB2ZXJzaW9uIGRpZG4ndCB3b3JrLCBuZWl0aGVyIGRvZXMgdGhpcyAobm90IHJlbGlhYmx5KQoJZm9yY2VkIHRvIHJldHVybiA0TUIgKi8KI2lmIDAKCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnQwLCAqdDI7CiNlbmRpZgoJRFBSSU5USygiRU5URVJcbiIpOwojaWYgMAoJLyogd3JpdGUgcGF0dGVybnMgaW4gbWVtb3J5IGFuZCB0ZXN0IGlmIHRoZXkgY2FuIGJlIHJlYWQgKi8KCXQwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKil2X3JhbTsKCXQyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikodl9yYW0gKyAweDAwMjAwMDAwKTsKCSp0MCA9IDB4ODc2NTQzMjE7CgkqdDIgPSAweDEyMzQ1Njc4OwoKCWlmICgqdDAgIT0gMHg4NzY1NDMyMSkgewoJCS8qIHJlYWQgb2YgZmlyc3QgbG9jYXRpb24gZmFpbGVkICovCgkJRFBSSU5USygiRVhJVCAtIDBNQiAhXG4iKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoKnQyID09IDB4ODc2NTQzMjEpIHsKCQkvKiBzaG91bGQgcmVhZCAweDEyMzQ1Njc4IGlmIDRNQiAqLwoJCURQUklOVEsoIkVYSVQgLSAyTUIoYSkgXG4iKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoKnQyICE9IDB4MTIzNDU2NzgpIHsKCQkvKiB1cHBlciAyTUIgcmVhZCBiYWNrIG1hdGNoIGZhaWxlZCAqLwoJCURQUklOVEsoIkVYSVQgLSAyTUIoYilcbiIpOwoJCXJldHVybiAwOwoJfQoKCS8qIG1heSBoYXZlIDRNQiAqLwoKCSp0MiA9IDB4QUFBQUFBQUE7CgoJaWYoKnQyICE9IDB4QUFBQUFBQUEpIHsKCQkvKiB1cHBlciAyTUIgcmVhZCBiYWNrIG1hdGNoIGZhaWxlZCAqLwoJCURQUklOVEsoIkVYSVQgLSAyTUIoYylcbiIpOwoJCXJldHVybiAwOwoJfQoKCSp0MiA9IDB4NTU1NTU1NTU7CgoJaWYoKnQyICE9IDB4NTU1NTU1NTUpIHsKCQkvKiB1cHBlciAyTUIgcmVhZCBiYWNrIG1hdGNoIGZhaWxlZCAqLwoJCURQUklOVEsoIkVYSVQgLSAyTUIoZClcbiIpOwoJCXJldHVybiAwOwoJfQoKI2VuZGlmCglEUFJJTlRLKCJFWElUIC0gNE1CXG4iKTsKCXJldHVybiAxOwp9CgoKLyoKICogQ29tcHV0ZXMgTSwgTiwgYW5kIFIgcGxsIHBhcmFtcyBmb3IgZnJlcSBhcmcuCiAqIFJldHVybnMgMTYgYml0cyAtIGhpIDBNTU1NTU0gbG8gMFJSTk5OTk4KICovCgojZGVmaW5lIFJFRkNMT0NLIDE0MzE4MDAwCgpzdGF0aWMgdW5zaWduZWQgc2hvcnQgdmlyZ2VmYl9jb21wdXRlX2Nsb2NrKHVuc2lnbmVkIGxvbmcgZnJlcSkKewoKCXVuc2lnbmVkIGNoYXIgbSwgbiwgciwgcnB3cjsKCXVuc2lnbmVkIGxvbmcgZGlmZiwgZnRyeSwgc2F2ZSA9IH4wVUw7Cgl1bnNpZ25lZCBzaG9ydCBtbnI7CgoJRFBSSU5USygiRU5URVJcbiIpOwoKCWZvciAociA9IDAsIHJwd3IgPSAxIDsgciA8IDQgOyByKyssIHJwd3IgKj0gMikgewoJCWlmICgoMTM1MDAwMDAwIDw9IChycHdyICogZnJlcSkpICYmICgocnB3ciAqIGZyZXEpIDw9IDI3MDAwMDAwMCkpIHsKCQkJZm9yIChuID0gMSA7IG4gPCAzMiA7IG4rKykgewoJCQkJbSA9ICgoZnJlcSAqIChuICsgMikgKiBycHdyKS9SRUZDTE9DSykgLSAyOwoJCQkJaWYgKG0gPT0gMCB8fCBtID4xMjcpCgkJCQkJYnJlYWs7CgkJCQlmdHJ5ID0gKChSRUZDTE9DSyAvIChuICsgMikpICogKG0gKyAyKSkgLyBycHdyOwoJCQkJaWYgKGZ0cnkgPiBmcmVxKQoJCQkJCWRpZmYgPSBmdHJ5IC0gZnJlcTsKCQkJCWVsc2UKCQkJCQlkaWZmID0gZnJlcSAtIGZ0cnk7CgkJCQlpZiAoZGlmZiA8IHNhdmUpIHsKCQkJCQlzYXZlID0gZGlmZjsKCQkJCQltbnIgPSAgKG0gPDwgOCkgfCAocjw8NSkgfCAobiAmIDB4N2YpOwoJCQkJfQoJCQl9CgkJfQoJfQoJaWYgKHNhdmUgPT0gfjBVTCkKCQlwcmludGsoIkNhbid0IGNvbXB1dGUgY2xvY2sgUExMIHZhbHVlcyBmb3IgJWxkIEh6IGNsb2NrXG4iLCBmcmVxKTsKCURQUklOVEsoIkVYSVRcbiIpOwoJcmV0dXJuKG1ucik7Cn0KCnN0YXRpYyB2b2lkIHZpcmdlZmJfbG9hZF92aWRlb19tb2RlKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmlkZW9fbW9kZSkKewoJdW5zaWduZWQgY2hhciBsYWNlLCBkYmxzY2FuLCB0bXA7Cgl1bnNpZ25lZCBzaG9ydCBtbnI7Cgl1bnNpZ25lZCBzaG9ydCBIVCwgSERFLCBIQlMsIEhCVywgSFNTLCBIU1c7Cgl1bnNpZ25lZCBzaG9ydCBWVCwgVkRFLCBWQlMsIFZCVywgVlNTLCBWU1c7Cgl1bnNpZ25lZCBzaG9ydCBTQ087CglpbnQgY3IxMTsKCWludCBjcjY3OwoJaW50IGhtdWw7CglpbnQgeHJlcywgeHJlc192aXJ0dWFsLCBoZnJvbnQsIGhzeW5jLCBoYmFjazsKCWludCB5cmVzLCB2ZnJvbnQsIHZzeW5jLCB2YmFjazsKCWludCBicHA7CglpbnQgaTsKCWxvbmcgZnJlcTsKCglEUFJJTlRLKCJFTlRFUiA6ICVkeCVkLSVkXG4iLHZpZGVvX21vZGUtPnhyZXMsIHZpZGVvX21vZGUtPnlyZXMsCgkJCQl2aWRlb19tb2RlLT5iaXRzX3Blcl9waXhlbCk7CgoJYnBwID0gdmlkZW9fbW9kZS0+Yml0c19wZXJfcGl4ZWw7Cgl4cmVzID0gdmlkZW9fbW9kZS0+eHJlczsKCXhyZXNfdmlydHVhbCA9IHZpZGVvX21vZGUtPnhyZXNfdmlydHVhbDsKCWhmcm9udCA9IHZpZGVvX21vZGUtPnJpZ2h0X21hcmdpbjsKCWhzeW5jID0gdmlkZW9fbW9kZS0+aHN5bmNfbGVuOwoJaGJhY2sgPSB2aWRlb19tb2RlLT5sZWZ0X21hcmdpbjsKCglsYWNlID0gMDsKCWRibHNjYW4gPSAwOwoKCWlmICh2aWRlb19tb2RlLT52bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSkgewoJCXlyZXMgPSB2aWRlb19tb2RlLT55cmVzICogMjsKCQl2ZnJvbnQgPSB2aWRlb19tb2RlLT5sb3dlcl9tYXJnaW4gKiAyOwoJCXZzeW5jID0gdmlkZW9fbW9kZS0+dnN5bmNfbGVuICogMjsKCQl2YmFjayA9IHZpZGVvX21vZGUtPnVwcGVyX21hcmdpbiAqIDI7CgkJZGJsc2NhbiA9IDE7Cgl9IGVsc2UgaWYgKHZpZGVvX21vZGUtPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkgewoJCXlyZXMgPSAodmlkZW9fbW9kZS0+eXJlcyArIDEpIC8gMjsKCQl2ZnJvbnQgPSAodmlkZW9fbW9kZS0+bG93ZXJfbWFyZ2luICsgMSkgLyAyOwoJCXZzeW5jID0gKHZpZGVvX21vZGUtPnZzeW5jX2xlbiArIDEpIC8gMjsKCQl2YmFjayA9ICh2aWRlb19tb2RlLT51cHBlcl9tYXJnaW4gKyAxKSAvIDI7CgkJbGFjZSA9IDE7Cgl9IGVsc2UgewoJCXlyZXMgPSB2aWRlb19tb2RlLT55cmVzOwoJCXZmcm9udCA9IHZpZGVvX21vZGUtPmxvd2VyX21hcmdpbjsKCQl2c3luYyA9IHZpZGVvX21vZGUtPnZzeW5jX2xlbjsKCQl2YmFjayA9IHZpZGVvX21vZGUtPnVwcGVyX21hcmdpbjsKCX0KCglzd2l0Y2ggKGJwcCkgewoJCWNhc2UgODoKCQkJdmlkZW9fbW9kZS0+cmVkLm9mZnNldCA9IDA7CgkJCXZpZGVvX21vZGUtPmdyZWVuLm9mZnNldCA9IDA7CgkJCXZpZGVvX21vZGUtPmJsdWUub2Zmc2V0ID0gMDsKCQkJdmlkZW9fbW9kZS0+dHJhbnNwLm9mZnNldCA9IDA7CgkJCXZpZGVvX21vZGUtPnJlZC5sZW5ndGggPSA4OwoJCQl2aWRlb19tb2RlLT5ncmVlbi5sZW5ndGggPSA4OwoJCQl2aWRlb19tb2RlLT5ibHVlLmxlbmd0aCA9IDg7CgkJCXZpZGVvX21vZGUtPnRyYW5zcC5sZW5ndGggPSAwOwoJCQlobXVsID0gMTsKCQkJY3I2NyA9IDB4MDA7CgkJCVNDTyA9IHhyZXNfdmlydHVhbCAvIDg7CgkJCWJyZWFrOwoJCWNhc2UgMTY6CgkJCXZpZGVvX21vZGUtPnJlZC5vZmZzZXQgPSAxMTsKCQkJdmlkZW9fbW9kZS0+Z3JlZW4ub2Zmc2V0ID0gNTsKCQkJdmlkZW9fbW9kZS0+Ymx1ZS5vZmZzZXQgPSAwOwoJCQl2aWRlb19tb2RlLT50cmFuc3Aub2Zmc2V0ID0gMDsKCQkJdmlkZW9fbW9kZS0+cmVkLmxlbmd0aCA9IDU7CgkJCXZpZGVvX21vZGUtPmdyZWVuLmxlbmd0aCA9IDY7CgkJCXZpZGVvX21vZGUtPmJsdWUubGVuZ3RoID0gNTsKCQkJdmlkZW9fbW9kZS0+dHJhbnNwLmxlbmd0aCA9IDA7CgkJCWhtdWwgPSAyOwoJCQljcjY3ID0gMHg1MDsKCQkJU0NPID0geHJlc192aXJ0dWFsIC8gNDsKCQkJYnJlYWs7CgkJY2FzZSAzMjoKCQkJdmlkZW9fbW9kZS0+cmVkLm9mZnNldCA9IDE2OwoJCQl2aWRlb19tb2RlLT5ncmVlbi5vZmZzZXQgPSA4OwoJCQl2aWRlb19tb2RlLT5ibHVlLm9mZnNldCA9IDA7CgkJCXZpZGVvX21vZGUtPnRyYW5zcC5vZmZzZXQgPSAyNDsKCQkJdmlkZW9fbW9kZS0+cmVkLmxlbmd0aCA9IDg7CgkJCXZpZGVvX21vZGUtPmdyZWVuLmxlbmd0aCA9IDg7CgkJCXZpZGVvX21vZGUtPmJsdWUubGVuZ3RoID0gODsKCQkJdmlkZW9fbW9kZS0+dHJhbnNwLmxlbmd0aCA9IDg7CgkJCWhtdWwgPSAxOwoJCQljcjY3ID0gMHhkMDsKCQkJU0NPID0geHJlc192aXJ0dWFsIC8gMjsKCQkJYnJlYWs7Cgl9CgoJSFQgID0gKCgoeHJlcyArIGhmcm9udCArIGhzeW5jICsgaGJhY2spIC8gOCkgKiBobXVsKSAtIDU7CglIREUgPSAoKHhyZXMgLyA4KSAqIGhtdWwpIC0gMTsKCUhCUyA9ICh4cmVzIC8gOCkgKiBobXVsOwoJSFNTID0gKCh4cmVzICsgaGZyb250KSAvIDgpICogaG11bDsKCUhTVyA9IChoc3luYyAvIDgpICogaG11bDsKCUhCVyA9ICgoKGhmcm9udCArIGhzeW5jICsgaGJhY2spIC8gOCkgKiBobXVsKSAtIDI7CgoJVlQgID0geXJlcyArIHZmcm9udCArIHZzeW5jICsgdmJhY2sgLSAyOwoJVkRFID0geXJlcyAtIDE7CglWQlMgPSB5cmVzIC0gMTsKCVZTUyA9IHlyZXMgKyB2ZnJvbnQ7CglWU1cgPSB2c3luYzsKCVZCVyA9IHZmcm9udCArIHZzeW5jICsgdmJhY2sgLSAyOwoKI2lmZGVmIFZJUkdFRkJERUJVRwoJRFBSSU5USygiSERFICAgICAgIDogMHglNC40eCwgJTQuNGRcbiIsIEhERSwgSERFKTsKCURQUklOVEsoIkhCUyAgICAgICA6IDB4JTQuNHgsICU0LjRkXG4iLCBIQlMsIEhCUyk7CglEUFJJTlRLKCJIU1MgICAgICAgOiAweCU0LjR4LCAlNC40ZFxuIiwgSFNTLCBIU1MpOwoJRFBSSU5USygiSFNXICAgICAgIDogMHglNC40eCwgJTQuNGRcbiIsIEhTVywgSFNXKTsKCURQUklOVEsoIkhCVyAgICAgICA6IDB4JTQuNHgsICU0LjRkXG4iLCBIQlcsIEhCVyk7CglEUFJJTlRLKCJIU1MgKyBIU1cgOiAweCU0LjR4LCAlNC40ZFxuIiwgSFNTK0hTVywgSFNTK0hTVyk7CglEUFJJTlRLKCJIQlMgKyBIQlcgOiAweCU0LjR4LCAlNC40ZFxuIiwgSEJTK0hCVywgSEJTK0hCVyk7CglEUFJJTlRLKCJIVCAgICAgICAgOiAweCU0LjR4LCAlNC40ZFxuIiwgSFQsIEhUKTsKCURQUklOVEsoIlZERSAgICAgICA6IDB4JTQuNHgsICU0LjRkXG4iLCBWREUsIFZERSk7CglEUFJJTlRLKCJWQlMgICAgICAgOiAweCU0LjR4LCAlNC40ZFxuIiwgVkJTLCBWQlMpOwoJRFBSSU5USygiVlNTICAgICAgIDogMHglNC40eCwgJTQuNGRcbiIsIFZTUywgVlNTKTsKCURQUklOVEsoIlZTVyAgICAgICA6IDB4JTQuNHgsICU0LjRkXG4iLCBWU1csIFZTVyk7CglEUFJJTlRLKCJWQlcgICAgICAgOiAweCU0LjR4LCAlNC40ZFxuIiwgVkJXLCBWQlcpOwoJRFBSSU5USygiVlQgICAgICAgIDogMHglNC40eCwgJTQuNGRcbiIsIFZULCBWVCk7CiNlbmRpZgoKLyogdHVybiBnZnggb2ZmLCBkb24ndCBtZXNzIHVwIHRoZSBkaXNwbGF5ICovCgogCWdmeF9vbl9vZmYoMSk7CgovKiBIIGFuZCBWIHN5bmMgcG9sYXJpdHkgKi8KCgl0bXAgPSByYl9tbWlvKEdSRUdfTUlTQ19PVVRQVVRfUikgJiAweDJmOwkJLyogY29sb3VyLCByYW0gZW5hYmxlLCBjbGsgc3IxMi9zMTMgc2VsICovCglpZiAoISh2aWRlb19tb2RlLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpKQoJCXRtcCB8PSAweDQwOwkJCQkJLyogbmVnIEggc3luYyBwb2xhcml0eSAqLwoJaWYgKCEodmlkZW9fbW9kZS0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkpCgkJdG1wIHw9IDB4ODA7CQkJCQkvKiBuZWcgViBzeW5jIHBvbGFyaXR5ICovCgl0bXAgfD0gMHgwYzsJCQkJCQkvKiBjbGsgZnJvbSBzcjEyL3NyMTMgKi8KCXdiX21taW8oR1JFR19NSVNDX09VVFBVVF9XLCB0bXApOwoKLyogY2xvY2tzICovCgoJd3NlcShTRVFfSURfQlVTX1JFUV9DTlRMLCAweGMwKTsJCQkvKiAyIGNsayBtZW0gd3IgYW5kIC9SQVMxICovCgl3c2VxKFNFUV9JRF9DTEtTWU5fQ05UTF8yLCAweDgwKTsJCQkvKiBiNyBpcyAyIG1lbSBjbGsgd3IgKi8KCW1uciA9IHZpcmdlZmJfY29tcHV0ZV9jbG9jayhNRU1DTE9DSyk7CglEUFJJTlRLKCJtZW0gY2xvY2sgJWQsIG0gJWQsIG4gJWQsIHIgJWQuXG4iLCBNRU1DTE9DSywgKChtbnI+PjgpJjB4N2YpLCAobW5yJjB4MWYpLCAoKG1uciA+PiA1KSYweDAzKSk7Cgl3c2VxKFNFUV9JRF9NQ0xLX0xPLCAobW5yICYgMHg3ZikpOwoJd3NlcShTRVFfSURfTUNMS19ISSwgKChtbnIgJiAweDdmMDApID4+IDgpKTsKCWZyZXEgPSAoMTAwMDAwMDAwMCAvIHZpZGVvX21vZGUtPnBpeGNsb2NrKSAqIDEwMDA7CS8qIHBpeGNsb2NrIGlzIGluIHBzIC4uLiBjb252ZXJ0IHRvIEh6ICovCgltbnIgPSB2aXJnZWZiX2NvbXB1dGVfY2xvY2soZnJlcSk7CglEUFJJTlRLKCJkb3QgY2xvY2sgJWxkLCBtICVkLCBuICVkLCByICVkLlxuIiwgZnJlcSwgKChtbnI+PjgpJjB4N2YpLCAobW5yJjB4MWYpLCAoKG1ucj4+NSkmMHgwMykpOwoJd3NlcShTRVFfSURfRENMS19MTywgKG1uciAmIDB4N2YpKTsKCXdzZXEoU0VRX0lEX0RDTEtfSEksICgobW5yICYgMHg3ZjAwKSA+PiA4KSk7Cgl3c2VxKFNFUV9JRF9DTEtTWU5fQ05UTF8yLCAweGEwKTsKCXdzZXEoU0VRX0lEX0NMS1NZTl9DTlRMXzIsIDB4ODApOwoJdWRlbGF5KDEwMCk7CgovKiBsb2FkIGRpc3BsYXkgcGFyYW1ldGVycyBpbnRvIGJvYXJkICovCgoJLyogbm90IHN1cmUgYWJvdXQgc3luYyBhbmQgYmxhbmtpbmcgZXh0ZW5zaW9ucyBiaXRzIGluIGNyNWQgYW5kIGNyNSAqLwoKCXdjcnQoQ1JUX0lEX0VYVF9IT1JfT1ZGLAkJCS8qIDB4NWQgKi8KCQkoKEhUICYgMHgxMDApID8gICAgICAgICAweDAxIDogMHgwMCkgfAoJCSgoSERFICYgMHgxMDApID8gICAgICAgIDB4MDIgOiAweDAwKSB8CgkJKChIQlMgJiAweDEwMCkgPyAgICAgICAgMHgwNCA6IDB4MDApIHwKCS8qCSgoKEhCUyArIEhCVykgJiAweDQwKSA/IDB4MDggOiAweDAwKSB8CSovCgkJKChIU1MgJiAweDEwMCkgPyAgICAgICAgMHgxMCA6IDB4MDApIHwKCS8qCSgoKEhTUyArIEhTVykgJiAweDIwKSA/IDB4MjAgOiAweDAwKSB8CSovCgkJKChIU1cgPj0gMHgyMCkgPyAgICAgICAgMHgyMCA6IDB4MDApIHwKCQkoKChIVC01KSAmIDB4MTAwKSA/ICAgICAweDQwIDogMHgwMCkpOwoKCXdjcnQoQ1JUX0lEX0VYVF9WRVJfT1ZGLAkJCS8qIDB4NWUgKi8KCQkoKFZUICYgMHg0MDApID8gMHgwMSA6IDB4MDApIHwKCQkoKFZERSAmIDB4NDAwKSA/IDB4MDIgOiAweDAwKSB8CgkJKChWQlMgJiAweDQwMCkgPyAweDA0IDogMHgwMCkgfAoJCSgoVlNTICYgMHg0MDApID8gMHgxMCA6IDB4MDApIHwKCQkweDQwKTsJCQkJCS8qIGxpbmUgY29tcGFyZSAqLwoKCXdjcnQoQ1JUX0lEX1NUQVJUX1ZFUl9SRVRSLCBWU1MpOwoJY3IxMSA9IHJjcnQoQ1JUX0lEX0VORF9WRVJfUkVUUikgfCAweDIwOwkvKiB2ZXJ0IGludGVycnVwdCBmbGFnICovCgl3Y3J0KENSVF9JRF9FTkRfVkVSX1JFVFIsICgoY3IxMSAmIDB4MjApIHwgKChWU1MgKyBWU1cpICYgMHgwZikpKTsJLyoga2VlcHMgdmVydCBpcnEgZW5hYmxlIHN0YXRlLCBhbHNvIGhhcyB1bmxvY2sgYml0IGNyMCB0byA3ICovCgl3Y3J0KENSVF9JRF9WRVJfRElTUF9FTkFfRU5ELCBWREUpOwoJd2NydChDUlRfSURfU1RBUlRfVkVSX0JMQU5LLCBWQlMpOwoJd2NydChDUlRfSURfRU5EX1ZFUl9CTEFOSywgVkJTICsgVkJXKTsJCS8qIG1pZ2h0IGJlICsvLSAxIG91dCAqLwoJd2NydChDUlRfSURfSE9SX1RPVEFMLCBIVCk7Cgl3Y3J0KENSVF9JRF9ESVNQTEFZX0ZJRk8sIEhUIC0gNSk7Cgl3Y3J0KENSVF9JRF9CQUNLV0FEX0NPTVBfMywgMHgxMCk7CQkvKiBlbmFibGUgZGlzcGxheSBmaWZvICovCgl3Y3J0KENSVF9JRF9IT1JfRElTUF9FTkFfRU5ELCBIREUpOwoJd2NydChDUlRfSURfU1RBUlRfSE9SX0JMQU5LICwgSEJTKTsKCXdjcnQoQ1JUX0lEX0VORF9IT1JfQkxBTkssIChIQlMgKyBIQlcpICYgMHgxZik7Cgl3Y3J0KENSVF9JRF9TVEFSVF9IT1JfUkVUUiwgSFNTKTsKCXdjcnQoQ1JUX0lEX0VORF9IT1JfUkVUUiwJCQkvKiBjcjUgKi8KCQkoKEhTUyArIEhTVykgJiAweDFmKSB8CgkJKCgoSEJTICsgSEJXKSAmIDB4MjApID8gMHg4MCA6IDB4MDApKTsKCXdjcnQoQ1JUX0lEX1ZFUl9UT1RBTCwgVlQpOwoJd2NydChDUlRfSURfT1ZFUkZMT1csCgkJKChWVCAmIDB4MTAwKSA/IDB4MDEgOiAweDAwKSB8CgkJKChWREUgJiAweDEwMCkgPyAweDAyIDogMHgwMCkgfAoJCSgoVlNTICYgMHgxMDApID8gMHgwNCA6IDB4MDApIHwKCQkoKFZCUyAmIDB4MTAwKSA/IDB4MDggOiAweDAwKSB8CgkJMHgxMCB8CgkJKChWVCAmIDB4MjAwKSA/IDB4MjAgOiAweDAwKSB8CgkJKChWREUgJiAweDIwMCkgPyAweDQwIDogMHgwMCkgfAoJCSgoVlNTICYgMHgyMDApID8gMHg4MCA6IDB4MDApKTsKCXdjcnQoQ1JUX0lEX01BWF9TQ0FOX0xJTkUsCgkJKGRibHNjYW4gPyAweDgwIDogMHgwMCkgfAoJCTB4NDAgfAoJCSgoVkJTICYgMHgyMDApID8gMHgyMCA6IDB4MDApKTsKCXdjcnQoQ1JUX0lEX0xJTkVfQ09NUEFSRSwgMHhmZik7Cgl3Y3J0KENSVF9JRF9MQUNFX1JFVFJfU1RBUlQsIEhUIC8gMik7CQkvKiAoSFQtNSkvMiA/ICovCgl3Y3J0KENSVF9JRF9MQUNFX0NPTlRST0wsIChsYWNlID8gMHgyMCA6IDB4MDApKTsKCgl3Y3J0KENSVF9JRF9TQ1JFRU5fT0ZGU0VULCBTQ08pOwoJd2NydChDUlRfSURfRVhUX1NZU19DTlRMXzIsIChTQ08gPj4gNCkgJiAweDMwICk7CgoJLyogd2FpdCBmb3IgdmVydCBzeW5jIGJlZm9yZSBjcjY3IHVwZGF0ZSAqLwoKCWZvciAoaT0wOyBpIDwgMTAwMDA7IGkrKykgewoJCXVkZWxheSgxMCk7CgkJbWIoKTsKCQlpZiAocmJfbW1pbyhHUkVHX0lOUFVUX1NUQVRVUzFfUikgJiAweDA4KQoJCQlicmVhazsKCX0KCgl3bF9tbWlvKDB4ODIwMCwgMHgwMDAwYzAwMCk7CS8qIGZpZm8gY29udHJvbCAgKDB4MDAxMTA0MDAgPykgKi8KCXdjcnQoQ1JUX0lEX0VYVF9NSVNDX0NOVExfMiwgY3I2Nyk7CgovKiBlbmFibGUgdmlkZW8gKi8KCgl0bXAgPSByYl9tbWlvKEFDVF9BRERSRVNTX1JFU0VUKTsKCXdiX21taW8oQUNUX0FERFJFU1NfVywgKChicHAgPT0gOCkgPyAweDIwIDogMHgwMCkpOwkvKiBzZXQgYjUsIEVOQiBQTFQgaW4gYXR0ciBpZHggcmVnKSAqLwoJdG1wID0gcmJfbW1pbyhBQ1RfQUREUkVTU19SRVNFVCk7CgovKiB0dXJuIGdmeCBvbiBhZ2FpbiAqLwoKCWdmeF9vbl9vZmYoMCk7CgovKiBwYXNzLXRocm91Z2ggKi8KCglTZXRWU3dpdGNoKDEpOwkJLyogY3YzZCAqLwoKCURVTVA7CglEUFJJTlRLKCJFWElUXG4iKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGdmeF9vbl9vZmYoaW50IHRvZ2dsZSkKewoJdW5zaWduZWQgY2hhciB0bXA7CgoJRFBSSU5USygiRU5URVIgZ2Z4ICVzXG4iLCAodG9nZ2xlID8gIm9mZiIgOiAib24iKSk7CgoJdG9nZ2xlID0gKHRvZ2dsZSAmIDB4MDEpIDw8IDU7Cgl0bXAgPSByc2VxKFNFUV9JRF9DTE9DS0lOR19NT0RFKSAmICh+KDB4MDEgPDwgNSkpOwoJd3NlcShTRVFfSURfQ0xPQ0tJTkdfTU9ERSwgdG1wIHwgdG9nZ2xlKTsKCglEUFJJTlRLKCJFWElUXG4iKTsKfQoKI2lmIGRlZmluZWQgKFZJUkdFRkJEVU1QKQoKLyoKICogRHVtcCBib2FyZCByZWdpc3RlcnMKICovCgpzdGF0aWMgdm9pZCBjdjY0X2R1bXAodm9pZCkKewoJaW50IGk7Cgl1OCBjLCBiOwogICAgICAgIHUxNiB3OwoJdTMyIGw7CgoJLyogY3J0LCBzZXEsIGdmeCBhbmQgYXRyIHJlZ3MgKi8KCglTZWxlY3RNTUlPOwoKCXByaW50aygiXG4iKTsKCWZvciAoaSA9IDA7IGkgPD0gMHg2ZjsgaSsrKSB7CgkJd2JfbW1pbyhDUlRfQUREUkVTUywgaSk7CgkJcHJpbnRrKCJjcnQgaWR4IDogMHglMi4yeCA6IDB4JTIuMnhcbiIsIGksIHJiX21taW8oQ1JUX0FERFJFU1NfUikpOwoJfQoJZm9yIChpID0gMDsgaSA8PSAweDFjOyBpKyspIHsKCQl3Yl9tbWlvKFNFUV9BRERSRVNTLCBpKTsKCQlwcmludGsoInNlcSBpZHggOiAweCUyLjJ4IDogMHglMi4yeFxuIiwgaSwgcmJfbW1pbyhTRVFfQUREUkVTU19SKSk7Cgl9Cglmb3IgKGkgPSAwOyBpIDw9IDg7IGkrKykgewoJCXdiX21taW8oR0NUX0FERFJFU1MsIGkpOwoJCXByaW50aygiZ2Z4IGlkeCA6IDB4JTIuMnggOiAweCUyLjJ4XG4iLCBpLCByYl9tbWlvKEdDVF9BRERSRVNTX1IpKTsKCX0KCWZvciAoaSA9IDA7IGkgPD0gMHgxNDsgaSsrKSB7CgkJYyA9IHJiX21taW8oQUNUX0FERFJFU1NfUkVTRVQpOwoJCXdiX21taW8oQUNUX0FERFJFU1NfVywgaSk7CgkJcHJpbnRrKCJhdHIgaWR4IDogMHglMi4yeCA6IDB4JTIuMnhcbiIsIGksIHJiX21taW8oQUNUX0FERFJFU1NfUikpOwoJfQoKCS8qIHJlLWVuYWJsZSB2aWRlbyBhY2Nlc3MgdG8gcGFsZXR0ZSAqLwoKCWMgPSByYl9tbWlvKEFDVF9BRERSRVNTX1JFU0VUKTsKCXVkZWxheSgxMCk7Cgl3Yl9tbWlvKEFDVF9BRERSRVNTX1csIDB4MjApOwoJYyA9IHJiX21taW8oQUNUX0FERFJFU1NfUkVTRVQpOwoJdWRlbGF5KDEwKTsKCgkvKiBnZW5lcmFsIHJlZ3MgKi8KCglwcmludGsoIjB4M2NjKHcgMHgzYzIpIDogMHglMi4yeFxuIiwgcmJfbW1pbygweDNjYykpOwkvKiBHUkVHX01JU0NfT1VUUFVUIFJFQUQgKi8KCXByaW50aygiMHgzYzIoLS0tLS0tLSkgOiAweCUyLjJ4XG4iLCByYl9tbWlvKDB4M2MyKSk7CS8qIEdSRUdfSU5QVVRfU1RBVFVTIDAgUkVBRCAqLwoJcHJpbnRrKCIweDNjMyh3IDB4M2MzKSA6IDB4JTIuMnhcbiIsIHJiX3ZnYWlvKDB4M2MzKSk7CS8qIEdSRUdfVklERU9fU1VCU19FTkFCTEUgKi8KCXByaW50aygiMHgzY2EodyAweDNkYSkgOiAweCUyLjJ4XG4iLCByYl92Z2FpbygweDNjYSkpOwkvKiBHUkVHX0ZFQVRVUkVfQ09OVFJPTCByZWFkICovCglwcmludGsoIjB4M2RhKC0tLS0tLS0pIDogMHglMi4yeFxuIiwgcmJfbW1pbygweDNkYSkpOwkvKiBHUkVHX0lOUFVUX1NUQVRVUyAxIFJFQUQgKi8KCgkvKiBlbmdpbmUgcmVncyAqLwoKCWZvciAoaSA9IDB4ODE4MDsgaSA8PSAweDgyMDA7IGkgPSBpICsgNCkKCQlwcmludGsoIjB4JTguOHggOiAweCU4Ljh4XG4iLCBpLCBybF9tbWlvKGkpKTsKCglpID0gMHg4NTA0OwoJcHJpbnRrKCIweCU4Ljh4IDogMHglOC44eFxuIiwgaSwgcmxfbW1pbyhpKSk7CglpID0gMHg4NTBjOwoJcHJpbnRrKCIweCU4Ljh4IDogMHglOC44eFxuIiwgaSwgcmxfbW1pbyhpKSk7Cglmb3IgKGkgPSAweGE0ZDQ7IGkgPD0gMHhhNTBjOyBpID0gaSArIDQpCgkJcHJpbnRrKCIweCU4Ljh4IDogMHglOC44eFxuIiwgaSwgcmxfbW1pbyhpKSk7CgoJLyogUENJIHJlZ3MgKi8KCglTZWxlY3RDRkc7CgoJZm9yIChjID0gMDsgYyA8IDB4MDg7IGMgPSBjICsgMikgewoJCXcgPSAoKigodTE2ICopKCh1MzIpKHZnYWlvX3JlZ3MgKyBjICsgKG9uX3pvcnJvMiA/IDAgOiAweDAwMGUwMDAwKSkgXiAyKSkpOwoJCXByaW50aygicGNpIDB4JTIuMnggOiAweCU0LjR4XG4iLCBjLCB3KTsKCX0KCWMgPSA4OwoJbCA9ICgqKCh1MzIgKikoKHUzMikodmdhaW9fcmVncyArIGMgKyAob25fem9ycm8yID8gMCA6IDB4MDAwZTAwMDApKSkpKTsKCXByaW50aygicGNpIDB4JTIuMnggOiAweCU4Ljh4XG4iLCBjLCBsKTsKCWMgPSAweDBkOwoJYiA9ICgqKCh1OCAqKSgodTMyKSh2Z2Fpb19yZWdzICsgYyArIChvbl96b3JybzIgPyAwIDogMHgwMDBlMDAwMCkpIF4gMykpKTsKCXByaW50aygicGNpIDB4JTIuMnggOiAweCUyLjJ4XG4iLCBjLCBiKTsKCWMgPSAweDEwOwoJbCA9ICgqKCh1MzIgKikoKHUzMikodmdhaW9fcmVncyArIGMgKyAob25fem9ycm8yID8gMCA6IDB4MDAwZTAwMDApKSkpKTsKCXByaW50aygicGNpIDB4JTIuMnggOiAweCU4Ljh4XG4iLCBjLCBsKTsKCWMgPSAweDMwOwoJbCA9ICgqKCh1MzIgKikoKHUzMikodmdhaW9fcmVncyArIGMgKyAob25fem9ycm8yID8gMCA6IDB4MDAwZTAwMDApKSkpKTsKCXByaW50aygicGNpIDB4JTIuMnggOiAweCU4Ljh4XG4iLCBjLCBsKTsKCWMgPSAweDNjOwoJYiA9ICgqKCh1OCAqKSgodTMyKSh2Z2Fpb19yZWdzICsgYyArIChvbl96b3JybzIgPyAwIDogMHgwMDBlMDAwMCkpIF4gMykpKTsKCXByaW50aygicGNpIDB4JTIuMnggOiAweCUyLjJ4XG4iLCBjLCBiKTsKCWMgPSAweDNkOwoJYiA9ICgqKCh1OCAqKSgodTMyKSh2Z2Fpb19yZWdzICsgYyArIChvbl96b3JybzIgPyAwIDogMHgwMDBlMDAwMCkpIF4gMykpKTsKCXByaW50aygicGNpIDB4JTIuMnggOiAweCUyLjJ4XG4iLCBjLCBiKTsKCWMgPSAweDNlOwoJdyA9ICgqKCh1MTYgKikoKHUzMikodmdhaW9fcmVncyArIGMgKyAob25fem9ycm8yID8gMCA6IDB4MDAwZTAwMDApKSBeIDIpKSk7CglwcmludGsoInBjaSAweCUyLjJ4IDogMHglNC40eFxuIiwgYywgdyk7CglTZWxlY3RNTUlPOwp9CiNlbmRpZgo=