LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqICBGSUxFIE5BTUUgOiBwdXRpbC5oCioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwNS8xNC85OCAgICBub3MgICAgICAgICBDcmVhdGlvbiAoY29udGVudCBtb3ZlZCBoZXJlIGZyb20gdXR5cGVzLmgpLgoqICAgMDYvMTcvOTkgICAgZXJtICAgICAgICAgQWRkZWQgSUVFRV83NTQKKiAgIDA3LzIyLzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIElFRUVyZW1haW5kZXIsIG1heCwgbWluLCB0cnVuYwoqICAgMDgvMTMvOTggICAgc3RlcGhlbiAgICAgQWRkZWQgaXNOZWdhdGl2ZUluZmluaXR5LCBpc1Bvc2l0aXZlSW5maW5pdHkKKiAgIDA4LzI0Lzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIGxvbmdCaXRzRnJvbURvdWJsZQoqICAgMDMvMDIvOTkgICAgc3RlcGhlbiAgICAgUmVtb3ZlZCBvcGVuRmlsZSgpLiAgQWRkZWQgQVM0MDAgc3VwcG9ydC4KKiAgIDA0LzE1Lzk5ICAgIHN0ZXBoZW4gICAgIENvbnZlcnRlZCB0byBDCiogICAxMS8xNS85OSAgICBoZWxlbmEgICAgICBJbnRlZ3JhdGVkIFMvMzkwIGNoYW5nZXMgZm9yIElFRUUgc3VwcG9ydC4KKiAgIDAxLzExLzAwICAgIGhlbGVuYSAgICAgIEFkZGVkIHVfZ2V0VmVyc2lvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFBVVElMX0gKI2RlZmluZSBQVVRJTF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKCi8qIERlZmluZSB0aGlzIHRvIDEgaWYgeW91ciBwbGF0Zm9ybSBzdXBwb3J0cyBJRUVFIDc1NCBmbG9hdGluZyBwb2ludCwKICAgdG8gMCBpZiBpdCBkb2VzIG5vdC4gKi8KI2lmbmRlZiBJRUVFXzc1NAojICAgZGVmaW5lIElFRUVfNzU0IDEKI2VuZGlmCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogUGxhdGZvcm0gdXRpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqCiAqIFBsYXRmb3JtIHV0aWxpdGllcyBpc29sYXRlcyB0aGUgcGxhdGZvcm0gZGVwZW5kZW5jaWVzIG9mIHRoZQogKiBsaWJhcmFyeS4gIEZvciBlYWNoIHBsYXRmb3JtIHdoaWNoIHRoaXMgY29kZSBpcyBwb3J0ZWQgdG8sIHRoZXNlCiAqIGZ1bmN0aW9ucyBtYXkgaGF2ZSB0byBiZSByZS1pbXBsZW1lbnRlZC4KICovCgovKioKICogRmxvYXRpbmcgcG9pbnQgdXRpbGl0eSB0byBkZXRlcm1pbmUgaWYgYSBkb3VibGUgaXMgTm90IGEgTnVtYmVyIChOYU4pLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIFVCb29sICAgVV9FWFBPUlQyIHVwcnZfaXNOYU4oZG91YmxlIGQpOwovKioKICogRmxvYXRpbmcgcG9pbnQgdXRpbGl0eSB0byBkZXRlcm1pbmUgaWYgYSBkb3VibGUgaGFzIGFuIGluZmluaXRlIHZhbHVlLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIFVCb29sICAgVV9FWFBPUlQyIHVwcnZfaXNJbmZpbml0ZShkb3VibGUgZCk7Ci8qKgogKiBGbG9hdGluZyBwb2ludCB1dGlsaXR5IHRvIGRldGVybWluZSBpZiBhIGRvdWJsZSBoYXMgYSBwb3NpdGl2ZSBpbmZpbml0ZSB2YWx1ZS4KICogQGludGVybmFsCiAqLwpVX1NUQUJMRSBVQm9vbCAgIFVfRVhQT1JUMiB1cHJ2X2lzUG9zaXRpdmVJbmZpbml0eShkb3VibGUgZCk7Ci8qKgogKiBGbG9hdGluZyBwb2ludCB1dGlsaXR5IHRvIGRldGVybWluZSBpZiBhIGRvdWJsZSBoYXMgYSBuZWdhdGl2ZSBpbmZpbml0ZSB2YWx1ZS4KICogQGludGVybmFsCiAqLwpVX1NUQUJMRSBVQm9vbCAgIFVfRVhQT1JUMiB1cHJ2X2lzTmVnYXRpdmVJbmZpbml0eShkb3VibGUgZCk7Ci8qKgogKiBGbG9hdGluZyBwb2ludCB1dGlsaXR5IHRoYXQgcmV0dXJucyBhIE5vdCBhIE51bWJlciAoTmFOKSB2YWx1ZS4KICogQGludGVybmFsCiAqLwpVX1NUQUJMRSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2dldE5hTih2b2lkKTsKLyoqCiAqIEZsb2F0aW5nIHBvaW50IHV0aWxpdHkgdGhhdCByZXR1cm5zIGFuIGluZmluaXRlIHZhbHVlLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZ2V0SW5maW5pdHkodm9pZCk7CgovKioKICogRmxvYXRpbmcgcG9pbnQgdXRpbGl0eSB0byB0cnVuY2F0ZSBhIGRvdWJsZS4KICogQGludGVybmFsCiAqLwpVX1NUQUJMRSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X3RydW5jKGRvdWJsZSBkKTsKLyoqCiAqIEZsb2F0aW5nIHBvaW50IHV0aWxpdHkgdG8gY2FsY3VsYXRlIHRoZSBmbG9vciBvZiBhIGRvdWJsZS4KICogQGludGVybmFsCiAqLwpVX1NUQUJMRSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2Zsb29yKGRvdWJsZSBkKTsKLyoqCiAqIEZsb2F0aW5nIHBvaW50IHV0aWxpdHkgdG8gY2FsY3VsYXRlIHRoZSBjZWlsaW5nIG9mIGEgZG91YmxlLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfY2VpbChkb3VibGUgZCk7Ci8qKgogKiBGbG9hdGluZyBwb2ludCB1dGlsaXR5IHRvIGNhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBkb3VibGUuCiAqIEBpbnRlcm5hbAogKi8KVV9TVEFCTEUgZG91YmxlICBVX0VYUE9SVDIgdXBydl9mYWJzKGRvdWJsZSBkKTsKLyoqCiAqIEZsb2F0aW5nIHBvaW50IHV0aWxpdHkgdG8gY2FsY3VsYXRlIHRoZSBmcmFjdGlvbmFsIGFuZCBpbnRlZ2VyIHBhcnRzIG9mIGEgZG91YmxlLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfbW9kZihkb3VibGUgZCwgZG91YmxlKiBwaW50ZWdlcik7Ci8qKgogKiBGbG9hdGluZyBwb2ludCB1dGlsaXR5IHRvIGNhbGN1bGF0ZSB0aGUgcmVtYWluZGVyIG9mIGEgZG91YmxlIGRpdmlkZWQgYnkgYW5vdGhlciBkb3VibGUuCiAqIEBpbnRlcm5hbAogKi8KVV9TVEFCTEUgZG91YmxlICBVX0VYUE9SVDIgdXBydl9mbW9kKGRvdWJsZSBkLCBkb3VibGUgeSk7Ci8qKgogKiBGbG9hdGluZyBwb2ludCB1dGlsaXR5IHRvIGNhbGN1bGF0ZSBkIHRvIHRoZSBwb3dlciBvZiBleHBvbmVudCAoZF5leHBvbmVudCkuCiAqIEBpbnRlcm5hbAogKi8KVV9TVEFCTEUgZG91YmxlICBVX0VYUE9SVDIgdXBydl9wb3coZG91YmxlIGQsIGRvdWJsZSBleHBvbmVudCk7Ci8qKgogKiBGbG9hdGluZyBwb2ludCB1dGlsaXR5IHRvIGNhbGN1bGF0ZSAxMCB0byB0aGUgcG93ZXIgb2YgZXhwb25lbnQgKDEwXmV4cG9uZW50KS4KICogQGludGVybmFsCiAqLwpVX1NUQUJMRSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X3BvdzEwKGludDMyX3QgZXhwb25lbnQpOwovKioKICogRmxvYXRpbmcgcG9pbnQgdXRpbGl0eSB0byBjYWxjdWxhdGUgdGhlIG1heGltdW0gdmFsdWUgb2YgdHdvIGRvdWJsZXMuCiAqIEBpbnRlcm5hbAogKi8KVV9TVEFCTEUgZG91YmxlICBVX0VYUE9SVDIgdXBydl9mbWF4KGRvdWJsZSBkLCBkb3VibGUgeSk7Ci8qKgogKiBGbG9hdGluZyBwb2ludCB1dGlsaXR5IHRvIGNhbGN1bGF0ZSB0aGUgbWluaW11bSB2YWx1ZSBvZiB0d28gZG91Ymxlcy4KICogQGludGVybmFsCiAqLwpVX1NUQUJMRSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2ZtaW4oZG91YmxlIGQsIGRvdWJsZSB5KTsKLyoqCiAqIFByaXZhdGUgdXRpbGl0eSB0byBjYWxjdWxhdGUgdGhlIG1heGltdW0gdmFsdWUgb2YgdHdvIGludGVnZXJzLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyIHVwcnZfbWF4KGludDMyX3QgZCwgaW50MzJfdCB5KTsKLyoqCiAqIFByaXZhdGUgdXRpbGl0eSB0byBjYWxjdWxhdGUgdGhlIG1pbmltdW0gdmFsdWUgb2YgdHdvIGludGVnZXJzLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyIHVwcnZfbWluKGludDMyX3QgZCwgaW50MzJfdCB5KTsKCiNpZiBVX0lTX0JJR19FTkRJQU4KIyAgIGRlZmluZSB1cHJ2X2lzTmVnYXRpdmUobnVtYmVyKSAoKigoc2lnbmVkIGNoYXIgKikmKG51bWJlcikpPDApCiNlbHNlCiMgICBkZWZpbmUgdXBydl9pc05lZ2F0aXZlKG51bWJlcikgKCooKHNpZ25lZCBjaGFyICopJihudW1iZXIpK3NpemVvZihudW1iZXIpLTEpPDApCiNlbmRpZgoKLyoqCiAqIFJldHVybiB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBudW1iZXIgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYW4gaW50ZWdlcgogKiB0eXBlIG9mIGFyYml0cmFyeSBiaXQgbGVuZ3RoLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfbWF4TWFudGlzc2Eodm9pZCk7CgovKioKICogUmV0dXJuIHRoZSBmbG9vciBvZiB0aGUgbG9nIGJhc2UgMTAgb2YgYSBnaXZlbiBkb3VibGUuCiAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciBpbmFjY3VyYWNpZXMgd2hpY2ggYXJpc2UgbmF0dXJhbGx5IHdoZW4KICogY29tcHV0aW5nIGxvZ3MsIGFuZCBhbHdheXMgZ2l2ZXMgdGhlIGNvcnJlY3QgdmFsdWUuICBUaGUgcGFyYW1ldGVyCiAqIG11c3QgYmUgcG9zaXRpdmUgYW5kIGZpbml0ZS4KICogKFRoYW5rcyB0byBBbGFuIExpdSBmb3Igc3VwcGx5aW5nIHRoaXMgZnVuY3Rpb24uKQogKgogKiBAcGFyYW0gZCB0aGUgZG91YmxlIHZhbHVlIHRvIGFwcGx5IHRoZSBjb21tb24gbG9nIGZ1bmN0aW9uIGZvci4KICogQHJldHVybiB0aGUgbG9nIG9mIHZhbHVlIGQuCiAqIEBpbnRlcm5hbAogKi8KVV9TVEFCTEUgaW50MTZfdCAgVV9FWFBPUlQyIHVwcnZfbG9nMTAoZG91YmxlIGQpOwoKLyoqCiAqIEZsb2F0aW5nIHBvaW50IHV0aWxpdHkgdG8gY2FsY3VsYXRlIHRoZSBsb2dhcml0aG0gb2YgYSBkb3VibGUuCiAqIEBpbnRlcm5hbAogKi8KVV9TVEFCTEUgZG91YmxlICBVX0VYUE9SVDIgdXBydl9sb2coZG91YmxlIGQpOwoKLyoqCiAqIERvZXMgY29tbW9uIG5vdGlvbiBvZiByb3VuZGluZyBlLmcuIHVwcnZfZmxvb3IoeCArIDAuNSk7CiAqIEBwYXJhbSB4IHRoZSBkb3VibGUgbnVtYmVyCiAqIEByZXR1cm4gdGhlIHJvdW5kZWQgZG91YmxlCiAqIEBpbnRlcm5hbAogKi8KVV9TVEFCTEUgZG91YmxlICBVX0VYUE9SVDIgdXBydl9yb3VuZChkb3VibGUgeCk7CgojaWYgMAovKioKICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBpbiBhIGRvdWJsZSBudW1iZXIgeC4KICoKICogQHBhcmFtIHggdGhlIGRvdWJsZSBudW1iZXIKICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBpbiBhIGRvdWJsZSBudW1iZXIgeC4KICogQGludGVybmFsCiAqLwovKlVfU1RBQkxFIGludDMyX3QgIFVfRVhQT1JUMiB1cHJ2X2RpZ2l0c0FmdGVyRGVjaW1hbChkb3VibGUgeCk7Ki8KI2VuZGlmCgovKioKICogVGltZSB6b25lIHV0aWxpdGllcwogKgogKiBXcmFwcGVycyBmb3IgQyBydW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zIHJlbGF0aW5nIHRvIHRpbWV6b25lcy4KICogVGhlIHRfdHpzZXQoKSBmdW5jdGlvbiAoc2ltaWxhciB0byB0enNldCkgdXNlcyB0aGUgY3VycmVudCBzZXR0aW5nIAogKiBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgVFogdG8gYXNzaWduIHZhbHVlcyB0byB0aHJlZSBnbG9iYWwgCiAqIHZhcmlhYmxlczogZGF5bGlnaHQsIHRpbWV6b25lLCBhbmQgdHpuYW1lLiBUaGVzZSB2YXJpYWJsZXMgaGF2ZSB0aGUgCiAqIGZvbGxvd2luZyBtZWFuaW5ncywgYW5kIGFyZSBkZWNsYXJlZCBpbiAmbHQ7dGltZS5oJmd0Oy4KICoKICogICBkYXlsaWdodCAgIE5vbnplcm8gaWYgZGF5bGlnaHQtc2F2aW5nLXRpbWUgem9uZSAoRFNUKSBpcyBzcGVjaWZpZWQKICogICAgICAgICAgICAgIGluIFRaOyBvdGhlcndpc2UsIDAuIERlZmF1bHQgdmFsdWUgaXMgMS4KICogICB0aW1lem9uZSAgIERpZmZlcmVuY2UgaW4gc2Vjb25kcyBiZXR3ZWVuIGNvb3JkaW5hdGVkIHVuaXZlcnNhbAogKiAgICAgICAgICAgICAgdGltZSBhbmQgbG9jYWwgdGltZS4gRS5nLiwgLTI4LDgwMCBmb3IgUFNUIChHTVQtOGhycykKICogICB0em5hbWUoMCkgIFRocmVlLWxldHRlciB0aW1lLXpvbmUgbmFtZSBkZXJpdmVkIGZyb20gVFogZW52aXJvbm1lbnQKICogICAgICAgICAgICAgIHZhcmlhYmxlLiBFLmcuLCAiUFNUIi4KICogICB0em5hbWUoMSkgIFRocmVlLWxldHRlciBEU1Qgem9uZSBuYW1lIGRlcml2ZWQgZnJvbSBUWiBlbnZpcm9ubWVudAogKiAgICAgICAgICAgICAgdmFyaWFibGUuICBFLmcuLCAiUERUIi4gSWYgRFNUIHpvbmUgaXMgb21pdHRlZCBmcm9tIFRaLAogKiAgICAgICAgICAgICAgdHpuYW1lKDEpIGlzIGFuIGVtcHR5IHN0cmluZy4KICoKICogTm90ZXM6IEZvciBleGFtcGxlLCB0byBzZXQgdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGNvcnJlc3BvbmQKICogdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGluIEdlcm1hbnksIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUKICogZm9sbG93aW5nIHN0YXRlbWVudHM6CiAqCiAqICAgc2V0IFRaPUdTVDFHRFQKICogICBzZXQgVFo9R1NUKzFHRFQKICoKICogSWYgdGhlIFRaIHZhbHVlIGlzIG5vdCBzZXQsIHRfdHpzZXQoKSBhdHRlbXB0cyB0byB1c2UgdGhlIHRpbWUgem9uZQogKiBpbmZvcm1hdGlvbiBzcGVjaWZpZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFVuZGVyIFdpbmRvd3MgTlQKICogYW5kIFdpbmRvd3MgOTUsIHRoaXMgaW5mb3JtYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBDb250cm9sIFBhbmVsknMKICogRGF0ZS9UaW1lIGFwcGxpY2F0aW9uLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIHZvaWQgICAgIFVfRVhQT1JUMiB1cHJ2X3R6c2V0KHZvaWQpOwoKLyoqCiAqIERpZmZlcmVuY2UgaW4gc2Vjb25kcyBiZXR3ZWVuIGNvb3JkaW5hdGVkIHVuaXZlcnNhbAogKiB0aW1lIGFuZCBsb2NhbCB0aW1lLiBFLmcuLCAtMjgsODAwIGZvciBQU1QgKEdNVC04aHJzKQogKiBAcmV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIHNlY29uZHMgYmV0d2VlbiBjb29yZGluYXRlZCB1bml2ZXJzYWwgdGltZSBhbmQgbG9jYWwgdGltZS4KICogQGludGVybmFsCiAqLwpVX1NUQUJMRSBpbnQzMl90ICBVX0VYUE9SVDIgdXBydl90aW1lem9uZSh2b2lkKTsKCi8qKgogKiAgIHR6bmFtZSgwKSAgVGhyZWUtbGV0dGVyIHRpbWUtem9uZSBuYW1lIGRlcml2ZWQgZnJvbSBUWiBlbnZpcm9ubWVudAogKiAgICAgICAgICAgICAgdmFyaWFibGUuIEUuZy4sICJQU1QiLgogKiAgIHR6bmFtZSgxKSAgVGhyZWUtbGV0dGVyIERTVCB6b25lIG5hbWUgZGVyaXZlZCBmcm9tIFRaIGVudmlyb25tZW50CiAqICAgICAgICAgICAgICB2YXJpYWJsZS4gIEUuZy4sICJQRFQiLiBJZiBEU1Qgem9uZSBpcyBvbWl0dGVkIGZyb20gVFosCiAqICAgICAgICAgICAgICB0em5hbWUoMSkgaXMgYW4gZW1wdHkgc3RyaW5nLgogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIGNoYXIqICAgIFVfRVhQT1JUMiB1cHJ2X3R6bmFtZShpbnQgbik7CgovKioKICogR2V0IFVUQyAoR01UKSB0aW1lIG1lYXN1cmVkIGluIHNlY29uZHMgc2luY2UgMDowMCBvbiAxLzEvNzAuCiAqIEByZXR1cm4gdGhlIFVUQyB0aW1lIG1lYXN1cmVkIGluIHNlY29uZHMgCiAqIEBpbnRlcm5hbAogKi8KVV9TVEFCTEUgaW50MzJfdCAgVV9FWFBPUlQyIHVwcnZfZ2V0VVRDdGltZSh2b2lkKTsKCi8qKgogKiBSZXR1cm4gdGhlIElDVSBkYXRhIGRpcmVjdG9yeS4gCiAqIFRoZSBkYXRhIGRpcmVjdG9yeSBpcyB3aGVyZSBjb21tb24gZm9ybWF0IElDVSBkYXRhIGZpbGVzICguZGF0IGZpbGVzKQogKiAgIGFyZSBsb2FkZWQgZnJvbS4gIE5vdGUgdGhhdCBub3JtYWwgdXNlIG9mIHRoZSBidWlsdC1pbiBJQ1UKICogICBmYWNpbGl0aWVzIGRvZXMgbm90IHJlcXVpcmUgbG9hZGluZyBvZiBhbiBleHRlcm5hbCBkYXRhIGZpbGU7CiAqICAgdW5sZXNzIHlvdSBhcmUgYWRkaW5nIGN1c3RvbSBkYXRhIHRvIElDVSwgdGhlIGRhdGEgZGlyZWN0b3J5CiAqICAgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQuCiAqCiAqIFRoZSBkYXRhIGRpcmVjdG9yeSBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3M6CiAqICAgIElmIHVfc2V0RGF0YURpcmVjdG9yeSgpIGhhcyBiZWVuIGNhbGxlZCwgdGhhdCBpcyBpdCwgb3RoZXJ3aXNlCiAqICAgIGlmIHRoZSBJQ1VfREFUQSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIHVzZSB0aGF0LCBvdGhlcndpc2UKICogICAgSWYgYSBkYXRhIGRpcmVjdG9yeSB3YXMgc3BlY2lmZWQgYXQgSUNVIGJ1aWxkIHRpbWUKICogICAgICAoI2RlZmluZSBJQ1VfREFUQV9ESVIgInBhdGgiKSwgdXNlIHRoYXQsCiAqICAgIG90aGVyd2lzZSBubyBkYXRhIGRpcmVjdG9yeSBpcyBhdmFpbGFibGUuCiAqCiAqIEByZXR1cm4gdGhlIGRhdGEgZGlyZWN0b3J5LCBvciBhbiBlbXB0eSBzdHJpbmcgKCIiKSBpZiBubyBkYXRhIGRpcmVjdG9yeSBoYXMKICogICAgICAgICBiZWVuIHNwZWNpZmllZC4KICogICAKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSBjb25zdCBjaGFyKiBVX0VYUE9SVDIgdV9nZXREYXRhRGlyZWN0b3J5KHZvaWQpOwoKLyoqIAogKiBTZXQgdGhlIElDVSBkYXRhIGRpcmVjdG9yeS4gCiAqIFRoZSBkYXRhIGRpcmVjdG9yeSBpcyB3aGVyZSBjb21tb24gZm9ybWF0IElDVSBkYXRhIGZpbGVzICguZGF0IGZpbGVzKQogKiAgIGFyZSBsb2FkZWQgZnJvbS4gIE5vdGUgdGhhdCBub3JtYWwgdXNlIG9mIHRoZSBidWlsdC1pbiBJQ1UKICogICBmYWNpbGl0aWVzIGRvZXMgbm90IHJlcXVpcmUgbG9hZGluZyBvZiBhbiBleHRlcm5hbCBkYXRhIGZpbGU7CiAqICAgdW5sZXNzIHlvdSBhcmUgYWRkaW5nIGN1c3RvbSBkYXRhIHRvIElDVSwgdGhlIGRhdGEgZGlyZWN0b3J5CiAqICAgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgaW4gYSBwcm9jZXNzLCBiZWZvcmUgdGhlCiAqIGZpcnN0IElDVSBvcGVyYXRpb24gKGUuZy4sIHVfaW5pdCgpKSB0aGF0IHdpbGwgcmVxdWlyZSB0aGUgbG9hZGluZyBvZiBhbgogKiBJQ1UgZGF0YSBmaWxlLgogKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZS4gVXNlIGl0IGJlZm9yZSBjYWxsaW5nIElDVSBBUElzIGZyb20KICogbXVsdGlwbGUgdGhyZWFkcy4KICoKICogQHBhcmFtIGRpcmVjdG9yeSBUaGUgZGlyZWN0b3J5IHRvIGJlIHNldC4KICoKICogQHNlZSB1X2luaXQKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiB1X3NldERhdGFEaXJlY3RvcnkoY29uc3QgY2hhciAqZGlyZWN0b3J5KTsKCi8qKgogKiBQbGVhc2UgdXNlIHVjbnZfZ2V0RGVmYXVsdE5hbWUoKSBpbnN0ZWFkLgogKiBSZXR1cm4gdGhlIGRlZmF1bHQgY29kZXBhZ2UgZm9yIHRoaXMgcGxhdGZvcm0gYW5kIGxvY2FsZS4KICogVGhpcyBmdW5jdGlvbiBjYW4gY2FsbCBzZXRsb2NhbGUoKSBvbiBVbml4IHBsYXRmb3Jtcy4gUGxlYXNlIHJlYWQgdGhlCiAqIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gb24gc2V0bG9jYWxlKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KICogQHJldHVybiB0aGUgZGVmYXVsdCBjb2RlcGFnZSBmb3IgdGhpcyBwbGF0Zm9ybSAKICogQGludGVybmFsCiAqLwpVX1NUQUJMRSBjb25zdCBjaGFyKiAgVV9FWFBPUlQyIHVwcnZfZ2V0RGVmYXVsdENvZGVwYWdlKHZvaWQpOwoKLyoqCiAqIFBsZWFzZSB1c2UgdWxvY19nZXREZWZhdWx0KCkgaW5zdGVhZC4KICogUmV0dXJuIHRoZSBkZWZhdWx0IGxvY2FsZSBJRCBzdHJpbmcgYnkgcXVlcnlpbmcgdGhzIHN5c3RlbSwgb3IKICogICAgIHplcm8gaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4gCiAqIFRoaXMgZnVuY3Rpb24gY2FuIGNhbGwgc2V0bG9jYWxlKCkgb24gVW5peCBwbGF0Zm9ybXMuIFBsZWFzZSByZWFkIHRoZQogKiBwbGF0Zm9ybSBkb2N1bWVudGF0aW9uIG9uIHNldGxvY2FsZSgpIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAqIEByZXR1cm4gdGhlIGRlZmF1bHQgbG9jYWxlIElEIHN0cmluZwogKiBAaW50ZXJuYWwKICovClVfU1RBQkxFIGNvbnN0IGNoYXIqICBVX0VYUE9SVDIgdXBydl9nZXREZWZhdWx0TG9jYWxlSUQodm9pZCk7CgovKioKICogRmlsZXN5c3RlbSBmaWxlIGFuZCBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXJzLgogKiBFeGFtcGxlOiAnLycgYW5kICc6JyBvbiBVbml4LCAnXFwnIGFuZCAnOycgb24gV2luZG93cy4KICogQHN0YWJsZSBJQ1UgMi4wCiAqLwojaWZkZWYgWFBfTUFDCiMgICBkZWZpbmUgVV9GSUxFX1NFUF9DSEFSICc6JwojICAgZGVmaW5lIFVfRklMRV9BTFRfU0VQX0NIQVIgJzonCiMgICBkZWZpbmUgVV9QQVRIX1NFUF9DSEFSICc7JwojICAgZGVmaW5lIFVfRklMRV9TRVBfU1RSSU5HICI6IgojICAgZGVmaW5lIFVfRklMRV9BTFRfU0VQX1NUUklORyAiOiIKIyAgIGRlZmluZSBVX1BBVEhfU0VQX1NUUklORyAiOyIKI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChPUzIpCiMgICBkZWZpbmUgVV9GSUxFX1NFUF9DSEFSICdcXCcKIyAgIGRlZmluZSBVX0ZJTEVfQUxUX1NFUF9DSEFSICcvJwojICAgZGVmaW5lIFVfUEFUSF9TRVBfQ0hBUiAnOycKIyAgIGRlZmluZSBVX0ZJTEVfU0VQX1NUUklORyAiXFwiCiMgICBkZWZpbmUgVV9GSUxFX0FMVF9TRVBfU1RSSU5HICIvIgojICAgZGVmaW5lIFVfUEFUSF9TRVBfU1RSSU5HICI7IgojZWxzZQojICAgZGVmaW5lIFVfRklMRV9TRVBfQ0hBUiAnLycKIyAgIGRlZmluZSBVX0ZJTEVfQUxUX1NFUF9DSEFSICcvJwojICAgZGVmaW5lIFVfUEFUSF9TRVBfQ0hBUiAnOicKIyAgIGRlZmluZSBVX0ZJTEVfU0VQX1NUUklORyAiLyIKIyAgIGRlZmluZSBVX0ZJTEVfQUxUX1NFUF9TVFJJTkcgIi8iCiMgICBkZWZpbmUgVV9QQVRIX1NFUF9TVFJJTkcgIjoiCiNlbmRpZgoKLyoqCiAqIERldGVybWluZSB3aGV0aGVyIGEgcGF0aG5hbWUgaXMgYWJzb2x1dGUgb3Igbm90LCBhcyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4KICogQHBhcmFtIHBhdGggUGF0aG5hbWUgdG8gdGVzdAogKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHBhdGggaXMgYWJzb2x1dGUKICogQGludGVybmFsIChJQ1UgMy4wKQogKi8KVV9TVEFCTEUgVUJvb2wgVV9FWFBPUlQyIHVwcnZfcGF0aElzQWJzb2x1dGUoY29uc3QgY2hhciAqcGF0aCk7CgovKioKICogQ29udmVydCBjaGFyIGNoYXJhY3RlcnMgdG8gVUNoYXIgY2hhcmFjdGVycy4KICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciAiaW52YXJpYW50IGNoYXJhY3RlcnMiCiAqIHRoYXQgYXJlIGVuY29kZWQgaW4gdGhlIHBsYXRmb3JtIGRlZmF1bHQgZW5jb2RpbmcuCiAqIFRoZXkgYXJlIGEgc21hbGwsIGNvbnN0YW50IHN1YnNldCBvZiB0aGUgZW5jb2RpbmcgYW5kIGluY2x1ZGUKICoganVzdCB0aGUgbGF0aW4gbGV0dGVycywgZGlnaXRzLCBhbmQgc29tZSBwdW5jdHVhdGlvbi4KICogRm9yIGRldGFpbHMsIHNlZSB1dHlwZXMuaCAuCiAqCiAqIEBwYXJhbSBjcyBJbnB1dCBzdHJpbmcsIHBvaW50cyB0byA8Y29kZT5sZW5ndGg8L2NvZGU+CiAqICAgICAgICAgICBjaGFyYWN0ZXIgYnl0ZXMgZnJvbSBhIHN1YnNldCBvZiB0aGUgcGxhdGZvcm0gZW5jb2RpbmcuCiAqIEBwYXJhbSB1cyBPdXRwdXQgc3RyaW5nLCBwb2ludHMgdG8gbWVtb3J5IGZvciA8Y29kZT5sZW5ndGg8L2NvZGU+CiAqICAgICAgICAgICBVbmljb2RlIGNoYXJhY3RlcnMuCiAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvbnZlcnQ7IHRoaXMgbWF5CiAqICAgICAgICAgICAgICAgaW5jbHVkZSB0aGUgdGVybWluYXRpbmcgPGNvZGU+TlVMPC9jb2RlPi4KICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMgp1X2NoYXJzVG9VQ2hhcnMoY29uc3QgY2hhciAqY3MsIFVDaGFyICp1cywgaW50MzJfdCBsZW5ndGgpOwoKLyoqCiAqIENvbnZlcnQgVUNoYXIgY2hhcmFjdGVycyB0byBjaGFyIGNoYXJhY3RlcnMuCiAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBpcyB1c2VmdWwgb25seSBmb3IgImludmFyaWFudCBjaGFyYWN0ZXJzIgogKiB0aGF0IGNhbiBiZSBlbmNvZGVkIGluIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGVuY29kaW5nLgogKiBUaGV5IGFyZSBhIHNtYWxsLCBjb25zdGFudCBzdWJzZXQgb2YgdGhlIGVuY29kaW5nIGFuZCBpbmNsdWRlCiAqIGp1c3QgdGhlIGxhdGluIGxldHRlcnMsIGRpZ2l0cywgYW5kIHNvbWUgcHVuY3R1YXRpb24uCiAqIEZvciBkZXRhaWxzLCBzZWUgdXR5cGVzLmggLgogKgogKiBAcGFyYW0gdXMgSW5wdXQgc3RyaW5nLCBwb2ludHMgdG8gPGNvZGU+bGVuZ3RoPC9jb2RlPgogKiAgICAgICAgICAgVW5pY29kZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGVuY29kZWQgd2l0aCB0aGUKICogICAgICAgICAgIGNvZGVwYWdlLWludmFyaWFudCBzdWJzZXQgb2YgdGhlIHBsYXRmb3JtIGVuY29kaW5nLgogKiBAcGFyYW0gY3MgT3V0cHV0IHN0cmluZywgcG9pbnRzIHRvIG1lbW9yeSBmb3IgPGNvZGU+bGVuZ3RoPC9jb2RlPgogKiAgICAgICAgICAgY2hhcmFjdGVyIGJ5dGVzLgogKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb252ZXJ0OyB0aGlzIG1heQogKiAgICAgICAgICAgICAgIGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIDxjb2RlPk5VTDwvY29kZT4uCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIKdV9VQ2hhcnNUb0NoYXJzKGNvbnN0IFVDaGFyICp1cywgY2hhciAqY3MsIGludDMyX3QgbGVuZ3RoKTsKCi8qKgogKiBDaGVjayBpZiBhIGNoYXIgc3RyaW5nIG9ubHkgY29udGFpbnMgaW52YXJpYW50IGNoYXJhY3RlcnMuCiAqIFNlZSB1dHlwZXMuaCBmb3IgZGV0YWlscy4KICoKICogQHBhcmFtIHMgSW5wdXQgc3RyaW5nIHBvaW50ZXIuCiAqIEBwYXJhbSBsZW5ndGggTGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGNhbiBiZSAtMSBpZiBOVUwtdGVybWluYXRlZC4KICogQHJldHVybiBUUlVFIGlmIHMgY29udGFpbnMgb25seSBpbnZhcmlhbnQgY2hhcmFjdGVycy4KICoKICogQGludGVybmFsIChJQ1UgMi44KQogKi8KVV9TVEFCTEUgVUJvb2wgVV9FWFBPUlQyCnVwcnZfaXNJbnZhcmlhbnRTdHJpbmcoY29uc3QgY2hhciAqcywgaW50MzJfdCBsZW5ndGgpOwoKLyoqCiAqIENoZWNrIGlmIGEgVW5pY29kZSBzdHJpbmcgb25seSBjb250YWlucyBpbnZhcmlhbnQgY2hhcmFjdGVycy4KICogU2VlIHV0eXBlcy5oIGZvciBkZXRhaWxzLgogKgogKiBAcGFyYW0gcyBJbnB1dCBzdHJpbmcgcG9pbnRlci4KICogQHBhcmFtIGxlbmd0aCBMZW5ndGggb2YgdGhlIHN0cmluZywgY2FuIGJlIC0xIGlmIE5VTC10ZXJtaW5hdGVkLgogKiBAcmV0dXJuIFRSVUUgaWYgcyBjb250YWlucyBvbmx5IGludmFyaWFudCBjaGFyYWN0ZXJzLgogKgogKiBAaW50ZXJuYWwgKElDVSAyLjgpCiAqLwpVX1NUQUJMRSBVQm9vbCBVX0VYUE9SVDIKdXBydl9pc0ludmFyaWFudFVTdHJpbmcoY29uc3QgVUNoYXIgKnMsIGludDMyX3QgbGVuZ3RoKTsKCi8qKgogKiBcZGVmIFVfVVBQRVJfT1JESU5BTAogKiBHZXQgdGhlIG9yZGluYWwgbnVtYmVyIG9mIGFuIHVwcGVyY2FzZSBpbnZhcmlhbnQgY2hhcmFjdGVyCiAqIEBpbnRlcm5hbAogKi8KI2lmIFVfQ0hBUlNFVF9GQU1JTFk9PVVfQVNDSUlfRkFNSUxZCiMgICBkZWZpbmUgVV9VUFBFUl9PUkRJTkFMKHgpICgoeCktJ0EnKQojZWxpZiBVX0NIQVJTRVRfRkFNSUxZPT1VX0VCQ0RJQ19GQU1JTFkKIyAgIGRlZmluZSBVX1VQUEVSX09SRElOQUwoeCkgKCgoeCkgPCAnSicpID8gKCh4KS0nQScpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA8ICdTJykgPyAoKHgpLSdKJys5KSA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCktJ1MnKzE4KSkpCiNlbHNlCiMgICBlcnJvciBVbmtub3duIGNoYXJzZXQgZmFtaWx5IQojZW5kaWYKCi8qKgogKiBNYXhpbXVtIHZhbHVlIG9mIGEgKHZvaWQqKSAtIHVzZSB0byBpbmRpY2F0ZSB0aGUgbGltaXQgb2YgYW4gJ2luZmluaXRlJyBidWZmZXIuCiAqIEluIGZhY3QsIGJ1ZmZlciBzaXplcyBtdXN0IG5vdCBleGNlZWQgMkdCIHNvIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgogKiB0aGUgYnVmZmVyIGxpbWl0IGFuZCB0aGUgYnVmZmVyIHN0YXJ0IGNhbiBiZSBleHByZXNzZWQgaW4gYW4gaW50MzJfdC4KICoKICogVGhlIGRlZmluaXRpb24gb2YgVV9NQVhfUFRSIG11c3QgZnVsZmlsbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqIC0gcmV0dXJuIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHBvaW50ZXIgZ3JlYXRlciB0aGFuIGJhc2UKICogLSByZXR1cm4gYSB2YWxpZCBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgKEFTLzQwMCwgNjQtYml0LCBldGMuKQogKiAtIGF2b2lkIHdyYXBwaW5nIGFyb3VuZCBhdCBoaWdoIGFkZHJlc3NlcwogKiAtIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG5vdCBmYXJ0aGVyIGZyb20gYmFzZSB0aGFuIDB4N2ZmZmZmZmYKICoKICogQHBhcmFtIGJhc2UgVGhlIGJlZ2lubmluZyBvZiBhIGJ1ZmZlciB0byBmaW5kIHRoZSBtYXhpbXVtIG9mZnNldCBmcm9tCiAqIEBpbnRlcm5hbAogKi8KI2lmbmRlZiBVX01BWF9QVFIKIyAgaWZkZWYgT1MzOTAKIyAgICBkZWZpbmUgVV9NQVhfUFRSKGJhc2UpICgodm9pZCAqKTB4N2ZmZmZmZmYpCiMgIGVsaWYgZGVmaW5lZChPUzQwMCkKLyoKICogV2l0aCB0aGUgcHJvdmlkZWQgbWFjcm8gd2Ugc2hvdWxkIG5ldmVyIGJlIG91dCBvZiByYW5nZSBvZiBhIGdpdmVuIHNlZ21lbnQKICogKGEgdHJhZGl0aW9uYWwvdHlwaWNhbCBzZWdtZW50IHRoYXQgaXMpLiAgT3VyIHNlZ21lbnRzIGhhdmUgNSBieXRlcyBmb3IgdGhlIGlkCiAqIGFuZCAzIGJ5dGVzIGZvciB0aGUgb2Zmc2V0LiAgVGhlIGtleSBpcyB0aGF0IHRoZSBjYXN0aW5nIHRha2VzIGNhcmUgb2Ygb25seQogKiByZXRyaWV2aW5nIHRoZSBvZmZzZXQgcG9ydGlvbiBtaW51cyB4MTAwMC4gIEhlbmNlLCB0aGUgc21hbGxlc3Qgb2Zmc2V0IHNlZW4gaW4KICogYSBwcm9ncmFtIGlzIHgwMDEwMDAgYW5kIHdoZW4gY2FzdGVkIHRvIGFuIGludCB3b3VsZCBiZSAwLiAgVGhhdCdzIHdoeSB3ZSBjYW4KICogb25seSBhZGQgMHhmZmVmZmYuICBPdGhlcndpc2UsIHdlIHdvdWxkIGV4Y2VlZCB0aGUgc2VnbWVudC4KICoKICogQ3VycmVudGx5LCAxNk1CIGlzIHRoZSBjdXJyZW50IGFkZHJlc3NpbmcgbGltaXRhdGlvbiBvbiBhcy80MDAuICBUaGlzIG1hY3JvCiAqIG1heSBldmVudHVhbGx5IGJlIGNoYW5nZWQgdG8gdXNlIDJHQiBhZGRyZXNzYWJpbGl0eSBmb3IgdGhlIG5ld2VyIHZlcnNpb24gb2YKICogYXMvNDAwIG1hY2hpbmVzLgogKi8KIyAgICBkZWZpbmUgVV9NQVhfUFRSKGJhc2UpICgodm9pZCAqKSgoKGNoYXIgKiliYXNlKS0oKGludDMyX3QpKGJhc2UpKSsoKGludDMyX3QpMHhmZmVmZmYpKSkKIyAgZWxzZQojICAgIGRlZmluZSBVX01BWF9QVFIoYmFzZSkgKCh2b2lkICopKCgoY2hhciAqKShiYXNlKSsweDdmZmZmZmZmdSkgPiAoY2hhciAqKShiYXNlKSA/ICgoY2hhciAqKShiYXNlKSsweDdmZmZmZmZmdSkgOiAoY2hhciAqKS0xKSkKIyAgZW5kaWYKI2VuZGlmCgojZW5kaWYK