LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY3N0ci5jLHYgMS43IDIwMDIvMDcvMTMgMDU6NDM6MjUga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgImZjaW50LmgiCgpGY0NoYXI4ICoKRmNTdHJDb3B5IChjb25zdCBGY0NoYXI4ICpzKQp7CiAgICBGY0NoYXI4CSpyOwoKICAgIGlmICghcykKCXJldHVybiAwOwogICAgciA9IChGY0NoYXI4ICopIG1hbGxvYyAoc3RybGVuICgoY2hhciAqKSBzKSArIDEpOwogICAgaWYgKCFyKQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fU1RSSU5HLCBzdHJsZW4gKChjaGFyICopIHMpICsgMSk7CiAgICBzdHJjcHkgKChjaGFyICopIHIsIChjaGFyICopIHMpOwogICAgcmV0dXJuIHI7Cn0KCkZjQ2hhcjggKgpGY1N0clBsdXMgKGNvbnN0IEZjQ2hhcjggKnMxLCBjb25zdCBGY0NoYXI4ICpzMikKewogICAgaW50CSAgICBsID0gc3RybGVuICgoY2hhciAqKXMxKSArIHN0cmxlbiAoKGNoYXIgKikgczIpICsgMTsKICAgIEZjQ2hhcjggKnMgPSBtYWxsb2MgKGwpOwoKICAgIGlmICghcykKCXJldHVybiAwOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX1NUUklORywgbCk7CiAgICBzdHJjcHkgKChjaGFyICopIHMsIChjaGFyICopIHMxKTsKICAgIHN0cmNhdCAoKGNoYXIgKikgcywgKGNoYXIgKikgczIpOwogICAgcmV0dXJuIHM7Cn0KCnZvaWQKRmNTdHJGcmVlIChGY0NoYXI4ICpzKQp7CiAgICBGY01lbUZyZWUgKEZDX01FTV9TVFJJTkcsIHN0cmxlbiAoKGNoYXIgKikgcykgKyAxKTsKICAgIGZyZWUgKHMpOwp9CgppbnQKRmNTdHJDbXBJZ25vcmVDYXNlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpCnsKICAgIEZjQ2hhcjggYzEsIGMyOwogICAgCiAgICBmb3IgKDs7KSAKICAgIHsKCWMxID0gKnMxKys7CgljMiA9ICpzMisrOwoJaWYgKCFjMSB8fCAhYzIpCgkgICAgYnJlYWs7CgljMSA9IEZjVG9Mb3dlciAoYzEpOwoJYzIgPSBGY1RvTG93ZXIgKGMyKTsKCWlmIChjMSAhPSBjMikKCSAgICBicmVhazsKICAgIH0KICAgIHJldHVybiAoaW50KSBjMSAtIChpbnQpIGMyOwp9CgppbnQKRmNTdHJDbXBJZ25vcmVCbGFua3NBbmRDYXNlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpCnsKICAgIEZjQ2hhcjggYzEsIGMyOwogICAgCiAgICBmb3IgKDs7KSAKICAgIHsKCWRvCgkgICAgYzEgPSAqczErKzsKCXdoaWxlIChjMSA9PSAnICcpOwoJZG8KCSAgICBjMiA9ICpzMisrOwoJd2hpbGUgKGMyID09ICcgJyk7CglpZiAoIWMxIHx8ICFjMikKCSAgICBicmVhazsKCWMxID0gRmNUb0xvd2VyIChjMSk7CgljMiA9IEZjVG9Mb3dlciAoYzIpOwoJaWYgKGMxICE9IGMyKQoJICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIChpbnQpIGMxIC0gKGludCkgYzI7Cn0KCmludApGY1N0ckNtcCAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKQp7CiAgICBGY0NoYXI4IGMxLCBjMjsKICAgIAogICAgaWYgKHMxID09IHMyKQoJcmV0dXJuIDA7CiAgICBmb3IgKDs7KSAKICAgIHsKCWMxID0gKnMxKys7CgljMiA9ICpzMisrOwoJaWYgKCFjMSB8fCAhYzIpCgkgICAgYnJlYWs7CglpZiAoYzEgIT0gYzIpCgkgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gKGludCkgYzEgLSAoaW50KSBjMjsKfQoKaW50CkZjVXRmOFRvVWNzNCAoY29uc3QgRmNDaGFyOCAqc3JjX29yaWcsCgkgICAgICBGY0NoYXIzMgkgICAgKmRzdCwKCSAgICAgIGludAkgICAgbGVuKQp7CiAgICBjb25zdCBGY0NoYXI4ICAgKnNyYyA9IHNyY19vcmlnOwogICAgRmNDaGFyOAkgICAgczsKICAgIGludAkJICAgIGV4dHJhOwogICAgRmNDaGFyMzIJICAgIHJlc3VsdDsKCiAgICBpZiAobGVuID09IDApCglyZXR1cm4gMDsKICAgIAogICAgcyA9ICpzcmMrKzsKICAgIGxlbi0tOwogICAgCiAgICBpZiAoIShzICYgMHg4MCkpCiAgICB7CglyZXN1bHQgPSBzOwoJZXh0cmEgPSAwOwogICAgfSAKICAgIGVsc2UgaWYgKCEocyAmIDB4NDApKQogICAgewoJcmV0dXJuIC0xOwogICAgfQogICAgZWxzZSBpZiAoIShzICYgMHgyMCkpCiAgICB7CglyZXN1bHQgPSBzICYgMHgxZjsKCWV4dHJhID0gMTsKICAgIH0KICAgIGVsc2UgaWYgKCEocyAmIDB4MTApKQogICAgewoJcmVzdWx0ID0gcyAmIDB4ZjsKCWV4dHJhID0gMjsKICAgIH0KICAgIGVsc2UgaWYgKCEocyAmIDB4MDgpKQogICAgewoJcmVzdWx0ID0gcyAmIDB4MDc7CglleHRyYSA9IDM7CiAgICB9CiAgICBlbHNlIGlmICghKHMgJiAweDA0KSkKICAgIHsKCXJlc3VsdCA9IHMgJiAweDAzOwoJZXh0cmEgPSA0OwogICAgfQogICAgZWxzZSBpZiAoICEgKHMgJiAweDAyKSkKICAgIHsKCXJlc3VsdCA9IHMgJiAweDAxOwoJZXh0cmEgPSA1OwogICAgfQogICAgZWxzZQogICAgewoJcmV0dXJuIC0xOwogICAgfQogICAgaWYgKGV4dHJhID4gbGVuKQoJcmV0dXJuIC0xOwogICAgCiAgICB3aGlsZSAoZXh0cmEtLSkKICAgIHsKCXJlc3VsdCA8PD0gNjsKCXMgPSAqc3JjKys7CgkKCWlmICgocyAmIDB4YzApICE9IDB4ODApCgkgICAgcmV0dXJuIC0xOwoJCglyZXN1bHQgfD0gcyAmIDB4M2Y7CiAgICB9CiAgICAqZHN0ID0gcmVzdWx0OwogICAgcmV0dXJuIHNyYyAtIHNyY19vcmlnOwp9CgpGY0Jvb2wKRmNVdGY4TGVuIChjb25zdCBGY0NoYXI4ICAgICpzdHJpbmcsCgkgICBpbnQJCSAgICBsZW4sCgkgICBpbnQJCSAgICAqbmNoYXIsCgkgICBpbnQJCSAgICAqd2NoYXIpCnsKICAgIGludAkJbjsKICAgIGludAkJY2xlbjsKICAgIEZjQ2hhcjMyCWM7CiAgICBGY0NoYXIzMgltYXg7CiAgICAKICAgIG4gPSAwOwogICAgbWF4ID0gMDsKICAgIHdoaWxlIChsZW4pCiAgICB7CgljbGVuID0gRmNVdGY4VG9VY3M0IChzdHJpbmcsICZjLCBsZW4pOwoJaWYgKGNsZW4gPD0gMCkJLyogbWFsZm9ybWVkIFVURjggc3RyaW5nICovCgkgICAgcmV0dXJuIEZjRmFsc2U7CglpZiAoYyA+IG1heCkKCSAgICBtYXggPSBjOwoJc3RyaW5nICs9IGNsZW47CglsZW4gLT0gY2xlbjsKCW4rKzsKICAgIH0KICAgICpuY2hhciA9IG47CiAgICBpZiAobWF4ID49IDB4MTAwMDApCgkqd2NoYXIgPSA0OwogICAgZWxzZSBpZiAobWF4ID4gMHgxMDApCgkqd2NoYXIgPSAyOwogICAgZWxzZQoJKndjaGFyID0gMTsKICAgIHJldHVybiBGY1RydWU7Cn0KCmludApGY1VjczRUb1V0ZjggKEZjQ2hhcjMyCXVjczQsCgkgICAgICBGY0NoYXI4CWRlc3RbRkNfVVRGOF9NQVhfTEVOXSkKewogICAgaW50CWJpdHM7CiAgICBGY0NoYXI4ICpkID0gZGVzdDsKICAgIAogICAgaWYgICAgICAodWNzNCA8ICAgICAgIDB4ODApIHsgICpkKys9ICB1Y3M0OyAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzPSAtNjsgfQogICAgZWxzZSBpZiAodWNzNCA8ICAgICAgMHg4MDApIHsgICpkKys9ICgodWNzNCA+PiAgNikgJiAweDFGKSB8IDB4QzA7ICBiaXRzPSAgMDsgfQogICAgZWxzZSBpZiAodWNzNCA8ICAgIDB4MTAwMDApIHsgICpkKys9ICgodWNzNCA+PiAxMikgJiAweDBGKSB8IDB4RTA7ICBiaXRzPSAgNjsgfQogICAgZWxzZSBpZiAodWNzNCA8ICAgMHgyMDAwMDApIHsgICpkKys9ICgodWNzNCA+PiAxOCkgJiAweDA3KSB8IDB4RjA7ICBiaXRzPSAxMjsgfQogICAgZWxzZSBpZiAodWNzNCA8ICAweDQwMDAwMDApIHsgICpkKys9ICgodWNzNCA+PiAyNCkgJiAweDAzKSB8IDB4Rjg7ICBiaXRzPSAxODsgfQogICAgZWxzZSBpZiAodWNzNCA8IDB4ODAwMDAwMDApIHsgICpkKys9ICgodWNzNCA+PiAzMCkgJiAweDAxKSB8IDB4RkM7ICBiaXRzPSAyNDsgfQogICAgZWxzZSByZXR1cm4gMDsKCiAgICBmb3IgKCA7IGJpdHMgPj0gMDsgYml0cy09IDYpIHsKCSpkKys9ICgodWNzNCA+PiBiaXRzKSAmIDB4M0YpIHwgMHg4MDsKICAgIH0KICAgIHJldHVybiBkIC0gZGVzdDsKfQoKI2RlZmluZSBHZXRVdGYxNihzcmMsZW5kaWFuKSBcCiAgICAoKEZjQ2hhcjE2KSAoKHNyYylbZW5kaWFuID09IEZjRW5kaWFuQmlnID8gMCA6IDFdIDw8IDgpIHwgXAogICAgIChGY0NoYXIxNikgKChzcmMpW2VuZGlhbiA9PSBGY0VuZGlhbkJpZyA/IDEgOiAwXSkpCgppbnQKRmNVdGYxNlRvVWNzNCAoY29uc3QgRmNDaGFyOAkqc3JjX29yaWcsCgkgICAgICAgRmNFbmRpYW4JCWVuZGlhbiwKCSAgICAgICBGY0NoYXIzMgkJKmRzdCwKCSAgICAgICBpbnQJCWxlbikJLyogaW4gYnl0ZXMgKi8KewogICAgY29uc3QgRmNDaGFyOCAgICpzcmMgPSBzcmNfb3JpZzsKICAgIEZjQ2hhcjE2CSAgICBhLCBiOwogICAgRmNDaGFyMzIJICAgIHJlc3VsdDsKCiAgICBpZiAobGVuIDwgMikKCXJldHVybiAwOwogICAgCiAgICBhID0gR2V0VXRmMTYgKHNyYywgZW5kaWFuKTsgc3JjICs9IDI7IGxlbiAtPSAyOwogICAgCiAgICAvKiAKICAgICAqIENoZWNrIGZvciBzdXJyb2dhdGUgCiAgICAgKi8KICAgIGlmICgoYSAmIDB4ZmMwMCkgPT0gMHhkODAwKQogICAgewoJaWYgKGxlbiA8IDIpCgkgICAgcmV0dXJuIDA7CgliID0gR2V0VXRmMTYgKHNyYywgZW5kaWFuKTsgc3JjICs9IDI7IGxlbiAtPSAyOwoJLyoKCSAqIENoZWNrIGZvciBpbnZhbGlkIHN1cnJvZ2F0ZSBzZXF1ZW5jZQoJICovCglpZiAoKGIgJiAweGZjMDApICE9IDB4ZGMwMCkKCSAgICByZXR1cm4gMDsKCXJlc3VsdCA9ICgoKChGY0NoYXIzMikgYSAmIDB4M2ZmKSA8PCAxMCkgfAoJCSAgKChGY0NoYXIzMikgYiAmIDB4M2ZmKSkgfCAweDEwMDAwOwogICAgfQogICAgZWxzZQoJcmVzdWx0ID0gYTsKICAgICpkc3QgPSByZXN1bHQ7CiAgICByZXR1cm4gc3JjIC0gc3JjX29yaWc7Cn0KCkZjQm9vbApGY1V0ZjE2TGVuIChjb25zdCBGY0NoYXI4ICAgKnN0cmluZywKCSAgICBGY0VuZGlhbgkgICAgZW5kaWFuLAoJICAgIGludAkJICAgIGxlbiwJLyogaW4gYnl0ZXMgKi8KCSAgICBpbnQJCSAgICAqbmNoYXIsCgkgICAgaW50CQkgICAgKndjaGFyKQp7CiAgICBpbnQJCW47CiAgICBpbnQJCWNsZW47CiAgICBGY0NoYXIzMgljOwogICAgRmNDaGFyMzIJbWF4OwogICAgCiAgICBuID0gMDsKICAgIG1heCA9IDA7CiAgICB3aGlsZSAobGVuKQogICAgewoJY2xlbiA9IEZjVXRmMTZUb1VjczQgKHN0cmluZywgZW5kaWFuLCAmYywgbGVuKTsKCWlmIChjbGVuIDw9IDApCS8qIG1hbGZvcm1lZCBVVEY4IHN0cmluZyAqLwoJICAgIHJldHVybiBGY0ZhbHNlOwoJaWYgKGMgPiBtYXgpCgkgICAgbWF4ID0gYzsKCXN0cmluZyArPSBjbGVuOwoJbGVuIC09IGNsZW47CgluKys7CiAgICB9CiAgICAqbmNoYXIgPSBuOwogICAgaWYgKG1heCA+PSAweDEwMDAwKQoJKndjaGFyID0gNDsKICAgIGVsc2UgaWYgKG1heCA+IDB4MTAwKQoJKndjaGFyID0gMjsKICAgIGVsc2UKCSp3Y2hhciA9IDE7CiAgICByZXR1cm4gRmNUcnVlOwp9Cgp2b2lkCkZjU3RyQnVmSW5pdCAoRmNTdHJCdWYgKmJ1ZiwgRmNDaGFyOCAqaW5pdCwgaW50IHNpemUpCnsKICAgIGJ1Zi0+YnVmID0gaW5pdDsKICAgIGJ1Zi0+YWxsb2NhdGVkID0gRmNGYWxzZTsKICAgIGJ1Zi0+ZmFpbGVkID0gRmNGYWxzZTsKICAgIGJ1Zi0+bGVuID0gMDsKICAgIGJ1Zi0+c2l6ZSA9IHNpemU7Cn0KCnZvaWQKRmNTdHJCdWZEZXN0cm95IChGY1N0ckJ1ZiAqYnVmKQp7CiAgICBpZiAoYnVmLT5hbGxvY2F0ZWQpCiAgICB7CglmcmVlIChidWYtPmJ1Zik7CglGY1N0ckJ1ZkluaXQgKGJ1ZiwgMCwgMCk7CiAgICB9Cn0KCkZjQ2hhcjggKgpGY1N0ckJ1ZkRvbmUgKEZjU3RyQnVmICpidWYpCnsKICAgIEZjQ2hhcjggKnJldDsKCiAgICByZXQgPSBtYWxsb2MgKGJ1Zi0+bGVuICsgMSk7CiAgICBpZiAocmV0KQogICAgewoJbWVtY3B5IChyZXQsIGJ1Zi0+YnVmLCBidWYtPmxlbik7CglyZXRbYnVmLT5sZW5dID0gJ1wwJzsKICAgIH0KICAgIEZjU3RyQnVmRGVzdHJveSAoYnVmKTsKICAgIHJldHVybiByZXQ7Cn0KCkZjQm9vbApGY1N0ckJ1ZkNoYXIgKEZjU3RyQnVmICpidWYsIEZjQ2hhcjggYykKewogICAgaWYgKGJ1Zi0+bGVuID09IGJ1Zi0+c2l6ZSkKICAgIHsKCUZjQ2hhcjgJICAgICpuZXc7CglpbnQJICAgIHNpemU7CgoJaWYgKGJ1Zi0+YWxsb2NhdGVkKQoJewoJICAgIHNpemUgPSBidWYtPnNpemUgKiAyOwoJICAgIG5ldyA9IHJlYWxsb2MgKGJ1Zi0+YnVmLCBzaXplKTsKCX0KCWVsc2UKCXsKCSAgICBzaXplID0gYnVmLT5zaXplICsgMTAyNDsKCSAgICBuZXcgPSBtYWxsb2MgKHNpemUpOwoJICAgIGlmIChuZXcpCgkgICAgewoJCWJ1Zi0+YWxsb2NhdGVkID0gRmNUcnVlOwoJCW1lbWNweSAobmV3LCBidWYtPmJ1ZiwgYnVmLT5sZW4pOwoJICAgIH0KCX0KCWlmICghbmV3KQoJewoJICAgIGJ1Zi0+ZmFpbGVkID0gRmNUcnVlOwoJICAgIHJldHVybiBGY0ZhbHNlOwoJfQoJYnVmLT5zaXplID0gc2l6ZTsKCWJ1Zi0+YnVmID0gbmV3OwogICAgfQogICAgYnVmLT5idWZbYnVmLT5sZW4rK10gPSBjOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNCb29sCkZjU3RyQnVmU3RyaW5nIChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0NoYXI4ICpzKQp7CiAgICBGY0NoYXI4IGM7CiAgICB3aGlsZSAoKGMgPSAqcysrKSkKCWlmICghRmNTdHJCdWZDaGFyIChidWYsIGMpKQoJICAgIHJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNCb29sCkZjU3RyQnVmRGF0YSAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyOCAqcywgaW50IGxlbikKewogICAgd2hpbGUgKGxlbi0tID4gMCkKCWlmICghRmNTdHJCdWZDaGFyIChidWYsICpzKyspKQoJICAgIHJldHVybiBGY0ZhbHNlOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNDaGFyOCAqCkZjU3RyQ29weUZpbGVuYW1lIChjb25zdCBGY0NoYXI4ICpzKQp7CiAgICBGY0NoYXI4ICpuZXc7CiAgICAKICAgIGlmICgqcyA9PSAnficpCiAgICB7CglGY0NoYXI4CSpob21lID0gKEZjQ2hhcjggKikgZ2V0ZW52ICgiSE9NRSIpOwoJaW50CXNpemUgPSBzdHJsZW4gKChjaGFyICopIGhvbWUpICsgc3RybGVuICgoY2hhciAqKSBzKTsKCWlmICghaG9tZSkKCSAgICByZXR1cm4gMDsKCW5ldyA9IChGY0NoYXI4ICopIG1hbGxvYyAoc2l6ZSk7CglpZiAoIW5ldykKCSAgICByZXR1cm4gMDsKCUZjTWVtQWxsb2MgKEZDX01FTV9TVFJJTkcsIHNpemUpOwoJc3RyY3B5ICgoY2hhciAqKSBuZXcsIChjaGFyICopIGhvbWUpOwoJc3RyY2F0ICgoY2hhciAqKSBuZXcsIChjaGFyICopIHMgKyAxKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWludAlzaXplID0gc3RybGVuICgoY2hhciAqKSBzKSArIDE7CgluZXcgPSAoRmNDaGFyOCAqKSBtYWxsb2MgKHNpemUpOwoJaWYgKCFuZXcpCgkgICAgcmV0dXJuIDA7CglGY01lbUFsbG9jIChGQ19NRU1fU1RSSU5HLCBzaXplKTsKCXN0cmNweSAoKGNoYXIgKikgbmV3LCAoY29uc3QgY2hhciAqKSBzKTsKICAgIH0KICAgIHJldHVybiBuZXc7Cn0KCkZjQ2hhcjggKgpGY1N0ckRpcm5hbWUgKGNvbnN0IEZjQ2hhcjggKmZpbGUpCnsKICAgIEZjQ2hhcjggKnNsYXNoOwogICAgRmNDaGFyOCAqZGlyOwoKICAgIHNsYXNoID0gKEZjQ2hhcjggKikgc3RycmNociAoKGNoYXIgKikgZmlsZSwgJy8nKTsKICAgIGlmICghc2xhc2gpCglyZXR1cm4gRmNTdHJDb3B5ICgoRmNDaGFyOCAqKSAiLiIpOwogICAgZGlyID0gbWFsbG9jICgoc2xhc2ggLSBmaWxlKSArIDEpOwogICAgaWYgKCFkaXIpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9TVFJJTkcsIChzbGFzaCAtIGZpbGUpICsgMSk7CiAgICBzdHJuY3B5ICgoY2hhciAqKSBkaXIsIChjb25zdCBjaGFyICopIGZpbGUsIHNsYXNoIC0gZmlsZSk7CiAgICBkaXJbc2xhc2ggLSBmaWxlXSA9ICdcMCc7CiAgICByZXR1cm4gZGlyOwp9CgpGY0NoYXI4ICoKRmNTdHJCYXNlbmFtZSAoY29uc3QgRmNDaGFyOCAqZmlsZSkKewogICAgRmNDaGFyOCAqc2xhc2g7CgogICAgc2xhc2ggPSAoRmNDaGFyOCAqKSBzdHJyY2hyICgoY2hhciAqKSBmaWxlLCAnLycpOwogICAgaWYgKCFzbGFzaCkKCXJldHVybiBGY1N0ckNvcHkgKGZpbGUpOwogICAgcmV0dXJuIEZjU3RyQ29weSAoc2xhc2ggKyAxKTsKfQoKRmNTdHJTZXQgKgpGY1N0clNldENyZWF0ZSAodm9pZCkKewogICAgRmNTdHJTZXQJKnNldCA9IG1hbGxvYyAoc2l6ZW9mIChGY1N0clNldCkpOwogICAgaWYgKCFzZXQpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9TVFJTRVQsIHNpemVvZiAoRmNTdHJTZXQpKTsKICAgIHNldC0+cmVmID0gMTsKICAgIHNldC0+bnVtID0gMDsKICAgIHNldC0+c2l6ZSA9IDA7CiAgICBzZXQtPnN0cnMgPSAwOwogICAgcmV0dXJuIHNldDsKfQoKc3RhdGljIEZjQm9vbApfRmNTdHJTZXRBcHBlbmQgKEZjU3RyU2V0ICpzZXQsIEZjQ2hhcjggKnMpCnsKICAgIGlmIChGY1N0clNldE1lbWJlciAoc2V0LCBzKSkKICAgIHsKCUZjU3RyRnJlZSAocyk7CglyZXR1cm4gRmNUcnVlOwogICAgfQogICAgaWYgKHNldC0+bnVtID09IHNldC0+c2l6ZSkKICAgIHsKCUZjQ2hhcjgJKipzdHJzID0gbWFsbG9jICgoc2V0LT5zaXplICsgMikgKiBzaXplb2YgKEZjQ2hhcjggKikpOwoKCWlmICghc3RycykKCSAgICByZXR1cm4gRmNGYWxzZTsKCUZjTWVtQWxsb2MgKEZDX01FTV9TVFJTRVQsIChzZXQtPnNpemUgKyAyKSAqIHNpemVvZiAoRmNDaGFyOCAqKSk7CglzZXQtPnNpemUgPSBzZXQtPnNpemUgKyAxOwoJaWYgKHNldC0+bnVtKQoJICAgIG1lbWNweSAoc3Rycywgc2V0LT5zdHJzLCBzZXQtPm51bSAqIHNpemVvZiAoRmNDaGFyOCAqKSk7CglpZiAoc2V0LT5zdHJzKQoJICAgIGZyZWUgKHNldC0+c3Rycyk7CglzZXQtPnN0cnMgPSBzdHJzOwogICAgfQogICAgc2V0LT5zdHJzW3NldC0+bnVtKytdID0gczsKICAgIHNldC0+c3Ryc1tzZXQtPm51bV0gPSAwOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNCb29sCkZjU3RyU2V0TWVtYmVyIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc2V0LT5udW07IGkrKykKCWlmICghRmNTdHJDbXAgKHNldC0+c3Ryc1tpXSwgcykpCgkgICAgcmV0dXJuIEZjVHJ1ZTsKICAgIHJldHVybiBGY0ZhbHNlOwp9CgpGY0Jvb2wKRmNTdHJTZXRFcXVhbCAoRmNTdHJTZXQgKnNhLCBGY1N0clNldCAqc2IpCnsKICAgIGludAlpOwogICAgaWYgKHNhLT5udW0gIT0gc2ItPm51bSkKCXJldHVybiBGY0ZhbHNlOwogICAgZm9yIChpID0gMDsgaSA8IHNhLT5udW07IGkrKykKCWlmICghRmNTdHJTZXRNZW1iZXIgKHNiLCBzYS0+c3Ryc1tpXSkpCgkgICAgcmV0dXJuIEZjRmFsc2U7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0Jvb2wKRmNTdHJTZXRBZGQgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpCnsKICAgIEZjQ2hhcjggKm5ldyA9IEZjU3RyQ29weSAocyk7CiAgICBpZiAoIW5ldykKCXJldHVybiBGY0ZhbHNlOwogICAgaWYgKCFfRmNTdHJTZXRBcHBlbmQgKHNldCwgbmV3KSkKICAgIHsKCUZjU3RyRnJlZSAobmV3KTsKCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNCb29sCkZjU3RyU2V0QWRkRmlsZW5hbWUgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpCnsKICAgIEZjQ2hhcjggKm5ldyA9IEZjU3RyQ29weUZpbGVuYW1lIChzKTsKICAgIGlmICghbmV3KQoJcmV0dXJuIEZjRmFsc2U7CiAgICBpZiAoIV9GY1N0clNldEFwcGVuZCAoc2V0LCBuZXcpKQogICAgewoJRmNTdHJGcmVlIChuZXcpOwoJcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0Jvb2wKRmNTdHJTZXREZWwgKEZjU3RyU2V0ICpzZXQsIGNvbnN0IEZjQ2hhcjggKnMpCnsKICAgIGludAlpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzZXQtPm51bTsgaSsrKQoJaWYgKCFGY1N0ckNtcCAoc2V0LT5zdHJzW2ldLCBzKSkKCXsKCSAgICBGY1N0ckZyZWUgKHNldC0+c3Ryc1tpXSk7CgkgICAgLyoKCSAgICAgKiBjb3B5IHJlbWFpbmluZyBzdHJpbmcgcG9pbnRlcnMgYW5kIHRyYWlsaW5nCgkgICAgICogTlVMTAoJICAgICAqLwoJICAgIG1lbW1vdmUgKCZzZXQtPnN0cnNbaV0sICZzZXQtPnN0cnNbaSsxXSwgCgkJICAgICAoc2V0LT5udW0gLSBpKSAqIHNpemVvZiAoRmNDaGFyOCAqKSk7CgkgICAgc2V0LT5udW0tLTsKCSAgICByZXR1cm4gRmNUcnVlOwoJfQogICAgcmV0dXJuIEZjRmFsc2U7Cn0KCnZvaWQKRmNTdHJTZXREZXN0cm95IChGY1N0clNldCAqc2V0KQp7CiAgICBpZiAoLS1zZXQtPnJlZiA9PSAwKQogICAgewoJaW50CWk7CiAgICAKCWZvciAoaSA9IDA7IGkgPCBzZXQtPm51bTsgaSsrKQoJICAgIEZjU3RyRnJlZSAoc2V0LT5zdHJzW2ldKTsKCUZjTWVtRnJlZSAoRkNfTUVNX1NUUlNFVCwgKHNldC0+c2l6ZSkgKiBzaXplb2YgKEZjQ2hhcjggKikpOwoJaWYgKHNldC0+c3RycykKCSAgICBmcmVlIChzZXQtPnN0cnMpOwoJRmNNZW1GcmVlIChGQ19NRU1fU1RSU0VULCBzaXplb2YgKEZjU3RyU2V0KSk7CglmcmVlIChzZXQpOwogICAgfQp9CgpGY1N0ckxpc3QgKgpGY1N0ckxpc3RDcmVhdGUgKEZjU3RyU2V0ICpzZXQpCnsKICAgIEZjU3RyTGlzdAkqbGlzdDsKCiAgICBsaXN0ID0gbWFsbG9jIChzaXplb2YgKEZjU3RyTGlzdCkpOwogICAgaWYgKCFsaXN0KQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fU1RSTElTVCwgc2l6ZW9mIChGY1N0ckxpc3QpKTsKICAgIGxpc3QtPnNldCA9IHNldDsKICAgIHNldC0+cmVmKys7CiAgICBsaXN0LT5uID0gMDsKICAgIHJldHVybiBsaXN0Owp9CgpGY0NoYXI4ICoKRmNTdHJMaXN0TmV4dCAoRmNTdHJMaXN0ICpsaXN0KQp7CiAgICBpZiAobGlzdC0+biA+PSBsaXN0LT5zZXQtPm51bSkKCXJldHVybiAwOwogICAgcmV0dXJuIGxpc3QtPnNldC0+c3Ryc1tsaXN0LT5uKytdOwp9Cgp2b2lkCkZjU3RyTGlzdERvbmUgKEZjU3RyTGlzdCAqbGlzdCkKewogICAgRmNTdHJTZXREZXN0cm95IChsaXN0LT5zZXQpOwogICAgRmNNZW1GcmVlIChGQ19NRU1fU1RSTElTVCwgc2l6ZW9mIChGY1N0ckxpc3QpKTsKICAgIGZyZWUgKGxpc3QpOwp9Cg==