LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfZmxhc2guYyAgJA0KICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQogKiBPcmlnaW5hbCBBdXRob3I6CQlZYW5nIEh5dW4gVWsgJA0KICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQNCiAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCiAqIEZpbGUgRGVzY3JpcHRpb246CUh1bWF4IFVwZ3JhZGUgQVBJcw0KICogTW9kdWxlOg0KICogUmVtYXJrczoNCiAqLw0KDQovKioNCiAqIEBkZWZncm91cCBVUEdSQURFX0ZMQVNIIEZsYXNoaW5nIEFQSXMgZm9yIFVwZ3JhZGUgTW9kdWxlDQogKiBAaW5ncm91cCBVUEdSQURFDQogKg0KICovDQoNCi8qKg0KICogQGF1dGhvciBIeXVudWsgWWFuZyhodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSkNCiAqIEBkYXRlIDMwIFNlcHQgMjAxMQ0KICovDQoNCi8qKg0KICogQG5vdGUNCiAqIENvcHlyaWdodCAoQykgMjAxMSBIdW1heCBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gPGJyPg0KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbg0KICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCiAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGFueSBhcHBsaWNhYmxlIGxpY2Vuc2UNCiAqIGFncmVlbWVudCBpbiB3cml0aW5nIGJldHdlZW4gSHVtYXggQ29ycG9yYXRpb24gYW5kIHlvdS4NCiAqLw0KDQogLypAeyovDQoNCi8qKg0KICogQGZpbGUgaG14X3VwZ3JhZGVfZmxhc2guYw0KICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIFN0YXJ0IEluY2x1ZGluZyBIZWFkZXIgRmlsZXMgKi8NCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPGZjbnRsLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8c3lzL2lvY3RsLmg+DQojaW5jbHVkZSA8c3lzL21vdW50Lmg+DQojaW5jbHVkZSA8bXRkL210ZC11c2VyLmg+DQojaW5jbHVkZSAiaG14X3VwZ3JhZGVfZmxhc2guaCINCi8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyAqLw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIEVuZCAjZGVmaW5lICovDQovKiB0aGlzIGlzIGZvciB0ZXN0ICovDQojZGVmaW5lIFRBUkdFVF9CT09UX0xPQURFUl9NVEQJIi9kZXYvbXRkYmxvY2swIg0KDQojZGVmaW5lIFRBUkdFVF9OVlJBTV9NVEQJIi9kZXYvbXRkYmxvY2sxIg0KDQovKiB0aGlzIGlzIGZvciB0ZXN0ICovDQojZGVmaW5lIFRBUkdFVF9LRVJORUxfTVRECSIvZGV2L210ZGJsb2NrMTAiDQoNCi8qIHRoaXMgaXMgZm9yIHRlc3QgdWJpIG1hcHBlZCAqLw0KI2RlZmluZSBUQVJHRVRfUk9PVEZTX1VCSV9NVEQJIi9kZXYvbXRkYmxvY2sxMSINCg0KDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogU3RhcnQgdHlwZWRlZiAqLw0KLyogRW5kIHR5cGVkZWYgKi8NCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBTdGFydCBnbG9iYWwgdmFyaWFibGUgKi8NCg0KLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLw0KaW50IGZkX2tlcm5lbCA9IDA7DQppbnQgZmRfcm9vdGZzID0gMDsNCmludCBmZF9ib29ybG9hZGVyID0gMDsNCmludCBmZF9udnJhbSA9IDA7DQoNCnN0YXRpYyB1bnNpZ25lZCBsb25nCXNfRmxhc2hUb3RhbFNpemU7DQpzdGF0aWMgdW5zaWduZWQgbG9uZwlzX0ZsYXNoQmxvY2tTaXplOw0Kc3RhdGljIHVuc2lnbmVkIGNoYXIgKnNfQmxvY2tCdWZmOw0KDQovKiBFbmQgc3RhdGljIHZhcmlhYmxlICovDQppbnQgSE1YX1VQR1JBREVfRmxhc2hfS2VybmVsKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKTsNCmludCBITVhfVVBHUkFERV9GbGFzaF9Sb290ZnModW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOw0KaW50IEhNWF9VUEdSQURFX0ZsYXNoX0Jvb3RMb2FkZXIodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApOw0KDQoNCg0KdW5zaWduZWQgY2hhciAqIEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9LZXJuZWxfTVREKHZvaWQpDQp7DQoJcmV0dXJuIFRBUkdFVF9LRVJORUxfTVREOw0KfQ0KDQp1bnNpZ25lZCBjaGFyICogSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX1Jvb3Rmc19NVEQodm9pZCkNCnsNCglyZXR1cm4gVEFSR0VUX1JPT1RGU19VQklfTVREOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIGZ1bnRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCmludCBITVhfVVBHUkFERV9OVlJBTV9Xcml0ZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplICkNCnsNCglpbnQgcmV0Ow0KCXN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87DQoJdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOw0KCXVuc2lnbmVkIGxvbmcgbW92X29mZnNldCwgcmVtYWluX3NpemU7DQoNCglwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7DQoNCgkvKiAqLw0KCWlmICggZmRfbnZyYW0gPT0gMCApDQoJew0KCQlmZF9udnJhbSA9IG9wZW4oVEFSR0VUX05WUkFNX01URCwgKE9fUkRXUiB8IE9fU1lOQykgKTsNCgkJaWYoIGZkX252cmFtIDwgMCApDQoJCXsNCgkJCXByaW50ZiggIkZhaWxlZCB0byBvcGVuIVxuIiApOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJfQ0KDQoJcmV0ID0gaW9jdGwoZmRfbnZyYW0sIE1FTUdFVElORk8sKHZvaWQgKikmaW5mbyk7DQoJaWYocmV0IDwgMCkNCgl7DQoJCXByaW50ZigiY2FuJ3QgZ2V0IGluZm8gZGF0YSEgKCVkKVxuIiwgcmV0KTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCXJlbWFpbl9zaXplID0gc2l6ZTsNCgltb3Zfb2Zmc2V0ID0gb2Zmc2V0Ow0KDQoJd2hpbGUocmVtYWluX3NpemUgPiAwKQ0KCXsNCgkJLyogb2Zmc2V0wMwgYmxvY2sgs9G+7rytuOkgvsi1yLTZLi4gKi8NCgkJd3JpdGVfc2l6ZSA9IGluZm8uZXJhc2VzaXplOw0KCQl3cml0ZV9zaXplIC09ICgobW92X29mZnNldCArIGluZm8uZXJhc2VzaXplKSVpbmZvLmVyYXNlc2l6ZSk7DQoNCgkJLyoguLbB9ri3wLogs6q408H2ILi4xa0uLiAqLw0KCQlpZiggcmVtYWluX3NpemUgPCB3cml0ZV9zaXplKQ0KCQl7DQoJCQl3cml0ZV9zaXplID0gcmVtYWluX3NpemU7DQoJCX0NCg0KCQlwcmludGYoIiB3cml0ZSA6IG9mZnNldCAtIDB4JXgsIHNpemUgJWRcbiIsIG1vdl9vZmZzZXQsIHdyaXRlX3NpemUpOw0KDQoJCXJldCA9IGxzZWVrKGZkX252cmFtLCBtb3Zfb2Zmc2V0LCBTRUVLX1NFVCk7DQoJCWlmKHJldCA8IDApDQoJCXsNCgkJCXByaW50ZigiY2FuJ3Qgc2VlayBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KDQoJCXJldCA9IHdyaXRlKGZkX252cmFtLCBkYXRhKyhtb3Zfb2Zmc2V0LW9mZnNldCksIHdyaXRlX3NpemUpOw0KCQlpZihyZXQgPCAwKQ0KCQl7DQoJCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7DQoJCQlyZXR1cm4gLTE7DQoJCX0NCg0KCQltb3Zfb2Zmc2V0ICs9IHdyaXRlX3NpemU7DQoJCXJlbWFpbl9zaXplIC09IHdyaXRlX3NpemU7DQoJfQ0KDQoJcmV0dXJuIDA7DQp9DQoNCmludCBITVhfVVBHUkFERV9OVlJBTV9SZWFkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwgdW5zaWduZWQgaW50IHNpemUgKQ0Kew0KCWludCByZXQ7DQoJc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsNCgl1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7DQoJdW5zaWduZWQgbG9uZyBtb3Zfb2Zmc2V0LCByZW1haW5fc2l6ZTsNCg0KCXByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsNCg0KCS8qICovDQoJaWYgKCBmZF9udnJhbSA9PSAwICkNCgl7DQoJCWZkX252cmFtID0gb3BlbihUQVJHRVRfTlZSQU1fTVRELCAoT19SRFdSIHwgT19TWU5DKSApOw0KCQlpZiggZmRfbnZyYW0gPCAwICkNCgkJew0KCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4hXG4iICk7DQoJCQlyZXR1cm4gLTE7DQoJCX0NCgl9DQoNCg0KCXJldCA9IGxzZWVrKGZkX252cmFtLCBvZmZzZXQsIFNFRUtfU0VUKTsNCglpZihyZXQgPCAwKQ0KCXsNCgkJcHJpbnRmKCJjYW4ndCBzZWVrIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJcmV0ID0gcmVhZChmZF9udnJhbSwgZGF0YSwgc2l6ZSk7DQoJaWYocmV0IDwgMCkNCgl7DQoJCXByaW50ZigiY2FuJ3QgcmVhZCBkYXRhISAoJWQpXG4iLCByZXQpOw0KCQlyZXR1cm4gcmV0Ow0KCX0NCg0KCXJldHVybiAwOw0KfQ0KDQoNCg0KaW50IEhNWF9VUEdSQURFX0ZsYXNoX0tlcm5lbCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkNCnsNCglpbnQgcmV0Ow0KCXVuc2lnbmVkIGNoYXIgKiBjb21fYnVmOw0KDQoJcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOw0KCS8qICovDQoJaWYgKCBmZF9rZXJuZWwgPT0gMCApDQoJew0KCQlmZF9rZXJuZWwgPSBvcGVuKEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9LZXJuZWxfTVREKCksIChPX1JEV1IgfCBPX1NZTkMpICk7DQoJCWlmKCBmZF9rZXJuZWwgPCAwICkNCgkJew0KCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4gZmRfa2VybmVsIVxuIiApOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJfQ0KDQoJcmV0ID0gbHNlZWsoZmRfa2VybmVsLCBvZmZzZXQsIFNFRUtfU0VUKTsNCglpZihyZXQgPCAwKQ0KCXsNCgkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCgkJcmV0dXJuIHJldDsNCgl9DQoNCglyZXQgPSB3cml0ZShmZF9rZXJuZWwsIGRhdGEsIHNpemUpOw0KCWlmKHJldCA8IDApDQoJew0KCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7DQoJCXJldHVybiByZXQ7DQoJfQ0KDQoJLyogUmVhZCBhbmQgQ29tcGFyZSAqLw0KCXJldCA9IGxzZWVrKGZkX2tlcm5lbCwgb2Zmc2V0LCBTRUVLX1NFVCk7DQoJaWYocmV0IDwgMCkNCgl7DQoJCXByaW50ZigiZmFpbGVkIHNlZWtpbmcgcG9zaXRpb24hICglZClcbiIsIHJldCk7DQoJCXJldHVybiByZXQ7DQoJfQ0KDQoJY29tX2J1ZiA9IG1hbGxvYyhzaXplKTsNCglpZiAoY29tX2J1ZiA9PSBOVUxMICkNCgl7DQoJCXByaW50ZigibWFsbG9jIGZhaWVkISEhIFxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCglyZXQgPSByZWFkKGZkX2tlcm5lbCwgY29tX2J1Ziwgc2l6ZSk7DQoJaWYocmV0IDwgMCkNCgl7DQoJCXByaW50ZigiY2FuJ3QgcmVhZCBkYXRhISAoJWQpXG4iLCByZXQpOw0KCQlyZXR1cm4gcmV0Ow0KCX0NCg0KCWlmICggbWVtY21wKGRhdGEsIGNvbV9idWYsIHNpemUpICE9IDAgKQ0KCXsNCgkJcHJpbnRmKCJXcml0dGVuIGRhdGEgaXMgZGlmZmVybmV0ISEgXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCWZyZWUoY29tX2J1Zik7DQoNCglyZXR1cm4gMDsNCn0NCg0KaW50IEhNWF9VUEdSQURFX0ZsYXNoX0Jvb3RMb2FkZXIodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICogZGF0YSApDQp7DQoJaW50IHJldDsNCglzdHJ1Y3QgbXRkX2luZm9fdXNlciBpbmZvOw0KCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSwgd3JpdGVfc2l6ZTsNCgl1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOw0KDQoJcHJpbnRmICggIlNLSVAgQk9PVCBMT0FERVIuLi4gXG4iKTsNCglwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7DQoNCglyZXR1cm4gMDsNCg0KCS8qICovDQoJaWYgKCBmZF9ib29ybG9hZGVyID09IDAgKQ0KCXsNCgkJZmRfYm9vcmxvYWRlciA9IG9wZW4oVEFSR0VUX0JPT1RfTE9BREVSX01URCwgKE9fUkRXUiB8IE9fU1lOQykgKTsNCgkJaWYoIGZkX2Jvb3Jsb2FkZXIgPCAwICkNCgkJew0KCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4hXG4iICk7DQoJCQlyZXR1cm4gLTE7DQoJCX0NCgl9DQoNCglyZXQgPSBpb2N0bChmZF9ib29ybG9hZGVyLCBNRU1HRVRJTkZPLCh2b2lkICopJmluZm8pOw0KCWlmKHJldCA8IDApDQoJew0KCQlwcmludGYoImNhbid0IGdldCBpbmZvIGRhdGEhICglZClcbiIsIHJldCk7DQoJCXJldHVybiAtMTsNCgl9DQoNCglyZW1haW5fc2l6ZSA9IHNpemU7DQoJbW92X29mZnNldCA9IG9mZnNldDsNCg0KCXdoaWxlKHJlbWFpbl9zaXplID4gMCkNCgl7DQoJCS8qIG9mZnNldMDMIGJsb2NrILPRvu68rbjpIL7Itci02S4uICovDQoJCXdyaXRlX3NpemUgPSBpbmZvLmVyYXNlc2l6ZTsNCgkJd3JpdGVfc2l6ZSAtPSAoKG1vdl9vZmZzZXQgKyBpbmZvLmVyYXNlc2l6ZSklaW5mby5lcmFzZXNpemUpOw0KDQoJCS8qILi2wfa4t8C6ILOquNPB9iC4uMWtLi4gKi8NCgkJaWYoIHJlbWFpbl9zaXplIDwgd3JpdGVfc2l6ZSkNCgkJew0KCQkJd3JpdGVfc2l6ZSA9IHJlbWFpbl9zaXplOw0KCQl9DQoNCgkJcHJpbnRmKCIgd3JpdGUgOiBvZmZzZXQgLSAweCV4LCBzaXplICVkXG4iLCBtb3Zfb2Zmc2V0LCB3cml0ZV9zaXplKTsNCg0KCQlyZXQgPSBsc2VlayhmZF9ib29ybG9hZGVyLCBtb3Zfb2Zmc2V0LCBTRUVLX1NFVCk7DQoJCWlmKHJldCA8IDApDQoJCXsNCgkJCXByaW50ZigiY2FuJ3Qgc2VlayBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KDQoJCXJldCA9IHdyaXRlKGZkX2Jvb3Jsb2FkZXIsIGRhdGErKG1vdl9vZmZzZXQtb2Zmc2V0KSwgd3JpdGVfc2l6ZSk7DQoJCWlmKHJldCA8IDApDQoJCXsNCgkJCXByaW50ZigiY2FuJ3Qgd3JpdGUgZGF0YSEgKCVkKVxuIiwgcmV0KTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KDQoJCW1vdl9vZmZzZXQgKz0gd3JpdGVfc2l6ZTsNCgkJcmVtYWluX3NpemUgLT0gd3JpdGVfc2l6ZTsNCgl9DQoNCglyZXR1cm4gMDsNCn0NCg0KaW50IEhNWF9VUEdSQURFX0ZsYXNoX1Jvb3Rmcyh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkNCnsNCglpbnQgcmV0Ow0KCXVuc2lnbmVkIGNoYXIgKiBjb21fYnVmOw0KCXByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsNCg0KCS8qICovDQoJaWYgKCBmZF9yb290ZnMgPT0gMCApDQoJew0KCQlmZF9yb290ZnMgPSBvcGVuKEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9Sb290ZnNfTVREKCksIChPX1JEV1IgfCBPX1NZTkMpICk7DQoJCWlmKCBmZF9yb290ZnMgPCAwICkNCgkJew0KCQkJcHJpbnRmKCAiRmFpbGVkIHRvIG9wZW4gZmRfa2VybmVsIVxuIiApOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJfQ0KDQoJcmV0ID0gbHNlZWsoZmRfcm9vdGZzLCBvZmZzZXQsIFNFRUtfU0VUKTsNCglpZihyZXQgPCAwKQ0KCXsNCgkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCgkJcmV0dXJuIHJldDsNCgl9DQoNCglyZXQgPSB3cml0ZShmZF9yb290ZnMsIGRhdGEsIHNpemUpOw0KCWlmKHJldCA8IDApDQoJew0KCQlwcmludGYoImNhbid0IHdyaXRlIGRhdGEhICglZClcbiIsIHJldCk7DQoJCXJldHVybiByZXQ7DQoJfQ0KDQoJLyogUmVhZCBhbmQgQ29tcGFyZSAqLw0KCXJldCA9IGxzZWVrKGZkX3Jvb3Rmcywgb2Zmc2V0LCBTRUVLX1NFVCk7DQoJaWYocmV0IDwgMCkNCgl7DQoJCXByaW50ZigiZmFpbGVkIHNlZWtpbmcgcG9zaXRpb24hICglZClcbiIsIHJldCk7DQoJCXJldHVybiByZXQ7DQoJfQ0KDQoJY29tX2J1ZiA9IG1hbGxvYyhzaXplKTsNCglpZiAoY29tX2J1ZiA9PSBOVUxMICkNCgl7DQoJCXByaW50ZigibWFsbG9jIGZhaWVkISEhIFxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoNCglyZXQgPSByZWFkKGZkX3Jvb3RmcywgY29tX2J1Ziwgc2l6ZSk7DQoJaWYocmV0IDwgMCkNCgl7DQoJCXByaW50ZigiY2FuJ3QgcmVhZCBkYXRhISAoJWQpXG4iLCByZXQpOw0KCQlyZXR1cm4gcmV0Ow0KCX0NCg0KCWlmICggbWVtY21wKGRhdGEsIGNvbV9idWYsIHNpemUpICE9IDAgKQ0KCXsNCgkJcHJpbnRmKCJXcml0dGVuIGRhdGEgaXMgZGlmZmVybmV0ISEgXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCWZyZWUoY29tX2J1Zik7DQoNCglyZXR1cm4gMDsNCg0KDQp9DQoNCg0KDQovKkB9Ki8NCg==