LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBQcm9qZWN0TmFtZTogRkJURlQgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAqKioqKiAqKioqKgoJICAgICAgIGZvciB0aGUgUkE4ODc1IExDRCBDb250cm9sbGVyICAgICAqICAgICAqICAgICAgKioqKioqKioqKioqCgkJCQkJCSogICAqKiAgICoqICAgKiAgICAgICAgICAgKgogIENvcHlyaWdodCCpIGJ5IFBmQG5uZSAmIE5PVFJPICAgICAgICAgICAgICAgICogICAqICAgKiAgICogICAqICAgKioqKgkgICAqCgkJCQkJCSogICAqICAgICAgICogICAqICAgKiAgICogICAqCiAgTGFzdCBtb2RpZmljYXRpb24gYnk6ICAgICAgICAgICAgICAgICAgICAgICAgKiAgICogICAgICAgKiAgICogICAqKioqICAgICoKICAtIFBmQG5uZSAocGZAbm5lLW1haWwuZGUpICAgICAgICAgICAgICAgICAgICAgKiAgICogICAgICoqKioqICAgICAgICAgICAqCgkJCQkJCSAqICAgKiAgICAgICAgKiAgICoqKioqKioKCQkJCQkJICAqKioqKiAgICAgICogICAqCiAgRGF0ZSAgICA6IDEwLjA2LjIwMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAqCiAgVmVyc2lvbiA6IFYxLjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioKICBSZXZpc2lvbiA6IDUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgoKI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KI2luY2x1ZGUgImZidGZ0LmgiCgojZGVmaW5lIERSVk5BTUUgImZiX3JhODg3NSIKCnN0YXRpYyBpbnQgd3JpdGVfc3BpKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQp7CglzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHQgPSB7CgkJLnR4X2J1ZiA9IGJ1ZiwKCQkubGVuID0gbGVuLAoJCS5zcGVlZF9oeiA9IDEwMDAwMDAsCgl9OwoJc3RydWN0IHNwaV9tZXNzYWdlIG07CgoJZmJ0ZnRfcGFyX2RiZ19oZXgoREVCVUdfV1JJVEUsIHBhciwgcGFyLT5pbmZvLT5kZXZpY2UsIHU4LCBidWYsIGxlbiwKCQkiJXMobGVuPSVkKTogIiwgX19mdW5jX18sIGxlbik7CgoJaWYgKCFwYXItPnNwaSkgewoJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCgkJCSIlczogcGFyLT5zcGkgaXMgdW5leHBlY3RlZGx5IE5VTExcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm4gLTE7Cgl9CgoJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CglpZiAocGFyLT50eGJ1Zi5kbWEgJiYgYnVmID09IHBhci0+dHhidWYuYnVmKSB7CgkJdC50eF9kbWEgPSBwYXItPnR4YnVmLmRtYTsKCQltLmlzX2RtYV9tYXBwZWQgPSAxOwoJfQoJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKCXJldHVybiBzcGlfc3luYyhwYXItPnNwaSwgJm0pOwp9CgpzdGF0aWMgaW50IGluaXRfZGlzcGxheShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCnsKCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYywgMSk7CgoJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwKCQkiJXMoKVxuIiwgX19mdW5jX18pOwoJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwKCQkiZGlzcGxheSBzaXplICVkeCVkXG4iLCBwYXItPmluZm8tPnZhci54cmVzLCBwYXItPmluZm8tPnZhci55cmVzKTsKCglwYXItPmZidGZ0b3BzLnJlc2V0KHBhcik7CgoJaWYgKChwYXItPmluZm8tPnZhci54cmVzID09IDMyMCkgJiYgKHBhci0+aW5mby0+dmFyLnlyZXMgPT0gMjQwKSkgewoJCS8qIFBMTCBjbG9jayBmcmVxdWVuY3kgKi8KCQl3cml0ZV9yZWcocGFyLCAweDg4LCAweDBBKTsKCQl3cml0ZV9yZWcocGFyLCAweDg5LCAweDAyKTsKCQltZGVsYXkoMTApOwoJCS8qIGNvbG9yIGRlZXAgLyBNQ1UgSW50ZXJmYWNlICovCgkJd3JpdGVfcmVnKHBhciwgMHgxMCwgMHgwQyk7CgkJLyogcGl4ZWwgY2xvY2sgcGVyaW9kICAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MDQsIDB4MDMpOwoJCW1kZWxheSgxKTsKCQkvKiBob3Jpem9udGFsIHNldHRpbmdzICovCgkJd3JpdGVfcmVnKHBhciwgMHgxNCwgMHgyNyk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNSwgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNiwgMHgwNSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNywgMHgwNCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxOCwgMHgwMyk7CgkJLyogdmVydGljYWwgc2V0dGluZ3MgKi8KCQl3cml0ZV9yZWcocGFyLCAweDE5LCAweEVGKTsKCQl3cml0ZV9yZWcocGFyLCAweDFBLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFCLCAweDA1KTsKCQl3cml0ZV9yZWcocGFyLCAweDFDLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFELCAweDBFKTsKCQl3cml0ZV9yZWcocGFyLCAweDFFLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFGLCAweDAyKTsKCX0gZWxzZSBpZiAoKHBhci0+aW5mby0+dmFyLnhyZXMgPT0gNDgwKSAmJiAocGFyLT5pbmZvLT52YXIueXJlcyA9PSAyNzIpKSB7CgkJLyogUExMIGNsb2NrIGZyZXF1ZW5jeSAgKi8KCQl3cml0ZV9yZWcocGFyLCAweDg4LCAweDBBKTsKCQl3cml0ZV9yZWcocGFyLCAweDg5LCAweDAyKTsKCQltZGVsYXkoMTApOwoJCS8qIGNvbG9yIGRlZXAgLyBNQ1UgSW50ZXJmYWNlICovCgkJd3JpdGVfcmVnKHBhciwgMHgxMCwgMHgwQyk7CgkJLyogcGl4ZWwgY2xvY2sgcGVyaW9kICAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MDQsIDB4ODIpOwoJCW1kZWxheSgxKTsKCQkvKiBob3Jpem9udGFsIHNldHRpbmdzICovCgkJd3JpdGVfcmVnKHBhciwgMHgxNCwgMHgzQik7CgkJd3JpdGVfcmVnKHBhciwgMHgxNSwgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNiwgMHgwMSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNywgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxOCwgMHgwNSk7CgkJLyogdmVydGljYWwgc2V0dGluZ3MgKi8KCQl3cml0ZV9yZWcocGFyLCAweDE5LCAweDBGKTsKCQl3cml0ZV9yZWcocGFyLCAweDFBLCAweDAxKTsKCQl3cml0ZV9yZWcocGFyLCAweDFCLCAweDAyKTsKCQl3cml0ZV9yZWcocGFyLCAweDFDLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFELCAweDA3KTsKCQl3cml0ZV9yZWcocGFyLCAweDFFLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFGLCAweDA5KTsKCX0gZWxzZSBpZiAoKHBhci0+aW5mby0+dmFyLnhyZXMgPT0gNjQwKSAmJiAocGFyLT5pbmZvLT52YXIueXJlcyA9PSA0ODApKSB7CgkJLyogUExMIGNsb2NrIGZyZXF1ZW5jeSAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4ODgsIDB4MEIpOwoJCXdyaXRlX3JlZyhwYXIsIDB4ODksIDB4MDIpOwoJCW1kZWxheSgxMCk7CgkJLyogY29sb3IgZGVlcCAvIE1DVSBJbnRlcmZhY2UgKi8KCQl3cml0ZV9yZWcocGFyLCAweDEwLCAweDBDKTsKCQkvKiBwaXhlbCBjbG9jayBwZXJpb2QgKi8KCQl3cml0ZV9yZWcocGFyLCAweDA0LCAweDAxKTsKCQltZGVsYXkoMSk7CgkJLyogaG9yaXpvbnRhbCBzZXR0aW5ncyAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MTQsIDB4NEYpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MTUsIDB4MDUpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MTYsIDB4MEYpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MTcsIDB4MDEpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MTgsIDB4MDApOwoJCS8qIHZlcnRpY2FsIHNldHRpbmdzICovCgkJd3JpdGVfcmVnKHBhciwgMHgxOSwgMHhERik7CgkJd3JpdGVfcmVnKHBhciwgMHgxQSwgMHgwMSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxQiwgMHgwQSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxQywgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxRCwgMHgwRSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxRSwgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxRiwgMHgwMSk7Cgl9IGVsc2UgaWYgKChwYXItPmluZm8tPnZhci54cmVzID09IDgwMCkgJiYgKHBhci0+aW5mby0+dmFyLnlyZXMgPT0gNDgwKSkgewoJCS8qIFBMTCBjbG9jayBmcmVxdWVuY3kgKi8KCQl3cml0ZV9yZWcocGFyLCAweDg4LCAweDBCKTsKCQl3cml0ZV9yZWcocGFyLCAweDg5LCAweDAyKTsKCQltZGVsYXkoMTApOwoJCS8qIGNvbG9yIGRlZXAgLyBNQ1UgSW50ZXJmYWNlICovCgkJd3JpdGVfcmVnKHBhciwgMHgxMCwgMHgwQyk7CgkJLyogcGl4ZWwgY2xvY2sgcGVyaW9kICovCgkJd3JpdGVfcmVnKHBhciwgMHgwNCwgMHg4MSk7CgkJbWRlbGF5KDEpOwoJCS8qIGhvcml6b250YWwgc2V0dGluZ3MgKi8KCQl3cml0ZV9yZWcocGFyLCAweDE0LCAweDYzKTsKCQl3cml0ZV9yZWcocGFyLCAweDE1LCAweDAzKTsKCQl3cml0ZV9yZWcocGFyLCAweDE2LCAweDAzKTsKCQl3cml0ZV9yZWcocGFyLCAweDE3LCAweDAyKTsKCQl3cml0ZV9yZWcocGFyLCAweDE4LCAweDAwKTsKCQkvKiB2ZXJ0aWNhbCBzZXR0aW5ncyAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MTksIDB4REYpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MUEsIDB4MDEpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MUIsIDB4MTQpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MUMsIDB4MDApOwoJCXdyaXRlX3JlZyhwYXIsIDB4MUQsIDB4MDYpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MUUsIDB4MDApOwoJCXdyaXRlX3JlZyhwYXIsIDB4MUYsIDB4MDEpOwoJfSBlbHNlIHsKCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAiZGlzcGxheSBzaXplIGlzIG5vdCBzdXBwb3J0ZWQhISIpOwoJCXJldHVybiAtMTsKCX0KCgkvKiBQV00gY2xvY2sgKi8KCXdyaXRlX3JlZyhwYXIsIDB4OGEsIDB4ODEpOwoJd3JpdGVfcmVnKHBhciwgMHg4YiwgMHhGRik7CgltZGVsYXkoMTApOwoKCS8qIERpc3BsYXkgT04gKi8KCXdyaXRlX3JlZyhwYXIsIDB4MDEsIDB4ODApOwoJbWRlbGF5KDEwKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgc2V0X2FkZHJfd2luKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgaW50IHhzLCBpbnQgeXMsIGludCB4ZSwgaW50IHllKQp7CglmYnRmdF9wYXJfZGJnKERFQlVHX1NFVF9BRERSX1dJTiwgcGFyLAoJCSIlcyh4cz0lZCwgeXM9JWQsIHhlPSVkLCB5ZT0lZClcbiIsIF9fZnVuY19fLCB4cywgeXMsIHhlLCB5ZSk7CgoJLyogU2V0X0FjdGl2ZV9XaW5kb3cgKi8KCXdyaXRlX3JlZyhwYXIsIDB4MzAsIHhzICYgMHgwMEZGKTsKCXdyaXRlX3JlZyhwYXIsIDB4MzEsICh4cyAmIDB4RkYwMCkgPj4gOCk7Cgl3cml0ZV9yZWcocGFyLCAweDMyLCB5cyAmIDB4MDBGRik7Cgl3cml0ZV9yZWcocGFyLCAweDMzLCAoeXMgJiAweEZGMDApID4+IDgpOwoJd3JpdGVfcmVnKHBhciwgMHgzNCwgKHhzK3hlKSAmIDB4MDBGRik7Cgl3cml0ZV9yZWcocGFyLCAweDM1LCAoKHhzK3hlKSAmIDB4RkYwMCkgPj4gOCk7Cgl3cml0ZV9yZWcocGFyLCAweDM2LCAoeXMreWUpICYgMHgwMEZGKTsKCXdyaXRlX3JlZyhwYXIsIDB4MzcsICgoeXMreWUpICYgMHhGRjAwKSA+PiA4KTsKCgkvKiBTZXRfTWVtb3J5X1dyaXRlX0N1cnNvciAqLwoJd3JpdGVfcmVnKHBhciwgMHg0NiwgIHhzICYgMHhmZik7Cgl3cml0ZV9yZWcocGFyLCAweDQ3LCAoeHMgPj4gOCkgJiAweDAzKTsKCXdyaXRlX3JlZyhwYXIsIDB4NDgsICB5cyAmIDB4ZmYpOwoJd3JpdGVfcmVnKHBhciwgMHg0OSwgKHlzID4+IDgpICYgMHgwMSk7CgoJd3JpdGVfcmVnKHBhciwgMHgwMik7Cn0KCnN0YXRpYyB2b2lkIHdyaXRlX3JlZzhfYnVzOChzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIGludCBsZW4sIC4uLikKewoJdmFfbGlzdCBhcmdzOwoJaW50IGksIHJldDsKCXU4ICpidWYgPSAodTggKilwYXItPmJ1ZjsKCgkvKiBzbG93IGRvd24gc3BpLXNwZWVkIGZvciB3cml0aW5nIHJlZ2lzdGVycyAqLwoJcGFyLT5mYnRmdG9wcy53cml0ZSA9IHdyaXRlX3NwaTsKCglpZiAodW5saWtlbHkocGFyLT5kZWJ1ZyAmIERFQlVHX1dSSVRFX1JFR0lTVEVSKSkgewoJCXZhX3N0YXJ0KGFyZ3MsIGxlbik7CgkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQoJCQlidWZbaV0gPSAodTgpdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CgkJdmFfZW5kKGFyZ3MpOwoJCWZidGZ0X3Bhcl9kYmdfaGV4KERFQlVHX1dSSVRFX1JFR0lTVEVSLCBwYXIsIHBhci0+aW5mby0+ZGV2aWNlLAoJCQl1OCwgYnVmLCBsZW4sICIlczogIiwgX19mdW5jX18pOwoJfQoKCXZhX3N0YXJ0KGFyZ3MsIGxlbik7CgkqYnVmKysgPSAweDgwOwoJKmJ1ZiA9ICh1OCl2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBwYXItPmJ1ZiwgMik7CglpZiAocmV0IDwgMCkgewoJCXZhX2VuZChhcmdzKTsKCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAid3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkbiIsCgkJCXJldCk7CgkJcmV0dXJuOwoJfQoJbGVuLS07CgoJdWRlbGF5KDEwMCk7CgoJaWYgKGxlbikgewoJCWJ1ZiA9ICh1OCAqKXBhci0+YnVmOwoJCSpidWYrKyA9IDB4MDA7CgkJaSA9IGxlbjsKCQl3aGlsZSAoaS0tKQoJCQkqYnVmKysgPSAodTgpdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CgoJCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBwYXItPmJ1ZiwgbGVuICsgMSk7CgkJaWYgKHJldCA8IDApIHsKCQkJdmFfZW5kKGFyZ3MpOwoJCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAoJCQkJIndyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZG4iLCByZXQpOwoJCQlyZXR1cm47CgkJfQoJfQoJdmFfZW5kKGFyZ3MpOwoKCS8qIHJlc3RvcmUgdXNlciBzcGktc3BlZWQgKi8KCXBhci0+ZmJ0ZnRvcHMud3JpdGUgPSBmYnRmdF93cml0ZV9zcGk7Cgl1ZGVsYXkoMTAwKTsKfQoKc3RhdGljIGludCB3cml0ZV92bWVtMTZfYnVzOChzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW4pCnsKCXUxNiAqdm1lbTE2OwoJdTE2ICp0eGJ1ZjE2ID0gKHUxNiAqKXBhci0+dHhidWYuYnVmOwoJc2l6ZV90IHJlbWFpbjsKCXNpemVfdCB0b19jb3B5OwoJc2l6ZV90IHR4X2FycmF5X3NpemU7CglpbnQgaTsKCWludCByZXQgPSAwOwoJc2l6ZV90IHN0YXJ0Ynl0ZV9zaXplID0gMDsKCglmYnRmdF9wYXJfZGJnKERFQlVHX1dSSVRFX1ZNRU0sIHBhciwgIiVzKG9mZnNldD0lenUsIGxlbj0lenUpXG4iLAoJCV9fZnVuY19fLCBvZmZzZXQsIGxlbik7CgoJcmVtYWluID0gbGVuIC8gMjsKCXZtZW0xNiA9ICh1MTYgKikocGFyLT5pbmZvLT5zY3JlZW5fYmFzZSArIG9mZnNldCk7Cgl0eF9hcnJheV9zaXplID0gcGFyLT50eGJ1Zi5sZW4gLyAyOwoJCXR4YnVmMTYgPSAodTE2ICopKHBhci0+dHhidWYuYnVmICsgMSk7CgkJdHhfYXJyYXlfc2l6ZSAtPSAyOwoJCSoodTggKikocGFyLT50eGJ1Zi5idWYpID0gMHgwMDsKCQlzdGFydGJ5dGVfc2l6ZSA9IDE7CgoJd2hpbGUgKHJlbWFpbikgewoJCXRvX2NvcHkgPSByZW1haW4gPiB0eF9hcnJheV9zaXplID8gdHhfYXJyYXlfc2l6ZSA6IHJlbWFpbjsKCQlkZXZfZGJnKHBhci0+aW5mby0+ZGV2aWNlLCAiICAgIHRvX2NvcHk9JXp1LCByZW1haW49JXp1XG4iLAoJCQl0b19jb3B5LCByZW1haW4gLSB0b19jb3B5KTsKCgkJZm9yIChpID0gMDsgaSA8IHRvX2NvcHk7IGkrKykKCQkJdHhidWYxNltpXSA9IGNwdV90b19iZTE2KHZtZW0xNltpXSk7CgoJCXZtZW0xNiA9IHZtZW0xNiArIHRvX2NvcHk7CgkJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIHBhci0+dHhidWYuYnVmLAoJCQlzdGFydGJ5dGVfc2l6ZSArIHRvX2NvcHkgKiAyKTsKCQlpZiAocmV0IDwgMCkKCQkJcmV0dXJuIHJldDsKCQlyZW1haW4gLT0gdG9fY29weTsKCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgc3RydWN0IGZidGZ0X2Rpc3BsYXkgZGlzcGxheSA9IHsKCS5yZWd3aWR0aCA9IDgsCgkuZmJ0ZnRvcHMgPSB7CgkJLmluaXRfZGlzcGxheSA9IGluaXRfZGlzcGxheSwKCQkuc2V0X2FkZHJfd2luID0gc2V0X2FkZHJfd2luLAoJCS53cml0ZV9yZWdpc3RlciA9IHdyaXRlX3JlZzhfYnVzOCwKCQkud3JpdGVfdm1lbSA9IHdyaXRlX3ZtZW0xNl9idXM4LAoJCS53cml0ZSA9IHdyaXRlX3NwaSwKCX0sCn07CkZCVEZUX1JFR0lTVEVSX0RSSVZFUihEUlZOQU1FLCAicmFpbyxyYTg4NzUiLCAmZGlzcGxheSk7CgpNT0RVTEVfQUxJQVMoInNwaToiIERSVk5BTUUpOwpNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWTkFNRSk7Ck1PRFVMRV9BTElBUygic3BpOnJhODg3NSIpOwpNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJhODg3NSIpOwoKTU9EVUxFX0RFU0NSSVBUSU9OKCJGQiBkcml2ZXIgZm9yIHRoZSBSQTg4NzUgTENEIENvbnRyb2xsZXIiKTsKTU9EVUxFX0FVVEhPUigiUGZAbm5lIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK