ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJzb2Z0YXAvbmV0YXBpLmMgYi9hcC9saWIvbGlic29mdGFwL25ldGFwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIxMzlhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGlic29mdGFwL25ldGFwaS5jCkBAIC0wLDAgKzEsNTkzIEBACisvKioKKyAqIEBmaWxlIE5ldGFwaS5jCisgKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgU2FuZWNoaXBzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFNhbmVjaGlwcyBUZWNobm9sb2d5IENvLiwgTHRkLgorICogQGF1dGhvciBsaW54dSBHZWJpbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN5cy9rbG9nLmg+CisjaW5jbHVkZSA8c3lzL21zZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgInNvZnRhcF9hcGkuaCIKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiDN+MLnvdO/2iAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvL7j5vt3N+MLnyeixuMP7u/HIobbU06a1xMnosbhJRCywtNXV08XPyLy20+tOVtbQtcTJ6LG4w/u9+NDQxqXF5KOsyqew3Le1u9gtMQoraW50IGdldERldklkX2J5bmFtZShjaGFyICpkZXZfbmFtZSkKK3sKKwljaGFyIHBzX3dhbltORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBwc2V4dF93YW4xW05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHBzZXh0X3dhbjJbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgcHNleHRfd2FuM1tORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBwc2V4dF93YW40W05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHBzZXh0X3dhbjVbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgcHNleHRfd2FuNltORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBwc2V4dF93YW43W05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHBzZXh0X3dhbjhbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgc3d3YW5zdHJbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgc3dsYW5zdHJbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgZXRoX3dhbltORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciB3aWZpX3dhbltORVRJRl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBldGhfbGFuW05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHdpZmlfbGFuW05FVElGX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHVzYl9sYW5bTkVUSUZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgc3dfbmFtZVtOVl9OQU1FX0xFTl0gPSB7MH07CisJY2hhciBsYW5fZW5hYmxlW05WX05BTUVfTEVOXSA9IHswfTsKKwlwcmludGYoIm5ldGFwaTpnZXREZXZJZF9ieW5hbWUgc3RhcnQhZGV2X25hbWU9JXNcbiIsIGRldl9uYW1lKTsKKworCS8vyLHKoc3izfi/2s6qv9XKsbry0rK4+Nb3v9i3os/7z6KjrGFkZCBieSB6cG0gMjAxNjA2MjggYmVnaW4KKwlpZiAoc3RybGVuKGRldl9uYW1lKSA9PSAwKSB7CisJCXJldHVybiBOT19ERVY7CisJfQorCS8vyLHKoc3izfi/2s6qv9XKsbry0rK4+Nb3v9i3os/7z6KjrGFkZCBieSB6cG0gMjAxNjA2MjggZW5kCisKKwljZmdfZ2V0X2l0ZW0oInBzd2FuIiwgcHNfd2FuLCBzaXplb2YocHNfd2FuKSk7CisJY2ZnX2dldF9pdGVtKCJwc19leHQxIiwgcHNleHRfd2FuMSwgc2l6ZW9mKHBzZXh0X3dhbjEpKTsKKwljZmdfZ2V0X2l0ZW0oInBzX2V4dDIiLCBwc2V4dF93YW4yLCBzaXplb2YocHNleHRfd2FuMikpOworCWNmZ19nZXRfaXRlbSgicHNfZXh0MyIsIHBzZXh0X3dhbjMsIHNpemVvZihwc2V4dF93YW4zKSk7CisJY2ZnX2dldF9pdGVtKCJwc19leHQ0IiwgcHNleHRfd2FuNCwgc2l6ZW9mKHBzZXh0X3dhbjQpKTsKKwljZmdfZ2V0X2l0ZW0oInBzX2V4dDUiLCBwc2V4dF93YW41LCBzaXplb2YocHNleHRfd2FuMSkpOworCWNmZ19nZXRfaXRlbSgicHNfZXh0NiIsIHBzZXh0X3dhbjYsIHNpemVvZihwc2V4dF93YW4yKSk7CisJY2ZnX2dldF9pdGVtKCJwc19leHQ3IiwgcHNleHRfd2FuNywgc2l6ZW9mKHBzZXh0X3dhbjMpKTsKKwljZmdfZ2V0X2l0ZW0oInBzX2V4dDgiLCBwc2V4dF93YW44LCBzaXplb2YocHNleHRfd2FuNCkpOworCWNmZ19nZXRfaXRlbSgid2lmaXdhbiIsIHdpZmlfd2FuLCBzaXplb2Yod2lmaV93YW4pKTsKKwljZmdfZ2V0X2l0ZW0oInN3d2Fuc3RyIiwgc3d3YW5zdHIsIHNpemVvZihzd3dhbnN0cikpOworCWNmZ19nZXRfaXRlbSgic3dsYW5zdHIiLCBzd2xhbnN0ciwgc2l6ZW9mKHN3bGFuc3RyKSk7CisJY2ZnX2dldF9pdGVtKCJldGh3YW4iLCBldGhfd2FuLCBzaXplb2YoZXRoX3dhbikpOworCWNmZ19nZXRfaXRlbSgiZXRobGFuIiwgZXRoX2xhbiwgc2l6ZW9mKGV0aF9sYW4pKTsKKwljZmdfZ2V0X2l0ZW0oIndpZmlsYW4iLCB3aWZpX2xhbiwgc2l6ZW9mKHdpZmlfbGFuKSk7CisJY2ZnX2dldF9pdGVtKCJ1c2JsYW4iLCB1c2JfbGFuLCBzaXplb2YodXNiX2xhbikpOworCWNmZ19nZXRfaXRlbSgic3ciLCBzd19uYW1lLCBzaXplb2Yoc3dfbmFtZSkpOworCWNmZ19nZXRfaXRlbSgiTGFuRW5hYmxlIiwgbGFuX2VuYWJsZSwgc2l6ZW9mKGxhbl9lbmFibGUpKTsKKworCWlmICghc3RybmNtcChkZXZfbmFtZSwgcHNfd2FuLCBzdHJsZW4oZGV2X25hbWUpKSkKKwkJcmV0dXJuIFBTX05FVF9ERVY7CisJaWYgKCgwICE9IHN0cmNtcChsYW5fZW5hYmxlLCAiMCIpKSAmJiAhc3RybmNtcChkZXZfbmFtZSwgdXNiX2xhbiwgc3RybGVuKGRldl9uYW1lKSkpCisJCXJldHVybiBVU0JfTEFOX0RFVjsKKwlpZiAoIXN0cm5jbXAoZGV2X25hbWUsIHBzZXh0X3dhbjEsIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gUFNfRVhUX0RFVjE7CisJaWYgKCFzdHJuY21wKGRldl9uYW1lLCBwc2V4dF93YW4yLCBzdHJsZW4oZGV2X25hbWUpKSkKKwkJcmV0dXJuIFBTX0VYVF9ERVYyOworCWlmICghc3RybmNtcChkZXZfbmFtZSwgcHNleHRfd2FuMywgc3RybGVuKGRldl9uYW1lKSkpCisJCXJldHVybiBQU19FWFRfREVWMzsKKwlpZiAoIXN0cm5jbXAoZGV2X25hbWUsIHBzZXh0X3dhbjQsIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gUFNfRVhUX0RFVjQ7CisJaWYgKCFzdHJuY21wKGRldl9uYW1lLCBwc2V4dF93YW41LCBzdHJsZW4oZGV2X25hbWUpKSkKKwkJcmV0dXJuIFBTX0VYVF9ERVY1OworCWlmICghc3RybmNtcChkZXZfbmFtZSwgcHNleHRfd2FuNiwgc3RybGVuKGRldl9uYW1lKSkpCisJCXJldHVybiBQU19FWFRfREVWNjsKKwlpZiAoIXN0cm5jbXAoZGV2X25hbWUsIHBzZXh0X3dhbjcsIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gUFNfRVhUX0RFVjc7CisJaWYgKCFzdHJuY21wKGRldl9uYW1lLCBwc2V4dF93YW44LCBzdHJsZW4oZGV2X25hbWUpKSkKKwkJcmV0dXJuIFBTX0VYVF9ERVY4OworCS8vtbG99tK7uPZSSjQ1zfi/2sqxo6zKvNbVtbHN4s34v9rTw6Os1Nm808nPZXRoX3R5cGWjrL/J0tTKtc/WxNrN+LmmxNwKKwlpZiAoIXN0cm5jbXAoZGV2X25hbWUsIGV0aF93YW4sIHN0cmxlbihkZXZfbmFtZSkpIHx8ICFzdHJuY21wKGRldl9uYW1lLCBzd3dhbnN0ciwgc3RybGVuKGRldl9uYW1lKSkpCisJCXJldHVybiBSSjQ1X1dBTl9ERVY7CisJLy+1sbTm1NrBvbj2Uko0Nc34v9rKsaOs1Nq0y8no1sPSu7j2ucy2qLXExNrN+FJKNDXN+L/aCisJaWYgKCFzdHJuY21wKGRldl9uYW1lLCBldGhfbGFuLCBzdHJsZW4oZGV2X25hbWUpKSB8fCAhc3RybmNtcChkZXZfbmFtZSwgc3dsYW5zdHIsIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gUko0NV9MQU5fREVWOworCWlmICghc3RybmNtcChkZXZfbmFtZSwgd2lmaV93YW4sIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gV0lGSV9XQU5fREVWOworCWlmICghc3RybmNtcChkZXZfbmFtZSwgd2lmaV9sYW4sIHN0cmxlbihkZXZfbmFtZSkpKQorCQlyZXR1cm4gV0lGSV9MQU5fREVWOworCisJcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/cP7s8ajuiBzZXRfcHN3YW5zdGF0ZQorKiC5psTcw+jK9qO6IMno1sNwc834wufJ6LG4SVB2Nte0zKxOVta1CisqILLOyv3LtcP3o7ogY19pZChJTikgOlBEULyku+61xGNfaWQKKyogICAgICAgICAgICBzdGF0ZShJTik6zfjC58nosbjXtMysCisqILe1ILvYINa1o7oKKyogxuTL/Mu1w/ejugorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHNldF9wc3dhbl92NnN0YXRlKGludCBjX2lkLCBpbnQgc3RhdGUpCit7CisJY2hhciBwc193YW5bTlZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgcHN3YW5fc3RhdGVbTkVUSUZfTkFNRV9MRU5dID0gezB9OworCisJY2ZnX2dldF9pdGVtKCJwc3dhbiIsIHBzX3dhbiwgc2l6ZW9mKHBzX3dhbikpOworCisJc25wcmludGYocHN3YW5fc3RhdGUsIHNpemVvZihwc3dhbl9zdGF0ZSksICIlcyVkX2lwdjZfc3RhdGUiLCBwc193YW4sIGNfaWQpOworCisJaWYgKHN0YXRlID09IERFVl9TVEFURV9XT1JLSU5HKSB7CisJCWNmZ19zZXQocHN3YW5fc3RhdGUsICJ3b3JraW5nIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhdGUgPT0gREVWX1NUQVRFX0NPTk5FQ1QpIHsKKwkJY2ZnX3NldChwc3dhbl9zdGF0ZSwgImNvbm5lY3QiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3RhdGUgPT0gREVWX1NUQVRFX0RFQUQpIHsKKwkJY2ZnX3NldChwc3dhbl9zdGF0ZSwgImRlYWQiKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludCBwZHBfc3RhdGVfY2hlY2soc3RydWN0IHBkcF9hY3RpdmVfaW5mbyAqYWN0aW5mbykKK3sKKwljaGFyIHBkcF9hY3Rfc3RhdGVbTlZfTkFNRV9MRU5dID0gezB9OworCWNoYXIgbnZfcGRwX3N0YXRlW05WX05BTUVfTEVOXSA9IHswfTsKKwlzcHJpbnRmKG52X3BkcF9zdGF0ZSwgInBkcF9hY3Rfc3RhdGVfJWQiLCBhY3RpbmZvLT5jX2lkKTsKKwljZmdfZ2V0X2l0ZW0obnZfcGRwX3N0YXRlLCBwZHBfYWN0X3N0YXRlLCBzaXplb2YocGRwX2FjdF9zdGF0ZSkpOworCWlmICgwICE9IHN0cmNtcChwZHBfYWN0X3N0YXRlLCAiYWN0IikpIHsKKwkJY2ZnX3NldChudl9wZHBfc3RhdGUsICJhY3RpbmciKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBwbHVnaW5fc3RhdGVfc2V0KHVuc2lnbmVkIGNoYXIgbmV0ZGV2X2lkKQoreworCWludCBwbHVnc3RhdGU7CisJY2hhciByajQ1X3BsdWdpbnN0YXRlW05WX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHRlbXBbTlZfTkFNRV9MRU5dID0gezB9OworCWNmZ19nZXRfaXRlbSgicmo0NV9wbHVnaW5zdGF0ZSIsIHJqNDVfcGx1Z2luc3RhdGUsIHNpemVvZihyajQ1X3BsdWdpbnN0YXRlKSk7CisKKwlwbHVnc3RhdGUgPSBhdG9pKHJqNDVfcGx1Z2luc3RhdGUpOworCWlmIChuZXRkZXZfaWQgPT0gUko0NV9XQU5fREVWIHx8IG5ldGRldl9pZCA9PSBTV19XQU5fREVWKSB7CisJCXBsdWdzdGF0ZSB8PSBSSjQ1X1dBTl9JTjsKKwkJc3ByaW50Zih0ZW1wLCAiJWQiLCBwbHVnc3RhdGUpOworCQljZmdfc2V0KCJyajQ1X3BsdWdpbnN0YXRlIiwgdGVtcCk7CisJfSBlbHNlIGlmIChuZXRkZXZfaWQgPT0gUko0NV9MQU5fREVWIHx8IG5ldGRldl9pZCA9PSBTV19MQU5fREVWKSB7CisJCXBsdWdzdGF0ZSB8PSBSSjQ1X0xBTl9JTjsKKwkJc3ByaW50Zih0ZW1wLCAiJWQiLCBwbHVnc3RhdGUpOworCQljZmdfc2V0KCJyajQ1X3BsdWdpbnN0YXRlIiwgdGVtcCk7CisJfSBlbHNlIGlmIChuZXRkZXZfaWQgPT0gVVNCX0xBTl9ERVYpIHsKKwkJcGx1Z3N0YXRlID0gVVNCX0xBTl9JTjsKKwkJc3ByaW50Zih0ZW1wLCAiJWQiLCBwbHVnc3RhdGUpOworCQljZmdfc2V0KCJ1c2JfcGx1Z2luc3RhdGUiLCB0ZW1wKTsKKwl9IGVsc2UgaWYgKG5ldGRldl9pZCA+PSBQU19FWFRfREVWMSAmJiBuZXRkZXZfaWQgPD0gUFNfRVhUX0RFVjgpIHsKKwkJc3ByaW50Zih0ZW1wLCAicHNleHQlZF9wbHVnaW5zdGF0ZSIsIG5ldGRldl9pZCk7CisJCWNmZ19zZXQodGVtcCwgIjEiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBsdWdvdXRfc3RhdGVfc2V0KHVuc2lnbmVkIGNoYXIgbmV0ZGV2X2lkKQoreworCWludCBwbHVnc3RhdGU7CisJY2hhciByajQ1X3BsdWdpbnN0YXRlW05WX05BTUVfTEVOXSA9IHswfTsKKwljaGFyIHRlbXBbTlZfTkFNRV9MRU5dID0gezB9OworCisJY2ZnX2dldF9pdGVtKCJyajQ1X3BsdWdpbnN0YXRlIiwgcmo0NV9wbHVnaW5zdGF0ZSwgc2l6ZW9mKHJqNDVfcGx1Z2luc3RhdGUpKTsKKwlwbHVnc3RhdGUgPSBhdG9pKHJqNDVfcGx1Z2luc3RhdGUpOworCisJaWYgKG5ldGRldl9pZCA9PSBSSjQ1X1dBTl9ERVYgfHwgbmV0ZGV2X2lkID09IFNXX1dBTl9ERVYpIHsKKwkJcGx1Z3N0YXRlICY9IH5SSjQ1X1dBTl9JTjsKKwkJc3ByaW50Zih0ZW1wLCAiJWQiLCBwbHVnc3RhdGUpOworCQljZmdfc2V0KCJyajQ1X3BsdWdpbnN0YXRlIiwgdGVtcCk7CisJfSBlbHNlIGlmIChuZXRkZXZfaWQgPT0gUko0NV9MQU5fREVWIHx8IG5ldGRldl9pZCA9PSBTV19MQU5fREVWKSB7CisJCXBsdWdzdGF0ZSAmPSB+Uko0NV9MQU5fSU47CisJCXNwcmludGYodGVtcCwgIiVkIiwgcGx1Z3N0YXRlKTsKKwkJY2ZnX3NldCgicmo0NV9wbHVnaW5zdGF0ZSIsIHRlbXApOworCX0gZWxzZSBpZiAobmV0ZGV2X2lkID09IFVTQl9MQU5fREVWKSB7CisJCXBsdWdzdGF0ZSA9IFVTQl9MQU5fT1VUOworCQlzcHJpbnRmKHRlbXAsICIlZCIsIHBsdWdzdGF0ZSk7CisJCWNmZ19zZXQoInVzYl9wbHVnaW5zdGF0ZSIsIHRlbXApOworCX0gZWxzZSBpZiAobmV0ZGV2X2lkID49IFBTX0VYVF9ERVYxICYmIG5ldGRldl9pZCA8PSBQU19FWFRfREVWOCkgeworCQlzcHJpbnRmKHRlbXAsICJwc2V4dCVkX3BsdWdpbnN0YXRlIiwgbmV0ZGV2X2lkKTsKKwkJY2ZnX3NldCh0ZW1wLCAiMCIpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILqvyv3D+7PGo7ogcGRwX2FjdF9wcm9jCisqILmmxNzD6Mr2o7ogUFPN+MLnyeixuLyku+6907/aCisqILLOyv3LtcP3o7ogcGRwX2FjdGl2ZV9pbmZvKElOKTpQRFC8pLvu0MXPogorKiC3tSC72CDWtaO6ILLZ1/ezybmmt7W72DEuCisqIMbky/zLtcP3o7ogYXTP4LnY06bTw734s8y199PDo6zI52F0c2VydmVyoaJwY3NlcnZlcqGiVm9MVEWhorLK0MW1yNOm08O9+LPMo7sKKyogvdO/2sTasr/Ktc/WttTT2rXEUFPJ6LG4tcS8pLvuvLDP4NOmtcTN+MLnxeTWwworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgcHBwX2FjdF9wcm9jKGNoYXIgKnR0eW5hbWUpCit7CisJY2hhciBjbWRbMjAwXSA9IHswfTsKKwljaGFyIHBhdGhfc2hbNTBdID0gezB9OworCisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAibmV0YXBpOmNhbGxpbmcgcHBwX2FjdF9wcm9jLCAlc1xuIiwgdHR5bmFtZSk7CisJY2ZnX3NldCgicHBwX3BkcHN0YXRlIiwgIiIpOworCWNmZ19nZXRfaXRlbSgicGF0aF9zaCIsIHBhdGhfc2gsIHNpemVvZihwYXRoX3NoKSk7CisJaWYgKCF0dHluYW1lKQorCQlyZXR1cm4gLTE7CisJc3ByaW50ZihjbWQsICIlcy9wcHBkX3VwLnNoICVzIiwgcGF0aF9zaCwgdHR5bmFtZSk7CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAiY21kIGlzICVzXG4iLCBjbWQpOworCXNvZnRfc3lzdGVtKGNtZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwZHBfYWN0X3Byb2Moc3RydWN0IHBkcF9hY3RpdmVfaW5mbyAqYWN0aW5mbywgaW50IHNyY19pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwkvL2tsb2N3b3JrCisJLy9pbnQgY19pZCA9IGFjdGluZm8tPmNfaWQ7CisJLy91bnNpZ25lZCBjaGFyIGlwNDZmbGFnID0gYWN0aW5mby0+YWN0X2luZm8uaXA0NmZsYWc7CisKKwlzeXN0ZW0oImNhdCAvcHJvYy91cHRpbWUgMT5kZXYvY29uc29sZSAyPiYxIik7CisJCisJaWYgKCFhY3RpbmZvIHx8IGFjdGluZm8tPmFjdF9pbmZvLmlwNDZmbGFnID09IFY0VjZfSU5WQUxJRCkgeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJwZHBfYWN0X3Byb2MsIHNyY19pZCA9ICVkLCBhY3RpbmZvLT5hY3RfaW5mby5pcDQ2ZmxhZyA9PSBWNFY2X0lOVkFMSURcbiIsIHNyY19pZCk7CisKKwkJc29mdGFwX2Fzc2VydCgiaXA0NmZsYWcgZXJyb3IiKTsgLy9rbG9jd29yaworCQlyZXR1cm4gLTE7CisJfQorCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgIm5ldGFwaTpwZHBfYWN0X3Byb2M6IHNyY19pZD0weCV4LCBjaWQ9JWQgcGRwX3R5cGU9JXUgaXA0NmZsYWc9JXVcbiIsIHNyY19pZCwgYWN0aW5mby0+Y19pZCwgYWN0aW5mby0+cGRwX3R5cGUsIGFjdGluZm8tPmFjdF9pbmZvLmlwNDZmbGFnKTsKKworI2lmIDEgIC8vIGNvdiBNICBhY3RpbmZvLT5wZHBfdHlwZSBpcyB1bnNpZ25lZCwgY291bGQgbm90IGNvbXBhcmUgd2l0aCAwCisgICAgaWYgKFBEUF9QUFAgPCBhY3RpbmZvLT5wZHBfdHlwZSkgeworI2Vsc2UKKwlpZiAoUERQX1BQUCA8IGFjdGluZm8tPnBkcF90eXBlIHx8IFBEUF9MT0NBTCA+IGFjdGluZm8tPnBkcF90eXBlKSB7CisjZW5kaWYgICAgICAgIAorCisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInBkcF9hY3RfcHJvYywgc3JjX2lkID0gJWQsIHBkcF90eXBlIGlzIGVycm9yOiBjaWQ9JWQgcGRwX3R5cGU9JXUgaXA0NmZsYWc9JXVcbiIsIHNyY19pZCwgYWN0aW5mby0+Y19pZCwgYWN0aW5mby0+cGRwX3R5cGUsIGFjdGluZm8tPmFjdF9pbmZvLmlwNDZmbGFnKTsKKwkJc29mdGFwX2Fzc2VydCgicGRwX3R5cGU9JXUgZXJyb3IiLCBhY3RpbmZvLT5wZHBfdHlwZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoMSA9PSBwZHBfc3RhdGVfY2hlY2soYWN0aW5mbykpIHsKKworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJwZHBfYWN0X2luaXQ6IGFscmVhZHkgYWN0IGNfaWQgPSAlZCwgc3JjX2lkID0gJWRcbiIsIGFjdGluZm8tPmNfaWQsIHNyY19pZCk7CisJCS8vc29mdGFwX2Fzc2VydCgiYWxyZWFkeSBhY3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChhY3RpbmZvLT5hY3RfaW5mby5pcDQ2ZmxhZyA9PSBWNl9WQUxJRCB8fCBhY3RpbmZvLT5hY3RfaW5mby5pcDQ2ZmxhZyA9PSBWNDZfVkFMSUQpIHsKKwkJc2V0X3Bzd2FuX3Y2c3RhdGUoYWN0aW5mby0+Y19pZCwgREVWX1NUQVRFX0NPTk5FQ1QpOworCX0KKworCXJldCA9IGlwY19zZW5kX21lc3NhZ2Uoc3JjX2lkLCBNT0RVTEVfSURfTUFJTl9DVFJMLCBNU0dfQ01EX05FVF9QRFBfQUNULCBzaXplb2Yoc3RydWN0IHBkcF9hY3RpdmVfaW5mbyksIChVQ0hBUiAqKWFjdGluZm8sIDApOyAgLypsaW50ICFlMjYgIWU1NSovCisJaWYgKDAgIT0gcmV0KSB7CisJCXNvZnRhcF9hc3NlcnQoInNlbmQgbXNnIHRvIHp0ZV9yb3V0ZXIgZXJyb3IiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInBkcF9hY3RfcHJvYzogc3VjY2VzcyFcbiIpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/cP7s8ajuiBwZHBfZGVhY3RfcHJvYworKiC5psTcw+jK9qO6IFBTzfjC58nosbjIpbvuvdO/2gorKiCyzsr9y7XD96O6IGNfaWQoSU4pOlBEULyku+5jX2lkLgorKiC3tSC72CDWtaO6ILLZ1/ezybmmt7W72DEuCisqIMbky/zLtcP3o7ogYXTP4LnY06bTw734s8y199PDo6zI52F0c2VydmVyoaJwY3NlcnZlcqGiVm9MVEWhorLK0MW1yNOm08O9+LPMo7sKK73Tv9rE2rK/yrXP1rbU09q1xFBTyeixuMilu+6ju9ans9Y0NrWl1bvIpbvuo6zL+dLUyOuyztDo0qrWuMq+NDbH6b/2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBwZHBfZGVhY3RfcHJvYyhpbnQgY19pZCwgdW5zaWduZWQgY2hhciBpcDQ2ZmxhZywgaW50IHNyY19pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcGRwX2RlYWN0aXZlX2luZm8gdGVtcDsKKwljaGFyIG52X3BkcF9zdGF0ZVtOVl9OQU1FX0xFTl0gPSB7MH07CisKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRhcGk6cGRwX2RlYWN0X3Byb2M6IHNyY19pZD0lZCwgY2lkPSVkIGlwNDZmbGFnPSV1XG4iLCBzcmNfaWQsIGNfaWQsIGlwNDZmbGFnKTsKKworCXNwcmludGYobnZfcGRwX3N0YXRlLCAicGRwX2FjdF9zdGF0ZV8lZCIsIGNfaWQpOworCisJdGVtcC5jX2lkID0gY19pZDsKKwl0ZW1wLmlwNDZmbGFnID0gaXA0NmZsYWc7CisKKwlpZiAoaXA0NmZsYWcgPT0gVjRWNl9JTlZBTElEKSB7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInBkcF9kZWFjdF9wcm9jLHNyY19pZCA9ICVkLCBpcDQ2ZmxhZyBpcyBlcnJvcjogY2lkPSVkIGlwNDZmbGFnPSV1XG4iLCBzcmNfaWQsIGNfaWQsIGlwNDZmbGFnKTsKKwkJc29mdGFwX2Fzc2VydCgiaXA0NmZsYWc9JXUgZXJyb3IiLCBpcDQ2ZmxhZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwljZmdfc2V0KG52X3BkcF9zdGF0ZSwgImRlYWN0aW5nIik7CisJcmV0ID0gaXBjX3NlbmRfbWVzc2FnZShzcmNfaWQsIE1PRFVMRV9JRF9NQUlOX0NUUkwsIE1TR19DTURfTkVUX1BEUF9ERUFDVCwgc2l6ZW9mKHN0cnVjdCBwZHBfZGVhY3RpdmVfaW5mbyksIChVQ0hBUiAqKSZ0ZW1wLCAwKTsgLypsaW50ICFlMjYgIWU1NSovCisJaWYgKDAgIT0gcmV0KSB7CisJCXNvZnRhcF9hc3NlcnQoInNlbmQgbXNnIHRvIHp0ZV9yb3V0ZXIgZXJyb3IiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJwZHBfZGVhY3RfcHJvYzogc3VjY2VzcyFcbiIpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/cP7s8ajuiBuZXRkZXZfY29ubmVjdF9pbnRlcm5ldAorKiC5psTcw+jK9qO6IHdlYnVpt6LLzbXEway908frx/MsvdO/2sTasr+9+NDQaWZjb25maWcgdXCjrLKixvS2r8/g06a1xLXY1re31sXkvfizzAorKiCyzsr9y7XD96O6IG5ldGRldl9pZKO6zfjC58nosbi21NOmtcS66sP7o6yyzrz7VVNCX05FVF9ERVa1yLrq1rUKKyogt7Ugu9gg1rWjuiCy2df3s8m5pre1u9gxLgorKiDG5Mv8y7XD96O6IMnosbjW97/YxKO/6bX308O0y73Tv9rHsKOs0OjSqrzssuK1scewyeixuM7vwO3NqMK30tHNqKOst/HU8rK706a4w7X308O0y73Tv9qjuworKiDW97/YxKO/6dDo0qrRz7/Y1ti4tLXEtffTw7jDvdO/2qOs0vLOqsO/tffTw9K7tM64w73Tv9qjrMTasr+91Lvh1tjQwta00NDSu7TOzerV+7XEtdjWt7fWxeTB97PMo7sKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG5ldGRldl9jb25uZWN0X2ludGVybmV0KHVuc2lnbmVkIGNoYXIgbmV0ZGV2X2lkLCBpbnQgc3JjX2lkKQoreworCWludCByZXQgPSAwOworCisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAibmV0YXBpOm5ldGRldl9jb25uZWN0X2ludGVybmV0OiBuZXRkZXZfaWQ9JXVcbiIsIG5ldGRldl9pZCk7CisKKwlpZiAobmV0ZGV2X2lkICE9IFJKNDVfV0FOX0RFViAmJiBuZXRkZXZfaWQgIT0gV0lGSV9XQU5fREVWICYmIG5ldGRldl9pZCAhPSBSSjQ1X0xBTl9ERVYgJiYgbmV0ZGV2X2lkICE9IFdJRklfTEFOX0RFVikgeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJjb25uZWN0X2ludGVybmV0OiV1IGRvbid0IHN1cHBvcnQgY29ubmVjdCBvcCFcbiIsIG5ldGRldl9pZCk7CisJCXNvZnRhcF9hc3NlcnQoIm5ldGRldl9pZD0lZCBlcnJvciIsIG5ldGRldl9pZCk7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGlwY19zZW5kX21lc3NhZ2Uoc3JjX2lkLCBNT0RVTEVfSURfTUFJTl9DVFJMLCBNU0dfQ01EX05FVF9DT05ORUNULCBzaXplb2YodW5zaWduZWQgY2hhciksIChVQ0hBUiAqKSZuZXRkZXZfaWQsIDApOyAvKmxpbnQgIWUyNiAhZTU1Ki8KKwlpZiAoMCAhPSByZXQpIHsKKwkJc29mdGFwX2Fzc2VydCgic2VuZCBtc2cgdG8genRlX3JvdXRlciBlcnJvciIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IG5ldGRldl9kaXNjb25uZWN0X2ludGVybmV0CisqILmmxNzD6Mr2o7ogd2VidWm3osvNtcS2z7+qway908frx/MsvdO/2sTasr+9+NDQaWZjb25maWcgZG93bqOssqLJsbX0z+DTprXEtdjWt7fWxeS9+LPMCisqILLOyv3LtcP3o7ogbmV0ZGV2X2lko7rN+MLnyeixuLbU06a1xLrqw/ujrLLOvPtVU0JfTkVUX0RFVrXIuurWtQorKiC3tSC72CDWtaO6ILLZ1/ezybmmt7W72DEuCisqIMbky/zLtcP3o7ogyeixuNb3v9jEo7/ptffTw7TLvdO/2gorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbmV0ZGV2X2Rpc2Nvbm5lY3RfaW50ZXJuZXQodW5zaWduZWQgY2hhciBuZXRkZXZfaWQsIGludCBzcmNfaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcmludGYoIm5ldGFwaTpuZXRkZXZfZGlzY29ubmVjdF9pbnRlcm5ldCBzdGFydCFuZXRkZXZfaWQ9JXVcbiIsIG5ldGRldl9pZCk7CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAibmV0YXBpOm5ldGRldl9kaXNjb25uZWN0X2ludGVybmV0OiBuZXRkZXZfaWQ9JXVcbiIsIG5ldGRldl9pZCk7CisKKwlpZiAobmV0ZGV2X2lkICE9IFJKNDVfV0FOX0RFViAmJiBuZXRkZXZfaWQgIT0gV0lGSV9XQU5fREVWICYmIG5ldGRldl9pZCAhPSBSSjQ1X0xBTl9ERVYgJiYgbmV0ZGV2X2lkICE9IFdJRklfTEFOX0RFVikgeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJkaXNjb25uZWN0X2ludGVybmV0OiV1IGRvbid0IHN1cHBvcnQgZGlzY29ubmVjdCBvcCFcbiIsIG5ldGRldl9pZCk7CisJCXNvZnRhcF9hc3NlcnQoIm5ldGRldl9pZD0lZCBlcnJvciIsIG5ldGRldl9pZCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gaXBjX3NlbmRfbWVzc2FnZShzcmNfaWQsIE1PRFVMRV9JRF9NQUlOX0NUUkwsIE1TR19DTURfTkVUX0RJU0NPTiwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAoVUNIQVIgKikmbmV0ZGV2X2lkLCAwKTsgLypsaW50ICFlMjYgIWU1NSovCisJaWYgKDAgIT0gcmV0KSB7CisJCXNvZnRhcF9hc3NlcnQoInNlbmQgbXNnIHRvIHp0ZV9yb3V0ZXIgZXJyb3IiKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/cP7s8ajuiBuZXRkZXZfcGx1Z2luX3Byb2NfYnluYW1lCisqILmmxNzD6Mr2o7ogyMiy5bDOyeixuLLlyOssvdO/2sTasr+87LLiyse38dDo0qq9+NDQ19S2r7KmusWjrMjn0OjSqqOs1rTQ0LXY1re31sXkoaLX6c34tcjB97PMCisqILLOyv3LtcP3o7ogbmV0ZGV2X25hbWWjus34wufJ6LG4w/ujrHNvdXJjZV9pZCBwbHVnvOyy4sSjv+lJRAorKiC3tSC72CDWtaO6ILLZ1/ezybmmt7W72DEuCisqIMbky/zLtcP3o7ogyeixuNb3v9i199PDtMu907/ayrGjrLHtw/e4w834wufJ6LG4zu/A7c2owrfS0c2oo6y/ydLUvfjQ0ElQyv2+3bD8tcTK1beiwcsKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG5ldGRldl9wbHVnaW5fcHJvY19ieW5hbWUoY2hhciAqbmV0ZGV2X25hbWUsIGludCBzcmNfaWQpCit7CisJaW50IG5ldGRldl9pZCA9IDA7CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAibmV0ZGV2X3BsdWdpbl9ieW5hbWUsIG5ldGRldiAlcyBpcyBwbHVnaW4sIHNyY19pZCA9ICVkXG4iLCBuZXRkZXZfbmFtZSwgc3JjX2lkKTsKKwluZXRkZXZfaWQgPSBnZXREZXZJZF9ieW5hbWUobmV0ZGV2X25hbWUpOworCisJaWYgKG5ldGRldl9pZCA9PSAtMSkgeworCQlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRkZXZfcGx1Z2luX3Byb2NfYnluYW1lLG5ldGRldl9uYW1lIGlzIGVycm9yLHBsZWFzZSBjb25uZWN0IG1haW4gY29udHJvbCIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG5ldGRldl9wbHVnaW5fcHJvYyhuZXRkZXZfaWQsIHNyY19pZCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/cP7s8ajuiBuZXRkZXZfcGx1Z291dF9wcm9jCisqILmmxNzD6Mr2o7ogyMiy5bDOyeixuLDOs/YsvdO/2sTasr+9+NDQaWZjb25maWcgZG93bqOssqLJsbX0z+DTprXEtdjWt7fWxeS9+LPMCisqILLOyv3LtcP3o7ogbmV0ZGV2X25hbWWjus34wufJ6LG4w/ujrHNvdXJjZV9pZCBwbHVnvOyy4sSjv+lJRAorKiC3tSC72CDWtaO6ILLZ1/ezybmmt7W72DEuCisqIMbky/zLtcP3o7ogyeixuNb3v9i199PDtMu907/ayrGjrLHtw/e4w834wufJ6LG4zu/A7c2owrfS0bbPo6yyu9Kq1Nm9+NDQSVDK/b7dsPzK1beiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBuZXRkZXZfcGx1Z291dF9wcm9jX2J5bmFtZShjaGFyICpuZXRkZXZfbmFtZSwgaW50IHNyY19pZCkKK3sKKwlpbnQgbmV0ZGV2X2lkID0gMDsKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRkZXZfcGx1Z291dF9ieW5hbWUsIG5ldGRldiAlcyBpcyBwbHVnb3V0LCBzcmNfaWQgPSAlZFxuIiwgbmV0ZGV2X25hbWUsIHNyY19pZCk7CisJbmV0ZGV2X2lkID0gZ2V0RGV2SWRfYnluYW1lKG5ldGRldl9uYW1lKTsKKworCWlmIChuZXRkZXZfaWQgPT0gLTEpIHsKKwkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAibmV0ZGV2X3BsdWdvdXRfcHJvY19ieW5hbWUsbmV0ZGV2X25hbWUgaXMgZXJyb3IscGxlYXNlIGNvbm5lY3QgbWFpbiBjb250cm9sIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gbmV0ZGV2X3BsdWdvdXRfcHJvYyhuZXRkZXZfaWQsIHNyY19pZCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/cP7s8ajuiBuZXRkZXZfcGx1Z2luX3Byb2MKKyoguabE3MPoyvajuiDIyLLlsM7J6LG4suXI6yy907/axNqyv7zssuLKx7fx0OjSqr340NDX1Lavsqa6xaOsyOfQ6NKqo6zWtNDQtdjWt7fWxeShotfpzfi1yMH3s8wKKyogss7K/cu1w/ejuiBuZXRkZXZfaWSjus34wufJ6LG4ttTTprXEuurD+6Osss68+1VTQl9ORVRfREVWtci66ta1CisqILe1ILvYINa1o7ogstnX97PJuaa3tbvYMS4KKyogxuTL/Mu1w/ejuiDJ6LG41ve/2LX308O0y73Tv9rKsaOsse3D97jDzfjC58nosbjO78DtzajCt9LRzaijrL/J0tS9+NDQSVDK/b7dsPy1xMrVt6LByworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbmV0ZGV2X3BsdWdpbl9wcm9jKHVuc2lnbmVkIGNoYXIgbmV0ZGV2X2lkLCBpbnQgc3JjX2lkKQoreworCWludCByZXQgPSAwOworCisJcHJpbnRmKCJuZXRhcGk6bmV0ZGV2X3BsdWdpbl9wcm9jIHN0YXJ0IW5ldGRldl9pZD0ldVxuIiwgbmV0ZGV2X2lkKTsKKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJuZXRhcGk6bmV0ZGV2X3BsdWdpbl9wcm9jOiBuZXRkZXZfaWQ9JXVcbiIsIG5ldGRldl9pZCk7CisJcGx1Z2luX3N0YXRlX3NldChuZXRkZXZfaWQpOworCXJldCA9IGlwY19zZW5kX21lc3NhZ2UyKHNyY19pZCwgTU9EVUxFX0lEX01BSU5fQ1RSTCwgTVNHX0NNRF9ORVRfUExVR0lOLCBzaXplb2YodW5zaWduZWQgY2hhciksIChVQ0hBUiAqKSZuZXRkZXZfaWQsIDApOyAvKmxpbnQgIWUyNiAhZTU1Ki8KKworCWlmICgwICE9IHJldCkgeworCQlzb2Z0YXBfYXNzZXJ0KCJzZW5kIG1zZyB0byB6dGVfcm91dGVyIGVycm9yIik7CisJCXJldHVybiAwOworCX0KKyNpZmRlZiBfVVNFX01CSU0JCisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAibmV0YXBpOm5ldGRldl9wbHVnaW5fcHJvYzogc2VuZCBNU0dfQ01EX05FVF9QTFVHSU4gdG8gTUJJTVxuIik7CisJaXBjX3NlbmRfbWVzc2FnZTIoc3JjX2lkLCBNT0RVTEVfSURfTUJJTSwgTVNHX0NNRF9ORVRfUExVR0lOLCBzaXplb2YodW5zaWduZWQgY2hhciksIChVQ0hBUiAqKSZuZXRkZXZfaWQsIDApOyAKKyNlbmRpZgorCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoguq/K/cP7s8ajuiBuZXRkZXZfcGx1Z291dF9wcm9jCisqILmmxNzD6Mr2o7ogyMiy5bDOyeixuLDOs/YsvdO/2sTasr+9+NDQaWZjb25maWcgZG93bqOssqLJsbX0z+DTprXEtdjWt7fWxeS9+LPMCisqILLOyv3LtcP3o7ogbmV0ZGV2X2lko7rN+MLnyeixuLbU06a1xLrqw/ujrLLOvPtVU0JfTkVUX0RFVrXIuurWtQorKiC3tSC72CDWtaO6ILLZ1/ezybmmt7W72DEuCisqIMbky/zLtcP3o7ogyeixuNb3v9i199PDtMu907/ayrGjrLHtw/e4w834wufJ6LG4zu/A7c2owrfS0bbPo6yyu9Kq1Nm9+NDQSVDK/b7dsPzK1beiCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBuZXRkZXZfcGx1Z291dF9wcm9jKHVuc2lnbmVkIGNoYXIgbmV0ZGV2X2lkLCBpbnQgc3JjX2lkKQoreworCWludCByZXQgPSAwOworCisJcHJpbnRmKCJuZXRhcGk6bmV0ZGV2X3BsdWdvdXRfcHJvYyBzdGFydCFuZXRkZXZfaWQ9JXVcbiIsIG5ldGRldl9pZCk7CisJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAibmV0YXBpOm5ldGRldl9wbHVnb3V0X3Byb2M6IG5ldGRldl9pZD0ldVxuIiwgbmV0ZGV2X2lkKTsKKwlwbHVnb3V0X3N0YXRlX3NldChuZXRkZXZfaWQpOworCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgIm5ldGRldl9wbHVnb3V0X3Byb2M6IG5ldGRldl9pZD0ldVxuIiwgbmV0ZGV2X2lkKTsKKwlyZXQgPSBpcGNfc2VuZF9tZXNzYWdlMihzcmNfaWQsIE1PRFVMRV9JRF9NQUlOX0NUUkwsIE1TR19DTURfTkVUX1BMVUdPVVQsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgKFVDSEFSICopJm5ldGRldl9pZCwgMCk7IC8qbGludCAhZTI2ICFlNTUqLworCisJaWYgKDAgIT0gcmV0KSB7CisJCXNvZnRhcF9hc3NlcnQoInNlbmQgbXNnIHRvIHp0ZV9yb3V0ZXIgZXJyb3IiKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmZGVmIF9VU0VfTUJJTQorCWlwY19zZW5kX21lc3NhZ2UyKHNyY19pZCwgTU9EVUxFX0lEX01CSU0sIE1TR19DTURfTkVUX1BMVUdPVVQsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgKFVDSEFSICopJm5ldGRldl9pZCwgMCk7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IHRjcGlwX3Jlc2V0X2NvbmZpZ3VyZQorKiC5psTcw+jK9qO6ILvWuLSz9rOnyejWw8qx08nl5Xp0ZV9ibGO9+LPMtffTw6Osyb6z/bPM0PLUy9DQ1tDJ+rPJtcTOxLz+CisqILLOyv3LtcP3o7ogzt4KKyogt7Ugu9gg1rWjuiDO3gorKiDG5Mv8y7XD96O6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0Y3BpcF9yZXNldF9jb25maWd1cmUoKQoreworCWNoYXIgY21kWzIwMF0gPSB7MH07CisJY2hhciBwYXRoX3NjcmlwdFs1MF0gPSB7MH07CisJY2hhciBwYXRoX2NvbmZbNTBdID0gezB9OworCWNoYXIgcGF0aF9maWxlWzIwMF0gPSB7MH07CisJcHJpbnRmKCJuZXRhcGk6dGNwaXBfcmVzZXRfY29uZmlndXJlIHN0YXJ0IVxuIik7CisJY2ZnX2dldF9pdGVtKCJwYXRoX2NvbmYiLCBwYXRoX2NvbmYsIHNpemVvZihwYXRoX2NvbmYpKTsKKwlzcHJpbnRmKHBhdGhfZmlsZSwgIiVzL2hvc3RuYW1lX21hY19maWxlIiwgcGF0aF9jb25mKTsKKworCisJLy+71ri0s/azp8no1sPKscm+s/1ob3N0bmFtZV9tYWNfZmlsZc7EvP4KKwlzcHJpbnRmKGNtZCwgIi9iaW4vcm0gLXJmICVzIiwgcGF0aF9maWxlKTsKKwl6eGljX3N5c3RlbShjbWQpOworCS8vu9a4tLP2s6fJ6NbDyrHJvrP9c3RhdGljX21hY2lwX2ZpbGUgIM7EvP4KKwltZW1zZXQocGF0aF9maWxlLCAwLCBzaXplb2YocGF0aF9maWxlKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy9zdGF0aWNfbWFjaXBfZmlsZSIsIHBhdGhfY29uZik7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCXNwcmludGYoY21kLCAiL2Jpbi9ybSAtcmYgJXMiLCBwYXRoX2ZpbGUpOworCXp4aWNfc3lzdGVtKGNtZCk7CisKKwltZW1zZXQocGF0aF9maWxlLCAwLCBzaXplb2YocGF0aF9maWxlKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy9jaGlsZHJlbl9kZXZpY2VfZmlsZSIsIHBhdGhfY29uZik7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCXNwcmludGYoY21kLCAiL2Jpbi9ybSAtcmYgJXMiLCBwYXRoX2ZpbGUpOworCXp4aWNfc3lzdGVtKGNtZCk7CisKKwltZW1zZXQocGF0aF9maWxlLCAwLCBzaXplb2YocGF0aF9maWxlKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy93aGl0ZV9zaXRlX2ZpbGUiLCBwYXRoX2NvbmYpOworCW1lbXNldChjbWQsIDAsIHNpemVvZihjbWQpKTsKKwlzcHJpbnRmKGNtZCwgIi9iaW4vcm0gLXJmICVzIiwgcGF0aF9maWxlKTsKKwl6eGljX3N5c3RlbShjbWQpOworCisJLypyZXNldCBERE5TIHN0YXR1cyBmaWxlKi8KKwltZW1zZXQocGF0aF9maWxlLCAwLCBzaXplb2YocGF0aF9maWxlKSk7CisJc3ByaW50ZihwYXRoX2ZpbGUsICIlcy9pbmFkeW4uc3RhdHVzIiwgcGF0aF9jb25mKTsKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoY21kKSk7CisJc3ByaW50ZihjbWQsICIvYmluL3JtIC1yZiAlcyIsIHBhdGhfZmlsZSk7CisJenhpY19zeXN0ZW0oY21kKTsKKworCS8vu9a4tLP2s6fJ6NbDyrG9q01BQy1JULDztqi55tTyx+W/1QorCWNmZ19nZXRfaXRlbSgicGF0aF9zaCIsIHBhdGhfc2NyaXB0LCBzaXplb2YocGF0aF9zY3JpcHQpKTsKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoY21kKSk7CisJc3ByaW50ZihjbWQsICIlcy9jb25maWctdWRoY3BkLnNoIFwibGFuXCIgLVMiLCBwYXRoX3NjcmlwdCk7CisJc29mdF9zeXN0ZW0oY21kKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILqvyv3D+7PGo7ogdGNfY29udHJvbAorKiC5psTcw+jK9qO6IMH3wb+/2NbGCisqILLOyv3LtcP3o7og0OjSqsH3wb+84L/YtcTJz8/C0NDBv6Osyv2+3b+o0OjSqtPQY2lko6x1ZmnEo8q9srvQ6NKqCisqICAgICAgICAgICAgMLHtyr6yu9Do0qrB97/Yo6y1pc67OmJpdKOs0vJsaW51eLHq17zD/MHuyse21NfWvdq0psDto6zL+dLU1+7W1cXk1sPWtbvh1fuz/TgKKyogt7Ugu9gg1rWjuiCy2df3s8m5pre1u9gxLgorKiDG5Mv8y7XD96O6ILj40OjSqsH3wb+/2NbGtcTTptPDtffTw6OsyOfJz9DQ0OjSqsH3v9ijrMfrtcjE3MnPzeLN+Lrz1Nm199PDo6y38dTyzt63qLvxyKHN4s34v9q9+NDQwfe/2AorKiAgICAgICAgICAgICAgICAg1f2zo7nYu/rW2NDCv6q7+qOs1q7HsMno1sO1xMH3v9jSwMi709DQpworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdGNfY29udHJvbChzdHJ1Y3QgdGNfY29udHJvbF9pbmZvICp0Y2luZm8sIGludCBzcmNfaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlwcmludGYoIm5ldGFwaTp0Y19jb250cm9sIHN0YXJ0ISBjX2lkOiVkLCBkb3duOiV1LCB1cDoldVxuLCBzcmM6JWQgXG4iLCB0Y2luZm8tPmNfaWQsIHRjaW5mby0+dGNfZG93bmxpbmssIHRjaW5mby0+dGNfdXBsaW5rLCBzcmNfaWQpOworCisJcmV0ID0gaXBjX3NlbmRfbWVzc2FnZShzcmNfaWQsIE1PRFVMRV9JRF9NQUlOX0NUUkwsIE1TR19DTURfTkVUX1RDX0NUUkwsIHNpemVvZihzdHJ1Y3QgdGNfY29udHJvbF9pbmZvKSwgKFVDSEFSICopdGNpbmZvLCAwKTsKKwlpZiAoMCAhPSByZXQpIHsKKwkJc29mdGFwX2Fzc2VydCgic2VuZCBtc2cgdG8genRlX3JvdXRlciBlcnJvciIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgMFg4OUYwCisjZGVmaW5lIFNJT0NWTEFOCQlTSU9DREVWUFJJVkFURSsweDAJCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiC6r8r9w/uzxqO6IHNldF9ldGh3YW5fbW9kZQorKiC5psTcw+jK9qO6IMno1sNzd2l0Y2jJ6LG4ZXRoMC4yMDDN+L/attTTprXEcG9ydDPOqndhbr/au7nKx2xhbr/aCisqILLOyv3LtcP3o7ogbW9kZToxID0+IHdhbr/ao6wwID0+IGxhbr/aCisqILe1ILvYINa1o7ogzt4uCisqIMbky/zLtcP3o7ogCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2V0X2V0aHdhbl9wb3J0X21vZGUoaW50IG1vZGUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJY2hhciBldGhfbmFtZVtJRk5BTVNJWl0gPSB7J2UnLCd0JywnaCcsJzAnfTsKKwkKKwlpZihtb2RlICE9IDAgJiYgbW9kZSAhPSAxKQorCXsKKwkJcmV0dXJuOworCX0KKwlzbG9nKE5FVF9QUklOVCwgU0xPR19FUlIsICJzZXRfZXRod2FuX3BvcnRfbW9kZSgpIG1vZGU9JWRcbiIsIG1vZGUpOwkKKwlpZiAoKGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKKwkJc2xvZyhORVRfUFJJTlQsIFNMT0dfRVJSLCAic2V0X2V0aDIwMF9tb2RlKCkgc29ja2V0KEFGX0lORVQsU09DS19TVFJFQU0pIGZhaWwiKTsKKwkJcmV0dXJuOworCX0KKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCW1lbWNweSgodm9pZCopaWZyLmlmcl9uYW1lLCAodm9pZCopZXRoX25hbWUsIHN0cmxlbigiZXRoMCIpKTsvL2dtYWPN+L/aw/uzxmV0aDCjrLrz0Pi/vMLHyse38c2ouf3QwtT2bnbP7rvxyKEKKwlpZnIuaWZyX2RhdGEgPSAodm9pZCopJm1vZGU7CisKKwlpZiAoaW9jdGwoZmQsIFNJT0NWTEFOLCAmaWZyKSA8IDAgJiYgZXJybm8gIT0gRUlOVkFMKSB7CisJCXNsb2coTkVUX1BSSU5ULCBTTE9HX0VSUiwgInNldF9ldGgyMDBfbW9kZSgpIGlvY3RsIGZhaWwiKTsJCQorCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisKKwljbG9zZShmZCk7CisKK30KKworCg==