LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY3N0ci5jLHYgMS42IDIwMDIvMDcvMDYgMjM6NDc6NDQga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgImZjaW50LmgiCgpGY0NoYXI4ICoKRmNTdHJDb3B5IChjb25zdCBGY0NoYXI4ICpzKQp7CiAgICBGY0NoYXI4CSpyOwoKICAgIGlmICghcykKCXJldHVybiAwOwogICAgciA9IChGY0NoYXI4ICopIG1hbGxvYyAoc3RybGVuICgoY2hhciAqKSBzKSArIDEpOwogICAgaWYgKCFyKQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fU1RSSU5HLCBzdHJsZW4gKChjaGFyICopIHMpICsgMSk7CiAgICBzdHJjcHkgKChjaGFyICopIHIsIChjaGFyICopIHMpOwogICAgcmV0dXJuIHI7Cn0KCkZjQ2hhcjggKgpGY1N0clBsdXMgKGNvbnN0IEZjQ2hhcjggKnMxLCBjb25zdCBGY0NoYXI4ICpzMikKewogICAgaW50CSAgICBsID0gc3RybGVuICgoY2hhciAqKXMxKSArIHN0cmxlbiAoKGNoYXIgKikgczIpICsgMTsKICAgIEZjQ2hhcjggKnMgPSBtYWxsb2MgKGwpOwoKICAgIGlmICghcykKCXJldHVybiAwOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX1NUUklORywgbCk7CiAgICBzdHJjcHkgKChjaGFyICopIHMsIChjaGFyICopIHMxKTsKICAgIHN0cmNhdCAoKGNoYXIgKikgcywgKGNoYXIgKikgczIpOwogICAgcmV0dXJuIHM7Cn0KCnZvaWQKRmNTdHJGcmVlIChGY0NoYXI4ICpzKQp7CiAgICBGY01lbUZyZWUgKEZDX01FTV9TVFJJTkcsIHN0cmxlbiAoKGNoYXIgKikgcykgKyAxKTsKICAgIGZyZWUgKHMpOwp9CgppbnQKRmNTdHJDbXBJZ25vcmVDYXNlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpCnsKICAgIEZjQ2hhcjggYzEsIGMyOwogICAgCiAgICBmb3IgKDs7KSAKICAgIHsKCWMxID0gKnMxKys7CgljMiA9ICpzMisrOwoJaWYgKCFjMSB8fCAhYzIpCgkgICAgYnJlYWs7CgljMSA9IEZjVG9Mb3dlciAoYzEpOwoJYzIgPSBGY1RvTG93ZXIgKGMyKTsKCWlmIChjMSAhPSBjMikKCSAgICBicmVhazsKICAgIH0KICAgIHJldHVybiAoaW50KSBjMSAtIChpbnQpIGMyOwp9CgppbnQKRmNTdHJDbXBJZ25vcmVCbGFua3NBbmRDYXNlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpCnsKICAgIEZjQ2hhcjggYzEsIGMyOwogICAgCiAgICBmb3IgKDs7KSAKICAgIHsKCWRvCgkgICAgYzEgPSAqczErKzsKCXdoaWxlIChjMSA9PSAnICcpOwoJZG8KCSAgICBjMiA9ICpzMisrOwoJd2hpbGUgKGMyID09ICcgJyk7CglpZiAoIWMxIHx8ICFjMikKCSAgICBicmVhazsKCWMxID0gRmNUb0xvd2VyIChjMSk7CgljMiA9IEZjVG9Mb3dlciAoYzIpOwoJaWYgKGMxICE9IGMyKQoJICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIChpbnQpIGMxIC0gKGludCkgYzI7Cn0KCmludApGY1N0ckNtcCAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKQp7CiAgICBGY0NoYXI4IGMxLCBjMjsKICAgIAogICAgaWYgKHMxID09IHMyKQoJcmV0dXJuIDA7CiAgICBmb3IgKDs7KSAKICAgIHsKCWMxID0gKnMxKys7CgljMiA9ICpzMisrOwoJaWYgKCFjMSB8fCAhYzIpCgkgICAgYnJlYWs7CglpZiAoYzEgIT0gYzIpCgkgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gKGludCkgYzEgLSAoaW50KSBjMjsKfQoKaW50CkZjVXRmOFRvVWNzNCAoRmNDaGFyOCAgICpzcmNfb3JpZywKCSAgICAgIEZjQ2hhcjMyICAqZHN0LAoJICAgICAgaW50CWxlbikKewogICAgRmNDaGFyOAkqc3JjID0gc3JjX29yaWc7CiAgICBGY0NoYXI4CXM7CiAgICBpbnQJCWV4dHJhOwogICAgRmNDaGFyMzIJcmVzdWx0OwoKICAgIGlmIChsZW4gPT0gMCkKCXJldHVybiAwOwogICAgCiAgICBzID0gKnNyYysrOwogICAgbGVuLS07CiAgICAKICAgIGlmICghKHMgJiAweDgwKSkKICAgIHsKCXJlc3VsdCA9IHM7CglleHRyYSA9IDA7CiAgICB9IAogICAgZWxzZSBpZiAoIShzICYgMHg0MCkpCiAgICB7CglyZXR1cm4gLTE7CiAgICB9CiAgICBlbHNlIGlmICghKHMgJiAweDIwKSkKICAgIHsKCXJlc3VsdCA9IHMgJiAweDFmOwoJZXh0cmEgPSAxOwogICAgfQogICAgZWxzZSBpZiAoIShzICYgMHgxMCkpCiAgICB7CglyZXN1bHQgPSBzICYgMHhmOwoJZXh0cmEgPSAyOwogICAgfQogICAgZWxzZSBpZiAoIShzICYgMHgwOCkpCiAgICB7CglyZXN1bHQgPSBzICYgMHgwNzsKCWV4dHJhID0gMzsKICAgIH0KICAgIGVsc2UgaWYgKCEocyAmIDB4MDQpKQogICAgewoJcmVzdWx0ID0gcyAmIDB4MDM7CglleHRyYSA9IDQ7CiAgICB9CiAgICBlbHNlIGlmICggISAocyAmIDB4MDIpKQogICAgewoJcmVzdWx0ID0gcyAmIDB4MDE7CglleHRyYSA9IDU7CiAgICB9CiAgICBlbHNlCiAgICB7CglyZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoZXh0cmEgPiBsZW4pCglyZXR1cm4gLTE7CiAgICAKICAgIHdoaWxlIChleHRyYS0tKQogICAgewoJcmVzdWx0IDw8PSA2OwoJcyA9ICpzcmMrKzsKCQoJaWYgKChzICYgMHhjMCkgIT0gMHg4MCkKCSAgICByZXR1cm4gLTE7CgkKCXJlc3VsdCB8PSBzICYgMHgzZjsKICAgIH0KICAgICpkc3QgPSByZXN1bHQ7CiAgICByZXR1cm4gc3JjIC0gc3JjX29yaWc7Cn0KCkZjQm9vbApGY1V0ZjhMZW4gKEZjQ2hhcjgJKnN0cmluZywKCSAgICBpbnQJCWxlbiwKCSAgICBpbnQJCSpuY2hhciwKCSAgICBpbnQJCSp3Y2hhcikKewogICAgaW50CQluOwogICAgaW50CQljbGVuOwogICAgRmNDaGFyMzIJYzsKICAgIEZjQ2hhcjMyCW1heDsKICAgIAogICAgbiA9IDA7CiAgICBtYXggPSAwOwogICAgd2hpbGUgKGxlbikKICAgIHsKCWNsZW4gPSBGY1V0ZjhUb1VjczQgKHN0cmluZywgJmMsIGxlbik7CglpZiAoY2xlbiA8PSAwKQkvKiBtYWxmb3JtZWQgVVRGOCBzdHJpbmcgKi8KCSAgICByZXR1cm4gRmNGYWxzZTsKCWlmIChjID4gbWF4KQoJICAgIG1heCA9IGM7CglzdHJpbmcgKz0gY2xlbjsKCWxlbiAtPSBjbGVuOwoJbisrOwogICAgfQogICAgKm5jaGFyID0gbjsKICAgIGlmIChtYXggPj0gMHgxMDAwMCkKCSp3Y2hhciA9IDQ7CiAgICBlbHNlIGlmIChtYXggPiAweDEwMCkKCSp3Y2hhciA9IDI7CiAgICBlbHNlCgkqd2NoYXIgPSAxOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKaW50CkZjVWNzNFRvVXRmOCAoRmNDaGFyMzIJdWNzNCwKCSAgICAgIEZjQ2hhcjgJZGVzdFtGQ19VVEY4X01BWF9MRU5dKQp7CiAgICBpbnQJYml0czsKICAgIEZjQ2hhcjggKmQgPSBkZXN0OwogICAgCiAgICBpZiAgICAgICh1Y3M0IDwgICAgICAgMHg4MCkgeyAgKmQrKz0gIHVjczQ7ICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHM9IC02OyB9CiAgICBlbHNlIGlmICh1Y3M0IDwgICAgICAweDgwMCkgeyAgKmQrKz0gKCh1Y3M0ID4+ICA2KSAmIDB4MUYpIHwgMHhDMDsgIGJpdHM9ICAwOyB9CiAgICBlbHNlIGlmICh1Y3M0IDwgICAgMHgxMDAwMCkgeyAgKmQrKz0gKCh1Y3M0ID4+IDEyKSAmIDB4MEYpIHwgMHhFMDsgIGJpdHM9ICA2OyB9CiAgICBlbHNlIGlmICh1Y3M0IDwgICAweDIwMDAwMCkgeyAgKmQrKz0gKCh1Y3M0ID4+IDE4KSAmIDB4MDcpIHwgMHhGMDsgIGJpdHM9IDEyOyB9CiAgICBlbHNlIGlmICh1Y3M0IDwgIDB4NDAwMDAwMCkgeyAgKmQrKz0gKCh1Y3M0ID4+IDI0KSAmIDB4MDMpIHwgMHhGODsgIGJpdHM9IDE4OyB9CiAgICBlbHNlIGlmICh1Y3M0IDwgMHg4MDAwMDAwMCkgeyAgKmQrKz0gKCh1Y3M0ID4+IDMwKSAmIDB4MDEpIHwgMHhGQzsgIGJpdHM9IDI0OyB9CiAgICBlbHNlIHJldHVybiAwOwoKICAgIGZvciAoIDsgYml0cyA+PSAwOyBiaXRzLT0gNikgewoJKmQrKz0gKCh1Y3M0ID4+IGJpdHMpICYgMHgzRikgfCAweDgwOwogICAgfQogICAgcmV0dXJuIGQgLSBkZXN0Owp9CgojZGVmaW5lIEdldFV0ZjE2KHNyYyxlbmRpYW4pIFwKICAgICgoRmNDaGFyMTYpICgoc3JjKVtlbmRpYW4gPT0gRmNFbmRpYW5CaWcgPyAwIDogMV0gPDwgOCkgfCBcCiAgICAgKEZjQ2hhcjE2KSAoKHNyYylbZW5kaWFuID09IEZjRW5kaWFuQmlnID8gMSA6IDBdKSkKCmludApGY1V0ZjE2VG9VY3M0IChGY0NoYXI4CSpzcmNfb3JpZywKCSAgICAgICBGY0VuZGlhbgllbmRpYW4sCgkgICAgICAgRmNDaGFyMzIJKmRzdCwKCSAgICAgICBpbnQJbGVuKQkvKiBpbiBieXRlcyAqLwp7CiAgICBGY0NoYXI4CSpzcmMgPSBzcmNfb3JpZzsKICAgIEZjQ2hhcjE2CWEsIGI7CiAgICBGY0NoYXIzMglyZXN1bHQ7CgogICAgaWYgKGxlbiA8IDIpCglyZXR1cm4gMDsKICAgIAogICAgYSA9IEdldFV0ZjE2IChzcmMsIGVuZGlhbik7IHNyYyArPSAyOyBsZW4gLT0gMjsKICAgIAogICAgLyogCiAgICAgKiBDaGVjayBmb3Igc3Vycm9nYXRlIAogICAgICovCiAgICBpZiAoKGEgJiAweGZjMDApID09IDB4ZDgwMCkKICAgIHsKCWlmIChsZW4gPCAyKQoJICAgIHJldHVybiAwOwoJYiA9IEdldFV0ZjE2IChzcmMsIGVuZGlhbik7IHNyYyArPSAyOyBsZW4gLT0gMjsKCS8qCgkgKiBDaGVjayBmb3IgaW52YWxpZCBzdXJyb2dhdGUgc2VxdWVuY2UKCSAqLwoJaWYgKChiICYgMHhmYzAwKSAhPSAweGRjMDApCgkgICAgcmV0dXJuIDA7CglyZXN1bHQgPSAoKCgoRmNDaGFyMzIpIGEgJiAweDNmZikgPDwgMTApIHwKCQkgICgoRmNDaGFyMzIpIGIgJiAweDNmZikpIHwgMHgxMDAwMDsKICAgIH0KICAgIGVsc2UKCXJlc3VsdCA9IGE7CiAgICAqZHN0ID0gcmVzdWx0OwogICAgcmV0dXJuIHNyYyAtIHNyY19vcmlnOwp9CgpGY0Jvb2wKRmNVdGYxNkxlbiAoRmNDaGFyOAkqc3RyaW5nLAoJICAgIEZjRW5kaWFuCWVuZGlhbiwKCSAgICBpbnQJCWxlbiwJLyogaW4gYnl0ZXMgKi8KCSAgICBpbnQJCSpuY2hhciwKCSAgICBpbnQJCSp3Y2hhcikKewogICAgaW50CQluOwogICAgaW50CQljbGVuOwogICAgRmNDaGFyMzIJYzsKICAgIEZjQ2hhcjMyCW1heDsKICAgIAogICAgbiA9IDA7CiAgICBtYXggPSAwOwogICAgd2hpbGUgKGxlbikKICAgIHsKCWNsZW4gPSBGY1V0ZjE2VG9VY3M0IChzdHJpbmcsIGVuZGlhbiwgJmMsIGxlbik7CglpZiAoY2xlbiA8PSAwKQkvKiBtYWxmb3JtZWQgVVRGOCBzdHJpbmcgKi8KCSAgICByZXR1cm4gRmNGYWxzZTsKCWlmIChjID4gbWF4KQoJICAgIG1heCA9IGM7CglzdHJpbmcgKz0gY2xlbjsKCWxlbiAtPSBjbGVuOwoJbisrOwogICAgfQogICAgKm5jaGFyID0gbjsKICAgIGlmIChtYXggPj0gMHgxMDAwMCkKCSp3Y2hhciA9IDQ7CiAgICBlbHNlIGlmIChtYXggPiAweDEwMCkKCSp3Y2hhciA9IDI7CiAgICBlbHNlCgkqd2NoYXIgPSAxOwogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKdm9pZApGY1N0ckJ1ZkluaXQgKEZjU3RyQnVmICpidWYsIEZjQ2hhcjggKmluaXQsIGludCBzaXplKQp7CiAgICBidWYtPmJ1ZiA9IGluaXQ7CiAgICBidWYtPmFsbG9jYXRlZCA9IEZjRmFsc2U7CiAgICBidWYtPmZhaWxlZCA9IEZjRmFsc2U7CiAgICBidWYtPmxlbiA9IDA7CiAgICBidWYtPnNpemUgPSBzaXplOwp9Cgp2b2lkCkZjU3RyQnVmRGVzdHJveSAoRmNTdHJCdWYgKmJ1ZikKewogICAgaWYgKGJ1Zi0+YWxsb2NhdGVkKQogICAgewoJZnJlZSAoYnVmLT5idWYpOwoJRmNTdHJCdWZJbml0IChidWYsIDAsIDApOwogICAgfQp9CgpGY0NoYXI4ICoKRmNTdHJCdWZEb25lIChGY1N0ckJ1ZiAqYnVmKQp7CiAgICBGY0NoYXI4ICpyZXQ7CgogICAgcmV0ID0gbWFsbG9jIChidWYtPmxlbiArIDEpOwogICAgaWYgKHJldCkKICAgIHsKCW1lbWNweSAocmV0LCBidWYtPmJ1ZiwgYnVmLT5sZW4pOwoJcmV0W2J1Zi0+bGVuXSA9ICdcMCc7CiAgICB9CiAgICBGY1N0ckJ1ZkRlc3Ryb3kgKGJ1Zik7CiAgICByZXR1cm4gcmV0Owp9CgpGY0Jvb2wKRmNTdHJCdWZDaGFyIChGY1N0ckJ1ZiAqYnVmLCBGY0NoYXI4IGMpCnsKICAgIGlmIChidWYtPmxlbiA9PSBidWYtPnNpemUpCiAgICB7CglGY0NoYXI4CSAgICAqbmV3OwoJaW50CSAgICBzaXplOwoKCWlmIChidWYtPmFsbG9jYXRlZCkKCXsKCSAgICBzaXplID0gYnVmLT5zaXplICogMjsKCSAgICBuZXcgPSByZWFsbG9jIChidWYtPmJ1Ziwgc2l6ZSk7Cgl9CgllbHNlCgl7CgkgICAgc2l6ZSA9IGJ1Zi0+c2l6ZSArIDEwMjQ7CgkgICAgbmV3ID0gbWFsbG9jIChzaXplKTsKCSAgICBpZiAobmV3KQoJICAgIHsKCQlidWYtPmFsbG9jYXRlZCA9IEZjVHJ1ZTsKCQltZW1jcHkgKG5ldywgYnVmLT5idWYsIGJ1Zi0+bGVuKTsKCSAgICB9Cgl9CglpZiAoIW5ldykKCXsKCSAgICBidWYtPmZhaWxlZCA9IEZjVHJ1ZTsKCSAgICByZXR1cm4gRmNGYWxzZTsKCX0KCWJ1Zi0+c2l6ZSA9IHNpemU7CglidWYtPmJ1ZiA9IG5ldzsKICAgIH0KICAgIGJ1Zi0+YnVmW2J1Zi0+bGVuKytdID0gYzsKICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQm9vbApGY1N0ckJ1ZlN0cmluZyAoRmNTdHJCdWYgKmJ1ZiwgY29uc3QgRmNDaGFyOCAqcykKewogICAgRmNDaGFyOCBjOwogICAgd2hpbGUgKChjID0gKnMrKykpCglpZiAoIUZjU3RyQnVmQ2hhciAoYnVmLCBjKSkKCSAgICByZXR1cm4gRmNGYWxzZTsKICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQm9vbApGY1N0ckJ1ZkRhdGEgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhcjggKnMsIGludCBsZW4pCnsKICAgIHdoaWxlIChsZW4tLSA+IDApCglpZiAoIUZjU3RyQnVmQ2hhciAoYnVmLCAqcysrKSkKCSAgICByZXR1cm4gRmNGYWxzZTsKICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQ2hhcjggKgpGY1N0ckNvcHlGaWxlbmFtZSAoY29uc3QgRmNDaGFyOCAqcykKewogICAgRmNDaGFyOCAqbmV3OwogICAgCiAgICBpZiAoKnMgPT0gJ34nKQogICAgewoJRmNDaGFyOAkqaG9tZSA9IChGY0NoYXI4ICopIGdldGVudiAoIkhPTUUiKTsKCWludAlzaXplID0gc3RybGVuICgoY2hhciAqKSBob21lKSArIHN0cmxlbiAoKGNoYXIgKikgcyk7CglpZiAoIWhvbWUpCgkgICAgcmV0dXJuIDA7CgluZXcgPSAoRmNDaGFyOCAqKSBtYWxsb2MgKHNpemUpOwoJaWYgKCFuZXcpCgkgICAgcmV0dXJuIDA7CglGY01lbUFsbG9jIChGQ19NRU1fU1RSSU5HLCBzaXplKTsKCXN0cmNweSAoKGNoYXIgKikgbmV3LCAoY2hhciAqKSBob21lKTsKCXN0cmNhdCAoKGNoYXIgKikgbmV3LCAoY2hhciAqKSBzICsgMSk7CiAgICB9CiAgICBlbHNlCiAgICB7CglpbnQJc2l6ZSA9IHN0cmxlbiAoKGNoYXIgKikgcykgKyAxOwoJbmV3ID0gKEZjQ2hhcjggKikgbWFsbG9jIChzaXplKTsKCWlmICghbmV3KQoJICAgIHJldHVybiAwOwoJRmNNZW1BbGxvYyAoRkNfTUVNX1NUUklORywgc2l6ZSk7CglzdHJjcHkgKChjaGFyICopIG5ldywgKGNvbnN0IGNoYXIgKikgcyk7CiAgICB9CiAgICByZXR1cm4gbmV3Owp9CgpGY0NoYXI4ICoKRmNTdHJEaXJuYW1lIChjb25zdCBGY0NoYXI4ICpmaWxlKQp7CiAgICBGY0NoYXI4ICpzbGFzaDsKICAgIEZjQ2hhcjggKmRpcjsKCiAgICBzbGFzaCA9IChGY0NoYXI4ICopIHN0cnJjaHIgKChjaGFyICopIGZpbGUsICcvJyk7CiAgICBpZiAoIXNsYXNoKQoJcmV0dXJuIEZjU3RyQ29weSAoKEZjQ2hhcjggKikgIi4iKTsKICAgIGRpciA9IG1hbGxvYyAoKHNsYXNoIC0gZmlsZSkgKyAxKTsKICAgIGlmICghZGlyKQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fU1RSSU5HLCAoc2xhc2ggLSBmaWxlKSArIDEpOwogICAgc3RybmNweSAoKGNoYXIgKikgZGlyLCAoY29uc3QgY2hhciAqKSBmaWxlLCBzbGFzaCAtIGZpbGUpOwogICAgZGlyW3NsYXNoIC0gZmlsZV0gPSAnXDAnOwogICAgcmV0dXJuIGRpcjsKfQoKRmNDaGFyOCAqCkZjU3RyQmFzZW5hbWUgKGNvbnN0IEZjQ2hhcjggKmZpbGUpCnsKICAgIEZjQ2hhcjggKnNsYXNoOwoKICAgIHNsYXNoID0gKEZjQ2hhcjggKikgc3RycmNociAoKGNoYXIgKikgZmlsZSwgJy8nKTsKICAgIGlmICghc2xhc2gpCglyZXR1cm4gRmNTdHJDb3B5IChmaWxlKTsKICAgIHJldHVybiBGY1N0ckNvcHkgKHNsYXNoICsgMSk7Cn0KCkZjU3RyU2V0ICoKRmNTdHJTZXRDcmVhdGUgKHZvaWQpCnsKICAgIEZjU3RyU2V0CSpzZXQgPSBtYWxsb2MgKHNpemVvZiAoRmNTdHJTZXQpKTsKICAgIGlmICghc2V0KQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fU1RSU0VULCBzaXplb2YgKEZjU3RyU2V0KSk7CiAgICBzZXQtPnJlZiA9IDE7CiAgICBzZXQtPm51bSA9IDA7CiAgICBzZXQtPnNpemUgPSAwOwogICAgc2V0LT5zdHJzID0gMDsKICAgIHJldHVybiBzZXQ7Cn0KCnN0YXRpYyBGY0Jvb2wKX0ZjU3RyU2V0QXBwZW5kIChGY1N0clNldCAqc2V0LCBGY0NoYXI4ICpzKQp7CiAgICBpZiAoRmNTdHJTZXRNZW1iZXIgKHNldCwgcykpCiAgICB7CglGY1N0ckZyZWUgKHMpOwoJcmV0dXJuIEZjVHJ1ZTsKICAgIH0KICAgIGlmIChzZXQtPm51bSA9PSBzZXQtPnNpemUpCiAgICB7CglGY0NoYXI4CSoqc3RycyA9IG1hbGxvYyAoKHNldC0+c2l6ZSArIDIpICogc2l6ZW9mIChGY0NoYXI4ICopKTsKCglpZiAoIXN0cnMpCgkgICAgcmV0dXJuIEZjRmFsc2U7CglGY01lbUFsbG9jIChGQ19NRU1fU1RSU0VULCAoc2V0LT5zaXplICsgMikgKiBzaXplb2YgKEZjQ2hhcjggKikpOwoJc2V0LT5zaXplID0gc2V0LT5zaXplICsgMTsKCWlmIChzZXQtPm51bSkKCSAgICBtZW1jcHkgKHN0cnMsIHNldC0+c3Rycywgc2V0LT5udW0gKiBzaXplb2YgKEZjQ2hhcjggKikpOwoJaWYgKHNldC0+c3RycykKCSAgICBmcmVlIChzZXQtPnN0cnMpOwoJc2V0LT5zdHJzID0gc3RyczsKICAgIH0KICAgIHNldC0+c3Ryc1tzZXQtPm51bSsrXSA9IHM7CiAgICBzZXQtPnN0cnNbc2V0LT5udW1dID0gMDsKICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQm9vbApGY1N0clNldE1lbWJlciAoRmNTdHJTZXQgKnNldCwgY29uc3QgRmNDaGFyOCAqcykKewogICAgaW50CWk7CgogICAgZm9yIChpID0gMDsgaSA8IHNldC0+bnVtOyBpKyspCglpZiAoIUZjU3RyQ21wIChzZXQtPnN0cnNbaV0sIHMpKQoJICAgIHJldHVybiBGY1RydWU7CiAgICByZXR1cm4gRmNGYWxzZTsKfQoKRmNCb29sCkZjU3RyU2V0QWRkIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKQp7CiAgICBGY0NoYXI4ICpuZXcgPSBGY1N0ckNvcHkgKHMpOwogICAgaWYgKCFuZXcpCglyZXR1cm4gRmNGYWxzZTsKICAgIGlmICghX0ZjU3RyU2V0QXBwZW5kIChzZXQsIG5ldykpCiAgICB7CglGY1N0ckZyZWUgKG5ldyk7CglyZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIHJldHVybiBGY1RydWU7Cn0KCkZjQm9vbApGY1N0clNldEFkZEZpbGVuYW1lIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKQp7CiAgICBGY0NoYXI4ICpuZXcgPSBGY1N0ckNvcHlGaWxlbmFtZSAocyk7CiAgICBpZiAoIW5ldykKCXJldHVybiBGY0ZhbHNlOwogICAgaWYgKCFfRmNTdHJTZXRBcHBlbmQgKHNldCwgbmV3KSkKICAgIHsKCUZjU3RyRnJlZSAobmV3KTsKCXJldHVybiBGY0ZhbHNlOwogICAgfQogICAgcmV0dXJuIEZjVHJ1ZTsKfQoKRmNCb29sCkZjU3RyU2V0RGVsIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKQp7CiAgICBpbnQJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc2V0LT5udW07IGkrKykKCWlmICghRmNTdHJDbXAgKHNldC0+c3Ryc1tpXSwgcykpCgl7CgkgICAgRmNTdHJGcmVlIChzZXQtPnN0cnNbaV0pOwoJICAgIC8qCgkgICAgICogY29weSByZW1haW5pbmcgc3RyaW5nIHBvaW50ZXJzIGFuZCB0cmFpbGluZwoJICAgICAqIE5VTEwKCSAgICAgKi8KCSAgICBtZW1tb3ZlICgmc2V0LT5zdHJzW2ldLCAmc2V0LT5zdHJzW2krMV0sIAoJCSAgICAgKHNldC0+bnVtIC0gaSkgKiBzaXplb2YgKEZjQ2hhcjggKikpOwoJICAgIHNldC0+bnVtLS07CgkgICAgcmV0dXJuIEZjVHJ1ZTsKCX0KICAgIHJldHVybiBGY0ZhbHNlOwp9Cgp2b2lkCkZjU3RyU2V0RGVzdHJveSAoRmNTdHJTZXQgKnNldCkKewogICAgaWYgKC0tc2V0LT5yZWYgPT0gMCkKICAgIHsKCWludAlpOwogICAgCglmb3IgKGkgPSAwOyBpIDwgc2V0LT5udW07IGkrKykKCSAgICBGY1N0ckZyZWUgKHNldC0+c3Ryc1tpXSk7CglGY01lbUZyZWUgKEZDX01FTV9TVFJTRVQsIChzZXQtPnNpemUpICogc2l6ZW9mIChGY0NoYXI4ICopKTsKCWlmIChzZXQtPnN0cnMpCgkgICAgZnJlZSAoc2V0LT5zdHJzKTsKCUZjTWVtRnJlZSAoRkNfTUVNX1NUUlNFVCwgc2l6ZW9mIChGY1N0clNldCkpOwoJZnJlZSAoc2V0KTsKICAgIH0KfQoKRmNTdHJMaXN0ICoKRmNTdHJMaXN0Q3JlYXRlIChGY1N0clNldCAqc2V0KQp7CiAgICBGY1N0ckxpc3QJKmxpc3Q7CgogICAgbGlzdCA9IG1hbGxvYyAoc2l6ZW9mIChGY1N0ckxpc3QpKTsKICAgIGlmICghbGlzdCkKCXJldHVybiAwOwogICAgRmNNZW1BbGxvYyAoRkNfTUVNX1NUUkxJU1QsIHNpemVvZiAoRmNTdHJMaXN0KSk7CiAgICBsaXN0LT5zZXQgPSBzZXQ7CiAgICBzZXQtPnJlZisrOwogICAgbGlzdC0+biA9IDA7CiAgICByZXR1cm4gbGlzdDsKfQoKRmNDaGFyOCAqCkZjU3RyTGlzdE5leHQgKEZjU3RyTGlzdCAqbGlzdCkKewogICAgaWYgKGxpc3QtPm4gPj0gbGlzdC0+c2V0LT5udW0pCglyZXR1cm4gMDsKICAgIHJldHVybiBsaXN0LT5zZXQtPnN0cnNbbGlzdC0+bisrXTsKfQoKdm9pZApGY1N0ckxpc3REb25lIChGY1N0ckxpc3QgKmxpc3QpCnsKICAgIEZjU3RyU2V0RGVzdHJveSAobGlzdC0+c2V0KTsKICAgIEZjTWVtRnJlZSAoRkNfTUVNX1NUUkxJU1QsIHNpemVvZiAoRmNTdHJMaXN0KSk7CiAgICBmcmVlIChsaXN0KTsKfQo=