LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogqSAyMDEzIE1pY3JvY2hpcCBUZWNobm9sb2d5IEluYy4gYW5kIGl0cyBzdWJzaWRpYXJpZXMuDQoqIFlvdSBtYXkgdXNlIHRoaXMgc29mdHdhcmUgYW5kIGFueSBkZXJpdmF0aXZlcyBleGNsdXNpdmVseSB3aXRoDQoqIE1pY3JvY2hpcCBwcm9kdWN0cy4NCiogVEhJUyBTT0ZUV0FSRSBJUyBTVVBQTElFRCBCWSBNSUNST0NISVAgIkFTIElTIi4NCiogTk8gV0FSUkFOVElFUywgV0hFVEhFUiBFWFBSRVNTLCBJTVBMSUVEIE9SIFNUQVRVVE9SWSwgQVBQTFkgVE8gVEhJUyBTT0ZUV0FSRSwNCiogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLA0KKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIElUUyBJTlRFUkFDVElPTiBXSVRIIE1JQ1JPQ0hJUA0KKiBQUk9EVUNUUywgQ09NQklOQVRJT04gV0lUSCBBTlkgT1RIRVIgUFJPRFVDVFMsIE9SIFVTRSBJTiBBTlkgQVBQTElDQVRJT04uDQoqIElOIE5PIEVWRU5UIFdJTEwgTUlDUk9DSElQIEJFIExJQUJMRSBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBQVU5JVElWRSwNCiogSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIExPU1MsIERBTUFHRSwgQ09TVCBPUiBFWFBFTlNFIE9GIEFOWSBLSU5EDQoqIFdIQVRTT0VWRVIgUkVMQVRFRCBUTyBUSEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VELCBFVkVOIElGIE1JQ1JPQ0hJUCBIQVMNCiogQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPUiBUSEUgREFNQUdFUyBBUkUgRk9SRVNFRUFCTEUuDQoqIFRPIFRIRSBGVUxMRVNUIEVYVEVOVCBBTExPV0VEIEJZIExBVywgTUlDUk9DSElQJ1MgVE9UQUwgTElBQklMSVRZIE9OIEFMTA0KKiBDTEFJTVMgSU4gQU5ZIFdBWSBSRUxBVEVEIFRPIFRISVMgU09GVFdBUkUgV0lMTCBOT1QgRVhDRUVEIFRIRSBBTU9VTlQgT0YNCiogRkVFUywgSUYgQU5ZLCBUSEFUIFlPVSBIQVZFIFBBSUQgRElSRUNUTFkgVE8gTUlDUk9DSElQIEZPUiBUSElTIFNPRlRXQVJFLg0KKiBNSUNST0NISVAgUFJPVklERVMgVEhJUyBTT0ZUV0FSRSBDT05ESVRJT05BTExZIFVQT04gWU9VUiBBQ0NFUFRBTkNFDQoqIE9GIFRIRVNFIFRFUk1TLg0KKi8NCg0KLyoqIEBkZWZncm91cCBwd20gcHdtX2Nfd3JhcHBlcg0KICogIEB7DQogKi8NCi8qKiBAZmlsZSBwd21fY193cmFwcGVyLmNwcA0KIFxicmllZiB0aGUgcHdtIGNvbXBvbmVudCBDIHdyYXBwZXIgICANCiBUaGlzIHByb2dyYW0gaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIG90aGVyIEMgcHJvZ3JhbXMgdG8gYmUgYWJsZSB0byB1c2UgdGhpcyBjb21wb25lbnQNCg0KIFRoZXJlIGFyZSBlbnRyeSBwb2ludHMgZm9yIGFsbCBDIHdyYXBwZXIgQVBJIGltcGxlbWVudGF0aW9uDQoNCjxiPlBsYXRmb3JtOjwvYj4gVGhpcyBpcyBBUkMtYmFzZWQgY29tcG9uZW50IA0KDQo8Yj5Ub29sc2V0OjwvYj4gTWV0YXdhcmUgSURFKDguNS4xKQ0KPGI+UmVmZXJlbmNlOjwvYj4gc21zY19yZXVzYWJsZV9md19yZXF1aXJlbWVudC5kb2MgKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqICBTTVNDIHZlcnNpb24gY29udHJvbCBpbmZvcm1hdGlvbiAoUGVyZm9yY2UpOg0KICoNCiAqICBGSUxFOiAgICAgJEZpbGU6IC8vZGVwb3RfcGNzL0ZXRW5nL3Byb2plY3RzL01FQzIwMTYvUGxheWdyb3VuZC9wcmFtYW5zLzE2MDYyM19GcmVlUlRPU19NaWNyb2NoaXBfTUVDMTcweC9EZW1vL0NPUlRFWF9NUFVfTUVDMTcwMV9LZWlsX0dDQy9HQ0NfU3BlY2lmaWMvc3lzdGVtLmMgJA0KICogIFJFVklTSU9OOiAkUmV2aXNpb246ICMxICQNCiAqICBEQVRFVElNRTogJERhdGVUaW1lOiAyMDE2LzA5LzIyIDA4OjAzOjQ5ICQNCiAqICBBVVRIT1I6ICAgJEF1dGhvcjogcHJhbWFucyAkDQogKg0KICogIFJldmlzaW9uIGhpc3RvcnkgKGxhdGVzdCBmaXJzdCk6DQogKiAgICAgICMzICAyMDExLzA1LzA5ICBtYXJ0aW5feSAgICB1cGRhdGUgdG8gTWV0YXdhcmUgSURFKDguNS4xKSANCiAqICAgICAgIzIgIDIwMTEvMDMvMjUgIG1hcnRpbl95ICAgIHN1cHBvcnQgRlBHQSBidWlsZCAwNTggYXBwcw0KICogICAgICAjMSAgMjAxMS8wMy8yMyAgbWFydGluX3kgICAgYnJhbmNoIGZyb20gTUVDMTYxOCBzYW1wbGUgY29kZTogTUVDMTYxOF9ldmJfc2FtcGxlX2NvZGVfYnVpbGRfMDIwMA0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKi8NCi8qIEltcG9ydGVkIEhlYWRlciBGaWxlICovDQovLyNpbmNsdWRlICAgICJjb21tb24uaCINCi8vI2luY2x1ZGUgICAgImJ1aWxkLmgiDQojaW5jbHVkZSAgICA8c3RkaW50Lmg+DQoNCiNkZWZpbmUgQUREUl9QQ1JfUFJPQ0VTU09SX0NMT0NLX0NPTlRST0wgICAgMHg0MDA4MDEyMA0KI2RlZmluZSBNTUNSX1BDUl9QUk9DRVNTT1JfQ0xPQ0tfQ09OVFJPTCAgICAoKih1aW50MzJfdCAqKShBRERSX1BDUl9QUk9DRVNTT1JfQ0xPQ0tfQ09OVFJPTCkpDQojZGVmaW5lIENQVV9DTE9DS19ESVZJREVSCQkJCQkxDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiogc3lzdGVtX3NldF9lY19jbG9jaw0KKiBTZXQgQ1BVIHNwZWVkDQoqIEBwYXJhbSB2b2lkDQoqIEByZXR1cm4gdm9pZA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0Kdm9pZCBzeXN0ZW1fc2V0X2VjX2Nsb2NrKHZvaWQpDQp7DQoNCiAgICAvKiBTZXQgQVJDIENQVSBDbG9jayBEaXZpZGVyIHRvIGRldGVybWluZSB0aGUgQ1BVIHNwZWVkICovDQogICAgLyogU2V0IGRpdmlkZXIgdG8gOCBmb3IgOE1IeiBvcGVyYXRpb24sIE1DTEsgaW4gc2lsaWNvbiBjaGlwIGlzIDY0TUh6LCBDUFU9TUNMSy9EaXZpZGVyICovDQogICAgTU1DUl9QQ1JfUFJPQ0VTU09SX0NMT0NLX0NPTlRST0wgPSBDUFVfQ0xPQ0tfRElWSURFUjsNCg0KfSAvKiBFbmQgc3lzdGVtX3NldF9lY19jbG9jaygpICovDQoNCg==