LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogQ09QWVJJR0hUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgVGFsaWdlbnQsIEluYy4sICAxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAgMTk5Ny0xOTk5ICAgICAqCiogICBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb2dyYW0tUHJvcGVydHkgb2YgSUJNIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICoKKiAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlICAgKgoqICAgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuICAgICAgICAgICAgICAgICAgICAqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogIEZJTEUgTkFNRSA6IHB1dGlsLmgKKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDA1LzE0Lzk4ICAgIG5vcyAgICAgICAgIENyZWF0aW9uIChjb250ZW50IG1vdmVkIGhlcmUgZnJvbSB1dHlwZXMuaCkuCiogICAwNi8xNy85OSAgICBlcm0gICAgICAgICBBZGRlZCBJRUVFXzc1NAoqICAgMDcvMjIvOTggICAgc3RlcGhlbiAgICAgQWRkZWQgSUVFRXJlbWFpbmRlciwgbWF4LCBtaW4sIHRydW5jCiogICAwOC8xMy85OCAgICBzdGVwaGVuICAgICBBZGRlZCBpc05lZ2F0aXZlSW5maW5pdHksIGlzUG9zaXRpdmVJbmZpbml0eQoqICAgMDgvMjQvOTggICAgc3RlcGhlbiAgICAgQWRkZWQgbG9uZ0JpdHNGcm9tRG91YmxlCiogICAwMy8wMi85OSAgICBzdGVwaGVuICAgICBSZW1vdmVkIG9wZW5GaWxlKCkuICBBZGRlZCBBUzQwMCBzdXBwb3J0LgoqICAgMDQvMTUvOTkgICAgc3RlcGhlbiAgICAgQ29udmVydGVkIHRvIEMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKI2lmbmRlZiBQVVRJTF9ICiNkZWZpbmUgUFVUSUxfSAoKI2luY2x1ZGUgInV0eXBlcy5oIgoKLyogRGVmaW5lIHRoaXMgaWYgeW91ciBwbGF0Zm9ybSBzdXBwb3J0cyBJRUVFIDc1NCBmbG9hdGluZyBwb2ludCAqLwojZGVmaW5lIElFRUVfNzU0ICAgICAgIAoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBQbGF0Zm9ybSB1dGlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKgogKiBQbGF0Zm9ybSB1dGlsaXRpZXMgaXNvbGF0ZXMgdGhlIHBsYXRmb3JtIGRlcGVuZGVuY2llcyBvZiB0aGUKICogbGliYXJhcnkuICBGb3IgZWFjaCBwbGF0Zm9ybSB3aGljaCB0aGlzIGNvZGUgaXMgcG9ydGVkIHRvLCB0aGVzZQogKiBmdW5jdGlvbnMgbWF5IGhhdmUgdG8gYmUgcmUtaW1wbGVtZW50ZWQuICAqLwoKLyogRmxvYXRpbmcgcG9pbnQgdXRpbGl0aWVzICovCkNBUEkgYm9vbF90ICBVX0VYUE9SVDIgIGljdV9pc05hTihkb3VibGUpOwpDQVBJIGJvb2xfdCAgVV9FWFBPUlQyIGljdV9pc0luZmluaXRlKGRvdWJsZSk7CkNBUEkgYm9vbF90ICAgVV9FWFBPUlQyIGljdV9pc1Bvc2l0aXZlSW5maW5pdHkoZG91YmxlKTsKQ0FQSSBib29sX3QgICBVX0VYUE9SVDIgaWN1X2lzTmVnYXRpdmVJbmZpbml0eShkb3VibGUpOwpDQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfZ2V0TmFOKHZvaWQpOwpDQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfZ2V0SW5maW5pdHkodm9pZCk7CgpDQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfZmxvb3IoZG91YmxlIHgpOwpDQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfY2VpbChkb3VibGUgeCk7CkNBUEkgZG91YmxlICAgVV9FWFBPUlQyIGljdV9mYWJzKGRvdWJsZSB4KTsKQ0FQSSBkb3VibGUgICBVX0VYUE9SVDIgaWN1X21vZGYoZG91YmxlIHgsIGRvdWJsZSogeSk7CkNBUEkgZG91YmxlICAgVV9FWFBPUlQyIGljdV9mbW9kKGRvdWJsZSB4LCBkb3VibGUgeSk7CkNBUEkgZG91YmxlICAgVV9FWFBPUlQyIGljdV9wb3cxMChpbnQzMl90IHgpOwpDQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfSUVFRXJlbWFpbmRlcihkb3VibGUgeCwgZG91YmxlIHkpOwpDQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfZm1heChkb3VibGUgeCwgZG91YmxlIHkpOwpDQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfZm1pbihkb3VibGUgeCwgZG91YmxlIHkpOwpDQVBJIGludDMyX3QgIFVfRVhQT1JUMiBpY3VfbWF4KGludDMyX3QgeCwgaW50MzJfdCB5KTsKQ0FQSSBpbnQzMl90ICBVX0VYUE9SVDIgaWN1X21pbihpbnQzMl90IHgsIGludDMyX3QgeSk7CkNBUEkgZG91YmxlICAgVV9FWFBPUlQyIGljdV90cnVuYyhkb3VibGUgZCk7CkNBUEkgdm9pZCAgICAgVV9FWFBPUlQyIGljdV9sb25nQml0c0Zyb21Eb3VibGUoZG91YmxlIGQsIGludDMyX3QgKmhpLCB1aW50MzJfdCAqbG8pOwoKLyoKICogUmV0dXJuIHRoZSBmbG9vciBvZiB0aGUgbG9nIGJhc2UgMTAgb2YgYSBnaXZlbiBkb3VibGUuCiAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciBpbmFjY3VyYWNpZXMgd2hpY2ggYXJpc2UgbmF0dXJhbGx5IHdoZW4KICogY29tcHV0aW5nIGxvZ3MsIGFuZCBhbHdheXMgZ2l2ZXMgdGhlIGNvcnJlY3QgdmFsdWUuICBUaGUgcGFyYW1ldGVyCiAqIG11c3QgYmUgcG9zaXRpdmUgYW5kIGZpbml0ZS4KICogKFRoYW5rcyB0byBBbGFuIExpdSBmb3Igc3VwcGx5aW5nIHRoaXMgZnVuY3Rpb24uKQogKi8KLyoqCiAqIFJldHVybnMgdGhlIGNvbW1vbiBsb2cgb2YgdGhlIGRvdWJsZSB2YWx1ZSBkLgogKiBAcGFyYW0gZCB0aGUgZG91YmxlIHZhbHVlIHRvIGFwcGx5IHRoZSBjb21tb24gbG9nIGZ1bmN0aW9uIGZvci4KICogQHJldHVybiB0aGUgbG9nIG9mIHZhbHVlIGQuCiAqLwpDQVBJIGludDE2X3QgIFVfRVhQT1JUMiBpY3VfbG9nMTAoZG91YmxlIGQpOwoKLyoqCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgaW4gYSBkb3VibGUgbnVtYmVyIHguCiAqIEBwYXJhbSB4IHRoZSBkb3VibGUgbnVtYmVyCiAqLwpDQVBJIGludDMyX3QgIFVfRVhQT1JUMiBpY3VfZGlnaXRzQWZ0ZXJEZWNpbWFsKGRvdWJsZSB4KTsKCi8qKgogKiBUaW1lIHpvbmUgdXRpbGl0aWVzCiAqCiAqIFdyYXBwZXJzIGZvciBDIHJ1bnRpbWUgbGlicmFyeSBmdW5jdGlvbnMgcmVsYXRpbmcgdG8gdGltZXpvbmVzLgogKiBUaGUgdF90enNldCgpIGZ1bmN0aW9uIChzaW1pbGFyIHRvIHR6c2V0KSB1c2VzIHRoZSBjdXJyZW50IHNldHRpbmcgCiAqIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBUWiB0byBhc3NpZ24gdmFsdWVzIHRvIHRocmVlIGdsb2JhbCAKICogdmFyaWFibGVzOiBkYXlsaWdodCwgdGltZXpvbmUsIGFuZCB0em5hbWUuIFRoZXNlIHZhcmlhYmxlcyBoYXZlIHRoZSAKICogZm9sbG93aW5nIG1lYW5pbmdzLCBhbmQgYXJlIGRlY2xhcmVkIGluICZsdDt0aW1lLmg+LgogKgogKiAgIGRheWxpZ2h0ICAgTm9uemVybyBpZiBkYXlsaWdodC1zYXZpbmctdGltZSB6b25lIChEU1QpIGlzIHNwZWNpZmllZAogKiAgICAgICAgICAgICAgaW4gVFo7IG90aGVyd2lzZSwgMC4gRGVmYXVsdCB2YWx1ZSBpcyAxLgogKiAgIHRpbWV6b25lICAgRGlmZmVyZW5jZSBpbiBzZWNvbmRzIGJldHdlZW4gY29vcmRpbmF0ZWQgdW5pdmVyc2FsCiAqICAgICAgICAgICAgICB0aW1lIGFuZCBsb2NhbCB0aW1lLiBFLmcuLCAtMjgsODAwIGZvciBQU1QgKEdNVC04aHJzKQogKiAgIHR6bmFtZSgwKSAgVGhyZWUtbGV0dGVyIHRpbWUtem9uZSBuYW1lIGRlcml2ZWQgZnJvbSBUWiBlbnZpcm9ubWVudAogKiAgICAgICAgICAgICAgdmFyaWFibGUuIEUuZy4sICJQU1QiLgogKiAgIHR6bmFtZSgxKSAgVGhyZWUtbGV0dGVyIERTVCB6b25lIG5hbWUgZGVyaXZlZCBmcm9tIFRaIGVudmlyb25tZW50CiAqICAgICAgICAgICAgICB2YXJpYWJsZS4gIEUuZy4sICJQRFQiLiBJZiBEU1Qgem9uZSBpcyBvbWl0dGVkIGZyb20gVFosCiAqICAgICAgICAgICAgICB0em5hbWUoMSkgaXMgYW4gZW1wdHkgc3RyaW5nLgogKgogKiBOb3RlczogRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUgVFogZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY29ycmVzcG9uZAogKiB0byB0aGUgY3VycmVudCB0aW1lIHpvbmUgaW4gR2VybWFueSwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZQogKiBmb2xsb3dpbmcgc3RhdGVtZW50czoKICoKICogICBzZXQgVFo9R1NUMUdEVAogKiAgIHNldCBUWj1HU1QrMUdEVAogKgogKiBJZiB0aGUgVFogdmFsdWUgaXMgbm90IHNldCwgdF90enNldCgpIGF0dGVtcHRzIHRvIHVzZSB0aGUgdGltZSB6b25lCiAqIGluZm9ybWF0aW9uIHNwZWNpZmllZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gVW5kZXIgV2luZG93cyBOVAogKiBhbmQgV2luZG93cyA5NSwgdGhpcyBpbmZvcm1hdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIENvbnRyb2wgUGFuZWyScwogKiBEYXRlL1RpbWUgYXBwbGljYXRpb24uCiAqLwpDQVBJIHZvaWQgICAgIFVfRVhQT1JUMiBpY3VfdHpzZXQodm9pZCk7CkNBUEkgaW50MzJfdCAgVV9FWFBPUlQyIGljdV90aW1lem9uZSh2b2lkKTsKQ0FQSSBjaGFyKiAgICBVX0VYUE9SVDIgaWN1X3R6bmFtZShpbnQgaW5kZXgpOwoKLyogR2V0IFVUQyAoR01UKSB0aW1lIG1lYXN1cmVkIGluIHNlY29uZHMgc2luY2UgMDowMCBvbiAxLzEvNzAuICovCkNBUEkgaW50MzJfdCAgVV9FWFBPUlQyIGljdV9nZXRVVEN0aW1lKHZvaWQpOwoKLyogUmV0dXJuIHRoZSBkZWZhdWx0IGRhdGEgZGlyZWN0b3J5IGZvciB0aGlzIHBsYXRmb3JtLiAgU2VlIExvY2FsZS4gKi8KQ0FQSSBjb25zdCBjaGFyKiAgVV9FWFBPUlQyIGljdV9nZXREZWZhdWx0RGF0YURpcmVjdG9yeSh2b2lkKTsKCi8qIFJldHVybiB0aGUgZGVmYXVsdCBjb2RlcGFnZSBmb3IgdGhpcyBwbGF0Zm9ybSBhbmQgbG9jYWxlICovCkNBUEkgY29uc3QgY2hhciogIFVfRVhQT1JUMiBpY3VfZ2V0RGVmYXVsdENvZGVwYWdlKHZvaWQpOwoKLyogUmV0dXJuIHRoZSBkZWZhdWx0IGxvY2FsZSBJRCBzdHJpbmcgYnkgcXVlcnlpbmcgdGhzIHN5c3RlbSwgb3IKICAgICAgIHplcm8gaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4gKi8KQ0FQSSBjb25zdCBjaGFyKiAgVV9FWFBPUlQyIGljdV9nZXREZWZhdWx0TG9jYWxlSUQodm9pZCk7CgovKioKICogUmV0cnVuIHRydWUgaWYgdGhpcyBwbGF0Zm9ybSBpcyBiaWctZW5kaWFuLCB0aGF0IGlzLCBpZiB0aGUgbnVtYmVyCiAqIDB4MTIzNCBpcyBzdG9yZWQgMHgxMiwgMHgzNCBpbiBtZW1vcnkuICBSZXR1cm4gZmFsc2UgaWYgdGhpcyBwbGF0Zm9ybQogKiBpcyBsaXR0bGUtZW5kaWFuLCBhbmQgaXMsIGlmIDB4MTIzNCBpcyBzdG9yZWQgMHgzNCwgMHgxMiBpbiBtZW1vcnkuCiAqLwpDQVBJIGJvb2xfdCAgICAgICAgICAgVV9FWFBPUlQyIGljdV9pc0JpZ0VuZGlhbih2b2lkKTsKCi8qCiAqIEZpbmRzIHRoZSBsZWFzdCBkb3VibGUgZ3JlYXRlciB0aGFuIGQgKGlmIHBvc2l0aXZlID09IHRydWUpLAogKiBvciB0aGUgZ3JlYXRlc3QgZG91YmxlIGxlc3MgdGhhbiBkIChpZiBwb3NpdGl2ZSA9PSBmYWxzZSkuCiAqCiAqIFRoaXMgaXMgYSBzcGVjaWFsIHB1cnBvc2UgZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgQ2hvaWNlRm9ybWF0IEFQSQogKiBkb2N1bWVudGF0aW9uLgogKiBJdCBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gYW5kIG5vdCBkZWZpbmVkIGZvciBOYU4gb3IgSW5maW5pdHkKICovCkNBUEkgZG91YmxlICAgICAgICAgICBVX0VYUE9SVDIgaWN1X25leHREb3VibGUoZG91YmxlIGQsIGJvb2xfdCBwb3NpdGl2ZSk7CgojZW5kaWYKCgoKCg==