LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAxLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqICBGSUxFIE5BTUUgOiBwdXRpbC5oCioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwNS8xNC85OCAgICBub3MgICAgICAgICBDcmVhdGlvbiAoY29udGVudCBtb3ZlZCBoZXJlIGZyb20gdXR5cGVzLmgpLgoqICAgMDYvMTcvOTkgICAgZXJtICAgICAgICAgQWRkZWQgSUVFRV83NTQKKiAgIDA3LzIyLzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIElFRUVyZW1haW5kZXIsIG1heCwgbWluLCB0cnVuYwoqICAgMDgvMTMvOTggICAgc3RlcGhlbiAgICAgQWRkZWQgaXNOZWdhdGl2ZUluZmluaXR5LCBpc1Bvc2l0aXZlSW5maW5pdHkKKiAgIDA4LzI0Lzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIGxvbmdCaXRzRnJvbURvdWJsZQoqICAgMDMvMDIvOTkgICAgc3RlcGhlbiAgICAgUmVtb3ZlZCBvcGVuRmlsZSgpLiAgQWRkZWQgQVM0MDAgc3VwcG9ydC4KKiAgIDA0LzE1Lzk5ICAgIHN0ZXBoZW4gICAgIENvbnZlcnRlZCB0byBDCiogICAxMS8xNS85OSAgICBoZWxlbmEgICAgICBJbnRlZ3JhdGVkIFMvMzkwIGNoYW5nZXMgZm9yIElFRUUgc3VwcG9ydC4KKiAgIDAxLzExLzAwICAgIGhlbGVuYSAgICAgIEFkZGVkIHVfZ2V0VmVyc2lvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFBVVElMX0gKI2RlZmluZSBQVVRJTF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKCi8qIERlZmluZSB0aGlzIHRvIDEgaWYgeW91ciBwbGF0Zm9ybSBzdXBwb3J0cyBJRUVFIDc1NCBmbG9hdGluZyBwb2ludCwKICAgdG8gMCBpZiBpdCBkb2VzIG5vdC4gKi8KI2lmbmRlZiBJRUVFXzc1NAojICAgZGVmaW5lIElFRUVfNzU0IDEKI2VuZGlmCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogUGxhdGZvcm0gdXRpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqCiAqIFBsYXRmb3JtIHV0aWxpdGllcyBpc29sYXRlcyB0aGUgcGxhdGZvcm0gZGVwZW5kZW5jaWVzIG9mIHRoZQogKiBsaWJhcmFyeS4gIEZvciBlYWNoIHBsYXRmb3JtIHdoaWNoIHRoaXMgY29kZSBpcyBwb3J0ZWQgdG8sIHRoZXNlCiAqIGZ1bmN0aW9ucyBtYXkgaGF2ZSB0byBiZSByZS1pbXBsZW1lbnRlZC4KICovCgovKiBGbG9hdGluZyBwb2ludCB1dGlsaXRpZXMgCiAqIEBkcmFmdAogKi8KVV9DQVBJIFVCb29sICAgVV9FWFBPUlQyIHVwcnZfaXNOYU4oZG91YmxlKTsKVV9DQVBJIFVCb29sICAgVV9FWFBPUlQyIHVwcnZfaXNJbmZpbml0ZShkb3VibGUpOwpVX0NBUEkgVUJvb2wgICBVX0VYUE9SVDIgdXBydl9pc1Bvc2l0aXZlSW5maW5pdHkoZG91YmxlKTsKVV9DQVBJIFVCb29sICAgVV9FWFBPUlQyIHVwcnZfaXNOZWdhdGl2ZUluZmluaXR5KGRvdWJsZSk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2dldE5hTih2b2lkKTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZ2V0SW5maW5pdHkodm9pZCk7CgpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl90cnVuYyhkb3VibGUgZCk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2Zsb29yKGRvdWJsZSB4KTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfY2VpbChkb3VibGUgeCk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2ZhYnMoZG91YmxlIHgpOwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9tb2RmKGRvdWJsZSB4LCBkb3VibGUqIHkpOwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9mbW9kKGRvdWJsZSB4LCBkb3VibGUgeSk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X3Bvdyhkb3VibGUgeCwgZG91YmxlIHkpOwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9wb3cxMChpbnQzMl90IHgpOwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9mbWF4KGRvdWJsZSB4LCBkb3VibGUgeSk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2ZtaW4oZG91YmxlIHgsIGRvdWJsZSB5KTsKVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIHVwcnZfbWF4KGludDMyX3QgeCwgaW50MzJfdCB5KTsKVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIHVwcnZfbWluKGludDMyX3QgeCwgaW50MzJfdCB5KTsKCiNpZiBVX0lTX0JJR19FTkRJQU4KIyAgIGRlZmluZSB1cHJ2X2lzTmVnYXRpdmUobnVtYmVyKSAoKigoc2lnbmVkIGNoYXIgKikmKG51bWJlcikpPDApCiNlbHNlCiMgICBkZWZpbmUgdXBydl9pc05lZ2F0aXZlKG51bWJlcikgKCooKHNpZ25lZCBjaGFyICopJihudW1iZXIpK3NpemVvZihudW1iZXIpLTEpPDApCiNlbmRpZgoKLyoqCiAqIFJldHVybiB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBudW1iZXIgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYW4gaW50ZWdlcgogKiB0eXBlIG9mIGFyYml0cmFyeSBiaXQgbGVuZ3RoLgogKi8KVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfbWF4TWFudGlzc2Eodm9pZCk7CgovKioKICogUmV0dXJuIHRoZSBmbG9vciBvZiB0aGUgbG9nIGJhc2UgMTAgb2YgYSBnaXZlbiBkb3VibGUuCiAqIFRoaXMgbWV0aG9kIGNvbXBlbnNhdGVzIGZvciBpbmFjY3VyYWNpZXMgd2hpY2ggYXJpc2UgbmF0dXJhbGx5IHdoZW4KICogY29tcHV0aW5nIGxvZ3MsIGFuZCBhbHdheXMgZ2l2ZXMgdGhlIGNvcnJlY3QgdmFsdWUuICBUaGUgcGFyYW1ldGVyCiAqIG11c3QgYmUgcG9zaXRpdmUgYW5kIGZpbml0ZS4KICogKFRoYW5rcyB0byBBbGFuIExpdSBmb3Igc3VwcGx5aW5nIHRoaXMgZnVuY3Rpb24uKQogKgogKiBAcGFyYW0gZCB0aGUgZG91YmxlIHZhbHVlIHRvIGFwcGx5IHRoZSBjb21tb24gbG9nIGZ1bmN0aW9uIGZvci4KICogQHJldHVybiB0aGUgbG9nIG9mIHZhbHVlIGQuCiAqIEBkcmFmdAogKi8KVV9DQVBJIGludDE2X3QgIFVfRVhQT1JUMiB1cHJ2X2xvZzEwKGRvdWJsZSBkKTsKClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2xvZyhkb3VibGUgZCk7CgovKiogRG9lcyBjb21tb24gbm90aW9uIG9mIHJvdW5kaW5nIGUuZy4gdXBydl9mbG9vcih4ICsgMC41KTsgKi8KVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfcm91bmQoZG91YmxlIHgpOwoKLyoqCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgaW4gYSBkb3VibGUgbnVtYmVyIHguCiAqCiAqIEBwYXJhbSB4IHRoZSBkb3VibGUgbnVtYmVyCiAqIEBkcmFmdAogKi8KVV9DQVBJIGludDMyX3QgIFVfRVhQT1JUMiB1cHJ2X2RpZ2l0c0FmdGVyRGVjaW1hbChkb3VibGUgeCk7CgovKioKICogVGltZSB6b25lIHV0aWxpdGllcwogKgogKiBXcmFwcGVycyBmb3IgQyBydW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zIHJlbGF0aW5nIHRvIHRpbWV6b25lcy4KICogVGhlIHRfdHpzZXQoKSBmdW5jdGlvbiAoc2ltaWxhciB0byB0enNldCkgdXNlcyB0aGUgY3VycmVudCBzZXR0aW5nIAogKiBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgVFogdG8gYXNzaWduIHZhbHVlcyB0byB0aHJlZSBnbG9iYWwgCiAqIHZhcmlhYmxlczogZGF5bGlnaHQsIHRpbWV6b25lLCBhbmQgdHpuYW1lLiBUaGVzZSB2YXJpYWJsZXMgaGF2ZSB0aGUgCiAqIGZvbGxvd2luZyBtZWFuaW5ncywgYW5kIGFyZSBkZWNsYXJlZCBpbiAmbHQ7dGltZS5oPi4KICoKICogICBkYXlsaWdodCAgIE5vbnplcm8gaWYgZGF5bGlnaHQtc2F2aW5nLXRpbWUgem9uZSAoRFNUKSBpcyBzcGVjaWZpZWQKICogICAgICAgICAgICAgIGluIFRaOyBvdGhlcndpc2UsIDAuIERlZmF1bHQgdmFsdWUgaXMgMS4KICogICB0aW1lem9uZSAgIERpZmZlcmVuY2UgaW4gc2Vjb25kcyBiZXR3ZWVuIGNvb3JkaW5hdGVkIHVuaXZlcnNhbAogKiAgICAgICAgICAgICAgdGltZSBhbmQgbG9jYWwgdGltZS4gRS5nLiwgLTI4LDgwMCBmb3IgUFNUIChHTVQtOGhycykKICogICB0em5hbWUoMCkgIFRocmVlLWxldHRlciB0aW1lLXpvbmUgbmFtZSBkZXJpdmVkIGZyb20gVFogZW52aXJvbm1lbnQKICogICAgICAgICAgICAgIHZhcmlhYmxlLiBFLmcuLCAiUFNUIi4KICogICB0em5hbWUoMSkgIFRocmVlLWxldHRlciBEU1Qgem9uZSBuYW1lIGRlcml2ZWQgZnJvbSBUWiBlbnZpcm9ubWVudAogKiAgICAgICAgICAgICAgdmFyaWFibGUuICBFLmcuLCAiUERUIi4gSWYgRFNUIHpvbmUgaXMgb21pdHRlZCBmcm9tIFRaLAogKiAgICAgICAgICAgICAgdHpuYW1lKDEpIGlzIGFuIGVtcHR5IHN0cmluZy4KICoKICogTm90ZXM6IEZvciBleGFtcGxlLCB0byBzZXQgdGhlIFRaIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGNvcnJlc3BvbmQKICogdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGluIEdlcm1hbnksIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUKICogZm9sbG93aW5nIHN0YXRlbWVudHM6CiAqCiAqICAgc2V0IFRaPUdTVDFHRFQKICogICBzZXQgVFo9R1NUKzFHRFQKICoKICogSWYgdGhlIFRaIHZhbHVlIGlzIG5vdCBzZXQsIHRfdHpzZXQoKSBhdHRlbXB0cyB0byB1c2UgdGhlIHRpbWUgem9uZQogKiBpbmZvcm1hdGlvbiBzcGVjaWZpZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFVuZGVyIFdpbmRvd3MgTlQKICogYW5kIFdpbmRvd3MgOTUsIHRoaXMgaW5mb3JtYXRpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBDb250cm9sIFBhbmVsknMKICogRGF0ZS9UaW1lIGFwcGxpY2F0aW9uLgogKiBAZHJhZnQKICovClVfQ0FQSSB2b2lkICAgICBVX0VYUE9SVDIgdXBydl90enNldCh2b2lkKTsKVV9DQVBJIGludDMyX3QgIFVfRVhQT1JUMiB1cHJ2X3RpbWV6b25lKHZvaWQpOwpVX0NBUEkgY2hhciogICAgVV9FWFBPUlQyIHVwcnZfdHpuYW1lKGludCBuKTsKCi8qKgogKiBHZXQgVVRDIChHTVQpIHRpbWUgbWVhc3VyZWQgaW4gc2Vjb25kcyBzaW5jZSAwOjAwIG9uIDEvMS83MC4gCiAqIEBkcmFmdAogKi8KVV9DQVBJIGludDMyX3QgIFVfRVhQT1JUMiB1cHJ2X2dldFVUQ3RpbWUodm9pZCk7CgovKioKICogUmV0dXJuIHRoZSBJQ1UgZGF0YSBkaXJlY3RvcnkuIAogKiBUaGUgZGF0YSBkaXJlY3RvcnkgaXMgd2hlcmUgY29tbW9uIGZvcm1hdCBJQ1UgZGF0YSBmaWxlcyAoLmRhdCBmaWxlcykKICogICBhcmUgbG9hZGVkIGZyb20uICBOb3RlIHRoYXQgbm9ybWFsIHVzZSBvZiB0aGUgYnVpbHQtaW4gSUNVCiAqICAgZmFjaWxpdGllcyBkb2VzIG5vdCByZXF1aXJlIGxvYWRpbmcgb2YgYW4gZXh0ZXJuYWwgZGF0YSBmaWxlOwogKiAgIHVubGVzcyB5b3UgYXJlIGFkZGluZyBjdXN0b20gZGF0YSB0byBJQ1UsIHRoZSBkYXRhIGRpcmVjdG9yeQogKiAgIGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0LgogKgogKiBUaGUgZGF0YSBkaXJlY3RvcnkgaXMgZGV0ZXJtaW5lZCBhcyBmb2xsb3dzOgogKiAgICBJZiB1X3NldERhdGFEaXJlY3RvcnkoKSBoYXMgYmVlbiBjYWxsZWQsIHRoYXQgaXMgaXQsIG90aGVyd2lzZQogKiAgICBpZiB0aGUgSUNVX0RBVEEgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCB1c2UgdGhhdCwgb3RoZXJ3aXNlCiAqICAgIE9uIFdpbmRvd3MsIGlmIHRoZSBTT0ZUV0FSRVxJQ1VcVW5pY29kZVxEYXRhIHJlZ2lzdHJ5IGVudHJ5IGV4aXN0cywgdXNlIHRoYXQKICogICAgICAgICAgICh1c2Ugb2YgdGhlIHJlZ2lzdHJ5IGluIHRoaXMgd2F5IGlzIG5vdCByZWNvbW1lbmRlZC4pICBvdGhlcndpc2UKICogICAgSWYgYSBkYXRhIGRpcmVjdG9yeSB3YXMgc3BlY2lmZWQgYXQgSUNVIGJ1aWxkIHRpbWUsIHVzZSB0aGF0CiAqICAgIG90aGVyd2lzZSBubyBkYXRhIGRpcmVjdG9yeSBpcyBhdmFpbGFibGUuCiAqCiAqQHJldHVybiB0aGUgZGF0YSBkaXJlY3RvcnksIG9yIGFuIGVtcHR5IHN0cmluZyAoIiIpIGlmIG5vIGRhdGEgZGlyZWN0b3J5IGhhcwogKiAgICAgICAgIGJlZW4gc3BlY2lmaWVkLgogKiAgIAogKiBAZHJhZnQKICovClVfQ0FQSSBjb25zdCBjaGFyKiBVX0VYUE9SVDIgdV9nZXREYXRhRGlyZWN0b3J5KHZvaWQpOwoKLyoqIAogKiBTZXQgdGhlIElDVSBkYXRhIGRpcmVjdG9yeS4gCiAqIFRoZSBkYXRhIGRpcmVjdG9yeSBpcyB3aGVyZSBjb21tb24gZm9ybWF0IElDVSBkYXRhIGZpbGVzICguZGF0IGZpbGVzKQogKiAgIGFyZSBsb2FkZWQgZnJvbS4gIE5vdGUgdGhhdCBub3JtYWwgdXNlIG9mIHRoZSBidWlsdC1pbiBJQ1UKICogICBmYWNpbGl0aWVzIGRvZXMgbm90IHJlcXVpcmUgbG9hZGluZyBvZiBhbiBleHRlcm5hbCBkYXRhIGZpbGU7CiAqICAgdW5sZXNzIHlvdSBhcmUgYWRkaW5nIGN1c3RvbSBkYXRhIHRvIElDVSwgdGhlIGRhdGEgZGlyZWN0b3J5CiAqICAgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgaW4gYSBwcm9jZXNzLCBiZWZvcmUgdGhlCiAqIGZpcnN0IElDVSBvcGVyYXRpb24gdGhhdCB3aWxsIHJlcXVpcmUgdGhlIGxvYWRpbmcgb2YgYW4gSUNVIGRhdGEgZmlsZS4KICoKCiAqIEBkcmFmdAogKi8KVV9DQVBJIHZvaWQgVV9FWFBPUlQyIHVfc2V0RGF0YURpcmVjdG9yeShjb25zdCBjaGFyICpkaXJlY3RvcnkpOwoKLyoqCiAqIFJldHVybiB0aGUgZGVmYXVsdCBjb2RlcGFnZSBmb3IgdGhpcyBwbGF0Zm9ybSBhbmQgbG9jYWxlIAogKiBAZHJhZnQKICovClVfQ0FQSSBjb25zdCBjaGFyKiAgVV9FWFBPUlQyIHVwcnZfZ2V0RGVmYXVsdENvZGVwYWdlKHZvaWQpOwoKLyoqCiAqIFJldHVybiB0aGUgZGVmYXVsdCBsb2NhbGUgSUQgc3RyaW5nIGJ5IHF1ZXJ5aW5nIHRocyBzeXN0ZW0sIG9yCiAqICAgICB6ZXJvIGlmIG9uZSBjYW5ub3QgYmUgZm91bmQuIAogKiBAZHJhZnQKICovClVfQ0FQSSBjb25zdCBjaGFyKiAgVV9FWFBPUlQyIHVwcnZfZ2V0RGVmYXVsdExvY2FsZUlEKHZvaWQpOwoKLyoKICogRmluZHMgdGhlIGxlYXN0IGRvdWJsZSBncmVhdGVyIHRoYW4gZCAoaWYgcG9zaXRpdmUgPT0gdHJ1ZSksCiAqIG9yIHRoZSBncmVhdGVzdCBkb3VibGUgbGVzcyB0aGFuIGQgKGlmIHBvc2l0aXZlID09IGZhbHNlKS4KICoKICogVGhpcyBpcyBhIHNwZWNpYWwgcHVycG9zZSBmdW5jdGlvbiBkZWZpbmVkIGJ5IHRoZSBDaG9pY2VGb3JtYXQgQVBJCiAqIGRvY3VtZW50YXRpb24uCiAqIEl0IGlzIG5vdCBhIGdlbmVyYWwgcHVycG9zZSBmdW5jdGlvbiBhbmQgbm90IGRlZmluZWQgZm9yIE5hTiBvciBJbmZpbml0eQogKiBAZGVwcmVjYXRlZCBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciAyMDAyLUp1bi0zMC4gVXNlIHRoZSBDaG9pY2VGb3JtYXQgY2xvc3VyZXMgQVBJIGluc3RlYWQuCiAqLwpVX0NBUEkgZG91YmxlICAgICAgIFVfRVhQT1JUMiB1cHJ2X25leHREb3VibGUoZG91YmxlIGQsIFVCb29sIHBvc2l0aXZlKTsKCi8qKgogKiBGaWxlc3lzdGVtIGZpbGUgYW5kIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlcnMuCiAqIEV4YW1wbGU6ICcvJyBhbmQgJzonIG9uIFVuaXgsICdcXCcgYW5kICc7JyBvbiBXaW5kb3dzLgogKiBAZHJhZnQKICovCiNpZmRlZiBYUF9NQUMKIyAgIGRlZmluZSBVX0ZJTEVfU0VQX0NIQVIgJzonCiMgICBkZWZpbmUgVV9QQVRIX1NFUF9DSEFSICc7JwojICAgZGVmaW5lIFVfRklMRV9TRVBfU1RSSU5HICI6IgojICAgZGVmaW5lIFVfUEFUSF9TRVBfU1RSSU5HICI7IgojZWxpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKE9TMikKIyAgIGRlZmluZSBVX0ZJTEVfU0VQX0NIQVIgJ1xcJwojICAgZGVmaW5lIFVfUEFUSF9TRVBfQ0hBUiAnOycKIyAgIGRlZmluZSBVX0ZJTEVfU0VQX1NUUklORyAiXFwiCiMgICBkZWZpbmUgVV9QQVRIX1NFUF9TVFJJTkcgIjsiCiNlbHNlCiMgICBkZWZpbmUgVV9GSUxFX1NFUF9DSEFSICcvJwojICAgZGVmaW5lIFVfUEFUSF9TRVBfQ0hBUiAnOicKIyAgIGRlZmluZSBVX0ZJTEVfU0VQX1NUUklORyAiLyIKIyAgIGRlZmluZSBVX1BBVEhfU0VQX1NUUklORyAiOiIKI2VuZGlmCgovKioKICogQ29udmVydCBjaGFyIGNoYXJhY3RlcnMgdG8gVUNoYXIgY2hhcmFjdGVycy4KICogVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciAiaW52YXJpYW50IGNoYXJhY3RlcnMiCiAqIHRoYXQgYXJlIGVuY29kZWQgaW4gdGhlIHBsYXRmb3JtIGRlZmF1bHQgZW5jb2RpbmcuCiAqIFRoZXkgYXJlIGEgc21hbGwsIGNvbnN0YW50IHN1YnNldCBvZiB0aGUgZW5jb2RpbmcgYW5kIGluY2x1ZGUKICoganVzdCB0aGUgbGF0aW4gbGV0dGVycywgZGlnaXRzLCBhbmQgc29tZSBwdW5jdHVhdGlvbi4KICogRm9yIGRldGFpbHMsIHNlZSB1dHlwZXMuaCAuCiAqCiAqIEBwYXJhbSBjcyBJbnB1dCBzdHJpbmcsIHBvaW50cyB0byA8Y29kZT5sZW5ndGg8L2NvZGU+CiAqICAgICAgICAgICBjaGFyYWN0ZXIgYnl0ZXMgZnJvbSBhIHN1YnNldCBvZiB0aGUgcGxhdGZvcm0gZW5jb2RpbmcuCiAqIEBwYXJhbSB1cyBPdXRwdXQgc3RyaW5nLCBwb2ludHMgdG8gbWVtb3J5IGZvciA8Y29kZT5sZW5ndGg8L2NvZGU+CiAqICAgICAgICAgICBVbmljb2RlIGNoYXJhY3RlcnMuCiAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvbnZlcnQ7IHRoaXMgbWF5CiAqICAgICAgICAgICAgICAgaW5jbHVkZSB0aGUgdGVybWluYXRpbmcgPGNvZGU+TlVMPC9jb2RlPi4KICogQHN0YWJsZQogKi8KVV9DQVBJIHZvaWQgVV9FWFBPUlQyCnVfY2hhcnNUb1VDaGFycyhjb25zdCBjaGFyICpjcywgVUNoYXIgKnVzLCBVVGV4dE9mZnNldCBsZW5ndGgpOwoKLyoqCiAqIENvbnZlcnQgVUNoYXIgY2hhcmFjdGVycyB0byBjaGFyIGNoYXJhY3RlcnMuCiAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBpcyB1c2VmdWwgb25seSBmb3IgImludmFyaWFudCBjaGFyYWN0ZXJzIgogKiB0aGF0IGNhbiBiZSBlbmNvZGVkIGluIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGVuY29kaW5nLgogKiBUaGV5IGFyZSBhIHNtYWxsLCBjb25zdGFudCBzdWJzZXQgb2YgdGhlIGVuY29kaW5nIGFuZCBpbmNsdWRlCiAqIGp1c3QgdGhlIGxhdGluIGxldHRlcnMsIGRpZ2l0cywgYW5kIHNvbWUgcHVuY3R1YXRpb24uCiAqIEZvciBkZXRhaWxzLCBzZWUgdXR5cGVzLmggLgogKgogKiBAcGFyYW0gdXMgSW5wdXQgc3RyaW5nLCBwb2ludHMgdG8gPGNvZGU+bGVuZ3RoPC9jb2RlPgogKiAgICAgICAgICAgVW5pY29kZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGVuY29kZWQgd2l0aCB0aGUKICogICAgICAgICAgIGNvZGVwYWdlLWludmFyaWFudCBzdWJzZXQgb2YgdGhlIHBsYXRmb3JtIGVuY29kaW5nLgogKiBAcGFyYW0gY3MgT3V0cHV0IHN0cmluZywgcG9pbnRzIHRvIG1lbW9yeSBmb3IgPGNvZGU+bGVuZ3RoPC9jb2RlPgogKiAgICAgICAgICAgY2hhcmFjdGVyIGJ5dGVzLgogKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb252ZXJ0OyB0aGlzIG1heQogKiAgICAgICAgICAgICAgIGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIDxjb2RlPk5VTDwvY29kZT4uCiAqIEBzdGFibGUKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMgp1X1VDaGFyc1RvQ2hhcnMoY29uc3QgVUNoYXIgKnVzLCBjaGFyICpjcywgVVRleHRPZmZzZXQgbGVuZ3RoKTsKCi8qIERlZmluZSBVX1VQUEVSX09SRElOQUwgKi8KI2lmIFVfQ0hBUlNFVF9GQU1JTFk9PVVfQVNDSUlfRkFNSUxZCiMgICBkZWZpbmUgVV9VUFBFUl9PUkRJTkFMKHgpICgoeCktJ0EnKQojZWxpZiBVX0NIQVJTRVRfRkFNSUxZPT1VX0VCQ0RJQ19GQU1JTFkKIyAgIGRlZmluZSBVX1VQUEVSX09SRElOQUwoeCkgKCgoeCkgPCAnSicpID8gKCh4KS0nQScpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA8ICdTJykgPyAoKHgpLSdKJys5KSA6IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeCktJ1MnKzE4KSkpCiNlbHNlCiMgICBlcnJvciBVbmtub3duIGNoYXJzZXQgZmFtaWx5IQojZW5kaWYKCi8qKgogKiBNYXhpbXVtIHZhbHVlIG9mIGEgKHZvaWQqKSAtIHVzZSB0byBpbmRpY2F0ZSB0aGUgbGltaXQgb2YgYW4gJ2luZmluaXRlJyBidWZmZXIuCiAqIEluIGZhY3QsIGJ1ZmZlciBzaXplcyBtdXN0IG5vdCBleGNlZWQgMkdCIHNvIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgogKiB0aGUgYnVmZmVyIGxpbWl0IGFuZCB0aGUgYnVmZmVyIHN0YXJ0IGNhbiBiZSBleHByZXNzZWQgaW4gYW4gaW50MzJfdC4KICoKICogVGhlIGRlZmluaXRpb24gb2YgVV9NQVhfUFRSIG11c3QgZnVsZmlsbCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqIC0gcmV0dXJuIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHBvaW50ZXIgZ3JlYXRlciB0aGFuIGJhc2UKICogLSByZXR1cm4gYSB2YWxpZCBwb2ludGVyIGFjY29yZGluZyB0byB0aGUgbWFjaGluZSBhcmNoaXRlY3R1cmUgKEFTLzQwMCwgNjQtYml0LCBldGMuKQogKiAtIGF2b2lkIHdyYXBwaW5nIGFyb3VuZCBhdCBoaWdoIGFkZHJlc3NlcwogKiAtIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG5vdCBmYXJ0aGVyIGZyb20gYmFzZSB0aGFuIDB4N2ZmZmZmZmYKICoKICogQHBhcmFtIGJhc2UgVGhlIGJlZ2lubmluZyBvZiBhIGJ1ZmZlciB0byBmaW5kIHRoZSBtYXhpbXVtIG9mZnNldCBmcm9tCiAqIEBpbnRlcm5hbAogKi8KI2lmbmRlZiBVX01BWF9QVFIKIyAgaWZkZWYgT1MzOTAKIyAgICBkZWZpbmUgVV9NQVhfUFRSKGJhc2UpICgodm9pZCAqKTB4N2ZmZmZmZmYpCiMgIGVsaWYgZGVmaW5lZChPUzQwMCkKLyoKICogV2l0aCB0aGUgcHJvdmlkZWQgbWFjcm8gd2Ugc2hvdWxkIG5ldmVyIGJlIG91dCBvZiByYW5nZSBvZiBhIGdpdmVuIHNlZ21lbnQKICogKGEgdHJhZGl0aW9uYWwvdHlwaWNhbCBzZWdtZW50IHRoYXQgaXMpLiAgT3VyIHNlZ21lbnRzIGhhdmUgNSBieXRlcyBmb3IgdGhlIGlkCiAqIGFuZCAzIGJ5dGVzIGZvciB0aGUgb2Zmc2V0LiAgVGhlIGtleSBpcyB0aGF0IHRoZSBjYXN0aW5nIHRha2VzIGNhcmUgb2Ygb25seQogKiByZXRyaWV2aW5nIHRoZSBvZmZzZXQgcG9ydGlvbiBtaW51cyB4MTAwMC4gIEhlbmNlLCB0aGUgc21hbGxlc3Qgb2Zmc2V0IHNlZW4gaW4KICogYSBwcm9ncmFtIGlzIHgwMDEwMDAgYW5kIHdoZW4gY2FzdGVkIHRvIGFuIGludCB3b3VsZCBiZSAwLiAgVGhhdCdzIHdoeSB3ZSBjYW4KICogb25seSBhZGQgMHhmZmVmZmYuICBPdGhlcndpc2UsIHdlIHdvdWxkIGV4Y2VlZCB0aGUgc2VnbWVudC4KICoKICogQ3VycmVudGx5LCAxNk1CIGlzIHRoZSBjdXJyZW50IGFkZHJlc3NpbmcgbGltaXRhdGlvbiBvbiBhcy80MDAuICBUaGlzIG1hY3JvCiAqIG1heSBldmVudHVhbGx5IGJlIGNoYW5nZWQgdG8gdXNlIDJHQiBhZGRyZXNzYWJpbGl0eSBmb3IgdGhlIG5ld2VyIHZlcnNpb24gb2YKICogYXMvNDAwIG1hY2hpbmVzLgogKi8KIyAgICBkZWZpbmUgVV9NQVhfUFRSKGJhc2UpICgodm9pZCAqKSgoKGNoYXIgKiliYXNlKS0oKGludDMyX3QpKGJhc2UpKSsoKGludDMyX3QpMHhmZmVmZmYpKSkKIyAgZWxzZQojICAgIGRlZmluZSBVX01BWF9QVFIoYmFzZSkgKCh2b2lkICopKCgoY2hhciAqKShiYXNlKSsweDdmZmZmZmZmKSA+IChjaGFyICopKGJhc2UpID8gKChjaGFyICopKGJhc2UpKzB4N2ZmZmZmZmYpIDogKGNoYXIgKiktMSkpCiMgIGVuZGlmCiNlbmRpZgoKI2VuZGlmCg==