ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJscGEvbHBhX2VzaW1fYXBpLmMgYi9hcC9saWIvbGlibHBhL2xwYV9lc2ltX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyYzc0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGlibHBhL2xwYV9lc2ltX2FwaS5jCkBAIC0wLDAgKzEsODY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8vDQorLy+yzrz7INbQufrBqs2oZXNpbcSj1+nAqdW51rjB7ry8yvW55re2DQorLy8gICANCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2luY2x1ZGUgPGN0eXBlLmg+DQorI2luY2x1ZGUgPHN5cy90aW1lLmg+DQorI2luY2x1ZGUgPHRlcm1pb3MuaD4NCisjaW5jbHVkZSA8ZXJybm8uaD4NCisNCisjaW5jbHVkZSAibHBhX2lubmVyLmgiDQorDQorDQorI2RlZmluZSBTTURQX1BPUlQgNDQzDQorI2RlZmluZSBTTURQX0RMX0lOVEVSVkFMIDk1Ly/PwtTYvOS49D45MHMNCisNCisNCisvL7Slt6K3/s7xxvdodHRwx+vH8w0KK3N0YXRpYyBjaGFyIHNtZHBfaHR0cHNfcmVxW10gPQ0KKyAgICAiUE9TVCAvZ3NtYS9yc3AyL2VzOXBsdXMvJXMgSFRUUC8xLjFcclxuIg0KKyAgICAiSG9zdDogJXNcclxuIg0KKyAgICAiVXNlci1BZ2VudDogZ3NtYS1yc3AtbHBhZFxyXG4iDQorCSJYLUFkbWluLVByb3RvY29sOiBnc21hL3JzcC92Mi4yLjBcclxuIg0KKyAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXHJcbiINCisgICAgIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iDQorICAgICJcclxuJXNcclxuIjsNCisNCitzdGF0aWMgaHR0cHNfY29udGV4dF90IGdfaHR0cHNfY3QgPSB7MH07DQorc3RhdGljIGNoYXIgZ190cmFuc2lkW01BWF9UUkFOU0lEX0xFTl0gPSB7MH07DQorY2hhciBjdXJlbnRfaWNjaWRbSUNDSURfTEVOKzFdID0gezB9Ow0KKw0KK2V4dGVybiBjaGFyIGdfaW1laVtNQVhfSU1FSV9MRU5dOw0KKw0KKy8vaWNjaWQgZnJvbSBicHAgaW5zdGFsbCByZXN1bHQsIGlmIG51bGwsIGZhaWxlZA0KKy8vSVNELVAgQUlELCB0YWcgJzRGJztJQ0NJRCwgdGFnICc1QScuIGlmIHN1Y2MsIGhhcyBBSUQNCitzdGF0aWMgaW50IGxwYV9wYXJzZV9pY2NpZF9hcGR1KGNoYXIgKmFwZHUsIGNoYXIgKmljY2lkLCBpbnQgc2l6ZSkNCit7DQorCWludCBhcGR1X2xlbiA9IHN0cmxlbihhcGR1KTsNCisJdW5zaWduZWQgY2hhciAqYXBkdV9ieXRlID0gbWFsbG9jKGFwZHVfbGVuLzIgKyAxKTsNCisJaW50IGFwZHVfYnl0ZV9sZW4gPSAwOw0KKwljaGFyICp0YWdfaGV4ID0gTlVMTDsNCisJY2hhciBoYXNfaWNjaWRbSUNDSURfTEVOKzFdID0gezB9Ow0KKw0KKwlpZiAoYXBkdV9ieXRlID09IE5VTEwpIHsNCisJCXByaW50ZigibHBhX3BhcnNlX2ljY2lkX2FwZHUgbm8gbWVtb3J5XG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwltZW1zZXQoYXBkdV9ieXRlLCAwLCBhcGR1X2xlbi8yICsgMSk7DQorDQorCWFwZHVfYnl0ZV9sZW4gPSBzdHJpbmcyYnl0ZXMoYXBkdSwgYXBkdV9ieXRlLCBhcGR1X2xlbik7DQorDQorCXRhZ19oZXggPSBscGFfdGx2X2dldF92YWxfYnlfdGFnKGFwZHVfYnl0ZSwgYXBkdV9ieXRlX2xlbiwgMHg0Rik7DQorCWlmICh0YWdfaGV4ID09IE5VTEwpIHsNCisJCXByaW50ZigibHBhX3BhcnNlX2ljY2lkX2FwZHUgbm90IGZpbmQgQUlEXG4iKTsNCisJCWZyZWUoYXBkdV9ieXRlKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwlwcmludGYoImxwYSBhaWQ6JXNcbiIsIHRhZ19oZXgpOw0KKwlmcmVlKHRhZ19oZXgpOw0KKwl0YWdfaGV4ID0gTlVMTDsNCisJDQorCXRhZ19oZXggPSBscGFfdGx2X2dldF92YWxfYnlfdGFnKGFwZHVfYnl0ZSwgYXBkdV9ieXRlX2xlbiwgMHg1QSk7DQorCWlmICh0YWdfaGV4ID09IE5VTEwpIHsNCisJCXByaW50ZigibHBhX3BhcnNlX2ljY2lkX2FwZHUgbm90IGZpbmQgaWNjaWRcbiIpOw0KKwkJZnJlZShhcGR1X2J5dGUpOw0KKwkJcmV0dXJuIC0xOw0KKw0KKwl9DQorCQkNCisJc25wcmludGYoaWNjaWQsIHNpemUsICIlcyIsIHRhZ19oZXgpOw0KKw0KKwljZmdfZ2V0X2l0ZW0oImxwYV9icHBfaWNjaWQiLCBoYXNfaWNjaWQsIHNpemVvZihoYXNfaWNjaWQpKTsNCisJaWYgKHN0cmNtcChpY2NpZCwgaGFzX2ljY2lkKSAhPSAwKSB7DQorCQljZmdfc2V0KCJscGFfYnBwX2ljY2lkIiwgaWNjaWQpOw0KKwkJY2ZnX3NhdmUoKTsNCisJCXByaW50ZigibHBhIGljY2lkIG5vdCBzYW1lP1xuIik7DQorCX0NCisNCisJcHJpbnRmKCJscGEgaWNjaWQ6JXNcbiIsIGljY2lkKTsNCisNCisJZnJlZShhcGR1X2J5dGUpOw0KKwlmcmVlKHRhZ19oZXgpOw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGludCBscGFfY29ubmVjdF9zbWRwKGNoYXIgKmhvc3QpDQorew0KKwlTU0xfbGlicmFyeV9pbml0KCk7DQorDQorCWdfaHR0cHNfY3QucG9ydD1TTURQX1BPUlQ7DQorCWdfaHR0cHNfY3QuaG9zdD1ob3N0Ow0KKwlnX2h0dHBzX2N0LnBhdGg9TlVMTDsNCisJcmV0dXJuIGh0dHBzX2luaXQoJmdfaHR0cHNfY3QpOw0KK30NCisNCitzdGF0aWMgdm9pZCBscGFfZGlzY29ubl9zbWRwKGNoYXIgKmhvc3QpDQorew0KKwlodHRwc191bmluaXQoJmdfaHR0cHNfY3QpOw0KK30NCisNCitzdGF0aWMgY2hhciAqbHBhX3NtZHBfc2Vzc2lvbihjaGFyICpwYXRoLCBjaGFyICpyZXFfZGF0YSwgaW50ICpyZXNfbGVuKQ0KK3sNCisJaW50IHJldCA9IC0xOw0KKwlpbnQgY29udF9sZW4gPSAwOw0KKwljaGFyICpodHRwc19yZXEgPSBOVUxMOw0KKwljaGFyICpodHRwc19yZXNwID0gTlVMTDsNCisJaW50IGh0dHBzX3JlcV9sZW4gPSBzdHJsZW4oc21kcF9odHRwc19yZXEpK3N0cmxlbihwYXRoKStzdHJsZW4oZ19odHRwc19jdC5ob3N0KStzdHJsZW4ocmVxX2RhdGEpKzMyOw0KKw0KKwkqcmVzX2xlbiA9IC0xOw0KKw0KKwlpZiAoaHR0cHNfcmVxX2xlbiA+IFNNRFBfSFRUUF9NQVhfTEVOKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWh0dHBzX3JlcSA9IG1hbGxvYyhodHRwc19yZXFfbGVuKTsNCisJaWYgKGh0dHBzX3JlcSA9PSBOVUxMKQ0KKwkJcmV0dXJuIE5VTEw7DQorCQ0KKwltZW1zZXQoaHR0cHNfcmVxLCAwLCBodHRwc19yZXFfbGVuKTsNCisJZ19odHRwc19jdC5wYXRoID0gcGF0aDsNCisJcmV0ID0gc25wcmludGYoaHR0cHNfcmVxLCBodHRwc19yZXFfbGVuLCBzbWRwX2h0dHBzX3JlcSwNCisJCWdfaHR0cHNfY3QucGF0aCwgZ19odHRwc19jdC5ob3N0LCBzdHJsZW4ocmVxX2RhdGEpLCByZXFfZGF0YSk7DQorCQ0KKwlwcmludGYoIltodHRwc19zbWRwXXJlcVslZF06IyMlcyMjXG4iLCBzdHJsZW4oaHR0cHNfcmVxKSwgaHR0cHNfcmVxKTsNCisJcmV0ID0gaHR0cHNfd3JpdGUoJmdfaHR0cHNfY3QsIGh0dHBzX3JlcSwgcmV0KTsNCisJaWYgKHJldCA9PSAtMSkgew0KKwkJLy9FQUdBSU4/DQorCQlmcmVlKGh0dHBzX3JlcSk7DQorCQlwcmludGYoIltodHRwc19zbWRwXSBodHRwc193cml0ZSBlcnI6JWQuXG4iLCBlcnJubyk7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlyZXQgPSBodHRwc19nZXRfc3RhdHVzX2NvZGUoJmdfaHR0cHNfY3QsICZjb250X2xlbik7DQorCWlmKHJldCA9PSAyMDApIHsNCisJcHJpbnRmKCJbaHR0cHNfc21kcF0gaHR0cHNfcmVjdiBsZW46JWQuXG4iLCBjb250X2xlbik7DQorCQlpZiAoY29udF9sZW4gPT0gSFRUUF9DSFVOS0VEX0ZMQUcpIHsNCisJCQlyZXQgPSBodHRwc19yZWFkX2NodW5rZWRfY29udGVudCgmZ19odHRwc19jdCwgJmh0dHBzX3Jlc3AsIFNNRFBfSFRUUF9NQVhfTEVOKTsNCisJCQlpZihyZXQgPiAwKSB7DQorCQkJCSpyZXNfbGVuID0gcmV0Ow0KKwkJCQlodHRwc19yZXNwW3JldF0gPSAnXDAnOwkvL9fWt/u0rr3hyvix6sq2DQorCQkJCXByaW50ZigiW2h0dHBzX3NtZHBdIGh0dHBzX3dyaXRlIGh0dHBzX3Jlc3BfY29udGVudCMjJXMjI1xuIixodHRwc19yZXNwKTsNCisJCQl9DQorCQkJcHJpbnRmKCJbaHR0cHNfc21kcF0gaHR0cHNfcmVzcCBjaHVuayAlZCEhIVxuIiwgcmV0KTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCWlmIChjb250X2xlbiA+PSBTTURQX0hUVFBfTUFYX0xFTikgew0KKwkJCQlmcmVlKGh0dHBzX3JlcSk7DQorCQkJCXByaW50ZigiW2h0dHBzX3NtZHBdIGh0dHBzX3JlY3YgdG9vIGxvbmcgPSAlZC5cbiIsIGNvbnRfbGVuKTsNCisJCQkJcmV0dXJuIE5VTEw7DQorCQkJfQ0KKwkJCWh0dHBzX3Jlc3AgPSBtYWxsb2MoY29udF9sZW4gKyAxKTsNCisJCQlpZiAoaHR0cHNfcmVzcCA9PSBOVUxMKSB7DQorCQkJCWZyZWUoaHR0cHNfcmVxKTsNCisJCQkJcmV0dXJuIE5VTEw7DQorCQkJfQ0KKw0KKwkJCW1lbXNldChodHRwc19yZXNwLCAwLCBjb250X2xlbiArIDEpOw0KKwkJCXJldCA9IGh0dHBzX3JlYWRfY29udGVudCgmZ19odHRwc19jdCwgaHR0cHNfcmVzcCwgY29udF9sZW4pOw0KKwkJCWlmKHJldCA+IDApIHsNCisJCQkJKnJlc19sZW4gPSByZXQ7DQorCQkJCWh0dHBzX3Jlc3BbcmV0XSA9ICdcMCc7CS8v19a3+7SuveHK+LHqyrYNCisJCQkJcHJpbnRmKCJbaHR0cHNfc21kcF0gaHR0cHNfcmVhZF9jb250ZW50IyMlcyMjXG4iLGh0dHBzX3Jlc3ApOw0KKwkJCX0gDQorCQkJZWxzZSB7DQorCQkJCSpyZXNfbGVuID0gLTE7DQorCQkJCWZyZWUoaHR0cHNfcmVxKTsNCisJCQkJZnJlZShodHRwc19yZXNwKTsNCisJCQkJcmV0dXJuIE5VTEw7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCWVsc2UgaWYocmV0ID09IDIwNCkgew0KKwkJKnJlc19sZW4gPSAwOw0KKwl9DQorCWVsc2Ugew0KKwkJcHJpbnRmKCJbaHR0cHNfc21kcF0gaHR0cHNfcmVzcCBjb2RlID0gJWQuXG4iLCByZXQpOw0KKwl9DQorCQ0KKwlmcmVlKGh0dHBzX3JlcSk7DQorCXJldHVybiBodHRwc19yZXNwOw0KK30NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8vDQorLy/M4cihc3RyaW5nwODQzcr9vt0NCisvLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIGNoYXIgKmxwYV9wYXJzZV9qc29uX3N0cihjaGFyICpzcmNTdHIsIGNoYXIgKmtleSkNCit7DQorCWNKU09OICpyb290ID0gTlVMTDsNCisJY0pTT04gKm9iamVjdCA9IE5VTEw7DQorCWNoYXIgKnZhbHVlX3N0ciA9IE5VTEw7DQorCWludCB2YWx1ZV9sZW4gPSAwOw0KKw0KKwlyb290ID0gY0pTT05fUGFyc2Uoc3JjU3RyKTsNCisJaWYgKHJvb3QgPT0gTlVMTCkgew0KKwkJcHJpbnRmKCJyb290ID09IE5VTExcbiIpOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJb2JqZWN0ID0gY0pTT05fR2V0T2JqZWN0SXRlbShyb290LCBrZXkpOw0KKwlpZiAob2JqZWN0ID09IE5VTEwpIHsNCisJCXByaW50Zigia2V5OiAlcyBub3QgZmluZFxuIiwga2V5KTsNCisJCWNKU09OX0RlbGV0ZShyb290KTsNCisJCXJldHVybiBOVUxMOw0KKwl9DQorCS8vcHJpbnRmKCJrZXk6JXMtdmFsdWU6JXNcbiIsIGtleSwgb2JqZWN0LT52YWx1ZXN0cmluZyk7DQorCXZhbHVlX2xlbiA9IHN0cmxlbihvYmplY3QtPnZhbHVlc3RyaW5nKTsNCisNCisJdmFsdWVfc3RyID0gbWFsbG9jKHZhbHVlX2xlbiArIDEpOw0KKwlpZiAodmFsdWVfc3RyID09IE5VTEwpIHsNCisJCWNKU09OX0RlbGV0ZShyb290KTsNCisJCXJldHVybiBOVUxMOw0KKw0KKwl9DQorCW1lbXNldCh2YWx1ZV9zdHIsIDAsIHZhbHVlX2xlbiArIDEpOw0KKwlzdHJuY3B5KHZhbHVlX3N0ciwgb2JqZWN0LT52YWx1ZXN0cmluZywgdmFsdWVfbGVuKTsNCisNCisJY0pTT05fRGVsZXRlKHJvb3QpOw0KKwlyZXR1cm4gdmFsdWVfc3RyOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8vDQorLy/M4cihc3RyaW5nwODQzbXEYmFzZTY0yv2+3S0+ZGVjb2RlLT5oZXggc3RyaW5nDQorLy8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyBjaGFyICpscGFfcGFyc2VfanNvbl9kZWNvZGUoY2hhciAqc3JjU3RyLCBjaGFyICprZXkpDQorew0KKwljSlNPTiAqcm9vdCA9IE5VTEw7DQorCWNKU09OICpvYmplY3QgPSBOVUxMOw0KKwljaGFyICp2YWx1ZV9ieXRlID0gTlVMTDsNCisJY2hhciAqdmFsdWVfc3RyID0gTlVMTDsNCisJaW50IHZhbHVlX2xlbiA9IDA7DQorDQorCXJvb3QgPSBjSlNPTl9QYXJzZShzcmNTdHIpOw0KKwlpZiAocm9vdCA9PSBOVUxMKSB7DQorCQlwcmludGYoInJvb3QgPT0gTlVMTFxuIik7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlvYmplY3QgPSBjSlNPTl9HZXRPYmplY3RJdGVtKHJvb3QsIGtleSk7DQorCWlmIChvYmplY3QgPT0gTlVMTCkgew0KKwkJcHJpbnRmKCJrZXk6ICVzIG5vdCBmaW5kXG4iLCBrZXkpOw0KKwkJY0pTT05fRGVsZXRlKHJvb3QpOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisJDQorCS8vcHJpbnRmKCJrZXk6JXMtdmFsdWU6JXNcbiIsIGtleSwgb2JqZWN0LT52YWx1ZXN0cmluZyk7DQorCXZhbHVlX2J5dGUgPSBscGFfYmFzZTY0X2RlY29kZShvYmplY3QtPnZhbHVlc3RyaW5nLCBzdHJsZW4ob2JqZWN0LT52YWx1ZXN0cmluZyksICZ2YWx1ZV9sZW4pOw0KKwlpZiAodmFsdWVfYnl0ZSA9PSBOVUxMKSB7DQorCQlwcmludGYoImxwYV9iYXNlNjRfZGVjb2RlIGZhaWxcbiIpOw0KKwkJY0pTT05fRGVsZXRlKHJvb3QpOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJdmFsdWVfc3RyID0gbWFsbG9jKHZhbHVlX2xlbioyICsgMSk7DQorCWlmICh2YWx1ZV9zdHIgPT0gTlVMTCkgew0KKwkJZnJlZSh2YWx1ZV9ieXRlKTsNCisJCWNKU09OX0RlbGV0ZShyb290KTsNCisJCXJldHVybiBOVUxMOw0KKw0KKwl9DQorCQ0KKwltZW1zZXQodmFsdWVfc3RyLCAwLCB2YWx1ZV9sZW4qMiArIDEpOw0KKwlieXRlczJzdHJpbmcodmFsdWVfYnl0ZSwgdmFsdWVfc3RyLCB2YWx1ZV9sZW4pOw0KKwkqKHZhbHVlX3N0ciArIHZhbHVlX2xlbioyKSA9ICdcMCc7DQorCS8vcHJpbnRmKCJrZXk6JXMoJWQpLWhleDolc1xuIiwga2V5LCB2YWx1ZV9sZW4qMiwgdmFsdWVfc3RyKTsNCisJZnJlZSh2YWx1ZV9ieXRlKTsNCisJY0pTT05fRGVsZXRlKHJvb3QpOw0KKwlyZXR1cm4gdmFsdWVfc3RyOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8vDQorLy9jaGFyIHNyY1N0cltdID0gDQorLy8ieyINCisvLwkiXCJoZWFkZXJcIiA6IHsiDQorLy8JCSJcImZ1bmN0aW9uRXhlY3V0aW9uU3RhdHVzXCIgOiB7Ig0KKy8vCQkJIlwic3RhdHVzXCIgOiBcIkV4ZWN1dGVkLVN1Y2Nlc3NcIiINCisvLwkJIn0iDQorLy8JIn0sIg0KKy8vCSJcInNlcnZlclNpZ25lZDFcIjogXCJNRUtBRUFLMyttRjVHVXJybCtCbElVY3VqdFNCRUZLNHU5MVdULzlHYlFYKzZwWC9hb0NEQ21WemFXMHVkMjh1WTI2RUVFWVJ1VFl6ZWthOWlTeVcrZ1NGRjQ0PVwiLCINCisvLyAgICAiXCJ0cmFuc2FjdGlvbklkXCI6IFwiMDJCN0ZBNjE3OTE5NEFFQjk3RTA2NTIxNDcyRThFRDRcIiwiDQorLy8gICAgIlwic2VydmVyU2lnbmF0dXJlMVwiOiBcIlh6ZEE5SjZHNnR4UFRPZU9qUVRoYUgvdS9XeS9MT2NaWWVjOXJlQzY1Z2p2YTd3YWowWEZCczBrNTUxeW5vczFpekZVcFhiRjh2Y3RGdysvRW5xdTVhRFFUQT09XCIsIg0KKy8vICAgICJcInNlcnZlckNlcnRpZmljYXRlXCI6IFwiTUlJQzFqQ0NBbjJnQXdJQkFnSURBWWI2TUFvR0NDcUdTTTQ5QkFNQ01INHhDekFKQmdOVkJBWVRBa05PTVE0d0RBWURWUVFJREFWS1NVeEpUakVTTUJBR0ExVUVCd3dKUTBoQlRrZERTRlZPTVEwd0N3WURWUVFMREFSRFZVTkJNUXN3Q1FZRFZRUUtEQUpEVlRFdk1DMEdBMVVFQXd3bVEyaHBibUVnVlc1cFkyOXRJR1ZUU1UwZ1VtOXZkQ0JEUVNCT1NWTlVVQ0JDV2xSRlUxUXdIaGNOTVRreE1qSTFNVFV5TnpFeVdoY05NakF4TWpJME1UVXlOekV5V2pCNU1Rc3dDUVlEVlFRR0V3SkRUakVuTUNVR0ExVUVDd3dlU1c1dWIzWmhkR2wyWlNCQ2RYTnBibVZ6Y3lCRVpYQmhjblJ0Wlc1ME1RNHdEQVlEVlFRS0RBVldjMlZ1Y3pFeE1DOEdBMVVFQXd3b1ZXNXBZMjl0SUZaelpXNXpJRU52YlcxMWJtbGpZWFJwYjI0Z1EyOHVJRXgwWkNoVVpYTjBLVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCQzBCQW15cTd2b1d2aGV6ZlpuQW9ReVJiNUNndlBqRnVHcjdjNGFyRnNiQkZOWWN2N3c1QzNUcDN3SEQwM0hrSUloUHVacmt4OWtXTlllQnJla2ZCdzZqZ2U0d2dlc3dId1lEVlIwakJCZ3dGb0FVZkE1VWNCUStxSm1PMmQ4d0JYVEpMbHFheXg4d0hRWURWUjBPQkJZRUZDMitVSmhnNUc5Lyt6bEkzbXFmN1lNclpIUE1NQTRHQTFVZER3RUIvd1FFQXdJSGdEQVhCZ05WSFNBQkFmOEVEVEFMTUFrR0IyZUJFZ0VDQVFRd0ZRWURWUjBSQkE0d0RJZ0tLd1lCQkFHQzlVWUNCREJwQmdOVkhSOEVZakJnTUM2Z0xLQXFoaWhvZEhSd09pOHZZM0pzTG5WdWFTMWpZUzVqYjIwdVkyNHZaRzkzYm14dllXUXZiakV1WTNKc01DNmdMS0FxaGlob2RIUndPaTh2WTNKc0xuVnVhUzFqWVM1amIyMHVZMjR2Wkc5M2JteHZZV1F2YmpJdVkzSnNNQW9HQ0NxR1NNNDlCQU1DQTBjQU1FUUNJQkVBWmZnOWhKSWF4L3hScFZJQWpqbUVOclByN3E5N0UwSHYycys4YU9QREFpQmFVUkt1eHh6WjgvUDBES0U3U21XK0FoYnhCbDFUUWQwOXNNNitQbHp1OUE9PVwiLCINCisvLyAgICAiXCJldWljY0NpUEtJZFRvQmVVc2VkXCI6IFwiQkJSOERsUndGRDZvbVk3WjN6QUZkTWt1V3ByTEh3PT1cIiINCisvLyJ9IjsNCisvLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorc3RhdGljIGNoYXIgKmxwYV9wYXJzZV9pbml0YXV0aF9yZXNwKGNoYXIgKnNyY1N0cikNCit7DQorCWNoYXIgKnRyYW5zaWQgPSBOVUxMOw0KKwljaGFyICpzaWduZWRfaGV4ID0gTlVMTDsNCisJY2hhciAqc2lnbmF0dXJlX2hleCA9IE5VTEw7DQorCWNoYXIgKmNpUEtJZF9oZXggPSBOVUxMOw0KKwljaGFyICpjZXJ0aWZpY2F0ZV9oZXggPSBOVUxMOw0KKwkNCisJY2hhciAqYXV0aHNlcl9hcGR1ID0gTlVMTDsNCisJLy8xIHRyYW5zaWQNCisJLy8yIGdldCBzaWcuLi4NCisJLy8zIGdlbmFuZXIgYXQgYW5kIHNlbmQNCisNCisJdHJhbnNpZCA9IGxwYV9wYXJzZV9qc29uX3N0cihzcmNTdHIsICJ0cmFuc2FjdGlvbklkIik7DQorCWlmICh0cmFuc2lkID09IE5VTEwpDQorCQlnb3RvIHBhcnNlX0VORDsNCisJc25wcmludGYoZ190cmFuc2lkLCBzaXplb2YoZ190cmFuc2lkKSwgIiVzIiwgdHJhbnNpZCk7DQorCQ0KKwkNCisJc2lnbmVkX2hleCA9IGxwYV9wYXJzZV9qc29uX2RlY29kZShzcmNTdHIsICJzZXJ2ZXJTaWduZWQxIik7DQorCWlmIChzaWduZWRfaGV4ID09IE5VTEwpDQorCQlnb3RvIHBhcnNlX0VORDsNCisNCisJc2lnbmF0dXJlX2hleCA9IGxwYV9wYXJzZV9qc29uX2RlY29kZShzcmNTdHIsICJzZXJ2ZXJTaWduYXR1cmUxIik7DQorCWlmIChzaWduYXR1cmVfaGV4ID09IE5VTEwpDQorCQlnb3RvIHBhcnNlX0VORDsNCisNCisJY2lQS0lkX2hleCA9IGxwYV9wYXJzZV9qc29uX2RlY29kZShzcmNTdHIsICJldWljY0NpUEtJZFRvQmVVc2VkIik7DQorCWlmIChjaVBLSWRfaGV4ID09IE5VTEwpDQorCQlnb3RvIHBhcnNlX0VORDsNCisNCisJY2VydGlmaWNhdGVfaGV4ID0gbHBhX3BhcnNlX2pzb25fZGVjb2RlKHNyY1N0ciwgInNlcnZlckNlcnRpZmljYXRlIik7DQorCWlmIChjZXJ0aWZpY2F0ZV9oZXggPT0gTlVMTCkNCisJCWdvdG8gcGFyc2VfRU5EOw0KKw0KKy8v1+6689K7ts7Kx8m2o79jdHhwYXJhbXMNCisvLzgwRTI5MTAzo785MbHtyr699tK7ts678tXf1+6689K7ts4NCisvL9fu1+6687XEMDCyu8vj1NqzpLbIxNoNCisvLwk4MEUyMTEwMEZGQkYzOCgwMCA9IGksIGZmID1sZW4pDQorLy8JZmbWrrrz1+6zpLbgydnP37K7udwNCisvLwnPyMvjYmYzOLrz1+6zpLbgydmjrL2rYmYzOLrzyv2+3c/I1+m6w6Os1Nm80w0KKy8vCTgwRTIxMTBpTEzAtLfWuO5hdA0KKy8vCbKi1NrX7rrz0ru2zs/Ct6K687bByM/WpLf+zvHG97XEss7K/WF0DQorDQorICAgIC8vbWF0Y2hpbmdJZLTTvKS77sLr1tDIoaOsxL/HsMO708MNCisJYXV0aHNlcl9hcGR1ID0gQXV0aGVudGljYXRlU2VydmVyKHNpZ25lZF9oZXgsIHNpZ25hdHVyZV9oZXgsIGNpUEtJZF9oZXgsIGNlcnRpZmljYXRlX2hleCwgIiIsIGdfaW1laSk7DQorDQorDQorcGFyc2VfRU5EOg0KKwlpZiAodHJhbnNpZCAhPSBOVUxMKQ0KKwkJZnJlZSh0cmFuc2lkKTsNCisJaWYgKHNpZ25lZF9oZXggIT0gTlVMTCkNCisJCWZyZWUoc2lnbmVkX2hleCk7DQorCWlmIChzaWduYXR1cmVfaGV4ICE9IE5VTEwpDQorCQlmcmVlKHNpZ25hdHVyZV9oZXgpOw0KKwlpZiAoY2lQS0lkX2hleCAhPSBOVUxMKQ0KKwkJZnJlZShjaVBLSWRfaGV4KTsNCisJaWYgKGNlcnRpZmljYXRlX2hleCAhPSBOVUxMKQ0KKwkJZnJlZShjZXJ0aWZpY2F0ZV9oZXgpOw0KKw0KKwlyZXR1cm4gYXV0aHNlcl9hcGR1Ow0KK30NCisNCitzdGF0aWMgY2hhciAqbHBhX3BhcnNlX2F1dGhjbGlfcmVzcChjaGFyICpzcmNTdHIpDQorew0KKwljaGFyICp0cmFuc2lkID0gTlVMTDsNCisJY2hhciAqc2lnbmVkMl9oZXggPSBOVUxMOw0KKwljaGFyICpzaWduYXR1cmUyX2hleCA9IE5VTEw7DQorCWNoYXIgKmNlcnRpX2hleCA9IE5VTEw7DQorCS8vY2hhciAqbWV0YV9oZXggPSBOVUxMOw0KKwkNCisJY2hhciAqcHJlZGxfYXBkdSA9IE5VTEw7DQorDQorCXRyYW5zaWQgPSBscGFfcGFyc2VfanNvbl9zdHIoc3JjU3RyLCAidHJhbnNhY3Rpb25JZCIpOw0KKwlpZiAodHJhbnNpZCA9PSBOVUxMKQ0KKwkJZ290byBwYXJzZV9FTkQ7DQorCXNucHJpbnRmKGdfdHJhbnNpZCwgc2l6ZW9mKGdfdHJhbnNpZCksICIlcyIsIHRyYW5zaWQpOw0KKwkNCisJDQorCXNpZ25lZDJfaGV4ID0gbHBhX3BhcnNlX2pzb25fZGVjb2RlKHNyY1N0ciwgInNtZHBTaWduZWQyIik7DQorCWlmIChzaWduZWQyX2hleCA9PSBOVUxMKQ0KKwkJZ290byBwYXJzZV9FTkQ7DQorDQorCXNpZ25hdHVyZTJfaGV4ID0gbHBhX3BhcnNlX2pzb25fZGVjb2RlKHNyY1N0ciwgInNtZHBTaWduYXR1cmUyIik7DQorCWlmIChzaWduYXR1cmUyX2hleCA9PSBOVUxMKQ0KKwkJZ290byBwYXJzZV9FTkQ7DQorDQorCWNlcnRpX2hleCA9IGxwYV9wYXJzZV9qc29uX2RlY29kZShzcmNTdHIsICJzbWRwQ2VydGlmaWNhdGUiKTsNCisJaWYgKGNlcnRpX2hleCA9PSBOVUxMKQ0KKwkJZ290byBwYXJzZV9FTkQ7DQorDQorCS8vbWV0YV9oZXggPSBscGFfcGFyc2VfanNvbl9kZWNvZGUoc3JjU3RyLCAicHJvZmlsZU1ldGFkYXRhIik7DQorCS8vaWYgKG1ldGFfaGV4ID09IE5VTEwpDQorCS8vCWdvdG8gcGFyc2VfRU5EOw0KKw0KKwlwcmVkbF9hcGR1ID0gUHJlcGFyZURvd25sb2FkKHRyYW5zaWQsIHNpZ25lZDJfaGV4LCBzaWduYXR1cmUyX2hleCwgY2VydGlfaGV4LCAiIik7DQorDQorcGFyc2VfRU5EOg0KKwlpZiAodHJhbnNpZCAhPSBOVUxMKQ0KKwkJZnJlZSh0cmFuc2lkKTsNCisJaWYgKHNpZ25lZDJfaGV4ICE9IE5VTEwpDQorCQlmcmVlKHNpZ25lZDJfaGV4KTsNCisJaWYgKHNpZ25hdHVyZTJfaGV4ICE9IE5VTEwpDQorCQlmcmVlKHNpZ25hdHVyZTJfaGV4KTsNCisJaWYgKGNlcnRpX2hleCAhPSBOVUxMKQ0KKwkJZnJlZShjZXJ0aV9oZXgpOw0KKwkvL2lmIChtZXRhX2hleCAhPSBOVUxMKQ0KKwkvLwlmcmVlKG1ldGFfaGV4KTsNCisNCisJcmV0dXJuIHByZWRsX2FwZHU7DQorfQ0KKw0KK3N0YXRpYyBjaGFyICpscGFfcGFyc2VfZ2V0YnBwX3Jlc3AoY2hhciAqc3JjU3RyKQ0KK3sNCisJY2hhciAqdHJhbnNpZCA9IE5VTEw7DQorCWNoYXIgKmJwcF9iNjQgPSBOVUxMOw0KKwkNCisJY2hhciAqbm90aWZ5X2FwZHUgPSBOVUxMOw0KKw0KKwl0cmFuc2lkID0gbHBhX3BhcnNlX2pzb25fc3RyKHNyY1N0ciwgInRyYW5zYWN0aW9uSWQiKTsNCisJaWYgKHRyYW5zaWQgPT0gTlVMTCkNCisJCWdvdG8gcGFyc2VfRU5EOw0KKwlzbnByaW50ZihnX3RyYW5zaWQsIHNpemVvZihnX3RyYW5zaWQpLCAiJXMiLCB0cmFuc2lkKTsNCisJDQorCQ0KKwlicHBfYjY0ID0gbHBhX3BhcnNlX2pzb25fc3RyKHNyY1N0ciwgImJvdW5kUHJvZmlsZVBhY2thZ2UiKTsNCisJaWYgKGJwcF9iNjQgPT0gTlVMTCkNCisJCWdvdG8gcGFyc2VfRU5EOw0KKw0KKwlub3RpZnlfYXBkdSA9IExvYWRCb3VuZFByb2ZpbGVQYWNrYWdlKGJwcF9iNjQpOw0KKw0KK3BhcnNlX0VORDoNCisJaWYgKHRyYW5zaWQgIT0gTlVMTCkNCisJCWZyZWUodHJhbnNpZCk7DQorCWlmIChicHBfYjY0ICE9IE5VTEwpDQorCQlmcmVlKGJwcF9iNjQpOw0KKw0KKwlyZXR1cm4gbm90aWZ5X2FwZHU7DQorfQ0KKw0KKw0KKy8vt7W72Gpzb27K/b7duPjPwtK7sr2199PDDQorc3RhdGljIGNoYXIgKmxwYV9pbml0YXV0aCh2b2lkKQ0KK3sNCisJaW50IHJldCA9IC0xOw0KKwljaGFyICpldWljY0NoYWxsZW5nZSA9IE5VTEw7DQorCWNoYXIgKmV1aWNjSW5mbzEgPSBOVUxMOw0KKwljaGFyICppYV9qc29uID0gTlVMTDsNCisJY2hhciAqaHR0cHNfcmVzcCA9IE5VTEw7DQorCWNoYXIgKnJlc3BfYXBkdSA9IE5VTEw7DQorDQorCWV1aWNjQ2hhbGxlbmdlID0gR2V0RVVJQ0NDaGFsbGVuZ2UoKTsNCisJaWYgKGV1aWNjQ2hhbGxlbmdlID09IE5VTEwpIHsNCisJCXJldHVybiBOVUxMOw0KKwl9DQorCQ0KKwlldWljY0luZm8xID0gR2V0RVVJQ0NJbmZvKFRSVUUpOw0KKwlpZiAoZXVpY2NJbmZvMSA9PSBOVUxMKSB7DQorCQlmcmVlKGV1aWNjQ2hhbGxlbmdlKTsNCisJCXJldHVybiBOVUxMOw0KKwl9DQorCQ0KKwlpYV9qc29uID0gSW5pdGlhdGVBdXRoZW50aWNhdGlvbihldWljY0NoYWxsZW5nZSwgZXVpY2NJbmZvMSwgZ19odHRwc19jdC5ob3N0KTsNCisJaWYgKGlhX2pzb24gPT0gTlVMTCkgew0KKwkJZnJlZShldWljY0NoYWxsZW5nZSk7DQorCQlmcmVlKGV1aWNjSW5mbzEpOw0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJaHR0cHNfcmVzcCA9IGxwYV9zbWRwX3Nlc3Npb24oImluaXRpYXRlQXV0aGVudGljYXRpb24iLCBpYV9qc29uLCAmcmV0KTsNCisJaWYgKGh0dHBzX3Jlc3AgIT0gTlVMTCkgew0KKwkJcmVzcF9hcGR1ID0gbHBhX3BhcnNlX2luaXRhdXRoX3Jlc3AoaHR0cHNfcmVzcCk7DQorCQlmcmVlKGh0dHBzX3Jlc3ApOw0KKwl9DQorCQ0KKwlmcmVlKGV1aWNjQ2hhbGxlbmdlKTsNCisJZnJlZShldWljY0luZm8xKTsNCisJZnJlZShpYV9qc29uKTsNCisJcmV0dXJuIHJlc3BfYXBkdTsNCit9DQorDQorc3RhdGljIGNoYXIgKmxwYV9hdXRoY2xpZW50KGNoYXIgKmFzX2FwZHUpDQorew0KKwlpbnQgcmV0ID0gLTE7DQorDQorCWNoYXIgKmFjX2pzb24gPSBOVUxMOw0KKwljaGFyICpodHRwc19yZXNwID0gTlVMTDsNCisJY2hhciAqcmVzcF9hcGR1ID0gTlVMTDsNCisNCisJYWNfanNvbiA9IEF1dGhlbnRpY2F0ZUNsaWVudChnX3RyYW5zaWQsIGFzX2FwZHUpOw0KKwlpZiAoYWNfanNvbiA9PSBOVUxMKSB7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKwkNCisJaHR0cHNfcmVzcCA9IGxwYV9zbWRwX3Nlc3Npb24oImF1dGhlbnRpY2F0ZUNsaWVudCIsIGFjX2pzb24sICZyZXQpOw0KKwlpZiAoaHR0cHNfcmVzcCAhPSBOVUxMKSB7DQorCQlyZXNwX2FwZHUgPSBscGFfcGFyc2VfYXV0aGNsaV9yZXNwKGh0dHBzX3Jlc3ApOw0KKwkJZnJlZShodHRwc19yZXNwKTsNCisJfQ0KKw0KKwlmcmVlKGFjX2pzb24pOw0KKwlyZXR1cm4gcmVzcF9hcGR1Ow0KK30NCisNCitzdGF0aWMgY2hhciAqbHBhX2dldGJwcChjaGFyICpwZGxfYXBkdSkNCit7DQorCWludCByZXQgPSAtMTsNCisNCisJY2hhciAqYnBwX2pzb24gPSBOVUxMOw0KKwljaGFyICpodHRwc19yZXNwID0gTlVMTDsNCisJY2hhciAqcmVzcF9hcGR1ID0gTlVMTDsNCisNCisJYnBwX2pzb24gPSBHZXRCb3VuZFByb2ZpbGVQYWNrYWdlKGdfdHJhbnNpZCwgcGRsX2FwZHUpOw0KKwlpZiAoYnBwX2pzb24gPT0gTlVMTCkgew0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisJDQorCWh0dHBzX3Jlc3AgPSBscGFfc21kcF9zZXNzaW9uKCJnZXRCb3VuZFByb2ZpbGVQYWNrYWdlIiwgYnBwX2pzb24sICZyZXQpOw0KKwlpZiAocmV0ID4gMCkgew0KKwkJcmVzcF9hcGR1ID0gbHBhX3BhcnNlX2dldGJwcF9yZXNwKGh0dHBzX3Jlc3ApOw0KKwkJZnJlZShodHRwc19yZXNwKTsNCisJfQ0KKw0KKwlmcmVlKGJwcF9qc29uKTsNCisJcmV0dXJuIHJlc3BfYXBkdTsNCit9DQorDQorc3RhdGljIGludCBscGFfbm90aWZpY2F0aW9uKGNoYXIgKm5vdGlmeV9hcGR1KQ0KK3sNCisJaW50IHJldCA9IC0xOw0KKw0KKwljaGFyICpub3RpZnlfanNvbiA9IE5VTEw7DQorCWNoYXIgKmh0dHBzX3Jlc3AgPSBOVUxMOw0KKw0KKwlub3RpZnlfanNvbiA9IEhhbmRsZU5vdGlmaWNhdGlvbihub3RpZnlfYXBkdSk7DQorCWlmIChub3RpZnlfanNvbiA9PSBOVUxMKSB7DQorCQlyZXR1cm4gcmV0Ow0KKwl9DQorCWh0dHBzX3Jlc3AgPSBscGFfc21kcF9zZXNzaW9uKCJoYW5kbGVOb3RpZmljYXRpb24iLCBub3RpZnlfanNvbiwgJnJldCk7DQorCWlmIChodHRwc19yZXNwICE9IE5VTEwpDQorCQlmcmVlKGh0dHBzX3Jlc3ApOw0KKwkvL25vIHJlc3A/DQorCQ0KKwlmcmVlKG5vdGlmeV9qc29uKTsNCisJcmV0dXJuIHJldDsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvLw0KKy8vIjEkZXNpbS53by5jbiQkMS4zLjYuMS40LjEuNDc4MTQuMi40Ig0KKy8vDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitzdGF0aWMgY2hhciAqcGFyc2VfYWNjb2RlKGNoYXIgKmFjdGl2ZWNvZGUpDQorew0KKwljaGFyICpzYXZlID0gTlVMTDsNCisJY2hhciAqaG9zdCA9IE5VTEw7DQorCWNoYXIgKnRtcCA9IE5VTEw7DQorCXRtcCA9IHN0cnRva19yKGFjdGl2ZWNvZGUsICIkIiwgJnNhdmUpOw0KKwlpZiAodG1wID09IE5VTEwpDQorCQlyZXR1cm4gTlVMTDsNCisJdG1wID0gc3RydG9rX3IoTlVMTCwgIiQiLCAmc2F2ZSk7DQorCWlmICh0bXAgPT0gTlVMTCkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlob3N0ID0gbWFsbG9jKEFQRFVfUkVTUF9MRU4pOw0KKwlpZiAoaG9zdCA9PSBOVUxMKQ0KKwkJcmV0dXJuIE5VTEw7DQorCW1lbXNldChob3N0LCAwLCBBUERVX1JFU1BfTEVOKTsNCisJc3RybmNweShob3N0LCB0bXAsIEFQRFVfUkVTUF9MRU4tMSk7DQorCQ0KKwlwcmludGYoInNlcnZlcjolc1xuIiwgaG9zdCk7DQorCXJldHVybiBob3N0Ow0KK30NCisNCitzdGF0aWMgaW50IGRvd25sb2FkUHJvZmlsZShjaGFyICpzbWRwQWRkcmVzcykNCit7DQorCWludCByZXMgPSAtMTsNCisJY2hhciAqYXV0aHNlcl9hcGR1ID0gTlVMTDsvL2F1dGggc2VydmVyIGFwZHUNCisJY2hhciAqcHJlZGxfYXBkdSA9IE5VTEw7Ly9wcmVwYXJlIGRvd25sb2FkIGFwZHUNCisJY2hhciAqbm90aWZ5X2FwZHUgPSBOVUxMOy8vTm90aWZpY2F0aW9uIGFwZHUNCisJaW50IG5vdGlmeV9yZXMgPSAtMTsNCisJaW50IG5vdGlmeV9jaGVjayA9IC0xOw0KKwkvLzEgY3JlYXQgaHR0cHMNCisJLy8yIGdldCBhdXRoLCBzZW5kCQ0KKwkNCisJcmVzID0gbHBhX2Nvbm5lY3Rfc21kcChzbWRwQWRkcmVzcyk7DQorCWlmIChyZXMgIT0gMCkgew0KKwkJcmVzID0gLTI7DQorCQlnb3RvIGRvd25sb2FkX0VORDsNCisJfQ0KKw0KKwlhdXRoc2VyX2FwZHUgPSBscGFfaW5pdGF1dGgoKTsNCisJaWYgKGF1dGhzZXJfYXBkdSA9PSBOVUxMIHx8IHN0cmxlbihhdXRoc2VyX2FwZHUpID09IDApIHsNCisJCXJlcyA9IC0yOw0KKwkJZ290byBkb3dubG9hZF9FTkQ7DQorCX0NCisJDQorCXByZWRsX2FwZHUgPSBscGFfYXV0aGNsaWVudChhdXRoc2VyX2FwZHUpOw0KKwlpZiAocHJlZGxfYXBkdSA9PSBOVUxMIHx8IHN0cmxlbihwcmVkbF9hcGR1KSA9PSAwKSB7DQorCQlyZXMgPSAtMjsNCisJCWdvdG8gZG93bmxvYWRfRU5EOw0KKwl9DQorDQorCW5vdGlmeV9hcGR1ID0gbHBhX2dldGJwcChwcmVkbF9hcGR1KTsNCisJaWYgKG5vdGlmeV9hcGR1ID09IE5VTEwgfHwgc3RybGVuKG5vdGlmeV9hcGR1KSA9PSAwKSB7DQorCQlyZXMgPSAtMjsNCisJCWdvdG8gZG93bmxvYWRfRU5EOw0KKwl9DQorLy9kdGVzdA0KKyNpZiAxDQorCW5vdGlmeV9yZXMgPSBscGFfbm90aWZpY2F0aW9uKG5vdGlmeV9hcGR1KTsNCisJaWYgKG5vdGlmeV9yZXMgPT0gLTEpIHsNCisJCXByaW50ZigibHBhX25vdGlmaWNhdGlvbiBmYWlsXG4iKTsNCisJCS8vZ290byBkb3dubG9hZF9FTkQ7Ly9za2lwLCB1c2UgdXBkYXRhIHJlc3VsdA0KKwl9DQorI2VuZGlmDQorDQorCW5vdGlmeV9jaGVjayA9IGxwYV9wYXJzZV9pY2NpZF9hcGR1KG5vdGlmeV9hcGR1LCBjdXJlbnRfaWNjaWQsIHNpemVvZihjdXJlbnRfaWNjaWQpKTsNCisJaWYgKG5vdGlmeV9jaGVjayA9PSAtMSkNCisJCWdvdG8gZG93bmxvYWRfRU5EOw0KKw0KKw0KKwlyZXMgPSAwOw0KK2Rvd25sb2FkX0VORDoNCisJaWYgKGF1dGhzZXJfYXBkdSAhPSBOVUxMKQ0KKwkJZnJlZShhdXRoc2VyX2FwZHUpOw0KKwlpZiAocHJlZGxfYXBkdSAhPSBOVUxMKQ0KKwkJZnJlZShwcmVkbF9hcGR1KTsNCisJaWYgKG5vdGlmeV9hcGR1ICE9IE5VTEwpDQorCQlmcmVlKG5vdGlmeV9hcGR1KTsNCisNCisJbHBhX2Rpc2Nvbm5fc21kcChzbWRwQWRkcmVzcyk7DQorCXJldHVybiByZXM7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLy8NCisvL8rkyOu8pLvuwuu3vcq9z8LU2HByb2ZpbGUNCisvL8i3yM/C686008MgY29uZmlybWNvZGUgPSBOVUxMDQorLy8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK2ludCBkb3dubG9hZFByb2ZpbGVCeUFjKGNoYXIgKmFjdGl2ZWNvZGUsIGNoYXIgKmNvbmZpcm1jb2RlKQ0KK3sNCisJaW50IHJlcyA9IC0xOw0KKwljaGFyICpzbWRwQWRkcmVzcyA9IE5VTEw7DQorDQorCWNoYXIgZGxfcmV0cnlbNl0gPSB7MH07DQorCWludCBjb3VudCA9IDA7DQorCWludCBpID0gMDsNCisJCQ0KKwljZmdfZ2V0X2l0ZW0oImxwYV9kbF9yZXRyeSIsIGRsX3JldHJ5LCBzaXplb2YoZGxfcmV0cnkpKTsNCisJY291bnQgPSBhdG9pKGRsX3JldHJ5KTsNCisJcHJpbnRmKCJscGFfdXBkYXRhX3JldHJ5OiVzLCVkXG4iLCBkbF9yZXRyeSwgY291bnQpOw0KKwlpZiAoY291bnQgPD0gMCB8fCBjb3VudCA+IDEwKSB7IC8va3cgMw0KKwkJY291bnQgPSAxOw0KKwl9DQorCQ0KKwlzbWRwQWRkcmVzcyA9IHBhcnNlX2FjY29kZShhY3RpdmVjb2RlKTsNCisJaWYgKHNtZHBBZGRyZXNzID09IE5VTEwpDQorCQlyZXR1cm4gLTE7DQorDQorCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorCQlyZXMgPSBkb3dubG9hZFByb2ZpbGUoc21kcEFkZHJlc3MpOw0KKwkJaWYgKHJlcyA9PSAtMiAmJiBpIDwgY291bnQtMSkgew0KKwkJCS8vcmV0cnkNCisJCQlzbGVlcChTTURQX0RMX0lOVEVSVkFMKTsNCisJCQljb250aW51ZTsNCisJCX0NCisJCWJyZWFrOw0KKwl9DQorCQ0KKwlmcmVlKHNtZHBBZGRyZXNzKTsNCisJcmV0dXJuIHJlczsNCit9DQorDQorI2lmIDANCitpbnQgZG93bmxvYWRQcm9maWxlQnlFaWQodm9pZCkNCit7DQorCWludCByZXMgPSAtMTsNCisJY2hhciAqc21kcEFkZHJlc3MgPSAiZXNpbS53by5jbiI7Ly9nZXQgZnJvbSBkZWZhdWx0DQorDQorCXJlcyA9IGRvd25sb2FkUHJvZmlsZShzbWRwQWRkcmVzcyk7DQorDQorCXJldHVybiByZXM7DQorfQ0KKyNlbmRpZg0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLy8NCisvL8b008Nwcm9maWxlDQorLy9pbjogaWNjaWQgMjANCisvLw0KKy8vcGFyc2UgODAwMXh4IHJldHVybiB4eDoNCisvLzCjuk9LDQorLy8xo7ppY2NpZE9yQWlkTm90Rm91bmSjuw0KKy8vMqO6cHJvZmlsZU5vdEluRGlzYWJsZWRTdGF0ZaO7DQorLy8zo7pkaXNhbGxvd2VkQnlQb2xpY3mjuw0KKy8vNKO6d3JvbmdQcm9maWxlUmVlbmFibGluZ6O7DQorLy81o7pjYXRCdXN5o7sNCisvLzEyN6O6dW5kZWZpbmVkRXJyb3INCisvL8bk0+C3tbvY1rWyzr+8Ni4xML3aDQorLy8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK2ludCBlbmFibGVQcm9maWxlKGNoYXIgKmljY2lkKQ0KK3sNCisgICAgY2hhciAqYXBkdSA9IE5VTEw7DQorCWludCByZXMgPSAxMjc7DQorCWFwZHUgPSBFbmFibGVQcm9maWxlKGljY2lkKTsNCisJaWYgKGFwZHUgPT0gTlVMTCkNCisJCXJldHVybiAxMjc7DQorCWVycm5vID0gMDsNCisJcmVzID0gc3RydG9sKGFwZHUsIE5VTEwsIDE2KTsNCisJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRA0KKwl7DQorCQlwcmludGYoInN0cnRvbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKwl9DQorCWZyZWUoYXBkdSk7DQorCXJldHVybiByZXM7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLy8NCisvL73708Nwcm9maWxlDQorLy8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK2ludCBkaXNhYmxlUHJvZmlsZShjaGFyICogaWNjaWQpDQorew0KKwljaGFyICphcGR1ID0gTlVMTDsNCisJaW50IHJlcyA9IDEyNzsNCisJYXBkdSA9IERpc2FibGVQcm9maWxlKGljY2lkKTsNCisJaWYgKGFwZHUgPT0gTlVMTCkNCisJCXJldHVybiAxMjc7DQorCWVycm5vID0gMDsNCisJcmVzID0gc3RydG9sKGFwZHUsIE5VTEwsIDE2KTsNCisJaWYgKGVycm5vID09IEVSQU5HRSkvLyBrdyBFUlJOTy5OT1RfQ0hFQ0tFRA0KKwl7DQorCQlwcmludGYoInN0cnRvbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKwl9DQorCWZyZWUoYXBkdSk7DQorCXJldHVybiByZXM7DQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLy8NCisvL8m+s/1wcm9maWxlDQorLy8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK2ludCBkZWxldGVQcm9maWxlKGNoYXIgKiBpY2NpZCkNCit7DQorCWNoYXIgKmFwZHUgPSBOVUxMOw0KKwlpbnQgcmVzID0gMTI3Ow0KKwlhcGR1ID0gRGVsZXRlUHJvZmlsZShpY2NpZCk7DQorCWlmIChhcGR1ID09IE5VTEwpDQorCQlyZXR1cm4gMTI3Ow0KKwllcnJubyA9IDA7DQorCXJlcyA9IHN0cnRvbChhcGR1LCBOVUxMLCAxNik7DQorCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQNCisJew0KKwkJcHJpbnRmKCJzdHJ0b2wgZXJybm8gJWQ6ICVzXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsNCisJfQ0KKwlmcmVlKGFwZHUpOw0KKwlyZXR1cm4gcmVzOw0KK30NCisNCisNCitpbnQgbWVtb3J5UmVzZXQodm9pZCkNCit7DQorCWNoYXIgKmFwZHUgPSBOVUxMOw0KKwlpbnQgcmVzID0gMTI3Ow0KKwlhcGR1ID0gRVVJQ0NNZW1vcnlSZXNldCgpOw0KKwlpZiAoYXBkdSA9PSBOVUxMKQ0KKwkJcmV0dXJuIDEyNzsNCisJZXJybm8gPSAwOw0KKwlyZXMgPSBzdHJ0b2woYXBkdSwgTlVMTCwgMTYpOw0KKwlpZiAoZXJybm8gPT0gRVJBTkdFKS8vIGt3IEVSUk5PLk5PVF9DSEVDS0VEDQorCXsNCisJCXByaW50Zigic3RydG9sIGVycm5vICVkOiAlc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7DQorCX0NCisJZnJlZShhcGR1KTsNCisJcmV0dXJuIHJlczsNCit9DQorDQorLy9saW1pdCAxMA0KK3N0YXRpYyBjaGFyICpsYXBfcGFyc2VfcHJvZmlsZV9saXN0KGNoYXIgKnBkdSwgaW50ICpsaXN0X24pDQorew0KKwljaGFyICpqc19saXN0ID0gTlVMTDsNCisNCisJY2hhciAqcHJvZmlsZSA9IE5VTEw7DQorCWNoYXIgKmljY2lkID0gTlVMTDsNCisJY2hhciAqc3RhdGUgPSBOVUxMOw0KKwlpbnQgc3RhdHVzID0gMDsNCisJaW50IGkgPSAwOw0KKwljaGFyICp0bXBfcGR1ID0gcGR1Ow0KKwljaGFyICpvZmZzZXQgPSBOVUxMOw0KKw0KKwlqc19saXN0ID0gbWFsbG9jKEFQRFVfUkVTUF9MRU4pOw0KKwlpZiAoanNfbGlzdCA9PSBOVUxMKQ0KKwkJcmV0dXJuIE5VTEw7DQorCW1lbXNldChqc19saXN0LCAwLCBBUERVX1JFU1BfTEVOKTsNCisNCisJd2hpbGUoaSA8IDEwICYmIHN0cmxlbih0bXBfcGR1KSA+IDApIHsNCisJCXByb2ZpbGUgPSBscGFfdGFnX2FwZHVfZnJvbV9hdHJlc3AodG1wX3BkdSwgMHhFMyk7DQorCQlpZiAocHJvZmlsZSA9PSBOVUxMKQ0KKwkJCWJyZWFrOw0KKwkJDQorCQlpY2NpZCA9IGxwYV90YWdfYXBkdV9mcm9tX2F0cmVzcCh0bXBfcGR1LCAweDVBKTsNCisJCWlmIChpY2NpZCA9PSBOVUxMKSB7DQorCQkJZnJlZShwcm9maWxlKTsNCisJCQlicmVhazsNCisJCX0NCisJCWxwYV90cmFuc19pY2NpZChpY2NpZCwgc3RybGVuKGljY2lkKSk7DQorCQkNCisJCXN0YXRlID0gbHBhX3RhZ19hcGR1X2Zyb21fYXRyZXNwKHRtcF9wZHUsIDB4OUY3MCk7DQorCQlpZiAoc3RhdGUgPT0gTlVMTCkgew0KKwkJCWZyZWUocHJvZmlsZSk7DQorCQkJZnJlZShpY2NpZCk7DQorCQkJYnJlYWs7DQorCQl9DQorCQllcnJubyA9IDA7DQorCQlzdGF0dXMgPSBzdHJ0b2woc3RhdGUsIE5VTEwsIDE2KTsNCisJCWlmIChlcnJubyA9PSBFUkFOR0UpLy8ga3cgRVJSTk8uTk9UX0NIRUNLRUQNCisJCXsNCisJCQlwcmludGYoInN0cnRvbCBlcnJubyAlZDogJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOw0KKwkJfQ0KKwkJaWYgKGkgPT0gMCkgew0KKwkJCXNucHJpbnRmKGpzX2xpc3QsIEFQRFVfUkVTUF9MRU4sIA0KKwkJCQkie1wiSUNDSURcIjpcIiVzXCIsXCJTVEFUVVNcIjolZH0iLCBpY2NpZCwgc3RhdHVzKTsNCisJCX0NCisJCWVsc2Ugew0KKwkJCXNucHJpbnRmKGpzX2xpc3QgKyBzdHJsZW4oanNfbGlzdCksIEFQRFVfUkVTUF9MRU4gLSBzdHJsZW4oanNfbGlzdCksIA0KKwkJCQkiLHtcIklDQ0lEXCI6XCIlc1wiLFwiU1RBVFVTXCI6JWR9IiwgaWNjaWQsIHN0YXR1cyk7DQorCQl9DQorCQkNCisJCW9mZnNldCA9IHN0cnN0cih0bXBfcGR1LCBwcm9maWxlKTsNCisJCWlmIChvZmZzZXQgPT0gTlVMTCkgew0KKwkJCWZyZWUocHJvZmlsZSk7DQorCQkJZnJlZShpY2NpZCk7DQorCQkJZnJlZShzdGF0ZSk7DQorCQkJYnJlYWs7DQorCQl9DQorCQl0bXBfcGR1ID0gb2Zmc2V0ICsgc3RybGVuKHByb2ZpbGUpOw0KKwkJZnJlZShwcm9maWxlKTsNCisJCWZyZWUoaWNjaWQpOw0KKwkJZnJlZShzdGF0ZSk7DQorCQlpKys7DQorDQorCX0NCisJKmxpc3RfbiA9IGk7DQorCXJldHVybiBqc19saXN0Ow0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKy8vDQorLy+3tbvYuPbK/aOsus1qc29uIGFycmF5W2ljY2lkLCBzdGF0ZV0NCisvLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoraW50IGdldFByb2ZpbGVMaXN0KGNoYXIgKippbmZvKQ0KK3sNCisgICAgY2hhciAqYXBkdSA9IE5VTEw7DQorCWludCBwcm9mX251bSA9IDA7DQorCQ0KKwlhcGR1ID0gR2V0UHJvZmlsZXNJbmZvKE5VTEwpOw0KKwlpZiAoYXBkdSA9PSBOVUxMKQ0KKwkJcmV0dXJuIHByb2ZfbnVtOw0KKw0KKwkNCisJKmluZm8gPSBsYXBfcGFyc2VfcHJvZmlsZV9saXN0KGFwZHUsICZwcm9mX251bSk7DQorDQorCQ0KKwlmcmVlKGFwZHUpOw0KKwlyZXR1cm4gcHJvZl9udW07DQorfQ0KKw0K