ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJscGEvbHBhX2h0dHBzLmMgYi9hcC9saWIvbGlibHBhL2xwYV9odHRwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU0YjU0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGlibHBhL2xwYV9odHRwcy5jCkBAIC0wLDAgKzEsNDY0IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisKKyNpbmNsdWRlICJscGFfaW5uZXIuaCIKKworCisgCisvLyBodHRwIMfrx/PNt9DFz6IKK3N0YXRpYyBjaGFyIGh0dHBzX2hlYWRlcltdID0KKyAgICAiR0VUICVzIEhUVFAvMS4xXHJcbiIKKyAgICAiSG9zdDogJXM6JWRcclxuIgorICAgICJDb25uZWN0aW9uOiBDbG9zZVxyXG4iCisgICAgIkFjY2VwdDogKi8qXHJcbiIKKyAgICAiXHJcbiI7CisgLyoKKyBIVFRQIFBPU1QgL2dzbWEvcnNwMi9lczlwbHVzL2luaXRpYXRlQXV0aGVudGljYXRpb24gSFRUUC8xLjEKKyBIb3N0OiBzbWRwLmdzbWEuY29tCisgVXNlci1BZ2VudDogZ3NtYS1yc3AtbHBhZAorIFgtQWRtaW4tUHJvdG9jb2w6IGdzbWEvcnNwL3YyLjIuMAorIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbgorIENvbnRlbnQtTGVuZ3RoOiBYWFgKKyAKKyB7CisJICJldWljY0NoYWxsZW5nZSIgOiAiWlZWcFkyTkRhR0ZzYkdWdVoyVkZlR0Z0Y0d4bFFtRnpaVFkwb1VGWnVRbk5aVkU1RCIsCisJICJldWljY0luZm8xIiA6ICJSbVZIUm5SalIzaHNVVzFHZWxwVVdUQnZWVVphZFZGdVRscFdSVFUiLAorCSAic21kcEFkZHJlc3MiIDogInNtZHAuZ3NtYS5jb20iCisgfQorICovCisKK3N0YXRpYyBpbnQgY3JlYXRlX3JlcXVlc3Rfc29ja2V0KGNvbnN0IGNoYXIqIGhvc3QsY29uc3QgaW50IHBvcnQpCit7CisgICAgaW50IHNvY2tmZDsKKyAgICBzdHJ1Y3QgaG9zdGVudCAqc2VydmVyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2X2FkZHI7CisJc3RydWN0IHRpbWV2YWwgdHY7CisgCisgICAgc29ja2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICBpZiAoc29ja2ZkIDwgMCkKKyAgICB7CisgICAgICAgIHByaW50ZigiW2h0dHBdIGNyZWF0ZV9yZXF1ZXN0X3NvY2tldCBjcmVhdGUgc29ja2V0IGZhaWwuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKwkKKwl0di50dl9zZWMgPSA5MDsKKwl0di50dl91c2VjID0gMDsKKwlpZiAoc2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCAmdHYsIHNpemVvZih0dikpIDwgMCkgeworCQlwcmludGYoIltodHRwXSBzb2NrZXQgb3B0aW9uICBTT19SQ1ZUSU1FTyBmYWlsXG4iKTsKKwkJY2xvc2Uoc29ja2ZkKTsKKyAgICAgICAgcmV0dXJuIC0xOworCX0KKyAKKyAgICAvKiBsb29rdXAgdGhlIGlwIGFkZHJlc3MgKi8KKyAgICBzZXJ2ZXIgPSBnZXRob3N0YnluYW1lKGhvc3QpOworICAgIGlmKHNlcnZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJbaHR0cF0gY3JlYXRlX3JlcXVlc3Rfc29ja2V0IGdldGhvc3RieW5hbWUtLSVzLS1mYWlsLlxuIiwgaG9zdCk7CisgICAgICAgIGNsb3NlKHNvY2tmZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgCisgICAgbWVtc2V0KCZzZXJ2X2FkZHIsMCxzaXplb2Yoc2Vydl9hZGRyKSk7CisgICAgc2Vydl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIHNlcnZfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgIG1lbWNweSgmc2Vydl9hZGRyLnNpbl9hZGRyLnNfYWRkcixzZXJ2ZXItPmhfYWRkcixzZXJ2ZXItPmhfbGVuZ3RoKTsKKyAKKyAgICBpZiAoY29ubmVjdChzb2NrZmQsKHN0cnVjdCBzb2NrYWRkciAqKSZzZXJ2X2FkZHIsc2l6ZW9mKHNlcnZfYWRkcikpIDwgMCkKKyAgICB7CisgICAgICAgIHByaW50ZigiW2h0dHBdIGNyZWF0ZV9yZXF1ZXN0X3NvY2tldCBjb25uZWN0IGZhaWwuXG4iKTsKKyAgICAgICAgY2xvc2Uoc29ja2ZkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc29ja2ZkOworfQorIAorLyoqCisgKiBAYnJpZWYgaHR0cHNfcGFyc2VyX3VybCAgveLO9rP2aHR0cHMg1tC1xNPyw/uhorbLv9q6zcK3vrYKKyAqIEBwYXJhbSB1cmwgICDQ6NKqveLO9rXEdXJsCisgKiBAcGFyYW0gaG9zdCAgveLO9rP2wLS1xNPyw/u78tXfaXAKKyAqIEBwYXJhbSBwb3J0ICC2y7/ao6zDu9PQyrHErMjPt7W72DQ0MworICogQHBhcmFtIHBhdGggIMK3vrajrNa4tcTKx9Pyw/u688PmtcTOu9bDCisgKiBAcmV0dXJuCisgKi8KK2ludCBodHRwc19wYXJzZXJfdXJsKGNvbnN0IGNoYXIqIHVybCxjaGFyICoqaG9zdCxpbnQgKnBvcnQsY2hhciAqKnBhdGgpCit7CisgICAgaWYodXJsID09IE5VTEwgfHwgc3RybGVuKHVybCkgPCA5IHx8IGhvc3QgPT0gTlVMTCB8fCBwYXRoID09IE5VTEwpCisgICAgeworICAgICAgICAgcHJpbnRmKCJ1cmwgb3IgaG9zdCBvciBwYXRoIGlzIG51bGwuXG4iKTsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgCisgICAgLy/F0LbPyseyu8rHIGh0dHBzOi8vCisgICAgaW50IGkgPSAwOworICAgIGNoYXIgaHR0cHNfcHJlZml4W10gPSAiaHR0cHM6Ly8iOworICAgIGZvcihpPTA7aTw4O2krKykKKyAgICB7CisgICAgICAgIGlmKHVybFtpXSAhPSBodHRwc19wcmVmaXhbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiaWxsZWdhbCB1cmwgPSAlcy5cbiIsdXJsKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAKKyAgICBjb25zdCBjaGFyICp0ZW1wID0gdXJsK2k7CisgICAgd2hpbGUoKnRlbXAgIT0gJy8nKSAgLy9uZXh0IC8KKyAgICB7CisgICAgICAgIGlmKCp0ZW1wID09ICdcMCcpICAvLworICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoImlsbGVnYWwgdXJsID0gJXMuXG4iLHVybCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdGVtcCsrOworICAgIH0KKyAKKyAgICBjb25zdCBjaGFyICpob3N0X3BvcnQgPSB1cmwraTsKKyAgICB3aGlsZSgqaG9zdF9wb3J0ICE9ICc6JyAmJiAqaG9zdF9wb3J0ICE9ICcvJykgIC8v1dK1vSA6u/LV3yAvIL3hyvgKKyAgICB7CisgICAgICAgIGhvc3RfcG9ydCArKzsKKyAgICB9CisgCisgICAgaW50IGhvc3RfbGVuID0gaG9zdF9wb3J0LXVybC1pOyAgLy+89bX0aHR0cHM6Ly8KKyAgICBpbnQgcGF0aF9sZW4gPSBzdHJsZW4odGVtcCk7CisgICAgY2hhciAqaG9zdF90ZW1wID0gKGNoYXIgKiltYWxsb2MoaG9zdF9sZW4gKyAxKTsgIC8vtuDSu7j219a3+7SuveHK+LHqyrYgXDAKKyAgICBpZihob3N0X3RlbXAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigibWFsbG9jIGhvc3QgZmFpbC5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKCpob3N0X3BvcnQrKyA9PSAnOicpICAvL3VybCDW0NPQtsu/2gorICAgIHsKKyAgICAgICAgKnBvcnQgPSAwOworICAgICAgICB3aGlsZSgqaG9zdF9wb3J0ICE9Jy8nICYmICpob3N0X3BvcnQgIT0nXDAnKSAgLy/Krr341sbX1rf7tK7XqrPJyv3X1gorICAgICAgICB7CisgICAgICAgICAgICAqcG9ydCAqPSAxMDsKKyAgICAgICAgICAgICpwb3J0ICs9ICgqaG9zdF9wb3J0IC0gJzAnKTsKKyAgICAgICAgICAgIGhvc3RfcG9ydCArKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcG9ydCA9IDQ0MzsKKyAgICB9CisgCisgICAgY2hhciAqcGF0aF90ZW1wID0gKGNoYXIgKiltYWxsb2MocGF0aF9sZW4gKyAxKTsgIC8vtuDSu7j219a3+7SuveHK+LHqyrYgXDAKKyAgICBpZihwYXRoX3RlbXAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigibWFsbG9jIHBhdGggZmFpbC5cbiIpOworICAgICAgICBmcmVlKGhvc3RfdGVtcCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWVtY3B5KGhvc3RfdGVtcCx1cmwraSxob3N0X2xlbik7CisgICAgbWVtY3B5KHBhdGhfdGVtcCx0ZW1wLHBhdGhfbGVuKTsKKyAgICBob3N0X3RlbXBbaG9zdF9sZW5dID0gJ1wwJzsKKyAgICBwYXRoX3RlbXBbcGF0aF9sZW5dID0gJ1wwJzsKKyAgICAqaG9zdCA9IGhvc3RfdGVtcDsKKyAgICAqcGF0aCA9IHBhdGhfdGVtcDsKKyAgICByZXR1cm4gMDsKK30KKyAKK2ludCBodHRwc19pbml0KGh0dHBzX2NvbnRleHRfdCAqY29udGV4dCkKK3sKKwlpbnQgcmV0ID0gMDsKKyAgICBpZihjb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoImluaXQgaHR0cHNfY29udGV4dF90IGlzIG51bGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAvKgorICAgIGlmKGh0dHBzX3BhcnNlcl91cmwodXJsLCYoY29udGV4dC0+aG9zdCksJihjb250ZXh0LT5wb3J0KSwmKGNvbnRleHQtPnBhdGgpKSkKKyAgICB7CisgICAgICAgIHByaW50ZigiaHR0cHNfcGFyc2VyX3VybCBmYWlsLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgKi8KKyAgICBjb250ZXh0LT5zb2NrX2ZkID0gY3JlYXRlX3JlcXVlc3Rfc29ja2V0KGNvbnRleHQtPmhvc3QsY29udGV4dC0+cG9ydCk7CisJcHJpbnRmKCJjcmVhdGVfcmVxdWVzdF9zb2NrZXQgJWQuXG4iLGNvbnRleHQtPnNvY2tfZmQpOworICAgIGlmKGNvbnRleHQtPnNvY2tfZmQgPCAwKQorICAgIHsKKyAgICAgICAgZ290byBodHRwc19pbml0X2ZhaWw7CisgICAgfQorIAorICAgIGNvbnRleHQtPnNzbF9jdCA9IFNTTF9DVFhfbmV3KFNTTHYyM19tZXRob2QoKSk7CisJcHJpbnRmKCJTU0xfQ1RYX25ldyAlcC5cbiIsY29udGV4dC0+c3NsX2N0KTsgLy9jb3YgbQorICAgIGlmKGNvbnRleHQtPnNzbF9jdCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgZ290byBodHRwc19pbml0X2ZhaWw7CisgICAgfQorIAorICAgIGNvbnRleHQtPnNzbCA9IFNTTF9uZXcoY29udGV4dC0+c3NsX2N0KTsKKwlwcmludGYoIlNTTF9uZXcgJXAuXG4iLGNvbnRleHQtPnNzbCk7IC8vY292IG0KKyAgICBpZihjb250ZXh0LT5zc2wgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGdvdG8gaHR0cHNfaW5pdF9mYWlsOworICAgIH0KKyAJcmV0ID0gU1NMX3NldF9mZChjb250ZXh0LT5zc2wsY29udGV4dC0+c29ja19mZCk7CisJcHJpbnRmKCJTU0xfc2V0X2ZkIHJldCAlZCBcbiIscmV0KTsKKyAJcmV0ID0gU1NMX2Nvbm5lY3QoY29udGV4dC0+c3NsKTsKKwlwcmludGYoIlNTTF9jb25uZWN0IHJldCAlZCBcbiIscmV0KTsKKyAgICBpZihyZXQgPT0gLTEpCisgICAgeworICAgICAgICBnb3RvIGh0dHBzX2luaXRfZmFpbDsKKyAgICB9CisgICAgcmV0dXJuIDA7CitodHRwc19pbml0X2ZhaWw6CisgICAgaHR0cHNfdW5pbml0KGNvbnRleHQpOworICAgIHJldHVybiAtMTsKK30KKyAKK2ludCBodHRwc19yZWFkKGh0dHBzX2NvbnRleHRfdCAqY29udGV4dCx2b2lkKiBidWZmLGludCBsZW4pCit7CisgICAgaWYoY29udGV4dCA9PSBOVUxMIHx8IGNvbnRleHQtPnNzbCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJyZWFkIGh0dHBzX2NvbnRleHRfdCBvciBzc2wgaXMgbnVsbC5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBTU0xfcmVhZChjb250ZXh0LT5zc2wsYnVmZixsZW4pOworfQorIAoraW50IGh0dHBzX3dyaXRlKGh0dHBzX2NvbnRleHRfdCAqY29udGV4dCxjb25zdCB2b2lkKiBidWZmLGludCBsZW4pCit7CisgICAgaWYoY29udGV4dCA9PSBOVUxMIHx8IGNvbnRleHQtPnNzbCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJ3cml0ZSBodHRwc19jb250ZXh0X3Qgb3Igc3NsIGlzIG51bGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gU1NMX3dyaXRlKGNvbnRleHQtPnNzbCxidWZmLGxlbik7Cit9CisgCitpbnQgaHR0cHNfZ2V0X3N0YXR1c19jb2RlKGh0dHBzX2NvbnRleHRfdCAqY29udGV4dCwgaW50ICpjb250ZW50X2xlbikKK3sKKyAgICBpbnQgcmV0OworICAgIGludCBmbGFnID0wOworICAgIGludCByZWN2X2xlbiA9IDA7CisgICAgY2hhciByZXNfaGVhZGVyWzEwMjRdID0gezB9OworCQorCWlmKGNvbnRleHQgPT0gTlVMTCB8fCBjb250ZXh0LT5zc2wgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHByaW50ZigiZ2V0IHN0YXR1cyBodHRwc19jb250ZXh0X3Qgb3Igc3NsIGlzIG51bGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKwkKKyAgICB3aGlsZShyZWN2X2xlbiA8IChzaXplb2YocmVzX2hlYWRlciktMSkpCisgICAgeworICAgICAgICByZXQgPSBTU0xfcmVhZChjb250ZXh0LT5zc2wsIHJlc19oZWFkZXIrcmVjdl9sZW4sIDEpOworICAgICAgICBpZihyZXQ8MSkgIC8vIHJlY3YgZmFpbAorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvL9XStb3P7NOmzbe1xM23sr/Qxc+iLCDBvbj2IlxyXG4izqq31rjuteMKKyAgICAgICAgaWYoKHJlc19oZWFkZXJbcmVjdl9sZW5dPT0nXHInJiYoZmxhZz09MHx8ZmxhZz09MikpfHwocmVzX2hlYWRlcltyZWN2X2xlbl09PSdcbicmJihmbGFnPT0xfHxmbGFnPT0zKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWcrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWcgPSAwOworICAgICAgICB9CisgICAgICAgIHJlY3ZfbGVuKz1yZXQ7CisgICAgICAgIGlmKGZsYWc9PTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIC8vcHJpbnRmKCJbaHR0cF0gcmVjdl9sZW49JWQgcmVzX2hlYWRlciA9ICVzLlxuIixyZWN2X2xlbixyZXNfaGVhZGVyKTsKKyAgICAvKrvxyKHP7NOmzbe1xNDFz6IqLworICAgIGludCBzdGF0dXNfY29kZSA9IC0xOworICAgIGNoYXIgKnBvcyA9IHN0cnN0cihyZXNfaGVhZGVyLCAiSFRUUC8iKTsKKyAgICBpZihwb3MpCisgICAgeworICAgICAgICBzc2NhbmYocG9zLCAiJSpzICVkIiwgJnN0YXR1c19jb2RlKTsvL7e1u9jXtMyswusKKyAgICB9CisKKwlpbnQgY29udF9sZW4gPSAwOyAKKwlwb3MgPSBzdHJzdHIocmVzX2hlYWRlciwgIkNvbnRlbnQtTGVuZ3RoOiIpOworICAgIGlmKHBvcykKKyAgICB7CisgICAgICAgIHNzY2FuZihwb3MsICIlKnMgJWQiLCAmY29udF9sZW4pOy8vt7W72Ne0zKzC6worICAgIH0KKwlwb3MgPSBzdHJzdHIocmVzX2hlYWRlciwgImNodW5rZWQiKTsKKwlpZihwb3MpLy9UcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZAorCXsKKwkJY29udF9sZW4gPSBIVFRQX0NIVU5LRURfRkxBRzsKKwl9CisJKmNvbnRlbnRfbGVuID0gY29udF9sZW47CisJCisJcHJpbnRmKCJyZXNfaGVhZCMjJXMjI1xuIiwgcmVzX2hlYWRlcik7CisJcHJpbnRmKCJzdGF0dXNfY29kZTolZCwgQ29udGVudC1MZW5ndGg6JWRcbiIsIHN0YXR1c19jb2RlLCBjb250X2xlbik7CisKKyAgICByZXR1cm4gc3RhdHVzX2NvZGU7Cit9CisgCitpbnQgaHR0cHNfcmVhZF9jb250ZW50KGh0dHBzX2NvbnRleHRfdCAqY29udGV4dCxjaGFyICpyZXNwX2NvbnRldCxpbnQgbWF4X2xlbikKK3sKKyAgICBpZihjb250ZXh0ID09IE5VTEwgfHwgY29udGV4dC0+c3NsID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoInJlYWQgY29udGVudCBodHRwc19jb250ZXh0X3Qgb3Igc3NsIGlzIG51bGwuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgcmV0IDsKKyAgICBpbnQgcmVjdl9zaXplID0gMDsKKyAgICB3aGlsZShyZWN2X3NpemUgPCBtYXhfbGVuKQorICAgIHsKKyAgICAgICByZXQgPSBTU0xfcmVhZChjb250ZXh0LT5zc2wscmVzcF9jb250ZXQgKyByZWN2X3NpemUsbWF4X2xlbi1yZWN2X3NpemUpOworCSAgIGlmKHJldCA8IDEpCisgICAgICAgeworICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICAgcmVjdl9zaXplICs9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJlY3Zfc2l6ZTsKK30KKy8vW0NodW5rtPPQoV1bu9iztV1bQ2h1bmvK/b7dzOVdW7vYs7VdW0NodW5rtPPQoV1bu9iztV1bQ2h1bmvK/b7dzOVdW7vYs7VdWzBdW7vYs7VdW2Zvb3RlcsTayN2jqNPQtcS7sKOpXVu72LO1XQorLy/XotLiY2h1bmstc2l6ZcrH0tTKrsH5vfjWxrXEQVNDSUnC67Htyr61xKOsscjI5zg2QUWjqMq1vMq1xMquwfm9+NbG06a4w8rHo7ozODM2NjE2NaOpo6y8xsvjs8mzpLbI06a4w8rHo7ozNDQ3OKOsse3KvrTTu9iztdauuvPT0MGs0Pi1xDM0NDc419a92rXEyv2+3QoraW50IGh0dHBzX3JlYWRfY2h1bmtlZF9jb250ZW50KGh0dHBzX2NvbnRleHRfdCAqY29udGV4dCxjaGFyICoqcmVzcF9jb250ZXQsaW50IG1heF9sZW4pCit7ICAgCisgICAgaW50IHJldCA9IDA7CisJaW50IGZsYWcgPSAwOworICAgIGludCByZWN2X3NpemUgPSAwOworCQorCWludCByZWN2X2xlbiA9IDA7CisgICAgY2hhciBjaHVua19oZWFkZXJbMTAyNF0gPSB7MH07CisJCisJaW50IHJlYWRfZmxhZyA9IDA7CisJaW50IHJlYWRfbGVuID0gMTsKKwkJCisJaWYoY29udGV4dCA9PSBOVUxMIHx8IGNvbnRleHQtPnNzbCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJyZWFkIGNvbnRlbnQgaHR0cHNfY29udGV4dF90IG9yIHNzbCBpcyBudWxsLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisJCisgICAgd2hpbGUocmVjdl9zaXplIDwgbWF4X2xlbikKKyAgICB7CQkKKwkJaWYgKHJlYWRfZmxhZyA9PSAwKSB7CisJCQlyZXQgPSBTU0xfcmVhZChjb250ZXh0LT5zc2wsIGNodW5rX2hlYWRlcityZWN2X2xlbiwgcmVhZF9sZW4pOworCQkJaWYocmV0IDwgMSkgIC8vIHJlY3YgZmFpbAorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRmKCJjaHVua19oZWFkZXIjIyVzIyNcbiIsIGNodW5rX2hlYWRlcityZWN2X2xlbik7CisJCQkvL9K7uPYiXHJcbiLOqrfWuO614worCQkJaWYoKGNodW5rX2hlYWRlcltyZWN2X2xlbl09PSdccicmJmZsYWc9PTApfHwoY2h1bmtfaGVhZGVyW3JlY3ZfbGVuXT09J1xuJyYmZmxhZz09MSkpCisJCQl7CisJCQkJZmxhZysrOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZsYWcgPSAwOworCQkJfQorCQkJcmVjdl9sZW4gKz0gcmV0OworCQkJaWYoZmxhZyA9PSAyKQorCQkJeworCQkJCWlmIChzdHJsZW4oY2h1bmtfaGVhZGVyKSA+IDIpIHsKKwkJCQkJLy/M+Ln9t8cwfjmjrEF+Rj8/PworCQkJCQllcnJubyA9IDA7CisJCQkJCWludCBzaXplID1zdHJ0b2woY2h1bmtfaGVhZGVyLCBOVUxMLCAxNik7CisJCQkJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQKKwkJCQkJeworCQkJCQkJcHJpbnRmKCJzdHJ0b2wgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJfQorCQkJCQkvL3NzY2FuZihwb3MsICIlWCIsICZjb250X2xlbik7Ly9YPz8/CisJCQkJCWlmIChzaXplIDw9IDAgfHwgc2l6ZSA+PSBtYXhfbGVuKSB7CisJCQkJCQlyZWFkX2ZsYWcgPSAyOworCQkJCQkJcmVhZF9sZW4gPSBzaXplb2YoY2h1bmtfaGVhZGVyKS0xOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJcmVhZF9mbGFnID0gMTsKKwkJCQkJCXJlYWRfbGVuID0gc2l6ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQltZW1zZXQoY2h1bmtfaGVhZGVyLCAwLCBzaXplb2YoY2h1bmtfaGVhZGVyKSk7CisJCQkJcmVjdl9sZW4gPSAwOworCQkJfQorCQkJaWYgKHJlY3ZfbGVuID49IChzaXplb2YoY2h1bmtfaGVhZGVyKS0xKSkKKwkJCQlicmVhazsKKwkJfSAKKwkJZWxzZSBpZihyZWFkX2ZsYWcgPT0gMSkgeworCQkJaWYocmVjdl9zaXplID09IDApIHsKKwkJCQljaGFyICpyZXNwX3RtcCA9IG1hbGxvYyhyZWFkX2xlbiArIDEpOzsKKwkJCQlpZiAocmVzcF90bXAgPT0gTlVMTCkgeworCQkJCQlwcmludGYoInJlc3BfdG1wIGlzIG51bGxcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCW1lbXNldChyZXNwX3RtcCwgMCwgcmVhZF9sZW4gKyAxKTsKKwkJCQkqcmVzcF9jb250ZXQgPSByZXNwX3RtcDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWNoYXIgKnJlc3BfdG1wID0gTlVMTDsKKwkJCQlyZXNwX3RtcCA9IHJlYWxsb2MoKnJlc3BfY29udGV0LCByZWN2X3NpemUgKyByZWFkX2xlbiArIDEpOworCQkJCWlmIChyZXNwX3RtcCA9PSBOVUxMKSB7CisJCQkJCWZyZWUoKnJlc3BfY29udGV0KTsKKwkJCQkJcHJpbnRmKCJyZXNwX3RtcCByZWFsbG9jIG51bGxcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCSpyZXNwX2NvbnRldCA9IHJlc3BfdG1wOworCQkJfQorCQkJLy9yZWFkINaxtb2zpLbICisJCQlyZXQgPSBodHRwc19yZWFkX2NvbnRlbnQoY29udGV4dCwgKCpyZXNwX2NvbnRldCkrcmVjdl9zaXplLCByZWFkX2xlbik7CisJCQlpZihyZXQ8MSkgIC8vIHJlY3YgZmFpbAorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQkJcmVhZF9sZW4gPSAxOworCQkJcmVhZF9mbGFnID0gMDsKKwkJCXJlY3Zfc2l6ZSArPSByZXQ7CisJCX0gCisJCWVsc2UgeworCQkJcmV0ID0gU1NMX3JlYWQoY29udGV4dC0+c3NsLCBjaHVua19oZWFkZXIsIHJlYWRfbGVuKTsKKwkJCXByaW50ZigiY2h1bmtfaGVhZGVyIyMlcyMjXG4iLCBjaHVua19oZWFkZXIpOworCQkJYnJlYWs7CisJCX0KKworICAgIH0KKyAgICByZXR1cm4gcmVjdl9zaXplOworfQorCisgCitpbnQgaHR0cHNfdW5pbml0KGh0dHBzX2NvbnRleHRfdCAqY29udGV4dCkKK3sKKyAgICBpZihjb250ZXh0ID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGYoInVuaW5pdCBodHRwc19jb250ZXh0X3QgaXMgbnVsbC5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYoY29udGV4dC0+aG9zdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy9mcmVlKGNvbnRleHQtPmhvc3QpOworICAgICAgICBjb250ZXh0LT5ob3N0ID0gTlVMTDsKKyAgICB9CisJCisgICAgaWYoY29udGV4dC0+cGF0aCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLy9mcmVlKGNvbnRleHQtPnBhdGgpOworICAgICAgICBjb250ZXh0LT5wYXRoID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihjb250ZXh0LT5zc2wgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIFNTTF9zaHV0ZG93bihjb250ZXh0LT5zc2wpOworICAgICAgICAvL1NTbF9mcmVlKGNvbnRleHQtPnNzbCk7CisgICAgICAgIGNvbnRleHQtPnNzbCA9IE5VTEw7CisgICAgfQorICAgIGlmKGNvbnRleHQtPnNzbF9jdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgU1NMX0NUWF9mcmVlKGNvbnRleHQtPnNzbF9jdCk7CisgICAgICAgIGNvbnRleHQtPnNzbF9jdCA9IE5VTEw7CisgICAgfQorICAgIGlmKGNvbnRleHQtPnNvY2tfZmQgPiAwKQorICAgIHsKKyAgICAgICAgY2xvc2UoY29udGV4dC0+c29ja19mZCk7CisgICAgICAgIGNvbnRleHQtPnNvY2tfZmQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisK