LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKiBGaWxlIERlc2NyaXB0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogRmlsZSBOYW1lOgkJJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfZmxhc2guYyAgJA0KICogVmVyc2lvbjoJCQkkUmV2aXNpb246ICAgMS4wICAkDQogKiBPcmlnaW5hbCBBdXRob3I6CQlZYW5nIEh5dW4gVWsgJA0KICogQ3VycmVudCBBdXRob3I6CSRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQNCiAqIERhdGU6CQkJJERhdGU6IDIwMTEuMDkuMzANCiAqIEZpbGUgRGVzY3JpcHRpb246CUh1bWF4IFVwZ3JhZGUgQVBJcw0KICogTW9kdWxlOg0KICogUmVtYXJrczoNCiAqLw0KDQovKioNCiAqIEBkZWZncm91cCBVUEdSQURFX0ZMQVNIIEZsYXNoaW5nIEFQSXMgZm9yIFVwZ3JhZGUgTW9kdWxlDQogKiBAaW5ncm91cCBVUEdSQURFDQogKg0KICovDQoNCi8qKg0KICogQGF1dGhvciBIeXVudWsgWWFuZyhodXlhbmdAaHVtYXhkaWdpdGFsLmNvbSkNCiAqIEBkYXRlIDMwIFNlcHQgMjAxMQ0KICovDQoNCi8qKg0KICogQG5vdGUNCiAqIENvcHlyaWdodCAoQykgMjAxMSBIdW1heCBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gPGJyPg0KICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbg0KICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUNCiAqIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGFueSBhcHBsaWNhYmxlIGxpY2Vuc2UNCiAqIGFncmVlbWVudCBpbiB3cml0aW5nIGJldHdlZW4gSHVtYXggQ29ycG9yYXRpb24gYW5kIHlvdS4NCiAqLw0KDQogLypAeyovDQoNCi8qKg0KICogQGZpbGUgaG14X3VwZ3JhZGVfZmxhc2guYw0KICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIFN0YXJ0IEluY2x1ZGluZyBIZWFkZXIgRmlsZXMgKi8NCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPGZjbnRsLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8c3lzL2lvY3RsLmg+DQojaW5jbHVkZSA8c3lzL21vdW50Lmg+DQojaW5jbHVkZSA8bXRkL210ZC11c2VyLmg+DQojaW5jbHVkZSAiaG14X3VwZ3JhZGVfZmxhc2guaCINCi8qIEVuZCBJbmNsdWRpbmcgSGVhZGVycyAqLw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIEVuZCAjZGVmaW5lICovDQovKiB0aGlzIGlzIGZvciB0ZXN0ICovDQojZGVmaW5lIFRBUkdFVF9CT09UX0xPQURFUl9NVEQJIi9kZXYvbXRkYmxvY2swIg0KDQojZGVmaW5lIFRBUkdFVF9OVlJBTV9NVEQJIi9kZXYvbXRkYmxvY2sxIg0KI2RlZmluZSBUQVJHRVRfTlZSQU1fTVREQwkiL2Rldi9tdGQxIg0KDQovKiB0aGlzIGlzIGZvciB0ZXN0ICovDQojZGVmaW5lIFRBUkdFVF9LRVJORUxfTVRECSIvZGV2L210ZGJsb2NrMTAiDQoNCi8qIHRoaXMgaXMgZm9yIHRlc3QgdWJpIG1hcHBlZCAqLw0KI2RlZmluZSBUQVJHRVRfUk9PVEZTX1VCSV9NVEQJIi9kZXYvbXRkYmxvY2sxMSINCg0KDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHR5cGVkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogU3RhcnQgdHlwZWRlZiAqLw0KLyogRW5kIHR5cGVkZWYgKi8NCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBTdGFydCBnbG9iYWwgdmFyaWFibGUgKi8NCmludCBsaWJ1cGdyYWRlX3ZlcmJvc2UgPSAxOw0KLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLw0KaW50IGZkX2tlcm5lbCA9IDA7DQppbnQgZmRfcm9vdGZzID0gMDsNCmludCBmZF9ib29ybG9hZGVyID0gMDsNCmludCBmZF9udnJhbSA9IDA7DQppbnQgZmRfbnZyYW1fYyA9IC0xOw0KDQpzdGF0aWMgdW5zaWduZWQgbG9uZwlzX0ZsYXNoVG90YWxTaXplOw0Kc3RhdGljIHVuc2lnbmVkIGxvbmcJc19GbGFzaEJsb2NrU2l6ZTsNCnN0YXRpYyB1bnNpZ25lZCBjaGFyICpzX0Jsb2NrQnVmZjsNCg0KLyogRW5kIHN0YXRpYyB2YXJpYWJsZSAqLw0KaW50IEhNWF9VUEdSQURFX0ZsYXNoX0tlcm5lbCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICk7DQppbnQgSE1YX1VQR1JBREVfRmxhc2hfUm9vdGZzKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKTsNCmludCBITVhfVVBHUkFERV9GbGFzaF9Cb290TG9hZGVyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKTsNCg0KDQoNCnVuc2lnbmVkIGNoYXIgKiBITVhfVVBHUkFERV9HZXRfRGVhY3RpdmF0ZWRfS2VybmVsX01URCh2b2lkKQ0Kew0KCXJldHVybiBUQVJHRVRfS0VSTkVMX01URDsNCn0NCg0KdW5zaWduZWQgY2hhciAqIEhNWF9VUEdSQURFX0dldF9EZWFjdGl2YXRlZF9Sb290ZnNfTVREKHZvaWQpDQp7DQoJcmV0dXJuIFRBUkdFVF9ST09URlNfVUJJX01URDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyBmdW50aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQppbnQgSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSApDQp7DQoJaW50IHJldDsNCglzdHJ1Y3QgbXRkX2luZm9fdXNlciBpbmZvOw0KCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSwgd3JpdGVfc2l6ZTsNCgl1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOw0KDQoJaWYgKGxpYnVwZ3JhZGVfdmVyYm9zZSkgcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOw0KDQoJLyogKi8NCglpZiAoIGZkX252cmFtID09IDAgKQ0KCXsNCgkJZmRfbnZyYW0gPSBvcGVuKFRBUkdFVF9OVlJBTV9NVEQsIChPX1JEV1IgfCBPX1NZTkMpICk7DQoJCWlmKCBmZF9udnJhbSA8IDAgKQ0KCQl7DQoJCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KCX0NCg0KCWlmICggZmRfbnZyYW1fYyA8IDAgKQ0KCXsNCgkJZmRfbnZyYW1fYyA9IG9wZW4oVEFSR0VUX05WUkFNX01UREMsIChPX1JEV1IgfCBPX1NZTkMpICk7DQoJCWlmKCBmZF9udnJhbV9jIDwgMCApDQoJCXsNCgkJCXByaW50ZiggIkZhaWxlZCB0byBvcGVuIVxuIiApOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJfQ0KDQoJcmV0ID0gaW9jdGwoZmRfbnZyYW1fYywgTUVNR0VUSU5GTywodm9pZCAqKSZpbmZvKTsNCglpZihyZXQgPCAwKQ0KCXsNCgkJcHJpbnRmKCJjYW4ndCBnZXQgaW5mbyBkYXRhISAoJWQpXG4iLCByZXQpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJcmVtYWluX3NpemUgPSBzaXplOw0KCW1vdl9vZmZzZXQgPSBvZmZzZXQ7DQoNCgl3aGlsZShyZW1haW5fc2l6ZSA+IDApDQoJew0KCQkvKiBvZmZzZXTAzCBibG9jayCz0b7uvK246SC+yLXItNkuLiAqLw0KCQl3cml0ZV9zaXplID0gaW5mby5lcmFzZXNpemU7DQoJCXdyaXRlX3NpemUgLT0gKChtb3Zfb2Zmc2V0ICsgaW5mby5lcmFzZXNpemUpJWluZm8uZXJhc2VzaXplKTsNCg0KCQkvKiC4tsH2uLfAuiCzqrjTwfYguLjFrS4uICovDQoJCWlmKCByZW1haW5fc2l6ZSA8IHdyaXRlX3NpemUpDQoJCXsNCgkJCXdyaXRlX3NpemUgPSByZW1haW5fc2l6ZTsNCgkJfQ0KDQoJCWlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiIHdyaXRlIDogb2Zmc2V0IC0gMHgleCwgc2l6ZSAlZFxuIiwgbW92X29mZnNldCwgd3JpdGVfc2l6ZSk7DQoNCgkJcmV0ID0gbHNlZWsoZmRfbnZyYW0sIG1vdl9vZmZzZXQsIFNFRUtfU0VUKTsNCgkJaWYocmV0IDwgMCkNCgkJew0KCQkJcHJpbnRmKCJjYW4ndCBzZWVrIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoNCgkJcmV0ID0gd3JpdGUoZmRfbnZyYW0sIGRhdGErKG1vdl9vZmZzZXQtb2Zmc2V0KSwgd3JpdGVfc2l6ZSk7DQoJCWlmKHJldCA8IDApDQoJCXsNCgkJCXByaW50ZigiY2FuJ3Qgd3JpdGUgZGF0YSEgKCVkKVxuIiwgcmV0KTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KDQoJCW1vdl9vZmZzZXQgKz0gd3JpdGVfc2l6ZTsNCgkJcmVtYWluX3NpemUgLT0gd3JpdGVfc2l6ZTsNCgl9DQoNCglyZXR1cm4gMDsNCn0NCg0KaW50IEhNWF9VUEdSQURFX05WUkFNX1JlYWQodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSApDQp7DQoJaW50IHJldDsNCglzdHJ1Y3QgbXRkX2luZm9fdXNlciBpbmZvOw0KCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSwgd3JpdGVfc2l6ZTsNCgl1bnNpZ25lZCBsb25nIG1vdl9vZmZzZXQsIHJlbWFpbl9zaXplOw0KDQoJaWYgKGxpYnVwZ3JhZGVfdmVyYm9zZSkgcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOw0KDQoJLyogKi8NCglpZiAoIGZkX252cmFtID09IDAgKQ0KCXsNCgkJZmRfbnZyYW0gPSBvcGVuKFRBUkdFVF9OVlJBTV9NVEQsIChPX1JEV1IgfCBPX1NZTkMpICk7DQoJCWlmKCBmZF9udnJhbSA8IDAgKQ0KCQl7DQoJCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KCX0NCg0KDQoJcmV0ID0gbHNlZWsoZmRfbnZyYW0sIG9mZnNldCwgU0VFS19TRVQpOw0KCWlmKHJldCA8IDApDQoJew0KCQlwcmludGYoImNhbid0IHNlZWsgcG9zaXRpb24hICglZClcbiIsIHJldCk7DQoJCXJldHVybiAtMTsNCgl9DQoNCglyZXQgPSByZWFkKGZkX252cmFtLCBkYXRhLCBzaXplKTsNCglpZihyZXQgPCAwKQ0KCXsNCgkJcHJpbnRmKCJjYW4ndCByZWFkIGRhdGEhICglZClcbiIsIHJldCk7DQoJCXJldHVybiByZXQ7DQoJfQ0KDQoJcmV0dXJuIDA7DQp9DQoNCg0KDQppbnQgSE1YX1VQR1JBREVfRmxhc2hfS2VybmVsKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKQ0Kew0KCWludCByZXQ7DQoJdW5zaWduZWQgY2hhciAqIGNvbV9idWY7DQoNCglwcmludGYoIlslc10gb2Zmc2V0ICUwOHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7DQoJLyogKi8NCglpZiAoIGZkX2tlcm5lbCA9PSAwICkNCgl7DQoJCWZkX2tlcm5lbCA9IG9wZW4oSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX0tlcm5lbF9NVEQoKSwgKE9fUkRXUiB8IE9fU1lOQykgKTsNCgkJaWYoIGZkX2tlcm5lbCA8IDAgKQ0KCQl7DQoJCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiBmZF9rZXJuZWwhXG4iICk7DQoJCQlyZXR1cm4gLTE7DQoJCX0NCgl9DQoNCglyZXQgPSBsc2VlayhmZF9rZXJuZWwsIG9mZnNldCwgU0VFS19TRVQpOw0KCWlmKHJldCA8IDApDQoJew0KCQlwcmludGYoImZhaWxlZCBzZWVraW5nIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOw0KCQlyZXR1cm4gcmV0Ow0KCX0NCg0KCXJldCA9IHdyaXRlKGZkX2tlcm5lbCwgZGF0YSwgc2l6ZSk7DQoJaWYocmV0IDwgMCkNCgl7DQoJCXByaW50ZigiY2FuJ3Qgd3JpdGUgZGF0YSEgKCVkKVxuIiwgcmV0KTsNCgkJcmV0dXJuIHJldDsNCgl9DQoNCgkvKiBSZWFkIGFuZCBDb21wYXJlICovDQoJcmV0ID0gbHNlZWsoZmRfa2VybmVsLCBvZmZzZXQsIFNFRUtfU0VUKTsNCglpZihyZXQgPCAwKQ0KCXsNCgkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCgkJcmV0dXJuIHJldDsNCgl9DQoNCgljb21fYnVmID0gbWFsbG9jKHNpemUpOw0KCWlmIChjb21fYnVmID09IE5VTEwgKQ0KCXsNCgkJcHJpbnRmKCJtYWxsb2MgZmFpZWQhISEgXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCXJldCA9IHJlYWQoZmRfa2VybmVsLCBjb21fYnVmLCBzaXplKTsNCglpZihyZXQgPCAwKQ0KCXsNCgkJcHJpbnRmKCJjYW4ndCByZWFkIGRhdGEhICglZClcbiIsIHJldCk7DQoJCXJldHVybiByZXQ7DQoJfQ0KDQoJaWYgKCBtZW1jbXAoZGF0YSwgY29tX2J1Ziwgc2l6ZSkgIT0gMCApDQoJew0KCQlwcmludGYoIldyaXR0ZW4gZGF0YSBpcyBkaWZmZXJuZXQhISBcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJZnJlZShjb21fYnVmKTsNCg0KCXJldHVybiAwOw0KfQ0KDQppbnQgSE1YX1VQR1JBREVfRmxhc2hfQm9vdExvYWRlcih1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKiBkYXRhICkNCnsNCglpbnQgcmV0Ow0KCXN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87DQoJdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOw0KCXVuc2lnbmVkIGxvbmcgbW92X29mZnNldCwgcmVtYWluX3NpemU7DQoNCglwcmludGYgKCAiU0tJUCBCT09UIExPQURFUi4uLiBcbiIpOw0KCXByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsNCg0KCXJldHVybiAwOw0KDQoJLyogKi8NCglpZiAoIGZkX2Jvb3Jsb2FkZXIgPT0gMCApDQoJew0KCQlmZF9ib29ybG9hZGVyID0gb3BlbihUQVJHRVRfQk9PVF9MT0FERVJfTVRELCAoT19SRFdSIHwgT19TWU5DKSApOw0KCQlpZiggZmRfYm9vcmxvYWRlciA8IDAgKQ0KCQl7DQoJCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsNCgkJCXJldHVybiAtMTsNCgkJfQ0KCX0NCg0KCXJldCA9IGlvY3RsKGZkX2Jvb3Jsb2FkZXIsIE1FTUdFVElORk8sKHZvaWQgKikmaW5mbyk7DQoJaWYocmV0IDwgMCkNCgl7DQoJCXByaW50ZigiY2FuJ3QgZ2V0IGluZm8gZGF0YSEgKCVkKVxuIiwgcmV0KTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCXJlbWFpbl9zaXplID0gc2l6ZTsNCgltb3Zfb2Zmc2V0ID0gb2Zmc2V0Ow0KDQoJd2hpbGUocmVtYWluX3NpemUgPiAwKQ0KCXsNCgkJLyogb2Zmc2V0wMwgYmxvY2sgs9G+7rytuOkgvsi1yLTZLi4gKi8NCgkJd3JpdGVfc2l6ZSA9IGluZm8uZXJhc2VzaXplOw0KCQl3cml0ZV9zaXplIC09ICgobW92X29mZnNldCArIGluZm8uZXJhc2VzaXplKSVpbmZvLmVyYXNlc2l6ZSk7DQoNCgkJLyoguLbB9ri3wLogs6q408H2ILi4xa0uLiAqLw0KCQlpZiggcmVtYWluX3NpemUgPCB3cml0ZV9zaXplKQ0KCQl7DQoJCQl3cml0ZV9zaXplID0gcmVtYWluX3NpemU7DQoJCX0NCg0KCQlwcmludGYoIiB3cml0ZSA6IG9mZnNldCAtIDB4JXgsIHNpemUgJWRcbiIsIG1vdl9vZmZzZXQsIHdyaXRlX3NpemUpOw0KDQoJCXJldCA9IGxzZWVrKGZkX2Jvb3Jsb2FkZXIsIG1vdl9vZmZzZXQsIFNFRUtfU0VUKTsNCgkJaWYocmV0IDwgMCkNCgkJew0KCQkJcHJpbnRmKCJjYW4ndCBzZWVrIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoNCgkJcmV0ID0gd3JpdGUoZmRfYm9vcmxvYWRlciwgZGF0YSsobW92X29mZnNldC1vZmZzZXQpLCB3cml0ZV9zaXplKTsNCgkJaWYocmV0IDwgMCkNCgkJew0KCQkJcHJpbnRmKCJjYW4ndCB3cml0ZSBkYXRhISAoJWQpXG4iLCByZXQpOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoNCgkJbW92X29mZnNldCArPSB3cml0ZV9zaXplOw0KCQlyZW1haW5fc2l6ZSAtPSB3cml0ZV9zaXplOw0KCX0NCg0KCXJldHVybiAwOw0KfQ0KDQppbnQgSE1YX1VQR1JBREVfRmxhc2hfUm9vdGZzKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqIGRhdGEgKQ0Kew0KCWludCByZXQ7DQoJdW5zaWduZWQgY2hhciAqIGNvbV9idWY7DQoJcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIixfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOw0KDQoJLyogKi8NCglpZiAoIGZkX3Jvb3RmcyA9PSAwICkNCgl7DQoJCWZkX3Jvb3RmcyA9IG9wZW4oSE1YX1VQR1JBREVfR2V0X0RlYWN0aXZhdGVkX1Jvb3Rmc19NVEQoKSwgKE9fUkRXUiB8IE9fU1lOQykgKTsNCgkJaWYoIGZkX3Jvb3RmcyA8IDAgKQ0KCQl7DQoJCQlwcmludGYoICJGYWlsZWQgdG8gb3BlbiBmZF9rZXJuZWwhXG4iICk7DQoJCQlyZXR1cm4gLTE7DQoJCX0NCgl9DQoNCglyZXQgPSBsc2VlayhmZF9yb290ZnMsIG9mZnNldCwgU0VFS19TRVQpOw0KCWlmKHJldCA8IDApDQoJew0KCQlwcmludGYoImZhaWxlZCBzZWVraW5nIHBvc2l0aW9uISAoJWQpXG4iLCByZXQpOw0KCQlyZXR1cm4gcmV0Ow0KCX0NCg0KCXJldCA9IHdyaXRlKGZkX3Jvb3RmcywgZGF0YSwgc2l6ZSk7DQoJaWYocmV0IDwgMCkNCgl7DQoJCXByaW50ZigiY2FuJ3Qgd3JpdGUgZGF0YSEgKCVkKVxuIiwgcmV0KTsNCgkJcmV0dXJuIHJldDsNCgl9DQoNCgkvKiBSZWFkIGFuZCBDb21wYXJlICovDQoJcmV0ID0gbHNlZWsoZmRfcm9vdGZzLCBvZmZzZXQsIFNFRUtfU0VUKTsNCglpZihyZXQgPCAwKQ0KCXsNCgkJcHJpbnRmKCJmYWlsZWQgc2Vla2luZyBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsNCgkJcmV0dXJuIHJldDsNCgl9DQoNCgljb21fYnVmID0gbWFsbG9jKHNpemUpOw0KCWlmIChjb21fYnVmID09IE5VTEwgKQ0KCXsNCgkJcHJpbnRmKCJtYWxsb2MgZmFpZWQhISEgXG4iKTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCXJldCA9IHJlYWQoZmRfcm9vdGZzLCBjb21fYnVmLCBzaXplKTsNCglpZihyZXQgPCAwKQ0KCXsNCgkJcHJpbnRmKCJjYW4ndCByZWFkIGRhdGEhICglZClcbiIsIHJldCk7DQoJCXJldHVybiByZXQ7DQoJfQ0KDQoJaWYgKCBtZW1jbXAoZGF0YSwgY29tX2J1Ziwgc2l6ZSkgIT0gMCApDQoJew0KCQlwcmludGYoIldyaXR0ZW4gZGF0YSBpcyBkaWZmZXJuZXQhISBcbiIpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJZnJlZShjb21fYnVmKTsNCg0KCXJldHVybiAwOw0KDQoNCn0NCg0KDQoNCi8qQH0qLw0K