LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBQcm9qZWN0TmFtZTogRkJURlQgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAqKioqKiAqKioqKgoJICAgICAgIGZvciB0aGUgUkE4ODc1IExDRCBDb250cm9sbGVyICAgICAqICAgICAqICAgICAgKioqKioqKioqKioqCgkJCQkJCSogICAqKiAgICoqICAgKiAgICAgICAgICAgKgogIENvcHlyaWdodCCpIGJ5IFBmQG5uZSAmIE5PVFJPICAgICAgICAgICAgICAgICogICAqICAgKiAgICogICAqICAgKioqKgkgICAqCgkJCQkJCSogICAqICAgICAgICogICAqICAgKiAgICogICAqCiAgTGFzdCBtb2RpZmljYXRpb24gYnk6ICAgICAgICAgICAgICAgICAgICAgICAgKiAgICogICAgICAgKiAgICogICAqKioqICAgICoKICAtIFBmQG5uZSAocGZAbm5lLW1haWwuZGUpICAgICAgICAgICAgICAgICAgICAgKiAgICogICAgICoqKioqICAgICAgICAgICAqCgkJCQkJCSAqICAgKiAgICAgICAgKiAgICoqKioqKioKCQkJCQkJICAqKioqKiAgICAgICogICAqCiAgRGF0ZSAgICA6IDEwLjA2LjIwMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAqCiAgVmVyc2lvbiA6IFYxLjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioKICBSZXZpc2lvbiA6IDUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgoKI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KI2luY2x1ZGUgImZidGZ0LmgiCgojZGVmaW5lIERSVk5BTUUgImZiX3JhODg3NSIKCnN0YXRpYyBpbnQgd3JpdGVfc3BpKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQp7CglzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHQgPSB7CgkJLnR4X2J1ZiA9IGJ1ZiwKCQkubGVuID0gbGVuLAoJCS5zcGVlZF9oeiA9IDEwMDAwMDAsCgl9OwoJc3RydWN0IHNwaV9tZXNzYWdlIG07CgoJZmJ0ZnRfcGFyX2RiZ19oZXgoREVCVUdfV1JJVEUsIHBhciwgcGFyLT5pbmZvLT5kZXZpY2UsIHU4LCBidWYsIGxlbiwKCQkiJXMobGVuPSVkKTogIiwgX19mdW5jX18sIGxlbik7CgoJaWYgKCFwYXItPnNwaSkgewoJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCgkJCSIlczogcGFyLT5zcGkgaXMgdW5leHBlY3RlZGx5IE5VTExcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm4gLTE7Cgl9CgoJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CglpZiAocGFyLT50eGJ1Zi5kbWEgJiYgYnVmID09IHBhci0+dHhidWYuYnVmKSB7CgkJdC50eF9kbWEgPSBwYXItPnR4YnVmLmRtYTsKCQltLmlzX2RtYV9tYXBwZWQgPSAxOwoJfQoJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKCXJldHVybiBzcGlfc3luYyhwYXItPnNwaSwgJm0pOwp9CgpzdGF0aWMgaW50IGluaXRfZGlzcGxheShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCnsKCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYywgMSk7CgoJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwKCQkiJXMoKVxuIiwgX19mdW5jX18pOwoJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwKCQkiZGlzcGxheSBzaXplICVkeCVkXG4iLAoJCXBhci0+aW5mby0+dmFyLnhyZXMsCgkJcGFyLT5pbmZvLT52YXIueXJlcyk7CgoJcGFyLT5mYnRmdG9wcy5yZXNldChwYXIpOwoKCWlmICgocGFyLT5pbmZvLT52YXIueHJlcyA9PSAzMjApICYmIChwYXItPmluZm8tPnZhci55cmVzID09IDI0MCkpIHsKCQkvKiBQTEwgY2xvY2sgZnJlcXVlbmN5ICovCgkJd3JpdGVfcmVnKHBhciwgMHg4OCwgMHgwQSk7CgkJd3JpdGVfcmVnKHBhciwgMHg4OSwgMHgwMik7CgkJbWRlbGF5KDEwKTsKCQkvKiBjb2xvciBkZWVwIC8gTUNVIEludGVyZmFjZSAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MTAsIDB4MEMpOwoJCS8qIHBpeGVsIGNsb2NrIHBlcmlvZCAgKi8KCQl3cml0ZV9yZWcocGFyLCAweDA0LCAweDAzKTsKCQltZGVsYXkoMSk7CgkJLyogaG9yaXpvbnRhbCBzZXR0aW5ncyAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MTQsIDB4MjcpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MTUsIDB4MDApOwoJCXdyaXRlX3JlZyhwYXIsIDB4MTYsIDB4MDUpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MTcsIDB4MDQpOwoJCXdyaXRlX3JlZyhwYXIsIDB4MTgsIDB4MDMpOwoJCS8qIHZlcnRpY2FsIHNldHRpbmdzICovCgkJd3JpdGVfcmVnKHBhciwgMHgxOSwgMHhFRik7CgkJd3JpdGVfcmVnKHBhciwgMHgxQSwgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxQiwgMHgwNSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxQywgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxRCwgMHgwRSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxRSwgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxRiwgMHgwMik7Cgl9IGVsc2UgaWYgKChwYXItPmluZm8tPnZhci54cmVzID09IDQ4MCkgJiYKCQkgICAocGFyLT5pbmZvLT52YXIueXJlcyA9PSAyNzIpKSB7CgkJLyogUExMIGNsb2NrIGZyZXF1ZW5jeSAgKi8KCQl3cml0ZV9yZWcocGFyLCAweDg4LCAweDBBKTsKCQl3cml0ZV9yZWcocGFyLCAweDg5LCAweDAyKTsKCQltZGVsYXkoMTApOwoJCS8qIGNvbG9yIGRlZXAgLyBNQ1UgSW50ZXJmYWNlICovCgkJd3JpdGVfcmVnKHBhciwgMHgxMCwgMHgwQyk7CgkJLyogcGl4ZWwgY2xvY2sgcGVyaW9kICAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MDQsIDB4ODIpOwoJCW1kZWxheSgxKTsKCQkvKiBob3Jpem9udGFsIHNldHRpbmdzICovCgkJd3JpdGVfcmVnKHBhciwgMHgxNCwgMHgzQik7CgkJd3JpdGVfcmVnKHBhciwgMHgxNSwgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNiwgMHgwMSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNywgMHgwMCk7CgkJd3JpdGVfcmVnKHBhciwgMHgxOCwgMHgwNSk7CgkJLyogdmVydGljYWwgc2V0dGluZ3MgKi8KCQl3cml0ZV9yZWcocGFyLCAweDE5LCAweDBGKTsKCQl3cml0ZV9yZWcocGFyLCAweDFBLCAweDAxKTsKCQl3cml0ZV9yZWcocGFyLCAweDFCLCAweDAyKTsKCQl3cml0ZV9yZWcocGFyLCAweDFDLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFELCAweDA3KTsKCQl3cml0ZV9yZWcocGFyLCAweDFFLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFGLCAweDA5KTsKCX0gZWxzZSBpZiAoKHBhci0+aW5mby0+dmFyLnhyZXMgPT0gNjQwKSAmJgoJCSAgIChwYXItPmluZm8tPnZhci55cmVzID09IDQ4MCkpIHsKCQkvKiBQTEwgY2xvY2sgZnJlcXVlbmN5ICovCgkJd3JpdGVfcmVnKHBhciwgMHg4OCwgMHgwQik7CgkJd3JpdGVfcmVnKHBhciwgMHg4OSwgMHgwMik7CgkJbWRlbGF5KDEwKTsKCQkvKiBjb2xvciBkZWVwIC8gTUNVIEludGVyZmFjZSAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MTAsIDB4MEMpOwoJCS8qIHBpeGVsIGNsb2NrIHBlcmlvZCAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MDQsIDB4MDEpOwoJCW1kZWxheSgxKTsKCQkvKiBob3Jpem9udGFsIHNldHRpbmdzICovCgkJd3JpdGVfcmVnKHBhciwgMHgxNCwgMHg0Rik7CgkJd3JpdGVfcmVnKHBhciwgMHgxNSwgMHgwNSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNiwgMHgwRik7CgkJd3JpdGVfcmVnKHBhciwgMHgxNywgMHgwMSk7CgkJd3JpdGVfcmVnKHBhciwgMHgxOCwgMHgwMCk7CgkJLyogdmVydGljYWwgc2V0dGluZ3MgKi8KCQl3cml0ZV9yZWcocGFyLCAweDE5LCAweERGKTsKCQl3cml0ZV9yZWcocGFyLCAweDFBLCAweDAxKTsKCQl3cml0ZV9yZWcocGFyLCAweDFCLCAweDBBKTsKCQl3cml0ZV9yZWcocGFyLCAweDFDLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFELCAweDBFKTsKCQl3cml0ZV9yZWcocGFyLCAweDFFLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFGLCAweDAxKTsKCX0gZWxzZSBpZiAoKHBhci0+aW5mby0+dmFyLnhyZXMgPT0gODAwKSAmJgoJCSAgIChwYXItPmluZm8tPnZhci55cmVzID09IDQ4MCkpIHsKCQkvKiBQTEwgY2xvY2sgZnJlcXVlbmN5ICovCgkJd3JpdGVfcmVnKHBhciwgMHg4OCwgMHgwQik7CgkJd3JpdGVfcmVnKHBhciwgMHg4OSwgMHgwMik7CgkJbWRlbGF5KDEwKTsKCQkvKiBjb2xvciBkZWVwIC8gTUNVIEludGVyZmFjZSAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MTAsIDB4MEMpOwoJCS8qIHBpeGVsIGNsb2NrIHBlcmlvZCAqLwoJCXdyaXRlX3JlZyhwYXIsIDB4MDQsIDB4ODEpOwoJCW1kZWxheSgxKTsKCQkvKiBob3Jpem9udGFsIHNldHRpbmdzICovCgkJd3JpdGVfcmVnKHBhciwgMHgxNCwgMHg2Myk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNSwgMHgwMyk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNiwgMHgwMyk7CgkJd3JpdGVfcmVnKHBhciwgMHgxNywgMHgwMik7CgkJd3JpdGVfcmVnKHBhciwgMHgxOCwgMHgwMCk7CgkJLyogdmVydGljYWwgc2V0dGluZ3MgKi8KCQl3cml0ZV9yZWcocGFyLCAweDE5LCAweERGKTsKCQl3cml0ZV9yZWcocGFyLCAweDFBLCAweDAxKTsKCQl3cml0ZV9yZWcocGFyLCAweDFCLCAweDE0KTsKCQl3cml0ZV9yZWcocGFyLCAweDFDLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFELCAweDA2KTsKCQl3cml0ZV9yZWcocGFyLCAweDFFLCAweDAwKTsKCQl3cml0ZV9yZWcocGFyLCAweDFGLCAweDAxKTsKCX0gZWxzZSB7CgkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgImRpc3BsYXkgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkISEiKTsKCQlyZXR1cm4gLTE7Cgl9CgoJLyogUFdNIGNsb2NrICovCgl3cml0ZV9yZWcocGFyLCAweDhhLCAweDgxKTsKCXdyaXRlX3JlZyhwYXIsIDB4OGIsIDB4RkYpOwoJbWRlbGF5KDEwKTsKCgkvKiBEaXNwbGF5IE9OICovCgl3cml0ZV9yZWcocGFyLCAweDAxLCAweDgwKTsKCW1kZWxheSgxMCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHNldF9hZGRyX3dpbihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIGludCB4cywgaW50IHlzLCBpbnQgeGUsIGludCB5ZSkKewoJZmJ0ZnRfcGFyX2RiZyhERUJVR19TRVRfQUREUl9XSU4sIHBhciwKCQkiJXMoeHM9JWQsIHlzPSVkLCB4ZT0lZCwgeWU9JWQpXG4iLCBfX2Z1bmNfXywgeHMsIHlzLCB4ZSwgeWUpOwoKCS8qIFNldF9BY3RpdmVfV2luZG93ICovCgl3cml0ZV9yZWcocGFyLCAweDMwLCB4cyAmIDB4MDBGRik7Cgl3cml0ZV9yZWcocGFyLCAweDMxLCAoeHMgJiAweEZGMDApID4+IDgpOwoJd3JpdGVfcmVnKHBhciwgMHgzMiwgeXMgJiAweDAwRkYpOwoJd3JpdGVfcmVnKHBhciwgMHgzMywgKHlzICYgMHhGRjAwKSA+PiA4KTsKCXdyaXRlX3JlZyhwYXIsIDB4MzQsICh4cyt4ZSkgJiAweDAwRkYpOwoJd3JpdGVfcmVnKHBhciwgMHgzNSwgKCh4cyt4ZSkgJiAweEZGMDApID4+IDgpOwoJd3JpdGVfcmVnKHBhciwgMHgzNiwgKHlzK3llKSAmIDB4MDBGRik7Cgl3cml0ZV9yZWcocGFyLCAweDM3LCAoKHlzK3llKSAmIDB4RkYwMCkgPj4gOCk7CgoJLyogU2V0X01lbW9yeV9Xcml0ZV9DdXJzb3IgKi8KCXdyaXRlX3JlZyhwYXIsIDB4NDYsICB4cyAmIDB4ZmYpOwoJd3JpdGVfcmVnKHBhciwgMHg0NywgKHhzID4+IDgpICYgMHgwMyk7Cgl3cml0ZV9yZWcocGFyLCAweDQ4LCAgeXMgJiAweGZmKTsKCXdyaXRlX3JlZyhwYXIsIDB4NDksICh5cyA+PiA4KSAmIDB4MDEpOwoKCXdyaXRlX3JlZyhwYXIsIDB4MDIpOwp9CgpzdGF0aWMgdm9pZCB3cml0ZV9yZWc4X2J1czgoc3RydWN0IGZidGZ0X3BhciAqcGFyLCBpbnQgbGVuLCAuLi4pCnsKCXZhX2xpc3QgYXJnczsKCWludCBpLCByZXQ7Cgl1OCAqYnVmID0gKHU4ICopcGFyLT5idWY7CgoJLyogc2xvdyBkb3duIHNwaS1zcGVlZCBmb3Igd3JpdGluZyByZWdpc3RlcnMgKi8KCXBhci0+ZmJ0ZnRvcHMud3JpdGUgPSB3cml0ZV9zcGk7CgoJaWYgKHVubGlrZWx5KHBhci0+ZGVidWcgJiBERUJVR19XUklURV9SRUdJU1RFUikpIHsKCQl2YV9zdGFydChhcmdzLCBsZW4pOwoJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKCQkJYnVmW2ldID0gKHU4KXZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOwoJCXZhX2VuZChhcmdzKTsKCQlmYnRmdF9wYXJfZGJnX2hleChERUJVR19XUklURV9SRUdJU1RFUiwgcGFyLCBwYXItPmluZm8tPmRldmljZSwKCQkJdTgsIGJ1ZiwgbGVuLCAiJXM6ICIsIF9fZnVuY19fKTsKCX0KCgl2YV9zdGFydChhcmdzLCBsZW4pOwoJKmJ1ZisrID0gMHg4MDsKCSpidWYgPSAodTgpdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CglyZXQgPSBwYXItPmZidGZ0b3BzLndyaXRlKHBhciwgcGFyLT5idWYsIDIpOwoJaWYgKHJldCA8IDApIHsKCQl2YV9lbmQoYXJncyk7CgkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIndyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZG4iLAoJCQlyZXQpOwoJCXJldHVybjsKCX0KCWxlbi0tOwoKCXVkZWxheSgxMDApOwoKCWlmIChsZW4pIHsKCQlidWYgPSAodTggKilwYXItPmJ1ZjsKCQkqYnVmKysgPSAweDAwOwoJCWkgPSBsZW47CgkJd2hpbGUgKGktLSkKCQkJKmJ1ZisrID0gKHU4KXZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQpOwoKCQlyZXQgPSBwYXItPmZidGZ0b3BzLndyaXRlKHBhciwgcGFyLT5idWYsIGxlbiArIDEpOwoJCWlmIChyZXQgPCAwKSB7CgkJCXZhX2VuZChhcmdzKTsKCQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKCQkJCSJ3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRuIiwgcmV0KTsKCQkJcmV0dXJuOwoJCX0KCX0KCXZhX2VuZChhcmdzKTsKCgkvKiByZXN0b3JlIHVzZXIgc3BpLXNwZWVkICovCglwYXItPmZidGZ0b3BzLndyaXRlID0gZmJ0ZnRfd3JpdGVfc3BpOwoJdWRlbGF5KDEwMCk7Cn0KCnN0YXRpYyBpbnQgd3JpdGVfdm1lbTE2X2J1czgoc3RydWN0IGZidGZ0X3BhciAqcGFyLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuKQp7Cgl1MTYgKnZtZW0xNjsKCXUxNiAqdHhidWYxNiA9ICh1MTYgKilwYXItPnR4YnVmLmJ1ZjsKCXNpemVfdCByZW1haW47CglzaXplX3QgdG9fY29weTsKCXNpemVfdCB0eF9hcnJheV9zaXplOwoJaW50IGk7CglpbnQgcmV0ID0gMDsKCXNpemVfdCBzdGFydGJ5dGVfc2l6ZSA9IDA7CgoJZmJ0ZnRfcGFyX2RiZyhERUJVR19XUklURV9WTUVNLCBwYXIsICIlcyhvZmZzZXQ9JXp1LCBsZW49JXp1KVxuIiwKCQlfX2Z1bmNfXywgb2Zmc2V0LCBsZW4pOwoKCXJlbWFpbiA9IGxlbiAvIDI7Cgl2bWVtMTYgPSAodTE2ICopKHBhci0+aW5mby0+c2NyZWVuX2Jhc2UgKyBvZmZzZXQpOwoJdHhfYXJyYXlfc2l6ZSA9IHBhci0+dHhidWYubGVuIC8gMjsKCQl0eGJ1ZjE2ID0gKHUxNiAqKShwYXItPnR4YnVmLmJ1ZiArIDEpOwoJCXR4X2FycmF5X3NpemUgLT0gMjsKCQkqKHU4ICopKHBhci0+dHhidWYuYnVmKSA9IDB4MDA7CgkJc3RhcnRieXRlX3NpemUgPSAxOwoKCXdoaWxlIChyZW1haW4pIHsKCQl0b19jb3B5ID0gcmVtYWluID4gdHhfYXJyYXlfc2l6ZSA/IHR4X2FycmF5X3NpemUgOiByZW1haW47CgkJZGV2X2RiZyhwYXItPmluZm8tPmRldmljZSwgIiAgICB0b19jb3B5PSV6dSwgcmVtYWluPSV6dVxuIiwKCQkJdG9fY29weSwgcmVtYWluIC0gdG9fY29weSk7CgoJCWZvciAoaSA9IDA7IGkgPCB0b19jb3B5OyBpKyspCgkJCXR4YnVmMTZbaV0gPSBjcHVfdG9fYmUxNih2bWVtMTZbaV0pOwoKCQl2bWVtMTYgPSB2bWVtMTYgKyB0b19jb3B5OwoJCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBwYXItPnR4YnVmLmJ1ZiwKCQkJc3RhcnRieXRlX3NpemUgKyB0b19jb3B5ICogMik7CgkJaWYgKHJldCA8IDApCgkJCXJldHVybiByZXQ7CgkJcmVtYWluIC09IHRvX2NvcHk7Cgl9CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHN0cnVjdCBmYnRmdF9kaXNwbGF5IGRpc3BsYXkgPSB7CgkucmVnd2lkdGggPSA4LAoJLmZidGZ0b3BzID0gewoJCS5pbml0X2Rpc3BsYXkgPSBpbml0X2Rpc3BsYXksCgkJLnNldF9hZGRyX3dpbiA9IHNldF9hZGRyX3dpbiwKCQkud3JpdGVfcmVnaXN0ZXIgPSB3cml0ZV9yZWc4X2J1czgsCgkJLndyaXRlX3ZtZW0gPSB3cml0ZV92bWVtMTZfYnVzOCwKCQkud3JpdGUgPSB3cml0ZV9zcGksCgl9LAp9OwpGQlRGVF9SRUdJU1RFUl9EUklWRVIoRFJWTkFNRSwgInJhaW8scmE4ODc1IiwgJmRpc3BsYXkpOwoKTU9EVUxFX0FMSUFTKCJzcGk6IiBEUlZOQU1FKTsKTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVk5BTUUpOwpNT0RVTEVfQUxJQVMoInNwaTpyYTg4NzUiKTsKTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpyYTg4NzUiKTsKCk1PRFVMRV9ERVNDUklQVElPTigiRkIgZHJpdmVyIGZvciB0aGUgUkE4ODc1IExDRCBDb250cm9sbGVyIik7Ck1PRFVMRV9BVVRIT1IoIlBmQG5uZSIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==