LyoKICogKEMpIENvcHlyaWdodCAyMDA4CiAqIEdyYWVtZSBSdXNzLCBncmFlbWUucnVzc0BnbWFpbC5jb20uCiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMgogKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiA8ZGFuaWVsQG9taWNyb24uc2U+LgogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vcGNpLmg+CiNpbmNsdWRlIDxhc20vaWMvcGNpLmg+CgpzdGF0aWMgdm9pZCBwY2lfZW5ldF9maXh1cF9pcnEoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQp7CgkvKiBhIGNvbmZpZ3VyYWJsZSBsaXN0cyBvZiBJUlFzIHRvIHN0ZWFsIHdoZW4gd2UgbmVlZCBvbmUgKi8KCXN0YXRpYyBpbnQgaXJxX2xpc3RbXSA9IHsKCQlDT05GSUdfU1lTX0ZJUlNUX1BDSV9JUlEsCgkJQ09ORklHX1NZU19TRUNPTkRfUENJX0lSUSwKCQlDT05GSUdfU1lTX1RISVJEX1BDSV9JUlEsCgkJQ09ORklHX1NZU19GT1JUSF9QQ0lfSVJRCgl9OwoJc3RhdGljIGludCBuZXh0X2lycV9pbmRleD0wOwoKCXVjaGFyIHRtcF9waW47CglpbnQgcGluOwoKCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnRtcF9waW4pOwoJcGluID0gdG1wX3BpbjsKCglwaW4gLT0gMTsgLyogUENJIGNvbmZpZyBzcGFjZSB1c2UgMS1iYXNlZCBudW1iZXJpbmcgKi8KCWlmIChwaW4gPT0gLTEpIHsKCQlyZXR1cm47IC8qIGRldmljZSB1c2Ugbm8gaXJxICovCgl9CgoJLyogbWFwIGRldmljZSBudW1iZXIgKyAgcGluIHRvIGEgcGluIG9uIHRoZSBzYzUyMCAqLwoJc3dpdGNoIChQQ0lfREVWKGRldikpIHsKCWNhc2UgMTI6CS8qIEZpcnN0IEV0aGVybmV0IENoaXAgKi8KCQlwaW4gKz0gU0M1MjBfUENJX0lOVEE7CgkJYnJlYWs7CgoJY2FzZSAxMzoJLyogU2Vjb25kIEV0aGVybmV0IENoaXAgKi8KCQlwaW4gKz0gU0M1MjBfUENJX0lOVEI7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlyZXR1cm47Cgl9CgoJcGluICY9IDM7IC8qIHdyYXAgYXJvdW5kICovCgoJaWYgKHNjNTIwX3BjaV9pbnRzW3Bpbl0gPT0gLTEpIHsKCQkvKiByZS1yb3V0ZSBvbmUgaW50ZXJydXB0IGZvciB1cyAqLwoJCWlmIChuZXh0X2lycV9pbmRleCA+IDMpIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAocGNpX3NjNTIwX3NldF9pcnEocGluLCBpcnFfbGlzdFtuZXh0X2lycV9pbmRleF0pKSB7CgkJCXJldHVybjsKCQl9CgkJbmV4dF9pcnFfaW5kZXgrKzsKCX0KCglpZiAoLTEgIT0gc2M1MjBfcGNpX2ludHNbcGluXSkgewoJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsCgkJCQkJICAgc2M1MjBfcGNpX2ludHNbcGluXSk7Cgl9CglwcmludGYoImZpeHVwX2lycTogZGV2aWNlICVkIHBpbiAlYyBpcnEgJWRcbiIsCgkgICAgICAgUENJX0RFVihkZXYpLCAnQScgKyBwaW4sIHNjNTIwX3BjaV9pbnRzW3Bpbl0pOwp9CgpzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIGVuZXRfaG9zZSA9IHsKCWZpeHVwX2lycTogcGNpX2VuZXRfZml4dXBfaXJxLAp9OwoKdm9pZCBwY2lfaW5pdF9ib2FyZCh2b2lkKQp7CglwY2lfc2M1MjBfaW5pdCgmZW5ldF9ob3NlKTsKfQo=