LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgdGVrcmFtLmMKICogVmVyc2lvbjogICAgICAgMS4yCiAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBUZWtyYW0gSXJNYXRlIElSLTIxMEIgZG9uZ2xlCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBXZWQgT2N0IDIxIDIwOjAyOjM1IDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxMzowOSAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogCiAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogICAgICAKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqICAKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKiAgICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC90dHkuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgoKc3RhdGljIHZvaWQgdGVrcmFtX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKTsKc3RhdGljIHZvaWQgdGVrcmFtX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKc3RhdGljIGludCAgdGVrcmFtX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKc3RhdGljIGludCAgdGVrcmFtX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOwoKI2RlZmluZSBURUtSQU1fMTE1MjAwIDB4MDAKI2RlZmluZSBURUtSQU1fNTc2MDAgIDB4MDEKI2RlZmluZSBURUtSQU1fMzg0MDAgIDB4MDIKI2RlZmluZSBURUtSQU1fMTkyMDAgIDB4MDMKI2RlZmluZSBURUtSQU1fOTYwMCAgIDB4MDQKCiNkZWZpbmUgVEVLUkFNX1BXICAgICAweDEwIC8qIFB1bHNlIHNlbGVjdCBiaXQgKi8KCnN0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CgkudHlwZSA9IElSREFfVEVLUkFNX0RPTkdMRSwKCS5vcGVuICA9IHRla3JhbV9vcGVuLAoJLmNsb3NlID0gdGVrcmFtX2Nsb3NlLAoJLnJlc2V0ID0gdGVrcmFtX3Jlc2V0LAoJLmNoYW5nZV9zcGVlZCA9IHRla3JhbV9jaGFuZ2Vfc3BlZWQsCgkub3duZXIgPSBUSElTX01PRFVMRSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IHRla3JhbV9pbml0KHZvaWQpCnsKCXJldHVybiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCB0ZWtyYW1fY2xlYW51cCh2b2lkKQp7CglpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKfQoKc3RhdGljIHZvaWQgdGVrcmFtX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOwoJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOyAvKiBOZWVkcyBhdCBsZWFzdCAxMCBtcyAqLwkKCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKfQoKc3RhdGljIHZvaWQgdGVrcmFtX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCgkvKiBQb3dlciBvZmYgZG9uZ2xlICovCglzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CgoJaWYgKHNlbGYtPnJlc2V0X3Rhc2spCgkJaXJkYV90YXNrX2RlbGV0ZShzZWxmLT5yZXNldF90YXNrKTsKCWlmIChzZWxmLT5zcGVlZF90YXNrKQoJCWlyZGFfdGFza19kZWxldGUoc2VsZi0+c3BlZWRfdGFzayk7Cn0KCi8qCiAqIEZ1bmN0aW9uIHRla3JhbV9jaGFuZ2Vfc3BlZWQgKGRldiwgc3RhdGUsIHNwZWVkKQogKgogKiAgICBTZXQgdGhlIHNwZWVkIGZvciB0aGUgVGVrcmFtIElSTWF0ZSAyMTAgdHlwZSBkb25nbGUuIFdhcm5pbmcsIHRoaXMgCiAqICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCiAqCiAqICAgIEFsZ29yaXRobQogKiAgICAxLiBjbGVhciBEVFIgCiAqICAgIDIuIHNldCBSVFMsIGFuZCB3YWl0IGF0IGxlYXN0IDcgdXMKICogICAgMy4gc2VuZCBDb250cm9sIEJ5dGUgdG8gdGhlIElSLTIxMCB0aHJvdWdoIFRYRCB0byBzZXQgbmV3IGJhdWQgcmF0ZQogKiAgICAgICB3YWl0IHVudGlsIHRoZSBzdG9wIGJpdCBvZiBDb250cm9sIEJ5dGUgaXMgc2VudCAoZm9yIDk2MDAgYmF1ZCByYXRlLCAKICogICAgICAgaXQgdGFrZXMgYWJvdXQgMTAwIG1zZWMpCiAqICAgIDUuIGNsZWFyIFJUUyAocmV0dXJuIHRvIE5PUk1BTCBPcGVyYXRpb24pCiAqICAgIDYuIHdhaXQgYXQgbGVhc3QgNTAgdXMsIG5ldyBzZXR0aW5nIChiYXVkIHJhdGUsIGV0YykgdGFrZXMgZWZmZWN0IGhlcmUgCiAqICAgICAgIGFmdGVyCiAqLwpzdGF0aWMgaW50IHRla3JhbV9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKewoJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CglfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CglfX3U4IGJ5dGU7CglpbnQgcmV0ID0gMDsKCQoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCglpZiAoc2VsZi0+c3BlZWRfdGFzayAmJiBzZWxmLT5zcGVlZF90YXNrICE9IHRhc2spIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBidXN5IVxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIG1zZWNzX3RvX2ppZmZpZXMoMTApOwoJfSBlbHNlCgkJc2VsZi0+c3BlZWRfdGFzayA9IHRhc2s7CgoJc3dpdGNoIChzcGVlZCkgewoJZGVmYXVsdDoKCWNhc2UgOTYwMDoKCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV85NjAwOwoJCWJyZWFrOwoJY2FzZSAxOTIwMDoKCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV8xOTIwMDsKCQlicmVhazsKCWNhc2UgMzg0MDA6CgkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fMzg0MDA7CgkJYnJlYWs7CgljYXNlIDU3NjAwOgoJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzU3NjAwOwoJCWJyZWFrOwoJY2FzZSAxMTUyMDA6CgkJYnl0ZSA9IFRFS1JBTV8xMTUyMDA7CgkJYnJlYWs7Cgl9CgoJc3dpdGNoICh0YXNrLT5zdGF0ZSkgewoJY2FzZSBJUkRBX1RBU0tfSU5JVDoKCWNhc2UgSVJEQV9UQVNLX0NISUxEX0lOSVQ6CQkKCQkvKiAKCQkgKiBOZWVkIHRvIHJlc2V0IHRoZSBkb25nbGUgYW5kIGdvIHRvIDk2MDAgYnBzIGJlZm9yZQogICAgICAgICAgICAgICAgICogcHJvZ3JhbW1pbmcgCgkJICovCgkJaWYgKGlyZGFfdGFza19leGVjdXRlKHNlbGYsIHRla3JhbV9yZXNldCwgTlVMTCwgdGFzaywgCgkJCQkgICAgICAodm9pZCAqKSBzcGVlZCkpCgkJewoJCQkvKiBEb25nbGUgbmVlZCBtb3JlIHRpbWUgdG8gcmVzZXQgKi8KCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX1dBSVQpOwoKCQkJLyogR2l2ZSByZXNldCAxIHNlYyB0byBmaW5pc2ggKi8KCQkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxMDAwKTsKCQl9IGVsc2UKCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX0RPTkUpOwoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKCQlJUkRBX1dBUk5JTkcoIiVzKCksIHJlc2V0dGluZyBkb25nbGUgdGltZWQgb3V0IVxuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18pOwoJCXJldCA9IC0xOwoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfQ0hJTERfRE9ORToKCQkvKiBTZXQgRFRSLCBDbGVhciBSVFMgKi8KCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIEZBTFNFKTsKCQoJCS8qIFdhaXQgYXQgbGVhc3QgN3VzICovCgkJdWRlbGF5KDE0KTsKCgkJLyogV3JpdGUgY29udHJvbCBieXRlICovCgkJc2VsZi0+d3JpdGUoc2VsZi0+ZGV2LCAmYnl0ZSwgMSk7CgkJCgkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQpOwoKCQkvKiBXYWl0IGF0IGxlYXN0IDEwMCBtcyAqLwoJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTUwKTsKCQlicmVhazsKCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CgkJLyogU2V0IERUUiwgU2V0IFJUUyAqLwoJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CgoJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CgkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOwoJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOwoJCXJldCA9IC0xOwoJCWJyZWFrOwoJfQoJcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gdGVrcmFtX3Jlc2V0IChkcml2ZXIpCiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIHRla3JhbSBkb25nbGUuIFdhcm5pbmcsIHRoaXMgZnVuY3Rpb24gCiAqICAgICAgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEhIAogKgogKiAgICAgIEFsZ29yaXRobToKICogICAgCSAgMC4gQ2xlYXIgUlRTIGFuZCBEVFIsIGFuZCB3YWl0IDUwIG1zIChwb3dlciBvZmYgdGhlIElSLTIxMCApCiAqICAgICAgICAxLiBjbGVhciBSVFMgCiAqICAgICAgICAyLiBzZXQgRFRSLCBhbmQgd2FpdCBhdCBsZWFzdCAxIG1zIAogKiAgICAgICAgMy4gY2xlYXIgRFRSIHRvIFNQQUNFIHN0YXRlLCB3YWl0IGF0IGxlYXN0IDUwIHVzIGZvciBmdXJ0aGVyIAogKiAgICAgICAgIG9wZXJhdGlvbgogKi8KaW50IHRla3JhbV9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQp7Cglkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKCWludCByZXQgPSAwOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHRhc2sgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJaWYgKHNlbGYtPnJlc2V0X3Rhc2sgJiYgc2VsZi0+cmVzZXRfdGFzayAhPSB0YXNrKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYnVzeSFcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXJldHVybiBtc2Vjc190b19qaWZmaWVzKDEwKTsKCX0gZWxzZQoJCXNlbGYtPnJlc2V0X3Rhc2sgPSB0YXNrOwoJCgkvKiBQb3dlciBvZmYgZG9uZ2xlICovCgkvL3NlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CgoJc3dpdGNoICh0YXNrLT5zdGF0ZSkgewoJY2FzZSBJUkRBX1RBU0tfSU5JVDoKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOwoKCQkvKiBTbGVlcCA1MCBtcyAqLwoJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoNTApOwoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfV0FJVDE6CgkJLyogQ2xlYXIgRFRSLCBTZXQgUlRTICovCgkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7IAoKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDIpOwoJCQoJCS8qIFNob3VsZCBzbGVlcCAxIG1zICovCgkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxKTsKCQlicmVhazsKCWNhc2UgSVJEQV9UQVNLX1dBSVQyOgoJCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOwoJCgkJLyogV2FpdCBhdCBsZWFzdCA1MCB1cyAqLwoJCXVkZWxheSg3NSk7CgoJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CgkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOwkJCgkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CgkJcmV0ID0gLTE7Cgl9CglyZXR1cm4gcmV0Owp9CgpNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiVGVrcmFtIElyTWF0ZSBJUi0yMTBCIGRvbmdsZSBkcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTAiKTsgLyogSVJEQV9URUtSQU1fRE9OR0xFICovCgkJCi8qCiAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQogKgogKiAgICBJbml0aWFsaXplIFRla3JhbSBtb2R1bGUKICoKICovCm1vZHVsZV9pbml0KHRla3JhbV9pbml0KTsKCi8qCiAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQogKgogKiAgICBDbGVhbnVwIFRla3JhbSBtb2R1bGUKICoKICovCm1vZHVsZV9leGl0KHRla3JhbV9jbGVhbnVwKTsK