LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRmlsZSBOYW1lOiAgICAgICAgICAgJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfZmxhc2guYyAgJAogKiBWZXJzaW9uOiAgICAgICAgICAgICAkUmV2aXNpb246ICAgMS4wICAkCiAqIE9yaWdpbmFsIEF1dGhvcjogICAgIFlhbmcgSHl1biBVayAkCiAqIEN1cnJlbnQgQXV0aG9yOiAgICAgICRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKICogRGF0ZTogICAgICAgICAgICAgICAgJERhdGU6IDIwMTEuMDkuMzAKICogRmlsZSBEZXNjcmlwdGlvbjogICAgSHVtYXggVXBncmFkZSBBUElzCiAqIE1vZHVsZToKICogUmVtYXJrczoKICovCgovKioKICogQGRlZmdyb3VwIFVQR1JBREVfRkxBU0ggRmxhc2hpbmcgQVBJcyBmb3IgVXBncmFkZSBNb2R1bGUKICogQGluZ3JvdXAgVVBHUkFERQogKgogKi8KCi8qKgogKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQogKiBAZGF0ZSAzMCBTZXB0IDIwMTEKICovCgovKioKICogQG5vdGUKICogQ29weXJpZ2h0IChDKSAyMDExIEh1bWF4IENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiA8YnI+CiAqIFRoaXMgc29mdHdhcmUgaXMgdGhlIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24KICogb2YgSHVtYXggQ29ycG9yYXRpb24uIFlvdSBtYXkgbm90IHVzZSBvciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYW55IGFwcGxpY2FibGUgbGljZW5zZQogKiBhZ3JlZW1lbnQgaW4gd3JpdGluZyBiZXR3ZWVuIEh1bWF4IENvcnBvcmF0aW9uIGFuZCB5b3UuCiAqLwoKIC8qQHsqLwoKLyoqCiAqIEBmaWxlIGhteF91cGdyYWRlX2ZsYXNoLmMKICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGVhZGVyIEZpbGVzICoqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBTdGFydCBJbmNsdWRpbmcgSGVhZGVyIEZpbGVzICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNpbmNsdWRlIDxtdGQvbXRkLXVzZXIuaD4KLyogRW5kIEluY2x1ZGluZyBIZWFkZXJzICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogU3RhcnQgI2RlZmluZSAqLwovKiB0aGlzIGlzIGZvciB0ZXN0ICovCiNkZWZpbmUgVEFSR0VUX05WUkFNX01URCAgICAgICAgIi9kZXYvbXRkYmxvY2sxIgojZGVmaW5lIFRBUkdFVF9OVlJBTV9NVERDICAgICAgICIvZGV2L210ZDEiCi8qIEVuZCAjZGVmaW5lICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0eXBlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBTdGFydCB0eXBlZGVmICovCi8qIEVuZCB0eXBlZGVmICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogU3RhcnQgZ2xvYmFsIHZhcmlhYmxlICovCmludCBsaWJ1cGdyYWRlX3ZlcmJvc2UgPSAxOwovKiBFbmQgZ2xvYmFsIHZhcmlhYmxlICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKiogc3RhdGljIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogU3RhcnQgc3RhdGljIHZhcmlhYmxlICovCmludCBmZF9udnJhbSA9IDA7CmludCBmZF9udnJhbV9jID0gLTE7CgpzdGF0aWMgdW5zaWduZWQgbG9uZyAgICBzX0ZsYXNoVG90YWxTaXplOwpzdGF0aWMgdW5zaWduZWQgbG9uZyAgICBzX0ZsYXNoQmxvY2tTaXplOwpzdGF0aWMgdW5zaWduZWQgY2hhciAqc19CbG9ja0J1ZmY7Ci8qIEVuZCBzdGF0aWMgdmFyaWFibGUgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyBmdW50aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBITVhfVVBHUkFERV9OVlJBTV9Xcml0ZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSApCnsKICBpbnQgcmV0OwogIHN0cnVjdCBtdGRfaW5mb191c2VyIGluZm87CiAgdW5zaWduZWQgbG9uZyBibG9ja19zaXplLCB3cml0ZV9zaXplOwogIHVuc2lnbmVkIGxvbmcgbW92X29mZnNldCwgcmVtYWluX3NpemU7CgogIGlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4eCwgc2l6ZSAlZCwgZGF0YSA9ICUwMnhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBzaXplLCBkYXRhWzBdICk7CgogIC8qICovCiAgaWYgKCBmZF9udnJhbSA9PSAwICkgewogICAgZmRfbnZyYW0gPSBvcGVuKFRBUkdFVF9OVlJBTV9NVEQsIChPX1JEV1IgfCBPX1NZTkMpICk7CiAgICBpZiggZmRfbnZyYW0gPCAwICkgewogICAgICBwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQogIH0KCiAgaWYgKCBmZF9udnJhbV9jIDwgMCApIHsKICAgIGZkX252cmFtX2MgPSBvcGVuKFRBUkdFVF9OVlJBTV9NVERDLCAoT19SRFdSIHwgT19TWU5DKSApOwogICAgaWYoIGZkX252cmFtX2MgPCAwICkgewogICAgICBwcmludGYoICJGYWlsZWQgdG8gb3BlbiFcbiIgKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQogIH0KCiAgcmV0ID0gaW9jdGwoZmRfbnZyYW1fYywgTUVNR0VUSU5GTywodm9pZCAqKSZpbmZvKTsKICBpZihyZXQgPCAwKSB7CiAgICBwcmludGYoImNhbid0IGdldCBpbmZvIGRhdGEhICglZClcbiIsIHJldCk7CiAgICByZXR1cm4gLTE7CiAgfQoKICByZW1haW5fc2l6ZSA9IHNpemU7CiAgbW92X29mZnNldCA9IG9mZnNldDsKCiAgd2hpbGUocmVtYWluX3NpemUgPiAwKSB7CiAgICAvKiBvZmZzZXTAzCBibG9jayCz0b7uvK246SC+yLXItNkuLiAqLwogICAgd3JpdGVfc2l6ZSA9IGluZm8uZXJhc2VzaXplOwogICAgd3JpdGVfc2l6ZSAtPSAoKG1vdl9vZmZzZXQgKyBpbmZvLmVyYXNlc2l6ZSklaW5mby5lcmFzZXNpemUpOwoKICAgIC8qILi2wfa4t8C6ILOquNPB9iC4uMWtLi4gKi8KICAgIGlmKCByZW1haW5fc2l6ZSA8IHdyaXRlX3NpemUpIHsKICAgICAgd3JpdGVfc2l6ZSA9IHJlbWFpbl9zaXplOwogICAgfQoKICAgIGlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHsKICAgICAgcHJpbnRmKCIgd3JpdGUgOiBvZmZzZXQgLSAweCV4LCBzaXplICVkXG4iLCBtb3Zfb2Zmc2V0LCB3cml0ZV9zaXplKTsKICAgIH0KCiAgICByZXQgPSBsc2VlayhmZF9udnJhbSwgbW92X29mZnNldCwgU0VFS19TRVQpOwogICAgaWYocmV0IDwgMCkgewogICAgICBwcmludGYoImNhbid0IHNlZWsgcG9zaXRpb24hICglZClcbiIsIHJldCk7CiAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICByZXQgPSB3cml0ZShmZF9udnJhbSwgZGF0YSsobW92X29mZnNldC1vZmZzZXQpLCB3cml0ZV9zaXplKTsKICAgIGlmKHJldCA8IDApIHsKICAgICAgcHJpbnRmKCJjYW4ndCB3cml0ZSBkYXRhISAoJWQpXG4iLCByZXQpOwogICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgbW92X29mZnNldCArPSB3cml0ZV9zaXplOwogICAgcmVtYWluX3NpemUgLT0gd3JpdGVfc2l6ZTsKICB9CgogIHJldHVybiAwOwp9CgppbnQgSE1YX1VQR1JBREVfTlZSQU1fUmVhZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplICkKewogIGludCByZXQ7CiAgc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsKICB1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUsIHdyaXRlX3NpemU7CiAgdW5zaWduZWQgbG9uZyBtb3Zfb2Zmc2V0LCByZW1haW5fc2l6ZTsKCiAgaWYgKGxpYnVwZ3JhZGVfdmVyYm9zZSkgcHJpbnRmKCJbJXNdIG9mZnNldCAlMDh4LCBzaXplICVkLCBkYXRhID0gJTAyeFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvZmZzZXQsIHNpemUsIGRhdGFbMF0gKTsKCiAgLyogKi8KICBpZiAoIGZkX252cmFtID09IDAgKSB7CiAgICBmZF9udnJhbSA9IG9wZW4oVEFSR0VUX05WUkFNX01URCwgKE9fUkRXUiB8IE9fU1lOQykgKTsKICAgIGlmKCBmZF9udnJhbSA8IDAgKSB7CiAgICAgIHByaW50ZiggIkZhaWxlZCB0byBvcGVuIVxuIiApOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgfQoKCiAgcmV0ID0gbHNlZWsoZmRfbnZyYW0sIG9mZnNldCwgU0VFS19TRVQpOwogIGlmKHJldCA8IDApIHsKICAgIHByaW50ZigiY2FuJ3Qgc2VlayBwb3NpdGlvbiEgKCVkKVxuIiwgcmV0KTsKICAgIHJldHVybiAtMTsKICB9CgogIHJldCA9IHJlYWQoZmRfbnZyYW0sIGRhdGEsIHNpemUpOwogIGlmKHJldCA8IDApIHsKICAgIHByaW50ZigiY2FuJ3QgcmVhZCBkYXRhISAoJWQpXG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKICB9CgogIHJldHVybiAwOwp9CgoKLypAfSovCg==