ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJzb2Z0YXAvbmV0YXBpLmMgYi9hcC9saWIvbGlic29mdGFwL25ldGFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyYzA1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGlic29mdGFwL25ldGFwaS5jCkBAIC0wLDAgKzEsNjM3IEBACisvKioKKyAqIEBmaWxlIE5ldGFwaS5jCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgU2FuZWNoaXBzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFNhbmVjaGlwcyBUZWNobm9sb2d5IENvLiwgTHRkLgorICogQGF1dGhvciBsaW54dSBHZWJpbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN5cy9rbG9nLmg+CisjaW5jbHVkZSA8c3lzL21zZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgInNvZnRhcF9hcGkuaCIKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiDN+MLnvdO/2iAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvL7j5vt3N+MLnyeixuMP7u/HIobbU06a1xMnosbhJRCywtNXV08XPyLy20+tOVtbQtcTJ6LG4w/u9+NDQxqXF5KOsyqew3Le1u9gtMQoraW50IGdldERldklkX2J5bmFtZShjaGFyICpkZXZfbmFtZSkKK3sKKwljaGFyIHBzX3dhbltORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBwc2V4dF93YW4xW05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHBzZXh0X3dhbjJbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgcHNleHRfd2FuM1tORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBwc2V4dF93YW40W05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHBzZXh0X3dhbjVbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgcHNleHRfd2FuNltORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBwc2V4dF93YW43W05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHBzZXh0X3dhbjhbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgc3d3YW5zdHJbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgc3dsYW5zdHJbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgZXRoX3dhbltORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciB3aWZpX3dhbltORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBldGhfbGFuW05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHdpZmlfbGFuW05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHVzYl9sYW5bTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgc3dfbmFtZVtOVl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBsYW5fZW5hYmxlW05WX05BTUVfTEVOXSA9IHswfTsKKwlwcmludGYoIm5ldGFwaTpnZXREZXZJZF9ieW5hbWUgc3RhcnQhZGV2X25hbWU9JXNcbiIsIGRldl9uYW1lKTsKKworCS8vyLHKoc3izfi/2s6qv9XKsbry0rK4+Nb3v9i3os/7z6KjrGFkZCBieSB6cG0gMjAxNjA2MjggYmVnaW4KKwlpZiAoc3RybGVuKGRldl9uYW1lKSA9PSAwKSB7CisJCXJldHVybiBOT19ERVY7CisJfQorCS8vyLHKoc3izfi/2s6qv9XKsbry0rK4+Nb3v9i3os/7z6KjrGFkZCBieSB6cG0gMjAxNjA2MjggZW5kCisKKwlzY19jZmdfZ2V0KCJwc3dhbiIsIHBzX3dhbiwgc2l6ZW9mKHBzX3dhbikpOworCXNjX2NmZ19nZXQoInBzX2V4dDEiLCBwc2V4dF93YW4xLCBzaXplb2YocHNleHRfd2FuMSkpOworCXNjX2NmZ19nZXQoInBzX2V4dDIiLCBwc2V4dF93YW4yLCBzaXplb2YocHNleHRfd2FuMikpOworCXNjX2NmZ19nZXQoInBzX2V4dDMiLCBwc2V4dF93YW4zLCBzaXplb2YocHNleHRfd2FuMykpOworCXNjX2NmZ19nZXQoInBzX2V4dDQiLCBwc2V4dF93YW40LCBzaXplb2YocHNleHRfd2FuNCkpOworCXNjX2NmZ19nZXQoInBzX2V4dDUiLCBwc2V4dF93YW41LCBzaXplb2YocHNleHRfd2FuMSkpOworCXNjX2NmZ19nZXQoInBzX2V4dDYiLCBwc2V4dF93YW42LCBzaXplb2YocHNleHRfd2FuMikpOworCXNjX2NmZ19nZXQoInBzX2V4dDciLCBwc2V4dF93YW43LCBzaXplb2YocHNleHRfd2FuMykpOworCXNjX2NmZ19nZXQoInBzX2V4dDgiLCBwc2V4dF93YW44LCBzaXplb2YocHNleHRfd2FuNCkpOworCXNjX2NmZ19nZXQoIndpZml3YW4iLCB3aWZpX3dhbiwgc2l6ZW9mKHdpZmlfd2FuKSk7CisJc2NfY2ZnX2dldCgic3d3YW5zdHIiLCBzd3dhbnN0ciwgc2l6ZW9mKHN3d2Fuc3RyKSk7CisJc2NfY2ZnX2dldCgic3dsYW5zdHIiLCBzd2xhbnN0ciwgc2l6ZW9mKHN3bGFuc3RyKSk7CisJc2NfY2ZnX2dldCgiZXRod2FuIiwgZXRoX3dhbiwgc2l6ZW9mKGV0aF93YW4pKTsKKwlzY19jZmdfZ2V0KCJldGhsYW4iLCBldGhfbGFuLCBzaXplb2YoZXRoX2xhbikpOworCXNjX2NmZ19nZXQoIndpZmlsYW4iLCB3aWZpX2xhbiwgc2l6ZW9mKHdpZmlfbGFuKSk7CisJc2NfY2ZnX2dldCgidXNibGFuIiwgdXNiX2xhbiwgc2l6ZW9mKHVzYl9sYW4pKTsKKwlzY19jZmdfZ2V0KCJzdyIsIHN3X25hbWUsIHNpemVvZihzd19uYW1lKSk7CisJc2NfY2ZnX2dldCgiTGFuRW5hYmxlIiwgbGFuX2VuYWJsZSwgc2l6ZW9mKGxhbl9lbmFibGUpKTsKKworCWlmICghc3RybmNtcChkZXZfbmFtZSwgcHNfd2FuLCBzdHJsZW4oZGV2X25hbWUpKSkKKwkJcmV0dXJuIFBTX05FVF9ERVY7CisJaWYgKCgwICE9IHN0cmNtcChsYW5fZW5hYmxlLCAiMCIpKSAmJiAhc3RybmNtcChkZXZfbmFtZSwgdXNiX2xhbiwgc3RybGVuKGRldl9uYW1lKSkpCisJCXJldHVybiBVU0JfTEFOX0RFVjsKKwlpZiAoIXN0cm5jbXAoZGV2X25hbWUsIHBzZXh0X3dhbjEsIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gUFNfRVhUX0RFVjE7CisJaWYgKCFzdHJuY21wKGRldl9uYW1lLCBwc2V4dF93YW4yLCBzdHJsZW4oZGV2X25hbWUpKSkKKwkJcmV0dXJuIFBTX0VYVF9ERVYyOworCWlmICghc3RybmNtcChkZXZfbmFtZSwgcHNleHRfd2FuMywgc3RybGVuKGRldl9uYW1lKSkpCisJCXJldHVybiBQU19FWFRfREVWMzsKKwlpZiAoIXN0cm5jbXAoZGV2X25hbWUsIHBzZXh0X3dhbjQsIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gUFNfRVhUX0RFVjQ7CisJaWYgKCFzdHJuY21wKGRldl9uYW1lLCBwc2V4dF93YW41LCBzdHJsZW4oZGV2X25hbWUpKSkKKwkJcmV0dXJuIFBTX0VYVF9ERVY1OworCWlmICghc3RybmNtcChkZXZfbmFtZSwgcHNleHRfd2FuNiwgc3RybGVuKGRldl9uYW1lKSkpCisJCXJldHVybiBQU19FWFRfREVWNjsKKwlpZiAoIXN0cm5jbXAoZGV2X25hbWUsIHBzZXh0X3dhbjcsIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gUFNfRVhUX0RFVjc7CisJaWYgKCFzdHJuY21wKGRldl9uYW1lLCBwc2V4dF93YW44LCBzdHJsZW4oZGV2X25hbWUpKSkKKwkJcmV0dXJuIFBTX0VYVF9ERVY4OworCS8vtbG99tK7uPZSSjQ1zfi/2sqxo6zKvNbVtbHN4s34v9rTw6Os1Nm808nPZXRoX3R5cGWjrL/J0tTKtc/WxNrN+LmmxNwKKwlpZiAoIXN0cm5jbXAoZGV2X25hbWUsIGV0aF93YW4sIHN0cmxlbihkZXZfbmFtZSkpIHx8ICFzdHJuY21wKGRldl9uYW1lLCBzd3dhbnN0ciwgc3RybGVuKGRldl9uYW1lKSkpCisJCXJldHVybiBSSjQ1X1dBTl9ERVY7CisJLy+1sbTm1NrBvbj2Uko0Nc34v9rKsaOs1Nq0y8no1sPSu7j2ucy2qLXExNrN+FJKNDXN+L/aCisJaWYgKCFzdHJuY21wKGRldl9uYW1lLCBldGhfbGFuLCBzdHJsZW4oZGV2X25hbWUpKSB8fCAhc3RybmNtcChkZXZfbmFtZSwgc3dsYW5zdHIsIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gUko0NV9MQU5fREVWOworCWlmICghc3RybmNtcChkZXZfbmFtZSwgd2lmaV93YW4sIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gV0lGSV9XQU5fREVWOworCWlmICghc3RybmNtcChkZXZfbmFtZSwgd2lmaV9sYW4sIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gV0lGSV9MQU5fREVWOworCisJcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/cP7s8ajuiBzZXRfcHN3YW5zdGF0ZQorKiC5psTcw+jK9qO6IMno1sNwc834wufJ6LG4SVB2Nte0zKxOVta1CisqILLOyv3LtcP3o7ogY19pZChJTikgOlBEULyku+61xGNfaWQKKyogICAgICAgICAgICBzdGF0ZShJTik6zfjC58nosbjXtMysCisqILe1ILvYINa1o7oKKyogxuTL/Mu1w/ejugorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHNldF9wc3dhbl92NnN0YXRlKGludCBjX2lkLCBpbnQgc3RhdGUpCit7CisJY2hhciBwc193YW5bTlZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgcHN3YW5fc3RhdGVbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCisJc2NfY2ZnX2dldCgicHN3YW4iLCBwc193YW4sIHNpemVvZihwc193YW4pKTsKKworCXNucHJpbnRmKHBzd2FuX3N0YXRlLCBzaXplb2YocHN3YW5fc3RhdGUpLCAiJXMlZF9pcHY2X3N0YXRlIiwgcHNfd2FuLCBjX2lkKTsKKworCWlmIChzdGF0ZSA9PSBERVZfU1RBVEVfV09SS0lORykgeworCQlzY19jZmdfc2V0KHBzd2FuX3N0YXRlLCAid29ya2luZyIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHN0YXRlID09IERFVl9TVEFURV9DT05ORUNUKSB7CisJCXNjX2NmZ19zZXQocHN3YW5fc3RhdGUsICJjb25uZWN0Iik7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXRlID09IERFVl9TVEFURV9ERUFEKSB7CisJCXNjX2NmZ19zZXQocHN3YW5fc3RhdGUsICJkZWFkIik7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGRwX3N0YXRlX2NoZWNrKHN0cnVjdCBwZHBfYWN0aXZlX2luZm8gKmFjdGluZm8pCit7CisJY2hhciBwZHBfYWN0X3N0YXRlW05WX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIG52X3BkcF9zdGF0ZVtOVl9OQU1FX0xFTl0gPSB7MH07CisJc3ByaW50Zihudl9wZHBfc3RhdGUsICJwZHBfYWN0X3N0YXRlXyVkIiwgYWN0aW5mby0+Y19pZCk7CisJc2NfY2ZnX2dldChudl9wZHBfc3RhdGUsIHBkcF9hY3Rfc3RhdGUsIHNpemVvZihwZHBfYWN0X3N0YXRlKSk7CisJaWYgKDAgIT0gc3RyY21wKHBkcF9hY3Rfc3RhdGUsICJhY3QiKSkgeworCQlzY19jZmdfc2V0KG52X3BkcF9zdGF0ZSwgImFjdGluZyIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHBsdWdpbl9zdGF0ZV9zZXQodW5zaWduZWQgY2hhciBuZXRkZXZfaWQpCit7CisJaW50IHBsdWdzdGF0ZTsKKwljaGFyIHJqNDVfcGx1Z2luc3RhdGVbTlZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgdGVtcFtOVl9OQU1FX0xFTl0gPSB7MH07CisJc2NfY2ZnX2dldCgicmo0NV9wbHVnaW5zdGF0ZSIsIHJqNDVfcGx1Z2luc3RhdGUsIHNpemVvZihyajQ1X3BsdWdpbnN0YXRlKSk7CisKKwlwbHVnc3RhdGUgPSBhdG9pKHJqNDVfcGx1Z2luc3RhdGUpOworCWlmIChuZXRkZXZfaWQgPT0gUko0NV9XQU5fREVWIHx8IG5ldGRldl9pZCA9PSBTV19XQU5fREVWKSB7CisJCXBsdWdzdGF0ZSB8PSBSSjQ1X1dBTl9JTjsKKwkJc3ByaW50Zih0ZW1wLCAiJWQiLCBwbHVnc3RhdGUpOworCQlzY19jZmdfc2V0KCJyajQ1X3BsdWdpbnN0YXRlIiwgdGVtcCk7CisJfSBlbHNlIGlmIChuZXRkZXZfaWQgPT0gUko0NV9MQU5fREVWIHx8IG5ldGRldl9pZCA9PSBTV19MQU5fREVWKSB7CisJCXBsdWdzdGF0ZSB8PSBSSjQ1X0xBTl9JTjsKKwkJc3ByaW50Zih0ZW1wLCAiJWQiLCBwbHVnc3RhdGUpOworCQlzY19jZmdfc2V0KCJyajQ1X3BsdWdpbnN0YXRlIiwgdGVtcCk7CisJfSBlbHNlIGlmIChuZXRkZXZfaWQgPT0gVVNCX0xBTl9ERVYpIHsKKwkJcGx1Z3N0YXRlID0gVVNCX0xBTl9JTjsKKwkJc3ByaW50Zih0ZW1wLCAiJWQiLCBwbHVnc3RhdGUpOworCQlzY19jZmdfc2V0KCJ1c2JfcGx1Z2luc3RhdGUiLCB0ZW1wKTsKKwl9IGVsc2UgaWYgKG5ldGRldl9pZCA+PSBQU19FWFRfREVWMSAmJiBuZXRkZXZfaWQgPD0gUFNfRVhUX0RFVjgpIHsKKwkJc3ByaW50Zih0ZW1wLCAicHNleHQlZF9wbHVnaW5zdGF0ZSIsIG5ldGRldl9pZCk7CisJCXNjX2NmZ19zZXQodGVtcCwgIjEiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBsdWdvdXRfc3RhdGVfc2V0KHVuc2lnbmVkIGNoYXIgbmV0ZGV2X2lkKQoreworCWludCBwbHVnc3RhdGU7CisJY2hhciByajQ1X3BsdWdpbnN0YXRlW05WX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHRlbXBbTlZfTkFNRV9MRU5dID0gezB9OworCisJc2NfY2ZnX2dldCgicmo0NV9wbHVnaW5zdGF0ZSIsIHJqNDVfcGx1Z2luc3RhdGUsIHNpemVvZihyajQ1X3BsdWdpbnN0YXRlKSk7CisJcGx1Z3N0YXRlID0gYXRvaShyajQ1X3BsdWdpbnN0YXRlKTsKKworCWlmIChuZXRkZXZfaWQgPT0gUko0NV9XQU5fREVWIHx8IG5ldGRldl9pZCA9PSBTV19XQU5fREVWKSB7CisJCXBsdWdzdGF0ZSAmPSB+Uko0NV9XQU5fSU47CisJCXNwcmludGYodGVtcCwgIiVkIiwgcGx1Z3N0YXRlKTsKKwkJc2NfY2ZnX3NldCgicmo0NV9wbHVnaW5zdGF0ZSIsIHRlbXApOworCX0gZWxzZSBpZiAobmV0ZGV2X2lkID09IFJKNDVfTEFOX0RFViB8fCBuZXRkZXZfaWQgPT0gU1dfTEFOX0RFVikgeworCQlwbHVnc3RhdGUgJj0gflJKNDVfTEFOX0lOOworCQlzcHJpbnRmKHRlbXAsICIlZCIsIHBsdWdzdGF0ZSk7CisJCXNjX2NmZ19zZXQoInJqNDVfcGx1Z2luc3RhdGUiLCB0ZW1wKTsKKwl9IGVsc2UgaWYgKG5ldGRldl9pZCA9PSBVU0JfTEFOX0RFVikgeworCQlwbHVnc3RhdGUgPSBVU0JfTEFOX09VVDsKKwkJc3ByaW50Zih0ZW1wLCAiJWQiLCBwbHVnc3RhdGUpOworCQlzY19jZmdfc2V0KCJ1c2JfcGx1Z2luc3RhdGUiLCB0ZW1wKTsKKwl9IGVsc2UgaWYgKG5ldGRldl9pZCA+PSBQU19FWFRfREVWMSAmJiBuZXRkZXZfaWQgPD0gUFNfRVhUX0RFVjgpIHsKKwkJc3ByaW50Zih0ZW1wLCAicHNleHQlZF9wbHVnaW5zdGF0ZSIsIG5ldGRldl9pZCk7CisJCXNjX2NmZ19zZXQodGVtcCwgIjAiKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IHBkcF9hY3RfcHJvYworKiC5psTcw+jK9qO6IFBTzfjC58nosbi8pLvuvdO/2gorKiCyzsr9y7XD96O6IHBkcF9hY3RpdmVfaW5mbyhJTik6UERQvKS77tDFz6IKKyogt7Ugu9gg1rWjuiCy2df3s8m5pre1u9gxLgorKiDG5Mv8y7XD96O6IGF0z+C52NOm08O9+LPMtffTw6OsyOdhdHNlcnZlcqGicGNzZXJ2ZXKholZvTFRFoaKyytDFtcjTptPDvfizzKO7CisqIL3Tv9rE2rK/yrXP1rbU09q1xFBTyeixuLXEvKS77rywz+DTprXEzfjC58Xk1sMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBwcF9hY3RfcHJvYyhjaGFyICp0dHluYW1lKQoreworCWNoYXIgY21kWzIwMF0gPSB7MH07CisJY2hhciBwYXRoX3NoWzUwXSA9IHswfTsKKworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgIm5ldGFwaTpjYWxsaW5nIHBwcF9hY3RfcHJvYywgJXNcbiIsIHR0eW5hbWUpOworCXNjX2NmZ19zZXQoInBwcF9wZHBzdGF0ZSIsICIiKTsKKwlzY19jZmdfZ2V0KCJwYXRoX3NoIiwgcGF0aF9zaCwgc2l6ZW9mKHBhdGhfc2gpKTsKKwlpZiAoIXR0eW5hbWUpCisJCXJldHVybiAtMTsKKwlzcHJpbnRmKGNtZCwgIiVzL3BwcGRfdXAuc2ggJXMiLCBwYXRoX3NoLCB0dHluYW1lKTsKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJjbWQgaXMgJXNcbiIsIGNtZCk7CisJc29mdF9zeXN0ZW0oY21kKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBkcF9hY3RfcHJvYyhzdHJ1Y3QgcGRwX2FjdGl2ZV9pbmZvICphY3RpbmZvLCBpbnQgc3JjX2lkKQoreworCWludCByZXQgPSAwOworCS8va2xvY3dvcmsKKwkvL2ludCBjX2lkID0gYWN0aW5mby0+Y19pZDsKKwkvL3Vuc2lnbmVkIGNoYXIgaXA0NmZsYWcgPSBhY3RpbmZvLT5hY3RfaW5mby5pcDQ2ZmxhZzsKKworCXN5c3RlbSgiY2F0IC9wcm9jL3VwdGltZSAxPmRldi9jb25zb2xlIDI+JjEiKTsKKwkKKwlpZiAoIWFjdGluZm8gfHwgYWN0aW5mby0+YWN0X2luZm8uaXA0NmZsYWcgPT0gVjRWNl9JTlZBTElEKSB7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInBkcF9hY3RfcHJvYywgc3JjX2lkID0gJWQsIGFjdGluZm8tPmFjdF9pbmZvLmlwNDZmbGFnID09IFY0VjZfSU5WQUxJRFxuIiwgc3JjX2lkKTsKKworCQlzb2Z0YXBfYXNzZXJ0KCJpcDQ2ZmxhZyBlcnJvciIpOyAvL2tsb2N3b3JrCisJCXJldHVybiAtMTsKKwl9CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAibmV0YXBpOnBkcF9hY3RfcHJvYzogc3JjX2lkPTB4JXgsIGNpZD0lZCBwZHBfdHlwZT0ldSBpcDQ2ZmxhZz0ldVxuIiwgc3JjX2lkLCBhY3RpbmZvLT5jX2lkLCBhY3RpbmZvLT5wZHBfdHlwZSwgYWN0aW5mby0+YWN0X2luZm8uaXA0NmZsYWcpOworCisjaWYgMSAgLy8gY292IE0gIGFjdGluZm8tPnBkcF90eXBlIGlzIHVuc2lnbmVkLCBjb3VsZCBub3QgY29tcGFyZSB3aXRoIDAKKyAgICBpZiAoUERQX1BQUCA8IGFjdGluZm8tPnBkcF90eXBlKSB7CisjZWxzZQorCWlmIChQRFBfUFBQIDwgYWN0aW5mby0+cGRwX3R5cGUgfHwgUERQX0xPQ0FMID4gYWN0aW5mby0+cGRwX3R5cGUpIHsKKyNlbmRpZiAgICAgICAgCisKKwkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAicGRwX2FjdF9wcm9jLCBzcmNfaWQgPSAlZCwgcGRwX3R5cGUgaXMgZXJyb3I6IGNpZD0lZCBwZHBfdHlwZT0ldSBpcDQ2ZmxhZz0ldVxuIiwgc3JjX2lkLCBhY3RpbmZvLT5jX2lkLCBhY3RpbmZvLT5wZHBfdHlwZSwgYWN0aW5mby0+YWN0X2luZm8uaXA0NmZsYWcpOworCQlzb2Z0YXBfYXNzZXJ0KCJwZHBfdHlwZT0ldSBlcnJvciIsIGFjdGluZm8tPnBkcF90eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICgxID09IHBkcF9zdGF0ZV9jaGVjayhhY3RpbmZvKSkgeworCisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInBkcF9hY3RfaW5pdDogYWxyZWFkeSBhY3QgY19pZCA9ICVkLCBzcmNfaWQgPSAlZFxuIiwgYWN0aW5mby0+Y19pZCwgc3JjX2lkKTsKKwkJLy9zb2Z0YXBfYXNzZXJ0KCJhbHJlYWR5IGFjdCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGFjdGluZm8tPmFjdF9pbmZvLmlwNDZmbGFnID09IFY2X1ZBTElEIHx8IGFjdGluZm8tPmFjdF9pbmZvLmlwNDZmbGFnID09IFY0Nl9WQUxJRCkgeworCQlzZXRfcHN3YW5fdjZzdGF0ZShhY3RpbmZvLT5jX2lkLCBERVZfU1RBVEVfQ09OTkVDVCk7CisJfQorCisJcmV0ID0gaXBjX3NlbmRfbWVzc2FnZShzcmNfaWQsIE1PRFVMRV9JRF9NQUlOX0NUUkwsIE1TR19DTURfTkVUX1BEUF9BQ1QsIHNpemVvZihzdHJ1Y3QgcGRwX2FjdGl2ZV9pbmZvKSwgKFVDSEFSICopYWN0aW5mbywgMCk7ICAvKmxpbnQgIWUyNiAhZTU1Ki8KKwlpZiAoMCAhPSByZXQpIHsKKwkJc29mdGFwX2Fzc2VydCgic2VuZCBtc2cgdG8genRlX3JvdXRlciBlcnJvciIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAicGRwX2FjdF9wcm9jOiBzdWNjZXNzIVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IHBkcF9kZWFjdF9wcm9jCisqILmmxNzD6Mr2o7ogUFPN+MLnyeixuMilu+6907/aCisqILLOyv3LtcP3o7ogY19pZChJTik6UERQvKS77mNfaWQuCisqILe1ILvYINa1o7ogstnX97PJuaa3tbvYMS4KKyogxuTL/Mu1w/ejuiBhdM/gudjTptPDvfizzLX308OjrMjnYXRzZXJ2ZXKhonBjc2VydmVyoaJWb0xURaGissrQxbXI06bTw734s8yjuworvdO/2sTasr/Ktc/WttTT2rXEUFPJ6LG4yKW77qO71qez1jQ2taXVu8ilu+6jrMv50tTI67LO0OjSqta4yr40Nsfpv/YKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBkcF9kZWFjdF9wcm9jKGludCBjX2lkLCB1bnNpZ25lZCBjaGFyIGlwNDZmbGFnLCBpbnQgc3JjX2lkKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBwZHBfZGVhY3RpdmVfaW5mbyB0ZW1wOworCWNoYXIgbnZfcGRwX3N0YXRlW05WX05BTUVfTEVOXSA9IHswfTsKKworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgIm5ldGFwaTpwZHBfZGVhY3RfcHJvYzogc3JjX2lkPSVkLCBjaWQ9JWQgaXA0NmZsYWc9JXVcbiIsIHNyY19pZCwgY19pZCwgaXA0NmZsYWcpOworCisJc3ByaW50Zihudl9wZHBfc3RhdGUsICJwZHBfYWN0X3N0YXRlXyVkIiwgY19pZCk7CisKKwl0ZW1wLmNfaWQgPSBjX2lkOworCXRlbXAuaXA0NmZsYWcgPSBpcDQ2ZmxhZzsKKworCWlmIChpcDQ2ZmxhZyA9PSBWNFY2X0lOVkFMSUQpIHsKKwkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAicGRwX2RlYWN0X3Byb2Msc3JjX2lkID0gJWQsIGlwNDZmbGFnIGlzIGVycm9yOiBjaWQ9JWQgaXA0NmZsYWc9JXVcbiIsIHNyY19pZCwgY19pZCwgaXA0NmZsYWcpOworCQlzb2Z0YXBfYXNzZXJ0KCJpcDQ2ZmxhZz0ldSBlcnJvciIsIGlwNDZmbGFnKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNjX2NmZ19zZXQobnZfcGRwX3N0YXRlLCAiZGVhY3RpbmciKTsKKwlyZXQgPSBpcGNfc2VuZF9tZXNzYWdlKHNyY19pZCwgTU9EVUxFX0lEX01BSU5fQ1RSTCwgTVNHX0NNRF9ORVRfUERQX0RFQUNULCBzaXplb2Yoc3RydWN0IHBkcF9kZWFjdGl2ZV9pbmZvKSwgKFVDSEFSICopJnRlbXAsIDApOyAvKmxpbnQgIWUyNiAhZTU1Ki8KKwlpZiAoMCAhPSByZXQpIHsKKwkJc29mdGFwX2Fzc2VydCgic2VuZCBtc2cgdG8genRlX3JvdXRlciBlcnJvciIpOworCQlyZXR1cm4gLTE7CisJfQorCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInBkcF9kZWFjdF9wcm9jOiBzdWNjZXNzIVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IG5ldGRldl9jb25uZWN0X2ludGVybmV0CisqILmmxNzD6Mr2o7ogd2VidWm3osvNtcTBrL3Tx+vH8yy907/axNqyv7340NBpZmNvbmZpZyB1cKOssqLG9Lavz+DTprXEtdjWt7fWxeS9+LPMCisqILLOyv3LtcP3o7ogbmV0ZGV2X2lko7rN+MLnyeixuLbU06a1xLrqw/ujrLLOvPtVU0JfTkVUX0RFVrXIuurWtQorKiC3tSC72CDWtaO6ILLZ1/ezybmmt7W72DEuCisqIMbky/zLtcP3o7ogyeixuNb3v9jEo7/ptffTw7TLvdO/2sewo6zQ6NKqvOyy4rWxx7DJ6LG4zu/A7c2owrfS0c2oo6y38dTysrvTprjDtffTw7TLvdO/2qO7CisqINb3v9jEo7/p0OjSqtHPv9jW2Li0tcS199PDuMO907/ao6zS8s6qw7+199PD0ru0zrjDvdO/2qOsxNqyv73Uu+HW2NDC1rTQ0NK7tM7N6tX7tcS12Na3t9bF5MH3s8yjuworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbmV0ZGV2X2Nvbm5lY3RfaW50ZXJuZXQodW5zaWduZWQgY2hhciBuZXRkZXZfaWQsIGludCBzcmNfaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRhcGk6bmV0ZGV2X2Nvbm5lY3RfaW50ZXJuZXQ6IG5ldGRldl9pZD0ldVxuIiwgbmV0ZGV2X2lkKTsKKworCWlmIChuZXRkZXZfaWQgIT0gUko0NV9XQU5fREVWICYmIG5ldGRldl9pZCAhPSBXSUZJX1dBTl9ERVYgJiYgbmV0ZGV2X2lkICE9IFJKNDVfTEFOX0RFViAmJiBuZXRkZXZfaWQgIT0gV0lGSV9MQU5fREVWKSB7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgImNvbm5lY3RfaW50ZXJuZXQ6JXUgZG9uJ3Qgc3VwcG9ydCBjb25uZWN0IG9wIVxuIiwgbmV0ZGV2X2lkKTsKKwkJc29mdGFwX2Fzc2VydCgibmV0ZGV2X2lkPSVkIGVycm9yIiwgbmV0ZGV2X2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gaXBjX3NlbmRfbWVzc2FnZShzcmNfaWQsIE1PRFVMRV9JRF9NQUlOX0NUUkwsIE1TR19DTURfTkVUX0NPTk5FQ1QsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgKFVDSEFSICopJm5ldGRldl9pZCwgMCk7IC8qbGludCAhZTI2ICFlNTUqLworCWlmICgwICE9IHJldCkgeworCQlzb2Z0YXBfYXNzZXJ0KCJzZW5kIG1zZyB0byB6dGVfcm91dGVyIGVycm9yIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILqvyv3D+7PGo7ogbmV0ZGV2X2Rpc2Nvbm5lY3RfaW50ZXJuZXQKKyoguabE3MPoyvajuiB3ZWJ1abeiy821xLbPv6rBrL3Tx+vH8yy907/axNqyv7340NBpZmNvbmZpZyBkb3duo6yyosmxtfTP4NOmtcS12Na3t9bF5L34s8wKKyogss7K/cu1w/ejuiBuZXRkZXZfaWSjus34wufJ6LG4ttTTprXEuurD+6Osss68+1VTQl9ORVRfREVWtci66ta1CisqILe1ILvYINa1o7ogstnX97PJuaa3tbvYMS4KKyogxuTL/Mu1w/ejuiDJ6LG41ve/2MSjv+m199PDtMu907/aCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBuZXRkZXZfZGlzY29ubmVjdF9pbnRlcm5ldCh1bnNpZ25lZCBjaGFyIG5ldGRldl9pZCwgaW50IHNyY19pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByaW50ZigibmV0YXBpOm5ldGRldl9kaXNjb25uZWN0X2ludGVybmV0IHN0YXJ0IW5ldGRldl9pZD0ldVxuIiwgbmV0ZGV2X2lkKTsKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRhcGk6bmV0ZGV2X2Rpc2Nvbm5lY3RfaW50ZXJuZXQ6IG5ldGRldl9pZD0ldVxuIiwgbmV0ZGV2X2lkKTsKKworCWlmIChuZXRkZXZfaWQgIT0gUko0NV9XQU5fREVWICYmIG5ldGRldl9pZCAhPSBXSUZJX1dBTl9ERVYgJiYgbmV0ZGV2X2lkICE9IFJKNDVfTEFOX0RFViAmJiBuZXRkZXZfaWQgIT0gV0lGSV9MQU5fREVWKSB7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgImRpc2Nvbm5lY3RfaW50ZXJuZXQ6JXUgZG9uJ3Qgc3VwcG9ydCBkaXNjb25uZWN0IG9wIVxuIiwgbmV0ZGV2X2lkKTsKKwkJc29mdGFwX2Fzc2VydCgibmV0ZGV2X2lkPSVkIGVycm9yIiwgbmV0ZGV2X2lkKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBpcGNfc2VuZF9tZXNzYWdlKHNyY19pZCwgTU9EVUxFX0lEX01BSU5fQ1RSTCwgTVNHX0NNRF9ORVRfRElTQ09OLCBzaXplb2YodW5zaWduZWQgY2hhciksIChVQ0hBUiAqKSZuZXRkZXZfaWQsIDApOyAvKmxpbnQgIWUyNiAhZTU1Ki8KKwlpZiAoMCAhPSByZXQpIHsKKwkJc29mdGFwX2Fzc2VydCgic2VuZCBtc2cgdG8genRlX3JvdXRlciBlcnJvciIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IG5ldGRldl9wbHVnaW5fcHJvY19ieW5hbWUKKyoguabE3MPoyvajuiDIyLLlsM7J6LG4suXI6yy907/axNqyv7zssuLKx7fx0OjSqr340NDX1Lavsqa6xaOsyOfQ6NKqo6zWtNDQtdjWt7fWxeShotfpzfi1yMH3s8wKKyogss7K/cu1w/ejuiBuZXRkZXZfbmFtZaO6zfjC58nosbjD+6Osc291cmNlX2lkIHBsdWe87LLixKO/6UlECisqILe1ILvYINa1o7ogstnX97PJuaa3tbvYMS4KKyogxuTL/Mu1w/ejuiDJ6LG41ve/2LX308O0y73Tv9rKsaOsse3D97jDzfjC58nosbjO78DtzajCt9LRzaijrL/J0tS9+NDQSVDK/b7dsPy1xMrVt6LByworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbmV0ZGV2X3BsdWdpbl9wcm9jX2J5bmFtZShjaGFyICpuZXRkZXZfbmFtZSwgaW50IHNyY19pZCkKK3sKKwlpbnQgbmV0ZGV2X2lkID0gMDsKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRkZXZfcGx1Z2luX2J5bmFtZSwgbmV0ZGV2ICVzIGlzIHBsdWdpbiwgc3JjX2lkID0gJWRcbiIsIG5ldGRldl9uYW1lLCBzcmNfaWQpOworCW5ldGRldl9pZCA9IGdldERldklkX2J5bmFtZShuZXRkZXZfbmFtZSk7CisKKwlpZiAobmV0ZGV2X2lkID09IC0xKSB7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgIm5ldGRldl9wbHVnaW5fcHJvY19ieW5hbWUsbmV0ZGV2X25hbWUgaXMgZXJyb3IscGxlYXNlIGNvbm5lY3QgbWFpbiBjb250cm9sIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gbmV0ZGV2X3BsdWdpbl9wcm9jKG5ldGRldl9pZCwgc3JjX2lkKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IG5ldGRldl9wbHVnb3V0X3Byb2MKKyoguabE3MPoyvajuiDIyLLlsM7J6LG4sM6z9iy907/axNqyv7340NBpZmNvbmZpZyBkb3duo6yyosmxtfTP4NOmtcS12Na3t9bF5L34s8wKKyogss7K/cu1w/ejuiBuZXRkZXZfbmFtZaO6zfjC58nosbjD+6Osc291cmNlX2lkIHBsdWe87LLixKO/6UlECisqILe1ILvYINa1o7ogstnX97PJuaa3tbvYMS4KKyogxuTL/Mu1w/ejuiDJ6LG41ve/2LX308O0y73Tv9rKsaOsse3D97jDzfjC58nosbjO78DtzajCt9LRts+jrLK70qrU2b340NBJUMr9vt2w/MrVt6IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG5ldGRldl9wbHVnb3V0X3Byb2NfYnluYW1lKGNoYXIgKm5ldGRldl9uYW1lLCBpbnQgc3JjX2lkKQoreworCWludCBuZXRkZXZfaWQgPSAwOworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgIm5ldGRldl9wbHVnb3V0X2J5bmFtZSwgbmV0ZGV2ICVzIGlzIHBsdWdvdXQsIHNyY19pZCA9ICVkXG4iLCBuZXRkZXZfbmFtZSwgc3JjX2lkKTsKKwluZXRkZXZfaWQgPSBnZXREZXZJZF9ieW5hbWUobmV0ZGV2X25hbWUpOworCisJaWYgKG5ldGRldl9pZCA9PSAtMSkgeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRkZXZfcGx1Z291dF9wcm9jX2J5bmFtZSxuZXRkZXZfbmFtZSBpcyBlcnJvcixwbGVhc2UgY29ubmVjdCBtYWluIGNvbnRyb2wiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXJldHVybiBuZXRkZXZfcGx1Z291dF9wcm9jKG5ldGRldl9pZCwgc3JjX2lkKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IG5ldGRldl9wbHVnaW5fcHJvYworKiC5psTcw+jK9qO6IMjIsuWwzsnosbiy5cjrLL3Tv9rE2rK/vOyy4srHt/HQ6NKqvfjQ0NfUtq+yprrFo6zI59Do0qqjrNa00NC12Na3t9bF5KGi1+nN+LXIwfezzAorKiCyzsr9y7XD96O6IG5ldGRldl9pZKO6zfjC58nosbi21NOmtcS66sP7o6yyzrz7VVNCX05FVF9ERVa1yLrq1rUKKyogt7Ugu9gg1rWjuiCy2df3s8m5pre1u9gxLgorKiDG5Mv8y7XD96O6IMnosbjW97/YtffTw7TLvdO/2sqxo6yx7cP3uMPN+MLnyeixuM7vwO3NqMK30tHNqKOsv8nS1L340NBJUMr9vt2w/LXEytW3osHLCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBuZXRkZXZfcGx1Z2luX3Byb2ModW5zaWduZWQgY2hhciBuZXRkZXZfaWQsIGludCBzcmNfaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcmludGYoIm5ldGFwaTpuZXRkZXZfcGx1Z2luX3Byb2Mgc3RhcnQhbmV0ZGV2X2lkPSV1XG4iLCBuZXRkZXZfaWQpOworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgIm5ldGFwaTpuZXRkZXZfcGx1Z2luX3Byb2M6IG5ldGRldl9pZD0ldVxuIiwgbmV0ZGV2X2lkKTsKKwlwbHVnaW5fc3RhdGVfc2V0KG5ldGRldl9pZCk7CisJcmV0ID0gaXBjX3NlbmRfbWVzc2FnZTIoc3JjX2lkLCBNT0RVTEVfSURfTUFJTl9DVFJMLCBNU0dfQ01EX05FVF9QTFVHSU4sIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgKFVDSEFSICopJm5ldGRldl9pZCwgMCk7IC8qbGludCAhZTI2ICFlNTUqLworCisJaWYgKDAgIT0gcmV0KSB7CisJCXNvZnRhcF9hc3NlcnQoInNlbmQgbXNnIHRvIHp0ZV9yb3V0ZXIgZXJyb3IiKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIF9VU0VfTUJJTQkKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRhcGk6bmV0ZGV2X3BsdWdpbl9wcm9jOiBzZW5kIE1TR19DTURfTkVUX1BMVUdJTiB0byBNQklNXG4iKTsKKwlpcGNfc2VuZF9tZXNzYWdlMihzcmNfaWQsIE1PRFVMRV9JRF9NQklNLCBNU0dfQ01EX05FVF9QTFVHSU4sIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgKFVDSEFSICopJm5ldGRldl9pZCwgMCk7IAorI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IG5ldGRldl9wbHVnb3V0X3Byb2MKKyoguabE3MPoyvajuiDIyLLlsM7J6LG4sM6z9iy907/axNqyv7340NBpZmNvbmZpZyBkb3duo6yyosmxtfTP4NOmtcS12Na3t9bF5L34s8wKKyogss7K/cu1w/ejuiBuZXRkZXZfaWSjus34wufJ6LG4ttTTprXEuurD+6Osss68+1VTQl9ORVRfREVWtci66ta1CisqILe1ILvYINa1o7ogstnX97PJuaa3tbvYMS4KKyogxuTL/Mu1w/ejuiDJ6LG41ve/2LX308O0y73Tv9rKsaOsse3D97jDzfjC58nosbjO78DtzajCt9LRts+jrLK70qrU2b340NBJUMr9vt2w/MrVt6IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG5ldGRldl9wbHVnb3V0X3Byb2ModW5zaWduZWQgY2hhciBuZXRkZXZfaWQsIGludCBzcmNfaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcmludGYoIm5ldGFwaTpuZXRkZXZfcGx1Z291dF9wcm9jIHN0YXJ0IW5ldGRldl9pZD0ldVxuIiwgbmV0ZGV2X2lkKTsKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRhcGk6bmV0ZGV2X3BsdWdvdXRfcHJvYzogbmV0ZGV2X2lkPSV1XG4iLCBuZXRkZXZfaWQpOworCXBsdWdvdXRfc3RhdGVfc2V0KG5ldGRldl9pZCk7CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAibmV0ZGV2X3BsdWdvdXRfcHJvYzogbmV0ZGV2X2lkPSV1XG4iLCBuZXRkZXZfaWQpOworCXJldCA9IGlwY19zZW5kX21lc3NhZ2UyKHNyY19pZCwgTU9EVUxFX0lEX01BSU5fQ1RSTCwgTVNHX0NNRF9ORVRfUExVR09VVCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAoVUNIQVIgKikmbmV0ZGV2X2lkLCAwKTsgLypsaW50ICFlMjYgIWU1NSovCisKKwlpZiAoMCAhPSByZXQpIHsKKwkJc29mdGFwX2Fzc2VydCgic2VuZCBtc2cgdG8genRlX3JvdXRlciBlcnJvciIpOworCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgX1VTRV9NQklNCisJaXBjX3NlbmRfbWVzc2FnZTIoc3JjX2lkLCBNT0RVTEVfSURfTUJJTSwgTVNHX0NNRF9ORVRfUExVR09VVCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAoVUNIQVIgKikmbmV0ZGV2X2lkLCAwKTsKKyNlbmRpZgorCXJldHVybiAxOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILqvyv3D+7PGo7ogdGNwaXBfcmVzZXRfY29uZmlndXJlCisqILmmxNzD6Mr2o7ogu9a4tLP2s6fJ6NbDyrHTyeXlenRlX2JsY734s8y199PDo6zJvrP9s8zQ8tTL0NDW0Mn6s8m1xM7EvP4KKyogss7K/cu1w/ejuiDO3gorKiC3tSC72CDWtaO6IM7eCisqIMbky/zLtcP3o7oKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRjcGlwX3Jlc2V0X2NvbmZpZ3VyZSgpCit7CisJY2hhciBjbWRbMjAwXSA9IHswfTsKKwljaGFyIHBhdGhfc2NyaXB0WzUwXSA9IHswfTsKKwljaGFyIHBhdGhfY29uZls1MF0gPSB7MH07CisJY2hhciBwYXRoX2ZpbGVbMjAwXSA9IHswfTsKKwlwcmludGYoIm5ldGFwaTp0Y3BpcF9yZXNldF9jb25maWd1cmUgc3RhcnQhXG4iKTsKKwlzY19jZmdfZ2V0KCJwYXRoX2NvbmYiLCBwYXRoX2NvbmYsIHNpemVvZihwYXRoX2NvbmYpKTsKKwlzcHJpbnRmKHBhdGhfZmlsZSwgIiVzL2hvc3RuYW1lX21hY19maWxlIiwgcGF0aF9jb25mKTsKKworCisJLy+71ri0s/azp8no1sPKscm+s/1ob3N0bmFtZV9tYWNfZmlsZc7EvP4KKwlzcHJpbnRmKGNtZCwgIi9iaW4vcm0gLXJmICVzIiwgcGF0aF9maWxlKTsKKwl6eGljX3N5c3RlbShjbWQpOworCS8vu9a4tLP2s6fJ6NbDyrHJvrP9c3RhdGljX21hY2lwX2ZpbGUgIM7EvP4KKwltZW1zZXQocGF0aF9maWxlLCAwLCBzaXplb2YocGF0aF9maWxlKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy9zdGF0aWNfbWFjaXBfZmlsZSIsIHBhdGhfY29uZik7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCXNwcmludGYoY21kLCAiL2Jpbi9ybSAtcmYgJXMiLCBwYXRoX2ZpbGUpOworCXp4aWNfc3lzdGVtKGNtZCk7CisKKwltZW1zZXQocGF0aF9maWxlLCAwLCBzaXplb2YocGF0aF9maWxlKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy9jaGlsZHJlbl9kZXZpY2VfZmlsZSIsIHBhdGhfY29uZik7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCXNwcmludGYoY21kLCAiL2Jpbi9ybSAtcmYgJXMiLCBwYXRoX2ZpbGUpOworCXp4aWNfc3lzdGVtKGNtZCk7CisKKwltZW1zZXQocGF0aF9maWxlLCAwLCBzaXplb2YocGF0aF9maWxlKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy93aGl0ZV9zaXRlX2ZpbGUiLCBwYXRoX2NvbmYpOworCW1lbXNldChjbWQsIDAsIHNpemVvZihjbWQpKTsKKwlzcHJpbnRmKGNtZCwgIi9iaW4vcm0gLXJmICVzIiwgcGF0aF9maWxlKTsKKwl6eGljX3N5c3RlbShjbWQpOworCisJLypyZXNldCBERE5TIHN0YXR1cyBmaWxlKi8KKwltZW1zZXQocGF0aF9maWxlLCAwLCBzaXplb2YocGF0aF9maWxlKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy9pbmFkeW4uc3RhdHVzIiwgcGF0aF9jb25mKTsKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoY21kKSk7CisJc3ByaW50ZihjbWQsICIvYmluL3JtIC1yZiAlcyIsIHBhdGhfZmlsZSk7CisJenhpY19zeXN0ZW0oY21kKTsKKworCS8vu9a4tLP2s6fJ6NbDyrG9q01BQy1JULDztqi55tTyx+W/1QorCXNjX2NmZ19nZXQoInBhdGhfc2giLCBwYXRoX3NjcmlwdCwgc2l6ZW9mKHBhdGhfc2NyaXB0KSk7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCXNwcmludGYoY21kLCAiJXMvY29uZmlnLXVkaGNwZC5zaCBcImxhblwiIC1TIiwgcGF0aF9zY3JpcHQpOworCXNvZnRfc3lzdGVtKGNtZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IHRjX2NvbnRyb2wKKyoguabE3MPoyvajuiDB98G/v9jWxgorKiCyzsr9y7XD96O6INDo0qrB98G/vOC/2LXEyc/PwtDQwb+jrMr9vt2/qNDo0qrT0GNpZKOsdWZpxKPKvbK70OjSqgorKiAgICAgICAgICAgIDCx7cq+srvQ6NKqwfe/2KOstaXOuzpiaXSjrNLybGludXix6te8w/zB7srHttTX1r3atKbA7aOsy/nS1Nfu1tXF5NbD1rW74dX7s/04CisqILe1ILvYINa1o7ogstnX97PJuaa3tbvYMS4KKyogxuTL/Mu1w/ejuiC4+NDo0qrB98G/v9jWxrXE06bTw7X308OjrMjnyc/Q0NDo0qrB97/Yo6zH67XIxNzJz83izfi689TZtffTw6Ost/HU8s7et6i78cihzeLN+L/avfjQ0MH3v9gKKyogICAgICAgICAgICAgICAgINX9s6O52Lv61tjQwr+qu/qjrNaux7DJ6NbDtcTB97/Y0sDIu9PQ0KcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHRjX2NvbnRyb2woc3RydWN0IHRjX2NvbnRyb2xfaW5mbyAqdGNpbmZvLCBpbnQgc3JjX2lkKQoreworCWludCByZXQgPSAwOworCisJcHJpbnRmKCJuZXRhcGk6dGNfY29udHJvbCBzdGFydCEgY19pZDolZCwgZG93bjoldSwgdXA6JXVcbiwgc3JjOiVkIFxuIiwgdGNpbmZvLT5jX2lkLCB0Y2luZm8tPnRjX2Rvd25saW5rLCB0Y2luZm8tPnRjX3VwbGluaywgc3JjX2lkKTsKKworCXJldCA9IGlwY19zZW5kX21lc3NhZ2Uoc3JjX2lkLCBNT0RVTEVfSURfTUFJTl9DVFJMLCBNU0dfQ01EX05FVF9UQ19DVFJMLCBzaXplb2Yoc3RydWN0IHRjX2NvbnRyb2xfaW5mbyksIChVQ0hBUiAqKXRjaW5mbywgMCk7CisJaWYgKDAgIT0gcmV0KSB7CisJCXNvZnRhcF9hc3NlcnQoInNlbmQgbXNnIHRvIHp0ZV9yb3V0ZXIgZXJyb3IiKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisjZGVmaW5lIFNJT0NERVZQUklWQVRFIDBYODlGMAorI2RlZmluZSBTSU9DVkxBTgkJU0lPQ0RFVlBSSVZBVEUrMHgwCQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/cP7s8ajuiBzZXRfZXRod2FuX21vZGUKKyoguabE3MPoyvajuiDJ6NbDc3dpdGNoyeixuGV0aDAuMjAwzfi/2rbU06a1xHBvcnQzzqp3YW6/2ru5ysdsYW6/2gorKiCyzsr9y7XD96O6IG1vZGU6MSA9PiB3YW6/2qOsMCA9PiBsYW6/2gorKiC3tSC72CDWtaO6IM7eLgorKiDG5Mv8y7XD96O6IAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNldF9ldGh3YW5fcG9ydF9tb2RlKGludCBtb2RlKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCWNoYXIgZXRoX25hbWVbSUZOQU1TSVpdID0geydlJywndCcsJ2gnLCcwJ307CisJCisJaWYobW9kZSAhPSAwICYmIG1vZGUgIT0gMSkKKwl7CisJCXJldHVybjsKKwl9CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAic2V0X2V0aHdhbl9wb3J0X21vZGUoKSBtb2RlPSVkXG4iLCBtb2RlKTsJCisJaWYgKChmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInNldF9ldGgyMDBfbW9kZSgpIHNvY2tldChBRl9JTkVULFNPQ0tfU1RSRUFNKSBmYWlsIik7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwltZW1jcHkoKHZvaWQqKWlmci5pZnJfbmFtZSwgKHZvaWQqKWV0aF9uYW1lLCBzdHJsZW4oImV0aDAiKSk7Ly9nbWFjzfi/2sP7s8ZldGgwo6y689D4v7zCx8rHt/HNqLn90MLU9m52z+678cihCisJaWZyLmlmcl9kYXRhID0gKHZvaWQqKSZtb2RlOworCisJaWYgKGlvY3RsKGZkLCBTSU9DVkxBTiwgJmlmcikgPCAwICYmIGVycm5vICE9IEVJTlZBTCkgeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJzZXRfZXRoMjAwX21vZGUoKSBpb2N0bCBmYWlsIik7CQkKKwkJY2xvc2UoZmQpOworCQlyZXR1cm47CisJfQorCisJY2xvc2UoZmQpOworCit9CisKKy8qCisgKiBldGhlcl90b19ldWk2NCAtIENvbnZlcnQgNDgtYml0IEV0aGVybmV0IGFkZHJlc3MgaW50byA2NC1iaXQgRVVJCisgKgorICogY29udmVydCB0aGUgNDgtYml0IE1BQyBhZGRyZXNzIG9mIGV0aDAgaW50byBFVUkgNjQuIGNhbGxlciBhbHNvIGFzc3VtZXMKKyAqIHRoYXQgdGhlIHN5c3RlbSBoYXMgYSBwcm9wZXJseSBjb25maWd1cmVkIEV0aGVybmV0IGludGVyZmFjZSBmb3IgdGhpcworICogZnVuY3Rpb24gdG8gcmV0dXJuIG5vbi16ZXJvLgorICovCitpbnQgbmV0YXBpX2V0aGVyX3RvX2V1aTY0KGNvbnN0IGNoYXIgKmRldl9uYW1lLCBuZXRhcGlfZXVpNjRfdCAqcF9ldWk2NCkKK3sKKyAgICBzdHJ1Y3QgaWZyZXEgaWZyID0gezB9OworICAgIGludCBza2ZkOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKKworICAgIHNrZmQgPSBzb2NrZXQoUEZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOworICAgIGlmKHNrZmQgPT0gLTEpCisgICAgeworICAgICAgICBzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJldWk2NCBvcGVuIElQdjYgc29ja2V0IGZhaWwiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RybmNweShpZnIuaWZyX25hbWUsIGRldl9uYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKS0xKTsvL2t3CisgICAgaWYoaW9jdGwoc2tmZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPCAwKQorICAgIHsKKyAgICAgICAgY2xvc2Uoc2tmZCk7CisgICAgICAgIHNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgImV1aTY0IG9idGFpbiBoYXJkd2FyZSBhZGRyZXNzIGZvciAlcyBmYWlsIiwgZGV2X25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY2xvc2Uoc2tmZCk7CisKKyAgICAvKgorICAgICAqIEFuZCBjb252ZXJ0IHRoZSBFVUktNDggaW50byBFVUktNjQsIHBlciBSRkMgMjQ3MiBbc2VjIDQuMV0KKyAgICAgKi8KKyAgICBwdHIgPSBpZnIuaWZyX2h3YWRkci5zYV9kYXRhOworICAgIHBfZXVpNjQtPmU4WzBdID0gcHRyWzBdIHwgMHgwMjsKKyAgICBwX2V1aTY0LT5lOFsxXSA9IHB0clsxXTsKKyAgICBwX2V1aTY0LT5lOFsyXSA9IHB0clsyXTsKKyAgICBwX2V1aTY0LT5lOFszXSA9IDB4RkY7CisgICAgcF9ldWk2NC0+ZThbNF0gPSAweEZFOworICAgIHBfZXVpNjQtPmU4WzVdID0gcHRyWzNdOworICAgIHBfZXVpNjQtPmU4WzZdID0gcHRyWzRdOworICAgIHBfZXVpNjQtPmU4WzddID0gcHRyWzVdOworCisgICAgcmV0dXJuIDE7Cit9CisK