LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogqSAyMDEzIE1pY3JvY2hpcCBUZWNobm9sb2d5IEluYy4gYW5kIGl0cyBzdWJzaWRpYXJpZXMuDQoqIFlvdSBtYXkgdXNlIHRoaXMgc29mdHdhcmUgYW5kIGFueSBkZXJpdmF0aXZlcyBleGNsdXNpdmVseSB3aXRoDQoqIE1pY3JvY2hpcCBwcm9kdWN0cy4NCiogVEhJUyBTT0ZUV0FSRSBJUyBTVVBQTElFRCBCWSBNSUNST0NISVAgIkFTIElTIi4NCiogTk8gV0FSUkFOVElFUywgV0hFVEhFUiBFWFBSRVNTLCBJTVBMSUVEIE9SIFNUQVRVVE9SWSwgQVBQTFkgVE8gVEhJUyBTT0ZUV0FSRSwNCiogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLA0KKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIElUUyBJTlRFUkFDVElPTiBXSVRIIE1JQ1JPQ0hJUA0KKiBQUk9EVUNUUywgQ09NQklOQVRJT04gV0lUSCBBTlkgT1RIRVIgUFJPRFVDVFMsIE9SIFVTRSBJTiBBTlkgQVBQTElDQVRJT04uDQoqIElOIE5PIEVWRU5UIFdJTEwgTUlDUk9DSElQIEJFIExJQUJMRSBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBQVU5JVElWRSwNCiogSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIExPU1MsIERBTUFHRSwgQ09TVCBPUiBFWFBFTlNFIE9GIEFOWSBLSU5EDQoqIFdIQVRTT0VWRVIgUkVMQVRFRCBUTyBUSEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VELCBFVkVOIElGIE1JQ1JPQ0hJUCBIQVMNCiogQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPUiBUSEUgREFNQUdFUyBBUkUgRk9SRVNFRUFCTEUuDQoqIFRPIFRIRSBGVUxMRVNUIEVYVEVOVCBBTExPV0VEIEJZIExBVywgTUlDUk9DSElQJ1MgVE9UQUwgTElBQklMSVRZIE9OIEFMTA0KKiBDTEFJTVMgSU4gQU5ZIFdBWSBSRUxBVEVEIFRPIFRISVMgU09GVFdBUkUgV0lMTCBOT1QgRVhDRUVEIFRIRSBBTU9VTlQgT0YNCiogRkVFUywgSUYgQU5ZLCBUSEFUIFlPVSBIQVZFIFBBSUQgRElSRUNUTFkgVE8gTUlDUk9DSElQIEZPUiBUSElTIFNPRlRXQVJFLg0KKiBNSUNST0NISVAgUFJPVklERVMgVEhJUyBTT0ZUV0FSRSBDT05ESVRJT05BTExZIFVQT04gWU9VUiBBQ0NFUFRBTkNFDQoqIE9GIFRIRVNFIFRFUk1TLg0KKi8NCg0KLyoqIEBkZWZncm91cCBwd20gcHdtX2Nfd3JhcHBlcg0KICogIEB7DQogKi8NCi8qKiBAZmlsZSBwd21fY193cmFwcGVyLmNwcA0KIFxicmllZiB0aGUgcHdtIGNvbXBvbmVudCBDIHdyYXBwZXIgICANCiBUaGlzIHByb2dyYW0gaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIG90aGVyIEMgcHJvZ3JhbXMgdG8gYmUgYWJsZSB0byB1c2UgdGhpcyBjb21wb25lbnQNCg0KIFRoZXJlIGFyZSBlbnRyeSBwb2ludHMgZm9yIGFsbCBDIHdyYXBwZXIgQVBJIGltcGxlbWVudGF0aW9uDQoNCjxiPlBsYXRmb3JtOjwvYj4gVGhpcyBpcyBBUkMtYmFzZWQgY29tcG9uZW50IA0KDQo8Yj5Ub29sc2V0OjwvYj4gTWV0YXdhcmUgSURFKDguNS4xKQ0KPGI+UmVmZXJlbmNlOjwvYj4gc21zY19yZXVzYWJsZV9md19yZXF1aXJlbWVudC5kb2MgKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqICBTTVNDIHZlcnNpb24gY29udHJvbCBpbmZvcm1hdGlvbiAoUGVyZm9yY2UpOg0KICoNCiAqICBGSUxFOiAgICAgJEZpbGU6IC8vZGVwb3RfcGNzL0ZXRW5nL1JlbGVhc2UvcHJvamVjdHMvQ0VDMTMwMl9DTElCL3JlbGVhc2UyL1NvdXJjZS9od19ibGtzL2NvbW1vbi9zeXN0ZW0vc3lzdGVtLmMgJA0KICogIFJFVklTSU9OOiAkUmV2aXNpb246ICMxICQNCiAqICBEQVRFVElNRTogJERhdGVUaW1lOiAyMDE1LzEyLzIzIDE1OjM3OjU4ICQNCiAqICBBVVRIT1I6ICAgJEF1dGhvcjogYWtyaXNobmFuICQNCiAqDQogKiAgUmV2aXNpb24gaGlzdG9yeSAobGF0ZXN0IGZpcnN0KToNCiAqICAgICAgIzMgIDIwMTEvMDUvMDkgIG1hcnRpbl95ICAgIHVwZGF0ZSB0byBNZXRhd2FyZSBJREUoOC41LjEpIA0KICogICAgICAjMiAgMjAxMS8wMy8yNSAgbWFydGluX3kgICAgc3VwcG9ydCBGUEdBIGJ1aWxkIDA1OCBhcHBzDQogKiAgICAgICMxICAyMDExLzAzLzIzICBtYXJ0aW5feSAgICBicmFuY2ggZnJvbSBNRUMxNjE4IHNhbXBsZSBjb2RlOiBNRUMxNjE4X2V2Yl9zYW1wbGVfY29kZV9idWlsZF8wMjAwDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqLw0KLyogSW1wb3J0ZWQgSGVhZGVyIEZpbGUgKi8NCi8vI2luY2x1ZGUgICAgImNvbW1vbi5oIg0KLy8jaW5jbHVkZSAgICAiYnVpbGQuaCINCiNpbmNsdWRlICAgIDxzdGRpbnQuaD4NCg0KI2RlZmluZSBBRERSX1BDUl9QUk9DRVNTT1JfQ0xPQ0tfQ09OVFJPTCAgICAweDQwMDgwMTIwDQojZGVmaW5lIE1NQ1JfUENSX1BST0NFU1NPUl9DTE9DS19DT05UUk9MICAgICgqKHVpbnQzMl90ICopKEFERFJfUENSX1BST0NFU1NPUl9DTE9DS19DT05UUk9MKSkNCiNkZWZpbmUgQ1BVX0NMT0NLX0RJVklERVIJCQkJCTENCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKiBzeXN0ZW1fc2V0X2VjX2Nsb2NrDQoqIFNldCBDUFUgc3BlZWQNCiogQHBhcmFtIHZvaWQNCiogQHJldHVybiB2b2lkDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQp2b2lkIHN5c3RlbV9zZXRfZWNfY2xvY2sodm9pZCkNCnsNCg0KICAgIC8qIFNldCBBUkMgQ1BVIENsb2NrIERpdmlkZXIgdG8gZGV0ZXJtaW5lIHRoZSBDUFUgc3BlZWQgKi8NCiAgICAvKiBTZXQgZGl2aWRlciB0byA4IGZvciA4TUh6IG9wZXJhdGlvbiwgTUNMSyBpbiBzaWxpY29uIGNoaXAgaXMgNjRNSHosIENQVT1NQ0xLL0RpdmlkZXIgKi8NCiAgICBNTUNSX1BDUl9QUk9DRVNTT1JfQ0xPQ0tfQ09OVFJPTCA9IENQVV9DTE9DS19ESVZJREVSOw0KDQp9IC8qIEVuZCBzeXN0ZW1fc2V0X2VjX2Nsb2NrKCkgKi8NCg0K