LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJ0dHAuaAogKiBWZXJzaW9uOiAgICAgICAxLjAKICogRGVzY3JpcHRpb246ICAgVGlueSBUcmFuc3BvcnQgUHJvdG9jb2wgKFRUUCkgZGVmaW5pdGlvbnMKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgMzEgMjA6MTQ6MzEgMTk5NwogKiBNb2RpZmllZCBhdDogICBTdW4gRGVjIDEyIDEzOjA5OjA3IDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sIAogKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KICogICAgIAogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIElSVFRQX0gKI2RlZmluZSBJUlRUUF9ICgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgkJLyogc3RydWN0IGxzYXBfY2IgKi8KI2luY2x1ZGUgPG5ldC9pcmRhL3Fvcy5oPgkJLyogc3RydWN0IHFvc19pbmZvICovCiNpbmNsdWRlIDxuZXQvaXJkYS9pcnF1ZXVlLmg+CgojZGVmaW5lIFRUUF9NQVhfQ09OTkVDVElPTlMgICAgTE1fTUFYX0NPTk5FQ1RJT05TCiNkZWZpbmUgVFRQX0hFQURFUiAgICAgICAgICAgICAxCiNkZWZpbmUgVFRQX01BWF9IRUFERVIgICAgICAgICAoVFRQX0hFQURFUiArIExNUF9NQVhfSEVBREVSKQojZGVmaW5lIFRUUF9TQVJfSEVBREVSICAgICAgICAgNQojZGVmaW5lIFRUUF9QQVJBTUVURVJTICAgICAgICAgMHg4MAojZGVmaW5lIFRUUF9NT1JFICAgICAgICAgICAgICAgMHg4MAoKLyogVHJhbnNtaXNzaW9uIHF1ZXVlIHNpemVzICovCi8qIFdvcnN0IGNhc2Ugc2NlbmFyaW8sIHR3byB3aW5kb3cgb2YgZGF0YSAtIEplYW4gSUkgKi8KI2RlZmluZSBUVFBfVFhfTUFYX1FVRVVFCTE0Ci8qIFdlIG5lZWQgdG8ga2VlcCBhdCBsZWFzdCA1IGZyYW1lcyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBjYW4gcmVmaWxsCiAqIGFwcHJvcHJpYXRlbHkgdGhlIExBUCBsYXllci4gTEFQIGtlZXBzIG9ubHkgdHdvIGJ1ZmZlcnMsIGFuZCB3ZSBuZWVkCiAqIHRvIGhhdmUgNyB0byBtYWtlIGEgZnVsbCB3aW5kb3cgLSBKZWFuIElJICovCiNkZWZpbmUgVFRQX1RYX0xPV19USFJFU0hPTEQJNQovKiBNb3N0IGNsaWVudHMgYXJlIHN5bmNocm9ub3VzIHdpdGggcmVzcGVjdCB0byBmbG93IGNvbnRyb2wsIHNvIHdlIGNhbgogKiBrZWVwIGEgbG93IG51bWJlciBvZiBUeCBidWZmZXJzIGluIFRUUCAtIEplYW4gSUkgKi8KI2RlZmluZSBUVFBfVFhfSElHSF9USFJFU0hPTEQJNwoKLyogUmVjZWl2ZSBxdWV1ZSBzaXplcyAqLwovKiBNaW5pbXVtIG9mIGNyZWRpdCB0aGF0IHRoZSBwZWVyIHNob3VsZCBob2xkLgogKiBJZiB0aGUgcGVlciBoYXMgbGVzcyBjcmVkaXRzIHRoYW4gOSBmcmFtZXMsIHdlIHdpbGwgZXhwbGljaXRlbHkgc2VuZAogKiBoaW0gc29tZSBjcmVkaXRzICh0aHJvdWdoIGlydHRwX2dpdmVfY3JlZGl0KCkgYW5kIGEgc3BlY2lmaWMgZnJhbWUpLgogKiBOb3RlIHRoYXQgd2hlbiB3ZSBnaXZlIGNyZWRpdHMgaXQncyBsaWtlbHkgdGhhdCBpdCB3b24ndCBiZSBzZW50IGluCiAqIHRoaXMgTEFQIHdpbmRvdywgYnV0IGluIHRoZSBuZXh0IG9uZS4gU28sIHdlIG1ha2Ugc3VyZSB0aGF0IHRoZSBwZWVyCiAqIGhhcyBzb21ldGhpbmcgdG8gc2VuZCB3aGlsZSB3YWl0aW5nIGZvciBjcmVkaXRzIChvbmUgTEFQIHdpbmRvdyA9PSA3CiAqICsgMSBmcmFtZXMgd2hpbGUgaGUgcHJvY2VzcyB0aGUgY3JlZGl0cykuIC0gSmVhbiBJSSAqLwojZGVmaW5lIFRUUF9SWF9NSU5fQ1JFRElUCTgKLyogVGhpcyBpcyB0aGUgZGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBjcmVkaXRzIGhlbGQgYnkgdGhlIHBlZXIsIHNvIHRoZQogKiBkZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyBoZSBjYW4gc2VuZCB1cyBiZWZvcmUgbmVlZGluZyBmbG93CiAqIGNvbnRyb2wgYW5zd2VyIGZyb20gdXMgKHRoaXMgbWF5IGJlIG5lZ29jaWF0ZWQgZGlmZmVyZW50bHkgYXQgVFNBUCBzZXR1cCkuCiAqIFdlIHdhbnQgdG8gbWluaW1pc2UgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBoYXZlIHRvIGV4cGxpY2l0ZWx5IHNlbmQgc29tZQogKiBjcmVkaXQgdG8gdGhlIHBlZXIsIGhvcGluZyB3ZSBjYW4gcGlnZ3liYWNrIGl0IG9uIHRoZSByZXR1cm4gZGF0YS4gSW4KICogcGFydGljdWxhciwgaXQgZG9lc24ndCBtYWtlIHNlbnNlIGZvciB1cyB0byBzZW5kIGNyZWRpdCBtb3JlIHRoYW4gb25jZQogKiBwZXIgTEFQIHdpbmRvdy4KICogTW9yZW92ZXIsIGdpdmluZyBjcmVkaXRzIGhhcyBzb21lIGxhdGVuY3ksIHNvIHdlIG5lZWQgc3RyaWN0bHkgbW9yZSB0aGFuCiAqIGEgTEFQIHdpbmRvdywgb3RoZXJ3aXNlIHdlIG1heSBhbHJlYWR5IGhhdmUgY3JlZGl0cyBpbiBvdXIgVHggcXVldWUuCiAqIEJ1dCBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgZG9uJ3Qgd2FudCB0byBrZWVwIHRvbyBtYW55IFJ4IGJ1ZmZlciBoZXJlCiAqIGJlZm9yZSBzdGFydGluZyB0byBmbG93IGNvbnRyb2wgdGhlIG90aGVyIGVuZCwgc28gbWFrZSBpdCBleGFjdGx5IG9uZQogKiBMQVAgd2luZG93ICsgMSArIE1JTl9DUkVESVRTLiAtIEplYW4gSUkgKi8KI2RlZmluZSBUVFBfUlhfREVGQVVMVF9DUkVESVQJMTYKLyogTWF4aW11bSBudW1iZXIgb2YgY3JlZGl0cyB3ZSBjYW4gYWxsb3cgdGhlIHBlZXIgdG8gaGF2ZSwgYW5kIHRoZXJlZm9yZQogKiBtYXhpbXVtIFJ4IHF1ZXVlIHNpemUuCiAqIE5vdGUgdGhhdCB3ZSB0cnkgdG8gZGVsaXZlciBwYWNrZXRzIHRvIHRoZSBoaWdoZXIgbGF5ZXIgZXZlcnkgdGltZSB3ZQogKiByZWNlaXZlIHNvbWV0aGluZywgc28gaW4gbm9ybWFsIG1vZGUgdGhlIFJ4IHF1ZXVlIHdpbGwgbmV2ZXIgY29udGFpbnMKICogbW9yZSB0aGFuIG9uZSBvciB0d28gcGFja2V0cy4gLSBKZWFuIElJICovCiNkZWZpbmUgVFRQX1JYX01BWF9DUkVESVQJMjEKCi8qIFdoYXQgY2xpZW50cyBzaG91bGQgdXNlIHdoZW4gY2FsbGluZyB0dHBfb3Blbl90c2FwKCkgKi8KI2RlZmluZSBERUZBVUxUX0lOSVRJQUxfQ1JFRElUCVRUUF9SWF9ERUZBVUxUX0NSRURJVAoKLyogU29tZSBwcmlvcml0aWVzIGZvciBkaXNjb25uZWN0IHJlcXVlc3RzICovCiNkZWZpbmUgUF9OT1JNQUwgICAgMAojZGVmaW5lIFBfSElHSCAgICAgIDEKCiNkZWZpbmUgVFRQX1NBUl9ESVNBQkxFIDAKI2RlZmluZSBUVFBfU0FSX1VOQk9VTkQgMHhmZmZmZmZmZgoKLyogUGFyYW1ldGVycyAqLwojZGVmaW5lIFRUUF9NQVhfU0RVX1NJWkUgMHgwMQoKLyoKICogIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBkYXRhIGFzc29zaWF0ZWQgd2l0aCBvbmUgaW5zdGFuY2Ugb2YgYSBUVFAgCiAqICBjb25uZWN0aW9uLgogKi8Kc3RydWN0IHRzYXBfY2IgewoJaXJkYV9xdWV1ZV90IHE7ICAgICAgICAgICAgLyogTXVzdCBiZSBmaXJzdCAqLwoJbWFnaWNfdCBtYWdpYzsgICAgICAgIC8qIEp1c3QgaW4gY2FzZSAqLwoKCV9fdTggc3RzYXBfc2VsOyAgICAgICAvKiBTb3VyY2UgVFNBUCAqLwoJX191OCBkdHNhcF9zZWw7ICAgICAgIC8qIERlc3RpbmF0aW9uIFRTQVAgKi8KCglzdHJ1Y3QgbHNhcF9jYiAqbHNhcDsgLyogQ29ycmVzcG9uZGluZyBMU0FQIHRvIHRoaXMgVFNBUCAqLwoKCV9fdTggY29ubmVjdGVkOyAgICAgICAvKiBUU0FQIGNvbm5lY3RlZCAqLwoJIAoJX191OCBpbml0aWFsX2NyZWRpdDsgIC8qIEluaXRpYWwgY3JlZGl0IHRvIGdpdmUgcGVlciAqLwoKICAgICAgICBpbnQgYXZhaWxfY3JlZGl0OyAgICAvKiBBdmFpbGFibGUgY3JlZGl0IHRvIHJldHVybiB0byBwZWVyICovCglpbnQgcmVtb3RlX2NyZWRpdDsgICAvKiBDcmVkaXQgaGVsZCBieSBwZWVyIFRUUCBlbnRpdHkgKi8KCWludCBzZW5kX2NyZWRpdDsgICAgIC8qIENyZWRpdCBoZWxkIGJ5IGxvY2FsIFRUUCBlbnRpdHkgKi8KCQoJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9xdWV1ZTsgLyogRnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkICovCglzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X3F1ZXVlOyAvKiBSZWNlaXZlZCBmcmFtZXMgKi8KCXN0cnVjdCBza19idWZmX2hlYWQgcnhfZnJhZ21lbnRzOwoJaW50IHR4X3F1ZXVlX2xvY2s7CglpbnQgcnhfcXVldWVfbG9jazsKCXNwaW5sb2NrX3QgbG9jazsKCglub3RpZnlfdCBub3RpZnk7ICAgICAgIC8qIENhbGxiYWNrcyB0byBjbGllbnQgbGF5ZXIgKi8KCglzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKCXN0cnVjdCB0aW1lcl9saXN0IHRvZG9fdGltZXI7IAoKCV9fdTMyIG1heF9zZWdfc2l6ZTsgICAgIC8qIE1heCBkYXRhIHRoYXQgZml0IGludG8gYW4gSXJMQVAgZnJhbWUgKi8KCV9fdTggIG1heF9oZWFkZXJfc2l6ZTsKCglpbnQgICByeF9zZHVfYnVzeTsgICAgIC8qIFJ4U2R1LmJ1c3kgKi8KCV9fdTMyIHJ4X3NkdV9zaXplOyAgICAgLyogQ3VycmVudCBzaXplIG9mIGEgcGFydGlhbGx5IHJlY2VpdmVkIGZyYW1lICovCglfX3UzMiByeF9tYXhfc2R1X3NpemU7IC8qIE1heCByZWNlaXZlIHVzZXIgZGF0YSBzaXplICovCgoJaW50IHR4X3NkdV9idXN5OyAgICAgICAvKiBUeFNkdS5idXN5ICovCglfX3UzMiB0eF9tYXhfc2R1X3NpemU7IC8qIE1heCB0cmFuc21pdCB1c2VyIGRhdGEgc2l6ZSAqLwoKCWludCBjbG9zZV9wZW5kOyAgICAgICAgLyogQ2xvc2UsIGJ1dCBkaXNjb25uZWN0X3BlbmQgKi8KCXVuc2lnbmVkIGxvbmcgZGlzY29ubmVjdF9wZW5kOyAvKiBEaXNjb25uZWN0LCBidXQgc3RpbGwgZGF0YSB0byBzZW5kICovCglzdHJ1Y3Qgc2tfYnVmZiAqZGlzY29ubmVjdF9za2I7Cn07CgpzdHJ1Y3QgaXJ0dHBfY2IgewoJbWFnaWNfdCAgICBtYWdpYzsJCgloYXNoYmluX3QgKnRzYXBzOwp9OwoKaW50ICBpcnR0cF9pbml0KHZvaWQpOwp2b2lkIGlydHRwX2NsZWFudXAodm9pZCk7CgpzdHJ1Y3QgdHNhcF9jYiAqaXJ0dHBfb3Blbl90c2FwKF9fdTggc3RzYXBfc2VsLCBpbnQgY3JlZGl0LCBub3RpZnlfdCAqbm90aWZ5KTsKaW50IGlydHRwX2Nsb3NlX3RzYXAoc3RydWN0IHRzYXBfY2IgKnNlbGYpOwoKaW50IGlydHRwX2RhdGFfcmVxdWVzdChzdHJ1Y3QgdHNhcF9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CmludCBpcnR0cF91ZGF0YV9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKCmludCBpcnR0cF9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IHRzYXBfY2IgKnNlbGYsIF9fdTggZHRzYXBfc2VsLCAKCQkJICBfX3UzMiBzYWRkciwgX191MzIgZGFkZHIsCgkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwgCgkJCSAgc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKTsKaW50IGlydHRwX2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IHRzYXBfY2IgKnNlbGYsIF9fdTMyIG1heF9zZHVfc2l6ZSwgCgkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqdXNlcmRhdGEpOwppbnQgaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoJCQkgICAgIGludCBwcmlvcml0eSk7CnZvaWQgaXJ0dHBfZmxvd19yZXF1ZXN0KHN0cnVjdCB0c2FwX2NiICpzZWxmLCBMT0NBTF9GTE9XIGZsb3cpOwpzdHJ1Y3QgdHNhcF9jYiAqaXJ0dHBfZHVwKHN0cnVjdCB0c2FwX2NiICpzZWxmLCB2b2lkICppbnN0YW5jZSk7CgpzdGF0aWMgX19pbmxpbmUgX191MzIgaXJ0dHBfZ2V0X3NhZGRyKHN0cnVjdCB0c2FwX2NiICpzZWxmKQp7CglyZXR1cm4gaXJsbXBfZ2V0X3NhZGRyKHNlbGYtPmxzYXApOwp9CgpzdGF0aWMgX19pbmxpbmUgX191MzIgaXJ0dHBfZ2V0X2RhZGRyKHN0cnVjdCB0c2FwX2NiICpzZWxmKQp7CglyZXR1cm4gaXJsbXBfZ2V0X2RhZGRyKHNlbGYtPmxzYXApOwp9CgpzdGF0aWMgX19pbmxpbmUgX191MzIgaXJ0dHBfZ2V0X21heF9zZWdfc2l6ZShzdHJ1Y3QgdHNhcF9jYiAqc2VsZikKewoJcmV0dXJuIHNlbGYtPm1heF9zZWdfc2l6ZTsKfQoKLyogQWZ0ZXIgZG9pbmcgYSBpcnR0cF9kdXAoKSwgdGhpcyBnZXQgb25lIG9mIHRoZSB0d28gc29ja2V0IGJhY2sgaW50bwogKiBhIHN0YXRlIHdoZXJlIGl0J3Mgd2FpdGluZyBpbmNvbW1pbmcgY29ubmVjdGlvbnMuCiAqIE5vdGUgOiB0aGlzIGNhbiBiZSB1c2VkICpvbmx5KiBpZiB0aGUgc29ja2V0IGlzIG5vdCB5ZXQgY29ubmVjdGVkCiAqIChpLmUuIE5PIGlydHRwX2Nvbm5lY3RfcmVzcG9uc2UoKSBkb25lIG9uIHRoaXMgc29ja2V0KS4KICogLSBKZWFuIElJICovCnN0YXRpYyBpbmxpbmUgdm9pZCBpcnR0cF9saXN0ZW4oc3RydWN0IHRzYXBfY2IgKnNlbGYpCnsKCWlybG1wX2xpc3RlbihzZWxmLT5sc2FwKTsKCXNlbGYtPmR0c2FwX3NlbCA9IExTQVBfQU5ZOwp9CgovKiBSZXR1cm4gVFJVRSBpZiB0aGUgbm9kZSBpcyBpbiBwcmltYXJ5IG1vZGUgKGkuZS4gbWFzdGVyKQogKiAtIEplYW4gSUkgKi8Kc3RhdGljIGlubGluZSBpbnQgaXJ0dHBfaXNfcHJpbWFyeShzdHJ1Y3QgdHNhcF9jYiAqc2VsZikKewoJaWYgKChzZWxmID09IE5VTEwpIHx8CgkgICAgKHNlbGYtPmxzYXAgPT0gTlVMTCkgfHwKCSAgICAoc2VsZi0+bHNhcC0+bGFwID09IE5VTEwpIHx8CgkgICAgKHNlbGYtPmxzYXAtPmxhcC0+aXJsYXAgPT0gTlVMTCkpCgkJcmV0dXJuIC0yOwoJcmV0dXJuKGlybGFwX2lzX3ByaW1hcnkoc2VsZi0+bHNhcC0+bGFwLT5pcmxhcCkpOwp9CgojZW5kaWYgLyogSVJUVFBfSCAqLwo=