LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIKkgMjAxNSBNaWNyb2NoaXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzLg0KKiBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgZGVyaXZhdGl2ZXMgZXhjbHVzaXZlbHkgd2l0aA0KKiBNaWNyb2NoaXAgcHJvZHVjdHMuDQoqIFRISVMgU09GVFdBUkUgSVMgU1VQUExJRUQgQlkgTUlDUk9DSElQICJBUyBJUyIuDQoqIE5PIFdBUlJBTlRJRVMsIFdIRVRIRVIgRVhQUkVTUywgSU1QTElFRCBPUiBTVEFUVVRPUlksIEFQUExZIFRPIFRISVMgU09GVFdBUkUsDQoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwNCiogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBJVFMgSU5URVJBQ1RJT04gV0lUSCBNSUNST0NISVANCiogUFJPRFVDVFMsIENPTUJJTkFUSU9OIFdJVEggQU5ZIE9USEVSIFBST0RVQ1RTLCBPUiBVU0UgSU4gQU5ZIEFQUExJQ0FUSU9OLg0KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsDQoqIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBMT1NTLCBEQU1BR0UsIENPU1QgT1IgRVhQRU5TRSBPRiBBTlkgS0lORA0KKiBXSEFUU09FVkVSIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCwgRVZFTiBJRiBNSUNST0NISVAgSEFTDQoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLg0KKiBUTyBUSEUgRlVMTEVTVCBFWFRFTlQgQUxMT1dFRCBCWSBMQVcsIE1JQ1JPQ0hJUCdTIFRPVEFMIExJQUJJTElUWSBPTiBBTEwNCiogQ0xBSU1TIElOIEFOWSBXQVkgUkVMQVRFRCBUTyBUSElTIFNPRlRXQVJFIFdJTEwgTk9UIEVYQ0VFRCBUSEUgQU1PVU5UIE9GDQoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4NCiogTUlDUk9DSElQIFBST1ZJREVTIFRISVMgU09GVFdBUkUgQ09ORElUSU9OQUxMWSBVUE9OIFlPVVIgQUNDRVBUQU5DRQ0KKiBPRiBUSEVTRSBURVJNUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQpWZXJzaW9uIENvbnRyb2wgSW5mb3JtYXRpb24gKFBlcmZvcmNlKQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQokUmV2aXNpb246ICMxICQgDQokRGF0ZVRpbWU6IDIwMTYvMDkvMjIgMDg6MDM6NDkgJCANCiRBdXRob3I6IHByYW1hbnMgJA0KTGFzdCBDaGFuZ2U6CVVwZGF0ZWQgZm9yIHRhYnMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKiBAZmlsZSBwY3JfYXBpLmMNCiogXGJyaWVmIFBvd2VyLCBDbG9ja3MsIGFuZCBSZXNldHMgQVBJIFNvdXJjZSBmaWxlDQoqIFxhdXRob3IganZhc2FudGgNCiogDQoqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBQQ1IgQVBJcyAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qKiBAZGVmZ3JvdXAgUENSDQogKiAgQHsNCiAqLw0KDQojaW5jbHVkZSAiY29tbW9uX2xpYi5oIg0KI2luY2x1ZGUgInBjci5oIg0KDQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICBGdW5jdGlvbnMgdG8gcHJvZ3JhbSBTbGVlcCBFbmFibGUsIENMSyBSZXFkIFN0YXR1cywgUmVzZXQgRW5hYmxlIGZvciBhIGJsb2NrICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyoqIFNldHMgb3IgQ2xlYXJzIGJsb2NrIHNwZWNpZmljIGJpdCBpbiBQQ1IgU2xlZXAgRW5hYmxlIFJlZ2lzdGVyDQogKiBAcGFyYW0gcGNyX2Jsb2NrX2lkIC0gcGNyIGJsb2NrIGlkIGVuY29kZWQgdXNpbmcgUENSeF9SRUdTX0JJVCANCiAqIEBwYXJhbSBzZXRfY2xyX2ZsYWcgLSBGbGFnIHRvIHNldCAoMSkgb3IgY2xlYXIgKDApIGJpdCBpbiB0aGUgUENSIFNsZWVwIEVuYWJsZSBSZWdpc3Rlcg0KICovDQp2b2lkIHBjcl9zbGVlcF9lbmFibGUodWludDMyX3QgcGNyX2Jsb2NrX2lkLCB1aW50OF90IHNldF9jbHJfZmxhZykNCnsNCiAgICB1aW50MzJfdCBiaXRfbWFzazsNCiAgICB1aW50OF90IHBjcl9yZWdfaWQ7CQ0KIA0KICAgIGJpdF9tYXNrID0gMVVMPDwocGNyX2Jsb2NrX2lkICYgMHhGRnUpOw0KICAgIHBjcl9yZWdfaWQgPSAodWludDhfdCkoKHBjcl9ibG9ja19pZCA+PiBQQ1J4X1JFR1NfUE9TX1NMRUVQX0VOQUJMRSkgJiAweEZGdSk7DQoNCiAgICBwX3Bjcl9yZWdfdXBkYXRlKHBjcl9yZWdfaWQsIGJpdF9tYXNrLCBzZXRfY2xyX2ZsYWcpOwkNCn0NCg0KDQovKiogR2V0IENsb2NrIFJlcXVpcmVkIFN0YXR1cyBmb3IgdGhlIGJsb2NrDQogKiBAcGFyYW0gcGNyX2Jsb2NrX2lkIC0gcGNyIGJsb2NrIGlkIGVuY29kZWQgdXNpbmcgUENSeF9SRUdTX0JJVCANCiAqIEByZXR1cm4gdWludDhfdCAtIDEgaWYgQ2xvY2sgUmVxdWlyZWQgU3RhdHVzIHNldCwgZWxzZSAwDQogKi8NCnVpbnQ4X3QgcGNyX2Nsb2NrX3JlcWRfc3RhdHVzX2dldCh1aW50MzJfdCBwY3JfYmxvY2tfaWQpDQp7DQogICAgdWludDMyX3QgYml0X21hc2s7DQogICAgdWludDhfdCBwY3JfcmVnX2lkLCByZXRWYWw7CQ0KIA0KICAgIGJpdF9tYXNrID0gMVVMPDwocGNyX2Jsb2NrX2lkICYgMHhGRnUpOw0KICAgIHBjcl9yZWdfaWQgPSAodWludDhfdCkoKHBjcl9ibG9ja19pZCA+PiBQQ1J4X1JFR1NfUE9TX0NMS19SRVFEX1NUUykgJiAweEZGdSk7DQoNCiAgICByZXRWYWwgPSAwOw0KICAgIGlmIChwX3Bjcl9yZWdfZ2V0KHBjcl9yZWdfaWQsIGJpdF9tYXNrKSkNCiAgICB7DQogICAgICAgIHJldFZhbCA9IDE7DQogICAgfQ0KICAgIA0KICAgIHJldHVybiByZXRWYWw7DQp9DQoNCi8qKiBTZXRzIG9yIENsZWFycyBSZXNldCBFbmFibGUgcmVnaXN0ZXIgYml0IGZvciB0aGUgYmxvY2sNCiAqIEBwYXJhbSBwY3JfYmxvY2tfaWQgLSBwY3IgYmxvY2sgaWQgZW5jb2RlZCB1c2luZyBQQ1J4X1JFR1NfQklUIA0KICogQHBhcmFtIHNldF9jbHJfZmxhZyAtIEZsYWcgdG8gc2V0ICgxKSBvciBjbGVhciAoMCkgYml0IGluIHRoZSBQQ1IgUmVzZXQgRW5hYmxlIFJlZ2lzdGVyDQogKi8NCnZvaWQgcGNyX3Jlc2V0X2VuYWJsZSh1aW50MzJfdCBwY3JfYmxvY2tfaWQsIHVpbnQ4X3Qgc2V0X2Nscl9mbGFnKQ0Kew0KICAgIHVpbnQzMl90IGJpdF9tYXNrOw0KICAgIHVpbnQ4X3QgcGNyX3JlZ19pZDsJDQogDQogICAgYml0X21hc2sgPSAxVUw8PChwY3JfYmxvY2tfaWQgJiAweEZGdSk7DQogICAgcGNyX3JlZ19pZCA9ICh1aW50OF90KSgocGNyX2Jsb2NrX2lkID4+IFBDUnhfUkVHU19QT1NfUkVTRVRfRU5BQkxFKSAmIDB4RkZ1KTsNCg0KICAgIHBfcGNyX3JlZ191cGRhdGUocGNyX3JlZ19pZCwgYml0X21hc2ssIHNldF9jbHJfZmxhZyk7CQkJCQkNCn0NCg0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyBmb3IgZW50ZXJpbmcgbG93IHBvd2VyIG1vZGVzICAgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBJbnN0cnVjdHMgYWxsIGJsb2NrcyB0byBzbGVlcCBieSBzZXR0aW5nIHRoZSBTbGVlcCBFbmFibGUgYml0cyAqLw0Kdm9pZCBwY3JfYWxsX2Jsb2Nrc19zbGVlcCh2b2lkKQ0Kew0KCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0VDX1NMRUVQX0VOQUJMRV8wLCAweEZGRkZGRkZGKTsNCglwX3Bjcl9yZWdfd3JpdGUoUENSX1JFR19FQ19TTEVFUF9FTkFCTEVfMSwgMHhGRkZGRkZGRik7DQoJcF9wY3JfcmVnX3dyaXRlKFBDUl9SRUdfRUNfU0xFRVBfRU5BQkxFXzIsIDB4RkZGRkZGRkYpOw0KCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0VDX1NMRUVQX0VOQUJMRV8zLCAweEZGRkZGRkZGKTsJCQ0KCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0VDX1NMRUVQX0VOQUJMRV80LCAweEZGRkZGRkZGKTsJCQ0KfQ0KDQovKiogQ2xlYXJzIHRoZSBTbGVlcCBFbmFibGUgYml0cyBmb3IgYWxsIGJsb2NrcyAqLw0KIHZvaWQgcGNyX2FsbF9ibG9ja3Nfd2FrZSh2b2lkKQ0Kew0KCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0VDX1NMRUVQX0VOQUJMRV8wLCAwKTsNCglwX3Bjcl9yZWdfd3JpdGUoUENSX1JFR19FQ19TTEVFUF9FTkFCTEVfMSwgMCk7DQoJcF9wY3JfcmVnX3dyaXRlKFBDUl9SRUdfRUNfU0xFRVBfRU5BQkxFXzIsIDApOw0KCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0VDX1NMRUVQX0VOQUJMRV8zLCAwKTsJCQ0KCXBfcGNyX3JlZ193cml0ZShQQ1JfUkVHX0VDX1NMRUVQX0VOQUJMRV80LCAwKTsJCQ0KfQ0KDQovKiogUHJvZ3JhbXMgcmVxdWlyZWQgc2xlZXAgbW9kZSBpbiBTeXN0ZW0gU2xlZXAgQ29udHJvbCBSZWdpc3Rlcg0KICogQHBhcmFtIHNsZWVwX21vZGUgLSBzZWUgZW51bSBTWVNURU1fU0xFRVBfTU9ERVMNCiAqLw0Kdm9pZCBwY3Jfc3lzdGVtX3NsZWVwKHVpbnQ4X3Qgc2xlZXBfbW9kZSkNCnsNCiAgICBwX3Bjcl9zeXN0ZW1fc2xlZXBfY3RybF93cml0ZShzbGVlcF9tb2RlKTsNCn0NCg0KLyoqIFJlYWRzIHRoZSB2YWx1ZSBvZiBQb3dlciBSZXNldCBzdGF0dXMgcmVnaXN0ZXINCiAqIEBwYXJhbSBub25lDQogKiBAcmV0dXJuIFBvd2VyIFJlc2V0IFN0YXR1cyBSZWcgdmFsdWUNCiAqLw0KdWludDE2X3QgcGNyX3Bvd2VyX3Jlc2V0X3N0YXR1c19yZWFkKHZvaWQpDQp7DQoJcmV0dXJuIChwX3Bjcl9wd3JfcmVzZXRfc3RzX2dldCgpKTsNCn0NCg0KLyoqIFJlYWRzIHRoZSB2YWx1ZSBvZiBQb3dlciBSZXNldCBjb250cm9sIHJlZ2lzdGVyDQogKiBAcGFyYW0gbm9uZQ0KICogQHJldHVybiBQb3dlciByZXNldCBjb250cm9sIFJlZyB2YWx1ZQ0KICovDQp1aW50MTZfdCBwY3JfcG93ZXJfcmVzZXRfY3RybF9yZWFkKHZvaWQpDQp7DQoJcmV0dXJuIChwX3Bjcl9wd3JfcmVzZXRfY3RybF9yZWFkKCkpOw0KfQ0KDQovKiogU2V0cyB0aGUgdmFsdWUgb2YgUFdSX0lOViBiaXQgdG8gMSBvciAwDQoqIEBwYXJhbSBzZXRfY2xyOiAxIG9yIDANCiAqIEByZXR1cm4gbm9uZQ0KICovDQp2b2lkIHBjcl9wd3JfcmVzZXRfY3RybF9wd3JfaW52X3NldF9jbHIodWludDhfdCBzZXRfY2xyKQ0Kew0KCXBfcGNyX3B3cl9yZXNldF9jdHJsX3B3cl9pbnZfc2V0X2NscihzZXRfY2xyKTsNCn0NCg0KLyoqIFNldHMgdGhlIHZhbHVlIG9mIEhPU1RfUkVTRVQgYml0IHRvIDEgb3IgMA0KKiBAcGFyYW0gc2V0X2NscjogMSBvciAwDQogKiBAcmV0dXJuIG5vbmUNCiAqLw0Kdm9pZCBwY3JfcHdyX3Jlc2V0X2N0cmxfaG9zdF9yc3Rfc2V0X2Nscih1aW50OF90IHNldF9jbHIpDQp7DQoJcF9wY3JfcHdyX3Jlc2V0X2N0cmxfaG9zdF9yc3Rfc2V0X2NscihzZXRfY2xyKTsNCn0NCg0KLyoqIFNldHMgdGhlIFNPRlQgU1lTIFJFU0VUIGJpdCB0byAxDQoqIEBwYXJhbSBub25lDQogKiBAcmV0dXJuIG5vbmUNCiAqLw0Kdm9pZCBwY3Jfc3lzdGVtX3Jlc2V0X3NldCgpDQp7DQoJcF9wY3Jfc3lzdGVtX3Jlc2V0X3NldCgpOw0KfQ0KDQovKiogV3JpdGVzIHRvIHRoZSBQS0UgQ2xvY2sgcmVnaXN0ZXINCiogQHBhcmFtIGNsb2NrIHZhbHVlDQogKiBAcmV0dXJuIG5vbmUNCiAqLw0Kdm9pZCBwY3JfcGtlX2Nsb2NrX3dyaXRlKHVpbnQ4X3QgcGtlX2Nsa192YWwpDQp7DQoJcF9wY3JfcGtlX2Nsb2NrX3dyaXRlKHBrZV9jbGtfdmFsKTsNCn0NCg0KLyoqIFJlYWRzIHRoZSBQS0UgY2xvY2sgcmVnaXN0ZXINCiogQHBhcmFtIG5vbmUNCiAqIEByZXR1cm4gY2xvY2sgdmFsdWUNCiAqLw0KdWludDhfdCBwY3JfcGtlX2Nsb2NrX3JlYWQoKQ0Kew0KCXJldHVybiAocF9wY3JfcGtlX2Nsb2NrX3JlYWQoKSk7DQp9DQoNCi8qKiBXcml0ZXMgdG8gdGhlIE9TQyBjYWwgcmVnaXN0ZXINCiogQHBhcmFtIGNhbGlicmF0aW9uIHZhbHVlOiAxIG9yIDANCiAqIEByZXR1cm4gbm9uZQ0KICovDQp2b2lkIHBjcl9vc2NfY2FsX3dyaXRlKHVpbnQ4X3QgcGtlX2Nsa192YWwpDQp7DQoJcF9wY3Jfb3NjX2NhbF93cml0ZShwa2VfY2xrX3ZhbCk7DQp9DQoNCi8qKiBSZWFkcyB0aGUgb3NjIGNhbCByZWdpc3Rlcg0KKiBAcGFyYW0gbm9uZQ0KICogQHJldHVybiBjYWwgdmFsdWUNCiAqLw0KdWludDhfdCBwY3Jfb3NjX2NhbF9yZWFkKCkNCnsNCglyZXR1cm4gKHBfcGNyX29zY19jYWxfcmVhZCgpKTsNCn0NCg0KDQovKiBlbmQgcGNyX2FwaS5jICovDQovKiogICBAfQ0KICovDQo=