ZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQWJvdXQuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmOWM2MC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0IHRoaXMgbWFudWFsPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08aDE+QWJvdXQgVGhpcyBNYW51YWw8L2gxPjxwPgotCi1UaGUgSFRNTCB2ZXJzaW9uIG9mIHRoZSBTV0lHIFVzZXJzIE1hbnVhbCBpcyBhIGRpcmVjdCB0cmFuc2xhdGlvbgotb2YgdGhlIHByaW50ZWQgdmVyc2lvbiB3aGljaCBpcyBwcm9kdWNlZCB1c2luZyBGcmFtZW1ha2VyIDUuICBUaGUKLWNvbnZlcnNpb24gcHJvY2VzcyB3YXMgcm91Z2hseSBhcyBmb2xsb3dzIDoKLQotPHVsPgotPGxpPiBSYXcgSFRNTCB3YXMgcHJvZHVjZWQgdXNpbmcgRnJhbWVtYWtlciA1IGFuZCBRdWFkcmFsYXkgV2ViV29ya3MgTGl0ZS4KLTxsaT4gVGFibGVzIGFuZCBmaWd1cmVzIHdlcmUgY29udmVydGVkIGludG8gR0lGIGltYWdlcy4KLTxsaT4gQWxsIG9mIHRoaXMgb3V0cHV0IHdhcyBmZWQgaW50byBhIG1hZ2ljIFB5dGhvbiBzY3JpcHQgdGhhdCBjbGVhbmVkCi11cCB0aGUgSFRNTCBzb3VyY2UgYW5kIG1lcmdlZCB0aGUgR0lGIGZpZ3VyZXMgaW50byB0aGUgdGV4dC4KLTxsaT4gQSB0YWJsZSBvZiBjb250ZW50cyBhbmQgYWxwaGFiZXRpemVkIHRvcGljIGluZGV4IHdlcmUgcHJvZHVjZWQgZnJvbQotSFRNTCBoZWFkaW5nIHRhZ3MgYnkgdGhlIHNhbWUgc2NyaXB0LgotPC91bD4KLQotV2hpbGUgdGhlIGNvbnZlcnNpb24gcHJvY2VzcyBpcyBtb3N0bHkgY29tcGxldGUsIHRoZXJlIGFyZSBhIGZldyB0aGluZ3MKLXRvIGtlZXAgaW4gbWluZCA6Ci0KLTx1bD4KLTxsaT4gU29tZSBzZWN0aW9ucyBvZiBwcmVmb3JtYXR0ZWQgdGV4dCBtYXkgaGF2ZSB3ZWlyZCBmb3JtYXR0aW5nCi1wcm9ibGVtcy4KLTxsaT4gRnJhbWVtYWtlciB0YWJsZXMgd2VyZSBjb252ZXJ0ZWQgaW50byBHSUYgaW1hZ2VzIGluc3RlYWQKLW9mIEhUTUwgdGFibGVzLS10aGlzIGlzIGEgbGl0dGxlIHdlaXJkLCBidXQgdGhlIGVhc2llc3QgCi1hcHByb2FjaCBmb3Igbm93LgotPGxpPiBUaGVyZSBtYXkgYmUgYSBmZXcgbWlub3IgZm9ybWF0dGluZyBwcm9ibGVtcyB0aHJvdWdob3V0IAotZHVlIHRvIG1pbm9yICJnbGl0Y2hlcyIgdGhhdCBzbGlwcGVkIHRocm91Z2ggdGhlIGNvbnZlcnNpb24gcHJvY2VzcwotKGFsdGhvdWdoIEkndmUgdHJpZWQgdG8gY29ycmVjdCBhcyBtYW55IGFzIHRoZXNlIGFzIHBvc3NpYmxlKS4KLTxsaT4gVGhlIHByaW50ZWQgdmVyc2lvbiBvZiB0aGUgU1dJRyBtYW51YWwgaXMgbW9yZSB0aGFuIAotMzAwIHBhZ2VzIGxvbmctLXJlc3VsdGluZyBpbiBhYm91dCA2NzAgS2J5dGVzIG9mIEhUTUwuIFRoZSBIVE1MIHZlcnNpb24KLWlzIGJyb2tlbiB1cCBpbnRvIGNoYXB0ZXJzLiAgRWFjaCBjaGFwdGVyIGlzIGZhaXJseSB3ZWxsLWNvbnRhaW5lZCwgYnV0Ci1zb21lIG1heSBjb250YWluIGFzIG1hbnkgYXMgNTAgcGFnZXMgb2YgcHJpbnRlZCB0ZXh0LgotPC91bD4KLQotUGxlYXNlIHJlcG9ydCBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgZG9jdW1lbnRhdGlvbiB0byBiZWF6bGV5QGNzLnV0YWguZWR1LgotCi08aHI+Ci08YWRkcmVzcz4KLUxhc3QgTW9kaWZpZWQgOiBBdWd1c3QgMywgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0FkdmFuY2VkLmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML0FkdmFuY2VkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTU5OTAuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9BZHZhbmNlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWR2YW5jZWQgVG9waWNzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT4xMSBBZHZhbmNlZCBUb3BpY3M8L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5DcmVhdGluZyBtdWx0aS1tb2R1bGUgcGFja2FnZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMiI+RHluYW1pYyBMb2FkaW5nIG9mIEMrKyBtb2R1bGVzPC9hPgotPGxpPiA8YSBocmVmPSIjbjMiPkluc2lkZSB0aGUgU1dJRyB0eXBlLWNoZWNrZXI8L2E+Ci08L3VsPgotCi08YSBuYW1lPSJuMSI+PC9hPjxoMj4gQ3JlYXRpbmcgbXVsdGktbW9kdWxlIHBhY2thZ2VzPC9oMj4KLVNXSUcgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHBhY2thZ2VzIGNvbnNpc3Rpbmcgb2YgbWFueSBkaWZmZXJlbnQgbW9kdWxlcy4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgdGVjaG5pY2FsIGFzcGVjdHMgb2YgZG9pbmcgdGhpcyBhbmQgdGVjaG5pcXVlcyBmb3IgbWFuYWdpbmcgdGhlIHByb2JsZW0uPHA+Ci08YSBuYW1lPSJuNCI+PC9hPjxoMz4gUnVudGltZSBzdXBwb3J0IChhbmQgcG90ZW50aWFsIHByb2JsZW1zKTwvaDM+Ci1BbGwgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyByZWx5IHVwb24gYSBzbWFsbCBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGR1cmluZyBydW4tdGltZS4gVGhlc2UgZnVuY3Rpb25zIGFyZSBwcmltYXJpbHkgdXNlZCBmb3IgcG9pbnRlciB0eXBlLWNoZWNraW5nLCBleGNlcHRpb24gaGFuZGxpbmcsIGFuZCBzbyBvbi4gV2hlbiB5b3UgcnVuIFNXSUcsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIHdyYXBwZXIgZmlsZSAoYW5kIGRlY2xhcmVkIGFzIHN0YXRpYykuIElmIHlvdSBjcmVhdGUgYSBzeXN0ZW0gY29uc2lzdGluZyBvZiBtYW55IG1vZHVsZXMsIGVhY2ggb25lIHdpbGwgaGF2ZSBhbiBpZGVudGljYWwgY29weSBvZiB0aGVzZSBydW50aW1lIGxpYnJhcmllcyA6PHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDExLjEucG5nIj48L2NlbnRlcj48cD4KLTxwPgotVGhpcyBkdXBsaWNhdGlvbiBvZiBydW50aW1lIGxpYnJhcmllcyBpcyB1c3VhbGx5IGhhcm1sZXNzIHNpbmNlIHRoZXJlIGFyZSBubyBuYW1lc3BhY2UgY29uZmxpY3RzIGFuZCBtZW1vcnkgb3ZlcmhlYWQgaXMgbWluaW1hbC4gSG93ZXZlciwgdGhlcmUgaXMgc2VyaW91cyBwcm9ibGVtIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdCBtb2R1bGVzIGRvIG5vdCBzaGFyZSB0eXBlLWluZm9ybWF0aW9uLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgYSBwcm9ibGVtIHdoZW4gd29ya2luZyB3aXRoIEMrKyAoYXMgZGVzY3JpYmVkIG5leHQpLjxwPgotPGEgbmFtZT0ibjUiPjwvYT48aDM+IFdoeSBkb2Vzbid0IEMrKyBpbmhlcml0YW5jZSB3b3JrIGJldHdlZW4gbW9kdWxlcz88L2gzPgotQ29uc2lkZXIgZm9yIGEgbW9tZW50IHRoZSBmb2xsb3dpbmcgdHdvIGludGVyZmFjZSBmaWxlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gRmlsZSA6IGEuaQotJW1vZHVsZSBhCi0KLS8vIEhlcmUgaXMgYSBiYXNlIGNsYXNzCi1jbGFzcyBhIHsKLXB1YmxpYzoKLQlhKCk7Ci0JfmEoKTsKLQl2b2lkIGZvbyhkb3VibGUpOwotfTsKLQotCi0vLyBGaWxlIDogYi5pCi0lbW9kdWxlIGIKLQotLy8gSGVyZSBpcyBhIGRlcml2ZWQgY2xhc3MKLSVleHRlcm4gYS5pICAgICAgICAgICAgICAgICAvLyBHZXRzIGRlZmluaXRpb24gb2YgYmFzZSBjbGFzcwotCi1jbGFzcyBiIDogcHVibGljIGEgewotcHVibGljOgotCWJhcigpOwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBjb21waWxlZCBpbnRvIHR3byBzZXBhcmF0ZSBtb2R1bGVzLCB0aGUgY29kZSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5LiBJbiBmYWN0LCB5b3UgZ2V0IGEgdHlwZSBlcnJvciBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPltiZWF6bGV5QGd1aW5uZXNzIHNoYWRvd10kIHB5dGhvbgotUHl0aG9uIDEuNCAoSmFuIDE2IDE5OTcpICBbR0NDIDIuNy4yXQotQ29weXJpZ2h0IDE5OTEtMTk5NSBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0sIEFtc3RlcmRhbQotJmd0OyZndDsmZ3Q7IGZyb20gYSBpbXBvcnQgKgotJmd0OyZndDsmZ3Q7IGZyb20gYiBpbXBvcnQgKgotJmd0OyZndDsmZ3Q7ICMgQ3JlYXRlIGEgbmV3ICJiIgotJmd0OyZndDsmZ3Q7IGIgPSBuZXdfYigpCi0mZ3Q7Jmd0OyZndDsgIyBDYWxsIGEgZnVuY3Rpb24gaW4gdGhlIGJhc2UgY2xhc3MKLS4uLgotJmd0OyZndDsmZ3Q7IGFfZm9vKGIsMykKLVRyYWNlYmFjayAoaW5uZXJtb3N0IGxhc3QpOgotICBGaWxlICImbHQ7c3RkaW4mZ3Q7IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IFR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMSBvZiBhX2Zvby4gRXhwZWN0ZWQgX2FfcC4KLSZndDsmZ3Q7Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ib3dldmVyLCBmcm9tIG91ciBjbGFzcyBkZWZpbml0aW9ucyB3ZSBrbm93IHRoYXQgImIiIGlzIGFuICJhIiBieSBpbmhlcml0YW5jZSBhbmQgdGhlcmUgc2hvdWxkIGJlIG5vIHR5cGUtZXJyb3IuIFRoaXMgcHJvYmxlbSBpcyBkaXJlY3RseSBkdWUgdG8gdGhlIGxhY2sgb2YgdHlwZS1zaGFyaW5nIGJldHdlZW4gbW9kdWxlcy4gSWYgd2UgbG9vayBjbG9zZWx5IGF0IHRoZSBtb2R1bGUgbW9kdWxlcyBjcmVhdGVkIGhlcmUsIHRoZXkgbG9vayBsaWtlIHRoaXMgOjxwPgotPGNlbnRlcj48aW1nIHNyYz0iY2gxMS4yLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLVRoZSB0eXBlIGluZm9ybWF0aW9uIGxpc3RlZCBzaG93cyB0aGUgYWNjZXB0YWJsZSB2YWx1ZXMgZm9yIHZhcmlvdXMgQyBkYXRhdHlwZXMuICBJbiB0aGUgImEiIG1vZHVsZSwgd2Ugc2VlIHRoYXQgImEiIGNhbiBvbmx5IGFjY2VwdCBpbnN0YW5jZXMgb2YgaXRzZWxmLiAgSW4gdGhlICJiIiBtb2R1bGUsIHdlIHNlZSB0aGF0ICJhIiAgY2FuIGFjY2VwdCBib3RoICJhIiBhbmQgImIiIGluc3RhbmNlcy0td2hpY2ggaXMgY29ycmVjdCBnaXZlbiB0aGF0IGEgImIiICBpcyBhbiAiYSIgYnkgaW5oZXJpdGFuY2UuPHA+Ci08cD4KLVVuZm9ydHVuYXRlbHksIHRoaXMgcHJvYmxlbSBpcyBpbmhlcmVudCBpbiB0aGUgbWV0aG9kIGJ5IHdoaWNoIFNXSUcgbWFrZXMgbW9kdWxlcy4gIFdoZW4gd2UgbWFkZSB0aGUgImEiIG1vZHVsZSwgd2UgaGFkIG5vIGlkZWEgd2hhdCBkZXJpdmVkIGNsYXNzZXMgbWlnaHQgYmUgdXNlZCBhdCBhIGxhdGVyIHRpbWUuIEhvd2V2ZXIsIGl0J3MgaW1wb3NzaWJsZSB0byBwcm9kdWNlIHRoZSBwcm9wZXIgdHlwZSBpbmZvcm1hdGlvbiB1bnRpbCBhZnRlciB3ZSBrbm93IGFsbCBvZiB0aGUgZGVyaXZlZCBjbGFzc2VzLiAgIEEgbmljZSBwcm9ibGVtIHRvIGJlIHN1cmUsIGJ1dCBvbmUgdGhhdCBjYW4gYmUgZml4ZWQgYnkgbWFraW5nIGFsbCBtb2R1bGVzIHNoYXJlIGEgc2luZ2xlIGNvcHkgb2YgdGhlIFNXSUcgcnVuLXRpbWUgbGlicmFyeS48cD4KLTxhIG5hbWU9Im42Ij48L2E+PGgzPiBUaGUgU1dJRyBydW50aW1lIGxpYnJhcnk8L2gzPgotVG8gcmVkdWNlIG92ZXJoZWFkIGFuZCB0byBmaXggdHlwZS1oYW5kbGluZyBwcm9ibGVtcywgaXQgaXMgcG9zc2libGUgdG8gc2hhcmUgdGhlIFNXSUcgcnVuLXRpbWUgZnVuY3Rpb25zIGJldHdlZW4gbXVsdGlwbGUgbW9kdWxlcy4gICAgVGhpcyByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeSB3aGljaCBpcyBvcHRpb25hbGx5IGJ1aWx0IGR1cmluZyBTV0lHIGluc3RhbGxhdGlvbi4gIFRvIHVzZSB0aGUgcnVudGltZSBsaWJyYXJpZXMsIGZvbGxvdyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTEuICBCdWlsZCB0aGUgU1dJRyBydW4tdGltZSBsaWJyYXJpZXMuICBUaGUgPHR0PlNXSUcxLjEvUnVudGltZTwvdHQ+IGRpcmVjdG9yeSBjb250YWlucyBhIG1ha2VmaWxlIGZvciBkb2luZyB0aGlzLiAgIElmIHN1Y2Nlc3NmdWxseSBidWlsdCwgeW91IHdpbGwgZW5kIHVwIHdpdGggNiBmaWxlcyB0aGF0IGFyZSB1c3VhbGx5IGluc3RhbGxlZCBpbiA8dHQ+L3Vzci9sb2NhbC9saWI8L3R0Pi48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5saWJzd2lndGNsLmEgICAgICAgICAgICAgICAgICMgVGNsIGxpYnJhcnkgKHN0YXRpYykKLWxpYnN3aWd0Y2wuc28gICAgICAgICAgICAgICAgIyBUY2wgbGlicmFyeSAoc2hhcmVkKQotbGlic3dpZ3BsLmEgICAgICAgICAgICAgICAgICAjIFBlcmwgbGlicmFyeSAoc3RhdGljKQotbGlic3dpZ3BsLnNvICAgICAgICAgICAgICAgICAjIFBlcmwgbGlicmFyeSAoc2hhcmVkKQotbGlic3dpZ3B5LmEgICAgICAgICAgICAgICAgICAjIFB5dGhvbiBsaWJyYXJ5IChzdGF0aWMpCi1saWJzd2lncHkuc28gICAgICAgICAgICAgICAgICMgUHl0aG9uIGxpYnJhcnkgKHNoYXJlZCkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm90ZSB0aGF0IGNlcnRhaW4gbGlicmFyaWVzIG1heSBiZSBtaXNzaW5nIGR1ZSB0byBtaXNzaW5nIHBhY2thZ2VzIG9yIHVuc3VwcG9ydGVkIGZlYXR1cmVzIChsaWtlIGR5bmFtaWMgbG9hZGluZykgb24geW91ciBtYWNoaW5lLjxwPgotPHA+Ci0yLiAgIENvbXBpbGUgYWxsIFNXSUcgbW9kdWxlcyB1c2luZyB0aGUgPHR0Pi1jPC90dD4gb3B0aW9uLiAgIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLWMgLXB5dGhvbiBhLmkKLSUgc3dpZyAtYyAtcHl0aG9uIGIuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0Pi1jPC90dD4gb3B0aW9uIHRlbGxzIFNXSUcgdG8gb21pdCBydW50aW1lIHN1cHBvcnQuICBJdCdzIG5vdyB1cCB0byB5b3UgdG8gcHJvdmlkZSBpdCBzZXBhcmF0ZWx5LS13aGljaCB3ZSB3aWxsIGRvIHVzaW5nIG91ciBsaWJyYXJpZXMuPHA+Ci08cD4KLTMuICAgQnVpbGQgU1dJRyBtb2R1bGVzIGJ5IGxpbmtpbmcgYWdhaW5zdCB0aGUgYXBwcm9wcmlhdGUgcnVudGltZSBsaWJyYXJpZXMuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1jIC1weXRob24gYS5pCi0lIHN3aWcgLWMgLXB5dGhvbiBiLmkKLSUgZ2NjIC1jIGFfd3JhcC5jIGJfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlCi0lIGxkIC1zaGFyZWQgYV93cmFwLm8gYl93cmFwLm8gLWxzd2lncHkgIC1vIGEuc28KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3IgaWYgYnVpbGRpbmcgYSBuZXcgZXhlY3V0YWJsZSAoc3RhdGljIGxpbmtpbmcpPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1jIC10Y2wgLWx0Y2xzaC5pIGEuaQotJSBnY2MgYV93cmFwLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL2xpYiAtbHRjbCAtbHN3aWd0Y2wgLWxtIC1vIG15dGNsc2gKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIGNvbXBsZXRlZCB5b3Ugc2hvdWxkIG5vdyBlbmQgdXAgd2l0aCBhIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBsaWtlIHRoaXMgOjxwPgotPGNlbnRlcj48aW1nIHNyYz0iY2gxMS4zLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotSW4gdGhpcyBjb25maWd1cmF0aW9uLCB0aGUgcnVudGltZSBsaWJyYXJ5IG1hbmFnZXMgYWxsIGRhdGF0eXBlcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gYmV0d2VlbiBtb2R1bGVzLiAgIFRoaXMgbWFuYWdlbWVudCBwcm9jZXNzIGlzIGR5bmFtaWMgaW4gbmF0dXJlLS13aGVuIG5ldyBtb2R1bGVzIGFyZSBsb2FkZWQsIHRoZXkgY29udHJpYnV0ZSBpbmZvcm1hdGlvbiB0byB0aGUgcnVuLXRpbWUgc3lzdGVtLiAgIEluIHRoZSBDKysgd29ybGQsIG9uZSBjb3VsZCBpbmNyZW1lbnRhbGx5IGxvYWQgY2xhc3NlcyBhcyBuZWVkZWQuICBBcyB0aGlzIHByb2Nlc3Mgb2NjdXJzLCB0eXBlIGluZm9ybWF0aW9uIGlzIHVwZGF0ZWQgYW5kIGJhc2UtY2xhc3NlcyBsZWFybiBhYm91dCBkZXJpdmVkIGNsYXNzZXMgYXMgbmVlZGVkLjxwPgotPGEgbmFtZT0ibjciPjwvYT48aDM+IEEgZmV3IGR5bmFtaWMgbG9hZGluZyBnb3RjaGFzPC9oMz4KLVdoZW4gd29ya2luZyB3aXRoIGR5bmFtaWMgbG9hZGluZywgaXQgaXMgY3JpdGljYWwgdG8gY2hlY2sgdGhhdCBvbmx5IG9uZSBjb3B5IG9mIHRoZSBydW4tdGltZSBsaWJyYXJ5IGlzIGJlaW5nIGxvYWRlZCBpbnRvIHRoZSBzeXN0ZW0uICBXaGVuIHdvcmtpbmcgd2l0aCA8dHQ+LmE8L3R0PiBsaWJyYXJ5IGZpbGVzLCBwcm9ibGVtcyBjYW4gc29tZXRpbWVzIG9jY3VyIHNvIHRoZXJlIGFyZSBhIGZldyBhcHByb2FjaGVzIHRvIHRoZSBwcm9ibGVtLjxwPgotPHA+Ci0xLiAgUmVidWlsZCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGV4ZWN1dGFibGUgd2l0aCB0aGUgU1dJRyBydW50aW1lIGxpYnJhcnkgYXR0YWNoZWQgdG8gaXQuICAgVGhpcyBpcyBhY3R1YWxseSwgZmFpcmx5IGVhc3kgdG8gZG8gdXNpbmcgU1dJRy4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIG15dGNsc2gKLSV7Ci0KLXN0YXRpYyB2b2lkICpfX2VtYmVkZnVuYyh2b2lkICphKSB7IHJldHVybiBhfTsKLSV9Ci0KLXZvaWQgKl9fZW1iZWRmdW5jKHZvaWQgKik7Ci0laW5jbHVkZSB0Y2xzaC5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm93LCBydW4gU1dJRyBhbmQgY29tcGlsZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLWMgLXRjbCBteXRjbHNoLmkKLSUgZ2NjIG15dGNsc2hfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlIC1ML3Vzci9sb2NhbC9saWIgLWx0Y2wgLWxzd2lndGNsIC1sZGwgLWxtIFwKLSAgICAgIC1vIHRjbHNoCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgcHJvZHVjZXMgYSBuZXcgZXhlY3V0YWJsZSAiPHR0PnRjbHNoPC90dD4iIHRoYXQgY29udGFpbnMgYSBjb3B5IG9mIHRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeS4gICBUaGUgd2VpcmQgPHR0Pl9fZW1iZWRmdW5jKCk8L3R0PiBmdW5jdGlvbiBpcyBuZWVkZWQgdG8gZm9yY2UgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgcnVudGltZSBsaWJyYXJ5IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBleGVjdXRhYmxlLiAgICA8cD4KLTxwPgotVG8gbWFrZSBuZXcgZHluYW1pY2FsbHkgbG9hZGFibGUgU1dJRyBtb2R1bGVzLCBzaW1wbHkgY29tcGlsZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLWMgLXRjbCBleGFtcGxlLmkKLSUgZ2NjIC1jIGV4YW1wbGVfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlCi0lIGxkIC1zaGFyZWQgZXhhbXBsZV93cmFwLm8gLW8gZXhhbXBsZS5zbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1MaW5raW5nIGFnYWluc3QgdGhlIDx0dD5zd2lndGNsPC90dD4gbGlicmFyeSBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IGFzIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGFyZSBub3cgaW5jbHVkZWQgaW4gdGhlIDx0dD50Y2xzaDwvdHQ+IGV4ZWN1dGFibGUgYW5kIHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB5b3VyIG1vZHVsZSBpcyBsb2FkZWQuPHA+Ci08cD4KLTIuICBVc2luZyBzaGFyZWQgbGlicmFyeSB2ZXJzaW9ucyBvZiB0aGUgcnVudGltZSBsaWJyYXJ5PHA+Ci08cD4KLUlmIHN1cHBvcnRlZCBvbiB5b3VyIG1hY2hpbmUsIHRoZSBydW50aW1lIGxpYnJhcmllcyB3aWxsIGJlIGJ1aWx0IGFzIHNoYXJlZCBsaWJyYXJpZXMgKGluZGljYXRlZCBieSBhIDx0dD4uc288L3R0PiwgPHR0Pi5zbDwvdHQ+LCBvciAuPHR0PmRsbDwvdHQ+IHN1ZmZpeCkuICAgVG8gY29tcGlsZSB1c2luZyB0aGUgcnVudGltZSBsaWJyYXJpZXMsIHlvdSBsaW5rIHByb2Nlc3Mgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBsZCAtc2hhcmVkIHN3aWd0Y2xfd3JhcC5vIC1vIGxpYnN3aWd0Y2wuc28gICAgICAgICAgICAgIyBJcml4Ci0lIGdjYyAtc2hhcmVkIHN3aWd0Y2xfd3JhcC5vIC1vIGxpYnN3aWd0Y2wuc28gICAgICAgICAgICAjIExpbnV4Ci0lIGxkIC1HIHN3aWd0Y2xfd3JhcC5vIC1vIGxpYnN3aWd0Y2wuc28gICAgICAgICAgICAgICAgICAjIFNvbGFyaXMKLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIG9yZGVyIGZvciB0aGUgPHR0PmxpYnN3aWd0Y2wuc288L3R0PiBsaWJyYXJ5IHRvIHdvcmssIGl0IG5lZWRzIHRvIGJlIHBsYWNlZCBpbiBhIGxvY2F0aW9uIHdoZXJlIHRoZSBkeW5hbWljIGxvYWRlciBjYW4gZmluZCBpdC4gIFR5cGljYWxseSB0aGlzIGlzIGEgc3lzdGVtIGxpYnJhcnkgZGlyZWN0b3J5IChpZS4gPHR0Pi91c3IvbG9jYWwvbGliPC90dD4gb3IgPHR0Pi91c3IvbGliPC90dD4pLiAgIDxwPgotPHA+Ci1XaGVuIHJ1bm5pbmcgd2l0aCB0aGUgc2hhcmVkIGxpYmFyeSB2ZXJzaW9uLCB5b3UgbWF5IGdldCBlcnJvciBtZXNzYWdlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+VW5hYmxlIHRvIGxvY2F0ZSBsaWJzd2lndGNsLnNvIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGluZGljYXRlcyB0aGF0IHRoZSBsb2FkZXIgd2FzIHVuYWJsZSB0byBmaW5kIHRoZSBzaGFyZWQgbGliYXJ5IGF0IHJ1bi10aW1lLiAgICAgVG8gZmluZCBzaGFyZWQgbGliYXJpZXMsIHRoZSBsb2FkZXIgbG9va3MgdGhyb3VnaCBhIGNvbGxlY3Rpb24gb2YgcHJlZGV0ZXJtaW5lZCBwYXRocy4gIElmIHRoZSA8dHQ+bGlic3dpZ3RjbC5zbzwvdHQ+IGZpbGUgaXMgbm90IGluIGFueSBvZiB0aGVzZSBkaXJlY3RvcmllcywgaXQgcmVzdWx0cyBpbiBhbiBlcnJvci4gICBPbiBtb3N0IG1hY2hpbmVzLCB5b3UgY2FuIGNoYW5nZSB0aGUgbG9hZGVyIHNlYXJjaCBwYXRoIGJ5IGNoYW5naW5nIHRoZSBVbml4IGVudmlyb25tZW50IHZhcmlhYmxlIDx0dD5MRF9MSUJSQVJZX1BBVEg8L3R0Pi4gICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzZXRlbnYgTERfTElCUkFSWV9QQVRIIC46L2hvbWUvYmVhemxleS9wYWNrYWdlcy9saWIKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQSBzb21ld2hhdCBiZXR0ZXIgYXBwcm9hY2ggaXMgdG8gbGluayB5b3VyIG1vZHVsZSB3aXRoIHRoZSBwcm9wZXIgcGF0aCBlbmNvZGVkLiAgVGhpcyBpcyB0eXBpY2FsbHkgZG9uZSB1c2luZyB0aGUgYC1ycGF0aCcgb3IgYC1SJyBvcHRpb24gdG8geW91ciBsaW5rZXIgKHNlZSB0aGUgbWFuIHBhZ2UpLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgbGQgLXNoYXJlZCBleGFtcGxlX3dyYXAubyBleGFtcGxlLm8gLXJwYXRoIC9ob21lL2JlYXpsZXkvcGFja2FnZXMvbGliIFwKLSAgICAgICAtTC9ob21lL2JlYXpsZXkvcGFja2FnZXMvbGliIC1sc3dpZ3RjbC5zbyAtbyBleGFtcGxlLnNvCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+LXJwYXRoPC90dD4gb3B0aW9uIGVuY29kZXMgdGhlIGxvY2F0aW9uIG9mIHNoYXJlZCBsaWJyYXJpZXMgaW50byB5b3VyIG1vZHVsZXMgYW5kIGdldHMgYXJvdW5kIGhhdmluZyB0byBzZXQgdGhlIDx0dD5MRF9MSUJSQVJZX1BBVEg8L3R0PiB2YXJpYWJsZS4gIDxwPgotPHA+Ci1JZiBhbGwgZWxzZSBmYWlscywgcHVsbCB1cCB0aGUgbWFuIHBhZ2VzIGZvciB5b3VyIGxpbmtlciBhbmQgc3RhcnQgcGxheWluZyBhcm91bmQuICAgPHA+Ci08YSBuYW1lPSJuMiI+PC9hPjxoMj4gRHluYW1pYyBMb2FkaW5nIG9mIEMrKyBtb2R1bGVzPC9oMj4KLUR5bmFtaWMgbG9hZGluZyBvZiBDKysgbW9kdWxlcyBwcmVzZW50cyBhIHNwZWNpYWwgcHJvYmxlbSBmb3IgbWFueSBzeXN0ZW1zLiAgIFRoaXMgaXMgYmVjYXVzZSBDKysgbW9kdWxlcyBvZnRlbiBuZWVkIGFkZGl0aW9uYWwgc3VwcG9ydGluZyBjb2RlIGZvciBwcm9wZXIgaW5pdGlhbGl6YXRpb24gYW5kIG9wZXJhdGlvbi4gICBTdGF0aWMgY29uc3RydWN0b3JzIGFyZSBhbHNvIGEgYml0IG9mIGEgcHJvYmxlbS48cD4KLTxwPgotV2hpbGUgdGhlIHByb2Nlc3Mgb2YgYnVpbGRpbmcgQysrIG1vZHVsZXMgaXMsIGJ5IG5vIG1lYW5zLCBhbmQgZXhhY3Qgc2NpZW5jZSwgaGVyZSBhcmUgYSBmZXcgcnVsZXMgb2YgdGh1bWIgdG8gZm9sbG93IDo8cD4KLTxwPgotPHVsPgotPGxpPkRvbid0IHVzZSBzdGF0aWMgY29uc3RydWN0b3JzIGlmIGF0IGFsbCBwb3NzaWJsZSAobm90IGFsd2F5cyBhdm9pZGFibGUpLgotPGxpPlRyeSBsaW5raW5nIHlvdXIgbW9kdWxlIHdpdGggdGhlIEMrKyBjb21waWxlciB1c2luZyBhIGNvbW1hbmQgbGlrZSBgYysrIC1zaGFyZWQnLiAgVGhpcyBvZnRlbiBzb2x2ZXMgYWxvdCBvZiBwcm9ibGVtcy4KLTxsaT5Tb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpbmsgYWdhaW5zdCBzcGVjaWFsIGxpYnJhcmllcy4gIEZvciBleGFtcGxlLCBtb2R1bGVzIGNvbXBpbGVkIHdpdGggZysrIG9mdGVuIG5lZWQgdG8gYmUgbGlua2VkIGFnYWluc3QgdGhlIDx0dD5saWJnY2MuYTwvdHQ+LCA8dHQ+bGliZysrLmE8L3R0PiwgYW5kIDx0dD5saWJzdGRjKysuYTwvdHQ+IGxpYnJhcmllcy4KLTxsaT5SZWFkIHRoZSBjb21waWxlciBhbmQgbGlua2VyIG1hbiBwYWdlcyBvdmVyIGFuZCBvdmVyIHVudGlsIHlvdSBoYXZlIHRoZW0gbWVtb3JpemVkICh0aGlzIG1heSBub3QgaGVscCBpbiBzb21lIGNhc2VzIGhvd2V2ZXIpLgotPGxpPlNlYXJjaCBhcnRpY2xlcyBvbiBVc2VuZXQsIHBhcnRpY3VsYXJseSBpbiA8dHQ+Y29tcC5sYW5nLnRjbDwvdHQ+LCA8dHQ+Y29tcC5sYW5nLnBlcmw8L3R0PiwgYW5kIDx0dD5jb21wLmxhbmcucHl0aG9uPC90dD4uICAgIEJ1aWxkaW5nIEMrKyBtb2R1bGVzIGlzIGEgY29tbW9uIHByb2JsZW0uCi08L3VsPgotPHA+Ci1UaGUgU1dJRyBkaXN0cmlidXRpb24gY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gYWJvdXQgQysrIG1vZHVsZXMgaW4gdGhlIERvYyBkaXJlY3RvcnkgYXMgd2VsbC48cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBJbnNpZGUgdGhlIFNXSUcgdHlwZS1jaGVja2VyPC9oMj4KLVRoZSBTV0lHIHJ1bnRpbWUgdHlwZS1jaGVja2VyIHBsYXlzIGEgY3JpdGljYWwgcm9sZSBpbiB0aGUgY29ycmVjdCBvcGVyYXRpb24gb2YgU1dJRyBtb2R1bGVzLiAgIEl0IG5vdCBvbmx5IGNoZWNrcyB0aGUgdmFsaWRpdHkgb2YgcG9pbnRlciB0eXBlcywgYnV0IGFsc28gbWFuYWdlcyBDKysgaW5oZXJpdGFuY2UsIGFuZCBwZXJmb3JtcyBwcm9wZXIgdHlwZS1jYXN0aW5nIG9mIHBvaW50ZXJzIHdoZW4gbmVjZXNzYXJ5LiAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIHNvbWUgaW5zaWdodCBpbnRvIHdoYXQgaXQgZG9lcywgaG93IGl0IHdvcmtzLCBhbmQgd2h5IGl0IGlzIHRoZSB3YXkgaXQgaXMuPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMz4gVHlwZSBlcXVpdmFsZW5jZTwvaDM+Ci1TV0lHIHVzZXMgYSBuYW1lLWJhc2VkIGFwcHJvYWNoIHRvIG1hbmFnaW5nIHBvaW50ZXIgZGF0YXR5cGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB1c2luZyBhIHBvaW50ZXIgbGlrZSAiPHR0PmRvdWJsZSAqPC90dD4iLCB0aGUgdHlwZS1jaGVja2VyIHdpbGwgbG9vayBmb3IgYSBwYXJ0aWN1bGFyIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGF0IGRhdGF0eXBlIHN1Y2ggYXMgIjx0dD5fZG91YmxlX3A8L3R0PiIuICAgSWYgbm8gbWF0Y2ggaXMgZm91bmQsIGEgdHlwZS1lcnJvciBpcyByZXBvcnRlZC48cD4KLTxwPgotSG93ZXZlciwgdGhlIG1hdGNoaW5nIHByb2Nlc3MgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBkYXRhdHlwZXMgbWF5IHVzZSBhIHZhcmlldHkgb2YgZGlmZmVyZW50IG5hbWVzLiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBkb3VibGUgICBSZWFsOwotdHlwZWRlZiBSZWFsICogICBSZWFsUHRyOwotdHlwZWRlZiBkb3VibGUgICBGbG9hdDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotZGVmaW5lIHR3byBzZXRzIG9mIGVxdWl2YWxlbnQgdHlwZXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPntkb3VibGUsIFJlYWwsIEZsb2F0fQote1JlYWxQdHIsIFJlYWwgKn0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQWxsIG9mIHRoZSB0eXBlcyBpbiBlYWNoIHNldCBhcmUgZnJlZWx5IGludGVyY2hhbmdhYmxlIGFuZCB0aGUgdHlwZS1jaGVja2VyIGtub3dzIGFib3V0IHRoZSByZWxhdGlvbnNoaXBzIGJ5IG1hbmFnaW5nIGEgdGFibGUgb2YgZXF1aXZhbGVuY2VzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotZG91YmxlICAgID0mZ3Q7IHsgUmVhbCwgRmxvYXQgfQotUmVhbCAgICAgID0mZ3Q7IHsgZG91YmxlLCBGbG9hdCB9Ci1GbG9hdCAgICAgPSZndDsgeyBkb3VibGUsIFJlYWwgfQotUmVhbFB0ciAgID0mZ3Q7IHsgUmVhbCAqIH0KLVJlYWwgKiAgICA9Jmd0OyB7IFJlYWxQdHIgfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4geW91IGRlY2xhcmUgYSBmdW5jdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZm9vKFJlYWwgKmEpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TV0lHIGZpcnN0IGNoZWNrcyB0byBzZWUgaWYgdGhlIGFyZ3VtZW50IHBhc3NlZCBpcyBhICI8dHQ+UmVhbCAqPC90dD4iLiAgIElmIG5vdCwgaXQgY2hlY2tzIHRvIHNlZSBpZiBpdCBpcyBhbnkgb2YgdGhlIG90aGVyIGVxdWl2YWxlbnQgdHlwZXMgKDx0dD5kb3VibGUgKjwvdHQ+LCA8dHQ+UmVhbFB0cjwvdHQ+LCA8dHQ+RmxvYXQgKjwvdHQ+KS4gIElmIHNvLCB0aGUgdmFsdWUgaXMgYWNjZXB0ZWQgYW5kIG5vIGVycm9yIG9jY3Vycy48cD4KLTxwPgotRGVyaXZlZCB2ZXJzaW9ucyBvZiB0aGUgdmFyaW91cyBkYXRhdHlwZXMgYXJlIGFsc28gbGVnYWwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhIGZ1bmN0aW9uIGxpa2UgdGhpcyw8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGJhcihGbG9hdCAqKiphKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHR5cGUtY2hlY2tlciB3aWxsIGFjY2VwdCBwb2ludGVycyBvZiB0eXBlIDx0dD5kb3VibGUgKioqPC90dD4gYW5kIDx0dD5SZWFsICoqKi48L3R0PiAgSG93ZXZlciwgdGhlIHR5cGUtY2hlY2tlciBkb2VzIG5vdCBhbHdheXMgY2FwdHVyZSB0aGUgZnVsbC1yYW5nZSBvZiBwb3NzaWJpbGl0aWVzLiAgRm9yIGV4YW1wbGUsIGEgZGF0YXR5cGUgb2YgYDx0dD5SZWFsUHRyICoqPC90dD4nIGlzIGVxdWl2YWxlbnQgdG8gYSBgPHR0PkZsb2F0ICoqKjwvdHQ+JyBidXQgd291bGQgYmUgZmxhZ2dlZCBhcyBhIHR5cGUgZXJyb3IuICAgSWYgeW91IGVuY291bnRlciB0aGlzIGtpbmQgb2YgcHJvYmxlbSwgeW91IGNhbiBtYW51YWxseSBmb3JjZSBTV0lHIHRvIG1ha2UgYW4gZXF1aXZhbGVuY2UgYXMgZm9sbG93czo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBUZWxsIHRoZSB0eXBlIGNoZWNrZXIgdGhhdCBgRmxvYXRfcHBwJyBhbmQgYFJlYWxQdHJfcHAnIGFyZSBlcXVpdmFsZW50LgotJWluaXQgJXsKLQlTV0lHX1JlZ2lzdGVyTWFwcGluZygiRmxvYXRfcHBwIiwiUmVhbFB0cl9wcCIsMCk7Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Eb2luZyB0aGlzIHNob3VsZCBoYXJkbHkgZXZlciBiZSBuZWNlc3NhcnkgKEkgaGF2ZSBuZXZlciBlbmNvdW50ZXJlZCBhIGNhc2Ugd2hlcmUgdGhpcyB3YXMgbmVjZXNzYXJ5KSwgYnV0IGlmIGFsbCBlbHNlIGZhaWxzLCB5b3UgY2FuIGZvcmNlIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIgaW50byBkb2luZyB3aGF0IHlvdSB3YW50LjxwPgotPHA+Ci1UeXBlLWVxdWl2YWxlbmNlIG9mIEMrKyBjbGFzc2VzIGlzIGhhbmRsZWQgaW4gYSBzaW1pbGFyIG1hbm5lciwgYnV0IGlzIGVuY29kZWQgaW4gYSBtYW5uZXIgdG8gc3VwcG9ydCBpbmhlcml0YW5jZS4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGNsYXNzZXMgaGllcmFyY2h5IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBBIHsgfTsKLWNsYXNzIEIgOiBwdWJsaWMgQSB7IH07Ci1jbGFzcyBDIDogcHVibGljIEIgeyB9OwotY2xhc3MgRCB7fTsKLWNsYXNzIEUgOiBwdWJsaWMgQywgcHVibGljIEQge307Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSB0eXBlLWNoZWNrZXIgZW5jb2RlcyB0aGlzIGludG8gdGhlIGZvbGxvd2luZyBzZXRzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5BID0mZ3Q7IHsgQiwgQywgRSB9ICAgICAgICAgICAgICAiQiBpc2EgQSwgQyBpc2EgQSwgRSBpc2EgQSIKLUIgPSZndDsgeyBDLCBFIH0gICAgICAgICAgICAgICAgICJDIGlzYSBCLCBFIGlzYSBCIgotQyA9Jmd0OyB7IEUgfSAgICAgICAgICAgICAgICAgICAgIkUgaXNhIEMiCi1EID0mZ3Q7IHsgRSB9ICAgICAgICAgICAgICAgICAgICAiRSBpc2EgRCIKLUUgPSZndDsgeyB9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBlbmNvZGluZyByZWZsZWN0cyB0aGUgY2xhc3MgaGllcmFyY2h5LiBGb3IgZXhhbXBsZSwgYW55IG9iamVjdCBvZiB0eXBlICJBIiB3aWxsIGFsc28gYWNjZXB0IG9iamVjdHMgb2YgdHlwZSBCLEMsIGFuZCBFIGJlY2F1c2UgdGhlc2UgYXJlIGFsbCBkZXJpdmVkIGZyb20gQS4gIEhvd2V2ZXIsIGl0IGlzIG5vdCBsZWdhbCB0byBnbyB0aGUgb3RoZXIgd2F5LiBGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gYSBvYmplY3QgZnJvbSBjbGFzcyBFIHdpbGwgbm90IGFjY2VwdCBhbiBvYmplY3QgZnJvbSBjbGFzcyBBLjxwPgotPGEgbmFtZT0ibjkiPjwvYT48aDM+IFR5cGUgY2FzdGluZzwvaDM+Ci1XaGVuIHdvcmtpbmcgd2l0aCBDKysgY2xhc3NlcywgU1dJRyBuZWVkcyB0byBwZXJmb3JtIHByb3BlciB0eXBlY2FzdGluZyBiZXR3ZWVuIGRlcml2ZWQgYW5kIGJhc2UgY2xhc3Nlcy4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB3aGVuIHdvcmtpbmcgd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gICBUbyBkbyB0aGlzLCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhcmUgY3JlYXRlZCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgKkV0b0Eodm9pZCAqcHRyKSB7Ci0JRSAqaW4gPSAoRSAqKSBwdHI7Ci0JQSAqb3V0ID0gKEEgKikgaW47ICAgICAgIC8vIENhc3QgdXNpbmcgQysrCi0JcmV0dXJuICh2b2lkICopIG91dDsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQWxsIHBvaW50ZXJzIGFyZSBpbnRlcm5hbGx5IHJlcHJlc2VudGVkIGFzIHZvaWQgKiwgYnV0IGNvbnZlcnNpb24gZnVuY3Rpb25zIGFyZSBhbHdheXMgaW52b2tlZCB3aGVuIHBvaW50ZXIgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgYmV0d2VlbiBiYXNlIGFuZCBkZXJpdmVkIGNsYXNzZXMgaW4gYSBDKysgY2xhc3MgaGllcmFyY2h5LjxwPgotPGEgbmFtZT0ibjEwIj48L2E+PGgzPiBXaHkgYSBuYW1lIGJhc2VkIGFwcHJvYWNoPzwvaDM+Ci1TV0lHIHVzZXMgYSBuYW1lLWJhc2VkIGFwcHJvYWNoIHRvIHR5cGUtY2hlY2tpbmcgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMgOjxwPgotPHA+Ci08dWw+Ci08bGk+T25lIG9mIFNXSUcncyBtYWluIHVzZXMgaXMgY29kZSBkZXZlbG9wbWVudCBhbmQgZGVidWdnaW5nLiAgIEluIHRoaXMgZW52aXJvbm1lbnQsIHRoZSB0eXBlIG5hbWUgb2YgYW4gb2JqZWN0IHR1cm5zIG91dCB0byBiZSBhIHVzZWZ1bCBwaWVjZSBvZiBpbmZvcm1hdGlvbiBpbiB0cmFja2luZyBkb3duIHByb2JsZW1zLgotPGxpPkluIGxhbmd1YWdlcyBsaWtlIFBlcmwsIHRoZSBuYW1lIG9mIGEgZGF0YXR5cGUgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhpbmdzIGxpa2UgcGFja2FnZXMgYW5kIGNsYXNzZXMuICAgIEJ5IHVzaW5nIGRhdGF0eXBlIG5hbWVzIHdlIGdldCBhIG5hdHVyYWwgbWFwcGluZyBiZXR3ZWVuIEMgYW5kIFBlcmwuCi08bGk+SSBiZWxpZXZlIHVzaW5nIHRoZSBvcmlnaW5hbCBuYW1lcyBvZiBkYXRhdHlwZXMgaXMgbW9yZSBpbnR1aXRpdmUgdGhhbiBtdW5naW5nIHRoZW0gaW50byBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQuCi08L3VsPgotPHA+Ci1BbiBhbHRlcm5hdGl2ZSB0byBhIG5hbWUgYmFzZWQgc2NoZW1lIHdvdWxkIGJlIHRvIGdlbmVyYXRlIHR5cGUtc2lnbmF0dXJlcyBiYXNlZCBvbiB0aGUgc3RydWN0dXJlIG9mIGEgZGF0YXR5cGUuICAgU3VjaCBhIHNjaGVtZSB3b3VsZCByZXN1bHQgaW4gcGVyZmVjdCB0eXBlLWNoZWNraW5nLCBidXQgSSB0aGluayBpdCB3b3VsZCBhbHNvIHJlc3VsdCBpbiBhIHZlcnkgY29uZnVzaW5nIHNjcmlwdGluZyBsYW5ndWFnZSBtb2R1bGUuICBGb3IgdGhpcyByZWFzb24sIEkgc2VlIFNXSUcgc3RpY2tpbmcgd2l0aCB0aGUgbmFtZS1iYXNlZCBhcHByb2FjaC0tYXQgbGVhc3QgZm9yIHRoZSBmb3Jlc2VlYWJsZSBmdXR1cmUuICA8cD4KLTxhIG5hbWU9Im4xMSI+PC9hPjxoMz4gUGVyZm9ybWFuY2Ugb2YgdGhlIHR5cGUtY2hlY2tlcjwvaDM+Ci1UaGUgdHlwZS1jaGVja2VyIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHMgd2hlbiBtYXRjaGluZyBhIGRhdGF0eXBlIDo8cD4KLTxwPgotCi08ZGw+Ci08ZHQ+MS4JIENoZWNrIGEgcG9pbnRlciBhZ2FpbnN0IHRoZSB0eXBlIHN1cHBsaWVkIGluIHRoZSBvcmlnaW5hbCBDIGRlY2xhcmF0aW9uLiAgSWYgdGhlcmUgaXMgYSBwZXJmZWN0IG1hdGNoLCB3ZSdyZSBkb25lLgotPGR0PjIuCSBDaGVjayB0aGUgc3VwcGxpZWQgcG9pbnRlciBhZ2FpbnN0IGEgY2FjaGUgb2YgcmVjZW50bHkgdXNlZCBkYXRhdHlwZXMuICAKLTxkdD4zLgkgU2VhcmNoIGZvciBhIG1hdGNoIGFnYWluc3QgdGhlIGZ1bGwgbGlzdCBvZiBlcXVpdmFsZW50IGRhdGF0eXBlcy4KLTxkdD40LgkgSWYgbm90IGZvdW5kLCByZXBvcnQgYW4gZXJyb3IuCi0KLTwvZGw+Ci08cD4KLU1vc3Qgd2VsbC1zdHJ1Y3R1cmVkIEMgY29kZXMgd2lsbCBmaW5kIGFuIGV4YWN0IG1hdGNoIG9uIHRoZSBmaXJzdCBhdHRlbXB0LCBwcm92aWRpbmcgdGhlIGJlc3QgcG9zc2libGUgcGVyZm9ybWFuY2UuICBGb3IgQysrIGNvZGVzLCBpdCBpcyBxdWl0ZSBjb21tb24gdG8gYmUgcGFzc2luZyB2YXJpb3VzIG9iamVjdHMgb2YgYSBjb21tb24gYmFzZS1jbGFzcyBhcm91bmQgYmV0d2VlbiBmdW5jdGlvbnMuICAgV2hlbiBiYXNlLWNsYXNzIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCwgaXQgYWxtb3N0IGFsd2F5cyByZXN1bHRzIGluIGEgbWlzY29tcGFyZSAoYmVjYXVzZSB0aGUgdHlwZS1jaGVja2VyIGlzIGxvb2tpbmcgZm9yIHRoZSBiYXNlLXR5cGUpLiAgSW4gdGhpcyBjYXNlLCB3ZSBkcm9wIGRvd24gdG8gYSBzbWFsbCBjYWNoZSBvZiByZWNlbnRseSB1c2VkIGRhdGF0eXBlcy4gICBJZiB3ZSd2ZSB1c2VkIGEgcG9pbnRlciBvZiB0aGUgc2FtZSB0eXBlIHJlY2VudGx5LCBpdCB3aWxsIGJlIGluIHRoZSBjYWNoZSBhbmQgd2UgY2FuIG1hdGNoIGFnYWluc3QgaXQuICAgIEZvciB0aWdodCBsb29wcywgdGhpcyByZXN1bHRzIGluIGFib3V0IDEwLTE1JSBvdmVyaGVhZCBvdmVyIGZpbmRpbmcgYSBtYXRjaCBvbiB0aGUgZmlyc3QgdHJ5LiAgIEZpbmFsbHksIGFzIGEgbGFzdCByZXNvcnQsIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBpbnRlcm5hbCBwb2ludGVyIHRhYmxlcyBmb3IgYSBtYXRjaC4gIFRoaXMgaW52b2x2ZXMgYSBjb21iaW5hdGlvbiBvZiBoYXNoIHRhYmxlIGxvb2t1cCBhbmQgbGluZWFyIHNlYXJjaC4gIElmIGEgbWF0Y2ggaXMgZm91bmQsIGl0IGlzIHBsYWNlZCBpbnRvIHRoZSBjYWNoZSBhbmQgdGhlIHJlc3VsdCByZXR1cm5lZC4gIElmIG5vdCwgd2UgZmluYWxseSByZXBvcnQgYSB0eXBlLW1pc21hdGNoLjxwPgotPHA+Ci1BcyBhIHJ1bGUgb2YgIHRodW1iLCBDKysgcHJvZ3JhbXMgcmVxdWlyZSBzb21ld2hhdCBtb3JlIHByb2Nlc3NpbmcgdGhhbiBDIHByb2dyYW1zLCBidXQgdGhpcyBzZWVtcyB0byBiZSBhdm9pZGFibGUuICAgIEFsc28sIGtlZXAgaW4gbWluZCB0aGF0IHBlcmZvcm1hbmNlIHBlbmFsdGllcyBpbiB0aGUgdHlwZS1jaGVja2VyIGRvbid0IG5lY2Vzc2FyaWx5IHRyYW5zbGF0ZSBpbnRvIGJpZyBwZW5hbHRpZXMgaW4gdGhlIG92ZXJhbGwgYXBwbGljYXRpb24uICBQZXJmb3JtYW5jZSBpcyBtb3N0IGdyZWF0bHkgYWZmZWN0ZWQgYnkgdGhlIGVmZmljaWVuY3kgb2YgdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIHRoZSB0eXBlcyBvZiBvcGVyYXRpb25zIHlvdXIgQyBjb2RlIGlzIHBlcmZvcm1pbmcuPHA+Ci08cD4KLTxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDc6MTMgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQ29udGVudHMuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQ29udGVudHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlNWU1Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0NvbnRlbnRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPiBTV0lHIDEuMSBVc2VycyBNYW51YWwgLSBUYWJsZSBvZiBDb250ZW50cyA8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci0KLTxoMT4gU1dJRyAxLjEgVXNlcnMgTWFudWFsIDwvaDE+Ci0KLTx1bD4KLTxsaT4gPGEgaHJlZj0iQ29weXJpZ2h0Lmh0bWwiPkNvcHlyaWdodDwvYT4KLTxsaT4gPGEgaHJlZj0iQWJvdXQuaHRtbCI+QWJvdXQgdGhpcyBtYW51YWw8L2E+Ci08bGk+IDxhIGhyZWY9IkluZGV4Lmh0bWwiPkFscGhhYmV0aWNhbCBUb3BpYyBJbmRleDwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iUHJlZmFjZS5odG1sIj5QcmVmYWNlPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJQcmVmYWNlLmh0bWwjbjEiPkludHJvZHVjdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iUHJlZmFjZS5odG1sI24yIj5TV0lHIHJlc291cmNlczwvYT4KLTxsaT4gPGEgaHJlZj0iUHJlZmFjZS5odG1sI24zIj5BYm91dCB0aGlzIG1hbnVhbDwvYT4KLTxsaT4gPGEgaHJlZj0iUHJlZmFjZS5odG1sI240Ij5DcmVkaXRzPC9hPgotPGxpPiA8YSBocmVmPSJQcmVmYWNlLmh0bWwjbjUiPldoYXQncyBuZXc/PC9hPgotPGxpPiA8YSBocmVmPSJQcmVmYWNlLmh0bWwjbjYiPkJ1ZyByZXBvcnRzPC9hPgotPGxpPiA8YSBocmVmPSJQcmVmYWNlLmh0bWwjbjciPlNXSUcgaXMgZnJlZTwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwiPjEgSW50cm9kdWN0aW9uPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMSI+V2hhdCBpcyBTV0lHPzwvYT4KLTxsaT4gPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjIiPkxpZmUgYmVmb3JlIFNXSUc8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24zIj5MaWZlIGFmdGVyIFNXSUc8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI240Ij5UaGUgU1dJRyBwYWNrYWdlPC9hPgotPGxpPiA8YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuNSI+QSBTV0lHIGV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI242Ij5DIHN5bnRheCwgYnV0IG5vdCBhIEMgY29tcGlsZXI8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI243Ij5Ob24taW50cnVzaXZlIGludGVyZmFjZSBidWlsZGluZzwvYT4KLTxsaT4gPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjgiPkhhbmRzIG9mZiBjb2RlIGdlbmVyYXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI245Ij5FdmVudCBkcml2ZW4gQyBwcm9ncmFtbWluZzwvYT4KLTxsaT4gPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjEwIj5BdXRvbWF0aWMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uPC9hPgotPGxpPiA8YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMTEiPlN1bW1hcnk8L2E+Ci08bGk+IDxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xMiI+U1dJRyBmb3IgV2luZG93cyBhbmQgTWFjaW50b3NoPC9hPgotPC91bD4KLTxoMj48YSBocmVmPSJTY3JpcHRpbmcuaHRtbCI+MiBTY3JpcHRpbmcgTGFuZ3VhZ2VzPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuMSI+VGhlIHR3byBsYW5ndWFnZSB2aWV3IG9mIHRoZSB3b3JsZDwvYT4KLTxsaT4gPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjIiPkhvdyBkb2VzIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRhbGsgdG8gQz88L2E+Ci08bGk+IDxhIGhyZWY9IlNjcmlwdGluZy5odG1sI24zIj5CdWlsZGluZyBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXh0ZW5zaW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjQiPlNoYXJlZCBsaWJyYXJpZXMgYW5kIGR5bmFtaWMgbG9hZGluZzwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iU1dJRy5odG1sIj4zIFNXSUcgQmFzaWNzPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJTV0lHLmh0bWwjbjEiPlJ1bm5pbmcgU1dJRzwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI24yIj5TaW1wbGUgQyBmdW5jdGlvbnMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50czwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI24zIj5Qb2ludGVycyBhbmQgY29tcGxleCBvYmplY3RzPC9hPgotPGxpPiA8YSBocmVmPSJTV0lHLmh0bWwjbjQiPkdldHRpbmcgZG93biB0byBidXNpbmVzczwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI241Ij5TdHJ1Y3R1cmVzLCB1bmlvbnMsIGFuZCBvYmplY3Qgb3JpZW50ZWQgQyBwcm9ncmFtbWluZzwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI242Ij5DKysgc3VwcG9ydDwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI243Ij5PYmplY3RpdmUtQzwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI244Ij5Db25kaXRpb25hbCBjb21waWxhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI245Ij5Db2RlIEluc2VydGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iU1dJRy5odG1sI24xMCI+QSBnZW5lcmFsIGludGVyZmFjZSBidWlsZGluZyBzdHJhdGVneTwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iTGlicmFyeS5odG1sIj40IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5PC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEiPlRoZSAlaW5jbHVkZSBkaXJlY3RpdmU8L2E+Ci08bGk+IDxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMiI+VGhlICVleHRlcm4gZGlyZWN0aXZlPC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjMiPlRoZSAlaW1wb3J0IGRpcmVjdGl2ZTwvYT4KLTxsaT4gPGEgaHJlZj0iTGlicmFyeS5odG1sI240Ij5JbmNsdWRpbmcgZmlsZXMgb24gdGhlIGNvbW1hbmQgbGluZTwvYT4KLTxsaT4gPGEgaHJlZj0iTGlicmFyeS5odG1sI241Ij5UaGUgU1dJRyBsaWJyYXJ5PC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjYiPkxpYnJhcnkgZXhhbXBsZTwvYT4KLTxsaT4gPGEgaHJlZj0iTGlicmFyeS5odG1sI243Ij5DcmVhdGluZyBMaWJyYXJ5IEZpbGVzPC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjgiPldvcmtpbmcgd2l0aCBsaWJyYXJ5IGZpbGVzPC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjkiPlN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBtdWx0aXBsZSBtb2R1bGVzPC9hPgotPGxpPiA8YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEwIj5Nb3JlIGFib3V0IHRoZSBTV0lHIGxpYnJhcnk8L2E+Ci08L3VsPgotPGgyPjxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCI+NSBEb2N1bWVudGF0aW9uIFN5c3RlbTwvYT48L2gyPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xIj5JbnRyb2R1Y3Rpb248L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMiI+SG93IGl0IHdvcmtzPC9hPgotPGxpPiA8YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjMiPkNob29zaW5nIGEgZG9jdW1lbnRhdGlvbiBmb3JtYXQ8L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuNCI+RnVuY3Rpb24gdXNhZ2UgYW5kIGFyZ3VtZW50IG5hbWVzPC9hPgotPGxpPiA8YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjUiPlRpdGxlcywgc2VjdGlvbnMsIGFuZCBzdWJzZWN0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI242Ij5Gb3JtYXR0aW5nPC9hPgotPGxpPiA8YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjciPkFkZGluZyBBZGRpdGlvbmFsIFRleHQ8L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuOCI+RGlzYWJsaW5nIGFsbCBkb2N1bWVudGF0aW9uPC9hPgotPGxpPiA8YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjkiPkFuIEV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTAiPkFTQ0lJIERvY3VtZW50YXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTEiPkhUTUwgRG9jdW1lbnRhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xMiI+TGFUZVggRG9jdW1lbnRhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xMyI+QysrIFN1cHBvcnQ8L2E+Ci08bGk+IDxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTQiPlRoZSBGaW5hbCBXb3JkPzwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iVHlwZW1hcHMuaHRtbCI+NiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwczwvYT48L2gyPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMSI+SW50cm9kdWN0aW9uPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI24yIj5UaGUgU1dJRyBQb2ludGVyIExpYnJhcnk8L2E+Ci08bGk+IDxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjMiPkludHJvZHVjdGlvbiB0byB0eXBlbWFwczwvYT4KLTxsaT4gPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuNCI+TWFuYWdpbmcgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJzPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI241Ij5BcHBseWluZyBjb25zdHJhaW50cyB0byBpbnB1dCB2YWx1ZXM8L2E+Ci08bGk+IDxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjYiPldyaXRpbmcgbmV3IHR5cGVtYXBzPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI243Ij5Db21tb24gdHlwZW1hcCBtZXRob2RzPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI244Ij5Xcml0aW5nIHR5cGVtYXAgY29kZTwvYT4KLTxsaT4gPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuOSI+VHlwZW1hcHMgZm9yIGhhbmRsaW5nIGFycmF5czwvYT4KLTxsaT4gPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMTAiPlR5cGVtYXBzIGFuZCB0aGUgU1dJRyBMaWJyYXJ5PC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI24xMSI+SW1wbGVtZW50aW5nIGNvbnN0cmFpbnRzIHdpdGggdHlwZW1hcHM8L2E+Ci08bGk+IDxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjEyIj5UeXBlbWFwIGV4YW1wbGVzPC9hPgotPGxpPiA8YSBocmVmPSJUeXBlbWFwcy5odG1sI24xMyI+SG93IHRvIGJyZWFrIGV2ZXJ5dGhpbmcgd2l0aCBhIHR5cGVtYXA8L2E+Ci08bGk+IDxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjE0Ij5UeXBlbWFwcyBhbmQgdGhlIGZ1dHVyZTwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sIj43IEV4Y2VwdGlvbiBIYW5kbGluZzwvYT48L2gyPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sI24xIj5UaGUgJWV4Y2VwdCBkaXJlY3RpdmU8L2E+Ci08bGk+IDxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuMiI+SGFuZGxpbmcgZXhjZXB0aW9ucyBpbiBDIGNvZGU8L2E+Ci08bGk+IDxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuMyI+RXhjZXB0aW9uIGhhbmRsaW5nIHdpdGggbG9uZ2ptcCgpPC9hPgotPGxpPiA8YSBocmVmPSJFeGNlcHRpb25zLmh0bWwjbjQiPkhhbmRsaW5nIEMrKyBleGNlcHRpb25zPC9hPgotPGxpPiA8YSBocmVmPSJFeGNlcHRpb25zLmh0bWwjbjUiPkRlZmluaW5nIGRpZmZlcmVudCBleGNlcHRpb24gaGFuZGxlcnM8L2E+Ci08bGk+IDxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuNiI+VXNpbmcgVGhlIFNXSUcgZXhjZXB0aW9uIGxpYnJhcnk8L2E+Ci08bGk+IDxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuNyI+RGVidWdnaW5nIGFuZCBvdGhlciBpbnRlcmVzdGluZyB1c2VzIGZvciAlZXhjZXB0PC9hPgotPGxpPiA8YSBocmVmPSJFeGNlcHRpb25zLmh0bWwjbjgiPk1vcmUgRXhhbXBsZXM8L2E+Ci08L3VsPgotPGgyPjxhIGhyZWY9IlBlcmw1Lmh0bWwiPjggU1dJRyBhbmQgUGVybDU8L2E+PC9oMj48cD48dWw+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjEiPlByZWxpbWluYXJpZXM8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjIiPkJ1aWxkaW5nIFBlcmwgRXh0ZW5zaW9ucyB1bmRlciBXaW5kb3dzIDk1L05UPC9hPgotPGxpPiA8YSBocmVmPSJQZXJsNS5odG1sI24zIj5Nb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNsYXNzZXM8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjQiPkJhc2ljIFBlcmwgaW50ZXJmYWNlPC9hPgotPGxpPiA8YSBocmVmPSJQZXJsNS5odG1sI241Ij5BIHNpbXBsZSBQZXJsIGV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjYiPkFjY2Vzc2luZyBhcnJheXMgYW5kIG90aGVyIHN0cmFuZ2Ugb2JqZWN0czwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuNyI+SW1wbGVtZW50aW5nIG1ldGhvZHMgaW4gUGVybDwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuOCI+U2hhZG93IGNsYXNzZXM8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjkiPkdldHRpbmcgc2VyaW91czwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuMTAiPldyYXBwaW5nIEMgbGlicmFyaWVzIGFuZCBvdGhlciBwYWNrYWdlczwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuMTEiPkJ1aWxkaW5nIGEgUGVybDUgaW50ZXJmYWNlIHRvIE1BVExBQjwvYT4KLTxsaT4gPGEgaHJlZj0iUGVybDUuaHRtbCNuMTIiPkhhbmRsaW5nIG91dHB1dCB2YWx1ZXMgKHRoZSBlYXN5IHdheSk8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjEzIj5FeGNlcHRpb24gaGFuZGxpbmc8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE0Ij5SZW1hcHBpbmcgZGF0YXR5cGVzIHdpdGggdHlwZW1hcHM8L2E+Ci08bGk+IDxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE1Ij5UaGUgZ29yeSBkZXRhaWxzIG9uIHNoYWRvdyBjbGFzc2VzPC9hPgotPGxpPiA8YSBocmVmPSJQZXJsNS5odG1sI24xNiI+V2hlcmUgdG8gZ28gZnJvbSBoZXJlPzwvYT4KLTwvdWw+Ci08aDI+PGEgaHJlZj0iUHl0aG9uLmh0bWwiPjkgU1dJRyBhbmQgUHl0aG9uPC9hPjwvaDI+PHA+PHVsPgotPGxpPiA8YSBocmVmPSJQeXRob24uaHRtbCNuMSI+UHJlbGltaW5hcmllczwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjIiPkJ1aWxkaW5nIFB5dGhvbiBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2E+Ci08bGk+IDxhIGhyZWY9IlB5dGhvbi5odG1sI24zIj5UaGUgbG93LWxldmVsIFB5dGhvbi9DIGludGVyZmFjZTwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQiPlB5dGhvbiBzaGFkb3cgY2xhc3NlczwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjUiPkFib3V0IHRoZSBFeGFtcGxlczwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjYiPlNvbHZpbmcgYSBzaW1wbGUgaGVhdC1lcXVhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjciPldyYXBwaW5nIGEgQyBsaWJyYXJ5PC9hPgotPGxpPiA8YSBocmVmPSJQeXRob24uaHRtbCNuOCI+UHV0dGluZyBpdCBhbGwgdG9nZXRoZXI8L2E+Ci08bGk+IDxhIGhyZWY9IlB5dGhvbi5odG1sI245Ij5FeGNlcHRpb24gaGFuZGxpbmc8L2E+Ci08bGk+IDxhIGhyZWY9IlB5dGhvbi5odG1sI24xMCI+UmVtYXBwaW5nIEMgZGF0YXR5cGVzIHdpdGggdHlwZW1hcHM8L2E+Ci08bGk+IDxhIGhyZWY9IlB5dGhvbi5odG1sI24xMSI+SW1wbGVtZW50aW5nIEMgY2FsbGJhY2sgZnVuY3Rpb25zIGluIFB5dGhvbjwvYT4KLTxsaT4gPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjEyIj5PdGhlciBvZGRzIGFuZCBlbmRzPC9hPgotPGxpPiA8YSBocmVmPSJQeXRob24uaHRtbCNuMTMiPlRoZSBnb3J5IGRldGFpbHMgb2Ygc2hhZG93IGNsYXNzZXM8L2E+Ci08L3VsPgotPGgyPjxhIGhyZWY9IlRjbC5odG1sIj4xMCBTV0lHIGFuZCBUY2w8L2E+PC9oMj48cD48dWw+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI24xIj5QcmVsaW1pbmFyaWVzPC9hPgotPGxpPiA8YSBocmVmPSJUY2wuaHRtbCNuMiI+QnVpbGRpbmcgVGNsL1RrIEV4dGVuc2lvbnMgdW5kZXIgV2luZG93cyA5NS9OVDwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjMiPkJhc2ljIFRjbCBJbnRlcmZhY2U8L2E+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI240Ij5UaGUgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZTwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjUiPkFib3V0IHRoZSBleGFtcGxlczwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjYiPkJpbmFyeSB0cmVlcyBpbiBUY2w8L2E+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI243Ij5CdWlsZGluZyBDL0MrKyBkYXRhIHN0cnVjdHVyZXMgd2l0aCBUazwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjgiPkFjY2Vzc2luZyBhcnJheXM8L2E+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI245Ij5CdWlsZGluZyBhIHNpbXBsZSBPcGVuR0wgbW9kdWxlPC9hPgotPGxpPiA8YSBocmVmPSJUY2wuaHRtbCNuMTAiPkV4Y2VwdGlvbiBoYW5kbGluZzwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjExIj5UeXBlbWFwczwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjEyIj5Db25maWd1cmF0aW9uIG1hbmFnZW1lbnQgd2l0aCBTV0lHPC9hPgotPGxpPiA8YSBocmVmPSJUY2wuaHRtbCNuMTMiPkJ1aWxkaW5nIG5ldyBraW5kcyBvZiBUY2wgaW50ZXJmYWNlcyAoaW4gVGNsKTwvYT4KLTxsaT4gPGEgaHJlZj0iVGNsLmh0bWwjbjE0Ij5FeHRlbmRpbmcgdGhlIFRjbCBOZXRzY2FwZSBQbHVnaW48L2E+Ci08bGk+IDxhIGhyZWY9IlRjbC5odG1sI24xNSI+VGNsOC4wIGZlYXR1cmVzPC9hPgotPC91bD4KLTxoMj48YSBocmVmPSJBZHZhbmNlZC5odG1sIj4xMSBBZHZhbmNlZCBUb3BpY3M8L2E+PC9oMj48cD48dWw+Ci08bGk+IDxhIGhyZWY9IkFkdmFuY2VkLmh0bWwjbjEiPkNyZWF0aW5nIG11bHRpLW1vZHVsZSBwYWNrYWdlczwvYT4KLTxsaT4gPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuMiI+RHluYW1pYyBMb2FkaW5nIG9mIEMrKyBtb2R1bGVzPC9hPgotPGxpPiA8YSBocmVmPSJBZHZhbmNlZC5odG1sI24zIj5JbnNpZGUgdGhlIFNXSUcgdHlwZS1jaGVja2VyPC9hPgotPC91bD4KLTxoMj48YSBocmVmPSJFeHRlbmRpbmcuaHRtbCI+MTIgRXh0ZW5kaW5nIFNXSUc8L2E+PC9oMj48cD48dWw+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xIj5JbnRyb2R1Y3Rpb248L2E+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yIj5Db21waWxpbmcgYSBTV0lHIGV4dGVuc2lvbjwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjMiPlNXSUcgb3V0cHV0PC9hPgotPGxpPiA8YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuNCI+VGhlIExhbmd1YWdlIGNsYXNzIChzaW1wbGUgdmVyc2lvbik8L2E+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI241Ij5BIHRvdXIgb2YgU1dJRyBkYXRhdHlwZXM8L2E+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI242Ij5UeXBlbWFwcyAoZnJvbSBDKTwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjciPkZpbGUgbWFuYWdlbWVudDwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjgiPk5hbWluZyBTZXJ2aWNlczwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjkiPkNvZGUgR2VuZXJhdGlvbiBGdW5jdGlvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xMCI+V3JpdGluZyBhIFJlYWwgTGFuZ3VhZ2UgTW9kdWxlPC9hPgotPGxpPiA8YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTEiPkMrKyBQcm9jZXNzaW5nPC9hPgotPGxpPiA8YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTIiPkRvY3VtZW50YXRpb24gUHJvY2Vzc2luZzwvYT4KLTxsaT4gPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjEzIj5UaGUgRnV0dXJlIG9mIFNXSUc8L2E+Ci08L3VsPgotCi08cD48aHI+Ci08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ3OjE4IDE5OTcgPC9hZGRyZXNzPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQ29weXJpZ2h0Lmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML0NvcHlyaWdodC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ4ODI4Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvQ29weXJpZ2h0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08SFRNTD4KLTxIRUFEPgotPHRpdGxlPiBTV0lHIERvY3VtZW50YXRpb24gQ29weXJpZ2h0PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgQkdDT0xPUj0iI0ZGRkZGRiI+Ci08aDI+IFNXSUcgVXNlcnMgTWFudWFsIDwvaDI+Ci08Yj4KLVZlcnNpb24gMS4xPGJyPgotSnVuZSwgMTk5NyA8YnI+Ci08L2I+Ci08cD4KLUNvcHlyaWdodChDKSAxOTk2LCAxOTk3PGJyPgotQWxsIFJpZ2h0cyBSZXNlcnZlZDxicj4KLTxicj4KLURhdmlkIE0uIEJlYXpsZXk8YnI+Ci1EZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgPGJyPgotVW5pdmVyc2l0eSBvZiBVdGFoIDxicj4KLVNhbHQgTGFrZSBDaXR5LCBVdGFoIDg0MTEyIDwvYnI+Ci08dHQ+YmVhemxleUBjcy51dGFoLmVkdTwvdHQ+Ci0KLTxwPgotVGhpcyBkb2N1bWVudCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIGluIHdob2xlIG9yIHBhcnQgcHJvdmlkZWQgdGhpcwotY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZC4gIENvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZG9jdW1lbnQKLWlzIHByb2hpYml0ZWQgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIGNvbnNlbnQgb2YgdGhlIGF1dGhvci4KLQotPGhyPgotU1dJRyAxLjEgaXMgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgYnkgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBhbmQgdGhlCi1Vbml2ZXJpdHkgb2YgQ2FsaWZvcm5pYSBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlLgotCi08cD4KLVRoaXMgc29mdHdhcmUgaXMgY29weXJpZ2h0ZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBhbmQgdGhlIFJlZ2VudHMKLW9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBUaGUgZm9sbG93aW5nIHRlcm1zIGFwcGx5IHRvIGFsbAotZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb2Z0d2FyZSB1bmxlc3MgZXhwbGljaXRseSBkaXNjbGFpbWVkCi1pbiBpbmRpdmlkdWFsIGZpbGVzLgotCi08cD4KLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHdpdGhvdXQgd3JpdHRlbiBhZ3JlZW1lbnQgYW5kIHdpdGhvdXQKLWxpY2Vuc2Ugb3Igcm95YWx0eSBmZWVzLCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcwotc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSwgcHJvdmlkZWQgdGhhdCAKLSgxKSBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0d28gcGFyYWdyYXBocwotYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvdXJjZSBjb2RlIGFuZCAoMikgcmVkaXN0cmlidXRpb25zCi1pbmNsdWRpbmcgYmluYXJpZXMgcmVwcm9kdWNlcyB0aGVzZSBub3RpY2VzIGluIHRoZSBzdXBwb3J0aW5nCi1kb2N1bWVudGF0aW9uLiAgIFN1YnN0YW50aWFsIG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBzb2Z0d2FyZSBtYXkgYmUKLWNvcHlyaWdodGVkIGJ5IHRoZWlyIGF1dGhvcnMgYW5kIG5lZWQgbm90IGZvbGxvdyB0aGUgbGljZW5zaW5nIHRlcm1zCi1kZXNjcmliZWQgaGVyZSwgcHJvdmlkZWQgdGhhdCB0aGUgbmV3IHRlcm1zIGFyZSBjbGVhcmx5IGluZGljYXRlZCBpbgotYWxsIGZpbGVzIHdoZXJlIHRoZXkgYXBwbHkuCi08cD4KLUlOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IsIFRIRSBVTklWRVJTSVRZIE9GIENBTElGT1JOSUEsIFRIRSAKLVVOSVZFUlNJVFkgT0YgVVRBSCBPUiBESVNUUklCVVRPUlMgT0YgVEhJUyBTT0ZUV0FSRSBCRSBMSUFCTEUgVE8gQU5ZCi1QQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTAotREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLAotRVZFTiBJRiBUSEUgQVVUSE9SUyBPUiBBTlkgT0YgVEhFIEFCT1ZFIFBBUlRJRVMgSEFWRSBCRUVOIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotPHA+Ci1USEUgQVVUSE9SLCBUSEUgVU5JVkVSU0lUWSBPRiBDQUxJRk9STklBLCBBTkQgVEhFIFVOSVZFUlNJVFkgT0YgVVRBSAotU1BFQ0lGSUNBTExZIERJU0NMQUlNIEFOWSBXQVJSQU5USUVTLElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCAKLVRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMgT04gQU4gIkFTIElTIiBCQVNJUywgQU5EIAotVEhFIEFVVEhPUlMgQU5EIERJU1RSSUJVVE9SUyBIQVZFIE5PIE9CTElHQVRJT04gVE8gUFJPVklERSBNQUlOVEVOQU5DRSwKLVNVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywgT1IgTU9ESUZJQ0FUSU9OUy4KLQotPGhyPgotPGFkZHJlc3M+PGEgaHJlZj0iaHR0cDovL3d3dy5jcy51dGFoLmVkdS9+YmVhemxleSI+IGJlYXpsZXlAY3MudXRhaC5lZHUgPC9hPiA8YnI+Ci1MYXN0IE1vZGlmaWVkLCBBdWd1c3QgMywgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0RvY3VtZW50YXRpb24uaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvRG9jdW1lbnRhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2U4MzZmLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvRG9jdW1lbnRhdGlvbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUyICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+RG9jdW1lbnRhdGlvbiBTeXN0ZW08L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxhIG5hbWU9Im4wIj48L2E+PGgxPjUgRG9jdW1lbnRhdGlvbiBTeXN0ZW08L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5JbnRyb2R1Y3Rpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuMiI+SG93IGl0IHdvcmtzPC9hPgotPGxpPiA8YSBocmVmPSIjbjMiPkNob29zaW5nIGEgZG9jdW1lbnRhdGlvbiBmb3JtYXQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+RnVuY3Rpb24gdXNhZ2UgYW5kIGFyZ3VtZW50IG5hbWVzPC9hPgotPGxpPiA8YSBocmVmPSIjbjUiPlRpdGxlcywgc2VjdGlvbnMsIGFuZCBzdWJzZWN0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iI242Ij5Gb3JtYXR0aW5nPC9hPgotPGxpPiA8YSBocmVmPSIjbjciPkFkZGluZyBBZGRpdGlvbmFsIFRleHQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuOCI+RGlzYWJsaW5nIGFsbCBkb2N1bWVudGF0aW9uPC9hPgotPGxpPiA8YSBocmVmPSIjbjkiPkFuIEV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPkFTQ0lJIERvY3VtZW50YXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTEiPkhUTUwgRG9jdW1lbnRhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMiI+TGFUZVggRG9jdW1lbnRhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMyI+QysrIFN1cHBvcnQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTQiPlRoZSBGaW5hbCBXb3JkPzwvYT4KLTwvdWw+Ci0KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBJbnRyb2R1Y3Rpb248L2gyPgotV2hpbGUgU1dJRyBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIGludGVyZmFjZXMsIGl0IGlzIG9mdGVuIGRpZmZpY3VsdCB0byBrZWVwIHRyYWNrIG9mIGFsbCBvZiB0aGUgZGlmZmVyZW50IGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGFuZCBvdGhlciBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIHdyYXBwZWQuIFRoaXMgZXNwZWNpYWxseSBiZWNvbWVzIGEgcHJvYmxlbSB3aGVuIHlvdXIgaW50ZXJmYWNlIHN0YXJ0cyB0byBncm93IGluIHNpemUgZnJvbSBhIGhhbmRmdWwgdG8gc2V2ZXJhbCBodW5kcmVkIGZ1bmN0aW9ucy4gVG8gYWRkcmVzcyB0aGVzZSBjb25jZXJucywgU1dJRyBjYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGluIGEgbnVtYmVyIG9mIGZvcm1hdHMgaW5jbHVkaW5nIEFTQ0lJLCBIVE1MLCBhbmQgTGFUZVguIFRoZSBnb2FsIGlzIHRoYXQgeW91IGNvdWxkIGxvb2sgYXQgdGhlIGRvY3VtZW50YXRpb24gZmlsZSB0byBzZWUgd2hhdCBmdW5jdGlvbnMgd2VyZSB3cmFwcGVkIGFuZCBob3cgdGhleSBhcmUgdXNlZCBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS48cD4KLTxwPgotVXNhZ2UgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggZGVjbGFyYXRpb24gZm91bmQgaW4gYW4gaW50ZXJmYWNlIGZpbGUuIFRoaXMgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQgYnkgdGhlIHRhcmdldCBsYW5ndWFnZSBtb2R1bGUgc28gdGhlIFRjbCBtb2R1bGUgd2lsbCBmb2xsb3cgVGNsIHN5bnRheCwgdGhlIFBlcmwgbW9kdWxlIHdpbGwgdXNlIFBlcmwgc3ludGF4LCBhbmQgc28gb24uIEluIGFkZGl0aW9uLCBDL0MrKyBjb21tZW50cyBjYW4gYmUgdXNlZCB0byBhZGQgZGVzY3JpcHRpdmUgdGV4dCB0byBlYWNoIGZ1bmN0aW9uLiBDb21tZW50cyBjYW4gYmUgcHJvY2Vzc2VkIGluIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBzdHlsZXMgdG8gc3VpdCBwZXJzb25hbCBwcmVmZXJlbmNlcyBvciB0byBtYXRjaCB0aGUgc3R5bGUgdXNlZCBpbiBhIHBhcnRpY3VsYXIgaW5wdXQgZmlsZS48cD4KLTxwPgotQXV0b21hdGljIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiBmb3IgQy9DKysgcHJvZ3JhbXMgaXMgYSBmYWlybHkgZm9ybWlkYWJsZSBwcm9ibGVtIGFuZCBTV0lHIHdhcyBuZXZlciBpbnRlbmRlZCB0byBiZSBhIHN1YnN0aXR1dGUgZm9yIGEgZnVsbC1ibG93biBkb2N1bWVudGF0aW9uIGdlbmVyYXRvci4gSG93ZXZlciwgSSBmZWVsIHRoYXQgaXMgZG9lcyBhIHJlYXNvbmFibGUgam9iIG9mICBkb2N1bWVudGluZyBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcy4gSXQgc2VlbXMgdG8gZG8ganVzdCBmaW5lIGZvciBtYW55IG9mIFNXSUcncyBwcmltYXJ5IGFwcGxpY2F0aW9ucy0tcmFwaWQgcHJvdG90eXBpbmcsIGRlYnVnZ2luZywgYW5kIGRldmVsb3BtZW50LjxwPgotPGEgbmFtZT0ibjIiPjwvYT48aDI+IEhvdyBpdCB3b3JrczwvaDI+Ci1Gb3IgZWFjaCBkZWNsYXJhdGlvbiBpbiBhbiBpbnRlcmZhY2UgZmlsZSwgU1dJRyBjcmVhdGVzIGEgIkRvY3VtZW50YXRpb24gRW50cnkuIiBUaGlzIGVudHJ5IGNvbnRhaW5zIHRocmVlIGNvbXBvbmVudHM7ICgxKSBhIHVzYWdlIHN0cmluZywgKDIpIGEgQyBpbmZvcm1hdGlvbiBzdHJpbmcsIGFuZCAoMykgZGVzY3JpcHRpdmUgdGV4dC4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgdGhpcyBkZWNsYXJhdGlvbiBpbiBhbiBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50IGZhY3QoaW50IG4pOwotLyogVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBhIGZhY3RvcmlhbCAqLwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZG9jdW1lbnRhdGlvbiBlbnRyeSBwcm9kdWNlZCBieSB0aGUgU1dJRyBBU0NJSSBtb2R1bGUgd2lsbCBsb29rIGxpa2UgdGhpcyBmb3IgVGNsOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmZhY3QgbgotCVsgcmV0dXJucyBpbnQgXQotCVRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgYSBmYWN0b3JpYWwKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGZpcnN0IGxpbmUgc2hvd3MgaG93IHRvIGNhbGwgdGhlIGZ1bmN0aW9uLCB0aGUgc2Vjb25kIGxpbmUgc2hvd3Mgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmdW5jdGlvbiAocmVsYXRlZCB0byBpdHMgQyBpbXBsZW1lbnRhdGlvbiksIHdoaWxlIHRoZSB0aGlyZCBsaW5lIGNvbnRhaW5zIHRoZSBjb21tZW50IHRleHQuIFRoZSBmaXJzdCB0d28gbGluZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcgYW5kIG1heSBiZSBkaWZmZXJlbnQgZm9yIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlLiBGb3IgZXhhbXBsZSwgdGhlIFBlcmw1IG1vZHVsZSB3b3VsZCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIG91dHB1dCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZmFjdCgkbikKLQlbIHJldHVybnMgaW50IF0KLQlUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIGEgZmFjdG9yaWFsCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotT2YgY291cnNlLCB0aGlzIGlzIG9ubHkgYSBzaW1wbGUgZXhhbXBsZSwgbW9yZSBzb3BoaXN0aWNhdGVkIHRoaW5ncyBhcmUgcG9zc2libGUuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gQ2hvb3NpbmcgYSBkb2N1bWVudGF0aW9uIGZvcm1hdDwvaDI+Ci1UaGUgdHlwZSBvZiBkb2N1bWVudGF0aW9uIGlzIHNlbGVjdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS1kYXNjaWkJCQlQcm9kdWNlIEFTQ0lJIGRvY3VtZW50YXRpb24KLS1kaHRtbAkJCVByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uCi0tZGxhdGV4CQkJUHJvZHVjZSBMYVRlWCBkb2N1bWVudGF0aW9uCi0tZG5vbmUJCQlQcm9kdWNlIG5vIGRvY3VtZW50YXRpb24KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHZhcmlvdXMgZG9jdW1lbnRhdGlvbiBtb2R1bGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIGxhbmd1YWdlIG1vZHVsZXMgc28gdGhlIGV4YWN0IGNob2ljZSBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuIFdpdGggYSBsaXR0bGUgQysrIGhhY2tpbmcsIGl0IGlzIGFsc28gcG9zc2libGUgZm9yIHlvdSB0byBhZGQgeW91ciBvd24gbW9kdWxlcyB0byBTV0lHLiBGb3IgZXhhbXBsZSwgd2l0aCBhIGJpdCBvZiB3b3JrIHlvdSBjb3VsZCB0dXJuIGFsbCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBpbnRvIGFuIG9ubGluZSBoZWxwIGNvbW1hbmQgaW4geW91ciBzY3JpcHRpbmcgbGFuZ3VhZ2UuIDxwPgotPGEgbmFtZT0ibjQiPjwvYT48aDI+IEZ1bmN0aW9uIHVzYWdlIGFuZCBhcmd1bWVudCBuYW1lczwvaDI+Ci1UaGUgZnVuY3Rpb24gdXNhZ2Ugc3RyaW5nIGlzIHByb2R1Y2VkIHRvIG1hdGNoIHRoZSBkZWNsYXJhdGlvbiBnaXZlbiBpbiB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZS4gVGhlIG5hbWVzIG9mIGFyZ3VtZW50cyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGFyZ3VtZW50IG5hbWVzLiBGb3IgZXhhbXBsZSwgdGhlIGRlY2xhcmF0aW9uczxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgaW5zZXJ0X2l0ZW0oTGlzdCAqLCBjaGFyICopOwotY2hhciAqbG9va3VwX2l0ZW0oY2hhciAqbmFtZSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXdpbGwgcHJvZHVjZSB0aGUgZm9sbG93aW5nIGRvY3VtZW50YXRpb24gKGZvciBQeXRob24pIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnNlcnRfaXRlbShMaXN0ICosIGNoYXIgKikKLQlbIHJldHVybnMgdm9pZCBdCi0KLWxvb2t1cF9pdGVtKG5hbWUpCi0JWyByZXR1cm5zIGNoYXIgKiBdCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gYXJndW1lbnQgbmFtZXMgYXJlIG9taXR0ZWQsIFNXSUcgd2lsbCB1c2UgdGhlIEMgZGF0YXR5cGVzIG9mIHRoZSBhcmd1bWVudHMgaW4gdGhlIGRvY3VtZW50YXRpb24uICAgSWYgYW4gYXJndW1lbnQgbmFtZSBpcyBzcGVjaWZpZWQsIFNXSUcgd2lsbCB1c2UgdGhhdCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpbnN0ZWFkLiAgT2YgY291cnNlLCBpdCBpcyB1cCB0byBlYWNoIGxhbmd1YWdlIG1vZHVsZSB0byBjcmVhdGUgYW4gYXBwcm9wcmlhdGUgdXNhZ2Ugc3RyaW5nIHNvIHlvdXIgcmVzdWx0cyBtYXkgdmFyeSBkZXBlbmRpbmcgb24gaG93IHRoaW5ncyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gZWFjaCBtb2R1bGUuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gVGl0bGVzLCBzZWN0aW9ucywgYW5kIHN1YnNlY3Rpb25zPC9oMj4KLVRoZSBTV0lHIGRvY3VtZW50YXRpb24gc3lzdGVtIGlzIGhpZXJhcmNoaWNhbCBpbiBuYXR1cmUgYW5kIGlzIG9yZ2FuaXplZCBpbnRvIGEgY29sbGVjdGlvbiBvZiBzZWN0aW9ucywgc3Vic2VjdGlvbnMsIHN1YnN1YnNlY3Rpb25zLCBhbmQgc28gb24uIFRoZSBmb2xsb3dpbmcgU1dJRyBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIG9yZ2FuaXplIGFuIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPHVsPgotPGxpPjx0dD4ldGl0bGUgIlRpdGxlIFRleHQiPC90dD4uIFNldCB0aGUgZG9jdW1lbnRhdGlvbiB0aXRsZSAobWF5IG9ubHkgYmUgdXNlZCBvbmNlKQotPGxpPjx0dD4lc2VjdGlvbiAiU2VjdGlvbiB0aXRsZSI8L3R0Pi4gU3RhcnQgYSBuZXcgc2VjdGlvbi4KLTxsaT48dHQ+JXN1YnNlY3Rpb24gIlN1YnNlY3Rpb24gdGl0bGUiPC90dD4uIENyZWF0ZSBhIG5ldyBzdWJzZWN0aW9uLgotPGxpPjx0dD4lc3Vic3Vic2VjdGlvbiAiU3Vic3Vic2VjdGlvbiB0aXRsZSI8L3R0Pi4gQ3JlYXRlIGEgbmV3IHN1YnN1YnNlY3Rpb24uCi08L3VsPgotPHA+Ci1UaGUgPHR0PiV0aXRsZTwvdHQ+IGRpcmVjdGl2ZSBzaG91bGQgYmUgcGxhY2VkIHByaW9yIHRvIHRoZSBmaXJzdCBkZWNsYXJhdGlvbiBpbiBhbiBpbnRlcmZhY2UgZmlsZSBhbmQgbWF5IG9ubHkgYmUgdXNlZCBvbmNlIChzdWJzZXF1ZW50IG9jY3VycmVuY2VzIHdpbGwgc2ltcGx5IGJlIGlnbm9yZWQpLiBUaGUgc2VjdGlvbiBkaXJlY3RpdmVzIG1heSBiZSBwbGFjZWQgYW55d2hlcmUuIEhvd2V2ZXIsIDx0dD4lc3Vic2VjdGlvbjwvdHQ+IGNhbiBvbmx5IGJlIHVzZWQgYWZ0ZXIgYSA8dHQ+JXNlY3Rpb248L3R0PiBkaXJlY3RpdmUgYW5kIDx0dD4lc3Vic3Vic2VjdGlvbjwvdHQ+IGNhbiBvbmx5IGJlIHVzZWQgYWZ0ZXIgYSA8dHQ+JXN1YnNlY3Rpb248L3R0PiBkaXJlY3RpdmUuPHA+Ci08cD4KLVdpdGggdGhlIG9yZ2FuaXphdGlvbiBkaXJlY3RpdmVzLCBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXRpdGxlICJFeGFtcGxlIEludGVyZmFjZSBGaWxlIgotJW1vZHVsZSBleGFtcGxlCi0lewotI2luY2x1ZGUgIm15X2hlYWRlci5oIgotJX0KLQotJXNlY3Rpb24gIk1hdGhlbWF0aWNhbCBGdW5jdGlvbnMiCi0KLS4uLiBkZWNsYXJhdGlvbnMgLi4uCi0KLSVzZWN0aW9uICJHcmFwaGljcyIKLSVzdWJzZWN0aW9uICIyRCBQbG90dGluZyIKLS4uLiBEZWNsYXJhdGlvbnMgLi4uCi0lc3Vic2VjdGlvbiAiM0QgUGxvdHRpbmciCi0lc3Vic3Vic2VjdGlvbiAiVmlld2luZyB0cmFuc2Zvcm1hdGlvbnMiCi0uLi4gRGVjbGFyYXRpb25zIC4uLgotJXN1YnN1YnNlY3Rpb24gIkxpZ2h0aW5nIgotLi4uIERlY2xhcmF0aW9ucyAuLi4KLSVzdWJzdWJzZWN0aW9uICJQcmltaXRpdmVzIgotLi4uIERlY2xhcmF0aW9ucyAuLi4KLQotJXNlY3Rpb24gIkZpbGUgSS9PIgotCi0uLi4gRGVjbGFyYXRpb25zIC4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjYiPjwvYT48aDI+IEZvcm1hdHRpbmc8L2gyPgotRG9jdW1lbnRhdGlvbiB0ZXh0IGNhbiBiZSBzb3J0ZWQsIGNob3BwZWQsIHNsaWNlZCwgYW5kIGRpY2VkIGluIGEgdmFyaWV0eSBvZiB3YXlzLiBGb3JtYXR0aW5nIGluZm9ybWF0aW9uIGlzIHNwZWNpZmllZCB1c2luZyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYWZ0ZXIgdGhlIDx0dD4ldGl0bGU8L3R0PiwgPHR0PiVzZWN0aW9uPC90dD4sIDx0dD4lc3Vic2VjdGlvbjwvdHQ+LCBvciA8dHQ+JXN1YnN1YnNlY3Rpb248L3R0PiBkaXJlY3RpdmVzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXRpdGxlICJNeSBEb2N1bWVudGF0aW9uIiwgc29ydCwgYmVmb3JlLCBwcmUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB0ZWxscyBTV0lHIHRvIHNvcnQgYWxsIG9mIHRoZSBkb2N1bWVudGF0aW9uLCB1c2UgY29tbWVudHMgdGhhdCBhcmUgYmVmb3JlIGVhY2ggZGVjbGFyYXRpb24sIGFuZCBhc3N1bWUgdGhhdCB0ZXh0IGlzIHByZWZvcm1hdHRlZC4gVGhlc2UgZm9ybWF0dGluZyBkaXJlY3RpdmVzIGFyZSBhcHBsaWVkIHRvIGFsbCBjaGlsZHJlbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiB0cmVlLS1pbiB0aGlzIGNhc2UsIGV2ZXJ5dGhpbmcgaW4gYW4gaW50ZXJmYWNlIGZpbGUuPHA+Ci08cD4KLUlmIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gaXMgc3BlY2lmaWVkIGZvciBhIHNlY3Rpb24gbGlrZSB0aGlzPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXN1YnNlY3Rpb24gIjNEIEdyYXBoaWNzIiwgbm9zb3J0LCBhZnRlcgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci10aGVuIHRoZSBlZmZlY3Qgd2lsbCBvbmx5IGFwcGx5IHRvIHRoYXQgcGFydGljdWxhciBzZWN0aW9uIChhbmQgYWxsIG9mIGl0cyBzdWJzZWN0aW9ucykuIEluIHRoaXMgY2FzZSwgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1YnNlY3Rpb24gd291bGQgb3ZlcnJpZGUgYW55IHByZXZpb3VzIGZvcm1hdHRpbmcsIGJ1dCB0aGVzZSBjaGFuZ2VzIHdvdWxkIG9ubHkgYXBwbHkgdG8gdGhpcyBzdWJzZWN0aW9uLiBUaGUgbmV4dCBzdWJzZWN0aW9uIGNvdWxkIHVzZSBpdHMgb3duIGZvcm1hdHRpbmcgb3IgdGhhdCBvZiBpdHMgcGFyZW50LjxwPgotPHA+Ci1TdHlsZSBwYXJhbWV0ZXJzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgPHR0PiVzdHlsZTwvdHQ+IGFuZCA8dHQ+JWxvY2Fsc3R5bGU8L3R0PiBwYXJhbWV0ZXJzLiBUaGUgPHR0PiVzdHlsZTwvdHQ+IGRpcmVjdGl2ZSBhcHBsaWVzIGEgbmV3IGZvcm1hdCB0byB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCBhbGwgb2YgaXRzIHBhcmVudHMuIFRoZSA8dHQ+JWxvY2Fsc3R5bGU8L3R0PiBkaXJlY3RpdmUgYXBwbGllcyBhIG5ldyBmb3JtYXQgdG8gdGhlIGN1cnJlbnQgc2VjdGlvbi4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVzdHlsZSBzb3J0LGJlZm9yZSwgc2tpcD0xICAgICAgIyBBcHBseSB0aGVzZSBmb3JtYXRzIGV2ZXJ5d2hlcmUKLSVsb2NhbHN0eWxlIHNvcnQgICAgICAgICAgICAgICAgIyBBcHBseSB0aGlzIGZvcm1hdCB0byB0aGUgY3VycmVudCBzZWN0aW9uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVVzZSBvZiB0aGVzZSBkaXJlY3RpdmVzIHVzdWFsbHkgaXNuJ3QgcmVxdWlyZWQgc2luY2UgaXQncyBlYXN5IGVub3VnaCB0byBzaW1wbHkgc3BlY2lmeSB0aGUgaW5mb3JtYXRpb24gYWZ0ZXIgZWFjaCBzZWN0aW9uLjxwPgotPGEgbmFtZT0ibjE1Ij48L2E+PGgzPiBEZWZhdWx0IEZvcm1hdHRpbmc8L2gzPgotQnkgZGVmYXVsdCwgU1dJRyB3aWxsIHJlZm9ybWF0IGNvbW1lbnQgdGV4dCwgcHJvZHVjZSBkb2N1bWVudGF0aW9uIGluIHRoZSBvcmRlciBlbmNvdW50ZXJlZCBpbiBhbiBpbnRlcmZhY2UgZmlsZSAobm9zb3J0KSwgYW5kIGFubm90YXRlIGRlc2NyaXB0aW9ucyB3aXRoIGEgQyBpbmZvcm1hdGlvbiBzdHJpbmcuICAgVGhpcyBiZWhhdmlvciBtb3N0IGNsb3NlbHkgbWF0Y2hlcyB0aGF0IHVzZWQgaW4gU1dJRyAxLjAsIGFsdGhvdWdoIGl0IGlzIG5vdCBhbiBleGFjdCBtYXRjaCBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gdGhlIG9sZCBkb2N1bWVudGF0aW9uIHN5c3RlbS48cD4KLTxwPgotV2hlbiB1c2VkIGluIHRoZSBkZWZhdWx0IG1vZGUsIGNvbW1lbnQgdGV4dCBtYXkgY29udGFpbiBkb2N1bWVudGF0aW9uIHNwZWNpZmljIGZvcm1hdHRpbmcgbWFya3VwLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGVtYmVkIExhVGVYIG9yIEhUTUwgbWFya3VwIGluIGNvbW1lbnRzIHRvIGhhdmUgcHJlY2lzZSBjb250cm9sIG92ZXIgdGhlIGxvb2sgb2YgdGhlIGZpbmFsIGRvY3VtZW50LjxwPgotPGEgbmFtZT0ibjE2Ij48L2E+PGgzPiBDb21tZW50IEZvcm1hdHRpbmcgdmFyaWFibGVzPC9oMz4KLVRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgY2FuIGJlIGNoYW5nZWQgYnkgY2hhbmdpbmcgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXR0aW5nIHZhcmlhYmxlcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotYWZ0ZXIgICAgICAgICAgICAgICAgIFVzZSBjb21tZW50cyBhZnRlciBhIGRlY2xhcmF0aW9uIChkZWZhdWx0KQotYmVmb3JlICAgICAgICAgICAgICAgIFVzZSBjb21tZW50cyBiZWZvcmUgYSBkZWNsYXJhdGlvbgotY2hvcF90b3A9bmxpbmVzICAgICAgIENvbW1lbnQgY2hvcHBpbmcgKHByZWZvcm1hdHRlZCkKLWNob3BfYm90dG9tPW5saW5lcyAgICBDb21tZW50IGNob3BwaW5nIChwcmVmb3JtYXR0ZWQpCi1jaG9wX2xlZnQ9bmNoYXIgICAgICAgQ29tbWVudCBjaG9wcGluZyAocHJlZm9ybWF0dGVkKQotY2hvcF9yaWdodD1uY2hhciAgICAgIENvbW1lbnQgY2hvcHBpbmcgKHByZWZvcm1hdHRlZCkKLWZvcm1hdCAgICAgICAgICAgICAgICBBbGxvdyBTV0lHIHRvIHJlZm9ybWF0IHRleHQgKHRoZSBkZWZhdWx0KQotaWdub3JlICAgICAgICAgICAgICAgIElnbm9yZSBjb21tZW50cwotaW5mbyAgICAgICAgICAgICAgICAgIFByaW50IEMgaW5mb3JtYXRpb24gdGV4dCAoZGVmYXVsdCkKLWtlZXAgICAgICAgICAgICAgICAgICBLZWVwIGNvbW1lbnRzIChvcHBvc2l0ZSBvZiBpZ25vcmUpCi1ub2luZm8gICAgICAgICAgICAgICAgRG9uJ3QgcHJpbnQgQyBpbmZvcm1hdGlvbiB0ZXh0Ci1ub3NvcnQgICAgICAgICAgICAgICAgRG9uJ3Qgc29ydCBkb2N1bWVudGF0aW9uIChkZWZhdWx0KQotcHJlICAgICAgICAgICAgICAgICAgIEFzc3VtZSB0ZXh0IGlzIHByZWZvcm1hdHRlZAotc2tpcD1ubGluZXMgICAgICAgICAgIE51bWJlciBvZiBibGFuayBsaW5lcyBiZXR3ZWVuIGNvbW1lbnQgYW5kIGRlY2xhcmF0aW9uCi1zb3J0ICAgICAgICAgICAgICAgICAgU29ydCBkb2N1bWVudGF0aW9uCi10YWJpZnkgICAgICAgICAgICAgICAgTGVhdmUgdGFicyBpbnRhY3QKLXVudGFiaWZ5ICAgICAgICAgICAgICBDb252ZXJ0IHRhYnMgdG8gc3BhY2VzIChkZWZhdWx0KQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Nb3JlIHZhcmlhYmxlcyBtYXkgYmUgYXZhaWxhYmxlIGRlcGVuZGluZyBvbiBwYXJ0aWN1bGFyIGRvY3VtZW50YXRpb24gbW9kdWxlcy4gVGhlIHVzZSBvZiB0aGVzZSB2YXJpYWJsZXMgaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IGZldyBzZWN0aW9ucy48cD4KLTxhIG5hbWU9Im4xNyI+PC9hPjxoMz4gU29ydGluZyA8L2gzPgotRG9jdW1lbnRhdGlvbiBjYW4gYmUgc29ydGVkIHVzaW5nIHRoZSBgPHR0PnNvcnQ8L3R0PicgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXRpdGxlICJNeSBpbnRlcmZhY2UiLHNvcnQKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB1c2VkLCBhbGwgZG9jdW1lbnRhdGlvbiBlbnRyaWVzLCBpbmNsdWRpbmcgc2VjdGlvbnMgd2lsbCBiZSBhbHBoYWJldGljYWxseSBzb3J0ZWQuIFNvcnRpbmcgY2FuIGJlIGRpc2FibGVkIGluIHBhcnRpY3VsYXIgc2VjdGlvbnMgYW5kIHN1YnNlY3Rpb24gYnkgc3BlY2lmeWluZyB0aGUgYDx0dD5ub3NvcnQ8L3R0PicgcGFyYW1ldGVyIGluIGEgc2VjdGlvbiBkZWNsYXJhdGlvbi4gQnkgZGVmYXVsdCwgU1dJRyBkb2VzIG5vdCBzb3J0IGRvY3VtZW50YXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCBpdCByZWFsbHkgb25seSBjb21lcyBpbiBoYW5keSBpZiB5b3UgaGF2ZSBhIHJlYWxseSBtZXNzeSBpbnRlcmZhY2UgZmlsZS48cD4KLTxwPgotRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBTV0lHLCB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3J0aW5nLiA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lYWxwaGEgCQlTb3J0IGRvY3VtZW50YXRpb24gYWxwaGFiZXRpY2FsbHkgKG9ic29sZXRlKQotJXJhdwkJS2VlcCBkb2N1bWVudGF0aW9uIGluIG9yZGVyIChvYnNvbGV0ZSkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlc2UgZGlyZWN0aXZlcyBvbmx5IGFwcGx5IGdsb2JhbGx5IGFuZCBzaG91bGQgbmVhciB0aGUgYmVnaW5uaW5nIG9mIGZpbGUuIEZ1dHVyZSBzdXBwb3J0IG9mIHRoZXNlIGRpcmVjdGl2ZXMgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGdlbmVyYWxseSBkaXNjb3VyYWdlZC48cD4KLTxhIG5hbWU9Im4xOCI+PC9hPjxoMz4gQ29tbWVudCBwbGFjZW1lbnQgYW5kIGZvcm1hdHRpbmc8L2gzPgotQ29tbWVudHMgbWF5IGJlIHBsYWNlZCBiZWZvcmUgb3IgYWZ0ZXIgYSBkZWNsYXJhdGlvbi4gVGhpcyBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlIGA8dHQ+YmVmb3JlPC90dD4nIGFuZCBgPHR0PmFmdGVyPC90dD4nIHBhcmFtZXRlcnMuICAgIFRoZSBzcGFjZSBiZXR3ZWVuIGEgY29tbWVudCBhbmQgYSBkZWNsYXJhdGlvbiBjYW4gYmUgc2V0IGJ5IGNoYW5naW5nIHRoZSBgPHR0PnNraXA8L3R0PicgcGFyYW1ldGVyLiAgQnkgZGVmYXVsdCwgPHR0PnNraXA9MTwvdHQ+LCBpbmRpY2F0aW5nIHRoYXQgYSBjb21tZW50IGFuZCBkZWNsYXJhdGlvbiBtdXN0IGJlIG9uIGFkamFjZW50IGxpbmVzLiAgICBVc2Ugb2YgdGhlIDx0dD5za2lwPC90dD4gcGFyYW1ldGVyIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB0aGUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgdG8gaWdub3JlIGNvbW1lbnRzIHRoYXQgYXJlIHRvbyBmYXIgYXdheSBhbmQgcG9zc2libHkgdW5yZWxhdGVkIHRvIGEgZGVjbGFyYXRpb24uPHA+Ci08cD4KLUJ5IGRlZmF1bHQsIFNXSUcgcmVmb3JtYXRzIHRoZSB0ZXh0IGZvdW5kIGluIGEgY29tbWVudC4gICBIb3dldmVyLCBpbiBtYW55IGNhc2VzLCB5b3VyIGZpbGUgbWF5IGhhdmUgcHJlZm9ybWF0dGVkIGNvbW1lbnRzIG9yIGNvbW1lbnQgYmxvY2tzLiAgIFRvIGhhbmRsZSBzdWNoIGNvbW1lbnRzIGNvcnJlY3RseSwgeW91IGNhbiB1c2UgcHJlZm9ybWF0dGVkIG1vZGUuICBUaGlzIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgYHByZScgcGFyYW1ldGVyIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVzZWN0aW9uICJQcmVmb3JtYXR0ZWQgU2VjdGlvbiIscHJlCi0lc2VjdGlvbiAiUmVmb3JtYXR0ZWQgU2VjdGlvbiIsIGZvcm1hdAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbGwgZGVjbGFyYXRpb25zIGluIHRoaXMgc2VjdGlvbiB3aWxsIG5vdyBiZSBhc3N1bWVkIHRvIGhhdmUgcHJlZm9ybWF0dGVkIGNvbW1lbnRzLiAgIFdoZW4gdXNpbmcgdGhlIHByZWZvcm1hdCBtb2RlLCBhIHZhcmlldHkgb2Ygb3RoZXIgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbSA6PHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDUuMS5wbmciPjwvY2VudGVyPgotCi0uPHA+Ci08cD4KLVRoZSBjaG9wcGluZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIHN0cmlwIG91dCB0aGUgdGV4dCBvZiBibG9jayBjb21tZW50cy4gIEZvciBleGFtcGxlLCB1c2luZyA8dHQ+Y2hvcF9sZWZ0PTM8L3R0PiwgPHR0PmNob3BfdG9wPTE8L3R0PiwgPHR0PmNob3BfYm90dG9tPTE8L3R0PiBvbiB0aGUgYWJvdmUgY29tbWVudCBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIG91dHB1dCA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotUGxvdDJEX2xpbmUgeDEgeTEgeDIgeTIgY29sb3IKLQlbIHJldHVybnMgdm9pZCBdCi0Jdm9pZCBQbG90MkRfbGluZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIFBpeGVsIGNvbG9yKSAgCi0KLQlEcmF3cyBhIGxpbmUgYmV0d2VlbiB0aGUgcG9pbnRzICh4MSx5MSkgYW5kICh4Mix5MikgdXNpbmcgdGhlIAotCXRoZSBnaXZlbiBjb2xvci4gICBUaGUgbGluZSBpcyBjcm9wcGVkIHRvIGZpdCBpbiB0aGUgY3VycmVudCAgCi0JYm91bmRpbmcgYm94LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQlVc2VzIHRoZSBCcmVzZW5oYW0gbGluZSBkcmF3aW5nIGFsZ29yaXRobS4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIGNob3BwaW5nIHBhcmFtZXRlcnMgb25seSBhcHBseSBpZiBhIGNvbW1lbnQgaXMgc3VmZmljaWVudGx5IGxhcmdlIChpLmUuLiBpZiB0aGUgbnVtYmVyIG9mIGxpbmVzIGV4Y2VlZCA8dHQ+Y2hvcF90b3A8L3R0Pis8dHQ+Y2hvcF9ib3R0b208L3R0PikuICAgVGh1cywgaW4gb3VyIGV4YW1wbGUsIGEgb25lIGxpbmUgY29tbWVudCB3aWxsIGJlIHVuYWx0ZXJlZCBldmVuIHRob3VnaCBjaG9wcGluZyBoYXMgYmVlbiBzZXQuICAgQnkgZGVmYXVsdCwgU1dJRyBzZXRzIGNob3BfbGVmdD0zIGFuZCBhbGwgb3RoZXJzIHRvIHplcm8uICAgVGhpcyBzZXR0aW5nIHJlbW92ZXMgdGhlICBgPHR0Pi8qIDwvdHQ+YCBvciBgPHR0Pi8vIDwvdHQ+YCBwcmVjZWVkaW5nIGEgY29tbWVudC48cD4KLTxhIG5hbWU9Im4xOSI+PC9hPjxoMz4gVGFicyBhbmQgb3RoZXIgYW5ub3lhbmNlczwvaDM+Ci1XaGVuIHVzaW5nIHRoZSBwcmVmb3JtYXR0ZWQgbW9kZSwgU1dJRyB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCB0YWJzIHRvIHdoaXRlIHNwYWNlLiAgVGhpcyBpcyBkb25lIGFzc3VtaW5nIHRoYXQgdGFicyBhcmUgcGxhY2VkIGV2ZXJ5IDggY2hhcmFjdGVycy4gICBUaGUgdGFiaWZpY2F0aW9uIG1vZGUgY2FuIGJlIHNlbGVjdGVkIHVzaW5nIHRoZSBgdGFiaWZ5JyBhbmQgYHVudGFiaWZ5JyBwYXJhbWV0ZXJzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lc2VjdGlvbiAiVW50YWJpZmllZCBTZWN0aW9uIix1bnRhYmlmeQotJXNlY3Rpb24gIkxlYXZlIHRob3NlIHRhYnMgYWxvbmUiLCB0YWJpZnkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGFicyBhcmUgc2ltcGx5IGlnbm9yZWQgd2hlbiBjb21tZW50cyBhcmUgcmVmb3JtYXR0ZWQgKHdlbGwsIGFjdHVhbGx5LCB0aGV5J3JlIGp1c3QgY29waWVkIGludG8gdGhlIG91dHB1dCwgYnV0IHRoZSB0YXJnZXQgZG9jdW1lbnRhdGlvbiBtZXRob2Qgd2lsbCBpZ25vcmUgdGhlbSkuPHA+Ci08YSBuYW1lPSJuMjAiPjwvYT48aDM+IElnbm9yaW5nIGNvbW1lbnRzPC9oMz4KLVRvIGlnbm9yZSB0aGUgY29tbWVudHMgaW4gYSBwYXJ0aWN1bGFyIHNlY3Rpb24sIHlvdSBjYW4gdXNlIHRoZSBgaWdub3JlJyBwYXJhbWV0ZXIuICBGb3IgZXhhbXBsZSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJXNlY3Rpb24gIk5vIENvbW1lbnRzIiwgaWdub3JlCi0lc2VjdGlvbiAiS2VlcCBDb21tZW50cyIsIGtlZXAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGA8dHQ+a2VlcDwvdHQ+JyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBkaXNhYmxlIHRoZSBlZmZlY3Qgb2YgYW4gaWdub3JlIHBhcmFtZXRlciAoaWYgc2V0IGJ5IGEgc2VjdGlvbidzIHBhcmVudCkuPHA+Ci08YSBuYW1lPSJuMjEiPjwvYT48aDM+IEMgSW5mb3JtYXRpb248L2gzPgotTm9ybWFsbHksIGVhY2ggZGVjbGFyYXRpb24gaW4gYSBmaWxlIHdpbGwgaGF2ZSBhIEMgaW5mb3JtYXRpb24gdGFnIGF0dGFjaGVkIHRvIGl0LiAgVGhpcyBpcyB1c3VhbGx5IGVuY2xvc2VkIGluIFsgXSBhbmQgY29udGFpbnMgdGhlIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24gYWxvbmcgd2l0aCBvdGhlciBpbmZvcm1hdGlvbi4gICBUaGlzIHRleHQgY2FuIGRpc2FibGVkIHVzaW5nIHRoZSBgbm9pbmZvJyBwYXJhbWV0ZXJzIGFuZCByZWVuYWJsZWQgdXNpbmcgdGhlIGBpbmZvJyBwYXJhbWV0ZXIuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXNlY3Rpb24gIk5vIEMgSW5mb3JtYXRpb24iLCBub2luZm8KLSVzZWN0aW9uICJQcmludCBDIEluZm9ybWF0aW9uIiwgaW5mbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNyI+PC9hPjxoMj4gQWRkaW5nIEFkZGl0aW9uYWwgVGV4dDwvaDI+Ci1BZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gdGV4dCBjYW4gYmUgYWRkZWQgdXNpbmcgdGhlIDx0dD4ldGV4dDwvdHQ+IGRpcmVjdGl2ZSBhcyBzaG93biA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+PHR0PiV0ZXh0ICV7Ci08L3R0PgotVGhpcyBpcyBzb21lIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiB0ZXh0LgotCi0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PiV0ZXh0PC90dD4gZGlyZWN0aXZlIGlzIHByaW1hcmlseSB1c2VkIHRvIGFkZCB0ZXh0IHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgcGFydGljdWxhciBkZWNsYXJhdGlvbi4gICBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50IHRvIHByb3ZpZGUgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIG9mIGEgbW9kdWxlIGJlZm9yZSBkZWZpbmluZyBhbGwgb2YgdGhlIGZ1bmN0aW9ucy4gICBBbnkgdGV4dCBjYW4gYmUgcGxhY2VkIGluc2lkZSB0aGUgPHR0PiV7LCV9PC90dD4gYmxvY2sgZXhjZXB0IGZvciBhIGA8dHQ+JX08L3R0PicgdGhhdCBlbmRzIHRoZSBibG9jay4gRm9yIHRoZSBwdXJwb3NlcyBvZiBzb3J0aW5nLCB0ZXh0IHNlZ21lbnRzIHdpbGwgYWx3YXlzIGFwcGVhciBpbW1lZGlhdGVseSBhZnRlciB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24uPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMj4gRGlzYWJsaW5nIGFsbCBkb2N1bWVudGF0aW9uPC9oMj4KLUFsbCBkb2N1bWVudGF0aW9uIGNhbiBiZSBzdXBwcmVzc2VkIGZvciBhIHBvcnRpb24gb2YgYW4gaW50ZXJmYWNlIGZpbGUgYnkgdXNpbmcgdGhlIDx0dD4lZGlzYWJsZWRvYzwvdHQ+IGFuZCA8dHQ+JWVuYWJsZWRvYyA8L3R0PmRpcmVjdGl2ZXMuICAgVGhlc2Ugd291bGQgYmUgdXNlZCBhcyBmb2xsb3dzOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVkaXNhYmxlZG9jCi0uLi4gQSBhIGJ1bmNoIG9mIGRlY2xhcmF0aW9ucyB3aXRoIG5vIGRvY3VtZW50YXRpb24gLi4uCi0lZW5hYmxlZG9jCi0uLi4gTm93IGRlY2xhcmF0aW9ucyBhcmUgZG9jdW1lbnRlZCBhZ2FpbiAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlc2UgZGlyZWN0aXZlcyBjYW4gYmUgc2FmZWx5IG5lc3RlZC4gIFRodXMsIHRoZSBvY2N1cnJlbmNlIG9mIHRoZXNlIGRpcmVjdGl2ZXMgaW5zaWRlIGEgPHR0PiVkaXNhYmxlZG9jIDwvdHQ+c2VjdGlvbiBoYXMgbm8gZWZmZWN0IChvbmx5IHRoZSBvdXRlci1tb3N0IG9jY3VycmVuY2UgaXMgaW1wb3J0YW50KS48cD4KLTxwPgotVGhlIHByaW1hcnkgdXNlIG9mIHRoZXNlIGRpcmVjdGl2ZXMgaXMgZm9yIGRpc2FibGluZyB0aGUgZG9jdW1lbnRhdGlvbiBvbiBjb21tb25seSB1c2VkIG1vZHVsZXMgdGhhdCB5b3UgbWlnaHQgdXNlIHJlcGVhdGVkbHkgKGJ1dCBkb24ndCB3YW50IGFueSBkb2N1bWVudGF0aW9uIGZvcikuICBGb3IgZXhhbXBsZSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJWRpc2FibGVkb2MKLSVpbmNsdWRlIHdpc2guaQotJWluY2x1ZGUgYXJyYXkuaQotJWluY2x1ZGUgdGltZXIuaQotJWVuYWJsZWRvYwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBBbiBFeGFtcGxlPC9oMj4KLVRvIGlsbHVzdHJhdGUgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGluIGFjdGlvbiwgaGVyZSBpcyBzb21lIGNvZGUgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGZpbGUgYGFycmF5LmknLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vCi0vLyBhcnJheS5pCi0vLyBUaGlzIFNXSUcgbGlicmFyeSBmaWxlIHByb3ZpZGVzIGFjY2VzcyB0byBDIGFycmF5cy4KLQotJW1vZHVsZSBjYXJyYXkKLQotJXNlY3Rpb24gIlNXSUcgQyBBcnJheSBNb2R1bGUiLGluZm8sYWZ0ZXIscHJlLG5vc29ydCxza2lwPTEsY2hvcF9sZWZ0PTMsCi1jaG9wX3JpZ2h0PTAsY2hvcF90b3A9MCxjaG9wX2JvdHRvbT0wCi0KLSV0ZXh0ICV7Ci0laW5jbHVkZSBhcnJheS5pCi0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIHNjcmlwdGluZyBsYW5ndWFnZSBhY2Nlc3MgdG8gdmFyaW91cyBraW5kcyBvZiBDL0MrKwotYXJyYXlzLiBGb3IgZWFjaCBkYXRhdHlwZSwgYSBjb2xsZWN0aW9uIG9mIGZvdXIgZnVuY3Rpb25zIGFyZSBjcmVhdGVkIDoKLQotICAgJmx0O3R5cGUmZ3Q7X2FycmF5KHNpemUpICAgICAgICAgICAgICA6IENyZWF0ZSBhIG5ldyBhcnJheSBvZiBnaXZlbiBzaXplCi0gICAmbHQ7dHlwZSZndDtfZ2V0KGFycmF5LCBpbmRleCkgICAgICAgIDogR2V0IGFuIGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkKLSAgICZsdDt0eXBlJmd0O19zZXQoYXJyYXksIGluZGV4LCB2YWx1ZSkgOiBTZXQgYW4gZWxlbWVudCBpbiB0aGUgYXJyYXkKLSAgICZsdDt0eXBlJmd0O19kZXN0cm95KGFycmF5KSAgICAgICAgICAgOiBEZXN0cm95IGFuIGFycmF5Ci0KLVRoZSBmdW5jdGlvbnMgaW4gdGhpcyBsaWJyYXJ5IGFyZSBvbmx5IGxvdy1sZXZlbCBhY2Nlc3NvciBmdW5jdGlvbnMKLWRlc2lnbmVkIHRvIGRpcmVjdGx5IGFjY2VzcyBDIGFycmF5cy4gIExpa2UgQywgbm8gYm91bmRzIGNoZWNraW5nIGlzCi1wZXJmb3JtZWQgc28gdXNlIGF0IHlvdXIgb3duIHBlcmlsLgotJX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEludGVnZXIgYXJyYXkgc3VwcG9ydAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotJXN1YnNlY3Rpb24gIkludGVnZXIgQXJyYXlzIgotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcHJvdmlkZSBhY2Nlc3MgdG8gaW50ZWdlciBhcnJheXMgKG1hcHBlZAotICAgb250byB0aGUgQyAnaW50JyBkYXRhdHlwZS4gKi8KLQotJXsKLQkuLi4gU3VwcG9ydGluZyBDIGNvZGUgLi4uCi0lfQotaW50ICppbnRfYXJyYXkoaW50IG5pdGVtcyk7Ci0vKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9mIGludGVnZXJzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICBUaGUgYXJyYXkgaXMgY3JlYXRlZCB1c2luZyBtYWxsb2MoKSBpbiBDIGFuZCBuZXcoKSBpbiBDKysuICovCi0KLXZvaWQgaW50X2Rlc3Ryb3koaW50ICphcnJheSk7Ci0vKiBEZXN0cm95cyB0aGUgZ2l2ZW4gYXJyYXkuICovCi0KLWludCBpbnRfZ2V0KGludCAqYXJyYXksIGludCBpbmRleCk7Ci0vKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhcnJheVtpbmRleF0uICovCi0KLWludCBpbnRfc2V0KGludCAqYXJyYXksIGludCBpbmRleCwgaW50IHZhbHVlKTsKLS8qIFNldHMgYXJyYXlbaW5kZXhdID0gdmFsdWUuICBSZXR1cm5zIHZhbHVlLiAqLwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmxvYXRpbmcgcG9pbnQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSVzdWJzZWN0aW9uICJGbG9hdGluZyBQb2ludCBBcnJheXMiCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBwcm92aWRlIGFjY2VzcyB0byBhcnJheXMgb2YgZmxvYXRzIGFuZCBkb3VibGVzLiAqLwotCi0lewotCS4uIFN1cHBvcnRpbmcgQyBjb2RlIC4uLgotJX0KLWRvdWJsZSAqZG91YmxlX2FycmF5KGludCBuaXRlbXMpOwotLyogQ3JlYXRlcyBhIG5ldyBhcnJheSBvZiBkb3VibGVzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICBUaGUgYXJyYXkgaXMgY3JlYXRlZCB1c2luZyBtYWxsb2MoKSBpbiBDIGFuZCBuZXcoKSBpbiBDKysuICovCi0KLXZvaWQgZG91YmxlX2Rlc3Ryb3koZG91YmxlICphcnJheSk7Ci0vKiBEZXN0cm95cyB0aGUgZ2l2ZW4gYXJyYXkuICovCi0KLWRvdWJsZSBkb3VibGVfZ2V0KGRvdWJsZSAqYXJyYXksIGludCBpbmRleCk7Ci0vKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhcnJheVtpbmRleF0uICovCi0KLWRvdWJsZSBkb3VibGVfc2V0KGRvdWJsZSAqYXJyYXksIGludCBpbmRleCwgZG91YmxlIHZhbHVlKTsKLS8qIFNldHMgYXJyYXlbaW5kZXhdID0gdmFsdWUuICBSZXR1cm5zIHZhbHVlLiAqLwotCi1mbG9hdCAqZmxvYXRfYXJyYXkoaW50IG5pdGVtcyk7Ci0vKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9mIGZsb2F0cy4gbml0ZW1zIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgotICAgVGhlIGFycmF5IGlzIGNyZWF0ZWQgdXNpbmcgbWFsbG9jKCkgaW4gQyBhbmQgbmV3KCkgaW4gQysrLiAqLwotCi12b2lkIGZsb2F0X2Rlc3Ryb3koZmxvYXQgKmFycmF5KTsKLS8qIERlc3Ryb3lzIHRoZSBnaXZlbiBhcnJheS4gKi8KLQotZmxvYXQgZmxvYXRfZ2V0KGZsb2F0ICphcnJheSwgaW50IGluZGV4KTsKLS8qIFJldHVybnMgdGhlIHZhbHVlIG9mIGFycmF5W2luZGV4XS4gKi8KLQotZmxvYXQgZmxvYXRfc2V0KGZsb2F0ICphcnJheSwgaW50IGluZGV4LCBmbG9hdCB2YWx1ZSk7Ci0vKiBTZXRzIGFycmF5W2luZGV4XSA9IHZhbHVlLiAgUmV0dXJucyB2YWx1ZS4gKi8KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENoYXJhY3RlciBzdHJpbmdzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0lc3Vic2VjdGlvbiAiU3RyaW5nIEFycmF5cyIKLQotJXRleHQgJXsKLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlICdjaGFyICoqJyBkYXRhdHlwZS4gICBUaGlzCi1pcyBwcmltYXJpbHkgdXNlZCB0byBoYW5kbGUgYXJndW1lbnQgbGlzdHMgYW5kIG90aGVyIHNpbWlsYXIgc3RydWN0dXJlcyB0aGF0Ci1uZWVkIHRvIGJlIHBhc3NlZCB0byBhIEMvQysrIGZ1bmN0aW9uLgotJX0KLQotI2lmIGRlZmluZWQoU1dJR1RDTCkKLSV0ZXh0ICV7Ci1UbyBjb252ZXJ0IGZyb20gYSBUY2wgbGlzdCBpbnRvIGEgJ2NoYXIgKionLCB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQgOgotCi0gICAgICMgJGxpc3QgaXMgYSBsaXN0Ci0gICAgIHNldCBhcmdzIFtzdHJpbmdfYXJyYXkgZXhwciB7W2xsZW5ndGggJGxpc3RdICsgMX1dCi0gICAgIHNldCBpIDAKLSAgICAgZm9yZWFjaCBhICRsaXN0IHsKLSAgICAgICAgc3RyaW5nX3NldCAkYXJncyAkaSAkYQotICAgICAgICBpbmNyIGkgMQotICAgICB9Ci0gICAgIHN0cmluZ19zZXQgJGkgIiIKLSAgICAgIyAkYXJncyBpcyBub3cgYSBjaGFyICoqIHR5cGUKLSV9Ci0jZWxpZiBkZWZpbmVkKFNXSUdQRVJMKQotCi0ldGV4dCAlewotVG8gY29udmVydCBmcm9tIGEgUGVybCBsaXN0IGludG8gYSAnY2hhciAqKicsIGNvZGUgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nCi1jYW4gYmUgdXNlZCA6Ci0KLSAgICAjIEBsaXN0IGlzIGEgbGlzdAotICAgIG15ICRsID0gc2NhbGFyKEBsaXN0KTsKLSAgICBteSAkYXJncyA9IHN0cmluZ19hcnJheSgkbCsxKTsKLSAgICBteSAkaSA9IDA7Ci0gICAgZm9yZWFjaCAkYXJnIChAbGlzdCkgewotICAgICAgICBzdHJpbmdfc2V0KCRhcmdzLCRpLCRhcmcpOwotICAgICAgICAkaSsrOwotICAgIH0gICAKLSAgICBzdHJpbmdfc2V0KCRhcmdzLCRpLCIiKTsKLQotKG9mIGNvdXJzZSwgdGhlcmUgaXMgYWx3YXlzIG1vcmUgdGhhbiBvbmUgd2F5IHRvIGRvIGl0KQotJX0KLSNlbGlmIGRlZmluZWQoU1dJR1BZVEhPTikKLQotJXRleHQgJXsKLVRvIGNvbnZlcnQgZnJvbSBhIFB5dGhvbiBsaXN0IHRvIGEgJ2NoYXIgKionLCBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZwotY2FuIGJlIHVzZWQgOgotCi0gICAgIyAnbGlzdCcgaXMgYSBsaXN0Ci0gICAgYXJncyA9IHN0cmluZ19hcnJheShsZW4obGlzdCkrMSkKLSAgICBmb3IgaSBpbiByYW5nZSgwLGxlbihsaXN0KSk6Ci0Jc3RyaW5nX3NldChhcmdzLGksbGlzdFtpXSkKLSAgICBzdHJpbmdfc2V0KGFyZ3MsbGVuKGxpc3QpLCIiKQotJX0KLQotI2VuZGlmCi0KLSV7Ci0JLi4uIFN1cHBvcnRpbmcgQyBjb2RlIC4uLgotJX0KLWNoYXIgKipzdHJpbmdfYXJyYXkoaW50IG5pdGVtcyk7Ci0vKiBDcmVhdGVzIGEgbmV3IGFycmF5IG9mIHN0cmluZ3MuIG5pdGVtcyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KLSAgIFRoZSBhcnJheSBpcyBjcmVhdGVkIHVzaW5nIG1hbGxvYygpIGluIEMgYW5kIG5ldygpIGluIEMrKy4gRWFjaCBlbGVtZW50Ci0gICBvZiB0aGUgYXJyYXkgaXMgc2V0IHRvIE5VTEwgdXBvbiBpbml0aWFsaXphdGlvbi4gKi8KLQotdm9pZCBzdHJpbmdfZGVzdHJveShjaGFyICphcnJheSk7Ci0vKiBEZXN0cm95cyB0aGUgZ2l2ZW4gYXJyYXkuIEVhY2ggZWxlbWVudCBvZiB0aGUgYXJyYXkgaXMgYXNzdW1lZCB0byBiZQotICAgYSBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nIGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpIG9yIG5ldygpLiAgQWxsIG9mCi0gICB0aGVzZSBzdHJpbmdzIHdpbGwgYmUgZGVzdHJveWVkIGFzIHdlbGwuIChJdCBpcyBwcm9iYWJseSBvbmx5IHNhZmUgdG8KLSAgIHVzZSB0aGlzIGZ1bmN0aW9uIG9uIGFuIGFycmF5IGNyZWF0ZWQgYnkgc3RyaW5nX2FycmF5KSAqLwotCi1jaGFyICpzdHJpbmdfZ2V0KGNoYXIgKiphcnJheSwgaW50IGluZGV4KTsKLS8qIFJldHVybnMgdGhlIHZhbHVlIG9mIGFycmF5W2luZGV4XS4gUmV0dXJucyBhIHN0cmluZyBvZiB6ZXJvIGxlbmd0aAotICAgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpcyBOVUxMLiAqLwotCi1jaGFyICpzdHJpbmdfc2V0KGNoYXIgKiphcnJheSwgaW50IGluZGV4LCBjaGFyICp2YWx1ZSk7Ci0vKiBTZXRzIGFycmF5W2luZGV4XSA9IHZhbHVlLiAgdmFsdWUgaXMgYXNzdW1lZCB0byBiZSBhIE5VTEwtdGVybWluYXRlZAotICAgc3RyaW5nLiAgQSBzdHJpbmcgb2YgemVybyBsZW5ndGggaXMgbWFwcGVkIGludG8gYSBOVUxMIHZhbHVlLiAgV2hlbgotICAgc2V0dGluZyB0aGUgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIGNvcGllZCBpbnRvIGEgbmV3IHN0cmluZyBhbGxvY2F0ZWQKLSAgIHdpdGggbWFsbG9jKCkgb3IgbmV3KCkuICBBbnkgcHJldmlvdXMgdmFsdWUgaW4gdGhlIGFycmF5IHdpbGwgYmUKLSAgIGRlc3Ryb3llZC4gKi8KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSW4gdGhpcyBmaWxlLCBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBhcmUgcGxhY2VkIGludG8gYSBuZXcgc2VjdGlvbi4gIFdlIHNwZWNpZnkgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBmb3Igb3VyIHNlY3Rpb24uICBTaW5jZSB0aGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIGxpYnJhcnkgZmlsZSwgd2UgaGF2ZSBubyBpZGVhIHdoYXQgZm9ybWF0dGluZyBvdXIgcGFyZW50IG1pZ2h0IGJlIHVzaW5nIHNvIGFuIGV4cGxpY2l0IGRlY2xhcmF0aW9uIG1ha2VzIHN1cmUgd2UgZ2V0IGl0IHJpZ2h0LiBFYWNoIGNvbW1lbnQgY29udGFpbnMgcHJlZm9ybWF0dGVkIHRleHQgZGVzY3JpYmluZyBlYWNoIGZ1bmN0aW9uLiAgIEZpbmFsbHksIGluIHRoZSBjYXNlIG9mIHRoZSBzdHJpbmcgZnVuY3Rpb25zLCB3ZSBhcmUgdXNpbmcgYSBjb21iaW5hdGlvbiBvZiBjb25kaXRpb25hbCBjb21waWxhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gZGlyZWN0aXZlcyB0byBwcm9kdWNlIGxhbmd1YWdlLXNwZWNpZmljIGRvY3VtZW50YXRpb24uICAgSW4gdGhpcyBjYXNlLCB0aGUgZG9jdW1lbnRhdGlvbiBjb250YWlucyBhIHVzYWdlIGV4YW1wbGUgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuPHA+Ci08cD4KLVdoZW4gcHJvY2Vzc2VkIHRocm91Z2ggdGhlIEFTQ0lJIG1vZHVsZSwgdGhpcyBmaWxlIHdpbGwgcHJvZHVjZSBkb2N1bWVudGF0aW9uIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ny4gIFNXSUcgQyBBcnJheSBNb2R1bGUKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSVpbmNsdWRlIGFycmF5LmkKLQotVGhpcyBtb2R1bGUgcHJvdmlkZXMgc2NyaXB0aW5nIGxhbmd1YWdlIGFjY2VzcyB0byB2YXJpb3VzIGtpbmRzIG9mIEMvQysrCi1hcnJheXMuIEZvciBlYWNoIGRhdGF0eXBlLCBhIGNvbGxlY3Rpb24gb2YgZm91ciBmdW5jdGlvbnMgYXJlIGNyZWF0ZWQgOgotCi0gICAmbHQ7dHlwZSZndDtfYXJyYXkoc2l6ZSkgICAgICAgICAgICAgIDogQ3JlYXRlIGEgbmV3IGFycmF5IG9mIGdpdmVuIHNpemUKLSAgICZsdDt0eXBlJmd0O19nZXQoYXJyYXksIGluZGV4KSAgICAgICAgOiBHZXQgYW4gZWxlbWVudCBmcm9tIHRoZSBhcnJheQotICAgJmx0O3R5cGUmZ3Q7X3NldChhcnJheSwgaW5kZXgsIHZhbHVlKSA6IFNldCBhbiBlbGVtZW50IGluIHRoZSBhcnJheQotICAgJmx0O3R5cGUmZ3Q7X2Rlc3Ryb3koYXJyYXkpICAgICAgICAgICA6IERlc3Ryb3kgYW4gYXJyYXkKLQotVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGxpYnJhcnkgYXJlIG9ubHkgbG93LWxldmVsIGFjY2Vzc29yIGZ1bmN0aW9ucwotZGVzaWduZWQgdG8gZGlyZWN0bHkgYWNjZXNzIEMgYXJyYXlzLiAgTGlrZSBDLCBubyBib3VuZHMgY2hlY2tpbmcgaXMKLXBlcmZvcm1lZCBzbyB1c2UgYXQgeW91ciBvd24gcGVyaWwuCi0KLTcuMS4gIEludGVnZXIgQXJyYXlzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcHJvdmlkZSBhY2Nlc3MgdG8gaW50ZWdlciBhcnJheXMgKG1hcHBlZAotb250byB0aGUgQyAnaW50JyBkYXRhdHlwZS4gICAKLQotCi1pbnRfYXJyYXkobml0ZW1zKQotICAgICAgICBbIHJldHVybnMgaW50ICogXQotICAgICAgICBDcmVhdGVzIGEgbmV3IGFycmF5IG9mIGludGVnZXJzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICAgICAgIFRoZSBhcnJheSBpcyBjcmVhdGVkIHVzaW5nIG1hbGxvYygpIGluIEMgYW5kIG5ldygpIGluIEMrKy4gICAKLSAgICAgICAgCi1pbnRfZGVzdHJveShhcnJheSkKLSAgICAgICAgWyByZXR1cm5zIHZvaWQgIF0KLSAgICAgICAgRGVzdHJveXMgdGhlIGdpdmVuIGFycmF5LiAgIAotICAgICAgICAKLWludF9nZXQoYXJyYXksaW5kZXgpCi0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLSAgICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYXJyYXlbaW5kZXhdLiAgIAotICAgICAgICAKLWludF9zZXQoYXJyYXksaW5kZXgsdmFsdWUpCi0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLSAgICAgICAgU2V0cyBhcnJheVtpbmRleF0gPSB2YWx1ZS4gIFJldHVybnMgdmFsdWUuICAgCi0gICAgICAgIAotNy4yLiAgRmxvYXRpbmcgUG9pbnQgQXJyYXlzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgYWNjZXNzIHRvIGFycmF5cyBvZiBmbG9hdHMgYW5kIGRvdWJsZXMuICAgCi0KLQotZG91YmxlX2FycmF5KG5pdGVtcykKLSAgICAgICAgWyByZXR1cm5zIGRvdWJsZSAqIF0KLSAgICAgICAgQ3JlYXRlcyBhIG5ldyBhcnJheSBvZiBkb3VibGVzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICAgICAgIFRoZSBhcnJheSBpcyBjcmVhdGVkIHVzaW5nIG1hbGxvYygpIGluIEMgYW5kIG5ldygpIGluIEMrKy4gICAKLSAgICAgICAgCi1kb3VibGVfZGVzdHJveShhcnJheSkKLSAgICAgICAgWyByZXR1cm5zIHZvaWQgIF0KLSAgICAgICAgRGVzdHJveXMgdGhlIGdpdmVuIGFycmF5LiAgIAotICAgICAgICAKLWRvdWJsZV9nZXQoYXJyYXksaW5kZXgpCi0gICAgICAgIFsgcmV0dXJucyBkb3VibGUgIF0KLSAgICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYXJyYXlbaW5kZXhdLiAgIAotICAgICAgICAKLWRvdWJsZV9zZXQoYXJyYXksaW5kZXgsdmFsdWUpCi0gICAgICAgIFsgcmV0dXJucyBkb3VibGUgIF0KLSAgICAgICAgU2V0cyBhcnJheVtpbmRleF0gPSB2YWx1ZS4gIFJldHVybnMgdmFsdWUuICAgCi0gICAgICAgIAotZmxvYXRfYXJyYXkobml0ZW1zKQotICAgICAgICBbIHJldHVybnMgZmxvYXQgKiBdCi0gICAgICAgIENyZWF0ZXMgYSBuZXcgYXJyYXkgb2YgZmxvYXRzLiBuaXRlbXMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCi0gICAgICAgIFRoZSBhcnJheSBpcyBjcmVhdGVkIHVzaW5nIG1hbGxvYygpIGluIEMgYW5kIG5ldygpIGluIEMrKy4gICAKLSAgICAgICAgCi1mbG9hdF9kZXN0cm95KGFycmF5KQotICAgICAgICBbIHJldHVybnMgdm9pZCAgXQotICAgICAgICBEZXN0cm95cyB0aGUgZ2l2ZW4gYXJyYXkuICAgCi0gICAgICAgIAotZmxvYXRfZ2V0KGFycmF5LGluZGV4KQotICAgICAgICBbIHJldHVybnMgZmxvYXQgIF0KLSAgICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYXJyYXlbaW5kZXhdLiAgIAotICAgICAgICAKLWZsb2F0X3NldChhcnJheSxpbmRleCx2YWx1ZSkKLSAgICAgICAgWyByZXR1cm5zIGZsb2F0ICBdCi0gICAgICAgIFNldHMgYXJyYXlbaW5kZXhdID0gdmFsdWUuICBSZXR1cm5zIHZhbHVlLiAgIAotICAgICAgICAKLTcuMy4gIFN0cmluZyBBcnJheXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgJ2NoYXIgKionIGRhdGF0eXBlLiAgIFRoaXMKLWlzIHByaW1hcmlseSB1c2VkIHRvIGhhbmRsZSBhcmd1bWVudCBsaXN0cyBhbmQgb3RoZXIgc2ltaWxhciBzdHJ1Y3R1cmVzIHRoYXQKLW5lZWQgdG8gYmUgcGFzc2VkIHRvIGEgQy9DKysgZnVuY3Rpb24uCi0KLVRvIGNvbnZlcnQgZnJvbSBhIFB5dGhvbiBsaXN0IHRvIGEgJ2NoYXIgKionLCBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZwotY2FuIGJlIHVzZWQgOgotCi0gICAgIyAnbGlzdCcgaXMgYSBsaXN0Ci0gICAgYXJncyA9IHN0cmluZ19hcnJheShsZW4obGlzdCkrMSkKLSAgICBmb3IgaSBpbiByYW5nZSgwLGxlbihsaXN0KSk6Ci0Jc3RyaW5nX3NldChhcmdzLGksbGlzdFtpXSkKLSAgICBzdHJpbmdfc2V0KGFyZ3MsbGVuKGxpc3QpLCIiKQotCi1zdHJpbmdfYXJyYXkobml0ZW1zKQotICAgICAgICBbIHJldHVybnMgY2hhciAqKiBdCi0gICAgICAgIENyZWF0ZXMgYSBuZXcgYXJyYXkgb2Ygc3RyaW5ncy4gbml0ZW1zIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLgotICAgICAgICBUaGUgYXJyYXkgaXMgY3JlYXRlZCB1c2luZyBtYWxsb2MoKSBpbiBDIGFuZCBuZXcoKSBpbiBDKysuIEVhY2ggZWxlbWVudAotICAgICAgICBvZiB0aGUgYXJyYXkgaXMgc2V0IHRvIE5VTEwgdXBvbiBpbml0aWFsaXphdGlvbi4gICAKLSAgICAgICAgCi1zdHJpbmdfZGVzdHJveShhcnJheSkKLSAgICAgICAgWyByZXR1cm5zIHZvaWQgIF0KLSAgICAgICAgRGVzdHJveXMgdGhlIGdpdmVuIGFycmF5LiBFYWNoIGVsZW1lbnQgb2YgdGhlIGFycmF5IGlzIGFzc3VtZWQgdG8gYmUKLSAgICAgICAgYSBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nIGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpIG9yIG5ldygpLiAgQWxsIG9mCi0gICAgICAgIHRoZXNlIHN0cmluZ3Mgd2lsbCBiZSBkZXN0cm95ZWQgYXMgd2VsbC4gKEl0IGlzIHByb2JhYmx5IG9ubHkgc2FmZSB0bwotICAgICAgICB1c2UgdGhpcyBmdW5jdGlvbiBvbiBhbiBhcnJheSBjcmVhdGVkIGJ5IHN0cmluZ19hcnJheSkgICAKLSAgICAgICAgCi1zdHJpbmdfZ2V0KGFycmF5LGluZGV4KQotICAgICAgICBbIHJldHVybnMgY2hhciAqIF0KLSAgICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYXJyYXlbaW5kZXhdLiBSZXR1cm5zIGEgc3RyaW5nIG9mIHplcm8gbGVuZ3RoCi0gICAgICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaXMgTlVMTC4gICAKLSAgICAgICAgCi1zdHJpbmdfc2V0KGFycmF5LGluZGV4LHZhbHVlKQotICAgICAgICBbIHJldHVybnMgY2hhciAqIF0KLSAgICAgICAgU2V0cyBhcnJheVtpbmRleF0gPSB2YWx1ZS4gIHZhbHVlIGlzIGFzc3VtZWQgdG8gYmUgYSBOVUxMLXRlcm1pbmF0ZWQKLSAgICAgICAgc3RyaW5nLiAgQSBzdHJpbmcgb2YgemVybyBsZW5ndGggaXMgbWFwcGVkIGludG8gYSBOVUxMIHZhbHVlLiAgV2hlbgotICAgICAgICBzZXR0aW5nIHRoZSB2YWx1ZSwgdGhlIHZhbHVlIHdpbGwgYmUgY29waWVkIGludG8gYSBuZXcgc3RyaW5nIGFsbG9jYXRlZAotICAgICAgICB3aXRoIG1hbGxvYygpIG9yIG5ldygpLiAgQW55IHByZXZpb3VzIHZhbHVlIGluIHRoZSBhcnJheSB3aWxsIGJlCi0gICAgICAgIGRlc3Ryb3llZC4gICAKLSAgICAgICAgCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTAiPjwvYT48aDI+IEFTQ0lJIERvY3VtZW50YXRpb248L2gyPgotVGhlIEFTQ0lJIG1vZHVsZSBwcm9kdWNlcyBkb2N1bWVudGF0aW9uIGluIHBsYWludGV4dCBhcyBzaG93biBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZS4gIFR3byBmb3JtYXR0aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSAoZGVmYXVsdCB2YWx1ZXMgc2hvd24pIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5hc2NpaV9pbmRlbnQgPSA4Ci1hc2NpaV9jb2x1bW5zID0gNzAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotYDx0dD5hc2NpaV9pbmRlbnQ8L3R0Picgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbmRlbnQgZWFjaCBmdW5jdGlvbiBkZXNjcmlwdGlvbi4gICBgPHR0PmFzY2lpX2NvbHVtbnM8L3R0Picgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgb3V0cHV0IHdoZW4gcmVmb3JtYXR0aW5nIHRleHQuPHA+Ci08cD4KLVdoZW4gcmVmb3JtYXR0aW5nIHRleHQsIGFsbCBleHRyYW5lb3VzIHdoaXRlLXNwYWNlIGlzIHN0cmlwcGVkIGFuZCB0ZXh0IGlzIGZpbGxlZCB0byBmaXQgaW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29sdW1ucy4gICBUaGUgb3V0cHV0IHRleHQgd2lsbCBiZSBsZWZ0LWp1c3RpZmllZC4gICAgQSBzaW5nbGUgbmV3bGluZSBpcyBpZ25vcmVkLCBidXQgbXVsdGlwbGUgbmV3bGluZXMgY2FuIGJlIHVzZWQgdG8gc3RhcnQgYSBuZXcgcGFyYWdyYXBoLiAgIFRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgYFxcJyBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIG5ld2xpbmUuPHA+Ci08cD4KLVByZWZvcm1hdHRlZCB0ZXh0IGlzIHByaW50ZWQgaW50byB0aGUgcmVzdWx0aW5nIG91dHB1dCB1bm1vZGlmaWVkIGFsdGhvdWdoIGl0IG1heSBiZSBpbmRlbnRlZCB3aGVuIHVzZWQgYXMgcGFydCBvZiBhIGZ1bmN0aW9uIGRlc2NyaXB0aW9uLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgyPiBIVE1MIERvY3VtZW50YXRpb248L2gyPgotVGhlIEhUTUwgbW9kdWxlIHByb2R1Y2VzIGRvY3VtZW50YXRpb24gaW4gSFRNTCBmb3JtYXQgKHdobyB3b3VsZCBoYXZlIGd1ZXNzZWQ/KS4gIEhvd2V2ZXIsIGEgbnVtYmVyIG9mIHN0eWxlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSAgKHNob3duIHdpdGggZGVmYXVsdCB2YWx1ZXMpPHA+Ci08YmxvY2txdW90ZT48cHJlPgotaHRtbF90aXRsZSA9ICImbHQ7SDEmZ3Q7OiZsdDsvSDEmZ3Q7IgotaHRtbF9jb250ZW50cyA9ICImbHQ7SDEmZ3Q7OiZsdDsvSDEmZ3Q7IgotaHRtbF9zZWN0aW9uID0gIiZsdDtIUiZndDsmbHQ7SDImZ3Q7OiZsdDsvSDImZ3Q7IgotaHRtbF9zdWJzZWN0aW9uID0gIiZsdDtIMyZndDs6Jmx0Oy9IMyZndDsiCi1odG1sX3N1YnN1YnNlY3Rpb24gPSAiJmx0O0g0Jmd0OzombHQ7L0g0Jmd0OyIKLWh0bWxfdXNhZ2UgPSAiJmx0O0ImZ3Q7Jmx0O1RUJmd0OzombHQ7L1RUJmd0OyZsdDsvQiZndDsiCi1odG1sX2Rlc2NyaXAgPSAiJmx0O0JMT0NLUVVPVEUmZ3Q7OiZsdDsvQkxPQ0tRVU9URSZndDsiCi1odG1sX3RleHQgPSAiJmx0O1AmZ3Q7IgotaHRtbF9jaW5mbyA9ICIiCi1odG1sX3ByZWZvcm1hdCA9ICImbHQ7UFJFJmd0OzombHQ7L1BSRSZndDsiCi1odG1sX2JvZHkgPSAiJmx0O0JPRFkgYmdfY29sb3I9XCIjZmZmZmZmXCImZ3Q7OiZsdDsvQk9EWSZndDsiCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUFueSBvZiB0aGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSBjaGFuZ2VkLCBieSBzaW1wbHkgc3BlY2lmeWluZyB0aGVtIGFmdGVyIGEgPHR0PiV0aXRsZTwvdHQ+IG9yIDx0dD4lc2VjdGlvbjwvdHQ+IGRpcmVjdGl2ZS4gIEhvd2V2ZXIsIHRoZSBlZmZlY3RzIGFyZSBhcHBsaWVkIGdsb2JhbGx5IHNvIGl0IHByb2JhYmx5IG1ha2VzIHNlbnNlIHRvIHVzZSB0aGUgPHR0PiVzdHlsZTwvdHQ+IGRpcmVjdGl2ZSBpbnN0ZWFkLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVzdHlsZSBodG1sX2NvbnRlbnRzPSImbHQ7SFImZ3Q7Jmx0O0gxJmd0OzombHQ7L0gxJmd0OyIKLS4uLiBSZXN0IG9mIGRlY2xhcmF0aW9ucyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRWFjaCB0YWcgdXNlcyBhICI6IiB0byBzZXBhcmF0ZSB0aGUgc3RhcnQgYW5kIGVuZCB0YWdzLiAgIEFueSB0ZXh0IHdpbGwgYmUgaW5zZXJ0ZWQgaW4gcGxhY2Ugb2YgdGhlICI6Ii4gIFNpbmNlIHN0cmluZ3MgYXJlIHNwZWNpZmllZCBpbiBTV0lHIHVzaW5nIHF1b3RlcywgYW55IHF1b3RlcyB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW50byBhIHRhZyBzaG91bGQgYmUgZXNjYXBlZCB1c2luZyB0aGUgIlwiIGNoYXJhY3Rlci48cD4KLTxwPgotU2FtcGxlIEhUTUwgb3V0cHV0IGlzIHNob3duIGJlbG93IDo8cD4KLTxwPjxhIGhyZWY9ImNoNS4yLnBuZyI+U2FtcGxlIFNjcmVlbnNob3QgMSA8L2E+PHA+Ci08cD4KLTxwPgotU2luY2Ugb3VyIGV4YW1wbGUgdXNlZCBwcmVmb3JtYXR0ZWQgdGV4dCwgdGhlIG91dHB1dCBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIEFTQ0lJIG1vZHVsZS4gIEhvd2V2ZXIsIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQgbW9kZSwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IEhUTUwgbWFya3VwIGRpcmVjdGx5IGludG8geW91ciBDIGNvbW1lbnRzIGZvciBhIG1vcmUgcGVyc29uYWxpemVkIGRvY3VtZW50LjxwPgotPHA+Ci1Gb3IgbmF2aWdhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50LCBTV0lHIGFsc28gcHJvZHVjZXMgYSB0YWJsZSBvZiBjb250ZW50cyB3aXRoIGxpbmtzIHRvIGVhY2ggc2VjdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50LiAgV2l0aCBhIGxhcmdlIGludGVyZmFjZSwgdGhlIGNvbnRlbnRzIG1heSBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMgOjxwPgotPHA+PGEgaHJlZj0iY2g1LjMucG5nIj5TYW1wbGUgU2NyZWVuc2hvdCAyIDwvYT48cD4KLTxwPgotPHA+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDI+IExhVGVYIERvY3VtZW50YXRpb248L2gyPgotVGhlIExhVGVYIG1vZHVsZSBvcGVyYXRlcyBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIHRoZSBIVE1MIG1vZHVsZS4gIFRoZSBmb2xsb3dpbmcgc3R5bGUgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlIChzb21lIGtub3dsZWRnZSBvZiBMYVRlWCBpcyBhc3N1bWVkKS48cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1sYXRleF9wYXJpbmRlbnQgPSAiMC4waW4iCi1sYXRleF90ZXh0d2lkdGggPSAiNi41aW4iCi1sYXRleF9kb2N1bWVudHN0eWxlID0gIlsxMXB0XXthcnRpY2xlfSIKLWxhdGV4X29kZHNpZGVtYXJnaW4gPSAiMC4waW4iCi1sYXRleF9wYWdlc3R5bGUgPSAiXFxwYWdlc3R5bGV7aGVhZGluZ3N9IgotbGF0ZXhfdGl0bGUgPSAie1xcTGFyZ2UgXFxiZiA6fSBcXFxcXG4iCi1sYXRleF9wcmVmb3JtYXQgPSAie1xcc21hbGwgXFxiZWdpbnt2ZXJiYXRpbX06XFxlbmR7dmVyYmF0aW19fSIKLWxhdGV4X3VzYWdlID0gIntcXHR0IFxcYmYgOiB9IgotbGF0ZXhfZGVzY3JpcCA9ICJ7XFxcXFxuIFxcbWFrZWJveFswLjVpbl17fSBcYmVnaW57bWluaXBhZ2V9W3RdezZpbn0gOiBcbiAKLVxcZW5ke21pbmlwYWdlfSBcXFxcIjsKLWxhdGV4X3RleHQgPSAiOlxcXFwiCi1sYXRleF9jaW5mbyA9ICJ7XFx0dCA6IH0iCi1sYXRleF9zZWN0aW9uID0gIlxcc2VjdGlvbns6fSIKLWxhdGV4X3N1YnNlY3Rpb24gPSAiXFxzdWJzZWN0aW9uezp9IgotbGF0ZXhfc3Vic3Vic2VjdGlvbiA9ICJcXHN1YnN1YnNlY3Rpb257On0iCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBzdHlsZSBwYXJhbWV0ZXJzLCB3ZWxsLCBsb29rIGRvd25yaWdodCB1Z2x5LiAgIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBzdHJpbmdzIHVzZWQgYnkgU1dJRyBoYXZlIGVzY2FwZSBjb2RlcyBpbiB0aGVtIHNvIGl0J3MgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCB0aGUgYFwnIGNoYXJhY3RlciBhcyBgXFwnLiAgIFRodXMsIHdpdGhpbiBTV0lHIHlvdXIgY29kZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXN0eWxlIGxhdGV4X3NlY3Rpb249IlxcbmV3cGFnZSBcbiBcXHNlY3Rpb257On0iCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBkZWZhdWx0IHZhbHVlcyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgY3JlYXRpbmcgYSByZWFkYWJsZSBMYVRlWCBkb2N1bWVudCBpbiBhbnkgY2FzZSB5b3UgZG9uJ3Qgd2FudCB0byB3b3JyeSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBzdHlsZSBwYXJhbWV0ZXJzLjxwPgotPGEgbmFtZT0ibjEzIj48L2E+PGgyPiBDKysgU3VwcG9ydDwvaDI+Ci1DKysgY2xhc3NlcyBhcmUgZW5jYXBzdWxhdGVkIGluIGEgbmV3IHN1YnNlY3Rpb24gb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gIFRoaXMgc3Vic2VjdGlvbiBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgYWxsIG9mIHRoZSBtZW1iZXIgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuICBTaW5jZSBsYW5ndWFnZSBtb2R1bGVzIGFyZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIGRvY3VtZW50YXRpb24sIHRoZSB1c2Ugb2Ygc2hhZG93IGNsYXNzZXMgd2lsbCByZXN1bHQgaW4gZG9jdW1lbnRhdGlvbiBkZXNjcmliaW5nIHRoZSByZXN1bHRpbmcgc2hhZG93IGNsYXNzZXMsIG5vdCB0aGUgbG93ZXIgbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBjb2RlLjxwPgotPHA+Ci1XaGlsZSBpdCdzIG5vdCBlbnRpcmVseSBjbGVhciB0aGF0IHRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGRvY3VtZW50IEMrKyBjb2RlLCBpdCBpcyBhIHN0YXJ0IChhbmQgaXQncyBiZXR0ZXIgdGhhbiBubyBkb2N1bWVudGF0aW9uKS48cD4KLTxhIG5hbWU9Im4xNCI+PC9hPjxoMj4gVGhlIEZpbmFsIFdvcmQ/PC9oMj4KLUVhcmx5IHZlcnNpb25zIG9mIFNXSUcgdXNlZCBhIGZhaXJseSBwcmltaXRpdmUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0sIHRoYXQgY291bGQgYmVzdCBiZSBkZXNjcmliZWQgYXMgImJhcmVseSB1c2FibGUuIiAgVGhlIHN5c3RlbSBkZXNjcmliZWQgaGVyZSByZXByZXNlbnRzIGFuIGFsbW9zdCB0b3RhbCByZXdyaXRlIG9mIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFdoaWxlIGl0IGlzLCBieSBubyBtZWFucywgYSBwZXJmZWN0IHNvbHV0aW9uLCBJIHRoaW5rIGl0IGlzIGEgc3RlcCBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLiAgICAgVGhlIFNXSUcgbGlicmFyeSBpcyBub3cgZW50aXJlbHkgc2VsZi1kb2N1bWVudGluZyBhbmQgaXMgYSBnb29kIHNvdXJjZSBvZiBkb2N1bWVudGF0aW9uIGV4YW1wbGVzLiAgIEFzIGFsd2F5cyBzdWdnZXN0aW9ucyBhbmQgaW1wcm92ZW1lbnRzIGFyZSB3ZWxjb21lLjxwPgotPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjU1IDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0V4Y2VwdGlvbnMuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvRXhjZXB0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWU1NzViLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvRXhjZXB0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+RXhjZXB0aW9uIEhhbmRsaW5nPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT43IEV4Y2VwdGlvbiBIYW5kbGluZzwvaDE+PHA+PHVsPgotPGxpPiA8YSBocmVmPSIjbjEiPlRoZSAlZXhjZXB0IGRpcmVjdGl2ZTwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5IYW5kbGluZyBleGNlcHRpb25zIGluIEMgY29kZTwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5FeGNlcHRpb24gaGFuZGxpbmcgd2l0aCBsb25nam1wKCk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+SGFuZGxpbmcgQysrIGV4Y2VwdGlvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+RGVmaW5pbmcgZGlmZmVyZW50IGV4Y2VwdGlvbiBoYW5kbGVyczwvYT4KLTxsaT4gPGEgaHJlZj0iI242Ij5Vc2luZyBUaGUgU1dJRyBleGNlcHRpb24gbGlicmFyeTwvYT4KLTxsaT4gPGEgaHJlZj0iI243Ij5EZWJ1Z2dpbmcgYW5kIG90aGVyIGludGVyZXN0aW5nIHVzZXMgZm9yICVleGNlcHQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuOCI+TW9yZSBFeGFtcGxlczwvYT4KLTwvdWw+Ci0KLUluIHNvbWUgY2FzZXMsIGl0IGlzIGRlc2lyYWJsZSB0byBjYXRjaCBlcnJvcnMgdGhhdCBvY2N1ciBpbiBDIGZ1bmN0aW9ucyBhbmQgcHJvcGFnYXRlIHRoZW0gdXAgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UgKGllLiByYWlzZSBhbiBleGNlcHRpb24pLiBCeSBkZWZhdWx0LCBTV0lHIGRvZXMgbm90aGluZywgYnV0IHlvdSBjYW4gY3JlYXRlIGEgdXNlci1kZWZpbmFibGUgZXhjZXB0aW9uIGhhbmRsZXIgdXNpbmcgdGhlIDx0dD4lZXhjZXB0PC90dD4gZGlyZWN0aXZlLjxwPgotPGEgbmFtZT0ibjEiPjwvYT48aDI+IFRoZSAlZXhjZXB0IGRpcmVjdGl2ZTwvaDI+Ci1UaGUgPHR0PiVleGNlcHQ8L3R0PiBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBkZWZpbmUgYW4gZXhjZXB0aW9uIGhhbmRsZXIuIEl0IHdvcmtzIHNvbWV0aGluZyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQocHl0aG9uKSB7Ci0JdHJ5IHsKLQkkZnVuY3Rpb24KLQl9Ci0JY2F0Y2ggKFJhbmdlRXJyb3IpIHsKLQkgCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCJpbmRleCBvdXQtb2YtYm91bmRzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQXMgYW4gYXJndW1lbnQsIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIHRhcmdldCBsYW5ndWFnZS4gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBDL0MrKyBjb2RlIGlzIHRoZW4gZW5jbG9zZWQgaW4gYnJhY2VzLiBUaGUgc3ltYm9sIDx0dD4kZnVuY3Rpb24gPC90dD5pcyByZXBsYWNlZCB3aXRoIHRoZSByZWFsIEMvQysrIGZ1bmN0aW9uIGNhbGwgdGhhdCBTV0lHIHdvdWxkIGJlIG9yZGluYXJpbHkgbWFrZSBpbiB0aGUgd3JhcHBlciBjb2RlLiBUaGUgQyBjb2RlIHlvdSBzcGVjaWZ5IGluc2lkZSB0aGUgPHR0PiVleGNlcHQ8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIGFueXRoaW5nIHlvdSBsaWtlIGluY2x1ZGluZyBjdXN0b20gQyBjb2RlIGFuZCBDKysgZXhjZXB0aW9ucy48cD4KLTxwPgotVG8gZGVsZXRlIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLCBzaW1wbHkgdXNlIHRoZSA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZSB3aXRoIG5vIGNvZGUuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lZXhjZXB0KHB5dGhvbik7IAkJCQkvLyBEZWxldGVzIGFueSBwcmV2aW91c2x5IGRlZmluZWQgaGFuZGxlcgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1FeGNlcHRpb25zIGNhbiBiZSByZWRlZmluZWQgYXMgbmVjZXNzYXJ5LiBUaGUgc2NvcGUgb2YgYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgZnJvbSB0aGUgcG9pbnQgb2YgZGVmaW5pdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCB0aGUgZGVmaW5pdGlvbiBvZiBhIG5ldyBleGNlcHRpb24gaGFuZGxlciwgb3IgdW50aWwgdGhlIGhhbmRsZXIgaXMgZGVsZXRlZC48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBIYW5kbGluZyBleGNlcHRpb25zIGluIEMgY29kZTwvaDI+Ci1DIGhhcyBubyBmb3JtYWwgbWVjaGFuaXNtIGZvciBoYW5kbGluZyBleGNlcHRpb25zIHNvIHRoZXJlIGFyZSBtYW55IHBvc3NpYmlsaXRpZXMuIFRoZSBmaXJzdCBhcHByb2FjaCBpcyB0byBzaW1wbHkgcHJvdmlkZSBzb21lIGZ1bmN0aW9ucyBmb3Igc2V0dGluZyBhbmQgY2hlY2tpbmcgYW4gZXJyb3IgY29kZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotCi0vKiBGaWxlIDogZXhjZXB0LmMgKi8KLQotc3RhdGljIGNoYXIgZXJyb3JfbWVzc2FnZVsyNTZdOwotc3RhdGljIGludCBlcnJvcl9zdGF0dXMgPSAwOwotCi12b2lkIHRocm93X2V4Y2VwdGlvbihjaGFyICptc2cpIHsKLQlzdHJuY3B5KGVycm9yX21lc3NhZ2UsbXNnLDI1Nik7Ci0JZXJyb3Jfc3RhdHVzID0gMTsKLX0KLQotdm9pZCBjbGVhcl9leGNlcHRpb24oKSB7Ci0JZXJyb3Jfc3RhdHVzID0gMDsKLX0KLWNoYXIgKmNoZWNrX2V4Y2VwdGlvbigpIHsKLQlpZiAoZXJyb3Jfc3RhdHVzKSByZXR1cm4gZXJyb3JfbWVzc2FnZTsKLQllbHNlIHJldHVybiBOVUxMOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyB3b3JrLCBmdW5jdGlvbnMgd2lsbCBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCA8dHQ+dGhyb3dfZXhjZXB0aW9uKCk8L3R0PiB0byBpbmRpY2F0ZSBhbiBlcnJvciBvY2N1cnJlZC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRvdWJsZSBpbnYoZG91YmxlIHgpIHsKLQlpZiAoeCAhPSAwKSByZXR1cm4gMS4wL3g7Ci0JZWxzZSB7Ci0JCXRocm93X2V4Y2VwdGlvbigiRGl2aXNpb24gYnkgemVybyIpOwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIGNhdGNoIHRoZSBleGNlcHRpb24sIHlvdSBjYW4gd3JpdGUgYSBzaW1wbGUgZXhjZXB0aW9uIGhhbmRsZXIgc3VjaCBhcyB0aGUgZm9sbG93aW5nIChzaG93biBmb3IgUGVybDUpIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lZXhjZXB0KHBlcmw1KSB7Ci0JY2hhciAqZXJyOwotCWNsZWFyX2V4Y2VwdGlvbigpOwotCSRmdW5jdGlvbgotCWlmICgoZXJyID0gY2hlY2tfZXhjZXB0aW9uKCkpKSB7Ci0JCWNyb2FrKGVycik7Ci0JfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3csIHdoZW4gYW4gZXJyb3Igb2NjdXJzLCBpdCB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byBhIFBlcmwgZXJyb3IuIFRoZSBkb3duc2lkZSB0byB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgaXQgaXNuJ3QgcGFydGljdWxhcmx5IGNsZWFuIGFuZCBpdCBhc3N1bWVzIHRoYXQgeW91ciBDIGNvZGUgaXMgYSB3aWxsaW5nIHBhcnRpY2lwYW50IGluIGdlbmVyYXRpbmcgZXJyb3IgbWVzc2FnZXMuIChUaGlzIGlzbid0IGdvaW5nIHRvIG1hZ2ljYWxseSBhZGQgZXhjZXB0aW9ucyB0byBhIGNvZGUgdGhhdCBkb2Vzbid0IGhhdmUgdGhlbSkuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gRXhjZXB0aW9uIGhhbmRsaW5nIHdpdGggbG9uZ2ptcCgpPC9oMj4KLUV4Y2VwdGlvbiBoYW5kbGluZyBjYW4gYWxzbyBiZSBhZGRlZCB0byBDIGNvZGUgdXNpbmcgdGhlIDx0dD4mbHQ7c2V0am1wLmgmZ3Q7PC90dD4gbGlicmFyeS4gVGhpcyB1c3VhbGx5IGlzbid0IGRvY3VtZW50ZWQgdmVyeSB3ZWxsIChhdCBsZWFzdCBub3QgaW4gYW55IG9mIG15IEMgYm9va3MpLiBJbiBhbnkgY2FzZSwgaGVyZSdzIG9uZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhlIEMgcHJlcHJvY2Vzc29yIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKiBGaWxlIDogZXhjZXB0LmMKLSAgIEp1c3QgdGhlIGRlY2xhcmF0aW9uIG9mIGEgZmV3IGdsb2JhbCB2YXJpYWJsZXMgd2UncmUgZ29pbmcgdG8gdXNlICovCi0KLSNpbmNsdWRlICZsdDtzZXRqbXAuaCZndDsKLWptcF9idWYgZXhjZXB0aW9uX2J1ZmZlcjsKLWludCBleGNlcHRpb25fc3RhdHVzOwotCi0vKiBGaWxlIDogZXhjZXB0LmggKi8KLSNpbmNsdWRlICZsdDtzZXRqbXAuaCZndDsKLWV4dGVybiBqbXBfYnVmIGV4Y2VwdGlvbl9idWZmZXI7Ci1leHRlcm4gaW50IGV4Y2VwdGlvbl9zdGF0dXM7Ci0KLSNkZWZpbmUgdHJ5IGlmICgoZXhjZXB0aW9uX3N0YXR1cyA9IHNldGptcChleGNlcHRpb25fYnVmZmVyKSkgPT0gMCkKLSNkZWZpbmUgY2F0Y2godmFsKSBlbHNlIGlmIChleGNlcHRpb25fc3RhdHVzID09IHZhbCkKLSNkZWZpbmUgdGhyb3codmFsKSBsb25nam1wKGV4Y2VwdGlvbl9idWZmZXIsdmFsKQotI2RlZmluZSBmaW5hbGx5IGVsc2UKLQotLyogRXhjZXB0aW9uIGNvZGVzICovCi0KLSNkZWZpbmUgUmFuZ2VFcnJvciAgICAgMQotI2RlZmluZSBEaXZpc2lvbkJ5WmVybyAyCi0jZGVmaW5lIE91dE9mTWVtb3J5ICAgIDMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCB3aXRoaW4gYSBDIHByb2dyYW0sIHlvdSBjYW4gZG8gdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIGludihkb3VibGUgeCkgewotCWlmICh4KSByZXR1cm4gMS4wL3g7Ci0JZWxzZSB7dGhyb3coRGl2aXNpb25CeVplcm8pOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1GaW5hbGx5LCB0byBjcmVhdGUgYSBTV0lHIGV4Y2VwdGlvbiBoYW5kbGVyLCB3cml0ZSB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lewotI2luY2x1ZGUgImV4Y2VwdC5oIgotJX0KLQotJWV4Y2VwdChwZXJsNSkgewotCXRyeSB7Ci0JCSRmdW5jdGlvbgotCX0gY2F0Y2goUmFuZ2VFcnJvcikgewotCQljcm9haygiUmFuZ2UgRXJyb3IiKTsKLQl9IGNhdGNoKERpdmlzaW9uQnlaZXJvKSB7Ci0JCWNyb2FrKCJEaXZpc2lvbiBieSB6ZXJvIik7Ci0JfSBjYXRjaChPdXRPZk1lbW9yeSkgewotCQljcm9haygiT3V0IG9mIG1lbW9yeSIpOwotCX0gZmluYWxseSB7Ci0JCWNyb2FrKCJVbmtub3duIGV4Y2VwdGlvbiIpOwotCX0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BdCB0aGlzIHBvaW50LCB5b3UncmUgc2F5aW5nIHRoaXMgc3VyZSBsb29rcyBhbG90IGxpa2UgQysrIGFuZCB5b3UnZCBiZSByaWdodCAoQysrIGV4Y2VwdGlvbnMgYXJlIG9mdGVuIGltcGxlbWVudGVkIGluIGEgc2ltaWxhciBtYW5uZXIpLiAgQXMgYWx3YXlzLCB0aGUgdXN1YWwgZGlzY2xhaW1lcnMgYXBwbHktLXlvdXIgbWlsZWFnZSBtYXkgdmFyeS4gIDxwPgotPGEgbmFtZT0ibjQiPjwvYT48aDI+IEhhbmRsaW5nIEMrKyBleGNlcHRpb25zPC9oMj4KLUhhbmRsaW5nIEMrKyBleGNlcHRpb25zIGlzIGFsbW9zdCBjb21wbGV0ZWx5IHRyaXZpYWwgKHdlbGwsIGFsbCBleGNlcHQgZm9yIHRoZSBhY3R1YWwgQysrIHBhcnQpLiAgIEEgdHlwaWNhbCBTV0lHIGV4Y2VwdGlvbiBoYW5kbGVyIHdpbGwgbG9vayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQocGVybDUpIHsKLQl0cnkgewotCQkkZnVuY3Rpb24KLQl9IGNhdGNoKFJhbmdlRXJyb3IpIHsKLQkJY3JvYWsoIlJhbmdlIEVycm9yIik7Ci0JfSBjYXRjaChEaXZpc2lvbkJ5WmVybykgewotCQljcm9haygiRGl2aXNpb24gYnkgemVybyIpOwotCX0gY2F0Y2goT3V0T2ZNZW1vcnkpIHsKLQkJY3JvYWsoIk91dCBvZiBtZW1vcnkiKTsKLQl9IGNhdGNoKC4uLikgewotCQljcm9haygiVW5rbm93biBleGNlcHRpb24iKTsKLQl9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBleGNlcHRpb24gdHlwZXMgbmVlZCB0byBiZSBkZWNsYXJlZCBhcyBjbGFzc2VzIGVsc2V3aGVyZSwgcG9zc2libHkgaW4gYSBoZWFkZXIgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Y2xhc3MgUmFuZ2VFcnJvciB7fTsKLWNsYXNzIERpdmlzaW9uQnlaZXJvIHt9OwotY2xhc3MgT3V0T2ZNZW1vcnkge307Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5ld2VyIHZlcnNpb25zIG9mIHRoZSBTV0lHIHBhcnNlciBzaG91bGQgaWdub3JlIGV4Y2VwdGlvbnMgc3BlY2lmaWVkIGluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRvdWJsZSBpbnYoZG91YmxlKSB0aHJvdyhEaXZpc2lvbkJ5WmVybyk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBEZWZpbmluZyBkaWZmZXJlbnQgZXhjZXB0aW9uIGhhbmRsZXJzPC9oMj4KLUJ5IGRlZmF1bHQsIHRoZSA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZSBjcmVhdGVzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRoYXQgaXMgdXNlZCBmb3IgYWxsIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgZm9sbG93IGl0LiAgIENyZWF0aW5nIG9uZSB1bml2ZXJzYWwgZXhjZXB0aW9uIGhhbmRsZXIgZm9yIGFsbCBmdW5jdGlvbnMgbWF5IGJlIHVud2llbGR5IGFuZCBwcm9tb3RlIGV4Y2Vzc2l2ZSBjb2RlIGJsb2F0IHNpbmNlIHRoZSBoYW5kbGVyIHdpbGwgYmUgaW5saW5lZCBpbnRvIGVhY2ggd3JhcHBlciBmdW5jdGlvbiBjcmVhdGVkLiAgIEZvciB0aGlzIHJlYXNvbiwgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGNhbiBiZSByZWRlZmluZWQgYXQgYW55IHBvaW50IGluIGFuIGludGVyZmFjZSBmaWxlLiAgVGh1cywgYSBtb3JlIGVmZmljaWVudCB1c2Ugb2YgZXhjZXB0aW9uIGhhbmRsaW5nIG1heSB3b3JrIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWV4Y2VwdChweXRob24pIHsKLQkuLi4geW91ciBleGNlcHRpb24gaGFuZGxlciAuLi4KLX0KLS8qIERlZmluZSBjcml0aWNhbCBvcGVyYXRpb25zIHRoYXQgY2FuIHRocm93IGV4Y2VwdGlvbnMgaGVyZSAqLwotCi0lZXhjZXB0KHB5dGhvbik7ICAgICAgICAgLy8gQ2xlYXIgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyCi0KLS8qIERlZmluZSBub24tY3JpdGljYWwgb3BlcmF0aW9ucyB0aGF0IGRvbid0IHRocm93IGV4Y2VwdGlvbnMgKi8KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjkiPjwvYT48aDM+IEFwcGx5aW5nIGV4Y2VwdGlvbiBoYW5kbGVycyB0byBzcGVjaWZpYyBkYXRhdHlwZXMuPC9oMz4KLUFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIHVzaW5nIHRoZSA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZSBpcyB0byB1c2UgdGhlICJleGNlcHQiIHR5cGVtYXAuICBUaGlzIGFsbG93cyB5b3UgdG8gYXR0YWNoIGFuIGVycm9yIGhhbmRsZXIgdG8gc3BlY2lmaWMgZGF0YXR5cGVzIGFuZCBmdW5jdGlvbiBuYW1lLiAgIFRoZSB0eXBlbWFwIGlzIGFwcGxpZWQgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbixleGNlcHQpIHZvaWQgKiB7Ci0JJGZ1bmN0aW9uCi0JaWYgKCEkc291cmNlKSB7Ci0JCVB5RXhjX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwiT3V0IG9mIG1lbW9yeSBpbiAkbmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci19Ci0KLXZvaWQgKm1hbGxvYyhpbnQgc2l6ZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gYXBwbGllZCwgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiA8dHQ+bWFsbG9jKCk8L3R0PiBhbmQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGl0J3MgaW52YWxpZC4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5QeXRob24gMS40IChKYW4gMTYgMTk5NykgIFtHQ0MgMi43LjJdCi1Db3B5cmlnaHQgMTk5MS0xOTk1IFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1zdGVyZGFtCi0mZ3Q7Jmd0OyZndDsgZnJvbSBleGFtcGxlIGltcG9ydCAqCi0mZ3Q7Jmd0OyZndDsgYSA9IG1hbGxvYygyMDQ4KQotJmd0OyZndDsmZ3Q7IGIgPSBtYWxsb2MoMTUwMDAwMDAwMCkKLVRyYWNlYmFjayAoaW5uZXJtb3N0IGxhc3QpOgotICBGaWxlICImbHQ7c3RkaW4mZ3Q7IiwgbGluZSAxLCBpbiA/Ci1NZW1vcnlFcnJvcjogT3V0IG9mIG1lbW9yeSBpbiBtYWxsb2MKLSZndDsmZ3Q7Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TaW5jZSB0eXBlbWFwcyBjYW4gYmUgbmFtZWQsIHlvdSBjYW4gZGVmaW5lIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBhIHNwZWNpZmljIGZ1bmN0aW9uIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbixleGNlcHQpIHZvaWQgKm1hbGxvYyB7Ci0JLi4uCi19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIDx0dD5tYWxsb2MoKTwvdHQ+IGZ1bmN0aW9uIHJldHVybmluZyA8dHQ+dm9pZCAqPC90dD4uICBXaGlsZSB5b3UgcHJvYmFibHkgd291bGRuJ3Qgd2FudCB0byB3cml0ZSBhIGRpZmZlcmVudCBleGNlcHRpb24gaGFuZGxlciBmb3IgZXZlcnkgZnVuY3Rpb24sIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBoaWdoIGRlZ3JlZSBvZiBjb250cm9sIGlmIHlvdSBuZWVkIGl0LiAgICBXaGVuIHR5cGVtYXBzIGFyZSB1c2VkLCB0aGV5IG92ZXJyaWRlIGFueSBleGNlcHRpb24gaGFuZGxlciBkZWZpbmVkIHdpdGggPHR0PiVleGNlcHQ8L3R0Pi48cD4KLTxhIG5hbWU9Im42Ij48L2E+PGgyPiBVc2luZyBUaGUgU1dJRyBleGNlcHRpb24gbGlicmFyeTwvaDI+Ci1UaGUgPHR0PmV4Y2VwdGlvbi5pPC90dD4gbGlicmFyeSBmaWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNyZWF0aW5nIGxhbmd1YWdlIGluZGVwZW5kZW50IGV4Y2VwdGlvbnMgaW4geW91ciBpbnRlcmZhY2VzLiAgICBUbyB1c2UgaXQsIHNpbXBseSBwdXQgYW4gIjx0dD4laW5jbHVkZSBleGNlcHRpb24uaTwvdHQ+IiBpbiB5b3VyIGludGVyZmFjZSBmaWxlLiAgIFRoaXMgY3JlYXRlcyBhIGZ1bmN0aW9uPHR0PiBTV0lHX2V4Y2VwdGlvbigpPC90dD4gdGhhdCBjYW4gYmUgdXNlZCB0byByYWlzZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXhjZXB0aW9ucyBpbiBhIHBvcnRhYmxlIG1hbm5lci4gICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gTGFuZ3VhZ2UgaW5kZXBlbmRlbnQgZXhjZXB0aW9uIGhhbmRsZXIKLSVpbmNsdWRlIGV4Y2VwdGlvbi5pICAgICAgIAotCi0lZXhjZXB0IHsKLQl0cnkgewotCQkkZnVuY3Rpb24KLQl9IGNhdGNoKFJhbmdlRXJyb3IpIHsKLQkJU1dJR19leGNlcHRpb24oU1dJR19WYWx1ZUVycm9yLCAiUmFuZ2UgRXJyb3IiKTsKLQl9IGNhdGNoKERpdmlzaW9uQnlaZXJvKSB7Ci0JCVNXSUdfZXhjZXB0aW9uKFNXSUdfRGl2aXNpb25CeVplcm8sICJEaXZpc2lvbiBieSB6ZXJvIik7Ci0JfSBjYXRjaChPdXRPZk1lbW9yeSkgewotCQlTV0lHX2V4Y2VwdGlvbihTV0lHX01lbW9yeUVycm9yLCAiT3V0IG9mIG1lbW9yeSIpOwotCX0gY2F0Y2goLi4uKSB7Ci0JCVNXSUdfZXhjZXB0aW9uKFNXSUdfUnVudGltZUVycm9yLCJVbmtub3duIGV4Y2VwdGlvbiIpOwotCX0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQXMgYXJndW1lbnRzLCAgPHR0PlNXSUdfZXhjZXB0aW9uKCk8L3R0PiAgdGFrZXMgYW4gZXJyb3IgdHlwZSBjb2RlIChhbiBpbnRlZ2VyKSBhbmQgYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcuICAgVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgZXJyb3IgdHlwZXMgYXJlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5TV0lHX01lbW9yeUVycm9yCi1TV0lHX0lPRXJyb3IKLVNXSUdfUnVudGltZUVycm9yCi1TV0lHX0luZGV4RXJyb3IKLVNXSUdfVHlwZUVycm9yCi1TV0lHX0RpdmlzaW9uQnlaZXJvCi1TV0lHX092ZXJmbG93RXJyb3IKLVNXSUdfU3ludGF4RXJyb3IKLVNXSUdfVmFsdWVFcnJvcgotU1dJR19TeXN0ZW1FcnJvcgotU1dJR19Vbmtub3duRXJyb3IKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU2luY2UgdGhlIDx0dD5TV0lHX2V4Y2VwdGlvbigpPC90dD4gZnVuY3Rpb24gaXMgZGVmaW5lZCBhdCB0aGUgQy1sZXZlbCBpdCBjYW4gYmUgdXNlZCBlbHNld2hlcmUgaW4gU1dJRy4gVGhpcyBpbmNsdWRlcyB0eXBlbWFwcyBhbmQgaGVscGVyIGZ1bmN0aW9ucy4gICBUaGUgZXhjZXB0aW9uIGxpYnJhcnkgcHJvdmlkZXMgYSBsYW5ndWFnZS1pbmRlcGVuZGVudCBleGNlcHRpb24gaGFuZGxpbmcgbWVjaGFuaXNtLCBzbyBtYW55IG9mIFNXSUcncyBsaWJyYXJ5IGZpbGVzIG5vdyByZWx5IHVwb24gdGhlIGxpYnJhcnkgYXMgd2VsbC48cD4KLTxhIG5hbWU9Im43Ij48L2E+PGgyPiBEZWJ1Z2dpbmcgYW5kIG90aGVyIGludGVyZXN0aW5nIHVzZXMgZm9yICVleGNlcHQ8L2gyPgotU2luY2UgdGhlIDx0dD4lZXhjZXB0IDwvdHQ+ZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gZW5jYXBzdWxhdGUgdGhlIGFjdHVhbCBDIGZ1bmN0aW9uIGNhbGwsIGl0IGNhbiBhbHNvIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgdHJhY2luZyBvcGVyYXRpb25zLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQodGNsKSB7Ci0JcHJpbnRmKCJFbnRlcmluZyBmdW5jdGlvbiA6ICRuYW1lXG4iKTsKLQkkZnVuY3Rpb24KLQlwcmludGYoIkxlYXZpbmcgZnVuY3Rpb24gOiAkbmFtZVxuIik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWFsbG93cyB5b3UgdG8gIGZvbGxvdyB0aGUgZnVuY3Rpb24gY2FsbHMgaW4gb3JkZXIgdG8gc2VlIHdoZXJlIGFuIGFwcGxpY2F0aW9uIG1pZ2h0IGJlIGNyYXNoaW5nLiAgIDxwPgotPHA+Ci1FeGNlcHRpb24gaGFuZGxlcnMgY2FuIGFsc28gYmUgY2hhaW5lZC4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lZXhjZXB0KHRjbCkgewotCXByaW50ZigiRW50ZXJpbmcgZnVuY3Rpb24gOiAkbmFtZVxuIik7Ci0JJGV4Y2VwdAotCXByaW50ZigiTGVhdmluZyBmdW5jdGlvbiA6ICRuYW1lXG4iKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQW55IHByZXZpb3VzbHkgZGVmaW5lZCBleGNlcHRpb24gaGFuZGxlciB3aWxsIGJlIGluc2VydGVkIGluIHBsYWNlIG9mIHRoZSAiPHR0PiRleGNlcHQ8L3R0PiIgc3ltYm9sLiAgQXMgYSByZXN1bHQsIHlvdSBjYW4gYXR0YWNoIGRlYnVnZ2luZyBjb2RlIHRvIGV4aXN0aW5nIGhhbmRsZXJzIGlmIG5lY2Vzc2FyeS4gICBIb3dldmVyLCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgYW55IEMvQysrIGRlY2xhcmF0aW9ucyBhcmUgbWFkZSAoYXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFyZSBhcHBsaWVkIGltbWVkaWF0ZWx5IHRvIGFsbCBmdW5jdGlvbnMgdGhhdCBmb2xsb3cgdGhlbSkuPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMj4gTW9yZSBFeGFtcGxlczwvaDI+Ci1CeSBub3csIHlvdSBrbm93IG1vc3Qgb2YgdGhlIGV4Y2VwdGlvbiBiYXNpY3MuICBTZWUgdGhlIFNXSUcgRXhhbXBsZXMgZGlyZWN0b3J5IGZvciBtb3JlIGV4YW1wbGVzIGFuZCBpZGVhcy4gIEZ1cnRoZXIgY2hhcHRlcnMgc2hvdyBob3cgdG8gZ2VuZXJhdGUgZXhjZXB0aW9ucyBpbiBzcGVjaWZpYyBzY3JpcHRpbmcgbGFuZ3VhZ2VzLjxwPgotPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjU3IDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0V4dGVuZGluZy5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9FeHRlbmRpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkMmQyZi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0V4dGVuZGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg0OCArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkV4dGVuZGluZyBTV0lHPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT4xMiBFeHRlbmRpbmcgU1dJRzwvaDE+PHA+PHVsPgotPGxpPiA8YSBocmVmPSIjbjEiPkludHJvZHVjdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5Db21waWxpbmcgYSBTV0lHIGV4dGVuc2lvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5TV0lHIG91dHB1dDwvYT4KLTxsaT4gPGEgaHJlZj0iI240Ij5UaGUgTGFuZ3VhZ2UgY2xhc3MgKHNpbXBsZSB2ZXJzaW9uKTwvYT4KLTxsaT4gPGEgaHJlZj0iI241Ij5BIHRvdXIgb2YgU1dJRyBkYXRhdHlwZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNiI+VHlwZW1hcHMgKGZyb20gQyk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNyI+RmlsZSBtYW5hZ2VtZW50PC9hPgotPGxpPiA8YSBocmVmPSIjbjgiPk5hbWluZyBTZXJ2aWNlczwvYT4KLTxsaT4gPGEgaHJlZj0iI245Ij5Db2RlIEdlbmVyYXRpb24gRnVuY3Rpb25zPC9hPgotPGxpPiA8YSBocmVmPSIjbjEwIj5Xcml0aW5nIGEgUmVhbCBMYW5ndWFnZSBNb2R1bGU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTEiPkMrKyBQcm9jZXNzaW5nPC9hPgotPGxpPiA8YSBocmVmPSIjbjEyIj5Eb2N1bWVudGF0aW9uIFByb2Nlc3Npbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTMiPlRoZSBGdXR1cmUgb2YgU1dJRzwvYT4KLTwvdWw+Ci0KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBJbnRyb2R1Y3Rpb248L2gyPgotVGhpcyBjaGFwdGVyIGF0dGVtcHRzIHRvIGRlc2NyaWJlIHRoZSBwcm9jZXNzIG9mIGV4dGVuZGluZyBTV0lHIHRvIHN1cHBvcnQgbmV3IHRhcmdldCBsYW5ndWFnZXMgYW5kIGRvY3VtZW50YXRpb24gbWV0aG9kcy4gRmlyc3QgYSB3b3JkIG9mIHdhcm5pbmctLVNXSUcgc3RhcnRlZCBvdXQgYmVpbmcgYSByZWxhdGl2ZWx5IHNpbXBsZSBzeXN0ZW0gZm9yIGJ1aWxkaW5nIGludGVyZmFjZXMgdG8gQU5TSSBDIHByb2dyYW1zLiBTaW5jZSB0aGVuLCBpdCBoYXMgZ3Jvd24gaW50byBzb21ldGhpbmcgbXVjaCBtb3JlIHRoYW4gdGhhdCAoYWx0aG91Z2ggSSdtIHN0aWxsIHRyeWluZyB0byBmaWd1cmUgb3V0IHdoYXQpLiBBcyBhIHJlc3VsdCwgaXQgaXMgdW5kZXJnb2luZyBhIG51bWJlciBvZiBncm93aW5nIHBhaW5zLiBDZXJ0YWluIHBhcnRzIG9mIHRoZSBjb2RlIGhhdmUgYmVlbiByZXdyaXR0ZW4gYW5kIG90aGVycyBjYW4gcHJvYmFibHkgYmUgZGVzY3JpYmVkIGFzIGEgaGFja2lzaCBuaWdodG1hcmUuIEknbSBhbHdheXMgd29ya2luZyBvbiB3YXlzIHRvIGltcHJvdmUgdGhlIGltcGxlbWVudGF0aW9uLCBidXQgZXhwZWN0IHRvIGZpbmQgYSBmZXcgd2FydHMgYW5kIGluY29uc2lzdGVuY2llcy48cD4KLTxhIG5hbWU9Im4xNCI+PC9hPjxoMz4gUHJlcmVxdWlzaXRlczwvaDM+Ci1JbiBvcmRlciB0byBkZXZlbG9wIG9yIG1vZGlmeSBhIFNXSUcgbW9kdWxlLCBJIGFzc3VtZSB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPHVsPgotPGxpPlRoYXQgeW91IHVuZGVyc3RhbmQgdGhlIEMgQVBJIGZvciB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIG9mIGludGVyZXN0LgotPGxpPllvdSBoYXZlIGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIGhvdyBTV0lHIG9wZXJhdGVzIGFuZCBhIGdvb2QgaWRlYSBvZiBob3cgdHlwZW1hcHMgd29yay4KLTxsaT5UaGF0IHlvdSBoYXZlIHNvbWUgZXhwZXJpZW5jZSB3aXRoIEMrKy4gU1dJRyBpcyB3cml0dGVuIGluIEMrKywgYnV0IGRvZXNuJ3QgdXNlIGl0IG1heGltYWxseS4gSG93ZXZlciwgZmFtaWxpYXJpdHkgd2l0aCBjbGFzc2VzLCBpbmhlcml0YW5jZSwgYW5kIG9wZXJhdG9yIG92ZXJsb2FkaW5nIHdpbGwgaGVscC4KLTxsaT5UaGF0IHlvdSdyZSBqdXN0IGEgbGl0dGxlIGNyYXp5ICh0aGlzIHdpbGwgaGVscCBhbG90KS4KLTwvdWw+Ci08YSBuYW1lPSJuMTUiPjwvYT48aDM+IFNXSUcgT3JnYW5pemF0aW9uPC9oMz4KLVNXSUcgaXMgYnVpbHQgYXJvdW5kIGEgY2VudHJhbCBjb3JlIG9mIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBpbnRlcmZhY2UgZmlsZXMsIG1hbmFnaW5nIGRvY3VtZW50YXRpb24sIGhhbmRsaW5nIGRhdGF0eXBlcywgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLiBUaGlzIGNvZGUgaXMgY29udGFpbmVkIGluIHRoZSAiU1dJRyIgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cmlidXRpb24sIGJ1dCBjb250YWlucyBubyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhbnkgb25lIHNjcmlwdGluZyBsYW5ndWFnZS4gVGhlIHZhcmlvdXMgc2NyaXB0aW5nIGxhbmd1YWdlIG1vZHVsZXMgYXJlIGltcGxlbWVudGVkIGFzIEMrKyBjbGFzc2VzIGFuZCBmb3VuZCBpbiB0aGUgIk1vZHVsZXMiIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJpYnV0aW9uLiBUaGUgYmFzaWMgaWRlYSBiZWhpbmQgd3JpdGluZyBhIG1vZHVsZSBpcyB0aGF0IHlvdSB3cml0ZSBhIGxhbmd1YWdlIGNsYXNzIGNvbnRhaW5pbmcgYWJvdXQgYSBkb3plbiBtZXRob2RzIGZvciBjcmVhdGluZyB3cmFwcGVyIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGV0Yy4uLi4gVG8gdXNlIHRoZSBsYW5ndWFnZSwgeW91IHNpbXBseSBjcmVhdGUgYSBsYW5ndWFnZSAib2JqZWN0IiwgcGFzcyBpdCBvbiB0aGUgcGFyc2VyIGFuZCB5b3UgbWFnaWNhbGx5IGdldCB3cmFwcGVyIGNvZGUuIERvY3VtZW50YXRpb24gbW9kdWxlcyBhcmUgd3JpdHRlbiBpbiBhIHNpbWlsYXIgbWFubmVyLjxwPgotPHA+Ci1BbiBpbXBvcnRhbnQgYXNwZWN0IG9mIHRoZSBkZXNpZ24gaXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEFOU0kgQyBhbmQgQysrLiBUaGUgb3JpZ2luYWwgdmVyc2lvbiBvZiBTV0lHIHdhcyBkZXZlbG9wZWQgdG8gc3VwcG9ydCBBTlNJIEMgcHJvZ3JhbXMuIFRvIGFkZCBDKysgc3VwcG9ydCwgYW4gYWRkaXRpb25hbCAibGF5ZXIiIHdhcyBhZGRlZCB0byB0aGUgc3lzdGVtLS0tdGhhdCBpcywgYWxsIG9mIHRoZSBDKysgc3VwcG9ydCBpcyByZWFsbHkgYnVpbHQgb24gdG9wIG9mIHRoZSBBTlNJIEMgc3VwcG9ydC4gTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgYm90aCBDIGFuZCBDKysgYWx0aG91Z2ggYSBtb2R1bGUgd3JpdHRlbiBvbmx5IGZvciBDIGNhbiBzdGlsbCB3b3JrIHdpdGggQysrIChkdWUgdG8gdGhlIGxheWVyZWQgaW1wbGVtZW50YXRpb24pLiA8cD4KLTxwPgotQXMgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIFNXSUcsIGFsbCBmaWxlcyBpbiB0aGUgIlNXSUciIGRpcmVjdG9yeSBzaG91bGQgYmUgY29uc2lkZXJlZCAiY3JpdGljYWwuIiBNYWtpbmcgY2hhbmdlcyBoZXJlIGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGluIGFsbCBTV0lHIGxhbmd1YWdlIG1vZHVsZXMuICBXaGVuIG1ha2luZyBjdXN0b21pemF0aW9ucywgb25lIHNob3VsZCBvbmx5IGNvbnNpZGVyIGZpbGVzIGluIHRoZSAiTW9kdWxlcyIgZGlyZWN0b3J5IGlmIGF0IGFsbCBwb3NzaWJsZS48cD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNoYXB0ZXI8L2gzPgotVGhlIHJlbWFpbmRlciBvZiB0aGlzIGNoYXB0ZXIgaXMgYSBib3R0b20tdXAgYXBwcm9hY2ggaXMgdG8gYnVpbGRpbmcgU1dJRyBtb2R1bGVzLiBJdCB3aWxsIHN0YXJ0IHdpdGggdGhlIGJhc2ljcyBhbmQgZ3JhZHVhbGx5IGJ1aWxkIHVwIGEgd29ya2luZyBsYW5ndWFnZSBtb2R1bGUsIGludHJvZHVjaW5nIG5ldyBjb25jZXB0cyBhcyBuZWVkZWQuPHA+Ci08YSBuYW1lPSJuMiI+PC9hPjxoMj4gQ29tcGlsaW5nIGEgU1dJRyBleHRlbnNpb248L2gyPgotVGhlIGZpcnN0IG9yZGVyIG9mIGJ1c2luZXNzIGlzIHRoYXQgb2YgY29tcGlsaW5nIGFuIGV4dGVuc2lvbiB0byBTV0lHIGFuZCB1c2luZyBpdC4gVGhpcyBpcyB0aGUgZWFzeSBwYXJ0LjxwPgotPGEgbmFtZT0ibjE3Ij48L2E+PGgzPiBSZXF1aXJlZCBmaWxlczwvaDM+Ci1UbyBidWlsZCBhbnkgU1dJRyBleHRlbnNpb24geW91IG5lZWQgdG8gbG9jYXRlIHRoZSBmaWxlcyAiPHR0PnN3aWcuaDwvdHQ+IiBhbmQgIjx0dD5saWJzd2lnLmE8L3R0PiIuIEluIGEgdHlwaWNhbCBpbnN0YWxsYXRpb24sIHRoZXNlIHdpbGwgdXN1YWxseSBiZSBmb3VuZCBpbiA8dHQ+L3Vzci9sb2NhbC9pbmNsdWRlPC90dD4gYW5kIDx0dD4vdXNyL2xvY2FsL2xpYjwvdHQ+IHJlc3BlY3RpdmVseS4gQWxsIGV4dGVuc2lvbiBtb2R1bGVzIHdpbGwgbmVlZCB0byBpbmNsdWRlIHRoZSAiPHR0PnN3aWcuaDwvdHQ+IiBoZWFkZXIgZmlsZSBhbmQgbGluayBhZ2FpbnN0IHRoZSA8dHQ+bGlic3dpZy5hPC90dD4gbGlicmFyeS4gPHA+Ci08YSBuYW1lPSJuMTgiPjwvYT48aDM+IFJlcXVpcmVkIEMrKyBjb21waWxlcjwvaDM+Ci1EdWUgdG8gbmFtZS1tYW5nbGluZyBpbiB0aGUgQysrIGNvbXBpbGVyICh3aGljaCBpcyBkaWZmZXJlbnQgYmV0d2VlbiBjb21waWxlciBpbXBsZW1lbnRhdGlvbnMpLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgc2FtZSBDKysgY29tcGlsZXIgdXNlZCB0byBjb21waWxlIFNXSUcuIElmIHlvdSBkb24ndCBrbm93IHdoaWNoIEMrKyBjb21waWxlciB3YXMgdXNlZCwgdHlwaW5nIGA8dHQ+c3dpZyAtdmVyc2lvbjwvdHQ+JyB3aWxsIGNhdXNlIFNXSUcgdG8gcHJpbnQgb3V0IGl0cyB2ZXJzaW9uIG51bWJlciBhbmQgdGhlIEMrKyBjb21waWxlciB0aGF0IHdhcyB1c2VkIHRvIGJ1aWxkIGl0LjxwPgotPGEgbmFtZT0ibjE5Ij48L2E+PGgzPiBXcml0aW5nIGEgbWFpbiBwcm9ncmFtPC9oMz4KLVRvIGdldCBhbnkgZXh0ZW5zaW9uIHRvIHdvcmssIGl0IGlzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIHNtYWxsIDx0dD5tYWluKCk8L3R0PiBwcm9ncmFtIHRvIGNyZWF0ZSBhIGxhbmd1YWdlIG9iamVjdCBhbmQgc3RhcnQgdGhlIFNXSUcgcGFyc2VyLiBGb3IgZXhhbXBsZSA6PGJyPjxwPgotPGJsb2NrcXVvdGU+PHByZT4jaW5jbHVkZSAmbHQ7c3dpZy5oJmd0OwotI2luY2x1ZGUgInN3aWd0Y2wuaCIgICAgICAgICAgICAgICAgICAgICAgIC8vIExhbmd1YWdlIHNwZWNpZmljIGhlYWRlcgotCi1leHRlcm4gaW50IFNXSUdfbWFpbihpbnQsIGNoYXIgKiosIExhbmd1YWdlICosIERvY3VtZW50YXRpb24gKik7Ci1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQkKLQlUQ0wgKmwgPSBuZXcgVGNsOyAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTGFuZ3VhZ2Ugb2JqZWN0Ci0JaW5pdF9hcmdzKGFyZ2MsIGFyZ3YpOyAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBhcmdzCi0JcmV0dXJuIFNXSUdfbWFpbihhcmdjLCBhcmd2LCBsLCAwKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4yMCI+PC9hPjxoMz4gQ29tcGlsaW5nPC9oMz4KLVRvIGNvbXBpbGUgeW91ciBleHRlbnNpb24sIGRvIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgYysrIHRjbC5jeHggbWFpbi5jeHggLWxzd2lnIC1vIG15c3dpZwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2Ugd2UgZ2V0IGEgc3BlY2lhbCB2ZXJzaW9uIG9mIFNXSUcgdGhhdCBjb21waWxlcyBUY2wgZXh0ZW5zaW9ucy48cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBTV0lHIG91dHB1dDwvaDI+Ci1UaGUgb3V0cHV0IG9mIFNXSUcgaXMgYSBzaW5nbGUgZmlsZSB0aGF0IGlzIG9yZ2FuaXplZCBhcyBmb2xsb3dzIDo8cD4KLTxjZW50ZXI+PGltZyBzcmM9ImNoMTIuMS5wbmciPjwvY2VudGVyPjxwPgotPHA+Ci08cD4KLUR1cmluZyBjb2RlIGdlbmVyYXRpb24sIHRoZSB0aHJlZSBzZWN0aW9ucyBhcmUgY3JlYXRlZCBhcyBzZXBhcmF0ZSBmaWxlcyB0aGF0IGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZpbGUgaGFuZGxlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+RklMRSAqZl9oZWFkZXI7ICAgICAgICAgICAgICAvLyBIZWFkZXIgc2VjdGlvbgotRklMRSAqZl93cmFwcGVyczsgICAgICAgICAgICAvLyBXcmFwcGVyIHNlY3Rpb24KLUZJTEUgKmZfaW5pdDsgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotT24gZXhpdCwgdGhlIHRocmVlIGZpbGVzIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBvdXRwdXQgZmlsZS48cD4KLTxwPgotV2hlbiBnZW5lcmF0aW5nIGNvZGUsIHlvdXIgbGFuZ3VhZ2UgbW9kdWxlIHNob3VsZCB1c2UgdGhlIEkvTyBmdW5jdGlvbnMgaW4gdGhlIEMgPHR0PiZsdDtzdGRpby5oJmd0OzwvdHQ+IGxpYnJhcnkuIFNXSUcgZG9lcyBub3QgdXNlIHRoZSBDKysgc3RyZWFtcyBsaWJyYXJ5LjxwPgotPHA+Ci1UaGUgdXNlIG9mIGVhY2ggb3V0cHV0IHNlY3Rpb24gY2FuIGJlIHJvdWdobHkgZGVzY3JpYmVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08dWw+Ci08bGk+VGhlIGhlYWRlciBzZWN0aW9uIGNvbnRhaW5zIGZvcndhcmQgZGVjbGFyYXRpb25zLCBoZWFkZXIgZmlsZXMsIGhlbHBlciBmdW5jdGlvbnMsIGFuZCBydW4tdGltZSBmdW5jdGlvbnMgKHN1Y2ggYXMgdGhlIHBvaW50ZXIgdHlwZS1jaGVja2VyKS4gQWxsIGNvZGUgaW5jbHVkZWQgd2l0aCAleywlfSBhbHNvIGVuZHMgdXAgaGVyZS4KLTxsaT5UaGUgd3JhcHBlciBzZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUgU1dJRyBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbnMuIAotPGxpPlRoZSBpbml0aWFsaXphdGlvbiBzZWN0aW9uIGlzIGEgc2luZ2xlIEMgZnVuY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb2R1bGUuIEZvciBsYXJnZSBtb2R1bGVzLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBxdWl0ZSBsYXJnZS4gSW4gYW55IGNhc2UsIG91dHB1dCB0byA8dHQ+Zl9pbml0PC90dD4gc2hvdWxkIGJlIHRyZWF0ZWQgd2l0aCBzb21lIGNhcmUgY29uc2lkZXJpbmcgdGhhdCB0aGUgZmlsZSBpcyBlc3NlbnRpYWxseSBvbmUgYmlnIEMgZnVuY3Rpb24uCi08L3VsPgotPGEgbmFtZT0ibjQiPjwvYT48aDI+IFRoZSBMYW5ndWFnZSBjbGFzcyAoc2ltcGxlIHZlcnNpb24pPC9oMj4KLVdyaXRpbmcgYSBuZXcgbGFuZ3VhZ2UgbW9kdWxlIGludm9sdmVzIGluaGVyaXRpbmcgZnJvbSB0aGUgU1dJRyA8dHQ+TGFuZ3VhZ2U8L3R0PiBjbGFzcyBhbmQgaW1wbGVtZW50aW5nIG1ldGhvZHMgZm9yIGEgZmV3IHZpcnR1YWwgZnVuY3Rpb25zLiBBIG1pbmltYWwgZGVmaW5pdGlvbiBvZiBhIG5ldyBMYW5ndWFnZSBtb2R1bGUgaXMgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gRmlsZSA6IG15bGFuZy5oCi0vLyBBIG1pbmltYWwgU1dJRyBMYW5ndWFnZSBtb2R1bGUKLQotY2xhc3MgTVlMQU5HIDogcHVibGljIExhbmd1YWdlIHsKLXByaXZhdGU6Ci0JY2hhciAqbW9kdWxlOwotcHVibGljIDoKLQlNWUxBTkcoKSB7IAotCQltb2R1bGUgPSAwOwotCX07Ci0JLy8gVmlydHVhbCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIFNXSUcgcGFyc2VyCi0JIHZvaWQgcGFyc2VfYXJncyhpbnQsIGNoYXIgKmFyZ3ZbXSk7Ci0JIHZvaWQgcGFyc2UoKTsKLQkgdm9pZCBjcmVhdGVfZnVuY3Rpb24oY2hhciAqLCBjaGFyICosIERhdGFUeXBlICosIFBhcm1MaXN0ICopOwotCSB2b2lkIGxpbmtfdmFyaWFibGUoY2hhciAqLCBjaGFyICosIERhdGFUeXBlICopOwotCSB2b2lkIGRlY2xhcmVfY29uc3QoY2hhciAqLCBjaGFyICosIERhdGFUeXBlICosIGNoYXIgKik7Ci0JIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKTsKLQkgdm9pZCBoZWFkZXJzKHZvaWQpOwotCSB2b2lkIGNsb3NlKHZvaWQpOwotCSB2b2lkIHNldF9tb2R1bGUoY2hhciAqLGNoYXIgKiopOwotCSB2b2lkIGNyZWF0ZV9jb21tYW5kKGNoYXIgKiwgY2hhciAqKTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotR2l2ZW4gdGhlIGFib3ZlIGhlYWRlciBmaWxlLCB3ZSBjYW4gY3JlYXRlIGEgdmVyeSBzaW1wbGlzdGljIGxhbmd1YWdlIG1vZHVsZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEEgc2ltcGxlIFNXSUcgTGFuZ3VhZ2UgbW9kdWxlCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2luY2x1ZGUgInN3aWcuaCIKLSNpbmNsdWRlICJteWxhbmcuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OnBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLS8vCi0vLyBQYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgaW5pdGlhbGl6ZXMgdmFyaWFibGVzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6cGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0JcHJpbnRmKCJHZXR0aW5nIGNvbW1hbmQgbGluZSBvcHRpb25zXG4iKTsKLQl0eXBlbWFwX2xhbmcgPSAibXlsYW5nIjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB2b2lkIE1ZTEFORzo6cGFyc2UoKQotLy8KLS8vIFN0YXJ0IHBhcnNpbmcgYW4gaW50ZXJmYWNlIGZpbGUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgTVlMQU5HOjpwYXJzZSgpIHsKLQlmcHJpbnRmKHN0ZGVyciwiTWFraW5nIHdyYXBwZXJzIGZvciBNeSBMYW5ndWFnZVxuIik7Ci0JaGVhZGVycygpOwotCXl5cGFyc2UoKTsgICAgICAgLy8gUnVuIHRoZSBTV0lHIHBhcnNlcgotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6c2V0X21vZHVsZShjaGFyICptb2RfbmFtZSxjaGFyICoqbW9kX2xpc3QpCi0vLwotLy8gU2V0cyB0aGUgbW9kdWxlIG5hbWUuICBEb2VzIG5vdGhpbmcgaWYgaXQncyBhbHJlYWR5IHNldCAoc28gaXQgY2FuCi0vLyBiZSBvdmVycmlkZGVuIGFzIGEgY29tbWFuZCBsaW5lIG9wdGlvbikuCi0vLwotLy8gbW9kX2xpc3QgaXMgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBhZGRpdGlvbmFsIG1vZHVsZXMuICBUaGlzCi0vLyBpcyByZWFsbHkgb25seSB1c2VmdWwgd2hlbiBidWlsZGluZyBzdGF0aWMgZXhlY3V0YWJsZXMuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBNWUxBTkc6OnNldF9tb2R1bGUoY2hhciAqbW9kX25hbWUsIGNoYXIgKiptb2RfbGlzdCkgewotICBpZiAobW9kdWxlKSByZXR1cm47Ci0gIG1vZHVsZSA9IG5ldyBjaGFyW3N0cmxlbihtb2RfbmFtZSkrMV07Ci0gIHN0cmNweShtb2R1bGUsbW9kX25hbWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmhlYWRlcnModm9pZCkKLS8vCi0vLyBHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgaGVhZGVyIGZpbGVzIGZvciBNWUxBTkcgaW50ZXJmYWNlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBNWUxBTkc6OmhlYWRlcnModm9pZCkgewotICAJZW1pdF9iYW5uZXIoZl9oZWFkZXIpOyAgICAgICAgLy8gUHJpbnQgdGhlIFNXSUcgYmFubmVyIG1lc3NhZ2UKLQlmcHJpbnRmKGZfaGVhZGVyLCIvKiBJbXBsZW1lbnRhdGlvbiA6IE15IExhbmd1YWdlICovXG5cbiIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6aW5pdGlhbGl6ZSh2b2lkKQotLy8KLS8vIFByb2R1Y2VzIGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiAgIEFzc3VtZXMgdGhhdCB0aGUgbW9kdWxlCi0vLyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6aW5pdGlhbGl6ZSgpIHsKLQlpZiAoIW1vZHVsZSkgbW9kdWxlID0gInN3aWciOyAgICAgICAgIC8vIFBpY2sgYSBkZWZhdWx0IG5hbWUKLQkvLyBTdGFydCBnZW5lcmF0aW5nIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotCWZwcmludGYoZl9pbml0LCJpbnQgJXNfaW5pdGlhbGl6ZSgpIHtcbiIsIG1vZHVsZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpjbG9zZSh2b2lkKQotLy8KLS8vIEZpbmlzaCB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uIENsb3NlIGFueSBhZGRpdGlvbmFsIGZpbGVzIGFuZAotLy8gcmVzb3VyY2VzIGluIHVzZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBNWUxBTkc6OmNsb3NlKHZvaWQpIHsKLQkvLyBGaW5pc2ggb2ZmIG91ciBpbml0IGZ1bmN0aW9uCi0JZnByaW50ZihmX2luaXQsIn1cbiIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6Y3JlYXRlX2NvbW1hbmQoY2hhciAqY25hbWUsIGNoYXIgKmluYW1lKQotLy8KLS8vIENyZWF0ZXMgYSBuZXcgY29tbWFuZCBmcm9tIGEgQyBmdW5jdGlvbi4KLS8vIAkJY25hbWUgPSBOYW1lIG9mIHRoZSBDIGZ1bmN0aW9uCi0vLwkJaW5hbWUgPSBOYW1lIG9mIGZ1bmN0aW9uIGluIHNjcmlwdGluZyBsYW5ndWFnZQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6Y3JlYXRlX2NvbW1hbmQoY2hhciAqY25hbWUsIGNoYXIgKmluYW1lKSB7Ci0JZnByaW50ZihmX2luaXQsIlx0IENyZWF0aW5nIGNvbW1hbmQgJXNcbiIsIGluYW1lKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmNyZWF0ZV9mdW5jdGlvbihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKmQsIFBhcm1MaXN0ICpsKQotLy8KLS8vIENyZWF0ZSBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFuZCByZWdpc3RlciBpdCB3aXRoIHRoZSBpbnRlcnByZXRlci4KLS8vCQluYW1lID0gTmFtZSBvZiByZWFsIEMgZnVuY3Rpb24KLS8vCQlpbmFtZSA9IE5hbWUgb2YgZnVuY3Rpb24gaW4gc2NyaXB0aW5nIGxhbmd1YWdlCi0vLwkJZCA9IFJldHVybiBkYXRhdHlwZQotLy8JCWwgPSBGdW5jdGlvbiBwYXJhbWV0ZXJzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgTVlMQU5HOjpjcmVhdGVfZnVuY3Rpb24oY2hhciAqbmFtZSwgY2hhciAqaW5hbWUsIERhdGFUeXBlICpkLCBQYXJtTGlzdCAqbCkgewotCWZwcmludGYoZl93cmFwcGVycywiXG53cmFwXyVzKCkgeyB9XG5cbiIsIG5hbWUpOwotCWNyZWF0ZV9jb21tYW5kKG5hbWUsaW5hbWUpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpsaW5rX3ZhcmlhYmxlKGNoYXIgKm5hbWUsIGNoYXIgKmluYW1lLCBEYXRhVHlwZSAqdCkKLS8vCi0vLyBDcmVhdGUgYSBsaW5rIHRvIGEgQyB2YXJpYWJsZS4KLS8vCQluYW1lID0gTmFtZSBvZiBDIHZhcmlhYmxlCi0vLwkJaW5hbWUgPSBOYW1lIG9mIHZhcmlhYmxlIGluIHNjcmlwdGluZyBsYW5ndWFnZQotLy8JCXQgPSBEYXRhdHlwZSBvZiB0aGUgdmFyaWFibGUKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBNWUxBTkc6OmxpbmtfdmFyaWFibGUoY2hhciAqbmFtZSwgY2hhciAqaW5hbWUsIERhdGFUeXBlICp0KSB7Ci0JZnByaW50ZihmX2luaXQsIlx0IExpbmtpbmcgdmFyaWFibGUgOiAlc1xuIiwgaW5hbWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6ZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsIGNoYXIgKnZhbHVlKQotLy8KLS8vIE1ha2VzIGEgY29uc3RhbnQuIAotLy8JCW5hbWUgPSBOYW1lIG9mIHRoZSBjb25zdGFudAotLy8gCQlpbmFtZSA9IFNjcmlwdGluZyBsYW5ndWFnZSBuYW1lIG9mIGNvbnN0YW50Ci0vLwkJdHlwZSA9IERhdGF0eXBlIG9mIHRoZSBjb25zdGFudAotLy8JCXZhbHVlID0gQ29uc3RhbnQgdmFsdWUgKGFzIGEgc3RyaW5nKQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6ZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsIGNoYXIgKnZhbHVlKSB7Ci0JZnByaW50ZihmX2luaXQsIlx0IENyZWF0aW5nIGNvbnN0YW50IDogJXMgPSAlc1xuIiwgbmFtZSwgdmFsdWUpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UbyBjb21waWxlIG91ciBuZXcgbGFuZ3VhZ2UsIHdlIHdyaXRlIGEgbWFpbiBwcm9ncmFtIChhcyBkZXNjcmliZWQgcHJldmlvdXNseSkgYW5kIGRvIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgZysrIG1haW4uY3h4IG15bGFuZy5jeHggLUkvdXNyL2xvY2FsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL2xpYiAtbHN3aWcgLW8gbXlzd2lnCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdywgdHJ5IHJ1bm5pbmcgdGhpcyBuZXcgdmVyc2lvbiBvZiBTV0lHIG9uIGEgZmV3IGludGVyZmFjZSBmaWxlcyB0byBzZWUgd2hhdCBoYXBwZW5zLiBUaGUgdmFyaW91cyA8dHQ+cHJpbnRmKCk8L3R0PiBzdGF0ZW1lbnRzIHdpbGwgc2hvdyB5b3Ugd2hlcmUgb3V0cHV0IGFwcGVhcnMgYW5kIGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLiBGb3IgZXhhbXBsZSwgaWYgd2UgcnVuIHRoaXMgbW9kdWxlIG9uIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBleGFtcGxlLmkgKi8KLSVtb2R1bGUgZXhhbXBsZQotJXsKLS8qIFB1dCBoZWFkZXJzIGFuZCBvdGhlciBkZWNsYXJhdGlvbnMgaGVyZSAqLwotJX0KLQotLy8gQSBmdW5jdGlvbgotZXh0ZXJuIGRvdWJsZSBmb28oZG91YmxlIGEsIGRvdWJsZSBiKTsKLQotLy8gQSB2YXJpYWJsZQotZXh0ZXJuIGludCBiYXI7Ci0KLS8vIEEgY29uc3RhbnQKLSNkZWZpbmUgU1BBTSA0MgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XZSBnZXQgdGhlIGZvbGxvd2luZyBvdXRwdXQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qCi0gKiBGSUxFIDogZXhhbXBsZV93cmFwLmMKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IDoKLSAqIFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciAoU1dJRykKLSAqIFZlcnNpb24gMS4xICAoRmluYWwpCi0gKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcKLSAqIFRoZSBVbml2ZXJzaXR5IG9mIFV0YWggYW5kIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGlzIGZpbGUgaW4gYW55IG1hbm5lciBwcm92aWRlZAotICogdGhpcyBub3RpY2UgcmVtYWlucyBpbnRhY3QuCi0gKgotICogRG8gbm90IG1ha2UgY2hhbmdlcyB0byB0aGlzIGZpbGUtLWNoYW5nZXMgd2lsbCBiZSBsb3N0IQotICoKLSAqLwotCi0KLSNkZWZpbmUgU1dJR0NPREUKLS8qIEltcGxlbWVudGF0aW9uIDogTXkgTGFuZ3VhZ2UgKi8KLQotCi0vKiBQdXQgaGVhZGVycyBhbmQgb3RoZXIgZGVjbGFyYXRpb25zIGhlcmUgKi8KLWV4dGVybiBkb3VibGUgZm9vKGRvdWJsZSAsZG91YmxlICk7Ci1leHRlcm4gaW50ICBiYXI7Ci0KLXdyYXBfZm9vKCkgeyB9Ci0KLWludCBleGFtcGxlX2luaXRpYWxpemUoKSB7Ci0gICAgICAgICBDcmVhdGluZyBjb21tYW5kIGZvbwotICAgICAgICAgTGlua2luZyB2YXJpYWJsZSA6IGJhcgotICAgICAgICAgQ3JlYXRpbmcgY29uc3RhbnQgOiBTUEFNID0gNDIKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTG9va2luZyBhdCB0aGUgbGFuZ3VhZ2UgbW9kdWxlIGFuZCB0aGUgb3V0cHV0IGdpdmVzIHNvbWUgaWRlYSBvZiBob3cgdGhpbmdzIGFyZSBzdHJ1Y3R1cmVkLiAgVGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZpbGUgaXMgYSBiYW5uZXIgbWVzc2FnZSBwcmludGVkIGJ5IHRoZSA8dHQ+ZW1pdF9iYW5uZXIoKTwvdHQ+IGZ1bmN0aW9uLiAgICBUaGUgImV4dGVybiIgZGVjbGFyYXRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkIGJ5IHRoZSBTV0lHIGNvbXBpbGVyIHdoZW4gdXNlIGFuIGV4dGVybiBtb2RpZmllci4gICBUaGUgd3JhcHBlciBmdW5jdGlvbnMgYXBwZWFyIGFmdGVyIGFsbCBvZiB0aGUgaGVhZGVycyBhbmQgZm9yd2FyZCBkZWNsYXJhdGlvbnMuICBGaW5hbGx5LCAgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIHdyaXR0ZW4uPHA+Ci08cD4KLUl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhpcyBtaW5pbWFsIG1vZHVsZSBpcyBlbm91Z2ggdG8gdXNlIHZpcnR1YWxseSBhbGwgYXNwZWN0cyBvZiBTV0lHLiBJZiB3ZSBmZWVkIFNXSUcgYSBDKysgZmlsZSwgd2Ugd2lsbCBzZWUgb3VyIGxvdy1sZXZlbCBtb2R1bGUgZnVuY3Rpb25zIGJlaW5nIGNhbGxlZCBldmVuIHRob3VnaCB3ZSBoYXZlIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgYW55IEMrKyBoYW5kbGluZyAodGhpcyBpcyBkdWUgdG8gdGhlIGxheWVyZWQgYXBwcm9hY2ggb2YgaW1wbGVtZW50aW5nIEMrKyBvbiB0b3Agb2YgQykuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbW9kdWxlIGV4YW1wbGUKLXN0cnVjdCBWZWN0b3IgewotICAgICAgICBkb3VibGUgeCx5LHo7Ci0gICAgICAgIFZlY3RvcigpOwotICAgICAgICB+VmVjdG9yKCk7Ci0gICAgICAgIGRvdWJsZSBtYWduaXR1ZGUoKTsKLX07Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXByb2R1Y2VzIGFjY2Vzc29yIGZ1bmN0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBvdXRwdXQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qCi0gKiBGSUxFIDogZXhhbXBsZV93cmFwLmMKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IDoKLSAqIFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciAoU1dJRykKLSAqIFZlcnNpb24gMS4xICAoRmluYWwpCi0gKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcKLSAqIFRoZSBVbml2ZXJzaXR5IG9mIFV0YWggYW5kIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gZGlzdHJpYnV0ZSB0aGlzIGZpbGUgaW4gYW55IG1hbm5lciBwcm92aWRlZAotICogdGhpcyBub3RpY2UgcmVtYWlucyBpbnRhY3QuCi0gKgotICogRG8gbm90IG1ha2UgY2hhbmdlcyB0byB0aGlzIGZpbGUtLWNoYW5nZXMgd2lsbCBiZSBsb3N0IQotICoKLSAqLwotCi0KLSNkZWZpbmUgU1dJR0NPREUKLS8qIEltcGxlbWVudGF0aW9uIDogTXkgTGFuZ3VhZ2UgKi8KLQotc3RhdGljIGRvdWJsZSAgVmVjdG9yX3hfc2V0KFZlY3RvciAqb2JqLCBkb3VibGUgIHZhbCkgewotICAgIG9iai0mZ3Q7eCA9IHZhbDsKLSAgICByZXR1cm4gdmFsOwotfQotCi13cmFwX1ZlY3Rvcl94X3NldCgpIHsgfQotCi1zdGF0aWMgZG91YmxlICBWZWN0b3JfeF9nZXQoVmVjdG9yICpvYmopIHsKLSAgICBkb3VibGUgIHJlc3VsdDsKLSAgICByZXN1bHQgPSAoZG91YmxlICkgb2JqLSZndDt4OwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXdyYXBfVmVjdG9yX3hfZ2V0KCkgeyB9Ci0KLXN0YXRpYyBkb3VibGUgIFZlY3Rvcl95X3NldChWZWN0b3IgKm9iaiwgZG91YmxlICB2YWwpIHsKLSAgICBvYmotJmd0O3kgPSB2YWw7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotd3JhcF9WZWN0b3JfeV9zZXQoKSB7IH0KLQotc3RhdGljIGRvdWJsZSAgVmVjdG9yX3lfZ2V0KFZlY3RvciAqb2JqKSB7Ci0gICAgZG91YmxlICByZXN1bHQ7Ci0gICAgcmVzdWx0ID0gKGRvdWJsZSApIG9iai0mZ3Q7eTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi13cmFwX1ZlY3Rvcl95X2dldCgpIHsgfQotCi1zdGF0aWMgZG91YmxlICBWZWN0b3Jfel9zZXQoVmVjdG9yICpvYmosIGRvdWJsZSAgdmFsKSB7Ci0gICAgb2JqLSZndDt6ID0gdmFsOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLXdyYXBfVmVjdG9yX3pfc2V0KCkgeyB9Ci0KLXN0YXRpYyBkb3VibGUgIFZlY3Rvcl96X2dldChWZWN0b3IgKm9iaikgewotICAgIGRvdWJsZSAgcmVzdWx0OwotICAgIHJlc3VsdCA9IChkb3VibGUgKSBvYmotJmd0O3o7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotd3JhcF9WZWN0b3Jfel9nZXQoKSB7IH0KLQotc3RhdGljIFZlY3RvciAqbmV3X1ZlY3RvcigpIHsKLSAgICByZXR1cm4gbmV3IFZlY3RvcigpOwotfQotCi13cmFwX25ld19WZWN0b3IoKSB7IH0KLQotc3RhdGljIHZvaWQgZGVsZXRlX1ZlY3RvcihWZWN0b3IgKm9iaikgewotICAgIGRlbGV0ZSBvYmo7Ci19Ci0KLXdyYXBfZGVsZXRlX1ZlY3RvcigpIHsgfQotCi1zdGF0aWMgZG91YmxlICBWZWN0b3JfbWFnbml0dWRlKFZlY3RvciAqb2JqKSB7Ci0gICAgZG91YmxlICBfcmVzdWx0ID0gKGRvdWJsZSApb2JqLSZndDttYWduaXR1ZGUoKTsKLSAgICByZXR1cm4gX3Jlc3VsdDsKLX0KLQotd3JhcF9WZWN0b3JfbWFnbml0dWRlKCkgeyB9Ci0KLWludCBleGFtcGxlX2luaXRpYWxpemUoKSB7Ci0gICAgICAgICBDcmVhdGluZyBjb21tYW5kIFZlY3Rvcl94X3NldAotICAgICAgICAgQ3JlYXRpbmcgY29tbWFuZCBWZWN0b3JfeF9nZXQKLSAgICAgICAgIENyZWF0aW5nIGNvbW1hbmQgVmVjdG9yX3lfc2V0Ci0gICAgICAgICBDcmVhdGluZyBjb21tYW5kIFZlY3Rvcl95X2dldAotICAgICAgICAgQ3JlYXRpbmcgY29tbWFuZCBWZWN0b3Jfel9zZXQKLSAgICAgICAgIENyZWF0aW5nIGNvbW1hbmQgVmVjdG9yX3pfZ2V0Ci0gICAgICAgICBDcmVhdGluZyBjb21tYW5kIG5ld19WZWN0b3IKLSAgICAgICAgIENyZWF0aW5nIGNvbW1hbmQgZGVsZXRlX1ZlY3RvcgotICAgICAgICAgQ3JlYXRpbmcgY29tbWFuZCBWZWN0b3JfbWFnbml0dWRlCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdpdGgganVzdCBhIGxpdHRsZSB3b3JrLCB3ZSBhbHJlYWR5IHNlZSB0aGF0IFNXSUcgZG9lcyBxdWl0ZSBhbG90IGZvciB1cy4gICBOb3cgb3VyIHRhc2sgaXMgdG8gZmlsbCBpbiB0aGUgdmFyaW91cyBMYW5ndWFnZSBtZXRob2RzIHdpdGggdGhlIHJlYWwgY29kZSBuZWVkZWQgdG8gcHJvZHVjZSBhIHdvcmtpbmcgbW9kdWxlLiAgIEJlZm9yZSBkb2luZyB0aGF0LCB3ZSBmaXJzdCBuZWVkIHRvIHRha2UgYSB0b3VyIG9mIHNvbWUgaW1wb3J0YW50IFNXSUcgZGF0YXR5cGVzIGFuZCBmdW5jdGlvbnMuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gQSB0b3VyIG9mIFNXSUcgZGF0YXR5cGVzPC9oMj4KLVdoaWxlIFNXSUcgaGFzIGJlY29tZSBzb21ld2hhdCBjb21wbGljYXRlZCBvdmVyIHRoZSBsYXN0IHllYXIsIGl0cyBpbnRlcm5hbCBvcGVyYXRpb24gaXMgYmFzZWQgb24ganVzdCBhIGZldyBmdW5kYW1lbnRhbCBkYXRhdHlwZXMuIFRoZXNlIHR5cGVzIGFyZSBkZXNjcmliZWQgbm93IGFsdGhvdWdoIGV4YW1wbGVzIG9mIHVzaW5nIHRoZSB2YXJpb3VzIGRhdGF0eXBlcyBhcmUgc2hvd24gbGF0ZXIuPHA+Ci08YSBuYW1lPSJuMjEiPjwvYT48aDM+IFRoZSBEYXRhVHlwZSBjbGFzczwvaDM+Ci1BbGwgQyBkYXRhdHlwZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0KLWNsYXNzIERhdGFUeXBlIHsKLXB1YmxpYzoKLQlEYXRhVHlwZSgpOwotCURhdGFUeXBlKERhdGFUeXBlICopOwotCX5EYXRhVHlwZSgpOwotCWludCAgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAgIC8vIFNXSUcgVHlwZSBjb2RlCi0JY2hhciAgICAgICAgbmFtZVtNQVhOQU1FXTsgICAgICAgLy8gTmFtZSBvZiB0eXBlCi0JY2hhciAgICAgICAgaXNfcG9pbnRlcjsgICAgICAgICAgLy8gSXMgdGhpcyBhIHBvaW50ZXI/Ci0JY2hhciAgICAgICAgaW1wbGljaXRfcHRyOyAgICAgICAgLy8gSW1wbGljaXQgcHRyCi0JY2hhciAgICAgICAgaXNfcmVmZXJlbmNlOyAgICAgICAgLy8gQSBDKysgcmVmZXJlbmNlIHR5cGUKLQljaGFyICAgICAgICBzdGF0dXM7ICAgICAgICAgICAgICAvLyBJcyB0aGlzIGRhdGF0eXBlIHJlYWQtb25seT8KLQljaGFyICAgICAgICAqcXVhbGlmaWVyOyAgICAgICAgICAvLyBBIHF1YWxpZmllciBzdHJpbmcgKGllLiBjb25zdCkuCi0JY2hhciAgICAgICAgKmFycmF5c3RyOyAgICAgICAgICAgLy8gU3RyaW5nIGNvbnRhaW5pbmcgYXJyYXkgcGFydAotCWludCAgICAgICAgIGlkOyAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpZmllciAodW5pcXVlIGZvciBldmVyeSB0eXBlKS4KLQkvLyBPdXRwdXQgbWV0aG9kcwotCWNoYXIgICAgICAgKnByaW50X3R5cGUoKTsgICAgICAgIC8vIFJldHVybiBzdHJpbmcgY29udGFpbmluZyBkYXRhdHlwZQotCWNoYXIgICAgICAgKnByaW50X2Z1bGwoKTsgICAgICAgIC8vIFJldHVybiBzdHJpbmcgd2l0aCBmdWxsIGRhdGF0eXBlCi0JY2hhciAgICAgICAqcHJpbnRfY2FzdCgpOyAgICAgICAgLy8gUmV0dXJuIHN0cmluZyBmb3IgdHlwZSBjYXN0aW5nCi0JY2hhciAgICAgICAqcHJpbnRfbWFuZ2xlKCk7ICAgICAgLy8gUmV0dXJuIG1hbmdsZWQgdmVyc2lvbiBvZiB0eXBlCi0JY2hhciAgICAgICAqcHJpbnRfbWFuZ2xlX2RlZmF1bHQoKTsgLy8gRGVmYXVsdCBtYW5nbGluZyBzY2hlbWUKLQljaGFyICAgICAgICpwcmludF9yZWFsKCk7ICAgICAgICAvLyBQcmludCB0aGUgcmVhbCBkYXRhdHlwZQotCWNoYXIgICAgICAgKnByaW50X2FycmF5Y2FzdCgpOyAgIC8vIFByaW50cyBhbiBhcnJheSBjYXN0Ci0JLy8gQXJyYXkgcXVlcnkgZnVuY3Rpb25zCi0JaW50ICAgICAgICBhcnJheV9kaW1lbnNpb25zKCk7ICAgLy8gUmV0dXJuIG51bWJlciBvZiBhcnJheSBkaW1lbnNpb25zIChpZiBhbnkpCi0JY2hhciAgICAgICAqZ2V0X2RpbWVuc2lvbihpbnQpOyAgLy8gUmV0dXJuIHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIGRpbWVuc2lvbgotfTsKLQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZnVuZGFtZW50YWwgQyBkYXRhdHlwZXMgYXJlIGdpdmVuIGEgdW5pcXVlIG51bWVyaWNhbCBjb2RlIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgPHR0PnR5cGU8L3R0PiBmaWVsZC4gVGhlIGN1cnJlbnQgbGlzdCBvZiB0eXBlcyBpcyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5DIERhdGF0eXBlICAgICAgICAgICAgICAgICAgICAgICAgIFNXSUcgVHlwZSBDb2RlCi1pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0lOVAotc2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9TSE9SVAotbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9MT05HCi1jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NIQVIKLWZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRkxPQVQKLWRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFCi12b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1ZPSUQKLXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgICAgIFRfVUlOVAotdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgICAgICAgVF9VU0hPUlQKLXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgICAgIFRfVUxPTkcKLXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgICAgIFRfVUNIQVIKLXNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgIFRfU0NIQVIKLWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQk9PTAotJmx0O3VzZXImZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9VU0VSCi1lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0VSUk9SCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSA8dHQ+VF9VU0VSPC90dD4gdHlwZSBpcyB1c2VkIGZvciBhbGwgZGVyaXZlZCBkYXRhdHlwZXMgaW5jbHVkaW5nIHN0cnVjdHVyZXMgYW5kIGNsYXNzZXMuIFRoZSA8dHQ+VF9FUlJPUjwvdHQ+IHR5cGUgaW5kaWNhdGVzIHRoYXQgYSBwYXJzZS90eXBlIGVycm9yIGhhcyBvY2N1cnJlZCBhbmQgd2VudCB1bmRldGVjdGVkIChhcyBmYXIgYXMgSSBrbm93IHRoaXMgZG9lc24ndCBoYXBwZW4pLjxwPgotPHA+Ci1UaGUgPHR0Pm5hbWVbXTwvdHQ+IGZpZWxkIGNvbnRhaW5zIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUgZGF0YXR5cGUgYXMgc2VlbiBieSB0aGUgcGFyc2VyIGFuZCBpcyBjdXJyZW50bHkgbGltaXRlZCB0byBhIG1heGltdW0gb2YgOTYgYnl0ZXMgKG1vcmUgdGhhbiBlbm91Z2ggZm9yIG1vc3QgYXBwbGljYXRpb25zKS4gIElmIGEgdHlwZWRlZiBoYXMgYmVlbiB1c2VkLCB0aGUgbmFtZSBmaWVsZCBjb250YWlucyB0aGUgYWN0dWFsIG5hbWUgdXNlZCwgbm90IHRoZSBuYW1lIG9mIHRoZSBwcmltaXRpdmUgQyBkYXRhdHlwZS4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+QyBEYXRhdHlwZSAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAgbmFtZVtdCi1kb3VibGUgICAgICAgICAgICAgICAgVF9ET1VCTEUgICAgICAgICAgICBkb3VibGUKLXVuc2lnbmVkIGludCAgICAgICAgICBUX1VJTlQgICAgICAgICAgICAgIHVuc2lnbmVkIGludAotc2lnbmVkIGxvbmcgICAgICAgICAgIFRfTE9ORyAgICAgICAgICAgICAgc2lnbmVkIGxvbmcKLXN0cnVjdCBWZWN0b3IgICAgICAgICBUX1VTRVIgICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IKLVJlYWwgICAgICAgICAgICAgICAgICBUX0RPVUJMRSAgICAgICAgICAgIFJlYWwKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQyBxdWFsaWZpZXJzIHN1Y2ggYXMgIjx0dD5jb25zdDwvdHQ+IiBvciAiPHR0PnZvbGF0aWxlPC90dD4iIGFyZSBzdG9yZWQgc2VwYXJhdGVseSBpbiB0aGUgPHR0PnF1YWxpZmllcjwvdHQ+IGZpZWxkLiBJbiBvcmRlciB0byBwcm9kdWNlIHVzYWJsZSB3cmFwcGVyIGNvZGUsIFNXSUcgb2Z0ZW4gbmVlZHMgdG8gc3RyaXAgdGhlIHF1YWxpZmllcnMuIEZvciBleGFtcGxlLCB0cnlpbmcgdG8gYXNzaWduIGEgcGFzc2VkIGZ1bmN0aW9uIGFyZ3VtZW50IGludG8gYSB0eXBlIG9mICI8dHQ+Y29uc3QgaW50PC90dD4iIHdpbGwgaXJyaXRhdGUgbW9zdCBjb21waWxlcnMuIFVuZm9ydHVuYXRlbHksIHRoaXMga2luZCBvZiBhc3NpZ25tZW50IGlzIHVuYXZvaWRhYmxlIHdoZW4gY29udmVydGluZyBhcmd1bWVudHMgYmV0d2VlbiBhIHNjcmlwdGluZyBhbmQgQyByZXByZXNlbnRhdGlvbi48cD4KLTxwPgotVGhlIDx0dD5pc19wb2ludGVyPC90dD4gZmllbGQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgcGFydGljdWxhciBkYXRhdHlwZSBpcyBhIHBvaW50ZXIuIFRoZSB2YWx1ZSBvZiA8dHQ+aXNfcG9pbnRlcjwvdHQ+IGRldGVybWluZXMgdGhlIGxldmVsIG9mIGluZGlyZWN0aW9uIHVzZWQuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5DIERhdGF0eXBlICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgICAgaXNfcG9pbnRlcgotZG91YmxlICogICAgICAgICAgICAgVF9ET1VCTEUgICAgICAgICAgICAgIDEKLWludCAqKiogICAgICAgICAgICAgIFRfSU5UICAgICAgICAgICAgICAgICAzCi1jaGFyICogICAgICAgICAgICAgICBUX0NIQVIgICAgICAgICAgICAgICAgMQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PmltcGxpY2l0X3B0cjwvdHQ+IGZpZWxkIGlzIGFuIGludGVybmFsbHkgdXNlZCBwYXJhbWV0ZXIgdGhhdCBpcyB1c2VkIHRvIHByb3Blcmx5IGhhbmRsZSB0aGUgdXNlIG9mIHBvaW50ZXJzIGluIHR5cGVkZWYgc3RhdGVtZW50cy4gSG93ZXZlciwgZm9yIHRoZSBjdXJpb3VzLCBpbiBpbmRpY2F0ZXMgdGhlIGxldmVsIG9mIGluZGlyZWN0aW9uIGltcGxpY2l0bHkgZGVmaW5lZCBpbiBhIGRhdGF0eXBlLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBjaGFyICpTdHJpbmc7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWlzIHJlcHJlc2VudGVkIGJ5IGEgZGF0YXR5cGUgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGUgICAgICAgICAgID0gVF9DSEFSOwotbmFtZVtdICAgICAgICAgPSAiU3RyaW5nIjsKLWlzX3BvaW50ZXIgICAgID0gMTsKLWltcGxpY2l0X3B0ciAgID0gMTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm9ybWFsbHksIGxhbmd1YWdlIG1vZHVsZXMgZG8gbm90IHdvcnJ5IGFib3V0IHRoZSA8dHQ+aW1wbGljaXRfcHRyIDwvdHQ+ZmllbGQuPHA+Ci08cD4KLUMrKyByZWZlcmVuY2VzIGFyZSBpbmRpY2F0ZWQgYnkgdGhlIDx0dD5pc19yZWZlcmVuY2U8L3R0PiBmaWVsZC4gQnkgZGVmYXVsdCwgdGhlIHBhcnNlciBjb252ZXJ0cyByZWZlcmVuY2VzIGludG8gcG9pbnRlcnMgd2hpY2ggbWFrZXMgdGhlbSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG90aGVyIHBvaW50ZXIgZGF0YXR5cGVzLiBIb3dldmVyLCBrbm93aW5nIHRoYXQgc29tZXRoaW5nIGlzIGEgcmVmZXJlbmNlIGVmZmVjdHMgc29tZSBjb2RlIGdlbmVyYXRpb24gcHJvY2VkdXJlcyBzbyB0aGlzIGZpZWxkIGNhbiBiZSBjaGVja2VkIHRvIHNlZSBpZiBhIGRhdGF0eXBlIHJlYWxseSBpcyBhIEMrKyByZWZlcmVuY2UuPHA+Ci08cD4KLVRoZSA8dHQ+YXJyYXlzdHI8L3R0PiBmaWVsZCBpcyB1c2VkIHRvIGhvbGQgdGhlIGFycmF5IGRpbWVuc2lvbnMgb2YgYXJyYXkgZGF0YXR5cGVzLiBUaGUgZGltZW5zaW9ucyBhcmUgc2ltcGx5IHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+QyBEYXRhdHlwZSAgICAgICAgICAgIHR5cGUgICAgICAgICAgaXNfcG9pbnRlciAgICAgICAgYXJyYXlzdHIKLWRvdWJsZSBhWzUwXSAgICAgICAgICBUX0RPVUJMRSAgICAgICAxICAgICAgICAgICAgICAgIFs1MF0KLWludCBiWzIwXVszMF1bNTBdICAgICBUX0lOVCAgICAgICAgICAxICAgICAgICAgICAgICAgIFsyMF1bMzBdWzUwXQotY2hhciAqW01BWF0gICAgICAgICAgIFRfQ0hBUiAgICAgICAgIDIgICAgICAgICAgICAgICAgW01BWF0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU1dJRyBjb252ZXJ0cyBhbGwgYXJyYXlzIGludG8gcG9pbnRlcnMuIFRodXMgYSAiPHR0PmRvdWJsZSBbNTBdPC90dD4iIGlzIHJlYWxseSBqdXN0IGEgc3BlY2lhbCB2ZXJzaW9uIG9mICI8dHQ+ZG91YmxlICo8L3R0PiIuIElmIGEgZGF0YXR5cGUgaXMgbm90IGRlY2xhcmVkIGFzIGFuIGFycmF5LCB0aGUgPHR0PmFycmF5c3RyPC90dD4gZmllbGQgY29udGFpbnMgdGhlIE5VTEwgcG9pbnRlci48cD4KLTxwPgotQSBjb2xsZWN0aW9uIG9mICJvdXRwdXQiIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSBmb3IgZGF0YXR5cGVzLiBUaGUgbmFtZXMgb2YgdGhlc2UgbWV0aG9kcyBhcmUgbWFpbmx5ICJoaXN0b3JpY2FsIiBpbiB0aGF0IHRoZXkgZG9uJ3QgYWN0dWFsbHkgInByaW50IiBhbnl0aGluZywgYnV0IG5vdyByZXR1cm4gY2hhcmFjdGVyIHN0cmluZ3MgaW5zdGVhZC4gQXNzdW1pbmcgdGhhdCA8dHQ+dDwvdHQ+IGlzIGEgZGF0YXR5cGUgcmVwcmVzZW50aW5nIHRoZSBDIGRhdGF0eXBlICI8dHQ+Y29uc3QgaW50ICo8L3R0PiIsIGhlcmUncyB3aGF0IHRoZSBtZXRob2RzIHByb2R1Y2UgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPk9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dAotdC0mZ3Q7cHJpbnRfdHlwZSgpICAgICAgICAgICAgICAgICAgICAgaW50ICoKLXQtJmd0O3ByaW50X2Z1bGwoKSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqCi10LSZndDtwcmludF9jYXN0KCkgICAgICAgICAgICAgICAgICAgICAoaW50ICopCi10LSZndDtwcmludF9tYW5nbGUoKSAgICAgICAgICAgICAgICAgICAmbHQ7IGxhbmd1YWdlIGRlcGVuZGVudCAmZ3Q7Ci10LSZndDtwcmludF9tYW5nbGVfZGVmYXVsdCgpICAgICAgICAgICBfaW50X3AKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQSBmZXcgYWRkaXRpb25hbCBvdXRwdXQgbWV0aG9kcyBhcmUgcHJvdmlkZWQgZm9yIGRlYWxpbmcgd2l0aCBhcnJheXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGUgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgT3V0cHV0Ci1pbnQgYVs1MF0gICAgICAgICAgICB0LSZndDtwcmludF90eXBlKCkgICAgICAgICAgICAgIGludCAqCi1pbnQgYVs1MF0gICAgICAgICAgICB0LSZndDtwcmludF9yZWFsKCkgICAgICAgICAgICAgIGludCBbNTBdCi1pbnQgYVs1MF0gICAgICAgICAgICB0LSZndDtwcmludF9hcnJheWNhc3QoKSAgICAgICAgIChpbnQgKikKLWludCBhWzUwXVs1MF0gICAgICAgIHQtJmd0O3ByaW50X2FycmF5Y2FzdCgpICAgICAgICAgKGludCAoKilbNTBdKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGFycmF5cyBpcyBhbHNvIGF2YWlsYWJsZSB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZSAgICAgICAgICAgICAgICAgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICBSZXN1bHQKLWludCBhWzUwXSAgICAgICAgICAgIHQtJmd0O2FycmF5X2RpbWVuc2lvbigpICAgICAgICAgMQotaW50IGFbNTBdICAgICAgICAgICAgdC0mZ3Q7Z2V0X2RpbWVuc2lvbigwKSAgICAgICAgICA1MAotaW50IGJbTUFYTl1bMTBdICAgICAgdC0mZ3Q7YXJyYXlfZGltZW5zaW9uKCkgICAgICAgICAyCi1pbnQgYltNQVhOXVsxMF0gICAgICB0LSZndDtnZXRfZGltZW5zaW9uKDApICAgICAgICAgIE1BWE4KLWludCBiW01BWE5dWzEwXSAgICAgIHQtJmd0O2dldF9kaW1lbnNpb24oMSkgICAgICAgICAgMTAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5EYXRhVHlwZTwvdHQ+IGNsYXNzIGNvbnRhaW5zIGEgdmFyaWV0eSBvZiBvdGhlciBtZXRob2RzIGZvciBtYW5hZ2luZyB0eXBlZGVmcywgc2NvcGluZywgYW5kIG90aGVyIG9wZXJhdGlvbnMuICAgIFRoZXNlIGFyZSB1c3VhbGx5IG9ubHkgdXNlZCBieSB0aGUgU1dJRyBwYXJzZXIuICAgV2hpbGUgYXZhaWxhYmxlIHRvIGxhbmd1YWdlIG1vZHVsZXMgdG9vLCB0aGV5IGFyZSBuZXZlciB1c2VkIChhdCBsZWFzdCBub3QgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pLCBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIGF2b2lkZWQgdW5sZXNzIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgKG5vdCB0aGF0IHRoaXMgaXMgYSBzdHJpY3QgcmVxdWlyZW1lbnQgb2YgY291cnNlKS48cD4KLTxhIG5hbWU9Im4yMiI+PC9hPjxoMz4gRnVuY3Rpb24gUGFyYW1ldGVyczwvaDM+Ci1FYWNoIGFyZ3VtZW50IG9mIGEgZnVuY3Rpb24gY2FsbCBpcyByZXByZXNlbnRlZCB1c2luZyB0aGUgPHR0PlBhcm08L3R0PiBzdHJ1Y3R1cmUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN0cnVjdCBQYXJtIHsKLQlQYXJtKERhdGFUeXBlICp0eXBlLCBjaGFyICpuYW1lKTsKLQlQYXJtKFBhcm0gKnApOwotCX5QYXJtKCk7Ci0JRGF0YVR5cGUgICAqdDsgICAgICAgICAgICAgICAgLy8gRGF0YXR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLQlpbnQgICAgICAgIGNhbGxfdHlwZTsgICAgICAgICAvLyBDYWxsIHR5cGUgKHZhbHVlIG9yIHJlZmVyZW5jZSBvciB2YWx1ZSkKLQljaGFyICAgICAgICpuYW1lOyAgICAgICAgICAgICAvLyBOYW1lIG9mIHBhcmFtZXRlciAob3B0aW9uYWwpCi0JY2hhciAgICAgICAqZGVmdmFsdWU7ICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSAoYXMgYSBzdHJpbmcpCi0JaW50ICAgICAgICBpZ25vcmU7ICAgICAgICAgICAgLy8gSWdub3JlIGZsYWcKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0dD50PC90dD4gaXMgdGhlIGRhdGF0eXBlIG9mIHRoZSBwYXJhbWV0ZXIsIDx0dD5uYW1lPC90dD4gaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG5hbWUsIGFuZCA8dHQ+ZGVmdmFsdWU8L3R0PiBpcyBhIGRlZmF1bHQgYXJndW1lbnQgdmFsdWUgKGlmIHN1cHBsaWVkKS4gPHA+Ci08cD4KLTx0dD5jYWxsX3R5cGU8L3R0PiBpcyBhbiBpbnRlZ2VyIGNvZGUgZGVzY3JpYmluZyBhbnkgc3BlY2lhbCBwcm9jZXNzaW5nLiAgSXQgY2FuIGJlIG9uZSBvZiB0d28gdmFsdWVzIDo8cD4KLTxwPgotPHVsPgotPGxpPjx0dD5DQUxMX1ZBTFVFPC90dD4uICBUaGlzIG1lYW5zIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciwgYnV0IHdlIHNob3VsZCBtYWtlIGl0IHdvcmsgbGlrZSBhIGNhbGwtYnktdmFsdWUgYXJndW1lbnQgaW4gdGhlIHNjcmlwdGluZyBpbnRlcmZhY2UuICAgVGhpcyB2YWx1ZSB1c2VkIHRvIGJlIHNldCBieSB0aGUgPHR0PiV2YWw8L3R0PiBkaXJlY3RpdmUsIGJ1dCB0aGlzIGFwcHJvYWNoIGlzIG5vdyBkZXByZWNhdGVkIChzaW5jZSB0aGUgc2FtZSBlZmZlY3QgY2FuIGJlIGFjaGlldmVkIGJ5IHR5cGVtYXBzKS4KLTxsaT48dHQ+Q0FMTF9SRUZFUkVOQ0U8L3R0Pi4gIFRoaXMgaXMgc2V0IHdoZW4gYSBjb21wbGV4IGRhdGF0eXBlIGlzIGJlaW5nIHBhc3NlZCBieSB2YWx1ZSB0byBhIGZ1bmN0aW9uLiAgU2luY2UgU1dJRyBjYW4ndCBoYW5kbGUgY29tcGxleCBkYXRhdHlwZXMgYnkgdmFsdWUsIHRoZSBkYXRhdHlwZSBpcyBpbXBsaWNpdGx5IGNoYW5nZWQgaW50byBhIHBvaW50ZXIgYW5kPHR0PiBjYWxsX3R5cGU8L3R0PiBzZXQgdG8gPHR0PkNBTExfUkVGRVJFTkNFPC90dD4uICAgIE1hbnkgb2YgU1dJRydzIGludGVybmFscyBsb29rIGF0IHRoaXMgd2hlbiBnZW5lcmF0aW5nIGNvZGUuICAgIEEgY29tbW9uIG1pc3Rha2UgaXMgZm9yZ2V0dGluZyB0aGF0IGFsbCBjb21wbGV4IGRhdGF0eXBlcyBpbiBTV0lHIGFyZSBwb2ludGVycy4gICAgVGhpcyBpcyBldmVuIHRoZSBjYXNlIHdoZW4gd3JpdGluZyBhIGxhbmd1YWdlLW1vZHVsZS0tLXRoZSBjb252ZXJzaW9uIHRvIHBvaW50ZXJzIHRha2VzIHBsYWNlIGluIHRoZSBwYXJzZXIgYmVmb3JlIGRhdGEgaXMgZXZlbiBwYXNzZWQgaW50byBhIHBhcnRpY3VsYXIgbW9kdWxlLgotPC91bD4KLTxwPgotVGhlIDx0dD5pZ25vcmU8L3R0PiBmaWVsZCBpcyBzZXQgd2hlbiBTV0lHIGRldGVjdHMgdGhhdCBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB0byBiZSAiaWdub3JlZCIgd2hlbiBnZW5lcmF0aW5nIHdyYXBwZXIgZnVuY3Rpb25zLiAgIEFuICJpZ25vcmVkIiBwYXJhbWV0ZXIgaXMgdXN1YWxseSBzZXQgdG8gYSBkZWZhdWx0IHZhbHVlIGFuZCBlZmZlY3RpdmVseSBkaXNhcHBlYXJzIHdoZW4gYSBmdW5jdGlvbiBjYWxsIGlzIG1hZGUgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSAodGhhdCBpcywgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGZld2VyIGFyZ3VtZW50cyB0aGFuIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlKS4gICAgIFRoZSAgPHR0Pmlnbm9yZTwvdHQ+IGZpZWxkIGlzIG5vcm1hbGx5IG9ubHkgc2V0IHdoZW4gYW4gImlnbm9yZSIgdHlwZW1hcCAgaGFzIGJlZW4gdXNlZC48cD4KLTxwPgotQWxsIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgaW4gdGhlIHN0cnVjdHVyZSA8dHQ+UGFybUxpc3Q8L3R0Pi4gICAgVGhpcyBzdHJ1Y3R1cmUgaGFzIHRoZSBmb2xsb3dpbmcgdXNlci1hY2Nlc2libGUgbWV0aG9kcyBhdmFpbGFibGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIFBhcm1MaXN0IHsKLXB1YmxpYzoKLSAgaW50ICAgbnBhcm1zOyAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgcGFybXMgaW4gbGlzdAotICB2b2lkICBhcHBlbmQoUGFybSAqcCk7ICAgICAgICAgIC8vIEFwcGVuZCBhIHBhcmFtZXRlciB0byB0aGUgZW5kCi0gIHZvaWQgIGluc2VydChQYXJtICpwLCBpbnQgcG9zKTsgLy8gSW5zZXJ0IGEgcGFyYW1ldGVyIGludG8gdGhlIGxpc3QKLSAgdm9pZCAgZGVsKGludCBwb3MpOyAgICAgICAgICAgICAvLyBEZWxldGUgYSBwYXJhbWV0ZXIgYXQgcG9zaXRpb24gcG9zCi0gIGludCAgIG51bW9wdCgpOyAgICAgICAgICAgICAgICAgLy8gR2V0IG51bWJlciBvZiBvcHRpb25hbCBhcmd1bWVudHMKLSAgaW50ICAgbnVtYXJnKCk7ICAgICAgICAgICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIGFjdGl2ZSBhcmd1bWVudHMKLSAgUGFybSAqZ2V0KGludCBwb3MpOyAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmFtZXRlciBhdCBwb3NpdGlvbiBwb3MKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBtZXRob2RzIG9wZXJhdGUgaW4gdGhlIG1hbm5lciB0aGF0IHlvdSB3b3VsZCBleHBlY3QuICAgIFRoZSBtb3N0IGNvbW1vbiBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIHBlcmZvcm1lZCBpbiBhIGxhbmd1YWdlIG1vZHVsZSBpcyB3YWxraW5nIGRvd24gdGhlIHBhcmFtZXRlciBsaXN0IGFuZCBwcm9jZXNzaW5nIGluZGl2aWR1YWwgcGFyYW1ldGVycy4gIFRoaXMgY2FuIGJlIGRvbmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gV2FsayBkb3duIGEgcGFyYW1ldGVyIGxpc3QKLVBhcm1MaXN0ICpsOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0IChhbHJlYWR5IGNyZWF0ZWQpCi1QYXJtICpwOwotCi1mb3IgKGludCBpID0gMDsgaSAmbHQ7IGwtJmd0O25wYXJtczsgaSsrKSB7Ci0JcCA9IGwtJmd0O2dldChpKTsgICAgICAgICAgICAgIC8vIEdldCBpdGggcGFyYW1ldGVyCi0JLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHBhcmFtZXRlcgotCS4uLgotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjMiPjwvYT48aDM+IFRoZSBTdHJpbmcgQ2xhc3M8L2gzPgotVGhlIHByb2Nlc3Mgb2Ygd3JpdGluZyB3cmFwcGVyIGZ1bmN0aW9ucyBpcyBtYWlubHkganVzdCBhIHRlZGlvdXMgZXhlcmNpc2UgaW4gc3RyaW5nIG1hbmlwdWxhdGlvbi4gIFRvIG1ha2UgdGhpcyBlYXNpZXIsICB0aGUgPHR0PlN0cmluZzwvdHQ+IGNsYXNzIHByb3ZpZGVzIHJlbGF0aXZlbHkgc2ltcGxlIG1lY2hhbmlzbSBmb3IgY29uc3RydWN0aW5nIHN0cmluZ3MsIGNvbmNhdGVuYXRpbmcgdmFsdWVzLCByZXBsYWNpbmcgc3ltYm9scywgYW5kIHNvIG9uLiAgICA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBTdHJpbmcgewotcHVibGljOgotICBTdHJpbmcoKTsKLSAgU3RyaW5nKGNvbnN0IGNoYXIgKnMpOwotICB+U3RyaW5nKCk7Ci0gIGNoYXIgICpnZXQoKSBjb25zdDsKLSAgZnJpZW5kIFN0cmluZyZhbXA7IG9wZXJhdG9yJmx0OyZsdDsoU3RyaW5nJmFtcDssY29uc3QgY2hhciAqcyk7Ci0gIGZyaWVuZCBTdHJpbmcmYW1wOyBvcGVyYXRvciZsdDsmbHQ7KFN0cmluZyZhbXA7LGNvbnN0IGludCk7Ci0gIGZyaWVuZCBTdHJpbmcmYW1wOyBvcGVyYXRvciZsdDsmbHQ7KFN0cmluZyZhbXA7LGNvbnN0IGNoYXIpOwotICBmcmllbmQgU3RyaW5nJmFtcDsgb3BlcmF0b3ImbHQ7Jmx0OyhTdHJpbmcmYW1wOyxTdHJpbmcmYW1wOyk7Ci0gIGZyaWVuZCBTdHJpbmcmYW1wOyBvcGVyYXRvciZndDsmZ3Q7KGNvbnN0IGNoYXIgKnMsIFN0cmluZyZhbXA7KTsKLSAgZnJpZW5kIFN0cmluZyZhbXA7IG9wZXJhdG9yJmd0OyZndDsoU3RyaW5nJmFtcDssU3RyaW5nJmFtcDspOwotICBTdHJpbmcmYW1wOyBvcGVyYXRvcj0oY29uc3QgY2hhciAqKTsKLSAgb3BlcmF0b3IgY2hhciooKSBjb25zdCB7IHJldHVybiBzdHI7IH0KLSAgdm9pZCAgIHVudGFiaWZ5KCk7Ci0gIHZvaWQgICByZXBsYWNlKGNoYXIgKnRva2VuLCBjaGFyICpyZXApOwotICB2b2lkICAgcmVwbGFjZWlkKGNoYXIgKmlkLCBjaGFyICpyZXApOwotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU3RyaW5ncyBjYW4gYmUgbWFuaXB1bGF0ZWQgaW4gYSBtYW5uZXIgdGhhdCBsb29rcyBzaW1pbGFyIHRvIEMrKyBJL08gb3BlcmF0aW9ucy4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5TdHJpbmcgczsKLQotcyAmbHQ7Jmx0OyAidm9pZCIgJmx0OyZsdDsgIiBmb28oKSB7XG4iCi0gICZsdDsmbHQ7IHRhYjQgJmx0OyZsdDsgInByaW50ZihcIkhlbGxvIFdvcmxkXCIpO1xuIgotICAmbHQ7Jmx0OyAifVxuIjsKLQotZnByaW50ZihmX3dyYXBwZXJzLCIlcyIsIChjaGFyICopIHMpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1wcm9kdWNlcyB0aGUgb3V0cHV0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGZvbygpIHsKLSAgICBwcmludGYoIkhlbGxvIFdvcmxkIik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+Jmx0OyZsdDs8L3R0PiBvcGVyYXRvciBhbHdheXMgYXBwZW5kcyB0byB0aGUgZW5kIG9mIGEgc3RyaW5nIHdoaWxlIDx0dD4mZ3Q7Jmd0OzwvdHQ+IGNhbiBiZSB1c2VkIHRvIGluc2VydCBhIHN0cmluZyBhdCB0aGUgYmVnaW5uaW5nLiAgIFN0cmluZ3MgbWF5IGJlIHVzZWQgYW55d2hlcmUgYSA8dHQ+Y2hhciAqPC90dD4gaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+U3RyaW5nIHMxLHMyOwotLi4uCi1pZiAoc3RyY21wKHMxLHMyKSA9PSAwKSB7Ci0JcHJpbnRmKCJFcXVhbCFcbiIpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PmdldCgpPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGV4cGxpY2l0bHkgcmV0dXJuIHRoZSA8dHQ+Y2hhciAqPC90dD4gY29udGFpbmluZyB0aGUgc3RyaW5nIGRhdGEuICAgVGhlIDx0dD51bnRhYmlmeSgpPC90dD4gbWV0aG9kIHJlcGxhY2VzIHRhYnMgd2l0aCB3aGl0ZXNwYWNlLiAgIFRoZSA8dHQ+cmVwbGFjZSgpPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gc3Vic3RyaW5nIHJlcGxhY2VtZW50IGFuZCBpcyB1c2VkIGJ5IHR5cGVtYXBzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cy5yZXBsYWNlKCIkdGFyZ2V0IiwiX2FyZzMiKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5yZXBsYWNlaWQoKTwvdHQ+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHZhbGlkIEMgaWRlbnRpZmllcnMgd2l0aCBhIG5ldyB2YWx1ZS4gIEMgaWRlbnRpZmllcnMgbXVzdCBiZSBzdXJyb3VuZGVkIGJ5IHdoaXRlLXNwYWNlIG9yIG90aGVyIG5vbi1pZGVudGlmaWVyIGNoYXJhY3RlcnMuICAgIFRoZSA8dHQ+cmVwbGFjZSgpPC90dD4gbWV0aG9kIGRvZXMgbm90IGhhdmUgdGhpcyByZXN0cmljdGlvbi48cD4KLTxhIG5hbWU9Im4yNCI+PC9hPjxoMz4gSGFzaCBUYWJsZXM8L2gzPgotSGFzaCB0YWJsZXMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIDx0dD5IYXNoPC90dD4gY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIEhhc2ggewotcHVibGljOgotICBIYXNoKCk7Ci0gIH5IYXNoKCk7Ci0gIGludCAgICBhZGQoY29uc3QgY2hhciAqa2V5LCB2b2lkICpvYmplY3QpOwotICBpbnQgICAgYWRkKGNvbnN0IGNoYXIgKmtleSwgdm9pZCAqb2JqZWN0LCB2b2lkICgqZGVsKSh2b2lkICopKTsKLSAgdm9pZCAgKmxvb2t1cChjb25zdCBjaGFyICprZXkpOwotICB2b2lkICAgcmVtb3ZlKGNvbnN0IGNoYXIgKmtleSk7Ci0gIHZvaWQgICpmaXJzdCgpOwotICB2b2lkICAqbmV4dCgpOwotICBjaGFyICAqZmlyc3RrZXkoKTsKLSAgY2hhciAgKm5leHRrZXkoKTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUhhc2ggdGFibGVzIHN0b3JlIGFyYml0cmFyeSBvYmplY3RzIChjYXN0IHRvIDx0dD52b2lkICo8L3R0Pikgd2l0aCBzdHJpbmcga2V5cy4gICAgQW4gb3B0aW9uYWwgb2JqZWN0IGRlbGV0aW9uIGZ1bmN0aW9uIG1heSBiZSByZWdpc3RlcmVkIHdpdGggZWFjaCBlbnRyeSB0byBkZWxldGUgb2JqZWN0cyB3aGVuIHRoZSBoYXNoIGlzIGRlc3Ryb3llZC4gIEhhc2ggdGFibGVzIGFyZSBwcmltYXJpbHkgdXNlZCBmb3IgbWFuYWdpbmcgaW50ZXJuYWwgc3ltYm9sIHRhYmxlcyBhbHRob3VnaCBsYW5ndWFnZSBtb2R1bGVzIG1heSBhbHNvIHVzZSB0aGVtIHRvIGtlZXAgdHJhY2sgb2Ygc3BlY2lhbCBzeW1ib2xzIGFuZCBvdGhlciBzdGF0ZS48cD4KLTxwPgotVGhlIGZvbGxvd2luZyBoYXNoIHRhYmxlIHNob3dzIGhvdyBvbmUgbWlnaHQga2VlcCB0cmFjayBvZiByZWFsIGFuZCByZW5hbWVkIGZ1bmN0aW9uIG5hbWVzLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPkhhc2ggd3JhcHBlZF9mdW5jdGlvbnM7Ci0KLWludCBhZGRfZnVuY3Rpb24oY2hhciAqbmFtZSwgY2hhciAqcmVuYW1lZCkgewotCWNoYXIgKm5uID0gbmV3IGNoYXJbc3RybGVuKHJlbmFtZWQpKzFdOwotCXN0cmNweShubixyZW5hbWVkKTsKLQlpZiAod3JhcHBlZF9mdW5jdGlvbnMuYWRkKG5hbWUsbm4pID09IC0xKSB7Ci0JCXByaW50ZigiRnVuY3Rpb24gbXVsdGlwbHkgZGVmaW5lZCFcbiIpOwotCQlkZWxldGUgW10gbm47Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci1jaGFyICpnZXRfcmVuYW1lZChjaGFyICpuYW1lKSB7Ci0JY2hhciAqcm4gPSAoY2hhciAqKSB3cmFwcGVkX2Z1bmN0aW9ucy5sb29rdXAobmFtZSk7Ci0JcmV0dXJuIHJuOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PnJlbW92ZSgpPC90dD4gbWV0aG9kIHJlbW92ZXMgYSBoYXNoLXRhYmxlIGVudHJ5LiAgVGhlIDx0dD5maXJzdCgpPC90dD4gYW5kIDx0dD5uZXh0KCk8L3R0PiBtZXRob2RzIGFyZSBpdGVyYXRvcnMgZm9yIGV4dHJhY3RpbmcgYWxsIG9mIHRoZSBoYXNoZWQgb2JqZWN0cy4gICAgVGhleSByZXR1cm4gTlVMTCB3aGVuIG5vIG1vcmUgb2JqZWN0cyBhcmUgZm91bmQgaW4gdGhlIGhhc2guICAgVGhlIDx0dD5maXJzdGtleSgpPC90dD4gYW5kIDx0dD5uZXh0a2V5KCkgPC90dD5tZXRob2RzIGFyZSBpdGVyYXRvcnMgdGhhdCByZXR1cm4gdGhlIGhhc2gga2V5cy4gICBOVUxMIGlzIHJldHVybmVkIHdoZW4gbm8gbW9yZSBrZXlzIGFyZSBmb3VuZC48cD4KLTxhIG5hbWU9Im4yNSI+PC9hPjxoMz4gVGhlIFdyYXBwZXJGdW5jdGlvbiBjbGFzczwvaDM+Ci1GaW5hbGx5LCBhIDx0dD5XcmFwcGVyRnVuY3Rpb248L3R0PiBjbGFzcyBpcyBhdmFpbGFibGUgZm9yIHNpbXBsaWZ5aW5nIHRoZSBjcmVhdGlvbiBvZiB3cmFwcGVyIGZ1bmN0aW9ucy4gICBUaGUgY2xhc3MgaXMgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIG9yZ2FuaXplIGNvZGUgZ2VuZXJhdGlvbiBhbmQgcHJvdmlkZSBhIGZldyBzdXBwb3J0aW5nIHNlcnZpY2VzLiAgICAgVGhlIGNsYXNzIGlzIGRlZmluZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Y2xhc3MgV3JhcHBlckZ1bmN0aW9uIHsKLXB1YmxpYzoKLSAgU3RyaW5nICBkZWY7Ci0gIFN0cmluZyAgbG9jYWxzOwotICBTdHJpbmcgIGNvZGU7Ci0gIHZvaWQgICAgcHJpbnQoRklMRSAqZik7Ci0gIHZvaWQgICAgcHJpbnQoU3RyaW5nICZhbXA7Zik7Ci0gIHZvaWQgICAgYWRkX2xvY2FsKGNoYXIgKnR5cGUsIGNoYXIgKm5hbWUsIGNoYXIgKmRlZnZhbHVlID0gMCk7Ci0gIGNoYXIgICAqbmV3X2xvY2FsKGNoYXIgKnR5cGUsIGNoYXIgKm5hbWUsIGNoYXIgKmRlZnZhbHVlID0gMCk7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaHJlZSBzdHJpbmdzIGFyZSBhdmFpbGFibGUuICBUaGUgPHR0PmRlZjwvdHQ+IHN0cmluZyBjb250YWlucyB0aGUgYWN0dWFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCB0aGUgPHR0PmxvY2FsczwvdHQ+IHN0cmluZyBjb250YWluIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucywgYW5kIHRoZSA8dHQ+Y29kZTwvdHQ+IHN0cmluZyBjb250YWlucyB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS48cD4KLTxwPgotVGhlIG1ldGhvZCA8dHQ+YWRkX2xvY2FsKCk8L3R0PiBjcmVhdGVzIGEgbmV3IGxvY2FsIHZhcmlhYmxlIHdoaWNoIGlzIG1hbmFnZWQgd2l0aCBhbiBpbnRlcm5hbCBzeW1ib2wgdGFibGUgKHRoYXQgZGV0ZWN0cyB2YXJpYWJsZSBjb25mbGljdHMgYW5kIHJlcG9ydHMgcG90ZW50aWFsIGVycm9ycykuICAgICBUaGUgPHR0Pm5ld19sb2NhbCgpPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBsb2NhbCB2YXJpYWJsZSB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLiAgIFNpbmNlIGEgcmVuYW1pbmcgbWlnaHQgYmUgcmVxdWlyZWQsIHRoaXMgbGF0dGVyIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHdhcyBhY3R1YWxseSBzZWxlY3RlZCBmb3IgdXNlICh0eXBpY2FsbHksIHRoaXMgaXMgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCBuYW1lKS48cD4KLTxwPgotVGhlIDx0dD5wcmludCgpPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGVtaXQgdGhlIHdyYXBwZXIgZnVuY3Rpb24gdG8gYSBmaWxlLiAgVGhlIHByaW50aW5nIHByb2Nlc3MgY29uc29saWRhdGVzIGFsbCBvZiB0aGUgc3RyaW5ncyBpbnRvIGEgc2luZ2xlIHJlc3VsdC48cD4KLTxwPgotSGVyZSBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGUgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb24gY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPldyYXBwZXJGdW5jdGlvbiBmOwotCi1mLmRlZiAmbHQ7Jmx0OyAidm9pZCBjb3VudF9uKGludCBuKSB7IjsKLWYuYWRkX2xvY2FsKCJpbnQiLCJpIik7Ci1mLmNvZGUgJmx0OyZsdDsgdGFiNCAmbHQ7Jmx0OyAiZm9yIChpID0gMDsgaSAmbHQ7IG47IGkrKykge1xuIgotICAgICAgICZsdDsmbHQ7IHRhYjggJmx0OyZsdDsgInByaW50ZihcIiVkXFxuXCIsaSk7XG4iCi0gICAgICAgJmx0OyZsdDsgdGFiNCAmbHQ7Jmx0OyAifVxuIgotICAgICAgICZsdDsmbHQ7ICJ9XG4iOwotCi1mLnByaW50KGZfd3JhcHBlcnMpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGNvdW50X24oaW50IG4pIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSsrKSB7Ci0gICAgICAgICBwcmludGYoIiVkXG4iLGkpOwotICAgIH0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotT2YgY291cnNlLCBhcyB5b3UgY2FuIGd1ZXNzLCB0aGUgZnVuY3Rpb25zIGFjdHVhbGx5IGdlbmVyYXRlZCBieSB5b3VyIGxhbmd1YWdlIG1vZHVsZSB3aWxsIGJlIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGlzLjxwPgotPGEgbmFtZT0ibjYiPjwvYT48aDI+IFR5cGVtYXBzIChmcm9tIEMpPC9oMj4KLVRoZSB0eXBlbWFwcGVyIHBsYXlzIGEgYmlnIHJvbGUgaW4gZ2VuZXJhdGluZyBjb2RlIGZvciBhbGwgb2YgU1dJRydzIG1vZHVsZXMuICAgIFVuZGVyc3RhbmRpbmcgdGhlIDx0dD4ldHlwZW1hcDwvdHQ+IGRpcmVjdGl2ZSBhbmQgaG93IGl0IHdvcmtzIGlzIHByb2JhYmx5IGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyB0aGlzIHNlY3Rpb24uPHA+Ci08YSBuYW1lPSJuMjYiPjwvYT48aDM+IFRoZSB0eXBlbWFwIEMgQVBJLjwvaDM+Ci0gVGhlcmUgaXMgYSByZWxhdGl2ZWx5IHNpbXBsZSBDIEFQSSBmb3IgbWFuYWdpbmcgdHlwZW1hcHMgaW4gbGFuZ3VhZ2UgbW9kdWxlcy48cD4KLTxwPgotPGg2PiA8Yj52b2lkIHR5cGVtYXBfcmVnaXN0ZXIoY2hhciAqb3AsIGNoYXIgKmxhbmcsIERhdGFUeXBlICp0eXBlLCBjaGFyICpwbmFtZSw8L2I+IDxiPiAgICAgICAgICAgICAgICAgICBjaGFyICpjb2RlLCBQYXJtTGlzdCAqbCA9IDApOzwvYj48L2g2PgotPGRsPgotPGR0PjxkZD4KLTxkdD48ZGQ+UmVnaXN0ZXJzIGEgbmV3IHR5cGVtYXAgd2l0aCB0aGUgdHlwZW1hcHBlci4gICBUaGlzIGlzIHRoZSBDIGVxdWl2YWxlbnQgb2YgdGhlIDx0dD4ldHlwZW1hcCA8L3R0PmRpcmVjdGl2ZS4gIEZvciBleGFtcGxlIDoKLTxkdD48ZGQ+Ci08YmxvY2txdW90ZT48cHJlPgkldHlwZW1hcChsYW5nLG9wKSB0eXBlIHBuYW1lIHsgLi4uIGNvZGUgLi4uIH07Ci0JJXR5cGVtYXAobGFuZyxvcCkgdHlwZSBwbmFtZShQYXJtTGlzdCkgeyAuLi4gY29kZSAuLi4gfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGR0PjxkZD48dHQ+Y29kZTwvdHQ+IGNvbnRhaW5zIHRoZSBhY3R1YWwgdHlwZW1hcCBjb2RlLCB3aGlsZSA8dHQ+bDwvdHQ+IGlzIGEgcGFyYW1ldGVyIGxpc3QgY29udGFpbmluZyBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuICAgIE5vcm1hbGx5LCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgdGhpcyBmdW5jdGlvbiBmcm9tIGxhbmd1YWdlIG1vZHVsZXMuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCB0eXBlbWFwX3JlZ2lzdGVyX2RlZmF1bHQoY2hhciAqb3AsIGNoYXIgKmxhbmcsIGludCB0eXBlLCBpbnQgcHRyLCAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphcnJheXN0ciwgIGNoYXIgKmNvZGUsIFBhcm1MaXN0ICphcmdzKTwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD5SZWdpc3RlcnMgYSBkZWZhdWx0IHR5cGVtYXAuICBUaGlzIHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgbm9ybWFsIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiwgYnV0IHRha2VzIGEgdHlwZSBjb2RlIChhbiBpbnRlZ2VyKSBpbnN0ZWFkLiAgICBEZWZhdWx0IHR5cGVtYXBzIGFyZSBtb3JlIGdlbmVyYWwgdGhhbiBub3JtYWwgdHlwZW1hcHMgKHNlZSBiZWxvdykuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gY2hhciAqdHlwZW1hcF9sb29rdXAoY2hhciAqb3AsIGNoYXIgKmxhbmcsIERhdGFUeXBlICp0eXBlLCAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwbmFtZSwgY2hhciAqc291cmNlLCBjaGFyICp0YXJnZXQsICAgICAgICAgICAgICAgICAgICAgIFdyYXBwZXJGdW5jdGlvbiAqZiA9IDApOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD5Mb29rcyB1cCBhIHR5cGVtYXAsIHBlcmZvcm1zIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMsIGFuZCByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdHlwZW1hcCBjb2RlLiAgICBUaGUgdHVwbGUgPHR0PihvcCwgbGFuZywgdHlwZSwgcG5hbWUpPC90dD4gZGV0ZXJtaW5lIHdoaWNoIHR5cGVtYXAgdG8gZmluZC4gIDx0dD5zb3VyY2U8L3R0PiBjb250YWlucyB0aGUgc3RyaW5nICB0byBiZSBhc3NpZ25lZCB0byB0aGUgPHR0PiRzb3VyY2U8L3R0PiB2YXJpYWJsZSwgPHR0PnRhcmdldDwvdHQ+IGNvbnRhaW5zIHRoZSBzdHJpbmcgdG8gYmUgYXNzaWduZWQgdG8gdGhlPHR0PiAkdGFyZ2V0PC90dD4gdmFyaWFibGUuICA8dHQ+ZjwvdHQ+IGlzIGFuIG9wdGlvbmFsICB3cmFwcGVyIGZ1bmN0aW9uIG9iamVjdC4gICBJdCBzaG91bGQgYmUgc3VwcGxpZWQgdG8gc3VwcG9ydCBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzIChpZS4gdHlwZW1hcHMgdGhhdCBkZWNsYXJlIGFkZGl0aW9uYWwgbG9jYWwgdmFyaWFibGVzKS4gCi08ZHQ+PGRkPgotPGR0PjxkZD48dHQ+dHlwZW1hcF9sb29rdXAoKTwvdHQ+IHJldHVybnMgTlVMTCBpcyBubyB0eXBlbWFwIGlzIGZvdW5kLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdXBkYXRlZCB0eXBlbWFwIGNvZGUuICAgIFRoaXMgY29kZSBoYXMgYSBudW1iZXIgb2YgdmFyaWFibGVzIHN1YnN0aXR1dGVkIGluY2x1ZGluZyA8dHQ+JHNvdXJjZTwvdHQ+LCA8dHQ+JHRhcmdldDwvdHQ+LCA8dHQ+JHR5cGU8L3R0PiwgPHR0PiRtYW5nbGU8L3R0PiwgYW5kIDx0dD4kYmFzZXR5cGU8L3R0Pi4gIAotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IGNoYXIgKnR5cGVtYXBfY2hlY2soY2hhciAqb3AsIGNoYXIgKmxhbmcsIERhdGFUeXBlICp0eXBlLCBjaGFyICpwbmFtZSk8L2g2PgotPHA+Ci08ZGw+Ci08ZHQ+PGRkPkNoZWNrcyB0byBzZWUgaWYgYSB0eXBlbWFwIGV4aXN0cy4gIFRoZSB0dXBsZSA8dHQ+KG9wLCBsYW5nLCB0eXBlLCBwbmFtZSk8L3R0PiBkZXRlcm1pbmUgd2hpY2ggdHlwZW1hcCB0byBmaW5kLiAgICBJZiB0aGUgdHlwZW1hcCBleGlzdHMsIHRoZSByYXcgdHlwZW1hcCBjb2RlIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBOVUxMIGlzIHJldHVybmVkLiAgIFdoaWxlIDx0dD50eXBlbWFwX2xvb2t1cCgpPC90dD4gY291bGQgYmUgdXNlZCB0byBhY2NvbXBsaXNoIHRoZSBzYW1lIHRoaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIG1vcmUgY29tcGFjdCBhbmQgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgc2luY2UgaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4KLTxkdD48ZGQ+Ci08L2RsPgotPGEgbmFtZT0ibjI3Ij48L2E+PGgzPiBXaGF0IGhhcHBlbnMgb24gdHlwZW1hcCBsb29rdXA/PC9oMz4KLVdoZW4gbG9va2luZyBmb3IgYSB0eXBlbWFwLCBTV0lHIHNlYXJjaGVzIGZvciBhIG1hdGNoIGluIGEgc2VyaWVzIG9mIHN0ZXBzLjxwPgotPHA+Ci08dWw+Ci08bGk+RXhwbGljaXQgdHlwZW1hcHMuICAgVGhlc2UgYXJlIHNwZWNpZmllZCBkaXJlY3RseSB3aXRoIHRoZSA8dHQ+JXR5cGVtYXAoKTwvdHQ+IGRpcmVjdGl2ZS4gIE5hbWVkIHR5cGVtYXBzIGhhdmUgdGhlIGhpZ2hlc3QgcHJlY2VkZW5jZSB3aGlsZSBhcnJheXMgaGF2ZSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIHBvaW50ZXJzIChzZWUgdGhlIHR5cGVtYXAgY2hhcHRlciBmb3IgbW9yZSBkZXRhaWxzKS4KLTxsaT5JZiBubyBleHBsaWNpdCB0eXBlbWFwIGlzIGZvdW5kLCBtYXBwaW5ncyBhcHBsaWVkIHdpdGggdGhlIDx0dD4lYXBwbHkgPC90dD5kaXJlY3RpdmUgYXJlIGNoZWNrZWQuICAgQmFzaWNhbGx5LCA8dHQ+JWFwcGx5IDwvdHQ+aXMgbm90aGluZyBtb3JlIHRoYW4gYSBnbG9yaWZpZWQgcmVuYW1pbmcgb3BlcmF0aW9uLiAgIFdlIHJlbmFtZSB0aGUgZGF0YXR5cGUgYW5kIHNlZSBpZiB0aGVyZSBhcmUgYW55IGV4cGxpY2l0IHR5cGVtYXBzIHRoYXQgbWF0Y2guICBJZiBzbywgd2UgdXNlIHRoZSB0eXBlbWFwIHRoYXQgd2FzIGZvdW5kLgotPGxpPkRlZmF1bHQgdHlwZW1hcHMuICAgSWYgbm8gbWF0Y2ggaXMgZm91bmQgd2l0aCBlaXRoZXIgZXhwbGljaXQgdHlwZW1hcHMgb3IgYXBwbHkgZGlyZWN0aXZlcywgd2UgbWFrZSBhIGZpbmFsIHNlYXJjaCB1c2luZyB0aGUgZGVmYXVsdCB0eXBlbWFwLiAgVW5saWtlIG90aGVyIHR5cGVtYXBzLCBkZWZhdWx0IHR5cGVtYXBzIGFyZSBhcHBsaWVkIHRvIHRoZSByYXcgU1dJRyBpbnRlcm5hbCBkYXRhdHlwZXMgKDx0dD5UX0lOVDwvdHQ+LCA8dHQ+VF9ET1VCTEU8L3R0PiwgPHR0PlRfQ0hBUjwvdHQ+LCBldGMuLi4pLiAgIEFzIGEgcmVzdWx0LCB0aGV5IGFyZSBpbnNlbnRpdmUgdG8gdHlwZWRlZnMgYW5kIHJlbmFtaW5nIG9wZXJhdGlvbnMuICAgIElmIG5vdGhpbmcgaXMgZm91bmQgaGVyZSwgYSBOVUxMIHBvaW50ZXIgaXMgcmV0dXJuZWQgaW5kaWNhdGluZyB0aGF0IG5vIG1hcHBpbmcgd2FzIGZvdW5kIGZvciB0aGF0IHBhcnRpY3VsYXIgZGF0YXR5cGUuCi08L3VsPgotPHA+Ci1Bbm90aGVyIHdheSB0byB0aGluayBvZiB0aGUgdHlwZW1hcCBtZWNoYW5pc20gaXMgdGhhdCBpdCBhbHdheXMgdHJpZXMgdG8gYXBwbHkgdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZW1hcCB0aGF0IGNhbiBiZSBmb3VuZCBmb3IgYW55IHBhcnRpY3VsYXIgZGF0YXR5cGUuICAgV2hlbiBzZWFyY2hpbmcsIGl0IHN0YXJ0cyB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIGFuZCB3b3JrcyBpdHMgd2F5IG91dCB0byB0aGUgbW9zdCBnZW5lcmFsIHNwZWNpZmljYXRpb24uICAgSWYgbm90aGluZyBpcyBmb3VuZCBpdCBnaXZlcyB1cCBhbmQgcmV0dXJucyBhIE5VTEwgcG9pbnRlci48cD4KLTxhIG5hbWU9Im4yOCI+PC9hPjxoMz4gSG93IG1hbnkgdHlwZW1hcHMgYXJlIHRoZXJlPzwvaDM+Ci1BbGwgdHlwZW1hcHMgYXJlIGlkZW50aWZpZWQgYnkgYW4gb3BlcmF0aW9uIHN0cmluZyBzdWNoIGFzICJpbiIsICJvdXQiLCAibWVtYmVyaW4iLCBldGMuLi4gIEEgbnVtYmVyIG9mIHR5cGVtYXBzIGFyZSBkZWZpbmVkIGJ5IG90aGVyIHBhcnRzIG9mIFNXSUcsIGJ1dCB5b3UgY2FuIGNyZWF0ZSBhbnkgc29ydCBvZiB0eXBlbWFwIHRoYXQgeW91IHdpc2ggYnkgc2ltcGx5IHBpY2tpbmcgYSBuZXcgbmFtZSBhbmQgdXNpbmcgaXQgd2hlbiBtYWtpbmcgY2FsbHMgdG8gPHR0PnR5cGVtYXBfbG9va3VwKCk8L3R0PiAgYW5kIDx0dD50eXBlbWFwX2NoZWNrKCk8L3R0Pi4gICAgPHA+Ci08YSBuYW1lPSJuNyI+PC9hPjxoMj4gRmlsZSBtYW5hZ2VtZW50PC9oMj4KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBmb3IgbWFuYWdpbmcgZmlsZXMgd2l0aGluIFNXSUcuICA8cD4KLTxwPgotPGg2PiB2b2lkIGFkZF9kaXJlY3RvcnkoY2hhciAqZGlybmFtZSk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Ci08ZHQ+PGRkPkFkZHMgYSBuZXcgZGlyZWN0b3J5IHRvIHRoZSBzZWFyY2ggcGF0aCB1c2VkIHRvIGxvY2F0ZSBTV0lHIGxpYnJhcnkgZmlsZXMuICBUaGlzIGlzIHRoZSBDIGVxdWl2YWxlbnQgb2YgdGhlIDx0dD5zd2lnPC90dD4gPHR0Pi1JPC90dD4gb3B0aW9uLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IGludCBpbnNlcnRfZmlsZShjaGFyICpmaWxlbmFtZSwgRklMRSAqb3V0cHV0KTs8L2g2PgotPGRsPgotPGR0PjxkZD4KLTxkdD48ZGQ+U2VhcmNoZXMgZm9yIGEgZmlsZSBhbmQgY29waWVzIGl0IGludG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uICAgVGhlIHNlYXJjaCBwcm9jZXNzIGdvZXMgdGhyb3VnaCB0aGUgU1dJRyBsaWJyYXJ5IG1lY2hhbmlzbSB3aGljaCBmaXJzdCBjaGVja3MgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGVuIGluIHZhcmlvdXMgcGFydHMgb2YgdGhlIFNXSUcgbGlicmFyeSBmb3IgYSBtYXRjaC4gIFJldHVybnMgLTEgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kLiBMYW5ndWFnZSBtb2R1bGVzIG9mdGVuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGluc2VydCBzdXBwb3J0aW5nIGNvZGUuICBVc3VhbGx5IHRoZXNlIGNvZGUgZnJhZ21lbnRzIGFyZSBnaXZlbiBhIGA8dHQ+LnN3ZzwvdHQ+JyBzdWZmaXggYW5kIGFyZSBwbGFjZWQgaW4gdGhlIFNXSUcgbGlicmFyeS4gCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gaW50IGdldF9maWxlKGNoYXIgKmZpbGVuYW1lLCBTdHJpbmcgJmFtcDtzdHIpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD4JU2VhcmNoZXMgZm9yIGEgZmlsZSBhbmQgcmV0dXJucyBpdHMgY29udGVudHMgIGluIHRoZSBTdHJpbmcgPHR0PnN0ci48L3R0PlJldHVybnMgYSAtMSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuCi08L2RsPgotPHA+Ci08aDY+IGludCBjaGVja291dF9maWxlKGNoYXIgKnNvdXJjZSwgY2hhciAqZGVzdCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Ci08ZHQ+PGRkPkNvcGllcyBhIGZpbGUgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgPHR0PmRlc3QgPC90dD5pcyB0aGUgZmlsZW5hbWUgb2YgdGhlIGRlc2lyZWQgZmlsZS4gICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHJlcGxhY2UgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMuICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBnaXZlIHRoZSB1c2VyIHN1cHBvcnRpbmcgY29kZS4gRm9yIGV4YW1wbGUsIHdlIGNvdWxkIGNoZWNrIG91dCBhIE1ha2VmaWxlIGlmIG5vbmUgZXhpc3RzLiAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IGludCBpbmNsdWRlX2ZpbGUoY2hhciAqZmlsZW5hbWUpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD5UaGUgQyBlcXVpdmFsZW50IG9mIHRoZSBTV0lHIDx0dD4laW5jbHVkZTwvdHQ+IGRpcmVjdGl2ZS4gICBXaGVuIGNhbGxlZCwgU1dJRyB3aWxsIGF0dGVtcHQgdG8gb3BlbiA8dHQ+ZmlsZW5hbWU8L3R0PiBhbmQgc3RhcnQgcGFyc2luZyBhbGwgb2YgaXRzIGNvbnRlbnRzLiAgIElmIHN1Y2Nlc3NmdWwsIHBhcnNpbmcgb2YgdGhlIG5ldyBmaWxlIHdpbGwgdGFrZSBwbGFjZSBpbW1lZGlhdGVseS4gIFdoZW4gdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkLCB0aGUgcGFyc2VyIHN3aXRjaGVzIGJhY2sgdG8gdGhlIGlucHV0IGZpbGUgYmVpbmcgcmVhZCBwcmlvciB0byB0aGlzIGNhbGwuICAgICBSZXR1cm5zIC0xIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZC4KLTwvZGw+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMj4gTmFtaW5nIFNlcnZpY2VzPC9oMj4KLVRoZSBuYW1pbmcgbW9kdWxlIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGdlbmVyYXRpbmcgdGhlIG5hbWVzIG9mIHdyYXBwZXIgZnVuY3Rpb25zLCBhY2Nlc3NvciBmdW5jdGlvbnMsIGFuZCBvdGhlciBhc3BlY3RzIG9mIFNXSUcuICAgRWFjaCBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IG5hbWUgdGhhdCBpcyBhIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBDIGlkZW50aWZpZXIgd2hlcmUgaW52YWxpZCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gYSAiXyIuICA8cD4KLTxwPgotPGg2PiBjaGFyICAqbmFtZV93cmFwcGVyKGNoYXIgKmZuYW1lLCBjaGFyICpwcmVmaXgpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPlJldHVybnMgdGhlIG5hbWUgb2YgYSB3cmFwcGVyIGZ1bmN0aW9uLiAgQnkgZGVmYXVsdCwgaXQgd2lsbCBiZSAiPHR0Pl93cmFwX3ByZWZpeGZuYW1lPC90dD4iLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IGNoYXIgICpuYW1lX21lbWJlcihjaGFyICptbmFtZSwgY2hhciAqY2xhc3NuYW1lOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPlJldHVybnMgdGhlIG5hbWUgb2YgYSBDKysgYWNjZXNzb3IgZnVuY3Rpb24uICBOb3JtYWxseSwgdGhpcyBpcyAiPHR0PmNsYXNzbmFtZV9tbmFtZTwvdHQ+Ii4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiBjaGFyICAqbmFtZV9nZXQoY2hhciAqdm5hbWUpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPlJldHVybnMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB0byBnZXQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgY2xhc3MgZGF0YSBtZW1iZXIuICBOb3JtYWxseSAiPHR0PnZuYW1lX2dldDwvdHQ+IiBpcyByZXR1cm5lZC4gCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gY2hhciAgKm5hbWVfc2V0KGNoYXIgKnZuYW1lKTs8L2g2PgotPGRsPgotPGR0PjxkZD5SZXR1cm5zIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIGNsYXNzIGRhdGEgbWVtYmVyLiAgTm9ybWFsbHksICI8dHQ+dm5hbWVfc2V0PC90dD4iIGlzIHJldHVybmVkLiAKLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiBjaGFyICAqbmFtZV9jb25zdHJ1Y3QoY2hhciAqY2xhc3NuYW1lKTs8L2g2PgotPGRsPgotPGR0PjxkZD5SZXR1cm5zIHRoZSBuYW1lIG9mIGEgY29uc3RydWN0b3IgZnVuY3Rpb24uICBOb3JtYWxseSByZXR1cm5zICI8dHQ+bmV3X2NsYXNzbmFtZTwvdHQ+Ii4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiBjaGFyICAqbmFtZV9kZXN0cm95KGNoYXIgKmNsYXNzbmFtZSk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+UmV0dXJucyB0aGUgbmFtZSBvZiBhIGRlc3RydWN0b3IgZnVuY3Rpb24uIE5vcm1hbGx5IHJldHVybnMgIjx0dD5kZWxldGVfY2xhc3NuYW1lPC90dD4iLgotPGR0PjxkZD4KLTwvZGw+Ci1FYWNoIGZ1bmN0aW9uIG1heSBhbHNvIGFjY2VwdCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb2YgPHR0PkFTX0lTPC90dD4uICBUaGlzIHN1cHByZXNzZXMgdGhlIGNvbnZlcnNpb24gb2YgaWxsZWdhbCBjaGFyYWN0ZXJzIChhIHByb2Nlc3MgdGhhdCBpcyBzb21ldGltZXMgcmVxdWlyZWQpLiAgIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jaGFyICpuYW1lID0gbmFtZV9tZW1iZXIoImZvbyIsImJhciIsQVNfSVMpOyAgIC8vIFByb2R1Y2UgYSBuYW1lLCBidXQgZG9uJ3QgY2hhbmdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlsbGVnYWwgY2hhcmFjdGVycy4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSXQgaXMgY3JpdGljYWwgdGhhdCBsYW5ndWFnZSBtb2R1bGVzIHVzZSB0aGUgbmFtaW5nIGZ1bmN0aW9ucy4gICBUaGVzZSBmdW5jdGlvbiBhcmUgdXNlZCB0aHJvdWdob3V0IFNXSUcgYW5kIHByb3ZpZGUgYSBjZW50cmFsaXplZCBtZWNoYW5pc20gZm9yIGtlZXBpbmcgdHJhY2sgb2YgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGdlbmVyYXRlZCwgbWFuYWdpbmcgbXVsdGlwbGUgZmlsZXMsIGFuZCBzbyBmb3J0aC4gIEluIGZ1dHVyZSByZWxlYXNlcywgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgbmFtaW5nIHNjaGVtZSB1c2VkIGJ5IFNXSUcuICBVc2luZyB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGluc3VyZSBmdXR1cmUgY29tcGF0aWJpbGl0eS48cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBDb2RlIEdlbmVyYXRpb24gRnVuY3Rpb25zPC9oMj4KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGVtaXQgY29kZSB0aGF0IGlzIGdlbmVyYWxseSB1c2VmdWwgYW5kIHVzZWQgaW4gZXNzZW50aWFsbHkgZXZlcnkgU1dJRyBsYW5ndWFnZSBtb2R1bGUuPHA+Ci08cD4KLTxoNj4gaW50IGVtaXRfYXJncyhEYXRhVHlwZSAqdCwgUGFybUxpc3QgKmwsIFdyYXBwZXJGdW5jdGlvbiAmYW1wO2YpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYWxsIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgdXNlZCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUuICA8dHQ+dDwvdHQ+IGlzIHRoZSByZXR1cm4gZGF0YXR5cGUgb2YgdGhlIGZ1bmN0aW9uLCA8dHQ+bDwvdHQ+IGlzIHRoZSBwYXJhbWV0ZXIgbGlzdCBob2xkaW5nIGFsbCBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAgPHR0PmY8L3R0PiBpcyBhIFdyYXBwZXJGdW5jdGlvbiBvYmplY3Qgd2hlcmUgdGhlIGxvY2FsICB2YXJpYWJsZXMgd2lsbCBiZSBjcmVhdGVkLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgZW1pdF9mdW5jX2NhbGwoY2hhciAqbmFtZSwgRGF0YVR5cGUgKnQsIFBhcm1MaXN0ICpsLCAgICAgICAgICAgICAgICAgICAgIFdyYXBwZXJGdW5jdGlvbiAmYW1wO2YpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYSBmdW5jdGlvbiBjYWxsIHRvIGEgQyBmdW5jdGlvbi4gIDx0dD5uYW1lPC90dD4gaXMgdGhlIG5hbWUgb2YgdGhlIEMgZnVuY3Rpb24sIDx0dD50PC90dD4gaXMgdGhlIHJldHVybiBkYXRhdHlwZSwgPHR0Pmw8L3R0PiBpcyB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgPHR0PmY8L3R0PiBpcyBhIFdyYXBwZXJGdW5jdGlvbiBvYmplY3QuICBUaGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgb25lIGhhcyBmaXJzdCBjYWxsZWQgPHR0PmVtaXRfYXJncygpPC90dD4uCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBlbWl0X2Jhbm5lcihGSUxFICpmaWxlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5FbWl0cyB0aGUgU1dJRyBiYW5uZXIgY29tbWVudCB0byB0aGUgb3V0cHV0IGZpbGUuICAKLTwvZGw+Ci08cD4KLTxoNj4gdm9pZCAgZW1pdF9zZXRfZ2V0KGNoYXIgKm5hbWUsIGNoYXIgKnJlbmFtZSwgRGF0YVR5cGUgKnQpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkdpdmVuIGEgdmFyaWFibGUgb2YgdHlwZSA8dHQ+dDwvdHQ+LCB0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdHdvIGZ1bmN0aW9ucyB0byBzZXQgYW5kIGdldCB0aGUgdmFsdWUuICBUaGVzZSBmdW5jdGlvbnMgYXJlIHRoZW4gd3JhcHBlZCBsaWtlIG5vcm1hbCBDIGZ1bmN0aW9ucy4gIDx0dD5uYW1lPC90dD4gaXMgdGhlIHJlYWwgbmFtZSBvZiB0aGUgdmFyaWFibGUuICA8dHQ+cmVuYW1lPC90dD4gaXMgdGhlIHJlbmFtZWQgdmVyc2lvbiBvZiB0aGUgdmFyaWFibGUuICAKLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkICBlbWl0X3B0cl9lcXVpdmFsZW5jZShGSUxFICpmaWxlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5UbyBrZWVwIHRyYWNrIG9mIGRhdGF0eXBlcywgU1dJRyBtYWludGFpbnMgYW4gaW50ZXJuYWwgdGFibGUgb2YgImVxdWl2YWxlbnQiIGRhdGF0eXBlcy4gIFRoaXMgdGFibGUgaXMgdXBkYXRlZCBieSB0eXBlZGVmLCBjbGFzcyBkZWZpbml0aW9ucywgYW5kIG90aGVyIEMgY29uc3RydWN0cy4gICBUaGlzIGZ1bmN0aW9uIGVtaXRzIGNvZGUgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlLWNoZWNrZXIgdGhhdCBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIHBvaW50ZXJzIHdvcmsgY29ycmVjdGx5LiAgVHlwaWNhbGx5IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFuIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHBhcnNlZCBjb21wbGV0ZWx5LgotPC9kbD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gV3JpdGluZyBhIFJlYWwgTGFuZ3VhZ2UgTW9kdWxlPC9oMj4KLVdoZXcsIGFzc3VtaW5nIHlvdSd2ZSBtYWRlIGl0IHRoaXMgZmFyLCB3ZSdyZSByZWFkeSB0byB3cml0ZSBhIHJlYWwgbGFuZ3VhZ2UgbW9kdWxlLiAgSW4gdGhpcyBleGFtcGxlLCB3ZSdsbCBkZXZlbG9wIGEgc2ltcGxlIFRjbCBtb2R1bGUuICAgVGNsIGhhcyBiZWVuIGNob3NlbiBiZWNhdXNlIGl0IGhhcyBhIHJlbGF0aXZlbHkgc2ltcGxlIEMgQVBJIHRoYXQgaXMgd2VsbCBkb2N1bWVudGVkIGFuZCBlYXN5IHRvIHVuZGVyc3RhbmQuICAgIFRoZSBtb2R1bGUgZGV2ZWxvcGVkIGhlcmUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSByZWFsIFNXSUcgVGNsIG1vZHVsZSAod2hpY2ggaXMgc2lnbmlmaWNhbnRseSBtb3JlIGNvbXBsaWNhdGVkKS4gICA8cD4KLTxhIG5hbWU9Im4yOSI+PC9hPjxoMz4gVGhlIGhlYWRlciBmaWxlPC9oMz4KLVdlIHdpbGwgc3RhcnQgd2l0aCB0aGUgc2FtZSBoZWFkZXIgZmlsZSBhcyBiZWZvcmUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEZpbGUgOiBteWxhbmcuaAotLy8gQSBzaW1wbGUgU1dJRyBMYW5ndWFnZSBtb2R1bGUKLQotY2xhc3MgTVlMQU5HIDogcHVibGljIExhbmd1YWdlIHsKLXByaXZhdGU6Ci0JY2hhciAqbW9kdWxlOwotcHVibGljIDoKLQlNWUxBTkcoKSB7IAotCQltb2R1bGUgPSAwOwotCX07Ci0JLy8gVmlydHVhbCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIFNXSUcgcGFyc2VyCi0JIHZvaWQgcGFyc2VfYXJncyhpbnQsIGNoYXIgKmFyZ3ZbXSk7Ci0JIHZvaWQgcGFyc2UoKTsKLQkgdm9pZCBjcmVhdGVfZnVuY3Rpb24oY2hhciAqLCBjaGFyICosIERhdGFUeXBlICosIFBhcm1MaXN0ICopOwotCSB2b2lkIGxpbmtfdmFyaWFibGUoY2hhciAqLCBjaGFyICosIERhdGFUeXBlICopOwotCSB2b2lkIGRlY2xhcmVfY29uc3QoY2hhciAqLCBjaGFyICosIERhdGFUeXBlICosIGNoYXIgKik7Ci0JIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKTsKLQkgdm9pZCBoZWFkZXJzKHZvaWQpOwotCSB2b2lkIGNsb3NlKHZvaWQpOwotCSB2b2lkIHNldF9tb2R1bGUoY2hhciAqLGNoYXIgKiopOwotCSB2b2lkIGNyZWF0ZV9jb21tYW5kKGNoYXIgKiwgY2hhciAqKTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4zMCI+PC9hPjxoMz4gQ29tbWFuZCBMaW5lIE9wdGlvbnMgYW5kIEJhc2ljIEluaXRpYWxpemF0aW9uPC9oMz4KLUNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBwYXJzZWQgdXNpbmcgdGhlIDx0dD5wYXJzZV9hcmdzKCk8L3R0PiBtZXRob2QgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQSBzaW1wbGUgU1dJRyBMYW5ndWFnZSBtb2R1bGUKLS8vCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2luY2x1ZGUgInN3aWcuaCIKLSNpbmNsdWRlICJteWxhbmcuaCIKLQotc3RhdGljIGNoYXIgKnVzYWdlID0gIlwKLU15IExhbmd1YWdlIE9wdGlvbnNcblwKLSAgICAgLW1vZHVsZSBuYW1lICAgIC0gU2V0IG5hbWUgb2YgbW9kdWxlXG5cbiI7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pCi0vLwotLy8gUGFyc2UgbXkgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIGluaXRpYWxpemUgYnkgdmFyaWFibGVzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTVlMQU5HOjpwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgLy8gTG9vayBmb3IgY2VydGFpbiBjb21tYW5kIGxpbmUgb3B0aW9ucwotICBmb3IgKGludCBpID0gMTsgaSAmbHQ7IGFyZ2M7IGkrKykgewotICAgIGlmIChhcmd2W2ldKSB7Ci0gICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sIi1tb2R1bGUiKSA9PSAwKSB7Ci0gICAgICAgIGlmIChhcmd2W2krMV0pIHsKLSAgICAgICAgICBzZXRfbW9kdWxlKGFyZ3ZbaSsxXSwwKTsKLSAgICAgICAgICBtYXJrX2FyZyhpKTsKLSAgICAgICAgICBtYXJrX2FyZyhpKzEpOwotICAgICAgICAgIGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhcmdfZXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwiLWhlbHAiKSA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIlc1xuIiwgdXNhZ2UpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvLyBTZXQgbG9jYXRpb24gb2YgU1dJRyBsaWJyYXJ5Ci0gIHN0cmNweShMaWJEaXIsInRjbCIpOwotCi0gIC8vIEFkZCBhIHN5bWJvbCB0byB0aGUgcGFyc2VyIGZvciBjb25kaXRpb25hbCBjb21waWxhdGlvbgotICBhZGRfc3ltYm9sKCJTV0lHVENMIiwwLDApOwotCi0gIC8vIEFkZCB0eXBlbWFwIGRlZmluaXRpb25zCi0gIHR5cGVtYXBfbGFuZyA9ICJ0Y2wiOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1QYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvbGxvd3MgdGhlIHNhbWUgY29udmVudGlvbnMgYXMgZm9yIHdyaXRpbmcgYSBDKysgbWFpbiBwcm9ncmFtIHdpdGggb25lIGNhdmVhdC4gIEZvciBlYWNoIG9wdGlvbiB0aGF0IHlvdXIgbGFuZ3VhZ2UgbW9kdWxlIHBhcnNlcywgeW91IG5lZWQgdG8gY2FsbCB0aGUgZnVuY3Rpb24gPHR0Pm1hcmtfYXJnKCk8L3R0Pi4gICBUaGlzIHRlbGxzIHRoZSBTV0lHIG1haW4gcHJvZ3JhbSB0aGF0IHlvdXIgbW9kdWxlIGZvdW5kIGEgdmFsaWQgb3B0aW9uIGFuZCB1c2VkIGl0LiAgIElmIHlvdSBkb24ndCBkbyB0aGlzLCBTV0lHIHdpbGwgZXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgdW5yZWNvZ25pemVkIGNvbW1hbmQgbGluZSBvcHRpb25zLjxwPgotPHA+Ci1BZnRlciBwcm9jZXNzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zLCB5b3UgbmV4dCBuZWVkIHRvIHNldCB0aGUgdmFyaWFibGUgPHR0PkxpYkRpcjwvdHQ+IHdpdGggdGhlIG5hbWUgb2YgdGhlIHN1YmRpcmVjdG9yeSB5b3VyICBsYW5ndWFnZSB3aWxsIHVzZSB0byBmaW5kIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkuICAgIFNpbmNlIHdlIGFyZSBtYWtpbmcgYSBuZXcgVGNsIG1vZHVsZSwgd2UnbGwganVzdCBzZXQgdGhpcyB0byAiPHR0PnRjbDwvdHQ+Ii48cD4KLTxwPgotTmV4dCwgd2UgbWF5IHdhbnQgdG8gYWRkIGEgc3ltYm9sIHRvIFNXSUcncyBzeW1ib2wgdGFibGUuICBJbiB0aGlzIGNhc2Ugd2UncmUgYWRkaW5nICI8dHQ+U1dJR1RDTDwvdHQ+IiB0byBpbmRpY2F0ZSB0aGF0IHdlJ3JlIHVzaW5nIFRjbC4gIFNXSUcgbW9kdWxlcyBjYW4gdXNlIHRoaXMgZm9yIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGFuZCBkZXRlY3RpbmcgeW91ciBtb2R1bGUgdXNpbmcgPHR0PiNpZmRlZjwvdHQ+LiAgICA8cD4KLTxwPgotRmluYWxseSwgd2UgbmVlZCB0byBzZXQgdGhlIHZhcmlhYmxlIDx0dD50eXBlbWFwX2xhbmc8L3R0Pi4gIFRoaXMgc2hvdWxkIGJlIGFzc2lnbmVkIGEgbmFtZSB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBmb3IgYWxsIHR5cGVtYXAgZGVjbGFyYXRpb25zLiAgICBXaGVuIGEgdXNlciBnaXZlcyBhIHR5cGVtYXAsIHRoZXkgd291bGQgdXNlIHRoaXMgbmFtZSBhcyB0aGUgdGFyZ2V0IGxhbmd1YWdlLjxwPgotPGEgbmFtZT0ibjMxIj48L2E+PGgzPiBTdGFydGluZyB0aGUgcGFyc2VyPC9oMz4KLVRvIHN0YXJ0IHRoZSBTV0lHIHBhcnNlciwgdGhlIDx0dD5wYXJzZSgpPC90dD4gbWV0aG9kIGlzIHVzZWQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdm9pZCBNWUxBTkc6OnBhcnNlKCkKLS8vCi0vLyBTdGFydCBwYXJzaW5nIGFuIGludGVyZmFjZSBmaWxlIGZvciBNWUxBTkcuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBNWUxBTkc6OnBhcnNlKCkgewotCi0JZnByaW50ZihzdGRlcnIsIk1ha2luZyB3cmFwcGVycyBmb3IgVGNsXG4iKTsKLQloZWFkZXJzKCk7ICAgICAgIC8vIEVtaXQgaGVhZGVyIGZpbGVzIGFuZCBvdGhlciBzdXBwb3J0aW5nIGNvZGUKLQotCS8vIFRlbGwgdGhlIHBhcnNlciB0byBmaXJzdCBpbmNsdWRlIGEgdHlwZW1hcCBkZWZpbml0aW9uIGZpbGUKLQotCWlmIChpbmNsdWRlX2ZpbGUoImxhbmcubWFwIikgPT0gLTEpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBmaW5kIGxhbmcubWFwIVxuIik7Ci0JICAgIFNXSUdfZXhpdCgxKTsKLSAgICAgICB9Ci0JeXlwYXJzZSgpOyAgICAgICAvLyBSdW4gdGhlIFNXSUcgcGFyc2VyCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgZnVuY3Rpb24gc2hvdWxkIHByaW50IHNvbWUga2luZCBvZiBtZXNzYWdlIHRvIHRoZSB1c2VyIGluZGljYXRpbmcgd2hhdCBsYW5ndWFnZSBpcyBiZWluZyB0YXJnZXRlZC4gIFRoZSA8dHQ+aGVhZGVycygpPC90dD4gbWV0aG9kIGlzIGNhbGxlZCAoc2VlIGJlbG93KSB0byBlbWl0IHN1cHBvcnQgY29kZSBhbmQgaGVhZGVyIGZpbGVzLiAgICBGaW5hbGx5LCB3ZSBtYWtlIGEgY2FsbCB0byA8dHQ+eXlwYXJzZSgpPC90dD4uICBUaGlzIHN0YXJ0cyB0aGUgU1dJRyBwYXJzZXIgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHJlYWQuICA8cD4KLTxwPgotSW4gb3VyIGltcGxlbWVudGF0aW9uLCB3ZSBoYXZlIGFsc28gYWRkZWQgY29kZSB0byBpbW1lZGlhdGVseSBpbmNsdWRlIGEgZmlsZSBgPHR0PmxhbmcubWFwPC90dD4nLiAgVGhpcyBmaWxlIHdpbGwgY29udGFpbiB0eXBlbWFwIGRlZmluaXRpb25zIHRvIGJlIHVzZWQgYnkgb3VyIG1vZHVsZSBhbmQgaXMgZGVzY3JpYmVkIGluIGRldGFpbCBsYXRlci4gICA8cD4KLTxhIG5hbWU9Im4zMiI+PC9hPjxoMz4gRW1pdHRpbmcgaGVhZGVycyBhbmQgc3VwcG9ydCBjb2RlPC9oMz4KLVByaW9yIHRvIGVtaXR0aW5nIGFueSBjb2RlLCBvdXIgbW9kdWxlIHNob3VsZCBlbWl0IHN0YW5kYXJkIGhlYWRlciBmaWxlcyBhbmQgc3VwcG9ydCBjb2RlLiAgVGhpcyBpcyBkb25lIHVzaW5nIHRoZSA8dHQ+aGVhZGVycygpPC90dD4gbWV0aG9kIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmhlYWRlcnModm9pZCkKLS8vCi0vLyBHZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgaGVhZGVyIGZpbGVzIGZvciBNWUxBTkcgaW50ZXJmYWNlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6aGVhZGVycyh2b2lkKQotewotICBlbWl0X2Jhbm5lcihmX2hlYWRlcik7ICAgICAgICAgICAgICAgLy8gUHJpbnQgdGhlIFNXSUcgYmFubmVyIG1lc3NhZ2UKLSAgZnByaW50ZihmX2hlYWRlciwiLyogSW1wbGVtZW50YXRpb24gOiBNeSBUQ0wgKi9cblxuIik7Ci0KLSAgLy8gSW5jbHVkZSBoZWFkZXIgZmlsZSBjb2RlIGZyYWdtZW50IGludG8gdGhlIG91dHB1dAotICBpZiAoaW5zZXJ0X2ZpbGUoImhlYWRlci5zd2ciLGZfaGVhZGVyKSA9PSAtMSkgewotICAgIGZwcmludGYoc3RkZXJyLCJGYXRhbCBFcnJvci4gVW5hYmxlIHRvIGxvY2F0ZSAnaGVhZGVyLnN3ZycuXG4iKTsKLSAgICBTV0lHX2V4aXQoMSk7Ci0gIH0KLQotICAvLyBFbWl0IHRoZSBkZWZhdWx0IFNXSUcgcG9pbnRlciB0eXBlLWNoZWNrZXIgKGZvciBzdHJpbmdzKQotICBpZiAoaW5zZXJ0X2ZpbGUoInN3aWdwdHIuc3dnIixmX2hlYWRlcikgPT0gLTEpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiRmF0YWwgRXJyb3IuIFVuYWJsZSB0byBsb2NhdGUgJ3N3aWdwdHIuc3dnJy5cbiIpOwotICAgIFNXSUdfZXhpdCgxKTsKLSAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgd2UgZW1pdCB0aGUgc3RhbmRhcmQgU1dJRyBiYW5uZXIgZm9sbG93ZWQgYnkgYSBjb21tZW50IGluZGljYXRpbmcgd2hpY2ggbGFuZ3VhZ2UgbW9kdWxlIGlzIGJlaW5nIHVzZWQuICAgQWZ0ZXIgdGhhdCwgd2UgYXJlIGdvaW5nIHRvIGluY2x1ZGUgdHdvIGRpZmZlcmVudCBmaWxlcy4gIGA8dHQ+aGVhZGVyLnN3Zyc8L3R0PiBpcyBhIGZpbGUgY29udGFpbmluZyBzdGFuZGFyZCBkZWNsYXJhdGlvbnMgbmVlZGVkIHRvIGJ1aWxkIGEgVGNsIGV4dGVuc2lvbi4gIEZvciBvdXIgZXhhbXBsZSwgaXQgd2lsbCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGhlYWRlci5zd2cgKi8KLSNpbmNsdWRlICZsdDt0Y2wuaCZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGZpbGUgYDx0dD5zd2lncHRyLnN3Zyc8L3R0PiBjb250YWlucyB0aGUgc3RhbmRhcmQgU1dJRyBwb2ludGVyLXR5cGUgY2hlY2tpbmcgbGlicmFyeS4gICBUaGlzIGxpYnJhcnkgY29udGFpbnMgYWJvdXQgMzAwIGxpbmVzIG9mIHJhdGhlciBuYXN0eSBsb29raW5nIHN1cHBvcnQgY29kZSB0aGF0IGRlZmluZSB0aGUgZm9sbG93aW5nIDMgZnVuY3Rpb25zIDo8cD4KLTxwPgotPGg2PiB2b2lkIFNXSUdfUmVnaXN0ZXJNYXBwaW5nKGNoYXIgKnR5cGUxLCBjaGFyICp0eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKigqY2FzdCkodm9pZCAqKSk8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGVzIGEgbWFwcGluZyBiZXR3ZWVuIEMgZGF0YXR5cGVzIDx0dD50eXBlMTwvdHQ+IGFuZCA8dHQ+dHlwZTI8L3R0Pi4gIFRoaXMgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUtY2hlY2tlciBhbmQgaXMgc2ltaWxpYXIgdG8gYSB0eXBlZGVmLiAgPHR0PmNhc3Q8L3R0PiBpcyBhbiBvcHRpb25hbCAgZnVuY3Rpb24gcG9pbnRlciBkZWZpbmluZyBhIG1ldGhvZCBmb3IgcHJvcGVyIHBvaW50ZXIgY29udmVyc2lvbiAoaWYgbmVlZGVkKS4gIE5vcm1hbGx5LCBjYXN0IGlzIG9ubHkgdXNlZCB3aGVuIGNvbnZlcnRpbmcgYmV0d2VlbiBiYXNlIGFuZCBkZXJpdmVkIGNsYXNzZXMgaW4gQysrIGFuZCBpcyBuZWVkZWQgZm9yIHByb3BlciBpbXBsZW1lbnRhdGlvbiBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLTwvZGw+Ci08cD4KLTxoNj4gdm9pZCBTV0lHX01ha2VQdHIoY2hhciAqc3RyLCB2b2lkICpwdHIsIGNoYXIgKnR5cGUpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPk1ha2VzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgQyBwb2ludGVyLiAgVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gPHR0PnN0cjwvdHQ+IHdoaWNoIGlzIGFzc3VtZWQgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlc3VsdC4gIDx0dD5wdHI8L3R0PiBjb250YWlucyB0aGUgcG9pbnRlciB2YWx1ZSBhbmQgPHR0PnR5cGU8L3R0PiBpcyBhIHN0cmluZyBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRhdGF0eXBlLiAKLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiBjaGFyICpTV0lHX0dldFB0cihjaGFyICpzdHIsIHZvaWQgKipwdHIsIGNoYXIgKnR5cGUpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkV4dHJhY3RzIGEgcG9pbnRlciBmcm9tIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24sIHBlcmZvcm1zIHR5cGUtY2hlY2tpbmcsIGFuZCBjYXN0aW5nLiAgIDx0dD5zdHI8L3R0PiBpcyB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBvaW50ZXItdmFsdWUgcmVwcmVzZW50YXRpb24sIDx0dD5wdHI8L3R0PiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgcG9pbnRlciB0aGF0IHdpbGwgYmUgcmV0dXJuZWQsIGFuZCA8dHQ+dHlwZSA8L3R0PmlzIHRoZSBzdHJpbmcgY29kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhdHlwZS4gIElmIGEgdHlwZS1lcnJvciBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgPHR0PmNoYXIgKjwvdHQ+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmluZyB0aGF0IHdhcyBpbnZhbGlkLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gICBJZiBhIE5VTEwgcG9pbnRlciBpcyBnaXZlbiBmb3IgPHR0PnR5cGU8L3R0PiwgdGhlIGZ1bmN0aW9uIHdpbGwgYWNjZXB0IGEgcG9pbnRlciBvZiBhbnkgdHlwZS4KLTwvZGw+Ci08cD4KLVdlIHdpbGwgdXNlIHRoZXNlIGZ1bmN0aW9ucyBsYXRlci48cD4KLTxhIG5hbWU9Im4zMyI+PC9hPjxoMz4gU2V0dGluZyBhIG1vZHVsZSBuYW1lPC9oMz4KLVRoZSA8dHQ+c2V0X21vZHVsZSgpPC90dD4gbWV0aG9kIGlzIHVzZWQgd2hlbmV2ZXIgdGhlIDx0dD4lbW9kdWxlPC90dD4gZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkLjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpzZXRfbW9kdWxlKGNoYXIgKm1vZF9uYW1lLGNoYXIgKiptb2RfbGlzdCkKLS8vCi0vLyBTZXRzIHRoZSBtb2R1bGUgbmFtZS4gIERvZXMgbm90aGluZyBpZiBpdCdzIGFscmVhZHkgc2V0IChzbyBpdCBjYW4KLS8vIGJlIG92ZXJyaWRkZW50IGFzIGEgY29tbWFuZCBsaW5lIG9wdGlvbikuCi0vLwotLy8gbW9kX2xpc3QgaXMgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBhZGRpdGlvbmFsIG1vZHVsZXMgdG8gaW5pdGlhbGl6ZQotLy8gYW5kIGlzIG9ubHkgcHJvdmlkZWQgaWYgdGhlIHVzZXIgc3BlY2lmaWVzIHNvbWV0aGluZyBsaWtlIHRoaXMgOgotLy8gJW1vZHVsZSBmb28sIG1vZDEsIG1vZDIsIG1vZDMsIG1vZDQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6c2V0X21vZHVsZShjaGFyICptb2RfbmFtZSwgY2hhciAqKm1vZF9saXN0KSB7Ci0JaWYgKG1vZHVsZSkgcmV0dXJuOwotCW1vZHVsZSA9IG5ldyBjaGFyW3N0cmxlbihtb2RfbmFtZSkrMV07Ci0Jc3RyY3B5KG1vZHVsZSxtb2RfbmFtZSk7Ci0JLy8gTWFrZSBzdXJlIHRoZSBuYW1lIGNvbmZvcm1zIHRvIFRjbCBuYW1pbmcgY29udmVudGlvbnMKLQlmb3IgKGNoYXIgKmMgPSBtb2R1bGU7ICgqYyk7IGMrKykKLQkJKmMgPSB0b2xvd2VyKCpjKTsKLQl0b3VwcGVyKG1vZHVsZSk7Ci19IAotCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgZnVuY3Rpb24gbWF5LCBpbiBmYWN0LCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIGNvdXJzZSBvZiBwcm9jZXNzaW5nLiAgTm9ybWFsbHksIHdlIG9ubHkgYWxsb3cgYSBtb2R1bGUgbmFtZSB0byBiZSBzZXQgb25jZSBhbmQgaWdub3JlIGFsbCBzdWJzZXF1ZW50IGNhbGxzIGhvd2V2ZXIuPHA+Ci08YSBuYW1lPSJuMzQiPjwvYT48aDM+IEZpbmFsIEluaXRpYWxpemF0aW9uPC9oMz4KLVRoZSBpbml0aWFsaXphdGlvbiBvZiBhIG1vZHVsZSB0YWtlcyBzZXZlcmFsIHN0ZXBzLS1wYXJzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zLCBwcmludGluZyBzdGFuZGFyZCBoZWFkZXIgZmlsZXMsIHN0YXJ0aW5nIHRoZSBwYXJzZXIsIGFuZCBzZXR0aW5nIHRoZSBtb2R1bGUgbmFtZS4gIFRoZSBmaW5hbCBzdGVwIGluIGluaXRpYWxpemF0aW9uIGlzIGNhbGxpbmcgdGhlIDx0dD5pbml0aWFsaXplKCk8L3R0PiBtZXRob2QgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmluaXRpYWxpemUodm9pZCkKLS8vCi0vLyBQcm9kdWNlcyBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gICBBc3N1bWVzIHRoYXQgdGhlIG1vZHVsZQotLy8gbmFtZSBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZC4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6aW5pdGlhbGl6ZSgpCi17Ci0JLy8gQ2hlY2sgaWYgYSBtb2R1bGUgaGFzIGJlZW4gZGVmaW5lZAotCWlmICghbW9kdWxlKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJXYXJuaW5nLiBObyBtb2R1bGUgbmFtZSBnaXZlbiFcbiIpOwotCQltb2R1bGUgPSAic3dpZyI7Ci0JfQotCi0JLy8gR2VuZXJhdGUgYSBDUFAgc3ltYm9sIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCi0JZnByaW50ZihmX2hlYWRlciwiI2RlZmluZSBTV0lHX2luaXQgICAgJXNfSW5pdFxuXG5cbiIsIG1vZHVsZSk7Ci0KLQkvLyBTdGFydCBnZW5lcmF0aW5nIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotCWZwcmludGYoZl9pbml0LCJpbnQgU1dJR19pbml0KFRjbF9JbnRlcnAgKmludGVycCkge1xuIik7Ci0JZnByaW50ZihmX2luaXQsIlx0IGlmIChpbnRlcnAgPT0gMCkgcmV0dXJuIFRDTF9FUlJPUjtcbiIpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PmluaXRpYWxpemUoKTwvdHQ+IG1ldGhvZCBzaG91bGQgY3JlYXRlIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gYnkgZW1pdHRpbmcgY29kZSB0byA8dHQ+Zl9pbml0PC90dD4gYXMgc2hvd24uICAgQnkgdGhpcyBwb2ludCwgd2Ugc2hvdWxkIGFscmVhZHkga25vdyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlLCBidXQgc2hvdWxkIGNoZWNrIGp1c3QgaW4gY2FzZS4gICBUaGUgcHJlZmVycmVkIHN0eWxlIG9mIGNyZWF0aW5nIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyB0byBjcmVhdGUgYSBDIHByZXByb2Nlc3NvciBzeW1ib2wgPHR0PlNXSUdfaW5pdDwvdHQ+LiAgICAgIERvaW5nIHNvIG1heSBsb29rIHdlaXJkLCBidXQgaXQgdHVybnMgb3V0IHRoYXQgbWFueSBTV0lHIGxpYnJhcnkgZmlsZXMgbWF5IHdhbnQgdG8ga25vdyB0aGUgbmFtZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICAgSWYgd2UgZGVmaW5lIGEgc3ltYm9sIGZvciBpdCwgdGhlc2UgZmlsZXMgY2FuIHNpbXBseSBhc3N1bWUgdGhhdCBpdCdzIGNhbGxlZCA8dHQ+U1dJR19pbml0KCk8L3R0PiBhbmQgZXZlcnl0aGluZyB3aWxsIHdvcmsgb3V0IChva2F5LCBzbyBpdCdzIGEgaGFjaykuPHA+Ci08YSBuYW1lPSJuMzUiPjwvYT48aDM+IENsZWFudXAgPC9oMz4KLVdoZW4gYW4gaW50ZXJmYWNlIGZpbGUgaGFzIGZpbmlzaGVkIHBhcnNpbmcsIHdlIG5lZWQgdG8gY2xlYW4gZXZlcnl0aGluZyB1cC4gIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgPHR0PmNsb3NlKCk8L3R0PiBtZXRob2QgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpjbG9zZSh2b2lkKQotLy8KLS8vIFdyYXAgdGhpbmdzIHVwLiAgQ2xvc2UgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBNWUxBTkc6OmNsb3NlKHZvaWQpCi17Ci0gIC8vIER1bXAgdGhlIHBvaW50ZXIgZXF1aXZhbGVuY3kgdGFibGUKLSAgZW1pdF9wdHJfZXF1aXZhbGVuY2UoZl9pbml0KTsKLQotICAvLyBGaW5pc2ggb2ZmIG91ciBpbml0IGZ1bmN0aW9uIGFuZCBwcmludCBpdCB0byB0aGUgaW5pdCBmaWxlCi0gIGZwcmludGYoZl9pbml0LCJcdCByZXR1cm4gVENMX09LO1xuIik7Ci0gIGZwcmludGYoZl9pbml0LCJ9XG4iKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5jbG9zZSgpPC90dD4gbWV0aG9kIHNob3VsZCBmaXJzdCBjYWxsIDx0dD5lbWl0X3B0cl9lcXVpdmFsZW5jZSgpPC90dD4gaWYgdGhlIFNXSUcgcG9pbnRlciB0eXBlIGNoZWNrZXIgaGFzIGJlZW4gdXNlZC4gIFRoaXMgZHVtcHMgb3V0IHN1cHBvcnQgY29kZSB0byBtYWtlIHN1cmUgdGhlIHR5cGUtY2hlY2tlciB3b3JrcyBjb3JyZWN0bHkuICBBZnRlcndhcmRzLCB3ZSBzaW1wbHkgbmVlZCB0byB0ZXJtaW5hdGUgb3VyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGFzIHNob3duLiAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWQsIFNXSUcgZHVtcHMgb3V0IGFsbCBvZiBpdHMgZG9jdW1lbnRhdGlvbiBmaWxlcyBhbmQgZXhpdHMuPHA+Ci08YSBuYW1lPSJuMzYiPjwvYT48aDM+IENyZWF0aW5nIENvbW1hbmRzPC9oMz4KLU5vdywgd2UncmUgbW92aW5nIGludG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBwYXJ0IG9mIFNXSUcuICAgIFRoZSBmaXJzdCBzdGVwIGlzIHRvIG1ha2UgYSBmdW5jdGlvbiB0byBjcmVhdGUgc2NyaXB0aW5nIGxhbmd1YWdlIGNvbW1hbmRzLiAgVGhpcyBpcyBkb25lIHVzaW5nIHRoZSA8dHQ+Y3JlYXRlX2NvbW1hbmQoKTwvdHQ+IGZ1bmN0aW9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmNyZWF0ZV9jb21tYW5kKGNoYXIgKmNuYW1lLCBjaGFyICppbmFtZSkKLS8vCi0vLyBDcmVhdGVzIGEgVGNsIGNvbW1hbmQgZnJvbSBhIEMgZnVuY3Rpb24uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIE1ZTEFORzo6Y3JlYXRlX2NvbW1hbmQoY2hhciAqY25hbWUsIGNoYXIgKmluYW1lKSB7Ci0JLy8gQ3JlYXRlIGEgbmFtZSBmb3IgdGhlIHdyYXBwZXIgZnVuY3Rpb24KLQljaGFyICp3bmFtZSA9IG5hbWVfd3JhcHBlcihjbmFtZSwiIik7Ci0KLQkvLyBDcmVhdGUgYSBUY2wgY29tbWFuZAotCWZwcmludGYoZl9pbml0LCJcdCBUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsXCIlc1wiLCVzLCAoQ2xpZW50RGF0YSkgTlVMTCwKLQkJKFRjbF9DbWREZWxldGVQcm9jICopIE5VTEwpO1xuIiwgaW5hbWUsIHduYW1lKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRm9yIG91ciBUY2wgbW9kdWxlLCB0aGlzIGp1c3QgY2FsbHMgVGNsX0NyZWF0ZUNvbW1hbmQgdG8gbWFrZSBhIG5ldyBzY3JpcHRpbmcgbGFuZ3VhZ2UgY29tbWFuZC4gPHA+Ci08YSBuYW1lPSJuMzciPjwvYT48aDM+IENyZWF0aW5nIGEgV3JhcHBlciBGdW5jdGlvbjwvaDM+Ci1UaGUgbW9zdCBjb21wbGljYXRlZCBwYXJ0IG9mIHdyaXRpbmcgYSBsYW5ndWFnZSBtb2R1bGUgaXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgd3JhcHBlciBmdW5jdGlvbnMuICBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIDx0dD5jcmVhdGVfZnVuY3Rpb24oKTwvdHQ+IG1ldGhvZCBhcyBzaG93biBoZXJlIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNWUxBTkc6OmNyZWF0ZV9mdW5jdGlvbihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKmQsIFBhcm1MaXN0ICpsKQotLy8KLS8vIENyZWF0ZSBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFuZCByZWdpc3RlciBpdCB3aXRoIHRoZSBpbnRlcnByZXRlci4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBNWUxBTkc6OmNyZWF0ZV9mdW5jdGlvbihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQsIFBhcm1MaXN0ICpsKQotewotICBTdHJpbmcgICAgICAgICAgIHNvdXJjZSwgdGFyZ2V0OwotICBjaGFyICAgICAgICAgICAgICp0bTsKLSAgU3RyaW5nICAgICAgICAgICBjbGVhbnVwLCBvdXRhcmc7Ci0gIFdyYXBwZXJGdW5jdGlvbiAgZjsKLQotICAvLyBNYWtlIGEgd3JhcHBlciBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uCi0gIGNoYXIgKnduYW1lID0gbmFtZV93cmFwcGVyKGluYW1lLCIiKTsKLQotICAvLyBOb3cgd3JpdGUgdGhlIHdyYXBwZXIgZnVuY3Rpb24gaXRzZWxmCi0gIGYuZGVmICZsdDsmbHQ7ICJzdGF0aWMgaW50ICIgJmx0OyZsdDsgd25hbWUgJmx0OyZsdDsgIihDbGllbnREYXRhIGNsaWVudERhdGEsIFRjbF9JbnRlcnAgKmludGVycCwgaW50IAotYXJnYywgY2hhciAqYXJndltdKSB7XG4iOwotCi0gIC8vIEVtaXQgYWxsIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgZm9yIGhvbGRpbmcgYXJndW1lbnRzLgotICBpbnQgcGNvdW50ID0gZW1pdF9hcmdzKHQsbCxmKTsKLQotICAvLyBHZXQgbnVtYmVyIG9mIG9wdGlvbmFsL2RlZmF1bHQgYXJndW1lbnRzCi0gIGludCBudW1vcHQgPSBsLSZndDtudW1vcHQoKTsKLQotICAvLyBFbWl0IGNvdW50IHRvIGNoZWNrIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzCi0gIGYuY29kZSAmbHQ7Jmx0OyB0YWI0ICZsdDsmbHQ7ICJpZiAoKGFyZ2MgJmx0OyAiICZsdDsmbHQ7IChwY291bnQtbnVtb3B0KSArIDEgJmx0OyZsdDsgIikgfHwgKGFyZ2MgJmd0OyAiIAotICAgICAgICAgJmx0OyZsdDsgbC0mZ3Q7bnVtYXJnKCkrMSAmbHQ7Jmx0OyAiKSkge1xuIgotICAgICAgICAgJmx0OyZsdDsgdGFiOCAmbHQ7Jmx0OyAiVGNsX1NldFJlc3VsdChpbnRlcnAsIFwiV3JvbmcgIyBhcmdzLlwiLFRDTF9TVEFUSUMpO1xuIgotICAgICAgICAgJmx0OyZsdDsgdGFiOCAmbHQ7Jmx0OyAicmV0dXJuIFRDTF9FUlJPUjtcbiIKLSAgICAgICAgICZsdDsmbHQ7IHRhYjQgJmx0OyZsdDsgIn1cbiI7Ci0KLSAgLy8gTm93IHdhbGsgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0IGFuZCBnZW5lcmF0ZSBjb2RlIHRvIGdldCBhcmd1bWVudHMKLSAgaW50IGogPSAwOyAgICAgICAgICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2Ygbm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotCi0gIGZvciAoaW50IGkgPSAwOyBpICZsdDsgcGNvdW50IDsgaSsrKSB7Ci0gICAgUGFybSAmYW1wO3AgPSAoKmwpW2ldOyAgICAgICAgIC8vIEdldCB0aGUgaXRoIGFyZ3VtZW50Ci0gICAgc291cmNlID0gIiI7Ci0gICAgdGFyZ2V0ID0gIiI7Ci0KLSAgICAvLyBQcm9kdWNlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBzb3VyY2UgYW5kIHRhcmdldCBhcmd1bWVudHMKLSAgICBzb3VyY2UgJmx0OyZsdDsgImFyZ3ZbIiAmbHQ7Jmx0OyBqKzEgJmx0OyZsdDsgIl0iOwotICAgIHRhcmdldCAmbHQ7Jmx0OyAiX2FyZyIgJmx0OyZsdDsgaTsKLSAgICBpZiAoIXAuaWdub3JlKSB7Ci0gICAgICBpZiAoaiAmZ3Q7PSAocGNvdW50LW51bW9wdCkpICAvLyBDaGVjayBpZiBwYXJzaW5nIGFuIG9wdGlvbmFsIGFyZ3VtZW50Ci0gICAgICAgIGYuY29kZSAmbHQ7Jmx0OyB0YWI0ICZsdDsmbHQ7ICJpZiBhcmdjICZndDsiICZsdDsmbHQ7IGorMSAmbHQ7Jmx0OyAiKSB7XG4iOwotCi0gICAgICAvLyBHZXQgdHlwZW1hcCBmb3IgdGhpcyBhcmd1bWVudAotICAgICAgdG0gPSB0eXBlbWFwX2xvb2t1cCgiaW4iLHR5cGVtYXBfbGFuZyxwLnQscC5uYW1lLHNvdXJjZSx0YXJnZXQsJmFtcDtmKTsKLSAgICAgIGlmICh0bSkgewotICAgICAgICBmLmNvZGUgJmx0OyZsdDsgdG0gJmx0OyZsdDsgIlxuIjsKLSAgICAgICAgZi5jb2RlLnJlcGxhY2UoIiRhcmciLHNvdXJjZSk7ICAgLy8gUGVyZm9ybSBhIHZhcmlhYmxlIHJlcGxhY2VtZW50Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXMgOiBMaW5lICVkLiBObyB0eXBlbWFwcGluZyBmb3IgZGF0YXR5cGUgJXNcbiIsCi0gICAgICAgICAgICAgICAgaW5wdXRfZmlsZSxsaW5lX251bWJlciwgcC50LSZndDtwcmludF90eXBlKCkpOwotICAgICAgfQotICAgICAgaWYgKGogJmd0Oz0gKHBjb3VudC1udW1vcHQpKQotICAgICAgICBmLmNvZGUgJmx0OyZsdDsgdGFiNCAmbHQ7Jmx0OyAifSBcbiI7Ci0gICAgICBqKys7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbnkgc29ydCBvZiBhIGNvbnN0YWludCB0eXBlbWFwCi0gICAgaWYgKCh0bSA9IHR5cGVtYXBfbG9va3VwKCJjaGVjayIsdHlwZW1hcF9sYW5nLHAudCxwLm5hbWUsc291cmNlLHRhcmdldCkpKSB7Ci0gICAgICBmLmNvZGUgJmx0OyZsdDsgdG0gJmx0OyZsdDsgIlxuIjsKLSAgICAgIGYuY29kZS5yZXBsYWNlKCIkYXJnIixzb3VyY2UpOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbnkgY2xlYW51cCBjb2RlIChzYXZlIGl0IGZvciBsYXRlcikKLSAgICBpZiAoKHRtID0gdHlwZW1hcF9sb29rdXAoImZyZWVhcmciLHR5cGVtYXBfbGFuZyxwLnQscC5uYW1lLHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVycC0mZ3Q7cmVzdWx0IikpKSB7Ci0gICAgICBjbGVhbnVwICZsdDsmbHQ7IHRtICZsdDsmbHQ7ICJcbiI7Ci0gICAgICBjbGVhbnVwLnJlcGxhY2UoIiRhcmciLHNvdXJjZSk7Ci0gICAgfQotICAgIGlmICgodG0gPSB0eXBlbWFwX2xvb2t1cCgiYXJnb3V0Iix0eXBlbWFwX2xhbmcscC50LHAubmFtZSx0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcnAtJmd0O3Jlc3VsdCIpKSkgewotICAgICAgb3V0YXJnICZsdDsmbHQ7IHRtICZsdDsmbHQ7ICJcbiI7Ci0gICAgICBvdXRhcmcucmVwbGFjZSgiJGFyZyIsc291cmNlKTsKLSAgICB9Ci0gIH0KLQotICAvLyBOb3cgd3JpdGUgY29kZSB0byBtYWtlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIGVtaXRfZnVuY19jYWxsKG5hbWUsdCxsLGYpOwotCi0gIC8vIFJldHVybiB2YWx1ZSBpZiBuZWNlc3NhcnkKLSAgaWYgKCh0LSZndDt0eXBlICE9IFRfVk9JRCkgfHwgKHQtJmd0O2lzX3BvaW50ZXIpKSB7Ci0gICAgaWYgKCh0bSA9IHR5cGVtYXBfbG9va3VwKCJvdXQiLHR5cGVtYXBfbGFuZyx0LG5hbWUsIl9yZXN1bHQiLCJpbnRlcnAtJmd0O3Jlc3VsdCIpKSkgewotICAgICAgLy8gWWVwLiAgVXNlIGl0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKLSAgICAgIGYuY29kZSAmbHQ7Jmx0OyB0bSAmbHQ7Jmx0OyAiXG4iOwotICAgIH0gZWxzZSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwiJXMgOiBMaW5lICVkLiBObyByZXR1cm4gdHlwZW1hcCBmb3IgZGF0YXR5cGUgJXNcbiIsCi0gICAgICAgICAgICAgIGlucHV0X2ZpbGUsbGluZV9udW1iZXIsdC0mZ3Q7cHJpbnRfdHlwZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBEdW1wIGFyZ3VtZW50IG91dHB1dCBjb2RlOwotICBmLmNvZGUgJmx0OyZsdDsgb3V0YXJnOwotCi0gIC8vIER1bXAgdGhlIGFyZ3VtZW50IGNsZWFudXAgY29kZQotICBmLmNvZGUgJmx0OyZsdDsgY2xlYW51cDsKLQotICAvLyBMb29rIGZvciBhbnkgcmVtYWluaW5nIGNsZWFudXAuICBUaGlzIHByb2Nlc3NlcyB0aGUgJW5ldyBkaXJlY3RpdmUKLSAgaWYgKE5ld09iamVjdCkgewotICAgIGlmICgodG0gPSB0eXBlbWFwX2xvb2t1cCgibmV3ZnJlZSIsdHlwZW1hcF9sYW5nLHQsaW5hbWUsIl9yZXN1bHQiLCIiKSkpIHsKLSAgICAgIGYuY29kZSAmbHQ7Jmx0OyB0bSAmbHQ7Jmx0OyAiXG4iOwotICAgIH0KLSAgfQotCi0gIC8vIFNwZWNpYWwgcHJvY2Vzc2luZyBvbiByZXR1cm4gdmFsdWUuCi0gIGlmICgodG0gPSB0eXBlbWFwX2xvb2t1cCgicmV0Iix0eXBlbWFwX2xhbmcsdCxuYW1lLCJfcmVzdWx0IiwiIikpKSB7Ci0gICAgZi5jb2RlICZsdDsmbHQ7IHRtICZsdDsmbHQ7ICJcbiI7Ci0gIH0KLQotICAvLyBXcmFwIHRoaW5ncyB1cCAoaW4gYSBtYW5uZXIgb2Ygc3BlYWtpbmcpCi0gIGYuY29kZSAmbHQ7Jmx0OyB0YWI0ICZsdDsmbHQ7ICJyZXR1cm4gVENMX09LO1xufSI7Ci0KLSAgLy8gU3Vic3RpdHV0ZSB0aGUgY2xlYW51cCBjb2RlIChzb21lIGV4Y2VwdGlvbiBoYW5kbGVycyBsaWtlIHRvIGhhdmUgdGhpcykKLSAgZi5jb2RlLnJlcGxhY2UoIiRjbGVhbnVwIixjbGVhbnVwKTsKLQotICAvLyBFbWl0IHRoZSBmdW5jdGlvbgotICBmLnByaW50KGZfd3JhcHBlcnMpOwotCi0gIC8vIE5vdyByZWdpc3RlciB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgbGFuZ3VhZ2UKLSAgY3JlYXRlX2NvbW1hbmQoaW5hbWUsaW5hbWUpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1DcmVhdGluZyBhIHdyYXBwZXIgZnVuY3Rpb24gcmVhbGx5IGJvaWxzIGRvd24gdG8gMyBjb21wb25lbnRzIDo8cD4KLTxwPgotPHVsPgotPGxpPkVtaXQgbG9jYWwgdmFyaWFibGVzIGFuZCBoYW5kbGluZyBpbnB1dCBhcmd1bWVudHMuICAKLTxsaT5DYWxsIHRoZSByZWFsIEMgZnVuY3Rpb24uCi08bGk+Q29udmVydCB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHJlcHJlc2VudGF0aW9uLgotPC91bD4KLTxwPgotSW4gb3VyIGltcGxlbWVudGF0aW9uLCBtb3N0IG9mIHRoaXMgd29yayBpcyBkb25lIHVzaW5nIHR5cGVtYXBzLiAgIEluIGZhY3QsIHRoZSByb2xlIG9mIHRoZSBDKysgY29kZSBpcyByZWFsbHkganVzdCB0byBwcm9jZXNzIHR5cGVtYXBzIGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlciBhbmQgdG8gY29tYmluZSBzdHJpbmdzIGluIHRoZSBjb3JyZWN0IG1hbm5lci4gIFRoZSBmb2xsb3dpbmcgdHlwZW1hcHMgYXJlIHVzZWQgaW4gdGhpcyBwcm9jZWR1cmUgOjxwPgotPHA+Ci08dWw+Ci08bGk+ImluIi4gIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IGZ1bmN0aW9uIGFyZ3VtZW50cyBmcm9tIFRjbCB0byBDLgotPGxpPiJvdXQiLiBUaGlzIGlzIHVzZWQgdG8gY29udmVydCB0aGUgcmV0dXJuIHZhbHVlIGZyb20gQyB0byBUY2wuCi08bGk+ImNoZWNrIi4gVGhpcyBpcyB1c2VkIHRvIGFwcGx5IGNvbnN0cmFpbnRzIHRvIHRoZSBpbnB1dCB2YWx1ZXMuCi08bGk+ImFyZ291dCIuIFVzZWQgdG8gcmV0dXJuIHZhbHVlcyB0aHJvdWdoIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCi08bGk+ImZyZWVhcmciLiBVc2VkIHRvICBjbGVhbiB1cCBhcmd1bWVudHMgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsIChwb3NzaWJseSB0byByZWxlYXNlIG1lbW9yeSwgZXRjLi4uKQotPGxpPiJyZXQiLiBVc2VkIHRvIGNsZWFuIHVwIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBDIGZ1bmN0aW9uIChwb3NzaWJseSB0byByZWxlYXNlIG1lbW9yeSkuCi08bGk+Im5ld2ZyZWUiIHRoaXMgaXMgc3BlY2lhbCBwcm9jZXNzaW5nIGFwcGxpZWQgd2hlbiB0aGUgPHR0PiVuZXc8L3R0PiBkaXJlY3RpdmUgaGFzIGJlZW4gdXNlZC4gIFVzdWFsbHkgaXRzIHVzZWQgdG8gY2xlYW4gdXAgbWVtb3J5LgotPC91bD4KLTxwPgotSXQgbWF5IHRha2UgYXdoaWxlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIHNpbmsgaW4sIGJ1dCBpdHMgb3BlcmF0aW9uIHdpbGwgaG9wZWZ1bGx5IGJlY29tZSBtb3JlIGNsZWFyIHNob3J0bHkuICAgPHA+Ci08YSBuYW1lPSJuMzgiPjwvYT48aDM+IE1hbmlwdWxhdGluZyBHbG9iYWwgVmFyaWFibGVzPC9oMz4KLVRvIHByb3ZpZGUgYWNjZXNzIHRvIEMgZ2xvYmFsIHZhcmlhYmxlcywgdGhlIDx0dD5saW5rX3ZhcmlhYmxlKCk8L3R0PiBtZXRob2QgaXMgdXNlZC4gSW4gdGhlIGNhc2Ugb2YgVGNsLCBvbmx5IDx0dD5pbnQ8L3R0PiwgPHR0PmRvdWJsZTwvdHQ+LCBhbmQgPHR0PmNoYXIgKiA8L3R0PmRhdGF0eXBlcyBjYW4gYmUgc2FmZWx5IGxpbmtlZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTVlMQU5HOjpsaW5rX3ZhcmlhYmxlKGNoYXIgKm5hbWUsIGNoYXIgKmluYW1lLCBEYXRhVHlwZSAqdCkKLS8vCi0vLyBDcmVhdGUgYSBUY2wgbGluayB0byBhIEMgdmFyaWFibGUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6bGlua192YXJpYWJsZShjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQpIHsKLSAgY2hhciAqdG07Ci0KLSAgLy8gVXNlcyBhIHR5cGVtYXAgdG8gc3RpY2sgY29kZSBpbnRvIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KLSAgaWYgKCh0bSA9IHR5cGVtYXBfbG9va3VwKCJ2YXJpbml0Iix0eXBlbWFwX2xhbmcsdCxuYW1lLG5hbWUsaW5hbWUpKSkgewotICAgIFN0cmluZyB0ZW1wID0gdG07Ci0gICAgaWYgKFN0YXR1cyAmYW1wOyBTVEFUX1JFQURPTkxZKQotICAgICAgdGVtcC5yZXBsYWNlKCIkc3RhdHVzIiwiIHwgVENMX0xJTktfUkVBRF9PTkxZIik7Ci0gICAgZWxzZQotICAgICAgdGVtcC5yZXBsYWNlKCIkc3RhdHVzIiwiIik7Ci0gICAgZnByaW50ZihmX2luaXQsIiVzXG4iLChjaGFyICopIHRlbXApOwotICB9IGVsc2UgewotICAgIGZwcmludGYoc3RkZXJyLCIlcyA6IExpbmUgJWQuIFVuYWJsZSB0byBsaW5rIHdpdGggdmFyaWFibGUgdHlwZSAlc1xuIiwKLSAgICAgICAgICAgIGlucHV0X2ZpbGUsbGluZV9udW1iZXIsdC0mZ3Q7cHJpbnRfdHlwZSgpKTsKLSAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JbiB0aGlzIGNhc2UsICB0aGUgcHJvY2VkdXJlIGlzIGxvb2tpbmcgZm9yIGEgdHlwZW1hcCAidmFyaW5pdCIuICBXZSdsbCB1c2UgdGhlIGNvZGUgc3BlY2lmaWVkIHdpdGggdGhpcyB0eXBlbWFwIHRvIGNyZWF0ZSB2YXJpYWJsZSBsaW5rcy4gIElmIG5vIHR5cGVtYXAgaXMgc3VwcGxpZWQgb3IgdGhlIHVzZXIgZ2l2ZXMgYW4gdW5zdXBwb3J0ZWQgZGF0YXR5cGVzLCBhIHdhcm5pbmcgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC48cD4KLTxwPgotSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgPHR0PlN0YXR1czwvdHQ+IHZhcmlhYmxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgb3Igbm90IGEgdmFyaWFibGUgaXMgcmVhZC1vbmx5IG9yIG5vdC4gIFRvIHRlc3QgZm9yIHRoaXMsIHVzZSB0aGUgdGVjaG5pcXVlIHNob3duIGluIHRoZSBjb2RlIGFib3ZlLiAgIFJlYWQtb25seSB2YXJpYWJsZXMgbWF5IHJlcXVpcmUgc3BlY2lhbCBwcm9jZXNzaW5nIGFzIHNob3duLjxwPgotPGEgbmFtZT0ibjM5Ij48L2E+PGgzPiBDb25zdGFudHM8L2gzPgotRmluYWxseSwgY3JlYXRpbmcgY29uc3RhbnRzIGlzIGFjY29tcGxpc2hlZCB1c2luZyB0aGUgPHR0PmRlY2xhcmVfY29uc3QoKTwvdHQ+IG1ldGhvZC4gICBGb3IgVGNsLCB3ZSBjb3VsZCBkbyB0aGlzIDo8cD4KLSA8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ZTEFORzo6ZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsIGNoYXIgKnZhbHVlKQotLy8KLS8vIE1ha2VzIGEgY29uc3RhbnQuICAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1ZTEFORzo6ZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsIGNoYXIgKnZhbHVlKSB7Ci0KLSAgY2hhciAqdG07Ci0gIGlmICgodG0gPSB0eXBlbWFwX2xvb2t1cCgiY29uc3QiLHR5cGVtYXBfbGFuZyx0eXBlLG5hbWUsbmFtZSxpbmFtZSkpKSB7Ci0gICAgU3RyaW5nIHN0ciA9IHRtOwotICAgIHN0ci5yZXBsYWNlKCIkdmFsdWUiLHZhbHVlKTsKLSAgICBmcHJpbnRmKGZfaW5pdCwiJXNcbiIsIChjaGFyICopIHN0cik7Ci0gIH0gZWxzZSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIiVzIDogTGluZSAlZC4gVW5hYmxlIHRvIGNyZWF0ZSBjb25zdGFudCAlcyA9ICVzXG4iLAotICAgICAgICAgICAgaW5wdXRfZmlsZSwgbGluZV9udW1iZXIsIHR5cGUtJmd0O3ByaW50X3R5cGUoKSwgdmFsdWUpOwotICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdlIHRha2UgdGhlIHNhbWUgYXBwcm9hY2ggdXNlZCB0byBjcmVhdGUgdmFyaWFibGVzLiAgSW4gdGhpcyBjYXNlLCB0aGUgYDx0dD5jb25zdDwvdHQ+JyB0eXBlbWFwIHNwZWNpZmllcyB0aGUgc3BlY2lhbCBwcm9jZXNzaW5nLjxwPgotPHA+Ci1UaGUgdmFsdWUgb2YgYSBjb25zdGFudCBpcyBhIHN0cmluZyBwcm9kdWNlZCBieSB0aGUgU1dJRyBwYXJzZXIuICBJdCBtYXkgY29udGFpbiBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24gc3VjaCBhcyAiMyArIDQqKDcrOCkiLiAgIEJlY2F1c2Ugb2YgdGhpcywgaXQgaXMgY3JpdGljYWwgdG8gdXNlIHRoaXMgc3RyaW5nIGluIGEgd2F5IHRoYXQgYWxsb3dzIGl0IHRvIGJlIGV2YWx1YXRlZCBieSB0aGUgQyBjb21waWxlciAodGhpcyB3aWxsIGJlIGFwcGFyZW50IHdoZW4gdGhlIHR5cGVtYXBzIGFyZSBnaXZlbikuPHA+Ci08YSBuYW1lPSJuNDAiPjwvYT48aDM+IEEgUXVpY2sgSW50ZXJtaXNzaW9uPC9oMz4KLVdlIGFyZSBub3cgZG9uZSB3cml0aW5nIGFsbCBvZiB0aGUgbWV0aG9kcyBmb3Igb3VyIGxhbmd1YWdlIGNsYXNzLiAgIE9mIGFsbCBvZiB0aGUgbWV0aG9kcywgPHR0PmNyZWF0ZV9mdW5jdGlvbigpPC90dD4gaXMgdGhlIG1vc3QgY29tcGxpY2F0ZWQgYW5kIHRlbmRzIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmsuICAgV2UgaGF2ZSBhbHNvIGlnbm9yZWQgaXNzdWVzIHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbiBwcm9jZXNzaW5nIGFuZCBDKysgaGFuZGxpbmcgKGFsdGhvdWdoIEMrKyB3aWxsIHdvcmsgd2l0aCB0aGUgZnVuY3Rpb25zIHdlIGhhdmUgZGVmaW5lZCBzbyBmYXIpLjxwPgotPHA+Ci1XaGlsZSBvdXIgQysrIGltcGxlbWVudGF0aW9uIGlzIGRvbmUsIHdlIHN0aWxsIGRvIG5vdCBoYXZlIGEgd29ya2luZyBsYW5ndWFnZSBtb2R1bGUuICAgSW4gZmFjdCwgaWYgd2UgcnVuIFNXSUcgb24gdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGV4YW1wbGUuaSAqLwotJW1vZHVsZSBleGFtcGxlCi0lewotLyogUHV0IGhlYWRlcnMgYW5kIG90aGVyIGRlY2xhcmF0aW9ucyBoZXJlICovCi0lfQotCi0vLyBBIGZ1bmN0aW9uCi1leHRlcm4gZG91YmxlIGZvbyhkb3VibGUgYSwgZG91YmxlIGIpOwotCi0vLyBBIHZhcmlhYmxlCi1leHRlcm4gaW50IGJhcjsKLQotLy8gQSBjb25zdGFudAotI2RlZmluZSBTUEFNIDQyCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdlIGdldCB0aGUgZm9sbG93aW5nIGVycm9ycyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+W2JlYXpsZXlAZ3Vpbm5lc3MgbGFuZ10kIC4vbXlzd2lnIGV4YW1wbGUuaQotTWFraW5nIHdyYXBwZXJzIGZvciBNeSBUY2wKLWV4YW1wbGUuaSA6IExpbmUgOS4gTm8gdHlwZW1hcHBpbmcgZm9yIGRhdGF0eXBlIGRvdWJsZQotZXhhbXBsZS5pIDogTGluZSA5LiBObyB0eXBlbWFwcGluZyBmb3IgZGF0YXR5cGUgZG91YmxlCi1leGFtcGxlLmkgOiBMaW5lIDkuIE5vIHJldHVybiB0eXBlbWFwIGZvciBkYXRhdHlwZSBkb3VibGUKLWV4YW1wbGUuaSA6IExpbmUgMTIuIFVuYWJsZSB0byBsaW5rIHdpdGggdmFyaWFibGUgdHlwZSBpbnQKLWV4YW1wbGUuaSA6IExpbmUgMTYuIFVuYWJsZSB0byBjcmVhdGUgY29uc3RhbnQgaW50ICA9IDQyCi1bYmVhemxleUBndWlubmVzcyBsYW5nXSQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHdlIGhhdmUgbm90IHlldCBkZWZpbmVkIGFueSBwcm9jZXNzaW5nIGZvciByZWFsIGRhdGF0eXBlcy4gRm9yIGV4YW1wbGUsIG91ciBsYW5ndWFnZSBtb2R1bGUgaGFzIG5vIGlkZWEgaG93IHRvIGNvbnZlcnQgZG91YmxlcyBpbnRvIFRjbCBzdHJpbmdzLCBob3cgdG8gbGluayB3aXRoIEMgdmFyaWFibGVzIGFuZCBzbyBvbi4gICBUbyBkbyB0aGlzLCB3ZSBuZWVkIHRvIHdyaXRlIGEgY29sbGVjdGlvbiBvZiB0eXBlbWFwcy48cD4KLTxhIG5hbWU9Im40MSI+PC9hPjxoMz4gV3JpdGluZyB0aGUgZGVmYXVsdCB0eXBlbWFwczwvaDM+Ci1JbiBvdXIgZWFybGllciA8dHQ+cGFyc2UoKTwvdHQ+IG1ldGhvZCwgdGhlcmUgaXMgYSBzdGF0ZW1lbnQgdG8gaW5jbHVkZSB0aGUgZmlsZSBgPHR0PmxhbmcubWFwPC90dD4nLiAgIFdlIHdpbGwgdXNlIHRoaXMgZmlsZSB0byB3cml0ZSB0eXBlbWFwcyBmb3Igb3VyIG5ldyBsYW5ndWFnZSBtb2R1bGUuICBUaGUgYDx0dD5sYW5nLm1hcDwvdHQ+JyBmaWxlIHdpbGwgYWN0dWFsbHkgZ28gdGhyb3VnaCB0aGUgU1dJRyBwYXJzZXIgc28gd2UgY2FuIHdyaXRlIG91ciB0eXBlbWFwcyB1c2luZyB0aGUgbm9ybWFsIDx0dD4ldHlwZW1hcDwvdHQ+IGRpcmVjdGl2ZS4gIFRoaXMgYXBwcm9hY2ggbWFrZXMgaXQgZWFzeSBmb3IgdXMgdG8gZGVidWcgYW5kIHRlc3Qgb3VyIG1vZHVsZSBiZWNhdXNlIHRoZSB0eXBlbWFwcyBjYW4gYmUgZGV2ZWxvcGVkIGFuZCB0ZXN0ZWQgd2l0aG91dCBoYXZpbmcgdG8gcmVwZWF0ZWRseSByZWNvbXBpbGUgdGhlIEMrKyBwYXJ0IG9mIHRoZSBtb2R1bGUuICA8cD4KLTxwPgotV2l0aG91dCBmdXJ0aGVyIGRlbGF5LCBoZXJlIGlzIHRoZSB0eXBlbWFwIGZpbGUgZm9yIG91ciBtb2R1bGUgKHlvdSBtaWdodCB3YW50IHRvIHNpdCBkb3duKSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gbGFuZy5tYXAKLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIHR5cGUtbWFwcGluZ3MgZm9yIG91ciBsYW5ndWFnZSAoVENMKS4KLS8vIEEgdHlwZW1hcCBvZiAnU1dJR19ERUZBVUxUX1RZUEUnIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZSBkZWZhdWx0Ci0vLyBtYXBwaW5ncy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogRlVOQ1RJT04gSU5QVVRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vIEludGVnZXJzCi0ldHlwZW1hcChpbikgaW50ICAgICAgICAgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgIHNob3J0ICAgICAgICAgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICBsb25nICAgICAgICAgICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgc2lnbmVkIGNoYXIgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICBTV0lHX0RFRkFVTFRfVFlQRQotewotICBpbnQgIHRlbXA7Ci0gIGlmIChUY2xfR2V0SW50KGludGVycCwgJHNvdXJjZSwgJmFtcDt0ZW1wKSA9PSBUQ0xfRVJST1IpIHJldHVybiBUQ0xfRVJST1I7Ci0gICR0YXJnZXQgPSAoJHR5cGUpIHRlbXA7Ci19Ci0KLS8vIEZsb2F0aW5nIHBvaW50Ci0ldHlwZW1hcChpbikgZmxvYXQgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICBkb3VibGUgIFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIGRvdWJsZSB0ZW1wOwotICBpZiAoVGNsX0dldERvdWJsZShpbnRlcnAsICRzb3VyY2UsICZhbXA7dGVtcCkgPT0gVENMX0VSUk9SKSByZXR1cm4gVENMX0VSUk9SOwotICAkdGFyZ2V0ID0gKCR0eXBlKSB0ZW1wOwotfQotCi0vLyBTdHJpbmdzCi0ldHlwZW1hcChpbikgY2hhciAqICBTV0lHX0RFRkFVTFRfVFlQRQotewotICAkdGFyZ2V0ID0gJHNvdXJjZTsKLX0KLQotLy8gdm9pZCAqCi0ldHlwZW1hcChpbikgdm9pZCAqICBTV0lHX0RFRkFVTFRfVFlQRQotewotICBpZiAoU1dJR19HZXRQdHIoJHNvdXJjZSwodm9pZCAqKikgJmFtcDskdGFyZ2V0LCAoY2hhciAqKSAwKSkgewotICAgIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCJUeXBlIGVycm9yLiAgRXhwZWN0ZWQgYSBwb2ludGVyIixUQ0xfU1RBVElDKTsKLSAgICByZXR1cm4gVENMX0VSUk9SOwotICB9Ci19Ci0KLS8vIFVzZXIgZGVmaW5lZCB0eXBlcyBhbmQgYWxsIG90aGVyIHBvaW50ZXJzCi0ldHlwZW1hcChpbikgVXNlciAqIFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIGlmIChTV0lHX0dldFB0cigkc291cmNlLCh2b2lkICoqKSAmYW1wOyR0YXJnZXQsICIkbWFuZ2xlIikpIHsKLSAgICBUY2xfU2V0UmVzdWx0KGludGVycCwiVHlwZSBlcnJvci4gIEV4cGVjdGVkIGEgJG1hbmdsZSIsVENMX1NUQVRJQyk7Ci0gICAgcmV0dXJuIFRDTF9FUlJPUjsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGVU5DVElPTiBPVVRQVVRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vIFNpZ25lZCBpbnRlZ2VycwotJXR5cGVtYXAob3V0KSBpbnQgICAgICAgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgc2hvcnQgICAgICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgIGxvbmcgICAgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICBzaWduZWQgY2hhciBTV0lHX0RFRkFVTFRfVFlQRQotewotICBzcHJpbnRmKCR0YXJnZXQsIiVsZCIsIChsb25nKSAkc291cmNlKTsKLX0KLQotLy8gVW5zaWduZWQgaW50ZWdlcnMKLSV0eXBlbWFwKG91dCkgdW5zaWduZWQgICAgICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgU1dJR19ERUZBVUxUX1RZUEUKLXsKLSAgc3ByaW50ZigkdGFyZ2V0LCIlbHUiLCAodW5zaWduZWQgbG9uZykgJHNvdXJjZSk7Ci19Ci0KLS8vIEZsb2F0aW5nIHBvaW50Ci0ldHlwZW1hcChvdXQpIGRvdWJsZSBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgZmxvYXQgIFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIFRjbF9QcmludERvdWJsZShpbnRlcnAsKGRvdWJsZSkgJHNvdXJjZSxpbnRlcnAtJmd0O3Jlc3VsdCk7Ci19Ci0KLS8vIFN0cmluZ3MKLSV0eXBlbWFwKG91dCkgY2hhciAqU1dJR19ERUZBVUxUX1RZUEUKLXsKLSAgVGNsX1NldFJlc3VsdChpbnRlcnAsJHNvdXJjZSxUQ0xfVk9MQVRJTEUpOwotfQotCi0vLyBQb2ludGVycwotJXR5cGVtYXAob3V0KSBVc2VyICpTV0lHX0RFRkFVTFRfVFlQRQotewotICBTV0lHX01ha2VQdHIoJHRhcmdldCwodm9pZCAqKSAkc291cmNlLCAiJG1hbmdsZSIpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWQVJJQUJMRSBDUkVBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBJbnRlZ2VycwotJXR5cGVtYXAodmFyaW5pdCkgaW50ICAgICAgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIFRjbF9MaW5rVmFyKGludGVycCwgIiR0YXJnZXQiLCAoY2hhciAqKSAmYW1wOyRzb3VyY2UsIFRDTF9MSU5LX0lOVCAkc3RhdHVzKTsKLX0KLQotLy8gRG91YmxlcwotJXR5cGVtYXAodmFyaW5pdCkgZG91YmxlIFNXSUdfREVGQVVMVF9UWVBFIHsKLSAgVGNsX0xpbmtWYXIoaW50ZXJwLCIkdGFyZ2V0IiwgKGNoYXIgKikgJmFtcDskc291cmNlLCBUQ0xfTElOS19ET1VCTEUgJHN0YXR1cyk7Ci19Ci0KLS8vIFN0cmluZ3MKLSV0eXBlbWFwKHZhcmluaXQpIGNoYXIgKiBTV0lHX0RFRkFVTFRfVFlQRSB7Ci0gIFRjbF9MaW5rVmFyKGludGVycCwiJHRhcmdldCIsIChjaGFyICopICZhbXA7JHNvdXJjZSwgVENMX0xJTktfU1RSSU5HICRzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBTaWduZWQgSW50ZWdlcnMKLSV0eXBlbWFwKGNvbnN0KSBpbnQgICAgICAgICAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICAgIHNob3J0ICAgICAgICAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgICBzaWduZWQgY2hhciAgIFNXSUdfREVGQVVMVF9UWVBFCi17Ci0gIHN0YXRpYyBjaGFyICpfd3JhcF8kdGFyZ2V0OwotICBfd3JhcF8kdGFyZ2V0ID0gKGNoYXIgKikgbWFsbG9jKDQwKTsKLSAgc3ByaW50Zihfd3JhcF8kdGFyZ2V0LCIlbGQiLCR2YWx1ZSk7Ci0gIFRjbF9MaW5rVmFyKGludGVycCwiJHRhcmdldCIsIChjaGFyICopICZhbXA7X3dyYXBfJHRhcmdldCwgVENMX0xJTktfU1RSSU5HIHwgCi1UQ0xfTElOS19SRUFEX09OTFkpOwotfQotCi0vLyBVbnNpZ25lZCBpbnRlZ2VycwotJXR5cGVtYXAoY29uc3QpIHVuc2lnbmVkICAgICAgICBTV0lHX0RFRkFVTFRfVFlQRSwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAgU1dJR19ERUZBVUxUX1RZUEUsCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICBTV0lHX0RFRkFVTFRfVFlQRQotewotICBzdGF0aWMgY2hhciAqX3dyYXBfJHRhcmdldDsKLSAgX3dyYXBfJHRhcmdldCA9IChjaGFyICopIG1hbGxvYyg0MCk7Ci0gIHNwcmludGYoX3dyYXBfJHRhcmdldCwiJWx1IiwkdmFsdWUpOwotICBUY2xfTGlua1ZhcihpbnRlcnAsIiR0YXJnZXQiLCAoY2hhciAqKSAmYW1wO193cmFwXyR0YXJnZXQsIFRDTF9MSU5LX1NUUklORyB8IAotVENMX0xJTktfUkVBRF9PTkxZKTsKLX0KLQotLy8gRG91YmxlcyBhbmQgZmxvYXRzCi0ldHlwZW1hcChjb25zdCkgZG91YmxlIFNXSUdfREVGQVVMVF9UWVBFLAotICAgICAgICAgICAgICAgIGZsb2F0ICBTV0lHX0RFRkFVTFRfVFlQRQotewotICBzdGF0aWMgY2hhciAqX3dyYXBfJHRhcmdldDsKLSAgX3dyYXBfJHRhcmdldCA9IChjaGFyICopIG1hbGxvYyg0MCk7Ci0gIHNwcmludGYoX3dyYXBfJHRhcmdldCwiJWYiLCR2YWx1ZSk7Ci0gIFRjbF9MaW5rVmFyKGludGVycCwiJHRhcmdldCIsIChjaGFyICopICZhbXA7X3dyYXBfJHRhcmdldCwgVENMX0xJTktfU1RSSU5HIHwgCi1UQ0xfTElOS19SRUFEX09OTFkpOwotfQotCi0vLyBTdHJpbmdzCi0ldHlwZW1hcChjb25zdCkgY2hhciAqU1dJR19ERUZBVUxUX1RZUEUKLXsKLSAgc3RhdGljIGNoYXIgKl93cmFwXyR0YXJnZXQgPSAiJHZhbHVlIjsKLSAgVGNsX0xpbmtWYXIoaW50ZXJwLCIkdGFyZ2V0IiwgKGNoYXIgKikgJmFtcDtfd3JhcF8kdGFyZ2V0LCBUQ0xfTElOS19TVFJJTkcgfCAKLVRDTF9MSU5LX1JFQURfT05MWSk7Ci19Ci0KLS8vIFBvaW50ZXJzCi0ldHlwZW1hcChjb25zdCkgVXNlciAqU1dJR19ERUZBVUxUX1RZUEUKLXsKLSAgc3RhdGljIGNoYXIgKl93cmFwXyR0YXJnZXQ7Ci0gIF93cmFwXyR0YXJnZXQgPSAoY2hhciAqKSBtYWxsb2MoMjArc3RybGVuKCIkbWFuZ2xlIikpOwotICBTV0lHX01ha2VQdHIoX3dyYXBfJHRhcmdldCwgKHZvaWQgKikgJHZhbHVlLCAiJG1hbmdsZSIpOwotICBUY2xfTGlua1ZhcihpbnRlcnAsIiR0YXJnZXQiLCAoY2hhciAqKSAmYW1wO193cmFwXyR0YXJnZXQsIFRDTF9MSU5LX1NUUklORyB8IAotVENMX0xJTktfUkVBRF9PTkxZKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93IHRoYXQgd2UgaGF2ZSBvdXIgdHlwZW1hcHMgZmlsZSwgd2UgYXJlIGRvbmUgYW5kIGNhbiBzdGFydCBwcm9kdWNpbmcgYSB2YXJpZXR5IG9mIGludGVyZXN0aW5nIFRjbCBleHRlbnNpb24gbW9kdWxlcy4gICBTaG91bGQgZXJyb3JzIGFycmlzZSwgb25lIHdpbGwgZWl0aGVyIGhhdmUgdG8gcHJ5IGludG8gdGhlIEMrKyBtb2R1bGUgb3IgdGhlIHR5cGVtYXBzIGZpbGUgZm9yIGEgY29ycmVjdGlvbi4gPHA+Ci08YSBuYW1lPSJuNDIiPjwvYT48aDM+IFRoZSBTV0lHIGxpYnJhcnkgYW5kIGluc3RhbGxhdGlvbiBpc3N1ZXM8L2gzPgotVG8gbWFrZSBhIG5ldyBTV0lHIG1vZHVsZSBnZW5lcmFsbHkgdXNhYmxlLCB5b3Ugd2lsbCB3YW50IHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5QdXQgdGhlIG5ldyBiaW5hcnkgaW4gYSBwdWJsaWNseSBhY2Nlc3NpYmxlIGxvY2F0aW9uIChpZS4gPHR0Pi91c3IvbG9jYWwvYmluPC90dD4pLgotPGxpPk1ha2UgYSBzdWJkaXJlY3RvcnkgZm9yIHlvdXIgbGFuZ3VhZ2UgaW4gdGhlIFNXSUcgbGlicmFyeS4gIFRoZSBsaWJyYXJ5IHNob3VsZCBtYXRjaCB1cCB3aXRoIHRoZSBuYW1lIHlvdSBhc3NpZ25lZCB0byB0aGUgPHR0PkxpYkRpcjwvdHQ+IHZhcmlhYmxlIGluIDx0dD5wYXJzZV9hcmdzKCk8L3R0Pi4gIAotPGxpPkNvcHkgdGhlIGZpbGUgYDx0dD5sYW5nLm1hcDwvdHQ+JyB0byB0aGUgU1dJRyBsaWJyYXJ5IGRpcmVjdG9yeS4gICBZb3VyIG5ldyB2ZXJzaW9uIG9mIFNXSUcgd2lsbCBub3cgYmUgYWJsZSB0byBmaW5kIGl0IG5vIG1hdHRlciB3aGF0IGRpcmVjdG9yeSBTV0lHIGlzIGV4ZWN1dGVkIGZyb20uCi08bGk+UHJvdmlkZSBzb21lIGRvY3VtZW50YXRpb24gYWJvdXQgaG93IHlvdXIgbW9kdWxlIHdvcmtzLgotPC91bD4KLTxwPgotU1dJRyBleHRlbnNpb25zIGFyZSBvbmx5IGFibGUgdG8gdGFyZ2V0IGEgc2luZ2xlIHNjcmlwdGluZyBsYW5ndWFnZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIG1ha2UgeW91ciBtb2R1bGUgcGFydCBvZiB0aGUgZnVsbCB2ZXJzaW9uIG9mIFNXSUcsIHlvdSB3aWxsIG5lZWQgdG8gbW9kaWZ5IHRoZSBmaWxlIGA8dHQ+c3dpZ21haW4uY3h4PC90dD4nIGluIHRoZSA8dHQ+U1dJRzEuMS9Nb2R1bGVzPC90dD4gZGlyZWN0b3J5LiAgICBUbyBkbyB0aGlzLCBmb2xsb3cgdGhlc2Ugc3RlcHMgOjxwPgotPHA+Ci08dWw+Ci08bGk+QWRkIGEgPHR0PiNpbmNsdWRlICJsYW5nLmgiPC90dD4gdG8gdGhlPHR0PiBzd2lnbWFpbi5jeHg8L3R0PiBmaWxlLgotPGxpPkNyZWF0ZSBhIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHlvdXIgbW9kdWxlIGFuZCB3cml0ZSBjb2RlIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB5b3VyIGxhbmd1YWdlIChqdXN0IGNvcHkgdGhlIHRlY2huaXF1ZSB1c2VkIGZvciB0aGUgb3RoZXIgbGFuZ3VhZ2VzKS4KLTxsaT5Nb2RpZnkgIDx0dD5Nb2R1bGVzL01ha2VmaWxlPC90dD4gdG8gaW5jbHVkZSB5b3VyIG1vZHVsZSBhcyBwYXJ0IG9mIGl0cyBjb21waWxhdGlvbiBwcm9jZXNzLgotPGxpPlJlYnVpbGQgU1dJRyBieSB0eXBpbmcgYG1ha2UnLgotPC91bD4KLTxhIG5hbWU9Im4xMSI+PC9hPjxoMj4gQysrIFByb2Nlc3Npbmc8L2gyPgotTGFuZ3VhZ2UgbW9kdWxlcyBoYXZlIHRoZSBvcHRpb24gdG8gcHJvdmlkZSBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIEMrKyBjbGFzc2VzLiAgIFVzdWFsbHkgdGhpcyBpcyB0byBwcm92aWRlIHNvbWUgc29ydCBvZiBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHN1Y2ggYXMgc2hhZG93IGNsYXNzZXMuICBUaGUgcHJvY2VzcyBvZiBkZXZlbG9waW5nIHRoZXNlIGV4dGVuc2lvbnMgaXMgaGlnaGx5IHRlY2huaWNhbCBhbmQgdGhlIGJlc3QgYXBwcm9hY2ggbWF5IGJlIHRvIGNvcHkgcGllY2VzIGZyb20gb3RoZXIgU1dJRyBtb2R1bGVzIHRoYXQgcHJvdmlkZSBvYmplY3Qgb3JpZW50ZWQgc3VwcG9ydC48cD4KLTxhIG5hbWU9Im40MyI+PC9hPjxoMz4gSG93IEMrKyBwcm9jZXNzaW5nIHdvcmtzPC9oMz4KLVRoZSB3cmFwcGluZyBvZiBDKysgY2xhc3NlcyBmb2xsb3dzIGEgImZpbGUiIG1ldGFwaG9yLiAgIFdoZW4gYSBjbGFzcyBpcyBlbmNvdW50ZXJlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgcGVyZm9ybWVkIDo8cD4KLTxwPgotPHVsPgotPGxpPk9wZW4gYSBuZXcgY2xhc3MuCi08bGk+SW5oZXJpdCBmcm9tIGJhc2UgY2xhc3Nlcy4KLTxsaT5BZGQgbWVtYmVycyB0byB0aGUgY2xhc3MgKGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGV0Yy4uLikKLTxsaT5DbG9zZSB0aGUgY2xhc3MgYW5kIGVtaXQgb2JqZWN0LW9yaWVudGVkIGNvZGUuCi08L3VsPgotPHA+Ci1BcyBhIGNsYXNzIGlzIGNvbnN0cnVjdGVkLCBhIGxhbmd1YWdlIG1vZHVsZSBtYXkgbmVlZCB0byBrZWVwIHRyYWNrIG9mICBhIHZhcmlldHkgb2YgZGF0YSBzdWNoIGFzIHdoZXRoZXIgY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzIGhhdmUgYmVlbiBnaXZlbiwgYXJlIHRoZXJlIGFueSBkYXRhIG1lbWJlcnMsIGhhdmUgZGF0YXR5cGVzIGJlZW4gcmVuYW1lZCwgYW5kIHNvIG9uLiAgIEl0IGlzIG5vdCBhbHdheXMgYSBjbGVhci1jdXQgcHJvY2Vzcy48cD4KLTxhIG5hbWU9Im40NCI+PC9hPjxoMz4gTGFuZ3VhZ2UgZXh0ZW5zaW9uczwvaDM+Ci1Qcm92aWRpbmcgYWRkaXRpb25hbCBzdXBwb3J0IGZvciBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgZm9sbG93aW5nIExhbmd1YWdlIGV4dGVuc2lvbnMuICBUaGVzZSBhcmUgYWRkaXRpb25hbCBtZXRob2RzIHRoYXQgY2FuIGJlIGRlZmluZWQgZm9yIHRoZSBMYW5ndWFnZSBjbGFzcy48cD4KLTxwPgotPGg2PiB2b2lkIGNwcF9vcGVuX2NsYXNzKGNoYXIgKm5hbWUsIGNoYXIgKnJlbmFtZSwgY2hhciAqY3R5cGUsIGludCBzdHJpcCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+T3BlbnMgYSBuZXcgY2xhc3MuICA8dHQ+bmFtZTwvdHQ+IGlzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcywgPHR0PnJlbmFtZTwvdHQ+IGlzIHRoZSByZW5hbWVkIHZlcnNpb24gb2YgdGhlIGNsYXNzIChvciBOVUxMIGlmIG5vdCByZW5hbWVkKSwgPHR0PmN0eXBlPC90dD4gaXMgdGhlIGNsYXNzIHR5cGUgKDx0dD5zdHJ1Y3Q8L3R0PiwgPHR0PmNsYXNzPC90dD4sIDx0dD51bmlvbjwvdHQ+KSwgYW5kIDx0dD5zdHJpcDwvdHQ+IGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGl0cyBzYWZlIHRvIGRyb3AgdGhlIGxlYWRpbmcgdHlwZSBzcGVjaWZpZXIgKHRoaXMgaXMgb2Z0ZW4gdW5zYWZlIGZvciBBTlNJIEMpLgotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgY3BwX2luaGVyaXQoY2hhciAqKmJhc2VjbGFzcywgaW50IG1vZGUgPSBJTkhFUklUX0FMTCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+SW5oZXJpdHMgZnJvbSBiYXNlIGNsYXNzZXMuICA8dHQ+YmFzZWNsYXNzPC90dD4gaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgY2xhc3MgbmFtZXMgY29ycmVzcG9uZGluZyB0byBhbGwgb2YgdGhlIGJhc2UgY2xhc3NlcyBvZiBhbiBvYmplY3QuICAgPHR0Pm1vZGU8L3R0PiBpcyBhbiBpbmhlcml0YW5jZSBtb2RlIHRoYXQgaXMgdGhlIG9yJ2QgdmFsdWUgb2YgPHR0PklOSEVSSVRfRlVOQzwvdHQ+ICwgPHR0PklOSEVSSVRfVkFSPC90dD4sIDx0dD5JTkhFUklUX0NPTlNUPC90dD4sICBvciA8dHQ+SU5IRVJJVF9BTEw8L3R0Pi4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIGNwcF9tZW1iZXJfZnVuYyhjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQsICAgICAgICAgICAgICAgICAgICAgIFBhcm1MaXN0ICpsKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGVzIGEgbWVtYmVyIGZ1bmN0aW9uLiAgPHR0Pm5hbWU8L3R0PiBpcyB0aGUgcmVhbCBuYW1lIG9mIHRoZSBtZW1iZXIsIDx0dD5pbmFtZTwvdHQ+IGlzIHRoZSByZW5hbWVkIHZlcnNpb24gKE5VTEwgaWYgbm90IHJlbmFtZWQpLCA8dHQ+dDwvdHQ+IGlzIHRoZSByZXR1cm4gZGF0YXR5cGUsIGFuZCA8dHQ+bDwvdHQ+IGlzIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdC4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIGNwcF9zdGF0aWNfZnVuYyhjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQsICAgICAgICAgICAgICAgICAgICAgIFBhcm1MaXN0ICpsKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGUgYSBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uLiAgVGhlIGNhbGxpbmcgY29udmVudGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciA8dHQ+Y3BwX21lbWJlcl9mdW5jKCk8L3R0Pi4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIGNwcF92YXJpYWJsZShjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYSBtZW1iZXIgdmFyaWFibGUuICA8dHQ+bmFtZTwvdHQ+IGlzIHRoZSByZWFsIG5hbWUgb2YgdGhlIG1lbWJlciwgPHR0PmluYW1lPC90dD4gaXMgdGhlIHJlbmFtZWQgdmVyc2lvbiAoTlVMTCBpcyBub3QgcmVuYW1lZCkuICA8dHQ+dDwvdHQ+IGlzIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBjcHBfc3RhdGljX3ZhcihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYSBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlLiAgVGhlIGNhbGxpbmcgY29udmVudGlvbiBpcyB0aGUgc2FtZSBhcyBmb3IgPHR0PmNwcF92YXJpYWJsZSgpPC90dD4uCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBjcHBfZGVjbGFyZV9jb25zdChjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgRGF0YVR5cGUgKnR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGVzIGEgY29uc3RhbnQgaW5zaWRlIGEgQysrIGNsYXNzLiBOb3JtYWxseSB0aGlzIGlzIGFuIGVudW0gb3IgbWVtYmVyIGRlY2xhcmVkIGFzIGNvbnN0LiAgPHR0Pm5hbWU8L3R0PiBpcyB0aGUgcmVhbCBuYW1lLCA8dHQ+aW5hbWU8L3R0PiBpcyB0aGUgcmVuYW1lZCB2ZXJzaW9uIChOVUxMIGlmIG5vdCByZW5hbWVkKSwgPHR0PnR5cGU8L3R0PiBpcyB0aGUgdHlwZSBvZiB0aGUgY29uc3RhbnQsIGFuZCA8dHQ+dmFsdWU8L3R0PiBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZS4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIGNwcF9jb25zdHJ1Y3RvcihjaGFyICpuYW1lLCBjaGFyICppbmFtZSwgUGFybUxpc3QgKmwpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNyZWF0ZXMgYSBjb25zdHJ1Y3Rvci4gPHR0Pm5hbWU8L3R0PiBpcyB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3IsIDx0dD5pbmFtZTwvdHQ+IGlzIHRoZSByZW5hbWVkIHZlcnNpb24sIGFuZCA8dHQ+bDwvdHQ+IGlzIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgbGlzdC4gIE5vcm1hbGx5LCA8dHQ+bmFtZTwvdHQ+IGlzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNsYXNzLiAgSWYgbm90LCB0aGlzIG1heSBhY3R1YWxseSBiZSBhIG1lbWJlciBmdW5jdGlvbiB3aXRoIG5vIGRlY2xhcmVkIHJldHVybiB0eXBlIChhc3N1bWVkIHRvIGJlIGFuIGludCBpbiBDKyspLiAgIAotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgY3BwX2Rlc3RydWN0b3IoY2hhciAqbmFtZSwgY2hhciAqbmV3bmFtZSk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Q3JlYXRlcyBhIGRlc3RydWN0b3IuICA8dHQ+bmFtZTwvdHQ+IGlzIHRoZSByZWFsIG5hbWUgb2YgdGhlIGRlc3RydWN0b3IgKHVzdWFsbHkgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2xhc3MpLCBhbmQgPHR0Pm5ld25hbWU8L3R0PiBpcyB0aGUgcmVuYW1lZCB2ZXJzaW9uIChOVUxMIGlmIG5vdCByZW5hbWVkKS4gIAotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgY3BwX2Nsb3NlX2NsYXNzKCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Q2xvc2VzIHRoZSBjdXJyZW50IGNsYXNzLiAgIExhbmd1YWdlIG1vZHVsZXMgc2hvdWxkIGZpbmlzaCBvZmYgY29kZSBnZW5lcmF0aW9uIGZvciBhIGNsYXNzIG9uY2UgdGhpcyBoYXMgYmVlbiBjYWxsZWQuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBjcHBfY2xlYW51cCgpOzwvaDY+Ci08ZGw+Ci08ZHQ+PGRkPkNhbGxlZCBhZnRlciBhbGwgQysrIGNsYXNzZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZC4gIE9ubHkgdXNlZCB0byBwcm92aWRlIHNvbWUga2luZCBvZiBnbG9iYWwgY2xlYW51cCBmb3IgYWxsIGNsYXNzZXMuCi08L2RsPgotPGEgbmFtZT0ibjQ1Ij48L2E+PGgzPiBIaW50czwvaDM+Ci1TcGVjaWFsIEMrKyBjb2RlIGdlbmVyYXRpb24gaXMgbm90IGZvciB0aGUgd2VhayBvZiBoZWFydC4gIE1vc3Qgb2YgU1dJRydzIGJ1aWx0IGluIG1vZHVsZXMgaGF2ZSBiZWVuIGRldmVsb3BlZCBmb3Igd2VsbCBvdmVyIGEgeWVhciBhbmQgb2JqZWN0IG9yaWVudGVkIHN1cHBvcnQgaGFzIGJlZW4gaW4gY29udGludWFsIGRldmVsb3BtZW50LiAgSWYgd3JpdGluZyBhIG5ldyBsYW5ndWFnZSBtb2R1bGUsIGxvb2tpbmcgYXQgdGhlIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24sIFRjbCwgb3IgUGVybDUgd291bGQgYmUgYSBnb29kIHN0YXJ0LjxwPgotPGEgbmFtZT0ibjEyIj48L2E+PGgyPiBEb2N1bWVudGF0aW9uIFByb2Nlc3Npbmc8L2gyPgotVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIG9wZXJhdGVzIChmb3IgdGhlIG1vc3QgcGFydCksIGluZGVwZW5kZW50bHkgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMuICBIb3dldmVyLCBsYW5ndWFnZSBtb2R1bGVzIGFyZSBzdGlsbCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhICJ1c2FnZSIgc3RyaW5nIGRlc2NyaWJpbmcgaG93IGVhY2ggZnVuY3Rpb24sIHZhcmlhYmxlLCBvciBjb25zdGFudCBpcyB0byBiZSB1c2VkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuPHA+Ci08YSBuYW1lPSJuNDYiPjwvYT48aDM+IERvY3VtZW50YXRpb24gZW50cmllczwvaDM+Ci1FYWNoIEMvQysrIGRlY2xhcmF0aW9uIGluIGFuIGludGVyZmFjZSBmaWxlIGdldHMgYXNzaWduZWQgdG8gYSAiRG9jdW1lbnRhdGlvbiBFbnRyeSIgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlIDx0dD5Eb2NFbnRyeTwvdHQ+IG9iamVjdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Y2xhc3MgRG9jRW50cnkgewotcHVibGljOgotICBTdHJpbmcgICAgICB1c2FnZTsgICAgICAgICAgICAvLyBTaG9ydCBkZXNjcmlwdGlvbiAKLSAgU3RyaW5nICAgICAgY2luZm87ICAgICAgICAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgQyBpbnRlcmZhY2UgKG9wdGlvbmFsKS4KLSAgU3RyaW5nICAgICAgdGV4dDsgICAgICAgICAgICAgLy8gU3VwcG9ydGluZyB0ZXh0IChvcHRpb25hbCkKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+dXNhZ2U8L3R0PiBzdHJpbmcgaXMgdXNlZCB0byBob2xkIHRoZSBjYWxsaW5nIHNlcXVlbmNlIGZvciB0aGUgZnVuY3Rpb24uICBUaGUgPHR0PmNpbmZvPC90dD4gZmllbGQgaXMgdXNlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVuZGVybHlpbmcgQyBjb2RlLiAgPHR0PnRleHQ8L3R0PiBpcyBmaWxsZWQgaW4gd2l0aCBjb21tZW50IHRleHQuPHA+Ci08cD4KLVRoZSBnbG9iYWwgdmFyaWFibGUgPHR0PmRvY19lbnRyeTwvdHQ+IGFsd2F5cyBjb250YWlucyB0aGUgZG9jdW1lbnRhdGlvbiBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgZGVjbGFyYXRpb24gYmVpbmcgcHJvY2Vzc2VkLiAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gY2hvb3NlIHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiBieSByZWZlcnJpbmcgdG8gYW5kIG1vZGlmeWluZyBpdHMgZmllbGRzLjxwPgotPGEgbmFtZT0ibjQ3Ij48L2E+PGgzPiBDcmVhdGluZyBhIHVzYWdlIHN0cmluZzwvaDM+Ci1UbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHVzYWdlIHN0cmluZywgbGFuZ3VhZ2UgbW9kdWxlcyBuZWVkIHRvIG1vZGlmeSB0aGUgYHVzYWdlJyBmaWVsZCBvZiA8dHQ+ZG9jX2VudHJ5PC90dD4uICAgVGhpcyBjYW4gYmUgZG9uZSBieSBjcmVhdGluZyBhIGZ1bmN0aW9uIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjaGFyICpUQ0w6OnVzYWdlX3N0cmluZyhjaGFyICppbmFtZSwgRGF0YVR5cGUgKnQsIFBhcm1MaXN0ICpsKSwKLS8vCi0vLyBHZW5lcmF0ZXMgYSBnZW5lcmljIHVzYWdlIHN0cmluZyBmb3IgYSBUY2wgZnVuY3Rpb24uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2hhciAqIFRDTDo6dXNhZ2Vfc3RyaW5nKGNoYXIgKmluYW1lLCBEYXRhVHlwZSAqLCBQYXJtTGlzdCAqbCkgewotCi0gIHN0YXRpYyBTdHJpbmcgdGVtcDsKLSAgUGFybSAgKnA7Ci0gIGludCAgIGksIG51bW9wdCxwY291bnQ7Ci0KLSAgdGVtcCA9ICIiOwotICB0ZW1wICZsdDsmbHQ7IGluYW1lICZsdDsmbHQ7ICIgIjsKLQotICAvKiBOb3cgZ28gdGhyb3VnaCBhbmQgcHJpbnQgcGFyYW1ldGVycyAqLwotICBpID0gMDsKLSAgcGNvdW50ID0gbC0mZ3Q7bnBhcm1zOwotICBudW1vcHQgPSBsLSZndDtudW1vcHQoKTsKLSAgcCA9IGwtJmd0O2dldF9maXJzdCgpOwotICB3aGlsZSAocCAhPSAwKSB7Ci0gICAgaWYgKCFwLSZndDtpZ25vcmUpIHsKLSAgICAgIGlmIChpICZndDs9IChwY291bnQtbnVtb3B0KSkKLSAgICAgICAgdGVtcCAmbHQ7Jmx0OyAiPyI7Ci0KLSAgICAgIC8qIElmIHBhcmFtZXRlciBoYXMgYmVlbiBuYW1lZCwgdXNlIHRoYXQuICAgT3RoZXJ3aXNlLCBqdXN0IHByaW50IGEgdHlwZSAgKi8KLQotICAgICAgaWYgKChwLSZndDt0LSZndDt0eXBlICE9IFRfVk9JRCkgfHwgKHAtJmd0O3QtJmd0O2lzX3BvaW50ZXIpKSB7Ci0gICAgICAgIGlmIChzdHJsZW4ocC0mZ3Q7bmFtZSkgJmd0OyAwKSB7Ci0gICAgICAgICAgdGVtcCAmbHQ7Jmx0OyBwLSZndDtuYW1lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHRlbXAgJmx0OyZsdDsgInsgIiAmbHQ7Jmx0OyBwLSZndDt0LSZndDtwcmludF90eXBlKCkgJmx0OyZsdDsgIiB9IjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGkgJmd0Oz0gKHBjb3VudC1udW1vcHQpKQotICAgICAgICB0ZW1wICZsdDsmbHQ7ICI/IjsKLSAgICAgIHRlbXAgJmx0OyZsdDsgIiAiOwotICAgICAgaSsrOwotICAgIH0KLSAgICBwID0gbC0mZ3Q7Z2V0X25leHQoKTsKLSAgfQotICByZXR1cm4gdGVtcDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm93LCB3aXRoaW4gdGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHdyYXBwZXIgZnVuY3Rpb24sIGluY2x1ZGUgY29kZSBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEZpbGwgaW4gdGhlIGRvY3VtZW50YXRpb24gZW50cnkKLWRvY19lbnRyeS0mZ3Q7dXNhZ2UgJmx0OyZsdDsgdXNhZ2Vfc3RyaW5nKGluYW1lLHQsbCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHByb2R1Y2UgZnVsbCBkb2N1bWVudGF0aW9uLCBlYWNoIGxhbmd1YWdlIG1vZHVsZSBuZWVkcyB0byBmaWxsIGluIHRoZSBkb2N1bWVudGF0aW9uIHVzYWdlIHN0cmluZyBmb3IgYWxsIGRlY2xhcmF0aW9ucy4gICAgTG9va2luZyBhdCBleGlzdGluZyBTV0lHIG1vZHVsZXMgY2FuIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQuPHA+Ci08YSBuYW1lPSJuNDgiPjwvYT48aDM+IFdyaXRpbmcgYSBuZXcgZG9jdW1lbnRhdGlvbiBtb2R1bGU8L2gzPgotV3JpdGluZyBhIG5ldyBkb2N1bWVudGF0aW9uIG1vZHVsZSBpcyByb3VnaGx5IHRoZSBzYW1lIGlkZWEgYXMgd3JpdGluZyBhIG5ldyBMYW5ndWFnZSBjbGFzcy4gIFRvIGRvIGl0LCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgYSAiRG9jdW1lbnRhdGlvbiBPYmplY3QiIGJ5IGluaGVyaXRpbmcgZnJvbSB0aGUgZm9sbG93aW5nIGJhc2UgY2xhc3MgYW5kIGRlZmluaW5nIGFsbCBvZiB0aGUgdmlydHVhbCBtZXRob2RzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBEb2N1bWVudGF0aW9uIHsKLXB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCB0aXRsZShEb2NFbnRyeSAqZGUpID0gMDsKLSAgdmlydHVhbCB2b2lkIG5ld3NlY3Rpb24oRG9jRW50cnkgKmRlLCBpbnQgc2VjdG51bSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgZW5kc2VjdGlvbigpID0gMDsKLSAgdmlydHVhbCB2b2lkIHByaW50X2RlY2woRG9jRW50cnkgKmRlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBwcmludF90ZXh0KERvY0VudHJ5ICpkZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgc2VwYXJhdG9yKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgaW5pdChjaGFyICpmaWxlbmFtZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgY2xvc2Uodm9pZCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgc3R5bGUoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpID0gMDsKLX07Ci0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGg2PiB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTs8L2g2PgotPGRsPgotPGR0PjxkZD5QYXJzZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMuICAgQW55IHNwZWNpYWwgb3B0aW9ucyB5b3Ugd2FudCB0byBwcm92aWRlIHNob3VsZCBiZSBwbGFjZWQgaGVyZS4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiAgdm9pZCB0aXRsZShEb2NFbnRyeSAqZGU7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+UHJvZHVjZXMgZG9jdW1lbnRhdGlvbiBvdXRwdXQgZm9yIGEgdGl0bGUuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBuZXdzZWN0aW9uKERvY0VudHJ5ICpkZSwgaW50IHNlY3RudW07PC9oNj4KLTxkbD4KLTxkdD48ZGQ+Q2FsbGVkIHdoZW5ldmVyIGEgbmV3IHNlY3Rpb24gaXMgY3JlYXRlZC4gICBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaXMgaGllcmFyY2hpY2FsIGluIG5hdHVyZSBzbyBlYWNoIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBnb2VzIGRvd24gb25lIGxldmVsIGluIHRoZSBoaWVyYXJjaHkuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBlbmRzZWN0aW9uKCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+RW5kcyB0aGUgY3VycmVudCBzZWN0aW9uLiAgTW92ZXMgdXAgb25lIGxldmVsIGluIHRoZSBkb2N1bWVudGF0aW9uIGhpZXJhcmNoeS4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIHByaW50X2RlY2woRG9jRW50cnkgKmRlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DcmVhdGVzIGRvY3VtZW50YXRpb24gZm9yIGEgQyBkZWNsYXJhdGlvbiAoZnVuY3Rpb24sIHZhcmlhYmxlLCBvciBjb25zdGFudCkuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBwcmludF90ZXh0KERvY0VudHJ5ICpkZSk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+UHJpbnRzIGRvY3VtZW50YXRpb24gdGhhdCBoYXMgYmVlbiBnaXZlbiB3aXRoIHRoZSA8dHQ+JXRleHQgJXsgJX08L3R0PiBkaXJlY3RpdmUuIAotPGR0PjxkZD4KLTwvZGw+Ci08aDY+IHZvaWQgc2VwYXJhdG9yKCk7PC9oNj4KLTxkbD4KLTxkdD48ZGQ+UHJpbnRzIGFuIG9wdGlvbmFsIHNlcGFyYXRvciBiZXR3ZWVuIHNlY3Rpb25zLiAgCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBpbml0KGNoYXIgKmZpbGVuYW1lKTs8L2g2PgotPGRsPgotPGR0PjxkZD5Jbml0aWFsaXplcyB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBjb21tYW5kIGxpbmUgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkLiA8dHQ+ZmlsZW5hbWU8L3R0PiBpcyB0aGUgZmlsZSB3aGVyZSBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBwbGFjZWQuCi08ZHQ+PGRkPgotPC9kbD4KLTxoNj4gdm9pZCBjbG9zZSh2b2lkKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DbG9zZXMgdGhlIGRvY3VtZW50YXRpb24gZmlsZS4gIEFsbCByZW1haW5pbmcgb3V0cHV0IHNob3VsZCBiZSBjb21wbGV0ZSBhbmQgZmlsZXMgY2xvc2VkIHVwb24gZXhpdC4KLTxkdD48ZGQ+Ci08L2RsPgotPGg2PiB2b2lkIHN0eWxlKGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKTs8L2g2PgotPGRsPgotPGR0PjxkZD5DYWxsZWQgdG8gc2V0IHN0eWxlIHBhcmFtZXRlcnMuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgPHR0PiVzdHlsZTwvdHQ+IGFuZCA8dHQ+JWxvY2Fsc3R5bGU8L3R0PiBkaXJlY3RpdmVzLiAgSXQgaXMgYWxzbyBjYWxsZWQgd2hlbmV2ZXIgc3R5bGUgcGFyYW1ldGVycyBhcmUgZ2l2ZW4gYWZ0ZXIgYSBzZWN0aW9uIGRpcmVjdGl2ZS4KLTwvZGw+Ci08YSBuYW1lPSJuNDkiPjwvYT48aDM+IFVzaW5nIGEgbmV3IGRvY3VtZW50YXRpb24gbW9kdWxlPC9oMz4KLVVzaW5nIGEgbmV3IGRvY3VtZW50YXRpb24gbW9kdWxlIHJlcXVpcmVzIGEgY2hhbmdlIHRvIFNXSUcncyBtYWluIHByb2dyYW0uIElmIHlvdSBhcmUgd3JpdGluZyB5b3VyIG93biBtYWluKCkgcHJvZ3JhbSwgeW91IGNhbiB1c2UgYSBuZXcgZG9jdW1lbnRhdGlvbiBtb2R1bGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2luY2x1ZGUgJmx0O3N3aWcuaCZndDsKLSNpbmNsdWRlICJzd2lndGNsLmgiICAgICAgICAgICAgICAgICAgICAgICAvLyBMYW5ndWFnZSBzcGVjaWZpYyBoZWFkZXIKLSNpbmNsdWRlICJteWRvYy5oIiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXcgRG9jdW1lbnRhdGlvbiBtb2R1bGUKLQotZXh0ZXJuIGludCBTV0lHX21haW4oaW50LCBjaGFyICoqLCBMYW5ndWFnZSAqLCBEb2N1bWVudGF0aW9uICopOwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0JCi0JVENMICpsID0gbmV3IFRDTDsgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IExhbmd1YWdlIG9iamVjdAotCU15RG9jICpkID0gbmV3IE15RG9jOyAgICAgICAgICAgICAgIC8vIE5ldyBkb2N1bWVudGF0aW9uIG9iamVjdAotCWluaXRfYXJncyhhcmdjLCBhcmd2KTsgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgYXJncwotCXJldHVybiBTV0lHX21haW4oYXJnYywgYXJndiwgbCwgZCk7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNTAiPjwvYT48aDM+IFdoZXJlIHRvIGdvIGZvciBtb3JlIGluZm9ybWF0aW9uPC9oMz4KLVRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgZG9jdW1lbnRhdGlvbiBtb2R1bGVzLCBsb29rIGF0IHNvbWUgb2YgdGhlIGV4aXN0aW5nIFNXSUcgbW9kdWxlcyBjb250YWluZWQgaW4gdGhlIDx0dD5TV0lHMS4xL1NXSUc8L3R0PiBkaXJlY3RvcnkuICBUaGUgQVNDSUkgYW5kIEhUTUwgbW9kdWxlcyBhcmUgZ29vZCBzdGFydGluZyBwb2ludHMgZm9yIGZpbmRpbmcgbW9yZSBpbmZvcm1hdGlvbi4gPHA+Ci08YSBuYW1lPSJuMTMiPjwvYT48aDI+IFRoZSBGdXR1cmUgb2YgU1dJRzwvaDI+Ci1TV0lHJ3MgQysrIEFQSSBpcyB0aGUgbW9zdCByYXBpZGx5IGV2b2x2aW5nIHBvcnRpb24gb2YgU1dJRy4gIFdoaWxlIGludGVyZmFjZS1maWxlIGNvbXBhdGliaWxpdHkgd2lsbCBiZSBtYWludGFpbmVkIGFzIG11Y2ggYXMgcG9zc2libGUgaW4gZnV0dXJlIHJlbGVhc2VzLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIFNXSUcgaXMgbGlrZWx5IHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGluIHRoZSBmdXR1cmUuICAgVGhpcyB3aWxsIHBvc3NpYmx5IGhhdmUgbWFueSByYW1pZmljYXRpb25zIG9uIHRoZSBjb25zdHJ1Y3Rpb24gb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gICBIZXJlIGFyZSBhIGZldyBzaWduaWZpY2FudCBjaGFuZ2VzIHRoYXQgYXJlIGNvbWluZyA6PHA+Ci08cD4KLQotPGRsPgotPGR0PjEuCSBBIGNvbXBsZXRlIHJlb3JnYW5pemF0aW9uIG9mIHRoZSBTV0lHIHR5cGUgc3lzdGVtLiAgIERhdGF0eXBlcyB3aWxsIGJlIHJlcHJlc2VudGVkIGluIGEgbW9yZSBmbGV4aWJsZSBtYW5uZXIgdGhhdCBwcm92aWRlIGZ1bGwgc3VwcG9ydCBmb3IgYXJyYXlzLCBmdW5jdGlvbiBwb2ludGVycywgY2xhc3Nlcywgc3RydWN0dXJlcywgYW5kIHR5cGVzIHBvc3NpYmx5IGNvbWluZyBmcm9tIG90aGVyIGxhbmd1YWdlcyAoc3VjaCBhcyBGb3J0cmFuKS4gICAKLTxkdD4yLgkgT2JqZWN0aWZpY2F0aW9uIG9mIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGNsYXNzZXMsIGV0Yy4uLiBDdXJyZW50bHkgbWFueSBvZiBTV0lHJ3MgZnVuY3Rpb25zIHRha2UgbXVsdGlwbGUgYXJndW1lbnRzIHN1Y2ggYXMgZnVuY3Rpb25zIGJlaW5nIGRlc2NyaWJlZCBieSBuYW1lLCByZXR1cm4gZGF0YXR5cGUsIGFuZCBwYXJhbWV0ZXJzLiAgVGhlc2UgYXR0cmlidXRlcyB3aWxsIGJlIGNvbnNvbGlkYXRlZCBpbnRvIGEgc2luZ2xlICJGdW5jdGlvbiIgb2JqZWN0LCAiVmFyaWFibGUiIG9iamVjdCwgIkNvbnN0YW50IiBvYmplY3QsIGFuZCBzbyBmb3J0aC4gIAotPGR0PjMuCSBBIGNvbXBsZXRlIHJld3JpdGUgb2YgdGhlIFNXSUcgcGFyc2VyLiAgICBUaGlzIHdpbGwgYmUgY2xvc2VseSB0aWVkIHRvIHRoZSBjaGFuZ2UgaW4gZGF0YXR5cGUgcmVwcmVzZW50YXRpb24gYW1vbmcgb3RoZXIgdGhpbmdzLgotPGR0PjQuCSBJbmNyZWFzZWQgcmVsaWFuY2Ugb24gdHlwZW1hcHMuICAgTWFueSBvZiBTV0lHJ3Mgb2xkZXIgbW9kdWxlcyBkbyBub3QgcmVseSBvbiB0eXBlbWFwcywgYnV0IHRoaXMgaXMgbGlrZWx5IHRvIGNoYW5nZS4gIFR5cGVtYXBzIHByb3ZpZGUgYSBtb3JlIGNvbmNpc2UgaW1wbGVtZW50YXRpb24gYW5kIGFyZSBlYXNpZXIgdG8gbWFpbnRhaW4uICBNb2R1bGVzIHdyaXR0ZW4gZm9yIDEuMSB0aGF0IGFkb3B0IHR5cGVtYXBzIG5vdyB3aWxsIGJlIG11Y2ggZWFzaWVyIHRvIGludGVncmF0ZSBpbnRvIGZ1dHVyZSByZWxlYXNlcy4KLTxkdD41LgkgQSBwb3NzaWJsZSByZW9yZ2FuaXphdGlvbiBvZiBvYmplY3Qtb3JpZW50ZWQgY29kZSBnZW5lcmF0aW9uLiAgIFRoZSBsYXllcmVkIGFwcHJvYWNoIHdpbGwgcHJvYmFibHkgcmVtYWluIGluIHBsYWNlIGhvd2V2ZXIuCi08ZHQ+Ni4JIEJldHRlciBzdXBwb3J0IGZvciBtdWx0aXBsZS1maWxlcyAoZXhwb3J0aW5nLCBpbXBvcnRpbmcsIGV0Yy4uLikKLQotPC9kbD4KLTxwPgotSW4gcGxhbm5pbmcgZm9yIHRoZSBmdXR1cmUsICBtdWNoIG9mIGEgbGFuZ3VhZ2UncyBmdW5jdGlvbmFsaXR5IGNhbiBiZSBkZXNjcmliZWQgaW4gdGVybXMgb2YgdHlwZW1hcHMuICBTdGlja2luZyB0byB0aGlzIGFwcHJvYWNoIHdpbGwgbWFrZSBpdCBzaWduaWZpY2FudGx5IGVhc2llciB0byBtb3ZlIHRvIG5ldyByZWxlYXNlcy4gICAgSSBhbnRpY2lwYXRlIHRoYXQgdGhlcmUgd2lsbCBiZSBmZXcgZHJhc3RpYyBjaGFuZ2VzIHRvIHRoZSBMYW5ndWFnZSBtb2R1bGUgcHJlc2VudGVkIGluIHRoaXMgc2VjdGlvbiAob3RoZXIgdGhhbiBjaGFuZ2VzIHRvIG1hbnkgb2YgdGhlIGNhbGxpbmcgbWVjaGFuaXNtcykuPHA+Ci0KLTxwPjxocj4KLQotPGFkZHJlc3M+U1dJRyAxLjEgLSBMYXN0IE1vZGlmaWVkIDogTW9uIEF1ZyAgNCAxMDo0NzoxNyAxOTk3PC9hZGRyZXNzPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9JbmRleC5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9JbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzY2MmVhLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvSW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+IFNXSUcgMS4xIFVzZXJzIE1hbnVhbCAtIFRvcGljIEluZGV4IDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLQotPGgxPiBBbHBoYWJldGljYWwgVG9waWMgSW5kZXggPC9oMT4KLTxoMj4gLSBBIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJQeXRob24uaHRtbCNuNTMiPkEgY29tcGxldGUgYXBwbGljYXRpb248L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI243Ij5BIGZldyBkeW5hbWljIGxvYWRpbmcgZ290Y2hhczwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNDkiPkEgZmV3IGhlbHBlciBmdW5jdGlvbnM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24xMCI+QSBnZW5lcmFsIGludGVyZmFjZSBidWlsZGluZyBzdHJhdGVneTwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQ2Ij5BIG1hdGhlbWF0aWNhbCBmdW5jdGlvbiAgcGxvdHRlcjwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI240MCI+QSBRdWljayBJbnRlcm1pc3Npb248L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMjkiPkEgc2ltcGxlIGV4YW1wbGU8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xNiI+QSBzaW1wbGUgZXhhbXBsZTwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNSI+QSBzaW1wbGUgUGVybCBleGFtcGxlPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNjciPkEgc2ltcGxlIHNoYWRvdyBjbGFzczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjMxIj5BIHNpbXBsZSBTV0lHIGludGVyZmFjZSBmaWxlPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24zNyI+QSBzaW1wbGUgdHlwZW1hcCBleGFtcGxlPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuNSI+QSBTV0lHIGV4YW1wbGU8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuNSI+QSB0b3VyIG9mIFNXSUcgZGF0YXR5cGVzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzAiPkEgVHlwZW1hcCBJbXBsZW1lbnRhdGlvbjwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjUiPkFib3V0IHRoZSBleGFtcGxlczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNSI+QWJvdXQgdGhlIEV4YW1wbGVzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUHJlZmFjZS5odG1sI24zIj5BYm91dCB0aGlzIG1hbnVhbDwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjM3Ij5BY2Nlc3NpbmcgYXJyYXkgZGF0YTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjQzIj5BY2Nlc3NpbmcgYXJyYXkgc3RydWN0dXJlIG1lbWJlcnM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI242MiI+QWNjZXNzaW5nIGFycmF5IHN0cnVjdHVyZSBtZW1iZXJzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjgiPkFjY2Vzc2luZyBhcnJheXM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNiI+QWNjZXNzaW5nIGFycmF5cyBhbmQgb3RoZXIgc3RyYW5nZSBvYmplY3RzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMzYiPkFjY2Vzc2luZyBtZW1iZXIgZGF0YTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjciPkFkZGluZyBBZGRpdGlvbmFsIFRleHQ8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNDAiPkFkZGluZyBtZW1iZXIgZnVuY3Rpb25zIHRvIEMgc3RydWN0dXJlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjY2Ij5BZGRpbmcgbmF0aXZlIFB5dGhvbiBmdW5jdGlvbnMgdG8gYSBTV0lHIG1vZHVsZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTUiPkFkZGluZyBuZXcgbWV0aG9kczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243MSI+QWRkaW5nIG5ldyBtZXRob2RzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMTciPkFkZGl0aW9uYWwgU1dJRyBvcHRpb25zPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuOSI+QW4gRXhhbXBsZTwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjUwIj5BbiBPcGVuR0wgcGFja2FnZTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI241Ij5BcHBseWluZyBjb25zdHJhaW50cyB0byBpbnB1dCB2YWx1ZXM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjI3Ij5BcHBseWluZyBjb25zdHJhaW50cyB0byBuZXcgZGF0YXR5cGVzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJFeGNlcHRpb25zLmh0bWwjbjkiPkFwcGx5aW5nIGV4Y2VwdGlvbiBoYW5kbGVycyB0byBzcGVjaWZpYyBkYXRhdHlwZXMuPC9hPiAoNyBFeGNlcHRpb24gSGFuZGxpbmcpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zOCI+QXJyYXkgbWVtYmVyczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zMCI+QXJyYXlzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjEwIj5BU0NJSSBEb2N1bWVudGF0aW9uPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMzEiPkF1dG9tYXRlZCBzaGFkb3cgY2xhc3MgZ2VuZXJhdGlvbjwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xMCI+QXV0b21hdGljIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbjwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gQiAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iUGVybDUuaHRtbCNuNCI+QmFzaWMgUGVybCBpbnRlcmZhY2U8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24zIj5CYXNpYyBUY2wgSW50ZXJmYWNlPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI242Ij5CaW5hcnkgdHJlZXMgaW4gVGNsPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlByZWZhY2UuaHRtbCNuNiI+QnVnIHJlcG9ydHM8L2E+IChQcmVmYWNlKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI240MiI+QnVpbGRpbmcgYSBDIGRhdGEgc3RydWN0dXJlIGluIFRjbDwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24yMCI+QnVpbGRpbmcgYSBkeW5hbWljIG1vZHVsZSB3aXRoIE1ha2VNYWtlcjwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMTEiPkJ1aWxkaW5nIGEgUGVybDUgaW50ZXJmYWNlIHRvIE1BVExBQjwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjE1Ij5CdWlsZGluZyBhIFBlcmw1IG1vZHVsZTwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xNiI+QnVpbGRpbmcgYSBQeXRob24gbW9kdWxlPC9hPiAoMSBJbnRyb2R1Y3Rpb24pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQ1Ij5CdWlsZGluZyBhIHNpbXBsZSAyRCBpbWFnaW5nIGNsYXNzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjkiPkJ1aWxkaW5nIGEgc2ltcGxlIE9wZW5HTCBtb2R1bGU8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMjEiPkJ1aWxkaW5nIGEgc3RhdGljIHZlcnNpb24gb2YgUGVybDwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjQ0Ij5CdWlsZGluZyBhbiBvYmplY3Qgb3JpZW50ZWQgQyBpbnRlcmZhY2U8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjciPkJ1aWxkaW5nIEMvQysrIGRhdGEgc3RydWN0dXJlcyB3aXRoIFRrPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI241MiI+QnVpbGRpbmcgbGFyZ2UgIG11bHRpLW1vZHVsZSBzeXN0ZW1zPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjE5Ij5CdWlsZGluZyBsaWJyYXJpZXMgYW5kIG1vZHVsZXM8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMTMiPkJ1aWxkaW5nIG5ldyBraW5kcyBvZiBUY2wgaW50ZXJmYWNlcyAoaW4gVGNsKTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24yIj5CdWlsZGluZyBQZXJsIEV4dGVuc2lvbnMgdW5kZXIgV2luZG93cyA5NS9OVDwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjIiPkJ1aWxkaW5nIFB5dGhvbiBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuMyI+QnVpbGRpbmcgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM8L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjIiPkJ1aWxkaW5nIFRjbC9UayBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPjwvYmxvY2txdW90ZT4KLTxoMj4gLSBDIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJTV0lHLmh0bWwjbjM5Ij5DIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI240MCI+QyBmaWxlczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjIxIj5DIEluZm9ybWF0aW9uPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjE0Ij5DIFByZXByb2Nlc3NvciBkaXJlY3RpdmVzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuNiI+QyBzeW50YXgsIGJ1dCBub3QgYSBDIGNvbXBpbGVyPC9hPiAoMSBJbnRyb2R1Y3Rpb24pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjMyIj5DKysgQ2xhc3NlczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMjgiPkMrKyBDbGFzc2VzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI240NCI+QysrIGV4YW1wbGU8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xMSI+QysrIFByb2Nlc3Npbmc8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjYiPkMrKyBzdXBwb3J0PC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjEzIj5DKysgU3VwcG9ydDwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI242OCI+Q2F0ZWdvcmllczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjM3Ij5DaGFuZ2luZyBtZW1iZXIgZGF0YTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjE5Ij5DaGFyYWN0ZXIgU3RyaW5nczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zNyI+Q2hhcmFjdGVyIHN0cmluZ3MgYW5kIHN0cnVjdHVyZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTciPkNoZWNraW5nIGluIGxpYnJhcnkgZmlsZXM8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTUiPkNoZWNraW5nIG91dCBsaWJyYXJ5IGZpbGVzPC9hPiAoNCBNdWx0aXBsZSBmaWxlcyBhbmQgdGhlIFNXSUcgbGlicmFyeSk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjMiPkNob29zaW5nIGEgZG9jdW1lbnRhdGlvbiBmb3JtYXQ8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjIiPkNsYXNzIG1ldGhvZHM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24zNSI+Q2xlYW51cDwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNzciPkNvZGUgYmxvY2tzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuOSI+Q29kZSBHZW5lcmF0aW9uIEZ1bmN0aW9uczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuOSI+Q29kZSBJbnNlcnRpb248L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI242NiI+Q29tYmluaW5nIFRjbC9UayBFeHRlbnNpb25zPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24zMCI+Q29tbWFuZCBMaW5lIE9wdGlvbnMgYW5kIEJhc2ljIEluaXRpYWxpemF0aW9uPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xNiI+Q29tbWVudCBGb3JtYXR0aW5nIHZhcmlhYmxlczwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xOCI+Q29tbWVudCBwbGFjZW1lbnQgYW5kIGZvcm1hdHRpbmc8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMTMiPkNvbW1lbnRzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI243Ij5Db21tb24gdHlwZW1hcCBtZXRob2RzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMjIiPkNvbXBpbGF0aW9uIHByb2JsZW1zPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjIyIj5Db21waWxhdGlvbiBwcm9ibGVtcyBhbmQgY29tcGlsaW5nIHdpdGggQysrPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMTkiPkNvbXBpbGF0aW9uIHByb2JsZW1zIGFuZCBjb21waWxpbmcgd2l0aCBDKys8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjAiPkNvbXBpbGluZzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE5Ij5Db21waWxpbmcgYSBkeW5hbWljIG1vZHVsZTwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjE2Ij5Db21waWxpbmcgYSBkeW5hbWljIG1vZHVsZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24xOSI+Q29tcGlsaW5nIGEgZHluYW1pYyBtb2R1bGUgKFVuaXgpPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yIj5Db21waWxpbmcgYSBTV0lHIGV4dGVuc2lvbjwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zMiI+Q29tcGlsaW5nIG1vZHVsZXMgd2l0aCBzaGFkb3cgY2xhc3NlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuOCI+Q29uZGl0aW9uYWwgY29tcGlsYXRpb248L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24xMiI+Q29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHdpdGggU1dJRzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMzkiPkNvbnN0YW50czwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMjEiPkNvbnN0YW50czwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjI1Ij5Db25zdGFudHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuOSI+Q29uc3RhbnRzPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24yOSI+Q29uc3RhbnRzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjI3Ij5Db25zdGFudHM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjI2Ij5Db25zdHJhaW50IG1ldGhvZHM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjAiPkNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243MiI+Q29uc3RydWN0b3JzIGFuZCBEZXN0cnVjdG9yczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNDUiPkNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI241NyI+Q29udmVydGluZyAgYSBUY2wgbGlzdCB0byBhIGNoYXIgKio8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU4Ij5Db252ZXJ0aW5nICBQeXRob24gbGlzdCB0byBhIGNoYXIgKio8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI240MSI+Q29udmVydGluZyBhIFBlcmw1IGFycmF5IHRvIGEgY2hhciAqKjwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU5Ij5Db252ZXJ0aW5nIGEgUHl0aG9uIGZpbGUgb2JqZWN0IHRvIGEgRklMRSAqPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzQiPkNvcHlpbmcgYSB0eXBlbWFwPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjUiPkNyZWF0aW5nIGEgbmV3IHBhY2thZ2UgaW5pdGlhbGl6YXRpb24gbGlicmFyeTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24zMiI+Q3JlYXRpbmcgYSBuZXcgdHlwZW1hcDwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ3Ij5DcmVhdGluZyBhIHVzYWdlIHN0cmluZzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24zNyI+Q3JlYXRpbmcgYSBXcmFwcGVyIEZ1bmN0aW9uPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMTciPkNyZWF0aW5nIGFycmF5czwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjM2Ij5DcmVhdGluZyBDb21tYW5kczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuNyI+Q3JlYXRpbmcgTGlicmFyeSBGaWxlczwvYT4gKDQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnkpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzciPkNyZWF0aW5nIGxvY2FsIHZhcmlhYmxlczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuMSI+Q3JlYXRpbmcgbXVsdGktbW9kdWxlIHBhY2thZ2VzPC9hPiAoMTEgQWR2YW5jZWQgVG9waWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24zMyI+Q3JlYXRpbmcgbmV3IG9iamVjdHM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zMSI+Q3JlYXRpbmcgcmVhZC1vbmx5IHZhcmlhYmxlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHJlZmFjZS5odG1sI240Ij5DcmVkaXRzPC9hPiAoUHJlZmFjZSk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMjIiPkNyb3NzIHBsYXRmb3JtIHdvZXM8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIEQgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuNyI+RGVidWdnaW5nIGFuZCBvdGhlciBpbnRlcmVzdGluZyB1c2VzIGZvciAlZXhjZXB0PC9hPiAoNyBFeGNlcHRpb24gSGFuZGxpbmcpPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xNSI+RGVmYXVsdCBGb3JtYXR0aW5nPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjM0Ij5EZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50czwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sI241Ij5EZWZpbmluZyBkaWZmZXJlbnQgZXhjZXB0aW9uIGhhbmRsZXJzPC9hPiAoNyBFeGNlcHRpb24gSGFuZGxpbmcpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243MyI+RGVmaW5pbmcgc3ltYm9sczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzMiPkRlbGV0aW5nIGEgdHlwZW1hcDwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjM1Ij5EZWxldGluZyBvYmplY3RzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMjQiPkRlcml2ZWQgdHlwZXMsIHN0cnVjdHMsIGFuZCBjbGFzc2VzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjgiPkRpc2FibGluZyBhbGwgZG9jdW1lbnRhdGlvbjwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ2Ij5Eb2N1bWVudGF0aW9uIGVudHJpZXM8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMTgiPkRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbjwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xMiI+RG9jdW1lbnRhdGlvbiBQcm9jZXNzaW5nPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjY4Ij5EeW5hbWljIGxvYWRpbmc8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuMiI+RHluYW1pYyBMb2FkaW5nIG9mIEMrKyBtb2R1bGVzPC9hPiAoMTEgQWR2YW5jZWQgVG9waWNzKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gRSAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjMyIj5FbWl0dGluZyBoZWFkZXJzIGFuZCBzdXBwb3J0IGNvZGU8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjUwIj5FbnVtcyBhbmQgY29uc3RhbnRzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuOSI+RXZlbnQgZHJpdmVuIEMgcHJvZ3JhbW1pbmc8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuOSI+RXhjZXB0aW9uIGhhbmRsaW5nPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMTMiPkV4Y2VwdGlvbiBoYW5kbGluZzwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjEwIj5FeGNlcHRpb24gaGFuZGxpbmc8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sI24zIj5FeGNlcHRpb24gaGFuZGxpbmcgd2l0aCBsb25nam1wKCk8L2E+ICg3IEV4Y2VwdGlvbiBIYW5kbGluZyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNDQiPkV4dGVuZGluZyBhbmQgZml4aW5nIHRoZSBnZCBtb2R1bGU8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMTQiPkV4dGVuZGluZyB0aGUgVGNsIE5ldHNjYXBlIFBsdWdpbjwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIEYgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI243Ij5GaWxlIG1hbmFnZW1lbnQ8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMzQiPkZpbmFsIEluaXRpYWxpemF0aW9uPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24xOCI+RmxvYXRpbmcgUG9pbnQ8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuNiI+Rm9ybWF0dGluZzwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQ4Ij5Gcm9tIEMgdG8gU1dJRyB0byBQeXRob248L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjIiPkZ1bmN0aW9uIFBhcmFtZXRlcnM8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjQiPkZ1bmN0aW9uIHVzYWdlIGFuZCBhcmd1bWVudCBuYW1lczwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjI3Ij5GdW5jdGlvbnM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjIzIj5GdW5jdGlvbnM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24yNSI+RnVuY3Rpb25zPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIEcgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNCI+R2V0dGluZyBkb3duIHRvIGJ1c2luZXNzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMzkiPkdldHRpbmcgZXZlbiBtb3JlIHNlcmlvdXMgYWJvdXQgYXJyYXkgYWNjZXNzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuOSI+R2V0dGluZyBzZXJpb3VzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24xOCI+R2V0dGluZyB0aGUgcmlnaHQgaGVhZGVyIGZpbGVzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMTUiPkdldHRpbmcgdGhlIHJpZ2h0IGhlYWRlciBmaWxlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODQiPkdldHRpbmcgdGhlIHJpZ2h0IGhlYWRlciBmaWxlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjE4Ij5HZXR0aW5nIHRoZSByaWdodCBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMjgiPkdsb2JhbCB2YXJpYWJsZXM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMjYiPkdsb2JhbCB2YXJpYWJsZXM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjM2Ij5HcmFwaGljYWwgV2ViLVN0YXRpc3RpY3MgaW4gUGVybDU8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjMwIj5HcmFwaHM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gSCAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iRXhjZXB0aW9ucy5odG1sI240Ij5IYW5kbGluZyBDKysgZXhjZXB0aW9uczwvYT4gKDcgRXhjZXB0aW9uIEhhbmRsaW5nKTxicj4KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuMiI+SGFuZGxpbmcgZXhjZXB0aW9ucyBpbiBDIGNvZGU8L2E+ICg3IEV4Y2VwdGlvbiBIYW5kbGluZyk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24xMiI+SGFuZGxpbmcgb3V0cHV0IHZhbHVlcyAodGhlIGVhc3kgd2F5KTwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjgiPkhhbmRzIG9mZiBjb2RlIGdlbmVyYXRpb248L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjQiPkhhc2ggVGFibGVzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ1Ij5IaW50czwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI240MyI+SG93IEMrKyBwcm9jZXNzaW5nIHdvcmtzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjIiPkhvdyBkb2VzIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRhbGsgdG8gQz88L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24yIj5Ib3cgaXQgd29ya3M8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yOCI+SG93IG1hbnkgdHlwZW1hcHMgYXJlIHRoZXJlPzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODgiPkhvdyB0byBhdm9pZCBjcmVhdGluZyB0aGUgaW50ZXJmYWNlIGZyb20gaGVsbDwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHJlZmFjZS5odG1sI24xMCI+SG93IHRvIGF2b2lkIHJlYWRpbmcgdGhlIG1hbnVhbDwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMTMiPkhvdyB0byBicmVhayBldmVyeXRoaW5nIHdpdGggYSB0eXBlbWFwPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjg3Ij5Ib3cgdG8gY29wZSB3aXRoIEMrKzwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjIzIj5Ib3cgdG8gc3Vydml2ZSB0aGlzIG1hbnVhbDwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTEiPkhUTUwgRG9jdW1lbnRhdGlvbjwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPjwvYmxvY2txdW90ZT4KLTxoMj4gLSBJIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjIwIj5JZ25vcmluZyBjb21tZW50czwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI242OSI+SW1wbGVtZW50YXRpb25zIGFuZCBQcm90b2NvbHM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xMSI+SW1wbGVtZW50aW5nIEMgY2FsbGJhY2sgZnVuY3Rpb25zIGluIFB5dGhvbjwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjExIj5JbXBsZW1lbnRpbmcgY29uc3RyYWludHMgd2l0aCB0eXBlbWFwczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjQzIj5JbXBsZW1lbnRpbmcgbWV0aG9kcyBpbiBDPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjciPkltcGxlbWVudGluZyBtZXRob2RzIGluIFBlcmw8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI240MCI+SW1wbGVtZW50aW5nIHNwZWNpYWwgUHl0aG9uIG1ldGhvZHMgaW4gQzwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuNCI+SW5jbHVkaW5nIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjU0Ij5Jbmhlcml0YW5jZTwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI241MiI+SW5oZXJpdGFuY2U8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjYiPkluaGVyaXRhbmNlPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNzciPkluaGVyaXRhbmNlIGFuZCBzaGFkb3cgY2xhc3NlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNzkiPkluaXRpYWxpemF0aW9uIGJsb2NrczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243OCI+SW5saW5lZCBjb2RlIGJsb2NrczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24xMSI+SW5wdXQgZm9ybWF0PC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24yMSI+SW5wdXQgTWV0aG9kczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMjMiPklucHV0L091dHB1dCBNZXRob2RzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI24zIj5JbnNpZGUgdGhlIFNXSUcgdHlwZS1jaGVja2VyPC9hPiAoMTEgQWR2YW5jZWQgVG9waWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjEiPkluc3RhbmNlIG1ldGhvZHM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMTciPkludGVnZXJzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xIj5JbnRyb2R1Y3Rpb248L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMSI+SW50cm9kdWN0aW9uPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJQcmVmYWNlLmh0bWwjbjEiPkludHJvZHVjdGlvbjwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjEiPkludHJvZHVjdGlvbjwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjMiPkludHJvZHVjdGlvbiB0byB0eXBlbWFwczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjM0Ij5JbnZva2luZyBtZW1iZXIgZnVuY3Rpb25zPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjU1Ij5JdGVyYXRvcnM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gTCAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ0Ij5MYW5ndWFnZSBleHRlbnNpb25zPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRG9jdW1lbnRhdGlvbi5odG1sI24xMiI+TGFUZVggRG9jdW1lbnRhdGlvbjwvYT4gKDUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0pPGJyPgotPGEgaHJlZj0iTGlicmFyeS5odG1sI242Ij5MaWJyYXJ5IGV4YW1wbGU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24zIj5MaWZlIGFmdGVyIFNXSUc8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMiI+TGlmZSBiZWZvcmUgU1dJRzwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMTYiPkxpbWl0YXRpb25zIGluIHRoZSBQYXJzZXIgKGFuZCB2YXJpb3VzIHRoaW5ncyB0byBrZWVwIGluIG1pbmQpPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjciPkxpbWl0YXRpb25zIHRvIHRoaXMgYXBwcm9hY2g8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24yOSI+TGlua2luZyB0byBjb21wbGV4IHZhcmlhYmxlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjEzIj5MaW5raW5nIHdpdGggc2hhcmVkIGxpYnJhcmllczwvYT4gKDIgU2NyaXB0aW5nIExhbmd1YWdlcyk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIE0gLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlRjbC5odG1sI240MSI+TWFraW5nIGEgcXVpY2sgYSBkaXJ0eSBUY2wgbW9kdWxlPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zNSI+TWFraW5nIGEgcXVpY2sgYW5kIGRpcnR5IFB5dGhvbiBtb2R1bGU8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEyIj5tYWxsb2MuaTwvYT4gKDQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnkpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuNCI+TWFuYWdpbmcgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24yOSI+TWFuYWdpbmcgc3BlY2lhbCBkYXRhLXR5cGVzIHdpdGggaGVscGVyIGZ1bmN0aW9uczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjM4Ij5NYW5pcHVsYXRpbmcgR2xvYmFsIFZhcmlhYmxlczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI242MCI+TWFwcGluZyBDIHN0cnVjdHVyZXMgaW50byBUY2wgTGlzdHM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjYxIj5NYXBwaW5nIFB5dGhvbiB0dXBsZXMgaW50byBzbWFsbCBhcnJheXM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNzMiPk1lbWJlciBkYXRhPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI240OCI+TWVtYmVyIGRhdGE8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjMiPk1lbWJlciBkYXRhPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjQ2Ij5NZW1iZXIgZnVuY3Rpb25zPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNDkiPk1lcmdpbmcgbW9kdWxlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243OCI+TWV0aG9kcyB0aGF0IHJldHVybiBuZXcgb2JqZWN0czwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjQ5Ij5Nb2R1bGUgYW5kIHBhY2thZ2UgbmFtZXM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI242OCI+TW9kdWxlIG5hbWVzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjIyIj5Nb2R1bGVzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMyI+TW9kdWxlcywgcGFja2FnZXMsIGFuZCBjbGFzc2VzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEwIj5Nb3JlIGFib3V0IHRoZSBTV0lHIGxpYnJhcnk8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuOCI+TW9yZSBFeGFtcGxlczwvYT4gKDcgRXhjZXB0aW9uIEhhbmRsaW5nKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjI4Ij5Nb3RpdmF0aW9ucyBmb3IgdXNpbmcgdHlwZW1hcHM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gTiAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iVGNsLmh0bWwjbjU2Ij5OYW1lIGJhc2VkIHR5cGUgY29udmVyc2lvbjwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNTciPk5hbWUgYmFzZWQgdHlwZSBjb252ZXJzaW9uPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNDAiPk5hbWUgYmFzZWQgdHlwZSBjb252ZXJzaW9uPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuOCI+TmFtaW5nIFNlcnZpY2VzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjc2Ij5OZXN0ZWQgb2JqZWN0czwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjUyIj5OZXN0ZWQgT2JqZWN0czwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI240MSI+TmVzdGVkIHN0cnVjdHVyZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI243Ij5Ob24taW50cnVzaXZlIGludGVyZmFjZSBidWlsZGluZzwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gTyAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iUGVybDUuaHRtbCNuNTEiPk9iamVjdCBPd25lcnNoaXA8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243MSI+T2JqZWN0IG93bmVyc2hpcDwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNyI+T2JqZWN0aXZlLUM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTkiPk9iamVjdGl2ZS1DIEV4YW1wbGU8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlByZWZhY2UuaHRtbCNuOSI+T3JnYW5pemF0aW9uIG9mIHRoaXMgbWFudWFsPC9hPiAoUHJlZmFjZSk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjcyIj5PdGhlciBpc3N1ZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xMiI+T3RoZXIgb2RkcyBhbmQgZW5kczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNDIiPk90aGVyIHRoaW5ncyB0byBub3RlIGFib3V0IHN0cnVjdHVyZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjIyIj5PdXRwdXQgTWV0aG9kczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24zMyI+T3ZlcnJpZGluZyBjYWxsIGJ5IHJlZmVyZW5jZTwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPjwvYmxvY2txdW90ZT4KLTxoMj4gLSBQIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xOCI+UGFja2luZyBhIGRhdGEgc3RydWN0dXJlPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjU2Ij5QYXJ0aWFsIGNsYXNzIGRlZmluaXRpb25zPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjI3Ij5QYXNzaW5nIGNvbXBsZXggZGF0YXR5cGVzIGJ5IHZhbHVlPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMzkiPlBlcmZvcm1hbmNlIGNvbmNlcm5zIGFuZCBkaXNhYmxpbmcgdGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2U8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjc5Ij5QZXJmb3JtYW5jZSBjb25jZXJucyBhbmQgaGludHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI24xMSI+UGVyZm9ybWFuY2Ugb2YgdGhlIHR5cGUtY2hlY2tlcjwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24zOCI+UGVybDUgdHlwZW1hcHM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTMiPlBsYWNpbmcgdGhlIGZpbGVzIGluIHRoZSBsaWJyYXJ5PC9hPiAoNCBNdWx0aXBsZSBmaWxlcyBhbmQgdGhlIFNXSUcgbGlicmFyeSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNDciPlBsb3R0aW5nIGFuIHVuc3RydWN0dXJlZCBtZXNoPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNDciPlBvaW50ZXIgaGFuZGxpbmc8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI242MyI+UG9pbnRlciBoYW5kbGluZzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNjUiPlBvaW50ZXIgaGFuZGxpbmc8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xNSI+UG9pbnRlciBMaWJyYXJ5IEZ1bmN0aW9uczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMjgiPlBvaW50ZXJzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMzAiPlBvaW50ZXJzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24yNiI+UG9pbnRlcnM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjMiPlBvaW50ZXJzIGFuZCBjb21wbGV4IG9iamVjdHM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMzUiPlBvaW50ZXJzIHRvIGZ1bmN0aW9uczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243NSI+UHJlZGVmaW5lZCBTeW1ib2xzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMSI+UHJlbGltaW5hcmllczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24xIj5QcmVsaW1pbmFyaWVzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMSI+UHJlbGltaW5hcmllczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODEiPlByZXBhcmluZyBhIEMgcHJvZ3JhbSBmb3IgU1dJRzwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjQyIj5QcmVwYXJpbmcgYSBtb2R1bGU8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQcmVmYWNlLmh0bWwjbjgiPlByZXJlcXVpc2l0ZXM8L2E+IChQcmVmYWNlKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xNCI+UHJlcmVxdWlzaXRlczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243NCI+UHJpbnRpbmc8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNTIiPlByb2JsZW1zIHdpdGggdGhlIE9wZW5HTCBpbnRlcmZhY2U8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI240OSI+UHJvdGVjdGlvbjwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI242NCI+UHJvdGVjdGlvbjwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjgiPlB1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMzUiPlB1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNCI+UHl0aG9uIHNoYWRvdyBjbGFzc2VzPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU1Ij5QeXRob24gdHlwZW1hcHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIFIgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xNyI+UmVidWlsZGluZyB0aGUgUHl0aG9uIGludGVycHJldGVyIChha2EuIHN0YXRpYyBsaW5raW5nKTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTEiPlJlZmVyZW5jZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjciPlJlZmVycmluZyB0byBvdGhlciBjbGFzc2VzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMzgiPlJlbGF0aW9uc2hpcCB3aXRoIHBvaW50ZXJzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xMCI+UmVtYXBwaW5nIEMgZGF0YXR5cGVzIHdpdGggdHlwZW1hcHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNTgiPlJlbWFwcGluZyBjb25zdGFudHM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMTQiPlJlbWFwcGluZyBkYXRhdHlwZXMgd2l0aCB0eXBlbWFwczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243MCI+UmVuYW1pbmc8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTQiPlJlbmFtaW5nPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjMyIj5SZW5hbWluZyBkZWNsYXJhdGlvbnM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xOCI+UmVxdWlyZWQgQysrIGNvbXBpbGVyPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjE3Ij5SZXF1aXJlZCBmaWxlczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI240NSI+UmVxdWlyZWQgZmlsZXM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24yOCI+UmV0dXJuIGJ5IHZhbHVlPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI240OCI+UmV0dXJuIHZhbHVlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjU5Ij5SZXR1cm5pbmcgdmFsdWVzIGluIGFyZ3VtZW50czwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjIzIj5SdW4gdGltZSBwb2ludGVyIHR5cGUgY2hlY2tpbmc8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE3Ij5SdW5uaW5nIFNXSUc8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xNCI+UnVubmluZyBTV0lHPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24xIj5SdW5uaW5nIFNXSUc8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24xNiI+UnVubmluZyBTV0lHPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24yNSI+UnVubmluZyBTV0lHIGZyb20gRGV2ZWxvcGVyIFN0dWRpbzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMjAiPlJ1bm5pbmcgU1dJRyBmcm9tIERldmVsb3BlciBTdHVkaW88L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24yMyI+UnVubmluZyBTV0lHIGZyb20gRGV2ZWxvcGVyIFN0dWRpbzwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuNCI+UnVudGltZSBzdXBwb3J0IChhbmQgcG90ZW50aWFsIHByb2JsZW1zKTwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIFMgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjMyIj5TYW1wbGUgUGVybCBTY3JpcHQ8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjM2Ij5TY29wZTwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjMzIj5TZXR0aW5nIGEgbW9kdWxlIG5hbWU8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuMjMiPlNldHRpbmcgYSBwYWNrYWdlIHByZWZpeDwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI244Ij5TaGFkb3cgY2xhc3NlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjcwIj5TaGFkb3cgY2xhc3NlczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuMTEiPlNoYWRvdyBjbGFzc2VzPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjUzIj5TaGFkb3cgRnVuY3Rpb25zPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNzUiPlNoYWRvdyBGdW5jdGlvbnM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuNCI+U2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pYyBsb2FkaW5nPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xNyI+U2hvcnRjdXRzPC9hPiAoMSBJbnRyb2R1Y3Rpb24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24yIj5TaW1wbGUgQyBmdW5jdGlvbnMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50czwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMjUiPlNpbXBsZSBjb25zdHJhaW50IGV4YW1wbGU8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMjIiPlNpbXBsZSBwb2ludGVyczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjYiPlNvbHZpbmcgYSBzaW1wbGUgaGVhdC1lcXVhdGlvbjwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTciPlNvcnRpbmc8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjM4Ij5TcGVjaWFsIHZhcmlhYmxlczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjY0Ij5TdGFuZGFyZCAgdHlwZW1hcHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjIiPlN0YW5kYXJkICB0eXBlbWFwczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI240NiI+U3RhbmRhcmQgdHlwZW1hcHM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24zMSI+U3RhcnRpbmcgdGhlIHBhcnNlcjwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuOSI+U3RhdGljIGluaXRpYWxpemF0aW9uIG9mIG11bHRpcGxlIG1vZHVsZXM8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IlNjcmlwdGluZy5odG1sI24xMiI+U3RhdGljIGxpbmtpbmc8L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjIxIj5TdGF0aWMgbGlua2luZzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjQ3Ij5TdGF0aWMgbWVtYmVyczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjMxIj5TdHJ1Y3R1cmVzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24yNyI+U3RydWN0dXJlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjI5Ij5TdHJ1Y3R1cmVzIGFuZCBDKysgY2xhc3NlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjEwIj5TdHJ1Y3R1cmVzIGFuZCBjbGFzc2VzPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNSI+U3RydWN0dXJlcywgdW5pb25zLCBhbmQgb2JqZWN0IG9yaWVudGVkIEMgcHJvZ3JhbW1pbmc8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkludHJvZHVjdGlvbi5odG1sI24xMSI+U3VtbWFyeTwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI240MSI+U3VtbWFyeSAoc28gZmFyKTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNDMiPlN1cHBvcnRlZCBDKysgZmVhdHVyZXM8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMTUiPlNXSUcgRGlyZWN0aXZlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjEyIj5TV0lHIGZvciBXaW5kb3dzIGFuZCBNYWNpbnRvc2g8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMTMiPlNXSUcgaW50ZXJmYWNlIGZpbGU8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJQcmVmYWNlLmh0bWwjbjciPlNXSUcgaXMgZnJlZTwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjIxIj5TV0lHIG9uIHRoZSBQb3dlciBNYWNpbnRvc2g8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMjAiPlNXSUcgb24gV2luZG93cyA5NS9OVDwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24xNSI+U1dJRyBPcmdhbml6YXRpb248L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMyI+U1dJRyBvdXRwdXQ8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjEyIj5TV0lHIE91dHB1dDwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHJlZmFjZS5odG1sI24yIj5TV0lHIHJlc291cmNlczwvYT4gKFByZWZhY2UpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI241NyI+U1dJRywgQysrLCBhbmQgdGhlIExlZ2lzbGF0aW9uIG9mIE1vcmFsaXR5PC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIFQgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuMTkiPlRhYnMgYW5kIG90aGVyIGFubm95YW5jZXM8L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI241NCI+VGNsIHR5cGVtYXBzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24xNSI+VGNsOC4wIGZlYXR1cmVzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTEiPnRjbHNoLmk8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTMiPlRlbXBsYXRlczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243NCI+VGhlICNpZiBkaXJlY3RpdmU8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuMSI+VGhlICVleGNlcHQgZGlyZWN0aXZlPC9hPiAoNyBFeGNlcHRpb24gSGFuZGxpbmcpPGJyPgotPGEgaHJlZj0iTGlicmFyeS5odG1sI24yIj5UaGUgJWV4dGVybiBkaXJlY3RpdmU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMyI+VGhlICVpbXBvcnQgZGlyZWN0aXZlPC9hPiAoNCBNdWx0aXBsZSBmaWxlcyBhbmQgdGhlIFNXSUcgbGlicmFyeSk8YnI+Ci08YSBocmVmPSJMaWJyYXJ5Lmh0bWwjbjEiPlRoZSAlaW5jbHVkZSBkaXJlY3RpdmU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zNCI+VGhlIEMrKyBjb2RlPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjIxIj5UaGUgRGF0YVR5cGUgY2xhc3M8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJEb2N1bWVudGF0aW9uLmh0bWwjbjE0Ij5UaGUgRmluYWwgV29yZD88L2E+ICg1IERvY3VtZW50YXRpb24gU3lzdGVtKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNTgiPlRoZSBmdXR1cmUgb2YgQysrIGFuZCBTV0lHPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTMiPlRoZSBGdXR1cmUgb2YgU1dJRzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24xMyI+VGhlIGdvcnkgZGV0YWlscyBvZiBzaGFkb3cgY2xhc3NlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjE1Ij5UaGUgZ29yeSBkZXRhaWxzIG9uIHNoYWRvdyBjbGFzc2VzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjkiPlRoZSBoZWFkZXIgZmlsZTwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjE5Ij5UaGUgaWRlYSAoaW4gYSBudXRzaGVsbCk8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI240Ij5UaGUgTGFuZ3VhZ2UgY2xhc3MgKHNpbXBsZSB2ZXJzaW9uKTwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zIj5UaGUgbG93LWxldmVsIFB5dGhvbi9DIGludGVyZmFjZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjMzIj5UaGUgTUFUTEFCIGVuZ2luZSBpbnRlcmZhY2U8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI240Ij5UaGUgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTYiPlRoZSBvcmdhbml6YXRpb24gb2YgdGhpcyBjaGFwdGVyPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI243NiI+VGhlIG91dHB1dCBvZiBTV0lHPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNzEiPlRoZSBzdGVwLWJ5LXN0ZXAgcHJvY2VzcyBmb3IgbWFraW5nIGEgcGx1Z2luIGV4dGVuc2lvbi48L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjIzIj5UaGUgU3RyaW5nIENsYXNzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjE0Ij5UaGUgc3dpZyBjb21tYW5kPC9hPiAoMSBJbnRyb2R1Y3Rpb24pPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI244MiI+VGhlIFNXSUcgaW50ZXJmYWNlIGZpbGU8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuNSI+VGhlIFNXSUcgbGlicmFyeTwvYT4gKDQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnkpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQyIj5UaGUgU1dJRyBsaWJyYXJ5IGFuZCBpbnN0YWxsYXRpb24gaXNzdWVzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iSW50cm9kdWN0aW9uLmh0bWwjbjQiPlRoZSBTV0lHIHBhY2thZ2U8L2E+ICgxIEludHJvZHVjdGlvbik8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24yIj5UaGUgU1dJRyBQb2ludGVyIExpYnJhcnk8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IkFkdmFuY2VkLmh0bWwjbjYiPlRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeTwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNzAiPlRoZSB0aGlzIHBvaW50ZXI8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJTY3JpcHRpbmcuaHRtbCNuMSI+VGhlIHR3byBsYW5ndWFnZSB2aWV3IG9mIHRoZSB3b3JsZDwvYT4gKDIgU2NyaXB0aW5nIExhbmd1YWdlcyk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMjYiPlRoZSB0eXBlbWFwIEMgQVBJLjwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuNjUiPlRoZSB1c2Ugb2YgaWQ8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTYiPlRoZSB3b3JsZCdzIGZhc3Rlc3Qgd2F5IHRvIHdyaXRlIGEgTWFrZWZpbGU8L2E+ICg0IE11bHRpcGxlIGZpbGVzIGFuZCB0aGUgU1dJRyBsaWJyYXJ5KTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yNSI+VGhlIFdyYXBwZXJGdW5jdGlvbiBjbGFzczwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IkRvY3VtZW50YXRpb24uaHRtbCNuNSI+VGl0bGVzLCBzZWN0aW9ucywgYW5kIHN1YnNlY3Rpb25zPC9hPiAoNSBEb2N1bWVudGF0aW9uIFN5c3RlbSk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjkiPlR1cm5pbmcgYSBTV0lHIG1vZHVsZSBpbnRvIGEgVGNsIFBhY2thZ2UuPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjQ0Ij5UdXJuaW5nIFBlcmwgcmVmZXJlbmNlcyBpbnRvIEMgcG9pbnRlcnM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI242OSI+VHdvIGNsYXNzZXM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI245Ij5UeXBlIGNhc3Rpbmc8L2E+ICgxMSBBZHZhbmNlZCBUb3BpY3MpPGJyPgotPGEgaHJlZj0iQWR2YW5jZWQuaHRtbCNuOCI+VHlwZSBlcXVpdmFsZW5jZTwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjI2Ij5UeXBlZGVmPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJTV0lHLmh0bWwjbjM2Ij5UeXBlZGVmIGFuZCBzdHJ1Y3R1cmVzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xMiI+VHlwZW1hcCBleGFtcGxlczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMzUiPlR5cGVtYXAgbWF0Y2hpbmcgcnVsZXM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjM5Ij5UeXBlbWFwIHZhcmlhYmxlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU2Ij5UeXBlbWFwIHZhcmlhYmxlczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI241NSI+VHlwZW1hcCB2YXJpYWJsZXM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjExIj5UeXBlbWFwczwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuNiI+VHlwZW1hcHMgKGZyb20gQyk8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24xNCI+VHlwZW1hcHMgYW5kIHRoZSBmdXR1cmU8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlR5cGVtYXBzLmh0bWwjbjEwIj5UeXBlbWFwcyBhbmQgdGhlIFNXSUcgTGlicmFyeTwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuOSI+VHlwZW1hcHMgZm9yIGhhbmRsaW5nIGFycmF5czwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPjwvYmxvY2txdW90ZT4KLTxoMj4gLSBVIC0gPC9oMj4KLTxibG9ja3F1b3RlPgotCi08YSBocmVmPSJQeXRob24uaHRtbCNuMzgiPlVzZSBQeXRob24gZm9yIGNvbnRyb2wsIEMgZm9yIHBlcmZvcm1hbmNlPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjUxIj5Vc2Ugc3RhdGljIGxpbmtpbmc8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjEiPlVzZWZ1bCBmdW5jdGlvbnM8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuNDUiPlVzZWZ1bCBmdW5jdGlvbnM8L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI242MyI+VXNlZnVsIEZ1bmN0aW9uczwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zNiI+VXNpbmcgIG91ciBuZXcgbW9kdWxlPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjIwIj5Vc2luZyBhIGR5bmFtaWMgbW9kdWxlPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI240OSI+VXNpbmcgYSBuZXcgZG9jdW1lbnRhdGlvbiBtb2R1bGU8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24yNCI+VXNpbmcgZGlmZmVyZW50IG5hbWVzPC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNTAiPlVzaW5nIGR5bmFtaWMgbG9hZGluZzwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjI0Ij5Vc2luZyBOTUFLRTwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjI2Ij5Vc2luZyBOTUFLRTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuMjEiPlVzaW5nIE5NQUtFPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuMjAiPlVzaW5nIHNvbWUgdHlwZW1hcHM8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI240MyI+VXNpbmcgdGhlIGdkIG1vZHVsZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI241MSI+VXNpbmcgdGhlIE9wZW5HTCBtb2R1bGU8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjcyIj5Vc2luZyB0aGUgcGx1Z2luPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj4KLTxhIGhyZWY9IkV4Y2VwdGlvbnMuaHRtbCNuNiI+VXNpbmcgVGhlIFNXSUcgZXhjZXB0aW9uIGxpYnJhcnk8L2E+ICg3IEV4Y2VwdGlvbiBIYW5kbGluZyk8YnI+Ci08YSBocmVmPSJQeXRob24uaHRtbCNuNjAiPlVzaW5nIHR5cGVtYXBzIHRvIHJldHVybiBhcmd1bWVudHM8L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI240MiI+VXNpbmcgdHlwZW1hcHMgdG8gcmV0dXJuIHZhbHVlczwvYT4gKDggU1dJRyBhbmQgUGVybDUpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjE4Ij5Vc2luZyB5b3VyIG1vZHVsZTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlRjbC5odG1sI24yNCI+VXNpbmcgW2luY3IgVGNsXSBuYW1lc3BhY2VzPC9hPiAoMTAgU1dJRyBhbmQgVGNsKTxicj48L2Jsb2NrcXVvdGU+Ci08aDI+IC0gViAtIDwvaDI+Ci08YmxvY2txdW90ZT4KLQotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjI0Ij5WYXJpYWJsZSBMaW5raW5nPC9hPiAoOSBTV0lHIGFuZCBQeXRob24pPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjgiPlZhcmlhYmxlIGxpbmtpbmc8L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI24yMCI+VmFyaWFibGVzPC9hPiAoMyBTV0lHIEJhc2ljcyk8YnI+PC9ibG9ja3F1b3RlPgotPGgyPiAtIFcgLSA8L2gyPgotPGJsb2NrcXVvdGU+Ci0KLTxhIGhyZWY9IlBlcmw1Lmh0bWwjbjUwIj5XaGF0IGdldHMgY3JlYXRlZD88L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IkV4dGVuZGluZy5odG1sI24yNyI+V2hhdCBoYXBwZW5zIG9uIHR5cGVtYXAgbG9va3VwPzwvYT4gKDEyIEV4dGVuZGluZyBTV0lHKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuMjUiPldoYXQgaGFwcGVucyB3aGVuIFNXSUcgZW5jb3VudGVycyBhbiB1bmtub3duIGRhdGF0eXBlPzwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjU0Ij5XaGF0IGlzIGEgdHlwZW1hcD88L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNTMiPldoYXQgaXMgYSB0eXBlbWFwPzwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI24zMSI+V2hhdCBpcyBhIHR5cGVtYXA/PC9hPiAoNiBQb2ludGVycywgQ29uc3RyYWludHMsIGFuZCBUeXBlbWFwcyk8YnI+Ci08YSBocmVmPSJJbnRyb2R1Y3Rpb24uaHRtbCNuMSI+V2hhdCBpcyBTV0lHPzwvYT4gKDEgSW50cm9kdWN0aW9uKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODUiPldoYXQgdG8gZG8gd2l0aCBtYWluKCk8L2E+ICgzIFNXSUcgQmFzaWNzKTxicj4KLTxhIGhyZWY9IlByZWZhY2UuaHRtbCNuNSI+V2hhdCdzIG5ldz88L2E+IChQcmVmYWNlKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI24zMyI+V2hlcmUgdG8gZ28gZm9yIG1vcmUgaW5mb3JtYXRpb248L2E+ICg5IFNXSUcgYW5kIFB5dGhvbik8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuNTAiPldoZXJlIHRvIGdvIGZvciBtb3JlIGluZm9ybWF0aW9uPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iUGVybDUuaHRtbCNuMTYiPldoZXJlIHRvIGdvIGZyb20gaGVyZT88L2E+ICg4IFNXSUcgYW5kIFBlcmw1KTxicj4KLTxhIGhyZWY9IkFkdmFuY2VkLmh0bWwjbjEwIj5XaHkgYSBuYW1lIGJhc2VkIGFwcHJvYWNoPzwvYT4gKDExIEFkdmFuY2VkIFRvcGljcyk8YnI+Ci08YSBocmVmPSJBZHZhbmNlZC5odG1sI241Ij5XaHkgZG9lc24ndCBDKysgaW5oZXJpdGFuY2Ugd29yayBiZXR3ZWVuIG1vZHVsZXM/PC9hPiAoMTEgQWR2YW5jZWQgVG9waWNzKTxicj4KLTxhIGhyZWY9IlNXSUcuaHRtbCNuODMiPldoeSB1c2Ugc2VwYXJhdGUgaW50ZXJmYWNlIGZpbGVzPzwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iUHl0aG9uLmh0bWwjbjMwIj5XaHkgd3JpdGUgc2hhZG93IGNsYXNzZXMgaW4gUHl0aG9uPzwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IlNjcmlwdGluZy5odG1sI242Ij5XaWxsIGFkZGluZyBhIHNjcmlwdGluZyBsYW5ndWFnZSB0byBteSBDIHByb2dyYW0gbWFrZSBpdCB1bm1hbmFnYWJsZT88L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjUiPldpbGwgc2NyaXB0aW5nIGxhbmd1YWdlcyBtYWtlIG15IEMgcHJvZ3JhbSBpbmVmZmljaWVudD88L2E+ICgyIFNjcmlwdGluZyBMYW5ndWFnZXMpPGJyPgotPGEgaHJlZj0iTGlicmFyeS5odG1sI244Ij5Xb3JraW5nIHdpdGggbGlicmFyeSBmaWxlczwvYT4gKDQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnkpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI244NiI+V29ya2luZyB3aXRoIHRoZSBDIHByZXByb2Nlc3NvcjwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU1dJRy5odG1sI244MCI+V3JhcHBlciBjb2RlIGJsb2NrczwvYT4gKDMgU1dJRyBCYXNpY3MpPGJyPgotPGEgaHJlZj0iU2NyaXB0aW5nLmh0bWwjbjciPldyYXBwZXIgZnVuY3Rpb25zPC9hPiAoMiBTY3JpcHRpbmcgTGFuZ3VhZ2VzKTxicj4KLTxhIGhyZWY9IlB5dGhvbi5odG1sI243Ij5XcmFwcGluZyBhIEMgbGlicmFyeTwvYT4gKDkgU1dJRyBhbmQgUHl0aG9uKTxicj4KLTxhIGhyZWY9IkxpYnJhcnkuaHRtbCNuMTQiPldyYXBwaW5nIGEgbGlicmFyeSBmaWxlPC9hPiAoNCBNdWx0aXBsZSBmaWxlcyBhbmQgdGhlIFNXSUcgbGlicmFyeSk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24xMCI+V3JhcHBpbmcgQyBsaWJyYXJpZXMgYW5kIG90aGVyIHBhY2thZ2VzPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNDYiPldyYXBwaW5nIGdsLmg8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iVGNsLmh0bWwjbjQ3Ij5XcmFwcGluZyBnbHUuaDwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNDgiPldyYXBwaW5nIHRoZSBhdXggbGlicmFyeTwvYT4gKDEwIFNXSUcgYW5kIFRjbCk8YnI+Ci08YSBocmVmPSJQZXJsNS5odG1sI24zNCI+V3JhcHBpbmcgdGhlIE1BVExBQiBtYXRyaXggZnVuY3Rpb25zPC9hPiAoOCBTV0lHIGFuZCBQZXJsNSk8YnI+Ci08YSBocmVmPSJFeHRlbmRpbmcuaHRtbCNuMTkiPldyaXRpbmcgYSBtYWluIHByb2dyYW08L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUY2wuaHRtbCNuNjQiPldyaXRpbmcgYSBtYWluIHByb2dyYW0gYW5kIFRjbF9BcHBJbml0KCk8L2E+ICgxMCBTV0lHIGFuZCBUY2wpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQ4Ij5Xcml0aW5nIGEgbmV3IGRvY3VtZW50YXRpb24gbW9kdWxlPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjEwIj5Xcml0aW5nIGEgUmVhbCBMYW5ndWFnZSBNb2R1bGU8L2E+ICgxMiBFeHRlbmRpbmcgU1dJRyk8YnI+Ci08YSBocmVmPSJUeXBlbWFwcy5odG1sI242Ij5Xcml0aW5nIG5ldyB0eXBlbWFwczwvYT4gKDYgUG9pbnRlcnMsIENvbnN0cmFpbnRzLCBhbmQgVHlwZW1hcHMpPGJyPgotPGEgaHJlZj0iRXh0ZW5kaW5nLmh0bWwjbjQxIj5Xcml0aW5nIHRoZSBkZWZhdWx0IHR5cGVtYXBzPC9hPiAoMTIgRXh0ZW5kaW5nIFNXSUcpPGJyPgotPGEgaHJlZj0iVHlwZW1hcHMuaHRtbCNuOCI+V3JpdGluZyB0eXBlbWFwIGNvZGU8L2E+ICg2IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzKTxicj48L2Jsb2NrcXVvdGU+Ci0KLTxwPjxocj4KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDc6MTggMTk5NyA8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9JbnRyb2R1Y3Rpb24uaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvSW50cm9kdWN0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Y2ZjZTkuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9JbnRyb2R1Y3Rpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgotPGEgbmFtZT0ibjAiPjwvYT48aDE+MSBJbnRyb2R1Y3Rpb248L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5XaGF0IGlzIFNXSUc/PC9hPgotPGxpPiA8YSBocmVmPSIjbjIiPkxpZmUgYmVmb3JlIFNXSUc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMyI+TGlmZSBhZnRlciBTV0lHPC9hPgotPGxpPiA8YSBocmVmPSIjbjQiPlRoZSBTV0lHIHBhY2thZ2U8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+QSBTV0lHIGV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNiI+QyBzeW50YXgsIGJ1dCBub3QgYSBDIGNvbXBpbGVyPC9hPgotPGxpPiA8YSBocmVmPSIjbjciPk5vbi1pbnRydXNpdmUgaW50ZXJmYWNlIGJ1aWxkaW5nPC9hPgotPGxpPiA8YSBocmVmPSIjbjgiPkhhbmRzIG9mZiBjb2RlIGdlbmVyYXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuOSI+RXZlbnQgZHJpdmVuIEMgcHJvZ3JhbW1pbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPkF1dG9tYXRpYyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTEiPlN1bW1hcnk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTIiPlNXSUcgZm9yIFdpbmRvd3MgYW5kIE1hY2ludG9zaDwvYT4KLTwvdWw+Ci0KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBXaGF0IGlzIFNXSUc/PC9oMj4KLVNXSUcgaXMgYSBjb2RlIGRldmVsb3BtZW50IHRvb2wgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBxdWlja2x5IGJ1aWxkIHBvd2VyZnVsIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2VzIHRvIEMsIEMrKywgb3IgT2JqZWN0aXZlLUMgcHJvZ3JhbXMuIEluIGEgbnV0c2hlbGwsIFNXSUcgaXMgYSBjb21waWxlciB0aGF0IHRha2VzIEMgZGVjbGFyYXRpb25zIGFuZCB0dXJucyB0aGVtIGludG8gdGhlICJnbHVlIiBuZWVkZWQgdG8gYWNjZXNzIHRoZW0gZnJvbSBjb21tb24gc2NyaXB0aW5nIGxhbmd1YWdlcyBpbmNsdWRpbmcgUGVybCwgUHl0aG9uLCBhbmQgVGNsLiBTV0lHIHVzdWFsbHkgcmVxdWlyZXMgbm8gbW9kaWZpY2F0aW9ucyB0byBleGlzdGluZyBDIGNvZGUgYW5kIGNhbiBvZnRlbiBiZSB1c2VkIHRvIGJ1aWxkIGEgd29ya2luZyBpbnRlcmZhY2UgaW4gYSBtYXR0ZXIgb2YgbWludXRlcy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBkbyBhIG51bWJlciBvZiBpbnRlcmVzdGluZyB0aGluZ3MgaW5jbHVkaW5nIDo8cD4KLTxwPgotPHVsPgotPGxpPkJ1aWxkaW5nIHBvd2VyZnVsIGludGVyZmFjZXMgdG8gZXhpc3RpbmcgQyBwcm9ncmFtcy4KLTxsaT5SYXBpZCBwcm90b3R5cGluZyBhbmQgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQuCi08bGk+SW50ZXJhY3RpdmUgZGVidWdnaW5nLgotPGxpPk1ha2luZyBhIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSAodXNpbmcgVGsgZm9yIGV4YW1wbGUpLgotPGxpPlBvd2VyZnVsIHRlc3Rpbmcgb2YgQyBsaWJyYXJpZXMgYW5kIHByb2dyYW1zICh1c2luZyBzY3JpcHRzKS4KLTxsaT5CdWlsZGluZyBoaWdoIHBlcmZvcm1hbmNlIEMgbW9kdWxlcyBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlcy4KLTxsaT5NYWtpbmcgQyBwcm9ncmFtbWluZyBtb3JlIGVuam95YWJsZSAob3IgdG9sZXJhYmxlIGRlcGVuZGluZyBvbiB5b3VyIHBvaW50IG9mIHZpZXcpCi08bGk+SW1wcmVzc2luZyB5b3VyIGZyaWVuZHMuCi08L3VsPgotPHA+Ci1UaGVyZSBhcmUgc29tZSBjb21wdXRlciBzY2llbnRpc3RzIHdobyBzZWVtIHRvIGJlbGlldmUgdGhhdCB0aGUgb25seSB3YXkgdG8gc29sdmUgY29tcGxpY2F0ZWQgcHJvYmxlbXMgaXMgdG8gY3JlYXRlIHNvZnR3YXJlIG9mIGVwaWMgcHJvcG9ydGlvbnMgYW5kIHRvIGhhdmUgc29tZSBzb3J0IG9mICJncmFuZCIgc29mdHdhcmUgZGVzaWduLiBVbmZvcnR1bmF0ZWx5IHRoaXMgc2VlbXMgdG8gbGVhZCB0byBzb2x1dGlvbnMgdGhhdCBhcmUgZXZlbiBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhlIG9yaWdpbmFsIHByb2JsZW0uIFRoaXMsIGluIHR1cm4gZW5hYmxlcyB0aGUgdXNlciB0byBmb3JnZXQgYWJvdXQgdGhlIG9yaWdpbmFsIHByb2JsZW0gYW5kIHNwZW5kIHRoZWlyIHRpbWUgY3Vyc2luZyBhdCB0aGVpciBtYWNoaW5lIChoZW5jZSwgdGhlIHRlcm0gImVuYWJsaW5nIHRlY2hub2xvZ3kiKS4gU1dJRywgb24gdGhlIG90aGVyIGhhbmQsIHdhcyBkZXZlbG9wZWQgYmVjYXVzZSBJIHdhcyBmZWQgdXAgd2l0aCBob3cgbXVjaCB0aW1lIEkgd2FzIHdhc3RpbmcgdHJ5aW5nIHRvIGRldmVsb3AgZmxleGlibGUgc2NpZW50aWZpYyBhcHBsaWNhdGlvbnMuIEkgd2FudGVkIGEgdG9vbCB0aGF0IHdvdWxkIGxldCBtZSB1c2Ugc2NyaXB0aW5nIGxhbmd1YWdlcyB0byBnbHVlIGRpZmZlcmVudCB0aGluZ3MgdG9nZXRoZXIsIGJ1dCBkaWRuJ3QgZ2V0IGluIHRoZSB3YXkgb2YgdGhlIHJlYWwgcHJvYmxlbXMgSSB3YXMgd29ya2luZyBvbi4gSSB3YW50ZWQgYSBzaW1wbGUgdG9vbCB0aGF0IHNjaWVudGlzdHMgYW5kIGVuZ2luZWVycyBjb3VsZCB1c2UgdG8gcHV0IHRvZ2V0aGVyIGFwcGxpY2F0aW9ucyBpbnZvbHZpbmcgbnVtYmVyIGNydW5jaGluZywgZGF0YSBhbmFseXNpcywgYW5kIHZpc3VhbGl6YXRpb24gd2l0aG91dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgdGVkaW91cyBzeXN0ZW1zIHByb2dyYW1taW5nLCBtYWtpbmcgc3Vic3RhbnRpYWwgbW9kaWZpY2F0aW9ucyB0byBleGlzdGluZyBjb2RlLCB0cnlpbmcgdG8gZmlndXJlIG91dCBhIGJpZyBtb25vbGl0aGljIGNvbXB1dGluZyAiZW52aXJvbm1lbnQsIiBvciBoYXZpbmcgdG8gZ2V0IGEgc2Vjb25kIGRlZ3JlZSBpbiBjb21wdXRlciBzY2llbmNlLiBJbiAgc2hvcnQsIEkgd2FudGVkIHRvIGhhdmUgYSB0b29sIHRoYXQgd291bGQgaW1wcm92ZSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCwgYnV0IHN0YXkgb3V0IG9mIHRoZSB3YXkgYXMgbXVjaCBhcyBwb3NzaWJsZS48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBMaWZlIGJlZm9yZSBTV0lHPC9oMj4KLVNXSUcgd2FzIGRldmVsb3BlZCB0byBtYWtlIG15IGxpZmUgZWFzaWVyIGFzIGEgQyBwcm9ncmFtbWVyLiBXaGlsZSBDIGlzIGdyZWF0IGZvciBoaWdoIHBlcmZvcm1hbmNlIGFuZCBzeXN0ZW1zIHByb2dyYW1taW5nLCB0cnlpbmcgdG8gbWFrZSBhbiBpbnRlcmFjdGl2ZSBhbmQgaGlnaGx5IGZsZXhpYmxlIEMgcHJvZ3JhbSBpcyBhIG5pZ2h0bWFyZSAoaW4gZmFjdCwgaXQncyBtdWNoIHdvcnNlIHRoYW4gdGhhdCkuIFRoZSByZWFsIHByb2JsZW0gaXMgdGhhdCBmb3IgZXZlcnkgQyBwcm9ncmFtIEkgd3JvdGUsIEkgbmVlZGVkIHRvIGhhdmUgc29tZSBzb3J0IG9mIGludGVyZmFjZSwgYnV0IGJlaW5nIG1vcmUgaW50ZXJlc3RlZCBpbiBvdGhlciBwcm9ibGVtcywgSSB3b3VsZCBhbHdheXMgZW5kIHVwIHdyaXRpbmcgYSByZWFsbHkgYmFkIGludGVyZmFjZSB0aGF0IHdhcyBoYXJkIHRvIGV4dGVuZCwgaGFyZCB0byBtb2RpZnksIGFuZCBoYXJkIHRvIHVzZS4gIEkgc3VwcG9zZSBJIGNvdWxkIGhhdmUgdHJpZWQgdG8gZG8gc29tZXRoaW5nIGZhbmN5IHVzaW5nIFgxMSwgYnV0IHdobyBoYXMgdGltZSB0byB3YXN0ZSB3ZWVrcyBvciBtb250aHMgdHJ5aW5nIHRvIGNvbWUgdXAgd2l0aCBhbiBpbnRlcmZhY2UgdGhhdCBpcyBwcm9iYWJseSBnb2luZyB0byBlbmQgdXAgYmVpbmcgbGFyZ2VyIHRoYW4gdGhlIG9yaWdpbmFsIEMgY29kZT8gVGhlcmUgYXJlIG1vcmUgaW50ZXJlc3RpbmcgcHJvYmxlbXMgdG8gd29yayBvbi48cD4KLTxwPgotVGhlIHJlYWwgcHJvYmxlbSwgcGVyaGFwcywgaXMgdGhhdCBtb3N0IEMgcHJvZ3JhbXMgZW5kIHVwIGJlaW5nIHN0cnVjdHVyZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5BIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuCi08bGk+QSA8dHQ+bWFpbigpPC90dD4gcHJvZ3JhbSB0aGF0IHN0YXJ0cyBldmVyeXRoaW5nIHVwLgotPGxpPkEgYnVuY2ggb2YgaGFja3MgYWRkZWQgdG8gbWFrZSBpdCB1c2FibGUuCi08L3VsPgotPHA+Ci1UaGUgPHR0Pm1haW4oKTwvdHQ+IHByb2dyYW0gbWF5IGJlIHdyaXR0ZW4gdG8gaGFuZGxlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgb3IgdG8gcmVhZCBkYXRhIGZyb20gPHR0PnN0ZGluPC90dD4sIGJ1dCBlaXRoZXIgd2F5LCBtb2RpZnlpbmcgb3IgZXh0ZW5kaW5nIHRoZSBwcm9ncmFtIHRvIGRvIHNvbWV0aGluZyBuZXcgcmVxdWlyZXMgY2hhbmdpbmcgdGhlIEMgY29kZSwgcmVjb21waWxpbmcsIGFuZCB0ZXN0aW5nLiBJZiB5b3UgbWFrZSBhIG1pc3Rha2UsIHlvdSBuZWVkIHRvIHJlcGVhdCB0aGlzIGN5Y2xlIHVudGlsIHRoaW5ncyB3b3JrLiBPZiBjb3Vyc2UsIGFzIG1vcmUgYW5kIG1vcmUgZmVhdHVyZXMgYXJlIGFkZGVkLCB5b3VyIEMgcHJvZ3JhbSB0dXJucyBpbnRvIGEgaGlkZW91cyB1bmludGVsbGlnaWJsZSBtZXNzIHRoYXQgaXMgZXZlbiBtb3JlIGRpZmZpY3VsdCB0byBtb2RpZnkgdGhhbiBpdCB3YXMgYmVmb3JlIChPZiBjb3Vyc2UsIGlmIHlvdSdyZSBsdWNreSwgeW91ciBwcm9qZWN0IHN0YXJ0cyBvdXQgYXMgYW4gdW5pbnRlbGxpZ2libGUgbWVzcykuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gTGlmZSBhZnRlciBTV0lHPC9oMj4KLVdpdGggU1dJRywgSSB3YXMgaG9waW5nIHRvIGF2b2lkIG1hbnkgb2YgdGhlIGhlYWRhY2hlcyBvZiB3b3JraW5nIHdpdGggQyBwcm9ncmFtcywgYnkgc3RydWN0dXJpbmcgdGhpbmdzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08dWw+Ci08bGk+QSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzLgotPGxpPkEgbmljZSBpbnRlcnByZXRlZCBpbnRlcmZhY2UgbGFuZ3VhZ2UgdGhhdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgZXZlcnl0aGluZy4KLTwvdWw+Ci08cD4KLVdpdGggdGhpcyBtb2RlbCwgeW91IGtlZXAgYWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHlvdXIgQyBwcm9ncmFtLCBidXQgYWNjZXNzIGl0IHRocm91Z2ggYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlIGluc3RlYWQgb2Ygd3JpdGluZyBtb3JlIEMgY29kZS4gVGhpcyBpcyBuaWNlIGJlY2F1c2UgeW91IGFyZSBnaXZlbiBmdWxsIGZyZWVkb20gdG8gY2FsbCBmdW5jdGlvbnMgaW4gYW55IG9yZGVyLCBhY2Nlc3MgdmFyaWFibGVzLCBhbmQgd3JpdGUgc2NyaXB0cyB0byBkbyBhbGwgc29ydHMgb2YgaW50ZXJlc3RpbmcgdGhpbmdzLiBJZiB5b3Ugd2FudCB0byBjaGFuZ2Ugc29tZXRoaW5nLCBqdXN0IG1vZGlmeSBhIHNjcmlwdCwgYW5kIHJlcnVuIGl0LiBJZiB5b3UncmUgdHJ5aW5nIHRvIGRlYnVnIGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMsIHlvdSBjYW4gY2FsbCB0aGVtIGluZGl2aWR1YWxseSBhbmQgc2VlIHdoYXQgdGhleSBkby4gSWYgeW91J3JlIHRyeWluZyB0byBidWlsZCBhIHBhY2thZ2Ugb3V0IG9mIHZhcmlvdXMgY29tcG9uZW50cywgeW91IGNhbiBqdXN0IGdsdWUgZXZlcnl0aGluZyB0b2dldGhlciB3aXRoIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGFuZCBoYXZlIGEgY29tbW9uIGludGVyZmFjZSB0byBhbGwgb2YgdGhlIHZhcmlvdXMgcGllY2VzLiA8cD4KLTxwPgotU1dJRyB0cmllcyB0byBtYWtlIHRoZSBpbnRlZ3JhdGlvbiBiZXR3ZWVuIHNjcmlwdGluZyBsYW5ndWFnZXMgYW5kIEMgYXMgcGFpbmxlc3MgYXMgcG9zc2libGUuIFRoaXMgYWxsb3dzIHlvdSB0byBmb2N1cyBvbiB0aGUgdW5kZXJseWluZyBDIHByb2dyYW0gYW5kIHVzaW5nIHRoZSBoaWdoLWxldmVsIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UsIGJ1dCBub3QgdGhlIHRlZGlvdXMgYW5kIGNvbXBsZXggY2hvcmUgb2YgbWFraW5nIHRoZSB0d28gbGFuZ3VhZ2VzIHRhbGsgdG8gZWFjaCBvdGhlci48cD4KLTxwPgotSSBsaWtlIHRoaXMgbW9kZWwgb2YgcHJvZ3JhbW1pbmcuIFdoaWxlIGl0J3MgY2VydGFpbmx5IG5vICJzaWx2ZXItYnVsbGV0IiwgaXQgaGFzIG1hZGUgcHJvZ3JhbW1pbmcgYWxvdCBtb3JlIGVuam95YWJsZSBhbmQgaGFzIGVuYWJsZWQgdXMgdG8gc29sdmUgY29tcGxpY2F0ZWQgcHJvYmxlbXMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gdW5uZWNjZXNzYXJpbHkgZGlmZmljdWx0IHVzaW5nIG9ubHkgQy48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBUaGUgU1dJRyBwYWNrYWdlPC9oMj4KLVNXSUcgaXMgYSBjb21waWxlciB0aGF0IHRha2VzIEFOU0kgQyBkZWNsYXJhdGlvbnMgYW5kIHR1cm5zIHRoZW0gaW50byBhIGZpbGUgY29udGFpbmluZyB0aGUgQyBjb2RlIGZvciBiaW5kaW5nIEMgZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGFuZCBjb25zdGFudHMgdG8gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKFNXSUcgYWxzbyBzdXBwb3J0cyBDKysgY2xhc3MgYW5kIE9iamVjdGl2ZS1DIGludGVyZmFjZSBkZWZpbml0aW9ucykuIElucHV0IGlzIHNwZWNpZmllZCBpbiB0aGUgZm9ybSBvZiBhbiAiaW50ZXJmYWNlIGZpbGUiIGNvbnRhaW5pbmcgZGVjbGFyYXRpb25zIChpbnB1dCBjYW4gYWxzbyBiZSBnaXZlbiBmcm9tIEMgc291cmNlIGZpbGVzIHByb3ZpZGVkIHRoZXkgYXJlIHN1ZmZpY2llbnRseSBjbGVhbikuIFRoZSBTV0lHIHBhcnNlciB0YWtlcyB0aGlzIGlucHV0IGZpbGUgYW5kIHBhc3NlcyBpdCBvbiB0byBhIGNvZGUgZ2VuZXJhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbiBtb2R1bGUuIFRoZXNlIG1vZHVsZXMgcHJvZHVjZSBhbiBpbnRlcmZhY2UgZm9yIGEgcGFydGljdWxhciBzY3JpcHRpbmcgbGFuZ3VhZ2UgYWxvbmcgd2l0aCBhIGRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIGludGVyZmFjZSB0aGF0IHdhcyBjcmVhdGVkLiBEaWZmZXJlbnQgc2NyaXB0aW5nIGxhbmd1YWdlcyBhcmUgc3VwcG9ydGVkIGJ5IHdyaXRpbmcgbmV3IGJhY2stZW5kIG1vZHVsZXMgdG8gdGhlIHN5c3RlbS48cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoMS4xLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBBIFNXSUcgZXhhbXBsZTwvaDI+Ci1UaGUgYmVzdCB3YXkgdG8gaWxsdXN0cmF0ZSBTV0lHIGlzIHdpdGggYSBzaW1wbGUgZXhhbXBsZS4gQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBDIGNvZGU6IDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBleGFtcGxlLmMgKi8KLQotZG91YmxlICBNeV92YXJpYWJsZSAgPSAzLjA7Ci0KLS8qIENvbXB1dGUgZmFjdG9yaWFsIG9mIG4gKi8KLWludCAgZmFjdChpbnQgbikgewotCWlmIChuICZsdDs9IDEpIHJldHVybiAxOwotCWVsc2UgcmV0dXJuIG4qZmFjdChuLTEpOwotfQotCi0vKiBDb21wdXRlIG4gbW9kIG0gKi8KLWludCBteV9tb2QoaW50IG4sIGludCBtKSB7Ci0JcmV0dXJuKG4gJSBtKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU3VwcG9zZSB0aGF0IHlvdSB3YW50ZWQgdG8gYWNjZXNzIHRoZXNlIGZ1bmN0aW9ucyBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSAgPHR0Pk15X3ZhcmlhYmxlPC90dD4gZnJvbSBUY2wuICBXZSBzdGFydCBieSBtYWtpbmcgYSBTV0lHIGludGVyZmFjZSBmaWxlIGFzIHNob3duIGJlbG93IChieSBjb252ZW50aW9uLCB0aGVzZSBmaWxlcyBjYXJyeSBhIC5pIHN1ZmZpeCkgOiAgPHA+Ci08YSBuYW1lPSJuMTMiPjwvYT48aDM+IFNXSUcgaW50ZXJmYWNlIGZpbGU8L2gzPgotPGJsb2NrcXVvdGU+PHByZT4KLS8qIEZpbGUgOiBleGFtcGxlLmkgKi8KLSVtb2R1bGUgZXhhbXBsZQotJXsKLS8qIFB1dCBoZWFkZXJzIGFuZCBvdGhlciBkZWNsYXJhdGlvbnMgaGVyZSAqLwotJX0KLQotZXh0ZXJuIGRvdWJsZSBNeV92YXJpYWJsZTsKLWV4dGVybiBpbnQgICAgZmFjdChpbnQpOwotZXh0ZXJuIGludCAgICBteV9tb2QoaW50IG4sIGludCBtKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIGludGVyZmFjZSBmaWxlIGNvbnRhaW5zIEFOU0kgQyBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuICBUaGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGJ5IFNXSUcuICAgVGhlIDx0dD4leywlfTwvdHQ+IGJsb2NrIHByb3ZpZGVzIGEgbG9jYXRpb24gZm9yIGluc2VydGluZyBhZGRpdGlvbmFsIGNvZGUgc3VjaCBhcyBDIGhlYWRlciBmaWxlcyBvciBhZGRpdGlvbmFsIEMgZnVuY3Rpb25zLiA8cD4KLTxhIG5hbWU9Im4xNCI+PC9hPjxoMz4gVGhlIHN3aWcgY29tbWFuZDwvaDM+Ci1TV0lHIGlzIGludm9rZWQgdXNpbmcgdGhlIDx0dD5zd2lnPC90dD4gY29tbWFuZC4gV2UgY2FuIHVzZSB0aGlzIHRvIGJ1aWxkIGEgVGNsIG1vZHVsZSAodW5kZXIgTGludXgpIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC10Y2wgZXhhbXBsZS5pCi1HZW5lcmF0aW5nIHdyYXBwZXJzIGZvciBUY2wuCi11bml4ICZndDsgZ2NjIC1jIC1mcGljIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZQotdW5peCAmZ3Q7IGdjYyAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvIAotdW5peCAmZ3Q7IHRjbHNoCi0lIGxvYWQgLi9leGFtcGxlLnNvCi0lIGZhY3QgNAotMjQKLSUgbXlfbW9kIDIzIDcKLTIKLSUgZXhwciAkTXlfdmFyaWFibGUgKyA0LjUKLTcuNQotJQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCTxwPgotVGhlIDx0dD5zd2lnPC90dD4gY29tbWFuZCBwcm9kdWNlZCBhIG5ldyBmaWxlIGNhbGxlZCA8dHQ+ZXhhbXBsZV93cmFwLmM8L3R0PiB0aGF0IHNob3VsZCBiZSBjb21waWxlZCBhbG9uZyB3aXRoIHRoZSA8dHQ+ZXhhbXBsZS5jPC90dD4gZmlsZS4gIE1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMgYW5kIHNjcmlwdGluZyBsYW5ndWFnZXMgbm93IHN1cHBvcnQgZHluYW1pYyBsb2FkaW5nIG9mIG1vZHVsZXMuICAgSW4gb3VyIGV4YW1wbGUsIG91ciBUY2wgbW9kdWxlIGhhcyBiZWVuIGNvbXBpbGVkIGludG8gYSBzaGFyZWQgbGlicmFyeSB0aGF0IGNhbiBiZSBsb2FkZWQgaW50byBUY2wgYW5kIHVzZWQuICAgV2hlbiBsb2FkZWQsIFRjbCB3aWxsIG5vdyBoYXZlIG91ciBuZXcgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYWRkZWQgdG8gaXQuICBUYWtpbmcgYSBjYXJlZnVsIGxvb2sgYXQgdGhlIGZpbGUgPHR0PmV4YW1wbGVfd3JhcC5jPC90dD4gcmV2ZWFscyBhIGhpZGVvdXMgbWVzcywgYnV0IGZvcnR1bmF0ZWx5IHlvdSBhbG1vc3QgbmV2ZXIgbmVlZCB0byB3b3JyeSBhYm91dCBpdC48cD4KLTxhIG5hbWU9Im4xNSI+PC9hPjxoMz4gQnVpbGRpbmcgYSBQZXJsNSBtb2R1bGU8L2gzPgotTm93LCBsZXQncyB0dXJuIHRoZXNlIGZ1bmN0aW9ucyBpbnRvIGEgUGVybDUgbW9kdWxlLiBXaXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcyB0eXBlIHRoZSBmb2xsb3dpbmcgKHNob3duIGZvciBTb2xhcmlzKTo8cD4KLTxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1wZXJsNSBleGFtcGxlLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFBlcmw1Ci11bml4ICZndDsgZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyBcCi0JLUkvdXNyL2xvY2FsL2xpYi9wZXJsNS9zdW40LXNvbGFyaXMvNS4wMDMvQ09SRQotdW5peCZndDsgbGQgLUcgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28gCQkJCQkJCQkjIFRoaXMgaXMgZm9yIFNvbGFyaXMKLXVuaXggJmd0OyBwZXJsNS4wMDMKLXVzZSBleGFtcGxlOwotcHJpbnQgZXhhbXBsZTo6ZmFjdCg0KSwgIlxuIjsKLXByaW50IGV4YW1wbGU6Om15X21vZCgyMyw3KSwgIlxuIjsKLXByaW50ICRleGFtcGxlOjpNeV92YXJpYWJsZSArIDQuNSwgIlxuIjsKLSZsdDtjdHJsLWQmZ3Q7Ci0yNAotMgotNy41Ci11bml4ICZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gQnVpbGRpbmcgYSBQeXRob24gbW9kdWxlPC9oMz4KLUZpbmFsbHksIGxldCdzIGJ1aWxkIGEgbW9kdWxlIGZvciBQeXRob24xLjQgKHNob3duIGZvciBJcml4KS48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgc3dpZyAtcHl0aG9uIGV4YW1wbGUuaQotR2VuZXJhdGluZyB3cmFwcGVycyBmb3IgUHl0aG9uCi11bml4ICZndDsgZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZS9weXRob24xLjQKLXVuaXggJmd0OyBsZCAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlbW9kdWxlLnNvICAgICAjIElyaXgKLXVuaXggJmd0OyBQeXRob24KLVB5dGhvbiAxLjQgKFNlcCAxMCAxOTk2KSAgW0dDQyAyLjcuMF0KLUNvcHlyaWdodCAxOTkxLTE5OTYgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtLAotQW1zdGVyZGFtCi0mZ3Q7Jmd0OyZndDsgaW1wb3J0IGV4YW1wbGUKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmZhY3QoNCkKLTI0Ci0mZ3Q7Jmd0OyZndDsgZXhhbXBsZS5teV9tb2QoMjMsNykKLTIKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmN2YXIuTXlfdmFyaWFibGUgKyA0LjUKLTcuNQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjE3Ij48L2E+PGgzPiBTaG9ydGN1dHM8L2gzPgotVG8gdGhlIHRydWx5IGxhenkgcHJvZ3JhbW1lciwgb25lIG1heSB3b25kZXIgd2h5IHdlIG5lZWRlZCB0aGUgZXh0cmEgaW50ZXJmYWNlIGZpbGUgYXQgYWxsLiBBcyBpdCB0dXJucyBvdXQsIHdlIGNhbiBvZnRlbiBkbyB3aXRob3V0IGl0LiBGb3IgZXhhbXBsZSwgd2UgY291bGQgYWxzbyBidWlsZCBhIFBlcmw1IG1vZHVsZSBieSBqdXN0IHJ1bm5pbmcgU1dJRyBvbiB0aGUgQyBzb3VyY2UgYW5kIHNwZWNpZnlpbmcgYSBtb2R1bGUgbmFtZSBhcyBmb2xsb3dzPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1wZXJsNSAtbW9kdWxlIGV4YW1wbGUgZXhhbXBsZS5jCi11bml4ICZndDsgZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyBcCi0JLUkvdXNyL2xvY2FsL2xpYi9wZXJsNS9zdW40LXNvbGFyaXMvNS4wMDMvQ09SRQotdW5peCZndDsgbGQgLUcgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28KLXVuaXggJmd0OyBwZXJsNS4wMDMKLXVzZSBleGFtcGxlOwotcHJpbnQgZXhhbXBsZTo6ZmFjdCg0KSwgIlxuIjsKLXByaW50IGV4YW1wbGU6Om15X21vZCgyMyw3KSwgIlxuIjsKLXByaW50ICRleGFtcGxlOjpNeV92YXJpYWJsZSArIDQuNSwgIlxuIjsKLSZsdDtjdHJsLWQmZ3Q7Ci0yNAotMgotNy41Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU9mIGNvdXJzZSwgdGhlcmUgYXJlIHNvbWUgcmVzdHJpY3Rpb25zIGFzIFNXSUcgaXMgbm90IGEgZnVsbCBDL0MrKyBwYXJzZXIuIElmIHlvdSBtYWtlIGhlYXZ5IHVzZSBvZiB0aGUgQyBwcmVwcm9jZXNzb3IsIGNvbXBsaWNhdGVkIGRlY2xhcmF0aW9ucywgb3IgQysrLCBnaXZpbmcgU1dJRyBhIHJhdyBzb3VyY2UgZmlsZSBwcm9iYWJseSBpc24ndCBnb2luZyB0byB3b3JrIHZlcnkgd2VsbCAoaW4gdGhpcyBjYXNlLCB5b3Ugd291bGQgcHJvYmFibHkgd2FudCB0byB1c2UgYSBzZXBhcmF0ZSBpbnRlcmZhY2UgZmlsZSkuIDxwPgotPHA+Ci1TV0lHIGFsc28gc3VwcG9ydHMgYSBsaW1pdGVkIGZvcm0gb2YgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uIElmIHdlIHdhbnRlZCB0byBtYWtlIGEgY29tYmluYXRpb24gU1dJRy9DIGhlYWRlciBmaWxlLCB3ZSBtaWdodCBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vKiBGaWxlIDogZXhhbXBsZS5oICovCi0jaWZkZWYgU1dJRwotJW1vZHVsZSBleGFtcGxlCi0laW5jbHVkZSB0Y2xzaC5pCi0jZW5kaWYKLWV4dGVybiBkb3VibGUgTXlfdmFyaWFibGU7Ci1leHRlcm4gaW50ICAgIGZhY3QoaW50KTsKLWV4dGVybiBpbnQgICAgbXlfbW9kKGludCBuLCBpbnQgbSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4xOCI+PC9hPjxoMz4gRG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uPC9oMz4KLUluIGFkZGl0aW9uIHRvIHByb2R1Y2luZyBhbiBpbnRlcmZhY2UsIFNXSUcgYWxzbyBwcm9kdWNlcyBkb2N1bWVudGF0aW9uLiBGb3Igb3VyIHNpbXBsZSBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlIG1heSBsb29rIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotZXhhbXBsZV93cmFwLmMKLQotWyBNb2R1bGUgOiBleGFtcGxlLCBQYWNrYWdlIDogZXhhbXBsZSBdCi0KLSRNeV92YXJpYWJsZQotICAgICAgICBbIEdsb2JhbCA6IGRvdWJsZSBNeV92YXJpYWJsZSBdCi0KLWZhY3Qobik7Ci0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLQotbXlfbW9kKG4sbSk7Ci0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLQotZ2V0X3RpbWUoKTsKLSAgICAgICAgWyByZXR1cm5zIGNoYXIgKiBdCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQyBjb21tZW50cyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgZGVzY3JpcHRpb25zLiBTV0lHIGNhbiBldmVuIGdyYWIgdGhlc2Ugb3V0IG9mIEMgc291cmNlIGZpbGVzIGluIGEgdmFyaWV0eSBvZiB3YXlzLiBGb3IgZXhhbXBsZSwgaWYgd2UgcHJvY2VzcyA8dHQ+ZXhhbXBsZS5jPC90dD4gYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtcGVybDUgLVNiZWZvcmUgLW1vZHVsZSBleGFtcGxlIGV4YW1wbGUuYwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XZSB3aWxsIGdldCBhIGRvY3VtZW50YXRpb24gZmlsZSB0aGF0IGxvb2tzIGxpa2UgdGhpcyAod2l0aCBvdXIgQyBjb21tZW50cyBhZGRlZCkgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWV4YW1wbGVfd3JhcC5jCi0KLVsgTW9kdWxlIDogZXhhbXBsZSwgUGFja2FnZSA6IGV4YW1wbGUgXQotCi0KLSRNeV92YXJpYWJsZQotICAgICAgICBbIEdsb2JhbCA6IGRvdWJsZSBNeV92YXJpYWJsZSBdCi0KLWZhY3Qobik7Ci0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLSAgICAgICAgQ29tcHV0ZSBmYWN0b3JpYWwgb2YgbiAKLQotbXlfbW9kKG4sbSk7Ci0gICAgICAgIFsgcmV0dXJucyBpbnQgIF0KLSAgICAgICAgQ29tcHV0ZSBuIG1vZCBtIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTkiPjwvYT48aDM+IEJ1aWxkaW5nIGxpYnJhcmllcyBhbmQgbW9kdWxlczwvaDM+Ci1JbiBhZGRpdGlvbiB0byBnZW5lcmF0aW5nIHdyYXBwZXIgY29kZSwgU1dJRyBwcm92aWRlcyBleHRlbnNpdmUgc3VwcG9ydCBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgZmlsZXMgYW5kIGJ1aWxkaW5nIGludGVyZmFjZSBsaWJyYXJpZXMuIEZvciBleGFtcGxlLCBvdXIgPHR0PmV4YW1wbGUuaTwvdHQ+IGZpbGUsIGNvdWxkIGJlIHVzZWQgaW4gYW5vdGhlciBpbnRlcmZhY2UgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBmb28KLSVpbmNsdWRlIGV4YW1wbGUuaSAgICAgICAgICAgICAvLyBHZXQgZGVmaW5pdGlvbnMgZnJvbSBleGFtcGxlLmkKLQotLi4uIE5vdyBtb3JlIGRlY2xhcmF0aW9ucyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gYSBsYXJnZSBzeXN0ZW0sIGFuIGludGVyZmFjZSBtaWdodCBiZSBidWlsdCBmcm9tIGEgdmFyaWV0eSBvZiBwaWVjZXMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHBhY2thZ2UKLQotJWluY2x1ZGUgbmV0d29yay5pCi0laW5jbHVkZSBmaWxlLmkKLSVpbmNsdWRlIGdyYXBoaWNzLmkKLSVpbmNsdWRlIG9iamVjdHMuaQotJWluY2x1ZGUgc2ltdWxhdGlvbi5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNXSUcgY29tZXMgd2l0aCBhIGxpYnJhcnkgb2YgZXhpc3RpbmcgZnVuY3Rpb25zIGtub3duIGFzIHRoZSBTV0lHIGxpYnJhcnkuICBUaGUgbGlicmFyeSBjb250YWlucyBhIG1peCBvZiBsYW5ndWFnZSBpbmRlcGVuZGVudCBhbmQgbGFuZ3VhZ2UgZGVwZW5kZW50IGZ1bmN0aW9uYWxpdHkuICAgRm9yIGV4YW1wbGUsIHRoZSBmaWxlIGA8dHQ+YXJyYXkuaTwvdHQ+JyBwcm92aWRlcyBhY2Nlc3MgdG8gQyBhcnJheXMgd2hpbGUgdGhlIGZpbGUgYDx0dD53aXNoLmk8L3R0PicgaW5jbHVkZXMgc3BlY2lhbGl6ZWQgY29kZSBmb3IgcmVidWlsZGluZyB0aGUgVGNsIHdpc2ggaW50ZXJwcmV0ZXIuICAgVXNpbmcgdGhlIGxpYnJhcnksIHlvdSBjYW4gdXNlIGV4aXN0aW5nIG1vZHVsZXMgdG8gYnVpbGQgdXAgeW91ciBvd24gcGVyc29uYWxpemVkIGVudmlyb25tZW50IGZvciBidWlsZGluZyBpbnRlcmZhY2VzLiAgIElmIGNoYW5nZXMgYXJlIG1hZGUgdG8gYW55IG9mIHRoZSBjb21wb25lbnRzLCB0aGV5IHdpbGwgYXBwZWFyIGF1dG9tYXRpY2FsbHkgdGhlIG5leHQgdGltZSBTV0lHIGlzIHJ1bi4gPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMj4gQyBzeW50YXgsIGJ1dCBub3QgYSBDIGNvbXBpbGVyPC9oMj4KLVNXSUcgdXNlcyBBTlNJIEMgc3ludGF4LCBidXQgaXMgbm90IGEgZnVsbCBBTlNJIEMgY29tcGlsZXIuIEJ5IHVzaW5nIEMgc3ludGF4LCBJIGhvcGUgdG8gbWFrZSBTV0lHIGVhc3kgdG8gdXNlIHdpdGggbW9zdCBDIHByb2dyYW1zLCBlYXN5IHRvIGxlYXJuLCBhbmQgZWFzeSB0byByZW1lbWJlci4gT3RoZXIgdG9vbHMgdGVuZCB0byB1c2UgYSBwcmVjaXNlIGludGVyZmFjZSBkZWZpbml0aW9uIGxhbmd1YWdlLCBidXQgSSBwZXJzb25hbGx5IGZpbmQgdGhpcyBhcHByb2FjaCB0byBiZSBwYWluZnVsLiBXaGVuIEkgd2FudCB0byBidWlsZCBhbiBpbnRlcmZhY2UgdG8gYSBjb2xsZWN0aW9uIG9mIHNldmVyYWwgaHVuZHJlZCBDIGZ1bmN0aW9ucywgSSBkb24ndCBuZWNlc3NhcmlseSB3YW50IHRvIHdyaXRlIGEgc3BlY2lhbCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgZWFjaCBvbmUuIE5vciBkbyBJIHdhbnQgdG8gaGF2ZSB0byBnbyBkaWcgdXAgdGhlIG1hbnVhbCBiZWNhdXNlIEkgY2FuJ3QgcmVtZW1iZXIgdGhlIHN5bnRheC48cD4KLTxwPgotT24gdGhlIG90aGVyIGhhbmQsIHVzaW5nIEMgc3ludGF4IGNhbiBiZSBhbWJpZ3VvdXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBmb28oZG91YmxlICphKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2UgZG9uJ3QgcmVhbGx5IGtub3cgaWYgPHR0PmE8L3R0PiBpcyBhbiBhcnJheSBvZiBzb21lIGZpeGVkIHNpemUsIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGJsb2NrIG9mIG1lbW9yeSwgYSBzaW5nbGUgdmFsdWUsIG9yIGFuIG91dHB1dCB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uIEZvciB0aGUgbW9zdCBwYXJ0LCBTV0lHIHRha2VzIGEgbGl0ZXJhbCBhcHByb2FjaCAoPHR0PmE8L3R0PiBpcyBvYnZpb3VzbHkgYSA8dHQ+ZG91YmxlICo8L3R0PikgYW5kIGxlYXZlcyBpdCB1cCB0byB0aGUgdXNlciB0byB1c2UgdGhlIGZ1bmN0aW9uIGluIGEgY29ycmVjdCBtYW5uZXIuICBGb3J0dW5hdGVseSwgdGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBoZWxwIFNXSUcgb3V0IHVzaW5nIGFkZGl0aW9uYWwgZGlyZWN0aXZlcyBhbmQgImhlbHBlciIgZnVuY3Rpb25zLiBUaHVzLCB0aGUgaW5wdXQgdG8gU1dJRyBpcyBvZnRlbiBhIG1peCBvZiBDIGRlY2xhcmF0aW9ucywgc3BlY2lhbCBkaXJlY3RpdmVzIGFuZCBoaW50cy4gICBMaWtlIFBlcmwgcHJvZ3JhbW1pbmcsIHRoZXJlIGlzIGFsbW9zdCBhbHdheXMgbW9yZSB0aGFuIG9uZSB3YXkgdG8gZG8gYWxtb3N0IGFueXRoaW5nLjxwPgotPHA+Ci1TV0lHIGRvZXMgbm90IGN1cnJlbnRseSBwYXJzZSBldmVyeSBjb25jZWl2YWJsZSB0eXBlIG9mIEMgZGVjbGFyYXRpb24gdGhhdCBpdCBtaWdodCBlbmNvdW50ZXIgaW4gYSBDL0MrKyBmaWxlLiBNYW55IHRoaW5ncyBtYXkgYmUgZGlmZmljdWx0IG9yIGltcG9zc2libGUgdG8gaW50ZWdyYXRlIHdpdGggYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKEMrKyB0ZW1wbGF0ZXMgZm9yIGV4YW1wbGUpLiBUaHVzLCBTV0lHIG1heSBub3QgcmVjb2duaXplIGFkdmFuY2VkIEMvQysrIGNvbnN0cnVjdHMuICBJIG1ha2Ugbm8gYXBvbG9naWVzIGZvciB0aGlzLS1TV0lHIHdhcyBkZXNpZ25lZCB0byBhY2Nlc3MgQywgYnV0IHdhcyBuZXZlciBpbnRlbmRlZCB0byBtYWdpY2FsbHkgdHVybiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGludG8gc29tZSBzb3J0IG9mIGJpemFycmUgQysrIGludGVycHJldGVyLiAgIE9mIGNvdXJzZSwgU1dJRydzIHBhcnNlciBpcyBhbHdheXMgYmVpbmcgaW1wcm92ZWQgc28gY3VycmVudGx5IHVuc3VwcG9ydGVkIGZlYXR1cmVzIG1heSBiZSBzdXBwb3J0ZWQgaW4gbGF0ZXIgcmVsZWFzZXMuPHA+Ci08YSBuYW1lPSJuNyI+PC9hPjxoMj4gTm9uLWludHJ1c2l2ZSBpbnRlcmZhY2UgYnVpbGRpbmc8L2gyPgotV2hlbiB1c2VkIGFzIEkgaW50ZW5kZWQsIFNXSUcgcmVxdWlyZXMgbWluaW1hbCBtb2RpZmljYXRpb24gdG8gZXhpc3RpbmcgQyBjb2RlLiBUaGlzIG1ha2VzIFNXSUcgZXh0cmVtZWx5IGVhc3kgdG8gdXNlIHdpdGggZXhpc3RpbmcgcGFja2FnZXMsIGJ1dCBhbHNvIHByb21vdGVzIHNvZnR3YXJlIHJldXNlIGFuZCBtb2R1bGFyaXR5LiBCeSBtYWtpbmcgdGhlIEMgY29kZSBpbmRlcGVuZGVudCBvZiB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UsIHlvdSBjYW4gY2hhbmdlIHRoZSBpbnRlcmZhY2UgYW5kIHJldXNlIHRoZSBjb2RlIGluIG90aGVyIGFwcGxpY2F0aW9ucy4gSW4gYSBzaW1pbGFyIHNwaXJpdCwgSSBkb24ndCBiZWxpZXZlIHRoYXQgdGhlcmUgaXMgYW55IG9uZSAiYmVzdCIgc2NyaXB0aW5nIGxhbmd1YWdlLS11c2Ugd2hpY2hldmVyIG9uZSB5b3UgbGlrZSAodGhleSdyZSBhbGwgcHJldHR5IGdvb2QpLiBUaGVyZSdzIG5vIHJlYWwgcmVhc29uIHdoeSBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gY291bGRuJ3Qgc3VwcG9ydCBtdWx0aXBsZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcyB0byBzZXJ2ZSBkaWZmZXJlbnQgbmVlZHMgKG9yIHRvIGhhdmUgbm8gc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZSBhdCBhbGwpLjxwPgotPGEgbmFtZT0ibjgiPjwvYT48aDI+IEhhbmRzIG9mZiBjb2RlIGdlbmVyYXRpb248L2gyPgotU1dJRyBpcyBkZXNpZ25lZCB0byBwcm9kdWNlIHdvcmtpbmcgY29kZSB0aGF0IG5lZWRzIG5vIGhhbmQtbW9kaWZpY2F0aW9uIChpbiBmYWN0LCBpZiB5b3UgbG9vayBhdCB0aGUgb3V0cHV0LCB5b3UgcHJvYmFibHkgd29uJ3Qgd2FudCB0byBtb2RpZnkgaXQpLiBJZGVhbGx5LCBTV0lHIHNob3VsZCBiZSBpbnZva2VkIGF1dG9tYXRpY2FsbHkgaW5zaWRlIGEgTWFrZWZpbGUganVzdCBhcyBvbmUgd291bGQgY2FsbCB0aGUgQyBjb21waWxlci4gWW91IHNob3VsZCB0aGluayBvZiB5b3VyIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UgYmVpbmcgZGVmaW5lZCBlbnRpcmVseSBieSB0aGUgaW5wdXQgdG8gU1dJRywgbm90IHRoZSByZXN1bHRpbmcgb3V0cHV0IGZpbGUuIFdoaWxlIHRoaXMgYXBwcm9hY2ggbWF5IGxpbWl0IGZsZXhpYmlsaXR5IGZvciBoYXJkLWNvcmUgaGFja2VycywgaXQgYWxsb3dzIG90aGVycyB0byBmb3JnZXQgYWJvdXQgdGhlIGxvdy1sZXZlbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBUaGlzIGlzIG15IGdvYWwuPHA+Ci08YSBuYW1lPSJuOSI+PC9hPjxoMj4gRXZlbnQgZHJpdmVuIEMgcHJvZ3JhbW1pbmc8L2gyPgotQnkgYWRkaW5nIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZSB0byBhIHByb2dyYW0sIFNXSUcgZW5jb3VyYWdlcyBhbiBldmVudC1kcml2ZW4gc3R5bGUgb2YgcHJvZ3JhbW1pbmcgKGFsdGhvdWdoIGl0IG1heSBub3QgYmUgaW1tZWRpYXRlbHkgb2J2aW91cykuIEFuIGV2ZW50IGRyaXZlbiBwcm9ncmFtIGJhc2ljYWxseSBjb25zaXN0cyBvZiBhIGxhcmdlLWNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIChjYWxsZWQgY2FsbGJhY2sgZnVuY3Rpb25zKSwgYW5kIGFuIGluZmluaXRlIGxvb3AgdGhhdCBqdXN0IHNpdHMgYW5kIHdhaXRzIGZvciB0aGUgdXNlciB0byBkbyBzb21ldGhpbmcuIFdoZW4gdGhlIHVzZXIgZG9lcyBzb21ldGhpbmcgbGlrZSB0eXBlIGEgY29tbWFuZCwgaGl0IGEga2V5LCBvciBtb3ZlIHRoZSBtb3VzZSB0aGUgcHJvZ3JhbSB3aWxsIGNhbGwgYSBmdW5jdGlvbiB0byBwZXJmb3JtIGFuIG9wZXJhdGlvbi0tdGhpcyBpcyBhbiBldmVudC4gT2YgY291cnNlLCB1bmxlc3MgeW91J3ZlIGJlZW4gbGl2aW5nIGluIGNhdmUgZm9yIHRoZSBsYXN0IDIwIHllYXJzLCB5b3UndmUgdXNlZCB0aGlzIGtpbmQgb2YgYXBwcm9hY2ggd2hlbiBydW5uaW5nIGFueSBzb3J0IG9mIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZS48cD4KLTxwPgotV2hpbGUgeW91IG1heSBub3QgYmUgdXNpbmcgU1dJRyB0byBkZXZlbG9wIGEgR1VJLCB0aGUgdW5kZXJseWluZyBjb25jZXB0IGlzIHRoZSBzYW1lLiBUaGUgc2NyaXB0aW5nIGxhbmd1YWdlIGFjdHMgYXMgYW4gZXZlbnQtbG9vcCB3YWl0aW5nIGZvciB5b3UgdG8gaXNzdWUgY29tbWFuZHMuIFVubGlrZSBhIHRyYWRpdGlvbmFsIEMgYXBwbGljYXRpb24gKHRoYXQgbWF5IHVzZSBjb21tYW5kIGxpbmUgb3B0aW9ucyksIHRoZXJlIGlzIG5vIGxvbmdlciBhIGZpeGVkIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMuIEZ1bmN0aW9ucyBtYXkgYmUgaXNzdWVkIGluIGFueSBvcmRlciBhbmQgYXQgYW55IHRpbWUuIE9mIGNvdXJzZSwgdGhpcyBmbGV4aWJpbGl0eSBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudCEgPHA+Ci08cD4KLUhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGluZ3MgdG8ga2VlcCBpbiBtaW5kIHdoZW4gZGV2ZWxvcGluZyBhbiBhcHBsaWNhdGlvbiB3aXRoIFNXSUcgOjxwPgotPHA+Ci08dWw+Ci08bGk+RnVuY3Rpb25zIG1heSBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYW5kIGluIGFueSBvcmRlci4gSXQgaXMgYWx3YXlzIGEgZ29vZCBpZGVhIGZvciBmdW5jdGlvbnMgdG8gY2hlY2sgdGhlaXIgYXJndW1lbnRzIGFuZCBpbnRlcm5hbCBzdGF0ZSB0byBzZWUgaWYgaXQncyBsZWdhbCB0byBwcm9jZWVkIChOb3QgZG9pbmcgc28gdXN1YWxseSByZXN1bHRzIGluIG15c3RlcmlvdXMgY3Jhc2hlcyBsYXRlciBvbikuCi08bGk+Q29kZSBzaG91bGQgYmUgc3RydWN0dXJlZCBhcyBhIGNvbGxlY3Rpb24gb2YgaW5kZXBlbmRlbnQgbW9kdWxlcywgbm90IGEgaHVnZSBtZXNzIG9mIGludGVycmVsYXRlZCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyAoaWUuIHNwYWdoZXR0aSBjb2RlKS4KLTxsaT5HbG9iYWwgdmFyaWFibGVzIHNob3VsZCBiZSB1c2VkIHdpdGggY2FyZS4KLTxsaT5DYXJlZnVsIGF0dGVudGlvbiB0byB0aGUgbmFtaW5nIG9mIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIG1heSBiZSByZXF1aXJlZCB0byBhdm9pZCBuYW1lc3BhY2UgY29uZmxpY3RzIHdoZW4gY29tYmluaW5nIHBhY2thZ2VzLgotPC91bD4KLTxwPgotV2hpbGUgaXQgbWF5IGJlIGhhcmQgKG9yIGltcG9zc2libGUpIHRvIGFkZHJlc3MgYWxsIHRoZXNlIHByb2JsZW1zIGluIGEgbGVnYWN5IGNvZGUsIEkgYmVsaWV2ZSB0aGF0IHVzaW5nIFNXSUcgZW5jb3VyYWdlcyBhbGwgb2YgdGhlIGFib3ZlIHF1YWxpdGllcyB3aGVuIGRldmVsb3BpbmcgbmV3IGFwcGxpY2F0aW9ucy4gVGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdCBpcyBtb3JlIHJlbGlhYmxlLCBtb3JlIG1vZHVsYXIsIGFuZCBlYXNpZXIgdG8gaW50ZWdyYXRlIGludG8gbGFyZ2VyIHBhY2thZ2VzLiAgQnkgcHJvdmlkaW5nIGEgbm9uLWludHJ1c2l2ZSwgZWFzeSB0byB1c2UgdG9vbCwgaXQgaXMgcG9zc2libGUgdG8gZGV2ZWxvcCBoaWdobHkgcmVsaWFibGUgZXZlbnQtZHJpdmVuIGNvZGUgZnJvbSB0aGUgc3RhcnQtLW5vdCBhcyBhIGhhY2sgdG8gYmUgYWRkZWQgbGF0ZXIuIEFzIGEgZmluYWwgc2FsZXMgcGl0Y2gsIGluIHRoZSBpbml0aWFsIGFwcGxpY2F0aW9uIGZvciB3aGljaCBTV0lHIHdhcyBkZXZlbG9wZWQsIGNvZGUgcmVsaWFiaWxpdHkgYW5kIGZsZXhpYmlsaXR5IGhhcyBpbmNyZWFzZWQgc3Vic3RhbnRpYWxseSB3aGlsZSBjb2RlIHNpemUgaGFzIGRlY3JlYXNlZCBieSBtb3JlIHRoYW4gMjUlLiBJIGJlbGlldmUgdGhpcyBpcyBhIGdvb2QgdGhpbmcuPHA+Ci08YSBuYW1lPSJuMTAiPjwvYT48aDI+IEF1dG9tYXRpYyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb248L2gyPgotU1dJRyBtYWtlcyBpdCB2ZXJ5IGVhc3kgdG8gYnVpbGQgbGFyZ2UgaW50ZXJhY3RpdmUgQyBwcm9ncmFtcywgYnV0IGl0IGNhbiBzb21ldGltZXMgYmUgaGFyZCB0byByZW1lbWJlciB3aGF0IEMgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGhvdyB0aGV5IGFyZSBjYWxsZWQgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFRvIGFkZHJlc3MgdGhpcyBwcm9ibGVtLCBTV0lHIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGEgZG9jdW1lbnRhdGlvbiBmaWxlIGluIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBmb3JtYXRzLiBDIGNvbW1lbnRzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBkZXNjcmlwdGlvbnMgb2YgZWFjaCBmdW5jdGlvbiwgYW5kIGRvY3VtZW50YXRpb24gY2FuIGJlIGdyb3VwZWQgaW50byBhIGhpZXJhcmNoeSBvZiBzZWN0aW9ucyBhbmQgc3Vic2VjdGlvbnMuIFRoZSBkb2N1bWVudGF0aW9uIGZpbGUgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIHJlYXNvbmFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFdoaWxlIGl0J3Mgbm8gY29tcGV0aXRpb24gZm9yIGEgZnVsbC1ibG93biBDIGNvZGUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IsIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBjYW4gZG8gYSByZWFzb25hYmxlIGpvYiBvZiBkb2N1bWVudGluZyBhbiBpbnRlcmZhY2UuPHA+Ci08YSBuYW1lPSJuMTEiPjwvYT48aDI+IFN1bW1hcnk8L2gyPgotQXQgdGhpcyBwb2ludCwgeW91IGtub3cgYWJvdXQgOTUlIG9mIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdyB0byBzdGFydCB1c2luZyBTV0lHLiBGaXJzdCwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZCB1c2luZyBBTlNJIEMsIEMrKywgb3IgT2JqZWN0aXZlLUMgc3ludGF4LiBUaGVzZSBtYXkgYXBwZWFyIGluIGEgc2VwYXJhdGUgaW50ZXJmYWNlIGZpbGUgb3IgeW91IGNhbiB1c2UgYSBDIHNvdXJjZSBmaWxlIChpZiBpdCBpcyBzdWZmaWNpZW50bHkgY2xlYW4pLiBTV0lHIHJlcXVpcmVzIG5vIG1vZGlmaWNhdGlvbnMgdG8gZXhpc3RpbmcgQyBjb2RlIHNvIGl0J3MgZWFzeSB0byBnZXQgc3RhcnRlZC4gVG8gYnVpbGQgYSBtb2R1bGUsIHVzZSB0aGUgPHR0PnN3aWc8L3R0PiBjb21tYW5kIHdpdGggYW4gYXBwcm9wcmlhdGUgdGFyZ2V0IGxhbmd1YWdlIG9wdGlvbi4gVGhpcyBnZW5lcmF0ZXMgYSBDIGZpbGUgdGhhdCB5b3UgbmVlZCB0byBjb21waWxlIHdpdGggdGhlIHJlc3Qgb2YgeW91ciBjb2RlIGFuZCB5b3UncmUgcmVhZHkgdG8gZ28uIDxwPgotPHA+Ci1JIGRvbid0IGNvbnNpZGVyIHRoZXJlIHRvIGJlIGEgInJpZ2h0IiBvciAid3JvbmciIHdheSB0byB1c2UgU1dJRywgYWx0aG91Z2ggSSBwZXJzb25hbGx5IHVzZSBzZXBhcmF0ZSBpbnRlcmZhY2UgZmlsZXMgZm9yIGEgdmFyaWV0eSBvZiByZWFzb25zIDo8cD4KLTxwPgotPHVsPgotPGxpPkl0IGhlbHBzIGtlZXAgbWUgb3JnYW5pemVkLgotPGxpPkl0J3MgdXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIHdyYXAgZXZlcnkgc2luZ2xlIEMgZnVuY3Rpb24gaW4gYSBwcm9ncmFtLgotPGxpPlNXSUcgcHJvdmlkZXMgYSBudW1iZXIgb2YgZGlyZWN0aXZlcyB0aGF0IEkgdGVuZCB0byB1c2UgYWxvdC4KLTxsaT5IYXZpbmcgYSBzcGVjaWFsIGludGVyZmFjZSBmaWxlIG1ha2VzIGl0IGNsZWFyIHdoZXJlIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlIGlzIGRlZmluZWQuIElmIHlvdSBkZWNpZGUgdG8gY2hhbmdlIHNvbWV0aGluZyBpbiB0aGUgaW50ZXJmYWNlLCBpdCdzIGVhc3kgdG8gdHJhY2sgZG93biBpZiB5b3UgaGF2ZSBzcGVjaWFsIGZpbGUuIAotPC91bD4KLTxwPgotT2YgY291cnNlLCB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuIDxwPgotPGEgbmFtZT0ibjEyIj48L2E+PGgyPiBTV0lHIGZvciBXaW5kb3dzIGFuZCBNYWNpbnRvc2g8L2gyPgotU1dJRyBoYXMgYmVlbiBwcmltYXJpbHkgZGV2ZWxvcGVkIGFuZCBkZXNpZ25lZCB0byB3b3JrIHdpdGggVW5peC1iYXNlZCBhcHBsaWNhdGlvbnMuIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IFNXSUcgYXJlIGF2YWlsYWJsZSBvbiBhIHZhcmlldHkgb2Ygb3RoZXIgcGxhdGZvcm1zIGluY2x1ZGluZyBXaW5kb3dzIDk1L05UIGFuZCBNYWNpbnRvc2guIFNXSUcgZ2VuZXJhdGVkIGNvZGUgaXMgbW9zdGx5IGNvbXBhdGlibGUgd2l0aCB0aGVzZSB2ZXJzaW9ucyAoYW5kIFNXSUcgaXRzZWxmIGNhbiBub3cgcnVuIG9uIHRoZXNlIHBsYXRmb3JtcykuIDxwPgotPGEgbmFtZT0ibjIwIj48L2E+PGgzPiBTV0lHIG9uIFdpbmRvd3MgOTUvTlQ8L2gzPgotVGhlIFdpbmRvd3MgOTUvTlQgcG9ydCBvZiBTV0lHIChwcm92aWRlZCBieSBLZXZpbiBCdXRsZXIpLCBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCB0cmFuc2xhdGlvbiBvZiB0aGUgVW5peCB2ZXJzaW9uLiBBdCB0aGlzIHRpbWUgaXQgaXMgb25seSBrbm93biB0byB3b3JrIHdpdGggTWljcm9zb2Z0IFZpc3VhbCBDKysgNC54LCBidXQgdGhlcmUgaXMgbm90aGluZyB0byBwcmV2ZW50IGl0cyB1c2Ugd2l0aCBvdGhlciBjb21waWxlcnMgKGF0IGxlYXN0IG5vdCB0aGF0IEknbSBhd2FyZSBvZikuIFNXSUcgc2hvdWxkIGJlIGludm9rZWQgZnJvbSB0aGUgTVMtRE9TIHByb21wdCBpbiBleGFjdGx5IHRoZSBzYW1lIG1hbm5lciBhcyBpbiBVbml4LiBTV0lHIGNhbiBhbHNvIGJlIHVzZWQgaW4gTk1BS0UgYnVpbGQgZmlsZXMgYW5kIGFkZGVkIHRvIFZpc3VhbCBDKysgcHJvamVjdHMgdW5kZXIgdGhlIGN1c3RvbSBidWlsZCBzZXR0aW5nLiBBcyBvZiB0aGlzIHdyaXRpbmcsIFNXSUcgaXMga25vd24gdG8gd29yayB3aXRoIFdpbmRvd3MgdmVyc2lvbnMgb2YgVGNsL1RrLCBQeXRob24sIGFuZCBQZXJsIChpbmNsdWRpbmcgdGhlIEFjdGl2ZVdhcmUgUGVybCBmb3IgV2luMzIgcG9ydCkuIFNXSUcgbWFrZXMgZXh0ZW5zaXZlIHVzZSBvZiBsb25nIGZpbGVuYW1lcywgc28gaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgU1dJRyBjb21waWxlciB3aWxsIG9wZXJhdGUgY29ycmVjdGx5IHVuZGVyIFdpbmRvd3MgMy4xIG9yIERPUyAodGhlIHdyYXBwZXIgY29kZSBnZW5lcmF0ZWQgYnkgU1dJRyBtYXkgY29tcGlsZSBob3dldmVyKS48cD4KLTxhIG5hbWU9Im4yMSI+PC9hPjxoMz4gU1dJRyBvbiB0aGUgUG93ZXIgTWFjaW50b3NoPC9oMz4KLUEgTWFjaW50b3NoIHBvcnQgb2YgU1dJRyBpcyBhbHNvIGF2YWlsYWJsZSwgYnV0IGlzIGhpZ2hseSBleHBlcmltZW50YWwgYXQgdGhpcyB0aW1lLiBJdCBvbmx5IHdvcmtzIG9uIFBvd2VyUEMgYmFzZWQgTWFjaW50b3NoIHN5c3RlbXMgcnVubmluZyBTeXN0ZW0gNyBvciBsYXRlci4gTW9kdWxlcyBjYW4gYmUgY29tcGlsZWQgd2l0aCB0aGUgTWV0cm93ZXJrcyBDb2RlIFdhcnJpb3IgY29tcGlsZXIsIGJ1dCBzdXBwb3J0IGZvciBvdGhlciBjb21waWxlcnMgaXMgdW5rbm93bi4gRHVlIHRvIHRoZSBsYWNrIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zIG9uIHRoZSBNYWMsIFNXSUcgaGFzIGJlZW4gcGFja2FnZWQgaW4gYSBUY2wvVGsgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHZhcmlvdXMgc2V0dGluZ3MgYW5kIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGJlIHNwZWNpZmllZCB3aXRoIGEgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlLiBVbmRlcm5lYXRoIHRoZSBob29kLCBTV0lHIGlzIGlkZW50aWNhbCB0byB0aGUgVW5peC9XaW5kb3dzIHZlcnNpb24uIEl0IHJlY29nbml6ZXMgdGhlIHNhbWUgc2V0IG9mIG9wdGlvbnMgYW5kIGdlbmVyYXRlcyBpZGVudGljYWwgY29kZS4gQW55IFNXSUcgY29tbWFuZCBsaW5lIG9wdGlvbiBsaXN0ZWQgaW4gdGhpcyBtYW51YWwgY2FuIGJlIGdpdmVuIHRvIHRoZSBNYWMgdmVyc2lvbiB1bmRlciAiQWR2YW5jZWQgT3B0aW9ucyIgc2hvd24gaW4gdGhlIGZpZ3VyZS4gQXQgdGhpcyB3cml0aW5nLCBTV0lHIGlzIG9ubHkga25vd24gdG8gc3VwcG9ydCBNYWMgdmVyc2lvbnMgb2YgVGNsL1RrLiBXb3JrIG9uIE1hY2ludG9zaCB2ZXJzaW9ucyBvZiBQeXRob24gYW5kIFBlcmwgaXMgdW5kZXJ3YXkuPHA+Ci08cD5DbGljayA8YSBocmVmPSJjaDEuMi5wbmciPmhlcmU8L2E+IHRvIHNlZSBhIE1hY2ludG9zaCBzY3JlZW4gc2hvdC48cD4KLTxwPgotPHA+Ci08YSBuYW1lPSJuMjIiPjwvYT48aDM+IENyb3NzIHBsYXRmb3JtIHdvZXM8L2gzPgotV2hpbGUgU1dJRyBhbmQgdmFyaW91cyBmcmVlbHkgYXZhaWxhYmxlIHNjcmlwdGluZyBsYW5ndWFnZXMgYXJlIHN1cHBvcnRlZCBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zLCBkZXZlbG9waW5nIGNyb3NzIHBsYXRmb3JtIGFwcGxpY2F0aW9ucyB3aXRoIHRoZXNlIHRvb2xzIGlzIHN0aWxsIGltbWF0dXJlIGFuZCBmaWxsZWQgd2l0aCBwaXRmYWxscy4gSW4gZmFjdCwgaXQncyBwcm9iYWJseSBvbmx5IHJlY29tbWVuZGVkIGZvciB0cnVlIG1hc29jaGlzdHMuIERlc3BpdGUgdGhpcywgaXQncyBpbnRlcmVzdGluZyB0byB0aGluayBhYm91dCB1c2luZyBmcmVlbHkgYXZhaWxhYmxlIHRvb2xzIHRvIHByb3ZpZGUgY29tbW9uIGludGVyZmFjZXMgdG8gQy9DKysgY29kZS4gSSBiZWxpZXZlIHRoYXQgU1dJRyBtYXkgaGVscCwgYnV0IGl0IGlzIGJ5IG5vIG1lYW5zIGEgY3Jvc3MtcGxhdGZvcm0gc29sdXRpb24gYnkgaXRzZWxmLiA8cD4KLTxhIG5hbWU9Im4yMyI+PC9hPjxoMz4gSG93IHRvIHN1cnZpdmUgdGhpcyBtYW51YWw8L2gzPgotVGhpcyBtYW51YWwgd2FzIHdyaXR0ZW4gdG8gc3VwcG9ydCB0aGUgVW5peCB2ZXJzaW9uIG9mIFNXSUcuIEhvd2V2ZXIsIGFsbCBvZiB0aGUgbWFpbiBjb25jZXB0cyBhbmQgdXNhZ2Ugb2YgU1dJRyBhbHNvIGFwcGx5IHRvIHRoZSBXaW5kb3dzIGFuZCBNYWNpbnRvc2ggdmVyc2lvbnMuIFlvdSBzaG91bGQgYmUgZm9yZXdhcm5lZCB0aGF0IG1vc3Qgb2YgdGhlIGV4YW1wbGVzIGFyZSBVbml4LWNlbnRyaWMgYW5kIG1heSBub3QgY29tcGlsZSBjb3JyZWN0bHkgb24gb3RoZXIgbWFjaGluZXMuIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIGV4YW1wbGVzIHByb3ZpZGVkIHdpdGggdGhlIFNXSUcgZGlzdHJpYnV0aW9uIGhhdmUgbm93IGJlZW4gdGVzdGVkIHVuZGVyIGJvdGggVW5peCBhbmQgV2luZG93cy1OVC4gIFdoZW4gYXBwbGljYWJsZSwgSSB3aWxsIHRyeSB0byBwb2ludCBvdXQgaW5jb21wYXRpYmlsaXRpZXMsIGJ1dCBtYWtlIG5vIHByb21pc2VzLi4uIDxwPgotPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjUwIDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML0xpYnJhcnkuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvTGlicmFyeS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y3MTNmLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvTGlicmFyeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+TXVsdGlwbGUgRmlsZXMgYW5kIHRoZSBTV0lHIExpYnJhcnk8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxhIG5hbWU9Im4wIj48L2E+PGgxPjQgTXVsdGlwbGUgZmlsZXMgYW5kIHRoZSBTV0lHIGxpYnJhcnk8L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5UaGUgJWluY2x1ZGUgZGlyZWN0aXZlPC9hPgotPGxpPiA8YSBocmVmPSIjbjIiPlRoZSAlZXh0ZXJuIGRpcmVjdGl2ZTwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5UaGUgJWltcG9ydCBkaXJlY3RpdmU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+SW5jbHVkaW5nIGZpbGVzIG9uIHRoZSBjb21tYW5kIGxpbmU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+VGhlIFNXSUcgbGlicmFyeTwvYT4KLTxsaT4gPGEgaHJlZj0iI242Ij5MaWJyYXJ5IGV4YW1wbGU8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNyI+Q3JlYXRpbmcgTGlicmFyeSBGaWxlczwvYT4KLTxsaT4gPGEgaHJlZj0iI244Ij5Xb3JraW5nIHdpdGggbGlicmFyeSBmaWxlczwvYT4KLTxsaT4gPGEgaHJlZj0iI245Ij5TdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgbXVsdGlwbGUgbW9kdWxlczwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMCI+TW9yZSBhYm91dCB0aGUgU1dJRyBsaWJyYXJ5PC9hPgotPC91bD4KLQotRm9yIGluY3JlYXNlZCBtb2R1bGFyaXR5IGFuZCBjb252ZW5pZW5jZSwgaXQgaXMgdXN1YWxseSB1c2VmdWwgdG8gYnJlYWsgYW4gaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gdXAgaW50byBtdWx0aXBsZSBmaWxlcyBvciBtb2R1bGVzLiBTV0lHIHByb3ZpZGVzIGEgbnVtYmVyIG9mIGZlYXR1cmVzIGZvciBkb2luZyBqdXN0IHRoaXMuPHA+Ci08YSBuYW1lPSJuMSI+PC9hPjxoMj4gVGhlICVpbmNsdWRlIGRpcmVjdGl2ZTwvaDI+Ci1UaGUgPHR0PiVpbmNsdWRlPC90dD4gZGlyZWN0aXZlIGluc2VydHMgY29kZSBmcm9tIGFub3RoZXIgZmlsZSBpbnRvIHRoZSBjdXJyZW50IGludGVyZmFjZSBmaWxlLiBJdCBpcyBwcmltYXJpbHkgdXNlZCB0byBidWlsZCBhIHBhY2thZ2UgZnJvbSBhIGNvbGxlY3Rpb24gb2Ygc21hbGxlciBtb2R1bGVzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gRmlsZSA6IGludGVyZmFjZS5pCi0lbW9kdWxlIHBhY2thZ2UKLSVpbmNsdWRlIGVxdWF0aW9ucy5pCi0laW5jbHVkZSBncmFwaGljcy5pCi0laW5jbHVkZSBmaWxlaW8uaQotJWluY2x1ZGUgZGF0YS5pCi0laW5jbHVkZSBuZXR3b3JrLmMKLSVpbmNsdWRlICIuLi9JbmNsdWRlL3VzZXIuaCIKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB1c2VkIGluIHRoaXMgbWFubmVyLCBTV0lHIHdpbGwgY3JlYXRlIGEgc2luZ2xlIHdyYXBwZXIgZmlsZSBjb250YWluaW5nIGFsbCBvZiB0aGUgaW5jbHVkZWQgZnVuY3Rpb25zLiA8cD4KLTxwPgotVGhlIDx0dD4laW5jbHVkZTwvdHQ+IGRpcmVjdGl2ZSBjYW4gcHJvY2VzcyBTV0lHIGludGVyZmFjZSBmaWxlcywgQyBoZWFkZXIgZmlsZXMsIGFuZCBDIHNvdXJjZSBmaWxlcyAocHJvdmlkZWQgdGhleSBhcmUgc3VmZmljaWVudGx5IGNsZWFuKS4gV2hlbiBwcm9jZXNzaW5nIGEgQyBzb3VyY2UgZmlsZSwgU1dJRyB3aWxsIGF1dG9tYXRpY2FsbHkgZGVjbGFyZSBhbGwgZnVuY3Rpb25zIGl0IGZpbmRzIGFzICJleHRlcm4iLiBUaHVzLCB1c2Ugb2YgYSBoZWFkZXIgZmlsZSBtYXkgbm90IGJlIHJlcXVpcmVkIGluIHRoaXMgY2FzZS48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBUaGUgJWV4dGVybiBkaXJlY3RpdmU8L2gyPgotVGhlIDx0dD4lZXh0ZXJuPC90dD4gZGlyZWN0aXZlIGlzIGxpa2UgPHR0PiVpbmNsdWRlPC90dD4gZXhjZXB0IHRoYXQgaXQgb25seSBzY2FucyBhIGZpbGUgZm9yIHR5cGUgYW5kIGNsYXNzIGluZm9ybWF0aW9uLiBJdCBkb2VzIG5vdCBhY3R1YWxseSB3cmFwIGFueXRoaW5nIGZvdW5kIGluIHRoZSBpbnB1dCBmaWxlLiBUaGlzIGRpcmVjdGl2ZSBpcyBwcmltYXJpbHkgdXNlZCBmb3IgaGFuZGxpbmcgY2xhc3MgaGllcmFyY2hpZXMgYW5kIG11bHRpcGxlIG1vZHVsZXMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGRlcml2ZWQKLSVleHRlcm4gYmFzZWNsYXNzLmggCQkJCS8vIEdyYWIgZGVmaW5pdGlvbiBvZiBhIGJhc2UgY2xhc3MKLQotLy8gTm93IHdyYXAgYSBkZXJpdmVkIGNsYXNzCi1jbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2VDbGFzcyB7Ci1wdWJsaWM6Ci0JLi4uCi19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGludGVyZmFjZSBmaWxlIHdvdWxkIGdyYWIgdGhlIG1lbWJlciBmdW5jdGlvbnMgYW5kIGRhdGEgZnJvbSBhIGJhc2VjbGFzcywgYnV0IG9ubHkgdXNlIHRoZW0gaW4gdGhlIHNwZWNpZmljYXRpb24gb2YgYSBkZXJpdmVkIGNsYXNzLiA8dHQ+JWV4dGVybjwvdHQ+IHByb2Nlc3Npbmcgb2YgZmlsZXMgaXMgYWxzbyB1c2VmdWwgZm9yIHBpY2tpbmcgdXAgY29tbW9uIHR5cGVkZWZzIGFuZCBkZWZpbml0aW9ucyBpbiBhIGxhcmdlIHBhY2thZ2UuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gVGhlICVpbXBvcnQgZGlyZWN0aXZlPC9oMj4KLVRoZSA8dHQ+JWV4dGVybjwvdHQ+IGRpcmVjdGl2ZSBpcyB1c2VkIHRvIGdhdGhlciBkZWNsYXJhdGlvbnMgZnJvbSBmaWxlcyB0aGF0IHlvdSBkb24ndCB3YW50IHRvIHdyYXAgaW50byBhbiBpbnRlcmZhY2UuIFVuZm9ybnVuYXRlbHksIHRoZSBleGFjdCByb2xlIG9mIHRoZXNlIGZpbGVzIGlzIG5vdCBhbHdheXMgY2xlYXIuIFRoZXkgY291bGQganVzdCBjb250YWluIGRlZmluaXRpb25zLCBvciB0aGV5IG1pZ2h0IGNvcnJlc3BvbmQgdG8gYW4gZW50cmlyZWx5IGRpZmZlcmVudCBTV0lHIG1vZHVsZS4gVGhlIDx0dD4laW1wb3J0PC90dD4gZGlyZWN0aXZlIGlzIGEgc3Ryb25nZXIgdmVyc2lvbiBvZiA8dHQ+JWV4dGVybjwvdHQ+IHRoYXQgdGVsbHMgU1dJRyB0aGF0IGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBmaWxlIGFyZSBpbmRlZWQsIGluIGFuIGVudGlyZWx5IGRpZmZlcmVudCBtb2R1bGUuIFRoaXMgaW5mb3JtYXRpb24gbWF5IGFmZmVjdCB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdmFyaW91cyBsYW5ndWFnZSBtb2R1bGVzIHNpbmNlIHRoZXkgd2lsbCBoYXZlIGEgYmV0dGVyIGlkZWEgb2Ygd2hlcmUgdGhpbmdzIGFyZSBkZWZpbmVkIGFuZCBob3cgdGhleSBhcmUgdG8gYmUgdXNlZC48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBJbmNsdWRpbmcgZmlsZXMgb24gdGhlIGNvbW1hbmQgbGluZTwvaDI+Ci1NdWNoIGxpa2UgdGhlIEMgb3IgQysrIGNvbXBpbGVyLCBTV0lHIGNhbiBhbHNvIGluY2x1ZGUgbGlicmFyeSBmaWxlcyBvbiB0aGUgY29tbWFuZCBsaW5lIHVzaW5nIHRoZSA8dHQ+LWw8L3R0PiBvcHRpb24gYXMgc2hvd248cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSMgSW5jbHVkZSBhIGxpYnJhcnkgZmlsZSBhdCBjb21waWxlIHRpbWUKLSUgc3dpZyAtdGNsIC1sd2lzaC5pIGludGVyZmFjZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgYXBwcm9hY2ggdHVybnMgb3V0IHRvIGJlIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgYnVpbGRpbmcgZXh0ZW5zaW9ucyB0byBkaWZmZXJlbnQga2luZHMgb2YgbGFuZ3VhZ2VzLiBXaGVuIGxpYnJhcmllcyBhcmUgc3BlY2lmaWVkIGluIHRoaXMgbWFubmVyLCB0aGV5IGFyZSBpbmNsdWRlZCBhZnRlciBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiA8dHQ+aW50ZXJmYWNlLmk8L3R0PiBoYXZlIGJlZW4gd3JhcHBlZC4gVGh1cywgdGhpcyBkb2VzIG5vdCB3b3JrIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIGluY2x1ZGUgY29tbW9uIGRlY2xhcmF0aW9ucywgdHlwZW1hcHMsIGFuZCBvdGhlciBmaWxlcy48cD4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBUaGUgU1dJRyBsaWJyYXJ5IDwvaDI+Ci1TV0lHIGNvbWVzIHdpdGggYSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHVwIG1vcmUgY29tcGxleCBpbnRlcmZhY2VzLiBBcyB5b3UgYnVpbGQgdXAgYSBjb2xsZWN0aW9uIG9mIG1vZHVsZXMsIHlvdSBtYXkgYWxzbyBmaW5kIHlvdXJzZWxmIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgaW50ZXJmYWNlIGZpbGVzLiBXaGlsZSB0aGUgPHR0PiVpbmNsdWRlPC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluc2VydCBmaWxlcywgaXQgYWxzbyBzZWFyY2hlcyB0aGUgZmlsZXMgaW5zdGFsbGVkIGluIHRoZSBTV0lHIGxpYnJhcnkgKHRoaW5rIG9mIHRoaXMgYXMgdGhlIFNXSUcgZXF1aXZhbGVudCBvZiB0aGUgQyBsaWJyYXJ5KS4gV2hlbiB5b3UgdXNlIDx0dD4laW5jbHVkZTwvdHQ+LCBTV0lHIHdpbGwgc2VhcmNoIGZvciB0aGUgZmlsZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIDo8cD4KLTxwPgotPHVsPgotPGxpPlRoZSBjdXJyZW50IGRpcmVjdG9yeQotPGxpPkRpcmVjdG9yaWVzIHNwZWNpZmllZCB3aXRoIHRoZSAtSSBvcHRpb24KLTxsaT4uPHR0Pi9zd2lnX2xpYjwvdHQ+Ci08bGk+PHR0Pi91c3IvbG9jYWwvbGliL3N3aWdfbGliPC90dD4gKG9yIHdoZXJldmVyIHlvdSBpbnN0YWxsZWQgU1dJRykKLTwvdWw+Ci08cD4KLVdpdGhpbiBlYWNoIGRpcmVjdG9yeSwgeW91IGNhbiBhbHNvIGNyZWF0ZSBzdWJkaXJlY3RvcmllcyBmb3IgZWFjaCB0YXJnZXQgbGFuZ3VhZ2UuIElmIGZvdW5kLCBTV0lHIHdpbGwgc2VhcmNoIHRoZXNlIGRpcmVjdG9yaWVzIGZpcnN0LCBhbGxvd2luZyB0aGUgY3JlYXRpb24gb2YgbGFuZ3VhZ2Utc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mIGEgcGFydGljdWxhciBsaWJyYXJ5IGZpbGUuPHA+Ci08cD4KLVlvdSBjYW4gb3ZlcnJpZGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBTV0lHIGxpYnJhcnkgYnkgc2V0dGluZyB0aGUgPHR0PlNXSUdfTElCPC90dD4gZW52aXJvbm1lbnQgdmFyaWFibGUuPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMj4gTGlicmFyeSBleGFtcGxlPC9oMj4KLVRoZSBTV0lHIGxpYnJhcnkgaXMgcmVhbGx5IGEgcmVwb3NpdG9yeSBvZiAidXNlZnVsIG1vZHVsZXMiIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYmV0dGVyIGludGVyZmFjZXMuIFRvIHVzZSBhIGxpYnJhcnkgZmlsZSwgeW91IGNhbiBzaW1wbHkgdXNlIHRoZSA8dHQ+JWluY2x1ZGUgPC90dD5kaXJlY3RpdmUgd2l0aCB0aGUgbmFtZSBvZiBhIGxpYnJhcnkgZmlsZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotCi0laW5jbHVkZSBwb2ludGVyLmkgCQkJCS8vIEdyYWIgdGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5Ci0KLS8vIGErYiAtLSZndDsgYwotZXh0ZXJuIGRvdWJsZSBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKmMpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGV4YW1wbGUsIHdlIGFyZSBpbmNsdWRpbmcgdGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5IHRoYXQgYWRkcyBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBDIHBvaW50ZXJzLiBUaGVzZSBhZGRlZCBmdW5jdGlvbnMgYmVjb21lIHBhcnQgb2YgeW91ciBtb2R1bGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBuZWVkZWQuIEZvciBleGFtcGxlLCB3ZSBjYW4gd3JpdGUgYSBUY2wgc2NyaXB0IGxpa2UgdGhpcyB0aGF0IGludm9sdmVzIGJvdGggdGhlIDx0dD5hZGQoKTwvdHQ+IGZ1bmN0aW9uIGFuZCB0d28gZnVuY3Rpb25zIGZyb20gdGhlIDx0dD5wb2ludGVyLmk8L3R0PiBsaWJyYXJ5IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zZXQgYyBbcHRyY3JlYXRlIGRvdWJsZSAwXSAgICA7IyBDcmVhdGUgYSBkb3VibGUgKiBmb3IgaG9sZGluZyB0aGUgcmVzdWx0Ci1hZGQgNCAzLjUgJGMgICAgICAgICAgICAgICAgICA7IyBDYWxsIG91ciBDIGZ1bmN0aW9uCi1wdXRzIFtwdHJ2YWx1ZSAkY10gICAgICAgICAgICA7IyBQcmludCBvdXQgdGhlIHJlc3VsdAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IENyZWF0aW5nIExpYnJhcnkgRmlsZXM8L2gyPgotSXQgaXMgZWFzeSB0byBjcmVhdGUgeW91ciBvd24gbGlicmFyeSBmaWxlcy4gVG8gaWxsdXN0cmF0ZSB0aGUgcHJvY2Vzcywgd2UgY29uc2lkZXIgdHdvIGRpZmZlcmVudCBsaWJyYXJ5IGZpbGVzLS1vbmUgdG8gYnVpbGQgYSBuZXcgPHR0PnRjbHNoPC90dD4gcHJvZ3JhbSwgYW5kIG9uZSB0byBhZGQgYSBmZXcgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgzPiB0Y2xzaC5pPC9oMz4KLVRvIGJ1aWxkIGEgbmV3IDx0dD50Y2xzaDwvdHQ+IGFwcGxpY2F0aW9uLCB5b3UgbmVlZCB0byBzdXBwbHkgYSA8dHQ+VGNsX0FwcEluaXQoKTwvdHQ+IGZ1bmN0aW9uLiAgIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgdGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlIChzaW1wbGlmaWVkIHNvbWV3aGF0IGZvciBjbGFyaXR5KSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotLy8gRmlsZSA6IHRjbHNoLmkKLSV7Ci0jaWYgVENMX01BSk9SX1ZFUlNJT04gPT0gNyAmYW1wOyZhbXA7IFRDTF9NSU5PUl9WRVJTSU9OICZndDs9IDQKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICBUY2xfTWFpbihhcmdjLCBhcmd2LCBUY2xfQXBwSW5pdCk7Ci0gIHJldHVybigwKTsKLX0KLSNlbHNlCi1leHRlcm4gaW50IG1haW4oKTsKLSNlbmRpZgotaW50IFRjbF9BcHBJbml0KFRjbF9JbnRlcnAgKmludGVycCl7Ci0gIGludCBTV0lHX2luaXQoVGNsX0ludGVycCAqKTsgCi0KLSAgaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSAKLSAgICByZXR1cm4gVENMX0VSUk9SOwotCi0gIC8qIE5vdyBpbml0aWFsaXplIG91ciBmdW5jdGlvbnMgKi8KLQotICBpZiAoU1dJR19pbml0KGludGVycCkgPT0gVENMX0VSUk9SKQotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0KLSAgcmV0dXJuIFRDTF9PSzsKLX0KLSV9Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSBlbnRpcmUgZmlsZSBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb2RlIGJsb2NrLiBUaGlzIGNvZGUgd2lsbCBiZSBpbnNlcnRlZCBkaXJlY3RseSBpbnRvIHRoZSByZXN1bHRpbmcgd3JhcHBlciBmaWxlLCBwcm92aWRpbmcgdXMgd2l0aCB0aGUgbmVlZGVkIDx0dD5UY2xfQXBwSW5pdCgpPC90dD4gZnVuY3Rpb24uPHA+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDM+IG1hbGxvYy5pPC9oMz4KLU5vdyBzdXBwb3NlIHdlIHdhbnRlZCB0byB3cml0ZSBhIGZpbGUgPHR0Pm1hbGxvYy5pPC90dD4gdGhhdCBhZGRlZCBhIGZldyBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuICBXZSBjb3VsZCBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBGaWxlIDogbWFsbG9jLmkKLSV7Ci0jaW5jbHVkZSAmbHQ7bWFsbG9jLmgmZ3Q7Ci0lfQotCi0ldHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90Ci12b2lkICptYWxsb2Moc2l6ZV90IG5ieXRlcyk7Ci12b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IG5ieXRlcyk7Ci12b2lkIGZyZWUodm9pZCAqKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSW4gdGhpcyBjYXNlLCB3ZSBoYXZlIGEgZ2VuZXJhbCBwdXJwb3NlIGxpYnJhcnkgdGhhdCBjb3VsZCBiZSB1c2VkIHdoZW5ldmVyIHdlIG5lZWRlZCBhY2Nlc3MgdG8gdGhlIDx0dD5tYWxsb2MoKTwvdHQ+IGZ1bmN0aW9ucy4gU2luY2UgdGhpcyBpbnRlcmZhY2UgZmlsZSBpcyBsYW5ndWFnZSBpbmRlcGVuZGVudCwgd2UgY2FuIHVzZSBpdCBhbnl3aGVyZS48cD4KLTxhIG5hbWU9Im4xMyI+PC9hPjxoMz4gUGxhY2luZyB0aGUgZmlsZXMgaW4gdGhlIGxpYnJhcnk8L2gzPgotV2hpbGUgYm90aCBvZiBvdXIgZXhhbXBsZXMgYXJlIFNXSUcgaW50ZXJmYWNlIGZpbGVzLCB0aGV5IGFyZSBxdWl0ZSBkaWZmZXJlbnQgaW4gZnVuY3Rpb25hbGl0eSBzaW5jZSA8dHQ+dGNsc2guaTwvdHQ+IHdvdWxkIG9ubHkgd29yayB3aXRoIFRjbCB3aGlsZSA8dHQ+bWFsbG9jLmk8L3R0PiB3b3VsZCB3b3JrIHdpdGggYW55IG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiAgICBUaHVzLCB3ZSBzaG91bGQgcHV0IHRoZXNlIGZpbGVzIGludG8gdGhlIFNXSUcgbGlicmFyeSBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+PHR0PgotLi9zd2lnX2xpYi9tYWxsb2MuaQotLi9zd2lnX2xpYi90Y2wvdGNsc2guaQotPC90dD48L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gdXNlZCBpbiBvdGhlciBpbnRlcmZhY2UgZmlsZXMsIHRoaXMgYWxsb3dzIHVzIHRvIHVzZSA8dHQ+bWFsbG9jLmk8L3R0PiB3aXRoIGFueSB0YXJnZXQgbGFuZ3VhZ2Ugd2hpbGUgPHR0PnRjbHNoLmk8L3R0PiB3aWxsIG9ubHkgYmUgYWNjZXNzaWJsZSBpZiBjcmVhdGluZyBmb3Igd3JhcHBlcnMgZm9yIFRjbCAoaWUuICB3aGVuIGNyZWF0aW5nIGEgUGVybDUgbW9kdWxlLCBTV0lHIHdpbGwgbm90IGxvb2sgaW4gdGhlIDx0dD50Y2w8L3R0PiBzdWJkaXJlY3RvcnkuPHA+Ci08cD4KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGxhbmd1YWdlIHNwZWNpZmljIGxpYnJhcmllcyBjYW4gbWFzayBnZW5lcmFsIGxpYnJhcmllcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIG1ha2UgYSBQZXJsIHNwZWNpZmljIG1vZGlmaWNhdGlvbiB0byA8dHQ+bWFsbG9jLmk8L3R0PiwgeW91IGNvdWxkIG1ha2UgYSBzcGVjaWFsIHZlcnNpb24gYW5kIGNhbGwgaXQgPHR0Pi4vc3dpZ19saWIvcGVybDUvbWFsbG9jLmk8L3R0Pi4gV2hlbiB1c2luZyBQZXJsLCB5b3UnZCBnZXQgdGhpcyB2ZXJzaW9uLCB3aGlsZSBhbGwgb3RoZXIgdGFyZ2V0ICBsYW5ndWFnZXMgd291bGQgdXNlIHRoZSBnZW5lcmFsIHB1cnBvc2UgdmVyc2lvbi48cD4KLTxhIG5hbWU9Im44Ij48L2E+PGgyPiBXb3JraW5nIHdpdGggbGlicmFyeSBmaWxlczwvaDI+Ci1UaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGFkZGl0aW9uYWwgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkgZGVzY3JpYmVkIG5leHQuPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDM+IFdyYXBwaW5nIGEgbGlicmFyeSBmaWxlPC9oMz4KLUlmIHlvdSB3b3VsZCBsaWtlIHRvIHdyYXAgYSBmaWxlIGluIHRoZSBTV0lHIGxpYnJhcnksIHNpbXBseSBnaXZlIFNXSUcgdGhlIG5hbWUgb2YgdGhlIGFwcHJvcHJpYXRlIGxpYnJhcnkgZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dW5peCAmZ3Q7IHN3aWcgLXB5dGhvbiBwb2ludGVyLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSWYgdGhlIGZpbGUgPHR0PnBvaW50ZXIuaTwvdHQ+IGlzIG5vdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIFNXSUcgd2lsbCBsb29rIGl0IHVwIGluIHRoZSBsaWJyYXJ5LCBnZW5lcmF0ZSB3cmFwcGVyIGNvZGUsIGFuZCBwbGFjZSB0aGUgb3V0cHV0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gVGhpcyB0ZWNobmlxdWUgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBtYWtlIGEgbW9kdWxlIG91dCBvZiBhIGxpYnJhcnkgZmlsZSByZWdhcmRsZXNzIG9mIHdoZXJlIHlvdSBhcmUgd29ya2luZy48cD4KLTxhIG5hbWU9Im4xNSI+PC9hPjxoMz4gQ2hlY2tpbmcgb3V0IGxpYnJhcnkgZmlsZXM8L2gzPgotQXQgdGltZXMsIGl0IGlzIHVzZWZ1bCB0byBjaGVjayBhIGZpbGUgb3V0IG9mIHRoZSBsaWJyYXJ5IGFuZCBjb3B5IGl0IGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIGFsbG93cyB5b3UgdG8gbW9kaWZ5IHRoZSBmaWxlIG9yIHRvIHNpbXBseSByZXRyaWV2ZSB1c2VmdWwgZmlsZXMuIFRvIGNoZWNrIGEgZmlsZSBvdXQgb2YgdGhlIGxpYnJhcnksIHJ1biBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1jbyAtcHl0aG9uIGFycmF5LmkKLWFycmF5LmkgY2hlY2tlZCBvdXQgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5Ci11bml4ICZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGxpYnJhcnkgZmlsZSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdW5sZXNzIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgKGluIHdoaWNoIGNhc2Ugbm90aGluZyBpcyBkb25lKS4gPHA+Ci08cD4KLVRoZSBTV0lHIGxpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQgdG8gaW50ZXJmYWNlIGZpbGVzLiBTdXBwb3NlIHlvdSBoYWQgYSBjb29sIFBlcmwgc2NyaXB0IHRoYXQgeW91IGxpa2VkIHRvIHVzZSBhbG90LiBZb3UgY291bGQgcGxhY2UgdGhpcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiBOb3cgd2hlbmV2ZXIgeW91IHdhbnRlZCB0byB1c2UgaXQsIHlvdSBjb3VsZCByZXRyaWV2ZSBpdCBieSBpc3N1aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgc3dpZyAtcGVybDUgLWNvIG15c2NyaXB0LnBsCi1teXNjcmlwdC5wbCBjaGVja2VkIG91dCBmcm9tIHRoZSBTV0lHIGxpYnJhcnkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU3VwcG9ydCBmaWxlcyBjYW4gYWxzbyBiZSBjaGVja2VkIG91dCB3aXRoaW4gYW4gaW50ZXJmYWNlIGZpbGUgdXNpbmcgdGhlIDx0dD4lY2hlY2tvdXQ8L3R0PiBkaXJlY3RpdmUuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWNoZWNrb3V0IG15c2NyaXB0LnBsCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgd2lsbCBhdHRlbXB0IHRvIGNvcHkgdGhlIGZpbGUgPHR0Pm15c2NyaXB0LnBsPC90dD4gdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoZW4gU1dJRyBpcyBydW4uIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBub3RoaW5nIGlzIGRvbmUuPHA+Ci08YSBuYW1lPSJuMTYiPjwvYT48aDM+IFRoZSB3b3JsZCdzIGZhc3Rlc3Qgd2F5IHRvIHdyaXRlIGEgTWFrZWZpbGU8L2gzPgotU2luY2UgdGhlIFNXSUcgbGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCB0byBTV0lHIGludGVyZmFjZSBmaWxlcywgaXQgY2FuIGJlIHVzZWQgdG8gaG9sZCBvdGhlciBraW5kcyBvZiB1c2VmdWwgZmlsZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgbmVlZCBhIHF1aWNrIE1ha2VmaWxlIGZvciBidWlsZGluZyBUY2wgZXh0ZW5zaW9ucywgdHlwZSB0aGUgZm9sbG93aW5nOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXgmZ3Q7IHN3aWcgLXRjbCAtY28gTWFrZWZpbGUKLU1ha2VmaWxlIGNoZWNrZWQgb3V0IGZyb20gdGhlIFNXSUcgbGlicmFyeQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1EdXJpbmcgaW5zdGFsbGF0aW9uLCBTV0lHIGNyZWF0ZXMgYSBjb2xsZWN0aW9uIG9mIHByZWNvbmZpZ3VyZWQgTWFrZWZpbGVzIGZvciB2YXJpb3VzIHNjcmlwdGluZyBsYW5ndWFnZXMuIElmIHlvdSBuZWVkIHRvIG1ha2UgYSBuZXcgbW9kdWxlLCBqdXN0IGNoZWNrIG91dCBvbmUgb2YgdGhlc2UgTWFrZWZpbGVzLCBtYWtlIGEgZmV3IGNoYW5nZXMsIGFuZCB5b3Ugc2hvdWxkIGJlIHJlYWR5IHRvIGNvbXBpbGUgYW5kIGV4dGVuc2lvbiBmb3IgeW91ciBzeXN0ZW0uPHA+Ci08YSBuYW1lPSJuMTciPjwvYT48aDM+IENoZWNraW5nIGluIGxpYnJhcnkgZmlsZXM8L2gzPgotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjaGVjayBmaWxlcyBpbnRvIHRoZSBTV0lHIGxpYnJhcnkuIElmIHlvdSd2ZSBtYWRlIGFuIGludGVyZXN0aW5nIGludGVyZmFjZSB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGtlZXAgYXJvdW5kLCBzaW1wbHkgdHlwZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dW5peCAmZ3Q7IHN3aWcgLWNpIC1weXRob24gY29vbC5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWFuZCB0aGUgZmlsZSBgPHR0PmNvb2wuaTwvdHQ+JyB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgUHl0aG9uIHNlY3Rpb24gb2YgdGhlIGxpYnJhcnkuIElmIHlvdXIgaW50ZXJmYWNlIGZpbGUgaXMgZ2VuZXJhbCBwdXJwb3NlLCB5b3UgY2FuIGluc3RhbGwgaXQgaW50byB0aGUgZ2VuZXJhbCBsaWJyYXJ5IGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1jaSAuLi9jb29sLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBmaWxlcyBhcmUgY2hlY2tlZCBpbiwgdGhleSBhcmUgcGxhY2VkIGludG8gdGhlIGRpcmVjdG9yeSBkZWZpbmVkIGJ5IHRoZSA8dHQ+U1dJR19MSUI8L3R0PiB2YXJpYWJsZSB0aGF0IHdhcyB1c2VkIGR1cmluZyBTV0lHIGNvbXBpbGF0aW9uIG9yIHRoZSA8dHQ+U1dJR19MSUI8L3R0PiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoaWYgc2V0KS4gSWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcywgdHlwZSB0aGUgZm9sbG93aW5nIHRvIGRpc3BsYXkgaXRzIGxvY2F0aW9uLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1zd2lnbGliCi0vdXNyL2xvY2FsL2xpYi9zd2lnX2xpYgotdW5peCAmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIG9yZGVyIHRvIGNoZWNrIGZpbGVzIGludG8gdGhlIGxpYnJhcnksIHlvdSBtdXN0IGhhdmUgd3JpdGUgcGVybWlzc2lvbiBvbiB0aGUgbGlicmFyeSBkaXJlY3RvcnkuIEZvciB0aGlzIHJlYXNvbiwgb25lIG9mIHRoZSBwcmltYXJ5IHVzZXMgZm9yIHRoZSA8dHQ+LWNpPC90dD4gb3B0aW9uIGlzIHRvIHByb3ZpZGUgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBpbnN0YWxsaW5nIFNXSUcgZXh0ZW5zaW9ucy4gSWYgdGhlc2UgZXh0ZW5zaW9ucyBuZWVkIHRvIGluc3RhbGwgbGlicmFyeSBmaWxlcywgdGhhdCBjYW4gYmUgZG9uZSBieSBzaW1wbHkgcnVubmluZyBTV0lHLjxwPgotPGEgbmFtZT0ibjkiPjwvYT48aDI+IFN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBtdWx0aXBsZSBtb2R1bGVzPC9oMj4KLVdoZW4gdXNpbmcgc3RhdGljIGxpbmtpbmcsIHNvbWUgbGFuZ3VhZ2UgbW9kdWxlcyBhbGxvdyBtdWx0aXBsZSBtb2R1bGVzIHRvIGJlIGluaXRpYWxpemVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgcGFja2FnZSwgZXF1YXRpb25zLCBncmFwaGljcywgZmlsZWlvLCBkYXRhLCBuZXR3b3JrLCB1c2VyCi0KLS4uLiBNb3JlIGRlY2xhcmF0aW9ucyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIG1vZHVsZSBsaXN0IGNhbiBjb250YWluIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMgb3IgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zLiBSZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgY2hhcHRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGZlYXR1cmUuPHA+Ci08YSBuYW1lPSJuMTAiPjwvYT48aDI+IE1vcmUgYWJvdXQgdGhlIFNXSUcgbGlicmFyeTwvaDI+Ci1GdWxsIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIFNXSUcgbGlicmFyeSBpcyBpbmNsdWRlZCBpbiB0aGUgU1dJRyBzb3VyY2UgZGlzdHJpYnV0aW9uLiBJbiBmYWN0LCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHLCB3aGljaCBsZWFkcyB1cyB0byB0aGUgbmV4dCBzZWN0aW9uLi4uPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjU0IDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML1Blcmw1Lmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML1Blcmw1Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkY2FmYjguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9QZXJsNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxOSArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlNXSUcgYW5kIFBlcmw1PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT44IFNXSUcgYW5kIFBlcmw1PC9oMT48cD48dWw+Ci08bGk+IDxhIGhyZWY9IiNuMSI+UHJlbGltaW5hcmllczwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5CdWlsZGluZyBQZXJsIEV4dGVuc2lvbnMgdW5kZXIgV2luZG93cyA5NS9OVDwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5Nb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNsYXNzZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+QmFzaWMgUGVybCBpbnRlcmZhY2U8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+QSBzaW1wbGUgUGVybCBleGFtcGxlPC9hPgotPGxpPiA8YSBocmVmPSIjbjYiPkFjY2Vzc2luZyBhcnJheXMgYW5kIG90aGVyIHN0cmFuZ2Ugb2JqZWN0czwvYT4KLTxsaT4gPGEgaHJlZj0iI243Ij5JbXBsZW1lbnRpbmcgbWV0aG9kcyBpbiBQZXJsPC9hPgotPGxpPiA8YSBocmVmPSIjbjgiPlNoYWRvdyBjbGFzc2VzPC9hPgotPGxpPiA8YSBocmVmPSIjbjkiPkdldHRpbmcgc2VyaW91czwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMCI+V3JhcHBpbmcgQyBsaWJyYXJpZXMgYW5kIG90aGVyIHBhY2thZ2VzPC9hPgotPGxpPiA8YSBocmVmPSIjbjExIj5CdWlsZGluZyBhIFBlcmw1IGludGVyZmFjZSB0byBNQVRMQUI8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTIiPkhhbmRsaW5nIG91dHB1dCB2YWx1ZXMgKHRoZSBlYXN5IHdheSk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTMiPkV4Y2VwdGlvbiBoYW5kbGluZzwvYT4KLTxsaT4gPGEgaHJlZj0iI24xNCI+UmVtYXBwaW5nIGRhdGF0eXBlcyB3aXRoIHR5cGVtYXBzPC9hPgotPGxpPiA8YSBocmVmPSIjbjE1Ij5UaGUgZ29yeSBkZXRhaWxzIG9uIHNoYWRvdyBjbGFzc2VzPC9hPgotPGxpPiA8YSBocmVmPSIjbjE2Ij5XaGVyZSB0byBnbyBmcm9tIGhlcmU/PC9hPgotPC91bD4KLQotSW4gdGhpcyBjaGFwdGVyLCB3ZSBkaXNjdXNzIFNXSUcncyBzdXBwb3J0IG9mIFBlcmw1LiBXaGlsZSB0aGUgUGVybDUgbW9kdWxlIGlzIG9uZSBvZiB0aGUgZWFybGllc3QgU1dJRyBtb2R1bGVzLCBpdCBoYXMgY29udGludWVkIHRvIGV2b2x2ZSBhbmQgaGFzIGJlZW4gaW1wcm92ZWQgZ3JlYXRseSB3aXRoIHRoZSBoZWxwIG9mIFNXSUcgdXNlcnMuIEZvciB0aGUgYmVzdCByZXN1bHRzLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IFNXSUcgYmUgdXNlZCB3aXRoIFBlcmw1LjAwMyBvciBsYXRlci4gRWFybGllciB2ZXJzaW9ucyBhcmUgcHJvYmxlbWF0aWMgYW5kIFNXSUcgZ2VuZXJhdGVkIGV4dGVuc2lvbnMgbWF5IG5vdCBjb21waWxlIG9yIHJ1biBjb3JyZWN0bHkuPHA+Ci08YSBuYW1lPSJuMSI+PC9hPjxoMj4gUHJlbGltaW5hcmllczwvaDI+Ci1JbiBvcmRlciBmb3IgdGhpcyBzZWN0aW9uIHRvIG1ha2UgbXVjaCBzZW5zZSwgeW91IHdpbGwgbmVlZCB0byBoYXZlIFBlcmw1LjAwMiAob3IgbGF0ZXIpIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbS4gWW91IHNob3VsZCBhbHNvIGRldGVybWluZSBpZiB5b3VyIHZlcnNpb24gb2YgUGVybCBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHVzZSBkeW5hbWljIGxvYWRpbmcgb3Igbm90LiBTV0lHIHdpbGwgd29yayB3aXRoIG9yIHdpdGhvdXQgaXQsIGJ1dCB0aGUgY29tcGlsYXRpb24gcHJvY2VzcyB3aWxsIGJlIGRpZmZlcmVudC48cD4KLTxhIG5hbWU9Im4xNyI+PC9hPjxoMz4gUnVubmluZyBTV0lHPC9oMz4KLVRvIGJ1aWxkIGEgUGVybDUgbW9kdWxlLCBydW4gc3dpZyB1c2luZyB0aGUgPHR0Pi1wZXJsNTwvdHQ+IG9wdGlvbiBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1zd2lnIC1wZXJsNSBleGFtcGxlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3aWxsIHByb2R1Y2UgMyBmaWxlcy4gVGhlIGZpcnN0IGZpbGUsIDx0dD5leGFtcGxlX3dyYXAuYzwvdHQ+IGNvbnRhaW5zIGFsbCBvZiB0aGUgQyBjb2RlIG5lZWRlZCB0byBidWlsZCBhIFBlcmw1IG1vZHVsZS4gVGhlIHNlY29uZCBmaWxlLCA8dHQ+ZXhhbXBsZS5wbTwvdHQ+IGNvbnRhaW5zIHN1cHBvcnRpbmcgUGVybCBjb2RlIG5lZWRlZCB0byBwcm9wZXJseSBsb2FkIHRoZSBtb2R1bGUgaW50byBQZXJsLiBUaGUgdGhpcmQgZmlsZSB3aWxsIGJlIGEgZG9jdW1lbnRhdGlvbiBmaWxlICh0aGUgZXhhY3QgZmlsZW5hbWUgZGVwZW5kcyBvbiB0aGUgZG9jdW1lbnRhdGlvbiBzdHlsZSkuIFRvIGZpbmlzaCBidWlsZGluZyBhIG1vZHVsZSwgeW91IHdpbGwgbmVlZCB0byBjb21waWxlIHRoZSBmaWxlIDx0dD5leGFtcGxlX3dyYXAuYzwvdHQ+IGFuZCBsaW5rIGl0IHdpdGggdGhlIHJlc3Qgb2YgeW91ciBwcm9ncmFtIChhbmQgcG9zc2libHkgUGVybCBpdHNlbGYpLiBUaGVyZSBhcmUgc2V2ZXJhbCBtZXRob2RzIGZvciBkb2luZyB0aGlzLjxwPgotPGEgbmFtZT0ibjE4Ij48L2E+PGgzPiBHZXR0aW5nIHRoZSByaWdodCBoZWFkZXIgZmlsZXM8L2gzPgotSW4gb3JkZXIgdG8gY29tcGlsZSwgeW91IHdpbGwgbmVlZCB0byB1c2UgdGhlIGZvbGxvd2luZyBQZXJsNSBoZWFkZXIgZmlsZXMgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSNpbmNsdWRlICJFeHRlcm4uaCIKLSNpbmNsdWRlICJwZXJsLmgiCi0jaW5jbHVkZSAiWFNVQi5oIgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGVzZSBhcmUgdXN1YWxseSBsb2NhdGVkIGluIGEgZGlyZWN0b3J5IGxpa2UgdGhpczxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi91c3IvbG9jYWwvbGliL3Blcmw1L2FyY2gtb3NuYW1lLzUuMDAzL0NPUkUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIFNXSUcgY29uZmlndXJhdGlvbiBzY3JpcHQgd2lsbCB0cnkgdG8gZmluZCB0aGlzIGRpcmVjdG9yeSwgYnV0IGl0J3Mgbm90IGVudGlyZWx5IGZvb2xwcm9vZi4gWW91IG1heSBoYXZlIHRvIGRpZyBhcm91bmQgeW91cnNlbGYuPHA+Ci08YSBuYW1lPSJuMTkiPjwvYT48aDM+IENvbXBpbGluZyBhIGR5bmFtaWMgbW9kdWxlPC9oMz4KLVRvIGNvbXBpbGUgYSBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgPHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBnY2MgZXhhbXBsZS5jCi0lIGdjYyBleGFtcGxlX3dyYXAuYyAtSS91c3IvbG9jYWwvbGliL3Blcmw1L2FyY2gtb3NuYW1lLzUuMDAzL0NPUkUgCi0JLURib29sPWNoYXIgLWMKLSUgbGQgLXNoYXJlZCBleGFtcGxlLm8gZXhhbXBsZV93cmFwLm8gLW8gZXhhbXBsZS5zbyAgICAjIElyaXgKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBvYmplY3QgZmlsZSBtdXN0IG1hdGNoIHRoZSBtb2R1bGUgbmFtZSB1c2VkIGluIHRoZSBTV0lHIGludGVyZmFjZSBmaWxlLiBJZiB5b3UgdXNlZCBgPHR0PiVtb2R1bGUgZXhhbXBsZTwvdHQ+JywgdGhlbiB0aGUgdGFyZ2V0IHNob3VsZCBiZSBuYW1lZCBgPHR0PmV4YW1wbGUuc288L3R0PicsIGA8dHQ+ZXhhbXBsZS5zbDwvdHQ+Jywgb3IgdGhlIGFwcHJvcHJpYXRlIG5hbWUgb24geW91ciBzeXN0ZW0gKGNoZWNrIHRoZSBtYW4gcGFnZXMgZm9yIHRoZSBsaW5rZXIpLjxwPgotPHA+Ci1VbmZvcnR1bmF0ZWx5LCB0aGUgcHJvY2VzcyBvZiBidWlsZGluZyBkeW5hbWljIG1vZHVsZXMgdmFyaWVzIG9uIGV2ZXJ5IHNpbmdsZSBtYWNoaW5lLiBCb3RoIHRoZSBDIGNvbXBpbGVyIGFuZCBsaW5rZXIgbWF5IG5lZWQgc3BlY2lhbCBjb21tYW5kIGxpbmUgb3B0aW9ucy4gU1dJRyB0cmllcyB0byBndWVzcyBob3cgdG8gYnVpbGQgZHluYW1pYyBtb2R1bGVzIG9uIHlvdXIgbWFjaGluZSBpbiBvcmRlciB0byBydW4gaXRzIGV4YW1wbGUgcHJvZ3JhbXMuIEFnYWluLCB0aGUgY29uZmlndXJlIHNjcmlwdCBpc24ndCBmb29scHJvb2YgLjxwPgotPGEgbmFtZT0ibjIwIj48L2E+PGgzPiBCdWlsZGluZyBhIGR5bmFtaWMgbW9kdWxlIHdpdGggTWFrZU1ha2VyPC9oMz4KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIFBlcmwgdG8gYnVpbGQgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlcyBmb3IgeW91IHVzaW5nIHRoZSBNYWtlTWFrZXIgdXRpbGl0eS4gICAgVG8gZG8gdGhpcywgd3JpdGUgYSBzaW1wbGUgUGVybCBzY3JpcHQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIEZpbGUgOiBNYWtlZmlsZS5QTAotdXNlIEV4dFV0aWxzOjpNYWtlTWFrZXI7Ci1Xcml0ZU1ha2VmaWxlKAotCWBOQU1FJyAgICA9Jmd0OyBgZXhhbXBsZScsICAgICAgICAgICAgICAgICAgIyBOYW1lIG9mIHBhY2thZ2UKLQlgTElCUycgICAgPSZndDsgW2AtbG0nXSwgICAgICAgICAgICAgICAgICAgICMgTmFtZSBvZiBjdXN0b20gbGlicmFyaWVzCi0JYE9CSkVDVCcgID0mZ3Q7IGBleGFtcGxlLm8gZXhhbXBsZV93cmFwLm8nICAjIE9iamVjdCBmaWxlcwotKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCB0byBidWlsZCBhIG1vZHVsZSwgc2ltcGx5IGZvbGxvdyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBwZXJsIE1ha2VmaWxlLlBMCi0lIG1ha2UKLSUgbWFrZSBpbnN0YWxsCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgaXMgdGhlIHByZWZlcnJlZCBhcHByb2FjaCBpZiB5b3UgYnVpbGRpbmcgZ2VuZXJhbCBwdXJwb3NlIFBlcmw1IG1vZHVsZXMgZm9yIGRpc3RyaWJ1dGlvbi4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgTWFrZU1ha2VyIGNhbiBiZSBmb3VuZCBpbiAiUHJvZ3JhbW1pbmcgUGVybCwgMm5kIGVkLiIgYnkgTGFycnkgV2FsbCwgVG9tIENocmlzdGlhbnNlbiwgYW5kIFJhbmRhbCBTY2h3YXJ0ei48cD4KLTxhIG5hbWU9Im4yMSI+PC9hPjxoMz4gQnVpbGRpbmcgYSBzdGF0aWMgdmVyc2lvbiBvZiBQZXJsPC9oMz4KLUlmIHlvdSBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBsb2FkaW5nLCBvciBpZiB5b3UndmUgdHJpZWQgdG8gdXNlIGl0IHdpdGhvdXQgc3VjY2VzcywgeW91IGNhbiBidWlsZCBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBQZXJsIGludGVycHJldGVyIHdpdGggeW91ciBTV0lHIGV4dGVuc2lvbnMgYWRkZWQgdG8gaXQuIFRvIGJ1aWxkIGEgc3RhdGljIGV4dGVuc2lvbiwgeW91IGZpcnN0IG5lZWQgdG8gaW52b2tlIFNXSUcgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1wZXJsNSAtc3RhdGljIGV4YW1wbGUuaQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1CeSBkZWZhdWx0IFNXSUcgaW5jbHVkZXMgY29kZSBmb3IgZHluYW1pYyBsb2FkaW5nLCBidXQgdGhlIDx0dD4tc3RhdGljPC90dD4gb3B0aW9uIHRha2VzIGl0IG91dC48cD4KLTxwPgotTmV4dCwgeW91IHdpbGwgbmVlZCB0byBzdXBwbHkgYSA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyB5b3VyIGV4dGVuc2lvbiBhbmQgc3RhcnRzIHRoZSBQZXJsIGludGVycHJldGVyLiBXaGlsZSwgdGhpcyBtYXkgc291bmQgZGF1bnRpbmcsIFNXSUcgY2FuIGRvIHRoaXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5IGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSVtb2R1bGUgZXhhbXBsZQotCi1leHRlcm4gZG91YmxlIE15X3ZhcmlhYmxlOwotZXh0ZXJuIGludCBmYWN0KGludCk7Ci0KLS8vIEluY2x1ZGUgY29kZSBmb3IgcmVidWlsZGluZyBQZXJsCi0laW5jbHVkZSBwZXJsbWFpbi5pCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBzYW1lIHRoaW5nIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgcnVubmluZyBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcGVybDUgLXN0YXRpYyAtbHBlcmxtYWluLmkgZXhhbXBsZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+cGVybWFpbi5pPC90dD4gZmlsZSBpbnNlcnRzIFBlcmwncyA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24gaW50byB0aGUgd3JhcHBlciBjb2RlIGFuZCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVzIHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUuIElmIHlvdSBqdXN0IHdhbnQgdG8gbWFrZSBhIHF1aWNrIGEgZGlydHkgbW9kdWxlLCB0aGlzIG1heSBiZSB0aGUgZWFzaWVzdCB3YXkuIEJ5IGRlZmF1bHQsIHRoZSA8dHQ+cGVybG1haW4uaTwvdHQ+IGNvZGUgZG9lcyBub3QgaW5pdGlhbGl6ZSBhbnkgb3RoZXIgUGVybCBleHRlbnNpb25zLiBJZiB5b3UgbmVlZCB0byB1c2Ugb3RoZXIgcGFja2FnZXMsIHlvdSB3aWxsIG5lZWQgdG8gbW9kaWZ5IGl0IGFwcHJvcHJpYXRlbHkuIFlvdSBjYW4gZG8gdGhpcyBieSBqdXN0IGNvcHlpbmcgPHR0PnBlcmxtYWluLmk8L3R0PiBvdXQgb2YgdGhlIFNXSUcgbGlicmFyeSwgcGxhY2luZyBpdCBpbiB5b3VyIG93biBkaXJlY3RvcnksICBhbmQgbW9kaWZ5aW5nIGl0IHRvIHN1aXQgeW91ciBwdXJwb3Nlcy48cD4KLTxwPgotVG8gYnVpbGQgeW91ciBuZXcgUGVybCBleGVjdXRhYmxlLCBmb2xsb3cgdGhlIGV4YWN0IHNhbWUgcHJvY2VkdXJlIGFzIGZvciBhIGR5bmFtaWMgbW9kdWxlLCBidXQgY2hhbmdlIHRoZSBsaW5rIGxpbmUgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBsZCBleGFtcGxlLm8gZXhhbXBsZV93cmFwLm8gLUwvdXNyL2xvY2FsL2xpYi9wZXJsNS9hcmNoLzUuMDAzL0NPUkUgXAotCS1scGVybCAtbHNvY2tldCAtbG5zbCAtbG0gLW8gbXlwZXJsCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgd2lsbCBwcm9kdWNlIGEgbmV3IHZlcnNpb24gb2YgUGVybCBjYWxsZWQgPHR0Pm15cGVybDwvdHQ+LiBJdCBzaG91bGQgYmUgZnVuY3Rpb25hbGl0eSBpZGVudGljYWwgdG8gUGVybCB3aXRoIHlvdXIgQy9DKysgZXh0ZW5zaW9uIGFkZGVkIHRvIGl0LiAgRGVwZW5kaW5nIG9uIHlvdXIgbWFjaGluZSwgeW91IG1heSBuZWVkIHRvIGxpbmsgd2l0aCBhZGRpdGlvbmFsIGxpYnJhcmllcyBzdWNoIGFzIDx0dD4tbHNvY2tldCwgLWxuc2wsIC1sZGw8L3R0PiwgZXRjLi4uPHA+Ci08YSBuYW1lPSJuMjIiPjwvYT48aDM+IENvbXBpbGF0aW9uIHByb2JsZW1zIGFuZCBjb21waWxpbmcgd2l0aCBDKys8L2gzPgotSW4gc29tZSBjYXNlcywgeW91IG1heSBnZXQgYWxvdCBvZiBlcnJvciBtZXNzYWdlcyBhYm91dCB0aGUgYDx0dD5ib29sPC90dD4nIGRhdGF0eXBlIHdoZW4gY29tcGlsaW5nIGEgU1dJRyBtb2R1bGUuIElmIHlvdSBleHBlcmllbmNlIHRoaXMgcHJvYmxlbSwgeW91IGNhbiB0cnkgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5Vc2UgPHR0Pi1ESEFTX0JPT0w8L3R0PiB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyIGNvZGUKLTxsaT5PciB1c2UgPHR0Pi1EYm9vbD1jaGFyPC90dD4gd2hlbiBjb21waWxpbmcuCi08L3VsPgotPHA+Ci1Db21waWxpbmcgZHluYW1pYyBtb2R1bGVzIGZvciBDKysgaXMgYWxzbyBhIHRyaWNreSBidXNpbmVzcy4gIFdoZW4gY29tcGlsaW5nIEMrKyBtb2R1bGVzLCB5b3UgbWF5IG5lZWQgdG8gbGluayB1c2luZyB0aGUgQysrIGNvbXBpbGVyIHN1Y2ggYXMgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyBjKysgLXNoYXJlZCBleGFtcGxlX3dyYXAubyBleGFtcGxlLm8gLW8gZXhhbXBsZS5zbwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JdCBtYXkgYWxzbyBiZSBuZWNlc3NhcnkgdG8gbGluayBhZ2FpbnN0IHRoZSA8dHQ+bGliZ2NjLmE8L3R0PiwgPHR0PmxpYmcrKy5hPC90dD4sIGFuZCA8dHQ+bGlic3RkYysrLmE8L3R0PiBsaWJyYXJpZXMgKGFzc3VtaW5nIGcrKykuIEMrKyBtYXkgYWxzbyBjb21wbGFpbiBhYm91dCBvbmUgbGluZSBpbiB0aGUgUGVybCBoZWFkZXIgZmlsZSAiPHR0PnBlcmwuaDwvdHQ+IiBhbmQgdGhlIGludmFsaWQgdXNlIG9mIHRoZSAiZXhwbGljaXQiIGtleXdvcmQuIFRvIHdvcmsgYXJvdW5kIHRoaXMgcHJvYmxlbSwgcHV0IHRoZSBvcHRpb24gPHR0Pi1EZXhwbGljaXQ9PC90dD4gaW4geW91ciBjb21waWxlciBmbGFncy48cD4KLTxwPgotSWYgYWxsIGVsc2UgZmFpbHMsIHB1dCBvbiB5b3VyIHdpemFyZCBjYXAgYW5kIHN0YXJ0IGxvb2tpbmcgYXJvdW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuICBPbmNlIHlvdSd2ZSBmaWd1cmVkIG91dCBob3cgdG8gZ2V0IG9uZSBtb2R1bGUgdG8gY29tcGlsZSwgeW91IGNhbiBjb21waWxlIGp1c3QgYWJvdXQgYWxsIG90aGVyIG1vZHVsZXMuPHA+Ci08YSBuYW1lPSJuMiI+PC9hPjxoMj4gQnVpbGRpbmcgUGVybCBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2gyPgotQnVpbGRpbmcgYSBTV0lHIGV4dGVuc2lvbiB0byBQZXJsIHVuZGVyIFdpbmRvd3MgOTUvTlQgaXMgcm91Z2hseSBzaW1pbGFyIHRvIHRoZSBwcm9jZXNzIHVzZWQgd2l0aCBVbml4LiAgIE5vcm1hbGx5LCB5b3Ugd2lsbCB3YW50IHRvIHByb2R1Y2UgYSBETEwgdGhhdCBjYW4gYmUgbG9hZGVkIGludG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIuICAgIFRoaXMgc2VjdGlvbiBhc3N1bWVzIHlvdSBhcmUgdXNpbmcgU1dJRyB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIDQueCBhbHRob3VnaCB0aGUgcHJvY2VkdXJlIG1heSBiZSBzaW1pbGFyIHdpdGggb3RoZXIgY29tcGlsZXJzLiAgIFNXSUcgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBBY3RpdmVXYXJlIFBlcmwgZm9yIFdpbjMyIHBvcnQgYW5kIFBlcmwgNS4wMDQuICBJZiB1c2luZyB0aGUgQWN0aXZlV2FyZSB2ZXJzaW9uLCBhbGwgUGVybCBleHRlbnNpb25zIG11c3QgYmUgY29tcGlsZWQgdXNpbmcgQysrITxwPgotPGEgbmFtZT0ibjIzIj48L2E+PGgzPiBSdW5uaW5nIFNXSUcgZnJvbSBEZXZlbG9wZXIgU3R1ZGlvPC9oMz4KLUlmIHlvdSBhcmUgZGV2ZWxvcGluZyB5b3VyIGFwcGxpY2F0aW9uIHdpdGhpbiBNaWNyb3NvZnQgZGV2ZWxvcGVyIHN0dWRpbywgU1dJRyBjYW4gYmUgaW52b2tlZCBhcyBhIGN1c3RvbSBidWlsZCBvcHRpb24uICAgICAgVGhlIHByb2Nlc3Mgcm91Z2hseSByZXF1aXJlcyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5PcGVuIHVwIGEgbmV3IHdvcmtzcGFjZSBhbmQgdXNlIHRoZSBBcHBXaXphcmQgdG8gc2VsZWN0IGEgRExMIHByb2plY3QuCi08bGk+QWRkIGJvdGggdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgKHRoZSAuaSBmaWxlKSwgYW55IHN1cHBvcnRpbmcgQyBmaWxlcywgYW5kIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIGZpbGUgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYnkgU1dJRyAoaWUuIDx0dD5leGFtcGxlX3dyYXAuYzwvdHQ+KS4gICBOb3RlIDogSWYgdXNpbmcgQysrLCBjaG9vc2UgYSBkaWZmZXJlbnQgc3VmZml4IGZvciB0aGUgd3JhcHBlciBmaWxlIHN1Y2ggYXMgPHR0PmV4YW1wbGVfd3JhcC5jeHg8L3R0Pi4gRG9uJ3Qgd29ycnkgaWYgdGhlIHdyYXBwZXIgZmlsZSBkb2Vzbid0IGV4aXN0IHlldC0tRGV2ZWxvcGVyIHN0dWRpbyB3aWxsIGtlZXAgYSByZWZlcmVuY2UgdG8gaXQgYXJvdW5kLgotPGxpPlNlbGVjdCB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZSBhbmQgZ28gdG8gdGhlIHNldHRpbmdzIG1lbnUuICAgVW5kZXIgc2V0dGluZ3MsIHNlbGVjdCB0aGUgIkN1c3RvbSBCdWlsZCIgb3B0aW9uLgotPGxpPkVudGVyICJTV0lHIiBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQuCi08bGk+RW50ZXIgIjx0dD5zd2lnIC1wZXJsNSAtbyAkKFByb2pEaXIpXCQoSW5wdXROYW1lKV93cmFwLmN4eCAkKElucHV0UGF0aCk8L3R0PiIgaW4gdGhlICJCdWlsZCBjb21tYW5kKHMpIGZpZWxkIgotPGxpPkVudGVyICI8dHQ+JChQcm9qRGlyKVwkKElucHV0TmFtZSlfd3JhcC5jPC90dD54eCIgaW4gdGhlICJPdXRwdXQgZmlsZXMocykgZmllbGQiLgotPGxpPk5leHQsIHNlbGVjdCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBlbnRpcmUgcHJvamVjdCBhbmQgZ28gdG8gIkMrKzpQcmVwcm9jZXNzb3IiLiBBZGQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIHlvdXIgUGVybCA1IGluc3RhbGxhdGlvbiB1bmRlciAiQWRkaXRpb25hbCBpbmNsdWRlIGRpcmVjdG9yaWVzIi4KLTxsaT5EZWZpbmUgdGhlIHN5bWJvbHMgV0lOMzIgYW5kIE1TV0lOMzIgdW5kZXIgcHJlcHJvY2Vzc29yIG9wdGlvbnMuICBJZiB1c2luZyB0aGUgQWN0aXZlV2FyZSBwb3J0LCBhbHNvIGRlZmluZSB0aGUgc3ltYm9sIFBFUkxfT0JKRUNULiAgIE5vdGUgdGhhdCBhbGwgZXh0ZW5zaW9ucyB0byB0aGUgQWN0aXZlV2FyZSBwb3J0IG11c3QgYmUgY29tcGlsZWQgd2l0aCB0aGUgQysrIGNvbXBpbGVyIHNpbmNlIFBlcmwgaGFzIGJlZW4gZW5jYXBzdWxhdGVkIGluIGEgQysrIGNsYXNzLgotPGxpPkZpbmFsbHksIHNlbGVjdCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBlbnRpcmUgcHJvamVjdCBhbmQgZ28gdG8gIkxpbmsgT3B0aW9ucyIuICBBZGQgdGhlIFBlcmwgbGlicmFyeSAgZmlsZSB0byB5b3VyIGxpbmsgbGlicmFyaWVzLiAgRm9yIGV4YW1wbGUgInBlcmwubGliIi4gIEFsc28sIHNldCB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgeW91ciBQZXJsIG1vZHVsZSAoaWUuIGV4YW1wbGUuZGxsKS4KLTxsaT5CdWlsZCB5b3VyIHByb2plY3QuCi08L3VsPgotPHA+Ci1Ob3csIGFzc3VtaW5nIGFsbCB3ZW50IHdlbGwsIFNXSUcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGludm9rZWQgd2hlbiB5b3UgYnVpbGQgeW91ciBwcm9qZWN0LiAgQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgaW50ZXJmYWNlIGZpbGUgd2lsbCByZXN1bHQgaW4gU1dJRyBiZWluZyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8gcHJvZHVjZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSB3cmFwcGVyIGZpbGUuICBUbyBydW4geW91ciBuZXcgUGVybCBleHRlbnNpb24sIHNpbXBseSBydW4gUGVybCBhbmQgdXNlIHRoZSB1c2UgY29tbWFuZCBhcyBub3JtYWwuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4KLURPUyAmZ3Q7IHBlcmwKLXVzZSBleGFtcGxlOwotJGEgPSBleGFtcGxlOjpmYWN0KDQpOwotcHJpbnQgIiRhXG4iOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JdCBhcHBlYXJzIHRoYXQgRExMJ3Mgd2lsbCB3b3JrIGlmIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gICBUbyBtYWtlIGEgZ2VuZXJhbGx5IERMTCBhdmFpbGFibGUsIGl0IHNob3VsZCBiZSBwbGFjZSAoYWxvbmcgd2l0aCBpdHMgc3VwcG9ydCBmaWxlcykgaW4gdGhlIDx0dD5MaWJcQXV0b1xbbW9kdWxlXSA8L3R0PnN1Yi1kaXJlY3Rvcnkgb2YgdGhlIFBlcmwgZGlyZWN0b3J5IHdoZXJlIFttb2R1bGVdIGlzIHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlLjxwPgotPGEgbmFtZT0ibjI0Ij48L2E+PGgzPiBVc2luZyBOTUFLRTwvaDM+Ci1BbHRlcm5hdGl2ZWx5LCBTV0lHIGV4dGVuc2lvbnMgY2FuIGJlIGJ1aWx0IGJ5IHdyaXRpbmcgYSBNYWtlZmlsZSBmb3IgTk1BS0UuICAgVG8gZG8gdGhpcywgbWFrZSBzdXJlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIE1TVkMrKyBhcmUgYXZhaWxhYmxlIGFuZCB0aGUgTVNWQysrIHRvb2xzIGFyZSBpbiB5b3VyIHBhdGguICAgTm93LCBqdXN0IHdyaXRlIGEgc2hvcnQgTWFrZWZpbGUgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIE1ha2VmaWxlIGZvciBidWlsZGluZyBhbiBBY3RpdmVXYXJlIFBlcmwgZm9yIFdpbjMyIGV4dGVuc2lvbgotIyBOb3RlIDogRXh0ZW5zaW9ucyBtdXN0IGJlIGNvbXBpbGVkIHdpdGggdGhlIEMrKyBjb21waWxlciEKLQotU1JDUyAgICAgICAgICA9IGV4YW1wbGUuY3h4Ci1JRklMRSAgICAgICAgID0gZXhhbXBsZQotSU5URVJGQUNFICAgICA9ICQoSUZJTEUpLmkKLVdSQVBGSUxFICAgICAgPSAkKElGSUxFKV93cmFwLmN4eAotCi0jIExvY2F0aW9uIG9mIHRoZSBWaXN1YWwgQysrIHRvb2xzICgzMiBiaXQgYXNzdW1lZCkKLQotVE9PTFMgICAgICAgICA9IGM6XG1zZGV2Ci1UQVJHRVQgICAgICAgID0gZXhhbXBsZS5kbGwKLUNDICAgICAgICAgICAgPSAkKFRPT0xTKVxiaW5cY2wuZXhlCi1MSU5LICAgICAgICAgID0gJChUT09MUylcYmluXGxpbmsuZXhlCi1JTkNMVURFMzIgICAgID0gLUkkKFRPT0xTKVxpbmNsdWRlCi1NQUNISU5FICAgICAgID0gSVg4NgotCi0jIEMgTGlicmFyeSBuZWVkZWQgdG8gYnVpbGQgYSBETEwKLQotRExMSUJDICAgICAgICA9IG1zdmNydC5saWIgb2xkbmFtZXMubGliICAKLQotIyBXaW5kb3dzIGxpYnJhcmllcyB0aGF0IGFyZSBhcHBhcmVudGx5IG5lZWRlZAotV0lOTElCICAgICAgICA9IGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgY29tZGxnMzIubGliIAotd2luc3Bvb2wubGliCi0KLSMgTGlicmFyaWVzIGNvbW1vbiB0byBhbGwgRExMcwotTElCUyAgICAgICAgICA9ICQoRExMSUJDKSAkKFdJTkxJQikgCi0KLSMgTGlua2VyIG9wdGlvbnMKLUxPUFQgICAgICA9IC1kZWJ1ZzpmdWxsIC1kZWJ1Z3R5cGU6Y3YgL05PREVGQVVMVExJQiAvUkVMRUFTRSAvTk9MT0dPIC8KLU1BQ0hJTkU6JChNQUNISU5FKSAtZW50cnk6X0RsbE1haW5DUlRTdGFydHVwQDEyIC1kbGwKLQotIyBDIGNvbXBpbGVyIGZsYWdzCi0KLUNGTEFHUyAgICAgICAgPSAvWjcgL09kIC9jIC9XMyAvbm9sb2dvCi0KLSMgUGVybCA1LjAwNAotUEVSTF9JTkNMVURFID0gLUlkOlxwZXJsNVxsaWJcQ09SRQotUEVSTExJQiAgICAgID0gZDpccGVybDVcbGliXENPUkVccGVybC5saWIKLVBFUkxGTEFHUyAgICA9IC9EV0lOMzIgL0RNU1dJTjMyIC9EV0lOMzJJT19JU19TVERJTwotCi0jIEFjdGl2ZVdhcmUKLVBFUkxfSU5DTFVERSAgPSAtSWQ6XHBlcmwgLUlkOlxwZXJsXGluYyAKLVBFUkxfTElCICAgICAgICA9IGQ6XHBlcmxcUmVsZWFzZVxwZXJsMzAwLmxpYgotUEVSTEZMQUdTID0gL0RXSU4zMiAvRE1TV0lOMzIgL0RQRVJMX09CSkVDVAotCi1wZXJsOjoKLQkuLlwuLlxzd2lnIC1wZXJsNSAtbyAkKFdSQVBGSUxFKSAkKElOVEVSRkFDRSkKLQkkKENDKSAkKENGTEFHUykgJChQRVJMRkxBR1MpICQoUEVSTF9JTkNMVURFKSAkKFNSQ1MpICQoV1JBUEZJTEUpCi0Jc2V0IExJQj0kKFRPT0xTKVxsaWIKLQkkKExJTkspICQoTE9QVCkgLW91dDpleGFtcGxlLmRsbCAkKExJQlMpICQoUEVSTExJQikgZXhhbXBsZS5vYmogCi1leGFtcGxlX3dyYXAub2JqCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRvIGJ1aWxkIHRoZSBleHRlbnNpb24sIHJ1biBOTUFLRSAobm90ZSB0aGF0IHlvdSBtYXkgYmUgdG8gcnVuIDx0dD52Y3ZhcnMzMjwvdHQ+IGJlZm9yZSBkb2luZyB0aGlzIHRvIHNldCB0aGUgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLiBUaGlzIGlzIGEgc2ltcGxpc3RpYyBNYWtlZmlsZSwgYnV0IGhvcGVmdWxseSBpdHMgZW5vdWdoIHRvIGdldCB5b3Ugc3RhcnRlZC4gICA8cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBNb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNsYXNzZXM8L2gyPgotV2hlbiB5b3UgY3JlYXRlIGEgU1dJRyBleHRlbnNpb24sIGV2ZXJ5dGhpbmcgZ2V0cyB0aHJvd24gdG9nZXRoZXIgaW50byBhIHNpbmdsZSBQZXJsNSBtb2R1bGUuIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUuIFRvIHVzZSB0aGUgbW9kdWxlLCBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHBlcmw1Ci11c2UgZXhhbXBsZTsgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIHRoZSBleGFtcGxlIG1vZHVsZQotcHJpbnQgZXhhbXBsZTo6ZmFjdCg0KSwiXG4iICAgICAgICMgQ2FsbCBhIGZ1bmN0aW9uIGluIGl0Ci0yNAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Vc3VhbGx5LCBhIG1vZHVsZSBjb25zaXN0cyBvZiBhIGNvbGxlY3Rpb24gb2YgY29kZSB0aGF0IGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBzaW5nbGUgZmlsZS4gQSBwYWNrYWdlLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgdGhlIFBlcmwgZXF1aXZhbGVudCBvZiBhIG5hbWVzcGFjZS4gQSBwYWNrYWdlIGlzIGFsb3QgbGlrZSBhIG1vZHVsZSwgZXhjZXB0IHRoYXQgaXQgaXMgaW5kZXBlbmRlbnQgb2YgZmlsZXMuIEFueSBudW1iZXIgb2YgZmlsZXMgbWF5IGJlIHBhcnQgb2YgdGhlIHNhbWUgcGFja2FnZS0tb3IgYSBwYWNrYWdlIG1heSBiZSBicm9rZW4gdXAgaW50byBhIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBpZiB5b3UgcHJlZmVyIHRvIHRoaW5rIGFib3V0IGl0IGluIHRoaXMgd2F5LjxwPgotPHA+Ci1CeSBkZWZhdWx0LCBTV0lHIGluc3RhbGxzIGl0cyBmdW5jdGlvbnMgaW50byBhIHBhY2thZ2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBtb2R1bGUuIFRoaXMgY2FuIGJlIGNoYW5nZWQgYnkgZ2l2aW5nIFNXSUcgdGhlIC1wYWNrYWdlIG9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1wZXJsNSAtcGFja2FnZSBGb29CYXIgZXhhbXBsZS5pCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoaXMgY2FzZSwgd2Ugc3RpbGwgY3JlYXRlIGEgbW9kdWxlIGNhbGxlZCBgPHR0PmV4YW1wbGU8L3R0PicsIGJ1dCBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGF0IG1vZHVsZSB3aWxsIGJlIGluc3RhbGxlZCBpbnRvIHRoZSBwYWNrYWdlIGA8dHQ+Rm9vQmFyPC90dD4uJyBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIGV4YW1wbGU7ICAgICAgICAgICAgICAgICAgICAgICAjIExvYWQgdGhlIG1vZHVsZSBsaWtlIGJlZm9yZQotcHJpbnQgRm9vQmFyOjpmYWN0KDQpLCJcbiI7ICAgICAgICAjIENhbGwgYSBmdW5jdGlvbiBpbiBwYWNrYWdlIEZvb0JhcgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1QZXJsIHN1cHBvcnRzIG9iamVjdCBvcmllbnRlZCBwcm9ncmFtbWluZyB1c2luZyBwYWNrYWdlcy4gQSBwYWNrYWdlIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgbmFtZXNwYWNlIGZvciBhIGNsYXNzIGNvbnRhaW5pbmcgbWV0aG9kcyBhbmQgZGF0YS4gVGhlIHJlYWRlciBpcyB3ZWxsIGFkdmlzZWQgdG8gY29uc3VsdCAiUHJvZ3JhbW1pbmcgUGVybCwgMm5kIEVkLiIgYnkgV2FsbCwgQ2hyaXN0aWFuc2VuLCBhbmQgU2Nod2FydHogZm9yIG1vc3Qgb2YgdGhlIGdvcnkgZGV0YWlscy4gPHA+Ci08YSBuYW1lPSJuNCI+PC9hPjxoMj4gQmFzaWMgUGVybCBpbnRlcmZhY2U8L2gyPgotPGEgbmFtZT0ibjI1Ij48L2E+PGgzPiBGdW5jdGlvbnM8L2gzPgotQyBmdW5jdGlvbnMgYXJlIGNvbnZlcnRlZCBpbnRvIG5ldyBQZXJsIGNvbW1hbmRzIChvciBzdWJyb3V0aW5lcykuIERlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBhbHNvIGFsbG93ZWQuICAgQW4gaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLWludCBmb28oaW50IGEpOwotZG91YmxlIGJhciAoZG91YmxlLCBkb3VibGUgYiA9IDMuMCk7Ci0uLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2lsbCBiZSB1c2VkIGluIFBlcmwgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51c2UgZXhhbXBsZTsKLSRhID0gJmFtcDtleGFtcGxlOjpmb28oMik7Ci0kYiA9ICZhbXA7ZXhhbXBsZTo6YmFyKDMuNSwtMS41KTsKLSRjID0gJmFtcDtleGFtcGxlOjpiYXIoMy41KTsgICAgICAgICAgICAjIFVzZSBkZWZhdWx0IGFyZ3VtZW50IGZvciAybmQgcGFyYW1ldGVyCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU9rYXksIHRoaXMgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4uLmVub3VnaCBzYWlkLjxwPgotPGEgbmFtZT0ibjI2Ij48L2E+PGgzPiBHbG9iYWwgdmFyaWFibGVzPC9oMz4KLUdsb2JhbCB2YXJpYWJsZXMgYXJlIGhhbmRsZWQgdXNpbmcgcHVyZSBtYWdpYy0td2VsbCwgUGVybCdzIG1hZ2ljIHZhcmlhYmxlIG1lY2hhbmlzbSB0aGF0IGlzLiAgSW4gYSBudXRzaGVsbCwgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBjZXJ0YWluIFBlcmwgdmFyaWFibGVzICJtYWdpY2FsIiBieSBhdHRhY2hpbmcgbWV0aG9kcyBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB2YWx1ZXMgYW1vbmcgb3RoZXIgdGhpbmdzLiAgIFNXSUcgZ2VuZXJhdGVzIGEgcGFpciBvZiBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBDIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGF0dGFjaGVzIHRoZW0gdG8gYSBQZXJsIHZhcmlhYmxlIG9mIHRoZSBzYW1lIG5hbWUuICBUaHVzLCBhbiBpbnRlcmZhY2UgbGlrZSB0aGlzIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZTsKLS4uLgotZG91YmxlIFNwYW07Ci0uLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotaXMgYWNjZXNzZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIGV4YW1wbGU7Ci1wcmludCAkZXhhbXBsZTo6U3BhbSwiXG4iOwotJGV4YW1wbGU6OlNwYW0gPSAkZXhhbXBsZTo6U3BhbSArIDQKLSMgLi4uIGV0YyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU1dJRyBzdXBwb3J0cyBnbG9iYWwgdmFyaWFibGVzIG9mIGFsbCBDIGRhdGF0eXBlcyBpbmNsdWRpbmcgcG9pbnRlcnMgYW5kIGNvbXBsZXggb2JqZWN0cy48cD4KLTxhIG5hbWU9Im4yNyI+PC9hPjxoMz4gQ29uc3RhbnRzPC9oMz4KLUNvbnN0YW50cyBhcmUgY3JlYXRlZCBhcyByZWFkLW9ubHkgbWFnaWNhbCB2YXJpYWJsZXMgYW5kIG9wZXJhdGUgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIuPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IFBvaW50ZXJzPC9oMz4KLVNXSUcgcmVwcmVzZW50cyBwb2ludGVycyBhcyBibGVzc2VkIHJlZmVyZW5jZXMuICBBIGJsZXNzZWQgcmVmZXJlbmNlIGlzIHRoZSBzYW1lIGFzIGEgUGVybCByZWZlcmVuY2UgZXhjZXB0IHRoYXQgaXQgaGFzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gaXQgaW5kaWNhdGluZyB3aGF0IGtpbmQgb2YgcmVmZXJlbmNlIGl0IGlzLiBUaGF0IGlzLCBpZiB5b3UgaGF2ZSBhIEMgZGVjbGFyYXRpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5NYXRyaXggKm5ld19NYXRyaXgoaW50IG4sIGludCBtKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU1dJRyB3aWxsIHJldHVybiBhIHZhbHVlIGFzIGlmIHlvdSBoYWQgZG9uZSB0aGlzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0kcHRyID0gbmV3X01hdHJpeChpbnQgbiwgaW50IG0pOyAgICAgIyBTYXZlIHBvaW50ZXIgcmV0dXJuIHJlc3VsdAotYmxlc3MgJHB0ciwgIk1hdHJpeFB0ciI7ICAgICAgICAgICAgICMgQmxlc3MgaXQgYXMgYSBNYXRyaXhQdHIKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU1dJRyB1c2VzIHRoZSAiYmxlc3NpbmciIHRvIGNoZWNrIHRoZSBkYXRhdHlwZSBvZiB2YXJpb3VzIHBvaW50ZXJzLiAgIEluIHRoZSBldmVudCBvZiBhIG1pc21hdGNoLCBhbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuPHA+Ci08cD4KLVRvIGNoZWNrIHRvIHNlZSBpZiBhIHZhbHVlIGlzIHRoZSBOVUxMIHBvaW50ZXIsIHVzZSB0aGUgPHR0PmRlZmluZWQoKTwvdHQ+IGNvbW1hbmQgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWlmIChkZWZpbmVkKCRwdHIpKSB7Ci0JcHJpbnQgIk5vdCBhIE5VTEwgcG9pbnRlci4iOwotfSBlbHNlIHsKLQlwcmludCAiSXMgYSBOVUxMIHBvaW50ZXIuIjsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVG8gY3JlYXRlIGEgTlVMTCBwb2ludGVyLCB5b3Ugc2hvdWxkIHBhc3MgdGhlIDx0dD51bmRlZiA8L3R0PnZhbHVlIHRvIGEgZnVuY3Rpb24uICAgPHA+Ci08cD4KLVRoZSAidmFsdWUiIG9mIGEgUGVybCByZWZlcmVuY2UgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB1bmRlcmx5aW5nIEMgcG9pbnRlciB0aGF0IFNXSUcgd3JhcHBlciBmdW5jdGlvbnMgcmV0dXJuLiAgICBTdXBwb3NlIHRoYXQgPHR0PiRhPC90dD4gYW5kIDx0dD4kYjwvdHQ+IGFyZSB0d28gcmVmZXJlbmNlcyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lIEMgb2JqZWN0LiAgIEluIGdlbmVyYWwsIDx0dD4kYTwvdHQ+IGFuZCA8dHQ+JGI8L3R0PiB3aWxsIGJlIGRpZmZlcmVudC0tc2luY2UgdGhleSBhcmUgZGlmZmVyZW50IHJlZmVyZW5jZXMuICAgVGh1cywgaXQgaXMgYSBtaXN0YWtlIHRvIGNoZWNrIHRoZSBlcXVhbGl0eSBvZiA8dHQ+JGEgPC90dD5hbmQgPHR0PiRiPC90dD4gdG8gY2hlY2sgdGhlIGVxdWFsaXR5IG9mIHR3byBDIHBvaW50ZXJzLiAgVGhlIGNvcnJlY3QgbWV0aG9kIHRvIGNoZWNrIGVxdWFsaXR5IG9mIEMgcG9pbnRlcnMgaXMgdG8gZGVyZWZlcmVuY2UgdGhlbSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pZiAoJCRhID09ICQkYikgewotCXByaW50ICJhIGFuZCBiIHBvaW50IHRvIHRoZSBzYW1lIHRoaW5nIGluIEMiOwotfSBlbHNlIHsKLQlwcmludCAiYSBhbmQgYiBwb2ludCB0byBkaWZmZXJlbnQgb2JqZWN0cy4iOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JdCBpcyBlYXN5IHRvIGdldCBidXJuZWQgYnkgIHJlZmVyZW5jZXMgaW4gbW9yZSBzdWJ0bGUgd2F5cy4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHN0b3JpbmcgYSBoYXNoIHRhYmxlIG9mIG9iamVjdHMsIGl0IG1heSBiZSBiZXN0IHRvIHVzZSB0aGUgYWN0dWFsIEMgcG9pbnRlciB2YWx1ZSByYXRoZXIgdGhhbiB0aGUgUGVybCByZWZlcmVuY2UgYXMgYSBrZXkuICBTaW5jZSBlYWNoIFBlcmwgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIEMgb2JqZWN0IG1heSBiZSBkaWZmZXJlbnQsIGl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gZmluZCBhbnl0aGluZyBpbiB0aGUgaGFzaCB3aXRob3V0IHRoaXMuIEFzIGEgZ2VuZXJhbCBydWxlLCB0aGUgYmVzdCB3YXkgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCByZWZlcmVuY2VzIGlzIHRvIG1ha2Ugc3VyZSBoYXNoIHRhYmxlcywgY29tcGFyaXNvbnMsIGFuZCBvdGhlciBwb2ludGVyIG9wZXJhdGlvbnMgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIChpZS4gPHR0PiQkYTwvdHQ+KSwgbm90IHRoZSByZWZlcmVuY2UgaXRzZWxmLjxwPgotPGEgbmFtZT0ibjI5Ij48L2E+PGgzPiBTdHJ1Y3R1cmVzIGFuZCBDKysgY2xhc3NlczwvaDM+Ci1Gb3Igc3RydWN0dXJlcyBhbmQgY2xhc3NlcywgU1dJRyBwcm9kdWNlcyBhIHNldCBvZiBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIG1lbWJlciBmdW5jdGlvbnMgYW5kIG1lbWJlciBkYXRhLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgdmVjdG9yCi0KLWNsYXNzIFZlY3RvciB7Ci1wdWJsaWM6Ci0JZG91YmxlIHgseSx6OwotCVZlY3RvcigpOwotCX5WZWN0b3IoKTsKLQlkb3VibGUgbWFnbml0dWRlKCk7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGdldHMgdHVybmVkIGludG8gdGhlIGZvbGxvd2luZyBjb2xsZWN0aW9uIG9mIFBlcmwgZnVuY3Rpb25zIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+dmVjdG9yOjpWZWN0b3JfeF9nZXQoJG9iaik7Ci12ZWN0b3I6OlZlY3Rvcl94X3NldCgkb2JqLCR4KTsKLXZlY3Rvcjo6VmVjdG9yX3lfZ2V0KCRvYmopOwotdmVjdG9yOjpWZWN0b3JfeV9zZXQoJG9iaiwkeSk7Ci12ZWN0b3I6OlZlY3Rvcl96X2dldCgkb2JqKTsKLXZlY3Rvcjo6VmVjdG9yX3pfc2V0KCRvYmosJHopOwotdmVjdG9yOjpuZXdfVmVjdG9yKCk7Ci12ZWN0b3I6OmRlbGV0ZV9WZWN0b3IoJG9iaik7Ci12ZWN0b3I6OlZlY3Rvcl9tYWduaXR1ZGUoJG9iaik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHVzZSB0aGUgY2xhc3MsIHNpbXBseSB1c2UgdGhlc2UgZnVuY3Rpb25zLiAgQXMgaXQgdHVybnMgb3V0LCBTV0lHIGhhcyBhIG1lY2hhbmlzbSBmb3IgY3JlYXRpbmcgc2hhZG93IGNsYXNzZXMgdGhhdCBoaWRlcyB0aGVzZSBmdW5jdGlvbnMgYW5kIHVzZXMgYW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSBpbnN0ZWFkLS1rZWVwIHJlYWRpbmcuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gQSBzaW1wbGUgUGVybCBleGFtcGxlPC9oMj4KLUluIHRoZSBuZXh0IGZldyBzZWN0aW9ucywgdXNlIG9mIHRoZSBQZXJsNSBtb2R1bGUgd2lsbCBiZSBpbGx1c3RyYXRlZCB0aHJvdWdoIGEgc2VyaWVzIG9mIGluY3JlYXNpbmdseSBjb21wbGV4IGV4YW1wbGVzLiBJbiB0aGUgZXhhbXBsZSwgd2Ugd2lsbCB3cml0ZSBzb21lIHNpbXBsZSBncmFwaCBhbGdvcml0aG1zIHRvIGlsbHVzdHJhdGUgaG93IEMgYW5kIFBlcmwgY2FuIGludGVyYWN0IHdpdGggZWFjaCBvdGhlci4gPHA+Ci08YSBuYW1lPSJuMzAiPjwvYT48aDM+IEdyYXBoczwvaDM+Ci1BIGRpcmVjdGVkIGdyYXBoIGlzIHNpbXBseSBhIGNvbGxlY3Rpb24gb2Ygbm9kZXMgKG9yIHZlcnRpY2VzKSB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlciBieSBhIGNvbGxlY3Rpb24gb2YgZWRnZXMgOjxwPgotPHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDguMS5wbmciPjwvY2VudGVyPjxwPjxwPgotPHA+Ci1UbyByZXByZXNlbnQgc2ltcGxlIGdyYXBocywgd2UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIEMgZGF0YSBzdHJ1Y3R1cmVzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vKiBGaWxlIDogZ3JhcGguaCAqLwotLyogU2ltcGxlIGRhdGEgc3RydWN0dXJlcyBmb3IgZGlyZWN0ZWQgZ3JhcGggb2YgTm9kZXMgYW5kIEVkZ2VzICovCi0KLXN0cnVjdCBFZGdlOwotdHlwZWRlZiBzdHJ1Y3QgTm9kZSB7Ci0gIGludCAgICAgICAgICAgdjsgICAgICAgICAgICAvKiBWZXJ0ZXggbnVtYmVyICAgICAgICAgICAgICAqLwotICBzdHJ1Y3QgRWRnZSAgKmFkajsgICAgICAgICAgLyogQWRqYWNlbmN5IExpc3QgICAgICAgICAgICAgKi8KLX0gTm9kZTsKLQotdHlwZWRlZiBzdHJ1Y3QgRWRnZSB7Ci0gIE5vZGUgICAgICAgICAgKm5vZGU7ICAgICAgICAvKiBDb25uZWN0aW5nIE5vZGUgICAgICAgICAgICAqLwotICBkb3VibGUgICAgICAgICAgICB3OyAgICAgICAgLyogV2VpZ2h0IChvcHRpb25hbCkgICAgICAgICAgKi8KLSAgc3RydWN0IEVkZ2UgICAqbmV4dDsgICAgICAgIC8qIE5leHQgZWRnZSAgICAgICAgICAgICAgICAgICovCi19IEVkZ2U7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUVhY2ggbm9kZSBjb250YWlucyBhIHVuaXF1ZSBudW1iZXIgdiBmb3IgaWRlbnRpZnlpbmcgaXQsIGFuZCBhIGxpbmtlZCBsaXN0IG9mIG90aGVyIG5vZGVzIHRoYXQgYXJlIG5lYXJieS4gICBUaGlzIGxpbmtlZCBsaXN0IGlzIG1hbmFnZWQgYnkgdGhlIDx0dD5FZGdlPC90dD4gc3RydWN0dXJlLiAgIEFzc29jaWF0ZWQgd2l0aCBlYWNoIGVkZ2UgaXMgYW4gb3B0aW9uYWwgd2VpZ2h0aW5nIGZhY3Rvci4gICAgVGhpcyBjb3VsZCBiZSBzb21ldGhpbmcgbGlrZSBtaWxlcyBiZXR3ZWVuIGNpdGllcywgYmFuZHdpZHRoLCBvciBzb21lIG90aGVyIG51bWVyaWNhbCBwcm9wZXJ0eSBhYm91dCBhIHBhcnRpY3VsYXIgbGluay4gICBPa2F5LCBlbm91Z2ggdGFsayBhYm91dCBkYXRhIHN0cnVjdHVyZXMgZm9yIG5vdy48cD4KLTxwPgotVG8gY29uc3RydWN0IG5vZGVzIGFuZCBhZGQgZWRnZXMsIHdlIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBDIGNvZGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBncmFwaC5jICAgICAgICAgICAqLwotLyogRGlyZWN0ZWQgZ3JhcGggZnVuY3Rpb25zICovCi0KLSNpbmNsdWRlICJncmFwaC5oIgotc3RhdGljIGludCBub2RlX2NvdW50ID0gMDsgICAgICAgICAgLyogTnVtYmVyIG9mIG5vZGVzIGNyZWF0ZWQgKi8KLQotLyogQ3JlYXRlIGEgbmV3IE5vZGUgKi8KLU5vZGUgKm5ld19Ob2RlKCkgewotICBOb2RlICpub2RlOwotICBub2RlID0gKE5vZGUgKikgbWFsbG9jKHNpemVvZihOb2RlKSk7Ci0gIG5vZGUtJmd0O3YgPSBub2RlX2NvdW50Kys7ICAgICAgIC8qIEJ1bXAgdXAgdGhlIGNvdW50ICovCi0gIG5vZGUtJmd0O2FkaiA9IChFZGdlICopIDA7ICAgICAgICAgICAKLSAgcmV0dXJuIG5vZGU7Ci19Ci0KLS8qIEFkZCBhbiAiZWRnZSIgdG8gYW5vdGhlciBub2RlLiAqLwotCi1FZGdlICpOb2RlX2FkZGVkZ2UoTm9kZSAqbXlub2RlLCBOb2RlICpvdGhlcm5vZGUsIGRvdWJsZSB3KSB7Ci0gIEVkZ2UgKmVkZ2U7Ci0gIGVkZ2UgPSAoRWRnZSAqKSBtYWxsb2Moc2l6ZW9mKEVkZ2UpKTsKLSAgZWRnZS0mZ3Q7bm9kZSA9IG90aGVybm9kZTsgICAgICAgIAotICBlZGdlLSZndDt3ID0gdzsKLSAgZWRnZS0mZ3Q7bmV4dCA9IG15bm9kZS0mZ3Q7YWRqOyAgICAvKiBhZGQgdG8gbXkgYWRqYWNlbmN5IGxpc3QgKi8KLSAgbXlub2RlLSZndDthZGogPSBlZGdlOyAgICAgICAgICAgCi0gIHJldHVybiBlZGdlOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMzEiPjwvYT48aDM+IEEgc2ltcGxlIFNXSUcgaW50ZXJmYWNlIGZpbGU8L2gzPgotU28gZmFyLCB0aGUgY29kZSBkb2Vzbid0IGRvIG11Y2gsIGJ1dCBpdCdzIGVub3VnaCB0byB3cmFwIGludG8gUGVybDUgbW9kdWxlLiAgU2luY2UgdGhlIEMgY29kZSBpcyBmYWlybHkgc2ltcGxlIHJpZ2h0IG5vdywgd2UgY2FuIGRvIHRoaXMgYnkgY3JlYXRpbmcgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBncmFwaAotJXsKLSNpbmNsdWRlICJncmFwaC5oIgotJX0KLSVpbmNsdWRlIGdyYXBoLmggICAgICAgICAgICAgLy8gR2V0IHN0cnVjdHVyZSBkZWZpbml0aW9uCi0laW5jbHVkZSBncmFwaC5jICAgICAgICAgICAgIC8vIEdldCBzdXBwb3J0IGZ1bmN0aW9ucwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XZSdsbCBjYWxsIG91ciBtb2R1bGUgImdyYXBoIiBhbmQgc2ltcGx5IHJlYWQgaW4gYm90aCB0aGUgZmlsZXMgPHR0PmdyYXBoLmg8L3R0PiBhbmQgPHR0PmdyYXBoLmM8L3R0PiB0byBidWlsZCBhbiBpbnRlcmZhY2UuICAgPHA+Ci08YSBuYW1lPSJuMzIiPjwvYT48aDM+IFNhbXBsZSBQZXJsIFNjcmlwdDwvaDM+Ci1PbmNlIGNvbXBpbGVkLCB3ZSBjYW4gbm93IHN0YXJ0IHVzaW5nIG91ciBuZXcgbW9kdWxlLiAgIEFsbCBvZiB0aGUgQyBmdW5jdGlvbnMgZm91bmQgaW4gPHR0PmdyYXBoLmg8L3R0PiBhbmQgPHR0PmdyYXBoLmM8L3R0PiBjYW4gYmUgY2FsbGVkIG5vcm1hbGx5IC4gICBFdmVuIHRob3VnaCB3ZSBhcmUgdXNpbmcgcG9pbnRlcnMsIHRoaXMgaXMgbm90IGEgcHJvYmxlbS4gIEhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSBzY3JpcHQgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSMgUGVybCBjb2RlIHRvIHVzZSBvdXIgZ3JhcGggY29kZQotCi11c2UgZ3JhcGg7Ci1wYWNrYWdlIGdyYXBoOwotCi0jIENyZWF0ZSBzb21lIG5vZGVzCi0kbjAgPSBuZXdfTm9kZSgpOwotJG4xID0gbmV3X05vZGUoKTsKLSRuMiA9IG5ld19Ob2RlKCk7Ci0KLSMgTWFrZSBzb21lIGVkZ2VzCi1Ob2RlX2FkZGVkZ2UoJG4wLCRuMSwwKTsgICAgICAgICMgIDAgLSZndDsgMQotTm9kZV9hZGRlZGdlKCRuMCwkbjIsMCk7ICAgICAgICAjICAwIC0mZ3Q7IDIKLU5vZGVfYWRkZWRnZSgkbjEsJG4yLDApOyAgICAgICAgIyAgMSAtJmd0OyAyCi1Ob2RlX2FkZGVkZ2UoJG4yLCRuMCwwKTsgICAgICAgICMgIDIgLSZndDsgMAotCi0jIEEgcHJvY2VkdXJlIHRvIHByaW50IG91dCBhIG5vZGUgYW5kIGl0cyBhZGphY2VuY3kgbGlzdAotc3ViIHByaW50X25vZGUgewotCW15ICRub2RlID0gc2hpZnQ7Ci0gICAgCXByaW50ICJOb2RlIDogIiwgTm9kZV92X2dldCgkbm9kZSksICIsIEFkaiA6ICI7Ci0gICAgCW15ICRhZGogPSBOb2RlX2Fkal9nZXQoJG5vZGUpOwotICAgIAl3aGlsZSAoZGVmaW5lZCgkYWRqKSkgeyAgICAgICAgICAgICAgICAgICMgVGhpcyBjaGVja3MgZm9yIGEgTlVMTCBwb2ludGVyCi0JCW15ICRhbm9kZSA9IEVkZ2Vfbm9kZV9nZXQoJGFkaik7Ci0JCW15ICR2ID0gTm9kZV92X2dldCgkYW5vZGUpOwotCQlwcmludCAiJHYgIjsKLQkJJGFkaiA9IEVkZ2VfbmV4dF9nZXQoJGFkaik7ICAgICAgICMgTW92ZSB0byBuZXh0IG5vZGUKLSAgICAJfQotICAgIAlwcmludCAiXG4iOwotfQotCi0jIFByaW50IG91dCBub2RlIGluZm9ybWF0aW9uCi1wcmludF9ub2RlKCRuMCk7Ci1wcmludF9ub2RlKCRuMSk7Ci1wcmludF9ub2RlKCRuMik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gZXhlY3V0ZWQsIHRoaXMgc2NyaXB0IHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5Ob2RlIDogMCwgQWRqIDogMiAxIAotTm9kZSA6IDEsIEFkaiA6IDIgCi1Ob2RlIDogMiwgQWRqIDogMCAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGlsZSBvdXIgdHdvIEMgZnVuY3Rpb25zIGFyZSB1c2VkIGluIHRoZSBzY3JpcHQsIFNXSUcgYWxzbyBjcmVhdGVkIGEgY29sbGVjdGlvbiBvZiBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIHRoZSB0d28gQyBkYXRhIHN0cnVjdHVyZXMuICAgVGhlIGZ1bmN0aW9ucyA8dHQ+Tm9kZV92X2dldCgpPC90dD4sIDx0dD5Ob2RlX2Fkal9nZXQoKTwvdHQ+LCAgPHR0PkVkZ2Vfbm9kZV9nZXQoKTwvdHQ+LCBhbmQgPHR0PkVkZ2VfbmV4dF9nZXQoKTwvdHQ+IGFyZSB1c2VkIHRvIGFjY2VzcyAgdGhlIGNvcnJlc3BvbmRpbmcgbWVtYmVycyBvZiBvdXIgPHR0Pk5vZGU8L3R0PiBhbmQgPHR0PkVkZ2U8L3R0PiBzdHJ1Y3R1cmVzLiAgICBBcyBhcmd1bWVudHMsIHRoZXNlIGZ1bmN0aW9ucyBzaW1wbHkgdGFrZSBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RydWN0dXJlLjxwPgotPHA+Ci1UaGVyZSBhcmUgYSBmZXcgb3RoZXIgdGhpbmdzIHRvIG5vdGljZSBhYm91dCB0aGUgY29kZS48cD4KLTxwPgotPHVsPgotPGxpPlBvaW50ZXJzIHRvIGNvbXBsZXggb2JqZWN0cyBhcmUgbWFuaXB1bGF0ZWQgbGlrZSBvcmRpbmFyeSBzY2FsYXIgdmFsdWVzLCBidXQgaW4gcmVhbGl0eSB0aGV5IGFyZSBibGVzc2VkIHJlZmVyZW5jZXMuICBGb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgeW91IHNob3VsZCB0aGluayBvZiB0aGVtIGFzIGZ1bm55IG9wYXF1ZSBvYmplY3RzIChpbiBvdGhlciB3b3JkcywgZG9uJ3Qgd29ycnkgYWJvdXQgaXQpLgotPGxpPlRvIGNoZWNrIGZvciBhIE5VTEwgcG9pbnRlciwgdXNlIHRoZSBleHByZXNzaW9uIDx0dD5kZWZpbmVkKCRwdHIpPC90dD4uICBUaGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgYSBwb2ludGVyIGlzIG5vbi1OVUxMLCBmYWxzZSBpZiBpdCBpc24ndC4gICBJbiBvdXIgZXhhbXBsZSwgd2UgdXNlIHRoaXMgdG8gd2FsayBkb3duIGEgbGlua2VkIGxpc3Qgb2YgcG9pbnRlcnMgdW50aWwgd2UgcmVhY2ggYSBOVUxMIHZhbHVlLgotPC91bD4KLTxwPgotRXZlbiB0aG91Z2ggdGhlIG9yaWdpbmFsIEMgY29kZSB3YXMgcmF0aGVyIHVzZWxlc3MgYnkgaXRzZWxmLCAgd2UgaGF2ZSB1c2VkIGl0IHRvIGJ1aWxkIGEgc2ltcGxlIGdyYXBoIGluIFBlcmwgYWxvbmcgd2l0aCBhIGRlYnVnZ2luZyBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgb3V0IG5vZGUgaW5mb3JtYXRpb24uICBJbiBmYWN0LCB3aXRob3V0IG1ha2luZyBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgQyBjb2RlLCB3ZSBjYW4gdXNlIHRoaXMgdG8gYnVpbGQgdXAgc29tZXRoaW5nIG1vcmUgY29tcGxleCBzdWNoIGFzIGEgZGF0YWJhc2Ugb2YgY2l0aWVzIGFuZCBtaWxlYWdlcy4gPHA+Ci08cD4KLTxlbT5Tb21lIGNpdGllcyBhbmQgbWlsZWFnZXM8L2VtPjxwPgotPHA+Ci1IZXJlJ3MgYSBzbGlnaHRseSBtb3JlIGNvbXBsaWNhdGVkIFBlcmwgc2NyaXB0IHRvIHJlYWQgaW4gdGhlIGFib3ZlIG1pbGVhZ2UgdGFibGUgYW5kIHR1cm4gaXQgaW50byBhIGdyYXBoOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgUmVhZCBhIGZpbGUgd2l0aCBjaXRpZXMgaW50byBhIGdyYXBoCi0KLXVzZSBncmFwaDsKLXBhY2thZ2UgZ3JhcGg7Ci0KLSVDaXRpZXMgPSAoKTsgICAgICAgICAgICAgICMgSGFzaCB0YWJsZSBtYXBwaW5nIGNpdGllcyB0byBub2RlcwotJU5vZGVzID0gKCk7ICAgICAgICAgICAgICAgIyBNYXBwaW5nIG9mIE5vZGUgaW5kaWNpZXMgdG8gY2l0aWVzCi1zdWIgcmVhZF9jaXRpZXMgewotICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OwotICAgIG9wZW4oQ0lUSUVTLCRmaWxlbmFtZSk7Ci0gICAgd2hpbGUgKCZsdDtDSVRJRVMmZ3Q7KSB7Ci0JCWNob3A7Ci0JCW15IEBhID0gc3BsaXQoLywgKy8pOwotCQlteSAkbm9kZTE7Ci0JCW15ICRub2RlMjsKLQkJIyBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiBjaXR5IGlzIGFscmVhZHkgYSBub2RlCi0JCWlmICghZXhpc3RzICRDaXRpZXN7JGFbMF19KSB7Ci0JCQkkbm9kZTEgPSBuZXdfTm9kZSgpOwotCQkJJENpdGllc3skYVswXX0gPSAkbm9kZTE7Ci0JCQlteSAkbm9kZV9udW0gPSBOb2RlX3ZfZ2V0KCRub2RlMSk7Ci0JCQkkTm9kZXN7JG5vZGVfbnVtfSA9ICRhWzBdOwotCQl9IGVsc2UgewotCQkJJG5vZGUxID0gJENpdGllc3skYVswXX07Ci0JCX0KLQkJaWYgKCFleGlzdHMgJENpdGllc3skYVsxXX0pIHsKLQkJCSRub2RlMiA9IG5ld19Ob2RlKCk7Ci0JCQkkQ2l0aWVzeyRhWzFdfSA9ICRub2RlMjsKLQkJCW15ICRub2RlX251bSA9IE5vZGVfdl9nZXQoJG5vZGUyKTsKLQkJCSROb2Rlc3skbm9kZV9udW19ID0gJGFbMV07Ci0JCX0gZWxzZSB7Ci0JCQkkbm9kZTIgPSAkQ2l0aWVzeyRhWzFdfTsKLQkJfQotCQkjIEFkZCBlZGdlcwotCQlOb2RlX2FkZGVkZ2UoJG5vZGUxLCRub2RlMiwkYVsyXSk7Ci0JCU5vZGVfYWRkZWRnZSgkbm9kZTIsJG5vZGUxLCRhWzJdKTsKLQl9Ci19Ci0KLQotCi1zdWIgcHJpbnRfbmVhciB7Ci0gICAgbXkgJGNpdHkgPSBzaGlmdDsKLSAgICBpZiAoZXhpc3RzICRDaXRpZXN7JGNpdHl9KSB7Ci0JCW15ICRub2RlID0gJENpdGllc3skY2l0eX07Ci0JCXByaW50ICJDaXRpZXMgbmVhciAkY2l0eSA6ICI7Ci0JCW15ICRhZGogPSBOb2RlX2Fkal9nZXQoJG5vZGUpOwotCQl3aGlsZSAoZGVmaW5lZCgkYWRqKSkgewotCQkJIG15ICRhbm9kZSA9IEVkZ2Vfbm9kZV9nZXQoJGFkaik7Ci0JCQkgbXkgJHYgPSBOb2RlX3ZfZ2V0KCRhbm9kZSk7Ci0JCQkgcHJpbnQgJE5vZGVzeyR2fSwiLCAiOwotCQkJICRhZGogPSBFZGdlX25leHRfZ2V0KCRhZGopOwotCQl9Ci0gICAgfQotICAgIHByaW50ICJcbiI7Ci19Ci1yZWFkX2NpdGllcygiY2l0aWVzIik7Ci1wcmludF9uZWFyKCJEZW52ZXIiKTsKLXByaW50X25lYXIoIkxhcyBWZWdhcyIpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5DaXRpZXMgbmVhciBEZW52ZXIgOiBNb2FiLCBLYW5zYXMgQ2l0eSwgU2FudGEgRmUsIENoZXllbm5lLCBBbGJ1cXVlcnF1ZSwgCi1DaXRpZXMgbmVhciBMYXMgVmVnYXMgOiBGbGFnc3RhZmYsIExvcyBBbmdlbGVzLCBNb2FiLCBTYWx0IExha2UgQ2l0eSwgCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIHRoaXMgZXhhbXBsZSwgd2UgYXJlIHVzaW5nIHRoZSBzYW1lIGZ1bmN0aW9ucyBhcyBiZWZvcmUsIGJ1dCB3ZSBhcmUgbm93IGludHJvZHVjaW5nIHR3byBQZXJsIGhhc2ggdGFibGVzLiAgIFRoZSA8dHQ+JUNpdGllczwvdHQ+IGhhc2ggaXMgdXNlZCB0byBhc3NvY2lhdGUgY2l0eSBuYW1lcyB3aXRoIGEgY29ycmVzcG9uZGluZyBub2RlIGluIHRoZSBncmFwaC4gIFRoZSA8dHQ+JU5vZGVzPC90dD4gaGFzaCBkb2VzIGV4YWN0bHkgdGhlIG9wcG9zaXRlLS0tbWFwcGluZyBub2RlIG51bWJlcnMgYmFjayB0byB0aGUgbmFtZXMgb2YgY2l0aWVzLiAgIEJvdGggb2YgdGhlc2Ugd2lsbCBjb21lIGluIHF1aXRlIGhhbmR5IGZvciBtYXBwaW5nIHRoaW5ncyBiZXR3ZWVuIHRoZSBQZXJsIHdvcmxkIGFuZCB0aGUgQyB3b3JsZCBsYXRlci48cD4KLTxwPgotQmVmb3JlIHByb2NlZWRpbmcsIGxldCdzIHN0b3AgYW5kIHN1bW1hcml6ZSB3aGF0IHdlIGhhdmUgZG9uZS4gICAgIEdpdmVuIGEgY291cGxlIG9mIHZlcnkgc2ltcGxlIEMgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIGdyYXBoLCB3ZSBoYXZlIHdyaXR0ZW4gYSBwcm9ncmFtIHRoYXQgY2FuIHJlYWQgaW4gYSBtaWxlYWdlIHRhYmxlLCBjb25zdHJ1Y3QgYSB3ZWlnaHRlZCBncmFwaCBvZiB0aGUgZGF0YSBhbmQgcHJpbnQgb3V0IGEgbGlzdCBvZiB0aGUgY2l0aWVzIHRoYXQgYXJlIG5lYXJieSBvdGhlciBjaXRpZXMuICAgICBZZXQsIHRoZSBDIGNvZGUga25vd3Mgbm90aGluZyBhYm91dCB0aGUgUGVybCBpbnRlcmZhY2Ugb3IgdGhpcyB3aG9sZSBtaWxlYWdlIHByb2dyYW0gd2UndmUgYnVpbHQgdXAgYXJvdW5kIGl0LiAgICAgV2hpbGUgd2UgY291bGQgaGF2ZSB3cml0dGVuIHRoZSBlbnRpcmUgcHJvZ3JhbSBpbiBDLCB3ZSB3b3VsZCBoYXZlIGhhZCB0byB3cml0ZSBhIG1haW4gcHJvZ3JhbSwgc29tZSBjb2RlIHRvIHJlYWQgdGhlIGlucHV0IGZpbGUsIGFuZCBhIGhhc2ggdGFibGUgc3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG1hcHBpbmcgYmV0d2VlbiBub2RlcyBhbmQgY2l0aWVzLiAgUGVybCwgb24gdGhlIG90aGVyIGhhbmQsIGlzIHZlcnkgZ29vZCBhdCBtYW5hZ2luZyB0aGVzZSB0YXNrcy48cD4KLTxhIG5hbWU9Im42Ij48L2E+PGgyPiBBY2Nlc3NpbmcgYXJyYXlzIGFuZCBvdGhlciBzdHJhbmdlIG9iamVjdHM8L2gyPgotTm93IGxldCdzIGFkZCBzb21lIG5ldyBmdW5jdGlvbmFsaXR5IHRvIG91ciBncmFwaCBwcm9ncmFtIGZyb20gdGhlIHByZXZpb3VzIGV4YW1wbGUuICBJbiB0aGlzIGNhc2UsIHdlJ2xsIGFkZCBhIGRlcHRoLWZpcnN0IHNlYXJjaCBhbGdvcml0aG0gdG8gc2VlIGlmIHR3byBub2RlcyBhcmUgY29ubmVjdGVkIHRvIGVhY2ggb3RoZXIgKHBvc3NpYmx5IHRocm91Z2ggbWFueSBvdGhlciBub2RlcyBpbi1iZXR3ZWVuKS4gIDxwPgotPHA+Ci1XZSdsbCBmaXJzdCBhZGQgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgdG8gdGhlIGZpbGUgPHR0PmdyYXBoLmg8L3R0PjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8qIEZpbGUgOiBncmFwaC5oICovCi0uLi4KLSNkZWZpbmUgTUFYX05PREVTICAgMTAwMAotI2RlZmluZSBVTlNFRU4gICAgICAtMQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3csIGEgIG1vZGlmaWVkIHZlcnNpb24gb2YgPHR0PmdyYXBoLmM8L3R0PiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGdyYXBoLmMgKi8KLS8qIERpcmVjdGVkIGdyYXBoIGZ1bmN0aW9ucyAqLwotCi0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlICJncmFwaC5oIgotCi1pbnQgbm9kZV9jb3VudCA9IDA7ICAgICAgICAgIC8qIE51bWJlciBvZiBub2RlcyBjcmVhdGVkICAgICAqLwotaW50IHNlZW5bTUFYX05PREVTXTsgICAgICAgICAvKiBVc2VkIGJ5IHRoZSBzZWFyY2ggZnVuY3Rpb24gKi8KLQotLi4uCi0KLS8qIEZ1bmN0aW9uIHRvIHNlYXJjaCBmb3Igbm9kZSB3aXRoIGdpdmVuIHZlcnRleCBudW1iZXIgKi8KLXN0YXRpYyBpbnQgdmlzaXQoTm9kZSAqbixpbnQgdikgewotICBFZGdlICplOwotCi0gIGlmIChzZWVuW24tJmd0O3ZdICE9IFVOU0VFTikgcmV0dXJuIFVOU0VFTjsgIC8qIEN5Y2xlIGRldGVjdGVkICovCi0gIGlmIChuLSZndDt2ID09IHYpIHJldHVybiAxOyAgICAgICAgICAgICAgICAgIC8qIE1hdGNoIGZvdW5kICAgICovCi0gIGUgPSBuLSZndDthZGo7Ci0gIHdoaWxlIChlKSB7Ci0gICAgc2VlbltuLSZndDt2XSA9IGUtJmd0O25vZGUtJmd0O3Y7Ci0gICAgaWYgKHZpc2l0KGUtJmd0O25vZGUsdikgJmd0OyAwKSByZXR1cm4gMTsgICAgIAotICAgIGUgPSBlLSZndDtuZXh0OwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIERlcHRoLWZpcnN0IHNlYXJjaCBmb3IgYSBnaXZlbiBub2RlICovCi1pbnQgTm9kZV9zZWFyY2goTm9kZSAqc3RhcnQsIGludCB2KSB7Ci0gIGludCBpOwotICAKLSAgZm9yIChpID0gMDsgaSAmbHQ7IG5vZGVfY291bnQ7IGkrKykKLSAgICBzZWVuW2ldID0gVU5TRUVOOwotICByZXR1cm4gdmlzaXQoc3RhcnQsdik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBpZGVhIGhlcmUgaXMgc2ltcGxlLCB0aGUgZnVuY3Rpb24gPHR0Pk5vZGVfc2VhcmNoKCk8L3R0PiB0YWtlcyBhIHN0YXJ0aW5nIG5vZGUgYW5kIHN0YXJ0cyBsb29raW5nIGZvciBhIG5vZGUgd2l0aCBnaXZlbiB2ZXJ0ZXguICAgVXBvbiBzdGFydHVwLCB0aGUgc2VhcmNoIGZ1bmN0aW9uIGNsZWFycyBhbiBhcnJheSBvZiB2YWx1ZXMgaW5kaWNhdGluZyB3aGV0aGVyIGEgbm9kZSBoYXMgYmVlbiBzZWVuIG9yIG5vdC4gICBXaGlsZSB0aGlzIGFycmF5IGlzIHByaW1hcmlseSB1c2VkIHRvIGRldGVjdCBjeWNsZXMsIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gc3RvcmUgdGhlIHBhdGggYmV0d2VlbiB0d28gbm9kZXMgYXMgd2UgcHJvY2VlZCB0aHJvdWdoIHRoZSBhbGdvcml0aG0uICAgVXBvbiBleGl0LCB3ZSBjYW4gdGhlbiB1c2UgdGhlIGFycmF5IHRvIGZpZ3VyZSBvdXQgaG93IHdlIGdvdCBiZXR3ZWVuIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIG5vZGUuICAgIE9mIGNvdXJzZSwgdGhpcyBsZWFkcyB1cyB0byB0aGUgcXVlc3Rpb24gb2YgaG93IHdlIGFjY2VzcyB0aGlzIGFycmF5IGluIFBlcmwuPHA+Ci08cD4KLUFzIGEgZ2VuZXJhbCBydWxlLCBoYW5kbGluZyBhcnJheXMgaXMgc29tZXdoYXQgcHJvYmxlbWF0aWMgc2luY2UgdGhlIG1hcHBpbmcgYmV0d2VlbiBhcnJheXMgYW5kIHBvaW50ZXJzIG1heSBub3QgYmUgd2hhdCB5b3UgZXhwZWN0IChldmVuIGluIEMpIGFuZCB0aGVyZSBpcyBub3QgbmVjZXNzYXJpbHkgYSBuYXR1cmFsIG1hcHBpbmcgYmV0d2VlbiBhcnJheXMgaW4gQyBhbmQgYXJyYXlzIGluIFBlcmwgKGZvciBleGFtcGxlLCBpZiB3ZSd2ZSBnb3QgYSBDIGFycmF5IHdpdGggMSBtaWxsaW9uIGVsZW1lbnRzIGluIGl0LCB3ZSBhbG1vc3QgY2VydGFpbmx5IHdvdWxkbid0IHdhbnQgdG8gY29udmVydCBpdCB0byBhIFBlcmwgYXJyYXkhKS48cD4KLTxwPgotVG8gYWNjZXNzIG91ciBhcnJheSwgd2Ugd2lsbCB3cml0ZSBhIEMgaGVscGVyIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHVzIHRvIGFjY2VzcyBpbnZpZHVhbCBlbGVtZW50cy4gICBIb3dldmVyLCByYXRoZXIgdGhhbiBhZGRpbmcgdGhpcyBmdW5jdGlvbiB0byB0aGUgQyBjb2RlLCB3ZSBjYW4gaW5zZXJ0IGl0IGRpcmVjdGx5IGludG8gb3VyIFNXSUcgaW50ZXJmYWNlIGZpbGUuICAgIFdlIHdpbGwgYWxzbyBzdHJpcCB0aGUgZnVuY3Rpb24gbmFtZXMgb3V0IG9mIHRoZSA8dHQ+LmM8L3R0PiBmaWxlIGFuZCBwdXQgdGhlaXIgcHJvdG90eXBlcyBpbiB0aGUgaGVhZGVyIGZpbGUgOiA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdyYXBoCi0lewotI2luY2x1ZGUgImdyYXBoLmgiCi0lfQotJWluY2x1ZGUgZ3JhcGguaAotCi0laW5saW5lICV7Ci0vKiBHZXQgc2VlbiB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIG5vZGUgICovCi1pbnQgZ2V0X3NlZW4oaW50IGluZGV4KSB7Ci0gIGV4dGVybiBpbnQgbm9kZV9jb3VudDsKLSAgZXh0ZXJuIGludCBzZWVuW107Ci0gIGlmICgoaW5kZXggJmx0OyAwKSB8fCAoaW5kZXggJmd0Oz0gbm9kZV9jb3VudCkpIHJldHVybiAtMTsKLSAgZWxzZSByZXR1cm4gc2VlbltpbmRleF07Ci19Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIGludGVyZmFjZSBmaWxlIGlsbHVzdHJhdGVzIG9uZSBvZiB0aGUga2V5IHBvaW50cyBhYm91dCBTV0lHLS1ldmVuIHRob3VnaCBTV0lHIHVzZXMgQyBzeW50YXgsIHdyYXBwaW5nIGFyYml0cmFyeSBDIGNvZGUgZG9lc24ndCBhbHdheXMgcmVzdWx0IGluIGEgZ29vZCBpbnRlcmZhY2UuICBBbG1vc3QgYW55IHNpZ25pZmljYW50IHBhY2thZ2Ugd2lsbCByZXF1aXJlIHRoZSB1c2Ugb2YgIGEgZmV3ICJoZWxwZXIiIGZ1bmN0aW9ucyB0byBnZXQgYXQgY2VydGFpbiBkYXRhIHN0cnVjdHVyZXMgb3IgdG8gY2hhbmdlIHRoZSB3YXkgaW4gd2hpY2ggYSBmdW5jdGlvbiBpcyBjYWxsZWQuICAgPHA+Ci08cD4KLVdpdGggb3VyIG5ldyBDIHNlYXJjaCBmdW5jdGlvbiwgd2UgY2FuIG5vdyB3cml0ZSBhIFBlcmwgZnVuY3Rpb24gdG8gZmluZCBhIHJvdXRlIGJldHdlZW4gdHdvIGNpdGllcy4gIFRoaXMgZnVuY3Rpb24gc2ltcGx5IHRha2VzIHRoZSBuYW1lcyBvZiB0d28gY2l0aWVzLCB1c2VzIHRoZSA8dHQ+Q2l0aWVzPC90dD4gaGFzaCB0byBsb29rIHVwIHRoZWlyIG5vZGVzIGFuZCBjYWxscyB0aGUgQyA8dHQ+Tm9kZV9zZWFyY2goKTwvdHQ+IGZ1bmN0aW9uLiAgIEFmdGVyd2FyZHMsIHdlIHdhbGsgdGhyb3VnaCB0aGUgPHR0PnNlZW5bXTwvdHQ+IGFycmF5IHVzaW5nIG91ciBoZWxwZXIgZnVuY3Rpb24gYW5kIHByaW50IHRoZSByb3V0ZS48cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1zdWIgZmluZF9yb3V0ZSB7Ci0gICAgbXkgJHN0YXJ0ID0gc2hpZnQ7Ci0gICAgbXkgJGRlc3QgPSBzaGlmdDsKLSAgICAjIExvb2t1cCBub2RlcyBmcm9tIG5hbWVzCi0gICAgaWYgKCghZXhpc3RzICRDaXRpZXN7JHN0YXJ0fSkgfHwgKCFleGlzdHMgJENpdGllc3skZGVzdH0pKSB7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBteSAkbm9kZTEgPSAkQ2l0aWVzeyRzdGFydH07Ci0gICAgbXkgJG5vZGUyID0gJENpdGllc3skZGVzdH07Ci0gICAgcHJpbnQgIiRzdGFydCAtLSZndDsgJGRlc3QgOlxuIjsKLQotICAgICMgRGVwdGggZmlyc3Qgc2VhcmNoIGZvciBhIHJvdXRlIGJldHdlZW4gY2l0aWVzCi0gICAgbXkgJGZvdW5kID0gTm9kZV9zZWFyY2goJG5vZGUxLE5vZGVfdl9nZXQoJG5vZGUyKSk7Ci0gICAgaWYgKCRmb3VuZCkgewotCSR2ID0gTm9kZV92X2dldCgkbm9kZTEpOwotCXdoaWxlICgkdiAhPSAkVU5TRUVOKSB7Ci0JICAgIHByaW50ICIgICAgJE5vZGVzeyR2fVxuIjsKLQkgICAgJHYgPSBnZXRfc2Vlbigkdik7Ci0JfQotICAgIH0gZWxzZSB7Ci0JcHJpbnQgIiAgICBZb3UgY2FuJ3QgZ2V0IHRoZXJlIGZyb20gaGVyZVxuIjsKLSAgICB9Ci19Ci0gICAgCi1yZWFkX2NpdGllcygiY2l0aWVzIik7Ci1maW5kX3JvdXRlKCJTYWx0IExha2UgQ2l0eSIsIkRlbnZlciIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1PZiBjb3Vyc2UsIGRlcHRoIGZpcnN0IHNlYXJjaCBpc24ndCB2ZXJ5IGdvb2QgYXQgZmluZGluZyBhbiBvcHRpbWFsIHJvdXRlLS0tb2J2aW91c2x5IHRoaXMgb3V0cHV0IG11c3QgYmUgdGhlIHZlcnkgc2NlbmljIHJvdXRlITxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlNhbHQgTGFrZSBDaXR5IC0tJmd0OyBEZW52ZXIgOgotICAgIFNhbHQgTGFrZSBDaXR5Ci0gICAgVHdpbiBGYWxscwotICAgIEJvaXNlCi0gICAgUG9ydGxhbmQKLSAgICBFdWdlbmUKLSAgICBTYW4gRnJhbmNpc2NvCi0gICAgTG9zIEFuZ2VsZXMKLSAgICBMYXMgVmVnYXMKLSAgICBGbGFnc3RhZmYKLSAgICBBbGJ1cXVlcnF1ZQotICAgIFNhbnRhIEZlCi0gICAgRHVyYW5nbwotICAgIE1vYWIKLSAgICBEZW52ZXIKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im43Ij48L2E+PGgyPiBJbXBsZW1lbnRpbmcgbWV0aG9kcyBpbiBQZXJsPC9oMj4KLU9idmlvdXNseSwgb3VyIGRlcHRoIHNlYXJjaCBhbGdvcml0aG0gaXNuJ3Qgc28gdXNlZnVsIGluIHRoaXMgc3BlY2lmaWMgYXBwbGljYXRpb24uICAgUGVyaGFwcyB3ZSB3b3VsZCBsaWtlIHRvICB0cnkgYSBicmVhZHRoLWZpcnN0IHNlYXJjaCBhbGdvcml0aG0gaW5zdGVhZC4gICAgV2UgY291bGQgY2hvb3NlIHRvIHdyaXRlIGl0IGluIEMsIGJ1dCB0aGUgYnJlYWR0aCBmaXJzdCBzZWFyY2ggYWxnb3JpdGhtIGRlcGVuZHMgb24gdGhlIHVzZSBvZiBhIHF1ZXVlIHRvIGhvbGQgdGhlIGxpc3Qgb2Ygbm9kZXMgdG8gdmlzaXQuICBUaHVzLCB3ZSdkIGhhdmUgdG8gd3JpdGUgYSBxdWV1ZSBkYXRhIHN0cnVjdHVyZSBmaXJzdC4gICBIb3dldmVyLCBhIFBlcmwgYXJyYXkgc21lbGxzIGFsb3QgbGlrZSBhIHF1ZXVlIGlmIHdlIG1hbmlwdWxhdGUgaXQgaW4gdGhlIHJpZ2h0IHdheS4gIFNvIHdlIGNhbiB1c2UgUGVybCB0byBjb21lIHVwIHdpdGggYSBxdWljayBhbmQgZGlydHkgYnJlYWR0aCBmaXJzdCBzZWFyY2ggd2l0aG91dCBkcm9wcGluZyBkb3duIGludG8gQyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXZpc2l0ID0gKCk7Ci1zdWIgYnJlYWR0aF9zZWFyY2ggewotICAgIG15ICRub2RlMSA9IHNoaWZ0OwotICAgIG15ICRub2RlMiA9IHNoaWZ0OwotICAgIG15IEBxdWV1ZTsKLSAgICAldmlzaXQgPSAoKTsKLSAgICAjIFB1dCBzdGFydGluZyBub2RlIGludG8gcXVldWUKLSAgICBwdXNoIEBxdWV1ZSwgJG5vZGUxOwotICAgICR2aXNpdHtOb2RlX3ZfZ2V0KCRub2RlMSl9ID0gTm9kZV92X2dldCgkbm9kZTEpOwotICAgIHdoaWxlIChAcXVldWUpIHsgICAgICAgICAgICAjIExvb3AgdW50aWwgcXVldWUgaXMgZW1wdHkKLQlteSAkbiA9IHNoaWZ0IEBxdWV1ZTsgICAgICMgUG9wIG9mZiBhbiBub2RlCi0JbXkgJG52ID0gTm9kZV92X2dldCgkbik7Ci0JcmV0dXJuIDEgaWYgKCQkbiA9PSAkJG5vZGUyKTsgICAjIEV4aXQgaWYgd2UgZm91bmQgdGhlIGRlc3RpbmF0aW9uCi0JIyBQdXQgY2hpbGRyZW4gb250byB0aGUgcXVldWUKLQlteSAkZSA9IE5vZGVfYWRqX2dldCgkbik7Ci0Jd2hpbGUgKGRlZmluZWQoJGUpKSB7Ci0JICAgIG15ICRtID0gRWRnZV9ub2RlX2dldCgkZSk7Ci0JICAgIG15ICR2ID0gTm9kZV92X2dldCgkbSk7Ci0JICAgIGlmICghZXhpc3RzICR2aXNpdHskdn0pIHsKLQkJcHVzaCBAcXVldWUsICRtOwotCQkkdmlzaXR7JHZ9ID0gJG52OwotCSAgICB9Ci0JICAgICRlID0gRWRnZV9uZXh0X2dldCgkZSk7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3ViIGZpbmRfcm91dGUgewotICAgIG15ICRzdGFydCA9IHNoaWZ0OwotICAgIG15ICRkZXN0ID0gc2hpZnQ7Ci0gICAgIyBMb29rdXAgbm9kZXMgZnJvbSBuYW1lcwotICAgIHJldHVybiBpZiAoKCFleGlzdHMgJENpdGllc3skc3RhcnR9KSB8fCAoIWV4aXN0cyAkQ2l0aWVzeyRkZXN0fSkpOwotICAgIHByaW50ICIkc3RhcnQgLS0mZ3Q7ICRkZXN0IDpcbiI7Ci0gICAgbXkgJG5vZGUxID0gJENpdGllc3skc3RhcnR9OwotICAgIG15ICRub2RlMiA9ICRDaXRpZXN7JGRlc3R9OwotICAgIG15ICRmb3VuZCA9IGJyZWFkdGhfc2VhcmNoKCRub2RlMSwkbm9kZTIpOwotICAgIG15IEBwYXRoOwotICAgIGlmICgkZm91bmQpIHsKLQlteSAkdiA9IE5vZGVfdl9nZXQoJG5vZGUyKTsKLQlkZWxldGUgJHZpc2l0e05vZGVfdl9nZXQoJG5vZGUxKX07Ci0Jd2hpbGUgKGV4aXN0cygkdmlzaXR7JHZ9KSkgewotCSAgICB1bnNoaWZ0IEBwYXRoLCROb2Rlc3skdn07Ci0JICAgICR2ID0gJHZpc2l0eyR2fTsKLQl9Ci0JdW5zaGlmdCBAcGF0aCwkc3RhcnQ7Ci0JZm9yZWFjaCAkYyAoQHBhdGgpIHsgcHJpbnQgIiAgICAkY1xuIjt9Ci0gICAgfSBlbHNlIHsKLQlwcmludCAiICAgIFlvdSBjYW4ndCBnZXQgdGhlcmUgZnJvbSBoZXJlXG4iOwotICAgIH0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotT3VyIFBlcmwgaW1wbGVtZW50YXRpb24gY3JlYXRlcyBhIHF1ZXVlIHVzaW5nIGFuIGFycmF5IGFuZCBtYW5pcHVsYXRpbmcgaXQgd2l0aCBzaGlmdCBhbmQgcHVzaCBvcGVyYXRpb25zLiAgIFRoZSBnbG9iYWwgaGFzaCA8dHQ+JXZpc2l0PC90dD4gaXMgdXNlZCB0byBkZXRlY3QgY3ljbGVzIGFuZCB0byBkZXRlcm1pbmUgaG93IHdlIGdvdCB0byBlYWNoIG5vZGUuICAgIFdoZW4gd2UgZmluZCBhIHJvdXRlLCB3ZSBjYW4gbWFyY2ggYmFja3dhcmRzIHRocm91Z2ggdGhlIHJvdXRlIHRvIGRldGVybWluZSB0aGUgZW50aXJlIHBhdGguICAgV2hlbiB3ZSBydW4gb3VyIG5ldyBjb2RlLCB3ZSBnZXQgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZmluZF9yb3V0ZSgiU2FsdCBMYWtlIENpdHkiLCAiRGVudmVyIik7Ci1TYWx0IExha2UgQ2l0eSAtLSZndDsgRGVudmVyIDoKLSAgICBTYWx0IExha2UgQ2l0eQotICAgIENoZXllbm5lCi0gICAgRGVudmVyCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUNsZWFybHkgdGhpcyBpcyBhIG1vcmUgZWZmaWNpZW50IHJvdXRlLS1hbHRob3VnaCBhZG1pdHRlZGx5IG5vdCB2ZXJ5IHNjZW5pYy4gICBJZiB3ZSB3YW50ZWQgdG8gZ2V0IGV2ZW4gbW9yZSBzZXJpb3VzLCB3ZSBjb3VsZCBhZGQgYSBwcmlvcml0eSBzZWFyY2ggYmFzZWQgb24gbWlsZWFnZXMuICAgIExhdGVyIG9uIHdlIG1pZ2h0IGltcGxlbWVudCB0aGVzZSBmZWF0dXJlcyBpbiBDIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuICAgRWl0aGVyIHdheSwgaXQgaXMgcmVhc29uYWJseSBlYXN5IHRvIG1hbmlwdWxhdGUgY29tcGxleCBzdHJ1Y3R1cmVzIGluIFBlcmwgYW5kIHRvIG1peCB0aGVtIHdpdGggQyBjb2RlICh3ZWxsLCB3aXRoIGEgbGl0dGxlIHByYWN0aWNlIHBlcmhhcHMpLiA8cD4KLTxhIG5hbWU9Im44Ij48L2E+PGgyPiBTaGFkb3cgY2xhc3NlczwvaDI+Ci1CeSBub3csIHlvdSd2ZSBwcm9iYWJseSBub3RpY2VkIHRoYXQgZXhhbXBsZXMgaGF2ZSBiZWVuIHVzaW5nICBhbG90IG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyB0byBnZXQgYXQgdGhlIG1lbWJlcnMgb2Ygb3VyIDx0dD5Ob2RlPC90dD4gYW5kIDx0dD5FZGdlPC90dD4gc3RydWN0dXJlcy4gIFRoaXMgdGVuZHMgdG8gbWFrZSB0aGUgUGVybCBjb2RlIGxvb2sgcmF0aGVyIGNsdXR0ZXJlZCAod2VsbCwgbW9yZSB0aGFuIG5vcm1hbCBQZXJsIGNvZGUgaW4gYW55IGNhc2UpIGFuZCBpdCBpc24ndCB2ZXJ5IG9iamVjdCBvcmllbnRlZC48cD4KLTxwPgotV2l0aCBhIGxpdHRsZSBtYWdpYywgU1dJRyBjYW4gdHVybiBDIHN0cnVjdHMgYW5kIEMrKyBjbGFzc2VzIGludG8gZnVsbHkgZnVuY3Rpb25hbCBQZXJsIGNsYXNzZXMgdGhhdCB3b3JrIGluIGEgbW9yZS1vci1sZXNzIG5vcm1hbCBmYXNoaW9uLiAgICAgVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lIGJ5IHdyaXRpbmcgYW4gYWRkaXRpb25hbCBQZXJsIGxheWVyIHRoYXQgYnVpbGRzIFBlcmwgY2xhc3NlcyBvbiB0b3Agb2YgdGhlIGxvdy1sZXZlbCBTV0lHIGludGVyZmFjZS4gIFRoZXNlIFBlcmwgY2xhc3NlcyBhcmUgc2FpZCB0byAic2hhZG93IiBhbiB1bmRlcmx5aW5nIEMvQysrIGNsYXNzLiAgICA8cD4KLTxwPgotVG8gaGF2ZSBTV0lHIGNyZWF0ZSBzaGFkb3cgY2xhc3NlcywgdXNlIHRoZSA8dHQ+LXNoYWRvdyA8L3R0Pm9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzd2lnIC1wZXJsNSAtc2hhZG93IGdyYXBoLmkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgZmlsZXMgYXMgYmVmb3JlIGV4Y2VwdCB0aGF0IHRoZSA8dHQ+LnBtPC90dD4gZmlsZSB3aWxsIG5vdyBjb250YWluIHNpZ25pZmljYW50bHkgbW9yZSBzdXBwb3J0aW5nIFBlcmwgY29kZS4gICBXaGlsZSB0aGVyZSBhcmUgc29tZSByYXRoZXIgc3VidGxlIGFzcGVjdHMgb2YgdGhpcyB0cmFuc2Zvcm1hdGlvbiwgZm9yIG5vdyB3ZSdsbCBvbWl0IHRoZSBkZXRhaWxzIGFuZCBpbGx1c3RyYXRlIHRoZSBjaGFuZ2VzIGluIGFuIGV4YW1wbGUgZmlyc3QgKHRoZSB1c2Ugb2Ygc2hhZG93IGNsYXNzZXMgaGFzIGJlZW4gdW5kZXJsaW5lZCk8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIFJlYWQgYSBmaWxlIHdpdGggY2l0aWVzIGludG8gYSBncmFwaAotIyBVc2VzIHNoYWRvdyBjbGFzc2VzCi0KLXVzZSBncmFwaDsKLXBhY2thZ2UgZ3JhcGg7Ci0KLSVDaXRpZXMgPSAoKTsgICAgICAgICAgICAgICMgSGFzaCB0YWJsZSBtYXBwaW5nIGNpdGllcyB0byBub2RlcwotJU5vZGVzID0gKCk7ICAgICAgICAgICAgICAgIyBNYXBwaW5nIG9mIE5vZGUgaW5kaWNpZXMgdG8gY2l0aWVzCi0KLXN1YiByZWFkX2NpdGllcyB7Ci0gICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7Ci0gICAgb3BlbihDSVRJRVMsJGZpbGVuYW1lKTsKLSAgICB3aGlsZSAoJmx0O0NJVElFUyZndDspIHsKLQljaG9wOwotCW15IEBhID0gc3BsaXQoLywgKy8pOwotCW15ICRub2RlMTsKLQlteSAkbm9kZTI7Ci0JIyBDaGVjayB0byBzZWUgaWYgYSBnaXZlbiBjaXR5IGlzIGFscmVhZHkgYSBub2RlCi0JaWYgKCFleGlzdHMgJENpdGllc3skYVswXX0pIHsKLQkgICAgJG5vZGUxID0gbmV3X05vZGUoKTsKLQkgICAgJENpdGllc3skYVswXX0gPSAkbm9kZTE7Ci0JICAgICROb2Rlc3skbm9kZTEtJmd0O3t2fX0gPSAkYVswXTsgICAgICAjIE5vdGUgYWNjZXNzIG9mIGB2JwotCX0gZWxzZSB7Ci0JICAgICRub2RlMSA9ICRDaXRpZXN7JGFbMF19OwotCX0KLQlpZiAoIWV4aXN0cyAkQ2l0aWVzeyRhWzFdfSkgewotCSAgICAkbm9kZTIgPSBuZXdfTm9kZTsKLQkgICAgJENpdGllc3skYVsxXX0gPSAkbm9kZTI7Ci0JICAgICROb2Rlc3skbm9kZTItJmd0O3t2fX0gPSAkYVsxXTsKLQl9IGVsc2UgewotCSAgICAkbm9kZTIgPSAkQ2l0aWVzeyRhWzFdfTsKLQl9Ci0JIyBBZGQgZWRnZXMKLQlOb2RlX2FkZGVkZ2UoJG5vZGUxLCRub2RlMiwkYVsyXSk7Ci0JTm9kZV9hZGRlZGdlKCRub2RlMiwkbm9kZTEsJGFbMl0pOwotICAgIH0KLX0KLQotJXZpc2l0Owotc3ViIGJyZWFkdGhfc2VhcmNoIHsKLSAgICBteSAkbm9kZTEgPSBzaGlmdDsKLSAgICBteSAkbm9kZTIgPSBzaGlmdDsKLSAgICBteSBAcXVldWU7Ci0gICAgJXZpc2l0ID0gKCk7Ci0gICAgbXkgJGRlc3QgPSAkbm9kZTItJmd0O3t2fTsKLSAgICAjIFB1dCBzdGFydGluZyBub2RlIGludG8gcXVldWUKLSAgICBwdXNoIEBxdWV1ZSwgJG5vZGUxOwotICAgICR2aXNpdHskbm9kZTEtJmd0O3t2fX0gPSAkbm9kZTEtJmd0O3t2fTsKLSAgICB3aGlsZSAoQHF1ZXVlKSB7Ci0JbXkgJG4gPSBzaGlmdCBAcXVldWU7Ci0JcmV0dXJuIDEgaWYgKCRuLSZndDt7dn0gPT0gJG5vZGUyLSZndDt7dn0pOwotCSMgUHV0IGNoaWxkcmVuIG9udG8gdGhlIHF1ZXVlCi0JbXkgJGUgPSAkbi0mZ3Q7e2Fkan07Ci0Jd2hpbGUgKGRlZmluZWQoJGUpKSB7Ci0JICAgIGlmICghZXhpc3RzICR2aXNpdHskZS0mZ3Q7e25vZGV9LSZndDt7dn19KSB7Ci0JCXB1c2ggQHF1ZXVlLCAkZS0mZ3Q7e25vZGV9OwotCQkkdmlzaXR7JGUtJmd0O3tub2RlfS0mZ3Q7e3Z9fSA9ICRuLSZndDt7dn07Ci0JICAgIH0KLQkgICAgJGUgPSAkZS0mZ3Q7e25leHR9OwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN1YiBmaW5kX3JvdXRlIHsKLSAgICBteSAkc3RhcnQgPSBzaGlmdDsKLSAgICBteSAkZGVzdCA9IHNoaWZ0OwotICAgICMgTG9va3VwIG5vZGVzIGZyb20gbmFtZXMKLSAgICByZXR1cm4gaWYgKCghZXhpc3RzICRDaXRpZXN7JHN0YXJ0fSkgfHwgKCFleGlzdHMgJENpdGllc3skZGVzdH0pKTsKLSAgICBwcmludCAiJHN0YXJ0IC0tJmd0OyAkZGVzdCA6XG4iOwotICAgIG15ICRub2RlMSA9ICRDaXRpZXN7JHN0YXJ0fTsKLSAgICBteSAkbm9kZTIgPSAkQ2l0aWVzeyRkZXN0fTsKLSAgICBteSAkZm91bmQgPSBicmVhZHRoX3NlYXJjaCgkbm9kZTEsJG5vZGUyKTsKLSAgICBteSBAcGF0aDsKLSAgICBpZiAoJGZvdW5kKSB7Ci0JbXkgJHYgPSAkbm9kZTItJmd0O3t2fTsKLQlkZWxldGUgJHZpc2l0eyRub2RlMS0mZ3Q7e3Z9fTsKLQl3aGlsZSAoZXhpc3RzKCR2aXNpdHskdn0pKSB7Ci0JICAgIHVuc2hpZnQgQHBhdGgsJE5vZGVzeyR2fTsKLQkgICAgJHYgPSAkdmlzaXR7JHZ9OwotCX0KLQl1bnNoaWZ0IEBwYXRoLCRzdGFydDsKLQlmb3JlYWNoICRjIChAcGF0aCkgewotCSAgICBwcmludCAiICAgICRjXG4iOwotCX0KLSAgICB9IGVsc2UgewotCXByaW50ICIgICAgWW91IGNhbid0IGdldCB0aGVyZSBmcm9tIGhlcmVcbiI7Ci0gICAgfQotfQotcmVhZF9jaXRpZXMoImNpdGllcyIpOwotCi1maW5kX3JvdXRlKCJTYWx0IExha2UgQ2l0eSIsIkRlbnZlciIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Gb3IgdGhlIG1vc3QgcGFydCwgdGhlIGNvZGUgaXMgdGhlIHNhbWUgZXhjZXB0IHRoYXQgd2UgY2FuIG5vdyBhY2Nlc3MgbWVtYmVycyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB1c2luZyA8dHQ+LSZndDs8L3R0PiBpbnN0ZWFkIG9mIHRoZSBsb3cgbGV2ZWwgYWNjZXNzb3IgZnVuY3Rpb25zLiBsaWtlIGJlZm9yZS4gIEhvd2V2ZXIsIHRoaXMgZXhhbXBsZSBpcyBvbmx5IHNjcmF0Y2hpbmcgdGhlIHN1cmZhY2Ugb2Ygd2hhdCBjYW4gYmUgZG9uZSB3aXRoIHNoYWRvdyBjbGFzc2VzLi4ua2VlcCByZWFkaW5nLjxwPgotPGEgbmFtZT0ibjkiPjwvYT48aDI+IEdldHRpbmcgc2VyaW91czwvaDI+Ci1Ob3cgdGhhdCB3ZSd2ZSBnb3QgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlIHdvcmtpbmcsIGl0J3MgdGltZSB0byBnZXQgcmVhbGx5IHNlcmlvdXMuICBTdXBwb3NlIHRoYXQgaW4gYWRkaXRpb24gdG8gd29ya2luZyB3aXRoIHRoZSBtaWxlYWdlIGRhdGEgb2YgdmFyaW91cyBjaXRpZXMsIHdlIHdhbnQgdG8gbWFrZSBhIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiBmcm9tIGdlb2dyYXBoaWNhbCBkYXRhIChsYXR0aXR1ZGUvbG9uZ2l0dWRlKS4gICAgIFRvIGRvIHRoaXMsIHdlJ2xsIHVzZSBTV0lHIHRvICBnbHVlIHRvZ2V0aGVyIGEgYnVuY2ggb2Ygc3R1ZmYuICAgRmlyc3QsIGZvciB0aGUgcHVycG9zZXMgb2YgaWxsdXN0cmF0aW9uLCBsZXQncyBjcmVhdGUgYSBuZXcgQyBkYXRhIHN0cnVjdHVyZSBmb3IgaG9sZGluZyBhIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2UgbWlnaHQgd2FudCB0byB1c2UgaXQgaW4gc29tZSBDIGZ1bmN0aW9ucyBsYXRlciA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGxvY2F0aW9uLmggKi8KLS8qIERhdGEgc3RydWN0dXJlIGZvciBob2xkaW5nIGxvbmdpdHVkZSBhbmQgbGF0dGl0dWRlIGluZm9ybWF0aW9uICovCi0KLXR5cGVkZWYgc3RydWN0IExvY2F0aW9uIHsKLSAgY2hhciAgICAqbmFtZTsKLSAgZG91YmxlICBsYXRfZGVncmVlczsKLSAgZG91YmxlICBsYXRfbWludXRlczsKLSAgZG91YmxlICBsYXRfc2Vjb25kczsKLSAgY2hhciAgICBsYXRfZGlyZWN0aW9uOwotICBkb3VibGUgIGxvbmdfZGVncmVlczsKLSAgZG91YmxlICBsb25nX21pbnV0ZXM7Ci0gIGRvdWJsZSAgbG9uZ19zZWNvbmRzOwotICBjaGFyICAgIGxvbmdfZGlyZWN0aW9uOwotfSBMb2NhdGlvbjsKLQotZXh0ZXJuIExvY2F0aW9uICpuZXdfTG9jYXRpb24oY2hhciAqbmFtZSk7Ci0gCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XZSBhbHNvICBwcm9iYWJseSB3YW50IGEgQyBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgb25lIG9mIHRoZXNlIG9iamVjdHM6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IGxvY2F0aW9uLmMgKi8KLSNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKLQotLyogTWFrZSBhIG5ldyBsb2NhdGlvbiAqLwotTG9jYXRpb24gKm5ld19Mb2NhdGlvbihjaGFyICpuYW1lKSB7Ci0gIExvY2F0aW9uICpsOwotICBsID0gKExvY2F0aW9uICopIG1hbGxvYyhzaXplb2YoTG9jYXRpb24pKTsKLSAgbC0mZ3Q7bmFtZSA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4obmFtZSkrMSk7Ci0gIHN0cmNweShsLSZndDtuYW1lLG5hbWUpOwotICByZXR1cm4gbDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm93IGxldCdzIG1ha2UgYW4gaW50ZXJmYWNlIGZpbGUgZm9yIHRoaXMgbW9kdWxlIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBGaWxlIDogbG9jYXRpb24uaQotJW1vZHVsZSBsb2NhdGlvbgotJXsKLSNpbmNsdWRlICJsb2NhdGlvbi5oIgotJX0KLQotJWluY2x1ZGUgbG9jYXRpb24uaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XZSBjb3VsZCB1c2UgdGhpcyBpbnRlcmZhY2UgZmlsZSB0byBtYWtlIGFuIGVudGlyZWx5IG5ldyBQZXJsNSBtb2R1bGUgb3Igd2UgY2FuIGNvbWJpbmUgaXQgd2l0aCB0aGUgZ3JhcGggbW9kdWxlLiAgICBJbiB0aGlzIGxhdHRlciBjYXNlLCB3ZSBzaW1wbHkgbmVlZCB0byBwdXQgIjx0dD4laW5jbHVkZSBsb2NhdGlvbi5pPC90dD4iIGluIHRoZSBmaWxlIDx0dD5ncmFwaC5pPC90dD4uPHA+Ci08cD4KLU5vdywgZmluYWxseSwgd2UgY291bGQgd3JpdGUgYSBQZXJsIGZ1bmN0aW9uIHRvIHJlYWQgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdCA6PHA+Ci08cD4KLTxlbT5HZW9ncmFwaGljIGRhdGE8L2VtPjxwPgotPGJsb2NrcXVvdGU+PHByZT5zdWIgcmVhZF9sb2NhdGlvbnMgewotICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OwotICAgIG9wZW4oTE9DQVRJT05TLCRmaWxlbmFtZSk7Ci0gICAgd2hpbGUgKCZsdDtMT0NBVElPTlMmZ3Q7KSB7Ci0JY2hvcDsKLQlteSBAYSA9IHNwbGl0KC8sICsvKTsKLQlteSAkbG9jOwotCSMgQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBjaXR5IEkga25vdyBhYm91dAotCWlmIChleGlzdHMgJENpdGllc3skYVswXX0pIHsKLQkgICAgIyBDcmVhdGUgYSBuZXcgbG9jYXRpb24KLQkgICAgJGxvYyA9IG5ld19Mb2NhdGlvbigkYVswXSk7Ci0JICAgIG15IEBjb29yZHMgPSBzcGxpdCgnICcsJGFbMV0pOwotCSAgICAjIEEgbmljZSB3YXkgdG8gYXNzaWduIGF0dHJpYnV0ZXMgdG8gYW4gb2JqZWN0Ci0JICAgICUkbG9jID0gKGxhdF9kZWdyZWVzID0mZ3Q7ICRjb29yZHNbMF0sCi0JCSAgICAgbGF0X21pbnV0ZXMgPSZndDsgJGNvb3Jkc1sxXSwKLQkJICAgICBsYXRfc2Vjb25kcyA9Jmd0OyAkY29vcmRzWzJdLAotCQkgICAgIGxhdF9kaXJlY3Rpb24gPSZndDsgJGNvb3Jkc1szXSwKLQkJICAgICBsb25nX2RlZ3JlZXMgPSZndDsgJGNvb3Jkc1s0XSwKLQkJICAgICBsb25nX21pbnV0ZXMgPSZndDsgJGNvb3Jkc1s1XSwKLQkJICAgICBsb25nX3NlY29uZHMgPSZndDsgJGNvb3Jkc1s2XSwKLQkJICAgICBsb25nX2RpcmVjdGlvbiA9Jmd0OyAkY29vcmRzWzddKTsKLQkgICAgbXkgJHYgPSAkQ2l0aWVzeyRhWzBdfS0mZ3Q7e3Z9OwotCSAgICAkTG9jYXRpb25zeyR2fSA9ICRsb2M7Ci0JfQotICAgIH0KLSAgICBjbG9zZSBMT0NBVElPTlM7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BZ2Fpbiwgd2UgYXJlIHVzaW5nIHNoYWRvdyBjbGFzc2VzIHdoaWNoIGFyZSBhbGxvd2luZyB1cyB0byBhc3NpZ24gYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIGEgQyBzdHJ1Y3R1cmUgaW4gdGhlIHNhbWUgd2F5IGFzIG9uZSB3b3VsZCBjcmVhdGUgYSBQZXJsIGhhc2ggdGFibGUuIFdlIGhhdmUgYWxzbyBjcmVhdGVkIHRoZSA8dHQ+JUxvY2F0aW9uczwvdHQ+IGhhc2ggdG8gYXNzb2NpYXRlIG5vZGUgbnVtYmVycyB3aXRoIGEgZ2l2ZW4gbG9jYXRpb24gb2JqZWN0LjxwPgotPHA+Ci1PZiBjb3Vyc2UsIGhhdmluZyBsb2NhdGlvbnMgaXNuJ3QgdG9vIHVzZWZ1bCB3aXRob3V0IGEgd2F5IHRvIGxvb2sgYXQgdGhlbSBzbyB3ZSdsbCBncmFiIHRoZSBwdWJsaWMgZG9tYWluIDx0dD5nZDwvdHQ+IGxpYnJhcnkgYnkgVGhvbWFzIEJvdXRlbGwuICAgRmlyc3QsIHdlJ2xsIHdyaXRlIGEgc2ltcGxlIEMgZnVuY3Rpb24gdG8gZHJhdyB0d28gbG9jYXRpb25zIGFuZCBkcmF3IGEgbGluZSBiZXR3ZWVuIHRoZW0gKHNvbWUgY29kZSBoYXMgYmVlbiBvbWl0dGVkIGZvciBjbGFyaXR5KSA6LjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBwbG90LmMgKi8KLSNpbmNsdWRlICZsdDtnZC5oJmd0OwotI2luY2x1ZGUgJmx0O2dkZm9udHMuaCZndDsKLSNpbmNsdWRlICJsb2NhdGlvbi5oIgotZG91YmxlIHhtaW4seW1pbix4bWF4LHltYXg7ICAgLyogUGxvdHRpbmcgcmFuZ2UgKi8KLQotLyogTWFrZSBhIHBsb3Qgb2YgdHdvIGxvY2F0aW9ucyB3aXRoIGEgbGluZSBiZXR3ZWVuIHRoZW0gKi8KLXZvaWQgcGxvdF9jaXRpZXMoZ2RJbWFnZVB0ciBpbSwgTG9jYXRpb24gKmNpdHkxLCBMb2NhdGlvbiAqY2l0eTIsCi0JCSAgICAgaW50IGNvbG9yKSB7Ci0uLi4KLSAgLyogQ29udmVydCB0aGUgdHdvIGxvY2F0aW9ucyBpbnRvIHNjcmVlbiBjb29yZGluYXRlcyAoYnVuY2ggYG8gbWF0aCkgKi8KLS4uLgotICAvKiBEcmF3IHRoZSBjaXRpZXMgKi8KLSAgZ2RJbWFnZVN0cmluZyhpbSxnZEZvbnRTbWFsbCwuLi4pCi0gIGdkSW1hZ2VTdHJpbmcoaW0sZ2RGb250U21hbGwsLi4uKQotICBnZEltYWdlTGluZShpbSxpeDEsaGVpZ2h0LWl5MSxpeDIsaGVpZ2h0LWl5Mixjb2xvcik7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU5leHQsIHdlJ2xsIHdyYXAgYSBmZXcgY3JpdGljYWwgZ2QgZnVuY3Rpb25zIGludG8gUGVybC4gICBXZSBkb24ndCBuZWVkIHRoZSBlbnRpcmUgbGlicmFyeSBzbyB0aGVyZSdzIG5vdCBtdWNoIHNlbnNlIGluIHdyYXBwaW5nIHRoZSB3aG9sZSB0aGluZyAoaXQncyBlYXN5IGVub3VnaCB0byBkbyBpZiB5b3UgcmVhbGx5IHdhbnQgdG8gb2YgY291cnNlKS4gV2UnbGwganVzdCB3cmFwIGEgY291cGxlIG9mIGZ1bmN0aW9ucyB0byBpbGx1c3RyYXRlIGhvdyBpdCBjYW4gYmUgdXNlZCAob25lIG1pZ2h0IGFsc28gY29uc2lkZXIgdXNpbmcgdGhlIGFscmVhZHkgZXhpc3RpbmcgZ2QgbW9kdWxlIGZvciBQZXJsIGFzIHdlbGwpLiA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdkCi0lewotI2luY2x1ZGUgImdkLmgiCi0lfQotdHlwZWRlZiBzdHJ1Y3QgZ2RJbWFnZVN0cnVjdCBnZEltYWdlOwotdHlwZWRlZiBnZEltYWdlICogZ2RJbWFnZVB0cjsKLQotLyogRnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgaW1hZ2VzLiAqLwotZ2RJbWFnZVB0ciBnZEltYWdlQ3JlYXRlKGludCBzeCwgaW50IHN5KTsKLWludCAgZ2RJbWFnZUNvbG9yQWxsb2NhdGUoZ2RJbWFnZVB0ciBpbSwgaW50IHIsIGludCBnLCBpbnQgYik7Ci0laW5saW5lICV7Ci0gIC8qIFNob3J0Y3V0IGZvciBkdW1waW5nIGEgZmlsZSAqLwotICB2b2lkIGR1bXBfZ2lmKGdkSW1hZ2VQdHIgaW0sIGNoYXIgKmZpbGVuYW1lKSB7Ci0gICAgRklMRSAqZjsKLSAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7Ci0gICAgZ2RJbWFnZUdpZihpbSxmKTsKLSAgICBmY2xvc2UoZik7Ci0gIH0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdlIGNhbiBub3cgc2xhcCBldmVyeXRoaW5nIHRvZ2V0aGVyIHVzaW5nIGEgbmV3IGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcy4gd2UnbGwga2VlcCB0aGUgb2xkIGdyYXBoIG1vZHVsZSBuYW1lIHNvIG91ciBleGlzdGluZyBzY3JpcHRzIHN0aWxsIHdvcmsgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIEZpbGUgOiBwYWNrYWdlLmkKLSVtb2R1bGUgZ3JhcGgKLSVpbmNsdWRlIGdyYXBoLmkgICAgICAgICAgIC8vIFRoZSBvcmlnaW5hbCBncmFwaCBwcm9ncmFtCi0laW5jbHVkZSBsb2NhdGlvbi5pICAgICAgICAvLyBUaGUgbG9jYXRpb24gZGF0YSBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucwotJWluY2x1ZGUgZ2QuaSAgICAgICAgICAgICAgLy8gZ2QgbW9kdWxlCi0laW5jbHVkZSBwbG90LmMgICAgICAgICAgICAvLyBGdW5jdGlvbiB0byBwbG90IGNpdGllcwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGV3ISBBZnRlciBhbGwgb2YgdGhhdCB3b3JrLCB3ZSBjYW4gZG8gdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cmVhZF9jaXRpZXMoImNpdGllcyIpOwotcmVhZF9sb2NhdGlvbnMoImxvY2F0aW9ucyIpOwotCi0jIENyZWF0ZSBhIG5ldyBpbWFnZSB3aXRoIGdkCi0kaW0gPSBnZEltYWdlQ3JlYXRlKDUwMCw1MDApOwotJHdoaXRlID0gZ2RJbWFnZUNvbG9yQWxsb2NhdGUoJGltLDI1NSwyNTUsMjU1KTsKLSRibGFjayA9IGdkSW1hZ2VDb2xvckFsbG9jYXRlKCRpbSwwLDAsMCk7Ci0KLSMgU2V0IHBsb3R0aW5nIHJhbmdlICh2YXJpYWJsZXMgaW4gdGhlIEMgY29kZSkKLSR4bWluID0gLTEzMDsKLSR4bWF4ID0gLTkwOwotJHltaW4gPSAzMDsKLSR5bWF4ID0gNTA7Ci0KLSMgTWFrZSBhIHBsb3Qgb2YgdGhlIGVudGlyZSBncmFwaAotQGxvYyA9IGVhY2ggJUNpdGllczsKLXdoaWxlIChAbG9jKSB7Ci0gICAgbXkgJGNpdHkgPSAkbG9jWzBdOwotICAgIG15ICRub2RlID0gJENpdGllc3skY2l0eX07Ci0gICAgaWYgKGV4aXN0cyAkTG9jYXRpb25zeyRub2RlLSZndDt7dn19KSB7Ci0JbXkgJGxvYzEgPSAkTG9jYXRpb25zeyRub2RlLSZndDt7dn19OwotCW15ICRlID0gJG5vZGUtJmd0O3thZGp9OwotCXdoaWxlIChkZWZpbmVkKCRlKSkgewotICAgCSAgICAgIGlmIChleGlzdHMgJExvY2F0aW9uc3skZS0mZ3Q7e25vZGV9LSZndDt7dn19KSB7Ci0JCSAgbXkgJGxvYzIgPSAkTG9jYXRpb25zeyRlLSZndDt7bm9kZX0tJmd0O3t2fX07Ci0JCSAgcGxvdF9jaXRpZXMoJGltLCRsb2MxLCRsb2MyLCRibGFjayk7Ci0JICAgICAgfQotCSAgICAgICRlID0gJGUtJmd0O3tuZXh0fTsKLQkgIH0KLSAgICB9Ci0gICAgQGxvYyA9IGVhY2ggJUNpdGllczsKLX0KLSMgRHVtcCBvdXQgYSBHSUYgZmlsZQotZHVtcF9naWYoJGltLCJ0ZXN0LmdpZiIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIHJ1biwgd2Ugbm93IGdldCB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoOC4yLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotTm90IHRvbyBiYWQgZm9yIGp1c3QgYSBsaXR0bGUgd29yay4uLi48cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gV3JhcHBpbmcgQyBsaWJyYXJpZXMgYW5kIG90aGVyIHBhY2thZ2VzPC9oMj4KLVNXSUcgY2FuIGJlIHVzZWQgdG8gYnVpbGQgUGVybCBpbnRlcmZhY2VzIHRvIGV4aXN0aW5nIEMgbGlicmFyaWVzIGFuZCBwYWNrYWdlcy4gVGhlIGdlbmVyYWwgc3RyYXRlZ3kgZm9yIGRvaW5nIHRoaXMgaXMgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5Mb2NhdGUgaW1wb3J0YW50IGhlYWRlciBmaWxlcyBmb3IgdGhlIHBhY2thZ2UuCi08bGk+Q29weSB0aGVtIGludG8gYSBTV0lHIGludGVyZmFjZSBmaWxlLgotPGxpPkVkaXQgdGhlIGludGVyZmFjZSBmaWxlIGJ5IHJlbW92aW5nIHByb2JsZW1hdGljIGRlY2xhcmF0aW9ucywgdW5uZWVkZWQgZnVuY3Rpb25zLCBhbmQgb3RoZXIgY2x1dHRlciAodGhpcyBjYW4gb2Z0ZW4gYmUgZm91bmQgYnkganVzdCBydW5uaW5nIFNXSUcpLgotPGxpPkFkZCBzdXBwb3J0IGZ1bmN0aW9ucyB0byBpbXByb3ZlIHRoZSBpbnRlcmZhY2UuCi08L3VsPgotPHA+Ci1XaGlsZSBTV0lHIGNhbiBzb21ldGltZXMgYmUgdXNlZCB0byBzaW1wbHkgcHJvY2VzcyBhIHJhdyBoZWFkZXIgZmlsZSwgdGhlIHJlc3VsdHMgYXJlbid0IGFsd2F5cyB3aGF0IHlvdSB3b3VsZCBleHBlY3QuICAgQnkgd29ya2luZyB3aXRoIGEgc2VwYXJhdGUgaW50ZXJmYWNlIGZpbGUsIHlvdSBnZXQgYW4gb3Bwb3J0dW5pdHkgdG8gY2xlYW4gdGhpbmdzIHVwLiAgIElmIHlvdSdyZSB1c2luZyBhIHN0YWJsZSBwYWNrYWdlLCBjaGFuY2VzIGFyZSB0aGF0IGl0J3Mgbm90IGdvaW5nIHRvIGNoYW5nZSBzdWRkZW5seSBzbyB0aGVyZSBpcyByZWFsbHkgbGl0dGxlIHByb2JsZW0gaW4gZG9pbmcgdGhpcy4gICBUbyBpbGx1c3RyYXRlIHRoZSBwcm9jZXNzLCB3ZSB3aWxsIGJ1aWxkIGEgUGVybDUgaW50ZXJmYWNlIHRvIE1BVExBQiBpbiB0aGUgbmV4dCBleGFtcGxlLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgyPiBCdWlsZGluZyBhIFBlcmw1IGludGVyZmFjZSB0byBNQVRMQUI8L2gyPgotVG8gaWxsdXN0cmF0ZSB0aGUgcHJvY2Vzcywgd2UgY2FuIGJ1aWxkIGEgUGVybDUgaW50ZXJmYWNlIHRvIE1BVExBQiBieSB3cmFwcGluZyBpdHMgQyBBUEkuICBUaGUgTUFUTEFCIHN5c3RlbSBjb25zaXN0cyBvZiB0aGUgTUFUTEFCIGVuZ2luZSwgYW5kIGxpYnJhcnkgb2YgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIG1hdHJpY2VzLCBhbmQgYSBjb2xsZWN0aW9uIG9mIHV0aWxpdHkgZnVuY3Rpb24uICBBIGZ1bGwgZGVzY3JpcHRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSAiRXh0ZXJuYWwgSW50ZXJmYWNlIEd1aWRlIiBwcm92aWRlZCB3aXRoIE1BVExBQi4gICBFdmVuIGlmIHlvdSBkb24ndCBoYXZlIE1BVExBQiwgdGhpcyBzZWN0aW9uIGNhbiBwcm92aWRlIHNvbWUgaWRlYXMgb24gaG93IHRvIGhhbmRsZSBvdGhlciBsaWJyYXJpZXMuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IFRoZSBNQVRMQUIgZW5naW5lIGludGVyZmFjZTwvaDM+Ci1UaGUgZmlyc3Qgc3RlcCBpbiBidWlsZGluZyBhbiBpbnRlcmZhY2Ugd2lsbCBiZSB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUgTUFUTEFCIGVuZ2luZS4gIFRoaXMgaXMgYSBzZXBhcmF0ZSBwcm9jZXNzIHRoYXQgcnVucyBpbiB0aGUgYmFja2dyb3VuZCwgYnV0IHdlIG5lZWQgdG8gaGF2ZSBzb21lIG1lY2hhbmlzbSBmb3Igc3RhcnRpbmcgaXQgYW5kIGlzc3VpbmcgY29tbWFuZHMuICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgTUFUTEFCIGludGVyZmFjZS4sPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+PHR0PmludCAgICAgIGVuZ0Nsb3NlKEVuZ2luZSAqZXApOwotaW50ICAgICAgZW5nRXZhbFN0cmluZyhFbmdpbmUgKmVwLCBjaGFyICpzdHJpbmcpOwotTWF0cml4ICAqZW5nR2V0TWF0cml4KEVuZ2luZSAqZXAsIGNoYXIgKm5hbWUpOwotaW50ICAgICAgZW5nUHV0TWF0cml4KEVuZ2luZSAqZXAsIE1hdHJpeCAqbXApOwotRW5naW5lICAqZW5nT3BlbihjaGFyICpzdGFydGNvbW1hbmQpOwotdm9pZCAgICAgZW5nT3V0cHV0QnVmZmVyKEVuZ2luZSAqZXAsIGNoYXIgKnAsIGludCBzaXplKTsKLQotPC90dD48L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSB3ZSBjb3VsZCB3cmFwIHRoZXNlIGRpcmVjdGx5LCBlYWNoIGZ1bmN0aW9uIHJlcXVpcmVzIGFuIG9iamVjdCAiRW5naW5lIi4gICBUaGV5IGNvdWxkIGJlIGEgbGl0dGxlIGFubm95aW5nIHRvIHVzZSBpbiBQZXJsIHNpbmNlIHdlIHdvdWxkIGhhdmUgdG8gcGFzcyBhIHBvaW50ZXIgdG8gdGhlIGVuZ2luZSB3aXRoIGV2ZXJ5IGNvbW1hbmQuICAgVGhpcyBwcm9iYWJseSBpc24ndCBuZWNlc3Nhcnkgb3IgZGVzaXJlZC4gICAgIFRodXMsIHdlIGNvdWxkIHdyaXRlIHNvbWUgd3JhcHBlcnMgYXJvdW5kIHRoZXNlIHRvIHByb2R1Y2UgYSBiZXR0ZXIgaW50ZXJmYWNlIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIGVuZ2luZS5pIDogU1dJRyBmaWxlIGZvciBNQVRMQUIgZW5naW5lCi0lewotI2RlZmluZSBCVUZGRVJfU0laRSAgIDMyNzY4Ci1zdGF0aWMgRW5naW5lICAqZW5nID0gMDsKLXN0YXRpYyBjaGFyICAgbWxfb3V0cHV0W0JVRkZFUl9TSVpFXTsgICAvKiBSZXN1bHQgQnVmZmVyICovCi0lfQotCi0laW5saW5lICV7Ci0KLQotLyogSW5pdGlhbGl6ZSB0aGUgTUFUTEFCIGVuZ2luZSAqLwotaW50IGluaXQodm9pZCkgewotCWlmIChlbmcpIHJldHVybiAtMTsgICAvKiBBbHJlYWR5IG9wZW4gKi8KLQlpZiAoIShlbmcgPSBlbmdPcGVuKCJtYXRsYWI0MiIpKSkgewotCSAgZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBvcGVuIG1hdGxhYi5cbiIpOwotCSAgcmV0dXJuIC0xOwotICAgICAgIH0KLQllbmdPdXRwdXRCdWZmZXIoZW5nLG1sX291dHB1dCxCVUZGRVJfU0laRSk7Ci0JcmV0dXJuIDA7Ci19Ci0vKiBFeGVjdXRlIGEgTUFUTEFCIGNvbW1hbmQgKi8KLWNoYXIgKm1hdGxhYihjaGFyICpjKSB7Ci0JaWYgKCFlbmcpIHJldHVybiAibm90IGluaXRpYWxpemVkISI7Ci0JZW5nRXZhbFN0cmluZyhlbmcsIGMpOwotCXJldHVybiAmYW1wO21sX291dHB1dFswXTsKLX0KLQotLyogR2V0IGEgbWF0cml4IGZyb20gTUFUTEFCICovCi1NYXRyaXggKkdldE1hdHJpeChjaGFyICpuYW1lKSB7Ci0JaWYgKCFlbmcpIHJldHVybiAoTWF0cml4ICopIDA7Ci0JcmV0dXJuKGVuZ0dldE1hdHJpeChlbmcsbmFtZSkpOwotfQotCi0vKiBTZW5kIGEgbWF0cml4IHRvIE1BVExBQiAqLwotaW50IFB1dE1hdHJpeChNYXRyaXggKm0pIHsKLQlpZiAoIWVuZykgcmV0dXJuIC0xOwotCXJldHVybihlbmdQdXRNYXRyaXgoZW5nLG0pKTsKLX0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4zNCI+PC9hPjxoMz4gV3JhcHBpbmcgdGhlIE1BVExBQiBtYXRyaXggZnVuY3Rpb25zPC9oMz4KLU5leHQsIHdlIG5lZWQgdG8gYnVpbGQgYW4gaW50ZXJmYWNlIHRvIHRoZSBNQVRMQUIgbWF0cml4IG1hbmlwdWxhdGlvbiBsaWJyYXJ5LiAgIFRoaXMgbGlicmFyeSBjb250YWlucyBhYm91dCAzMCBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBib3RoIHJlYWwgYW5kIGNvbXBsZXggdmFsdWVkIG1hdHJpY2VzLiAgSGVyZSB3ZSB3aWxsIG9ubHkgY29uc2lkZXIgcmVhbC12YWx1ZWQgbWF0cmljZXMuICAgIFRvIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBtYXRyaWNlcywgd2UnbGwgd3JpdGUgYSBkaWZmZXJlbnQgaW50ZXJmYWNlIGZpbGUgd2l0aCBhIGxpc3Qgb2YgdGhlIGZ1bmN0aW9ucyBhbG9uZyB3aXRoIGEgZmV3IGhlbHBlciBmdW5jdGlvbnMuPHA+Ci08YmxvY2txdW90ZT48cHJlPgotLy8KLS8vIG14LmkgOiBTV0lHIGZpbGUgZm9yIE1BVExBQiBtYXRyaXggbWFuaXB1bGF0aW9uCi0laW5saW5lICV7Ci0vKiBHZXQgYW4gZWxlbWVudCBmcm9tIGEgbWF0cml4ICovCi1kb3VibGUgZ2V0cihNYXRyaXggKm1hdCwgaW50IGksIGludCBqKSB7Ci0gIGRvdWJsZSAqcHI7Ci0gIGludCBtOwotICBwciA9IG14R2V0UHIobWF0KTsKLSAgbSA9IG14R2V0TShtYXQpOwotICByZXR1cm4gcHJbbSpqICsgaV07Ci19Ci0vKiBTZXQgYW4gZWxlbWVudCBvZiBhIG1hdHJpeCAqLwotdm9pZCBzZXRyKE1hdHJpeCAqbWF0LCBpbnQgaSwgaW50IGosIGRvdWJsZSB2YWwpIHsKLSAgZG91YmxlICpwcjsKLSAgaW50IG07Ci0gIHByID0gbXhHZXRQcihtYXQpOwotICBtID0gbXhHZXRNKG1hdCk7Ci0gICAgcHJbbSpqICsgaV0gPSB2YWw7Ci19Ci0lfQotCi0vKiBOb3cgc29tZSBNQVRMQUIgY29tbWFuZCAqLwotTWF0cml4ICpteENyZWF0ZUZ1bGwoaW50IG0sIGludCBuLCBpbnQgQ29tcGxleEZsYWcpOwotaW50IG14R2V0TShNYXRyaXggKm1hdCk7Ci1pbnQgbXhHZXROKE1hdHJpeCAqbWF0KTsKLWNoYXIgKm14R2V0TmFtZShNYXRyaXggKm1hdCk7Ci12b2lkIG14U2V0TmFtZShNYXRyaXggKm1hdCwgY2hhciAqbmFtZSk7Ci1kb3VibGUgKm14R2V0UHIoTWF0cml4ICptYXQpOwotdm9pZCBteFNldFByKE1hdHJpeCAqbWF0LCBkb3VibGUgKnByKTsKLWRvdWJsZSBteEdldFNjYWxhcihNYXRyaXggKm1hdCk7Ci12b2lkIG14RnJlZU1hdHJpeChNYXRyaXggKnBtKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gUHV0dGluZyBpdCBhbGwgdG9nZXRoZXI8L2gzPgotRmluYWxseSB3ZSBhcmUgcmVhZHkgdG8gcHV0IG91ciBpbnRlcmZhY2UgdG9nZXRoZXIuICAgVGhlcmUgaXMgbm8gbmVlZCB0byBidWlsZCBhIGJpZyBtb25vbGl0aGljIGludGVyZmFjZSBmaWxlLS13ZSBjYW4gc2ltcGx5IGJ1aWxkIGl0IHVwIGluIHBpZWNlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gbWF0bGFiLmkKLS8vIFNpbXBsZSBTV0lHIGludGVyZmFjZSB0byBNQVRMQUIKLSVtb2R1bGUgbWF0bGFiCi0lewotI2luY2x1ZGUgImVuZ2luZS5oIgotJX0KLSVpbmNsdWRlIGVuZ2luZS5pCi0laW5jbHVkZSBteC5pCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU91ciBtb2R1bGUgY2FuIGJlIGNvbXBpbGVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC1wZXJsNSBtYXRsYWIuaQotdW5peCAmZ3Q7IGdjYyAtYyBtYXRsYWJfd3JhcC5jIC1JL3Vzci9sb2NhbC9saWIvcGVybDUvYXJjaC1vc25hbWUvNS4wMDMvQ09SRSAtRGJvb2w9Y2hhciAKLQktSSQoTUFUTEFCKS9leHRlcm4vaW5jbHVkZQotdW5peCAmZ3Q7IGxkIC1zaGFyZWQgbWF0bGFiX3dyYXAubyAtTCQoTUFUTEFCKS9leHRlcm4vbGliIC1sbWF0IC1vIG1hdGxhYi5zbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVyZTx0dD4gJChNQVRMQUIpIDwvdHQ+aXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBNQVRMQUIgaW5zdGFsbGF0aW9uICh5b3UgbWF5IGhhdmUgdG8gZGlnIGZvciB0aGlzKS48cD4KLTxwPgotV2l0aCBvdXIgbmV3IE1BVExBQiBtb2R1bGUsIHdlIGNhbiBub3cgd3JpdGUgUGVybCBzY3JpcHRzIHRoYXQgaXNzdWUgTUFUTEFCIGNvbW1hbmRzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIG1hdGxhYjsKLW1hdGxhYjo6aW5pdCgpOwotbWF0bGFiOjptYXRsYWIoInggPSAtODouMjU6ODsgXAotICAgICAgICAgICAgICAgIHkgPSB4OyBcCi0gICAgICAgICAgICAgICAgW1gsWV0gPSBtZXNoZ3JpZCh4LHkpOyBcCi0gICAgICAgICAgICAgICAgUiA9IHNxcnQoWC5eMiArIFkuXjIpK2VwczsgXAotICAgICAgICAgICAgICAgIFogPSBzaW4oUikuL1I7IFwKLSAgICAgICAgICAgICAgICBtZXNoKFopOyAiKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQ3JlYXRlcyBhIHNpbXBsZSAzRCBzdXJmYWNlIHBsb3QuPHA+Ci08YSBuYW1lPSJuMzYiPjwvYT48aDM+IEdyYXBoaWNhbCBXZWItU3RhdGlzdGljcyBpbiBQZXJsNTwvaDM+Ci1Ob3csIGxldHMgdXNlIG91ciBNQVRMQUIgbW9kdWxlIHRvIGdlbmVyYXRlIHBsb3RzIG9mIHdlYi1zZXJ2ZXIgaGl0cyBmb3IgYSBnaXZlbiBtb250aC4gIFRvIGRvIHRoaXMsIHdlJ2xsIHVzZSBvdXIgTUFUTEFCIG1vZHVsZSwgYW5kIGNyZWF0ZSBhIHNwZWNpYWwgcHVycG9zZSBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBkYXlzIGFuZCBob3Vycy4gICA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBTaW1wbGUgQyBmdW5jdGlvbiBmb3IgcmVjb3JkaW5nIGEgaGl0Ci0lbW9kdWxlIHdlYmdyYXBoCi0laW5saW5lICUKLQl2b2lkIGhpdChkb3VibGUgKm0sIGludCBkYXksIGludCBob3VyKSB7Ci0JCWlmICgoZGF5ICZndDs9IDApICZhbXA7JmFtcDsgKGRheSAmbHQ7PSAzMSkpIHsKLQkJCSoobSsyNCooZGF5LTEpK2hvdXIpICs9IDEuMDsKLQkJfQotCX0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIHdlIGNvdWxkIHdyaXRlIHRoaXMgZnVuY3Rpb24gaW4gUGVybCwgaXQgd2lsbCBiZSBtdWNoIGZhc3RlciBpbiBDLiAgSWYgd2UncmUgcHJvY2Vzc2luZyBhIGh1Z2UgZmlsZSwgdGhlbiB0aGUgZXh0cmEgYml0IG9mIHBlcmZvcm1hbmNlIHdpbGwgaGVscCB1cyBvdXQuICBPbmNlIGNvbXBpbGVkLCB3ZSBjYW4gbm93IHdyaXRlIGEgUGVybDUgc2NyaXB0IGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIG1hdGxhYjsKLXVzZSB3ZWJncmFwaDsKLQotIyBJbml0aWFsaXplIG1hdGxhYiBlbmdpbmUKLW1hdGxhYjo6aW5pdCgpOwotIyBNYWtlIGEgbWF0cml4IGZvciBhbGwgaGl0cwotJG1fYWxsID0gbWF0bGFiOjpteENyZWF0ZUZ1bGwoMjQsMzEsMCk7Ci1tYXRsYWI6Om14U2V0TmFtZSgkbV9hbGwsImFsbCIpOwotJGFsbCA9IG1hdGxhYjo6bXhHZXRQcigkbV9hbGwpOyAgICAgICAgICMgR2V0IGRvdWJsZSAqIG9mIE1hdHJpeAotCi1mb3JlYWNoICRmaWxlIChAQVJHVikgewotICBvcGVuKEZJTEUsJGZpbGUpOwotICBwcmludCAiUHJvY2Vzc2luZyAiLCRmaWxlLCJcbiI7Ci0gIHdoaWxlICgmbHQ7RklMRSZndDspIHsJCQotICAgIEBmaWVsZHMgPSBzcGxpdCgvXHMrLywgJF8pOwotICAgIG5leHQgaWYgKCRmaWVsZHNbOF0gIT0gMjAwKTsKLSAgICBAZGF0ZXRpbWUgPSBzcGxpdCgvXFt8XC98Oi8sICRmaWVsZHNbM10pOwotICAgIGlmICgkZGF0ZXRpbWVbMl0gPX4gL0Fwci8pIHsKLSAgICAgIHdlYmdyYXBoOjpoaXQoJGFsbCwgJGRhdGV0aW1lWzFdLCRkYXRldGltZVs0XSk7Ci0gICAgfQotICB9Ci0gICMgRHVtcCB0ZW1wb3JhcnkgcmVzdWx0cwotfSAgI2ZvcmVhY2gKLW1hdGxhYjo6UHV0TWF0cml4KCRtX2FsbCk7Ci1tYXRsYWI6Om1hdGxhYigiZmlndXJlKDEpOyBcCi0gICAgICAgICAgICAgICAgc3VyZihhbGwpOyBcCi0gICAgICAgICAgICAgICAgdmlldyg0MCw0MCk7IFwKLSAgICAgICAgICAgICAgICBzaGFkaW5nIGludGVycDsgXAotICAgICAgICAgICAgICAgIHRpdGxlKCdBbGwgaGl0cycpOyBcCi0gICAgICAgICAgICAgICAgc2V0KGdjYSwneGxhYmVsJyx0ZXh0KDAsMCwnRGF5JykpOyBcCi0gICAgICAgICAgICAgICAgc2V0KGdjYSwneWxhYmVsJyx0ZXh0KDAsMCwnSG91cicpKTsgXAotICAgICAgICAgICAgICAgIHByaW50IC1kZ2lmOCBzdGF0c19hbGwuZ2lmIik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gcnVuIG9uIHRoZSB3ZWItc2VydmVyIGxvZ3MgZm9yIHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgsIHRoaXMgc2NyaXB0IHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgR0lGIGZpbGUgKHNob3dpbmcgaGl0cyBwZXIgaG91cikgOjxwPgotPHA+PGNlbnRlcj48aW1nIHNyYz0iY2g4LjMucG5nIj48L2NlbnRlcj48cD4KLTxwPgotPHA+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDI+IEhhbmRsaW5nIG91dHB1dCB2YWx1ZXMgKHRoZSBlYXN5IHdheSk8L2gyPgotU29tZSBDIGxpYnJhcmllcyByZWx5IG9uIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB2YWx1ZXMgaW4gdGhlaXIgYXJndW1lbnRzLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZmFkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KSB7Ci0JKnJlc3VsdCA9IGErYjsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQnkgZGVmYXVsdCwgU1dJRyBkb2VzIG5vdCBoYW5kbGUgdGhpcyBjYXNlIChsZWF2aW5nIGl0IHVwIHRvIHlvdSB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gYWJvdXQgdGhlIDx0dD5yZXN1bHQ8L3R0PiBwYXJhbWV0ZXIpLiAgSG93ZXZlciwgdGhpcyBwcm9ibGVtIGlzIGVhc2lseSBmaXhlZCB1c2luZyB0aGUgPHR0PnR5cGVtYXBzLmk8L3R0PiBsaWJyYXJ5IGZpbGUgKHNlZSB0aGUgVHlwZW1hcHMgY2hhcHRlciBmb3IgbW9yZSBpbmZvcm1hdGlvbikuICAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFNXSUcgaW50ZXJmYWNlIGZpbGUgd2l0aCBvdXRwdXQgYXJndW1lbnRzCi0lbW9kdWxlIGV4YW1wbGUKLQotJWluY2x1ZGUgdHlwZW1hcHMuaSAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgdHlwZW1hcHMgbGlicmF5cgotJWFwcGx5IGRvdWJsZSAqT1VUUFVUIHtkb3VibGUgKnJlc3VsdH07ICAgLy8gTWFrZSAicmVzdWx0IiBhbiBvdXRwdXQgcGFyYW1ldGVyCi0KLXZvaWQgZmFkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB1c2VkIGluIGEgUGVybCBzY3JpcHQsIHRoZSBmYWRkIGZ1bmN0aW9uIG5vdyB0YWtlcyAyIHBhcmFtZXRlcnMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4kYSA9IGZhZGQoMyw0KTsgICAgICAgICAgICAjICRhIGdldHMgdGhlIHZhbHVlIG9mIGRvdWJsZSAqcmVzdWx0Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gbXVsdGlwbGUgb3V0cHV0IGFyZ3VtZW50cyBhcmUgaW52b2x2ZWQsIGEgUGVybCBhcnJheSBvZiB2YWx1ZXMgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLiAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIFBlcmwgcmVmZXJlbmNlcyBhcyBmdW5jdGlvbiB2YWx1ZXMuICBUaGlzIGlzIGRvbmUgYXMgc2hvd24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFNXSUcgaW50ZXJmYWNlIGZpbGUgd2l0aCBvdXRwdXQgYXJndW1lbnRzCi0lbW9kdWxlCi0laW5jbHVkZSB0eXBlbWFwcy5pCi0KLSVhcHBseSBkb3VibGUgKlJFRkVSRU5DRSB7ZG91YmxlICpyZXN1bHR9OyAgICAvLyBNYWtlICJyZXN1bHQiIGEgUGVybCByZWZlcmVuY2UKLQotdm9pZCBmYWRkKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpyZXN1bHQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3cgaW4gYSBQZXJsIHNjcmlwdCwgdGhlIGZ1bmN0aW9uIHdvcmtzIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JGMgPSAwLjA7ICAgICAgICAgICAgICAgICAgICAjIFZhcmlhYmxlIGZvciBob2xkaW5nIHRoZSByZXN1bHQKLWZhZGQoMyw0LFwkYyk7ICAgICAgICAgICAgICAgIyBmYWRkKCkgcGxhY2VzIHRoZSByZXN1bHQgaW4gJGMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gYWRkaXRpb24gdG8gaGFuZGxpbmcgcG9pbnRlcnMgYXMgb3V0cHV0IHZhbHVlcyBvciByZWZlcmVuY2VzLCB0d28gb3RoZXIgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLiAgVGhlIDx0dD5JTlBVVDwvdHQ+IG1ldGhvZCBpbmRpY2F0ZXMgdGhhdCBhIHBvaW50ZXIgaXMgYW4gaW5wdXQgdmFsdWUgYW5kIHRoZSA8dHQ+Qk9USDwvdHQ+IG1ldGhvZCBpbmRpY2F0ZXMgdGhhdCBhIHBvaW50ZXIgaXMgYm90aCBhbiBpbnB1dCBhbmQgb3V0cHV0IHZhbHVlLiAgICBUaGVzZSB3b3VsZCBiZSBzcGVjaWZpZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWFwcGx5IGRvdWJsZSAqSU5QVVQge2RvdWJsZSAqaW59OyAgICAgICAgIC8vIGRvdWJsZSAqaW4gaXMgYW4gaW5wdXQgdmFsdWUKLSVhcHBseSBkb3VibGUgKkJPVEgge2RvdWJsZSAqcn07ICAgICAgICAgICAvLyBkb3VibGUgKnIgaXMgYm90aCBhbiBpbnB1dC9vdXRwdXQgdmFsdWUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBwcm9jZXNzaW5nIG9mIGRhdGF0eXBlcyBpcyBidWlsdCB1c2luZyBTV0lHJ3MgdHlwZW1hcCBtZWNoYW5pc20uICAgVGhlIGRldGFpbHMgb2YgdHlwZW1hcHMgaXMgZGVzY3JpYmVkIHNob3J0bHkgYWx0aG91Z2ggdGhlIDx0dD50eXBlbWFwcy5pPC90dD4gbGlicmFyeSBhbHJlYWR5IGluY2x1ZGVzIGEgdmFyaWV0eSBvZiB1c2VmdWwgdHlwZW1hcHMgcmVhZHkgZm9yIHVzZS48cD4KLTxhIG5hbWU9Im4xMyI+PC9hPjxoMj4gRXhjZXB0aW9uIGhhbmRsaW5nIDwvaDI+Ci1UaGUgU1dJRyA8dHQ+JWV4Y2VwdDwvdHQ+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSB1c2VyLWRlZmluYWJsZSBleGNlcHRpb24gaGFuZGxlciBmb3IgY29udmVydGluZyBleGNlcHRpb25zIGluIHlvdXIgQy9DKysgcHJvZ3JhbSBpbnRvIFBlcmwgZXhjZXB0aW9ucy4gIFRoZSBjaGFwdGVyIG9uIGV4Y2VwdGlvbiBoYW5kbGluZyBjb250YWlucyBtb3JlIGRldGFpbHMsIGJ1dCBzdXBwb3NlIHlvdSBoYXZlIGEgQysrIGNsYXNzIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotY2xhc3MgUmFuZ2VFcnJvciB7fTsgICAvLyBVc2VkIGZvciBhbiBleGNlcHRpb24KLQotY2xhc3MgRG91YmxlQXJyYXkgewotICBwcml2YXRlOgotICAgIGludCBuOwotICAgIGRvdWJsZSAqcHRyOwotICBwdWJsaWM6Ci0gICAgLy8gQ3JlYXRlIGEgbmV3IGFycmF5IG9mIGZpeGVkIHNpemUKLSAgICBEb3VibGVBcnJheShpbnQgc2l6ZSkgewotICAgICAgcHRyID0gbmV3IGRvdWJsZVtzaXplXTsKLSAgICAgIG4gPSBzaXplOwotICAgIH0KLSAgICAvLyBEZXN0cm95IGFuIGFycmF5Ci0gICAgfkRvdWJsZUFycmF5KCkgewotICAgICAgIGRlbGV0ZSBwdHI7Ci0gICAgfQotICAgIC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheQotICAgIGludCAgIGxlbmd0aCgpIHsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIC8vIEdldCBhbiBpdGVtIGZyb20gdGhlIGFycmF5IGFuZCBwZXJmb3JtIGJvdW5kcyBjaGVja2luZy4KLSAgICBkb3VibGUgZ2V0aXRlbShpbnQgaSkgewotICAgICAgaWYgKChpICZndDs9IDApICZhbXA7JmFtcDsgKGkgJmx0OyBuKSkKLSAgICAgICAgcmV0dXJuIHB0cltpXTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigpOwotICAgIH0KLQotICAgIC8vIFNldCBhbiBpdGVtIGluIHRoZSBhcnJheSBhbmQgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcuCi0gICAgdm9pZCBzZXRpdGVtKGludCBpLCBkb3VibGUgdmFsKSB7Ci0gICAgICBpZiAoKGkgJmd0Oz0gMCkgJmFtcDsmYW1wOyAoaSAmbHQ7IG4pKQotICAgICAgICBwdHJbaV0gPSB2YWw7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigpOwotICAgICAgfQotICAgIH0KLSAgfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcyBjYW4gdGhyb3cgYSByYW5nZSBleGNlcHRpb24gZm9yIGFuIG91dC1vZi1ib3VuZHMgYXJyYXkgYWNjZXNzLiAgIFdlIGNhbiBjYXRjaCB0aGlzIGluIG91ciBQZXJsIGV4dGVuc2lvbiBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgaW4gYW4gaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQocGVybDUpIHsKLSAgdHJ5IHsKLSAgICAkZnVuY3Rpb24gICAgICAgICAgICAgICAgLy8gR2V0cyBzdWJzdGl0dXRlZCBieSBhY3R1YWwgZnVuY3Rpb24gY2FsbAotICB9Ci0gIGNhdGNoIChSYW5nZUVycm9yKSB7Ci0gICAgY3JvYWsoIkFycmF5IGluZGV4IG91dC1vZi1ib3VuZHMiKTsKLSAgfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3csIHdoZW4gdGhlIEMrKyBjbGFzcyB0aHJvd3MgYSBSYW5nZUVycm9yIGV4Y2VwdGlvbiwgb3VyIHdyYXBwZXIgZnVuY3Rpb25zIHdpbGwgY2F0Y2ggaXQsIHR1cm4gaXQgaW50byBhIFBlcmwgZXhjZXB0aW9uLCBhbmQgYWxsb3cgYSBncmFjZWZ1bCBkZWF0aCBhcyBvcHBvc2VkIHRvIGp1c3QgaGF2aW5nIHNvbWUgc29ydCBvZiBteXN0ZXJpb3VzIHByb2dyYW0gY3Jhc2guICAgICBTaW5jZSBTV0lHJ3MgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIHVzZXItZGVmaW5hYmxlLCB3ZSBhcmUgbm90IGxpbWl0ZWQgdG8gQysrIGV4Y2VwdGlvbiBoYW5kbGluZy4gICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHdyaXRlIGEgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgZXhjZXB0aW9uIGhhbmRsZXIgdGhhdCB3b3JrcyB3aXRoIG90aGVyIHNjcmlwdGluZyBsYW5ndWFnZXMuIFBsZWFzZSBzZWUgdGhlIGNoYXB0ZXIgb24gZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBtb3JlIGRldGFpbHMuPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDI+IFJlbWFwcGluZyBkYXRhdHlwZXMgd2l0aCB0eXBlbWFwczwvaDI+Ci1XaGlsZSBTV0lHIGRvZXMgYSByZWFzb25hYmxlIGpvYiB3aXRoIG1vc3QgQy9DKysgZGF0YXR5cGVzLCBpdCBkb2Vzbid0IGFsd2F5cyBkbyB3aGF0IHlvdSB3YW50LiAgIEhvd2V2ZXIsIHlvdSBjYW4gcmVtYXAgU1dJRydzIHRyZWF0bWVudCBvZiBqdXN0IGFib3V0IGFueSBkYXRhdHlwZSB1c2luZyBhIHR5cGVtYXAuICBBIHR5cGVtYXAgc2ltcGx5IHNwZWNpZmllcyBhIGNvbnZlcnNpb24gYmV0d2VlbiBQZXJsIGFuZCBDIGRhdGF0eXBlcyBhbmQgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBmdW5jdGlvbiBhcmd1bWVudHMsIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXMsIGFuZCBtb3JlLiAgQSBzaW1pbGlhciBtZWNoYW5pc20gaXMgdXNlZCBieSB0aGUgeHN1YnBwIGNvbXBpbGVyIHByb3ZpZGVkIHdpdGggUGVybCBhbHRob3VnaCB0aGUgU1dJRyB2ZXJzaW9uIHByb3ZpZGVzIG1hbnkgbW9yZSBvcHRpb25zLjxwPgotPGEgbmFtZT0ibjM3Ij48L2E+PGgzPiBBIHNpbXBsZSB0eXBlbWFwIGV4YW1wbGU8L2gzPgotVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyBhIHNpbXBsZSB0eXBlbWFwIGNhbiBiZSB3cml0dGVuIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLQotJXR5cGVtYXAocGVybDUsaW4pIGludCB7Ci0JJHRhcmdldCA9IChpbnQpIFN2SVYoJHNvdXJjZSk7Ci0JcHJpbnRmKCJSZWNlaXZlZCBhbiBpbnRlZ2VyIDogJWRcbiIsICR0YXJnZXQpOwotfQotLi4uCi1leHRlcm4gaW50IGZhY3QoaW50IG4pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UeXBlbWFwIHNwZWNpZmljYXRpb25zIHJlcXVpcmUgYSBsYW5ndWFnZSBuYW1lLCBtZXRob2QgbmFtZSwgZGF0YXR5cGUsIGFuZCBjb252ZXJzaW9uIGNvZGUuIEZvciBQZXJsNSwgInBlcmw1IiBzaG91bGQgYmUgdXNlZCBhcyB0aGUgbGFuZ3VhZ2UgbmFtZS4gIFRoZSAiaW4iIG1ldGhvZCByZWZlcnMgdG8gdGhlIGlucHV0IGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uLiAgVGhlIGBpbnQnIGRhdGF0eXBlIHRlbGxzIFNXSUcgdGhhdCB3ZSBhcmUgcmVtYXBwaW5nIGludGVnZXJzLiAgIFRoZSBjb252ZXJzaW9uIGNvZGUgaXMgdXNlZCB0byBjb252ZXJ0IGZyb20gYSBQZXJsIHNjYWxhciB2YWx1ZSB0byAgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YXR5cGUuICBXaXRoaW4gdGhlIHN1cHBvcnQgY29kZSwgdGhlIHZhcmlhYmxlPHR0PiAkc291cmNlPC90dD4gY29udGFpbnMgdGhlIHNvdXJjZSBkYXRhIChhIFBlcmwgb2JqZWN0KSBhbmQgPHR0PiR0YXJnZXQ8L3R0PiBjb250YWlucyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNvbnZlcnNpb24gKGEgQyBsb2NhbCB2YXJpYWJsZSkuIDxwPgotPHA+Ci1XaGVuIHRoaXMgZXhhbXBsZSBpcyB1c2VkIGluIFBlcmw1LCBpdCB3aWxsIG9wZXJhdGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dXNlIGV4YW1wbGU7Ci0kbiA9IGV4YW1wbGU6OmZhY3QoNik7Ci1wcmludCAiJG5cbiI7Ci0uLi4KLQotT3V0cHV0IDoKLVJlY2VpdmVkIGFuIGludGVnZXIgOiA2Ci03MjAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotR2VuZXJhbCBkaXNjdXNzaW9uIG9mIHR5cGVtYXBzIGNhbiBiZSBmb3VuZCBpbiB0aGUgbWFpbiBTV0lHIHVzZXJzIHJlZmVyZW5jZS4gIDxwPgotPGEgbmFtZT0ibjM4Ij48L2E+PGgzPiBQZXJsNSB0eXBlbWFwczwvaDM+Ci1UaGUgZm9sbG93aW5nIHR5cGVtYXAgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvIFBlcmw1IG1vZHVsZXM8cD4KLTxwPgotPHR0PiV0eXBlbWFwKHBlcmw1LGluKTwvdHQ+ICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydHMgUGVybDUgb2JqZWN0IHRvIGlucHV0IGZ1bmN0aW9uIGFyZ3VtZW50cy48cD4KLTx0dD4ldHlwZW1hcChwZXJsNSxvdXQpPC90dD4gICAgICAgICAgICAgICAgICAgICBDb252ZXJ0cyBmdW5jdGlvbiByZXR1cm4gdmFsdWUgdG8gYSBQZXJsNSB2YWx1ZS48cD4KLTx0dD4ldHlwZW1hcChwZXJsNSx2YXJpbik8L3R0PiAgICAgICAgICAgICAgICBDb252ZXJ0cyBhIFBlcmw1IG9iamVjdCB0byBhIGdsb2JhbCB2YXJpYWJsZS48cD4KLTx0dD4ldHlwZW1hcChwZXJsNSx2YXJvdXQpPC90dD4gICAgICAgICAgICAgQ29udmVydHMgYSBnbG9iYWwgdmFyaWFibGUgdG8gYSBQZXJsNSBvYmplY3QuPHA+Ci08dHQ+JXR5cGVtYXAocGVybDUsZnJlZWFyZyk8L3R0PiAgICAgICAgICBDbGVhbnMgdXAgYSBmdW5jdGlvbiBhcmd1bWVudCBhZnRlciBhIGZ1bmN0aW9uIGNhbGw8cD4KLTx0dD4ldHlwZW1hcChwZXJsNSxhcmdvdXQpPC90dD4gICAgICAgICAgICAgT3V0cHV0IGFyZ3VtZW50IGhhbmRsaW5nPHA+Ci08dHQ+JXR5cGVtYXAocGVybDUscmV0KSAgICAgICAgPC90dD5DbGVhbiB1cCByZXR1cm4gdmFsdWUgZnJvbSBhIGZ1bmN0aW9uLjxwPgotPHR0PiV0eXBlbWFwKG1lbWJlcmluKTwvdHQ+ICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyBvZiBDKysgbWVtYmVyIGRhdGEgKGFsbCBsYW5ndWFnZXMpLjxwPgotPHR0PiV0eXBlbWFwKG1lbWJlcm91dCk8L3R0PiAgICAgICAgICAgICAgICAgICAgIFJldHVybiBvZiBDKysgbWVtYmVyIGRhdGEgKGFsbCBsYW5ndWFnZXMpLjxwPgotPHR0PiV0eXBlbWFwKHBlcmw1LGNoZWNrKTwvdHQ+ICAgICAgICAgICAgICAgQ2hlY2sgdmFsdWUgb2YgaW5wdXQgcGFyYW1ldGVyLjxwPgotPGEgbmFtZT0ibjM5Ij48L2E+PGgzPiBUeXBlbWFwIHZhcmlhYmxlczwvaDM+Ci1UaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtYXkgYmUgdXNlZCB3aXRoaW4gdGhlIEMgY29kZSB1c2VkIGluIGEgdHlwZW1hcCA6PHA+Ci08cD4KLTx0dD4kc291cmNlPC90dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSB2YWx1ZSBvZiBhIGNvbnZlcnNpb248cD4KLTx0dD4kdGFyZ2V0PC90dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldCBvZiBjb252ZXJzaW9uICh3aGVyZSByZXN1bHQgc2hvdWxkIGJlIHN0b3JlZCk8cD4KLTx0dD4kdHlwZTwvdHQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDIGRhdGF0eXBlIGJlaW5nIHJlbWFwcGVkPHA+Ci08dHQ+JG1hbmdsZTwvdHQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5nbGVkIHZlcnNpb24gb2YgZGF0YXR5cGUgKGZvciBibGVzc2luZyBvYmplY3RzKTxwPgotPHR0PiRhcmc8L3R0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBhcmd1bWVudCAod2hlbiBhcHBsaWNhYmxlKS48cD4KLTxhIG5hbWU9Im40MCI+PC9hPjxoMz4gTmFtZSBiYXNlZCB0eXBlIGNvbnZlcnNpb248L2gzPgotVHlwZW1hcHMgYXJlIGJhc2VkIGJvdGggb24gdGhlIGRhdGF0eXBlIGFuZCBhbiBvcHRpb25hbCBuYW1lIGF0dGFjaGVkIHRvIGEgZGF0YXR5cGUuICAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZm9vCi0KLS8vIFRoaXMgdHlwZW1hcCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGNoYXIgKiogZnVuY3Rpb24gYXJndW1lbnRzCi0ldHlwZW1hcChwZXJsNSxpbikgY2hhciAqKiB7IC4uLiB9Ci0KLS8vIFRoaXMgdHlwZW1hcCBpcyBhcHBsaWVkIG9ubHkgdG8gY2hhciAqKiBhcmd1bWVudHMgbmFtZWQgYGFyZ3YnCi0ldHlwZW1hcChwZXJsNSxpbikgY2hhciAqKmFyZ3YgeyAuLi4gfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGV4YW1wbGUsIHR3byB0eXBlbWFwcyBhcmUgYXBwbGllZCB0byB0aGUgY2hhciAqKiBkYXRhdHlwZS4gIEhvd2V2ZXIsIHRoZSBzZWNvbmQgdHlwZW1hcCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBhcmd1bWVudHMgbmFtZWQgYGFyZ3YnLiAgQSBuYW1lZCB0eXBlbWFwIHdpbGwgYWx3YXlzIG92ZXJyaWRlIGFuIHVubmFtZWQgdHlwZW1hcC48cD4KLTxwPgotRHVlIHRvIHRoZSBuYW1lIG1hdGNoaW5nIHNjaGVtZSwgdHlwZW1hcHMgZG8gbm90IGZvbGxvdyB0eXBlZGVmIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcChwZXJsNSxpbikgZG91YmxlIHsKLQkuLi4gZ2V0IGEgZG91YmxlIC4uLgotfQotCi1kb3VibGUgZm9vKGRvdWJsZSk7ICAgICAgICAgICAgICAvLyBVc2VzIHRoZSBkb3VibGUgdHlwZW1hcCBhYm92ZQotdHlwZWRlZiBkb3VibGUgUmVhbDsKLVJlYWwgYmFyKFJlYWwpOyAgICAgICAgICAgICAgICAgIC8vIERvZXMgbm90IHVzZSB0aGUgdHlwZW1hcCBhYm92ZSAoZG91YmxlICE9IFJlYWwpCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUlzIGlzIG9kZCBiZWhhdmlvciB0byBiZSBzdXJlLCBidXQgeW91IGNhbiB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbSB1c2luZyB0aGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcChwZXJsNSxpbikgZG91YmxlIHsKLQkuLi4gZ2V0IGEgZG91YmxlIC4uLgotfQotZG91YmxlIGZvbyhkb3VibGUpOyAgICAgICAgICAgICAgLy8gVXNlcyB0aGUgZG91YmxlIHR5cGVtYXAgYWJvdmUKLQotdHlwZWRlZiBkb3VibGUgUmVhbDsKLSVhcHBseSBkb3VibGUgeyBSZWFsIH07ICAgICAgICAgIC8vIEFwcGx5IHRoZSBkb3VibGUgdHlwZW1hcCB0byBSZWFscy4KLVJlYWwgYmFyKFJlYWwpOyAgICAgICAgICAgICAgICAgIC8vIFVzZXMgdGhlIGRvdWJsZSB0eXBlbWFwIGFscmVhZHkgZGVmaW5lZC4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTmFtZWQgdHlwZW1hcHMgYXJlIGV4dHJlbWVseSB1c2VmdWwgZm9yIG1hbmFnaW5nIHNwZWNpYWwgY2FzZXMuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBuYW1lZCB0eXBlbWFwcyB0byBwcm9jZXNzIG91dHB1dCBhcmd1bWVudHMgKGllLiBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBoYXZlIHZhbHVlcyByZXR1cm5lZCBpbiB0aGVtKS48cD4KLTxhIG5hbWU9Im40MSI+PC9hPjxoMz4gQ29udmVydGluZyBhIFBlcmw1IGFycmF5IHRvIGEgY2hhciAqKiA8L2gzPgotQSBjb21tb24gcHJvYmxlbSBpbiBtYW55IEMgcHJvZ3JhbXMgaXMgdGhlIHByb2Nlc3Npbmcgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgd2hpY2ggYXJlIHVzdWFsbHkgcGFzc2VkIGluIGFuIGFycmF5IG9mIE5VTEwgdGVybWluYXRlZCBzdHJpbmdzLiAgVGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlIGFsbG93cyBhIFBlcmw1IGFycmF5IHJlZmVyZW5jZSB0byBiZSB1c2VkIGFzIGEgY2hhciAqKiBkYXRhdHlwZS48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGFyZ3YKLQotLy8gVGhpcyB0ZWxscyBTV0lHIHRvIHRyZWF0IGNoYXIgKiogYXMgYSBzcGVjaWFsIGNhc2UKLSV0eXBlbWFwKHBlcmw1LGluKSBjaGFyICoqIHsKLQlBViAqdGVtcGF2OwotCUkzMiBsZW47Ci0JaW50IGk7Ci0JU1YgICoqdHY7Ci0JaWYgKCFTdlJPSygkc291cmNlKSkKLQkgICAgY3JvYWsoIiRzb3VyY2UgaXMgbm90IGEgcmVmZXJlbmNlLiIpOwotICAgICAgICBpZiAoU3ZUWVBFKFN2UlYoJHNvdXJjZSkpICE9IFNWdF9QVkFWKQotCSAgICBjcm9haygiJHNvdXJjZSBpcyBub3QgYW4gYXJyYXkuIik7Ci0gICAgICAgdGVtcGF2ID0gKEFWKilTdlJWKCRzb3VyY2UpOwotCWxlbiA9IGF2X2xlbih0ZW1wYXYpOwotCSR0YXJnZXQgPSAoY2hhciAqKikgbWFsbG9jKChsZW4rMikqc2l6ZW9mKGNoYXIgKikpOwotCWZvciAoaSA9IDA7IGkgJmx0Oz0gbGVuOyBpKyspIHsKLQkgICAgdHYgPSBhdl9mZXRjaCh0ZW1wYXYsIGksIDApOwkKLQkgICAgJHRhcmdldFtpXSA9IChjaGFyICopIFN2UFYoKnR2LG5hKTsKLSAgICAgICAgfQotCSR0YXJnZXRbaV0gPSAwOwotfTsKLQotLy8gVGhpcyBjbGVhbnMgdXAgb3VyIGNoYXIgKiogYXJyYXkgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwKLSV0eXBlbWFwKHBlcmw1LGZyZWVhcmcpIGNoYXIgKiogewotCWZyZWUoJHNvdXJjZSk7Ci19Ci0KLS8vIENyZWF0ZXMgYSBuZXcgUGVybCBhcnJheSBhbmQgcGxhY2VzIGEgY2hhciAqKiBpbnRvIGl0Ci0ldHlwZW1hcChwZXJsNSxvdXQpIGNoYXIgKiogewotCUFWICpteWF2OwotCVNWICoqc3ZzOwotCWludCBpID0gMCxsZW4gPSAwOwotCS8qIEZpZ3VyZSBvdXQgaG93IG1hbnkgZWxlbWVudHMgd2UgaGF2ZSAqLwotCXdoaWxlICgkc291cmNlW2xlbl0pCi0JICAgbGVuKys7Ci0Jc3ZzID0gKFNWICoqKSBtYWxsb2MobGVuKnNpemVvZihTViAqKSk7Ci0JZm9yIChpID0gMDsgaSAmbHQ7IGxlbiA7IGkrKykgewotCSAgICBzdnNbaV0gPSBzdl9uZXdtb3J0YWwoKTsKLQkgICAgc3Zfc2V0cHYoKFNWKilzdnNbaV0sJHNvdXJjZVtpXSk7Ci0JfTsKLQlteWF2ID0JYXZfbWFrZShsZW4sc3ZzKTsKLQlmcmVlKHN2cyk7Ci0gICAgICAgJHRhcmdldCA9IG5ld1JWKChTViopbXlhdik7Ci0gICAgICAgc3ZfMm1vcnRhbCgkdGFyZ2V0KTsKLX0KLQotLy8gTm93IGEgZmV3IHRlc3QgZnVuY3Rpb25zCi0laW5saW5lICV7Ci1pbnQgcHJpbnRfYXJncyhjaGFyICoqYXJndikgewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoYXJndltpXSkgewotICAgICAgICAgcHJpbnRmKCJhcmd2WyVkXSA9ICVzXG4iLCBpLGFyZ3ZbaV0pOwotICAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLQotLy8gUmV0dXJucyBhIGNoYXIgKiogbGlzdCAKLWNoYXIgKipnZXRfYXJncygpIHsKLSAgICBzdGF0aWMgY2hhciAqdmFsdWVzW10gPSB7ICJEYXZlIiwgIk1pa2UiLCAiU3VzYW4iLCAiSm9obiIsICJNaWNoZWxsZSIsIDB9OwotICAgIHJldHVybiAmYW1wO3ZhbHVlc1swXTsKLX0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gdGhpcyBtb2R1bGUgaXMgY29tcGlsZWQsIG91ciB3cmFwcGVkIEMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluIGEgUGVybCBzY3JpcHQgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotdXNlIGFyZ3Y7Ci1AYSA9ICgiRGF2ZSIsICJNaWtlIiwgIkpvaG4iLCAiTWFyeSIpOyAgICAgICAgICAgIyBDcmVhdGUgYW4gYXJyYXkgb2Ygc3RyaW5ncwotYXJndjo6cHJpbnRfYXJncyhcQGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUGFzcyBpdCB0byBvdXIgQyBmdW5jdGlvbgotJGIgPSBhcmd2OjpnZXRfYXJncygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgR2V0IGFycmF5IG9mIHN0cmluZ3MgZnJvbSBDCi1wcmludCBAJGIsIlxuIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQcmludCBpdCBvdXQKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotT2YgY291cnNlLCB0aGVyZSBhcmUgbWFueSBvdGhlciBwb3NzaWJpbGl0aWVzLiAgQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYXJyYXkgcmVmZXJlbmNlcywgd2UgY291bGQgcGFzcyBpbiBzdHJpbmdzIHNlcGFyYXRlZCBieSBzb21lIGRlbGltZXRlciBhbmQgcGVyZm9ybSBhIHNwbGl0dGluZyBvcGVyYXRpb24gaW4gQy4gPHA+Ci08YSBuYW1lPSJuNDIiPjwvYT48aDM+IFVzaW5nIHR5cGVtYXBzIHRvIHJldHVybiB2YWx1ZXM8L2gzPgotU29tZXRpbWVzIGl0IGlzIGRlc2lyYWJsZSBmb3IgYSBmdW5jdGlvbiB0byByZXR1cm4gYSB2YWx1ZSBpbiBvbmUgb2YgaXRzIGFyZ3VtZW50cy4gQSBuYW1lZCB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIGhhbmRsZSB0aGlzIGNhc2UuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSByZXR1cm4KLQotLy8gVGhpcyB0ZWxscyBTV0lHIHRvIHRyZWF0IGFuIGRvdWJsZSAqIGFyZ3VtZW50IHdpdGggbmFtZSAnT3V0RG91YmxlJyBhcwotLy8gYW4gb3V0cHV0IHZhbHVlLiAgCi0KLSV0eXBlbWFwKHBlcmw1LGFyZ291dCkgZG91YmxlICpPdXREb3VibGUgewotCSR0YXJnZXQgPSBzdl9uZXdtb3J0YWwoKTsKLQlzdl9zZXRudigkdGFyZ2V0LCAqJHNvdXJjZSk7Ci0JYXJndmkrKzsgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcmV0dXJuIGNvdW50IC0tIGltcG9ydGFudCEgKi8KLX0KLQotLy8gSWYgd2UgZG9uJ3QgY2FyZSB3aGF0IHRoZSBpbnB1dCB2YWx1ZSBpcywgd2UgY2FuIG1ha2UgdGhlIHR5cGVtYXAgaWdub3JlIGl0LgotCi0ldHlwZW1hcChwZXJsNSxpZ25vcmUpIGRvdWJsZSAqT3V0RG91YmxlKGRvdWJsZSBqdW5rKSB7Ci0JJHRhcmdldCA9ICZhbXA7anVuazsgICAgICAgLyoganVuayBpcyBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgKi8KLX0KLQotLy8gTm93IGEgZnVuY3Rpb24gdG8gdGVzdCBpdAotJXsKLS8qIFJldHVybnMgdGhlIGZpcnN0IHR3byBpbnB1dCBhcmd1bWVudHMgKi8KLWludCBtdWx0b3V0KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpvdXQxLCBkb3VibGUgKm91dDIpIHsKLQkqb3V0MSA9IGE7Ci0JKm91dDIgPSBiOwotCXJldHVybiAwOwotfTsKLSV9Ci0KLS8vIElmIHdlIG5hbWUgYm90aCBwYXJhbWV0ZXJzIE91dERvdWJsZSBib3RoIHdpbGwgYmUgb3V0cHV0Ci0KLWludCBtdWx0b3V0KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpPdXREb3VibGUsIGRvdWJsZSAqT3V0RG91YmxlKTsKLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIG91dHB1dCBhcmd1bWVudHMgYXJlIGVuY291bnRlcmVkLCB0aGV5IGFyZSBzaW1wbHkgYXBwZW5kZWQgdG8gdGhlIHN0YWNrIHVzZWQgdG8gcmV0dXJuIHJlc3VsdHMuICAgVGhpcyB3aWxsIHNob3cgdXAgYXMgYW4gYXJyYXkgd2hlbiB1c2VkIGluIFBlcmwuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+QHIgPSBtdWx0b3V0KDcsMTMpOwotcHJpbnQgIm11bHRvdXQoNywxMykgPSBAclxuIjsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjQzIj48L2E+PGgzPiBBY2Nlc3NpbmcgYXJyYXkgc3RydWN0dXJlIG1lbWJlcnM8L2gzPgotQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2RlZmluZSBOQU1FTEVOICAgMzIKLXR5cGVkZWYgc3RydWN0IHsKLQljaGFyICAgbmFtZVtOQU1FTEVOXTsKLQkuLi4KLX0gUGVyc29uOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1CeSBkZWZhdWx0LCBTV0lHIGRvZXNuJ3Qga25vdyBob3cgdG8gdGhlIGhhbmRsZSB0aGUgbmFtZSBzdHJ1Y3R1cmUgc2luY2UgaXQncyBhbiBhcnJheSwgbm90IGEgcG9pbnRlci4gIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG1ha2UgdGhlIGFycmF5IG1lbWJlciByZWFkb25seS4gICAgSG93ZXZlciwgbWVtYmVyIHR5cGVtYXBzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdGhpcyBtZW1iZXIgd3JpdGFibGUgZnJvbSBQZXJsIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKG1lbWJlcmluKSBjaGFyW05BTUVMRU5dIHsKLQkvKiBDb3B5IGF0IG1vc3QgTkFNRUxFTiBjaGFyYWN0ZXJzIGludG8gJHRhcmdldCAqLwotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLE5BTUVMRU4pOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuZXZlciBhIDx0dD5jaGFyW05BTUVMRU5dPC90dD4gdHlwZSBpcyBlbmNvdW50ZXJlZCBpbiBhIHN0cnVjdHVyZSBvciBjbGFzcywgdGhpcyB0eXBlbWFwIHByb3ZpZGVzIGEgc2FmZSBtZWNoYW5pc20gZm9yIHNldHRpbmcgaXRzIHZhbHVlLiAgIEFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG1pZ2h0IGNob29zZSB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBuYW1lIHdhcyB0b28gbG9uZyB0byBmaXQgaW50byB0aGUgZmllbGQuPHA+Ci08cD4KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSA8dHQ+W05BTUVMRU5dPC90dD4gYXJyYXkgc2l6ZSBpcyBhdHRhY2hlZCB0byB0aGUgdHlwZW1hcC4gQSBkYXRhdHlwZSBpbnZvbHZpbmcgc29tZSBvdGhlciBraW5kIG9mIGFycmF5IHdvdWxkIGJlIGFmZmVjdGVkLiAgIEhvd2V2ZXIsIHdlIGNhbiB3cml0ZSBhIHR5cGVtYXAgdGhhdCB3aWxsIHdvcmsgZm9yIGFueSBhcnJheSBkaW1lbnNpb24gYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAobWVtYmVyaW4pIGNoYXIgW0FOWV0gewotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLCRkaW0wKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBjb2RlIGlzIGdlbmVyYXRlZCwgPHR0PiRkaW0wPC90dD4gZ2V0cyBmaWxsZWQgaW4gd2l0aCB0aGUgcmVhbCBhcnJheSBkaW1lbnNpb24uPHA+Ci08YSBuYW1lPSJuNDQiPjwvYT48aDM+IFR1cm5pbmcgUGVybCByZWZlcmVuY2VzIGludG8gQyBwb2ludGVyczwvaDM+Ci1BIGZyZXF1ZW50IGNvbmZ1c2lvbiBvbiB0aGUgU1dJRyBtYWlsaW5nIGxpc3QgaXMgZXJyb3JzIGNhdXNlZCBieSB0aGUgbWl4aW5nIG9mIFBlcmwgcmVmZXJlbmNlcyBhbmQgQyBwb2ludGVycy4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIGEgQyBmdW5jdGlvbiB0aGF0IG1vZGlmaWVzIGl0cyBhcmd1bWVudHMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGFkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqYykgewotCSpjID0gYSArIGI7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUEgY29tbW9uIG1pc2ludGVycHJldGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIGZvbGxvd2luZyBQZXJsIHNjcmlwdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBQZXJsIHNjcmlwdAotJGEgPSAzLjU7Ci0kYiA9IDcuNTsKLSRjID0gMC4wOyAgICAgICAgICAjIE91dHB1dCB2YWx1ZQotYWRkKCRhLCRiLFwkYyk7ICAgICMgUGxhY2UgcmVzdWx0IGluIGMgKEV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3Qgd29yaykKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVW5mb3J0dW5hdGVseSwgdGhpcyBkb2VzIE5PVCB3b3JrLiAgVGhlcmUgYXJlIG1hbnkgcmVhc29ucyBmb3IgdGhpcywgYnV0IHRoZSBtYWluIG9uZSBpcyB0aGF0IFNXSUcgaGFzIG5vIGlkZWEgd2hhdCBhIDx0dD5kb3VibGUgKjwvdHQ+IHJlYWxseSBpcy4gIEl0IGNvdWxkIGJlIGFuIGlucHV0IHZhbHVlLCBhbiBvdXRwdXQgdmFsdWUsIG9yIGFuIGFycmF5IG9mIDIgbWlsbGlvbiBlbGVtZW50cy4gIEFzIGEgcmVzdWx0LCBTV0lHIGxlYXZlcyBpdCBhbG9uZSBhbmQgbG9va3MgZXhjbHVzaXZlbHkgZm9yIGEgQyBwb2ludGVyIHZhbHVlICh3aGljaCBpcyBub3QgdGhlIHNhbWUgYXMgYSBQZXJsIHJlZmVyZW5jZS0td2VsbCwgYXQgbGVhc3Qgbm90ZSBvZiB0aGUgdHlwZSB1c2VkIGluIHRoZSBhYm92ZSBzY3JpcHQpLjxwPgotPHA+Ci1Ib3dldmVyLCB5b3UgY2FuIHVzZSBhIHR5cGVtYXAgdG8gZ2V0IHRoZSBkZXNpcmVkIGVmZmVjdC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHBlcmw1LGluKSBkb3VibGUgKiAoZG91YmxlIGR2YWx1ZSkgewotICBTViogdGVtcHN2OwotICBpZiAoIVN2Uk9LKCRzb3VyY2UpKSB7Ci0gICAgY3JvYWsoImV4cGVjdGVkIGEgcmVmZXJlbmNlXG4iKTsKLSAgfQotICB0ZW1wc3YgPSBTdlJWKCRzb3VyY2UpOwotICBpZiAoKCFTdk5PSyh0ZW1wc3YpKSAmYW1wOyZhbXA7ICghU3ZJT0sodGVtcHN2KSkpIHsKLSAgICBjcm9haygiZXhwZWN0ZWQgYSBkb3VibGUgcmVmZXJlbmNlXG4iKTsKLSAgfQotICBkdmFsdWUgPSBTdk5WKHRlbXBzdik7Ci0gICR0YXJnZXQgPSAmYW1wO2R2YWx1ZTsKLX0KLQotJXR5cGVtYXAocGVybDUsYXJnb3V0KSBkb3VibGUgKiB7Ci0gIFNWICp0ZW1wc3Y7Ci0gIHRlbXBzdiA9IFN2UlYoJGFyZyk7Ci0gIHN2X3NldG52KHRlbXBzdiwgKiRzb3VyY2UpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3csIGlmIHlvdSBwbGFjZSB0aGlzIGJlZm9yZSBvdXIgYWRkIGZ1bmN0aW9uLCB3ZSBjYW4gZG8gdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JGEgPSAzLjU7Ci0kYiA9IDcuNTsKLSRjID0gMC4wOwotYWRkKCRhLCRiLFwkYyk7ICAgICAgICAgICAgIyBOb3cgaXQgd29ya3MhCi1wcmludCAiJGNcbiI7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVlvdSdsbCBnZXQgdGhlIG91dHB1dCB2YWx1ZSBvZiAiMTEuMCIgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHdlIHdhbnRlZC4gICBXaGlsZSB0aGlzIGlzIHByZXR0eSBjb29sLCBpdCBzaG91bGQgYmUgc3RyZXNzZWQgdGhhdCB5b3UgY2FuIGVhc2lseSBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdCB3aXRoIHR5cGVtYXBzLS1vZiBjb3Vyc2UgU1dJRyBpcyBoYXMgbmV2ZXIgYmVlbiB0b28gY29uY2VybmVkIGFib3V0IGxlZ2lzbGF0aW5nIG1vcmFsaXR5Li4uLjxwPgotPGEgbmFtZT0ibjQ1Ij48L2E+PGgzPiBVc2VmdWwgZnVuY3Rpb25zPC9oMz4KLVdoZW4gd3JpdGluZyB0eXBlbWFwcywgaXQgaXMgbmVjZXNzYXJ5IHRvIHdvcmsgZGlyZWN0bHkgd2l0aCBQZXJsNSBvYmplY3RzLiAgICBUaGlzLCB1bmZvcnR1bmF0ZWx5LCBjYW4gYmUgYSBkYXVudGluZyB0YXNrLiAgQ29uc3VsdCB0aGUgInBlcmxndXRzIiBtYW4tcGFnZSBmb3IgYWxsIG9mIHRoZSByZWFsbHkgdWdseSBkZXRhaWxzLiAgQSBzaG9ydCBzdW1tYXJ5IG9mIGNvbW1vbmx5IHVzZWQgZnVuY3Rpb25zIGlzIHByb3ZpZGVkIGhlcmUgZm9yIHJlZmVyZW5jZS4gIEl0IHNob3VsZCBiZSBzdHJlc3NlZCB0aGF0IFNXSUcgY2FuIGJlIHVzZWYgcXVpdGUgZWZmZWN0aXZlbHkgd2l0aG91dCBrbm93aW5nIGFueSBvZiB0aGVzZSBkZXRhaWxzLS1lc3BlY2lhbGx5IG5vdyB0aGF0IHRoZXJlIGFyZSB0eXBlbWFwIGxpYnJhcmllcyB0aGF0IGNhbiBhbHJlYWR5IGJlZW4gd3JpdHRlbi48cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iY2g4LnRhYmxlLjEucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g4LnRhYmxlLjIucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g4LnRhYmxlLjMucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g4LnRhYmxlLjQucG5nIj48YnI+Ci08L2NlbnRlcj48cD4KLTxwPgotPGEgbmFtZT0ibjQ2Ij48L2E+PGgzPiBTdGFuZGFyZCB0eXBlbWFwczwvaDM+Ci1UaGUgZm9sbG93aW5nIHR5cGVtYXBzIHNob3cgaG93IHRvIGNvbnZlcnQgYSBmZXcgY29tbW9uIHR5cGVzIG9mIG9iamVjdHMgYmV0d2VlbiBQZXJsIGFuZCBDIChhbmQgdG8gZ2l2ZSBhIGJldHRlciBpZGVhIG9mIGhvdyBldmVyeXRoaW5nIHdvcmtzKS4gPHA+Ci08Y2VudGVyPgotPGltZyBzcmM9ImNoOC50YWJsZS41LnBuZyI+PGJyPgotPGltZyBzcmM9ImNoOC50YWJsZS42LnBuZyI+PGJyPgotPC9jZW50ZXI+PHA+Ci08cD4KLTxhIG5hbWU9Im40NyI+PC9hPjxoMz4gUG9pbnRlciBoYW5kbGluZzwvaDM+Ci1TV0lHIHBvaW50ZXJzIGFyZSByZXByZXNlbnRlZCBhcyBibGVzc2VkIHJlZmVyZW5jZXMuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW5kIHJlYWQgcG9pbnRlciB2YWx1ZXMuPHA+Ci08Y2VudGVyPgotPGltZyBzcmM9ImNoOC50YWJsZS43LnBuZyI+Ci08L2NlbnRlcj48cD4KLTxhIG5hbWU9Im40OCI+PC9hPjxoMz4gUmV0dXJuIHZhbHVlcyA8L2gzPgotUmV0dXJuIHZhbHVlcyBhcmUgcGxhY2VkIG9uIHRoZSBhcmd1bWVudCBzdGFjayBvZiBlYWNoIHdyYXBwZXIgZnVuY3Rpb24uICBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgc3RhY2sgcG9pbnRlciBpcyBjb250YWluZWQgaW4gYSB2YXJpYWJsZSA8dHQ+YXJndmk8L3R0Pi4gIFdoZW5ldmVyIGEgbmV3IG91dHB1dCB2YWx1ZSBpcyBhZGRlZCwgaXQgaXMgY3JpdGljYWwgdGhhdCB0aGlzIHZhbHVlIGJlIGluY3JlbWVudGVkLiAgIEZvciBtdWx0aXBsZSBvdXRwdXQgdmFsdWVzLCB0aGUgZmluYWwgdmFsdWUgb2YgPHR0PmFyZ3ZpPC90dD4gc2hvdWxkIGJlIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3V0cHV0IHZhbHVlcy4gPHA+Ci08cD4KLVRoZSB0b3RhbCBudW1iZXIgb2YgcmV0dXJuIHZhbHVlcyBzaG91bGQgbm90IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIGlucHV0IHZhbHVlcyB1bmxlc3MgeW91IGV4cGxpY2l0bHkgZXh0ZW5kIHRoZSBhcmd1bWVudCBzdGFjay4gICBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSA8dHQ+RVhURU5EKCk8L3R0PiBtYWNybyBhcyBpbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAocGVybDUsYXJnb3V0KSBpbnQgKk9VVFBVVCB7Ci0JaWYgKGFyZ3ZpICZndDs9IGl0ZW1zKSB7ICAgICAgICAgICAgCi0JCUVYVEVORChzcCwxKTsgICAgICAgICAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgYnkgMSBvYmplY3QgKi8KLQl9Ci0JJHRhcmdldCA9IHN2X25ld21vcnRhbCgpOwotCXN2X3NldGl2KCR0YXJnZXQsKElWKSAqKCRzb3VyY2UpKTsKLQlhcmd2aSsrOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjE1Ij48L2E+PGgyPiBUaGUgZ29yeSBkZXRhaWxzIG9uIHNoYWRvdyBjbGFzc2VzPC9oMj4KLVBlcmw1IHNoYWRvdyBjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZCBvbiB0b3Agb2YgdGhlIGxvdy1sZXZlbCBDIGludGVyZmFjZSBwcm92aWRlZCBieSBTV0lHLiAgIEJ5IGltcGxlbWVudGluZyB0aGUgY2xhc3NlcyBpbiBQZXJsIGluc3RlYWQgb2YgQywgd2UgZ2V0IGEgbnVtYmVyIG9mIGFkdmFudGFnZXMgOjxwPgotPHA+Ci08dWw+Ci08bGk+VGhlIGNsYXNzZXMgYXJlIGVhc2llciB0byBpbXBsZW1lbnQgKGFmdGVyIGFsbCBQZXJsIG1ha2VzIGxvdHMgb2YgdGhpbmdzIGVhc2llcikuCi08bGk+Qnkgd3JpdGluZyBpbiBQZXJsLCB0aGUgY2xhc3NlcyB0ZW5kIHRvIGludGVyYWN0IGJldHRlciB3aXRoIG90aGVyIFBlcmwgb2JqZWN0cyBhbmQgcHJvZ3JhbXMuCi08bGk+WW91IGNhbiBtb2RpZnkgdGhlIHJlc3VsdGluZyBQZXJsIGNvZGUgd2l0aG91dCByZWNvbXBpbGluZyB0aGUgQyBtb2R1bGUuCi08L3VsPgotPHA+Ci1TaGFkb3cgY2xhc3NlcyBhcmUgbmV3IGluIFNXSUcgMS4xIGFuZCBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwuICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgYSBjb21iaW5hdGlvbiBvZiBjb250cmlidXRpb25zIHByb3ZpZGVkIGJ5IEdhcnkgSG9sdCBhbmQgRGF2aWQgRmxldGNoZXItLW1hbnkgdGhhbmtzITxwPgotPGEgbmFtZT0ibjQ5Ij48L2E+PGgzPiAgTW9kdWxlIGFuZCBwYWNrYWdlIG5hbWVzPC9oMz4KLVdoZW4gc2hhZG93IGNsYXNzaW5nIGlzIGVuYWJsZWQsIFNXSUcgZ2VuZXJhdGVzIGEgbG93LWxldmVsIHBhY2thZ2UgbmFtZWQgYG1vZHVsZWMnIHdoZXJlIGBtb2R1bGUnIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgeW91IHByb3ZpZGVkIHdpdGggdGhlIDx0dD4lbW9kdWxlPC90dD4gZGlyZWN0aXZlIChTV0lHIGFwcGVuZHMgYSBgYycgdG8gdGhlIG5hbWUgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyB0aGUgbG93LWxldmVsIEMgYmluZGluZ3MpLiAgICAgVGhpcyBsb3ctbGV2ZWwgcGFja2FnZSBpcyBleGFjdGx5IHRoZSBzYW1lIG1vZHVsZSB0aGF0IFNXSUcgd291bGQgaGF2ZSBjcmVhdGVkIHdpdGhvdXQgdGhlIDx0dD5gLXNoYWRvdzwvdHQ+JyBvcHRpb24sIG9ubHkgcmVuYW1lZC48cD4KLTxwPgotVXNpbmcgdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UsIFNXSUcgY3JlYXRlcyBQZXJsIHdyYXBwZXJzIGFyb3VuZCBjbGFzc2VzLCBzdHJ1Y3RzLCBhbmQgZnVuY3Rpb25zLiAgICBUaGlzIGNvbGxlY3Rpb24gb2Ygd3JhcHBlcnMgYmVjb21lcyB0aGUgUGVybCBtb2R1bGUgdGhhdCB5b3Ugd2lsbCB1c2UgaW4geW91ciBQZXJsIGNvZGUsIG5vdCB0aGUgbG93LWxldmVsIHBhY2thZ2UgKHRoZSBvcmlnaW5hbCBwYWNrYWdlIGlzIGhpZGRlbiwgYnV0IHdvcmtpbmcgYmVoaW5kIHRoZSBzY2VuZXMpLjxwPgotPGEgbmFtZT0ibjUwIj48L2E+PGgzPiBXaGF0IGdldHMgY3JlYXRlZD88L2gzPgotU3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIFNXSUcgaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgdmVjdG9yCi1zdHJ1Y3QgVmVjdG9yIHsKLQlWZWN0b3IoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik7Ci0JflZlY3RvcigpOwotCWRvdWJsZSB4LHksejsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gd3JhcHBlZCwgU1dJRyBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGxvdy1sZXZlbCBhY2Nlc3NvciBmdW5jdGlvbnMuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+VmVjdG9yICpuZXdfVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotdm9pZCAgICBkZWxldGVfVmVjdG9yKFZlY3RvciAqdik7Ci1kb3VibGUgIFZlY3Rvcl94X2dldChWZWN0b3IgKnYpOwotZG91YmxlICBWZWN0b3JfeF9zZXQoVmVjdG9yICp2LCBkb3VibGUgdmFsdWUpOwotZG91YmxlICBWZWN0b3JfeV9nZXQoVmVjdG9yICp2KTsKLWRvdWJsZSAgVmVjdG9yX3lfc2V0KFZlY3RvciAqdiwgZG91YmxlIHZhbHVlKTsKLWRvdWJsZSAgVmVjdG9yX3pfZ2V0KFZlY3RvciAqdik7Ci1kb3VibGUgIFZlY3Rvcl96X3NldChWZWN0b3IgKnYsIGRvdWJsZSB2YWx1ZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZXNlIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHVzZWQgdG8gY3JlYXRlIGEgUGVybCBzaGFkb3cgY2xhc3MgdGhhdCBsb29rcyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnBhY2thZ2UgVmVjdG9yOwotQElTQSA9IHF3KCB2ZWN0b3IgKTsKLSVPV05FUiA9ICgpOwotJUJMRVNTRURNRU1CRVJTID0gKCk7Ci0KLXN1YiBuZXcgKCkgewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgbXkgQGFyZ3MgPSBAXzsKLSAgICAkc2VsZiA9IHZlY3RvcmM6Om5ld19WZWN0b3IoQGFyZ3MpOwotICAgIHJldHVybiB1bmRlZiBpZiAoIWRlZmluZWQoJHNlbGYpKTsKLSAgICBibGVzcyAkc2VsZiwgIlZlY3RvciI7Ci0gICAgJE9XTkVSeyRzZWxmfSA9IDE7Ci0gICAgbXkgJXJldHZhbDsKLSAgICB0aWUgJXJldHZhbCwgIlZlY3RvciIsICRzZWxmOwotICAgIHJldHVybiBibGVzcyBcJXJldHZhbCwiVmVjdG9yIjsKLX0KLQotc3ViIERFU1RST1kgewotICAgIG15ICRzZWxmID0gc2hpZnQ7IAotICAgIGlmIChleGlzdHMgJE9XTkVSeyRzZWxmfSkgewotCSBkZWxldGVfVmVjdG9yKCRzZWxmKSk7Ci0JIGRlbGV0ZSAkT1dORVJ7JHNlbGZ9OwotfQotCi1zdWIgRkVUQ0ggewotICAgIG15ICgkc2VsZiwkZmllbGQpID0gQF87Ci0gICAgbXkgJG1lbWJlcl9mdW5jID0gInZlY3RvcmM6OlZlY3Rvcl8ke2ZpZWxkfV9nZXQiOwotICAgIG15ICR2YWwgPSAmYW1wOyRtZW1iZXJfZnVuYygkc2VsZik7Ci0gICAgaWYgKGV4aXN0cyAkQkxFU1NFRE1FTUJFUlN7JGZpZWxkfSkgewotICAgICAgICByZXR1cm4gdW5kZWYgaWYgKCFkZWZpbmVkKCR2YWwpKTsKLSAgICAgICAgbXkgJXJldHZhbDsKLSAgICAgICAgdGllICVyZXR2YWwsJEJMRVNTRURNRU1CRVJTeyRmaWVsZH0sJHZhbDsKLSAgICAgICAgcmV0dXJuIGJsZXNzIFwlcmV0dmFsLCAkQkxFU1NFRE1FTUJFUlN7JGZpZWxkfTsKLSAgICB9Ci0gICAgcmV0dXJuICR2YWw7Ci19Ci0KLXN1YiBTVE9SRSB7Ci0gICAgbXkgKCRzZWxmLCRmaWVsZCwkbmV3dmFsKSA9IEBfOwotICAgIG15ICRtZW1iZXJfZnVuYyA9ICJ2ZWN0b3JjOjpWZWN0b3JfJHtmaWVsZH1fc2V0IjsKLSAgICBpZiAoZXhpc3RzICRCTEVTU0VETUVNQkVSU3skZmllbGR9KSB7Ci0gICAgICAgICZhbXA7JG1lbWJlcl9mdW5jKCRzZWxmLHRpZWQoJXskbmV3dmFsfSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICZhbXA7JG1lbWJlcl9mdW5jKCRzZWxmLCRuZXd2YWwpOwotICAgIH0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRWFjaCBzdHJ1Y3R1cmUgb3IgY2xhc3MgaXMgbWFwcGVkIGludG8gYSBQZXJsIHBhY2thZ2Ugb2YgdGhlIHNhbWUgbmFtZS4gVGhlIEMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFyZSBtYXBwZWQgaW50byBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvciB0aGUgcGFja2FnZSBhbmQgYXJlIGFsd2F5cyBuYW1lZCAibmV3IiBhbmQgIkRFU1RST1kiLiAgICBUaGUgY29uc3RydWN0b3IgYWx3YXlzIHJldHVybnMgYSB0aWVkIGhhc2ggdGFibGUuICAgVGhpcyBoYXNoIHRhYmxlIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBtZW1iZXIgdmFyaWFibGVzIG9mIGEgc3RydWN0dXJlIGluIGFkZGl0aW9uIHRvIGJlaW5nIGFibGUgdG8gaW52b2tlIG1lbWJlciBmdW5jdGlvbnMuICBUaGUgPHR0PiVPV05FUjwvdHQ+IGFuZCA8dHQ+JUJMRVNTRURNRU1CRVJTPC90dD4gaGFzaCB0YWJsZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBhbmQgZGVzY3JpYmVkIHNob3J0bHkuIDxwPgotPHA+Ci1UbyB1c2Ugb3VyIG5ldyBzaGFkb3cgY2xhc3Mgd2UgY2FuIHNpbXBseSBkbyB0aGUgZm9sbG93aW5nOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgUGVybCBjb2RlIHVzaW5nIFZlY3RvciBjbGFzcwotJHYgPSBuZXcgVmVjdG9yKDIsMyw0KTsKLSR3ID0gVmVjdG9yLSZndDtuZXcoLTEsLTIsLTMpOwotCi0jIEFzc2lnbm1lbnQgb2YgYSBzaW5nbGUgbWVtYmVyCi0kdi0mZ3Q7e3h9ID0gNy41OwotCi0jIEFzc2lnbm1lbnQgb2YgYWxsIG1lbWJlcnMKLSUkdiA9ICggeD0mZ3Q7MywKLQkgeT0mZ3Q7OSwKLQkgej0mZ3Q7LTIpOwotCi0jIFJlYWRpbmcgbWVtYmVycwotJHggPSAkdi0mZ3Q7e3h9OwotCi0jIERlc3RydWN0aW9uCi0kdi0mZ3Q7REVTVFJPWSgpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNTEiPjwvYT48aDM+IE9iamVjdCBPd25lcnNoaXA8L2gzPgotSW4gb3JkZXIgZm9yIHNoYWRvdyBjbGFzc2VzIHRvIHdvcmsgcHJvcGVybHksIGl0IGlzIG5lY2Vzc2FyeSBmb3IgUGVybCB0byBtYW5hZ2Ugc29tZSBtZWNoYW5pc20gb2Ygb2JqZWN0IG93bmVyc2hpcC4gICBIZXJlJ3MgdGhlIGNydXggb2YgdGhlIHByb2JsZW0tLS1zdXBwb3NlIHlvdSBoYWQgYSBmdW5jdGlvbiBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlZlY3RvciAqVmVjdG9yX2dldChWZWN0b3IgKnYsIGludCBpbmRleCkgewotCXJldHVybiAmYW1wO3ZbaV07Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgZnVuY3Rpb24gdGFrZXMgYSBWZWN0b3IgcG9pbnRlciBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYW5vdGhlciBWZWN0b3IuICAgU3VjaCBhIGZ1bmN0aW9uIG1pZ2h0IGJlIHVzZWQgdG8gbWFuYWdlIGFycmF5cyBvciBsaXN0cyBvZiB2ZWN0b3JzIChpbiBDKS4gICBOb3cgY29udHJhc3QgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb25zdHJ1Y3RvciBmb3IgYSBWZWN0b3Igb2JqZWN0IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5WZWN0b3IgKm5ld19WZWN0b3IoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeikgewotCVZlY3RvciAqdjsKLQl2ID0gbmV3IFZlY3Rvcih4LHkseik7ICAgICAgICAvLyBDYWxsIEMrKyBjb25zdHJ1Y3RvcgotCXJldHVybiB2OwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Cb3RoIGZ1bmN0aW9ucyByZXR1cm4gYSBWZWN0b3IsIGJ1dCB0aGUgY29uc3RydWN0b3IgaXMgcmV0dXJuaW5nIGEgYnJhbmQtbmV3IFZlY3RvciB3aGlsZSB0aGUgb3RoZXIgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgVmVjdG9yIHRoYXQgd2FzIGFscmVhZHkgY3JlYXRlZCAoaG9wZWZ1bGx5KS4gICAgSW4gUGVybCwgYm90aCB2ZWN0b3JzIHdpbGwgYmUgaW5kaXN0aW5ndWlzaGFibGUtLS1jbGVhcmx5IGEgcHJvYmxlbSBjb25zaWRlcmluZyB0aGF0IHdlIHdvdWxkIHByb2JhYmx5IGxpa2UgdGhlIG5ld2x5IGNyZWF0ZWQgVmVjdG9yIHRvIGJlIGRlc3Ryb3llZCB3aGVuIHdlIGFyZSBkb25lIHdpdGggaXQuPHA+Ci08cD4KLVRvIG1hbmFnZSB0aGVzZSBwcm9ibGVtcywgZWFjaCBjbGFzcyBjb250YWlucyB0d28gbWV0aG9kcyB0aGF0IGFjY2VzcyBhbiBpbnRlcm5hbCBoYXNoIHRhYmxlIGNhbGxlZCA8dHQ+JU9XTkVSPC90dD4uICAgVGhpcyBoYXNoIGtlZXBzIGEgbGlzdCBvZiBhbGwgb2YgdGhlIG9iamVjdHMgdGhhdCBQZXJsIGtub3dzIHRoYXQgaXQgaGFzIGNyZWF0ZWQuICAgIFRoaXMgaGFwcGVucyBpbiB0d28gY2FzZXM6ICgxKSB3aGVuIHRoZSBjb25zdHJ1Y3RvciBoYXMgYmVlbiBjYWxsZWQsICBhbmQgKDIpIHdoZW4gYSBmdW5jdGlvbiBpbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcgb2JqZWN0IChhcyBpcyBkb25lIHdoZW4gU1dJRyBuZWVkcyB0byByZXR1cm4gYSBjb21wbGV4IGRhdGF0eXBlIGJ5IHZhbHVlKS4gICBXaGVuIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQsIHRoZSBQZXJsIHNoYWRvdyBjbGFzcyBtb2R1bGUgY2hlY2tzIHRoZSA8dHQ+JU9XTkVSPC90dD4gaGFzaCB0byBzZWUgaWYgUGVybCBjcmVhdGVkIHRoZSBvYmplY3QuICAgSWYgc28sIHRoZSBDL0MrKyBkZXN0cnVjdG9yIGlzIGludm9rZWQuICBJZiBub3QsIHdlIHNpbXBseSBkZXN0cm95IHRoZSBQZXJsIG9iamVjdCBhbmQgbGVhdmUgdGhlIHVuZGVybHlpbmcgQyBvYmplY3QgYWxvbmUgKHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgc29tZW9uZSBlbHNlIG11c3QgaGF2ZSBjcmVhdGVkIGl0KS48cD4KLTxwPgotVGhpcyBzY2hlbWUgd29ya3MgcmVtYXJrYWJseSB3ZWxsIGluIHByYWN0aWNlIGJ1dCBpdCBpc24ndCBmb29scHJvb2YuICBJbiBmYWN0LCBpdCB3aWxsIGZhaWwgaWYgeW91IGNyZWF0ZSBhIG5ldyBDIG9iamVjdCBpbiBQZXJsLCBwYXNzIGl0IG9uIHRvIGEgQyBmdW5jdGlvbiB0aGF0IHJlbWVtYmVycyB0aGUgb2JqZWN0LCBhbmQgdGhlbiBkZXN0cm95IHRoZSBjb3JyZXNwb25kaW5nIFBlcmwgb2JqZWN0ICh0aGlzIHNpdHVhdGlvbiB0dXJucyBvdXQgdG8gY29tZSB1cCBmcmVxdWVudGx5IHdoZW4gY29uc3RydWN0aW5nIG9iamVjdHMgbGlrZSBsaW5rZWQgbGlzdHMgYW5kIHRyZWVzKS4gICBXaGVuIEMgdGFrZXMgcG9zc2Vzc2lvbiBvZiBhbiBvYmplY3QsIHlvdSBjYW4gY2hhbmdlIFBlcmwncyBvd2Vyc2hpcCBieSBzaW1wbHkgZGVsZXRpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSA8dHQ+JU9XTkVSPC90dD4gaGFzaC4gIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgPHR0PkRJU09XTiA8L3R0Pm1ldGhvZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIFBlcmwgY29kZSB0byBjaGFuZ2Ugb3duZXJzaGlwIG9mIGFuIG9iamVjdAotJHYgPSBuZXcgVmVjdG9yKHgseSx6KTsKLSR2LSZndDtESVNPV04oKTsgICAgIAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UbyBhY3F1aXJlIG93bmVyc2hpcCBvZiBhbiBvYmplY3QsIHRoZSA8dHQ+QUNRVUlSRTwvdHQ+IG1ldGhvZCBjYW4gYmUgdXNlZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIEdpdmVuIFBlcmwgb3duZXJzaGlwIG9mIGEgZmlsZQotJHUgPSBWZWN0b3JfZ2V0KCR2KTsKLSR1LSZndDtBQ1FVSVJFKCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFzIGFsd2F5cywgYSBsaXR0bGUgY2FyZSBpcyBpbiBvcmRlci4gICAgU1dJRyBkb2VzIG5vdCBwcm92aWRlIHJlZmVyZW5jZSBjb3VudGluZywgZ2FyYmFnZSBjb2xsZWN0aW9uLCBvciBhZHZhbmNlZCBmZWF0dXJlcyBvbmUgbWlnaHQgZmluZCBpbiBzb3BoaXN0aWNhdGVkIGxhbmd1YWdlcy48cD4KLTxhIG5hbWU9Im41MiI+PC9hPjxoMz4gTmVzdGVkIE9iamVjdHM8L2gzPgotU3VwcG9zZSB0aGF0IHdlIGhhdmUgYSBuZXcgb2JqZWN0IHRoYXQgbG9va3MgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zdHJ1Y3QgUGFydGljbGUgewotCVZlY3RvciByOwotCVZlY3RvciB2OwotCVZlY3RvciBmOwotCWludAl0eXBlOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSBtZW1iZXJzIG9mIHRoZSBzdHJ1Y3R1cmUgYXJlIGNvbXBsZXggb2JqZWN0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGVuY2Fwc3VsYXRlZCBpbiBhIFBlcmwgc2hhZG93IGNsYXNzLiAgICBUbyBoYW5kbGUgdGhlc2UgY29ycmVjdGx5LCB3ZSB1c2UgdGhlIDx0dD4lQkxFU1NFRE1FTUJFUlM8L3R0PiBoYXNoIHdoaWNoIHdvdWxkIGxvb2sgbGlrZSB0aGlzIChhbG9uZyB3aXRoIHNvbWUgc3VwcG9ydGluZyBjb2RlKSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cGFja2FnZSBQYXJ0aWNsZTsKLS4uLgotJUJMRVNTRURNRU1CRVJTID0gKAotCXIgPSZndDsgYFZlY3RvcicsCi0JdiA9Jmd0OyBgVmVjdG9yJywKLQlmID0mZ3Q7IGBWZWN0b3InLAotKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBmZXRjaGluZyBtZW1iZXJzIGZyb20gdGhlIHN0cnVjdHVyZSwgIDx0dD4lQkxFU1NFRE1FTUJFUlM8L3R0PiBpcyBjaGVja2VkLiAgIElmIHRoZSByZXF1ZXN0ZWQgZmllbGQgaXMgcHJlc2VudCwgd2UgY3JlYXRlIGEgdGllZC1oYXNoIHRhYmxlIGFuZCByZXR1cm4gaXQuICAgSWYgbm90LCB3ZSBqdXN0IHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBtZW1iZXIgdW5tb2RpZmllZC48cD4KLTxwPgotVGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgdXMgdG8gb3BlcmF0ZSBvbiBuZXN0ZWQgc3RydWN0dXJlcyBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIFBlcmwgYWNjZXNzIG9mIG5lc3RlZCBzdHJ1Y3R1cmUKLSRwID0gbmV3IFBhcnRpY2xlKCk7Ci0kcC0mZ3Q7e2Z9LSZndDt7eH0gPSAwLjA7Ci0lJHskcC0mZ3Q7e3Z9fSA9ICggeD0mZ3Q7MCwgeT0mZ3Q7MCwgej0mZ3Q7MCk7ICAgICAgICAgCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTxhIG5hbWU9Im41MyI+PC9hPjxoMz4gU2hhZG93IEZ1bmN0aW9uczwvaDM+Ci1XaGVuIGZ1bmN0aW9ucyB0YWtlIGFyZ3VtZW50cyBpbnZvbHZpbmcgYSBjb21wbGV4IG9iamVjdCwgaXQgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIHNoYWRvdyBmdW5jdGlvbi4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5kb3VibGUgZG90X3Byb2R1Y3QoVmVjdG9yICp2MSwgVmVjdG9yICp2Mik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNpbmNlIFZlY3RvciBpcyBhbiBvYmplY3QgYWxyZWFkeSB3cmFwcGVkIGludG8gYSBzaGFkb3cgY2xhc3MsIHdlIG5lZWQgdG8gbW9kaWZ5IHRoaXMgZnVuY3Rpb24gdG8gYWNjZXB0IGFyZ3VtZW50cyB0aGF0IGFyZSBnaXZlbiBpbiB0aGUgZm9ybSBvZiB0aWVkIGhhc2ggdGFibGVzLiAgIFRoaXMgaXMgZG9uZSBieSBjcmVhdGluZyBhIFBlcmwgZnVuY3Rpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zdWIgZG90X3Byb2R1Y3QgewotICAgIG15IEBhcmdzID0gQF87Ci0gICAgJGFyZ3NbMF0gPSB0aWVkKCV7JGFyZ3NbMF19KTsgICAgICAgICAjIEdldCB0aGUgcmVhbCBwb2ludGVyIHZhbHVlcwotICAgICRhcmdzWzFdID0gdGllZCgleyRhcmdzWzFdfSk7Ci0gICAgbXkgJHJlc3VsdCA9IHZlY3RvcmM6OmRvdF9wcm9kdWN0KEBhcmdzKTsKLSAgICByZXR1cm4gJHJlc3VsdDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBmdW5jdGlvbiByZXBsYWNlcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGJ1dCBvcGVyYXRlcyBpbiBhbiBpZGVudGljYWwgbWFubmVyLjxwPgotPGEgbmFtZT0ibjU0Ij48L2E+PGgzPiAgSW5oZXJpdGFuY2U8L2gzPgotU2ltcGxlIEMrKyBpbmhlcml0YW5jZSBpcyBoYW5kbGVkIHVzaW5nIHRoZSBQZXJsIDx0dD5ASVNBPC90dD4gYXJyYXkgaW4gZWFjaCBjbGFzcyBwYWNrYWdlLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gc2hhcGVzLmkKLS8vIFNXSUcgaW50ZXJmYWNlIGZpbGUgZm9yIHNoYXBlcyBjbGFzcwotJW1vZHVsZSBzaGFwZXMKLSV7Ci0jaW5jbHVkZSAic2hhcGVzLmgiCi0lfQotCi1jbGFzcyBTaGFwZSB7Ci1wdWJsaWM6Ci0JdmlydHVhbCBkb3VibGUgYXJlYSgpID0gMDsKLQl2aXJ0dWFsIGRvdWJsZSBwZXJpbWV0ZXIoKSA9IDA7Ci0Jdm9pZCAgICBzZXRfbG9jYXRpb24oZG91YmxlIHgsIGRvdWJsZSB5KTsKLX07Ci1jbGFzcyBDaXJjbGUgOiBwdWJsaWMgU2hhcGUgewotcHVibGljOgotCUNpcmNsZShkb3VibGUgcmFkaXVzKTsKLQl+Q2lyY2xlKCk7Ci0JZG91YmxlIGFyZWEoKTsKLQlkb3VibGUgcGVyaW1ldGVyKCk7Ci19OwotY2xhc3MgU3F1YXJlIDogcHVibGljIFNoYXBlIHsKLXB1YmxpYzoKLQlTcXVhcmUoZG91YmxlIHNpemUpOwotCX5TcXVhcmUoKTsKLQlkb3VibGUgYXJlYSgpOwotCWRvdWJsZSBwZXJpbWV0ZXIoKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHJlc3VsdGluZywgUGVybCB3cmFwcGVyIGNsYXNzIHdpbGwgY3JlYXRlIHRoZSBmb2xsb3dpbmcgY29kZSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPlBhY2thZ2UgU2hhcGU7Ci1ASVNBID0gKHNoYXBlcyk7Ci0uLi4KLVBhY2thZ2UgQ2lyY2xlOwotQElTQSA9IChzaGFwZXMgU2hhcGUpOwotLi4uCi1QYWNrYWdlIFNxdWFyZTsKLUBJU0EgPSAoc2hhcGVzIFNoYXBlKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5ASVNBPC90dD4gYXJyYXkgZGV0ZXJtaW5lcyB3aGVyZSB0byBsb29rIGZvciBtZXRob2RzIG9mIGEgcGFydGljdWxhciBjbGFzcy4gIEluIHRoaXMgY2FzZSwgYm90aCB0aGUgPHR0PkNpcmNsZTwvdHQ+IGFuZCA8dHQ+U3F1YXJlPC90dD4gY2xhc3NlcyBpbmhlcml0IGZ1bmN0aW9ucyBmcm9tIDx0dD5TaGFwZTwvdHQ+IHNvIHdlJ2xsIHdhbnQgdG8gbG9vayBpbiB0aGUgPHR0PlNoYXBlPC90dD4gYmFzZSBjbGFzcyBmb3IgdGhlbS4gICAgQWxsIGNsYXNzZXMgYWxzbyBpbmhlcml0IGZyb20gdGhlIHRvcC1sZXZlbCBtb2R1bGUgPHR0PnNoYXBlczwvdHQ+LiAgIFRoaXMgaXMgYmVjYXVzZSBjZXJ0YWluIGNvbW1vbiBvcGVyYXRpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQgc2hhZG93IGNsYXNzZXMgYXJlIGltcGxlbWVudGVkIG9ubHkgb25jZSBhbmQgcmV1c2VkIGluIHRoZSB3cmFwcGVyIGNvZGUgZm9yIHZhcmlvdXMgY2xhc3NlcyBhbmQgc3RydWN0dXJlcy48cD4KLTxwPgotU2luY2UgU1dJRyBzaGFkb3cgY2xhc3NlcyBhcmUgaW1wbGVtZW50ZWQgaW4gUGVybCwgaXQgaXMgZWFzeSB0byBzdWJjbGFzcyBmcm9tIGFueSBTV0lHIGdlbmVyYXRlZCBjbGFzcy4gIFRvIGRvIHRoaXMsIHNpbXBseSBwdXQgdGhlIG5hbWUgb2YgYSBTV0lHIGNsYXNzIGluIHRoZSA8dHQ+QElTQTwvdHQ+IGFycmF5IGZvciB5b3VyIG5ldyBjbGFzcy4gSG93ZXZlciwgYmUgZm9yZXdhcm5lZCB0aGF0IHRoaXMgaXMgbm90IGEgdHJpdmlhbCBwcm9ibGVtLiAgSW4gcGFydGljdWxhciwgaW5oZXJpdGFuY2Ugb2YgZGF0YSBtZW1iZXJzIGlzIGV4dHJlbWVseSB0cmlja3kgKGFuZCBJJ20gbm90IGV2ZW4gc3VyZSBpZiBpdCByZWFsbHkgd29ya3MpLiA8cD4KLTxhIG5hbWU9Im41NSI+PC9hPjxoMz4gSXRlcmF0b3JzPC9oMz4KLVdpdGggZWFjaCBjbGFzcyBvciBzdHJ1Y3R1cmUsIFNXSUcgYWxzbyBnZW5lcmF0ZXMgYSBwYWlyIG9mIGZ1bmN0aW9ucyB0byBzdXBwb3J0IFBlcmwgaXRlcmF0b3JzLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIDx0dD5rZXlzPC90dD4gYW5kIDx0dD5lYWNoPC90dD4gZnVuY3Rpb25zIG9uIGEgQy9DKysgb2JqZWN0LiAgSXRlcmF0b3JzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBjb2RlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3ViIEZJUlNUS0VZIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIEBJVEVSQVRPUlN7JHNlbGZ9ID0gW2B4JywneScsJ3onLCBdOwotICAgIG15ICRmaXJzdCA9IHNoaWZ0IEB7JElURVJBVE9SU3skc2VsZn19OwotICAgIHJldHVybiAkZmlyc3Q7Ci19Ci0KLXN1YiBORVhUS0VZIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgICRuZWxlbSA9IHNjYWxhciBAeyRJVEVSQVRPUlN7JHNlbGZ9fTsKLSAgICBpZiAoJG5lbGVtICZndDsgMCkgewotICAgICAgICBteSAkbWVtYmVyID0gc2hpZnQgQHskSVRFUkFUT1JTeyRzZWxmfX07Ci0gICAgICAgIHJldHVybiAkbWVtYmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEBJVEVSQVRPUlN7JHNlbGZ9ID0gW2B4JywneScsJ3onLCBdOwotICAgICAgICByZXR1cm4gKCk7Ci0gICAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD4lSVRFUkFUT1JTPC90dD4gaGFzaCB0YWJsZSBtYWludGFpbnMgdGhlIHN0YXRlIG9mIGVhY2ggb2JqZWN0IGZvciB3aGljaCB0aGUgPHR0PmtleXM8L3R0PiBvciA8dHQ+ZWFjaDwvdHQ+IGZ1bmN0aW9uIGhhcyBiZWVuIGFwcGxpZWQgdG8uICAgIFRoZSBzdGF0ZSBpcyBtYWludGFpbmVkIGJ5IGtlZXBpbmcgYSBsaXN0IG9mIHRoZSBtZW1iZXIgbmFtZXMuPHA+Ci08cD4KLVdoaWxlIGl0ZXJhdG9ycyBtYXkgYmUgb2YgbGltaXRlZCB1c2Ugd2hlbiB3b3JraW5nIHdpdGggQy9DKysgY29kZSwgaXQgdHVybnMgb3V0IHRoZXkgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBhbiBlbGVtZW50IGJ5IGVsZW1lbnQgY29weSBvZiBhbiBvYmplY3QuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JHYgPSBuZXcgVmVjdG9yKDEsMiwzKTsKLSR3ID0gbmV3IFZlY3RvcigwLDAsMCk7Ci0lJHcgPSAlJHY7ICAgICAgICAgICAgICAgICMgQ29weSBjb250ZW50cyBvZiB2IGludG8gdwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ib3dldmVyLCB0aGlzIGlzIG5vdCBhIGRlZXAgY29weSBzbyB0aGV5IHByb2JhYmx5IHdvcmtzIGJldHRlciB3aXRoIEMgdGhhbiB3aXRoIEMrKy48cD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMj4gV2hlcmUgdG8gZ28gZnJvbSBoZXJlPzwvaDI+Ci1UaGUgU1dJRyBQZXJsNSBtb2R1bGUgaXMgY29uc3RhbnRseSBpbXByb3ZpbmcgdG8gcHJvdmlkZSBiZXR0ZXIgaW50ZWdyYXRpb24gd2l0aCBQZXJsIGFuZCB0byBiZSBlYXNpZXIgdG8gdXNlLiAgIFRoZSBpbnRyb2R1Y3Rpb24gb2Ygc2hhZG93IGNsYXNzZXMgYW5kIHR5cGVtYXBzIGluIHRoaXMgcmVsZWFzZSBhcmUgb25lIG1vcmUgc3RlcCBpbiB0aGF0IGRpcmVjdGlvbi4gICAgVGhlIFNXSUcgPHR0PkV4YW1wbGVzPC90dD4gZGlyZWN0b3J5IGNvbnRhaW5zIG1vcmUgc2ltcGxlIGV4YW1wbGVzIG9mIGJ1aWxkaW5nIFBlcmw1IG1vZHVsZXMuIEFzIGFsd2F5cywgc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmluZyB0aGUgUGVybDUgaW1wbGVtZW50YXRpb24gYXJlIHdlbGNvbWUuPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ3OjAxIDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML1ByZWZhY2UuaHRtbCBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvUHJlZmFjZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzIwN2Y5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvUHJlZmFjZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCEtLSBQdWJsaXNoZWQgYnkgUXVhZHJhbGF5IFdlYldvcmtzIEhUTUwgTGl0ZSAxLjUuMSAtLT4KLTwhLS0gQW5kIG11bmdlZCBieSBEYXZlJ3Mgc3BlY2lhbCBQeXRob24gc2NyaXB0IC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5QcmVmYWNlPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT4gUHJlZmFjZTwvaDE+PHA+PHVsPgotPGxpPiA8YSBocmVmPSIjbjEiPkludHJvZHVjdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5TV0lHIHJlc291cmNlczwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5BYm91dCB0aGlzIG1hbnVhbDwvYT4KLTxsaT4gPGEgaHJlZj0iI240Ij5DcmVkaXRzPC9hPgotPGxpPiA8YSBocmVmPSIjbjUiPldoYXQncyBuZXc/PC9hPgotPGxpPiA8YSBocmVmPSIjbjYiPkJ1ZyByZXBvcnRzPC9hPgotPGxpPiA8YSBocmVmPSIjbjciPlNXSUcgaXMgZnJlZTwvYT4KLTwvdWw+Ci0KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBJbnRyb2R1Y3Rpb248L2gyPgotU1dJRyBpcyBhIHRvb2wgZm9yIHNvbHZpbmcgcHJvYmxlbXMuPHA+Ci08cD4KLU1vcmUgc3BlY2lmaWNhbGx5LCBTV0lHIGlzIGEgc2ltcGxlIHRvb2wgZm9yIGJ1aWxkaW5nIGludGVyYWN0aXZlIEMsIEMrKywgb3IgT2JqZWN0aXZlLUMgcHJvZ3JhbXMgd2l0aCBjb21tb24gc2NyaXB0aW5nIGxhbmd1YWdlcyBzdWNoIGFzIFRjbCwgUGVybCwgYW5kIFB5dGhvbi4gT2YgY291cnNlLCBtb3JlIGltcG9ydGFudGx5LCBTV0lHIGlzIGEgdG9vbCBmb3IgbWFraW5nIEMgcHJvZ3JhbW1pbmcgbW9yZSBlbmpveWFibGUgYW5kIHByb21vdGluZyBsYXppbmVzcyAoYW4gZXNzZW50aWFsIGZlYXR1cmUpLiBTV0lHIGlzIG5vdCBwYXJ0IG9mIGFuIG92ZXJncm93biBzb2Z0d2FyZSBlbmdpbmVlcmluZyBwcm9qZWN0LCBhbiBhdHRlbXB0IHRvIGJ1aWxkIHNvbWUgc29ydCBvZiBtb25vbGl0aGljIHByb2dyYW1taW5nIGVudmlyb25tZW50LCBvciBhbiBhdHRlbXB0IHRvIGZvcmNlIGV2ZXJ5b25lIHRvIHJld3JpdGUgYWxsIG9mIHRoZWlyIGNvZGUgKGllLiBjb2RlIHJldXNlKS4gSW4gZmFjdCwgbm9uZSBvZiB0aGVzZSB0aGluZ3MgaGF2ZSBldmVyIGJlZW4gYSBwcmlvcml0eS48cD4KLTxwPgotU1dJRyB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgaW4gdGhlIFRoZW9yZXRpY2FsIFBoeXNpY3MgRGl2aXNpb24gYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IGZvciBidWlsZGluZyBpbnRlcmZhY2VzIHRvIGxhcmdlIG1hdGVyaWFscyBzY2llbmNlIHJlc2VhcmNoIHNpbXVsYXRpb25zIGJlaW5nIHJ1biBvbiB0aGUgQ29ubmVjdGlvbiBNYWNoaW5lIDUgc3VwZXJjb21wdXRlci4gSW4gdGhpcyBlbnZpcm9ubWVudCwgd2Ugd2VyZSBmYWNlZCB3aXRoIHRoZSBwcm9ibGVtcyBvZiB3b3JraW5nIHdpdGggaHVnZSBhbW91bnRzIG9mIGRhdGEsIGNvbXBsaWNhdGVkIG1hY2hpbmVzLCBhbmQgY29uc3RhbnRseSBjaGFuZ2luZyBjb2RlLiBBcyBzY2llbnRpc3RzLCB3ZSBuZWVkZWQgYSBtZWNoYW5pc20gZm9yIGJ1aWxkaW5nIGludGVyYWN0aXZlIHByb2dyYW1zIHRoYXQgd2FzIGV4dHJlbWVseSBlYXN5IHRvIHVzZSwgY291bGQga2VlcCBwYWNlIHdpdGggY29kZSB0aGF0IHdhcyBjb25zdGFudGx5IGNoYW5naW5nLCBhbmQgZGlkbid0IGdldCBpbiB0aGUgd2F5IG9mIHRoZSByZWFsIHByb2JsZW1zIHRoYXQgd2VyZSBiZWluZyBzb2x2ZWQuIE1haW5seSwgd2UganVzdCB3YW50ZWQgdG8gImN1dCB0aGUgY3JhcCIgYW5kIHdvcmsgb24gdGhlIHJlYWwgcHJvYmxlbXMgYXQgaGFuZC48cD4KLTxwPgotV2hpbGUgU1dJRyB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgZm9yIHNjaWVudGlmaWMgYXBwbGljYXRpb25zLCBpdCBoYXMgYmVjb21lIGEgZ2VuZXJhbCBwdXJwb3NlIHRvb2wgdGhhdCBpcyBiZWluZyB1c2VkIGluIGFuIGluY3JlYXNpbmcgdmFyaWV0eSBvZiBvdGhlciBjb21wdXRpbmcgYXBwbGljYXRpb25zLS1pbiBmYWN0IGFsbW9zdCBhbnl0aGluZyB3aGVyZSBDIHByb2dyYW1taW5nIGlzIGludm9sdmVkLiBTb21lIG9mIHRoZSBhcHBsaWNhdGlvbiBhcmVhcyB0aGF0IEkgYW0gYXdhcmUgb2YgaW5jbHVkZSBzY2llbnRpZmljIGFwcGxpY2F0aW9ucywgdmlzdWFsaXphdGlvbiwgZGF0YWJhc2VzLCBzZW1pY29uZHVjdG9yIENBRCwgcmVtb3RlIHNlbnNpbmcgYW5kIGRpc3RyaWJ1dGVkIG9iamVjdHMuIERldmVsb3BtZW50IGhhcyBiZWVuIHByYWdtYXRpYyBpbiBuYXR1cmUtLWZlYXR1cmVzIGhhdmUgYmVlbiBhZGRlZCB0byBhZGRyZXNzIGludGVyZXN0aW5nIHByb2JsZW1zIGFzIHRoZXkgYXJpc2UuIE1vc3Qgb2YgdGhlIHJlYWxseSBjb29sIHN0dWZmIGhhcyBiZWVuIGNvbnRyaWJ1dGVkIG9yIHN1Z2dlc3RlZCBieSBTV0lHJ3MgdXNlcnMuIFRoZXJlIGhhcyBuZXZlciByZWFsbHkgYmVlbiBhICJncmFuZCIgZGVzaWduIHRvIFNXSUcgb3RoZXIgdGhhbiB0aGUgZ29hbCBvZiBjcmVhdGluZyBhIHByYWN0aWNhbCBwcm9ncmFtbWluZyB0b29sIHRoYXQgY291bGQgYmUgdXNlZCBpbiBvdGhlciBhcHBsaWNhdGlvbnMuPHA+Ci08YSBuYW1lPSJuMiI+PC9hPjxoMj4gU1dJRyByZXNvdXJjZXM8L2gyPgotVGhlIG9mZmljaWFsIGxvY2F0aW9uIG9mIFNXSUcgcmVsYXRlZCBtYXRlcmlhbCBpczxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWh0dHA6Ly93d3cuY3MudXRhaC5lZHUvfmJlYXpsZXkvU1dJRwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIHNpdGUgY29udGFpbnMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZSwgdXNlcnMgZ3VpZGUsIGFuZCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYnVncywgaW5zdGFsbGF0aW9uIHByb2JsZW1zLCBhbmQgaW1wbGVtZW50YXRpb24gdHJpY2tzLiBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGZpbGVzIGFyZSBhbHNvIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIGZ0cCBhdCA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5mdHA6Ly9mdHAuY3MudXRhaC5lZHUvcHViL2JlYXpsZXkvU1dJRwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Zb3UgY2FuIGFsc28gc3Vic2NyaWJlIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBieSBzZW5kaW5nIGEgbWVzc2FnZSB3aXRoIHRoZSB0ZXh0ICJzdWJzY3JpYmUgc3dpZyIgdG8gPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+bWFqb3Jkb21vQGNzLnV0YWguZWR1Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBtYWlsaW5nIGxpc3Qgb2Z0ZW4gZGlzY3Vzc2VzIHNvbWUgb2YgdGhlIG1vcmUgdGVjaG5pY2FsIGFzcGVjdHMgb2YgU1dJRyBhbG9uZyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGJldGEgcmVsZWFzZXMgYW5kIGZ1dHVyZSB3b3JrLjxwPgotPGEgbmFtZT0ibjMiPjwvYT48aDI+IEFib3V0IHRoaXMgbWFudWFsPC9oMj4KLVRoaXMgbWFudWFsIGhhcyBiZWVuIHdyaXR0ZW4gaW4gcGFyYWxsZWwgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgb2YgU1dJRyBiZWNhdXNlIEkgaGF0ZSBibGFjayBib3hlcyBhbmQgSSBkb24ndCBsaWtlIHVzaW5nIHNvZnR3YXJlIHRoYXQgaXMgcG9vcmx5IGRvY3VtZW50ZWQuIFRoaXMgbWFudWFsIGF0dGVtcHRzIHRvIGRlc2NyaWJlIGFsbCBhc3BlY3RzIG9mIFNXSUcgYW5kIGhvdyBpdCBjYW4gYmUgdXNlZCB0byBzb2x2ZSBpbnRlcmVzdGluZyBwcm9ibGVtcy4gRG9uJ3QgbGV0IHRoZSBzaXplIHNjYXJlIHlvdSwgU1dJRyBjYW4gYmUgcXVpdGUgZWFzeSB0byB1c2UuIEhvd2V2ZXIsIGNvdmVyaW5nIGF1dG9tYXRpYyBjb2RlIGdlbmVyYXRpb24gZm9yIGZvdXIgZGlmZmVyZW50IHNjcmlwdGluZyBsYW5ndWFnZXMgdGFrZXMgYWJpdCBvZiBleHBsYW5hdGlvbi4gU1dJRyBjYW4gZG8gcXVpdGUgYSBmZXcgaW50ZXJlc3RpbmcgdGhpbmdzIHRoYXQgbWlnaHQgbm90IGJlIHNvIG9idmlvdXMgc28gSSBob3BlIHRoYXQgdGhlIG1hbnVhbCBjYW4gc2hlZCBzb21lIGxpZ2h0IG9uIG1hbnkgb2YgdGhlc2UgaXNzdWVzLiBUaGUgbWFudWFsIGFsc28gc2VydmVzIGFzIGEgZ2VuZXJhbCByZWZlcmVuY2UgZGVzY3JpYmluZyBtYW55IG9mIFNXSUcncyBpbXBsZW1lbnRhdGlvbiBpc3N1ZXMgKEkgdXNlIHRoZSBtYW51YWwgcXVpdGUgcmVndWxhcmx5IG15c2VsZikuPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMz4gUHJlcmVxdWlzaXRlczwvaDM+Ci1UaGlzIG1hbnVhbCBhc3N1bWVzIHRoYXQgeW91IGFyZSBpbnRlcmVzdGVkIGluIHdyaXRpbmcgaW50ZXJhY3RpdmUgQyBwcm9ncmFtcyBhbmQgdGhhdCB5b3UgaGF2ZSBhdCBsZWFzdCBoZWFyZCBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1Y2ggYXMgVGNsLCBQeXRob24sIGFuZCBQZXJsLiBBIGRldGFpbGVkIGtub3dsZWRnZSBvZiB0aGVzZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGlzIG5vdCByZXF1aXJlZCBhbHRob3VnaCBzb21lIGZhbWlsaWFyaXR5IGNlcnRhaW5seSB3b24ndCBodXJ0LiBObyBwcmlvciBleHBlcmllbmNlIHdpdGggYnVpbGRpbmcgQyBleHRlbnNpb25zIHRvIHRoZXNlIGxhbmd1YWdlcyBpcyByZXF1aXJlZC0tLWFmdGVyIGFsbCwgdGhpcyBpcyB3aGF0IFNXSUcgYWxsb3dzIHlvdSB0byBkbyBhdXRvbWF0aWNhbGx5LiBIb3dldmVyLCBJIGRvIGFzc3VtZSB0aGF0IHlvdSBhcmUgcmVhc29uYWJseSBmYW1pbGlhciB3aXRoIHRoZSB1c2Ugb2YgY29tcGlsZXJzLCBsaW5rZXJzLCBhbmQgbWFrZWZpbGVzIHNpbmNlIG1ha2luZyBzY3JpcHRpbmcgbGFuZ3VhZ2UgZXh0ZW5zaW9ucyBpcyBzb21ld2hhdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gd3JpdGluZyBhIG5vcm1hbCBDIHByb2dyYW0gKGFsdGhvdWdoIG5vdCBzaWduaWZpY2FudGx5IG1vcmUgY29tcGxleCkuPHA+Ci08YSBuYW1lPSJuOSI+PC9hPjxoMz4gT3JnYW5pemF0aW9uIG9mIHRoaXMgbWFudWFsPC9oMz4KLVRoZSBmaXJzdCBmZXcgY2hhcHRlcnMgb2YgdGhpcyBtYW51YWwgZGVzY3JpYmUgU1dJRyBpbiBnZW5lcmFsIGFuZCBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIGl0cyBjYXBhYmlsaXRpZXMuIFRoZSByZW1haW5pbmcgY2hhcHRlcnMgYXJlIGRldm90ZWQgdG8gc3BlY2lmaWMgU1dJRyBsYW5ndWFnZSBtb2R1bGVzIGFuZCBhcmUgc2VsZiBjb250YWluZWQuIFRodXMsIGlmIHlvdSBhcmUgdXNpbmcgU1dJRyB0byBidWlsZCBQeXRob24gaW50ZXJmYWNlcywgeW91IGNhbiBza2lwIHJpZ2h0IHRvIHRoYXQgY2hhcHRlciBhbmQgZmluZCBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdy4gU28sIGluIGEgc2Vuc2UsIHlvdSBhcmUgcmVhbGx5IGdldHRpbmcgMyBvciA0IG1hbnVhbHMgaW4gb25lLjxwPgotPGEgbmFtZT0ibjEwIj48L2E+PGgzPiBIb3cgdG8gYXZvaWQgcmVhZGluZyB0aGUgbWFudWFsPC9oMz4KLUlmIHlvdSBoYXRlIHJlYWRpbmcgbWFudWFscywgZ2xhbmNlIGF0IHRoZSAiSW50cm9kdWN0aW9uIiB3aGljaCBjb250YWlucyBhIGZldyBzaW1wbGUgZXhhbXBsZXMgYW5kIHRoZSBvdmVyYWxsIHBoaWxvc29waHkuIFRoZXNlIGV4YW1wbGVzIGNvbnRhaW4gYWJvdXQgOTUlIG9mIGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdyB0byB1c2UgU1dJRy4gQWZ0ZXIgdGhhdCwgc2ltcGx5IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgY2hhcHRlcnMgZm9yIHJlZmVyZW5jZS4gVGhlIFNXSUcgZGlzdHJpYnV0aW9uIGFsc28gY29tZXMgd2l0aCBhIGxhcmdlIGRpcmVjdG9yeSBvZiBleGFtcGxlcyB0aGF0IGlsbHVzdHJhdGUgaG93IHRvIGRvIG1vc3Qga2luZHMgb2YgdGhpbmdzLiA8cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBDcmVkaXRzPC9oMj4KLVRoaXMgd29yayB3b3VsZCBjZXJ0YWlubHkgbm90IGJlIHBvc3NpYmxlIHdpdGhvdXQgdGhlIHN1cHBvcnQgb2YgbWFueSBwZW9wbGUuIEkgd291bGQgbGlrZSB0byBhY2tub3dsZWRnZSBQZXRlciBMb21kYWhsLCBCcmFkIEhvbGlhbiwgU2h1amlhIFpob3UsIE5pZWxzIEplbnNlbiwgYW5kIFRpbSBHZXJtYW5uIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSBmb3IgYWxsb3dpbmcgbWUgdG8gcHVyc3VlIHRoaXMgcHJvamVjdCBhbmQgZm9yIGJlaW5nIHRoZSBmaXJzdCB1c2Vycy4gUGF0cmljayBUdWxsbWFubiBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIHN1Z2dlc3RlZCB0aGUgaWRlYSBvZiBhdXRvbWF0aWMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLiBKb2huIFNjaG1pZHQgYW5kIEt1cnRpcyBCbGVla2VyIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggdGVzdGVkIG91dCB0aGUgZWFybHkgdmVyc2lvbnMuIEknZCBhbHNvIGxpa2UgdG8gYWNrbm93bGVkZ2UgQ2hyaXMgSm9obnNvbiBhbmQgdGhlIFNjaWVudGlmaWMgQ29tcHV0aW5nIGFuZCBJbWFnaW5nIEdyb3VwIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggZm9yIHRoZWlyIGNvbnRpbnVlZCBzdXBwb3J0LiBKb2huIEJ1Y2ttYW4sIExhcnJ5IFZpcmRlbiwgYW5kIFRvbSBTY2h3YWxsZXIgcHJvdmlkZWQgdmFsdWFibGUgaW5wdXQgb24gdGhlIGZpcnN0IHJlbGVhc2VzIGFuZCBpbXByb3ZpbmcgdGhlIHBvcnRhYmlsaXR5IG9mIFNXSUcuIERhdmlkIEZsZXRjaGVyIGFuZCBHYXJ5IEhvbHQgaGF2ZSBwcm92aWRlZCBhIGdyZWF0IGRlYWwgb2YgaW5wdXQgb24gaW1wcm92aW5nIFNXSUcncyBQZXJsNSBpbXBsZW1lbnRhdGlvbi4gSSdkIGFsc28gbGlrZSB0byB0aGFuayBLZXZpbiBCdXRsZXIgZm9yIGhpcyB2YWx1YWJsZSBpbnB1dCBhbmQgY29udHJpYnV0aW9uIG9mIGEgV2luZG93cyBOVCBwb3J0LiBGaW5hbGx5LCBJJ2QgbGlrZSB0byBhY2tub3dsZWRnZSBhbGwgb2YgdGhlIHVzZXJzIHdobyBoYXZlIGJyYXZlZCB0aGUgZmlyc3QgZmV3IHJlbGVhc2VzIGFuZCBoYXZlIGJlZW4gaW5zdHJ1bWVudGFsIGluIHN1Z2dlc3Rpbmcgd2F5IHRvIG1ha2UgU1dJRyBtb3JlIGZ1biB0byB1c2UgdGhhbiBJIGV2ZXIgaW1hZ2luZWQgcG9zc2libGUuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gV2hhdCdzIG5ldz88L2gyPgotVGhlIGZvbGxvd2luZyBzaWduaWZpY2FudCBmZWF0dXJlcyBhcmUgbmV3IGluIHZlcnNpb24gMS4xPHA+Ci08cD4KLTx1bD4KLTxsaT5TdXBwb3J0IGZvciB0eXBlbWFwcyAoYSBtZWNoYW5pc20gZm9yIGN1c3RvbWl6aW5nIFNXSUcpLgotPGxpPk11bHRpcGxlIGluaGVyaXRhbmNlLgotPGxpPkRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzLgotPGxpPlBlcmw1IHNoYWRvdyBjbGFzc2VzLgotPGxpPlRjbDguMCBtb2R1bGUgKHVzZXMgdGhlIG5hdGl2ZSBUY2w4IG9iamVjdCBpbnRlcmZhY2UpLgotPGxpPkFuIGVudGlyZWx5IG5ldyBkb2N1bWVudGF0aW9uIHN5c3RlbS4KLTxsaT5MaW1pdGVkIHN1cHBvcnQgZm9yIG5lc3RlZCBzdHJ1Y3R1cmVzLgotPGxpPk5ldyBvYmplY3Qgb3JpZW50ZWQgVGNsIGludGVyZmFjZS4KLTxsaT5Vc2VyIGRlZmluZWQgZXhjZXB0aW9uIGhhbmRsaW5nLgotPGxpPk5ldyBkaXJlY3RpdmVzIGZvciBiZXR0ZXIgbGlicmFyeSBzdXBwb3J0ICglaW5saW5lLCAlZXh0ZXJuICVpbXBvcnQpCi08bGk+T2JqZWN0aXZlLUMgc3VwcG9ydC4KLTxsaT5TdXBwb3J0IGZvciBXaW5kb3dzLU5UIGFuZCBNYWNpbnRvc2guCi08bGk+TG90cyBvZiBtaW5vciBidWcgZml4ZXMgdG8gYWxtb3N0IGV2ZXJ5dGhpbmcuCi08L3VsPgotPHA+Ci1UaGlzIHJlbGVhc2Ugc2hvdWxkIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggaW50ZXJmYWNlIGZpbGVzIGdlbmVyYXRlZCBmb3IgU1dJRyAxLjAuIEhvd2V2ZXIsIG1hbnkgdGhpbmdzIGhhdmUgY2hhbmdlZCBpbiB0aGUgU1dJRyBDKysgQVBJIHNvIHNwZWNpYWwgcHVycG9zZSBTV0lHIEMrKyBleHRlbnNpb25zIHdyaXR0ZW4gZm9yIDEuMCB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQuPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMj4gQnVnIHJlcG9ydHM8L2gyPgotV2hpbGUgZXZlcnkgYXR0ZW1wdCBoYXMgYmVlbiBtYWRlIHRvIG1ha2UgU1dJRyBidWctZnJlZSwgb2NjYXNpb25hbGx5IGJ1Z3Mgd2lsbCBhcnJpc2UuIFRvIHJlcG9ydCBhIGJ1Zywgc2VuZCBtYWlsIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBhdCA8dHQ+c3dpZ0Bjcy51dGFoLmVkdTwvdHQ+LiBJbiB5b3VyIG1lc3NhZ2UsIGJlIGFzIHNwZWNpZmljIGFzIHBvc3NpYmxlLCBpbmNsdWRpbmcgKGlmIGFwcGxpY2FibGUpLCBlcnJvciBtZXNzYWdlcywgdHJhY2ViYWNrcyAoaWYgYSBjb3JlIGR1bXAgb2NjdXJyZWQpLCBjb3JyZXNwb25kaW5nIHBvcnRpb25zIG9mIHRoZSBTV0lHIGludGVyZmFjZSBmaWxlIHVzZWQsIGFuZCBhbnkgaW1wb3J0YW50IHBpZWNlcyBvZiB0aGUgU1dJRyBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlLiBJIGF0dGVtcHQgdG8gcmVzcG9uZCB0byBhbGwgYnVnIHJlcG9ydHMsIGJ1dCBJIGNhbiBvbmx5IGZpeCBidWdzIGlmIEkga25vdyBhYm91dCB0aGVtLjxwPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IFNXSUcgaXMgZnJlZTwvaDI+Ci1TV0lHIGlzIGEgY29tcGxldGVseSBmcmVlIHBhY2thZ2UgdGhhdCB5b3UgY2FuIHVzZSBpbiBhbnkgbWFubmVyIHRoYXQgeW91IHdpc2gsIGluY2x1ZGluZyBtb2RpZmljYXRpb24sIHJlZGlzdHJpYnV0aW9uLCBhbmQgdXNlIGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuIFRoZSBvbmx5IHJlc3RyaWN0aW9uIG9uIGl0cyB1c2UgaXMgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIFNXSUcgY29tcGlsZXIgc2hvdWxkIHJlcHJvZHVjZSB0aGUgU1dJRyBjb3B5cmlnaHQgbm90aWNlIGluIHRoZSBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIFRoZSBjb2RlIGdlbmVyYXRlZCBieSBTV0lHIGNhbiBiZSByZWRpc3RyaWJ1dGVkIGluIGFueSBtYW5uZXIuIE9uIGEgbW9yZSBwZXJzb25hbCBub3RlLCBpZiB5b3UndmUgdXNlZCBTV0lHIHRvIG1ha2Ugc29tZXRoaW5nIGNvb2wsIEknZCBsaWtlIHRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgaXQgc28gdGhhdCBJIGNhbiBtYWtlIFNXSUcgYmV0dGVyIChhbmQgdG8gc2F0aXNmeSBteSBjdXJpb3NpdHkpLjxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDY6NDkgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvUHl0aG9uLmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML1B5dGhvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTdhYjUzLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvUHl0aG9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzM0ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+U1dJRyBhbmQgUHl0aG9uPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT45IFNXSUcgYW5kIFB5dGhvbjwvaDE+PHA+PHVsPgotPGxpPiA8YSBocmVmPSIjbjEiPlByZWxpbWluYXJpZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMiI+QnVpbGRpbmcgUHl0aG9uIEV4dGVuc2lvbnMgdW5kZXIgV2luZG93cyA5NS9OVDwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5UaGUgbG93LWxldmVsIFB5dGhvbi9DIGludGVyZmFjZTwvYT4KLTxsaT4gPGEgaHJlZj0iI240Ij5QeXRob24gc2hhZG93IGNsYXNzZXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+QWJvdXQgdGhlIEV4YW1wbGVzPC9hPgotPGxpPiA8YSBocmVmPSIjbjYiPlNvbHZpbmcgYSBzaW1wbGUgaGVhdC1lcXVhdGlvbjwvYT4KLTxsaT4gPGEgaHJlZj0iI243Ij5XcmFwcGluZyBhIEMgbGlicmFyeTwvYT4KLTxsaT4gPGEgaHJlZj0iI244Ij5QdXR0aW5nIGl0IGFsbCB0b2dldGhlcjwvYT4KLTxsaT4gPGEgaHJlZj0iI245Ij5FeGNlcHRpb24gaGFuZGxpbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPlJlbWFwcGluZyBDIGRhdGF0eXBlcyB3aXRoIHR5cGVtYXBzPC9hPgotPGxpPiA8YSBocmVmPSIjbjExIj5JbXBsZW1lbnRpbmcgQyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gUHl0aG9uPC9hPgotPGxpPiA8YSBocmVmPSIjbjEyIj5PdGhlciBvZGRzIGFuZCBlbmRzPC9hPgotPGxpPiA8YSBocmVmPSIjbjEzIj5UaGUgZ29yeSBkZXRhaWxzIG9mIHNoYWRvdyBjbGFzc2VzPC9hPgotPC91bD4KLQotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBTV0lHJ3Mgc3VwcG9ydCBvZiBQeXRob24uIE1hbnkgb2YgdGhlIGV4YW1wbGUgcHJlc2VudGVkIGhlcmUgd2lsbCBoYXZlIGEgc2NpZW50aWZpYyBiaWFzIGdpdmVuIFB5dGhvbidzIGluY3JlYXNpbmcgdXNlIGluIHNjaWVudGlmaWMgYXBwbGljYXRpb25zICh0aGlzIGlzIGhvdyBJIHByaW1hcmlseSB1c2UgUHl0aG9uKSwgYnV0IHRoZSB0ZWNobmlxdWVzIGFyZSB3aWRlbHkgYXBwbGljYWJsZSB0byBvdGhlciBhcmVhcy48cD4KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBQcmVsaW1pbmFyaWVzPC9oMj4KLVNXSUcgMS4xIHdvcmtzIHdpdGggUHl0aG9uIDEuMyBhbmQgUHl0aG9uIDEuNC4gR2l2ZW4gdGhlIGNob2ljZSwgeW91IHNob3VsZCB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbi4gWW91IHNob3VsZCBhbHNvIGRldGVybWluZSBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljIGxvYWRpbmcuIFNXSUcgd2lsbCB3b3JrIHdpdGggb3Igd2l0aG91dCBkeW5hbWljIGxvYWRpbmcsIGJ1dCB0aGUgY29tcGlsYXRpb24gcHJvY2VzcyB3aWxsIHZhcnkuPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDM+IFJ1bm5pbmcgU1dJRzwvaDM+Ci1UbyBidWlsZCBhIFB5dGhvbiBtb2R1bGUsIHJ1biBTV0lHIHVzaW5nIHRoZSA8dHQ+LXB5dGhvbjwvdHQ+IG9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXN3aWcgLXB5dGhvbiBleGFtcGxlLmkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyB3aWxsIHByb2R1Y2UgMiBmaWxlcy4gVGhlIGZpbGUgPHR0PmV4YW1wbGVfd3JhcC5jPC90dD4gY29udGFpbnMgYWxsIG9mIHRoZSBDIGNvZGUgbmVlZGVkIHRvIGJ1aWxkIGEgUHl0aG9uIG1vZHVsZSBhbmQgYSBkb2N1bWVudGF0aW9uIGZpbGUgZGVzY3JpYmVzIHRoZSByZXN1bHRpbmcgaW50ZXJmYWNlLiBUbyBidWlsZCBhIFB5dGhvbiBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdG8gY29tcGlsZSB0aGUgZmlsZSA8dHQ+ZXhhbXBsZV93cmFwLmM8L3R0PiBhbmQgbGluayBpdCB3aXRoIHRoZSByZXN0IG9mIHlvdXIgcHJvZ3JhbSAoYW5kIHBvc3NpYmx5IFB5dGhvbiBpdHNlbGYpLiBXaGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3NlcywgU1dJRyB3aWxsIGFsc28gcHJvZHVjZSBhIDx0dD4ucHk8L3R0PiBmaWxlLCBidXQgdGhpcyBpcyBkZXNjcmliZWQgbGF0ZXIuPHA+Ci08YSBuYW1lPSJuMTUiPjwvYT48aDM+IEdldHRpbmcgdGhlIHJpZ2h0IGhlYWRlciBmaWxlczwvaDM+Ci1JbiBvcmRlciB0byBjb21waWxlLCB5b3UgbmVlZCB0byBsb2NhdGUgdGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBQeXRob24gZGlzdHJpYnV0aW9uIDo8cD4KLTxwPgotRm9yIFB5dGhvbiAxLjMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi91c3IvbG9jYWwvaW5jbHVkZS9QeSAKLS91c3IvbG9jYWwvbGliL3B5dGhvbi9saWIKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRm9yIFB5dGhvbiAxLjQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi91c3IvbG9jYWwvaW5jbHVkZS9weXRob24xLjQKLS91c3IvbG9jYWwvbGliL3B5dGhvbjEuNC9jb25maWcKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGV4YWN0IGxvY2F0aW9uIG1heSB2YXJ5IG9uIHlvdXIgbWFjaGluZSwgYnV0IHRoZSBhYm92ZSBsb2NhdGlvbnMgYXJlIHR5cGljYWwuIDxwPgotPGEgbmFtZT0ibjE2Ij48L2E+PGgzPiBDb21waWxpbmcgYSBkeW5hbWljIG1vZHVsZTwvaDM+Ci1UbyBidWlsZCBhIHNoYXJlZCBvYmplY3QgZmlsZSwgeW91IG5lZWQgdG8gY29tcGlsZSB5b3VyIG1vZHVsZSBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgKHNob3duIGZvciBJcml4KTo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLXB5dGhvbiBleGFtcGxlLmkKLSUgZ2NjIC1jIGV4YW1wbGUuYwotJSBnY2MgLWMgZXhhbXBsZV93cmFwLmMgLURIQVZFX0NPTkZJR19IIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjEuNCBcCi0JLUkvdXNyL2xvY2FsL2xpYi9weXRob24xLjQvY29uZmlnCi0lIGxkIC1zaGFyZWQgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGVtb2R1bGUuc28KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVW5mb3J0dW5hdGVseSwgdGhlIHByb2Nlc3Mgb2YgYnVpbGRpbmcgYSBzaGFyZWQgb2JqZWN0IGZpbGUgdmFyaWVzIG9uIGV2ZXJ5IHNpbmdsZSBtYWNoaW5lIHNvIHlvdSBtYXkgbmVlZCB0byByZWFkIHVwIG9uIHRoZSBtYW4gcGFnZXMgZm9yIHlvdXIgQyBjb21waWxlciBhbmQgbGlua2VyLjxwPgotPHA+Ci1XaGVuIGJ1aWxkaW5nIGEgZHluYW1pYyBtb2R1bGUsIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSBpcyBpbXBvcnRhbnQuIElmIHRoZSBuYW1lIG9mIHlvdXIgU1dJRyBtb2R1bGUgaXMgIjx0dD5leGFtcGxlPC90dD4iLCB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QgZmlsZSBzaG91bGQgYmUgIjx0dD5leGFtcGxlbW9kdWxlLnNvPC90dD4iIChvciBlcXVpdmFsZW50IGRlcGVuZGluZyBvbiB5b3VyIG1hY2hpbmUpLiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUgb3I8dHQ+IC1tb2R1bGU8L3R0PiBjb21tYW5kIGxpbmUgb3B0aW9uLjxwPgotPHA+Ci1XaGlsZSBkeW5hbWljIGxvYWRpbmcgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIG1ha2luZyBTV0lHIG1vZHVsZXMsIGl0IGlzIG5vdCBmb29scHJvb2YgYW5kIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiAgSW4gdGhlc2UgY2FzZXMsIHlvdSBjYW4gcmVidWlsZCB0aGUgUHl0aG9uIGludGVycHJldGVyIHdpdGggeW91ciBleHRlbnNpb25zIGFkZGVkLjxwPgotPGEgbmFtZT0ibjE3Ij48L2E+PGgzPiBSZWJ1aWxkaW5nIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgKGFrYS4gc3RhdGljIGxpbmtpbmcpPC9oMz4KLVRoZSBub3JtYWwgcHJvY2VkdXJlIGZvciBhZGRpbmcgYSBuZXcgbW9kdWxlIHRvIFB5dGhvbiBpbnZvbHZlcyBmaW5kaW5nIHRoZSBQeXRob24gc291cmNlLCBhZGRpbmcgYW4gZW50cnkgdG8gdGhlIDx0dD5Nb2R1bGVzL1NldHVwPC90dD4gZmlsZSwgYW5kIHJlYnVpbGRpbmcgdGhlIGludGVycHJldGVyIHVzaW5nIHRoZSBQeXRob24gTWFrZWZpbGUuIFdoaWxlIGl0J3MgcG9zc2libGUgdG8gc2ltcGxpZnkgdGhlIHByb2Nlc3MgYnkgdXNpbmcgdGhlIFZQQVRIIGZlYXR1cmUgb2YgYG1ha2UnLCBJJ3ZlIGFsd2F5cyBmb3VuZCB0aGUgcHJvY2VzcyB0byBiZSBhIGxpdHRsZSB0b28gY29tcGxpY2F0ZWQuIDxwPgotPHA+Ci1TV0lHIHByb3ZpZGVzIGFuIGV4dHJlbWVseSBlYXN5LCBhbHRob3VnaCBzb21ld2hhdCB1bmNvbnZlbnRpb25hbCwgbWVjaGFuaXNtIGZvciByZWJ1aWxkaW5nIFB5dGhvbiB1c2luZyBTV0lHJ3MgbGlicmFyeSBmZWF0dXJlLiBXaGVuIHlvdSB3YW50IHRvIGJ1aWxkIGEgc3RhdGljIHZlcnNpb24gb2YgUHl0aG9uLCBzaW1wbHkgbWFrZSBhbiBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotCi1leHRlcm4gaW50IGZhY3QoaW50KTsKLWV4dGVybiBpbnQgbW9kKGludCwgaW50KTsKLWV4dGVybiBkb3VibGUgTXlfdmFyaWFibGU7Ci0KLSVpbmNsdWRlIGVtYmVkLmkgICAgICAgICAgICAgIC8vIEluY2x1ZGUgY29kZSBmb3IgYSBzdGF0aWMgdmVyc2lvbiBvZiBQeXRob24KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5lbWJlZC5pPC90dD4gbGlicmFyeSBmaWxlIGluY2x1ZGVzIHN1cHBvcnRpbmcgY29kZSB0aGF0IGNvbnRhaW5zIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlYnVpbGQgUHl0aG9uLiBUbyBidWlsZCB5b3VyIG1vZHVsZSwgc2ltcGx5IGRvIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcHl0aG9uIGV4YW1wbGUuaQotJSBnY2MgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIC1ESEFWRV9DT05GSUdfSCAtSS91c3IvbG9jYWwvaW5jbHVkZS9weXRob24xLjQgXAotCS1JL3Vzci9sb2NhbC9saWIvcHl0aG9uMS40L2NvbmZpZyBcCi0JLUwvdXNyL2xvY2FsL2xpYi9weXRob24xLjQvY29uZmlnIC1sTW9kdWxlcyAtbFB5dGhvbiAtbE9iamVjdHMgLWxQYXJzZXIgLWxtIFwKLQktbyBteXB5dGhvbgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PbiBzb21lIG1hY2hpbmVzLCB5b3UgbWF5IG5lZWQgbmVlZCB0byBzdXBwbHkgYWRkaXRpb25hbCBsaWJyYXJpZXMgb24gdGhlIGxpbmsgbGluZS4gSW4gcGFydGljdWxhciwgeW91IG1heSBuZWVkIHRvIHN1cHBseSA8dHQ+LWxzb2NrZXQ8L3R0Piw8dHQ+IC1sbnNsPC90dD4sIGFuZCA8dHQ+LWxkbDwvdHQ+LiA8cD4KLTxwPgotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhZGQgdGhlIGVtYmVkLmkgbGlicmFyeSB0byBhbiBleGlzdGluZyBpbnRlcmZhY2UgYnkgcnVubmluZyBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcHl0aG9uIC1sZW1iZWQuaSBleGFtcGxlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD5lbWJlZC5pPC90dD4gZmlsZSB1c2VzIGFsbCBvZiB0aGUgbW9kdWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgdXNlZCBpbiB5b3VyIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFB5dGhvbi4gVGh1cywgeW91ciBuZXcgdmVyc2lvbiBvZiBQeXRob24gd2lsbCBiZSBpZGVudGljYWwgdG8gdGhlIG9sZCBvbmUgZXhjZXB0IHdpdGggeW91ciBuZXcgbW9kdWxlIGFkZGVkLiBJZiB5b3UgaGF2ZSBjb25maWd1cmVkIFB5dGhvbiB0byB1c2UgbW9kdWxlcyBzdWNoIGFzIDx0dD50a2ludGVyLDwvdHQ+IHlvdSBtYXkgbmVlZCB0byBzdXBwbHkgbGlua2FnZSB0byB0aGUgVGNsL1RrIGxpYnJhcmllcyBhbmQgWDExIGxpYnJhcmllcy48cD4KLTxwPgotUHl0aG9uJ3MgPHR0Pm1haW4oKTwvdHQ+IHByb2dyYW0gaXMgcmF0aGVyIHVuZnJpZW5kbHkgdG93YXJkcyBDKysgY29kZSwgYnV0IFNXSUcncyA8dHQ+ZW1iZWQuaTwvdHQ+IG1vZHVsZSBwcm92aWRlcyBhIHJlcGxhY2VtZW50IHRoYXQgY2FuIGJlIGNvbXBpbGVkIHdpdGggdGhlIEMrKyBjb21waWxlci0tbWFraW5nIGl0IGVhc3kgdG8gYnVpbGQgQysrIFB5dGhvbiBleHRlbnNpb25zLjxwPgotPHA+Ci1UaGUgPHR0PmVtYmVkLmk8L3R0PiBsaWJyYXJ5IHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBQeXRob24gMS40LiBJZiB5b3UgYXJlIHVzaW5nIFB5dGhvbiAxLjMsIHlvdSBzaG91bGQgdXNlIHRoZSBmaWxlIDx0dD5lbWJlZDEzLmk8L3R0PiBpbnN0ZWFkICh0aGlzIGNhbiBiZSBkb25lIGJ5IG1ha2luZyBhIHN5bWJvbGljIGxpbmsgaW4gdGhlIFNXSUcgbGlicmFyeSkgb3Igc2ltcGx5IHVzaW5nIHRoZSA8dHQ+LWw8L3R0PiBvcHRpb24uPHA+Ci08YSBuYW1lPSJuMTgiPjwvYT48aDM+IFVzaW5nIHlvdXIgbW9kdWxlPC9oMz4KLVRvIHVzZSB5b3VyIG1vZHVsZSBpbiBQeXRob24sIHNpbXBseSB1c2UgUHl0aG9uJ3MgaW1wb3J0IGNvbW1hbmQuIFRoZSBwcm9jZXNzIGlzIGlkZW50aWNhbCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHlvdSB1c2VkIGR5bmFtaWMgbG9hZGluZyBvciByZWJ1aWx0IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgcHl0aG9uCi0mZ3Q7Jmd0OyZndDsgaW1wb3J0IGV4YW1wbGUKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmZhY3QoNCkKLTI0Ci0mZ3Q7Jmd0OyZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjE5Ij48L2E+PGgzPiBDb21waWxhdGlvbiBwcm9ibGVtcyBhbmQgY29tcGlsaW5nIHdpdGggQysrPC9oMz4KLUZvciB0aGUgbW9zdCBwYXJ0LCBjb21waWxpbmcgYSBQeXRob24gbW9kdWxlIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgYnV0IHRoZXJlIGFyZSBhIG51bWJlciBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgOjxwPgotPHA+Ci08dWw+Ci08bGk+RHluYW1pYyBsb2FkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIG1hY2hpbmVzLiBJZiB5b3UgY2FuJ3QgZ2V0IGEgbW9kdWxlIHRvIGJ1aWxkLCB5b3UgbWlnaHQgdHJ5IGJ1aWxkaW5nIGEgbmV3IHZlcnNpb24gb2YgUHl0aG9uIHVzaW5nIHN0YXRpYyBsaW5raW5nIGluc3RlYWQuCi08bGk+SW4gb3JkZXIgdG8gYnVpbGQgQysrIG1vZHVsZXMsIHlvdSBtYXkgbmVlZCB0byBsaW5rIHdpdGggdGhlIEMrKyBjb21waWxlIHVzaW5nIGEgY29tbWFuZCBsaWtlIGA8dHQ+YysrIC1zaGFyZWQgZXhhbXBsZV93cmFwLm8gZXhhbXBsZS5vIC1vIGV4YW1wbGVtb2R1bGUuc288L3R0PicKLTxsaT5JZiBidWlsZGluZyBhIGR5bmFtaWMgQysrIG1vZHVsZSB1c2luZyBnKyssIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGxpbmsgYWdhaW5zdCA8dHQ+bGliZ2NjLmE8L3R0PiwgPHR0PmxpYmcrKy5hPC90dD4sIGFuZCA8dHQ+bGlic3RjKysuYTwvdHQ+IGxpYnJhcmllcy4KLTxsaT5NYWtlIHN1cmUgeW91IGFyZSB1c2luZyB0aGUgY29ycmVjdCBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcy4gQSBtb2R1bGUgY29tcGlsZWQgd2l0aCBQeXRob24gMS4zIGhlYWRlcnMgcHJvYmFibHkgd29uJ3Qgd29yayB3aXRoIFB5dGhvbiAxLjQuCi08L3VsPgotPGEgbmFtZT0ibjIiPjwvYT48aDI+IEJ1aWxkaW5nIFB5dGhvbiBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2gyPgotQnVpbGRpbmcgYSBTV0lHIGV4dGVuc2lvbiB0byBQeXRob24gdW5kZXIgV2luZG93cyA5NS9OVCBpcyByb3VnaGx5IHNpbWlsYXIgdG8gdGhlIHByb2Nlc3MgdXNlZCB3aXRoIFVuaXguICAgTm9ybWFsbHksIHlvdSB3aWxsIHdhbnQgdG8gcHJvZHVjZSBhIERMTCB0aGF0IGNhbiBiZSBsb2FkZWQgaW50byB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgICBUaGlzIHNlY3Rpb24gY292ZXJzIHRoZSBwcm9jZXNzIG9mIHVzaW5nIFNXSUcgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKyA0LnggYWx0aG91Z2ggdGhlIHByb2NlZHVyZSBtYXkgYmUgc2ltaWxhciB3aXRoIG90aGVyIGNvbXBpbGVycy4gICBTV0lHIGN1cnJlbnRseSBzdXBwb3J0cyBib3RoIHRoZSBiYXNpYyBQeXRob24gcmVsZWFzZSBhbmQgUHl0aG9ud2luLiAgSW4gb3JkZXIgdG8gYnVpbGQgZXh0ZW5zaW9ucywgeW91IHdpbGwgbmVlZCB0byBkb3dubG9hZCB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiB0byB0aGVzZSBwYWNrYWdlcyBhcyB5b3Ugd2lsbCBuZWVkIHRoZSBQeXRob24gaGVhZGVyIGZpbGVzLjxwPgotPGEgbmFtZT0ibjIwIj48L2E+PGgzPiBSdW5uaW5nIFNXSUcgZnJvbSBEZXZlbG9wZXIgU3R1ZGlvPC9oMz4KLUlmIHlvdSBhcmUgZGV2ZWxvcGluZyB5b3VyIGFwcGxpY2F0aW9uIHdpdGhpbiBNaWNyb3NvZnQgZGV2ZWxvcGVyIHN0dWRpbywgU1dJRyBjYW4gYmUgaW52b2tlZCBhcyBhIGN1c3RvbSBidWlsZCBvcHRpb24uICAgICAgVGhlIHByb2Nlc3Mgcm91Z2hseSBmb2xsb3dzIHRoZXNlIHN0ZXBzIDo8cD4KLTxwPgotPHVsPgotPGxpPk9wZW4gdXAgYSBuZXcgd29ya3NwYWNlIGFuZCB1c2UgdGhlIEFwcFdpemFyZCB0byBzZWxlY3QgYSBETEwgcHJvamVjdC4KLTxsaT5BZGQgYm90aCB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZSAodGhlIC5pIGZpbGUpLCBhbnkgc3VwcG9ydGluZyBDIGZpbGVzLCBhbmQgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgZmlsZSB0aGF0IHdpbGwgYmUgY3JlYXRlZCBieSBTV0lHIChpZS4gPHR0PmV4YW1wbGVfd3JhcC5jPC90dD4pLiAgIE5vdGUgOiBJZiB1c2luZyBDKyssIGNob29zZSBhIGRpZmZlcmVudCBzdWZmaXggZm9yIHRoZSB3cmFwcGVyIGZpbGUgc3VjaCBhcyA8dHQ+ZXhhbXBsZV93cmFwLmN4eDwvdHQ+LiBEb24ndCB3b3JyeSBpZiB0aGUgd3JhcHBlciBmaWxlIGRvZXNuJ3QgZXhpc3QgeWV0LS1EZXZlbG9wZXIgU3R1ZGlvIHdpbGwga2VlcCBhIHJlZmVyZW5jZSB0byBpdCBhcm91bmQuCi08bGk+U2VsZWN0IHRoZSBTV0lHIGludGVyZmFjZSBmaWxlIGFuZCBnbyB0byB0aGUgc2V0dGluZ3MgbWVudS4gICBVbmRlciBzZXR0aW5ncywgc2VsZWN0IHRoZSAiQ3VzdG9tIEJ1aWxkIiBvcHRpb24uCi08bGk+RW50ZXIgIlNXSUciIGluIHRoZSBkZXNjcmlwdGlvbiBmaWVsZC4KLTxsaT5FbnRlciAiPHR0PnN3aWcgLXB5dGhvbiAtbyAkKFByb2pEaXIpXCQoSW5wdXROYW1lKV93cmFwLmMgJChJbnB1dFBhdGgpPC90dD4iIGluIHRoZSAiQnVpbGQgY29tbWFuZChzKSBmaWVsZCIKLTxsaT5FbnRlciAiPHR0PiQoUHJvakRpcilcJChJbnB1dE5hbWUpX3dyYXAuYzwvdHQ+IiBpbiB0aGUgIk91dHB1dCBmaWxlcyhzKSBmaWVsZCIuCi08bGk+TmV4dCwgc2VsZWN0IHRoZSBzZXR0aW5ncyBmb3IgdGhlIGVudGlyZSBwcm9qZWN0IGFuZCBnbyB0byAiQysrOlByZXByb2Nlc3NvciIuIEFkZCB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgeW91ciBQeXRob24gaW5zdGFsbGF0aW9uIHVuZGVyICJBZGRpdGlvbmFsIGluY2x1ZGUgZGlyZWN0b3JpZXMiLgotPGxpPkRlZmluZSB0aGUgc3ltYm9sICBfX1dJTjMyX18gdW5kZXIgcHJlcHJvY2Vzc29yIG9wdGlvbnMuICAKLTxsaT5GaW5hbGx5LCBzZWxlY3QgdGhlIHNldHRpbmdzIGZvciB0aGUgZW50aXJlIHByb2plY3QgYW5kIGdvIHRvICJMaW5rIE9wdGlvbnMiLiAgQWRkIHRoZSBQeXRob24gbGlicmFyeSAgZmlsZSB0byB5b3VyIGxpbmsgbGlicmFyaWVzLiAgRm9yIGV4YW1wbGUgInB5dGhvbjE0LmxpYiIuICBBbHNvLCBzZXQgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHlvdXIgUHl0aG9uIG1vZHVsZSAoaWUuIGV4YW1wbGUuZGxsKS4KLTxsaT5CdWlsZCB5b3VyIHByb2plY3QuCi08L3VsPgotPHA+Ci1Ob3csIGFzc3VtaW5nIGFsbCB3ZW50IHdlbGwsIFNXSUcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGludm9rZWQgd2hlbiB5b3UgYnVpbGQgeW91ciBwcm9qZWN0LiAgQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgaW50ZXJmYWNlIGZpbGUgd2lsbCByZXN1bHQgaW4gU1dJRyBiZWluZyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8gcHJvZHVjZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSB3cmFwcGVyIGZpbGUuICBUbyBydW4geW91ciBuZXcgUHl0aG9uIGV4dGVuc2lvbiwgc2ltcGx5IHJ1biBQeXRob24gYW5kIHVzZSB0aGUgPHR0PmltcG9ydDwvdHQ+IGNvbW1hbmQgYXMgbm9ybWFsLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1NU0RPUyAmZ3Q7IHB5dGhvbgotJmd0OyZndDsmZ3Q7IGltcG9ydCBleGFtcGxlCi0mZ3Q7Jmd0OyZndDsgcHJpbnQgZXhhbXBsZS5mYWN0KDQpCi0yNAotJmd0OyZndDsmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjEiPjwvYT48aDM+IFVzaW5nIE5NQUtFPC9oMz4KLUFsdGVybmF0aXZlbHksIFNXSUcgZXh0ZW5zaW9ucyBjYW4gYmUgYnVpbHQgYnkgd3JpdGluZyBhIE1ha2VmaWxlIGZvciBOTUFLRS4gICBNYWtlIHN1cmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgTVNWQysrIGFyZSBhdmFpbGFibGUgYW5kIHRoZSBNU1ZDKysgdG9vbHMgYXJlIGluIHlvdXIgcGF0aC4gICBOb3csIGp1c3Qgd3JpdGUgYSBzaG9ydCBNYWtlZmlsZSBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIGEgUHl0aG9uIGV4dGVuc2lvbgotCi1TUkNTICAgICAgICAgID0gZXhhbXBsZS5jCi1JRklMRSAgICAgICAgID0gZXhhbXBsZQotSU5URVJGQUNFICAgICA9ICQoSUZJTEUpLmkKLVdSQVBGSUxFICAgICAgPSAkKElGSUxFKV93cmFwLmMKLQotIyBMb2NhdGlvbiBvZiB0aGUgVmlzdWFsIEMrKyB0b29scyAoMzIgYml0IGFzc3VtZWQpCi0KLVRPT0xTICAgICAgICAgPSBjOlxtc2RldgotVEFSR0VUICAgICAgICA9IGV4YW1wbGUuZGxsCi1DQyAgICAgICAgICAgID0gJChUT09MUylcYmluXGNsLmV4ZQotTElOSyAgICAgICAgICA9ICQoVE9PTFMpXGJpblxsaW5rLmV4ZQotSU5DTFVERTMyICAgICA9IC1JJChUT09MUylcaW5jbHVkZQotTUFDSElORSAgICAgICA9IElYODYKLQotIyBDIExpYnJhcnkgbmVlZGVkIHRvIGJ1aWxkIGEgRExMCi0KLURMTElCQyAgICAgICAgPSBtc3ZjcnQubGliIG9sZG5hbWVzLmxpYiAgCi0KLSMgV2luZG93cyBsaWJyYXJpZXMgdGhhdCBhcmUgYXBwYXJlbnRseSBuZWVkZWQKLVdJTkxJQiAgICAgICAgPSBrZXJuZWwzMi5saWIgYWR2YXBpMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIGNvbWRsZzMyLmxpYiAKLXdpbnNwb29sLmxpYgotCi0jIExpYnJhcmllcyBjb21tb24gdG8gYWxsIERMTHMKLUxJQlMgICAgICAgICAgPSAkKERMTElCQykgJChXSU5MSUIpIAotCi0jIExpbmtlciBvcHRpb25zCi1MT1BUICAgICAgPSAtZGVidWc6ZnVsbCAtZGVidWd0eXBlOmN2IC9OT0RFRkFVTFRMSUIgL1JFTEVBU0UgL05PTE9HTyBcCi0gICAgICAgICAgICAgL01BQ0hJTkU6JChNQUNISU5FKSAtZW50cnk6X0RsbE1haW5DUlRTdGFydHVwQDEyIC1kbGwKLQotIyBDIGNvbXBpbGVyIGZsYWdzCi0KLUNGTEFHUyAgICAgICAgPSAvWjcgL09kIC9jIC9ub2xvZ28KLVBZX0lOQ0xVREUgICAgPSAtSWQ6XHB5dGhvbi0xLjRcSW5jbHVkZSAtSWQ6XHB5dGhvbi0xLjQgLUlkOlxweXRob24tMS40XFBjCi1QWV9MSUIgICAgICAgID0gZDpccHl0aG9uLTEuNFx2YzQwXHB5dGhvbjE0LmxpYgotUFlfRkxBR1MgPSAvRF9fV0lOMzJfXwotCi1weXRob246OgotCXN3aWcgLXB5dGhvbiAtbyAkKFdSQVBGSUxFKSAkKElOVEVSRkFDRSkKLQkkKENDKSAkKENGTEFHUykgJChQWV9GTEFHUykgJChQWV9JTkNMVURFKSAkKFNSQ1MpICQoV1JBUEZJTEUpCi0Jc2V0IExJQj0kKFRPT0xTKVxsaWIKLQkkKExJTkspICQoTE9QVCkgLW91dDpleGFtcGxlLmRsbCAkKExJQlMpICQoUFlfTElCKSBleGFtcGxlLm9iaiBleGFtcGxlX3dyYXAub2JqCi0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UbyBidWlsZCB0aGUgZXh0ZW5zaW9uLCBydW4gTk1BS0UgKHlvdSBtYXkgbmVlZCB0byBydW4gPHR0PnZjdmFyczMyPC90dD4gZmlyc3QpLiBUaGlzIGlzIGEgcHJldHR5IHNpbXBsaXN0aWMgTWFrZWZpbGUsIGJ1dCBob3BlZnVsbHkgaXRzIGVub3VnaCB0byBnZXQgeW91IHN0YXJ0ZWQuICAgPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gVGhlIGxvdy1sZXZlbCBQeXRob24vQyBpbnRlcmZhY2U8L2gyPgotVGhlIFNXSUcgUHl0aG9uIG1vZHVsZSBpcyBiYXNlZCB1cG9uIGEgYmFzaWMgbG93LWxldmVsIGludGVyZmFjZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBDIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjb25zdGFudHMsIGFuZCBDKysgY2xhc3Nlcy4gVGhpcyBsb3ctbGV2ZWwgaW50ZXJmYWNlIGlzIG9mdGVuIHVzZWQgdG8gY3JlYXRlIG1vcmUgc29waGlzdGljYXRlZCBpbnRlcmZhY2VzIChzdWNoIGFzIHNoYWRvdyBjbGFzc2VzKSBzbyBpdCBtYXkgYmUgaGlkZGVuIGluIHByYWN0aWNlLjxwPgotPGEgbmFtZT0ibjIyIj48L2E+PGgzPiBNb2R1bGVzPC9oMz4KLVRoZSBTV0lHIDx0dD4lbW9kdWxlPC90dD4gZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgUHl0aG9uIG1vZHVsZS4gSWYgeW91IHNwZWNpZmllZCBgPHR0PiVtb2R1bGUgZXhhbXBsZTwvdHQ+JywgdGhlbiBldmVyeXRoaW5nIGZvdW5kIGluIGEgU1dJRyBpbnRlcmZhY2UgZmlsZSB3aWxsIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFB5dGhvbiBgPHR0PmV4YW1wbGU8L3R0PicgbW9kdWxlLiAgTWFrZSBzdXJlIHlvdSBkb24ndCB1c2UgdGhlIHNhbWUgbmFtZSBhcyBhIGJ1aWx0LWluIFB5dGhvbiBjb21tYW5kIG9yIHN0YW5kYXJkIG1vZHVsZSBvciB5b3VyIHJlc3VsdHMgbWF5IGJlIHVucHJlZGljdGFibGUuIDxwPgotPGEgbmFtZT0ibjIzIj48L2E+PGgzPiBGdW5jdGlvbnM8L2gzPgotQy9DKysgZnVuY3Rpb25zIGFyZSBtYXBwZWQgZGlyZWN0bHkgaW50byBhIG1hdGNoaW5nIFB5dGhvbiBmdW5jdGlvbi4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotZXh0ZXJuIGludCBmYWN0KGludCBuKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotZ2V0cyB0dXJuZWQgaW50byB0aGUgUHl0aG9uIGZ1bmN0aW9uIDx0dD5leGFtcGxlLmZhY3Qobik8L3R0PiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Jmd0OyZndDsmZ3Q7IGltcG9ydCBleGFtcGxlCi0mZ3Q7Jmd0OyZndDsgcHJpbnQgZXhhbXBsZS5mYWN0KDQpCi0yNAotJmd0OyZndDsmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjQiPjwvYT48aDM+IFZhcmlhYmxlIExpbmtpbmc8L2gzPgotU1dJRyBwcm92aWRlcyBhY2Nlc3MgdG8gQy9DKysgZ2xvYmFsIHZhcmlhYmxlcywgYnV0IHRoZSBtZWNoYW5pc20gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gb25lIG1pZ2h0IGV4cGVjdCBkdWUgdG8gdGhlIG9iamVjdCBtb2RlbCB1c2VkIGluIFB5dGhvbi4gV2hlbiB5b3UgdHlwZSB0aGUgZm9sbG93aW5nIGluIFB5dGhvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+YSA9IDMuNAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0iYSIgYmVjb21lcyBhIG5hbWUgZm9yIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZSAzLjQuIElmIHlvdSBsYXRlciB0eXBlPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+YiA9IGEKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlbiAiYSIgYW5kICJiIiBhcmUgYm90aCBuYW1lcyBmb3IgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSB2YWx1ZSAzLjQuIEluIG90aGVyIHdvcmRzLCB0aGVyZSBpcyBvbmx5IG9uZSBvYmplY3QgY29udGFpbmluZyAzLjQgYW5kICJhIiBhbmQgImIiIGFyZSBib3RoIG5hbWVzIHRoYXQgcmVmZXIgdG8gaXQuIFRoaXMgaXMgYSB2ZXJ5IGRpZmZlcmVudCBtb2RlbCB0aGFuIHRoYXQgdXNlZCBpbiBDLiBGb3IgdGhpcyByZWFzb24sIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSBmb3IgbWFwcGluZyAiYXNzaWdubWVudCIgaW4gUHl0aG9uIG9udG8gQyBnbG9iYWwgdmFyaWFibGVzIChiZWNhdXNlIGFzc2lnbm1lbnQgaXMgUHl0aG9uIGlzIHJlYWxseSBhIG5hbWluZyBvcGVyYXRpb24pLjxwPgotPHA+Ci1UbyBwcm92aWRlIGFjY2VzcyB0byBDIGdsb2JhbCB2YXJpYWJsZXMsIFNXSUcgY3JlYXRlcyBhIHNwZWNpYWwgUHl0aG9uIG9iamVjdCBjYWxsZWQgYDx0dD5jdmFyPC90dD4nIHRoYXQgaXMgYWRkZWQgdG8gZWFjaCBTV0lHIGdlbmVyYXRlZCBtb2R1bGUuIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gYWNjZXNzIGdsb2JhbCB2YXJpYWJsZXMgIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIFNXSUcgaW50ZXJmYWNlIGZpbGUgd2l0aCBnbG9iYWwgdmFyaWFibGVzCi0lbW9kdWxlIGV4YW1wbGUKLS4uLgotZXh0ZXJuIGludCBNeV92YXJpYWJsZTsKLWV4dGVybiBkb3VibGUgZGVuc2l0eTsKLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3cgaW4gUHl0aG9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgaW1wb3J0IGV4YW1wbGUKLSZndDsmZ3Q7Jmd0OyAjIFByaW50IG91dCB2YWx1ZSBvZiBhIEMgZ2xvYmFsIHZhcmlhYmxlCi0mZ3Q7Jmd0OyZndDsgcHJpbnQgZXhhbXBsZS5jdmFyLk15X3ZhcmlhYmxlCi00Ci0mZ3Q7Jmd0OyZndDsgIyBTZXQgdGhlIHZhbHVlIG9mIGEgQyBnbG9iYWwgdmFyaWFibGUKLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmN2YXIuZGVuc2l0eSA9IDAuODQ0MgotJmd0OyZndDsmZ3Q7ICMgVXNlIGluIGEgbWF0aCBvcGVyYXRpb24KLSZndDsmZ3Q7Jmd0OyBleGFtcGxlLmN2YXIuZGVuc2l0eSA9IGV4YW1wbGUuY3Zhci5kZW5zaXR5KjEuMTAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSnVzdCByZW1lbWJlciwgYWxsIEMgZ2xvYmFscyBuZWVkIHRvIGJlIHByZWZpeGVkIHdpdGggYSAiPHR0PmN2YXIuPC90dD4iIGFuZCB5b3Ugd2lsbCBiZSBzZXQuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBhIG5hbWUgb3RoZXIgdGhhbiAiPHR0PmN2YXI8L3R0PiIsIGl0IGNhbiBiZSBjaGFuZ2VkIHVzaW5nIHRoZSA8dHQ+LWdsb2JhbHM8L3R0PiBvcHRpb24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcHl0aG9uIC1nbG9iYWxzIG15dmFyIGV4YW1wbGUuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Tb21lIGNhcmUgaXMgaW4gb3JkZXIgd2hlbiBpbXBvcnRpbmcgbXVsdGlwbGUgU1dJRyBtb2R1bGVzLiBJZiB5b3UgdXNlIHRoZSAiPHR0PmZyb20gJmx0O2ZpbGUmZ3Q7IGltcG9ydCAqPC90dD4iIHN0eWxlIG9mIGltcG9ydGluZywgeW91IHdpbGwgZ2V0IGEgbmFtZSBjbGFzaCBvbiB0aGUgdmFyaWFibGUgYDx0dD5jdmFyPC90dD4nIGFuZCB3aWxsIG9ubHkgYmUgYWJsZSB0byBhY2Nlc3MgZ2xvYmFsIHZhcmlhYmxlcyBmcm9tIHRoZSBsYXN0IG1vZHVsZSBsb2FkZWQuIFNXSUcgZG9lcyBub3QgY3JlYXRlIDx0dD5jdmFyPC90dD4gaWYgdGhlcmUgYXJlIG5vIGdsb2JhbCB2YXJpYWJsZXMgaW4gYSBtb2R1bGUuPHA+Ci08YSBuYW1lPSJuMjUiPjwvYT48aDM+IENvbnN0YW50czwvaDM+Ci1DL0MrKyBjb25zdGFudHMgYXJlIGluc3RhbGxlZCBhcyBuZXcgUHl0aG9uIG9iamVjdHMgY29udGFpbmluZyB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuIFRoZXNlIGNvbnN0YW50cyBhcmUgZ2l2ZW4gdGhlIHNhbWUgbmFtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBDIGNvbnN0YW50LiAiQ29uc3RhbnRzIiBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc3RhbnRzIGluIFB5dGhvbi0tLWluIG90aGVyIHdvcmRzLCB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIHRoZW0gYW5kIHN1ZmZlciB0aGUgY29uc2VxdWVuY2VzITxwPgotPGEgbmFtZT0ibjI2Ij48L2E+PGgzPiBQb2ludGVyczwvaDM+Ci1Qb2ludGVycyB0byBDL0MrKyBvYmplY3RzIGFyZSByZXByZXNlbnRlZCBhcyBjaGFyYWN0ZXIgc3RyaW5ncyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPl8xMDBmOGUyX1ZlY3Rvcl9wCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUEgTlVMTCBwb2ludGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgIk5VTEwiLiBZb3UgY2FuIGFsc28gZXhwbGljaXRseSBjcmVhdGUgYSBOVUxMIHBvaW50ZXIgY29uc2lzdGluZyBvZiB0aGUgdmFsdWUgMCBhbmQgYSB0eXBlIHN1Y2ggYXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPl8wX1ZlY3Rvcl9wCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHNvbWUgUHl0aG9uIHVzZXJzLCB0aGUgaWRlYSBvZiByZXByZXNlbnRpbmcgcG9pbnRlcnMgYXMgc3RyaW5ncyBtYXkgc2VlbSBzdHJhbmdlLCBidXQga2VlcCBpbiBtaW5kIHRoYXQgcG9pbnRlcnMgYXJlIG1lYW50IHRvIGJlIG9wYXF1ZSBvYmplY3RzLiBJbiBwcmFjdGljZSwgeW91IG1heSBuZXZlciBub3RpY2UgdGhhdCBwb2ludGVycyBhcmUgY2hhcmFjdGVyIHN0cmluZ3MuIFRoZXJlIGlzIGFsc28gYSBjZXJ0YWluIGVmZmljaWVuY3kgaW4gdXNpbmcgdGhpcyByZXByZXNlbnRhdGlvbiBhcyBpdCBpcyBlYXN5IHRvIHBhc3MgcG9pbnRlcnMgYXJvdW5kIGJldHdlZW4gbW9kdWxlcyBhbmQgaXQgaXMgdW5uZWNlc3NhcnkgdG8gcmVseSBvbiBhIG5ldyBQeXRob24gZGF0YXR5cGUuIEV2ZW50dWFsbHksIHBvaW50ZXJzIG1heSBiZSByZXByZXNlbnRlZCBhcyBzcGVjaWFsIFB5dGhvbiBvYmplY3RzLCBidXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiB3b3JrcyByZW1hcmthYmx5IHdlbGwgc28gdGhlcmUgaGFzIGJlZW4gbGl0dGxlIG5lZWQgdG8gcmVwbGFjZSBpdC48cD4KLTxhIG5hbWU9Im4yNyI+PC9hPjxoMz4gU3RydWN0dXJlcyA8L2gzPgotVGhlIGxvdy1sZXZlbCBTV0lHIGludGVyZmFjZSBvbmx5IHByb3ZpZGVzIGEgc2ltcGxlIGludGVyZmFjZSB0byBDIHN0cnVjdHVyZXMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zdHJ1Y3QgVmVjdG9yIHsKLQlkb3VibGUgeCx5LHo7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1nZXRzIG1hcHBlZCBpbnRvIHRoZSBmb2xsb3dpbmcgY29sbGVjdGlvbiBvZiBDIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIFZlY3Rvcl94X2dldChWZWN0b3IgKm9iaikKLWRvdWJsZSBWZWN0b3JfeF9zZXQoVmVjdG9yICpvYmosIGRvdWJsZSB4KQotZG91YmxlIFZlY3Rvcl95X2dldChWZWN0b3IgKm9iaikKLWRvdWJsZSBWZWN0b3JfeV9zZXQoVmVjdG9yICpvYmosIGRvdWJsZSB5KQotZG91YmxlIFZlY3Rvcl96X2dldChWZWN0b3IgKm9iaikKLWRvdWJsZSBWZWN0b3Jfel9zZXQoVmVjdG9yICpvYmosIGRvdWJsZSB6KQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGVzZSBmdW5jdGlvbnMgYXJlIHRoZW4gdXNlZCBpbiB0aGUgcmVzdWx0aW5nIFB5dGhvbiBpbnRlcmZhY2UuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIHYgaXMgYSBWZWN0b3IgdGhhdCBnb3QgY3JlYXRlZCBzb21laG93Ci0mZ3Q7Jmd0OyZndDsgVmVjdG9yX3hfZ2V0KHYpCi0zLjUKLSZndDsmZ3Q7Jmd0OyBWZWN0b3JfeF9zZXQodiw3LjgpICAgICAgICMgQ2hhbmdlIHggY29tcG9uZW50Ci0mZ3Q7Jmd0OyZndDsgcHJpbnQgVmVjdG9yX3hfZ2V0KHYpLCBWZWN0b3JfeV9nZXQodiksIFZlY3Rvcl96X2dldCh2KQotNy44IC00LjUgMC4wCi0mZ3Q7Jmd0OyZndDsgCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNpbWlsYXIgYWNjZXNzIGlzIHByb3ZpZGVkIGZvciB1bmlvbnMgYW5kIHRoZSBkYXRhIG1lbWJlcnMgb2YgQysrIGNsYXNzZXMuPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IEMrKyBDbGFzc2VzPC9oMz4KLUMrKyBjbGFzc2VzIGFyZSBoYW5kbGVkIGJ5IGJ1aWxkaW5nIGEgc2V0IG9mIGxvdyBsZXZlbCBhY2Nlc3NvciBmdW5jdGlvbnMuIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIExpc3QgewotcHVibGljOgotICBMaXN0KCk7Ci0gIH5MaXN0KCk7Ci0gIGludCAgc2VhcmNoKGNoYXIgKml0ZW0pOwotICB2b2lkIGluc2VydChjaGFyICppdGVtKTsKLSAgdm9pZCByZW1vdmUoY2hhciAqaXRlbSk7Ci0gIGNoYXIgKmdldChpbnQgbik7Ci0gIGludCAgbGVuZ3RoOwotc3RhdGljIHZvaWQgcHJpbnQoTGlzdCAqbCk7Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIHdyYXBwZWQgYnkgU1dJRywgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2lsbCBiZSBjcmVhdGVkIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5MaXN0ICAgICpuZXdfTGlzdCgpOwotdm9pZCAgICAgZGVsZXRlX0xpc3QoTGlzdCAqbCk7Ci1pbnQgICAgICBMaXN0X3NlYXJjaChMaXN0ICpsLCBjaGFyICppdGVtKTsKLXZvaWQgICAgIExpc3RfaW5zZXJ0KExpc3QgKmwsIGNoYXIgKml0ZW0pOwotdm9pZCAgICAgTGlzdF9yZW1vdmUoTGlzdCAqbCwgY2hhciAqaXRlbSk7Ci1jaGFyICAgICpMaXN0X2dldChMaXN0ICpsLCBpbnQgbik7Ci1pbnQgICAgICBMaXN0X2xlbmd0aF9nZXQoTGlzdCAqbCk7Ci1pbnQgICAgICBMaXN0X2xlbmd0aF9zZXQoTGlzdCAqbCwgaW50IG4pOwotdm9pZCAgICAgTGlzdF9wcmludChMaXN0ICpsKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2l0aGluIFB5dGhvbiwgdGhlc2UgZnVuY3Rpb25zIHVzZWQgdG8gYWNjZXNzIHRoZSBDKysgY2xhc3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSZndDsmZ3Q7Jmd0OyBsID0gbmV3X0xpc3QoKQotJmd0OyZndDsmZ3Q7IExpc3RfaW5zZXJ0KGwsIkFsZSIpCi0mZ3Q7Jmd0OyZndDsgTGlzdF9pbnNlcnQobCwiU3RvdXQiKQotJmd0OyZndDsmZ3Q7IExpc3RfaW5zZXJ0KGwsIkxhZ2VyIikKLSZndDsmZ3Q7Jmd0OyBMaXN0X3ByaW50KGwpCi1MYWdlcgotU3RvdXQKLUFsZQotJmd0OyZndDsmZ3Q7IHByaW50IExpc3RfbGVuZ3RoX2dldChsKQotMwotJmd0OyZndDsmZ3Q7IHByaW50IGwKLV8xMDA4NTYwX0xpc3RfcAotJmd0OyZndDsmZ3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUMrKyBvYmplY3RzIGFyZSByZWFsbHkganVzdCBwb2ludGVycy4gTWVtYmVyIGZ1bmN0aW9ucyBhbmQgZGF0YSBhcmUgYWNjZXNzZWQgYnkgc2ltcGx5IHBhc3NpbmcgYSBwb2ludGVyIGludG8gYSBjb2xsZWN0aW9uIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IHRha2UgdGhlIHBvaW50ZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LjxwPgotPHA+Ci1XaGlsZSBzb21ld2hhdCBwcmltaXRpdmUsIHRoZSBsb3ctbGV2ZWwgU1dJRyBpbnRlcmZhY2UgcHJvdmlkZXMgZGlyZWN0IGFuZCBmbGV4aWJsZSBhY2Nlc3MgdG8gQysrIG9iamVjdHMuIEFzIGl0IHR1cm5zIG91dCwgYSBtb3JlIGVsZWdhbnQgbWV0aG9kIG9mIGFjY2Vzc2luZyBzdHJ1Y3R1cmVzIGFuZCBjbGFzc2VzIGlzIGF2YWlsYWJsZSB1c2luZyBzaGFkb3cgY2xhc3Nlcy48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBQeXRob24gc2hhZG93IGNsYXNzZXM8L2gyPgotVGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UgZ2VuZXJhdGVkIGJ5IFNXSUcgcHJvdmlkZXMgYWNjZXNzIHRvIEMgc3RydWN0dXJlcyBhbmQgQysrIGNsYXNzZXMsIGJ1dCBpdCBkb2Vzbid0IGxvb2sgbXVjaCBsaWtlIGEgY2xhc3MgdGhhdCBtaWdodCBiZSBjcmVhdGVkIGluIFB5dGhvbi4gSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBsb3ctbGV2ZWwgQyBpbnRlcmZhY2UgdG8gd3JpdGUgYSBQeXRob24gY2xhc3MgdGhhdCBsb29rcyBsaWtlIHRoZSBvcmlnaW5hbCBDKysgY2xhc3MuIEluIHRoaXMgY2FzZSwgdGhlIFB5dGhvbiBjbGFzcyBpcyBzYWlkIHRvICJzaGFkb3ciIHRoZSBDKysgY2xhc3MuICBUaGF0IGlzLCBpdCBiZWhhdmVzIGxpa2UgdGhlIG9yaWdpbmFsIGNsYXNzLCBidXQgaXMgcmVhbGx5IGp1c3QgYSB3cmFwcGVyIGFyb3VuZCBhIEMrKyBjbGFzcy48cD4KLTxhIG5hbWU9Im4yOSI+PC9hPjxoMz4gQSBzaW1wbGUgZXhhbXBsZTwvaDM+Ci1Gb3Igb3VyIGVhcmxpZXIgTGlzdCBjbGFzcywgYSBQeXRob24gc2hhZG93IGNsYXNzIGNvdWxkIGJlIHdyaXR0ZW4gYnkgaGFuZCBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIExpc3Q6Ci0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlzZWxmLnRoaXMgPSBuZXdfTGlzdCgpCi0JZGVmIF9fZGVsX18oc2VsZik6Ci0JCWRlbGV0ZV9MaXN0KHNlbGYudGhpcykKLQlkZWYgc2VhcmNoKHNlbGYsaXRlbSk6Ci0JCXJldHVybiBMaXN0X3NlYXJjaChzZWxmLnRoaXMsaXRlbSkKLQlkZWYgaW5zZXJ0KHNlbGYsaXRlbSk6Ci0JCUxpc3RfaW5zZXJ0KHNlbGYudGhpcyxpdGVtKQotCWRlZiByZW1vdmUoc2VsZixpdGVtKToKLQkJTGlzdF9yZW1vdmUoc2VsZi50aGlzLGl0ZW0pCi0JZGVmIGdldChzZWxmLG4pOgotCQlyZXR1cm4gTGlzdF9nZXQoc2VsZi50aGlzLG4pCi0JZGVmIF9fZ2V0YXR0cl9fKHNlbGYsbmFtZSk6Ci0JCWlmIG5hbWUgPT0gImxlbmd0aCIgOiByZXR1cm4gTGlzdF9sZW5ndGhfZ2V0KHNlbGYudGhpcykpCi0JCWVsc2UgOiByZXR1cm4gc2VsZi5fX2RpY3RfX1tuYW1lXQotCWRlZiBfX3NldGF0dHJfXyhzZWxmLG5hbWUsdmFsdWUpOgotCQlpZiBuYW1lID09ICJsZW5ndGgiOiBMaXN0X2xlbmd0aF9zZXQoc2VsZi50aGlzLHZhbHVlKQotCQllbHNlIDogc2VsZi5fX2RpY3RfX1tuYW1lXSA9IHZhbHVlCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gdXNlZCBpbiBhIFB5dGhvbiBzY3JpcHQsIHdlIGNhbiB1c2UgdGhlIGNsYXNzIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLQotJmd0OyZndDsmZ3Q7IGwgPSBMaXN0KCkKLSZndDsmZ3Q7Jmd0OyBsLmluc2VydCgiQWxlIikKLSZndDsmZ3Q7Jmd0OyBsLmluc2VydCgiU3RvdXQiKQotJmd0OyZndDsmZ3Q7IGwuaW5zZXJ0KCJMYWdlciIpCi0mZ3Q7Jmd0OyZndDsgTGlzdF9wcmludChsLnRoaXMpCi1MYWdlcgotU3RvdXQKLUFsZQotJmd0OyZndDsmZ3Q7IGwubGVuZ3RoCi0zCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU9idmlvdXNseSwgdGhpcyBpcyBhIG11Y2ggbmljZXIgaW50ZXJmYWNlIHRoYW4gYmVmb3JlLS1hbmQgaXQgb25seSByZXF1aXJlZCBhIHNtYWxsIGFtb3VudCBvZiBQeXRob24gY29kaW5nLjxwPgotPGEgbmFtZT0ibjMwIj48L2E+PGgzPiBXaHkgd3JpdGUgc2hhZG93IGNsYXNzZXMgaW4gUHl0aG9uPzwvaDM+Ci1XaGlsZSBvbmUgY291bGQgd3JhcCBDL0MrKyBvYmplY3RzIGRpcmVjdGx5IGludG8gUHl0aG9uIGFzIG5ldyBQeXRob24gdHlwZXMsIHRoaXMgYXBwcm9hY2ggaGFzIGEgbnVtYmVyIG9mIHByb2JsZW1zLiBGaXJzdCwgYXMgdGhlIEMvQysrIGNvZGUgZ2V0cyBjb21wbGljYXRlZCwgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgc3RhcnRzIHRvIGJlY29tZSBleHRyZW1lbHkgdWdseS4gSXQgYWxzbyBiZWNvbWVzIGhhcmQgdG8gaGFuZGxlIGluaGVyaXRhbmNlIGFuZCBtb3JlIGFkdmFuY2VkIGxhbmd1YWdlIGZlYXR1cmVzLiBBIHNlY29uZCwgYW5kIG1vcmUgc2VyaW91cyBwcm9ibGVtLCBpcyB0aGF0IFB5dGhvbiAidHlwZXMiIGNyZWF0ZWQgaW4gQyBjYW4gbm90IGJlIHN1YmNsYXNzZWQgb3IgdXNlZCBpbiB0aGUgc2FtZSB3YXkgYXMgb25lIG1pZ2h0IHVzZSBhIHJlYWwgUHl0aG9uIGNsYXNzLiBBcyBhIHJlc3VsdCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRvIGludGVyZXN0aW5nIHRoaW5ncyBsaWtlIGNyZWF0ZSBQeXRob24gY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbSBDKysgY2xhc3Nlcy4gIDxwPgotPHA+Ci1CeSB3cml0aW5nIHNoYWRvdyBjbGFzc2VzIGluIFB5dGhvbiBpbnN0ZWFkIG9mIEMsIHRoZSBjbGFzc2VzIGJlY29tZSByZWFsIFB5dGhvbiBjbGFzc2VzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYmFzZS1jbGFzc2VzIGluIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBvciBmb3Igb3RoZXIgYXBwbGljYXRpb25zLiBXcml0aW5nIHRoZSBzaGFkb3cgY2xhc3NlcyBpbiBQeXRob24gYWxzbyBncmVhdGx5IHNpbXBsaWVzIGNvZGluZyBjb21wbGV4aXR5IGFzIHdyaXRpbmcgaW4gUHl0aG9uIGlzIG11Y2ggZWFzaWVyIHRoYW4gdHJ5aW5nIHRvIGFjY29tcGxpc2ggdGhlIHNhbWUgdGhpbmcgaW4gQy4gRmluYWxseSwgYnkgd3JpdGluZyBzaGFkb3cgY2xhc3NlcyBpbiBQeXRob24sIHRoZXkgYXJlIGVhc3kgdG8gbW9kaWZ5IGFuZCBjYW4gYmUgY2hhbmdlZCB3aXRob3V0IGV2ZXIgcmVjb21waWxpbmcgYW55IG9mIHRoZSBDIGNvZGUuICAgVGhlIGRvd25zaWRlIHRvIHRoaXMgYXBwcm9hY2ggaXMgd29yc2UgcGVyZm9ybWFuY2UtLWEgY29uY2VybiBmb3Igc29tZSB1c2Vycy48cD4KLTxwPgotVGhlIHByb2JsZW1zIG9mIGNvbWJpbmluZyBDKysgYW5kIFB5dGhvbiBoYXZlIGJlZW4gb2YgZ3JlYXQgaW50ZXJlc3QgdG8gdGhlIFB5dGhvbiBjb21tdW5pdHkuICAgU1dJRyBpcyBwcmltYXJpbHkgY29uY2VybmVkIHdpdGggYWNjZXNzaW5nIEMrKyBmcm9tIFB5dGhvbi4gICBSZWFkZXJzIHdobyBhcmUgaW50ZXJlc3RlZCBpbiBtb3JlIHRoYW4gdGhpcyAoYW5kIHRoZSBpZGVhIG9mIGFjY2Vzc2luZyBQeXRob24gY2xhc3NlcyBmcm9tIEMrKykgYXJlIGVuY291cmFnZWQgdG8gbG9vayBpbnRvIHRoZSBNRVNTIGV4dGVuc2lvbiB3aGljaCBhaW1zIHRvIHByb3ZpZGUgYSB0aWdodGVyIGludGVncmF0aW9uIGJldHdlZW4gQysrIGFuZCBQeXRob24uICBUaGUgcmVjZW50bHkgYW5ub3VuY2VkIEdSQUQgcGFja2FnZSBhbHNvIHNob3dzIG11Y2ggcHJvbWlzZSBhbmQgcHJvdmlkZXMgdmVyeSBjb21wcmVoZW5zaXZlIEMrKy9QeXRob24gaW50ZXJmYWNlLjxwPgotPGEgbmFtZT0ibjMxIj48L2E+PGgzPiBBdXRvbWF0ZWQgc2hhZG93IGNsYXNzIGdlbmVyYXRpb248L2gzPgotU1dJRyBjYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBzaGFkb3cgY2xhc3NlcyBpZiB5b3UgdXNlIHRoZSA8dHQ+LXNoYWRvdzwvdHQ+IG9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtcHl0aG9uIC1zaGFkb3cgaW50ZXJmYWNlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3aWxsIGNyZWF0ZSB0aGUgZm9sbG93aW5nIHR3byBmaWxlcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50ZXJmYWNlX3dyYXAuYwotbW9kdWxlLnB5Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBmaWxlIDx0dD5pbnRlcmZhY2Vfd3JhcC5jPC90dD4gY29udGFpbnMgdGhlIG5vcm1hbCBTV0lHIEMvQysrIHdyYXBwZXJzLiBUaGUgZmlsZSA8dHQ+bW9kdWxlLnB5PC90dD4gY29udGFpbnMgdGhlIFB5dGhvbiBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gc2hhZG93IGNsYXNzZXMuIFRoZSBuYW1lIG9mIHRoaXMgZmlsZSB3aWxsIGJlIHRoZSBzYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUgaW4gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUuPHA+Ci08cD4KLUFzc29jaWF0ZWQgd2l0aCB0aGUgdHdvIGZpbGVzIGFyZSBUV08gUHl0aG9uIG1vZHVsZXMuIFRoZSBDIG1vZHVsZSBgPHR0Pm1vZHVsZWM8L3R0PicgY29udGFpbnMgdGhlIGxvdy1sZXZlbCBDIGludGVyZmFjZSB0aGF0IHdvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIHdpdGhvdXQgdGhlIDx0dD4tc2hhZG93PC90dD4gb3B0aW9uLiBUaGUgUHl0aG9uIG1vZHVsZSBgPHR0Pm1vZHVsZTwvdHQ+JyBjb250YWlucyB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0IGFyb3VuZCB0aGUgbG93LWxldmVsIGludGVyZmFjZS4gVG8gdXNlIHRoZSBtb2R1bGUsIHNpbXBseSB1c2UgYDx0dD5pbXBvcnQgbW9kdWxlPC90dD4nLiBGb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgdGhlIGA8dHQ+bW9kdWxlYzwvdHQ+JyBtb2R1bGUgaXMgY29tcGxldGVseSBoaWRkZW4gYWx0aG91Z2ggeW91IGNhbiBjZXJ0YWlubHkgdXNlIGl0IGlmIHlvdSB3YW50IHRvLjxwPgotPGEgbmFtZT0ibjMyIj48L2E+PGgzPiBDb21waWxpbmcgbW9kdWxlcyB3aXRoIHNoYWRvdyBjbGFzc2VzPC9oMz4KLVRvIGNvbXBpbGUgYSBtb2R1bGUgaW52b2x2aW5nIHNoYWRvdyBjbGFzc2VzLCB5b3UgY2FuIHVzZSB0aGUgc2FtZSBwcm9jZWR1cmUgYXMgYmVmb3JlIGV4Y2VwdCB0aGF0IHRoZSBtb2R1bGUgbmFtZSBub3cgaGFzIGFuIGV4dHJhIGA8dHQ+YzwvdHQ+JyBhcHBlbmRlZCB0byB0aGUgbmFtZS4gVGh1cywgYW4gaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotLi4uIGEgYnVuY2ggb2YgZGVjbGFyYXRpb25zIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1taWdodCBiZSBjb21waWxlZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLXB5dGhvbiAtc2hhZG93IGV4YW1wbGUuaQotJSBnY2MgLWMgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjEuNCBcCi0JLUkvdXNyL2xvY2FsL2xpYi9weXRob24xLjQvY29uZmlnIC1ESEFWRV9DT05GSUdfSAotJSBsZCAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlY21vZHVsZS5zbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3RpY2UgdGhlIG5hbWluZyBvZiBgPHR0PmV4YW1wbGVjbW9kdWxlLnNvPC90dD4nIGFzIG9wcG9zZWQgdG8gYDx0dD5leGFtcGxlbW9kdWxlLnNvPC90dD4nIHRoYXQgd291bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aG91dCBzaGFkb3cgY2xhc3Nlcy48cD4KLTxwPgotV2hlbiB1c2luZyBzdGF0aWMgbGlua2luZywgbm8gY2hhbmdlcyBuZWVkIHRvIGJlIG1hZGUgdG8gdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IFdoZXJlIHRvIGdvIGZvciBtb3JlIGluZm9ybWF0aW9uPC9oMz4KLVNoYWRvdyBjbGFzc2VzIHR1cm4gb3V0IHRvIGJlIHNvIHVzZWZ1bCB0aGF0IHRoZXkgYXJlIHVzZWQgYWxtb3N0IGFsbCBvZiB0aGUgdGltZSB3aXRoIFNXSUcuIEFsbCBvZiB0aGUgZXhhbXBsZXMgcHJlc2VudGVkIGhlcmUgd2lsbCBhc3N1bWUgdGhhdCBzaGFkb3cgY2xhc3NlcyBoYXZlIGJlZW4gZW5hYmxlZC4gVGhlIHByZWNpc2UgaW1wbGVtZW50YXRpb24gb2Ygc2hhZG93IGNsYXNzZXMgaXMgZGVzY3JpYmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBjaGFwdGVyIGFuZCBpcyBub3QgbmVjZXNzYXJ5ICB0byBlZmZlY3RpdmVseSB1c2UgU1dJRy48cD4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBBYm91dCB0aGUgRXhhbXBsZXM8L2gyPgotVGhlIG5leHQgZmV3IHNlY3Rpb25zIHdpbGwgZ28gdGhyb3VnaCBhIHNlcmllcyBvZiBQeXRob24gZXhhbXBsZXMgb2YgdmFyeWluZyBjb21wbGV4aXR5LiBUaGVzZSBleGFtcGxlcyBhcmUgZGVzaWduZWQgdG8gaWxsdXN0cmF0ZSBob3cgU1dJRyBjYW4gYmUgdXNlZCB0byBpbnRlZ3JhdGUgQy9DKysgYW5kIFB5dGhvbiBpbiBhIHZhcmlldHkgb2Ygd2F5cy4gU29tZSBvZiB0aGUgdGhpbmdzIHRoYXQgd2lsbCBiZSBjb3ZlcmVkIGluY2x1ZGUgOjxwPgotPHA+Ci08dWw+Ci08bGk+Q29udHJvbGxpbmcgYSBzaW1wbGUgQysrIHByb2dyYW0gd2l0aCBQeXRob24KLTxsaT5XcmFwcGluZyBhIEMgbGlicmFyeS4KLTxsaT5BZGRpbmcgUHl0aG9uIG1ldGhvZHMgdG8gZXhpc3RpbmcgQysrIGNsYXNzZXMKLTxsaT5BY2Nlc3NpbmcgYXJyYXlzIGFuZCBvdGhlciBjb21tb24gZGF0YSBzdHJ1Y3R1cmVzLgotPGxpPkJ1aWxkaW5nIHJldXNhYmxlIGNvbXBvbmVudHMuCi08bGk+V3JpdGluZyBDL0MrKyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gUHl0aG9uLgotPC91bD4KLTxhIG5hbWU9Im42Ij48L2E+PGgyPiBTb2x2aW5nIGEgc2ltcGxlIGhlYXQtZXF1YXRpb248L2gyPgotSW4gdGhpcyBleGFtcGxlLCB3ZSB3aWxsIHNob3cgaG93IFB5dGhvbiBjYW4gYmUgdXNlZCB0byBjb250cm9sIGEgc2ltcGxlIHBoeXNpY3MgYXBwbGljYXRpb24tLWluIHRoaXMgY2FzZSwgc29tZSBDKysgY29kZSBmb3Igc29sdmluZyBhIDJEIGhlYXQgZXF1YXRpb24uICBUaGlzIGV4YW1wbGUgaXMgcHJvYmFibHkgb3Zlcmx5IHNpbXBsaXN0aWMsIGJ1dCBob3BlZnVsbHkgaXQncyBlbm91Z2ggdG8gZ2l2ZSB5b3Ugc29tZSBpZGVhcy48cD4KLTxhIG5hbWU9Im4zNCI+PC9hPjxoMz4gVGhlIEMrKyBjb2RlIDwvaDM+Ci1PdXIgc2ltcGxlIGFwcGxpY2F0aW9uIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGZpbGVzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBGaWxlIDogcGRlLmgKLS8vIEhlYWRlciBmaWxlIGZvciBIZWF0IGVxdWF0aW9uIHNvbHZlcgotCi0jaW5jbHVkZSAmbHQ7bWF0aC5oJmd0OwotI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7Ci0KLS8vIEEgc2ltcGxlIDJEIEdyaWQgc3RydWN0dXJlIAotCi0vLyBBIHNpbXBsZSBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgYSAyRCBncmlkIG9mIHZhbHVlcwotc3RydWN0IEdyaWQyZCB7Ci0gIEdyaWQyZChpbnQgbmksIGludCBuaik7Ci0gIH5HcmlkMmQoKTsKLSAgZG91YmxlICoqZGF0YTsKLSAgaW50ICAgICAgeHBvaW50czsKLSAgaW50ICAgICAgeXBvaW50czsKLX07Ci0KLS8vIFNpbXBsZSBjbGFzcyBmb3Igc29sdmluZyBhIGhlYXQgZXF1YXRpb24gKi8KLWNsYXNzIEhlYXQyZCB7Ci1wcml2YXRlOgotICBHcmlkMmQgICAgKndvcms7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlbXBvcmFyeSBncmlkLCBuZWVkZWQgZm9yIHNvbHZlcgotICBkb3VibGUgICAgaCxrOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdyaWQgc3BhY2luZwotcHVibGljOiAgICAKLSAgSGVhdDJkKGludCBuaSwgaW50IG5qKTsgCi0gIH5IZWF0MmQoKTsKLSAgR3JpZDJkICAgICpncmlkOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhCi0gIGRvdWJsZSAgICAgZHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGltZXN0ZXAKLSAgZG91YmxlICAgICB0aW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbGFwc2VkIHRpbWUKLSAgdm9pZCAgICAgICBzb2x2ZShpbnQgbnN0ZXBzKTsgICAgICAgICAgICAvLyBSdW4gZm9yIG5zdGVwcwotICB2b2lkICAgICAgIHNldF90ZW1wKGRvdWJsZSB0ZW1wKTsgICAgICAgIC8vIFNldCB0ZW1wZXJhdHVyZQotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIHN1cHBvcnRpbmcgQysrIGNvZGUgaW1wbGVtZW50cyBhIHNpbXBsZSBwYXJ0aWFsIGRpZmZlcmVudGlhbCBlcXVhdGlvbiBzb2x2ZXIgYW5kIHNvbWUgb3BlcmF0aW9ucyBvbiB0aGUgZ3JpZCBkYXRhIHN0cnVjdHVyZS4gICBUaGUgcHJlY2lzZSBpbXBsZW1lbnRhdGlvbiBpc24ndCBpbXBvcnRhbnQgaGVyZSwgYnV0IGFsbCBvZiB0aGUgY29kZSBjYW4gYmUgZm91bmQgaW4gdGhlICI8dHQ+RXhhbXBsZXMvcHl0aG9uL21hbnVhbCIgPC90dD5kaXJlY3Rvcnkgb2YgdGhlIFNXSUcgZGlzdHJpYnV0aW9uLiA8cD4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gTWFraW5nIGEgcXVpY2sgYW5kIGRpcnR5IFB5dGhvbiBtb2R1bGU8L2gzPgotR2l2ZW4gb3VyIHNpbXBsZSBhcHBsaWNhdGlvbiwgbWFraW5nIGEgUHl0aG9uIG1vZHVsZSBpcyBlYXN5LiAgU2ltcGx5IHVzZSB0aGUgZm9sbG93aW5nIFNXSUcgaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEZpbGUgOiBwZGUuaQotJW1vZHVsZSBwZGUKLSV7Ci0jaW5jbHVkZSAicGRlLmgiCi0lfQotCi0laW5jbHVkZSBwZGUuaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TaW5jZSA8dHQ+cGRlLmg8L3R0PiBpcyBmYWlybHkgc2ltcGxlLCB3ZSBjYW4gc2ltcGx5IGluY2x1ZGUgaXQgZGlyZWN0bHkgaW50byBvdXIgaW50ZXJmYWNlIGZpbGUgdXNpbmcgPHR0PiVpbmNsdWRlPC90dD4uICBIb3dldmVyLCB3ZSBhbHNvIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGFsc28gaW5jbHVkZSBpdCBpbiB0aGUgPHR0PiV7LCV9PC90dD4gYmxvY2stLW90aGVyd2lzZSB3ZSdsbCBnZXQgYSBodWdlIG51bWJlciBvZiBjb21waWxlciBlcnJvcnMgd2hlbiB3ZSBjb21waWxlIHRoZSByZXN1bHRpbmcgd3JhcHBlciBmaWxlLiAgPHA+Ci08cD4KLVRvIGJ1aWxkIHRoZSBtb2R1bGUgc2ltcGx5IHJ1biBTV0lHIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtcHl0aG9uIC1zaGFkb3cgcGRlLmkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotYW5kIGNvbXBpbGUgdXNpbmcgdGhlIHRlY2huaXF1ZXMgZGVzY3JpYmVkIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBjaGFwdGVyLjxwPgotPGEgbmFtZT0ibjM2Ij48L2E+PGgzPiBVc2luZyAgb3VyIG5ldyBtb2R1bGU8L2gzPgotV2UgYXJlIG5vdyByZWFkeSB0byB1c2Ugb3VyIG5ldyBtb2R1bGUuICAgVG8gZG8gdGhpcywgd2UgY2FuIHNpbXBseSB3cml0ZSBhIFB5dGhvbiBzY3JpcHQgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIEEgZmFpcmx5IHVuaW50ZXJlc3RpbmcgZXhhbXBsZQotCi1mcm9tIHBkZSBpbXBvcnQgKgotCi1oID0gSGVhdDJkKDUwLDUwKSAgICAgICAgICAjIENyZWF0ZXMgYSBuZXcgInByb2JsZW0iCi0KLWguc2V0X3RlbXAoMS4wKQotcHJpbnQgIkR0ID0gIiwgaC5kdAotCi0jIFNvbHZlIHNvbWV0aGluZwotCi1mb3IgaSBpbiByYW5nZSgwLDI1KToJCi0JaC5zb2x2ZSgxMDApCi0JcHJpbnQgInRpbWUgPSAiLCBoLnRpbWUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIHJ1biwgd2UgZ2V0IHJhdGhlciBleGNpdGluZyBvdXRwdXQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1EdCA9ICAyLjVlLTA1Ci10aW1lID0gIDAuMDAyNQotdGltZSA9ICAwLjAwNQotdGltZSA9ICAwLjAwNzUKLS4uLgotdGltZSA9ICAwLjA2Ci10aW1lID0gIDAuMDYyNQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0ob2theSwgaXQncyBub3QgdGhhdCBleGNpdGluZy0td2VsbCwgbWF5YmUgaXQgaXMgaWYgeW91IGRvbid0IGdldCBvdXQgbXVjaCkuPHA+Ci08cD4KLVdoaWxlIHRoaXMgaGFzIG9ubHkgYmVlbiBhIHNpbXBsZSBleGFtcGxlIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgd2UgY291bGQgaGF2ZSBqdXN0IGFzIGVhc2lseSB3cml0dGVuIHRoZSBzYW1lIHRoaW5nIGluIEMrKy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFB5dGhvbiBleGFtcGxlIHdyaXR0ZW4gaW4gQysrCi0KLSNpbmNsdWRlICJwZGUuaCIKLSNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQotICBIZWF0MmQgKmg7Ci0KLSAgaCA9IG5ldyBIZWF0MmQoNTAsNTApOwotICBwcmludGYoIkR0ID0gJWdcbiIsIGgtJmd0O2R0KTsKLSAgCi0gIGgtJmd0O3NldF90ZW1wKDEuMCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyAyNTsgaSsrKSB7Ci0gICAgaC0mZ3Q7c29sdmUoMTAwKTsKLSAgICBwcmludGYoInRpbWUgPSAlZ1xuIiwgaC0mZ3Q7dGltZSk7Ci0gIH0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRm9yIHRoZSBtb3N0IHBhcnQsIHRoZSBjb2RlIGxvb2tzIGlkZW50aWNhbCAoYWx0aG91Z2ggdGhlIFB5dGhvbiB2ZXJzaW9uIGlzIHNpbXBsZXIpLiAgQXMgZm9yIHBlcmZvcm1hbmNlLCB0aGUgUHl0aG9uIHZlcnNpb24gcnVucyBsZXNzIHRoYW4gMSUgc2xvd2VyIHRoYW4gdGhlIEMrKyB2ZXJzaW9uIG9uIG15IG1hY2hpbmUuICBHaXZlbiB0aGF0IG1vc3Qgb2YgdGhlIGNvbXB1dGF0aW9uYWwgd29yayBpcyB3cml0dGVuIGluIEMrKywgdGhlcmUgaXMgdmVyeSBsaXR0bGUgcGVyZm9ybWFuY2UgcGVuYWx0eSBmb3Igd3JpdGluZyB0aGUgb3V0ZXIgbG9vcCBvZiBvdXIgY2FsY3VsYXRpb24gaW4gUHl0aG9uIGluIHRoaXMgY2FzZS48cD4KLTxwPgotVW5mb3J0dW5hdGVseSwgb3VyIFB5dGhvbiB2ZXJzaW9uIHN1ZmZlcnMgYSBudW1iZXIgb2YgZHJhd2JhY2tzLiAgTW9zdCBub3RhYmx5LCB0aGVyZSBpcyBubyB3YXkgZm9yIHVzIHRvIGFjY2VzcyBhbnkgb2YgdGhlIGdyaWQgZGF0YSAod2hpY2ggaXMgZWFzaWx5IGFjY29tcGxpc2hlZCBpbiBDKyspLiBIb3dldmVyLCB0aGVyZSBhcmUgd2F5cyB0byBmaXggdGhpcyA6PHA+Ci08YSBuYW1lPSJuMzciPjwvYT48aDM+IEFjY2Vzc2luZyBhcnJheSBkYXRhPC9oMz4KLUxldCdzIG1vZGlmeSBvdXIgaGVhdCBlcXVhdGlvbiBwcm9ibGVtIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBncmlkIGRhdGEgZGlyZWN0bHkgZnJvbSBQeXRob24uICAgVGhpcyBjYW4gYmUgZG9uZSBieSBtb2RpZnlpbmcgb3VyIGludGVyZmFjZSBmaWxlIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSVtb2R1bGUgcGRlCi0lewotI2luY2x1ZGUgInBkZS5oIgotJX0KLQotJWluY2x1ZGUgcGRlLmgKLQotLy8gQWRkIGEgZmV3ICJoZWxwZXIiIGZ1bmN0aW9ucyB0byBleHRyYWN0IGdyaWQgZGF0YSAKLSVpbmxpbmUgJXsKLWRvdWJsZSAgR3JpZDJkX2dldChHcmlkMmQgKmcsIGludCBpLCBpbnQgaikgewotICAgICAgcmV0dXJuIGctJmd0O2RhdGFbaV1bal07Ci19Ci12b2lkICAgIEdyaWQyZF9zZXQoR3JpZDJkICpnLCBpbnQgaSwgaW50IGosIGRvdWJsZSB2YWwpIHsKLSAgICAgIGctJmd0O2RhdGFbaV1bal0gPSB2YWw7Ci19Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1SYXRoZXIgdGhhbiBtb2RpZnlpbmcgb3VyIEMrKyBjb2RlLCBpdCBpcyBlYXN5IGVub3VnaCB0byBzdXBwbHkgYSBmZXcgYWNjZXNzb3IgZnVuY3Rpb25zIGRpcmVjdGx5IGluIG91ciBpbnRlcmZhY2UgZmlsZS4gIFRoZXNlIGZ1bmN0aW9uIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBQeXRob24gc28gdGhpcyBhcHByb2FjaCBtYWtlcyBzZW5zZSBhbmQgaXQgaGVscHMgdXMga2VlcCBvdXIgQysrIGNvZGUgZnJlZSBmcm9tIHVubmVjZXNzYXJ5IGNsdXR0ZXIuICAgVGhlIDx0dD4laW5saW5lPC90dD4gZGlyZWN0aXZlIGlzIGEgY29udmVuaWVudCBtZXRob2QgZm9yIGFkZGluZyBoZWxwZXIgZnVuY3Rpb25zIHNpbmNlIHRoZSBmdW5jdGlvbnMgeW91IGRlY2xhcmUgc2hvdyB1cCBpbiB0aGUgaW50ZXJmYWNlIGF1dG9tYXRpY2FsbHkuPHA+Ci08cD4KLVdlIGNhbiBub3cgdXNlIG91ciBhY2Nlc3NvciBmdW5jdGlvbnMgdG8gd3JpdGUgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgUHl0aG9uIHNjcmlwdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBBbiBleGFtcGxlIHVzaW5nIG91ciBzZXQvZ2V0IGZ1bmN0aW9ucwotCi1mcm9tIHBkZSBpbXBvcnQgKgotCi0jIFNldCB1cCBhbiBpbml0aWFsIGNvbmRpdGlvbgotZGVmIGluaXRjb25kKGgpOgotCWguc2V0X3RlbXAoMC4wKQotCW54ID0gaC5ncmlkLnhwb2ludHMKLQlmb3IgaSBpbiByYW5nZSgwLG54KToKLQkJR3JpZDJkX3NldChoLmdyaWQsaSwwLDEuMCkgICAgICAgICAgICAgICAgICAgICAgICAjIFNldCBncmlkIHZhbHVlcwotCi0jIER1bXAgb3V0IHRvIGEgZmlsZQotZGVmIGR1bXAoaCxmaWxlbmFtZSk6Ci0JZiA9IG9wZW4oZmlsZW5hbWUsInciKQotCW54ID0gaC5ncmlkLnhwb2ludHMKLQlueSA9IGguZ3JpZC55cG9pbnRzCi0JZm9yIGkgaW4gcmFuZ2UoMCxueCk6Ci0JCWZvciBqIGluIHJhbmdlKDAsbnkpOgotCQkJZi53cml0ZShzdHIoR3JpZDJkX2dldChoLmdyaWQsaSxqKSkrIlxuIikgICMgR2V0IGdyaWQgdmFsdWUKLQlmLmNsb3NlKCkKLQotIyBTZXQgdXAgYSBwcm9ibGVtIGFuZCBydW4gaXQKLQotaCA9IEhlYXQyZCg1MCw1MCkKLWluaXRjb25kKGgpCi1maWxlbm8gPSAxCi1mb3IgaSBpbiByYW5nZSgwLDI1KToKLQloLnNvbHZlKDEwMCkKLQlkdW1wKGgsIkRhdCIrc3RyKGZpbGVubykpCi0JcHJpbnQgInRpbWUgPSAiLCBoLnRpbWUKLQlmaWxlbm8gPSBmaWxlbm8rMQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdlIG5vdyBoYXZlIGEgUHl0aG9uIHNjcmlwdCB0aGF0IGNhbiBjcmVhdGUgYSBncmlkLCBzZXQgdXAgYW4gaW5pdGlhbCBjb25kaXRpb24sIHJ1biBhIHNpbXVsYXRpb24sIGFuZCBkdW1wIGEgY29sbGVjdGlvbiBvZiBkYXRhZmlsZXMuICBTbywgd2l0aCBqdXN0IGEgbGl0dGxlIHN1cHBvcnRpbmcgY29kZSBpbiBvdXIgaW50ZXJmYWNlIGZpbGUsIHdlIGNhbiBzdGFydCB0byBkbyB1c2VmdWwgd29yayBmcm9tIFB5dGhvbi4gIDxwPgotPGEgbmFtZT0ibjM4Ij48L2E+PGgzPiBVc2UgUHl0aG9uIGZvciBjb250cm9sLCBDIGZvciBwZXJmb3JtYW5jZTwvaDM+Ci1Ob3cgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3MgZ3JpZCBkYXRhIGZyb20gUHl0aG9uLCBpdCBpcyBwb3NzaWJsZSB0byBxdWlja2x5IHdyaXRlIGNvZGUgZm9yIGFsbCBzb3J0cyBvZiBvcGVyYXRpb25zLiAgIEhvd2V2ZXIsIFB5dGhvbiBtYXkgbm90IHByb3ZpZGUgZW5vdWdoIHBlcmZvcm1hbmNlIGZvciBjZXJ0YWluIG9wZXJhdGlvbnMuICBGb3IgZXhhbXBsZSwgdGhlIDx0dD5kdW1wKCk8L3R0PiBmdW5jdGlvbiBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZSBtYXkgYmVjb21lIHF1aXRlIHNsb3cgYXMgcHJvYmxlbSBzaXplcyBpbmNyZWFzZS4gICBUaHVzLCB3ZSBtaWdodCBjb25zaWRlciB3cml0aW5nIGl0IGluIEMrKyBzdWNoIGFzIHRoZSBmb2xsb3dzOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZHVtcChIZWF0MmQgKmgsIGNoYXIgKmZpbGVuYW1lKSB7Ci0gICAgICBGSUxFICpmOwotICAgICAgaW50ICAgaSxqOwotCi0gICAgICBmID0gZm9wZW4oZmlsZW5hbWUsInciKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgJmx0OyBoLSZndDtncmlkLSZndDt4cG9pbnRzOyBpKyspCi0JZm9yIChqID0gMDsgaiAmbHQ7IGgtJmd0O2dyaWQtJmd0O3lwb2ludHM7IGorKykKLQkgIGZwcmludGYoZiwiJTAuMTdmXG4iLGgtJmd0O2dyaWQtJmd0O2RhdGFbaV1bal0pOwotICAgICAgZmNsb3NlKGYpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UbyB1c2UgdGhpcyBuZXcgZnVuY3Rpb24sIHNpbXBsZSBwdXQgaXRzIGRlY2xhcmF0aW9uIGluIHRoZSBTV0lHIGludGVyZmFjZSBmaWxlIGFuZCBnZXQgcmlkIG9mIHRoZSBvbGQgUHl0aG9uIHZlcnNpb24uICBUaGUgUHl0aG9uIHNjcmlwdCB3b24ndCBrbm93IHRoYXQgeW91IGNoYW5nZWQgdGhlIGltcGxlbWVudGF0aW9uLjxwPgotPGEgbmFtZT0ibjM5Ij48L2E+PGgzPiBHZXR0aW5nIGV2ZW4gbW9yZSBzZXJpb3VzIGFib3V0IGFycmF5IGFjY2VzczwvaDM+Ci1XZSBoYXZlIHByb3ZpZGVkIGFjY2VzcyB0byBncmlkIGRhdGEgdXNpbmcgYSBwYWlyIG9mIGdldC9zZXQgZnVuY3Rpb25zLiAgSG93ZXZlciwgdXNpbmcgdGhlc2UgZnVuY3Rpb25zIGlzIGEgbGl0dGxlIGNsdW1zeSBiZWNhdXNlIHRoZXkgYWx3YXlzIGhhdmUgdG8gYmUgY2FsbGVkIGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5HcmlkMmRfc2V0KGdyaWQsaSxqLDEuMCkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSXQgbWlnaHQgbWFrZSBtb3JlIHNlbnNlIHRvIG1ha2UgdGhlIGdldC9zZXQgZnVuY3Rpb25zIGFwcGVhciBsaWtlICBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoZSA8dHQ+R3JpZDJEPC90dD4gY2xhc3MuICAgVGhhdCB3YXkgd2UgY291bGQgdXNlIHRoZW0gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5ncmlkLnNldChpLGosMS4wKQotZ3JpZC5nZXQoaSxqKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TV0lHIHByb3ZpZGVzIGEgc2ltcGxlIHRlY2huaXF1ZSBmb3IgZG9pbmcgdGhpcyBhcyBpbGx1c3RyYXRlZCBpbiB0aGUgZm9sbG93aW5nIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHBkZQotJXsKLSNpbmNsdWRlICJwZGUuaCIKLSV9Ci0laW5jbHVkZSBwZGUuaAotCi0vLyBBZGQgYSBmZXcgImhlbHBlciIgZnVuY3Rpb25zIHRvIGV4dHJhY3QgZ3JpZCBkYXRhIAotJXsKLSAgICBkb3VibGUgIEdyaWQyZF9nZXQoR3JpZDJkICpnLCBpbnQgaSwgaW50IGopIHsKLSAgICAgIHJldHVybiBnLSZndDtkYXRhW2ldW2pdOwotICAgIH0KLSAgICB2b2lkICAgIEdyaWQyZF9zZXQoR3JpZDJkICpnLCBpbnQgaSwgaW50IGosIGRvdWJsZSB2YWwpIHsKLSAgICAgIGctJmd0O2RhdGFbaV1bal0gPSB2YWw7Ci0gICAgfQotJX0KLQotLy8gTm93IGFkZCB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGFzIG1ldGhvZHMgb2YgR3JpZDJkCi0KLSVhZGRtZXRob2RzIEdyaWQyZCB7Ci0gICAgZG91YmxlIGdldChpbnQgaSwgaW50IGopOyAgICAgICAgICAgICAgLy8gR2V0cyBleHBhbmRlZCB0byBHcmlkMmRfZ2V0KCkKLSAgICB2b2lkICAgc2V0KGludCBpLCBpbnQgaiwgZG91YmxlIHZhbCk7ICAvLyBHZXRzIGV4cGFuZGVkIHRvIEdyaWQyZF9zZXQoKQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgPHR0PiVhZGRtZXRob2RzPC90dD4gZGlyZWN0aXZlIHRlbGxzIFNXSUcgdGhhdCB5b3Ugd2FudCB0byBhZGQgbmV3IGZ1bmN0aW9ucyB0byBhbiBleGlzdGluZyBDKysgY2xhc3Mgb3IgQyBzdHJ1Y3R1cmUgZm9yIHRoZSBwdXJwb3NlcyBvZiBidWlsZGluZyBhbiBpbnRlcmZhY2UuICAgSW4gcmVhbGl0eSwgU1dJRyBsZWF2ZXMgdGhlIG9yaWdpbmFsIEMrKyBjbGFzcyB1bmNoYW5nZWQsIGJ1dCB0aGUgcmVzdWx0aW5nIFB5dGhvbiBpbnRlcmZhY2Ugd2lsbCBoYXZlIHNvbWUgbmV3IGZ1bmN0aW9ucyB0aGF0IGFwcGVhciB0byBiZSBjbGFzcyBtZW1iZXJzLjxwPgotPHA+Ci1TV0lHIHVzZXMgYSBuYW1pbmcgY29udmVudGlvbiBmb3IgYWRkaW5nIG1ldGhvZHMgdG8gYSBjbGFzcy4gIElmIHlvdSBoYXZlIGEgY2xhc3MgPHR0PkZvbzwvdHQ+IGFuZCB5b3UgYWRkIGEgbWVtYmVyIGZ1bmN0aW9uIDx0dD5iYXIoYXJncyksPC90dD4gU1dJRyB3aWxsIGxvb2sgZm9yIGEgZnVuY3Rpb24gY2FsbGVkIDx0dD5Gb29fYmFyKHRoaXMsYXJncyk8L3R0PiB0aGF0IGltcGxlbWVudHMgdGhlIGRlc2lyZWQgZnVuY3Rpb25hbGl0eS4gICBZb3UgY2FuIHdyaXRlIHRoaXMgZnVuY3Rpb24geW91cnNlbGYsIGFzIGluIHRoZSBwcmV2aW91cyBpbnRlcmZhY2UgZmlsZSwgYnV0IHlvdSBjYW4gYWxzbyBqdXN0IHN1cHBseSB0aGUgY29kZSBpbW1lZGlhdGVseSBhZnRlciBhIGRlY2xhcmF0aW9uIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBwZGUKLSV7Ci0jaW5jbHVkZSAicGRlLmgiCi0lfQotJWluY2x1ZGUgcGRlLmgKLQotLy8gQWRkIHNvbWUgbmV3IGFjY2Vzc29yIG1ldGhvZHMgdG8gdGhlIEdyaWQyRCBjbGFzcwotJWFkZG1ldGhvZHMgR3JpZDJkIHsKLSAgZG91YmxlIGdldChpbnQgaSwgaW50IGopIHsKLSAgICByZXR1cm4gc2VsZi0mZ3Q7ZGF0YVtpXVtqXTsKLSAgfTsKLSAgdm9pZCBzZXQoaW50IGksIGludCBqLCBkb3VibGUgdmFsKSB7Ci0gICAgc2VsZi0mZ3Q7ZGF0YVtpXVtqXSA9IHZhbDsKLSAgfTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSW4gdGhpcyBjYXNlLCBTV0lHIHdpbGwgdGFrZSB0aGUgc3VwcGxpZWQgY29kZSwgYW5kIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBmdW5jdGlvbiBmb3IgdGhlIG1ldGhvZC4gIFRoZSBzcGVjaWFsIHZhcmlhYmxlICI8dHQ+c2VsZjwvdHQ+IiBpcyB1c2VkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdC4gIFRoZSA8dHQ+c2VsZiA8L3R0PnBvaW50ZXIgaXMgZXhhY3RseSBsaWtlIHRoZSBDKysgIjx0dD50aGlzPC90dD4iIHBvaW50ZXIsIGV4Y2VwdCB0aGF0IHRoZSBuYW1lIGhhcyBiZWVuIGNoYW5nZWQgaW4gb3JkZXIgdG8gcmVtaW5kIHlvdSB0aGF0IHlvdSBhcmVuJ3QgcmVhbGx5IHdyaXRpbmcgYSByZWFsIGNsYXNzIG1lbWJlciBmdW5jdGlvbi4gIChBY3R1YWxseSwgdGhlIHJlYWwgcmVhc29uIHdlIGNhbid0IHVzZSAidGhpcyIgaXMgYmVjYXVzZSB0aGUgQysrIGNvbXBpbGVyIHdpbGwgc3RhcnQgY29tcGxhaW5pbmchKTxwPgotPHA+Ci0gRmluYWxseSwgaXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSBtYXkgYWxzbyBiZSB1c2VkIGluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zdHJ1Y3QgR3JpZDJkIHsKLSAgR3JpZDJkKGludCBuaSwgaW50IG5qKTsKLSAgfkdyaWQyZCgpOwotICBkb3VibGUgKipkYXRhOwotICBpbnQgICAgICB4cG9pbnRzOwotICBpbnQgICAgICB5cG9pbnRzOwotICAlYWRkbWV0aG9kcyB7Ci0JZG91YmxlIGdldChpbnQgaSwgaW50IGopOwotCXZvaWQgICBzZXQoaW50IGksIGludCBqLCBkb3VibGUgdmFsdWUpOwotICB9Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGxhdHRlciBjYXNlIGlzIHJlYWxseSBvbmx5IHVzZWZ1bCBpZiB0aGUgQysrIGNsYXNzIGRlZmluaXRpb24gaXMgaW5jbHVkZWQgaW4gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgaXRzZWxmLiAgIElmIHlvdSBhcmUgcHVsbGluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBvdXQgb2YgYSBzZXBhcmF0ZSBmaWxlIG9yIGEgQysrIGhlYWRlciBmaWxlLCB1c2luZyBhIHNlcGFyYXRlIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSBpcyBwcmVmZXJhYmxlLiAgSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSBhcHBlYXJzIGJlZm9yZSBvciBhZnRlciB0aGUgcmVhbCBjbGFzcyBkZWZpbml0aW9uLS1TV0lHIHdpbGwgY29ycmVjdGx5IGFzc29jaWF0ZSB0aGUgdHdvIGRlZmluaXRpb25zLjxwPgotPHA+Ci1Pa2F5LCBlbm91Z2ggdGFsay4gIEJ5IGFkZGluZyB0aGUgc2V0L2dldCBmdW5jdGlvbnMgYXMgbWV0aG9kcywgd2UgY2FuIG5vdyBjaGFuZ2Ugb3VyIFB5dGhvbiBzY3JpcHQgdG8gbG9vayBsaWtlIHRoaXMgKGNoYW5nZXMgYXJlIHVuZGVybGluZWQpIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIEFuIGV4YW1wbGUgdXNpbmcgb3VyIG5ldyBzZXQvZ2V0IGZ1bmN0aW9ucwotCi1mcm9tIHBkZSBpbXBvcnQgKgotCi0jIFNldCB1cCBhbiBpbml0aWFsIGNvbmRpdGlvbgotCi1kZWYgaW5pdGNvbmQoaCk6Ci0JaC5zZXRfdGVtcCgwLjApCi0JbnggPSBoLmdyaWQueHBvaW50cwotCWZvciBpIGluIHJhbmdlKDAsbngpOgotCQloLmdyaWQuc2V0KGksMCwxLjApICAgICAgICAgIyBOb3RlIGNoYW5nZWQgaW50ZXJmYWNlCi0KLSMgRHVtcCBvdXQgdG8gYSBmaWxlCi1kZWYgZHVtcChoLGZpbGVuYW1lKToKLQlmID0gb3BlbihmaWxlbmFtZSwidyIpCi0JbnggPSBoLmdyaWQueHBvaW50cwotCW55ID0gaC5ncmlkLnlwb2ludHMKLQlmb3IgaSBpbiByYW5nZSgwLG54KToKLQkJZm9yIGogaW4gcmFuZ2UoMCxueSk6Ci0JCQlmLndyaXRlKHN0cihoLmdyaWQuZ2V0KGksaikpKyJcbiIpCi0JZi5jbG9zZSgpCi0KLSMgU2V0IHVwIGEgcHJvYmxlbSBhbmQgcnVuIGl0Ci0KLWggPSBIZWF0MmQoNTAsNTApCi1pbml0Y29uZChoKQotZmlsZW5vID0gMQotCi1mb3IgaSBpbiByYW5nZSgwLDI1KToKLQloLnNvbHZlKDEwMCkKLQloLmR1bXAoIkRhdCIrc3RyKGZpbGVubykpCi0JcHJpbnQgInRpbWUgPSAiLCBoLnRpbWUKLQlmaWxlbm8gPSBmaWxlbm8rMQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU5vdyBpdCdzIHN0YXJ0aW5nIHRvIGxvb2sgYSBsaXR0bGUgYmV0dGVyLCBidXQgd2UgY2FuIGRvIGV2ZW4gYmV0dGVyLi4uPHA+Ci08YSBuYW1lPSJuNDAiPjwvYT48aDM+IEltcGxlbWVudGluZyBzcGVjaWFsIFB5dGhvbiBtZXRob2RzIGluIEM8L2gzPgotTm93IHRoYXQgeW91J3JlIGdldHRpbmcgaW50byB0aGUgc3Bpcml0IG9mIHRoaW5ncywgbGV0J3MgbWFrZSBpdCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3Mgb3VyIDx0dD5HcmlkMkQ8L3R0PiBkYXRhIGxpa2UgYSBQeXRob24gYXJyYXkuICBBcyBpdCB0dXJucyBvdXQsIHdlIGNhbiBkbyB0aGlzIHdpdGggYSBsaXR0bGUgdHJpY2tlcnkgaW4gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUuICBEb24ndCBmb3JnZXQgdG8gcHV0IG9uIHlvdXIgUHl0aG9uIHdpemFyZCBjYXAuLi48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBTV0lHIGludGVyZmFjZSBmaWxlIHdpdGggUHl0aG9uIGFycmF5IG1ldGhvZHMgYWRkZWQKLSVtb2R1bGUgcGRlCi0lewotI2luY2x1ZGUgInBkZS5oIgotJX0KLQotJWluY2x1ZGUgcGRlLmgKLQotJWlubGluZSAlewotICAvLyBEZWZpbmUgYSBuZXcgR3JpZDJkIHJvdyBjbGFzcyAKLSAgc3RydWN0IEdyaWQyZFJvdyB7Ci0gICAgR3JpZDJkICpnOyAgICAgICAvLyBHcmlkCi0gICAgaW50ICAgIHJvdzsgICAgICAvLyBSb3cgbnVtYmVyCi0gICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGJ5IFB5dGhvbiB0byBhY2Nlc3Mgc2VxdWVuY2UgdHlwZXMgKGxpc3RzLCB0dXBsZXMsIC4uLikKLSAgICBkb3VibGUgX19nZXRpdGVtX18oaW50IGkpIHsKLSAgICAgIHJldHVybiBnLSZndDtkYXRhW3Jvd11baV07Ci0gICAgfTsKLSAgICB2b2lkIF9fc2V0aXRlbV9fKGludCBpLCBkb3VibGUgdmFsKSB7Ci0gICAgICBnLSZndDtkYXRhW3Jvd11baV0gPSB2YWw7Ci0gICAgfTsKLSAgfTsKLSV9Ci0KLS8vIE5vdyBhZGQgYSBfX2dldGl0ZW1fXyBtZXRob2QgdG8gR3JpZDJEIHRvIHJldHVybiBhIHJvdwotJWFkZG1ldGhvZHMgR3JpZDJkIHsKLSAgR3JpZDJkUm93IF9fZ2V0aXRlbV9fKGludCBpKSB7Ci0gICAgR3JpZDJkUm93IHI7Ci0gICAgci5nID0gc2VsZjsKLSAgICByLnJvdyA9IGk7Ci0gICAgcmV0dXJuIHI7Ci0gIH07Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XZSBoYXZlIG5vdyByZXBsYWNlZCBvdXIgZ2V0L3NldCBmdW5jdGlvbnMgd2l0aDx0dD4gdGhlIF9fZ2V0aXRlbV9fPC90dD4gYW5kIDx0dD5fX3NldGl0ZW1fXzwvdHQ+IGZ1bmN0aW9ucyB0aGF0IFB5dGhvbiBuZWVkcyB0byBhY2Nlc3MgYXJyYXlzLiAgV2UgaGF2ZSBhbHNvIGFkZGVkIGEgc3BlY2lhbCA8dHQ+R3JpZDJkUm93PC90dD4gY2xhc3MuICBUaGlzIGlzIG5lZWRlZCB0byBhbGxvdyB1cyB0byBtYWtlIGEgZnVubnkga2luZCBvZiAibXVsdGlkaW1lbnNpb25hbCIgYXJyYXkgaW4gUHl0aG9uICh0aGlzIG1heSB0YWtlIGEgZmV3IG1pbnV0ZXMgb2YgdGhvdWdodCB0byBmaWd1cmUgb3V0KS4gVXNpbmcgdGhpcyBuZXcgaW50ZXJmYWNlIGZpbGUsIHdlIGNhbiBub3cgd3JpdGUgYSBQeXRob24gc2NyaXB0IGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBBbiBleGFtcGxlIHNjcmlwdCB1c2luZyBvdXIgYXJyYXkgYWNjZXNzIGZ1bmN0aW9ucwotCi1mcm9tIHBkZSBpbXBvcnQgKgotCi0jIFNldCB1cCBhbiBpbml0aWFsIGNvbmRpdGlvbgotCi1kZWYgaW5pdGNvbmQoaCk6Ci0JaC5zZXRfdGVtcCgwLjApCi0JbnggPSBoLmdyaWQueHBvaW50cwotCWZvciBpIGluIHJhbmdlKDAsbngpOgotCQloLmdyaWRbaV1bMF0gPSAxLjAgICAgICAgICAgICAjIE5vdGUgbmljZSBhcnJheSBhY2Nlc3MKLQotIyBTZXQgdXAgYSBwcm9ibGVtIGFuZCBydW4gaXQKLQotaCA9IEhlYXQyZCg1MCw1MCkKLWluaXRjb25kKGgpCi1maWxlbm8gPSAxCi0KLWZvciBpIGluIHJhbmdlKDAsMjUpOgotCWguc29sdmUoMTAwKQotCWguZHVtcCgiRGF0IitzdHIoZmlsZW5vKSkKLQlwcmludCAidGltZSA9ICIsIGgudGltZQotCWZpbGVubyA9IGZpbGVubysxCi0KLSMgQ2FsY3VsYXRlIGF2ZXJhZ2UgdGVtcGVyYXR1cmUgb3ZlciB0aGUgcmVnaW9uCi0KLXN1bSA9IDAuMAotZm9yIGkgaW4gcmFuZ2UoMCxoLmdyaWQueHBvaW50cyk6Ci0JZm9yIGogaW4gcmFuZ2UoMCxoLmdyaWQueXBvaW50cyk6Ci0JCXN1bSA9IHN1bSArIGguZ3JpZFtpXVtqXSAgICAgICAgIyBOb3RlIG5pY2UgYXJyYXkgYWNjZXNzCi0KLWF2ZyA9IHN1bS8oaC5ncmlkLnhwb2ludHMqaC5ncmlkLnlwb2ludHMpCi0KLXByaW50ICJBdmcgdGVtcGVyYXR1cmUgPSAiLGF2ZwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjQxIj48L2E+PGgzPiBTdW1tYXJ5IChzbyBmYXIpPC9oMz4KLUluIG91ciBmaXJzdCBleGFtcGxlLCB3ZSBoYXZlIHRha2VuIGEgdmVyeSBzaW1wbGUgQysrIHByb2JsZW0gYW5kIHdyYXBwZWQgaXQgaW50byBhIFB5dGhvbiBtb2R1bGUuICBXaXRoIGEgbGl0dGxlIGV4dHJhIHdvcmssIHdlIGhhdmUgYmVlbiBhYmxlIHRvIHByb3ZpZGUgYXJyYXkgdHlwZSBhY2Nlc3MgdG8gb3VyIEMrKyBkYXRhIGZyb20gUHl0aG9uIGFuZCB0byB3cml0ZSBzb21lIGNvbXB1dGF0aW9uYWxseSBpbnRlbnNpdmUgb3BlcmF0aW9ucyBpbiBDKysuICAgIEF0IHRoaXMgcG9pbnQsIGl0IHdvdWxkIGVhc3kgdG8gd3JpdGUgYWxsIHNvcnRzIG9mIFB5dGhvbiBzY3JpcHRzIHRvIHNldCB1cCBwcm9ibGVtcywgcnVuIHNpbXVsYXRpb25zLCBsb29rIGF0IHRoZSBkYXRhLCBhbmQgdG8gZGVidWcgbmV3IG9wZXJhdGlvbnMgaW1wbGVtZW50ZWQgaW4gQysrLiAgIDxwPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IFdyYXBwaW5nIGEgQyBsaWJyYXJ5PC9oMj4KLUluIHRoaXMgbmV4dCBleGFtcGxlLCB3ZSBmb2N1cyBvbiB3cmFwcGluZyB0aGUgZ2QtMS4yIGxpYnJhcnkuICBnZCBpcyBwdWJsaWMgZG9tYWluIGxpYnJhcnkgZm9yIGZhc3QgR0lGIGltYWdlIGNyZWF0aW9uIHdyaXR0ZW4gYnkgVGhvbWFzIEJvdXRlbGwgYW5kIGF2YWlsYWJsZSBvbiB0aGUgaW50ZXJuZXQuICAgZ2QtMS4yIGlzIGNvcHlyaWdodCAxOTk0LDE5OTUsIFF1ZXN0IFByb3RlaW4gRGF0YWJhc2UgQ2VudGVyLCBDb2xkIFNwcmluZyBIYXJib3IgTGFicy4gIFRoaXMgZXhhbXBsZSBhc3N1bWVzIHRoYXQgeW91IGhhdmUgZ2QtMS4yIGF2YWlsYWJsZSwgYnV0IHlvdSBjYW4gdXNlIHRoZSBpZGVhcyBoZXJlIHRvIHdyYXAgb3RoZXIga2luZHMgb2YgQyBsaWJyYXJpZXMuPHA+Ci08YSBuYW1lPSJuNDIiPjwvYT48aDM+IFByZXBhcmluZyBhIG1vZHVsZTwvaDM+Ci1XcmFwcGluZyBhIEMgbGlicmFyeSBpbnRvIGEgUHl0aG9uIG1vZHVsZSB1c3VhbGx5IGludm9sdmVzIHdvcmtpbmcgd2l0aCB0aGUgQyBoZWFkZXIgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBsaWJyYXJ5LiAgSW4gc29tZSBjYXNlcywgYSBoZWFkZXIgZmlsZSBjYW4gYmUgdXNlZCBkaXJlY3RseSAod2l0aG91dCBtb2RpZmljYXRpb24pIHdpdGggU1dJRy4gIE90aGVyIHRpbWVzLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNvcHkgdGhlIGhlYWRlciBmaWxlIGludG8gYSBTV0lHIGludGVyZmFjZSBmaWxlIGFuZCBtYWtlIGEgZmV3IHRvdWNoLXVwcyBhbmQgbW9kaWZpY2F0aW9ucy4gSW4gZWl0aGVyIGNhc2UsIGl0J3MgdXN1YWxseSBub3QgdG9vIGRpZmZpY3VsdC48cD4KLTxwPgotVG8gbWFrZSBhIG1vZHVsZSwgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjaGVja2xpc3QgOjxwPgotPHA+Ci08dWw+Ci08bGk+TG9jYXRlIHRoZSBoZWFkZXIgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFja2FnZQotPGxpPkxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBoZWFkZXIgZmlsZXMgdG8gc2VlIGlmIFNXSUcgY2FuIGhhbmRsZSB0aGVtLiAgSW4gcGFydGljdWxhciwgU1dJRyBjYW4gbm90IGhhbmRsZSBleGNlc3NpdmUgdXNlIG9mIEMgcHJlcHJvY2Vzc29yIG1hY3Jvcywgb3Igbm9uLUFOU0kgQyBzeW50YXguIFRoZSBiZXN0IHdheSB0byBpZGVudGlmeSBwcm9ibGVtcyBpcyB0byBzaW1wbHkgcnVuIFNXSUcgb24gdGhlIGZpbGUgYW5kIHNlZSB3aGF0IGVycm9ycyAoaWYgYW55KSBnZXQgcmVwb3J0ZWQuCi08bGk+TWFrZSBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgZm9yIHlvdXIgbW9kdWxlIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgdGhlIGFwcHJvcHJpYXRlIGhlYWRlciBmaWxlcywgYW5kIGFueSBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gdGhhdCB5b3Ugd291bGQgbGlrZSB0byBwcm92aWRlLgotPGxpPklmIHRoZSBoZWFkZXIgZmlsZSBpcyBjbGVhbiwgc2ltcGx5IHVzZSBTV0lHJ3MgPHR0PiVpbmNsdWRlPC90dD4gZGlyZWN0aXZlLiAgSWYgbm90LCBwYXN0ZSB0aGUgaGVhZGVyIGZpbGUgaW50byB5b3VyIGludGVyZmFjZSBmaWxlIGFuZCBlZGl0IGl0IHVudGlsIFNXSUcgY2FuIGhhbmRsZSBpdC4KLTxsaT5DbGVhbiB1cCB0aGUgaW50ZXJmYWNlIGJ5IHBvc3NpYmx5IGFkZGluZyBzdXBwb3J0aW5nIGNvZGUsIGRlbGV0aW5nIHVubmVjZXNzYXJ5IGZ1bmN0aW9ucywgYW5kIGVsaW1pbmF0aW5nIGNsdXR0ZXIuCi08bGk+UnVuIFNXSUcgYW5kIGNvbXBpbGUuCi08L3VsPgotPHA+Ci1JbiB0aGUgY2FzZSBvZiB0aGUgZ2QgbGlicmFyeSwgd2UgY2FuIHNpbXBseSB1c2UgdGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdkCi0lewotI2luY2x1ZGUgImdkLmgiCi0lfQotCi0lc2VjdGlvbiAiZ2QtMS4yIixpZ25vcmUKLSVpbmNsdWRlICJnZC5oIgotCi0vLyBUaGVzZSB3aWxsIGNvbWUgaW4gaGFuZHkgbGF0ZXIKLUZJTEUgKmZvcGVuKGNoYXIgKiwgY2hhciAqKTsKLXZvaWQgZmNsb3NlKEZJTEUgKmYpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoaXMgZmlsZSwgd2UgZmlyc3QgdGVsbCBTV0lHIHRvIHB1dCBhbGwgb2YgdGhlIGdkIGZ1bmN0aW9ucyBpbiBhIHNlcGFyYXRlIGRvY3VtZW50YXRpb24gc2VjdGlvbiBhbmQgdG8gaWdub3JlIGFsbCBjb21tZW50cy4gICBUaGlzIHVzdWFsbHkgaGVscHMgY2xlYW4gdXAgdGhlIGRvY3VtZW50YXRpb24gd2hlbiB3b3JraW5nIHdpdGggcmF3IGhlYWRlciBmaWxlcy4gICBOZXh0LCB3ZSBzaW1wbHkgaW5jbHVkZSB0aGUgY29udGVudHMgb2YgImdkLmgiIGRpcmVjdGx5LiAgIEZpbmFsbHksIHdlIHByb3ZpZGUgd3JhcHBlcnMgdG8gPHR0PmZvcGVuKCk8L3R0PiBhbmQgPHR0PmZjbG9zZSgpPC90dD4gc2luY2UgdGhlc2Ugd2lsbCBjb21lIGluIGhhbmR5IGluIG91ciBQeXRob24gaW50ZXJmYWNlLjxwPgotPHA+Ci1JZiB3ZSBnaXZlIHRoaXMgaW50ZXJmYWNlIGZpbGUgdG8gU1dJRywgd2Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBvdXRwdXQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtcHl0aG9uIC1zaGFkb3cgIC1JL3Vzci9sb2NhbC9pbmNsdWRlIGdkLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFB5dGhvbgotL3Vzci9sb2NhbC9pbmNsdWRlL2dkLmggOiBMaW5lIDMyLiAgQXJyYXlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChpZ25vcmVkKS4KLS91c3IvbG9jYWwvaW5jbHVkZS9nZC5oIDogTGluZSAzMy4gIEFycmF5cyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAoaWdub3JlZCkuCi0vdXNyL2xvY2FsL2luY2x1ZGUvZ2QuaCA6IExpbmUgMzQuICBBcnJheXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKGlnbm9yZWQpLgotL3Vzci9sb2NhbC9pbmNsdWRlL2dkLmggOiBMaW5lIDM1LiAgQXJyYXlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChpZ25vcmVkKS4KLS91c3IvbG9jYWwvaW5jbHVkZS9nZC5oIDogTGluZSA0MS4gIEFycmF5cyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAoaWdub3JlZCkuCi0vdXNyL2xvY2FsL2luY2x1ZGUvZ2QuaCA6IExpbmUgNDIuICBBcnJheXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKGlnbm9yZWQpLgotJQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSBTV0lHIHdhcyBhYmxlIHRvIGhhbmRsZSBtb3N0IG9mIHRoZSBoZWFkZXIgZmlsZSwgaXQgYWxzbyByYW4gaW50byBhIGZldyB1bnN1cHBvcnRlZCBkZWNsYXJhdGlvbnMtLS1pbiB0aGlzIGNhc2UsIGEgZmV3IGRhdGEgc3RydWN0dXJlcyB3aXRoIGFycmF5IG1lbWJlcnMuICBIb3dldmVyLCB0aGUgd2FybmluZyBtZXNzYWdlcyBhbHNvIHRlbGwgdXMgdGhhdCB0aGVzZSBkZWNsYXJhdGlvbnMgaGF2ZSBzaW1wbHkgYmVlbiBpZ25vcmVkLiAgIFRodXMsIHdlIGNhbiBjaG9vc2UgdG8gY29udGludWUgYW5kIGJ1aWxkIG91ciBpbnRlcmZhY2UgYW55d2F5cy4gIEFzIGl0IHR1cm5zIG91dCBpbiB0aGlzIGNhc2UsIHRoZSBpZ25vcmVkIGRlY2xhcmF0aW9ucyBhcmUgb2YgbGl0dGxlIG9yIG5vIGNvbnNlcXVlbmNlIHNvIHdlIGNhbiBpZ25vcmUgdGhlIHdhcm5pbmdzLjxwPgotPHA+Ci1JZiBTV0lHIGlzIHVuYWJsZSB0byBwcm9jZXNzIGEgcmF3IGhlYWRlciBmaWxlIG9yIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGVsaW1pbmF0ZSB0aGUgd2FybmluZyBtZXNzYWdlcywgeW91IGNhbiBzdHJ1Y3R1cmUgeW91ciBpbnRlcmZhY2UgZmlsZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdkCi0lewotI2luY2x1ZGUgImdkLmgiCi0lfQotCi0lc2VjdGlvbiAiZ2QtMS4yIixpZ25vcmUKLQotLi4uIHBhc3RlIHRoZSBjb250ZW50cyBvZiBnZC5oIGhlcmUgYW5kIHJlbW92ZSBwcm9ibGVtcyAuLi4KLQotLy8gQSBmZXcgZXh0cmEgc3VwcG9ydCBmdW5jdGlvbnMKLQotRklMRSAqZm9wZW4oY2hhciAqLCBjaGFyICopOwotdm9pZCBmY2xvc2UoRklMRSAqZik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgbGF0dGVyIG9wdGlvbiByZXF1aXJlcyBhIGxpdHRsZSBtb3JlIHdvcmsgKHNpbmNlIHlvdSBuZWVkIHRvIHBhc3RlIHRoZSBjb250ZW50cyBvZiBnZC5oIGludG8gdGhlIGZpbGUgYW5kIGVkaXQgaXQpLCBidXQgaXMgb3RoZXJ3aXNlIG5vdCBtdWNoIG1vcmUgZGlmZmljdWx0IHRvIGRvLiAgIEZvciBoaWdobHkgY29tcGxleCBDIGxpYnJhcmllcyBvciBoZWFkZXIgZmlsZXMgdGhhdCBnbyBvdmVyYm9hcmQgd2l0aCB0aGUgQyBwcmVwcm9jZXNzb3IsIHlvdSBtYXkgbmVlZCB0byBkbyB0aGlzIG1vcmUgb2Z0ZW4uICA8cD4KLTxhIG5hbWU9Im40MyI+PC9hPjxoMz4gVXNpbmcgdGhlIGdkIG1vZHVsZTwvaDM+Ci1Ob3csIHRoYXQgd2UgaGF2ZSBjcmVhdGVkIGEgbW9kdWxlIGZyb20gdGhlIGdkIGxpYnJhcnksIHdlIGNhbiB1c2UgaXQgaW4gUHl0aG9uIHNjcmlwdHMuICBUaGUgZm9sbG93aW5nIHNjcmlwdCBtYWtlcyBhIHNpbXBsZSBpbWFnZSBvZiBhIGJsYWNrIGJhY2tncm91bmQgd2l0aCBhIHdoaXRlIGxpbmUgZHJhd24gb24gaXQuICBOb3RpY2UgaG93IHdlIGhhdmUgdXNlZCBvdXIgd3JhcHBlZCB2ZXJzaW9ucyBvZiA8dHQ+Zm9wZW4oKTwvdHQ+IGFuZCA8dHQ+ZmNsb3NlKCk8L3R0PiB0byBjcmVhdGUgYSBGSUxFIGhhbmRsZSBmb3IgdXNlIGluIHRoZSBnZCBsaWJyYXJ5ICh0aGVyZSBhcmUgYWxzbyB3YXlzIHRvIHVzZSBQeXRob24gZmlsZSBvYmplY3RzLCBidXQgdGhpcyBpcyBkZXNjcmliZWQgbGF0ZXIpLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgU2ltcGxlIGdkIHByb2dyYW0KLQotZnJvbSBnZCBpbXBvcnQgKgotCi1pbSA9IGdkSW1hZ2VDcmVhdGUoNjQsNjQpCi1ibGFjayA9IGdkSW1hZ2VDb2xvckFsbG9jYXRlKGltLDAsMCwwKQotd2hpdGUgPSBnZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwyNTUsMjU1LDI1NSkKLWdkSW1hZ2VMaW5lKGltLDAsMCw2Myw2Myx3aGl0ZSkKLW91dCA9IGZvcGVuKCJ0ZXN0LmdpZiIsInciKQotZ2RJbWFnZUdpZihpbSxvdXQpCi1mY2xvc2Uob3V0KQotZ2RJbWFnZURlc3Ryb3koaW0pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhhdCB3YXMgc2ltcGxlIGVub3VnaC0tYW5kIGl0IG9ubHkgcmVxdWlyZWQgYWJvdXQgNSBtaW51dGVzIG9mIHdvcmsuICBVbmZvcnR1bmF0ZWx5LCBvdXIgZ2QgbW9kdWxlIHN0aWxsIGhhcyBhIGZldyBwcm9ibGVtcy4uLjxwPgotPGEgbmFtZT0ibjQ0Ij48L2E+PGgzPiBFeHRlbmRpbmcgYW5kIGZpeGluZyB0aGUgZ2QgbW9kdWxlPC9oMz4KLVdoaWxlIG91ciBmaXJzdCBhdHRlbXB0IGF0IHdyYXBwaW5nIGdkIHdvcmtzIGZvciBzaW1wbGUgZnVuY3Rpb25zLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcHJvYmxlbXMuICAgRm9yIGV4YW1wbGUsIHRoZSBnZC0xLjIgbGlicmFyeSBjb250YWlucyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGZvciBkcmF3aW5nIHBvbHlnb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGdkSW1hZ2VQb2x5Z29uKGdkSW1hZ2VQdHIgaW0sIGdkUG9pbnRQdHIgcG9pbnRzLCBpbnQgcG9pbnRzVG90YWwsIGludCBjb2xvcik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+Z2RJbWFnZVB0cjwvdHQ+IHR5cGUgaXMgY3JlYXRlZCBieSBhbm90aGVyIGZ1bmN0aW9uIGluIG91ciBtb2R1bGUgYW5kIHRoZSBwYXJhbWV0ZXJzIDx0dD5wb2ludHNUb3RhbDwvdHQ+IGFuZCA8dHQ+Y29sb3I8L3R0PiBhcmUgc2ltcGxlIGludGVnZXJzLiAgSG93ZXZlciwgdGhlIDJuZCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRzIGFzIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgZ2QtMS4yIGhlYWRlciBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT50eXBlZGVmIHN0cnVjdCB7Ci0JaW50IHgsIHk7Ci19IGdkUG9pbnQsICpnZFBvaW50UHRyOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1VbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyB3YXkgdG8gY3JlYXRlIGEgZ2RQb2ludCBpbiBQeXRob24gYW5kIGNvbnNlcXVlbnRseSBubyB3YXkgdG8gY2FsbCB0aGUgZ2RJbWFnZVBvbHlnb24gZnVuY3Rpb24uICAgQSB0ZW1wb3Jhcnkgc2V0YmFjaywgYnV0IG9uZSB0aGF0IGlzIG5vdCBkaWZmaWN1bHQgdG8gc29sdmUgdXNpbmcgdGhlICA8dHQ+JWFkZG1ldGhvZHM8L3R0PiBkaXJlY3RpdmUgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBnZAotJXsKLSNpbmNsdWRlICJnZC5oIgotJX0KLQotJWluY2x1ZGUgImdkLmgiCi0KLS8vIEZpeCB1cCB0aGUgZ2RQb2ludCBzdHJ1Y3R1cmUgYSBsaXR0bGUgYml0Ci0lYWRkbWV0aG9kcyBnZFBvaW50IHsKLSAgLy8gQ29uc3RydWN0b3IgdG8gbWFrZSBhbiBhcnJheSBvZiAiUG9pbnRzIgotICBnZFBvaW50KGludCBucG9pbnRzKSB7Ci0gICAgcmV0dXJuIChnZFBvaW50ICopIG1hbGxvYyhucG9pbnRzKnNpemVvZihnZFBvaW50KSk7Ci0gIH07Ci0gIC8vIERlc3RydWN0b3IgdG8gZGVzdHJveSB0aGlzIGFycmF5Ci0gIH5nZFBvaW50KCkgewotICAgIGZyZWUoc2VsZik7Ci0gIH07Ci0gIC8vIFB5dGhvbiBtZXRob2QgZm9yIGFycmF5IGFjY2VzcwotICBnZFBvaW50ICpfX2dldGl0ZW1fXyhpbnQgaSkgewotICAgIHJldHVybiBzZWxmK2k7Ci0gIH07Ci19OwotCi1GSUxFICpmb3BlbihjaGFyICosIGNoYXIgKik7Ci12b2lkIGZjbG9zZShGSUxFICpmKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2l0aCB0aGVzZSBzaW1wbGUgYWRkaXRpb25zLCB3ZSBjYW4gbm93IGNyZWF0ZSBhcnJheXMgb2YgcG9pbnRzIGFuZCB1c2UgdGhlIHBvbHlnb24gZnVuY3Rpb24gYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBTaW1wbGUgZ2QgcHJvZ3JhbQotCi1mcm9tIGdkIGltcG9ydCAqCi0KLWltID0gZ2RJbWFnZUNyZWF0ZSg2NCw2NCkKLWJsYWNrID0gZ2RJbWFnZUNvbG9yQWxsb2NhdGUoaW0sMCwwLDApCi13aGl0ZSA9IGdkSW1hZ2VDb2xvckFsbG9jYXRlKGltLDI1NSwyNTUsMjU1KQotCi1wdHMgPSBnZFBvaW50KDMpOyAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSBhbiBhcnJheSBvZiBQb2ludHMKLXB0c1swXS54LHB0c1swXS55ID0gKDUsNSkgICAgICAgICAgICMgQXNzaWduIGEgc2V0IG9mIHBvaW50cwotcHRzWzFdLngscHRzWzFdLnkgPSAoNjAsMjUpCi1wdHNbMl0ueCxwdHNbMl0ueSA9ICgxNiw2MCkKLQotZ2RJbWFnZVBvbHlnb24oaW0scHRzLDMsd2hpdGUpICAgICAgIyBEcmF3IGEgcG9seWdvbiBmcm9tIG91ciBhcnJheSBvZiBwb2ludHMKLW91dCA9IGZvcGVuKCJ0ZXN0LmdpZiIsInciKQotZ2RJbWFnZUdpZihpbSxvdXQpCi1mY2xvc2Uob3V0KQotZ2RJbWFnZURlc3Ryb3koaW0pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im40NSI+PC9hPjxoMz4gQnVpbGRpbmcgYSBzaW1wbGUgMkQgaW1hZ2luZyBjbGFzczwvaDM+Ci1Ob3cgaXQncyB0aW1lIHRvIGdldCBkb3duIHRvIGJ1c2luZXNzLiAgVXNpbmcgb3VyIGdkLTEuMiBtb2R1bGUsIHdlIGNhbiB3cml0ZSBhIHNpbXBsZSAyRCBpbWFnaW5nIGNsYXNzIHRoYXQgaGlkZXMgYWxvdCBvZiB0aGUgdW5kZXJseWluZyBkZXRhaWxzIGFuZCBwcm92aWRlcyBzY2FsaW5nLCB0cmFuc2xhdGlvbnMsIGFuZCBhIGhvc3Qgb2Ygb3RoZXIgb3BlcmF0aW9ucy4gIChJdCdzIGEgZmFpciBhbW91bnQgY29kZSwgYnV0IGFuIGludGVyZXN0aW5nIGV4YW1wbGUgb2YgaG93IG9uZSBjYW4gdGFrZSBhIHNpbXBsZSBDIGxpYnJhcnkgYW5kIHR1cm4gaXQgaW50byBzb21ldGhpbmcgdGhhdCBsb29rcyBjb21wbGV0ZWx5IGRpZmZlcmVudCkuPHA+Ci08cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIGltYWdlLnB5Ci0jIEdlbmVyaWMgMkQgSW1hZ2UgQ2xhc3MKLSMKLSMgQnVpbHQgdXNpbmcgdGhlICdnZC0xLjInIGxpYnJhcnkgYnkgVGhvbWFzIEJvdXRlbGwKLSMKLQotaW1wb3J0IGdkCi0KLWNsYXNzIEltYWdlOgotCWRlZiBfX2luaXRfXyhzZWxmLHdpZHRoLGhlaWdodCx4bWluPTAuMCx5bWluPTAuMCx4bWF4PTEuMCx5bWF4PTEuMCk6Ci0JCXNlbGYuaW0gPSBnZC5nZEltYWdlQ3JlYXRlKHdpZHRoLGhlaWdodCkKLQkJc2VsZi54bWluICAgPSB4bWluCi0JCXNlbGYueW1pbiAgID0geW1pbgotCQlzZWxmLnhtYXggICA9IHhtYXgKLQkJc2VsZi55bWF4ICAgPSB5bWF4Ci0JCXNlbGYud2lkdGggID0gd2lkdGgKLQkJc2VsZi5oZWlnaHQgPSBoZWlnaHQKLQkJc2VsZi5keCAgICAgPSAxLjAqKHhtYXgteG1pbikKLQkJc2VsZi5keSAgICAgPSAxLjAqKHltYXgteW1pbikKLQkJc2VsZi54dGljayAgPSBzZWxmLmR4LzEwLjAKLQkJc2VsZi55dGljayAgPSBzZWxmLmR5LzEwLjAKLQkJc2VsZi50aWNrbGVuPSAzCi0JCXNlbGYubmFtZSAgID0gImltYWdlLmdpZiIKLQkJZ2QuZ2RJbWFnZUNvbG9yQWxsb2NhdGUoc2VsZi5pbSwwLDAsMCkgICAgICAgICMgQmxhY2sKLQkJZ2QuZ2RJbWFnZUNvbG9yQWxsb2NhdGUoc2VsZi5pbSwyNTUsMjU1LDI1NSkgICMgV2hpdGUKLQkJZ2QuZ2RJbWFnZUNvbG9yQWxsb2NhdGUoc2VsZi5pbSwyNTUsMCwwKSAgICAgICMgUmVkCi0JCWdkLmdkSW1hZ2VDb2xvckFsbG9jYXRlKHNlbGYuaW0sMCwyNTUsMCkgICAgICAjIEdyZWVuCi0JCWdkLmdkSW1hZ2VDb2xvckFsbG9jYXRlKHNlbGYuaW0sMCwwLDI1NSkgICAgICAjIEJsdWUKLQotCWRlZiBfX2RlbF9fKHNlbGYpOgotCQlwcmludCAiRGVsZXRpbmciCi0JCWdkLmdkSW1hZ2VEZXN0cm95KHNlbGYuaW0pCi0JCi0JIyBEdW1wIG91dCB0aGlzIGltYWdlIHRvIGEgZmlsZQotCWRlZiB3cml0ZShzZWxmLG5hbWU9Ik5PTkUiKToKLQkJaWYgbmFtZSA9PSAiTk9ORSI6Ci0JCQluYW1lID0gc2VsZi5uYW1lCi0JCWYgPSBnZC5mb3BlbihuYW1lLCJ3IikKLQkJZ2QuZ2RJbWFnZUdpZihzZWxmLmltLGYpCi0JCWdkLmZjbG9zZShmKQotCQlzZWxmLm5hbWUgPSBuYW1lCi0JCi0JIyBWaXJ0dWFsIG1ldGhvZCB0aGF0IGRlcml2ZWQgY2xhc3NlcyBkZWZpbmUKLQlkZWYgZHJhdyhzZWxmKToKLQkJcHJpbnQgIk5vIGRyYXdpbmcgbWV0aG9kIHNwZWNpZmllZC4iCi0KLQkjIEEgY29tYmluYXRpb24gb2Ygd3JpdGUgYW5kIGRyYXcKLQlkZWYgc2hvdyhzZWxmLGZpbGVuYW1lPSJOT05FIik6Ci0JCXNlbGYuZHJhdygpCi0JCXNlbGYud3JpdGUoZmlsZW5hbWUpCi0KLQkjIExvYWQgdXAgYSBjb2xvcm1hcCBmcm9tIGEgUHl0aG9uIGFycmF5IG9mIChSLEcsQikgdHVwbGVzCi0JZGVmIGNvbG9ybWFwKHNlbGYsIGNtYXApOgotCQlmb3IgaSBpbiByYW5nZSgwLDI1NSk6Ci0JCQlnZC5nZEltYWdlQ29sb3JEZWFsbG9jYXRlKHNlbGYuaW0saSkKLQkJZm9yIGMgaW4gY21hcDoKLQkJCWdkLmdkSW1hZ2VDb2xvckFsbG9jYXRlKHNlbGYuaW0sY1swXSxjWzFdLGNbMl0pCi0KLQkjIENoYW5nZSB2aWV3aW5nIHJlZ2lvbgotCWRlZiByZWdpb24oc2VsZix4bWluLHltaW4seG1heCx5bWF4KToKLQkJc2VsZi54bWluID0geG1pbgotCQlzZWxmLnltaW4gPSB5bWluCi0JCXNlbGYueG1heCA9IHhtYXgKLQkJc2VsZi55bWF4ID0geW1heAotCQlzZWxmLmR4ICAgICA9IDEuMCooeG1heC14bWluKQotCQlzZWxmLmR5ICAgICA9IDEuMCooeW1heC15bWluKQotCi0JIyBUcmFuc2Zvcm1zIGEgMkQgcG9pbnQgaW50byBzY3JlZW4gY29vcmRpbmF0ZXMKLQlkZWYgdHJhbnNmb3JtKHNlbGYseCx5KToKLQkJbnB0ID0gW10KLQkJaXggPSAoeC1zZWxmLnhtaW4pL3NlbGYuZHgqc2VsZi53aWR0aCArIDAuNQotCQlpeSA9IChzZWxmLnltYXgteSkvc2VsZi5keSpzZWxmLmhlaWdodCArIDAuNQotCQlyZXR1cm4gKGl4LGl5KQotCi0JIyBBIGZldyBncmFwaGljcyBwcmltaXRpdmVzCi0JZGVmIGNsZWFyKHNlbGYsY29sb3IpOgotCQlnZC5nZEltYWdlRmlsbGVkUmVjdGFuZ2xlKHNlbGYuaW0sMCwwLHNlbGYud2lkdGgsc2VsZi5oZWlnaHQsY29sb3IpCi0KLQlkZWYgcGxvdChzZWxmLHgseSxjb2xvcik6Ci0JCWl4LGl5ID0gc2VsZi50cmFuc2Zvcm0oeCx5KQotCQlnZC5nZEltYWdlU2V0UGl4ZWwoc2VsZi5pbSxpeCxpeSxjb2xvcikKLQotCWRlZiBsaW5lKHNlbGYseDEseTEseDIseTIsY29sb3IpOgotCQlpeDEsaXkxID0gc2VsZi50cmFuc2Zvcm0oeDEseTEpCi0JCWl4MixpeTIgPSBzZWxmLnRyYW5zZm9ybSh4Mix5MikKLQkJZ2QuZ2RJbWFnZUxpbmUoc2VsZi5pbSxpeDEsaXkxLGl4MixpeTIsY29sb3IpCi0KLQlkZWYgYm94KHNlbGYseDEseTEseDIseTIsY29sb3IpOgotCQlpeDEsaXkxID0gc2VsZi50cmFuc2Zvcm0oeDEseTEpCi0JCWl4MixpeTIgPSBzZWxmLnRyYW5zZm9ybSh4Mix5MikKLQkJZ2QuZ2RJbWFnZVJlY3RhbmdsZShzZWxmLmltLGl4MSxpeTEsaXgyLGl5Mixjb2xvcikKLQotCWRlZiBzb2xpZGJveChzZWxmLHgxLHkxLHgyLHkyLGNvbG9yKToKLQkJaXgxLGl5MSA9IHNlbGYudHJhbnNmb3JtKHgxLHkxKQotCQlpeDIsaXkyID0gc2VsZi50cmFuc2Zvcm0oeDIseTIpCi0JCWdkLmdkSW1hZ2VGaWxsZWRSZWN0YW5nbGUoc2VsZi5pbSxpeDEsaXkxLGl4MixpeTIsY29sb3IpCi0JCi0JZGVmIGFyYyhzZWxmLGN4LGN5LHcsaCxzLGUsY29sb3IpOgotCQlpeCxpeSA9IHNlbGYudHJhbnNmb3JtKGN4LGN5KQotCQlpdyA9ICh4IC0gc2VsZi54bWluKS9zZWxmLmR4ICogc2VsZi53aWR0aAotCQlpaCA9ICh5IC0gc2VsZi55bWluKS9zZWxmLmR5ICogc2VsZi5oZWlnaHQKLQkJZ2QuZ2RJbWFnZUFyYyhzZWxmLmltLGl4LGl5LGl3LGloLHMsZSxjb2xvcikKLQotCWRlZiBmaWxsKHNlbGYseCx5LGNvbG9yKToKLQkJaXgsaXkgPSBzZWxmLnRyYW5zZm9ybSh4LHkpCi0JCWdkLmdkSW1hZ2VGaWxsKHNlbGYsaXgsaXksY29sb3IpCi0KLQlkZWYgYXhpcyhzZWxmLGNvbG9yKToKLQkJc2VsZi5saW5lKHNlbGYueG1pbiwwLHNlbGYueG1heCwwLGNvbG9yKQotCQlzZWxmLmxpbmUoMCxzZWxmLnltaW4sMCxzZWxmLnltYXgsY29sb3IpCi0JCXggPSAtc2VsZi54dGljayooaW50KC1zZWxmLnhtaW4vc2VsZi54dGljaykrMSkKLQkJd2hpbGUgeCAmbHQ7PSBzZWxmLnhtYXg6Ci0JCSAgICBpeCxpeSA9IHNlbGYudHJhbnNmb3JtKHgsMCkKLQkJICAgIGdkLmdkSW1hZ2VMaW5lKHNlbGYuaW0saXgsaXktc2VsZi50aWNrbGVuLGl4LGl5K3NlbGYudGlja2xlbixjb2xvcikKLQkJICAgIHggPSB4ICsgc2VsZi54dGljawotCQl5ID0gLXNlbGYueXRpY2sqKGludCgtc2VsZi55bWluL3NlbGYueXRpY2spKzEpCi0JCXdoaWxlIHkgJmx0Oz0gc2VsZi55bWF4OgotCQkgICAgaXgsaXkgPSBzZWxmLnRyYW5zZm9ybSgwLHkpCi0JCSAgICBnZC5nZEltYWdlTGluZShzZWxmLmltLGl4LXNlbGYudGlja2xlbixpeSxpeCtzZWxmLnRpY2tsZW4saXksY29sb3IpCi0JCSAgICB5ID0geSArIHNlbGYueXRpY2sKLQotCSMgc2NhbGV4KHMpLiAgU2NhbGVzIHRoZSB4LWF4aXMuICBzIGlzIGdpdmVuIGFzIGEgc2NhbGluZyBmYWN0b3IKLQlkZWYgc2NhbGV4KHNlbGYscyk6Ci0JCXhjID0gc2VsZi54bWluICsgc2VsZi5keC8yLjAKLQkJZHggPSBzZWxmLmR4KnMKLQkJeG1pbiA9IHhjIC0gZHgvMi4wCi0JCXhtYXggPSB4YyArIGR4LzIuMAotCQlzZWxmLnJlZ2lvbih4bWluLHNlbGYueW1pbix4bWF4LHNlbGYueW1heCkKLQotCSMgc2NhbGV5KHMpLiAgU2NhbGVzIHRoZSB5LWF4aXMuICAKLQlkZWYgc2NhbGV5KHNlbGYscyk6Ci0JCXljID0gc2VsZi55bWluICsgc2VsZi5keS8yLjAKLQkJZHkgPSBzZWxmLmR5KnMKLQkJeW1pbiA9IHljIC0gZHkvMi4wCi0JCXltYXggPSB5YyArIGR5LzIuMAotCQlzZWxmLnJlZ2lvbihzZWxmLnhtaW4seW1pbixzZWxmLnhtYXgseW1heCkKLQotCSMgWm9vbXMgYSBjdXJyZW50IGltYWdlLiAgcyBpcyBnaXZlbiBhcyBhIHBlcmNlbnQgCi0JZGVmIHpvb20oc2VsZixzKToKLQkJcyA9IDEwMC4wL3MKLQkJc2VsZi5zY2FsZXgocykKLQkJc2VsZi5zY2FsZXkocykKLQotCSMgTW92ZSBpbWFnZSBsZWZ0LiAgcyBpcyBnaXZlbiBpbiByYW5nZSAwLDEwMC4gMTAwIG1vdmVzIGEgZnVsbCBzY3JlZW4gbGVmdAotCWRlZiBsZWZ0KHNlbGYscyk6Ci0JCWR4ID0gc2VsZi5keCpzLzEwMC4wCi0JCXhtaW4gPSBzZWxmLnhtaW4gKyBkeAotCQl4bWF4ID0gc2VsZi54bWF4ICsgZHgKLQkJc2VsZi5yZWdpb24oeG1pbixzZWxmLnltaW4seG1heCxzZWxmLnltYXgpCi0KLQkjIE1vdmUgaW1hZ2UgcmlnaHQuICBzIGlzIGdpdmVuIGluIHJhbmdlIDAsMTAwLiAxMDAgbW92ZXMgYSBmdWxsIHNjcmVlbiByaWdodAotCWRlZiByaWdodChzZWxmLHMpOgotCQlzZWxmLmxlZnQoLXMpCi0KLQkjIE1vdmUgaW1hZ2UgZG93bi4gIHMgaXMgZ2l2ZW4gaW4gcmFuZ2UgMCwxMDAuIDEwMCBtb3ZlcyBhIGZ1bGwgc2NyZWVuIGRvd24KLQlkZWYgZG93bihzZWxmLHMpOgotCQlkeSA9IHNlbGYuZHkqcy8xMDAuMAotCQl5bWluID0gc2VsZi55bWluICsgZHkKLQkJeW1heCA9IHNlbGYueW1heCArIGR5Ci0JCXNlbGYucmVnaW9uKHNlbGYueG1pbix5bWluLHNlbGYueG1heCx5bWF4KQotCi0JIyBNb3ZlIGltYWdlIHVwLiAgcyBpcyBnaXZlbiBpbiByYW5nZSAwLDEwMC4gMTAwIG1vdmVzIGEgZnVsbCBzY3JlZW4gdXAKLQlkZWYgdXAoc2VsZixzKToKLQkJc2VsZi5kb3duKC1zKQotCi0JIyBDZW50ZXIgaW1hZ2UKLQlkZWYgY2VudGVyKHNlbGYseCx5KToKLQkJc2VsZi5yaWdodCg1MC14KQotCQlzZWxmLnVwKDUwLXkpCi0JCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU91ciBpbWFnZSBjbGFzcyBwcm92aWRlcyBhIG51bWJlciBvZiBtZXRob2RzIGZvciBjcmVhdGluZyBpbWFnZXMsIHBsb3R0aW5nIHBvaW50cywgbWFraW5nIGxpbmVzLCBhbmQgb3RoZXIgZ3JhcGhpY2FsIG9iamVjdHMuICBXZSBoYXZlIGFsc28gcHJvdmlkZWQgc29tZSBtZXRob2RzIGZvciBtb3ZpbmcgYW5kIHNjYWxpbmcgdGhlIGltYWdlLiAgIE5vdywgbGV0J3MgdXNlIHRoaXMgaW1hZ2UgY2xhc3MgdG8gZG8gc29tZSBpbnRlcmVzdGluZyB0aGluZ3MgOjxwPgotPHA+Ci08YSBuYW1lPSJuNDYiPjwvYT48aDM+IEEgbWF0aGVtYXRpY2FsIGZ1bmN0aW9uICBwbG90dGVyIDwvaDM+Ci1IZXJlJ3MgIGEgc2ltcGxlIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGxvdCBtYXRoZW1hdGljYWwgZnVuY3Rpb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIGZ1bmNwbG90LnB5Ci0KLWZyb20gaW1hZ2UgaW1wb3J0ICoKLQotY2xhc3MgUGxvdEZ1bmMoSW1hZ2UpOgotCWRlZiBfX2luaXRfXyhzZWxmLGZ1bmMseG1pbix5bWluLHhtYXgseW1heCx3aWR0aD01MDAsaGVpZ2h0PTUwMCk6Ci0JCUltYWdlLl9faW5pdF9fKHNlbGYsd2lkdGgsaGVpZ2h0LHhtaW4seW1pbix4bWF4LHltYXgpCi0JCXNlbGYuZnVuYyA9IGZ1bmMgICAgICAgICAgICAjIFRoZSBmdW5jdGlvbiBiZWluZyBwbG90dGVkCi0JCXNlbGYubnBvaW50cyA9IDEwMCAgICAgICAgICAjIE51bWJlciBvZiBzYW1wbGVzCi0JCXNlbGYuY29sb3IgPSAxCi0JZGVmIGRyYXcoc2VsZik6Ci0JCXNlbGYuY2xlYXIoMCkKLQkJbGFzdHggPSBzZWxmLnhtaW4KLQkJbGFzdHkgPSBzZWxmLmZ1bmMobGFzdHgpCi0JCWR4ID0gMS4wKihzZWxmLnhtYXgtc2VsZi54bWluKS9zZWxmLm5wb2ludHMKLQkJeCA9IGxhc3R4K2R4Ci0JCWZvciBpIGluIHJhbmdlKDAsc2VsZi5ucG9pbnRzKToKLQkJCXkgPSBzZWxmLmZ1bmMoeCkKLQkJCXNlbGYubGluZShsYXN0eCxsYXN0eSx4LHksc2VsZi5jb2xvcikKLQkJCWxhc3R4ID0geAotCQkJbGFzdHkgPSB5Ci0JCQl4ID0geCArIGR4Ci0JCXNlbGYuYXhpcygxKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Nb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGltcGxlbWVudGVkIGluIG91ciBiYXNlIGltYWdlIGNsYXNzIHNvIHRoaXMgaXMgcHJldHR5IHNpbXBsZS4gIEhvd2V2ZXIsIGlmIHdlIHdhbnRlZCB0byBtYWtlIGEgR0lGIGltYWdlIG9mIGEgbWF0aGVtYXRpY2FsIGZ1bmN0aW9uLCB3ZSBjb3VsZCBqdXN0IGRvIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyBmcm9tIGZ1bmNwbG90IGltcG9ydCAqCi0mZ3Q7Jmd0OyZndDsgaW1wb3J0IG1hdGgKLSZndDsmZ3Q7Jmd0OyBwID0gUGxvdEZ1bmMobGFtYmRhIHg6IDAuNSptYXRoLnNpbih4KSswLjc1Km1hdGguc2luKDIqeCktMC42Km1hdGguc2luKDMqeCksCi0gICAgICAgICAgICAgICAgIC0xMCwtMiwxMCwyKQotJmd0OyZndDsmZ3Q7IHAuc2hvdygicGxvdC5naWYiKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGljaCB3b3VsZCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgR0lGIGltYWdlIDo8cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoOS4xLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotPGEgbmFtZT0ibjQ3Ij48L2E+PGgzPiBQbG90dGluZyBhbiB1bnN0cnVjdHVyZWQgbWVzaDwvaDM+Ci1PZiBjb3Vyc2UsIHBlcmhhcHMgd2Ugd2FudCB0byBwbG90IHNvbWV0aGluZyBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkIGxpa2UgYSBtZXNoLiBSZWNlbnRseSwgYSBjb2xsZWFndWUgY2FtZSB0byBtZSB3aXRoIHNvbWUgdW5zdHJ1Y3R1cmVkIG1lc2ggZGF0YSBjb250YWluZWQgaW4gYSBwYWlyIG9mIEFTQ0lJIGZvcm1hdHRlZCBmaWxlcy4gICBUaGVzZSBmaWxlcyBjb250YWluZWQgYSBjb2xsZWN0aW9uIG9mIHBvaW50cywgYW5kIGEgbGlzdCBvZiBjb25uZWN0aXZpdGllcyBkZWZpbmluZyBhIG1lc2ggb24gdGhlc2UgcG9pbnRzLiAgIFJlYWRpbmcgYW5kIHBsb3R0aW5nIHRoaXMgZGF0YSBpbiBQeXRob24gdHVybmVkIG91dCB0byBiZSByZWxhdGl2ZWx5IGVhc3kgdXNpbmcgdGhlIGZvbGxvd2luZyBzY3JpcHQgYW5kIG91ciBpbWFnZSBiYXNlIGNsYXNzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIHBsb3RtZXNoLnB5Ci0jIFBsb3RzIGFuIHVuc3RydWN0dXJlZCBtZXNoIHN0b3JlZCBhcyBhbiBBU0NJSSBmaWxlCi1mcm9tIGltYWdlIGltcG9ydCAqCi1pbXBvcnQgc3RyaW5nCi0KLWNsYXNzIFBsb3RNZXNoKEltYWdlKToKLQlkZWYgX19pbml0X18oc2VsZixmaWxlbmFtZSx4bWluLHltaW4seG1heCx5bWF4LHdpZHRoPTUwMCxoZWlnaHQ9NTAwKToKLQkJSW1hZ2UuX19pbml0X18oc2VsZix3aWR0aCxoZWlnaHQseG1pbix5bWluLHhtYXgseW1heCkKLQkJIyByZWFkIGluIGEgbWVzaCBmaWxlIGluIHBpZWNlcwotCQlwdHMgPSBbXQotCQkjIFJlYWQgaW4gZGF0YSBwb2ludHMKLQkJYXRvaSA9IHN0cmluZy5hdG9pCi0JCWF0b2YgPSBzdHJpbmcuYXRvZgotCQlmID0gb3BlbihmaWxlbmFtZSsiLnB0cyIsInIiKQotCQlucG9pbnRzID0gYXRvaShmLnJlYWRsaW5lKCkpCi0JCWZvciBpIGluIHJhbmdlKDAsbnBvaW50cyk6Ci0JCQlsID0gc3RyaW5nLnNwbGl0KGYucmVhZGxpbmUoKSkKLQkJCXB0cy5hcHBlbmQoKGF0b2YobFswXSksYXRvZihsWzFdKSkpCi0JCWYuY2xvc2UoKQkKLQotCQkjIFJlYWQgaW4gbWVzaCBkYXRhCi0JCWYgPSBvcGVuKGZpbGVuYW1lKyIudHJpcyIsInIiKQotCQludHJpcyA9IHN0cmluZy5hdG9pKGYucmVhZGxpbmUoKSkKLQkJdHJpcyA9IFsgXQotCQlmb3IgaSBpbiByYW5nZSgwLG50cmlzKToKLQkJCWwgPSBzdHJpbmcuc3BsaXQoZi5yZWFkbGluZSgpKQotCQkJdHJpcy5hcHBlbmQoKGF0b2kobFswXSktMSxhdG9pKGxbMV0pLTEsYXRvaShsWzJdKS0xLGF0b2kobFszXSkpKQotCQlmLmNsb3NlKCkKLQotCSMgU2V0IHVwIGxvY2FsIGF0dHJpYnV0ZXMKLQkJc2VsZi5wdHMgPSBwdHMKLQkJc2VsZi5ucG9pbnRzID0gbnBvaW50cwotCQlzZWxmLnRyaXMgPSB0cmlzCi0JCXNlbGYubnRyaXMgPSBudHJpcwotCi0JIyBEcmF3IG1lc2gKLQlkZWYgZHJhdyhzZWxmKToKLQkJc2VsZi5jbGVhcigwKTsKLQkJaSA9IDAKLQkJd2hpbGUgaSAmbHQ7IHNlbGYubnRyaXM6Ci0JCQl0cmkgPSBzZWxmLnRyaXNbaV0KLQkJCXB0MSA9IHNlbGYucHRzW3RyaVswXV0KLQkJCXB0MiA9IHNlbGYucHRzW3RyaVsxXV0KLQkJCXB0MyA9IHNlbGYucHRzW3RyaVsyXV0KLQkJCSMgTm93IGRyYXcgdGhlIG1lc2gKLQkJCXNlbGYudHJpYW5nbGUocHQxWzBdLHB0MVsxXSxwdDJbMF0scHQyWzFdLHB0M1swXSxwdDNbMV0sdHJpWzNdKTsKLQkJCWkgPSBpICsgMQotCi0JIyBEcmF3IGEgdHJpYW5nbGUKLQlkZWYgdHJpYW5nbGUoc2VsZix4MSx5MSx4Mix5Mix4Myx5Myxjb2xvcik6Ci0JCXNlbGYubGluZSh4MSx5MSx4Mix5Mixjb2xvcikKLQkJc2VsZi5saW5lKHgyLHkyLHgzLHkzLGNvbG9yKQotCQlzZWxmLmxpbmUoeDMseTMseDEseTEsY29sb3IpCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgY2xhc3Mgc2ltcGx5IHJlYWRzIHRoZSBkYXRhIGludG8gYSBmZXcgUHl0aG9uIGxpc3RzLCBoYXMgYSBkcmF3aW5nIGZ1bmN0aW9uIGZvciBtYWtpbmcgYSBwbG90LCBhbmQgYWRkcyBhIHNwZWNpYWwgbWV0aG9kIGZvciBtYWtpbmcgdHJpYW5nbGVzLiAgTWFraW5nIGEgcGxvdCBpcyBub3cgZWFzeSwganVzdCBkbyB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgZnJvbSBwbG90bWVzaC5weSBpbXBvcnQgKgotJmd0OyZndDsmZ3Q7IG1lc2ggPSBQbG90TWVzaCgibWVzaCIsNSwwLDM1LDI1KQotJmd0OyZndDsmZ3Q7IG1lc2guc2hvdygibWVzaC5naWYiKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgR0lGIGltYWdlIDo8cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoOS4yLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotV2hlbiBydW4gaW50ZXJhY3RpdmVseSwgd2UgY2FuIGFsc28gdXNlIHNpbXBsZSBjb21tYW5kcyB0byB6b29tIGluIGFuZCBtb3ZlIHRoZSBpbWFnZSBhcm91bmQuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgbWVzaCA9IFBsb3RNZXNoKCJtZXNoIiw1LDAsMzUsMjUpCi0mZ3Q7Jmd0OyZndDsgbWVzaC56b29tKDIwMCkgICAgICAgICAgICAgICAgICAgIyBFbmxhcmdlIGJ5IDIwMCUKLSZndDsmZ3Q7Jmd0OyBtZXNoLmxlZnQoNTApICAgICAgICAgICAgICAgICAgICAjIE1vdmUgaW1hZ2UgaGFsZiBhIHNjcmVlbiB0byBsZWZ0Ci0mZ3Q7Jmd0OyZndDsgbWVzaC5zaG93KCkKLSZndDsmZ3Q7Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGlsZSBhIFB5dGhvbi1vbmx5IGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIHVuc3VpdGFibGUgZm9yIGh1Z2UgZGF0YXNldHMsIHBlcmZvcm1hbmNlIGNyaXRpY2FsIG9wZXJhdGlvbnMgY291bGQgYmUgbW92ZWQgdG8gQyBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG91ciBJbWFnZSBiYXNlIGNsYXNzLiAgPHA+Ci08YSBuYW1lPSJuNDgiPjwvYT48aDM+IEZyb20gQyB0byBTV0lHIHRvIFB5dGhvbjwvaDM+Ci1UaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBudW1iZXIgb2YgdGhpbmdzIHRoYXQgYXJlIHBvc3NpYmxlIHdpdGggU1dJRyBhbmQgUHl0aG9uLiAgRmlyc3QsIGl0IGlzIHVzdWFsbHkgcmVsYXRpdmVseSBlYXN5IHRvIGJ1aWxkIGEgUHl0aG9uIGludGVyZmFjZSB0byBhbiBleGlzdGluZyBDIGxpYnJhcnkuICAgIFdpdGggYSBsaXR0bGUgZXh0cmEgd29yaywgaXQgaXMgcG9zc2libGUgdG8gaW1wcm92ZSB0aGUgaW50ZXJmYWNlIGJ5IGFkZGluZyBhIGZldyBzdXBwb3J0IGZ1bmN0aW9ucyBzdWNoIGFzIG91ciBQb2ludCAgZXh0ZW5zaW9ucy4gIEZpbmFsbHksIG9uY2UgaW4gUHl0aG9uLCBpdCBpcyBwb3NzaWJsZSB0byBlbmNhcHN1bGF0ZSBDIGxpYnJhcmllcyBpbiBuZXcga2luZHMgb2YgUHl0aG9uIG9iamVjdHMgYW5kIGNsYXNzZXMuICBXZSBidWlsdCBhIHNpbXBsZSBJbWFnZSBiYXNlIGNsYXNzIGFuZCB1c2VkIGl0IHRvIHBsb3QgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyBhbmQgdW5zdHJ1Y3R1cmVkIDJEIG1lc2ggZGF0YS0tLXR3byBlbnRpcmVseSBkaWZmZXJlbnQgdGFza3MsIHlldCBlYXNpbHkgYWNjb21wbGlzaGVkIHdpdGggYSBzbWFsbCBhbW91bnQgb2YgUHl0aG9uIGNvZGUuICAgSWYgd2UgbGF0ZXIgZGVjaWRlZCB0byB1c2UgYSBkaWZmZXJlbnQgQyBsaWJyYXJ5IHN1Y2ggYXMgT3BlbkdMLCB3ZSBjb3VsZCB3cmFwIGl0IGluIFNXSUcsIGNoYW5nZSB0aGUgSW1hZ2UgYmFzZSBjbGFzcyBhcHByb3ByaWF0ZWx5ICwgYW5kIHVzZSB0aGUgZnVuY3Rpb24gYW5kIG1lc2ggcGxvdHRpbmcgZXhhbXBsZXMgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiAgIEkgdGhpbmsgdGhpcyBpcyBwcmV0dHkgY29vbC48cD4KLTxhIG5hbWU9Im44Ij48L2E+PGgyPiBQdXR0aW5nIGl0IGFsbCB0b2dldGhlcjwvaDI+Ci1GaW5hbGx5LCBsZXQncyBjb21iaW5lIG91ciBoZWF0IGVxdWF0aW9uIHNvbHZlciBhbmQgZ3JhcGhpY3MgbW9kdWxlIGludG8gYSBzaW5nbGUgYXBwbGljYXRpb24uICAgVG8gZG8gdGhpcywgd2UgZmlyc3QgbmVlZCB0byBrbm93IGhvdyB0byBjb21iaW5lIHR3byBkaWZmZXJlbnQgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcy4gV2hlbiBkaWZmZXJlbnQgU1dJRyBtb2R1bGVzIG5lZWQgdG8gYmUgY29tYmluZWQsIHRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGluZ3MgeW91IGNhbiBkby48cD4KLTxhIG5hbWU9Im40OSI+PC9hPjxoMz4gTWVyZ2luZyBtb2R1bGVzPC9oMz4KLVR3byBTV0lHIG1vZHVsZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgbW9kdWxlIGlmIHlvdSBtYWtlIGFuIGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBwYWNrYWdlCi0laW5jbHVkZSBwZGUuaQotJWluY2x1ZGUgZ2QuaQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIHdpbGwgY29tYmluZSBldmVyeXRoaW5nIGluIGJvdGggaW50ZXJmYWNlIGZpbGVzIGludG8gYSBzaW5nbGUgc3VwZXItbW9kdWxlIGNhbGxlZCAicGFja2FnZSIuIFRoZSBhZHZhbnRhZ2UgdG8gdGhpcyBhcHByb2FjaCBpcyB0aGF0IGl0IGlzIGV4dHJlbWVseSBxdWljayBhbmQgZWFzeS4gIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgbW9kdWxlIG5hbWVzIG9mICJwZGUiIGFuZCAiZ2QiIHdpbGwgYmUgbG9zdC4gIElmIHlvdSBoYWQgYSBidW5jaCBvZiBzY3JpcHRzIHRoYXQgcmVsaWVkIG9uIHRob3NlIG5hbWVzLCB0aGV5IHdvdWxkIG5vIGxvbmdlciB3b3JrLiAgICBUaHVzLCBjb21iaW5pbmcgbW9kdWxlcyBpbiB0aGlzIHdheSBpcyBwcm9iYWJseSBvbmx5IGEgZ29vZCBpZGVhIGlmIHRoZSBtb2R1bGVzIGFyZSBjbG9zZWx5IHJlbGF0ZWQuPHA+Ci08YSBuYW1lPSJuNTAiPjwvYT48aDM+IFVzaW5nIGR5bmFtaWMgbG9hZGluZzwvaDM+Ci1JZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBkeW5hbWljIGxvYWRpbmcsIHlvdSBjYW4gYnVpbGQgZWFjaCBTV0lHIG1vZHVsZSBpbnRvIGEgc2VwYXJhdGUgZHluYW1pY2FsbHkgbG9hZGFibGUgbW9kdWxlIGFuZCBsb2FkIGVhY2ggb25lIGluZGl2aWR1YWxseSBpbnRvIFB5dGhvbi4gIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBhcHByb2FjaCBpZiBpdCBpcyBzdXBwb3J0ZWQgb24geW91ciBzeXN0ZW0uICAgU1dJRyB3cmFwcGVyIGZpbGVzIGRlY2xhcmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgYXMgInN0YXRpYyIgc28gdXNpbmcgZHluYW1pYyBsb2FkaW5nIHdpdGggbXVsdGlwbGUgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyB3aWxsIG5vdCB1c3VhbGx5IGNhdXNlIGFueSBuYW1lc3BhY2UgY2xhc2hlcy4gIDxwPgotPGEgbmFtZT0ibjUxIj48L2E+PGgzPiBVc2Ugc3RhdGljIGxpbmtpbmc8L2gzPgotQXMgYW4gYWx0ZXJuYXRpdmUgdG8gZHluYW1pYyBsb2FkaW5nLCB5b3UgY2FuIHVzZSBhIHNwZWNpYWwgZm9ybSBvZiB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBwYWNrYWdlLCBwZGVjLCBnZGMKLSVpbmNsdWRlIGVtYmVkLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3aWxsIGJ1aWxkIGEgc3RhdGljIHZlcnNpb24gb2YgUHl0aG9uIHdpdGggMyBDIGV4dGVuc2lvbiBtb2R1bGVzIGFkZGVkICg8dHQ+cGFja2FnZTwvdHQ+LCA8dHQ+cGRlYzwvdHQ+LCBhbmQgPHR0PmdkYzwvdHQ+KS4gIFdoZW4gdXNpbmcgdGhpcyB0ZWNobmlxdWUsIHRoZSBuYW1lcyBvZiB0aGUgbW9kdWxlcyByZWZlciB0byB0aGUgbG93LWxldmVsIFNXSUcgZ2VuZXJhdGVkIEMvQysrIG1vZHVsZXMuICBTaW5jZSBzaGFkb3cgY2xhc3NlcyBhcmUgYmVpbmcgdXNlZCwgdGhlc2UgbW9kdWxlcyBtdXN0IGhhdmUgYW4gZXh0cmEgYGMnIGFwcGVuZGVkIHRvIHRoZSBuYW1lICh0aHVzLCAicGRlYyIgYW5kICJnZGMiIGluc3RlYWQgb2YgInBkZSIgYW5kICJnZCIpLiAgIFRoZSBleHRyYSBtb2R1bGVzIHNwZWNpZmllZCB3aXRoIHRoZSA8dHQ+JW1vZHVsZXM8L3R0PiBkaXJlY3RpdmUgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gYmUgU1dJRy1nZW5lcmF0ZWQgbW9kdWxlcy4gSW4gcHJhY3RpY2UsIGFsbW9zdCBhbnkga2luZCBvZiBQeXRob24gbW9kdWxlIGNhbiBiZSBsaXN0ZWQgaGVyZS4gIEl0IHNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgZXh0cmEgbW9kdWxlcyBuYW1lcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIGlmIHRoZSA8dHQ+ZW1iZWQuaSA8L3R0PmxpYnJhcnkgZmlsZSBpcyBub3QgdXNlZC48cD4KLTxhIG5hbWU9Im41MiI+PC9hPjxoMz4gQnVpbGRpbmcgbGFyZ2UgIG11bHRpLW1vZHVsZSBzeXN0ZW1zPC9oMz4KLUJ5IGRlZmF1bHQsIFNXSUcgaW5jbHVkZXMgdGhlIEMgY29kZSBmb3IgdGhlIFNXSUcgdHlwZS1jaGVja2VyIGFuZCB2YXJpYWJsZSBsaW5raW5nIGludG8gZXZlcnkgbW9kdWxlLiAgSG93ZXZlciwgd2hlbiwgYnVpbGRpbmcgc3lzdGVtcyBpbnZvbHZpbmcgbGFyZ2UgbnVtYmVycyBvZiBTV0lHIG1vZHVsZXMsICBjb21tb24gY29kZSBzdWNoIGFzIHRoZSBTV0lHIHBvaW50ZXIgdHlwZS1jaGVja2VyIGFuZCB2YXJpYWJsZSBsaW5raW5nIGV4dGVuc2lvbnMgY2FuIGJlIHNoYXJlZCBpZiB5b3UgcnVuIFNXSUcgd2l0aCB0aGUgPHR0Pi1jPC90dD4gb3B0aW9uLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtYyAtcHl0aG9uIGdyYXBoaWNzLmkKLSUgc3dpZyAtYyAtcHl0aG9uIG5ldHdvcmsuaQotJSBzd2lnIC1jIC1weXRob24gYW5hbHlzaXMuaQotJSBzd2lnIC1jIC1weXRob24gbWF0aC5pCi0lIGdjYyAtYyBncmFwaGljc193cmFwLmMgbmV0d29ya193cmFwLmMgYW5hbHlzaXNfd3JhcC5jIG1hdGhfd3JhcC5jCi0lIGxkIC1zaGFyZWQgZ3JhcGhpY3Nfd3JhcC5vIC1sc3dpZ3B5IC1vIGdyYXBoaWNzbW9kdWxlLnNvIAotJSBsZCAtc2hhcmVkIG5ldHdvcmtfd3JhcC5vIC1sc3dpZ3B5IC1vIG5ldHdvcmttb2R1bGUuc28gCi0lIGxkIC1zaGFyZWQgYW5hbHlzaXNfd3JhcC5vIC1sc3dpZ3B5IC1vIGFuYWx5c2lzbW9kdWxlLnNvIAotJSBsZCAtc2hhcmVkIG1hdGhfd3JhcC5vIC1vIC1sc3dpZ3B5IG15bWF0aG1vZHVsZS5zbyAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHR0PnN3aWdweTwvdHQ+IGlzIGEgc3BlY2lhbCBwdXJwb3NlIGxpYnJhcnkgdGhhdCBjb250YWlucyB0aGUgU1dJRyBwb2ludGVyIHR5cGUgY2hlY2tlciBhbmQgb3RoZXIgc3VwcG9ydCBjb2RlIChzZWUgdGhlIDx0dD5NaXNjPC90dD4gc3ViZGlyZWN0b3J5IG9mIHRoZSBTV0lHIGRpc3RyaWJ1dGlvbikuIFdoZW4gdXNlZCBpbiB0aGlzIG1hbm5lciwgdGhlIHNhbWUgc3VwcG9ydCBjb2RlIHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzLiAgIFRoZSA8dHQ+c3dpZ3B5PC90dD4gbGlicmFyeSBjYW4gYWxzbyBiZSBhcHBsaWVkIHdoZW4gc3RhdGljIGxpbmtpbmcgaXMgYmVpbmcgdXNlZC4gIFNlZSB0aGUgQWR2YW5jZWQgVG9waWNzIGNoYXB0ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgU1dJRyB3aXRoIG11bHRpcGxlIG1vZHVsZXMuPHA+Ci08YSBuYW1lPSJuNTMiPjwvYT48aDM+IEEgY29tcGxldGUgYXBwbGljYXRpb248L2gzPgotVGhlIGZvbGxvd2luZyBQeXRob24gc2NyaXB0IHNob3dzIGFuIGFwcGxpY2F0aW9uIHRoYXQgY29tYmluZXMgb3VyIEMrKyBoZWF0IGVxdWF0aW9uIHNvbHZlciwgb3VyIGdkIGxpYnJhcnksIGFuZCBvdXIgSW1hZ2UgYmFzZSBjbGFzcyB0aGF0IHdlIGRldmVsb3BlZC4gPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBTb2x2ZSB0aGUgaGVhdCBlcXVhdGlvbi4KLSMgTWFrZSBhIHNlcmllcyBvZiBkYXRhIGZpbGVzCi0jIE1ha2UgYSBtb3ZpZSBvZiBHSUYgaW1hZ2VzCi0KLWZyb20gcGRlIGltcG9ydCAqCi1mcm9tIGltYWdlIGltcG9ydCAqCi1pbXBvcnQgc3RyaW5nCi0KLSMgSW1hZ2UgY2xhc3MKLWNsYXNzIEhlYXRJbWcoSW1hZ2UpOgotCWRlZiBfX2luaXRfXyhzZWxmLGgsd2lkdGg9MzAwLGhlaWdodD0zMDApOgotCQlJbWFnZS5fX2luaXRfXyhzZWxmLHdpZHRoLGhlaWdodCwwLjAsMC4wLDEuMCwxLjApCi0JCXNlbGYuaCA9IGgKLQkJIyBDcmVhdGUgYSBncmV5c2NhbGUgY29sb3JtYXAKLQkJY21hcCA9IFtdCi0JCWZvciBpIGluIHJhbmdlKDAsMjU1KToKLQkJCWNtYXAuYXBwZW5kKChpLGksaSkpCi0JCXNlbGYuY29sb3JtYXAoY21hcCkKLQkJc2VsZi5jbWluID0gMC4wCi0JCXNlbGYuY21heCA9IDEuMAotCQlzZWxmLmltZ25vID0gMQotCWRlZiBkcmF3KHNlbGYpOgotCQlzZWxmLmNsZWFyKDApCi0JCWR4ID0gMS4wLyhzZWxmLmguZ3JpZC54cG9pbnRzLTIpCi0JCWR5ID0gMS4wLyhzZWxmLmguZ3JpZC55cG9pbnRzLTIpCi0JCWkgPSAxCi0JCXggPSAwLjAKLQkJd2hpbGUgaSAmbHQ7IHNlbGYuaC5ncmlkLnhwb2ludHM6Ci0JCQlqID0gMTsKLQkJCXkgPSAwLjAKLQkJCXdoaWxlIGogJmx0OyBzZWxmLmguZ3JpZC55cG9pbnRzOgotCQkJCWMgPSBpbnQoKHNlbGYuaC5ncmlkW2ldW2pdLXNlbGYuY21pbikvKHNlbGYuY21heC0gCi0JCQkJCSBzZWxmLmNtaW4pKjI1NSkKLQkJCQlzZWxmLnNvbGlkYm94KHgseStkeSx4K2R4LHksYykKLQkJCQlqID0gaiArIDEKLQkJCQl5ID0geSArIGR5Ci0JCQlpID0gaSArIDEKLQkJCXggPSB4ICsgZHgKLQkJc2VsZi5uYW1lID0gImltYWdlIitzdHJpbmcuemZpbGwoc2VsZi5pbWdubyw0KSsiLmdpZiIKLQkJc2VsZi5pbWdubyA9IHNlbGYuaW1nbm8rMQotCi0jIFNldCB1cCBhbiBpbml0aWFsIGNvbmRpdGlvbgotZGVmIGluaXRjb25kKGgpOgotCWguc2V0X3RlbXAoMC4wKQotCW54ID0gaC5ncmlkLnhwb2ludHMKLQlmb3IgaSBpbiByYW5nZSgwLG54KToKLQkJaC5ncmlkW2ldWzBdID0gMS4wCi0KLSMgU2V0IHVwIGEgcHJvYmxlbSBhbmQgcnVuIGl0Ci1oID0gSGVhdDJkKDUwLDUwKQotCi0jIE1ha2UgYW4gaW1hZ2Ugb2JqZWN0Ci1pbWcgPSBIZWF0SW1nKGgpCi0KLWluaXRjb25kKGgpCi1maWxlbm8gPSAxCi0KLSMgUnVuIGl0Ci1mb3IgaSBpbiByYW5nZSgwLDI1KToKLQloLnNvbHZlKDEwMCkKLQloLmR1bXAoIkRhdCIrc3RyKGZpbGVubykpCi0JaW1nLnNob3coKQotCXByaW50ICJ0aW1lID0gIiwgaC50aW1lCi0JZmlsZW5vID0gZmlsZW5vKzEKLQotIyBDYWxjdWxhdGUgYXZlcmFnZSB0ZW1wZXJhdHVyZSBhbmQgZXhpdAotc3VtID0gMC4wCi1mb3IgaSBpbiByYW5nZSgwLGguZ3JpZC54cG9pbnRzKToKLQlmb3IgaiBpbiByYW5nZSgwLGguZ3JpZC55cG9pbnRzKToKLQkJc3VtID0gc3VtICsgaC5ncmlkW2ldW2pdCi1hdmcgPSBzdW0vKGguZ3JpZC54cG9pbnRzKmguZ3JpZC55cG9pbnRzKQotcHJpbnQgIkF2ZyB0ZW1wZXJhdHVyZSA9ICIsYXZnCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gcnVuLCB3ZSBub3cgZ2V0IGEgY29sbGVjdGlvbiBvZiBkYXRhZmlsZXMgYW5kIHNlcmllcyBvZiBpbWFnZXMgbGlrZSB0aGlzIDo8cD4KLTxwPjxjZW50ZXI+PGltZyBzcmM9ImNoOS4zLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxwPgotVGh1cywgd2UgaGF2ZSBhIHNpbXBsZSBwaHlzaWNzIGFwcGxpY2F0aW9uIHRoYXQgb25seSB0YWtlcyBhYm91dCAxIHBhZ2Ugb2YgUHl0aG9uIGNvZGUsIHJ1bnMgYSBzaW11bGF0aW9uLCBjcmVhdGVzIGRhdGEgZmlsZXMsIGFuZCBhIG1vdmllIG9mIGltYWdlcy4gIFdlIGNhbiBlYXNpbHkgY2hhbmdlIGFueSBhc3BlY3Qgb2YgdGhlIHNpbXVsYXRpb24sIGludGVyYWN0aXZlbHkgcXVlcnkgdmFyaWFibGVzIGFuZCBleGFtaW5lIGRhdGEuICBOZXcgcHJvY2VkdXJlcyBjYW4gYmUgd3JpdHRlbiBhbmQgdGVzdGVkIGluIFB5dGhvbiBhbmQgbGF0ZXIgaW1wbGVtZW50ZWQgaW4gQysrIGlmIG5lZWRlZC4gICBNb3JlIGltcG9ydGFudGx5LCB3ZSBoYXZlIGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgYWN0dWFsbHkgZnVuIHRvIHVzZSBhbmQgbW9kaWZ5ICh3ZWxsLCBhdCBsZWFzdCBJIHRoaW5rIHNvKS48cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBFeGNlcHRpb24gaGFuZGxpbmcgPC9oMj4KLVRoZSBTV0lHIDx0dD4lZXhjZXB0PC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHVzZXItZGVmaW5hYmxlIGV4Y2VwdGlvbiBoYW5kbGVyIGluIGNoYXJnZSBvZiBjb252ZXJ0aW5nIGV4Y2VwdGlvbnMgaW4geW91ciBDL0MrKyBwcm9ncmFtIGludG8gUHl0aG9uIGV4Y2VwdGlvbnMuICBUaGUgY2hhcHRlciBvbiBleGNlcHRpb24gaGFuZGxpbmcgY29udGFpbnMgbW9yZSBkZXRhaWxzLCBidXQgc3VwcG9zZSB5b3UgaGF2ZSBhIEMrKyBjbGFzcyBsaWtlIHRoZSBmb2xsb3dpbmcgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWNsYXNzIFJhbmdlRXJyb3Ige307ICAgLy8gVXNlZCBmb3IgYW4gZXhjZXB0aW9uCi0KLWNsYXNzIERvdWJsZUFycmF5IHsKLSAgcHJpdmF0ZToKLSAgICBpbnQgbjsKLSAgICBkb3VibGUgKnB0cjsKLSAgcHVibGljOgotICAgIC8vIENyZWF0ZSBhIG5ldyBhcnJheSBvZiBmaXhlZCBzaXplCi0gICAgRG91YmxlQXJyYXkoaW50IHNpemUpIHsKLSAgICAgIHB0ciA9IG5ldyBkb3VibGVbc2l6ZV07Ci0gICAgICBuID0gc2l6ZTsKLSAgICB9Ci0gICAgLy8gRGVzdHJveSBhbiBhcnJheQotICAgIH5Eb3VibGVBcnJheSgpIHsKLSAgICAgICBkZWxldGUgcHRyOwotICAgIH0KLSAgICAvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkKLSAgICBpbnQgICBsZW5ndGgoKSB7Ci0gICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICAvLyBHZXQgYW4gaXRlbSBmcm9tIHRoZSBhcnJheSBhbmQgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcuCi0gICAgZG91YmxlIGdldGl0ZW0oaW50IGkpIHsKLSAgICAgIGlmICgoaSAmZ3Q7PSAwKSAmYW1wOyZhbXA7IChpICZsdDsgbikpCi0gICAgICAgIHJldHVybiBwdHJbaV07Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IFJhbmdlRXJyb3IoKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgYW4gaXRlbSBpbiB0aGUgYXJyYXkgYW5kIHBlcmZvcm0gYm91bmRzIGNoZWNraW5nLgotICAgIHZvaWQgc2V0aXRlbShpbnQgaSwgZG91YmxlIHZhbCkgewotICAgICAgaWYgKChpICZndDs9IDApICZhbXA7JmFtcDsgKGkgJmx0OyBuKSkKLSAgICAgICAgcHRyW2ldID0gdmFsOwotICAgICAgZWxzZSB7Ci0gICAgICAgIHRocm93IFJhbmdlRXJyb3IoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgY2FuIHRocm93IGEgcmFuZ2UgZXhjZXB0aW9uIGZvciBhbiBvdXQtb2YtYm91bmRzIGFycmF5IGFjY2Vzcy4gICBXZSBjYW4gY2F0Y2ggdGhpcyBpbiBvdXIgUHl0aG9uIGV4dGVuc2lvbiBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgaW4gYW4gaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQocHl0aG9uKSB7Ci0gIHRyeSB7Ci0gICAgJGZ1bmN0aW9uCi0gIH0KLSAgY2F0Y2ggKFJhbmdlRXJyb3IpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwiaW5kZXggb3V0LW9mLWJvdW5kcyIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gdGhlIEMrKyBjbGFzcyB0aHJvd3MgYSBSYW5nZUVycm9yIGV4Y2VwdGlvbiwgb3VyIHdyYXBwZXIgZnVuY3Rpb25zIHdpbGwgY2F0Y2ggaXQsIHR1cm4gaXQgaW50byBhIFB5dGhvbiBleGNlcHRpb24sIGFuZCBhbGxvdyBhIGdyYWNlZnVsIGRlYXRoIGFzIG9wcG9zZWQgdG8ganVzdCBoYXZpbmcgc29tZSBzb3J0IG9mIG15c3RlcmlvdXMgcHJvZ3JhbSBjcmFzaC4gICAgIFNpbmNlIFNXSUcncyBleGNlcHRpb24gaGFuZGxpbmcgaXMgdXNlci1kZWZpbmFibGUsIHdlIGFyZSBub3QgbGltaXRlZCB0byBDKysgZXhjZXB0aW9uIGhhbmRsaW5nLiAgIFBsZWFzZSBzZWUgdGhlIGNoYXB0ZXIgb24gZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBtb3JlIGRldGFpbHMgYW5kIHVzaW5nIHRoZSA8dHQ+ZXhjZXB0aW9uLmk8L3R0PiBsaWJyYXJ5IGZvciB3cml0aW5nIGxhbmd1YWdlLWluZGVwZW5kZW50IGV4Y2VwdGlvbiBoYW5kbGVycy48cD4KLTxwPgotUHl0aG9uIGV4Y2VwdGlvbnMgY2FuIGJlIHJhaXNlZCB1c2luZyB0aGUgPHR0PlB5RXJyX1NldFN0cmluZygpPC90dD4gZnVuY3Rpb24gYXMgc2hvd24gYWJvdmUuICBUaGUgZm9sbG93aW5nIHRhYmxlIHByb3ZpZGVzIGEgbGlzdCBvZiB0aGUgZGlmZmVyZW50IFB5dGhvbiBleGNlcHRpb25zIGF2YWlsYWJsZS48cD4KLTxjZW50ZXI+PGltZyBzcmM9ImNoOS50YWJsZS4xLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gUmVtYXBwaW5nIEMgZGF0YXR5cGVzIHdpdGggdHlwZW1hcHM8L2gyPgotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBob3cgU1dJRydzIHRyZWF0bWVudCBvZiB2YXJpb3VzIEMvQysrIGRhdGF0eXBlcyBjYW4gYmUgcmVtYXBwZWQgdXNpbmcgdGhlIFNXSUcgPHR0PiV0eXBlbWFwPC90dD4gZGlyZWN0aXZlLiAgIFdoaWxlIG5vdCByZXF1aXJlZCwgdGhpcyBzZWN0aW9uIGFzc3VtZXMgc29tZSBmYW1pbGlhcml0eSB3aXRoICBQeXRob24ncyBDIEFQSS4gICBUaGUgcmVhZGVyIGlzIGFkdmlzZWQgdG8gY29uc3VsdCAgdGhlIFB5dGhvbiByZWZlcmVuY2UgbWFudWFsIG9yIG9uZSBvZiB0aGUgYm9va3Mgb24gUHl0aG9uLiAgQSBnbGFuY2UgYXQgdGhlIGNoYXB0ZXIgb24gU1dJRyB0eXBlbWFwcyB3aWxsIGFsc28gYmUgdXNlZnVsLiAgPHA+Ci08YSBuYW1lPSJuNTQiPjwvYT48aDM+IFdoYXQgaXMgYSB0eXBlbWFwPzwvaDM+Ci1BIHR5cGVtYXAgaXMgbWVjaGFuaXNtIGJ5IHdoaWNoIFNXSUcncyBwcm9jZXNzaW5nIG9mIGEgcGFydGljdWxhciBDIGRhdGF0eXBlIGNhbiBiZSBvdmVycmlkZGVuLiAgIEEgc2ltcGxlIHR5cGVtYXAgbWlnaHQgbG9vayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotCi0ldHlwZW1hcChweXRob24saW4pIGludCB7Ci0JJHRhcmdldCA9IChpbnQpIFB5TG9uZ19Bc0xvbmcoJHNvdXJjZSk7Ci0JcHJpbnRmKCJSZWNlaXZlZCBhbiBpbnRlZ2VyIDogJWRcbiIsJHRhcmdldCk7Ci19Ci1leHRlcm4gaW50IGZhY3QoaW50IG4pOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UeXBlbWFwcyByZXF1aXJlIGEgbGFuZ3VhZ2UgIG5hbWUsICBtZXRob2QgbmFtZSwgZGF0YXR5cGUsIGFuZCBjb252ZXJzaW9uIGNvZGUuICBGb3IgUHl0aG9uLCAicHl0aG9uIiBzaG91bGQgYmUgdXNlZCBhcyB0aGUgbGFuZ3VhZ2UgbmFtZS4gVGhlICJpbiIgbWV0aG9kIGluIHRoaXMgZXhhbXBsZSByZWZlcnMgdG8gYW4gaW5wdXQgYXJndW1lbnQgb2YgYSBmdW5jdGlvbi4gVGhlIGRhdGF0eXBlIGBpbnQnIHRlbGxzIFNXSUcgdGhhdCB3ZSBhcmUgcmVtYXBwaW5nIGludGVnZXJzLiAgVGhlIHN1cHBsaWVkIGNvZGUgaXMgdXNlZCB0byBjb252ZXJ0IGZyb20gYSA8dHQ+UHlPYmplY3QgKjwvdHQ+IHRvIHRoZSBjb3JyZXNwb25kaW5nIEMgZGF0YXR5cGUuICBXaXRoaW4gdGhlIHN1cHBvcnRpbmcgQyBjb2RlLCB0aGUgdmFyaWFibGUgPHR0PiRzb3VyY2U8L3R0PiBjb250YWlucyB0aGUgc291cmNlIGRhdGEgKHRoZSA8dHQ+UHlPYmplY3Q8L3R0PiBpbiB0aGlzIGNhc2UpIGFuZCA8dHQ+JHRhcmdldDwvdHQ+IGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGNvbnZlcnNpb24uICA8cD4KLTxwPgotV2hlbiB0aGlzIGV4YW1wbGUgaXMgY29tcGlsZWQgaW50byBhIFB5dGhvbiBtb2R1bGUsIGl0IHdpbGwgb3BlcmF0ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgZnJvbSBleGFtcGxlIGltcG9ydCAqCi0mZ3Q7Jmd0OyZndDsgZmFjdCg2KQotUmVjZWl2ZWQgYW4gaW50ZWdlciA6IDYKLTcyMAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BIGZ1bGwgZGlzY3Vzc2lvbiBvZiB0eXBlbWFwcyBjYW4gYmUgZm91bmQgaW4gdGhlIG1haW4gU1dJRyB1c2VycyByZWZlcmVuY2UuICBXZSB3aWxsIHByaW1hcmlseSBiZSBjb25jZXJuZWQgd2l0aCBQeXRob24gdHlwZW1hcHMgaGVyZS48cD4KLTxhIG5hbWU9Im41NSI+PC9hPjxoMz4gUHl0aG9uIHR5cGVtYXBzPC9oMz4KLVRoZSBmb2xsb3dpbmcgdHlwZW1hcCBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gUHl0aG9uIG1vZHVsZXMgOjxwPgotPHA+Ci08dHQ+JXR5cGVtYXAocHl0aG9uLGluKQk8L3R0PkNvbnZlcnRzIFB5dGhvbiBvYmplY3RzIHRvIGlucHV0IGZ1bmN0aW9uIGFyZ3VtZW50czxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbixvdXQpPC90dD4JQ29udmVydHMgcmV0dXJuIHZhbHVlIG9mIGEgQyBmdW5jdGlvbiB0byBhIFB5dGhvbiBvYmplY3Q8cD4KLTx0dD4ldHlwZW1hcChweXRob24sdmFyaW4pCTwvdHQ+QXNzaWducyBhIGdsb2JhbCB2YXJpYWJsZSBmcm9tIGEgUHl0aG9uIG9iamVjdDxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbix2YXJvdXQpPC90dD4JUmV0dXJucyBhIGdsb2JhbCB2YXJpYWJsZSBhcyBhIFB5dGhvbiBvYmplY3Q8cD4KLTx0dD4ldHlwZW1hcChweXRob24sZnJlZWFyZyk8L3R0PglDbGVhbnMgdXAgYSBmdW5jdGlvbiBhcmd1bWVudCAoaWYgbmVjZXNzYXJ5KTxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbixhcmdvdXQpPC90dD4JT3V0cHV0IGFyZ3VtZW50IHByb2Nlc3Npbmc8cD4KLTx0dD4ldHlwZW1hcChweXRob24scmV0KTwvdHQ+CUNsZWFudXAgb2YgZnVuY3Rpb24gcmV0dXJuIHZhbHVlczxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbixjb25zdCk8L3R0PglDcmVhdGlvbiBvZiBQeXRob24gY29uc3RhbnRzPHA+Ci08dHQ+JXR5cGVtYXAobWVtYmVyaW4pPC90dD4JU2V0dGluZyBvZiBDKysgbWVtYmVyIGRhdGE8cD4KLTx0dD4ldHlwZW1hcChtZW1iZXJvdXQpPC90dD4JUmV0dXJuIG9mIEMrKyBtZW1iZXIgZGF0YTxwPgotPHR0PiV0eXBlbWFwKHB5dGhvbixjaGVjayk8L3R0PglDaGVja3MgZnVuY3Rpb24gaW5wdXQgdmFsdWVzLjxwPgotPGEgbmFtZT0ibjU2Ij48L2E+PGgzPiBUeXBlbWFwIHZhcmlhYmxlczwvaDM+Ci1UaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBtYXkgYmUgdXNlZCB3aXRoaW4gdGhlIEMgY29kZSB1c2VkIGluIGEgdHlwZW1hcDo8cD4KLTxwPgotPHR0PiRzb3VyY2U8L3R0PglTb3VyY2UgdmFsdWUgb2YgYSBjb252ZXJzaW9uPHA+Ci08dHQ+JHRhcmdldDwvdHQ+CVRhcmdldCBvZiBjb252ZXJzaW9uICh3aGVyZSB0aGUgcmVzdWx0IHNob3VsZCBiZSBzdG9yZWQpPHA+Ci08dHQ+JHR5cGU8L3R0PglDIGRhdGF0eXBlIGJlaW5nIHJlbWFwcGVkPHA+Ci08dHQ+JG1hbmdsZTwvdHQ+CU1hbmdsZWQgdmVyc2lvbiBvZiBkYXRhICh1c2VkIGZvciBwb2ludGVyIHR5cGUtY2hlY2tpbmcpPHA+Ci08dHQ+JHZhbHVlPC90dD4JVmFsdWUgb2YgYSBjb25zdGFudCAoY29uc3QgdHlwZW1hcCBvbmx5KTxwPgotPGEgbmFtZT0ibjU3Ij48L2E+PGgzPiBOYW1lIGJhc2VkIHR5cGUgY29udmVyc2lvbjwvaDM+Ci1UeXBlbWFwcyBhcmUgYmFzZWQgYm90aCBvbiB0aGUgZGF0YXR5cGUgYW5kIGFuIG9wdGlvbmFsIG5hbWUgYXR0YWNoZWQgdG8gYSBkYXRhdHlwZS4gICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBmb28KLQotLy8gVGhpcyB0eXBlbWFwIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgY2hhciAqKiBmdW5jdGlvbiBhcmd1bWVudHMKLSV0eXBlbWFwKHB5dGhvbixpbikgY2hhciAqKiB7IC4uLiB9Ci0KLS8vIFRoaXMgdHlwZW1hcCBpcyBhcHBsaWVkIG9ubHkgdG8gY2hhciAqKiBhcmd1bWVudHMgbmFtZWQgYGFyZ3YnCi0ldHlwZW1hcChweXRob24saW4pIGNoYXIgKiphcmd2IHsgLi4uIH0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBleGFtcGxlLCB0d28gdHlwZW1hcHMgYXJlIGFwcGxpZWQgdG8gdGhlIDx0dD5jaGFyICoqPC90dD4gZGF0YXR5cGUuICBIb3dldmVyLCB0aGUgc2Vjb25kIHR5cGVtYXAgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gYXJndW1lbnRzIG5hbWVkIGA8dHQ+YXJndjwvdHQ+Jy4gIEEgbmFtZWQgdHlwZW1hcCB3aWxsIGFsd2F5cyBvdmVycmlkZSBhbiB1bm5hbWVkIHR5cGVtYXAuPHA+Ci08cD4KLUR1ZSB0byB0aGUgbmFtZS1iYXNlZCBuYXR1cmUgb2YgdHlwZW1hcHMsIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdHlwZW1hcHMgYXJlIGluZGVwZW5kZW50IG9mIHR5cGVkZWYgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbiwgaW4pIGRvdWJsZSB7Ci0JLi4uIGdldCBhIGRvdWJsZSAuLi4KLX0KLXZvaWQgZm9vKGRvdWJsZSk7ICAgICAgICAgICAgLy8gVXNlcyB0aGUgYWJvdmUgdHlwZW1hcAotdHlwZWRlZiBkb3VibGUgUmVhbDsKLXZvaWQgYmFyKFJlYWwpOyAgICAgICAgICAgICAgLy8gRG9lcyBub3QgdXNlIHRoZSBhYm92ZSB0eXBlbWFwIChkb3VibGUgIT0gUmVhbCkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVG8gZ2V0IGFyb3VuZCB0aGlzIHByb2JsZW0sIHRoZSA8dHQ+JWFwcGx5PC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSV0eXBlbWFwKHB5dGhvbixpbikgZG91YmxlIHsKLQkuLi4gZ2V0IGEgZG91YmxlIC4uLgotfQotdm9pZCBmb28oZG91YmxlKTsKLQotdHlwZWRlZiBkb3VibGUgUmVhbDsgICAgICAgICAvLyBVc2VzIHR5cGVtYXAKLSVhcHBseSBkb3VibGUgeyBSZWFsIH07ICAgICAgLy8gQXBwbGllcyBhbGwgImRvdWJsZSIgdHlwZW1hcHMgdG8gUmVhbC4KLXZvaWQgYmFyKFJlYWwpOyAgICAgICAgICAgICAgLy8gTm93IHVzZXMgdGhlIHNhbWUgdHlwZW1hcC4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im41OCI+PC9hPjxoMz4gQ29udmVydGluZyAgUHl0aG9uIGxpc3QgdG8gYSBjaGFyICoqIDwvaDM+Ci1BIGNvbW1vbiBwcm9ibGVtIGluIG1hbnkgQyBwcm9ncmFtcyBpcyB0aGUgcHJvY2Vzc2luZyBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLCB3aGljaCBhcmUgdXN1YWxseSBwYXNzZWQgaW4gYW4gYXJyYXkgb2YgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZ3MuICAgVGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlIGFsbG93cyBhIFB5dGhvbiBsaXN0IG9iamVjdCB0byBiZSB1c2VkIGFzIGEgPHR0PmNoYXIgKio8L3R0PiBvYmplY3QuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBhcmd2Ci0KLS8vIFRoaXMgdGVsbHMgU1dJRyB0byB0cmVhdCBjaGFyICoqIGFzIGEgc3BlY2lhbCBjYXNlCi0ldHlwZW1hcChweXRob24saW4pIGNoYXIgKiogewotICAvKiBDaGVjayBpZiBpcyBhIGxpc3QgKi8KLSAgaWYgKFB5TGlzdF9DaGVjaygkc291cmNlKSkgewotICAgIGludCBzaXplID0gUHlMaXN0X1NpemUoJHNvdXJjZSk7Ci0gICAgaW50IGkgPSAwOwotICAgICR0YXJnZXQgPSAoY2hhciAqKikgbWFsbG9jKChzaXplKzEpKnNpemVvZihjaGFyICopKTsKLSAgICBmb3IgKGkgPSAwOyBpICZsdDsgc2l6ZTsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCAqbyA9IFB5TGlzdF9HZXRJdGVtKCRzb3VyY2UsaSk7Ci0gICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sobykpCi0JJHRhcmdldFtpXSA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5TGlzdF9HZXRJdGVtKCRzb3VyY2UsaSkpOwotICAgICAgZWxzZSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwibGlzdCBtdXN0IGNvbnRhaW4gc3RyaW5ncyIpOwotCWZyZWUoJHRhcmdldCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgfQotICAgICR0YXJnZXRbaV0gPSAwOwotICB9IGVsc2UgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIm5vdCBhIGxpc3QiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi0vLyBUaGlzIGNsZWFucyB1cCB0aGUgY2hhciAqKiBhcnJheSB3ZSBtYWxsb2MnZCBiZWZvcmUgdGhlIGZ1bmN0aW9uIGNhbGwKLSV0eXBlbWFwKHB5dGhvbixmcmVlYXJnKSBjaGFyICoqIHsKLSAgZnJlZSgoY2hhciAqKSAkc291cmNlKTsKLX0KLQotLy8gVGhpcyBhbGxvd3MgYSBDIGZ1bmN0aW9uIHRvIHJldHVybiBhIGNoYXIgKiogYXMgYSBQeXRob24gbGlzdAotJXR5cGVtYXAocHl0aG9uLG91dCkgY2hhciAqKiB7Ci0gIGludCBsZW4saTsKLSAgbGVuID0gMDsKLSAgd2hpbGUgKCRzb3VyY2VbbGVuXSkgbGVuKys7Ci0gICR0YXJnZXQgPSBQeUxpc3RfTmV3KGxlbik7Ci0gIGZvciAoaSA9IDA7IGkgJmx0OyBsZW47IGkrKykgewotICAgIFB5TGlzdF9TZXRJdGVtKCR0YXJnZXQsaSxQeVN0cmluZ19Gcm9tU3RyaW5nKCRzb3VyY2VbaV0pKTsKLSAgfQotfQotCi0vLyBOb3cgYSBmZXcgdGVzdCBmdW5jdGlvbnMKLSVpbmxpbmUgJXsKLWludCBwcmludF9hcmdzKGNoYXIgKiphcmd2KSB7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChhcmd2W2ldKSB7Ci0gICAgICAgICBwcmludGYoImFyZ3ZbJWRdID0gJXNcbiIsIGksYXJndltpXSk7Ci0gICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBpOwotfQotCi0vLyBSZXR1cm5zIGEgY2hhciAqKiBsaXN0IAotCi1jaGFyICoqZ2V0X2FyZ3MoKSB7Ci0gICAgc3RhdGljIGNoYXIgKnZhbHVlc1tdID0geyAiRGF2ZSIsICJNaWtlIiwgIlN1c2FuIiwgIkpvaG4iLCAiTWljaGVsbGUiLCAwfTsKLSAgICByZXR1cm4gJmFtcDt2YWx1ZXNbMF07Ci19Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHRoaXMgbW9kdWxlIGlzIGNvbXBpbGVkLCBvdXIgd3JhcHBlZCBDIGZ1bmN0aW9ucyBub3cgb3BlcmF0ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgZnJvbSBhcmd2IGltcG9ydCAqCi0mZ3Q7Jmd0OyZndDsgcHJpbnRfYXJncyhbIkRhdmUiLCJNaWtlIiwiTWFyeSIsIkphbmUiLCJKb2huIl0pCi1hcmd2WzBdID0gRGF2ZQotYXJndlsxXSA9IE1pa2UKLWFyZ3ZbMl0gPSBNYXJ5Ci1hcmd2WzNdID0gSmFuZQotYXJndls0XSA9IEpvaG4KLTUKLSZndDsmZ3Q7Jmd0OyBnZXRfYXJncygpCi1bYERhdmUnLCBgTWlrZScsIGBTdXNhbicsIGBKb2huJywgYE1pY2hlbGxlJ10KLSZndDsmZ3Q7Jmd0OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PdXIgdHlwZS1tYXBwaW5nIG1ha2VzIHRoZSBQeXRob24gaW50ZXJmYWNlIHRvIHRoZXNlIGZ1bmN0aW9ucyBtb3JlIG5hdHVyYWwgYW5kIGVhc3kgdG8gdXNlLiAgICAgPHA+Ci08YSBuYW1lPSJuNTkiPjwvYT48aDM+IENvbnZlcnRpbmcgYSBQeXRob24gZmlsZSBvYmplY3QgdG8gYSBGSUxFICo8L2gzPgotSW4gb3VyIHByZXZpb3VzIGV4YW1wbGUgaW52b2x2aW5nIGdkLTEuMiwgd2UgaGFkIHRvIHdyaXRlIHdyYXBwZXJzIGFyb3VuZCA8dHQ+Zm9wZW4oKTwvdHQ+IGFuZCA8dHQ+ZmNsb3NlKCk8L3R0PiBzbyB0aGF0IHdlIGNvdWxkIHByb3ZpZGUgZ2Qgd2l0aCBhIDx0dD5GSUxFICo8L3R0PiBwb2ludGVyLiAgSG93ZXZlciwgd2UgY291bGQgaGF2ZSB1c2VkIGEgdHlwZW1hcCBsaWtlIHRoaXMgaW5zdGVhZCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gVHlwZSBtYXBwaW5nIGZvciBncmFiYmluZyBhIEZJTEUgKiBmcm9tIFB5dGhvbgotCi0ldHlwZW1hcChweXRob24saW4pIEZJTEUgKiB7Ci0gIGlmICghUHlGaWxlX0NoZWNrKCRzb3VyY2UpKSB7Ci0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTmVlZCBhIGZpbGUhIik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotICAkdGFyZ2V0ID0gUHlGaWxlX0FzRmlsZSgkc291cmNlKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTm93LCB3ZSBjYW4gcmV3cml0ZSBvbmUgb2Ygb3VyIGVhcmxpZXIgZXhhbXBsZXMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIFNpbXBsZSBnZCBwcm9ncmFtCi0KLWZyb20gZ2QgaW1wb3J0ICoKLQotaW0gPSBnZEltYWdlQ3JlYXRlKDY0LDY0KQotYmxhY2sgPSBnZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwwLDAsMCkKLXdoaXRlID0gZ2RJbWFnZUNvbG9yQWxsb2NhdGUoaW0sMjU1LDI1NSwyNTUpCi1nZEltYWdlTGluZShpbSwwLDAsNjMsNjMsd2hpdGUpCi1mID0gb3BlbigidGVzdC5naWYiLCJ3IikgICAgICAgICAgICAgICAjIENyZWF0ZSBhIFB5dGhvbiBmaWxlIG9iamVjdAotZ2RJbWFnZUdpZihpbSxmKSAgICAgICAgICAgICAgICAgICAgICAgIyBQYXNzIHRvIGEgQyBmdW5jdGlvbiBhcyBGSUxFICoKLWYuY2xvc2UoKQotZ2RJbWFnZURlc3Ryb3koaW0pCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNjAiPjwvYT48aDM+IFVzaW5nIHR5cGVtYXBzIHRvIHJldHVybiBhcmd1bWVudHM8L2gzPgotQSBjb21tb24gcHJvYmxlbSBpbiBzb21lIEMgcHJvZ3JhbXMgaXMgdGhhdCB2YWx1ZXMgbWF5IGJlIHJldHVybmVkIGluIGFyZ3VtZW50cyByYXRoZXIgdGhhbiBpbiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogUmV0dXJucyBhIHN0YXR1cyB2YWx1ZSBhbmQgdHdvIHZhbHVlcyBpbiBvdXQxIGFuZCBvdXQyICovCi1pbnQgc3BhbShkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqb3V0MSwgZG91YmxlICpvdXQyKSB7Ci0JLi4uIERvIGEgYnVuY2ggb2Ygc3R1ZmYgLi4uCi0JKm91dDEgPSByZXN1bHQxOwotCSpvdXQyID0gcmVzdWx0MjsKLQlyZXR1cm4gc3RhdHVzOwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQSBuYW1lZCB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIGhhbmRsZSB0aGlzIGNhc2UgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBvdXRhcmcKLQotLy8gVGhpcyB0ZWxscyBTV0lHIHRvIHRyZWF0IGFuIGRvdWJsZSAqIGFyZ3VtZW50IHdpdGggbmFtZSAnT3V0VmFsdWUnIGFzCi0vLyBhbiBvdXRwdXQgdmFsdWUuICBXZSdsbCBhcHBlbmQgdGhlIHZhbHVlIHRvIHRoZSBjdXJyZW50IHJlc3VsdCB3aGljaCAKLS8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBMaXN0IG9iamVjdCBieSBTV0lHLgotCi0ldHlwZW1hcChweXRob24sYXJnb3V0KSBkb3VibGUgKk91dFZhbHVlIHsKLQlQeU9iamVjdCAqbzsKLQlvID0gUHlGbG9hdF9Gcm9tRG91YmxlKCokc291cmNlKTsKLQlpZiAoKCEkdGFyZ2V0KSB8fCAoJHRhcmdldCA9PSBQeV9Ob25lKSkgewotCQkkdGFyZ2V0ID0gbzsKLQl9IGVsc2UgewotCQlpZiAoIVB5TGlzdF9DaGVjaygkdGFyZ2V0KSkgewotCQkJUHlPYmplY3QgKm8yID0gJHRhcmdldDsKLQkJCSR0YXJnZXQgPSBQeUxpc3RfTmV3KDApOwotCQkJUHlMaXN0X0FwcGVuZCgkdGFyZ2V0LG8yKTsKLQkJCVB5X1hERUNSRUYobzIpOwotCQl9Ci0JCVB5TGlzdF9BcHBlbmQoJHRhcmdldCxvKTsKLQkJUHlfWERFQ1JFRihvKTsKLQl9Ci19Ci1pbnQgc3BhbShkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqT3V0VmFsdWUsIGRvdWJsZSAqT3V0VmFsdWUpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaXRoIHRoaXMgdHlwZW1hcCwgd2UgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFueSByZXN1bHQgZXhpc3RzLiAgSWYgc28sIHdlIHR1cm4gaXQgaW50byBhIGxpc3QgYW5kIGFwcGVuZCBvdXIgbmV3IG91dHB1dCB2YWx1ZSB0byBpdC4gICBJZiB0aGlzIGlzIHRoZSBvbmx5IHJlc3VsdCwgd2Ugc2ltcGx5IHJldHVybiBpdCBub3JtYWxseS4gRm9yIG91ciBzYW1wbGUgZnVuY3Rpb24sIHRoZXJlIGFyZSB0aHJlZSBvdXRwdXQgdmFsdWVzIHNvIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhIGxpc3Qgb2YgMyBlbGVtZW50cy4gICBBcyB3cml0dGVuLCBvdXIgZnVuY3Rpb24gbmVlZHMgdG8gdGFrZSA0IGFyZ3VtZW50cywgdGhlIGxhc3QgdHdvIGJlaW5nIHBvaW50ZXJzIHRvIGRvdWJsZXMuICAgV2UgbWF5IG5vdCB3YW50IHRvIHBhc3MgYW55dGhpbmcgaW50byB0aGVzZSBhcmd1bWVudHMgaWYgdGhleSBhcmUgb25seSB1c2VkIHRvIGhvbGQgb3V0cHV0IHZhbHVlcyBzbyB3ZSBjb3VsZCBjaGFuZ2UgdGhpcyBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0ldHlwZW1hcChweXRob24saWdub3JlKSBkb3VibGUgKk91dFZhbHVlKGRvdWJsZSB0ZW1wKSB7Ci0JJHRhcmdldCA9ICZhbXA7dGVtcDsgICAgICAgLyogQXNzaWduIHRoZSBwb2ludGVyIHRvIGEgbG9jYWwgdmFyaWFibGUgKi8KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCBpbiBhIFB5dGhvbiBzY3JpcHQsICB3ZSBjb3VsZCBkbyB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgYSA9IHNwYW0oNCw1KQotJmd0OyZndDsmZ3Q7IHByaW50IGEKLVswLCAyLjQ1LCA1LjBdCi0mZ3Q7Jmd0OyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42MSI+PC9hPjxoMz4gTWFwcGluZyBQeXRob24gdHVwbGVzIGludG8gc21hbGwgYXJyYXlzPC9oMz4KLUluIHNvbWUgYXBwbGljYXRpb25zLCBpdCBpcyBzb21ldGltZXMgZGVzaXJhYmxlIHRvIHBhc3Mgc21hbGwgYXJyYXlzIG9mIG51bWJlcnMgYXMgYXJndW1lbnRzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZXh0ZXJuIHZvaWQgc2V0X2RpcmVjdGlvbihkb3VibGUgYVs0XSk7ICAgICAgIC8vIFNldCBkaXJlY3Rpb24gdmVjdG9yCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgdG9vLCBjYW4gYmUgaGFuZGxlZCB1c2VkIHR5cGVtYXBzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEdyYWIgYSA0IGVsZW1lbnQgYXJyYXkgYXMgYSBQeXRob24gNC10dXBsZQotJXR5cGVtYXAocHl0aG9uLGluKSBkb3VibGVbNF0oZG91YmxlIHRlbXBbNF0pIHsgICAvLyB0ZW1wWzRdIGJlY29tZXMgYSBsb2NhbCB2YXJpYWJsZQotICBpbnQgaTsKLSAgaWYgKFB5VHVwbGVfQ2hlY2soJHNvdXJjZSkpIHsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoJHNvdXJjZSwiZGRkZCIsdGVtcCx0ZW1wKzEsdGVtcCsyLHRlbXArMykpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsInR1cGxlIG11c3QgaGF2ZSA0IGVsZW1lbnRzIik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgJHRhcmdldCA9ICZhbXA7dGVtcFswXTsKLSAgfSBlbHNlIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCJleHBlY3RlZCBhIHR1cGxlLiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgYWxsb3dzIG91ciA8dHQ+c2V0X2RpcmVjdGlvbjwvdHQ+IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmcm9tIFB5dGhvbiBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgc2V0X2RpcmVjdGlvbigoMC41LDAuMCwxLjAsLTAuMjUpKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TaW5jZSBvdXIgbWFwcGluZyBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGEgUHl0aG9uIHR1cGxlIGludG8gYSBDIGFycmF5LCBzdWNoIGFuIGFwcHJvYWNoIHdvdWxkIG5vdCBiZSByZWNvbW1lbmRlZCBmb3IgaHVnZSBhcnJheXMsIGJ1dCBmb3Igc21hbGwgc3RydWN0dXJlcywgdGhpcyBraW5kIG9mIHNjaGVtZSB3b3JrcyBmaW5lLjxwPgotPGEgbmFtZT0ibjYyIj48L2E+PGgzPiBBY2Nlc3NpbmcgYXJyYXkgc3RydWN0dXJlIG1lbWJlcnM8L2gzPgotQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2RlZmluZSBOQU1FTEVOICAgMzIKLXR5cGVkZWYgc3RydWN0IHsKLQljaGFyICAgbmFtZVtOQU1FTEVOXTsKLQkuLi4KLX0gUGVyc29uOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1CeSBkZWZhdWx0LCBTV0lHIGRvZXNuJ3Qga25vdyBob3cgdG8gdGhlIGhhbmRsZSB0aGUgbmFtZSBzdHJ1Y3R1cmUgc2luY2UgaXQncyBhbiBhcnJheSwgbm90IGEgcG9pbnRlci4gIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG1ha2UgdGhlIGFycmF5IG1lbWJlciByZWFkb25seS4gICAgSG93ZXZlciwgbWVtYmVyIHR5cGVtYXBzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdGhpcyBtZW1iZXIgd3JpdGFibGUgZnJvbSBQeXRob24gYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAobWVtYmVyaW4pIGNoYXJbTkFNRUxFTl0gewotCS8qIENvcHkgYXQgbW9zdCBOQU1FTEVOIGNoYXJhY3RlcnMgaW50byAkdGFyZ2V0ICovCi0Jc3RybmNweSgkdGFyZ2V0LCRzb3VyY2UsTkFNRUxFTik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW5ldmVyIGEgPHR0PmNoYXJbTkFNRUxFTl08L3R0PiB0eXBlIGlzIGVuY291bnRlcmVkIGluIGEgc3RydWN0dXJlIG9yIGNsYXNzLCB0aGlzIHR5cGVtYXAgcHJvdmlkZXMgYSBzYWZlIG1lY2hhbmlzbSBmb3Igc2V0dGluZyBpdHMgdmFsdWUuICAgQW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gbWlnaHQgY2hvb3NlIHRvIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIG5hbWUgd2FzIHRvbyBsb25nIHRvIGZpdCBpbnRvIHRoZSBmaWVsZC48cD4KLTxwPgotSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIDx0dD5bTkFNRUxFTl08L3R0PiBhcnJheSBzaXplIGlzIGF0dGFjaGVkIHRvIHRoZSB0eXBlbWFwLiBBIGRhdGF0eXBlIGludm9sdmluZyBzb21lIG90aGVyIGtpbmQgb2YgYXJyYXkgd291bGQgbm90IGJlIGFmZmVjdGVkLiAgIEhvd2V2ZXIsIHlvdSBjYW4gd3JpdGUgYSB0eXBlbWFwIHRvIG1hdGNoIGFueSBzaXplZCBhcnJheSB1c2luZyB0aGUgPHR0PkFOWTwvdHQ+IGtleXdvcmQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAobWVtYmVyaW4pIGNoYXIgW0FOWV0gewotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLCRkaW0wKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiwgPHR0PiRkaW0wPC90dD4gd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgcmVhbCBhcnJheSBkaW1lbnNpb24uICA8cD4KLTxhIG5hbWU9Im42MyI+PC9hPjxoMz4gVXNlZnVsIEZ1bmN0aW9uczwvaDM+Ci1XaGVuIHdyaXRpbmcgdHlwZW1hcHMsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byB3b3JrIGRpcmVjdGx5IHdpdGggUHl0aG9uIG9iamVjdHMgaW5zdGVhZCBvZiB1c2luZyB0aGUgY29udmVudGlvbmFsIDx0dD5QeUFyZ19QYXJzZVR1cGxlKCk8L3R0PiBmdW5jdGlvbiB0aGF0IGlzIHVzdWFsbHkgdXNlZCB3aGVuIHdyaXRpbmcgUHl0aG9uIGV4dGVuc2lvbnMuICAgSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHVzZWZ1bCBQeXRob24gZnVuY3Rpb25zIGF2YWlsYWJsZSBmb3IgeW91IHRvIHVzZS48cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjIucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjMucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjQucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjUucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjYucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g5LnRhYmxlLjcucG5nIj48YnI+Ci08L2NlbnRlcj48cD4KLTxwPgotPGEgbmFtZT0ibjY0Ij48L2E+PGgzPiBTdGFuZGFyZCAgdHlwZW1hcHM8L2gzPgotVGhlIGZvbGxvd2luZyB0eXBlbWFwcyBzaG93IGhvdyB0byBjb252ZXJ0IGEgZmV3IGNvbW1vbiBraW5kcyBvZiBvYmplY3RzIGJldHdlZW4gUHl0aG9uIGFuZCBDIChhbmQgdG8gZ2l2ZSBhIGJldHRlciBpZGVhIG9mIGhvdyB0eXBlbWFwcyB3b3JrKTxwPgotPGNlbnRlcj4KLTxpbWcgc3JjPSJjaDkudGFibGUuOC5wbmciPjxicj4KLTxpbWcgc3JjPSJjaDkudGFibGUuOS5wbmciPjxicj4KLTwvY2VudGVyPjxwPgotPHA+Ci08YSBuYW1lPSJuNjUiPjwvYT48aDM+IFBvaW50ZXIgaGFuZGxpbmc8L2gzPgotU1dJRyBwb2ludGVycyBhcmUgbWFwcGVkIGludG8gUHl0aG9uIHN0cmluZ3MgY29udGFpbmluZyB0aGUgaGV4YWRlY2ltYWwgdmFsdWUgYW5kIHR5cGUuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW5kIHJlYWQgcG9pbnRlciB2YWx1ZXMuPHA+Ci08Y2VudGVyPgotPGltZyBzcmM9ImNoOS50YWJsZS4xMC5wbmciPgotPC9jZW50ZXI+PHA+Ci08cD4KLVRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiB0eXBlbWFwcy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdHlwZW1hcCBtYWtlcyBhbiBhcmd1bWVudCBvZiAiPHR0PmNoYXIgKmJ1ZmZlcjwvdHQ+IiBhY2NlcHQgYSBwb2ludGVyIGluc3RlYWQgb2YgYSBOVUxMLXRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbixpbikgY2hhciAqYnVmZmVyIHsKLQlQeU9iamVjdCAqbzsKLQljaGFyICAgICAqc3RyOwotCWlmICghUHlTdHJpbmdfQ2hlY2sobykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwibm90IGEgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhvKTsKLQlpZiAoU1dJR19HZXRQdHIoc3RyLCAodm9pZCAqKikgJmFtcDskdGFyZ2V0LCAiJG1hbmdsZSIpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIm5vdCBhIHBvaW50ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3RlIHRoYXQgdGhlIDx0dD4kbWFuZ2xlPC90dD4gdmFyaWFibGUgZ2VuZXJhdGVzIHRoZSB0eXBlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGF0eXBlIHVzZWQgaW4gdGhlIHR5cGVtYXAuPHA+Ci08cD4KLUJ5IG5vdyB5b3UgaG9wZWZ1bGx5IGhhdmUgdGhlIGlkZWEgdGhhdCB0eXBlbWFwcyBhcmUgYSBwb3dlcmZ1bCBtZWNoYW5pc20gZm9yIGJ1aWxkaW5nIG1vcmUgc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgV2hpbGUgd3JpdGluZyB0eXBlbWFwcyBjYW4gYmUgdGVjaG5pY2FsLCBtYW55IGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gZm9yIHlvdS4gIFNlZSB0aGUgVHlwZW1hcHMgY2hhcHRlciBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyBsaWJyYXJ5IGZpbGVzLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgyPiBJbXBsZW1lbnRpbmcgQyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gUHl0aG9uPC9oMj4KLU5vdyB0aGF0IHlvdSdyZSBhbiBleHBlcnQsICB3ZSB3aWxsIGltcGxlbWVudCAgc2ltcGxlIEMgY2FsbGJhY2sgZnVuY3Rpb25zIGluIFB5dGhvbiBhbmQgdXNlIHRoZW0gaW4gYSBDKysgY29kZS48cD4KLTxwPgotTGV0J3Mgc2F5IHRoYXQgd2Ugd2FudGVkIHRvIHdyaXRlIGEgc2ltcGxlIEMrKyAyRCBwbG90dGluZyB3aWRnZXQgbGF5ZXJlZCBvbiB0b3Agb2YgdGhlIGdkLTEuMiBsaWJyYXJ5LiAgIEEgY2xhc3MgZGVmaW5pdGlvbiBtaWdodCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENyZWF0ZSBhIEMrKyBwbG90dGluZyAid2lkZ2V0IiB1c2luZyB0aGUgZ2QtMS4yIGxpYnJhcnkgYnkgVGhvbWFzIEJvdXRlbGwKLS8vICAKLS8vIFRoaXMgZXhhbXBsZSBwcmltYXJpbHkgaWxsdXN0cmF0ZXMgaG93IGNhbGxiYWNrIGZ1bmN0aW9ucyBjYW4gYmUKLS8vIGltcGxlbWVudGVkIGluIFB5dGhvbi4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiZ2QuaCIKLX0KLQotdHlwZWRlZiBkb3VibGUgKCpQTE9URlVOQykoZG91YmxlLCB2b2lkICopOwotCi1jbGFzcyBQbG90V2lkZ2V0IHsKLXByaXZhdGU6Ci0gIGRvdWJsZSAgICAgIHhtaW4seW1pbix4bWF4LHltYXg7ICAgICAgICAgLy8gUGxvdHRpbmcgcmFuZ2UKLSAgUExPVEZVTkMgICAgY2FsbGJhY2s7ICAgICAgICAgICAgICAgICAgICAvLyBDYWxsYmFjayBmdW5jdGlvbgotICB2b2lkICAgICAgICpjbGllbnRkYXRhOyAgICAgICAgICAgICAgICAgIC8vIENsaWVudCBkYXRhIGZvciBjYWxsYmFjawotICBpbnQgICAgICAgICBucG9pbnRzOyAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBwb2ludHMgdG8gcGxvdAotICBpbnQgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgIC8vIEltYWdlIHdpZHRoCi0gIGludCAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgLy8gSW1hZ2UgaGVpZ2h0Ci0gIGludCAgICAgICAgIGJsYWNrLHdoaXRlOyAgICAgICAgICAgICAgICAgLy8gU29tZSBjb2xvcnMKLSAgZ2RJbWFnZVB0ciAgaW07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbWFnZSBwb2ludGVyCi0gIHZvaWQgICAgICAgIHRyYW5zZm9ybShkb3VibGUsZG91YmxlLGludCZhbXA7LGludCZhbXA7KTsKLXB1YmxpYzoKLSAgUGxvdFdpZGdldChpbnQgdywgaW50IGgsZG91YmxlLGRvdWJsZSxkb3VibGUsZG91YmxlKTsKLSAgflBsb3RXaWRnZXQoKTsKLSAgdm9pZCBzZXRfbWV0aG9kKFBMT1RGVU5DIGZ1bmMsIHZvaWQgKmNsaWVudGRhdGEpOyAgICAvLyBTZXQgY2FsbGJhY2sgbWV0aG9kCi0gIHZvaWQgc2V0X3JhbmdlKGRvdWJsZSxkb3VibGUsZG91YmxlLGRvdWJsZSk7ICAgICAgICAgLy8gU2V0IHBsb3QgcmFuZ2UKLSAgdm9pZCBzZXRfcG9pbnRzKGludCBucCkge25wb2ludHMgPSBucDt9ICAgICAgICAgICAgICAvLyBTZXQgbnVtYmVyIG9mIHBvaW50cwotICB2b2lkIHBsb3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBwbG90Ci0gIHZvaWQgc2F2ZShGSUxFICpmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSBhIHBsb3QgdG8gZGlzawotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIHdpZGdldCBjbGFzcyBoaWRlcyBhbGwgb2YgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBzbyB0aGlzIGNvdWxkIGhhdmUganVzdCBhcyBlYXNpbHkgYmVlbiBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgT3BlbkdMLCBYMTEgb3Igc29tZSBvdGhlciBraW5kIG9mIGxpYnJhcnkuICAgV2hlbiB1c2VkIGluIEMrKywgdGhlIHdpZGdldCB3b3JrcyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFNpbXBsZSBtYWluIHByb2dyYW0gdG8gdGVzdCBvdXQgb3VyIHdpZGdldAotI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7Ci0jaW5jbHVkZSAid2lkZ2V0LmgiCi0jaW5jbHVkZSAmbHQ7bWF0aC5oJmd0OwotCi0vLyBDYWxsYmFjayBmdW5jdGlvbgotZG91YmxlIG15X2Z1bmMoZG91YmxlIGEsIHZvaWQgKmNsaWVudGRhdGEpIHsKLSAgcmV0dXJuIHNpbihhKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIFBsb3RXaWRnZXQgKnc7Ci0gIEZJTEUgKmY7Ci0KLSAgdyA9IG5ldyBQbG90V2lkZ2V0KDUwMCw1MDAsLTYuMywtMS41LDYuMywxLjUpOwotICB3LSZndDtzZXRfbWV0aG9kKG15X2Z1bmMsMCk7ICAgICAgICAgICAgICAvLyBTZXQgY2FsbGJhY2sgZnVuY3Rpb24KLSAgdy0mZ3Q7cGxvdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBwbG90Ci0gIGYgPSBmb3BlbigicGxvdC5naWYiLCJ3Iik7Ci0gIHctJmd0O3NhdmUoZik7Ci0gIGZjbG9zZShmKTsKLSAgcHJpbnRmKCJ3cm90ZSBwbG90LmdpZlxuIik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdyBzdXBwb3NlIHRoYXQgd2Ugd2FudGVkIHRvIHVzZSBvdXIgd2lkZ2V0IGludGVyYWN0aXZlbHkgZnJvbSBQeXRob24uICBXaGlsZSBwb3NzaWJsZSwgaXQgaXMgZ29pbmcgdG8gYmUgZGlmZmljdWx0IGJlY2F1c2Ugd2Ugd291bGQgcmVhbGx5IGxpa2UgdG8gaW1wbGVtZW50IHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbiBQeXRob24sIG5vdCBDKysuICAgV2UgYWxzbyBkb24ndCB3YW50IHRvIGdvIGluIGFuZCBoYWNrIG9yIEMrKyBjb2RlIHRvIHN1cHBvcnQgdGhpcy4gICBGb3J0dW5hdGVseSwgeW91IGNhbiBkbyBpdCB3aXRoIFNXSUcgdXNpbmcgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gU1dJRyBpbnRlcmZhY2UgdG8gb3VyIFBsb3RXaWRnZXQgCi0lbW9kdWxlIHBsb3R3aWRnZXQKLSV7Ci0jaW5jbHVkZSAid2lkZ2V0LmgiCi0lfQotCi0vLyBHcmFiIGEgUHl0aG9uIGZ1bmN0aW9uIG9iamVjdCBhcyBhIFB5dGhvbiBvYmplY3QuCi0ldHlwZW1hcChweXRob24saW4pIFB5T2JqZWN0ICpweWZ1bmMgewotICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soJHNvdXJjZSkpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOZWVkIGEgY2FsbGFibGUgb2JqZWN0ISIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgJHRhcmdldCA9ICRzb3VyY2U7Ci19Ci0KLS8vIFR5cGUgbWFwcGluZyBmb3IgZ3JhYmJpbmcgYSBGSUxFICogZnJvbSBQeXRob24KLSV0eXBlbWFwKHB5dGhvbixpbikgRklMRSAqIHsKLSAgaWYgKCFQeUZpbGVfQ2hlY2soJHNvdXJjZSkpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOZWVkIGEgZmlsZSEiKTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0gICR0YXJnZXQgPSBQeUZpbGVfQXNGaWxlKCRzb3VyY2UpOwotfQotCi0vLyBHcmFiIHRoZSBjbGFzcyBkZWZpbml0aW9uCi0laW5jbHVkZSB3aWRnZXQuaAotCi0lewotLyogVGhpcyBmdW5jdGlvbiBtYXRjaGVzIHRoZSBwcm90b3R5cGUgb2YgdGhlIG5vcm1hbCBDIGNhbGxiYWNrCi0gICBmdW5jdGlvbiBmb3Igb3VyIHdpZGdldC4gSG93ZXZlciwgd2UgdXNlIHRoZSBjbGllbnRkYXRhIHBvaW50ZXIKLSAgIGZvciBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIGEgUHl0aG9uIGNhbGxhYmxlIG9iamVjdC4gKi8KLQotc3RhdGljIGRvdWJsZSBQeXRob25DYWxsQmFjayhkb3VibGUgYSwgdm9pZCAqY2xpZW50ZGF0YSkKLXsKLSAgIFB5T2JqZWN0ICpmdW5jLCAqYXJnbGlzdDsKLSAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICBkb3VibGUgICAgZHJlcyA9IDA7Ci0gICAKLSAgIGZ1bmMgPSAoUHlPYmplY3QgKikgY2xpZW50ZGF0YTsgICAgICAgICAgICAgICAvLyBHZXQgUHl0aG9uIGZ1bmN0aW9uCi0gICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiKGQpIixhKTsgICAgICAgICAgICAgLy8gQnVpbGQgYXJndW1lbnQgbGlzdAotICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYyxhcmdsaXN0KTsgICAgIC8vIENhbGwgUHl0aG9uCi0gICBQeV9ERUNSRUYoYXJnbGlzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhc2ggYXJnbGlzdAotICAgaWYgKHJlc3VsdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIGVycm9ycywgcmV0dXJuIGRvdWJsZQotICAgICBkcmVzID0gUHlGbG9hdF9Bc0RvdWJsZShyZXN1bHQpOwotICAgfQotICAgUHlfWERFQ1JFRihyZXN1bHQpOwotICAgcmV0dXJuIGRyZXM7Ci19Ci0lfQotCi0vLyBBdHRhY2ggYSBuZXcgbWV0aG9kIHRvIG91ciBwbG90IHdpZGdldCBmb3IgYWRkaW5nIFB5dGhvbiBmdW5jdGlvbnMKLSVhZGRtZXRob2RzIFBsb3RXaWRnZXQgewotICAgLy8gU2V0IGEgUHl0aG9uIGZ1bmN0aW9uIG9iamVjdCBhcyBhIGNhbGxiYWNrIGZ1bmN0aW9uCi0gICAvLyBOb3RlIDogUHlPYmplY3QgKnB5ZnVuYyBpcyByZW1hcHBlZCB3aXRoIGEgdHlwZW1wYXAKLSAgIHZvaWQgc2V0X3B5bWV0aG9kKFB5T2JqZWN0ICpweWZ1bmMpIHsKLSAgICAgc2VsZi0mZ3Q7c2V0X21ldGhvZChQeXRob25DYWxsQmFjaywgKHZvaWQgKikgcHlmdW5jKTsKLSAgICAgUHlfSU5DUkVGKHB5ZnVuYyk7Ci0gICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIHRoaXMgaXMgY2VydGFpbmx5IG5vdCBhIHRyaXZpYWwgU1dJRyBpbnRlcmZhY2UgZmlsZSwgIHRoZSByZXN1bHRzIGFyZSBxdWl0ZSBjb29sLiAgTGV0J3MgdHJ5IG91dCBvdXIgbmV3IFB5dGhvbiBtb2R1bGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgTm93IHVzZSBvdXIgcGxvdHRpbmcgd2lkZ2V0IGluIHZhcmlldHkgb2Ygd2F5cwotCi1mcm9tIHBsb3R3aWRnZXQgaW1wb3J0ICoKLWZyb20gbWF0aCBpbXBvcnQgKgotCi0jIE1ha2UgYSBwbG90IHVzaW5nIGEgbm9ybWFsIFB5dGhvbiBmdW5jdGlvbiBhcyBhIGNhbGxiYWNrCi1kZWYgZnVuYzEoeCk6Ci0JcmV0dXJuIDAuNSpzaW4oeCkrMC4yNSpzaW4oMip4KSswLjEyNSpjb3MoNCp4KQotCi1wcmludCAiTWFraW5nIHBsb3QxLmdpZi4uLiIKLSMgTWFrZSBhIHdpZGdldCBhbmQgc2V0IGNhbGxiYWNrCi13ID0gUGxvdFdpZGdldCg1MDAsNTAwLC0xMCwtMiwxMCwyKQotdy5zZXRfcHltZXRob2QoZnVuYzEpICAgICAgICAgICAgICAgICAgICAgIyBSZWdpc3RlciBvdXIgUHl0aG9uIGZ1bmN0aW9uCi13LnBsb3QoKQotZiA9IG9wZW4oInBsb3QxLmdpZiIsInciKQotdy5zYXZlKGYpCi1mLmNsb3NlKCkKLQotIyBNYWtlIGEgcGxvdCB1c2luZyBhbiBhbm9ueW1vdXMgZnVuY3Rpb24KLQotcHJpbnQgIk1ha2luZyBwbG90Mi5naWYuLi4iCi13MSA9IFBsb3RXaWRnZXQoNTAwLDUwMCwtNCwtMSw0LDE2KQotdzEuc2V0X3B5bWV0aG9kKGxhbWJkYSB4OiB4KngpICAgICAgICAgICAgIyBSZWdpc3RlciB4XjIgYXMgYSBjYWxsYmFjawotdzEucGxvdCgpCi1mID0gb3BlbigicGxvdDIuZ2lmIiwidyIpCi13MS5zYXZlKGYpCi1mLmNsb3NlKCkKLQotIyBNYWtlIGFub3RoZXIgcGxvdCB1c2luZyBhIGJ1aWx0LWluIGZ1bmN0aW9uCi0KLXByaW50ICJNYWtpbmcgcGxvdDMuZ2lmLi4uIgotdzIgPSBQbG90V2lkZ2V0KDUwMCw1MDAsLTcsLTEuNSw3LDEuNSkKLXcyLnNldF9weW1ldGhvZChzaW4pICAgICAgICAgICAgICAgICAgICAgICMgUmVnaXN0ZXIgc2luKHgpIGFzIGEgY2FsbGJhY2sKLXcyLnBsb3QoKQotZiA9IG9wZW4oInBsb3QzLmdpZiIsInciKQotdzIuc2F2ZShmKQotZi5jbG9zZSgpCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTxwPgotVGhlICJwbG90IiBtZXRob2QgZm9yIGVhY2ggd2lkZ2V0IGlzIHdyaXR0ZW4gZW50aXJlbHkgaW4gQysrIGFuZCBhc3N1bWVzIHRoYXQgaXQgaXMgY2FsbGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdyaXR0ZW4gaW4gQy9DKysuICAgTGl0dGxlIGRvZXMgaXQga25vdyB0aGF0IHdlIGhhdmUgYWN0dWFsbHkgaW1wbGVtZW50ZWQgdGhpcyBmdW5jdGlvbiBpbiBQeXRob24uICAgV2l0aCBhIGxpdHRsZSBtb3JlIHdvcmssIHdlIGNhbiBldmVuIHdyaXRlIGEgc2ltcGxlIGZ1bmN0aW9uIHBsb3R0aW5nIHRvb2wgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgUGxvdCBhIGZ1bmN0aW9uIGFuZCBzcGF3biB4dgotCi1pbXBvcnQgcG9zaXgKLWltcG9ydCBzeXMKLWltcG9ydCBzdHJpbmcKLWZyb20gcGxvdHdpZGdldCBpbXBvcnQgKgotZnJvbSBtYXRoIGltcG9ydCAqCi0KLWxpbmUgPSByYXdfaW5wdXQoIkVudGVyIGEgZnVuY3Rpb24gb2YgeCA6ICIpCi1yYW5nZXMgPSBzdHJpbmcuc3BsaXQocmF3X2lucHV0KCJFbnRlciB4bWluLHltaW4seG1heCx5bWF4IDoiKSwiLCIpCi0KLXByaW50ICJNYWtpbmcgYSBwbG90Li4uIgotdyA9IFBsb3RXaWRnZXQoNTAwLDUwMCxzdHJpbmcuYXRvZihyYW5nZXNbMF0pLHN0cmluZy5hdG9mKHJhbmdlc1sxXSksCi0gICAgICAgICAgICAgICBzdHJpbmcuYXRvZihyYW5nZXNbMl0pLHN0cmluZy5hdG9mKHJhbmdlc1szXSkpCi0KLSMgVHVybiB1c2VyIGlucHV0IGludG8gYSBQeXRob24gZnVuY3Rpb24KLWNvZGUgPSAiZGVmIGZ1bmMoeCk6IHJldHVybiAiICsgbGluZQotZXhlYyhjb2RlKQotCi13LnNldF9weW1ldGhvZChmdW5jKQotdy5wbG90KCkKLWYgPSBvcGVuKCJwbG90LmdpZiIsInciKQotdy5zYXZlKGYpCi1mLmNsb3NlKCkKLXBvc2l4LnN5c3RlbSgieHYgcGxvdC5naWYgJmFtcDsiKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDI+IE90aGVyIG9kZHMgYW5kIGVuZHM8L2gyPgotPGEgbmFtZT0ibjY2Ij48L2E+PGgzPiBBZGRpbmcgbmF0aXZlIFB5dGhvbiBmdW5jdGlvbnMgdG8gYSBTV0lHIG1vZHVsZTwvaDM+Ci1Tb21ldGltZXMgaXQgaXMgZGVzaXJhYmxlIHRvIGFkZCBhIG5hdGl2ZSBQeXRob24gbWV0aG9kIHRvIGEgU1dJRyB3cmFwcGVyIGZpbGUuICBTdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgUHl0aG9uL0MgZnVuY3Rpb24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlB5T2JqZWN0ICpzcGFtX3N5c3RlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLQljaGFyICpjb21tYW5kOwotCWludCBzdHM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsInMiLCZhbXA7Y29tbWFuZCkpCi0JCXJldHVybiBOVUxMOwotCXN0cyA9IHN5c3RlbShjb21tYW5kKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsc3RzKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBmdW5jdGlvbiBjYW4gYmUgYWRkZWQgdG8gYSBTV0lHIG1vZHVsZSB1c2luZyB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbmF0aXZlKHN5c3RlbSkgc3BhbV9zeXN0ZW07ICAgICAgICAvLyBDcmVhdGUgYSBjb21tYW5kIGNhbGxlZCBgc3lzdGVtJwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgZnVsbCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBsaWtlIHRoaXMgPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW5hdGl2ZShzeXN0ZW0pIFB5T2JqZWN0ICpzcGFtX3N5c3RlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1vcjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVuYXRpdmUoc3lzdGVtKSBleHRlcm4gUHlPYmplY3QgKnNwYW1fc3lzdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncyk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTMiPjwvYT48aDI+IFRoZSBnb3J5IGRldGFpbHMgb2Ygc2hhZG93IGNsYXNzZXM8L2gyPgotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgcHJvY2VzcyBieSB3aGljaCBTV0lHIGNyZWF0ZXMgc2hhZG93IGNsYXNzZXMgYW5kIHNvbWUgb2YgdGhlIG1vcmUgc3VidGxlIGFzcGVjdHMgb2YgdXNpbmcgdGhlbS48cD4KLTxhIG5hbWU9Im42NyI+PC9hPjxoMz4gQSBzaW1wbGUgc2hhZG93IGNsYXNzPC9oMz4KLUNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gZnJvbSBvdXIgcHJldmlvdXMgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBwZGUKLXN0cnVjdCBHcmlkMmQgewotICBHcmlkMmQoaW50IG5pLCBpbnQgbmopOwotICB+R3JpZDJkKCk7Ci0gIGRvdWJsZSAqKmRhdGE7Ci0gIGludCAgICAgIHhwb2ludHM7Ci0gIGludCAgICAgIHlwb2ludHM7Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgU1dJRyBnZW5lcmF0ZWQgY2xhc3MgZm9yIHRoaXMgc3RydWN0dXJlIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBTV0lHLgotaW1wb3J0IHBkZWMKLWNsYXNzIEdyaWQyZFB0ciA6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsdGhpcyk6Ci0gICAgICAgIHNlbGYudGhpcyA9IHRoaXMKLSAgICAgICAgc2VsZi50aGlzb3duID0gMAotICAgIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnRoaXNvd24gPT0gMSA6Ci0gICAgICAgICAgICBwZGVjLmRlbGV0ZV9HcmlkMmQoc2VsZi50aGlzKQotICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLG5hbWUsdmFsdWUpOgotICAgICAgICBpZiBuYW1lID09ICJkYXRhIiA6Ci0gICAgICAgICAgICBwZGVjLkdyaWQyZF9kYXRhX3NldChzZWxmLnRoaXMsdmFsdWUpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgbmFtZSA9PSAieHBvaW50cyIgOgotICAgICAgICAgICAgcGRlYy5HcmlkMmRfeHBvaW50c19zZXQoc2VsZi50aGlzLHZhbHVlKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIG5hbWUgPT0gInlwb2ludHMiIDoKLSAgICAgICAgICAgIHBkZWMuR3JpZDJkX3lwb2ludHNfc2V0KHNlbGYudGhpcyx2YWx1ZSkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLl9fZGljdF9fW25hbWVdID0gdmFsdWUKLSAgICBkZWYgX19nZXRhdHRyX18oc2VsZixuYW1lKToKLSAgICAgICAgaWYgbmFtZSA9PSAiZGF0YSIgOiAKLSAgICAgICAgICAgIHJldHVybiBwZGVjLkdyaWQyZF9kYXRhX2dldChzZWxmLnRoaXMpCi0gICAgICAgIGlmIG5hbWUgPT0gInhwb2ludHMiIDogCi0gICAgICAgICAgICByZXR1cm4gcGRlYy5HcmlkMmRfeHBvaW50c19nZXQoc2VsZi50aGlzKQotICAgICAgICBpZiBuYW1lID09ICJ5cG9pbnRzIiA6IAotICAgICAgICAgICAgcmV0dXJuIHBkZWMuR3JpZDJkX3lwb2ludHNfZ2V0KHNlbGYudGhpcykKLSAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X19bbmFtZV0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAiJmx0O0MgR3JpZDJkIGluc3RhbmNlJmd0OyIKLWNsYXNzIEdyaWQyZChHcmlkMmRQdHIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZzAsYXJnMSkgOgotICAgICAgICBzZWxmLnRoaXMgPSBwZGVjLm5ld19HcmlkMmQoYXJnMCxhcmcxKQotICAgICAgICBzZWxmLnRoaXNvd24gPSAxCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42OCI+PC9hPjxoMz4gTW9kdWxlIG5hbWVzPC9oMz4KLVNoYWRvdyBjbGFzc2VzIGFyZSBidWlsdCB1c2luZyB0aGUgbG93LWxldmVsIFNXSUcgZ2VuZXJhdGVkIEMgaW50ZXJmYWNlLiAgVGhpcyBpbnRlcmZhY2UgaXMgbmFtZWQgIm1vZHVsZWMiIHdoZXJlICJtb2R1bGUiIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIGEgU1dJRyBpbnRlcmZhY2UgZmlsZS4gICBUaGUgUHl0aG9uIGNvZGUgZm9yIHRoZSBzaGFkb3cgY2xhc3NlcyBpcyBjcmVhdGVkIGluIGEgZmlsZSAibW9kdWxlLnB5Ii4gIFRoaXMgaXMgdGhlIGZpbGUgdGhhdCBzaG91bGQgYmUgbG9hZGVkIHdoZW4gYSB1c2VyIHdhbnRzIHRvIHVzZSB0aGUgbW9kdWxlLjxwPgotPGEgbmFtZT0ibjY5Ij48L2E+PGgzPiBUd28gY2xhc3NlczwvaDM+Ci1Gb3IgZWFjaCBzdHJ1Y3R1cmUgb3IgY2xhc3MgZm91bmQgaW4gYW4gaW50ZXJmYWNlIGZpbGUsIFNXSUcgY3JlYXRlcyB0d28gUHl0aG9uIGNsYXNzZXMuICBJZiBhIGNsYXNzIGlzIG5hbWVkICI8dHQ+R3JpZDJkPC90dD4iLCBvbmUgb2YgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIG5hbWVkICI8dHQ+R3JpZDJkUHRyPC90dD4iIGFuZCB0aGUgb3RoZXIgbmFtZWQgIjx0dD5HcmlkMmQ8L3R0PiIuICBUaGUgPHR0PkdyaWQyZFB0cjwvdHQ+IGNsYXNzIGlzIHVzZWQgdG8gdHVybiB3cmFwIGEgUHl0aG9uIGNsYXNzIGFyb3VuZCBhbiBhbHJlYWR5IHByZWV4aXN0aW5nIDx0dD5HcmlkMmQ8L3R0PiBwb2ludGVyLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyBncHRyID0gY3JlYXRlX2dyaWQyZCgpICAgICAgICAgIyBSZXR1cm5zIGEgR3JpZDJkIGZyb20gc29tZXdoZXJlCi0mZ3Q7Jmd0OyZndDsgZyA9IEdyaWQyZFB0cihncHRyKSAgICAgICAgICAgICMgVHVybiBpdCBpbnRvIGEgUHl0aG9uIGNsYXNzCi0mZ3Q7Jmd0OyZndDsgZy54cG9pbnRzCi01MAotJmd0OyZndDsmZ3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+R3JpZDJkPC90dD4gY2xhc3MsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyB1c2VkIHdoZW4geW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IDx0dD5HcmlkMmQ8L3R0PiBvYmplY3QgZnJvbSBQeXRob24uICAgSW4gcmVhbGl0eSwgaXQgaW5oZXJpdHMgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIGEgPHR0PkdyaWQyZFB0cjwvdHQ+LCBleGNlcHQgdGhhdCBpdHMgY29uc3RydWN0b3IgY2FsbHMgdGhlIGNvcnJlc3BvbmRpbmcgQysrIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3QuICAgIFRodXMsIGluIFB5dGhvbiwgdGhpcyB3b3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyBnID0gR3JpZDJkKDUwLDUwKSAgICAgICAgICAgIyBDcmVhdGUgYSBuZXcgR3JpZDJkCi0mZ3Q7Jmd0OyZndDsgZy54cG9pbnRzCi01MAotJmd0OyZndDsmZ3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgdHdvIGNsYXNzIG1vZGVsIGlzIGEgdHJhZGVvZmYuICBJbiBvcmRlciB0byBzdXBwb3J0IEMvQysrIHByb3Blcmx5LCBpdCBpcyBuZWNlc3NhcnkgdG8gYmUgYWJsZSB0byBjcmVhdGUgUHl0aG9uIG9iamVjdHMgZnJvbSBib3RoIHByZS1leGlzdGluZyBDKysgb2JqZWN0cyBhbmQgdG8gY3JlYXRlIGVudGlyZWx5IG5ldyBDKysgb2JqZWN0cyBpbiBQeXRob24uICAgV2hpbGUgdGhpcyBtaWdodCBiZSBhY2NvbXBsaXNoZWQgdXNpbmcgYSBzaW5nbGUgY2xhc3MsIGl0IHdvdWxkIGNvbXBsaWNhdGUgdGhlIGhhbmRsaW5nIG9mIGNvbnN0cnVjdG9ycyBjb25zaWRlcmFibHkuICBUaGUgdHdvIGNsYXNzIG1vZGVsLCBvbiB0aGUgb3RoZXIgaGFuZCwgd29ya3MsIGlzIGNvbnNpc3RlbnQsIGFuZCBpcyByZWxhdGl2ZWx5IGVhc3kgdG8gdXNlLiAgIEluIHByYWN0aWNlLCB5b3UgcHJvYmFibHkgd29uJ3QgZXZlbiBiZSBhd2FyZSB0aGF0IHRoZXJlIGFyZSB0d28gY2xhc3NlcyB3b3JraW5nIGJlaGluZCB0aGUgc2NlbmVzLjxwPgotPGEgbmFtZT0ibjcwIj48L2E+PGgzPiBUaGUgdGhpcyBwb2ludGVyPC9oMz4KLVdpdGhpbiBlYWNoIHNoYWRvdyBjbGFzcywgdGhlIG1lbWJlciAiPHR0PnRoaXM8L3R0PiIgY29udGFpbnMgdGhlIGFjdHVhbCBDL0MrKyBwb2ludGVyIHRvIHRoZSBvYmplY3QuICBZb3UgY2FuIGNoZWNrIHRoaXMgb3V0IHlvdXJzZWxmIGJ5IHR5cGluZyBzb21ldGhpbmcgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgZyA9IEdyaWQyZCg1MCw1MCkKLSZndDsmZ3Q7Jmd0OyBwcmludCBnLnRoaXMKLV8xMDA4ZmU4X0dyaWQyZF9wCi0mZ3Q7Jmd0OyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRGlyZWN0IG1hbmlwdWxhdGlvbiBvZiB0aGUgIjx0dD50aGlzPC90dD4iIHBvaW50ZXIgaXMgZ2VuZXJhbGx5IGRpc2NvdXJhZ2VkLiBJbiBmYWN0IGZvcmdldCB0aGF0IHlvdSByZWFkIHRoaXMuPHA+Ci08YSBuYW1lPSJuNzEiPjwvYT48aDM+IE9iamVjdCBvd25lcnNoaXA8L2gzPgotT3duZXJzaGlwIGlzIGEgY3JpdGljYWwgaXNzdWUgd2hlbiBtaXhpbmcgQysrIGFuZCBQeXRob24uICBGb3IgZXhhbXBsZSwgc3VwcG9zZSBJIGNyZWF0ZSBhIG5ldyBvYmplY3QgaW4gQysrLCBidXQgbGF0ZXIgdXNlIGl0ICB0byBjcmVhdGUgYSBQeXRob24gb2JqZWN0LiAgSWYgdGhhdCBvYmplY3QgaXMgYmVpbmcgdXNlZCBlbHNld2hlcmUgaW4gdGhlIEMrKyBjb2RlLCB3ZSBjbGVhcmx5IGRvbid0IHdhbnQgUHl0aG9uIHRvIGRlbGV0ZSB0aGUgQysrIG9iamVjdCB3aGVuIHRoZSBQeXRob24gb2JqZWN0IGlzIGRlbGV0ZWQuICBTaW1pbGFybHksIHdoYXQgaWYgSSBjcmVhdGUgYSBuZXcgb2JqZWN0IGluIFB5dGhvbiwgYnV0IEMrKyBzYXZlcyBhIHBvaW50ZXIgdG8gaXQgYW5kIHN0YXJ0cyB1c2luZyBpdCByZXBlYXRlZGx5LiAgQ2xlYXJseSwgd2UgbmVlZCBzb21lIG5vdGlvbiBvZiB3aG8gb3ducyB3aGF0LiAgU2luY2Ugc29ydGluZyBvdXQgYWxsIG9mIHRoZSBwb3NzaWJpbGl0aWVzIGlzIHByb2JhYmx5IGltcG9zc2libGUsIFNXSUcgc2hhZG93IGNsYXNzZXMgYWx3YXlzIGhhdmUgYW4gYXR0cmlidXRlICI8dHQ+dGhpc293bjwvdHQ+IiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBQeXRob24gb3ducyBhbiBvYmplY3QuICBXaGVuZXZlciBhbiBvYmplY3QgaXMgY3JlYXRlZCBpbiBQeXRob24sIFB5dGhvbiB3aWxsIGJlIGdpdmVuIG93bmVyc2hpcCBieSBzZXR0aW5nIDx0dD50aGlzb3duIDwvdHQ+IHRvIDx0dD4gMTwvdHQ+LiAgV2hlbiBhIFB5dGhvbiBjbGFzcyBpcyBjcmVhdGVkIGZyb20gYSBwcmUtZXhpc3RpbmcgQy9DKysgcG9pbnRlciwgb3duZXJzaGlwIGlzIGFzc3VtZWQgdG8gYmVsb25nIHRvIHRoZSBDL0MrKyBjb2RlIGFuZCA8dHQ+dGhpc293bjwvdHQ+IHdpbGwgYmUgc2V0IHRvIDAuPHA+Ci08cD4KLU93bmVyc2hpcCBvZiBhbiBvYmplY3QgY2FuIGJlIGNoYW5nZWQgYXMgbmVjZXNzYXJ5IGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiA8dHQ+dGhpc293bjwvdHQ+LiAgV2hlbiBzZXQsIFB5dGhvbiB3aWxsIGNhbGwgdGhlIEMvQysrIGRlc3RydWN0b3Igd2hlbiB0aGUgb2JqZWN0IGlzIGRlbGV0ZWQuICAgSWYgaXQgaXMgemVybywgUHl0aG9uIHdpbGwgbmV2ZXIgY2FsbCB0aGUgQy9DKysgZGVzdHJ1Y3Rvci48cD4KLTxhIG5hbWU9Im43MiI+PC9hPjxoMz4gQ29uc3RydWN0b3JzIGFuZCBEZXN0cnVjdG9yczwvaDM+Ci1DKysgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyB3aWxsIGJlIG1hcHBlZCBpbnRvIFB5dGhvbidzIDx0dD5fX2luaXRfXzwvdHQ+IGFuZCAgPHR0Pl9fZGVsX188L3R0PiBtZXRob2RzIHJlc3BlY3RpdmVseS4gIFNoYWRvdyBjbGFzc2VzIGFsd2F5cyBjb250YWluIHRoZXNlIG1ldGhvZHMgZXZlbiBpZiBubyBjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMgd2VyZSBhdmFpbGFibGUgaW4gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUuICBUaGUgUHl0aG9uIGRlc3RydWN0b3Igd2lsbCBvbmx5IGNhbGwgYSBDL0MrKyBkZXN0cnVjdG9yIGlmIDx0dD5zZWxmLnRoaXNvd248L3R0PiBpcyBzZXQuPHA+Ci08YSBuYW1lPSJuNzMiPjwvYT48aDM+IE1lbWJlciBkYXRhPC9oMz4KLU1lbWJlciBkYXRhIG9mIGFuIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIFB5dGhvbidzIDx0dD5fX2dldGF0dHJfXzwvdHQ+IGFuZCA8dHQ+X19zZXRhdHRyX188L3R0PiBtZXRob2RzLjxwPgotPGEgbmFtZT0ibjc0Ij48L2E+PGgzPiBQcmludGluZzwvaDM+Ci1TV0lHIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIFB5dGhvbjx0dD4gX19yZXByX188L3R0PiBtZXRob2QgZm9yIGVhY2ggY2xhc3MuICBUaGlzIGZvcmNlcyB0aGUgY2xhc3MgdG8gYmUgcmVsYXRpdmVseSB3ZWxsLWJlaGF2ZWQgd2hlbiBwcmludGluZyBvciBiZWluZyB1c2VkIGludGVyYWN0aXZlbHkgaW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlci48cD4KLTxhIG5hbWU9Im43NSI+PC9hPjxoMz4gU2hhZG93IEZ1bmN0aW9uczwvaDM+Ci1TdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHZlY3Rvcgotc3RydWN0IFZlY3RvciB7Ci0JVmVjdG9yKCk7Ci0JflZlY3RvcigpOwotCWRvdWJsZSB4LHksejsKLX07Ci0KLVZlY3RvciBhZGR2KFZlY3RvciBhLCBWZWN0b3IgYik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUJ5IGRlZmF1bHQsIHRoZSBmdW5jdGlvbiA8dHQ+YWRkdjwvdHQ+IHdpbGwgb3BlcmF0ZSBvbiA8dHQ+VmVjdG9yPC90dD4gcG9pbnRlcnMsIG5vdCBQeXRob24gY2xhc3Nlcy4gIEhvd2V2ZXIsIHRoZSBTV0lHIFB5dGhvbiBtb2R1bGUgaXMgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhhdCA8dHQ+VmVjdG9yPC90dD4gaGFzIGJlZW4gd3JhcHBlZCBpbnRvIGEgUHl0aG9uIGNsYXNzIHNvIGl0IHdpbGwgY3JlYXRlIHRoZSBmb2xsb3dpbmcgcmVwbGFjZW1lbnQgZm9yIHRoZSA8dHQ+YWRkdigpPC90dD4gZnVuY3Rpb24uPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZGVmIGFkZHYoYSxiKToKLQlyZXN1bHQgPSBWZWN0b3JQdHIodmVjdG9yYy5hZGR2KGEudGhpcyxiLnRoaXMpKQotCXJlc3VsdC50aGlzb3duID0gMQotCXJldHVybiByZXN1bHQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRnVuY3Rpb24gYXJndW1lbnRzIGFyZSBtb2RpZmllZCB0byB1c2UgdGhlICJ0aGlzIiBwb2ludGVyIG9mIGEgUHl0aG9uIFZlY3RvciBvYmplY3QuICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgcmVzdWx0IHdoaWNoIGhhcyBiZWVuIGFsbG9jYXRlZCBieSBtYWxsb2Mgb3IgbmV3ICh0aGlzIGJlaGF2aW9yIGlzIGRlc2NyaWJlZCBpbiB0aGUgY2hhcHRlciBvbiBTV0lHIGJhc2ljcyksIHNvIHdlIHNpbXBseSBjcmVhdGUgYSBuZXcgVmVjdG9yUHRyIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gIFNpbmNlIHRoZSByZXN1bHQgaW52b2x2ZWQgYW4gaW1wbGljaXQgbWFsbG9jLCB3ZSBzZXQgdGhlIG93bmVyc2hpcCB0byAxIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzdWx0IGlzIHRvIGJlIG93bmVkIGJ5IFB5dGhvbiBhbmQgdGhhdCBpdCBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIHRoZSBQeXRob24gb2JqZWN0IGlzIGRlbGV0ZWQuICBBcyBhIHJlc3VsdCwgb3BlcmF0aW9ucyBsaWtlIHRoaXMgIGFyZSBwZXJmZWN0bHkgbGVnYWwgYW5kIHJlc3VsdCBpbiBubyBtZW1vcnkgbGVha3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyB2ID0gYWRkKGFkZChhZGQoYWRkKGEsYiksYyksZCksZSkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU3Vic3RpdHV0aW9uIG9mIGNvbXBsZXggZGF0YXR5cGVzIG9jY3VycyBmb3IgYWxsIGZ1bmN0aW9ucyBhbmQgbWVtYmVyIGZ1bmN0aW9ucyBpbnZvbHZpbmcgc3RydWN0dXJlIG9yIGNsYXNzIGRlZmluaXRpb25zLiAgSXQgaXMgcmFyZWx5IG5lY2Vzc2FyeSB0byB1c2UgdGhlIGxvdy1sZXZlbCBDIGludGVyZmFjZSB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3Nlcy48cD4KLTxhIG5hbWU9Im43NiI+PC9hPjxoMz4gTmVzdGVkIG9iamVjdHM8L2gzPgotU1dJRyBzaGFkb3cgY2xhc3NlcyBzdXBwb3J0IG5lc3Rpbmcgb2YgY29tcGxleCBvYmplY3RzLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCB0aGUgZm9sbG93aW5nIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHBhcnRpY2xlCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgVmVjdG9yKCk7Ci0gIGRvdWJsZSB4LHksejsKLX0gVmVjdG9yOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFBhcnRpY2xlKCk7Ci0gflBhcnRpY2xlKCk7Ci0gIFZlY3RvciByOwotICBWZWN0b3IgdjsKLSAgVmVjdG9yIGY7Ci0gIGludCAgICB0eXBlOwotfSBQYXJ0aWNsZTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JbiB0aGlzIGNhc2UgeW91IHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgbWVtYmVycyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgcCA9IFBhcnRpY2xlKCkKLSZndDsmZ3Q7Jmd0OyBwLnIueCA9IDAuMAotJmd0OyZndDsmZ3Q7IHAuci55ID0gLTEuNQotJmd0OyZndDsmZ3Q7IHAuci56ID0gMi4wCi0mZ3Q7Jmd0OyZndDsgcC52ID0gYWRkdih2MSx2MikKLSZndDsmZ3Q7Jmd0OyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTmVzdGluZyBvZiBvYmplY3RzIGlzIGltcGxlbWVudGVkIHVzaW5nIFB5dGhvbidzPHR0PiBfX3NldGF0dHJfXzwvdHQ+IGFuZCA8dHQ+X19nZXRhdHRyX188L3R0PiBmdW5jdGlvbnMuIEluIHRoaXMgY2FzZSwgdGhleSB3b3VsZCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Y2xhc3MgUGFydGljbGVQdHI6Ci0JLi4uCi0JZGVmIF9fZ2V0YXR0cl9fKHNlbGYsbmFtZSk6Ci0JCWlmIG5hbWUgPT0gInIiOgotCQkJcmV0dXJuIHBhcnRpY2xlYy5WZWN0b3JQdHIoUGFydGljbGVfcl9nZXQoc2VsZi50aGlzKSkKLQkJZWxpZiBuYW1lID09ICJ2IjoKLQkJCXJldHVybiBwYXJ0aWNsZWMuVmVjdG9yUHRyKFBhcnRpY2xlX3ZfZ2V0KHNlbGYudGhpcykpCi0JCS4uLgotCQotCWRlZiBfX3NldGF0dHJfXyhzZWxmLG5hbWUsdmFsdWUpOgotCQlpZiBuYW1lID09ICJyIjoKLQkJCXBhcnRpY2xlYy5QYXJ0aWNsZV9yX3NldChzZWxmLnRoaXMsdmFsdWUudGhpcykKLQkJZWxpZiBuYW1lID09ICJ2IjoKLQkJCXBhcnRpY2xlYy5QYXJ0aWNsZV92X3NldChzZWxmLnRoaXMsdmFsdWUudGhpcykKLQkJLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBhdHRyaWJ1dGVzIG9mIGFueSBnaXZlbiBvYmplY3QgYXJlIG9ubHkgY29udmVydGVkIGludG8gYSBQeXRob24gb2JqZWN0IHdoZW4gcmVmZXJlbmNlZC4gVGhpcyBhcHByb2FjaCBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIGZhc3RlciBpZiB5b3UgaGF2ZSBhIGxhcmdlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IGFyZW4ndCBleGFtaW5lZCB2ZXJ5IG9mdGVuLCBhbmQgd29ya3Mgd2l0aCByZWN1cnNpdmUgc3RydWN0dXJlIGRlZmluaXRpb25zIHN1Y2ggYXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN0cnVjdCBOb2RlIHsKLQljaGFyICpuYW1lOwotCXN0cnVjdCBOb2RlICpuZXh0OwotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTmVzdGVkIHN0cnVjdHVyZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIGFyZSBhbHNvIHN1cHBvcnRlZCBieSBTV0lHLiBUaGVzZSB0eXBlcyBvZiBzdHJ1Y3R1cmVzIHRlbmQgdG8gYXJpc2UgZnJlcXVlbnRseSBpbiBkYXRhYmFzZSBhbmQgaW5mb3JtYXRpb24gcHJvY2Vzc2luZyBhcHBsaWNhdGlvbnMuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBzdHJ1Y3QgeyAgCi0JdW5zaWduZWQgaW50IGRhdGFUeXBlOwotCXVuaW9uIHsKLQkJaW50ICAgICAgIGludHZhbDsKLQkJZG91YmxlICAgIGRvdWJsZXZhbDsKLQkJY2hhciAgICAgKmNoYXJ2YWw7Ci0JCXZvaWQgICAgICpwdHJ2YWx1ZTsKLQkJbG9uZyAgICAgIGxvbmd2YWw7Ci0JCXN0cnVjdCB7Ci0JCQlpbnQgICAgaTsKLQkJCWRvdWJsZSBmOwotCQkJdm9pZCAgICp2OwotCQkJY2hhciBuYW1lWzMyXTsKLSAgICAgICAgICAgICAgfSB2OwotCX0gdTsKLX0gVmFsdWVTdHJ1Y3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFjY2VzcyBpcyBwcm92aWRlZCBpbiBhbiBlbnRpcmVseSBuYXR1cmFsIG1hbm5lciw8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgdiA9IG5ld19WYWx1ZVN0cnVjdCgpICAgICAgICMgQ3JlYXRlIGEgVmFsdWVTdHJ1Y3Qgc29tZWhvdwotJmd0OyZndDsmZ3Q7IHYuZGF0YVR5cGUKLTEKLSZndDsmZ3Q7Jmd0OyB2LnUuaW50dmFsCi00NQotJmd0OyZndDsmZ3Q7IHYudS5sb25ndmFsCi00NQotJmd0OyZndDsmZ3Q7IHYudS52LnYgPSBfMF92b2lkX3AKLSZndDsmZ3Q7Jmd0OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyBzdXBwb3J0IHRoZSBlbWJlZGRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMsIFNXSUcgaGFzIHRvIGV4dHJhY3QgdGhlIGludGVybmFsIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhbmQgdXNlIHRoZW0gdG8gY3JlYXRlIG5ldyBQeXRob24gY2xhc3Nlcy4gIEluIHRoaXMgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzaGFkb3cgY2xhc3NlcyBhcmUgY3JlYXRlZCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBDbGFzcyBjb3JyZXNwb25kaW5nIHRvIHVuaW9uIHUgbWVtYmVyCi1jbGFzcyBWYWx1ZVN0cnVjdF91IDoKLQkuLi4KLSMgQ2xhc3MgY29ycmVzcG9uZGluZyB0byBzdHJ1Y3QgdiBtZW1iZXIgb2YgdW5pb24gdQotY2xhc3MgVmFsdWVTdHJ1Y3RfdV92IDoKLQkuLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIG5hbWVzIG9mIHRoZSBuZXcgY2xhc3NlcyBhcmUgZm9ybWVkIGJ5IGFwcGVuZGluZyB0aGUgbWVtYmVyIG5hbWVzIG9mIGVhY2ggZW1iZWRkZWQgc3RydWN0dXJlLjxwPgotPGEgbmFtZT0ibjc3Ij48L2E+PGgzPiBJbmhlcml0YW5jZSBhbmQgc2hhZG93IGNsYXNzZXM8L2gzPgotU2luY2Ugc2hhZG93IGNsYXNzZXMgYXJlIGltcGxlbWVudGVkIGluIFB5dGhvbiwgeW91IGNhbiB1c2UgYW55IG9mIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBjbGFzc2VzIGFzIGEgYmFzZSBjbGFzcyBmb3IgbW9yZSBQeXRob24gY2xhc3Nlcy4gIEhvd2V2ZXIsIHlvdSBuZWVkIHRvIGJlIGV4dHJlbWVseSBjYXJlZnVsIHdoZW4gdXNpbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBXaGVuIG11bHRpcGxlIGluaGVyaXRhbmNlIGlzIHVzZWQsIGF0IG1vc3QgT05FIFNXSUcgZ2VuZXJhdGVkIHNoYWRvdyBjbGFzcyBjYW4gYmUgaW52b2x2ZWQuICBJZiBtdWx0aXBsZSBTV0lHIGdlbmVyYXRlZCBjbGFzc2VzIGFyZSB1c2VkIGluIGEgbXVsdGlwbGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LCB5b3Ugd2lsbCBnZXQgbmFtZSBjbGFzaGVzIG9uIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIsIHRoZSA8dHQ+X19nZXRhdHRyX188L3R0PiBhbmQgPHR0Pl9fc2V0YXR0cl9fPC90dD4gZnVuY3Rpb25zIHdvbid0IHdvcmsgcHJvcGVybHkgYW5kIHRoZSB3aG9sZSB0aGluZyB3aWxsIHByb2JhYmx5IGNyYXNoIGFuZCBidXJuLiBQZXJoYXBzIGl0J3MgYmVzdCB0byB0aGluayBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZSBhcyBhIGJpZyBoYW1tZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzb2x2ZSBhbG90IG9mIHByb2JsZW1zLCBidXQgaXQgaHVydHMgcXVpdGUgYWxvdCBpZiB5b3UgYWNjaWRlbnRseSBkcm9wIGl0IG9uIHlvdXIgZm9vdC4uLi4gPHA+Ci08YSBuYW1lPSJuNzgiPjwvYT48aDM+IE1ldGhvZHMgdGhhdCByZXR1cm4gbmV3IG9iamVjdHM8L2gzPgotQnkgZGVmYXVsdCBTV0lHIGFzc3VtZXMgdGhhdCBjb25zdHJ1Y3RvcnMgYXJlIHRoZSBvbmx5IGZ1bmN0aW9ucyByZXR1cm5pbmcgbmV3IG9iamVjdHMgdG8gUHl0aG9uLiAgSG93ZXZlciwgeW91IG1heSBoYXZlIG90aGVyIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgb2JqZWN0cyBhcyB3ZWxsLiAgRm9yIGV4YW1wbGUgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLVZlY3RvciAqY3Jvc3NfcHJvZHVjdChWZWN0b3IgKnYxLCBWZWN0b3IgKnYyKSB7Ci0JVmVjdG9yICpyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JcmVzdWx0ID0gLi4uIGNvbXB1dGUgY3Jvc3MgcHJvZHVjdCAuLi4KLQlyZXR1cm4gcmVzdWx0OwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHRoZSB2YWx1ZSBpcyByZXR1cm5lZCB0byBQeXRob24sIHdlIHdhbnQgUHl0aG9uIHRvIGFzc3VtZSBvd25lcnNoaXAuICBUaGUgYnJ1dGUgZm9yY2Ugd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2ltcGx5IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhpc293bi4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgdiA9IGNyb3NzX3Byb2R1Y3QoYSxiKQotJmd0OyZndDsmZ3Q7IHYudGhpc293biA9IDEgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdyBQeXRob24gb3ducyBpdAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1VbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIHVnbHkgYW5kIGl0IGRvZXNuJ3Qgd29yayBpZiB3ZSB1c2UgdGhlIHJlc3VsdCBhcyBhICB0ZW1wb3JhcnkgdmFsdWUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPncgPSB2ZWN0b3JfYWRkKGNyb3NzX3Byb2R1Y3QoYSxiKSxjKSAgICAgIyBSZXN1bHRzIGluIGEgbWVtb3J5IGxlYWsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSG93ZXZlciwgeW91IGNhbiBwcm92aWRlIGEgaGludCB0byBTV0lHIHdoZW4gd29ya2luZyB3aXRoIHN1Y2ggYSBmdW5jdGlvbiBhcyBzaG93biA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gQyBGdW5jdGlvbiByZXR1cm5pbmcgYSBuZXcgb2JqZWN0Ci0lbmV3IFZlY3RvciAqY3Jvc3NfcHJvZHVjdChWZWN0b3IgKnYxLCBWZWN0b3IgKnYyKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD4lbmV3PC90dD4gZGlyZWN0aXZlIG9ubHkgcHJvdmlkZXMgYSBoaW50IHRoYXQgdGhlIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIG5ldyBvYmplY3QuICBUaGUgUHl0aG9uIG1vZHVsZSB3aWxsIGFzc2lnbiBwcm9wZXIgb3duZXJzaGlwIG9mIHRoZSBvYmplY3Qgd2hlbiB0aGlzIGlzIHVzZWQuPHA+Ci08YSBuYW1lPSJuNzkiPjwvYT48aDM+IFBlcmZvcm1hbmNlIGNvbmNlcm5zIGFuZCBoaW50czwvaDM+Ci1TaGFkb3cgY2xhc3NpbmcgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlIGEgY29udmVuaWVudCB3YXkgb2YgYWNjZXNzaW5nIEMvQysrIG9iamVjdHMgZnJvbSBQeXRob24uICAgSG93ZXZlciwgaWYgeW91J3JlIGRpcmVjdGx5IG1hbmlwdWxhdGluZyBodWdlIGFycmF5cyBvZiBjb21wbGV4IG9iamVjdHMgZnJvbSBQeXRob24sIHBlcmZvcm1hbmNlIG1heSBzdWZmZXIgZ3JlYXRseS4gIEluIHRoZXNlIGNhc2VzLCB5b3Ugc2hvdWxkIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGUgZnVuY3Rpb25zIGluIEMgb3IgdGhpbmtpbmcgb2Ygd2F5cyB0byBvcHRpbWl6ZSB0aGUgcHJvYmxlbS48cD4KLTxwPgotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHdheXMgdG8gb3B0aW1pemUgcHJvZ3JhbXMgdGhhdCB1c2Ugc2hhZG93IGNsYXNzZXMuICBDb25zaWRlciB0aGUgZm9sbG93aW5nICB0d28gY29kZSBmcmFnbWVudHMgaW52b2x2aW5nIHRoZSA8dHQ+UGFydGljbGU8L3R0PiBkYXRhIHN0cnVjdHVyZSBpbiBhIHByZXZpb3VzIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRlZiBmb3JjZTEocDEscDIpOgotCWR4ID0gcDIuci54IC0gcDEuci54Ci0JZHkgPSBwMi5yLnkgLSBwMS5yLnkKLQlkeiA9IHAyLnIueiAtIHAxLnIuegotCXIyID0gZHgqZHggKyBkeSpkeSArIGR6KmR6Ci0JZiA9IDEuMC8ocjIqbWF0aC5zcXJ0KHIyKSkKLQlwMS5mLnggPSBwMS5mLnggKyBmKmR4Ci0JcDIuZi54ID0gcDIuZi54IC0gZipkeAotCXAxLmYueSA9IHAxLmYueSArIGYqZHkKLQlwMi5mLnkgPSBwMi5mLnkgLSBmKmR5Ci0JcDEuZi56ID0gcDEuZi56ICsgZipkegotCXAyLmYueiA9IHAyLmYueiAtIGYqZHoKLQotZGVmIGZvcmNlMihwMSxwMik6Ci0JcjEgPSBwMS5yCi0JcjIgPSBwMi5yCi0JZHggPSByMi54IC0gcjEueAotCWR5ID0gcjIueSAtIHIxLnkKLQlkeiA9IHIyLnogLSByMS56Ci0JcjIgPSBkeCpkeCArIGR5KmR5ICsgZHoqZHoKLQlmID0gMS4wLyhyMiptYXRoLnNxcnQocjIpKQotCWYxID0gcDEuZgotCWYyID0gcDIuZgotCWYxLnggPSBmMS54ICsgZipkeAotCWYyLnggPSBmMi54IC0gZipkeAotCWYxLnkgPSBmMS55ICsgZipkeQotCWYyLnkgPSBmMi55IC0gZipkeQotCWYxLnogPSBmMS56ICsgZipkegotCWYyLnogPSBmMi56IC0gZipkegotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZmlyc3QgY2FsY3VsYXRpb24gc2ltcGx5IHdvcmtzIHdpdGggZWFjaCBQYXJ0aWNsZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuICBVbmZvcnR1bmF0ZWx5LCBpdCBwZXJmb3JtcyBhbG90IG9mIGRlcmVmZXJlbmNpbmcgb2Ygb2JqZWN0cy4gIElmIHRoZSBjYWxjdWxhdGlvbiBpcyByZXN0cnVjdHVyZWQgdG8gdXNlIHRlbXBvcmFyeSB2YXJpYWJsZXMgYXMgc2hvd24gaW4gZm9yY2UyLCBpdCB3aWxsIHJ1biBzaWduaWZpY2FudGx5IGZhc3Rlci0taW4gZmFjdCwgb24gbXkgbWFjaGluZSwgdGhlIHNlY29uZCBjb2RlIGZyYWdtZW50IHJ1bnMgbW9yZSB0aGFuIHR3aWNlIGFzIGZhc3QgYXMgdGhlIGZpcnN0IG9uZS48cD4KLTxwPgotSWYgcGVyZm9ybWFuY2UgaXMgZXZlbiBtb3JlIGNyaXRpY2FsIHlvdSBjYW4gdXNlIHRoZSBsb3ctbGV2ZWwgQyBpbnRlcmZhY2Ugd2hpY2ggZWxpbWluYXRlcyBhbGwgb2YgdGhlIG92ZXJoZWFkIG9mIGdvaW5nIHRocm91Z2ggUHl0aG9uJ3MgY2xhc3MgbWVjaGFuaXNtIChhdCB0aGUgZXhwZW5zZSBvZiBjb2Rpbmcgc2ltcGxpY2l0eSkuIFdoZW4gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIGFyZSB1c2VkLCB0aGUgbG93IGxldmVsIEMgaW50ZXJmYWNlIGNhbiBzdGlsbCBiZSB1c2VkIGJ5IGltcG9ydGluZyB0aGUgYG1vZHVsZWMnIG1vZHVsZSB3aGVyZSBgbW9kdWxlJyBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHlvdSB1c2VkIGluIHRoZSBTV0lHIGludGVyZmFjZSBmaWxlLjxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDc6MDcgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvU1dJRy5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9TV0lHLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWI2ZGEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9TV0lHLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg2ICswLDAgQEAKLTwhLS0gUHVibGlzaGVkIGJ5IFF1YWRyYWxheSBXZWJXb3JrcyBIVE1MIExpdGUgMS41LjEgLS0+Ci08IS0tIEFuZCBtdW5nZWQgYnkgRGF2ZSdzIHNwZWNpYWwgUHl0aG9uIHNjcmlwdCAtLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+U1dJRyBCYXNpY3M8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxhIG5hbWU9Im4wIj48L2E+PGgxPjMgU1dJRyBCYXNpY3M8L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5SdW5uaW5nIFNXSUc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMiI+U2ltcGxlIEMgZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGFuZCBjb25zdGFudHM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMyI+UG9pbnRlcnMgYW5kIGNvbXBsZXggb2JqZWN0czwvYT4KLTxsaT4gPGEgaHJlZj0iI240Ij5HZXR0aW5nIGRvd24gdG8gYnVzaW5lc3M8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+U3RydWN0dXJlcywgdW5pb25zLCBhbmQgb2JqZWN0IG9yaWVudGVkIEMgcHJvZ3JhbW1pbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNiI+QysrIHN1cHBvcnQ8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNyI+T2JqZWN0aXZlLUM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuOCI+Q29uZGl0aW9uYWwgY29tcGlsYXRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuOSI+Q29kZSBJbnNlcnRpb248L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPkEgZ2VuZXJhbCBpbnRlcmZhY2UgYnVpbGRpbmcgc3RyYXRlZ3k8L2E+Ci08L3VsPgotCi08YSBuYW1lPSJuMSI+PC9hPjxoMj4gUnVubmluZyBTV0lHPC9oMj4KLVNXSUcgaXMgaW52b2tlZCBieSB0aGUgPHR0PnN3aWc8L3R0PiBjb21tYW5kLiBUaGlzIGNvbW1hbmQgaGFzIGEgbnVtYmVyIG9mIG9wdGlvbnMgaW5jbHVkaW5nOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN3aWcgJmx0O29wdGlvbnMmZ3Q7IGZpbGVuYW1lCi0KLS10Y2wgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBUY2wgd3JhcHBlcnMKLS10Y2w4ICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBUY2wgOC4wIHdyYXBwZXJzCi0tcGVybCAgICAgICAgICAgICAgICAgR2VuZXJhdGUgUGVybDUgd3JhcHBlcnMKLS1weXRob24gICAgICAgICAgICAgICBHZW5lcmF0ZSBQeXRob24gd3JhcHBlcnMKLS1wZXJsNCAgICAgICAgICAgICAgICBHZW5lcmF0ZSBQZXJsNCB3cmFwcGVycwotLWd1aWxlICAgICAgICAgICAgICAgIEdlbmVyYXRlIEd1aWxlIHdyYXBwZXJzCi0tZGFzY2lpICAgICAgICAgICAgICAgQVNDSUkgZG9jdW1lbnRhdGlvbgotLWRsYXRleCAgICAgICAgICAgICAgIExhVGVYIGRvY3VtZW50YXRpb24KLS1kaHRtbCAgICAgICAgICAgICAgICBIVE1MIGRvY3VtZW50YXRpb24KLS1kbm9uZSAgICAgICAgICAgICAgICBObyBkb2N1bWVudGF0aW9uCi0tYysrICAgICAgICAgICAgICAgICAgRW5hYmxlIEMrKyBoYW5kbGluZwotLW9iamMgICAgICAgICAgICAgICAgIEVuYWJsZSBPYmplY3RpdmUtQyBoYW5kbGluZy4KLS1JZGlyICAgICAgICAgICAgICAgICBTZXQgU1dJRyBpbmNsdWRlIGRpcmVjdG9yeQotLWxmaWxlICAgICAgICAgICAgICAgIEluY2x1ZGUgYSBTV0lHIGxpYnJhcnkgZmlsZS4KLS1jICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSByYXcgd3JhcHBlciBjb2RlIChvbWl0IHN1cHBvcnRpbmcgY29kZSkKLS12ICAgICAgICAgICAgICAgICAgICBWZXJib3NlIG1vZGUgKHBlcmhhcHMgb3Zlcmx5IHZlcmJvc2UpCi0tbyBvdXRmaWxlICAgICAgICAgICAgTmFtZSBvZiBvdXRwdXQgZmlsZQotLWQgZG9jZmlsZSAgICAgICAgICAgIFNldCBuYW1lIG9mIGRvY3VtZW50YXRpb24gZmlsZSAod2l0aG91dCBzdWZmaXgpCi0tbW9kdWxlIG5hbWUgICAgICAgICAgU2V0IG5hbWUgb2YgU1dJRyBtb2R1bGUKLS1Ec3ltYm9sICAgICAgICAgICAgICBEZWZpbmUgYSBzeW1ib2wKLS12ZXJzaW9uICAgICAgICAgICAgICBTaG93IFNXSUcncyB2ZXJzaW9uIG51bWJlcgotLWhlbHAgICAgICAgICAgICAgICAgIERpc3BsYXkgYWxsIG9wdGlvbnMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBpcyBvbmx5IGEgcGFydGlhbCBsaXN0IG9mIG9wdGlvbnMuIEEgZnVsbCBsaXN0aW5nIG9mIG9wdGlvbnMgY2FuIGJlIG9idGFpbmVkIGJ5IGludm9raW5nICI8dHQ+c3dpZyAtaGVscDwvdHQ+Ii4gRWFjaCB0YXJnZXQgbGFuZ3VhZ2UgbWF5IGhhdmUgYWRkaXRpb25hbCBvcHRpb25zIHdoaWNoIGNhbiBiZSBkaXNwbGF5ZWQgdXNpbmcgIjx0dD5zd2lnIC1sYW5nIC1oZWxwPC90dD4iIHdoZXJlIDx0dD4tbGFuZzwvdHQ+IGlzIG9uZSBvZiB0aGUgdGFyZ2V0IGxhbmd1YWdlcyBhYm92ZS48cD4KLTxhIG5hbWU9Im4xMSI+PC9hPjxoMz4gSW5wdXQgZm9ybWF0PC9oMz4KLUFzIGlucHV0LCBTV0lHIHRha2VzIGEgZmlsZSBjb250YWluaW5nIEFOU0kgQy9DKysgZGVjbGFyYXRpb25zLiBUaGlzIGZpbGUgbWF5IGJlIGEgc3BlY2lhbCAiaW50ZXJmYWNlIGZpbGUiICh1c3VhbGx5IGdpdmVuIGEgLmkgc3VmZml4KSwgYSBDIGhlYWRlciBmaWxlIG9yIGEgQyBzb3VyY2UgZmlsZS4gVGhlIG1vc3QgY29tbW9uIG1ldGhvZCBvZiB1c2luZyBTV0lHIGlzIHdpdGggYSBzcGVjaWFsIGludGVyZmFjZSBmaWxlLiBUaGVzZSBmaWxlcyBjb250YWluIEFOU0kgQyBkZWNsYXJhdGlvbnMgbGlrZSBhIGhlYWRlciBmaWxlLCBidXQgYWxzbyBjb250YWluIFNXSUcgZGlyZWN0aXZlcyBhbmQgZG9jdW1lbnRhdGlvbi4gSW50ZXJmYWNlIGZpbGVzIHVzdWFsbHkgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdCA6PHA+Ci08cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIG15bW9kdWxlIAotJXsKLSNpbmNsdWRlICJteWhlYWRlci5oIgotJX0KLS8vIE5vdyBsaXN0IEFOU0kgQyB2YXJpYWJsZSBhbmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgKGlmIHN1cHBsaWVkKSBtdXN0IGFsd2F5cyBhcHBlYXIgYmVmb3JlIHRoZSBmaXJzdCBDIGRlY2xhcmF0aW9uIG9yIGJlIHN1cHBsaWVkIG9uIHRoZSBTV0lHIGNvbW1hbmQgbGluZSB1c2luZyB0aGUgPHR0Pi1tb2R1bGU8L3R0PiBvcHRpb24gKFdoZW4gdGhlIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCB3aWxsIG92ZXJyaWRlIGFueSBtb2R1bGUgbmFtZSBwcmVzZW50IGluIGEgZmlsZSkuIEV2ZXJ5dGhpbmcgaW5zaWRlIHRoZSA8dHQ+JXssJTwvdHQ+fSBibG9jayBpcyBjb3BpZWQgdmVyYmF0aW0gaW50byB0aGUgcmVzdWx0aW5nIG91dHB1dCBmaWxlLiBUaGUgPHR0PiV7LCV9PC90dD4gYmxvY2sgaXMgb3B0aW9uYWwsIGJ1dCBtb3N0IGludGVyZmFjZSBmaWxlcyB1c2Ugb25lIHRvIGluY2x1ZGUgdGhlIHByb3BlciBoZWFkZXIgZmlsZXMuPHA+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDM+IFNXSUcgT3V0cHV0PC9oMz4KLUJ5IGRlZmF1bHQgYW4gaW50ZXJmYWNlIGZpbGUgd2l0aCB0aGUgbmFtZSA8dHQ+bXlmaWxlLmk8L3R0PiB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gYSBmaWxlIGNhbGxlZCA8dHQ+bXlmaWxlX3dyYXAuYzwvdHQ+LiBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIDx0dD4tbzwvdHQ+IG9wdGlvbi4gV2hlbiB3b3JraW5nIHdpdGggc29tZSBDKysgY29tcGlsZXJzLCB0aGUgPHR0Pi1vPC90dD4gb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIG91dHB1dCBmaWxlIGEgcHJvcGVyIEMrKyBzdWZmaXguIFRoZSBvdXRwdXQgZmlsZSB1c3VhbGx5IGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBpcyBuZWVkZWQgdG8gYnVpbGQgYSB3b3JraW5nIG1vZHVsZSBmb3IgdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuIENvbXBpbGUgaXQgYWxvbmcgd2l0aCB5b3VyIEMgcHJvZ3JhbSwgbGluayBpdCwgYW5kIHlvdSBzaG91bGQgYmUgcmVhZHkgdG8gcnVuLjxwPgotPGEgbmFtZT0ibjEzIj48L2E+PGgzPiBDb21tZW50czwvaDM+Ci1DIGFuZCBDKysgc3R5bGUgY29tbWVudHMgbWF5IGJlIHBsYWNlZCBpbiBpbnRlcmZhY2UgZmlsZXMsIGJ1dCB0aGVzZSBhcmUgdXNlZCB0byBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gc2VjdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMuIE90aGVyd2lzZSwgU1dJRyB0aHJvd3Mgb3V0IGFsbCBjb21tZW50cyBzbyB5b3UgY2FuIHVzZSBhIEMrKyBzdHlsZSBjb21tZW50IGV2ZW4gaWYgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGZpbGUgaXMgY29tcGlsZWQgd2l0aCB0aGUgQyBjb21waWxlci4gPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDM+IEMgUHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXM8L2gzPgotU1dJRyBkb2VzIG5vdCBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLiBJZiB5b3VyIGlucHV0IGZpbGUgbWFrZXMgZXh0ZW5zaXZlIHVzZSBvZiB0aGUgQyBwcmVwcm9jZXNzb3IsIFNXSUcgd2lsbCBwcm9iYWJseSBoYXRlIGl0LiBIb3dldmVyLCBTV0lHIGRvZXMgcmVjb2duaXplIGEgZmV3IEMgcHJlcHJvY2Vzc29yIGNvbnN0cnVjdHMgdGhhdCBhcmUgcXVpdGUgY29tbW9uIGluIEMgY29kZSA6PHA+Ci08cD4KLTx1bD4KLTxsaT48dHQ+I2RlZmluZTwvdHQ+LiBVc2VkIHRvIGNyZWF0ZSBjb25zdGFudHMKLTxsaT48dHQ+I2lmZGVmLCNpZm5kZWYsI2Vsc2UsI2VuZGlmPC90dD4sIDx0dD4jaWYsICNlbGlmPC90dD4uIFVzZWQgZm9yIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uCi08L3VsPgotPHA+Ci1BbGwgb3RoZXIgQyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBhcmUgaWdub3JlZCBieSBTV0lHIChpbmNsdWRpbmcgbWFjcm9zIGNyZWF0ZWQgdXNpbmcgPHR0PiNkZWZpbmU8L3R0PikuIDxwPgotPGEgbmFtZT0ibjE1Ij48L2E+PGgzPiBTV0lHIERpcmVjdGl2ZXM8L2gzPgotU1dJRyBkaXJlY3RpdmVzIGFyZSBhbHdheXMgcHJlY2VkZWQgYnkgYSAiPHR0PiU8L3R0PiIgdG8gZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIG5vcm1hbCBDIGRpcmVjdGl2ZXMgYW5kIGRlY2xhcmF0aW9ucy4gVGhlcmUgYXJlIGFib3V0IHR3byBkb3plbiBkaWZmZXJlbnQgZGlyZWN0aXZlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdpdmUgU1dJRyBoaW50cywgcHJvdmlkZSBhbm5vdGF0aW9uLCBhbmQgY2hhbmdlIFNXSUcncyBiZWhhdmlvciBpbiBzb21lIHdheSBvciBhbm90aGVyLiA8cD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gTGltaXRhdGlvbnMgaW4gdGhlIFBhcnNlciAoYW5kIHZhcmlvdXMgdGhpbmdzIHRvIGtlZXAgaW4gbWluZCk8L2gzPgotSXQgd2FzIG5ldmVyIG15IGludGVudCB0byB3cml0ZSBhIGZ1bGwgQy9DKysgcGFyc2VyLiBUaGVyZWZvcmUgU1dJRyBoYXMgYSBudW1iZXIgb2YgbGltaXRhdGlvbnMgdG8ga2VlcCBpbiBtaW5kLjxwPgotPHA+Ci08dWw+Ci08bGk+RnVuY3Rpb25zIHdpdGggdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cyAoaWUuICIuLi4iKSBhcmUgbm90IHN1cHBvcnRlZC4KLTxsaT5Db21wbGV4IGRlY2xhcmF0aW9ucyBzdWNoIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBhcnJheXMgYXJlIHByb2JsZW1hdGljLiBZb3UgbWF5IG5lZWQgdG8gcmVtb3ZlIHRoZXNlIGZyb20gdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgb3IgaGlkZSB0aGVtIHdpdGggYSB0eXBlZGVmLgotPGxpPkMrKyBzb3VyY2UgY29kZSAod2hhdCB3b3VsZCBhcHBlYXIgaW4gYSAuQyBmaWxlKSBpcyBlc3BlY2lhbGx5IHByb2JsZW1hdGljLiBSdW5uaW5nIFNXSUcgb24gQysrIHNvdXJjZSBjb2RlIGlzIGhpZ2hseSBkaXNjb3VyYWdlZC4KLTxsaT5Nb3JlIHNvcGhpc3RpY2F0ZWQgZmVhdHVyZXMgb2YgQysrIHN1Y2ggYXMgdGVtcGxhdGVzIGFuZCBvcGVyYXRvciBvdmVybG9hZGluZyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHNlZSB0aGUgc2VjdGlvbiBvbiB1c2luZyBTV0lHIHdpdGggQysrIGZvciBtb3JlIGRldGFpbHMuIFdoZW4gZW5jb3VudGVyZWQsIFNXSUcgbWF5IGlzc3VlIGEgd2FybmluZyBtZXNzYWdlIG9yIGEgc3ludGF4IGVycm9yIGlmIGl0IGNhbid0IGZpZ3VyZSBvdXQgeW91IGFyZSB0cnlpbmcgdG8gZG8uCi08L3VsPgotPHA+Ci1NYW55IG9mIHRoZXNlIGxpbWl0YXRpb25zIG1heSBiZSBlbGltaW5hdGVkIGluIGZ1dHVyZSByZWxlYXNlcy4gSXQgaXMgd29ydGggbm90aW5nIHRoYXQgbWFueSBvZiB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIGNvbXBsZXggZGVjbGFyYXRpb25zIGNhbiBzb21ldGltZXMgYmUgZml4ZWQgYnkgY2xldmVyIHVzZSBvZiA8dHQ+dHlwZWRlZjwvdHQ+LjxwPgotPHA+Ci1JZiB5b3UgYXJlIG5vdCBzdXJlIHdoZXRoZXIgU1dJRyBjYW4gaGFuZGxlIGEgcGFydGljdWxhciBkZWNsYXJhdGlvbiwgdGhlIGJlc3QgdGhpbmcgdG8gZG8gaXMgdHJ5IGl0IGFuZCBzZWUuIFNXSUcgd2lsbCBjb21wbGFpbiBsb3VkbHkgaWYgaXQgY2FuJ3QgZmlndXJlIG91dCB3aGF0J3MgZ29pbmcgb24uIFdoZW4gZXJyb3JzIG9jY3VyLCB5b3UgY2FuIGVpdGhlciByZW1vdmUgdGhlIG9mZmVuZGluZyBkZWNsYXJhdGlvbiwgY29uZGl0aW9uYWxseSBjb21waWxlIGl0IG91dCAoU1dJRyBkZWZpbmVzIGEgc3ltYm9sIDx0dD5TV0lHPC90dD4gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhpcyksIG9yIHdyaXRlIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtLiA8cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBTaW1wbGUgQyBmdW5jdGlvbnMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50czwvaDI+Ci1TV0lHIHN1cHBvcnRzIGp1c3QgYWJvdXQgYW55IEMgZnVuY3Rpb24sIHZhcmlhYmxlLCBvciBjb25zdGFudCBpbnZvbHZpbmcgYnVpbHQtaW4gQyBkYXRhdHlwZXMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLQotZXh0ZXJuIGRvdWJsZSBzaW4oZG91YmxlIHgpOwotZXh0ZXJuIGludCBzdHJjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotZXh0ZXJuIGludCBNeV92YXJpYWJsZTsKLSNkZWZpbmUgU1RBVFVTIDUwCi1jb25zdCBjaGFyICpWRVJTSU9OPSIxLjEiOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci13aWxsIGNyZWF0ZSB0d28gY29tbWFuZHMgY2FsbGVkICI8dHQ+c2luPC90dD4iIGFuZCAiPHR0PnN0cmNtcDwvdHQ+IiwgYSBnbG9iYWwgdmFyaWFibGUgIjx0dD5NeV92YXJpYWJsZTwvdHQ+IiwgYW5kIHR3byBjb25zdGFudHMgIjx0dD5TVEFUVVM8L3R0PiIgYW5kICI8dHQ+VkVSU0lPTjwvdHQ+Ii4gVGhpbmdzIHdvcmsgYWJvdXQgbGlrZSB5b3Ugd291bGQgZXhwZWN0LiBGb3IgZXhhbXBsZSwgaW4gVGNsIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNpbiAzCi01LjIzMzU5NTYKLSUgc3RyY21wIERhdmUgTWlrZQotLTEKLSUgcHV0cyAkTXlfdmFyaWFibGUKLTQyCi0lIHB1dHMgJFNUQVRVUwotNTAKLSUgcHV0cyAkVkVSU0lPTgotMS4xCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBtYWluIGNvbmNlcm4gd2hlbiB3b3JraW5nIHdpdGggc2ltcGxlIGZ1bmN0aW9ucyBpcyBTV0lHJ3MgdHJlYXRtZW50IG9mIGJhc2ljIGRhdGF0eXBlcy4gVGhpcyBpcyBkZXNjcmliZWQgbmV4dC48cD4KLTxhIG5hbWU9Im4xNyI+PC9hPjxoMz4gSW50ZWdlcnM8L2gzPgotU1dJRyBtYXBzIHRoZSBmb2xsb3dpbmcgQyBkYXRhdHlwZXMgaW50byBpbnRlZ2VycyBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4gPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50Ci1zaG9ydAotbG9uZwotdW5zaWduZWQKLXNpZ25lZAotdW5zaWduZWQgc2hvcnQKLXVuc2lnbmVkIGxvbmcKLXVuc2lnbmVkIGNoYXIKLXNpZ25lZCBjaGFyCi1ib29sCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNjcmlwdGluZyBsYW5ndWFnZXMgdXN1YWxseSBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgaW50ZWdlciB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gZWl0aGVyIHRoZSA8dHQ+aW50PC90dD4gb3IgPHR0Pmxvbmc8L3R0PiBkYXRhdHlwZSBpbiBDLiBXaGVuIGNvbnZlcnRpbmcgZnJvbSBDLCBhbGwgb2YgdGhlIGFib3ZlIGRhdGF0eXBlcyBhcmUgY2FzdCBpbnRvIHRoZSByZXByZXNlbnRhdGlvbiB1c2VkIGJ5IHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiBUaHVzLCBhIDE2IGJpdCBzaG9ydCBpbiBDIG1heSBiZSBjb252ZXJ0ZWQgdG8gYSAzMiBiaXQgaW50ZWdlci4gV2hlbiBpbnRlZ2VycyBhcmUgY29udmVydGVkIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBiYWNrIGludG8gQywgdGhlIHZhbHVlIHdpbGwgYmUgY2FzdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLiBUaGUgdmFsdWUgd2lsbCBiZSB0cnVuY2F0ZWQgaWYgaXQgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIEMgZGF0YXR5cGUuIFRoaXMgdHJ1bmNhdGlvbiBpcyBub3QgY3VycmVudGx5IGNoZWNrZWQuPHA+Ci08cD4KLVRoZSA8dHQ+dW5zaWduZWQgY2hhcjwvdHQ+IGFuZCA8dHQ+c2lnbmVkIGNoYXI8L3R0PiBkYXRhdHlwZXMgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgdHJlYXRlZCBhcyBpbnRlZ2VycyBieSBTV0lHLiBOb3JtYWxseSwgdGhlIDx0dD5jaGFyPC90dD4gZGF0YXR5cGUgaXMgbWFwcGVkIGFzIGFuIEFTQ0lJIHN0cmluZy4gPHA+Ci08cD4KLVRoZSA8dHQ+Ym9vbDwvdHQ+IGRhdGF0eXBlIGlzIGNhc3QgdG8gYW5kIGZyb20gYW4gaW50ZWdlciB2YWx1ZSBvZiAwIGFuZCAxLjxwPgotPHA+Ci1Tb21lIGNhcmUgaXMgaW4gb3JkZXIgZm9yIGxhcmdlIGludGVnZXIgdmFsdWVzLiBNb3N0IHNjcmlwdGluZyBsYW5ndWFnZSB1c2UgMzIgYml0IGludGVnZXJzIHNvIG1hcHBpbmcgYSA2NCBiaXQgbG9uZyBpbnRlZ2VyIG1heSBsZWFkIHRvIHRydW5jYXRpb24gZXJyb3JzLiBTaW1pbGFyIHByb2JsZW1zIG1heSBhcmlzZSB3aXRoIDMyIGJpdCB1bnNpZ25lZCBpbnRlZ2VycyB0aGF0IG1heSBzaG93IHVwIGFzIG5lZ2F0aXZlIG51bWJlcnMuIEFzIGEgcnVsZSBvZiB0aHVtYiwgdGhlIDx0dD5pbnQ8L3R0PiBkYXRhdHlwZSBhbmQgYWxsIHZhcmlhdGlvbnMgb2YgPHR0PmNoYXI8L3R0PiBhbmQgPHR0PnNob3J0PC90dD4gZGF0YXR5cGVzIGFyZSBzYWZlIHRvIHVzZS4gRm9yIDx0dD51bnNpZ25lZCBpbnQ8L3R0PiBhbmQgPHR0Pmxvbmc8L3R0PiBkYXRhdHlwZXMsIHlvdSBzaG91bGQgdmVyaWZ5IHRoZSBjb3JyZWN0IG9wZXJhdGlvbiBvZiB5b3VyIHByb2dyYW0gYWZ0ZXIgd3JhcHBpbmcgaXQgd2l0aCBTV0lHLjxwPgotPGEgbmFtZT0ibjE4Ij48L2E+PGgzPiBGbG9hdGluZyBQb2ludDwvaDM+Ci1TV0lHIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBmbG9hdGluZyBwb2ludCB0eXBlcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotZmxvYXQKLWRvdWJsZQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1GbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBtYXBwZWQgdG8gYW5kIGZyb20gdGhlIG5hdHVyYWwgcmVwcmVzZW50YXRpb24gb2YgZmxvYXRzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBhIDx0dD5kb3VibGU8L3R0PiBleGNlcHQgaW4gVGNsIDcueCB3aGljaCB1c2VzIGNoYXJhY3RlciBzdHJpbmdzLiBUaGUgcmFyZWx5IHVzZWQgZGF0YXR5cGUgb2YgImxvbmcgZG91YmxlIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IFNXSUcuPHA+Ci08YSBuYW1lPSJuMTkiPjwvYT48aDM+IENoYXJhY3RlciBTdHJpbmdzPC9oMz4KLVRoZSA8dHQ+Y2hhcjwvdHQ+IGRhdGF0eXBlIGlzIG1hcHBlZCBpbnRvIGEgTlVMTCB0ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZyB3aXRoIGEgc2luZ2xlIGNoYXJhY3Rlci4gV2hlbiB1c2VkIGluIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGl0IHdpbGwgc2hvdyB1cCBhcyBhIHRpbnkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciB2YWx1ZS4gV2hlbiBjb252ZXJ0aW5nIHRoZSB2YWx1ZSBiYWNrIGludG8gQywgU1dJRyB3aWxsIHRha2UgYSBjaGFyYWN0ZXIgc3RyaW5nIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgc3RyaXAgb2ZmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYXMgdGhlIGNoYXIgdmFsdWUuIFRodXMgaWYgeW91IHRyeSB0byBhc3NpZ25lZCB0aGUgdmFsdWUgImZvbyIgdG8gYSA8dHQ+Y2hhcjwvdHQ+IGRhdGF0eXBlLCBpdCB3aWxsIGdldCB0aGUgdmFsdWUgYGYnLjxwPgotPHA+Ci1UaGUgPHR0PmNoYXIgKjwvdHQ+IGRhdGF0eXBlIGlzIGFzc3VtZWQgdG8gYmUgYSBOVUxMLXRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nLiBTV0lHIG1hcHMgdGhpcyBpbnRvIGEgY2hhcmFjdGVyIHN0cmluZyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBTV0lHIGNvbnZlcnRzIGNoYXJhY3RlciBzdHJpbmdzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdG8gTlVMTCB0ZXJtaW5hdGVkIHN0cmluZ3MgYmVmb3JlIHBhc3NpbmcgdGhlbSBpbnRvIEMvQysrLiBJdCBpcyBpbGxlZ2FsIGZvciB0aGVzZSBzdHJpbmdzIHRvIGhhdmUgZW1iZWRkZWQgTlVMTCBieXRlcyBhbHRob3VnaCB0aGVyZSBhcmUgd2F5cyB0byB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0uPHA+Ci08cD4KLVRoZSA8dHQ+c2lnbmVkIGNoYXI8L3R0PiBhbmQgPHR0PnVuc2lnbmVkIGNoYXI8L3R0PiBkYXRhdHlwZXMgYXJlIG1hcHBlZCBpbnRvIGludGVnZXIgdmFsdWVzLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIG1hcHBpbmcgb2YgPHR0PmNoYXI8L3R0PiBkYXRhdHlwZXMuPHA+Ci08dHQ+PC90dD48cD4KLTxibG9ja3F1b3RlPjxwcmU+PHR0PiV7Ci0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlICZsdDtjdHlwZS5oJmd0OwotI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0Owotc2lnbmVkIGNoYXIgc3VtKHNpZ25lZCBjaGFyIGEsIHNpZ25lZCBjaGFyIGIpIHsgcmV0dXJuIGErYjt9Ci0lfQotCi1pbnQgIHN0cmNtcChjaGFyICosIGNoYXIgKik7Ci1jaGFyIHRvdXBwZXIoY2hhcik7Ci1zaWduZWQgY2hhciBzdW0oc2lnbmVkIGNoYXIgYSwgc2lnbmVkIGNoYXIgYik7Ci08L3R0PjwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQSBUY2wgc2NyaXB0IHVzaW5nIHRoZXNlIGZ1bmN0aW9ucyAoYW5kIHRoZSByZXN1bHRpbmcgb3V0cHV0KSBtaWdodCBiZSBhcyBmb2xsb3dzLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnRjbHNoICZndDsgc3RyY21wIE1pa2UgSm9obgotMQotdGNsc2ggJmd0OyB0b3VwcGVyIGcKLUcKLXRjbHNoICZndDsgc3VtIDE3IC04Ci05Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjAiPjwvYT48aDM+IFZhcmlhYmxlczwvaDM+Ci1TV0lHIGF0dGVtcHRzIHRvIG1hcCBDL0MrKyBnbG9iYWwgdmFyaWFibGVzIGludG8gc2NyaXB0aW5nIGxhbmd1YWdlIHZhcmlhYmxlcy4gRm9yIGV4YW1wbGU6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0KLWRvdWJsZSBmb287Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdpbGwgcmVzdWx0IGluIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHVzZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBUY2wKLXNldCBmb28gWzMuNV0gCQkJOyMgU2V0IGZvbyB0byAzLjUKLXB1dHMgJGZvbwkJCTsjIFByaW50IHRoZSB2YWx1ZSBvZiBmb28KLQotIyBQeXRob24KLWN2YXIuZm9vID0gMy41CQkJOyMgU2V0IGZvbyB0byAzLjUKLXByaW50IGN2YXIuZm9vCQkJOyMgUHJpbnQgdmFsdWUgb2YgZm9vCi0KLSMgUGVybAotJGZvbyA9IDMuNTsJCQk7IyBTZXQgZm9vIHRvIDMuNQotcHJpbnQgJGZvbywiXG4iOwkJCTsjIFByaW50IHZhbHVlIG9mIGZvbwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuZXZlciB0aGlzICJzcGVjaWFsIiB2YXJpYWJsZSBpcyB1c2VkLCB0aGUgdW5kZXJseWluZyBDIGdsb2JhbCB2YXJpYWJsZSB3aWxsIGJlIGFjY2Vzc2VkLiBBcyBpdCB0dXJucyBvdXQsIHdvcmtpbmcgd2l0aCBnbG9iYWwgdmFyaWFibGVzIGlzIG9uZSBvZiB0aGUgbW9zdCB0cmlja3kgYXNwZWN0cyBvZiBTV0lHLiBXaGVuZXZlciBwb3NzaWJsZSwgeW91IHNob3VsZCB0cnkgdG8gYXZvaWQgdGhlIHVzZSBvZiBnbG9iYWxzLiBGb3J0dW5hdGVseSwgbW9zdCBtb2R1bGFyIHByb2dyYW1zIG1ha2UgbGltaXRlZCAob3Igbm8pIHVzZSBvZiBnbG9iYWxzLjxwPgotPGEgbmFtZT0ibjIxIj48L2E+PGgzPiBDb25zdGFudHM8L2gzPgotQ29uc3RhbnRzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIDx0dD4jZGVmaW5lPC90dD4sIDx0dD5jb25zdDwvdHQ+LCBvciBlbnVtZXJhdGlvbnMuIENvbnN0YW50IGV4cHJlc3Npb25zIGFyZSBhbHNvIGFsbG93ZWQuIFRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGZpbGUgc2hvd3MgYSBmZXcgdmFsaWQgY29uc3RhbnQgZGVjbGFyYXRpb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jZGVmaW5lIElfQ09OU1QgICAgICAgNSAgICAgICAgICAgICAgIC8vIEFuIGludGVnZXIgY29uc3RhbnQKLSNkZWZpbmUgRl9DT05TVCAgICAgICAzLjE0MTU5ICAgICAgICAgLy8gQSBGbG9hdGluZyBwb2ludCBjb25zdGFudAotI2RlZmluZSBTX0NPTlNUICAgICAgICJoZWxsbyB3b3JsZCIgICAvLyBBIHN0cmluZyBjb25zdGFudAotI2RlZmluZSBORVdMSU5FICAgICAgICdcbicgICAgICAgICAgICAvLyBDaGFyYWN0ZXIgY29uc3RhbnQKLSNkZWZpbmUgTU9ERSAgICAgICAgICBERUJVRyAgICAgICAgICAgLy8gU2V0cyBNT0RFIHRvIERFQlVHLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBERUJVRyBpcyBhc3N1bWVkIHRvIGJlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludCB1bmxlc3MgZGVjbGFyZWQgZWFybGllcgotZW51bSBib29sZWFuIHtOTz0wLCBZRVM9MX07Ci1lbnVtIG1vbnRocyB7SkFOLCBGRUIsIE1BUiwgQVBSLCBNQVksIEpVTiwgSlVMLCBBVUcsCi0gICAgICAgICAgICAgU0VQLCBPQ1QsIE5PViwgREVDfTsKLWNvbnN0IGRvdWJsZSBQSSAzLjE0MTU5MjY1NDsKLSNkZWZpbmUgRl9DT05TVCAoZG91YmxlKSA1ICAgICAgICAgICAgLy8gQSBmbG9hdGluZyBwb2ludGVyIGNvbnN0YW50IHdpdGggY2FzdAotI2RlZmluZSBQSV80IFBJLzQKLSNkZWZpbmUgRkxBR1MgMHgwNCB8IDB4MDggfCAweDQwCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIDx0dD4jZGVmaW5lPC90dD4gZGVjbGFyYXRpb25zLCB0aGUgdHlwZSBvZiBhIGNvbnN0YW50IGlzIGluZmVycmVkIGJ5IHN5bnRheCBvciBjYW4gYmUgZXhwbGljaXRseSBzZXQgdXNpbmcgYSBjYXN0LiBGb3IgZXhhbXBsZSwgYSBudW1iZXIgd2l0aCBhIGRlY2ltYWwgcG9pbnQgaXMgYXNzdW1lZCB0byBiZSBmbG9hdGluZyBwb2ludC4gV2hlbiBubyBleHBsaWNpdCB2YWx1ZSBpcyBhdmFpbGFibGUgZm9yIGEgY29uc3RhbnQsIFNXSUcgd2lsbCB1c2UgdGhlIHZhbHVlIGFzc2lnbmVkIGJ5IHRoZSBDIGNvbXBpbGVyLiBGb3IgZXhhbXBsZSwgbm8gdmFsdWVzIGFyZSBnaXZlbiB0byB0aGUgPHR0Pm1vbnRoczwvdHQ+IGVudW1lcmF0aW9uLCBidXQgdGhpcyBpcyBubyBwcm9ibGVtLS0tU1dJRyB3aWxsIHVzZSB3aGF0ZXZlciB0aGUgQyBjb21waWxlciBwaWNrcy4gPHA+Ci08cD4KLVRoZSB1c2Ugb2YgY29uc3RhbnQgZXhwcmVzc2lvbnMgaXMgYWxsb3dlZCwgYnV0IFNXSUcgZG9lcyBub3QgZXZhbHVhdGUgdGhlbS4gUmF0aGVyLCBpdCBwYXNzZXMgdGhlbSB0aHJvdWdoIHRvIHRoZSBvdXRwdXQgZmlsZSBhbmQgbGV0cyB0aGUgQyBjb21waWxlciBwZXJmb3JtIHRoZSBmaW5hbCBldmFsdWF0aW9uIChTV0lHIGRvZXMgcGVyZm9ybSBhIGxpbWl0ZWQgZm9ybSBvZiB0eXBlLWNoZWNraW5nIGhvd2V2ZXIpLjxwPgotPHA+Ci1Gb3IgZW51bWVyYXRpb25zLCBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZSBvcmlnaW5hbCBlbnVtIGRlZmluaXRpb24gYmUgaW5jbHVkZWQgc29tZXdoZXJlIGluIHRoZSBpbnRlcmZhY2UgZmlsZSAoZWl0aGVyIGluIGEgaGVhZGVyIGZpbGUgb3IgaW4gdGhlIDx0dD4leywlfTwvdHQ+IGJsb2NrKS4gU1dJRyBvbmx5IHRyYW5zbGF0ZXMgdGhlIGVudW1lcmF0aW9uIGludG8gY29kZSBuZWVkZWQgdG8gYWRkIHRoZSBjb25zdGFudHMgdG8gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIEl0IG5lZWRzIHRoZSBvcmlnaW5hbCBlbnVtZXJhdGlvbiBkZWNsYXJhdGlvbiB0byByZXRyaWV2ZSB0aGUgY29ycmVjdCBlbnVtIHZhbHVlcy48cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBQb2ludGVycyBhbmQgY29tcGxleCBvYmplY3RzPC9oMj4KLUFzIHdlIGFsbCBrbm93LCBtb3N0IEMgcHJvZ3JhbXMgaGF2ZSBtdWNoIG1vcmUgdGhhbiBqdXN0IGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmQgY2hhcmFjdGVyIHN0cmluZ3MuIFRoZXJlIG1heSBiZSBwb2ludGVycywgYXJyYXlzLCBzdHJ1Y3R1cmVzLCBhbmQgb3RoZXIgb2JqZWN0cyBmbG9hdGluZyBhcm91bmQuIEZvcnR1bmF0ZWx5LCB0aGlzIGlzIHVzdWFsbHkgbm90IGEgcHJvYmxlbSBmb3IgU1dJRy48cD4KLTxhIG5hbWU9Im4yMiI+PC9hPjxoMz4gU2ltcGxlIHBvaW50ZXJzPC9oMz4KLVBvaW50ZXJzIHRvIGJhc2ljIEMgZGF0YXR5cGVzIHN1Y2ggYXMgPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50ICoKLWRvdWJsZSAqKioKLWNoYXIgKioKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotY2FuIGJlIHVzZWQgZnJlZWx5IGluIGFuIGludGVyZmFjZSBmaWxlLiBTV0lHIGVuY29kZXMgcG9pbnRlcnMgaW50byBhIHJlcHJlc2VudGF0aW9uIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgcG9pbnRlciBhbmQgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRhdHlwZS4gVGh1cywgdGhlIFNXSUcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFib3ZlIHBvaW50ZXJzIChpbiBUY2wpLCBtaWdodCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+XzEwMDgxMDEyX2ludF9wCi1fMTAwOGUxMjRfZG91YmxlX3BwcAotX2Y4YWNfY2hhcl9wcAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BIE5VTEwgcG9pbnRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nICJOVUxMIiBvciB0aGUgdmFsdWUgMCBlbmNvZGVkIHdpdGggdHlwZSBpbmZvcm1hdGlvbi48cD4KLTxwPgotQWxsIHBvaW50ZXJzIGFyZSB0cmVhdGVkIGFzIG9wYXF1ZSBvYmplY3RzIGJ5IFNXSUcuIEEgcG9pbnRlciBtYXkgYmUgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBhbmQgcGFzc2VkIGFyb3VuZCB0byBvdGhlciBDIGZ1bmN0aW9ucyBhcyBuZWVkZWQuIEZvciBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZSB3b3JrcyBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyB5b3Ugd291bGQgd3JpdGUgYSBDIHByb2dyYW0gKHdlbGwsIHdpdGggYSBmZXcgbGltaXRhdGlvbnMpLjxwPgotPHA+Ci1UaGUgc2NyaXB0aW5nIGxhbmd1YWdlIHJlcHJlc2VudGF0aW9uIG9mIGEgcG9pbnRlciBzaG91bGQgbmV2ZXIgYmUgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgKGFsdGhvdWdoIG5vdGhpbmcgcHJldmVudHMgdGhpcykuIFNXSUcgZG9lcyBub3Qgbm9ybWFsbHkgbWFwIHBvaW50ZXJzIGludG8gaGlnaC1sZXZlbCBvYmplY3RzIHN1Y2ggYXMgYXNzb2NpYXRpdmUgYXJyYXlzIG9yIGxpc3RzIChmb3IgZXhhbXBsZSwgaXQgbWlnaHQgYmUgZGVzaXJhYmxlIHRvIGNvbnZlcnQgYW4gPHR0PmludCAqPC90dD4gaW50byBhbiBsaXN0IG9mIGludGVnZXJzKS4gVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyBmb3IgdGhpcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5BZGRpbmcgc3BlY2lhbCBjYXNlcyB3b3VsZCBtYWtlIFNXSUcgbW9yZSBjb21wbGljYXRlZCBhbmQgZGlmZmljdWx0IHRvIG1haW50YWluLgotPGxpPlRoZXJlIGlzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gaW4gYSBDIGRlY2xhcmF0aW9uIHRvIHByb3Blcmx5IG1hcCBwb2ludGVycyBpbnRvIGhpZ2hlciBsZXZlbCBjb25zdHJ1Y3RzLiBGb3IgZXhhbXBsZSwgYW4gPHR0PmludCAqPC90dD4gbWF5IGluZGVlZCBiZSBhbiBhcnJheSBvZiBpbnRlZ2VycywgYnV0IGlmIGl0IGNvbnRhaW5zIG9uZSBtaWxsaW9uIGVsZW1lbnRzLCBjb252ZXJ0aW5nIGl0IGludG8gYSBUY2wsIFBlcmwsIG9yIFB5dGhvbiBsaXN0IHdvdWxkIHByb2JhYmx5IGJlIGFuIGV4dHJlbWVseSBiYWQgaWRlYS4KLTxsaT5CeSB0cmVhdGluZyBhbGwgcG9pbnRlcnMgZXF1YWxseSwgaXQgaXMgZWFzeSB0byBrbm93IHdoYXQgeW91J3JlIGdvaW5nIHRvIGdldCB3aGVuIHlvdSBjcmVhdGUgYW4gaW50ZXJmYWNlIChwb2ludGVycyBhcmUgdHJlYXRlZCBpbiBhIGNvbnNpc3RlbnQgbWFubmVyKS4KLTwvdWw+Ci08cD4KLUFzIGl0IHR1cm5zIG91dCwgeW91IGNhbiByZW1hcCBhbnkgQyBkYXRhdHlwZSB0byBiZWhhdmUgaW4gbmV3IHdheXMgc28gdGhlc2UgcnVsZXMgYXJlIG5vdCBzZXQgaW4gc3RvbmUuIEludGVyZXN0ZWQgcmVhZGVycyBzaG91bGQgbG9vayBhdCB0aGUgY2hhcHRlciBvbiB0eXBlbWFwcy48cD4KLTxhIG5hbWU9Im4yMyI+PC9hPjxoMz4gUnVuIHRpbWUgcG9pbnRlciB0eXBlIGNoZWNraW5nPC9oMz4KLUJ5IGFsbG93aW5nIHBvaW50ZXJzIHRvIGJlIG1hbmlwdWxhdGVkIGludGVyYWN0aXZlbHkgaW4gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UsIHdlIGhhdmUgZWZmZWN0aXZlbHkgYnlwYXNzZWQgdGhlIHR5cGUtY2hlY2tlciBpbiB0aGUgQy9DKysgY29tcGlsZXIuIEJ5IGVuY29kaW5nIHBvaW50ZXIgdmFsdWVzIHdpdGggYSBkYXRhdHlwZSwgU1dJRyBpcyBhYmxlIHRvIHBlcmZvcm0gcnVuLXRpbWUgdHlwZS1jaGVja2luZyBpbiBvcmRlciB0byBwcmV2ZW50IG15c3RlcmlvdXMgc3lzdGVtIGNyYXNoZXMgYW5kIG90aGVyIGFub21hbGllcy4gQnkgZGVmYXVsdCwgU1dJRyB1c2VzIGEgc3RyaWN0LXR5cGUgY2hlY2tpbmcgbW9kZWwgdGhhdCBjaGVja3MgdGhlIGRhdGF0eXBlIG9mIGFsbCBwb2ludGVycyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIEMvQysrLiBIb3dldmVyLCB5b3UgY2FuIGNoYW5nZSB0aGUgaGFuZGxpbmcgb2YgcG9pbnRlcnMgdXNpbmcgdGhlIDx0dD4tc3RyaWN0PC90dD4gb3B0aW9uOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi1zdHJpY3QgMAkJCU5vIHR5cGUtY2hlY2tpbmcgKGxpdmluZyBvbiB0aGUgZWRnZSkKLS1zdHJpY3QgMQkJCUdlbmVyYXRlIHdhcm5pbmcgbWVzc2FnZXMgKHNvbWV3aGF0IGFubm95aW5nKQotLXN0cmljdCAyCQkJU3RyaWN0IHR5cGUgY2hlY2tpbmcgKHRoZSBkZWZhdWx0KQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TdHJpY3QgdHlwZSBjaGVja2luZyBpcyB0aGUgcmVjb21tZW5kZWQgZGVmYXVsdCBzaW5jZSBpcyB0aGUgbW9zdCByZWxpYWJsZSBhbmQgbW9zdCBjbG9zZWx5IGZvbGxvd3MgdGhlIHR5cGUgY2hlY2tpbmcgcnVsZXMgb2YgQy4gSW4gZmFjdCwgYXQgdGhpcyB0aW1lLCB0aGUgb3RoZXIgdHdvIG1vZGVzIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIG91dGRhdGVkIFNXSUcgZmVhdHVyZXMgdGhhdCBhcmUgc3VwcG9ydGVkLCBidXQgbm8gbG9uZ2VyIG5lY2Vzc2FyeS48cD4KLTxwPgotQnkgZGVmYXVsdCwgU1dJRyBhbGxvd3MgIk5VTEwiIHBvaW50ZXJzIHRvIGJlIHBhc3NlZCB0byBDL0MrKy4gVGhpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBjcmFzaCBjb2RlIGFuZCBjYXVzZSBvdGhlciBwcm9ibGVtcyBpZiB5b3UgYXJlIG5vdCBjYXJlZnVsLiBDaGVja3MgY2FuIGJlIHBsYWNlZCBvbiBjZXJ0YWluIHZhbHVlcyB0byBwcmV2ZW50IHRoaXMgYnV0IHRoaXMgcmVxdWlyZXMgdGhlIHVzZSBvZiB0eXBlbWFwcyAoZGVzY3JpYmVkIGluIGxhdGVyIGNoYXB0ZXJzKS48cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1MaWtlIEMsIGl0IHNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgZnVuY3Rpb25zIGludm9sdmluZyA8dHQ+dm9pZDwvdHQ+IHBvaW50ZXJzIGNhbiBhY2NlcHQgYW55IGtpbmQgb2YgcG9pbnRlciBvYmplY3QuPHA+Ci08YSBuYW1lPSJuMjQiPjwvYT48aDM+IERlcml2ZWQgdHlwZXMsIHN0cnVjdHMsIGFuZCBjbGFzc2VzPC9oMz4KLUZvciBldmVyeXRoaW5nIGVsc2UgKHN0cnVjdHMsIGNsYXNzZXMsIGFycmF5cywgZXRjLi4uKSBTV0lHIGFwcGxpZXMgYSB2ZXJ5IHNpbXBsZSBydWxlIDo8cD4KLTxwPgotQWxsIGNvbXBsZXggZGF0YXR5cGVzIGFyZSBwb2ludGVyczxwPgotPHA+Ci1JbiBvdGhlciB3b3JkcywgU1dJRyBtYW5pcHVsYXRlcyBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlLiBUaGlzIG1vZGVsIG1ha2VzIHNlbnNlIGJlY2F1c2UgbW9zdCBDL0MrKyBwcm9ncmFtcyBtYWtlIGhlYXZ5IHVzZSBvZiBwb2ludGVycyBhbmQgd2UgY2FuIHVzZSB0aGUgdHlwZS1jaGVja2VkIHBvaW50ZXIgbWVjaGFuaXNtIGFscmVhZHkgcHJlc2VudCBmb3IgaGFuZGxpbmcgcG9pbnRlcnMgdG8gYmFzaWMgZGF0YXR5cGVzLjxwPgotPHA+Ci1XaGlsZSBhbGwgb2YgdGhpcyBwcm9iYWJseSBzb3VuZHMgY29tcGxpY2F0ZWQsIGl0J3MgcmVhbGx5IHF1aXRlIHNpbXBsZS4gU3VwcG9zZSB5b3UgaGF2ZSBhbiBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZmlsZWlvCi1GSUxFICpmb3BlbihjaGFyICosIGNoYXIgKik7Ci1pbnQgZmNsb3NlKEZJTEUgKik7Ci11bnNpZ25lZCBmcmVhZCh2b2lkICpwdHIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIG5vYmosIEZJTEUgKik7Ci11bnNpZ25lZCBmd3JpdGUodm9pZCAqcHRyLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBub2JqLCBGSUxFICopOwotdm9pZCAqbWFsbG9jKGludCBuYnl0ZXMpOwotdm9pZCBmcmVlKHZvaWQgKik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIHRoaXMgZmlsZSwgU1dJRyBkb2Vzbid0IGtub3cgd2hhdCBhIDx0dD5GSUxFPC90dD4gaXMsIGJ1dCBpdCdzIHVzZWQgYXMgYSBwb2ludGVyLCBzbyBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hhdCBpdCBpcy4gSWYgeW91IHdyYXBwZWQgdGhpcyBtb2R1bGUgaW50byBQeXRob24sIHlvdSBjb3VsZCB1c2UgdGhlIGZ1bmN0aW9ucyBqdXN0IGxpa2UgeW91IHdvdWxkIGV4cGVjdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBDb3B5IGEgZmlsZSAKLWRlZiBmaWxlY29weShzb3VyY2UsdGFyZ2V0KToKLQlmMSA9IGZvcGVuKHNvdXJjZSwiciIpCi0JZjIgPSBmb3Blbih0YXJnZXQsInciKQotCWJ1ZmZlciA9IG1hbGxvYyg4MTkyKQotCW5ieXRlcyA9IGZyZWFkKGJ1ZmZlciw4MTkyLDEsZjEpCi0Jd2hpbGUgKG5ieXRlcyAmZ3Q7IDApOgotCQlmd3JpdGUoYnVmZmVyLDgxOTIsMSxmMikKLQkJbmJ5dGVzID0gZnJlYWQoYnVmZmVyLDgxOTIsMSxmMSkKLQlmcmVlKGJ1ZmZlcikKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBjYXNlIDx0dD5mMTwvdHQ+LDx0dD4gZjI8L3R0PiwgYW5kIDx0dD5idWZmZXI8L3R0PiBhcmUgYWxsIG9wYXF1ZSBvYmplY3RzIGNvbnRhaW5pbmcgQyBwb2ludGVycy4gSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSB0aGV5IGNvbnRhaW4tLW91ciBwcm9ncmFtIHdvcmtzIGp1c3QgZmluZSB3aXRob3V0IHRoaXMga25vd2xlZGdlLjxwPgotPGEgbmFtZT0ibjI1Ij48L2E+PGgzPiBXaGF0IGhhcHBlbnMgd2hlbiBTV0lHIGVuY291bnRlcnMgYW4gdW5rbm93biBkYXRhdHlwZT88L2gzPgotV2hlbiBTV0lHIGVuY291bnRlcnMgYW4gdW5rbm93biBkYXRhdHlwZSwgaXQgYXV0b21hdGljYWxseSBhc3N1bWVzIHRoYXQgaXQgaXMgc29tZSBzb3J0IG9mIGNvbXBsZXggZGF0YXR5cGUuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYXBwZWFyZWQgaW4gYSBTV0lHIGlucHV0IGZpbGU6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBtYXRyaXhfbXVsdGlwbHkoTWF0cml4ICphLCBNYXRyaXggKmIsIE1hdHJpeCAqYyk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNXSUcgaGFzIG5vIGlkZWEgd2hhdCBhICI8dHQ+TWF0cml4PC90dD4iIGlzIHNvIGl0IHdpbGwgYXNzdW1lIHRoYXQgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGFuZCBtYXAgaXQgaW50byBhIHBvaW50ZXIuIFRoaXMgbWFrZXMgcGVyZmVjdCBzZW5zZSBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIEMgZnVuY3Rpb24gaXMgdXNpbmcgcG9pbnRlcnMgaW4gdGhlIGZpcnN0IHBsYWNlLiBVbmxpa2UgQyBvciBDKyssIFNXSUcgZG9lcyBub3QgYWN0dWFsbHkgY2FyZSB3aGV0aGVyIDx0dD5NYXRyaXg8L3R0PiBoYXMgYmVlbiBwcmV2aW91c2x5IGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlIG9yIG5vdC4gV2hpbGUgdGhpcyBtYXkgc291bmQgc3RyYW5nZSwgaXQgbWFrZXMgaXQgcG9zc2libGUgZm9yIFNXSUcgdG8gZ2VuZXJhdGUgaW50ZXJmYWNlcyBmcm9tIG9ubHkgcGFydGlhbCBpbmZvcm1hdGlvbi4gSW4gbWFueSBjYXNlcywgeW91IG1heSBub3QgY2FyZSB3aGF0IGEgPHR0Pk1hdHJpeDwvdHQ+IHJlYWxseSBpcyBhcyBsb25nIGFzIHlvdSBjYW4gcGFzcyByZWZlcmVuY2VzIHRvIG9uZSBhcm91bmQgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFRoZSBkb3duc2lkZSB0byB0aGlzIHJlbGF4ZWQgYXBwcm9hY2ggaXMgdGhhdCB0eXBvcyBtYXkgZ28gY29tcGxldGVseSB1bmRldGVjdGVkIGJ5IFNXSUcuIFlvdSBjYW4gYWxzbyBlbmQgdXAgc2hvb3RpbmcgeW91cnNlbGYgaW4gdGhlIGZvb3QsIGJ1dCBwcmVzdW1hYmx5IHlvdSd2ZSBwYXNzZWQgeW91ciBwcm9ncmFtbWluZyBzYWZldHkgY291cnNlIGlmIHlvdSd2ZSBtYWRlIGl0IHRoaXMgZmFyLjxwPgotPHA+Ci1BcyBhIGRlYnVnZ2luZyB0b29sLCBTV0lHIHdpbGwgcmVwb3J0IGEgbGlzdCBvZiB1c2VkLCBidXQgdW5kZWZpbmVkIGRhdGF0eXBlcywgaWYgeW91IHJ1biBpdCB3aXRoIHRoZSA8dHQ+LXN0YXQ8L3R0PiBvcHRpb24uPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+W2JlYXpsZXlAZ3Vpbm5lc3MgU1dJRzEuMWI2XSQgc3dpZyAtc3RhdCBtYXRyaXguaQotTWFraW5nIHdyYXBwZXJzIGZvciBUY2wKLVdyYXBwZWQgMSBmdW5jdGlvbnMKLVdyYXBwZWQgMCB2YXJpYWJsZXMKLVdyYXBwZWQgMCBjb25zdGFudHMKLVRoZSBmb2xsb3dpbmcgZGF0YXR5cGVzIHdlcmUgdXNlZCwgYnV0IHVuZGVmaW5lZC4KLSAgICAgTWF0cml4Ci1bYmVhemxleUBndWlubmVzcyBTV0lHMS4xYjZdJAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjI2Ij48L2E+PGgzPiBUeXBlZGVmPC9oMz4KLTx0dD50eXBlZGVmPC90dD4gY2FuIGJlIHVzZWQgdG8gcmVtYXAgZGF0YXR5cGVzIHdpdGhpbiBTV0lHLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIG1ha2VzIFNXSUcgdHJlYXQgPHR0PnNpemVfdDwvdHQ+IGxpa2UgYW4gdW5zaWduZWQgaW50LiBVc2Ugb2YgPHR0PnR5cGVkZWY8L3R0PiBpcyBmYWlybHkgY3JpdGljYWwgaW4gbW9zdCBhcHBsaWNhdGlvbnMuIFdpdGhvdXQgaXQsIFNXSUcgd291bGQgY29uc2lkZXIgPHR0PnNpemVfdDwvdHQ+IHRvIGJlIGEgY29tcGxleCBvYmplY3QgKHdoaWNoIHdvdWxkIGJlIGluY29ycmVjdGx5IGNvbnZlcnRlZCBpbnRvIGEgcG9pbnRlcikuPHA+Ci08YSBuYW1lPSJuNCI+PC9hPjxoMj4gR2V0dGluZyBkb3duIHRvIGJ1c2luZXNzPC9oMj4KLVNvIGZhciwgeW91IGtub3cganVzdCBhYm91dCBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIGtub3cgdG8gdXNlIFNXSUcgdG8gYnVpbGQgaW50ZXJmYWNlcy4gSW4gZmFjdCwgdXNpbmcgbm90aGluZyBidXQgYmFzaWMgZGF0YXR5cGVzIGFuZCBvcGFxdWUgcG9pbnRlcnMgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMgdG8gbW9zdCBraW5kcyBvZiBDL0MrKyBwYWNrYWdlcy4gSG93ZXZlciwgYXMgdGhlIG5vdmVsdHkgd2VhcnMgb2ZmLCB5b3Ugd2lsbCB3YW50IHRvIGRvIG1vcmUuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgU1dJRydzIHRyZWF0bWVudCBvZiBtb3JlIHNvcGhzdGljYXRlZCBpc3N1ZXMuPHA+Ci08YSBuYW1lPSJuMjciPjwvYT48aDM+IFBhc3NpbmcgY29tcGxleCBkYXRhdHlwZXMgYnkgdmFsdWU8L2gzPgotVW5mb3J0dW5hdGVseSwgbm90IGFsbCBDIHByb2dyYW1zIG1hbmlwdWxhdGUgY29tcGxleCBvYmplY3RzIGJ5IHJlZmVyZW5jZS4gV2hlbiBlbmNvdW50ZXJlZCwgU1dJRyB3aWxsIHRyYW5zZm9ybSB0aGUgY29ycmVzcG9uZGluZyBDL0MrKyBkZWNsYXJhdGlvbiB0byB1c2UgcmVmZXJlbmNlcyBpbnN0ZWFkLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGFkIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TV0lHIHdpbGwgdHJhbnNmb3JtIHRoaXMgZnVuY3Rpb24gY2FsbCBpbnRvIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7Ci0JcmV0dXJuIGRvdF9wcm9kdWN0KCphLCpiKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZTx0dD4sIGRvdF9wcm9kdWN0PC90dD4gd2lsbCBub3cgdGFrZSByZWZlcmVuY2VzIHRvIFZlY3RvcnMgaW5zdGVhZCBvZiBWZWN0b3JzLCBhbHRob3VnaCB5b3UgbWF5IG5vdCBub3RpY2UgdGhlIGNoYW5nZS4gPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IFJldHVybiBieSB2YWx1ZTwvaDM+Ci1DIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBjb21wbGV4IGRhdGF0eXBlcyBieSB2YWx1ZSBhcmUgbW9yZSBkaWZmaWN1bHQgdG8gaGFuZGxlLiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlZlY3RvciBjcm9zcyhWZWN0b3IgdjEsIFZlY3RvciB2Mik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgY29tcGxleCBvYmplY3QsIHlldCBTV0lHIG9ubHkgbGlrZXMgdG8gd29yayB3aXRoIHJlZmVyZW5jZXMuIENsZWFybHksIHNvbWV0aGluZyBtdXN0IGJlIGRvbmUgd2l0aCB0aGUgcmV0dXJuIHJlc3VsdCwgb3IgaXQgd2lsbCBiZSBsb3N0IGZvcmV2ZXIuIEFzIGEgcmVzdWx0LCBTV0lHIHRyYW5zZm9ybXMgdGhpcyBmdW5jdGlvbiBpbnRvIHRoZSBmb2xsb3dpbmcgY29kZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+VmVjdG9yICp3cmFwX2Nyb3NzKFZlY3RvciAqdjEsIFZlY3RvciAqdjIpIHsKLQlWZWN0b3IgKnJlc3VsdDsKLQlyZXN1bHQgPSAoVmVjdG9yICopIG1hbGxvYyhzaXplb2YoVmVjdG9yKSk7Ci0JKihyZXN1bHQpID0gY3Jvc3MoKnYxLCp2Mik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotb3IgaWYgdXNpbmcgQysrIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5WZWN0b3IgKndyYXBfY3Jvc3MoVmVjdG9yICp2MSwgVmVjdG9yICp2MikgewotCVZlY3RvciAqcmVzdWx0ID0gbmV3IFZlY3Rvcihjcm9zcygqdjEsKnYyKSk7IC8vIFVzZXMgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yCi0JcmV0dXJuIHJlc3VsdDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU1dJRyBpcyBmb3JjZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGl0LiBJdCBpcyB1cCB0byB0aGUgdXNlciB0byBkZWxldGUgdGhlIHJldHVybmVkIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciBpbiB1c2UuIFdoZW4gdXNlZCBpbXByb3Blcmx5LCB0aGlzIGNhbiBsZWFkIHRvIG1lbW9yeSBsZWFrcyBhbmQgb3RoZXIgcHJvYmxlbXMuIFBlcnNvbmFsbHksIEknZCByYXRoZXIgbGl2ZSB3aXRoIGEgcG90ZW50aWFsIG1lbW9yeSBsZWFrIHRoYW4gZm9yYmlkIHRoZSB1c2Ugb2Ygc3VjaCBhIGZ1bmN0aW9uLiBOZWVkbGVzcyB0byBzYXksIHNvbWUgY2FyZSBpcyBwcm9iYWJseSBpbiBvcmRlciAoeW91IG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhpcyBiZWhhdmlvciBpbiBhbnkgY2FzZSkuIDxwPgotPGEgbmFtZT0ibjI5Ij48L2E+PGgzPiBMaW5raW5nIHRvIGNvbXBsZXggdmFyaWFibGVzPC9oMz4KLVdoZW4gZ2xvYmFsIHZhcmlhYmxlcyBvciBjbGFzcyBtZW1iZXJzIGludm9sdmluZyBjb21wbGV4IGRhdGF0eXBlcyBhcmUgZW5jb3VudGVyZWQsIFNXSUcgY29udmVydHMgdGhlbSBpbnRvIHJlZmVyZW5jZXMuIEZvciBleGFtcGxlLCBhIGdsb2JhbCB2YXJpYWJsZSBsaWtlIHRoaXMgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLVZlY3RvciB1bml0X2k7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLWdldHMgbWFwcGVkIHRvIGEgcGFpciBvZiBzZXQvZ2V0IGZ1bmN0aW9ucyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlZlY3RvciAqdW5pdF9pX2dldCgpIHsKLQlyZXR1cm4gJmFtcDt1bml0X2k7Ci19Ci1WZWN0b3IgKnVuaXRfaV9zZXQoVmVjdG9yICp2YWx1ZSkgewotCXVuaXRfaSA9ICp2YWx1ZTsKLQlyZXR1cm4gJmFtcDt1bml0X2k7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVJldHVybmluZyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgbWFrZXMgaXQgYWNjZXNzaWJsZSBsaWtlIGFueSBvdGhlciBvYmplY3Qgb2YgdGhpcyB0eXBlLiBXaGVuIHNldHRpbmcgdGhlIHZhbHVlLCB3ZSBzaW1wbHkgbWFrZSBhIGNvcHkgb2Ygc29tZSBvdGhlciBWZWN0b3IgcmVmZXJlbmNlLiBBZ2FpbiBzb21lIGNhdXRpb24gaXMgaW4gb3JkZXIuIEEgZ2xvYmFsIHZhcmlhYmxlIGNyZWF0ZWQgaW4gdGhpcyBtYW5uZXIgd2lsbCBzaG93IHVwIGFzIGEgcmVmZXJlbmNlIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiBJdCB3b3VsZCBiZSBhbiBleHRyZW1lbHkgYmFkIGlkZWEgdG8gZnJlZSBvciBkZXN0cm95IHN1Y2ggYSByZWZlcmVuY2UuIFNpbWlsYXJseSwgb25lIGNhbiBydW4gaW50byBwcm9ibGVtcyB3aGVuIGNvcHlpbmcgY29tcGxleCBDKysgb2JqZWN0cyBpbiB0aGlzIG1hbm5lci4gRm9ydHVuYXRlbHksIGluIHdlbGwtd3JpdHRlbiBtb2R1bGFyIGNvZGUsIGV4Y2Vzc2l2ZSB1c2UgKG9yIGFidXNlKSBvZiBnbG9iYWwgdmFyaWFibGVzIGlzIHJhcmUuPHA+Ci08YSBuYW1lPSJuMzAiPjwvYT48aDM+IEFycmF5czwvaDM+Ci1UaGUgdXNlIG9mIGFycmF5cyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFNXSUcgaXMgc3VwcG9ydGVkLCBidXQgd2l0aCBjYXV0aW9uLiBJZiBzaW1wbGUgYXJyYXlzIGFwcGVhciwgdGhleSB3aWxsIGJlIG1hcHBlZCBpbnRvIGEgcG9pbnRlciByZXByZXNlbnRhdGlvbi4gVGh1cywgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBmb29iYXIoaW50IGFbNDBdKTsKLXZvaWQgZ3JvayhjaGFyICphcmd2W10pOwotdm9pZCB0cmFuc3Bvc2UoZG91YmxlIGFbMjBdWzIwXSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXdpbGwgYmUgcHJvY2Vzc2VkIGFzIGlmIHRoZXkgd2VyZSBkZWNsYXJlZCBsaWtlIHRoaXM6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50IGZvb2JhcihpbnQgKmEpOwotdm9pZCBncm9rKGNoYXIgKiphcmd2KTsKLXZvaWQgdHJhbnNwb3NlKGRvdWJsZSAoKmEpWzIwXSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgdHJhbnNmb3JtZWQgaW50byBhIHNpbmdsZSBwb2ludGVyIHNpbmNlIDx0dD5hW11bXTwvdHQ+IGFuZCA8dHQ+KiphPC90dD4gYXJlIG5vdCB0aGUgc2FtZSB0aGluZyAoZXZlbiB0aG91Z2ggdGhleSBjYW4gYmUgdXNlZCBpbiBzaW1pbGFyIHdheXMpLiBSYXRoZXIsIDx0dD5hW11bXTwvdHQ+IGlzIG1hcHBlZCB0byAqYSwgd2hlcmUgPHR0PiphPC90dD4gaXMgdGhlIGVxdWl2YWxlbnQgb2YgPHR0PiZhbXA7YVswXVswXTwvdHQ+LiBUaGUgcmVhZGVyIGlzIGVuY291cmFnZWQgdG8gZHVzdCBvZmYgdGhlaXIgQyBib29rIGFuZCBsb29rIGF0IHRoZSBzZWN0aW9uIG9uIGFycmF5cyBiZWZvcmUgdXNpbmcgdGhlbSB3aXRoIFNXSUcuPHA+Ci08cD4KLUJlIGF3YXJlIHRoYXQgdXNlIG9mIGFycmF5cyBtYXkgY2F1c2UgY29tcGlsZXIgd2FybmluZ3Mgb3IgZXJyb3JzIHdoZW4gY29tcGlsaW5nIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMuIFdoaWxlIGV2ZXJ5IGF0dGVtcHQgaGFzIGJlZW4gbWFkZSB0byBlbGltaW5hdGUgdGhlc2UgcHJvYmxlbXMsIGhhbmRsaW5nIG9mIGFycmF5cyBjYW4gYmUgc29tZXdoYXQgcHJvYmxlbWF0aWMgZHVlIHRvIHRoZSBzdWJ0bGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhbiBhcnJheSBhbmQgYSBwb2ludGVyLjxwPgotPGEgbmFtZT0ibjMxIj48L2E+PGgzPiBDcmVhdGluZyByZWFkLW9ubHkgdmFyaWFibGVzPC9oMz4KLUEgcmVhZC1vbmx5IHZhcmlhYmxlIGNhbiBiZSBjcmVhdGVkIGJ5IHVzaW5nIHRoZSA8dHQ+JXJlYWRvbmx5PC90dD4gZGlyZWN0aXZlIGFzIHNob3duIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBGaWxlIDogaW50ZXJmYWNlLmkKLQotaW50IAlhOyAJCQkvLyBDYW4gcmVhZC93cml0ZQotJXJlYWRvbmx5Ci1pbnQJYixjLGQJCQkvLyBSZWFkIG9ubHkgdmFyaWFibGVzCi0lcmVhZHdyaXRlCi1kb3VibGUJeCx5CQkJLy8gcmVhZC93cml0ZQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgPHR0PiVyZWFkb25seTwvdHQ+IGRpcmVjdGl2ZSBlbmFibGVzIHJlYWQtb25seSBtb2RlIHVudGlsIGl0IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQgdXNpbmcgdGhlIDx0dD4lcmVhZHdyaXRlPC90dD4gZGlyZWN0aXZlLjxwPgotPGEgbmFtZT0ibjMyIj48L2E+PGgzPiBSZW5hbWluZyBkZWNsYXJhdGlvbnM8L2gzPgotTm9ybWFsbHksIHRoZSBuYW1lIG9mIGEgQyBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGFkZGVkIHRvIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIG5hbWUgbWF5IGNvbmZsaWN0IHdpdGggYSBrZXl3b3JkIG9yIGFscmVhZHkgZXhpc3RpbmcgZnVuY3Rpb24gaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZS4gTmFtaW5nIGNvbmZsaWN0cyBjYW4gYmUgcmVzb2x2ZWQgdXNpbmcgdGhlIDx0dD4lbmFtZTwvdHQ+IGRpcmVjdGl2ZSBhcyBzaG93biA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gaW50ZXJmYWNlLmkKLQotJW5hbWUobXlfcHJpbnQpIGV4dGVybiB2b2lkIHByaW50KGNoYXIgKik7Ci0lbmFtZShmb28pIGV4dGVybiBpbnQgYV9yZWFsbHlfbG9uZ19hbmRfYW5ub3lpbmdfbmFtZTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU1dJRyBzdGlsbCBjYWxscyB0aGUgY29ycmVjdCBDIGZ1bmN0aW9ucywgYnV0IGluIHRoaXMgY2FzZSB0aGUgZnVuY3Rpb24gPHR0PnByaW50KCk8L3R0PiB3aWxsIHJlYWxseSBiZSBjYWxsZWQgIjx0dD5teV9wcmludCgpPC90dD4iIGluIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIDxwPgotPHA+Ci1BIG1vcmUgcG93ZXJmdWwgcmVuYW1pbmcgb3BlcmF0aW9uIGNhbiBiZSBwZXJmb3JtZWQgd2l0aCB0aGU8dHQ+ICVyZW5hbTwvdHQ+ZSBkaXJlY3RpdmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXJlbmFtZSBvbGRuYW1lIG5ld25hbWU7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0dD4lcmVuYW1lIDwvdHQ+YXBwbGllcyBhIHJlbmFtaW5nIG9wZXJhdGlvbiB0byBhbGwgZnV0dXJlIG9jY3VycmVuY2VzIG9mIGEgbmFtZS4gVGhlIHJlbmFtaW5nIGFwcGxpZXMgdG8gZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGNsYXNzIGFuZCBzdHJ1Y3R1cmUgbmFtZXMsIG1lbWJlciBmdW5jdGlvbnMsIGFuZCBtZW1iZXIgZGF0YS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYWQgdHdvLWRvemVuIEMrKyBjbGFzc2VzLCBhbGwgd2l0aCBhIG1lbWJlciBmdW5jdGlvbiBuYW1lZCBgcHJpbnQnICh3aGljaCBpcyBhIGtleXdvcmQgaW4gUHl0aG9uKSwgeW91IGNvdWxkIHJlbmFtZSB0aGVtIGFsbCB0byBgb3V0cHV0JyBieSBzcGVjaWZ5aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lcmVuYW1lIHByaW50IG91dHB1dDsgLy8gUmVuYW1lIGFsbCBgcHJpbnQnIGZ1bmN0aW9ucyB0byBgb3V0cHV0JwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TV0lHIGRvZXMgbm90IHBlcmZvcm0gYW55IGNoZWNrcyB0byBzZWUgaWYgdGhlIGZ1bmN0aW9ucyBpdCBhZGRzIGFyZSBhbHJlYWR5IGRlZmluZWQgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2VzIGFuZCB5b3VyIHVzZSBvZiBtb2R1bGVzLCB5b3UgY2FuIHVzdWFsbHkgYXZvaWQgdGhlc2UgcHJvYmxlbXMuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IE92ZXJyaWRpbmcgY2FsbCBieSByZWZlcmVuY2U8L2gzPgotU1dJRyBpcyBxdWl0ZSBsaXRlcmFsIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiBkYXRhdHlwZXMuIElmIHlvdSBnaXZlIGl0IGEgcG9pbnRlciwgaXQgd2lsbCB1c2UgcG9pbnRlcnMuIEZvciBleGFtcGxlLCBpZiB5b3UncmUgdHJ5aW5nIHRvIGNhbGwgYSBmdW5jdGlvbiBpbiBhIEZvcnRyYW4gbGlicmFyeSAodGhyb3VnaCBpdHMgQyBpbnRlcmZhY2UpIGFsbCBmdW5jdGlvbiBwYXJhbWV0ZXJzIHdpbGwgaGF2ZSB0byBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW1pbGFybHksIHNvbWUgQyBmdW5jdGlvbnMgbWF5IHVzZSBwb2ludGVycyBpbiB1bnVzdWFsIHdheXMuIFRoZSA8dHQ+JXZhbDwvdHQ+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIGNhbGxpbmcgbWVjaGFuaXNtIGZvciBhIEMgZnVuY3Rpb24uIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBpbnRlcmZhY2UuaQotJXsKLSNpbmNsdWRlICZsdDt0aW1lLmgmZ3Q7Ci0lfQotCi10eXBlZGVmIGxvbmcgdGltZV90OwotdGltZV90IHRpbWUodGltZV90ICp0KTsKLXN0cnVjdCB0bSAqbG9jYWx0aW1lKCV2YWwgdGltZV90ICp0KTsKLWNoYXIgKmFzY3RpbWUoc3RydWN0IHRtICopOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PmxvY2FsdGltZSgpPC90dD4gZnVuY3Rpb24gdGFrZXMgYSBwb2ludGVyIHRvIGEgPHR0PnRpbWVfdDwvdHQ+IHZhbHVlLCBidXQgd2UgaGF2ZSBmb3JjZWQgaXQgdG8gdGFrZSBhIHZhbHVlIGluc3RlYWQgaW4gb3JkZXIgdG8gbWF0Y2ggdXAgbmljZWx5IHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgPHR0PnRpbWUoKTwvdHQ+IGZ1bmN0aW9uLiBXaGVuIHVzZWQgaW4gUGVybCwgdGhpcyBhbGxvd3MgdXMgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJHQgPSB0aW1lKDApOwotJHRtID0gbG9jYWx0aW1lKCR0KTsgIyBOb3RlIHBhc3NpbmcgJHQgYnkgdmFsdWUgaGVyZQotcHJpbnQgJGFzY3RpbWUoJHRtKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW50ZXJuYWxseSwgdGhlIDx0dD4ldmFsPC90dD4gZGlyZWN0aXZlIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUuIFRoZSBhcmd1bWVudCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhpcyB2YXJpYWJsZSBhbmQgYSBmdW5jdGlvbiBjYWxsIGlzIG1hZGUgdXNpbmcgYSBwb2ludGVyIHRvIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUuIE9mIGNvdXJzZSwgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSBpbiB0aGlzIHRlbXBvcmFyeSB2YXJpYWJsZSwgaXQgd2lsbCBiZSBsb3N0IGZvcmV2ZXIuIDxwPgotPGEgbmFtZT0ibjM0Ij48L2E+PGgzPiBEZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50czwvaDM+Ci1TV0lHIGFsbG93cyBkZWZhdWx0IGFyZ3VtZW50cyB0byBiZSB1c2VkIGluIGJvdGggQy9DKysgY29kZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnQgcGxvdChkb3VibGUgeCwgZG91YmxlIHksIGludCBjb2xvcj1XSElURSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHNwZWNpZnkgYSBkZWZhdWx0IGFyZ3VtZW50LCBzaW1wbHkgc3BlY2lmeSBpdCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIGFzIHNob3duLiBTV0lHIHdpbGwgZ2VuZXJhdGUgd3JhcHBlciBjb2RlIGluIHdoaWNoIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuIEZvciBleGFtcGxlLCB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIHVzZWQgaW4gVGNsIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgcGxvdCAtMy40IDcuNSAJCQkJIyBVc2UgZGVmYXVsdCB2YWx1ZQotJSBwbG90IC0zLjQgNy41IDEwCQkJCSMgc2V0IGNvbG9yIHRvIDEwIGluc3RlYWQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hpbGUgdGhlIEFOU0kgQyBzdGFuZGFyZCBkb2VzIG5vdCBzcGVjaWZ5IGRlZmF1bHQgYXJndW1lbnRzLCBkZWZhdWx0IGFyZ3VtZW50cyB1c2VkIGluIGEgU1dJRyBnZW5lcmF0ZWQgaW50ZXJmYWNlIHdvcmsgd2l0aCBib3RoIEMgYW5kIEMrKy48cD4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gUG9pbnRlcnMgdG8gZnVuY3Rpb25zPC9oMz4KLUF0IHRoZSBtb21lbnQsIHRoZSBTV0lHIHBhcnNlciBoYXMgZGlmZmljdWx0eSBoYW5kbGluZyBwb2ludGVycyB0byBmdW5jdGlvbnMgKGEgZGVmaWNpZW5jeSB0aGF0IGlzIGJlaW5nIGNvcnJlY3RlZCkuIEhvd2V2ZXIsIGhhdmluZyBmdW5jdGlvbiBwb2ludGVycyBpcyB1c2VmdWwgZm9yIG1hbmFnaW5nIEMgY2FsbGJhY2sgZnVuY3Rpb25zIGFuZCBvdGhlciB0aGluZ3MuIFRvIHByb3Blcmx5IGhhbmRsZSBmdW5jdGlvbiBwb2ludGVycywgaXQgaXMgY3VycmVudGx5IG5lY2Vzc2FyeSB0byB1c2UgPHR0PnR5cGVkZWYuPC90dD4gRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiA8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci12b2lkIGRvX29wZXJhdGlvbihkb3VibGUgKCpvcCkoZG91YmxlLGRvdWJsZSksIGRvdWJsZSBhLCBkb3VibGUgYik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXNob3VsZCBiZSBoYW5kbGVkIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXR5cGVkZWYgZG91YmxlICgqT1BfRlVOQykoZG91YmxlLGRvdWJsZSk7Ci12b2lkIGRvX29wZXJhdGlvbihPUF9GVU5DIG9wLCBkb3VibGUgYSwgZG91YmxlIGIpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TV0lHIHVuZGVyc3RhbmRzIGJvdGggdGhlIHR5cGVkZWYgZGVjbGFyYXRpb24gYW5kIHRoZSBsYXRlciBmdW5jdGlvbiBjYWxsLiBJdCB3aWxsIHRyZWF0IDx0dD5PUF9GVU5DPC90dD4ganVzdCBsaWtlIGFueSBvdGhlciBjb21wbGV4IGRhdGF0eXBlLiBJbiBvcmRlciBmb3IgdGhpcyBhcHByb2FjaCB0byB3b3JrLCBpdCBpcyBuZWNlc3NhcnkgdGhhdCB0aGUgdHlwZWRlZiBkZWNsYXJhdGlvbiBiZSBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCBDIGNvZGUtLW90aGVyd2lzZSwgdGhlIEMgY29tcGlsZXIgd2lsbCBjb21wbGFpbi4gSWYgeW91IGFyZSBidWlsZGluZyBhIHNlcGFyYXRlIGludGVyZmFjZSBmaWxlIHRvIGFuIGV4aXN0aW5nIEMgcHJvZ3JhbSBhbmQgZG8gbm90IHdhbnQgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZSBDIHNvdXJjZSwgeW91IGNhbiBhbHNvIGRvIHRoZSBmb2xsb3dpbmcgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8vIEZpbGUgOiBpbnRlcmZhY2UuaQotJXR5cGVkZWYgZG91YmxlICgqT1BfRlVOQykoZG91YmxlLGRvdWJsZSk7Ci1kb3VibGUgZG9fb3BlcmF0aW9uKE9QX0ZVTkMgb3AsIGRvdWJsZSBhLCBkb3VibGUgYik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTx0dD4ldHlwZWRlZjwvdHQ+IGZvcmNlcyBTV0lHIHRvIGdlbmVyYXRlIGEgPHR0PnR5cGVkZWY8L3R0PiBpbiB0aGUgQyBvdXRwdXQgY29kZSBmb3IgeW91LiBUaGlzIHdvdWxkIGFsbG93IHRoZSBpbnRlcmZhY2UgZmlsZSBzaG93biB0byB3b3JrIHdpdGggdGhlIG9yaWdpbmFsIHVubW9kaWZpZWQgQyBmdW5jdGlvbiBkZWNsYXJhdGlvbi48cD4KLTxwPgotQ29uc3RhbnRzIGNvbnRhaW5pbmcgdGhlIGFkZHJlc3NlcyBvZiBDIGZ1bmN0aW9ucyBjYW4gYWxzbyBiZSBjcmVhdGVkLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZXh0ZXJuIGRvdWJsZSBvcF9hZGQoZG91YmxlIGEsIGRvdWJsZSBiKTsKLWV4dGVybiBkb3VibGUgb3Bfc3ViKGRvdWJsZSBhLCBkb3VibGUgYik7Ci1leHRlcm4gZG91YmxlIG9wX211bChkb3VibGUgYSwgZG91YmxlIGIpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgYWRkcmVzc2VzIG9mIHRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBiZSBpbnN0YWxsZWQgYXMgc2NyaXB0aW5nIGxhbmd1YWdlIGNvbnN0YW50cyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBpbnRlcmZhY2UuaQotdHlwZWRlZiBkb3VibGUgKCpPUF9GVU5DKShkb3VibGUsZG91YmxlKTsKLS4uLgotY29uc3QgT1BfRlVOQyBBREQgPSBvcF9hZGQ7Ci1jb25zdCBPUF9GVU5DIFNVQiA9IG9wX3N1YjsKLWNvbnN0IE9QX0ZVTkMgTVVMID0gb3BfbXVsOwotLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gd3JhcHBlZCwgdGhpcyB3b3VsZCBjcmVhdGUgdGhlIGNvbnN0YW50cyA8dHQ+QUREPC90dD4sPHR0PlNVQjwvdHQ+LCBhbmQgPHR0Pk1VTDwvdHQ+IGNvbnRhaW5pbmcgdGhlIGFkZHJlc3NlcyBvZiBDIGNhbGxiYWNrIGZ1bmN0aW9ucy4gV2UgY291bGQgdGhlbiBwYXNzIHRoZXNlIHRvIG90aGVyIEMgZnVuY3Rpb25zIGV4cGVjdGluZyBzdWNoIGZ1bmN0aW9uIHBvaW50ZXJzIGFzIGFyZ3VtZW50cyBhcyBzaG93biAoZm9yIFRjbCkgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVkb19vcGVyYXRpb24gJEFERCAzIDQKLTcKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im41Ij48L2E+PGgyPiBTdHJ1Y3R1cmVzLCB1bmlvbnMsIGFuZCBvYmplY3Qgb3JpZW50ZWQgQyBwcm9ncmFtbWluZzwvaDI+Ci1JZiBTV0lHIGVuY291bnRlcnMgdGhlIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3R1cmUgb3IgdW5pb24sIGl0IHdpbGwgY3JlYXRlIGEgc2V0IG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgeW91LiBXaGlsZSBTV0lHIGRvZXMgbm90IG5lZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIHRvIGJ1aWxkIGFuIGludGVyZmFjZSwgcHJvdmlkaW5nIGRlZmluaXRpb25zIG1ha2UgaXQgcG9zc2libGUgdG8gYWNjZXNzIHN0cnVjdHVyZSBtZW1iZXJzLiBUaGUgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBieSBTV0lHIHNpbXBseSB0YWtlIGEgcG9pbnRlciB0byBhbiBvYmplY3QgYW5kIGFsbG93IGFjY2VzcyB0byBhbiBpbmRpdmlkdWFsIG1lbWJlci4gRm9yIGV4YW1wbGUsIHRoZSBkZWNsYXJhdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3RydWN0IFZlY3RvciB7Ci0JZG91YmxlIHgseSx6OwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1nZXRzIG1hcHBlZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIFZlY3Rvcl94X2dldChWZWN0b3IgKm9iaikgewotCXJldHVybiBvYmotJmd0O3g7Ci19Ci1kb3VibGUgVmVjdG9yX3lfZ2V0KFZlY3RvciAqb2JqKSB7IAotCXJldHVybiBvYmotJmd0O3k7Ci19Ci1kb3VibGUgVmVjdG9yX3pfZ2V0KFZlY3RvciAqb2JqKSB7IAotCXJldHVybiBvYmotJmd0O3o7Ci19Ci1kb3VibGUgVmVjdG9yX3hfc2V0KFZlY3RvciAqb2JqLCBkb3VibGUgdmFsdWUpIHsKLQlvYmotJmd0O3ggPSB2YWx1ZTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci1kb3VibGUgVmVjdG9yX3lfc2V0KFZlY3RvciAqb2JqLCBkb3VibGUgdmFsdWUpIHsKLQlvYmotJmd0O3kgPSB2YWx1ZTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci1kb3VibGUgVmVjdG9yX3pfc2V0KFZlY3RvciAqb2JqLCBkb3VibGUgdmFsdWUpIHsKLQlvYmotJmd0O3ogPSB2YWx1ZTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMzYiPjwvYT48aDM+IFR5cGVkZWYgYW5kIHN0cnVjdHVyZXM8L2gzPgotU1dJRyBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdCB3aGljaCBpcyBxdWl0ZSBjb21tb24gaW4gQyBwcm9ncmFtcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBzdHJ1Y3QgewotCWRvdWJsZSB4LHksejsKLX0gVmVjdG9yOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIGVuY291bnRlcmVkLCBTV0lHIHdpbGwgYXNzdW1lIHRoYXQgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBpcyBgVmVjdG9yJyBhbmQgY3JlYXRlIGFjY2Vzc29yIGZ1bmN0aW9ucyBsaWtlIGJlZm9yZS4gSWYgdHdvIGRpZmZlcmVudCBuYW1lcyBhcmUgdXNlZCBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGVkZWYgc3RydWN0IHZlY3Rvcl9zdHJ1Y3QgewotCWRvdWJsZSB4LHksejsKLX0gVmVjdG9yOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci10aGUgbmFtZSBgVmVjdG9yJyB3aWxsIHN0aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiAidmVjdG9yX3N0cnVjdCIuPHA+Ci08YSBuYW1lPSJuMzciPjwvYT48aDM+IENoYXJhY3RlciBzdHJpbmdzIGFuZCBzdHJ1Y3R1cmVzPC9oMz4KLVN0cnVjdHVyZXMgaW52b2x2aW5nIGNoYXJhY3RlciBzdHJpbmdzIHJlcXVpcmUgc29tZSBjYXJlLiBTV0lHIGFzc3VtZXMgdGhhdCBhbGwgbWVtYmVycyBvZiB0eXBlIDx0dD5jaGFyICo8L3R0PiBoYXZlIGJlZW4gZHluYW1pY2FsbHkgYWxsb2NhdGVkIHVzaW5nIDx0dD5tYWxsb2MoKTwvdHQ+IGFuZCB0aGF0IHRoZXkgYXJlIE5VTEwtdGVybWluYXRlZCBBU0NJSSBzdHJpbmdzLiBXaGVuIHN1Y2ggYSBtZW1iZXIgaXMgbW9kaWZpZWQsIHRoZSBwcmV2aW91c2x5IGNvbnRlbnRzIHdpbGwgYmUgcmVsZWFzZWQsIGFuZCB0aGUgbmV3IGNvbnRlbnRzIGFsbG9jYXRlZC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbXltb2R1bGUKLS4uLgotc3RydWN0IEZvbyB7Ci0JY2hhciAqbmFtZTsKLQkuLi4KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgYWNjZXNzb3IgZnVuY3Rpb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jaGFyICpGb29fbmFtZV9nZXQoRm9vICpvYmopIHsKLQlyZXR1cm4gRm9vLSZndDtuYW1lOwotfQotCi1jaGFyICpGb29fbmFtZV9zZXQoRm9vICpvYmosIGNoYXIgKmMpIHsKLQlpZiAob2JqLSZndDtuYW1lKSBmcmVlKG9iai0mZ3Q7bmFtZSk7Ci0Jb2JqLSZndDtuYW1lID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihjKSsxKTsKLQlzdHJjcHkob2JqLSZndDtuYW1lLGMpOwotCXJldHVybiBvYmotJmd0O25hbWU7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgc2VlbXMgdG8gd29yayBtb3N0IG9mIHRoZSB0aW1lLCBidXQgb2NjYXNpb25hbGx5IGl0J3Mgbm90IGFsd2F5cyB3aGF0IHlvdSB3YW50LiBUeXBlbWFwcyBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvciBpZiBuZWNlc3NhcnkuPHA+Ci08YSBuYW1lPSJuMzgiPjwvYT48aDM+IEFycmF5IG1lbWJlcnM8L2gzPgotQXJyYXlzIG1heSBhcHBlYXIgYXMgdGhlIG1lbWJlcnMgb2Ygc3RydWN0dXJlcywgYnV0IHRoZXkgd2lsbCBiZSByZWFkLW9ubHkuIFNXSUcgd2lsbCB3cml0ZSBhbiBhY2Nlc3NvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5LCBidXQgd2lsbCBub3Qgd3JpdGUgYSBmdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGFycmF5IGl0c2VsZi4gVGhpcyByZXN0cmljdGlvbiBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBDIHdvbid0IGxldCB1cyBjaGFuZ2UgdGhlICJ2YWx1ZSIgb2YgYW4gYXJyYXkuIFdoZW4gdGhpcyBzaXR1YXRpb24gaXMgZGV0ZWN0ZWQsIFNXSUcgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50ZXJmYWNlLmkgOiBMaW5lIDExNi4gV2FybmluZy4gQXJyYXkgbWVtYmVyIHdpbGwgYmUgcmVhZC1vbmx5Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIGVsaW1pbmF0ZSB0aGUgd2FybmluZyBtZXNzYWdlLCB0eXBlbWFwcyBjYW4gYmUgdXNlZCwgYnV0IHRoaXMgaXMgZGlzY3Vzc2VkIGluIGEgbGF0ZXIgY2hhcHRlciAoYW5kIGJlc3QgcmVzZXJ2ZWQgZm9yIGV4cGVyaWVuY2VkIHVzZXJzKS4gT3RoZXJ3aXNlLCBpZiB5b3UgZ2V0IHRoaXMgd2FybmluZywgaXQgbWF5IGJlIGhhcm1sZXNzLjxwPgotPGEgbmFtZT0ibjM5Ij48L2E+PGgzPiBDIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgPC9oMz4KLVdoaWxlIG5vdCBwYXJ0IG9mIHRoZSBDIGxhbmd1YWdlLCBpdCBpcyB1c3VhbGx5IHVzZWZ1bCB0byBoYXZlIHNvbWUgbWVjaGFuaXNtIGZvciBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBhbiBvYmplY3QuIFlvdSBjYW4sIG9mIGNvdXJzZSwgZG8gdGhpcyB5b3Vyc2VsZiBieSBtYWtpbmcgYW4gYXBwcm9wcmlhdGUgY2FsbCB0byA8dHQ+bWFsbG9jKCk8L3R0PiwgYnV0IFNXSUcgY2FuIG1ha2Ugc3VjaCBmdW5jdGlvbnMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5IGlmIHlvdSB1c2UgQysrIHN5bnRheCBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbXltb2R1bGUKLS4uLgotc3RydWN0IFZlY3RvciB7Ci0JVmVjdG9yKCk7IAkJCS8vIFRlbGwgU1dJRyB0byBjcmVhdGUgYSBDIGNvbnN0cnVjdG9yCi0JflZlY3RvcigpOwkJCS8vIFRlbGwgU1dJRyB0byBjcmVhdGUgYSBDIGRlc3RydWN0b3IKLQlkb3VibGUgeCx5LHo7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gdXNlZCB3aXRoIEMgY29kZSwgU1dJRyB3aWxsIGNyZWF0ZSB0d28gYWRkaXRpb25hbCBmdW5jdGlvbnMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5WZWN0b3IgKm5ld19WZWN0b3IoKSB7Ci0JcmV0dXJuIChWZWN0b3IgKikgbWFsbG9jKHNpemVvZihWZWN0b3IpKTsKLX0KLQotdm9pZCBkZWxldGVfVmVjdG9yKFZlY3RvciAqdikgewotCWZyZWUodik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIEMga25vd3Mgbm90aGluZyBhYm91dCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLCBTV0lHIGRvZXMtLS1hbmQgaXQgY2FuIGF1dG9tYXRpY2FsbHkgY3JlYXRlIHNvbWUgZm9yIHlvdSBpZiB5b3Ugd2FudC4gVGhpcyBvbmx5IGFwcGxpZXMgdG8gQyBjb2RlLS1oYW5kbGluZyBvZiBDKysgaXMgaGFuZGxlZCBkaWZmZXJlbnRseS48cD4KLTxwPgotQXMgYW4gYWx0ZXJuYXRpdmUgdG8gZXhwbGljaXRseSBkZWZpbmluZyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLCBTV0lHIGNhbiBhbHNvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlbSB1c2luZyBlaXRoZXIgYSBjb21tYW5kIGxpbmUgb3B0aW9uIG9yIGEgcHJhZ21hLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtbWFrZV9kZWZhdWx0IGV4YW1wbGUuaSAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3I8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGZvbwotLi4uCi0lcHJhZ21hIG1ha2VfZGVmYXVsdCAJCQkJCS8vIE1ha2UgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKLS4uLiBkZWNsYXJhdGlvbnMgLi4uCi0lcHJhZ21hIG5vX2RlZmF1bHQJCQkJCS8vIERpc2FibGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3b3JrcyB3aXRoIGJvdGggQyBhbmQgQysrLjxwPgotPGEgbmFtZT0ibjQwIj48L2E+PGgzPiBBZGRpbmcgbWVtYmVyIGZ1bmN0aW9ucyB0byBDIHN0cnVjdHVyZXM8L2gzPgotTWFueSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGNyZWF0aW5nIGNsYXNzZXMgYW5kIHN1cHBvcnRpbmcgb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nLiBGcm9tIGEgQyBzdGFuZHBvaW50LCBvYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcgcmVhbGx5IGp1c3QgYm9pbHMgZG93biB0byB0aGUgcHJvY2VzcyBvZiBhdHRhY2hpbmcgZnVuY3Rpb25zIHRvIHN0cnVjdHVyZXMuIFRoZXNlIGZ1bmN0aW9ucyB0eXBpY2FsbHkgb3BlcmF0ZSBvbiB0aGUgc3RydWN0dXJlIChvciBvYmplY3QpIGluIHNvbWUgd2F5IG9yIGFub3RoZXIuIFdoaWxlIHRoZXJlIGlzIGEgbmF0dXJhbCBtYXBwaW5nIG9mIEMrKyB0byBzdWNoIGEgc2NoZW1lLCB0aGVyZSBpcyBubyBkaXJlY3QgbWVjaGFuaXNtIGZvciB1dGlsaXppbmcgaXQgd2l0aCBDIGNvZGUuIEhvd2V2ZXIsIFNXSUcgcHJvdmlkZXMgYSBzcGVjaWFsIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGF0dGFjaCBtZXRob2RzIHRvIEMgc3RydWN0dXJlcyBmb3IgcHVycG9zZXMgb2YgYnVpbGRpbmcgYW4gb2JqZWN0IG9yaWVudGVkIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFN1cHBvc2UgeW91IGhhdmUgYSBDIGhlYWRlciBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogZmlsZSA6IHZlY3Rvci5oICovCi0uLi4KLXR5cGVkZWYgc3RydWN0IHsKLQlkb3VibGUgeCx5LHo7Ci19IFZlY3RvcjsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotWW91IGNhbiBtYWtlIGEgVmVjdG9yIGxvb2sgYWxvdCBsaWtlIGEgY2xhc3MgYnkgZG9pbmcgdGhlIGZvbGxvd2luZyBpbiBhbiBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gZmlsZSA6IHZlY3Rvci5pCi0lbW9kdWxlIG15bW9kdWxlCi0lewotI2luY2x1ZGUgInZlY3Rvci5oIgotJX0KLQotJWluY2x1ZGUgdmVjdG9yLmggCQkJCS8vIEp1c3QgZ3JhYiBvcmlnaW5hbCBDIGhlYWRlciBmaWxlCi0lYWRkbWV0aG9kcyBWZWN0b3IgeyAJCQkJLy8gQXR0YWNoIHRoZXNlIGZ1bmN0aW9ucyB0byBzdHJ1Y3QgVmVjdG9yCi0JVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIHsKLQkJVmVjdG9yICp2OwotCQl2ID0gKFZlY3RvciAqdikgbWFsbG9jKHNpemVvZihWZWN0b3IpKTsKLQkJdi0mZ3Q7eCA9IHg7Ci0JCXYtJmd0O3kgPSB5OwotCQl2LSZndDt6ID0gejsKLQkJcmV0dXJuIHY7Ci0JfQotCX5WZWN0b3IoKSB7Ci0JCWZyZWUoc2VsZik7Ci0JfQotCWRvdWJsZSBtYWduaXR1ZGUoKSB7Ci0JCXJldHVybiBzcXJ0KHNlbGYtJmd0O3gqc2VsZi0mZ3Q7eCtzZWxmLSZndDt5KnNlbGYtJmd0O3krc2VsZi0mZ3Q7eipzZWxmLSZndDt6KTsKLQl9Ci0Jdm9pZCBwcmludCgpIHsKLQkJcHJpbnRmKCJWZWN0b3IgWyVnLCAlZywgJWddXG4iLCBzZWxmLSZndDt4LHNlbGYtJmd0O3ksc2VsZi0mZ3Q7eik7Ci0JfQotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCB3aGVuIHVzZWQgd2l0aCBzaGFkb3cgY2xhc3NlcyBpbiBQeXRob24sIHlvdSBjYW4gZG8gdGhpbmdzIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Jmd0OyZndDsmZ3Q7IHYgPSBWZWN0b3IoMyw0LDApIAkJCQkJIyBDcmVhdGUgYSBuZXcgdmVjdG9yCi0mZ3Q7Jmd0OyZndDsgcHJpbnQgdi5tYWduaXR1ZGUoKQkJCQkJIyBQcmludCBtYWduaXR1ZGUKLTUuMAotJmd0OyZndDsmZ3Q7IHYucHJpbnQoKQkJCQkJIyBQcmludCBpdCBvdXQKLVsgMywgNCwgMCBdCi0mZ3Q7Jmd0OyZndDsgZGVsIHYJCQkJCSMgRGVzdHJveSBpdAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgPHR0PiVhZGRtZXRob2RzPC90dD4gZGlyZWN0aXZlIGNhbiBhbHNvIGJlIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgdGhlIFZlY3RvciBzdHJ1Y3R1cmUuIEZvciBleGFtcGxlOjxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBmaWxlIDogdmVjdG9yLmkKLSVtb2R1bGUgbXltb2R1bGUKLSV7Ci0jaW5jbHVkZSAidmVjdG9yLmgiCi0lfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JZG91YmxlIHgseSx6OwotCSVhZGRtZXRob2RzIHsKLQkJVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIHsgLi4uIH0KLQkJflZlY3RvcigpIHsgLi4uIH0KLQkJLi4uCi0JfQotfSBWZWN0b3I7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUZpbmFsbHksIDx0dD4lYWRkbWV0aG9kczwvdHQ+IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBleHRlcm5hbGx5IHdyaXR0ZW4gZnVuY3Rpb25zIHByb3ZpZGVkIHRoZXkgZm9sbG93IHRoZSBuYW1pbmcgY29udmVudGlvbiB1c2VkIGluIHRoaXMgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IHZlY3Rvci5jICovCi0vKiBWZWN0b3IgbWV0aG9kcyAqLwotI2luY2x1ZGUgInZlY3Rvci5oIgotVmVjdG9yICpuZXdfVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIHsKLQlWZWN0b3IgKnY7Ci0JdiA9IChWZWN0b3IgKikgbWFsbG9jKHNpemVvZihWZWN0b3IpKTsKLQl2LSZndDt4ID0geDsKLQl2LSZndDt5ID0geTsKLQl2LSZndDt6ID0gejsKLQlyZXR1cm4gdjsKLX0KLXZvaWQgZGVsZXRlX1ZlY3RvcihWZWN0b3IgKnYpIHsKLQlmcmVlKHYpOwotfQotCi1kb3VibGUgVmVjdG9yX21hZ25pdHVkZShWZWN0b3IgKnYpIHsKLQlyZXR1cm4gc3FydCh2LSZndDt4KnYtJmd0O3grdi0mZ3Q7eSp2LSZndDt5K3YtJmd0O3oqdi0mZ3Q7eik7Ci19Ci0KLS8vIEZpbGUgOiB2ZWN0b3IuaQotLy8gSW50ZXJmYWNlIGZpbGUKLSVtb2R1bGUgbXltb2R1bGUKLSV7Ci0jaW5jbHVkZSAidmVjdG9yLmgiCi0lfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JZG91YmxlIHgseSx6OwotCSVhZGRtZXRob2RzIHsKLQkJZG91YmxlIG1hZ25pdHVkZSgpOyAJCQkvLyBUaGlzIHdpbGwgY2FsbCBWZWN0b3JfbWFnbml0dWRlCi0JCS4uLgotCX0KLX0gVmVjdG9yOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TbyB3aHkgYm90aGVyIHdpdGggYWxsIG9mIHRoaXMgPHR0PiVhZGRtZXRob2RzPC90dD4gYnVzaW5lc3M/IEluIHNob3J0LCB5b3UgY2FuIHVzZSBpdCB0byBtYWtlIHNvbWUgcHJldHR5IGNvb2wgYG9iamVjdCBvcmllbnRlZCcgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMgdG8gQyBwcm9ncmFtcyB3aXRob3V0IGhhdmluZyB0byByZXdyaXRlIGFueXRoaW5nIGluIEMrKy4gPHA+Ci08YSBuYW1lPSJuNDEiPjwvYT48aDM+IE5lc3RlZCBzdHJ1Y3R1cmVzPC9oMz4KLU9jY2FzaW9uYWxseSwgYSBDIHByb2dyYW0gd2lsbCBpbnZvbHZlIHN0cnVjdHVyZXMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT50eXBlZGVmIHN0cnVjdCBPYmplY3QgewotCWludCBvYmp0eXBlOwotCXVuaW9uIHsKLQkJaW50IAlpdmFsdWU7Ci0JCWRvdWJsZQlkdmFsdWU7Ci0JCWNoYXIJKnN0cnZhbHVlOwotCQl2b2lkCSpwdHJ2YWx1ZTsKLQl9IGludFJlcDsKLX0gT2JqZWN0OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIFNXSUcgZW5jb3VudGVycyB0aGlzLCBpdCBwZXJmb3JtcyBhIHN0cnVjdHVyZSBzcGxpdHRpbmcgb3BlcmF0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgZGVjbGFyYXRpb24gaW50byB0aGUgZXF1aXZhbGVudCBvZiB0aGUgZm9sbG93aW5nOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGVkZWYgdW5pb24gewotCWludCAJCWl2YWx1ZTsKLQlkb3VibGUJCWR2YWx1ZTsKLQljaGFyCQkqc3RydmFsdWU7Ci0Jdm9pZAkJKnB0cnZhbHVlOwotfSBPYmplY3RfaW50UmVwOwotCi10eXBlZGVmIHN0cnVjdCBPYmplY3QgewotCWludCBvYmpUeXBlOwotCU9iamVjdF9pbnRSZXAgaW50UmVwOwotfSBPYmplY3Q7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNXSUcgd2lsbCBjcmVhdGUgYW4gPHR0Pk9iamVjdF9pbnRSZXA8L3R0PiBzdHJ1Y3R1cmUgZm9yIHVzZSBpbnNpZGUgdGhlIGludGVyZmFjZSBmaWxlLiBBY2Nlc3NvciBmdW5jdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGZvciBib3RoIHN0cnVjdHVyZXMuIEluIHRoaXMgY2FzZSwgZnVuY3Rpb25zIGxpa2UgdGhpcyB3b3VsZCBiZSBjcmVhdGVkIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5PYmplY3RfaW50UmVwICpPYmplY3RfaW50UmVwX2dldChPYmplY3QgKm8pIHsKLQlyZXR1cm4gKE9iamVjdF9pbnRSZXAgKikgJmFtcDtvLSZndDtpbnRSZXA7Ci19Ci1pbnQgT2JqZWN0X2ludFJlcF9pdmFsdWVfZ2V0KE9iamVjdF9pbnRSZXAgKm8pIHsKLQlyZXR1cm4gby0mZ3Q7aXZhbHVlOwotfQotaW50IE9iamVjdF9pbnRSZXBfaXZhbHVlX3NldChPYmplY3RfaW50UmVwICpvLCBpbnQgdmFsdWUpIHsKLQlyZXR1cm4gKG8tJmd0O2l2YWx1ZSA9IHZhbHVlKTsKLX0KLWRvdWJsZSBPYmplY3RfaW50UmVwX2R2YWx1ZV9nZXQoT2JqZWN0X2ludFJlcCAqbykgewotCXJldHVybiBvLSZndDtkdmFsdWU7Ci19Ci0uLi4gZXRjIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JcyBpdCBoYWlyeT8gWW91IGJldC4gRG9lcyBpdCB3b3JrPyBXZWxsLCBzdXJwcmlzaW5nbHkgeWVzLiBXaGVuIHVzZWQgd2l0aCBQeXRob24gYW5kIFBlcmw1IHNoYWRvdyBjbGFzc2VzLCBpdCdzIGV2ZW4gcG9zc2libGUgdG8gYWNjZXNzIHRoZSBuZXN0ZWQgbWVtYmVycyBqdXN0IGxpa2UgeW91IGV4cGVjdCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBQZXJsNSBzY3JpcHQgZm9yIGFjY2Vzc2luZyBuZXN0ZWQgbWVtYmVyCi0kbyA9IENyZWF0ZU9iamVjdCgpOyAJCQkJIyBDcmVhdGUgYW4gb2JqZWN0IHNvbWVob3cKLSRvLSZndDt7aW50UmVwfS0mZ3Q7e2l2YWx1ZX0gPSA3IAkJCQkjIENoYW5nZSB2YWx1ZSBvZiBvLmludFJlcC5pdmFsdWUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSWYgeW91J3ZlIGdvdCBhIGJ1bmNoIG9mIG5lc3RlZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zLCBpdCBpcyBjZXJ0YWlubHkgYWR2aXNhYmxlIHRvIGNoZWNrIHRoZW0gb3V0IGFmdGVyIHJ1bm5pbmcgU1dJRy4gSG93ZXZlciwgdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0IHRoZXkgd2lsbCB3b3JrLiBJZiBub3QsIHlvdSBjYW4gYWx3YXlzIHJlbW92ZSB0aGUgbmVzdGVkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbiBhbmQgd3JpdGUgeW91ciBvd24gc2V0IG9mIGFjY2Vzc29yIGZ1bmN0aW9ucy48cD4KLTxhIG5hbWU9Im40MiI+PC9hPjxoMz4gT3RoZXIgdGhpbmdzIHRvIG5vdGUgYWJvdXQgc3RydWN0dXJlczwvaDM+Ci1TV0lHIGRvZXNuJ3QgY2FyZSBpZiB0aGUgZGVmaW5pdGlvbiBvZiBhIHN0cnVjdHVyZSBleGFjdGx5IG1hdGNoZXMgdGhhdCB1c2VkIGluIHRoZSB1bmRlcmx5aW5nIEMgY29kZSAoZXhjZXB0IGluIHRoZSBjYXNlIG9mIG5lc3RlZCBzdHJ1Y3R1cmVzKS4gRm9yIHRoaXMgcmVhc29uLCB0aGVyZSBhcmUgbm8gcHJvYmxlbXMgb21pdHRpbmcgcHJvYmxlbWF0aWMgbWVtYmVycyBvciBzaW1wbHkgb21pdHRpbmcgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGFsdG9nZXRoZXIuIElmIHlvdSBhcmUgaGFwcHkgc2ltcGx5IHBhc3NpbmcgcG9pbnRlcnMgYXJvdW5kLCB0aGlzIGNhbiBiZSBkb25lIHdpdGhvdXQgZXZlciBnaXZpbmcgU1dJRyBhIHN0cnVjdHVyZSBkZWZpbml0aW9uLjxwPgotPHA+Ci1JdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgbW9zdCBsYW5ndWFnZSBtb2R1bGVzIG1heSBjaG9vc2UgdG8gYnVpbGQgYSBtb3JlIGFkdmFuY2VkIGludGVyZmFjZS4gWW91IG1heSBuZXZlciB1c2UgdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UgZGVzY3JpYmVkIGhlcmUsIGFsdGhvdWdoIG1vc3Qgb2YgU1dJRydzIGxhbmd1YWdlIG1vZHVsZXMgdXNlIGl0IGluIHNvbWUgd2F5IG9yIGFub3RoZXIuPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMj4gQysrIHN1cHBvcnQ8L2gyPgotU1dJRydzIHN1cHBvcnQgZm9yIEMrKyBpcyBhbiBleHRlbnNpb24gb2YgdGhlIHN1cHBvcnQgZm9yIEMgZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGFuZCBzdHJ1Y3R1cmVzLiBIb3dldmVyLCBTV0lHIG9ubHkgc3VwcG9ydHMgYSBzdWJzZXQgb2YgdGhlIEMrKyBsYW5ndWFnZS4gSXQgaGFzIG5ldmVyIGJlZW4gbXkgZ29hbCB0byB3cml0ZSBhIGZ1bGwgQysrIGNvbXBpbGVyIG9yIHRvIHR1cm4gc2NyaXB0aW5nIGxhbmd1YWdlcyBpbnRvIHNvbWUgc29ydCBvZiB3ZWlyZCBwc2V1ZG8gQysrIGludGVycHJldGVyIChjb25zaWRlcmluZyBob3cgaGFyZCBpdCBpcyB0byB3cml0ZSBhIEMrKyBjb21waWxlciwgSSdtIG5vdCBzdXJlIHRoaXMgd291bGQgZXZlbiBiZSBmZWFzaWJsZSBhbnl3YXlzKS4gPHA+Ci08cD4KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgU1dJRydzIGxvdy1sZXZlbCBhY2Nlc3MgdG8gQysrIGRlY2xhcmF0aW9ucy4gSW4gbWFueSBpbnN0YW5jZXMsIHRoaXMgbG93LWxldmVsIGludGVyZmFjZSBtYXkgYmUgaGlkZGVuIGJ5IHNoYWRvdyBjbGFzc2VzIG9yIGFuIGFsdGVybmF0aXZlIGNhbGxpbmcgbWVjaGFuaXNtICh0aGlzIGlzIHVzdWFsbHkgbGFuZ3VhZ2UgZGVwZW5kZW50IGFuZCBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGluIGxhdGVyIGNoYXB0ZXJzKS48cD4KLTxhIG5hbWU9Im40MyI+PC9hPjxoMz4gU3VwcG9ydGVkIEMrKyBmZWF0dXJlczwvaDM+Ci1TV0lHIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQysrIGZlYXR1cmVzIDo8cD4KLTxwPgotPHVsPgotPGxpPlNpbXBsZSBjbGFzcyBkZWZpbml0aW9ucwotPGxpPkNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMKLTxsaT5WaXJ0dWFsIGZ1bmN0aW9ucwotPGxpPlB1YmxpYyBpbmhlcml0YW5jZSAoaW5jbHVkaW5nIG11bHRpcGxlIGluaGVyaXRhbmNlKQotPGxpPlN0YXRpYyBmdW5jdGlvbnMKLTxsaT5SZWZlcmVuY2VzCi08L3VsPgotPHA+Ci1UaGUgZm9sbG93aW5nIEMrKyBmZWF0dXJlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgOjxwPgotPHA+Ci08dWw+Ci08bGk+T3BlcmF0b3Igb3ZlcmxvYWRpbmcKLTxsaT5GdW5jdGlvbiBvdmVybG9hZGluZyAod2l0aG91dCByZW5hbWluZykKLTxsaT5UZW1wbGF0ZXMgKGFueXRoaW5nIHRoYXQgd291bGQgYmUgZGVmaW5lZCB1c2luZyB0aGUgYDx0dD50ZW1wbGF0ZTwvdHQ+JyBrZXl3b3JkKS4KLTxsaT5GcmllbmRzCi08bGk+TmVzdGVkIGNsYXNzZXMKLTxsaT5OYW1lc3BhY2VzCi08bGk+UG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucy4KLTwvdWw+Ci08cD4KLVNpbmNlIFNXSUcncyBDKysgc3VwcG9ydCBpcyBhICJ3b3JrIGluIHByb2dyZXNzIiwgbWFueSBvZiB0aGVzZSBsaW1pdGF0aW9ucyBtYXkgYmUgbGlmdGVkIGluIGZ1dHVyZSByZWxlYXNlcy4gSW4gcGFydGljdWxhciwgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgYW5kIG5lc3RlZCBjbGFzc2VzLCBtYXkgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuIE9wZXJhdG9yIG92ZXJsb2FkaW5nIGFuZCB0ZW1wbGF0ZXMgYXJlIHVubGlrZWx5IHRvIGJlIHN1cHBvcnRlZCBhbnl0aW1lIGluIHRoZSBuZWFyIGZ1dHVyZSwgYnV0IEknbSBub3QgZ29pbmcgdG8gcnVsZSBvdXQgdGhlIHBvc3NpYmlsaXR5IGluIGxhdGVyIHJlbGVhc2VzLjxwPgotPGEgbmFtZT0ibjQ0Ij48L2E+PGgzPiBDKysgZXhhbXBsZTwvaDM+Ci1UaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgYSBTV0lHIGludGVyZmFjZSBmaWxlIGZvciBhIHNpbXBsZSBDKysgY2xhc3MuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBsaXN0Ci0lewotI2luY2x1ZGUgImxpc3QuaCIKLSV9Ci0KLS8vIFZlcnkgc2ltcGxlIEMrKyBleGFtcGxlIGZvciBsaW5rZWQgbGlzdAotCi1jbGFzcyBMaXN0IHsKLXB1YmxpYzoKLSAgTGlzdCgpOwotICB+TGlzdCgpOwotICBpbnQgIHNlYXJjaChjaGFyICp2YWx1ZSk7Ci0gIHZvaWQgaW5zZXJ0KGNoYXIgKik7Ci0gIHZvaWQgcmVtb3ZlKGNoYXIgKik7Ci0gIGNoYXIgKmdldChpbnQgbik7Ci0gIGludCAgbGVuZ3RoOwotc3RhdGljIHZvaWQgcHJpbnQoTGlzdCAqbCk7Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVuIGNvbXBpbGluZyBDKysgY29kZSwgaXQgaXMgY3JpdGljYWwgdGhhdCBTV0lHIGJlIGNhbGxlZCB3aXRoIHRoZSBgPHR0Pi1jKys8L3R0Picgb3B0aW9uLiBUaGlzIGNoYW5nZXMgdGhlIHdheSBhIG51bWJlciBvZiBjcml0aWNhbCBmZWF0dXJlcyBhcmUgaGFuZGxlZCB3aXRoIHJlc3BlY3QgdG8gZGlmZmVyZW5jZXMgYmV0d2VlbiBDIGFuZCBDKysuIEl0IGFsc28gZW5hYmxlcyB0aGUgZGV0ZWN0aW9uIG9mIEMrKyBrZXl3b3Jkcy4gV2l0aG91dCB0aGUgPHR0Pi1jKys8L3R0PiBmbGFnLCBTV0lHIHdpbGwgZWl0aGVyIGlzc3VlIGEgd2FybmluZyBvciBhIGxhcmdlIG51bWJlciBvZiBzeW50YXggZXJyb3JzIGlmIGl0IGVuY291bnRlcnMgYW55IEMrKyBjb2RlIGluIGFuIGludGVyZmFjZSBmaWxlLjxwPgotPGEgbmFtZT0ibjQ1Ij48L2E+PGgzPiBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzPC9oMz4KLUMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGFyZSB0cmFuc2xhdGVkIGludG8gYWNjZXNzb3IgZnVuY3Rpb25zIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+TGlzdCAqIG5ld19MaXN0KHZvaWQpIHsKLQlyZXR1cm4gbmV3IExpc3Q7Ci19Ci12b2lkIGRlbGV0ZV9MaXN0KExpc3QgKmwpIHsKLQlkZWxldGUgbDsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSWYgdGhlIG9yaWdpbmFsIEMrKyBjbGFzcyBkb2VzIG5vdCBoYXZlIGFueSBjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMsIHB1dHRpbmcgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBpbiB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZSB3aWxsIGNhdXNlIFNXSUcgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgZm9yIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG9mIGFuIG9iamVjdC48cD4KLTxhIG5hbWU9Im40NiI+PC9hPjxoMz4gTWVtYmVyIGZ1bmN0aW9uczwvaDM+Ci1NZW1iZXIgZnVuY3Rpb25zIGFyZSB0cmFuc2xhdGVkIGludG8gYWNjZXNzb3IgZnVuY3Rpb25zIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+aW50IExpc3Rfc2VhcmNoKExpc3QgKm9iaiwgY2hhciAqdmFsdWUpIHsKLQlyZXR1cm4gb2JqLSZndDtzZWFyY2godmFsdWUpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1WaXJ0dWFsIG1lbWJlciBmdW5jdGlvbnMgYXJlIHRyZWF0ZWQgaW4gYW4gaWRlbnRpY2FsIG1hbm5lciBzaW5jZSB0aGUgQysrIGNvbXBpbGVyIHRha2VzIGNhcmUgb2YgdGhpcyBmb3IgdXMgYXV0b21hdGljYWxseS48cD4KLTxhIG5hbWU9Im40NyI+PC9hPjxoMz4gU3RhdGljIG1lbWJlcnM8L2gzPgotU3RhdGljIG1lbWJlciBmdW5jdGlvbnMgYXJlIGNhbGxlZCBkaXJlY3RseSB3aXRob3V0IG1ha2luZyBhbnkgYWRkaXRpb25hbCBDIHdyYXBwZXJzLiBGb3IgZXhhbXBsZSwgdGhlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gPHR0PnByaW50KExpc3QgKmwpPC90dD4gd2lsbCBzaW1wbHkgYmUgY2FsbGVkIGFzIDx0dD5MaXN0OjpwcmludChMaXN0ICpsKTwvdHQ+IGluIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlLjxwPgotPGEgbmFtZT0ibjQ4Ij48L2E+PGgzPiBNZW1iZXIgZGF0YTwvaDM+Ci1NZW1iZXIgZGF0YSBpcyBoYW5kbGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyIGFzIHVzZWQgZm9yIEMgc3RydWN0dXJlcy4gQSBwYWlyIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyB3aWxsIGJlIGNyZWF0ZWQuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnQgTGlzdF9sZW5ndGhfZ2V0KExpc3QgKm9iaikgewotCXJldHVybiBvYmotJmd0O2xlbmd0aDsKLX0KLWludCBMaXN0X2xlbmd0aF9zZXQoTGlzdCAqb2JqLCBpbnQgdmFsdWUpIHsKLQlvYmotJmd0O2xlbmd0aCA9IHZhbHVlOwotCXJldHVybiB2YWx1ZTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQSByZWFkLW9ubHkgbWVtYmVyIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSA8dHQ+JXJlYWRvbmx5PC90dD4gYW5kIDx0dD4lcmVhZHdyaXRlPC90dD4gZGlyZWN0aXZlcy4gRm9yIGV4YW1wbGUsIHdlIHByb2JhYmx5IHdvdWxkbid0IHdhbnQgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBsZW5ndGggb2YgYSBsaXN0IHNvIHdlIGNvdWxkIGRvIHRoZSBmb2xsb3dpbmcgdG8gbWFrZSB0aGUgdmFsdWUgYXZhaWxhYmxlLCBidXQgcmVhZC1vbmx5LjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIExpc3QgewotcHVibGljOgotLi4uCi0lcmVhZG9ubHkKLQlpbnQgbGVuZ3RoOwotJXJlYWR3cml0ZQotLi4uCi19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjQ5Ij48L2E+PGgzPiBQcm90ZWN0aW9uPC9oMz4KLVNXSUcgY2FuIG9ubHkgd3JhcCBjbGFzcyBtZW1iZXJzIHRoYXQgYXJlIGRlY2xhcmVkIHB1YmxpYy4gQW55dGhpbmcgc3BlY2lmaWVkIGluIGEgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgc2VjdGlvbiB3aWxsIHNpbXBseSBiZSBpZ25vcmVkLiBUbyBzaW1wbGlmeSB5b3VyIGludGVyZmFjZSBmaWxlLCB5b3UgbWF5IHdhbnQgdG8gY29uc2lkZXIgZWxpbWluYXRpbmcgYWxsIHByaXZhdGUgYW5kIHByb3RlY3RlZCBkZWNsYXJhdGlvbnMgKGlmIHlvdSd2ZSBjb3BpZWQgYSBDKysgaGVhZGVyIGZpbGUgZm9yIGV4YW1wbGUpLjxwPgotPHA+Ci1CeSBkZWZhdWx0LCBtZW1iZXJzIG9mIGEgY2xhc3MgZGVmaW5pdGlvbiBhcmUgYXNzdW1lZCB0byBiZSBwcml2YXRlIHVudGlsIHlvdSBleHBsaWNpdGx5IGdpdmUgYSBgPHR0PnB1YmxpYzo8L3R0PicgZGVjbGFyYXRpb24gKFRoaXMgaXMgdGhlIHNhbWUgY29udmVudGlvbiB1c2VkIGJ5IEMrKykuPHA+Ci08YSBuYW1lPSJuNTAiPjwvYT48aDM+IEVudW1zIGFuZCBjb25zdGFudHM8L2gzPgotRW51bWVyYXRpb25zIGFuZCBjb25zdGFudHMgcGxhY2VkIGluIGEgY2xhc3MgZGVmaW5pdGlvbiBhcmUgbWFwcGVkIGludG8gY29uc3RhbnRzIHdpdGggdGhlIGNsYXNzbmFtZSBhcyBhIHByZWZpeC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIFN3aWcgewotcHVibGljOgotCWVudW0ge0FMRSwgTEFHRVIsIFBPUlRFUiwgU1RPVVR9OwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotR2VuZXJhdGVzIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGNvbnN0YW50cyBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+U3dpZ19BTEUgPSBTd2lnOjpBTEUKLVN3aWdfTEFHRVIgPSBTd2lnOjpMQUdFUgotU3dpZ19QT1JURVIgPSBTd2lnOjpQT1JURVIKLVN3aWdfU1RPVVQgPSBTd2lnOjpTVE9VVAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1NZW1iZXJzIGRlY2xhcmVkIGFzIDx0dD5jb25zdDwvdHQ+IGFyZSB3cmFwcGVkIGluIGEgc2ltaWxhciBtYW5uZXIuPHA+Ci08YSBuYW1lPSJuNTEiPjwvYT48aDM+IFJlZmVyZW5jZXM8L2gzPgotQysrIHJlZmVyZW5jZXMgYXJlIHN1cHBvcnRlZCwgYnV0IFNXSUcgd2lsbCB0cmVhdCB0aGVtIGFzIHBvaW50ZXJzLiBGb3IgZXhhbXBsZSwgYSBkZWNsYXJhdGlvbiBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIEZvbyB7Ci1wdWJsaWM6Ci0JZG91YmxlIGJhcihkb3VibGUgJmFtcDthKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotd2lsbCBiZSBhY2Nlc3NlZCB1c2luZyBhIGZ1bmN0aW9uIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIEZvb19iYXIoRm9vICpvYmosIGRvdWJsZSAqYSkgewotCW9iai0mZ3Q7YmFyKCphKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRnVuY3Rpb25zIHJldHVybmluZyBhIHJlZmVyZW5jZSB3aWxsIGJlIG1hcHBlZCBpbnRvIGZ1bmN0aW9ucyByZXR1cm5pbmcgcG9pbnRlcnMuPHA+Ci08YSBuYW1lPSJuNTIiPjwvYT48aDM+IEluaGVyaXRhbmNlPC9oMz4KLVNXSUcgc3VwcG9ydHMgYmFzaWMgQysrIHB1YmxpYyBpbmhlcml0YW5jZSBvZiBjbGFzc2VzIGFuZCBhbGxvd3MgYm90aCBzaW5nbGUgYW5kIG11bHRpcGxlIGluaGVyaXRhbmNlLiBUaGUgU1dJRyB0eXBlLWNoZWNrZXIga25vd3MgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJhc2UgYW5kIGRlcml2ZWQgY2xhc3NlcyBhbmQgd2lsbCBhbGxvdyBwb2ludGVycyB0byBhbnkgb2JqZWN0IG9mIGEgZGVyaXZlZCBjbGFzcyB0byBiZSB1c2VkIGluIGZ1bmN0aW9ucyBvZiBhIGJhc2UgY2xhc3MuIFRoZSB0eXBlLWNoZWNrZXIgcHJvcGVybHkgY2FzdHMgcG9pbnRlciB2YWx1ZXMgYW5kIGlzIHNhZmUgdG8gdXNlIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UuPHA+Ci1TV0lHIGRvZXMgbm90IHN1cHBvcnQgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgaW5oZXJpdGFuY2UgKGl0IHdpbGwgYmUgcGFyc2VkLCBidXQgaWdub3JlZCkuPHA+Ci08cD4KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgU1dJRyBoYW5kbGVzIGluaGVyaXRhbmNlLiBGb3IgY2xhcml0eSwgdGhlIGZ1bGwgQysrIGNvZGUgaGFzIGJlZW4gb21pdHRlZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBzaGFwZXMuaQotJW1vZHVsZSBzaGFwZXMKLSV7Ci0jaW5jbHVkZSAic2hhcGVzLmgiCi0lfQotCi1jbGFzcyBTaGFwZSB7Ci1wdWJsaWM6Ci0JdmlydHVhbCBkb3VibGUgYXJlYSgpID0gMDsKLQl2aXJ0dWFsIGRvdWJsZSBwZXJpbWV0ZXIoKSA9IDA7Ci0Jdm9pZCAgICBzZXRfbG9jYXRpb24oZG91YmxlIHgsIGRvdWJsZSB5KTsKLX07Ci1jbGFzcyBDaXJjbGUgOiBwdWJsaWMgU2hhcGUgewotcHVibGljOgotCUNpcmNsZShkb3VibGUgcmFkaXVzKTsKLQl+Q2lyY2xlKCk7Ci0JZG91YmxlIGFyZWEoKTsKLQlkb3VibGUgcGVyaW1ldGVyKCk7Ci19OwotY2xhc3MgU3F1YXJlIDogcHVibGljIFNoYXBlIHsKLXB1YmxpYzoKLQlTcXVhcmUoZG91YmxlIHNpemUpOwotCX5TcXVhcmUoKTsKLQlkb3VibGUgYXJlYSgpOwotCWRvdWJsZSBwZXJpbWV0ZXIoKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB3cmFwcGVkIGludG8gUGVybDUsIHdlIGNhbiBub3cgcGVyZm9ybSB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmJlYXpsZXlAc2xhY2slIHBlcmw1LjAwMwotdXNlIHNoYXBlczsKLSRjaXJjbGUgPSBzaGFwZXM6Om5ld19DaXJjbGUoNyk7Ci0kc3F1YXJlID0gc2hhcGVzOjpuZXdfU3F1YXJlKDEwKTsKLXByaW50IHNoYXBlczo6Q2lyY2xlX2FyZWEoJGNpcmNsZSksIlxuIjsKLSMgTm90aWNlIHVzZSBvZiBiYXNlIGNsYXNzIGJlbG93Ci1wcmludCBzaGFwZXM6OlNoYXBlX2FyZWEoJGNpcmNsZSksIlxuIjsKLXByaW50IHNoYXBlczo6U2hhcGVfYXJlYSgkc3F1YXJlKSwiXG4iOwotc2hhcGVzOjpTaGFwZV9zZXRfbG9jYXRpb24oJHNxdWFyZSwyLC0zKTsKLXByaW50IHNoYXBlczo6U2hhcGVfcGVyaW1ldGVyKCRzcXVhcmUpLCJcbiI7Ci0mbHQ7Y3RybC1kJmd0OwotMTUzLjkzODA0MDA0NTk5OTk5NzU3Ci0xNTMuOTM4MDQwMDQ1OTk5OTk3NTcKLTEwMC4wMDAwMDAwMDAwMDAwMDAwMAotNDAuMDAwMDAwMDAwMDAwMDAwMDAKLSAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIG91ciBleGFtcGxlLCB3ZSBoYXZlIGNyZWF0ZWQgQ2lyY2xlIGFuZCBTcXVhcmUgb2JqZWN0cy4gV2UgY2FuIGNhbGwgbWVtYmVyIGZ1bmN0aW9ucyBvbiBlYWNoIG9iamVjdCBieSBtYWtpbmcgY2FsbHMgdG8gPHR0PkNpcmNsZV9hcmVhPC90dD4sIDx0dD5TcXVhcmVfYXJlYTwvdHQ+LCBhbmQgc28gb24uIEhvd2V2ZXIsIHdlIGNhbiBjYW4gYWNjb21wbGlzaCB0aGUgc2FtZSB0aGluZyBieSBzaW1wbHkgdXNpbmcgdGhlIDx0dD5TaGFwZV9hcmVhPC90dD4gZnVuY3Rpb24gb24gZWl0aGVyIG9iamVjdC48cD4KLTxhIG5hbWU9Im41MyI+PC9hPjxoMz4gVGVtcGxhdGVzPC9oMz4KLVNXSUcgZG9lcyBub3Qgc3VwcG9ydCB0ZW1wbGF0ZSBkZWZpbml0aW9ucy0tdGhhdCBpcywgaXQgZG9lcyBub3Qgc3VwcG9ydCBhbnl0aGluZyB0aGF0IHdvdWxkIGJlIGRlY2xhcmVkIGluIEMrKyB1c2luZyB0aGUgYDx0dD50ZW1wbGF0ZTwvdHQ+JyBrZXl3b3JkLiBJZiBhIHRlbXBsYXRlIGRlZmluaXRpb24gaXMgZm91bmQsIFNXSUcgd2lsbCBpc3N1ZSBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgYXR0ZW1wdCB0byBpZ25vcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRpcmUgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlLCBhIHRlbXBsYXRlIGNsYXNzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyB3b3VsZCBiZSBpZ25vcmVkIGJ5IFNXSUcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEZpbGUgOiBsaXN0LmgKLSNkZWZpbmUgTUFYSVRFTVMgMTAwCi10ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyBjbGFzcyBMaXN0IHsgCQkJCQkJLy8gRW50aXJlIGNsYXNzIGlzIGlnbm9yZWQgYnkgU1dJRwotcHJpdmF0ZToKLSAgICBUICpkYXRhOwotICAgIGludCBuaXRlbXM7Ci1wdWJsaWM6Ci0gICAgTGlzdCgpIHsKLSAgICAgIGRhdGEgPSBuZXcgVCBbTUFYSVRFTVNdOwotICAgICAgbml0ZW1zID0gMDsKLSAgICB9Ci0gICAgfkxpc3QoKSB7Ci0gICAgICBkZWxldGUgW10gZGF0YTsKLSAgICB9OwotICAgIHZvaWQgYXBwZW5kKFQgb2JqKSB7Ci0gICAgICBpZiAobml0ZW1zICZsdDsgTUFYSVRFTVMpIHsKLSAgICAgICAgZGF0YVtuaXRlbXMrK10gPSBvYmo7Ci0gICAgICB9Ci0gICAgfQotICAgIGludCBsZW5ndGgoKSB7Ci0gICAgICByZXR1cm4gbml0ZW1zOwotICAgIH0KLSAgICBUIGdldChpbnQgbikgewotICAgICAgcmV0dXJuIGRhdGFbbl07Ci0gICAgfQotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSG93ZXZlciwgU1dJRyBjYW4gc3VwcG9ydCBpbnN0YW50aWF0aW9ucyBvZiBhIHRlbXBsYXRlIGFuZCB0eXBlcyBpbnZvbHZpbmcgdGVtcGxhdGVzLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSB3b3VsZCBiZSBsZWdhbCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gU1dJRyBpbnRlcmZhY2UgaW52b2x2aW5nIGEgdGVtcGxhdGUKLSVtb2R1bGUgZXhhbXBsZQotJXsKLSNpbmNsdWRlICJsaXN0LmgiCQkJCS8vIEdldCBUZW1wbGF0ZSBkZWZpbml0aW9uIAotJX0KLQotLy8gTm93IGEgZnVuY3Rpb24gaW52b2x2aW5nIHRlbXBsYXRlcwotZXh0ZXJuIHZvaWQgUHJpbnREYXRhKExpc3QmbHQ7ZG91YmxlJmd0OyAmYW1wO2wpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgdHlwZSAiPHR0Pkxpc3QmbHQ7ZG91YmxlPC90dD4mZ3Q7IiBiZWNvbWVzIHRoZSBkYXRhdHlwZSBmb3IgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlci4gSW4sIFB5dGhvbiBpdCBtaWdodCBhcHBlYXIgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsgcHJpbnQgY2wKLV84MGEyZGY4X0xpc3QmbHQ7ZG91YmxlJmd0O19wCi0mZ3Q7Jmd0OyZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVG8gY3JlYXRlIHNwZWNpZmljIG9iamVjdHMsIHlvdSBtYXkgbmVlZCB0byBzdXBwbHkgaGVscGVyIGZ1bmN0aW9ucyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSVpbmxpbmUgJXsKLS8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBMaXN0Jmx0O2RvdWJsZSZndDsKLUxpc3QmbHQ7ZG91YmxlJmd0OyAqbmV3X0RvdWJsZUxpc3QoKSB7Ci0JcmV0dXJuIG5ldyBMaXN0Jmx0O2RvdWJsZSZndDs7Ci19Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TcGVjaWZpYyB0ZW1wbGF0ZXMgY2FuIGFsc28gYmUgd3JhcHBlZCBpbiBhIGNsZXZlciB3YXkgdXNpbmcgPHR0PnR5cGVkZWYuPC90dD4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd291bGQgYWxzbyB3b3JrIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSV7Ci0jaW5jbHVkZSAibGlzdC5oIgotdHlwZWRlZiBMaXN0Jmx0O2RvdWJsZSZndDsgRG91YmxlTGlzdDsKLSV9Ci0KLWNsYXNzIERvdWJsZUxpc3QgewotcHVibGljOgotCURvdWJsZUxpc3QoKTsKLQl+RG91YmxlTGlzdCgpOwotCXZvaWQgYXBwZW5kKGRvdWJsZSk7Ci0JaW50IGxlbmd0aCgpOwotCWRvdWJsZSBnZXQoaW50IG4pOwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBjYXNlLCBTV0lHIHRoaW5rcyB0aGF0IHRoZXJlIGlzIGEgY2xhc3MgIjx0dD5Eb3VibGVMaXN0PC90dD4iIHdpdGggdGhlIG1ldGhvZHMgc3VwcGxpZWQuIEl0IGdlbmVyYXRlcyB0aGUgYXBwcm9wcmlhdGUgY29kZSBhbmQgZXZlcnl0aGluZyB3b3JrcyBsaWtlIHlvdSB3b3VsZCBleHBlY3QgKG9mIGNvdXJzZSwgaW4gcmVhbGl0eSB0aGVyZSBpcyBubyBzdWNoIGNsYXNzKS4gV2hlbiB0aGUgU1dJRyBtb2R1bGUgaXMgY29tcGlsZWQsIGFsbCBvZiB0aGUgbWV0aG9kcyBnZXQgc3VwcGxpZWQgYnkgdGhlIG9yaWdpbmFsIHRlbXBsYXRlIGNsYXNzLiBBIGtleSB0aGluZyB0byBrZWVwIGluIG1pbmQgd2hlbiB3b3JraW5nIHdpdGggdGVtcGxhdGVzIGlzIHRoYXQgU1dJRyBjYW4gb25seSBoYW5kbGUgcGFydGljdWxhciBpbnN0YW50aWF0aW9ucyBvZiBhIHRlbXBsYXRlIChzdWNoIGFzIGEgbGlzdCBvZiBkb3VibGUpLiBNb3JlIGdlbmVyYWwgc3VwcG9ydCBpcyBub3QgeWV0IHByb3ZpZGVkIChidXQgbWF5IGJlIGFkZGVkIHNvbWVkYXkpLjxwPgotPGEgbmFtZT0ibjU0Ij48L2E+PGgzPiBSZW5hbWluZzwvaDM+Ci1DKysgbWVtYmVyIGZ1bmN0aW9ucyBhbmQgZGF0YSBjYW4gYmUgcmVuYW1lZCB3aXRoIHRoZSA8dHQ+JW5hbWU8L3R0PiBkaXJlY3RpdmUuIFRoZSA8dHQ+JW5hbWU8L3R0PiBkaXJlY3RpdmUgb25seSByZXBsYWNlcyB0aGUgbWVtYmVyIGZ1bmN0aW9uIG5hbWUuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBMaXN0IHsKLXB1YmxpYzoKLSAgTGlzdCgpOwotJW5hbWUoTGlzdFNpemUpIExpc3QoaW50IG1heHNpemUpOwotICB+TGlzdCgpOwotICBpbnQgIHNlYXJjaChjaGFyICp2YWx1ZSk7IAotJW5hbWUoZmluZCkgICAgdm9pZCBpbnNlcnQoY2hhciAqKTsgCi0lbmFtZShkZWxldGUpICB2b2lkIHJlbW92ZShjaGFyICopOyAKLSAgY2hhciAqZ2V0KGludCBuKTsKLSAgaW50ICBsZW5ndGg7Ci1zdGF0aWMgdm9pZCBwcmludChMaXN0ICpsKTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgd2lsbCBjcmVhdGUgdGhlIGZ1bmN0aW9ucyA8dHQ+TGlzdF9maW5kPC90dD4sIDx0dD5MaXN0X2RlbGV0ZTwvdHQ+LCBhbmQgYSBmdW5jdGlvbiBuYW1lZCA8dHQ+bmV3X0xpc3RTaXplPC90dD4gZm9yIHRoZSBvdmVybG9hZGVkIGNvbnN0cnVjdG9yLjxwPgotPHA+Ci1UaGUgPHR0PiVuYW1lIDwvdHQ+ZGlyZWN0aXZlIGNhbiBiZSBhcHBsaWVkIHRvIGFsbCBtZW1iZXJzIGluY2x1ZGluZyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBzdGF0aWMgZnVuY3Rpb25zLCBkYXRhIG1lbWJlcnMsIGFuZCBlbnVtZXJhdGlvbiB2YWx1ZXMuPHA+Ci08cD4KLVRoZSBjbGFzcyBuYW1lIHByZWZpeCBjYW4gYmUgY2hhbmdlZCBieSBzcGVjaWZ5aW5nIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVuYW1lKG5ld25hbWUpIGNsYXNzIExpc3QgewotLi4uCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNTUiPjwvYT48aDM+IEFkZGluZyBuZXcgbWV0aG9kczwvaDM+Ci1OZXcgbWV0aG9kcyBjYW4gYmUgYWRkZWQgdG8gYSBjbGFzcyB1c2luZyB0aGUgPHR0PiVhZGRtZXRob2RzPC90dD4gZGlyZWN0aXZlLiBUaGlzIGRpcmVjdGl2ZSBpcyBwcmltYXJpbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHNoYWRvdyBjbGFzc2VzIHRvIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gYW4gZXhpc3RpbmcgY2xhc3MuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIHZlY3RvcgotJXsKLSNpbmNsdWRlICJ2ZWN0b3IuaCIKLSV9Ci0KLWNsYXNzIFZlY3RvciB7Ci1wdWJsaWM6Ci0JZG91YmxlIHgseSx6OwotCVZlY3RvcigpOwotCX5WZWN0b3IoKTsKLQkuLi4gYnVuY2ggb2YgQysrIG1ldGhvZHMgLi4uCi0JJWFkZG1ldGhvZHMgewotCQljaGFyICpfX3N0cl9fKCkgewotCQkJc3RhdGljIGNoYXIgdGVtcFsyNTZdOwotCQkJc3ByaW50Zih0ZW1wLCJbICVnLCAlZywgJWcgXSIsIHYtJmd0O3gsdi0mZ3Q7eSx2LSZndDt6KTsKLQkJCXJldHVybiAmYW1wO3RlbXBbMF07Ci0JCX0KLQl9Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGlzIGNvZGUgYWRkcyBhPHR0PiBfX3N0cl9fPC90dD4gbWV0aG9kIHRvIG91ciBjbGFzcyBmb3IgcHJvZHVjaW5nIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuIEluIFB5dGhvbiwgc3VjaCBhIG1ldGhvZCB3b3VsZCBhbGxvdyB1cyB0byBwcmludCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHVzaW5nIHRoZSA8dHQ+cHJpbnQ8L3R0PiBjb21tYW5kLiA8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4mZ3Q7Jmd0OyZndDsKLSZndDsmZ3Q7Jmd0OyB2ID0gVmVjdG9yKCk7Ci0mZ3Q7Jmd0OyZndDsgdi54ID0gMwotJmd0OyZndDsmZ3Q7IHYueSA9IDQKLSZndDsmZ3Q7Jmd0OyB2LnogPSAwCi0mZ3Q7Jmd0OyZndDsgcHJpbnQodikKLVsgMy4wLCA0LjAsIDAuMCBdCi0mZ3Q7Jmd0OyZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlPHR0PiAlYWRkbWV0aG9kczwvdHQ+IGRpcmVjdGl2ZSBmb2xsb3dzIGFsbCBvZiB0aGUgc2FtZSBjb252ZW50aW9ucyBhcyBpdHMgdXNlIHdpdGggQyBzdHJ1Y3R1cmVzLjxwPgotPGEgbmFtZT0ibjU2Ij48L2E+PGgzPiBQYXJ0aWFsIGNsYXNzIGRlZmluaXRpb25zPC9oMz4KLVNpbmNlIFNXSUcgaXMgc3RpbGwgc29tZXdoYXQgbGltaXRlZCBpbiBpdHMgc3VwcG9ydCBvZiBDKyssIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gb25seSB1c2UgcGFydGlhbCBjbGFzcyBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcmZhY2UgZmlsZS4gVGhpcyBzaG91bGQgbm90IHByZXNlbnQgYSBwcm9ibGVtIGFzIFNXSUcgZG9lcyBub3QgbmVlZCB0aGUgZXhhY3QgQysrIHNwZWNpZmljYXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCB5b3Ugc2hvdWxkIHN0cmlwIGFsbCBjbGFzc2VzIG9mIG9wZXJhdG9yIG92ZXJsb2FkaW5nLCBmcmllbmRzLCBhbmQgb3RoZXIgZGVjbGFyYXRpb25zIGJlZm9yZSBnaXZpbmcgdGhlbSB0byBTV0lHIChhbHRob3VnaCBTV0lHIHdpbGwgZ2VuZXJhdGUgb25seSB3YXJuaW5ncyBmb3IgbW9zdCBvZiB0aGVzZSB0aGluZ3MpLjxwPgotPHA+Ci1BcyBhIHJ1bGUgb2YgdGh1bWIsIHJ1bm5pbmcgU1dJRyBvbiByYXcgQysrIGhlYWRlciBvciBzb3VyY2UgZmlsZXMgaXMgY3VycmVudGx5IGRpc2NvdXJhZ2VkLiBHaXZlbiB0aGUgY29tcGxleGl0eSBvZiBDKysgcGFyc2luZyBhbmQgbGltaXRhdGlvbnMgaW4gU1dJRydzIHBhcnNlciBpdCB3aWxsIHN0aWxsIHRha2Ugc29tZSB0aW1lIGZvciBTV0lHJ3MgcGFyc2VyIHRvIGV2b2x2ZSB0byBhIHBvaW50IG9mIGJlaW5nIGFibGUgdG8gc2FmZWx5IGhhbmRsZSBtb3N0IHJhdyBDKysgZmlsZXMuPHA+Ci08YSBuYW1lPSJuNTciPjwvYT48aDM+IFNXSUcsIEMrKywgYW5kIHRoZSBMZWdpc2xhdGlvbiBvZiBNb3JhbGl0eTwvaDM+Ci1BcyBsYW5ndWFnZXMgZ28sIEMrKyBpcyBxdWl0ZSBwb3NzaWJseSBvbmUgb2YgdGhlIG1vc3QgaW1tZW5zZSBhbmQgY29tcGxpY2F0ZWQgbGFuZ3VhZ2VzIGV2ZXIgZGV2aXNlZC4gSXQgaXMgY2VydGFpbmx5IGEgZmFyIGNyeSBmcm9tIHRoZSBzb21ld2hhdCBtaW5pbWFsaXN0aWMgbmF0dXJlIG9mIEMuIE1hbnkgcGFydHMgb2YgQysrIGFyZSBkZXNpZ25lZCB0byBidWlsZCBsYXJnZSBwcm9ncmFtcyB0aGF0IGFyZSAic2FmZSIgYW5kICJyZWxpYWJsZS4iIEhvd2V2ZXIsIGFzIGEgcmVzdWx0LCBpdCBpcyBwb3NzaWJsZSBmb3IgZGV2ZWxvcGVycyB0byBvdmVybG9hZCBvcGVyYXRvcnMsIGltcGxlbWVudCBzbWFydCBwb2ludGVycywgYW5kIGRvIGFsbCBzb3J0cyBvZiBvdGhlciBpbnNhbmUgdGhpbmdzIChsaWtlIGV4cHJlc3Npb24gdGVtcGxhdGVzKS4gQXMgZmFyIGFzIFNXSUcgaXMgY29uY2VybmVkLCB0aGUgcHJpbWFyeSBnb2FsIGlzIGF0dGFjaGluZyB0byBzdWNoIHN5c3RlbXMgYW5kIHByb3ZpZGluZyBhIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIFRoZXJlIGFyZSBtYW55IGZlYXR1cmVzIG9mIEMrKyB0aGF0IEkgd291bGQgbm90IGhhdmUgdGhlIHNsaWdodGVzdCBpZGVhIGhvdyB0byBzdXBwb3J0IGluIFNXSUcgKG1vc3Qga2luZHMgb2YgdGVtcGxhdGVzIGZvciBleGFtcGxlKS4gVGhlcmUgYXJlIG90aGVyIEMrKyBpZGlvbXMgdGhhdCBtYXkgYmUgdW5zYWZlIHRvIHVzZSB3aXRoIFNXSUcuIEZvciBleGFtcGxlLCBpZiBvbmUgaW1wbGVtZW50cyAic21hcnQiIHBvaW50ZXJzLCBob3cgd291bGQgdGhleSBhY3R1YWxseSBpbnRlcmFjdCB3aXRoIHRoZSBwb2ludGVyIG1lY2hhbmlzbSB1c2VkIGJ5IFNXSUc/IDxwPgotPHA+Ci1OZWVkbGVzcyB0byBzYXksIGhhbmRsaW5nIGFsbCBvZiB0aGUgcG9zc2libGUgY2FzZXMgaXMgcHJvYmFibHkgaW1wb3NzaWJsZS4gU1dJRyBpcyBjZXJ0YWlubHkgbm90IGd1YXJhbnRlZWQgdG8gd29yayB3aXRoIGV2ZXJ5IGNvbmNlaXZhYmxlIHR5cGUgb2YgQysrIHByb2dyYW0gKGVzcGVjaWFsbHkgdGhvc2UgdGhhdCB1c2UgQysrIGluIGEgbWF4aW1hbCBtYW5uZXIpLiBOb3IgaXMgU1dJRyBjbGFpbWluZyB0byBidWlsZCBDKysgaW50ZXJmYWNlcyBpbiBhIGNvbXBsZXRlbHkgInNhZmUiIG1hbm5lci4gVGhlIGJvdHRvbSBsaW5lIGlzIHRoYXQgZWZmZWN0aXZlIHVzZSBvZiBDKysgd2l0aCBTV0lHIHJlcXVpcmVzIHRoYXQgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcgYW5kIHRoYXQgeW91IGhhdmUgYSBjZXJ0YWluIGxldmVsIG9mICJtb3JhbCBmbGV4aWJpbGl0eSIgd2hlbiBpdCBjb21lcyB0byB0aGUgaXNzdWUgb2YgYnVpbGRpbmcgYSB1c2VmdWwgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZS48cD4KLTxhIG5hbWU9Im41OCI+PC9hPjxoMz4gVGhlIGZ1dHVyZSBvZiBDKysgYW5kIFNXSUc8L2gzPgotU1dJRydzIHN1cHBvcnQgb2YgQysrIGlzIGJlc3QgZGVzY3JpYmVkIGFzIGFuIG9uZ29pbmcgcHJvamVjdC4gSXQgd2lsbCBwcm9iYWJseSByZW1haW4gZXZvbHV0aW9uYXJ5IGluIG5hdHVyZSBmb3IgdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4gSW4gdGhlIHNob3J0IHRlcm0sIHdvcmsgaXMgYWxyZWFkeSB1bmRlcndheSBmb3Igc3VwcG9ydGluZyBuZXN0ZWQgY2xhc3NlcyBhbmQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcuIEFzIGFsd2F5cywgdGhlc2UgZGV2ZWxvcG1lbnRzIHdpbGwgdGFrZSB0aW1lLiBGZWVkYmFjayBhbmQgY29udHJpYnV0aW9ucyBhcmUgYWx3YXlzIHdlbGNvbWUuPHA+Ci08YSBuYW1lPSJuNyI+PC9hPjxoMj4gT2JqZWN0aXZlLUM8L2gyPgotT25lIG9mIFNXSUcncyBtb3N0IHJlY2VudCBhZGRpdGlvbnMgaXMgc3VwcG9ydCBmb3IgT2JqZWN0aXZlLUMgcGFyc2luZy4gVGhpcyBpcyBjdXJyZW50bHkgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtYXkgYmUgaW1wcm92ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLiA8cD4KLTxwPgotT2JqZWN0aXZlLUMgc3VwcG9ydCBpcyBidWlsdCB1c2luZyB0aGUgc2FtZSBhcHByb2FjaCBhcyB1c2VkIGZvciBDKysgcGFyc2luZy4gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIGRlZmluaXRpb25zIGFyZSBjb252ZXJ0ZWQgaW50byBhIGNvbGxlY3Rpb24gb2YgQU5TSSBDIGFjY2Vzc29yIGZ1bmN0aW9ucy4gVGhlc2UgYWNjZXNzb3IgZnVuY3Rpb25zIGFyZSB0aGVuIHdyYXBwZWQgYnkgU1dJRyBhbmQgdHVybmVkIGludG8gYW4gaW50ZXJmYWNlLjxwPgotPHA+Ci1UbyBlbmFibGUgT2JqZWN0aXZlLUMgcGFyc2luZywgU1dJRyBzaG91bGQgYmUgZ2l2ZW4gdGhlIDx0dD4tb2JqYzwvdHQ+IG9wdGlvbiAodGhpcyBvcHRpb24gbWF5IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgPHR0Pi1jKys8L3R0PiBvcHRpb24gaWYgdXNpbmcgT2JqZWN0aXZlLUMrKykuIEl0IG1heSBhbHNvIGJlIGhlbHBmdWwgdG8gdXNlIHRoZSAtbyBvcHRpb24gdG8gZ2l2ZSB0aGUgb3V0cHV0IGZpbGUgdGhlIC5tIHN1ZmZpeCBuZWVkZWQgYnkgbWFueSBPYmplY3RpdmUtQyBjb21waWxlcnMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLW9iamMgLW8gZXhhbXBsZV93cmFwLm0gZXhhbXBsZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU9iamVjdGl2ZS1DIGludGVyZmFjZXMgc2hvdWxkIGFsc28gaW5jbHVkZSB0aGUgZmlsZSBgPHR0Pm9iamMuaTwvdHQ+JyBhcyB0aGlzIGNvbnRhaW5zIGltcG9ydGFudCBkZWZpbml0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8gbW9zdCBPYmplY3RpdmUtQyBwcm9ncmFtcy4gPHA+Ci08YSBuYW1lPSJuNTkiPjwvYT48aDM+IE9iamVjdGl2ZS1DIEV4YW1wbGU8L2gzPgotVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGEgU1dJRyBpbnRlcmZhY2UgZmlsZSBmb3IgYSBzaW1wbGUgT2JqZWN0aXZlLUMgY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbGlzdAotJXsKLSNpbXBvcnQgImxpc3QuaCIKLSV9Ci0laW5jbHVkZSBvYmpjLmkKLS8vIFZlcnkgc2ltcGxlIGxpc3QgY2xhc3MKLUBpbnRlcmZhY2UgTGlzdCA6IE9iamVjdCB7Ci0gICAgIGludCAgIG5pdGVtczsgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QKLSAgICAgaW50ICAgbWF4aXRlbXM7ICAgICAgICAgICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zCi0gICAgIGlkICAgKml0ZW1zOyAgICAgICAgICAgICAgICAgICAvLyBBcnJheSBob2xkaW5nIHRoZSBpdGVtcwotfQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBMaXN0IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gQ3JlYXRlIGEgbmV3IGxpc3QKLSsgbmV3OwotCi0vLyBEZXN0cm95IHRoZSBsaXN0Ci0tIGZyZWU7Ci0KLS8vIENvcHkgYSBsaXN0Ci0tIGNvcHk7Ci0KLS8vIEFwcGVuZCBhIG5ldyBpdGVtIHRvIHRoZSBsaXN0Ci0tICh2b2lkKSBhcHBlbmQ6IChpZCkgaXRlbTsKLQotLy8gSW5zZXJ0IGFuIGl0ZW0gaW4gdGhlIGxpc3QKLS0gKHZvaWQpIGluc2VydDogKGlkKSBpdGVtIDogKGludCkgcG9zOwotCi0vLyBEZWxldGUgYW4gaXRlbSBmcm9tIHRoZSBsaXN0Ci0tICByZW1vdmU6IChpbnQpIHBvczsKLQotLy8gR2V0IGFuIGl0ZW0gZnJvbSB0aGUgbGlzdAotLSBnZXQ6IChpbnQpIGk7Ci0KLS8vIEZpbmQgYW4gaXRlbSBpbiB0aGUgbGlzdCBhbmQgcmV0dXJuIGl0cyBpbmRleAotLSAoaW50KSBpbmRleDogb2JqOwotCi0vLyBHZXQgbGVuZ3RoIG9mIHRoZSBsaXN0Ci0tIChpbnQpIGxlbjsKLQotLy8gUHJpbnQgb3V0IGEgbGlzdCAoQ2xhc3MgbWV0aG9kKQotKyAodm9pZCkgcHJpbnQ6IChMaXN0ICopIGw7Ci0KLUBlbmQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjYwIj48L2E+PGgzPiBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzPC9oMz4KLUJ5IGRlZmF1bHQsIFNXSUcgYXNzdW1lcyB0aGF0IHRoZSBtZXRob2RzICJuZXciIGFuZCAiZnJlZSIgY29ycmVzcG9uZCB0byBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiBUaGVzZSBmdW5jdGlvbnMgYXJlIHRyYW5zbGF0ZWQgaW50byB0aGUgZm9sbG93aW5nIGFjY2Vzc29yIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+TGlzdCAqbmV3X0xpc3Qodm9pZCkgewotCXJldHVybiAoTGlzdCAqKSBbTGlzdCBuZXddOwotfQotdm9pZCBkZWxldGVfTGlzdChMaXN0ICpsKSB7Ci0JW2wgZnJlZV07Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUlmIHRoZSBvcmlnaW5hbCBPYmplY3RpdmUtQyBjbGFzcyBkb2VzIG5vdCBoYXZlIGFueSBjb25zdHJ1Y3RvcnMgb3IgZGVzdHJ1Y3RvcnMsIHB1dHRpbmcgdGhlbSBpbiB0aGUgaW50ZXJmYWNlIGZpbGUgd2lsbCBjYXVzZSBTV0lHIHRvIGdlbmVyYXRlIHdyYXBwZXJzIGZvciBhIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgKGFzc3VtZWQgdG8gYmUgZGVmaW5lZCBpbiB0aGUgb2JqZWN0J3MgYmFzZS1jbGFzcykuPHA+Ci08cD4KLUlmIHlvdXIgT2JqZWN0aXZlLUMgcHJvZ3JhbSB1c2VzIGEgZGlmZmVyZW50IG5hbWluZyBzY2hlbWUgZm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsIHlvdSBjYW4gdGVsbCBTV0lHIGFib3V0IGl0IHVzaW5nIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lcHJhZ21hIG9iamNfbmV3ID0gImNyZWF0ZSIgCQkJCQkvLyBDaGFuZ2UgY29uc3RydWN0b3IgdG8gYGNyZWF0ZScKLSVwcmFnbWEgb2JqY19kZWxldGUgPSAiZGVzdHJveSIgCQkJCQkvLyBDaGFuZ2UgZGVzdHJ1Y3RvciB0byBgZGVzdHJveScKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42MSI+PC9hPjxoMz4gSW5zdGFuY2UgbWV0aG9kczwvaDM+Ci1JbnN0YW5jZSBtZXRob2RzIGFyZSBjb252ZXJ0ZWQgaW50byBhY2Nlc3NvciBmdW5jdGlvbnMgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIExpc3RfYXBwZW5kKExpc3QgKmwsIGlkIGl0ZW0pIHsKLQlbbCBhcHBlbmQgOiBpdGVtXTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42MiI+PC9hPjxoMz4gQ2xhc3MgbWV0aG9kczwvaDM+Ci1DbGFzcyBtZXRob2RzIGFyZSB0cmFuc2xhdGVkIGludG8gdGhlIGZvbGxvd2luZyBhY2Nlc3MgZnVuY3Rpb24gOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXZvaWQgTGlzdF9wcmludChMaXN0ICpsKSB7Ci0JW0xpc3QgcHJpbnQgOiBsXTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42MyI+PC9hPjxoMz4gTWVtYmVyIGRhdGE8L2gzPgotTWVtYmVyIGRhdGEgaXMgaGFuZGxlZCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgZm9yIEMrKyB3aXRoIGFjY2Vzc29yIGZ1bmN0aW9ucyBiZWluZyBwcm9kdWNlZCBmb3IgZ2V0dGluZyBhbmQgc2V0dGluZyB0aGUgdmFsdWUuIEJ5IGRlZmF1bHQsIGFsbCBkYXRhIG1lbWJlcnMgb2YgYW4gT2JqZWN0aXZlLUMgb2JqZWN0IGFyZSBwcml2YXRlIHVubGVzcyBleHBsaWNpdGx5IGRlY2xhcmVkIDx0dD5AcHVibGljPC90dD4uIDxwPgotPGEgbmFtZT0ibjY0Ij48L2E+PGgzPiBQcm90ZWN0aW9uPC9oMz4KLVNXSUcgY2FuIG9ubHkgd3JhcCBkYXRhIG1lbWJlcnMgdGhhdCBhcmUgZGVjbGFyZWQgQHB1YmxpYy4gT3RoZXIgcHJvdGVjdGlvbiBsZXZlbHMgYXJlIGlnbm9yZWQuPHA+Ci08YSBuYW1lPSJuNjUiPjwvYT48aDM+IFRoZSB1c2Ugb2YgaWQ8L2gzPgotVGhlIGRhdGF0eXBlIGA8dHQ+aWQ8L3R0PicgYXNzdW1lcyB0aGUgc2FtZSByb2xlIGluIFNXSUcgYXMgaXQgZG9lcyB3aXRoIE9iamVjdGl2ZS1DLiBBIGZ1bmN0aW9uIG9wZXJhdGluZyBvbiBhbiBgaWQnIHdpbGwgYWNjZXB0IGFueSBPYmplY3QgdHlwZSAod29ya3Mga2luZCBvZiBsaWtlIDx0dD52b2lkICo8L3R0PikuIEFsbCBtZXRob2RzIHdpdGggbm8gZXhwbGljaXQgcmV0dXJuIHZhbHVlIGFyZSBhbHNvIGFzc3VtZWQgdG8gcmV0dXJuIGFuIGBpZCcuIDxwPgotPGEgbmFtZT0ibjY2Ij48L2E+PGgzPiBJbmhlcml0YW5jZTwvaDM+Ci1Fc3NlbnRpYWxseSBhbGwgT2JqZWN0aXZlLUMgY2xhc3NlcyB3aWxsIGluaGVyaXQgZnJvbSBhIGJhc2VjbGFzcyA8dHQ+T2JqZWN0PC90dD4uIElmIHVuZGVmaW5lZCwgU1dJRyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZywgYnV0IG90aGVyIGZ1bmN0aW9uIHByb3Blcmx5LiBBIG1pc3NpbmcgYmFzZWNsYXNzIGhhcyBubyBlZmZlY3Qgb24gdGhlIHdyYXBwZXIgY29kZSBvciB0aGUgb3BlcmF0aW9uIG9mIHRoZSByZXN1bHRpbmcgbW9kdWxlLiBSZWFsbHksIHRoZSBvbmx5IHNpZGUgZWZmZWN0IG9mIGEgbWlzc2luZyBiYXNlIGNsYXNzIGlzIHRoYXQgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gZXhlY3V0ZSBiYXNlLWNsYXNzIG1ldGhvZHMgZnJvbSB0aGUgc2NyaXB0aW5nIGludGVyZmFjZS4gT2JqZWN0aXZlLUMgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZS48cD4KLTxhIG5hbWU9Im42NyI+PC9hPjxoMz4gUmVmZXJyaW5nIHRvIG90aGVyIGNsYXNzZXM8L2gzPgotVGhlPHR0PiBAY2xhc3M8L3R0PiBkZWNsYXJhdGlvbiBjYW4gYmUgdXNlZCB0byByZWZlciB0byBvdGhlciBjbGFzc2VzLiBTV0lHIHVzZXMgdGhpcyBpbiBjZXJ0YWluIGluc3RhbmNlcyB0byBtYWtlIHN1cmUgd3JhcHBlciBjb2RlIGlzIGdlbmVyYXRlZCBjb3JyZWN0bHkuPHA+Ci08YSBuYW1lPSJuNjgiPjwvYT48aDM+IENhdGVnb3JpZXM8L2gzPgotQ2F0ZWdvcmllcyBwcm92aWRlIGEgbWVjaGFuaXNtIGZvciBhZGRpbmcgbmV3IG1ldGhvZHMgdG8gZXhpc3RpbmcgT2JqZWN0aXZlLUMgY2xhc3Nlcy4gU1dJRyBjb3JyZWN0bHkgcGFyc2VzIGNhdGVnb3JpZXMgYW5kIGF0dGFjaGVzIHRoZSBtZXRob2RzIHRvIHRoZSB3cmFwcGVycyBjcmVhdGVkIGZvciB0aGUgb3JpZ2luYWwgY2xhc3MuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSV7Ci0jaW1wb3J0ICJmb28uaCIKLSV9Ci0KLS8vIFNhbXBsZSB1c2Ugb2YgYSBjYXRlZ29yeSBpbiBhbiBpbnRlcmZhY2UKLUBpbnRlcmZhY2UgRm9vIChDYXRlZ29yeU5hbWUpCi0vLyBNZXRob2QgZGVjbGFyYXRpb25zCi0tYmFyIDogKGlkKSBpOwotQGVuZAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNjkiPjwvYT48aDM+IEltcGxlbWVudGF0aW9ucyBhbmQgUHJvdG9jb2xzPC9oMz4KLVNXSUcgY3VycmVudGx5IGlnbm9yZXMgYWxsIGRlY2xhcmF0aW9ucyBmb3VuZCBpbnNpZGUgYW4gPHR0PkBpbXBsZW1lbnRhdGlvbjwvdHQ+IG9yIDx0dD5AcHJvdG9jb2w8L3R0PiBzZWN0aW9uLiBTdXBwb3J0IGZvciB0aGlzIG1heSBiZSBhZGRlZCBpbiBmdXR1cmUgcmVsZWFzZXMuPHA+Ci08cD4KLUFsdGhvdWdoIFNXSUcgaWdub3JlcyBwcm90b2NvbHMsIHByb3RvY29sIHR5cGUtc3BlY2lmaWVycyBtYXkgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHRoZXNlIGFyZSBsZWdhbCBkZWNsYXJhdGlvbnMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotCi0laW50ZXJmYWNlIEZvbyA6IE9iamVjdCAmbHQ7cHJvdG8xLCBwcm90bzImZ3Q7IHsKLQotfQotLy8gTWV0aG9kcwotLSBCYXIgOiAoaWQgJmx0O3Byb3RvMSxwcm90bzImZ3Q7KSBpOwotQGVuZAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TV0lHIHdpbGwgY2FycnkgdGhlIHByb3RvY29sIGxpc3RzIHRocm91Z2ggdGhlIGNvZGUgZ2VuZXJhdGlvbiBwcm9jZXNzIHNvIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlIGNvbXBpbGVzIHdpdGhvdXQgd2FybmluZ3MuPHA+Ci08YSBuYW1lPSJuNzAiPjwvYT48aDM+IFJlbmFtaW5nPC9oMz4KLU9iamVjdGl2ZS1DIG1lbWJlcnMgY2FuIGJlIHJlbmFtZWQgdXNpbmcgdGhlIDx0dD4lbmFtZSgpPC90dD4gZGlyZWN0aXZlIGFzIGluIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5AaW50ZXJmYWNlIExpc3QgOiBPYmplY3QgewotQHB1YmxpYwotJW5hbWUoc2l6ZSkgaW50IGxlbmd0aDsgCQkJCQkJLy8gUmVuYW1lIGxlbmd0aCB0byBzaXplCi19Ci0KLSsgbmV3OwotLSBmcmVlOwotJW5hbWUoYWRkKSAtKHZvaWQpIGFwcGVuZDogKGlkKSBpdGVtOwkJCQkJCS8vIFJlbmFtZSBhcHBlbmQgdG8gYWRkCi1AZW5kCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im43MSI+PC9hPjxoMz4gQWRkaW5nIG5ldyBtZXRob2RzPC9oMz4KLU5ldyBtZXRob2RzIGNhbiBiZSBhZGRlZCB0byBhIGNsYXNzIHVzaW5nIHRoZSA8dHQ+JWFkZG1ldGhvZHM8L3R0PiBkaXJlY3RpdmUuIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgd2l0aCBzaGFkb3cgY2xhc3NlcyB0byBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIGEgY2xhc3MuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5AaW50ZXJmYWNlIExpc3QgOiBPYmplY3QgewotfQotLi4uIGJ1bmNoIG9mIE9iamVjdGl2ZS1DIG1ldGhvZHMgLi4uCi0lYWRkbWV0aG9kcyB7Ci0JLSAodm9pZCkgb3V0cHV0IHsKLQkJLi4uIGNvZGUgdG8gb3V0cHV0IGEgbGlzdCAuLi4KLQl9Ci19Ci1AZW5kCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLTx0dD4lYWRkbWV0aG9kcyA8L3R0PndvcmtzIGluIGV4YWN0bHkgdGhlIHNhbWUgbWFubmVyIGFzIGl0IGRvZXMgZm9yIEMgYW5kIEMrKyAoZXhjZXB0IHRoYXQgT2JqZWN0aXZlLUMgc3ludGF4IGlzIGFsbG93ZWQpLiBDb25zdWx0IHRob3NlIHNlY3Rpb25zIGZvciBtb3JlIGRldGFpbHMuPHA+Ci08YSBuYW1lPSJuNzIiPjwvYT48aDM+IE90aGVyIGlzc3VlczwvaDM+Ci1PYmplY3RpdmUtQyBpcyBkeW5hbWljYWxseSB0eXBlZCB3aGlsZSBTV0lHIHRlbmRzIHRvIGVuZm9yY2UgYSB0eXBlLWNoZWNraW5nIG1vZGVsIG9uIGFsbCBvZiBpdHMgcG9pbnRlciB2YWx1ZXMuIFRoaXMgbWlzbWF0Y2ggY291bGQgY3JlYXRlIG9wZXJhdGlvbmFsIHByb2JsZW1zIHdpdGggT2JqZWN0aXZlLUMgY29kZSBpbiB0aGUgZm9ybSBvZiBTV0lHIHR5cGUgZXJyb3JzLiBPbmUgc29sdXRpb24gdG8gdGhpcyAoYWx0aG91Z2ggcGVyaGFwcyBub3QgYSBnb29kIG9uZSkgaXMgdG8gdXNlIHRoZSBTV0lHIHBvaW50ZXIgbGlicmFyeSBpbiBjb25qdW5jdGlvbiB3aXRoIE9iamVjdGl2ZS1DLiBUaGUgcG9pbnRlciBsaWJyYXJ5IHByb3ZpZGVzIHNpbXBsZSBmdW5jdGlvbnMgZm9yIGNhc3RpbmcgcG9pbnRlciB0eXBlcyBhbmQgbWFuaXB1bGF0aW5nIHZhbHVlcy4gPHA+Ci08cD4KLUNlcnRhaW4gYXNwZWN0cyBvZiBPYmplY3RpdmUtQyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKHByb3RvY29scyBmb3IgaW5zdGFuY2UpLiBUaGVzZSBsaW1pdGF0aW9ucyBtYXkgYmUgbGlmdGVkIGluIGZ1dHVyZSByZWxlYXNlcy48cD4KLTxhIG5hbWU9Im44Ij48L2E+PGgyPiBDb25kaXRpb25hbCBjb21waWxhdGlvbjwvaDI+Ci1TV0lHIGRvZXMgbm90IHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IsIGJ1dCBpdCBkb2VzIHN1cHBvcnQgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gb2YgaW50ZXJmYWNlIGZpbGVzIGluIGEgbWFubmVyIHNpbWlsYXIgdG8gdGhlIEMgcHJlcHJvY2Vzc29yLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHBsYWNlZCA8dHQ+I2lmZGVmPC90dD4sIDx0dD4jaWZuZGVmPC90dD4sIDx0dD4jaWY8L3R0PiwgPHR0PiNlbHNlPC90dD4sIDx0dD4jZWxpZjwvdHQ+LCBhbmQgPHR0PiNlbmRpZjwvdHQ+IGRpcmVjdGl2ZXMgaW4geW91ciBpbnRlcmZhY2UgZmlsZS4gVGhlc2UgZGlyZWN0aXZlcyBjYW4gYmUgc2FmZWx5IG5lc3RlZC4gVGhpcyBhbGxvd3Mgb25lIHRvIGNvbmRpdGlvbmFsbHkgY29tcGlsZSBvdXQgdHJvdWJsZXNvbWUgQy9DKysgY29kZSBpZiBuZWNlc3NhcnkuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGZpbGUgY2FuIHNlcnZlIGFzIGJvdGggYSBDIGhlYWRlciBmaWxlIGFuZCBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiNpZmRlZiBTV0lHCi0lbW9kdWxlIG15bW9kdWxlCi0lewotI2luY2x1ZGUgImhlYWRlci5oIgotJX0KLQotJWluY2x1ZGUgd2lzaC5pCi0jZW5kaWYKLQotLi4uIG5vcm1hbCBDIGRlY2xhcmF0aW9ucyBoZXJlIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNpbWlsYXJseSwgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIGFuIGludGVyZmFjZS4gVGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSBjYW4gYmUgdXNlZCB0byBidWlsZCBhIFBlcmw1IG1vZHVsZSB0aGF0IHdvcmtzIHdpdGggZWl0aGVyIHN0YXRpYyBvciBkeW5hbWljIGxpbmtpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBteW1vZHVsZQotJXsKLSNpbmNsdWRlICJoZWFkZXIuaCIKLSV9Ci0KLS4uLiBEZWNsYXJhdGlvbnMgLi4uCi0KLSNpZmRlZiBTVEFUSUMKLSVpbmNsdWRlIHBlcmxtYWluLmkgCQkJCS8vIEluY2x1ZGUgY29kZSBmb3Igc3RhdGljIGxpbmtpbmcKLSNlbmRpZgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ib3dldmVyLCBpdCBpcyBub3Qgc2FmZSB0byB1c2UgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gaW4gdGhlIG1pZGRsZSBvZiBhIGRlY2xhcmF0aW9uLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+ZG91YmxlIGZvbygKLSNpZmRlZiBBTlNJX0FSR1MKLWRvdWJsZSBhLCBkb3VibGUgYgotI2VuZGlmCi0pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGZhaWxzIGJlY2F1c2UgdGhlIFNXSUcgcGFyc2VyIGlzIG5vdCBlcXVpcHBlZCB0byBoYW5kbGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gZGlyZWN0aXZlcyBpbiBhbiBhcmJpdHJhcnkgbG9jYXRpb24gKGxpa2UgdGhlIEMgcHJlcHJvY2Vzc29yKS4gRm9yIGZpbGVzIHRoYXQgbWFrZSBoZWF2eSB1c2Ugb2YgdGhlIEMgcHJlcHJvY2Vzc29yIGxpa2UgdGhpcywgaXQgbWF5IGJlIGJldHRlciB0byBydW4gdGhlIGhlYWRlciBmaWxlIHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIGFuZCB1c2UgdGhlIG91dHB1dCBhcyB0aGUgaW5wdXQgdG8gU1dJRy48cD4KLTxhIG5hbWU9Im43MyI+PC9hPjxoMz4gRGVmaW5pbmcgc3ltYm9sczwvaDM+Ci1UbyBkZWZpbmUgc3ltYm9scywgeW91IGNhbiB1c2UgdGhlIDx0dD4tRDwvdHQ+IG9wdGlvbiBhcyBpbiA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotc3dpZyAtcGVybDUgLXN0YXRpYyAtRFNUQVRJQyBpbnRlcmZhY2UuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TeW1ib2xzIGNhbiBhbHNvIGJlIGRlZmluZWQgdXNpbmcgPHR0PiNkZWZpbmU8L3R0PiB3aXRoIG5vIGFyZ3VtZW50cy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbXltb2R1bGUKLSNkZWZpbmUgU1RBVElDIAotCi0uLi4gZXRjIC4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Gb3IgdGhlIHB1cnBvc2VzIG9mIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLCBvbmUgc2hvdWxkIG5vdCBhc3NpZ24gdmFsdWVzIHRvIHN5bWJvbHMuIElmIHRoaXMgaXMgZG9uZSwgU1dJRyBpbnRlcnByZXRzIHRoZSAjZGVmaW5lIGFzIHByb3ZpZGluZyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNjcmlwdGluZyBsYW5ndWFnZSBjb25zdGFudC4gPHA+Ci08YSBuYW1lPSJuNzQiPjwvYT48aDM+IFRoZSAjaWYgZGlyZWN0aXZlPC9oMz4KLVRoZSA8dHQ+I2lmPC90dD4gZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBjb250ZXh0IDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0jaWYgZGVmaW5lZChTWU1CT0wpCi0uLi4KLSNlbGlmICFkZWZpbmVkKE9USEVSU1lNQk9MKQotLi4uCi0jZW5kaWYKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIEMgcHJlcHJvY2Vzc29yIHZlcnNpb24gc3VwcG9ydHMgYW55IGNvbnN0YW50IGludGVncmFsIGV4cHJlc3Npb24gYXMgYW4gYXJndW1lbnQgdG8gPHR0PiNpZjwvdHQ+LCBidXQgU1dJRyBkb2VzIG5vdCB5ZXQgY29udGFpbiBhbiBleHByZXNzaW9uIGV2YWx1YXRvciBzbyB0aGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBBcyBhIHJlc3VsdCwgZGVjbGFyYXRpb25zIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBkb24ndCB5ZXQgd29yayA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+I2lmIChkZWZpbmVkKGZvbykgfHwgZGVmaW5lZChiYXIpKQotLi4uCi0jZW5kaWYKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjc1Ij48L2E+PGgzPiBQcmVkZWZpbmVkIFN5bWJvbHM8L2gzPgotT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBzeW1ib2xzIHdpbGwgYmUgZGVmaW5lZCBieSBTV0lHIHdoZW4gaXQgaXMgcHJvY2Vzc2luZyBhbiBpbnRlcmZhY2UgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+U1dJRwkJCQlBbHdheXMgZGVmaW5lZCB3aGVuIFNXSUcgaXMgcHJvY2Vzc2luZyBhIGZpbGUKLVNXSUdUQ0wJCQkJRGVmaW5lZCB3aGVuIHVzaW5nIFRjbAotU1dJR1RDTDgJCQkJRGVmaW5lZCB3aGVuIHVzaW5nIFRjbDguMAotU1dJR1BFUkwJCQkJRGVmaW5lZCB3aGVuIHVzaW5nIFBlcmwKLVNXSUdQRVJMNAkJCQlEZWZpbmVkIHdoZW4gdXNpbmcgUGVybDQKLVNXSUdQRVJMNQkJCQlEZWZpbmVkIHdoZW4gdXNpbmcgUGVybDUKLVNXSUdQWVRIT04JCQkJRGVmaW5lZCB3aGVuIHVzaW5nIFB5dGhvbgotU1dJR0dVSUxFCQkJCURlZmluZWQgd2hlbiB1c2luZyBHdWlsZQotU1dJR1dJTgkJCQlEZWZpbmVkIHdoZW4gcnVubmluZyBTV0lHIHVuZGVyIFdpbmRvd3MKLVNXSUdNQUMJCQkJRGVmaW5lZCB3aGVuIHJ1bm5pbmcgU1dJRyBvbiB0aGUgTWFjaW50b3NoCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUludGVyZmFjZSBmaWxlcyBjYW4gbG9vayBhdCB0aGVzZSBzeW1ib2xzIGFzIG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIHdheSBpbiB3aGljaCBhbiBpbnRlcmZhY2UgaXMgZ2VuZXJhdGVkIG9yIHRvIG1peCBTV0lHIGRpcmVjdGl2ZXMgd2l0aCBDIGNvZGUuIFRoZXNlIHN5bWJvbHMgYXJlIGFsc28gZGVmaW5lZCB3aXRoaW4gdGhlIEMgY29kZSBnZW5lcmF0ZWQgYnkgU1dJRyAoZXhjZXB0IGZvciB0aGUgc3ltYm9sIGA8dHQ+U1dJRzwvdHQ+JyB3aGljaCBpcyBvbmx5IGRlZmluZWQgd2l0aGluIHRoZSBTV0lHIGNvbXBpbGVyKS48cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBDb2RlIEluc2VydGlvbjwvaDI+Ci1Tb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGluc2VydCBzcGVjaWFsIGNvZGUgaW50byB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgZmlsZSBnZW5lcmF0ZWQgYnkgU1dJRy4gICBGb3IgZXhhbXBsZSwgeW91IG1heSB3YW50IHRvIGluY2x1ZGUgYWRkaXRpb25hbCBDIGNvZGUgdG8gcGVyZm9ybSBpbml0aWFsaXphdGlvbiBvciBvdGhlciBvcGVyYXRpb25zLiAgVGhlcmUgYXJlIGZvdXIgd2F5cyB0byBpbnNlcnQgY29kZSwgYnV0IGl0J3MgdXNlZnVsIHRvIGtub3cgaG93IHRoZSBvdXRwdXQgb2YgU1dJRyBpcyBzdHJ1Y3R1cmVkIGZpcnN0LjxwPgotPGEgbmFtZT0ibjc2Ij48L2E+PGgzPiBUaGUgb3V0cHV0IG9mIFNXSUc8L2gzPgotU1dJRyBjcmVhdGVzIGEgc2luZ2xlIEMgc291cmNlIGZpbGUgY29udGFpbmluZyB3cmFwcGVyIGZ1bmN0aW9ucywgaW5pdGlhbGl6YXRpb24gY29kZSwgYW5kIHN1cHBvcnQgY29kZS4gVGhlIHN0cnVjdHVyZSBvZiB0aGlzIGZpbGUgaXMgYXMgZm9sbG93cyA6PHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDMuMS5wbmciPjwvY2VudGVyPgotCi08cD4KLTxwPgotVGhlIGhlYWRlcnMgcG9ydGlvbiB0eXBpY2FsbHkgY29udGFpbnMgaGVhZGVyIGZpbGVzLCBzdXBwb3J0aW5nIGNvZGUsIGhlbHBlciBmdW5jdGlvbnMsIGFuZCBmb3J3YXJkIGRlY2xhcmF0aW9ucy4gSWYgeW91IGxvb2sgYXQgaXQsIHlvdSdsbCB1c3VhbGx5IGZpbmQgYSBoaWRlb3VzIG1lc3Mgc2luY2UgdGhpcyBhbHNvIGNvbnRhaW5zIHRoZSBTV0lHIHJ1bi10aW1lIHBvaW50ZXIgdHlwZS1jaGVja2VyIGFuZCBpbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCBieSB0aGUgd3JhcHBlciBmdW5jdGlvbnMuIFRoZSAid3JhcHBlciIgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IGNvbnRhaW5zIGFsbCBvZiB0aGUgd3JhcHBlciBmdW5jdGlvbnMuIEZpbmFsbHksIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBhIHNpbmdsZSBDIGZ1bmN0aW9uIHRoYXQgaXMgY3JlYXRlZCB0byBpbml0aWFsaXplIHlvdXIgbW9kdWxlIHdoZW4gaXQgaXMgbG9hZGVkLjxwPgotPGEgbmFtZT0ibjc3Ij48L2E+PGgzPiBDb2RlIGJsb2NrczwvaDM+Ci1BIGNvZGUgYmxvY2sgaXMgZW5jbG9zZWQgYnkgYSA8dHQ+JXssICV9PC90dD4gYW5kIGlzIHVzZWQgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgaGVhZGVyIHBvcnRpb24gb2YgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGZpbGUuIEV2ZXJ5dGhpbmcgaW4gdGhlIGJsb2NrIGlzIGNvcGllZCB2ZXJiYXRpbSBpbnRvIHRoZSBvdXRwdXQgZmlsZSBhbmQgd2lsbCBhcHBlYXIgYmVmb3JlIGFueSBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbnMuICAgTW9zdCBTV0lHIGlucHV0IGZpbGVzIGhhdmUgYXQgbGVhc3Qgb25lIGNvZGUgYmxvY2sgdGhhdCBpcyBub3JtYWxseSB1c2VkIHRvIGluY2x1ZGUgaGVhZGVyIGZpbGVzIGFuZCBzdXBwb3J0aW5nIEMgY29kZS4gICAgICBBZGRpdGlvbmFsIGNvZGUgYmxvY2tzIG1heSBiZSBwbGFjZWQgYW55d2hlcmUgaW4gYSBTV0lHIGZpbGUgYXMgbmVlZGVkLiA8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbW9kdWxlIG15bW9kdWxlCi0lewotI2luY2x1ZGUgIm15X2hlYWRlci5oIgotJX0KLQotLi4uIERlY2xhcmUgZnVuY3Rpb25zIGhlcmUKLSV7Ci0KLS4uLiBJbmNsdWRlIFRjbF9BcHBJbml0KCkgZnVuY3Rpb24gaGVyZSAuLi4KLQotJX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQ29kZSBibG9ja3MgYXJlIGFsc28gdHlwaWNhbGx5IHVzZWQgdG8gd3JpdGUgImhlbHBlciIgZnVuY3Rpb25zLiBUaGVzZSBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBhbiBpbnRlcmZhY2UgYW5kIGFyZSBnZW5lcmFsbHkgbm90IHZpc2libGUgdG8gdGhlIG5vcm1hbCBDIHByb2dyYW0uIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lewotCi0vKiBDcmVhdGUgYSBuZXcgdmVjdG9yICovCi1zdGF0aWMgVmVjdG9yICpuZXdfVmVjdG9yKCkgewotCXJldHVybiAoVmVjdG9yICopIG1hbGxvYyhzaXplb2YoVmVjdG9yKSk7Ci19Ci0KLSV9Ci0KLS8vIE5vdyB3cmFwIGl0IAotVmVjdG9yICpuZXdfVmVjdG9yKCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im43OCI+PC9hPjxoMz4gSW5saW5lZCBjb2RlIGJsb2NrczwvaDM+Ci1CZWNhdXNlIHRoZSBwcm9jZXNzIG9mIHdyaXRpbmcgaGVscGVyIGZ1bmN0aW9ucyBpcyBmYWlybHkgY29tbW9uLCB0aGVyZSBpcyBhIHNwZWNpYWwgaW5saW5lZCBmb3JtIG9mIGNvZGUgYmxvY2sgdGhhdCBpcyB1c2VkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVpbmxpbmUgJXsKLS8qIENyZWF0ZSBhIG5ldyB2ZWN0b3IgKi8KLVZlY3RvciAqbmV3X1ZlY3RvcigpIHsKLQlyZXR1cm4gKFZlY3RvciAqKSBtYWxsb2Moc2l6ZW9mKFZlY3RvcikpOwotfQotJX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD4laW5saW5lPC90dD4gZGlyZWN0aXZlIGluc2VydHMgYWxsIG9mIHRoZSBjb2RlIHRoYXQgZm9sbG93cyB2ZXJiYXRpbSBpbnRvIHRoZSBoZWFkZXIgcG9ydGlvbiBvZiBhbiBpbnRlcmZhY2UgZmlsZS4gVGhlIGNvZGUgaXMgdGhlbiBmZWQgaW50byB0aGUgU1dJRyBwYXJzZXIgYW5kIHR1cm5lZCBpbnRvIGFuIGludGVyZmFjZS4gVGh1cywgdGhlIGFib3ZlIGV4YW1wbGUgY3JlYXRlcyBhIG5ldyBjb21tYW5kIDx0dD5uZXdfVmVjdG9yPC90dD4gdXNpbmcgb25seSBvbmUgZGVjbGFyYXRpb24uIFNpbmNlIHRoZSBjb2RlIGluc2lkZSBhbiA8dHQ+JWlubGluZSAleyAuLi4gJX08L3R0PiBibG9jayBpcyBnaXZlbiB0byBib3RoIHRoZSBDIGNvbXBpbGVyIGFuZCBTV0lHLCBpdCBpcyBpbGxlZ2FsIHRvIGluY2x1ZGUgYW55IFNXSUcgZGlyZWN0aXZlcyBpbnNpZGUgdGhlIDx0dD4leyAuLi4gJX08L3R0PiBibG9jay48cD4KLTxhIG5hbWU9Im43OSI+PC9hPjxoMz4gSW5pdGlhbGl6YXRpb24gYmxvY2tzPC9oMz4KLUNvZGUgbWF5IGFsc28gYmUgaW5zZXJ0ZWQgdXNpbmcgYW4gaW5pdGlhbGl6YXRpb24gYmxvY2ssIGFzIHNob3duIGJlbG93IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4laW5pdCAlewotCi0JaW5pdF92YXJpYWJsZXMoKTsKLSV9Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgY29kZSBpcyBpbnNlcnRlZCBkaXJlY3RseSBpbnRvIFNXSUcncyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gICAgWW91IGNhbiB1c2UgaXQgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGFuZCBvcGVyYXRpb25zLiAgIFNpbmNlIHRoaXMgY29kZSBpcyBpbnNlcnRlZCBkaXJlY3RseSBpbnRvIGFub3RoZXIgZnVuY3Rpb24sIGl0IHNob3VsZCBub3QgZGVjbGFyZSBmdW5jdGlvbnMgb3IgaW5jbHVkZSBoZWFkZXIgZmlsZXMuICAgUHJpbWFyaWx5IHRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGNhbGxvdXRzIHRvIHdpZGdldHMgYW5kIG90aGVyIHBhY2thZ2VzIHRoYXQgbWlnaHQgYWxzbyBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHdoZW4geW91ciBleHRlbnNpb24gaXMgbG9hZGVkLjxwPgotPGEgbmFtZT0ibjgwIj48L2E+PGgzPiBXcmFwcGVyIGNvZGUgYmxvY2tzPC9oMz4KLUNvZGUgbWF5IGJlIGluc2VydGVkIGluIHRoZSB3cmFwcGVyIGNvZGUgc2VjdGlvbiBvZiBhbiBvdXRwdXQgZmlsZSB1c2luZyB0aGUgPHR0PiV3cmFwcGVyPC90dD4gZGlyZWN0aXZlIGFzIHNob3duIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ld3JhcHBlciAlewotCS4uLiBhIGJ1bmNoIG9mIGNvZGUgLi4uCi0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGRpcmVjdGl2ZSwgZm9yIGFsbW9zdCBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCBpcyBpZGVudGljYWwgdG8ganVzdCB1c2luZyBhIDx0dD4leywlfTwvdHQ+IGJsb2NrLCBidXQgbWF5IGJlIHJlcXVpcmVkIGZvciBtb3JlIHNvcGhpc3RpY2F0ZWQgYXBwbGljYXRpb25zLiBJdCBpcyBtYWlubHkgb25seSB1c2VkIGZvciBhZHZhbmNlZCBmZWF0dXJlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiBBcyBhIGdlbmVyYWwgcnVsZSwgeW91IHNob3VsZCBhdm9pZCB1c2luZyB0aGlzIGRpcmVjdGl2ZSB1bmxlc3MgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuPHA+Ci08YSBuYW1lPSJuMTAiPjwvYT48aDI+IEEgZ2VuZXJhbCBpbnRlcmZhY2UgYnVpbGRpbmcgc3RyYXRlZ3k8L2gyPgotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZ2VuZXJhbCBhcHByb2FjaCBmb3IgYnVpbGRpbmcgaW50ZXJmYWNlIHdpdGggU1dJRy4gVGhlIHNwZWNpZmljcyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBzY3JpcHRpbmcgbGFuZ3VhZ2UgYXJlIGZvdW5kIGluIGxhdGVyIGNoYXB0ZXJzLjxwPgotPGEgbmFtZT0ibjgxIj48L2E+PGgzPiBQcmVwYXJpbmcgYSBDIHByb2dyYW0gZm9yIFNXSUc8L2gzPgotU1dJRyBkb2Vzbid0IHJlcXVpcmUgbW9kaWZpY2F0aW9ucyB0byB5b3VyIEMgY29kZSwgYnV0IGlmIHlvdSBmZWVkIGl0IGEgY29sbGVjdGlvbiBvZiByYXcgQyBoZWFkZXIgZmlsZXMgb3Igc291cmNlIGNvZGUsIHRoZSByZXN1bHRzIG1pZ2h0IG5vdCBiZSB3aGF0IHlvdSBleHBlY3QtLS1pbiBmYWN0LCB0aGV5IG1pZ2h0IGJlIGF3ZnVsLiBIZXJlJ3MgYSBzZXJpZXMgb2Ygc3RlcHMgeW91IGNhbiBmb2xsb3cgdG8gbWFrZSBhbiBpbnRlcmZhY2UgZm9yIGEgQyBwcm9ncmFtIDo8cD4KLTxwPgotPHVsPgotPGxpPklkZW50aWZ5IHRoZSBmdW5jdGlvbnMgdGhhdCB5b3Ugd2FudCB0byB3cmFwLiBJdCdzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkgdG8gYWNjZXNzIGV2ZXJ5IHNpbmdsZSBmdW5jdGlvbiBpbiBhIEMgcHJvZ3JhbS0tdGh1cywgYSBsaXR0bGUgZm9yZXRob3VnaHQgY2FuIGRyYW1hdGljYWxseSBzaW1wbGlmeSB0aGUgcmVzdWx0aW5nIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2UuIEMgaGVhZGVyIGZpbGVzIGFyZSBwYXJ0aWN1bGFybHkgZ29vZCBzb3VyY2UgZm9yIGZpbmRpbmcgdGhpbmdzIHRvIHdyYXAuCi08bGk+Q3JlYXRlIGEgbmV3IGludGVyZmFjZSBmaWxlIHRvIGRlc2NyaWJlIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlIHRvIHlvdXIgcHJvZ3JhbS4KLTxsaT5Db3B5IHRoZSBhcHByb3ByaWF0ZSBkZWNsYXJhdGlvbnMgaW50byB0aGUgaW50ZXJmYWNlIGZpbGUgb3IgdXNlIFNXSUcncyA8dHQ+JWluY2x1ZGU8L3R0PiBkaXJlY3RpdmUgdG8gcHJvY2VzcyBhbiBlbnRpcmUgQyBzb3VyY2UvaGVhZGVyIGZpbGUuIEVpdGhlciB3YXksIHRoaXMgc3RlcCBpcyBmYWlybHkgZWFzeS4KLTxsaT5NYWtlIHN1cmUgZXZlcnl0aGluZyBpbiB0aGUgaW50ZXJmYWNlIGZpbGUgdXNlcyBBTlNJIEMvQysrc3ludGF4LgotPGxpPkNoZWNrIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmVuJ3QgYW55IGZ1bmN0aW9ucyBpbnZvbHZpbmcgZnVuY3Rpb24gcG9pbnRlcnMsIG9yIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMgc2luY2UgU1dJRyBkb2Vzbid0IGxpa2UgdGhlc2UgdmVyeSBtdWNoLgotPGxpPkVsaW1pbmF0ZSB1bm5lY2Vzc2FyeSBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLiBTV0lHIHdpbGwgcHJvYmFibHkgcmVtb3ZlIG1vc3Qgb2YgdGhlbSwgYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkuIFJlbWVtYmVyLCBTV0lHIGRvZXMgbm90IHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuCi08bGk+TWFrZSBzdXJlIGFsbCBuZWNlc3NhcnkgYDx0dD50eXBlZGVmPC90dD4nIGRlY2xhcmF0aW9ucyBhbmQgdHlwZS1pbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGludGVyZmFjZSBmaWxlLgotPGxpPklmIHlvdXIgcHJvZ3JhbSBoYXMgYSBtYWluKCkgZnVuY3Rpb24sIHlvdSBtYXkgbmVlZCB0byByZW5hbWUgaXQgKHJlYWQgb24pLgotPGxpPlJ1biBTV0lHIGFuZCBjb21waWxlLgotPC91bD4KLTxwPgotV2hpbGUgdGhpcyBtYXkgc291bmQgY29tcGxpY2F0ZWQsIHRoZSBwcm9jZXNzIHR1cm5zIG91dCB0byBiZSByZWxhdGl2ZWx5IGVhc3kgaW4gcHJhY3RpY2UtLWZvciBleGFtcGxlLCBtYWtpbmcgYW4gaW50ZXJmYWNlIHRvIHRoZSBlbnRpcmUgT3BlbkdMIGxpYnJhcnkgb25seSB0YWtlcyBhYm91dCA1LTEwIG1pbnV0ZXMuPHA+Ci08cD4KLUluIHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIGFuIGludGVyZmFjZSwgeW91IGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBTV0lHIHRvIGZpbmQgcHJvYmxlbWF0aWMgZGVjbGFyYXRpb25zIGFuZCBzcGVjaWZpY2F0aW9ucy4gU1dJRyB3aWxsIHJlcG9ydCBzeW50YXggZXJyb3JzIGFuZCBvdGhlciBwcm9ibGVtcyBhbG9uZyB3aXRoIHRoZSBhc3NvY2lhdGVkIGZpbGUgYW5kIGxpbmUgbnVtYmVyLiA8cD4KLTxhIG5hbWU9Im44MiI+PC9hPjxoMz4gVGhlIFNXSUcgaW50ZXJmYWNlIGZpbGU8L2gzPgotVGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgdXNpbmcgU1dJRyBpcyB0byBnZW5lcmF0ZSBzZXBhcmF0ZSBpbnRlcmZhY2UgZmlsZS4gU3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIEMgaGVhZGVyIGZpbGUgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLS8qIEZpbGUgOiBoZWFkZXIuaCAqLwotCi0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlICZsdDttYXRoLmgmZ3Q7Ci0KLWV4dGVybiBpbnQgZm9vKGRvdWJsZSk7Ci1leHRlcm4gZG91YmxlIGJhcihpbnQsIGludCk7Ci1leHRlcm4gdm9pZCBkdW1wKEZJTEUgKmYpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BIHR5cGljYWwgU1dJRyBpbnRlcmZhY2UgZmlsZSBmb3IgdGhpcyBoZWFkZXIgZmlsZSB3b3VsZCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotLyogRmlsZSA6IGludGVyZmFjZS5pICovCi0lbW9kdWxlIG15bW9kdWxlCi0lewotI2luY2x1ZGUgImhlYWRlci5oIgotJX0KLWV4dGVybiBpbnQgZm9vKGRvdWJsZSk7Ci1leHRlcm4gZG91YmxlIGJhcihpbnQsIGludCk7Ci1leHRlcm4gdm9pZCBkdW1wKEZJTEUgKmYpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PZiBjb3Vyc2UsIGluIHRoaXMgY2FzZSwgb3VyIGhlYWRlciBmaWxlIGlzIHByZXR0eSBzaW1wbGUgc28gd2UgY291bGQgaGF2ZSBtYWRlIGFuIGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcyBhcyB3ZWxsOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBpbnRlcmZhY2UuaSAqLwotJW1vZHVsZSBteW1vZHVsZQotJWluY2x1ZGUgaGVhZGVyLmgKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotTmF0dXJhbGx5LCB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuPHA+Ci08YSBuYW1lPSJuODMiPjwvYT48aDM+IFdoeSB1c2Ugc2VwYXJhdGUgaW50ZXJmYWNlIGZpbGVzPzwvaDM+Ci1XaGlsZSBTV0lHIGNhbiBwYXJzZSBtYW55IGhlYWRlciBmaWxlcywgaXQgaXMgbW9yZSBjb21tb24gdG8gd3JpdGUgYSBzcGVjaWFsIDx0dD4uaTwvdHQ+IGZpbGUgZGVmaW5pbmcgdGhlIGludGVyZmFjZSB0byBhIHBhY2thZ2UuIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgZm9yIGRvaW5nIHRoaXMgOjxwPgotPHA+Ci08dWw+Ci08bGk+SXQgaXMgcmFyZWx5IG5lY2Vzc2FyeSB0byBhY2Nlc3MgZXZlcnkgc2luZ2xlIGZ1bmN0aW9uIGluIGEgbGFyZ2UgcGFja2FnZS4gTWFueSBDIGZ1bmN0aW9ucyBtaWdodCBoYXZlIGxpdHRsZSBvciBubyB1c2UgaW4gYSBzY3JpcHRlZCBlbnZpcm9ubWVudC4gVGhlcmZvcmUsIHdoeSB3cmFwIHRoZW0/Ci08bGk+U2VwYXJhdGUgaW50ZXJmYWNlIGZpbGVzIHByb3ZpZGUgYW4gb3Bwb3J0dW5pdHkgdG8gcHJvdmlkZSBtb3JlIHByZWNpc2UgcnVsZXMgYWJvdXQgaG93IGFuIGludGVyZmFjZSBpcyB0byBiZSBjb25zdHJ1Y3RlZC4KLTxsaT5JbnRlcmZhY2UgZmlsZXMgY2FuIHByb3ZpZGUgc3RydWN0dXJlIGFuZCBvcmdhbml6YXRpb24uIEZvciBleGFtcGxlICwgeW91IGNhbiBicmVhayB0aGUgaW50ZXJmYWNlIHVwIGludG8gc2VjdGlvbnMsIHByb3ZpZGUgZG9jdW1lbnRhdGlvbiwgYW5kIGRvIG90aGVyIHRoaW5ncyB0aGF0IHlvdSBtaWdodCBub3Qgbm9ybWFsbHkgZG8gd2l0aCBhbiBvcmRpbmFyeSAuaCBmaWxlLgotPGxpPlNXSUcgY2FuJ3QgcGFyc2UgY2VydGFpbiBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiBoZWFkZXIgZmlsZXMuIEhhdmluZyBhIHNlcGFyYXRlIGZpbGUgYWxsb3dzIHlvdSB0byBlbGltaW5hdGUgb3Igd29yayBhcm91bmQgdGhlc2UgcHJvYmxlbXMuCi08bGk+SW50ZXJmYWNlIGZpbGVzIHByb3ZpZGUgYSBwcmVjaXNlIGRlZmluaXRpb24gb2Ygd2hhdCB0aGUgaW50ZXJmYWNlIGlzLiBVc2VycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgc3lzdGVtIGNhbiBnbyB0byB0aGUgaW50ZXJmYWNlIGZpbGUgYW5kIGltbWVkaWF0ZWx5IHNlZSB3aGF0IGlzIGF2YWlsYWJsZSB3aXRob3V0IGhhdmluZyB0byBkaWcgaXQgb3V0IG9mIGhlYWRlciBmaWxlcy4KLTwvdWw+Ci08YSBuYW1lPSJuODQiPjwvYT48aDM+IEdldHRpbmcgdGhlIHJpZ2h0IGhlYWRlciBmaWxlczwvaDM+Ci1Tb21ldGltZXMsIGl0IGlzIG5lY2Vzc2FyeSB0byB1c2UgY2VydGFpbiBoZWFkZXIgZmlsZXMgaW4gb3JkZXIgZm9yIHRoZSBjb2RlIGdlbmVyYXRlZCBieSBTV0lHIHRvIGNvbXBpbGUgcHJvcGVybHkuIFlvdSBjYW4gaGF2ZSBTV0lHIGluY2x1ZGUgY2VydGFpbiBoZWFkZXIgZmlsZXMgYnkgdXNpbmcgYSA8dHQ+JXssJX08L3R0PiBibG9jayBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0lbW9kdWxlIGdyYXBoaWNzCi0lewotI2luY2x1ZGUgJmx0O0dML2dsLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7R0wvZ2x1LmgmZ3Q7Ci0lfQotCi0vLyBQdXQgcmVzdCBvZiBkZWNsYXJhdGlvbnMgaGVyZQotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuODUiPjwvYT48aDM+IFdoYXQgdG8gZG8gd2l0aCBtYWluKCk8L2gzPgotSWYgeW91ciBwcm9ncmFtIGRlZmluZXMgYSA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24sIHlvdSBtYXkgbmVlZCB0byBnZXQgcmlkIG9mIGl0IG9yIHJlbmFtZSBpdCBpbiBvcmRlciB0byB1c2UgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIE1vc3Qgc2NyaXB0aW5nIGxhbmd1YWdlcyBkZWZpbmUgdGhlaXIgb3duIDx0dD5tYWluKCk8L3R0PiBwcm9jZWR1cmUgdGhhdCBtdXN0IGJlIGNhbGxlZCBpbnN0ZWFkLiA8dHQ+bWFpbigpPC90dD4gYWxzbyBtYWtlcyBubyBzZW5zZSB3aGVuIHdvcmtpbmcgd2l0aCBkeW5hbWljIGxvYWRpbmcuIFRoZXJlIGFyZSBhIGZldyBhcHByb2FjaGVzIHRvIHNvbHZpbmcgdGhlIDx0dD5tYWluKCk8L3R0PiBjb25mbGljdCA6PHA+Ci08cD4KLTx1bD4KLTxsaT5HZXQgcmlkIG9mIDx0dD5tYWluKCk8L3R0PiBlbnRpcmVseS4gVGhpcyBpcyB0aGUgYnJ1dGUgZm9yY2UgYXBwcm9hY2guCi08bGk+UmVuYW1lIDx0dD5tYWluKCk8L3R0PiB0byBzb21ldGhpbmcgZWxzZS4gWW91IGNhbiBkbyB0aGlzIGJ5IGNvbXBpbGluZyB5b3VyIEMgcHJvZ3JhbSB3aXRoIGFuIG9wdGlvbiBsaWtlIDx0dD4tRG1haW49b2xkbWFpbjwvdHQ+LgotPGxpPlVzZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byBvbmx5IGluY2x1ZGUgPHR0Pm1haW4oKTwvdHQ+IHdoZW4gbm90IHVzaW5nIGEgc2NyaXB0aW5nIGxhbmd1YWdlLgotPC91bD4KLTxwPgotR2V0dGluZyByaWQgb2YgPHR0Pm1haW4oKTwvdHQ+IG1heSBjYXVzZSBwb3RlbnRpYWwgaW5pdGlhbGl6YXRpb24gcHJvYmxlbXMgb2YgYSBwcm9ncmFtLiBUbyBoYW5kbGUgdGhpcyBwcm9ibGVtLCB5b3UgbWF5IGNvbnNpZGVyIHdyaXRpbmcgYSBzcGVjaWFsIGZ1bmN0aW9uIGNhbGxlZCA8dHQ+cHJvZ3JhbV9pbml0KCk8L3R0PiB0aGF0IGluaXRpYWxpemVzIHlvdXIgcHJvZ3JhbSB1cG9uIHN0YXJ0dXAuIFRoaXMgZnVuY3Rpb24gY291bGQgdGhlbiBiZSBjYWxsZWQgZWl0aGVyIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBhcyB0aGUgZmlyc3Qgb3BlcmF0aW9uLCBvciB3aGVuIHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUgaXMgbG9hZGVkLjxwPgotPHA+Ci1BcyBhIGdlbmVyYWwgbm90ZSwgbWFueSBDIHByb2dyYW1zIG9ubHkgdXNlIHRoZSA8dHQ+bWFpbigpPC90dD4gZnVuY3Rpb24gdG8gcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHRvIHNldCBwYXJhbWV0ZXJzLiBIb3dldmVyLCBieSB1c2luZyBhIHNjcmlwdGluZyBsYW5ndWFnZSwgeW91IGFyZSBwcm9iYWJseSB0cnlpbmcgdG8gY3JlYXRlIGEgcHJvZ3JhbSB0aGF0IGlzIG1vcmUgaW50ZXJhY3RpdmUuIEluIG1hbnkgY2FzZXMsIHRoZSBvbGQgPHR0Pm1haW4oKTwvdHQ+IHByb2dyYW0gY2FuIGJlIGNvbXBsZXRlbHkgcmVwbGFjZWQgYnkgYSBQZXJsLCBQeXRob24sIG9yIFRjbCBzY3JpcHQuPHA+Ci08YSBuYW1lPSJuODYiPjwvYT48aDM+IFdvcmtpbmcgd2l0aCB0aGUgQyBwcmVwcm9jZXNzb3I8L2gzPgotSWYgeW91IGhhdmUgYSBoZWFkZXIgZmlsZSB0aGF0IG1ha2VzIGhlYXZ5IHVzZSBvZiBtYWNyb3MgYW5kIEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMsIGl0IG1heSBiZSB1c2VmdWwgdG8gcnVuIGl0IHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIGZpcnN0LiBUaGlzIGNhbiB1c3VhbGx5IGJlIGRvbmUgYnkgcnVubmluZyB0aGUgQyBjb21waWxlciB3aXRoIHRoZSAtRSBvcHRpb24uIFRoZSBvdXRwdXQgd2lsbCBiZSBjb21wbGV0ZWx5IGhpZGVvdXMsIGJ1dCBtYWNyb3MgYW5kIG90aGVyIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHNob3VsZCBub3cgYmUgZXhwYW5kZWQgYXMgbmVlZGVkLiBJZiB5b3Ugd2FudCB0byB3cmFwIGEgQyBwcmVwcm9jZXNzb3IgbWFjcm8gd2l0aCBTV0lHLCB0aGlzIGNhbiBiZSBkb25lIGJ5IGdpdmluZyBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgdXNhZ2UgYXMgdGhlIG1hY3JvLiBXaGVuIHdyaXRpbmcgdGhlIG1hY3JvIGFzIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIHlvdSBhcmUgcHJvdmlkaW5nIFNXSUcgd2l0aCB0eXBlLWluZm9ybWF0aW9uLS13aXRob3V0IHRoYXQsIFNXSUcgd291bGQgYmUgdW5hYmxlIHRvIHByb2R1Y2UgYW55IHNvcnQgb2Ygd3JhcHBlciBjb2RlLiA8cD4KLTxhIG5hbWU9Im44NyI+PC9hPjxoMz4gSG93IHRvIGNvcGUgd2l0aCBDKys8L2gzPgotR2l2ZW4gdGhlIGNvbXBsZXhpdHkgb2YgQysrLCBpdCB3aWxsIGFsbW9zdCBhbHdheXMgYmUgbmVjZXNzYXJ5IHRvIGJ1aWxkIGEgc3BlY2lhbCBpbnRlcmZhY2UgZmlsZSBjb250YWluaW5nIHN1aXRhYmx5IGVkaXRlZCBDKysgZGVjbGFyYXRpb25zLiBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBhIHN5c3RlbSBpbnZvbHZpbmcgNDAwIGhlYWRlciBmaWxlcywgdGhpcyBwcm9jZXNzIHdpbGwgbm90IGJlIHRyaXZpYWwuIFBlcmhhcHMgdGhlIGJlc3Qgd29yZCBvZiBhZHZpY2UgaXMgdG8gdGhpbmsgaGFyZCBhYm91dCB3aGF0IHlvdSB3YW50IHRoaXMgaW50ZXJmYWNlIHRvIGJlLiBBbHNvLCBpcyBpdCBhYnNvbHV0ZWx5IGNyaXRpY2FsIHRvIHdyYXAgZXZlcnkgc2luZ2xlIGZ1bmN0aW9uIGluIGEgQysrIHByb2dyYW0/IFNXSUcncyBzdXBwb3J0IG9mIEMrKyB3aWxsIGltcHJvdmUgd2l0aCB0aW1lLCBidXQgSSdsbCBiZSB0aGUgZmlyc3QgdG8gYWRtaXQgdGhhdCBTV0lHIHdvcmtzIG11Y2ggYmV0dGVyIHdpdGggcHVyZSBBTlNJIEMgY29kZSB3aGVuIGl0IGNvbWVzIHRvIGxhcmdlIHBhY2thZ2VzLjxwPgotPGEgbmFtZT0ibjg4Ij48L2E+PGgzPiBIb3cgdG8gYXZvaWQgY3JlYXRpbmcgdGhlIGludGVyZmFjZSBmcm9tIGhlbGw8L2gzPgotU1dJRyBtYWtlcyBpdCBwcmV0dHkgZWFzeSB0byBidWlsZCBhIGJpZyBpbnRlcmZhY2UgcmVhbGx5IGZhc3QuIEluIGZhY3QsIGlmIHlvdSBhcHBseSBpdCB0byBhIGxhcmdlIGVub3VnaCBwYWNrYWdlLCB5b3UnbGwgZmluZCB5b3Vyc2VsZiB3aXRoIGEgcmF0aGVyIGxhcmdlIGNodW5rIG9mIGNvZGUgYmVpbmcgcHJvZHVjZWQgaW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGZpbGUuIFRvIGdpdmUgeW91IGFuIGlkZWEsIHdyYXBwaW5nIGEgMTAwMCBsaW5lIEMgaGVhZGVyIGZpbGUgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zIG1heSByZXN1bHQgaW4gYSB3cmFwcGVyIGZpbGUgY29udGFpbmluZyAyMCwwMDAtMzAsMDAwIGxpbmVzIG9mIGNvZGUuIEkgY2FuIG9ubHkgaW1hZ2luZSB3aGF0IHdyYXBwaW5nIGEgaHVnZSBDKysgY2xhc3MgaGllcmFyY2h5IHdvdWxkIGdlbmVyYXRlLiBIZXJlJ3MgYSBmZXcgcnVsZXMgb2YgdGh1bWIgZm9yIG1ha2luZyBzbWFsbGVyIGludGVyZmFjZXMgOjxwPgotPHA+Ci08dWw+Ci08bGk+QXNrIHlvdXJzZWxmIGlmIHlvdSByZWFsbHkgbmVlZCB0byBhY2Nlc3MgcGFydGljdWxhciBmdW5jdGlvbnMuIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byB3cmFwIGV2ZXJ5IHNpbmdsZSBmdW5jdGlvbiBpbiBhIHBhY2thZ2UuIEluIGZhY3QsIHlvdSBwcm9iYWJseSBvbmx5IG5lZWQgYSByZWxhdGl2ZWx5IHNtYWxsIHN1YnNldC4KLTxsaT5TV0lHIGRvZXMgbm90IHJlcXVpcmUgc3RydWN0dXJlIGRlZmluaXRpb25zIHRvIG9wZXJhdGUuIElmIHlvdSBhcmUgbmV2ZXIgZ29pbmcgdG8gYWNjZXNzIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0dXJlLCBkb24ndCB3cmFwIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gCi08bGk+RWxpbWluYXRlIHVubmVlZGVkIG1lbWJlcnMgb2YgQysrIGNsYXNzZXMuCi08bGk+VGhpbmsgYWJvdXQgdGhlIHByb2JsZW0gYXQgaGFuZC4gSWYgeW91IGFyZSBvbmx5IHVzaW5nIGEgc3Vic2V0IG9mIHNvbWUgbGlicmFyeSwgdGhlcmUgaXMgbm8gbmVlZCB0byB3cmFwIHRoZSB3aG9sZSB0aGluZy4KLTxsaT5Xcml0ZSBzdXBwb3J0IG9yIGhlbHBlciBmdW5jdGlvbnMgdG8gc2ltcGxpZnkgY29tbW9uIG9wZXJhdGlvbnMuIFNvbWUgQyBmdW5jdGlvbnMgbWF5IG5vdCBiZSBlYXN5IHRvIHVzZSBpbiBhIHNjcmlwdGluZyBsYW5ndWFnZSBlbnZpcm9ubWVudC4gWW91IG1pZ2h0IGNvbnNpZGVyIHdyaXRpbmcgYW4gYWx0ZXJuYXRpdmUgdmVyc2lvbiBhbmQgd3JhcHBpbmcgdGhhdCBpbnN0ZWFkLgotPC91bD4KLTxwPgotV3JpdGluZyBhIG5pY2UgaW50ZXJmYWNlIHRvIGEgcGFja2FnZSByZXF1aXJlcyB3b3JrLiBKdXN0IGJlY2F1c2UgeW91IHVzZSBTV0lHIGl0IGRvZXNuJ3QgbWVhbiB0aGF0IHlvdSdyZSBnb2luZyB0byBlbmQgdXAgd2l0aCBhIGdvb2QgaW50ZXJmYWNlLiBTV0lHIGlzIHByaW1hcmlseSBkZXNpZ25lZCB0byBlbGltaW5hdGUgdGhlIHRlZGlvdXMgdGFzayBvZiB3cml0aW5nIHdyYXBwZXIgZnVuY3Rpb25zLiBJdCBkb2VzIG5vdCBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHByb3BlciBwbGFubmluZyBhbmQgZGVzaWduIHdoZW4gaXQgY29tZXMgdG8gYnVpbGRpbmcgYSB1c2VmdWwgYXBwbGljYXRpb24uIEluIHNob3J0LCBhIGxpdHRsZSBmb3JldGhvdWdodCBjYW4gZ28gYSBsb25nIHdheS48cD4KLTxwPgotT2YgY291cnNlLGlmIHlvdSdyZSBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiBqdXN0IHNsYXBwaW5nIHNvbWV0aGluZyB0b2dldGhlciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVidWdnaW5nLCByYXBpZCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCwgYW5kIHByb3RvdHlwaW5nLCBTV0lHIHdpbGwgZ2xhZGx5IGRvIGl0IGZvciB5b3UgKGluIGZhY3QsIEkgdXNlIFNXSUcgYWxvdCBmb3IgdGhpcyB3aGVuIGRldmVsb3Bpbmcgb3RoZXIgQy9DKysgYXBwbGljYXRpb25zKS48cD4KLTxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDY6NTMgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvU2NyaXB0aW5nLmh0bWwgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML1NjcmlwdGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc4ODEyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvU2NyaXB0aW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotPCEtLSBQdWJsaXNoZWQgYnkgUXVhZHJhbGF5IFdlYldvcmtzIEhUTUwgTGl0ZSAxLjUuMSAtLT4KLTwhLS0gQW5kIG11bmdlZCBieSBEYXZlJ3Mgc3BlY2lhbCBQeXRob24gc2NyaXB0IC0tPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5TY3JpcHRpbmcgTGFuZ3VhZ2VzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT4yIFNjcmlwdGluZyBMYW5ndWFnZXM8L2gxPjxwPjx1bD4KLTxsaT4gPGEgaHJlZj0iI24xIj5UaGUgdHdvIGxhbmd1YWdlIHZpZXcgb2YgdGhlIHdvcmxkPC9hPgotPGxpPiA8YSBocmVmPSIjbjIiPkhvdyBkb2VzIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRhbGsgdG8gQz88L2E+Ci08bGk+IDxhIGhyZWY9IiNuMyI+QnVpbGRpbmcgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+U2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pYyBsb2FkaW5nPC9hPgotPC91bD4KLQotU1dJRyBpcyBhbGwgYWJvdXQgdXNpbmcgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aXRoIEMvQysrIHRvIG1ha2UgZmxleGlibGUgYXBwbGljYXRpb25zLiBUaGlzIGNoYXB0ZXIgcHJvdmlkZXMgYSBicmllZiBvdmVydmlldyBvZiBzZXZlcmFsIGNvbmNlcHRzIGFuZCBpbXBvcnRhbnQgYXNwZWN0cyBvZiB0aGlzIGludGVyZmFjZS4gTWFueSBvZiBTV0lHJ3MgcG90ZW50aWFsIHVzZXJzIG1heSBub3QgaGF2ZSBjb25zaWRlcmVkIHVzaW5nIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGJlZm9yZSwgc28gSSBob3BlIHRoYXQgdGhpcyBjaGFwdGVyIGNhbiBwcm92aWRlIGEgbGl0dGxlIG1vdGl2YXRpb24uPHA+Ci08YSBuYW1lPSJuMSI+PC9hPjxoMj4gVGhlIHR3byBsYW5ndWFnZSB2aWV3IG9mIHRoZSB3b3JsZDwvaDI+Ci1CeSBkZXZlbG9waW5nIFNXSUcsIEkgYW0gdHJ5aW5nIHRvIGJ1aWxkIHN5c3RlbXMgdGhhdCBhcmUgbG9vc2VseSBzdHJ1Y3R1cmVkIGFzIGZvbGxvd3MgOjxwPgotPHA+PGNlbnRlcj48aW1nIHNyYz0iY2gyLjEucG5nIj48L2NlbnRlcj48cD4KLTxwPgotPHA+Ci1BIHJlYWwgYXBwbGljYXRpb24gbWlnaHQgbG9vayBtb3JlIGxpa2UgdGhpcyA6PHA+Ci08cD48Y2VudGVyPjxpbWcgc3JjPSJjaDIuMi5wbmciPjwvY2VudGVyPjxwPgotPHA+Ci1JbiBlaXRoZXIgY2FzZSwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY29udHJvbGxpbmcgYSBDL0MrKyBwcm9ncmFtIHdpdGggYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlLiBPdXIgaW50ZXJmYWNlIG1heSBiZSBmb3IgYSBzbWFsbCBncm91cCBvZiBmdW5jdGlvbnMgb3IgYSBsYXJnZSBjb2xsZWN0aW9uIG9mIEMgbGlicmFyaWVzIGZvciBwZXJmb3JtaW5nIGEgdmFyaWV0eSBvZiB0YXNrcy4gSW4gdGhpcyBtb2RlbCwgQyBmdW5jdGlvbnMgYXJlIHR1cm5lZCBpbnRvIGNvbW1hbmRzLiBUbyBjb250cm9sIHRoZSBwcm9ncmFtLCB0aGUgdXNlciBub3cgdHlwZXMgdGhlc2UgY29tbWFuZHMgb3Igd3JpdGVzIHNjcmlwdHMgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgb3BlcmF0aW9uLiBJZiB5b3UgaGF2ZSB1c2VkIGNvbW1lcmNpYWwgcGFja2FnZXMgc3VjaCBhcyBNQVRMQUIgb3IgSURMLCBpdCBpcyBhIHZlcnkgc2ltaWxhciBtb2RlbC0teW91IGV4ZWN1dGUgY29tbWFuZHMgYW5kIHdyaXRlIHNjcmlwdHMsIHlldCBtb3N0IG9mIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgd3JpdHRlbiBpbiBDIG9yIEZvcnRyYW4gZm9yIHBlcmZvcm1hbmNlLjxwPgotPHA+Ci1UaGUgdHdvLWxhbmd1YWdlIG1vZGVsIG9mIGNvbXB1dGluZyBpcyBleHRyZW1lbHkgcG93ZXJmdWwgYmVjYXVzZSBpdCBleHBsb2l0cyB0aGUgc3RyZW5ndGhzIG9mIGVhY2ggbGFuZ3VhZ2UuIEMvQysrIGNhbiBiZSB1c2VkIGZvciBtYXhpbWFsIHBlcmZvcm1hbmNlIGFuZCBjb21wbGljYXRlZCBzeXN0ZW1zIHByb2dyYW1taW5nIHRhc2tzLiBTY3JpcHRpbmcgbGFuZ3VhZ2VzIGNhbiBiZSB1c2VkIGZvciByYXBpZCBwcm90b3R5cGluZywgaW50ZXJhY3RpdmUgZGVidWdnaW5nLCBzY3JpcHRpbmcsIGFuZCBhY2Nlc3MgdG8gaGlnaC1sZXZlbCBkYXRhIHN0cnVjdHVyZXMgc3VjaCBhcyBsaXN0cywgYXJyYXlzLCBhbmQgaGFzaCB0YWJsZXMuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMz4gV2lsbCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIG1ha2UgbXkgQyBwcm9ncmFtIGluZWZmaWNpZW50PzwvaDM+Ci1PbmUgb2YgdGhlIGNyaXRpY2lzbXMgb2Ygc2NyaXB0aW5nIGxhbmd1YWdlcyBpcyB0aGF0IHRoZXkgYXJlIGludGVycHJldGVkIGFuZCBzbG93LiBObyBkb3VidCBhYm91dCBpdCwgYSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2lsbCBhbHdheXMgcnVuIG11Y2ggc2xvd2VyIHRoYW4gQy4gSG93ZXZlciwgaWYgeW91IGFyZSB1c2luZyBhIHNjcmlwdGluZyBsYW5ndWFnZSB0byBjb250cm9sIGEgYmlnIEMgcHJvZ3JhbSwgbW9zdCBvZiB5b3VyIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgd3JpdHRlbiBpbiBDIGFuZCBzdGlsbCBmYXN0LiBUaHVzLCB0aGVyZSBpcyByZWFsbHkgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIHdyaXRpbmcgdGhlIGZvbGxvd2luZyBpbiBDIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmZvciAoaSA9IDA7IGkgJmx0OyAxMDAwOyBpKyspIHsKLQljYWxsIGEgYnVuY2ggb2YgQyBmdW5jdGlvbnMgdG8gZG8gc29tZXRoaW5nCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLW9yIHdyaXRpbmcgdGhlIHNhbWUgdGhpbmcgaW4gUHl0aG9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5mb3IgaSBpbiByYW5nZSgwLDEwMDApOgotCWNhbGwgYSBidW5jaCBvZiBDIGZ1bmN0aW9ucyB0byBkbyBzb21ldGhpbmcKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTW9zdCBvZiB0aGUgdGltZSBpcyBzdGlsbCBzcGVudCBpbiB0aGUgdW5kZXJseWluZyBDIGZ1bmN0aW9ucy4gT2YgY291cnNlLCB5b3Ugd291bGRuJ3Qgd2FudCB0byB3cml0ZSB0aGUgaW5uZXIgbG9vcCBvZiBhIG1hdHJpeCBtdWx0aXBseSBpbiBhIHNjcmlwdGluZyBsYW5ndWFnZSwgYnV0IHlvdSBhbHJlYWR5IGtuZXcgdGhpcy4gSXQgaXMgYWxzbyB3b3J0aCBub3RpbmcgdGhhdCByZWltcGxlbWVudGluZyBjZXJ0YWluIG9wZXJhdGlvbnMgaW4gQyBtaWdodCBub3QgbGVhZCB0byBiZXR0ZXIgcGVyZm9ybWFuY2UuIEZvciBleGFtcGxlLCBQZXJsIGlzIGhpZ2hseSBvcHRpbWl6ZWQgZm9yIHRleHQtcHJvY2Vzc2luZyBvcGVyYXRpb25zLiBNb3N0IG9mIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGFscmVhZHkgaW1wbGVtZW50ZWQgaW4gQyAodW5kZXJuZWF0aCB0aGUgaG9vZCkgc28gaW4gY2VydGFpbiBjYXNlcywgdXNpbmcgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbWF5IGFjdHVhbGx5IGJlIGZhc3RlciB0aGFuIGFuIGVxdWl2YWxlbnQgaW1wbGVtZW50YXRpb24gaW4gQy4gPHA+Ci08YSBuYW1lPSJuNiI+PC9hPjxoMz4gV2lsbCBhZGRpbmcgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgdG8gbXkgQyBwcm9ncmFtIG1ha2UgaXQgdW5tYW5hZ2FibGU/PC9oMz4KLUEgZmVhciBhbW9uZyBzb21lIHVzZXJzIGlzIHRoYXQgYnkgYWRkaW5nIGEgc2Vjb25kIGxhbmd1YWdlLCB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhIHBhY2thZ2UgdGhhdCBpcyBoYXJkIHRvIG1haW50YWluIGFuZCB1c2UuIEkgYmVsaWV2ZSB0aGF0IHRoZXJlIGFyZSB0d28gYW5zd2VycyB0byB0aGlzIHF1ZXN0aW9uLiBJZiB5b3UgZmluZCB5b3Vyc2VsZiBtb2RpZnlpbmcgdGhlIEMgY29kZSB0byBmaXQgaXQgaW50byBhIHNwZWNpZmljIHNjcmlwdGluZyBsYW5ndWFnZSwgdGhlbiBpdCB3aWxsIGJlIGRpZmZpY3VsdCB0byBtYWludGFpbi4gQnkgZG9pbmcgdGhpcywgeW91IHdpbGwgbG9jayB5b3Vyc2VsZiBpbnRvIGEgcGFydGljdWxhciBsYW5ndWFnZS4gSWYgdGhhdCBsYW5ndWFnZSBjaGFuZ2VzIG9yIGRpc2FwcGVhcnMgb2ZmIHRoZSBmYWNlIG9mIHRoZSBlYXJ0aCwgdGhlbiB5b3Ugd2lsbCBiZSBsZWZ0IHdpdGggc2VyaW91cyBtYWludGVuYW5jZSBwcm9ibGVtcy4gT24gdGhlIGZsaXAgc2lkZSBvZiB0aGUgY29pbiwgYSBub24taW52YXNpdmUgdG9vbCBsaWtlIFNXSUcgY2FuIGJ1aWxkIGludGVyZmFjZXMgd2l0aG91dCByZXF1aXJpbmcgbGFuZ3VhZ2Utc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDIGNvZGUuIElmIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgY2hhbmdlcywgaXQgaXMgZWFzeSB0byB1cGRhdGUgdGhlIHJlc3VsdGluZyBpbnRlcmZhY2UuIElmIHlvdSBkZWNpZGUgdGhhdCB5b3Ugd2FudCB0byBzY3JhcCB0aGUgd2hvbGUgaW50ZXJmYWNlIHNjaGVtZSBhbmQgdHJ5IHNvbWV0aGluZyBlbHNlLCB5b3Ugc3RpbGwgaGF2ZSBhIGNsZWFuIHNldCBvZiBDIGxpYnJhcmllczxwPgotPHA+Ci1NeSBwZXJzb25hbCBleHBlcmllbmNlIGhhcyBiZWVuIHRoYXQgYWRkaW5nIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRvIGEgQyBwcm9ncmFtIG1ha2VzIHRoZSBDIHByb2dyYW0gbW9yZSBtYW5hZ2FibGUhIFlvdSBhcmUgZW5jb3VyYWdlZCB0byB0aGluayBhYm91dCBob3cgeW91ciBDIHByb2dyYW0gaXMgc3RydWN0dXJlZCBhbmQgaG93IHlvdSB3YW50IHRoaW5ncyB0byB3b3JrLiBJbiBldmVyeSBwcm9ncmFtIGluIHdoaWNoIEkgaGF2ZSBhZGRlZCBhIHNjcmlwdGluZyBpbnRlcmZhY2UsIHRoZSBDIGNvZGUgaGFzIGFjdHVhbGx5IGRlY3JlYXNlZCBpbiBzaXplLCBpbXByb3ZlZCBpbiByZWxpYWJpbGl0eSwgYmVjb21lIGVhc2llciB0byBtYWludGFpbiwgd2hpbGUgYmVjb21pbmcgbW9yZSBmdW5jdGlvbmFsIGFuZCBmbGV4aWJsZSB0aGFuIGJlZm9yZS48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBIb3cgZG9lcyBhIHNjcmlwdGluZyBsYW5ndWFnZSB0YWxrIHRvIEM/PC9oMj4KLVNjcmlwdGluZyBsYW5ndWFnZXMgYXJlIGJ1aWx0IGFyb3VuZCBhIHNtYWxsIHBhcnNlciB0aGF0IHJlYWRzIGFuZCBleGVjdXRlcyBzdGF0ZW1lbnRzIG9uIHRoZSBmbHkgYXMgeW91ciBwcm9ncmFtIHJ1bnMuIFdpdGhpbiB0aGUgcGFyc2VyLCB0aGVyZSBpcyBhIG1lY2hhbmlzbSBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzIG9yIGFjY2Vzc2luZyB2YXJpYWJsZXMuIEhvd2V2ZXIsIGluIG9yZGVyIHRvIGFjY2VzcyBDIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzLCBpdCBpcyBuZWNlc3NhcnkgdG8gdGVsbCB0aGUgcGFyc2VyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIHdoYXQga2luZCBvZiBhcmd1bWVudHMgZG9lcyBpdCB0YWtlLCBhbmQgd2hhdCB0byBkbyB3aGVuIGl0IGlzIGNhbGxlZC4gVW5mb3J0dW5hdGVseSwgdGhpcyBwcm9jZXNzIGNhbiBiZSBleHRyZW1lbHkgdGVkaW91cyBhbmQgdGVjaG5pY2FsLiBTV0lHIGF1dG9tYXRlcyB0aGUgcHJvY2VzcyBhbmQgYWxsb3dzIHlvdSB0byBmb3JnZXQgYWJvdXQgaXQuIEluIGFueSBjYXNlLCBpdCdzIHByb2JhYmx5IGEgZ29vZCBpZGVhIHRvIGtub3cgd2hhdCdzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kLjxwPgotPGEgbmFtZT0ibjciPjwvYT48aDM+IFdyYXBwZXIgZnVuY3Rpb25zPC9oMz4KLVN1cHBvc2UgeW91IGhhdmUgYW4gb3JkaW5hcnkgQyBmdW5jdGlvbiBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBmYWN0KGludCBuKSB7Ci0JaWYgKG4gJmx0Oz0gMSkgcmV0dXJuIDE7Ci0JZWxzZSByZXR1cm4gbipmYWN0KG4tMSk7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIG9yZGVyIHRvIGFjY2VzcyB0aGlzIGZ1bmN0aW9uIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UsIGl0IGlzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIHNwZWNpYWwgIndyYXBwZXIiIGZ1bmN0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBnbHVlIGJldHdlZW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgdGhlIHVuZGVybHlpbmcgQyBmdW5jdGlvbi4gQSB3cmFwcGVyIGZ1bmN0aW9uIG11c3QgZG8gdGhyZWUgdGhpbmdzIDo8cD4KLTxwPgotPHVsPgotPGxpPkdhdGhlciBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSB2YWxpZC4KLTxsaT5DYWxsIHRoZSBDIGZ1bmN0aW9uLgotPGxpPkNvbnZlcnQgdGhlIHJldHVybiB2YWx1ZSBpbnRvIGEgZm9ybSByZWNvZ25pemVkIGJ5IHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UuCi08L3VsPgotPHA+Ci1BcyBhbiBleGFtcGxlLCB0aGUgVGNsIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoZSA8dHQ+ZmFjdCgpPC90dD4gZnVuY3Rpb24gYWJvdmUgZXhhbXBsZSBtaWdodCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZyA6IDxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWludCB3cmFwX2ZhY3QoQ2xpZW50RGF0YSBjbGllbnREYXRhLCBUY2xfSW50ZXJwICppbnRlcnAsCi0JCWludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLQlpbnQgX3Jlc3VsdDsKLQlpbnQgX2FyZzA7Ci0JaWYgKGFyZ2MgIT0gMikgewotCQlpbnRlcnAtJmd0O3Jlc3VsdCA9ICJ3cm9uZyAjIGFyZ3MiOwotCQlyZXR1cm4gVENMX0VSUk9SOwotCX0KLQlfYXJnMCA9IGF0b2koYXJndlsxXSk7Ci0JX3Jlc3VsdCA9IGZhY3QoX2FyZzApOwotCXNwcmludGYoaW50ZXJwLSZndDtyZXN1bHQsIiVkIiwgX3Jlc3VsdCk7Ci0JcmV0dXJuIFRDTF9PSzsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotT25jZSB3ZSBoYXZlIGNyZWF0ZWQgYSB3cmFwcGVyIGZ1bmN0aW9uLCB0aGUgZmluYWwgc3RlcCBpcyB0byB0ZWxsIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYWJvdXQgb3VyIG5ldyBmdW5jdGlvbi4gVGhpcyBpcyB1c3VhbGx5IGRvbmUgaW4gYW4gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSBsYW5ndWFnZSB3aGVuIG91ciBtb2R1bGUgaXMgbG9hZGVkLiBGb3IgZXhhbXBsZSwgYWRkaW5nIHRoZSBhYm92ZSBmdW5jdGlvbiB0byB0aGUgVGNsIGludGVycHJldGVyIHdvdWxkIHJlcXVpcmUgY29kZSBsaWtlIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBXcmFwX0luaXQoVGNsX0ludGVycCAqaW50ZXJwKSB7Ci0JVGNsX0NyZWF0ZUNvbW1hbmQoaW50ZXJwLCAiZmFjdCIsIHdyYXBfZmFjdCwgKENsaWVudERhdGEpIE5VTEwsCi0JCQkJKFRjbF9DbWREZWxldGVQcm9jICopIE5VTEwpOwotCXJldHVybiBUQ0xfT0s7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gZXhlY3V0ZWQsIFRjbCB3aWxsIG5vdyBoYXZlIGEgbmV3IGNvbW1hbmQgY2FsbGVkICI8dHQ+ZmFjdDwvdHQ+IiB0aGF0IHlvdSBjYW4gdXNlIGxpa2UgYW55IG90aGVyIFRjbCBjb21tYW5kLjxwPgotPHA+Ci1XaGlsZSB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgYSBuZXcgZnVuY3Rpb24gdG8gVGNsIGhhcyBiZWVuIGlsbHVzdHJhdGVkLCB0aGUgcHJvY2VkdXJlIGlzIGFsbW9zdCBpZGVudGljYWwgZm9yIFBlcmwgYW5kIFB5dGhvbi4gQm90aCByZXF1aXJlIHNwZWNpYWwgd3JhcHBlcnMgdG8gYmUgd3JpdHRlbiBhbmQgYm90aCBuZWVkIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gY29kZS4gT25seSB0aGUgc3BlY2lmaWMgZGV0YWlscyBhcmUgZGlmZmVyZW50LjxwPgotPGEgbmFtZT0ibjgiPjwvYT48aDM+IFZhcmlhYmxlIGxpbmtpbmc8L2gzPgotVmFyaWFibGUgbGlua2luZyBpcyBhIHNsaWdodGx5IG1vcmUgZGlmZmljdWx0IHByb2JsZW0uIFRoZSBpZGVhIGhlcmUgaXMgdG8gbWFwIGEgQy9DKysgZ2xvYmFsIHZhcmlhYmxlIGludG8gYSB2YXJpYWJsZSBpbiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlICh3ZSBhcmUgImxpbmtpbmciIGEgdmFyaWFibGUgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSB0byBhIEMgdmFyaWFibGUpLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZTo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5kb3VibGUgTXlfdmFyaWFibGUgPSAzLjU7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaXQgZnJvbSBhIHNjcmlwdCBhcyBmb2xsb3dzIChzaG93biBmb3IgUGVybCk6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JGEgPSAkTXlfdmFyaWFibGUgKiAyLjM7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVVuZm9ydHVuYXRlbHksIHRoZSBwcm9jZXNzIG9mIGxpbmtpbmcgdmFyaWFibGVzIGlzIHNvbWV3aGF0IHByb2JsZW1hdGljIGFuZCBub3Qgc3VwcG9ydGVkIGVxdWFsbHkgaW4gYWxsIHNjcmlwdGluZyBsYW5ndWFnZXMuIFRoZXJlIGFyZSB0d28gcHJpbWFyeSBtZXRob2RzIGZvciBhcHByb2FjaGluZyB0aGlzIHByb2JsZW06PHA+Ci08cD4KLTx1bD4KLTxsaT5EaXJlY3QgYWNjZXNzLiBUY2wgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGRpcmVjdGx5IGFjY2Vzc2luZyBDIDx0dD5pbnQ8L3R0PiwgPHR0PmRvdWJsZTwvdHQ+LCBhbmQgPHR0PmNoYXI8L3R0PiAqIGRhdGF0eXBlcyBhcyBUY2wgdmFyaWFibGVzLiBXaGVuZXZlciB0aGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgaW4gYSBUY2wgc2NyaXB0LCB0aGUgaW50ZXJwcmV0ZXIgd2lsbCBkaXJlY3RseSBhY2Nlc3MgdGhlIGNvcnJlc3BvbmRpbmcgQyB2YXJpYWJsZS4gSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yaywgb25lIG11c3QgZmlyc3QgInJlZ2lzdGVyIiB0aGUgQyB2YXJpYWJsZXMgd2l0aCB0aGUgVGNsIGludGVycHJldGVyLiBXaGlsZSB0aGlzIGFwcHJvYWNoIGlzIGVhc3kgdG8gc3VwcG9ydCBpdCBpcyBhbHNvIHNvbWV3aGF0IHByb2JsZW1hdGljLiBOb3QgYWxsIEMgZGF0YXR5cGVzIGFyZSBzdXBwb3J0ZWQsIGFuZCBoYXZpbmcgVGNsIGRpcmVjdGx5IG1hbmlwdWxhdGUgeW91ciB2YXJpYWJsZXMgaW4gaXRzIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBjb3VsZCBiZSBwb3RlbnRpYWxseSBkYW5nZXJvdXMuIAotPGxpPkFjY2VzcyB0aHJvdWdoIGZ1bmN0aW9uIGNhbGxzLiBMYW5ndWFnZXMgc3VjaCBhcyBQZXJsIGFuZCBQeXRob24gY2FuIGFjY2VzcyBnbG9iYWwgdmFyaWFibGVzIHVzaW5nIGEgZnVuY3Rpb24gY2FsbCBtZWNoYW5pc20uIFJhdGhlciB0aGFuIGFsbG93aW5nIGRpcmVjdCBhY2Nlc3MsIHRoZSBpZGVhIGlzIHRvIHByb3ZpZGUgYSBwYWlyIG9mIHNldC9nZXQgZnVuY3Rpb25zIHRoYXQgc2V0IG9yIGdldCB0aGUgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIHZhcmlhYmxlLiBJbiBtYW55IGNhc2VzLCB0aGlzIG1lY2hhbmlzbSBtYXkgYmUgY29tcGxldGVseSBoaWRkZW4uIEZvciBleGFtcGxlLCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgYSBtYWdpY2FsIFBlcmwgdmFyaWFibGUgdGhhdCBsb29rcyBhbmQgZmVlbHMganVzdCBsaWtlIGEgbm9ybWFsIFBlcmwgdmFyaWFibGUsIGJ1dCBpcyByZWFsbHkgbWFwcGVkIGludG8gYSBDIHZhcmlhYmxlIHZpYSBhIHBhaXIgb2Ygc2V0L2dldCBmdW5jdGlvbnMuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHN1cHBvcnQgYWxtb3N0IGFsbCBDIGRhdGF0eXBlcy4gVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IGl0IGludHJvZHVjZXMgYWxvdCBvZiBjb21wbGV4aXR5IHRvIHRoZSB3cmFwcGVyIGNvZGUgYXMgaXQgaXMgbm93IG5lY2Vzc2FyeSB0byB3cml0ZSBhIHBhaXIgb2YgQyBmdW5jdGlvbnMgZm9yIGV2ZXJ5IHNpbmdsZSBnbG9iYWwgdmFyaWFibGUuCi08L3VsPgotPHA+Ci1TV0lHIHN1cHBvcnRzIGJvdGggc3R5bGVzIG9mIHZhcmlhYmxlIGxpbmtpbmcgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBtb3JlIGNvbW1vbi4gSW4gc29tZSBjYXNlcywgYSBoeWJyaWQgYXBwcm9hY2ggaXMgdGFrZW4gKGZvciBleGFtcGxlLCB0aGUgVGNsIG1vZHVsZSB3aWxsIGNyZWF0ZSBhIHBhaXIgb2Ygc2V0L2dldCBmdW5jdGlvbnMgaWYgaXQgZW5jb3VudGVycyBhIGRhdGF0eXBlIHRoYXQgVGNsIGNhbid0IHN1cHBvcnQpLiBGb3J0dW5hdGVseSwgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgcmVsYXRpdmVseSByYXJlIHdoZW4gd29ya2luZyB3aXRoIG1vZHVsYXIgY29kZS48cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgzPiBDb25zdGFudHM8L2gzPgotQ29uc3RhbnRzIGNhbiBlYXNpbHkgYmUgY3JlYXRlZCBieSBzaW1wbHkgY3JlYXRpbmcgYSBuZXcgdmFyaWFibGUgaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZS4gVW5mb3J0dW5hdGVseSwgdGhpcyBjYW4gaGF2ZSB0aGUgdW5kZXNpcmFibGUgc2lkZS1lZmZlY3Qgb2YgbWFraW5nIHRoZSBjb25zdGFudCBub24tY29uc3RhbnQuIEFzIGEgcmVzdWx0LCBhIHNvbWV3aGF0IGJldHRlciAoYWx0aG91Z2ggcGVyaGFwcyBpbmVmZmljaWVudCkgbWV0aG9kIG9mIGNyZWF0aW5nIGNvbnN0YW50cyBpcyB0byBpbnN0YWxsIHRoZW0gYXMgcmVhZC1vbmx5IHZhcmlhYmxlcy4gU1dJRyB0ZW5kcyB0byBwcmVmZXIgdGhpcyBhcHByb2FjaC48cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMz4gU3RydWN0dXJlcyBhbmQgY2xhc3NlczwvaDM+Ci1Nb3N0IHNjcmlwdGluZyBsYW5ndWFnZXMgaGF2ZSB0cm91YmxlIGRpcmVjdGx5IGRlYWxpbmcgd2l0aCBDIHN0cnVjdHVyZXMgYW5kIEMrKyBjbGFzc2VzLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHVzZSBvZiBzdHJ1Y3R1cmVzIGlzIGluaGVyZW50bHkgQyBkZXBlbmRlbnQgYW5kIGl0IGRvZXNuJ3QgYWx3YXlzIG1hcCB3ZWxsIGludG8gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZW52aXJvbm1lbnQuIE1hbnkgb2YgdGhlc2UgcHJvYmxlbXMgYXJlIHNpbXBseSBkdWUgdG8gZGF0YSByZXByZXNlbnRhdGlvbiBpc3N1ZXMgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSB3YXkgQyBhbmQgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbWlnaHQgcmVwcmVzZW50IGludGVnZXJzLCBmbG9hdHMsIHN0cmluZ3MsIGFuZCBzbyBvbi4gT3RoZXIgdGltZXMsIHRoZSBwcm9ibGVtIGlzIGRlZXBlciB0aGFuIHRoYXQtLWZvciBleGFtcGxlLCB3aGF0IGRvZXMgaXQgbWVhbiAoaWYgYW55dGhpbmcpIHRvIHRyeSBhbmQgdXNlIEMrKyBpbmhlcml0YW5jZSBmcm9tIFBlcmw/PHA+Ci08cD4KLURlYWxpbmcgd2l0aCBvYmplY3RzIGlzIGEgdG91Z2ggcHJvYmxlbSB0aGF0IG1hbnkgcGVvcGxlIGFyZSBsb29raW5nIGF0LiBQYWNrYWdlcyBzdWNoIGFzIENPUkJBIGFuZCBJTFUgYXJlIHByaW1hcmlseSBjb25jZXJuZWQgd2l0aCB0aGUgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0cyBpbiBhIHBvcnRhYmxlIG1hbm5lci4gVGhpcyBhbGxvd3Mgb2JqZWN0cyB0byBiZSB1c2VkIGluIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIHVzZWQgd2l0aCBkaWZmZXJlbnQgbGFuZ3VhZ2VzIGFuZCBzbyBvbi4gU1dJRyBpcyBub3QgY29uY2VybmVkIHdpdGggdGhlIHJlcHJlc2VudGF0aW9uIHByb2JsZW0sIGJ1dCByYXRoZXIgdGhlIHByb2JsZW0gb2YgYWNjZXNzaW5nIGFuZCB1c2luZyBDL0MrKyBvYmplY3RzIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGluIGZhY3QgU1dJRyBoYXMgZXZlbiBiZWVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBDT1JCQS1iYXNlZCBzeXN0ZW1zKS48cD4KLTxwPgotVG8gcHJvdmlkZSBhY2Nlc3MsIHRoZSBzaW1wbGlzdCBhcHByb2FjaCBpcyB0byB0cmFuc2Zvcm0gYSBzdHJ1Y3R1cmUgaW50byBhIGNvbGxlY3Rpb24gb2YgYWNjZXNzb3IgZnVuY3Rpb25zLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3RydWN0IFZlY3RvciB7Ci0JVmVjdG9yKCk7Ci0JflZlY3RvcigpOwotCWRvdWJsZSB4LHksejsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWNhbiBiZSB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBmb2xsb3dpbmcgc2V0IG9mIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+VmVjdG9yICpuZXdfVmVjdG9yKCk7Ci12b2lkIGRlbGV0ZV9WZWN0b3IoVmVjdG9yICp2KTsKLWRvdWJsZSBWZWN0b3JfeF9nZXQoVmVjdG9yICp2KTsKLWRvdWJsZSBWZWN0b3JfeV9nZXQoVmVjdG9yICp2KTsKLWRvdWJsZSBWZWN0b3JfeV9nZXQoVmVjdG9yICp2KTsKLXZvaWQgVmVjdG9yX3hfc2V0KFZlY3RvciAqdiwgZG91YmxlIHgpOwotdm9pZCBWZWN0b3JfeV9zZXQoVmVjdG9yICp2LCBkb3VibGUgeSk7Ci12b2lkIFZlY3Rvcl96X3NldChWZWN0b3IgKnYsIGRvdWJsZSB6KTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBhY2Nlc3NlZCBpbiBUY2wsIHRoZSBmdW5jdGlvbnMgY291bGQgYmUgdXNlZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCB2IFtuZXdfVmVjdG9yXQotJSBWZWN0b3JfeF9zZXQgJHYgMy41Ci0lIFZlY3Rvcl95X2dldCAkdgotJSBkZWxldGVfVmVjdG9yICR2Ci0lIC4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgYWNjZXNzb3IgZnVuY3Rpb25zIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGFjY2Vzc2luZyBhIHJlYWwgQy9DKysgb2JqZWN0LiBTaW5jZSBhbGwgYWNjZXNzIG9jY3VycyB0aG91Z2ggdGhlc2UgZnVuY3Rpb24gY2FsbHMsIFRjbCBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBvZiBhIDx0dD5WZWN0b3I8L3R0Pi4gVGhpcyBzaW1wbGlmaWVzIG1hdHRlcnMgY29uc2lkZXJhYmx5IGFuZCBzdGVwcyBhcm91bmQgbWFueSBvZiB0aGUgcHJvYmxlbXMgYXNzb2NpYXRlZCB3aXRoIG9iamVjdHMtLWluIGZhY3QsIGl0IGxldHMgdGhlIEMvQysrIGNvbXBpbGVyIGRvIG1vc3Qgb2YgdGhlIHdvcmsuPHA+Ci08YSBuYW1lPSJuMTEiPjwvYT48aDM+IFNoYWRvdyBjbGFzc2VzPC9oMz4KLUFzIGl0IHR1cm5zIG91dCwgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBsb3ctbGV2ZWwgYWNjZXNzb3IgZnVuY3Rpb25zIGFib3ZlIHRvIGNyZWF0ZSBzb21ldGhpbmcga25vd24gYXMgYSAic2hhZG93IiBjbGFzcy4gSW4gYSBudXRzaGVsbCwgYSAic2hhZG93IGNsYXNzIiBpcyBhIGZ1bm55IGtpbmQgb2Ygb2JqZWN0IHRoYXQgZ2V0cyBjcmVhdGVkIGluIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHRvIGFjY2VzcyBhIEMvQysrIGNsYXNzIChvciBzdHJ1Y3QpIGluIGEgd2F5IHRoYXQgbG9va3MgbGlrZSB0aGUgb3JpZ2luYWwgc3RydWN0dXJlICh0aGF0IGlzLCBpdCAic2hhZG93cyIgdGhlIHJlYWwgQysrIGNsYXNzKS4gT2YgY291cnNlLCBpbiByZWFsaXR5LCBpdCdzIGp1c3QgYSBzbGljayB3YXkgb2YgYWNjZXNzaW5nIG9iamVjdHMgdGhhdCBpcyBtb3JlIG5hdHVyYWwgdG8gbW9zdCBwcm9ncmFtbWVycy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgQyBkZWZpbml0aW9uIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1jbGFzcyBWZWN0b3IgewotcHVibGljOgotCVZlY3RvcigpOwotCX5WZWN0b3IoKTsKLQlkb3VibGUgeCx5LHo7Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BIHNoYWRvdyBjbGFzc2luZyBtZWNoYW5pc20gd291bGQgYWxsb3cgeW91IHRvIGFjY2VzcyB0aGUgc3RydWN0dXJlIGluIGEgbmF0dXJhbCBtYW5uZXIuIEZvciBleGFtcGxlLCBpbiBQeXRob24sIHlvdSBtaWdodCBkbyB0aGUgZm9sbG93aW5nLDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyB2ID0gVmVjdG9yKCkKLSZndDsmZ3Q7Jmd0OyB2LnggPSAzCi0mZ3Q7Jmd0OyZndDsgdi55ID0gNAotJmd0OyZndDsmZ3Q7IHYueiA9IC0xMwotJmd0OyZndDsmZ3Q7IC4uLgotJmd0OyZndDsmZ3Q7IGRlbCB2Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLXdoaWxlIGluIFBlcmw1LCBpdCBtaWdodCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJHYgPSBuZXcgVmVjdG9yOwotJHYtJmd0O3t4fSA9IDM7Ci0kdi0mZ3Q7e3l9ID0gNDsKLSR2LSZndDt7en0gPSAtMTM7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWFuZCBpbiBUY2wgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLVZlY3RvciB2Ci12IGNvbmZpZ3VyZSAteCAzIC15IDQgLXogMTMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdHdvIG9iamVjdHMgYXJlIGF0IHJlYWxseSB3b3JrLS1vbmUgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSwgYW5kIGFuIHVuZGVybHlpbmcgQy9DKysgb2JqZWN0LiBPcGVyYXRpb25zIGFmZmVjdCBib3RoIG9iamVjdHMgZXF1YWxseSBhbmQgZm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIGl0IGFwcGVhcnMgYXMgaWYgeW91IGFyZSBzaW1wbHkgbWFuaXB1bGF0aW5nIGEgQy9DKysgb2JqZWN0LiBIb3dldmVyLCB0aGUgaW50cm9kdWN0aW9uIG9mIGFkZGl0aW9uYWwgIm9iamVjdHMiIGNhbiBhbHNvIHByb2R1Y2UgZXhjZXNzaXZlIG92ZXJoZWFkIGlmIHdvcmtpbmcgd2l0aCBodWdlIG51bWJlcnMgb2Ygb2JqZWN0cyBpbiB0aGlzIG1hbm5lci4gRGVzcGl0ZSB0aGlzLCBzaGFkb3cgY2xhc3NlcyB0dXJuIG91dCB0byBiZSBleHRyZW1lbHkgdXNlZnVsLiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGlzIGNvdmVyZWQgbGF0ZXIuPHA+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gQnVpbGRpbmcgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnM8L2gyPgotVGhlIGZpbmFsIHN0ZXAgaW4gdXNpbmcgYSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2l0aCB5b3VyIEMvQysrIGFwcGxpY2F0aW9uIGlzIGFkZGluZyB5b3VyIGV4dGVuc2lvbnMgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBpdHNlbGYuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxtb3N0IGFsd2F5cyBzZWVtcyB0byBiZSB0aGUgbW9zdCBkaWZmaWN1bHQgcGFydC4gVGhlcmUgYXJlIHR3byBmdW5kYW1lbnRhbCBhcHByb2FjaGVzIGZvciBkb2luZyB0aGlzLiBGaXJzdCwgeW91IGNhbiBidWlsZCBhbiBlbnRpcmVseSBuZXcgdmVyc2lvbiBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVycHJldGVyIHdpdGggeW91ciBleHRlbnNpb25zIGJ1aWx0IGludG8gaXQuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gYnVpbGQgYSBzaGFyZWQgbGlicmFyeSBhbmQgZHluYW1pY2FsbHkgbG9hZCBpdCBpbnRvIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYXMgbmVlZGVkLiBCb3RoIGFwcHJvYWNocyBhcmUgZGVzY3JpYmVkIGJlbG93IDo8cD4KLTxhIG5hbWU9Im4xMiI+PC9hPjxoMz4gU3RhdGljIGxpbmtpbmc8L2gzPgotV2l0aCBzdGF0aWMgbGlua2luZyB5b3UgcmVidWlsZCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVycHJldGVyIHdpdGggZXh0ZW5zaW9ucy4gVGhlIHByb2Nlc3MgdXN1YWxseSBpbnZvbHZlcyBjb21waWxpbmcgYSBzaG9ydCBtYWluIHByb2dyYW0gdGhhdCBhZGRzIHlvdXIgY3VzdG9taXplZCBjb21tYW5kcyB0byB0aGUgbGFuZ3VhZ2UgYW5kIHN0YXJ0cyB0aGUgaW50ZXJwcmV0ZXIuIFlvdSB0aGVuIGxpbmsgeW91ciBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5IHRvIHByb2R1Y2UgYSBuZXcgZXhlY3V0YWJsZS4gV2hlbiB1c2luZyBzdGF0aWMgbGlua2luZywgU1dJRyB3aWxsIHByb3ZpZGUgYSA8dHQ+bWFpbigpPC90dD4gcHJvZ3JhbSBmb3IgeW91IHNvIHlvdSB1c3VhbGx5IGp1c3QgaGF2ZSB0byBjb21waWxlIGFzIGZvbGxvd3MgKHNob3duIGZvciBUY2wpIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgc3dpZyAtdGNsIC1sdGNsc2guaSBleGFtcGxlLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFRjbC4KLXVuaXggJmd0OyBnY2MgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlIFwKLQktTC91c3IvbG9jYWwvbGliIC1sdGNsIC1sbSAtbyBteV90Y2xzaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dHQ+bXlfdGNsc2g8L3R0PiBpcyBhIG5ldyBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIFRjbCBpbnRlcHJldGVyLiA8dHQ+bXlfdGNsc2g8L3R0PiB3aWxsIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGNsc2ggZXhjZXB0IHdpdGggeW91ciBuZXcgY29tbWFuZHMgYWRkZWQgdG8gaXQuIFdoZW4gaW52b2tpbmcgU1dJRywgdGhlIDx0dD4tbHRjbHNoLmk8L3R0PiBvcHRpb24gaW5jbHVkZXMgc3VwcG9ydCBjb2RlIG5lZWRlZCB0byByZWJ1aWxkIHRoZSA8dHQ+dGNsc2g8L3R0PiBhcHBsaWNhdGlvbi4gPHA+Ci08cD4KLVZpcnR1YWxseSBhbGwgbWFjaGluZXMgc3VwcG9ydCBzdGF0aWMgbGlua2luZyBhbmQgaW4gc29tZSBjYXNlcywgaXQgbWF5IGJlIHRoZSBvbmx5IHdheSB0byBidWlsZCBhbiBleHRlbnNpb24uIFRoZSBkb3duc2lkZSB0byBzdGF0aWMgbGlua2luZyBpcyB0aGF0IHlvdSBjYW4gZW5kIHVwIHdpdGggYSBsYXJnZSBleGVjdXRhYmxlLiBJbiBhIHZlcnkgbGFyZ2Ugc3lzdGVtLCB0aGUgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSBtYXkgYmUgcHJvaGliaXRpdmVseSBsYXJnZS48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBTaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljIGxvYWRpbmc8L2gyPgotQW4gYWx0ZXJuYXRpdmUgdG8gc3RhdGljIGxpbmtpbmcgaXMgdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeS4gV2l0aCB0aGlzIGFwcHJvYWNoLCB5b3UgYnVpbGQgYSBzaGFyZWQgb2JqZWN0IGZpbGUgY29udGFpbmluZyBvbmx5IHRoZSBjb2RlIHJlbGF0ZWQgdG8geW91ciBtb2R1bGUgKG9uIFdpbmRvd3MsIHRoaXMgaXMgdGhlIHNhbWUgYXMgYnVpbGRpbmcgYSBETEwpLiBVbmZvcnR1bmF0ZWx5IHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIHRoZXNlIG1vZHVsZXMgdmFyaWVzIG9uIGV2ZXJ5IHNpbmdsZSBtYWNoaW5lLCBidXQgdGhlIHByb2NlZHVyZSBmb3IgYSBmZXcgY29tbW9uIG1hY2hpbmVzIGlzIHNob3cgYmVsb3cgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgQnVpbGQgYSBzaGFyZWQgbGlicmFyeSBmb3IgU29sYXJpcwotZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZQotbGQgLUcgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28KLQotIyBCdWlsZCBhIHNoYXJlZCBsaWJyYXJ5IGZvciBJcml4Ci1nY2MgLWMgZXhhbXBsZS5jIGV4YW1wbGVfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlCi1sZCAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvCi0KLSMgQnVpbGQgYSBzaGFyZWQgbGlicmFyeSBmb3IgTGludXgKLWdjYyAtZnBpYyAtYyBleGFtcGxlLmMgZXhhbXBsZV93cmFwLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUKLWdjYyAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHVzZSB5b3VyIHNoYXJlZCBsaWJyYXJ5LCB5b3Ugc2ltcGx5IHVzZSB0aGUgY29ycmVzcG9uZGluZyBjb21tYW5kIGluIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGxvYWQsIGltcG9ydCwgdXNlLCBldGMuLi4pLiBUaGlzIHdpbGwgaW1wb3J0IHlvdXIgbW9kdWxlIGFuZCBhbGxvdyB5b3UgdG8gc3RhcnQgdXNpbmcgaXQuIDxwPgotPHA+Ci1XaGVuIHdvcmtpbmcgd2l0aCBDKysgY29kZXMsIHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMgaXMgbW9yZSBkaWZmaWN1bHQtLXByaW1hcmlseSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBDKysgbW9kdWxlcyBtYXkgbmVlZCBhZGRpdGlvbmFsIGNvZGUgaW4gb3JkZXIgdG8gb3BlcmF0ZSBjb3JyZWN0bHkuIE9uIG1vc3QgbWFjaGluZXMsIHlvdSBjYW4gYnVpbGQgYSBzaGFyZWQgQysrIG1vZHVsZSBieSBmb2xsb3dpbmcgdGhlIGFib3ZlIHByb2NlZHVyZXMsIGJ1dCBjaGFuZ2luZyB0aGUgbGluayBsaW5lIHRvIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmMrKyAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBhZHZhbnRhZ2VzIHRvIGR5bmFtaWMgbG9hZGluZyBpcyB0aGF0IHlvdSBjYW4gdXNlIG1vZHVsZXMgYXMgdGhleSBhcmUgbmVlZGVkIGFuZCB0aGV5IGNhbiBiZSBsb2FkZWQgb24gdGhlIGZseS4gVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IGR5bmFtaWMgbG9hZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBtYWNoaW5lcyAoYWx0aG91Z2ggc3VwcG9ydCBpcyBpbXByb3ZpbmcpLiBUaGUgY29tcGlsYXRpb24gcHJvY2VzcyBhbHNvIHRlbmRzIHRvIGJlIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB3aGF0IG1pZ2h0IGJlIHVzZWQgZm9yIGEgdHlwaWNhbCBDL0MrKyBwcm9ncmFtLjxwPgotPGEgbmFtZT0ibjEzIj48L2E+PGgzPiBMaW5raW5nIHdpdGggc2hhcmVkIGxpYnJhcmllczwvaDM+Ci1XaGVuIGJ1aWxkaW5nIGV4dGVuc2lvbnMgYXMgc2hhcmVkIGxpYnJhcmllcywgaXQgaXMgbm90IHVuY29tbW9uIGZvciB5b3VyIGV4dGVuc2lvbiB0byByZWx5IHVwb24gb3RoZXIgc2hhcmVkIGxpYnJhcmllcyBvbiB5b3VyIG1hY2hpbmUuIEluIG9yZGVyIGZvciB0aGUgZXh0ZW5zaW9uIHRvIHdvcmssIGl0IG5lZWRzIHRvIGJlIGFibGUgdG8gZmluZCBhbGwgb2YgdGhlc2UgbGlicmFyaWVzIGF0IHJ1bi10aW1lLiBPdGhlcndpc2UsIHlvdSBtYXkgZ2V0IGFuIGVycm9yIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Jmd0OyZndDsmZ3Q7IGltcG9ydCBncmFwaAotVHJhY2ViYWNrIChpbm5lcm1vc3QgbGFzdCk6Ci0gIEZpbGUgIiZsdDtzdGRpbiZndDsiLCBsaW5lIDEsIGluID8KLSAgRmlsZSAiL2hvbWUvc2NpL2RhdGExL2JlYXpsZXkvZ3JhcGgvZ3JhcGgucHkiLCBsaW5lIDIsIGluID8KLSAgICBpbXBvcnQgZ3JhcGhjCi1JbXBvcnRFcnJvcjogIDExMDE6L2hvbWUvc2NpL2RhdGExL2JlYXpsZXkvYmluL3B5dGhvbjogcmxkOiBGYXRhbCBFcnJvcjogY2Fubm90IAotc3VjY2Vzc2Z1bGx5IG1hcCBzb25hbWUgJ2xpYmdyYXBoLnNvJyB1bmRlciBhbnkgb2YgdGhlIGZpbGVuYW1lcyAvdXNyL2xpYi9saWJncmFwaC5zbzovCi1saWIvbGliZ3JhcGguc286L2xpYi9jbXBscnMvY2MvbGliZ3JhcGguc286L3Vzci9saWIvY21wbHJzL2NjL2xpYmdyYXBoLnNvOgotJmd0OyZndDsmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoYXQgdGhpcyBlcnJvciBtZWFucyBpcyB0aGF0IHRoZSBleHRlbnNpb24gbW9kdWxlIGNyZWF0ZWQgYnkgU1dJRyBkZXBlbmRzIHVwb24gYSBzaGFyZWQgbGlicmFyeSBjYWxsZWQgIjx0dD5saWJncmFwaC5zbzwvdHQ+IiB0aGF0IHRoZSBzeXN0ZW0gd2FzIHVuYWJsZSB0byBsb2NhdGUuIFRvIGZpeCB0aGlzIHByb2JsZW0sIHRoZXJlIGFyZSBhIGZldyBhcHByb2FjaGVzIHlvdSBjYW4gdGFrZS48cD4KLTxwPgotPHVsPgotPGxpPlNldCB0aGUgVU5JWCBlbnZpcm9ubWVudCB2YXJpYWJsZSA8dHQ+TERfTElCUkFSWV9QQVRIPC90dD4gdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2NhdGVkIGJlZm9yZSBydW5uaW5nIFB5dGhvbi4gCi08bGk+TGluayB5b3VyIGV4dGVuc2lvbiBhbmQgZXhwbGljaXRseSB0ZWxsIHRoZSBsaW5rZXIgd2hlcmUgdGhlIHJlcXVpcmVkIGxpYnJhcmllcyBhcmUgbG9jYXRlZC4gT2Z0ZW4gdGltZXMsIHRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIHNwZWNpYWwgbGlua2VyIGZsYWcgc3VjaCBhcyA8dHQ+LVI8L3R0PiwgPHR0Pi1ycGF0aDwvdHQ+LCBldGMuLi4gVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgaW4gYSBzdGFuZGFyZCBtYW5uZXIgc28gcmVhZCB0aGUgbWFuIHBhZ2VzIGZvciB5b3VyIGxpbmtlciB0byBmaW5kIG91dCBtb3JlIGFib3V0IGhvdyB0byBzZXQgdGhlIHNlYXJjaCBwYXRoIGZvciBzaGFyZWQgbGlicmFyaWVzLgotPGxpPlB1dCBzaGFyZWQgbGlicmFyaWVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZXhlY3V0YWJsZS4gVGhpcyB0ZWNobmlxdWUgaXMgc29tZXRpbWVzIHJlcXVpcmVkIGZvciBjb3JyZWN0IG9wZXJhdGlvbiBvbiBub24tVW5peCBwbGF0Zm9ybXMuCi08L3VsPgotPHA+Ci1XaXRoIGEgbGl0dGxlIHBhdGllbmNlIGFuZCBhZnRlciBzb21lIHBsYXlpbmcgYXJvdW5kLCB5b3UgY2FuIHVzdWFsbHkgZ2V0IHRoaW5ncyB0byB3b3JrLiBBZnRlcndhcmRzLCBidWlsZGluZyBleHRlbnNpb25zIGJlY29tZXMgYWxvdCBlYXNpZXIuPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5TV0lHIDEuMSAtIExhc3QgTW9kaWZpZWQgOiBNb24gQXVnICA0IDEwOjQ2OjUwIDE5OTc8L2FkZHJlc3M+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML1RjbC5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9UY2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljMzE3My4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML1RjbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA0OCArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlNXSUcgYW5kIFRjbDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgotPGEgbmFtZT0ibjAiPjwvYT48aDE+MTAgU1dJRyBhbmQgVGNsPC9oMT48cD48dWw+Ci08bGk+IDxhIGhyZWY9IiNuMSI+UHJlbGltaW5hcmllczwvYT4KLTxsaT4gPGEgaHJlZj0iI24yIj5CdWlsZGluZyBUY2wvVGsgRXh0ZW5zaW9ucyB1bmRlciBXaW5kb3dzIDk1L05UPC9hPgotPGxpPiA8YSBocmVmPSIjbjMiPkJhc2ljIFRjbCBJbnRlcmZhY2U8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+VGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2U8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNSI+QWJvdXQgdGhlIGV4YW1wbGVzPC9hPgotPGxpPiA8YSBocmVmPSIjbjYiPkJpbmFyeSB0cmVlcyBpbiBUY2w8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNyI+QnVpbGRpbmcgQy9DKysgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggVGs8L2E+Ci08bGk+IDxhIGhyZWY9IiNuOCI+QWNjZXNzaW5nIGFycmF5czwvYT4KLTxsaT4gPGEgaHJlZj0iI245Ij5CdWlsZGluZyBhIHNpbXBsZSBPcGVuR0wgbW9kdWxlPC9hPgotPGxpPiA8YSBocmVmPSIjbjEwIj5FeGNlcHRpb24gaGFuZGxpbmc8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTEiPlR5cGVtYXBzPC9hPgotPGxpPiA8YSBocmVmPSIjbjEyIj5Db25maWd1cmF0aW9uIG1hbmFnZW1lbnQgd2l0aCBTV0lHPC9hPgotPGxpPiA8YSBocmVmPSIjbjEzIj5CdWlsZGluZyBuZXcga2luZHMgb2YgVGNsIGludGVyZmFjZXMgKGluIFRjbCk8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTQiPkV4dGVuZGluZyB0aGUgVGNsIE5ldHNjYXBlIFBsdWdpbjwvYT4KLTxsaT4gPGEgaHJlZj0iI24xNSI+VGNsOC4wIGZlYXR1cmVzPC9hPgotPC91bD4KLQotVGhpcyBjaGFwdGVyIGRpc2N1c3NlcyBTV0lHJ3Mgc3VwcG9ydCBvZiBUY2wuIFNXSUcgc3VwcG9ydHMgVGNsIHZlcnNpb25zIDcuMyBhbmQgbmV3ZXIsIGluY2x1ZGluZyBUY2wgOC4wLiBUayAzLjYgYW5kIG5ld2VyIGNhbiBhbHNvIGJlIHVzZWQuIEhvd2V2ZXIsIGZvciB0aGUgYmVzdCByZXN1bHRzIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgVGNsIDcuNS9UazQuMSBvciBsYXRlci48cD4KLTxhIG5hbWU9Im4xIj48L2E+PGgyPiBQcmVsaW1pbmFyaWVzPC9oMj4KLVlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCBUY2wvVGsgb24geW91ciBzeXN0ZW0gaWYgeW91IGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiBJZiB5b3UgYXJlIHVzaW5nIFRjbCA3LjUgb3IgbmV3ZXIsIHlvdSBzaG91bGQgYWxzbyBkZXRlcm1pbmUgaWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgZHluYW1pYyBsb2FkaW5nIGFuZCBzaGFyZWQgbGlicmFyaWVzLiBTV0lHIHdpbGwgd29yayB3aXRoIG9yIHdpdGhvdXQgdGhpcywgYnV0IHRoZSBjb21waWxhdGlvbiBwcm9jZXNzIHZhcmllcy48cD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gUnVubmluZyBTV0lHPC9oMz4KLVRvIGJ1aWxkIGEgVGNsIG1vZHVsZSwgcnVuIHN3aWcgdXNpbmcgdGhlIDx0dD4tdGNsPC90dD4gb3B0aW9uIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN3aWcgLXRjbCBleGFtcGxlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyB3aWxsIHByb2R1Y2UgMiBmaWxlcy4gVGhlIGZpcnN0IGZpbGUsIDx0dD5leGFtcGxlX3dyYXAuYywgPC90dD5jb250YWlucyBhbGwgb2YgdGhlIEMgY29kZSBuZWVkZWQgdG8gYnVpbGQgeW91ciBUY2wgbW9kdWxlLiBUaGUgc2Vjb25kIGZpbGUgY29udGFpbnMgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIGFuZCBtYXkgYmUgbmFtZWQgPHR0PmV4YW1wbGVfd3JhcC5kb2M8L3R0PiwgPHR0PmV4YW1wbGVfd3JhcC5odG1sPC90dD4sIDx0dD5leGFtcGxlX3dyYXAudGV4PC90dD4sIGV0Yy4uLiBUbyBidWlsZCBhIFRjbCBleHRlbnNpb24geW91IHdpbGwgbmVlZCB0byBjb21waWxlIHRoZSA8dHQ+ZXhhbXBsZV93cmFwLmM8L3R0PiBmaWxlIGFuZCBsaW5rIGl0IHdpdGggdGhlIHJlc3Qgb2YgeW91ciBwcm9ncmFtIChhbmQgcG9zc2libHkgVGNsIGl0c2VsZikuPHA+Ci08YSBuYW1lPSJuMTciPjwvYT48aDM+IEFkZGl0aW9uYWwgU1dJRyBvcHRpb25zPC9oMz4KLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYWxzbyBhdmFpbGFibGUgd2l0aCB0aGUgVGNsIG1vZHVsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LXRjbDggICAgICAgICBQcm9kdWNlIFRjbDguMCBuYXRpdmUgd3JhcHBlcnMgKHVzZSBpbiBwbGFjZSBvZiAtdGNsKS4KLS1tb2R1bGUgICAgICAgU2V0IHRoZSBtb2R1bGUgbmFtZS4KLS1uYW1lc3BhY2UgICAgVXNlIFtpbmNyIFRjbF0gbmFtZXNwYWNlcy4KLS1wcmVmaXggcGtnICAgU2V0IGEgcGFja2FnZSBwcmVmaXggb2YgYHBrZycuIFRoaXMgcHJlZml4IHdpbGwgYmUKLSAgICAgICAgICAgICAgYXR0YWNoZWQgdG8gZWFjaCBmdW5jdGlvbi4KLS1odGNsIHRjbC5oICAgU2V0IG5hbWUgb2YgVGNsIGhlYWRlciBmaWxlLgotLWh0ayB0ay5oICAgICBTZXQgbmFtZSBvZiBUayBoZWFkZXIgZmlsZS4KLS1wbHVnaW4gICAgICAgR2VuZXJhdGUgYWRkaXRpb25hbCBjb2RlIGZvciB0aGUgbmV0c2NhcGUgcGx1Z2luLgotLW5vb2JqZWN0ICAgICBPbWl0IG9iamVjdCBvcmllbnRlZCBleHRlbnNpb25zIChjb21wYXRpYmlsaXR5IHdpdGggU1dJRyAxLjApCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU1hbnkgb2YgdGhlc2Ugb3B0aW9ucyB3aWxsIGJlIGRlc2NyaWJlZCBsYXRlci48cD4KLTxhIG5hbWU9Im4xOCI+PC9hPjxoMz4gR2V0dGluZyB0aGUgcmlnaHQgaGVhZGVyIGZpbGVzIGFuZCBsaWJyYXJpZXM8L2gzPgotSW4gb3JkZXIgdG8gY29tcGlsZSBUY2wvVGsgZXh0ZW5zaW9ucywgeW91IHdpbGwgbmVlZCB0byBsb2NhdGUgdGhlICI8dHQ+dGNsLmg8L3R0PiIgYW5kICI8dHQ+dGsuaDwvdHQ+IiBoZWFkZXIgZmlsZXMuIFRoZXNlIGFyZSB1c3VhbGx5IGxvY2F0ZWQgaW4gPHR0Pi91c3IvbG9jYWwvaW5jbHVkZTwvdHQ+LiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gbG9jYXRlIHRoZSBUY2wvVGsgbGlicmFyaWVzIDx0dD5saWJ0Y2wuYTwvdHQ+IGFuZCA8dHQ+bGlidGsuYTwvdHQ+LiBUaGVzZSBhcmUgdXN1YWxseSBsb2NhdGVkIGluIDx0dD4vdXNyL2xvY2FsL2xpYjwvdHQ+LjxwPgotV2hlbiBsb2NhdGluZyB0aGUgcmlnaHQgaGVhZGVyIGFuZCBsaWJyYXJpZXMgZmlsZXMsIGRvdWJsZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGZpbGVzIGFyZSB0aGUgY29ycmVjdCB2ZXJzaW9uIGFuZCBmb3JtIGEgbWF0Y2hpbmcgcGFpci4gU1dJRyB3b3JrcyB3aXRoIHRoZSBmb2xsb3dpbmcgVGNsL1RrIHJlbGVhc2VzLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPlRjbCA3LjMsIFRrIDMuNgotVGNsIDcuNCwgVGsgNC4wCi1UY2wgNy41LCBUayA0LjEKLVRjbCA3LjYsIFRrIDQuMgotVGNsIDguMGEyLCBUayA4LjBhMgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1EbyBub3QgbWl4IHZlcnNpb25zLiBBbHRob3VnaCB0aGUgY29kZSBtaWdodCBjb21waWxlIGlmIHlvdSBkbywgaXQgd2lsbCB1c3VhbGx5IGNvcmUgZHVtcCBteXN0ZXJpb3VzbHkuIEJ5IGRlZmF1bHQsIFNXSUcgbG9va3MgZm9yIHRoZSBoZWFkZXIgZmlsZXMgIjx0dD50Y2wuaDwvdHQ+IiBhbmQgIjx0dD50ay5oPC90dD4iLCBidXQgeW91ciBpbnN0YWxsZWQgdmVyc2lvbiBvZiBUY2wvVGsgbWF5IHVzZSBzbGlnaHRseSBkaWZmZXJlbnQgbmFtZXMgc3VjaCBhcyAiPHR0PnRjbDcuNS5oPC90dD4iIGFuZCAiPHR0PnRrNC4xLmg8L3R0PiIuIElmIHlvdSBuZWVkIHRvIHVzZSBkaWZmZXJlbnQgaGVhZGVyIGZpbGVzLCB5b3UgY2FuIHVzZSB0aGUgPHR0Pi1odGNsPC90dD4gYW5kIDx0dD4taHRrPC90dD4gb3B0aW9ucyBhcyBpbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtdGNsIC1odGNsIHRjbDcuNS5oIC1odGsgdGs0LjEuaCBleGFtcGxlLmkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSWYgeW91IGFyZSBpbnN0YWxsaW5nIFRjbC9UayB5b3Vyc2VsZiwgaXQgaXMgb2Z0ZW4gZWFzaWVyIHRvIHNldCB1cCBhIHN5bWJvbGljIGxpbmtzIGJldHdlZW4gPHR0PnRjbC5oPC90dD4gYW5kIHRoZSBoZWFkZXIgZmlsZXMgZm9yIHRoZSBsYXRlc3QgaW5zdGFsbGVkIHZlcnNpb24uICBZb3UgbWlnaHQgYWxzbyBiZSBhYmxlIHRvIG1ha2Ugc3ltYm9saWMgbGlua3MgdG8gdGhlIGNvcnJlY3QgZmlsZXMgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeS48cD4KLTxhIG5hbWU9Im4xOSI+PC9hPjxoMz4gQ29tcGlsaW5nIGEgZHluYW1pYyBtb2R1bGUgKFVuaXgpPC9oMz4KLVRvIGNvbXBpbGUgYSBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdG8gY29tcGlsZSB5b3VyIFNXSUcgZXh0ZW5zaW9uIGludG8gYSBzaGFyZWQgbGlicmFyeS4gVGhpcyB1c3VhbGx5IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgKHNob3duIGZvciBMaW51eCkuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dW5peCAmZ3Q7IHN3aWcgLXRjbCBleGFtcGxlLmkKLXVuaXggJmd0OyBnY2MgLWZwaWMgZXhhbXBsZV93cmFwLmMgZXhhbXBsZS5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlCi11bml4ICZndDsgZ2NjIC1zaGFyZWQgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28gCQkJCQkJCQkJIyBMaW51eAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1VbmZvcnR1bmF0ZWx5LCB0aGUgcHJvY2VzcyBvZiBidWlsZGluZyBvZiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzIHZhcmllcyBvbiBldmVyeSBzaW5nbGUgbWFjaGluZS4gU1dJRyB3aWxsIHRyeSB0byBndWVzcyB3aGVuIHlvdSBydW4gY29uZmlndXJlLCBidXQgaXQgaXNuJ3QgYWx3YXlzIHN1Y2Nlc3NmdWwuIEl0J3MgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIHJlYWQgdGhlIG1hbiBwYWdlcyBvbiB0aGUgY29tcGlsZXIvbGlua2VyIHRvIGZpbmQgb3V0IG1vcmUgaW5mb3JtYXRpb24uPHA+Ci08YSBuYW1lPSJuMjAiPjwvYT48aDM+IFVzaW5nIGEgZHluYW1pYyBtb2R1bGU8L2gzPgotVG8gdXNlIGEgZHluYW1pYyBtb2R1bGUsIHlvdSB3aWxsIG5lZWQgdG8gbG9hZCBpdCB1c2luZyB0aGUgVGNsIGxvYWQgY29tbWFuZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5sb2FkIC4vZXhhbXBsZS5zbyBleGFtcGxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgd2hpbGUgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlICh0aGUgc2FtZSBhcyB3aGF0IHlvdSBzcGVjaWZpZWQgd2l0aCB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUpLiBBcyBhbHRlcm5hdGl2ZSwgeW91IGNhbiB0dXJuIHlvdXIgbW9kdWxlIGludG8gYSBUY2wgcGFja2FnZS4gICBTZWUgdGhlIHNlY3Rpb24gb24gY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IGF0IHRoZSBlbmQgb2YgdGhpcyBjaGFwdGVyIGZvciBkZXRhaWxzLjxwPgotPGEgbmFtZT0ibjIxIj48L2E+PGgzPiBTdGF0aWMgbGlua2luZzwvaDM+Ci1JZiB5b3VyIG1hY2hpbmUgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIGxvYWRpbmcgb3IgeW91J3ZlIHRyaWVkIHRvIHVzZSBpdCB3aXRob3V0IHN1Y2Nlc3MsIHlvdSBjYW4gYnVpbGQgbmV3IHZlcnNpb25zIG9mIDx0dD50Y2xzaDwvdHQ+ICh0aGUgVGNsIHNoZWxsKSBvciA8dHQ+d2lzaDwvdHQ+IChUY2wvVGsgc2hlbGwpIHdpdGggeW91ciBleHRlbnNpb25zIGFkZGVkLiBUbyBkbyB0aGlzLCB1c2UgU1dJRydzIDx0dD4laW5jbHVkZTwvdHQ+IGRpcmVjdGl2ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIG15bW9kdWxlCi0uLi4gZGVjbGFyYXRpb25zIC4uLgotCi0laW5jbHVkZSB0Y2xzaC5pICAgICAvLyBTdXBwb3J0IGNvZGUgZm9yIHJlYnVpbGRpbmcgdGNsc2gKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVG8gcmVidWlsZCB0Y2xzaCwgeW91IHdpbGwgbmVlZCB0byBjb21waWxlIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC10Y2wgZXhhbXBsZS5pCi11bml4ICZndDsgZ2NjIGV4YW1wbGVfd3JhcC5jIGV4YW1wbGUuYyAtSS91c3IvbG9jYWwvaW5jbHVkZSAtTC91c3IvbG9jYWwvbGliIC1sdGNsIC1sZGwgXAotCS1sbSAtbyBteV90Y2xzaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSBTV0lHJ3MgPHR0Pi1sPC90dD4gb3B0aW9uIHRvIGFkZCB0aGUgdGNsc2guaSBsaWJyYXJ5IGZpbGUgd2l0aG91dCBtb2RpZnlpbmcgdGhlIGludGVyZmFjZSBmaWxlLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC10Y2wgLWx0Y2xzaC5pIGV4YW1wbGUuaQotdW5peCAmZ3Q7IGdjYyBleGFtcGxlX3dyYXAuYyBleGFtcGxlLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL2xpYiAtbHRjbCAtbGRsIFwKLQktbG0gLW8gbXlfdGNsc2gKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIDx0dD4tbGRsPC90dD4gb3B0aW9uIHdpbGwgYmUgcmVxdWlyZWQgaWYgeW91ciBUY2wvVGsgc3VwcG9ydHMgZHluYW1pYyBsb2FkaW5nLiBPbiBzb21lIG1hY2hpbmVzIChtb3N0IG5vdGFibHkgU29sYXJpcyksaXQgd2lsbCBhbHNvIGJlIG5lY2Vzc2FyeSB0byBhZGQgPHR0Pi1sc29ja2V0IC1sbnNsPC90dD4gdG8gdGhlIGNvbXBpbGUgbGluZS4gVGhpcyB3aWxsIHByb2R1Y2UgYSBuZXcgdmVyc2lvbiBvZiA8dHQ+dGNsc2g8L3R0PiB0aGF0IGlzIGlkZW50aWNhbCB0byB0aGUgb2xkIG9uZSwgYnV0IHdpdGggeW91ciBleHRlbnNpb25zIGFkZGVkLjxwPgotPHA+Ci1JZiB5b3UgYXJlIHVzaW5nIFRrLCB5b3Ugd2lsbCB3YW50IHRvIHJlYnVpbGQgdGhlIDx0dD53aXNoPC90dD4gZXhlY3V0YWJsZSBpbnN0ZWFkLiBUaGlzIGNhbiBiZSBkb25lIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbXltb2R1bGUKLS4uLiBkZWNsYXJhdGlvbnMgLi4uCi0KLSVpbmNsdWRlIHdpc2guaSAgICAgICAvLyBTdXBwb3J0IGNvZGUgZm9yIHJlYnVpbGRpbmcgd2lzaAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgY29tcGlsYXRpb24gcHJvY2VzcyBpcyBzaW1pbGFyIGFzIGJlZm9yZSwgYnV0IG5vdyBsb29rcyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyBzd2lnIC10Y2wgZXhhbXBsZS5pCi11bml4ICZndDsgZ2NjIGV4YW1wbGVfd3JhcC5jIGV4YW1wbGUuYyAtSS91c3IvbG9jYWwvaW5jbHVkZSAtTC91c3IvbG9jYWwvbGliIC1sdGsgLWx0Y2wgXAotCS1sWDExIC1sZGwgLWxtIC1vIG15X3dpc2gKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBjYXNlIHlvdSB3aWxsIGVuZCB1cCB3aXRoIGEgbmV3IHZlcnNpb24gb2YgdGhlIDx0dD53aXNoPC90dD4gZXhlY3V0YWJsZSB3aXRoIHlvdXIgZXh0ZW5zaW9ucyBhZGRlZC4gTWFrZSBzdXJlIHlvdSBpbmNsdWRlIDx0dD4tbHRrPC90dD4sIDx0dD4tbHRjbDwvdHQ+LCBhbmQgPHR0Pi1sWDExPC90dD4gaW4gdGhlIG9yZGVyIHNob3duLjxwPgotPGEgbmFtZT0ibjIyIj48L2E+PGgzPiBDb21waWxhdGlvbiBwcm9ibGVtczwvaDM+Ci1UY2wgaXMgb25lIG9mIHRoZSBlYXNpZXN0IGxhbmd1YWdlcyB0byBjb21waWxlIGV4dGVuc2lvbnMgZm9yLiBUaGUgVGNsIGhlYWRlciBmaWxlcyBzaG91bGQgd29yayB3aXRob3V0IHByb2JsZW1zIHVuZGVyIEMgYW5kIEMrKy4gUGVyaGFwcyB0aGUgb25seSB0cmlja3kgdGFzayBpcyB0aGF0IG9mIGNvbXBpbGluZyBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGVzIGZvciBDKysuIElmIHlvdXIgQysrIGNvZGUgaGFzIHN0YXRpYyBjb25zdHJ1Y3RvcnMsIGl0IGlzIHVubGlrZWx5IHRvIHdvcmsgYXQgYWxsLiBJbiB0aGlzIGNhc2UsIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgbmV3IHZlcnNpb25zIG9mIHRoZSA8dHQ+dGNsc2g8L3R0PiBvciA8dHQ+d2lzaDwvdHQ+IGV4ZWN1dGFibGVzIGluc3RlYWQuIFlvdSBtYXkgYWxzbyBuZWVkIHRvIGxpbmsgYWdhaW5zdCB0aGUgPHR0PmxpYmdjYy5hPC90dD4sIDx0dD5saWJnKysuYTwvdHQ+LCBhbmQgbDx0dD5pYnN0ZGMrKy5hPC90dD4gbGlicmFyaWVzIChhc3N1bWluZyBnKyspLjxwPgotPGEgbmFtZT0ibjIzIj48L2E+PGgzPiBTZXR0aW5nIGEgcGFja2FnZSBwcmVmaXg8L2gzPgotVG8gYXZvaWQgbmFtZXNwYWNlIHByb2JsZW1zLCB5b3UgY2FuIGluc3RydWN0IFNXSUcgdG8gYXBwZW5kIGEgcGFja2FnZSBwcmVmaXggdG8gYWxsIG9mIHlvdXIgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMuIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgLXByZWZpeCBvcHRpb24gYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtdGNsIC1wcmVmaXggRm9vIGV4YW1wbGUuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uICI8dHQ+YmFyPC90dD4iIGluIHRoZSBTV0lHIGZpbGUsIHRoZSBwcmVmaXggb3B0aW9uIHdpbGwgYXBwZW5kIHRoZSBwcmVmaXggdG8gdGhlIG5hbWUgd2hlbiBjcmVhdGluZyBhIGNvbW1hbmQgYW5kIGNhbGwgaXQgIjx0dD5Gb29fYmFyPC90dD4iLiA8cD4KLTxhIG5hbWU9Im4yNCI+PC9hPjxoMz4gVXNpbmcgW2luY3IgVGNsXSBuYW1lc3BhY2VzPC9oMz4KLUFsdGVybmF0aXZlbHksIHlvdSBjYW4gaGF2ZSBTV0lHIGluc3RhbGwgeW91ciBtb2R1bGUgaW50byBhbiBbaW5jciBUY2xdIG5hbWVzcGFjZSBieSBzcGVjaWZ5aW5nIHRoZSA8dHQ+LW5hbWVzcGFjZTwvdHQ+IG9wdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtdGNsIC1uYW1lc3BhY2UgZXhhbXBsZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUJ5IGRlZmF1bHQsIHRoZSBuYW1lIG9mIHRoZSBuYW1lc3BhY2Ugd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgbW9kdWxlIG5hbWUsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIGl0IHVzaW5nIHRoZSA8dHQ+LXByZWZpeDwvdHQ+IG9wdGlvbi48cD4KLTxwPgotV2hlbiB0aGU8dHQ+IC1uYW1lc3BhY2U8L3R0PiBvcHRpb24gaXMgdXNlZCwgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgY2FuIGJlIGNvbXBpbGVkIHVuZGVyIGJvdGggVGNsIGFuZCBbaW5jciBUY2xdLiBXaGVuIGNvbXBpbGluZyB1bmRlciBUY2wsIHRoZSBuYW1lc3BhY2Ugd2lsbCB0dXJuIGludG8gYSBwYWNrYWdlIHByZWZpeCBzdWNoIGFzIGluIDx0dD5Gb29fYmFyPC90dD4uIFdoZW4gcnVubmluZyB1bmRlciBbaW5jciBUY2xdLCBpdCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlIDx0dD5Gb286OmJhci48L3R0PjxwPgotPGEgbmFtZT0ibjIiPjwvYT48aDI+IEJ1aWxkaW5nIFRjbC9UayBFeHRlbnNpb25zIHVuZGVyIFdpbmRvd3MgOTUvTlQ8L2gyPgotQnVpbGRpbmcgYSBTV0lHIGV4dGVuc2lvbiB0byBUY2wvVGsgdW5kZXIgV2luZG93cyA5NS9OVCBpcyByb3VnaGx5IHNpbWlsYXIgdG8gdGhlIHByb2Nlc3MgdXNlZCB3aXRoIFVuaXguICAgTm9ybWFsbHksIHlvdSB3aWxsIHdhbnQgdG8gcHJvZHVjZSBhIERMTCB0aGF0IGNhbiBiZSBsb2FkZWQgaW50byB0Y2xzaCBvciB3aXNoLiAgICBUaGlzIHNlY3Rpb24gY292ZXJzIHRoZSBwcm9jZXNzIG9mIHVzaW5nIFNXSUcgd2l0aCBNaWNyb3NvZnQgVmlzdWFsIEMrKyA0LnggYWx0aG91Z2ggdGhlIHByb2NlZHVyZSBtYXkgYmUgc2ltaWxhciB3aXRoIG90aGVyIGNvbXBpbGVycy48cD4KLTxhIG5hbWU9Im4yNSI+PC9hPjxoMz4gUnVubmluZyBTV0lHIGZyb20gRGV2ZWxvcGVyIFN0dWRpbzwvaDM+Ci1JZiB5b3UgYXJlIGRldmVsb3BpbmcgeW91ciBhcHBsaWNhdGlvbiB3aXRoaW4gTWljcm9zb2Z0IGRldmVsb3BlciBzdHVkaW8sIFNXSUcgY2FuIGJlIGludm9rZWQgYXMgYSBjdXN0b20gYnVpbGQgb3B0aW9uLiAgICAgIFRoZSBwcm9jZXNzIHJvdWdobHkgZm9sbG93cyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5PcGVuIHVwIGEgbmV3IHdvcmtzcGFjZSBhbmQgdXNlIHRoZSBBcHBXaXphcmQgdG8gc2VsZWN0IGEgRExMIHByb2plY3QuCi08bGk+QWRkIGJvdGggdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgKHRoZSAuaSBmaWxlKSwgYW55IHN1cHBvcnRpbmcgQyBmaWxlcywgYW5kIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIGZpbGUgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYnkgU1dJRyAoaWUuIDx0dD5leGFtcGxlX3dyYXAuYzwvdHQ+KS4gICBOb3RlIDogSWYgdXNpbmcgQysrLCBjaG9vc2UgYSBkaWZmZXJlbnQgc3VmZml4IGZvciB0aGUgd3JhcHBlciBmaWxlIHN1Y2ggYXMgPHR0PmV4YW1wbGVfd3JhcC5jeHg8L3R0Pi4gRG9uJ3Qgd29ycnkgaWYgdGhlIHdyYXBwZXIgZmlsZSBkb2Vzbid0IGV4aXN0IHlldC0tRGV2ZWxvcGVyIHN0dWRpbyB3aWxsIGtlZXAgYSByZWZlcmVuY2UgdG8gaXQgYXJvdW5kLgotPGxpPlNlbGVjdCB0aGUgU1dJRyBpbnRlcmZhY2UgZmlsZSBhbmQgZ28gdG8gdGhlIHNldHRpbmdzIG1lbnUuICAgVW5kZXIgc2V0dGluZ3MsIHNlbGVjdCB0aGUgIkN1c3RvbSBCdWlsZCIgb3B0aW9uLgotPGxpPkVudGVyICJTV0lHIiBpbiB0aGUgZGVzY3JpcHRpb24gZmllbGQuCi08bGk+RW50ZXIgIjx0dD5zd2lnIC10Y2wgLW8gJChQcm9qRGlyKVwkKElucHV0TmFtZSlfd3JhcC5jICQoSW5wdXRQYXRoKTwvdHQ+IiBpbiB0aGUgIkJ1aWxkIGNvbW1hbmQocykgZmllbGQiCi08bGk+RW50ZXIgIjx0dD4kKFByb2pEaXIpXCQoSW5wdXROYW1lKV93cmFwLmM8L3R0PiIgaW4gdGhlICJPdXRwdXQgZmlsZXMocykgZmllbGQiLgotPGxpPk5leHQsIHNlbGVjdCB0aGUgc2V0dGluZ3MgZm9yIHRoZSBlbnRpcmUgcHJvamVjdCBhbmQgZ28gdG8gIkMrKzpQcmVwcm9jZXNzb3IiLiBBZGQgdGhlIGluY2x1ZGUgZGlyZWN0b3JpZXMgZm9yIHlvdXIgVGNsIGluc3RhbGxhdGlvbiB1bmRlciAiQWRkaXRpb25hbCBpbmNsdWRlIGRpcmVjdG9yaWVzIi4KLTxsaT5GaW5hbGx5LCBzZWxlY3QgdGhlIHNldHRpbmdzIGZvciB0aGUgZW50aXJlIHByb2plY3QgYW5kIGdvIHRvICJMaW5rIE9wdGlvbnMiLiAgQWRkIHRoZSBUY2wgbGlicmFyeSAgZmlsZSB0byB5b3VyIGxpbmsgbGlicmFyaWVzLiAgRm9yIGV4YW1wbGUgIjx0dD50Y2w4MC5saWI8L3R0PiIuICBBbHNvLCBzZXQgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIHRvIG1hdGNoIHRoZSBuYW1lIG9mIHlvdXIgVGNsIG1vZHVsZSAoaWUuIGV4YW1wbGUuZGxsKS4KLTxsaT5CdWlsZCB5b3VyIHByb2plY3QuCi08L3VsPgotPHA+Ci1Ob3csIGFzc3VtaW5nIGFsbCB3ZW50IHdlbGwsIFNXSUcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGludm9rZWQgd2hlbiB5b3UgYnVpbGQgeW91ciBwcm9qZWN0LiAgQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgaW50ZXJmYWNlIGZpbGUgd2lsbCByZXN1bHQgaW4gU1dJRyBiZWluZyBhdXRvbWF0aWNhbGx5IGludm9rZWQgdG8gcHJvZHVjZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSB3cmFwcGVyIGZpbGUuICBUbyBydW4geW91ciBuZXcgVGNsIGV4dGVuc2lvbiwgc2ltcGx5IHJ1biA8dHQ+dGNsc2g8L3R0PiBvciA8dHQ+d2lzaDwvdHQ+ICBhbmQgdXNlIHRoZSA8dHQ+bG9hZDwvdHQ+IGNvbW1hbmQuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0KLU1TRE9TICZndDsgdGNsc2g4MAotJSBsb2FkIGV4YW1wbGUuZGxsCi0lIGZhY3QgNAotMjQKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4yNiI+PC9hPjxoMz4gVXNpbmcgTk1BS0U8L2gzPgotQWx0ZXJuYXRpdmVseSwgU1dJRyBleHRlbnNpb25zIGNhbiBiZSBidWlsdCBieSB3cml0aW5nIGEgTWFrZWZpbGUgZm9yIE5NQUtFLiAgIFRvIGRvIHRoaXMsIG1ha2Ugc3VyZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBNU1ZDKysgYXJlIGF2YWlsYWJsZSBhbmQgdGhlIE1TVkMrKyB0b29scyBhcmUgaW4geW91ciBwYXRoLiAgIE5vdywganVzdCB3cml0ZSBhIHNob3J0IE1ha2VmaWxlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgdmFyaW91cyBTV0lHIGdlbmVyYXRlZCBleHRlbnNpb25zCi0KLVNSQ1MgICAgICAgICAgPSBleGFtcGxlLmMKLUlGSUxFICAgICAgICAgPSBleGFtcGxlCi1JTlRFUkZBQ0UgICAgID0gJChJRklMRSkuaQotV1JBUEZJTEUgICAgICA9ICQoSUZJTEUpX3dyYXAuYwotCi0jIExvY2F0aW9uIG9mIHRoZSBWaXN1YWwgQysrIHRvb2xzICgzMiBiaXQgYXNzdW1lZCkKLQotVE9PTFMgICAgICAgICA9IGM6XG1zZGV2Ci1UQVJHRVQgICAgICAgID0gZXhhbXBsZS5kbGwKLUNDICAgICAgICAgICAgPSAkKFRPT0xTKVxiaW5cY2wuZXhlCi1MSU5LICAgICAgICAgID0gJChUT09MUylcYmluXGxpbmsuZXhlCi1JTkNMVURFMzIgICAgID0gLUkkKFRPT0xTKVxpbmNsdWRlCi1NQUNISU5FICAgICAgID0gSVg4NgotCi0jIEMgTGlicmFyeSBuZWVkZWQgdG8gYnVpbGQgYSBETEwKLQotRExMSUJDICAgICAgICA9IG1zdmNydC5saWIgb2xkbmFtZXMubGliICAKLQotIyBXaW5kb3dzIGxpYnJhcmllcyB0aGF0IGFyZSBhcHBhcmVudGx5IG5lZWRlZAotV0lOTElCICAgICAgICA9IGtlcm5lbDMyLmxpYiBhZHZhcGkzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgY29tZGxnMzIubGliIAotd2luc3Bvb2wubGliCi0KLSMgTGlicmFyaWVzIGNvbW1vbiB0byBhbGwgRExMcwotTElCUyAgICAgICAgICA9ICQoRExMSUJDKSAkKFdJTkxJQikgCi0KLSMgTGlua2VyIG9wdGlvbnMKLUxPUFQgICAgICA9IC1kZWJ1ZzpmdWxsIC1kZWJ1Z3R5cGU6Y3YgL05PREVGQVVMVExJQiAvUkVMRUFTRSAvTk9MT0dPIC8KLU1BQ0hJTkU6JChNQUNISU5FKSAtZW50cnk6X0RsbE1haW5DUlRTdGFydHVwQDEyIC1kbGwKLQotIyBDIGNvbXBpbGVyIGZsYWdzCi0KLUNGTEFHUyAgICA9IC9aNyAvT2QgL2MgL25vbG9nbwotVENMX0lOQ0xVREVTICA9IC1JZDpcdGNsOC4wYTJcZ2VuZXJpYyAtSWQ6XHRjbDguMGEyXHdpbgotVENMTElCICAgICAgICA9IGQ6XHRjbDguMGEyXHdpblx0Y2w4MC5saWIKLQotdGNsOjoKLQkuLlwuLlxzd2lnIC10Y2wgLW8gJChXUkFQRklMRSkgJChJTlRFUkZBQ0UpCi0JJChDQykgJChDRkxBR1MpICQoVENMX0lOQ0xVREVTKSAkKFNSQ1MpICQoV1JBUEZJTEUpCi0Jc2V0IExJQj0kKFRPT0xTKVxsaWIKLQkkKExJTkspICQoTE9QVCkgLW91dDpleGFtcGxlLmRsbCAkKExJQlMpICQoVENMTElCKSBleGFtcGxlLm9iaiBleGFtcGxlX3dyYXAub2JqCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIGJ1aWxkIHRoZSBleHRlbnNpb24sIHJ1biBOTUFLRSAoeW91IG1heSBuZWVkIHRvIHJ1biB2Y3ZhcnMzMiBmaXJzdCkuICAgVGhpcyBpcyBhIHByZXR0eSBtaW5pbWFsIE1ha2VmaWxlLCBidXQgaG9wZWZ1bGx5IGl0cyBlbm91Z2ggdG8gZ2V0IHlvdSBzdGFydGVkLiAgIFdpdGggYSBsaXR0bGUgcHJhY3RpY2UsIHlvdSdsbCBiZSBtYWtpbmcgbG90cyBvZiBUY2wgZXh0ZW5zaW9ucy48cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBCYXNpYyBUY2wgSW50ZXJmYWNlPC9oMj4KLTxhIG5hbWU9Im4yNyI+PC9hPjxoMz4gRnVuY3Rpb25zPC9oMz4KLUMgZnVuY3Rpb25zIGFyZSB0dXJuZWQgaW50byBuZXcgVGNsIGNvbW1hbmRzIHdpdGggdGhlIHNhbWUgdXNhZ2UgYXMgdGhlIEMgZnVuY3Rpb24uIERlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBhbHNvIGFsbG93ZWQuIEFuIGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi1pbnQgZm9vKGludCBhKTsKLWRvdWJsZSBiYXIgKGRvdWJsZSwgZG91YmxlIGIgPSAzLjApOwotLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdpbGwgYmUgdXNlZCBpbiBUY2wgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zZXQgYSBbZm9vIDJdCi1zZXQgYiBbYmFyIDMuNSAtMS41XQotc2V0IGIgW2JhciAzLjVdICAgICAgICAgICAgICAjIE5vdGUgOiBkZWZhdWx0IGFyZ3VtZW50IGlzIHVzZWQgCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZXJlIGlzbid0IG11Y2ggbW9yZSB0byBzYXkuLi50aGlzIGlzIHByZXR0eSBzdHJhaWdodGZvcndhcmQuPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IEdsb2JhbCB2YXJpYWJsZXM8L2gzPgotRm9yIGdsb2JhbCB2YXJpYWJsZXMsIHRoaW5ncyBhcmUgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZC4gRm9yIHRoZSBmb2xsb3dpbmcgQyBkYXRhdHlwZXMsIFNXSUcgd2lsbCB1c2UgVGNsJ3MgdmFyaWFibGUgbGlua2luZyBtZWNoYW5pc20gdG8gcHJvdmlkZSBkaXJlY3QgYWNjZXNzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnQsIHVuc2lnbmVkIGludCwKLWRvdWJsZSwKLWNoYXIgKiwKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiB1c2VkIGluIGFuIGludGVyZmFjZSBmaWxlIGFuZCBzY3JpcHQsIGl0IHdpbGwgb3BlcmF0ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBleGFtcGxlLmkKLSVtb2R1bGUgZXhhbXBsZQotLi4uCi1kb3VibGUgTXlfdmFyaWFibGU7Ci0uLi4KLQotIyBUY2wgc2NyaXB0Ci1wdXRzICRNeV92YXJpYWJsZSAgICAgICAgICAgICMgT3V0cHV0IHZhbHVlIG9mIEMgZ2xvYmFsIHZhcmlhYmxlCi1zZXQgTXlfdmFyaWFibGUgNS41ICAgICAgICAgICMgQ2hhbmdlIHRoZSB2YWx1ZQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Gb3IgYWxsIG90aGVyIEMgZGF0YXR5cGVzLCBTV0lHIHdpbGwgZ2VuZXJhdGUgYSBwYWlyIG9mIHNldC9nZXQgZnVuY3Rpb25zLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gZXhhbXBsZS5pCi1zaG9ydCBNeV9zaG9ydDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotd2lsbCBiZSBhY2Nlc3NlZCBpbiBUY2wgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHV0cyBbTXlfc2hvcnRfZ2V0XSAgICAgICAgICAjIEdldCB2YWx1ZSBvZiBnbG9iYWwgdmFyaWFibGUKLU15X3Nob3J0X3NldCA1LjUgICAgICAgICAgICAgIyBTZXQgdmFsdWUgb2YgZ2xvYmFsIHZhcmlhYmxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIG5vdCB0aGUgbW9zdCBlbGVnYW50IHNvbHV0aW9uLCB0aGlzIGlzIHRoZSBvbmx5IHNvbHV0aW9uIGZvciBub3cuIFRjbCdzIG5vcm1hbCB2YXJpYWJsZSBsaW5raW5nIG1lY2hhbmlzbSBvcGVyYXRlcyBkaXJlY3RseSBvbiBhIHZhcmlhYmxlcyBhbmQgd291bGQgbm90IHdvcmsgY29ycmVjdGx5IG9uIGRhdGF0eXBlcyBvdGhlciB0aGFuIHRoZSAzIGJhc2ljIGRhdGF0eXBlcyBzdXBwb3J0ZWQgYnkgVGNsICg8dHQ+aW50PC90dD4sIDx0dD5kb3VibGU8L3R0PiwgYW5kIDx0dD5jaGFyICo8L3R0PikuPHA+Ci08YSBuYW1lPSJuMjkiPjwvYT48aDM+IENvbnN0YW50czwvaDM+Ci1Db25zdGFudHMgYXJlIGNyZWF0ZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcy4gRm9yIG9kZCBkYXRhdHlwZXMgKG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZhcmlhYmxlIGxpbmtpbmcgbWVjaGFuaXNtKSwgU1dJRyBnZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnN0YW50IGFuZCB1c2UgaXQgaW5zdGVhZCAoeW91IHNob3VsZG4ndCBub3RpY2UgdGhpcyBob3dldmVyIHNpbmNlIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBhIHN0cmluZyBpbiBUY2wpLiBJdCBpcyBuZXZlciBuZWNlc3NhcnkgdG8gdXNlIGEgc3BlY2lhbCAiZ2V0IiBmdW5jdGlvbiB3aXRoIGNvbnN0YW50cy4gVW5saWtlIFRjbCB2YXJpYWJsZXMsIGNvbnN0YW50cyBjYW4gY29udGFpbiBwb2ludGVycywgc3RydWN0dXJlIGFkZHJlc3NlcywgZnVuY3Rpb24gcG9pbnRlcnMsIGV0Yy4uLjxwPgotPGEgbmFtZT0ibjMwIj48L2E+PGgzPiBQb2ludGVyczwvaDM+Ci1Qb2ludGVycyB0byBDL0MrKyBvYmplY3RzIGFyZSByZXByZXNlbnRlZCBhcyBjaGFyYWN0ZXIgc3RyaW5ncyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPl8xMDBmOGUyX1ZlY3Rvcl9wCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUEgTlVMTCBwb2ludGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgIk5VTEwiLiBOVUxMIHBvaW50ZXJzIGNhbiBhbHNvIGJlIGV4cGxpY2l0bHkgY3JlYXRlZCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5fMF9WZWN0b3JfcAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiBUY2wgOC4wLCBwb2ludGVycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgYSBuZXcgdHlwZSBvZiBUY2wgb2JqZWN0LCBidXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBpcyB0aGUgc2FtZSAoYW5kIGlzIGludGVyY2hhbmdhYmxlKS4gQXMgYSBnZW5lcmFsLCBkaXJlY3QgbWFuaXB1bGF0aW9uIG9mIHBvaW50ZXIgdmFsdWVzIGlzIGRpc2NvdXJhZ2VkLiA8cD4KLTxhIG5hbWU9Im4zMSI+PC9hPjxoMz4gU3RydWN0dXJlcyA8L2gzPgotU1dJRyBnZW5lcmF0ZXMgYSBiYXNpYyBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIEMgc3RydWN0dXJlcy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN0cnVjdCBWZWN0b3IgewotCWRvdWJsZSB4LHksejsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLWdldHMgbWFwcGVkIGludG8gdGhlIGZvbGxvd2luZyBjb2xsZWN0aW9uIG9mIEMgZnVuY3Rpb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5kb3VibGUgVmVjdG9yX3hfZ2V0KFZlY3RvciAqb2JqKQotZG91YmxlIFZlY3Rvcl94X3NldChWZWN0b3IgKm9iaiwgZG91YmxlIHgpCi1kb3VibGUgVmVjdG9yX3lfZ2V0KFZlY3RvciAqb2JqKQotZG91YmxlIFZlY3Rvcl95X3NldChWZWN0b3IgKm9iaiwgZG91YmxlIHkpCi1kb3VibGUgVmVjdG9yX3pfZ2V0KFZlY3RvciAqb2JqKQotZG91YmxlIFZlY3Rvcl96X3NldChWZWN0b3IgKm9iaiwgZG91YmxlIHopCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlbiB1c2VkIGluIHRoZSByZXN1bHRpbmcgVGNsIGludGVyZmFjZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgdiBpcyBhIFZlY3RvciB0aGF0IGdvdCBjcmVhdGVkIHNvbWVob3cKLSUgVmVjdG9yX3hfZ2V0ICR2Ci0zLjUKLSUgVmVjdG9yX3hfc2V0ICR2IDcuOCAgICAgICAgICAgICMgQ2hhbmdlIHggY29tcG9uZW50Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNpbWlsYXIgYWNjZXNzIGlzIHByb3ZpZGVkIGZvciB1bmlvbnMgYW5kIHRoZSBkYXRhIG1lbWJlcnMgb2YgQysrIGNsYXNzZXMuPHA+Ci08YSBuYW1lPSJuMzIiPjwvYT48aDM+IEMrKyBDbGFzc2VzPC9oMz4KLUMrKyBjbGFzc2VzIGFyZSBoYW5kbGVkIGJ5IGJ1aWxkaW5nIGEgc2V0IG9mIGxvdyBsZXZlbCBhY2Nlc3NvciBmdW5jdGlvbnMuIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotY2xhc3MgTGlzdCB7Ci1wdWJsaWM6Ci0gIExpc3QoKTsKLSAgfkxpc3QoKTsKLSAgaW50ICBzZWFyY2goY2hhciAqaXRlbSk7Ci0gIHZvaWQgaW5zZXJ0KGNoYXIgKml0ZW0pOwotICB2b2lkIHJlbW92ZShjaGFyICppdGVtKTsKLSAgY2hhciAqZ2V0KGludCBuKTsKLSAgaW50ICBsZW5ndGg7Ci1zdGF0aWMgdm9pZCBwcmludChMaXN0ICpsKTsKLX07Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdoZW4gd3JhcHBlZCBieSBTV0lHLCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgY3JlYXRlZCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+TGlzdCAgICAqbmV3X0xpc3QoKTsKLXZvaWQgICAgIGRlbGV0ZV9MaXN0KExpc3QgKmwpOwotaW50ICAgICAgTGlzdF9zZWFyY2goTGlzdCAqbCwgY2hhciAqaXRlbSk7Ci12b2lkICAgICBMaXN0X2luc2VydChMaXN0ICpsLCBjaGFyICppdGVtKTsKLXZvaWQgICAgIExpc3RfcmVtb3ZlKExpc3QgKmwsIGNoYXIgKml0ZW0pOwotY2hhciAgICAqTGlzdF9nZXQoTGlzdCAqbCwgaW50IG4pOwotaW50ICAgICAgTGlzdF9sZW5ndGhfZ2V0KExpc3QgKmwpOwotaW50ICAgICAgTGlzdF9sZW5ndGhfc2V0KExpc3QgKmwsIGludCBuKTsKLXZvaWQgICAgIExpc3RfcHJpbnQoTGlzdCAqbCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdpdGhpbiBUY2wsIHdlIGNhbiB1c2UgdGhlIGZ1bmN0aW9ucyBhcyBmb2xsb3dzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0lIHNldCBsIFtuZXdfTGlzdF0KLSUgTGlzdF9pbnNlcnQgJGwgQWxlCi0lIExpc3RfaW5zZXJ0ICRsIFN0b3V0Ci0lIExpc3RfaW5zZXJ0ICRsIExhZ2VyCi0lIExpc3RfcHJpbnQgJGwKLUxhZ2VyCi1TdG91dAotQWxlCi0lIHB1dHMgW0xpc3RfbGVuZ3RoX2dldCAkbF0KLTMKLSUgcHV0cyAkbAotXzEwMDg1NjBfTGlzdF9wCi0lIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1DKysgb2JqZWN0cyBhcmUgcmVhbGx5IGp1c3QgcG9pbnRlcnMgKHdoaWNoIGFyZSByZXByZXNlbnRlZCBhcyBzdHJpbmdzKS4gTWVtYmVyIGZ1bmN0aW9ucyBhbmQgZGF0YSBhcmUgYWNjZXNzZWQgYnkgc2ltcGx5IHBhc3NpbmcgYSBwb2ludGVyIGludG8gYSBjb2xsZWN0aW9uIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IHRha2UgdGhlIHBvaW50ZXIgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LjxwPgotPHA+Ci1XaGlsZSBzb21ld2hhdCBwcmltaXRpdmUsIHRoZSBsb3ctbGV2ZWwgU1dJRyBpbnRlcmZhY2UgcHJvdmlkZXMgZGlyZWN0IGFuZCBmbGV4aWJsZSBhY2Nlc3MgdG8gYWxtb3N0IGFueSBDKysgb2JqZWN0LiBBcyBpdCB0dXJucyBvdXQsIGl0IGlzIHBvc3NpYmxlIHRvIGRvIHNvbWUgcmF0aGVyIGFtYXppbmcgdGhpbmdzIHdpdGggdGhpcyBpbnRlcmZhY2UgYXMgd2lsbCBiZSBzaG93biBpbiBzb21lIG9mIHRoZSBsYXRlciBleGFtcGxlcy4gU1dJRyAxLjEgYWxzbyBnZW5lcmF0ZXMgYW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIHRoZSBiYXNpYyBpbnRlcmZhY2UganVzdCBkZXNjcmliZWQgaGVyZS48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBUaGUgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZTwvaDI+Ci1XaXRoIFNXSUcgMS4xLCBhIG5ldyBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHRvIEMgc3RydWN0dXJlcyBhbmQgQysrIGNsYXNzZXMgaXMgc3VwcG9ydGVkLiBUaGlzIGludGVyZmFjZSBzdXBwbGVtZW50cyB0aGUgbG93LWxldmVsIFNXSUcgaW50ZXJmYWNlIGFscmVhZHkgZGVmaW5lZC0taW4gZmFjdCwgYm90aCBjYW4gYmUgdXNlZCBzaW11bHRhbmVvdXNseS4gVG8gaWxsdXN0cmF0ZSB0aGlzIGludGVyZmFjZSwgY29uc2lkZXIgb3VyIHByZXZpb3VzIDx0dD5MaXN0PC90dD4gY2xhc3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIExpc3QgewotcHVibGljOgotICBMaXN0KCk7Ci0gIH5MaXN0KCk7Ci0gIGludCAgc2VhcmNoKGNoYXIgKml0ZW0pOwotICB2b2lkIGluc2VydChjaGFyICppdGVtKTsKLSAgdm9pZCByZW1vdmUoY2hhciAqaXRlbSk7Ci0gIGNoYXIgKmdldChpbnQgbik7Ci0gIGludCAgbGVuZ3RoOwotc3RhdGljIHZvaWQgcHJpbnQoTGlzdCAqbCk7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Vc2luZyB0aGUgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSByZXF1aXJlcyBubyBhZGRpdGlvbmFsIG1vZGlmaWNhdGlvbnMgb3IgcmVjb21waWxhdGlvbiBvZiB0aGUgU1dJRyBtb2R1bGUgKHRoZSBmdW5jdGlvbnMgYXJlIGp1c3QgdXNlZCBkaWZmZXJlbnRseSkuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IENyZWF0aW5nIG5ldyBvYmplY3RzPC9oMz4KLVRoZSBuYW1lIG9mIHRoZSBjbGFzcyBiZWNvbWVzIGEgbmV3IGNvbW1hbmQgZm9yIGNyZWF0aW5nIGFuIG9iamVjdC4gVGhlcmUgYXJlIDUgbWV0aG9kcyBmb3IgY3JlYXRpbmcgYW4gb2JqZWN0ICg8dHQ+TXlPYmplY3QgPC90dD5pcyB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBDKysgY2xhc3MpIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPk15T2JqZWN0IG8gICAgICAgICAgICAgICAgICAgIyBDcmVhdGVzIGEgbmV3IG9iamVjdCBgbycgCi0KLU15T2JqZWN0IG8gLXRoaXMgJG9ianB0ciAgICAgIyBUdXJuIGEgcG9pbnRlciB0byBhbiBleGlzdGluZyBDKysgb2JqZWN0IGludG8gYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUY2wgb2JqZWN0IGBvJwotCi1NeU9iamVjdCAtdGhpcyAkb2JqcHRyICAgICAgICMgVHVybiB0aGUgcG9pbnRlciAkb2JqcHRyIGludG8gYSBUY2wgIm9iamVjdCIKLQotTXlPYmplY3QgLWFyZ3MgYXJncyAgICAgICAgICAjIENyZWF0ZSBhIG5ldyBvYmplY3QgYW5kIHBpY2sgYSBuYW1lIGZvciBpdC4gQSBoYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aWxsIGJlIHJldHVybmVkIGFuZCBpcyB0aGUgc2FtZSBhcyB0aGUgcG9pbnRlciB2YWx1ZS4KLQotTXlPYmplY3QgICAgICAgICAgICAgICAgICAgICAjIFRoZSBzYW1lIGFzIE15T2JqZWN0IC1hcmdzLCBidXQgZm9yIGNvbnN0cnVjdG9ycyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFrZSBubyBhcmd1bWVudHMuCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRodXMsIGZvciBvdXIgTGlzdCBjbGFzcywgd2UgY2FuIGNyZWF0ZSBuZXcgTGlzdCBvYmplY3RzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPkxpc3QgbCAgICAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBuZXcgbGlzdCBsCi0KLXNldCBsaXN0cHRyIFtuZXdfTGlzdF0gICAgICAgIyBDcmVhdGUgYSBuZXcgTGlzdCB1c2luZyBsb3cgbGV2ZWwgaW50ZXJmYWNlCi1MaXN0IGwyIC10aGlzICRsaXN0cHRyICAgICAgICMgVHVybiBpdCBpbnRvIGEgTGlzdCBvYmplY3QgbmFtZWQgYGwyJwotCi1zZXQgbDMgW0xpc3RdICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgbmV3IGxpc3QuIFRoZSBuYW1lIG9mIHRoZSBsaXN0IGlzIGluICRsMwotCi1MaXN0IC10aGlzICRsaXN0cHRyICAgICAgICAgICMgVHVybiAkbGlzdHB0ciBpbnRvIGEgVGNsIG9iamVjdCBvZiB0aGUgc2FtZSBuYW1lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU5vdyBhc3N1bWluZyB5b3UncmUgbm90IGNvbXBsZXRlbHkgY29uZnVzZWQgYXQgdGhpcyBwb2ludCwgdGhlIGJlc3Qgd2F5IHRvIHRoaW5rIG9mIHRoaXMgaXMgdGhhdCB0aGVyZSBhcmUgcmVhbGx5IHR3byBkaWZmZXJlbnQgd2F5cyBvZiByZXByZXNlbnRpbmcgYW4gb2JqZWN0LiAgIE9uZSBhcHByb2FjaCBpcyB0byBzaW1wbHkgdXNlIHRoZSBwb2ludGVyIHZhbHVlIGFzIHRoZSBuYW1lIG9mIGFuIG9iamVjdC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPl8xMDBlOGY4X0xpc3RfcAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgc2Vjb25kIGFwcHJvYWNoIGlzIHRvIGFsbG93IHlvdSB0byBwaWNrIGEgbmFtZSBmb3IgYW4gb2JqZWN0IHN1Y2ggYXMgImZvbyIuICAgVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBjb25zdHJ1Y3RvcnMgYXJlIHJlYWxseSBqdXN0IG1lY2hhbmlzbSBmb3IgdXNpbmcgZWl0aGVyIGFwcHJvYWNoLjxwPgotPGEgbmFtZT0ibjM0Ij48L2E+PGgzPiBJbnZva2luZyBtZW1iZXIgZnVuY3Rpb25zPC9oMz4KLU1lbWJlciBmdW5jdGlvbnMgYXJlIGludm9rZWQgdXNpbmcgdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIG5hbWUgYW5kIGFueSBhcmd1bWVudHMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIExpc3QgbAotJSBsIGluc2VydCAiQm9iIgotJSBsIGluc2VydCAiTWFyeSIKLSUgbCBzZWFyY2ggIkRhdmUiCi0wCi0lIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PciBpZiB5b3UgbGV0IFNXSUcgZ2VuZXJhdGUgdGhlIG5hbWUgb2YgdGhlIG9iamVjdC4uLiAodGhpcyBpcyB0aGUgcG9pbnRlciBtb2RlbCk8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCBsIFtMaXN0XQotJSAkbCBpbnNlcnQgIkJvYiIgICAgICAgICAgICAjIE5vdGUgJGwgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIG9iamVjdAotJSAkbCBpbnNlcnQgIk1hcnkiCi0lICRsIHNlYXJjaCAiRGF2ZSIKLTAKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gRGVsZXRpbmcgb2JqZWN0czwvaDM+Ci1TaW5jZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGFkZGluZyBuZXcgVGNsIGNvbW1hbmRzLCB0aGV5IGNhbiBiZSBkZWxldGVkIGJ5IHNpbXBseSByZW5hbWluZyB0aGVtLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSByZW5hbWUgbCAiIiAgICAgICAgICAgICAgICAjIERlc3Ryb3kgbGlzdCBvYmplY3QgYGwnCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNXSUcgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgQy9DKysgZGVzdHJ1Y3Rvciwgd2l0aCBvbmUgY2F2ZWF0LS1TV0lHIHdpbGwgbm90IGRlc3Ryb3kgYW4gb2JqZWN0IGlmIHlvdSBjcmVhdGVkIGl0IGZyb20gYW4gYWxyZWFkeSBleGlzdGluZyBwb2ludGVyIChpZiB5b3UgY2FsbGVkIHRoZSBjb25zdHJ1Y3RvciB1c2luZyB0aGUgLXRoaXMgb3B0aW9uKS4gU2luY2UgdGhlIHBvaW50ZXIgYWxyZWFkeSBleGlzdGVkIHdoZW4geW91IGNyZWF0ZWQgdGhlIFRjbCBvYmplY3QsIFRjbCBkb2Vzbid0IG93biB0aGUgb2JqZWN0IHNvIGl0IHdvdWxkIHByb2JhYmx5IGJlIGEgYmFkIGlkZWEgdG8gZGVzdHJveSBpdC48cD4KLTxhIG5hbWU9Im4zNiI+PC9hPjxoMz4gQWNjZXNzaW5nIG1lbWJlciBkYXRhPC9oMz4KLU1lbWJlciBkYXRhIG9mIGFuIG9iamVjdCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgdGhlIDx0dD5jZ2V0PC90dD4gbWV0aG9kLiBUaGUgYXBwcm9hY2ggaXMgcXVpdGUgc2ltaWxhciB0byB0aGF0IHVzZWQgaW4gW2luY3IgVGNsXSBhbmQgb3RoZXIgVGNsIGV4dGVuc2lvbnMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIGwgY2dldCAtbGVuZ3RoICAgICAgICAgICAgICMgR2V0IHRoZSBsZW5ndGggb2YgdGhlIGxpc3QKLTEzCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+Y2dldDwvdHQ+IG1ldGhvZCBjdXJyZW50bHkgb25seSBhbGxvd3MgcmV0cmlldmFsIG9mIG9uZSBtZW1iZXIgYXQgYSB0aW1lLiBFeHRyYWN0aW5nIG11bHRpcGxlIG1lbWJlcnMgd2lsbCByZXF1aXJlIHJlcGVhdGVkIGNhbGxzLjxwPgotPHA+Ci1UaGUgbWVtYmVyIDx0dD4tdGhpczwvdHQ+IGNvbnRhaW5zIHRoZSBwb2ludGVyIHRvIHRoZSBvYmplY3QgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggb3RoZXIgU1dJRyBmdW5jdGlvbnMuIFRodXMsIHRoZSBmb2xsb3dpbmcgY2FsbCB3b3VsZCBiZSBsZWdhbDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBMaXN0IGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBuZXcgbGlzdCBvYmplY3QKLSUgbCBpbnNlcnQgTWlrZQotJSBMaXN0X3ByaW50IFtsIGNnZXQgLXRoaXNdICAgICAgICAgIyBQcmludCBpdCBvdXQgdXNpbmcgbG93LWxldmVsIGZ1bmN0aW9uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMzciPjwvYT48aDM+IENoYW5naW5nIG1lbWJlciBkYXRhPC9oMz4KLVRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgbWVtYmVyIGRhdGEsIHRoZSA8dHQ+Y29uZmlndXJlPC90dD4gbWV0aG9kIGNhbiBiZSB1c2VkLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBsIGNvbmZpZ3VyZSAtbGVuZ3RoIDEwICAgICAjIENoYW5nZSBsZW5ndGggdG8gMTAgKHByb2JhYmx5IG5vdCBhIGdvb2QgaWRlYSwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zc2libGUpLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiBhIHN0cnVjdHVyZSBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXN0cnVjdCBWZWN0b3IgewotCWRvdWJsZSB4LCB5LCB6OwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgoteW91IGNhbiBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFsbCBvciBzb21lIG9mIHRoZSBtZW1iZXJzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgdiBjb25maWd1cmUgLXggMy41IC15IDIgLXogLTEuMAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgb3JkZXIgb2YgYXR0cmlidXRlcyBkb2VzIG5vdCBtYXR0ZXIuICA8cD4KLTxhIG5hbWU9Im4zOCI+PC9hPjxoMz4gUmVsYXRpb25zaGlwIHdpdGggcG9pbnRlcnM8L2gzPgotVGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UgaXMgbW9zdGx5IGNvbXBhdGlibGUgd2l0aCBhbGwgb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdCBwb2ludGVyIHZhbHVlcyBhcyBhcmd1bWVudHMuIEhlcmUgYXJlIGEgY291cGxlIG9mIHRoaW5ncyB0byBrZWVwIGluIG1pbmQgOjxwPgotPHA+Ci08dWw+Ci08bGk+SWYgeW91IGV4cGxpY2l0bHkgZ2F2ZSBhIG5hbWUgdG8gYW4gb2JqZWN0LCB0aGUgcG9pbnRlciB2YWx1ZSBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZSBgPHR0PmNnZXQgLXRoaXM8L3R0PicgbWV0aG9kLiBUaGUgcG9pbnRlciB2YWx1ZSBpcyB3aGF0IHlvdSBzaG91bGQgZ2l2ZSB0byBvdGhlciBTV0lHIGdlbmVyYXRlZCBmdW5jdGlvbnMgaWYgbmVjZXNzYXJ5LgotPGxpPklmIHlvdSBsZXQgU1dJRyBnZW5lcmF0ZSB0aGUgbmFtZSBvZiBhbiBvYmplY3QgZm9yIHlvdSwgdGhlbiB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoZSBwb2ludGVyIHZhbHVlLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgYXBwcm9hY2guCi08bGk+SWYgeW91IGhhdmUgYSBwb2ludGVyIHZhbHVlIGJ1dCBpdCdzIG5vdCBhIFRjbCBvYmplY3QsIHlvdSBjYW4gdHVybiBpdCBpbnRvIG9uZSBieSBjYWxsaW5nIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBgPHR0Pi10aGlzPC90dD4nIG9wdGlvbi4KLTwvdWw+Ci08cD4KLUhlcmUgaXMgYSBzY3JpcHQgdGhhdCBpbGx1c3RyYXRlcyBob3cgdGhlc2UgdGhpbmdzIHdvcmsgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgRXhhbXBsZSAxIDogVXNpbmcgYSBuYW1lZCBvYmplY3QKLQotTGlzdCBsICAgICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIG5ldyBsaXN0Ci1sIGluc2VydCBEYXZlICAgICAgICAgICAgICAgICMgQ2FsbCBzb21lIG1ldGhvZHMKLWwgaW5zZXJ0IEphbmUJCi1sIGluc2VydCBQYXQKLUxpc3RfcHJpbnQgW2wgY2dldCAtdGhpc10gICAgIyBDYWxsIGEgc3RhdGljIG1ldGhvZCAod2hpY2ggcmVxdWlyZXMgdGhlIHBvaW50ZXIgdmFsdWUpCi0KLSMgRXhhbXBsZSAyOiBMZXQgU1dJRyBwaWNrIGEgbmFtZQotCi1zZXQgbCBbTGlzdF0gICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgbmV3IGxpc3QKLSRsIGluc2VydCBEYXZlICAgICAgICAgICAgICAgIyBDYWxsIHNvbWUgbWV0aG9kcwotJGwgaW5zZXJ0IEphbmUKLSRsIGluc2VydCBQYXQKLUxpc3RfcHJpbnQgJGwgICAgICAgICAgICAgICAgIyBDYWxsIHN0YXRpYyBtZXRob2QgKG5hbWUgb2Ygb2JqZWN0IGlzIHNhbWUgYXMgcG9pbnRlcikKLQotIyBFeGFtcGxlIDM6IEFscmVhZHkgZXhpc3Rpbmcgb2JqZWN0Ci1zZXQgbCBbbmV3X0xpc3RdICAgICAgICAgICAgICMgQ3JlYXRlIGEgcmF3IG9iamVjdCB1c2luZyBsb3ctbGV2ZWwgaW50ZXJmYWNlCi1MaXN0X2luc2VydCAkbCBEYXZlICAgICAgICAgICMgQ2FsbCBzb21lIG1ldGhvZHMgKHVzaW5nIGxvdy1sZXZlbCBmdW5jdGlvbnMpCi1MaXN0IC10aGlzICRsICAgICAgICAgICAgICAgICMgVHVybiBpdCBpbnRvIGEgVGNsIG9iamVjdCBpbnN0ZWFkCi0kbCBpbnNlcnQgSmFuZQotJGwgaW5zZXJ0IFBhcnQKLUxpc3RfcHJpbnQgJGwgICAgICAgICAgICAgICAgIyBDYWxsIHN0YXRpYyBtZXRob2QgKHVzZXMgcG9pbnRlciB2YWx1ZSBhcyBiZWZvcmUpLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci08YSBuYW1lPSJuMzkiPjwvYT48aDM+IFBlcmZvcm1hbmNlIGNvbmNlcm5zIGFuZCBkaXNhYmxpbmcgdGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2U8L2gzPgotVGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UgaXMgbWFpbmx5IHByb3ZpZGVkIGZvciBlYXNlIG9mIHByb2dyYW1taW5nIGF0IHRoZSBleHBlbnNlIG9mIGludHJvZHVjaW5nIG1vcmUgb3ZlcmhlYWQgYW5kIGluY3JlYXNlZCBjb2RlIHNpemUgKEMgY29kZSB0aGF0IGlzKS4gSWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgdGhlc2UgaXNzdWVzIHVzZSB0aGUgYmFzaWMgU1dJRyBpbnRlcmZhY2UgaW5zdGVhZC4gSXQgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyBhbmQgaXMgbXVjaCBmYXN0ZXIuIEFzIGl0IHR1cm5zIG91dCwgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgYW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSBkaXJlY3RseSBpbiBUY2wgYXMgd2VsbC0tYW4gZXhhbXBsZSB3ZSdsbCByZXR1cm4gdG8gYSBsaXR0bGUgbGF0ZXIuPHA+Ci08cD4KLVRvIGRpc2FibGUgdGhlIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UsIHJ1biBTV0lHIHdpdGggdGhlIDx0dD4tbm9vYmplY3Q8L3R0PiBvcHRpb24uIFRoaXMgd2lsbCBzdHJpcCBvdXQgYWxsIG9mIHRoZSBleHRyYSBjb2RlIGFuZCBwcm9kdWNlIG9ubHkgdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UuPHA+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gQWJvdXQgdGhlIGV4YW1wbGVzPC9oMj4KLVRoZSBuZXh0IGZldyBzZWN0aW9ucyBjb3ZlciBUY2wgZXhhbXBsZXMgb2YgdmFyeWluZyBjb21wbGV4aXR5LiBUaGVzZSBhcmUgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIGlsbHVzdHJhdGUgaG93IFNXSUcgY2FuIGJlIHVzZWQgdG8gaW50ZWdyYXRlIEMvQysrIGFuZCBUY2wgaW4gYSB2YXJpZXR5IG9mIHdheXMuIFNvbWUgb2YgdGhlIHRoaW5ncyB0aGF0IHdpbGwgYmUgY292ZXJlZCBhcmUgOjxwPgotPHA+Ci08dWw+Ci08bGk+Q29udHJvbGxpbmcgQyBwcm9ncmFtcyB3aXRoIFRjbAotPGxpPkJ1aWxkaW5nIEMgZGF0YSBzdHJ1Y3R1cmVzIGluIFRjbC4KLTxsaT5Vc2Ugb2YgQyBvYmplY3RzIHdpdGggVGsKLTxsaT5XcmFwcGluZyBhIEMgbGlicmFyeSAoT3BlbkdMIGluIHRoaXMgY2FzZSkKLTxsaT5BY2Nlc3NpbmcgYXJyYXlzIGFuZCBvdGhlciBjb21tb24gZGF0YSBzdHJ1Y3R1cmVzCi08bGk+VXNpbmcgVGNsIHRvIGJ1aWxkIG5ldyBUY2wgaW50ZXJmYWNlcyB0byBDIHByb2dyYW1zLgotPGxpPk1vZGlmeWluZyBTV0lHJ3MgaGFuZGxpbmcgb2YgZGF0YXR5cGVzLgotPGxpPkFuZCBhIGJ1bmNoIG9mIG90aGVyIGNvb2wgc3R1ZmYuCi08L3VsPgotPGEgbmFtZT0ibjYiPjwvYT48aDI+IEJpbmFyeSB0cmVlcyBpbiBUY2w8L2gyPgotSW4gdGhpcyBleGFtcGxlLCB3ZSBzaG93IFRjbCBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIGJpbmFyeSB0cmVlcyBpbXBsZW1lbnRlZCBpbiBDLiBUaGlzIHdpbGwgaW52b2x2ZSBhY2Nlc3NpbmcgQyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucy48cD4KLTxhIG5hbWU9Im40MCI+PC9hPjxoMz4gQyBmaWxlczwvaDM+Ci1XZSB3aWxsIGJ1aWxkIHRyZWVzIHVzaW5nIHRoZSBmb2xsb3dpbmcgQyBoZWFkZXIgZmlsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogdHJlZS5oICovCi10eXBlZGVmIHN0cnVjdCBOb2RlIE5vZGU7Ci1zdHJ1Y3QgTm9kZSB7Ci0JY2hhciAgICprZXk7Ci0JY2hhciAgICp2YWx1ZTsKLQlOb2RlICAgKmxlZnQ7Ci0JTm9kZSAgICpyaWdodDsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IFRyZWUgewotCU5vZGUgICAqaGVhZDsgIC8qICBTdGFydGluZyBub2RlICovCi0JTm9kZSAgICp6OyAgICAgLyogRW5kaW5nIG5vZGUgKGF0IGxlYXZlcykgKi8KLX0gVHJlZTsKLQotZXh0ZXJuIE5vZGUgKm5ld19Ob2RlKGNoYXIgKmtleSwgY2hhciAqdmFsdWUpOwotZXh0ZXJuIFRyZWUgKm5ld19UcmVlKCk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBDIGZ1bmN0aW9ucyB0byBjcmVhdGUgbmV3IG5vZGVzIGFuZCB0cmVlcyBhcmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+LyogRmlsZSA6IHRyZWUuYyAqLwotI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwotI2luY2x1ZGUgInRyZWUuaCIKLU5vZGUgKm5ld19Ob2RlKGNoYXIgKmtleSwgY2hhciAqdmFsdWUpIHsKLQlOb2RlICpuOwotCW4gPSAoTm9kZSAqKSBtYWxsb2Moc2l6ZW9mKE5vZGUpKTsKLQluLSZndDtrZXkgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGtleSkrMSk7Ci0Jbi0mZ3Q7dmFsdWUgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHZhbHVlKSsxKTsKLQlzdHJjcHkobi0mZ3Q7a2V5LGtleSk7Ci0Jc3RyY3B5KG4tJmd0O3ZhbHVlLHZhbHVlKTsKLQluLSZndDtsZWZ0ID0gMDsKLQluLSZndDtyaWdodCA9IDA7Ci0JcmV0dXJuIG47Ci19OwotVHJlZSAqbmV3X1RyZWUoKSB7Ci0JVHJlZSAqdDsKLQl0ID0gKFRyZWUgKikgbWFsbG9jKHNpemVvZihUcmVlKSk7Ci0JdC0mZ3Q7aGVhZCA9IG5ld19Ob2RlKCIiLCJfX2hlYWRfXyIpOwotCXQtJmd0O3ogPSBuZXdfTm9kZSgiX19lbmRfXyIsIl9fZW5kX18iKTsKLQl0LSZndDtoZWFkLSZndDtyaWdodCA9IHQtJmd0O3o7Ci0JdC0mZ3Q7ei0mZ3Q7bGVmdCA9IHQtJmd0O3o7Ci0JdC0mZ3Q7ei0mZ3Q7cmlnaHQgPSB0LSZndDt6OwotCXJldHVybiB0OwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjQxIj48L2E+PGgzPiBNYWtpbmcgYSBxdWljayBhIGRpcnR5IFRjbCBtb2R1bGU8L2gzPgotVG8gbWFrZSBhIHF1aWNrIFRjbCBtb2R1bGUgd2l0aCB0aGVzZSBmdW5jdGlvbnMsIHdlIGNhbiBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBmaWxlIDogdHJlZS5pCi0lbW9kdWxlIHRyZWUKLSV7Ci0jaW5jbHVkZSAidHJlZS5oIgotJX0KLSVpbmNsdWRlIHRyZWUuaCAgICAgICAvLyBKdXN0IGdyYWIgaGVhZGVyIGZpbGUgc2luY2UgaXQncyBmYWlybHkgc2ltcGxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIGJ1aWxkIHRoZSBtb2R1bGUsIHJ1biBTV0lHIGFzIGZvbGxvd3MgYW5kIGNvbXBpbGUgdGhlIHJlc3VsdGluZyBvdXRwdXQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtdGNsIC1sdGNsc2guaSB0cmVlLmkKLSUgZ2NjIHRyZWUuYyB0cmVlX3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZSAtTC91c3IvbG9jYWwvbGliIC1sdGNsIC1sbSAtbyBteV90Y2xzaAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XZSBjYW4gbm93IHRyeSBvdXQgdGhlIG1vZHVsZSBpbnRlcmFjdGl2ZWx5IGJ5IGp1c3QgcnVubmluZyB0aGUgbmV3IGA8dHQ+bXlfdGNsc2g8L3R0PicgZXhlY3V0YWJsZS48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgbXlfdGNsc2gKLSUgc2V0IHQgW25ld19UcmVlXSAgICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgbmV3IHRyZWUKLV84MDUzMTk4X1RyZWVfcAotJSBzZXQgbiBbVHJlZV9oZWFkX2dldCAkdF0gICAgICAgICAgIyBHZXQgZmlyc3Qgbm9kZQotXzgwNTMxYThfTm9kZV9wCi0lIHB1dHMgW05vZGVfdmFsdWVfZ2V0ICRuXSAgICAgICAgICAjIEdldCBpdHMgdmFsdWUKLV9faGVhZF9fCi0lIE5vZGUgLXRoaXMgJG4KLSUgJG4gY2dldCAtdmFsdWUgICAgICAgICAgICAgICAgICAgIyBBbHRlbmF0aXZlIG1ldGhvZCBmb3IgZ2V0dGluZyB2YWx1ZQotX19oZWFkX18KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im40MiI+PC9hPjxoMz4gQnVpbGRpbmcgYSBDIGRhdGEgc3RydWN0dXJlIGluIFRjbDwvaDM+Ci1HaXZlbiBvdXIgc2ltcGxlIFRjbCBpbnRlcmZhY2UsIGl0IGlzIGVhc3kgdG8gd3JpdGUgVGNsIGZ1bmN0aW9ucyBmb3IgYnVpbGRpbmcgdXAgYSBDIGJpbmFyeSB0cmVlLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBJbnNlcnQgYW4gaXRlbSBpbnRvIGEgdHJlZQotcHJvYyBpbnNlcnRfdHJlZSB7dHJlZSBrZXkgdmFsdWV9IHsKLSAgICBzZXQgdHJlZV9oZWFkIFtUcmVlX2hlYWRfZ2V0ICR0cmVlXQotICAgIHNldCB0cmVlX3ogW1RyZWVfel9nZXQgJHRyZWVdCi0gICAgc2V0IHAgJHRyZWVfaGVhZAotICAgIHNldCB4IFtOb2RlX3JpZ2h0X2dldCAkdHJlZV9oZWFkXQotICAgIHdoaWxlIHtbTm9kZV9rZXlfZ2V0ICR4XSAhPSAiX19lbmRfXyJ9IHsKLSAgICAgICAgc2V0IHAgJHgKLSAgICAgICAgaWYgeyRrZXkgJmx0OyBbTm9kZV9rZXlfZ2V0ICR4XX0gewotCQlzZXQgeCBbTm9kZV9sZWZ0X2dldCAkeF0KLQkgfSB7Ci0JICAgICAgIHNldCB4IFtOb2RlX3JpZ2h0X2dldCAkeF0KLSAgICAgICAgfQotICAgIH0KLSAgICBzZXQgeCBbbmV3X05vZGUgJGtleSAkdmFsdWVdCi0gICAgaWYgeyRrZXkgJmx0OyBbTm9kZV9rZXlfZ2V0ICRwXX0gewotICAgICAgICBOb2RlX2xlZnRfc2V0ICRwICR4Ci0gICAgfSB7Ci0gICAgICAgIE5vZGVfcmlnaHRfc2V0ICRwICR4Ci0gICAgfQotICAgIE5vZGVfbGVmdF9zZXQgJHggJHRyZWVfegotICAgIE5vZGVfcmlnaHRfc2V0ICR4ICR0cmVlX3oKLX0KLQotIyBTZWFyY2ggdHJlZSBhbmQgcmV0dXJuIGFsbCBtYXRjaGVzCi1wcm9jIHNlYXJjaF90cmVlIHt0cmVlIGtleX0gewotICAgIHNldCB0cmVlX2hlYWQgW1RyZWVfaGVhZF9nZXQgJHRyZWVdCi0gICAgc2V0IHRyZWVfeiBbVHJlZV96X2dldCAkdHJlZV0KLSAgICBzZXQgZm91bmQge30KLSAgICBzZXQgeCBbTm9kZV9yaWdodF9nZXQgJHRyZWVfaGVhZF0KLSAgICB3aGlsZSB7W05vZGVfa2V5X2dldCAkeF0gIT0gIl9fZW5kX18ifSB7Ci0gICAgICAgIGlmIHtbTm9kZV9rZXlfZ2V0ICR4XSA9PSAka2V5fSB7Ci0gICAgICAgICAgICBsYXBwZW5kIGZvdW5kIFtOb2RlX3ZhbHVlX2dldCAkeF0KLSAgICAgICAgfQotICAgICAgICBpZiB7JGtleSAmbHQ7IFtOb2RlX2tleV9nZXQgJHhdfSB7Ci0gICAgICAgICAgICBzZXQgeCBbTm9kZV9sZWZ0X2dldCAkeF0KLSAgICAgICAgfSB7Ci0gICAgICAgICAgICBzZXQgeCBbTm9kZV9yaWdodF9nZXQgJHhdCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICRmb3VuZAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSB3cml0dGVuIGluIFRjbCwgdGhlc2UgZnVuY3Rpb25zIGFyZSBidWlsZGluZyB1cCBhIHJlYWwgQyBiaW5hcnkgdHJlZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvdWxkIGJlIHBhc3NlZCBpbnRvIG90aGVyIEMgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgd2UgY291bGQgd3JpdGUgYSBmdW5jdGlvbiB0aGF0IGdsb2JzIGFuIGVudGlyZSBkaXJlY3RvcnkgYW5kIGJ1aWxkcyBhIHRyZWUgc3RydWN0dXJlIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgSW5zZXJ0IGFsbCBvZiB0aGUgZmlsZXMgaW4gcGF0aG5hbWUgaW50byBhIGJpbmFyeSB0cmVlCi0KLXByb2MgYnVpbGRfZGlyX3RyZWUge3RyZWUgcGF0aG5hbWV9IHsKLSAgICBzZXQgZXJyb3IgW2NhdGNoIHtzZXQgZmlsZWxpc3QgW2dsb2IgLW5vY29tcGxhaW4gJHBhdGhuYW1lLypdfV0KLSAgICBpZiB7JGVycm9yID09IDB9IHsKLSAgICAgICAgZm9yZWFjaCBmICRmaWxlbGlzdCB7Ci0gICAgICAgICAgICBpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJGZdID09IDF9IHsKLSAgICAgICAgICAgICAgICBpbnNlcnRfdHJlZSAkdHJlZSBbZmlsZSB0YWlsICRmXSAkZgotICAgICAgICAgICAgICAgIGlmIHtbZmlsZSB0eXBlICRmXSAhPSAibGluayJ9IHtidWlsZF9kaXJfdHJlZSAkdHJlZSAkZn0KLSAgICAgICAgICAgIH0gewotICAgICAgICAgICAgICAgIGluc2VydF90cmVlICR0cmVlIFtmaWxlIHRhaWwgJGZdICRmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdlIGNhbiB0ZXN0IG91dCBvdXIgZnVuY3Rpb24gaW50ZXJhY3RpdmVseSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNvdXJjZSB0cmVlLnRjbAotJSBzZXQgdCBbbmV3X1RyZWVdICAgICAgICMgQ3JlYXRlIGEgbmV3IHRyZWUKLV84MDUzM2M4X1RyZWVfcAotJSBidWlsZF9kaXJfdHJlZSAkdCAvaG9tZS9iZWF6bGV5L1NXSUcvU1dJRzEuMQotJSBzZWFyY2hfdHJlZSAkdCB0Y2wKLS9ob21lL2JlYXpsZXkvU1dJRy9TV0lHMS4xL0V4YW1wbGVzL3RjbCAvaG9tZS9iZWF6bGV5L1NXSUcvU1dJRzEuMS9zd2lnX2xpYi90Y2wKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im40MyI+PC9hPjxoMz4gSW1wbGVtZW50aW5nIG1ldGhvZHMgaW4gQzwvaDM+Ci1XaGlsZSBvdXIgVGNsIG1ldGhvZHMgbWF5IGJlIGZpbmUgZm9yIHNtYWxsIHByb2JsZW1zLCBpdCBtYXkgYmUgZmFzdGVyIHRvIHJlaW1wbGVtZW50IHRoZSBpbnNlcnQgYW5kIHNlYXJjaCBtZXRob2RzIGluIEMgIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGluc2VydF90cmVlKFRyZWUgKnQsIGNoYXIgKmtleSwgY2hhciAqdmFsdWUpIHsKLQlOb2RlICpwOwotCU5vZGUgKng7Ci0JCi0JcCA9IHQtJmd0O2hlYWQ7Ci0JeCA9IHQtJmd0O2hlYWQtJmd0O3JpZ2h0OwotCXdoaWxlICh4ICE9IHQtJmd0O3opIHsKLQkJcCA9IHg7Ci0JCWlmIChzdHJjbXAoa2V5LHgtJmd0O2tleSkgJmx0OyAwKQotCQkJeCA9IHgtJmd0O2xlZnQ7Ci0JCWVsc2UKLQkJCXggPSB4LSZndDtyaWdodDsKLQl9Ci0JeCA9IG5ld19Ob2RlKGtleSx2YWx1ZSk7Ci0JaWYgKHN0cmNtcChrZXkscC0mZ3Q7a2V5KSAmbHQ7IDApIAotCQlwLSZndDtsZWZ0ID0geDsKLQllbHNlCi0JCXAtJmd0O3JpZ2h0ID0geDsKLQl4LSZndDtsZWZ0ID0gdC0mZ3Q7ejsKLQl4LSZndDtyaWdodCA9IHQtJmd0O3o7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIHVzZSB0aGlzIGZ1bmN0aW9uIGluIFRjbCwgc2ltcGx5IHB1dCBhIGRlY2xhcmF0aW9uIGludG8gdGhlIGZpbGUgPHR0PnRyZWUuaDwvdHQ+IG9yIDx0dD50cmVlLmk8L3R0Pi48cD4KLTxwPgotV2hlbiByZWltcGxlbWVudGVkIGluIEMsIHRoZSB1bmRlcmx5aW5nIFRjbCBzY3JpcHQgbWF5IG5vdCBub3RpY2UgdGhlIGRpZmZlcmVuY2UuICBGb3IgZXhhbXBsZSwgb3VyIGRpcmVjdG9yeSBzdWJyb3V0aW5lIHdvdWxkIG5vdCBjYXJlIGlmIDx0dD5pbnNlcnRfdHJlZTwvdHQ+IGhhZCBiZWVuIHdyaXR0ZW4gaW4gVGNsIG9yIEMuICAgT2YgY291cnNlLCBieSB3cml0aW5nIHRoaXMgZnVuY3Rpb24gQywgd2Ugd2lsbCBnZXQgc2lnbmlmaWNhbnRseSBiZXR0ZXIgcGVyZm9ybWFuY2UuIDxwPgotPGEgbmFtZT0ibjQ0Ij48L2E+PGgzPiBCdWlsZGluZyBhbiBvYmplY3Qgb3JpZW50ZWQgQyBpbnRlcmZhY2U8L2gzPgotU28gZmFyIG91ciB0cmVlIGV4YW1wbGUgaGFzIGJlZW4gdXNpbmcgdGhlIGJhc2ljIFNXSUcgaW50ZXJmYWNlLiAgV2l0aCBhIGxpdHRsZSB3b3JrIGluIHRoZSBpbnRlcmZhY2UgZmlsZSwgd2UgY2FuIGltcHJvdmUgdGhlIGludGVyZmFjZSBhIGxpdHRsZSBiaXQuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSB0cmVlCi0lewotI2luY2x1ZGUgInRyZWUuaCIKLSV9Ci0KLSVpbmNsdWRlIHRyZWUuaAotJXsKLQotICAvKiBGdW5jdGlvbiB0byBjb3VudCB1cCBOb2RlcyAqLwotICBzdGF0aWMgIGludCBjb3VudF9ub2RlcyhOb2RlICpuLCBOb2RlICplbmQpIHsKLSAgICBpZiAobiA9PSBlbmQpIHJldHVybiAwOwotICAgIHJldHVybiAxK2NvdW50X25vZGVzKG4tJmd0O2xlZnQsZW5kKStjb3VudF9ub2RlcyhuLSZndDtyaWdodCxlbmQpOwotICB9Ci0KLSV9Ci0KLS8vIEF0dGFjaCBzb21lIG5ldyBtZXRob2RzIHRvIHRoZSBUcmVlIHN0cnVjdHVyZQotCi0lYWRkbWV0aG9kcyBUcmVlIHsKLSAgIHZvaWQgaW5zZXJ0KGNoYXIgKmtleSwgY2hhciAqdmFsdWUpIHsKLSAgICAgICAgaW5zZXJ0X3RyZWUoc2VsZixrZXksdmFsdWUpOwotICAgfQotICAgY2hhciAqc2VhcmNoKGNoYXIgKmtleSkgewotICAgICAgICByZXR1cm4gc2VhcmNoX3RyZWUoc2VsZixrZXkpOwotICAgfQotICAgY2hhciAqZmluZG5leHQoY2hhciAqa2V5KSB7Ci0gICAgIHJldHVybiBmaW5kX25leHQoc2VsZixrZXkpOwotICAgfQotICAgaW50IGNvdW50KCkgewotICAgICByZXR1cm4gY291bnRfbm9kZXMoc2VsZi0mZ3Q7aGVhZC0mZ3Q7cmlnaHQsc2VsZi0mZ3Q7eik7Ci0gICB9Ci0gICBUcmVlKCk7ICAgICAgICAvLyBUaGlzIGlzIGp1c3QgYW5vdGhlciBuYW1lIGZvciBuZXdfVHJlZQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PiVhZGRtZXRob2RzPC90dD4gZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBtZXRob2RzIHRvIGV4aXN0aW5nIHN0cnVjdHVyZXMgYW5kIGNsYXNzZXMuICBJbiB0aGlzIGNhc2UsIHdlIGFyZSBhdHRhY2hpbmcgc29tZSBtZXRob2RzIHRvIHRoZSA8dHQ+VHJlZTwvdHQ+IHN0cnVjdHVyZS4gICBFYWNoIG9mIHRoZSBtZXRob2RzIGFyZSBzaW1wbHkgdmFyaW91cyBDIGZ1bmN0aW9ucyB3ZSBoYXZlIHdyaXR0ZW4gZm9yIGFjY2Vzc2luZyB0cmVlcy4gICBUaGlzIHR5cGUgb2YgaW50ZXJmYWNlIGZpbGUgY29tZXMgaW4gcGFydGljdWxhcmx5IGhhbmR5IHdoZW4gdXNpbmcgdGhlIFRjbCBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlLiBGb3IgZXhhbXBsZSwgd2UgY2FuIHJld3JpdGUgb3VyIGRpcmVjdG9yeSBnbG9iYmVyIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnByb2MgYnVpbGRfZGlyX3RyZWUge3RyZWUgcGF0aG5hbWV9IHsKLSAgICBzZXQgZXJyb3IgW2NhdGNoIHtzZXQgZmlsZWxpc3QgW2dsb2IgLW5vY29tcGxhaW4gJHBhdGhuYW1lLypdfV0KLSAgICBpZiB7JGVycm9yID09IDB9IHsKLSAgICAgICAgZm9yZWFjaCBmICRmaWxlbGlzdCB7Ci0gICAgICAgICAgICBpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJGZdID09IDF9IHsKLSAgICAgICAgICAgICAgICAkdHJlZSBpbnNlcnQgW2ZpbGUgdGFpbCAkZl0gJGYgICAgICAjIE5vdGUgbmV3IGNhbGxpbmcgbWV0aG9kCi0gICAgICAgICAgICAgICAgaWYge1tmaWxlIHR5cGUgJGZdICE9ICJsaW5rIn0ge2J1aWxkX2Rpcl90cmVlICR0cmVlICRmfQotICAgICAgICAgICAgfSB7Ci0gICAgICAgICAgICAgICAgJHRyZWUgaW5zZXJ0IFtmaWxlIHRhaWwgJGZdICRmIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3cgdXNpbmcgaXQgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNvdXJjZSB0cmVlLnRjbAotJSBUcmVlIHQgICAgICAgICAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIG5ldyBUcmVlIG9iamVjdAotXzgwNTQ2MTBfVHJlZV9wCi0lIGJ1aWxkX2Rpcl90cmVlIHQgL2hvbWUvYmVhemxleS9TV0lHL1NXSUcxLjEKLSUgdCBjb3VudAotMTc3MAotJSB0IHNlYXJjaCBnbGF1eC5pCi0vaG9tZS9iZWF6bGV5L1NXSUcvU1dJRzEuMS9FeGFtcGxlcy9PcGVuR0wvZ2xhdXguaQotJSB0IHNlYXJjaCB0eXBlbWFwcwotL2hvbWUvYmVhemxleS9TV0lHL1NXSUcxLjEvRXhhbXBsZXMvcGVybDUvdHlwZW1hcHMKLSUgdCBmaW5kbmV4dCB0eXBlbWFwcwotL2hvbWUvYmVhemxleS9TV0lHL1NXSUcxLjEvRXhhbXBsZXMvcHl0aG9uL3R5cGVtYXBzCi0lIHQgZmluZG5leHQgdHlwZW1hcHMKLS9ob21lL2JlYXpsZXkvU1dJRy9TV0lHMS4xL0V4YW1wbGVzL3RjbC90eXBlbWFwcwotJSB0IGZpbmRuZXh0IHR5cGVtYXBzCi1Ob25lCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdpdGggYSBsaXR0bGUgZXh0cmEgd29yaywgd2UndmUgbWFuYWdlZCB0byB0dXJuIGFuIG9yZGluYXJ5IEMgc3RydWN0dXJlIGludG8gYSBjbGFzcy1saWtlIG9iamVjdCBpbiBUY2wuIDxwPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IEJ1aWxkaW5nIEMvQysrIGRhdGEgc3RydWN0dXJlcyB3aXRoIFRrPC9oMj4KLUdpdmVuIHRoZSBkaXJlY3QgYWNjZXNzIHRvIEMvQysrIG9iamVjdHMgcHJvdmlkZWQgYnkgU1dJRywgaXQgY2FuIGJlIHBvc3NpYmxlIHRvIHVzZSBUayB0byBpbnRlcmFjdGl2ZWx5IGJ1aWxkIGEgdmFyaWV0eSBvZiBpbnRlcmVzdGluZyBkYXRhIHN0cnVjdHVyZXMuICAgIFRvIGRvIHRoaXMsIGl0IGlzIHVzdWFsbHkgdXNlZnVsIHRvIG1haW50YWluIGEgbWFwcGluZyBiZXR3ZWVuIGNhbnZhcyBpdGVtcyBhbmQgYW4gdW5kZXJseWluZyAgQyBkYXRhIHN0cnVjdHVyZS4gIFRoaXMgaXMgZG9uZSB1c2luZyBhc3NvY2lhdGl2ZSBhcnJheXMgdG8gbWFwIEMgcG9pbnRlcnMgdG8gY2FudmFzIGl0ZW1zIGFuZCBjYW52YXMgaXRlbXMgYmFjayB0byBwb2ludGVycy48cD4KLTxwPgotU3VwcG9zZSB0aGF0IHdlIGhhdmUgYSBDIHByb2dyYW0gZm9yIG1hbmlwdWxhdGluZyBkaXJlY3RlZCBncmFwaHMgYW5kIHRoYXQgd2Ugd2FudGVkIHRvIHByb3ZpZGUgYSBUayBpbnRlcmZhY2UgZm9yIGJ1aWxkaW5nIGdyYXBocyB1c2luZyBhIGJhbGwtYW5kLXN0aWNrIG1vZGVsIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD48Y2VudGVyPjxpbWcgc3JjPSJjaDEwLjEucG5nIj48L2NlbnRlcj48cD4KLTxwPgotPHA+Ci1UaGUgU1dJRyBpbnRlcmZhY2UgZmlsZSBmb3IgdGhpcyBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZ3JhcGgKLSV7Ci0jaW5jbHVkZSAiZ3JhcGguaCIKLSV9Ci0KLS8qIEdldCBhIG5vZGUncyBudW1iZXIgKi8KLWludCAgICAgIEdldE51bShOb2RlICpuKTsgICAgICAgICAgICAgICAvKiBHZXQgYSBub2RlJ3MgbnVtYmVyICAgICAgICAgKi8KLUFkakxpc3QgKkdldEFkaihOb2RlICpuKTsgICAgICAgICAgICAgICAvKiBHZXQgYSBub2RlJ3MgYWRqYWNlbmN5IGxpc3QgKi8KLUFkakxpc3QgKkdldE5leHQoQWRqTGlzdCAqbCk7ICAgICAgICAgICAvKiBHZXQgbmV4dCBub2RlIGluIGFkai4gbGlzdCAgKi8KLU5vZGUgICAgKkdldE5vZGUoQWRqTGlzdCAqbCk7ICAgICAgICAgICAvKiBHZXQgbm9kZSBmcm9tIGFkai4gbGlzdCAgICAgKi8KLU5vZGUgICAgKm5ld19ub2RlKCk7ICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIGEgbmV3IG5vZGUgICAgICAgICAgICAgKi8KLXZvaWQgICAgIEFkZExpbmsoTm9kZSAqdjEsIE5vZGUgKnYyKTsgICAvKiBBZGQgYW4gZWRnZSAgICAgICAgICAgICAgICAgKi8KLS4uLiBldGMgLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBpbnRlcmZhY2UgZmlsZSBtYW5pcHVsYXRlcyA8dHQ+Tm9kZTwvdHQ+IGFuZCA8dHQ+QWRqTGlzdDwvdHQ+IHN0cnVjdHVyZXMuICBUaGUgcHJlY2lzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBkb2Vzbid0IG1hdHRlciBoZXJlLS1pbiBmYWN0IFNXSUcgZG9lc24ndCBldmVuIG5lZWQgaXQuICBXaXRoaW4gYSBUY2wvVGsgc2NyaXB0IGhvd2V2ZXIsIHdlIGNhbiBrZWVwIHRyYWNrIG9mIHRoZXNlIG9iamVjdHMgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBNYWtlIGEgbmV3IG5vZGUgYW5kIHB1dCBpdCBvbiB0aGUgY2FudmFzCi1wcm9jIG1rTm9kZSB7eCB5fSB7Ci0gICAgZ2xvYmFsIG5vZGVYIG5vZGVZIG5vZGVQIG5vZGVNYXAgbm9kZUxpc3QgZWRnZUZpcnN0IGVkZ2VTZWNvbmQKLSAgICBzZXQgbmV3IFsuYyBjcmVhdGUgb3ZhbCBbZXhwciAkeC0xNV0gW2V4cHIgJHktMTVdIFwKLQkJIFtleHByICR4KzE1XSBbZXhwciAkeSsxNV0gLW91dGxpbmUgYmxhY2sgXAotCQkgLWZpbGwgd2hpdGUgLXRhZ3Mgbm9kZV0KLSAgICBzZXQgbmV3bm9kZSBbbmV3X25vZGVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgTWFrZSBhIG5ldyBDIE5vZGUKLSAgICBzZXQgbm51bSBbR2V0TnVtICRuZXdub2RlXSAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgR2V0IG91ciBub2RlJ3MgbnVtYmVyCi0gICAgc2V0IGlkIFsuYyBjcmVhdGUgdGV4dCBbZXhwciAkeC00XSBbZXhwciAkeSsxMF0gXAotCSAgICAgLXRleHQgJG5udW0gLWFuY2hvciBzdyAtdGFncyBub2RlaWRdCi0gICAgc2V0IG5vZGVYKCRuZXcpICR4CQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNhdmUgY29vcmRzIG9mIGNhbnZhcyBpdGVtCi0gICAgc2V0IG5vZGVZKCRuZXcpICR5Ci0gICAgc2V0IG5vZGVQKCRuZXcpICRuZXdub2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNhdmUgQyBwb2ludGVyCi0gICAgc2V0IG5vZGVNYXAoJG5ld25vZGUpICRuZXcgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIE1hcCBwb2ludGVyIHRvIFRrIHdpZGdldAotICAgIHNldCBlZGdlRmlyc3QoJG5ldykge30KLSAgICBzZXQgZWRnZVNlY29uZCgkbmV3KSB7fQotICAgIGxhcHBlbmQgbm9kZUxpc3QgJG5ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IyBLZWVwIGEgbGlzdCBvZiBhbGwgQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IyBQb2ludGVycyB3ZSd2ZSBtYWRlCi19Ci0KLSMgTWFrZSBhIG5ldyBlZGdlIGJldHdlZW4gdHdvIG5vZGVzIGFuZCBwdXQgYW4gYXJyb3cgb24gdGhlIGNhbnZhcwotcHJvYyBta0VkZ2Uge2ZpcnN0IHNlY29uZCBuZXd9IHsKLSAgICBnbG9iYWwgbm9kZVAgZWRnZUZpcnN0IGVkZ2VTZWNvbmQKLSAgICBzZXQgZWRnZSBbbWtBcnJvdyAkZmlyc3QgJHNlY29uZF0gICAgICAgICAgICAgICAgICAgOyMgTWFrZSBhbiBhcnJvdwotICAgIGxhcHBlbmQgZWRnZUZpcnN0KCRmaXJzdCkgJGVkZ2UgICAgICAgICAgICAgICAgICAgICA7IyBTYXZlIGluZm9ybWF0aW9uIAotICAgIGxhcHBlbmQgZWRnZVNlY29uZCgkc2Vjb25kKSAkZWRnZQotICAgIGlmIHskbmV3ID09IDF9IHsKLSMgTm93IGFkZCBhbiBlZGdlIHdpdGhpbiBvdXIgQyBkYXRhIHN0cnVjdHVyZQotCUFkZExpbmsgJG5vZGVQKCRmaXJzdCkgJG5vZGVQKCRzZWNvbmQpICAgICAgICAgICA7IyBBZGQgbGluayB0byBDIHN0cnVjdHVyZQotICAgIH0KLX0gCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoZXNlIGZ1bmN0aW9ucywgdGhlIGFycmF5IDx0dD5ub2RlUCgpPC90dD4gYWxsb3dzIHVzIHRvIGFzc29jaWF0ZSBhIHBhcnRpY3VsYXIgY2FudmFzIGl0ZW0gd2l0aCBhIEMgb2JqZWN0LiAgIFdoZW4gbWFuaXB1bGF0aW5nIHRoZSBncmFwaCwgdGhpcyBtYWtlcyBpdCBlYXN5IHRvIG1vdmUgZnJvbSB0aGUgVGNsIHdvcmxkIHRvIEMuICBBIHNlY29uZCBhcnJheSwgPHR0Pm5vZGVNYXAoKTwvdHQ+IGFsbG93cyB1cyB0byBnbyB0aGUgb3RoZXIgd2F5LS1tYXBwaW5nIEMgcG9pbnRlcnMgdG8gY2FudmFzIGl0ZW1zLiAgQSAgbGlzdCA8dHQ+bm9kZUxpc3Q8L3R0PiBrZWVwcyB0cmFjayBvZiBhbGwgb2YgdGhlIG5vZGVzIHdlJ3ZlIGNyZWF0ZWQganVzdCBpbiBjYXNlIHdlIHdhbnQgdG8gZXhhbWluZSBhbGwgb2YgdGhlIG5vZGVzLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgYSBDIGZ1bmN0aW9uIGFkZGVkIG1vcmUgZWRnZXMgdG8gdGhlIGdyYXBoLiAgVG8gcmVmbGVjdCB0aGUgbmV3IHN0YXRlIG9mIHRoZSBncmFwaCwgd2Ugd291bGQgd2FudCB0byBhZGQgbW9yZSBlZGdlcyB0byB0aGUgVGsgY2FudmFzLiAgVGhpcyBtaWdodCBiZSBhY2NvbXBsaXNoZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBMb29rIGF0IHRoZSBDIGRhdGEgc3RydWN0dXJlIGFuZCB1cGRhdGUgdGhlIGNhbnZhcwotcHJvYyBta0VkZ2VzIHt9IHsKLSAgICBnbG9iYWwgbm9kZVggbm9kZVkgbm9kZVAgbm9kZU1hcCBub2RlTGlzdCBlZGdlRmlyc3QgZWRnZVNlY29uZAotICAgIHVuc2V0IGVkZ2VGaXJzdCAKLSAgICB1bnNldCBlZGdlU2Vjb25kIAotICAgIC5jIGRlbGV0ZSBhcmMgICAgICAgICAgICAgICMgRWRnZXMgaGF2ZSBiZWVuIHRhZ2dlZCB3aXRoIGFyYyAobm90IHNob3duKQotCi0gICAgZm9yZWFjaCBub2RlICRub2RlTGlzdCB7ICAgOyMgY2xlYXIgb2xkIGxpc3RzCi0Jc2V0IGVkZ2VGaXJzdCgkbm9kZSkge30KLQlzZXQgZWRnZVNlY29uZCgkbm9kZSkge30KLSAgICB9Ci0gICAgZm9yZWFjaCBub2RlICRub2RlTGlzdCB7ICAgICAgICAgICAgICAgICAgICA7IyBHbyB0aHJvdWdoIGFsbCBvZiB0aGUgbm9kZXMKLQlzZXQgdiAkbm9kZVAoJG5vZGUpICAgICAgICAgICAgICAgICAgICAgIDsjIEdldCB0aGUgbm9kZSBwb2ludGVyIAotCXNldCB2MSBbR2V0QWRqICR2XSAgICAgICAgICAgICAgICAgICAgICAgOyMgR2V0IGl0cyBhZGphY2VuY3kgbGlzdAotCXdoaWxlIHskdjEgIT0gIk5VTEwifSB7ICAgICAgICAgICAKLQkgICAgc2V0IHYyIFtHZXROb2RlICR2MV0gICAgICAgICAgICAgICAgIDsjIEdldCBub2RlIHBvaW50ZXIKLQkgICAgc2V0IHcgJG5vZGVNYXAoJHYyKSAgICAgICAgICAgICAgICAgIDsjIEdldCBjYW52YXMgaXRlbQotCSAgICBta0VkZ2UgJG5vZGUgJHcgMCAgICAgICAgICAgICAgICAgICAgOyMgTWFrZSBhbiBlZGdlIGJldHdlZW4gdGhlbQotCSAgICBzZXQgdjEgW0dldE5leHQgJHYxXSAgICAgICAgICAgICAgICAgOyMgR2V0IG5leHQgbm9kZQotCX0KLSAgICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBmdW5jdGlvbiBtZXJlbHkgc2NhbnMgdGhyb3VnaCBhbGwgb2YgdGhlIG5vZGVzIGFuZCB3YWxrcyBkb3duIHRoZSBhZGphY2VuY3kgbGlzdCBvZiBlYWNoIG9uZS4gICBUaGUgPHR0Pm5vZGVNYXAoKTwvdHQ+IGFycmF5IG1hcHMgQyBwb2ludGVycyBvbnRvIHRoZSBjb3JyZXNwb25kaW5nIGNhbnZhcyBpdGVtcy4gIFdlIHVzZSB0aGlzIHRvIGNvbnN0cnVjdCBlZGdlcyBvbiB0aGUgY2FudmFzIHVzaW5nIHRoZSA8dHQ+bWtFZGdlPC90dD4gZnVuY3Rpb24uPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMj4gQWNjZXNzaW5nIGFycmF5czwvaDI+Ci1JbiBzb21lIGNhc2VzLCBDIGZ1bmN0aW9ucyBtYXkgaW52b2x2ZSBhcnJheXMgYW5kIG90aGVyIG9iamVjdHMuICBJbiB0aGVzZSBpbnN0YW5jZXMsIHlvdSBtYXkgaGF2ZSB0byB3cml0ZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYWNjZXNzLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgYSBDIGZ1bmN0aW9uIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gQWRkIHZlY3RvciBhK2IgLSZndDsgYwotdm9pZCB2ZWN0b3JfYWRkKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKmMsIGludCBzaXplKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU1dJRyBpcyBxdWl0ZSBsaXRlcmFsIGluIGl0cyBpbnRlcnByZXRhdGlvbiBvZiA8dHQ+ZG91YmxlICo8L3R0Pi0taXQgaXMgYSBwb2ludGVyIHRvIGEgPHR0PmRvdWJsZTwvdHQ+LiBUbyBwcm92aWRlIGFjY2VzcywgYSBmZXcgaGVscGVyIGZ1bmN0aW9ucyBjYW4gYmUgd3JpdHRlbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFNXSUcgaGVscGVyIGZ1bmN0aW9ucyBmb3IgZG91YmxlIGFycmF5cwotJWlubGluZSAlewotZG91YmxlICpuZXdfZG91YmxlKGludCBzaXplKSB7Ci0JcmV0dXJuIChkb3VibGUgKikgbWFsbG9jKHNpemUqc2l6ZW9mKGRvdWJsZSkpOwotfQotdm9pZCBkZWxldGVfZG91YmxlKGRvdWJsZSAqYSkgewotCWZyZWUgYTsKLX0KLWRvdWJsZSBnZXRfZG91YmxlKGRvdWJsZSAqYSwgaW50IGluZGV4KSB7Ci0JcmV0dXJuIGFbaW5kZXhdOwotfQotdm9pZCBzZXRfZG91YmxlKGRvdWJsZSAqYSwgaW50IGluZGV4LCBkb3VibGUgdmFsKSB7Ci0JYVtpbmRleF0gPSB2YWw7Ci19Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Vc2luZyBvdXIgQyBmdW5jdGlvbnMgbWlnaHQgd29yayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgVGNsIGNvZGUgdG8gY3JlYXRlIHNvbWUgYXJyYXlzIGFuZCBhZGQgdGhlbQotCi1zZXQgYSBbbmV3X2RvdWJsZSAyMDBdCi1zZXQgYiBbbmV3X2RvdWJsZSAyMDBdCi1zZXQgYyBbbmV3X2RvdWJsZSAyMDBdCi0KLSMgRmlsbCBhIGFuZCBiIHdpdGggc29tZSB2YWx1ZXMKLWZvciB7c2V0IGkgMH0geyRpICZsdDsgMjAwfSB7aW5jciBpIDF9IHsKLQlzZXRfZG91YmxlICRhICRpIDAuMAotCXNldF9kb3VibGUgJGIgJGkgJGkKLX0KLQotIyBBZGQgdGhlbSBhbmQgc3RvcmUgcmVzdWx0IGluIGMKLXZlY3Rvcl9hZGQgJGEgJGIgJGMgMjAwCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBmdW5jdGlvbnMgPHR0PmdldF9kb3VibGU8L3R0PiBhbmQgPHR0PnNldF9kb3VibGU8L3R0PiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiBhbiBhcnJheS4gICBUbyBjb252ZXJ0IGZyb20gVGNsIGxpc3RzIHRvIEMgYXJyYXlzLCBvbmUgY291bGQgd3JpdGUgYSBmZXcgZnVuY3Rpb25zIGluIFRjbCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgVGNsIFByb2NlZHVyZSB0byB0dXJuIGEgbGlzdCBpbnRvIGEgQyBhcnJheQotcHJvYyBUY2wyQXJyYXkge2x9IHsKLQlzZXQgbGVuIFtsbGVuZ3RoICRsXQotCXNldCBhIFtuZXdfZG91YmxlICRsZW5dCi0Jc2V0IGkgMAotCWZvcmVhY2ggaXRlbSAkbCB7Ci0JCXNldF9kb3VibGUgJGEgJGkgJGl0ZW0KLQkJaW5jciBpIDEKLQl9Ci0JcmV0dXJuICRhCi19Ci0KLSMgVGNsIFByb2NlZHVyZSB0byB0dXJuIGEgQyBhcnJheSBpbnRvIGEgVGNsIExpc3QKLXByb2MgQXJyYXkyVGNsIHthIHNpemV9IHsKLQlzZXQgbCB7fQotCWZvciB7c2V0IGkgMH0geyRpICZsdDsgc2l6ZX0ge2luY3IgaSAxfSB7Ci0JCWxhcHBlbmQgJGwgW2dldF9kb3VibGUgJGEgJGldCi0JfQotCXJldHVybiAkbAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSBub3Qgb3B0aW1hbCwgb25lIGNvdWxkIHVzZSB0aGVzZSB0byB0dXJuIGEgVGNsIGxpc3QgaW50byBhIEMgcmVwcmVzZW50YXRpb24uICAgVGhlIEMgcmVwcmVzZW50YXRpb24gY291bGQgYmUgdXNlZCByZXBlYXRlZGx5IGluIGEgdmFyaWV0eSBvZiAgQyBmdW5jdGlvbnMgd2l0aG91dCBoYXZpbmcgdG8gcmVwZWF0ZWRseSBjb252ZXJ0IGZyb20gc3RyaW5ncyAoT2YgY291cnNlLCBpZiB0aGUgVGNsIGxpc3QgY2hhbmdlZCBvbmUgd291bGQgd2FudCB0byB1cGRhdGUgdGhlIEMgdmVyc2lvbikuICBMaWtld2lzZSwgaXQgaXMgcmVsYXRpdmVseSBzaW1wbGUgdG8gZ28gYmFjayBmcm9tIEMgaW50byBUY2wuICAgVGhpcyBpcyBub3QgdGhlIG9ubHkgd2F5IHRvIG1hbmFnZSBhcnJheXMtLXR5cGVtYXBzIGNhbiBiZSB1c2VkIGFzIHdlbGwuICAgVGhlIFNXSUcgbGlicmFyeSBmaWxlIGA8dHQ+YXJyYXkuaTwvdHQ+JyBhbHNvIGNvbnRhaW5zIGEgdmFyaWV0eSBvZiBwcmUtd3JpdHRlbiBoZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBkaWZmZXJlbnQga2luZHMgb2YgYXJyYXlzLjxwPgotPGEgbmFtZT0ibjkiPjwvYT48aDI+IEJ1aWxkaW5nIGEgc2ltcGxlIE9wZW5HTCBtb2R1bGU8L2gyPgotSW4gdGhpcyBleGFtcGxlLCB3ZSBjb25zaWRlciBidWlsZGluZyBhIFNXSUcgbW9kdWxlIG91dCBvZiB0aGUgT3BlbkdMIGdyYXBoaWNzIGxpYnJhcnkuICBUaGUgT3BlbkdMIGxpYnJhcnkgY29uc2lzdHMgb2Ygc2V2ZXJhbCBodW5kcmVkIGZ1bmN0aW9ucyBmb3IgYnVpbGRpbmcgY29tcGxleCAzRCBpbWFnZXMuICAgQnkgd3JhcHBpbmcgdGhpcyBsaWJyYXJ5LCB3ZSB3aWxsIGJlIGFibGUgdG8gcGxheSB3aXRoIGl0IGludGVyYWN0aXZlbHkgZnJvbSBhIFRjbCBpbnRlcnByZXRlci48cD4KLTxhIG5hbWU9Im40NSI+PC9hPjxoMz4gUmVxdWlyZWQgZmlsZXM8L2gzPgotVG8gYnVpbGQgYW4gT3BlbkdMIG1vZHVsZSwgeW91IHdpbGwgbmVlZCB0byBoYXZlIHNvbWUgdmFyaWFudCBvZiBPcGVuR0wgaW5zdGFsbGVkIG9uIHlvdXIgbWFjaGluZS4gIElmIHVuYXZhaWxhYmxlLCB0aGUgTWVzYSBncmFwaGljcyBsaWJyYXJ5IGlzIGFuIE9wZW5HTCBjbG9uZSB0aGF0IHJ1bnMgb24gbW9zdCBtYWNoaW5lcyB0aGF0IHN1cHBvcnQgWDExLiAgIFdlIHdpbGwgdXNlIHRoZSAiR0wvZ2wuaCIsICJHTC9nbHUuaCIsIGFuZCB0aGUgR0wgQXV4aWxsaWFyeSBsaWJyYXJpZXMuPHA+Ci08YSBuYW1lPSJuNDYiPjwvYT48aDM+IFdyYXBwaW5nIGdsLmg8L2gzPgotVGhlIGZpcnN0IHN0ZXAgaXMgdG8gYnVpbGQgYW4gaW50ZXJmYWNlIGZyb20gdGhlIGdsLmggZmlsZS4gIFRvIGRvIHRoaXMsIGZvbGxvdyB0aGVzZSBzdGVwcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5Db3B5IHRoZSBmaWxlIDx0dD5nbC5oPC90dD4gdG8gYSBmaWxlIDx0dD5nbC5pPC90dD4gd2hpY2ggd2lsbCBiZWNvbWUgdGhlIGludGVyZmFjZS4KLTxsaT5FZGl0IHRoZSA8dHQ+Z2wuaTwvdHQ+IGZpbGUgYnkgdGFraW5nIG91dCB1bm5lZWRlZCBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGFuZCBhbnkgb3RoZXIgY2x1dHRlciB0aGF0IHlvdSBmaW5kLgotPGxpPlB1dCB0aGUgZm9sbG93aW5nIGNvZGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGU8dHQ+IGdsLmk8L3R0PiBmaWxlCi08YmxvY2txdW90ZT48cHJlPgotLy8gZ2wuaSA6IFNXSUcgZmlsZSBmb3IgT3BlbkdMCi0lbW9kdWxlIGdsCi0lewotI2luY2x1ZGUgJmx0O0dML2dsLmgmZ3Q7Ci0lfQotCi0uLi4gUmVzdCBvZiBlZGl0ZWQgZ2wuaCBmaWxlIGhlcmUgLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTwvdWw+Ci08cD4KLUEgY3JpdGljYWwgcGFydCBvZiB0aGlzIGZpcnN0IHN0ZXAgaXMgbWFraW5nIHN1cmUgeW91IGhhdmUgdGhlIHByb3BlciBzZXQgb2YgdHlwZWRlZnMgaW4gdGhlIDx0dD5nbC5pPC90dD4gZmlsZS4gIFRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlIHNob3VsZCBpbmNsdWRlIGRlZmluaXRpb25zIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotdHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xlbnVtOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdMYm9vbGVhbjsKLXR5cGVkZWYgdW5zaWduZWQgaW50IEdMYml0ZmllbGQ7Ci10eXBlZGVmIHNpZ25lZCBjaGFyIEdMYnl0ZTsKLXR5cGVkZWYgc2hvcnQgR0xzaG9ydDsKLXR5cGVkZWYgaW50IEdMaW50OwotdHlwZWRlZiBpbnQgR0xzaXplaTsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBHTHVieXRlOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTHVzaG9ydDsKLXR5cGVkZWYgdW5zaWduZWQgaW50IEdMdWludDsKLXR5cGVkZWYgZmxvYXQgR0xmbG9hdDsKLXR5cGVkZWYgZmxvYXQgR0xjbGFtcGY7Ci10eXBlZGVmIGRvdWJsZSBHTGRvdWJsZTsKLXR5cGVkZWYgZG91YmxlIEdMY2xhbXBkOwotdHlwZWRlZiB2b2lkIEdMdm9pZDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im40NyI+PC9hPjxoMz4gV3JhcHBpbmcgZ2x1Lmg8L2gzPgotTmV4dCB3ZSB3cml0ZSBhIG1vZHVsZSBmb3IgdGhlIGdsdSBsaWJyYXJ5LiAgIFRoZSBwcm9jZWR1cmUgaXMgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIDx0dD5nbC5oPC90dD4tLXRoYXQgaXMsIHdlJ2xsIGNvcHkgdGhlIGhlYWRlciBmaWxlIGFuZCBlZGl0IGl0IHNsaWdodGx5LiAgICBJbiB0aGlzIGNhc2UsIDx0dD5nbHUuaDwvdHQ+IGNvbnRhaW5zIGEgZmV3IGZ1bmN0aW9ucyBpbnZvbHZpbmcgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGFycmF5cy4gICBUaGVzZSBtYXkgZ2VuZXJhdGUgZXJyb3JzIG9yIHdhcm5pbmdzLiAgQXMgYSByZXN1bHQsIHdlIGNhbiBzaW1wbHkgZWRpdCB0aG9zZSBkZWNsYXJhdGlvbnMgb3V0LiAgRm9ydHVuYXRlbHksIHRoZXJlIGFyZW4ndCBtYW55IGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMuICAgSWYgYWNjZXNzIGlzIHJlcXVpcmVkIGxhdGVyLCB0aGUgcHJvYmxlbSBjYW4gb2Z0ZW4gYmUgZml4ZWQgd2l0aCB0eXBlbWFwcyBhbmQgaGVscGVyIGZ1bmN0aW9ucy4gVGhlIGZpbmFsIDx0dD5nbHUuaTwvdHQ+IGZpbGUgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZ2x1Ci0lewotI2luY2x1ZGUgJmx0O0dML2dsdS5oJmd0OwotJX0KLQotLi4uIHJlc3Qgb2YgZWRpdGVkIGdsdS5oIGZpbGUgaGVyZSAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotR2l2ZW4gdGhlc2UgdHdvIGZpbGVzLCB3ZSBoYXZlIGEgZmFpcmx5IGNvbXBsZXRlIE9wZW5HTCBwYWNrYWdlLiBVbmZvcnR1bmF0ZWx5LCB3ZSBzdGlsbCBkb24ndCBoYXZlIGFueSBtZWNoYW5pc20gZm9yIG9wZW5pbmcgYSBHTCB3aW5kb3cgYW5kIGNyZWF0aW5nIGltYWdlcy4gICBUbyB0byB0aGlzLCB3ZSBjYW4gd3JhcCB0aGUgT3BlbkdMIGF1eGlsbGlhcnkgbGlicmFyeSB3aGljaCBjb250YWlucyBmdW5jdGlvbnMgdG8gb3BlbiB3aW5kb3dzIGFuZCBkcmF3IHZhcmlvdXMga2luZHMgb2Ygb2JqZWN0cyAod2hpbGUgbm90IHRoZSBtb3N0IHBvd2VyZnVsIGFwcHJvYWNoLCBpdCBpcyB0aGUgc2ltcGxlc3QgdG8gaW1wbGVtZW50IGFuZCB3b3JrcyBvbiBtb3N0IG1hY2hpbmVzKS48cD4KLTxhIG5hbWU9Im40OCI+PC9hPjxoMz4gV3JhcHBpbmcgdGhlIGF1eCBsaWJyYXJ5PC9oMz4KLVdyYXBwaW5nIHRoZSBhdXggbGlicmFyeSBmb2xsb3dzIGV4YWN0bHkgdGhlIHNhbWUgcHJvY2VkdXJlIGFzIGJlZm9yZS4gICBZb3Ugd2lsbCBjcmVhdGUgYSBmaWxlIDx0dD5nbGF1eC5pPC90dD4gc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBGaWxlIDpnbGF1eC5pCi0lbW9kdWxlIGdsYXV4Ci0lewotI2luY2x1ZGUgImdsYXV4LmgiCi0lfQotCi0uLi4gUmVzdCBvZiBlZGl0ZWQgZ2xhdXguaCBmaWxlIC4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNDkiPjwvYT48aDM+IEEgZmV3IGhlbHBlciBmdW5jdGlvbnM8L2gzPgotRmluYWxseSwgdG8gbWFrZSBvdXIgbGlicmFyeSBhIGxpdHRsZSBlYXNpZXIgdG8gdXNlLCB3ZSBuZWVkIHRvIGhhdmUgYSBmZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBhcnJheXMgc2luY2UgcXVpdGUgYSBmZXcgT3BlbkdMIGNhbGxzIHVzZSB0aGVtIGFzIGFyZ3VtZW50cy4gIFNtYWxsIDQgZWxlbWVudCBhcnJheXMgYXJlIHBhcnRpY3VsYXJseSB1c2VmdWwgc28gd2UnbGwgY3JlYXRlIGEgZmV3IGhlbHBlciBmdW5jdGlvbnMgaW4gYSBmaWxlIGNhbGxlZCA8dHQ+aGVscC5pLjwvdHQ+PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gaGVscC5pIDogT3BlbkdMIGhlbHBlciBmdW5jdGlvbnMKLQotJWlubGluZSAlewotR0xmbG9hdCAqbmV3ZnY0KEdMZmxvYXQgYSxHTGZsb2F0IGIsR0xmbG9hdCBjLEdMZmxvYXQgZCkgewotICBHTGZsb2F0ICpmOwotICBmID0gKEdMZmxvYXQgKikgbWFsbG9jKDQqc2l6ZW9mKEdMZmxvYXQpKTsKLSAgZlswXSA9IGE7IGZbMV0gPSBiOyBmWzJdID0gYzsgZlszXSA9IGQ7Ci0gIHJldHVybiBmOwotfQotdm9pZCBzZXRmdjQoR0xmbG9hdCAqZnYsIEdMZmxvYXQgYSwgR0xmbG9hdCBiLCBHTGZsb2F0IGMsIEdMZmxvYXQgZCkgewotICBmdlswXSA9IGE7IGZ2WzFdID0gYjsgZnZbMl0gPSBjOyBmdlszXSA9IGQ7Ci19Ci0lfQotJW5hbWUoZGVsZnY0KSB2b2lkIGZyZWUodm9pZCAqKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im41MCI+PC9hPjxoMz4gQW4gT3BlbkdMIHBhY2thZ2U8L2gzPgotV2hldywgd2UncmUgYWxtb3N0IGRvbmUgbm93LiAgIFRoZSBsYXN0IHRoaW5nIHRvIGRvIGlzIHRvIHBhY2thZ2UgdXAgYWxsIG9mIG91ciBpbnRlcmZhY2UgZmlsZXMgaW50byBhIHNpbmdsZSBmaWxlIGNhbGxlZCA8dHQ+b3BlbmdsLmk8L3R0Pi4gIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotLy8KLS8vIG9wZW5nbC5pLiAgICBTV0lHIEludGVyZmFjZSBmaWxlIGZvciBPcGVuR0wKLSVtb2R1bGUgb3BlbmdsCi0KLSVpbmNsdWRlIGdsLmkgICAgICAgICAvLyBUaGUgbWFpbiBHTCBmdW5jdGlvbnMKLSVpbmNsdWRlIGdsdS5pICAgICAgICAvLyBUaGUgR0xVIGxpYnJhcnkKLSVpbmNsdWRlIGdsYXV4LmkgICAgICAvLyBUaGUgYXV4IGxpYnJhcnkKLSVpbmNsdWRlIGhlbHAuaSAgICAgICAvLyBPdXIgaGVscGVyIGZ1bmN0aW9ucwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyBidWlsZCB0aGUgbW9kdWxlLCB3ZSBjYW4gc2ltcGx5IHJ1biBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyBzd2lnIC10Y2wgb3BlbmdsLmkgICAgICAgICAgICMgIEJ1aWxkIGEgZHluYW1pY2x5IGxvYWRlZCBleHRlbnNpb24KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3I8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT51bml4ICZndDsgc3dpZyAtdGNsIC1sd2lzaC5pIG9wZW5nbC5pICAjIEJ1aWxkIGEgc3RhdGljYWxseSBsaW5rZWQgd2lzaCBleGVjdXRhYmxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUNvbXBpbGUgdGhlIGZpbGUgPHR0Pm9wZW5nbF93cmFwLmM8L3R0PiB3aXRoIHlvdXIgQyBjb21waWxlciBhbmQgbGluayB3aXRoIFRjbCwgVGssIGFuZCBPcGVuR0wgdG8gY3JlYXRlIHRoZSBmaW5hbCBtb2R1bGUuPHA+Ci08YSBuYW1lPSJuNTEiPjwvYT48aDM+IFVzaW5nIHRoZSBPcGVuR0wgbW9kdWxlPC9oMz4KLVRoZSBtb2R1bGUgaXMgbm93IHVzZWQgYnkgd3JpdGluZyBhIFRjbCBzY3JpcHQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5sb2FkIC4vb3BlbmdsLnNvCi1hdXhJbml0RGlzcGxheU1vZGUgW2V4cHIgeyRBVVhfU0lOR0xFIHwgJEFVWF9SR0JBIHwgJEFVWF9ERVBUSH1dCi1hdXhJbml0UG9zaXRpb24gMCAwIDUwMCA1MDAKLWF1eEluaXRXaW5kb3cgIkxpdC1TcGhlcmUiCi0KLSMgc2V0IHVwIG1hdGVyaWFsIHByb3BlcnRpZXMKLXNldCBtYXRfc3BlY3VsYXIgW25ld2Z2NCAxLjAgMS4wIDEuMCAxLjBdCi1zZXQgbWF0X3NoaW5pbmVzcyBbbmV3ZnY0IDUwLjAgMCAwIDBdCi1zZXQgbGlnaHRfcG9zaXRpb24gW25ld2Z2NCAxLjAgMS4wIDEuMCAwLjBdCi0KLWdsTWF0ZXJpYWxmdiAkR0xfRlJPTlQgJEdMX1NQRUNVTEFSICRtYXRfc3BlY3VsYXIKLWdsTWF0ZXJpYWxmdiAkR0xfRlJPTlQgJEdMX1NISU5JTkVTUyAkbWF0X3NoaW5pbmVzcwotZ2xMaWdodGZ2ICRHTF9MSUdIVDAgJEdMX1BPU0lUSU9OICRsaWdodF9wb3NpdGlvbgotZ2xFbmFibGUgJEdMX0xJR0hUSU5HCi1nbEVuYWJsZSAkR0xfTElHSFQwCi1nbERlcHRoRnVuYyAkR0xfTEVRVUFMCi1nbEVuYWJsZSAkR0xfREVQVEhfVEVTVAotCi0jIFNldCB1cCB2aWV3Ci1nbENsZWFyQ29sb3IgMCAwIDAgMAotZ2xDb2xvcjNmIDEuMCAxLjAgMS4wCi1nbE1hdHJpeE1vZGUgJEdMX1BST0pFQ1RJT04KLWdsTG9hZElkZW50aXR5Ci1nbE9ydGhvIC0xIDEgLTEgMSAtMSAxCi1nbE1hdHJpeE1vZGUgJEdMX01PREVMVklFVwotZ2xMb2FkSWRlbnRpdHkKLQotIyBEcmF3IGl0Ci1nbENsZWFyICRHTF9DT0xPUl9CVUZGRVJfQklUCi1nbENsZWFyICRHTF9ERVBUSF9CVUZGRVJfQklUCi1hdXhTb2xpZFNwaGVyZSAwLjUKLQotIyBDbGVhbiB1cAotZGVsZnY0ICRtYXRfc3BlY3VsYXIKLWRlbGZ2NCAkbWF0X3NoaW5pbmVzcwotZGVsZnY0ICRsaWdodF9wb3NpdGlvbgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JbiBvdXIgaW50ZXJwcmV0ZWQgaW50ZXJmYWNlLCBpdCBpcyBwb3NzaWJsZSB0byBpbnRlcmFjdGl2ZWx5IGNoYW5nZSBwYXJhbWV0ZXJzIGFuZCBzZWUgdGhlIGVmZmVjdHMgb2YgdmFyaW91cyBPcGVuR0wgZnVuY3Rpb25zLiAgVGhpcyBhIGdyZWF0IHdheSB0byBmaWd1cmUgb3V0IHdoYXQgdmFyaW91cyBmdW5jdGlvbnMgZG8gYW5kIHRvIHRyeSBkaWZmZXJlbnQgdGhpbmdzIHdpdGhvdXQgaGF2aW5nIHRvIHJlY29tcGlsZSBhbmQgcnVuIGFmdGVyIGVhY2ggY2hhbmdlLjxwPgotPGEgbmFtZT0ibjUyIj48L2E+PGgzPiBQcm9ibGVtcyB3aXRoIHRoZSBPcGVuR0wgaW50ZXJmYWNlPC9oMz4KLVdoaWxlIHRoZSBPcGVuR0wgaW50ZXJmYWNlIHdlIGhhdmUgZ2VuZXJhdGVkIGlzIGZ1bGx5IHVzYWJsZSwgaXQgaXMgbm90IHdpdGhvdXQgcHJvYmxlbXMuPHA+Ci08cD4KLTx1bD4KLTxsaT5PcGVuR0wgY29uc3RhbnRzIGFyZSBpbnN0YWxsZWQgYXMgZ2xvYmFsIHZhcmlhYmxlcy4gIEFzIGEgcmVzdWx0LCBpdCBpcyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBnbG9iYWwga2V5d29yZCB3aGVuIHdyaXRpbmcgVGNsIHN1YnJvdXRpbmVzLiAgRm9yIGV4YW1wbGUgOgotPGJsb2NrcXVvdGU+PHByZT4KLXByb2MgY2xlYXJfc2NyZWFuIHsgfSB7Ci0JZ2xvYmFsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0RFUFRIX0JVRkZFUl9CSVQKLQlnbENsZWFyICRHTF9DT0xPUl9CVUZGRVJfQklUCi0JZ2xDbGVhciAkR0xfREVQVEhfQlVGRkVSX0JJVAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08bGk+QXJyYXlzIG5lZWQgdG8gYmUgYWNjZXNzZWQgdmlhIGhlbHBlciBmdW5jdGlvbnMgc3VjaCBhcyBvdXIgPHR0Pm5ld2Z2NDwvdHQ+KCkgZnVuY3Rpb24uICAgVGhpcyBhcHByb2FjaCBjZXJ0YWlubHkgd29ya3MgYW5kIGl0cyBlYXN5IGVub3VnaCB0byBpbXBsZW1lbnQsIGJ1dCBpdCBtYXkgYmUgcHJlZmVyYWJsZSB0byBjYWxsIGNlcnRhaW4gT3BlbkdMIGZ1bmN0aW9ucyB3aXRoIGEgVGNsIGxpc3QgaW5zdGVhZC4gIEZvciBleGFtcGxlIDoKLTxibG9ja3F1b3RlPjxwcmU+Ci1nbE1hdGVyaWFsZnYgJEdMX0ZST05UICRHTF9TUEVDVUxBUiB7MS4wIDEuMCAxLjAgMS4wfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPC91bD4KLTxwPgotV2hpbGUgdGhlc2UgYXJlIG9ubHkgbWlub3IgYW5ub3lhbmNlcywgaXQgdHVybnMgb3V0IHRoYXQgeW91IGNhbiBhZGRyZXNzIGJvdGggcHJvYmxlbXMgdXNpbmcgU1dJRyB0eXBlbWFwcyAod2hpY2ggYXJlIGRpc2N1c3NlZCBzaG9ydGx5KS48cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gRXhjZXB0aW9uIGhhbmRsaW5nIDwvaDI+Ci1UaGUgPHR0PiVleGNlcHQ8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgdXNlci1kZWZpbmFibGUgZXhjZXB0aW9uIGhhbmRsZXIgaW4gY2hhcmdlIG9mIGNvbnZlcnRpbmcgZXhjZXB0aW9ucyBpbiB5b3VyIEMvQysrIHByb2dyYW0gaW50byBUY2wgZXhjZXB0aW9ucy4gIFRoZSBjaGFwdGVyIG9uIGV4Y2VwdGlvbiBoYW5kbGluZyBjb250YWlucyBtb3JlIGRldGFpbHMsIGJ1dCBzdXBwb3NlIHlvdSBleHRlbmRlZCB0aGUgYXJyYXkgZXhhbXBsZSBpbnRvIGEgQysrIGNsYXNzIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotY2xhc3MgUmFuZ2VFcnJvciB7fTsgICAvLyBVc2VkIGZvciBhbiBleGNlcHRpb24KLQotY2xhc3MgRG91YmxlQXJyYXkgewotICBwcml2YXRlOgotICAgIGludCBuOwotICAgIGRvdWJsZSAqcHRyOwotICBwdWJsaWM6Ci0gICAgLy8gQ3JlYXRlIGEgbmV3IGFycmF5IG9mIGZpeGVkIHNpemUKLSAgICBEb3VibGVBcnJheShpbnQgc2l6ZSkgewotICAgICAgcHRyID0gbmV3IGRvdWJsZVtzaXplXTsKLSAgICAgIG4gPSBzaXplOwotICAgIH0KLSAgICAvLyBEZXN0cm95IGFuIGFycmF5Ci0gICAgfkRvdWJsZUFycmF5KCkgewotICAgICAgIGRlbGV0ZSBwdHI7Ci0gICAgfQotICAgIC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheQotICAgIGludCAgIGxlbmd0aCgpIHsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIC8vIEdldCBhbiBpdGVtIGZyb20gdGhlIGFycmF5IGFuZCBwZXJmb3JtIGJvdW5kcyBjaGVja2luZy4KLSAgICBkb3VibGUgZ2V0aXRlbShpbnQgaSkgewotICAgICAgaWYgKChpICZndDs9IDApICZhbXA7JmFtcDsgKGkgJmx0OyBuKSkKLSAgICAgICAgcmV0dXJuIHB0cltpXTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigpOwotICAgIH0KLQotICAgIC8vIFNldCBhbiBpdGVtIGluIHRoZSBhcnJheSBhbmQgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcuCi0gICAgdm9pZCBzZXRpdGVtKGludCBpLCBkb3VibGUgdmFsKSB7Ci0gICAgICBpZiAoKGkgJmd0Oz0gMCkgJmFtcDsmYW1wOyAoaSAmbHQ7IG4pKQotICAgICAgICBwdHJbaV0gPSB2YWw7Ci0gICAgICBlbHNlIHsKLSAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcigpOwotICAgICAgfQotICAgIH0KLSAgfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcyBjYW4gdGhyb3cgYSBDKysgcmFuZ2UgZXhjZXB0aW9uIGZvciBhbiBvdXQtb2YtYm91bmRzIGFycmF5IGFjY2Vzcy4gICBXZSBjYW4gY2F0Y2ggdGhpcyBpbiBvdXIgVGNsIGV4dGVuc2lvbiBieSBzcGVjaWZ5aW5nIHRoZSBmb2xsb3dpbmcgaW4gYW4gaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQodGNsKSB7Ci0gIHRyeSB7Ci0gICAgJGZ1bmN0aW9uICAgICAgICAgICAgICAgIC8vIEdldHMgc3Vic3RpdHV0ZWQgYnkgYWN0dWFsIGZ1bmN0aW9uIGNhbGwKLSAgfQotICBjYXRjaCAoUmFuZ2VFcnJvcikgewotICAgIGludGVycC0mZ3Q7cmVzdWx0ID0gIkFycmF5IGluZGV4IG91dC1vZi1ib3VuZHMiOwotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0gIH0KLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3IgaW4gVGNsIDguMDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVleGNlcHQodGNsOCkgewotICB0cnkgewotICAgICRmdW5jdGlvbiAgICAgICAgICAgICAgICAvLyBHZXRzIHN1YnN0aXR1dGVkIGJ5IGFjdHVhbCBmdW5jdGlvbiBjYWxsCi0gIH0KLSAgY2F0Y2ggKFJhbmdlRXJyb3IpIHsKLSAgICBUY2xfU2V0U3RyaW5nT2JqKHRjbF9yZXN1bHQsIkFycmF5IGluZGV4IG91dC1vZi1ib3VuZHMiKTsKLSAgICByZXR1cm4gVENMX0VSUk9SOwotICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gdGhlIEMrKyBjbGFzcyB0aHJvd3MgYSA8dHQ+UmFuZ2VFcnJvcjwvdHQ+IGV4Y2VwdGlvbiwgb3VyIHdyYXBwZXIgZnVuY3Rpb25zIHdpbGwgY2F0Y2ggaXQsIHR1cm4gaXQgaW50byBhIFRjbCBleGNlcHRpb24sIGFuZCBhbGxvdyBhIGdyYWNlZnVsIGRlYXRoIGFzIG9wcG9zZWQgdG8ganVzdCBoYXZpbmcgc29tZSBzb3J0IG9mIG15c3RlcmlvdXMgcHJvZ3JhbSBjcmFzaC4gICAgIFdlIGFyZSBub3QgbGltaXRlZCB0byBDKysgZXhjZXB0aW9uIGhhbmRsaW5nLiAgIFBsZWFzZSBzZWUgdGhlIGNoYXB0ZXIgb24gZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBtb3JlIGRldGFpbHMgb24gb3RoZXIgcG9zc2liaWxpdGllcywgaW5jbHVkaW5nIGEgbWV0aG9kIGZvciBsYW5ndWFnZS1pbmRlcGVuZGVudCBleGNlcHRpb24gaGFuZGxpbmcuLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgyPiBUeXBlbWFwczwvaDI+Ci1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyBTV0lHJ3MgdHJlYXRtZW50IG9mIHZhcmlvdXMgQy9DKysgZGF0YXR5cGVzIGNhbiBiZSByZW1hcHBlZCB1c2luZyB0aGUgPHR0PiV0eXBlbWFwPC90dD4gZGlyZWN0aXZlLiAgIFdoaWxlIG5vdCByZXF1aXJlZCwgdGhpcyBzZWN0aW9uIGFzc3VtZXMgc29tZSBmYW1pbGlhcml0eSB3aXRoICBUY2wncyBDIEFQSS4gICBUaGUgcmVhZGVyIGlzIGFkdmlzZWQgdG8gY29uc3VsdCAgYSBUY2wgYm9vay4gIEEgZ2xhbmNlIGF0IHRoZSBjaGFwdGVyIG9uIFNXSUcgdHlwZW1hcHMgd2lsbCBhbHNvIGJlIHVzZWZ1bC4gIDxwPgotPGEgbmFtZT0ibjUzIj48L2E+PGgzPiBXaGF0IGlzIGEgdHlwZW1hcD88L2gzPgotQSB0eXBlbWFwIGlzIG1lY2hhbmlzbSBieSB3aGljaCBTV0lHJ3MgcHJvY2Vzc2luZyBvZiBhIHBhcnRpY3VsYXIgQyBkYXRhdHlwZSBjYW4gYmUgY2hhbmdlZC4gICBBIHNpbXBsZSB0eXBlbWFwIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLQotJXR5cGVtYXAodGNsLGluKSBpbnQgewotCSR0YXJnZXQgPSAoaW50KSBhdG9pKCRzb3VyY2UpOwotCXByaW50ZigiUmVjZWl2ZWQgYW4gaW50ZWdlciA6ICVkXG4iLCR0YXJnZXQpOwotfQotLi4uCi1leHRlcm4gaW50IGZhY3QoaW50IG4pOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UeXBlbWFwcyByZXF1aXJlIGEgbGFuZ3VhZ2UgIG5hbWUsICBtZXRob2QgbmFtZSwgZGF0YXR5cGUsIGFuZCBjb252ZXJzaW9uIGNvZGUuICBGb3IgVGNsLCAidGNsIiBzaG91bGQgYmUgdXNlZCBhcyB0aGUgbGFuZ3VhZ2UgbmFtZS4gIEZvciBUY2wgOC4wLCAidGNsOCIgc2hvdWxkIGJlIHVzZWQgaWYgeW91IGFyZSB1c2luZyB0aGUgbmF0aXZlIG9iamVjdCBpbnRlcmZhY2UuIFRoZSAiaW4iIG1ldGhvZCBpbiB0aGlzIGV4YW1wbGUgcmVmZXJzIHRvIGFuIGlucHV0IGFyZ3VtZW50IG9mIGEgZnVuY3Rpb24uIFRoZSBkYXRhdHlwZSBgaW50JyB0ZWxscyBTV0lHIHRoYXQgd2UgYXJlIHJlbWFwcGluZyBpbnRlZ2Vycy4gIFRoZSBzdXBwbGllZCBjb2RlIGlzIHVzZWQgdG8gY29udmVydCBmcm9tIGEgVGNsIHN0cmluZyB0byB0aGUgY29ycmVzcG9uZGluZyBDIGRhdGF0eXBlLiAgV2l0aGluIHRoZSBzdXBwb3J0aW5nIEMgY29kZSwgdGhlIHZhcmlhYmxlIDx0dD4kc291cmNlPC90dD4gY29udGFpbnMgdGhlIHNvdXJjZSBkYXRhIChhIHN0cmluZyBpbiB0aGlzIGNhc2UpIGFuZCA8dHQ+JHRhcmdldDwvdHQ+IGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGNvbnZlcnNpb24gKGEgQyBsb2NhbCB2YXJpYWJsZSkuICA8cD4KLTxwPgotV2hlbiB0aGUgZXhhbXBsZSBpcyBjb21waWxlZCBpbnRvIGEgVGNsIG1vZHVsZSwgaXQgd2lsbCBvcGVyYXRlIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgZmFjdCA2Ci1SZWNlaXZlZCBhbiBpbnRlZ2VyIDogNgotNzIwCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUEgZnVsbCBkaXNjdXNzaW9uIG9mIHR5cGVtYXBzIGNhbiBiZSBmb3VuZCBpbiB0aGUgbWFpbiBTV0lHIHVzZXJzIHJlZmVyZW5jZS4gIFdlIHdpbGwgcHJpbWFyaWx5IGJlIGNvbmNlcm5lZCB3aXRoIFRjbCB0eXBlbWFwcyBoZXJlLjxwPgotPGEgbmFtZT0ibjU0Ij48L2E+PGgzPiBUY2wgdHlwZW1hcHM8L2gzPgotVGhlIGZvbGxvd2luZyB0eXBlbWFwIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byBUY2wgbW9kdWxlcyA6PHA+Ci08cD4KLTx0dD4ldHlwZW1hcCh0Y2wsaW4pPC90dD4JQ29udmVydHMgYSBzdHJpbmcgdG8gaW5wdXQgZnVuY3Rpb24gYXJndW1lbnRzPHA+Ci08dHQ+JXR5cGVtYXAodGNsLG91dCk8L3R0PglDb252ZXJ0cyByZXR1cm4gdmFsdWUgb2YgYSBDIGZ1bmN0aW9uIHRvIGEgc3RyaW5nPHA+Ci08dHQ+JXR5cGVtYXAodGNsLGZyZWVhcmcpPC90dD4JQ2xlYW5zIHVwIGEgZnVuY3Rpb24gYXJndW1lbnQgKGlmIG5lY2Vzc2FyeSk8cD4KLTx0dD4ldHlwZW1hcCh0Y2wsYXJnb3V0KTwvdHQ+CU91dHB1dCBhcmd1bWVudCBwcm9jZXNzaW5nPHA+Ci08dHQ+JXR5cGVtYXAodGNsLHJldCk8L3R0PglDbGVhbnVwIG9mIGZ1bmN0aW9uIHJldHVybiB2YWx1ZXM8cD4KLTx0dD4ldHlwZW1hcCh0Y2wsY29uc3QpPC90dD4JQ3JlYXRpb24gb2YgVGNsIGNvbnN0YW50czxwPgotPHR0PiV0eXBlbWFwKG1lbWJlcmluKTwvdHQ+CVNldHRpbmcgb2YgQysrIG1lbWJlciBkYXRhPHA+Ci08dHQ+JXR5cGVtYXAobWVtYmVyb3V0KTwvdHQ+CVJldHVybiBvZiBDKysgbWVtYmVyIGRhdGE8cD4KLTx0dD4ldHlwZW1hcCh0Y2wsIGNoZWNrKTwvdHQ+CUNoZWNrIHZhbHVlIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cy48cD4KLTxhIG5hbWU9Im41NSI+PC9hPjxoMz4gVHlwZW1hcCB2YXJpYWJsZXM8L2gzPgotVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbWF5IGJlIHVzZWQgd2l0aGluIHRoZSBDIGNvZGUgdXNlZCBpbiBhIHR5cGVtYXA6PHA+Ci08cD4KLTx0dD4kc291cmNlPC90dD4JU291cmNlIHZhbHVlIG9mIGEgY29udmVyc2lvbjxwPgotPHR0PiR0YXJnZXQ8L3R0PglUYXJnZXQgb2YgY29udmVyc2lvbiAod2hlcmUgdGhlIHJlc3VsdCBzaG91bGQgYmUgc3RvcmVkKTxwPgotPHR0PiR0eXBlPC90dD4JQyBkYXRhdHlwZSBiZWluZyByZW1hcHBlZDxwPgotPHR0PiRtYW5nbGU8L3R0PglNYW5nbGVkIHZlcnNpb24gb2YgZGF0YSAodXNlZCBmb3IgcG9pbnRlciB0eXBlLWNoZWNraW5nKTxwPgotPHR0PiR2YWx1ZTwvdHQ+CVZhbHVlIG9mIGEgY29uc3RhbnQgKGNvbnN0IHR5cGVtYXAgb25seSk8cD4KLTx0dD4kYXJnPC90dD4JT3JpZ2luYWwgZnVuY3Rpb24gYXJndW1lbnQgKHVzdWFsbHkgYSBzdHJpbmcpPHA+Ci08YSBuYW1lPSJuNTYiPjwvYT48aDM+IE5hbWUgYmFzZWQgdHlwZSBjb252ZXJzaW9uPC9oMz4KLVR5cGVtYXBzIGFyZSBiYXNlZCBib3RoIG9uIHRoZSBkYXRhdHlwZSBhbmQgYW4gb3B0aW9uYWwgbmFtZSBhdHRhY2hlZCB0byBhIGRhdGF0eXBlLiAgIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGZvbwotCi0vLyBUaGlzIHR5cGVtYXAgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBjaGFyICoqIGZ1bmN0aW9uIGFyZ3VtZW50cwotJXR5cGVtYXAodGNsLGluKSBjaGFyICoqIHsgLi4uIH0KLQotLy8gVGhpcyB0eXBlbWFwIGlzIGFwcGxpZWQgb25seSB0byBjaGFyICoqIGFyZ3VtZW50cyBuYW1lZCBgYXJndicKLSV0eXBlbWFwKHRjbCxpbikgY2hhciAqKmFyZ3YgeyAuLi4gfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGV4YW1wbGUsIHR3byB0eXBlbWFwcyBhcmUgYXBwbGllZCB0byB0aGUgPHR0PmNoYXIgKio8L3R0PiBkYXRhdHlwZS4gIEhvd2V2ZXIsIHRoZSBzZWNvbmQgdHlwZW1hcCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBhcmd1bWVudHMgbmFtZWQgYDx0dD5hcmd2PC90dD4nLiAgQSBuYW1lZCB0eXBlbWFwIHdpbGwgYWx3YXlzIG92ZXJyaWRlIGFuIHVubmFtZWQgdHlwZW1hcC48cD4KLTxwPgotRHVlIHRvIHRoZSBuYW1lLWJhc2VkIG5hdHVyZSBvZiB0eXBlbWFwcywgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0eXBlbWFwcyBhcmUgaW5kZXBlbmRlbnQgb2YgdHlwZWRlZiBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAodGNsLCBpbikgZG91YmxlIHsKLQkuLi4gZ2V0IGEgZG91YmxlIC4uLgotfQotdm9pZCBmb28oZG91YmxlKTsgICAgICAgICAgICAvLyBVc2VzIHRoZSBhYm92ZSB0eXBlbWFwCi10eXBlZGVmIGRvdWJsZSBSZWFsOwotdm9pZCBiYXIoUmVhbCk7ICAgICAgICAgICAgICAvLyBEb2VzIG5vdCB1c2UgdGhlIGFib3ZlIHR5cGVtYXAgKGRvdWJsZSAhPSBSZWFsKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyBnZXQgYXJvdW5kIHRoaXMgcHJvYmxlbSwgdGhlIDx0dD4lYXBwbHk8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewotCS4uLiBnZXQgYSBkb3VibGUgLi4uCi19Ci12b2lkIGZvbyhkb3VibGUpOwotCi10eXBlZGVmIGRvdWJsZSBSZWFsOyAgICAgICAgIC8vIFVzZXMgdHlwZW1hcAotJWFwcGx5IGRvdWJsZSB7IFJlYWwgfTsgICAgICAvLyBBcHBsaWVzIGFsbCAiZG91YmxlIiB0eXBlbWFwcyB0byBSZWFsLgotdm9pZCBiYXIoUmVhbCk7ICAgICAgICAgICAgICAvLyBOb3cgdXNlcyB0aGUgc2FtZSB0eXBlbWFwLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjU3Ij48L2E+PGgzPiBDb252ZXJ0aW5nICBhIFRjbCBsaXN0IHRvIGEgY2hhciAqKiA8L2gzPgotQSBjb21tb24gcHJvYmxlbSBpbiBtYW55IEMgcHJvZ3JhbXMgaXMgdGhlIHByb2Nlc3Npbmcgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgd2hpY2ggYXJlIHVzdWFsbHkgcGFzc2VkIGluIGFuIGFycmF5IG9mIE5VTEwgdGVybWluYXRlZCBzdHJpbmdzLiAgIFRoZSBmb2xsb3dpbmcgU1dJRyBpbnRlcmZhY2UgZmlsZSBhbGxvd3MgYSBUY2wgbGlzdCB0byBiZSB1c2VkIGFzIGEgPHR0PmNoYXIgKio8L3R0PiBvYmplY3QuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBhcmd2Ci0KLS8vIFRoaXMgdGVsbHMgU1dJRyB0byB0cmVhdCBjaGFyICoqIGFzIGEgc3BlY2lhbCBjYXNlCi0ldHlwZW1hcCh0Y2wsaW4pIGNoYXIgKiogewotICAgICAgICBpbnQgdGVtcGM7Ci0gICAgICAgIGlmIChUY2xfU3BsaXRMaXN0KGludGVycCwkc291cmNlLCZhbXA7dGVtcGMsJmFtcDskdGFyZ2V0KSA9PSBUQ0xfRVJST1IpIAotCQlyZXR1cm4gVENMX0VSUk9SOwotfQotCi0vLyBUaGlzIGdpdmVzIFNXSUcgc29tZSBjbGVhbnVwIGNvZGUgdGhhdCB3aWxsIGdldCBjYWxsZWQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwKLSV0eXBlbWFwKHRjbCxmcmVlYXJnKSBjaGFyICoqIHsKLSAgICAgICAgZnJlZSgoY2hhciAqKSAkc291cmNlKTsKLX0KLQotLy8gUmV0dXJuIGEgY2hhciAqKiBhcyBhIFRjbCBsaXN0Ci0ldHlwZW1hcCh0Y2wsb3V0KSBjaGFyICoqIHsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoJHNvdXJjZVtpXSkgewotICAgICAgICAgICAgIFRjbF9BcHBlbmRFbGVtZW50KGludGVycCwkc291cmNlW2ldKTsKLSAgICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLX0KLQotLy8gTm93IGEgZmV3IHRlc3QgZnVuY3Rpb25zCi0laW5saW5lICV7Ci1pbnQgcHJpbnRfYXJncyhjaGFyICoqYXJndikgewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoYXJndltpXSkgewotICAgICAgICAgcHJpbnRmKCJhcmd2WyVkXSA9ICVzXG4iLCBpLGFyZ3ZbaV0pOwotICAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLQotCi0vLyBSZXR1cm5zIGEgY2hhciAqKiBsaXN0Ci1jaGFyICoqZ2V0X2FyZ3MoKSB7Ci0gICAgc3RhdGljIGNoYXIgKnZhbHVlc1tdID0geyAiRGF2ZSIsICJNaWtlIiwgIlN1c2FuIiwgIkpvaG4iLCAiTWljaGVsbGUiLCAwfTsKLSAgICByZXR1cm4gJmFtcDt2YWx1ZXNbMF07Ci19Ci0KLS8vIEEgZ2xvYmFsIHZhcmlhYmxlCi1jaGFyICphcmdzW10gPSB7ICIxMjMiLCAiNTQiLCAiLTIiLCAiMCIsICJOVUxMIiwgMCB9OwotCi0lfQotJWluY2x1ZGUgdGNsc2guaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIGNvbXBpbGVkLCB3ZSBjYW4gdXNlIG91ciBmdW5jdGlvbnMgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBwcmludF9hcmdzIHtKb2huIEd1aWRvIExhcnJ5fQotYXJndlswXSA9IEpvaG4KLWFyZ3ZbMV0gPSBHdWlkbwotYXJndlsyXSA9IExhcnJ5Ci0zCi0lIHB1dHMgW2dldF9hcmdzXQotRGF2ZSBNaWtlIFN1c2FuIEpvaG4gTWljaGVsbGUKLSUgcHV0cyBbYXJnc19nZXRdCi0xMjMgNTQgLTIgMCBOVUxMCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVBlcmhhcHMgdGhlIG9ubHkgdHJpY2t5IHBhcnQgb2YgdGhpcyBleGFtcGxlIGlzIHRoZSBpbXBsaWNpdCBtZW1vcnkgYWxsb2NhdGlvbiB0aGF0IGlzIHBlcmZvcm1lZCBieSB0aGUgPHR0PlRjbF9TcGxpdExpc3Q8L3R0PiBmdW5jdGlvbi4gIFRvIHByZXZlbnQgYSBtZW1vcnkgbGVhaywgd2UgY2FuIHVzZSB0aGUgU1dJRyAiZnJlZWFyZyIgdHlwZW1hcCB0byBjbGVhbiB1cCB0aGUgYXJndW1lbnQgdmFsdWUgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgaXMgbWFkZS4gSW4gdGhpcyBjYXNlLCB3ZSBzaW1wbHkgZnJlZSB1cCB0aGUgbWVtb3J5IHRoYXQgPHR0PlRjbF9TcGxpdExpc3Q8L3R0PiBhbGxvY2F0ZWQgZm9yIHVzLjxwPgotPGEgbmFtZT0ibjU4Ij48L2E+PGgzPiBSZW1hcHBpbmcgY29uc3RhbnRzPC9oMz4KLUJ5IGRlZmF1bHQsIFNXSUcgaW5zdGFsbHMgQyBjb25zdGFudHMgYXMgVGNsIHJlYWQtb25seSB2YXJpYWJsZXMuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGhhcyB0aGUgdW5kZXNpcmFibGUgc2lkZSBlZmZlY3QgdGhhdCBjb25zdGFudHMgbmVlZCB0byBiZSBkZWNsYXJlZCBhcyAiZ2xvYmFsIiB3aGVuIHVzZWQgaW4gc3Vicm91dGluZXMuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHJvYyBjbGVhcnNjcmVlbiB7IH0gewotCWdsb2JhbCBHTF9DT0xPUl9CVUZGRVJfQklUCi0JZ2xDbGVhciAkR0xfQ09MT1JfQlVGRkVSX0JJVAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JZiB5b3UgaGF2ZSBodW5kcmVkcyBvZiBmdW5jdGlvbnMgaG93ZXZlciwgdGhpcyBxdWlja2x5IGdldHMgYW5ub3lpbmcuICAgSGVyZSdzIGEgZml4IHVzaW5nIGhhc2ggdGFibGVzIGFuZCBTV0lHIHR5cGVtYXBzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBEZWNsYXJlIHNvbWUgVGNsIGhhc2ggdGFibGUgdmFyaWFibGVzCi0lewotc3RhdGljIFRjbF9IYXNoVGFibGUgIGNvbnN0VGFibGU7ICAgICAgLyogSGFzaCB0YWJsZSAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgICAgICAgKnN3aWdjb25zdDsgICAgICAgLyogVGVtcG9yYXJ5IHZhcmlhYmxlICAqLwotc3RhdGljIFRjbF9IYXNoRW50cnkgKmVudHJ5UHRyOyAgICAgICAgLyogSGFzaCBlbnRyeSAgICAgICAgICAqLwotc3RhdGljIGludCAgICAgICAgICAgIGR1bW15OyAgICAgICAgICAgLyogZHVtbXkgdmFsdWUgICAgICAgICAqLwotJX0KLQotLy8gSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZSAoVGhpcyBnb2VzIGluIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbikKLQotJWluaXQgJXsKLSAgVGNsX0luaXRIYXNoVGFibGUoJmFtcDtjb25zdFRhYmxlLFRDTF9TVFJJTkdfS0VZUyk7Ci0lfQotCi0vLyBBIFR5cGVtYXAgZm9yIGNyZWF0aW5nIGNvbnN0YW50IHZhbHVlcwotLy8gJHNvdXJjZSA9IHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQKLS8vICR0YXJnZXQgPSB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQKLQotJXR5cGVtYXAodGNsLGNvbnN0KSBpbnQsIHVuc2lnbmVkIGludCwgbG9uZywgdW5zaWduZWQgbG9uZyB7Ci0gIGVudHJ5UHRyID0gVGNsX0NyZWF0ZUhhc2hFbnRyeSgmYW1wO2NvbnN0VGFibGUsIiR0YXJnZXQiLCZhbXA7ZHVtbXkpOwotICBzd2lnY29uc3QgPSAoaW50ICopIG1hbGxvYyhzaXplb2YoaW50KSk7Ci0gICpzd2lnY29uc3QgPSAkc291cmNlOwotICBUY2xfU2V0SGFzaFZhbHVlKGVudHJ5UHRyLCBzd2lnY29uc3QpOwotICAvKiBNYWtlIGl0IHNvIGNvbnN0YW50cyBjYW4gYWxzbyBiZSB1c2VkIGFzIHZhcmlhYmxlcyAqLwotICBUY2xfTGlua1ZhcihpbnRlcnAsIiR0YXJnZXQiLCAoY2hhciAqKSBzd2lnY29uc3QsIFRDTF9MSU5LX0lOVCB8IFRDTF9MSU5LX1JFQURfT05MWSk7Ci19OwotCi0vLyBOb3cgY2hhbmdlIGludGVnZXIgaGFuZGxpbmcgdG8gbG9vayBmb3IgbmFtZXMgaW4gYWRkaXRpb24gdG8gdmFsdWVzCi0ldHlwZW1hcCh0Y2wsaW4pIGludCwgdW5zaWduZWQgaW50LCBsb25nLCB1bnNpZ25lZCBsb25nIHsKLSAgVGNsX0hhc2hFbnRyeSAqZW50cnlQdHI7Ci0gIGVudHJ5UHRyID0gVGNsX0ZpbmRIYXNoRW50cnkoJmFtcDtjb25zdFRhYmxlLCRzb3VyY2UpOwotICBpZiAoZW50cnlQdHIpIHsKLSAgICAkdGFyZ2V0ID0gKCR0eXBlKSAoKigoaW50ICopIFRjbF9HZXRIYXNoVmFsdWUoZW50cnlQdHIpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgJHRhcmdldCA9ICgkdHlwZSkgYXRvaSgkc291cmNlKTsKLSAgfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiBvdXIgVGNsIGNvZGUsIHdlIGNhbiBub3cgYWNjZXNzIGNvbnN0YW50cyBieSBuYW1lIHdpdGhvdXQgdXNpbmcgdGhlICJnbG9iYWwiIGtleXdvcmQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHJvYyBjbGVhcnNjcmVlbiB7IH0gewotCWdsQ2xlYXIgR0xfQ09MT1JfQlVGRkVSX0JJVAotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNTkiPjwvYT48aDM+IFJldHVybmluZyB2YWx1ZXMgaW4gYXJndW1lbnRzPC9oMz4KLVRoZSAiYXJnb3V0IiB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIHJldHVybiBhIHZhbHVlIG9yaWdpbmF0aW5nIGZyb20gYSBmdW5jdGlvbiBhcmd1bWVudC4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEEgdHlwZW1hcCBkZWZpbmluZyBob3cgdG8gcmV0dXJuIGFuIGFyZ3VtZW50IGJ5IGFwcGVuZGluZyBpdCB0byB0aGUgcmVzdWx0Ci0ldHlwZW1hcCh0Y2wsYXJnb3V0KSBkb3VibGUgKm91dHZhbHVlIHsKLSAgICAgICAgY2hhciBkdGVtcFtUQ0xfRE9VQkxFX1NQQUNFXTsKLSAgICAgICAgVGNsX1ByaW50RG91YmxlKGludGVycCwqKCRzb3VyY2UpLGR0ZW1wKTsKLSAgICAgICAgVGNsX0FwcGVuZEVsZW1lbnQoaW50ZXJwLCBkdGVtcCk7Ci19Ci0KLS8vIEEgdHlwZW1hcCB0ZWxsaW5nIFNXSUcgdG8gaWdub3JlIGFuIGFyZ3VtZW50IGZvciBpbnB1dAotLy8gSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCB0byBwYXNzIGEgcG9pbnRlciB0byB0aGUgQyBmdW5jdGlvbgotJXR5cGVtYXAodGNsLGlnbm9yZSkgZG91YmxlICpvdXR2YWx1ZSB7Ci0Jc3RhdGljIGRvdWJsZSB0ZW1wOyAgICAgICAgIC8qIEEgdGVtcG9yYXJ5IGhvbGRpbmcgcGxhY2UgKi8KLQkkdGFyZ2V0ID0gJmFtcDt0ZW1wOwotfQotCi0vLyBOb3cgYSBmdW5jdGlvbiByZXR1cm5pbmcgdHdvIHZhbHVlcwotaW50IG15cG93KGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpvdXR2YWx1ZSkgewotICAgICAgICBpZiAoKGEgJmx0OyAwKSB8fCAoYiAmbHQ7IDApKSByZXR1cm4gLTE7Ci0gICAgICAgICpvdXR2YWx1ZSA9IHBvdyhhLGIpOwotICAgICAgICByZXR1cm4gMDsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gd3JhcHBlZCwgU1dJRyBtYXRjaGVzIHRoZSA8dHQ+YXJnb3V0PC90dD4gdHlwZW1hcCB0byB0aGUgIjx0dD5kb3VibGUgKm91dHZhbHVlPC90dD4iIGFyZ3VtZW50LiBUaGUgImlnbm9yZSIgdHlwZW1hcCB0ZWxscyBTV0lHIHRvIHNpbXBseSBpZ25vcmUgdGhpcyBhcmd1bWVudCB3aGVuIGdlbmVyYXRpbmcgd3JhcHBlciBjb2RlLiAgQXMgYSByZXN1bHQsIGEgVGNsIGZ1bmN0aW9uIHVzaW5nIHRoZXNlIHR5cGVtYXBzIHdpbGwgd29yayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgbXlwb3cgMiAzICAgICAjIFJldHVybnMgdHdvIHZhbHVlcywgYSBzdGF0dXMgdmFsdWUgYW5kIHRoZSByZXN1bHQKLTAgOAotJQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byB0aGlzIGlzIHRvIHJldHVybiB2YWx1ZXMgaW4gYSBUY2wgdmFyaWFibGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAodGNsLGFyZ291dCkgZG91YmxlICpvdXR2YWx1ZSB7Ci0JY2hhciB0ZW1wW1RDTF9ET1VCTEVfU1BBQ0VdOwotCVRjbF9QcmludERvdWJsZShpbnRlcnAsKigkc291cmNlKSxkdGVtcCk7Ci0JVGNsX1NldFZhcihpbnRlcnAsJGFyZyx0ZW1wLDApOwotfQotJXR5cGVtYXAodGNsLGluKSBkb3VibGUgKm91dHZhbHVlIHsKLQlzdGF0aWMgZG91YmxlIHRlbXA7Ci0JJHRhcmdldCA9ICZhbXA7dGVtcDsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotT3VyIFRjbCBzY3JpcHQgY2FuIG5vdyBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCBzdGF0dXMgW215cG93IDIgMyBhXQotJSBwdXRzICRzdGF0dXMKLTAKLSUgcHV0cyAkYQotOC4wCi0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1IZXJlLCB3ZSBoYXZlIHBhc3NlZCB0aGUgbmFtZSBvZiBhIFRjbCAgdmFyaWFibGUgdG8gb3VyIEMgd3JhcHBlciBmdW5jdGlvbiB3aGljaCB0aGVuIHBsYWNlcyB0aGUgcmV0dXJuIHZhbHVlIGluIHRoYXQgdmFyaWFibGUuICAgVGhpcyBpcyBub3cgdmVyeSBjbG9zZSB0byB0aGUgd2F5IGluIHdoaWNoIGEgQyBmdW5jdGlvbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd291bGQgd29yay48cD4KLTxhIG5hbWU9Im42MCI+PC9hPjxoMz4gTWFwcGluZyBDIHN0cnVjdHVyZXMgaW50byBUY2wgTGlzdHM8L2gzPgotU3VwcG9zZSB5b3UgaGF2ZSBhIEMgc3RydWN0dXJlIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICBsb2dpblsxNl07ICAgICAgICAgICAgLyogTG9naW4gSUQgICovCi0gIGludCAgIHVpZDsgICAgICAgICAgICAgICAgICAvKiBVc2VyIElEICAgKi8KLSAgaW50ICAgZ2lkOyAgICAgICAgICAgICAgICAgIC8qIEdyb3VwIElEICAqLwotICBjaGFyICBuYW1lWzMyXTsgICAgICAgICAgICAgLyogVXNlciBuYW1lICovCi0gIGNoYXIgIGhvbWVbMjU2XTsgICAgICAgICAgICAvKiBIb21lIGRpcmVjdG9yeSAqLwotfSBVc2VyOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1CeSBkZWZhdWx0LCBTV0lHIHdpbGwgc2ltcGx5IHRyZWF0IGFsbCBvY2N1cnJlbmNlcyBvZiAiPHR0PlVzZXI8L3R0PiIgYXMgYSBwb2ludGVyLiAgIFRodXMsIGZ1bmN0aW9ucyBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmV4dGVybiB2b2lkIGFkZF91c2VyKFVzZXIgdSk7Ci1leHRlcm4gVXNlciAqbG9va3VwX3VzZXIoY2hhciAqbmFtZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdpbGwgd29yaywgYnV0IHRoZXkgd2lsbCBiZSB3ZWlyZC4gICBJbiBmYWN0LCB0aGV5IG1heSBub3Qgd29yayBhdCBhbGwgdW5sZXNzIHlvdSB3cml0ZSBoZWxwZXIgZnVuY3Rpb25zIHRvIGNyZWF0ZSB1c2VycyBhbmQgZXh0cmFjdCBkYXRhLiAgICBBIHR5cGVtYXAgY2FuIGJlIHVzZWQgdG8gZml4IHRoaXMgcHJvYmxlbSBob3dldmVyLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFRoaXMgd29ya3MgZm9yIGJvdGggIlVzZXIiIGFuZCAiVXNlciAqIgotJXR5cGVtYXAodGNsLGluKSBVc2VyICogewotCWludCB0ZW1wYzsKLQljaGFyICoqdGVtcGE7Ci0Jc3RhdGljIFVzZXIgdGVtcDsKLQlpZiAoVGNsX1NwbGl0TGlzdChpbnRlcnAsJHNvdXJjZSwmYW1wO3RlbXBjLCZhbXA7dGVtcGEpID09IFRDTF9FUlJPUikgcmV0dXJuIFRDTF9FUlJPUjsKLQlpZiAodGVtcGMgIT0gNSkgewotCQlmcmVlKChjaGFyICopIHRlbXBhKTsKLQkJaW50ZXJwLSZndDtyZXN1bHQgPSAiTm90IGEgdmFsaWQgVXNlciByZWNvcmQiOwotCQlyZXR1cm4gVENMX0VSUk9SOwotCX0KLQkvKiBTcGxpdCBvdXQgdGhlIGRpZmZlcmVudCBmaWVsZHMgKi8KLQlzdHJuY3B5KHRlbXAubG9naW4sdGVtcGFbMF0sMTYpOwotCXRlbXAudWlkID0gYXRvaSh0ZW1wYVsxXSk7Ci0JdGVtcC5naWQgPSBhdG9pKHRlbXBhWzJdKTsKLQlzdHJuY3B5KHRlbXAubmFtZSx0ZW1wYVszXSwzMik7Ci0Jc3RybmNweSh0ZW1wLmhvbWUsdGVtcGFbNF0sMjU2KTsKLQkkdGFyZ2V0ID0gJmFtcDt0ZW1wOwotCWZyZWUoKGNoYXIgKikgdGVtcGEpOwotfQotCi0vLyBEZXNjcmliZSBob3cgd2Ugd2FudCB0byByZXR1cm4gYSB1c2VyIHJlY29yZAotJXR5cGVtYXAodGNsLG91dCkgVXNlciAqIHsKLQljaGFyIHRlbXBbMjBdOwotCWlmICgkc291cmNlKSB7Ci0JVGNsX0FwcGVuZEVsZW1lbnQoaW50ZXJwLCRzb3VyY2UtJmd0O2xvZ2luKTsKLQlzcHJpbnRmKHRlbXAsIiVkIiwkc291cmNlLSZndDt1aWQpOwotCVRjbF9BcHBlbmRFbGVtZW50KGludGVycCx0ZW1wKTsKLQlzcHJpbnRmKHRlbXAsIiVkIiwkc291cmNlLSZndDtnaWQpOwotCVRjbF9BcHBlbmRFbGVtZW50KGludGVycCx0ZW1wKTsKLQlUY2xfQXBwZW5kRWxlbWVudChpbnRlcnAsJHNvdXJjZS0mZ3Q7bmFtZSk7Ci0JVGNsX0FwcGVuZEVsZW1lbnQoaW50ZXJwLCRzb3VyY2UtJmd0O2hvbWUpOwotCX0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlc2UgZnVuY3Rpb24gbWFyc2hhbGwgVGNsIGxpc3RzIHRvIGFuZCBmcm9tIG91ciA8dHQ+VXNlcjwvdHQ+IGRhdGEgc3RydWN0dXJlLiBUaGlzIGFsbG93cyBhIG1vcmUgbmF0dXJhbCBpbXBsZW1lbnRhdGlvbiB0aGF0IHdlIGNhbiB1c2UgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBhZGRfdXNlciB7YmVhemxleSA1MDAgNTAwICJEYXZlIEJlYXpsZXkiICIvaG9tZS9iZWF6bGV5In0KLSUgbG9va3VwX3VzZXIgYmVhemxleQotYmVhemxleSA1MDAgNTAwIHtEYXZlIEJlYXpsZXl9IC9ob21lL2JlYXpsZXkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBpcyBhIG11Y2ggY2xlYW5lciBpbnRlcmZhY2UgKGFsdGhvdWdoIGF0IHRoZSBjb3N0IG9mIHNvbWUgcGVyZm9ybWFuY2UpLiBUaGUgb25seSBjYXV0aW9uIEkgb2ZmZXIgaXMgdGhhdCB0aGUgcG9pbnRlciB2aWV3IG9mIHRoZSB3b3JsZCBpcyBwZXJ2YXNpdmUgdGhyb3VnaG91dCBTV0lHLiBSZW1hcHBpbmcgY29tcGxleCBkYXRhdHlwZXMgbGlrZSB0aGlzIHdpbGwgdXN1YWxseSB3b3JrLCBidXQgZXZlcnkgbm93IGFuZCB0aGVuIHlvdSBtaWdodCBmaW5kIHRoYXQgaXQgYnJlYWtzLiBGb3IgZXhhbXBsZSwgaWYgd2UgbmVlZGVkIHRvIG1hbmlwdWxhdGUgYXJyYXlzIG9mIFVzZXJzIChhbHNvIG1hcHBlZCBhcyBhICI8dHQ+VXNlciAqPC90dD4iKSwgdGhlIHR5cGVtYXBzIGRlZmluZWQgaGVyZSB3b3VsZCBicmVhayBkb3duIGFuZCBzb21ldGhpbmcgZWxzZSB3b3VsZCBiZSBuZWVkZWQuICBDaGFuZ2luZyB0aGUgcmVwcmVzZW50YXRpb24gaW4gdGhpcyBtYW5uZXIgbWF5IGFsc28gYnJlYWsgdGhlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UuIDxwPgotPGEgbmFtZT0ibjYxIj48L2E+PGgzPiBVc2VmdWwgZnVuY3Rpb25zPC9oMz4KLVRoZSBmb2xsb3dpbmcgdGFibGVzIHByb3ZpZGUgc29tZSBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgdXNlZnVsIGluIHdyaXRpbmcgVGNsIHR5cGVtYXBzLiBCb3RoIFRjbCA3LnggYW5kIFRjbCA4LnggYXJlIGNvdmVyZWQuICBGb3IgVGNsIDcueCwgZXZlcnl0aGluZyBpcyBhIHN0cmluZyBzbyB0aGUgaW50ZXJmYWNlIGlzIHJlbGF0aXZlbHkgc2ltcGxlLiBGb3IgVGNsIDgsIGV2ZXJ5dGhpbmcgaXMgbm93IGEgVGNsIG9iamVjdCBzbyBhIG1vcmUgcHJlY2lzZSBzZXQgb2YgZnVuY3Rpb25zIGlzIHJlcXVpcmVkLiBHaXZlbiB0aGUgYWxwaGEtcmVsZWFzZSBzdGF0dXMgb2YgVGNsIDgsIHRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGhlcmUgbWF5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMuPHA+Ci08Y2VudGVyPgotPGltZyBzcmM9ImNoMTAudGFibGUuMS5wbmciPjxicj4KLTxpbWcgc3JjPSJjaDEwLnRhYmxlLjIucG5nIj48YnI+Ci08aW1nIHNyYz0iY2gxMC50YWJsZS4zLnBuZyI+PGJyPgotPGltZyBzcmM9ImNoMTAudGFibGUuNC5wbmciPjxicj4KLTxpbWcgc3JjPSJjaDEwLnRhYmxlLjUucG5nIj48YnI+Ci08aW1nIHNyYz0iY2gxMC50YWJsZS42LnBuZyI+PGJyPgotPGltZyBzcmM9ImNoMTAudGFibGUuNy5wbmciPgotPC9jZW50ZXI+PHA+Ci08cD4KLTxhIG5hbWU9Im42MiI+PC9hPjxoMz4gU3RhbmRhcmQgIHR5cGVtYXBzPC9oMz4KLVRoZSBmb2xsb3dpbmcgdHlwZW1hcHMgc2hvdyBob3cgdG8gY29udmVydCBhIGZldyBjb21tb24ga2luZHMgb2Ygb2JqZWN0cyBiZXR3ZWVuIFRjbCBhbmQgQyAoYW5kIHRvIGdpdmUgYSBiZXR0ZXIgaWRlYSBvZiBob3cgdHlwZW1hcHMgd29yayk8cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iY2gxMC50YWJsZS44LnBuZyI+PGJyPgotPGltZyBzcmM9ImNoMTAudGFibGUuOS5wbmciPjxicj4KLTxpbWcgc3JjPSJjaDEwLnRhYmxlLjEwLnBuZyI+PGJyPgotPGltZyBzcmM9ImNoMTAudGFibGUuMTEucG5nIj4KLTwvY2VudGVyPjxwPgotPHA+Ci08YSBuYW1lPSJuNjMiPjwvYT48aDM+IFBvaW50ZXIgaGFuZGxpbmc8L2gzPgotU1dJRyBwb2ludGVycyBhcmUgbWFwcGVkIGludG8gUHl0aG9uIHN0cmluZ3MgY29udGFpbmluZyB0aGUgaGV4YWRlY2ltYWwgdmFsdWUgYW5kIHR5cGUuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW5kIHJlYWQgcG9pbnRlciB2YWx1ZXMuPHA+Ci08Y2VudGVyPjxpbWcgc3JjPSJjaDEwLnRhYmxlLjEyLnBuZyI+PC9jZW50ZXI+PHA+Ci08cD4KLVRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiB0eXBlbWFwcyBhcyB3ZWxsLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0eXBlbWFwIG1ha2VzIGFuIGFyZ3VtZW50IG9mICI8dHQ+Y2hhciAqYnVmZmVyPC90dD4iIGFjY2VwdCBhIHBvaW50ZXIgaW5zdGVhZCBvZiBhIE5VTEwtdGVybWluYXRlZCBBU0NJSSBzdHJpbmcuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAodGNsLGluKSBjaGFyICpidWZmZXIgewotCWlmIChTV0lHX0dldFB0cigkc291cmNlLCAodm9pZCAqKikgJmFtcDskdGFyZ2V0LCAiJG1hbmdsZSIpKSB7Ci0JCVRjbF9TZXRSZXN1bHQoaW50ZXJwLCJUeXBlIGVycm9yLiBOb3QgYSBwb2ludGVyIiwgVENMX1NUQVRJQyk7Ci0JCXJldHVybiBUQ0xfRVJST1I7Ci0JfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3RlIHRoYXQgdGhlIDx0dD4kbWFuZ2xlPC90dD4gdmFyaWFibGUgZ2VuZXJhdGVzIHRoZSB0eXBlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGF0eXBlIHVzZWQgaW4gdGhlIHR5cGVtYXAuPHA+Ci08cD4KLUJ5IG5vdyB5b3UgaG9wZWZ1bGx5IGhhdmUgdGhlIGlkZWEgdGhhdCB0eXBlbWFwcyBhcmUgYSBwb3dlcmZ1bCBtZWNoYW5pc20gZm9yIGJ1aWxkaW5nIG1vcmUgc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgV2hpbGUgd3JpdGluZyB0eXBlbWFwcyBjYW4gYmUgdGVjaG5pY2FsLCBtYW55IGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gZm9yIHlvdS4gIFNlZSB0aGUgU1dJRyBsaWJyYXJ5IHJlZmVyZW5jZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi48cD4KLTxhIG5hbWU9Im4xMiI+PC9hPjxoMj4gQ29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHdpdGggU1dJRzwvaDI+Ci1BZnRlciB5b3Ugc3RhcnQgdG8gd29yayB3aXRoIFRjbCBmb3IgYXdoaWxlLCB5b3Ugc3VkZGVubHkgcmVhbGl6ZSB0aGF0IHRoZXJlIGFyZSBhbiB1bmltYWdpbmFibGUgbnVtYmVyIG9mIGV4dGVuc2lvbnMsIHRvb2xzLCBhbmQgb3RoZXIgcGFja2FnZXMuICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIHRoZXJlIGFyZSBhYm91dCAyMCBiaWxsaW9uIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBUY2wsIG5vdCBhbGwgb2Ygd2hpY2ggYXJlIGNvbXBhdGlibGUgd2l0aCBlYWNoIGV4dGVuc2lvbiAodGhpcyBpcyB0byBtYWtlIGxpZmUgaW50ZXJlc3Rpbmcgb2YgY291cnNlKS48cD4KLTxwPgotV2hpbGUgU1dJRyBpcyBjZXJ0YWlubHkgbm90IGEgbWFnaWNhbCBzb2x1dGlvbiB0byB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHByb2JsZW0sIGl0IGNhbiBoZWxwIG91dCBhbG90IGluIGEgbnVtYmVyIG9mIGtleSBhcmVhcyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5TV0lHIGdlbmVyYXRlZCBjb2RlIGNhbiBiZSB1c2VkIHdpdGggYWxsIHZlcnNpb25zIG9mIFRjbC9UayBuZXdlciB0aGFuIDcuMy8zLjYuIFRoaXMgaW5jbHVkZXMgdGhlIFRjbCBOZXRzY2FwZSBQbHVnaW4gYW5kIFRjbCA4LjBhMi4KLTxsaT5UaGUgU1dJRyBsaWJyYXJ5IG1lY2hhbmlzbSBjYW4gYmUgdXNlZCB0byBtYW5hZ2UgdmFyaW91cyBjb2RlIGZyYWdtZW50cyBhbmQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgotPGxpPlNXSUcgZ2VuZXJhdGVkIGNvZGUgdXN1YWxseSByZXF1aXJlcyBubyBtb2RpZmljYXRpb24gc28gaXQgaXMgcmVsYXRpdmVseSBlYXN5IHRvIHN3aXRjaCBiZXR3ZWVuIGRpZmZlcmVudCBUY2wgdmVyc2lvbnMgYXMgbmVjZXNzYXJ5IG9yIHVwZ3JhZGUgdG8gYSBuZXdlciB2ZXJzaW9uIHdoZW4gdGhlIHRpbWUgY29tZXMgKG9mIGNvdXJzZSwgdGhlIFN1biBUY2wvVGsgdGVhbSBtaWdodCBoYXZlIGNoYW5nZWQgb3RoZXIgdGhpbmdzIHRvIGtlZXAgeW91IG9jY3VwaWVkKQotPC91bD4KLTxhIG5hbWU9Im42NCI+PC9hPjxoMz4gV3JpdGluZyBhIG1haW4gcHJvZ3JhbSBhbmQgVGNsX0FwcEluaXQoKTwvaDM+Ci1UaGUgdHJhZGl0aW9uYWwgbWV0aG9kIG9mIGNyZWF0aW5nIGEgbmV3IFRjbCBleHRlbnNpb24gcmVxdWlyZWQgYSBwcm9ncmFtbWVyIHRvIHdyaXRlIGEgc3BlY2lhbCBmdW5jdGlvbiBjYWxsZWQgPHR0PlRjbF9BcHBJbml0KCk8L3R0PiB0aGF0IHdvdWxkIGluaXRpYWxpemUgeW91ciBleHRlbnNpb24gYW5kIHN0YXJ0IHRoZSBUY2wgaW50ZXJwcmV0ZXIuICBBIHR5cGljYWwgPHR0PlRjbF9BcHBJbml0KCk8L3R0PiBmdW5jdGlvbiBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIG1haW4uYyAqLwotI2luY2x1ZGUgJmx0O3RjbC5oJmd0OwotCi1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLQlUY2xfTWFpbihhcmdjLGFyZ3YpOwotCWV4aXQoMCk7Ci19Ci0KLWludCBUY2xfQXBwSW5pdChUY2xfSW50ZXJwICppbnRlcnApIHsKLQlpZiAoVGNsX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKLQkJcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0JCi0JLyogSW5pdGlhbGl6ZSB5b3VyIGV4dGVuc2lvbiAqLwotCWlmIChZb3VyX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKLQkJcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0KLQl0Y2xfUmNGaWxlTmFtZSA9ICJ+Ly5teWFwcC50Y2wiOwotCXJldHVybiBUQ0xfT0s7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIHJlbGF0aXZlbHkgc2ltcGxlIHRvIHdyaXRlLCB0aGVyZSBhcmUgdG9ucyBvZiBwcm9ibGVtcyB3aXRoIGRvaW5nIHRoaXMuICBGaXJzdCwgZWFjaCBleHRlbnNpb24gdGhhdCB5b3UgdXNlIHR5cGljYWxseSBoYXMgdGhlaXIgb3duIDx0dD5UY2xfQXBwSW5pdCgpPC90dD4gZnVuY3Rpb24uICAgVGhpcyBmb3JjZXMgeW91IHRvIHdyaXRlIGEgc3BlY2lhbCBvbmUgdG8gaW5pdGlhbGl6ZSBldmVyeXRoaW5nIGJ5IGhhbmQuICAgU2Vjb25kbHksIHRoZSBwcm9jZXNzIG9mIHdyaXRpbmcgYSBtYWluIHByb2dyYW0gYW5kIGluaXRpYWxpemluZyB0aGUgaW50ZXJwcmV0ZXIgdmFyaWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIFRjbCBhbmQgZGlmZmVyZW50IHBsYXRmb3Jtcy4gIEZvciBleGFtcGxlLCBpbiBUY2wgNy40LCB0aGUgdmFyaWFibGUgIjx0dD50Y2xfUmNGaWxlTmFtZTwvdHQ+IiBpcyBhIEMgdmFyaWFibGUgd2hpbGUgaW4gVGNsNy41IGFuZCBuZXdlciB2ZXJzaW9ucyBpdHMgYSBUY2wgdmFyaWFibGUgaW5zdGVhZC4gICBTaW1pbGFybHksIHRoZSA8dHQ+VGNsX0FwcEluaXQ8L3R0PiBmdW5jdGlvbiB3cml0dGVuIGZvciBhIFVuaXggbWFjaGluZSBtaWdodCBub3QgY29tcGlsZSBjb3JyZWN0bHkgb24gYSBNYWMgb3IgV2luZG93cyBtYWNoaW5lLjxwPgotPHA+Ci1JbiBTV0lHLCBpdCBpcyBhbG1vc3QgbmV2ZXIgbmVjZXNzYXJ5IHRvIHdyaXRlIGEgPHR0PlRjbF9BcHBJbml0KCk8L3R0PiBmdW5jdGlvbiBiZWNhdXNlIHRoaXMgaXMgbm93IGRvbmUgYnkgIFNXSUcgbGlicmFyeSAgZmlsZXMgc3VjaCBhcyA8dHQ+dGNsc2guaTwvdHQ+IG9yIDx0dD53aXNoLmk8L3R0Pi4gICAgVG8gZ2l2ZSBhIGJldHRlciBpZGVhIG9mIHdoYXQgdGhlc2UgZmlsZXMgZG8sIGhlcmUncyB0aGUgY29kZSBmcm9tIHRoZSBTV0lHIDx0dD50Y2xzaC5pPC90dD4gZmlsZSB3aGljaCBpcyByb3VnaGx5IGNvbXBhcmFibGUgdG8gdGhlIGFib3ZlIGNvZGU8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyB0Y2xzaC5pIDogU1dJRyBsaWJyYXJ5IGZpbGUgZm9yIHJlYnVpbGRpbmcgdGNsc2gKLSV7Ci0KLS8qIEEgVENMX0FwcEluaXQoKSBmdW5jdGlvbiB0aGF0IGxldHMgeW91IGJ1aWxkIGEgbmV3IGNvcHkKLSAqIG9mIHRjbHNoLgotICoKLSAqIFRoZSBtYWNybyBTV0lHX2luaXQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uCi0gKiBmdW5jdGlvbiBpbiB0aGUgd3JhcHBlciBmaWxlLgotICovCi0KLSNpZm5kZWYgU1dJR19SY0ZpbGVOYW1lCi1jaGFyICpTV0lHX1JjRmlsZU5hbWUgPSAifi8ubXlhcHByYyI7Ci0jZW5kaWYKLQotaW50IFRjbF9BcHBJbml0KFRjbF9JbnRlcnAgKmludGVycCl7Ci0KLSAgaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKQotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0KLSAgLyogTm93IGluaXRpYWxpemUgb3VyIGZ1bmN0aW9ucyAqLwotICBpZiAoU1dJR19pbml0KGludGVycCkgPT0gVENMX0VSUk9SKQotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0KLSNpZiBUQ0xfTUFKT1JfVkVSU0lPTiAmZ3Q7IDcgfHwgVENMX01BSk9SX1ZFUlNJT04gPT0gNyAmYW1wOyZhbXA7IFRDTF9NSU5PUl9WRVJTSU9OICZndDs9IDUKLSAgIFRjbF9TZXRWYXIoaW50ZXJwLCJ0Y2xfcmNGaWxlTmFtZSIsU1dJR19SY0ZpbGVOYW1lLFRDTF9HTE9CQUxfT05MWSk7Ci0jZWxzZQotICAgdGNsX1JjRmlsZU5hbWUgPSBTV0lHX1JjRmlsZU5hbWU7Ci0jZW5kaWYKLSAgcmV0dXJuIFRDTF9PSzsKLX0KLQotI2lmIFRDTF9NQUpPUl9WRVJTSU9OICZndDsgNyB8fCBUQ0xfTUFKT1JfVkVSU0lPTiA9PSA3ICZhbXA7JmFtcDsgVENMX01JTk9SX1ZFUlNJT04gJmd0Oz0gNAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIFRjbF9NYWluKGFyZ2MsIGFyZ3YsIFRjbF9BcHBJbml0KTsKLSAgcmV0dXJuKDApOwotCi19Ci0jZWxzZQotZXh0ZXJuIGludCBtYWluKCk7Ci0jZW5kaWYKLQotJX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBmaWxlIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIGEgbm9ybWFsIDx0dD5UY2xfQXBwSW5pdCgpPC90dD4gZnVuY3Rpb24gZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgYSB2YXJpZXR5IG9mIFRjbCB2ZXJzaW9ucy4gIFdoZW4gaW5jbHVkZWQgaW50byBhbiBpbnRlcmZhY2UgZmlsZSwgdGhlIHN5bWJvbCA8dHQ+U1dJR19pbml0PC90dD4gY29udGFpbnMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiAoVGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBieSBTV0lHIHdoZW4gaXQgY3JlYXRlcyB0aGUgd3JhcHBlciBjb2RlKS4gICBTaW1pbGFybHksIGEgc3RhcnR1cCBmaWxlIGNhbiBiZSBkZWZpbmVkIGJ5IHNpbXBseSBkZWZpbmluZyB0aGUgc3ltYm9sIDx0dD5TV0lHX1JjRmlsZU5hbWU8L3R0Pi4gICBUaHVzLCBhIHR5cGljYWwgaW50ZXJmYWNlIGZpbGUgbWlnaHQgbG9vayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZ3JhcGgKLSV7Ci0jaW5jbHVkZSAiZ3JhcGguaCIKLSNkZWZpbmUgU1dJR19SY0ZpbGVOYW1lICJncmFwaC50Y2wiCi0lfQotCi0laW5jbHVkZSB0Y2xzaC5pCi0KLS4uLiBkZWNsYXJhdGlvbnMgLi4uCi0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQnkgIGluY2x1ZGluZyB0aGUgPHR0PnRjbHNoLmk8L3R0PiwgeW91IGF1dG9tYXRpY2FsbHkgZ2V0IGEgPHR0PlRjbF9BcHBJbml0KCk8L3R0PiBmdW5jdGlvbi4gICBBIHZhcmlldHkgb2YgbGlicmFyeSBmaWxlcyBhcmUgYWxzbyBhdmFpbGFibGUuICA8dHQ+d2lzaC5pPC90dD4gY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBuZXcgd2lzaCBleGVjdXRhYmxlLCA8dHQ+ZXhwZWN0Lmk8L3R0PiBjb250YWlucyB0aGUgbWFpbiBwcm9ncmFtIGZvciBFeHBlY3QsIGFuZCA8dHQ+aXNoLmk8L3R0PiwgPHR0Pml0Y2xzaC5pPC90dD4sIDx0dD5pd2lzaC5pPC90dD4sIGFuZCA8dHQ+aXRrd2lzaC5pPC90dD4gY29udGFpbiBpbml0aWFsaXphdGlvbnMgZm9yIHZhcmlvdXMgaW5jYXJuYXRpb25zIG9mIFtpbmNyIFRjbF0uPHA+Ci08YSBuYW1lPSJuNjUiPjwvYT48aDM+IENyZWF0aW5nIGEgbmV3IHBhY2thZ2UgaW5pdGlhbGl6YXRpb24gbGlicmFyeTwvaDM+Ci1JZiBhIHBhcnRpY3VsYXIgVGNsIGV4dGVuc2lvbiByZXF1aXJlcyBzcGVjaWFsIGluaXRpYWxpemF0aW9uLCB5b3UgY2FuIGNyZWF0ZSBhIHNwZWNpYWwgU1dJRyBsaWJyYXJ5IGZpbGUgdG8gaW5pdGlhbGl6ZSBpdC4gIEZvciBleGFtcGxlLCBhIGxpYnJhcnkgZmlsZSB0byBleHRlbmQgRXhwZWN0IGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBleHBlY3QuaSA6IFNXSUcgTGlicmFyeSBmaWxlIGZvciBFeHBlY3QKLSV7Ci0KLS8qIG1haW4uYyAtIG1haW4oKSBhbmQgc29tZSBsb2dnaW5nIHJvdXRpbmVzIGZvciBleHBlY3QKLQotV3JpdHRlbiBieTogRG9uIExpYmVzLCBOSVNULCAyLzYvOTAKLQotRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHByb2dyYW0gd2FzIHBhaWQgZm9yIGJ5IFUuUy4gdGF4Ci1kb2xsYXJzLiAgVGhlcmVmb3JlIGl0IGlzIHB1YmxpYyBkb21haW4uICBIb3dldmVyLCB0aGUgYXV0aG9yIGFuZCBOSVNUCi13b3VsZCBhcHByZWNpYXRlIGNyZWRpdCBpZiB0aGlzIHByb2dyYW0gb3IgcGFydHMgb2YgaXQgYXJlIHVzZWQuCi0qLwotCi0jaW5jbHVkZSAiZXhwZWN0X2NmLmgiCi0jaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLSNpbmNsdWRlIElOQ0xVREVfVENMCi0jaW5jbHVkZSAiZXhwZWN0X3RjbC5oIgotCi12b2lkCi1tYWluKGFyZ2MsIGFyZ3YpCi1pbnQgYXJnYzsKLWNoYXIgKmFyZ3ZbXTsKLXsKLSAgICAgICAgaW50IHJjID0gMDsKLSAgICAgICAgVGNsX0ludGVycCAqaW50ZXJwID0gVGNsX0NyZWF0ZUludGVycCgpOwotICAgICAgICBpbnQgU1dJR19pbml0KFRjbF9JbnRlcnAgKik7Ci0KLSAgICAgICAgaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlRjbF9Jbml0IGZhaWxlZDogJXNcbiIsaW50ZXJwLSZndDtyZXN1bHQpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEV4cF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkV4cF9Jbml0IGZhaWxlZDogJXNcbiIsaW50ZXJwLSZndDtyZXN1bHQpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTV0lHIGluaXRpYWxpemF0aW9uLiAtLS0gMi8xMS85NiAgKi8KLSAgICAgICAgaWYgKFNXSUdfaW5pdChpbnRlcnApID09IFRDTF9FUlJPUikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJTV0lHIGluaXRpYWxpemF0aW9uIGZhaWxlZDogJXNcbiIsIGludGVycC0mZ3Q7cmVzdWx0KTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhwX3BhcnNlX2FyZ3YoaW50ZXJwLGFyZ2MsYXJndik7Ci0gICAgICAgIC8qIGJlY29tZSBpbnRlcmFjdGl2ZSBpZiByZXF1ZXN0ZWQgb3IgIm5vdGhpbmcgdG8gZG8iICovCi0gICAgICAgIGlmIChleHBfaW50ZXJhY3RpdmUpCi0gICAgICAgICAgICAgICAgKHZvaWQpIGV4cF9pbnRlcnByZXRlcihpbnRlcnApOwotICAgICAgICBlbHNlIGlmIChleHBfY21kZmlsZSkKLSAgICAgICAgICAgICAgICByYyA9IGV4cF9pbnRlcnByZXRfY21kZmlsZShpbnRlcnAsZXhwX2NtZGZpbGUpOwotICAgICAgICBlbHNlIGlmIChleHBfY21kZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgcmMgPSBleHBfaW50ZXJwcmV0X2NtZGZpbGVuYW1lKGludGVycCxleHBfY21kZmlsZW5hbWUpOwotCi0gICAgICAgIC8qIGFzc2VydChleHBfY21kbGluZWNtZHMgIT0gMCkgKi8KLSAgICAgICAgZXhwX2V4aXQoaW50ZXJwLHJjKTsKLSAgICAgICAgLypOT1RSRUFDSEVEKi8KLX0KLSV9Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoZSBldmVudCB0aGF0IHlvdSBuZWVkIHRvIHdyaXRlIGEgbmV3IGxpYnJhcnkgZmlsZSBzdWNoIGFzIHRoaXMsIHRoZSBwcm9jZXNzIHVzdWFsbHkgaXNuJ3QgdG9vIGRpZmZpY3VsdC4gIFN0YXJ0IGJ5IGdyYWJiaW5nIHRoZSBvcmlnaW5hbCA8dHQ+VGNsX0FwcEluaXQoKTwvdHQ+IGZ1bmN0aW9uIGZvciB0aGUgcGFja2FnZS4gIEVuY2xvc2UgaXQgaW4gYSA8dHQ+JXssJX08L3R0PiBibG9jay4gICBOb3cgYWRkIGEgbGluZSB0aGF0IG1ha2VzIGEgY2FsbCB0byA8dHQ+U1dJR19pbml0KCk8L3R0Pi4gICAgVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0byB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB3aGVuIGNvbXBpbGVkLjxwPgotPGEgbmFtZT0ibjY2Ij48L2E+PGgzPiBDb21iaW5pbmcgVGNsL1RrIEV4dGVuc2lvbnM8L2gzPgotQSBzbGlnaHRseSBkaWZmZXJlbnQgcHJvYmxlbSBjb25jZXJucyB0aGUgbWl4aW5nIG9mIHZhcmlvdXMgZXh0ZW5zaW9ucy4gIE1vc3QgZXh0ZW5zaW9ucyBkb24ndCByZXF1aXJlIGFueSBzcGVjaWFsIGluaXRpYWxpemF0aW9uIG90aGVyIHRoYW4gY2FsbGluZyB0aGVpciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gIFRvIGRvIHRoaXMsIHdlIGFsc28gdXNlIFNXSUcgbGlicmFyeSBtZWNoYW5pc20uICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gYmx0LmkgOiBTV0lHIGxpYnJhcnkgZmlsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBCTFQgZXh0ZW5zaW9uCi0lewotI2lmZGVmIF9fY3BsdXNwbHVzIAotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWV4dGVybiBpbnQgQmx0X0luaXQoVGNsX0ludGVycCAqKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0lfQotJWluaXQgJXsKLQlpZiAoQmx0X0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKLQkJcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0lfQotCi0KLS8vIHRpeC5pIDogU1dJRyBsaWJyYXJ5IGZpbGUgZm9yIGluaXRpYWxpemluZyB0aGUgVGl4IGV4dGVuc2lvbgotJXsKLSNpZmRlZiBfX2NwbHVzcGx1cyAKLWV4dGVybiAiQyIgewotI2VuZGlmCi1leHRlcm4gaW50IFRpeF9Jbml0KFRjbF9JbnRlcnAgKik7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotJX0KLSVpbml0ICV7Ci0JaWYgKFRpeF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7Ci0JCXJldHVybiBUQ0xfRVJST1I7Ci0JfQotJX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQm90aCBmaWxlcyBkZWNsYXJlIHRoZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKHRvIGJlIEMrKyBmcmllbmRseSwgdGhpcyBzaG91bGQgYmUgZG9uZSB1c2luZyA8dHQ+ZXh0ZXJuICJDIjwvdHQ+KS4gICAgQSBjYWxsIHRvIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyB0aGVuIHBsYWNlZCBpbnNpZGUgYSA8dHQ+JWluaXQgJXsgLi4uICV9PC90dD4gYmxvY2suICA8cD4KLTxwPgotVG8gdXNlIG91ciBsaWJyYXJ5IGZpbGVzIGFuZCBidWlsZCBhIG5ldyB2ZXJzaW9uIG9mIHdpc2gsIHdlIG1pZ2h0IG5vdyBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBteXdpc2guaSA6IHdpc2ggd2l0aCBhIGJ1bmNoIG9mIHN0dWZmIGFkZGVkIHRvIGl0Ci0laW5jbHVkZSB3aXNoLmkKLSVpbmNsdWRlIGJsdC5pCi0laW5jbHVkZSB0aXguaQotCi0uLi4gYWRkaXRpb25hbCBkZWNsYXJhdGlvbnMgLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU9mIGNvdXJzZSwgdGhlIHJlYWxseSBjb29sIHBhcnQgYWJvdXQgYWxsIG9mIHRoaXMgaXMgdGhhdCB0aGUgZmlsZSBgPHR0Pm15d2lzaC5pPC90dD4nIGNhbiBpdHNlbGYsIHNlcnZlIGFzIGEgbGlicmFyeSBmaWxlLiAgIFRodXMsIHdoZW4gYnVpbGRpbmcgdmFyaW91cyB2ZXJzaW9ucyBvZiBUY2wsIHdlIGNhbiBwbGFjZSBldmVyeXRoaW5nIHdlIHdhbnQgdG8gdXNlIGEgc3BlY2lhbCBmaWxlIGFuZCB1c2UgaXQgaW4gYWxsIG9mIG91ciBvdGhlciBpbnRlcmZhY2UgZmlsZXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIGludGVyZmFjZS5pCi0lbW9kdWxlIG15bW9kdWxlCi0KLSVpbmNsdWRlIG15d2lzaC5pICAgICAgICAgICAgICAvLyBCdWlsZCBvdXIgdmVyc2lvbiBvZiBUY2wgd2l0aCBleHRlbnNpb25zCi0KLS4uLiBDIGRlY2xhcmF0aW9ucyAuLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotb3Igd2UgY2FuIGdyYWIgaXQgb24gdGhlIGNvbW1hbmQgbGluZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dW5peCAmZ3Q7IHN3aWcgLXRjbCAtbG15d2lzaC5pIGludGVyZmFjZS5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42NyI+PC9hPjxoMz4gTGltaXRhdGlvbnMgdG8gdGhpcyBhcHByb2FjaDwvaDM+Ci1UaGlzIGludGVyZmFjZSBnZW5lcmF0aW9uIGFwcHJvYWNoIGlzIGxpbWl0ZWQgYnkgdGhlIGNvbXBhdGliaWxpdHkgb2YgZWFjaCBleHRlbnNpb24geW91IHVzZS4gIElmIGFueSBvbmUgZXh0ZW5zaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIG9mIFRjbCB5b3UgYXJlIHVzaW5nLCB5b3UgbWF5IGJlIG91dCBvZiBsdWNrLiAgSXQgaXMgYWxzbyBjcml0aWNhbCB0byBwYXkgY2FyZWZ1bCBhdHRlbnRpb24gdG8gbGlicmFyaWVzIGFuZCBpbmNsdWRlIGZpbGVzLiAgQW4gZXh0ZW5zaW9uIGxpYnJhcnkgY29tcGlsZWQgYWdhaW5zdCBhbiBvbGRlciB2ZXJzaW9uIG9mIFRjbCBtYXkgZmFpbCB3aGVuIGxpbmtlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbi4gIDxwPgotPGEgbmFtZT0ibjY4Ij48L2E+PGgzPiBEeW5hbWljIGxvYWRpbmcgPC9oMz4KLU5ld2VyIHZlcnNpb25zIG9mIFRjbCBzdXBwb3J0IGR5bmFtaWMgbG9hZGluZy4gICBXaXRoIGR5bmFtaWMgbG9hZGluZywgeW91IGNvbXBpbGUgZWFjaCBleHRlbnNpb24gaW50byBhIHNlcGFyYXRlIG1vZHVsZSB0aGF0IGNhbiBiZSBsb2FkZWQgYXQgcnVuIHRpbWUuICAgVGhpcyBzaW1wbGlmaWVzIGEgbnVtYmVyIG9mIGNvbXBpbGF0aW9uIGFuZCBleHRlbnNpb24gYnVpbGRpbmcgcHJvYmxlbXMgYXQgdGhlIGV4cGVuc2Ugb2YgY3JlYXRpbmcgbmV3IG9uZXMuICBNb3N0IG5vdGFibHksIHRoZSBkeW5hbWljIGxvYWRpbmcgcHJvY2VzcyB2YXJpZXMgd2lkZWx5IGJldHdlZW4gbWFjaGluZXMgYW5kIGlzIG5vdCBldmVuIHN1cHBvcnRlZCBpbiBzb21lIGNhc2VzLiAgIEl0IGFsc28gZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggQysrIHByb2dyYW1zIHRoYXQgdXNlIHN0YXRpYyBjb25zdHJ1Y3RvcnMuICAgTW9kdWxlcyBsaW5rZWQgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBUY2wgbWF5IG5vdCB3b3JrIHdpdGggbmV3ZXIgdmVyc2lvbnMgYXMgd2VsbCAoYWx0aG91Z2ggU1dJRyBvbmx5IHJlYWxseSB1c2VzIHRoZSBiYXNpYyBUY2wgQyBpbnRlcmZhY2UpLiAgQXMgYSByZXN1bHQsIEkgdXN1YWxseSBmaW5kIG15c2VsZiB1c2luZyBib3RoIGR5bmFtaWMgYW5kIHN0YXRpYyBsaW5raW5nIGFzIGFwcHJvcHJpYXRlLiA8cD4KLTxhIG5hbWU9Im42OSI+PC9hPjxoMz4gVHVybmluZyBhIFNXSUcgbW9kdWxlIGludG8gYSBUY2wgUGFja2FnZS48L2gzPgotVGNsIDcuNCBpbnRyb2R1Y2VkIHRoZSBpZGVhIG9mIGFuIGV4dGVuc2lvbiBwYWNrYWdlLiAgIEJ5IGRlZmF1bHQsIFNXSUcgZG9lcyBub3QgY3JlYXRlICJwYWNrYWdlcyIsIGJ1dCBpdCBpcyByZWxhdGl2ZWx5IGVhc3kgdG8gZG8uICAgVG8gbWFrZSBhIEMgZXh0ZW5zaW9uIGludG8gYSBUY2wgcGFja2FnZSwgeW91IG5lZWQgdG8gcHJvdmlkZSBhIGNhbGwgdG8gPHR0PlRjbF9Qa2dQcm92aWRlKCkgPC90dD5pbiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uPHR0Pi48L3R0PiAgIFRoaXMgY2FuIGJlIGRvbmUgaW4gYW4gaW50ZXJmYWNlIGZpbGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWluaXQgJXsKLSAgICAgICAgVGNsX1BrZ1Byb3ZpZGUoaW50ZXJwLCJleGFtcGxlIiwiMC4wIik7Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGVyZSAiZXhhbXBsZSIgaXMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgYW5kICIwLjAiIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlLiAgPHA+Ci08cD4KLU5leHQsIGFmdGVyIGJ1aWxkaW5nIHRoZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGUsIHlvdSBuZWVkIHRvIGV4ZWN1dGUgdGhlICI8dHQ+cGtnX21rSW5kZXg8L3R0PiIgY29tbWFuZCBpbnNpZGUgdGNsc2guICAgRm9yIGV4YW1wbGUgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyB0Y2xzaAotJSBwa2dfbWtJbmRleCAuIGV4YW1wbGUuc28KLSUgZXhpdAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGNyZWF0ZXMgYSBmaWxlICI8dHQ+cGtnSW5kZXgudGNsPC90dD4iIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2thZ2UuICAgIFRvIHVzZSB5b3VyPHA+Ci1wYWNrYWdlLCB5b3Ugbm93IG5lZWQgdG8gbW92ZSBpdCB0byBpdHMgb3duIHN1YmRpcmVjdG9yeSB3aGljaCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcGFja2FnZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi4vZXhhbXBsZS8KLQkgICBwa2dJbmRleC50Y2wgICAgICAgICAgICMgVGhlIGZpbGUgY3JlYXRlZCBieSBwa2dfbWtJbmRleAotCSAgIGV4YW1wbGUuc28gICAgICAgICAgICAgIyBUaGUgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRmluYWxseSwgYXNzdW1pbmcgdGhhdCB5b3UncmUgbm90IGVudGlyZWx5IGNvbmZ1c2VkIGF0IHRoaXMgcG9pbnQsIG1ha2Ugc3VyZSB0aGF0IHRoZSBleGFtcGxlIHN1YmRpcmVjdG9yeSBpcyB2aXNpYmxlIGZyb20gdGhlIGRpcmVjdG9yaWVzIGNvbnRhaW5lZCBpbiBlaXRoZXIgdGhlIDx0dD50Y2xfbGlicmFyeTwvdHQ+IG9yIDx0dD5hdXRvX3BhdGg8L3R0PiB2YXJpYWJsZXMuICBBdCB0aGlzIHBvaW50IHlvdSdyZSByZWFkeSB0byB1c2UgdGhlIHBhY2thZ2UgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotdW5peCAmZ3Q7IHRjbHNoCi0lIHBhY2thZ2UgcmVxdWlyZSBleGFtcGxlCi0lIGZhY3QgNAotMjQKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSWYgIHlvdSdyZSB3b3JraW5nIHdpdGggYW4gZXhhbXBsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHRoaXMgZG9lc24ndCB3b3JrLCBkbyB0aGlzIGluc3RlYWQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnVuaXggJmd0OyB0Y2xzaAotJSBsYXBwZW5kIGF1dG9fcGF0aCAuCi0lIHBhY2thZ2UgcmVxdWlyZSBleGFtcGxlCi0lIGZhY3QgNAotMjQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BcyBhIGZpbmFsIG5vdGUsIG1vc3QgU1dJRyBleGFtcGxlcyBkbyBub3QgeWV0IHVzZSB0aGUgPHR0PnBhY2thZ2U8L3R0PiBjb21tYW5kcy4gRm9yIHNpbXBsZSBleHRlbnNpb25zIGl0IG1heSBiZSBlYXNpZXIganVzdCB0byB1c2UgdGhlIDx0dD5sb2FkPC90dD4gY29tbWFuZCBpbnN0ZWFkLjxwPgotPGEgbmFtZT0ibjEzIj48L2E+PGgyPiBCdWlsZGluZyBuZXcga2luZHMgb2YgVGNsIGludGVyZmFjZXMgKGluIFRjbCk8L2gyPgotT25lIG9mIHRoZSBtb3N0IGludGVyZXN0aW5nIGFzcGVjdHMgb2YgVGNsIGFuZCBTV0lHIGlzIHRoYXQgeW91IGNhbiBjcmVhdGUgZW50aXJlbHkgbmV3IGtpbmRzIG9mIFRjbCBpbnRlcmZhY2VzIGluIFRjbCB1c2luZyB0aGUgbG93LWxldmVsIFNXSUcgYWNjZXNzb3IgZnVuY3Rpb25zLiAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSAgaGFkIGEgbGlicmFyeSBvZiBoZWxwZXIgZnVuY3Rpb25zIHRvIGFjY2VzcyBhcnJheXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIEZpbGUgOiBhcnJheS5pICovCi0lbW9kdWxlIGFycmF5Ci0KLSVpbmxpbmUgJXsKLWRvdWJsZSAqbmV3X2RvdWJsZShpbnQgc2l6ZSkgewotICAgICAgICByZXR1cm4gKGRvdWJsZSAqKSBtYWxsb2Moc2l6ZSpzaXplb2YoZG91YmxlKSk7Ci19Ci12b2lkIGRlbGV0ZV9kb3VibGUoZG91YmxlICphKSB7Ci0gICAgICAgIGZyZWUoYSk7Ci19Ci1kb3VibGUgZ2V0X2RvdWJsZShkb3VibGUgKmEsIGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gYVtpbmRleF07Ci19Ci12b2lkIHNldF9kb3VibGUoZG91YmxlICphLCBpbnQgaW5kZXgsIGRvdWJsZSB2YWwpIHsKLSAgICAgICAgYVtpbmRleF0gPSB2YWw7Ci19Ci1pbnQgKm5ld19pbnQoaW50IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIChpbnQgKikgbWFsbG9jKHNpemUqc2l6ZW9mKGludCkpOwotfQotdm9pZCBkZWxldGVfaW50KGludCAqYSkgewotICAgICAgICBmcmVlKGEpOwotfQotaW50IGdldF9pbnQoaW50ICphLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGFbaW5kZXhdOwotfQotaW50IHNldF9pbnQoaW50ICphLCBpbnQgaW5kZXgsIGludCB2YWwpIHsKLSAgICAgICAgYVtpbmRleF0gPSB2YWw7Ci19Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGlsZSB0aGVzZSBjb3VsZCBiZSBjYWxsZWQgZGlyZWN0bHksIHdlIGNvdWxkIGFsc28gd3JpdGUgYSBUY2wgc2NyaXB0IGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHJvYyBBcnJheSB7dHlwZSBzaXplfSB7Ci0gICAgc2V0IHB0ciBbbmV3XyR0eXBlICRzaXplXQotICAgIHNldCBjb2RlIHsKLSAgICAgICAgc2V0IG1ldGhvZCBbbGluZGV4ICRhcmdzIDBdCi0gICAgICAgIHNldCBwYXJtcyBbY29uY2F0ICRwdHIgW2xyYW5nZSAkYXJncyAxIGVuZF1dCi0gICAgICAgIHN3aXRjaCAkbWV0aG9kIHsKLSAgICAgICAgICAgIGdldCB7cmV0dXJuIFtldmFsICJnZXRfJHR5cGUgJHBhcm1zIl19Ci0gICAgICAgICAgICBzZXQge3JldHVybiBbZXZhbCAic2V0XyR0eXBlICRwYXJtcyJdfQotICAgICAgICAgICAgZGVsZXRlIHtldmFsICJkZWxldGVfJHR5cGUgJHB0cjsgcmVuYW1lICRwdHIge30ifQotICAgICAgICB9Ci0gICAgfQotICAgICMgQ3JlYXRlIGEgcHJvY2VkdXJlCi0gICAgdXBsZXZlbCAicHJvYyAkcHRyIGFyZ3Mge3NldCBwdHIgJHB0cjsgc2V0IHR5cGUgJHR5cGU7JGNvZGV9IgotICAgIHJldHVybiAkcHRyCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU91ciBzY3JpcHQgYWxsb3dzIGVhc3kgYXJyYXkgYWNjZXNzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnNldCBhIFtBcnJheSBkb3VibGUgMTAwXSAgICAgICAgICAgICAgICAgICA7IyBDcmVhdGUgYSBkb3VibGUgWzEwMF0KLWZvciB7c2V0IGkgMH0geyRpICZsdDsgMTAwfSB7aW5jciBpIDF9IHsgICAgICA7IyBDbGVhciB0aGUgYXJyYXkKLQkkYSBzZXQgJGkgMC4wCi19Ci0kYSBzZXQgMyAzLjE0NTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgU2V0IGFuIGluZGl2aWR1YWwgZWxlbWVudAotc2V0IGIgWyRhIGdldCAxMF0gICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFJldHJpZXZlIGFuIGVsZW1lbnQKLQotc2V0IGlhIFtBcnJheSBpbnQgNTBdICAgICAgICAgICAgICAgICAgICAgIDsjIENyZWF0ZSBhbiBpbnRbNTBdCi1mb3Ige3NldCBpIDB9IHskaSAmbHQ7IDUwfSB7aW5jciBpIDF9IHsgICAgICAgOyMgQ2xlYXIgaXQKLQkkaWEgc2V0ICRpIDAKLX0KLSRpYSBzZXQgMyA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IyBTZXQgYW4gaW5kaXZpZHVhbCBlbGVtZW50Ci1zZXQgaWIgWyRpYSBnZXQgMTBdICAgICAgICAgICAgICAgICAgICAgICAgOyMgR2V0IGFuIGluZGl2aWR1YWwgZWxlbWVudAotCi0kYSBkZWxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgRGVzdHJveSBhCi0kaWEgZGVsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgRGVzdHJveSBpYQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgY29vbCB0aGluZyBhYm91dCB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgaXQgbWFrZXMgYSBjb21tb24gaW50ZXJmYWNlIGZvciB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGFycmF5cy4gICBJbiBmYWN0LCBpZiB3ZSB3ZXJlIHRvIGFkZCBtb3JlIEMgZGF0YXR5cGVzIHRvIG91ciB3cmFwcGVyIGZpbGUsIHRoZSBUY2wgY29kZSB3b3VsZCB3b3JrIHdpdGggdGhvc2UgYXMgd2VsbC0td2l0aG91dCBtb2RpZmljYXRpb24uICAgIElmIGFuIHVuc3VwcG9ydGVkIGRhdGF0eXBlIHdhcyByZXF1ZXN0ZWQsIHRoZSBUY2wgY29kZSB3b3VsZCBzaW1wbHkgcmV0dXJuIHdpdGggYW4gZXJyb3Igc28gdGhlcmUgaXMgdmVyeSBsaXR0bGUgZGFuZ2VyIG9mIGJsb3dpbmcgc29tZXRoaW5nIHVwICAoYWx0aG91Z2ggaXQgaXMgZWFzaWx5IGFjY29tcGxpc2hlZCB3aXRoIGFuIG91dCBvZiBib3VuZHMgYXJyYXkgYWNjZXNzKS48cD4KLTxhIG5hbWU9Im43MCI+PC9hPjxoMz4gU2hhZG93IGNsYXNzZXM8L2gzPgotQSBzaW1pbGFyIGFwcHJvYWNoIGNhbiBiZSBhcHBsaWVkIHRvIHNoYWRvdyBjbGFzc2VzLiAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyBwcm92aWRlZCBieSBFcmlrIEJpZXJ3YWdlbiBhbmQgUGF1bCBTYXhlLiAgIFRvIHVzZSBpdCwgcnVuIFNXSUcgd2l0aCB0aGUgPHR0Pi1ub29iamVjdDwvdHQ+IG9wdGlvbiAod2hpY2ggZGlzYWJsZXMgdGhlIGJ1aWx0aW4gb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSkuICAgV2hlbiBydW5uaW5nIFRjbCwgc2ltcGx5IHNvdXJjZSB0aGlzIGZpbGUuICAgTm93LCBvYmplY3RzIGNhbiBiZSB1c2VkIGluIGEgbW9yZSBvciBsZXNzIG5hdHVyYWwgZmFzaGlvbi48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIHN3aWdfYysrLnRjbAotIyBQcm92aWRlcyBhIHNpbXBsZSBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHVzaW5nCi0jIFNXSUcncyBsb3cgbGV2ZWwgaW50ZXJmYWNlLgotIwotCi1wcm9jIG5ldyB7b2JqZWN0VHlwZSBoYW5kbGVfciBhcmdzfSB7Ci0gICAgIyBDcmVhdGVzIGEgbmV3IFNXSUcgb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlLAotICAgICMgcmV0dXJuaW5nIGEgaGFuZGxlIGluIHRoZSB2YXJpYWJsZSAiaGFuZGxlX3IiLgotICAgICMKLSAgICAjIEFsc28gY3JlYXRlcyBhIHByb2NlZHVyZSBmb3IgdGhlIG9iamVjdCBhbmQgYSB0cmFjZSBvbgotICAgICMgdGhlIGhhbmRsZSB2YXJpYWJsZSB0aGF0IGRlbGV0ZXMgdGhlIG9iamVjdCB3aGVuIHRoZQotICAgICMgaGFuZGxlIHZhcmliYWxlIGlzIG92ZXJ3cml0dGVuIG9yIHVuc2V0Ci0gICAgdXB2YXIgJGhhbmRsZV9yIGhhbmRsZQotICAgICMKLSAgICAjIENyZWF0ZSB0aGUgbmV3IG9iamVjdAotICAgICMKLSAgICBldmFsIHNldCBoYW5kbGUgXFtuZXdfJG9iamVjdFR5cGUgJGFyZ3NcXQotICAgICMKLSAgICAjIFNldCB1cCB0aGUgb2JqZWN0IHByb2NlZHVyZQotICAgICMKLSAgICBwcm9jICRoYW5kbGUge2NtZCBhcmdzfSAiZXZhbCAke29iamVjdFR5cGV9X1wkY21kICRoYW5kbGUgXCRhcmdzIgotICAgICMKLSAgICAjIEFuZCB0aGUgdHJhY2UgLi4uCi0gICAgIwotICAgIHVwbGV2ZWwgdHJhY2UgdmFyaWFibGUgJGhhbmRsZV9yIHV3ICJ7ZGVsZXRlT2JqZWN0ICRvYmplY3RUeXBlICRoYW5kbGV9IgotICAgICMKLSAgICAjIFJldHVybiB0aGUgaGFuZGxlIHNvIHRoYXQgJ25ldycgY2FuIGJlIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gYSBwcm9jZWR1cmUKLSAgICAjCi0gICAgcmV0dXJuICRoYW5kbGUKLX0KLQotcHJvYyBkZWxldGVPYmplY3Qge29iamVjdFR5cGUgaGFuZGxlIG5hbWUgZWxlbWVudCBvcH0gewotICAgICMKLSAgICAjIENoZWNrIHRoYXQgdGhlIG9iamVjdCBoYW5kbGUgaGFzIGEgcmVhc29uYWJsZSBmb3JtCi0gICAgIwotICAgIGlmIHshW3JlZ2V4cCB7X1swLTlhLWZdKl8oLispX3B9ICRoYW5kbGVdfSB7Ci0gICAgICAgIGVycm9yICJkZWxldGVPYmplY3Q6IG5vdCBhIHZhbGlkIG9iamVjdCBoYW5kbGU6ICRoYW5kbGUiCi0gICAgfQotICAgICMKLSAgICAjIFJlbW92ZSB0aGUgb2JqZWN0IHByb2NlZHVyZQotICAgICMKLSAgICBjYXRjaCB7cmVuYW1lICRoYW5kbGUge319Ci0gICAgIwotICAgICMgRGVsZXRlIHRoZSBvYmplY3QKLSAgICAjCi0gICAgZGVsZXRlXyRvYmplY3RUeXBlICRoYW5kbGUKLX0KLQotcHJvYyBkZWxldGUge2hhbmRsZV9yfSB7Ci0gICAgIwotICAgICMgQSBzeW5vbnltIGZvciB1bnNldCB0aGF0IGlzIG1vcmUgZmFtaWxpYXIgdG8gQysrIHByb2dyYW1tZXJzCi0gICAgIwotICAgIHVwbGV2ZWwgdW5zZXQgJGhhbmRsZV9yCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRvIHVzZSB0aGlzIGZpbGUsIHdlIHNpbXBseSBzb3VyY2UgaXQgYW5kIGV4ZWN1dGUgY29tbWFuZHMgc3VjaCBhcyAibmV3IiBhbmQgImRlbGV0ZSIgdG8gbWFuaXB1bGF0ZSBvYmplY3RzLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIGxpc3QuaQotJW1vZHVsZSBMaXN0Ci0lewotI2luY2x1ZGUgImxpc3QuaCIKLSV9Ci0KLS8vIFZlcnkgc2ltcGxlIEMrKyBleGFtcGxlCi0KLWNsYXNzIExpc3QgewotcHVibGljOgotICBMaXN0KCk7ICAvLyBDcmVhdGUgYSBuZXcgbGlzdAotICB+TGlzdCgpOyAvLyBEZXN0cm95IGEgbGlzdAotICBpbnQgIHNlYXJjaChjaGFyICp2YWx1ZSk7Ci0gIHZvaWQgaW5zZXJ0KGNoYXIgKik7ICAvLyBJbnNlcnQgYSBuZXcgaXRlbSBpbnRvIHRoZSBsaXN0Ci0gIHZvaWQgcmVtb3ZlKGNoYXIgKik7ICAvLyBSZW1vdmUgaXRlbSBmcm9tIGxpc3QKLSAgY2hhciAqZ2V0KGludCBuKTsgICAgIC8vIEdldCB0aGUgbnRoIGl0ZW0gaW4gdGhlIGxpc3QKLSAgaW50ICBsZW5ndGg7ICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgbGlzdAotc3RhdGljIHZvaWQgcHJpbnQoTGlzdCAqbCk7ICAvLyBQcmludCBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0Ci19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ob3cgYSBUY2wgc2NyaXB0IHVzaW5nIHRoZSBpbnRlcmZhY2UuLi48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5sb2FkIC4vbGlzdC5zbyBsaXN0ICAgICAgIDsgIyBMb2FkIHRoZSBtb2R1bGUKLXNvdXJjZSBzd2lnX2MrKy50Y2wgICAgICAgOyAjIFNvdXJjZSB0aGUgb2JqZWN0IGZpbGUKLQotbmV3IExpc3QgbAotJGwgaW5zZXJ0IERhdmUKLSRsIGluc2VydCBKb2huCi0kbCBpbnNlcnQgR3VpZG8KLSRsIHJlbW92ZSBEYXZlCi1wdXRzICRsIGxlbmd0aF9nZXQKLQotZGVsZXRlIGwKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGNvb2wgdGhpbmcgYWJvdXQgdGhpcyBleGFtcGxlIGlzIHRoYXQgaXQgd29ya3Mgd2l0aCBhbnkgQysrIG9iamVjdCB3cmFwcGVkIGJ5IFNXSUcgYW5kIHJlcXVpcmVzIG5vIHNwZWNpYWwgY29tcGlsYXRpb24uICAgIFByb29mIHRoYXQgYSBzaG9ydCwgYnV0IGNsZXZlciBUY2wgc2NyaXB0IGNhbiBiZSBjb21iaW5lZCB3aXRoIFNXSUcgdG8gZG8gbWFueSBpbnRlcmVzdGluZyB0aGluZ3MuPHA+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDI+IEV4dGVuZGluZyB0aGUgVGNsIE5ldHNjYXBlIFBsdWdpbjwvaDI+Ci1TV0lHIGNhbiBiZSB1c2VkIHRvIGV4dGVuZCB0aGUgVGNsIE5ldHNjYXBlIHBsdWdpbiB3aXRoIEMgZnVuY3Rpb25zLiBBcyBvZiB0aGlzIHdyaXRpbmcgaXQgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgd2l0aCB2ZXJzaW9uIDEuMCBvZiB0aGUgcGx1Z2luIG9uIFNvbGFyaXMgYW5kIElyaXggNi4yLiAgSXQgbWF5IHdvcmsgb24gb3RoZXIgbWFjaGluZXMgYXMgd2VsbC4gSG93ZXZlciwgZmlyc3QgYSB3b3JkIG9mIGNhdXRpb24gLS0tIGRvaW5nIHRoaXMgbWlnaHQgcmVzdWx0IGluIHNlcmlvdXMgaW5qdXJ5IGFzIHlvdSBjYW4gYWRkIGp1c3QgYWJvdXQgYW55IEMgZnVuY3Rpb24geW91IHdhbnQuICAgRnVydGhlcm1vcmUsIGl0J3Mgbm90IHBvcnRhYmxlIChoZXksIHdlJ3JlIHRhbGtpbmcgQyBjb2RlIGhlcmUpLiAgICBJdCBzZWVtcyBsaWtlIHRoZSBiZXN0IGFwcGxpY2F0aW9uIG9mIHRoaXMgd291bGQgYmUgY3JlYXRpbmcgYSBicm93c2VyIGludGVyZmFjZSB0byBhIGhpZ2hseSBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbi4gIEFueSBzY3JpcHRzIHRoYXQgeW91IHdvdWxkIHdyaXRlIHdvdWxkIG5vdCB3b3JrIG9uIG90aGVyIG1hY2hpbmVzIHVubGVzcyB0aGV5IGFsc28gaW5zdGFsbGVkIHRoZSBDIGV4dGVuc2lvbiBjb2RlIGFzIHdlbGwuICBQZXJoYXBzIHdlIHNob3VsZCBjYWxsIHRoaXMgYSBwbHVnaW4tcGx1Z2luLi4uPHA+Ci08cD4KLVRvIHVzZSB0aGUgcGx1Z2luLCB1c2UgdGhlIDx0dD4tcGx1Z2luPC90dD4gb3B0aW9uIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zd2lnIC10Y2wgLXBsdWdpbiBpbnRlcmZhY2UuaQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGFkZHMgYSAic2FmZSIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gY29tcGF0aWJsZSB3aXRoIHRoZSBwbHVnaW4gKGluIHJlYWxpdHksIGl0IGp1c3QgY2FsbHMgdGhlIGZ1bmN0aW9uIFNXSUcgYWxyZWFkeSBjcmVhdGVzKS4gICAgWW91IGFsc28gbmVlZCB0byBwdXQgdGhlIGZvbGxvd2luZyBzeW1ib2wgaW4geW91ciBpbnRlcmZhY2UgZmlsZSBmb3IgaXQgdG8gd29yayA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXsKLSNkZWZpbmUgU0FGRV9TV0lHCi0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZm9sa3MgYXQgU3VuIGFyZSBxdWl0ZSBjb25jZXJuZWQgYWJvdXQgdGhlIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBvZiB0aGlzIHNvcnQgb2YgZXh0ZW5zaW9uIGFuZCBvcmlnaW5hbGx5IHdhbnRlZCB0aGUgdXNlciB0byBtb2RpZnkgdGhlIHdyYXBwZXIgY29kZSBieSBoYW5kIHRvICJyZW1pbmQiIHRoZW0gdGhhdCB0aGV5IHdlcmUgaW5zdGFsbGluZyBmdW5jdGlvbnMgaW50byBhIHNhZmUgaW50ZXJwcmV0ZXIuICAgSG93ZXZlciwgaGF2aW5nIHNlZW4gYWxvdCBvZiBTV0lHIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUsIEkgaGF0ZWQgdGhhdCBpZGVhIChva2F5LCBzbyB0aGUgb3V0cHV0IG9mIFNXSUcgaXMganVzdCBhIGxpdHRsZSBtZXNzeSkuICAgIFRoaXMgaXMgY29tcHJvbWlzZS0teW91IG5lZWQgdG8gcHV0IHRoYXQgPHR0PiNkZWZpbmU8L3R0PiBpbnRvIHlvdXIgQyBmaWxlIHNvbWVwbGFjZS4gIFlvdSBjYW4gYWxzbyBqdXN0IG1ha2UgaXQgYSBjb21waWxlciBvcHRpb24gaWYgeW91IHdvdWxkIGxpa2UuPHA+Ci08YSBuYW1lPSJuNzEiPjwvYT48aDM+IFRoZSBzdGVwLWJ5LXN0ZXAgcHJvY2VzcyBmb3IgbWFraW5nIGEgcGx1Z2luIGV4dGVuc2lvbi48L2gzPgotTWFraW5nIGEgcGx1Z2luIGV4dGVuc2lvbiBpcyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCBidXQgeW91IG5lZWQgdG8gZm9sbG93IHRoZXNlIHN0ZXBzIDo8cD4KLTxwPgotPHVsPgotPGxpPk1ha2Ugc3VyZSB5b3UgaGF2ZSBUY2w3LjYvVGs0LjIgaW5zdGFsbGVkIG9uIHlvdXIgbWFjaGluZS4gICBXZSdyZSBnb2luZyB0byBuZWVkIHRoZSBoZWFkZXIgZmlsZXMgaW50byBvcmRlciB0byBjb21waWxlIHRoZSBleHRlbnNpb24uCi08bGk+TWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBOZXRzY2FwZSBwbHVnaW4gcHJvcGVybHkgaW5zdGFsbGVkLgotPGxpPlJ1biBTV0lHIHVzaW5nIHRoZSBgPHR0Pi10Y2wgLXBsdWdpbjwvdHQ+JyBvcHRpb25zLiAKLTxsaT5Db21waWxlIHRoZSBleHRlbnNpb24gdXNpbmcgdGhlIFRjbCA3LjYvVGs0LjIgaGVhZGVyIGZpbGVzLCBidXQgbGlua2luZyBhZ2FpbnN0IHRoZSBwbHVnaW4gaXRzZWxmLiAgRm9yIGV4YW1wbGUgOgotPGJsb2NrcXVvdGU+PHByZT4KLXVuaXggJmd0OyBnY2MgLUkvdXNyL2xvY2FsL2luY2x1ZGUgLWMgZXhhbXBsZS5vIGludGVyZmFjZV93cmFwLmMgCi11bml4ICZndDsgbGQgLXNoYXJlZCBleGFtcGxlLm8gaW50ZXJmYWNlX3dyYXAubyBcCi0gICAgICAgLUwvaG9tZS9iZWF6bGV5Ly5uZXRzY2FwZS9wbHVnaW5zL2xpYnRjbHBsdWdpbi5zbyAtbyBleGFtcGxlLnNvIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08bGk+Q29weSB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIHRvIHRoZSA8dHQ+fi8udGNscGx1Zy90Y2w3Ljc8L3R0PiBkaXJlY3RvcnkuCi08L3VsPgotPGEgbmFtZT0ibjcyIj48L2E+PGgzPiBVc2luZyB0aGUgcGx1Z2luPC9oMz4KLVRvIHVzZSB0aGUgcGx1Z2luLCBwbGFjZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBUY2wgc2NyaXB0cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+bG9hZCAkdGNsX2xpYnJhcnkvZXhhbXBsZS5zbyBleGFtcGxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdpdGggbHVjaywgeW91IHdpbGwgbm93IGJlIHJlYWR5IHRvIHJ1biAoYXQgbGVhc3QgdGhhdCdzIHRoZSB0aGVvcnkpLjxwPgotPGEgbmFtZT0ibjE1Ij48L2E+PGgyPiBUY2w4LjAgZmVhdHVyZXM8L2gyPgotU1dJRyAxLjEgbm93IHN1cHBvcnRzIFRjbCA4LjAuICBIb3dldmVyLCBjb25zaWRlcmluZyB0aGUgYmV0YSByZWxlYXNlIG5hdHVyZSBvZiBUY2wgOC4wLCBhbnl0aGluZyBwcmVzZW50ZWQgaGVyZSBpcyBzdWJqZWN0IHRvIGNoYW5nZS4gIEN1cnJlbnRseSBvbmx5IFRjbCA4LjBiMSBpcyBzdXBwb3J0ZWQuICBOb25lIG9mIHRoZSBhbHBoYSByZWxlYXNlcyBhcmUgc3VwcG9ydGVkIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUgQyBBUEkuIDxwPgotPHA+Ci1UaGUgVGNsIDguMCBtb2R1bGUgdXNlcyB0aGUgbmV3IFRjbCA4LjAgb2JqZWN0IGludGVyZmFjZSB3aGVuZXZlciBwb3NzaWJsZS4gIEluc3RlYWQgb2YgdXNpbmcgc3RyaW5ncywgdGhlIG9iamVjdCBpbnRlcmZhY2UgcHJvdmlkZXMgbW9yZSBkaXJlY3QgYWNjZXNzIHRvIG9iamVjdHMgaW4gdGhlaXIgbmF0aXZlIHJlcHJlc2VudGF0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIHBlcmZvcm1hbmNlIGlzIHNpZ25pZmljYW50bHkgYmV0dGVyLiAgICAgVGhlIG9sZGVyIFRjbCBTV0lHIG1vZHVsZSBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCBUY2wgOC4wLCBidXQgc2luY2UgaXQgdXNlcyBzdHJpbmdzIGl0IHdpbGwgYmUgbXVjaCBzbG93ZXIgdGhhbiB0aGUgbmV3IHZlcnNpb24uPHA+Ci08cD4KLUluIGFkZGl0aW9uIHRvIHVzaW5nIG5hdGl2ZSBUY2wgb2JqZWN0cywgdGhlIFRjbDguMCBtYW5pcHVsYXRlcyBwb2ludGVycyBkaXJlY3RseSBpbiBpbiBhIHNwZWNpYWwgVGNsIG9iamVjdC4gICBPbiB0aGUgc3VyZmFjZSBpdCBzdGlsbCBsb29rcyBsaWtlIGEgc3RyaW5nLCBidXQgaW50ZXJuYWxseSBpdHMgcmVwcmVzZW50ZWQgYSAodmFsdWUsdHlwZSkgcGFpci4gICBUaGlzIHRvbywgc2hvdWxkIG9mZmVyIHNvbWV3aGF0IGJldHRlciBwZXJmb3JtYW5jZS48cD4KLTxwPgotPHA+Ci0KLTxwPjxocj4KLQotPGFkZHJlc3M+U1dJRyAxLjEgLSBMYXN0IE1vZGlmaWVkIDogTW9uIEF1ZyAgNCAxMDo0NzoxMiAxOTk3PC9hZGRyZXNzPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9UeXBlbWFwcy5odG1sIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9UeXBlbWFwcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVhMmNiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvVHlwZW1hcHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08YSBuYW1lPSJuMCI+PC9hPjxoMT42IFBvaW50ZXJzLCBDb25zdHJhaW50cywgYW5kIFR5cGVtYXBzPC9oMT48cD48dWw+Ci08bGk+IDxhIGhyZWY9IiNuMSI+SW50cm9kdWN0aW9uPC9hPgotPGxpPiA8YSBocmVmPSIjbjIiPlRoZSBTV0lHIFBvaW50ZXIgTGlicmFyeTwvYT4KLTxsaT4gPGEgaHJlZj0iI24zIj5JbnRyb2R1Y3Rpb24gdG8gdHlwZW1hcHM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuNCI+TWFuYWdpbmcgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXJzPC9hPgotPGxpPiA8YSBocmVmPSIjbjUiPkFwcGx5aW5nIGNvbnN0cmFpbnRzIHRvIGlucHV0IHZhbHVlczwvYT4KLTxsaT4gPGEgaHJlZj0iI242Ij5Xcml0aW5nIG5ldyB0eXBlbWFwczwvYT4KLTxsaT4gPGEgaHJlZj0iI243Ij5Db21tb24gdHlwZW1hcCBtZXRob2RzPC9hPgotPGxpPiA8YSBocmVmPSIjbjgiPldyaXRpbmcgdHlwZW1hcCBjb2RlPC9hPgotPGxpPiA8YSBocmVmPSIjbjkiPlR5cGVtYXBzIGZvciBoYW5kbGluZyBhcnJheXM8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTAiPlR5cGVtYXBzIGFuZCB0aGUgU1dJRyBMaWJyYXJ5PC9hPgotPGxpPiA8YSBocmVmPSIjbjExIj5JbXBsZW1lbnRpbmcgY29uc3RyYWludHMgd2l0aCB0eXBlbWFwczwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMiI+VHlwZW1hcCBleGFtcGxlczwvYT4KLTxsaT4gPGEgaHJlZj0iI24xMyI+SG93IHRvIGJyZWFrIGV2ZXJ5dGhpbmcgd2l0aCBhIHR5cGVtYXA8L2E+Ci08bGk+IDxhIGhyZWY9IiNuMTQiPlR5cGVtYXBzIGFuZCB0aGUgZnV0dXJlPC9hPgotPC91bD4KLQotPGEgbmFtZT0ibjEiPjwvYT48aDI+IEludHJvZHVjdGlvbjwvaDI+Ci1Gb3IgbW9zdCBhcHBsaWNhdGlvbnMsIFNXSUcncyB0cmVhdG1lbnQgb2YgYmFzaWMgZGF0YXR5cGVzIGFuZCBwb2ludGVycyBpcyBlbm91Z2ggdG8gYnVpbGQgYW4gaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBjZXJ0YWluIGNhc2VzLCBpdCBpcyBkZXNpcmFibGUgdG8gY2hhbmdlIFNXSUcncyB0cmVhdG1lbnQgb2YgcGFydGljdWxhciBkYXRhdHlwZXMuIEZvciBleGFtcGxlLCB3ZSBtYXkgd2FudCBhIDx0dD5jaGFyICoqIDwvdHQ+dG8gYWN0IGxpa2UgYSBsaXN0IG9mIHN0cmluZ3MgaW5zdGVhZCBvZiBhIHBvaW50ZXIuIEluIGFub3RoZXIgaW5zdGFuY2UsIHdlIG1heSB3YW50IHRvIHRlbGwgU1dJRyB0aGF0IDx0dD5kb3VibGUgKnJlc3VsdDwvdHQ+IGlzIHRoZSBvdXRwdXQgdmFsdWUgb2YgYSBmdW5jdGlvbi4gU2ltaWxhcmx5LCB3ZSBtaWdodCB3YW50IHRvIG1hcCBhIGRhdGF0eXBlIG9mIDx0dD5mbG9hdFs0XTwvdHQ+IGludG8gYSA0IGVsZW1lbnQgdHVwbGUuIFRoaXMgY2hhcHRlciBkZXNjcmliZXMgYWR2YW5jZWQgbWV0aG9kcyBmb3IgbWFuYWdpbmcgcG9pbnRlcnMsIGFycmF5cywgYW5kIGNvbXBsZXggZGF0YXR5cGVzLiBJdCBhbHNvIGRlc2NyaWJlcyBob3cgeW91IGNhbiBjdXN0b21pemUgU1dJRyB0byBoYW5kbGUgbmV3IGtpbmRzIG9mIG9iamVjdHMgYW5kIGRhdGF0eXBlcy48cD4KLTxhIG5hbWU9Im4yIj48L2E+PGgyPiBUaGUgU1dJRyBQb2ludGVyIExpYnJhcnk8L2gyPgotSWYgeW91ciBpbnRlcmZhY2UgaW52b2x2ZXMgQyBwb2ludGVycywgY2hhbmNlcyBhcmUgeW91IHdpbGwgbmVlZCB0byB3b3JrIHdpdGggdGhlc2UgcG9pbnRlcnMgaW4gc29tZSB3YXkgb3IgYW5vdGhlci4gVGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5IHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiB1c2VmdWwgbWV0aG9kcyBmb3IgbWFuaXB1bGF0aW5nIHBvaW50ZXJzLiBUbyB1c2UgdGhlIGxpYnJhcnksIHNpbXBseSBwdXQgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiBpbiB5b3VyIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4laW5jbHVkZSBwb2ludGVyLmkgCQkJCS8vIEdyYWIgdGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLW9yIHJ1biBTV0lHIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN3aWcgLXBlcmw1IC1scG9pbnRlci5pIGludGVyZmFjZS5pIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Eb2luZyBzbyBhZGRzIGEgY29sbGVjdGlvbiBvZiBwb2ludGVyIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgdGhhdCBhcmUgZGVzY3JpYmVkIGJlbG93LiBUaGUgZnVuY3Rpb25zIGFyZSBtYWlubHkgZGVzaWduZWQgdG8gd29yayB3aXRoIGJhc2ljIEMgZGF0YXR5cGVzLCBidXQgY2FuIG9mdGVuIGJlIHVzZWQgd2l0aCBtb3JlIGNvbXBsaWNhdGVkIHN0cnVjdHVyZXMuPHA+Ci08YSBuYW1lPSJuMTUiPjwvYT48aDM+IFBvaW50ZXIgTGlicmFyeSBGdW5jdGlvbnM8L2gzPgotPGI+cHRyY3JlYXRlKHR5cGUsP3ZhbHVlPyw/bml0ZW1zPyk8L2I+PHA+Ci08ZGw+Ci08ZHQ+PGRkPgotPGR0PjxkZD5DcmVhdGVzIGEgbmV3IG9iamVjdCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXQuIDx0dD50eXBlPC90dD4gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgQyBkYXRhdHlwZSBhbmQgbWF5IGJlIG9uZSBvZiAiPHR0PmludDwvdHQ+IiwiPHR0PnNob3J0PC90dD4iLCI8dHQ+bG9uZzwvdHQ+IiwiPHR0PmZsb2F0PC90dD4iLCI8dHQ+ZG91YmxlPC90dD4iLCI8dHQ+Y2hhcjwvdHQ+IiwiPHR0PmNoYXIgKjwvdHQ+Iiwgb3IgIjx0dD52b2lkPC90dD4iLiA8dHQ+dmFsdWU8L3R0PiBpcyB0aGUgb3B0aW9uYWwgaW5pdGlhbCB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LiA8dHQ+bml0ZW1zPC90dD4gaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIGNyZWF0ZS4gQnkgZGVmYXVsdCBpdCBpcyAxLCBidXQgc3BlY2lmeWluZyBhbm90aGVyIHZhbHVlIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuIGFycmF5IG9mIHZhbHVlcy4gVGhpcyBmdW5jdGlvbiBpcyByZWFsbHkganVzdCBhIHdyYXBwZXIgYXJvdW5kIHRoZSBDIDx0dD5tYWxsb2MoKTwvdHQ+IGZ1bmN0aW9uLgotPC9kbD4KLTxiPjwvYj48cD4KLTxiPnB0cmZyZWUocHRyKTwvYj48cD4KLTxkbD4KLTxkdD48ZGQ+RGVzdHJveXMgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgPHR0PnB0cmNyZWF0ZTwvdHQ+LiBJdCBpcyBnZW5lcmFsbHkgdW5zYWZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIG9uIG9iamVjdHMgbm90IGNyZWF0ZWQgYnkgPHR0PnB0cmNyZWF0ZTwvdHQ+LiBDYWxscyB0aGUgQyA8dHQ+ZnJlZSgpPC90dD4gZnVuY3Rpb24uCi08L2RsPgotPHA+Ci08Yj5wdHJ2YWx1ZShwdHIsP2luZGV4Pyw/dHlwZT8pPC9iPjxwPgotPGRsPgotPGR0PjxkZD5UaGlzIGRlcmVmZXJlbmNlcyBhIHBvaW50ZXIgYW5kIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgaXQgaXMgcG9pbnRpbmcgdG8uIDx0dD5pbmRleDwvdHQ+IGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IGFsbG93cyBhcnJheSBhY2Nlc3MgYnkgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiA8dHQ+cHRyW2luZGV4XTwvdHQ+LiA8dHQ+dHlwZTwvdHQ+IGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBkYXRhdHlwZS4gU2luY2UgU1dJRyBwb2ludGVycyBhcmUgZW5jb2RlZCB3aXRoIHR5cGUgaW5mb3JtYXRpb24sIHRoZSB0eXBlIGlzIHVzdWFsbHkgdW5uZWNlc3NhcnkuIFRoZSA8dHQ+dHlwZTwvdHQ+IHBhcmFtZXRlciBwcm92aWRlcyBzb21ld2hhdCBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIGFsbG93cyB5b3UgdG8gZGVyZWZlcmVuY2UgYSBwb2ludGVyIG9mIGRpZmZlcmVudCB0eXBlIGhvd2V2ZXIuCi08ZHQ+PGRkPgotPC9kbD4KLTxiPnB0cnNldChwdHIsIHZhbHVlLCA/aW5kZXg/LCA/dHlwZT8pPC9iPjxwPgotPGRsPgotPGR0PjxkZD5TZXRzIHRoZSB2YWx1ZSBvZiB0aGUgb2JqZWN0IGEgcG9pbnRlciBpcyBwb2ludGluZyB0by4gPHR0PnZhbHVlPC90dD4gaXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgb2JqZWN0LiA8dHQ+aW5kZXggPC90dD5pcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgYWxsb3dpbmcgYXJyYXkgYWNjZXNzIGJ5IHNldHRpbmcgPHR0PnB0cltpbmRleF0gPSB2YWx1ZTwvdHQ+LiA8dHQ+dHlwZSA8L3R0PmlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBkYXRhdHlwZSBhcyBkZXNjcmliZWQgYWJvdmUuCi08ZHQ+PGRkPgotPC9kbD4KLTxiPnB0cmNhc3QocHRyLCBuZXd0eXBlKTwvYj48cD4KLTxkbD4KLTxkdD48ZGQ+Q2FzdHMgYSBwb2ludGVyIHRvIGEgbmV3IGRhdGF0eXBlIGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUuIDx0dD5uZXd0eXBlPC90dD4gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmV3IGRhdGF0eXBlIGFuZCBtYXkgZWl0aGVyIGJlIHRoZSAibWFuZ2xlZCIgdmVyc2lvbiB1c2VkIGJ5IFNXSUcgKHN1Y2ggYXMgIjx0dD5fVmVjdG9yX3A8L3R0PiIpIG9yIHRoZSBDIHZlcnNpb24gKHN1Y2ggYXMgIjx0dD5WZWN0b3IgKjwvdHQ+IikuIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBhbnkga2luZCBvZiBwb2ludGVyIHZhbHVlLiBJbiBhZGRpdGlvbmFsIHRvIHBvaW50ZXJzLCA8dHQ+cHRyPC90dD4gbWF5IGFsc28gaG9sZCBhbiBpbnRlZ2VyIHZhbHVlIGluIHdoaWNoIGNhc2UgdGhlIGludGVnZXIgaXMgdHVybmVkIGludG8gYSBwb2ludGVyIG9mIGdpdmVuIHR5cGUuCi08ZHQ+PGRkPgotPC9kbD4KLTxiPnB0cmFkZChwdHIsIG9mZnNldCk8L2I+PHA+Ci08ZGw+Ci08ZHQ+PGRkPkFkZHMgYW4gb2Zmc2V0IHRvIGEgcG9pbnRlciBhbmQgcmV0dXJucyBhIG5ldyBwb2ludGVyLiA8dHQ+b2Zmc2V0PC90dD4gaXMgc3BlY2lmaWVkIGFzIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBleGNlcHQgZm9yIHVua25vd24gY29tcGxleCBkYXRhdHlwZXMgaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLiBGb3IgZXhhbXBsZSwgaXMgPHR0PnB0cjwvdHQ+IGlzIGEgIjx0dD5kb3VibGUgKjwvdHQ+IiwgPHR0PnB0cmFkZChwdHIsMSk8L3R0PiB3aWxsIHJldHVybiB0aGUgbmV4dCBkb3VibGUuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBpZiA8dHQ+cHRyPC90dD4gaXMgIjx0dD5WZWN0b3IgKjwvdHQ+IiwgdGhlbiA8dHQ+cHRyYWRkKHB0ciwxKTwvdHQ+IHdpbGwgdXBkYXRlIHRoZSBwb2ludGVyIGJ5IDEgYnl0ZS4KLTxkdD48ZGQ+Ci08L2RsPgotPGI+cHRybWFwKHR5cGUxLHR5cGUyKTwvYj48cD4KLTxkbD4KLTxkdD48ZGQ+VGhpcyBwZXJmb3JtcyBhICJydW50aW1lIHR5cGVkZWYiIGFuZCBtYWtlcyBTV0lHIHJlY29nbml6ZSBwb2ludGVycyBvZiA8dHQ+dHlwZTE8L3R0PiBhbmQgPHR0PnR5cGUyPC90dD4gYXMgZXF1aXZhbGVudC4gPHR0PnR5cGUxPC90dD4gYW5kIDx0dD50eXBlMjwvdHQ+IGFyZSBzcGVjaWZpZWQgYXMgc3RyaW5ncy4gTm90IGdlbmVyYWxseSBuZWVkZWQsIGJ1dCBzb21ldGltZXMgdXNlZnVsLgotPC9kbD4KLTxhIG5hbWU9Im4xNiI+PC9hPjxoMz4gQSBzaW1wbGUgZXhhbXBsZTwvaDM+Ci1TdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgQyBmdW5jdGlvbiA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotdm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCkgewotCSpyZXN1bHQgPSBhICsgYjsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVG8gbWFuYWdlIHRoZSByZXN1bHQgb3V0cHV0LCB3ZSBjYW4gd3JpdGUgYW4gaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIHBvaW50ZXIuaQotCi1leHRlcm4gdm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdywgbGV0J3MgdXNlIHRoZSBwb2ludGVyIGxpYnJhcnkgKHNob3duIGZvciBhIGZldyBsYW5ndWFnZXMpIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIFRjbCAKLXNldCByZXN1bHQgW3B0cmNyZWF0ZSBkb3VibGVdICAgICAgICAgIDsjIENyZWF0ZSBhIGRvdWJsZQotYWRkIDQuNSAzICRyZXN1bHQgICAgICAgICAgICAgICAgICAgICAgOyMgQ2FsbCBvdXIgQyBmdW5jdGlvbgotcHV0cyBbcHRydmFsdWUgJHJlc3VsdF0gICAgICAgICAgICAgICAgOyMgUHJpbnQgb3V0IHRoZSByZXN1bHQKLXB0cmZyZWUgJHJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgIDsjIERlc3Ryb3kgdGhlIGRvdWJsZQotCi0jIFBlcmw1Ci11c2UgZXhhbXBsZTsKLXBhY2thZ2UgZXhhbXBsZTsgICAgICAgICAgICAgICAgICAgICAgICAjIEZ1bmN0aW9ucyBhcmUgaW4gZXhhbXBsZSBwYWNrYWdlCi0kcmVzdWx0ID0gcHRyY3JlYXRlKCJkb3VibGUiKTsgICAgICAgICAgIyBDcmVhdGUgYSBkb3VibGUKLWFkZCg0LjUsMywkcmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAjIENhbGwgQyBmdW5jdGlvbgotcHJpbnQgcHRydmFsdWUoJHJlc3VsdCksIlxuIjsgICAgICAgICAgICMgUHJpbnQgdGhlIHJlc3VsdAotcHRyZnJlZSgkcmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICMgRGVzdHJveSB0aGUgZG91YmxlCi0KLSMgUHl0aG9uCi1pbXBvcnQgZXhhbXBsZQotcmVzdWx0ID0gZXhhbXBsZS5wdHJjcmVhdGUoImRvdWJsZSIpICAgICMgQ3JlYXRlIGEgZG91YmxlCi1leGFtcGxlLmFkZCg0LjUsMyxyZXN1bHQpICAgICAgICAgICAgICAgIyBDYWxsIEMgZnVuY3Rpb24KLXByaW50IGV4YW1wbGUucHRydmFsdWUocmVzdWx0KSAgICAgICAgICAjIFByaW50IHRoZSByZXN1bHQKLWV4YW1wbGUucHRyZnJlZShyZXN1bHQpICAgICAgICAgICAgICAgICAjIERlc3Ryb3kgdGhlIGRvdWJsZQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSBpZGVhIGlzIHNpbXBsZS0td2UgY3JlYXRlIGEgcG9pbnRlciwgcGFzcyBpdCB0byBvdXIgQyBmdW5jdGlvbiwgYW5kIGRlcmVmZXJlbmNlIGl0IHRvIGdldCB0aGUgcmVzdWx0LiBJdCdzIGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byBob3cgd2Ugd291bGQgaGF2ZSBkb25lIGl0IGluIEMgKHdlbGwsIG1pbnVzIHRoZSBmdW5jdGlvbiBjYWxsIHRvIGRlcmVmZXJlbmNlIHRoZSB2YWx1ZSkuPHA+Ci08YSBuYW1lPSJuMTciPjwvYT48aDM+IENyZWF0aW5nIGFycmF5czwvaDM+Ci1Ob3cgc3VwcG9zZSB5b3UgaGF2ZSBhIEMgZnVuY3Rpb24gaW52b2x2aW5nIGFycmF5cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBhZGR2KGRvdWJsZSBhW10sIGRvdWJsZSBiW10sIGRvdWJsZSBjW10sIGludCBuaXRlbXMpIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpICZsdDsgbml0ZW1zOyBpKyspIHsKLQkJY1tpXSA9IGFbaV0rYltpXTsKLQl9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgaXMgYWxzbyBlYXNpbHkgaGFuZGxlZCBieSBvdXIgcG9pbnRlciBsaWJyYXJ5LiBGb3IgZXhhbXBsZSAoaW4gUHl0aG9uKSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBQeXRob24gZnVuY3Rpb24gdG8gdHVybiBhIGxpc3QgaW50byBhbiAiYXJyYXkiCi1kZWYgYnVpbGRfYXJyYXkobCk6Ci0Jbml0ZW1zID0gbGVuKGwpCi0JYSA9IHB0cmNyZWF0ZSgiZG91YmxlIiwwLG5pdGVtcykKLQlpID0gMAotCWZvciBpdGVtIGluIGw6Ci0JCXB0cnNldChhLGl0ZW0saSkKLQkJaSA9IGkgKyAxCi0JcmV0dXJuIGEKLQotIyBQeXRob24gZnVuY3Rpb24gdG8gdHVybiBhbiBhcnJheSBpbnRvIGxpc3QKLWRlZiBidWlsZF9saXN0KGEsbml0ZW1zKToKLQlsID0gW10KLQlmb3IgaSBpbiByYW5nZSgwLG5pdGVtcyk6Ci0JCWwuYXBwZW5kKHB0cnZhbHVlKGEsaSkpCi0JcmV0dXJuIGwKLQotIyBOb3cgdXNlIG91ciBmdW5jdGlvbnMKLWEgPSBsaXN0dG9hcnJheShbMC4wLC0yLjAsMy4wLDkuMF0pCi1iID0gYnVpbGRfYXJyYXkoWy0yLjAsMy41LDEwLjAsMjIuMF0pCi1jID0gcHRyY3JlYXRlKCJkb3VibGUiLDAsNCkgICAgICAgICAgICAjIEZvciByZXR1cm4gcmVzdWx0Ci1hZGQoYSxiLGMsNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbGwgb3VyIEMgZnVuY3Rpb24KLXJlc3VsdCA9IGJ1aWxkX2xpc3QoYykgICAgICAgICAgICAgICAgICMgQnVpbGQgYSBweXRob24gbGlzdCBmcm9tIHRoZSByZXN1bHQKLXByaW50IHJlc3VsdAotcHRyZnJlZShhKQotcHRyZnJlZShiKQotcHRyZnJlZShjKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGlzIGV4YW1wbGUgbWF5IGxvb2sgcXVpdGUgaW5lZmZpY2llbnQgb24gdGhlIHN1cmZhY2UgKGR1ZSB0byB0aGUgdHJhbnNsYXRpb24gb2YgUHl0aG9uIGxpc3RzIHRvIGFuZCBmcm9tIEMgYXJyYXlzKS4gSG93ZXZlciwgaWYgeW91J3JlIHdvcmtpbmcgd2l0aCBsb3RzIG9mIEMgZnVuY3Rpb25zLCBpdCdzIHBvc3NpYmxlIHRvIHNpbXBseSBwYXNzIEMgcG9pbnRlcnMgYXJvdW5kIGJldHdlZW4gdGhlbSB3aXRob3V0IGFueSB0cmFuc2xhdGlvbi4gQXMgYSByZXN1bHQsIGFwcGxpY2F0aW9ucyBjYW4gcnVuIGZhc3QtLWV2ZW4gd2hlbiBjb250cm9sbGVkIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIEl0J3MgYWxzbyB3b3J0aCBlbXBoYXNpemluZyB0aGF0IHRoZSA8dHQ+cHRyY3JlYXRlKCk8L3R0PiBmdW5jdGlvbiBjcmVhdGVkIGEgcmVhbCBDIGFycmF5IHRoYXQgY2FuIGJlIGludGVyY2hhbmdlZCB3aXRoIG90aGVyIGFycmF5cy4gVGhlIDx0dD5wdHJ2YWx1ZSgpPC90dD4gZnVuY3Rpb24gY2FuIGFsc28gZGVyZWZlcmVuY2UgYSBDIHBvaW50ZXIgZXZlbiBpZiBpdCB3YXNuJ3QgY3JlYXRlZCBmcm9tIFB5dGhvbi4gPHA+Ci08YSBuYW1lPSJuMTgiPjwvYT48aDM+IFBhY2tpbmcgYSBkYXRhIHN0cnVjdHVyZTwvaDM+Ci1UaGUgcG9pbnRlciBsaWJyYXJ5IGNhbiBldmVuIGJlIHVzZWQgdG8gcGFjayBzaW1wbGUga2luZHMgb2YgZGF0YS1zdHJ1Y3R1cmVzLCBwZXJoYXBzIGZvciBzZW5kaW5nIGFjcm9zcyBhIG5ldHdvcmssIG9yIHNpbXBseSBmb3IgY2hhbmdpbmcgdGhlIHZhbHVlLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGFkIHRoaXMgZGF0YSBzdHJ1Y3R1cmU6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3RydWN0IFBvaW50IHsKLQlkb3VibGUgeCx5OwotCWludCBjb2xvcjsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotWW91IGNvdWxkIHdyaXRlIGEgVGNsIGZ1bmN0aW9uIHRvIHNldCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+cHJvYyBzZXRfcG9pbnQgeyBwdHIgeCB5IGMgfSB7Ci0Jc2V0IHAgW3B0cmNhc3QgJHB0ciAiZG91YmxlICoiXSAgICAgICA7IyBNYWtlIGEgZG91YmxlICoKLQlwdHJzZXQgJHAgJHggICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNldCB4IGNvbXBvbmVudAotCXNldCBwIFtwdHJhZGQgJHAgMV0gICAgICAgICAgICAgICAgICAgOyMgVXBkYXRlIHBvaW50ZXIKLQlwdHJzZXQgJHAgJHkgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNldCB5IGNvbXBvbmVudAotCXNldCBwIFtwdHJjYXN0IFtwdHJhZGQgJHAgMV0gImludCAqIl0gOyMgVXBkYXRlIHBvaW50ZXIgYW5kIGNhc3QKLQlwdHJzZXQgJHAgJGMgICAgICAgICAgICAgICAgICAgICAgICAgIDsjIFNldCBjb2xvciBjb21wb25lbnQKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIGV2ZW4gaWYgeW91IGRpZG4ndCB0ZWxsIFNXSUcgYW55dGhpbmcgYWJvdXQgdGhlICJQb2ludCIgc3RydWN0dXJlIGFib3ZlLiA8cD4KLTxhIG5hbWU9Im4zIj48L2E+PGgyPiBJbnRyb2R1Y3Rpb24gdG8gdHlwZW1hcHM8L2gyPgotU29tZXRpbWVzIGl0J3MgZGVzaXJhYmxlIHRvIGNoYW5nZSBTV0lHIGJlaGF2aW9yIGluIHNvbWUgbWFubmVyLiBGb3IgZXhhbXBsZSwgbWF5YmUgeW91IHdhbnQgdG8gYXV0b21hdGljYWxseSB0cmFuc2xhdGUgQyBhcnJheXMgdG8gYW5kIGZyb20gUGVybCBsaXN0cy4gT3IgcGVyaGFwcyB5b3Ugd291bGQgbGlrZSBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gYXJndW1lbnQgdG8gYmVoYXZlIGFzIGFuIG91dHB1dCBwYXJhbWV0ZXIuIFR5cGVtYXBzIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIGRvaW5nIGp1c3QgdGhpcyBieSBtb2RpZnlpbmcgU1dJRydzIGNvZGUgZ2VuZXJhdG9yLiBUeXBlbWFwcyBhcmUgbmV3IHRvIFNXSUcgMS4xLCBidXQgaXQgc2hvdWxkIGJlIGVtcGhhc2l6ZWQgdGhhdCB0aGV5IGFyZSBub3QgcmVxdWlyZWQgdG8gYnVpbGQgYW4gaW50ZXJmYWNlLiA8cD4KLTxhIG5hbWU9Im4xOSI+PC9hPjxoMz4gVGhlIGlkZWEgKGluIGEgbnV0c2hlbGwpPC9oMz4KLVRoZSBpZGVhIGJlaGluZCB0eXBlbWFwcyBpcyByZWxhdGl2ZWx5IHNpbXBsZS0tZ2l2ZW4gdGhlIG9jY3VycmVuY2Ugb2YgYSBwYXJ0aWN1bGFyIEMgZGF0YXR5cGUsIHdlIHdhbnQgdG8gYXBwbHkgcnVsZXMgZm9yIHNwZWNpYWwgcHJvY2Vzc2luZy4gRm9yIGV4YW1wbGUsIHN1cHBvc2Ugd2UgaGF2ZSBhIEMgZnVuY3Rpb24gbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGFkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KSB7Ci0JKnJlc3VsdCA9IGEgKyBiOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JdCBpcyBjbGVhciB0byB1cyB0aGF0IHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIHJldHVybmVkIGluIHRoZSA8dHQ+cmVzdWx0PC90dD4gcGFyYW1ldGVyLiBVbmZvcnR1bmF0ZWx5LCBTV0lHIGlzbid0IHRoaXMgc21hcnQtLWFmdGVyIGFsbCAicmVzdWx0IiBpcyBqdXN0IGxpa2UgYW55IG90aGVyIHBvaW50ZXIuIEhvd2V2ZXIsIHdpdGggYSB0eXBlbWFwLCB3ZSBjYW4gbWFrZSBTV0lHIHJlY29nbml6ZSAiPHR0PmRvdWJsZSAqcmVzdWx0PC90dD4iIGFzIGEgc3BlY2lhbCBkYXRhdHlwZSBhbmQgY2hhbmdlIHRoZSBoYW5kbGluZyB0byBkbyBleGFjdGx5IHdoYXQgd2Ugd2FudC48cD4KLTxwPgotU28sIGRlc3BpdGUgYmVpbmcgYSBjb21tb24gdG9waWMgb2YgZGlzY3Vzc2lvbiBvbiB0aGUgU1dJRyBtYWlsaW5nIGxpc3QsIGEgdHlwZW1hcCBpcyByZWFsbHkganVzdCBhIHNwZWNpYWwgcHJvY2Vzc2luZyBydWxlIHRoYXQgaXMgYXBwbGllZCB0byBhIHBhcnRpY3VsYXIgZGF0YXR5cGUuIEVhY2ggdHlwZW1hcCByZWxpZXMgb24gdHdvIGVzc2VudGlhbCBhdHRyaWJ1dGVzLS1hIGRhdGF0eXBlIGFuZCBhIG5hbWUgKHdoaWNoIGlzIG9wdGlvbmFsKS4gV2hlbiB0cnlpbmcgdG8gbWF0Y2ggcGFyYW1ldGVycywgU1dJRyBsb29rcyBhdCBib3RoIGF0dHJpYnV0ZXMuIFRodXMsIHNwZWNpYWwgcHJvY2Vzc2luZyBhcHBsaWVkIHRvIGEgcGFyYW1ldGVyIG9mICI8dHQ+ZG91YmxlICpyZXN1bHQ8L3R0PiIgd2lsbCBub3QgYmUgYXBwbGllZCB0byAiPHR0PmRvdWJsZSAqaW5wdXQ8L3R0PiIuIE9uIHRoZSBvdGhlciBoYW5kLCBzcGVjaWFsIHByb2Nlc3NpbmcgZGVmaW5lZCBmb3IgYSBkYXRhdHlwZSBvZiAiPHR0PmRvdWJsZSAqPC90dD4iIGNvdWxkIGJlIGFwcGxpZWQgdG8gYm90aCAoc2luY2UgaXQgaXMgbW9yZSBnZW5lcmFsKS4gPHA+Ci08YSBuYW1lPSJuMjAiPjwvYT48aDM+IFVzaW5nIHNvbWUgdHlwZW1hcHM8L2gzPgotSXQgaXMgZWFzeSB0byBzdGFydCB1c2luZyBzb21lIHR5cGVtYXBzIHJpZ2h0IGF3YXkuIFRvIHdyYXAgdGhlIGFib3ZlIGZ1bmN0aW9uLCBzaW1wbHkgdXNlIHRoZSA8dHQ+dHlwZW1hcHMuaTwvdHQ+IGxpYnJhcnkgZmlsZSAod2hpY2ggaXMgcGFydCBvZiB0aGUgU1dJRyBsaWJyYXJ5KSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBTaW1wbGUgZXhhbXBsZSB1c2luZyB0eXBlbWFwcwotJW1vZHVsZSBleGFtcGxlCi0laW5jbHVkZSB0eXBlbWFwcy5pIAkJCQkJLy8gR3JhYiB0aGUgc3RhbmRhcmQgdHlwZW1hcCBsaWJyYXJ5Ci0KLSVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqcmVzdWx0IH07Ci1leHRlcm4gdm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSA8dHQ+JWFwcGx5PC90dD4gZGlyZWN0aXZlIHRlbGxzIFNXSUcgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gYXBwbHkgc3BlY2lhbCBwcm9jZXNzaW5nIHRvIGEgZGF0YXR5cGUuIFRoZSAiPHR0PmRvdWJsZSAqT1VUUFVUPC90dD4iIGlzIHRoZSBuYW1lIG9mIGEgcnVsZSBkZXNjcmliaW5nIGhvdyB0byByZXR1cm4gYW4gb3V0cHV0IHZhbHVlIGZyb20gYSAiPHR0PmRvdWJsZSAqPC90dD4iICh0aGlzIHJ1bGUgaXMgZGVmaW5lZCBpbiB0aGUgZmlsZSA8dHQ+dHlwZW1hcHMuaTwvdHQ+KS4gVGhlIHJ1bGUgZ2V0cyBhcHBsaWVkIHRvIGFsbCBvZiB0aGUgZGF0YXR5cGVzIGxpc3RlZCBpbiBjdXJseSBicmFjZXMtLSBpbiB0aGlzIGNhc2UgIjx0dD5kb3VibGUgKnJlc3VsdDwvdHQ+Ii48cD4KLTxwPgotV2hpbGUgaXQgbWF5IHNvdW5kIGNvbXBsaWNhdGVkLCB3aGVuIHlvdSBjb21waWxlIHRoZSBtb2R1bGUgYW5kIHVzZSBpdCwgeW91IGdldCBhIGZ1bmN0aW9uIHRoYXQgd29ya3MgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBQZXJsIGNvZGUgdG8gY2FsbCBvdXIgYWRkIGZ1bmN0aW9uCi0KLSRhID0gYWRkKDMsNCk7IAkJCi1wcmludCAkYSwiXG4iOwotNwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1PdXIgZnVuY3Rpb24gaXMgbXVjaCBlYXNpZXIgdG8gdXNlIGFuZCBpdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhIHNwZWNpYWwgZG91YmxlICogb2JqZWN0IGFuZCBwYXNzIGl0IHRvIHRoZSBmdW5jdGlvbi4gVHlwZW1hcHMgdG9vayBjYXJlIG9mIHRoaXMgYXV0b21hdGljYWxseS48cD4KLTxhIG5hbWU9Im40Ij48L2E+PGgyPiBNYW5hZ2luZyBpbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcnM8L2gyPgotQnkgZGVmYXVsdCwgd2hlbiBTV0lHIGVuY291bnRlcnMgYSBwb2ludGVyLCBpdCBtYWtlcyBubyBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IGl0IGlzICh3ZWxsLCBvdGhlciB0aGFuIHRoZSBmYWN0IHRoYXQgaXQncyBhIHBvaW50ZXIpLiBUaGUgPHR0PnR5cGVtYXBzLmk8L3R0PiBsaWJyYXJ5IGZpbGUgY29udGFpbnMgYSB2YXJpZXR5IG9mIG1ldGhvZHMgZm9yIGNoYW5naW5nIHRoaXMgYmVoYXZpb3IuIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgZmlsZSA6PHA+Ci08YSBuYW1lPSJuMjEiPjwvYT48aDM+IElucHV0IE1ldGhvZHM8L2gzPgotVGhlc2UgbWV0aG9kcyB0ZWxsIFNXSUcgdGhhdCBhIHBvaW50ZXIgaXMgYSBzaW5nbGUgaW5wdXQgdmFsdWUuIFdoZW4gdXNlZCwgZnVuY3Rpb25zIHdpbGwgZXhwZWN0IHZhbHVlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzLjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLWludCAqSU5QVVQJCQotc2hvcnQgKklOUFVUCi1sb25nICpJTlBVVAotdW5zaWduZWQgaW50ICpJTlBVVAotdW5zaWduZWQgc2hvcnQgKklOUFVUCi11bnNpZ25lZCBsb25nICpJTlBVVAotZG91YmxlICpJTlBVVAotZmxvYXQgKklOUFVUCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVN1cHBvc2UgeW91IGhhZCBhIEMgZnVuY3Rpb24gbGlrZSB0aGlzIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1kb3VibGUgYWRkKGRvdWJsZSAqYSwgZG91YmxlICpiKSB7Ci0JcmV0dXJuICphKypiOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Zb3UgY291bGQgd3JhcCBpdCB3aXRoIFNXSUcgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0laW5jbHVkZSB0eXBlbWFwcy5pCi0uLi4KLWV4dGVybiBkb3VibGUgYWRkKGRvdWJsZSAqSU5QVVQsIGRvdWJsZSAqSU5QVVQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3csIHdoZW4geW91IHVzZSB5b3VyIGZ1bmN0aW9uICxpdCB3aWxsIHdvcmsgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCByZXN1bHQgW2FkZCAzIDRdCi0lIHB1dHMgJHJlc3VsdAotNwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjIyIj48L2E+PGgzPiBPdXRwdXQgTWV0aG9kczwvaDM+Ci1UaGVzZSBtZXRob2RzIHRlbGwgU1dJRyB0aGF0IHBvaW50ZXIgaXMgdGhlIG91dHB1dCB2YWx1ZSBvZiBhIGZ1bmN0aW9uLiBXaGVuIHVzZWQsIHlvdSBkbyBub3QgbmVlZCB0byBzdXBwbHkgdGhlIGFyZ3VtZW50IHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb24sIGJ1dCBtdWx0aXBsZSByZXR1cm4gdmFsdWVzIGNhbiBiZSByZXR1cm5lZC48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnQgKk9VVFBVVAotc2hvcnQgKk9VVFBVVAotbG9uZyAqT1VUUFVUCi11bnNpZ25lZCBpbnQgKk9VVFBVVAotdW5zaWduZWQgc2hvcnQgKk9VVFBVVAotdW5zaWduZWQgbG9uZyAqT1VUUFVUCi1kb3VibGUgKk9VVFBVVAotZmxvYXQgKk9VVFBVVAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGVzZSBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIHNob3duIGluIGFuIGVhcmxpZXIgZXhhbXBsZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXMgQyBmdW5jdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKmMpIHsKLQkqYyA9IGErYjsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQSBTV0lHIGludGVyZmFjZSBmaWxlIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIHR5cGVtYXBzLmkKLS4uLgotZXh0ZXJuIHZvaWQgYWRkKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICpPVVRQVVQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIG9ubHkgYSBzaW5nbGUgb3V0cHV0IHZhbHVlIGlzIHJldHVybmVkLCBidXQgdGhpcyBpcyBub3QgYSByZXN0cmljdGlvbi4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhIGZ1bmN0aW9uIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gUmV0dXJucyBhIHN0YXR1cyBjb2RlIGFuZCBkb3VibGUKLWludCBnZXRfZG91YmxlKGNoYXIgKnN0ciwgZG91YmxlICpyZXN1bHQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIGRlY2xhcmVkIGluIFNXSUcgYXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmludCBnZXRfZG91YmxlKGNoYXIgKnN0ciwgZG91YmxlICpPVVRQVVQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgZnVuY3Rpb24gd291bGQgcmV0dXJuIGEgbGlzdCBvZiBvdXRwdXQgdmFsdWVzIGFzIHNob3duIGZvciBQeXRob24gYmVsb3cgOmFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiZndDsmZ3Q7Jmd0OyBnZXRfZG91YmxlKCIzLjE0MTU5MjYiKQkJCQkJIyBSZXR1cm5zIGJvdGggYSBzdGF0dXMgYW5kIHZhbHVlCi1bMCwgMy4xNDE1OTI2XSAKLSZndDsmZ3Q7Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjIzIj48L2E+PGgzPiBJbnB1dC9PdXRwdXQgTWV0aG9kczwvaDM+Ci1XaGVuIGEgcG9pbnRlciBzZXJ2ZXMgYXMgYm90aCBhbiBpbnB1dCBhbmQgb3V0cHV0IHZhbHVlIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotaW50ICpCT1RICi1zaG9ydCAqQk9USAotbG9uZyAqQk9USAotdW5zaWduZWQgaW50ICpCT1RICi11bnNpZ25lZCBzaG9ydCAqQk9USAotdW5zaWduZWQgbG9uZyAqQk9USAotZG91YmxlICpCT1RICi1mbG9hdCAqQk9USAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BIHR5cGljYWwgQyBmdW5jdGlvbiB3b3VsZCBiZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIG5lZ2F0ZShkb3VibGUgKngpIHsKLQkqeCA9IC0oKngpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UbyBtYWtlIHggZnVuY3Rpb24gYXMgYm90aCBhbmQgaW5wdXQgYW5kIG91dHB1dCB2YWx1ZSwgZGVjbGFyZSB0aGUgZnVuY3Rpb24gbGlrZSB0aGlzIGluIGFuIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIHR5cGVtYXBzLmkKLS4uLgotZXh0ZXJuIHZvaWQgbmVnYXRlKGRvdWJsZSAqQk9USCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdyB3aXRoaW4gYSBzY3JpcHQsIHlvdSBjYW4gc2ltcGx5IGNhbGwgdGhlIGZ1bmN0aW9uIG5vcm1hbGx5IDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4kYSA9IG5lZ2F0ZSgzKTsgCQkJCSMgYSA9IC0zIGFmdGVyIGNhbGxpbmcgdGhpcwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjQiPjwvYT48aDM+IFVzaW5nIGRpZmZlcmVudCBuYW1lczwvaDM+Ci1CeSBleHBsaWNpdGx5IHVzaW5nIHRoZSBwYXJhbWV0ZXIgbmFtZXMgb2YgSU5QVVQsIE9VVFBVVCwgYW5kIEJPVEggaW4geW91ciBkZWNsYXJhdGlvbnMsIFNXSUcgcGVyZm9ybXMgZGlmZmVyZW50IG9wZXJhdGlvbnMuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBkaWZmZXJlbnQgbmFtZXMsIHlvdSBjYW4gc2ltcGx5IHVzZSB0aGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIE1ha2UgZG91YmxlICpyZXN1bHQgYW4gb3V0cHV0IHZhbHVlCi0lYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKnJlc3VsdCB9OwotCi0vLyBNYWtlIEludDMyICppbiBhbiBpbnB1dCB2YWx1ZQotJWFwcGx5IGludCAqSU5QVVQgeyBJbnQzMiAqaW4gfTsKLQotLy8gTWFrZSBsb25nICp4IGJvdGgKLSVhcHBseSBsb25nICpCT1RIIHtsb25nICp4fTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHR0PiVhcHBseTwvdHQ+IG9ubHkgcmVuYW1lcyB0aGUgZGlmZmVyZW50IHR5cGUgaGFuZGxpbmcgcnVsZXMuIFlvdSBjYW4gdXNlIGl0IHRvIG1hdGNoIHVwIHdpdGggdGhlIG5hbWluZyBzY2hlbWUgdXNlZCBpbiBhIGhlYWRlciBmaWxlIGFuZCBzbyBmb3J0aC4gVG8gbGF0ZXIgY2xlYXIgYSBuYW1pbmcgcnVsZSwgdGhlIDx0dD4lY2xlYXI8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVjbGVhciBkb3VibGUgKnJlc3VsdDsKLSVjbGVhciBJbnQzMiAqaW4sIGxvbmcgKng7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNSI+PC9hPjxoMj4gQXBwbHlpbmcgY29uc3RyYWludHMgdG8gaW5wdXQgdmFsdWVzPC9oMj4KLUluIGFkZGl0aW9uIHRvIGNoYW5naW5nIHRoZSBoYW5kbGluZyBvZiB2YXJpb3VzIGlucHV0IHZhbHVlcywgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhcHBseSBjb25zdHJhaW50cy4gRm9yIGV4YW1wbGUsIG1heWJlIHlvdSB3YW50IHRvIGluc3VyZSB0aGF0IGEgdmFsdWUgaXMgcG9zaXRpdmUsIG9yIHRoYXQgYSBwb2ludGVyIGlzIG5vbi1OVUxMLiBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgaW5jbHVkaW5nIHRoZSA8dHQ+Y29uc3RyYWludHMuaTwvdHQ+IGxpYnJhcnkgZmlsZSAod2hpY2ggaXMgYWxzbyBiYXNlZCBvbiB0eXBlbWFwcykuPHA+Ci08YSBuYW1lPSJuMjUiPjwvYT48aDM+IFNpbXBsZSBjb25zdHJhaW50IGV4YW1wbGU8L2gzPgotVGhlIGNvbnN0cmFpbnRzIGxpYnJhcnkgaXMgYmVzdCBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIGludGVyZmFjZSBmaWxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBJbnRlcmZhY2UgZmlsZSB3aXRoIGNvbnN0cmFpbnRzCi0lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIGNvbnN0cmFpbnRzLmkKLQotZG91YmxlIGV4cChkb3VibGUgeCk7Ci1kb3VibGUgbG9nKGRvdWJsZSBQT1NJVElWRSk7ICAgICAgICAgLy8gQWxsb3cgb25seSBwb3NpdGl2ZSB2YWx1ZXMKLWRvdWJsZSBzcXJ0KGRvdWJsZSBOT05ORUdBVElWRSk7ICAgICAvLyBOb24tbmVnYXRpdmUgdmFsdWVzIG9ubHkKLWRvdWJsZSBpbnYoZG91YmxlIE5PTlpFUk8pOyAgICAgICAgICAvLyBOb24temVybyB2YWx1ZXMKLQotdm9pZCBmcmVlKHZvaWQgKk5PTk5VTEwpOyAgICAgICAgICAgIC8vIE5vbi1OVUxMIHBvaW50ZXJzIG9ubHkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIGJlaGF2aW9yIG9mIHRoaXMgZmlsZSBpcyBleGFjdGx5IGFzIHlvdSB3b3VsZCBleHBlY3QuIElmIGFueSBvZiB0aGUgYXJndW1lbnRzIHZpb2xhdGUgdGhlIGNvbnN0cmFpbnQgY29uZGl0aW9uLCBhIHNjcmlwdGluZyBsYW5ndWFnZSBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuIEFzIGEgcmVzdWx0LCBpdCBpcyBwb3NzaWJsZSB0byBjYXRjaCBiYWQgdmFsdWVzLCBwcmV2ZW50IG15c3RlcmlvdXMgcHJvZ3JhbSBjcmFzaGVzIGFuZCBzbyBvbi48cD4KLTxhIG5hbWU9Im4yNiI+PC9hPjxoMz4gQ29uc3RyYWludCBtZXRob2RzPC9oMz4KLVRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgYXJlIGN1cnJlbnRseSBhdmFpbGFibGU8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci1QT1NJVElWRSAgICAgICAgICAgICAgICAgICAgIEFueSBudW1iZXIgJmd0OyAwIChub3QgemVybykKLU5FR0FUSVZFICAgICAgICAgICAgICAgICAgICAgQW55IG51bWJlciAmbHQ7IDAgKG5vdCB6ZXJvKQotTk9OTkVHQVRJVkUgICAgICAgICAgICAgICAgICBBbnkgbnVtYmVyICZndDs9IDAKLU5PTlBPU0lUSVZFICAgICAgICAgICAgICAgICAgQW55IG51bWJlciAmbHQ7PSAwCi1OT05aRVJPICAgICAgICAgICAgICAgICAgICAgIE5vbnplcm8gbnVtYmVyCi1OT05OVUxMICAgICAgICAgICAgICAgICAgICAgIE5vbi1OVUxMIHBvaW50ZXIgKHBvaW50ZXJzIG9ubHkpLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjI3Ij48L2E+PGgzPiBBcHBseWluZyBjb25zdHJhaW50cyB0byBuZXcgZGF0YXR5cGVzPC9oMz4KLVRoZSBjb25zdHJhaW50cyBsaWJyYXJ5IG9ubHkgc3VwcG9ydHMgdGhlIGJ1aWx0LWluIEMgZGF0YXR5cGVzLCBidXQgaXQgaXMgZWFzeSB0byBhcHBseSBpdCB0byBuZXcgZGF0YXR5cGVzIHVzaW5nIDx0dD4lYXBwbHk8L3R0Pi4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEFwcGx5IGEgY29uc3RyYWludCB0byBhIFJlYWwgdmFyaWFibGUKLSVhcHBseSBOdW1iZXIgUE9TSVRJVkUgeyBSZWFsIGluIH07Ci0KLS8vIEFwcGx5IGEgY29uc3RyYWludCB0byBhIHBvaW50ZXIgdHlwZQotJWFwcGx5IFBvaW50ZXIgTk9OTlVMTCB7IFZlY3RvciAqIH07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBzcGVjaWFsIHR5cGVzIG9mICJOdW1iZXIiIGFuZCAiUG9pbnRlciIgY2FuIGJlIGFwcGxpZWQgdG8gYW55IG51bWVyaWMgYW5kIHBvaW50ZXIgdmFyaWFibGUgdHlwZSByZXNwZWN0aXZlbHkuIFRvIGxhdGVyIHJlbW92ZSBhIGNvbnN0cmFpbnQsIHRoZSAlY2xlYXIgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lY2xlYXIgUmVhbCBpbjsKLSVjbGVhciBWZWN0b3IgKjsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im42Ij48L2E+PGgyPiBXcml0aW5nIG5ldyB0eXBlbWFwczwvaDI+Ci1TbyBmYXIsIHdlIGhhdmUgb25seSBzZWVuIGEgaGlnaC1sZXZlbCBwaWN0dXJlIG9mIHR5cGVtYXBzIGFuZCBoYXZlIHV0aWxpemVkIHByZS1leGlzdGluZyB0eXBlbWFwcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byBkbyBtb3JlIGlmIHlvdSdyZSB3aWxsaW5nIHRvIGdldCB5b3VyIGhhbmRzIGRpcnR5IGFuZCBkaWcgaW50byB0aGUgaW50ZXJuYWxzIG9mIFNXSUcgYW5kIHlvdXIgZmF2b3JpdGUgc2NyaXB0aW5nIGxhbmd1YWdlLjxwPgotPHA+Ci1CZWZvcmUgZGl2aW5nIGluLCBmaXJzdCBhc2sgeW91cnNlbGYgZG8gSSByZWFsbHkgbmVlZCB0byBjaGFuZ2UgU1dJRydzIGRlZmF1bHQgYmVoYXZpb3I/IFRoZSBiYXNpYyBwb2ludGVyIG1vZGVsIHdvcmtzIHByZXR0eSB3ZWxsIG1vc3Qgb2YgdGhlIHRpbWUgYW5kIEkgZW5jb3VyYWdlIHlvdSB0byB1c2UgaXQtLWFmdGVyIGFsbCwgSSB3YW50ZWQgU1dJRyB0byBiZSBlYXN5IGVub3VnaCB0byB1c2Ugc28gdGhhdCB5b3UgZGlkbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbG93IGxldmVsIGRldGFpbHMuIElmLCBhZnRlciBjb250ZW1wbGF0aW5nIHRoaXMgZm9yIGF3aGlsZSwgeW91J3ZlIGRlY2lkZWQgdGhhdCB5b3UgcmVhbGx5IHdhbnQgdG8gY2hhbmdlIHNvbWV0aGluZywgYSB3b3JkIG9mIGNhdXRpb24gaXMgaW4gb3JkZXIuIFdyaXRpbmcgYSB0eXBlbWFwIGZyb20gc2NyYXRjaCB1c3VhbGx5IHJlcXVpcmVzIGEgZGV0YWlsZWQga25vd2xlZGdlIG9mIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiBhIHBhcnRpY3VsYXIgc2NyaXB0aW5nIGxhbmd1YWdlLiBJdCBpcyBhbHNvIHF1aXRlIGVhc3kgdG8gYnJlYWsgYWxsIG9mIHRoZSBvdXRwdXQgY29kZSBnZW5lcmF0ZWQgYnkgU1dJRyBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHlvdSdyZSBkb2luZy4gT24gdGhlIHBsdXMgc2lkZSwgb25jZSBhIHR5cGVtYXAgaGFzIGJlZW4gd3JpdHRlbiBpdCBjYW4gYmUgcmV1c2VkIG92ZXIgYW5kIG92ZXIgYWdhaW4gYnkgcHV0dGluZyBpdCBpbiB0aGUgU1dJRyBsaWJyYXJ5IChhcyBoYXMgYWxyZWFkeSBiZWVuIGRlbW9uc3RyYXRlZCkuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGJhc2ljcyBvZiB0eXBlbWFwcy4gTGFuZ3VhZ2Ugc3BlY2lmaWMgaW5mb3JtYXRpb24gKHdoaWNoIGNhbiBiZSBxdWl0ZSB0ZWNobmljYWwpIGlzIGNvbnRhaW5lZCBpbiB0aGUgbGF0ZXIgY2hhcHRlcnMuPHA+Ci08YSBuYW1lPSJuMjgiPjwvYT48aDM+IE1vdGl2YXRpb25zIGZvciB1c2luZyB0eXBlbWFwczwvaDM+Ci1TdXBwb3NlIHlvdSBoYXZlIGEgZmV3IEMgZnVuY3Rpb25zIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBnbExpZ2h0ZnYoR0xlbnVtIGxpZ2h0LCBHbGVudW0gcG5hbWUsIEdMZmxvYXQgcGFybXNbNF0pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGlzIGNhc2UsIHRoZSB0aGlyZCBhcmd1bWVudCB0YWtlcyBhIDQgZWxlbWVudCBhcnJheS4gSWYgeW91IGRvIG5vdGhpbmcsIFNXSUcgd2lsbCBjb252ZXJ0IHRoZSBsYXN0IGFyZ3VtZW50IGludG8gYSBwb2ludGVyLiBXaGVuIHVzZWQgaW4gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSwgeW91IHdpbGwgbmVlZCB0byBwYXNzIGEgIjx0dD5HTGZsb2F0ICo8L3R0PiIgb2JqZWN0IHRvIHRoZSBmdW5jdGlvbiB0byBtYWtlIGl0IHdvcmsuIDxwPgotPGEgbmFtZT0ibjI5Ij48L2E+PGgzPiBNYW5hZ2luZyBzcGVjaWFsIGRhdGEtdHlwZXMgd2l0aCBoZWxwZXIgZnVuY3Rpb25zPC9oMz4KLUhlbHBlciBmdW5jdGlvbnMgcHJvdmlkZSBvbmUgbWVjaGFuaXNtIGZvciBkZWFsaW5nIHdpdGggb2RkIGRhdGF0eXBlcy4gV2l0aCBhIGhlbHBlciBmdW5jdGlvbiwgeW91IHByb3ZpZGUgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IGZvciBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBvYmplY3RzIG9yIGNvbnZlcnRpbmcgdmFsdWVzIGludG8gYSB1c2VmdWwgZm9ybS4gVGhlc2UgZnVuY3Rpb25zIGFyZSB1c3VhbGx5IGp1c3QgcGxhY2VkIGludG8geW91ciBpbnRlcmZhY2UgZmlsZSB3aXRoIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbnMuIEZvciBleGFtcGxlLCBhIGZldyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCA0IGVsZW1lbnQgYXJyYXlzIGZvciB0aGUgYWJvdmUgZnVuY3Rpb24sIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4laW5saW5lICV7Ci0vKiBDcmVhdGUgYSBuZXcgR0xmbG9hdCBbNF0gb2JqZWN0ICovCi1HTGZsb2F0ICpuZXdmdjQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiwgZG91YmxlIHcpIHsKLQlHTGZsb2F0ICpmID0gKEdMZmxvYXQgKikgbWFsbG9jKDQqc2l6ZW9mKEdMZmxvYXQpKTsKLQlmWzBdID0geDsKLQlmWzFdID0geTsKLQlmWzJdID0gejsKLQlmWzNdID0gdzsKLQlyZXR1cm4gZjsKLX0KLQotLyogRGVzdHJveSBhIEdMZmxvYXQgWzRdIG9iamVjdCAqLwotdm9pZCBkZWxldGVfZnY0KEdMZmxvYXQgKmQpIHsKLQlmcmVlKGQpOwotfQotJX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiB3cmFwcGVkLCBvdXIgaGVscGVyIGZ1bmN0aW9ucyB3aWxsIHNob3cgdXAgdGhlIGludGVyZmFjZSBhbmQgY2FuIGJlIHVzZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzZXQgbGlnaHQgW25ld2Z2NCAwLjAgMC4wIDAuMCAxLjBdICAgICAgICAjIENyZWF0ZXMgYSBHTGZsb2F0ICoKLSUgZ2xMaWdodGZ2IEdMX0xJR0hUMCBHTF9BTUJJRU5UICRsaWdodCAgICAgIyBQYXNzIGl0IHRvIHRoZSBmdW5jdGlvbgotLi4uCi0lIGRlbGV0ZV9mdjQgJGxpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVzdHJveSBpdCAoV2hlbiBkb25lKSAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotPHA+Ci1XaGlsZSBub3QgdGhlIG1vc3QgZWxlZ2FudCBhcHByb2FjaCwgaGVscGVyIGZ1bmN0aW9ucyBwcm92aWRlIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3Igd29ya2luZyB3aXRoIG1vcmUgY29tcGxleCBkYXRhdHlwZXMuIEluIG1vc3QgY2FzZXMsIHRoZXkgY2FuIGJlIHdyaXR0ZW4gd2l0aG91dCBkaXZpbmcgaW50byBTV0lHJ3MgaW50ZXJuYWxzLiBCZWZvcmUgdHlwZW1hcCBzdXBwb3J0IHdhcyBhZGRlZCB0byBTV0lHLCBoZWxwZXIgZnVuY3Rpb25zIHdlcmUgdGhlIG9ubHkgbWV0aG9kIGZvciBoYW5kbGluZyB0aGVzZSBraW5kcyBvZiBwcm9ibGVtcy4gVGhlIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUgZGVzY3JpYmVkIGVhcmxpZXIgaXMgYW4gZXhhbXBsZSBvZiBqdXN0IHRoaXMgc29ydCBvZiBhcHByb2FjaC4gQXMgYSBydWxlIG9mIHRodW1iLCBJIHJlY29tbWVuZCB0aGF0IHlvdSB0cnkgdG8gdXNlIHRoaXMgYXBwcm9hY2ggYmVmb3JlIGp1bXBpbmcgaW50byB0eXBlbWFwcy4gPHA+Ci08YSBuYW1lPSJuMzAiPjwvYT48aDM+IEEgVHlwZW1hcCBJbXBsZW1lbnRhdGlvbjwvaDM+Ci1BcyB3ZSBoYXZlIHNlZW4sIGEgdHlwZW1hcCBjYW4gb2Z0ZW4gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBoZWxwZXIgZnVuY3Rpb25zLiBXaXRob3V0IGRpdmluZyBpbnRvIHRoZSBkZXRhaWxzLCBhIG1vcmUgc29waGlzdGljYXRlZCB0eXBlbWFwIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcmV2aW91cyBleGFtcGxlIGNhbiBwZXJtaXQgeW91IHRvIHBhc3MgYW4gYXJyYXkgb3IgbGlzdCBvZiB2YWx1ZXMgZGlyZWN0bHkgaW50byB0aGUgQyBmdW5jdGlvbiBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgZ2xMaWdodGZ2IEdMX0xJR0hUMCBHTF9BTUJJRU5UIHswLjAgMC4wIDAuMCAxLjB9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgaXMgYSBtb3JlIG5hdHVyYWwgaW1wbGVtZW50YXRpb24gdGhhdCByZXBsYWNlcyB0aGUgbG93LWxldmVsIHBvaW50ZXIgbWV0aG9kLiBOb3cgd2Ugd2lsbCBsb29rIGludG8gaG93IG9uZSBhY3R1YWxseSBzcGVjaWZpZXMgYSB0eXBlbWFwLjxwPgotPGEgbmFtZT0ibjMxIj48L2E+PGgzPiBXaGF0IGlzIGEgdHlwZW1hcD88L2gzPgotQSB0eXBlbWFwIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgPHR0PiV0eXBlbWFwPC90dD4gZGlyZWN0aXZlIGluIHlvdXIgaW50ZXJmYWNlIGZpbGUuIEEgc2ltcGxlIHR5cGVtYXAgbWlnaHQgbG9vayBsaWtzIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotJXR5cGVtYXAodGNsLGluKSBpbnQgewotCSR0YXJnZXQgPSBhdG9pKCRzb3VyY2UpOwotCXByaW50ZigiUmVjZWl2ZWQgYW4gaW50ZWdlciA6ICVkXG4iLCAkdGFyZ2V0KTsKLX0KLQotaW50IGFkZChpbnQgYSwgaW50IGIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1JbiB0aGlzIGNhc2UsIHdlIGNoYW5nZWQgdGhlIHByb2Nlc3Npbmcgb2YgaW50ZWdlcnMgYXMgaW5wdXQgYXJndW1lbnRzIHRvIGZ1bmN0aW9ucy4gV2hlbiB1c2VkIGluIGEgVGNsIHNjcmlwdCwgd2Ugd291bGQgZ2V0IHRoZSBmb2xsb3dpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc2V0IGEgW2FkZCA3IDEzXQotUmVjZWl2ZWQgYW4gaW50ZWdlciA6IDcKLVJlY2VpdmVkIGFuIGludGVnZXIgOiAxMwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGUgdHlwZW1hcCBzcGVjaWZpY2F0aW9uLCB0aGUgc3ltYm9scyA8dHQ+JHNvdXJjZTwvdHQ+IGFuZCA8dHQ+JHRhcmdldDwvdHQ+IGFyZSBob2xkaW5nIHBsYWNlcyBmb3IgQyB2YXJpYWJsZSBuYW1lcyB0aGF0IFNXSUcgaXMgZ29pbmcgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyB3cmFwcGVyIGNvZGUuIEluIHRoaXMgZXhhbXBsZSwgPHR0PiRzb3VyY2U8L3R0PiB3b3VsZCBjb250YWluIGEgVGNsIHN0cmluZyBjb250YWluaW5nIHRoZSBpbnB1dCB2YWx1ZSBhbmQgPHR0PiR0YXJnZXQ8L3R0PiB3b3VsZCBiZSB0aGUgQyBpbnRlZ2VyIHZhbHVlIHRoYXQgaXMgZ29pbmcgdG8gYmUgcGFzc2VkIGludG8gdGhlICJhZGQiIGZ1bmN0aW9uLjxwPgotPGEgbmFtZT0ibjMyIj48L2E+PGgzPiBDcmVhdGluZyBhIG5ldyB0eXBlbWFwPC9oMz4KLUEgbmV3IHR5cGVtYXAgY2FuIGJlIGNyZWF0ZWQgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAobGFuZyxtZXRob2QpIERhdGF0eXBlIHsKLQkuLi4gQ29udmVyc2lvbiBjb2RlIC4uLgotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dHQ+bGFuZzwvdHQ+IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGxhbmd1YWdlLCA8dHQ+bWV0aG9kPC90dD4gZGVmaW5lcyBhIHBhcnRpY3VsYXIgY29udmVyc2lvbiBtZXRob2QsIGFuZCA8dHQ+RGF0YXR5cGU8L3R0PiBnaXZlcyB0aGUgY29ycmVzcG9uZGluZyBDIGRhdGF0eXBlLiBUaGUgY29kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlbWFwIGlzIGVuY2xvc2VkIGluIGJyYWNlcyBhZnRlciB0aGUgZGVjbGFyYXRpb24uIFRoZXJlIGFyZSBhYm91dCBhIGRvemVuIGRpZmZlcmVudCBraW5kcyBvZiB0eXBlbWFwcyB0aGF0IGFyZSB1c2VkIHdpdGhpbiBTV0lHLCBidXQgd2Ugd2lsbCBnZXQgdG8gdGhhdCBzaG9ydGx5LjxwPgotPHA+Ci1BIHNpbmdsZSBjb252ZXJzaW9uIGNhbiBiZSBhcHBsaWVkIHRvIG11bHRpcGxlIGRhdGF0eXBlcyBieSBnaXZpbmcgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBkYXRhdHlwZXMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcCh0Y2wsaW4pIGludCwgc2hvcnQsIGxvbmcsIHNpZ25lZCBjaGFyIHsKLQkkdGFyZ2V0ID0gKCR0eXBlKSBhdG9sKCRzb3VyY2UpOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1IZXJlLCA8dHQ+JHR5cGU8L3R0PiB3aWxsIGJlIGV4cGFuZGVkIGludG8gdGhlIHJlYWwgZGF0YXR5cGUgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4gRGF0YXR5cGVzIG1heSBhbHNvIGNhcnJ5IG5hbWVzIGFzIGluPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAocGVybDUsaW4pIGNoYXIgKiphcmd2IHsKLQkuLi4gVHVybiBhIHBlcmwgYXJyYXkgaW50byBhIGNoYXIgKiogLi4uCi19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUEgIm5hbWVkInR5cGVtYXAgd2lsbCBvbmx5IGFwcGx5IHRvIGFuIG9iamVjdCB0aGF0IG1hdGNoZXMgYm90aCB0aGUgQyBkYXRhdHlwZSBhbmQgdGhlIG5hbWUuIFRodXMgdGhlIDx0dD5jaGFyICoqYXJndjwvdHQ+IHR5cGVtYXAgd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgZXhhY3RseSBtYXRjaCAiPHR0PmNoYXIgKiphcmd2PC90dD4iLiBJbiBzb21lIGNhc2VzLCB0aGUgbmFtZSBtYXkgY29ycmVzcG9uZCB0byBhIGZ1bmN0aW9uIG5hbWUgKGFzIGlzIHRoZSBjYXNlIGZvciByZXR1cm4gdmFsdWVzKS48cD4KLTxwPgotRmluYWxseSwgdGhlcmUgaXMgYSBzaG9ydGVuZWQgZm9ybSBvZiB0aGUgdHlwZW1hcCBkaXJlY3RpdmUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKG1ldGhvZCkgRGF0YXR5cGUgewotCS4uLgotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHRoZSBsYW5ndWFnZSBuYW1lIGlzIG9tbWl0dGVkLCB0aGUgdHlwZW1hcCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgdGFyZ2V0IGxhbmd1YWdlLiBUaGlzIGZvcm0gaXMgb25seSByZWNvbW1lbmRlZCBmb3IgdHlwZW1hcCBtZXRob2RzIHRoYXQgYXJlIGxhbmd1YWdlIGluZGVwZW5kZW50ICh0aGVyZSBhcmUgYSBmZXcpLiBJdCBpcyBub3QgcmVjb21tZW5kZWQgaWYgeW91IGFyZSBidWlsZGluZyBpbnRlcmZhY2VzIGZvciBtdWx0aXBsZSBsYW5ndWFnZXMuPHA+Ci08YSBuYW1lPSJuMzMiPjwvYT48aDM+IERlbGV0aW5nIGEgdHlwZW1hcDwvaDM+Ci1BIHR5cGVtYXAgY2FuIGJlIGRlbGV0ZWQgYnkgcHJvdmlkaW5nIG5vIGNvbnZlcnNpb24gY29kZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKGxhbmcsbWV0aG9kKSBEYXRhdHlwZTsgICAgICAgICAgICAgIC8vIERlbGV0ZXMgdGhpcyB0eXBlbWFwCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMzQiPjwvYT48aDM+IENvcHlpbmcgYSB0eXBlbWFwPC9oMz4KLUEgdHlwZW1hcCBjYW4gYmUgY29waWVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHB5dGhvbixvdXQpIHVuc2lnbmVkIGludCA9IGludDsgICAgIC8vIENvcGllcyBhIHR5cGVtYXAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBzcGVjaWZpZXMgdGhhdCB0aGUgdHlwZW1hcCBmb3IgIjx0dD51bnNpZ25lZCBpbnQ8L3R0PiIgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSAiPHR0PmludDwvdHQ+IiB0eXBlbWFwLjxwPgotVGhpcyBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgd2hlbiB3b3JraW5nIHdpdGggbGlicmFyeSBmaWxlcy48cD4KLTxhIG5hbWU9Im4zNSI+PC9hPjxoMz4gVHlwZW1hcCBtYXRjaGluZyBydWxlczwvaDM+Ci1XaGVuIHlvdSBzcGVjaWZ5IGEgdHlwZW1hcCwgU1dJRyBpcyBnb2luZyB0byB0cnkgYW5kIG1hdGNoIGl0IHdpdGggYWxsIGZ1dHVyZSBvY2N1cnJlbmNlcyBvZiB0aGUgZGF0YXR5cGUgeW91IHNwZWNpZnkuIFRoZSBtYXRjaGluZyBwcm9jZXNzIGlzIGJhc2VkIHVwb24gdGhlIHRhcmdldCBsYW5ndWFnZSwgdHlwZW1hcCBtZXRob2QsIGRhdGF0eXBlLCBhbmQgb3B0aW9uYWwgbmFtZS4gQmVjYXVzZSBvZiB0aGlzLCBpdCBpcyBwZXJmZWN0bHkgbGVnYWwgZm9yIG11bHRpcGxlIHR5cGVtYXBzIHRvIGV4aXN0IGZvciBhIHNpbmdsZSBkYXRhdHlwZSBhdCBhbnkgZ2l2ZW4gdGltZS4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKHRjbCxpbikgaW50ICogewotCS4uLiBDb252ZXJ0IGFuIGludCAqIC4uLgotfQotJXR5cGVtYXAodGNsLGluKSBpbnQgWzRdIHsKLQkuLi4gQ29udmVydCBhbiBpbnRbNF0gLi4uCi19Ci0ldHlwZW1hcCh0Y2wsaW4pIGludCBvdXRbNF0gewotCS4uLiBDb252ZXJ0IGFuIG91dFs0XSAuLi4KLX0KLSV0eXBlbWFwKHRjbCxpbikgaW50ICpzdGF0dXMgewotCS4uLiBDb252ZXJ0IGFuIGludCAqc3RhdHVzIC4uLgotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGVzZSB0eXBlbWFwcyBhbGwgaW52b2x2ZSB0aGUgIjx0dD5pbnQgKjwvdHQ+IiBkYXRhdHlwZSBpbiBvbmUgd2F5IG9yIGFub3RoZXIsIGJ1dCBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgZGlzdGluY3QuIFRoZXJlIGlzIGFuIGV4dHJhIHR3aXN0IHRvIHR5cGVtYXBzIHJlZ2FyZGluZyB0aGUgc2ltaWxhcml0eSBiZXR3ZWVuIEMgcG9pbnRlcnMgYW5kIGFycmF5cy4gQSB0eXBlbWFwIGFwcGxpZWQgdG8gYSBwb2ludGVyIHdpbGwgYWxzbyB3b3JrIGZvciBhbnkgYXJyYXkgb2YgdGhlIHNhbWUgdHlwZS4gT24gdGhlIG90aGVyIGhhbmQsIGEgdHlwZW1hcCBhcHBsaWVkIHRvIGFuIGFycmF5IHdpbGwgb25seSB3b3JrIGZvciBhcnJheXMsIG5vdCBwb2ludGVycy4gQXNzdW1pbmcgdGhhdCB5b3UncmUgbm90IGNvbXBsZXRlbHkgY29uZnVzZWQgYXQgdGhpcyBwb2ludCwgdGhlIGZvbGxvd2luZyBydWxlcyBhcmUgYXBwbGllZCBpbiBvcmRlciB0byBtYXRjaCBwb2ludGVycyBhbmQgYXJyYXlzIDo8cD4KLTxwPgotPHVsPgotPGxpPk5hbWVkIGFycmF5cwotPGxpPlVubmFtZWQgYXJyYXlzCi08bGk+TmFtZWQgZGF0YXR5cGVzCi08bGk+VW5uYW1lZCBkYXRhdHlwZXMKLTwvdWw+Ci08cD4KLVRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGZpbGUgc2hvd3MgaG93IHRoZXNlIHJ1bGVzIGFyZSBhcHBsaWVkLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZm9vMShpbnQgKik7IAkJCQkvLyBBcHBseSBpbnQgKiB0eXBlbWFwCi12b2lkIGZvbzIoaW50IGFbNF0pOyAgICAgICAgIC8vIEFwcGx5IGludFs0XSB0eXBlbWFwCi12b2lkIGZvbzMoaW50IG91dFs0XSk7ICAgICAgIC8vIEFwcGx5IGludCBvdXRbNF0gdHlwZW1hcAotdm9pZCBmb280KGludCAqc3RhdHVzKTsgICAgICAvLyBBcHBseSBpbnQgKnN0YXR1cyB0eXBlbWFwCi12b2lkIGZvbzUoaW50IGFbMjBdKTsgICAgICAgIC8vIEFwcGx5IGludCAqIHR5cGVtYXAgKGJlY2F1c2UgaW50IFsyMF0gaXMgYW4gaW50ICopCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUJlY2F1c2UgU1dJRyB1c2VzIGEgbmFtZS1iYXNlZCBhcHByb2FjaCwgaXQgaXMgcG9zc2libGUgdG8gYXR0YWNoIHNwZWNpYWwgcHJvcGVydGllcyB0byBuYW1lZCBwYXJhbWV0ZXJzLiBGb3IgZXhhbXBsZSwgd2UgY2FuIG1ha2UgYW4gYXJndW1lbnQgb2YgIjx0dD5pbnQgKk9VVFBVVDwvdHQ+IiBhbHdheXMgYmUgdHJlYXRlZCBhcyBhbiBvdXRwdXQgdmFsdWUgb2YgYSBmdW5jdGlvbiBvciBtYWtlIGEgIjx0dD5jaGFyICoqYXJndjwvdHQ+IiBhbHdheXMgYWNjZXB0IGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVzLjxwPgotPGEgbmFtZT0ibjciPjwvYT48aDI+IENvbW1vbiB0eXBlbWFwIG1ldGhvZHM8L2gyPgotVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdXBwb3J0ZWQgYnkgbW9zdCBTV0lHIGxhbmd1YWdlIG1vZHVsZXMuIEluZGl2aWR1YWwgbGFuZ3VhZ2UgbWF5IHByb3ZpZGUgYW55IG51bWJlciBvZiBvdGhlciBtZXRob2RzIG5vdCBsaXN0ZWQgaGVyZS48cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iY2g2LnRhYmxlLjEucG5nIj48YnI+Ci08aW1nIHNyYz0iY2g2LnRhYmxlLjIucG5nIj48YnI+Ci08L2NlbnRlcj4KLTxwPgotVW5kZXJzdGFuZGluZyBob3cgc29tZSBvZiB0aGVzZSBtZXRob2RzIGFyZSBhcHBsaWVkIHRha2VzIGEgbGl0dGxlIHByYWN0aWNlIGFuZCBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB3aGF0IFNXSUcgZG9lcyB3aGVuIGl0IGNyZWF0ZXMgYSB3cmFwcGVyIGZ1bmN0aW9uLiBUaGUgbmV4dCBmZXcgZGlhZ3JhbXMgc2hvdyB0aGUgYW5hdG9teSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24gYW5kIGhvdyB0aGUgdHlwZW1hcHMgZ2V0IGFwcGxpZWQuIE1vcmUgZGV0YWlsZWQgZXhhbXBsZXMgb2YgdHlwZW1hcHMgY2FuIGJlIGZvdW5kIG9uIHRoZSBjaGFwdGVycyBmb3IgZWFjaCB0YXJnZXQgbGFuZ3VhZ2UuPHA+Ci08cD4KLTxjZW50ZXI+PGltZyBzcmM9ImNoNi4xLnBuZyI+Ci08cD48L2NlbnRlcj4KLTxwPgotPGNlbnRlcj48aW1nIHNyYz0iY2g2LjIucG5nIj4KLTxwPjwvY2VudGVyPgotPGEgbmFtZT0ibjgiPjwvYT48aDI+IFdyaXRpbmcgdHlwZW1hcCBjb2RlPC9oMj4KLVRoZSBjb252ZXJzaW9uIGNvZGUgc3VwcGxpZWQgdG8gYSB0eXBlbWFwIG5lZWRzIHRvIGZvbGxvdyBhIGZldyBjb252ZW50aW9ucyBkZXNjcmliZWQgaGVyZS48cD4KLTxhIG5hbWU9Im4zNiI+PC9hPjxoMz4gU2NvcGU8L2gzPgotVHlwZW1hcCBjb2RlIGlzIGVuY2xvc2VkIGluIGJyYWNlcyB3aGVuIGl0IGlzIGluc2VydGVkIGludG8gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgKHVzaW5nIEMncyBibG9jay1zY29wZSkuIEl0IGlzIHBlcmZlY3RseSBsZWdhbCB0byBkZWNsYXJlIGxvY2FsIGFuZCBzdGF0aWMgdmFyaWFibGVzIGluIGEgdHlwZW1hcC4gSG93ZXZlciwgbG9jYWwgdmFyaWFibGVzIHdpbGwgb25seSBleGlzdCBpbiB0aGUgdGlueSBwb3J0aW9uIG9mIGNvZGUgeW91IHN1cHBseS4gSW4gb3RoZXIgd29yZHMsIGFueSBsb2NhbCB2YXJpYWJsZXMgdGhhdCB5b3UgY3JlYXRlIGluIGEgdHlwZW1hcCB3aWxsIGRpc2FwcGVhciB3aGVuIHRoZSB0eXBlbWFwIGhhcyBjb21wbGV0ZWQgaXRzIGV4ZWN1dGlvbi48cD4KLTxhIG5hbWU9Im4zNyI+PC9hPjxoMz4gQ3JlYXRpbmcgbG9jYWwgdmFyaWFibGVzPC9oMz4KLVNvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gZGVjbGFyZSBhIG5ldyBsb2NhbCB2YXJpYWJsZSB0aGF0IGV4aXN0cyBpbiB0aGUgc2NvcGUgb2YgdGhlIGVudGlyZSB3cmFwcGVyIGZ1bmN0aW9uLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHNwZWNpZnlpbmcgYSB0eXBlbWFwIHdpdGggcGFyYW1ldGVycyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcCh0Y2wsaW4pIGludCAqSU5QVVQoaW50IHRlbXApIHsKLQl0ZW1wID0gYXRvaSgkc291cmNlKTsKLQkkdGFyZ2V0ID0gJmFtcDt0ZW1wOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGF0IGhhcHBlbnMgaGVyZSBpcyB0aGF0IDx0dD50ZW1wPC90dD4gYmVjb21lcyBhIGxvY2FsIHZhcmlhYmxlIGluIHRoZSBzY29wZSBvZiB0aGUgZW50aXJlIHdyYXBwZXIgZnVuY3Rpb24uIFdoZW4gd2Ugc2V0IGl0IHRvIGEgdmFsdWUsIHRoYXQgdmFsdWVzIHBlcnNpc3RzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb24gYW5kIGdldHMgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IG9uIGV4aXQuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHdvcmtpbmcgd2l0aCBwb2ludGVycyBhbmQgdGVtcG9yYXJ5IHZhbHVlcy48cD4KLTxwPgotSXQgaXMgcGVyZmVjdGx5IHNhZmUgdG8gdXNlIG11bHRpcGxlIHR5cGVtYXBzIGludm9sdmluZyBsb2NhbCB2YXJpYWJsZXMgaW4gdGhlIHNhbWUgZnVuY3Rpb24uIEZvciBleGFtcGxlLCB3ZSBjb3VsZCBkZWNsYXJlIGEgZnVuY3Rpb24gYXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnZvaWQgZm9vKGludCAqSU5QVVQsIGludCAqSU5QVVQsIGludCAqSU5QVVQpOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIHRoaXMgb2NjdXJzLCBTV0lHIHdpbGwgY3JlYXRlIHRocmVlIGRpZmZlcmVudCBsb2NhbCB2YXJpYWJsZXMgbmFtZWQgYHRlbXAnLiBPZiBjb3Vyc2UsIHRoZXkgZG9uJ3QgYWxsIGVuZCB1cCBoYXZpbmcgdGhlIHNhbWUgbmFtZS0tLVNXSUcgYXV0b21hdGljYWxseSBwZXJmb3JtcyBhIHZhcmlhYmxlIHJlbmFtaW5nIG9wZXJhdGlvbiBpZiBpdCBkZXRlY3RzIGEgbmFtZS1jbGFzaCBsaWtlIHRoaXMuPHA+Ci08cD4KLVNvbWUgdHlwZW1hcHMgZG8gbm90IHJlY29nbml6ZSBsb2NhbCB2YXJpYWJsZXMgKG9yIHRoZXkgbWF5IHNpbXBseSBub3QgYXBwbHkpLiBBdCB0aGlzIHRpbWUsIG9ubHkgdGhlICJpbiIsICJhcmdvdXQiLCAiZGVmYXVsdCIsIGFuZCAiaWdub3JlIiB0eXBlbWFwcyB1c2UgbG9jYWwgdmFyaWFibGVzLjxwPgotPGEgbmFtZT0ibjM4Ij48L2E+PGgzPiBTcGVjaWFsIHZhcmlhYmxlczwvaDM+Ci1UaGUgZm9sbG93aW5nIHNwZWNpYWwgdmFyaWFibGVzIG1heSBiZSB1c2VkIHdpdGhpbiBhIHR5cGVtYXAgY29udmVyc2lvbiBjb2RlIDo8cD4KLTxjZW50ZXI+PGltZyBzcmM9ImNoNi50YWJsZS4zLnBuZyI+PC9jZW50ZXI+Ci08cD4KLVdoZW4gZm91bmQgaW4gdGhlIGNvbnZlcnNpb24gY29kZSwgdGhlc2UgdmFyaWFibGVzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZXMuIE5vdCBhbGwgdmFsdWVzIGFyZSB1c2VkIGluIGFsbCB0eXBlbWFwcy4gUGxlYXNlIHJlZmVyIHRvIHRoZSBTV0lHIHJlZmVyZW5jZSBtYW51YWwgZm9yIHRoZSBwcmVjaXNlIHVzYWdlLiA8cD4KLTxhIG5hbWU9Im45Ij48L2E+PGgyPiBUeXBlbWFwcyBmb3IgaGFuZGxpbmcgYXJyYXlzPC9oMj4KLU9uZSBvZiB0aGUgbW9zdCBjb21tb24gdXNlcyBvZiB0eXBlbWFwcyBpcyBwcm92aWRpbmcgc29tZSBzdXBwb3J0IGZvciBhcnJheXMuIER1ZSB0byB0aGUgc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gcG9pbnRlcnMgYW5kIGFycmF5cyBpbiBDLCBhcnJheSBzdXBwb3J0IGlzIHNvbWV3aGF0IGxpbWl0ZWQgdW5sZXNzIHlvdSBwcm92aWRlIGFkZGl0aW9uYWwgc3VwcG9ydC4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGFwcGVhcnMgaW4gYW4gaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnN0cnVjdCBQZXJzb24gewotCWNoYXIgbmFtZVszMl07Ci0JY2hhciBhZGRyZXNzWzY0XTsKLQlpbnQgaWQ7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIFNXSUcgaXMgcnVuLCB5b3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyB3YXJuaW5ncyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAtcHl0aG9uICBleGFtcGxlLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFB5dGhvbgotZXhhbXBsZS5pIDogTGluZSAyLiBXYXJuaW5nLiBBcnJheSBtZW1iZXIgd2lsbCBiZSByZWFkLW9ubHkuCi1leGFtcGxlLmkgOiBMaW5lIDMuIFdhcm5pbmcuIEFycmF5IG1lbWJlciB3aWxsIGJlIHJlYWQtb25seS4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhlc2Ugd2FybmluZyBtZXNzYWdlcyBpbmRpY2F0ZSB0aGF0IFNXSUcgZG9lcyBub3Qga25vdyBob3cgeW91IHdhbnQgdG8gc2V0IHRoZSBuYW1lIGFuZCBhZGRyZXNzIGZpZWxkcy4gQXMgYSByZXN1bHQsIHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byBxdWVyeSB0aGVpciB2YWx1ZS48cD4KLTxwPgotVG8gZml4IHRoaXMsIHdlIGNvdWxkIHN1cHBseSB0d28gdHlwZW1hcHMgaW4gdGhlIGZpbGUgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0KLSV0eXBlbWFwKG1lbWJlcmluKSBjaGFyIFszMl0gewotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLDMyKTsKLX0KLSV0eXBlbWFwKG1lbWJlcmluKSBjaGFyIFs2NF0gewotCXN0cm5jcHkoJHRhcmdldCwkc291cmNlLDY0KTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlICJtZW1iZXJpbiIgdHlwZW1hcCBpcyB1c2VkIHRvIHNldCBtZW1iZXJzIG9mIHN0cnVjdHVyZXMgYW5kIGNsYXNzZXMuIFdoZW4geW91IHJ1biB0aGUgbmV3IHZlcnNpb24gdGhyb3VnaCBTV0lHLCB0aGUgd2FybmluZ3Mgd2lsbCBnbyBhd2F5IGFuZCB5b3UgY2FuIG5vdyBzZXQgZWFjaCBtZW1iZXIuIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgPHR0PmNoYXJbMzJdPC90dD4gYW5kIDx0dD5jaGFyWzY0XTwvdHQ+IGFyZSBkaWZmZXJlbnQgZGF0YXR5cGVzIGFzIGZhciBhcyBTV0lHIHR5cGVtYXBzIGFyZSBjb25jZXJuZWQuIEhvd2V2ZXIsIGJvdGggdHlwZW1hcHMgY2FuIGJlIGNvbWJpbmVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEEgYmV0dGVyIHR5cGVtYXAgZm9yIGNoYXIgYXJyYXlzCi0ldHlwZW1hcChtZW1iZXJpbikgY2hhciBbQU5ZXSB7Ci0Jc3RybmNweSgkdGFyZ2V0LCRzb3VyY2UsJGRpbTApOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgPHR0PkFOWTwvdHQ+IGtleXdvcmQgY2FuIGJlIHVzZWQgaW4gYSB0eXBlbWFwIHRvIG1hdGNoIGFueSBhcnJheSBkaW1lbnNpb24uIFdoZW4gdXNlZCwgdGhlIHNwZWNpYWwgdmFyaWFibGUgPHR0PiRkaW0wPC90dD4gd2lsbCBjb250YWluIHRoZSByZWFsIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkgYW5kIGNhbiBiZSB1c2VkIGFzIHNob3duIGFib3ZlLjxwPgotPHA+Ci1NdWx0aWRpbWVuc2lvbmFsIGFycmF5cyBjYW4gYWxzbyBiZSBoYW5kbGVkIGJ5IHR5cGVtYXBzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gQSB0eXBlbWFwIGZvciBoYW5kbGluZyBhbnkgaW50IFtdW10gYXJyYXkKLSV0eXBlbWFwKG1lbWJlcmluKSBpbnQgW0FOWV1bQU5ZXSB7Ci0JaW50IGksajsKLQlmb3IgKGkgPSAwOyBpICZsdDsgJGRpbTA7IGkrKykKLQkJZm9yIChqID0gMDsgaiAmbHQ7ICRkaW0xOyBqKyspIHsKLQkJCSR0YXJnZXRbaV1bal0gPSAqKCRzb3VyY2UrJGRpbTEqaStqKTsKLQkJfQotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgdXNlZCwgdGhlIHN5bWJvbHMgPHR0PiRkaW0wLDwvdHQ+IDx0dD4kZGltMTwvdHQ+LDx0dD4gJGRpbTI8L3R0PiwgZXRjLi4uIGdldCByZXBsYWNlZCBieSB0aGUgYWN0dWFsIGFycmF5IGRpbWVuc2lvbnMgYmVpbmcgdXNlZC4gPHA+Ci08cD4KLVRoZSBBTlkga2V5d29yZCBjYW4gYmUgY29tYmluZWQgd2l0aCBhbnkgc3BlY2lmaWMgZGltZW5zaW9uLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JXR5cGVtYXAocHl0aG9uLGluKSBpbnQgW0FOWV1bNF0gewotCS4uLgotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotQSB0eXBlbWFwIHVzaW5nIGEgc3BlY2lmaWMgZGltZW5zaW9uIGFsd2F5cyBoYXMgcHJlY2VkZW5jZSBvdmVyIGEgbW9yZSBnZW5lcmFsIHZlcnNpb24uIEZvciBleGFtcGxlLCA8dHQ+W0FOWV1bNF08L3R0PiB3aWxsIGJlIHVzZWQgYmVmb3JlPHR0PltBTlldW0FOWV08L3R0Pi48cD4KLTxhIG5hbWU9Im4xMCI+PC9hPjxoMj4gVHlwZW1hcHMgYW5kIHRoZSBTV0lHIExpYnJhcnk8L2gyPgotV3JpdGluZyB0eXBlbWFwcyBpcyBhIHRyaWNreSBidXNpbmVzcy4gRm9yIHRoaXMgcmVhc29uLCBtYW55IGNvbW1vbiB0eXBlbWFwcyBjYW4gYmUgcGxhY2VkIGludG8gYSBTV0lHIGxpYnJhcnkgZmlsZSBhbmQgcmV1c2VkIGluIG90aGVyIG1vZHVsZXMgd2l0aG91dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgbmFzdHkgdW5kZXJseWluZyBkZXRhaWxzLiBUbyBkbyB0aGlzLCB5b3UgZmlyc3Qgd3JpdGUgYSBmaWxlIGNvbnRhaW5pbmcgdHlwZW1hcHMgc3VjaCBhcyB0aGlzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBmaWxlIDogc3RkbWFwLmkKLS8vIEEgZmlsZSBjb250YWluaW5nIGEgdmFyaWV0eSBvZiB1c2VmdWwgdHlwZW1hcHMKLQotJXR5cGVtYXAodGNsLGluKSBpbnQgSU5URUdFUiB7Ci0JLi4uCi19Ci0ldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBET1VCTEUgewotCS4uLgotfQotJXR5cGVtYXAodGNsLG91dCkgaW50IElOVCB7Ci0JLi4uCi19Ci0ldHlwZW1hcCh0Y2wsb3V0KSBkb3VibGUgRE9VQkxFIHsKLQkuLi4KLX0KLSV0eXBlbWFwKHRjbCxhcmdvdXQpIGRvdWJsZSBET1VCTEUgewotCS4uLgotfQotLy8gYW5kIHNvIG9uLi4uCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgZmlsZSBtYXkgY29udGFpbiBkb3plbnMgb3IgZXZlbiBodW5kcmVkcyBvZiBwb3NzaWJsZSBtYXBwaW5ncy4gTm93LCB0byB1c2UgdGhpcyBmaWxlIHdpdGggb3RoZXIgbW9kdWxlcywgc2ltcGx5IGluY2x1ZGUgaXQgaW4gb3RoZXIgZmlsZXMgYW5kIHVzZSB0aGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gaW50ZXJmYWNlLmkKLS8vIE15IGludGVyZmFjZSBmaWxlCi0KLSVpbmNsdWRlIHN0ZG1hcC5pICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgdGhlIHR5cGVtYXAgbGlicmFyeQotCi0vLyBOb3cgZ3JhYiB0aGUgdHlwZW1hcHMgd2Ugd2FudCB0byB1c2UKLSVhcHBseSBkb3VibGUgRE9VQkxFIHtkb3VibGV9OwotCi0vLyBSZXN0IG9mIHlvdXIgZGVjbGFyYXRpb25zCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHRoaXMgY2FzZSwgPHR0PnN0ZG1hcC5pPC90dD4gY29udGFpbnMgYSB2YXJpZXR5IG9mIHN0YW5kYXJkIG1hcHBpbmdzLiBUaGUgPHR0PiVhcHBseTwvdHQ+IGRpcmVjdGl2ZSBsZXRzIHVzIGFwcGx5IHNwZWNpZmljIHZlcnNpb25zIG9mIHRoZXNlIHRvIG5ldyBkYXRhdHlwZXMgd2l0aG91dCBrbm93aW5nIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMuPHA+Ci08cD4KLVRvIGNsZWFyIGEgdHlwZW1hcCB0aGF0IGhhcyBiZWVuIGFwcGxpZWQsIHlvdSBjYW4gdXNlIHRoZSA8dHQ+JWNsZWFyPC90dD4gZGlyZWN0aXZlLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWNsZWFyIGRvdWJsZSB4OyAJCQkvLyBDbGVhcnMgYW55IHR5cGVtYXBzIGJlaW5nIGFwcGxpZWQgdG8gZG91YmxlIHgKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxhIG5hbWU9Im4xMSI+PC9hPjxoMj4gSW1wbGVtZW50aW5nIGNvbnN0cmFpbnRzIHdpdGggdHlwZW1hcHM8L2gyPgotT25lIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbiBvZiB0eXBlbWFwcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYXJndW1lbnQgY29uc3RyYWludHMuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgImNoZWNrIiB0eXBlbWFwLiBXaGVuIHVzZWQsIHRoaXMgYWxsb3dzIHlvdSB0byBwcm92aWRlIGNvZGUgZm9yIGNoZWNraW5nIHRoZSB2YWx1ZXMgb2YgZnVuY3Rpb24gYXJndW1lbnRzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBtYXRoCi0KLSV0eXBlbWFwKHBlcmw1LGNoZWNrKSBkb3VibGUgKnBvc2RvdWJsZSB7Ci0JaWYgKCR0YXJnZXQgJmx0OyAwKSB7Ci0JCWNyb2FrKCJFeHBlY3RpbmcgYSBwb3NpdGl2ZSBudW1iZXIiKTsKLQl9Ci19Ci0KLS4uLgotZG91YmxlIHNxcnQoZG91YmxlIHBvc2RvdWJsZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgcHJvdmlkZXMgYSBzYW5pdHkgY2hlY2sgdG8geW91ciB3cmFwcGVyIGZ1bmN0aW9uLiBJZiBhIG5lZ2F0aXZlIG51bWJlciBpcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiwgYSBQZXJsIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBhbmQgeW91ciBwcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBhbiBlcnJvciBtZXNzYWdlLjxwPgotPHA+Ci1UaGlzIGtpbmQgb2YgY2hlY2tpbmcgY2FuIGJlIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiB3b3JraW5nIHdpdGggcG9pbnRlcnMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcChweXRob24sY2hlY2spIFZlY3RvciAqIHsKLQlpZiAoJHRhcmdldCA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIk5VTEwgUG9pbnRlciBub3QgYWxsb3dlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdpbGwgcHJldmVudCBhbnkgZnVuY3Rpb24gaW52b2x2aW5nIGEgPHR0PlZlY3RvciAqPC90dD4gZnJvbSBhY2NlcHRpbmcgYSBOVUxMIHBvaW50ZXIuIEFzIGEgcmVzdWx0LCBTV0lHIGNhbiBvZnRlbiBwcmV2ZW50IGEgcG90ZW50aWFsIHNlZ21lbnRhdGlvbiBmYXVsdHMgb3Igb3RoZXIgcnVuLXRpbWUgcHJvYmxlbXMgYnkgcmFpc2luZyBhbiBleGNlcHRpb24gcmF0aGVyIHRoYW4gYmxpbmRseSBwYXNzaW5nIHZhbHVlcyB0byB0aGUgdW5kZXJseWluZyBDL0MrKyBwcm9ncmFtLjxwPgotPGEgbmFtZT0ibjEyIj48L2E+PGgyPiBUeXBlbWFwIGV4YW1wbGVzPC9oMj4KLVR5cGVtYXBzIGFyZSBpbmhlcmVudGx5IGxhbmd1YWdlIGRlcGVuZGVudCBzbyBtb3JlIGV4YW1wbGVzIGFwcGVhciBpbiBsYXRlciBjaGFwdGVycy4gVGhlIFNXSUc8dHQ+IEV4YW1wbGVzIDwvdHQ+ZGlyZWN0b3J5IGFsc28gaW5jbHVkZXMgYSB2YXJpZXR5IG9mIGV4YW1wbGVzLiBTb3BoaXN0aWNhdGVkIHVzZXJzIG1heSBnYWluIG1vcmUgYnkgZXhhbWluaW5nIHRoZSA8dHQ+dHlwZW1hcHMuaTwvdHQ+IGFuZCA8dHQ+Y29uc3RyYWludHMuaSA8L3R0PlNXSUcgbGlicmFyeSBmaWxlcy48cD4KLTxhIG5hbWU9Im4xMyI+PC9hPjxoMj4gSG93IHRvIGJyZWFrIGV2ZXJ5dGhpbmcgd2l0aCBhIHR5cGVtYXA8L2gyPgotSXQgc2hvdWxkIGJlIGVtcGhhc2l6ZWQgdGhhdCB0eXBlbWFwcyBwcm92aWRlIGEgZGlyZWN0IG1lY2hhbmlzbSBmb3IgbW9kaWZ5aW5nIFNXSUcncyBvdXRwdXQuIEFzIGEgcmVzdWx0LCBpdCBjYW4gYmUgdmVyeSBlYXN5IHRvIGJyZWFrIGFsbW9zdCBldmVyeXRoaW5nIGlmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91J3JlIGRvaW5nLiBGb3IgdGhpcyByZWFzb24sIGl0IHNob3VsZCBiZSBzdHJlc3NlZCB0aGF0IHR5cGVtYXBzIGFyZSBub3QgcmVxdWlyZWQgaW4gb3JkZXIgdG8gdXNlIFNXSUcgd2l0aCBtb3N0IGtpbmRzIG9mIGFwcGxpY2F0aW9ucy4gUG93ZXIgdXNlcnMsIGhvd2V2ZXIsIHdpbGwgcHJvYmFibHkgZmluZCB0eXBlbWFwcyB0byBiZSBhIHVzZWZ1bCB0b29sIGZvciBjcmVhdGluZyBleHRyZW1lbHkgcG93ZXJmdWwgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbnMuIDxwPgotPGEgbmFtZT0ibjE0Ij48L2E+PGgyPiBUeXBlbWFwcyBhbmQgdGhlIGZ1dHVyZTwvaDI+Ci1UaGUgY3VycmVudCB0eXBlbWFwIG1lY2hhbmlzbSwgd2hpbGUgbmV3LCB3aWxsIHByb2JhYmx5IGZvcm0gdGhlIGJhc2lzIG9mIFNXSUcgMi4wLiBSYXRoZXIgdGhhbiBoYXZpbmcgY29kZSBidXJpZWQgYXdheSBpbnNpZGUgYSBDKysgbW9kdWxlLCBpdCBtYXkgc29vbiBiZSBwb3NzaWJsZSB0byByZWRlZmluZSBhbG1vc3QgYWxsIG9mIFNXSUcncyBjb2RlIGdlbmVyYXRpb24gb24gdGhlIGZseS4gRnV0dXJlIGxhbmd1YWdlIG1vZHVsZXMgd2lsbCByZWx5IHVwb24gdHlwZW1hcHMgYWxtb3N0IGV4Y2x1c2l2ZWx5LiA8cD4KLTxwPgotCi08cD48aHI+Ci0KLTxhZGRyZXNzPlNXSUcgMS4xIC0gTGFzdCBNb2RpZmllZCA6IE1vbiBBdWcgIDQgMTA6NDY6NTYgMTk5NzwvYWRkcmVzcz4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzA1YzguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMS4yLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxLjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk3Mjk5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZkZTA5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC4xLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NWZkZi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMTAucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxMjgwMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjExLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDlkOGUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDgwMjkwLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNmI5MDQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjMucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFjNzVkLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS40LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS40LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1MzdlNC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuNS5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmODNmYmEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjYucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWFjMTgyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS42LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS43LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS43LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlOTNkMS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuOC5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTAudGFibGUuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZTg0NWQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjkucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDEwLnRhYmxlLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjgyNTU2Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMC50YWJsZS45LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMS4xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjMmJlYy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTEuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTEuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTEuMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDFiNTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDExLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDExLjMucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDExLjMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGVlNzI0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMS4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMi4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gxMi4xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3MmYwNi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMTIuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMi4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gyLjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjU4MDBlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gyLjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDIuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMi4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzNDBkZi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoMi4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2gzLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDMuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMDhkNmEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDMuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g1LjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjIzM2NiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g1LjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDUuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNS4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM5NWFhOS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNS4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g1LjMucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDUuMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZWFhNTkuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDUuMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGIwZmFlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDYuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkMjdkNy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LnRhYmxlLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDYudGFibGUuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODkwNWYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDYudGFibGUuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi50YWJsZS4yLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LnRhYmxlLjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRlMDAyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g2LnRhYmxlLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDYudGFibGUuMy5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi50YWJsZS4zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwODNjMy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoNi50YWJsZS4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDguMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMmY4ZTcuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDguMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC4yLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJjZjU1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDguMy5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC4zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlYWMzZS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjEucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTM1MDQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS4yLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGYxZmM4Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuMy5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS4zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5NDk4My4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjQucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmUzZDkuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS41LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2NiODBmLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS42LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyMzUwMy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOC50YWJsZS42LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g4LnRhYmxlLjcucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4N2VmZTguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDgudGFibGUuNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmNjY2EyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkuMi5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1YjdkOS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS4yLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LjMucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkuMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MDAyOTMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkuMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS4xLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2UyZDg3Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuMTAucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjU3NzczLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjIucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjY0N2UuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS4zLnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTkyYzZlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuNC5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS40LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmOTEwYS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS40LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjUucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTZlNTMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS42LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmYwMzdjLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuNy5wbmcgYi9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS43LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzZWE2OS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS43LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjgucG5nIGIvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OTRmYTYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvSFRNTC9jaDkudGFibGUuOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9IVE1ML2NoOS50YWJsZS45LnBuZyBiL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWIwZTUwLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL0hUTUwvY2g5LnRhYmxlLjkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0FkdmFuY2VkLnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9BZHZhbmNlZC5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWIwOTkuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0FkdmFuY2VkLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9Db250ZW50cy5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvQ29udGVudHMucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdiYzI4Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9Db250ZW50cy5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvRG9jdW1lbnRhdGlvbi5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvRG9jdW1lbnRhdGlvbi5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTVhZDYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0RvY3VtZW50YXRpb24ucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0V4Y2VwdGlvbnMucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL0V4Y2VwdGlvbnMucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQ2NjY1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9FeGNlcHRpb25zLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9FeHRlbmRpbmcucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL0V4dGVuZGluZy5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzNiMDUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0V4dGVuZGluZy5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvSW5kZXgucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL0luZGV4LnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxMjQzNi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvSW5kZXgucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL0ludHJvZHVjdGlvbi5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvSW50cm9kdWN0aW9uLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0YTczZC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvSW50cm9kdWN0aW9uLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9MaWJyYXJ5LnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9MaWJyYXJ5LnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0MzBlOC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvTGlicmFyeS5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvUGVybDUucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1Blcmw1LnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NjY1OC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvUGVybDUucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL1ByZWZhY2UucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1ByZWZhY2UucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGY2OWQwLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9QcmVmYWNlLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9QeXRob24ucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1B5dGhvbi5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMGZhNjIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9Eb2MxLjEvUERGL1B5dGhvbi5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvUmVmZXJlbmNlLnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9SZWZlcmVuY2UucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhkZjc0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9SZWZlcmVuY2UucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL1NXSUcucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1NXSUcucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY5OWIyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9TV0lHLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9TV0lHTWFudWFsLnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9TV0lHTWFudWFsLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQzZTc3OC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvU1dJR01hbnVhbC5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvU2NyaXB0aW5nLnBkZiBiL3N3aWd3ZWIvRG9jMS4xL1BERi9TY3JpcHRpbmcucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzVhNjZlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9TY3JpcHRpbmcucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9Eb2MxLjEvUERGL1RjbC5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvVGNsLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5MzkwNi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvVGNsLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvRG9jMS4xL1BERi9UaXRsZS5wZGYgYi9zd2lnd2ViL0RvYzEuMS9QREYvVGl0bGUucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjMzNDczLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvRG9jMS4xL1BERi9UaXRsZS5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL0RvYzEuMS9QREYvVHlwZW1hcHMucGRmIGIvc3dpZ3dlYi9Eb2MxLjEvUERGL1R5cGVtYXBzLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmYzI4NS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL0RvYzEuMS9QREYvVHlwZW1hcHMucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9JTlNUQUxMIGIvc3dpZ3dlYi9JTlNUQUxMCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc4OTEzLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi1JbnN0YWxsYXRpb246ICAgU1dJRyAxLjEKLUp1bmUgMjQsIDE5OTcKLQotSW5zdGFsbGF0aW9uIChVbml4KQotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UbyBjb21waWxlIGFuZCB1c2UgU1dJRywgeW91IHdpbGwgbmVlZCB0aGUgZm9sbG93aW5nIG9uIHlvdXIgbWFjaGluZToKLQotICAgICAgICBBIEMrKyBjb21waWxlciAgKGllLiBnKyspCi0gICAgICAgIEFuIEFOU0kgQyBjb21waWxlciAoaWUuIGdjYykKLSAgICAgICAgeWFjYyBvciBiaXNvbiAgKG9ubHkgbmVlZGVkIHRvIHJlYnVpbGQgdGhlIFNXSUcgcGFyc2VyKS4KLQotVG8gY29tcGlsZSBhbmQgaW5zdGFsbCBTV0lHLCB0eXBlIHRoZSBmb2xsb3dpbmcgOgotCi0gICAgICAgIC4vY29uZmlndXJlCi0gICAgICAgIG1ha2UKLSAgICAgICAgbWFrZSBpbnN0YWxsCi0KLVRoZSBjb25maWd1cmF0aW9uIHNjcmlwdCB3aWxsIGF0dGVtcHQgdG8gbG9jYXRlIHZhcmlvdXMgcGFja2FnZXMgb24KLXlvdXIgbWFjaGluZSwgaW5jbHVkaW5nIFRjbCwgUGVybDUsIGFuZCBQeXRob24uICAgRG9uJ3QgcGFuaWMgaWYKLXlvdSBnZXQgJ25vdCBmb3VuZCcgbWVzc2FnZXMtLVNXSUcgZG9lcyBub3QgbmVlZCB0aGVzZSBwYWNrYWdlcwotdG8gY29tcGlsZSBvciBydW4uICAgVGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgYWN0dWFsbHkgbG9va2luZyBmb3IgCi10aGVzZSBwYWNrYWdlcyBzbyB0aGF0IHlvdSBjYW4gdHJ5IG91dCB0aGUgU1dJRyBleGFtcGxlcyBjb250YWluZWQKLWluIHRoZSAnRXhhbXBsZXMnIGRpcmVjdG9yeS4gIFNlZSB0aGUgRXhhbXBsZXMgc2VjdGlvbiBiZWxvdyBmb3IKLW1vcmUgZGV0YWlscy4gCi0KLVRoZSAnbWFrZSBydW50aW1lJyBvcHRpb24gaXMgYW4gb3B0aW9uYWwgc3RlcCB0aGF0IGNhbiBiZSB1c2VkIHRvCi1idWlsZCB0aGUgU1dJRyBydW50aW1lIGxpYnJhcmllcy4gIFRoZXNlIGxpYnJhcmllcyBhcmUgb25seSB1c2VkIHdpdGgKLWxhcmdlciBwYWNrYWdlcyBhbmQgYXJlIG5vdCBuZWNlc3NhcnkgZm9yIGxlYXJuaW5nIFNXSUcgb3IgdHJ5aW5nCi10aGUgZXhhbXBsZXMgKHBsZWFzZSByZWZlciB0byB0aGUgIkFkdmFuY2VkIHRvcGljcyIgc2VjdGlvbiBvZiB0aGUKLVNXSUcgVXNlcnMgbWFudWFsIGZvciBtb3JlIGRldGFpbHMpLgotCi1UeXBpbmcgJ21ha2UgdGVzdCcgd2lsbCBydW4gYSByYXRoZXIgZXh0ZW5zaXZlIHNlcmllcyBvZiB0ZXN0cwotYW5kIGNhbiBiZSBydW4gYmVmb3JlIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcgKGlmIHlvdSBhcmUgcGFyYW5vaWQpLgotCi1UaGVyZSBhcmUgYSBudW1iZXIgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgeW91IGNhbiBnaXZlIHRvCi0nY29uZmlndXJlJyA6Ci0KLSAgICAgICAgLS1wcmVmaXg9L3Vzci9sb2NhbCAgICAgCi0KLSAgICAgICAgICBTZXQgdGhlIGluc3RhbGxhdGlvbiBwcmVmaXguICBTV0lHIGluc3RhbGxzIGludG8KLSAgICAgICAgICAvdXNyL2xvY2FsIGJ5IGRlZmF1bHQuCi0KLSAgICAgICAgLS1leGVjX3ByZWZpeD0vdXNyL2xvY2FsCi0KLSAgICAgICAgICBTZXQgdGhlIHByZWZpeCB1c2VkIHRvIGluc3RhbGwgcGxhdGZvcm0gc3BlY2lmaWMKLSAgICAgICAgICBmaWxlcyAoYmluYXJpZXMgYW5kIGxpYnJhcmllcykuICBVc2UgdGhpcyBpZiB0aGUKLSAgICAgICAgICBsb2NhdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiB0aGF0IGdpdmVuIHdpdGggLS1wcmVmaXguCi0KLSAgICAgICAgLS13aXRoLWxhbmc9e1RDTCxUQ0w4LFBZVEhPTixQRVJMNSxQRVJMNCxHVUlMRX0KLQotICAgICAgICAgIFRoaXMgbGV0cyB5b3UgY2hvb3NlIHRoZSBkZWZhdWx0IFNXSUcgdGFyZ2V0IGxhbmd1YWdlLgotICAgICAgICAgIEJ5IGRlZmF1bHQsIFNXSUcgY2hvb3NlcyBUQ0wsIGJ1dCB5b3UgY2FuIHNlbGVjdAotICAgICAgICAgIGFub3RoZXIgYXMgc2hvd24gOgotCi0gICAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLWxhbmc9UFlUSE9OCi0KLSAgICAgICAgLS13aXRoLWRvYz17QVNDSUksTEFURVgsSFRNTCxOT0RPQ30KLQotICAgICAgICAgIFRoaXMgbGV0cyB5b3UgY2hvb3NlIHRoZSBkZWZhdWx0IFNXSUcgZG9jdW1lbnRhdGlvbgotICAgICAgICAgIG1ldGhvZC4gIEJ5IGRlZmF1bHQsIFNXSUcgY2hvb3NlcyBBU0NJSS4KLQotVG8gdGVzdCB0aGUgU1dJRyBwYXJzZXIgYWZ0ZXIgY29tcGlsYXRpb24sIHR5cGUgJ21ha2UgdGVzdCcuICAKLQotU2l0ZSBzcGVjaWZpYyBpbnN0YWxsYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdoaWxlIG5vdCByZXF1aXJlZCBmb3IgY29tcGlsaW5nIFNXSUcsIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdCBsb29rcwotZm9yIHZhcmlvdXMgcGFja2FnZXMgaW4gb3JkZXIgdG8gY3JlYXRlIGEgbWFrZWZpbGUgZm9yIGNvbXBpbGluZyB0aGUKLWV4YW1wbGVzLiAgVGhpcyBtYWtlZmlsZSBpcyBhbHNvIGluc3RhbGxlZCB3aXRoIHRoZSBTV0lHIHBhY2thZ2UuCi1UaGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGxvY2F0aW9uCi1vZiB2YXJpb3VzIHBhY2thZ2VzLgotCi0tLXdpdGgtdGNsPXBhdGhuYW1lICAgICAgICAgIC0gU2V0IHJvb3QgZGlyZWN0b3J5IG9mIFRjbCBpbnN0YWxsYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dJRyB3aWxsIHVzZSAkcGF0aG5hbWUvaW5jbHVkZSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGF0aG5hbWUvbGliLgotCi0tLXdpdGgtdGNsaW5jbD1wYXRobmFtZSAgICAgIC0gU2V0IGV4YWN0IGxvY2F0aW9uIG9mIFRjbCBpbmNsdWRlIGZpbGVzCi0KLS0td2l0aC10Y2xsaWI9cGF0aG5hbWUgICAgICAgLSBTZXQgZXhhY3QgbG9jYXRpb24gb2YgVGNsIGxpYnJhcnkgZmlsZXMKLQotLS13aXRoLWl0Y2w9cGF0aG5hbWUgICAgICAgICAtIFNhbWUgYXMgYWJvdmUgYnV0IGZvciBbaW5jciBUY2xdCi0KLS0td2l0aC1pdGNsaW5jbD1wYXRobmFtZSAgICAgLSBMb2NhdGlvbiBvZiBbaW5jciBUY2xdIGluY2x1ZGUgZmlsZXMKLQotLS13aXRoLWl0Y2xsaWI9cGF0aG5hbWUgICAgICAtIExvY2F0aW9uIG9mIFtpbmNyIFRjbF0gbGlicmFyaWVzCi0KLS0td2l0aC1weT1wYXRobmFtZSAgICAgICAgICAgLSBTZXQgcGFja2FnZSBsb2NhdGlvbiBvZiBQeXRob24uIFRoaXMgaXMgdXN1YWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyBsaWtlIC91c3IvbG9jYWwuICBjb25maWd1cmUgd2lsbCBhdHRlbXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBpbmNsdWRlIGFuZCBsaWJyYXJ5IGZpbGVzLgotCi0tLXdpdGgtcHlpbmNsPXBhdGhuYW1lICAgICAgIC0gU2V0IGxvY2F0aW9uIG9mIFB5dGhvbiBpbmNsdWRlIGZpbGVzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgZXhhbXBsZSwgL3Vzci9sb2NhbC9pbmNsdWRlKQotCi0tLXdpdGgtcHlsaWI9cGF0aG5hbWUgICAgICAgIC0gU2V0IGxvY2F0aW9uIG9mIFB5dGhvbiBsaWJyYXJ5IGZpbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBleGFtcGxlLCAvdXNyL2xvY2FsL2xpYikKLQotLS13aXRoLXBlcmw1PWV4ZWN1dGFibGUgICAgICAtIFNwZWNpZnkgeW91ciBwZXJsNSBleGVjdXRhYmxlLiAgU1dJRyB3aWxsIGZpZ3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCB3aGVyZSBmaWxlcyBhcmUgYnkgcnVubmluZyB0aGlzIHZlcnNpb24gb2YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybCBhbmQgZ3JhYmJpbmcgaXRzIGNvbmZpZ3VyYXRpb24gZGF0YS4KLQotCi1PdGhlciBvcHRpb25zIDoKLQotLS13aXRob3V0LXlhY2MgICAgICAgICAgICAgICAtIFRyeSB0byBjb21waWxlIFNXSUcgdXNpbmcgYSBwcmVnZW5lcmF0ZWQgWUFDQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgZ2VuZXJhdGVkIGJ5IEJlcmtlbGV5IFlBQ0MgKGJ5YWNjKS4gT25seSByZWNvbW1lbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHlvdSBnZXQgY29tcGlsZXIgZXJyb3JzIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgcGFyc2VyLnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBwYXJzZXIuY3h4LgotCi0KLUhvdyB0byB1c2UgYSBkaWZmZXJlbnQgQysrIGNvbXBpbGVyICAoSU1QT1JUQU5UKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Ob3JtYWxseSwgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBwcm9iYWJseSB1c2UgZysrIGFzIHRoZQotQysrIGNvbXBpbGVyLiAgICBJZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgY29tcGlsZXIsIGRvCi10aGUgZm9sbG93aW5nIGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZS4KLQotCXNldGVudiBDWFggQ0MgICAgICAgICAgIyBTZXQgQ1hYIHRvIHlvdXIgQysrIGNvbXBpbGVyCi0JLi9jb25maWd1cmUgCi0JbWFrZQotCi1DaGFuZ2luZyB0aGUgTWFrZWZpbGVzIHRvIHVzZSBhIGRpZmZlcmVudCBDKysgY29tcGlsZXIgYWZ0ZXIKLWNvbmZpZ3VyYXRpb24gaXMgbm90IHJlY29tbWVuZGVkISAgIElmIHlvdSBuZWVkIHRvIGRvIHRoaXMsCi1kbyB0aGlzIDoKLQotICAgICAgICBybSBjb25maWcuY2FjaGUKLQlzZXRlbnYgQ1hYIENDCi0JLi9jb25maWd1cmUKLQltYWtlCi0KLVRvIGNoYW5nZSB0aGUgQyBjb21waWxlciAoZm9yIGNvbXBpbGluZyBleGFtcGxlcyksIGZvbGxvdyB0aGUKLXNhbWUgcHJvY2VkdXJlIGFib3ZlLCBjaGFuZ2UgdGhlIHN5bWJvbCAnQ0MnIGluc3RlYWQgb2YgJ0NYWCcuCi0KLVRlc3RpbmcgOgotLS0tLS0tLS0tCi0KLVRoZXJlIGFyZSBzZXZlcmFsIHRlc3RzIHRoYXQgY2FuIGJlIGRvbmUgYWZ0ZXIgY29tcGlsYXRpb24gOgotCi1tYWtlIHRlc3QgICAgICAgLSBUZXN0cyB0aGUgU1dJRyBwYXJzZXIgYW5kIHBlcmZvcm1zIHJlZ3Jlc3Npb24gdGVzdHMKLW1ha2UgdGVzdGJ1aWxkICAtIFRlc3RzIFNXSUcgYWJpbGl0eSB0byBidWlsZCB2YXJpb3VzIG1vZHVsZXMKLSAgICAgICAgICAgICAgICAgIChzZWUgYmVsb3cpCi0KLW1ha2UgdGVzdGFsbCAgICAtIFRlc3QgYm90aCBvZiB0aGUgYWJvdmUKLQotVGhlIHRlc3RpbmcgcHJvY2VzcyByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSAnYmFzaCcgc2hlbGwgYW5kIFBlcmwuCi1JZiB5b3UgZG9uJ3QgaGF2ZSB0aGVzZSwgZG9uJ3QgZXhwZWN0IHRoZSB0ZXN0cyB0byB3b3JrLgotCi0qKiogV2FybmluZyA6ICBGdWxsIHRlc3RpbmcgcmVxdWlyZXMgYWJvdXQgMjAgTWJ5dGVzIG9mIGRpc2sgc3BhY2UgCi1hbmQgY3JlYXRlcyBhIGNvbGxlY3Rpb24gb2YgcmVncmVzc2lvbiB0ZXN0aW5nIGZpbGVzLiAgIEFmdGVyIAotcGVyZm9ybWluZyB0aGUgdGVzdHMsIHlvdSBjYW4gZG8gYSAnbWFrZSB0ZXN0Y2xlYW4nIHRvIGNsZWFuIHVwIAotdGhlIHRlc3QgZGlyZWN0b3JpZXMgdG8gdGhlaXIgaW5pdGlhbCBkaXN0cmlidXRpb24gc3RhdGUuCi0KLVRoZSBTV0lHIE1ha2VmaWxlcwotLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNXSUcgY3JlYXRlcyBhIE1ha2VmaWxlIHdpdGggcnVsZXMgb24gaG93IHRvIGJ1aWxkIGFsbCBraW5kcyBvZgotbW9kdWxlcyBmb3IgZGlmZmVyZW50IGxhbmd1YWdlcy4gIFRoaXMgbWFrZWZpbGUgaXMgY2FsbGVkCi0nTWFrZWZpbGUudGVtcGxhdGUnIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGFuZCBpcyBpbnN0YWxsZWQgd2l0aAotdGhlIFNXSUcgbGlicmFyeSBhcyAnc3dpZ19saWIvTWFrZWZpbGUnLgotCi1QcmlvciB0byBpbnN0YWxsYXRpb24sIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBydW4gYQotJ21ha2UgdGVzdGJ1aWxkJyB0byB0ZXN0IHRoaXMgTWFrZWZpbGUuICAgVGhpcyB0ZXN0IHdpbGwgcmVwb3J0Ci13aGljaCBraW5kcyBvZiBleHRlbnNpb25zIGNhbiBiZSBidWlsdC4gICBJdCBpcyBub3JtYWwgdGhhdAotc29tZSB0ZXN0cyB3aWxsIGZhaWwgKGRlcGVuZGluZyBvbiB5b3VyIHN5c3RlbSBhbmQgaW5zdGFsbGF0aW9uKSwKLWJ1dCBpZiB0aGUgdGVzdHMgZmFpbCBmb3IgYSBsYW5ndWFnZSB5b3Ugd2FudCB0byB1c2UsIHlvdSB3aWxsCi13YW50IHRvIGVkaXQgdGhlIGZpbGUgJ01ha2VmaWxlLnRlbXBsYXRlJyBieSBoYW5kLiAgSW4gdGhpcwotcHJvY2VzcywgeW91IGNhbiByZXBlYXRlZGx5IHRyeSAnbWFrZSB0ZXN0YnVpbGQnIHVudGlsIHlvdQotYXJlIHNhdGlzZmllZC4KLQotSW4gYWRkaXRpb24gdG8gdGhlICdNYWtlZmlsZS50ZW1wbGF0ZScgU1dJRyAxLjEgYXR0ZW1wdHMgdG8gY29uZmlndXJlCi1tb3JlIGFkdmFuY2VkIG1ha2VmaWxlcyBmb3IgZWFjaCBzY3JpcHRpbmcgbGFuZ3VhZ2UuICBUaGVzZSBhcmUKLWxvY2F0ZWQgaW4gJ3N3aWdfbGliL3RjbC9NYWtlZmlsZScsICdzd2lnX2xpYi9wZXJsNS9NYWtlZmlsZScsIGFuZAotJ3N3aWdfbGliL3B5dGhvbi9NYWtlZmlsZScuICBQcmlvciB0byBpbnN0YWxsYXRpb24sIHlvdSBtYXkgd2FudAotdG8gZXhhbWluZSB0aGVzZSBNYWtlZmlsZXMgdG8gbWFrZSBzdXJlIHRoZXkgYWNjdXJhdGVseSByZWZsZWN0Ci15b3VyIGxvY2FsIHNldHVwLiAgIAotCi1JZiB5b3UncmUgaGFwcHkgd2l0aCB0aGUgc2V0dXAsIHByb2NlZWQgdG8gaW5zdGFsbGF0aW9uLgotCi1JbnN0YWxsYXRpb24KLS0tLS0tLS0tLS0tLQotCi1UeXBlICdtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgU1dJRy4gIFRoaXMgd2lsbCBpbnN0YWxsIHRoZSBmb2xsb3dpbmcgOgotCi0gICAtICBUaGUgU1dJRyBMaWJyYXJ5ICAoY29udGFpbmluZyBpbnRlcmZhY2UgZmlsZXMpCi0gICAtICBzd2lnLmggICAgICAgICAgICAoSGVhZGVycyBmb3IgYnVpbGRpbmcgU1dJRyBleHRlbnNpb25zKSAgICAgICAgICAKLSAgIC0gIGxpYnN3aWcuYSAgICAgICAgIChTV0lHIGxpYnJhcnkgZm9yIGJ1aWxkaW5nIFNXSUcgZXh0ZW5zaW9ucykKLSAgIC0gIHN3aWcuMSAgICAgICAgICAgIChtYW4gcGFnZSkKLSAgIC0gIHN3aWdfbGliL01ha2VmaWxlICBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgZXh0ZW5zaW9ucwotICAgLSAgUnVudGltZSBsaWJyYXJpZXMgKGlmIGJ1aWx0IGVhcmxpZXIpLgotCi1Ucm91Ymxlc2hvb3RpbmcKLS0tLS0tLS0tLS0tLS0tCi0KLVNlZSB0aGUgZmlsZSBUUk9VQkxFU0hPT1RJTkcgZm9yIHNvbHV0aW9ucyB0byBzZXZlcmFsIHByb2JsZW1zLgotCi1XaGlsZSBJIGhhdmUgYWNjZXNzIHRvIGEgbGFyZ2UgbnVtYmVyIG9mIG1hY2hpbmVzLCBpdCdzIGltcG9zc2libGUgZm9yCi1tZSB0byB0ZXN0IGV2ZXJ5dGhpbmcuICBJZiB5b3UgY2FuJ3QgZ2V0IFNXSUcgdG8gYnVpbGQgc3VjY2Vzc2Z1bGx5LAotcGxlYXNlIHNlbmQgbWUgZW1haWwgYXQgYmVhemxleUBjcy51dGFoLmVkdS4KLQotCi1JbnN0YWxsYXRpb24gZm9yIFdpbmRvd3MgOTUgYW5kIE5UCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBXaW4gZGlyZWN0b3J5IGNvbnRhaW5zIG1ha2VmaWxlcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgNC54LgotU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgV2luIGRpcmVjdG9yeSBmb3Igc3BlY2lmaWMgYnVpbGQKLWluc3RydWN0aW9ucy4KLQotSW5zdGFsbGF0aW9uIGZvciBNYWNpbnRvc2gKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBNYWMgZGlyZWN0b3J5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIFNXSUcgb24KLXRoZSBNYWNpbnRvc2guICBBdCB0aGlzIHRpbWUsIHRoZSBNYWNpbnRvc2ggdmVyc2lvbiBpcwotZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBhcyBhIGJpbmFyeSByZWxlYXNlLiAgU291cmNlIGlzIGFsc28KLWF2YWlsYWJsZSwgYnV0IGlzIG5vbi10cml2aWFsIHRvIGJ1aWxkIGR1ZSB0byBkZXBlbmRlbmNpZXMKLW9uIG90aGVyIHBhY2thZ2VzLgotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9NYWtlZmlsZSBiL3N3aWd3ZWIvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNmQzYjguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgU2ltcGxlIG1ha2VmaWxlIHRvIGNyZWF0ZSB0aGUgd2ViIHBhZ2VzIGFuZCB1cGRhdGUvc3luY2hyb25pc2UgdG8gdGhlIHJlYWwgd2ViIHNlcnZlcgotCi1VU0VSTkFNRT13c2Z1bHRvbgotCi1hbGw6IG1ha2V3ZWIgcnN5bmMKLQotbWFrZXdlYjoKLQlweXRob24gbWFrZXdlYi5weQotCi1yc3luYzoKLQlyc3luYyAtciAtLWN2cy1leGNsdWRlIC0tcnNoPSJzc2giIC4gJChVU0VSTkFNRSlAc2hlbGwuc2YubmV0Oi9ob21lL2dyb3Vwcy9zL3N3L3N3aWcvc3dpZ3dlYgotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2FydGljbGVfY3BwLmh0IGIvc3dpZ3dlYi9hcnRpY2xlX2NwcC5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmZjM0Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2FydGljbGVfY3BwLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLVRob3VnaHRzIG9uIHRoZSBJbnNhbml0eSBDKysgUGFyc2luZwotCi08aDI+VGhvdWdodHMgb24gdGhlIEluc2FuaXR5IG9mIEMrKyBQYXJzaW5nPC9oMj4KLQotPGNlbnRlcj4KLTxlbT4KLSJQYXJzaW5nIEMrKyBpcyBzaW1wbHkgdG9vIGNvbXBsZXggdG8gZG8gY29ycmVjdGx5LiIgLS0gQW5vbnltb3VzCi08L2VtPgotPC9jZW50ZXI+Ci08cD4KLUF1dGhvcjogRGF2aWQgQmVhemxleSAoYmVhemxleUBjcy51Y2hpY2Fnby5lZHUpCi0KLTxwPgotQXVndXN0IDEyLCAyMDAyCi0KLTxwPgotQSBjZW50cmFsIGdvYWwgb2YgdGhlIFNXSUcgcHJvamVjdCBpcyB0byBnZW5lcmF0ZSBleHRlbnNpb24gbW9kdWxlcyBieQotcGFyc2luZyB0aGUgY29udGVudHMgb2YgQysrIGhlYWRlciBmaWxlcy4gIEl0J3Mgbm90IHRvbyBoYXJkIHRvIGNvbWUgdXAKLXdpdGggcmVhc29ucyB3aHkgdGhpcyBtaWdodCBiZSB1c2VmdWwtLS1hZnRlciBhbGwsIGlmIHlvdSd2ZSBnb3QKLXNldmVyYWwgaHVuZHJlZCBjbGFzcyBkZWZpbml0aW9ucywgZG8geW91IHJlYWxseSB3YW50IHRvIGdvIG9mZiBhbmQKLXdyaXRlIGEgYnVuY2ggb2YgaGFuZC1jcmFmdGVkIHdyYXBwZXJzPyAgTm8sIG9mIGNvdXJzZSBub3QtLS15b3UncmUKLWJ1c3kgYW5kIGxpa2UgZXZlcnlvbmUgZWxzZSwgeW91J3ZlIGdvdCBiZXR0ZXIgdGhpbmdzIHRvIGRvIHdpdGgKLXlvdXIgdGltZS4gIAotCi08cD4KLU9rYXksIHNvIHRoZXJlIGFyZSBtYW55IHJlYXNvbnMgd2h5IHBhcnNpbmcgQysrIHdvdWxkIGJlIG5pY2UuCi1Ib3dldmVyLCBwYXJzaW5nIEMrKyBpcyBhbHNvIGEgbmlnaHRtYXJlLiAgSW4gZmFjdCwgQysrIHdvdWxkCi1wcm9iYWJseSB0aGUgbGFzdCBsYW5ndWFnZSB0aGF0IGFueSBub3JtYWwgcGVyc29uIHdvdWxkIGNob29zZSB0bwotc2VydmUgYXMgYW4gaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gbGFuZ3VhZ2UuICBJdCdzIGhhcmQgdG8gcGFyc2UsCi1oYXJkIHRvIGFuYWx5emUsIGFuZCBpdCBpbnZvbHZlcyBhbGwgc29ydHMKLW9mIG5hc3R5IGxpdHRsZSBwcm9ibGVtcyByZWxhdGVkIHRvIHNjb3BpbmcsIHR5cGVuYW1lcywgdGVtcGxhdGVzLAotYWNjZXNzLCBhbmQgc28gZm9ydGguICBCZWNhdXNlIG9mIHRoaXMsIG1vc3Qgb2YgdGhlIHRvb2xzIHRoYXQgY2xhaW0KLXRvICJwYXJzZSIgQysrIGRvbid0LiAgSW5zdGVhZCwgdGhleSBwYXJzZSBhIHN1YnNldCBvZiB0aGUgbGFuZ3VhZ2UKLXRoYXQgaGFwcGVucyB0byBtYXRjaCB0aGUgQysrIHByb2dyYW1taW5nIHN0eWxlIHVzZWQgYnkgdGhlIHRvb2wncwotY3JlYXRvciAoYmVsaWV2ZSBtZSwgSSBrbm93LS0tdGhpcyBpcyBob3cgU1dJRyBzdGFydGVkKS4gIE5vdAotc3VycHJpc2luZ2x5LCB0aGVzZSB0b29scyB0ZW5kIHRvIGJyZWFrIGRvd24gd2hlbiBwcmVzZW50ZWQgd2l0aCBjb2RlCi10aGF0IHN0YXJ0cyB0byBjaGFsbGVuZ2UgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgQysrIGNvbXBpbGVyLgotTmVlZGxlc3MgdG8gc2F5LCBjcml0aWNzIHNlZSB0aGlzIGFzIG9wcG9ydHVuaXR5IHRvIG1ha2UgYm9sZCBjbGFpbXMKLXN1Y2ggYXMgIndyaXRpbmcgYSBDKysgcGFyc2VyIGlzIGZvbGx5IiBvciAidGhpcyB3aG9sZSBhcHByb2FjaCBpcyB0b28KLWhhcmQgdG8gZXZlciB3b3JrIGNvcnJlY3RseS4iCi0KLTxwPgotV2VsbCwgb25lIGRvZXMgaGF2ZSB0byBnaXZlIHRoZSBjcml0aWNzIGEgbGl0dGxlIGNyZWRpdC0tLXdyaXRpbmcgYQotQysrIHBhcnNlciBjZXJ0YWlubHkgPGVtPmlzPC9lbT4gaGFyZCBhbmQgd3JpdGluZyBhIHBhcnNlciB0aGF0Ci1hY3R1YWxseSB3b3JrcyBjb3JyZWN0bHkgaXMgZXZlbiBoYXJkZXIuICBIb3dldmVyLCB0aGVzZSB0YXNrcyBhcmUKLWNlcnRhaW5seSBub3QgImltcG9zc2libGUuIiAgQWZ0ZXIgYWxsLCB0aGVyZSB3b3VsZCBiZSBubyB3b3JraW5nIEMrKwotY29tcGlsZXIgaWYgc3VjaCBjbGFpbXMgd2VyZSB0cnVlISAgVGhlcmVmb3JlLCB0aGUgcXVlc3Rpb24gb2Ygd2hldGhlcgotb3Igbm90IGEgd3JhcHBlciBnZW5lcmF0b3IgY2FuIHBhcnNlIEMrKyBpcyBjbGVhcmx5IHRoZSB3cm9uZyBxdWVzdGlvbgotdG8gYXNrLiAgSW5zdGVhZCwgdGhlIHJlYWwgcXVlc3Rpb24gaXMgd2hldGhlciBvciBub3QgYSB3cmFwcGVyCi1nZW5lcmF0aW9uIHRvb2wgdGhhdCBwYXJzZXMgQysrIGNhbiBhY3R1YWxseSBkbyBhbnl0aGluZyB1c2VmdWwuCi0KLTxoMz5UaGUgcHJvYmxlbSB3aXRoIHVzaW5nIEMrKyBhcyBhbiBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZTwvaDM+Ci0KLUlmIHlvdSBjdXQgdGhyb3VnaCBhbGwgb2YgdGhlIGxvdy1sZXZlbCBkZXRhaWxzIG9mIHBhcnNpbmcsIHRoZSBwcmltYXJ5Ci1wcm9ibGVtIG9mIHVzaW5nIEMrKyBhcyBhbiBtb2R1bGUgc3BlY2lmaWNhdGlvbiBsYW5ndWFnZSBpcyB0aGF0IG9mCi1hbWJpZ3VpdHkuIENvbnNpZGVyIGEgZGVjbGFyYXRpb24gbGlrZSB0aGlzOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci12b2lkIGZvbyhkb3VibGUgKngsIGludCBuKTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1JZiB5b3UgbG9vayBhdCB0aGlzIGRlY2xhcmF0aW9uLCB5b3UgY2FuIGFzayB5b3Vyc2VsZiB0aGUgcXVlc3Rpb24sCi13aGF0IGlzICJ4Ij8gIElzIGl0IGEgc2luZ2xlIGlucHV0IHZhbHVlPyAgSXMgaXQgYW4gb3V0cHV0IHZhbHVlCi0obW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uKT8gIElzIGl0IGFuIGFycmF5PyAgSXMgIm4iIHNvbWVob3cgcmVsYXRlZD8KLVBlcmhhcHMgdGhlIHJlYWwgcHJvYmxlbSBpbiB0aGlzIGV4YW1wbGUgaXMgdGhhdCBvZiBleHByZXNzaW5nIHRoZQotcHJvZ3JhbW1lcidzIGludGVudC4gIFllcywgdGhlIGZ1bmN0aW9uIGNsZWFybHkgYWNjZXB0cyBhIHBvaW50ZXIgdG8KLXNvbWUgb2JqZWN0IGFuZCBhbiBpbnRlZ2VyLCBidXQgdGhlIGRlY2xhcmF0aW9uIGRvZXMgbm90IGNvbnRhaW4KLWVub3VnaCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgcHVycG9zZSBvZiB0aGVzZQotcGFyYW1ldGVycy0taW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSB1c2VmdWwgaW4gZ2VuZXJhdGluZyBhIHN1aXRhYmxlCi1zZXQgb2YgYSB3cmFwcGVycy4KLQotPHA+Ci1JREwgY29tcGlsZXJzIGFzc29jaWF0ZWQgd2l0aCBwb3B1bGFyIGNvbXBvbmVudCBmcmFtZXdvcmtzIChlLmcuLAotQ09SQkEsIENPTSwgZXRjLikgIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtIGJ5IHJlcXVpcmluZyBpbnRlcmZhY2VzIHRvCi1iZSBwcmVjaXNlbHkgc3BlY2lmaWVkLS1pbnB1dCBhbmQgb3V0cHV0IHZhbHVlcyBhcmUgY2xlYXJseSBpbmRpY2F0ZWQKLWFzIHN1Y2guICBUaHVzLCBvbmUgbWlnaHQgYWRvcHQgYSBzaW1pbGFyIGFwcHJvYWNoIGFuZCBleHRlbmQgQysrCi1zeW50YXggd2l0aCBzb21lIHNwZWNpYWwgbW9kaWZpZXJzIG9yIHF1YWxpZmllcnMuICBGb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotdm9pZCBmb28oJW91dHB1dCBkb3VibGUgKngsIGludCBuKTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1UaGUgcHJvYmxlbSB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBpdCBicmVha3MgZnJvbSBDKysgc3ludGF4IGFuZAotaXQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gYW5ub3RhdGUgdGhlaXIgaW5wdXQgZmlsZXMgKGEgdGFzayB0aGF0IEMrKwotd3JhcHBlciBnZW5lcmF0b3JzIGFyZSBzdXBwb3NlZCB0byBlbGltaW5hdGUpLiAgTWVhbndoaWxlLCBjcml0aWNzIHNpdAotYmFjayBhbmQgc2F5ICJIYSEgSSB0b2xkIHlvdSBDKysgcGFyc2luZyB3b3VsZCBuZXZlciB3b3JrLiIKLQotPHA+Ci1Bbm90aGVyIHByb2JsZW0gd2l0aCB1c2luZyBDKysgYXMgYW4gaW5wdXQgbGFuZ3VhZ2UgaXMgdGhhdCBpbnRlcmZhY2UKLWJ1aWxkaW5nIG9mdGVuIGludm9sdmVzIG1vcmUgdGhhbiBqdXN0IGJsaW5kbHkgd3JhcHBpbmcgZGVjbGFyYXRpb25zLiAgRm9yIGluc3RhbmNlLAotdXNlcnMgbWlnaHQgd2FudCB0byByZW5hbWUgZGVjbGFyYXRpb25zLCBzcGVjaWZ5IGV4Y2VwdGlvbiBoYW5kbGluZyBwcm9jZWR1cmVzLAotYWRkIGN1c3RvbWl6ZWQgY29kZSwgYW5kIHNvIGZvcnRoLiAgVGhpcyBzdWdnZXN0cyB0aGF0IGEgCi13cmFwcGVyIGdlbmVyYXRvciByZWFsbHkgbmVlZHMgdG8gZG8KLW1vcmUgdGhhbiBqdXN0IHBhcnNlIEMrKy0tLWl0IG11c3QgZ2l2ZSB1c2VycyB0aGUgZnJlZWRvbSB0byBjdXN0b21pemUKLXZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgd3JhcHBlciBnZW5lcmF0aW9uIHByb2Nlc3MuICBBZ2FpbiwgdGhpbmdzIGFyZW4ndAotbG9va2luZyB0b28gZ29vZCBmb3IgQysrLgotCi08aDM+VGhlIFNXSUcgYXBwcm9hY2g6IHBhdHRlcm4gbWF0Y2hpbmc8L2gzPgotCi1TV0lHIHRha2VzIGEgZGlmZmVyZW50IGFwcHJvYWNoIHRvIHRoZSBDKysgd3JhcHBpbmcgcHJvYmxlbS4KLUluc3RlYWQgb2YgdHJ5aW5nIHRvIG1vZGlmeSBDKysgd2l0aCBhbGwgc29ydHMgb2YgbGl0dGxlIG1vZGlmaWVycyBhbmQKLWFkZC1vbnMsIHdyYXBwaW5nIGlzIGxhcmdlbHkgY29udHJvbGxlZCBieSBhIHBhdHRlcm4gbWF0Y2hpbmcgbWVjaGFuaXNtIHRoYXQgaXMKLWJ1aWx0IGludG8gdGhlIHVuZGVybHlpbmcgQysrIHR5cGUgc3lzdGVtLgotCi08cD4KLU9uZSBwYXJ0IG9mIHRoZSBwYXR0ZXJuIG1hdGNoZXIgaXMgcHJvZ3JhbW1lZCB0byBsb29rIGZvciBzcGVjaWZpYyBzZXF1ZW5jZXMgb2YKLWRhdGF0eXBlcyBhbmQgYXJndW1lbnQgbmFtZXMuICAgVGhlc2UgcGF0dGVybnMsIGtub3duIGFzIHR5cGVtYXBzLCBhcmUKLXJlc3BvbnNpYmxlIGZvciBhbGwgYXNwZWN0cyBvZiBkYXRhIGNvbnZlcnNpb24uICBUaGV5IHdvcmsgYnkgc2ltcGx5IGF0dGFjaGluZwotYml0cyBvZiBDIGNvbnZlcnNpb24gY29kZSB0byBzcGVjaWZpYyBkYXRhdHlwZXMgYW5kIGFyZ3VtZW50IG5hbWVzIGluIHRoZQotaW5wdXQgZmlsZS4gIEZvciBleGFtcGxlLCBhIHR5cGVtYXAgbWlnaHQgYmUgdXNlZCBsaWtlIHRoaXM6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSV0eXBlbWFwKGluKSA8Yj5kb3VibGUgKml0ZW1zPC9iPiB7Ci0gICAvLyBHZXQgYW4gYXJyYXkgZnJvbSB0aGUgaW5wdXQKLSAgIC4uLgotfQotLi4uIAotdm9pZCBmb28oPGI+ZG91YmxlICppdGVtczwvYj4sIGludCBuKTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1XaXRoIHRoaXMgYXBwcm9hY2gsIHR5cGUgYW5kIGFyZ3VtZW50IG5hbWVzIGFyZSB1c2VkIGFzCi1hIGJhc2lzIGZvciBzcGVjaWZ5aW5nIGN1c3RvbWl6ZWQgd3JhcHBpbmcgYmVoYXZpb3IuICBGb3IgZXhhbXBsZSwgaWYgYSBwcm9ncmFtCi1hbHdheXMgdXNlZCBhbiBhcmd1bWVudCBvZiA8dHQ+ZG91YmxlICppdGVtczwvdHQ+IHRvIHJlZmVyIHRvIGFuCi1hcnJheSwgU1dJRyBjYW4gbGF0Y2ggb250byB0aGF0IGFuZCB1c2UgaXQgdG8gcHJvdmlkZSBjdXN0b21pemVkCi1wcm9jZXNzaW5nLiAgSXQgaXMgZXZlbiBwb3NzaWJsZSB0byB3cml0ZSBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGVzIGZvcgotc2VxdWVuY2VzIG9mIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCB5b3UgY291bGQgd3JpdGUgdGhlIGZvbGxvd2luZzoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJXR5cGVtYXAoaW4pICg8Yj5kb3VibGUgKml0ZW1zLCBpbnQgbjwvYj4pIHsKLSAgIC8vIEdldCBhbiBhcnJheSBvZiBpdGVtcy4gU2V0IG4gdG8gbnVtYmVyIG9mIGl0ZW1zCi0gICAuLi4KLX0KLS4uLgotdm9pZCBmb28oPGI+ZG91YmxlICppdGVtcywgaW50IG48L2I+KTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1UaGUgcHJlY2lzZSBkZXRhaWxzIG9mIHR5cGVtYXBzIGFyZSBub3Qgc28gaW1wb3J0YW50IChpbiBmYWN0LCBtb3N0IG9mCi10aGlzIHBhdHRlcm4gbWF0Y2hpbmcgaXMgaGlkZGVuIGZyb20gU1dJRyB1c2VycykuICBXaGF0IGlzIGltcG9ydGFudAotaXMgdGhhdCBwYXR0ZXJuIG1hdGNoaW5nIGFsbG93cyBjdXN0b21pemVkIGRhdGEgaGFuZGxpbmcgdG8gYmUKLXNwZWNpZmllZCB3aXRob3V0IGJyZWFraW5nIEMrKyBzeW50YXgtLWluc3RlYWQsIGEgdXNlciBtZXJlbHkgaGFzIHRvCi1kZWZpbmUgYSBmZXcgcGF0dGVybnMgdGhhdCBnZXQgYXBwbGllZCBhY3Jvc3MgdGhlIGRlY2xhcmF0aW9ucyB0aGF0Ci1hcHBlYXIgaW4gQysrIGhlYWRlciBmaWxlcy4gIEluIHNvbWUgc2Vuc2UsIHlvdSBtaWdodCB2aWV3IHRoaXMKLWFwcHJvYWNoIGFzIHByb3ZpZGluZyBjdXN0b21pemF0aW9uIHRocm91Z2ggbmFtaW5nIGNvbnZlbnRpb25zIHJhdGhlciB0aGFuCi1oYXZpbmcgdG8gYW5ub3RhdGUgYXJndW1lbnRzIHdpdGggZXh0cmEgcXVhbGlmaWVycy4KLQotPHA+Ci1UaGUgb3RoZXIgcGF0dGVybiBtYXRjaGluZyBtZWNoYW5pc20gdXNlZCBieSBTV0lHIGlzIGEgZGVjbGFyYXRpb24gYW5ub3RhdG9yCi10aGF0IGlzIHVzZWQgdG8gYXR0YWNoIHByb3BlcnRpZXMgdG8gc3BlY2lmaWMgZGVjbGFyYXRpb25zLiAgQSBzaW1wbGUgZXhhbXBsZSBvZiBkZWNsYXJhdGlvbgotYW5ub3RhdGlvbiBtaWdodCBiZSByZW5hbWluZy4gIEZvciBleGFtcGxlOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci0lcmVuYW1lKGNwcmludCkgcHJpbnQ7ICAvLyBSZW5hbWUgYWxsIG9jY3VycmVuY2VzIG9mICdwcmludCcgdG8gJ2NwcmludCcKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1BIG1vcmUgYWR2YW5jZWQgZm9ybSBvZiBkZWNsYXJhdGlvbiBtYXRjaGluZyB3b3VsZCBiZSBleGNlcHRpb24gaGFuZGxpbmcuCi1Gb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJWV4Y2VwdGlvbiBGb286OmdldGl0ZW0oaW50KSB7Ci0gICAgdHJ5IHsKLSAgICAgICAgJGFjdGlvbgotICAgIH0gY2F0Y2ggKHN0ZDo6b3V0X29mX3JhbmdlJmFtcDsgZSkgewotICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsY29uc3RfY2FzdCZsdDtjaGFyKiZndDsoZS53aGF0KCkpKTsKLSAgICB9Ci19Ci0KLS4uLgotdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgY2xhc3MgRm9vIHsKLXB1YmxpYzoKLSAgICAgLi4uCi0gICAgIFQgJmFtcDtnZXRpdGVtKGludCBpbmRleCk7ICAgIC8vIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGF0dGFjaGVkCi0gICAgIC4uLgotfTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1MaWtlIHR5cGVtYXBzLCBkZWNsYXJhdGlvbiBtYXRjaGluZyBkb2VzIG5vdCBicmVhayBmcm9tIEMrKyBzeW50YXguCi1JbnN0ZWFkLCBhIHVzZXIgbWVyZWx5IHNwZWNpZmllcyBzcGVjaWFsIHByb2Nlc3NpbmcgcnVsZXMgaW4gYWR2YW5jZS4KLVRoZXNlIHJ1bGVzIGFyZSB0aGVuIGF0dGFjaGVkIHRvIGFueSBtYXRjaGluZyBDKysKLWRlY2xhcmF0aW9uIHRoYXQgYXBwZWFycyBsYXRlciBpbiB0aGUgaW5wdXQuICBUaGlzIG1lYW5zIHRoYXQgcmF3IEMrKwotaGVhZGVyIGZpbGVzIGNhbiBvZnRlbiBiZSBwYXJzZWQgYW5kIGN1c3RvbWl6ZWQgd2l0aCBmZXcsIGlmIGFueSwKLW1vZGlmaWNhdGlvbnMuCi0KLTxoMz5UaGUgU1dJRyBkaWZmZXJlbmNlPC9oMz4KLQotUGF0dGVybiBiYXNlZCBhcHByb2FjaGVzIHRvIHdyYXBwZXIgY29kZSBnZW5lcmF0aW9uIGFyZSBub3QgdW5pcXVlIHRvIFNXSUcuCi1Ib3dldmVyLCBtb3N0IHByaW9yIGVmZm9ydHMgaGF2ZSBiYXNlZCB0aGVpciBwYXR0ZXJuIG1hdGNoaW5nIGVuZ2luZXMgb24gc2ltcGxlCi1yZWd1bGFyLWV4cHJlc3Npb24gbWF0Y2hpbmcuIFRoZSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIFNXSUcgYW5kIHRoZXNlIHN5c3RlbXMgCi1pcyB0aGF0IFNXSUcncyBjdXN0b21pemF0aW9uIGZlYXR1cmVzIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlCi11bmRlcmx5aW5nIEMrKyB0eXBlIHN5c3RlbS4gIFRoaXMgbWVhbnMgdGhhdCBTV0lHIGlzIGFibGUgdG8gZGVhbCB3aXRoIHZlcnkgCi1jb21wbGljYXRlZCB0eXBlcyBvZiBDL0MrKyBjb2RlLS0tZXNwZWNpYWxseSBjb2RlIHRoYXQgbWFrZXMgaGVhdnkgdXNlIG9mCi08dHQ+dHlwZWRlZjwvdHQ+LCBuYW1lc3BhY2VzLCBhbGlhc2VzLCBjbGFzcyBoaWVyYXJjaGllcywgYW5kIG1vcmUuICBUbwotaWxsdXN0cmF0ZSwgY29uc2lkZXIgc29tZSBjb2RlIGxpa2UgdGhpczoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotLy8gQSBzaW1wbGUgU1dJRyB0eXBlbWFwIAotJXR5cGVtYXAoaW4pIGludCB7Ci0gICAgJDEgPSBQeUludF9Bc0xvbmcoJGlucHV0KTsKLX0KLQotLi4uCi0vLyBTb21lIHJhdyBDKysgY29kZSAoaW5jbHVkZWQgbGF0ZXIpCi1uYW1lc3BhY2UgWCB7Ci0gIHR5cGVkZWYgaW50IEludGVnZXI7Ci0KLSAgY2xhc3MgX0Zvb0ltcGwgewotICBwdWJsaWM6Ci0gICAgICB0eXBlZGVmIEludGVnZXIgdmFsdWVfdHlwZTsKLSAgfTsKLSAgdHlwZWRlZiBfRm9vSW1wbCBGb287Ci19Ci0KLW5hbWVzcGFjZSBZID0gWDsKLXVzaW5nIFk6OkZvbzsKLQotY2xhc3MgQmFyIDogcHVibGljIEZvbyB7Ci19OwotCi12b2lkIHNwYW0oQmFyOjp2YWx1ZV90eXBlIHgpOwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLUlmIHlvdSB0cmFjZSB5b3VyIHdheSB0aHJvdWdoIHRoaXMgZXhhbXBsZSwgeW91IHdpbGwgZmluZCB0aGF0IHRoZQotPHR0PkJhcjo6dmFsdWVfdHlwZTwvdHQ+IGFyZ3VtZW50IHRvIGZ1bmN0aW9uIDx0dD5zcGFtKCk8L3R0PiBpcwotcmVhbGx5IGFuIGludGVnZXIuICBXaGF0J3MgbW9yZSwgaWYgeW91IHRha2UgYSBjbG9zZSBsb29rIGF0IHRoZSBTV0lHCi1nZW5lcmF0ZWQgd3JhcHBlcnMsIHlvdSB3aWxsIGZpbmQgdGhhdCB0aGUgdHlwZW1hcCBwYXR0ZXJuIGRlZmluZWQgZm9yCi08dHQ+aW50PC90dD4gaXMgYXBwbGllZCB0byBpdC0taW4gb3RoZXIgd29yZHMsIFNXSUcgZG9lcyBleGFjdGx5IHRoZSByaWdodCB0aGluZyBkZXNwaXRlCi1vdXIgZWZmb3J0cyB0byBtYWtlIHRoZSBjb2RlIGNvbmZ1c2luZy4KLQotPHA+Ci1TaW1pbGFybHksIGRlY2xhcmF0aW9uIGFubm90YXRpb24gaXMgaW50ZWdyYXRlZCBpbnRvIHRoZSB0eXBlIHN5c3RlbQotYW5kIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBwcm9wZXJ0aWVzIHRoYXQgc3BhbiBpbmhlcml0YW5jZSBoaWVyYXJjaGllcwotYW5kIG1vcmUgKGluIGZhY3QsIHRoZXJlIGFyZSBtYW55IHNpbWlsYXJpdGllcyBiZXR3ZWVuIHRoZSBvcGVyYXRpb24gb2YKLVNXSUcgYW5kIHRvb2xzIGRldmVsb3BlZCBmb3IgQXNwZWN0IE9yaWVudGVkIFByb2dyYW1taW5nKS4KLQotPGgzPldoYXQgZG9lcyB0aGlzIG1lYW4/PC9oMz4KLQotUGF0dGVybi1iYXNlZCBhcHByb2FjaGVzIGFsbG93IHdyYXBwZXIgZ2VuZXJhdGlvbiB0b29scyB0byBwYXJzZSBDKysKLWRlY2xhcmF0aW9ucyBhbmQgdG8gcHJvdmlkZSBhIHdpZGUgdmFyaWV0eSBvZiBoaWdoLWxldmVsIGN1c3RvbWl6YXRpb24KLWZlYXR1cmVzLiAgQWx0aG91Z2ggdGhpcyBhcHByb2FjaCBpcyBxdWl0ZSBkaWZmZXJlbnQgdGhhbiB0aGF0IGZvdW5kCi1pbiBhIHR5cGljYWwgSURMLCB0aGUgdXNlIG9mIHBhdHRlcm5zIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHdvcmsgZnJvbQotZXhpc3RpbmcgaGVhZGVyIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRvIG1ha2UgbWFueSAoaWYgYW55KSBjaGFuZ2VzIHRvCi10aG9zZSBmaWxlcy4gIE1vcmVvdmVyLCB3aGVuIHRoZSB1bmRlcmx5aW5nIHBhdHRlcm4gbWF0Y2hpbmcgbWVjaGFuaXNtCi1pcyBpbnRlZ3JhdGVkIHdpdGggdGhlIEMrKyB0eXBlIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQKLXJlbGlhYmxlIHdyYXBwZXJzIHRvIHJlYWwgc29mdHdhcmUtLS1ldmVuIGlmIHRoYXQgc29mdHdhcmUgaXMgZmlsbGVkCi13aXRoIG5hbWVzcGFjZXMsIHRlbXBsYXRlcywgY2xhc3NlcywgPHR0PnR5cGVkZWY8L3R0PiBkZWNsYXJhdGlvbnMsCi1wb2ludGVycywgYW5kIG90aGVyIGJpdHMgb2YgbmFzdGluZXNzLgotCi08aDM+VGhlIGJvdHRvbSBsaW5lPC9oMz4KLQotTm90IG9ubHkgaXMgaXQgcG9zc2libGUgdG8gZ2VuZXJhdGUgZXh0ZW5zaW9uIG1vZHVsZXMgYnkgcGFyc2luZyBDKyssCi1pdCBpcyBwb3NzaWJsZSB0byBkbyBzbyB3aXRoIHJlYWwgc29mdHdhcmUgYW5kIHdpdGggYSBoaWdoIGRlZ3JlZSBvZgotcmVsaWFiaWxpdHkuICBEb24ndCBiZWxpZXZlIG1lPyAgRG93bmxvYWQgU1dJRy0xLjMuMTQgYW5kIHRyeSBpdCBmb3IKLXlvdXJzZWxmLgotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9ibGFuay5qcGcgYi9zd2lnd2ViL2JsYW5rLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NGM5Zi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2JsYW5rLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvYnVncy5odCBiL3N3aWd3ZWIvYnVncy5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhZjRmNC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2J1Z3MuaHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1TV0lHIEJ1ZyBUcmFja2luZwotCi08cD48aW1nIHNyYz0iaW1hZ2VzL2J1Z3MucG5nIiBhbHQ9IkJ1Z3MiPgotCi08cD5BIDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvYnVncy8/Z3JvdXBfaWQ9MTY0NSI+YnVnLXRyYWNraW5nIHN5c3RlbTwvYT4gZm9yIFNXSUcKLWlzIGxvY2F0ZWQgb24gPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldCI+U291cmNlRm9yZ2U8L2E+LiAKLVBsZWFzZSBsb2cgb24gdG8gU291cmNlRm9yZ2UgYmVmb3JlIHN1Ym1pdHRpbmcgYSBidWcuCi1Bbm9ueW1vdXMgYnVnIHN1Ym1pdHRlcnMgd29uJ3QgYmUgYWJsZSB0byByZWNlaXZlIGVtYWlscyBvbiB0aGUgYnVnIHByb2dyZXNzLiAKLVRoaXMgbWlnaHQgYmUgYSBwcm9ibGVtIHNob3VsZCB3ZSByZXF1aXJlIGZ1cnRoZXIgZmVlZGJhY2sgb24gdGhlIGJ1Zy4KLQotPHA+Ci1Vc2VycyB3aG8gaGF2ZSBmb3VuZCBhIGJ1ZyBhbmQgZml4ZWQgaXQgdGhlbXNlbHZlcyBjYW4gc3VibWl0IGEKLTxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcGF0Y2gvP2dyb3VwX2lkPTE2NDUiPnBhdGNoPC9hPi4KLVBsZWFzZSBnaXZlIHRoZSBTV0lHIHZlcnNpb24gb3IgQ1ZTIHNuYXBzaG90IGRhdGUgdGhhdCB0aGUgcGF0Y2ggaXMgYWdhaW5zdC4KLUFnYWluLCBwbGVhc2UgbG9nIG9uIHRvIFNvdXJjZUZvcmdlIGJlZm9yZSBzdWJtaXR0aW5nIHBhdGNoZXMuCi0KLTxwPgotUGxlYXNlIG5vdGUgdGhhdCBkdWUgdG8gdGltZSBjb25zdHJhaW50cywgYnVnIHJlcG9ydHMgbWF5IG5vdCAKLXJlY2VpdmUgYW4gaW1tZWRpYXRlIHJlc3BvbnNlLgotSWYgeW91IGhhdmUgYW4gdXJnZW50IHByb2JsZW0sIHlvdSBtYXkgd2FudCB0bwotcG9zdCBhIG1lc3NhZ2UgdG8gdGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+c3dpZzwvYT4gbWFpbGluZyBsaXN0Ci1pbnN0ZWFkLiAKLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9jZ2ktYmluL3N1cnZleXJlc3BvbnNlLnBsIGIvc3dpZ3dlYi9jZ2ktYmluL3N1cnZleXJlc3BvbnNlLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGYxMTZkLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvY2dpLWJpbi9zdXJ2ZXlyZXNwb25zZS5wbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIS91c3IvYmluL3BlcmwKLQotIyBUaGlzIGlzIGEgQ0dJIHNjcmlwdCB3aGljaCB0YWtlcyB0aGUgaW5wdXQgZnJvbSB0aGUgc2ltcGxlIHN1cnZleSBzdWJtaXR0ZWQgaW4gCi0jIHN1cnZleS5odG1sLiBUaGUgdXNlcidzIGludGVuZGVkIGxhbmd1YWdlcyBhbmQgb3BlcmF0aW5nIHN5c3RlbXMgYXJlIHN0b3JlZCBpbiAKLSMgc2ltcGxlIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBmaWxlcy4KLQotdXNlIENHSTsKLSRxID0gbmV3IENHSTsKLQotIyBTdGFydCB0aGUgcmVzcG9uc2Ugd2ViIHBhZ2UKLXByaW50ICJDb250ZW50LXR5cGU6dGV4dC9odG1sXG5cbiI7Ci1wcmludCA8PEVuZEhUTUw7Ci08aHRtbD48aGVhZD48dGl0bGU+U1dJRyBTdXJ2ZXkgU3VibWlzc2lvbjwvdGl0bGU+PC9oZWFkPgotPGJvZHk+Ci08cC8+Ci08dGFibGU+IDx0cj4KLTx0ZCBiZ2NvbG9yPSIjMDAwMDAwIiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPjxiPlNXSUcgU3VydmV5IFN1Ym1pc3Npb248L2I+PC9mb250PjwvdGQ+Ci08L3RyPiA8L3RhYmxlPgotCi1FbmRIVE1MCi0KLQotIyBFeHRyYWN0IGFsbCB0aGUgdmFyaWFibGVzIG91dCBvZiB0aGUgcmVzcG9uc2UKLSRyZW1vdGVIb3N0ID0gJEVOVnsnUkVNT1RFX0hPU1QnfTsKLSRyZW1vdGVBZGRyID0gJEVOVnsnUkVNT1RFX0FERFInfTsKLSRpcEFkZHJlc3MgPSAoJHJlbW90ZUhvc3QgPT0gJycpID8gJHJlbW90ZUFkZHIgOiAkcmVtb3RlSG9zdDsKLQotJGxhbmdDaGlja2VuICAgID0gJHEtPnBhcmFtKCdsYW5nQ2hpY2tlbicpOwotJGxhbmdDU2hhcnAgICAgID0gJHEtPnBhcmFtKCdsYW5nQ1NoYXJwJyk7Ci0kbGFuZ0d1aWxlICAgICAgPSAkcS0+cGFyYW0oJ2xhbmdHdWlsZScpOwotJGxhbmdKYXZhICAgICAgID0gJHEtPnBhcmFtKCdsYW5nSmF2YScpOwotJGxhbmdNenNjaGVtZSAgID0gJHEtPnBhcmFtKCdsYW5nTXpzY2hlbWUnKTsKLSRsYW5nT2NhbWwgICAgICA9ICRxLT5wYXJhbSgnbGFuZ09jYW1sJyk7Ci0kbGFuZ1BlcmwgICAgICAgPSAkcS0+cGFyYW0oJ2xhbmdQZXJsJyk7Ci0kbGFuZ1BocCAgICAgICAgPSAkcS0+cGFyYW0oJ2xhbmdQaHAnKTsKLSRsYW5nUGlrZSAgICAgICA9ICRxLT5wYXJhbSgnbGFuZ1Bpa2UnKTsKLSRsYW5nUHl0aG9uICAgICA9ICRxLT5wYXJhbSgnbGFuZ1B5dGhvbicpOwotJGxhbmdSdWJ5ICAgICAgID0gJHEtPnBhcmFtKCdsYW5nUnVieScpOwotJGxhbmdTZXhwICAgICAgID0gJHEtPnBhcmFtKCdsYW5nU2V4cCcpOwotJGxhbmdUY2wgICAgICAgID0gJHEtPnBhcmFtKCdsYW5nVGNsJyk7Ci0kbGFuZ1htbCAgICAgICAgPSAkcS0+cGFyYW0oJ2xhbmdYbWwnKTsKLSRsYW5nU3BhcmVMYW5nMSA9ICRxLT5wYXJhbSgnbGFuZ1NwYXJlTGFuZzEnKTsKLSRsYW5nU3BhcmVMYW5nMiA9ICRxLT5wYXJhbSgnbGFuZ1NwYXJlTGFuZzInKTsKLSRsYW5nU3BhcmVMYW5nMyA9ICRxLT5wYXJhbSgnbGFuZ1NwYXJlTGFuZzMnKTsKLSRsYW5nT3RoZXJMYW5nICA9ICRxLT5wYXJhbSgnbGFuZ090aGVyTGFuZycpOwotCi0kbmFtZWRMYW5ndWFnZSAgPSAkcS0+cGFyYW0oJ25hbWVkTGFuZ3VhZ2UnKTsKLQotJG9zQlNEICAgICAgICAgID0gJHEtPnBhcmFtKCdvc0JTRCcpOwotJG9zSFBVWCAgICAgICAgID0gJHEtPnBhcmFtKCdvc0hQVVgnKTsKLSRvc0xpbnV4ICAgICAgICA9ICRxLT5wYXJhbSgnb3NMaW51eCcpOwotJG9zTWFjT1NYICAgICAgID0gJHEtPnBhcmFtKCdvc01hY09TWCcpOwotJG9zU29sYXJpcyAgICAgID0gJHEtPnBhcmFtKCdvc1NvbGFyaXMnKTsKLSRvc1dpbmRvd3MgICAgICA9ICRxLT5wYXJhbSgnb3NXaW5kb3dzJyk7Ci0kb3NPdGhlck9TICAgICAgPSAkcS0+cGFyYW0oJ29zT3RoZXJPUycpOwotCi0kbmFtZWRPUyAgICAgICAgPSAkcS0+cGFyYW0oJ25hbWVkT1MnKTsKLQotIyBHZXQgbG9nIGRhdGUKLSgkc2Vjb25kcywgJG1pbnV0ZXMsICRob3VycywgJGRheV9vZl9tb250aCwgJG1vbnRoLCAkeWVhciwgJHdkYXksICR5ZGF5LCAkaXNkc3QpID0gZ210aW1lOwotJGxvZ0RhdGUgPSBzcHJpbnRmKCIlMDRkLyUwMmQvJTAyZCAlMDJkOiUwMmQiLCAkeWVhcisxOTAwLCAkbW9udGgrMSwgJGRheV9vZl9tb250aCwgJGhvdXJzLCAkbWludXRlcyk7Ci0KLSMgQ3JlYXRlIG5ldyBmaWxlIGVhY2ggbW9udGgKLSRmaWxlTmFtZSA9IHNwcmludGYoIi4uL3N1cnZleS9zd2lnc3VydmV5LSUwNGQtJTAyZC5jc3YiLCAkeWVhcisxOTAwLCAkbW9udGgrMSk7Ci0KLWlmICghLWUgJGZpbGVOYW1lKSB7Ci0gICAgY3JlYXRlX2ZpbGUoJGZpbGVOYW1lKTsKLX0KLQotIyBPcGVuIGZpbGUgZm9yIGFwcGVuZGluZyBhbmQgbG9jayBpdCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgYWNjZXNzCi1vcGVuKGZpbGVPVVQsICI+PiRmaWxlTmFtZSIpIG9yIGNvbnN0cnVjdF90aGFua3lvdV9wYWdlX2FuZF9leGl0KCk7ICMgV2UgY2FuJ3QgbG9nIHRoZSBpbmZvIGlmIHdlIGNhbid0IG9wZW4gdGhlIGZpbGUsIHF1aWV0bHkgZ2l2ZSB1cC4KLWZsb2NrKGZpbGVPVVQsIDIpOwotc2VlayhmaWxlT1VULCAwLCAyKTsKLQotIyBEdW1wIGFsbCB0aGUgc3VydmV5ZWQgZGF0YSB0byBmaWxlIGluIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSAoQ1NWKSBmb3JtYXQKLXByaW50IGZpbGVPVVQgIiRsb2dEYXRlLCRpcEFkZHJlc3MsIjsKLXByaW50IGZpbGVPVVQgIiRsYW5nQ2hpY2tlbiwkbGFuZ0NTaGFycCwkbGFuZ0d1aWxlLCRsYW5nSmF2YSwkbGFuZ016c2NoZW1lLCRsYW5nT2NhbWwsJGxhbmdQZXJsLCRsYW5nUGhwLCRsYW5nUGlrZSwkbGFuZ1B5dGhvbiwkbGFuZ1J1YnksJGxhbmdTZXhwLCRsYW5nVGNsLCRsYW5nWG1sLCRsYW5nU3BhcmVMYW5nMSwkbGFuZ1NwYXJlTGFuZzIsJGxhbmdTcGFyZUxhbmczLCRsYW5nT3RoZXJMYW5nLCRuYW1lZExhbmd1YWdlLCI7Ci1wcmludCBmaWxlT1VUICIkb3NCU0QsJG9zSFBVWCwkb3NMaW51eCwkb3NNYWNPU1gsJG9zU29sYXJpcywkb3NXaW5kb3dzLCRvc1NwYXJlT1MxLCRvc1NwYXJlT1MyLCRvc1NwYXJlT1MzLCRvc090aGVyT1MsJG5hbWVkT1MiOwotcHJpbnQgZmlsZU9VVCAiXG4iOwotY2xvc2UoZmlsZU9VVCk7Ci0KLSMgQ3JlYXRlIGh0bWwgcGFnZSByZXNwb25zZQotY29uc3RydWN0X3RoYW5reW91X3BhZ2VfYW5kX2V4aXQoKTsKLQotc3ViIGNyZWF0ZV9maWxlKCQpCi17Ci0gICAgbXkoJGZpbGVUb0NyZWF0ZSkgPSBAXzsKLQotICAgIG9wZW4oZmlsZU9VVCwgIj4kZmlsZVRvQ3JlYXRlIikgb3IgY29uc3RydWN0X3RoYW5reW91X3BhZ2VfYW5kX2V4aXQoKTsgIyBXZSBjYW4ndCBsb2cgdGhlIGluZm8gaWYgd2UgY2FuJ3QgY3JlYXRlIHRoZSBmaWxlLCBxdWlldGx5IGdpdmUgdXAuCi0KLSAgICAjIEdlbmVyYXRlIGZpZWxkIGhlYWRpbmcgbmFtZXMKLSAgICBwcmludCBmaWxlT1VUICJMb2dEYXRlLElQQWRkcmVzcywiOwotICAgIHByaW50IGZpbGVPVVQgIkNoaWNrZW4sQ1NoYXJwLEd1aWxlLEphdmEsTXpzY2hlbWUsT2NhbWwsUGVybCxQaHAsUGlrZSxQeXRob24sUnVieSxTZXhwLFRjbCxYbWwsU3BhcmVMYW5nMSxTcGFyZUxhbmcyLFNwYXJlTGFuZzMsT3RoZXJMYW5nLE5hbWVkTGFuZ3VhZ2UsIjsKLSAgICBwcmludCBmaWxlT1VUICJCU0QsSFBVWCxMaW51eCxNYWNPU1gsU29sYXJpcyxXaW5kb3dzLFNwYXJlT1MxLFNwYXJlT1MyLFNwYXJlT1MzLE90aGVyT1MsTmFtZWRPUyI7Ci0gICAgcHJpbnQgZmlsZU9VVCAiXG4iOwotfQotCi1zdWIgY29uc3RydWN0X3RoYW5reW91X3BhZ2VfYW5kX2V4aXQKLXsKLSAgICBwcmludCA8PEVuZEhUTUw7Ci0KLSAgICBUaGFuayB5b3UgZm9yIHRha2luZyB0aGUgdGltZSB0byBmaWxsIG91dCB0aGUgc3VydmV5LiBQbGVhc2UgY29udGludWUgdG8gdGhlIAotICAgIDxhIGhyZWY9Ii4uL2Rvd25sb2FkLmh0bWwiPkRvd25sb2FkIGFyZWE8L2E+IG9yIHJldHVybiB0byB0aGUgPGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+U1dJRyBob21lPC9hPiBwYWdlLgotICAgIDwvYm9keT48L2h0bWw+Ci0KLUVuZEhUTUwKLSAgICBleGl0OwotfQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2NvbXBhcmUuaHQgYi9zd2lnd2ViL2NvbXBhcmUuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzBhM2YuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9jb21wYXJlLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLVNXSUcgRmVhdHVyZXMKLQotPGgyPlNXSUcgRmVhdHVyZXM8L2gyPgotCi08cD4KLVRoaXMgaW5mb3JtYXRpb24gaXMgYmFzZWQgb24gdGhlIFNXSUctMS4zLjIyIHJlbGVhc2UuCi0KLTxoMz5Db2RlIEdlbmVyYXRpb248L2gzPgotCi1TV0lHIGN1cnJlbnQgZ2VuZXJhdGVzIHdyYXBwZXIgY29kZSBmb3IgdGhpcnRlZW4gZGlmZmVyZW50IHRhcmdldCBsYW5ndWFnZXM6Ci0KLTx1bD4KLTxsaT5BbGxlZ3JvIENMCi08bGk+QyMKLTxsaT5DaGlja2VuCi08bGk+R3VpbGUKLTxsaT5KYXZhCi08bGk+TW9kdWxhLTMKLTxsaT5NenNjaGVtZQotPGxpPk9DQU1MCi08bGk+UGVybAotPGxpPlBIUAotPGxpPlB5dGhvbgotPGxpPlJ1YnkKLTxsaT5UY2wKLTwvdWw+Ci0KLUluIGFkZGl0aW9uIHRvIHRoaXMsIGFuIFhNTCBvdXRwdXQgbW9kdWxlIGlzIGFsc28gYXZhaWxhYmxlIGFuZCB3b3JrCi1pcyBpbiBwcm9ncmVzcyBvbiBhIFBpa2UgbW9kdWxlLgotCi08aDM+QU5TSSBDPC9oMz4KLQotU1dJRyBpcyBjYXBhYmxlIG9mIHdyYXBwaW5nIGFsbCBvZiBBTlNJIEMuICAgRmVhdHVyZXMgaW5jbHVkZToKLQotPHVsPgotPGxpPkhhbmRsaW5nIG9mIDxlbT5hbGw8L2VtPiBBTlNJIEMgZGF0YXR5cGVzLgotPGxpPkdsb2JhbCBmdW5jdGlvbnMsIGdsb2JhbCB2YXJpYWJsZXMsIGFuZCBjb25zdGFudHMuCi08TGk+U3RydWN0dXJlcyBhbmQgdW5pb25zLgotPGxpPlBvaW50ZXJzLgotPGxpPkFycmF5cyBhbmQgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMuCi08bGk+UG9pbnRlcnMgdG8gZnVuY3Rpb25zLgotPGxpPlZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCi08bGk+VHlwZWRlZi4KLTxsaT5FbnVtcy4KLTwvdWw+Ci0KLTxoMz5BTlNJIEMrKzwvaDM+Ci0KLVNXSUcgcHJvdmlkZXMgd3JhcHBpbmcgc3VwcG9ydCBmb3IgYWxtb3N0IGFsbCBvZiBBTlNJIEMrKy4KLQotPHVsPgotPExpPkFsbCBDKysgZGF0YXR5cGVzLgotPExpPlJlZmVyZW5jZXMuCi08bGk+UG9pbnRlcnMgdG8gbWVtYmVycy4KLTxsaT5DbGFzc2VzLgotPGxpPkluaGVyaXRhbmNlIGFuZCBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLTxsaT5PdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcyAodXNpbmcgZHluYW1pYyBkaXNwYXRjaCkuCi08bGk+T3ZlcmxvYWRlZCBvcGVyYXRvcnMuCi08bGk+U3RhdGljIG1lbWJlcnMuCi08bGk+TmFtZXNwYWNlcyAoaW5jbHVkaW5nIHVzaW5nIGRlY2xhcmF0aW9ucywgYWxpYXNlcywgbmVzdGluZywgZXRjLikKLTxsaT5UZW1wbGF0ZXMKLTxsaT5NZW1iZXIgdGVtcGxhdGVzCi08bGk+VGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gYW5kIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uCi08bGk+U21hcnQgcG9pbnRlcnMKLTxsaT5MaWJyYXJ5IHN1cHBvcnQgZm9yIHN0cmluZ3MsIFNUTCB2ZWN0b3JzLCBhbmQgbW9yZS4KLTwvdWw+Ci0KLVRoZSBvbmx5IG1ham9yIEMrKyBmZWF0dXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFNXSUcgaXMgdGhlCi13cmFwcGluZyBvZiBuZXN0ZWQgY2xhc3Nlcy0tYSBwcm9ibGVtIHdlJ3JlIHdvcmtpbmcgb24uIFNXSUcgYWxzbwotZG9lcyBub3QgYWxsb3cgQysrIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBpbiBjZXJ0YWluCi10YXJnZXQgbGFuZ3VhZ2VzIChhIHN1YnRsZSBmZWF0dXJlIHRoYXQgbWlnaHQgYmUgdXNlZnVsIGluIHByb2plY3RzIHRoYXQKLXJlbHkgaGVhdmlseSBvbiB0aGUgdXNlIG9mIGNhbGxiYWNrIGZ1bmN0aW9ucykuCi0KLTxwPgotQysrIHVzZXJzIHdobyByZWx5IG9uIGFkdmFuY2VkIHRlbXBsYXRlIHByb2dyYW1taW5nIHRlY2huaXF1ZXMgCi0oZS5nLiwgdGVtcGxhdGUgbWV0YS1wcm9ncmFtbWluZykgc2hvdWxkIGFsc28gYmUgYXdhcmUgdGhhdCBTV0lHCi1jdXJyZW50bHkgcmVxdWlyZXMgbWFudWFsIGluc3RhbnRpYXRpb24gb2YgYWxsIHRlbXBsYXRlIGNsYXNzZXMuCi1UaGVyZWZvcmUsIGlmIHlvdXIgYXBwbGljYXRpb24gc29tZWhvdyBpbnZvbHZlcyB0aGUgaW5zdGFudGlhdGlvbiBvZiA1MDAwMAotdGVtcGxhdGUgY2xhc3NlcywgeW91ciBtaWxlYWdlIG1pZ2h0IHZhcnkuCi0KLTxoMz5QcmVwcm9jZXNzaW5nPC9oMz4KLQotU1dJRyBwcm92aWRlcyBhIGZ1bGwgQyBwcmVwcm9jZXNzb3Igd2l0aCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgotCi08dWw+Ci08bGk+TWFjcm8gZXhwYW5zaW9uLgotPGxpPkF1dG9tYXRpYyB3cmFwcGluZyBvZiAjZGVmaW5lIHN0YXRlbWVudHMgYXMgY29uc3RhbnRzICh3aGVuIGFwcGxpY2FibGUpLgotPGxpPlN1cHBvcnQgZm9yIEM5OSAodmFyaWFkaWMgbWFjcm8gZXhwYW5zaW9uKS4KLQotPC91bD4KLQotPGgzPkN1c3RvbWl6YXRpb24gZmVhdHVyZXM8L2gzPgotCi1TV0lHIHByb3ZpZGVzIGNvbnRyb2wgb3ZlciBtb3N0IGFzcGVjdHMgb2Ygd3JhcHBlciBnZW5lcmF0aW9uLiAgTW9zdAotb2YgdGhlc2UgY3VzdG9taXphdGlvbiBvcHRpb25zIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIEMrKyB0eXBlCi1zeXN0ZW0tLW1ha2luZyBpdCBlYXN5IHRvIGFwcGx5IGN1c3RvbWl6YXRpb25zIGFjcm9zcyBpbmhlcml0YW5jZQotaGllcmFyY2hpZXMsIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zLCBhbmQgbW9yZS4gIEZlYXR1cmVzIGluY2x1ZGU6Ci0KLTx1bD4KLTxsaT5DdXN0b21pemF0ZWQgdHlwZSBjb252ZXJzaW9uL21hcnNoYWxpbmcuCi08TGk+RXhjZXB0aW9uIGhhbmRsaW5nLgotPGxpPkNsYXNzL3N0cnVjdHVyZSBleHRlbnNpb24uCi08bGk+TWVtb3J5IG1hbmFnZW1lbnQuCi08bGk+QW1iaWd1aXR5IHJlc29sdXRpb24uCi08bGk+VGVtcGxhdGUgaW5zdGFudGlhdGlvbi4KLTxsaT5GaWxlIGltcG9ydCBhbmQgY3Jvc3MtbW9kdWxlIGxpbmtpbmcuCi08bGk+Q29kZSBpbmNsdXNpb24sIGhlbHBlciBmdW5jdGlvbiBzdXBwb3J0LgotPGxpPkV4dGVuc2l2ZSBkaWFnbm9zdGljcyAoZXJyb3Ivd2FybmluZyBtZXNzYWdlcykuCi08bGk+RXh0ZW5kZWQgU1dJRyBtYWNybyBoYW5kbGluZy4KLTwvdWw+Ci0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvY29tcGF0Lmh0IGIvc3dpZ3dlYi9jb21wYXQuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkNjQ1ZDIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9jb21wYXQuaHQKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi1TV0lHIENvbXBhdGliaWxpdHkKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2NvbXBhdC5wbmciIGFsdD0iQ29tcGF0aWJpbGl0eSI+Ci0KLTxwPgotU1dJRyBpcyBrbm93biB0byB3b3JrIG9uIHRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zIDoKLQotPHVsPgotPGxpPiBVbml4IAotCi08YmxvY2txdW90ZT4KLVNXSUcgaXMgY29uZmlndXJlZCBhbmQgYnVpbHQgdXNpbmcgYW4gYXV0b2NvbmYgc2NyaXB0IHNvIGl0IGlzCi1yZWxhdGl2ZWx5IGVhc3kgdG8gaW5zdGFsbCBvbiBhbG1vc3QgYW55IGZsYXZvciBvZiBVbml4LiAgSG93ZXZlciwgbW9zdCBvZgotU1dJRydzIGRldmVsb3BtZW50IGhhcyB0YWtlbiBwbGFjZSB1bmRlciBMaW51eCBhbmQgU29sYXJpcy4KLVdoaWxlIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdCB0cmllcyB0byBkZXRlcm1pbmUgdGhlIHByb3BlciBzZXR0aW5ncwotZm9yIHlvdXIgbWFjaGluZSwgc29tZSB0d2Vha2luZyBtYXkgYmUgcmVxdWlyZWQgdG8gY29tcGlsZSB0aGUKLWV4YW1wbGVzIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24gKGVzcGVjaWFsbHkgaWYgeW91IGFyZSB1c2luZyBhIAotdmVyc2lvbiBvZiBVbml4IHN1Y2ggYXMgQUlYIG9yIEhQVVgpLgotPC9ibG9ja3F1b3RlPgotCi08bGk+IE1pY3Jvc29mdCBXaW5kb3dzCi0KLTxibG9ja3F1b3RlPgotU1dJRyB3b3JrcyBvbiAzMiBiaXQgdmVyc2lvbnMgb2YgV2luZG93cyBzdWNoIGFzIFdpbmRvd3MgOTUvOTgvTlQvMjAwMC9YUC4gCi1Ib3dldmVyLCBnaXZlbiB0aGF0IFNXSUcgaXMgcHJpbWFyaWx5IGRldmVsb3BlZCB1bmRlciBVbml4LCB0aGUgV2luZG93cwotdmVyc2lvbiBpcyBub3QgYXMgdGhvcm91Z2hseSB0ZXN0ZWQsIGJ1dCBpcyB1c2VkIHdpZGVseSBhbmQgc3VjY2Vzc2Z1bGx5IHVuZGVyIFdpbmRvd3MuCi1DdXJyZW50bHkgdGhlIFdpbmRvd3MgdmVyc2lvbiBvZiBTV0lHIDEuMyBpcyBjb21waWxlZCBhbmQgdGVzdGVkIHVuZGVyIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3lnd2luLmNvbSI+Q3lnd2luPC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5taW5ndy5vcmciPk1pbmd3PC9hPiB1c2luZyBnY2MsIGJ1dCBzaG91bGQgYmUgY29tcGlsYWJsZSBieSBhbnkgb3RoZXIgV2luZG93cyBDKysgY29tcGlsZXIuIFNXSUcgMS4xIGNhbiBiZSBjb21waWxlZCB3aXRoIFZpc3VhbCBDKysgNC54LzUueC82Lnggb3Igd2l0aCB0aGUgQm9ybGFuZCBDKysgNS54Ci1jb21waWxlci4gICBIb3dldmVyLCBTV0lHIDEuMSBoYXMgb25seSBiZWVuIG9mZmljaWFsbHkgdGVzdGVkIHVzaW5nIHRoZQotVmlzdWFsIEMrKyBjb21waWxlci4gICBZb3UgbWF5IGFsc28gbmVlZCB0byBkZXRlcm1pbmUgd2hpY2ggY29tcGlsZXIKLWhhcyBiZWVuIHVzZWQgdG8gY29tcGlsZSB0aGUgdmFyaW91cyBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHRoYXQgeW91IHdpbGwKLWJlIHVzaW5nLiAgIEluIGdlbmVyYWwsIHVzaW5nIFNXSUcgd2l0aCBhIGRpZmZlcmVudCBDKysgY29tcGlsZXIgdGhhbgotdGhlIG9uZSB0aGF0IHdhcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UgbWF5Ci1ub3Qgd29yayAoZm9yIGV4YW1wbGUsIHRyeWluZyB0byBjcmVhdGUgYSBUY2wvVGsgbW9kdWxlIHVzaW5nIHRoZQotQm9ybGFuZCBjb21waWxlciB3aGVuIFRjbC9UayBoYXMgYmVlbiBjb21waWxlZCB3aXRoIFZpc3VhbCBDKyspLiAgCi0KLTwvYmxvY2txdW90ZT4KLQotPGxpPiBNYWNpbnRvc2gKLQotPGJsb2NrcXVvdGU+Ci1BIGhpZ2hseSBleHBlcmltZW50YWwgdmVyc2lvbiBvZiBTV0lHIGhhcyBiZWVuIGNvbXBpbGVkIHVzaW5nCi1NZXRyb3dlcmtzIENvZGUgV2FycmlvciAxMC4gIEdpdmVuIHRoZSBsaW1pdGVkIGF2YWlsYWJpbGl0eSBhbmQKLWV4cGVyaWVuY2Ugd2l0aCB0aGUgTWFjaW50b3NoLCB0aGlzIHZlcnNpb24gb2YgU1dJRyBzaG91bGQgb25seQotYmUgdXNlZCBieSBleGNlcHRpb25hbGx5IGJyYXZlIHVzZXJzLiBTV0lHIGhhcyBub3QgYmVlbiBmdWxseSB0ZXN0ZWQgd2l0aCBQeXRob24gb3IKLVBlcmwgb24gdGhlIE1hY2ludG9zaCBhbHRob3VnaCBzb21lIHVzZXJzIGhhdmUgcmVwb3J0ZWQgc3VjY2Vzcy4KLTxwPgotPGI+Tm90ZTo8L2I+U1dJRy0xLjMuMTIgZG9lcyBzdXBwb3J0IE9TLVgvRGFyd2luLiAgU2ltcGx5IGRvd25sb2FkIHRoZSBVbml4Ci1zb3VyY2VzLCBjb25maWd1cmUsIGFuZCBidWlsZCBmcm9tIHRoZSBjb21tYW5kIHRlcm1pbmFsLgotPC9ibG9ja3F1b3RlPgotPC91bD4KLQotPGgzPjxhIG5hbWU9IlN1cHBvcnRlZExhbmd1YWdlcyI+PC9hPiBTdXBwb3J0ZWQgTGFuZ3VhZ2VzIDwvaDM+Ci0KLVRoZSBmb2xsb3dpbmcgc2NyaXB0aW5nIGxhbmd1YWdlcyB3ZXJlIHN1cHBvcnRlZCBpbiB0aGUgZmluYWwgU1dJRyAxLjEgcmVsZWFzZS4KLQotPHVsPgotPGxpPiBUY2wgOC4wIGFuZCBuZXdlciB2ZXJzaW9ucy4KLTxsaT4gUHl0aG9uIDEuNSBhbmQgbmV3ZXIuCi08bGk+IFBlcmwgNS4wMDMgb3IgbmV3ZXIuCi08bGk+IEd1aWxlIDEuMy40IGFuZCBuZXdlci4KLTwvdWw+Ci0KLVRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzIGFyZSBhbHNvIHN1cHBvcnRlZCBpbiBTV0lHIDEuMy42IG9ud2FyZHMuCi0KLTx1bD4KLTxsaT4gSmF2YSBKREsgMS4xIGFuZCBuZXdlci4KLTxsaT4gUnVieS4KLTxsaT4gTXpzY2hlbWUuCi08L3VsPgotCi1QSFAgc3VwcG9ydCB3YXMgYWRkZWQgaW4gU1dJRyAxLjMuMTEuPGJyPgotT2JqZWN0aXZlIENhbWwgKE9jYW1sKSBhbmQgUGlrZSBzdXBwb3J0IHdhcyBhZGRlZCBpbiBTV0lHIDEuMy4xNC48YnI+Ci1TdXBwb3J0IGZvciBDIyBhbmQgdGhlIENoaWNrZW4gc2NoZW1lIGNvbXBpbGVyIHdhcyBhZGRlZCBpbiBTV0lHIDEuMy4xOC48YnI+Ci1TdXBwb3J0IGZvciBBbGxlZ3JvIENMIGFuZCBNb2R1bGEtMyB3YXMgYWRkZWQgaW4gU1dJRy0xLjMuMjIuPGJyPgotPHA+Ci0KLUFueSBuZXdlciB2ZXJzaW9ucyBvZiB0aGVzZSBsYW5ndWFnZXMgc2hvdWxkIGJlIGFzc3VtZWQgdG8gYmUKLXN1cHBvcnRlZCB1bmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZC4gICAKLQotVGhlcmUgaXMgYWxzbyA8YSBocmVmPSJodHRwOi8vd3d3LnVsdHJhdmlvbGV0Y29uc3VsdGluZy5jb20vcHJvamVjdHMvc3dpZ2pzIj5Td2lnSlM8L2E+LCBhIEphdmFTY3JpcHQgbW9kdWxlIGZvciBTV0lHIAotYW5kIDxhIGhyZWY9Imh0dHA6Ly9lZnNhLnNvdXJjZWZvcmdlLm5ldC9hcmNoaXZlL2NvenppL3N3aWdlaWZmZWwuaHRtIj5TV0lHRWlmZmVsPC9hPiBmb3IgRWlmZmVsLgotCi08aDM+IENvbXBpbGF0aW9uIFJlcXVpcmVtZW50cyA8L2gzPgotCi1TV0lHIGlzIGltcGxlbWVudGVkIGluIEMgYW5kIEMrKyBhbmQgaXMgZGlzdHJpYnV0ZWQgaW4gc291cmNlIGZvcm0uCi1Zb3Ugd2lsbCBuZWVkIGEgd29ya2luZyBDKysgY29tcGlsZXIgKGUuZy4gZysrKSB0byBidWlsZCBTV0lHIGFuZCBhdAotbGVhc3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQgc2NyaXB0aW5nIGxhbmd1YWdlcyB0byB1c2UgaXQgKG9yIGVsc2UgaXQKLWlzbid0IGdvaW5nIHRvIGJlIHZlcnkgdXNlZnVsKS4gIFNXSUcgZG9lcyBub3QgZGVwZW5kIHVwb24gYW55IG9mIHRoZQotc3VwcG9ydGVkIHNjcmlwdGluZyBsYW5ndWFnZXMgZm9yIGl0cyBvd24gY29tcGlsYXRpb24uICBGaW5hbGx5LAotYWx0aG91Z2ggU1dJRyBpcyBwYXJ0bHkgd3JpdHRlbiBpbiBDKyssIGEgQysrIGNvbXBpbGVyIGlzIG5vdCByZXF1aXJlZCB0byB1c2UKLVNXSUctLWl0IHdvcmtzIGp1c3QgZmluZSB3aXRoIGJvdGggQU5TSSBDIGFuZCBDKysuCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2NvcHlmdW4uaHQgYi9zd2lnd2ViL2NvcHlmdW4uaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OGVlYjQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9jb3B5ZnVuLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotUHJvcG9zZWQgU1dJRyBDb3B5cmlnaHQKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2NvcHlyaWdodC5wbmciIGFsdD0iQ29weXJpZ2h0Ij4KLQotPHByZT4KLVNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciAgKFNXSUcpCi0KLUNvcHlyaWdodCAoQykgMTk5NS0yMDAzCi1UaGUgVW5pdmVyc2l0eSBvZiBDaGljYWdvCi1BbGwgUmlnaHRzIFJlc2VydmVkCi0KLUl0J3MgZnJlZS4KLTwvcHJlPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9jb3B5cmlnaHQuaHQgYi9zd2lnd2ViL2NvcHlyaWdodC5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3OWZlYi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2NvcHlyaWdodC5odAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLVNXSUcgQ29weXJpZ2h0Ci0KLTxwPgotPGltZyBzcmM9ImltYWdlcy9jb3B5cmlnaHQucG5nIiBhbHQ9IkNvcHlyaWdodCI+Ci0KLTxwcmU+Ci1TaW1wbGlmaWVkIFdyYXBwZXIgYW5kIEludGVyZmFjZSBHZW5lcmF0b3IgIChTV0lHKQotCi1TV0lHIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXM6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUkuIAotCi1UaGlzIHNvZnR3YXJlIGluY2x1ZGVzIGNvbnRyaWJ1dGlvbnMgdGhhdCBhcmUgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIKLVVuaXZlcnNpdHkgb2YgQ2hpY2Fnby4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotbWV0OgotCi1SZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi10aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgUmVkaXN0cmlidXRpb25zCi1pbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mCi1jb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yCi1vdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgTmVpdGhlciB0aGUgbmFtZSBvZgotdGhlIFVuaXZlcnNpdHkgb2YgQ2hpY2FnbyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCi11c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci1zcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFVOSVZFUlNJVFkgT0YgQ0hJQ0FHTyBBTkQgQ09OVFJJQlVUT1JTCi0iQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKLVBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFVOSVZFUlNJVFkgT0YKLUNISUNBR08gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi1TUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLVRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLVBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1JSS4gIAotCi1Db3B5cmlnaHQgKGMpIDE5OTUtMTk5OAotVGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBhbmQgdGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQotQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCB3aXRob3V0IHdyaXR0ZW4gYWdyZWVtZW50IGFuZCB3aXRob3V0Ci1saWNlbnNlIG9yIHJveWFsdHkgZmVlcywgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKLXNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UsIHByb3ZpZGVkIHRoYXQgCi0oMSkgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdHdvIHBhcmFncmFwaHMKLWFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZSBzb3VyY2UgY29kZSBhbmQgKDIpIHJlZGlzdHJpYnV0aW9ucwotaW5jbHVkaW5nIGJpbmFyaWVzIHJlcHJvZHVjZXMgdGhlc2Ugbm90aWNlcyBpbiB0aGUgc3VwcG9ydGluZwotZG9jdW1lbnRhdGlvbi4gICBTdWJzdGFudGlhbCBtb2RpZmljYXRpb25zIHRvIHRoaXMgc29mdHdhcmUgbWF5IGJlCi1jb3B5cmlnaHRlZCBieSB0aGVpciBhdXRob3JzIGFuZCBuZWVkIG5vdCBmb2xsb3cgdGhlIGxpY2Vuc2luZyB0ZXJtcwotZGVzY3JpYmVkIGhlcmUsIHByb3ZpZGVkIHRoYXQgdGhlIG5ldyB0ZXJtcyBhcmUgY2xlYXJseSBpbmRpY2F0ZWQgaW4KLWFsbCBmaWxlcyB3aGVyZSB0aGV5IGFwcGx5LgotCi1JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SLCBUSEUgVU5JVkVSU0lUWSBPRiBDQUxJRk9STklBLCBUSEUgCi1VTklWRVJTSVRZIE9GIFVUQUggT1IgRElTVFJJQlVUT1JTIE9GIFRISVMgU09GVFdBUkUgQkUgTElBQkxFIFRPIEFOWQotUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwKLUVWRU4gSUYgVEhFIEFVVEhPUlMgT1IgQU5ZIE9GIFRIRSBBQk9WRSBQQVJUSUVTIEhBVkUgQkVFTiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLVRIRSBBVVRIT1IsIFRIRSBVTklWRVJTSVRZIE9GIENBTElGT1JOSUEsIEFORCBUSEUgVU5JVkVSU0lUWSBPRiBVVEFICi1TUEVDSUZJQ0FMTFkgRElTQ0xBSU0gQU5ZIFdBUlJBTlRJRVMsSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIAotVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUyBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgCi1USEUgQVVUSE9SUyBBTkQgRElTVFJJQlVUT1JTIEhBVkUgTk8gT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLAotU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgotCi08L3ByZT4KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9jcHAuaHQgYi9zd2lnd2ViL2NwcC5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzYjlmYy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2NwcC5odAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi1OZXcgQysrIEZlYXR1cmVzCi0KLTxoMj5EYXZlJ3MgTW9zdCBEZXNpcmVkIEMrKyBGZWF0dXJlczwvaDI+Ci0KLUluIHdyaXRpbmcgU1dJRywgSSBoYXZlIGRldmVsb3BlZCBhIHdob2xlIG5ldyBhcHByZWNpYXRpb24gZm9yIHRoZQotbGFuZ3VhZ2UgdGhhdCBpcyBDKysuICBIb3dldmVyLCBJIGhhdmUgYWxzbyBjb21lIHRvIGRpc2NvdmVyIGEgbnVtYmVyCi1vZiBzZXJpb3VzIGxpbWl0YXRpb25zIGluIHRoZSBsYW5ndWFnZS4gIFRoZXJlZm9yZSwgaW4gdGhlIGludGVyZXN0IG9mCi1wdWJsaWMgc2VydmljZSwgSSBub3cgcHJlc2VudCBteSBzZW1pLW9mZmljaWFsIGxpc3Qgb2YgQysrIGZlYXR1cmVzCi1JIHdvdWxkIG1vc3QgbGlrZSB0byBzZWUgaW1wbGVtZW50ZWQ6Ci0KLTx1bD4KLTxsaT48Yj5UaGUgc2xpZ2h0bHkgYW1iaWd1b3VzIHJlZmVyZW5jZS48L2I+IFRoaXMgd291bGQgYmUgYSB2YXJpYXRpb24KLW9uIHRoZSBldmVyLXNvLXVzZWZ1bCBDKysgcmVmZXJlbmNlICgmYW1wOykgdXNlZCB0byBkZW5vdGUgYSBxdWFudGl0eQotdGhhdCByZWZlcnMgdG8gZWl0aGVyIHRoZSBvYmplY3QgaXRzZWxmIChieSB2YWx1ZSkgdG8gYSByZWZlcmVuY2UgdG8KLWFuIG9iamVjdC4gIFRoZSBwcmVmZXJyZWQgc3ludGF4IGZvciB0aGlzIGlzIHRvIGVuY2xvc2UgdGhlIHZhcmlhYmxlCi1uYW1lIGluIGJyYWNrZXRzIGFuZCB1c2UgdGhlIGFtcGVyc2FuZCBsaWtlIHRoaXMKLTx0dD4mbHQ7JmFtcDtmb28mZ3Q7PC90dD4uCi0KLTxibG9ja3F1b3RlPgotPHByZT4KLXZvaWQgZm9vKEJhciA8JmFtcDtiPikgewotICAgIGIuZnJhZygzKTsgICAgICAgLy8gQ2FsbCBzb21lIG1ldGhvZCAgCi0gICAgLi4uCi19Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotSW4gdGhpcyBjYXNlLCA8dHQ+Zm9vPC90dD4gd291bGQgZWl0aGVyIGJlIHBhc3NlZCBhIGNvcHkgb2YgYQotPHR0PkJhcjwvdHQ+IHR5cGUgKHBhc3MgYnkgdmFsdWUpIG9yIGEgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nCi08dHQ+QmFyPC90dD4uICBUaGUgcHJlY2lzZSBjaG9pY2UsIG9mIGNvdXJzZSwgd291bGQgYmUgdXAgdG8gdGhlCi1pbXBsZW1lbnRhdGlvbi4gIE9idmlvdXNseSwgdGhlIGNvbXBpbGVyIHdvdWxkIHBpY2sgdGhlIGJlc3QKLW9wdGlvbi0tbWFraW5nIGl0IGEgZ29vZCBjaG9pY2UgZm9yIHByb2dyYW1tZXJzIHRvbyBzdHVwaWQgdG8ga25vdyB3aGV0aGVyCi10aGV5IHNob3VsZCB1c2UgYSBwb2ludGVyIG9yIG5vdC4KLTxwPgotT2J2aW91c2x5LCB0aGVyZSBhcmUgYSBmZXcgY29tcGxpY2F0ZWQgY2FzZXMgc3VjaCBhczoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotdm9pZCBmb28oY29uc3QgQmFyICpjb25zdCAqPCZhbXA7Yj4pOwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLVRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgdG8gdGhlIHJlYWRlciAoaGV5LAotaXQncyBnb29kIHRvIGJlIGEgcHJvZmVzc29yKS4KLQotPGxpPjxwPjxiPkNpcmN1bGFyIHNoaWZ0IG9wZXJhdG9ycy48L2I+IFN1cmUsIG9uZSBkb2Vzbid0IHJlYWxseSBuZWVkIHRvCi1kbyBhIGNpcmN1bGFyIGJpdCBzaGlmdCB2ZXJ5IG9mdGVuLCBidXQgdGhleSBhcmUgc29tZXRpbWVzIHVzZWZ1bCBpbgotY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG1zIGFuZCBmb3IgZ2VuZXJhbC1wdXJwb3NlIGJpdC10d2lkZGxpbmcuICBJCi1wcm9wb3NlIHRoZSBpbmNsdXNpb24gb2YgdGhlIHRyaXBsZSBhbmdsZSBicmFja2V0IG9wZXJhdG9ycwotKDx0dD4mbHQ7Jmx0OyZsdDs8L3R0PiBhbmQgPHR0PiZndDsmZ3Q7Jmd0OzwvdHQ+KSBmb3IgdGhpcyBwdXJwb3NlLiAgT2YKLWNvdXJzZSwgdGhlc2Ugb3BlcmF0b3JzIGNvdWxkIGFsc28gYmUgb3ZlcmxvYWRlZCBqdXN0IGxpa2UgdGhlIG5vcm1hbAotc2hpZnQgb3BlcmF0b3JzLiAgSXQncyBub3QgdGhhdCBJIHJlYWxseSBuZWVkIHRoZXNlIG9wZXJhdG9ycywgYnV0IGl0Ci1pcyB5ZXQgYW5vdGhlciBvcHBvcnR1bml0eSB0byBpbmNsdWRlIG1vcmUgYW5nbGUgYnJhY2tldHMgaW50byB0aGUKLWxhbmd1YWdlLgotCi08bGk+PHA+PGI+VGhlIHN1cnZpdmFsIGNhc3QuPC9iPiAgSSdtIG5vdCByZWFsbHkgc3VyZSB3aGVyZSBJIGdvdCB0aGlzIGlkZWEsCi1idXQgYmFzaWNhbGx5IGl0IHdvcmtzIGxpa2UgdGhpczogZ2l2ZW4gYW4gb2JqZWN0LCB5b3UgY2FuIGNhc3QgaXQgdXNpbmcKLWEgPHR0PnN1cnZpdmFsX2Nhc3Q8L3R0PiBsaWtlIHRoaXMgIAotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci1CYXIgKnggPSBzdXJ2aXZhbF9jYXN0Jmx0O0JhciAqJmd0Oyh5KTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1BZnRlcndhcmRzLCB0aGUgb2JqZWN0IHRoYXQgPHR0Png8L3R0PiBwb2ludHMgdG8gaXMgZ3VhcmFudGVlZCB0byBiZQotdW5kZWxldGFibGUtLWV2ZW4gaWYgYSBwcm9ncmFtIHJlcGVhdGVkbHkgY2FsbHMgPHR0PmRlbGV0ZTwvdHQ+IG9yCi08dHQ+ZnJlZSgpPC90dD4gb24gaXQuICBUaGlzIGVmZmVjdCBhcHBsaWVzIHRvIHRoZSBvYmplY3QgaXRzZWxmLCBub3QKLXRoZSBwb2ludGVyICh0aHVzLCB0aGUgY2FzdCBpbXBsaWNpdGx5IGFwcGxpZXMgdG8gYWxsIG90aGVyIHBvaW50ZXJzIHJlZmVycmluZyB0bwotdGhlIHNhbWUgb2JqZWN0KS4gIEZ1cnRoZXJtb3JlLCB0aGUgY2FzdCByZW1haW5zIGluIGVmZmVjdCB1bnRpbCB0aGUKLXByb2dyYW0gdGVybWluYXRlcy0tbWFraW5nIHRoaXMgYSBwYXJ0aWN1bGFybHkgZ29vZCB3YXkgdG8gYXZvaWQgdGhvc2UKLXBlc2t5IG1lbW9yeSBtYW5hZ2VtZW50IHByb2JsZW1zIHN1Y2ggYXMgY2FsbGluZyBkZWxldGUgdG9vIG1hbnkgdGltZXMKLWJ5IGFjY2lkZW50LgotCi08cD4KLVRoZSBzdXJ2aXZhbCBjYXN0IGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIGFuIGFycmF5Ci1vciBjb250YWluZXIuICBIb3dldmVyLCBpbiB0aGlzIGNhc2UsIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGVuc3VyZQotdGhhdCBkZWxldGlvbiBvZiB0aGUgYXJyYXkgb3IgY29udGFpbmVyIG9ubHkgZGVsZXRlcyB0aG9zZSBtZW1iZXJzIGZvcgotd2hpY2ggdGhlIHN1cnZpdmFsIGNhc3QgaGFzIG5vdCBiZWVuIGFwcGxpZWQuCi0KLTxwPgotV2hlbiB0b28gbWFueSBvYmplY3RzIGhhdmUgYmVlbiBjYXN0IHVzaW5nIHRoZSBzdXJ2aXZhbCBjYXN0LCB0aGV5IG1heQotZGVjaWRlIHRvIHNwb250YW5lb3VzbHkgZGVsZXRlIHRoZW1zZWx2ZXMgYWxvbmcgd2l0aCBhbiB1bnNwZWNpZmllZAotbnVtYmVyIG9mIG5vbi1zdXJ2aXZhbCBvYmplY3RzLiAgVGhpcyBpcyBhIGZlYXR1cmUuICBIb3dldmVyLCB0aGUKLXByZWNpc2UgbWVjaGFuaXNtIGFuZCBzY29wZSBvZiBkZXN0cnVjdGlvbiBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYwotYW5kIG1heSBkZXBlbmQgb24gdGhlIHR5cGUgb2Ygb2JqZWN0cyB0byB3aGljaCB0aGUgc3Vydml2YWwgY2FzdCBoYXMKLWJlZW4gYXBwbGllZC4KLQotPGxpPjxwPjxiPlRoZSBub24tY2FzdGFibGUgZnVuY3Rpb24gcG9pbnRlcjwvYj4uICBTaW5jZSBmdW5jdGlvbiBwb2ludGVycyBhcmUKLXRvbyBjb25mdXNpbmcgZm9yIGV2ZXJ5b25lLCBpdCBzaG91bGQgYmUgaW1wb3NzaWJsZSB0byBjYXN0IHRoZW0gaW50byBhbnkKLW90aGVyIHR5cGUuICBPaCB3YWl0LCB0aGlzIGlzIGFscmVhZHkgYSBDKysgZmVhdHVyZS4KLQotPGxpPjxwPjxiPlRoZSBpZGVudGlmaWVyIGxlbmd0aCBjYXN0PC9iPi4gIFNpbmNlIHdlJ3JlIG9uIHRoZSBzdWJqZWN0IG9mIGNhc3RpbmcuLi4uICBJIHdvdWxkCi1hbHNvIGxpa2UgdG8gcHJvcG9zZSB0aGUgaWRlbnRpZmllciBsZW5ndGggY2FzdC4gIFRoaXMgaXMgYSBjYXN0IHRoYXQgb25seSB3b3JrcwotaWYgdGhlIGlkZW50aWZpZXIgbmFtZXMgb2YgdGhlIHR3byB0eXBlcyBhcmUgZXhhY3RseSB0aGUgc2FtZSBsZW5ndGggaW4gCi1jaGFyYWN0ZXJzLiAgRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLUJhciAqeCA9IGlkZW50aWZpZXJfbGVuZ3RoX2Nhc3QmbHQ7Rm9vIComZ3Q7KHkpOyAgICAgLy8gT2sKLUZvb0JhciAqeCA9IGlkZW50aWZpZXJfbGVuZ3RoX2Nhc3QmbHQ7Rm9vIComZ3Q7KHkpOyAgLy8gRXJyb3IKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1JbiBhZGRpdGlvbiwgdGhlcmUgc2hvdWxkIGJlIGFuIDx0dD5pZGVudGlmaWVyX2Nhc2VfY2FzdDwvdHQ+IHRoYXQgd29ya3Mgc2ltaWxhcmx5LCBidXQKLXdoaWNoIGxvb2tzIGF0IHRoZSBjYXNlIG9mIHRoZSB0eXBlIG5hbWVzLiAgIEknbSBub3QgcmVhbGx5IHN1cmUgd2hhdCBwdXJwb3NlIHRoZXNlIGNhc3RzCi13b3VsZCBzZXJ2ZSwgYnV0IHRoYXQgZG9lc24ndCByZWFsbHkgZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIGFueSBvZiB0aGUgb3RoZXIgY2FzdHMuCi0gCi08bGk+PHA+PGI+VGhlIGluc3RhbmNlIGdvdG88L2I+LiAgSW4gYSBudXRzaGVsbCwgSSByZWFsbHkgd2FudCB0byBiZSBhYmxlIHRvIGRvCi10aGlzOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci1jbGFzcyBGb28gewotcHVibGljOgotICAgLi4uCi0gICBiYXI6Ci0gICAgICBwcmludGYoIkhlbGxvIHdvcmxkXG4iKTsKLSAgICAgIC4uLiBzb21lIGNvZGUgaGVyZSAuLi4KLSAgICAgIGJyZWFrOwotfTsKLQotaW50IG1haW4oKSB7Ci0gICAgRm9vICpmID0gbmV3IEZvbzsKLSAgICBnb3RvIGYuYmFyOwotICAgIC4uLgotfQotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci1PYnZpb3VzbHksIHRoZSBiZW5lZml0cyBvZiB0aGlzIGZlYXR1cmUgYXJlIHNlbGYtZXZpZGVudC4gIEhvd2V2ZXIsCi10aGVyZSBhcmUgc3RpbGwgYSBmZXcgdHJpY2t5IHBvaW50cy4gIEZpcnN0LCB0aGUgZ290byBzaG91bGQgd29yayB3aXRoCi1pbmhlcml0YW5jZSB3aGVuIHRoZSBnb3RvIGxhYmVsIGhhcHBlbnMgdG8gYXBwZWFyIGluIGEgYmFzZS1jbGFzcy4gIFNlY29uZCwKLXRoZSBnb3RvIHNob3VsZCBjZXJ0YWlubHkgdGFrZSBhZHZhbnRhZ2Ugb2YgZHluYW1pYyBiaW5kaW5nIG11Y2ggbGlrZSB2aXJ0dWFsCi1tZW1iZXIgZnVuY3Rpb25zLiAgIEZpbmFsbHksIEkgYmVsaWV2ZSB0aGF0IHRoZXJlIHdvdWxkIGJlIG1hbnkgaW50ZXJlc3RpbmcKLXBvc3NpYmlsaXRpZXMgb2YgY29tYmluaW5nIHRlbXBsYXRlIGNsYXNzZXMgd2l0aCBnb3RvLiAgRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLXRlbXBsYXRlIGNsYXNzIEZvbyZsdDt4Jmd0OyB7Ci1wdWJsaWM6Ci0gICAgeDogCi0gICAgICAgIC4uLiBzb21lIGNvZGUgaGVyZSAuLi4KLSAgICAgICAgYnJlYWs7Ci0gICAgLi4uCi19OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLUNsZWFybHksIHRoZSBudW1iZXIgb2YgYXBwbGljYXRpb25zIGlzIGVuZGxlc3MuCi0KLTxsaT48cD48Yj5NUDMgcGxheWVyPC9iPi4gICBTaW5jZSBjb21waWxpbmcgYSBDKysgYXBwbGljYXRpb24gdGFrZXMgc28gbG9uZywgSSB0aGluawotaXQgd291bGQgYmUgdXNlZnVsIHRvIG1vZGlmeSB0aGUgQysrIGNvbXBpbGVyIHRvIGdvIG91dCBhbmQgc2VhcmNoIHRoZSBuZXQgZm9yIGFuCi1hcHByb3ByaWF0ZSBzeW1waG9ueSBvciBzb25hdGEgdG8gZG93bmxvYWQgYW5kIHBsYXkgd2hpbGUgaXQgaXMgd29ya2luZy4gQWhoaGguIFllcy4KLU9mIGNvdXJzZSwgaWYgeW91IGhhdmUgYSBEVkQgcGxheWVyIGhhbmR5LCBJIGhhdmUgcGVyc29uYWxseSBmb3VuZCB0aGF0IHdhdGNoaW5nICJBcG9jYWx5cHNlIE5vdyIKLWlzIGEgcmVsYXhpbmcgd2F5IHRvIHBhc3MgdGhlIHRpbWUuCi0KLTwvdWw+Ci0KLUhhdmUgYSBmdXJ0aGVyIGZlYXR1cmUgc3VnZ2VzdGlvbj8gIFBsZWFzZSBsZXQgbWUga25vdy4KLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvY3ZzLmh0IGIvc3dpZ3dlYi9jdnMuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MDIwNDAuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9jdnMuaHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotU1dJRyBDVlMKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2N2cy5wbmciIGFsdD0iQ1ZTIj4KLQotPHA+Ci1EZXZlbG9wbWVudCB2ZXJzaW9ucyBvZiBTV0lHIGFyZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgQ1ZTIHNlcnZlciBsb2NhdGVkIGF0IFNvdXJjZUZvcmdlLgotCi08aDM+IERpc2NsYWltZXIgPC9oMz4KLQotVGhlIENWUyByZWxlYXNlIHJlcHJlc2VudHMgd29yayBpbiBwcm9ncmVzcyBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gY29tcGlsZSBvbiB5b3VyIG1hY2hpbmUgb3IgYmUgZnVuY3Rpb25hbCBpbiBhbnkKLW1hbm5lci4gCi0KLTxoMz4gUmVxdWlyZWQgVG9vbHMgPC9oMz4KLQotVG8gY29tcGlsZSBTV0lHIGZyb20gaXRzIENWUyByZXBvc2l0b3J5LCB5b3Ugd2lsbCBuZWVkIHRoZSBmb2xsb3dpbmcgdG9vbHM6Ci0KLTx1bD4KLTxsaT4gQXV0b2NvbmYgMi41OCBvciBoaWdoZXIKLTxsaT4gQXV0b21ha2UgMS43LjIgb3IgaGlnaGVyCi08bGk+IEEgd29ya2luZyBDKysgY29tcGlsZXIuCi08bGk+IHlhY2Mgb3IgYmlzb24gKHRvIGNvbXBpbGUgdGhlIFNXSUcgcGFyc2VyKS4gIAotPC91bD4KLQotPHA+Ci1JdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBDVlMgcmVwb3NpdG9yeSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBDKysgY29kZSAKLWdlbmVyYXRlZCBieSB5YWNjIG5vciB0aGUgZmlsZXMgcHJvZHVjZWQgYnkgQXV0b2NvbmYgb3IgQXV0b21ha2UgKHRoZXNlCi1hcmUgaG93ZXZlciBpbmNsdWRlZCBpbiBhIG5vcm1hbCByZWxlYXNlKS4gVGh1cywgeW91IHdpbGwgaGF2ZQotdG8gaW5zdGFsbCB0aGVzZSB0b29scyBvbiB5b3VyIG1hY2hpbmUgZm9yIGV2ZXJ5dGhpbmcgdG8gd29yay4KLQotPGgzPlRvIGNoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gPC9oMz4KLVRoZXJlIGFyZQotPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9jdnMvP2dyb3VwX2lkPTE2NDUiPmdlbmVyaWMgQ1ZTIGluc3RydWN0aW9uczwvYT4KLWF2YWlsYWJsZSBvbiB0aGUgU291cmNlRm9yZ2Ugc2l0ZSwgYnV0IHRoZSBzdGVwcyBiZWxvdyBzaG91bGQgYmUgYWxsIHlvdSBuZWVkLgotVGhlIGluc3RydWN0aW9ucyBiZWxvdyBhcmUgZm9yIHRob3NlIHdobyBoYXZlIHJlYWQgb25seSBhY2Nlc3MgZm9yIGN2cywgZGV2ZWxvcGVycyBzaG91bGQKLWNvbnN1bHQgdGhlIGdlbmVyaWMgQ1ZTIGluc3RydWN0aW9ucyBhYm92ZS4KLQotPG9sPgotPGxpPjxwPiBTZXQgdGhlIGxvY2F0aW9uIG9mIENWU1JPT1QKLQotPHByZT4KLSAlIHNldGVudiBDVlNST09UIDpwc2VydmVyOmFub255bW91c0BjdnMuc291cmNlZm9yZ2UubmV0Oi9jdnNyb290L3N3aWcgPC9wcmU+Ci08cD4KLShBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgLWQgb3B0aW9uIHRvIENWUykKLQotPGxpPjxwPiBMb2cgaW50byB0aGUgY3ZzIHNlcnZlciBieSBpc3N1aW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLQotPHByZT4KLSUgY3ZzIGxvZ2luCi1DVlMgcGFzc3dvcmQ6ICZsdDtwcmVzcyBlbnRlciBoZXJlJmd0OwotPC9wcmU+Ci0KLTxsaT48cD5UaGUgbGF0ZXN0IGRldmVsb3BtZW50IHZlcnNpb24gb2YgU1dJRyBjYW4gYmUgcmV0cmlldmVkIHVzaW5nCi0KLTxwcmU+Ci0lIGN2cyBjaGVja291dCBTV0lHCi08L3ByZT4KLQotPGxpPjxwPlRvIGJ1aWxkIHRoZSBzeXN0ZW0sIGZvbGxvdyB0aGVzZSBzdGVwcwotCi08cHJlPgotJSBjZCBTV0lHCi0lIC4vYXV0b2dlbi5zaAotJSAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vc29tZS9kaXJlY3RvcnkKLSUgbWFrZQotJSBtYWtlIGluc3RhbGwKLTwvcHJlPgotCi08bGk+PHA+VG8gY2hlY2sgdGhlIGJ1aWxkLCBydW4gdGhlIHRlc3RzOgotCi08cHJlPgotJSBtYWtlIC1rIGNoZWNrIDwvcHJlPgotVGhpcyBjb3VsZCB0YWtlIHVwIHRvIGFuIGhvdXIgb3IgbG9uZ2VyLiBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLAotanVzdCBjaGVjayB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBleGFtcGxlLCB0aGUgUHl0aG9uIHRlc3RzOgotPHByZT4KLSUgbWFrZSBjaGVjay1weXRob24tZXhhbXBsZXMKLSUgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZQotPC9wcmU+Ci0KLTwvb2w+Ci0KLTxiPk5vdGU6PC9iPiBUaGUgQ1ZTIHJlcG9zaXRvcnkgaXMgcmVhZC1vbmx5IHNvIHRoZSBzeXN0ZW0gd2lsbCBub3QgCi1hY2NlcHQgY29kZSBtb2RpZmljYXRpb25zIHVubGVzcyB5b3UgYXJlIGEgZGV2ZWxvcGVyLgotCi08aDM+IEJ1aWxkIElzc3VlcyA8L2gzPgotSGVyZSBhcmUgc29tZSBndWlkZWxpbmVzIHNob3VsZCB5b3UgYmUgZXhwZXJpZW5jaW5nIHByb2JsZW1zIGJ1aWxkaW5nIFNXSUcgZnJvbSBDVlMuCi0KLTxvbD4KLQotPGxpPkNoZWNrIHRoYXQgeW91IGhhdmUgYSBjb21wbGV0ZSB1cGRhdGUgZnJvbSB0aGUgU1dJRyBDVlMgcmVwb3NpdG9yeS4gCi1BIGZyZXNoIGNoZWNrb3V0IGZyb20gQ1ZTIG9mdGVuIHNvbHZlcyBidWlsZCBwcm9ibGVtcy4KLTwvbGk+Ci0KLTxsaT4KLU1ha2Ugc3VyZSB5b3UgaGF2ZSBydW4gPHR0Pi4vYXV0b2dlbi5zaDwvdHQ+IGFuZCA8dHQ+Li9jb25maWd1cmU8L3R0Pi4KLUJvdGggdGhlc2Ugc3RlcHMgd2lsbCBiZSBuZWNlc3NhcnkgaWYgeW91IGhhdmUgYSBmcmVzaCBDVlMgY2hlY2tvdXQgb3IgaWYgdGhlIGJ1aWxkIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IGhhdmUgY2hhbmdlZCBzaW5jZSBhIHByZXZpb3VzIHVwZGF0ZS4KLTwvbGk+Ci0KLTxsaT4KLUNoZWNrIHRoYXQgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb25zIG9mIHlvdXIgYXV0b3Rvb2xzIChBdXRvY29uZiBhbmQgQXV0b21ha2UpIGFyZSBpbnN0YWxsZWQgcHJvcGVybHkuIAotVGhlIGF1dG90b29scyBhcmUgaW4gYSBzdGF0ZSBvZiBmbHV4IGFuZCB0aGVyZSBhcmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2hpY2ggYXJlIHNvbHZlZCBpbiBkaWZmZXJlbnQgd2F5cyBvbiBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMuCi08L2xpPgotCi08bGk+Ci1DaGVjayB0aGF0IGFsbCB0aGUgYXV0b3Rvb2wgYm9vdHN0cmFwIHByb2dyYW1zIHdoaWNoIGFyZSBleGVjdXRlZCB3aGVuIHJ1bm5pbmcgPHR0Pi4vYXV0b2dlbi5zaDwvdHQ+IGFyZSB1cCB0byBkYXRlIGFuZCBtYXRjaCB5b3VyIGluc3RhbGxlZCBhdXRvdG9vbCB2ZXJzaW9ucy4KLUZvciBleGFtcGxlIDx0dD5hY2xvY2FsIC0tdmVyc2lvbjwvdHQ+IHNob3VsZCByZXBvcnQgYSBtYXRjaGluZyB2ZXJzaW9uIG9mIEF1dG9tYWtlIG9yIEF1dG9jb25mLCBzb21ldGhpbmcgbGlrZSAiYWNsb2NhbCAoR05VIGF1dG9tYWtlKSAxLjcuNiIuCi08L2xpPgotPC9vbD4KLQotSWYgeW91IGFyZSBzdGlsbCBoYXZpbmcgcHJvYmxlbXMsIHNlbmQgYW4gZW1haWwgdG8gPGEgaHJlZj0ibWFpbC5odG1sIj5zd2lnLWRldjwvYT4gbWFpbGluZyBsaXN0LgotCi08aDM+RGV2ZWxvcGVyIEFjY2VzczwvaDM+Ci0KLVdlIGFyZSBhbHdheXMgbG9va2luZyBmb3IgcGVvcGxlIHRvIGhlbHAgb3V0IHdpdGggdmFyaW91cyBwcm9qZWN0cy4gCi0KLTx1bD4KLTxsaT48cD4gU2VuZCBlbWFpbCB0byB0byB0aGUgPGEgaHJlZj0ibWFpbC5odG1sIj5zd2lnLWRldjwvYT4gbWFpbGluZyBsaXN0LgotaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGRvaW5nIGRldmVsb3BlciB3b3JrIGFuZCBnYWluaW5nIHdyaXRlIGFjY2VzcyB0byB0aGUgQ1ZTIHJlcG9zaXRvcnkuCi0KLTxsaT48cD4gVGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+c3dpZy1kZXY8L2E+IG1haWxpbmcgbGlzdCBpcyB0aGUgZGV2ZWxvcGVyIG1haWxpbmcgbGlzdAotYW5kIHNob3VsZCBiZSB1c2VkIHRvIGRpc2N1c3MgY29kaW5nIGlzc3VlcywgYnVncywgcGF0Y2hlcywgYW5kIHNvIGZvcnRoLiAgCi1TdWJzY3JpcHRpb24gaW5mb3JtYXRpb24gYW5kIGFyY2hpdmVzIG9mIHJlY2VudCBhY3Rpdml0eSBjYW4gYmUgZm91bmQgb24gdGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+bWFpbGluZyBsaXN0czwvYT4gcGFnZS4KLTwvdWw+Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9kZWZhdWx0LmNvcm5lciBiL3N3aWd3ZWIvZGVmYXVsdC5jb3JuZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTJlODIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9kZWZhdWx0LmNvcm5lcgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPGNlbnRlcj4KLTxpbWcgc3JjPSJpbWFnZXMvc3dpZzE3LnBuZyIgYWx0PSJTV0lHIGltYWdlIj4KLTwvY2VudGVyPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9kZWZhdWx0LmZvb3RlciBiL3N3aWd3ZWIvZGVmYXVsdC5mb290ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmE4NjcuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9kZWZhdWx0LmZvb3RlcgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPGhyPgotRmVlZGJhY2sgYW5kIHF1ZXN0aW9ucyBjb25jZXJuaW5nIHRoaXMgc2l0ZSBzaG91bGQgYmUgcG9zdGVkIHRvIHRoZSA8YSBocmVmPSJtYWlsLmh0bWwiPnN3aWctZGV2PC9hPiBtYWlsaW5nIGxpc3QuCi0KLTxwPgotTGFzdCBtb2RpZmllZCA6ICRtdGltZQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2RlZmF1bHQuaHRtbCBiL3N3aWd3ZWIvZGVmYXVsdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDI5ZjY3Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvZGVmYXVsdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTx0aXRsZT4kdGl0bGU8L3RpdGxlPgotPGJvZHkgIGJnY29sb3I9IiNmZmZmZmYiIGxpbms9IiMwMDAwZmYiIHZsaW5rPSIjODAwMGZmIj4KLQotPHRhYmxlIHdpZHRoPTc4MCBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgc3VtbWFyeT0iTWFpbiB3ZWIgcGFnZSI+Ci08dHI+Ci0gIDx0ZCB2YWxpZ249bWlkZGxlIGJnY29sb3I9IiMwMDAwMDAiPgotICAgICAgPHRhYmxlIHdpZHRoPTE4MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgc3VtbWFyeT0iQ29ybmVyIHNlY3Rpb24iPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgIDx0ZD4KLSRjb3JuZXIKLSAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgIDwvdGQ+Ci0gICA8dGQgdmFsaWduPW1pZGRsZSBiZ2NvbG9yPSIjZTBlMGUwIj4KLSAgICAgICA8dGFibGUgd2lkdGg9NjAwIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBzdW1tYXJ5PSJUb3Agc2VjdGlvbiI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgIDx0ZCB2YWxpZ249bWlkZGxlPgotJHRvcAotICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICA8L3RhYmxlPgotICAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gICA8dGQgdmFsaWduPXRvcCBiZ2NvbG9yPSIjZTBlMGUwIj4KLSAgICAgICA8dGFibGUgd2lkdGg9MTgwIHN1bW1hcnk9IlNpZGUgc2VjdGlvbiI+Ci0gICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgIDx0ZD4KLSRzaWRlCi0gICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICA8L3RyPgotICAgICAgIDwvdGFibGU+Ci0gICA8L3RkPgotICAgPHRkIHZhbGlnbj10b3A+Ci0gICAgICAgPHRhYmxlIHdpZHRoPTYwMCBzdW1tYXJ5PSJXZWIgcGFnZSBib2R5Ij4KLSAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+Ci0kYm9keQotCi0kZm9vdGVyCi0gICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgIDwvdGFibGU+Ci0gICA8L3RkPgotPC90cj4KLTwvdGFibGU+Ci0KLTwvYm9keT4KLTwvaHRtbD4KLSAKLQotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvZGVmYXVsdC5zaWRlIGIvc3dpZ3dlYi9kZWZhdWx0LnNpZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YTU0NDMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9kZWZhdWx0LnNpZGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9IlNpZGUgc2VjdGlvbiBsaW5rcyI+Ci08dHI+Ci08dGQgYmdjb2xvcj0iIzAwMDAwMCIgYWxpZ249Y2VudGVyPjxmb250IGNvbG9yPSIjZmZmZmZmIj48Yj5JbmZvcm1hdGlvbjwvYj48L2ZvbnQ+PC90ZD4KLTwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9ImV4ZWMuaHRtbCI+V2hhdCBpcyBTV0lHPzwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9ImNvbXBhdC5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iY29tcGFyZS5odG1sIj5GZWF0dXJlczwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9InR1dG9yaWFsLmh0bWwiPlR1dG9yaWFsPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iZG9jLmh0bWwiPkRvY3VtZW50YXRpb248L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJjdnMuaHRtbCI+VGhlIEJsZWVkaW5nIEVkZ2U8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJoaXN0b3J5Lmh0bWwiPkhpc3Rvcnk8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJzdWJ2ZXJzaW9uLmh0bWwiPlN1YnZlcnNpb248L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJndWlsdHkuaHRtbCI+R3VpbHR5IFBhcnRpZXM8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJwcm9qZWN0cy5odG1sIj5BY2Nlc3NvcmllczwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9ImNvcHlyaWdodC5odG1sIj5MZWdhbCBEZXBhcnRtZW50PC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0ibGlua3MuaHRtbCI+TGlua3M8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJzdXJ2ZXkuaHRtbCI+RG93bmxvYWQ8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnNpZ25hbDYuY29tL2NnaS1iaW4vd2lraS5wbCI+U3dpZ1dpa2k8L2E+PC90ZD48L3RyPgotCi08dHI+PHRkIGJnY29sb3I9IiMwMDAwMDAiIGFsaWduPWNlbnRlcj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+PGI+RXhpdHM8L2I+PC9mb250PjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5wZXJsLmNvbSI+UGVybDwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZyI+UHl0aG9uPC9hPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy50Y2wudGsiPlRjbC9UazwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9ndWlsZS9ndWlsZS5odG1sIj5HdWlsZTwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cucGx0LXNjaGVtZS5vcmcvc29mdHdhcmUvbXpzY2hlbWUvIj5NelNjaGVtZTwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cucnVieS1sYW5nLm9yZyI+UnVieTwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20iPkphdmE8L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJodHRwOi8vd3d3LnBocC5uZXQiPlBIUDwvYT48L3RkPjwvdHI+Ci08dHI+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuY2FsbC13aXRoLWN1cnJlbnQtY29udGludWF0aW9uLm9yZy9jaGlja2VuLmh0bWwiPkNISUNLRU48L2E+PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lm9jYW1sLm9yZy8iPk9jYW1sPC9hPjwvdGQ+PC90cj4KLQotPHRyPjx0ZCBiZ2NvbG9yPSIjMDAwMDAwIiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPjxiPk91ciBHZW5lcm91cyBIb3N0PC9iPjwvZm9udD48L3RkPjwvdHI+Ci08dHI+PHRkIGFsaWduPWNlbnRlcj48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0Ij48aW1nIHNyYz0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9pbWFnZXMvc2Zsb2dvMi1zdGVlbC5wbmciIHZzcGFjZT0iMCIgYm9yZGVyPTAgYWx0PSJTb3VyY2VGb3JnZSBsb2dvIj48L0E+PC90ZD48L3RyPgotPC90YWJsZT4KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2RlZmF1bHQudG9wIGIvc3dpZ3dlYi9kZWZhdWx0LnRvcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiMzRlOC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2RlZmF1bHQudG9wCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPTAgYm9yZGVyPTAgc3VtbWFyeT0iVG9wIHNlY3Rpb24gbGlua3MiPgotPHRyPgotPHRkPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+PC90ZD4KLTx0ZD48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3QvP2dyb3VwX2lkPTE2NDUiPkRldmVsb3BtZW50PC9hPjwvdGQ+Ci08dGQ+PGEgaHJlZj0ibWFpbC5odG1sIj5NYWlsaW5nIExpc3RzPC9hPjwvdGQ+Ci08dGQ+PGEgaHJlZj0iYnVncy5odG1sIj5CdWdzIGFuZCBQYXRjaGVzPC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvZG9jLmh0IGIvc3dpZ3dlYi9kb2MuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTE5OGIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9kb2MuaHQKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi1TV0lHIERvY3VtZW50YXRpb24sIFByZXNlbnRhdGlvbnMsIGFuZCBQYXBlcnMKLQotPHA+PGltZyBzcmM9ImltYWdlcy9kb2MucG5nIiBhbHQ9IkRvY3VtZW50YXRpb24iPgotCi08SDM+U1dJRy0xLjM8L2gzPgotPHVsPgotCi08bGk+IDxhIGhyZWY9IkRvYzEuMy9pbmRleC5odG1sIj5EZXZlbG9wbWVudCBEb2N1bWVudGF0aW9uPC9hPiBmb3IgbGF0ZXN0IHJlbGVhc2UuCi08L3VsPgotCi08aDM+U1dJRy0xLjE8L2gzPgotPHVsPgotPGxpPiA8YSBocmVmPSJEb2MxLjEvSFRNTC9Db250ZW50cy5odG1sIj5PbmxpbmUgVXNlcnMgTWFudWFsPC9hPi4KLTxsaT4gQWxzbyBhdmFpbGFibGUgaW4gPGEgaHJlZj0iRG9jMS4xL1BERi9TV0lHTWFudWFsLnBkZiI+UERGPC9hPiAoMzE4IHBhZ2VzKS4KLTwvdWw+Ci0KLTxoMz4gT25saW5lIFBhcGVycyBhYm91dCBTV0lHIDwvaDM+Ci0KLTx1bD4KLTxsaT4gPGI+PGEgaHJlZj0icGFwZXJzL1Blcmw5OC9zd2lncGVybC5odG0iPlBlcmwgRXh0ZW5zaW9uIEJ1aWxkaW5nIHdpdGggU1dJRzwvYT48L2I+LgotVGhpcyBwYXBlciwgcHJlc2VudGVkIGF0IHRoZSAxOTk4IE8nUmVpbGx5IFBlcmwgQ29uZmVyZW5jZSwgZGVzY3JpYmVzIHRoZSB1c2UKLW9mIFNXSUcgd2l0aCBQZXJsNSBhbmQgY292ZXJzIG1hbnkgYWR2YW5jZWQgdG9waWNzLgotWyA8YSBocmVmPSJwYXBlcnMvUGVybDk4L3N3aWdwZXJsLnBkZiI+UERGPC9hPiBdLiA8YnI+Ci0KLTxsaT48cD4gPGI+PGEgaHJlZj0icGFwZXJzL1RjbDk4L1RjbENoYXAuaHRtbCI+VGNsIGFuZCBTV0lHIGFzIGEgQy9DKysgRGV2ZWxvcG1lbnQgVG9vbDwvYT48L2I+LgotT3JpZ2luYWxseSB3cml0dGVuIGFzIGEgZHJhZnQgZm9yIGEgYm9vayBjaGFwdGVyLCB0aGlzIHBhcGVyIHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mCi11c2luZyBUY2wgYW5kIFNXSUcuIEl0IGFsc28gYXBwZWFycyBvbiB0aGUgQ0QtUk9NIGFjY29tcGFueWluZyAiVGNsL1RrIGZvciBSZWFsIFByb2dyYW1tZXJzIgotYnkgQ2xpZiBGbHludC48YnI+Ci0KLTxsaT48cD4gPGI+PGEgaHJlZj0icGFwZXJzL1RjbDk2L3RjbDk2Lmh0bWwiPlNXSUcgOiBBbiBFYXN5IHRvIFVzZSBUb29sIGZvciBJbnRlZ3JhdGluZyBTY3JpcHRpbmcgTGFuZ3VhZ2VzIHdpdGggQyBhbmQgQysrPC9hPjwvYj4uCi1XaGlsZSBhIGxpdHRsZSBkYXRlZCwgdGhpcyBpcyB0aGUgZmlyc3QgU1dJRyBwYXBlci4gUHJlc2VudGVkIGF0Ci10aGUgNHRoIFRjbC9UayBXb3Jrc2hvcCwgTW9udGVyZXksIENhbGlmb3JuaWEsIEp1bHkgNi0xMCwgMTk5Ni4gICBBbHNvIGF2YWlsYWJsZQotZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LnVzZW5peC5vcmcvcHVibGljYXRpb25zL2xpYnJhcnkvcHJvY2VlZGluZ3MvdGNsOTYvYmVhemxleS5odG1sIj5VU0VOSVg8L2E+LiA8YnI+Ci0KLTxsaT48cD4gPGI+PGEgaHJlZj0icGFwZXJzL1B5OTYvcHl0aG9uOTYuaHRtbCI+VXNpbmcgU1dJRyB0byBDb250cm9sLCBQcm90b3R5cGUsIGFuZCBEZWJ1ZwotQyBQcm9ncmFtcyB3aXRoIFB5dGhvbjwvYT48L2I+LiAgUHJlc2VudGVkIGF0IHRoZSA0dGggSW50ZXJuYXRpb25hbCBQeXRob24gQ29uZmVyZW5jZSwKLUxpdmVybW9yZSwgQ2FsaWZvcm5pYSwgSnVuZSwgMTk5Ni4gIDxicj4KLQotPGxpPiA8Yj48YSBocmVmPSJwYXBlcnMvUHk5Ny9iZWF6bGV5Lmh0bWwiPkZlZWRpbmcgYSBMYXJnZS1zY2FsZSBQaHlzaWNzIEFwcGxpY2F0aW9uIHRvIFB5dGhvbjwvYT48L2I+LiAgUHJlc2VudGVkIGF0IHRoZSA2dGggSW50ZXJuYXRpb25hbCBQeXRob24gQ29uZmVyZW5jZSwgU2FuIEpvc2UsIENhbGlmb3JuaWEuIAotT2N0b2JlciAxNC0xNywgMTk5Ny4gICBUaGlzIHBhcGVyIGRlc2NyaWJlcyB0aGUgdXNlIG9mIFB5dGhvbi9TV0lHIHdpdGggYSBoaWdoLXBlcmZvcm1hbmNlCi1waHlzaWNzIGFwcGxpY2F0aW9uLiAgVGhpcyBhcHBsaWNhdGlvbiB3YXMgYSBydW5uZXItdXAgaW4gdGhlIDE5OTgKLUdvcmRvbi1CZWxsIHByaXplIGZvciBhY2hpZXZpbmcgMTAgR2Zsb3BzIHN1c3RhaW5lZCBwZXJmb3JtYW5jZSBvbiB0aGUgCi08YSBocmVmPSJodHRwOi8vbG9raS13d3cubGFubC5nb3YvcGFwZXJzL3NjOTgvIj5BdmFsb248L2E+IExpbnV4Ci1DbHVzdGVyIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeS4gPGJyPgotCi08L3VsPgotCi08aDM+IFR1dG9yaWFscyBhYm91dCBTV0lHIDwvaDM+Ci0KLTx1bD4KLTxsaT4gPGI+PGEgaHJlZj0icGFwZXJzL1B5VHV0b3JpYWw5OC9QeVR1dG9yaWFsOTgucGRmIj5JbnRlcmZhY2luZyBDL0MrKyBhbmQgUHl0aG9uIHdpdGggU1dJRzwvYT48L2I+IChQREYpLgotSGFsZi1kYXkgdHV0b3JpYWwgcHJlc2VudGVkIGF0IHRoZSA3dGggSW50ZXJuYXRpb25hbCBQeXRob24gQ29uZmVyZW5jZSwgTm92ZW1iZXIsIDE5OTguIDxicj4KLQotPGxpPjxwPiA8Yj48YSBocmVmPSJwYXBlcnMvUHlUdXRvcmlhbDk3L1B5VHV0b3JpYWw5Ny5wZGYiPkludGVyZmFjaW5nIEMvQysrIGFuZCBQeXRob24gd2l0aCBTV0lHPC9hPjwvYj4gKFBERikuCi1IYWxmLWRheSB0dXRvcmlhbCBwcmVzZW50ZWQgYXQgdGhlIDZ0aCBJbnRlcm5hdGlvbmFsIFB5dGhvbiBDb25mZXJlbmNlLCBPY3RvYmVyLCAxOTk3LiA8YnI+Ci0KLTxsaT48cD4gPGI+PGEgaHJlZj0icGFwZXJzL1RjbFR1dG9yaWFsOTgvVGNsVHV0b3JpYWw5OC5wZGYiPlRjbCBFeHRlbnNpb24gQnVpbGRpbmcgd2l0aCBTV0lHPC9hPjwvYj4gKFBERikuICAgVHV0b3JpYWwgcHJlc2VudGVkIGF0IHRoZSAxOTk4IFRjbC9UayBDb25mZXJlbmNlLiA8YnI+Ci08L3VsPgotCi08aDM+IE90aGVyIFJlc291cmNlcyA8L2gzPgotCi08dWw+Ci08bGk+IFBlcmwgdXNlcnMgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBTV0lHIGluIHRoZSBPJ1JlaWxseSBib29rIAotPGEgaHJlZj0iaHR0cDovL3d3dy5vcmEuY29tL2NhdGFsb2cvYWR2cGVybCI+IkFkdmFuY2VkIFBlcmwgUHJvZ3JhbW1pbmciPC9hPi4gPGJyPgotCi08bGk+PHA+IERhbmllbCBCbGV6ZWsgd3JvdGUgYW4gYXJ0aWNsZSBhYm91dCBTV0lHIGluIHRoZSBOb3ZlbWJlciwgMTk5OCBpc3N1ZQotb2YgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3VqLmNvbS9hcmNoaXZlLzE2MTEvaW5kZXguaHRtbCI+Qy9DKysgVXNlcnMgSm91cm5hbDwvYT4uCi0KLTxsaT48cD5BbiBhcnRpY2xlIGFib3V0IFNXSUcgYXBwZWFyZWQgaW4gdGhlIEZlYnJ1YXJ5LCAxOTk4IGlzc3VlIAotb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5kZGouY29tL2Rkai8xOTk4LzE5OThfMDIvaW5kZXguaHRtIj5Eci4gRG9iYidzIEpvdXJuYWw8L2E+IG9uCi1TY3JpcHRpbmcgYW5kIEFsdGVybmF0aXZlIExhbmd1YWdlcy4gPGJyPgotCi08bGk+PHA+U2NvdHQgQm9sdGUgd3JvdGUgYW4gYXJ0aWNsZSBhYm91dCBTV0lHIGluIHRoZSBXaW50ZXIsIDE5OTcgaXNzdWUgb2YgCi08YSBocmVmPSJodHRwOi8vd3d3LnRwai5jb20iPlRoZSBQZXJsIEpvdXJuYWw8L2E+LiA8YnI+Ci0KLQotPGxpPjxwPiBKb2huIE91c3RlcmhvdXQncyA8YSBocmVmPSJodHRwOi8vaG9tZS5wYWNiZWxsLm5ldC9vdXN0ZXIvc2NyaXB0aW5nLmh0bWwiPgotcGFwZXIgPC9hPiBvbiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHByb3ZpZGVzIGEgZ29vZCAgb3ZlcnZpZXcKLW9mIHRoZSB1c2Ugb2Ygc2NyaXB0aW5nIGxhbmd1YWdlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwIHRvCi1zeXN0ZW1zIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gIFNXSUcgd2FzIGRldmVsb3BlZCB3aXRoIG1hbnkgb2YgdGhlc2UgaXNzdWVzCi1pbiBtaW5kIHNvIHRoaXMgcGFwZXIgbWlnaHQgYmUgb2YgaW50ZXJlc3QgdG8gdXNlcnMgd2hvIGFyZSBuZXcgdG8KLVNXSUcgYW5kIGl0cyBnb2Fscy4gPGJyPgotCi08bGk+PHA+IDxiPjxhIGhyZWY9Imh0dHA6Ly93d3cuc3VwZXJjb21wLm9yZy9zYzk2L3Byb2NlZWRpbmdzL1NDOTZQUk9DL0JFQVpMRVkvSU5ERVguSFRNIj4gTGlnaHR3ZWlnaHQgQ29tcHV0YXRpb25hbCBTdGVlcmluZyBvZiBWZXJ5IExhcmdlIFNjYWxlIE1vbGVjdWxhciBEeW5hbWljcyBTaW11bGF0aW9ucyA8L2E+PC9iPi4KLVByZXNlbnRlZCBhdCBTdXBlcmNvbXB1dGluZyc5Ni4gIFRoaXMgcGFwZXIgZGVzY3JpYmVzIHRoZSBhcHBsaWNhdGlvbiB0aGF0IAotbW90aXZhdGVkIHRoZSBkZXZlbG9wbWVudCBvZiBTV0lHLiAoU2VlIHdoeSBTV0lHIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCkuIDxicj4gCi0KLTwvdWw+Ci0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2Rvd25sb2FkLmh0IGIvc3dpZ3dlYi9kb3dubG9hZC5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhZjM5NS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2Rvd25sb2FkLmh0CisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotRG93bmxvYWQgU1dJRwotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2Rvd25sb2FkLnBuZyIgYWx0PSJEb3dubG9hZCI+Ci0KLTxwPgotU291cmNlRm9yZ2UgaXMgbm93IHRoZSBwcmltYXJ5IHNpdGUgZm9yIFNXSUcgZGlzdHJpYnV0aW9ucy4KLQotPHVsPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTE2NDUiPkFsbCByZWxlYXNlczwvYT4uCi08bGk+PGEgaHJlZj0iZnRwOi8vc3dpZy5zb3VyY2Vmb3JnZS5uZXQvcHViL3N3aWcvIj5PbGRlciBzdHVmZjwvYT4uCi08L3VsPgotCi08cD4KLVNXSUcgaGFzIGFsc28gYmVlbiBkaXN0cmlidXRlZCBhcyBzb3VyY2UgY29kZSBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgotCi08dWw+Ci08bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5tY2MuYWMudWsvcHViL212Yy9zd2lnIj5mdHAubWNjLmFjLnVrL3B1Yi9tdmMvc3dpZzwvYT4gKFVLKQotPGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAucmdlLmNvbS9wdWIvbGFuZ3VhZ2VzL3N3aWcvIj5mdHAucmdlLmNvbS9wdWIvbGFuZ3VhZ2VzL3N3aWc8L2E+IChOZXcgWW9yaykuCi08bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5weXRob24ub3JnL3B1Yi9weXRob24vY29udHJpYi9TeXN0ZW0vIj5mdHAucHl0aG9uLm9yZy9wdWIvcHl0aG9uL2NvbnRyaWIvU3lzdGVtPC9hPiAoUHl0aG9uIGNvbnRyaWJ1dGVkIHNvZnR3YXJlKS4KLTxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy5wZXJsLmNvbS9DUEFOLy9hdXRob3JzL0RhdmVfQmVhemxleSI+Q1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yayk8L2E+Ci08L3VsPgotCi1Zb3UgY2FuIGFsc28gZmluZCBTV0lHIGluIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zIDoKLQotPHVsPgotPGxpPiA8YSBocmVmPSJodHRwOi8vY2dpLmRlYmlhbi5vcmcvd3d3LW1hc3Rlci9kZWJpYW4ub3JnL1BhY2thZ2VzL3N0YWJsZS9pbnRlcnByZXRlcnMvc3dpZy5odG1sIj5EZWJpYW4gR05VL0xpbnV4PC9hPi4KLTxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9wb3J0cy9kZXZlbC5odG1sIj5GcmVlQlNEPC9hPi4KLTxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy5jeWd3aW4uY29tIj5DeWd3aW48L2E+LgotPGxpPiA8YSBocmVmPSJodHRwOi8vd3d3Lm9yZWlsbHkuY29tL2NhdGFsb2cvcHl0aG9uL25vZnJhbWVzLmh0bWwiPlByb2dyYW1taW5nIFB5dGhvbjwvYT4gKEluY2x1ZGVkIG9uIENELVJPTSkuCi08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cubWtwLmNvbS9ib29rc19jYXRhbG9nLzAtMTIyNjEtMjA1LTEuYXNwIj5UY2wvVGsgZm9yIFJlYWwgUHJvZ3JhbW1lcnM8L2E+IChJbmNsdWRlZCBvbiBDRC1ST00pLgotPC91bD4KLQotTm90ZSA6IElmIHlvdSByZWNlaXZlZCBTV0lHIG9uIENELVJPTSwgeW91IG1heSB3YW50IHRvIHVwZ3JhZGUgdG8gdGhlIGxhdGVzdCByZWxlYXNlLgotCi08aDM+IFRoZSBMYXRlc3QgUmVsZWFzZSA8L2gzPgotCi08cD4KLTxhIGhyZWY9Imh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvc3dpZy9zd2lnLTEuMy4yNS50YXIuZ3oiPlNXSUcKLTEuMy4yNTwvYT4gaXMgdGhlIGxhdGVzdCBkZXZlbG9wbWVudCByZWxlYXNlICgyMDA1LzA2LzExKS4gVmlldyB0aGUKLTxhIGhyZWY9InJlbGVhc2UuaHRtbCI+cmVsZWFzZSBub3RlczwvYT4uICBXaW5kb3dzIHVzZXJzIHNob3VsZCBkb3dubG9hZAotPGEgaHJlZj0iaHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9zd2lnL3N3aWd3aW4tMS4zLjI1LnppcCI+c3dpZ3dpbi0xLjMuMjU8L2E+Ci13aGljaCBpbmNsdWRlcyBhIHByZWJ1aWx0IGV4ZWN1dGFibGUuIAotCi08cD4KLTxiPk5vdGU6PC9iPiBUaGUgZm9sbG93aW5nIHJlbGVhc2VzIHBlcnRhaW4gdG8gU1dJRy0xLjEgd2hpY2ggd2FzIGEgd2lkZWx5IGRpc3RyaWJ1dGVkIHJlbGVhc2UKLWZyb20gc2V2ZXJhbCB5ZWFycyBhZ28uICBVbmxlc3MgeW91IHJlYWxseSBuZWVkIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB5b3Ugc2hvdWxkIHVzZQotU1dJRy0xLjMueCBpbnN0ZWFkIG9mIFNXSUctMS4xIChlc3BlY2lhbGx5IHNpbmNlIDEuMyBpcyBtdWNoIG1vcmUgY2FwYWJsZSkuCi0KLTxwPgotPGEgaHJlZj0iaHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9zd2lnL3N3aWcxLjFwNS50YXIuZ3oiPlNXSUcgMS4xcDU8L2E+Ci1pcyB0aGUgbGF0ZXN0IHN0YWJsZSByZWxlYXNlIG9mIFNXSUctMS4xICgxOTk4LzAyLzA1KS4gICAKLQotPGI+Tm90ZSAoMjAwMC8wMS8xOCkgPC9iPlNXSUctMS4xcDUgaGFzIGEgbnVtYmVyIG9mIGNvbXBpbGF0aW9uIGlzc3Vlcwotd2l0aCBBTlNJIEMrKyBjb21waWxlcnMgYW5kIHdpbGwgcHJvYmFibHkgZ2VuZXJhdGUgYSBsb3Qgb2YgY29tcGlsZXIKLXdhcm5pbmdzLiAgU29ycnkuCi0KLTxwPgotPGEgaHJlZj0iaHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9zd2lnL3N3aWcxLjEtODgzLnRhci5neiI+U1dJRzEuMS04ODM8L2E+IGlzIHRoZSBsYXN0IG1haW50ZW5hbmNlIHZlcnNpb24gb2YgU1dJRy0xLjEgKERlY2VtYmVyIDE5OTkpLiAgVGhpcyBpc24ndCByZWFsbHkgYQotInJlbGVhc2UiLCBidXQgdGhlIGxhc3QgbmlnaHRseSBidWlsZCB0aGF0IHdhcyBjb21wbGV0ZWQgYmVmb3JlIAotZGV2ZWxvcG1lbnQgd29yayBzaGlmdGVkIHRvIFNXSUctMS4zLiAgSXQgZml4ZXMgYSBudW1iZXIgb2YgYnVncyBpbgotU1dJRzEuMXA1LgotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2V4ZWMuaHQgYi9zd2lnd2ViL2V4ZWMuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYTk5ODcuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9leGVjLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLUV4ZWN1dGl2ZSBTdW1tYXJ5Ci0KLTxwPgotPGltZyBzcmM9ImltYWdlcy9leGVjLnBuZyIgYWx0PSJFeGVjdXRpdmUgU3VtbWFyeSI+Ci0KLTxwPgotU1dJRyBpcyBhbiBpbnRlcmZhY2UgY29tcGlsZXIgdGhhdCBjb25uZWN0cyBwcm9ncmFtcyB3cml0dGVuIGluIEMgYW5kCi1DKysgd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1Y2ggYXMgUGVybCwgUHl0aG9uLCBSdWJ5LCBhbmQgVGNsLiAgSXQKLXdvcmtzIGJ5IHRha2luZyB0aGUgZGVjbGFyYXRpb25zIGZvdW5kIGluIEMvQysrIGhlYWRlciBmaWxlcyBhbmQgdXNpbmcKLXRoZW0gdG8gZ2VuZXJhdGUgdGhlIHdyYXBwZXIgY29kZSB0aGF0IHNjcmlwdGluZyBsYW5ndWFnZXMgbmVlZCB0bwotYWNjZXNzIHRoZSB1bmRlcmx5aW5nIEMvQysrIGNvZGUuICBJbiBhZGRpdGlvbiwgU1dJRyBwcm92aWRlcyBhCi12YXJpZXR5IG9mIGN1c3RvbWl6YXRpb24gZmVhdHVyZXMgdGhhdCBsZXQgeW91IHRhaWxvciB0aGUgd3JhcHBpbmcKLXByb2Nlc3MgdG8gc3VpdCB5b3VyIGFwcGxpY2F0aW9uLgotCi08cD4KLUpvaG4gT3VzdGVyaG91dCAoY3JlYXRvciBvZiBUY2wpIGhhcyB3cml0dGVuIGEKLTxhIGhyZWY9Imh0dHA6Ly9ob21lLnBhY2JlbGwubmV0L291c3Rlci9zY3JpcHRpbmcuaHRtbCI+cGFwZXI8L2E+Ci10aGF0IGRlc2NyaWJlcyB0aGUKLWJlbmVmaXRzIG9mIHNjcmlwdGluZyBsYW5ndWFnZXMuICAgU1dJRyBtYWtlcyBpdCBmYWlybHkgZWFzeSB0byBjb25uZWN0IHNjcmlwdGluZwotbGFuZ3VhZ2VzIHdpdGggQy9DKysgY29kZS4KLQotPHA+U1dJRyBpcyB1c2VkIGluIGEgbnVtYmVyIG9mIHdheXM6Ci0KLTx1bD4KLTxsaT48cD48Yj5CdWlsZGluZyBtb3JlIHBvd2VyZnVsIEMvQysrIHByb2dyYW1zPC9iPi4gIFVzaW5nIFNXSUcsIHlvdSBjYW4KLXJlcGxhY2UgdGhlIG1haW4oKSBmdW5jdGlvbiBvZiBhIEMgcHJvZ3JhbSB3aXRoIGEgc2NyaXB0aW5nCi1pbnRlcnByZXRlciBmcm9tIHdoaWNoIHlvdSBjYW4gY29udHJvbCB0aGUgYXBwbGljYXRpb24uICBUaGlzIGFkZHMKLXF1aXRlIGEgbG90IG9mIGZsZXhpYmlsaXR5IGFuZCBtYWtlcyB0aGUgcHJvZ3JhbSAicHJvZ3JhbW1hYmxlLiIgIFRoYXQKLWlzLCB0aGUgc2NyaXB0aW5nIGludGVyZmFjZSBhbGxvd3MgdXNlcnMgYW5kIGRldmVsb3BlcnMgdG8gZWFzaWx5Ci1tb2RpZml5IHRoZSBiZWhhdmlvciBvZiB0aGUgcHJvZ3JhbSB3aXRob3V0IGhhdmluZyB0byBtb2RpZnkgbG93LWxldmVsCi1DL0MrKyBjb2RlLiAgVGhlIGJlbmVmaXRzIG9mIHRoaXMgYXJlIG51bWVyb3VzLiBJbiBmYWN0IHRoaW5rIG9mIGFsbAotb2YgdGhlIGxhcmdlIHNvZnR3YXJlIHBhY2thZ2VzIHRoYXQgeW91IHVzZSBldmVyeSBkYXktLS1uZWFybHkgYWxsIG9mCi10aGVtIGluY2x1ZGUgc3BlY2lhbCBhIG1hY3JvIGxhbmd1YWdlLCBjb25maWd1cmF0aW9uIGxhbmd1YWdlLCBvciBldmVuCi1hIHNjcmlwdGluZyBlbmdpbmUgdGhhdCBhbGxvd3MgdXNlcnMgdG8gbWFrZSBjdXN0b21pemF0aW9ucy4KLQotPGxpPjxwPjxiPlJhcGlkIHByb3RvdHlwaW5nIGFuZCBkZWJ1Z2dpbmc8L2I+LiAgU1dJRyBhbGxvd3MgQy9DKysgcHJvZ3JhbXMgdG8gYmUgcGxhY2VkIGluCi1hIHNjcmlwdGluZyBlbnZpcm9ubWVudCB0aGF0IGNhbiBiZSB1c2VkIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi1Gb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHRlc3QgYSBsaWJyYXJ5IHdpdGggYSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgb3IgdXNlIHRoZSBzY3JpcHRpbmcKLWludGVycHJldGVyIGFzIGFuIGludGVyYWN0aXZlIGRlYnVnZ2VyLiAgIFNpbmNlIFNXSUcgcmVxdWlyZXMgbm8gbW9kaWZpY2F0aW9ucyB0byB0aGUKLXVuZGVybHlpbmcgQy9DKysgY29kZSwgaXQgY2FuIGJlIHVzZWQgZXZlbiBpZiB0aGUgZmluYWwgcHJvZHVjdCBkb2VzIG5vdCByZWx5IHVwb24gc2NyaXB0aW5nLgotCi08bGk+PHA+PGI+U3lzdGVtcyBpbnRlZ3JhdGlvbjwvYj4uICBTY3JpcHRpbmcgbGFuZ3VhZ2VzIHdvcmsgZmFpcmx5IHdlbGwKLWZvciBjb250cm9sbGluZyBhbmQgZ2x1aW5nIGxvb3NlbHktY291cGxlZCBzb2Z0d2FyZSBjb21wb25lbnRzCi10b2dldGhlci4gIFdpdGggU1dJRywgZGlmZmVyZW50IEMvQysrIHByb2dyYW1zIGNhbiBiZSB0dXJuZWQgaW50bwotc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbiBtb2R1bGVzLiAgVGhlc2UgbW9kdWxlcyBjYW4gdGhlbiBiZQotY29tYmluZWQgdG9nZXRoZXIgdG8gY3JlYXRlIG5ldyBhbmQgaW50ZXJlc3RpbmcgYXBwbGljYXRpb25zLgotCi08bGk+PHA+PGI+Q29uc3RydWN0aW9uIG9mIHNjcmlwdGluZyBsYW5ndWFnZSBleHRlbnNpb24gbW9kdWxlczwvYj4uICBTV0lHCi1jYW4gYmUgdXNlZCB0byB0dXJuIGNvbW1vbiBDL0MrKyBsaWJyYXJpZXMgaW50byBjb21wb25lbnRzIGZvciB1c2UgaW4KLXBvcHVsYXIgc2NyaXB0aW5nIGxhbmd1YWdlcy4gIE9mIGNvdXJzZSwgeW91IHdpbGwgc3RpbGwgd2FudCB0byBtYWtlCi1zdXJlIHRoYXQgbm8tb25lIGVsc2UgaGFzIGFscmVhZHkgY3JlYXRlZCBhIG1vZHVsZSBiZWZvcmUgZG9pbmcgdGhpcy4KLTwvdWw+Ci0KLVNXSUcgaXMgc29tZXRpbWVzIGNvbXBhcmVkIHRvIGludGVyZmFjZSBkZWZpbml0aW9uIGxhbmd1YWdlIChJREwpCi1jb21waWxlcnMgc3VjaCBhcyB0aG9zZSB5b3UgZmluZCB3aXRoIHN5c3RlbXMgc3VjaCBhcyBDT1JCQSBhbmQgQ09NLgotQWx0aG91Z2ggdGhlcmUgYXJlIGEgZmV3IHNpbWlsYXJpdGllcywgdGhlIHdob2xlIHBvaW50IG9mIFNXSUcgaXMgdG8KLW1ha2UgaXQgc28geW91IGRvbid0IGhhdmUgdG8gYWRkIGFuIGV4dHJhIGxheWVyIG9mIElETCBzcGVjaWZpY2F0aW9ucwotdG8geW91ciBhcHBsaWNhdGlvbi4gIElmIGFueXRoaW5nLCBpdCdzIG11Y2ggbW9yZSBvZiBhIHJhcGlkCi1hcHBsaWNhdGlvbiBkZXZlbG9wbWVudCBhbmQgcHJvdG90eXBpbmcgdG9vbC4gIFNwZWNpZmljYWxseToKLQotPHVsPgotPGxpPjxwPjxiPkFOU0kgQy9DKysgc3ludGF4PC9iPi4gIFNXSUcgcGFyc2VzIEFOU0kgQysrIHRoYXQgaGFzIGJlZW4KLWV4dGVuZGVkIHdpdGggYSBudW1iZXIgb2Ygc3BlY2lhbCBkaXJlY3RpdmVzLiAgQXMgYSByZXN1bHQsIGludGVyZmFjZXMKLWFyZSB1c3VhbGx5IGJ1aWx0IGJ5IGdyYWJiaW5nIGEgaGVhZGVyIGZpbGUgYW5kIHR3ZWFraW5nIGl0IGEgbGl0dGxlCi1iaXQuICBUaGlzIHBhcnRpY3VsYXIgYXBwcm9hY2ggaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiB0aGUKLXVuZGVybHlpbmcgQy9DKysgcHJvZ3JhbSB1bmRlcmdvZXMgZnJlcXVlbnQgbW9kaWZpY2F0aW9uLgotCi08bGk+PHA+PGI+U1dJRyBpcyBub3QgYSBzdHViIGdlbmVyYXRvcjwvYj4uICBTV0lHIHByb2R1Y2VzIGNvZGUgdGhhdCB5b3UKLXNpbXBseSBjb21waWxlIGFuZCBydW4uICBZb3UgZG9uJ3QgaGF2ZSB0byBmaWxsIGluIGFueSBzdHVicyBvciB3cml0ZQotc3BlY2lhbCBjbGllbnQvc2VydmVyIGNvZGUgYXMgeW91IGRvIHdpdGggUlBDLWxpa2Ugc3lzdGVtcy4KLQotPGxpPjxwPjxiPlNXSUcgZG9lcyBub3QgZGVmaW5lIGEgcHJvdG9jb2wgbm9yIGlzIGl0IGEgY29tcG9uZW50Ci1mcmFtZXdvcmsuPC9iPiBTV0lHIGRvZXMgbm90IGRlZmluZSBtZWNoYW5pc21zIG9yIGVuZm9yY2UgcnVsZXMKLXJlZ2FyZGluZyB0aGUgd2F5IGluIHdoaWNoIHNvZnR3YXJlIGNvbXBvbmVudHMgYXJlIHN1cHBvc2VkIHRvCi1pbnRlcmFjdCB3aXRoIGVhY2ggb3RoZXIuICBOb3IgaXMgaXQgYSBzcGVjaWFsaXplZCBydW50aW1lIGxpYnJhcnkKLW9yIGFsdGVybmF0aXZlIHNjcmlwdGluZyBsYW5ndWFnZSBBUEkuICBTV0lHIGlzIG1lcmVseSBhIGNvZGUgZ2VuZXJhdG9yCi10aGF0IHByb3ZpZGVzIHRoZSBnbHVlIG5lY2Vzc2FyeSB0byBob29rIEMvQysrIHRvIG90aGVyIGxhbmd1YWdlcy4KLQotPGxpPjxwPjxiPkRlc2lnbmVkIHRvIHdvcmsgd2l0aCBleGlzdGluZyBDL0MrKyBjb2RlPC9iPi4gIFNXSUcKLXJlcXVpcmVzIGxpdHRsZSwgaWYgYW55LCBtb2RpZmljYXRpb25zIHRvIGV4aXN0aW5nIGNvZGUuICBGb3IgdGhlIG1vc3QKLXBhcnQsIGl0IGVuY291cmFnZXMgeW91IHRvIGtlZXAgYSBjbGVhbiBzZXBhcmF0aW9uIGJldHdlZW4gQy9DKysgYW5kCi1pdHMgc2NyaXB0aW5nIGludGVyZmFjZS4KLQotPGxpPjxwPjxiPkV4dGVuc2liaWxpdHk8L2I+LiAgU1dJRyBwcm92aWRlcyBhIHZhcmlldHkgb2YgY3VzdG9taXphdGlvbiBvcHRpb25zIHRoYXQKLWFsbG93IHlvdSB0byBibG93IHlvdXIgd2hvbGUgbGVnIG9mZiBpZiB0aGF0J3Mgd2hhdCB5b3Ugd2FudCB0byBkby4gIAotU1dJRyBpcyBub3QgaGVyZSB0byBlbmZvcmNlIHByb2dyYW1taW5nIG1vcmFsaXR5LgotPC91bD4KLQotRmluYWxseSwgaXQgaXMgd29ydGggbm90aW5nIHRoYXQgZXZlbiB0aG91Z2ggU1dJRyBpcyBvY2Nhc2lvbmFsbHkgY29tcGFyZWQKLXRvIG90aGVyIG1vcmUgc3BlY2lhbGl6ZWQgc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbiBidWlsZGluZyB0b29scwotKGUuZy4sIFBlcmwgWFMsIFB5dGhvbiBiZ2VuLCBldGMuKSwgaXRzIHByaW1hcnkgYXVkaWVuY2UgaXMgQy9DKysKLXByb2dyYW1tZXJzIHdobyB3YW50IHRvIGFkZCBhIHNjcmlwdGluZyBsYW5ndWFnZSBjb21wb25lbnQgdG8gdGhlaXIKLWFwcGxpY2F0aW9ucy4gIEJlY2F1c2Ugb2YgdGhpcywgU1dJRyB0ZW5kcyB0byBoYXZlIGEgc2xpZ2h0bHkKLWRpZmZlcmVudCBmb2N1cyB0aGFuIHRvb2xzIGRlc2lnbmVkIHRvIGJ1aWxkIHNtYWxsIG1vZHVsZXMgZm9yCi13aWRlc3ByZWFkIHVzZSBpbiBhIHNjcmlwdGluZyBsYW5ndWFnZSBkaXN0cmlidXRpb24uIGFwcGxpY2F0aW9ucy4KLQotPHA+Ci1BIG51bWJlciBvZiA8YSBocmVmPSJkb2MuaHRtbCI+cGFwZXJzIGFuZCB0dXRvcmlhbHM8L2E+IGRlc2NyaWJpbmcgU1dJRyBhcmUgYXZhaWxhYmxlLgotWW91IGNhbiBhbHNvIHZpZXcgYSBzaW1wbGUgPGEgaHJlZj0idHV0b3JpYWwuaHRtbCI+dHV0b3JpYWw8L2E+IHRvIHNlZSBhbgotZXhhbXBsZSBvZiBTV0lHIGluIGFjdGlvbiwgb3IgY2hlY2sgb3V0IGhvdyBvdGhlciBwZW9wbGUgYXJlIHVzaW5nIFNXSUcKLWluIHRoZWlyIDxhIGhyZWY9InByb2plY3RzLmh0bWwiPnByb2plY3RzPC9hPi4KLQotPHA+Ci1TV0lHIGhhcyBiZWVuIGZyZWVseSBhdmFpbGFibGUgaW4gdmFyaW91cyBmb3JtcyBzaW5jZSBGZWJydWFyeSwgMTk5NgotYW5kIGEgbGFyZ2UgbnVtYmVyIG9mIGRldmVsb3BlcnMgaGF2ZSBtYWRlIGNvbnRyaWJ1dGlvbnMuICBUb2RheSwgU1dJRwotcmVtYWlucyBhbiBhbGwtdm9sdW50ZWVyIGVmZm9ydC4gIEFwcHJveGltYXRlbHkgODc1IHBlb3BsZSBzdWJzY3JpYmUKLXRvIHRoZSA8YSBocmVmPSJtYWlsLmh0bWwiPnN3aWc8L2E+IG1haWxpbmcgbGlzdCBhbmQgYSBwdWJsaWMgQ1ZTCi1yZXBvc2l0b3J5IGlzIGF2YWlsYWJsZSBhdCBTb3VyY2VGb3JnZS4gIFZlcnNpb25zIG9mIAotU1dJRyBjYW4gbm93IGJlIGZvdW5kIGluIG1vc3QgTGludXggZGlzdHJpYnV0aW9ucyAoaG93ZXZlciwgeW91J2xsIGFsbW9zdAotY2VydGFpbmx5IHdhbnQgdG8gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBoZXJlKS4KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ZhcS5odCBiL3N3aWd3ZWIvZmFxLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRiODNmLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvZmFxLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotU1dJRyBGQVEKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2ZhcS5wbmciIGFsdD0iRkFRIj4KLQotPHA+Ci1UbyBkYXRlLCB0aGVyZSBoYXMgYmVlbiBubyBGQVEgZm9yIFNXSUcuICAgQXMgYSByZXN1bHQsIHlvdSBtYXkgd2FudCB0byAKLWNoZWNrIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgotCi08dWw+Ci08bGk+VGhlIDxhIGhyZWY9ImRvYy5odG1sIj5vbmxpbmUgZG9jdW1lbnRhdGlvbjwvYT4uCi08bGk+VGhlIDxhIGhyZWY9ImJ1Z3MuaHRtbCI+YnVnIHRyYWNraW5nIGRhdGFiYXNlPC9hPi4KLTxsaT5UaGUgPGEgaHJlZj0ibWFpbC5odG1sIj5NYWlsaW5nIGxpc3QgYXJjaGl2ZTwvYT4uCi08L3VsPgotCi1BdCB0aGlzIHRpbWUsIEkgYW0gbG9va2luZyBpbnRvIHRoZSBjcmVhdGlvbiBvZiBhIEZBUS4gIEhvd2V2ZXIsIHRoaXMgd291bGQgYmUKLW11Y2ggbXVjaCBlYXNpZXIgaWYgdGhlcmUgd2VyZSBhIHZvbHVudGVlciB0byBoZWxwLiAKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvZmFxLm50IGIvc3dpZ3dlYi9mYXEubnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZThlZjguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9mYXEubnQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1TV0lHIEZBUQotCi08cD4KLTxpbWcgc3JjPSJpbWFnZXMvZmFxLmdpZiI+Ci0KLTxwPgotVG8gZGF0ZSwgdGhlcmUgaGFzIGJlZW4gbm8gRkFRIGZvciBTV0lHLiAgIEFzIGEgcmVzdWx0LCB5b3UgbWF5IHdhbnQgdG8gCi1jaGVjayB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKLQotPHVsPgotPGxpPlRoZSA8YSBocmVmPSJkb2MuaHRtbCI+b25saW5lIGRvY3VtZW50YXRpb248L2E+LgotPGxpPlRoZSA8YSBocmVmPSJidWdzLmh0bWwiPmJ1ZyB0cmFja2luZyBkYXRhYmFzZTwvYT4uCi08bGk+VGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+TWFpbGluZyBsaXN0IGFyY2hpdmU8L2E+LgotPC91bD4KLQotQXQgdGhpcyB0aW1lLCBJIGFtIGxvb2tpbmcgaW50byB0aGUgY3JlYXRpb24gb2YgYSBGQVEuICBIb3dldmVyLCB0aGlzIHdvdWxkIGJlCi1tdWNoIG11Y2ggZWFzaWVyIGlmIHRoZXJlIHdlcmUgYSB2b2x1bnRlZXIgdG8gaGVscC4gCmRpZmYgLS1naXQgYS9zd2lnd2ViL2Z1dHVyZS5odCBiL3N3aWd3ZWIvZnV0dXJlLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZkZTc5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvZnV0dXJlLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLVNXSUctMS4zLjEyLCBTV0lHLTIuMCBhbmQgQmV5b25kCi0KLTxoMj5TV0lHLTEuMy4xMiwgU1dJRyAyLjAsIGFuZCBCZXlvbmQ8L2gyPgotCi08cD4KLUF1dGhvcjogRGF2aWQgQmVhemxleSAoYmVhemxleUBjcy51Y2hpY2Fnby5lZHUpCi0KLTxwPgotSnVuZSAyLCAyMDAyCi0KLTxwPgotV2l0aCB0aGUgcmVsZWFzZSBvZiBTV0lHLTEuMy4xMiwgSSB0aG91Z2h0IEknZCB0YWtlIGEgZmV3IG1vbWVudHMgb2YKLWV2ZXJ5b25lJ3MgdGltZSB0byB0YWxrIGFib3V0IHRoZSBwYXN0LCB0aGUgcHJlc2VudCwgYW5kIHRoZSBmdXR1cmUgb2YKLVNXSUcgZGV2ZWxvcG1lbnQuICBJJ20gcmVhbGx5IHF1aXRlIGV4Y2l0ZWQgYWJvdXQgdGhlIGN1cnJlbnQgcmVsZWFzZQotYmVjYXVzZSBJIHRoaW5rIGl0IHJlcHJlc2VudHMgYSBodWdlIHR1cm5pbmcgcG9pbnQgaW4gU1dJRydzCi1kZXZlbG9wbWVudC4gIEZ1cnRoZXJtb3JlLCBpdCBpcyBvbmx5IHRoZSBiZWdpbm5pbmcgb2YgYmlnZ2VyIGFuZAotYmV0dGVyIHRoaW5ncyB0byBjb21lLiAgSG93ZXZlciwgd2UgZGVmaW5pdGVseSBuZWVkIHlvdXIgaGVscC4KLQotPHA+Ci1UbyBwdXQgYSBsaXR0bGUgcGVyc3BlY3RpdmUgb24gdGhlIGRpc2N1c3Npb24sIEknZCBzdGFydCB3aXRoIGEgZmV3Ci1kZXZlbG9wbWVudCBzdGF0aXN0aWNzLiAgSW4gdGhlIGxhc3QgMTIgbW9udGhzLCB0aGVyZSBoYXZlIGJlZW4gb3ZlcgotMzAwIGVudHJpZXMgYWRkZWQgdG8gdGhlIENIQU5HRVMgbG9nIGFuZCBvdmVyIDQwMDAgQ1ZTIGNvbW1pdHMuCi1BbHRob3VnaCB0aGF0IG1heSBub3Qgc291bmQgbGlrZSBhIGxvdCBjb21wYXJlZCB0byBhIGh1Z2Ugc29mdHdhcmUKLXByb2plY3QsIGl0IGlzIHNpZ25pZmljYW50IGluIHRoZSBjb250ZXh0IG9mIFNXSUcuICBBcyBhIHBvaW50IG9mCi1jb21wYXJpc29uLCB0aGVyZSBoYXMgYmVlbiBtb3JlIFNXSUcgZGV2ZWxvcG1lbnQgdGhpcyB5ZWFyIHRoYW4gaW4gYW55Ci1vdGhlciB5ZWFyIG9mIHRoZSBwcm9qZWN0IGFuZCBtb3JlIHRoYW4gaW4gdGhlIHByZXZpb3VzIHRocmVlIHllYXJzCi1jb21iaW5lZC4gIFRoaXMgZXZlbiBpbmNsdWRlcyB0aGUgZmlyc3QgZmV3IHllYXJzIG9mIGRldmVsb3BtZW50IGluCi13aGljaCB0aGVyZSB3YXMgYWxzbyBhIGxvdCBvZiBhY3Rpdml0eS4gIEZ1cnRoZXJtb3JlLCBtYW55IG9mIHRoZQotcmVjZW50IGNoYW5nZXMgaGF2ZSBiZWVuIGV4dHJlbWVseSBub24tdHJpdmlhbCAoZS5nLiwgdGVtcGxhdGVzLAotbmFtZXNwYWNlcywgdHlwZSBzeXN0ZW0sIG9wZXJhdG9ycywgZXRjLikuICBBcyBhIHJlc3VsdCwgU1dJRyBpcyBtb3JlCi1jYXBhYmxlIHRoYW4gSSBldmVyIGltYWdpbmVkIHBvc3NpYmxlLgotCi08cD4KLVJlZ3JldHRhYmx5LCBJIG11c3QgYWRtaXQgdGhhdCBJJ3ZlIGJlZW4gYSBsaXR0bGUgbmVnbGlnZW50IGluCi1kaXNjdXNzaW5nIHRoZSByb2FkbWFwIGZvciB3aGVyZSBJIHRob3VnaHQgdGhpcyBmbHVycnkgb2YgU1dJRwotZGV2ZWxvcG1lbnQgd2FzIGFjdHVhbGx5IGhlYWRlZC4gIEluIHBhcnQsIHRoaXMgaXMgYmVjYXVzZSBJJ3ZlIGJlZW4KLWJ1cmllZCBpbiB3b3JrLiAgSG93ZXZlciwgdGhlIHJlYWwgcmVhc29uIGlzIHRoYXQgSSBkaWRuJ3QgcmVhbGx5IGtub3cKLXdoZXJlIHdlIHdlcmUgZ29pbmctLS1leGNlcHQgdGhhdCBpbiBhIHRpbWUgZmFyIGZhciBmYXIgYXdheSBpbiB0aGUKLWZ1dHVyZSwgd2UgbWlnaHQgYXJyaXZlIGF0IHNvbWUga2luZCBvZiAic3RhYmxlIiByZWxlYXNlIHdpdGggYQotdmVyc2lvbiBudW1iZXIgb3RoZXIgdGhhbiAiMS4zLngiLiAgTmVlZGxlc3MgdG8gc2F5LCB0aGF0J3Mgbm90IGEgdmVyeQotY29tcGVsbGluZyBzdG9yeS4KLTxwPgotVGhhdCBzYWlkLCBJJ3ZlIHNwZW50IGEgbG90IG9mIHRpbWUgdGhpbmtpbmcgYWJvdXQgU1dJRyBhbmQgdHJ5aW5nIHRvCi13cmFwIG15IGJyYWluIGFyb3VuZCBpdC4gIFNwZWNpZmljYWxseSwganVzdCB3aGF0IGlzIChvciBzaG91bGQgYmUpCi10aGUgcHJpbWFyeSBmb2N1cyBvZiB0aGlzIHByb2plY3QgYW5kIHdoYXQgYXJlIHdlIHJlYWxseSB0cnlpbmcgdG8gZG8/Ci1UaGF0J3Mgd2hhdCB0aGUgcmVzdCBvZiB0aGlzIG1lc3NhZ2UgaXMgYWJvdXQuCi0KLTxoMz5TV0lHIFByZWhpc3Rvcnk8L2gzPiAKLQotPHA+Ci1UaGUgZmlyc3QgdmVyc2lvbiBvZiBTV0lHIHdhcyB3cml0dGVuIGluIDE5OTUuICBUaGUgb3JpZ2luYWwgc3lzdGVtCi13YXMgZGV2ZWxvcGVkIHRvIGhlbHAgd2l0aCBzb21lIHNvZnR3YXJlIHdyYXBwaW5nIHByb2JsZW1zIEkKLWVuY291bnRlcmVkIHdoaWxlIHdyaXRpbmcgbW9sZWN1bGFyIGR5bmFtaWNzIHNvZnR3YXJlIGF0IExvcwotQWxhbW9zLiBMYXRlciB0aGF0IHllYXIsIEkgYmVjYW1lIGludGVyZXN0ZWQgaW4gZXh0ZW5kaW5nIHRoZSB3cmFwcGVyCi1nZW5lcmF0b3IgdG8gc3VwcG9ydCBvdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHNvIGl0IHdhcyByZXdyaXR0ZW4gaW4KLUMrKyBhbmQgbW9kaWZpZWQgd2l0aCBtdWx0aXBsZSBiYWNrZW5kcyAoVGNsLCBQZXJsLCBhbmQgR3VpbGUpLiAgVGhpcwotbGVkIHRvIGEgZmlyc3QgcHVibGljIHJlbGVhc2UgaW4gRmVicnVhcnksIDE5OTYuICBGZWVkYmFjayBmcm9tIHRoaXMKLXJlbGVhc2UgbGVkIHRvIGEgc2VyaWVzIG9mIGVuaGFuY2VtZW50cyBhbmQgdGhlIHJlbGVhc2Ugb2YgU1dJRyAxLjAgaW4KLVNlcHRlbWJlciAxOTk2LiAgVGhyb3VnaG91dCB0aGlzIHByb2Nlc3MsIG15IGludGVudCB3YXMgdG8gY3JlYXRlIGEKLXRvb2wgdGhhdCBJIHdvdWxkIHdhbnQgdG8gdXNlLS0tSSBuZXZlciB2aWV3ZWQgdGhlIHByb2plY3QgYXMgYW4KLUNTIGV4cGVyaW1lbnQgaW4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIG9yIHNvZnR3YXJlIGVuZ2luZWVyaW5nLgotCi08aDM+U1dJRyAxLjE8L2gzPgotCi1TV0lHLTEuMSAoSnVuZSwgMTk5NykgcmVwcmVzZW50ZWQgYSBzZXJpZXMgb2YgZW5oYW5jZW1lbnRzIHRoYXQgd2VyZQotYWRkZWQgaW4gcmVzcG9uc2UgdG8gZmVlZGJhY2sgYXQgY29uZmVyZW5jZXMgYW5kIGZyb20gdXNlcnMuICBTaGFkb3cKLWNsYXNzZXMsIGV4Y2VwdGlvbiBoYW5kbGluZywgdHlwZW1hcHMsIGFuZCBhIG51bWJlciBvZiBtb3JlIHVzZWZ1bAotZmVhdHVyZXMgd2VyZSBhZGRlZC4gIEhvd2V2ZXIsIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBvZiB0aGUgc3lzdGVtIHdhcwotcmVsYXRpdmVseSB1bmNoYW5nZWQgZnJvbSB0aGUgaW5pdGlhbCB2ZXJzaW9uLiAgRm9sbG93aW5nIHRoZSByZWxlYXNlCi1vZiAxLjEsIGEgc2VyaWVzIG9mIG1pbm9yIHBhdGNoIHJlbGVhc2VzIHdlcmUgbWFkZS4gIFRoaXMgcmVzdWx0ZWQgaW4KLXRoZSByZWxlYXNlIG9mIFNXSUctMS4xcDUgaW4gRmVicnVhcnksIDE5OTguICBVbmZvcnR1bmF0ZWx5LCB0aGlzCi1yZWxlYXNlIHdvdWxkIHJlbWFpbiB0aGUgbGFzdCAic3RhYmxlIiByZWxlYXNlIGZvciBxdWl0ZSBhIGxvbmcKLXRpbWUtLS1pbiBmYWN0LCBpdCBpcyBzdGlsbCBsaXN0ZWQgYXMgdGhlIGxhc3QgInN0YWJsZSIgcmVsZWFzZSBvbiB0aGUKLVNXSUcgd2ViIHBhZ2UhCi0KLTxoMz5TV0lHIEhlbGw8L2gzPgotCi1FdmVuIGR1cmluZyB0aGUgZGV2ZWxvcG1lbnQgb2YgU1dJRy0xLjEsIGl0IHdhcyBjbGVhciB0aGF0IHRoZSB3aG9sZQotZGVzaWduIG9mIHRoZSBzeXN0ZW0gd2FzIGRlZXBseSBmbGF3ZWQuICBUaGUgaW1wbGVtZW50YXRpb24gd2FzIGEgbWVzcwotYW5kIHRoZSBDL0MrKyBzdXBwb3J0IHdhcyBmdWxsIG9mIGhvbGVzIGFuZCBuYXN0eSBjb3JuZXIgY2FzZXMuCi1GdXJ0aGVybW9yZSwgdGhlcmUgd2FzIG5vIHVuaWZ5aW5nIHByaW5jaXBsZSB0aGF0IHRpZWQgYWxsIG9mIHRoZQotZGlmZmVyZW50IFNXSUcgZGlyZWN0aXZlcyB0b2dldGhlci4gIE5vdCBvbmx5IHRoYXQsIGZpeGluZyB0aGVzZQotcHJvYmxlbXMgYXBwZWFyZWQgdG8gYmUgbm90aGluZyBzaG9ydCBvZiBpbXBvc3NpYmxlLS0tcmVxdWlyaW5nIGEKLXRvdGFsIGdyb3VuZC11cCByZXdyaXRlIGF0IGJlc3QuICBUaGUgb25seSByZWRlZW1pbmcgcXVhbGl0eSB3YXMgdGhhdAotdGhlIHN5c3RlbSBiYXNpY2FsbHkgd29ya2VkICJ3ZWxsIGVub3VnaCwiIGl0IHdhcyBleHRlbnNpdmVseQotZG9jdW1lbnRlZCwgYW5kIGl0cyBmbGF3cyBtb3N0bHkga25vd24uICBQZW9wbGUgY291bGQgdXNlIGl0IGFuZCB0aGVyZQotd2VyZSB3b3JrLWFyb3VuZHMgZm9yIG1vc3QgY29tbW9uIHByb2JsZW1zLgotCi08cD4KLVRvIGRlYWwgd2l0aCB0aGUgZGVzaWduIHByb2JsZW0sIHRoZXJlIHdlcmUgYXQgbGVhc3QgZm91ciBhdHRlbXB0cyB0bwotY29tcGxldGVseSByZXdyaXRlIFNXSUcsIHNvbWUgb2Ygd2hpY2ggd2VyZSBhdHRlbXB0ZWQgaW4gcGFyYWxsZWwgd2l0aAotdGhlIHdvcmsgb24gU1dJRy0xLjEuICBVbmZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZXNlIHdlcmUgZXZlcgotY29tcGxldGVkLiBUaGUgcHJpbWFyeSBwcm9ibGVtIHdhcyBhIHN0cm9uZyAic2Vjb25kIHN5c3RlbSIgZWZmZWN0IGFuZAotYSBkZXNpcmUgdG8gbWFrZSBTV0lHIGRvIGV2ZXJ5dGhpbmcgdGhhdCBvbmUgbWlnaHQgY29uY2VpdmFibHkgd2FudCB0bwotZG8gd2l0aCBhIHdyYXBwZXIgZ2VuZXJhdG9yIChzb21laG93KS4gIENsZWFybHksIHRoaXMgd2FzIGEgcmVjaXBlIGZvcgotZGlzYXN0ZXIuIEluIGZhY3QsIGFsbCBzdWNoIGF0dGVtcHRzIHRvIHJld3JpdGUgU1dJRyB3ZXJlIGV2ZW50dWFsbHkKLWFiYW5kb25lZCBzZXZlcmFsIHllYXJzIGFnby4gIEluIGhpbmRzaWdodCwgSSB0aGluayB0aGUgcmVhbCBwcm9ibGVtCi13YXMgdGhhdCB0aGVzZSByZXdyaXRlIGVmZm9ydHMgZm9jdXNlZCBmYXIgdG9vIG11Y2ggYXR0ZW50aW9uIG9uCi1pbXBsZW1lbnRhdGlvbiB0ZWNobmlxdWUgcmF0aGVyIHRoYW4gcHJpbmNpcGxlcy4gIEluIHNob3J0LCB0aGUKLWZhaWx1cmUgb2YgdGhlc2UgZWZmb3J0cyB3YXMgZHVlIHRvIGEgbGFjayBvZiBjbGFyaXR5IGluIHVuZGVyc3RhbmRpbmcKLWhvdyBTV0lHIG91Z2h0IHRvIHdvcmsgKHJlZ2FyZGxlc3Mgb2YgaG93IGl0IHdhcyBhY3R1YWxseQotaW1wbGVtZW50ZWQpLgotCi08aDM+U1dJRyBSZXN0YXJ0ICgxLjNhMS0xLjNhNSk8L2gzPgotCi08cD4KLUhhdmluZyBsYW5ndWlzaGVkIGZvciBzZXZlcmFsIHllYXJzLCB0aGUgU1dJRzEuMXA1IHJlbGVhc2UgaGFkIGEKLWdyb3dpbmcgcGlsZSBvZiBtYWludGVuYW5jZSBpc3N1ZXMuIEl0IGRpZG4ndCB3b3JrIGZvciBuZXdlciB2ZXJzaW9ucwotb2YgY2VydGFpbiBsYW5ndWFnZSBtb2R1bGVzIGFuZCBhIGxvdCBvZiBtaW5vciBidWcgcmVwb3J0cyBhbmQgZmVhdHVyZQotcmVxdWVzdHMgaGFkIGJlZW4gYnVpbGRpbmcgdXAuICBXaXRoIGEgbG90IG9mIGhlbHAgZnJvbSBMb2ljIERhY2hhcnkgYW5kCi1UaGllbi1UaGkgTmd1eWVuLCB3ZSBwdXQgdG9nZXRoZXIgdGhlIDEuM2ExIHJlbGVhc2UgKEZlYnJ1YXJ5LAotMjAwMCkuICBUaGlzIHdhcyBtb3N0bHkgYSBidWcgZml4IHJlbGVhc2UgdG8gMS4xcDUgZXhjZXB0IHRoYXQgdGhlCi1wcmVwcm9jZXNzb3IgbW9kdWxlIGZyb20gU1dJRzEuMiB3YXMgYWRkZWQgYW5kIGEgbG90IG9mIG1pbm9yCi1lbmhhbmNlbWVudHMgd2VyZSBhZGRlZC4KLQotPHA+Ci1Gb3IgdGhlIG5leHQgc2l4IG1vbnRocywgYSBtYXNzaXZlIGVmZm9ydCB3YXMgbWFkZSB0byByZXdyaXRlIGFsbCBvZgotU1dJRydzIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAoc3RyaW5ncywgbGlzdHMsIGhhc2hlcywgZXRjLikuICBUaGlzCi13b3JrIHdhcyBhbGwgZ29pbmcgb24gdW5kZXJuZWF0aCB0aGUgY292ZXJzIHdoaWxlIHdlIHRyaWVkIHRvIGtlZXAKLVNXSUcgaW4gYW4gb3BlcmF0aW9uYWwgc3RhdGUuIFRoZSBwcmltYXJ5IGZvY3VzIG9mIHRoaXMgd29yayB3YXMKLXJlYWxseSBvbmUgb2YgY2xlYW51cC4gIEhhdmluZyBnaXZlbiB1cCBvbiBhIHRvdGFsIHJld3JpdGUsIHBlcmhhcHMKLXdlIGNvdWxkIHNldHRsZSB3aXRoIG1ha2luZyB0aGUgaW1wbGVtZW50YXRpb24gaW5jcmVtZW50YWxseSBiZXR0ZXIgCi10aGFuIGJlZm9yZS4gIEluIGFkZGl0aW9uIHRoaXMsIE1hdHRoaWFzIEtvcHBlIGp1bXBlZCBvbiBib2FyZCB0byAKLXJlaW1wbGVtZW50IHRoZSBHdWlsZSBtb2R1bGUgYW5kIHRvIG1ha2Ugb3RoZXIgaW1wcm92ZW1lbnRzIHRvIHRoZSBzeXN0ZW0uCi0KLTxwPgotQW4gaW1wb3J0YW50IGFzcGVjdCBvZiB0aGVzZSByZWxlYXNlcyB3YXMgdGhhdCBtYW55IHBhcnRzIG9mIHRoZQotc3lzdGVtIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIHdyYXBwZXIgY29kZSBnZW5lcmF0aW9uIHdlcmUgcmVtb3ZlZC4KLVRoaXMgaW5jbHVkZWQgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGFuZCBPYmplY3RpdmUtQyBzdXBwb3J0LiAgVGhlc2UKLXdlcmUgbm90IHJlbW92ZWQgYmVjYXVzZSB0aGV5IHdlcmVuJ3QgdXNlZnVsLiAgSW5zdGVhZCwgdGhlCi1kb2N1bWVudGF0aW9uIHN5c3RlbSB3YXMgcmVtb3ZlZCBiZWNhdXNlIGl0IGFjY291bnRlZCBmb3IgbmVhcmx5IGhhbGYKLW9mIHRoZSBzcGVjaWFsIFNXSUcgZGlyZWN0aXZlcywgeWV0IGhhZCBubyBkaXJlY3QgYmVhcmluZyBvbiB3aGF0IFNXSUcKLWFjdHVhbGx5IGRpZC4gIE9iZWN0aXZlLUMgc3VwcG9ydCB3YXMgcmVtb3ZlZCBiZWNhdXNlIGl0IHdhcyB0YW5nbGVkCi13aXRoIEMrKyBzdXBwb3J0IGluIGEgd2F5IHRoYXQgd2FzIHZlcnkgZGlmZmljdWx0IHRvIHVuZGVyc3RhbmQgYW5kCi1tYWludGFpbi4gIFRoZSByZW1vdmFsIG9mIHRoZXNlIGZlYXR1cmVzIHdhcyBzZWVuIGFzIGEgd2F5IHRvIHZhc3RseQotc2ltcGxpZnkgY2xlYW51cC0tYW5kIHRvIGJ1eSBzb21lIHRpbWUgd2hlcmUgd2UgY291bGQgcmV0aGluayB0aGVpcgotcm9sZSBpbiBhIGZ1dHVyZSByZWxlYXNlLgotCi08aDM+U1dJRyBSZWR1eCAoMS4zLjYtMS4zLjExKTwvaDM+Ci0KLVRoaXMgd29yaywgc3RhcnRlZCBpbiBGZWJydWFyeSAyMDAxLCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50Ci1TV0lHIGltcGxlbWVudGF0aW9uLiAgV2l0aCB0aGUgaGVscCBvZiBXaWxsaWFtIEZ1bHRvbiwgTWF0dGhpYXMgS29wcGUsCi1MeWxlIEpvaG5zb24sIEx1aWdpIEJhbGxhYmlvLCBKYXNvbiBTdGV3YXJ0LCBSaWNoYXJkIFBhbG1lciwgU2FtCi1MaWRkaWNvdCwgYW5kIG90aGVycywgdGhpcyB3b3JrIGNhbiBiZXN0IGJlIGRlc2NyaWJlZCBhcyB0aGUgd2hvbGVzYWxlCi1kZXN0cnVjdGlvbiBvZiBldmVyeXRoaW5nIHJlbWFpbmluZyBmcm9tIFNXSUctMS4xLiAgVGhlIGxhbmd1YWdlCi1tb2R1bGUgQVBJLCB0eXBlIHN5c3RlbSwgdGhlIHBhcnNlciwgbnVtZXJvdXMgU1dJRyBkaXJlY3RpdmVzLCBhbmQKLVNXSUcgbGlicmFyeSBmaWxlcy0tLWFsbCBkZXN0cm95ZWQgb3IgcmV3cml0dGVuLiAgTm90IG9ubHkgdGhhdCwgd2UKLXN0YXJ0ZWQgaW50cm9kdWNpbmcgc2lnbmlmaWNhbnQgaW5jb21wYXRpYmlsaXRpZXMgd2l0aAotU1dJRy0xLjEtLS1tb3N0bHkgaW4gYW4gZWZmb3J0IHRvIGNvcnJlY3QgcGFzdCB3cm9uZ3MgYW5kIGdldAotb3Vyc2VsdmVzIG91dCBvZiB0aGUgdGFuZ2xlZCBtZXNzIG9mIGVhcmxpZXIgdmVyc2lvbnMuICBBIGh1Z2UgbnVtYmVyCi1vZiBsb25nLXN0YW5kaW5nIGJ1Z3MgYW5kIGRpZmZpY3VsdCBmZWF0dXJlIHJlcXVlc3RzIGhhdmUgYWxzbyBiZWVuCi1yZXNvbHZlZC4KLQotPHA+Ci1UaGUgZ2VuZXJhbCBnb2FsIG9mIHRoaXMgZGV2ZWxvcG1lbnQgY291bGQgYmVzdCBiZSBkZXNjcmliZWQgYXMgYW4KLWF0dGVtcHQgdG8gcmVkdWNlIFNXSUcgdG8gYW4gZWFzaWx5IGRlc2NyaWJlZCBzZXQgb2YgZ2VuZXJhbCAiaWRlYXMiCi1hYm91dCBob3cgaXQgc2hvdWxkIG9wZXJhdGUuICBTcGVjaWFsIFNXSUcgZGlyZWN0aXZlcyBoYXZlIGJlZW4KLWVsaW1pbmF0ZWQgb3IgY29tYmluZWQgd2l0aCBvdGhlcnMuICBEaWZmZXJlbnQgcGFydHMgb2YgdGhlIHN5c3RlbSBoYXZlCi1iZWVuIGJldHRlciBpbnRlZ3JhdGVkLiAgRmVhdHVyZXMgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gd3JhcHBlciBjb2RlCi1nZW5lcmF0aW9uIGhhdmUgYmVlbiByZW1vdmVkIGFuZCB0aGUgc3lzdGVtIGhhcyBiZWNvbWUgbW9yZQotZm9jdXNlZC4gQ2hhbmdlcyBpbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgYW5kIEFQSXMgaGF2ZSBhbGxvd2VkCi1TV0lHIHRvIGNhcHR1cmUgbW9yZSBpbmZvcm1hdGlvbiBmcm9tIGludGVyZmFjZSBmaWxlcyBhbmQgdG8gcmVzb2x2ZQotaGFyZCBjb3JuZXIgY2FzZXMuICBNb3JlIG9mdGVuIHRoYW4gbm90LCB0aGVzZSBhcmUgdGhpbmdzIHRoYXQgeW91Ci1uZXZlciBub3RpY2UgdW5sZXNzIHlvdSBhcmUgYW4gb2xkIHVzZXIgYW5kIHlvdSBzdWRkZW5seSByZWFsaXplIHRoYXQKLWEgcHJvYmxlbSB5b3UgaGFkIHNldmVyYWwgeWVhcnMgYmFjayBoYXMgZGlzYXBwZWFyZWQuCi0KLTxwPgotQWxvbmcgd2l0aCB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2xkIGNvZGUsIHRoaXMgd29yayBoYXMgcXVpZXRseQotaW50cm9kdWNlZCBhIG5ldyBjb3JlLS10aGUgbW9zdCBzaWduaWZpY2FudCBmZWF0dXJlcyBvZiB3aGljaCBhcmUgYQotbmV3IEMrKyB0eXBlIHN5c3RlbSBhbmQgbXVsdGktcGFzcyBjb21waWxhdGlvbi4gIE1vcmUgaW1wb3J0YW50bHksCi10aGlzIHdvcmsgaGFzIHJlYWxseSB0cmllZCB0byBwcm92aWRlIGEgbW9yZSBwcmluY2lwbGVkIGZvdW5kYXRpb24gZm9yCi1mdXR1cmUgU1dJRyBkZXZlbG9wbWVudC4gIEhvd2V2ZXIsIGp1c3Qgd2hhdCBpcyB0aGlzICJtb3JlIHByaW5jaXBsZWQKLWZvdW5kYXRpb24/IgotCi08aDM+Q29udmVyZ2VuY2UgKDEuMy4xMik8L2gzPgotCi1XaXRoIHRoZSB1cGNvbWluZyAxLjMuMTIgcmVsZWFzZSwgU1dJRyBpcyBhYm91dCB0byB0YWtlIGEgYmlnIGxlYXAKLWZvcndhcmQuIEFsbW9zdCBhbGwgb2YgdGhpcyBpcyBkdWUgdG8gb25lIHJlYWxpemF0aW9uLS0tdGhhdCBhbG1vc3QKLWV2ZXJ5IGhhcmQgcHJvYmxlbSBpbiBwYXN0IFNXSUcgcmVsZWFzZXMgaGFzIGJlZW4gZGlyZWN0bHkgcmVsYXRlZCB0bwotZXJyb3JzIGFuZCBsaW1pdGF0aW9ucyBpbiBpdHMgdHlwZSBzeXN0ZW0uICBUeXBlcyBhcmUgdGhlIGtleSB0bwotdW5kZXJzdGFuZGluZyB0aGUgc3RydWN0dXJlIG9mIEMgYW5kIEMrKyBjb2RlLiAgVGhleSBhcmUgYXQgdGhlIGhlYXJ0Ci1vZiB1bmRlcnN0YW5kaW5nIGFkdmFuY2VkIGxhbmd1YWdlIGZlYXR1cmVzIGxpa2UgbmFtZXNwYWNlcywgbmVzdGVkCi1jbGFzc2VzLCBhbmQgdGVtcGxhdGVzLiAgVGhleSBhcmUgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgZGF0YQotbWFyc2hhbGxpbmcgdGhhdCBvY2N1cnMgaW4gd3JhcHBlcnMuICBOb3Qgb25seSB0aGF0LCB0aGV5IGludGVyYWN0Ci13aXRoIG5lYXJseSBldmVyeSBTV0lHIGRpcmVjdGl2ZS4gIEEgcHJvcGVyIHR5cGUgc3lzdGVtICppcyogdGhlCi1uZWNlc3NhcnkgZm91bmRhdGlvbiBmb3IgbW92aW5nIFNXSUcgZm9yd2FyZC4KLQotPHA+Ci1UbyBiZSBob25lc3QsIEkgZG9uJ3QgdGhpbmsgdGhhdCB0aGUgZW1waGFzaXMgb24gdHlwZXMgaXMgZW50aXJlbHkKLW9idmlvdXMuICBJbiBmYWN0LCBhIGdyZWF0IGRlYWwgb2Ygd29yayBpbiBwYXN0IFNXSUcgcmV3cml0ZXMgaGFzCi1mb2N1c2VkIG9uIHRoZSBwcm9ibGVtIG9mIEMrKyBwYXJzaW5nLiAgRm9yIGluc3RhbmNlLCBtb2RpZnlpbmcgdGhlCi1wYXJzZXIgdG8gaGFuZGxlIG1vcmUgYWR2YW5jZWQgQysrIGNvZGUgb3IgcmVwcmVzZW50aW5nIHBhcnNlIHRyZWVzIGFzCi1YTUwuICBGdXJ0aGVybW9yZSwgaWYgb25lIGxvb2tzIGF0IHRoZSBTV0lHIG1haWxpbmcgbGlzdCwgeW91IGNhbiBmaW5kCi1hICpsb3QqIG9mIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gaXNzdWVzIG9mIEMrKyBwYXJzaW5nIHdoZXJlYXMgYWxtb3N0IG5vCi1vbmUgZXZlciB0YWxrcyBhYm91dCB0eXBlcyAod2VsbCwgb3RoZXIgdGhhbiB0eXBlbWFwcykuICBFdmVuIG90aGVyCi13cmFwcGVyIGdlbmVyYXRpb24gdG9vbHMgc2VlbXMgdG8gc3BlbmQgYSBsb3Qgb2YgdGltZSBkZWFsaW5nIHdpdGggdGhlCi1wYXJzaW5nIGlzc3VlLiBBbHRob3VnaCBwYXJzaW5nIGlzIGNsZWFybHkgaW1wb3J0YW50LCBJIGRvbid0IHRoaW5rIGl0Ci1oYXMgZXZlciBiZWVuIHRoZSByZWFsIHByb2JsZW0gaW4gU1dJRy4gIFRoaXMgaXMgYmVjYXVzZSBldmVuIHRob3VnaCBhCi1wYXJzZXIgY2FuIHRlbGwgeW91IHdoYXQncyBpbiBhIGhlYWRlciBmaWxlLCBpdCBkb2Vzbid0IHRlbGwgeW91Ci1hbnl0aGluZyBhYm91dCBob3cgdGhlIGRpZmZlcmVudCBwaWVjZXMgb2YgdGhlIHN5c3RlbSBiZWhhdmUgb3IgaG93Ci10aGV5IG1pZ2h0IGludGVyYWN0LiBUbyBkbyB0aGF0LCB5b3UgbmVlZCB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVzdAotcGFyc2luZy0tYW5kIHRoYXQncyByZWFsbHkgdGhlIHdob2xlIHBvaW50LgotCi08cD4gCi1BbHRob3VnaCBlYXJsaWVyIDEuMyByZWxlYXNlcyBoYXZlIG1hZGUgYmlnIGltcHJvdmVtZW50cyB0byB0aGUgdHlwZQotc3lzdGVtLCBTV0lHLTEuMy4xMiBpcyB0aGUgZmlyc3QgcmVsZWFzZSB0aGF0IHJlYWxseSB0cmllcyB0byB0YWNrbGUKLXRoZSB0eXBlLXN5c3RlbSBpc3N1ZSBpbiBhIG1ham9yIHdheS4gIFdlIGhhdmUgcGF0Y2hlZCBuZWFybHkgYWxsCi1yZW1haW5pbmcgaG9sZXMgaW4gdGhlIHR5cGUgc3lzdGVtIGFuZCB3ZSBoYXZlIGFkZGVkIGZ1bGwgc3VwcG9ydCBmb3IKLUMrKyBuYW1lc3BhY2VzLiBOb3Qgb25seSB0aGF0LCB3ZSBoYXZlIGNvbXBsZXRlbHkgcmVpbXBsZW1lbnRlZCBDKysKLXRlbXBsYXRlIHN1cHBvcnQgaW4gYSB3YXkgdGhhdCBzdXBwb3J0cyB0ZW1wbGF0ZXMsIG1lbWJlciB0ZW1wbGF0ZXMsCi1hbmQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uICBMdWlnaSBhbmQgSSBhcmUgY3VycmVudGx5IHVzaW5nIHRoaXMgdG8KLXdvcmsgb24gcHJvcGVyIFNXSUcgbGlicmFyeSBzdXBwb3J0IGZvciBwYXJ0cyBvZiB0aGUgQysrIHN0YW5kYXJkCi1saWJyYXJ5IGFuZCB0aGUgU3RhbmRhcmQgVGVtcGxhdGUgTGlicmFyeSAoU1RMKS4gIEFsdGhvdWdoIHNvbWUgY3J1c3R5Ci1DIHByb2dyYW1tZXJzIChwcmVzZW50IGNvbXBhbnkgZXhjZXB0ZWQpLCBtaWdodCBiYWxrIGF0IHN1Y2ggYXBwYXJlbnQKLWluc2FuaXR5LCB0aGlzIHdvcmsgaGFzIGltcGFjdGVkIGFsbCBwYXJ0cyBvZiBTV0lHIGF0IGFsbCBsZXZlbHMuCi1FdmVuIGEgdmFyaWV0eSBvZiBzdWJ0bGUgZXJyb3JzIGluIEMgc3VwcG9ydCBoYXZlIGJlZW4gZml4ZWQgYnkgdGhpcwotd29yay4KLQotPHA+Ci1JbiBhZGRpdGlvbiB0byB0aGUgdHlwZSBzeXN0ZW0gd29yaywgU1dJRy0xLjMuMTIgY29udGFpbnMgY29udGludWVkCi1yZWR1Y3Rpb24gaW4gdGhlIGltcGxlbWVudGF0aW9uLiBEaXJlY3RpdmVzIGhhdmUgYmVlbiByZW1vdmVkLAotcmVmaW5lZCwgcmVuYW1lZCwgb3IgY29uc29saWRhdGVkLiAgV2UncmUgc3RpbGwgbmFycm93aW5nIHRoZSBmb2N1cyBvZgotdGhlIHN5c3RlbSBhbmQgd29ya2luZyB0b3dhcmRzIHNvbWUga2luZCBvZiBjb252ZXJnZW5jZS4gICJDb252ZXJnZW5jZQotdG8gd2hhdD8hPyIsIHlvdSBhc2suCi0KLTxoMz5Tbywgd2hhdCBpcyBTV0lHPzwvaDM+Ci0KLUluIGEgbnV0c2hlbGwsIFNXSUcgaXMgYSBDL0MrKyBkZWNsYXJhdGlvbiBjb21waWxlciB0aGF0IGdlbmVyYXRlcwotd3JhcHBlciBjb2RlIChva2F5LCBzbyB5b3Uga25ldyB0aGF0IG11Y2gpLiAgSG93ZXZlciwgdG8gcmVhbGx5Ci11bmRlcnN0YW5kIHdoYXQgU1dJRyBpcyBkb2luZyBhbmQgd2hlcmUgU1dJRy0xLjMueCBpcyBoZWFkZWQsIGl0IGlzCi11c2VmdWwgdG8ga25vdyB0aGF0IHRoZSB3aG9sZSBzeXN0ZW0gaXMgZXNzZW50aWFsbHkgYmVpbmcgYnVpbHQgYXJvdW5kCi10aHJlZSBleHRlbnNpb25zIHRvIHRoZSBDKysgdHlwZSBzeXN0ZW06Ci0KLTx1bD4KLQotPGxpPjxwPjxiPlR5cGVtYXBzLjwvYj4gIFR5cGVtYXBzIGFyZSBydWxlcyB0aGF0IGRlZmluZSB0aGUgcHJvY2VzcyBieSB3aGljaAotICAgICAgZGF0YSBpcyBjb252ZXJ0ZWQgYmV0d2VlbiBsYW5ndWFnZXMuICAgVGhleSBhcmUgZnVsbHkgaW50ZWdyYXRlZAotICAgICAgd2l0aCB0aGUgQysrIHR5cGUgc3lzdGVtIGFuZCB0aGV5IGFyZSBhcHBsaWVkIHVzaW5nIGEgdHlwZS1iYXNlZAotICAgICAgcGF0dGVybiBtYXRjaGluZyBtZWNoYW5pc20uICBBbGwgZGF0YSBjb252ZXJzaW9uIFNXSUcgaXMKLSAgICAgIGRlZmluZWQgYnkgdHlwZW1hcHMgYW5kIGlzIGZ1bGx5IHJlY29uZmlndXJhYmxlLgotCi08bGk+PHA+PGI+RGVjbGFyYXRpb24gYW5ub3RhdGlvbi48L2I+IFRoZXJlIGFyZSBzcGVjaWFsIGRpcmVjdGl2ZXMgdGhhdCBtb2RpZnkKLSAgICAgIHRoZSB3cmFwcGluZyBiZWhhdmlvciBvZiBpbmRpdmlkdWFsIGRlY2xhcmF0aW9ucy4gRGVjbGFyYXRpb25zCi0gICAgICBjYW4gYmUgc2VsZWN0aXZlbHkgaWRlbnRpZmllZCBhbmQgZGVjb3JhdGVkIHdpdGggYXJiaXRyYXJ5Ci0gICAgICBhdHRyaWJ1dGVzIHRoYXQgYWZmZWN0IHdyYXBwZXIgZ2VuZXJhdGlvbi4gIExpa2UgdHlwZW1hcHMsIAotICAgICAgZGVjbGFyYXRpb24gbWF0Y2hpbmcgaXMgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIHRoZSBDKysgdHlwZSBzeXN0ZW0uIAotICAgICAgQWxtb3N0IGFsbCBTV0lHIGN1c3RvbWl6YXRpb24gZGlyZWN0aXZlcyBhcmUgYSBmb3JtIG9mIGRlY2xhcmF0aW9uIAotICAgICAgYW5ub3RhdGlvbi4gICAKLQotPGxpPjxwPjxiPkNsYXNzIGV4dGVuc2lvbi48L2I+ICBUaGUgYWJpbGl0eSB0byBleHRlbmQgY2xhc3NlcyBhbmQgc3RydWN0dXJlcwotICAgICAgd2l0aCBuZXcgbWV0aG9kcy9hdHRyaWJ1dGVzIHdoZW4gYnVpbGRpbmcgd3JhcHBlcnMuICBDbGFzc2VzCi0gICAgICBhcmUgcGFydCBvZiB0aGUgdHlwZSBzeXN0ZW0gc28gY2xhc3MgZXh0ZW5zaW9uIGlzIG5hdHVyYWxseSAKLSAgICAgIGludGVncmF0ZWQgd2l0aCB0aGUgQysrIHR5cGUgc3lzdGVtIGFzIHdlbGwgKGJpZyBzdXJwcmlzZSkuCi0KLTwvdWw+Ci08cD4KLUFuZCB0aGF0J3MgaXQtLXRoaXMgaXMgdGhlIGVuZC1nYW1lIG9mIFNXSUctMS4zLnggZGV2ZWxvcG1lbnQuICBXaGVuCi1zdGFiaWxpemVkIGFuZCBkb2N1bWVudGVkIGl0IHdpbGwgYmVjb21lIFNXSUctMi4wLgotCi08aDM+VGhlIEJpZ2dlciBQaWN0dXJlPC9oMz4KLQotSSByZWFsbHkgd2FudCB0byBlbXBoYXNpemUgdGhhdCBhbGwgb2YgdGhpcyB3b3JrIGlzIHBhcnQgb2YgYSBtdWNoCi1iaWdnZXIgcGljdHVyZS4gIFNXSUcgaXMgdXNlZCBieSBhIHN1cnByaXNpbmcgbnVtYmVyIG9mIHBlb3BsZSBpbgotaW5kdXN0cnksIGdvdmVybm1lbnQsIGFuZCBhY2FkZW1pYS4gIEl0J3MgdXNlZCB0byBidWlsZCBzeXN0ZW1zIHVzZWQKLWJ5IG1pbGxpb25zIG9mIHBlb3BsZSBldmVyeSBkYXkuICBJdCBoYXMgZXZlbiBzaG93biB1cCBpbiB2aWRlbyBnYW1lcwotYW5kIG90aGVyIHVubGlrZWx5IHNldHRpbmdzLiAgQWx0aG91Z2ggU1dJRyBkb2Vzbid0IGhhdmUgdGhlIHNhbWUKLXZpc2liaWxpdHkgYXMgbWFueSBsYXJnZSBzb2Z0d2FyZSBwcm9qZWN0cywgb3ZlciAxMjAwMCBwZW9wbGUgaGF2ZQotZG93bmxvYWRlZCBTV0lHLTEuMy4xMSBpbiB0aGUgbGFzdCA0IG1vbnRocy4gIENsZWFybHkgc29tZW9uZSBpcyB1c2luZwotaXQgZm9yIHNvbWV0aGluZyEgIEJlY2F1c2Ugb2YgdGhpcywgSSB0aGluayBpdCBpcyBpbXBvcnRhbnQgZm9yIHVzIHRvCi13b3JrIG9uIG1vdmluZyBTV0lHIHRvd2FyZHMgYSBtb3JlIHNvbGlkIGZvdW5kYXRpb24uICBEb2luZyBzbyB3aWxsCi1naXZlIHRoZSBzeXN0ZW0gbW9yZSBjcmVkaWJpbGl0eSBhbmQgbG9uZyB0ZXJtIHZpYWJpbGl0eS0tLWFuZCBpdCB3aWxsCi1iZSBhIGxvdCBtb3JlIGZ1biB0byB1c2UhCi0KLTxwPgotSXQncyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IHRoZXJlIGFyZSBzb21lIHJhdGhlciBpbnRlcmVzdGluZyBDUwotY29ubmVjdGlvbnMgYXQgd29yayBoZXJlLiAgRXh0ZW5zaW9ucyB0byB0aGUgdHlwZSBzeXN0ZW0gYW5kIHR5cGVtYXBzCi1oYXZlIHNvbWUgaW50ZXJlc3RpbmcgcmVsYXRpb25zIHRvIHdvcmsgaW4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiAgVGhlCi1TV0lHIGRlY2xhcmF0aW9uIGFubm90YXRpb24gc3lzdGVtIGFuZCBjbGFzcyBleHRlbnNpb24gZmVhdHVyZSBzZWVtCi1vZGRseSBzaW1pbGFyIHRvIHdvcmsgaW4gdGhlIGVtZXJnaW5nIGFyZWEgb2YgQXNwZWN0IE9yaWVudGVkCi1Qcm9ncmFtbWluZyAoQU9QKS4gIFRoZXJlIGFyZSB1bmRvdWJ0ZWRseSBjb25uZWN0aW9ucyB0byBvdGhlciBhcmVhcwotb2Ygc29mdHdhcmUgZW5naW5lZXJpbmcgYW5kIGFyY2hpdGVjdHVyZS4KLQotPHA+Ci1UaGUga2V5IHBvaW50IGlzIHRoYXQgU1dJRyBpc24ndCBnb2luZyB0byBjb25uZWN0IHRvIGFueXRoaW5nIGlmCi1uby1vbmUgY2FuIHF1aXRlIGRlc2NyaWJlIHdoYXQgaXQgaXMgb3IgaG93IGl0IHdvcmtzLgotCi08aDM+U1dJRy0yLjAgYW5kIHRoZSBGdXR1cmU8L2gzPgotCi1TV0lHLTEuMy4xMiBzdGlsbCByZXByZXNlbnRzIHdvcmsgaW4gcHJvZ3Jlc3MuIFRoZXJlIGFyZSBidWdzLCB0aGUKLWRvY3VtZW50YXRpb24gaXMgc3RpbGwgaW5jb21wbGV0ZSwgYW5kIHRoZXJlIGFyZSBwYXJ0cyBvZiB0aGUKLWltcGxlbWVudGF0aW9uIHRoYXQgYXJlIHJhdGhlciB1Z2x5LiAgV2UgYXJlIGFsc28gc3RpbGwgd29ya2luZyBvdXQgYQotZmV3IHZlcnkgaGFyZCBwcm9ibGVtcyBsaWtlIG5lc3RlZCBjbGFzc2VzLCBjYWxsYmFjayBmdW5jdGlvbnMsIGFuZAotb3ZlcmxvYWRpbmcuICBBIGZldyBvbGQgZmVhdHVyZXMgYXJlIHN0aWxsIG1pc3NpbmcgKE9iamVjdGl2ZS1DLAotZG9jdW1lbnRhdGlvbikuICBIb3dldmVyLCBJIGJlbGlldmUgdGhlIGVuZCBvZiB0aGUgMS4zLnggc2VyaWVzIGlzCi1uZWFyIGFuZCBhY2hpZXZhYmxlLgotCi08cD4KLU92ZXIgdGhlIHN1bW1lciwgYSBmZXcgbW9yZSAxLjMueCByZWxlYXNlcyBtYXkgYXBwZWFyIGJ1dCB0aGUgY3VycmVudAotcGxhbiBpcyB0byBhaW0gZm9yIGEgU1dJRy0yLjAgcmVsZWFzZSBpbiBTZXB0ZW1iZXIuICBUaGlzIHJlbGVhc2UgaXMKLXJlYWxseSBtb3ZpbmcgdG93YXJkcyB0aGUgZGVzaWduIHByaW5jaXBsZXMgZGVzY3JpYmVkIGFib3ZlIGFuZCB3aWxsCi1iZSBhIHZlcnkgbWFqb3IgZW5oYW5jZW1lbnQgb3ZlciBTV0lHLTEuMS4KLQotPHA+Ci1BcyBmb3IgdGhlIGZ1dHVyZSwgYSBudW1iZXIgb2YgaW50ZXJlc3RpbmcgaWRlYXMgYXJlIG9uIHRoZSB0YWJsZS4gIEkKLXdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGNvbnRyYWN0cy9hc3NlcnRpb25zIGluIG9yZGVyIHRvIHNvbHZlIHNvbWUKLXJlbGlhYmlsaXR5IGlzc3VlcyB0aGF0IGFyaXNlIHdoZW4gcmV0cm9maXR0aW5nIGxlZ2FjeSBjb2RlcyB3aXRoIGEKLXNjcmlwdGluZyBpbnRlcmZhY2UuICBTdXBwb3J0IGZvciBhbiBleHRlbnNpb24gbGFuZ3VhZ2UgaGFzIGJlZW4KLXByb21vdGVkIGJ5IERhdmlkIEZsZXRjaGVyIGFuZCB3YXMgc3VnZ2VzdGVkIGJ5IHNvbWVvbmUgZWxzZSBvbiB0aGUKLW1haWxpbmcgbGlzdCByYXRoZXIgcmVjZW50bHkuICBJIGhhdmUgYSBncmFkdWF0ZSBzdHVkZW50IHdvcmtpbmcgb24KLVNXSUcgc3VwcG9ydCBmb3IgdGhlIE1pY3Jvc29mdCBDTFIgYW5kIC5ORVQgbGFuZ3VhZ2VzLiAgT3RoZXIgd29yawotbWlnaHQgaW5jbHVkZSBzdXBwb3J0IGZvciBhbHRlcm5hdGl2ZSBwYXJzZXJzLCBkeW5hbWljYWxseSBsb2FkYWJsZQotbGFuZ3VhZ2UgbW9kdWxlcywgYW5kIHNvIGZvcnRoLiAgSG93ZXZlciwgbm9uZSBvZiB0aGlzIGlzIHJlYWxseSBnb2luZwotdG8gbWF0ZXJpYWxpemUgaWYgd2UgY2FuJ3QgZ2V0IHRoZSAyLjAgcmVsZWFzZSBzdGFibGl6ZWQuICBJbiBmYWN0LCBJCi1zZWUgU1dJRy0yLjAgYXMgYSBuZWNlc3Nhcnkgc3RlcCBmb3IgbW92aW5nIGZvcndhcmQgd2l0aCB0aGVzZSBpZGVhcy4KLQotPGgzPldlIG5lZWQgeW91ciBoZWxwISBZZXMsIHlvdS48L2gzPgotCi1Ob2JvZHkgZ2V0cyBwYWlkIHRvIHdvcmsgb24gU1dJRy4gIFRoZSBkZXZlbG9wZXJzIGFyZSB2b2x1bnRlZXJzIHdobwotd29yayBpbiB0aGVpciBzcGFyZSB0aW1lLiAgRnVydGhlcm1vcmUsIFNXSUcgaXMgbm90IHN1cHBvcnRlZCBieQotaW52ZXN0b3JzLCBhIGxhcmdlIGNvcnBvcmF0aW9uLCBvciByZXNlYXJjaCBncmFudHMuICBJIHdvcmsgb24gaXQKLWJlY2F1c2UgaXQncyBmdW4sIGNoYWxsZW5naW5nLCBhbmQgdXNlZnVsLiAgSSBwcmVzdW1lIHRoYXQgb3RoZXIKLWRldmVsb3BlcnMgZG8gdGhlIHNhbWUuICBIb3dldmVyLCB3ZSBvbmx5IGhhdmUgbGltaXRlZCByZXNvdXJjZXMgYW5kCi13ZSBuZWVkIHlvdXIgaGVscC4KLQotPHVsPgotPGxpPjxwPgotSWYgeW91IGxpa2UgU1dJRyBhbmQgZmluZCBpdCB1c2VmdWwsIHdlIG5lZWQgeW91IHRvIHRyeSBuZXcgdmVyc2lvbnMuCi0gICBXZSB3YW50IHlvdSB0byB0b3J0dXJlIHRlc3QgdGhlIHJlbGVhc2VzIGFuZCB0byBicmVhayB0aGVtLiAgV2UgbmVlZAotICAgYnVnIHJlcG9ydHMuIE5vIGJ1ZyBpcyB0b28gb2JzY3VyZSBvciB1bmltcG9ydGFudC0tLXdlICp3aWxsKiBmaXggaXQKLSAgIGlmIHdlIGNhbi4gIFdlIGFsc28gbmVlZCBmZWVkYmFjayBhYm91dCB0aGluZ3MgdGhhdCBhcmUgYW5ub3lpbmcgb3IKLSAgIGNvbXBhdGliaWxpdHkgZmVhdHVyZXMgdGhhdCBtaWdodCBoZWxwIGluIGdvaW5nIGZyb20gMS4xIHRvIDIuMC4KLQotPGxpPjxwPiBXZSBuZWVkIGhlbHAgd2l0aCBkb2N1bWVudGF0aW9uLCBleGFtcGxlcywgdGVzdGluZywgbGlicmFyaWVzLCBhbmQgYWxsCi0gICBzb3J0cyBvZiBvdGhlciBhc3BlY3RzIG9mIHRoZSByZWxlYXNlLiAgRXZlbiBpZiB5b3UgaGF2ZSBuZXZlcgotICAgd3JpdHRlbiBhIFNXSUcgbGFuZ3VhZ2UgbW9kdWxlIG9yIGRpdmVkIGludG8gaXRzIGltcGxlbWVudGF0aW9uLAotICAgdGhlcmUgYXJlIG1hbnkgd2F5cyB0aGF0IHlvdSBjYW4gaGVscC4gIENvbnNpZGVyIHdyaXRpbmcgYSBjYXNlIHN0dWR5Ci0gICBhYm91dCBob3cgeW91IHdyYXBwZWQgYSBiaWcgbGlicmFyeS4gIENvbnRyaWJ1dGUgdGVzdHMgdGhhdCBicmVhayB0aGUKLSAgIGltcGxlbWVudGF0aW9uIGluIGhvcnJpYmxlIHdheXMuICBIZWxwIHdpdGggdGhlIHdlYiBwYWdlIG9yIEZBUS4KLQotPGxpPjxwPiBNb3N0IG9mIHRoZSBTV0lHLTEuMy54IHdvcmsgaGFzIGZvY3VzZWQgb24gdGhlIFNXSUcgY29yZS4gIEhvd2V2ZXIsIGFzCi0gICB0aGUgMi4wIHJlbGVhc2UgbmVhcnMsIHdlIHdpbGwgYmUgd29ya2luZyBvbiBhIHZhcmlldHkgb2YgZW5oYW5jZW1lbnRzCi0gICB0byB0aGUgbGFuZ3VhZ2UgbW9kdWxlcy4gIElmIHRoZXJlIGFyZSB0aGluZ3MgeW91IHdvdWxkIGxpa2UgdG8gc2VlCi0gICBpbiBhbnkgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMsIHlvdSBuZWVkIHRvIGxldCB1cyBrbm93LgotCi08bGk+PHA+IFRoZXJlIGFyZSBTV0lHIGxhbmd1YWdlIG1vZHVsZXMgdGhhdCBoYXZlIG5vdCBtYWRlIGl0IGludG8gdGhlCi0gICBkaXN0cmlidXRpb24uICBFeGFtcGxlcyB0aGF0IEkga25vdyBhYm91dCBpbmNsdWRlIElUQ0wsIFN3aWctRWlmZmVsLAotICAgYW5kIFN3aWctTHVhLiAgV2Ugd291bGQgZ2xhZGx5IG1ha2UgdGhlc2UgcGFydCBvZiB0aGUgc3RhbmRhcmQgU1dJRwotICAgZGlzdHJpYnV0aW9uLiAgSG93ZXZlciwgd2UgYWxzbyBuZWVkIGhlbHAgdG8gZG8gaXQuICBQb3J0aW5nIGZyb20KLSAgIFNXSUctMS4xIGlzIG5vIGVhc3kgdGFzaywgYnV0IHdlJ3JlIG1vcmUgdGhhbiB3aWxsaW5nIHRvIGhlbHAuICBJdCdzCi0gICBub3QgYXMgYmFkIGFzIG9uZSBtaWdodCBpbWFnaW5lLgotCi08bGk+PHA+IFdlIGFyZSBhbHdheXMgbG9va2luZyBmb3IgZGV2ZWxvcGVycy4gIFN1YnNjcmliZSB0bwotICAgdG8gdGhlIDxhIGhyZWY9Im1haWwuaHRtbCI+c3dpZy1kZXY8L2E+IG1haWxpbmcgbGlzdAotICAgb3Igc2VuZCBtZSBlbWFpbCB0byBnZXQgaW52b2x2ZWQuCi08L3VsPgotCi08aDM+QWNrbm93bGVkZ2VtZW50czwvaDM+Ci0KLUknZCBqdXN0IGxpa2UgdG8gdGhhbmsgZXZlcnlvbmUgd2hvIGhhcyBzdWJtaXR0ZWQgZmVlZGJhY2ssIGJ1Z3MsIG1hZGUKLWNvbnRyaWJ1dGlvbnMsIGFuZCBwdXQgdXAgd2l0aCBteSBvY2Nhc2lvbmFsIHRocmFzaGluZyBvdmVyIHRoZSB5ZWFycy4gCi1JIHdlbGNvbWUgYW55IGNvbW1lbnRzIGFib3V0IHRoaXMgZG9jdW1lbnQgYW5kIGhvdyB3ZSBjYW4gbWFrZSBTV0lHIGV2ZW4KLWJldHRlci4KLQotPHA+Ci1EYXZlIEJlYXpsZXkgKGJlYXpsZXlAY3MudWNoaWNhZ28uZWR1KSA8YnI+Ci1KdW5lIDIsIDIwMDIKLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9ndWlsdHkuaHQgYi9zd2lnd2ViL2d1aWx0eS5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3ZjI3MC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2d1aWx0eS5odAorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi1HdWlsdHkgUGFydGllcwotCi08cD48aW1nIHNyYz0iaW1hZ2VzL2d1aWx0eS5wbmciIGFsdD0iR3VpbHR5IFBhcnRpZXMiPgotCi08cD4KLTxiPkFjdGl2ZSBEZXZlbG9wZXJzPC9iPgotCi08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz04IHdpZHRoPSIxMDAlIiBib3JkZXI9MCBzdW1tYXJ5PSJEZXZlbG9wZXIgbXVnc2hvdHMiPgotPHRyPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9EYXZlMy5qcGciIGFsdD0iRGF2ZSBCZWF6bGV5Ij48YnI+Ci08Yj5EYXZlIEJlYXpsZXkgKENoaWNhZ28sIElsbGlub2lzKS48L2I+PGJyPgotU1dJRyBjb3JlLCB0eXBlIHN5c3RlbSwgUHl0aG9uLCBUY2wsIFBlcmwuCi08L3RkPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9sdWlnaS5qcGciIGFsdD0iTHVpZ2kgQmFsbGFiaW8iPjxicj4KLTxiPkx1aWdpIEJhbGxhYmlvIChNaWxhbm8sIEl0YWx5KS48L2I+PGJyPgotU1RMIGxpYnJhcmllcyAoUHl0aG9uLCBSdWJ5LCAgTXpTY2hlbWUsIEd1aWxlKS4KLTwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQ+Ci08aW1nIHNyYz0iaW1hZ2VzL2Z1bHRvbjMuanBnIiBhbHQ9IldpbGxpYW0gRnVsdG9uIj48YnI+Ci08Yj5XaWxsaWFtIEZ1bHRvbiAoQmF0aCwgVUspLjwvYj4gPGJyPgotSmF2YSBhbmQgQyMgbW9kdWxlcy4gQ3lnd2luL1dpbmRvd3MuCi08L3RkPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9seWxlLmpwZyIgYWx0PSJMeWxlIEpvaG5zb24iPjxicj4KLTxiPkx5bGUgSm9obnNvbiAoTWFkaXNvbiwgQWxhYmFtYSkuPC9iPjxicj4KLVJ1YnkgbW9kdWxlLgotPC90ZD4KLTwvdHI+Ci0KLTx0cj4KLTx0ZD4KLTxpbWcgc3JjPSJpbWFnZXMvbWtvZXBwZS5qcGciIGFsdD0iTWF0dGhpYXMgS/ZwcGUiPjxicj4KLTxiPk1hdHRoaWFzIEv2cHBlIChNYWdkZWJ1cmcsIEdlcm1hbnkpLjwvYj4gPGJyPgotR3VpbGUgbW9kdWxlLgotPC90ZD4KLTx0ZD4KLTxpbWcgc3JjPSJpbWFnZXMvbGVuei5qcGciIGFsdD0iSm9obiBMZW56IChNYWRpc29uLCBXaXNjb25zaW4pIj48YnI+Ci08Yj5Kb2huIExlbno8L2I+ICA8YnI+Ci1DaGlja2VuLCBHdWlsZSwgYW5kIE16U2NoZW1lIG1vZHVsZXMsIHJ1bnRpbWUgdHlwZSBzeXN0ZW0uCi08L3RkPgotPC90cj4KLQotPHRyPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9tYXJjZWxvLmpwZyIgYWx0PSJNYXJjZWxvIE1hdHVzIj48YnI+Ci08Yj5NYXJjZWxvIE1hdHVzIChBQ01TLCBUdXNjb24sIEFaKS48L2I+IDxicj4KLUV2aWwgQysrIHRlc3RpbmcsIFNXSUcgY29yZSwgdGVtcGxhdGUgc3VwcG9ydCwgU1RMLAotUHl0aG9uLCBhbmQgUnVieSBhbmQgVGNsIHdoZW4gbmVlZGVkCi08L3RkPgotPHRkPgotPGltZyBzcmM9ImJsYW5rLmpwZyIgYWx0PSJCbGFuayI+PGJyPgotPGI+SmFzb24gU3Rld2FydCAoQWxidXF1ZXJxdWUsIE5ldyBNZXhpY28pLjwvYj4gPGJyPgotUGVybCBtb2R1bGUuCi08L3RkPgotPC90cj4KLQotPHRyPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy9hcnR5LmpwZyIgYWx0PSJBcnQgWWVya2VzIj48YnI+Ci08Yj5BcnQgWWVya2VzIChDaGljYWdvLCBJbGxpbm9pcykuPC9iPiA8YnI+Ci1PQ0FNTCBtb2R1bGUuCi08L3RkPgotPHRkPgotPGltZyBzcmM9ImltYWdlcy95b3NoaWtpLmpwZyIgYWx0PSJTaGlidWthd2EgWW9zaGlraSI+PGJyPgotPGI+U2hpYnVrYXdhIFlvc2hpa2kgKFRva3lvLCBKYXBhbikuPC9iPiA8YnI+Ci1KYXBhbmVzZSB0cmFuc2xhdGlvbi4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLQotPHA+Ci08Yj5TdHVkZW50czwvYj4KLTx1bD4KLTxsaT5Tb25neWFuIEZlbmcgKENoaWNhZ28pLgotPGxpPlhpbmdodWEgU2hpIChDaGljYWdvKS4gCi08bGk+SmluZyBDYW8gKENoaWNhZ28pLgotPGxpPkFxdWluYXMgSG9ib3IgKENoaWNhZ28pLgotPC91bD4KLQotPHA+Ci08Yj5NYWpvciBjb250cmlidXRvcnM8L2I+Ci0KLTx1bD4KLTxsaT5UaGllbi1UaGkgTmd1eWVuIAotPGxpPkxvaWMgRGFjaGFyeQotPGxpPk9sZWcgVG9sbWF0Y2V2Ci08bGk+TWFzYWtpIEZ1a3VzaGltYQotPGxpPkVkd2FyZCBaaW1tZXJtYW5uCi08bGk+RGF2aWQgQXNjaGVyCi08bGk+Sm9obiBCdWNrbWFuCi08bGk+S2V2aW4gQnV0bGVyCi08bGk+RG9taW5pcXVlIER1bW9udAotPGxpPlBpZXIgR2lvcmdpbyBFc3Bvc2l0bwotPGxpPkRhdmlkIEZsZXRjaGVyCi08bGk+R2FyeSBIb2x0Ci08bGk+SGFyY28gZGUgSGlsc3RlcgotPGxpPkR1c3RpbiBNaXRjaGVsbAotPGxpPklhbiBDb29rZQotPGxpPkhhc2FuIEJhcmFuIEtvdnVrCi08bGk+S2xhdXMgV2llZGVy5G5kZXJzCi08bGk+UmljaGFyZCBQYWxtZXIKLTxsaT5TYW0gTGlkZGljb3R0Ci08L3VsPgotCi08cD4KLTxiPkJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzPC9iPgotPGJsb2NrcXVvdGU+Ci1BZGFtIEh1cHAsCi1CcmFkIENsZW1lbnRzLAotQnJldHQgV2lsbGlhbXMsCi1CdWNrIEhvZGdlcywKLUJ1cmtoYXJkIEtsb3NzLAotQ2hpYS1MaWFuZyBLYW8sCi1DcmFpZyBGaWxlcywgCi1EZW5uaXMgTWFyc2EsCi1EaWV0ZXIgQmFyb24sCi1EcmFrZSBEaWVkcmljaCwKLUZsZXVyIERpYW5hIERyYWdhbiwKLUdhcnkgUGVubmluZ3RvbiwKLUdlb2ZmcmV5IEhvcnQsCi1HZXJhbGQgV2lsbGlhbXMsCi1HcmVnIEFuZGVyc29uLAotR3JlZyBLb2NoYW5za2ksCi1HcmVnIFRyb3hlbCwKLUhlbnJ5IFJvd2xleS4KLUlyaW5hIEtvdGxvdmEsCi1Jc3JhZWwgVGFsbGVyLAotSmFtZXMgQmFpbGV5LAotSmltIEZ1bHRvbiwKLUpvZWwgUmVlZCwKLUpvbiBUcmF2aXMsCi1KdW5pbyBIYW1hbm8sCi1LYXJsIEZvcm5lciwKLUtlaXRoIERhdmlkc29uLAotS3J6eXN6dG9mIEtvem1pbnNraSwKLUxhcnJ5IFZpcmRlbiwgCi1NYWdudXMgTGp1bmcsCi1NYXJjIFpvbnpvbiwKLU1hcmNpbyBMdWlzIFRlaXhlaXJhCi1NYXJrIEhvd3NvbiwKLU1pY2FoZWwgU2NoYXJmLAotTWljaGVsIFNhbm5lciwKLU1pa2UgUm9tYmVyZywKLU1pa2UgU2ltb25zLAotTWlrZSBXZWlibGVuLAotUGF1bCBCcmFubmFuLAotUmFtIEJoYW1pZGlwYXR5LAotUmVpbmhhcmQgRm9iYmUsCi1SaWNoIFdhbGVzLAotUmljaGFyZCBTYWx6LAotUm9iaW4gRHVubiwKLVJveSBMZWNhdGVzLAotUnVkeSBBbGJhY2h0ZW4sCi1TY290dCBEcnVtbW9uZHMKLVNjb3R0IE1pY2hlbCwgCi1TaGF1biBMb3dyeSwKLVN0ZXZlIEdhbHNlciwgCi1UYWwgU2hhbGlmLAotVGFybiBXZWlzbmVyIEJ1cnRvbiwKLVRvbnkgU2V3YXJkLAotVXdlIFN0ZWlubWFubiwKLVZhZGltIENodWd1bm92LAotV3lzcyBDbGVtZW5zLAotWmhvbmcgUmVuLiAKLTwvYmxvY2txdW90ZT4KLQotPHA+PGI+RnJpZW5kczwvYj4KLTx1bD4KLTxsaT5UaGUgRiBzdHJlZXQgY3JldwotPGxpPlBldGVyIExvbWRhaGwKLTxsaT5UaW0gR2VybWFubgotPGxpPkNocmlzIE15ZXJzCi08bGk+Sm9obiBTY2htaWR0Ci08bGk+UGF1bCBEdWJvaXMKLTxsaT5LdXJ0aXMgQmxlZWtlcgotPGxpPkxhcnJ5IFZpcmRlbgotPGxpPlBldGVyLVBpa2UgU2xvYW4KLTxsaT5QYXRyaWNrIFR1bGxtYW5uCi08L3VsPgotCi1BcG9sb2dpZXMgdG8gYW55b25lIG1pc3NlZC4uLi4KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaGlzdG9yeS5odCBiL3N3aWd3ZWIvaGlzdG9yeS5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4MTAzMC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2hpc3RvcnkuaHQKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1TV0lHIEhpc3RvcnkKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL2hpc3RvcnkucG5nIiBhbHQ9Ikhpc3RvcnkiPgotCi08cD4KLUp1c3QgdGhlIGZhY3RzOgotCi08dWw+Ci08bGk+SnVseSwgMTk5NS4gRGF2ZSBkZXZlbG9wcyBTV0lHIHdoaWxlIHdvcmtpbmcgaW4gdGhlIFRoZW9yZXRpY2FsCi1QaHlzaWNzIERpdmlzaW9uIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeS4gIE9yaWdpbmFsbHksIGl0Ci13YXMgY29uY2VpdmVkIGFzIGFuIGV4dGVuc2lvbiBidWlsZGluZyB0b29sIGZvciBhIGN1c3RvbWl6ZWQgc2NyaXB0aW5nCi1sYW5ndWFnZSB0aGF0IGhhZCBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBDb25uZWN0aW9uIE1hY2hpbmUgNS4KLQotPGxpPkphbnVhcnksIDE5OTYuIFNXSUcgcmV3cml0dGVuIGluIEMrKyBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIGFuZCBleHBhbmRlZCB0byBjb3ZlciBUY2wsIFBlcmwsIGFuZCBHdWlsZS4KLQotPGxpPkZlYnJ1YXJ5LCAxOTk2LiBGaXJzdCBhbHBoYSByZWxlYXNlLgotCi08bGk+U2VwdGVtYmVyLCAxOTk2LiBWZXJzaW9uIDEuMCByZWxlYXNlZC4gIFN1cHBvcnQgZm9yIFB5dGhvbiBhZGRlZC4KLQotPGxpPlNlcHRlbWJlciwgMTk5Ny4gVmVyc2lvbiAxLjEgcmVsZWFzZWQgd2l0aCBhIHZhcmlldHkgb2YgaW1wcm92ZW1lbnRzIHN1Y2ggYXMgc2hhZG93IGNsYXNzZXMuCi0KLTxsaT5GZWJydWFyeSwgMTk5OC4gU1dJRzEuMXA1IHJlbGVhc2VkLgotCi08bGk+MTk5Ny0xOTk5LiAgVmFyaW91cyB1bnN1Y2Nlc3NmdWwgYXR0ZW1wdHMgdG8gY3JlYXRlIFNXSUcyLjAuCi1Bc2lkZSBmcm9tIHZhcmlvdXMgc2Vjb25kIHN5c3RlbSBlZmZlY3RzLCB0aGVyZSB3ZXJlIG90aGVyCi1kaXN0cmFjdGlvbnMgc3VjaCBhcyBhIGRpc3NlcnRhdGlvbiBhbmQgc2VhcmNoaW5nIGZvciBhIGpvYi4gIEFsbAotb2YgdGhpcyB3b3JrIHdhcyBhYmFuZG9uZWQgYWx0aG91Z2ggcGFydHMgb2YgaXQgYXJlIGZvdW5kIGluCi1uZXdlciBTV0lHIHJlbGVhc2VzLgotCi08bGk+SnVseSwgMTk5OC4gU1dJRyBkZXZlbG9wbWVudCBtb3ZlcyB0byB0aGUgVW5pdmVyc2l0eSBvZiBDaGljYWdvLgotCi08bGk+SmFudWFyeSAxLCAyMDAwLiAgRGF2ZSBzdXJ2aXZlcyBoaXMgbW9zdCBwbGVhc2FudCBZMksgZmxpZ2h0IHRvIENoaWNhZ28gTydIYXJlLgotCi08bGk+RmVicnVhcnkgMTEsIDIwMDAuIFNXSUcxLjMgYWxwaGEgcmVsZWFzZWQuICAgVGhpcyBpcyB0aGUgZmlyc3QgaW4KLWEgc2VyaWVzIG9mIHJlbGVhc2VzIHRoYXQgc2xvd2x5IG1pZ3JhdGUgbW9zdCBvZiBTV0lHJ3MgaW1wbGVtZW50YXRpb24KLWJhY2sgdG8gQU5TSSBDLgotCi08bGk+TWFyY2ggMSwgMjAwMC4gU1dJRzEuM2EyIHJlbGVhc2VkLgotPGxpPkp1bmUgMTgsIDIwMDAuIFNXSUcxLjNhMyByZWxlYXNlZC4KLTxsaT5TZXB0ZW1iZXIgNCwgMjAwMC4gU1dJRzEuM2E0IHJlbGVhc2VkLgotPGxpPlNlcHRlbWJlciAyMiwgMjAwMC4gU1dJRzEuM2E1IHJlbGVhc2VkLgotPGxpPkp1bHkgOSwgMjAwMS4gU1dJRy0xLjMuNiByZWxlYXNlZC4KLTxsaT5TZXB0ZW1iZXIgMywgMjAwMS4gU1dJRy0xLjMuNyByZWxlYXNlZC4gIFN1cHBvcnQgZm9yIHRlbXBsYXRlcyBhbmQgYmV0dGVyCi1oYW5kbGluZyBvZiBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhZGRlZC4KLTxsaT5TZXB0ZW1iZXIgMjMsIDIwMDEuIFNXSUctMS4zLjggcmVsZWFzZWQuCi08bGk+U2VwdGVtYmVyIDI1LCAyMDAxLiBTV0lHLTEuMy45IHJlbGVhc2VkLgotPGxpPkRlY2VtYmVyIDEwLCAyMDAxLiBTV0lHLTEuMy4xMCByZWxlYXNlZC4KLTxsaT5KYW51YXJ5IDMxLCAyMDAyLiBTV0lHLTEuMy4xMSByZWxlYXNlZC4KLTxsaT5KdW5lIDIsIDIwMDIuIFNXSUctMS4zLjEyIHJlbGVhc2VkLgotPGxpPkp1bmUgMTcsIDIwMDIuIFNXSUctMS4zLjEzIHJlbGVhc2VkLgotPGxpPkF1Z3VzdCAxMiwgMjAwMi4gU1dJRy0xLjMuMTQgcmVsZWFzZWQuCi08bGk+U2VwdGVtYmVyIDksIDIwMDIuIFNXSUctMS4zLjE1IHJlbGVhc2VkLgotPGxpPk9jdG9iZXIgMTQsIDIwMDIuIFNXSUctMS4zLjE2IHJlbGVhc2VkLgotPGxpPk5vdmVtYmVyIDIyLCAyMDAyLiBTV0lHLTEuMy4xNyByZWxlYXNlZC4KLTxsaT5NYXJjaCAyMywgMjAwMy4gU1dJRy0xLjMuMTggcmVsZWFzZWQuCi08bGk+TWFyY2ggMjgsIDIwMDMuIFNXSUctMS4zLjE5IHJlbGVhc2VkLgotPGxpPkRlY2VtYmVyIDE3LCAyMDAzLiBTV0lHLTEuMy4yMCByZWxlYXNlZC4KLTxsaT5KYW51YXJ5IDE3LCAyMDA0LiBTV0lHLTEuMy4yMSByZWxlYXNlZC4KLTxsaT5TZXB0ZW1iZXIgNCwgMjAwNC4gU1dJRy0xLjMuMjIgcmVsZWFzZWQuCi08bGk+Tm92ZW1iZXIgMTEsIDIwMDQuIFNXSUctMS4zLjIzIHJlbGVhc2VkLgotPGxpPkRlY2VtYmVyIDE0LCAyMDA0LiBTV0lHLTEuMy4yNCByZWxlYXNlZC4KLTxsaT5KdW5lIDExLCAyMDA1LiBTV0lHLTEuMy4yNSByZWxlYXNlZC4KLTwvdWw+Ci0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvRGF2ZTIuanBnIGIvc3dpZ3dlYi9pbWFnZXMvRGF2ZTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODAwMzg2Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL0RhdmUyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL0RhdmUzLmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL0RhdmUzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0Y2E1NS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9EYXZlMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9hcnR5LmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL2FydHkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2YzNTU0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2FydHkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvYmxlZWQucG5nIGIvc3dpZ3dlYi9pbWFnZXMvYmxlZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjJhMDE1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2JsZWVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2J1Z3MucG5nIGIvc3dpZ3dlYi9pbWFnZXMvYnVncy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNmMwZmIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvYnVncy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9idXJuZ2lmcy5wbmcgYi9zd2lnd2ViL2ltYWdlcy9idXJuZ2lmcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZDYxNjcuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvYnVybmdpZnMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvY29kZXJ1bnMucG5nIGIvc3dpZ3dlYi9pbWFnZXMvY29kZXJ1bnMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGE0ZDg0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2NvZGVydW5zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2NvZGV3b3Jrcy5wbmcgYi9zd2lnd2ViL2ltYWdlcy9jb2Rld29ya3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjllOWFiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2NvZGV3b3Jrcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9jb21wYXQucG5nIGIvc3dpZ3dlYi9pbWFnZXMvY29tcGF0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzZDFmZC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9jb21wYXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvY29weXJpZ2h0LnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2NvcHlyaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NDNmMWMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvY29weXJpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2N1cmUucG5nIGIvc3dpZ3dlYi9pbWFnZXMvY3VyZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGYwYTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvY3VyZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9jdnMucG5nIGIvc3dpZ3dlYi9pbWFnZXMvY3ZzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyYjIxMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9jdnMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvZG9jLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2RvYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMjczMTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvZG9jLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2Rvd25sb2FkLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2Rvd25sb2FkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3MmI0Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9kb3dubG9hZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9leGVjLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2V4ZWMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmUxNmRiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2V4ZWMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvZmFxLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL2ZhcS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTJiMWYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvZmFxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2Z1bHRvbjMuanBnIGIvc3dpZ3dlYi9pbWFnZXMvZnVsdG9uMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTA3MzguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvZnVsdG9uMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9ndWlsdHkucG5nIGIvc3dpZ3dlYi9pbWFnZXMvZ3VpbHR5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhMWU1Yi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9ndWlsdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvaGlzdG9yeS5wbmcgYi9zd2lnd2ViL2ltYWdlcy9oaXN0b3J5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5ZjYxMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9oaXN0b3J5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2lzbC5wbmcgYi9zd2lnd2ViL2ltYWdlcy9pc2wucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZiODI1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2lzbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9sZW56LmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL2xlbnouanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjExOTViLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2xlbnouanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvbGlua3MucG5nIGIvc3dpZ3dlYi9pbWFnZXMvbGlua3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjViYzY5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2xpbmtzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL2x1aWdpLmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL2x1aWdpLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5ZDM0My4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9sdWlnaS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9seWxlLmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL2x5bGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2Q0YmU5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL2x5bGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvbWFpbC5wbmcgYi9zd2lnd2ViL2ltYWdlcy9tYWlsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliN2I5OS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9tYWlsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL21hcmNlbG8uanBnIGIvc3dpZ3dlYi9pbWFnZXMvbWFyY2Vsby5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNWMzNmIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvbWFyY2Vsby5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9ta29lcHBlLmpwZyBiL3N3aWd3ZWIvaW1hZ2VzL21rb2VwcGUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTYyNDMyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL21rb2VwcGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvcHJvamVjdHMucG5nIGIvc3dpZ3dlYi9pbWFnZXMvcHJvamVjdHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmFhN2E5Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3Byb2plY3RzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3Byb3BhZ2FuZGEucG5nIGIvc3dpZ3dlYi9pbWFnZXMvcHJvcGFnYW5kYS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MzEyOWQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvcHJvcGFnYW5kYS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9yYW50cy5wbmcgYi9zd2lnd2ViL2ltYWdlcy9yYW50cy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZWJjYzQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvcmFudHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvcmF2ZXMucG5nIGIvc3dpZ3dlYi9pbWFnZXMvcmF2ZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmE2NDYxLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3JhdmVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3NhbS5qcGcgYi9zd2lnd2ViL2ltYWdlcy9zYW0uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQ0NTY3Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3NhbS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zY3JlZW4ucG5nIGIvc3dpZ3dlYi9pbWFnZXMvc2NyZWVuLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZjN2E3Mi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zY3JlZW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc2NyZWVuc2hvdC5wbmcgYi9zd2lnd2ViL2ltYWdlcy9zY3JlZW5zaG90LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlZTljNS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zY3JlZW5zaG90LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3NjcmVlbnNob3QyLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3NjcmVlbnNob3QyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhZjY3ZC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zY3JlZW5zaG90Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zdWJ2ZXJzaW9uLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N1YnZlcnNpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjI0MmNkLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3N1YnZlcnNpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzEwLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNmNiMmUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxMS5wbmcgYi9zd2lnd2ViL2ltYWdlcy9zd2lnMTEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODk4ZDM2Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zd2lnMTIucG5nIGIvc3dpZ3dlYi9pbWFnZXMvc3dpZzEyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5N2I3NC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zd2lnMTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzEzLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDkwOTguLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzEzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxNS5wbmcgYi9zd2lnd2ViL2ltYWdlcy9zd2lnMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZhNDI1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zd2lnMTYucG5nIGIvc3dpZ3dlYi9pbWFnZXMvc3dpZzE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmM2FkYy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zd2lnMTYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzE3LnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWcxNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMzg1YmYuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzE3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWc3LnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWc3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhOTdiYi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2ltYWdlcy9zd2lnNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy9zd2lnOC5wbmcgYi9zd2lnd2ViL2ltYWdlcy9zd2lnOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTUwMjEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZzgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMvc3dpZ2ZpbGVzLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3N3aWdmaWxlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmFhNWUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZ2ZpbGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3N3aWdvcmcucG5nIGIvc3dpZ3dlYi9pbWFnZXMvc3dpZ29yZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Yjc5MzMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvc3dpZ29yZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2ltYWdlcy90dXRvcmlhbC5wbmcgYi9zd2lnd2ViL2ltYWdlcy90dXRvcmlhbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzkxNTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMvdHV0b3JpYWwucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9pbWFnZXMveTJrLnBuZyBiL3N3aWd3ZWIvaW1hZ2VzL3kyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzE1MjIuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMveTJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvaW1hZ2VzL3lvc2hpa2kuanBnIGIvc3dpZ3dlYi9pbWFnZXMveW9zaGlraS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTU4YTUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9pbWFnZXMveW9zaGlraS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL2luZGV4Lmh0IGIvc3dpZ3dlYi9pbmRleC5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExNGJmMC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2luZGV4Lmh0CisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLVNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvcgotCi08aDI+V2VsY29tZSB0byBTV0lHPC9oMj4KLQotWyA8YSBocmVmPSJodHRwOi8vc3dpZy1qcC5keW5kbnMub3JnIj5KYXBhbmVzZTwvYT4gXQotCi08cD4KLVNXSUcgaXMgYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCB0b29sIHRoYXQgY29ubmVjdHMgcHJvZ3JhbXMgd3JpdHRlbiBpbgotQyBhbmQgQysrIHdpdGggYSB2YXJpZXR5IG9mIGhpZ2gtbGV2ZWwgcHJvZ3JhbW1pbmcKLWxhbmd1YWdlcy4gIFNXSUcgaXMgdXNlZCB3aXRoIGRpZmZlcmVudCB0eXBlcyBvZiBsYW5ndWFnZXMgaW5jbHVkaW5nIGNvbW1vbiBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1Y2ggYXMKLVBlcmwsIFBIUCwgUHl0aG9uLCBUY2wsIFJ1YnkgYW5kIFBIUC4gVGhlIGxpc3Qgb2YgCi08YSBocmVmPSJjb21wYXQuaHRtbCNTdXBwb3J0ZWRMYW5ndWFnZXMiPnN1cHBvcnRlZCBsYW5ndWFnZXM8L2E+IGFsc28gaW5jbHVkZXMgCi1ub24tc2NyaXB0aW5nIGxhbmd1YWdlcyBzdWNoIGFzIEMjLCBDb21tb24gTGlzcCAoQ0xJU1AsIEFsbGVncm8gQ0wsIFVGRkkpLCBKYXZhLCBNb2R1bGEtMyBhbmQgT0NBTUwuIEFsc28gc2V2ZXJhbAotaW50ZXJwcmV0ZWQgYW5kIGNvbXBpbGVkIFNjaGVtZSBpbXBsZW1lbnRhdGlvbnMgKEd1aWxlLCBNelNjaGVtZSwgQ2hpY2tlbikKLWFyZSBzdXBwb3J0ZWQuIFNXSUcgaXMgbW9zdAotY29tbW9ubHkgdXNlZCB0byBjcmVhdGUgaGlnaC1sZXZlbCBpbnRlcnByZXRlZCBvciBjb21waWxlZCBwcm9ncmFtbWluZwotZW52aXJvbm1lbnRzLCB1c2VyIGludGVyZmFjZXMsIGFuZCBhcyBhIHRvb2wgZm9yIHRlc3RpbmcgYW5kIHByb3RvdHlwaW5nIEMvQysrCi1zb2Z0d2FyZS4gIFNXSUcgY2FuIGFsc28gZXhwb3J0IGl0cyBwYXJzZSB0cmVlIGluIHRoZSBmb3JtIG9mIFhNTCBhbmQKLUxpc3Agcy1leHByZXNzaW9ucy4gIFNXSUcgbWF5IGJlIGZyZWVseSB1c2VkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIGZvciBjb21tZXJjaWFsCi1hbmQgbm9uLWNvbW1lcmNpYWwgdXNlLgotCi08dWw+Ci08bGk+IDxhIGhyZWY9InN1cnZleS5odG1sIj5Eb3dubG9hZDwvYT4gdGhlIGxhdGVzdCB2ZXJzaW9uLgotPGxpPiA8YSBocmVmPSJkb2MuaHRtbCI+RG9jdW1lbnRhdGlvbiwgcGFwZXJzLCBhbmQgcHJlc2VudGF0aW9uczwvYT4KLTxsaT4gPGEgaHJlZj0iY29tcGFyZS5odG1sIj5GZWF0dXJlczwvYT4uCi08bGk+IDxhIGhyZWY9Im1haWwuaHRtbCI+TWFpbGluZyBMaXN0czwvYT4KLTxsaT4gPGEgaHJlZj0iYnVncy5odG1sIj5CdWcgdHJhY2tpbmc8L2E+Ci08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cuZGFiZWF6LmNvbS9jZ2ktYmluL3dpa2kucGwiPlN3aWdXaWtpITwvYT4KLTwvdWw+Ci0KLTxoMz5OZXdzPC9oMz4KLQotCi08cD4KLTxiPjIwMDUvMDYvMTE8L2I+Ci1TV0lHLTEuMy4yNSBoYXMgYmVlbiByZWxlYXNlZC4gIFRoaXMgbGFyZ2VseSBjb250YWlucyBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cyB0byB0aGUgQyMgbW9kdWxlIGFuZCB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4KLQotPHA+Ci08Yj4yMDA1LzAzLzI1PC9iPgotR3JlZyBTdGVpbiBnaXZlcyBhIDxhIGhyZWY9aHR0cDovL3d3dy5zYXVyaWEuY29tL350d2wvY29uZmVyZW5jZXMvcHljb24yMDA1LzIwMDUwMzI1L1B5dGhvbiUyMGF0JTIwR29vZ2xlLm5vdGVzPmtleW5vdGUgc3BlZWNoPC9hPiBhYm91dCBHb29nbGUncyB1c2Ugb2YgUHl0aG9uIGFuZCBTV0lHIGF0IHRoZSBQeUNvbiAyMDA1IGNvbmZlcmVuY2UuCi0KLTxwPgotPGI+MjAwNC8xMi8xNDwvYj4KLVNXSUctMS4zLjI0IGhhcyBiZWVuIHJlbGVhc2VkLiAgVGhpcyBpcyBtYWlubHkgYSBidWcgZml4IHJlbGVhc2UuCi0KLTxwPgotPGI+MjAwNC8xMS8xMTwvYj4KLVNXSUctMS4zLjIzIGhhcyBiZWVuIHJlbGVhc2VkLiAgVGhpcyByZWxlYXNlIGNvbnRhaW5zIGFkZGl0aW9uYWwgQysrIHN1cHBvcnQgaW4gdGhlIGFyZWFzIG9mIHRlbXBsYXRlcyBhbmQKLW5hbWVzcGFjZXMuIEphdmEgYW5kIEMjIGFyZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBsYW5ndWFnZXMgdGhhdCBjYW4gY3JlYXRlIHdyYXBwZXJzIHRha2luZyBhZHZhbnRhZ2Ugb2YKLUMrKyBkZWZhdWx0IGFyZ3VtZW50cy4gIE1hbnkgb3RoZXIgbWlub3IgYnVnIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgYXJlIGFsc28gaW5jbHVkZWQuCi0KLTxwPgotPGI+MjAwNC8wOS8wNDwvYj4KLVNXSUctMS4zLjIyIGhhcyBiZWVuIHJlbGVhc2VkLiAgVGhpcyByZWxlYXNlIGNvbnRpbnVlcyB0aGUgb25nb2luZyBpbXByb3ZlbWVudHMgYW5kIGJ1ZyBmaXhlcyBpbiBTV0lHLgotVGhlIG1ham9yIGFyZWFzIG9mIGltcHJvdmVtZW50IGFyZSBpbiBleGNlcHRpb24gaGFuZGxpbmcsIGVudW1zIGFuZCB0aGUgU1RMLiBOZXcgbGFuZ3VhZ2VzIHdpdGggdGhpcwotcmVsZWFzZSBhcmUgQWxsZWdybyBDTCBhbmQgTW9kdWxhLTMuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHJldmFtcGVkIGFuZCBpdCBpcyBub3cKLWF2YWlsYWJsZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6IHNpbmdsZSBodG1sIHBhZ2UsIG11bHRpcGxlIGh0bWwgcGFnZXMgYW5kIGEgcGRmCi1kb2N1bWVudC4KLQotPHA+Ci08Yj4yMDA0LzAxLzExPC9iPgotU1dJRy0xLjMuMjEgaGFzIGJlZW4gcmVsZWFzZWQuICBUaGlzIGlzIGEgbWlub3IgYnVnIGZpeCByZWxlYXNlLgotCi08cD4KLTxiPjIwMDMvMTIvMTc8L2I+Ci1TV0lHLTEuMy4yMCBoYXMgYmVlbiByZWxlYXNlZC4gIFRoaXMgcmVsZWFzZSBpbmNsdWRlcyBhIGxhcmdlIG51bWJlciBvZiBlbmhhbmNlbWVudHMgaW5jbHVkaW5nCi1pbXByb3ZlZCBDKysgc3VwcG9ydCwgZGlyZWN0b3JzLCBjb250cmFjdHMsIGFuZCBtb3JlLgotCi08cD4KLTxiPjIwMDMvMTIvMTc8L2I+Ci1BbiBhcnRpY2xlIGJ5IFBoaWwgVG9tc29uIGFib3V0IFNXSUcgYW5kIFJ1YnkgYXBwZWFycyBpbiB0aGUgSmFudWFyeSAyMDA0IGlzc3VlIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3VqLmNvbSI+Qy9DKysgVXNlcnMgSm91cm5hbC48L2E+Ci0KLTxwPgotPGI+MjAwMy8xMC8yNzwvYj4KLVRoZSBDb2RlIEdlbmVyYXRpb24gTmV0d29yayB1bmRlcnRha2VzIGFuCi08YSBocmVmPSJodHRwOi8vd3d3LmNvZGVnZW5lcmF0aW9uLm5ldC90aWtpLXJlYWRfYXJ0aWNsZS5waHA/YXJ0aWNsZUlkPTMzIj5pbnRlcnZpZXc8L2E+IHRhbGtpbmcgYWJvdXQgU1dJRy4KLQotPHA+Ci08Yj4yMDAzLzAzLzI4PC9iPgotU1dJRy0xLjMuMTkgaGFzIGJlZW4KLXJlbGVhc2VkLiAgVGhpcyByZWxlYXNlIGZpeGVzIGEgc21hbGwgbnVtYmVyIG9mIGNyaXRpY2FsIGJ1Z3MgaW4gMS4zLjE4LgotCi08cD4KLTxiPjIwMDMvMDMvMjM8L2I+Ci1TV0lHLTEuMy4xOCBoYXMgYmVlbgotcmVsZWFzZWQuICBUaGlzIHJlbGVhc2UgaW5jbHVkZXMgYSBudW1iZXIgb2YgbmV3IGxhbmd1YWdlIG1vZHVsZXMgKEMjIGFuZCBDaGlja2VuKSwgbmV3IGZlYXR1cmVzLCBhbiBpbXByb3ZlZAotYnVpbGQgZW52aXJvbm1lbnQsIGFuZCBhIGxvdCBvZiBtaW5vciBidWcgZml4ZXMuCi0KLTxwPgotPGI+MjAwMi8xMS8yNzwvYj4KLUFuIGFydGljbGUgYWJvdXQgU1dJRyBhcHBlYXJzIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cuY21hZ2F6aW5lLmpwL2NvbnRlbnRzLzIwMDIxMi5odG1sIj5DIE1hZ2F6aW5lPC9hPiAoSmFwYW5lc2UpLgotCi08cD4KLTxiPjIwMDIvMTEvMjc8L2I+Ci1CZXJuYXJkIERlc2dyYXVwZXMgaGFzIGNyZWF0ZWQgYSBNYWNpbnRvc2ggdmVyc2lvbiBvZiBTV0lHLTEuMy4xNy4gRG93bmxvYWQgPGEgaHJlZj0iaHR0cDovL3dlYnBlcnNvLmVhc3ljb25uZWN0LmZyL2JkZXNncmF1cGVzL0Rvd25sb2Fkcy9NYWNTd2lnX0NhcmJvbl8xLjMuMTcuaHF4Ij5oZXJlPC9hPi4KLQotPHA+Ci08Yj4yMDAyLzExLzIyPC9iPgotU1dJRy0xLjMuMTcgaGFzIGJlZW4KLXJlbGVhc2VkLiAgVGhpcyBpcyBtb3N0bHkgYSBidWctZml4IHJlbGVhc2UgZm9yIDEuMy4xNi4KLQotPHA+Ci08Yj4yMDAyLzEwLzE0PC9iPgotU1dJRy0xLjMuMTYgaGFzIGJlZW4KLXJlbGVhc2VkLiAgVGhpcyBpcyBtb3N0bHkgYSBidWctZml4IHJlbGVhc2UgZm9yIDEuMy4xNS4KLQotPHA+Ci08Yj4yMDAyLzEwLzAxPC9iPgotTWl0Y2hlbGwgQ2hhcml0eSBoYXMgY3JlYXRlZCA8YSBocmVmPSJodHRwOi8vd3d3LnZlbmRpYW4ub3JnL21uY2hhcml0eS9kaXIzL2lubGluZS9zd2lnLyI+SW5saW5lOjpTV0lHPC9hPiBmb3IgUGVybC4gIENoZWNrIGl0IG91dC4KLQotPHA+Ci08Yj4yMDAyLzA5LzEwPC9iPgotU1dJRy0xLjMuMTUgaGFzIGJlZW4KLXJlbGVhc2VkLiAgVGhpcyBpcyBtb3N0bHkgYSBidWctZml4IHJlbGVhc2UgZm9yIDEuMy4xNCB0aGF0IHJlc29sdmVzIGEgbnVtYmVyCi1vZiBpc3N1ZXMgd2l0aCB0ZW1wbGF0ZSBhbmQgbmFtZXNwYWNlIHN1cHBvcnQuICBJbXByb3ZlbWVudHMgdG8gZXhjZXB0aW9uIGhhbmRsaW5nIGFuZCBvdmVybG9hZGluZyBhcmUgYWxzbyBpbmNsdWRlZC4KLQotPHA+Ci08Yj4yMDAyLzA4LzEyPC9iPgotU1dJRy0xLjMuMTQgaGFzIGJlZW4KLXJlbGVhc2VkLiAgU1dJRyBkZXZlbG9wbWVudCBjb250aW51ZXMgdG8gYnJlYWsgbmV3IGdyb3VuZC0tdGhpcyByZWxlYXNlIGZlYXR1cmVzCi1mdWxsIHN1cHBvcnQgZm9yIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLCBDKysgc21hcnQgcG9pbnRlcnMsIGFuZCBtb3JlLiAgSXQgYWxzbwotaW5jbHVkZXMgbmV3IGxhbmd1YWdlIG1vZHVsZXMgZm9yIE9jYW1sIGFuZCBYTUwgYXMgd2VsbCBhcyBhIHZhcmlldHkgb2YgZW5oYW5jZW1lbnRzIHRvCi1leGlzdGluZyBtb2R1bGVzLgotCi0KLTxwPgotPGI+MjAwMi8wNy8xOTwvYj4KLVNoaWJ1a2F3YSBZb3NoaWtpIGlzIHdvcmtpbmcgb24gYSBKYXBhbmVzZSB0cmFuc2xhdGlvbiBvZiB0aGUgU1dJRyBkb2N1bWVudGF0aW9uLiAgQ2hlY2sgb3V0Ci08YSBocmVmPSJodHRwOi8vc3dpZy1qcC5keW5kbnMub3JnLyI+c3dpZy1qcC5keW5kbnMub3JnPC9hPi4KLQotPHA+Ci08Yj4yMDAyLzA2LzE3PC9iPgotU1dJRy0xLjMuMTMKLWhhcyBiZWVuIHJlbGVhc2VkLiAgVGhpcyBpcyBhIG1vcmUgc3RhYmxlIHZlcnNpb24gb2YgU1dJRy0xLjMuMTIuICBJZiB5b3UgZG93bmxvYWRlZAotU1dJRy0xLjMuMTIsIHlvdSBzaG91bGQgdXBncmFkZS4KLQotPHA+Ci08Yj4yMDAyLzA2LzAyPC9iPgotPGEgaHJlZj0iRG9jMS4zL2luZGV4Lmh0bWwiPlVwZGF0ZWQgZG9jdW1lbnRhdGlvbjwvYT4gZm9yIFNXSUctMS4zLjEyIGlzIG9ubGluZS4KLQotPHA+Ci08Yj4yMDAyLzA2LzAyPC9iPgotU1dJRy0xLjMuMTIKLWhhcyBiZWVuIHJlbGVhc2VkLiAgVGhpcyBpcyB0aGUgbW9zdCBjYXBhYmxlIFNXSUcgcmVsZWFzZSBldmVyISAgTmV3Ci1mZWF0dXJlcyBpbmNsdWRlIHN1cHBvcnQgZm9yIEMrKyBuYW1lc3BhY2VzLCBlbmhhbmNlZCBzdXBwb3J0IGZvciBDKysKLXRlbXBsYXRlcywgbmV3IGxpYnJhcnkgZmlsZXMsIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIGEgaHVnZSBudW1iZXIgb2YgbWlub3IgZW5oYW5jZW1lbnRzLgotU2VlIHRoZSA8YSBocmVmPSJzdXJ2ZXkuaHRtbCI+ZG93bmxvYWQ8L2E+IHBhZ2UgZm9yIHJlbGVhc2Ugbm90ZXMKLWFuZCB2ZXJzaW9ucyBmb3IgV2luZG93cyBhbmQgTWFjaW50b3NoLgotCi08cD4KLTxiPjIwMDIvMDQvMDM8L2I+IFJvYmVydCBUb2xiZXJ0IGhhcyBjb250cmlidXRlZCBQREYgYW5kIHBvc3RzY3JpcHQgdmVyc2lvbnMgb2YgdGhlIFNXSUctMS4zLjExIGRvY3VtZW50YXRpb24uICBDaGVjayBpdCBvdXQuCi0KLTxwPgotPGI+MjAwMi8wMi8wMTwvYj4gU1dJRy0xLjMuMTEgaGFzIGJlZW4gcmVsZWFzZWQuICAgVGhpcyBpcyBhIGJ1Zy1maXggcmVsZWFzZSBmb3IgU1dJRy0xLjMuMTAuICBUaGUgcmVsZWFzZSBhbHNvCi1pbmNsdWRlcyBzdWJzdGFudGlhbCBpbXByb3ZlbWVudHMgdG8gdGhlIEphdmEgYW5kIFBIUCBtb2R1bGVzLgotU2VlIHRoZSA8YSBocmVmPSJzdXJ2ZXkuaHRtbCI+ZG93bmxvYWQ8L2E+IHBhZ2UgZm9yIHJlbGVhc2Ugbm90ZXMgYW5kIHZlcnNpb25zIGZvciBXaW5kb3dzIGFuZCBNYWNpbnRvc2guICAKLQotPHA+Ci08Yj4yMDAxLzEyLzEwPC9iPiBTV0lHLTEuMy4xMCBoYXMgYmVlbgotcmVsZWFzZWQuICAgVGhpcyByZWxlYXNlIGZlYXR1cmVzIHN1YnN0YW50aWFsIGNoYW5nZXMgdG8gdHlwZW1hcHMsIGV4Y2VwdGlvbgotaGFuZGxpbmcsIGFuZCBTV0lHJ3MgaW50ZXJuYWxzLiAgIE5ldyBmZWF0dXJlcyBhbHNvIGluY2x1ZGUgc3VwcG9ydCBmb3IgQysrIG9wZXJhdG9yCi1vdmVybG9hZGluZyBhbmQgYW4gZXhwZXJpbWVudGFsIFBIUCBtb2R1bGUuICAgU2luY2UgdGhpcyBpcyBhbiB1bnN0YWJsZQotcmVsZWFzZSwgZmlyc3QgdGltZSB1c2VycyBtaWdodCB3YW50IHRvIGNvbnNpZGVyIHVzaW5nIFNXSUctMS4zLjkgb3IKLVNXSUcxLjFwNSBpbnN0ZWFkLgotU2VlIHRoZSA8YSBocmVmPSJzdXJ2ZXkuaHRtbCI+ZG93bmxvYWQ8L2E+IHBhZ2UgZm9yIHJlbGVhc2Ugbm90ZXMgYW5kIHZlcnNpb25zIGZvciBXaW5kb3dzIGFuZCBNYWNpbnRvc2guICAKLQotCi08UD4KLTxiPjIwMDEvMTIvMTA8L2I+IFRoZSA8YSBocmVmPSJEb2MxLjMiPmRldmVsb3BtZW50IGRvY3VtZW50YXRpb248L2E+IGZvciBTV0lHLTEuMyBoYXMgYmVlbiBleHRlbnNpdmVseSB1cGRhdGVkLiAgTm90IHlldCBmaW5pc2hlZCwgYnV0IGluY2x1ZGVzIGNvdmVyYWdlIG9mIG1vc3QKLW5ldyBTV0lHIGZlYXR1cmVzIGluY2x1ZGluZyB0aGUgcmVkZXNpZ25lZCB0eXBlbWFwIHN5c3RlbSBhbmQKLWltcHJvdmVkIGV4Y2VwdGlvbiBoYW5kbGluZy4gICAgICAgICAgICAgCi0KLTxwPgotPGI+MjAwMS8xMC8zMTwvYj4gQW5ub3VuY2luZyA8YSBocmVmPSJodHRwOi8vc3dpZy5jcy51Y2hpY2Fnby5lZHUvY2dpLWJpbi93aWtpLnBsIj5Td2lnV2lraTwvYT4uICAgCi1Qcm9ibGVtcyB3aXRoIFNXSUc/ICBMb29rIGhlcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIHRvIGNvbnRyaWJ1dGUuCi0KLTxwPgotPGI+MjAwMS8wOS8yODwvYj4gPGEgaHJlZj0iRG9jMS4zIj5EZXZlbG9wbWVudCBkb2N1bWVudGF0aW9uPC9hPiBmb3IgU1dJRy0xLjMgaXMgbm93IG9ubGluZS4gIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgbWFueSBuZXcgU1dJRyBmZWF0dXJlcwotYXJlIGRlc2NyaWJlZC4KLQotPHA+Ci08Yj4yMDAxLzA5LzIzPC9iPiBTV0lHLTEuMy45IGhhcyBiZWVuCi1yZWxlYXNlZC4gVGhpcyBpcyBhIGJ1Zy1maXggcmVsZWFzZSBmb3IgMS4zLjcgKGRlc2NyaWJlZCBiZWxvdykuCi1TZWUgdGhlIDxhIGhyZWY9InN1cnZleS5odG1sIj5kb3dubG9hZDwvYT4gcGFnZSBmb3IgcmVsZWFzZSBub3RlcyBhbmQgdmVyc2lvbnMgZm9yIFdpbmRvd3MgYW5kIE1hY2ludG9zaC4gIE5vdGU6IFNXSUctMS4zLjggaGFkIGEgbWFqb3IgcGFyc2luZyBwcm9ibGVtIHRoYXQKLXNudWNrIGluIGF0IHRoZSBsYXN0IG1vbWVudC0tZG9uJ3QgdXNlIHRoYXQgdmVyc2lvbi4KLQotPHA+Ci08Yj4yMDAxLzA5LzAzPC9iPiBTV0lHLTEuMy43IGhhcyBiZWVuCi1yZWxlYXNlZC4gVGhpcyBpcyBvbmUgb2YgdGhlIG1vc3Qgc3Vic3RhbnRpYWwgZW5oYW5jZW1lbnRzIHRvIFNXSUcgZXZlciByZWxlYXNlZC4gIEluY2x1ZGVzIGEgbW9yZQotcG93ZXJmdWwgcGFyc2VyLCBzdXBwb3J0IGZvciBDKysgdGVtcGxhdGVzLCBzaW1wbGlmaWVkIHdyYXBwaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgbW9yZSEKLVRoaXMgcmVsZWFzZSBhbHNvIGluY2x1ZGVzIHNvbWUgdXBkYXRlZCBkb2N1bWVudGF0aW9uIG9uIHRoZSBuZXcgZmVhdHVyZXMuIFNlZSB0aGUgPGEgaHJlZj0ic3VydmV5Lmh0bWwiPmRvd25sb2FkPC9hPiBwYWdlIGZvciByZWxlYXNlIG5vdGVzIGFuZCB2ZXJzaW9ucyBmb3IgV2luZG93cyBhbmQgTWFjaW50b3NoLgotCi0KLTxwPgotPGI+MjAwMS8wOC8zMDwvYj4gQSBwcmVjb21waWxlZCBleGVjdXRhYmxlIG9mIFNXSUctMS4zLjYgZm9yIFdpbmRvd3MgKHN3aWd3aW4tMS4zLjYpIGlzIG5vdyBhdmFpbGFibGUuCi0KLQotPHA+Ci08Yj4yMDAxLzA3LzE2PC9iPiBBIE1hY2ludG9zaCBwb3J0IG9mIFNXSUctMS4zLjYgKG1hY3N3aWctMS4zLjYpCi1oYXMgYmVlbiBjb250cmlidXRlZCBieSBMdWlnaSBCYWxsYWJpby4KLQotPHA+Ci08Yj4yMDAxLzA3LzEwPC9iPiBTV0lHLTEuMy42IGhhcyBiZWVuIHJlbGVhc2VkLiAgVGhpcyByZWxlYXNlIGluY2x1ZGVzIHN1YnN0YW50aWFsIGNoYW5nZXMKLXRvIHRoZSBsYW5ndWFnZSBtb2R1bGVzIGFuZCBncmVhdGx5IGltcHJvdmVkIHN1cHBvcnQgZm9yIEd1aWxlLCBKYXZhLCBhbmQgCi1SdWJ5LiAgUGxlYXNlIHNlZSB0aGUgPGEgaHJlZj0ic3VydmV5Lmh0bWwiPmRvd25sb2FkPC9hPiBwYWdlIGZvciBmdXJ0aGVyIGRldGFpbHMuCi0KLTxwPgotPGI+MjAwMC8xMC8xNDwvYj4gQSBNYWNpbnRvc2ggcG9ydCBvZiBTV0lHMS4zYTUgKG1hY3N3aWcxLjNhNSkgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCi0KLQotPHA+Ci08Yj4yMDAwLzA5LzIyPC9iPiBTV0lHMS4zYTUKLWhhcyBiZWVuIHJlbGVhc2VkLiAgVGhpcyByZWxlYXNlIGhhcyB0b28gbWFueSBjaGFuZ2VzIHRvIGxpc3QgaGVyZSwKLWJ1dCBpdCBmaXhlcyBhIGxvdCBvZiBidWdzIGluIFNXSUcxLjNhMyBhbmQgU1dJRzEuM2E0LCBpbmNsdWRlcyBuZXcgbGFuZ3VhZ2UgbW9kdWxlcwotZm9yIFJ1YnkgYW5kIE16c2NoZW1lLCBhbmQgaGFzIHNvbWUgbmV3IGV4YW1wbGVzLiAgTm90ZTogdGhpcyBpcyBhIHNvbWV3aGF0Ci11bnN0YWJsZSByZWxlYXNlIGFuZCBtYXkgbm90IGJlIHN1aXRhYmxlIGZvciBmaXJzdCB0aW1lIHVzZXJzLgotRG93bmxvYWQgU1dJRy0xLjEgaW5zdGVhZC4KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL2xpbmsudHh0IGIvc3dpZ3dlYi9saW5rLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1OTUwNi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL2xpbmsudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotI2luZGV4Lmh0IzooMy8xLzAwKSBTV0lHMS4zYTIgaGFzIGJlZW4gcmVsZWFzZWQhICBEb3dubG9hZCBub3cgZnJvbSA8YSBocmVmPSJodHRwOi8vZG93bmxvYWQuc291cmNlZm9yZ2UubmV0L3N3aWcvc3dpZzEuM2EyLnRhci5neiI+U291cmNlRm9yZ2U8L2E+LiAgTm90ZTogdGhpcyBpcyBhbiB1bnN0YWJsZSByZWxlYXNlIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIGZpcnN0LXRpbWUgdXNlcnMuICBEb3dubG9hZCA8YSBocmVmPSJmdHA6Ly93d3cuc3dpZy5vcmcvcHViL3N3aWcxLjFwNS50YXIuZ3oiPlNXSUcxLjFwNTwvYT4gaW5zdGVhZC4KLWRvYy5odDo8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViIj5GVFA8L2E+IHNpdGUuCi1kb2MuaHRtbDogPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1YiI+RlRQPC9hPiBzaXRlLgotZG93bmxvYWQuaHQ6PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViIj5mdHAuc3dpZy5vcmcvcHViPC9hPiAoTWFzdGVyIHNpdGUpLiAKLWRvd25sb2FkLmh0OjxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvc3dpZzEuMXA1LnRhci5neiI+U1dJRyAxLjFwNTwvYT4KLWRvd25sb2FkLmh0OjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnMS4xcDUudGFyLmd6Ij5zd2lnMS4xcDUudGFyLmd6PC9hPi4gVGhlIGZ1bGwgZGlzdHJpYnV0aW9uIGluY2x1ZGluZyBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4KLWRvd25sb2FkLmh0OjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnZG9jMS4xX3BkZi50YXIuZ3oiPnN3aWdkb2MxLjFfcGRmLnRhci5nejwvYT4uIFBERiBkb2N1bWVudGF0aW9uIChpbmNsdWRlZCBpbiB0aGUgZnVsbCBkaXN0cmlidXRpb24pLgotZG93bmxvYWQuaHQ6PGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWdkb2MxLjFfcHMudGFyLmd6Ij5zd2lnZG9jMS4xX3BzLnRhci5nejwvYT4uIFBvc3RzY3JpcHQgZG9jdW1lbnRhdGlvbi4KLWRvd25sb2FkLmh0OjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9NYWNTV0lHMS4xcDIuc2VhLmhxeCI+TWFjU1dJRzEuMXAyLnNlYS5ocXg8L2E+LiBTV0lHIGZvciB0aGUgUG93ZXIgTWFjaW50b3NoIChleHBlcmltZW50YWwpLgotZG93bmxvYWQuaHRtbDogPGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViIj5mdHAuc3dpZy5vcmcvcHViPC9hPiAoTWFzdGVyIHNpdGUpLiAKLWRvd25sb2FkLmh0bWw6IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvc3dpZzEuMXA1LnRhci5neiI+U1dJRyAxLjFwNTwvYT4KLWRvd25sb2FkLmh0bWw6IDxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnMS4xcDUudGFyLmd6Ij5zd2lnMS4xcDUudGFyLmd6PC9hPi4gVGhlIGZ1bGwgZGlzdHJpYnV0aW9uIGluY2x1ZGluZyBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4KLWRvd25sb2FkLmh0bWw6IDxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnZG9jMS4xX3BkZi50YXIuZ3oiPnN3aWdkb2MxLjFfcGRmLnRhci5nejwvYT4uIFBERiBkb2N1bWVudGF0aW9uIChpbmNsdWRlZCBpbiB0aGUgZnVsbCBkaXN0cmlidXRpb24pLgotZG93bmxvYWQuaHRtbDogPGxpPiA8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWdkb2MxLjFfcHMudGFyLmd6Ij5zd2lnZG9jMS4xX3BzLnRhci5nejwvYT4uIFBvc3RzY3JpcHQgZG9jdW1lbnRhdGlvbi4KLWRvd25sb2FkLmh0bWw6IDxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9NYWNTV0lHMS4xcDIuc2VhLmhxeCI+TWFjU1dJRzEuMXAyLnNlYS5ocXg8L2E+LiBTV0lHIGZvciB0aGUgUG93ZXIgTWFjaW50b3NoIChleHBlcmltZW50YWwpLgotZG93bmxvYWQuaHR+OjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1YiI+ZnRwLnN3aWcub3JnL3B1YjwvYT4gKE1hc3RlciBzaXRlKS4gCi1kb3dubG9hZC5odH46PGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnMS4xcDUudGFyLmd6Ij5TV0lHIDEuMXA1PC9hPgotZG93bmxvYWQuaHR+OjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnMS4xcDUudGFyLmd6Ij5zd2lnMS4xcDUudGFyLmd6PC9hPi4gVGhlIGZ1bGwgZGlzdHJpYnV0aW9uIGluY2x1ZGluZyBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4KLWRvd25sb2FkLmh0fjo8bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvc3dpZ2RvYzEuMV9wZGYudGFyLmd6Ij5zd2lnZG9jMS4xX3BkZi50YXIuZ3o8L2E+LiBQREYgZG9jdW1lbnRhdGlvbiAoaW5jbHVkZWQgaW4gdGhlIGZ1bGwgZGlzdHJpYnV0aW9uKS4KLWRvd25sb2FkLmh0fjo8bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvc3dpZ2RvYzEuMV9wcy50YXIuZ3oiPnN3aWdkb2MxLjFfcHMudGFyLmd6PC9hPi4gUG9zdHNjcmlwdCBkb2N1bWVudGF0aW9uLgotZG93bmxvYWQuaHR+OjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9NYWNTV0lHMS4xcDIuc2VhLmhxeCI+TWFjU1dJRzEuMXAyLnNlYS5ocXg8L2E+LiBTV0lHIGZvciB0aGUgUG93ZXIgTWFjaW50b3NoIChleHBlcmltZW50YWwpLgotZmVlZGJhY2suaHRtOjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPSJyZWNpcGllbnQiIHZhbHVlPSJzd2lnQHN3aWcub3JnIj4KLWd1ZXN0Ym9vay5jZ2k6JGd1ZXN0Ym9va3VybCA9ICJodHRwOi8vc3dpZy5vcmcvZ3Vlc3Riay5odG0iOwotZ3Vlc3Rib29rLmNnaTokY2dpdXJsID0gImh0dHA6Ly9zd2lnLm9yZy9jZ2ktYmluL2d1ZXN0Ym9vay5jZ2kiOwotaW5kZXguaHR+OigzLzEvMDApIFNXSUcxLjNhMiBoYXMgYmVlbiByZWxlYXNlZCEgIERvd25sb2FkIG5vdyBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9kb3dubG9hZC5zb3VyY2Vmb3JnZS5uZXQvc3dpZy9zd2lnMS4zYTIudGFyLmd6Ij5Tb3VyY2VGb3JnZTwvYT4uICBOb3RlOiB0aGlzIGlzIGFuIHVuc3RhYmxlIHJlbGVhc2UgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgZmlyc3QtdGltZSB1c2Vycy4gIERvd25sb2FkIDxhIGhyZWY9ImZ0cDovL3d3dy5zd2lnLm9yZy9wdWIvc3dpZzEuMXA1LnRhci5neiI+U1dJRzEuMXA1PC9hPiBpbnN0ZWFkLgotaW5kZXgxLmh0bWw6PGI+PGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnMS4xcDUudGFyLmd6Ij5Eb3dubG9hZDwvYT4gU1dJRzEuMXA1IG5vdyE8L2I+Ci1pbmRleDEuaHRtbDo8IS0tIGhvc3QgLS0+ICB3d3cuc3dpZy5vcmcgaXMgZ2VuZXJvdXNseSBob3N0ZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5wbnMuY2MiPlByb2Zlc3Npb25hbCBOZXQgU2VydmljZTwvYT4uIAotaW5kZXgyLmh0bWw6PCEtLSBob3N0IC0tPiAgd3d3LnN3aWcub3JnIGlzIGdlbmVyb3VzbHkgaG9zdGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cucG5zLmNjIj5Qcm9mZXNzaW9uYWwgTmV0IFNlcnZpY2U8L2E+LiAKLXNlYXJjaC5jZ2k6JGJhc2V1cmwgPSAnaHR0cDovL3N3aWcub3JnLyc7Ci1zZWFyY2guY2dpOiR0aXRsZSA9ICJzd2lnLm9yZyI7Ci1zZWFyY2guY2dpOiR0aXRsZV91cmwgPSAnaHR0cDovL3N3aWcub3JnLyc7Ci1zZWFyY2guY2dpOiRzZWFyY2hfdXJsID0gJ2h0dHA6Ly9zd2lnLm9yZy9zZWFyY2guaHRtJzsKLXNvdXJjZS5odG1sOjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1YiI+ZnRwLnN3aWcub3JnL3B1YjwvYT4gKE1hc3RlciBzaXRlKS4gCi1zb3VyY2UuaHRtbDo8YSBocmVmPSJmdHA6Ly9mdHAuc3dpZy5vcmcvcHViL3N3aWcxLjFwNS50YXIuZ3oiPlNXSUcgMS4xcDU8L2E+Ci1zb3VyY2UuaHRtbDo8bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvc3dpZzEuMXA1LnRhci5neiI+c3dpZzEuMXA1LnRhci5nejwvYT4uIFRoZSBmdWxsIGRpc3RyaWJ1dGlvbiBpbmNsdWRpbmcgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuCi1zb3VyY2UuaHRtbDo8bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvc3dpZ2RvYzEuMV9wZGYudGFyLmd6Ij5zd2lnZG9jMS4xX3BkZi50YXIuZ3o8L2E+LiBQREYgZG9jdW1lbnRhdGlvbiAoaW5jbHVkZWQgaW4gdGhlIGZ1bGwgZGlzdHJpYnV0aW9uKS4KLXNvdXJjZS5odG1sOjxsaT4gPGEgaHJlZj0iZnRwOi8vZnRwLnN3aWcub3JnL3B1Yi9zd2lnZG9jMS4xX3BzLnRhci5neiI+c3dpZ2RvYzEuMV9wcy50YXIuZ3o8L2E+LiBQb3N0c2NyaXB0IGRvY3VtZW50YXRpb24uCi1zb3VyY2UuaHRtbDo8bGk+IDxhIGhyZWY9ImZ0cDovL2Z0cC5zd2lnLm9yZy9wdWIvTWFjU1dJRzEuMXAyLnNlYS5ocXgiPk1hY1NXSUcxLjFwMi5zZWEuaHF4PC9hPi4gU1dJRyBmb3IgdGhlIFBvd2VyIE1hY2ludG9zaCAoZXhwZXJpbWVudGFsKS4KLXN3aWcuaHQ6PCEtLSBob3N0IC0tPiAgd3d3LnN3aWcub3JnIGlzIGdlbmVyb3VzbHkgaG9zdGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cucG5zLmNjIj5Qcm9mZXNzaW9uYWwgTmV0IFNlcnZpY2U8L2E+LiAKLXN3aWcuaHRtbDogPCEtLSBob3N0IC0tPiAgd3d3LnN3aWcub3JnIGlzIGdlbmVyb3VzbHkgaG9zdGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cucG5zLmNjIj5Qcm9mZXNzaW9uYWwgTmV0IFNlcnZpY2U8L2E+LiAKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvbGlua3MuaHQgYi9zd2lnd2ViL2xpbmtzLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNiNWJhLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvbGlua3MuaHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotU1dJRyBSZWxhdGVkIExpbmtzCi0KLTxwPgotPGltZyBzcmM9ImltYWdlcy9saW5rcy5wbmciIGFsdD0iTGlua3MiPgotCi08SDM+IFByb2plY3RzIDwvSDM+Ci0KLUxvdHMgb2YgcGVvcGxlIDxhIGhyZWY9InByb2plY3RzLmh0bWwiPnVzZSBTV0lHPC9hPi4KLQotCi08SDM+IExhbmd1YWdlIHJlbGF0ZWQgbGlua3MgPC9oMz4KLQotPGJsb2NrcXVvdGU+Ci0KLVRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnNjcmlwdGljcy5jb20iPiBUY2wvVGsgPC9hPiBob21lcGFnZSBhdCBTY3JpcHRpY3M8YnI+Ci1UaGUgPGEgaHJlZiA9Imh0dHA6Ly93d3cucHl0aG9uLm9yZyI+IFB5dGhvbiA8L2E+IGhvbWVwYWdlLiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnBlcmwub3JnIj4gVGhlIFBlcmwgSW5zdGl0dXRlPC9hPiA8YnI+Ci08YSBocmVmPSJodHRwOi8vcmVwdWJsaWMucGVybC5jb20iPiBUaGUgUHJvZ3JhbW1pbmcgUmVwdWJsaWMgb2YgUGVybDwvYT4uIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cucGVybC5jb20vQ1BBTi9DUEFOLmh0bWwiPiBDUEFOIChDb21wcmVoZW5zaXZlIFBlcmwgQXJjaGl2ZSBOZXR3b3JrKTwvYT4gPGJyPgotPGEgaHJlZj0iaHR0cDovL3N0YXJzaGlwLnB5dGhvbi5uZXQiPiBTdGFyc2hpcCBQeXRob248L2E+IDxicj4KLQotPGEgaHJlZj0iaHR0cDovL3d3dy5uZW9zb2Z0LmNvbS90Y2wvZGVmYXVsdC5odG1sIj4gVGNsL1RrIENvbnRyaWJ1dGVkIFNvdXJjZXMgQXJjaGl2ZSA8L2E+IDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuc2NvLmNvbS9UZWNobm9sb2d5L3RjbC9UY2wuaHRtbCI+IFRjbC9UayBJbmZvcm1hdGlvbiA8L2E+IDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9ndWlsZS9ndWlsZS5odG1sIj5HdWlsZTwvYT4gaG9tZXBhZ2UuIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY3MucmljZS5lZHUvQ1MvUExUL3BhY2thZ2VzL216c2NoZW1lLyI+TXpTY2hlbWU8L2E+IGhvbWVwYWdlPGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5ydWJ5LWxhbmcub3JnLyI+UnVieTwvYT4gaG9tZXBhZ2UuIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vIj5KYXZhPC9hPiBob21lcGFnZSBhdCBTdW4uIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cucGhwLm5ldC8iPlBIUDwvYT4gaG9tZXBhZ2UuIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY2FsbC13aXRoLWN1cnJlbnQtY29udGludWF0aW9uLm9yZy9jaGlja2VuLmh0bWwiPkNISUNLRU48L2E+IGhvbWVwYWdlLiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnNjaGVtZXJzLm9yZy8iPiBzY2hlbWVycy5vcmcgPC9hPiAtIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgZm9yIHRoZSBTY2hlbWUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgPGJyPgotPC9ibG9ja3F1b3RlPgotCi08aDM+IENvZGUgZ2VuZXJhdG9ycyBhbmQgb3RoZXIgaW50ZXJlc3RpbmcgcGFja2FnZXM8L2gzPgotCi08YmxvY2txdW90ZT4KLVRoZSA8YSBocmVmPSJmdHA6Ly9mdHAucGFyYy54ZXJveC5jb20vcHViL2lsdS9pbHUuaHRtbCI+IElMVSA8L2E+IGhvbWVwYWdlIChYZXJveCBQQVJDKSA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmZweC5kZS9mcC9Tb2Z0d2FyZS90Y2xvYmoiPiBUY2xPYmogPC9hPiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmFtYXRoLndhc2hpbmd0b24uZWR1L35sZi9zb2Z0d2FyZS90Y2wrKyI+TW9kdWxhciBUY2w8L2E+PGJyPgotPGEgaHJlZj0iaHR0cDovL2xuYy51c2MuZWR1L35ob2x0L21hdHdyYXAvIj5NYXR3cmFwPC9hPi4gQSB3cmFwcGVyCi1nZW5lcmF0b3IgZm9yIG1hdHJpeCBsYW5ndWFnZXMuIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NpcCI+U0lQPC9hPi4gQSB3cmFwcGVyIGdlbmVyYXRvcgotZm9yIGludGVncmF0aW5nIEMrKyBsaWJyYXJpZXMgd2l0aCBQeXRob24uIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9jeHguc291cmNlZm9yZ2UubmV0Ij5DWFg8L2E+LiBBIEMrKyBmcmllbmRseSBleHRlbnNpb24gQVBJIGZvciBQeXRob24uPGJyPgotPGEgaHJlZj0iaHR0cDovL3B5Zm9ydHJhbi5zb3VyY2Vmb3JnZS5uZXQiPnB5Zm9ydDwvYT4uIEEgd3JhcHBlciBnZW5lcmF0b3IgZm9yIGludGVyZmFjaW5nIEZvcnRyYW4gd2l0aCBQeXRob24uPGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy5hY2wubGFubC5nb3Yvc2lsb29uIj5TSUxPT048L2E+LiBBIHdyYXBwZXIgZ2VuZXJhdGlvbiB0b29sIAotd2l0aCBzb21lIGFtYml0aW91cyBnb2FscyBmb3IgQysrLjxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3c5LmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlL2VuZy9yZXNlYXJjaC9yZW5kZXJpbmcvdmlzaW9uL2l0Y2wvIj5JdGNsKys8L2E+LiAKLUEgd3JhcHBlciBnZW5lcmF0b3IgZm9yIGludGVyZmFjaW5nIEMrKyB3aXRoIFtpbmNyIFRjbF0uPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LmhsbGEuaXMudHN1a3ViYS5hYy5qcC9+Y2hpYmEvb3BlbmMrKy5odG1sIj5PcGVuQysrPC9hPi4gIEEgdmVyeSBjb29sIGNvbXBpbGVyIHByb2plY3QgdGhhdCBsZXRzIHlvdSBjcmF3bCBpbnNpZGUgQysrIHBhcnNlIHRyZWVzIGFuZCBtb3JlLiA8YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LnN0YWNrLm5sL35kaW1pdHJpL2RveHlnZW4iPkRveHlnZW48L2E+LiBHZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGFuZCBtb3JlIGZvciBDL0MrKyBwcm9ncmFtcy48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmNzLmNtdS5lZHUvfmNocmlzbGVlL1NvZnR3YXJlL2ctd3JhcC8iPkctV3JhcDwvYT4uIEEgd3JhcHBlciBnZW5lcmF0b3IgZm9yIGludGVyZmFjaW5nIEMgYW5kIFNjaGVtZSAoaW5jbHVkaW5nIEd1aWxlKS48YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly9jZW5zLmlvYy5lZS9wcm9qZWN0cy9mMnB5MmUiPmYycHk8L2E+LiBBbiBpbnRlcmZhY2UgZ2VuZXJhdG9yIGZvciBiaW5kaW5nIEZvcnRyYW4gYW5kIFB5dGhvbi48YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvcHl0aG9uL2RvYy9pbmRleC5odG1sIj5Cb29zdCBQeXRob24gTGlicmFyeTwvYT4uICBBIHZlcnkgaW50ZXJlc3RpbmcgYXBwcm9hY2ggdG8KLUMrKyB3cmFwcGVyIGdlbmVyYXRpb24gdGhhdCB1c2VzIHRlbXBsYXRlIG1ldGFwcm9ncmFtbWluZy4gPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LmRlYXZlbi5uZXQvfmRlYXZlbi9Tb2Z0d2FyZS9jeHh3cmFwLyI+Y3h4d3JhcDwvYT4uIEphdmEgSk5JIHdyYXBwZXIgY29kZSBnZW5lcmF0b3IgZm9yIEMrKy48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmV4Y2Vsc2lvci11c2EuY29tL3hmdW5jdGlvbi5odG1sIj54RnVuY3Rpb248L2E+LiBKYXZhIG5hdGl2ZSBjb2RlIGFjY2VzcyBsaWJyYXJ5Ljxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nY2MvamF2YS9pbmRleC5odG1sIj5HQ0o8L2E+LiBHbnUgQ29tcGlsZXIgZm9yIEphdmEgLSBQYXJ0IG9mIEdDQyAzLjAgYW5kIGxhdGVyLiBDKysgYW5kIEphdmEgY2FuIGJlIGVhc2lseSBtaXhlZCB0b2dldGhlciAtIEphdmEgb2JqZWN0cyBhcmUgQysrIG9iamVjdHMgYW5kIGFsbCBKYXZhIGNsYXNzZXMgYXJlIEMrKyBjbGFzc2VzIHVzaW5nIENOSSwgdGhlIGFsdGVybmF0aXZlIHRvIEpOSS48YnI+Ci08YSBocmVmPSJodHRwOi8vaW5saW5lLnBlcmwub3JnIj5JbmxpbmU8L2E+LiAgUGVybCBwcm9ncmFtbWVycyB3aWxsIGRlZmluaXRlbHkgd2FudCB0byB0YWtlIGEgbG9vayBhdAotdGhpcyBtb2R1bGUtLWVzcGVjaWFsbHkgaWYgeW91J3JlIG1ha2luZyBzaW1wbGUgQy9DKysgZXh0ZW5zaW9ucy48YnI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmtkLWRldi5jb20vfmVpYy8iPkVpQzwvYT4uIEVtYmVkZGFibGUsIGV4dGVuc2libGUgYW5kIHBvaW50ZXItc2FmZSBDIGludGVycHJldGVyIHdpdGggYW4gaW50ZXJmYWNlIHRvIGNvbXBpbGVkIEMgY29kZS48YnI+Ci08YSBocmVmPSJodHRwOi8vcm9vdC5jZXJuLmNoL3Jvb3QvQ2ludC5odG1sIj5DSU5UPC9hPi4gQy9DKysgaW50ZXJwcmV0ZXIgd2l0aCBhbiBpbnRlcmZhY2UgdG8gY29tcGlsZWQgQy9DKysgY29kZS48YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly9wdWJsaWMua2l0d2FyZS5jb20vQ2FibGUiPkNBQkxFPC9hPi4gQSB3cmFwcGVyCi1nZW5lcmF0b3IgZm9yIEMrKyB0aGF0IHVzZXMgR0NDLVhNTCB0byBwcm92aWRlIFRjbCB3cmFwcGVycyBmb3IgYWxtb3N0Ci1hbGwgQysrIGZlYXR1cmVzLiAgVGhlcmUgYXJlIHBsYW5zIHRvIHN1cHBvcnQgbW9yZSBsYW5ndWFnZXMgc28gYmUKLXN1cmUgdG8gY2hlY2sgaXQgb3V0LgotPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LnNjaXB5Lm9yZy9zaXRlX2NvbnRlbnQvd2VhdmUiPldlYXZlPC9hPi4gQSB0b29sIGZvciBpbmxpbmluZyBDL0MrKyBjb2RlIGludG8gUHl0aG9uIHNjcmlwdHMuICBWZXJ5IGNvb2wuPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LnRlY2dyYWYucHVjLXJpby5ici9+Y2VsZXMvdG9sdWEiPlRvbHVhPC9hPi4gQ29ubmVjdCBDL0MrKyBwcm9ncmFtcyB0byB0aGUgTHVhIHByb2dhbW1pbmcgbGFuZ3VhZ2UuPGJyPgotCi08YSBocmVmPSJodHRwOi8vd3d3LmNzLmZzdS5lZHUvfmVuZ2VsZW4vc29hcC5odG1sIj5nU09BUDwvYT4uICBBIGNvbXBpbGVyIGZvciBkZXBsb3lpbmcgQy9DKysgcHJvZ3JhbXMgYXMgU09BUCB3ZWIgc2VydmljZXMuIDxicj4KLQotPGEgaHJlZj0iaHR0cDovL3d3dy5zb2Z0aW50ZWdyYXRpb24uY29tIj5DaDwvYT4uIEFuIGVtYmVkZGFibGUgQy9DKysgaW50ZXJwcmV0ZXIgKGNvbW1lcmNpYWwpLiA8YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY29zYy5jYW50ZXJidXJ5LmFjLm56L35ncmVnL3B5dGhvbi9QeXJleC8iPlB5cmV4PC9hPi4gQSBsYW5ndWFnZSBmb3Igd3JpdGluZyBQeXRob24gZXh0ZW5zaW9uIG1vZHVsZXMuPGJyPgotCi08YSBocmVmPSJodHRwOi8vZWxtZXIuc291cmNlZm9yZ2UubmV0Ij5FbG1lcjwvYT4uIEdsdWUgY29kZSBnZW5lcmF0b3Igc28gdGhhdCBQeXRob24gbW9kdWxlcyBjYW4gcnVuIGluIEMgYW5kIFRjbCBwcm9ncmFtcy48YnI+Ci0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3N3aWd4bWx0b2NvbSI+U3dpZ1htbFRvQ29tPC9hPi4gVG9vbCB0aGF0IHVzZXMgU1dJRyB0byBnZW5lcmF0ZSBDT00gd3JhcHBlcnMuPGJyPgotCi08L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gT3RoZXIgaW50ZXJlc3RpbmcgbGlua3M8L2gzPgotCi08YmxvY2txdW90ZT4KLQotSm9obiBPdXN0ZXJob3V0J3MgPGEgaHJlZj0iaHR0cDovL2hvbWUucGFjYmVsbC5uZXQvb3VzdGVyL3NjcmlwdGluZy5odG1sIj4gcGFwZXIgPC9hPiBvbiBzY3JpcHRpbmcgbGFuZ3VhZ2VzCi0oYXBwZWFyZWQgaW4gSUVFRSBDb21wdXRlcikuIDxicj4KLTxBIEhSRUY9Imh0dHA6Ly9TQUwuS2FjaGluYVRlY2guQ09NLyI+IFNBTCAtIFNjaWVudGlmaWMgQXBwbGljYXRpb25zIG9uIExpbnV4PC9hPi4gPGJyPgotPGEgaHJlZj0iaHR0cDovL3d3dy51c2VuaXgub3JnIj5VU0VOSVg8L2E+IDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cubWF0aHRvb2xzLm5ldCI+TWF0aHRvb2xzLm5ldDwvYT4gQSB0ZWNobmljYWwgY29tcHV0aW5nIHBvcnRhbCBmb3IgYWxsIHNjaWVudGlmaWMgYW5kIGVuZ2luZWVyaW5nIG5lZWRzLiBDb250YWlucyB1c2VmdWwgbGlua3MgdG8gdGVjaG5pY2FsIGNvbXB1dGluZyBwcm9ncmFtbWVycywgY292ZXJpbmcgQy9DKyssIEphdmEsIEV4Y2VsLCBNQVRMQUIsIEZvcnRyYW4gYW5kIG90aGVycy48YnI+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxiPkkgYW0gYWx3YXlzIG9uIHRoZSBsb29rb3V0IGZvciBwcm9qZWN0cyB0aGF0IGFyZSBlaXRoZXIgcmVsYXRlZCB0byBTV0lHIAotb3Igd2hpY2ggcHJvdmlkZSBhbHRlcm5hdGl2ZSBzb2x1dGlvbnMgdG8gdGhlIHByb2JsZW0gb2Ygd3JhcHBpbmcgQy9DKysgY29kZS4KLVBsZWFzZSBkcm9wIG1lIGEgbGluZSBpZiB0aGVyZSBhcmUgb3RoZXIgcHJvamVjdHMgdGhhdAotc2hvdWxkIGJlIGxpbmtlZCBoZXJlLiAtLSBEYXZlPC9iPgotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9tYWlsLmh0IGIvc3dpZ3dlYi9tYWlsLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDhiMGY4Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvbWFpbC5odAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLVNXSUcgTWFpbGluZyBMaXN0cwotCi08cD48aW1nIHNyYz0iaW1hZ2VzL21haWwucG5nIiBhbHQ9Ik1haWwiPgotCi08cD4KLQotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG1haWxpbmcgbGlzdHMgYXZhaWxhYmxlLiBQbGVhc2UgdXNlIHRoZW0gZm9yIGFueSBxdWVyaWVzIHJlbGF0ZWQgdG8gdGhlIHVzZSBvciBkZXZlbG9wbWVudCBvZiBTV0lHLgotCi08cD4KLTxiPkltcG9ydGFudDwvYj4uIFRoZSBtYWlsaW5nIGxpc3RzIGFyZSBzZXQgd2l0aCBhIHZlcnkgaGlnaCBsZXZlbCBvZiBzcGFtIHJlamVjdGlvbiwgbWVhbmluZyBvY2Nhc2lvbmFsbHkgc29tZSBTV0lHIHVzZXIncyBlbWFpbCBwb3N0aW5ncyB3aWxsIGJlIGRpc2NhcmRlZC4gRW1haWxzIGNsYXNzaWZpZWQgYXMgc3BhbSBhcmUgcXVpZXRseSBkaXNjYXJkZWQsIHNvIHBsZWFzZSBjaGVjayB0aGUgYXJjaGl2ZXMgaWYgeW91IGFyZSB1bnN1cmUgYXMgdG8gd2hldGhlciBvciBub3QgeW91ciBlbWFpbCB3YXMgc3VjY2Vzc2Z1bGx5IHBvc3RlZC4gTm90ZSB0aGF0IG9ubHkgcGxhaW4gdGV4dCBlbWFpbHMgc2hvdWxkIGJlIHNlbnQsIHRoYXQgaXMgaHRtbCwgcnRmIGV0YyBmb3JtYXR0ZWQgZW1haWxzIHdpbGwgYmUgcXVpZXRseSBkaXNjYXJkZWQuIFRoZSBtYWlsaW5nIGxpc3RzIGFyZSBhbHNvIHN1YnNjcmliZXIgb25seSBsaXN0cywgc28geW91IG11c3Qgc3Vic2NyaWJlIHRvIHRoZSByZWxldmFudCBsaXN0IGluIG9yZGVyIHRvIHBvc3QgdG8gdGhhdCBsaXN0LiAKLQotPHA+Ci1UbyBzdWJzY3JpYmUgdG8gYW55IG9mIHRoZSBtYWlsaW5nIGxpc3RzIG9yIHZpZXcgdGhlIGFyY2hpdmVzLCB1c2UgdGhlIGxpbmtzIG9uIHRoZSBsZWZ0IGNvbHVtbi4KLTxicj4KLTxicj4KLQotPHRhYmxlIEJPUkRFUj0iMSIgc3VtbWFyeT0iTWFsaW5nIGxpc3RzIj4KLTx0cj4KLTx0ZD48Zm9udCBzaXplPSIrMSI+TGlzdDwvZm9udD48L3RkPgotPHRkPjxmb250IHNpemU9IisxIj5QdXJwb3NlPC9mb250PjwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQ+Ci08YSBocmVmPSJodHRwOi8vd3d3LmNzLnVjaGljYWdvLmVkdS9tYWlsbWFuL2xpc3RpbmZvL3N3aWciPnN3aWc8L2E+Ci08L3RkPgotPHRkPgotR2VuZXJhbCBkaXNjdXNzaW9uIGFuZCBxdWVyaWVzIGFib3V0IFNXSUcuCi08L3RkPgotPC90cj4KLQotPHRyPgotPHRkPgotPGEgaHJlZj0iaHR0cDovL3d3dy5jcy51Y2hpY2Fnby5lZHUvbWFpbG1hbi9saXN0aW5mby9zd2lnLWRldiI+c3dpZy1kZXY8L2E+Ci08L3RkPgotPHRkPgotU1dJRyBEZXZlbG9wbWVudCBkaXNjdXNzaW9uIGxpc3QuIFRoaXMgbWFpbGluZyBsaXN0IHVzZWQgdG8gY29udGFpbiB0aGUgQ1ZTIGNvbW1pdHMsIGJ1dCB0aGVzZSBhcmUgbm93IG9uIHRoZSBzd2lnLWN2cyBtYWlsaW5nIGxpc3QuCi08L3RkPgotPC90cj4KLQotPHRyPgotPHRkPgotPGEgaHJlZj0iaHR0cDovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zd2lnLWN2cyI+c3dpZy1jdnM8L2E+Ci08L3RkPgotPHRkPgotU1dJRyBDVlMgbGlzdC4gQ1ZTIGNvbW1pdHMgYXJlIG1haWxlZCB0byB0aGlzIGxpc3QuCi08L3RkPgotPC90cj4KLQotPC90YWJsZT4KLQotPGgyPlNlYXJjaGluZyB0aGUgbWFpbGluZyBsaXN0czwvaDI+Ci08cD4KLVRoZSBtYWlsaW5nIGxpc3RzIGNhbiBiZSBzZWFyY2hlZCBpbiB2YXJpb3VzIGRpZmZlcmVudCB3YXlzLgotPC9wPgotCi08cD4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZ21hbmUub3JnIj5HbWFuZTwvYT4gYXJjaGl2ZXMgbWFueSBtYWlsaW5nIGxpc3RzIGluY2x1ZGluZyB0aGUgc3dpZyBtYWlsaW5nIGxpc3QuCi1Zb3UgY2FuIHVzZSBHbWFuZSB0byA8YSBocmVmPSJodHRwOi8vZGlyLmdtYW5lLm9yZy9nbWFuZS5jb21wLnByb2dyYW1taW5nLnN3aWciPnNlYXJjaCB0aGUgc3dpZyBtYWlsaW5nIGxpc3Q8L2E+IGFyY2hpdmVzCi1vciBqdXN0IGJyb3dzZSB0aGUgbGlzdCBvbmxpbmUgYXMgaWYgdGhlIGxpc3Qgd2FzIGEgbmV3c2dyb3VwLgotTm90ZSB0aGF0IG9ubHkgdGhlIHN3aWcgbWFpbGluZyBsaXN0IGNhbiBiZSBxdWVyaWVkIGFzIHRoZSBzd2lnLWRldiBtYWlsaW5nIGxpc3QgaXMgbm90IGN1cnJlbnRseSBhcmNoaXZlZCBieSBHbWFuZS4KLTwvcD4KLQotPHA+Ci1Hb29nbGUgY2FuIGJlIHVzZWQgdG8gc2VhcmNoIHRoZSBzaXRlIHRoYXQgaG9zdHMgdGhlIHN3aWcgYW5kIHN3aWctZGV2IG1haWxpbmcgbGlzdCBhcmNoaXZlcy4KLTwvcD4KLQotPCEtLSBTaXRlU2VhcmNoIEdvb2dsZSAtLT4KLTxGT1JNIG1ldGhvZD1HRVQgYWN0aW9uPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoIj4KLTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWllIHZhbHVlPVVURi04PgotPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9b2UgdmFsdWU9VVRGLTg+Ci08VEFCTEUgYmdjb2xvcj0iI0ZGRkZGRiI+PHRyPjx0ZD4KLTxBIEhSRUY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iPgotPElNRyBTUkM9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9sb2dvcy9Mb2dvXzQwd2h0LmdpZiIgCi1ib3JkZXI9IjAiIEFMVD0iR29vZ2xlIj48L0E+Ci08L3RkPgotPHRkPgotPElOUFVUIFRZUEU9dGV4dCBuYW1lPXEgc2l6ZT0zMSBtYXhsZW5ndGg9MjU1IHZhbHVlPSIiPgotPElOUFVUIHR5cGU9c3VibWl0IG5hbWU9YnRuRyBWQUxVRT0iR29vZ2xlIFNlYXJjaCI+Ci08Zm9udCBzaXplPS0xPgotPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZG9tYWlucyB2YWx1ZT0ibWFpbG1hbi5jcy51Y2hpY2Fnby5lZHUiPjxicj48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXNpdGVzZWFyY2ggdmFsdWU9IiI+IHRoZSB3ZWIgPGlucHV0IHR5cGU9cmFkaW8gbmFtZT1zaXRlc2VhcmNoIHZhbHVlPSJtYWlsbWFuLmNzLnVjaGljYWdvLmVkdSIgY2hlY2tlZD4gbWFpbG1hbi5jcy51Y2hpY2Fnby5lZHUgKHN3aWcgYW5kIHN3aWctZGV2IG1haWxpbmcgbGlzdHMpIDxicj4KLTwvZm9udD4KLTwvdGQ+PC90cj48L1RBQkxFPgotPC9GT1JNPgotPCEtLSBTaXRlU2VhcmNoIEdvb2dsZSAtLT4KLQotPHA+Ci1UaGUgU291cmNlZm9yZ2UgPGEgaHJlZj1odHRwOi8vc291cmNlZm9yZ2UubmV0L21haWxhcmNoaXZlL2ZvcnVtLnBocD9mb3J1bT1zd2lnLWN2cz5zd2lnLWN2cyBtYWlsaW5nIGxpc3QgYXJjaGl2ZTwvYT4gaGFzIGEgZmFjaWxpdHkgdG8gc2VhcmNoIHRoZSBzd2lnLWN2cyBsaXN0IGFyY2hpdmVzLgotPC9wPgotCmRpZmYgLS1naXQgYS9zd2lnd2ViL21ha2V3ZWIucHkgYi9zd2lnd2ViL21ha2V3ZWIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwZjE2N2IuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9tYWtld2ViLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLSMhL3Vzci9sb2NhbC9iaW4vcHl0aG9uCi0jIE1ha2UgdGhlIFNXSUcgd2ViLXBhZ2VzCi0jCi0jIE9rYXkuIFlldCBhbm90aGVyIGJvZ3VzIHJld3JpdGUgb2YgQmFycnkncyB3b3JrCi0KLWltcG9ydCBzdHJpbmcKLWltcG9ydCBnbG9iCi1pbXBvcnQgb3MKLWltcG9ydCB0aW1lCi1pbXBvcnQgc3RhdAotCi1kZWYgbWFrZXBhZ2UoZmlsZW5hbWUpOgotICAgICAgICBuYW1lLCBzdWZmaXggPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQotCWYgPSBvcGVuKCJkZWZhdWx0Lmh0bWwiKQotCXBhZ2UgPSBmLnJlYWQoKQotICAgICAgICBmLmNsb3NlKCkKLQotCSMgUmVhZCBpbiB0aGUgYm9keSBmaWxlCi0gICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lKQotCWJvZHkgPSBmLnJlYWRsaW5lcygpCi0JZi5jbG9zZSgpCi0JdGl0bGUgPSBib2R5WzBdCi0JYm9keSA9IHN0cmluZy5qb2luKGJvZHlbMTpdKQotCXBhZ2UgPSBzdHJpbmcucmVwbGFjZShwYWdlLCIkdGl0bGUiLHRpdGxlKQkKLQlwYWdlID0gc3RyaW5nLnJlcGxhY2UocGFnZSwiJGJvZHkiLGJvZHkpCi0KLQkjIFJlYWQgaW4gdGhlIGNvcm5lciBmaWxlCi0JdHJ5OgotCQlmID0gb3BlbihuYW1lKyIuY29ybmVyIikKLQkJY29ybmVyID0gZi5yZWFkKCkKLQkJZi5jbG9zZSgpCi0JZXhjZXB0IElPRXJyb3I6Ci0JCXRyeToKLQkJCWYgPSBvcGVuKCJkZWZhdWx0LmNvcm5lciIpCi0JCQljb3JuZXIgPSBmLnJlYWQoKQotCQkJZi5jbG9zZSgpCi0JCWV4Y2VwdDoKLQkJCWNvcm5lciA9ICIiCi0JCi0JcGFnZSA9IHN0cmluZy5yZXBsYWNlKHBhZ2UsIiRjb3JuZXIiLGNvcm5lcikKLQotCSMgUmVhZCBpbiB0aGUgdG9wIGZpbGUKLQl0cnk6Ci0JCWYgPSBvcGVuKG5hbWUrIi50b3AiKQotCQl0b3AgPSBmLnJlYWQoKQotCQlmLmNsb3NlKCkKLQlleGNlcHQgSU9FcnJvcjoKLQkJdHJ5OgotCQkJZiA9IG9wZW4oImRlZmF1bHQudG9wIikKLQkJCXRvcCA9IGYucmVhZCgpCi0JCQlmLmNsb3NlKCkKLQkJZXhjZXB0OgotCQkJdG9wID0gIiIKLQkKLQlwYWdlID0gc3RyaW5nLnJlcGxhY2UocGFnZSwiJHRvcCIsdG9wKQotCi0JIyBSZWFkIGluIHRoZSBzaWRlIGZpbGUKLQl0cnk6Ci0JCWYgPSBvcGVuKG5hbWUrIi5zaWRlIikKLQkJc2lkZSA9IGYucmVhZCgpCi0JCWYuY2xvc2UoKQotCWV4Y2VwdCBJT0Vycm9yOgotCQl0cnk6Ci0JCQlmID0gb3BlbigiZGVmYXVsdC5zaWRlIikKLQkJCXNpZGUgPSBmLnJlYWQoKQotCQkJZi5jbG9zZSgpCi0JCWV4Y2VwdDoKLQkJCXNpZGUgPSAiIgotCQotCXBhZ2UgPSBzdHJpbmcucmVwbGFjZShwYWdlLCIkc2lkZSIsc2lkZSkKLQotCSMgUmVhZCBpbiB0aGUgZm9vdGVyIGZpbGUKLQl0cnk6Ci0JCWYgPSBvcGVuKG5hbWUrIi5mb290ZXIiKQotCQlmb290ZXIgPSBmLnJlYWQoKQotCQlmLmNsb3NlKCkKLQlleGNlcHQgSU9FcnJvcjoKLQkJdHJ5OgotCQkJZiA9IG9wZW4oImRlZmF1bHQuZm9vdGVyIikKLQkJCWZvb3RlciA9IGYucmVhZCgpCi0JCQlmLmNsb3NlKCkKLQkJZXhjZXB0OgotCQkJZm9vdGVyID0gIiIKLQotCXBhZ2UgPSBzdHJpbmcucmVwbGFjZShwYWdlLCIkZm9vdGVyIixmb290ZXIpCi0KLQltdGltZSA9IG9zLnN0YXQoZmlsZW5hbWUpW3N0YXQuU1RfTVRJTUVdCi0JbXN0ciA9IHRpbWUuY3RpbWUobXRpbWUpCi0KLQlwYWdlID0gc3RyaW5nLnJlcGxhY2UocGFnZSwiJG10aW1lIixtc3RyKTsKLQotCSMgV3JpdGUgb3V0IHRoZSBwYWdlCi0JZiA9IG9wZW4obmFtZSsiLmh0bWwiLCJ3IikKLQlmLndyaXRlKHBhZ2UpCi0JZi5jbG9zZSgpCi0JcHJpbnQgIldyb3RlICIsIG5hbWUrIi5odG1sIgotCi1maWxlcyA9IGdsb2IuZ2xvYigiKi5odCIpCi0KLWZvciBmIGluIGZpbGVzOgotCW1ha2VwYWdlKGYpCi0KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvbXl0aHMuaHQgYi9zd2lnd2ViL215dGhzLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzRiNmM1Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvbXl0aHMuaHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotU1dJRyBNeXRocwotCi08aDI+U1dJRyBNeXRoczwvaDI+Ci0KLTxwPgotSGVyZSBhcmUgc29tZSBjb21tb24gbWlzY29uY2VwdGlvbnMgYWJvdXQgU1dJRyB0aGF0IGhhdmUgb2NjYXNpb25hbGx5Ci1hcHBlYXJlZCBvbiBvdGhlciB3ZWIgcGFnZXMgYW5kIGluIGFydGljbGVzLS1lc3BlY2lhbGx5IHRob3NlIHRoYXQKLWRlc2NyaWJlIG9sZGVyIFNXSUcgdmVyc2lvbnMuCi0KLTxoND48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TXl0aDogU1dJRyBvbmx5IHJlYWxseSB3b3JrcyB3aXRoIEFOU0kgQzwvZm9udD48L2g0PgotCi08aDQ+RmFjdDo8L2g0PgotCi1TV0lHIDxlbT5kb2VzPC9lbT4gcHJvdmlkZSB3cmFwcGluZyBzdXBwb3J0IGZvciBhbGwgb2YgQU5TSSBDLiAgSG93ZXZlciwgU1dJRyBoYXMKLWFsc28gaW5jbHVkZWQgQysrIHN1cHBvcnQgc2luY2UgaXRzIGluaXRpYWwgcmVsZWFzZSBpbiAxOTk2LiAgIFRvIGJlIGZhaXIsIGVhcmx5Ci1TV0lHIHJlbGVhc2VzIGhhZCBsaW1pdGF0aW9ucywgYnV0IEMrKyBzdXBwb3J0IGhhcyBjb250aW51YWxseSBpbXByb3ZlZCB3aXRoCi1lYWNoIFNXSUcgcmVsZWFzZS4KLQotPHA+Ci1DKysgc3VwcG9ydCBpbiBjdXJyZW50IFNXSUcgcmVsZWFzZXMgaXMgcXVpdGUgYWR2YW5jZWQtLXByb3ZpZGluZyBzdXBwb3J0IGZvciBuZWFybHkKLWV2ZXJ5IEMrKyBmZWF0dXJlIGluY2x1ZGluZyB0ZW1wbGF0ZXMsIG5hbWVzcGFjZXMsIG9wZXJhdG9ycywgb3ZlcmxvYWRlZCBtZXRob2RzLAotYW5kIG1vcmUuICBUaGUgb25seSBtYWpvciBDKysgZmVhdHVyZSBub3Qgc3VwcG9ydGVkIGlzIG5lc3RlZCBjbGFzc2VzLS0tYW5kIHdlJ3JlCi13b3JraW5nIG9uIHRoYXQuIFNlZSB0aGUgPGEgaHJlZj0iY29tcGFyZS5odG1sIj5GZWF0dXJlczwvYT4gcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotPGg0Pjxmb250IGNvbG9yPSIjZmYwMDAwIj5NeXRoOiBTV0lHIHdyYXBzIEMrKyBpbnRvIHRoaXMgdW51c2FibGUKLWxvdy1sZXZlbCAiQy10cmFuIiBpbnRlcmZhY2UuPC9mb250PjwvaDQ+Ci0KLTxoND5GYWN0OjwvaDQ+Ci0KLVdoZW4gd3JhcHBpbmcgQysrLCBTV0lHIDxlbT5kb2VzPC9lbT4gZ2VuZXJhdGUgYSBzZXQgb2YgbG93LWxldmVsIHByb2NlZHVyYWwKLXdyYXBwZXJzLiAgSG93ZXZlciwgdGhlc2UgYXJlIG9ubHkgdXNlZCBhcyBidWlsZGluZyBibG9ja3MgZm9yCi1jcmVhdGluZyBhIG1vcmUgYWR2YW5jZWQgaGlnaC1sZXZlbCB3cmFwcGVycyAoaW4gZmFjdCwgdXNlcnMgcmFyZWx5Ci1pbnRlcmFjdCB3aXRoIHRoaXMgbGF5ZXIgZGlyZWN0bHkpLiAgSW4gbmVhcmx5IGFsbCB0YXJnZXQgbGFuZ3VhZ2VzLAotU1dJRyB3cmFwcyBDKysgY2xhc3NlcyBpbnRvIGEgbmljZSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRoYXQKLW1pcnJvcnMgdGhlIHVuZGVybHlpbmcgQysrIGNvZGUuICBJbiBQeXRob24sIEMrKyBjbGFzc2VzCi1hcmUgd3JhcHBlZCBhcyBQeXRob24gY2xhc3NlcywgaW4gUGVybCwgQysrIGNsYXNzZXMgYXJlIHdyYXBwZWQgYXMKLVBlcmwgY2xhc3NlcywgYW5kIHNvIGZvcnRoLiAgIFRoZSBleGlzdGVuY2Ugb2YgcHJvY2VkdXJhbCB3cmFwcGVycyBpcwotb25seSBhbiBhcnRpZmFjdCBvZiBTV0lHJ3MgbGF5ZXJlZCBhcHByb2FjaCB0byB3cmFwcGVyIGNvZGUgZ2VuZXJhdGlvbi4KLQotPGg0Pjxmb250IGNvbG9yPSIjZmYwMDAwIj5NeXRoOiBTV0lHIGRvZXNuJ3Qgc3VwcG9ydCBvdmVybG9hZGVkIG1ldGhvZHMvZnVuY3Rpb25zPC9mb250PjwvaDQ+Ci0KLTxoND5GYWN0OjwvaDQ+Ci0KLVNXSUcgcHJvdmlkZXMgZnVsbCBzdXBwb3J0IGZvciBDKysgb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBmdW5jdGlvbnMuCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgZGVjbGFyYXRpb25zIGxpa2UgdGhpczoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotY2xhc3MgRm9vIHsKLXB1YmxpYzoKLSAgICAgRm9vKCk7Ci0gICAgIEZvbyhjb25zdCBGb28gJmFtcDspOwotICAgICB2b2lkIHNwYW0oaW50IHgpOwotICAgICB2b2lkIHNwYW0oZG91YmxlIHgpOwotICAgICB2b2lkIHNwYW0oY2hhciAqeCwgaW50IG4pOwotfTsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1UaGV5IGNhbiBiZSB1c2VkIGluIGEgY29tcGxldGVseSBuYXR1cmFsIHdheSBmcm9tIG1vc3QgU1dJRyBsYW5ndWFnZSBtb2R1bGVzLiAgRm9yIGV4YW1wbGUsCi1pbiBQeXRob246Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLT4+PiBmID0gRm9vKCkKLT4+PiBmLnNwYW0oMykKLT4+PiBmLnNwYW0oMy41KQotPj4+IGYuc3BhbSgiaGVsbG8iLDUpCi0+Pj4gZyA9IEZvbyhmKSAgICAgICAgICAgIyBNYWtlIGEgY29weQotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLU9yIGluIFRjbDoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJSBGb28gZgotJSBmIHNwYW0gMwotJSBmIHNwYW0gMy41Ci0lIGYgc3BhbSAiaGVsbG8iIDUKLSUgRm9vIGcgZgotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLVRoZSBTV0lHIGltcGxlbWVudGF0aW9uIG9mIG92ZXJsb2FkaW5nIHV0aWxpemVzIHR5cGUgY2F0ZWdvcmllcyBhbmQgYQotdHlwZSBwcmVjZWRlbmNlIHNjaGVtZSB0aGF0IHJlc3VsdHMgaW4gdGhlIGdlbmVyYXRpb24gb2YgZHluYW1pYwotZGlzcGF0Y2ggZnVuY3Rpb25zLiAgIFRoZSBvcmRlciBpbiB3aGljaCBkZWNsYXJhdGlvbnMgYXBwZWFyIGRvZXMgbm90IG1hdHRlciBub3IKLWRvZXMgU1dJRyByZWx5IG9uIHVucmVsaWFibGUgbWVjaGFuaXNtcyBsaWtlIHRyaWFsIGV4ZWN1dGlvbiAoaS5lLiwgdHJ5aW5nIG1ldGhvZHMKLW9uZSBieSBvbmUgdW50aWwgb25lIGhhcHBlbnMgdG8gZXhlY3V0ZSBzdWNjZXNzZnVsbHkpLiAgT3ZlcmxvYWRpbmcgc3VwcG9ydCBpbiBTV0lHCi1pcyBtb3JlIGFkdmFuY2VkIHRoYW4gdGhhdC4KLQotPFA+Ci1EdWUgdG8gdGhlIGR5bmFtaWMgbmF0dXJlIG9mIHNjcmlwdGluZyBsYW5ndWFnZXMsIGl0IGlzIG5vdCBwb3NzaWJsZSB0bwotZnVsbHkgZGlzYW1iaWd1YXRlIG92ZXJsb2FkZWQgbWV0aG9kcyB0byB0aGUgc2FtZSBkZWdyZWUgYXMgaW4gQysrLiAgCi1Gb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgZGVjbGFyYXRpb25zIGxpa2UgdGhpczoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotaW50IGZvbyhpbnQpOwotbG9uZyBmb28obG9uZyk7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotSW4gdGhpcyBjYXNlLCBTV0lHIHByb3ZpZGVzIGEgbnVtYmVyIG9mIGRpcmVjdGl2ZXMgdG8gZWl0aGVyIHJlbmFtZSBvciBpZ25vcmUKLW9uZSBvZiB0aGUgZGVjbGFyYXRpb25zLiBGb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJWlnbm9yZSBmb28obG9uZyk7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotb3IKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJXJlbmFtZShmb29fbG9uZykgZm9vKGxvbmcpOwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoND48Zm9udCBjb2xvcj0iI2ZmMDAwMCI+TXl0aDogU1dJRyBkb2Vzbid0IHN1cHBvcnQgYmFzaWMgaWRpb21hdGljIEMrKyBjb25zdHJ1Y3RzIGxpa2UgdGVtcGxhdGVzIGFuZCBzbWFydCBwb2ludGVyczwvZm9udD48L2g0PgotCi08aDQ+RmFjdDo8L2g0PgotCi1TV0lHIGZ1bGx5IHN1cHBvcnRzIHRlbXBsYXRlcy4gIEhvd2V2ZXIsIHRvIHdyYXAgYSB0ZW1wbGF0ZSBjbGFzcywgeW91IGhhdmUgdG8KLXRlbGwgU1dJRyBhYm91dCBhIHBhcnRpY3VsYXIgaW5zdGFudGlhdGlvbi4gVGhpcyBpcyBlYXN5LCBqdXN0IG1ha2Ugc3VyZSBTV0lHCi1rbm93cyBhYm91dCB0aGUgdGVtcGxhdGUgZGVmaW5pdGlvbiBhbmQgaW5jbHVkZSBhIHNwZWNpYWwgZGlyZWN0aXZlIGxpa2UgdGhpczoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJXRlbXBsYXRlKGRlcXVlX2ludCkgc3RkOjpkZXF1ZSZsdDtpbnQmZ3Q7OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLUluIHRoaXMgY2FzZSwgImRlcXVlX2ludCIgYmVjb21lcyB0aGUgdGFyZ2V0IGxhbmd1YWdlIG5hbWUgZm9yIHRoZSB3cmFwcGVkIG9iamVjdC4KLVlvdSB3b3VsZCB1c2UgaXQganVzdCBsaWtlIGEgbm9ybWFsIGNsYXNzIGluIHRoZSBleHRlbnNpb24gbW9kdWxlOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci0+Pj4gZCA9IGRlcXVlX2ludCgxMDApCi0+Pj4gZC5zaXplKCkKLTEwMAotPj4+Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotT24gdGhlIHN1YmplY3Qgb2Ygc21hcnQtcG9pbnRlcnMsIHRob3NlIGFyZSBzdXBwb3J0ZWQgdG9vLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UKLXlvdSBoYWQgc29tZSBjb2RlIGxpa2UgdGhpczoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotY2xhc3MgRm9vIHsKLXB1YmxpYzoKLSAgICAgIGludCB4OwotICAgICAgaW50IHNwYW0oaW50IHgpOwotfTsKLQotdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgY2xhc3MgU21hcnRQdHIgewotcHVibGljOgotICAgLi4uCi0gICBUICpvcGVyYXRvci0mZ3Q7KCk7Ci0gICAuLi4KLX07Ci0KLXR5cGVkZWYgU21hcnRQdHImbHQ7Rm9vJmd0OyBGb29QdHI7Ci0KLUZvb1B0ciBtYWtlX0ZvbygpOwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLVRvIHdyYXAgdGhpcyB3aXRoIFNXSUcsIGp1c3QgdGVsbCBpdCBhYm91dCBhIHRlbXBsYXRlIGluc3RhbnRpYXRpb24uIEZvciBleGFtcGxlOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci0ldGVtcGxhdGUoRm9vUHRyKSBTbWFydFB0ciZsdDtGb28mZ3Q7OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLU5vdywgaW4gdGhlIHRhcmdldCBsYW5ndWFnZSwgdGhlIHdyYXBwZXIgb2JqZWN0IHdvcmtzIGp1c3QgbGlrZSB5b3Ugd291bGQgZXhwZWN0OgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci0+Pj4gZiA9IG1ha2VfRm9vKCkKLT4+PiBmLnggPSAzCi0+Pj4gZi5zcGFtKDQyKQotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLQotPGg0Pjxmb250IGNvbG9yPSIjZmYwMDAwIj5NeXRoOiBTV0lHIGlzIGp1c3QgdG9vIGNvbmZ1c2luZyB0byB1c2U8L2ZvbnQ+PC9oND4KLQotPGg0PkZhY3Q6PC9oND4KLQotTW9zdCB1c2VycyBmaW5kIFNXSUcgdG8gYmUgcmVsYXRpdmVseSBlYXN5IHRvIHVzZS4gIEhvd2V2ZXIsIGNvbmZ1c2lvbiBjYW4gYXJpc2UKLWZyb20gdGhlIGZvbGxvd2luZzoKLQotPHVsPgotPGxpPjxwPkMgcHJvZ3JhbW1pbmcuICBUbyBlZmZlY3RpdmVseSB1c2UgU1dJRywgeW91IHNob3VsZCBoYXZlIGEgZ29vZCBncmFzcCBvZgotYmFzaWMgQyBwcm9ncmFtbWluZyBjb25jZXB0cyBsaWtlIHBvaW50ZXJzLCBhcnJheXMsIG1lbW9yeSBtYW5hZ2VtZW50LCBkYXRhIHN0cnVjdHVyZXMsCi1mdW5jdGlvbnMsIHBhcmFtZXRlciBwYXNzaW5nIHNlbWFudGljcywgYW5kIHNvIGZvcnRoLiAgU1dJRyB0cmllcyB0byBtYWtlIGl0IGVhc3kgZm9yCi1DIHByb2dyYW1tZXJzIHRvIGJ1aWxkIGV4dGVuc2lvbiBtb2R1bGVzLCBidXQgaXQgZG9lcyBub3QgdHJ5IHRvIG1ha2UgQyBwcm9ncmFtbWluZwotZWFzeS4KLQotPGxpPjxwPkMrKy4gVGhpcyBsYW5ndWFnZSBpcyBzbyBsYXJnZSBhbmQgY29tcGxpY2F0ZWQgdGhhdCBjZXJ0YWluIHBhcnRzIG9mIFNXSUcKLW1heSBub3QgbWFrZSBhbnkgc2Vuc2UgdW5sZXNzIHlvdSBhcmUgYWxzbyBmYW1pbGlhciB3aXRoIHRoZSB1bmRlcmx5aW5nIEMrKyBjb25jZXB0cy4KLQotPGxpPjxwPkR5bmFtaWMgbGlua2luZyBhbmQgc2hhcmVkIGxpYnJhcmllcy4gIFRvIGJ1aWxkIGV4dGVuc2lvbiBtb2R1bGVzLCB5b3UgdXN1YWxseQotaGF2ZSB0byBjcmVhdGUgRExMcy4gIElmIHlvdSd2ZSBuZXZlciBkb25lIHRoaXMgYmVmb3JlLCB0aGVyZSBpcyBhIHNtYWxsCi1sZWFybmluZyBjdXJ2ZSBhc3NvY2lhdGVkIHdpdGggZmluZGluZyB0aGUgcmlnaHQgY29tcGlsZXIgYW5kIGxpbmtlciBvcHRpb25zLgotCi08bGk+PHA+Q3VzdG9taXphdGlvbiBmZWF0dXJlcy4gIFNXSUcgcHJvdmlkZXMgYSBsYXJnZSBudW1iZXIgb2YgY3VzdG9taXphdGlvbiBmZWF0dXJlcyBhbmQKLW9wdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIGFsbW9zdCBhbGwgcGFydHMgb2YgdGhlIHdyYXBwZXIgZ2VuZXJhdGlvbgotcHJvY2Vzcy4gIFRoZXNlIGFyZSBwcm92aWRlZCB0byBiZXR0ZXIgc3VwcG9ydCBwb3dlciB1c2VycyBhbmQgdG8gcHJvdmlkZSB0aGUKLWZsZXhpYmlsaXR5IG5lZWRlZCB0byBzb2x2ZSBkaWZmaWN1bHQgcmVhbC13b3JsZCB3cmFwcGluZyBwcm9ibGVtcy4gIEhvd2V2ZXIsCi1ub25lIG9mIHRoaXMgaXMgbmVlZGVkIHRvIGdldCBzdGFydGVkLgotCi08L3VsPgotCi0KLQpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9uc2YuaHQgYi9zd2lnd2ViL25zZi5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0MWJlNi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL25zZi5odAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLVNXSUcgYW5kIFR5cGVzeXN0ZW1zCi0KLTxoMj5TV0lHIGFuZCBUeXBlc3lzdGVtczwvaDI+Ci0KLTxwPgotRm9yIHRoZSBwYXN0IHNldmVuIHllYXJzLCBhIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YgZWZmb3J0IGhhcyBnb25lCi1pbnRvIHRoZSBkZXZlbG9wbWVudCBvZiBTV0lHIGFuZCBpdHMgc3VwcG9ydCBmb3IgdmFyaW91cyBwcm9ncmFtbWluZwotbGFuZ3VhZ2VzLiAgQ3VycmVudGx5LCBtb3JlIHRoYW4gYSA8YSBocmVmPSJndWlsdHkuaHRtbCI+ZG96ZW4gZGV2ZWxvcGVyczwvYT4gd29yayBvbiB0aGUgc3lzdGVtCi1hbmQgdGhlcmUgYXJlIHRob3VzYW5kcyBvZiB1c2Vycy4gIEhvd2V2ZXIsIGFsbW9zdCBhbGwgb2YgU1dJRydzIGRldmVsb3BtZW50Ci1oYXMgYmVlbiByZWxhdGl2ZWx5IGFkLWhvYy0tLXByaW1hcmlseSBkcml2ZW4gYnkgZmVhdHVyZSByZXF1ZXN0cyBmcm9tCi11c2Vycy4gIEFzIFNXSUcncyBvcmlnaW5hbCBhdXRob3IsIGNvb3JkaW5hdGluZyBhbGwgb2YgdGhpcyBjaGFvcyBoYXMKLWFsd2F5cyBiZWVuIGEgYml0IG9mIGNoYWxsZW5nZS4gIEluIGZhY3QsIGl0J3MgYmVlbiByYXRoZXIgZGlmZmljdWx0IHRvIGV2ZW4KLWRlc2NyaWJlIHdoYXQgU1dJRyAiaXMiIGFuZCAiaG93IGl0IHdvcmtzIiB3aXRob3V0IHVzaW5nIHRlcm1zIGxpa2UKLSJtYWdpYyIgYW5kLCB3ZWxsLCAibW9yZSBtYWdpYy4iICAgTmVlZGxlc3MgdG8gc2F5LCB0aGlzIGlzbid0IHRoZSBtb3N0Ci1hY2FkZW1pYyB3YXkgdG8gbG9vayBpdCA7LSkuCi0KLTxwPgotQSBsaXR0bGUgb3ZlciBhIHllYXIgYWdvLCBJIGJlY2FtZSBpbnRlcmVzdGVkIGluIHRoZSByZWxhdGlvbnNoaXAKLWJldHdlZW4gU1dJRyBhbmQgd29yayBpbiB0aGUgYXJlYSBvZiB0eXBlIHN5c3RlbXMuICBJbiBvcmRlcgotdG8gc3VwcG9ydCBhZHZhbmNlZCBDKysgZmVhdHVyZXMgbGlrZSBuYW1lc3BhY2VzIGFuZCB0ZW1wbGF0ZXMsIGEKLXNpZ25pZmljYW50IGFtb3VudCBvZiB2ZXJ5IGRpZmZpY3VsdCBkZXZlbG9wbWVudCB3b3JrIGZvY3VzZWQgb24gdGhlCi1TV0lHIHR5cGUgc3lzdGVtLiAgTW9yZW92ZXIsIHRoaXMgd29yayByZXN1bHRlZCBpbiBhIGxvdCBvZiBvbGQgU1dJRwotZmVhdHVyZXMgYmVpbmcgZm9sZGVkIGludG8gdHlwZSBzeXN0ZW0gZXh0ZW5zaW9ucy4gIEJlY2F1c2Ugb2YgdGhpcwotd29yaywgSSBoYXZlIG5vdyBjb21lIHRvIHZpZXcgU1dJRyBhcyBiZWluZyBtb3N0bHkgZHJpdmVuIGFzIGFuCi1leHRlbnNpb24gb2YgdGhlIEMrKyB0eXBlIHN5c3RlbSByYXRoZXIgdGhhbiBhbiBleHRlbnNpb24gb2YgYSBDKysKLXBhcnNlci4gIFRoaXMgZGlmZmVyZW5jZSBpcyBzdWJ0bGUsIGJ1dCBpdCBpcyB0aGUgb25seSB3YXkgdG8gcmVhbGx5Ci11bmRlcnN0YW5kIGhvdyBTV0lHIHdvcmtzIGF0IGEgZnVuZGFtZW50YWwgbGV2ZWwuCi0KLTxwPgotVG8gdGhlIGJlc3Qgb2YgbXkga25vd2xlZGdlLCBubyBvbmUgd29ya2luZyBvbiBhdXRvbWF0aWMgQy9DKysgd3JhcHBlcgotZ2VuZXJhdG9ycyBoYXMgcmVhbGx5IGFwcHJvYWNoZWQgdGhlIHdyYXBwaW5nIHByb2JsZW0gZnJvbSB0aGUKLXN0YW5kcG9pbnQgb2YgdHlwZSBzeXN0ZW1zLiAgSW5zdGVhZCwgZXZlcnlvbmUgc2VlbXMgdG8gZm9jdXMgb24gdGhlIHByb2JsZW0KLW9mIDxlbT5wYXJzaW5nPC9lbT4gQysrLCB3aGljaCwgYWx0aG91Z2ggaW1wb3J0YW50LCBpcyBub3QgZW5vdWdoIHRvCi1yZWFsbHkgdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLiAgCi0KLTxwPgotU3RhcnRpbmcgaW4gdGhlIHN1bW1lciBvZiAyMDAzLCB0aGUgTlNGIHdpbGwgYmUgZnVuZGluZyBhIAotPGEgaHJlZj0iaHR0cDovL3d3dy5mYXN0bGFuZS5uc2YuZ292L3NlcnZsZXQvc2hvd2F3YXJkP2F3YXJkPTAyMzc4MzUiPnJlc2VhcmNoCi1wcm9qZWN0PC9hPiBhdCB0aGUgVW5pdmVyc2l0eSBvZiBDaGljYWdvIHRvIGV4cGxvcmUgdGhlIHJlbGF0aW9uc2hpcAotYmV0d2VlbiB0eXBlLXN5c3RlbXMgYW5kIHdyYXBwZXIgZ2VuZXJhdGlvbiBpbiBtb3JlIGRldGFpbC4gIEEgbG90IG9mCi10aGlzIHdvcmsgd2lsbCBpbnZvbHZlIFNXSUcgYW5kIHRoZSBzZW1hbnRpY3Mgb2YgaXRzIHVuZGVybHlpbmcgdHlwZQotc3lzdGVtLiAgTW9yZW92ZXIsIHRoaXMgd29yayB3aWxsIGJlIGV4cGxvcmluZyBzb21lIGV4Y2l0aW5nIG5ldwotZmVhdHVyZXMgc3VjaCBhcyBzb2Z0d2FyZSBjb250cmFjdHMgYW5kIGltcHJvdmVkIG1peGVkLWxhbmd1YWdlCi1kZWJ1Z2dpbmcgc3VwcG9ydC4gIFdlJ3JlIGFsc28gZ29pbmcgdG8gdHJ5IGFuZCBtYWtlIGNvbm5lY3Rpb25zCi1iZXR3ZWVuIFNXSUcgYW5kIHJlbGF0ZWQgd29yayBpbiB0aGUgYXJlYSBvZiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCi0KLTxwPgotV2hhdCBkb2VzIHRoaXMgbWVhbiBmb3IgdGhlIGZ1dHVyZSBvZiBTV0lHPyAgV2VsbCwgbXkgaG9wZSBpcyB0aGF0Ci10aGlzIHdvcmsgd2lsbCBtYWtlIHRoZSBzeXN0ZW0gbW9yZSBjYXBhYmxlLCBtb3JlIHJlbGlhYmxlLCBhbmQgbW9yZQotdXNlZnVsIHRoYW4gZXZlci4gIEkgdGhpbmsgZXZlcnlvbmUgd2lsbCBiZSBwbGVhc2FudGx5IHN1cnByaXNlZCB3aXRoCi1zb21lIG9mIHRoZSBjaGFuZ2VzLgotCi08cD4KLUFzIGFsd2F5cywgSSdkIGxpa2UgdG8gYWNrbm93bGVkZ2UgZXZlcnlvbmUgd2hvIGhhcyBjb250cmlidXRlZCB0byBTV0lHCi1vdmVyIHRoZSB5ZWFycy0tLXRoYW5rIHlvdSBmb3IgeW91ciBzdXBwb3J0IQotCi08cD4KLUNoZWVycywKLTxwPgotRGF2ZSBCZWF6bGV5IDxicj4KLU1hcmNoIDIzLCAyMDAzCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9QZXJsOTgvcmVhZG1lIGIvc3dpZ3dlYi9wYXBlcnMvUGVybDk4L3JlYWRtZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDIyZDhmNy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9QZXJsOTgvcmVhZG1lCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotUGVybCBFeHRlbnNpb24gQnVpbGRpbmcgd2l0aCBTV0lHCi0KLUF1dGhvcnMgOiBEYXZpZCBCZWF6bGV5Ci0gICAgICAgICAgRGF2aWQgRmxldGNoZXIKLSAgICAgICAgICBEb21pbmlxdWUgRHVtb250Ci0KLUNvbnRhY3QgOiBEYXZlIEJlYXpsZXkKLSAgICAgICAgICBiZWF6bGV5QGNzLnV0YWguZWR1Ci0gICAgICAgICAgKDgwMSkgMzU5LTU3MDUKLQotU2Vzc2lvbiA6IFBlcmwgSW50ZXJuYWxzIGFuZCBMaW5raW5nIHRvIEMKLSAgICAgICAgICBUaHVyc2RheSwgQXVndXN0IDIwLCAxOjMwIHBtLgotCi0KLVRoZSBwcmVzZW50YXRpb24gY29uc2lzdHMgb2YgYSBwYXBlciBhYm91dCBTV0lHCi1hbmQgaXRzIHVzZSB3aXRoIFBlcmwuICBUaHJlZSBmaWxlcyBhcmUgYXZhaWxhYmxlIDoKLQotc3dpZ3BlcmwuaHRtbCAgICAtICBIVE1MIFZlcnNpb24gb2YgdGhlIHBhcGVyCi1zd2lncGVybC5wcyAgICAgIC0gIFBvc3RzY3JpcHQgdmVyc2lvbiAoMiBjb2x1bW4pCi1zd2lncGVybC5wZGYgICAgIC0gIFBERiBWZXJzaW9uIG9mIHRoZSBwb3N0c2NyaXB0IHBhcGVyCi0KLVRoZSBIVE1MIHZlcnNpb24gY29udGFpbnMgbGlua3MgdG8gdGhlIHBvc3RzY3JpcHQgYW5kIFBERgotdmVyc2lvbnMuCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1Blcmw5OC9zd2lncGVybC5odG0gYi9zd2lnd2ViL3BhcGVycy9QZXJsOTgvc3dpZ3BlcmwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwM2M5Y2U4Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1Blcmw5OC9zd2lncGVybC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMTk4ICswLDAgQEAKLTxodG1sPgotPHRpdGxlPiBQZXJsIEV4dGVuc2lvbiBCdWlsZGluZyB3aXRoIFNXSUcgPC90aXRsZT4KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgotPGgxPiBQZXJsIEV4dGVuc2lvbiBCdWlsZGluZyB3aXRoIFNXSUc8L2gxPgotCi0oUHJlc2VudGVkIGF0IHRoZSBPJ1JlaWxseSBQZXJsIENvbmZlcmVuY2UgMi4wLCBBdWd1c3QgMTctMjAsIDE5OTgsIFNhbiBKb3NlLCBDYWxpZm9ybmlhLikKLTxwPgotCi08Yj4gRGF2aWQgTS4gQmVhemxleSA8L2I+IDxicj4KLTxlbT4gRGVwdC4gb2YgQ29tcHV0ZXIgU2NpZW5jZSA8YnI+Ci1Vbml2ZXJzaXR5IG9mIENoaWNhZ28gPGJyPgotQ2hpY2FnbywgSUwgIDYwNjM3IDxicj4KLTwvZW0+IAotCi08cD4KLTxiPiBEYXZpZCBGbGV0Y2hlciA8L2I+IDxicj4KLTxlbT5GdXNpb24gTWljcm9NZWRpYSwgQ29ycC4gPGJyPgotTG9uZ21vbnQsIENPIDgwNTAxIDxicj4KLTwvZW0+Ci0KLTxwPgotPGI+RG9taW5pcXVlIER1bW9udDwvYj4gPGJyPgotPGVtPiBIZXdsZXR0IFBhY2thcmQgPGJyPgotTGFiIFRJRCA8YnI+Ci01IEF2ZSBSYXltb25kIENoYW5hcyA8YnI+Ci0zODA1MyBHcmVub2JsZSBjZWRleCA8YnI+Ci1GcmFuY2UgPGJyPiA8L2VtPgotCi08cD4KLVsgPGEgaHJlZj0ic3dpZ3BlcmwucGRmIj5QREYgPC9hPiBdCi0KLTxoMj4gQWJzdHJhY3QgPC9oMj4KLQotPGVtPgotU1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKSBpcyBhIGZyZWVseSBhdmFpbGFibGUKLXRvb2wgdGhhdCBpbnRlZ3JhdGVzIFBlcmwsIFB5dGhvbiwgVGNsLCBhbmQgb3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlcwotd2l0aCBwcm9ncmFtcyB3cml0dGVuIGluIEMsIEMrKywgYW5kIE9iamVjdGl2ZS1DLiAgIFRoaXMgcGFwZXIKLXByb3ZpZGVzIGFuIGludHJvZHVjdGlvbiB0byBTV0lHIGFuZCBzaG93cyBob3cgaXQgY2FuIGJlIHVzZWQgdG8KLWNvbnN0cnVjdCBQZXJsIGV4dGVuc2lvbiBtb2R1bGVzLiAgSW4gYWRkaXRpb24sIGEgbnVtYmVyIG9mIGFwcGxpY2F0aW9ucwotaW4gd2hpY2ggU1dJRyBoYXMgYmVlbiB1dGlsaXplZCBhcmUgZGVzY3JpYmVkLiAgIFdoaWxlIFNXSUcgaXMgc2ltaWxhcgotdG8gb3RoZXIgUGVybCBleHRlbnNpb24gYnVpbGRpbmcgdG9vbHMgc3VjaCBhcyB4c3VicHAgYW5kIGgyeHMsIFNXSUcKLWhhcyBhIG51bWJlciBvZiB1bmlxdWUgZmVhdHVyZXMgdGhhdCBoZWxwIHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGNyZWF0aW5nCi1QZXJsIGV4dGVuc2lvbiBtb2R1bGVzLiAgTWFueSBvZiB0aGVzZSBmZWF0dXJlcyBhcmUgZGVzY3JpYmVkIGFzIHdlbGwgYXMKLWxpbWl0YXRpb25zIGFuZCBmdXR1cmUgZGlyZWN0aW9ucy4KLVRoaXMgcGFwZXIgaXMKLXByaW1hcmlseSBpbnRlbmRlZCBmb3IgZGV2ZWxvcGVycyB3aG8gYXJlIGludGVyZXN0ZWQgaW4gY29tYmluaW5nIFBlcmwKLXdpdGggYXBwbGljYXRpb25zIHdyaXR0ZW4gaW4gQyBvciBDKysgYXMgd2VsbCBhcyBjdXJyZW50IFNXSUcgdXNlcnMKLXdobyBhcmUgaW50ZXJlc3RlZCBpbiBsZWFybmluZyBtb3JlIGFib3V0IHNvbWUgb2YgU1dJRydzIGFkdmFuY2VkIGZlYXR1cmVzLgotPC9lbT4KLQotPGgyPiAxIEludHJvZHVjdGlvbiA8L2gyPgotCi1PbmUgb2YgUGVybCdzIGdyZWF0ZXN0IHN0cmVuZ3RocyBpcyBpdHMgYWJpbGl0eSB0byBzaW1wbGlmeSBoYXJkCi1wcm9ncmFtbWluZyB0YXNrcyBhcyB3ZWxsIGFzIGJlaW5nIGFibGUgdG8gc29sdmUgdGhlIG9kZCBhbmQgdmFyaWVkCi1jb21wdXRpbmcgcHJvYmxlbXMgdGhhdCBvY2N1ciBvbiBhIGRheS10by1kYXkgYmFzaXMuICBXaGlsZSBpdCB3b3VsZAotYmUgbmljZSB0byB1c2UgUGVybCAob3Igb3RoZXIgaGlnaC1sZXZlbCBsYW5ndWFnZXMpIGZvciBldmVyeXRoaW5nLAotdGhpcyBpcyBzaW1wbHkgbm90IHByYWN0aWNhbCBmb3IgbWFueSBhcHBsaWNhdGlvbnMuICBJbiBmYWN0LAotcGVyZm9ybWFuY2UgY3JpdGljYWwgdGFza3MsIGxvdy1sZXZlbCBzeXN0ZW1zIHByb2dyYW1taW5nLCBhbmQgCi1jb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgbGlrZWx5IHRvIGJlIGltcGxlbWVudGVkCi1pbiBhIGNvbXBpbGVkIGxhbmd1YWdlIHN1Y2ggYXMgQyBvciBDKysgKGFuZCBtYXkgYmUgZWFzaWVyIHRvIG1hbmFnZQotaW4gc3VjaCBsYW5ndWFnZXMpLiAgRnVydGhlcm1vcmUsIGRldmVsb3BlcnMgb2Z0ZW4gbmVlZCB0byB3b3JrIHdpdGggYQotd2lkZSB2YXJpZXR5IG9mIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyBhbmQgYGBsZWdhY3knJyBzeXN0ZW1zIHRoYXQKLWFyZSB3cml0dGVuIGluIHN1Y2ggbGFuZ3VhZ2VzLgotCi08cD4KLVRoZSBpbnRlZ3JhdGlvbiBvZiBQZXJsIGFuZCBjb2RlIHdyaXR0ZW4gaW4gY29tcGlsZWQgbGFuZ3VhZ2VzIGhhcyBhCi1udW1iZXIgb2YgcHJhY3RpY2FsIGJlbmVmaXRzLiAgRmlyc3QsIGl0IGFsbG93cyBleGlzdGluZyBDL0MrKwotYXBwbGljYXRpb25zIHRvIGJlIGluY29ycG9yYXRlZCBpbnRvIGEgaGlnaC1sZXZlbCBpbnRlcnByZXRlZAotZW52aXJvbm1lbnQuICBUaGlzIGVudmlyb25tZW50IHByb3ZpZGVzIGdyZWF0ZXIgZmxleGliaWxpdHkgYW5kIG9mdGVuCi1zaW1wbGlmaWVzIGRldmVsb3BtZW50IHNpbmNlIGRlYnVnZ2luZyBhbmQgdGVzdGluZyBjYW4gYmUgcGVyZm9ybWVkCi11c2luZyBQZXJsIHNjcmlwdHMuICBTZWNvbmQsIFBlcmwgY2FuIHNlcnZlIGFzIGEgcG93ZXJmdWwgdXNlcgotaW50ZXJmYWNlLiAgSW4gb3RoZXIgd29yZHMsIHJhdGhlciB0aGFuIHdyaXRpbmcgYSB1c2VyIGludGVyZmFjZQotZnJvbSBzY3JhdGNoLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgYSBQZXJsIGludGVycHJldGVyIGluc3RlYWQuCi1UaGlzIGFsc28gYWxsb3dzIG90aGVyIGZvciBvdGhlciBwb3NzaWJpbGl0aWVzIHN1Y2ggYXMgZ3JhcGhpY2FsCi11c2VyIGludGVyZmFjZSBkZXZlbG9wbWVudCB3aXRoIFBlcmwvVGsuICBGaW5hbGx5LCBQZXJsCi1wcm92aWRlcyBkZXZlbG9wZXJzIHdpdGggYSBtZWNoYW5pc20gZm9yIGFzc2VtYmxpbmcgYW5kIGNvbnRyb2xsaW5nCi1zb2Z0d2FyZSBjb21wb25lbnRzLiAgUmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBodWdlIG1vbm9saXRoaWMgcGFja2FnZSwKLUMvQysrIHByb2dyYW1zIGNhbiBiZSBwYWNrYWdlZCBhcyBjb2xsZWN0aW9ucyBvZiBQZXJsIGV4dGVuc2lvbgotbW9kdWxlcy4gIEFzIGEgcmVzdWx0LCBwcm9ncmFtcyBiZWNvbWUgbW9yZSBtb2R1bGFyIGFuZCBlYXNpZXIgdG8KLW1haW50YWluLiAgRnVydGhlcm1vcmUsIGl0IGlzIGV2ZW4gcG9zc2libGUgdG8gY29tYmluZSBlbnRpcmVseQotZGlmZmVyZW50IHByb2dyYW1zIHRvZ2V0aGVyIHdpdGhpbiBhIHNoYXJlZCBQZXJsIGludGVycHJldGVyLgotCi0KLTxwPgotVGhpcyBwYXBlciBwcm92aWRlcyBhbiBpbnRyb2R1Y3Rpb24gYW5kIG92ZXJ2aWV3IG9mIFNXSUcsIGEgdG9vbAotZGVzaWduZWQgdG8gaW50ZWdyYXRlIEMgY29kZSB3aXRoIGEgdmFyaWV0eSBvZiBzY3JpcHRpbmcKLWxhbmd1YWdlcyBpbmNsdWRpbmcgUGVybCwgUHl0aG9uLCBhbmQgVGNsLiAgQ3VycmVudGx5LCBTV0lHIGNhbgotY29uc3RydWN0IFBlcmwgZXh0ZW5zaW9uIG1vZHVsZXMgb24gVW5peCBhbmQgV2luZG93cy1OVCBzeXN0ZW1zLiBJdCBhbHNvCi1zdXBwb3J0cyB0aGUgQWN0aXZlU3RhdGUgUGVybCBmb3IgV2luZG93cyBhbmQgUGVybDQuICBTV0lHIGhhcyBiZWVuCi1mcmVlbHkgYXZhaWxhYmxlIHNpbmNlIEZlYnJ1YXJ5LCAxOTk2IGFuZCBoYXMgYmVlbgotcHJldmlvdXNseSBkZXNjcmliZWQgaW4gPGVtPkFkdmFuY2VkIFBlcmwgUHJvZ3JhbW1pbmc8L2VtPiwgPGVtPlRoZQotUGVybCBKb3VybmFsPC9lbT4sIGFuZCA8ZW0+RHIuIERvYmIncyBKb3VybmFsPC9lbT5bMSwyLDNdLgotSW4gYWRkaXRpb24sIFNXSUcgaXMgcGFja2FnZWQgd2l0aCBhIDMwMCBwYWdlIHVzZXIgbWFudWFsIGRlc2NyaWJpbmcgaXRzCi11c2UgWzRdLiBUaGUgZ29hbCBvZiB0aGlzIHBhcGVyIGlzIG5vdCB0byByZXBlYXQgYWxsIG9mIHRoaXMgaW5mb3JtYXRpb24sIGJ1dCB0byBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mCi1TV0lHLCBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHNvbWUgb2YgaXRzIG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMsIGFuZCBkZXNjcmliZQotc29tZSBvZiB0aGUgd2F5cyB0aGF0IGl0IGlzIGN1cnJlbnRseSBiZWluZyB1c2VkLiBUaGUgYXV0aG9ycyBpbmNsdWRlIHRoZSBkZXZlbG9wZXIKLW9mIFNXSUcgYW5kIHR3byBvZiBTV0lHJ3MgZm9yZW1vc3QgUGVybCBleHBlcnRzIHdobyBoYXZlIG1hZGUgc3Vic3RhbnRpYWwKLWNvbnRyaWJ1dGlvbnMgdG8gU1dJRydzIGRldmVsb3BtZW50LgotCi08aDI+IDIgUGVybCBFeHRlbnNpb24gQnVpbGRpbmcgPC9oMj4KLQotVG8gaW50ZXJmYWNlIFBlcmwgd2l0aCBjb2RlIHdyaXR0ZW4gaW4gQyBvciBDKyssIGl0IGlzCi1uZWNlc3NhcnkgdG8gd3JpdGUgd3JhcHBlcnMgdGhhdCBzZXJ2ZSBhcyBhIGdsdWUgbGF5ZXIgYmV0d2VlbgotdGhlIFBlcmwgaW50ZXJwcmV0ZXIgYW5kIHRoZSB1bmRlcmx5aW5nIEMgY29kZS4gIFRoZXNlIHdyYXBwZXJzCi1hcmUgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgZGF0YSBiZXR3ZWVuIFBlcmwgYW5kIEMsIHJlcG9ydGluZwotZXJyb3JzLCBhbmQgb3RoZXIgdGFza3MuICBQZXJsIGlzIHBhY2thZ2VkIHdpdGggc2V2ZXJhbCB0b29scwotZm9yIGNyZWF0aW5nIHRoZXNlIHdyYXBwZXJzLiAgT25lIHN1Y2ggdG9vbCBpcyA8dHQ+eHN1YnBwPC90dD4sIGEKLWNvbXBpbGVyIHRoYXQgdGFrZXMgaW50ZXJmYWNlIGRlZmluaXRpb25zIHdyaXR0ZW4gaW4gYSBzcGVjaWFsCi1sYW5ndWFnZSBrbm93biBhcyBYUyBhbmQgY29udmVydHMgdGhlbSBpbnRvIHdyYXBwZXJzLiAgIEZvciBleGFtcGxlLAotc3VwcG9zZSB0aGF0IHlvdSBoYWQgdGhlIGZvbGxvd2luZyBDIGZ1bmN0aW9uOgotCi08YmxvY2txdW90ZT48cHJlPgotaW50IGZhY3QoaW50IG4pOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UbyB3cmFwIHRoaXMgZnVuY3Rpb24gaW50byBhIFBlcmwgbW9kdWxlIHdpdGggPHR0PnhzdWJwcDwvdHQ+LCB5b3Ugd291bGQgd3JpdGUKLXRoZSBmb2xsb3dpbmcgWFMgZmlsZToKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8qIGZpbGUgOiBleGFtcGxlLnhzICovCi1leHRlcm4gaW50IGZhY3QoaW50IG4pOwotTU9EVUxFID0gRXhhbXBsZSAgICAgUEFDS0FHRSA9IEV4YW1wbGUKLWludAotZmFjdChuKQotICAgICBpbnQgICAgbgotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1XaGVuIHByb2Nlc3NlZCB3aXRoIDx0dD54c3VicHA8L3R0PiwgdGhlIGZvbGxvd2luZyB3cmFwcGVyIGZpbGUgaXMgcHJvZHVjZWQKLQotPGJsb2NrcXVvdGU+PHByZT4KLSNpbmNsdWRlICJFWFRFUk4uaCIKLSNpbmNsdWRlICJwZXJsLmgiCi0jaW5jbHVkZSAiWFNVQi5oIgotZXh0ZXJuIGludCBmYWN0KGludCBuKTsKLQotWFMoWFNfRXhhbXBsZV9mYWN0KQotewotICAgIGRYU0FSR1M7Ci0gICAgaWYgKGl0ZW1zICE9IDEpCi0gICAgICAgIGNyb2FrKCJVc2FnZTogRXhhbXBsZTo6ZmFjdChuKSIpOwotICAgIHsKLSAgICAgICAgaW50ICAgICBuID0gKGludClTdklWKFNUKDApKTsKLSAgICAgICAgaW50ICAgICBSRVRWQUw7Ci0gICAgICAgIFJFVFZBTCA9IGZhY3Qobik7Ci0gICAgICAgIFNUKDApID0gc3ZfbmV3bW9ydGFsKCk7Ci0gICAgICAgIHN2X3NldGl2KFNUKDApLCAoSVYpUkVUVkFMKTsKLSAgICB9Ci0gICAgWFNSRVRVUk4oMSk7Ci19Ci0KLVhTKGJvb3RfRXhhbXBsZSkKLXsKLSAgICBkWFNBUkdTOwotICAgIGNoYXIqIGZpbGUgPSBfX0ZJTEVfXzsKLSAgICBYU19WRVJTSU9OX0JPT1RDSEVDSyA7Ci0gICAgbmV3WFMoIkV4YW1wbGU6OmZhY3QiLCAKLSAgICAgICAgICAgWFNfRXhhbXBsZV9mYWN0LCBmaWxlKTsKLSAgICBTVCgwKSA9ICZzdl95ZXM7Ci0gICAgWFNSRVRVUk4oMSk7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRvIHVzZSB0aGUgbW9kdWxlLCB0aGUgd3JhcHBlciBjb2RlIG11c3QgYmUgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIGEKLXNoYXJlZCBsaWJyYXJ5IHRoYXQgY2FuIGJlIGR5bmFtaWNhbGx5IGxvYWRlZCBpbnRvIHRoZSBQZXJsIGludGVycHJldGVyLgotVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCB0aGUgTWFrZU1ha2VyIHV0aWxpdHkgYnkgd3JpdGluZyBhCi1zY3JpcHQgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSMgZmlsZSA6IE1ha2VmaWxlLlBMCi11c2UgRXh0VXRpbHM6Ok1ha2VNYWtlcjsKLVdyaXRlTWFrZWZpbGUoCi0gICAnTkFNRScgPSZndDsgJ0V4YW1wbGUnLAotICAgJ09CSkVDVCcgPSZndDsgJ2V4YW1wbGUubyBmYWN0Lm8nCi0pOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi10aGlzIHNjcmlwdCBpcyB0aGVuIHVzZWQgdG8gY3JlYXRlIGEgTWFrZWZpbGUgYW5kIG1vZHVsZSBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotdW5peCA+IHBlcmwgTWFrZWZpbGUuUEwKLXVuaXggPiBtYWtlCi11bml4ID4gbWFrZSBpbnN0YWxsCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUZpbmFsbHksIGluIGFkZGl0aW9uIHRvIGNyZWF0aW5nIHRoZSBDIGNvbXBvbmVudCBvZiB0aGUgZXh0ZW5zaW9uIG1vZHVsZSwKLWl0IGlzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIDx0dD4ucG08L3R0PiBmaWxlIHRoYXQgaXMgdXNlZCB0byBsb2FkCi1hbmQgaW5pdGlhbGl6ZSB0aGUgbW9kdWxlLiAgRm9yIGV4YW1wbGUsCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIGZpbGUgOiBFeGFtcGxlLnBtCi1wYWNrYWdlIEV4YW1wbGU7Ci1yZXF1aXJlIEV4cG9ydGVyOwotcmVxdWlyZSBEeW5hTG9hZGVyOwotQElTQSA9IHF3KEV4cG9ydGVyIER5bmFMb2FkZXIpOwotYm9vdHN0cmFwIEV4YW1wbGU7Ci0xOwotPC9wcmU+PC9ibG9ja3F1b3RlPiAKLQotQXQgdGhpcyBwb2ludCwgeW91IHNob3VsZCBoYXZlIGEgd29ya2luZyBQZXJsIGV4dGVuc2lvbiBtb2R1bGUuICBJbgotcHJpbmNpcGxlLCBidWlsZGluZyBhIFBlcmwgZXh0ZW5zaW9uIHJlcXVpcmVzIGFuIFhTIHNwZWNpZmljYXRpb24gZm9yCi1ldmVyeSBDIGZ1bmN0aW9uIHRoYXQgaXMgdG8gYmUgYWNjZXNzZWQuICBUbyBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZgotY3JlYXRpbmcgdGhlc2Ugc3BlY2lmaWNhdGlvbnMsIFBlcmwgaW5jbHVkZXMgPHR0PmgyeHM8L3R0PiwgYSB0b29sIHRoYXQKLWNvbnZlcnRzIEMgaGVhZGVyIGZpbGVzIHRvIFhTIGRlc2NyaXB0aW9ucy4gIFdoaWxlIHVzZWZ1bCwgPHR0PmgyeHM8L3R0PgotaXMgc29tZXdoYXQgbGltaXRlZCBpbiBpdHMgYWJpbGl0eSB0byBoYW5kbGUgZ2xvYmFsIHZhcmlhYmxlcywKLXN0cnVjdHVyZXMsIGNsYXNzZXMsIGFuZCBtb3JlIGFkdmFuY2VkIEMvQysrIGZlYXR1cmVzLiAgQXMgYSByZXN1bHQsCi08dHQ+aDJ4czwvdHQ+IGNhbiBiZSBzb21ld2hhdCBkaWZmaWN1bHQgdG8gdXNlIHdpdGggbW9yZSBjb21wbGV4Ci1hcHBsaWNhdGlvbnMuCi0KLTxoMj4gMyBTV0lHIE92ZXJ2aWV3IDwvaDI+Ci0KLUluIGEgbnV0c2hlbGwsIFNXSUcgaXMgYSBzcGVjaWFsaXplZCBjb21waWxlciB0aGF0IHRyYW5zZm9ybXMgQU5TSQotQy9DKysgZGVjbGFyYXRpb25zIGludG8gc2NyaXB0aW5nIGxhbmd1YWdlIGV4dGVuc2lvbiB3cmFwcGVycy4gIAotV2hpbGUKLXNvbWV3aGF0IHNpbWlsYXIgdG8gPHR0PmgyeHM8L3R0PiwgU1dJRyBoYXMgYSBudW1iZXIgb2YKLW5vdGFibGUgZGlmZmVyZW5jZXMuICBGaXJzdCwgU1dJRyBpcyBtdWNoIGxlc3MgaW50ZXJuYWxzIG9yaWVudGVkIHRoYW4KLVhTLiAgSW4gb3RoZXIgd29yZHMsIFNXSUcgaW50ZXJmYWNlcyBjYW4gdXN1YWxseSBiZSBjb25zdHJ1Y3RlZAotd2l0aG91dCBhbnkga25vd2xlZGdlIG9mIFBlcmwncyBpbnRlcm5hbCBvcGVyYXRpb24uICBTZWNvbmQsIFNXSUcgaXMgZGVzaWduZWQgdG8KLWJlIGV4dGVuc2libGUgYW5kIGdlbmVyYWwgcHVycG9zZS4gIEN1cnJlbnRseSwgd3JhcHBlcnMgY2FuIGJlCi1nZW5lcmF0ZWQgZm9yIFBlcmwsIFB5dGhvbiwgVGNsLCBhbmQgR3VpbGUuICBJbiBhZGRpdGlvbiwgZXhwZXJpbWVudGFsCi1tb2R1bGVzIGZvciBNQVRMQUIgYW5kIEphdmEgaGF2ZSBiZWVuIGRldmVsb3BlZC4gIEZpbmFsbHksIFNXSUcKLXN1cHBvcnRzIGEgbGFyZ2VyIHN1YnNldCBvZiBDIGFuZCBDKysgaW5jbHVkaW5nIHN0cnVjdHVyZXMsCi1jbGFzc2VzLCBnbG9iYWwgdmFyaWFibGVzLCBhbmQgaW5oZXJpdGFuY2UuICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgYSB0b3VyIG9mIFNXSUcgYW5kIGRlc2NyaWJlcyBtYW55Ci1vZiBpdHMgaW50ZXJlc3RpbmcgZmVhdHVyZXMuIAotCi08aDM+IDMuMSBBIFNtYWxsIFRhc3RlPC9oMz4KLQotQXMgYSBmaXJzdCBleGFtcGxlLCBzdXBwb3NlIHRoYXQgeW91IHdhbnRlZCB0byBidWlsZCBhIFBlcmwKLWludGVyZmFjZSB0byBUaG9tYXMgQm91dGVsbCdzIGdkIGdyYXBoaWNzIGxpYnJhcnkgW2Zvb3Rub3RlOgotVGhlIGdkIGxpYnJhcnkgaXMgYSBmcmVlbHkgYXZhaWxhYmxlIGdyYXBoaWNzIGxpYnJhcnkgZm9yCi1wcm9kdWNpbmcgR0lGIGltYWdlcyBhbmQgY2FuIGJlIG9idGFpbmVkIGF0IDx0dD4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYm91dGVsbC5jb20vZ2QvZ2QuaHRtbCI+Ci1odHRwOi8vd3d3LmJvdXRlbGwuY29tL2dkL2dkLmh0bWw8L2E+PC90dD4uICAgQSBQZXJsIG1vZHVsZSB0byBnZCwKLWRldmVsb3BlZCBieSBMaW5jb2xuIFN0ZWluLCBpcyBhbHNvIGF2YWlsYWJsZSBvbiBDUEFOIHNvCi1pbnRlcmVzdGVkIHJlYWRlcnMgYXJlIGVuY291cmFnZWQgdG8gY29tcGFyZSB0aGUgcmVzdWx0cyBvZgotdXNpbmcgU1dJRyBhZ2FpbnN0IGFuIGV4aXN0aW5nIFBlcmwgZXh0ZW5zaW9uLl0KLQotPHA+Ci1TaW5jZSBnZCBpcyBhIEMgbGlicmFyeSwKLWltYWdlcyBhcmUgbm9ybWFsbHkgY3JlYXRlZCBieSB3cml0aW5nIEMgY29kZSBzdWNoIGFzCi1mb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotI2luY2x1ZGUgImdkLmgiCi1pbnQgbWFpbigpIHsKLSAgZ2RJbWFnZVB0ciAgaW07Ci0gIEZJTEUgICAgICAgKm91dDsKLSAgaW50ICAgICAgICAgYmxrLHdodDsKLQotICAvKiBDcmVhdGUgYW4gaW1hZ2UgKi8KLSAgaW09Z2RJbWFnZUNyZWF0ZSgyMDAsMjAwKTsKLSAgCi0gIC8qIEFsbG9jYXRlIHNvbWUgY29sb3JzICovCi0gIGJsaz1nZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwwLDAsMCk7Ci0gIHdodD1nZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwyNTUsMjU1LDI1NSk7Ci0KLSAgLyogRHJhdyBhIGxpbmUgKi8KLSAgZ2RJbWFnZUxpbmUoaW0sMjAsNTAsMTgwLDE0MCx3aHQpOwotCi0gIC8qIE91dHB1dCB0aGUgaW1hZ2UgKi8KLSAgb3V0PWZvcGVuKCJ0ZXN0LmdpZiIsIndiIik7Ci0gIGdkSW1hZ2VHaWYoaW0sb3V0KTsKLSAgZmNsb3NlKG91dCk7Ci0KLSAgLyogQ2xlYW4gdXAgKi8KLSAgZ2RJbWFnZURlc3Ryb3koaW0pOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1CeSBidWlsZGluZyBhIFBlcmwgaW50ZXJmYWNlIHRvIGdkLCBvdXIgZ29hbCBpcyB0byB3cml0ZSBzaW1pbGFyIGNvZGUKLWluIFBlcmwuICBUaHVzLCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZ2QgbGlicmFyeSBtdXN0IGJlIGV4cG9zZWQgdG8KLXRoZSBQZXJsIGludGVycHJldGVyLiAgVG8gZG8gdGhpcywgYSBTV0lHIGludGVyZmFjZQotZmlsZSBjYW4gYmUgd3JpdHRlbiBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotLy8gRmlsZSA6IGdkLmkKLSVtb2R1bGUgZ2QKLSV7Ci0jaW5jbHVkZSAiZ2QuaCIKLSV9Ci0KLXR5cGVkZWYgZ2RJbWFnZSAqZ2RJbWFnZVB0cjsKLQotZ2RJbWFnZVB0ciBnZEltYWdlQ3JlYXRlKGludCBzeCwgaW50IHN5KTsKLXZvaWQgICAgICAgZ2RJbWFnZURlc3Ryb3koZ2RJbWFnZVB0ciBpbSk7Ci12b2lkICAgICAgIGdkSW1hZ2VMaW5lKGdkSW1hZ2VQdHIgaW0sIAotICAgICAgICAgICAgICAgICAgICAgIGludCB4MSwgaW50IHkxLAotICAgICAgICAgICAgICAgICAgICAgIGludCB4MiwgaW50IHkyLAotICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcik7Ci1pbnQgICBnZEltYWdlQ29sb3JBbGxvY2F0ZShnZEltYWdlUHRyIGltLAotICAgICAgICAgICAgICAgICAgICAgIGludCByLCBpbnQgZywgaW50IGIpOwotdm9pZCAgZ2RJbWFnZUdpZihnZEltYWdlUHRyIGltLCBGSUxFICpvdXQpOwotCi0vLyBGaWxlIEkvTyBmdW5jdGlvbnMgKGV4cGxhaW5lZCBzaG9ydGx5KQotRklMRSAqZm9wZW4oY2hhciAqbmFtZSwgY2hhciAqbW9kZSk7Ci12b2lkICBmY2xvc2UoRklMRSAqKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotSW4gdGhpcyBmaWxlLCB0aGUgQU5TSSBDIHByb3RvdHlwZXMgZm9yIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgd2Ugd291bGQKLWxpa2UgdG8gYWNjZXNzIGZyb20gUGVybCBhcmUgbGlzdGVkLiAKLUluIGFkZGl0aW9uLCBhIG51bWJlciBvZiBTV0lHCi1kaXJlY3RpdmVzICh3aGljaCBhcmUgYWx3YXlzIHByZWNlZGVkIGJ5IGEgYGAlJycpIGFwcGVhci4gIFRoZSA8dHQ+Ci0lbW9kdWxlPC90dD4gZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIG1vZHVsZS4gIFRoZQotPHR0PiV7LCAlfTwvdHQ+IGJsb2NrIGlzIHVzZWQgdG8gaW5zZXJ0IGxpdGVyYWwgY29kZSBpbnRvIHRoZSBvdXRwdXQKLXdyYXBwZXIgZmlsZSBbZm9vdG5vdGUgOiBUaGlzIHN5bnRheCBpcyBkZXJpdmVkIGZyb20gbGV4IGFuZCB5YWNjXS4gIEluCi10aGlzIGNhc2UsIHdlIHNpbXBseSBpbmNsdWRlIHRoZSBgYDx0dD5nZC5oPC90dD4nJyBoZWFkZXIgZmlsZS4gCi1GaW5hbGx5LCBhIGZldyBmaWxlCi1JL08gZnVuY3Rpb25zIGFsc28gYXBwZWFyLiAgV2hpbGUgbm90IHBhcnQgb2YgZ2QsIHRoZXNlIGZ1bmN0aW9ucwotYXJlIG5lZWRlZCB0byBtYW51ZmFjdHVyZSBmaWxlIGhhbmRsZXMgdXNlZCBieSBzZXZlcmFsIGdkIGZ1bmN0aW9ucy4KLQotPHA+Ci1UbyBydW4gU1dJRywgdGhlIGZvbGxvd2luZyBjb21tYW5kIGlzIGV4ZWN1dGVkOgotCi08YmxvY2txdW90ZT48cHJlPgotdW5peCAmZ3Q7IHN3aWcgLXBlcmw1IGdkLmkKLUdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIFBlcmwgNQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi0KLVRoaXMgcHJvZHVjZXMgdHdvIGZpbGVzLCA8dHQ+Z2Rfd3JhcC5jPC90dD4gYW5kCi08dHQ+Z2QucG08L3R0Pi4gIFRoZSBmaXJzdCBmaWxlIGNvbnRhaW5zIEMgd3JhcHBlcgotZnVuY3Rpb25zIHRoYXQgYXBwZWFyIHNpbWlsYXIgdG8gdGhlIG91dHB1dCB0aGF0Ci13b3VsZCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IDx0dD54c3VicHA8L3R0Pi4KLVRoZQotPHR0Pi5wbTwvdHQ+IGZpbGUgY29udGFpbnMgc3VwcG9ydGluZyBQZXJsIGNvZGUgbmVlZGVkIHRvCi1sb2FkIGFuZCB1c2UgdGhlIG1vZHVsZS4gCi0KLTxwPgotVG8gYnVpbGQgdGhlIG1vZHVsZSwKLXRoZSB3cmFwcGVyIGZpbGUgaXMgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIGEgc2hhcmVkIGxpYnJhcnkuCi1UaGlzIHByb2Nlc3MgdmFyaWVzIG9uIGV2ZXJ5IG1hY2hpbmUgKGNvbnN1bHQgdGhlIG1hbiBwYWdlcyksIGJ1dCB0aGUgZm9sbG93aW5nCi1zdGVwcyBhcmUgcGVyZm9ybWVkIG9uIExpbnV4OgotCi08YmxvY2txdW90ZT48cHJlPgotdW5peCAmZ3Q7IGdjYyAtZnBpYyAtYyBnZF93cmFwLmMgXAotICAgLURib29sPWNoYXIgXAotICAgLUkvdXNyL2xpYi9wZXJsNS9pNTg2LWxpbnV4LzUuMDA0L0NPUkUKLXVuaXggJmd0OyBnY2MgLXNoYXJlZCBnZF93cmFwLm8gLWxnZCAtbyBnZC5zbwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1BdCB0aGlzIHBvaW50LCAgdGhlIG1vZHVsZSBpcyByZWFkeSB0byB1c2UuICAgIEZvciBleGFtcGxlLAotdGhlIGVhcmxpZXIgQyBwcm9ncmFtIGNhbiBiZSBkaXJlY3RseSB0cmFuc2xhdGVkIGludG8gdGhlCi1mb2xsb3dpbmcgUGVybCBzY3JpcHQ6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIS91c3IvYmluL3BlcmwKLXVzZSBnZDsKLQotIyBDcmVhdGUgYW4gaW1hZ2UKLSRpbSA9IGdkOjpnZEltYWdlQ3JlYXRlKDIwMCwyMDApOwotCi0jIEFsbG9jYXRlIHNvbWUgY29sb3JzCi0kYmxrPWdkOjpnZEltYWdlQ29sb3JBbGxvY2F0ZSgkaW0sMCwwLDApOwotJHdodD1nZDo6Z2RJbWFnZUNvbG9yQWxsb2NhdGUoJGltLDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwyNTUpOwotCi0jIERyYXcgYSBsaW5lIAotZ2Q6OmdkSW1hZ2VMaW5lKCRpbSwyMCw1MCwxODAsMTQwLCR3aHQpOwotCi0jIE91dHB1dCB0aGUgaW1hZ2UKLSRvdXQ9Z2Q6OmZvcGVuKCJ0ZXN0LmdpZiIsIndiIik7Ci1nZDo6Z2RJbWFnZUdpZigkaW0sJG91dCk7Ci1nZDo6ZmNsb3NlKCRvdXQpOwotCi0jIENsZWFuIHVwIAotZ2Q6OmdkSW1hZ2VEZXN0cm95KCRpbSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gMy4yIElucHV0IEZpbGVzPC9oMz4KLQotSW4gdGhlIGdkIGV4YW1wbGUsIFNXSUcgd2FzIGdpdmVuIGEgc3BlY2lhbCBpbnRlcmZhY2UgZmlsZQotY29udGFpbmluZyBhIGxpc3Qgb2YgdGhlIEMgZGVjbGFyYXRpb25zIHRvIGJlIGluY2x1ZGVkCi1pbiB0aGUgUGVybCBtb2R1bGUuICBXaGVuIHdvcmtpbmcgd2l0aCBhIGxhcmdlIEMgbGlicmFyeSwgaW50ZXJmYWNlCi1maWxlcyBjYW4gb2Z0ZW4gYmUgY29uc3RydWN0ZWQgYnkgY29weWluZyBhbgotZXhpc3RpbmcgaGVhZGVyIGZpbGUgYW5kIG1vZGlmeWluZyBpdCBzbGlnaHRseS4gIEhvd2V2ZXIsIGluIHNvbWUKLWNhc2VzLCBpdCBpcyBwb3NzaWJsZSB0byBpbmNsdWRlIGEgaGVhZGVyIGZpbGUgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSVtb2R1bGUKLSV7Ci0jaW5jbHVkZSAiZ2QuaCIKLSV9Ci0KLS8vIEdyYWIgdGhlIGRlY2xhcmF0aW9ucyBmcm9tIGdkLmgKLSVpbmNsdWRlICJnZC5oIgotCi0vLyBTb21lIGZpbGUgSS9PIGZ1bmN0aW9ucwotRklMRSAqZm9wZW4oY2hhciAqbmFtZSwgY2hhciAqbW9kZSk7Ci12b2lkICBmY2xvc2UoRklMRSAqKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhlIDx0dD4laW5jbHVkZTwvdHQ+IGRpcmVjdGl2ZSB0ZWxscyBTV0lHIHRvIGluY2x1ZGUgYSBmaWxlIGFuZAotcGFyc2UgYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaXQgY29udGFpbnMuICAgSW4gdGhpcyBjYXNlLCB0aGUKLWludGVyZmFjZSB3b3VsZCBub3cgd3JhcCBldmVyeSBmdW5jdGlvbiBpbiB0aGUgZ2QgbGlicmFyeQotYXMgb3Bwb3NlZCB0byB0aGUgaGFsZi1kb3plbiBmdW5jdGlvbnMgbGlzdGVkIGluIHRoZSBmaXJzdCBleGFtcGxlLgotCi08cD4KLVNXSUcgYWxzbyBpbmNsdWRlcyBhIEMgcHJlcHJvY2Vzc29yIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1hY3JvCi1leHBhbnNpb24gYW5kIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLiAgIElmIGEgbmV3IGFwcGxpY2F0aW9uIGlzCi1iZWluZyB3cml0dGVuIHdpdGggU1dJRyBpbiBtaW5kLCBoZWFkZXIgZmlsZXMgY2FuIGJlIHdyaXR0ZW4gYXMKLWZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jaWZkZWYgU1dJRwotJW1vZHVsZSBnZAotJXsKLSNpbmNsdWRlICJnZC5oIgotJX0KLSNlbmRpZgotCi0vKiBDIGRlY2xhcmF0aW9ucyAqLwotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVdpdGggdGhpcyBhcHByb2FjaCwgdGhlIGZpbGUgY2FuIHNlcnZlIGFzIGJvdGggYSB2YWxpZCBDIGhlYWRlcgotZmlsZSBhbmQgYXMgYW4gaW50ZXJmYWNlIHNwZWNpZmljYXRpb24uICAgVGhlIDx0dD5TV0lHPC90dD4gc3ltYm9sCi1pcyBvbmx5IGRlZmluZWQgd2hlbiBTV0lHIGlzIHBhcnNpbmcgc28gc3BlY2lhbCBkaXJlY3RpdmVzIGNhbiBiZQotZWFzaWx5IGhpZGRlbiBmcm9tIHRoZSBDIGNvbXBpbGVyIGFzIG5lZWRlZC4KLQotPHA+Ci1GaW5hbGx5LCBmb3IgdGhlIHRydWx5IGxhenksIFNXSUcgY2FuIHNvbWV0aW1lcyBiZSBydW4gZGlyZWN0bHkgb24KLUMgaGVhZGVyIGFuZCBzb3VyY2UgZmlsZXMuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLSUgc3dpZyAtcGVybDUgLW1vZHVsZSBnZCBnZC5oCi0lIHN3aWcgLXBlcmw1IC1tb2R1bGUgZXhhbXBsZSBleGFtcGxlLmMKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotTW9zdCB1c2VycywgaG93ZXZlciwgdXNlIGEgbWl4IG9mIGRlZGljYXRlZCBpbnRlcmZhY2UgZmlsZXMKLWFuZCBoZWFkZXIgZmlsZXMuCi0KLTxoMz4gMy4zIERhdGEgTW9kZWw8L2gzPgotCi1UaGUgbW9zdCBjcml0aWNhbCBwYXJ0IG9mIGludGVyZmFjaW5nIFBlcmwgdG8gQyBwcm9ncmFtcyBpcwotdGhlIG1hbmFnZW1lbnQgb2YgZGF0YS4gICBTaW5jZSBQZXJsIGFuZCBDIHV0aWxpemUgYSBkaWZmZXJlbnQgc2V0IG9mCi1pbnRlcm5hbCBkYXRhdHlwZXMsIHdyYXBwZXIgZ2VuZXJhdG9ycyBhcmUgcmVzcG9uc2libGUgZm9yIHByb2R1Y2luZwotY29kZSB0aGF0IG1hcnNoYWxzIGRhdGEgYW5kIG9iamVjdHMgYmV0d2VlbiBsYW5ndWFnZXMuICAgRm9yIGZ1bmRhbWVudGFsIHR5cGVzCi1zdWNoIGFzIDx0dD5pbnQ8L3R0PiBhbmQgPHR0PmRvdWJsZTwvdHQ+IHRoZSBjb252ZXJzaW9uIHByb2Nlc3MgaXMgCi1zdHJhaWdodGZvcndhcmQuICBIb3dldmVyLCBwb2ludGVycywgYXJyYXlzLCBzdHJ1Y3R1cmVzLCBhbmQgb2JqZWN0cwotY29tcGxpY2F0ZSB0aGUgcHJvY2Vzcy4gICBGdXJ0aGVybW9yZSwgc2luY2UgbW9zdCBDL0MrKyBwcm9ncmFtcwotbWFrZSBleHRlbnNpdmUgdXNlIG9mIHRoZXNlIGRhdGF0eXBlcywgaXQgaXMgaW1wb3J0YW50IGZvciB3cmFwcGVyIGdlbmVyYXRvcnMKLXRvIHN1cHBvcnQgYXMgbWFueSBvZiB0aGVzZSBkYXRhdHlwZXMgYXMgcG9zc2libGUuCi0KLTxoND4gMy4zLjEgUG9pbnRlcnM8L2g0PgotCi1TV0lHIG1hcHMgQyBwb2ludGVycyBhbmQgQysrIHJlZmVyZW5jZXMgaW50byBQZXJsIGJsZXNzZWQgcmVmZXJlbmNlcy4gIFRoZXNlIHJlZmVyZW5jZXMKLWNvbnRhaW4gYm90aCB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgaXRzZWxmLCBwbHVzIGEgdHlwZS1zaWduYXR1cmUuCi1JbiB0aGUgZ2QgZXhhbXBsZSwgcG9pbnRlcnMgd2VyZSB1c2VkIHRvIG1hbmFnZSBib3RoIGltYWdlcwotYW5kIGZpbGVzLiAgIElmIG9uZSB3ZXJlIHRvIHByaW50IG91dCB0aGUgdmFsdWUgYSBwb2ludGVyLCBpdCB3b3VsZAotYXBwZWFyIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1nZEltYWdlUHRyPVNDQUxBUigweDgwYjk5MTQpCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVNXSUcgdXNlcyB0aGUgdHlwZS1zaWduYXR1cmUgdG8gcGVyZm9ybSBydW4tdGltZSBjaGVja2luZyBvZiBhbGwgcG9pbnRlciB2YWx1ZXMuICBUaGVzZSBjaGVja3MgZW11bGF0ZQotbWFueSBvZiB0aGUgY2hlY2tzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCBieSBhIEMgY29tcGlsZXIuIAotV2hlbiBhbiBpbnZhbGlkIFBlcmwgZGF0YXR5cGUKLW9yIHBvaW50ZXIgb2YgaW52YWxpZCB0eXBlIGlzIHVzZWQsIGEgcnVuLXRpbWUgZXJyb3IgaXMgZ2VuZXJhdGVkLiAgRm9yIGV4YW1wbGUsCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0lIHBlcmwKLXVzZSBnZDsKLSRmID0gZ2Q6OmZvcGVuKCJ0ZXN0LmdpZiIsInciKTsKLWdkOjpnZEltYWdlTGluZSgkZiwyMCw1MCwxODAsMTQwLDApOwotVHlwZSBlcnJvciBpbiBhcmd1bWVudCAxIG9mIGdkSW1hZ2VMaW5lLiAKLUV4cGVjdGVkIGdkSW1hZ2VQdHIuIGF0IC0gbGluZSAzLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UeXBlLWNoZWNraW5nIGlzIGJhc2VkIG9uIHRoZSBuYW1lIG9mIGVhY2ggZGF0YXR5cGUuICAgSG93ZXZlciwKLXRoZSB0eXBlLWNoZWNrZXIgYWxzbyBrZWVwcyB0cmFjayBvZiBDKysgaW5oZXJpdGFuY2UgaGllcmFyY2hpZXMgYW5kCi08dHQ+dHlwZWRlZjwvdHQ+IGRlZmluaXRpb25zLiAgVGh1cywgYW4gYWNjZXB0YWJsZSBwb2ludGVyIHR5cGUgaW5jbHVkZXMgYW55Ci1hbHRlcm5hdGUgbmFtZXMgdGhhdCBtaWdodCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIGEgPHR0PnR5cGVkZWY8L3R0PgotZGVjbGFyYXRpb24gYXMgd2VsbCBhcyBhbnkgZGVyaXZlZCBkYXRhdHlwZXMgaW4gQysrLgotCi08cD4KLVdoZW4gcG9pbnRlcnMgYXJlIG1hbmlwdWxhdGVkIGluIFBlcmwsIHRoZXkgYXJlIG9wYXF1ZSB2YWx1ZXMuICBUaGF0Ci1pcywgcG9pbnRlcnMgY2FuIGJlIGNyZWF0ZWQgYW5kIHBhc3NlZCBhcm91bmQgdG8gb3RoZXIgQyBmdW5jdGlvbnMsCi1idXQgdGhleSBjYW4gbm90IGJlIGRlcmVmZXJlbmNlZCBkaXJlY3RseS4gIFRodXMsIGluIHRoZSBleGFtcGxlLCBpdAotaXMgZGlmZmljdWx0IChvciBpbXByYWN0aWNhbCkgZm9yIGEgdXNlciB0byBkaXJlY3RseSBtYW5pcHVsYXRlIHRoZSBpbnRlcm5hbAotcmVwcmVzZW50YXRpb24gb2YgYW4gaW1hZ2UgZnJvbSB0aGUgUGVybCBpbnRlcnByZXRlci4gIEZ1cnRoZXJtb3JlLAotU1dJRywgYnkgZGVmYXVsdCwgaGFuZGxlcyBhbGwgcG9pbnRlcnMgaW4gYSB1bmlmb3JtIG1hbm5lci4gIFRodXMsCi1kYXRhdHlwZXMgc3VjaCBhcyA8dHQ+RklMRSAqPC90dD4gYXJlIHJlcHJlc2VudGVkIGFzIGJsZXNzZWQgcmVmZXJlbmNlcwotZXZlbiB0aG91Z2ggc3VjaCB0eXBlcyBtYXkgYXBwZWFyIHJlbWFya2FibHkgc2ltaWxhciB0byBvdGhlciBQZXJsCi1kYXRhdHlwZXMgc3VjaCBhcyBmaWxlIGhhbmRsZXMuCi0KLTxoND4gMy4zLjIgQXJyYXlzPC9oND4KLQotU1dJRyBtYXBzIGFsbCBhcnJheXMgaW50byBwb2ludGVycyB3aGVyZSB0aGUgYGB2YWx1ZScnIG9mIGFuIGFycmF5Ci1pcyBzaW1wbHkgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheS4gIFRoaXMgaXMKLXRoZSBzYW1lIG1vZGVsIHVzZWQgYnkgQyBjb21waWxlcnMgYW5kIGxpa2UgQywgU1dJRyBwZXJmb3JtcyBubwotYm91bmRzIG9yIHNpemUgY2hlY2tpbmcuICAgVGh1cywgYSBmdW5jdGlvbiBzdWNoIGFzIAotCi08YmxvY2txdW90ZT48cHJlPgotdm9pZCBmb28oZG91YmxlIGFbNF1bNF0pOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi13b3VsZCBhY2NlcHQgPGVtPmFueTwvZW0+IG9iamVjdCBvZiB0eXBlIDx0dD5kb3VibGUgKjwvdHQ+LiAgSXQgaXMKLXVwIHRvIHRoZSB1c2VyIHRvIGVuc3VyZSB0aGF0IHRoZSBwb2ludGVyIGlzIHZhbGlkIGFuZCB0aGF0IGl0Ci1wb2ludHMgdG8gbWVtb3J5IHRoYXQgaGFzIGJlZW4gcHJvcGVybHkgYWxsb2NhdGVkLgotCi08aDQ+IDMuMy4zIFN0cnVjdHVyZXMgYW5kIE9iamVjdHM8L2g0PgotCi1GaW5hbGx5LCBhbGwgc3RydWN0dXJlcyBhbmQgb2JqZWN0cyBhcmUgcmVwcmVzZW50ZWQgYXMKLXBvaW50ZXJzLiAgVGhpcyBpbmNsdWRlcyBjYXNlcyB3aGVyZSBvYmplY3RzIGFyZSBtYW5pcHVsYXRlZAotYnkgdmFsdWUuICBGb3IgZXhhbXBsZSwgdGhlIGZ1bmN0aW9ucwotCi08YmxvY2txdW90ZT48cHJlPgotZG91YmxlIGRvdF9wcm9kdWN0KFZlY3RvciBhLCBWZWN0b3IgYik7Ci1WZWN0b3IgY3Jvc3NfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi0KLWFyZSB0cmFuc2Zvcm1lZCBieSBTV0lHIGludG8gdGhlIGZvbGxvd2luZyB3cmFwcGVycyBbZm9vdG5vdGU6IFdoZW4KLUMrKyBpcyB1c2VkLCAgU1dJRyB1c2VzIHRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZCBvZgotPHR0Pm1hbGxvYzwvdHQ+XToKLQotPGJsb2NrcXVvdGU+PHByZT4KLWRvdWJsZQotd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewotICByZXR1cm4gZG90X3Byb2R1Y3QoKmEsKmIpOwotfQotVmVjdG9yICoKLXdyYXBfY3Jvc3NfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewotICBWZWN0b3IgKnI7Ci0gIHIgPSAoVmVjdG9yICopIG1hbGxvYyhzaXplb2YoVmVjdG9yKSk7Ci0gICpyID0gY3Jvc3NfcHJvZHVjdCgqYSwqYik7Ci0gIHJldHVybiByOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGUgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0cyBieSByZWZlcmVuY2UgYXZvaWRzCi10aGUgcHJvYmxlbSBvZiBtYXJzaGFsaW5nIG9iamVjdHMgYmV0d2VlbiBhIEMgYW5kIFBlcmwgcmVwcmVzZW50YXRpb24tLWEKLXByb2Nlc3MgdGhhdCB3b3VsZCBiZSBleHRyZW1lbHkgZGlmZmljdWx0IGZvcgotdmVyeSBjb21wbGljYXRlZCBDIGRhdGF0eXBlcy4gIEl0IGFsc28gcHJvdmlkZXMgYmV0dGVyIHBlcmZvcm1hbmNlCi1zaW5jZSBtYW5pcHVsYXRpbmcgcmVmZXJlbmNlcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGNvcHlpbmcgb2JqZWN0Ci1kYXRhIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gbGFuZ3VhZ2VzLiAgRmluYWxseSwgdGhlIHVzZSBvZiByZWZlcmVuY2VzIAotY2xvc2VseSBtYXRjaGVzIHRoZSB3YXkgaW4gd2hpY2ggbW9zdCBDL0MrKyBwcm9ncmFtcyBhbHJlYWR5IGhhbmRsZSAKLW9iamVjdHMuICAKLQotPHA+Ci1UaGUgZG93bnNpZGUgdG8gdGhpcyBhcHByb2FjaCBpcyB0aGF0IG9iamVjdHMgYXJlIG9wYXF1ZSBpbiBQZXJsLgotVGhpcyBwcmV2ZW50cyB1c2VycyBmcm9tIGV4YW1pbmluZyB0aGVpciBjb250ZW50cyBkaXJlY3RseS4gIEluCi1hZGRpdGlvbiwgU1dJRyB3cmFwcGVycyBvY2Nhc2lvbmFsbHkgbmVlZCB0byBwZXJmb3JtIGltcGxpY2l0IG1lbW9yeQotYWxsb2NhdGlvbnMgYXMgc2hvd24gYWJvdmUuICBJdCBpcyB1cCB0aGUgdXNlciB0byBmcmVlIHRoZSByZXNvdXJjZXMKLXVzZWQgYnkgc3VjaCBmdW5jdGlvbnMgKG9yIGxlYXJuIHRvIGxpdmUgd2l0aCBhIG1lbW9yeSBsZWFrKS4gIE9mCi1jb3Vyc2UsIHRoaXMgbmF0dXJhbGx5IGJyaW5ncyB1cyB0byB0aGUgbmV4dCB0b3BpYy4KLQotPGg0PiAzLjMuNCBNZW1vcnkgTWFuYWdlbWVudDwvaDQ+Ci0KLVNXSUcgbWFpbnRhaW5zIGEgc3RyaWN0IHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgbWFuYWdlbWVudCBvZiBQZXJsIGFuZCBDIAotb2JqZWN0cy4gIFdoaWxlIFBlcmwgdXNlcyByZWZlcmVuY2UgY291bnRpbmcgdG8ga2VlcCB0cmFjayBvZiBpdHMKLW93biBvYmplY3RzLCB0aGlzIHNjaGVtZSBpcyBub3QgZXh0ZW5kZWQgdG8gQy9DKysKLWV4dGVuc2lvbnMgY3JlYXRlZCB3aXRoIFNXSUcuICBUaHVzLCB3aGVuIFBlcmwgZGVzdHJveXMgYSBibGVzc2VkCi1yZWZlcmVuY2UgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgYSBDIHBvaW50ZXIsICBvbmx5IHRoZSBwb2ludGVyCi12YWx1ZSBkaXNhcHBlYXJzLCBub3QgdGhlIHVuZGVybHlpbmcgQyBkYXRhIHRoYXQgaXQgcG9pbnRzIHRvLgotCi08cD4KLUZyb20gYSB1c2VyIHN0YW5kcG9pbnQsIFNXSUcgZ2VuZXJhdGVkIEMvQysrIGV4dGVuc2lvbnMgZm9sbG93IHRoZQotc2FtZSBtZW1vcnkgbWFuYWdlbWVudCBydWxlcyBhcyB0aGUgdW5kZXJseWluZyBhcHBsaWNhdGlvbi4KLVRodXMsIGlmIGEgcHJvZ3JhbSByZWxpZXMgb24gPHR0Pm1hbGxvYzwvdHQ+IGFuZCA8dHQ+ZnJlZTwvdHQ+IHRvIGFsbG9jYXRlCi1hbmQgZGVhbGxvY2F0ZSBvYmplY3RzLCB0aGVzZSB3aWxsIGFsc28gYmUgdXNlZCBmcm9tIHRoZSBQZXJsCi1pbnRlcnByZXRlci4gIExpa2V3aXNlLCBhIEMrKyBleHRlbnNpb24gdHlwaWNhbGx5IHJlcXVpcmVzCi1leHBsaWNpdCBpbnZvY2F0aW9uIG9mIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuICBGdXJ0aGVybW9yZSwgZm9yCi1mdW5jdGlvbnMgdGhhdCBpbXBsaWNpdGx5IGFsbG9jYXRlIG1lbW9yeSBhcyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwKLWl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGV4cGxpY2l0bHkgZGVzdHJveSB0aGUgcmVzdWx0IHVzaW5nIDx0dD4KLWZyZWU8L3R0PiBvciBhIEMrKyBkZXN0cnVjdG9yLiBXaGlsZSBzdWNoIGEgc2NoZW1lIG1heSBzZWVtIHByb2JsZW1hdGljLAotaXQgaXMgbm8gbGVzcyBwcm9ibGVtYXRpYyB0aGFuIG1lbW9yeSBtYW5hZ2VtZW50IGluIEMgKHdoaWNoIG1heSBvcgotbWF5IG5vdCBiZSBhIGdvb2QgdGhpbmcgZGVwZW5kaW5nIG9uIHlvdXIgcG9pbnQgb2YgdmlldykuICBFdmVuIGlmCi1pdCB3ZXJlIHBvc3NpYmxlIHRvIGhhdmUgUGVybCBhdXRvbWF0aWNhbGx5IG1hbmFnZSBDL0MrKyBvYmplY3RzLCB0aGlzCi13b3VsZCBiZSBhbiBpbmhlcmVudGx5IGRhbmdlcm91cyBhZmZhaXItLWVzcGVjaWFsbHkgc2luY2UgUGVybCBoYXMgbm8KLXdheSB0byBrbm93IGhvdyBhbiB1bmRlcmx5aW5nIEMgYXBwbGljYXRpb24gcmVhbGx5IG9wZXJhdGVzLiBGdXJ0aGVybW9yZSwgaXQKLXdvdWxkIGJlIGEgZmF0YWwgZXJyb3IgZm9yIFBlcmwgdG8gZGVhbGxvY2F0ZSBvYmplY3RzIHRoYXQgd2VyZSBzdGlsbAotaW4gdXNlLgotVGhlcmVmb3JlLCBTV0lHIGxlYXZlcyBtZW1vcnkgbWFuYWdlbWVudCBsYXJnZWx5IHVwIHRoZSB1c2VyLgotCi08aDQ+IDMuMy41IFBvaW50ZXJzLCBBcnJheXMsIGFuZCBQZXJsPC9oND4KLQotQSBjb21tb24gY29uZnVzaW9uIGFtb25nIHNvbWUgbm92aWNlIHVzZXJzIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gCi1DIGRhdGF0eXBlcyBhbmQgc2ltaWxhciBQZXJsIGRhdGF0eXBlcy4gICAKLUluIHBhcnRpY3VsYXIsICBQZXJsIHJlZmVyZW5jZXMgYXJlIG5vdCB0aGUKLXNhbWUgYXMgYSBDIHBvaW50ZXJzIGFuZCBQZXJsIGFycmF5cyBhcmUgbm90IHRoZSBzYW1lIGFzIEMgYXJyYXlzLiAgRGlmZmVyZW5jZXMKLWFsc28gYXBwbHkgdG8gb3RoZXIgZGF0YXR5cGVzIHN1Y2ggYXMgZmlsZXMgKHRoaXMgaXMgdGhlIHJlYXNvbiB0aGF0Ci10aGUgc2ltcGxlIGV4YW1wbGUgaW5jbHVkZWQgcHJvdG90eXBlcyBmb3IgPHR0PmZvcGVuPC90dD4gYW5kIDx0dD5mY2xvc2U8L3R0PikuCi1UaGUgcHJpbWFyeSByZWFzb24gZm9yCi10aGVzZSBkaWZmZXJlbmNlcyBpcyB0aGF0IG9iamVjdHMgaW4gUGVybCBoYXZlIGEgZGlmZmVyZW50IGludGVybmFsCi1yZXByZXNlbnRhdGlvbiB0aGFuIG9iamVjdHMgaW4gQy4gIEZvciBleGFtcGxlLCBhIFBlcmwgYXJyYXkgaXMKLXJlcHJlc2VudGVkIGFzIGEgY29sbGVjdGlvbiBvZiByZWZlcmVuY2VzIHRvIFBlcmwgb2JqZWN0cyB3aGljaCBtYXkgYmUgb2YgbWl4ZWQKLXR5cGVzLiAgVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYXJyYXkgaXMgZW50aXJlbHkKLWRpZmZlcmVudCB0aGFuIHdoYXQgd291bGQgYmUgdXNlZCBmb3IgYSBub3JtYWwgQyBhcnJheS4gIFRoZXJlZm9yZSwgaXQKLWlzIGltcG9zc2libGUgdG8gdGFrZSBhIFBlcmwgYXJyYXkgYW5kIHBhc3MgaXQgaW4gdW5tb2RpZmllZCBmb3JtIHRvCi1hbiBhcmJpdHJhcnkgQyBmdW5jdGlvbi4KLQotPHA+Ci1UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFBlcmwgYW5kIEMgZGF0YXR5cGVzIG9mdGVuIGFyaXNlcyB3aXRoCi1DIGZ1bmN0aW9ucyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKiBQbG90IHNvbWUgcG9pbnRzICovCi12b2lkCi1wbG90cHRzKGdkSW1hZ2VQdHIgaW0sIGludCB4W10sIGludCB5W10sCi0gICAgICAgIGludCBucHRzLCAgaW50IGMpCi17Ci0gICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IG5wdHM7IGkrKykgewotICAgICAgZ2RJbWFnZVNldFBpeGVsKGltLHhbaV0seVtpXSxjKTsKLSAgIH0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi1JZGVhbGx5LCBhIHVzZXIgbWlnaHQgd2FudCB0byBwYXNzIFBlcmwgYXJyYXlzIGFzIGFyZ3VtZW50cyAKLWFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1AYSA9ICgxMCwyMCwzMCw0MCk7Ci1AYiA9ICg1MCw3MCw2MCwyMDApOwotZ2Q6OnBsb3RwdHMoJGltLFxAYSxcQGIsNCwxKTsgIyBFcnJvciEKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi1Ib3dldmVyLCB0aGlzIHNjcmlwdCBnZW5lcmF0ZXMgYSB0eXBlIGVycm9yIGluc3RlYWQgb2YgYWN0aW5nCi1hcyBvbmUgbWlnaHQgZXhwZWN0LiAgICBXaGlsZSBzdWNoIGJlaGF2aW9yIG1heSBzZWVtIHJlc3RyaWN0aXZlCi1vciBiaXphcnJlLCBTV0lHIGhhcyBiZWVuIGRlbGliZXJhdGVseSBkZXNpZ25lZCB0byBvcGVyYXRlCi1pbiB0aGlzIG1hbm5lci4gICBJbiBmYWN0LCB0aGVyZSBhcmUgZXZlbiBiZW5lZml0cyB0byB0aGlzIGFwcHJvYWNoLgotSWYgUGVybCBhcnJheXMgd2VyZSB0byBiZSB1c2VkIGFzIEMgYXJyYXlzLCBhIAotY29weSB3b3VsZCBiZSBtYWRlLCB2ZXJpZmllZCBmb3IgdHlwZS1jb3JyZWN0bmVzcywgYW5kIGRlYWxsb2NhdGVkIGV2ZXJ5IAotdGltZSBhbiBhcnJheSB3YXMgcGFzc2VkIHRvIGEgQyBmdW5jdGlvbi4gIEZvciBsYXJnZSBhcnJheXMsIHRoaXMgd291bGQKLWludHJvZHVjZSBhIHN1YnN0YW50aWFsIHBlcmZvcm1hbmNlIG92ZXJoZWFkLiAgIFNwYWNlIHJlcXVpcmVtZW50cyBhcmUKLWFsc28gYSBjb25jZXJuIGZvciBzb21lIEMgcHJvZ3JhbXMuICBGb3IgZXhhbXBsZSwgYSBudW1lcmljYWwgYXBwbGljYXRpb24KLW1pZ2h0IG1hbmlwdWxhdGUgYXJyYXlzIHdpdGggbWlsbGlvbnMgb2YgZWxlbWVudHMuICAgQ29udmVydGluZyBzdWNoCi1hcnJheXMgdG8gYW5kIGZyb20gYSBQZXJsIHJlcHJlc2VudGF0aW9uIHdvdWxkIGNsZWFybHkgaW50cm9kdWNlIHN1YnN0YW50aWFsIG1lbW9yeQotYW5kIHBlcmZvcm1hbmNlIG92ZXJoZWFkLiAgSW4gY29udHJhc3QsIG1hbmlwdWxhdGluZyBwb2ludGVycyB0byBzdWNoIGFycmF5cwotaXMgZWFzeSBhbmQgZWZmaWNpZW50LgotCi08cD4KLUl0IHNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgU1dJRyBwcm92aWRlcyBhIHZhcmlldHkgb2YgY3VzdG9taXphdGlvbiBvcHRpb25zCi10aGF0IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSBpdHMgYmVoYXZpb3IuICBJbiBmYWN0LCBvbmUgY2FuIGV2ZW4gbWFrZSBTV0lHIG1hcAotUGVybCBhcnJheXMgaW50byBDIGFycmF5cyBpZiBkZXNpcmVkLiAgVGhlcmVmb3JlLCBtb3N0IHJlc3RyaWN0aW9ucwotY2FuIGJlIGVsaW1pbmF0ZWQgd2l0aCBhIGxpdHRsZSBleHRyYSB3b3JrLiAgU29tZSBvZiB0aGVzZSBjdXN0b21pemF0aW9uIHRlY2huaXF1ZXMgYXJlCi1kZXNjcmliZWQgc2hvcnRseS4KLQotPGgzPiAzLjQgSGVscGVyIEZ1bmN0aW9ucyA8L2gzPgotCi1Tb21ldGltZXMgdGhlIFBlcmwgaW50ZXJmYWNlIGNvbnN0cnVjdGVkIGJ5IFNXSUcgaXMgbGFja2luZyBpbgotZnVuY3Rpb25hbGl0eSBvciBpcyBkaWZmaWN1bHQgdG8gdXNlLiBGb3IgZXhhbXBsZSwgaW4gdGhlIHByZXZpb3VzCi1zZWN0aW9uLCBhIGZ1bmN0aW9uIG9wZXJhdGluZyBvbiBDIGFycmF5cyB3YXMgcHJlc2VudGVkLiAgVG8gY29uc3RydWN0Ci1DIGFycmF5cyBmcm9tIFBlcmwsIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgc29tZSBhZGRpdGlvbmFsIAotZnVuY3Rpb25zIHRvIHRoZSBTV0lHIGludGVyZmFjZS4gIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgdGhlCi08dHQ+JWlubGluZTwvdHQ+IGRpcmVjdGl2ZSBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotLy8gQWRkIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgQyBhcnJheXMKLSVpbmxpbmUgJXsKLWludCAqaW50X2FycmF5KGludCBzaXplKSB7Ci0gICByZXR1cm4gKGludCAqKSBtYWxsb2Moc2l6ZW9mKGludCkqc2l6ZSk7Ci19Ci12b2lkIGludF9kZXN0cm95KGludCAqYSkgewotICAgZnJlZShhKTsKLX0KLXZvaWQgaW50X3NldChpbnQgKmEsIGludCBpLCBpbnQgdmFsKSB7Ci0gICBhW2ldID0gdmFsOwotfQotaW50IGludF9nZXQoaW50ICphLCBpbnQgaSkgewotICAgcmV0dXJuIGFbaV07Ci19Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1XaGVuIFNXSUcgYnVpbGRzIHRoZSBzY3JpcHRpbmcgaW50ZXJmYWNlLCB0aGVzZSBmdW5jdGlvbnMKLWJlY29tZSBwYXJ0IG9mIHRoZSBleHRlbnNpb24gbW9kdWxlIGFuZCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotIyBDb252ZXJ0IGEgUGVybCBhcnJheSBpbnRvIGEgQyBpbnQgYXJyYXkKLXN1YiBjcmVhdGVfYXJyYXkgewotICRsZW4gPSBzY2FsYXIoQF8pOwotICRpYSA9IGdkOjppbnRfYXJyYXkoJGxlbik7Ci0gZm9yICgkaSA9IDA7ICRpICZsdDsgJGxlbjsgJGkrKykgewotICAgIHZhbCA9IHNoaWZ0OwotICAgIGdkOjppbnRfc2V0KCRpYSwkaSwkdmFsKTsKLSB9Ci0gcmV0dXJuICRpYTsKLX0KLSAgIAotQGEgPSAoMTAsMjAsMzAsNDApOwotQGIgPSAoNTAsNzAsNjAsMjAwKTsKLSRpYSA9IGNyZWF0ZV9hcnJheShAYSk7ICAjIENyZWF0ZSBDIGFycmF5cwotJGliID0gY3JlYXRlX2FycmF5KEBiKTsKLWdkOjpwbG90cHRzKCRpbSwkaWEsJGliLDQsMSk7Ci0uLi4KLWdkOjppbnRfZGVzdHJveSgkaWEpOwotZ2Q6OmludF9kZXN0cm95KCRpYik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gMy41IENsYXNzZXMgYW5kIFN0cnVjdHVyZXM8L2gzPgotCi1XaGlsZSBTV0lHIHJlcHJlc2VudHMgYWxsIG9iamVjdHMgYXMgb3BhcXVlIHBvaW50ZXJzLCB0aGUKLWNvbnRlbnRzIG9mIGFuIG9iamVjdCBjYW4gYmUgZXhhbWluZWQgYW5kIG1vZGlmaWVkIHRocm91Z2gKLXRoZSB1c2Ugb2YgYWNjZXNzb3IgZnVuY3Rpb25zIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKiBFeHRyYWN0IGRhdGEgZnJvbSBhbiBvYmplY3QgKi8KLWRvdWJsZSBQb2ludF94X2dldChQb2ludCAqcCkgewotICAgIHJldHVybiBwLSZndDt4OwotfQotLyogSW52b2tlIGEgQysrIG1lbWJlciBmdW5jdGlvbiAqLwotaW50IEZvb19iYXIoRm9vICpmKSB7Ci0gICAgcmV0dXJuIGYtJmd0O2JhcigpOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1Gcm9tIGEgUGVybCBzY3JpcHQsIGEgdXNlciBzaW1wbHkgcGFzc2VzIGFuIG9iamVjdCBwb2ludGVyCi10byBhY2Nlc3NvciBmdW5jdGlvbnMgdG8gZXh0cmFjdCBpbnRlcm5hbCBpbmZvcm1hdGlvbgotb3IgaW52b2tlIG1lbWJlciBmdW5jdGlvbnMuCi0KLTxwPgotV2hpbGUgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgYWNjZXNzb3IgZnVuY3Rpb25zCi1tYW51YWxseSwgU1dJRyBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgdGhlbSB3aGVuIGl0IGlzCi1naXZlbiBzdHJ1Y3R1cmUgYW5kIGNsYXNzIGRlZmluaXRpb25zLiBGb3IgZXhhbXBsZSwgaW4gdGhlIGdkIGxpYnJhcnksIHRoZQotZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGNvbnRhaW4gaW1hZ2UgaW5mb3JtYXRpb246Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci10eXBlZGVmIHN0cnVjdCBnZEltYWdlU3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqKiBwaXhlbHM7Ci0gICAgICAgIGludCBzeDsKLSAgICAgICAgaW50IHN5OwotICAgICAgICBpbnQgY29sb3JzVG90YWw7Ci0uLi4KLX0gZ2RJbWFnZTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotSWYgdGhpcyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiB3ZXJlIHBsYWNlZCBpbiB0aGUgU1dJRwotaW50ZXJmYWNlIGZpbGUsIGFjY2Vzc29yIGZ1bmN0aW9ucyB3b3VsZCBhdXRvbWF0aWNhbGx5IGJlCi1jcmVhdGVkLiAgVGhlc2UgY291bGQgdGhlbiBiZSB1c2VkIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24KLWFib3V0IGltYWdlcyBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotIyEvdXNyL2Jpbi9wZXJsCi11c2UgZ2Q7Ci0kaW0gPSBnZDo6Z2RJbWFnZUNyZWF0ZSg0MDAsMzAwKTsKLSMgUHJpbnQgb3V0IHRoZSBpbWFnZSB3aWR0aAotcHJpbnQgZ2Q6OmdkSW1hZ2Vfc3hfZ2V0KCRpbSksICJcbiI7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUFjY2Vzc29yIGZ1bmN0aW9ucyBhcmUgYWxzbyBjcmVhdGVkIGZvciBDKysgY2xhc3NlcyBhbmQgT2JqZWN0aXZlLUMKLWludGVyZmFjZXMuICBGb3IgZXhhbXBsZSwgdGhlIGNsYXNzIGRlZmluaXRpb24KLQotPGJsb2NrcXVvdGU+PHByZT4KLWNsYXNzIExpc3QgewotcHVibGljOgotICAgTGlzdCgpOwotICB+TGlzdCgpOwotICAgdm9pZCBpbnNlcnQoT2JqZWN0ICopOwotICAgT2JqZWN0ICpnZXQoaW50IGkpOwotICAgaW50ICBsZW5ndGgoKTsKLSAgIC4uLgotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotaXMgdHJhbnNsYXRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgYWNjZXNzb3IgZnVuY3Rpb25zOgotCi08YmxvY2txdW90ZT48cHJlPgotTGlzdCAqbmV3X0xpc3QoKSB7Ci0gICByZXR1cm4gbmV3IExpc3Q7Ci19Ci12b2lkIGRlbGV0ZV9MaXN0KExpc3QgKmwpIHsKLSAgIGRlbGV0ZSBsOwotfQotdm9pZCBMaXN0X2luc2VydChMaXN0ICpsLCBPYmplY3QgKm8pIHsKLSAgIGwtJmd0O2luc2VydChvKTsKLX0gCi0uLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGgzPiAzLjYgU2hhZG93IENsYXNzZXMgYW5kIFBlcmwgT2JqZWN0czwvaDM+Ci0KLUFzIGFuIG9wdGlvbmFsIGZlYXR1cmUsIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgY3JlYXRlZCBieSBTV0lHIGNhbiBiZQotdXNlZCB0byB3cml0ZSBQZXJsIHdyYXBwZXIgY2xhc3NlcyAodGhpcyBpcyBlbmFibGVkIGJ5IHJ1bm5pbmcgU1dJRwotd2l0aCB0aGUgPHR0Pi1zaGFkb3c8L3R0PiBvcHRpb24pLiAgV2hpbGUgYWxsIHRoZSBnb3J5IGRldGFpbHMgY2FuIGJlCi1mb3VuZCBpbiB0aGUgU1dJRyBVc2VycyBNYW51YWwsIHRoZSBnZW5lcmFsIGlkZWEgaXMgdGhhdCB0aGUgYWNjZXNzb3IKLWZ1bmN0aW9ucyBjYW4gYmUgZW5jYXBzdWxhdGVkIGluCi1hIFBlcmwgY2xhc3MgdGhhdCBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSB1bmRlcmx5aW5nIG9iamVjdC4gIEZvciBleGFtcGxlLAotCi08YmxvY2txdW90ZT48cHJlPgotCi1wYWNrYWdlIExpc3Q7Ci1ASVNBID0gcXcoIGV4YW1wbGUgKTsKLXN1YiBuZXcgewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgbXkgQGFyZ3MgPSBAXzsKLSAgICAkc2VsZiA9IG5ld19MaXN0KEBhcmdzKTsKLSAgICByZXR1cm4gdW5kZWYgaWYgKCFkZWZpbmVkKCRzZWxmKSk7Ci0gICAgYmxlc3MgJHNlbGYsICJMaXN0IjsKLSAgICBteSAlcmV0dmFsOwotICAgIHRpZSAlcmV0dmFsLCAiTGlzdCIsICRzZWxmOwotICAgIHJldHVybiBibGVzcyBcJXJldHZhbCwiTGlzdCI7Ci19Ci1zdWIgREVTVFJPWSB7Ci0gICAgZGVsZXRlX0xpc3QoQF8pOwotfQotc3ViIGluc2VydCB7Ci0gICAgcmV0dXJuICRyZXN1bHQgPSBMaXN0X2luc2VydChAXyk7Ci19Ci0uLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgdW5kZXJseWluZyBvYmplY3QgYW5kCi1pcyBzYWlkIHRvIGBgc2hhZG93JycgdGhlIG9yaWdpbmFsIG9iamVjdC4gCi1TaGFkb3cgY2xhc3NlcyBhbGxvdyBDIGFuZCBDKysgb2JqZWN0cyB0byBiZSB1c2VkIGZyb20gUGVybAotaW4gYSBuYXR1cmFsIG1hbm5lci4gIEZvciBleGFtcGxlLAotCi08YmxvY2txdW90ZT48cHJlPgotJGwgPSBuZXcgTGlzdDsKLSRsLSZndDtpbnNlcnQoJG8pOwotLi4uCi0kbC0mZ3Q7REVTVFJPWSgpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1Gb3IgQyBzdHJ1Y3R1cmVzLCBhY2Nlc3MgdG8gdmFyaW91cyBhdHRyaWJ1dGVzIGFyZSBwcm92aWRlZCB0aHJvdWdoCi10aWVkIGhhc2ggdGFibGVzLiAgRm9yIHRoZSBnZCBsaWJyYXJ5LCBtZW1iZXJzIG9mIHRoZQotaW1hZ2UgZGF0YSBzdHJ1Y3R1cmUgY291bGQgYmUgYWNjZXNzZWQgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSRpbSA9IGdkOjpnZEltYWdlQ3JlYXRlKDQwMCw0MDApOwotJHdpZHRoID0gJGltLSZndDt7c3h9OwotJGhlaWdodCA9ICRpbS0mZ3Q7e3N5fTsKLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGUgb3RoZXIgc2lnbmlmaWNhbnQgYXNwZWN0IG9mIHNoYWRvdyBjbGFzc2VzIGlzIHRoYXQgdGhleSBhbGxvdyBQZXJsCi10byBwZXJmb3JtIGEgbGltaXRlZCBmb3JtIG9mIGF1dG9tYXRpYyBtZW1vcnkgbWFuYWdlbWVudCBmb3IgQy9DKysKLW9iamVjdHMuICBJZiBhbiBvYmplY3QgaXMgY3JlYXRlZCBmcm9tIFBlcmwgdXNpbmcgYSBzaGFkb3cgY2xhc3MsIHRoZQotPHR0PkRFU1RST1k8L3R0PiBtZXRob2Qgb2YgdGhhdCBjbGFzcyBhdXRvbWF0aWNhbGx5IGludm9rZXMgdGhlIEMrKwotZGVzdHJ1Y3RvciB3aGVuIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkLiAgQXMgYSByZXN1bHQsIEMvQysrIG9iamVjdHMKLXdyYXBwZWQgYnkgc2hhZG93IGNsYXNzZXMgY2FuIGJlIG1hbmFnZWQgdXNpbmcgdGhlIHNhbWUgcmVmZXJlbmNlIGNvdW50aW5nCi1zY2hlbWUgdXRpbGl6ZWQgYnkgb3RoZXIgUGVybCBkYXRhdHlwZXMuCi0KLTxoMz4gMy43IENsYXNzIEV4dGVuc2lvbjwvaDM+Ci0KLVdoZW4gYnVpbGRpbmcgb2JqZWN0LW9yaWVudGVkIFBlcmwgaW50ZXJmYWNlcywgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bAotdG8gbW9kaWZ5IG9yIGV4dGVuZCBvYmplY3RzIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gICBGb3IgZXhhbXBsZSwKLXRoZSBnZCBsaWJyYXJ5IGRlZmluZXMgdGhlIGZvbGxvd2luZyBkYXRhIHN0cnVjdHVyZSBmb3IgZGVmaW5pbmcgcG9pbnRzOgotCi08YmxvY2txdW90ZT48cHJlPgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCB4LHk7Ci19IGdkUG9pbnQ7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLQotVG8gbWFrZSB0aGlzIHN0cnVjdHVyZSBtb3JlIHVzZWZ1bCwgd2UgY2FuIGFkZCBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLAotYW5kIHZhcmlvdXMgbWV0aG9kcyB0byBpdCAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGltcGxlbWVudGVkIGluIEMgb3IKLUMrKykuICBUbyBkbyB0aGlzLCB0aGUgU1dJRyA8dHQ+JWFkZG1ldGhvZHM8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8qIEFkZCBzb21lIG1ldGhvZHMgdG8gcG9pbnRzICovCi0lYWRkbWV0aG9kcyBnZFBvaW50IHsKLS8qIENyZWF0ZSBhIHBvaW50IG9yIGFuIGFycmF5IG9mIHBvaW50cyAqLwotZ2RQb2ludChpbnQgbnB0cyA9IDEpIHsKLSAgcmV0dXJuIChnZFBvaW50ICopIAotICAgICAgbWFsbG9jKHNpemVvZihnZFBvaW50KSpucHRzKTsKLX0KLS8qIERlc3Ryb3kgYSBwb2ludCAqLwotfmdkUG9pbnQoKSB7Ci0gIGZyZWUoc2VsZik7Ci19Ci0vKiBBcnJheSBpbmRleGluZyAqLwotZ2RQb2ludCAqZ2V0KGludCBpKSB7Ci0gIHJldHVybiBzZWxmK2k7Ci19Ci0vKiBBIGRlYnVnZ2luZyBmdW5jdGlvbiAqLwotdm9pZCBvdXRwdXQoKSB7Ci0gIHByaW50ZigiKCVkLCVkKVxuIixzZWxmLSZndDt4LHNlbGYtJmd0O3kpOwotfQotfTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotTm93LCBpbiB0aGUgUGVybCBpbnRlcmZhY2UgPHR0PmdkUG9pbnQ8L3R0PiB3aWxsIGFwcGVhciBqdXN0IGxpa2UgYSAKLWNsYXNzIHdpdGggY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywgYW5kIG1ldGhvZHMuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLSMgQ3JlYXRlIGEgcG9pbnQKLSRwdCA9IG5ldyBnZFBvaW50OwotJHB0LSZndDt7eH0gPSAyMDsKLSRwdC0mZ3Q7e3l9ID0gNTA7Ci0kcHQtJmd0O291dHB1dCgpOwotCi0jIENyZWF0ZSBhbiBhcnJheSBvZiBwb2ludHMKLSRwdHMgPSBuZXcgZ2RQb2ludCgxMCk7Ci1mb3IgKCRpID0gMDsgJGkgJmx0OyAxMDsgJGkrKykgewotICAgJHAgPSAkcHRzLSZndDtnZXQoJGkpOwotICAgJHAtJmd0O3t4fSA9ICRpOwotICAgJHAtJmd0O3t5fSA9IDEwKiRpOwotfQotCi0jIFBhc3MgdGhlIHBvaW50cyB0byBhIGZ1bmN0aW9uCi1nZDo6Z2RJbWFnZVBvbHlnb24oJGltLCRwdHMsMTAsMSk7Ci0uLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhlIGNsYXNzIGV4dGVuc2lvbiBtZWNoYW5pc20gaXMgYWxzbyBhIHBvd2VyZnVsCi13YXkgdG8gcmVwYWNrYWdlIGV4aXN0aW5nIGZ1bmN0aW9uYWxpdHkuICBGb3IgZXhhbXBsZSwgdGhlCi08dHQ+Z2RJbWFnZTwvdHQ+IHN0cnVjdHVyZSBhbmQgdmFyaW91cyBmdW5jdGlvbnMgaW4gdGhlIGdkIGxpYnJhcnkKLWNvdWxkIGJlIGNvbWJpbmVkIGludG8gYSBQZXJsIGNsYXNzIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0lYWRkbWV0aG9kcyBnZEltYWdlIHsKLWdkSW1hZ2UoaW50IHcsIGludCBoKSB7Ci0gIHJldHVybiBnZEltYWdlQ3JlYXRlKHcsaCk7Ci19Ci1+Z2RJbWFnZSgpIHsKLSAgZ2RJbWFnZURlc3Ryb3koc2VsZik7Ci19Ci1pbnQKLWNvbG9yQWxsb2NhdGUoaW50IHIsIGludCBnLCBpbnQgYikgewotICByZXR1cm4gZ2RJbWFnZUNvbG9yQWxsb2NhdGUoc2VsZixyLGcsYik7Ci19Ci12b2lkCi1saW5lKGludCB4MSxpbnQgeTEsaW50IHgyLGludCB5MixpbnQgYykgewotICBnZEltYWdlTGluZShzZWxmLHgxLHkxLHgyLHkyLGMpOwotfQotLi4uCi19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1Vc2VycyBjYW4gbm93IHdyaXRlIHNjcmlwdHMgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSMhL3Vzci9iaW4vcGVybAotdXNlIGdkOwotJGltID0gbmV3IGdkSW1hZ2UoNDAwLDQwMCk7Ci0kYmxhY2sgPSAkaW0tJmd0O2NvbG9yQWxsb2NhdGUoMCwwLDApOwotJHdoaXRlID0gJGltLSZndDtjb2xvckFsbG9jYXRlKDI1NSwyNTUsMjU1KTsKLSRpbS0mZ3Q7bGluZSgyMCw1MCwxODAsMTQwLCR3aGl0ZSk7Ci0uLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotV2l0aCB0aGVzZSBzaW1wbGUgbW9kaWZpY2F0aW9ucywgb3VyIGludGVyZmFjZSBpcyBhbHJlYWR5Ci1sb29raW5nIHJlbWFya2FibHkgc2ltaWxhciB0byB0aGF0IHVzZWQgaW4gdGhlIEdEIG1vZHVsZQotb24gQ1BBTi4gIEhvd2V2ZXIsIG1vcmUgaW1wcm92ZW1lbnRzIHdpbGwgYmUgZGVzY3JpYmVkIHNob3J0bHkuCi0KLTxoMz4gMy44IEFjY2VzcyBDb250cm9sIGFuZCBOYW1pbmc8L2gzPgotCi1JbiBjZXJ0YWluIGluc3RhbmNlcywgaXQgbWF5IGJlIHVzZWZ1bCB0byByZXN0cmljdCBhY2Nlc3MgdG8KLWNlcnRhaW4gdmFyaWFibGVzIGFuZCBjbGFzcyBtZW1iZXJzLiAgIEhpZGluZyBvYmplY3RzIGlzIGVhc3ktLXNpbXBseQotcmVtb3ZlIHRoZW0gZnJvbSB0aGUgaW50ZXJmYWNlIGZpbGUuICAgUHJvdmlkaW5nIHJlYWQtb25seSBhY2Nlc3MgY2FuCi1iZSBhY2NvbXBsaXNoZWQgdXNpbmcgdGhlIDx0dD4lcmVhZG9ubHk8L3R0PiBhbmQKLTx0dD4lcmVhZHdyaXRlPC90dD4gZGlyZWN0aXZlcy4gIEZvciBleGFtcGxlLAotCi08YmxvY2txdW90ZT48cHJlPgotLy8gQ3JlYXRlIHJlYWQtb25seSB2YXJpYWJsZXMKLSVyZWFkb25seQotaW50IGZvbzsgICAgICAgICAvLyBSZWFkLW9ubHkKLWRvdWJsZSBiYXI7ICAgICAgLy8gUmVhZC1vbmx5Ci0lcmVhZHdyaXRlCi0KLS8vIENyZWF0ZSByZWFkLW9ubHkgY2xhc3MgbWVtYmVycwotY2xhc3MgTGlzdCB7Ci0uLi4KLSVyZWFkb25seQotICAgIGludCBsZW5ndGg7ICAvLyBSZWFkLW9ubHkgbWVtYmVyCi0lcmVhZHdyaXRlCi0uLi4KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi1XaGVuIHJlYWQtb25seSBtb2RlIGlzIHVzZWQsIGF0dGVtcHRzIHRvIG1vZGlmeSBhIHZhbHVlIGZyb20KLVBlcmwgcmVzdWx0IGluIGEgcnVuLXRpbWUgZXJyb3IuCi0KLTxwPgotQW5vdGhlciBjb21tb24gcHJvYmxlbSBpcyBjaGFuZ2luZyB0aGUgbmFtZSBvZiB2YXJpb3VzIEMgZGVjbGFyYXRpb25zLgotRm9yIGV4YW1wbGUsIGEgQyBmdW5jdGlvbiBuYW1lIG1heSBjb25mbGljdCB3aXRoIGFuIGV4aXN0aW5nIFBlcmwga2V5d29yZCBvciBzdWJyb3V0aW5lLiAgVG8KLWZpeCB0aGlzIHByb2JsZW0sIHRoZSA8dHQ+JW5hbWU8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLSVuYW1lKGNwYWNrKSB2b2lkIHBhY2soT2JqZWN0ICopOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi0KLWNyZWF0ZXMgYSBuZXcgY29tbWFuZCBgYGNwYWNrLicnICAgSWYgbmFtZSBjb25mbGljdHMgb2NjdXIgcmVwZWF0ZWRseSwKLXRoZSA8dHQ+JXJlbmFtZTwvdHQ+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgYWxsIGZ1dHVyZSBvY2N1cnJlbmNlcwotb2YgYSBwYXJ0aWN1bGFyIGlkZW50aWZpZXIgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSVyZW5hbWUgcGFjayBjcGFjazsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhlIHJlbmFtaW5nIG9wZXJhdGlvbnMgY2FuIGFsc28gYmUgYXBwbGllZCB0byBDL0MrKyBjbGFzcyBhbmQgc3RydWN0dXJlCi1uYW1lcyBhcyBuZWVkZWQuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLSVuYW1lKEltYWdlKSBjbGFzcyBnZEltYWdlIHsKLS4uLgotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08aDM+IDMuOSBFeGNlcHRpb24gSGFuZGxpbmcgPC9oMz4KLQotVG8gY2F0Y2ggZXJyb3JzLCBTV0lHIGFsbG93cyB1c2VycyB0byBjcmVhdGUgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbgotaGFuZGxlcnMgdXNpbmcgdGhlIDx0dD4lZXhjZXB0PC90dD4gZGlyZWN0aXZlLiAgVGhlc2UgaGFuZGxlcnMgYXJlCi1yZXNwb25zaWJsZSBmb3IgY2F0Y2hpbmcgYW5kIGNvbnZlcnRpbmcgQy9DKysgcnVudGltZSBlcnJvcnMgaW50byBQZXJsCi1lcnJvcnMuICBBcyBhbiBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGVycm9yIGhhbmRsZXIgY2FuIGJlIHVzZWQgdG8KLWNhdGNoIGVycm9ycyBpbiB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5OgotCi08YmxvY2txdW90ZT48cHJlPgotJWV4Y2VwdChwZXJsNSkgewotICAgZXJybm8gPSAwOwotICAgJGZ1bmN0aW9uCi0gICBpZiAoZXJybm8pIHsKLSAgICAgIGRpZShzdHJlcnJvcihlcnJubykpOwotICAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1XaGVuIGRlZmluZWQsIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBwbGFjZWQgaW50byBhbGwgb2YgdGhlCi13cmFwcGVyIGZ1bmN0aW9ucy4gSW4gdGhlIHByb2Nlc3MsIHRoZSA8dHQ+Ci0kZnVuY3Rpb248L3R0PiB0b2tlbiBpcyByZXBsYWNlZCBieSB0aGUgYWN0dWFsIEMgZnVuY3Rpb24gY2FsbC4gIEZvciB0aGUKLWV4YW1wbGUgc2hvd24sIHRoZSBleGNlcHRpb24gaGFuZGxlciByZXNldHMgdGhlIDx0dD5lcnJubzwvdHQ+IHZhcmlhYmxlCi1hbmQgY2FsbHMgdGhlIEMgZnVuY3Rpb24uICBJZiB0aGUgdmFsdWUgb2YgPHR0PmVycm5vPC90dD4gaXMgbW9kaWZpZWQgdG8KLWEgbm9uLXplcm8gdmFsdWUsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZXh0cmFjdGVkIGZyb20gdGhlIEMgbGlicmFyeQotYW5kIHJlcG9ydGVkIGJhY2sgdG8gUGVybC4gICAKLQotPHA+Ci1XaGlsZSBjYXRjaGluZwotZXJyb3JzIGluIHRoZSBDIGxpYnJhcnkgaGFzIGJlZW4gaWxsdXN0cmF0ZWQsIGV4Y2VwdGlvbiBoYW5kbGVycwotY2FuIGFsc28gYmUgd3JpdHRlbiB0byBjYXRjaCBDKysgZXhjZXB0aW9ucyBvciB0byB1c2UgYW55Ci1zcGVjaWFsIHB1cnBvc2UgZXJyb3IgaGFuZGxpbmcgY29kZSB0aGF0IG1pZ2h0IGJlIHByZXNlbnQgaW4gYW4KLWFwcGxpY2F0aW9uLgotCi08aDM+IDMuMTAgVHlwZW1hcHM8L2gzPgotCi1UeXBlbWFwcyBhcmUgb25lIG9mIFNXSUcncyBtb3N0IHBvd2VyZnVsIGZlYXR1cmVzIGFuZCB0aGUgcHJpbWFyeQotbWVhbnMgb2YgY3VzdG9taXphdGlvbi4gIFNpbXBseSBzdGF0ZWQsIGEKLXR5cGVtYXAgaXMgYSBzbWFsbCBiaXQgb2YgQyBjb2RlIHRoYXQgY2FuIGJlIGdpdmVuIHRvIFNXSUcgdG8gbW9kaWZ5Ci10aGUgd2F5IHRoYXQgaXQgcHJvY2Vzc2VzIHNwZWNpZmljIGRhdGF0eXBlcy4gIAotRm9yIGluc3RhbmNlLCBQZXJsIGFycmF5cyBjYW4gYmUgY29udmVydGVkIGludG8gQyBhcnJheXMsIFBlcmwKLXJlZmVyZW5jZXMgY2FuIGJlIHN1YnN0aXR1dGVkIGZvciBwb2ludGVycywgYW5kIHNvIGZvcnRoLiAgVGhpcwotc2VjdGlvbiBicmllZmx5IGludHJvZHVjZXMgdHlwZW1hcHMgYW5kIHRoZWlyIHVzZS4gIEhvd2V2ZXIsIHR5cGVtYXBzCi1hcmUgYSBjb21wbGljYXRlZCB0b3BpYyBzbyBpdCBpcyBpbXBvc3NpYmxlIHRvIGNvdmVyIGFsbCBvZiB0aGUgZGV0YWlscwotaGVyZSBhbmQgaW50ZXJlc3RlZCByZWFkZXJzIGFyZSBzdHJvbmdseSBhZHZpc2VkIHRvIGNvbnN1bHQgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbi4KLQotPGg0PiAzLjEwLjEgRXhhbXBsZTogT3V0cHV0IFZhbHVlczwvaDQ+Ci0KLUFzIGEgZmlyc3QgdHlwZW1hcCBleGFtcGxlLCBjb25zaWRlciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB2YWx1ZXMgdGhyb3VnaCBpdHMKLXBhcmFtZXRlcnMgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXZvaWQKLWltYWdlc2l6ZShnZEltYWdlUHRyIGltLCBpbnQgKncsIGludCAqaCkgewotICAgICp3ID0gZ2RJbWFnZVNYKGltKTsKLSAgICAqaCA9IGdkSW1hZ2VTWShpbSk7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUFzIGlzLCB0aGlzIGZ1bmN0aW9uIHdvdWxkIGJlIGRpZmZpY3VsdCB0byB1c2UgYmVjYXVzZSB0aGUKLXVzZXIgbXVzdCB3cml0ZSBoZWxwZXIgZnVuY3Rpb25zIHRvIG1hbnVmYWN0dXJlLCBkZXJlZmVyZW5jZSwKLWFuZCBkZXN0cm95IGludGVnZXIgcG9pbnRlcnMuICBUaGVzZSBmdW5jdGlvbnMgbWlnaHQgYmUgdXNlZCBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotJHdwdHIgPSBuZXdfaW50ZWdlcigpOyAgIyBDcmVhdGUgYW4gJ2ludCAqJwotJGhwdHIgPSBuZXdfaW50ZWdlcigpOwotaW1hZ2VzaXplKCRpbSwgJHdwdHIsICRocHRyKTsgIAotJHcgPSBpbnRlZ2VyX3ZhbHVlKCR3cHRyKTsgIyBEZXJlZmVyZW5jZQotJGggPSBpbnRlZ2VyX3ZhbHVlKCRocHRyKTsKLWRlbGV0ZV9pbnRlZ2VyKCR3cHRyKTsgICAgICMgQ2xlYW4gdXAKLWRlbGV0ZV9pbnRlZ2VyKCRocHRyKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotQSBtb3JlIGVsZWdhbnQgc29sdXRpb24gaXMgdG8gdXNlIHRoZSBTV0lHIHR5cGVtYXAgbGlicmFyeQotaW4gdGhlIGludGVyZmFjZSBmaWxlIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0laW5jbHVkZSB0eXBlbWFwcy5pCi12b2lkIGltYWdlc2l6ZShnZEltYWdlUHRyIGltLCBpbnQgKk9VVFBVVCwKLSAgICAgICAgICAgICAgIGludCAqT1VUUFVUKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi1Ob3csIGluIHRoZSBQZXJsIHNjcmlwdCwgaXQgaXMgcG9zc2libGUgdG8gZG8gdGhpczoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSgkdywkaCkgPSBpbWFnZXNpemUoJGltKTsgCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUluIGEgc2ltaWxhciBzcGlyaXQsIGl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlCi1QZXJsIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+PHByZT4KLSVpbmNsdWRlIHR5cGVtYXBzLmkKLXZvaWQKLWltYWdlc2l6ZShnZEltYWdlUHRyIGltLCBpbnQgKlJFRkVSRU5DRSwKLSAgICAgICAgICBpbnQgKlJFRkVSRU5DRSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLQotTm93IGluIFBlcmw6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0jIFJldHVybiB2YWx1ZXMgaW4gJHcgYW5kICRoCi1pbWFnZXNpemUoJGltLFwkdyxcJGgpOyAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVG8gaW1wbGVtZW50IHRoaXMgYmVoYXZpb3IsIHRoZSBmaWxlIDx0dD50eXBlbWFwcy5pPC90dD4gZGVmaW5lcwotYSBjb2xsZWN0aW9uIG9mIHR5cGVtYXAgYGBydWxlcycnIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHNwZWNpZmljCi1kYXRhdHlwZXMgc3VjaCBhcyA8dHQ+aW50ICpPVVRQVVQ8L3R0PiBhbmQgPHR0PmludCAqUkVGRVJFTkNFPC90dD4uCi1UaGUgY3JlYXRpb24gb2YgdGhlc2UgcnVsZXMgaXMgbm93IGRpc2N1c3NlZC4KLQotPGg0PiAzLjEwLjIgQ3JlYXRpbmcgTmV3IFR5cGVtYXBzPC9oND4KLQotQWxsIHdyYXBwZXIgZnVuY3Rpb25zIHBlcmZvcm0gYSBjb21tb24gc2VxdWVuY2Ugb2YgaW50ZXJuYWwgYGBvcGVyYXRpb25zLicnCi1Gb3IgZXhhbXBsZSwgYXJndW1lbnRzIG11c3QgYmUgY29udmVydGVkIGZyb20gUGVybCBpbnRvIGEKLUMgcmVwcmVzZW50YXRpb24sIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgbXVzdCBiZSBjb252ZXJ0ZWQgYmFjayBpbnRvIAotUGVybCwgYXJndW1lbnQgdmFsdWVzIG1pZ2h0IGJlIGNoZWNrZWQsIGFuZCBzbyBmb3J0aC4gIFNXSUcgZ2l2ZXMgZWFjaCBvZgotdGhlc2Ugb3BlcmF0aW9ucyBhIHVuaXF1ZSBuYW1lIHN1Y2ggYXMgYGBpbicnIGZvciBpbnB1dCBwYXJhbWV0ZXIgcHJvY2Vzc2luZywKLWBgb3V0JycgZm9yIHJldHVybmluZyB2YWx1ZXMsIGBgY2hlY2snJyBmb3IgY2hlY2tpbmcgdmFsdWVzLCBhbmQgc28gZm9ydGguCi1UeXBlbWFwcyBhbGxvdyBhIHVzZXIgdG8gcmUtaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgZm9yIHNwZWNpZmljIGRhdGF0eXBlcwotYnkgc3VwcGx5aW5nIHNtYWxsIGZyYWdtZW50cyBvZiBDIGNvZGUgdGhhdCBTV0lHIGluc2VydHMgaW50byB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS4KLQotPHA+Ci1UbyBpbGx1c3RyYXRlLCBjb25zaWRlciB0aGUgZ2QgZXhhbXBsZS4gIEluIHRoZSBvcmlnaW5hbCBpbnRlcmZhY2UgZmlsZSwKLXR3byBmdW5jdGlvbnMgd2VyZSBpbmNsdWRlZCB0byBvcGVuIGFuZCBjbG9zZSBmaWxlcy4gICBUaGVzZSB3ZXJlIHJlcXVpcmVkCi1iZWNhdXNlIFNXSUcgbm9ybWFsbHkgbWFwcyBhbGwgcG9pbnRlcnMgKGluY2x1ZGluZyBmaWxlcykgaW50byBibGVzc2VkCi1yZWZlcmVuY2VzLiAgU2luY2UgYSBibGVzc2VkIHJlZmVyZW5jZSBpcyBub3QgdGhlIHNhbWUgYXMgYSBQZXJsIGZpbGUgaGFuZGxlLAotaXQgaXMgbm90IHBvc3NpYmxlIHRvIHBhc3MgUGVybCBmaWxlcyB0byBmdW5jdGlvbnMgZXhwZWN0aW5nIGEgPHR0PkZJTEUgKjwvdHQ+LgotSG93ZXZlciwgdGhpcyBpcyBlYXNpbHkgY2hhbmdlZCB3aXRoIGEgdHlwZW1hcCBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAocGVybDUsaW4pIEZJTEUgKiB7Ci0gICAkdGFyZ2V0ID0gSW9JRlAoc3ZfMmlvKCRzb3VyY2UpKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhpcyBkZWNsYXJhdGlvbiB0ZWxscyBTV0lHIHRoYXQgd2hlbmV2ZXIgYSA8dHQ+RklMRSAqPC90dD4KLWFwcGVhcnMgYXMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIsIGl0IHNob3VsZCBiZSBjb252ZXJ0ZWQgdXNpbmcgdGhlCi1zdXBwbGllZCBDIGNvZGUuICBXaGVuIGdlbmVyYXRpbmcgd3JhcHBlcnMsIHRoZSB0eXBlbWFwIGNvZGUgaXMKLWluc2VydGVkIGludG8gYWxsIHdyYXBwZXIgZnVuY3Rpb25zIHdoZXJlIGEgPHR0PkZJTEUgKjwvdHQ+IGlzIGludm9sdmVkLgotSW4gdGhlIHByb2Nlc3MgdGhlCi08dHQ+JHNvdXJjZTwvdHQ+IGFuZCA8dHQ+JHRhcmdldDwvdHQ+IHRva2VucyBhcmUgcmVwbGFjZWQgYnkgdGhlIG5hbWVzIG9mCi1DIGxvY2FsIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBQZXJsIGFuZCBDIHJlcHJlc2VudGF0aW9ucyBvZgotYW4gb2JqZWN0IHJlc3BlY3RpdmVseS4gIEFzIGEgcmVzdWx0LCB0aGlzIHR5cGVtYXAgYWxsb3dzIFBlcmwgZmlsZXMKLXRvIGJlIHVzZWQgaW4gYSBuYXR1cmFsIG1hbm5lci4gIEZvciBleGFtcGxlLAotCi08YmxvY2txdW90ZT48cHJlPgotb3BlbihPVVQsIiZndDt0ZXN0LmdpZiIpIHx8IGRpZSAiZXJyb3IhXG4iOwotCi0jIE11Y2ggYmV0dGVyIHRoYW4gYmVmb3JlCi1nZDo6Z2RJbWFnZUdpZigkaW0sKk9VVCk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUNlcnRhaW4gb3BlcmF0aW9ucywgc3VjaCBhcyBvdXRwdXQgdmFsdWVzLCBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgCi1hIGNvbWJpbmF0aW9uIG9mIHR5cGVtYXBzIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0ldHlwZW1hcChwZXJsNSxpZ25vcmUpCi1pbnQgKk9VVFBVVChpbnQgdGVtcCkgewotICAkdGFyZ2V0ID0gJnRlbXA7Ci19Ci0ldHlwZW1hcChwZXJsNSxhcmdvdXQpIGludCAqT1VUUFVUIHsKLSAgaWYgKGFyZ3ZpICZndDs9IGl0ZW1zKSB7Ci0gICAgIEVYVEVORChzcCwxKTsKLSAgfQotICAkdGFyZ2V0ID0gc3ZfbmV3bW9ydGFsKCk7Ci0gIHN2X3NldGl2KCR0YXJnZXQsKElWKSAqKCRzb3VyY2UpKTsKLSAgYXJndmkrKzsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotSW4gdGhpcyBjYXNlLCB0aGUgYGBpZ25vcmUnJyB0eXBlbWFwIHRlbGxzIFNXSUcgdGhhdCBhIHBhcmFtZXRlciBpcwotZ29pbmcgdG8gYmUgaWdub3JlZCBhbmQgdGhhdCB0aGUgUGVybCBpbnRlcnByZXRlciB3aWxsIG5vdCBiZQotc3VwcGx5aW5nIGEgdmFsdWUuICBTaW5jZSB0aGUgdW5kZXJseWluZyBDIGZ1bmN0aW9uIHN0aWxsIG5lZWRzIGEKLXZhbHVlLCB0aGUgdHlwZW1hcCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHRvIHBvaW50Ci10byBhIHRlbXBvcmFyeSB2YXJpYWJsZSA8dHQ+dGVtcDwvdHQ+LiBUaGUgYGBhcmdvdXQnJyB0eXBlbWFwIGlzIHVzZWQgdG8KLXJldHVybiBhIHZhbHVlIGhlbGQgaW4gb25lIG9mIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuICBJbiB0aGlzIGNhc2UsCi10aGUgdHlwZW1hcCBleHRlbmRzIHRoZSBQZXJsIHN0YWNrIChpZiBuZWVkZWQpLCBhbmQgY3JlYXRlcyBhIG5ldwotcmV0dXJuIHZhbHVlLiAgVGhlIDx0dD5hcmd2aTwvdHQ+IHZhcmlhYmxlIGlzIGEgU1dJRy1zcGVjaWZpYyB2YXJpYWJsZQotY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHZhbHVlcyByZXR1cm5lZCB0byB0aGUgUGVybCBpbnRlcnByZXRlciAoc28KLWl0IGlzIGluY3JlbWVudGVkIGZvciBlYWNoIHJldHVybiB2YWx1ZSkuCi0KLTxwPgotVGhlIEMgY29kZSBzdXBwbGllZCBpbiBlYWNoIHR5cGVtYXAgaXMgcGxhY2VkIGluIGEgcHJpdmF0ZSBzY29wZSB0aGF0Ci1pcyBub3QgdmlzaWJsZSB0byBhbnkgb3RoZXIgdHlwZW1hcHMgb3Igb3RoZXIgcGFydHMgb2YgYSB3cmFwcGVyIGZ1bmN0aW9uLgotVGhpcyBhbGxvd3MgZGlmZmVyZW50IHR5cGVtYXBzIHRvIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHktLWV2ZW4gaWYgdGhleQotZGVmaW5lIHZhcmlhYmxlcyB3aXRoIHRoZSBzYW1lIG5hbWVzLiAgVGhpcyBhbHNvIGFsbG93cyB0aGUgc2FtZSB0eXBlbWFwCi10byBiZSB1c2VkIG1vcmUgb25jZSBpbiB0aGUgc2FtZSB3cmFwcGVyIGZ1bmN0aW9uLiBGb3IgZXhhbXBsZSwgdGhlIHByZXZpb3VzCi1zZWN0aW9uIHVzZWQgdGhlIDx0dD5pbnQgKk9VVFBVVDwvdHQ+IHR5cGVtYXAgdHdpY2UgaW4gdGhlIHNhbWUgZnVuY3Rpb24KLXdpdGhvdXQgYW55IGFkdmVyc2Ugc2lkZS1lZmZlY3RzLgotCi08aDQ+IDMuMTAuMyBUeXBlbWFwIExpYnJhcmllczwvaDQ+Ci0KLVdyaXRpbmcgbmV3IHR5cGVtYXBzIGlzIGEgc29tZXdoYXQgbWFnaWNhbCBhcnQgdGhhdCByZXF1aXJlcyBrbm93bGVkZ2Ugb2YKLVBlcmwncyBpbnRlcm5hbCBvcGVyYXRpb24sIFNXSUcsIGFuZCB0aGUgdW5kZXJseWluZyBhcHBsaWNhdGlvbi4gCi1Cb29rcyBzdWNoIGFzIDxlbT5BZHZhbmNlZCBQZXJsIFByb2dyYW1taW5nPC9lbT4gYW5kIHRoZSBtYW4gcGFnZXMgb24KLWV4dGVuZGluZyBhbmQgZW1iZWRkaW5nIHRoZSBQZXJsIGludGVycHJldGVyIHdpbGwgcHJvdmUgdG8gYmUgcXVpdGUgdXNlZnVsLgotSG93ZXZlciwgc2luY2Ugd3JpdGluZyB0eXBlbWFwcyBmcm9tIHNjcmF0Y2ggaXMgZGlmZmljdWx0LCBTV0lHIHByb3ZpZGVzIGEKLXdheSBmb3IgdHlwZW1hcHMgdG8gYmUgcGxhY2VkIGluIGEgbGlicmFyeSBhbmQgdXRpbGl6ZWQgd2l0aG91dAota25vd2luZyB0aGVpciBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiAgIFRvIGlsbHVzdHJhdGUsIAotc3VwcG9zZSB0aGF0IHlvdSB3YW50ZWQgdG8gd3JpdGUgc29tZSBnZW5lcmljIHR5cGVtYXBzIGZvciBjaGVja2luZyB0aGUKLXZhbHVlIG9mIHZhcmlvdXMgaW5wdXQgcGFyYW1ldGVycy4gIFRoaXMgY291bGQgYmUgZG9uZSBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT48cHJlPgotLy8gY2hlY2suaQotLy8gdHlwZW1hcHMgZm9yIGNoZWNraW5nIGFyZ3VtZW50IHZhbHVlcwotJXR5cGVtYXAocGVybDUsY2hlY2spIE51bWJlciBQT1NJVElWRSB7Ci0gICAgaWYgKCR0YXJnZXQgJmx0Oz0gMCkKLSAgICAgICBjcm9haygiRXhwZWN0ZWQgYSBwb3NpdGl2ZSB2YWx1ZSIpOwotfQotCi0ldHlwZW1hcChwZXJsNSxjaGVjaykgUG9pbnRlciAqTk9OTlVMTCB7Ci0gICAgaWYgKCR0YXJnZXQgPT0gTlVMTCkKLSAgICAgICBjcm9haygiUmVjZWl2ZWQgYSBOVUxMIHBvaW50ZXIhIik7Ci19Ci0uLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVG8gdXNlIHRoZXNlIHR5cGVtYXBzLCBhIHVzZXIgY291bGQgaW5jbHVkZSB0aGUgZmlsZSA8dHQ+Y2hlY2suaTwvdHQ+Ci1hbmQgdXNlIHRoZSA8dHQ+JWFwcGx5PC90dD4gZGlyZWN0aXZlLiAgVGhlIDx0dD4lYXBwbHk8L3R0PiBkaXJlY3RpdmUgc2ltcGx5Ci10YWtlcyBleGlzdGluZyB0eXBlbWFwcyBhbmQgbWFrZXMgdGhlbSB3b3JrIHdpdGggbmV3IGRhdGF0eXBlcy4gIEZvcgotZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+PHByZT4KLSVpbmNsdWRlIGNoZWNrLmkKLQotLy8gRm9yY2UgJ2RvdWJsZSBweCcgdG8gYmUgcG9zaXRpdmUKLSVhcHBseSBOdW1iZXIgUG9zaXRpdmUgeyBkb3VibGUgcHggfTsKLQotLy8gRm9yY2UgdGhlc2UgcG9pbnRlcnMgdG8gYmUgTk9OLU5VTEwKLSVhcHBseSBQb2ludGVyIE5PTk5VTEwgeyBGSUxFICosIAotICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciAqLAotICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdkSW1hZ2UgKiB9OwotCi0vLyBOb3cgc29tZSBmdW5jdGlvbnMKLWRvdWJsZSBsb2coZG91YmxlIHB4KTsgICAvLyAncHgnIHBvc2l0aXZlCi1kb3VibGUgZG90X3Byb2R1Y3QoVmVjdG9yICosIFZlY3RvciAqKTsKLS4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1JbiB0aGlzIGNhc2UsIHRoZSB0eXBlbWFwcyB3ZSBkZWZpbmVkIGZvciBjaGVja2luZwotZGlmZmVyZW50IHZhbHVlcyBoYXZlIGJlZW4gYXBwbGllZCB0byBhIHZhcmlldHkgb2YgCi1uZXcgZGF0YXR5cGVzLiAgVGhpcyBoYXMgYmVlbiBkb25lIHdpdGhvdXQgaGF2aW5nIHRvCi1leGFtaW5lIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aG9zZSB0eXBlbWFwcyBvciBoYXZpbmcgCi10byBsb29rIGF0IGFueSBQZXJsIGludGVybmFscy4gICBDdXJyZW50bHksIFNXSUcgaW5jbHVkZXMKLWEgbnVtYmVyIG9mIGxpYnJhcmllcyB0aGF0IG9wZXJhdGUgaW4gdGhpcyBtYW5uZXIuCi0KLTxoMz4gMy4xMSBPdGhlciBTV0lHIEZlYXR1cmVzPC9oMz4KLQotU1dJRyBoYXMgYSBudW1iZXIgb2Ygb3RoZXIgZmVhdHVyZXMgdGhhdCBoYXZlIG5vdCBiZWVuIGRpc2N1c3NlZC4KLUluIGFkZGl0aW9uIHRvIHByb2R1Y2luZyB3cmFwcGVyIGNvZGUsIFNXSUcgYWxzbyBwcm9kdWNlcwotc2ltcGxlIGRvY3VtZW50YXRpb24gZmlsZXMuICBUaGVzZSBkZXNjcmliZSB0aGUgY29udGVudHMgb2YgYQotbW9kdWxlLiAgSW4gYWRkaXRpb24sIEMgY29tbWVudHMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBkZXNjcmlwdGl2ZQotdGV4dCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlLiAgICBTV0lHIGlzIGFsc28gcGFja2FnZWQgd2l0aCBhCi1saWJyYXJ5IG9mIHVzZWZ1bCBtb2R1bGVzIHRoYXQgaW5jbHVkZSB0eXBlbWFwcyBhbmQgaW50ZXJmYWNlcyB0bwotY29tbW9uIGxpYnJhcmllcy4gIFRoZXNlIGxpYnJhcmllcyBjYW4gc2ltcGxpZnkgdGhlIGNvbnN0cnVjdGlvbgotb2Ygc2NyaXB0aW5nIGludGVyZmFjZXMuCi0KLTxoMz4gMy4xMiBQdXR0aW5nIGl0IEFsbCBUb2dldGhlcjwvaDM+Ci0KLUluIHRoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgc2VjdGlvbiwgYSBtaW5pbWFsIGludGVyZmFjZSB0byB0aGUKLWdkIGxpYnJhcnkgd2FzIHByZXNlbnRlZC4gIE5vdywgbGV0J3MgdGFrZSBhIGxvb2sgYXQgYSBtb3JlCi1zdWJzdGFudGlhbCB2ZXJzaW9uIG9mIHRoYXQgaW50ZXJmYWNlLgotCi08YmxvY2txdW90ZT48cHJlPgotLy8gZ2QuaQotJW1vZHVsZSBnZAotJXsKLSNpbmNsdWRlICJnZC5oIgotJX0KLQotLy8gTWFrZSBGSUxFICogd29yawotJXR5cGVtYXAocGVybDUsaW4pIEZJTEUgKiB7Ci0gICAkdGFyZ2V0ID0gSW9JRlAoc3ZfMmlvKCRzb3VyY2UpKTsKLX0KLQotLy8gR3JhYiB0aGUgZ2QuaCBoZWFkZXIgZmlsZQotJWluY2x1ZGUgImdkLmgiCi0KLS8vIEV4dGVuZCB0aGUgaW50ZXJmYWNlIGEgbGl0dGxlIGJpdAotJWFkZG1ldGhvZHMgZ2RJbWFnZSB7Ci1nZEltYWdlKGludCB3LCBpbnQgaCkgewotICAgIHJldHVybiBnZEltYWdlQ3JlYXRlKHcsaCk7Ci19Ci1+Z2RJbWFnZSgpIHsKLSAgICBnZEltYWdlRGVzdHJveShzZWxmKTsKLX0KLS4uLiBldGMgLi4uCi19OwotCi0lYWRkbWV0aG9kcyBnZFBvaW50IHsKLS4uLiBldGMgLi4uCi19Ci0KLS8vIFdyYXAgdGhlIGZvbnRzIChyZWFkb25seSB2YXJpYWJsZXMpCi0lcmVhZG9ubHkKLSVpbmNsdWRlICJnZGZvbnR0LmgiCi0laW5jbHVkZSAiZ2Rmb250cy5oIgotJWluY2x1ZGUgImdkZm9udG1iLmgiCi0laW5jbHVkZSAiZ2Rmb250bC5oIgotJWluY2x1ZGUgImdkZm9udGcuaCIKLSVyZWFkd3JpdGUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotRmluYWxseSwgaGVyZSBpcyBhIHNpbXBsZSBzY3JpcHQgdGhhdCB1c2VzIHRoZSBtb2R1bGUuICAgQXNpZGUgZnJvbQotYSBmZXcgbWlub3IgZGlmZmVyZW5jZXMsIHRoZSBzY3JpcHQgaXMgcmVtYXJrYWJseSBzaW1pbGFyIHRvIHRoZSBmaXJzdAotZXhhbXBsZSBnaXZlbiBpbiB0aGUgc3RhbmRhcmQgR0QgbW9kdWxlIGRvY3VtZW50YXRpb24uCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci11c2UgZ2Q7Ci0KLSRpbSA9IG5ldyBnZEltYWdlKDEwMCwxMDApOwotJHdoaXRlPSAkaW0tJmd0O2NvbG9yQWxsb2NhdGUoMjU1LDI1NSwyNTUpOwotJGJsYWNrPSAkaW0tJmd0O2NvbG9yQWxsb2NhdGUoMCwwLDApOwotJHJlZD0gJGltLSZndDtjb2xvckFsbG9jYXRlKDI1NSwwLDApOwotJGJsdWU9ICRpbS0mZ3Q7Y29sb3JBbGxvY2F0ZSgwLDAsMjU1KTsKLSRpbS0mZ3Q7dHJhbnNwYXJlbnRjb2xvcigkd2hpdGUpOwotJGltLSZndDtpbnRlcmxhY2VkKDEpOwotJGltLSZndDtyZWN0YW5nbGUoMCwwLDk5LDk5LCR3aGl0ZSk7Ci0kaW0tJmd0O2FyYyg1MCw1MCw5NSw3NSwwLDM2MCwkYmx1ZSk7Ci0kaW0tJmd0O2ZpbGwoNTAsNTAsJHJlZCk7Ci1vcGVuKElNRywgIiZndDt0ZXN0LmdpZiIpOwotJGltLSZndDtnaWYoKklNRyk7Ci1jbG9zZShJTUcpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08aDI+IDQgSW50ZXJmYWNlIEJ1aWxkaW5nIFN0cmF0ZWdpZXM8L2gyPgotCi1TV0lHIHNpbXBsaWZpZXMgdGhlIGNvbnN0cnVjdGlvbiBvZiBQZXJsIGV4dGVuc2lvbnMgYmVjYXVzZSBpdCBoaWRlcwotUGVybC1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFuZCBhbGxvd3MgcHJvZ3JhbW1lcnMgdG8KLWluY29ycG9yYXRlIEMvQysrIGFwcGxpY2F0aW9ucyBpbnRvIGEgUGVybCBlbnZpcm9ubWVudCB1c2luZyBmYW1pbGlhcgotQU5TSSBDL0MrKyBzeW50YXggcnVsZXMuICBJbiBhZGRpdGlvbiwgU1dJRyBpbnRlcmZhY2VzIGFyZSBnZW5lcmFsbHkKLXNwZWNpZmllZCBpbiBhIGxlc3MgZm9ybWFsIG1hbm5lciB0aGFuIHRoYXQgZm91bmQgaW4gWFMgb3IgY29tcG9uZW50Ci1hcmNoaXRlY3R1cmVzIHN1Y2ggYXMgQ09SQkEgYW5kIENPTS4gICBBcyBhIHJlc3VsdCwgbWFueSB1c2VycyBhcmUKLXN1cnByaXNlZCB0byBmaW5kIG91dCBob3cgcmFwaWRseSB0aGV5IGNhbiBjcmVhdGUgUGVybCBpbnRlcmZhY2VzCi10byB0aGVpciBDL0MrKyBhcHBsaWNhdGlvbnMuICAgSG93ZXZlciwgIGl0IGlzIGEgbWlzcGVyY2VwdGlvbiB0byB0aGluawotdGhhdCBTV0lHIGNhbiBtYWdpY2FsbHkgdGFrZSBhbiBhcmJpdHJhcnkgQy9DKysgaGVhZGVyIGZpbGUgYW5kIAotaW5zdGFudGx5IHR1cm4gaXQgaW50byBhIHVzZWZ1bCBQZXJsIG1vZHVsZS4gICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzCi1zb21lIG9mIHRoZSBpc3N1ZXMgYW5kIHNvbHV0aW9uIHN0cmF0ZWdpZXMgZm9yIGVmZmVjdGl2ZWx5IHVzaW5nIFNXSUcuCi0KLTxoMz4gNC4xIFdyYXBwaW5nIGFuIEV4aXN0aW5nIFByb2dyYW0gPC9oMz4KLQotQnVpbGRpbmcgYSBQZXJsIGludGVyZmFjZSB0byBhbiBleGlzdGluZyBhcHBsaWNhdGlvbiBnZW5lcmFsbHkgaW52b2x2ZXMKLXRoZSBmb2xsb3dpbmcgc3RlcHMgOgotCi08b2w+Ci08bGk+IExvY2F0ZSBoZWFkZXIgZmlsZXMgYW5kIG90aGVyIHNvdXJjZXMgb2YgQyBkZWNsYXJhdGlvbnMuCi08bGk+IENvcHkgaGVhZGVyIGZpbGVzIHRvIGludGVyZmFjZSBmaWxlcy4KLTxsaT4gRWRpdCB0aGUgaW50ZXJmYWNlIGZpbGUgYW5kIGFkZCBTV0lHIGRpcmVjdGl2ZXMuCi08bGk+IFJlbW92ZSBvciByZXdyaXRlIHRoZSBhcHBsaWNhdGlvbidzIDx0dD5tYWluKCk8L3R0PiBmdW5jdGlvbiBpZiBuZWNlc3NhcnkuCi08bGk+IFJ1biBTV0lHLCBjb21waWxlLCBhbmQgbGluayBpbnRvIGEgUGVybCBleHRlbnNpb24gbW9kdWxlLgotPC9vbD4KLQotV2hpbGUgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBydW4gU1dJRyBkaXJlY3RseSBvbiBhIEMgaGVhZGVyCi1maWxlLCB0aGlzIHJhcmVseSByZXN1bHRzIGluIHRoZSBiZXN0IHNjcmlwdGluZyBpbnRlcmZhY2UuICBGaXJzdCwgYQotcmF3IGhlYWRlciBmaWxlIG1heSBjb250YWluIHByb2JsZW1hdGljIGRlY2xhcmF0aW9ucyB0aGF0IFNXSUcgZG9lc24ndAotdW5kZXJzdGFuZC4gIFNlY29uZCwgaXQgaXMgdXN1YWxseSB1bm5lY2Vzc2FyeSB0byB3cmFwIGV2ZXJ5IGZ1bmN0aW9uIGFuZAotdmFyaWFibGUgaW4gYSBsYXJnZSBsaWJyYXJ5LiAgTW9yZSBvZnRlbiB0aGFuIG5vdCwgdGhlcmUgYXJlIGludGVybmFsCi1mdW5jdGlvbnMgdGhhdCBtYWtlIGxpdHRsZSBzZW5zZSB0byB1c2UgZnJvbSBQZXJsLiAgQnkgY29weWluZyBoZWFkZXIKLWZpbGVzIHRvIGEgc2VwYXJhdGUgaW50ZXJmYWNlIGZpbGUsIGl0IGlzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSB0aGVzZQotZnVuY3Rpb25zIGFuZCBjbGVhbiB0aGluZ3MgdXAgd2l0aCBhIGxpdHRsZSBlZGl0aW5nIFtmb290bm90ZTogQW4KLWFsdGVybmF0aXZlIGFwcHJvYWNoIHRvIGNvcHlpbmcgaGVhZGVyIGZpbGVzIGlzIHRvIG1vZGlmeSB0aGUgaGVhZGVyCi1maWxlcyB1c2luZyBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byBhZGQgU1dJRyBkaXJlY3RpdmVzIG9yIHRvCi1yZW1vdmUgdW5uZWNlc3NhcnkgZnVuY3Rpb25zXS4gIEZpbmFsbHksIHRoZSB1bmRlcmx5aW5nIGFwcGxpY2F0aW9uCi1tYXkgcmVxdWlyZSBhIGZldyBzbGlnaHQgbW9kaWZpY2F0aW9ucy4gIEZvciBleGFtcGxlLCBQZXJsIHN1cHBsaWVzCi1pdHMgb3duIDx0dD5tYWluKCk8L3R0PiBmdW5jdGlvbiBzbyBpZiBhbiBhcHBsaWNhdGlvbiBhbHNvIGNvbnRhaW5zIDx0dD4KLW1haW4oKTwvdHQ+LCBpdCB3aWxsIGhhdmUgdG8gYmUgcmVtb3ZlZCwgcmV3cml0dGVuLCBvciBub3QgbGlua2VkIGludG8gdGhlCi1leHRlbnNpb24gbW9kdWxlLiAgCi0KLTxoMz4gNC4yIEV2b2x1dGlvbmFyeSBJbnRlcmZhY2UgQnVpbGRpbmc8L2gzPgotCi1BZnRlciBhIFBlcmwgaW50ZXJmYWNlIGlzIGZpcnN0IGJ1aWx0LCBpdHMgdXNlIHdpbGwgCi1leHBvc2UgYW55IHByb2JsZW1zIGFuZCBsaW1pdGF0aW9ucy4gIFRoZXNlIHByb2JsZW1zIGluY2x1ZGUgZnVuY3Rpb25zCi10aGF0IGFyZSBhd2t3YXJkIHRvIHVzZSwgcG9vciBpbnRlZ3JhdGlvbiB3aXRoIFBlcmwgZGF0YXR5cGVzLCBtaXNzaW5nCi1mdW5jdGlvbmFsaXR5LCBhbmQgc28gZm9ydGguICBUbyBmaXggdGhlc2UgcHJvYmxlbXMsIAotaW50ZXJmYWNlIGZpbGVzIGNhbiBiZSBlbmhhbmNlZCB3aXRoIGhlbHBlciBmdW5jdGlvbnMsCi10eXBlbWFwcywgZXhjZXB0aW9uIGhhbmRsZXJzLCBhbmQgb3RoZXIgZGVjbGFyYXRpb25zLiAgIFNpbmNlIAotaW50ZXJmYWNlcyBhcmUgZWFzaWx5IHJlZ2VuZXJhdGVkLCBtYWtpbmcgc3VjaCBjaGFuZ2VzIGlzIGEgcmVsYXRpdmVseQotc3RyYWlnaHRmb3J3YXJkIHByb2Nlc3MuIEhvd2V2ZXIsIGFzIGEgcmVzdWx0LCAgU1dJRyBpbnRlcmZhY2VzIHRlbmQKLXRvIGJlIGJ1aWx0IGluIGFuIGV2b2x1dGlvbmFyeSBhbmQgaXRlcmF0aXZlIG1hbm5lciByYXRoZXIgdGhhbiBiZWluZwotZm9ybWFsbHkgc3BlY2lmaWVkIGluIGFkdmFuY2UuCi0KLTxoMz4gNC4zIFRyYXBzIGFuZCBQaXRmYWxsczwvaDM+Ci0KLUZpbmFsbHksIHRoZXJlIGFyZSBhIG51bWJlciBvZiBzdWJ0bGUgcHJvYmxlbXMgdGhhdCBzb21ldGltZXMgYXJpc2UKLXdoZW4gdHJhbnNmb3JtaW5nIGEgQy9DKysgcHJvZ3JhbSBpbnRvIGEgUGVybCBleHRlbnNpb24gbW9kdWxlLiAgT25lCi1vZiB0aGVzZSBwcm9ibGVtcyBpcyB0aGUgaXNzdWUgb2YgaW1wbGljaXQgZXhlY3V0aW9uIG9yZGVyCi1kZXBlbmRlbmNpZXMgYW5kIHJlZW50cmFudCBmdW5jdGlvbnMuICBGcm9tIHRoZSBQZXJsIGludGVycHJldGVyLCB1c2VycyB3aWxsIGJlCi1hYmxlIHRvIGV4ZWN1dGUgZnVuY3Rpb25zIGF0IGFueSB0aW1lIGFuZCBpbiBhbnkgb3JkZXIuICBIb3dldmVyLCBpbgotbWFueSBDIHByb2dyYW1zLCBleGVjdXRpb24gaXMgcHJlY2lzZWx5IGRlZmluZWQuICBGb3IKLWV4YW1wbGUsIGEgcHJlY2lzZSBzZXF1ZW5jZSBvZiBmdW5jdGlvbiBjYWxscyBtaWdodCBiZSBwZXJmb3JtZWQgdG8KLXByb3Blcmx5IGluaXRpYWxpemUgcHJvZ3JhbSBkYXRhLiAgTGlrZXdpc2UsIGl0IG1heSBvbmx5IGJlIHZhbGlkIHRvCi1jYWxsIGNlcnRhaW4gZnVuY3Rpb25zIG9uY2UgZHVyaW5nIGEgc2luZ2xlIGV4ZWN1dGlvbi4gICBGcm9tIFBlcmwsCi1pdCBpcyBlYXN5IGZvciBhIHVzZXIgdG8gdmlvbGF0ZSB0aGVzZSBjb25zdHJhaW50cy0tcmVzdWx0aW5nIGluCi1hIHBvdGVudGlhbCBwcm9ncmFtIGNyYXNoIG9yIGluY29ycmVjdCBiZWhhdmlvci4gICAgVG8gZml4IHRoZXNlCi1wcm9ibGVtcywgYXBwbGljYXRpb25zIGNhbiBzb21ldGltZXMgYmUgbW9kaWZpZWQgYnkgaW50cm9kdWNpbmcgYWRkaXRpb25hbAotc3RhdGUgdmFyaWFibGVzLiAgRm9yIGV4YW1wbGUsIHRvIHByZXZlbnQgcmVwZWF0ZWQgZXhlY3V0aW9uLCBhIGZ1bmN0aW9uCi1jYW4gYmUgbW9kaWZpZWQgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXZvaWQgZm9vKCkgewotICAgc3RhdGljIGludCBjYWxsZWQgPSAwOwotICAgaWYgKGNhbGxlZCkgcmV0dXJuOwotICAgLi4uCi0gICBjYWxsZWQgPSAxOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gY2F0Y2ggc3VjaCBiZWhhdmlvciB1c2luZyBleGNlcHRpb24gaGFuZGxlcnMuICBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLSVleGNlcHQocGVybDUpIHsKLSAgIHN0YXRpYyBpbnQgY2FsbGVkID0gMDsKLSAgIGlmIChjYWxsZWQpIAotICAgICAgICAgY3JvYWsoIkFscmVhZHkgZXhlY3V0ZWQhXG4iKTsKLSAgICRmdW5jdGlvbgotICAgY2FsbGVkID0gMTsKLX0KLS8vIExpc3QgYWxsIG5vbi1yZWVudHJhbnQgZnVuY3Rpb25zCi12b2lkIGZvbygpOwotLi4uCi0vLyBDbGVhciB0aGUgZXhjZXB0aW9uIGhhbmRsZXIKLSVleGNlcHQocGVybDUpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1Bbm90aGVyIGNvbW1vbiBwcm9ibGVtIGlzIHRoYXQgb2YgaW1wcm9wZXIgbWVtb3J5IG1hbmFnZW1lbnQuICBBcyBwcmV2aW91c2x5IG1lbnRpb25lZCwKLVNXSUcgZXh0ZW5zaW9ucyB1c2UgdGhlIHNhbWUgbWVtb3J5IG1hbmFnZW1lbnQgdGVjaG5pcXVlcyBhcyBDLiAgVGhlcmVmb3JlLCBjYXJlbGVzcyB1c2UKLW1heSByZXN1bHQgaW4gbWVtb3J5IGxlYWtzLCBkYW5nbGluZyBwb2ludGVycywgYW5kIHNvIGZvcnRoLiAKLUEgc29tZXdoYXQgbW9yZSBvYnNjdXJlIG1lbW9yeSByZWxhdGVkIHByb2JsZW0gaXMgY2F1c2VkIHdoZW4gYSBDIHByb2dyYW0gCi1vdmVyd3JpdGVzIFBlcmwgZGF0YS4gIFRoaXMgY2FuIGJlIGNhdXNlZCBieSBhIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZzoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXZvaWQgZ2V0ZXJyb3IoY2hhciAqbXNnKSB7Ci0gICAgIHN0cmNweShtc2csc3RyZXJyb3IoZXJybm8pKTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhpcyBmdW5jdGlvbiBjb3BpZXMgYSBzdHJpbmcgaW50byBtZW1vcnkgcG9pbnRlZCB0byBieSA8dHQ+bXNnPC90dD4uICBIb3dldmVyLCBpbiB0aGUKLXdyYXBwZXIgZnVuY3Rpb24sIHRoZSB2YWx1ZSBvZiA8dHQ+bXNnPC90dD4gaXMgcmVhbGx5IGEgcG9pbnRlciB0byBkYXRhIGJ1cmllZCBkZWVwCi1pbnNpZGUgYSBQZXJsIHNjYWxhciB2YWx1ZS4gICBXaGVuIHRoZSBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSB2YWx1ZSwgaXQgY29ycnVwdHMKLXRoZSB2YWx1ZSBvZiB0aGUgUGVybCBzY2FsYXIgdmFsdWUgYW5kIGNhbiBjYXVzZSB0aGUgUGVybCBpbnRlcnByZXRlciB0byBjcmFzaAotd2l0aCBhIG1lbW9yeSBhZGRyZXNzaW5nIGVycm9yIG9yIG9ic2N1cmUgcnVuLXRpbWUgZXJyb3IuICBBZ2FpbiwgdGhpcyBzb3J0IG9mIHByb2JsZW0KLWNhbiB1c3VhbGx5IGJlIGZpeGVkIHdpdGggdGhlIHVzZSBvZiB0eXBlbWFwcy4gICBGb3IgZXhhbXBsZSwgaXQgaXMgcG9zc2libGUgdG8gdHVybiB0aGUKLTx0dD5tc2c8L3R0PiBwYXJhbWV0ZXIgaW50byBhbiBvdXRwdXQgdmFsdWUgYXMgZm9sbG93cyA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBVc2UgYSB0ZW1wb3JhcnkgYXJyYXkgZm9yIHRoZSByZXN1bHQKLSV0eXBlbWFwKHBlcmw1LGlnbm9yZSkKLWNoYXIgKm1zZyAoY2hhciB0ZW1wWzUxMl0pIHsKLSAgICAkdGFyZ2V0ID0gdGVtcDsKLX0KLS8vIENvcHkgdGhlIG91dHB1dCBpbnRvIGEgbmV3IFBlcmwgc2NhbGFyCi0ldHlwZW1hcChwZXJsNSxhcmdvdXQpIGNoYXIgKm1zZyB7Ci0gIGlmIChhcmd2aSAmZ3Q7PSBpdGVtcykgewotICAgICBFWFRFTkQoc3AsMSk7Ci0gIH0KLSAgJHRhcmdldCA9IHN2X25ld21vcnRhbCgpOwotICBzdl9zZXRwdigkdGFyZ2V0LCRzb3VyY2UpOwotICBhcmd2aSsrOwotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08aDI+IDUgQXBwbGljYXRpb25zIDwvaDI+Ci0KLVNXSUcgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgaW4gYW4gaW5jcmVhc2luZyB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucy4gIAotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzb21lIG9mIHRoZSB3YXlzIGluIHdoaWNoIGhhcyBiZWVuIHVzZWQuICBBIG51bWJlcgotb2YgYWR2YW5jZWQgU1dJRy9QZXJsIGludGVyZmFjaW5nIHRlY2huaXF1ZXMgc3VjaCBhcyB0eXBlbWFwcyBhbmQKLWNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgYWxzbyBkZXNjcmliZWQuCi0KLTxoMz4gNS4xIEVsZWN0cm9uaWMgQ0FEPC9oMz4KLQotU1dJRyBwbGF5cyBhIHBpdm90YWwgcm9sZSBpbiB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzcyBvZiBCYWRnZXIsIGFuCi1lbGVjdHJvbmljIGNvbXB1dGVyLWFpZGVkIGRlc2lnbiBzeXN0ZW0sIGJlaW5nIGRldmVsb3BlZCBieSBGdXNpb24KLU1pY3JvTWVkaWEsIHVzZWQgaW4gdGhlIGRlc2lnbiBvZiBpbnRlZ3JhdGVkIGNpcmN1aXRzIGFuZCBvdGhlcgotZWxlY3Ryb25pYyBjb21wb25lbnRzLiAgQmFkZ2VyIGlzIGEgZnVsbHkgb2JqZWN0LW9yaWVudGVkLCBtb2R1bGFyLAotYW5kIGhpZ2hseSBleHRlbnNpYmxlIHN5c3RlbSwgcnVubmluZyB1bmRlciB2YXJpb3VzIGZsYXZvcnMgb2YgdGhlCi1VTklYIG9wZXJhdGluZyBzeXN0ZW0gYXMgd2VsbCBhcwotV2luZG93cy1OVC4KLQotPHA+Ci1UaGUgY29yZSBjb21wb25lbnRzIGluIEJhZGdlciBhcmUgY29uc3RydWN0ZWQgaW4gQysrIGFuZCBhcmUKLWRlbGl2ZXJlZCBhcyBhIHNldCBvZiBzaGFyZWQgKGR5bmFtaWNhbGx5IGxvYWRlZCkgbGlicmFyaWVzLiAgVGhlCi1saWJyYXJpZXMgYXJlIDxlbT5ub3Q8L2VtPiBkaXJlY3RseSBsaW5rZWQgaW50byBhbiBleGVjdXRhYmxlIHByb2dyYW0uCi1JbnN0ZWFkLCBlYWNoIGxpYnJhcnkgY29tZXMgd2l0aCBhbiBleHRlbnNpb24gbGFuZ3VhZ2UgKEVMKQotaW50ZXJmYWNlIHRoYXQgaXMgZ2VuZXJhdGVkIGJ5IFNXSUcsIGFsbG93aW5nIHRoZSBsaWJyYXJ5IHRvIGJlIHVzZWQKLXdpdGhpbiBhIFBlcmwgcHJvZ3JhbSBbZm9vdG5vdGU6IEZvciBub3csIFBlcmwgaXMgdGhlIG9ubHkgc3VwcG9ydGVkCi1leHRlbnNpb24gbGFuZ3VhZ2UuICBUY2wgYW5kIEphdmEgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZV0uCi1UaGUgY29tYmluYXRpb24gb2YgYSBwb3dlcmZ1bCBFTCBhbmQgd2VsbC10dW5lZCwgYXBwbGljYXRpb24tc3BlY2lmaWMKLXNvZnR3YXJlIHJlc3VsdHMgaW4gYSBzeXN0ZW0gdGhhdCBpcyBwb3RlbnQsIGZsZXhpYmxlLCBhbmQgZWFzeSB0bwotdXNlLgotCi08cD4KLUZvciB0aGUgbW9zdCBwYXJ0LCBTV0lHIGlzIHVzZWQgaW4gYSBgYG5vcm1hbCcnIGZhc2hpb246IGEgZGVzY3JpcHRpb24KLW9mIHRoZSBjbGFzc2VzIGNvbnRhaW5lZCB3aXRoaW4gYSBsaWJyYXJ5IGlzIHByZXNlbnRlZCB0byBTV0lHLCBhbmQgaXQKLWdlbmVyYXRlcyBhbiBFTCBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgdGhlIGNvZGUgd2l0aGluIHRoYXQgbGlicmFyeSB0bwotYmUgYWNjZXNzZWQgZnJvbSBhbiBFTC4gIFRoZXJlIGFyZSB0d28gaW50ZXJlc3RpbmcgZmFjZXRzIHRvIHRoZSB1c2UKLW9mIFNXSUcgd2l0aGluIEJhZGdlcjogdGhlIHVzZSBvZiBgYHNtYXJ0IHJlZmVyZW5jZXMsJycgYW5kIHRoZSB1c2UKLW9mIGNhbGxiYWNrcyBmcm9tIEMrKyB0byB0aGUgRUwsCi0KLTxoND4gNS4xLjEgU21hcnQgUmVmZXJlbmNlczwvaDQ+Ci0KLVN1cHBvc2UgYSBQZXJsIHByb2dyYW0gY2FsbHMgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IEJhZGdlciAoYW5kIHdyYXBwZWQKLXdpdGggU1dJRykgaW4gb3JkZXIgdG8gY3JlYXRlIGFuZCByZXR1cm4gc29tZSBvYmplY3QuICBBbnkgUGVybAotdmFyaWFibGUgdXNlZCB0byByZWZlciB0byB0aGF0IG9iamVjdCByZWFsbHkgaG9sZHMgYSA8ZW0+aGFuZGxlPC9lbT4gdG8KLXRoZSBvYmplY3QsIGltcGxlbWVudGVkIGFzIGEgYmxlc3NlZCByZWZlcmVuY2UgY29udGFpbmluZyB0aGUgb2JqZWN0J3MgdHlwZSBhbmQKLWl0cyBtZW1vcnkgYWRkcmVzcy4gIEFsdGhvdWdoIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhIGJpdCBtb3JlCi1pbnZvbHZlZCwgdGhlIGhhbmRsZSwgaW4gZWZmZWN0LCBhY3RzIGxpa2UgYSBwb2ludGVyIGluIEMuICBOb3csCi1zdXBwb3NlIGFub3RoZXIgZnVuY3Rpb24gd2l0aGluIEJhZGdlciBpcyBjYWxsZWQgdGhhdCBjYXVzZXMgdGhlCi1vcmlnaW5hbCBvYmplY3QgdG8gYmUgZGVzdHJveWVkLiAgU2V2ZXJlIHByb2JsZW1zIHdpbGwgb2NjdXIgaWYgdGhlCi1QZXJsIHZhcmlhYmxlIGlzIHN1cHBsaWVkIHRvIGFub3RoZXIgQmFkZ2VyIGZ1bmN0aW9uLCBiZWNhdXNlIHRoZQotdmFyaWFibGUgcmVmZXJzIHRvIGEgbm9uLWV4aXN0ZW50IG9iamVjdC4gIFRoZSByZWFzb24gZm9yIHRoZQotZGlmZmljdWx0eSBpcyB0aGF0IHRoZSBleHRlbnNpb24gbGFuZ3VhZ2UgZXhwZWN0cyB0byBoYXZlIGNvbnRyb2wgb3ZlcgotdGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3QsIGJ1dCB0aGUgZXh0ZXJuYWwgc3lzdGVtIChCYWRnZXIpIGNhbm5vdAotbWVldCB0aGlzIGV4cGVjdGF0aW9uLgotCi08cD4KLUl0IGlzIHBvc3NpYmxlIHRvIGRlc2lnbiBCYWRnZXIgc28gdGhhdCB0aGUgZXh0ZW5zaW9uIGxhbmd1YWdlIAotaGFzIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciB0aGUgbGlmZXRpbWUgb2YgYWxsIHRoZSBvYmplY3RzIHdpdGhpbiB0aGUKLXN5c3RlbS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgYXBwcm9hY2ggcmVzdWx0cyBpbiBhIHN5c3RlbSB0aGF0IGlzIHRvbwotY2xvc2VseSB0aWVkIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UsIGFuZCBhZGRpbmcKLWEgbmV3IGV4dGVuc2lvbiBsYW5ndWFnZSB0byB0aGUgbWl4IGlzIGRpZmZpY3VsdC4gIEFuIGFsdGVybmF0ZQotc29sdXRpb24gdGhhdCBpcyBzaW1wbGUgdG8gaW1wbGVtZW50IGFuZCBpcyBwb3J0YWJsZSwgaXMgdG8KLWludHJvZHVjZSBgYHNtYXJ0IHJlZmVyZW5jZXMnJyAoYWxzbyBjYWxsZWQgcHJveGllcykgaW50byB0aGUKLWRlc2lnbiBbNSwgcGcuIDIwN10uICBJbiBlZmZlY3QsIGEgc21hcnQgcmVmZXJlbmNlIGlzIGFuIG9iamVjdCB0aGF0IGhhcyB0aGUgc2FtZQotc2V0IG9mIG9wZXJhdGlvbnMgYXMgYSBgYHJlYWwnJyBvYmplY3QsIGJ1dCB0aGUgc21hcnQgcmVmZXJlbmNlJ3MKLWltcGxlbWVudGF0aW9uIGNvbnNpc3RzIHNvbGVseSBvZiBhIHNpbmdsZSBwb2ludGVyIHRvIGEgYGByZWFsJycKLW9iamVjdCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KLQotPHA+Ci1UaGUgZXh0ZW5zaW9uIGxhbmd1YWdlIGludGVyZmFjZXMgd2l0aGluIEJhZGdlciAgaGF2ZSBiZWVuIGNyYWZ0ZWQgc28KLXRoYXQgdGhlIGV4dGVuc2lvbiBsYW5ndWFnZSBtYW5pcHVsYXRlcyBzbWFydCByZWZlcmVuY2VzIGFuZCB0aGF0IHRoZSBsaWZldGltZQotb2YgYSBzbWFydCByZWZlcmVuY2UgaXMgY29tcGxldGVseSB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUKLWV4dGVuc2lvbiBsYW5ndWFnZS4gIFVuZGVyIG1vc3QgY2lyY3Vtc3RhbmNlcywgdGhlIGV4dGVuc2lvbiBsYW5ndWFnZQotcGVyZm9ybXMgYW4gb3BlcmF0aW9uIG9uIHRoZSBzbWFydCByZWZlcmVuY2UsIGFuZCB0aGUgc21hcnQgcmVmZXJlbmNlCi10aGVuIGF0dGVtcHRzIHRvIHRyYW5zZmVyIHRoZSBvcGVyYXRpb24gdG8gdGhlIHJlYWwgb2JqZWN0LiAgSWYgdGhlCi1yZWFsIG9iamVjdCBoYXMgYmVlbiBkZXN0cm95ZWQgdGhlbiB0aGUgc21hcnQgcmVmZXJlbmNlIHdpbGwgaGF2ZSBiZWVuCi1pbnZhbGlkYXRlZCAoaXQgcG9pbnRzIHRvIDx0dD5uaWw8L3R0PikuICBJbiB0aGlzIGNhc2UsIHRoZSBvcGVyYXRpb24KLWlzIGFib3J0ZWQgYW5kLCBpZiBwb3NzaWJsZSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGUgZXh0ZW5zaW9uCi1sYW5ndWFnZS4gIEJhZGdlciBjb250YWlucyB0aGUgbmVjZXNzYXJ5IG1hY2hpbmVyeSB0byBpbnZhbGlkYXRlIGFueQotc21hcnQgcmVmZXJlbmNlcyB0aGF0IHBvaW50IHRvIGFuIG9iamVjdCBiZWluZyBkZXN0cm95ZWQuCi0KLTxwPgotTW9kZXJuIEMrKyBjb21waWxlcnMsIHdpdGggdGhlaXIgc3VwcG9ydCBmb3IgdGVtcGxhdGVzLCBydW4tdGltZSB0eXBlCi1pZGVudGlmaWNhdGlvbiwgYW5kIHNvIGZvcnRoLCBwcm92aWRlIHRoZSBtZWFucyB0byBhdXRvbWF0aWNhbGx5Ci1jb25zdHJ1Y3Qgc21hcnQgcmVmZXJlbmNlIGNsYXNzZXMuICBGb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMsIHdlIGFyZQotbm90IGFibGUgdG8gYWx3YXlzIHV0aWxpemUgbW9kZXJuIGNvbXBpbGVycy4gIEhlbmNlLCB3ZSBoYXZlIGNyZWF0ZWQKLXRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNtYXJ0IHJlZmVyZW5jZXMgbWFudWFsbHksIHdoaWNoIGlzIGEKLXRlZGlvdXMgcHJvY2Vzcy4gIEZvcnR1bmF0ZWx5LCB0aGlzIHRhc2sgY2FuIGJlIG1vc3RseSBhdXRvbWF0ZWQgYnkKLWNyZWF0aW5nIG91ciBvd24gY29kZSBnZW5lcmF0b3IgYXMgcGFydCBvZiBTV0lHLiAgVGhpcyBpcyBhIHNpbXBsZQotbWF0dGVyLCBhcyBTV0lHIGlzIGEgbW9kdWxhciBzb2Z0d2FyZSBzeXN0ZW0uCi0KLTxoND4gNS4xLjIgQ2FsbGJhY2tzPC9oND4KLQotVGhlIGV4dGVuc2lvbiBsYW5ndWFnZSBpbnRlcmZhY2UgcHJvZHVjZWQgYnkgU1dJRyBhbGxvd3MgZnVuY3Rpb25zCi1kZWZpbmVkIGluIHRoZSBleHRlcm5hbCBzeXN0ZW0gdG8gYmUgY2FsbGVkIGZyb20gd2l0aGluIGFuIGV4dGVuc2lvbgotbGFuZ3VhZ2UuICBVbmZvcnR1bmF0ZWx5LCB0aGUgaW50ZXJmYWNlIHByb2R1Y2VkIGJ5IFNXSUcgZG9lcyBub3QKLXN1cHBvcnQgdGhlIGNhbGxpbmcgb2YgZXh0ZW5zaW9uIGxhbmd1YWdlIGZ1bmN0aW9ucyB3aXRoaW4gQywKLUMrKywgb3IgT2JqZWN0aXZlLUMuICBUaGUgYWJpbGl0eSB0byBpbnZva2UgZnVuY3Rpb25zIGJpZGlyZWN0aW9uYWxseQotaXMgbmVlZGVkIGJ5IEJhZGdlciwgc28gc3VwcG9ydCBmb3IgY2FsbGJhY2tzIGZyb20gQysrIHRvIFBlcmwgaGFzIGJlZW4KLWRldmVsb3BlZCBbZm9vdG5vdGU6IEZvciBub3csIGNhbGxiYWNrcyBvbmx5IHdvcmsgd2l0aCBQZXJsLiAgU3VwcG9ydAotICBmb3IgY2FsbGJhY2tzIHdpdGggVGNsIGFuZCBKYXZhIHdpbGwgYmUgYWRkZWQgbGF0ZXJdLiAgVGhlIGJhc2ljCi1hcHByb2FjaCBpcyB0aGlzOgotCi08dWw+Ci08bGk+IERlZmluZSBhIGZ1bmN0aW9uLgotPGxpPiBSZWdpc3RlciB0aGUgZnVuY3Rpb24uCi08bGk+IFBlcmZvcm0gc29tZSBvcGVyYXRpb24gdGhhdCBjYXVzZXMgdGhlIHJlZ2lzdGVyZWQgZnVuY3Rpb24gdG8gYmUKLSAgaW52b2tlZC4KLTwvdWw+Ci0KLVRvIG1ha2UgdGhpcyB3b3JrLCBCYWRnZXIgcHJvdmlkZXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBpbgotQysrIGNhbGxlZCA8dHQ+VHJpZ2dlcjwvdHQ+LCBzbyBjYWxsZWQgYmVjYXVzZSBhIGZ1bmN0aW9uIGFzc29jaWF0ZWQKLXdpdGggb2JqZWN0cyBvZiB0aGlzIGNsYXNzIGlzIGludm9rZWQgd2hlbiBhbiBldmVudCBvZiBzb21lIGtpbmQKLW9jY3Vycy4gIEJhZGdlciBhbHNvIHByb3ZpZGVzIHRoZSBtYWNoaW5lcnkgdG8gYXNzb2NpYXRlIDx0dD5UcmlnZ2VyPC90dD4KLW9iamVjdHMgd2l0aCBhbiBldmVudCBuYW1lIGFuZCB3aXRoIG9uZSBvciBtb3JlIG9iamVjdHMgaW50ZXJuYWwgdG8KLXRoZSBzeXN0ZW0uICBXaGVuIGFuIGludGVybmFsIG9iamVjdCBgYHJlY2VpdmVzJycgYW4gZXZlbnQsIGl0Ci1leGFtaW5lcyB0aGUgc2V0IG9mIHJlZ2lzdGVyZWQgZnVuY3Rpb25zIGxvb2tpbmcgZm9yIGEgbWF0Y2guICBJZiBhCi1tYXRjaCBpcyBmb3VuZCB0aGVuIHRoZSA8dHQ+VHJpZ2dlcjwvdHQ+IG9iamVjdCBpcyBpbnZva2VkLCBhbmQgdGhlIG5hbWUgb2YgdGhlCi1ldmVudCBhbmQgdGhlIG9iamVjdCB0aGF0IHJlY2VpdmVkIHRoZSBldmVudCBhcmUgc3VwcGxpZWQgYXMKLWFyZ3VtZW50cy4KLQotPHA+Ci1CYWRnZXIgcHJvdmlkZXMgYSBudW1iZXIgb2YgY2xhc3NlcyBkZXJpdmVkIGZyb20gPHR0PlRyaWdnZXI8L3R0PiB0aGF0Ci1zcGVjaWFsaXplIGl0cyBiZWhhdmlvciBmb3IgY2VydGFpbiBleHRlbnNpb24gbGFuZ3VhZ2VzLCBmb3IgQysrLCBvcgotZm9yIGFuIG9iamVjdCByZXF1ZXN0IGJyb2tlci4gIEZvciBleGFtcGxlLCB0aGUgPHR0PlBlcmw1VHJpZ2dlcjwvdHQ+Ci1jbGFzcyBpcyBkZXJpdmVkIGZyb20gPHR0PlRyaWdnZXI8L3R0PiBhbmQgaXQgc3BlY2lhbGl6ZXMgaXRzIGJhc2UgY2xhc3MgYnkKLXN0b3JpbmcgYSBwb2ludGVyIHRvIGEgUGVybCBmdW5jdGlvbiByZWZlcmVuY2UgKGFuIDx0dD5TVio8L3R0PiksIGFuZAotYnkgcHJvdmlkaW5nIHRoZSBtYWNoaW5lcnkgbmVlZGVkIHRvIGludm9rZSB0aGF0IFBlcmwgZnVuY3Rpb24uCi0KLTxwPgotRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgUGVybCBmcmFnbWVudDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXN1YiBNeUZjbiB7Ci0gIG15ICRFdmVudE5hbWUgPSBzaGlmdDsKLSAgbXkgJE9iamVjdCA9IHNoaWZ0OwotICAjIC4uLiByZXN0IG9mIGZ1bmN0aW9uIGhlcmUuCi19Ci1teSAkT2JqZWN0ID0gQmFkZ2VyRnVuY3Rpb24oLi4uLik7Ci1teSAkTmFtZSA9ICJDYW4ndCBmaW5kIGZpbGUiOwotQmFkZ2VyOjpSZWdpc3RlckJ5T2JqZWN0KCROYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICRPYmplY3QsIFwmTXlGY24pOwotJE9iamVjdC0mZ3Q7UmVhZEZpbGUoIkEgYm9ndXMgZmlsZSBuYW1lIik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZSA8dHQ+TXlGY24oKTwvdHQ+IFBlcmwgZnVuY3Rpb24gaXMgdGhlIGNhbGxiYWNrICh0cmlnZ2VyKSBmdW5jdGlvbiwKLWFuZCBpdCBpcyByZWdpc3RlcmVkIHdpdGggPHR0PiRPYmplY3Q8L3R0PiB1c2luZyB0aGUKLWV2ZW50IG5hbWUgY2FsbGVkIGBgPHR0PkNhbid0IGZpbmQgZmlsZTwvdHQ+JycuICBOb3csIHN1cHBvc2UgdGhhdCB0aGUKLTx0dD4kT2JqZWN0LSZndDtSZWFkRmlsZSgpPC90dD4gb3BlcmF0aW9uIGZhaWxzLiAgSW50ZXJuYWxseSwgQmFkZ2VyIHdpbGwKLW5vdGUgdGhlIGZhaWx1cmUsIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgbmFtZSwgYXR0ZW1wdCB0bwotZmluZCBhIFRyaWdnZXIgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LCBhbmQgaWYgZm91bmQsIHdpbGwKLWBgaW52b2tlIHRoZSBUcmlnZ2VyJycgYnkgY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUgbWVtYmVyIGZ1bmN0aW9uLgotRm9yIHRoZSBleGFtcGxlIGFib3ZlLCB0aGlzIG1lYW5zIHRoYXQgdGhlIDx0dD5NeUZjbigpPC90dD4gZnVuY3Rpb24KLXdpbGwgYmUgY2FsbGVkIHdpdGggPHR0PiRPYmplY3Q8L3R0PiBhbmQgYGA8dHQ+Q2FuJ3QgZmluZCBmaWxlPC90dD4nJwotc3VwcGxpZWQgYXMgYXJndW1lbnRzLiAgVGhlIGZ1bmN0aW9uIG1heSByZXF1aXJlIG1vcmUgaW5mb3JtYXRpb24gc3VjaAotYXMgdGhlIGZpbGUgbmFtZSAodGhhdCBjb3VsZCBub3QgYmUgb3BlbmVkKSwgYW5kIGl0IG1pZ2h0IGZpbmQgdGhpcwotaW5mb3JtYXRpb24gYnkgYGBwdWxsaW5nJycgZGF0YSBmcm9tIHRoZSBleHRlcm5hbCBsaWJyYXJ5IHVzaW5nIHRoZQotZnVuY3Rpb25zIHdyYXBwZWQgYnkgU1dJRy4KLQotPHA+Ci1UaGUgPHR0PlJlZ2lzdGVyQnlPYmplY3QoKTwvdHQ+IGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZwotYW4gb2JqZWN0IG9mIHRoZSA8dHQ+UGVybDVUcmlnZ2VyPC90dD4gY2xhc3MsIGFuZCBmb3IgY3JlYXRpbmcgdGhlIGFzc29jaWF0aW9uCi1iZXR3ZWVuIHRoZSA8dHQ+UGVybDVUcmlnZ2VyPC90dD4sIHRoZSBldmVudCBuYW1lLCBhbmQgdGhlIG9iamVjdCByZWNlaXZpbmcgdGhlCi1ldmVudC4gIFRoZXJlIGlzIGEgYml0IG9mIHR5cGVtYXAgdHJpY2tlcnkgaW52b2x2ZWQgd2hlbiBpbnRlcmNlcHRpbmcKLXRoZSBhcmd1bWVudHMgZnJvbSBQZXJsOgotCi08YmxvY2txdW90ZT48cHJlPgotJXR5cGVtYXAocGVybDUsaW4pIFNWKiBwRmNuIHsKLSAgaWYgKCFTdlJPSygkc291cmNlKSkKLSAgICBjcm9haygiRXhwZWN0ZWQgYSByZWZlcmVuY2UuXG4iKTsKLSAgJHRhcmdldCA9IFN2UlYoJHNvdXJjZSk7Ci19Ci12b2lkCi1SZWdpc3RlckJ5T2JqZWN0KGNvbnN0IGNoYXIqIHBjRXZlbnROYW1lLAotICAgICAgICAgICAgICAgICBSZWYqIHBSZWYsIFNWKiBwRmNuKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhlIGZpbmFsIHBvcnRpb24gb2YgdGhlIHN5c3RlbSBsZWZ0IHRvIGRlc2NyaWJlIGlzIHRoZSBpbXBsZW1lbnRhdGlvbgotb2YgdGhlIDx0dD5QZXJsNVRyaWdnZXI6Okludm9rZSgpPC90dD4gbWVtYmVyIGZ1bmN0aW9uLCB3aGljaCBpcwotcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIFBlcmwgZnVuY3Rpb24gZnJvbSB0aGUgQysrIHNpZGUgb2YgdGhlCi13b3JsZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzLCB0YWtlbiBuZWFybHkgdmVyYmF0aW0gZnJvbSB0aGUKLUFkdmFuY2VkIFBlcmwgUHJvZ3JhbW1pbmcgYm9vayBbMSwgcGcuIDM1M10sIGxvb2tzIGxpa2UKLXRoaXM6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1ib29sCi1QZXJsNVRyaWdnZXI6OgotSW52b2tlKGNvbnN0IGNoYXIqIHBjRXZlbnROYW1lLAotICAgICAgIHZvaWQqIHBPYmplY3QsCi0gICAgICAgY29uc3QgY2hhciogcGNUeXBlTmFtZSkgewotICBkU1A7Ci0gIEVOVEVSOwotICBTQVZFVE1QUzsKLSAgUFVTSE1BUksoc3ApOwotICBTViogcFNWID0gc3ZfbmV3bW9ydGFsKCk7Ci0gIHN2X3NldHB2KHBTViwgKGNoYXIqKSBwY0V2ZW50TmFtZSk7Ci0gIFhQVVNIcyhwU1YpOwotICBwU1YgPSBzdl9uZXdtb3J0YWwoKTsKLSAgc3Zfc2V0cmVmX3B2KHBTViwgKGNoYXIqKSBwY1R5cGVOYW1lLAotICAgICAgICAgICAgICAgcE9iamVjdCk7Ci0gIFhQVVNIcyhwU1YpOwotICBwU1YgPSBzdl9uZXdtb3J0YWwoKTsKLSAgc3Zfc2V0cHYocFNWLCAoY2hhciopIHBjVHlwZU5hbWUpOwotICBYUFVTSHMocFNWKTsKLSAgUFVUQkFDSzsKLSAgaW50IG4gPSBwZXJsX2NhbGxfc3YodGhpcy0mZ3Q7cFBlcmw1RmNuLCAKLSAgICAgICAgICAgICAgIEdfU0NBTEFSKTsgCi0gIFNQQUdBSU47Ci0gIGlmIChuID09IDEpCi0gICAgbiA9IFBPUGk7Ci0gIFBVVEJBQ0s7Ci0gIEZSRUVUTVBTOwotICBMRUFWRTsKLSAgcmV0dXJuIG4gPT0gMCA/IGZhbHNlIDogdHJ1ZTsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGg0PiA1LjEuMyBCZW5lZml0cyBBbmQgTGltaXRhdGlvbnM8L2g0PgotCi1UaGUgYmVuZWZpdHMgdGhhdCBTV0lHIHByb3ZpZGVzIHRvIEJhZGdlciBhcmUgZW5vcm1vdXM6Ci0KLTx1bD4KLTxsaT4gTm90IGNvdW50aW5nIGN1c3RvbSBjb2RlIChlLmcuLCBsYW5ndWFnZS1zcGVjaWZpYwotICBjYWxsYmFja3MpLCBhbiBleHRlbnNpb24gbGFuZ3VhZ2UgaW50ZXJmYWNlIGNhbiBiZSBkZXZlbG9wZWQgaW4gYQotICBkYXksIGNvbXBhcmVkIHdpdGggd2Vla3MgZm9yIGEgaGFuZC1jcmFmdGVkIGFwcHJvYWNoLgotCi08bGk+IFNXSUcgc3VwcG9ydHMgdGhlIHVzZSBvZiBtdWx0aXBsZSBleHRlbnNpb24gbGFuZ3VhZ2VzIHdpdGggZWFzZS4KLQotPGxpPiBUaGUgcmVzdWx0aW5nIHNvbHV0aW9uIGlzIGZsZXhpYmxlLCBhbmQgdGhlIHJlc3VsdHMgY2FuIGJlCi0gIHRhaWxvcmVkIHRvIG1lZXQgdGhlIG5lZWRzIG9mIGNvbXBsZXggYXBwbGljYXRpb25zIChlLmcuLAotICBjYWxsYmFja3MsIHNtYXJ0IHJlZmVyZW5jZXMsIGFuZCBzbyBvbikuCi08L3VsPgotCi1TV0lHIGRvZXMgaGF2ZSBsaW1pdGF0aW9ucywgYnV0IHNvIGZhciwgbm9uZSBvZiB0aGVzZSBsaW1pdGF0aW9ucyBoYXMKLXByb3ZlbiB0byBiZSBhIHJlYWwgaW1wZWRpbWVudC4gIEl0IGFsc28gYXBwZWFycyB0aGF0IG1vc3Qgb2YgdGhlc2UKLWxpbWl0YXRpb25zIHdpbGwgYmUgZXJhZGljYXRlZCwgb25jZSBTV0lHIGhhcyBpdHMgb3duIGV4dGVuc2lvbgotbGFuZ3VhZ2UgaW50ZXJmYWNlIChzZWUgU2VjdGlvbiA3KS4KLQotCi08aDM+IDUuMiBUQ0FQIGFuZCBTQ0NQIGZyb20gSFAgT3BlbkNhbGw8L2gzPgotCi1PbmUgb2YgdGhlIHdlbGwga25vd24gcGl0ZmFsbHMgb2Ygc3lzdGVtYXRpYyBsaWJyYXJ5IHRlc3RpbmcgaXMgCi10aGUgY3JlYXRpb24gb2YgYSBodWdlIG51bWJlciBvZiBzbWFsbCBDIHByb2dyYW1zLS1lYWNoIGRlc2lnbmVkIHRvIHBlcmZvcm0KLWEgc2luZ2xlIHRlc3QuICBNb3JlIG9mdGVuIHRoYW4gbm90LCB0aGVzZSBDIHByb2dyYW1zIGhhdmUgYSBsb3Qgb2YKLWNvbW1vbiBjb2RlIHRoYXQgaXMgY29waWVkIGZyb20gb25lIHRlc3QgY2FzZSB0byB0aGUKLW90aGVyLiBUZXN0aW5nIGlzIGZ1cnRoZXIgY29tcGxpY2F0ZWQgYnkgdGhlIHRlZGlvdXMgcHJvY2VzcyBvZgotZWRpdGluZywgY29tcGlsaW5nLCBhbmQgZXhlY3V0aW5nIGVhY2ggb2YgdGhlc2UgcHJvZ3JhbXMuCi0KLTxwPgotVG8gc29sdmUgdGhpcyBwcm9ibGVtLCBTV0lHIGNhbiBiZSB1c2VkIHRvIGluY29ycG9yYXRlIGxpYnJhcmllcwotaW50byBQZXJsIGV4dGVuc2lvbiBtb2R1bGVzIHdoZXJlIHRlc3QgY2FzZXMgY2FuIGJlIGltcGxlbWVudGVkIGFzIFBlcmwgc2NyaXB0cy4KLUFzIGEgcmVzdWx0LCB0aGUgY29tcGlsZS1leGVjdXRlIGN5Y2xlIGlzIG5vIGxvbmdlciBhIHByb2JsZW0gYW5kCi1QZXJsIHNjcmlwdHMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGNvbW1vbiBwYXJ0cyBvZiB2YXJpb3VzIHRlc3QgY2FzZXMuCi0KLTxwPgotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgaW50ZWdyYXRpb24gb2YgUGVybCB3aXRoIGFuIEFQSSB0aGF0IGlzCi1wYXJ0IG9mIGEgSFAgT3BlbkNhbGwgdGVsZWNvbSBwcm9kdWN0IGRldmVsb3BlZCBhdCBIUCBHcmVub2JsZS4gIFRoZQotQVBJIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgVENBUCBhbmQgU0NDUCBsYXllcnMgb2YgdGhlIFNTNyBwcm90b2NvbAotYW5kIGNvbnNpc3RzIG9mIGFib3V0IDIwIGZ1bmN0aW9uIGFuZCA2MCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zLgotRnVydGhlcm1vcmUsIG1vc3QgZnVuY3Rpb24gcGFyYW1ldGVycyBhcmUgcG9pbnRlcnMgdG8gZGVlcGx5IG5lc3RlZAotc3RydWN0dXJlcyBzdWNoIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci10eXBlZGVmIGVudW0gewotICAuLi4KLX0gdGNfYWRkcmVzc19uYXR1cmU7Ci0KLXR5cGVkZWYgc3RydWN0ICB7Ci0gIC4uLgotICB0Y19hZGRyZXNzX25hdHVyZSAgbmF0dXJlOwotICAuLi4KLX0gdGNfZ2xvYmFsX3RpdGxlOwotCi10eXBlZGVmIHN0cnVjdCB0Y19hZGRyZXNzX3N0cnVjdCB7Ci0gIC4uLgotICB0Y19nbG9iYWxfdGl0bGUgICAgZ3Q7Ci0gIC4uLgotfSB0Y19hZGRyZXNzOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1Gcm9tIGEgUGVybCB1c2VycycgcG9pbnQgb2YgdmlldywgdGhlIGZ1bmN0aW9uYWxpdHkgb2ZmZXJlZAotYnkgdGhlIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZSBtdXN0IGJlIG5vdCBiZSB2ZXJ5IGRpZmZlcmVudCBmcm9tIHRoZSB1bmRlcmx5aW5nIEMgQVBJLgotT3RoZXJ3aXNlLCB0ZXN0IHdyaXRlcnMgbWF5IGJlIGNvbmZ1c2VkIGJ5IHRoZSBQZXJsIEFQSSBhbmQgdGVzdGluZwotd2lsbCBiZSB1bm5lY2Vzc2FyaWx5IGNvbXBsaWNhdGVkLiAgRm9ydHVuYXRlbHksIFNXSUcgYWRkcmVzc2VzIHRoaXMgcHJvYmxlbQotYmVjYXVzZSBQZXJsIGludGVyZmFjZXMgCi1hcmUgc3BlY2lmaWVkIHVzaW5nIEMgc3ludGF4IGFuZCB0aGUgcmVzdWx0aW5nIGludGVyZmFjZSBjbG9zZWx5Ci1yZXNlbWJsZXMgdGhlIG9yaWdpbmFsIEFQSS4KLQotPGg0PiA1LjIuMSBDcmVhdGluZyB0aGUgU1dJRyBJbnRlcmZhY2U8L2gzPgotCi1UbyB3cmFwIHRoZSBDIEFQSSwgdGhlcmUgd2VyZSB0aHJlZSBjaG9pY2VzOiBjb3B5Ci1hbmQgbW9kaWZ5IHRoZSBoZWFkZXIgZmlsZXMgaW50byBhIFNXSUcgaW50ZXJmYWNlIGZpbGUsIGZlZWQgdGhlCi1oZWFkZXIgZmlsZXMgZGlyZWN0bHkgdG8gU1dJRywgb3Igd3JpdGUgYW4gaW50ZXJmYWNlIGZpbGUgdGhhdCBpbmNsdWRlcwotc29tZSBwYXJ0cyBvZiB0aGUgaGVhZGVyIGZpbGVzLiBUaGUgZmlyc3QgY2hvaWNlIAotcmVxdWlyZXMgdGhlIGR1cGxpY2F0aW9uIG9mIEMgZGVmaW5pdGlvbnMtLWEgdGFzayB0aGF0IGlzCi1kaWZmaWN1bHQgdG8gbWFuYWdlIGFzIHRoZSBBUEkgZXZvbHZlcyAoc2luY2UgaXQgaXMgaGFyZCB0byBtYWludGFpbgotY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgaW50ZXJmYWNlIGZpbGUgYW5kIGhlYWRlciBmaWxlcykuCi1UaGUgc2Vjb25kIGNob2ljZSBtYXkgd29yayBpZiB0aGUgaGVhZGVyIGZpbGVzIGFyZSB3cml0dGVuIGluIGEgdmVyeQotY2xlYW4gd2F5LiAgSG93ZXZlciwgaXQgY2FuIGJyZWFrIGRvd24gaWYgaGVhZGVyIGZpbGVzIGFyZSB0b28gY29tcGxpY2F0ZWQuCi1UaGVyZWZvcmUsIGEgbWl4IG9mIGhlYWRlciBmaWxlcyBhbmQgaW50ZXJmYWNlcyB3YXMgdXRpbGl6ZWQuCi0KLTxwPgotQXMgcGFydCBvZiB0aGUgaW50ZXJmYWNlIGJ1aWxkaW5nIHByb2Nlc3MsIGhlYWRlciBmaWxlcyB3ZXJlIHRvCi1iZSBpbmNsdWRlZCBkaXJlY3RseSBpbnRvIGludGVyZmFjZSBmaWxlcy4gIFRoaXMgaXMgZWFzaWx5IGRvbmUKLXVzaW5nIHRoZSA8dHQ+JWluY2x1ZGU8L3R0PiBkaXJlY3RpdmUsIGJ1dCBhIG51bWJlciBvZiBwcm9ibGVtYXRpYwotbmVzdGVkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgaGFkIHRvIGJlIGZpeGVkLiBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLXN0cnVjdCB0Y1N0YXQgewotICAuLi4KLSAgdW5pb24gewotICAgIC4uLgotICAgIHN0cnVjdCBzdGF0X3BfYWJvcnQgewotICAgICAgaW50IHZhbHVlOwotICAgICAgdGNfcF9hYm9ydF9jYXVzZSAgcF9hYm9ydDsKLSAgICB9IGFib3J0OwotICAgIC4uLgotICB9IHA7Ci19IHRjX3N0YXQ7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRvIG1ha2UgdGhpcyBzdHJ1Y3R1cmUgbW9yZSBtYW5hZ2VhYmxlIGluIFNXSUcsIGl0IGNhbiBiZSBzcGxpdCBpbnRvCi1zbWFsbGVyIHBpZWNlcyBhbmQgcmV3cml0dGVuIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCB2YWx1ZTsKLSAgdGNfcF9hYm9ydF9jYXVzZSAgcF9hYm9ydDsKLX0gdGNfc3RhdF9hYm9ydDsKLQotc3RydWN0IFRjU3RhdCB7Ci0gIC4uLgotICB0Y19zdGF0X2Fib3J0ICBhYm9ydDsKLSAgLi4uCi19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotU3VjaCBjaGFuZ2VzIGhhdmUgbm8gaW1wYWN0IG9uIHVzZXIgY29kZSwgYnV0IHRoZXkgc2ltcGxpZnkgdGhlCi11c2Ugb2YgU1dJRy4KLTxwPgotSW4gYWRkaXRpb24gdG8gc3BsaXR0aW5nLCBhIG51bWJlciBvZiBzdHJ1Y3R1cmVzIGluIHRoZQotaGVhZGVyIGZpbGVzIHdlcmUgdG8gYmUgaGlkZGVuIGZyb20gdGhlIFNXSUcgY29tcGlsZXIuICBXaGlsZQotdGhpcyBjb3VsZCBiZSBkb25lIHVzaW5nIGEgc2ltcGxlIDx0dD4jaWZuZGVmIFNXSUc8L3R0PiBpbiB0aGUgY29kZSwKLXRoaXMgY291bGQgcG90ZW50aWFsbHkgcmVzdWx0IGluIGEgaHVnZSBjdXN0b21lciBwcm9ibGVtIGlmIHRoZXkgYWxzbyBkZWZpbmVkCi1hIDx0dD5TV0lHPC90dD4gbWFjcm8gaW4gdGhlaXIgY29tcGlsYXRpb24gcHJvY2Vzcy4gICBUaGVyZWZvcmUsCi1jb25kaXRpb25hbCBjb21waWxhdGlvbiB3YXMgaW1wbGVtZW50ZWQgdXNpbmcgc29tZSBjbGV2ZXIgQwotY29tbWVudHMgdGhhdCB3ZXJlIHBhcnNlZCBieSB2cHAgKFNlZSB0aGUgVGV4dDo6VnBwIG1vZHVsZSkgZHVyaW5nCi10aGUgYnVpbGQgb2YgdGhlIFNXSUcgaW50ZXJmYWNlLiBGb3IgZXhhbXBsZSwKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8qCi1IUCByZXNlcnZlZCBjb21tZW50Ci1AaWYgbm90ICRfaHBfcmVzZXJ2ZWRfdAotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50ICAgICAgICAgICBsZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgZGF0YXNbTUFYX0FCT1JUX0xFTl07Ci19IHRjX3VfYWJvcnQ7Ci0vKgotQGVuZGlmCi0gKi8KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGg0PiA1LjIuMiBTaGFkb3cgQ2xhc3NlczwvaDQ+Ci0KLUJ5IGRlZmF1bHQsIFNXSUcgY29udmVydHMgc3RydWN0dXJlIGRlZmluaXRpb25zIGludG8gYWNjZXNzb3IgZnVuY3Rpb25zCi1zdWNoIGFzCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci10Y19nbG9iYWxfdGl0bGUgKgotdGNfYWRkcmVzc19ndF9nZXQodGNfYWRkcmVzcyAqKTsKLQotdGNfYWRkcmVzc19uYXR1cmUKLXRjX2dsb2JhbF90aXRsZV9uYXR1cmVfc2V0KAotICAgdGNfZ2xvYmFsX3RpdGxlICp0LAotICAgdGNfYWRkcmVzc19uYXR1cmUgdmFsKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVW5mb3J0dW5hdGVseSwgdXNpbmcgc3VjaCBmdW5jdGlvbnMgaXMgc29tZXdoYXQgdW5mcmllbmRseQotZnJvbSBQZXJsLiAgRm9yIGV4YW1wbGUsIHRvIHNldCBhIHNpbmdsZSB2YWx1ZSwgaXQgd291bGQgYmUKLW5lY2Vzc2FyeSB0byB3cml0ZSB0aGUgZm9sbG93aW5nOgotCi08YmxvY2txdW90ZT48cHJlPgotJHBhcmFtID0gbmV3X3RjX2FkZHJlc3MoKTsKLXRjX2dsb2JhbF90aXRsZV9uYXR1cmVfc2V0KAotICAgIHRjX2FkZHJlc3NfZ3RfZ2V0KCRwYXJhbSksCi0gICAgJHZhbHVlKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotRm9ydHVuYXRlbHksIHNoYWRvdyBjbGFzc2VzIHNvbHZlIHRoaXMgcHJvYmxlbSBieSBwcm92aWRpbmcgb2JqZWN0LW9yaWVudGVkCi1hY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgQyBzdHJ1Y3R1cmVzLiAgQXMgYSByZXN1bHQsIGl0IGlzIHBvc3NpYmxlCi10byByZXdyaXRlIHRoZSBhYm92ZSBQZXJsIGNvZGUgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSRwYXJtID0gbmV3IHRjX2FkZHJlc3M7Ci0kcGFyYW0tJmd0O3tndH17bmF0dXJlfSA9ICR2YWx1ZTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotTmVlZGxlc3MgdG8gc2F5LCB0aGlzIGFwcHJvYWNoIGlzIG11Y2ggZWFzaWVyIGZvciB1c2VycyB0byBncmFzcC4KLQotPGg0PiA1LjIuMyBDdXN0b21pemF0aW9uIFdpdGggVHlwZW1hcHM8L2g0PgotCi1UbyBpbXByb3ZlIHRoZSBQZXJsIGludGVyZmFjZSwgYSBudW1iZXIgb2YgdHlwZW1hcHMgd2VyZSBkZWZpbmVkCi1mb3IgdmFyaW91cyBwYXJ0cyBvZiB0aGUgaW50ZXJmYWNlLiAgIAotT25lIHVzZSBvZiB0eXBlbWFwcyB3YXMgaW4gc3RydWN0dXJlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmc6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLi4uCi0gICAgdGNfdV9hYm9ydCAgYWJvcnRfcmVhc29uOwotICAgIC4uLgotfSB0Y19kaWFsb2dfcG9ydGlvbjsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotU2luY2UgPHR0PnRjX3VfYWJvcnQ8L3R0PiBpcyBkZWZpbmVkIGJ5IHRoZSBzdHJ1Y3R1cmUgc2hvd24gZWFybGllciwKLVNXSUcgbm9ybWFsbHkgdHJpZXMgdG8gbWFuaXB1bGF0ZSBpdCB0aHJvdWdoIHBvaW50ZXJzLiAgSG93ZXZlciwgYSB0eXBlbWFwCi1jYW4gYmUgZGVmaW5lZCB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvci4gIEluIHBhcnRpY3VsYXIsIGl0IHdhcwotZGVjaWRlZCB0aGF0IHRlc3RlcnMgc2hvdWxkIGJlIGFibGUgdG8gc2V0IGFuZCBnZXQgdGhpcyB2YWx1ZSB1c2luZwotQkNEIGVuY29kZWQgc3RyaW5ncyBzdWNoIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1teSAkZGlhbG9nID0gbmV3IHRjX2RpYWxvZ19wb3J0aW9uOwotJGRpYWxvZy0mZ3Q7e2Fib3J0X3JlYXNvbn0gPSAnMGY0NTZBJzsKLQotIyBPcgotcHJpbnQgIlVzZXIgYWJvcnQgcmVhc29uIGlzIFwKLSRkaWFsb2ctJmd0O3thYm9ydF9yZWFzb259IFxuIjsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVG8gZG8gdGhpcywgYSB0eXBlbWFwIGZvciBjb252ZXJ0aW5nIEJDRCBQZXJsIHN0cmluZ3MgaW50byBhbiAKLWFwcHJvcHJpYXRlIGJ5dGUgc2VxdWVuY2Ugd2VyZSBkZXZlbG9wZWQuICBJbiBhZGRpdGlvbiwgdGhlIHR5cGVtYXAKLXBlcmZvcm1zIGEgZmV3IHNhbml0eSBjaGVja3MgdG8gcHJldmVudCBpbnZhbGlkIHZhbHVlcy4gCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0ldHlwZW1hcCAocGVybDUsaW4pIHRjX3VfYWJvcnQgKgotKCRiYXNldHlwZSB0ZW1wKQotewotICBpbnQgaTsKLSAgU1RSTEVOIGxlbjsKLSAgc2hvcnQgdG1wOwotICBjaGFyICpzdHI7Ci0gICR0YXJnZXQgPSAmdGVtcDsKLQotICAvKiBjb252ZXJ0ICBzY2FsYXIgdG8gY2hhciogKi8KLSAgc3RyID0gU3ZQVigkc291cmNlLGxlbik7Ci0gIC8qIGNoZWNrIGlmICBldmVuICMgb2YgY2hhciAqLwotICBpZiAoIChsZW4gJSAyKSAhPSAwICkgewotICAgIGNyb2FrKCJVbmV2ZW4gIyBvZiBjaGFyIik7Ci0gIH0KLSAgLyogc2V0IGxlbmd0aCBmaWVsZCAqLwotICAkdGFyZ2V0LSZndDtsZW5ndGg9KGxlbi8yKTsKLSAgaWYgKChsZW4vMikmZ3Q7KHNpemVvZigkYmFzZXR5cGUpLTEpKQotICB7Ci0gICAgY3JvYWsoIlRvbyBtYW55IGJ5dGVzIGluIHZhbHVlXG4iKTsKLSAgfQotICBmb3IgKGk9MDtpJmx0OyR0YXJnZXQtJmd0O2xlbmd0aDtpKyspCi0gIHsKLSAgICBpZiAoc3NjYW5mKHN0ciwiJTJoeCIsICZ0bXApICE9IDEgKQotICAgICAgY3JvYWsoInNzY2FuZiBmYWlsZWQgb24gJXMsIFwKLSAgICAgICAgICAgICBpcyBpdCBoZXhhID9cbiIsc3RyKTsKLSAgICAgICR0YXJnZXQtJmd0O2RhdGFzW2ldID0gdG1wOwotICAgICAgc3RyKz0yOwotICB9Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRvIHJldHVybiB0aGUgYnl0ZSBidWZmZXIgYmFjayB0byBQZXJsIGFzIGEgc3RyaW5nLCBhIHNvbWV3aGF0IHNpbXBsZXIgdHlwZW1hcAotaXMgdXNlZDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSV0eXBlbWFwIChwZXJsNSxvdXQpIHRjX3VfYWJvcnQgKgotewotICBpbnQgaTsKLSAgJHRhcmdldD1uZXdTVnB2ZigiJXgiLCRzb3VyY2UtJmd0O2RhdGFzWzBdKTsKLQotICBmb3IgKGk9MTsgaSZsdDsgJHNvdXJjZS0mZ3Q7bGVuZ3RoOyBpKyspIHsKLSAgICBzdl9jYXRwdmYoJHRhcmdldCwiJXgiLAotICAgICAgICAgICAgICAkc291cmNlLSZndDtkYXRhc1tpXSk7Ci0gIH0KLSAgYXJndmkgKys7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVNXSUcgdHlwZW1hcHMgd2VyZSBhbHNvIHVzZWQgdG8gZml4IGEgZmV3IG90aGVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLAotc29tZSBmdW5jdGlvbnMgcmVxdWlyZWQgYW4gYWRkcmVzcyBwYXJhbWV0ZXIgZW5jb2RlZCBhcyBhIHR3by1lbGVtZW50IGFycmF5LgotQnkgZGVmYXVsdCwgU1dJRyB3cmFwcyB0aGlzIHBhcmFtZXRlciBhcyBhIHBvaW50ZXIsIGJ1dCB0aGlzIAotbGVhdmVzIHRoZSBQZXJsIHdyaXRlciB3aXRoIHRoZSBwYWluZnVsIHRhc2tzIG9mIGNyZWF0aW5nIGFuZAotZmlsbGluZyBhIEMgYXJyYXkgd2l0aCBzZW5zaWJsZSB2YWx1ZXMgdXNpbmcgdGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5IG9yCi1oZWxwZXIgZnVuY3Rpb25zLiAgRm9ydHVuYXRlbHksIHdpdGggdHlwZW1hcHMsIGl0IHdhcyBwb3NzaWJsZSB0bwotY3JlYXRlIGFuZCBzZXQgdGhpcyBwYXJhbWV0ZXIgdXNpbmcgUGVybCBoYXNoZXMgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSMgJGFkZHJlc3MgaXMgYW4gb3JkaW5hcnkgcGVybCBoYXNoCi0jICRhZGRyZXNzIHdpbGwgYmUgdXNlZCBhcyBhbiBhcnJheQotJGFkZHJlc3MtJmd0O3twY30gPSAxMDsgCi0kYWRkcmVzcy0mZ3Q7e3Nzbn09IDEyOwotLi4uCi1TQ0NQX29hbWNtZCgkY254SWQsICR0aW1lLCB1bmRlZiwgJGFkZHJlc3MsCi0gICAgICAgICAgICAkY29tbWFuZCwgJGNtZF9wYXJtcyk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZSB0eXBlbWFwIGltcGxlbWVudGluZyB0aGlzIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0ldHlwZW1hcCAocGVybDUsaW4pIFNjY3BPYW1BZGRyZXNzKiB7Ci0gIEhWKiBwYXNzZWRIYXNoOwotICBTVioqIHZhbHVlUFA7Ci0gIFNjY3BPYW1BZGRyZXNzIHRlbXBBZGRyZXNzOwotICBpZiAoIVN2T0soJHNvdXJjZSkpIHsKLSAgICAgIC8qIHdlIHdlcmUgcGFzc2VkIHVuZGVmICovCi0gICAgICB0ZW1wQWRkcmVzc1swXSA9IDA7Ci0gICAgICB0ZW1wQWRkcmVzc1sxXSA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFTdlJPSygkc291cmNlKSkKLSAgICAgIGNyb2FrKCJOb3QgYSByZWZlcmVuY2VcbiIpOwotICAgIGlmIChTdlRZUEUoU3ZSVigkc291cmNlKSkgIT0gU1Z0X1BWSFYpCi0gICAgICBjcm9haygiTm90IGEgaGFzaCByZWZlcmVuY2VcbiIpOwotCi0gICAgcGFzc2VkSGFzaCA9IChIViopIFN2UlYoJHNvdXJjZSk7Ci0gICAgdmFsdWVQUD1odl9mZXRjaChwYXNzZWRIYXNoLCJzc24iLDMsMCk7Ci0KLSAgICBpZiAoKnZhbHVlUFAgPT0gTlVMTCkKLSAgICAgIGNyb2FrKCJNaXNzaW5nICdzc24nIGtleVxuIik7Ci0gICAgdGVtcEFkZHJlc3NbMV0gPSBTdklWKCp2YWx1ZVBQKTsKLSAgICB2YWx1ZVBQPWh2X2ZldGNoKHBhc3NlZEhhc2gsInBjIiwyLDApOwotICAgIGlmICgqdmFsdWVQUCA9PSBOVUxMKQotICAgICAgY3JvYWsoIk1pc3NpbmcgJ3BjJyBrZXlcbiIpOwotICAgIHRlbXBBZGRyZXNzWzBdID0gU3ZJVigqdmFsdWVQUCk7Ci0gIH0KLSAgJHRhcmdldCA9ICZ0ZW1wQWRkcmVzczsKLX0KLQotLyogU2NjcE9hbUFkZHJlc3MgaXMgcmV0dXJuZWQgYXMgCi0gICB7J3Nzbic9PnNzbl92YWx1ZSwgJ3BjJz0+cGNfdmFsdWV9ICovCi0ldHlwZW1hcCAocGVybDUsb3V0KSBTY2NwT2FtQWRkcmVzcyogewotICBIViogcGFzc2VkSGFzaDsKLSAgU1YqIHRoZVNzbjsKLSAgU1YqIHRoZVBjOwotCi0gIHRoZVBjICA9IG5ld1NWaXYoKCokc291cmNlKVswXSk7Ci0gIHRoZVNzbiA9IG5ld1NWaXYoKCokc291cmNlKVsxXSk7Ci0gIHBhc3NlZEhhc2ggPSBuZXdIVigpOwotICBodl9zdG9yZShwYXNzZWRIYXNoLCJzc24iLDMsdGhlU3NuLDApOwotICBodl9zdG9yZShwYXNzZWRIYXNoLCJwYyIsMix0aGVQYywwKTsKLSAgJHRhcmdldCA9IG5ld1JWX25vaW5jKChTViopIHBhc3NlZEhhc2gpOwotICBhcmd2aSArKzsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGg0PiA1LjIuNCBTdGF0aXN0aWNzPC9oND4KLQotVGFibGUgMSBzaG93cyB0aGUgYW1vdW50IG9mIGNvZGUgYXNzb2NpYXRlZCB3aXRoIC5pIGZpbGVzIGFuZAotaGVhZGVyIGZpbGVzIGFzIHdlbGwgYXMgdGhlIGFtb3VudCBvZiBjb2RlIGdlbmVyYXRlZCBieSBTV0lHICguQyBhbmQgLnBtCi1maWxlcykuICAgV2hpbGUgaXQgd2FzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIGZldyAuaSBmaWxlcywgdGhlIHNpemUgb2YKLXRoZXNlIGZpbGVzIGlzIHNtYWxsIGluIGNvbXBhcnNpb24gdG8gdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZXMuCi0KLTxwPgotPGNlbnRlcj4KLTx0YWJsZSBib3JkZXIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz01PgotPGNhcHRpb24gYWxpZ249Ym90dG9tPiBUYWJsZSAxOiBUQ0FQIGFuZCBTQ1BQIE1vZHVsZXM8L2NhcHRpb24+Ci08dHI+Ci08dGg+IE1vZHVsZSA8L3RoPgotPHRoPiAuaSBmaWxlcyA8L3RoPgotPHRoPiAuaCBmaWxlcyA8L3RoPgotPHRoPiAuQyBmaWxlcyA8L3RoPgotPHRoPiAucG0gZmlsZXMgPC90aD4KLTwvdHI+Ci08dHI+Ci08dGg+IFRDQVAgPC90aD4KLTx0ZD4gNDM0IDwvdGQ+Ci08dGQ+IDk3NyA8L3RkPgotPHRkPiAxNjA5OCA8L3RkPgotPHRkPiAzNTYxIDwvdGQ+Ci08L3RyPgotPHRyPgotPHRoPiBTQ1BQIDwvdGg+Ci08dGQ+IDM2NCA8L3RkPgotPHRkPiA0OTQgPC90ZD4KLTx0ZD4gMTMwNjAgPC90ZD4KLTx0ZD4gMjI0NiA8L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2NlbnRlcj4KLQotPGg0PiA1LjIuNSBSZXN1bHRzIDwvaDQ+Ci0KLU92ZXJhbGwsIFNXSUcgc2F2ZWQgdGltZSB3aGVuIHByb3ZpZGluZyBQZXJsIGFjY2VzcyB0byB0aGUgVENBUCBhbmQgU0NDUAotbGlicmFyaWVzLiAgIFdoaWxlIGl0IHRvb2sgc29tZSB0aW1lIGFuZCBoYXJkIHdvcmsgdG8gd3JpdGUgdGhlIHR5cGVtYXBzLAotdGhlIFNXSUcgYXBwcm9hY2ggaGFzIHNldmVyYWwgYWR2YW50YWdlcyBjb21wYXJlZCB0byBYUyBvciB0aGUKLXB1cmUgQyBhcHByb2FjaDoKLQotPHVsPgotCi08bGk+IFRoZSBpbnRlcmZhY2UgZmlsZXMgYXJlIHF1aXRlIHNob3J0IHNvIGlmIHRoZXkgYXJlIHdlbGwgZG9jdW1lbnRlZCwgYSBuZXcgCi0gIFNXSUcgdXNlciBzaG91bGQgbm90IGhhdmUgYW55IG1ham9yIHByb2JsZW1zIG1haW50YWluaW5nIHRoZW0uCi08bGk+IEEgbmV3IHZlcnNpb24gb2YgdGhlIEFQSSBpcyB3cmFwcGVkIHdpdGggYSAnbWFrZScgY29tbWFuZCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBlZGl0Ci0gIGFueSBmaWxlLiBJbiBtb3N0IGNhc2VzIHRoZSBpbnRlcmZhY2UgZmlsZXMgY2FuIHJlbWFpbiB1bm1vZGlmaWVkLCBwcm92aWRlZAotICB0aGVyZSBhcmUgbm8gd2VpcmQgY29uc3RydWN0cyBpbnRyb2R1Y2VkIGluIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgQVBJLgotPGxpPiBOZXcgY29tbWVudHMgYWRkZWQgaW4gdGhlIGhlYWRlciBmaWxlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgaW4gdGhlCi0gIGRvY3VtZW50YXRpb24gZmlsZXMgZ2VuZXJhdGVkIGJ5IFNXSUcuCi08bGk+IElmIG5lY2Vzc2FyeSwgbmV3IGhlbHBlciBmdW5jdGlvbnMgbWF5IGJlIGFkZGVkIGluIHRoZSAuaSBmaWxlcyB3aXRob3V0IAotICBpbXBhY3Rpbmcgb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUgb3IgdHlwZW1hcHMuICBUaGlzIGFsbG93cyBhIG5ldyB1c2VyIHRvIGRvIGl0Ci0gIHdpdGhvdXQgcmVhZGluZyB0aGUgd2hvbGUgU1dJRyBtYW51YWwuCi08bGk+IFR5cGVtYXBzIHRoYXQgZGVhbCB3aXRoIGJhc2ljIHR5cGVzIG9yIHNpbXBsZSBzdHJ1Y3R1cmVzIGFyZSByZXVzYWJsZQotICBhbmQgY2FuIGJlIHVzZWQgd2l0aCBvdGhlciBBUElzLgotPC91bD4KLQotRm9yIHRob3NlIHdobyBhcmUgY29uc2lkZXJpbmcgU1dJRydzIGFkdmFuY2VkIGZlYXR1cmVzLCB0aGUgbGVhcm5pbmcKLWN1cnZlIGlzIGEgbGl0dGxlIHN0ZWVwIGF0IGZpcnN0LCBidXQgdGhlIHJld2FyZHMgYXJlIGdyZWF0IGJlY2F1c2UKLVNXSUcgYWR2YW5jZWQgZmVhdHVyZXMgd2lsbCBlbmFibGUgeW91IHRvIHByb3ZpZGUgYW4gaW1wcm92ZWQKLWludGVyZmFjZSB0byB0aGUgUGVybCB1c2VyLgotCi0KLQotCi0KLQotCi08aDI+IDYgTGltaXRhdGlvbnM8L2gyPgotCi1DdXJyZW50bHksIFNXSUcgaXMgYmVpbmcgdXNlZCBieSBodW5kcmVkcyBvZiB1c2VycyBpbiBjb25qdW5jdGlvbgotd2l0aCBhIHZhcmlldHkgb2YgYXBwbGljYXRpb25zLiAgIEhvd2V2ZXIsIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCi1vZiBTV0lHIGhhcyBhIG51bWJlciBvZiBsaW1pdGF0aW9ucy4gICAgU29tZSBvZiB0aGVzZSBsaW1pdGF0aW9ucyBhcmUKLWR1ZSB0byB0aGUgZmFjdCB0aGF0IFNXSUcgaXMgbm90IGEgZnVsbCBDL0MrKyBwYXJzZXIuICAgSW4gcGFydGljdWxhciwKLXRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkOgotCi08dWw+Ci08bGk+IFZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMgKC4uLikKLTxsaT4gUG9pbnRlcnMgdG8gZnVuY3Rpb25zLgotPGxpPiBUZW1wbGF0ZXMuCi08bGk+IE92ZXJsb2FkZWQgZnVuY3Rpb25zIGFuZCBvcGVyYXRvcnMuCi08bGk+IEMrKyBOYW1lc3BhY2VzLgotPGxpPiBOZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMuCi08L3VsPgotCi1XaGVuIHRoZXNlIGZlYXR1cmVzIGFwcGVhciBpbiBhIFNXSUcgaW5wdXQgZmlsZSwgYSBzeW50YXggZXJyb3Igb3IKLXdhcm5pbmcgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuICBUbyBlbGltaW5hdGUgdGhlc2Ugd2FybmluZ3MsCi1wcm9ibGVtYXRpYyBkZWNsYXJhdGlvbnMgY2FuIGVpdGhlciBiZSByZW1vdmVkIGZyb20gdGhlIGludGVyZmFjZSwKLWhpZGRlbiB3aXRoIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLCBvciB3cmFwcGVkIHVzaW5nIGhlbHBlcgotZnVuY3Rpb25zIGFuZCBvdGhlciBTV0lHIGRpcmVjdGl2ZXMuCi0KLTxwPgotQSBjbG9zZWx5IHJlbGF0ZWQgcHJvYmxlbSBpcyB0aGF0IGNlcnRhaW4gQy9DKysgcHJvZ3JhbXMgYXJlIG5vdCBlYXNpbHkKLXNjcmlwdGVkLiAgRm9yIGV4YW1wbGUsIHByb2dyYW1zIHRoYXQgbWFrZSBleHRlbnNpdmUgdXNlIG9mCi1hZHZhbmNlZCBDKysgZmVhdHVyZXMgc3VjaCBhcyB0ZW1wbGF0ZXMsIHNtYXJ0IHBvaW50ZXJzLCBhbmQgb3ZlcmxvYWRlZAotb3BlcmF0b3JzIGNhbiBiZSBleHRyZW1lbHkgdHJvdWJsZXNvbWUgdG8gaW5jb3Jwb3JhdGUKLWludG8gUGVybC4gICBUaGlzIGlzIGVzcGVjaWFsbHkgdGhlIGNhc2UgZm9yIEMrKyBwcm9ncmFtcyB0aGF0IG92ZXJyaWRlCi10aGUgc3RhbmRhcmQgYmVoYXZpb3Igb2YgcG9pbnRlcnMgYW5kIGRlZmVyZW5jaW5nIG9wZXJhdGlvbnMtLS1vcGVyYXRpb25zCi10aGF0IGFyZSB1c2VkIGV4dGVuc2l2ZWx5IGJ5IFNXSUcgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZS4KLQotPHA+Ci1JbiBhZGRpdGlvbiwgU1dJRyBkb2VzIG5vdCBwcm92aWRlIHF1aXRlIGFzIG11Y2ggZmxleGliaWxpdHkgYXMgPHR0PnhzdWJwcDwvdHQ+IGFuZAotb3RoZXIgUGVybCBzcGVjaWZpYyBleHRlbnNpb24gYnVpbGRpbmcgdG9vbHMuICAgSW4gb3JkZXIgdG8gYmUgZ2VuZXJhbCBwdXJwb3NlLAotU1dJRyBoaWRlcyBtYW55IG9mIHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIGVhY2ggc2NyaXB0aW5nCi1sYW5ndWFnZS4gIEFzIGEgcmVzdWx0LCBpdCBjYW4gYmUgZGlmZmljdWx0IHRvIGFjY29tcGxpc2ggY2VydGFpbiB0YXNrcy4gIEZvcgotZXhhbXBsZSwgb25lIHN1Y2ggc2l0dWF0aW9uIGlzIHRoZSBoYW5kbGluZyBvZiBmdW5jdGlvbnMgd2hlcmUgYXJndW1lbnRzCi1hcmUgaW1wbGljaXRseSByZWxhdGVkIHRvIGVhY2ggb3RoZXIgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+PHByZT4KLXZvaWQgZm9vKGNoYXIgKnN0ciwgaW50IGxlbikgewotICAgLy8gc3RyID0gc3RyaW5nIGRhdGEKLSAgIC8vIGxlbiA9IGxlbmd0aCBvZiBzdHJpbmcgZGF0YSAgIAotICAgLi4uCi19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUlkZWFsbHksIGl0IG1pZ2h0IGJlIGRlc2lyYWJsZSB0byBwYXNzIGEgc2luZ2xlIFBlcmwgc3RyaW5nIHRvIHN1Y2ggYSBmdW5jdGlvbgotYW5kIGhhdmUgaXQgZXhwYW5kZWQgaW50byBhIGRhdGEgYW5kIGxlbmd0aCBjb21wb25lbnQuICAgVW5mb3J0dW5hdGVseSwgU1dJRwotaGFzIG5vIHdheSB0byBrbm93IHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgcmVsYXRlZCB0byBlYWNoIG90aGVyIGluIHRoaXMgbWFubmVyLgotRnVydGhlcm1vcmUsIHRoZSBjdXJyZW50IHR5cGVtYXAgbWVjaGFuaXNtIG9ubHkgYXBwbGllcyB0byBzaW5nbGUgYXJndW1lbnRzIAotc28gaXQgY2FuIG5vdCBiZSB1c2VkIHRvIGNvbWJpbmUgYXJndW1lbnRzIGluIHRoaXMgbWFubmVyLiAgIFhTLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgbW9yZQotY2xvc2VseSB0aWVkIHRvIHRoZSBQZXJsIGludGVycHJldGVyIGFuZCBjb25zZXF1ZW50bHkgcHJvdmlkZXMgbW9yZQotcG93ZXIgaW4gdGhlIHdheSB0aGF0IGFyZ3VtZW50cyBjYW4gYmUgY29udmVydGVkIGFuZCBwYXNzZWQgdG8gQyBmdW5jdGlvbnMuCi0KLTxwPgotRmluYWxseSwgU1dJRyBpcyBzdGlsbCBzb21ld2hhdCBpbW1hdHVyZSB3aXRoIHJlc3BlY3QgdG8gaXRzIG92ZXJhbGwKLWludGVncmF0aW9uIHdpdGggUGVybC4gIEZvciBleGFtcGxlLCBTV0lHIGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQKLVBlcmwncyBwYWNrYWdlIGFuZCBtb2R1bGUgbmFtaW5nIHN5c3RlbS4gIEluIG90aGVyIHdvcmRzLCBTV0lHIGNhbiBjcmVhdGUKLWEgbW9kdWxlIGBgRm9vJycsIGJ1dCBjYW4ndCBjcmVhdGUgYSBtb2R1bGUgYGBGb286OkJhci4nJyAgTGlrZXdpc2UsCi1TV0lHIGRvZXMgbm90IGN1cnJlbnRseSB1dGlsaXplIE1ha2VNYWtlciBhbmQgb3RoZXIgdXRpbGl0aWVzCi0oYWx0aG91Z2ggdXNlcnMgaGF2ZSBzdWNjZXNzZnVsbHkgdXNlZCBTV0lHIHdpdGggc3VjaCB0b29scykuIEluCi1hZGRpdGlvbiwgc29tZSB1c2VycyBoYXZlIHJlcG9ydGVkIG9jY2FzaW9uYWwgcHJvYmxlbXMgd2hlbiBTV0lHCi1tb2R1bGVzIGFyZSB1c2VkIHdpdGggdGhlIFBlcmwgZGVidWdnZXIgYW5kIG90aGVyIHRvb2xzLgotCi08aDI+IDcgRnV0dXJlIERpcmVjdGlvbnMgPC9oMj4KLQotRnV0dXJlIGRldmVsb3BtZW50IG9mIFNXSUcgaXMgZm9jdXNlZCBvbiB0aHJlZSBwcmltYXJ5IGFyZWFzLiAgRmlyc3QsIGltcHJvdmVkCi1wYXJzaW5nIGFuZCBzdXBwb3J0IGZvciBtb3JlIGFkdmFuY2VkIEMrKyBhcmUgYmVpbmcgYWRkZWQuICBUaGVzZSBhZGRpdGlvbnMKLWluY2x1ZGUgc3VwcG9ydCBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMgYW5kIEMrKyBuYW1lc3BhY2VzLiAgTGltaXRlZCBzdXBwb3J0IGZvciB3cmFwcGluZwotQysrIHRlbXBsYXRlcyBtYXkgYWxzbyBiZSBhZGRlZC4gIFNlY29uZCwgU1dJRydzIGNvZGUgZ2VuZXJhdGlvbiBhYmlsaXRpZXMKLWFyZSBiZWluZyBpbXByb3ZlZC4gICBBZGRpdGlvbnMgaW5jbHVkZSBtb3JlIGZsZXhpYmxlIHR5cGVtYXBzIGFuZCBiZXR0ZXIKLWFjY2VzcyB0byBzY3JpcHRpbmctbGFuZ3VhZ2Ugc3BlY2lmaWMgZmVhdHVyZXMuICBGaW5hbGx5LCBhbiBleHRlbnNpb24gQVBJCi1pcyBiZWluZyBhZGRlZCB0byB0aGUgU1dJRyBjb21waWxlci4gICBUaGlzIEFQSSB3aWxsIGFsbG93IHZhcmlvdXMKLXBhcnRzIG9mIHRoZSBTV0lHIGNvbXBpbGVyIHN1Y2ggYXMgdGhlIHByZXByb2Nlc3NvciwgcGFyc2VyLCBhbmQgY29kZSBnZW5lcmF0b3JzCi10byBiZSBhY2Nlc3NlZCB0aHJvdWdoIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZS4gIEluIGZhY3QsIHRoaXMgCi1pbnRlcmZhY2Ugd2lsbCBldmVuIGFsbG93IG5ldyBwYXJzZXJzIGFuZCBjb2RlIGdlbmVyYXRvcnMgdG8gYmUgaW1wbGVtZW50ZWQKLWVudGlyZWx5IGluIFBlcmwuCi0KLTxoMj4gOCBBY2tub3dsZWRnbWVudHM8L2gyPgotCi1TV0lHIHdvdWxkIG5vdCBiZSBwb3NzaWJsZSB3aXRob3V0IHRoZSBmZWVkYmFjayBhbmQgY29udHJpYnV0aW9ucyBvZiBpdHMgdXNlcnMuCi1XaGlsZSBpdCBpcyBpbXBvc3NpYmxlIHRvIGFja25vd2xlZGdlIGV2ZXJ5b25lIGluZGl2aWR1YWxseSwgYSBudW1iZXIgb2YKLXBlb3BsZSBoYXZlIGJlZW4gaW5zdHJ1bWVudGFsIGluIHByb21vdGluZyBhbmQgaW1wcm92aW5nIFNXSUcncyBQZXJsIHN1cHBvcnQuCi1JbiBwYXJ0aWN1bGFyLCBHYXJ5IEhvbHQgcHJvdmlkZWQgbWFueSBvZiB0aGUgaWRlYXMgdXNlZCBpbiB0aGUgc2hhZG93Ci1jbGFzcyBtZWNoYW5pc20uICBXZSB3b3VsZCBhbHNvIGxpa2UgdG8gdGhhbmsgSm9obiBCdWNrbWFuLCBTY290dCBCb2x0ZSwgCi1hbmQgU3JpcmFtIFNyaW5pdmFzYW4sIGZvciB0aGVpciBzdXBwb3J0IG9mIFNXSUcuICBXZSBhbHNvIHRoYW5rIHRoZSBVbml2ZXJzaXR5Ci1vZiBVdGFoIGFuZCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIHRoZWlyIGNvbnRpbnVlZCBzdXBwb3J0LgotCi08aDI+IDkgQXZhaWxhYmlsaXR5IDwvaDI+Ci0KLVNXSUcgaXMgZnJlZWx5IGF2YWlsYWJsZSBvbiBDUEFOIGF0IDxicj4KLQotPHA+Ci08YSBocmVmPSJodHRwOi8vd3d3LnBlcmwuY29tL0NQQU4vYXV0aG9ycy9EYXZlX0JlYXpsZXkiPgotPHR0Pnd3dy5wZXJsLmNvbS9DUEFOL2F1dGhvcnMvRGF2ZV9CZWF6bGV5PC90dD4uPC9hPjxicj4KLQotPHA+Ci1BZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIG9uIHRoZSBTV0lHIGhvbWVwYWdlIGF0IAotPGEgaHJlZj0iaHR0cDovL3d3dy5zd2lnLm9yZyI+PHR0Pnd3dy5zd2lnLm9yZzwvdHQ+PC9hPi4gQW4KLWFjdGl2ZSBtYWlsaW5nIGxpc3Qgb2Ygc2V2ZXJhbCBodW5kcmVkIHN1YnNjcmliZXJzIGlzIGFsc28gYXZhaWxhYmxlLgotCi08aDI+IEJpYmxpb2dyYXBoeSA8L2gyPgotCi1bMV0gU3JpcmFtIFNyaW5pdmFzYW4uIDxlbT4gQWR2YW5jZWQgUGVybCBQcm9ncmFtbWluZzwvZW0+LiBPJ1JlaWxseQotYW5kIEFzc29jaWF0ZXMsIDE5OTcuCi0KLTxwPgotWzJdIFNjb3R0IEJvbHRlLiBTV0lHLiA8ZW0+IFRoZSBQZXJsIEpvdXJuYWw8L2VtPiwgMig0KToyNi0zMSwgV2ludGVyIDE5OTcuCi0KLTxwPgotWzNdIEQuTS4gQmVhemxleS4gU1dJRyBhbmQgQXV0b21hdGVkIEMvQysrIFNjcmlwdGluZyBFeHRlbnNpb25zLgotPGVtPiBEci4gRG9iYidzIEpvdXJuYWw8L2VtPiwgKDI4Mik6MzAtMzYsIEZlYiAxOTk4LgotCi08cD4KLVs0XSBELk0uIEJlYXpsZXksIFNXSUcgVXNlcnMgTWFudWFsLiBUZWNobmljYWwgUmVwb3J0IFVVQ1MtOTgtMDEyLAotVW5pdmVyc2l0eSBvZiBVdGFoLCAxOTk4LgotCi08cD4KLVs1XSBFLiBHYW1tYSwgUi4gSGVsbSwgUi4gSm9obnNvbiwgYW5kIEouIFZsaXNzaWRlcywgPGVtPkRlc2lnbiBQYXR0ZXJuczwvZW0+LgotQWRkaXNvbi1XZXNsZXksIDE5OTUuCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1Blcmw5OC9zd2lncGVybC5wZGYgYi9zd2lnd2ViL3BhcGVycy9QZXJsOTgvc3dpZ3BlcmwucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ODVkZjhiLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1Blcmw5OC9zd2lncGVybC5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9QeTk2L3B5dGhvbjk2Lmh0bWwgYi9zd2lnd2ViL3BhcGVycy9QeTk2L3B5dGhvbjk2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiZDllMDMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvUHk5Ni9weXRob245Ni5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLTxodG1sPgotPHRpdGxlPgotVXNpbmcgU1dJRyB0byBDb250cm9sLCBQcm90b3R5cGUsIGFuZCBEZWJ1ZyBDIFByb2dyYW1zIHdpdGggUHl0aG9uCi08L3RpdGxlPgotPGJvZHkgQkdDT0xPUj0iZmZmZmZmIj4KLTxoMT4gVXNpbmcgU1dJRyB0byBDb250cm9sLCBQcm90b3R5cGUsIGFuZCBEZWJ1ZyBDIFByb2dyYW1zIHdpdGggUHl0aG9uIDwvaDE+Ci08Yj4gCi0oU3VibWl0dGVkIHRvIHRoZSA0dGggSW50ZXJuYXRpb25hbCBQeXRob24gQ29uZmVyZW5jZSkgPGJyPiA8YnI+Ci1EYXZpZCBNLiBCZWF6bGV5IDxicj4KLURlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSA8YnI+Ci1Vbml2ZXJzaXR5IG9mIFV0YWggPGJyPgotU2FsdCBMYWtlIENpdHksIFV0YWggIDg0MTEyIDxicj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudXRhaC5lZHUvfmJlYXpsZXkiPiBiZWF6bGV5QGNzLnV0YWguZWR1IDwvYT4gPGJyPgotPC9iPgotPGgyPiBBYnN0cmFjdCA8L2gyPgotPGVtPgotSSBkaXNjdXNzIGVhcmx5IHJlc3VsdHMgaW4gdXNpbmcgU1dJRyB0byBpbnRlcmFjdCB3aXRoIEMgYW5kIEMrKyBwcm9ncmFtcwotdXNpbmcgUHl0aG9uLiAgICBFeGFtcGxlcyBvZiB1c2luZyBTV0lHIGFyZSBwcm92aWRlZCBhbG9uZyB3aXRoIGEKLWRpc2N1c3Npb24gb2YgdGhlIGJlbmVmaXRzIGFuZCBsaW1pdGF0aW9ucyBvZiB0aGlzIGFwcHJvYWNoLiAgVGhpcwotcGFwZXIgZGVzY3JpYmVzIHdvcmsgaW4gcHJvZ3Jlc3Mgd2l0aCB0aGUgaG9wZSBvZiBnZXR0aW5nIGZlZWRiYWNrIGFuZAotaWRlYXMgZnJvbSB0aGUgUHl0aG9uIGNvbW11bml0eS4KLTwvZW0+IDxicj4gPGJyPgotCi1Ob3RlIDogU1dJRyBpcyBmcmVlbHkgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudXRhaC5lZHUvfmJlYXpsZXkvU1dJRyI+IGh0dHA6Ly93d3cuY3MudXRhaC5lZHUvfmJlYXpsZXkvU1dJRyA8L2E+Ci0KLTxoMj4gSW50cm9kdWN0aW9uIDwvaDI+Ci0KLVNXSUcgKFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvcikgaXMgYSBjb2RlCi1kZXZlbG9wbWVudAotdG9vbCBkZXNpZ25lZCB0byBtYWtlIGl0IGVhc3kgZm9yIHNjaWVudGlzdHMgYW5kIGVuZ2luZWVycyB0byBhZGQgc2NyaXB0aW5nCi1sYW5ndWFnZSBpbnRlcmZhY2VzIHRvIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMgd3JpdHRlbiBpbiBDIGFuZCBDKysuCi1UaGUgZmlyc3QgdmVyc2lvbiBvZiBTV0lHIHdhcyBkZXZlbG9wZWQgaW4gSnVseSAxOTk1IAotZm9yIHVzZSB3aXRoCi12ZXJ5IGxhcmdlIHNjYWxlIHNjaWVudGlmaWMgYXBwbGljYXRpb25zIHJ1bm5pbmcgb24gdGhlIENvbm5lY3Rpb24gCi1NYWNoaW5lIDUgYW5kIENyYXkgVDNEIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeS4gCi1TaW5jZSB0aGF0IHRpbWUsIHRoZSBzeXN0ZW0gaGFzIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBzZXZlcmFsCi1pbnRlcmZhY2UgbGFuZ3VhZ2VzIGluY2x1ZGluZyBQeXRob24sIFRjbCwgUGVybDQsIFBlcmw1LCBhbmQgR3VpbGUgWzFdLgotCi1JbiB0aGlzIHBhcGVyLCBJIHdpbGwgZGVzY3JpYmUgaG93IFNXSUcgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aAotQyBhbmQgQysrIGNvZGUgZnJvbSBQeXRob24uICBJJ2xsIGFsc28gZGlzY3VzcyBzb21lCi1hcHBsaWNhdGlvbnMgYW5kIGxpbWl0YXRpb25zIG9mIHRoaXMgYXBwcm9hY2guICAgSXQgaXMgaW1wb3J0YW50IHRvCi1lbXBoYXNpemUgdGhhdCBTV0lHIHdhcyBwcmltYXJpbHkgZGVzaWduZWQgZm9yIHNjaWVudGlzdHMgYW5kIGVuZ2luZWVycwotd2hvIHdvdWxkIGxpa2UgdG8gaGF2ZSBhIG5pY2UgaW50ZXJmYWNlLCBidXQgd2hvIHdvdWxkIHJhdGhlcgotd29yayBvbiBtb3JlIGludGVyZXN0aW5nIHByb2JsZW1zIHRoYW4gZmlndXJpbmcgb3V0IGhvdyB0byBidWlsZAotYSB1c2VyIGludGVyZmFjZSBvciB1c2luZyBhIGNvbXBsaWNhdGVkIGludGVyZmFjZSBnZW5lcmF0aW9uIHRvb2wuCi0KLTxoMj4gSW50cm9kdWNpbmcgU1dJRyA8L2gyPgotCi1UaGUgaWRlYSBiZWhpbmQgU1dJRyBpcyByZWFsbHkgcXVpdGUgc2ltcGxlLS0tbW9zdCBpbnRlcmZhY2UKLWxhbmd1YWdlcyBzdWNoIGFzIFB5dGhvbiBwcm92aWRlIHNvbWUgbWVjaGFuaXNtIGZvciBtYWtpbmcKLWNhbGxzIHRvIGZ1bmN0aW9ucyB3cml0dGVuIGluIEMgb3IgQysrLiAgSG93ZXZlciwgdGhpcyBhbG1vc3QKLWFsd2F5cyByZXF1aXJlcyB0aGUgdXNlciB0byB3cml0ZSBzcGVjaWFsICJ3cmFwcGVyIiBmdW5jdGlvbnMKLXRoYXQgcHJvdmlkZSB0aGUgZ2x1ZSBiZXR3ZWVuIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIHRoZQotQyBmdW5jdGlvbnMuICAgIEFzIGFuIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gYWRkIHRoZQotPHR0PiBnZXRlbnYoKSA8L3R0PiBmdW5jdGlvbiB0byBQeXRob24sIHlvdSB3b3VsZCBuZWVkIHRvIHdyaXRlCi10aGUgZm9sbG93aW5nIHdyYXBwZXIgY29kZSBbNF0gOgotCi08YmxvY2txdW90ZT4KLTx0dD4KLTxwcmU+Ci1zdGF0aWMgUHlPYmplY3QgKndyYXBfZ2V0ZW52KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICAgICAgICAgY2hhciAqIHJlc3VsdDsKLSAgICAgICAgIGNoYXIgKiBhcmcwOwotICAgICAgICAgaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCZhcmcwKSkKLSAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICByZXN1bHQgPSBnZXRlbnYoYXJnMCk7Ci0gICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIHJlc3VsdCk7Ci19Ci0KLTwvcHJlPiA8L3R0PgotPC9ibG9ja3F1b3RlPgotV2hpbGUgd3JpdGluZyBhIHNpbmdsZSB3cmFwcGVyIGZ1bmN0aW9uIGlzbid0IHRvbyBkaWZmaWN1bHQsCi1pdCBxdWlja2x5IGJlY29tZXMgdGVkaW91cyBhbmQgZXJyb3IgcHJvbmUgYXMgdGhlIG51bWJlcgotb2YgZnVuY3Rpb25zIGluY3JlYXNlcy4KLVNXSUcgYXV0b21hdGVzIHRoaXMgcHJvY2VzcyBieSBnZW5lcmF0aW5nCi13cmFwcGVyIGNvZGUgZnJvbSBhIGxpc3QgQU5TSSBDIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCi1BcyBhIHJlc3VsdCwgYWRkaW5nIHNjcmlwdGluZyBsYW5ndWFnZXMgdG8gQyBhcHBsaWNhdGlvbnMgY2FuIGJlY29tZQotYW4gYWxtb3N0IHRyaXZpYWwgZXhlcmNpc2UuIDxicj4gPGJyPgotCi1UaGUgY29yZSBvZiB0aGUgU1dJRyBjb25zaXN0cyBvZiBhIFlBQ0MgcGFyc2VyIGFuZCBhIGNvbGxlY3Rpb24KLW9mIGdlbmVyYWwgcHVycG9zZSB1dGlsaXR5IGZ1bmN0aW9ucy4gICBUaGUgb3V0cHV0IG9mIHRoZSBwYXJzZXIKLWlzIHNlbnQgdG8gdHdvIGRpZmZlcmVudCBtb2R1bGVzLS1hIGxhbmd1YWdlIG1vZHVsZSBmb3Igd3JpdGluZwotd3JhcHBlciBmdW5jdGlvbnMgYW5kIGEgZG9jdW1lbnRhdGlvbiBtb2R1bGUgZm9yIHByb2R1Y2luZyBhIHNpbXBsZQotcmVmZXJlbmNlIGd1aWRlLiAgIEVhY2ggb2YgdGhlIHRhcmdldCBsYW5ndWFnZXMgYW5kIGRvY3VtZW50YXRpb24gbWV0aG9kcyAKLWlzIGltcGxlbWVudGVkIGFzIEMrKyBjbGFzcyB0aGF0IGNhbiBiZSBwbHVnZ2VkIGluIHRvIHRoZSBzeXN0ZW0uCi1DdXJyZW50bHksIFB5dGhvbiwgVGNsLCBQZXJsNCwgUGVybDUsIGFuZCBHdWlsZSBhcmUgc3VwcG9ydGVkIGFzCi10YXJnZXQgbGFuZ3VhZ2VzIHdoaWxlIGRvY3VtZW50YXRpb24gY2FuIGJlIHByb2R1Y2VkIGluIEFTQ0lJLCBIVE1MLAotYW5kIExhVGVYLiAgIERpZmZlcmVudCB0YXJnZXQgbGFuZ3VhZ2VzIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyBhIG5ldwotQysrIGNsYXNzIHRoYXQgaXMgbGlua2VkIHdpdGggYSBnZW5lcmFsIHB1cnBvc2UgU1dJRyBsaWJyYXJ5IGZpbGUuCi0KLTxoMj4gUHJldmlvdXMgd29yayA8L2gyPgotCi1Nb3N0IFB5dGhvbiB1c2VycyBhcmUgcHJvYmFibHkgYXdhcmUgdGhhdCBhdXRvbWF0aWMgd3JhcHBlciBnZW5lcmF0aW9uIGlzIAotbm90IGEgbmV3IGlkZWEuICAgSW4gcGFydGljdWxhciwgcGFja2FnZXMgc3VjaCBhcyBJTFUgYXJlIGNhcGFibGUKLW9mIHByb3ZpZGluZyBiaW5kaW5ncyBiZXR3ZWVuIEMsIEMrKywgYW5kIFB5dGhvbiB1c2luZyBzcGVjaWZpY2F0aW9ucwotZ2l2ZW4gaW4gSURMIChJbnRlcmZhY2UgRGVmaW5pdGlvbiBMYW5ndWFnZSkgWzNdLiBTV0lHIGlzIG5vdCByZWFsbHkgbWVhbnQgdG8gY29tcGV0ZSB3aXRoIHRoaXMKLWFwcHJvYWNoLCBidXQgaXMgZGVzaWduZWQgdG8gYmUgYSBuby1ub25zZW5zZSwgZWFzeSB0byB1c2UgdG9vbAotdGhhdCBzY2llbnRpc3RzIGFuZCBlbmdpbmVlcnMgY2FuIHVzZSB0byBidWlsZCBpbnRlcmVzdGluZyBpbnRlcmZhY2VzCi13aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCBncnVuZ3kgcHJvZ3JhbW1pbmcgZGV0YWlscyBvciBsZWFybmluZwotYSBjb21wbGljYXRlZCBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBsYW5ndWFnZS4KLVdpdGggdGhhdCBzYWlkLCBTV0lHIGlzIGNlcnRhaW5seSBub3QgZGVzaWduZWQgdG8gdHVybiBQeXRob24gaW50bwotYSBDIG9yIEMrKyBjbG9uZSAoSSdtIG5vdCBzdXJlIHRoYXQgdHVybmluZyBQeXRob24gaW50byBpbnRlcnByZXRlZAotQy9DKysgY29tcGlsZXIgd291bGQgYmUgYSBnb29kIGlkZWEgYW55d2F5cykuICBIb3dldmVyLCBTV0lHIGNhbiBhbGxvdwotUHl0aG9uIHRvIGludGVyZmFjZSB3aXRoIGEgc3VycHJpc2luZ2x5IHdpZGUgdmFyaWV0eSBvZiBDIGZ1bmN0aW9ucy4KLQotPC9ib2R5PgotPC9odG1sPgotCi08aDI+IEEgU1dJRyBleGFtcGxlIDwvaDI+Ci0KLVdoaWxlIGl0IGlzIG5vdCBteSBpbnRlbnQgdG8gcHJvdmlkZSBhIHR1dG9yaWFsLCBJIGhvcGUgdG8KLWlsbHVzdHJhdGUgaG93IFNXSUcgd29ya3MgYnkgYnVpbGRpbmcgYSBtb2R1bGUgZnJvbSBwYXJ0IG9mIHRoZQotVU5JWCBzb2NrZXQgbGlicmFyeS4KLVdoaWxlIHRoZXJlIGlzIHByb2JhYmx5IG5vIG5lZWQgdG8gZG8gdGhpcyBpbiBwcmFjdGljZSAoc2luY2UgUHl0aG9uCi1hbHJlYWR5IGhhcyBhIHNvY2tldCBtb2R1bGUpLCBpdCBpbGx1c3RyYXRlcyBtb3N0IG9mIFNXSUcncyBjYXBhYmlsaXRpZXMKLW9uIGEgbW9kZXJhdGVseSBjb21wbGV4IGV4YW1wbGUgYW5kIHByb3ZpZGVzIGEgYmFzaXMgZm9yIAotY29tcGFyaXNvbiBiZXR3ZWVuIGFuIGV4aXN0aW5nIG1vZHVsZSBhbmQgb25lIGNyZWF0ZWQgYnkgU1dJRy4gPGJyPiA8YnI+Ci0KLUFzIGlucHV0LCBTV0lHIHRha2VzIGFuIGlucHV0IGZpbGUgcmVmZXJyZWQgdG8gYXMgYW4gImludGVyZmFjZSBmaWxlLiIKLVRoZSBmaWxlIHN0YXJ0cyB3aXRoIGEgcHJlYW1ibGUgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUKLW1vZHVsZSBhbmQgYSBjb2RlIGJsb2NrIHdoZXJlIHNwZWNpYWwgaGVhZGVyIGZpbGVzLCBhZGRpdGlvbmFsIEMKLWNvZGUsIGFuZCBvdGhlciB0aGluZ3MgY2FuIGJlIGFkZGVkLiAgQWZ0ZXIgdGhhdCwgQU5TSSBDIGZ1bmN0aW9uCi1hbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFyZSBsaXN0ZWQgaW4gYW55IG9yZGVyLiAgIFNpbmNlIFNXSUcKLXVzZXMgQyBzeW50YXgsIGl0J3MgdXN1YWxseSBmYWlybHkgZWFzeSB0byBidWlsZCBhbiBpbnRlcmZhY2UgCi1mcm9tIHNjcmF0Y2ggb3Igc2ltcGx5IGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgaGVhZGVyIGZpbGUuCi1UaGUgZm9sbG93aW5nIFNXSUcgaW50ZXJmYWNlIGZpbGUgd2lsbCBiZSB1c2VkIGZvciBvdXIgc29ja2V0IGV4YW1wbGUgOgotCi08YmxvY2txdW90ZT4KLTx0dD4KLTxwcmU+Ci0vLyBzb2NrZXQuaQotLy8gU1dJRyBJbnRlcmZhY2UgZmlsZSB0byBwbGF5IHdpdGggc29tZSBzb2NrZXRzCi0laW5pdCBzb2NrICAgICAgICAgIC8vIE5hbWUgb2Ygb3VyIG1vZHVsZQotJXsKLSNpbmNsdWRlICZsdDtzeXMvdHlwZXMuaCZndAotI2luY2x1ZGUgJmx0O3N5cy9zb2NrZXQuaCZndAotI2luY2x1ZGUgJmx0O25ldGluZXQvaW4uaCZndAotI2luY2x1ZGUgJmx0O2FycGEvaW5ldC5oJmd0Ci0jaW5jbHVkZSAmbHQ7bmV0ZGIuaCZndAotCi0vKiBTZXQgc29tZSB2YWx1ZXMgaW4gdGhlIHNvY2thZGRyX2luIHN0cnVjdHVyZSAqLwotc3RydWN0IHNvY2thZGRyICpuZXdfc29ja2FkZHJfaW4oc2hvcnQgZmFtaWx5LCB1bnNpZ25lZCBsb25nIGhvc3RpZCwgaW50IHBvcnQpIHsKLSAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICphZGRyOwotICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotICAgICAgICBiemVybygoY2hhciAqKSBhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7Ci0gICAgICAgIGFkZHItJmd0O3Npbl9mYW1pbHkgPSBmYW1pbHk7Ci0gICAgICAgIGFkZHItJmd0O3Npbl9hZGRyLnNfYWRkciA9IGhvc3RpZDsKLSAgICAgICAgYWRkci0mZ3Q7c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgICAgICAgcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcjsKLX0KLS8qIEdldCBob3N0IGFkZHJlc3MsIGJ1dCByZXR1cm4gYXMgYSBzdHJpbmcgaW5zdGVhZCBvZiBob3N0ZW50ICovCi1jaGFyICpteV9nZXRob3N0YnluYW1lKGNoYXIgKmhvc3RuYW1lKSB7Ci0gICAgICAgIHN0cnVjdCBob3N0ZW50ICpoOwotICAgICAgICBoID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7Ci0gICAgICAgIGlmIChoKSByZXR1cm4gaC0mZ3Q7aF9uYW1lOwotICAgICAgICBlbHNlIHJldHVybiAiIjsKLX0KLSV9Ci0KLS8vIEFkZCB0aGVzZSBjb25zdGFudHMKLWVudW0ge0FGX1VOSVgsIEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBTT0NLX0RHUkFNLCBTT0NLX1JBVywKLSAgICAgIElQUFJPVE9fVURQLCBJUFBST1RPX1RDUCwgSU5BRERSX0FOWX07Ci0KLSNkZWZpbmUgIFNJWkVPRl9TT0NLQUREUiAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikKLQotLy8gV3JhcCB0aGVzZSBmdW5jdGlvbnMgCi1pbnQgc29ja2V0KGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpOwotaW50IGJpbmQoaW50IHNvY2tmZCwgc3RydWN0IHNvY2thZGRyICpteWFkZHIsIGludCBhZGRybGVuKTsKLWludCBjb25uZWN0KGludCBzb2NrZmQsIHN0cnVjdCBzb2NrYWRkciAqc2VydmFkZHIsIGludCBhZGRybGVuKTsKLWludCBsaXN0ZW4oaW50IHNvY2tmZCwgaW50IGJhY2tsb2cpOwotaW50IGFjY2VwdChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIsICV2YWwgaW50ICphZGRybGVuKTsKLWludCBjbG9zZShpbnQgZmQpOwotc3RydWN0IHNvY2thZGRyICpuZXdfc29ja2FkZHJfaW4oc2hvcnQgZmFtaWx5LCB1bnNpZ25lZCBsb25nLCBpbnQgcG9ydCk7Ci0lbmFtZSBnZXRob3N0YnluYW1lIHsgY2hhciAqbXlfZ2V0aG9zdGJ5bmFtZShjaGFyICopOyB9Ci11bnNpZ25lZCBsb25nIGluZXRfYWRkcihjb25zdCBjaGFyICppcCk7Ci0KLSVpbmNsdWRlIHVuaXhpby5pCi08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLVRoZXJlIGFyZSBzZXZlcmFsIHRoaW5ncyB0byBub3RpY2UgYWJvdXQgdGhpcyBmaWxlCi0KLTx1bD4KLTxsaT4gVGhlIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCB3aXRoIHRoZSA8dHQ+ICVpbml0IDwvdHQ+IGRpcmVjdGl2ZS4KLTxsaT4gSGVhZGVyIGZpbGVzIGFuZCBzdXBwb3J0aW5nIEMgY29kZSBpcyBwbGFjZWQgaW4gPHR0PiAleywlfSA8L3R0Pi4KLTxsaT4gU3BlY2lhbCBzdXBwb3J0IGZ1bmN0aW9ucyBtYXkgYmUgbmVjZXNzYXJ5LiBGb3IgZXhhbXBsZSwgPHR0PgotbmV3X3NvY2thZGRyX2luKCkgPC90dD4gY3JlYXRlcyBhIG5ldyA8dHQ+IHN0cnVjdCBzb2NrYWRkcl9pbiA8L3R0PiB0eXBlCi1hbmQgc2V0cyBzb21lIG9mIGl0cyB2YWx1ZXMuCi08bGk+IENvbnN0YW50cyBhcmUgY3JlYXRlZCB3aXRoIDx0dD4gZW51bSA8L3R0PiBvciA8dHQ+ICNkZWZpbmUuIDwvdHQ+Ci08bGk+IEZ1bmN0aW9ucyBjYW4gdGFrZSBtb3N0IEMgYmFzaWMgZGF0YXR5cGVzIGFzIHdlbGwgYXMgcG9pbnRlcnMKLXRvIGNvbXBsZXggdHlwZXMuCi08bGk+IEZ1bmN0aW9ucyBjYW4gYmUgcmVuYW1lZCB3aXRoIHRoZSA8dHQ+ICVuYW1lIDwvdHQ+IGRpcmVjdGl2ZS4KLTxsaT4gVGhlIDx0dD4gJXZhbCA8L3R0PiBkaXJlY3RpdmUgZm9yY2VzIGEgZnVuY3Rpb24gYXJndW1lbnQgdG8gYmUgY2FsbGVkIGJ5Ci12YWx1ZS4KLQotPGxpPiBUaGUgPHR0PiAlaW5jbHVkZSA8L3R0PiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBvdGhlcgotU1dJRyBpbnRlcmZhY2UgZmlsZXMuICAgSW4gdGhpcyBjYXNlLCB0aGUgZmlsZSA8dHQ+IHVuaXhpby5pIDwvdHQ+Ci1taWdodCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZyA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PgotPHByZT4KLS8vIEZpbGUgOiB1bml4aW8uaSAKLS8vIFNvbWUgZmlsZSBJL08gYW5kIG1lbW9yeSBmdW5jdGlvbnMKLSV7Ci0lfQotaW50IHJlYWQoaW50IGZkLCB2b2lkICpidWZmZXIsIGludCBuKTsKLWludCB3cml0ZShpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgaW50IG4pOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90Owotdm9pZCAqbWFsbG9jKHNpemVfdCBuYnl0ZXMpOwotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotPGxpPiBTaW5jZSBpbnRlcmZhY2UgZmlsZXMgY2FuIGluY2x1ZGUgb3RoZXIgaW50ZXJmYWNlIGZpbGVzLCBpdCBjYW4gYmUgdmVyeQotZWFzeSB0byBidWlsZCB1cCBsaWJyYXJpZXMgYW5kIGNvbGxlY3Rpb25zIG9mIHVzZWZ1bCBmdW5jdGlvbnMuCi08bGk+IDx0dD4gdHlwZWRlZiA8L3R0PiBjYW4gYmUgdXNlZCB0byBwcm92aWRlIG1hcHBpbmcgYmV0d2VlbiBkYXRhdHlwZXMuCi08bGk+IEMgYW5kIEMrKyBjb21tZW50cyBhcmUgYWxsb3dlZCBhbmQgbGlrZSBDLCBTV0lHIGlnbm9yZXMgd2hpdGVzcGFjZS4KLTwvdWw+Ci0KLVRoZSBrZXkgdGhpbmcgdG8gbm90aWNlIGFib3V0IFNXSUcgaW50ZXJmYWNlIGZpbGVzIGlzIHRoYXQgdGhleSBzdXBwb3J0Ci1yZWFsIEMgZnVuY3Rpb25zLCBjb25zdGFudHMsIGFuZCBkYXRhdHlwZXMgaW5jbHVkaW5nIEMgcG9pbnRlcnMuICAgQXMKLWEgZ2VuZXJhbCBydWxlIHRoZXNlIGZpbGVzIGFyZSBhbHNvIGluZGVwZW5kZW50IG9mIHRoZSB0YXJnZXQgc2NyaXB0aW5nCi1sYW5ndWFnZS0tdGhlIHByaW1hcnkgcmVhc29uIHdoeSBpdCdzIGVhc3kgdG8gc3VwcG9ydCBkaWZmZXJlbnQKLWxhbmd1YWdlcy4KLQotPGgyPiBCdWlsZGluZyBhIFB5dGhvbiBtb2R1bGUgPC9oMj4KLQotQnVpbGRpbmcgYSBQeXRob24gbW9kdWxlIHdpdGggU1dJRyBpcyBhIHNpbXBsZSBwcm9jZXNzIHRoYXQgcHJvY2VlZHMgYXMKLWZvbGxvd3MgKGFzc3VtaW5nIHlvdSdyZSBydW5uaW5nIFNvbGFyaXMgMi54KSA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PgotPHByZT4KLXVuaXggPiB3cmFwIC1weXRob24gc29ja2V0LmkKLXVuaXggPiBnY2MgLWMgc29ja2V0X3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZS9QeQotdW5peCA+IGxkIC1HIHNvY2tldF93cmFwLm8gLWxzb2NrZXQgLWxuc2wgLW8gc29ja21vZHVsZS5zbwotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi1UaGUgPHR0PiB3cmFwIDwvdHQ+IGNvbW1hbmQgdGFrZXMgdGhlIGludGVyZmFjZSBmaWxlIGFuZCBwcm9kdWNlcyBhIEMgZmlsZQotY2FsbGVkIDx0dD4gc29ja2V0X3dyYXAuYyA8L3R0Pi4gICBUaGlzIGZpbGUgaXMgdGhlbiBjb21waWxlZCBhbmQgYnVpbHQgaW50bwotYSBzaGFyZWQgb2JqZWN0IGZpbGUuIAotCi08aDI+IEEgc2FtcGxlIFB5dGhvbiBzY3JpcHQgPC9oMj4KLQotT3VyIG5ldyBzb2NrZXQgbW9kdWxlIGNhbiBiZSB1c2VkIG5vcm1hbGx5IHdpdGhpbiBhIFB5dGhvbiBzY3JpcHQuIAotRm9yIGV4YW1wbGUsIHdlIGNvdWxkIHdyaXRlIGEgc2ltcGxlIHNlcnZlciBwcm9jZXNzIHRvIGVjaG8gYWxsCi1kYXRhIHJlY2VpdmVkIGJhY2sgdG8gYSBjbGllbnQgOgotCi08YmxvY2txdW90ZT4KLTx0dD4KLTxwcmU+Ci0jIEVjaG8gc2VydmVyIHByb2dyYW0gdXNpbmcgU1dJRyBtb2R1bGUKLWZyb20gc29jayBpbXBvcnQgKgotUE9SVCA9IDUwMDAKLXNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkKLWlmIHNvY2tmZCA8IDA6Ci0gICAgICAgIHJhaXNlIElPRXJyb3IsICdzZXJ2ZXIgOiB1bmFibGUgdG8gb3BlbiBzdHJlYW0gc29ja2V0JwotYWRkciA9IG5ld19zb2NrYWRkcl9pbihBRl9JTkVULElOQUREUl9BTlksUE9SVCkKLWlmIChiaW5kKHNvY2tmZCwgYWRkciwgU0laRU9GX1NPQ0tBRERSKSkgPCAwIDoKLSAgICAgICAgcmFpc2UgSU9FcnJvciwgJ3NlcnZlciA6IHVuYWJsZSB0byBiaW5kIGxvY2FsIGFkZHJlc3MnCi1saXN0ZW4oc29ja2ZkLDUpCi1jbGllbnRfYWRkciA9IG5ld19zb2NrYWRkcl9pbihBRl9JTkVULCAwLCAwKQotbmV3c29ja2ZkID0gYWNjZXB0KHNvY2tmZCwgY2xpZW50X2FkZHIsIFNJWkVPRl9TT0NLQUREUikKLWJ1ZmZlciA9IG1hbGxvYygxMDI0KQotd2hpbGUgMToKLSAgICAgICAgbmJ5dGVzID0gcmVhZChuZXdzb2NrZmQsIGJ1ZmZlciwgMTAyNCkKLSAgICAgICAgaWYgbmJ5dGVzID4gMCA6Ci0gICAgICAgICAgICAgICAgd3JpdGUobmV3c29ja2ZkLGJ1ZmZlcixuYnl0ZXMpCi0gICAgICAgIGVsc2UgOiBicmVhawotY2xvc2UobmV3c29ja2ZkKQotY2xvc2Uoc29ja2ZkKQotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi1JbiBvdXIgUHl0aG9uIG1vZHVsZSwgd2UgYXJlIG1hbmlwdWxhdGluZyBhIHNvY2tldCwgaW4gYWxtb3N0Ci1leGFjdGx5IHRoZSBzYW1lIHdheSBhcyB3b3VsZCBiZSBkb25lIGluIGEgQyBwcm9ncmFtLiAgV2UnbGwgdGFrZQotYSBsb29rIGF0IGEgY2xpZW50IHdyaXR0ZW4gdXNpbmcgdGhlIFB5dGhvbiBzb2NrZXQgbGlicmFyeSBzaG9ydGx5LgotCi08aDI+IFBvaW50ZXJzIGFuZCBydW4tdGltZSB0eXBlIGNoZWNraW5nIDwvaDI+Ci0KLVNXSUcgaW1wb3J0cyBDIHBvaW50ZXJzIGFzIEFTQ0lJIHN0cmluZ3MgY29udGFpbmluZyBib3RoIHRoZQotYWRkcmVzcyBhbmQgcG9pbnRlciB0eXBlLiAgVGh1cywgYSB0eXBpY2FsIFNXSUcgcG9pbnRlciBtaWdodCBsb29rCi1saWtlIHRoZSBmb2xsb3dpbmcgOiA8YnI+IDxicj4KLQotPGNlbnRlcj4KLTx0dD4gX2ZkMmEwX3N0cnVjdF9zb2NrYWRkcl9wIDwvdHQ+IDxicj4gPGJyPgotPC9jZW50ZXI+Ci0KLVNvbWUgbWF5IHZpZXcgdGhlIGlkZWEgb2YgaW1wb3J0aW5nIEMgcG9pbnRlcnMgaW50byBQeXRob24gYXMgdW5zYWZlIG9yIGV2ZW4KLXRydWx5IGluc2FuZS4gIEhvd2V2ZXIsIGhhbmRsaW5nIHBvaW50ZXJzIHNlZW1zIHRvIGJlIG5lZWRlZCBpbiBvcmRlcgotZm9yIFNXSUcgdG8gaGFuZGxlIG1vc3QgaW50ZXJlc3RpbmcgdHlwZXMgb2YgQyBjb2RlLiAgIFRvIHByb3ZpZGUgc29tZSBzYWZldHksCi10aGUgd3JhcHBlciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGJ5IFNXSUcgcGVyZm9ybSBwb2ludGVyLXR5cGUgY2hlY2tpbmcKLShzaW5jZSBpbXBvcnRpbmcgQyBwb2ludGVycyBpbnRvIAotUHl0aG9uIGhhcyBpbiBlZmZlY3QsIGJ5cGFzc2VkIHR5cGUtY2hlY2tpbmcgaW4gdGhlIEMgY29tcGlsZXIpLgotV2hlbiBpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcyBhcmUgdXNlZCwgdGhpcyBpcyB3aGF0IGhhcHBlbnMgOgotCi08YmxvY2txdW90ZT4KLTx0dD4KLTxwcmU+Ci11bml4ID4gcHl0aG9uCi1QeXRob24gMS4zIChBcHIgMTIgMTk5NikgIFtHQ0MgMi41LjhdCi1Db3B5cmlnaHQgMTk5MS0xOTk1IFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1zdGVyZGFtCi0+Pj4gZnJvbSBzb2NrIGltcG9ydCAqCi0+Pj4gc29ja2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLDApOwotPj4+IGJ1ZmZlciA9IG1hbGxvYyg4MTkyKTsKLT4+PiBiaW5kKHNvY2tmZCxidWZmZXIsU0laRU9GX1NPQ0tBRERSKTsKLVRyYWNlYmFjayAoaW5uZXJtb3N0IGxhc3QpOgotICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/Ci1UeXBlRXJyb3I6IFR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMiBvZiBiaW5kLiBFeHBlY3RlZCBfc3RydWN0X3NvY2thZGRyX3AuCi0+Pj4gCi08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLQotU1dJRydzIHJ1bi10aW1lIHR5cGUgY2hlY2tpbmcgcHJvdmlkZXMgYSBjZXJ0YWluIGRlZ3JlZSBvZiBzYWZldHkgZnJvbQotdXNpbmcgaW52YWxpZCBwYXJhbWV0ZXJzIGFuZCBtYWtpbmcgc2ltcGxlIG1pc3Rha2VzLiAgT2YgY291cnNlLCBhbnkgc3lzdGVtIAotc3VwcG9ydGluZyBwb2ludGVycyBjYW4gYmUgYWJ1c2VkLCBidXQgU1dJRydzIGltcGxlbWVudGF0aW9uIGhhcyBwcm92ZW4KLXRvIGJlIHF1aXRlIHJlbGlhYmxlIHVuZGVyIG5vcm1hbCB1c2UuICAKLQotPGgyPiBDb21wYXJpc29uIHdpdGggYSByZWFsIFB5dGhvbiBtb2R1bGUgPC9oMj4KLQotQXMgYSBwb2ludCBvZiBjb21wYXJpc29uLCB3ZSBjYW4gbm93IHdyaXRlIGEgY2xpZW50IHNjcmlwdCB1c2luZyB0aGUKLVB5dGhvbiBzb2NrZXQgbW9kdWxlICh0aGlzIGV4YW1wbGUgY291cnRlc3kgb2YgdGhlIFB5dGhvbiBsaWJyYXJ5Ci1yZWZlcmVuY2UgbWFudWFsKSBbNV0uIAotCi08YmxvY2txdW90ZT4KLTx0dD4KLTxwcmU+Ci0jIEVjaG8gY2xpZW50IHByb2dyYW0KLWZyb20gc29ja2V0IGltcG9ydCAqCi1IT1NUID0gJ3RqYXplLmxhbmwuZ292JwotUE9SVCA9IDUwMDAKLXMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0pCi1zLmNvbm5lY3QoSE9TVCxQT1JUKQotcy5zZW5kKCdIZWxsbyB3b3JsZCcpCi1kYXRhID0gcy5yZWN2KDEwMjQpCi1zLmNsb3NlKCkKLXByaW50ICdSZWNlaXZlZCcsIGBkYXRhYAotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi1BcyBvbmUgbWlnaHQgZXhwZWN0LCB0aGUgdHdvIHNjcmlwdHMgbG9vayBmYWlybHkgc2ltaWxhci4gSG93ZXZlcgotdGhlcmUgYXJlIGNlcnRhaW4gb2J2aW91cyBkaWZmZXJlbmNlcy4gIEZpcnN0LCB0aGUgU1dJRyBnZW5lcmF0ZWQKLW1vZHVsZSBpcyBjbGVhcmx5IGEgcXVpY2sgYW5kIGRpcnR5IGFwcHJvYWNoLiAgIFdlIG11c3QgZXhwbGljaXRseQotY2hlY2sgZm9yIGVycm9ycyBhbmQgY3JlYXRlIGEgZmV3IEMgZGF0YSBzdHJ1Y3R1cmVzLiAgRnVydGhlcm1vcmUsCi13aGlsZSBQeXRob24gZnVuY3Rpb25zIHN1Y2ggYXMgPHR0PiBzb2NrZXQoKSA8L3R0PiBjYW4gdGFrZSBvcHRpb25hbAotYXJndW1lbnRzLCBTV0lHIGdlbmVyYXRlZCBmdW5jdGlvbnMgY2FuIG5vdCAoc2luY2UgdGhlIHVuZGVybHlpbmcKLUMgZnVuY3Rpb24gY2FuJ3QpLiAgIE9mIGNvdXJzZSwgdGhlIGFwcGFyZW50IHVnbGluZXNzIAotb2YgdGhlIFNXSUcgbW9kdWxlIGNvbXBhcmVkIHRvIHRoZSBQeXRob24gZXF1aXZhbGVudCBpcyBub3QgdGhlCi1wb2ludCBoZXJlLgotVGhlIHJlYWwgaWRlYSB0byBlbXBoYXNpemUgaXMgdGhhdCBTV0lHCi1jYW4gdGFrZSBhIHNldCBvZiByZWFsIEMgZnVuY3Rpb25zIHdpdGggbW9kZXJhdGUgY29tcGxleGl0eSBhbmQgCi1wcm9kdWNlIGEgZnVsbHkgZnVuY3Rpb25hbCBQeXRob24gbW9kdWxlIGluIGEgdmVyeSBzaG9ydCBwZXJpb2Qgb2YKLXRpbWUuICBJbiB0aGlzIGNhc2UsIGFib3V0IDEwIG1pbnV0ZXMgd29ydGggb2YgZWZmb3J0LiAgCi0oSSdtCi1ndWVzc2luZyB0aGF0IHRoZSBQeXRob24gc29ja2V0IG1vZHVsZSByZXF1aXJlZCBtb3JlIHRpbWUgdGhhbiB0aGF0KS4KLVdpdGggYSBiaXQgb2Ygd29yaywgdGhlIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZSBjb3VsZCBwcm9iYWJseSBiZQotdXNlZCB0byBidWlsZCBhIG1vcmUgdXNlci1mcmllbmRseSB2ZXJzaW9uIHRoYXQgaGlkIG1hbnkgb2YgdGhlIGRldGFpbHMuCi0KLTxoMj4gQ29udHJvbGxpbmcgQyBwcm9ncmFtcyA8L2gyPgotCi1PZiBjb3Vyc2UsIHRoZSByZWFsIGdvYWwgb2YgU1dJRyBpcyBub3QgdG8gcHJvZHVjZSBxdWlya3kKLXJlcGxhY2VtZW50cyBmb3IgbW9kdWxlcyBpbiB0aGUgUHl0aG9uIGxpYnJhcnkuICAgSW5zdGVhZCwgaXQKLWJldHRlciBzdWl0ZWQgYXMgYSBtZWNoYW5pc20gZm9yCi1jb250cm9sbGluZyBhIHZhcmlldHkgb2YgQyBwcm9ncmFtcy4gPGJyPiA8YnI+Ci0KLUluIHRoZSBTUGFTTSBtb2xlY3VsYXIgZHluYW1pY3MgY29kZSB1c2VkIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwKLUxhYm9yYXRvcnksIFNXSUcKLWlzIHVzZWQgdG8gYnVpbGQgYW4gaW50ZXJmYWNlIG91dCBvZiBhYm91dCAyMDAgQyBmdW5jdGlvbnMgWzJdLgotVGhpcyBoYXBwZW5zIGF0IGNvbXBpbGUgdGltZSBzbyBtb3N0IHVzZXJzIGRvbid0Ci1ub3RpY2UgdGhhdCBpdCBoYXMgb2NjdXJyZWQuICAgSG93ZXZlciwgYXMgYSByZXN1bHQsIGl0IGlzIG5vdwotZXh0cmVtZWx5IGVhc3kgZm9yIHRoZSBwaHlzaWNpc3RzIHVzaW5nIHRoZSBjb2RlIHRvIAotZXh0ZW5kIGl0IHdpdGggbmV3IGZ1bmN0aW9ucy4gCi1XaGVuZXZlciBuZXcgZnVuY3Rpb25hbGl0eSBpcyBhZGRlZCwgdGhlIG5ldwotZnVuY3Rpb25zIGFyZSBwdXQgaW50byBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgYW5kIHRoZSBmdW5jdGlvbnMKLWJlY29tZSBhdmFpbGFibGUgd2hlbiB0aGUgY29kZSBpcyByZWNvbXBpbGVkIChhIHByb2Nlc3MKLXdoaWNoIHVzdWFsbHkgb25seSBpbnZvbHZlcyB0aGUgbmV3IEMgZnVuY3Rpb25zIGFuZCBTV0lHIGdlbmVyYXRlZAotd3JhcHBlciBmaWxlKS4gICBPZiBjb3Vyc2UsIHdoZW4gcnVubmluZyB1bmRlciBQeXRob24sIGl0IGlzIHBvc3NpYmxlCi10byBidWlsZCBleHRlbnNpb25zIGFuZCBkeW5hbWljYWxseSBsb2FkIHRoZW0gYXMgbmVlZGVkLiAgPGJyPiA8YnI+Ci0KLUFub3RoZXIgcG9pbnQsIG5vdCB0byBiZSBvdmVybG9va2VkLCBpcyB0aGUgZmFjdCB0aGF0IFNXSUcgbWFrZXMgaXQKLXZlcnkgZWFzeSBmb3IgYSB1c2VyIHRvIGNvbWJpbmUgYml0cyBhbmQgcGllY2VzIG9mIGNvbXBsZXRlbHkgZGlmZmVyZW50Ci1zb2Z0d2FyZSBwYWNrYWdlcyB3aXRob3V0IHdhaXRpbmcgZm9yIHNvbWVvbmUgdG8gd3JpdGUgYSBzcGVjaWFsCi1wdXJwb3NlIG1vZHVsZS4gICBGb3IgZXhhbXBsZSwgU1dJRyBjYW4gYmUgdXNlZCB0byBpbXBvcnQgdGhlIEMgQVBJCi1vZiBNYXRsYWIgNC4yIGludG8gUHl0aG9uLiAgICBUaGlzIGNvbWJpbmVkIHdpdGggYSBzaW11bGF0aW9uIG1vZHVsZQotY2FuIGFsbG93IGEgc2NpZW50aXN0IHRvIHBlcmZvcm0gYm90aCBzaW11bGF0aW9uIGFuZCBkYXRhIGFuYWx5c2lzIGluCi1pbnRlcmFjdGl2ZWx5IG9yIGZyb20gYSBzY3JpcHQuICAgT25lIGNvdWxkIGV2ZW4gYnVpbGQgYSBUa2ludGVyIGludGVyZmFjZSB0byBjb250cm9sCi10aGUgZW50aXJlIHN5c3RlbS4gICBUaGUgZWFzZSBvZiB1c2luZyBTV0lHIG1ha2VzIGl0IHBvc3NpYmxlIGZvcgotc2NpZW50aXN0cyB0byBidWlsZCBhcHBsaWNhdGlvbnMgb3V0IG9mIGNvbXBvbmVudHMgdGhhdAotbWlnaHQgbm90IGhhdmUgYmVlbiBjb25zaWRlcmVkIGVhcmxpZXIuICAgCi0KLTxoMj4gUHJvdG90eXBpbmcgYW5kIERlYnVnZ2luZyA8L2gyPgotCi1XaGVuIGRlYnVnZ2luZyBuZXcgbW9kdWxlcyBvciBsaWJyYXJpZXMsIGl0IHdvdWxkIGJlIG5pY2UgdG8gYmUgYWJsZQotdG8gdGVzdCBvdXQgdGhlIGZ1bmN0aW9ucyB3aXRob3V0IGhhdmluZyB0byByZXBlYXRlZGx5IHJlY29tcGlsZSB0aGUKLW1vZHVsZSB3aXRoIHRoZSByZXN0IG9mIGEgbGFyZ2UgYXBwbGljYXRpb24uICBXaXRoIFNXSUcsIGl0IGlzIG9mdGVuCi1wb3NzaWJsZSB0byBwcm90b3R5cGUgYW5kIGRlYnVnIG1vZHVsZXMgaW5kZXBlbmRlbnRseS4gICBTV0lHIGNhbiBiZQotdXNlZCB0byBidWlsZCBQeXRob24gd3JhcHBlcnMgYXJvdW5kIHRoZSBmdW5jdGlvbnMgYW5kIHNjcmlwdHMKLWNhbiBiZSB1c2VkIGZvciB0ZXN0aW5nLiAgIEluIG1hbnkgY2FzZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZQotdGhlIEMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBvdGhlciBpbmZvcm1hdGlvbiB0aGF0IHdvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQKLWJ5IHRoZSBsYXJnZXIgYXBwbGljYXRpb24gYWxsIGZyb20gd2l0aGluIGEgUHl0aG9uIHNjcmlwdC4gIFNpbmNlCi1TV0lHIHJlcXVpcmVzIG5vIGNoYW5nZXMgdG8gdGhlIEMgY29kZSwgaW50ZWdyYXRpbmcgdGhlIG5ldyBDIGNvZGUgaW50bwotdGhlIGxhcmdlIHBhY2thZ2UgaXMgdXN1YWxseSBwcmV0dHkgZWFzeS4gPGJyPiA8YnI+Ci0KLUEgcmVsYXRlZCBiZW5lZml0IG9mIHRoZSBTV0lHIGFwcHJvYWNoIGlzIHRoYXQgaXQgaXMgbm93IHBvc3NpYmxlCi10byBlYXNpbHkgZXhwZXJpbWVudCB3aXRoIGxhcmdlIHNvZnR3YXJlIGxpYnJhcmllcyBhbmQgcGFja2FnZXMuCi1QZXRlci1QaWtlIFNsb2FuIGF0IHRoZQotVW5pdmVyc2l0eSBvZiBVdGFoLCB1c2VkIFNXSUcgdG8gd3JhcCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBPcGVuLUdMCi1saWJyYXJ5IChpbmNsdWRpbmcgbW9yZSB0aGFuIDU2MCBjb25zdGFudHMgYW5kIDM0MCBDIGZ1bmN0aW9ucykuCi1UaGlzIGBgaW50ZXJwcmV0ZWQnJyBPcGVuLUdMIGNvdWxkIHRoZW4gYmUgdXNlZCBpbnRlcmFjdGl2ZWx5IHRvCi1kZXRlcm1pbmUgdmFyaW91cyBpbWFnZSBwYXJhbWV0ZXJzIGFuZCB0byBkcmF3IHNpbXBsZSBmaWd1cmVzLgotSXMgdGhpcyBjYXNlLCBpdCBwcm92ZWQgdG8gYmUgYSByZW1hcmthYmx5IGVmZmVjdGl2ZSB3YXkgb2YKLWZpZ3VyaW5nIG91dCB0aGUgZWZmZWN0cyBvZiBkaWZmZXJlbnQgcGFyYW1ldGVycyBhbmQgZnVuY3Rpb25zIHdpdGhvdXQKLWhhdmluZyB0byByZWNvbXBpbGUgYWZ0ZXIgZXZlcnkgbW9kaWZpY2F0aW9uLgotCi08aDI+IExpdmluZyBkYW5nZXJvdXNseSB3aXRoIGRhdGF0eXBlcyA8L2gyPgotCi1PbmUgb2YgdGhlIHJlYXNvbnMgU1dJRyBpcyBlYXN5IHRvIHVzZSBmb3IgcHJvdG90eXBpbmcgYW5kIGNvbnRyb2wKLWFwcGxpY2F0aW9ucyBpcyBpdHMgZXh0cmVtZWx5IGZvcmdpdmluZyB0cmVhdG1lbnQgb2YgZGF0YXR5cGVzLgotPHR0PiB0eXBlZGVmIDwvdHQ+IGNhbiBiZSB1c2VkIHRvIG1hcCBkYXRhdHlwZXMsIGJ1dCB3aGVuZXZlcgotU1dJRyBlbmNvdW50ZXJzIGFuIHVua25vd24gZGF0YXR5cGUsIGl0IHNpbXBseSBhc3N1bWVzIHRoYXQgaXQncwotc29tZSBzb3J0IG9mIGNvbXBsZXggZGF0YXR5cGUuICBBcyBhIHJlc3VsdCwgaXQncyBwb3NzaWJsZSB0bwotd3JhcCBzb21lIGZhaXJseSBjb21wbGV4IEMgY29kZSB3aXRoIGFsbW9zdCBubyBlZmZvcnQuICBGb3IgZXhhbXBsZSwgCi1vbmUgY291bGQgY3JlYXRlIGEgbW9kdWxlIGFsbG93aW5nIFB5dGhvbiB0byBjcmVhdGUgYSBUY2wgaW50ZXJwcmV0ZXIKLWFuZCBleGVjdXRlIFRjbCBjb21tYW5kcyBhcyBmb2xsb3dzIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+Ci08cHJlPgotLy8gdGNsLmkKLS8vIFdyYXAgVGNsJ3MgQyBpbnRlcmZhY2UKLSVpbml0IHRjbAotJXsKLSNpbmNsdWRlICZsdDt0Y2wuaCZndDsKLSV9Ci0KLVRjbF9JbnRlcnAgKlRjbF9DcmVhdGVJbnRlcnAodm9pZCk7Ci12b2lkICAgICAgICBUY2xfRGVsZXRlSW50ZXJwKFRjbF9JbnRlcnAgKmludGVycCk7Ci1pbnQgICAgICAgICBUY2xfRXZhbChUY2xfSW50ZXJwICppbnRlcnAsIGNoYXIgKnNjcmlwdCk7Ci1pbnQgICAgICAgICBUY2xfRXZhbEZpbGUoVGNsX0ludGVycCAqaW50ZXJwLCBjaGFyICpmaWxlKTsKLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotU1dJRyBoYXMgbm8gaWRlYSB3aGF0IDx0dD4gVGNsX0ludGVycCA8L3R0PiBpcywgYnV0IGl0IGRvZXNuJ3QKLXJlYWxseSBjYXJlIGFzIGxvbmcgYXMgaXQncyB1c2VkIGFzIGEgcG9pbnRlci4gICAgV2hlbiB1c2VkIGluIGEKLVB5dGhvbiBzY3JpcHQsIHRoaXMgbW9kdWxlIHdvdWxkIHdvcmsgYXMgZm9sbG93cyA6Ci08YmxvY2txdW90ZT4KLTx0dD4KLTxwcmU+Ci11bml4ID4gcHl0aG9uCi1QeXRob24gMS4zIChNYXIgMjYgMTk5NikgIFtHQ0MgMi43LjBdCi1Db3B5cmlnaHQgMTk5MS0xOTk1IFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1zdGVyZGFtCi0+Pj4gaW1wb3J0IHRjbAotPj4+IGludGVycCA9IHRjbC5UY2xfQ3JlYXRlSW50ZXJwKCk7Ci0+Pj4gdGNsLlRjbF9FdmFsKGludGVycCwiZm9yIHtzZXQgaSAwfSB7JGkgPCA1fSB7aW5jciBpIDF9IHtwdXRzICRpfSIpOwotMAotMQotMgotMwotNAotMAotPj4+Ci08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoMj4gTGltaXRhdGlvbnMgPC9oMj4KLQotVGhpcyBhcHByb2FjaCByZXByZXNlbnRzIGEgYmFsYW5jZSBvZiBmbGV4aWJpbGl0eSBhbmQgZWFzZSBvZiB1c2UuCi1JIGhhdmUgYWx3YXlzIGZlbHQgdGhhdCB0aGUgdG9vbCBzaG91bGRuJ3QgYmUgbW9yZSBjb21wbGljYXRlZCB0aGFuCi10aGUgb3JpZ2luYWwgcHJvYmxlbS4gICAgVGhlcmVmb3JlLCBTV0lHIGNlcnRhaW5seSB3b24ndCBkbyBldmVyeXRoaW5nLgotU29tZSBvZiBTV0lHJ3MgbGltaXRhdGlvbnMgaW5jbHVkZSBpdCdzIGxpbWl0ZWQgdW5kZXJzdGFuZGluZyBvZgotY29tcGxleCBkYXRhdHlwZXMuICAgT2Z0ZW4gdGhlIHVzZXIgbXVzdCB3cml0ZSBzcGVjaWFsIGZ1bmN0aW9ucwotdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIHN0cnVjdHVyZXMgZXZlbiB0aG91Z2ggcGFzc2luZyBjb21wbGV4Ci1kYXRhdHlwZXMgYXJvdW5kIGJ5IHJlZmVyZW5jZSB3b3JrcyByZW1hcmthYmx5IHdlbGwgaW4gcHJhY3RpY2UuCi1TV0lHJ3Mgc3VwcG9ydCBmb3IgQysrIGlzIGFsc28gcXVpdGUgbGltaXRlZC4gICBBdCB0aGUgbW9tZW50IFNXSUcKLWNhbiBiZSB1c2VkIHRvIHBhc3MgcG9pbnRlcnMgdG8gQysrIG9iamVjdHMgYXJvdW5kLCBidXQgYWN0dWFsbHkKLXRyYW5zZm9ybWluZyBhIEMrKyBvYmplY3QgaW50byBzb21lIHNvcnQgb2YgUHl0aG9uIG9iamVjdCBpcyBmYXIKLWJleW9uZCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLiAgRmluYWxseSwgU1dJRwotbGFja3MgYW4gZXhjZXB0aW9uIG1vZGVsIHdoaWNoIG1heSBiZSBvZiBjb25jZXJuIHRvIHNvbWUgdXNlcnMuCi0KLTxoMj4gTGltaXRhdGlvbnMgaW4gdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiA8L2gyPgotCi1TV0lHJ3Mgc3VwcG9ydCBmb3IgUHl0aG9uIGlzIGluIG1hbnkgd2F5cywgbGltaXRlZCBieSB0aGUgZmFjdCB0aGF0Ci1TV0lHIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBmb3IgdXNlIHdpdGggb3RoZXIgbGFuZ3VhZ2VzLiAgRm9yIGV4YW1wbGUsCi1yZXByZXNlbnRpbmcgQyBwb2ludGVycyBhcyBhIGNoYXJhY3RlciBzdHJpbmcgY2FuIGJlIHNlZW4gYXMgYSBjYXJyeS1vdmVyCi1mcm9tIGFuIGVhcmxpZXIgVGNsIGltcGxlbWVudGF0aW9uLiAgV2l0aCBhIGxpdHRsZSB3b3JrLCBJIGJlbGlldmUgCi10aGF0IG9uZSBjb3VsZCBjcmVhdGUgYSBQeXRob24gInBvaW50ZXIiIGRhdGF0eXBlIHdoaWxlIHN0aWxsIHJldGFpbmluZwotdHlwZS1jaGVja2luZyBhbmQgb3RoZXIgZmVhdHVyZXMuIDxicj4gPGJyPgotCi1Bbm90aGVyIGxpbWl0YXRpb24gaW4gdGhlIGN1cnJlbnQgUHl0aG9uIGltcGxlbWVudGF0aW9uIGlzIHRoZSBhcHBhcmVudCBsYWNrCi1vZiB2YXJpYWJsZSBsaW5raW5nIHN1cHBvcnQuICBNYW55IGFwcGxpY2F0aW9ucywgcGFydGljdWxhcmx5IHNjaWVudGlmaWMgb25lcywKLWhhdmUgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGEgdXNlciBtYXkgd2FudCB0byBhY2Nlc3MuICAgU1dJRyBjdXJyZW50bHkKLWNyZWF0ZXMgUHl0aG9uIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIHRoZXNlIHZhcmlhYmxlcywgYnV0IG90aGVyCi1zY3JpcHRpbmcgbGFuZ3VhZ2VzIHByb3ZpZGUgYSBtb3JlIG5hdHVyYWwgbWVjaGFuaXNtLiAKLUZvciBleGFtcGxlLCBpbiBQZXJsLCBpdCBpcwotcG9zc2libGUgdG8gYXR0YWNoICJzZXQiIGFuZCAiZ2V0IiBmdW5jdGlvbnMgdG8gYSBQZXJsIG9iamVjdC4gIFRoZXNlCi1hcmUgZXZhbHVhdGVkIHdoZW5ldmVyIHRoYXQgdmFyaWFibGUgaXMgYWNjZXNzZWQgaW4gYSBzY3JpcHQuICAKLUZvciBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzIHRoaXMgc3BlY2lhbCB2YXJpYWJsZSBsb29rcyBsaWtlIGFueSBvdGhlciBQZXJsCi12YXJpYWJsZSwgYnV0IGlzIHJlYWxseSBsaW5rZWQgdG8gYW4gQyBnbG9iYWwgdmFyaWFibGUgKG9mIGNvdXJzZSwKLW1heWJlIHRoZXJlIGlzIGEgcmVhc29uIHdoeSBQZXJsIGNhbGxzIHRoZXNlICJtYWdpYyIgdmFyaWFibGVzKS4gPGJyPiA8YnI+Ci0KLUlmIGFuIGVxdWl2YWxlbnQgdmFyaWFibGUgbGlua2luZyBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIGluIFB5dGhvbiwgSQotY291bGRuJ3QgZmluZCBpdCBbNF0uCi1JZiBub3QsIGl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIGNyZWF0ZSBhIG5ldyBraW5kIG9mIFB5dGhvbiBkYXRhdHlwZQotdGhhdCBzdXBwb3J0cyB2YXJpYWJsZSBsaW5raW5nLCBidXQgd2hpY2ggaW50ZXJhY3RzIHNlYW1sZXNzbHkKLXdpdGggZXhpc3RpbmcgUHl0aG9uIGludGVnZXIsIGZsb2F0aW5nIHBvaW50LCBhbmQgY2hhcmFjdGVyIHN0cmluZyB0eXBlcy4KLQotPGgyPiBTdW1tYXJ5IGFuZCBmdXR1cmUgd29yayA8L2gyPiAKLQotVGhpcyBwYXBlciBoYXMgZGVzY3JpYmVkIHdvcmsgaW4gcHJvZ3Jlc3Mgd2l0aCB0aGUgU1dJRyBzeXN0ZW0gYW5kCi1pdHMgc3VwcG9ydCBmb3IgUHl0aG9uLiAgIEkgYmVsaWV2ZSB0aGF0IHRoaXMgYXBwcm9hY2ggc2hvd3MgZ3JlYXQKLXByb21pc2UgZm9yIGZ1dHVyZSB3b3JrLS1lc3BlY2lhbGx5IHdpdGhpbiB0aGUgc2NpZW50aWZpYyBhbmQKLWVuZ2luZWVyaW5nIGNvbW11bml0eS4gIE1vc3Qgb2YgdGhlIHBlb3BsZSBpbnRyb2R1Y2VkIHRvIFNXSUcgYW5kCi1QeXRob24gaGF2ZQotZm91bmQgYm90aCBzeXN0ZW1zIGV4dHJlbWVseSBlYXN5IGFuZCBzdHJhaWdodGZvcndhcmQgdG8gdXNlLiAgCi1JIGFtIGN1cnJlbnRseQotcXVpdGUgaW50ZXJlc3RlZCBpbiBpbXByb3ZpbmcgU1dJRydzIGludGVyZmFjZSB0byBQeXRob24gYW5kIGV4cGxvcmluZwotaXRzIHVzZSB3aXRoIG51bWVyaWNhbCBQeXRob24gaW4gb3JkZXIgdG8gYnVpbGQgaW50ZXJlc3RpbmcKLWFuZCBmbGV4aWJsZSBzY2llbnRpZmljIGFwcGxpY2F0aW9ucyBbNl0uCi0KLTxoMj4gQWNrbm93bGVkZ21lbnRzIDwvaDI+Ci0KLVRoaXMgcHJvamVjdCB3b3VsZCBub3QgaGF2ZSBiZWVuIHBvc3NpYmxlIHdpdGhvdXQgdGhlIHN1cHBvcnQgb2YgYSBudW1iZXIKLW9mIHBlb3BsZS4gICBQZXRlciBMb21kYWhsLCBTaHVqaWEgWmhvdSwgQnJhZCBIb2xpYW4sIFRpbSBHZXJtYW5uLCBhbmQgTmllbHMKLUplbnNlbiBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgd2VyZSB0aGUgZmlyc3QgdXNlcnMgYW5kIHdlcmUKLWluc3RydW1lbnRhbCBpbiB0ZXN0aW5nIG91dCB0aGUgZmlyc3QgZGVzaWducy4gICBQYXRyaWNrIFR1bGxtYW5uLAotSm9obiBTY2htaWR0LFBldGVyLVBpa2UgU2xvYW4sIGFuZCBLdXJ0aXMgQmxlZWtlciBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIGhhdmUgYWxzbwotYmVlbiBpbnN0cnVtZW50YWwgaW4gdGVzdGluZyBvdXQgc29tZSBvZiB0aGUgbmV3ZXIgdmVyc2lvbnMgYW5kIAotcHJvdmlkaW5nIGZlZWRiYWNrLgotSm9obiBCdWNrbWFuIGhhcyBzdWdnZXN0ZWQgbWFueSBpbnRlcmVzdGluZwotaW1wcm92ZW1lbnRzIGFuZCBpcyBjdXJyZW50bHkgd29ya2luZyBvbiBwb3J0aW5nIFNXSUcgdG8gbm9uLVVuaXgKLXBsYXRmb3JtcyBpbmNsdWRpbmcgTlQsIE9TLzIgYW5kIE1hY2ludG9zaC4KLUZpbmFsbHkKLUknZCBsaWtlIHRvIHRoYW5rIENocmlzIEpvaG5zb24gYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBTY2llbnRpZmljCi1Db21wdXRpbmcgYW5kIEltYWdpbmcgZ3JvdXAgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBmb3IgdGhlaXIgY29udGludWVkCi1zdXBwb3J0LiAgU29tZSBvZiB0aGlzIHdvcmsgd2FzIHBlcmZvcm1lZCB1bmRlciB0aGUgYXVzcGljZXMgb2YgdGhlCi1EZXBhcnRtZW50IG9mIEVuZXJneS4KLQotPGgyPiBSZWZlcmVuY2VzIDwvaDI+Ci0KLVsxXSBELk0uIEJlYXpsZXkuIDxlbT4gU1dJRyA6IEFuIEVhc3kgdG8gVXNlIFRvb2wgZm9yIEludGVncmF0aW5nCi1TY3JpcHRpbmcgTGFuZ3VhZ2VzIHdpdGggQyBhbmQgQysrIDwvZW0+LiAgUHJvY2VlZGluZ3Mgb2YgdGhlIDR0aAotVVNFTklYIFRjbC9UayBXb3Jrc2hvcCAoMTk5NikgKHRvIGFwcGVhcikuIDxicj4gPGJyPgotCi1bMl0gRC5NLiBCZWF6bGV5IGFuZCBQLlMuIExvbWRhaGwgPGVtPiBNZXNzYWdlLVBhc3NpbmcgTXVsdGktQ2VsbAotTW9sZWN1bGFyIER5bmFtaWNzIG9uIHRoZSBDb25uZWN0aW9uIE1hY2hpbmUgNSA8L2VtPiwgUGFyYWxsZWwKLUNvbXB1dGluZyAyMCAoMTk5NCksIHAuIDE3My0xOTUuIDxicj4gPGJyPgotCi1bM10gQmlsbCBKYW5zc2VuIGFuZCBNaWtlIFNwcmVpdHplciwgPGVtPiBJTFUgOiBJbnRlci1MYW5ndWFnZQotVW5pZmljYXRpb24gdmlhIE9iamVjdCBNb2R1bGVzPC9lbT4sIE9PUFNMQSA5NCBXb3Jrc2hvcCBvbgotTXVsdGktTGFuZ3VhZ2UgT2JqZWN0IE1vZGVscy4KLTxicj4gPGJyPgotCi1bNF0gR3VpZG8gdmFuIFJvc3N1bSwgPGVtPiBFeHRlbmRpbmcgYW5kIEVtYmVkZGluZyB0aGUgUHl0aG9uIEludGVycHJldGVyLAotPC9lbT4gT2N0b2JlciAxOTk1LiA8YnI+IDxicj4KLQotWzVdIEd1aWRvIHZhbiBSb3NzdW0sIDxlbT4gUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlIDwvZW0+LCBPY3RvYmVyCi0xOTk1LiA8YnI+IDxicj4KLQotWzZdIFBhdWwgRi4gRHVib2lzLCBLb25yYWQgSGluc2VuLCBhbmQgSmFtZXMgSHVndW5pbiwgPGVtPiBOdW1lcmljYWwKLVB5dGhvbiwgPC9lbT4gQ29tcHV0ZXJzIGluIFBoeXNpY3MsICgxOTk2KSAodG8gYXBwZWFyKQotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9QeTk3Ly5+YmVhemxleS5odG1sIGIvc3dpZ3dlYi9wYXBlcnMvUHk5Ny8ufmJlYXpsZXkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzgxYzFiYS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9QeTk3Ly5+YmVhemxleS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLTxodG1sPgotPHRpdGxlPiBGZWVkaW5nIGEgTGFyZ2Utc2NhbGUgUGh5c2ljcyBBcHBsaWNhdGlvbiB0byBQeXRob24gPC90aXRsZT4KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgotCi08aDE+IEZlZWRpbmcgYSBMYXJnZS1zY2FsZSBQaHlzaWNzIEFwcGxpY2F0aW9uIHRvIFB5dGhvbiA8L2gxPgotCi1EYXZpZCBNLiBCZWF6bGV5IDxicj4KLURlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSA8YnI+Ci1Vbml2ZXJzaXR5IG9mIFV0YWggPGJyPgotU2FsdCBMYWtlIENpdHksIFV0YWggIDg0MTEyIDxicj4KLTx0dD4gYmVhemxleUBjcy51dGFoLmVkdSA8L3R0PiA8YnI+Ci08cD4KLVBldGVyIFMuIExvbWRhaGwgPGJyPgotVGhlb3JldGljYWwgRGl2aXNpb24gPGJyPgotTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IDxicj4KLUxvcyBBbGFtb3MsIE5ldyBNZXhpY28gICA4NzU0NSA8YnI+Ci08dHQ+IHB4bEBsYW5sLmdvdiA8L3R0PiA8YnI+Ci0KLQotCi08aDI+IEFic3RyYWN0IDwvaDI+Ci0KLTxlbT4KLVdlIGRlc2NyaWJlIG91ciBleHBlcmllbmNlcyB1c2luZyBQeXRob24gd2l0aCB0aGUgU1BhU00gbW9sZWN1bGFyCi1keW5hbWljcyBjb2RlIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeS4gIE9yaWdpbmFsbHkgZGV2ZWxvcGVkCi1hcyBhIGxhcmdlIG1vbm9saXRoaWMgYXBwbGljYXRpb24gZm9yIG1hc3NpdmVseSBwYXJhbGxlbCBwcm9jZXNzaW5nCi1zeXN0ZW1zLCB3ZSBoYXZlIHVzZWQgUHl0aG9uIHRvIHRyYW5zZm9ybSBvdXIgYXBwbGljYXRpb24gaW50byBhCi1mbGV4aWJsZSwgaGlnaGx5IG1vZHVsYXIsIGFuZCBleHRyZW1lbHkgcG93ZXJmdWwgc3lzdGVtIGZvciBwZXJmb3JtaW5nCi1zaW11bGF0aW9uLCBkYXRhIGFuYWx5c2lzLCBhbmQgdmlzdWFsaXphdGlvbi4gIEluIGFkZGl0aW9uLCB3ZQotZGVzY3JpYmUgaG93IFB5dGhvbiBoYXMgc29sdmVkIGEgbnVtYmVyIG9mIGltcG9ydGFudCBwcm9ibGVtcyByZWxhdGVkCi10byB0aGUgZGV2ZWxvcG1lbnQsIGRlYnVnZ2luZywgZGVwbG95bWVudCwgYW5kIG1haW50ZW5hbmNlIG9mCi1zY2llbnRpZmljIHNvZnR3YXJlLiA8L2VtPgotCi08aDI+IEJhY2tncm91bmQgPC9oMj4KLQotRm9yIHRoZSBwYXN0IDUgeWVhcnMsIHdlIGhhdmUgYmVlbiBkZXZlbG9waW5nIGEgbGFyZ2Utc2NhbGUgcGh5c2ljcwotY29kZSBmb3IgcGVyZm9ybWluZyBtb2xlY3VsYXItZHluYW1pY3Mgc2ltdWxhdGlvbnMgb2YKLW1hdGVyaWFscy4gIFRoaXMgY29kZSwgU1BhU00gKFNjYWxhYmxlIFBhcmFsbGVsIFNob3J0LXJhbmdlCi1Nb2xlY3VsYXItZHluYW1pY3MpLCB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgZm9yIHRoZSBDb25uZWN0aW9uCi1NYWNoaW5lIDUgbWFzc2l2ZWx5IHBhcmFsbGVsIHN1cGVyY29tcHV0aW5nIHN5c3RlbSBhbmQgbGF0ZXIgbW92ZWQgdG8KLWEgbnVtYmVyIG9mIG90aGVyIG1hY2hpbmVzIGluY2x1ZGluZyB0aGUgQ3JheSBUM0QsIG11bHRpcHJvY2Vzc29yIFN1bgotYW5kIFNHSSBzeXN0ZW1zLCBhbmQgVW5peCB3b3Jrc3RhdGlvbnMgWzEsMl0uICBPdXIgZ29hbCBoYXMKLWJlZW4gdG8gaW52ZXN0aWdhdGUgbWF0ZXJpYWwgcHJvcGVydGllcyBzdWNoIGFzIGZyYWN0dXJlLCBjcmFjawotcHJvcGFnYXRpb24sIGRpc2xvY2F0aW9uIGdlbmVyYXRpb24sIGZyaWN0aW9uLCBhbmQgZHVjdGlsZS1icml0dGxlIHRyYW5zaXRpb25zIFszXS4KLVRoZSBTUGFTTSBjb2RlCi1oZWxwcyB1cyBpbnZlc3RpZ2F0ZSB0aGVzZSBwcm9ibGVtcyBieSBwZXJmb3JtaW5nIGF0b21pc3RpYwotc2ltdWxhdGlvbnMtLXRoYXQgaXMsIHdlIHNpbXVsYXRlIHRoZSBkeW5hbWljcyBvZiBldmVyeSBhdG9tIGluIGEKLW1hdGVyaWFsIGFuZCBob3BlIHRvIG1ha2Ugc2Vuc2Ugb2Ygd2hhdCBoYXBwZW5zLiAgT2YgY291cnNlLCB0aGUKLXVuZGVybHlpbmcgcGh5c2ljcyBpcyBub3Qgc28gaW1wb3J0YW50IGZvciB0aGlzIGRpc2N1c3Npb24uCi0KLTxwPgotV2hpbGUgdGhlIGRldmVsb3BtZW50IG9mIFNQYVNNIGlzIGFuIG9uZ29pbmcgZWZmb3J0LCB3ZQotaGF2ZSBiZWVuIGhhbXBlcmVkIGJ5IGEgbnVtYmVyIG9mIHNlcmlvdXMgcHJvYmxlbXMuCi1GaXJzdCwgdHlwaWNhbAotc2ltdWxhdGlvbnMgZ2VuZXJhdGUgdGVucyB0byBodW5kcmVkcyBvZiBnaWdhYnl0ZXMgb2YgZGF0YSB0aGF0IG11c3QKLWJlIGFuYWx5emVkLiBUaGlzIHRhc2sgaXMgbm90IGVhc2lseSBwZXJmb3JtZWQgb24gYSB1c2VyJ3MKLXdvcmtzdGF0aW9uLCBub3IgaXMgaXQgZWNvbm9taWNhbGx5IGZlYXNpYmxlIHRvIGJ1eSBldmVyeW9uZSB0aGVpciBvd24KLXBlcnNvbmFsIGRlc2t0b3Agc3VwZXJjb21wdXRlci4gIEEgc2Vjb25kIHByb2JsZW0gaXMgdGhhdCBvZgotaW50ZXJhY3Rpdml0eSBhbmQgY29udHJvbC4gIFdlIGFyZSBjb25zdGFudGx5IG1ha2luZyBjaGFuZ2VzIHRvCi1pbnZlc3RpZ2F0ZSBuZXcgcGh5c2ljYWwgbW9kZWxzLCBkaWZmZXJlbnQgbWF0ZXJpYWxzLCBhbmQgc28gZm9ydGguCi1UaGlzIHdvdWxkIHVzdWFsbHkgcmVxdWlyZSBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIEMKLWNvZGUtLWEgcHJvY2VzcyB0aGF0IHdhcyB0ZWRpb3VzIGFuZCBub3QgdmVyeSB1c2VyIGZyaWVuZGx5LiBXZQotd2FudGVkIGEgbW9yZSBmbGV4aWJsZSBtZWNoYW5pc20uCi1GaW5hbGx5LCB0aGVyZSB3ZXJlIG1hbnkgZGlmZmljdWx0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLWRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSBvZiBvdXIgc29mdHdhcmUuICAgV2hpbGUgd2UgYXJlIG9ubHkgYSBzbWFsbAotZ3JvdXAsIGl0IHdhcyBub3QgdW5jb21tb24gZm9yIGRpZmZlcmVudCB1c2VycyB0byBoYXZlIHRoZWlyIAotb3duIHByaXZhdGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSB0aGF0IGhhZCBiZWVuIG1vZGlmaWVkIGluIHNvbWUgbWFubmVyLiAKLVRoaXMsIGluIHR1cm4sIGxlZCB0byBhIG1haW50ZW5hbmNlIG5pZ2h0bWFyZSB0aGF0IG1hZGUgaXQgYWxtb3N0IGltcG9zc2libGUKLXRvIHVwZGF0ZSB0aGUgc29mdHdhcmUgb3IgYXBwbHkgYnVnLWZpeGVzIGluIGEgY29uc2lzdGVudCBtYW5uZXIuCi0KLTxwPgotVG8gYWRkcmVzcyB0aGVzZSBwcm9ibGVtcywgd2Ugc3RhcnRlZCBpbnZlc3RpZ2F0aW5nIHRoZSB1c2Ugb2Ygc2NyaXB0aW5nCi1sYW5ndWFnZXMuICBJbiAxOTk1LCB3ZSB3cm90ZSBhIHNwZWNpYWwgcHVycG9zZSBwYXJhbGxlbC1zY3JpcHRpbmcgbGFuZ3VhZ2UsCi1idXQgcmVwbGFjZWQgaXQgd2l0aCBQeXRob24gYSB5ZWFyIGxhdGVyIChhbHRob3VnaCB0aGUgaW50ZXJmYWNlCi1nZW5lcmF0aW9uIHRvb2wgZm9yIHRoYXQgc2NyaXB0aW5nIGxhbmd1YWdlIGxpdmVzIG9uIGFzIFNXSUcpLiAgSW4gdGhpcwotcGFwZXIsIHdlIGhvcGUgdG8gZGVzY3JpYmUgc29tZSBvZiBvdXIgZXhwZXJpZW5jZXMgd2l0aCBQeXRob24gYW5kIGhvdwotaXQgaGFzIGhlbHBlZCB1cyBzb2x2ZSBwcmFjdGljYWwgc2NpZW50aWZpYyBjb21wdXRpbmcgcHJvYmxlbXMuICAgSW4gcGFydGljdWxhciwKLXdlIGRlc2NyaWJlIHRoZSBvcmdhbml6YXRpb24gb2Ygb3VyIHN5c3RlbSwgbW9kdWxlIGJ1aWxkaW5nIHByb2Nlc3MsCi1pbnRlcmVzdGluZyB0b29scyB0aGF0IFB5dGhvbiBoYXMgaGVscGVkIHVzIGRldmVsb3AsIGFuZCB3aHkgd2UgdGhpbmsgdGhpcwotYXBwcm9hY2ggaXMgcGFydGljdWxhcmx5IHdlbGwtc3VpdGVkIGZvciBzY2llbnRpZmljIGNvbXB1dGluZyByZXNlYXJjaC4KLQotPGgyPiBXaHkgUHl0aG9uPyA8L2gyPgotCi1BbHRob3VnaCBvdXIgY29kZSBvcmlnaW5hbGx5IHVzZWQgYSBjdXN0b20gc2NyaXB0aW5nIGxhbmd1YWdlLCB3ZSBkZWNpZGVkCi10byBzd2l0Y2ggdG8gUHl0aG9uIGZvciBhIG51bWJlciBvZiByZWFzb25zIDoKLQotPHA+Ci08dWw+Ci08bGk+IEZlYXR1cmVzLiAgUHl0aG9uIGhhZCBhIHJpY2ggc2V0IG9mIGRhdGF0eXBlcywgc3VwcG9ydCBmb3IKLW9iamVjdCBvcmllbnRlZCBwcm9ncmFtbWluZywgbmFtZXNwYWNlcywgZXhjZXB0aW9ucywgZHluYW1pYyBsb2FkaW5nLAotYW5kIGEgbGFyZ2UgbnVtYmVyIG9mIHVzZWZ1bCBtb2R1bGVzLgotPGxpPiBTeW50YXguICBPdXIgc3lzdGVtIGlzIGNvbnRyb2xsZWQgdGhyb3VnaAotdGV4dC1iYXNlZCBjb21tYW5kcyBhbmQgc2NyaXB0cy4gIFdlIGZlbHQgdGhhdCBQeXRob24gaGFkIGEgbmljZQotc3ludGF4IHRoYXQgZG9lcyBub3QgcmVxdWlyZSB1c2VycyB0bwotdHlwZSB3ZWlyZCBzeW1ib2xzICgkLCUsQCwgZXRjLi4uKSBvciB1c2Ugc3ludGF4IHRoYXQgaXMgcmFkaWNhbGx5Ci1kaWZmZXJlbnQgdGhhbiBDLgotPGxpPiBBIHNtYWxsIGNvcmUuICBUaGUgbW9kdWxhciBzdHJ1Y3R1cmUgb2YgUHl0aG9uIG1ha2VzIGl0IGVhc3kgZm9yIHVzCi10byByZW1vdmUgb3IgYWRkIG1vZHVsZXMgYXMgbmVlZGVkLiAgIEdpdmVuIHRoZSBkaWZmaWN1bHQgdGFzayBvZiBydW5uaW5nCi1vbiBwYXJhbGxlbCBtYWNoaW5lcyBhbmQgc3VwZXJjb21wdXRlcnMsIHdlIGZlbHQgdGhhdCB0aGlzIHN0cnVjdHVyZQotd291bGQgbWFrZSBpdCBlYXNpZXIgZm9yIHVzIHRvIHBvcnQgUHl0aG9uIHRvIGEgdmFyaWV0eSBvZiBzcGVjaWFsLXB1cnBvc2UKLW1hY2hpbmVzIChzaW5jZSB3ZSBjb3VsZCBqdXN0IHJlbW92ZSBwcm9ibGVtYXRpYyBtb2R1bGVzKS4KLTxsaT4gQXZhaWxhYmlsaXR5IG9mIGRvY3VtZW50YXRpb24uICAgVXNlcnMgY291bGQgZ28gdG8gdGhlIGJvb2tzdG9yZSAKLXRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgUHl0aG9uLgotPGxpPiBTdXBwb3J0IGFuZCBzdGFiaWxpdHkuICBQeXRob24gYXBwZWFyZWQgdG8gYmUgaGlnaGx5IHN0YWJsZSBhbmQKLXdlbGwgc3VwcG9ydGVkIHRocm91Z2ggbmV3c2dyb3Vwcywgc3BlY2lhbCBpbnRlcmVzdCBncm91cHMsIGFuZCB0aGUgUFNBLgotPGxpPiBGcmVlbHkgYXZhaWxhYmxlLiAgV2UgaGF2ZSBiZWVuIGFibGUgdG8KLXVzZSBhbmQgbW9kaWZ5IFB5dGhvbiBhcyBuZWVkZWQgZm9yIG91ciBhcHBsaWNhdGlvbi4gIFRoaXMgd291bGQgaGF2ZQotYmVlbiBpbXBvc3NpYmxlIHdpdGhvdXQgYWNjZXNzIHRvIHRoZSBQeXRob24gc291cmNlLgotPC91bD4KLQotPHA+Ci1Bbm90aGVyIGZhY3Rvciwgbm90IHRvIGJlIG92ZXJsb29rZWQsIGlzIHRoZSBpbmNyZWFzaW5nIGFjY2VwdGFuY2Ugb2YKLVB5dGhvbiBlbHNld2hlcmUgaW4gdGhlIGNvbXB1dGF0aW9uYWwgc2NpZW5jZSBjb21tdW5pdHkuICBFZmZvcnRzIGF0Ci1MYXdyZW5jZSBMaXZlcm1vcmUgTmF0aW9uYWwgTGFib3JhdG9yeSBhbmQgZWxzZXdoZXJlIHdlcmUKLWF0dHJhY3RpdmUtLWluIHBhcnRpY3VsYXIsIHdlIHNhdyBQeXRob24gYXMgYmVpbmcgYSBwb3RlbnRpYWwgdmVoaWNsZQotZm9yIHNoYXJpbmcgbW9kdWxlcyBhbmQgdXRpbGl6aW5nIHRoaXJkLXBhcnR5IHRvb2xzIFs0LDksMTBdLgotCi08aDI+IFN5c3RlbSBPcmdhbml6YXRpb24gPC9oMj4KLQotT3VyIGdvYWwgd2FzIHRvIGJ1aWxkIGEgaGlnaGx5IG1vZHVsYXIgc3lzdGVtIHRoYXQgY291bGQgcGVyZm9ybQotc2ltdWxhdGlvbiwgZGF0YSBhbmFseXNpcywgYW5kIHZpc3VhbGl6YXRpb24tLW9mdGVuIHBlcmZvcm1pbmcKLWFsbCBvZiB0aGVzZSB0YXNrcyBzaW11bHRhbmVvdXNseS4gIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIGEgdGVuZGVuY3kKLXRvIGRvIHRoaXMgYnkgYnVpbGRpbmcgYSB0aWdodGx5IGludGVncmF0ZWQKLW1vbm9saXRoaWMgcGFja2FnZSAocGVyaGFwcyB1c2luZyBhIHdlbGwtc3RydWN0dXJlZCBDKysgY2xhc3MKLWhpZXJhcmNoeSBmb3IgZXhhbXBsZSkuICBJbiBvdXIgdmlldywgdGhpcyBpcyB0b28KLWZvcm1hbCBhbmQgcmVzdHJpY3RpdmUuICBXZSB3YW50ZWQgdG8gc3VwcG9ydCBtb2R1bGVzIHRoYXQgbWlnaHQgb25seQotYmUgbG9vc2VseSByZWxhdGVkIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgYQotZ3JhcGhpY3MgbGlicmFyeSB0byBkZXBlbmQgb24gdGhlIHNhbWUgc3RydWN0dXJlcyBhcyBhIHNpbXVsYXRpb24gY29kZQotb3IgdG8gZXZlbiBiZSB3cml0dGVuIGluIHRoZSBzYW1lIGxhbmd1YWdlIGZvciB0aGF0IG1hdHRlci4gIExpa2V3aXNlLAotd2Ugd2FudGVkIHRvIGV4cGxvaXQgdGhpcmQtcGFydHkgbW9kdWxlcyB3aGVyZSBubyBhc3N1bXB0aW9ucyAKLWNvdWxkIGJlIG1hZGUgYWJvdXQgdGhlaXIgaW50ZXJuYWwgc3RydWN0dXJlLgotCi08cD4KLVRoZSBtYWpvciBjb21wb25lbnRzIG9mIG91ciBzeXN0ZW0gdGFrZSB0aGUgZm9ybSBvZiBDIGxpYnJhcmllcy4gIFdoZW4KLVB5dGhvbiBpcyB1c2VkLCB0aGUgbGlicmFyaWVzIGFyZSBjb21waWxlZCBpbnRvIHNoYXJlZCBsaWJyYXJpZXMgYW5kCi1keW5hbWljYWxseSBsb2FkZWQgaW50byBQeXRob24gYXMgZXh0ZW5zaW9uIG1vZHVsZXMuICBUaGUKLWZ1bmN0aW9uYWxpdHkgb2YgZWFjaCBsaWJyYXJ5IGlzIGV4cG9zZWQgYXMgYSBjb2xsZWN0aW9uIG9mIFB5dGhvbgotImNvbW1hbmRzLiIgIEJlY2F1c2Ugb2YgdGhpcywgdGhlIEMgYW5kIFB5dGhvbiBwcm9ncmFtbWluZwotZW52aXJvbm1lbnRzIGFyZSBjbG9zZWx5IHJlbGF0ZWQuICBJbiBtYW55IGNhc2VzLCBpdCBpcyBwb3NzaWJsZSB0bwotaW1wbGVtZW50IHRoZSBzYW1lIGNvZGUgaW4gYm90aCBDIG9yIFB5dGhvbi4gRm9yIGV4YW1wbGUgOgotCi08YmxvY2txdW90ZT4KLTx0dD48cHJlPgotLyogQSBzaW1wbGUgZnVuY3Rpb24gd3JpdHRlbiBpbiBDICovCi0jaW5jbHVkZSAiU1BhU00uaCIKLXZvaWQgcnVuKGludCBuc3RlcHMsIGRvdWJsZSBEdCwgaW50IGZyZXEpIHsKLSAgICBpbnQgaTsKLSAgICBjaGFyIGZpbGVuYW1lWzY0XTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnN0ZXBzOyBpKyspIHsKLSAgICAgICAgIGludGVncmF0ZV9hZHZfY29vcmQoRHQpOwotICAgICAgICAgYm91bmRhcnlfcGVyaW9kaWMoKTsKLSAgICAgICAgIHJlZGlzdHJpYnV0ZSgpOwotICAgICAgICAgZm9yY2VfZWFtKCk7Ci0gICAgICAgICBpbnRlZ3JhdGVfYWR2X3ZlbG9jaXR5KER0KTsKLSAgICAgICAgIGlmICgoaSAlIGZyZXEpID09IDApIHsKLSAgICAgICAgICAgIHNwcmludGYoZmlsZW5hbWUsIkRhdCVkIixpKTsKLSAgICAgICAgICAgIG91dHB1dF9wYXJ0aWNsZXMoZmlsZW5hbWUpOwotICAgICAgICAgfQotICAgIH0KLX08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0gICAgICAgIAotTm93LCBpbiBQeXRob24gOgotCi08YmxvY2txdW90ZT48dHQ+PHByZT4KLSMgQSBmdW5jdGlvbiB3cml0dGVuIGluIFB5dGhvbgotZnJvbSBTUGFTTSBpbXBvcnQgKgotZGVmIHJ1bihuc3RlcHMsIER0LCBmcmVxKToKLSAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgbnN0ZXBzKToKLSAgICAgICAgIGludGVncmF0ZV9hZHZfY29vcmQoRHQpCi0gICAgICAgICBib3VuZGFyeV9wZXJpb2RpYygpCi0gICAgICAgICByZWRpc3RyaWJ1dGUoKQotICAgICAgICAgZm9yY2VfZWFtKCkKLSAgICAgICAgIGludGVncmF0ZV9hZHZfdmVsb2NpdHkoRHQpCi0gICAgICAgICBpZiAoaSAlIGZyZXEpID09IDApIDoKLSAgICAgICAgICAgIG91dHB1dF9wYXJ0aWNsZXMoJ0RhdCcrc3RyKGkpKQotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi1XaGlsZSBDIGxpYnJhcmllcyBwcm92aWRlIG11Y2ggb2YgdGhlIHVuZGVybHlpbmcgZnVuY3Rpb25hbGl0eSwgdGhlIHJlYWwgcG93ZXIKLW9mIHRoZSBzeXN0ZW0gY29tZXMgaW4gdGhlIGZvcm0gb2YgbW9kdWxlcyBhbmQgc2NyaXB0cyB3cml0dGVuIGVudGlyZWx5IGluIFB5dGhvbi4KLVVzZXJzIHdyaXRlIHNjcmlwdHMgdG8gc2V0IHVwIGFuZCBjb250cm9sIHNpbXVsYXRpb25zLiAgU2V2ZXJhbCBtYWpvcgotY29tcG9uZW50cyBzdWNoIGFzIHRoZSB2aXN1YWxpemF0aW9uIGFuZCBkYXRhLWFuYWx5c2lzIHN5c3RlbSBtYWtlIGhlYXZ5Ci11c2Ugb2YgUHl0aG9uLiAgV2UgYWxzbyB1dGlsaXplIGEgdmFyaWV0eSBvZiBtb2R1bGVzIGluIHRoZSBQeXRob24KLWxpYnJhcnkgYW5kIGhhdmUgZHluYW1pY2FsbHkgbG9hZGFibGUgdmVyc2lvbnMgb2YgVGtpbnRlciBhbmQgdGhlCi1QeXRob24gSW1hZ2luZyBMaWJyYXJ5IFsxMV0uCi0KLTxoMj4gRW1iZWRkaW5nIFB5dGhvbiBhbmQgSGlkaW5nIFN5c3RlbSBEZXBlbmRlbmNpZXMgPC9oMj4KLQotT25lIG9mIHRoZSBiaWdnZXN0IGltcGxlbWVudGF0aW9uIHByb2JsZW1zIHdlIGhhdmUgZW5jb3VudGVyZWQgaXMgdGhlCi1mYWN0IHRoYXQgdGhlIFNQYVNNIGNvZGUgaXMgYSBwYXJhbGxlbCBhcHBsaWNhdGlvbiB0aGF0IHJlbGllcyBoZWF2aWx5Ci11cG9uIHRoZSBwcm9wZXIgaW1wbGVtZW50YXRpb24gb2YgbG93LWxldmVsIHN5c3RlbSBzZXJ2aWNlcyBzdWNoIGFzCi1JL08gYW5kIHByb2Nlc3MgbWFuYWdlbWVudC4gQ3VycmVudGx5LCBpdCBpcyBwb3NzaWJsZSB0byBydW4gdGhlIGNvZGUKLWluIHR3byBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMtLW9uZSB0aGF0IHVzZXMgbWVzc2FnZSBwYXNzaW5nIHZpYSB0aGUKLU1QSSBsaWJyYXJ5IGFuZCBhbm90aGVyIHVzaW5nIFNvbGFyaXMgdGhyZWFkcy4gIFVzaW5nIFB5dGhvbiB3aXRoCi1ib3RoIHZlcnNpb25zIG9mIGNvZGUgcmVxdWlyZXMgYSBkZWdyZWUgb2YgY2FyZS0taW4gcGFydGljdWxhciwgd2UKLWhhdmUgZm91bmQgaXQgdG8gYmUgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgUHl0aG9uIHdpdGggZW5oYW5jZWQgSS9PCi1zdXBwb3J0IHRvIHJ1biBwcm9wZXJseSBpbiBwYXJhbGxlbC4gIFRoaXMgd29yayBoYXMgYmVlbiBkZXNjcmliZWQKLWVsc2V3aGVyZSBbNSw2XS4KLQotPHA+Ci1IYW5kbGluZyB0d28gb3BlcmF0aW9uYWwgbW9kZXMgaW50cm9kdWNlcyBhIG51bWJlciBvZiBwcm9ibGVtcyByZWxhdGVkCi10byBjb2RlIG1haW50ZW5hbmNlIGFuZCBpbnN0YWxsYXRpb24uICBUcmFkaXRpb25hbGx5LCB3ZSB3b3VsZAotcmVjb21waWxlIHRoZSBlbnRpcmUgc3lzdGVtIGFuZCBhbGwgb2YgaXRzIG1vZHVsZXMgZm9yIGVhY2gKLWNvbmZpZ3VyYXRpb24gKHBsYWNpbmcgdGhlIGZpbGVzIGluIGFuIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQKLXN1YmRpcmVjdG9yeSkuICBVc2VycyB3b3VsZCBoYXZlIHRvIGRlY2lkZSB3aGljaCBzeXN0ZW0gdGhleSB3YW50ZWQgdG8KLXVzZSBhbmQgY29tcGlsZSBhbGwgb2YgdGhlaXIgbW9kdWxlcyBieSBsaW5raW5nIGFnYWluc3QgdGhlCi1hcHByb3ByaWF0ZSBsaWJyYXJpZXMgYW5kIHNldHRpbmcgdGhlIHJpZ2h0IGNvbXBpbGUtdGltZSBvcHRpb25zLgotQ2hhbmdpbmcgY29uZmlndXJhdGlvbnMgd291bGQgdHlwaWNhbGx5IHJlcXVpcmUgYSBjb21wbGV0ZSByZWNvbXBpbGUuCi0KLTxwPgotV2l0aCBkeW5hbWljIGxvYWRpbmcgYW5kIHNoYXJlZCBsaWJyYXJpZXMgaG93ZXZlciwgd2UgaGF2ZSBiZWVuIGFibGUKLXRvIGRldmlzZSBhIGRpZmZlcmVudCBhcHByb2FjaCB0byB0aGlzIHByb2JsZW0uICBSYXRoZXIKLXRoYW4gcmVjb21waWxpbmcgZXZlcnl0aGluZyBmb3IgZWFjaCBjb25maWd1cmF0aW9uLCB3ZSB1c2UgYW4KLWltcGxlbWVudGF0aW9uIGluZGVwZW5kZW50IGxheWVyIG9mIHN5c3RlbSB3cmFwcGVycy4gIFRoZXNlIHdyYXBwZXJzCi1wcm92aWRlIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBtZXNzYWdlIHBhc3NpbmcsIHBhcmFsbGVsIEkvTywgYW5kCi10aHJlYWQgbWFuYWdlbWVudC4gIEFsbCBvZiB0aGUgY29yZSBtb2R1bGVzIGFyZSB0aGVuIGNvbXBpbGVkCi11c2luZyB0aGVzZSBnZW5lcmljIHdyYXBwZXJzLiAgIFRoaXMgbWFrZXMgdGhlIG1vZHVsZXMgaW5kZXBlbmRlbnQKLW9mIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGlvbmFsIG1vZGUtLS10byB1c2UgTVBJIG9yIHRocmVhZHMsICB3ZSBzaW1wbHkKLW5lZWQgdG8gc3VwcGx5IGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSAgc3lzdGVtIHdyYXBwZXIgbGlicmFyaWVzLgotVGhpcyBpcyBlYXNpbHkgYWNjb21wbGlzaGVkIGJ5IGJ1aWxkaW5nIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKLVB5dGhvbiB0aGF0IGFyZSBsaW5rZWQgYWdhaW5zdCB0aGUgYXBwcm9wcmlhdGUgc3lzdGVtIGxpYnJhcmllcy4gCi1UbyBydW4gaW4gYSBwYXJ0aWN1bGFyIG1vZGUsIHdlIG5vdyBqdXN0IHJ1biB0aGUgYXBwcm9wcmlhdGUKLXZlcnNpb24gb2YgUHl0aG9uIChpLmUuICdweXRob24nIG9yICdweXRob25tcGknKS4gIFRoZSBuZWF0IAotcGFydCBhYm91dCB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgYWxsIG9mIHRoZSBtb2R1bGVzIHdvcmsgd2l0aCBib3RoCi1vcGVyYXRpb25hbCBtb2RlcyB3aXRob3V0IGFueSByZWNvbXBpbGF0aW9uIG9yIHJlY29uZmlndXJhdGlvbi4gIElmIGEKLXVzZXIgaXMgdXNpbmcgdGhyZWFkcywgYnV0IHdhbnRzIHRvIHN3aXRjaCB0byBNUEksIHRoZXkgc2ltcGx5IHJ1bgotYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBQeXRob24tLW5vIHJlY29tcGlsYXRpb24gb2YgbW9kdWxlcyBpcyBuZWNlc3NhcnkuCi0KLTxwPgotQSBmdWxsIGRpc2N1c3Npb24gb2Ygd3JpdGluZyBzeXN0ZW0td3JhcHBlcnMgY2FuIGJlIGZvdW5kIGVsc2V3aGVyZS4KLUluIHBhcnRpY3VsYXIsIGEgZGlzY3Vzc2lvbiBvZiB3cml0aW5nIHBhcmFsbGVsIEkvTyB3cmFwcGVycyBmb3IKLVB5dGhvbiBjYW4gYmUgZm91bmQgaW4gWzVdLiAgQW4gZWFybGllciBkaXNjdXNzaW9uIG9mIHRoZSB0ZWNobmlxdWUgd2UKLWhhdmUgdXNlZCBmb3Igd3JpdGluZyBtZXNzYWdlIHBhc3NpbmcgYW5kIEkvTyB3cmFwcGVycyBjYW4gYWxzbyBiZQotZm91bmQgaW4gWzddLgotCi08aDI+IE1vZHVsZSBCdWlsZGluZyB3aXRoIFNXSUcgPC9oMj4KLQotVG8gYnVpbGQgbW9kdWxlcywgd2UgaGF2ZSBiZWVuIHVzaW5nIFNXSUcgWzhdLgotRWFjaCBtb2R1bGUgaXMgZGVzY3JpYmVkIGJ5IGEgU1dJRyBpbnRlcmZhY2UgZmlsZSBjb250YWluaW5nIHRoZSBBTlNJCi1DIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMsIHN0cnVjdHVyZXMsIGFuZCB2YXJpYWJsZXMgaW4gdGhhdCBtb2R1bGUuCi1Gb3IgZXhhbXBsZSA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBTV0lHIGludGVyZmFjZSBmaWxlCi0lbW9kdWxlIFNQYVNNCi0lewotI2luY2x1ZGUgIlNQYVNNLmgiCi0lfQotdm9pZCBpbnRlZ3JhdGVfYWR2X2Nvb3JkKGRvdWJsZSBEdCk7Ci12b2lkIGJvdW5kYXJ5X3BlcmlvZGljKCk7Ci12b2lkIHJlZGlzdHJpYnV0ZSgpOwotdm9pZCBmb3JjZV9lYW0oKTsKLXZvaWQgaW50ZWdyYXRlX2Fkdl92ZWxvY2l0eShkb3VibGUgRHQpOwotaW50ICBvdXRwdXRfcGFydGljbGVzKGNoYXIgKmZpbGVuYW1lKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotU1dJRyBwcm92aWRlcyBhIGxvZ2ljYWwgbWFwcGluZyBvZiB0aGUgdW5kZXJseWluZyBDIGltcGxlbWVudGF0aW9uIGludG8KLVB5dGhvbi4gICBEdXJpbmcgY29tcGlsYXRpb24sIGludGVyZmFjZSBmaWxlcyBhcmUgYXV0b21hdGljYWxseQotY29udmVydGVkIGludG8gd3JhcHBlciBjb2RlIGFuZCBjb21waWxlZCBpbnRvIFB5dGhvbiBtb2R1bGVzLiAgVGhpcyAKLXByb2Nlc3MgaXMgZW50aXJlbHkgdHJhbnNwYXJlbnQtLWNoYW5nZXMgbWFkZSB0byB0aGUgaW50ZXJmYWNlCi1hcmUgYXV0b21hdGljYWxseSBwcm9wYWdhdGVkIHRvIFB5dGhvbiB3aGVuZXZlciBhIG1vZHVsZSBpcyByZWNvbXBpbGVkLgotR2l2ZW4gdGhlIGNvbnN0YW50bHkgZXZvbHZpbmcgbmF0dXJlIG9mIHJlc2VhcmNoIGFwcGxpY2F0aW9ucywgdGhpcyBtYWtlcwotaXQgZWFzeSB0byBleHRlbmQgYW5kIG1haW50YWluIHRoZSBzeXN0ZW0uICAKLQotPGgzPiBTZXBhcmF0aW9uIG9mIEltcGxlbWVudGF0aW9uIGFuZCBJbnRlcmZhY2UgPC9oMz4KLQotQW4gaW1wb3J0YW50IGFzcGVjdCBvZiBTV0lHIGlzIHRoYXQgaXQgaXMgcmVxdWlyZXMgbm8gbW9kaWZpY2F0aW9ucyB0bwotZXhpc3RpbmcgQyBjb2RlIHdoaWNoIGFsbG93cyB1cyB0byBtYWludGFpbiBhIHN0cmljdAotc2VwYXJhdGlvbiBiZXR3ZWVuIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBDIG1vZHVsZXMgYW5kIHRoZWlyCi1QeXRob24gaW50ZXJmYWNlLiAgV2UgYmVsaWV2ZSB0aGF0IHRoaXMgcmVzdWx0cyBpbiBjb2RlIHRoYXQKLWlzIG1vcmUgb3JnYW5pemVkIGFuZCBnZW5lcmFsbHkgcmV1c2FibGUuICBUaGVyZSBpcyBubyBwYXJ0aWN1bGFyCi1yZWFzb24gd2h5IGEgQyBtb2R1bGUgc2hvdWxkIGRlcGVuZCBvbiBQeXRob24gKG9uZSBtaWdodAotd2FudCB0byB1c2UgaXQgYXMgYSBzdGFuZC1hbG9uZSBwYWNrYWdlIG9yIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uKS4KLURlc3BpdGUgdXNpbmcgUHl0aG9uIGV4dGVuc2l2ZWx5LCB0aGUgU1BhU00gY29kZSBjYW4gc3RpbGwgYmUKLWNvbXBpbGVkIHdpdGggbm8gUHl0aG9uIGludGVyZmFjZSAob2YgY291cnNlLCB5b3UgbG9zZSBhbGwgb2YKLXRoZSBiZW5lZml0cyBnYWluZWQgYnkgaGF2aW5nIFB5dGhvbikuICAKLVdlIGZlZWwgdGhhdCBtb3N0IHBoeXNpY3MgY29kZXMgdGVuZAotdG8gaGF2ZSBhIHJhdGhlciBsb25nIGxpZmUtc3Bhbi4gIE1haW50YWluaW5nIGEgc2VwYXJhdGlvbiBvZgotaW1wbGVtZW50YXRpb24gYW5kIGludGVyZmFjZSBoZWxwcyBpbnN1cmUgdGhhdCBvdXIgcGh5c2ljcyBjb2RlIHdpbGwKLWJlIHVzYWJsZSBpbiB0aGUgZnV0dXJlLS1ldmVuIGlmIHRoZXJlIGFyZSBkcmFzdGljIGNoYW5nZXMgaW4gdGhlCi1pbnRlcmZhY2UgYWxvbmcgdGhlIHdheS4KLQotPGgzPiBQcm92aWRpbmcgQWNjZXNzIHRvIERhdGEgU3RydWN0dXJlcyA8L2gzPgotCi1Gb3IgdGhlIHB1cnBvc2VzIG9mIGRlYnVnZ2luZyBhbmQgZGF0YSBleHBsb3JhdGlvbiwgd2UgaGF2ZSAKLXVzZWQgU1dJRyB0byBwcm92aWRlIHdyYXBwZXJzIGFyb3VuZCBDIGRhdGEgc3RydWN0dXJlcy4gICBGb3IgZXhhbXBsZSwKLWEgY29sbGVjdGlvbiBvZiBDIHN0cnVjdHVyZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgIGRvdWJsZSB4LHksejsKLX0gVmVjdG9yOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgIGludCAgICB0eXBlOwotICAgICBWZWN0b3IgcjsKLSAgICAgVmVjdG9yIHY7Ci0gICAgIFZlY3RvciBmOwotfSBQYXJ0aWNsZTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotY2FuIGJlIHR1cm5lZCBpbnRvIFB5dGhvbiB3cmFwcGVyIGNsYXNzZXMuICBJbiBhZGRpdGlvbiwgU1dJRyBjYW4gZXh0ZW5kIHN0cnVjdHVyZXMgd2l0aCBtZW1iZXIgZnVuY3Rpb25zIGFzIGZvbGxvd3MgOgotCi08YmxvY2txdW90ZT4gPHByZT4KLS8vIFNXSUcgaW50ZXJmYWNlIGZvciB2ZWN0b3IgYW5kIHBhcnRpY2xlIHN0cnVjdHVyZXMKLSVpbmNsdWRlIGRhdGF0eXBlcy5oCi0KLS8vIEV4dGVuZCBkYXRhIHN0cnVjdHVyZXMgd2l0aCBhIGZldyB1c2VmdWwgbWV0aG9kcwotJWFkZG1ldGhvZHMgVmVjdG9yIHsKLSAgICAgY2hhciAqX19zdHJfXygpIHsKLSAgICAgICAgIHN0YXRpYyBjaGFyIGFbMTAyNF07Ci0gICAgICAgICBzcHJpbnRmKGEsIlsgJTAuMTBmLCAlMC4xMGYsICUwLjEwZiBdIiwgc2VsZi0+eCwgc2VsZi0+eSwgc2VsZi0+eik7Ci0gICAgICAgICByZXR1cm4gYTsKLSAgICAgfQotfQotJWFkZG1ldGhvZHMgUGFydGljbGUgewotICAgICBQYXJ0aWNsZSAqX19nZXRpdGVtX18oaW50IGluZGV4KSB7Ci0gICAgICAgICAgcmV0dXJuIHNlbGYraW5kZXg7Ci0gICAgIH0KLSAgICAgY2hhciAqX19zdHJfXygpIHsKLSAgICAgICAgICAvLyBwcmludCBvdXQgYSBwYXJ0aWNsZQotICAgICAgICAgIC4uLgotICAgICB9Ci19Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotV2hlbiB0aGUgUHl0aG9uIGludGVyZmFjZSBpcyBidWlsdCwgQyBzdHJ1Y3R1cmVzIG5vdyBhcHBlYXIgbGlrZQotUHl0aG9uIG9iamVjdHMuICBCeSBwcm92aWRpbmcgUHl0aG9uLXNwZWNpZmljIG1ldGhvZHMgKHN1Y2ggYXMKLTx0dD5fX2dldGl0ZW1fXzwvdHQ+KSB3ZSBjYW4gZXZlbiBwcm92aWRlIGFycmF5IGFjY2Vzcy4KLUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIFB5dGhvbiBjb2RlIHdvdWxkIHByaW50IG91dAotYWxsIG9mIHRoZSBjb29yZGluYXRlcyBvZiBzdG9yZWQgcGFydGljbGVzIDoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotIyBQcmludCBvdXQgYWxsIGNvb3JkaW5hdGVzIHRvIGEgZmlsZQotZiA9IG9wZW4oInBhcnQuZGF0YSIsInciKQotcCA9IFNQYVNNX2ZpcnN0X3BhcnRpY2xlKCkgICAgICAgICAgIyBHZXQgZmlyc3QgcGFydGljbGUgcG9pbnRlcgotZm9yIGkgaW4geHJhbmdlKDAsU1BhU01fY291bnRfcGFydGljbGVzKCkpOgotICAgIGYud3JpdGUoIiVmLCAlZiwgJWZcbiIgJSAocFtpXS5yLngsIHBbaV0uci55LCBwW2ldLnIueikpCi1mLmNsb3NlKCkKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1XaGlsZSBvbmx5IGEgc2ltcGxlIGV4YW1wbGUsIGhhdmluZyBkaXJlY3QgYWNjZXNzIHRvIHVuZGVybHlpbmcgZGF0YSBoYXMKLXByb3ZlbiB0byBiZSBxdWl0ZSB2YWx1YWJsZSBzaW5jZSB3ZSB2aWV3IHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAKLW9mIGRhdGEsIGNoZWNrIHZhbHVlcywgYW5kIHBlcmZvcm0gZGlhZ25vc3RpY3MuIAotCi08aDM+IEltcHJvdmluZyB0aGUgUmVsaWFiaWxpdHkgb2YgTW9kdWxlcyA8L2gzPgotCi1XaGVuIGluc3RydW1lbnRpbmcgb3VyIG9yaWdpbmFsIHBoeXNpY3MgYXBwbGljYXRpb24gdG8gdXNlIHNjcmlwdGluZywKLXdlIGZvdW5kIHRoYXQgbWFueSBwYXJ0cyBvZiB0aGUgY29kZSB3ZXJlIG5vdCB3cml0dGVuIGluIGFuIGVudGlyZWx5Ci0icmVsaWFibGUiIG1hbm5lci4gIEluIHBhcnRpY3VsYXIsIHRoZSBjb2RlIGhhZCBuZXZlciBiZWVuIG9wZXJhdGVkIGluCi1hbiBldmVudC1kcml2ZW4gbWFubmVyLiAgRnVuY3Rpb25zIG9mdGVuIG1hZGUgYXNzdW1wdGlvbnMgYWJvdXQKLWluaXRpYWxpemF0aW9ucyBhbmQgcmFyZWx5IGNoZWNrZWQgdGhlIHZhbGlkaXR5IG9mIGlucHV0IHBhcmFtZXRlcnMuCi1UbyBhZGRyZXNzIHRoZXNlIGlzc3VlcywgbW9zdCBzZWN0aW9ucyBvZiBjb2RlIHdlcmUgZ3JhZHVhbGx5IGNoYW5nZWQKLXRvIHByb3ZpZGUgc29tZSBraW5kIG9mIHZhbGlkYXRpb24gb2YgaW5wdXQgdmFsdWVzIGFuZCBlcnJvciByZWNvdmVyeS4KLVRoZSBTV0lHIGNvbXBpbGVyIGhhcyBhbHNvIGJlZW4gZXh0ZW5kZWQgdG8gcHJvdmlkZSBzb21lIG9mIHRoZXNlCi1jYXBhYmlsaXRpZXMgYXMgd2VsbC4KLTxwPgotT25lIG9mIFB5dGhvbidzIG1vc3QgcG93ZXJmdWwgZmVhdHVyZXMgaXMgaXRzIGV4Y2VwdGlvbiBoYW5kbGluZyBtZWNoYW5pc20uCi1FeGNlcHRpb25zIGFyZSBlYXNpbHkgcmFpc2VkIGFuZCBoYW5kbGVkIGluIFB5dGhvbiBzY3JpcHRzIGFzIGZvbGxvd3MgOgotCi08YmxvY2txdW90ZT48cHJlPgotIyBBIFB5dGhvbiBmdW5jdGlvbiB0aGF0IHRocm93cyBhbiBleGNlcHRpb24KLWRlZiBhbGxvY2F0ZShuYnl0ZXMpOgotCXB0ciA9IFNQYVNNX21hbGxvYyhuYnl0ZXMpCi0gICAgICAgIGlmIHB0ciA9PSAiTlVMTCI6IHJhaXNlIE1lbW9yeUVycm9yLCJPdXQgb2YgbWVtb3J5ISIKLQotIyBBIFB5dGhvbiBmdW5jdGlvbiB0aGF0IGNhdGNoZXMgYW4gZXhjZXB0aW9uCi1kZWYgZm9vKCk6Ci0JdHJ5OgotCQlhbGxvY2F0ZShOQllURVMpCi0JZXhjZXB0OgotCQlyZXR1cm4gICAgIyBCYWlsaW5nIG91dAotCi08L2Jsb2NrcXVvdGU+PC9wcmU+Ci0KLVdlIGhhdmUgYm9ycm93ZWQgdGhpcyBpZGVhIGFuZCBpbXBsZW1lbnRlZCBhIHNpbWlsYXIgZXhjZXB0aW9uIGhhbmRsaW5nCi1tZWNoYW5pc20gZm9yIG91ciBDIGNvZGUuICBUaGlzIGlzIGFjY29tcGxpc2hlZCB1c2luZyBmdW5jdGlvbnMgaW4gdGhlCi08dHQ+Jmx0O3NldGptcC5oJmd0OzwvdHQ+IGxpYnJhcnkgYW5kIGRlZmluaW5nIGEgZmV3IEMgbWFjcm9zIGZvciAiPHR0PlRyeTwvdHQ+IiwgIjx0dD5FeGNlcHQ8L3R0PiIsCi0iPHR0PlRocm93PC90dD4iLCBldGMuLi4gVXNpbmcgdGhlc2UgbWFjcm9zLCBtYW55IG9mIG91ciBsaWJyYXJ5IGZ1bmN0aW9ucyBub3cgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmcgOgotCi08YmxvY2txdW90ZT48cHJlPgotLyogQSBDIGZ1bmN0aW9uIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiAqLwotdm9pZCAqU1BhU01fbWFsbG9jKHNpemVfdCBuYnl0ZXMpIHsKLSAgICB2b2lkICpwdHIgPSAodm9pZCAqKSBtYWxsb2MobmJ5dGVzKTsKLSAgICBpZiAoIXB0cikgVGhyb3coIlNQYVNNX21hbGxvYyA6IE91dCBvZiBtZW1vcnkhIik7Ci0gICAgcmV0dXJuIHB0cjsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotTGlrZSBQeXRob24sIHdlIGFsbG93IEMgZnVuY3Rpb25zIHRvCi1jYXRjaCBleGNlcHRpb25zIGFuZCBwcm92aWRlIHRoZWlyIG93biByZWNvdmVyeSBhcyBmb2xsb3dzIDoKLQotPGJsb2NrcXVvdGU+IDxwcmU+Ci0vKiBBIEMgZnVuY3Rpb24gY2F0Y2hpbmcgYW4gZXhjZXB0aW9uICovCi1pbnQgZm9vKCkgewotICAgIHZvaWQgKnA7Ci0gICAgVHJ5IHsKLSAgICAgICAgcCA9IFNQYVNNX21hbGxvYyhOQllURVMpOwotICAgIH0gRXhjZXB0IHsKLSAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5LiBSZXR1cm5pbmchXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotSW4gdGhlIGNhc2Ugb2YgYSBzdGFuZC1hbG9uZSBDIGFwcGxpY2F0aW9uLCBleGNlcHRpb25zIGNhbgotYmUgY2F1Z2h0IGFuZCBoYW5kbGVkIGludGVybmFsbHkuICBTaG91bGQgYW4gdW5jYXVnaHQgZXhjZXB0aW9uCi1vY2N1ciwgdGhlIGNvZGUgcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgYW5kIHRlcm1pbmF0ZXMuIEhvd2V2ZXIsCi13aGVuIFB5dGhvbiBpcyB1c2VkLCB3ZSBjYW4gCi1nZW5lcmF0ZSBQeXRob24gZXhjZXB0aW9ucyB1c2luZyBhIFNXSUcgdXNlci1kZWZpbmVkCi1leGNlcHRpb24gaGFuZGxlciBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOgotCi08YmxvY2txdW90ZT4gPHByZT4KLSVtb2R1bGUgU1BhU00KLS8vIEEgU1dJRyB1c2VyIGRlZmluZWQgZXhjZXB0aW9uIGhhbmRsZXIKLSVleGNlcHQocHl0aG9uKSB7Ci0gICAgIFRyeSB7Ci0gICAgICAgICAgJGZ1bmN0aW9uCi0gICAgIH0gRXhjZXB0IHsKLSAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLFNQYVNNX2Vycm9yX21zZygpKTsKLSAgICAgfQotfQotLy8gQyBkZWNsYXJhdGlvbnMgCi0uLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotVGhlIGhhbmRsZXIgY29kZSBnZXRzIHBsYWNlZCBpbnRvIGFsbCBvZiB0aGUgUHl0aG9uCi0id3JhcHBlciIgZnVuY3Rpb25zIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgdHJhbnNsYXRpbmcgQyBleGNlcHRpb25zCi1pbnRvIFB5dGhvbiBleGNlcHRpb25zLiAgRG9pbmcgdGhpcyBtYWtlcyBvdXIgcGh5c2ljcyBjb2RlIG9wZXJhdGUKLWluIGEgbW9yZSBzZWFtbGVzcyBtYW5uZXIgYW5kIGdpdmVzIGl0IGEgcHJlY2lzZWx5IGRlZmluZWQgZXJyb3IgcmVjb3ZlcnkKLXByb2NlZHVyZSAoaS5lLiAgaW50ZXJuYWwgZXJyb3JzIGFsd2F5cyByZXN1bHQgUHl0aG9uIGV4Y2VwdGlvbnMpLiBGb3IgZXhhbXBsZSA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0+Pj4gU1BhU01fbWFsbG9jKDEwMDAwMDAwMDApCi1SdW50aW1lRXJyb3I6IFNQYVNNX21hbGxvYygxMDAwMDAwMDAwKS4gT3V0IG9mIG1lbW9yeSEKLShMaW5lIDUyIGluIG1lbW9yeS5jKQotPj4+Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVdlIGhhdmUgZm91bmQgZXJyb3IgcmVjb3ZlcnkgdG8gYmUgY3JpdGljYWwuICBXaXRob3V0IGl0LCBzaW11bGF0aW9ucyBtYXkgCi1jb250aW51ZSB0byBydW4sIG9ubHkgdG8gZ2VuZXJhdGUgd3JvbmcgYW5zd2VycyBvciBhIG15c3RlcmlvdXMKLXN5c3RlbSBjcmFzaC4gIAotCi08aDI+IE1vcmUgVGhhbiBTY3JpcHRpbmcgPC9oMj4KLQotV2hlbiB3ZSBvcmlnaW5hbGx5IHN0YXJ0ZWQgdXNpbmcgc2NyaXB0aW5nIGxhbmd1YWdlcywgd2UgdGhvdWdodCAKLXRoZXkgd291bGQgbWFpbmx5IGJlIGEgY29udmVuaWVudCBtZWNoYW5pc20gZm9yIGdsdWluZyBDIGxpYnJhcmllcwotdG9nZXRoZXIgYW5kIGNvbnRyb2xsaW5nIHRoZW0gaW4gYW4gaW50ZXJhY3RpdmUgbWFubmVyLiAgSG93ZXZlciwgCi13ZSBoYXZlIGNvbWUgdG8gcmVhbGl6ZSB0aGF0IHNjcmlwdGluZyBsYW5ndWFnZXMgYXJlCi1tdWNoIG1vcmUgcG93ZXJmdWwgdGhhbiB0aGlzLiAgTm93LCB3ZSBmaW5kIG91cnNlbHZlcwotaW1wbGVtZW50aW5nIHNpZ25pZmljYW50IGZ1bmN0aW9uYWxpdHkgZW50aXJlbHkgaW4gUHl0aG9uLS1ieXBhc3NpbmcKLUMgYWx0b2dldGhlci4gICBUaGUgbW9zdCBzdXJwcmlzaW5nICh3ZWxsLCBub3QgcmVhbGx5IHRoYXQgc3VycHJpc2luZykKLWZhY3QgaXMgdGhhdCBQeXRob24gbWFrZXMgaXQgcG9zc2libGUgdG8gYnVpbGQgdmVyeSBwb3dlcmZ1bCB0b29scyB3aXRoCi1vbmx5IGEgc21hbGwgYW1vdW50IG9mIGV4dHJhIHByb2dyYW1taW5nLiAgIEluIHRoaXMgc2VjdGlvbiwgd2UgcHJlc2VudAotYSBicmllZiBvdmVydmlldyBvZiBzb21lIG9mIHRoZSB0b29scyB3ZSBoYXZlIGRldmVsb3BlZC0tbW9zdCBvZgotd2hpY2ggaGF2ZSBiZWVuIGltcGxlbWVudGVkIGxhcmdlbHkgaW4gUHl0aG9uLgotCi08aDM+IE9iamVjdC1PcmllbnRlZCBWaXN1YWxpemF0aW9uIGFuZCBEYXRhIEFuYWx5c2lzIDwvaDM+Ci0KLU91ciBvcmlnaW5hbCBnb2FsIHdhcyB0byBhZGQgYSBwb3dlcmZ1bCBkYXRhIGFuYWx5c2lzIGFuZAotdmlzdWFsaXphdGlvbiBjb21wb25lbnQgdG8gb3VyIGFwcGxpY2F0aW9uLiAgVG8gdGhpcyBlbmQsIHdlIGRldmVsb3BlZAotYSBsaWdodHdlaWdodCBoaWdoLXBlcmZvcm1hbmNlIGdyYXBoaWNzIGxpYnJhcnkgaW1wbGVtZW50ZWQgaW4gQy4KLVRoaXMgbGlicmFyeSBzdXBwb3J0cyBib3RoIDJEIGFuZCAzRCBwbG90dGluZyBhbmQgcHJvZHVjZXMgb3V0cHV0IGluCi10aGUgZm9ybSBvZiBHSUYgaW1hZ2VzLiAgVG8gbWFrZSBwbG90cywgYSB1c2VyIHdyaXRlcyBzaW1wbGUgQwotZnVuY3Rpb25zIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci12b2lkIHBsb3Rfc3BoZXJlcyhQbG90M0QgKnAzLCBEYXRhRnVuY3Rpb24gZnVuYywgZG91YmxlIG1pbiwgZG91YmxlIG1heCwKLSAgICAgICAgICAgICAgICAgIGRvdWJsZSByYWRpdXMpIHsKLSAgICBQYXJ0aWNsZSAqcCA9IFBhcnRpY2xlczsKLSAgICBpbnQgICAgICAgaSwgbnBhcnQsIGNvbG9yOwotICAgIG5wYXJ0ID0gU1BhU01fY291bnRfcGFydGljbGVzKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5wYXJ0OyBpKyssIHArKykgewotICAgICAgICAvKiBDb21wdXRlIGNvbG9yIHZhbHVlICovCi0gICAgICAgIHZhbHVlID0gKCpmdW5jKShwKTsKLSAgICAgICAgY29sb3IgPSAodmFsdWUtbWluKS8obWF4LW1pbikqMjU1OwotICAgICAgICAvKiBQbG90IGl0ICovCi0gICAgICAgIFBsb3QzRF9zcGhlcmUocDMscC0+ci54LHAtPnIueSxwLT5yLnoscmFkaXVzLGNvbG9yKTsKLSAgICB9Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaGVuIGV4ZWN1dGVkLCB0aGlzIGZ1bmN0aW9uIHByb2R1Y2VzIGEgcmF3IGltYWdlIHN1Y2ggYXMgdGhlIGZvbGxvd2luZwotc2hvd2luZyBzdGFja2luZy1mYXVsdHMgZ2VuZXJhdGVkIGJ5IGEgcGFzc2luZyBzaG9jayB3YXZlIGluIGFuIGZjYyBjcnlzdGFsCi1vZiAxMCBtaWxsaW9uIGF0b21zIDoKLTxwPgotPGNlbnRlcj4KLTxpbWcgc3JjPSJiaWdzaG9ja3Jhdy5naWYiPgotPC9jZW50ZXI+Ci08cD4KLVdoaWxlIHNpbXBsZSwgd2Ugb2Z0ZW4gd2FudCBvdXIgaW1hZ2VzIHRvIGNvbnRhaW4gbW9yZSBpbmZvcm1hdGlvbgotaW5jbHVkaW5nIHRpdGxlcywgYXhpcyBsYWJlbHMsIGNvbG9yYmFycywgdGltZS1zdGFtcHMsIGFuZCBib3VuZGluZwotYm94ZXMuICAgVG8gZG8gdGhpcywgd2UgaGF2ZSBidWlsdCBhbiBvYmplY3Qtb3JpZW50ZWQgdmlzdWFsaXphdGlvbgotZnJhbWV3b3JrIGluIFB5dGhvbi4gICBQeXRob24gY2xhc3NlcyBwcm92aWRlIG1ldGhvZHMgZm9yIGdyYXBoIGFubm90YXRpb24KLWFuZCBjb21tb24gZ3JhcGggb3BlcmF0aW9ucy4gICBJZiBhIHVzZXIgd2FudHMgdG8gbWFrZSBhIG5ldyBraW5kIG9mIHBsb3QsCi10aGV5IHNpbXBseSBpbmhlcml0IGZyb20gYW4gYXBwcm9wcmlhdGUgYmFzZSBjbGFzcyBhbmQgcHJvdmlkZSBhIGZ1bmN0aW9uCi10byBwbG90IHRoZSBkZXNpcmVkIGRhdGEuIEZvciBleGFtcGxlLCBhICJTcGhlcmUiIHBsb3QgdXNpbmcgdGhlIGFib3ZlIEMKLWZ1bmN0aW9uIHdvdWxkIGxvb2sgbGlrZSB0aGlzIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLWNsYXNzIFNwaGVyZXMoSW1hZ2UzRCk6Ci0gICAgICBkZWYgX19pbml0X18oc2VsZiwgZnVuYywgbWluLCBtYXgsIHJhZGl1cz0wLjUpOgotICAgICAgICAgICAgIEltYWdlM0QuX19pbml0X18oc2VsZiwgLi4uIAotICAgICAgICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKLSAgICAgICAgICAgICBzZWxmLm1pbiAgPSBtaW4KLSAgICAgICAgICAgICBzZWxmLm1heCAgPSBtYXgKLSAgICAgICAgICAgICBzZWxmLnJhZGl1cyA9IHJhZGl1cwotICAgICAgZGVmIGRyYXcoc2VsZik6Ci0gICAgICAgICAgICAgc2VsZi5uZXdwbG90KCkKLSAgICAgICAgICAgICBwbG90X3NwaGVyZXMoc2VsZi5wMyxzZWxmLmZ1bmMsc2VsZi5taW4sc2VsZi5tYXgsc2VsZi5yYWRpdXMpCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRvIHVzZSB0aGUgbmV3IGltYWdlLCBvbmUgc2ltcGx5IGNyZWF0ZXMgYW4gb2JqZWN0IG9mIHRoYXQgdHlwZSBhbmQKLW1hbmlwdWxhdGVzIGl0LiAgRm9yIGV4YW1wbGUgOgotCi08YmxvY2txdW90ZT48cHJlPgotPj4+IHMgPSBTcGhlcmVzKFBFLC04LC0zLjUpICAgIyBDcmVhdGUgYSBuZXcgaW1hZ2UKLT4+PiBzLnJvdGQoNDUpICAgICAgICAgICAgICAgICMgUm90YXRlIGl0IGRvd24KLT4+PiBzLnpvb20oMjAwKSAgICAgICAgICAgICAgICMgWm9vbSBpbgotPj4+IHMuc2hvdygpICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0ZSBJbWFnZSBhbmQgZGlzcGxheSBpdAotPj4+IC4uLgotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08Y2VudGVyPgotPGltZyBzcmM9ImJpZ3Nob2NrLmdpZiI+Ci08L2NlbnRlcj4KLQotPHA+Ci1UaHVzLCB3aXRoIGEgc2ltcGxlIEMgZnVuY3Rpb24gYW5kIGEgc2ltcGxlIFB5dGhvbiBjbGFzcywgd2UgZ2V0IGEgbG90Ci1vZiBmdW5jdGlvbmFsaXR5IGZvciBmcmVlLCBpbmNsdWRpbmcgbWV0aG9kcyBmb3IgaW1hZ2UgbWFuaXB1bGF0aW9uLAotZ3JhcGggYW5ub3RhdGlvbiwgYW5kIGRpc3BsYXkuICBJbiB0aGUgY3VycmVudCBzeXN0ZW0sIHRoZXJlIGFyZSBhYm91dAotYSBkb3plbiBkaWZmZXJlbnQgdHlwZXMgb2YgaW1hZ2VzIGZvciAyRCBhbmQgM0QgcGxvdHRpbmcuICBJdCBpcyBhbHNvCi1wb3NzaWJsZSB0byBwZXJmb3JtIGZpbHRlcmluZywgYXBwbHkgY2xpcHBpbmcgcGxhbmVzLCBhbmQgb3RoZXIKLWFkdmFuY2VkIG9wZXJhdGlvbnMuICAgIE1vc3Qgb2YgdGhpcyBpcyBzdXBwb3J0ZWQgYnkgYWJvdXQgMjAwMCBsaW5lcyBvZgotUHl0aG9uIGNvZGUgYW5kIGEgcmVsYXRpdmVseSBzbWFsbCBDIGxpYnJhcnkgY29udGFpbmluZyBwZXJmb3JtYW5jZQotY3JpdGljYWwgb3BlcmF0aW9ucy4KLQotPGgzPiBXZWItQmFzZWQgU2ltdWxhdGlvbiBNb25pdG9yaW5nIDwvaDM+Ci0KLU9uZSBmZWF0dXJlIG9mIG1hbnkgcGh5c2ljcyBjb2RlcyBpcyB0aGF0IHRoZXkgdGVuZCB0byBydW4gZm9yIGEgbG9uZwotdGltZS4gIEluIG91ciBjYXNlLCBhIHNpbXVsYXRpb24gbWF5IHJ1biBmb3IgdGVucyB0byBodW5kcmVkcyBvZgotaG91cnMuICBEdXJpbmcgdGhlIGNvdXJzZSBvZiBhIHNpbXVsYXRpb24sIGl0IGlzIGRlc2lyYWJsZSB0byBjaGVjayBvbgotaXRzIHN0YXR1cyBhbmQgc2VlIGhvdyBpdCBpcyBwcm9ncmVzc2luZy4gIEdpdmVuIHRoZSBzdHJvbmcgSW50ZXJuZXQKLXN1cHBvcnQgYWxyZWFkeSBidW5kbGVkIHdpdGggUHl0aG9uLCB3ZSBkZWNpZGVkIHRvIHdyaXRlIGEgc2ltcGxlCi1waHlzaWNzIHdlYi1zZXJ2ZXIgdGhhdCBjb3VsZCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuICBVbmxpa2UgYQotbW9yZSB0cmFkaXRpb25hbCBzZXJ2ZXIsIG91ciBzZXJ2ZXIgaXMgdXNlZCBieSAicmVnaXN0ZXJpbmciIHZhcmlvdXMKLW9iamVjdHMgdGhhdCBvbmUgd2FudHMgdG8gbG9vayBhdCBkdXJpbmcgdGhlIGNvdXJzZSBvZiBhIHNpbXVsYXRpb24uCi1UaGUgc2ltdWxhdGlvbiBjb2RlIHRoZW4gcGVyaW9kaWNhbGx5IHBvbGxzIGEgbmV0d29yayBzb2NrZXQgdG8gc2VlIGlmCi1hbnlvbmUgaGFzIHJlcXVlc3RlZCBhbnl0aGluZy4gIElmIHNvLCB0aGUgc2ltdWxhdGlvbiB3aWxsIHN0b3AgZm9yIGEKLW1vbWVudCwgZ2VuZXJhdGUgdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbiwgc2VuZCBpdCB0byB0aGUgdXNlciwgYW5kCi10aGVuIGNvbnRpbnVlIG9uIHdpdGggdGhlIGNhbGN1bGF0aW9uLiAgQSBzaW1wbGlmaWVkIGV4YW1wbGUgb2YgdXNpbmcKLXRoZSBzZXJ2ZXIgaXMgYXMgZm9sbG93cyA6Ci0KLTxibG9ja3F1b3RlPiA8cHJlPgotIyBTaW1wbGlmaWVkIHNjcmlwdCB1c2luZyBhIHdlYi1zZXJ2ZXIKLWZyb20gdmlzIGltcG9ydCAqCi1mcm9tIHdlYiBpbXBvcnQgKgotCi13ZWIgPSBTUGFTTVdlYigpCi13ZWIuYWRkKFdlYk1haW4oIiIpKQotd2ViLmFkZChXZWJGaWxlVGV4dCgiTXNnIitgcnVuX25vYCkpCi0KLSMgQ3JlYXRlIGFuIGltYWdlIG9iamVjdAotCi1zZXRfZ3JhcGhpY3NfbW9kZShIVFRQKQota2UgPSBTcGhlcmVzKEtFLDAsMjApCi1rZS50aXRsZSA9ICJLaW5ldGljIEVuZXJneSIKLXdlYi5hZGQoV2ViSW1hZ2UoImtlLmdpZiIsa2UpKQotCi1kZWYgcnVuKG5zdGVwcyk6Ci0JZm9yIGkgaW4geHJhbmdlKDAsbnN0ZXBzKToKLQkJaW50ZWdyYXRlKDEpICAgICAgICAgICAjIEludGVncmF0ZSAxIHRpbWVzdGVwCi0gICAgICAgICAgICAgICAgd2ViLnBvbGwoKSAgICAgICAgICAgICAjIEFueW9uZSBsb29raW5nIGZvciBtZT8KLQotIyBSdW4gaXQKLXJ1bigxMDAwMCkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotV2hpbGUgc2ltcGxlLCB0aGlzIGV4YW1wbGUgZ2l2ZXMgdGhlIGJhc2ljIGlkZWEuIFdlIGNyZWF0ZSBhCi1zZXJ2ZXIgb2JqZWN0IGFuZCByZWdpc3RlciBhIGZldyAibGlua3MuIiAgV2hlbiBhIHVzZXIgY29ubmVjdHMgd2l0aAotdGhlIHNlcnZlciwgdGhleSB3aWxsIGJlIHByZXNlbnRlZCB3aXRoIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uIGFuZCBhCi1saXN0IG9mIGF2YWlsYWJsZSBsaW5rcy4gIFdoZW4gdGhlIGxpbmtzIGFyZSBhY2Nlc3NlZCwgdGhlIHNlcnZlcgotZmVlZHMgcmVhbC10aW1lIGRhdGEgYmFjayB0byB0aGUgdXNlci4gIEluIHRoZSBjYXNlIG9mCi1pbWFnZXMsIHRoZXkgYXJlIGdlbmVyYXRlZCBpbW1lZGlhdGVseSBhbmQgc2VudCBiYWNrIGluIEdJRiBmb3JtYXQuIER1cmluZwotdGhpcyBwcm9jZXNzLCBubyB0ZW1wb3JhcnkgZmlsZXMgYXJlIGNyZWF0ZWQsIG5vciBpcyB0aGUgc2VydmVyCi10cmFuc21pdHRpbmcgcHJldmlvdXNseSBzdG9yZWQgaW5mb3JtYXRpb24gKGkuZS4gZXZlcnl0aGluZyBpcyAKLWNyZWF0ZWQgb24tdGhlLWZseSkuIAotCi08cD4KLVdoaWxlIHdlIGFyZSBzdGlsbCByZWZpbmluZyB0aGUgaW1wbGVtZW50YXRpb24sIHRoaXMgYXBwcm9hY2ggaGFzIHR1cm5lZAotb3V0IHRvIGJlIHVzZWZ1bC0tbm90IG9ubHkgY2FuIHdlIHBlcmlvZGljYWxseSBjaGVjayB1cAotb24gYSBydW5uaW5nIHNpbXVsYXRpb24sIHRoaXMgY2FuIGNhbiBiZSBkb25lIGZyb20gYW55IG1hY2hpbmUgdGhhdAotaGFzIGEgV2ViLWJyb3dzZXIsIGluY2x1ZGluZyBQQ3MgYW5kIE1hY3MgcnVubmluZyBvdmVyIGEgbW9kZW0gbGluZQotKGFsbG93aW5nIGEgYm9yZWQgcGh5c2ljaXN0IHRvIGNoZWNrIG9uIGxvbmctcnVubmluZyBqb2JzIGZyb20gaG9tZQotb3Igd2hpbGUgb24gdHJhdmVsKS4gIE9mIGNvdXJzZSwgdGhlIG1vc3QgYW1hemluZyBmYWN0IG9mIGFsbCBpcyB0aGF0Ci10aGlzIHdhcyBpbXBsZW1lbnRlZCBieSBvbmUgcGVyc29uIGluIGFuIGFmdGVybm9vbiBhbmQgb25seSBpbnZvbHZlZAotYWJvdXQgMTUwIGxpbmVzIG9mIFB5dGhvbiBjb2RlICh3aXRoIGdlbmVyb3VzIGhlbHAgZnJvbSB0aGUgUHl0aG9uIGxpYnJhcnkpLgotCi08aDM+IERldmVsb3BtZW50IFN1cHBvcnQgPC9oMz4KLQotRmluYWxseSwgd2UgaGF2ZSBmb3VuZCBQeXRob24gdG8gYmUgcXVpdGUgdXNlZnVsIGZvciBzdXBwb3J0aW5nCi10aGUgZnV0dXJlIGRldmVsb3BtZW50IG9mIG91ciBjb2RlLiAgU29tZSBvZiB0aGlzIGNvbWVzIGluIHRoZSBmb3JtIG9mCi1zb3BoaXN0aWNhdGVkIGRlYnVnZ2luZy0tUHl0aG9uIGNhbiBiZSB1c2VkIHRvIGFuYWx5emUgaW50ZXJuYWwgZGF0YQotc3RydWN0dXJlcyBhbmQgdHJhY2sgZG93biBwcm9ibGVtcy4gIFNpbmNlIFB5dGhvbiBjYW4gcmVhZAotYW5kIG1vZGlmeSBtb3N0IG9mIHRoZSBjb3JlIEMgZGF0YSBzdHJ1Y3R1cmVzLCBpdCBpcyBwb3NzaWJsZSB0bwotcHJvdG90eXBlIG5ldyBmdW5jdGlvbnMgb3IgdG8gcGVyZm9ybSBvbmUtdGltZSBvcGVyYXRpb25zIHdpdGhvdXQgZXZlcgotbG9hZGluZyB1cCB0aGUgQyBjb21waWxlci4KLQotPHA+Ci1XZSBoYXZlIGFsc28gdXNlZCBQeXRob24gaW4gY29uanVuY3Rpb24gd2l0aCBjb2RlCi1tYW5hZ2VtZW50LiBPbmUgb2YgdGhlIG5ld2VyIHByb2JsZW1zIHdlIGhhdmUgZmFjZWQgaXMgdGhlIHRhc2sgb2YKLWZpbmRpbmcgdGhlIGRlZmluaXRpb25zIG9mIEMgZnVuY3Rpb25zIChmb3IgZXhhbXBsZSwgCi13ZSBtaWdodCB3YW50IHRvIGtub3cgaG93IGEgcGFydGljdWxhciBjb21tYW5kIGhhcyBiZWVuCi1pbXBsZW1lbnRlZCBpbiBDKS4gIFRvIHN1cHBvcnQgdGhpcywgd2UgaGF2ZSB3cml0dGVuIHRvb2xzIGZvcgotYnJvd3Npbmcgc291cmNlIGRpcmVjdG9yaWVzLCBkaXNwbGF5aW5nIGRlZmluaXRpb25zLCBhbmQgc3Bhd25pbmcKLWVkaXRvcnMuICBBbGwgb2YgdGhpcyBpcyBpbXBsZW1lbnRlZCBpbiBQeXRob24gYW5kIGNhbiBiZSBwZXJmb3JtZWQKLWRpcmVjdGx5IGZyb20gdGhlIFBoeXNpY3MgYXBwbGljYXRpb24uICBQeXRob24gaGFzIG1hZGUgdGhlc2Uga2luZHMKLW9mIHRvb2xzIHZlcnkgZWFzeSB0byB3cml0ZS0tb2Z0ZW4gb25seSByZXF1aXJpbmcgYSBmZXcgaG91cnMgb2YKLWVmZm9ydC4KLQotPGgyPiBQeXRob24gYW5kIHRoZSBEZXZlbG9wbWVudCBvZiBTY2llbnRpZmljIFNvZnR3YXJlIDwvaDI+Ci0KLVRoZSBhZG9wdGlvbiBvZiBQeXRob24gaGFzIGhhZCBhIHByb2ZvdW5kIGVmZmVjdCBvbiB0aGUgb3ZlcmFsbAotc3RydWN0dXJlIG9mIG91ciBhcHBsaWNhdGlvbi4gIFdpdGggdGltZSwgdGhlIGNvZGUgYmVjYW1lIG1vcmUKLW1vZHVsYXIsIG1vcmUgcmVsaWFibGUsIGFuZCBiZXR0ZXIgb3JnYW5pemVkLiAgIAotRnVydGhlcm1vcmUsIHRoZXNlIGdhaW5zIGhhdmUgYmVlbiBhY2hpZXZlZAotd2l0aG91dCBzaWduaWZpY2FudCBsb3NzZXMgaW4gcGVyZm9ybWFuY2UsIGluY3JlYXNlZCBjb2RpbmcgY29tcGxleGl0eSwKLW9yIHN1YnN0YW50aWFsbHkgaW5jcmVhc2VkIGRldmVsb3BtZW50IGNvc3QuICAgSXQgc2hvdWxkIGFsc28gYmUgc3RyZXNzZWQKLXRoYXQgYXV0b21hdGVkIHRvb2xzIHN1Y2ggYXMgU1dJRyBoYXZlIHBsYXllZCBhIGNyaXRpY2FsIHJvbGUgaW4gdGhpcwotZWZmb3J0IGJ5IGhpZGluZyB0aGUgUHl0aG9uLUMgaW50ZXJmYWNlIGFuZCBhbGxvd2luZyB1cyB0byBjb25jZW50cmF0ZQotb24gdGhlIHJlYWwgcHJvYmxlbXMgYXQgaGFuZCAoaS5lLiBwaHlzaWNzKS4gIAotCi08cD4KLU9uZSBwb2ludCwgdGhhdCB3ZSB3b3VsZCBsaWtlIHRvIHN0cm9uZ2x5IGVtcGhhc2l6ZSwgaXMgdGhlIGR5bmFtaWMKLW5hdHVyZSBvZiBtYW55IHNjaWVudGlmaWMgYXBwbGljYXRpb25zLiAgT3VyIGFwcGxpY2F0aW9uIGlzIG5vdCBhIGh1Z2UKLW1vbm9saXRoaWMgcGFja2FnZSB0aGF0IG5ldmVyIGNoYW5nZXMgYW5kIHdoaWNoIG5vIG9uZSBpcyBzdXBwb3NlZCB0bwotbW9kaWZ5LiAgUmF0aGVyLCB0aGUgY29kZSBpcyA8ZW0+Y29uc3RhbnRseTwvZW0+IGNoYW5naW5nIHRvIGV4cGxvcmUKLW5ldyBwcm9ibGVtcywgdHJ5IG5ldyBudW1lcmljYWwgbWV0aG9kcywgb3IgdG8gcHJvdmlkZSBiZXR0ZXIKLXBlcmZvcm1hbmNlLiAgVGhlIGhpZ2hseSBtb2R1bGFyIG5hdHVyZSBvZiBQeXRob24gd29ya3MgZ3JlYXQgaW4KLXRoaXMgZW52aXJvbm1lbnQuICBXZSBwcm92aWRlIGEgY29tbW9uIHJlcG9zaXRvcnkgb2YgbW9kdWxlcyB0aGF0IGFyZSBzaGFyZWQgYnkgYWxsCi1vZiB0aGUgdXNlcnMgb2YgdGhlIHN5c3RlbS4gIERpZmZlcmVudCB1c2VycyBhcmUgdHlwaWNhbGx5IHJlc3BvbnNpYmxlCi1mb3IgZGlmZmVyZW50IG1vZHVsZXMgYW5kIGFsbCB1c2VycyBtYXkgYmUgd29ya2luZyBvbiBkaWZmZXJlbnQgbW9kdWxlcwotYXQgdGhlIHNhbWUgdGltZS4gCi1XaGVuZXZlciBjaGFuZ2VzIHRvIGEgbW9kdWxlIGFyZSBtYWRlLCB0aGV5IGFyZSBpbW1lZGlhdGVseSBwcm9wYWdhdGVkCi10byBldmVyeW9uZSBlbHNlLiAgSW4gdGhlIGNhc2Ugb2YgYnVnLWZpeGVzLCB0aGlzIG1lYW5zIHRoYXQgcGF0Y2hlZAotdmVyc2lvbnMgb2YgY29kZSBhcmUgYXZhaWxhYmxlIGltbWVkaWF0ZWx5LiAgTGlrZXdpc2UsIG5ldwotZmVhdHVyZXMgc2hvdyB1cCBhdXRvbWF0aWNhbGx5IGFuZCBjYW4gYmUgZWFzaWx5IHRlc3RlZCBieSBldmVyeW9uZS4KLUFuZCBvZiBjb3Vyc2UsIGlmIHNvbWV0aGluZyBicmVha3MtLW90aGVycyB0ZW5kIHRvIG5vdGljZSBhbG1vc3QgaW1tZWRpYXRlbHkKLSh3aGljaCB3ZSBmZWVsIGlzIGEgZ29vZCB0aGluZykuCi0KLTxoMj4gTGltaXRhdGlvbnMgb2YgUHl0aG9uIDwvaDI+Ci0KLVdoaWxlIHdlIGNvbnNpZGVyIG91ciBQeXRob24gImV4cGVyaW1lbnQiIHRvIGJlIGhpZ2hseSBzdWNjZXNzZnVsLCB3ZQotaGF2ZSBleHBlcmllbmNlZCBhIG51bWJlciBvZiBwcm9ibGVtcyBhbG9uZyB0aGUgd2F5LiAgVGhlIGZpcnN0IGlzCi1tZXJlbHkgYSB0ZWNobmljYWwgaXNzdWUtLWl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlIG1lY2hhbmlzbSBmb3IKLWJ1aWxkaW5nIHN0YXRpYyBleHRlbnNpb25zIHRvIFB5dGhvbiB3ZXJlIG1hZGUgZWFzaWVyLiAgV2hpbGUgd2UgYXJlCi1jdXJyZW50bHkgdXNpbmcgZHluYW1pYyBsb2FkaW5nLCBtYW55IG1hY2hpbmVzLCBlc3BlY2lhbGx5Ci1zdXBlcmNvbXB1dGluZyBzeXN0ZW1zLCBkbyBub3Qgc3VwcG9ydCBpdC4gIE9uIHRoZXNlIG1hY2hpbmVzIGl0IGlzCi1uZWNlc3NhcnkgdG8gc3RhdGljbHkgbGluayBldmVyeXRoaW5nLiAgTGlicmFyaWVzIGhlbHAgc2ltcGxpZnkgdGhlCi10YXNrLCBidXQgY29tYmluaW5nIGRpZmZlcmVudCBzdGF0aWNhbGx5IGxpbmtlZCBtb2R1bGVzIHRvZ2V0aGVyIGludG8KLWEgc2luZ2xlIFB5dGhvbiBpbnRlcnByZXRlciBzdGlsbCByZW1haW5zIG1hZ2ljYWwgYW5kIHNvbWV3aGF0Ci1wcm9ibGVtYXRpYyAoZXNwZWNpYWxseSBzaW5jZSB3ZSBhcmUgY3JlYXRpbmcgYW4gYXBwbGljYXRpb24gdGhhdAotY2hhbmdlcyBhIGxvdC0tbm90IG1lcmVseSB0cnlpbmcgdG8gcGF0Y2ggdGhlIFB5dGhvbiBjb3JlIHdpdGggYSBuZXcKLWV4dGVuc2lvbiBtb2R1bGUpLgotCi08cD4KLUEgc2Vjb25kIHByb2JsZW0gaXMgdGhhdCBvZiBlZHVjYXRpb24tLXdlIGhhdmUgZm91bmQgdGhhdCBzb21lIHVzZXJzCi1oYXZlIGEgdmVyeSBkaWZmaWN1bHQgdGltZSBtYWtpbmcgc2Vuc2Ugb2YgdGhlIHN5c3RlbSAoZXZlbiB3ZSdyZQotc29tZXdoYXQgYW1hemVkIHRoYXQgaXQgcmVhbGx5IHdvcmtzKS4KLUludGVyZXN0aW5nbHkgZW5vdWdoLCB0aGlzIGRvZXMgbm90IHNlZW0gdG8gYmUgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUKLXVzZSBvZiBDIGNvZGUgb3IgUHl0aG9uIGZvciB0aGF0IG1hdHRlciwgYnV0IHRvIGlzc3VlcyByZWxhdGVkIHRvIHRoZQotY29uZmlndXJhdGlvbiwgY29tcGlsYXRpb24sIGRlYnVnZ2luZywgYW5kIGluc3RhbGxhdGlvbiBvZiBtb2R1bGVzLiAgV2hpbGUgbW9zdAotdXNlcnMgaGF2ZSB3cml0dGVuIHByb2dyYW1zIGJlZm9yZSwgdGhleSBoYXZlIG5ldmVyIGRlYWx0IHdpdGggc2hhcmVkCi1saWJyYXJpZXMsIGF1dG9tYXRlZCBjb2RlIGdlbmVyYXRvcnMsIGhpZ2gtbGV2ZWwgbGFuZ3VhZ2VzLCBhbmQgdGhpcmQtcGFydHkgcGFja2FnZXMKLXN1Y2ggYXMgUHl0aG9uLiAgSW4gb3RoZXIgY2FzZXMsIHRoZXJlIHNlZW1zIHRvIGJlIGEKLSJmZWFyIG9mIGF1dG9jb25mIi0taWYgYSBwcm9ncmFtIHJlcXVpcmVzIGEgY29uZmlndXJlIHNjcmlwdCwgaXQgbXVzdAotYmUgdG9vIGNvbXBsaWNhdGVkIHRvIHVuZGVyc3RhbmQgKHdoaWNoIGlzIG5vdCB0aGUgY2FzZQotaGVyZSkuICBUaGUgY29tYmluYXRpb24gb2YgdGhlc2UKLWZhY3RvcnMgaGFzIGxlZCBzb21lIHVzZXJzIHRvIGJlbGlldmUgdGhhdCB0aGUgc3lzdGVtIGlzIGZhciBtb3JlCi1jb21wbGljYXRlZCBhbmQgZnJhZ2lsZSB0aGFuIGl0IHJlYWxseSBpcy4gIFdlJ3JlIG5vdCBzdXJlIGhvdyB0byBjb21iYXQKLXRoaXMgcHJvYmxlbSBvdGhlciB0aGFuIHRvIHRyeSBhbmQgZWR1Y2F0ZSB0aGUgdXNlcnMKLShpLmUuIGl0J3MgZXNzZW50aWFsbHkgdGhlIHNhbWUgY29kZSBhcyBiZWZvcmUsIGJ1dCB3aXRoIGEgcmVhbGx5IGNvb2wKLWhhY2spLgotCi08aDI+IENvbmNsdXNpb25zIGFuZCBGdXR1cmUgV29yayA8L2gyPgotCi1QeXRob24gaXMgY29vbCBhbmQgd2UgcGxhbiB0byBrZWVwIHVzaW5nIGl0LiBIb3dldmVyIG11Y2ggd29yawotcmVtYWlucy4gIE9uZSBvZiB0aGUgbW9yZSBleGNpdGluZyBhc3BlY3RzIG9mIFB5dGhvbiBpcyBpdHMgc29saWQKLXN1cHBvcnQgZm9yIG1vZHVsYXIgcHJvZ3JhbW1pbmcgYW5kIHRoZSBjdWx0dXJlIG9mIGNvb3BlcmF0aW9uIGluIHRoZQotUHl0aG9uIGNvbW11bml0eS4gVGhlcmUgYXJlIGFscmVhZHkgbWFueSBQeXRob24tcmVsYXRlZCBzY2llbnRpZmljCi1jb21wdXRpbmcgcHJvamVjdHMgdW5kZXJ3YXkuICBJZiB0aGVzZSBlZmZvcnRzIHdlcmUgY29vcmRpbmF0ZWQgCi1pbiBzb21lIG1hbm5lciwgd2UgZmVlbCB0aGF0IHRoZSByZXN1bHRzIGNvdWxkIGJlIHNwZWN0YWN1bGFyLgotCi08aDI+IEFja25vd2xlZGdtZW50cyA8L2gyPgotCi1XZSB3b3VsZCBsaWtlIGFja25vd2xlZGdlIG91ciBjb2xsYWJvcmF0b3JzIEJyYWQgSG9saWFuLCBUaW0gR2VybWFubiwgU2h1amlhIFpob3UsIGFuZCBXYW5zaHUgSHVhbmcgYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LiAgV2Ugd291bGQgYWxzbyBsaWtlCi10byBhY2tub3dsZWRnZSBQYXVsIER1Ym9pcyBhbmQgQnJpYW4gWWFuZyBhdCBMYXdyZW5jZSBMaXZlcm1vcmUKLU5hdGlvbmFsIExhYm9yYXRvcnkgZm9yIG1hbnkgaW50ZXJlc3RpbmcgY29udmVyc2F0aW9ucyBjb25jZXJuaW5nIFB5dGhvbgotYW5kIGl0cyB1c2UgaW4gcGh5c2ljcyBhcHBsaWNhdGlvbnMuICBXZSB3b3VsZCBhbHNvIGxpa2UgdG8KLWFja25vd2xlZGdlIHRoZSBTY2llbnRpZmljIENvbXB1dGluZyBhbmQgSW1hZ2luZyBHcm91cCBhdCB0aGUKLVVuaXZlcnNpdHkgb2YgVXRhaCBmb3IgdGhlaXIgY29udGludWVkIHN1cHBvcnQuICBGaW5hbGx5LCB3ZSdkIGxpa2UgdG8KLXRoYW5rIHRoZSBlbnRpcmUgUHl0aG9uIGRldmVsb3BtZW50IGNvbW11bml0eSBmb3IgbWFraW5nIGEgdHJ1bHkKLWF3ZXNvbWUgdG9vbCBmb3Igc29sdmluZyByZWFsIHByb2JsZW1zLiAgRGV2ZWxvcG1lbnQgb2YgdGhlIFNQYVNNIGNvZGUKLWhhcyBiZWVuIHBlcmZvcm1lZCB1bmRlciB0aGUgYXVzcGljZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgRGVwYXJ0bWVudAotb2YgRW5lcmd5LgotCi08aDI+IFJlZmVyZW5jZXMgPC9oMj4KLQotPHA+Ci1bMV0gRC5NLkJlYXpsZXkgYW5kIFAuUy4gTG9tZGFobCwgIk1lc3NhZ2UKLVBhc3NpbmcgTXVsdGktQ2VsbCBNb2xlY3VsYXIgRHluYW1pY3Mgb24gdGhlIENvbm5lY3Rpb24gTWFjaGluZSA1LCIKLVBhcmFsbGVsIENvbXB1dGluZyAyMCAoMTk5NCksIHAuIDE3My0xOTUuIDxwPgotCi08cD4KLVsyXSBQLlMuTG9tZGFobCwgUC5UYW1heW8sIE4uR3JvbmJlY2gtSmVuc2VuLAotYW5kIEQuTS5CZWF6bGV5LCAiNTAgR2Zsb3BzIE1vbGVjdWxhciBEeW5hbWljcyBvbiB0aGUgQ00tNSwiIFByb2NlZWRpbmdzCi1vZiBTdXBlcmNvbXB1dGluZyA5MywgSUVFRSBDb21wdXRlciBTb2NpZXR5ICgxOTkzKSwgcC41MjAtNTI3LiA8cD4KLQotPHA+Ci1bM10gUy5KLlpob3UsIEQuTS4gQmVhemxleSwgUC5TLiBMb21kYWhsLCBCLkwuIEhvbGlhbiwgUGh5c2ljYWwgUmV2aWV3Ci1MZXR0ZXJzLiA3OCwgNDc5ICgxOTk3KS4KLQotPHA+Ci1bNF0gUC4gRHVib2lzLCBLLiBIaW5zZW4sIGFuZCBKLiBIdWd1bmluLCBDb21wdXRlcnMgaW4gUGh5c2ljcyAoMTApLCAoMTk5NikKLXAuIDI2Mi0yNjcuCi0KLTxwPgotWzVdIEQuIE0uIEJlYXpsZXkgYW5kIFAuUy4gTG9tZGFobCwgIkV4dGVuc2libGUgTWVzc2FnZSBQYXNzaW5nIEFwcGxpY2F0aW9uCi1EZXZlbG9wbWVudCBhbmQgRGVidWdnaW5nIHdpdGggUHl0aG9uIiwgUHJvY2VlZGluZ3Mgb2YgSVBQUyc5NywgR2VuZXZhCi1Td2l0emVybGFuZCwgSUVFRSBDb21wdXRlciBTb2NpZXR5ICgxOTk3KS4KLQotPHA+Ci1bNl0gVC4tWS5CLiBZYW5nLCBELk0uIEJlYXpsZXksIFAuIEYuIER1Ym9pcywgRy4gRnVybmlzaCwgIlN0ZWVyaW5nIE9iamVjdC1vcmllbnRlZCBDb21wdXRhdGlvbnMgd2l0aAotUHl0aG9uIiwgUHl0aG9uIFdvcmtzaG9wIDUsIFdhc2hpbmd0b24gRC5DLiwgTm92LiA0LTUsIDE5OTYuCi0KLTxwPgotWzddIEQuTS4gQmVhemxleSBhbmQgUC5TLiBMb21kYWhsLCAiSGlnaAotUGVyZm9ybWFuY2UgTW9sZWN1bGFyIER5bmFtaWNzIE1vZGVsaW5nIHdpdGggU1BhU00gOiBQZXJmb3JtYW5jZSBhbmQKLVBvcnRhYmlsaXR5IElzc3VlcywiIFByb2NlZWRpbmdzIG9mIHRoZSBXb3Jrc2hvcCBvbiBEZWJ1Z2dpbmcgYW5kCi1UdW5pbmcgZm9yIFBhcmFsbGVsIENvbXB1dGVyIFN5c3RlbXMsIENoYXRoYW0sIE1BLCAxOTk0IChJRUVFIENvbXB1dGVyCi1Tb2NpZXR5IFByZXNzLCBMb3MgQWxhbWl0b3MsIENBLCAxOTk2KSwgcHAuIDMzNy0zNTEuCi0KLTxwPgotWzhdIEQuTS4gQmVhemxleSwgIlVzaW5nIFNXSUcgdG8gQ29udHJvbCwgUHJvdG90eXBlLCBhbmQgRGVidWcgQyBQcm9ncmFtcyB3aXRoIFB5dGhvbiIsCi1Qcm9jZWVkaW5ncyBvZiB0aGUgNHRoIEludGVybmF0aW9uYWwgUHl0aG9uIENvbmZlcmVuY2UsIExhd3JlbmNlIExpdmVybW9yZSAKLU5hdGlvbmFsIExhYm9yYXRvcnksIEp1bmUgMy02LCAxOTk2LiAKLQotPHA+Ci1bOV0gSy4gSGluc2VuLCBUaGUgTW9sZWN1bGFyIE1vZGVsaW5nIFRvb2xraXQsIDx0dD5odHRwOi8vc3RhcnNoaXAuc2t5cG9ydC5uZXQvY3Jldy9oaW5zZW4vbW10ay5odG1sPC90dD4KLQotPHA+Ci1bMTBdIEppbSBIdWd1bmluLCBOdW1lcmljIFB5dGhvbiwgPHR0Pmh0dHA6Ly93d3cuc2xzLmxjcy5taXQuZWR1L2pqaC9udW1weTwvdHQ+Ci0KLTxwPgotWzExXSBGcmVkcmlrIEx1bmRoLCBQeXRob24gSW1hZ2luZyBMaWJyYXJ5LCA8dHQ+aHR0cDovL3d3dy5weXRob24ub3JnL3NpZ3MvaW1hZ2Utc2lnL0ltYWdpbmcuaHRtbDwvdHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9QeTk3L2JlYXpsZXkuaHRtbCBiL3N3aWd3ZWIvcGFwZXJzL1B5OTcvYmVhemxleS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjMyMmM0Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1B5OTcvYmVhemxleS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYzICswLDAgQEAKLTxodG1sPgotPHRpdGxlPiBGZWVkaW5nIGEgTGFyZ2Utc2NhbGUgUGh5c2ljcyBBcHBsaWNhdGlvbiB0byBQeXRob24gPC90aXRsZT4KLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiPgotCi08aDE+IEZlZWRpbmcgYSBMYXJnZS1zY2FsZSBQaHlzaWNzIEFwcGxpY2F0aW9uIHRvIFB5dGhvbiA8L2gxPgotCi1EYXZpZCBNLiBCZWF6bGV5IDxicj4KLURlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSA8YnI+Ci1Vbml2ZXJzaXR5IG9mIFV0YWggPGJyPgotU2FsdCBMYWtlIENpdHksIFV0YWggIDg0MTEyIDxicj4KLTx0dD4gYmVhemxleUBjcy51dGFoLmVkdSA8L3R0PiA8YnI+Ci08cD4KLVBldGVyIFMuIExvbWRhaGwgPGJyPgotVGhlb3JldGljYWwgRGl2aXNpb24gPGJyPgotTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IDxicj4KLUxvcyBBbGFtb3MsIE5ldyBNZXhpY28gICA4NzU0NSA8YnI+Ci08dHQ+IHB4bEBsYW5sLmdvdiA8L3R0PiA8YnI+Ci0KLTxwPgotKFByZXNlbnRlZCBhdCB0aGUgNnRoIEludGVybmF0aW9uYWwgUHl0aG9uIENvbmZlcmVuY2UsIFNhbiBKb3NlLCBDYWxpZm9ybmlhLiBPY3RvYmVyIDE0LTE3LCAxOTk3KS4KLQotPGgyPiBBYnN0cmFjdCA8L2gyPgotCi08ZW0+Ci1XZSBkZXNjcmliZSBvdXIgZXhwZXJpZW5jZXMgdXNpbmcgUHl0aG9uIHdpdGggdGhlIFNQYVNNIG1vbGVjdWxhcgotZHluYW1pY3MgY29kZSBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkuICBPcmlnaW5hbGx5IGRldmVsb3BlZAotYXMgYSBsYXJnZSBtb25vbGl0aGljIGFwcGxpY2F0aW9uIGZvciBtYXNzaXZlbHkgcGFyYWxsZWwgcHJvY2Vzc2luZwotc3lzdGVtcywgd2UgaGF2ZSB1c2VkIFB5dGhvbiB0byB0cmFuc2Zvcm0gb3VyIGFwcGxpY2F0aW9uIGludG8gYQotZmxleGlibGUsIGhpZ2hseSBtb2R1bGFyLCBhbmQgZXh0cmVtZWx5IHBvd2VyZnVsIHN5c3RlbSBmb3IgcGVyZm9ybWluZwotc2ltdWxhdGlvbiwgZGF0YSBhbmFseXNpcywgYW5kIHZpc3VhbGl6YXRpb24uICBJbiBhZGRpdGlvbiwgd2UKLWRlc2NyaWJlIGhvdyBQeXRob24gaGFzIHNvbHZlZCBhIG51bWJlciBvZiBpbXBvcnRhbnQgcHJvYmxlbXMgcmVsYXRlZAotdG8gdGhlIGRldmVsb3BtZW50LCBkZWJ1Z2dpbmcsIGRlcGxveW1lbnQsIGFuZCBtYWludGVuYW5jZSBvZgotc2NpZW50aWZpYyBzb2Z0d2FyZS4gPC9lbT4KLQotPGgyPiBCYWNrZ3JvdW5kIDwvaDI+Ci0KLUZvciB0aGUgcGFzdCA1IHllYXJzLCB3ZSBoYXZlIGJlZW4gZGV2ZWxvcGluZyBhIGxhcmdlLXNjYWxlIHBoeXNpY3MKLWNvZGUgZm9yIHBlcmZvcm1pbmcgbW9sZWN1bGFyLWR5bmFtaWNzIHNpbXVsYXRpb25zIG9mCi1tYXRlcmlhbHMuICBUaGlzIGNvZGUsIFNQYVNNIChTY2FsYWJsZSBQYXJhbGxlbCBTaG9ydC1yYW5nZQotTW9sZWN1bGFyLWR5bmFtaWNzKSwgd2FzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGZvciB0aGUgQ29ubmVjdGlvbgotTWFjaGluZSA1IG1hc3NpdmVseSBwYXJhbGxlbCBzdXBlcmNvbXB1dGluZyBzeXN0ZW0gYW5kIGxhdGVyIG1vdmVkIHRvCi1hIG51bWJlciBvZiBvdGhlciBtYWNoaW5lcyBpbmNsdWRpbmcgdGhlIENyYXkgVDNELCBtdWx0aXByb2Nlc3NvciBTdW4KLWFuZCBTR0kgc3lzdGVtcywgYW5kIFVuaXggd29ya3N0YXRpb25zIFsxLDJdLiAgT3VyIGdvYWwgaGFzCi1iZWVuIHRvIGludmVzdGlnYXRlIG1hdGVyaWFsIHByb3BlcnRpZXMgc3VjaCBhcyBmcmFjdHVyZSwgY3JhY2sKLXByb3BhZ2F0aW9uLCBkaXNsb2NhdGlvbiBnZW5lcmF0aW9uLCBmcmljdGlvbiwgYW5kIGR1Y3RpbGUtYnJpdHRsZSB0cmFuc2l0aW9ucyBbM10uCi1UaGUgU1BhU00gY29kZQotaGVscHMgdXMgaW52ZXN0aWdhdGUgdGhlc2UgcHJvYmxlbXMgYnkgcGVyZm9ybWluZyBhdG9taXN0aWMKLXNpbXVsYXRpb25zLS10aGF0IGlzLCB3ZSBzaW11bGF0ZSB0aGUgZHluYW1pY3Mgb2YgZXZlcnkgYXRvbSBpbiBhCi1tYXRlcmlhbCBhbmQgaG9wZSB0byBtYWtlIHNlbnNlIG9mIHdoYXQgaGFwcGVucy4gIE9mIGNvdXJzZSwgdGhlCi11bmRlcmx5aW5nIHBoeXNpY3MgaXMgbm90IHNvIGltcG9ydGFudCBmb3IgdGhpcyBkaXNjdXNzaW9uLgotCi08cD4KLVdoaWxlIHRoZSBkZXZlbG9wbWVudCBvZiBTUGFTTSBpcyBhbiBvbmdvaW5nIGVmZm9ydCwgd2UKLWhhdmUgYmVlbiBoYW1wZXJlZCBieSBhIG51bWJlciBvZiBzZXJpb3VzIHByb2JsZW1zLgotRmlyc3QsIHR5cGljYWwKLXNpbXVsYXRpb25zIGdlbmVyYXRlIHRlbnMgdG8gaHVuZHJlZHMgb2YgZ2lnYWJ5dGVzIG9mIGRhdGEgdGhhdCBtdXN0Ci1iZSBhbmFseXplZC4gVGhpcyB0YXNrIGlzIG5vdCBlYXNpbHkgcGVyZm9ybWVkIG9uIGEgdXNlcidzCi13b3Jrc3RhdGlvbiwgbm9yIGlzIGl0IGVjb25vbWljYWxseSBmZWFzaWJsZSB0byBidXkgZXZlcnlvbmUgdGhlaXIgb3duCi1wZXJzb25hbCBkZXNrdG9wIHN1cGVyY29tcHV0ZXIuICBBIHNlY29uZCBwcm9ibGVtIGlzIHRoYXQgb2YKLWludGVyYWN0aXZpdHkgYW5kIGNvbnRyb2wuICBXZSBhcmUgY29uc3RhbnRseSBtYWtpbmcgY2hhbmdlcyB0bwotaW52ZXN0aWdhdGUgbmV3IHBoeXNpY2FsIG1vZGVscywgZGlmZmVyZW50IG1hdGVyaWFscywgYW5kIHNvIGZvcnRoLgotVGhpcyB3b3VsZCB1c3VhbGx5IHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBDCi1jb2RlLS1hIHByb2Nlc3MgdGhhdCB3YXMgdGVkaW91cyBhbmQgbm90IHZlcnkgdXNlciBmcmllbmRseS4gV2UKLXdhbnRlZCBhIG1vcmUgZmxleGlibGUgbWVjaGFuaXNtLgotRmluYWxseSwgdGhlcmUgd2VyZSBtYW55IGRpZmZpY3VsdGllcyBhc3NvY2lhdGVkIHdpdGggdGhlCi1kZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2Ugb2Ygb3VyIHNvZnR3YXJlLiAgIFdoaWxlIHdlIGFyZSBvbmx5IGEgc21hbGwKLWdyb3VwLCBpdCB3YXMgbm90IHVuY29tbW9uIGZvciBkaWZmZXJlbnQgdXNlcnMgdG8gaGF2ZSB0aGVpciAKLW93biBwcml2YXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgdGhhdCBoYWQgYmVlbiBtb2RpZmllZCBpbiBzb21lIG1hbm5lci4gCi1UaGlzLCBpbiB0dXJuLCBsZWQgdG8gYSBtYWludGVuYW5jZSBuaWdodG1hcmUgdGhhdCBtYWRlIGl0IGFsbW9zdCBpbXBvc3NpYmxlCi10byB1cGRhdGUgdGhlIHNvZnR3YXJlIG9yIGFwcGx5IGJ1Zy1maXhlcyBpbiBhIGNvbnNpc3RlbnQgbWFubmVyLgotCi08cD4KLVRvIGFkZHJlc3MgdGhlc2UgcHJvYmxlbXMsIHdlIHN0YXJ0ZWQgaW52ZXN0aWdhdGluZyB0aGUgdXNlIG9mIHNjcmlwdGluZwotbGFuZ3VhZ2VzLiAgSW4gMTk5NSwgd2Ugd3JvdGUgYSBzcGVjaWFsIHB1cnBvc2UgcGFyYWxsZWwtc2NyaXB0aW5nIGxhbmd1YWdlLAotYnV0IHJlcGxhY2VkIGl0IHdpdGggUHl0aG9uIGEgeWVhciBsYXRlciAoYWx0aG91Z2ggdGhlIGludGVyZmFjZQotZ2VuZXJhdGlvbiB0b29sIGZvciB0aGF0IHNjcmlwdGluZyBsYW5ndWFnZSBsaXZlcyBvbiBhcyBTV0lHKS4gIEluIHRoaXMKLXBhcGVyLCB3ZSBob3BlIHRvIGRlc2NyaWJlIHNvbWUgb2Ygb3VyIGV4cGVyaWVuY2VzIHdpdGggUHl0aG9uIGFuZCBob3cKLWl0IGhhcyBoZWxwZWQgdXMgc29sdmUgcHJhY3RpY2FsIHNjaWVudGlmaWMgY29tcHV0aW5nIHByb2JsZW1zLiAgIEluIHBhcnRpY3VsYXIsCi13ZSBkZXNjcmliZSB0aGUgb3JnYW5pemF0aW9uIG9mIG91ciBzeXN0ZW0sIG1vZHVsZSBidWlsZGluZyBwcm9jZXNzLAotaW50ZXJlc3RpbmcgdG9vbHMgdGhhdCBQeXRob24gaGFzIGhlbHBlZCB1cyBkZXZlbG9wLCBhbmQgd2h5IHdlIHRoaW5rIHRoaXMKLWFwcHJvYWNoIGlzIHBhcnRpY3VsYXJseSB3ZWxsLXN1aXRlZCBmb3Igc2NpZW50aWZpYyBjb21wdXRpbmcgcmVzZWFyY2guCi0KLTxoMj4gV2h5IFB5dGhvbj8gPC9oMj4KLQotQWx0aG91Z2ggb3VyIGNvZGUgb3JpZ2luYWxseSB1c2VkIGEgY3VzdG9tIHNjcmlwdGluZyBsYW5ndWFnZSwgd2UgZGVjaWRlZAotdG8gc3dpdGNoIHRvIFB5dGhvbiBmb3IgYSBudW1iZXIgb2YgcmVhc29ucyA6Ci0KLTxwPgotPHVsPgotPGxpPiBGZWF0dXJlcy4gIFB5dGhvbiBoYWQgYSByaWNoIHNldCBvZiBkYXRhdHlwZXMsIHN1cHBvcnQgZm9yCi1vYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbW1pbmcsIG5hbWVzcGFjZXMsIGV4Y2VwdGlvbnMsIGR5bmFtaWMgbG9hZGluZywKLWFuZCBhIGxhcmdlIG51bWJlciBvZiB1c2VmdWwgbW9kdWxlcy4KLTxsaT4gU3ludGF4LiAgT3VyIHN5c3RlbSBpcyBjb250cm9sbGVkIHRocm91Z2gKLXRleHQtYmFzZWQgY29tbWFuZHMgYW5kIHNjcmlwdHMuICBXZSBmZWx0IHRoYXQgUHl0aG9uIGhhZCBhIG5pY2UKLXN5bnRheCB0aGF0IGRvZXMgbm90IHJlcXVpcmUgdXNlcnMgdG8KLXR5cGUgd2VpcmQgc3ltYm9scyAoJCwlLEAsIGV0Yy4uLikgb3IgdXNlIHN5bnRheCB0aGF0IGlzIHJhZGljYWxseQotZGlmZmVyZW50IHRoYW4gQy4KLTxsaT4gQSBzbWFsbCBjb3JlLiAgVGhlIG1vZHVsYXIgc3RydWN0dXJlIG9mIFB5dGhvbiBtYWtlcyBpdCBlYXN5IGZvciB1cwotdG8gcmVtb3ZlIG9yIGFkZCBtb2R1bGVzIGFzIG5lZWRlZC4gICBHaXZlbiB0aGUgZGlmZmljdWx0IHRhc2sgb2YgcnVubmluZwotb24gcGFyYWxsZWwgbWFjaGluZXMgYW5kIHN1cGVyY29tcHV0ZXJzLCB3ZSBmZWx0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUKLXdvdWxkIG1ha2UgaXQgZWFzaWVyIGZvciB1cyB0byBwb3J0IFB5dGhvbiB0byBhIHZhcmlldHkgb2Ygc3BlY2lhbC1wdXJwb3NlCi1tYWNoaW5lcyAoc2luY2Ugd2UgY291bGQganVzdCByZW1vdmUgcHJvYmxlbWF0aWMgbW9kdWxlcykuCi08bGk+IEF2YWlsYWJpbGl0eSBvZiBkb2N1bWVudGF0aW9uLiAgIFVzZXJzIGNvdWxkIGdvIHRvIHRoZSBib29rc3RvcmUgCi10byBmaW5kIG91dCBtb3JlIGFib3V0IFB5dGhvbi4KLTxsaT4gU3VwcG9ydCBhbmQgc3RhYmlsaXR5LiAgUHl0aG9uIGFwcGVhcmVkIHRvIGJlIGhpZ2hseSBzdGFibGUgYW5kCi13ZWxsIHN1cHBvcnRlZCB0aHJvdWdoIG5ld3Nncm91cHMsIHNwZWNpYWwgaW50ZXJlc3QgZ3JvdXBzLCBhbmQgdGhlIFBTQS4KLTxsaT4gRnJlZWx5IGF2YWlsYWJsZS4gIFdlIGhhdmUgYmVlbiBhYmxlIHRvCi11c2UgYW5kIG1vZGlmeSBQeXRob24gYXMgbmVlZGVkIGZvciBvdXIgYXBwbGljYXRpb24uICBUaGlzIHdvdWxkIGhhdmUKLWJlZW4gaW1wb3NzaWJsZSB3aXRob3V0IGFjY2VzcyB0byB0aGUgUHl0aG9uIHNvdXJjZS4KLTwvdWw+Ci0KLTxwPgotQW5vdGhlciBmYWN0b3IsIG5vdCB0byBiZSBvdmVybG9va2VkLCBpcyB0aGUgaW5jcmVhc2luZyBhY2NlcHRhbmNlIG9mCi1QeXRob24gZWxzZXdoZXJlIGluIHRoZSBjb21wdXRhdGlvbmFsIHNjaWVuY2UgY29tbXVuaXR5LiAgRWZmb3J0cyBhdAotTGF3cmVuY2UgTGl2ZXJtb3JlIE5hdGlvbmFsIExhYm9yYXRvcnkgYW5kIGVsc2V3aGVyZSB3ZXJlCi1hdHRyYWN0aXZlLS1pbiBwYXJ0aWN1bGFyLCB3ZSBzYXcgUHl0aG9uIGFzIGJlaW5nIGEgcG90ZW50aWFsIHZlaGljbGUKLWZvciBzaGFyaW5nIG1vZHVsZXMgYW5kIHV0aWxpemluZyB0aGlyZC1wYXJ0eSB0b29scyBbNCw5LDEwXS4KLQotPGgyPiBTeXN0ZW0gT3JnYW5pemF0aW9uIDwvaDI+Ci0KLU91ciBnb2FsIHdhcyB0byBidWlsZCBhIGhpZ2hseSBtb2R1bGFyIHN5c3RlbSB0aGF0IGNvdWxkIHBlcmZvcm0KLXNpbXVsYXRpb24sIGRhdGEgYW5hbHlzaXMsIGFuZCB2aXN1YWxpemF0aW9uLS1vZnRlbiBwZXJmb3JtaW5nCi1hbGwgb2YgdGhlc2UgdGFza3Mgc2ltdWx0YW5lb3VzbHkuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBhIHRlbmRlbmN5Ci10byBkbyB0aGlzIGJ5IGJ1aWxkaW5nIGEgdGlnaHRseSBpbnRlZ3JhdGVkCi1tb25vbGl0aGljIHBhY2thZ2UgKHBlcmhhcHMgdXNpbmcgYSB3ZWxsLXN0cnVjdHVyZWQgQysrIGNsYXNzCi1oaWVyYXJjaHkgZm9yIGV4YW1wbGUpLiAgSW4gb3VyIHZpZXcsIHRoaXMgaXMgdG9vCi1mb3JtYWwgYW5kIHJlc3RyaWN0aXZlLiAgV2Ugd2FudGVkIHRvIHN1cHBvcnQgbW9kdWxlcyB0aGF0IG1pZ2h0IG9ubHkKLWJlIGxvb3NlbHkgcmVsYXRlZCB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEKLWdyYXBoaWNzIGxpYnJhcnkgdG8gZGVwZW5kIG9uIHRoZSBzYW1lIHN0cnVjdHVyZXMgYXMgYSBzaW11bGF0aW9uIGNvZGUKLW9yIHRvIGV2ZW4gYmUgd3JpdHRlbiBpbiB0aGUgc2FtZSBsYW5ndWFnZSBmb3IgdGhhdCBtYXR0ZXIuICBMaWtld2lzZSwKLXdlIHdhbnRlZCB0byBleHBsb2l0IHRoaXJkLXBhcnR5IG1vZHVsZXMgd2hlcmUgbm8gYXNzdW1wdGlvbnMgCi1jb3VsZCBiZSBtYWRlIGFib3V0IHRoZWlyIGludGVybmFsIHN0cnVjdHVyZS4KLQotPHA+Ci1UaGUgbWFqb3IgY29tcG9uZW50cyBvZiBvdXIgc3lzdGVtIHRha2UgdGhlIGZvcm0gb2YgQyBsaWJyYXJpZXMuICBXaGVuCi1QeXRob24gaXMgdXNlZCwgdGhlIGxpYnJhcmllcyBhcmUgY29tcGlsZWQgaW50byBzaGFyZWQgbGlicmFyaWVzIGFuZAotZHluYW1pY2FsbHkgbG9hZGVkIGludG8gUHl0aG9uIGFzIGV4dGVuc2lvbiBtb2R1bGVzLiAgVGhlCi1mdW5jdGlvbmFsaXR5IG9mIGVhY2ggbGlicmFyeSBpcyBleHBvc2VkIGFzIGEgY29sbGVjdGlvbiBvZiBQeXRob24KLSJjb21tYW5kcy4iICBCZWNhdXNlIG9mIHRoaXMsIHRoZSBDIGFuZCBQeXRob24gcHJvZ3JhbW1pbmcKLWVudmlyb25tZW50cyBhcmUgY2xvc2VseSByZWxhdGVkLiAgSW4gbWFueSBjYXNlcywgaXQgaXMgcG9zc2libGUgdG8KLWltcGxlbWVudCB0aGUgc2FtZSBjb2RlIGluIGJvdGggQyBvciBQeXRob24uIEZvciBleGFtcGxlIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+PHByZT4KLS8qIEEgc2ltcGxlIGZ1bmN0aW9uIHdyaXR0ZW4gaW4gQyAqLwotI2luY2x1ZGUgIlNQYVNNLmgiCi12b2lkIHJ1bihpbnQgbnN0ZXBzLCBkb3VibGUgRHQsIGludCBmcmVxKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhciBmaWxlbmFtZVs2NF07Ci0gICAgZm9yIChpID0gMDsgaSA8IG5zdGVwczsgaSsrKSB7Ci0gICAgICAgICBpbnRlZ3JhdGVfYWR2X2Nvb3JkKER0KTsKLSAgICAgICAgIGJvdW5kYXJ5X3BlcmlvZGljKCk7Ci0gICAgICAgICByZWRpc3RyaWJ1dGUoKTsKLSAgICAgICAgIGZvcmNlX2VhbSgpOwotICAgICAgICAgaW50ZWdyYXRlX2Fkdl92ZWxvY2l0eShEdCk7Ci0gICAgICAgICBpZiAoKGkgJSBmcmVxKSA9PSAwKSB7Ci0gICAgICAgICAgICBzcHJpbnRmKGZpbGVuYW1lLCJEYXQlZCIsaSk7Ci0gICAgICAgICAgICBvdXRwdXRfcGFydGljbGVzKGZpbGVuYW1lKTsKLSAgICAgICAgIH0KLSAgICB9Ci19PC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotICAgICAgICAKLU5vdywgaW4gUHl0aG9uIDoKLQotPGJsb2NrcXVvdGU+PHR0PjxwcmU+Ci0jIEEgZnVuY3Rpb24gd3JpdHRlbiBpbiBQeXRob24KLWZyb20gU1BhU00gaW1wb3J0ICoKLWRlZiBydW4obnN0ZXBzLCBEdCwgZnJlcSk6Ci0gICAgZm9yIGkgaW4geHJhbmdlKDAsIG5zdGVwcyk6Ci0gICAgICAgICBpbnRlZ3JhdGVfYWR2X2Nvb3JkKER0KQotICAgICAgICAgYm91bmRhcnlfcGVyaW9kaWMoKQotICAgICAgICAgcmVkaXN0cmlidXRlKCkKLSAgICAgICAgIGZvcmNlX2VhbSgpCi0gICAgICAgICBpbnRlZ3JhdGVfYWR2X3ZlbG9jaXR5KER0KQotICAgICAgICAgaWYgKGkgJSBmcmVxKSA9PSAwKSA6Ci0gICAgICAgICAgICBvdXRwdXRfcGFydGljbGVzKCdEYXQnK3N0cihpKSkKLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotV2hpbGUgQyBsaWJyYXJpZXMgcHJvdmlkZSBtdWNoIG9mIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uYWxpdHksIHRoZSByZWFsIHBvd2VyCi1vZiB0aGUgc3lzdGVtIGNvbWVzIGluIHRoZSBmb3JtIG9mIG1vZHVsZXMgYW5kIHNjcmlwdHMgd3JpdHRlbiBlbnRpcmVseSBpbiBQeXRob24uCi1Vc2VycyB3cml0ZSBzY3JpcHRzIHRvIHNldCB1cCBhbmQgY29udHJvbCBzaW11bGF0aW9ucy4gIFNldmVyYWwgbWFqb3IKLWNvbXBvbmVudHMgc3VjaCBhcyB0aGUgdmlzdWFsaXphdGlvbiBhbmQgZGF0YS1hbmFseXNpcyBzeXN0ZW0gbWFrZSBoZWF2eQotdXNlIG9mIFB5dGhvbi4gIFdlIGFsc28gdXRpbGl6ZSBhIHZhcmlldHkgb2YgbW9kdWxlcyBpbiB0aGUgUHl0aG9uCi1saWJyYXJ5IGFuZCBoYXZlIGR5bmFtaWNhbGx5IGxvYWRhYmxlIHZlcnNpb25zIG9mIFRraW50ZXIgYW5kIHRoZQotUHl0aG9uIEltYWdpbmcgTGlicmFyeSBbMTFdLgotCi08aDI+IEVtYmVkZGluZyBQeXRob24gYW5kIEhpZGluZyBTeXN0ZW0gRGVwZW5kZW5jaWVzIDwvaDI+Ci0KLU9uZSBvZiB0aGUgYmlnZ2VzdCBpbXBsZW1lbnRhdGlvbiBwcm9ibGVtcyB3ZSBoYXZlIGVuY291bnRlcmVkIGlzIHRoZQotZmFjdCB0aGF0IHRoZSBTUGFTTSBjb2RlIGlzIGEgcGFyYWxsZWwgYXBwbGljYXRpb24gdGhhdCByZWxpZXMgaGVhdmlseQotdXBvbiB0aGUgcHJvcGVyIGltcGxlbWVudGF0aW9uIG9mIGxvdy1sZXZlbCBzeXN0ZW0gc2VydmljZXMgc3VjaCBhcwotSS9PIGFuZCBwcm9jZXNzIG1hbmFnZW1lbnQuIEN1cnJlbnRseSwgaXQgaXMgcG9zc2libGUgdG8gcnVuIHRoZSBjb2RlCi1pbiB0d28gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLS1vbmUgdGhhdCB1c2VzIG1lc3NhZ2UgcGFzc2luZyB2aWEgdGhlCi1NUEkgbGlicmFyeSBhbmQgYW5vdGhlciB1c2luZyBTb2xhcmlzIHRocmVhZHMuICBVc2luZyBQeXRob24gd2l0aAotYm90aCB2ZXJzaW9ucyBvZiBjb2RlIHJlcXVpcmVzIGEgZGVncmVlIG9mIGNhcmUtLWluIHBhcnRpY3VsYXIsIHdlCi1oYXZlIGZvdW5kIGl0IHRvIGJlIG5lY2Vzc2FyeSB0byBwcm92aWRlIFB5dGhvbiB3aXRoIGVuaGFuY2VkIEkvTwotc3VwcG9ydCB0byBydW4gcHJvcGVybHkgaW4gcGFyYWxsZWwuICBUaGlzIHdvcmsgaGFzIGJlZW4gZGVzY3JpYmVkCi1lbHNld2hlcmUgWzUsNl0uCi0KLTxwPgotSGFuZGxpbmcgdHdvIG9wZXJhdGlvbmFsIG1vZGVzIGludHJvZHVjZXMgYSBudW1iZXIgb2YgcHJvYmxlbXMgcmVsYXRlZAotdG8gY29kZSBtYWludGVuYW5jZSBhbmQgaW5zdGFsbGF0aW9uLiAgVHJhZGl0aW9uYWxseSwgd2Ugd291bGQKLXJlY29tcGlsZSB0aGUgZW50aXJlIHN5c3RlbSBhbmQgYWxsIG9mIGl0cyBtb2R1bGVzIGZvciBlYWNoCi1jb25maWd1cmF0aW9uIChwbGFjaW5nIHRoZSBmaWxlcyBpbiBhbiBhcmNoaXRlY3R1cmUgZGVwZW5kZW50Ci1zdWJkaXJlY3RvcnkpLiAgVXNlcnMgd291bGQgaGF2ZSB0byBkZWNpZGUgd2hpY2ggc3lzdGVtIHRoZXkgd2FudGVkIHRvCi11c2UgYW5kIGNvbXBpbGUgYWxsIG9mIHRoZWlyIG1vZHVsZXMgYnkgbGlua2luZyBhZ2FpbnN0IHRoZQotYXBwcm9wcmlhdGUgbGlicmFyaWVzIGFuZCBzZXR0aW5nIHRoZSByaWdodCBjb21waWxlLXRpbWUgb3B0aW9ucy4KLUNoYW5naW5nIGNvbmZpZ3VyYXRpb25zIHdvdWxkIHR5cGljYWxseSByZXF1aXJlIGEgY29tcGxldGUgcmVjb21waWxlLgotCi08cD4KLVdpdGggZHluYW1pYyBsb2FkaW5nIGFuZCBzaGFyZWQgbGlicmFyaWVzIGhvd2V2ZXIsIHdlIGhhdmUgYmVlbiBhYmxlCi10byBkZXZpc2UgYSBkaWZmZXJlbnQgYXBwcm9hY2ggdG8gdGhpcyBwcm9ibGVtLiAgUmF0aGVyCi10aGFuIHJlY29tcGlsaW5nIGV2ZXJ5dGhpbmcgZm9yIGVhY2ggY29uZmlndXJhdGlvbiwgd2UgdXNlIGFuCi1pbXBsZW1lbnRhdGlvbiBpbmRlcGVuZGVudCBsYXllciBvZiBzeXN0ZW0gd3JhcHBlcnMuICBUaGVzZSB3cmFwcGVycwotcHJvdmlkZSBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgbWVzc2FnZSBwYXNzaW5nLCBwYXJhbGxlbCBJL08sIGFuZAotdGhyZWFkIG1hbmFnZW1lbnQuICBBbGwgb2YgdGhlIGNvcmUgbW9kdWxlcyBhcmUgdGhlbiBjb21waWxlZAotdXNpbmcgdGhlc2UgZ2VuZXJpYyB3cmFwcGVycy4gICBUaGlzIG1ha2VzIHRoZSBtb2R1bGVzIGluZGVwZW5kZW50Ci1vZiB0aGUgdW5kZXJseWluZyBvcGVyYXRpb25hbCBtb2RlLS0tdG8gdXNlIE1QSSBvciB0aHJlYWRzLCAgd2Ugc2ltcGx5Ci1uZWVkIHRvIHN1cHBseSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgIHN5c3RlbSB3cmFwcGVyIGxpYnJhcmllcy4KLVRoaXMgaXMgZWFzaWx5IGFjY29tcGxpc2hlZCBieSBidWlsZGluZyB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mCi1QeXRob24gdGhhdCBhcmUgbGlua2VkIGFnYWluc3QgdGhlIGFwcHJvcHJpYXRlIHN5c3RlbSBsaWJyYXJpZXMuIAotVG8gcnVuIGluIGEgcGFydGljdWxhciBtb2RlLCB3ZSBub3cganVzdCBydW4gdGhlIGFwcHJvcHJpYXRlCi12ZXJzaW9uIG9mIFB5dGhvbiAoaS5lLiAncHl0aG9uJyBvciAncHl0aG9ubXBpJykuICBUaGUgbmVhdCAKLXBhcnQgYWJvdXQgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGFsbCBvZiB0aGUgbW9kdWxlcyB3b3JrIHdpdGggYm90aAotb3BlcmF0aW9uYWwgbW9kZXMgd2l0aG91dCBhbnkgcmVjb21waWxhdGlvbiBvciByZWNvbmZpZ3VyYXRpb24uICBJZiBhCi11c2VyIGlzIHVzaW5nIHRocmVhZHMsIGJ1dCB3YW50cyB0byBzd2l0Y2ggdG8gTVBJLCB0aGV5IHNpbXBseSBydW4KLWEgZGlmZmVyZW50IHZlcnNpb24gb2YgUHl0aG9uLS1ubyByZWNvbXBpbGF0aW9uIG9mIG1vZHVsZXMgaXMgbmVjZXNzYXJ5LgotCi08cD4KLUEgZnVsbCBkaXNjdXNzaW9uIG9mIHdyaXRpbmcgc3lzdGVtLXdyYXBwZXJzIGNhbiBiZSBmb3VuZCBlbHNld2hlcmUuCi1JbiBwYXJ0aWN1bGFyLCBhIGRpc2N1c3Npb24gb2Ygd3JpdGluZyBwYXJhbGxlbCBJL08gd3JhcHBlcnMgZm9yCi1QeXRob24gY2FuIGJlIGZvdW5kIGluIFs1XS4gIEFuIGVhcmxpZXIgZGlzY3Vzc2lvbiBvZiB0aGUgdGVjaG5pcXVlIHdlCi1oYXZlIHVzZWQgZm9yIHdyaXRpbmcgbWVzc2FnZSBwYXNzaW5nIGFuZCBJL08gd3JhcHBlcnMgY2FuIGFsc28gYmUKLWZvdW5kIGluIFs3XS4KLQotPGgyPiBNb2R1bGUgQnVpbGRpbmcgd2l0aCBTV0lHIDwvaDI+Ci0KLVRvIGJ1aWxkIG1vZHVsZXMsIHdlIGhhdmUgYmVlbiB1c2luZyBTV0lHIFs4XS4KLUVhY2ggbW9kdWxlIGlzIGRlc2NyaWJlZCBieSBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgY29udGFpbmluZyB0aGUgQU5TSQotQyBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zLCBzdHJ1Y3R1cmVzLCBhbmQgdmFyaWFibGVzIGluIHRoYXQgbW9kdWxlLgotRm9yIGV4YW1wbGUgOgotCi08YmxvY2txdW90ZT48cHJlPgotLy8gU1dJRyBpbnRlcmZhY2UgZmlsZQotJW1vZHVsZSBTUGFTTQotJXsKLSNpbmNsdWRlICJTUGFTTS5oIgotJX0KLXZvaWQgaW50ZWdyYXRlX2Fkdl9jb29yZChkb3VibGUgRHQpOwotdm9pZCBib3VuZGFyeV9wZXJpb2RpYygpOwotdm9pZCByZWRpc3RyaWJ1dGUoKTsKLXZvaWQgZm9yY2VfZWFtKCk7Ci12b2lkIGludGVncmF0ZV9hZHZfdmVsb2NpdHkoZG91YmxlIER0KTsKLWludCAgb3V0cHV0X3BhcnRpY2xlcyhjaGFyICpmaWxlbmFtZSk7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVNXSUcgcHJvdmlkZXMgYSBsb2dpY2FsIG1hcHBpbmcgb2YgdGhlIHVuZGVybHlpbmcgQyBpbXBsZW1lbnRhdGlvbiBpbnRvCi1QeXRob24uICAgRHVyaW5nIGNvbXBpbGF0aW9uLCBpbnRlcmZhY2UgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkKLWNvbnZlcnRlZCBpbnRvIHdyYXBwZXIgY29kZSBhbmQgY29tcGlsZWQgaW50byBQeXRob24gbW9kdWxlcy4gIFRoaXMgCi1wcm9jZXNzIGlzIGVudGlyZWx5IHRyYW5zcGFyZW50LS1jaGFuZ2VzIG1hZGUgdG8gdGhlIGludGVyZmFjZQotYXJlIGF1dG9tYXRpY2FsbHkgcHJvcGFnYXRlZCB0byBQeXRob24gd2hlbmV2ZXIgYSBtb2R1bGUgaXMgcmVjb21waWxlZC4KLUdpdmVuIHRoZSBjb25zdGFudGx5IGV2b2x2aW5nIG5hdHVyZSBvZiByZXNlYXJjaCBhcHBsaWNhdGlvbnMsIHRoaXMgbWFrZXMKLWl0IGVhc3kgdG8gZXh0ZW5kIGFuZCBtYWludGFpbiB0aGUgc3lzdGVtLiAgCi0KLTxoMz4gU2VwYXJhdGlvbiBvZiBJbXBsZW1lbnRhdGlvbiBhbmQgSW50ZXJmYWNlIDwvaDM+Ci0KLUFuIGltcG9ydGFudCBhc3BlY3Qgb2YgU1dJRyBpcyB0aGF0IGl0IGlzIHJlcXVpcmVzIG5vIG1vZGlmaWNhdGlvbnMgdG8KLWV4aXN0aW5nIEMgY29kZSB3aGljaCBhbGxvd3MgdXMgdG8gbWFpbnRhaW4gYSBzdHJpY3QKLXNlcGFyYXRpb24gYmV0d2VlbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgQyBtb2R1bGVzIGFuZCB0aGVpcgotUHl0aG9uIGludGVyZmFjZS4gIFdlIGJlbGlldmUgdGhhdCB0aGlzIHJlc3VsdHMgaW4gY29kZSB0aGF0Ci1pcyBtb3JlIG9yZ2FuaXplZCBhbmQgZ2VuZXJhbGx5IHJldXNhYmxlLiAgVGhlcmUgaXMgbm8gcGFydGljdWxhcgotcmVhc29uIHdoeSBhIEMgbW9kdWxlIHNob3VsZCBkZXBlbmQgb24gUHl0aG9uIChvbmUgbWlnaHQKLXdhbnQgdG8gdXNlIGl0IGFzIGEgc3RhbmQtYWxvbmUgcGFja2FnZSBvciBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbikuCi1EZXNwaXRlIHVzaW5nIFB5dGhvbiBleHRlbnNpdmVseSwgdGhlIFNQYVNNIGNvZGUgY2FuIHN0aWxsIGJlCi1jb21waWxlZCB3aXRoIG5vIFB5dGhvbiBpbnRlcmZhY2UgKG9mIGNvdXJzZSwgeW91IGxvc2UgYWxsIG9mCi10aGUgYmVuZWZpdHMgZ2FpbmVkIGJ5IGhhdmluZyBQeXRob24pLiAgCi1XZSBmZWVsIHRoYXQgbW9zdCBwaHlzaWNzIGNvZGVzIHRlbmQKLXRvIGhhdmUgYSByYXRoZXIgbG9uZyBsaWZlLXNwYW4uICBNYWludGFpbmluZyBhIHNlcGFyYXRpb24gb2YKLWltcGxlbWVudGF0aW9uIGFuZCBpbnRlcmZhY2UgaGVscHMgaW5zdXJlIHRoYXQgb3VyIHBoeXNpY3MgY29kZSB3aWxsCi1iZSB1c2FibGUgaW4gdGhlIGZ1dHVyZS0tZXZlbiBpZiB0aGVyZSBhcmUgZHJhc3RpYyBjaGFuZ2VzIGluIHRoZQotaW50ZXJmYWNlIGFsb25nIHRoZSB3YXkuCi0KLTxoMz4gUHJvdmlkaW5nIEFjY2VzcyB0byBEYXRhIFN0cnVjdHVyZXMgPC9oMz4KLQotRm9yIHRoZSBwdXJwb3NlcyBvZiBkZWJ1Z2dpbmcgYW5kIGRhdGEgZXhwbG9yYXRpb24sIHdlIGhhdmUgCi11c2VkIFNXSUcgdG8gcHJvdmlkZSB3cmFwcGVycyBhcm91bmQgQyBkYXRhIHN0cnVjdHVyZXMuICAgRm9yIGV4YW1wbGUsCi1hIGNvbGxlY3Rpb24gb2YgQyBzdHJ1Y3R1cmVzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZwotCi08YmxvY2txdW90ZT48cHJlPgotdHlwZWRlZiBzdHJ1Y3QgewotICAgICBkb3VibGUgeCx5LHo7Ci19IFZlY3RvcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICBpbnQgICAgdHlwZTsKLSAgICAgVmVjdG9yIHI7Ci0gICAgIFZlY3RvciB2OwotICAgICBWZWN0b3IgZjsKLX0gUGFydGljbGU7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLWNhbiBiZSB0dXJuZWQgaW50byBQeXRob24gd3JhcHBlciBjbGFzc2VzLiAgSW4gYWRkaXRpb24sIFNXSUcgY2FuIGV4dGVuZCBzdHJ1Y3R1cmVzIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyBhcyBmb2xsb3dzIDoKLQotPGJsb2NrcXVvdGU+IDxwcmU+Ci0vLyBTV0lHIGludGVyZmFjZSBmb3IgdmVjdG9yIGFuZCBwYXJ0aWNsZSBzdHJ1Y3R1cmVzCi0laW5jbHVkZSBkYXRhdHlwZXMuaAotCi0vLyBFeHRlbmQgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggYSBmZXcgdXNlZnVsIG1ldGhvZHMKLSVhZGRtZXRob2RzIFZlY3RvciB7Ci0gICAgIGNoYXIgKl9fc3RyX18oKSB7Ci0gICAgICAgICBzdGF0aWMgY2hhciBhWzEwMjRdOwotICAgICAgICAgc3ByaW50ZihhLCJbICUwLjEwZiwgJTAuMTBmLCAlMC4xMGYgXSIsIHNlbGYtPngsIHNlbGYtPnksIHNlbGYtPnopOwotICAgICAgICAgcmV0dXJuIGE7Ci0gICAgIH0KLX0KLSVhZGRtZXRob2RzIFBhcnRpY2xlIHsKLSAgICAgUGFydGljbGUgKl9fZ2V0aXRlbV9fKGludCBpbmRleCkgewotICAgICAgICAgIHJldHVybiBzZWxmK2luZGV4OwotICAgICB9Ci0gICAgIGNoYXIgKl9fc3RyX18oKSB7Ci0gICAgICAgICAgLy8gcHJpbnQgb3V0IGEgcGFydGljbGUKLSAgICAgICAgICAuLi4KLSAgICAgfQotfQotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLVdoZW4gdGhlIFB5dGhvbiBpbnRlcmZhY2UgaXMgYnVpbHQsIEMgc3RydWN0dXJlcyBub3cgYXBwZWFyIGxpa2UKLVB5dGhvbiBvYmplY3RzLiAgQnkgcHJvdmlkaW5nIFB5dGhvbi1zcGVjaWZpYyBtZXRob2RzIChzdWNoIGFzCi08dHQ+X19nZXRpdGVtX188L3R0Pikgd2UgY2FuIGV2ZW4gcHJvdmlkZSBhcnJheSBhY2Nlc3MuCi1Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBQeXRob24gY29kZSB3b3VsZCBwcmludCBvdXQKLWFsbCBvZiB0aGUgY29vcmRpbmF0ZXMgb2Ygc3RvcmVkIHBhcnRpY2xlcyA6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSMgUHJpbnQgb3V0IGFsbCBjb29yZGluYXRlcyB0byBhIGZpbGUKLWYgPSBvcGVuKCJwYXJ0LmRhdGEiLCJ3IikKLXAgPSBTUGFTTV9maXJzdF9wYXJ0aWNsZSgpICAgICAgICAgICMgR2V0IGZpcnN0IHBhcnRpY2xlIHBvaW50ZXIKLWZvciBpIGluIHhyYW5nZSgwLFNQYVNNX2NvdW50X3BhcnRpY2xlcygpKToKLSAgICBmLndyaXRlKCIlZiwgJWYsICVmXG4iICUgKHBbaV0uci54LCBwW2ldLnIueSwgcFtpXS5yLnopKQotZi5jbG9zZSgpCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotV2hpbGUgb25seSBhIHNpbXBsZSBleGFtcGxlLCBoYXZpbmcgZGlyZWN0IGFjY2VzcyB0byB1bmRlcmx5aW5nIGRhdGEgaGFzCi1wcm92ZW4gdG8gYmUgcXVpdGUgdmFsdWFibGUgc2luY2Ugd2UgdmlldyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gCi1vZiBkYXRhLCBjaGVjayB2YWx1ZXMsIGFuZCBwZXJmb3JtIGRpYWdub3N0aWNzLiAKLQotPGgzPiBJbXByb3ZpbmcgdGhlIFJlbGlhYmlsaXR5IG9mIE1vZHVsZXMgPC9oMz4KLQotV2hlbiBpbnN0cnVtZW50aW5nIG91ciBvcmlnaW5hbCBwaHlzaWNzIGFwcGxpY2F0aW9uIHRvIHVzZSBzY3JpcHRpbmcsCi13ZSBmb3VuZCB0aGF0IG1hbnkgcGFydHMgb2YgdGhlIGNvZGUgd2VyZSBub3Qgd3JpdHRlbiBpbiBhbiBlbnRpcmVseQotInJlbGlhYmxlIiBtYW5uZXIuICBJbiBwYXJ0aWN1bGFyLCB0aGUgY29kZSBoYWQgbmV2ZXIgYmVlbiBvcGVyYXRlZCBpbgotYW4gZXZlbnQtZHJpdmVuIG1hbm5lci4gIEZ1bmN0aW9ucyBvZnRlbiBtYWRlIGFzc3VtcHRpb25zIGFib3V0Ci1pbml0aWFsaXphdGlvbnMgYW5kIHJhcmVseSBjaGVja2VkIHRoZSB2YWxpZGl0eSBvZiBpbnB1dCBwYXJhbWV0ZXJzLgotVG8gYWRkcmVzcyB0aGVzZSBpc3N1ZXMsIG1vc3Qgc2VjdGlvbnMgb2YgY29kZSB3ZXJlIGdyYWR1YWxseSBjaGFuZ2VkCi10byBwcm92aWRlIHNvbWUga2luZCBvZiB2YWxpZGF0aW9uIG9mIGlucHV0IHZhbHVlcyBhbmQgZXJyb3IgcmVjb3ZlcnkuCi1UaGUgU1dJRyBjb21waWxlciBoYXMgYWxzbyBiZWVuIGV4dGVuZGVkIHRvIHByb3ZpZGUgc29tZSBvZiB0aGVzZQotY2FwYWJpbGl0aWVzIGFzIHdlbGwuCi08cD4KLU9uZSBvZiBQeXRob24ncyBtb3N0IHBvd2VyZnVsIGZlYXR1cmVzIGlzIGl0cyBleGNlcHRpb24gaGFuZGxpbmcgbWVjaGFuaXNtLgotRXhjZXB0aW9ucyBhcmUgZWFzaWx5IHJhaXNlZCBhbmQgaGFuZGxlZCBpbiBQeXRob24gc2NyaXB0cyBhcyBmb2xsb3dzIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSMgQSBQeXRob24gZnVuY3Rpb24gdGhhdCB0aHJvd3MgYW4gZXhjZXB0aW9uCi1kZWYgYWxsb2NhdGUobmJ5dGVzKToKLQlwdHIgPSBTUGFTTV9tYWxsb2MobmJ5dGVzKQotICAgICAgICBpZiBwdHIgPT0gIk5VTEwiOiByYWlzZSBNZW1vcnlFcnJvciwiT3V0IG9mIG1lbW9yeSEiCi0KLSMgQSBQeXRob24gZnVuY3Rpb24gdGhhdCBjYXRjaGVzIGFuIGV4Y2VwdGlvbgotZGVmIGZvbygpOgotCXRyeToKLQkJYWxsb2NhdGUoTkJZVEVTKQotCWV4Y2VwdDoKLQkJcmV0dXJuICAgICMgQmFpbGluZyBvdXQKLQotPC9ibG9ja3F1b3RlPjwvcHJlPgotCi1XZSBoYXZlIGJvcnJvd2VkIHRoaXMgaWRlYSBhbmQgaW1wbGVtZW50ZWQgYSBzaW1pbGFyIGV4Y2VwdGlvbiBoYW5kbGluZwotbWVjaGFuaXNtIGZvciBvdXIgQyBjb2RlLiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgZnVuY3Rpb25zIGluIHRoZQotPHR0PiZsdDtzZXRqbXAuaCZndDs8L3R0PiBsaWJyYXJ5IGFuZCBkZWZpbmluZyBhIGZldyBDIG1hY3JvcyBmb3IgIjx0dD5Ucnk8L3R0PiIsICI8dHQ+RXhjZXB0PC90dD4iLAotIjx0dD5UaHJvdzwvdHQ+IiwgZXRjLi4uIFVzaW5nIHRoZXNlIG1hY3JvcywgbWFueSBvZiBvdXIgbGlicmFyeSBmdW5jdGlvbnMgbm93IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8qIEEgQyBmdW5jdGlvbiB0aGF0IHRocm93cyBhbiBleGNlcHRpb24gKi8KLXZvaWQgKlNQYVNNX21hbGxvYyhzaXplX3QgbmJ5dGVzKSB7Ci0gICAgdm9pZCAqcHRyID0gKHZvaWQgKikgbWFsbG9jKG5ieXRlcyk7Ci0gICAgaWYgKCFwdHIpIFRocm93KCJTUGFTTV9tYWxsb2MgOiBPdXQgb2YgbWVtb3J5ISIpOwotICAgIHJldHVybiBwdHI7Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUxpa2UgUHl0aG9uLCB3ZSBhbGxvdyBDIGZ1bmN0aW9ucyB0bwotY2F0Y2ggZXhjZXB0aW9ucyBhbmQgcHJvdmlkZSB0aGVpciBvd24gcmVjb3ZlcnkgYXMgZm9sbG93cyA6Ci0KLTxibG9ja3F1b3RlPiA8cHJlPgotLyogQSBDIGZ1bmN0aW9uIGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiAqLwotaW50IGZvbygpIHsKLSAgICB2b2lkICpwOwotICAgIFRyeSB7Ci0gICAgICAgIHAgPSBTUGFTTV9tYWxsb2MoTkJZVEVTKTsKLSAgICB9IEV4Y2VwdCB7Ci0gICAgICAgIHByaW50ZigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeS4gUmV0dXJuaW5nIVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLUluIHRoZSBjYXNlIG9mIGEgc3RhbmQtYWxvbmUgQyBhcHBsaWNhdGlvbiwgZXhjZXB0aW9ucyBjYW4KLWJlIGNhdWdodCBhbmQgaGFuZGxlZCBpbnRlcm5hbGx5LiAgU2hvdWxkIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbgotb2NjdXIsIHRoZSBjb2RlIHByaW50cyBhbiBlcnJvciBtZXNzYWdlIGFuZCB0ZXJtaW5hdGVzLiBIb3dldmVyLAotd2hlbiBQeXRob24gaXMgdXNlZCwgd2UgY2FuIAotZ2VuZXJhdGUgUHl0aG9uIGV4Y2VwdGlvbnMgdXNpbmcgYSBTV0lHIHVzZXItZGVmaW5lZAotZXhjZXB0aW9uIGhhbmRsZXIgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDoKLQotPGJsb2NrcXVvdGU+IDxwcmU+Ci0lbW9kdWxlIFNQYVNNCi0vLyBBIFNXSUcgdXNlciBkZWZpbmVkIGV4Y2VwdGlvbiBoYW5kbGVyCi0lZXhjZXB0KHB5dGhvbikgewotICAgICBUcnkgewotICAgICAgICAgICRmdW5jdGlvbgotICAgICB9IEV4Y2VwdCB7Ci0gICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvcixTUGFTTV9lcnJvcl9tc2coKSk7Ci0gICAgIH0KLX0KLS8vIEMgZGVjbGFyYXRpb25zIAotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoZSBoYW5kbGVyIGNvZGUgZ2V0cyBwbGFjZWQgaW50byBhbGwgb2YgdGhlIFB5dGhvbgotIndyYXBwZXIiIGZ1bmN0aW9ucyBhbmQgaXMgcmVzcG9uc2libGUgZm9yIHRyYW5zbGF0aW5nIEMgZXhjZXB0aW9ucwotaW50byBQeXRob24gZXhjZXB0aW9ucy4gIERvaW5nIHRoaXMgbWFrZXMgb3VyIHBoeXNpY3MgY29kZSBvcGVyYXRlCi1pbiBhIG1vcmUgc2VhbWxlc3MgbWFubmVyIGFuZCBnaXZlcyBpdCBhIHByZWNpc2VseSBkZWZpbmVkIGVycm9yIHJlY292ZXJ5Ci1wcm9jZWR1cmUgKGkuZS4gIGludGVybmFsIGVycm9ycyBhbHdheXMgcmVzdWx0IFB5dGhvbiBleGNlcHRpb25zKS4gRm9yIGV4YW1wbGUgOgotCi08YmxvY2txdW90ZT48cHJlPgotPj4+IFNQYVNNX21hbGxvYygxMDAwMDAwMDAwKQotUnVudGltZUVycm9yOiBTUGFTTV9tYWxsb2MoMTAwMDAwMDAwMCkuIE91dCBvZiBtZW1vcnkhCi0oTGluZSA1MiBpbiBtZW1vcnkuYykKLT4+PgotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1XZSBoYXZlIGZvdW5kIGVycm9yIHJlY292ZXJ5IHRvIGJlIGNyaXRpY2FsLiAgV2l0aG91dCBpdCwgc2ltdWxhdGlvbnMgbWF5IAotY29udGludWUgdG8gcnVuLCBvbmx5IHRvIGdlbmVyYXRlIHdyb25nIGFuc3dlcnMgb3IgYSBteXN0ZXJpb3VzCi1zeXN0ZW0gY3Jhc2guICAKLQotPGgyPiBNb3JlIFRoYW4gU2NyaXB0aW5nIDwvaDI+Ci0KLVdoZW4gd2Ugb3JpZ2luYWxseSBzdGFydGVkIHVzaW5nIHNjcmlwdGluZyBsYW5ndWFnZXMsIHdlIHRob3VnaHQgCi10aGV5IHdvdWxkIG1haW5seSBiZSBhIGNvbnZlbmllbnQgbWVjaGFuaXNtIGZvciBnbHVpbmcgQyBsaWJyYXJpZXMKLXRvZ2V0aGVyIGFuZCBjb250cm9sbGluZyB0aGVtIGluIGFuIGludGVyYWN0aXZlIG1hbm5lci4gIEhvd2V2ZXIsIAotd2UgaGF2ZSBjb21lIHRvIHJlYWxpemUgdGhhdCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGFyZQotbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhpcy4gIE5vdywgd2UgZmluZCBvdXJzZWx2ZXMKLWltcGxlbWVudGluZyBzaWduaWZpY2FudCBmdW5jdGlvbmFsaXR5IGVudGlyZWx5IGluIFB5dGhvbi0tYnlwYXNzaW5nCi1DIGFsdG9nZXRoZXIuICAgVGhlIG1vc3Qgc3VycHJpc2luZyAod2VsbCwgbm90IHJlYWxseSB0aGF0IHN1cnByaXNpbmcpCi1mYWN0IGlzIHRoYXQgUHl0aG9uIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIHZlcnkgcG93ZXJmdWwgdG9vbHMgd2l0aAotb25seSBhIHNtYWxsIGFtb3VudCBvZiBleHRyYSBwcm9ncmFtbWluZy4gICBJbiB0aGlzIHNlY3Rpb24sIHdlIHByZXNlbnQKLWEgYnJpZWYgb3ZlcnZpZXcgb2Ygc29tZSBvZiB0aGUgdG9vbHMgd2UgaGF2ZSBkZXZlbG9wZWQtLW1vc3Qgb2YKLXdoaWNoIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBsYXJnZWx5IGluIFB5dGhvbi4KLQotPGgzPiBPYmplY3QtT3JpZW50ZWQgVmlzdWFsaXphdGlvbiBhbmQgRGF0YSBBbmFseXNpcyA8L2gzPgotCi1PdXIgb3JpZ2luYWwgZ29hbCB3YXMgdG8gYWRkIGEgcG93ZXJmdWwgZGF0YSBhbmFseXNpcyBhbmQKLXZpc3VhbGl6YXRpb24gY29tcG9uZW50IHRvIG91ciBhcHBsaWNhdGlvbi4gIFRvIHRoaXMgZW5kLCB3ZSBkZXZlbG9wZWQKLWEgbGlnaHR3ZWlnaHQgaGlnaC1wZXJmb3JtYW5jZSBncmFwaGljcyBsaWJyYXJ5IGltcGxlbWVudGVkIGluIEMuCi1UaGlzIGxpYnJhcnkgc3VwcG9ydHMgYm90aCAyRCBhbmQgM0QgcGxvdHRpbmcgYW5kIHByb2R1Y2VzIG91dHB1dCBpbgotdGhlIGZvcm0gb2YgR0lGIGltYWdlcy4gIFRvIG1ha2UgcGxvdHMsIGEgdXNlciB3cml0ZXMgc2ltcGxlIEMKLWZ1bmN0aW9ucyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOgotCi08YmxvY2txdW90ZT48cHJlPgotdm9pZCBwbG90X3NwaGVyZXMoUGxvdDNEICpwMywgRGF0YUZ1bmN0aW9uIGZ1bmMsIGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgsCi0gICAgICAgICAgICAgICAgICBkb3VibGUgcmFkaXVzKSB7Ci0gICAgUGFydGljbGUgKnAgPSBQYXJ0aWNsZXM7Ci0gICAgaW50ICAgICAgIGksIG5wYXJ0LCBjb2xvcjsKLSAgICBucGFydCA9IFNQYVNNX2NvdW50X3BhcnRpY2xlcygpOwotICAgIGZvciAoaSA9IDA7IGkgPCBucGFydDsgaSsrLCBwKyspIHsKLSAgICAgICAgLyogQ29tcHV0ZSBjb2xvciB2YWx1ZSAqLwotICAgICAgICB2YWx1ZSA9ICgqZnVuYykocCk7Ci0gICAgICAgIGNvbG9yID0gKHZhbHVlLW1pbikvKG1heC1taW4pKjI1NTsKLSAgICAgICAgLyogUGxvdCBpdCAqLwotICAgICAgICBQbG90M0Rfc3BoZXJlKHAzLHAtPnIueCxwLT5yLnkscC0+ci56LHJhZGl1cyxjb2xvcik7Ci0gICAgfQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2hlbiBleGVjdXRlZCwgdGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIHJhdyBpbWFnZSBzdWNoIGFzIHRoZSBmb2xsb3dpbmcKLXNob3dpbmcgc3RhY2tpbmctZmF1bHRzIGdlbmVyYXRlZCBieSBhIHBhc3Npbmcgc2hvY2sgd2F2ZSBpbiBhbiBmY2MgY3J5c3RhbAotb2YgMTAgbWlsbGlvbiBhdG9tcyA6Ci08cD4KLTxjZW50ZXI+Ci08aW1nIHNyYz0iYmlnc2hvY2tyYXcuZ2lmIj4KLTwvY2VudGVyPgotPHA+Ci1XaGlsZSBzaW1wbGUsIHdlIG9mdGVuIHdhbnQgb3VyIGltYWdlcyB0byBjb250YWluIG1vcmUgaW5mb3JtYXRpb24KLWluY2x1ZGluZyB0aXRsZXMsIGF4aXMgbGFiZWxzLCBjb2xvcmJhcnMsIHRpbWUtc3RhbXBzLCBhbmQgYm91bmRpbmcKLWJveGVzLiAgIFRvIGRvIHRoaXMsIHdlIGhhdmUgYnVpbHQgYW4gb2JqZWN0LW9yaWVudGVkIHZpc3VhbGl6YXRpb24KLWZyYW1ld29yayBpbiBQeXRob24uICAgUHl0aG9uIGNsYXNzZXMgcHJvdmlkZSBtZXRob2RzIGZvciBncmFwaCBhbm5vdGF0aW9uCi1hbmQgY29tbW9uIGdyYXBoIG9wZXJhdGlvbnMuICAgSWYgYSB1c2VyIHdhbnRzIHRvIG1ha2UgYSBuZXcga2luZCBvZiBwbG90LAotdGhleSBzaW1wbHkgaW5oZXJpdCBmcm9tIGFuIGFwcHJvcHJpYXRlIGJhc2UgY2xhc3MgYW5kIHByb3ZpZGUgYSBmdW5jdGlvbgotdG8gcGxvdCB0aGUgZGVzaXJlZCBkYXRhLiBGb3IgZXhhbXBsZSwgYSAiU3BoZXJlIiBwbG90IHVzaW5nIHRoZSBhYm92ZSBDCi1mdW5jdGlvbiB3b3VsZCBsb29rIGxpa2UgdGhpcyA6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci1jbGFzcyBTcGhlcmVzKEltYWdlM0QpOgotICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMsIG1pbiwgbWF4LCByYWRpdXM9MC41KToKLSAgICAgICAgICAgICBJbWFnZTNELl9faW5pdF9fKHNlbGYsIC4uLiAKLSAgICAgICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCi0gICAgICAgICAgICAgc2VsZi5taW4gID0gbWluCi0gICAgICAgICAgICAgc2VsZi5tYXggID0gbWF4Ci0gICAgICAgICAgICAgc2VsZi5yYWRpdXMgPSByYWRpdXMKLSAgICAgIGRlZiBkcmF3KHNlbGYpOgotICAgICAgICAgICAgIHNlbGYubmV3cGxvdCgpCi0gICAgICAgICAgICAgcGxvdF9zcGhlcmVzKHNlbGYucDMsc2VsZi5mdW5jLHNlbGYubWluLHNlbGYubWF4LHNlbGYucmFkaXVzKQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UbyB1c2UgdGhlIG5ldyBpbWFnZSwgb25lIHNpbXBseSBjcmVhdGVzIGFuIG9iamVjdCBvZiB0aGF0IHR5cGUgYW5kCi1tYW5pcHVsYXRlcyBpdC4gIEZvciBleGFtcGxlIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLT4+PiBzID0gU3BoZXJlcyhQRSwtOCwtMy41KSAgICMgQ3JlYXRlIGEgbmV3IGltYWdlCi0+Pj4gcy5yb3RkKDQ1KSAgICAgICAgICAgICAgICAjIFJvdGF0ZSBpdCBkb3duCi0+Pj4gcy56b29tKDIwMCkgICAgICAgICAgICAgICAjIFpvb20gaW4KLT4+PiBzLnNob3coKSAgICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgSW1hZ2UgYW5kIGRpc3BsYXkgaXQKLT4+PiAuLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGNlbnRlcj4KLTxpbWcgc3JjPSJiaWdzaG9jay5naWYiPgotPC9jZW50ZXI+Ci0KLTxwPgotVGh1cywgd2l0aCBhIHNpbXBsZSBDIGZ1bmN0aW9uIGFuZCBhIHNpbXBsZSBQeXRob24gY2xhc3MsIHdlIGdldCBhIGxvdAotb2YgZnVuY3Rpb25hbGl0eSBmb3IgZnJlZSwgaW5jbHVkaW5nIG1ldGhvZHMgZm9yIGltYWdlIG1hbmlwdWxhdGlvbiwKLWdyYXBoIGFubm90YXRpb24sIGFuZCBkaXNwbGF5LiAgSW4gdGhlIGN1cnJlbnQgc3lzdGVtLCB0aGVyZSBhcmUgYWJvdXQKLWEgZG96ZW4gZGlmZmVyZW50IHR5cGVzIG9mIGltYWdlcyBmb3IgMkQgYW5kIDNEIHBsb3R0aW5nLiAgSXQgaXMgYWxzbwotcG9zc2libGUgdG8gcGVyZm9ybSBmaWx0ZXJpbmcsIGFwcGx5IGNsaXBwaW5nIHBsYW5lcywgYW5kIG90aGVyCi1hZHZhbmNlZCBvcGVyYXRpb25zLiAgICBNb3N0IG9mIHRoaXMgaXMgc3VwcG9ydGVkIGJ5IGFib3V0IDIwMDAgbGluZXMgb2YKLVB5dGhvbiBjb2RlIGFuZCBhIHJlbGF0aXZlbHkgc21hbGwgQyBsaWJyYXJ5IGNvbnRhaW5pbmcgcGVyZm9ybWFuY2UKLWNyaXRpY2FsIG9wZXJhdGlvbnMuCi0KLTxoMz4gV2ViLUJhc2VkIFNpbXVsYXRpb24gTW9uaXRvcmluZyA8L2gzPgotCi1PbmUgZmVhdHVyZSBvZiBtYW55IHBoeXNpY3MgY29kZXMgaXMgdGhhdCB0aGV5IHRlbmQgdG8gcnVuIGZvciBhIGxvbmcKLXRpbWUuICBJbiBvdXIgY2FzZSwgYSBzaW11bGF0aW9uIG1heSBydW4gZm9yIHRlbnMgdG8gaHVuZHJlZHMgb2YKLWhvdXJzLiAgRHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYSBzaW11bGF0aW9uLCBpdCBpcyBkZXNpcmFibGUgdG8gY2hlY2sgb24KLWl0cyBzdGF0dXMgYW5kIHNlZSBob3cgaXQgaXMgcHJvZ3Jlc3NpbmcuICBHaXZlbiB0aGUgc3Ryb25nIEludGVybmV0Ci1zdXBwb3J0IGFscmVhZHkgYnVuZGxlZCB3aXRoIFB5dGhvbiwgd2UgZGVjaWRlZCB0byB3cml0ZSBhIHNpbXBsZQotcGh5c2ljcyB3ZWItc2VydmVyIHRoYXQgY291bGQgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLiAgVW5saWtlIGEKLW1vcmUgdHJhZGl0aW9uYWwgc2VydmVyLCBvdXIgc2VydmVyIGlzIHVzZWQgYnkgInJlZ2lzdGVyaW5nIiB2YXJpb3VzCi1vYmplY3RzIHRoYXQgb25lIHdhbnRzIHRvIGxvb2sgYXQgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYSBzaW11bGF0aW9uLgotVGhlIHNpbXVsYXRpb24gY29kZSB0aGVuIHBlcmlvZGljYWxseSBwb2xscyBhIG5ldHdvcmsgc29ja2V0IHRvIHNlZSBpZgotYW55b25lIGhhcyByZXF1ZXN0ZWQgYW55dGhpbmcuICBJZiBzbywgdGhlIHNpbXVsYXRpb24gd2lsbCBzdG9wIGZvciBhCi1tb21lbnQsIGdlbmVyYXRlIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb24sIHNlbmQgaXQgdG8gdGhlIHVzZXIsIGFuZAotdGhlbiBjb250aW51ZSBvbiB3aXRoIHRoZSBjYWxjdWxhdGlvbi4gIEEgc2ltcGxpZmllZCBleGFtcGxlIG9mIHVzaW5nCi10aGUgc2VydmVyIGlzIGFzIGZvbGxvd3MgOgotCi08YmxvY2txdW90ZT4gPHByZT4KLSMgU2ltcGxpZmllZCBzY3JpcHQgdXNpbmcgYSB3ZWItc2VydmVyCi1mcm9tIHZpcyBpbXBvcnQgKgotZnJvbSB3ZWIgaW1wb3J0ICoKLQotd2ViID0gU1BhU01XZWIoKQotd2ViLmFkZChXZWJNYWluKCIiKSkKLXdlYi5hZGQoV2ViRmlsZVRleHQoIk1zZyIrYHJ1bl9ub2ApKQotCi0jIENyZWF0ZSBhbiBpbWFnZSBvYmplY3QKLQotc2V0X2dyYXBoaWNzX21vZGUoSFRUUCkKLWtlID0gU3BoZXJlcyhLRSwwLDIwKQota2UudGl0bGUgPSAiS2luZXRpYyBFbmVyZ3kiCi13ZWIuYWRkKFdlYkltYWdlKCJrZS5naWYiLGtlKSkKLQotZGVmIHJ1bihuc3RlcHMpOgotCWZvciBpIGluIHhyYW5nZSgwLG5zdGVwcyk6Ci0JCWludGVncmF0ZSgxKSAgICAgICAgICAgIyBJbnRlZ3JhdGUgMSB0aW1lc3RlcAotICAgICAgICAgICAgICAgIHdlYi5wb2xsKCkgICAgICAgICAgICAgIyBBbnlvbmUgbG9va2luZyBmb3IgbWU/Ci0KLSMgUnVuIGl0Ci1ydW4oMTAwMDApCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVdoaWxlIHNpbXBsZSwgdGhpcyBleGFtcGxlIGdpdmVzIHRoZSBiYXNpYyBpZGVhLiBXZSBjcmVhdGUgYQotc2VydmVyIG9iamVjdCBhbmQgcmVnaXN0ZXIgYSBmZXcgImxpbmtzLiIgIFdoZW4gYSB1c2VyIGNvbm5lY3RzIHdpdGgKLXRoZSBzZXJ2ZXIsIHRoZXkgd2lsbCBiZSBwcmVzZW50ZWQgd2l0aCBzb21lIHN0YXR1cyBpbmZvcm1hdGlvbiBhbmQgYQotbGlzdCBvZiBhdmFpbGFibGUgbGlua3MuICBXaGVuIHRoZSBsaW5rcyBhcmUgYWNjZXNzZWQsIHRoZSBzZXJ2ZXIKLWZlZWRzIHJlYWwtdGltZSBkYXRhIGJhY2sgdG8gdGhlIHVzZXIuICBJbiB0aGUgY2FzZSBvZgotaW1hZ2VzLCB0aGV5IGFyZSBnZW5lcmF0ZWQgaW1tZWRpYXRlbHkgYW5kIHNlbnQgYmFjayBpbiBHSUYgZm9ybWF0LiBEdXJpbmcKLXRoaXMgcHJvY2Vzcywgbm8gdGVtcG9yYXJ5IGZpbGVzIGFyZSBjcmVhdGVkLCBub3IgaXMgdGhlIHNlcnZlcgotdHJhbnNtaXR0aW5nIHByZXZpb3VzbHkgc3RvcmVkIGluZm9ybWF0aW9uIChpLmUuIGV2ZXJ5dGhpbmcgaXMgCi1jcmVhdGVkIG9uLXRoZS1mbHkpLiAKLQotPHA+Ci1XaGlsZSB3ZSBhcmUgc3RpbGwgcmVmaW5pbmcgdGhlIGltcGxlbWVudGF0aW9uLCB0aGlzIGFwcHJvYWNoIGhhcyB0dXJuZWQKLW91dCB0byBiZSB1c2VmdWwtLW5vdCBvbmx5IGNhbiB3ZSBwZXJpb2RpY2FsbHkgY2hlY2sgdXAKLW9uIGEgcnVubmluZyBzaW11bGF0aW9uLCB0aGlzIGNhbiBjYW4gYmUgZG9uZSBmcm9tIGFueSBtYWNoaW5lIHRoYXQKLWhhcyBhIFdlYi1icm93c2VyLCBpbmNsdWRpbmcgUENzIGFuZCBNYWNzIHJ1bm5pbmcgb3ZlciBhIG1vZGVtIGxpbmUKLShhbGxvd2luZyBhIGJvcmVkIHBoeXNpY2lzdCB0byBjaGVjayBvbiBsb25nLXJ1bm5pbmcgam9icyBmcm9tIGhvbWUKLW9yIHdoaWxlIG9uIHRyYXZlbCkuICBPZiBjb3Vyc2UsIHRoZSBtb3N0IGFtYXppbmcgZmFjdCBvZiBhbGwgaXMgdGhhdAotdGhpcyB3YXMgaW1wbGVtZW50ZWQgYnkgb25lIHBlcnNvbiBpbiBhbiBhZnRlcm5vb24gYW5kIG9ubHkgaW52b2x2ZWQKLWFib3V0IDE1MCBsaW5lcyBvZiBQeXRob24gY29kZSAod2l0aCBnZW5lcm91cyBoZWxwIGZyb20gdGhlIFB5dGhvbiBsaWJyYXJ5KS4KLQotPGgzPiBEZXZlbG9wbWVudCBTdXBwb3J0IDwvaDM+Ci0KLUZpbmFsbHksIHdlIGhhdmUgZm91bmQgUHl0aG9uIHRvIGJlIHF1aXRlIHVzZWZ1bCBmb3Igc3VwcG9ydGluZwotdGhlIGZ1dHVyZSBkZXZlbG9wbWVudCBvZiBvdXIgY29kZS4gIFNvbWUgb2YgdGhpcyBjb21lcyBpbiB0aGUgZm9ybSBvZgotc29waGlzdGljYXRlZCBkZWJ1Z2dpbmctLVB5dGhvbiBjYW4gYmUgdXNlZCB0byBhbmFseXplIGludGVybmFsIGRhdGEKLXN0cnVjdHVyZXMgYW5kIHRyYWNrIGRvd24gcHJvYmxlbXMuICBTaW5jZSBQeXRob24gY2FuIHJlYWQKLWFuZCBtb2RpZnkgbW9zdCBvZiB0aGUgY29yZSBDIGRhdGEgc3RydWN0dXJlcywgaXQgaXMgcG9zc2libGUgdG8KLXByb3RvdHlwZSBuZXcgZnVuY3Rpb25zIG9yIHRvIHBlcmZvcm0gb25lLXRpbWUgb3BlcmF0aW9ucyB3aXRob3V0IGV2ZXIKLWxvYWRpbmcgdXAgdGhlIEMgY29tcGlsZXIuCi0KLTxwPgotV2UgaGF2ZSBhbHNvIHVzZWQgUHl0aG9uIGluIGNvbmp1bmN0aW9uIHdpdGggY29kZQotbWFuYWdlbWVudC4gT25lIG9mIHRoZSBuZXdlciBwcm9ibGVtcyB3ZSBoYXZlIGZhY2VkIGlzIHRoZSB0YXNrIG9mCi1maW5kaW5nIHRoZSBkZWZpbml0aW9ucyBvZiBDIGZ1bmN0aW9ucyAoZm9yIGV4YW1wbGUsIAotd2UgbWlnaHQgd2FudCB0byBrbm93IGhvdyBhIHBhcnRpY3VsYXIgY29tbWFuZCBoYXMgYmVlbgotaW1wbGVtZW50ZWQgaW4gQykuICBUbyBzdXBwb3J0IHRoaXMsIHdlIGhhdmUgd3JpdHRlbiB0b29scyBmb3IKLWJyb3dzaW5nIHNvdXJjZSBkaXJlY3RvcmllcywgZGlzcGxheWluZyBkZWZpbml0aW9ucywgYW5kIHNwYXduaW5nCi1lZGl0b3JzLiAgQWxsIG9mIHRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gUHl0aG9uIGFuZCBjYW4gYmUgcGVyZm9ybWVkCi1kaXJlY3RseSBmcm9tIHRoZSBQaHlzaWNzIGFwcGxpY2F0aW9uLiAgUHl0aG9uIGhhcyBtYWRlIHRoZXNlIGtpbmRzCi1vZiB0b29scyB2ZXJ5IGVhc3kgdG8gd3JpdGUtLW9mdGVuIG9ubHkgcmVxdWlyaW5nIGEgZmV3IGhvdXJzIG9mCi1lZmZvcnQuCi0KLTxoMj4gUHl0aG9uIGFuZCB0aGUgRGV2ZWxvcG1lbnQgb2YgU2NpZW50aWZpYyBTb2Z0d2FyZSA8L2gyPgotCi1UaGUgYWRvcHRpb24gb2YgUHl0aG9uIGhhcyBoYWQgYSBwcm9mb3VuZCBlZmZlY3Qgb24gdGhlIG92ZXJhbGwKLXN0cnVjdHVyZSBvZiBvdXIgYXBwbGljYXRpb24uICBXaXRoIHRpbWUsIHRoZSBjb2RlIGJlY2FtZSBtb3JlCi1tb2R1bGFyLCBtb3JlIHJlbGlhYmxlLCBhbmQgYmV0dGVyIG9yZ2FuaXplZC4gICAKLUZ1cnRoZXJtb3JlLCB0aGVzZSBnYWlucyBoYXZlIGJlZW4gYWNoaWV2ZWQKLXdpdGhvdXQgc2lnbmlmaWNhbnQgbG9zc2VzIGluIHBlcmZvcm1hbmNlLCBpbmNyZWFzZWQgY29kaW5nIGNvbXBsZXhpdHksCi1vciBzdWJzdGFudGlhbGx5IGluY3JlYXNlZCBkZXZlbG9wbWVudCBjb3N0LiAgIEl0IHNob3VsZCBhbHNvIGJlIHN0cmVzc2VkCi10aGF0IGF1dG9tYXRlZCB0b29scyBzdWNoIGFzIFNXSUcgaGF2ZSBwbGF5ZWQgYSBjcml0aWNhbCByb2xlIGluIHRoaXMKLWVmZm9ydCBieSBoaWRpbmcgdGhlIFB5dGhvbi1DIGludGVyZmFjZSBhbmQgYWxsb3dpbmcgdXMgdG8gY29uY2VudHJhdGUKLW9uIHRoZSByZWFsIHByb2JsZW1zIGF0IGhhbmQgKGkuZS4gcGh5c2ljcykuICAKLQotPHA+Ci1PbmUgcG9pbnQsIHRoYXQgd2Ugd291bGQgbGlrZSB0byBzdHJvbmdseSBlbXBoYXNpemUsIGlzIHRoZSBkeW5hbWljCi1uYXR1cmUgb2YgbWFueSBzY2llbnRpZmljIGFwcGxpY2F0aW9ucy4gIE91ciBhcHBsaWNhdGlvbiBpcyBub3QgYSBodWdlCi1tb25vbGl0aGljIHBhY2thZ2UgdGhhdCBuZXZlciBjaGFuZ2VzIGFuZCB3aGljaCBubyBvbmUgaXMgc3VwcG9zZWQgdG8KLW1vZGlmeS4gIFJhdGhlciwgdGhlIGNvZGUgaXMgPGVtPmNvbnN0YW50bHk8L2VtPiBjaGFuZ2luZyB0byBleHBsb3JlCi1uZXcgcHJvYmxlbXMsIHRyeSBuZXcgbnVtZXJpY2FsIG1ldGhvZHMsIG9yIHRvIHByb3ZpZGUgYmV0dGVyCi1wZXJmb3JtYW5jZS4gIFRoZSBoaWdobHkgbW9kdWxhciBuYXR1cmUgb2YgUHl0aG9uIHdvcmtzIGdyZWF0IGluCi10aGlzIGVudmlyb25tZW50LiAgV2UgcHJvdmlkZSBhIGNvbW1vbiByZXBvc2l0b3J5IG9mIG1vZHVsZXMgdGhhdCBhcmUgc2hhcmVkIGJ5IGFsbAotb2YgdGhlIHVzZXJzIG9mIHRoZSBzeXN0ZW0uICBEaWZmZXJlbnQgdXNlcnMgYXJlIHR5cGljYWxseSByZXNwb25zaWJsZQotZm9yIGRpZmZlcmVudCBtb2R1bGVzIGFuZCBhbGwgdXNlcnMgbWF5IGJlIHdvcmtpbmcgb24gZGlmZmVyZW50IG1vZHVsZXMKLWF0IHRoZSBzYW1lIHRpbWUuIAotV2hlbmV2ZXIgY2hhbmdlcyB0byBhIG1vZHVsZSBhcmUgbWFkZSwgdGhleSBhcmUgaW1tZWRpYXRlbHkgcHJvcGFnYXRlZAotdG8gZXZlcnlvbmUgZWxzZS4gIEluIHRoZSBjYXNlIG9mIGJ1Zy1maXhlcywgdGhpcyBtZWFucyB0aGF0IHBhdGNoZWQKLXZlcnNpb25zIG9mIGNvZGUgYXJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseS4gIExpa2V3aXNlLCBuZXcKLWZlYXR1cmVzIHNob3cgdXAgYXV0b21hdGljYWxseSBhbmQgY2FuIGJlIGVhc2lseSB0ZXN0ZWQgYnkgZXZlcnlvbmUuCi1BbmQgb2YgY291cnNlLCBpZiBzb21ldGhpbmcgYnJlYWtzLS1vdGhlcnMgdGVuZCB0byBub3RpY2UgYWxtb3N0IGltbWVkaWF0ZWx5Ci0od2hpY2ggd2UgZmVlbCBpcyBhIGdvb2QgdGhpbmcpLgotCi08aDI+IExpbWl0YXRpb25zIG9mIFB5dGhvbiA8L2gyPgotCi1XaGlsZSB3ZSBjb25zaWRlciBvdXIgUHl0aG9uICJleHBlcmltZW50IiB0byBiZSBoaWdobHkgc3VjY2Vzc2Z1bCwgd2UKLWhhdmUgZXhwZXJpZW5jZWQgYSBudW1iZXIgb2YgcHJvYmxlbXMgYWxvbmcgdGhlIHdheS4gIFRoZSBmaXJzdCBpcwotbWVyZWx5IGEgdGVjaG5pY2FsIGlzc3VlLS1pdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSBtZWNoYW5pc20gZm9yCi1idWlsZGluZyBzdGF0aWMgZXh0ZW5zaW9ucyB0byBQeXRob24gd2VyZSBtYWRlIGVhc2llci4gIFdoaWxlIHdlIGFyZQotY3VycmVudGx5IHVzaW5nIGR5bmFtaWMgbG9hZGluZywgbWFueSBtYWNoaW5lcywgZXNwZWNpYWxseQotc3VwZXJjb21wdXRpbmcgc3lzdGVtcywgZG8gbm90IHN1cHBvcnQgaXQuICBPbiB0aGVzZSBtYWNoaW5lcyBpdCBpcwotbmVjZXNzYXJ5IHRvIHN0YXRpY2x5IGxpbmsgZXZlcnl0aGluZy4gIExpYnJhcmllcyBoZWxwIHNpbXBsaWZ5IHRoZQotdGFzaywgYnV0IGNvbWJpbmluZyBkaWZmZXJlbnQgc3RhdGljYWxseSBsaW5rZWQgbW9kdWxlcyB0b2dldGhlciBpbnRvCi1hIHNpbmdsZSBQeXRob24gaW50ZXJwcmV0ZXIgc3RpbGwgcmVtYWlucyBtYWdpY2FsIGFuZCBzb21ld2hhdAotcHJvYmxlbWF0aWMgKGVzcGVjaWFsbHkgc2luY2Ugd2UgYXJlIGNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQKLWNoYW5nZXMgYSBsb3QtLW5vdCBtZXJlbHkgdHJ5aW5nIHRvIHBhdGNoIHRoZSBQeXRob24gY29yZSB3aXRoIGEgbmV3Ci1leHRlbnNpb24gbW9kdWxlKS4KLQotPHA+Ci1BIHNlY29uZCBwcm9ibGVtIGlzIHRoYXQgb2YgZWR1Y2F0aW9uLS13ZSBoYXZlIGZvdW5kIHRoYXQgc29tZSB1c2VycwotaGF2ZSBhIHZlcnkgZGlmZmljdWx0IHRpbWUgbWFraW5nIHNlbnNlIG9mIHRoZSBzeXN0ZW0gKGV2ZW4gd2UncmUKLXNvbWV3aGF0IGFtYXplZCB0aGF0IGl0IHJlYWxseSB3b3JrcykuCi1JbnRlcmVzdGluZ2x5IGVub3VnaCwgdGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlCi11c2Ugb2YgQyBjb2RlIG9yIFB5dGhvbiBmb3IgdGhhdCBtYXR0ZXIsIGJ1dCB0byBpc3N1ZXMgcmVsYXRlZCB0byB0aGUKLWNvbmZpZ3VyYXRpb24sIGNvbXBpbGF0aW9uLCBkZWJ1Z2dpbmcsIGFuZCBpbnN0YWxsYXRpb24gb2YgbW9kdWxlcy4gIFdoaWxlIG1vc3QKLXVzZXJzIGhhdmUgd3JpdHRlbiBwcm9ncmFtcyBiZWZvcmUsIHRoZXkgaGF2ZSBuZXZlciBkZWFsdCB3aXRoIHNoYXJlZAotbGlicmFyaWVzLCBhdXRvbWF0ZWQgY29kZSBnZW5lcmF0b3JzLCBoaWdoLWxldmVsIGxhbmd1YWdlcywgYW5kIHRoaXJkLXBhcnR5IHBhY2thZ2VzCi1zdWNoIGFzIFB5dGhvbi4gIEluIG90aGVyIGNhc2VzLCB0aGVyZSBzZWVtcyB0byBiZSBhCi0iZmVhciBvZiBhdXRvY29uZiItLWlmIGEgcHJvZ3JhbSByZXF1aXJlcyBhIGNvbmZpZ3VyZSBzY3JpcHQsIGl0IG11c3QKLWJlIHRvbyBjb21wbGljYXRlZCB0byB1bmRlcnN0YW5kICh3aGljaCBpcyBub3QgdGhlIGNhc2UKLWhlcmUpLiAgVGhlIGNvbWJpbmF0aW9uIG9mIHRoZXNlCi1mYWN0b3JzIGhhcyBsZWQgc29tZSB1c2VycyB0byBiZWxpZXZlIHRoYXQgdGhlIHN5c3RlbSBpcyBmYXIgbW9yZQotY29tcGxpY2F0ZWQgYW5kIGZyYWdpbGUgdGhhbiBpdCByZWFsbHkgaXMuICBXZSdyZSBub3Qgc3VyZSBob3cgdG8gY29tYmF0Ci10aGlzIHByb2JsZW0gb3RoZXIgdGhhbiB0byB0cnkgYW5kIGVkdWNhdGUgdGhlIHVzZXJzCi0oaS5lLiBpdCdzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGNvZGUgYXMgYmVmb3JlLCBidXQgd2l0aCBhIHJlYWxseSBjb29sCi1oYWNrKS4KLQotPGgyPiBDb25jbHVzaW9ucyBhbmQgRnV0dXJlIFdvcmsgPC9oMj4KLQotUHl0aG9uIGlzIGNvb2wgYW5kIHdlIHBsYW4gdG8ga2VlcCB1c2luZyBpdC4gSG93ZXZlciBtdWNoIHdvcmsKLXJlbWFpbnMuICBPbmUgb2YgdGhlIG1vcmUgZXhjaXRpbmcgYXNwZWN0cyBvZiBQeXRob24gaXMgaXRzIHNvbGlkCi1zdXBwb3J0IGZvciBtb2R1bGFyIHByb2dyYW1taW5nIGFuZCB0aGUgY3VsdHVyZSBvZiBjb29wZXJhdGlvbiBpbiB0aGUKLVB5dGhvbiBjb21tdW5pdHkuIFRoZXJlIGFyZSBhbHJlYWR5IG1hbnkgUHl0aG9uLXJlbGF0ZWQgc2NpZW50aWZpYwotY29tcHV0aW5nIHByb2plY3RzIHVuZGVyd2F5LiAgSWYgdGhlc2UgZWZmb3J0cyB3ZXJlIGNvb3JkaW5hdGVkIAotaW4gc29tZSBtYW5uZXIsIHdlIGZlZWwgdGhhdCB0aGUgcmVzdWx0cyBjb3VsZCBiZSBzcGVjdGFjdWxhci4KLQotPGgyPiBBY2tub3dsZWRnbWVudHMgPC9oMj4KLQotV2Ugd291bGQgbGlrZSBhY2tub3dsZWRnZSBvdXIgY29sbGFib3JhdG9ycyBCcmFkIEhvbGlhbiwgVGltIEdlcm1hbm4sIFNodWppYSBaaG91LCBhbmQgV2Fuc2h1IEh1YW5nIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeS4gIFdlIHdvdWxkIGFsc28gbGlrZQotdG8gYWNrbm93bGVkZ2UgUGF1bCBEdWJvaXMgYW5kIEJyaWFuIFlhbmcgYXQgTGF3cmVuY2UgTGl2ZXJtb3JlCi1OYXRpb25hbCBMYWJvcmF0b3J5IGZvciBtYW55IGludGVyZXN0aW5nIGNvbnZlcnNhdGlvbnMgY29uY2VybmluZyBQeXRob24KLWFuZCBpdHMgdXNlIGluIHBoeXNpY3MgYXBwbGljYXRpb25zLiAgV2Ugd291bGQgYWxzbyBsaWtlIHRvCi1hY2tub3dsZWRnZSB0aGUgU2NpZW50aWZpYyBDb21wdXRpbmcgYW5kIEltYWdpbmcgR3JvdXAgYXQgdGhlCi1Vbml2ZXJzaXR5IG9mIFV0YWggZm9yIHRoZWlyIGNvbnRpbnVlZCBzdXBwb3J0LiAgRmluYWxseSwgd2UnZCBsaWtlIHRvCi10aGFuayB0aGUgZW50aXJlIFB5dGhvbiBkZXZlbG9wbWVudCBjb21tdW5pdHkgZm9yIG1ha2luZyBhIHRydWx5Ci1hd2Vzb21lIHRvb2wgZm9yIHNvbHZpbmcgcmVhbCBwcm9ibGVtcy4gIERldmVsb3BtZW50IG9mIHRoZSBTUGFTTSBjb2RlCi1oYXMgYmVlbiBwZXJmb3JtZWQgdW5kZXIgdGhlIGF1c3BpY2VzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIERlcGFydG1lbnQKLW9mIEVuZXJneS4KLQotPGgyPiBSZWZlcmVuY2VzIDwvaDI+Ci0KLTxwPgotWzFdIEQuTS5CZWF6bGV5IGFuZCBQLlMuIExvbWRhaGwsICJNZXNzYWdlCi1QYXNzaW5nIE11bHRpLUNlbGwgTW9sZWN1bGFyIER5bmFtaWNzIG9uIHRoZSBDb25uZWN0aW9uIE1hY2hpbmUgNSwiCi1QYXJhbGxlbCBDb21wdXRpbmcgMjAgKDE5OTQpLCBwLiAxNzMtMTk1LiA8cD4KLQotPHA+Ci1bMl0gUC5TLkxvbWRhaGwsIFAuVGFtYXlvLCBOLkdyb25iZWNoLUplbnNlbiwKLWFuZCBELk0uQmVhemxleSwgIjUwIEdmbG9wcyBNb2xlY3VsYXIgRHluYW1pY3Mgb24gdGhlIENNLTUsIiBQcm9jZWVkaW5ncwotb2YgU3VwZXJjb21wdXRpbmcgOTMsIElFRUUgQ29tcHV0ZXIgU29jaWV0eSAoMTk5MyksIHAuNTIwLTUyNy4gPHA+Ci0KLTxwPgotWzNdIFMuSi5aaG91LCBELk0uIEJlYXpsZXksIFAuUy4gTG9tZGFobCwgQi5MLiBIb2xpYW4sIFBoeXNpY2FsIFJldmlldwotTGV0dGVycy4gNzgsIDQ3OSAoMTk5NykuCi0KLTxwPgotWzRdIFAuIER1Ym9pcywgSy4gSGluc2VuLCBhbmQgSi4gSHVndW5pbiwgQ29tcHV0ZXJzIGluIFBoeXNpY3MgKDEwKSwgKDE5OTYpCi1wLiAyNjItMjY3LgotCi08cD4KLVs1XSBELiBNLiBCZWF6bGV5IGFuZCBQLlMuIExvbWRhaGwsICJFeHRlbnNpYmxlIE1lc3NhZ2UgUGFzc2luZyBBcHBsaWNhdGlvbgotRGV2ZWxvcG1lbnQgYW5kIERlYnVnZ2luZyB3aXRoIFB5dGhvbiIsIFByb2NlZWRpbmdzIG9mIElQUFMnOTcsIEdlbmV2YQotU3dpdHplcmxhbmQsIElFRUUgQ29tcHV0ZXIgU29jaWV0eSAoMTk5NykuCi0KLTxwPgotWzZdIFQuLVkuQi4gWWFuZywgRC5NLiBCZWF6bGV5LCBQLiBGLiBEdWJvaXMsIEcuIEZ1cm5pc2gsICJTdGVlcmluZyBPYmplY3Qtb3JpZW50ZWQgQ29tcHV0YXRpb25zIHdpdGgKLVB5dGhvbiIsIFB5dGhvbiBXb3Jrc2hvcCA1LCBXYXNoaW5ndG9uIEQuQy4sIE5vdi4gNC01LCAxOTk2LgotCi08cD4KLVs3XSBELk0uIEJlYXpsZXkgYW5kIFAuUy4gTG9tZGFobCwgIkhpZ2gKLVBlcmZvcm1hbmNlIE1vbGVjdWxhciBEeW5hbWljcyBNb2RlbGluZyB3aXRoIFNQYVNNIDogUGVyZm9ybWFuY2UgYW5kCi1Qb3J0YWJpbGl0eSBJc3N1ZXMsIiBQcm9jZWVkaW5ncyBvZiB0aGUgV29ya3Nob3Agb24gRGVidWdnaW5nIGFuZAotVHVuaW5nIGZvciBQYXJhbGxlbCBDb21wdXRlciBTeXN0ZW1zLCBDaGF0aGFtLCBNQSwgMTk5NCAoSUVFRSBDb21wdXRlcgotU29jaWV0eSBQcmVzcywgTG9zIEFsYW1pdG9zLCBDQSwgMTk5NiksIHBwLiAzMzctMzUxLgotCi08cD4KLVs4XSBELk0uIEJlYXpsZXksICJVc2luZyBTV0lHIHRvIENvbnRyb2wsIFByb3RvdHlwZSwgYW5kIERlYnVnIEMgUHJvZ3JhbXMgd2l0aCBQeXRob24iLAotUHJvY2VlZGluZ3Mgb2YgdGhlIDR0aCBJbnRlcm5hdGlvbmFsIFB5dGhvbiBDb25mZXJlbmNlLCBMYXdyZW5jZSBMaXZlcm1vcmUgCi1OYXRpb25hbCBMYWJvcmF0b3J5LCBKdW5lIDMtNiwgMTk5Ni4gCi0KLTxwPgotWzldIEsuIEhpbnNlbiwgVGhlIE1vbGVjdWxhciBNb2RlbGluZyBUb29sa2l0LCA8dHQ+aHR0cDovL3N0YXJzaGlwLnNreXBvcnQubmV0L2NyZXcvaGluc2VuL21tdGsuaHRtbDwvdHQ+Ci0KLTxwPgotWzEwXSBKaW0gSHVndW5pbiwgTnVtZXJpYyBQeXRob24sIDx0dD5odHRwOi8vd3d3LnNscy5sY3MubWl0LmVkdS9qamgvbnVtcHk8L3R0PgotCi08cD4KLVsxMV0gRnJlZHJpayBMdW5kaCwgUHl0aG9uIEltYWdpbmcgTGlicmFyeSwgPHR0Pmh0dHA6Ly93d3cucHl0aG9uLm9yZy9zaWdzL2ltYWdlLXNpZy9JbWFnaW5nLmh0bWw8L3R0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvUHk5Ny9iaWdzaG9jay5naWYgYi9zd2lnd2ViL3BhcGVycy9QeTk3L2JpZ3Nob2NrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTgwZGU0NC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9QeTk3L2JpZ3Nob2NrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1B5OTcvYmlnc2hvY2tyYXcuZ2lmIGIvc3dpZ3dlYi9wYXBlcnMvUHk5Ny9iaWdzaG9ja3Jhdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyYmZiOTkuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvUHk5Ny9iaWdzaG9ja3Jhdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9QeVR1dG9yaWFsOTcvUHlUdXRvcmlhbDk3LnBkZiBiL3N3aWd3ZWIvcGFwZXJzL1B5VHV0b3JpYWw5Ny9QeVR1dG9yaWFsOTcucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFjNDAyLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1B5VHV0b3JpYWw5Ny9QeVR1dG9yaWFsOTcucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvUHlUdXRvcmlhbDk4L1B5VHV0b3JpYWw5OC5wZGYgYi9zd2lnd2ViL3BhcGVycy9QeVR1dG9yaWFsOTgvUHlUdXRvcmlhbDk4LnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmYTMwNS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9QeVR1dG9yaWFsOTgvUHlUdXRvcmlhbDk4LnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1RjbDk2Ly5+bmV3dGNsLmh0bWwgYi9zd2lnd2ViL3BhcGVycy9UY2w5Ni8ufm5ld3RjbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjI2NTUxLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1RjbDk2Ly5+bmV3dGNsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg0ICswLDAgQEAKLTxodG1sPgotPHRpdGxlPiBTV0lHIDogQW4gRWFzeSB0byBVc2UgVG9vbCBGb3IgSW50ZWdyYXRpbmcgU2NyaXB0aW50IExhbmd1YWdlcyAKLXdpdGggQyBhbmQgQysrIDwvdGl0bGU+Ci08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxoMT4KLVNXSUcgOiBBbiBFYXN5IHRvIFVzZSBUb29sIGZvciBJbnRlZ3JhdGluZyBTY3JpcHRpbmcgTGFuZ3VhZ2VzICB3aXRoIEMgYW5kIEMrKwotPC9oMT4KLQotPGI+IERhdmlkIE0uIEJlYXpsZXkgPC9iPiA8YnI+Ci08ZW0+IERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSA8YnI+Ci1Vbml2ZXJzaXR5IG9mIFV0YWggPGJyPgotU2FsdCBMYWtlIENpdHksIFV0YWggODQxMTIgPGJyPgotYmVhemxleUBjcy51dGFoLmVkdSA8YnI+IDwvZW0+Ci0KLTxicj4gPGJyPgotKFRvIGJlIHByZXNlbnRlZCBhdCB0aGUgNHRoIEFubnVhbCBUY2wvVGsgV29ya3Nob3AsIE1vbnRlcmV5LCBDQS4gSnVseSA2LTEwLCAxOTk2LiApCi0KLTxoMj4gQWJzdHJhY3QgPC9oMj4KLQotPGVtPgotSSBwcmVzZW50IFNXSUcgKFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciksIGEKLXByb2dyYW0gZGV2ZWxvcG1lbnQgdG9vbCB0aGF0IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIHRoZSBiaW5kaW5ncwotYmV0d2VlbiBDL0MrKyBjb2RlIGFuZCBjb21tb24gc2NyaXB0aW5nIGxhbmd1YWdlcyBpbmNsdWRpbmcKLVRjbCwgUHl0aG9uLCBQZXJsIGFuZCBHdWlsZS4gIFNXSUcgc3VwcG9ydHMgbW9zdCBDL0MrKyBkYXRhdHlwZXMKLWluY2x1ZGluZyBwb2ludGVycywgc3RydWN0dXJlcywgYW5kIGNsYXNzZXMuCi1Vbmxpa2UgbWFueSBvdGhlciBhcHByb2FjaGVzLCBTV0lHCi11c2VzIEFOU0kgQy9DKysgZGVjbGFyYXRpb25zIGFuZCByZXF1aXJlcyB0aGUgdXNlciB0byBtYWtlIHZpcnR1YWxseQotbm8gbW9kaWZpY2F0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDIGNvZGUuCi1JbiBhZGRpdGlvbiwgU1dJRyBhdXRvbWF0aWNhbGx5Ci1wcm9kdWNlcyBkb2N1bWVudGF0aW9uIGluIEhUTUwsIExhVGVYLCBvciBBU0NJSSBmb3JtYXQuCi1TV0lHIGhhcyBiZWVuIHByaW1hcmlseSBkZXNpZ25lZCBmb3Igc2NpZW50aXN0cywgZW5naW5lZXJzLCBhbmQgYXBwbGljYXRpb24KLWRldmVsb3BlcnMgd2hvIHdvdWxkIGxpa2UgdG8gdXNlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2l0aCB0aGVpciBDL0MrKyBwcm9ncmFtcwotd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCi1vZiBlYWNoIGxhbmd1YWdlIG9yIHVzaW5nIGEgY29tcGxpY2F0ZWQgc29mdHdhcmUgZGV2ZWxvcG1lbnQgdG9vbC4KLVRoaXMgcGFwZXIgY29uY2VudHJhdGVzIG9uIFNXSUcncyB1c2Ugd2l0aCBUY2wvVGsuCi08L2VtPgotCi08aDI+IDEuIEludHJvZHVjdGlvbiA8L2gyPgotU1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQotaXMgYSBzb2Z0d2FyZQotZGV2ZWxvcG1lbnQgdG9vbCB0aGF0IEkgbmV2ZXIgaW50ZW5kZWQgdG8gZGV2ZWxvcC4gICBBdCB0aGUgdGltZSwKLUkgd2FzIHRyeWluZyB0byBhZGQgYSBkYXRhIGFuYWx5c2lzIGFuZCB2aXN1YWxpemF0aW9uIGNhcGFiaWxpdHkgdG8KLWEgbW9sZWN1bGFyIGR5bmFtaWNzIChNRCkgY29kZSBJIGhhZCBoZWxwZWQgZGV2ZWxvcCBmb3IgbWFzc2l2ZWx5Ci1wYXJhbGxlbCBzdXBlcmNvbXB1dGVycyBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgW0JlYXpsZXksTG9tZGFobF0uICBJIHdhbnRlZAotdG8gcHJvdmlkZSBhIHNpbXBsZSwgeWV0IGZsZXhpYmxlIHVzZXIgaW50ZXJmYWNlIHRoYXQgY291bGQgYmUgdXNlZAotdG8gZ2x1ZSB2YXJpb3VzIGNvZGUgbW9kdWxlcyB0b2dldGhlciBhbmQgYW4gZXh0ZW5zaWJsZSBzY3JpcHRpbmcKLWxhbmd1YWdlIHNlZW1lZCBsaWtlIGFuIGlkZWFsIHNvbHV0aW9uLiBVbmZvcnR1bmF0ZWx5IHRoZXJlIHdlcmUgY29uc3RyYWludHMuCi1GaXJzdCwgSSBkaWRuJ3Qgd2FudCB0byBoYWNrIHVwIDQteWVhcnMgb2YgY29kZSBkZXZlbG9wbWVudCB0cnlpbmcgdG8KLWZpdCBvdXIgTUQgY29kZSBpbnRvIHlldCBhbm90aGVyIGludGVyZmFjZSBzY2hlbWUgKGhhdmluZyBkb25lIHNvIHNldmVyYWwKLXRpbWVzIGFscmVhZHkpLiAgU2Vjb25kbHksIHRoaXMgY29kZQotd2FzIHJvdXRpbmVseSBydW4gb24gc3lzdGVtcyByYW5naW5nIGZyb20gQ29ubmVjdGlvbiBNYWNoaW5lcyBhbmQgQ3JheXMgdG8KLXdvcmtzdGF0aW9ucyBhbmQgSSBkaWRuJ3Qgd2FudCB0byBkZXBlbmQgb24gYW55IG9uZQotaW50ZXJmYWNlIGxhbmd1YWdlLS0tb3V0IG9mIGZlYXIgdGhhdCBpdCBtaWdodCBub3QgYmUgc3VwcG9ydGVkIG9uCi1hbGwgb2YgdGhlc2UgcGxhdGZvcm1zLiAgRmluYWxseSwgdGhlIHVzZXJzIHdlcmUgY29uc3RhbnRseSBhZGRpbmcKLW5ldyBjb2RlIGFuZCBtYWtpbmcgbW9kaWZpY2F0aW9ucy4gIEkgbmVlZGVkIGEgZmxleGlibGUsIHlldCBlYXN5IHRvIHVzZQotc3lzdGVtIHRoYXQgZGlkIG5vdCBnZXQgaW4gdGhlIHdheSBvZiB0aGUgcGh5c2ljaXN0cy4gPGJyPiA8YnI+Ci0KLVNXSUcgaXMgbXkgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtLiAgU2ltcGx5IHN0YXRlZCwgU1dJRyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBhbGwKLW9mIHRoZSBjb2RlCi1uZWVkZWQgdG8gYmluZCBDL0MrKyBmdW5jdGlvbnMgd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHVzaW5nIG9ubHkKLWEgc2ltcGxlIGlucHV0IGZpbGUgY29udGFpbmluZyBDIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuCi1BdCBmaXJzdCwgSSBzdXBwb3J0ZWQKLWEgc2NyaXB0aW5nIGxhbmd1YWdlIEkgaGFkIGRldmVsb3BlZCBzcGVjaWZpY2FsbHkgZm9yIHVzZQotb24gbWFzc2l2ZWx5IHBhcmFsbGVsIHN5c3RlbXMuICBMYXRlciBJIGRlY2lkZWQgdG8gcmV3cml0ZSBTV0lHIGluIEMrKyBhbmQgZXh0ZW5kIGl0IHRvIHN1cHBvcnQKLVRjbCwgUHl0aG9uLCBQZXJsLCBHdWlsZSBhbmQgb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgaW50ZXJlc3RlZCBtZS4gICBJIGFsc28KLWFkZGVkIG1vcmUgZGF0YS10eXBlcywgc3VwcG9ydCBmb3IgcG9pbnRlcnMsIEMrKyBjbGFzc2VzLCBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24sIGFuZAotYSBmZXcgb3RoZXIgZmVhdHVyZXMuIDxicj4gPGJyPgotCi1UaGlzIHBhcGVyIHByb3ZpZGVzIGEgYnJpZWYgb3ZlcnZpZXcgb2YgU1dJRyAKLXdpdGggYSBwYXJ0aWN1bGFyIGVtcGhhc2lzIG9uIFRjbC9Uay4gSG93ZXZlciwgdGhlIHJlYWRlciBzaG91bGQKLXJlbWFpbiBhd2FyZSB0aGF0IFNXSUcgd29ya3MgZXF1YWxseSB3ZWxsIHdpdGgKLVBlcmwgYW5kIG90aGVyIGxhbmd1YWdlcy4gSXQgaXMgbm90IG15IGludGVudCB0byBwcm92aWRlCi1hIHR1dG9yaWFsIG9yIGEgdXNlcidzIGd1aWRlLCBidXQgcmF0aGVyIHRvIHNob3cKLWhvdyBTV0lHIGNhbiBiZSB1c2VkIHRvIGRvIGludGVyZXN0aW5nIHRoaW5ncyBzdWNoIGFzIAotYWRkaW5nIFRjbC9UayBpbnRlcmZhY2VzIHRvIGV4aXN0aW5nIEMgYXBwbGljYXRpb25zLCAKLXF1aWNrbHkgZGVidWdnaW5nIGFuZCBwcm90b3R5cGluZyBDIGNvZGUsCi1hbmQgYnVpbGRpbmcgaW50ZXJmYWNlLWxhbmd1YWdlLWluZGVwZW5kZW50IEMgYXBwbGljYXRpb25zLiAgIAotCi08aDI+IDIuIFRjbCBhbmQgV3JhcHBlciBGdW5jdGlvbnMgPC9oMj4KLQotSW4gb3JkZXIgdG8gYWRkIGEgbmV3IEMgb3IgQysrIGZ1bmN0aW9uIHRvIFRjbCwgaXQgaXMgbmVjZXNzYXJ5IHRvCi13cml0ZSBhIHNwZWNpYWwgYGB3cmFwcGVyJycgZnVuY3Rpb24gdGhhdCBwYXJzZXMgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotcHJlc2VudGVkIGFzIEFTQ0lJIHN0cmluZ3MgYnkgdGhlIFRjbCBpbnRlcnByZXRlciBpbnRvIGEgcmVwcmVzZW50YXRpb24KLXRoYXQgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgQyBmdW5jdGlvbi4gICAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQKLXRvIGFkZCB0aGUgZmFjdG9yaWFsIGZ1bmN0aW9uIHRvIFRjbCwgYSB3cmFwcGVyIGZ1bmN0aW9uIG1pZ2h0Ci1sb29rIGxpa2UgdGhlIGZvbGxvd2luZyA6IDxicj4KLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci1pbnQgd3JhcF9mYWN0KENsaWVudERhdGEgY2xpZW50RGF0YSwKLSAgICAgICAgICAgICAgVGNsX0ludGVycCAqaW50ZXJwLAotICAgICAgICAgICAgICBpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0gICAgaW50IHJlc3VsdDsKLSAgICBpbnQgYXJnMDsKLSAgICBpZiAoYXJnYyAhPSAyKSB7Ci0gICAgICAgIGludGVycC0+cmVzdWx0ID0gIndyb25nICMgYXJncyI7Ci0gICAgICAgIHJldHVybiBUQ0xfRVJST1I7Ci0gICAgfQotICAgIGFyZzAgPSBhdG9pKGFyZ3ZbMV0pOwotICAgIHJlc3VsdCA9IGZhY3QoYXJnMCk7Ci0gICAgc3ByaW50ZihpbnRlcnAtPnJlc3VsdCwiJWQiLHJlc3VsdCk7Ci0gICAgcmV0dXJuIFRDTF9PSzsKLX0KLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotSW4gYWRkaXRpb24gdG8gd3JpdGluZyB0aGUgd3JhcHBlciBmdW5jdGlvbiwgYSB1c2VyIHdpbGwgYWxzbyBuZWVkIHRvIAotd3JpdGUgY29kZSB0byBhZGQgdGhpcyBmdW5jdGlvbiB0byB0aGUgVGNsIGludGVycHJldGVyLiAgSW4gdGhlIGNhc2Ugb2YKLVRjbCA3LjUsIHRoaXMgY291bGQgYmUgZG9uZSBieSB3cml0aW5nIGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHRvCi1iZSBjYWxsZWQgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIGxvYWRlZCBkeW5hbWljYWxseS4gICBXaGlsZSB3cml0aW5nCi1hIHdyYXBwZXIgZnVuY3Rpb24gdXN1YWxseSBpcyBub3QgdG9vIGRpZmZpY3VsdCwgdGhlIHByb2Nlc3MgcXVpY2tseQotYmVjb21lcyB0ZWRpb3VzIGFuZCBlcnJvciBwcm9uZSBhcyB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9ucyBpbmNyZWFzZXMuCi1UaGVyZWZvcmUsIGF1dG9tYXRlZCBhcHByb2FjaGVzIGZvciBwcm9kdWNpbmcgd3JhcHBlciBmdW5jdGlvbnMgYXJlCi1hcHBlYWxpbmctLWVzcGVjaWFsbHkgd2hlbiB3b3JraW5nIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgQyBmdW5jdGlvbnMKLW9yIHdpdGggQysrIChpbiB3aGljaCBjYXNlIHRoZSB3cmFwcGVyIGNvZGUgdGVuZHMgdG8gZ2V0IG1vcmUgY29tcGxpY2F0ZWQpLgotCi08aDI+IDMuIFByaW9yIFdvcmsgPC9oMj4KLQotVGhlIGlkZWEgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0aW5nIHdyYXBwZXIgY29kZSBpcyBjZXJ0YWlubHkgbm90IG5ldy4KLVNvbWUgZWZmb3J0cyBzdWNoIGFzCi1JdGNsKyssIE9iamVjdCBUY2wsIG9yIHRoZSBYUyBsYW5ndWFnZSBpbmNsdWRlZCB3aXRoIFBlcmw1LCBwcm92aWRlIGEgbWVjaGFuaXNtIGZvcgotZ2VuZXJhdGluZyB3cmFwcGVyIGNvZGUsIGJ1dCByZXF1aXJlIHRoZSB1c2VyIHRvIHByb3ZpZGUgZGV0YWlsZWQKLXNwZWNpZmljYXRpb25zLCB0eXBlIGNvbnZlcnNpb24gcnVsZXMsIG9yIHVzZSBhIHNwZWNpYWxpemVkCi1zeW50YXggW2hlaWRyaWNoLFdldGhlcmFsbCxwZXJsNV0uICBMYXJnZSBwYWNrYWdlcwotc3VjaCBhcyB0aGUgVmlzdWFsaXphdGlvbiBUb29sa2l0ICh2dGspIG1heSB1c2UgdGhlaXIgb3duIEMvQysrIHRyYW5zbGF0b3JzLAotYnV0IHRoZXNlIGFsbW9zdCBhbHdheXMgdGVuZCB0byBiZSBzb21ld2hhdCBzcGVjaWFsIHB1cnBvc2UgKGluIGZhY3QsIFNXSUcgc3RhcnRlZAotb3V0IGluIHRoaXMgbWFubmVyKSBbdnRrXS4KLUlmIHN1cHBvcnRpbmcgbXVsdGlwbGUgbGFuZ3VhZ2VzIGlzIHRoZSB1bHRpbWF0ZSBnb2FsLCBhIHByb2dyYW1tZXIgbWlnaHQKLWNvbnNpZGVyIGEgcGFja2FnZSBzdWNoIGFzIElMVSBbSmFuc3Nlbl0uIAotVW5mb3J0dW5hdGVseSwKLXRoaXMgcmVxdWlyZXMgdGhlIHVzZXIgdG8gcHJvdmlkZSBzcGVjaWZpY2F0aW9ucyBpbiBJREwtLWEgcHJvY2VzcyB3aGljaAotaXMgdW5hcHBlYWxpbmcgdG8gbWFueSB1c2Vycy4KLVNXSUcgaXMgbm90IG5lY2Vzc2FyaWx5IGludGVuZGVkIHRvIGNvbXBldGUgd2l0aCAKLXRoZXNlIGFwcHJvYWNoZXMsIGJ1dCByYXRoZXIgaXMgZGVzaWduZWQgdG8gYmUgYSBuby1ub25zZW5zZSB0b29sIHRoYXQKLXNjaWVudGlzdHMgYW5kIGVuZ2luZWVycyBjYW4gdXNlIHRvIGVhc2lseSBhZGQgVGNsIGFuZCBvdGhlciBzY3JpcHRpbmcKLWxhbmd1YWdlcyB0byB0aGVpciBvd24gYXBwbGljYXRpb25zLiAgIFNXSUcgaXMgYWxzbyAKLXZlcnkgZGlmZmVyZW50IHRoYW4gRW1iZWRkZWQgVGsgKEVUKSB3aGljaCBhbHNvIGFpbXMgdG8KLXNpbXBsaWZ5IGNvZGUgZGV2ZWxvcG1lbnQgW0VUXS4gVW5saWtlIEVULCBTV0lHIGlzIGRlc2lnbmVkIHRvIAotaW50ZWdyYXRlIEMgZnVuY3Rpb25zIGludG8gVGNsL1RrIGFzIG9wcG9zZWQgdG8gaW50ZWdyYXRpbmcgVGNsL1RrIGludG8KLUMgcHJvZ3JhbXMuCi0KLTxoMj4gNC4gQSBRdWljayBUb3VyIG9mIFNXSUcgPC9oMj4KLQotPGgzPiA0LjEgT3JnYW5pemF0aW9uIDwvaDM+Ci0KLTxjZW50ZXI+Ci08aW1nIGFsdCA9ICJTV0lHIE9yZ2FuaXphdGlvbiIgc3JjPSJmaWcxLmdpZiI+ICA8YnI+Ci1GaWd1cmUgMSA6IFNXSUcgT3JnYW5pemF0aW9uIDxicj4gPGJyPgotPC9jZW50ZXI+Ci0KLUZpZ3VyZSAxIHNob3dzIHRoZSBzdHJ1Y3R1cmUgb2YgU1dJRy4gIEF0IHRoZSBjb3JlIGlzIGEgWUFDQyBwYXJzZXIKLWZvciByZWFkaW5nIGlucHV0IGZpbGVzIGFsb25nIHdpdGggc29tZSB1dGlsaXR5IGZ1bmN0aW9ucy4gCi1UbyBnZW5lcmF0ZSBjb2RlLAotdGhlIHBhcnNlciBjYWxscyBhYm91dCBhIGRvemVuIGZ1bmN0aW9ucyBmcm9tIGEgZ2VuZXJpYyBsYW5ndWFnZQotY2xhc3MgdG8gZG8gdGhpbmdzIGxpa2Ugd3JpdGUgYSB3cmFwcGVyIGZ1bmN0aW9uLCBsaW5rIGEKLXZhcmlhYmxlLCB3cmFwIGEgQysrIG1lbWJlciBmdW5jdGlvbiwgZXRjLi4uICBFYWNoIHRhcmdldCBsYW5ndWFnZSBpcwotaW1wbGVtZW50ZWQgYXMgYSBDKysgY2xhc3MgY29udGFpbmluZyB0aGUgZnVuY3Rpb25zIHRoYXQgZW1pdAotdGhlIHJlc3VsdGluZyBDIGNvZGUuICAgSWYgYW4gYGBlbXB0eScnIGxhbmd1YWdlIGRlZmluaXRpb24gaXMgZ2l2ZW4KLXRvIFNXSUcsIGl0IHdpbGwgcHJvZHVjZSBubyBvdXRwdXQuICAgVGh1cywgZWFjaCBsYW5ndWFnZSBjbGFzcyBjYW4KLWJlIGltcGxlbWVudGVkIGluIGFsbW9zdCBhbnkgbWFubmVyLgotVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGlzIGltcGxlbWVudGVkIGluIGEgc2ltaWxhciBtYW5uZXIgYW5kIGNhbgotY3VycmVudGx5IHByb2R1Y2UgQVNDSUksIExhVGVYLCBvciBIVE1MIG91dHB1dC4gIEFzIG91dHB1dCwKLVNXSUcgcHJvZHVjZXMgYSBDIGZpbGUgdGhhdCBzaG91bGQgYmUgY29tcGlsZWQgYW5kIGxpbmtlZCB3aXRoIHRoZSByZXN0IAotb2YgdGhlIGNvZGUgYW5kIGEgZG9jdW1lbnRhdGlvbiBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGxhdGVyIHJlZmVyZW5jZS4KLQotPGgzPiA0LjIuIEludGVyZmFjZSBGaWxlcyA8L2gzPgotCi1BcyBpbnB1dCwgU1dJRyB0YWtlcyBhIHNpbmdsZSBpbnB1dCBmaWxlIHJlZmVycmVkIHRvIGFzIGFuIGBgaW50ZXJmYWNlIGZpbGUuJycKLVRoaXMgZmlsZSBjb250YWlucyBhIGZldyBTV0lHIHNwZWNpZmljIGRpcmVjdGl2ZXMsIGJ1dCBvdGhlcndpc2UgY29udGFpbnMKLUFOU0kgQyBmdW5jdGlvbiBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLiAgIFVubGlrZSB0aGUgYXBwcm9hY2ggaW4gW0hlaWRyaWNoXSwgbm8gdHlwZSBjb252ZXJzaW9uIHJ1bGVzIGFyZSBuZWVkZWQgYW5kIGFsbCBkZWNsYXJhdGlvbnMgYXJlIG1hZGUKLXVzaW5nIGZhbWlsaWFyIEFOU0kgQy9DKysgcHJvdG90eXBlcy4gICAgVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGFuCi1pbnRlcmZhY2UgZmlsZSBmb3Igd3JhcHBpbmcgYSBmZXcgQyBmaWxlIEkvTyBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zLgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLS8qIEZpbGUgOiBmaWxlLmkgKi8KLSVtb2R1bGUgZmlsZWlvCi0lewotI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7Ci0lfQotCi1GSUxFCSpmb3BlbihjaGFyICpmaWxlbmFtZSwgY2hhciAqdHlwZSk7Ci1pbnQJIGZjbG9zZShGSUxFICpzdHJlYW0pOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90Ci1zaXplX3QJIGZyZWFkKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICBzaXplX3Qgbm9iaiwgRklMRSAqc3RyZWFtKTsKLXNpemVfdAkgZndyaXRlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgc2l6ZV90IG5vYmosRklMRSAqc3RyZWFtKTsKLXZvaWQJKm1hbGxvYyhzaXplX3QgbmJ5dGVzKTsKLXZvaWQJIGZyZWUodm9pZCAqKTsKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVRoZSA8dHQ+ICVtb2R1bGUgPC90dD4gZGlyZWN0aXZlCi1zZXRzIHRoZSBuYW1lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgb3B0aW9uYWwsIGJ1dCBpcwotcmVjb21tZW5kZWQgaWYgYnVpbGRpbmcgYSBUY2wgNy41IG1vZHVsZS4KLUV2ZXJ5dGhpbmcgaW5zaWRlIHRoZSA8dHQ+ICV7LCAlfSA8L3R0PgotYmxvY2sgaXMgY29waWVkIGRpcmVjdGx5IGludG8gdGhlIG91dHB1dCwgYWxsb3dpbmcgdGhlIGluY2x1c2lvbiBvZgotaGVhZGVyIGZpbGVzIGFuZCBhZGRpdGlvbmFsIEMgY29kZS4KLUFmdGVyd2FyZHMsIEMvQysrIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYXJlIGxpc3RlZCBpbiBhbnkKLW9yZGVyLgotQnVpbGRpbmcgYSBuZXcgVGNsIG1vZHVsZSBpcyB1c3VhbGx5IGFzIAotZWFzeSBhcyB0aGUgZm9sbG93aW5nIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci11bml4ID4gc3dpZyAtdGNsIGZpbGUuaQotdW5peCA+IGdjYyBmaWxlX3dyYXAuYyAtSS91c3IvbG9jYWwvaW5jbHVkZQotdW5peCA+IGxkIC1zaGFyZWQgZmlsZV93cmFwLm8gLW8gRmlsZWlvLnNvCi08L3ByZT4gPC90dD4gCi08L2Jsb2NrcXVvdGU+Ci0KLQotPGgzPiA0LjMuIEEgVGNsIEV4YW1wbGUgPC9oMz4KLQotTmV3bHkgYWRkZWQgZnVuY3Rpb25zIHdvcmsgbGlrZSBvcmRpbmFyeSBUY2wgcHJvY2VkdXJlcy4gIEZvcgotZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBUY2wgc2NyaXB0IGNvcGllcyBhIGZpbGUgdXNpbmcgdGhlIGJpbmFyeQotZmlsZSBJL08gZnVuY3Rpb25zIGFkZGVkIGluIHRoZSBwcmV2aW91cyBleGFtcGxlIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci1wcm9jIGZpbGVjb3B5IHtuYW1lMSBuYW1lMn0gewotICAgIHNldCBidWZmZXIgW21hbGxvYyA4MTkyXTsKLSAgICBzZXQgZjEgW2ZvcGVuICRuYW1lMSByXTsKLSAgICBzZXQgZjIgW2ZvcGVuICRuYW1lMiB3XTsKLSAgICBzZXQgbmJ5dGVzIFtmcmVhZCAkYnVmZmVyIDEgODE5MiAkZjFdOwotICAgIHdoaWxlIHskbmJ5dGVzID4gMH0gewotICAgICAgICBmd3JpdGUgJGJ1ZmZlciAxICRuYnl0ZXMgJGYyOwotICAgICAgICBzZXQgbmJ5dGVzIFtmcmVhZCAkYnVmZmVyIDEgODE5MiAkZjFdOwotICAgIH0KLSAgICBmY2xvc2UgJGYxOwotICAgIGZjbG9zZSAkZjI7Ci0gICAgZnJlZSAkYnVmZmVyCi19Ci08L3ByZT4gPC90dD4KLTwvYmxvY2txdW90ZT4KLQotPGgzPiA0LjQuIERhdGF0eXBlcyBhbmQgUG9pbnRlcnMgPC9oMz4KLQotU1dJRyBzdXBwb3J0cyB0aGUgYmFzaWMgZGF0YXR5cGVzIG9mIDx0dD4gaW50LCBzaG9ydCwKLWxvbmcsIGZsb2F0LCBkb3VibGUsIGNoYXIsIDwvdHQ+IGFuZCA8dHQ+IHZvaWQgPC90dD4KLWFzIHdlbGwgYXMgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2Vycy4gIFNXSUcKLWFsc28gYWxsb3dzIGRlcml2ZWQgdHlwZXMgc3VjaCBhcyBwb2ludGVycywgc3RydWN0dXJlcywgYW5kIGNsYXNzZXMsCi1idXQgdGhlc2UgYXJlIGFsbCBlbmNvZGVkIGFzIHBvaW50ZXJzLiAgICAKLUlmIGFuIHVua25vd24gdHlwZSBpcyBlbmNvdW50ZXJlZCwgU1dJRyBhc3N1bWVzCi10aGF0IGl0IGlzIGEgY29tcGxleCBkYXRhdHlwZSB0aGF0IGhhcyBiZWVuIGRlZmluZWQgZWFybGllci4KLU5vIGF0dGVtcHQgaXMgbWFkZSB0byBmaWd1cmUgb3V0IHdoYXQgZGF0YSB0aGF0IGRhdGF0eXBlIGFjdHVhbGx5IGNvbnRhaW5zCi1vciBob3cgaXQgc2hvdWxkIGJlIHVzZWQuICBPZiBjb3Vyc2UsIHRoaXMgdGhpcyBpcyBvbmx5IHBvc3NpYmxlCi1zaW5jZSBTV0lHJ3MgbWFwcGluZyBvZiBjb21wbGV4IHR5cGVzIGludG8gcG9pbnRlcnMgYWxsb3dzIHRoZW0KLXRvIGJlIGhhbmRsZWQgaW4gYSB1bmlmb3JtIG1hbm5lci4gCi1BcyBhIHJlc3VsdCwgU1dJRyBkb2VzIG5vdCBub3JtYWxseSBuZWVkIGFueSBzb3J0Ci1vZiB0eXBlLW1hcHBpbmcsIGJ1dCA8dHQ+IHR5cGVkZWYgPC90dD4gY2FuIGJlIHVzZWQgdG8gbWFwIGFueSBvZiB0aGUgYnVpbHQtaW4KLWRhdGF0eXBlcyB0byBuZXcgdHlwZXMgaWYgZGVzaXJlZC4gPGJyPiA8YnI+Ci0KLVNXSUcgZW5jb2RlcyBwb2ludGVycyBhcyBoZXhhZGVjaW1hbCBzdHJpbmdzIHdpdGggdHlwZS1pbmZvcm1hdGlvbi4gIFRoaXMKLXR5cGUgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIGEgcnVuLXRpbWUgdHlwZSBjaGVja2luZyBtZWNoYW5pc20uCi1UaHVzLCBhIHR5cGljYWwgU1dJRyBwb2ludGVyIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgOiA8YnI+IDxicj4KLQotPGNlbnRlcj4KLTx0dD4gXzEwMDhlNjE0X1ZlY3Rvcl9wIDwvdHQ+IDxicj4gPGJyPgotPC9jZW50ZXI+Ci0KLUlmIHRoaXMgcG9pbnRlciBpcyBwYXNzZWQgaW50byBhIGZ1bmN0aW9uIHJlcXVpcmluZyBzb21lIG90aGVyIGtpbmQgb2YKLXBvaW50ZXIsIFNXSUcgd2lsbCBnZW5lcmF0ZSBhIFRjbCBlcnJvciBhbmQgcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UuCi1UaGUgTlVMTCBwb2ludGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgIk5VTEwiLiAgIFRoZSBTV0lHIHJ1bi10aW1lCi10eXBlIGNoZWNrZXIgaXMgc2FhdnkgdG8gdHlwZWRlZnMgYW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBiYXNlIGNsYXNzZXMKLWFuZCBkZXJpdmVkIGNsYXNzZXMgaW4gQysrLiBUaHVzIGlmIGEKLXVzZXIgc3BlY2lmaWVzIDxicj4gPGJyPgotCi08Y2VudGVyPgotPHR0PiB0eXBlZGVmIGRvdWJsZSBSZWFsOyA8L3R0PiA8YnI+IDxicj4KLTwvY2VudGVyPgotCi10aGUgdHlwZSBjaGVja2VyIGtub3dzIHRoYXQgPHR0PiBSZWFsICogPC90dD4gIGFuZCA8dHQ+IGRvdWJsZSAqIDwvdHQ+Ci1hcmUgZXF1aXZhbGVudCAobW9yZSBvbiBDKysgaW4gYSBtaW51dGUpLgotRnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiBvdGhlciBUY2wgZXh0ZW5zaW9ucywKLVNXSUcgcG9pbnRlcnMgc2hvdWxkIGJlIHNlZW4gYXMgc3BlY2lhbCAiaGFuZGxlcyIgZXhjZXB0IHRoYXQgdGhleSAKLWhhcHBlbiB0byBjb250YWluIHRoZSBwb2ludGVyIHZhbHVlIGFuZCBpdHMgdHlwZS4gPGJyPiA8YnI+Ci0KLVRvIHNvbWUsIHRoaXMgYXBwcm9hY2ggbWF5IHNlZW0gaG9ycmlibHkgcmVzdHJpY3RpdmUgKG9yIGVycm9yIHByb25lKSwKLWJ1dCBrZWVwIGluIG1pbmQgdGhhdCBTV0lHIHdhcyBwcmltYXJpbHkgZGVzaWduZWQgdG8gd29yayB3aXRoCi1leGlzdGluZyBDIGFwcGxpY2F0aW9ucy4gIFNpbmNlIG1vc3QgQyBwcm9ncmFtcyBwYXNzIGNvbXBsZXggZGF0YXR5cGVzCi1hcm91bmQgYnkgcmVmZXJlbmNlIHRoaXMgdGVjaG5pcXVlIHdvcmtzIHJlbWFya2FibHkgd2VsbCBpbiBwcmFjdGljZS4KLVJ1biB0aW1lIHR5cGUtY2hlY2tpbmcgYWxzbyBlbGltaW5hdGVzIG1vc3QgY29tbW9uIGNyYXNoZXMgYnkgY2F0Y2hpbmcKLXN0dXBpZCBtaXN0YWtlcyBzdWNoIGFzIHVzaW5nIGEgd3JvbmcgdmFyaWFibGUgbmFtZSBvciBmb3JnZXR0aW5nIHRoZQotIiQiIGNoYXJhY3RlciBpbiBhIFRjbCBzY3JpcHQuICAgIFdoaWxlIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIGNyYXNoIFRjbCBieSBmb3JnaW5nIGEKLVNXSUcgcG9pbnRlciB2YWx1ZSAob3IgbWFraW5nIGEgY2FsbCB0byBidWdneSBDIGNvZGUpLCBpdCBpcyB3b3J0aAotZW1waGFzaXppbmcgdGhhdCBleGlzdGluZyBUY2wgZXh0ZW5zaW9ucwotbWF5IGFsc28gY3Jhc2ggaWYgZ2l2ZW4gYW4gaW52YWxpZCBoYW5kbGUuCi0KLTxoMz4gNC41LiBHbG9iYWwgVmFyaWFibGVzIGFuZCBDb25zdGFudHMgPC9oMz4KLQotU1dJRyBjYW4gaW5zdGFsbCBnbG9iYWwgQyB2YXJpYWJsZXMgYW5kIGNvbnN0YW50cyB1c2luZyBUY2wncyB2YXJpYWJsZSBsaW5rYWdlCi1tZWNoYW5pc20uCi1WYXJpYWJsZXMgbWF5IGFsc28gYmUgZGVjbGFyZWQgYXMgYGByZWFkIG9ubHknJyAKLXdpdGhpbiB0aGUgVGNsIGludGVycHJldGVyLiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzCi1ob3cgdmFyaWFibGVzIGFuZCBjb25zdGFudHMgY2FuIGJlIGFkZGVkIHRvIFRjbCA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotLy8gU1dJRyBmaWxlIHdpdGggdmFyaWFibGVzIGFuZCBjb25zdGFudHMKLSV7Ci0lfQotCi0vLyBTb21lIGdsb2JhbCB2YXJpYWJsZXMKLWV4dGVybiAgaW50IE15X3ZhcmlhYmxlOyAgICAgCi1leHRlcm4gIGNoYXIgKmRlZmF1bHRfcGF0aDsKLWV4dGVybiAgZG91YmxlIE15X2RvdWJsZTsKLQotLy8gU29tZSBjb25zdGFudHMKLSNkZWZpbmUgIFBJICAgICAzLjE0MTU5MjY1MzU5Ci0jZGVmaW5lICBQSV80ICAgUEkvNC4wCi1lbnVtIGNvbG9ycyB7cmVkLGJsdWUsZ3JlZW59OwotY29uc3QgaW50IFNJWkVPRl9WRUNUT1IgPSBzaXplb2YoVmVjdG9yKTsKLQotLy8gQSByZWFkIG9ubHkgdmFyaWFibGUKLSVyZWFkb25seQotZXh0ZXJuIGludCBTdGF0dXM7Ci0lcmVhZHdyaXRlCi0KLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotPGgzPiA0LjYuIEMrKyBTdXBwb3J0IDwvaDM+Ci0KLVRoZSBTV0lHIHBhcnNlciBjYW4gaGFuZGxlIHNpbXBsZSBDKysgY2xhc3MgZGVmaW5pdGlvbnMgYW5kIHN1cHBvcnRzIHB1YmxpYwotaW5oZXJpdGFuY2UsIHZpcnR1YWwgZnVuY3Rpb25zLCBzdGF0aWMgZnVuY3Rpb25zLCBjb25zdHJ1Y3RvcnMgYW5kCi1kZXN0cnVjdG9ycy4gICAgQ3VycmVudGx5LCBDKysgdHJhbnNsYXRpb24gaXMgcGVyZm9ybWVkCi1ieSBwb2xpdGVseSB0cmFuZm9ybWluZyBDKysgY29kZSBpbnRvIEMgY29kZSBhbmQgZ2VuZXJhdGluZyB3cmFwcGVycyBmb3IgdGhlCi1DIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIFNXSUcgaW50ZXJmYWNlIGZpbGUKLWNvbnRhaW5pbmcgYSBDKysgY2xhc3MgZGVmaW5pdGlvbjoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0lbW9kdWxlIHRyZWUKLSV7Ci0jaW5jbHVkZSAidHJlZS5oIgotJX0KLQotY2xhc3MgVHJlZSB7Ci1wdWJsaWM6Ci0gICBUcmVlKCk7Ci0gIH5UcmVlKCk7Ci0gICB2b2lkICBpbnNlcnQoY2hhciAqaXRlbSk7Ci0gICBpbnQgICBzZWFyY2goY2hhciAqaXRlbSk7Ci0gICBpbnQgICByZW1vdmUoY2hhciAqaXRlbSk7Ci1zdGF0aWMgdm9pZCBwcmludChUcmVlICp0KTsgICAKLX07Ci08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLVdoZW4gdHJhbnNsYXRlZCwgdGhlIGNsYXNzIHdpbGwgYmUgYWNjZXNzIHVzZWQgdGhlIGZvbGxvd2luZyBzZXQgb2YKLWZ1bmN0aW9ucyAoY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IFNXSUcpLgotCi08YmxvY2txdW90ZT4KLTx0dD4KLTxwcmU+Ci1UcmVlICpuZXdfVHJlZSgpOwotdm9pZCBkZWxldGVfVHJlZShUcmVlICp0aGlzKTsKLXZvaWQgVHJlZV9pbnNlcnQoVHJlZSAqdGhpcywgY2hhciAqaXRlbSk7Ci1pbnQgIFRyZWVfc2VhcmNoKFRyZWUgKnRoaXMsIGNoYXIgKml0ZW0pOwotaW50ICBUcmVlX3JlbW92ZShUcmVlICp0aGlzLCBjaGFyICppdGVtKTsKLXZvaWQgVHJlZV9wcmludChUcmVlICp0KTsKLTwvcHJlPgotPC90dD4KLTwvYmxvY2txdW90ZT4KLQotCi1BbGwgQysrIGZ1bmN0aW9ucyB3cmFwcGVkIGJ5IFNXSUcgZXhwbGljaXRseSByZXF1aXJlIHRoZSA8dHQ+IHRoaXMgPC90dD4gcG9pbnRlcgotYXMgc2hvd24uICBUaGlzIGFwcHJvYWNoIGhhcyB0aGUgYWR2YW50YWdlIG9mIHdvcmtpbmcgZm9yIGFsbCBvZiB0aGUgdGFyZ2V0Ci1sYW5ndWFnZXMuICBJdCBhbHNvIG1ha2VzIGl0IGVhc2llciB0byBwYXNzIG9iamVjdHMgYmV0d2Vlbgotb3RoZXIgQysrIGZ1bmN0aW9ucyBzaW5jZSBldmVyeSBDKysgb2JqZWN0IGlzIHNpbXBseSByZXByZXNlbnRlZCBhcyBhIFNXSUcgcG9pbnRlci4gICBTV0lHIGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcsIGJ1dCBvdmVybG9hZGVkIGZ1bmN0aW9ucwotY2FuIGJlIHJlc29sdmVkIGJ5IHJlbmFtaW5nIHRoZW0gd2l0aCB0aGUgU1dJRyA8dHQ+ICVuYW1lIDwvdHQ+IGRpcmVjdGl2ZSBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLWNsYXNzIExpc3QgewotcHVibGljOgotICAgICAgICAgICAgICAgTGlzdCgpOwotJW5hbWUoTGlzdE1heCkgTGlzdChpbnQgbWF4c2l6ZSk7Ci0uLi4KLX07Ci08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1UaGUgYXBwcm9hY2ggdXNlZCBieSBTV0lHIGlzCi1xdWl0ZSBkaWZmZXJlbnQgdGhhbiB0aGF0IHVzZWQgaW4gc3lzdGVtcyBzdWNoIGFzCi1PYmplY3QgVGNsIG9yIHZ0ayBbdnRrLFdldGhlcmFsbF0uICBBcyBhIHJlc3VsdCwgdXNlcnMgb2YgdGhvc2Ugc3lzdGVtcwotbWF5IGZpbmQgaXQgdG8gYmUgY29uZnVzaW5nLiAgSG93ZXZlciwKLUl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIG1vZHVsYXIgZGVzaWduIG9mCi1TV0lHIGFsbG93cyB0aGUgdXNlciB0byBjb21wbGV0ZWx5IHJlZGVmaW5lIHRoZSBvdXRwdXQgYmVoYXZpb3Igb2YKLXRoZSBzeXN0ZW0uICBUaHVzLCB3aGlsZSB0aGUgY3VycmVudCBDKysgaW1wbGVtZW50YXRpb24gaXMgcXVpdGUgZGlmZmVyZW50Ci10aGFuIG90aGVyIHN5c3RlbXMgc3VwcG9ydGluZyBDKyssIGl0IHdvdWxkIGJlIGVudGlyZWx5IHBvc3NpYmxlCi13cml0ZSBhIG5ldyBTV0lHIG1vZHVsZSB0aGF0IHdyYXBwZWQgQysrIGNsYXNzZXMgaW50byBhIHJlcHJlc2VudGF0aW9uCi1zaW1pbGFyIHRvIHRoYXQgdXNlZCBieSBPYmplY3QgVGNsIChpbiBmYWN0LCBpbiBtaWdodCBldmVuIGJlIHBvc3NpYmxlCi10byB1c2UgU1dJRyB0byBwcm9kdWNlIHRoZSBpbnB1dCBmaWxlcyB1c2VkIGZvciBPYmplY3QgVGNsKS4KLQotPGgzPiA0LjcuIE11bHRpcGxlIEZpbGVzIGFuZCBDb2RlIFJldXNlIDwvaDM+Ci0KLUFuIGVzc2VudGlhbCBmZWF0dXJlIG9mIFNXSUcgaXMgaXRzIHN1cHBvcnQgZm9yIG11bHRpcGxlIGZpbGVzCi1hbmQgbW9kdWxlcy4gICBBIFNXSUcgaW50ZXJmYWNlIGZpbGUgbWF5IGluY2x1ZGUgYW5vdGhlciBpbnRlcmZhY2UKLWZpbGUgdXNpbmcgdGhlICI8dHQ+ICVpbmNsdWRlIDwvdHQ+IiBkaXJlY3RpdmUuICAgIFRodXMsIGFuIGludGVyZmFjZQotZm9yIGEgbGFyZ2Ugc3lzdGVtIG1pZ2h0IGJlIGJyb2tlbiB1cCBpbnRvIGEgY29sbGVjdGlvbiBvZiBzbWFsbGVyCi1tb2R1bGVzIGFzIHNob3duIAotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLSVtb2R1bGUgcGFja2FnZQotJXsKLSNpbmNsdWRlICJwYWNrYWdlLmgiCi0lfQotCi0laW5jbHVkZSBnZW9tZXRyeS5pCi0laW5jbHVkZSBtZW1vcnkuaQotJWluY2x1ZGUgbmV0d29yay5pCi0laW5jbHVkZSBncmFwaGljcy5pCi0laW5jbHVkZSBwaHlzaWNzLmkKLQotJWluY2x1ZGUgd2lzaC5pCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1Db21tb24gb3BlcmF0aW9ucyBjYW4gYmUgcGxhY2VkIGludG8gYSBTV0lHIGxpYnJhcnkgZm9yIHVzZSBpbgotYWxsIGFwcGxpY2F0aW9ucy4gIEZvciBleGFtcGxlLCB0aGUgPHR0PiAlaW5jbHVkZSB3aXNoLmkgPC90dD4gZGlyZWN0aXZlCi10ZWxscyBTV0lHIHRvIGluY2x1ZGUgY29kZSBmb3IgdGhlIDx0dD4gVGNsX0FwcEluaXQoKSA8L3R0PiBmdW5jdGlvbgotbmVlZGVkIHRvIHJlYnVpbGQgdGhlIDx0dD4gd2lzaCA8L3R0PiBwcm9ncmFtLiAgVGhlIGxpYnJhcnkgY2FuIGFsc28gYmUKLXVzZWQgdG8gYnVpbGQgbW9kdWxlcwotYWxsb3dpbmcgU1dJRyB0byBiZSB1c2VkIHdpdGggY29tbW9uIFRjbCBleHRlbnNpb25zIHN1Y2gKLWFzIEV4cGVjdCBbRXhwZWN0XS4gT2YgY291cnNlLCB0aGUgcHJpbWFyeSB1c2Ugb2YgdGhlIGxpYnJhcnkgaXMgd2l0aAotbGFyZ2UgYXBwbGljYXRpb25zIHN1Y2ggYXMgT3Blbi1JbnZlbnRvciB3aGljaCBjb250YWluIGh1bmRyZWRzIG9mCi1tb2R1bGVzIGFuZCBhIHN1YnN0YW50aWFsIGNsYXNzIGhpZXJhcmNoeSBbSW52ZW50XS4gICBJbiB0aGlzIGNhc2UgYSB1c2VyCi1jb3VsZCB1c2UgU1dJRydzIGluY2x1ZGUgbWVjaGFuaXNtIHRvIHNlbGVjdGl2ZWx5IHBpY2sgd2hpY2ggbW9kdWxlcwotdGhleSB3YW50ZWQgdG8gdXNlIGZvciBhIHBhcnRpY3VsYXIgcHJvYmxlbS4KLQotPGgzPiA0LjguIFRoZSBEb2N1bWVudGF0aW9uIFN5c3RlbSA8L2gzPgotCi1TV0lHIHByb2R1Y2VzIGRvY3VtZW50YXRpb24gaW4gQVNDSUksIExhVGVYLCBvciBIVE1MCi1mb3JtYXQgZGVzY3JpYmluZyBldmVyeXRoaW5nIHRoYXQgd2FzIHdyYXBwZWQuICBUaGUgZG9jdW1lbnRhdGlvbgotZm9sbG93cyB0aGUgc3ludGF4IHJ1bGVzIG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgYW5kIGNhbgotY2FuIGJlIGZ1cnRoZXIgZW5oYW5jZWQgYnkgYWRkaW5nIGRlc2NyaXB0aW9ucyBpbiBhIEMvQysrIGNvbW1lbnQKLWltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIGRlY2xhcmF0aW9uLiAgVGhlc2UgY29tbWVudHMgbWF5IGFsc28gY29udGFpbgotZW1iZWRkZWQgTGFUZVggb3IgSFRNTCBjb21tYW5kcy4gIEZvciBleGFtcGxlOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLWV4dGVybiBzaXplX3QgZnJlYWQodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBzaXplX3Qgbm9iaiwgRklMRSAqc3RyZWFtKTsKLS8qIHtcdHQgZnJlYWR9IHJlYWRzIGZyb20ge1x0dCBzdHJlYW19IGludG8KLXRoZSBhcnJheSB7XHR0IHB0cn0gYXQgbW9zdCB7XHR0IG5vYmp9IG9iamVjdHMKLW9mIHNpemUge1x0dCBzaXplfS4gICB7XHR0IGZyZWFkfSByZXR1cm5zCi10aGUgbnVtYmVyIG9mIG9iamVjdHMgcmVhZC4gKi8KLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVdoZW4gb3V0cHV0IGJ5IFNXSUcgYW5kIHByb2Nlc3NlZCBieSBMYVRlWCwgdGhpcyBhcHBlYXJzIGFzIGZvbGxvd3MgOgotCi08dWw+Ci08dHQ+IHNpemVfdCA6IGZyZWFkIHB0ciBzaXplIG5vYmogc3RyZWFtIDwvdHQ+IDxicj4KLTx1bD4KLSAgICAgPHR0PiBmcmVhZCA8L3R0PiByZWFkcyBmcm9tIDx0dD4gc3RyZWFtIDwvdHQ+IGludG8gdGhlIGFycmF5IDx0dD4gcHRyIDwvdHQ+IGF0Ci0gICAgIG1vc3QgPHR0PiBub2JqIDwvdHQ+IG9iamVjdHMgb2Ygc2l6ZSA8dHQ+IHNpemUgPC90dD4uICA8dHQ+IGZyZWFkIDwvdHQ+IAotICAgIHJldHVybnMKLSAgICAgdGhlIG51bWJlciBvZiBvYmplY3RzIHJlYWQuIAotPC91bD4KLTwvdWw+Ci0KLTxoMz4gNC45LiBFeHRlbmRpbmcgdGhlIFNXSUcgU3lzdGVtIDwvaDM+Ci0KLUZpbmFsbHksIFNXSUcgaXRzZWxmIGNhbiBiZSBleHRlbmRlZCBieSB0aGUgdXNlciB0byBwcm92aWRlIG5ldwotZnVuY3Rpb25hbGl0eS4gICAgVGhpcyBpcyBkb25lIGJ5IG1vZGlmeWluZyBhbiBleGlzdGluZyBvciBjcmVhdGluZyBhCi1uZXcgbGFuZ3VhZ2UgY2xhc3MuICAgQSB0eXBpY2FsIGNsYXNzIG11c3Qgc3BlY2lmeSB0aGUgZm9sbG93aW5nCi1mdW5jdGlvbnMgdGhhdCBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBwYXJzZXIgb3V0cHV0IDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0vLyBGaWxlIDogc3dpZ3RjbC5oCi1jbGFzcyBUQ0wgOiBwdWJsaWMgTGFuZ3VhZ2UgewotcHJpdmF0ZToKLSAgLy8gUHV0IHByaXZhdGUgc3R1ZmYgaGVyZQotcHVibGljIDoKLSAgVENMKCk7Ci0gIGludCBtYWluKGludCwgY2hhciAqYXJndltdKTsKLSAgdm9pZCBjcmVhdGVfZnVuY3Rpb24oY2hhciAqLGNoYXIgKixEYXRhVHlwZSosCi0gICAgICAgICAgICAgICAgICAgICAgIFBhcm1MaXN0ICopOwotICB2b2lkIGxpbmtfdmFyaWFibGUoY2hhciAqLGNoYXIgKixEYXRhVHlwZSAqKTsKLSAgdm9pZCBkZWNsYXJlX2NvbnN0KGNoYXIgKixpbnQsY2hhciAqKTsKLSAgdm9pZCBpbml0aWFsaXplKHZvaWQpOwotICB2b2lkIGhlYWRlcnModm9pZCk7Ci0gIHZvaWQgY2xvc2Uodm9pZCk7Ci0gIHZvaWQgdXNhZ2VfdmFyKGNoYXIgKixEYXRhVHlwZSosY2hhciAqKik7Ci0gIHZvaWQgdXNhZ2VfZnVuYyhjaGFyICosRGF0YVR5cGUqLFBhcm1MaXN0KiwKLSAgICAgICAgICAgICAgICAgIGNoYXIgKiopOwotICB2b2lkIHVzYWdlX2NvbnN0KGNoYXIgKixpbnQsY2hhciosY2hhcioqKTsKLSAgdm9pZCBzZXRfbW9kdWxlKGNoYXIgKik7Ci0gIHZvaWQgc2V0X2luaXQoY2hhciAqKTsKLX07Ci08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1EZXNjcmlwdGlvbnMgb2YgdGhlc2UgZnVuY3Rpb25zIGNhbiBiZSBmb3VuZCBpbiB0aGUgU1dJRwotdXNlcnMgbWFudWFsLiAgIFRvIGJ1aWxkIGEgbmV3IHZlcnNpb24gb2YgU1dJRywgdGhlIHVzZXIKLW9ubHkgbmVlZHMgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYW5kIGEgbWFpbgotcHJvZ3JhbSB3aGljaCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0KLS8vIFNXSUcgbWFpbiBwcm9ncmFtCi0KLSNpbmNsdWRlICJzd2lnLmgiCi0jaW5jbHVkZSAic3dpZ3RjbC5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLQotICBMYW5ndWFnZSAqbGFuZzsKLQotICBsYW5nID0gbmV3IFRDTDsKLSAgU1dJR19tYWluKGFyZ2MsYXJndixsYW5nLChEb2N1bWVudGF0aW9uICopIDApOwotCi19Ci08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1XaGVuIGxpbmtlZCB3aXRoIGEgbGlicmFyeSBmaWxlLCBhbnkgZXh0ZW5zaW9ucyBhbmQKLW1vZGlmaWNhdGlvbnMgY2FuIG5vdyBiZSB1c2VkIHdpdGggdGhlIFNXSUcgcGFyc2VyLiAgV2hpbGUKLXdyaXRpbmcgYSBuZXcgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBpcyBub3QgZW50aXJlbHkgdHJpdmlhbCwKLWl0IGNhbiB1c3VhbGx5IGJlIGRvbmUgYnkganVzdCBjb3B5aW5nIG9uZSBvZiB0aGUgZXhpc3RpbmcKLW1vZHVsZXMgYW5kIG1vZGlmeWluZyBpdCBhcHByb3ByaWF0ZWx5LiAgIAotCi08aDI+IDUuIEV4YW1wbGVzIDwvaDI+Ci0KLTxoMz4gNS4xLiBBIEMtVGNsIExpbmtlZCBMaXN0IDwvaDM+Ci0KLVNXSUcgY2FuIGJlIHVzZWQgdG8gYnVpbGQgc2ltcGxlIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZSB1c3VhYmxlIGluIAotYm90aCBDIGFuZCBUY2wuICAgVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGEgU1dJRyBpbnRlcmZhY2UgZmlsZSBmb3IKLWJ1aWxkaW5nIGEgc2ltcGxlIGxpbmtlZCBsaXN0LgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLS8qIEZpbGUgOiBsaXN0LmkgKi8KLSV7Ci1zdHJ1Y3QgTm9kZSB7Ci0gIE5vZGUoY2hhciAqbikgewotICAgIG5hbWUgPSBuZXcgY2hhcltzdHJsZW4obikrMV07Ci0gICAgc3RyY3B5KG5hbWUsbik7Ci0gICAgbmV4dCA9IDA7Ci0gIH07Ci0gIGNoYXIgICpuYW1lOwotICBOb2RlICpuZXh0OwotfTsKLSV9Ci0KLS8vIEp1c3QgYWRkIHN0cnVjdCBkZWZpbml0aW9uIHRvCi0vLyB0aGUgaW50ZXJmYWNlIGZpbGUuCi0KLXN0cnVjdCBOb2RlIHsKLSAgTm9kZShjaGFyICopOwotICBjaGFyICpuYW1lOwotICBOb2RlICpuZXh0OwotfTsKLQotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotV2hlbiB1c2VkIGluIGEgVGNsIHNjcmlwdCwgd2UgY2FuIG5vdyBjcmVhdGUgbmV3IG5vZGVzIGFuZCBhY2Nlc3MKLWluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgPHR0PiBOb2RlIDwvdHQ+IHN0cnVjdHVyZS4gICBJbiBmYWN0LCB3ZSBjYW4KLXdyaXRlIGNvZGUgdG8gY29udmVydCBiZXR3ZWVuIFRjbCBsaXN0cyBhbmQgbGlua2VkIGxpc3RzIGVudGlyZWx5Ci1pbiBUY2wgYXMgc2hvd24gOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLSMgQnVpbGRzIGxpbmtlZCBsaXN0IGZyb20gYSBUY2wgbGlzdAotcHJvYyBidWlsZGxpc3Qge2xpc3QgaGVhZH0gewotICAgIHNldCBuaXRlbXMgW2xsZW5ndGggJGxpc3RdOwotICAgIGZvciB7c2V0IGkgMH0geyRpICZsdDsgJG5pdGVtc30ge2luY3IgaSAtMX0gewotICAgICAgICBzZXQgaXRlbSBbbHJhbmdlICRsaXN0ICRpICRpXSAKLSAgICAgICAgc2V0IG4gW25ld19Ob2RlICRpdGVtXSAgICAgICAgCi0gICAgICAgIE5vZGVfc2V0X25leHQgJG4gJGhlYWQgICAgICAgIAotICAgICAgICBzZXQgaGVhZCAkbiAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuICRoZWFkCi19Ci0jIEJ1aWxkcyBhIFRjbCBsaXN0IGZyb20gYSBsaW5rZWQgbGlzdAotcHJvYyBnZXRfbGlzdCB7bGxpc3R9IHsKLSAgICBzZXQgbGlzdCB7fSAKLSAgICB3aGlsZSB7JGxsaXN0ICE9ICJOVUxMIn0gewotICAgICAgICBsYXBwZW5kIGxpc3QgW05vZGVfbmFtZV9nZXQgJGxsaXN0XQotICAgICAgICBzZXQgbGxpc3QgW05vZGVfZ2V0X25leHQgJGxsaXN0XSAgIAotICAgIH0KLSAgICByZXR1cm4gJGxpc3QgICAgICAgICAgICAgICAgICAgICAgCi19Ci08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1XaGVuIHJ1biBpbnRlcmFjdGl2ZWx5LCB3ZSBjb3VsZCBub3cgdXNlIG91ciBUY2wgZnVuY3Rpb25zIGFzCi1mb2xsb3dzLgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLSUgc2V0IGwge0pvaG4gQW5uZSBNYXJ5IEppbX0KLUpvaG4gQW5uZSBNYXJ5IEppbQotJSBzZXQgbGwgW2J1aWxkbGlzdCAkbCBfMF9Ob2RlX3BdICAgICAgICAgICAKLV8xMDAwY2FiOF9Ob2RlX3AKLSUgZ2V0X2xpc3QgJGxsCi1KaW0gTWFyeSBBbm5lIEpvaG4KLSUgc2V0IGxsIFtidWlsZGxpc3Qge01pa2UgUGV0ZXIgRGF2ZX0gJGxsXQotXzEwMDBjYzM4X05vZGVfcAotJSBnZXRfbGlzdCAkbGwKLURhdmUgUGV0ZXIgTWlrZSBKaW0gTWFyeSBBbm5lIEpvaG4KLSUgCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotQXNpZGUgZnJvbSB0aGUgcG9pbnRlciB2YWx1ZXMsIG91ciBzY3JpcHQgYWN0cyBsaWtlIGFueSBvdGhlcgotVGNsIHNjcmlwdC4gICBIb3dldmVyLCB3ZSBoYXZlIGJ1aWx0IHVwIGEgcmVhbAotQyBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvdWxkIGJlIGVhc2lseSBwYXNzZWQgdG8gb3RoZXIgQyBmdW5jdGlvbnMKLWlmIG5lZWRlZC4KLQotPGgzPiA1LjIuIFVzaW5nIEMgRGF0YS1TdHJ1Y3R1cmVzIHdpdGggVGsgPC9oMz4KLQotSW4gbWFubmVyIHNpbWlsYXIgdG8gdGhlIGxpbmtlZCBsaXN0IGV4YW1wbGUsIFRjbC9UayBjYW4gYmUgdXNlZAotdG8gYnVpbGQgY29tcGxleCBDL0MrKyBkYXRhIHN0cnVjdHVyZXMuICAgRm9yIGV4YW1wbGUsIHN1cHBvc2Ugd2UKLXdhbnRlZCB0byBpbnRlcmFjdGl2ZWx5IGJ1aWxkIGEgZ3JhcGggb2YgYGBOb2RlcycnIGZvciB1c2UgaW4gYSBDCi1hcHBsaWNhdGlvbi4KLUEgdHlwaWNhbCBpbnRlcmZhY2UgZmlsZSBtaWdodCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotJXsKLSNpbmNsdWRlICJub2Rlcy5oIgotJX0KLQotJWluY2x1ZGUgd2lzaAotZXh0ZXJuIE5vZGUgKm5ld19ub2RlKCk7ICAgICAgICAgICAgICAgICAKLWV4dGVybiB2b2lkIEFkZEVkZ2UoTm9kZSAqbjEsIE5vZGUgKm4yKTsgCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1XaXRoaW4gYSBUY2wvVGsgc2NyaXB0LCBsb29zZWx5IGJhc2VkIG9uIG9uZSB0byBtYWtlIGJhbGwgYW5kIHN0aWNrIGdyYXBocwotaW4gW091c3RlcmhvdXRdLCBhIGdyYXBoIGNvdWxkIGJlIGJ1aWx0IGFzIGZvbGxvd3M6Ci0KLTxibG9ja3F1b3RlPiA8dHQ+IDxwcmU+Ci1wcm9jIG1ha2VOb2RlIHt4IHl9IHsKLSAgIGdsb2JhbCBub2RlWCBub2RlWSBub2RlUCBlZGdlRmlyc3QgZWRnZVNlY29uZAotICAgc2V0IG5ldyBbLmNyZWF0ZSBvdmFsIFtleHByICR4LTE1XSBcCi0gICAgICAgICAgIFtleHByICR5LTE1XSBbZXhwciAkeCsxNV0gXAotICAgICAgICAgICBbZXhwciAkeSsxNV0gLW91dGxpbmUgYmxhY2sgXAotICAgICAgICAgICAtZmlsbCB3aGl0ZSAtdGFncyBub2RlXQotICAgc2V0IG5ld25vZGUgW25ld19ub2RlXSAgICAgICAgICAgCi0gICBzZXQgbm9kZVgoJG5ldykgJHgKLSAgIHNldCBub2RlWSgkbmV3KSAkeQotICAgc2V0IG5vZGVQKCRuZXcpICRuZXdub2RlICAgICAgICAgCi0gICBzZXQgZWRnZUZpcnN0KCRuZXcpIHt9Ci0gICBzZXQgZWRnZVNlY29uZCgkbmV3KSB7fQotfQotcHJvYyBtYWtlRWRnZSB7Zmlyc3Qgc2Vjb25kfSB7Ci0gICBnbG9iYWwgbm9kZVggbm9kZVkgbm9kZVAgZWRnZUZpcnN0IGVkZ2VTZWNvbmQKLSAgIHNldCB4MSAkbm9kZVgoJGZpcnN0KTsgIHNldCB5MSAkbm9kZVkoJGZpcnN0KQotICAgc2V0IHgyICRub2RlWCgkc2Vjb25kKTsgc2V0IHkyICRub2RlWSgkc2Vjb25kKQotICAgc2V0IGVkZ2UgWy5jIGNyZWF0ZSBsaW5lICR4MSAkeTEgJHgyICR5MiBcCi0gICAgICAgICAgICAgIC10YWdzIGVkZ2V9Ci0gICAuYyBsb3dlciBlZGdlCi0gICBsYXBwZW5kIGVkZ2VGaXJzdCgkZmlyc3QpICRlZGdlCi0gICBsYXBwZW5kIGVkZ2VTZWNvbmQoJGZpcnN0KSAkZWRnZQotICAgQWRkRWRnZSAkbm9kZVAoJGZpcnN0KSAkbm9kZVAoJHNlY29uZCkKLX0KLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVRoZXNlIGZ1bmN0aW9ucyBjcmVhdGUKLVRrIGNhbnZhcyBpdGVtcywgYnV0IGFsc28gYXR0YWNoIGEgcG9pbnRlciB0byBhIEMgZGF0YSBzdHJ1Y3R1cmUgdG8gZWFjaCBvbmUuCi1UaGlzIGlzIGRvbmUgYnkgbWFpbnRhaW5pbmcgYW4gYXNzb2NpYXRpdmUgYXJyYXkgbWFwcGluZyAKLWl0ZW0gaWRlbnRpZmllcnMgdG8gcG9pbnRlcnMgKHdpdGggdGhlIDx0dD4gbm9kZVAoKSA8L3R0PiBhcnJheSkuIAotV2hlbiBhCi1wYXJ0aWN1bGFyIGBgbm9kZScnIGlzIHJlZmVyZW5jZWQgbGF0ZXIsIHdlIGNhbiB1c2UgdGhpcyB0bwotZ2V0IGl0cyBwb2ludGVyIHVzZSBpdCBpbiBjYWxscyB0byBDIGZ1bmN0aW9ucy4KLQotPGgzPiA1LjMuIFBhcnNpbmcgYSBDKysgU2ltcGxlIENsYXNzIEhpZXJhcmNoeSA8L2gzPgotCi1BcyBtZW50aW9uZWQgZWFybGllciwgU1dJRyBjYW4gaGFuZGxlIEMrKyBjbGFzc2VzIGFuZCBwdWJsaWMKLWluaGVyaXRhbmNlLiAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBwcm92aWRlcyBhIGZldyBjbGFzc2VzCi1hbmQgaWxsdXN0cmF0ZXMgaG93IHRoaXMgaXMgYWNjb21wbGlzaGVkIChzb21lIGNvZGUgaGFzIGJlZW4KLW9tbWl0dGVkIGZvciByZWFkYWJpbGl0eSkuCi0KLTxibG9ja3F1b3RlPiA8dHQ+IDxwcmU+Ci0vLyBBIFNXSUcgaW5oZXJpdGFuY2UgZXhhbXBsZQotJW1vZHVsZSBzaGFwZXMKLSV7Ci0jaW5jbHVkZSAic2hhcGVzLmgiCi0lfQotCi1jbGFzcyBTaGFwZSB7Ci1wcml2YXRlOgotICBkb3VibGUgeGMsIHljOwotcHVibGljOgotICB2aXJ0dWFsIGRvdWJsZSBhcmVhKCkgPSAwOwotICB2aXJ0dWFsIGRvdWJsZSBwZXJpbWV0ZXIoKSA9IDA7Ci0gIHZvaWQgICAgc2V0X3Bvc2l0aW9uKGRvdWJsZSB4LCBkb3VibGUgeSk7Ci0gIHZvaWQgICAgcHJpbnRfcG9zaXRpb24oKTsKLX07Ci0KLWNsYXNzIENpcmNsZTogcHVibGljIFNoYXBlIHsKLSBwcml2YXRlOgotICBkb3VibGUgcmFkaXVzOwotIHB1YmxpYzoKLSAgQ2lyY2xlKGRvdWJsZSByKTsKLSAgZG91YmxlIGFyZWEoKTsKLSAgZG91YmxlIHBlcmltZXRlcigpOwotfTsKLQotY2xhc3MgU3F1YXJlIDogcHVibGljIFNoYXBlIHsKLXByaXZhdGU6Ci0gIGRvdWJsZSB3aWR0aDsKLXB1YmxpYzoKLSAgU3F1YXJlKGRvdWJsZSB3KTsKLSAgZG91YmxlIGFyZWEoKTsKLSAgZG91YmxlIHBlcmltZXRlcigpOwotfTsKLQotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotTm93LCB3aGVuIHdyYXBwZWQgYnkgU1dJRyAobm90ZSA6Ci1XaGVuIHBhcnNpbmcgQysrIGNsYXNzZXMsIFNXSUcgdGhyb3dzIGF3YXkgZXZlcnl0aGluZyBkZWNsYXJlZCBhcyBwcml2YXRlLAotaW5saW5lIGNvZGUsIGFuZCBhbG90IG9mIHRoZSBvdGhlciBjbHV0dGVyIGZvdW5kIGluIEMrKyBoZWFkZXIgZmlsZXMuICAKLVByaW1hcmlseSB0aGlzIGlzIHByb3ZpZGVkIG9ubHkgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgaW50ZXJmYWNlcyBmcm9tCi1leGlzdGluZyBDKysgaGVhZGVyIGZpbGVzLiksIHdlIGNhbiB1c2Ugb3VyIGNsYXNzIHN0cnVjdHVyZSBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotJSBzZXQgYyBbbmV3X0NpcmNsZSA0XQotXzEwMDBhZDcwX0NpcmNsZV9wCi0lIHNldCBzIFtuZXdfU3F1YXJlIDEwXQotXzEwMDBhZGMwX1NxdWFyZV9wCi0lIFNoYXBlX2FyZWEgJGMKLTUwLjI2NTQ4MjQ2NDAwMDAwMjAwCi0lIFNoYXBlX2FyZWEgJHMKLTEwMC4wMDAwMDAwMDAwMDAwMDAwMAotJSBTaGFwZV9zZXRfcG9zaXRpb24gJGMgLTUgMTAKLSUgQ2lyY2xlX3ByaW50X3Bvc2l0aW9uICRjCi14YyA9IC01LCB5YyA9IDEwCi0lIAotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotSW4gb3VyIGV4YW1wbGUsIHdlIGhhdmUgY3JlYXRlZCBuZXcgPHR0PiBDaXJjbGUgPC90dD4gYW5kIDx0dD4gU3F1YXJlIDwvdHQ+IG9iamVjdHMsCi1idXQgdGhlc2UgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2FibHkgaW4gYW55IGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSA8dHQ+IFNoYXBlIDwvdHQ+Ci1iYXNlIGNsYXNzLiAgVGhlIFNXSUcgdHlwZSBjaGVja2VyIGlzIGVuY29kZWQgd2l0aCB0aGUgY2xhc3MgaGllcmFyY2h5IGFuZAota25vd3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgY2xhc3Nlcy4gICBUaHVzLCB3aGlsZSBhbgotb2JqZWN0IG9mIHR5cGUgPHR0PiBDaXJjbGUgPC90dD4gaXMgcGVyZmVjdGx5IGFjY2VwdGFibGUgdG8gYSBmdW5jdGlvbiBvcGVyYXRpbmcKLW9uIHNoYXBlcywgaXQgd291bGQgYmUgdW5hY2NlcHRhYmxlIHRvIGEgZnVuY3Rpb24gb3BlcmF0aW5nIG9ubHkgb24gdGhlCi08dHQ+IFNxdWFyZSA8L3R0PiB0eXBlLiAgICBBcyBpbiBDKyssIGFueSBmdW5jdGlvbnMgaW4gdGhlIGJhc2UgY2xhc3MgY2FuIGJlCi1jYWxsZWQgaW4gdGhlIGRlcml2ZWQgY2xhc3MgYXMgc2hvd24gYnkgdGhlIDx0dD4gQ2lyY2xlX3ByaW50X3Bvc2l0aW9uIDwvdHQ+Ci1mdW5jdGlvbiBhYm92ZS4KLQotPGgyPiA2LiBVc2luZyBTV0lHIGluIFJlYWwgQXBwbGljYXRpb25zIDwvaDI+Ci0KLVNvIGZhciBvbmx5IGEgZmV3IHNpbXBsZSB0b3kgZXhhbXBsZXMgaGF2ZSBiZWVuIHByZXNlbnRlZCB0byBpbGx1c3RyYXRlCi10aGUgb3BlcmF0aW9uIG9mIFNXSUcgaW4gZ2VuZXJhbC4KLVRoaXMgc2VjdGlvbiB3aWxsIGRlc2NyaWJlIGhvdyBTV0lHIGNhbiBiZSB1c2VkCi13aXRoIGxhcmdlciBhcHBsaWNhdGlvbnMuCi0KLTxoMz4gNi4xLiBVc2UgaW4gU2NpZW50aWZpYyBBcHBsaWNhdGlvbnMgPC9oMz4KLSAKLU1hbnkgdXNlcnMsIGVzcGVjaWFsbHkgd2l0aGluIHRoZSBzY2llbnRpZmljIGFuZCBlbmdpbmVlcmluZyAKLWNvbW11bml0eSwgaGF2ZSBzcGVudCB5ZWFycyBkZXZlbG9waW5nIHNpbXVsYXRpb24gY29kZXMuCi1XaGlsZSBtYW55IG9mIHRoZXNlIHVzZXJzIGFwcHJlY2lhdGUgdGhlCi1wb3dlciB0aGF0IGEgc2NyaXB0aW5nIGxhbmd1YWdlIGNhbiBwcm92aWRlLCB0aGV5IGRvbid0IHdhbnQgdG8gCi1jb21wbGV0ZWx5IHJld3JpdGUgdGhlaXIgYXBwbGljYXRpb25zIG9yIHNwZW5kIGFsbCBvZiB0aGVpciB0aW1lCi10cnlpbmcgdG8gYnVpbGQgYSB1c2VyLWludGVyZmFjZSAobW9zdCB1c2VycyB3b3VsZCByYXRoZXIgYmUgd29ya2luZwotb24gdGhlIHNjaWVudGlmaWMgcHJvYmxlbSBhdCBoYW5kKS4gIFdoaWxlIFNXSUcgY2VydGFpbmx5IHdvbid0IGRvIGV2ZXJ5dGhpbmcsCi1pdCBjYW4gZHJhbWF0aWNhbGx5IHNpbXBsaWZ5IHRoaXMgcHJvY2Vzcy4gICA8YnI+IDxicj4KLQotQXMgYW4gZXhhbXBsZSwgdGhlIGZpcnN0IFNXSUcgYXBwbGljYXRpb24gd2FzIHRoZSBTUGFTTSBtb2xlY3VsYXIKLWR5bmFtaWNzIGNvZGUgZGV2ZWxvcGVkIGF0IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeQotW0JlYXpsZXksTG9tZGFobF0uICAgVGhpcyBjb2RlIGlzIGN1cnJlbnRseSBiZWluZyB1c2VkIGZvciBtYXRlcmlhbHMKLXNjaWVuY2UgcHJvYmxlbXMgYW5kIGNvbnNpc3RzIG9mIG1vcmUgdGhhbiAyMDAgQyBmdW5jdGlvbnMgYW5kIGFib3V0IDIwMDAwIGxpbmVzCi1vZiBjb2RlLgotSW4gb3JkZXIgdG8gdXNlIFNXSUcsIG9ubHkgdGhlIDx0dD4gbWFpbigpIDwvdHQ+IGZ1bmN0aW9uIGhhZCB0byBiZQotcmV3cml0dGVuIGFsb25nIHdpdGggYSBmZXcgb3RoZXIgbWlub3IgbW9kaWZpY2F0aW9ucy4KLVRoZSBmdWxsIHVzZXIgaW50ZXJmYWNlIGlzIGJ1aWx0IHVzaW5nIGEgY29sbGVjdGlvbiBvZiBtb2R1bGVzIGZvcgotc2ltdWxhdGlvbiwgZ3JhcGhpY3MsIG1lbW9yeSBtYW5hZ2VtZW50LCBldGMuLi4gCi1BIHVzZXIgbWF5IGFsc28gc3VwcGx5IHRoZWlyIG93biBpbnRlcmZhY2UgbW9kdWxlcy0tYWxsb3dpbmcgdGhlIGNvZGUgdG8KLWJlIGVhc2lseSBleHRlbmRlZCB3aXRoIG5ldyBmdW5jdGlvbmFsaXR5IGNhcGFiaWxpdGllcyBhcyBuZWVkZWQuCi1BbGwgb2YgdGhlIGludGVyZmFjZSBmaWxlcywgY29udGFpbmluZyBhIGZldyBodW5kcmVkIGxpbmVzIG9mCi1mdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgaW50byBtb3JlIHRoYW4KLTIwMDAgbGluZXMgb2Ygd3JhcHBlciBjb2RlIGF0IGNvbXBpbGUgdGltZS4gICBBcyBhIHJlc3VsdCwgbWFueSB1c2VycyAKLW9mIHRoZSBzeXN0ZW0ga25vdyBob3cgdG8gZXh0ZW5kIGl0LCBidXQgYXJlIHVuYXdhcmUgb2YgdGhlIGFjdHVhbAotd3JhcHBpbmcgcHJvY2VkdXJlLiAgIDxicj4gPGJyPgotCi1BZnRlciBtb2RpZnlpbmcgdGhlIFNQYVNNIGNvZGUgdG8gdXNlIFNXSUcsIG1vc3Qgb2YgdGhlIEMgY29kZSByZW1haW5lZAotdW5jaGFuZ2VkLiAgSW4gZmFjdCwgaW4gc3Vic2VxdWVudCB3b3JrLCB3ZSB3ZXJlIGFibGUgdG8gZWxpbWluYXRlCi1tb3JlIHRoYW4gMjUlIG9mIHRoZSBzb3VyY2UgY29kZS0tYWxtb3N0IGFsbCBvZiB3aGljaCB3YXMgcmVsYXRlZCB0byB0aGUKLW5vdyBvYnNvbGV0ZSBpbnRlcmZhY2UgbWV0aG9kIHRoYXQgd2UgcmVwbGFjZWQuICAgTW9yZSBpbXBvcnRhbnRseSwgd2UKLXdlcmUgYWJsZSB0byB0dXJuIGEgY29kZSB0aGF0IHdhcyBkaWZmaWN1bHQgdG8gdXNlIGFuZCBtb2RpZnkgaW50byBhIAotZmxleGlibGUgcGFja2FnZSB0aGF0IHdhcyBlYXN5IHRvIHVzZSBhbmQgZXh0ZW5kLiAgIFRoaXMgaGFzIGhhZCBhCi1odWdlIGltcGFjdCwgd2hpY2ggY2FuIG5vdCBiZSB1bmRlcnN0YXRlZCwgb24gdGhlIHVzZSBvZiB0aGUgU1BhU00KLWNvZGUgdG8gc29sdmUgcmVhbCBwcm9ibGVtcy4KLQotPGgzPiA2LjIuIE9wZW4tR0wgYW5kIEludmVudG9yIDwvaDM+Ci0KLVdoaWxlIFNXSUcgd2FzIHByaW1hcmlseSBkZXNpZ25lZCB0byB3b3JrIHdpdGggYXBwbGljYXRpb24gY29kZXMsIGl0Ci1jYW4gYWxzbyBiZSB1c2VkIHRvIHdyYXAgbGFyZ2UgbGlicmFyaWVzLiAgIEF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgsCi1QZXRlci1QaWtlIFNsb2FuIHVzZWQgU1dJRyB0byB3cmFwIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIE9wZW4tR0wKLWxpYnJhcnkgaW50byBUY2wgZm9yIHVzZSB3aXRoIGFuIE9wZW4tR0wgVGsgd2lkZ2V0LiAgIFRoZSBwcm9jZXNzIG9mCi13cmFwcGluZyBPcGVuLUdMIHdpdGggU1dJRyB3YXMgYXMgc2ltcGxlIGFzIHRoZSBmb2xsb3dpbmcgOgotCi08dWw+Ci08bGk+ICBNYWtlIGEgY29weSBvZiB0aGUgPHR0PiBnbC5oIDwvdHQ+IGhlYWRlciBmaWxlLgotPGxpPiAgQ2xlYW4gaXQgdXAgYnkgdGFraW5nIGEgZmV3IEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgb3V0IAotICAgICAgb2YgaXQuICAgRml4IGEgZmV3IHR5cGVkZWZzLgotPGxpPiBJbnNlcnQgdGhlIGZvbGxvd2luZyBjb2RlIGludG8gdGhlIGJlZ2lubmluZyAKLTxibG9ja3F1b3RlPiA8dHQ+IDxwcmU+Ci0lbW9kdWxlIG9wZW5nbAotJXsKLSNpbmNsdWRlICZsdDtHTC9nbC5oJmd0OwotJX0KLS4uLiBDb3B5IGVkaXRlZCBnbC5oIGhlcmUgLi4uCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi08bGk+IE1vZGlmeSB0aGUgT3Blbi1HTCB3aWRnZXQgdG8gY2FsbCA8dHQ+IE9wZW5nbF9Jbml0IDwvdHQ+LgotPGxpPiBSZWNvbXBpbGUKLTwvdWw+Ci0KLVRoZSBlbnRpcmUgcHJvY2VzcyByZXF1aXJlZCBvbmx5IGFib3V0IDEwIG1pbnV0ZXMgb2Ygd29yaywgYnV0IHJlc3VsdGVkCi1pbiBtb3JlIHRoYW4gNTAwIGNvbnN0YW50cyBhbmQgMzYwIGZ1bmN0aW9ucyBiZWluZyBhZGRlZCB0byBUY2wuICBGdXJ0aGVybW9yZSwKLXRoaXMgZXh0ZW5zaW9uIGFsbG93cyBPcGVuLUdMIGNvbW1hbmRzIHRvIGJlIGlzc3VlZCBkaXJlY3RseSBmcm9tIFRjbCdzCi1pbnRlcnByZXRlZCBlbnZpcm9ubWVudCBhcyBzaG93biBpbiB0aGlzIGV4YW1wbGUKLShmcm9tIHRoZSBPcGVuLUdMIG1hbnVhbCBbT3BlbkdMXSkuCi0KLTxibG9ja3F1b3RlPiA8dHQ+IDxwcmU+Ci0lIC4uLiBvcGVuIEdMIHdpZGdldCBoZXJlIC4uLgotJSBnbENsZWFyQ29sb3IgMC4wIDAuMCAwLjAgMC4wCi0lIGdsQ2xlYXIgJEdMX0NPTE9SX0JVRkZFUl9CSVQKLSUgZ2xDb2xvcjNmIDEuMCAxLjAgMS4wCi0lIGdsT3J0aG8gLTEuMCAxLjAgLTEuMCAxLjAgLTEuMCAxLjAKLSUgZ2xCZWdpbiAkR0xfUE9MWUdPTgotJSAgICBnbFZlcnRleDJmIC0wLjUgLTAuNQotJSAgICBnbFZlcnRleDJmIC0wLjUgMC41Ci0lICAgIGdsVmVydGV4MmYgMC41IDAuNQotJSAgICBnbFZlcnRleDJmIDAuNSAtMC41Ci0lIGdsRW5kCi0lIGdsRmx1c2gKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLUVhcmx5IHdvcmsgaGFzIGFsc28gYmVlbiBwZXJmb3JtZWQgb24gdXNpbmcgU1dJRyB0byB3cmFwIHBvcnRpb25zIAotb2YgdGhlIE9wZW4tSW52ZW50b3IgcGFja2FnZSBbSW52ZW50XS4gICBUaGlzIGlzIGEgbW9yZSBhbWJpdGlvdXMgcHJvamVjdAotc2luY2UgT3Blbi1JbnZlbnRvciBjb25zaXN0cyBvZiBhIHZlcnkgbGFyZ2UgY29sbGVjdGlvbiBvZiBoZWFkZXIKLWZpbGVzIGFuZCBDKysgY2xhc3Nlcy4gICAgSG93ZXZlciwgIHRoZSBTV0lHIGxpYnJhcnkgbWVjaGFuaXNtIGNhbiBiZQotdXNlZCBlZmZlY3RpdmUgaW4gdGhpcyBjYXNlLiAgIEZvciBlYWNoIEludmVudG9yIGhlYWRlciwgd2UgY2FuIGNyZWF0ZQotYSBzYW5pdGl6ZWQgU1dJRyBpbnRlcmZhY2UgZmlsZSAocmVtb3ZpbmcgYWxvdCBvZiB0aGUgY2x1dHRlciBmb3VuZCBpbgotdGhlIGhlYWRlciBmaWxlcykuICAgVGhlc2UgaW50ZXJmYWNlIGZpbGVzIGNhbiB0aGVuIGJlIG9yZ2FuaXplZCB0byBtaXJyb3IgdGhlCi1zdHJ1Y3R1cmUgb2YgdGhlIEludmVudG9yIHN5c3RlbS4gICAgVG8gYnVpbGQgYSBtb2R1bGUgZm9yIFRjbCwgYSB1c2VyCi1jb3VsZCBzaW1wbHkgc3BlY2lmeSB3aGljaCBtb2R1bGVzIHRoZXkgd2FudGVkIHRvIHVzZSBhcyBmb2xsb3dzIDoKLQotPGJsb2NrcXVvdGU+IDx0dD4gPHByZT4KLSVtb2R1bGUgaW52ZW50Ci0lewotLi4uIHB1dCBoZWFkZXJzIGhlcmUgLi4uCi0lfQotCi0laW5jbHVkZSAiSW52ZW50b3IvWHQvU29YdC5pIgotJWluY2x1ZGUgIkludmVudG9yL1h0L1NvWHRSZW5kZXJBcmVhLmkiCi0laW5jbHVkZSAiSW52ZW50b3Ivbm9kZXMvU29Db25lLmkiCi0laW5jbHVkZSAiSW52ZW50b3Ivbm9kZXMvU29EaXJlY3Rpb25hbExpZ2h0LmkiCi0laW5jbHVkZSAiSW52ZW50b3Ivbm9kZXMvU29NYXRlcmlhbC5pIgotJWluY2x1ZGUgIkludmVudG9yL25vZGVzL1NvUGVyc3BlY3RpdmVDYW1lcmEuaSIKLSVpbmNsdWRlICJJbnZlbnRvci9ub2Rlcy9Tb1NlcGFyYXRvci5pIgotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotV2hpbGUgd3JhcHBpbmcgdGhlIEludmVudG9yIGxpYnJhcnkgd2lsbCByZXF1aXJlIHNpZ25pZmljYW50bHkKLW1vcmUgd29yayB0aGFuIE9wZW4tR0wsIFNXSUcgY2FuIGJlIHVzZWQgZWZmZWN0aXZlbHkgd2l0aCBzdWNoCi1zeXN0ZW1zLiAgIAotCi08aDM+IDYuMy4gQnVpbGRpbmcgSW50ZXJlc3RpbmcgQXBwbGljYXRpb25zIGJ5IEN1dCBhbmQgUGFzdGUgPC9oMz4KLQotU1dJRyBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgdG9vbHMgb3V0IG9mIGRpc3NpbWlsaWFyIAotcGFja2FnZXMgYW5kIGxpYnJhcmllcy4gICAKLUluIGNvbnRyYXN0IHRvIGNvbWJpbmluZyBwYWNrYWdlcyBhdCBhbiBpbnB1dCBsZXZlbCBhcyBvbmUgbWlnaHQKLWRvIHdpdGggd2l0aCBFeHBlY3QsIFNXSUcgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYXBwbGljYXRpb25zIGF0IGEKLWZ1bmN0aW9uIGxldmVsIFtFeHBlY3RdLgotRm9yIGV4YW1wbGUsIHVzaW5nCi1hIHNpbXBsZSBpbnRlcmZhY2UgZmlsZSwgeW91IGNhbiB3cmFwIHRoZQotQyBBUEkgb2YgTUFUTEFCIDQuMiBbTUFUTEFCXS4KLVRoaXMgaW4gdHVybiBsZXRzIHlvdSBidWlsZCBhIFRjbC9UayBpbnRlcmZhY2UgZm9yIGNvbnRyb2xsaW5nCi1NQVRMQUIgcHJvZ3JhbXMuICBTZXBhcmF0ZWx5LCB5b3UgY291bGQgd3JhcCBhIG51bWVyaWNhbCBzaW11bGF0aW9uCi1jb2RlLiAgIE5vdywgYSBmZXcgdHJhbnNsYXRpb24gZnVuY3Rpb25zIGNvdWxkIGJlIHdyaXR0ZW4gYW5kIGJvdGgKLXBhY2thZ2VzIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgVGNsL1RrIGFwcGxpY2F0aW9uLiAgIFlvdSBoYXZlCi1ub3cgYnVpbHQgYSBzaW1wbGUgYGBjb21wdXRhdGlvbmFsIHN0ZWVyaW5nJycgc3lzdGVtIHRoYXQgYWxsb3dzIHlvdQotdG8gcnVuIGEgc2ltdWxhdGlvbiBjb2RlLCB2aXN1YWxpemUgZGF0YSBpbiBNQVRMQUIsIGFuZCBjb250cm9sIHRoZQotZW50aXJlIHN5c3RlbSB3aXRoIGEgVGNsL1RrIGJhc2VkIGludGVyZmFjZS4gICAgRmlndXJlIDIgc2hvd3MKLWEgc2NyZWVuIHNuYXBzaG90IGZyb20gc3VjaCBhIHNpbXVsYXRpb24gaW4gd2hpY2ggdGhlIFNQYVNNIG1vbGVjdWxhcgotZHluYW1pY3MgY29kZSwgYSB2aXN1YWxpemF0aW9uIG1vZHVsZSBsaWJyYXJ5LCBpbWFnZSBzZXJ2ZXIgKHVzaW5nIHh2KSwKLWFuZCBNQVRMQUIgaGF2ZSBiZWVuCi1jb21iaW5lZC4gICBVbmRlciB0aGlzIHN5c3RlbSwgdGhlIHVzZXIgY2FuIGludGVyYWN0aXZlbHkgc2V0IHVwCi1hbmQgcnVuIHNpbXVsYXRpb25zIHdoaWxlIHdhdGNoaW5nIHRoZSByZXN1bHRzIGV2b2x2ZSBpbiByZWFsLXRpbWUuCi08YnI+IDxicj4KLTxjZW50ZXI+Ci08aW1nIGFsdCA9ICJUY2wvVGsvTUFUTEFCL1NQQVNNIEZpZ3VyZSIgc3JjPSJzdGVlcjIuZ2lmIj4gPGJyPgotRmlndXJlIDI6IFNpbXBsZSBUY2wvVGsgU3RlZXJpbmcgQXBwbGljYXRpb24gQnVpbHQgd2l0aCBTV0lHIDxicj4KLTwvY2VudGVyPgotCi08aDM+IDYuNC4gTGFuZ3VhZ2UgSW5kZXBlbmRlbnQgQXBwbGljYXRpb25zIDwvaDM+Ci0KLQotRWFjaCBzY3JpcHRpbmcgbGFuZ3VhZ2UgaGFzIGl0J3Mgb3duIHN0cmVuZ3RocyBhbmQgd2Vha25lc3Nlcy4gIAotUmF0aGVyCi10aGFuIHRyeWluZyB0byBjaG9vc2UgdGhlIGxhbmd1YWdlIHRoYXQgaXMgdGhlIGJlc3QgYXQgZXZlcnl0aGluZyAod2hpY2gKLWlzIHByb2JhYmx5IGltcG9zc2libGUpLAotU1dJRyBhbGxvd3MgYSB1c2VyIHRvIHVzZSB0aGUgYmVzdCBsYW5ndWFnZSBmb3IgdGhlIGpvYiBhdCBoYW5kLiAgSSdtCi1hbHdheXMgZmluZGluZyBteXNlbGYgd3JpdGluZyBsaXR0bGUgdXRpbGl0aWVzIGFuZCBwcm9ncmFtcyB0byBzdXBwb3J0Ci1teSBzY2llbnRpZmljIGNvbXB1dGluZyB3b3JrLiAgV2h5IHNob3VsZCBJIGJlIGZvcmNlZCB0byB1c2Ugb25seSBvbmUKLWxhbmd1YWdlIGZvciBldmVyeXRoaW5nPyAgV2l0aCBTV0lHLCBJIGNhbiBwdXQgYSBQZXJsIGludGVyZmFjZSBvbiBhCi10b29sIGFuZCBzd2l0Y2ggb3ZlciB0byBUY2wvVGsgYXQgYW55dGltZSBieSBqdXN0IGNoYW5naW5nIGEgZmV3Ci1NYWtlZmlsZSBvcHRpb25zLiA8YnI+IDxicj4KLQotU2luY2UgU1dJRyBwcm92aWRlcyBhIGxhbmd1YWdlLWluZGVwZW5kZW50IGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLAotaXQgaXMgcmVsYXRpdmVseSBlYXN5IHRvIHVzZSBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzIGluIGEgdmFyaWV0eSBvZgotaW50ZXJlc3RpbmcgYXBwbGljYXRpb25zLiAgRm9yIGV4YW1wbGUsIHRoZSBpZGVudGljYWwgTUFUTEFCCi1tb2R1bGUgdXNlZCBpbiB0aGUgbGFzdCBUY2wgZXhhbXBsZSBjb3VsZCBiZSBpbXBvcnRlZCBhcyBQZXJsNSBtb2R1bGUKLWFuZCBjb21iaW5lZCB3aXRoIGEgUGVybCBzY3JpcHQgdG8gcHJvZHVjZSBncmFwaGljYWwgZGlzcGxheXMgZnJvbQotV2ViLXNlcnZlciBsb2dzIGFzIHNob3duIGluIEZpZ3VyZSAzLiA8YnI+IDxicj4KLQotPGNlbnRlcj4KLTxpbWcgYWx0PSJQZXJsNSB3ZWIgc3RhdHMgZXhhbXBsZSIgc3JjPSJoaXRzLmdpZiI+IDxicj4KLUZpZ3VyZSAzOldlYi1zZXJ2ZXIgYWN0aXZpdHkgZ3JhcGguICBHZW5lcmF0ZWQgZnJvbSBhIFBlcmwgc2NyaXB0LCBidXQKLXVzZXMgYW4gdW5tb2RpZmllZCBTV0lHIGdlbmVyYXRlZCBtb2R1bGUgZm9yIGludGVncmF0aW5nIE1BVExBQiB3aXRoIFRjbC9Uay4gPGJyPiA8YnI+Ci08L2NlbnRlcj4KLQotU29tZSBoYXZlIHByb21vdGVkIHRoZSBpZGVhIG9mIGVuY2Fwc3VsYXRpbmcgc2V2ZXJhbCBsYW5ndWFnZXMgaW50bwotYSBoaWdoZXIgbGV2ZWwgbGFuZ3VhZ2UgYXMgaGFzIGJlZW4gcHJvcG9zZWQgd2l0aCBHdWlsZSBbTG9yZF0uCi1UaGlzIG1heSBiZSBmaW5lIGlmIG9uZSB3YW50cyB0byB3cml0ZSBjb2RlIHRoYXQgdXNlcyBkaWZmZXJlbnQgbGFuZ3VhZ2VzCi1hbGwgYXQgb25jZSwgYnV0IHdoZW4gSSB3YW50IHRvIHVzZSBvbmx5IFRjbCBvciBQZXJsIGZvciBhbiBhcHBsaWNhdGlvbiwKLUkgYWxtb3N0IGFsd2F5cyBwcmVmZXIgdXNpbmcgdGhlIHJlYWwgdmVyc2lvbnMgaW5zdGVhZCBvZiBhbiBlbmNhcHN1bGF0ZWQKLXZhcmlhbnQuICAgICBTV0lHIG1ha2VzIHRoaXMgcG9zc2libGUgd2l0aG91dCBtdWNoIGVmZm9ydC4KLQotPGgzPiA2LjUuIFVzaW5nIFRjbCBhcyBhIGRlYnVnZ2VyIDwvaDM+Ci0KLVNpbmNlIFNXSUcgY2FuIHdvcmsgd2l0aCBleGlzdGluZyBDIGNvZGUsIGl0IGNhbiBiZSB1c2VkIHF1aXRlIGVmZmVjdGl2ZWx5Ci1hcyBhIGRlYnVnZ2VyLgotWW91IGNhbiB3cmFwIEMgZnVuY3Rpb25zIGFuZCBpbnRlcmFjdAotd2l0aCB0aGVtIGZyb20gPHR0PiB0Y2xzaCA8L3R0PiBvciA8dHQ+IHdpc2ggPC90dD4uCi1Vbmxpa2UgbW9zdCB0cmFkaXRpb25hbCBkZWJ1Z2dlcnMsIHlvdQotY2FuIGNyZWF0ZSBvYmplY3RzLCBidWZmZXJzLCBhcnJheXMsIGFuZCBvdGhlciB0aGluZ3Mgb24gdGhlIGZseQotYnkgcHV0dGluZyBhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCi1TaW5jZSA8dHQ+IHRjbHNoIDwvdHQ+IG9yIDx0dD4gd2lzaCA8L3R0PiBwcm92aWRlcyBhIDx0dD4gbWFpbigpIDwvdHQ+IGZ1bmN0aW9uLCB5b3UKLWNhbiBldmVuIHJpcCBzbWFsbCBwaWVjZXMgb3V0IG9mIGEgbGFyZ2VyIHBhY2thZ2Ugd2l0aG91dCBpbmNsdWRpbmcKLXRoYXQgcGFja2FnZSdzIG1haW4gcHJvZ3JhbS4KLVNjcmlwdHMgY2FuIGJlIHdyaXR0ZW4gdG8gdGVzdCBvdXQgZGlmZmVyZW50IHBhcnRzIG9mIHlvdXIKLWNvZGUgYXMgaXQgaXMgZGV2ZWxvcGVkLiAgICBXaGVuIHlvdSBhcmUgc2F0aXNmaWVkIHdpdGggdGhlIG1vZHVsZSwKLXJlbW92aW5nIHRoZSBpbnRlcmZhY2UgaXMgYXMgZWFzeSBhcyBkaXNjYXJkaW5nIHRoZSBTV0lHIGludGVyZmFjZQotZmlsZS4gICBJIGhhdmUgdXNlZCBTV0lHIGFzIGEgZGVidWdnZXIgZm9yIGRldmVsb3BpbmcgZ3JhcGhpY3MgbGlicmFyaWVzLAotbmV0d29yayBzZXJ2ZXJzLCBzaW11bGF0aW9uIGNvZGVzLCBhbmQgYSB3aWRlIHJhbmdlIG9mIG90aGVyIHByb2plY3RzLS1zb21lCi1vZiB3aGljaCBkaWRuJ3QgZXZlbiB1c2UgYSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2hlbiBjb21wbGV0ZWQuCi0KLTxoMj4gNy4gTGltaXRhdGlvbnMgPC9oMj4KLQotU1dJRyByZXByZXNlbnRzIGEgYmFsYW5jZSBvZiBmbGV4aWJpbGl0eSBhbmQgZWFzZSBvZiB1c2UuCi1JIGhhdmUgYWx3YXlzIGZlbHQgdGhhdCB0aGUgdG9vbCBzaG91bGRuJ3QgYmUgbW9yZSBjb21wbGljYXRlZCB0aGFuCi10aGUgb3JpZ2luYWwgcHJvYmxlbS4gICAgVGhlcmVmb3JlLCBTV0lHIGNlcnRhaW5seSB3b24ndCBkbyBldmVyeXRoaW5nLgotV2hpbGUgSSBiZWxpZXZlIHRoZSBwb2ludGVyIHJlcHJlc2VudGF0aW9uIG9mIGNvbXBsZXggZGF0YXR5cGVzIHdvcmtzCi13ZWxsIGluIHByYWN0aWNlLCBzb21lIHVzZXJzIGhhdmUgZm91bmQgdGhpcyB0byBiZSB0b28gZ2VuZXJhbCBvcgotY29uZnVzaW5nLiAgICBTV0lHJ3MKLXN1cHBvcnQgZm9yIEMrKyBpcyBhbHNvIGxpbWl0ZWQgYnkgdGhlIGZhY3QgdGhhdCBTV0lHIGRvZXMgbm90IHN1cHBvcnQKLW9wZXJhdG9yIG92ZXJsb2FkaW5nLCBtdWx0aXBsZSBpbmhlcml0YW5jZSwgdGVtcGxhdGVzLCBhbmQgYSBudW1iZXIKLW9mIG90aGVyIG1vcmUgYWR2YW5jZWQgQysrIGZlYXR1cmVzLiAgICBTV0lHIGFsc28gbGFja3Mgc3VwcG9ydCBmb3IKLWRlZmF1bHQgb3IgdmFyaWFibGUgbGVuZ3RoIGZ1bmN0aW9uIGFyZ3VtZW50cywgYXJyYXkgbm90YXRpb24sCi1wb2ludGVycyB0byBmdW5jdGlvbnMgKHVubGVzcyBoaWRkZW4gYnkgYSB0eXBlZGVmKSBhbmQgYW4gZXhjZXB0aW9uCi1tZWNoYW5pc20uIAotRmluYWxseSwgU1dJRwotZG9lcwotbm90IHN1cHBvcnQgYWxsIG9mIHRoZSBmZWF0dXJlcyBvZiBUY2wgc3VjaCBhcyBhc3NvY2lhdGl2ZSBhcnJheXMuCi1UaGVzZSBhcmVuJ3QgYW4gaW5oZXJlbnQgcGFydCBvZiB0aGUgQyBsYW5ndWFnZSBzbyBpdCBpcyBkaWZmaWN1bHQKLXRvIGdlbmVyYWxpemUgaG93IHRoZXkgc2hvdWxkIGJlIGhhbmRsZWQgb3IgZ2VuZXJhdGVkLiBJIHByZWZlciB0bwota2VlcCB0aGUgdG9vbCBzaW1wbGUgd2hpbGUgbGVhdmluZyB0aGVzZSBpc3N1ZXMgdXAgdG8gdGhlIGluZGl2aWR1YWwKLXByb2dyYW1tZXIuICA8YnI+IDxicj4KLQotCi1Gb3J0dW5hdGVseSwgaXQgaXMgYWxtb3N0IGFsd2F5cyBwb3NzaWJsZSB0byB3b3JrIGFyb3VuZAotbWFueSBwcm9ibGVtcyBieSB3cml0aW5nIHNwZWNpYWwgbGlicmFyeSBmdW5jdGlvbnMgb3IgbWFraW5nCi1tb2RpZmljYXRpb25zIHRvIHRoZSBTV0lHIGxhbmd1YWdlIG1vZHVsZXMgdG8gcHJvZHVjZSB0aGUgZGVzaXJlZCBlZmZlY3QuCi1Gb3IgZXhhbXBsZSwgd2hlbiB3cmFwcGluZyBPcGVuLUdMLCBTV0lHIGluc3RhbGxlZCBhbGwgb2YgdGhlIE9wZW4tR0wKLWNvbnN0YW50cyBhcyBUY2wgZ2xvYmFsIHZhcmlhYmxlcy4gICBVbmZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZXNlCi12YXJpYWJsZXMgd2VyZSBhY2Nlc3NpYmxlIGluc2lkZSBUY2wgcHJvY2VkdXJlcyB1bmxlc3MgdGhleSB3ZXJlIGV4cGxpY2l0bHkKLWRlY2xhcmVkIGdsb2JhbC4gICBCeSBtYWtpbmcgYSBtb2RpZmljYXRpb24gdG8gdGhlIFRjbCBsYW5ndWFnZSBtb2R1bGUsCi1pdCB3YXMgcG9zc2libGUgdG8gcHV0IHRoZSBHTCBjb25zdGFudHMgaW50byBoYXNoIHRhYmxlIGFuZCBwZXJmb3JtCi1hIGhpZGRlbiBgYGxvb2t1cCcnIGluc2lkZSBhbGwgb2YgdGhlIEdMLXJlbGF0ZWQgZnVuY3Rpb25zLiAgU2ltaWxhcmx5LAotbXVjaCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBvZiBTV0lHIGNhbiBiZSBwbGFjZWQgaW50byBsaWJyYXJ5Ci1maWxlcyBmb3IgdXNlIGluIG90aGVyIG1vZHVsZXMuCi0KLTxoMj4gOC4gQ29uY2x1c2lvbnMgPC9oMj4KLQotU1dJRyBoYXMgYmVlbiBpbiB1c2UgZm9yIGFwcHJveGltYXRlbHkgb25lIHllYXIuICBBdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnksIGl0cyB1c2Ugd2l0aCB0aGUgU1BhU00gY29kZSBoYXMKLXByb3ZlbiB0bwotYmUgYSByZW1hcmthYmx5IHNpbXBsZSwgc3RhYmxlLCBhbmQgYnVnLWZyZWUgd2F5IHRvIGJ1aWxkIGFuZCBtb2RpZnkgdXNlcgotaW50ZXJmYWNlcy4gICBBdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLCBTV0lHIGlzIGJlaW5nIHVzZWQgaW4gYSB2YXJpZXR5Ci1vZiBvdGhlciBhcHBsaWNhdGlvbnMgd2hlcmUgdGhlIHVzZXJzIGhhdmUgcXVpY2tseSBjb21lIHRvIGFwcHJlY2lhdGUgaXRzCi1lYXNlIG9mIHVzZSBhbmQgZmxleGliaWxpdHkuIDxicj4gPGJyPgotCi1XaGlsZSBTV0lHIG1heSBiZSBpbmFwcHJvcHJpYXRlIGZvciBjZXJ0YWluIGFwcGxpY2F0aW9ucywgSSBmZWVsIHRoYXQgaXQKLW9wZW5zIHVwIFRjbC9UaywgUHl0aG9uLCBQZXJsLCBHdWlsZSwgYW5kIG90aGVyIGxhbmd1YWdlcyAgdG8gCi11c2VycyB3aG8gd291bGQgbGlrZSB0byBkZXZlbG9wIGludGVyZXN0aW5nIHVzZXIgaW50ZXJmYWNlcyBmb3IgdGhlaXIgY29kZXMsCi1idXQgd2hvIGRvbid0IHdhbnQgdG8gd29ycnkgYWJvdXQgdGhlIGxvdy1sZXZlbCBkZXRhaWxzIG9yIGZpZ3VyaW5nCi1vdXQgaG93IHRvIHVzZSBhIGNvbXBsaWNhdGVkIHRvb2wuICA8YnI+IDxicj4KLSAgCi1GdXR1cmUgZGlyZWN0aW9ucyBmb3IgU1dJRyBpbmNsdWRlIHN1cHBvcnQgZm9yIG90aGVyIHNjcmlwdGluZyBsYW5ndWFnZXMsCi1hbmQgYSBsaWJyYXJ5IG9mIGV4dGVuc2lvbnMuICBTV0lHIG1heSBhbHNvIGJlIGV4dGVuZGVkIHRvIHN1cHBvcnQgcGFja2FnZXMKLXN1Y2ggYXMgaW5jcmVtZW50YWwgVGNsLiBXb3JrIGlzIGFsc28gdW5kZXJ3YXkgdG8gcG9ydCBTV0lHIHRvIG5vbi11bml4Ci1wbGF0Zm9ybXMuCi0KLTxoMj4gQWNrbm93bGVkZ21lbnRzIDwvaDI+Ci0KLVRoaXMgcHJvamVjdCB3b3VsZCBub3QgaGF2ZSBiZWVuIHBvc3NpYmxlIHdpdGhvdXQgdGhlIHN1cHBvcnQgb2YgYSBudW1iZXIKLW9mIHBlb3BsZS4gICBQZXRlciBMb21kYWhsLCBTaHVqaWEgWmhvdSwgQnJhZCBIb2xpYW4sIFRpbSBHZXJtYW5uLCBhbmQgTmllbHMKLUplbnNlbiBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgd2VyZSB0aGUgZmlyc3QgdXNlcnMgYW5kIHdlcmUKLWluc3RydW1lbnRhbCBpbiB0ZXN0aW5nIG91dCB0aGUgZmlyc3QgZGVzaWducy4gICBQYXRyaWNrIFR1bGxtYW5uIGF0Ci10aGUgVW5pdmVyc2l0eSBvZiBVdGFoIHN1Z2dlc3RlZCB0aGUgaWRlYSBvZiBhdXRvbWF0aWMgZG9jdW1lbnRhdGlvbgotZ2VuZXJhdGlvbi4gIEpvaG4gU2NobWlkdCwgS3VydGlzCi1CbGVla2VyLCBQZXRlci1QaWtlIFNsb2FuLCBhbmQgU3RldmUgUGFya2VyIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggdGVzdGVkIG91dCBzb21lIG9mIHRoZSBuZXdlciB2ZXJzaW9ucyBhbmQKLXByb3ZpZGVkIHZhbHVhYmxlIGZlZWRiYWNrLiAgIEpvaG4gQnVja21hbiBzdWdnZXN0ZWQgbWFueSBpbnRlcmVzdGluZwotaW1wcm92ZW1lbnRzIGFuZCBoYXMgYmVlbiBpbnN0cnVtZW50YWwgdGhlIHJlY2VudCBkZXZlbG9wbWVudCBvZiBTV0lHLgotRmluYWxseQotSSdkIGxpa2UgdG8gdGhhbmsgQ2hyaXMgSm9obnNvbiBhbmQgdGhlIG1lbWJlcnMgb2YgdGhlIFNjaWVudGlmaWMKLUNvbXB1dGluZyBhbmQgSW1hZ2luZyBncm91cCBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIGZvciB0aGVpciBjb250aW51ZWQKLXN1cHBvcnQgYW5kIGZvciBwdXR0aW5nIHVwIHdpdGggbXkgd3JhcHBpbmcgZXZlcnkgc29mdHdhcmUgcGFja2FnZQotSSBjb3VsZCBnZXQgbXkgaGFuZHMgb24uICAgIFNXSUcgd2FzIGRldmVsb3BlZCBpbiBwYXJ0IHVuZGVyIHRoZQotYXVzcGljZXMgb2YgdGhlIFVTIERlcGFydG1lbnQgb2YgRW5lcmd5LCB0aGUgTmF0aW9uYWwgU2NpZW5jZSBGb3VuZGF0aW9uLCAKLWFuZCBOYXRpb25hbCBJbnN0aXR1dGVzIG9mIEhlYWx0aC4KLQotPGgyPiBBdmFpbGFiaWxpdHkgPC9oMj4KLQotU1dJRyBpcyBmcmVlIHNvZnR3YXJlIGFuZCBhdmFpbGFibGUgdmlhIGFub255bW91cyBGVFAgYXQgIDxicj4gPGJyPgotCi08Y2VudGVyPgotPHR0PiBmdHAuY3MudXRhaC5lZHUvcHViL2JlYXpsZXkvU1dJRyA8L3R0PiA8YnI+IDxicj4KLTwvY2VudGVyPgotCi1Nb3JlIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIG9uIHRoZSBTV0lHIGhvbWVwYWdlIGF0ICA8YnI+IDxicj4KLQotPGNlbnRlcj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudXRhaC5lZHUvfmJlYXpsZXkvU1dJRyI+IDx0dD4gaHR0cDovL3d3dy5jcy51dGFoLmVkdS9+YmVhemxleS9TV0lHIDwvdHQ+IDwvYT4KLTwvY2VudGVyPiA8YnI+IDxicj4KLQotPGgyPiBSZWZlcmVuY2VzIDwvaDI+Ci0KLVtCZWF6bGV5XSBELk0uIEJlYXpsZXkgYW5kIFAuUy4gTG9tZGFobCwgCi08ZW0+IE1lc3NhZ2UtUGFzc2luZyBNdWx0aS1DZWxsIE1vbGVjdWxhciBEeW5hbWljcyBvbiB0aGUgQ29ubmVjdGlvbgotTWFjaGluZSA1IDwvZW0+LCBQYXJhbGxlbCBDb21wdXRpbmcgMjAgKDE5OTQpIHAuIDE3My0xOTUuIDxicj4gPGJyPgotCi1bRVRdIEVtYmVkZGVkIFRrLCA8YnI+Ci08dHQ+IGZ0cDovL2Z0cC52bmV0Lm5ldC9wdWIvdXNlcnMvZHJoL0VULmh0bWwgPC90dD4gPGJyPiA8YnI+Ci0KLVtFeHBlY3RdIERvbiBMaWJlcywgPGVtPiBFeHBsb3JpbmcgRXhwZWN0IDwvZW0+LCBPJ1JlaWxseSAmYW1wOyBBc3NvY2lhdGVzLCBJbmMuICgxOTk1KS4gPGJyPiA8YnI+Ci0KLVtIZWlkcmljaF0gV29sZmdhbmcgSGVpZHJpY2ggYW5kIFBoaWxpcHAgU2x1c2FsbGVrLCA8ZW0+Ci1BdXRvbWF0aWMgR2VuZXJhdGlvbiBvZiBUY2wgQmluZGluZ3MgZm9yIEMgYW5kIEMrKyBMaWJyYXJpZXMuPC9lbT4sCi1VU0VOSVggM3JkIEFubnVhbCBUY2wvVGsgV29ya3Nob3AgKDE5OTUpLiA8YnI+IDxicj4KLQotW0phbnNzZW5dIEJpbGwgSmFuc3NlbiwgTWlrZSBTcHJlaXR6ZXIsIDxlbT4gSUxVIDogSW50ZXItTGFuZ3VhZ2UgVW5pZmljYXRpb24gdmlhIE9iamVjdCBNb2R1bGVzIDwvZW0+LCBPT1BTTEEgOTQgV29ya3Nob3Agb24gTXVsdGktTGFuZ3VhZ2UKLU9iamVjdCBNb2RlbHMuIDxicj4gPGJyPgotCi1bTG9tZGFobF0gUC5TLiBMb21kYWhsLCBQLiBUYW1heW8sIAotTi5Hcm9uYmVjaC1KZW5zZW4sIGFuZCBELk0uIEJlYXpsZXksIAotPGVtPiBQcm9jLiBvZiBTdXBlcmNvbXB1dGluZyA5MyA8L2VtPiwgSUVFRSBDb21wdXRlciBTb2NpZXR5ICgxOTkzKSwgcC4gNTIwLTUyNy4KLTxicj4gPGJyPgotCi1bTG9yZF0gVGhvbWFzIExvcmQsIDxlbT4gQW4gQW5hdG9teSBvZiBHdWlsZSwgVGhlIEludGVyZmFjZSB0byAKLVRjbC9UayA8L2VtPiwgUHJvY2VlZGluZ3Mgb2YgdGhlIFVTRU5JWCAzcmQgQW5udWFsIFRjbC9UayBXb3Jrc2hvcCAoMTk5NSkuIDxicj4gPGJyPgotCi1bTUFUTEFCXSA8ZW0+IE1BVExBQiBFeHRlcm5hbCBJbnRlcmZhY2UgR3VpZGUgPC9lbT4sIFRoZSBNYXRoIFdvcmtzLCBJbmMuICAoMTk5MykuCi08YnI+IDxicj4KLQotW091c3RlcmhvdXRdIEpvaG4gSy4gT3VzdGVyaG91dCwgPGVtPiBUY2wgYW5kIHRoZSBUayBUb29sa2l0IDwvZW0+LCBBZGRpc29uLVdlc2xleSBQdWJsaXNoZXJzICgxOTk0KS4gPGJyPiA8YnI+Ci0KLVtQZXJsNV0gUGVybDUgUHJvZ3JhbW1lcnMgcmVmZXJlbmNlLCA8YnI+Ci08dHQ+IGh0dHA6Ly93d3cubWV0cm9uZXQuY29tL3BlcmxpbmZvL2RvYyA8L3R0PiwgKDE5OTYpLiA8YnI+IDxicj4KLQotW3Z0a10gVy4gU2Nocm9lZGVyLCBLLiBNYXJ0aW4sIGFuZCBCLiBMb3JlbnNlbiwgPGVtPiBUaGUKLVZpc3VhbGl6YXRpb24gVG9vbGtpdCA8L2VtPiwgUHJlbnRpY2UgSGFsbCAgKDE5OTUpLiA8YnI+IDxicj4KLQotW0ludmVudF0gSi4gV2VybmVja2UsPGVtPiBUaGUgSW52ZW50b3IgTWVudG9yIDwvZW0+LCBBZGRpc29uLVdlc2xleSBQdWJsaXNoaW5nICgxOTk0KS4gPGJyPiA8YnI+Ci0KLVtXZXRoZXJhbGxdIEQuIFdldGhlcmFsbCwgQy4gSi4gTGluZGJsYWQsIDxlbT4gRXh0ZW5kaW5nIFRjbCBmb3IKLUR5bmFtaWMgT2JqZWN0LU9yaWVudGVkIFByb2dyYW1taW5nIDwvZW0+LCBQcm9jZWVkaW5ncyBvZiB0aGUgVVNFTklYIDNyZCBBbm51YWwgVGNsL1RrIFdvcmtzaG9wICgxOTk1KS4gPGJyPiA8YnI+Ci0KLVtPcGVuR0xdIEouIE5laWRlciwgVC4gRGF2aXMsIE0uIFdvbywgPGVtPiBPcGVuR0wgUHJvZ3JhbW1pbmcgR3VpZGUgPC9lbT4sIEFkZGlzb24tV2VzbGV5IFB1Ymxpc2hpbmcgKDE5OTMpLiA8YnI+IDxicj4KLQotPC9ib2R5PgotPC9odG1sPgotCi0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1RjbDk2L1RjbF9UYWxrLnBkZiBiL3N3aWd3ZWIvcGFwZXJzL1RjbDk2L1RjbF9UYWxrLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU2ZDI3Zi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni9UY2xfVGFsay5wZGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni9maWcxLmdpZiBiL3N3aWd3ZWIvcGFwZXJzL1RjbDk2L2ZpZzEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODBjODcwLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1RjbDk2L2ZpZzEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvaGl0cy5naWYgYi9zd2lnd2ViL3BhcGVycy9UY2w5Ni9oaXRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2FlYTk2OC4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni9oaXRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcGFwZXJzL1RjbDk2L3N0ZWVyMi5naWYgYi9zd2lnd2ViL3BhcGVycy9UY2w5Ni9zdGVlcjIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMmIwMTg3Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcGFwZXJzL1RjbDk2L3N0ZWVyMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni90Y2w5Ni5odG1sIGIvc3dpZ3dlYi9wYXBlcnMvVGNsOTYvdGNsOTYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzJiZGJkYy4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3BhcGVycy9UY2w5Ni90Y2w5Ni5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4NCArMCwwIEBACi08aHRtbD4KLTx0aXRsZT4gU1dJRyA6IEFuIEVhc3kgdG8gVXNlIFRvb2wgRm9yIEludGVncmF0aW5nIFNjcmlwdGludCBMYW5ndWFnZXMgCi13aXRoIEMgYW5kIEMrKyA8L3RpdGxlPgotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+Ci08aDE+Ci1TV0lHIDogQW4gRWFzeSB0byBVc2UgVG9vbCBmb3IgSW50ZWdyYXRpbmcgU2NyaXB0aW5nIExhbmd1YWdlcyAgd2l0aCBDIGFuZCBDKysKLTwvaDE+Ci0KLTxiPiBEYXZpZCBNLiBCZWF6bGV5IDwvYj4gPGJyPgotPGVtPiBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgPGJyPgotVW5pdmVyc2l0eSBvZiBVdGFoIDxicj4KLVNhbHQgTGFrZSBDaXR5LCBVdGFoIDg0MTEyIDxicj4KLWJlYXpsZXlAY3MudXRhaC5lZHUgPGJyPiA8L2VtPgotCi08YnI+IDxicj4KLShQcmVzZW50ZWQgYXQgdGhlIDR0aCBBbm51YWwgVGNsL1RrIFdvcmtzaG9wLCBNb250ZXJleSwgQ0EuIEp1bHkgNi0xMCwgMTk5Ni4gKQotCi08aDI+IEFic3RyYWN0IDwvaDI+Ci0KLTxlbT4KLUkgcHJlc2VudCBTV0lHIChTaW1wbGlmaWVkIFdyYXBwZXIgYW5kIEludGVyZmFjZSBHZW5lcmF0b3IpLCBhCi1wcm9ncmFtIGRldmVsb3BtZW50IHRvb2wgdGhhdCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyB0aGUgYmluZGluZ3MKLWJldHdlZW4gQy9DKysgY29kZSBhbmQgY29tbW9uIHNjcmlwdGluZyBsYW5ndWFnZXMgaW5jbHVkaW5nCi1UY2wsIFB5dGhvbiwgUGVybCBhbmQgR3VpbGUuICBTV0lHIHN1cHBvcnRzIG1vc3QgQy9DKysgZGF0YXR5cGVzCi1pbmNsdWRpbmcgcG9pbnRlcnMsIHN0cnVjdHVyZXMsIGFuZCBjbGFzc2VzLgotVW5saWtlIG1hbnkgb3RoZXIgYXBwcm9hY2hlcywgU1dJRwotdXNlcyBBTlNJIEMvQysrIGRlY2xhcmF0aW9ucyBhbmQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gbWFrZSB2aXJ0dWFsbHkKLW5vIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgQyBjb2RlLgotSW4gYWRkaXRpb24sIFNXSUcgYXV0b21hdGljYWxseQotcHJvZHVjZXMgZG9jdW1lbnRhdGlvbiBpbiBIVE1MLCBMYVRlWCwgb3IgQVNDSUkgZm9ybWF0LgotU1dJRyBoYXMgYmVlbiBwcmltYXJpbHkgZGVzaWduZWQgZm9yIHNjaWVudGlzdHMsIGVuZ2luZWVycywgYW5kIGFwcGxpY2F0aW9uCi1kZXZlbG9wZXJzIHdobyB3b3VsZCBsaWtlIHRvIHVzZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdpdGggdGhlaXIgQy9DKysgcHJvZ3JhbXMKLXdpdGhvdXQgd29ycnlpbmcgYWJvdXQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscwotb2YgZWFjaCBsYW5ndWFnZSBvciB1c2luZyBhIGNvbXBsaWNhdGVkIHNvZnR3YXJlIGRldmVsb3BtZW50IHRvb2wuCi1UaGlzIHBhcGVyIGNvbmNlbnRyYXRlcyBvbiBTV0lHJ3MgdXNlIHdpdGggVGNsL1RrLgotPC9lbT4KLQotPGgyPiAxLiBJbnRyb2R1Y3Rpb24gPC9oMj4KLVNXSUcgKFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvcikKLWlzIGEgc29mdHdhcmUKLWRldmVsb3BtZW50IHRvb2wgdGhhdCBJIG5ldmVyIGludGVuZGVkIHRvIGRldmVsb3AuICAgQXQgdGhlIHRpbWUsCi1JIHdhcyB0cnlpbmcgdG8gYWRkIGEgZGF0YSBhbmFseXNpcyBhbmQgdmlzdWFsaXphdGlvbiBjYXBhYmlsaXR5IHRvCi1hIG1vbGVjdWxhciBkeW5hbWljcyAoTUQpIGNvZGUgSSBoYWQgaGVscGVkIGRldmVsb3AgZm9yIG1hc3NpdmVseQotcGFyYWxsZWwgc3VwZXJjb21wdXRlcnMgYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IFtCZWF6bGV5LExvbWRhaGxdLiAgSSB3YW50ZWQKLXRvIHByb3ZpZGUgYSBzaW1wbGUsIHlldCBmbGV4aWJsZSB1c2VyIGludGVyZmFjZSB0aGF0IGNvdWxkIGJlIHVzZWQKLXRvIGdsdWUgdmFyaW91cyBjb2RlIG1vZHVsZXMgdG9nZXRoZXIgYW5kIGFuIGV4dGVuc2libGUgc2NyaXB0aW5nCi1sYW5ndWFnZSBzZWVtZWQgbGlrZSBhbiBpZGVhbCBzb2x1dGlvbi4gVW5mb3J0dW5hdGVseSB0aGVyZSB3ZXJlIGNvbnN0cmFpbnRzLgotRmlyc3QsIEkgZGlkbid0IHdhbnQgdG8gaGFjayB1cCA0LXllYXJzIG9mIGNvZGUgZGV2ZWxvcG1lbnQgdHJ5aW5nIHRvCi1maXQgb3VyIE1EIGNvZGUgaW50byB5ZXQgYW5vdGhlciBpbnRlcmZhY2Ugc2NoZW1lIChoYXZpbmcgZG9uZSBzbyBzZXZlcmFsCi10aW1lcyBhbHJlYWR5KS4gIFNlY29uZGx5LCB0aGlzIGNvZGUKLXdhcyByb3V0aW5lbHkgcnVuIG9uIHN5c3RlbXMgcmFuZ2luZyBmcm9tIENvbm5lY3Rpb24gTWFjaGluZXMgYW5kIENyYXlzIHRvCi13b3Jrc3RhdGlvbnMgYW5kIEkgZGlkbid0IHdhbnQgdG8gZGVwZW5kIG9uIGFueSBvbmUKLWludGVyZmFjZSBsYW5ndWFnZS0tLW91dCBvZiBmZWFyIHRoYXQgaXQgbWlnaHQgbm90IGJlIHN1cHBvcnRlZCBvbgotYWxsIG9mIHRoZXNlIHBsYXRmb3Jtcy4gIEZpbmFsbHksIHRoZSB1c2VycyB3ZXJlIGNvbnN0YW50bHkgYWRkaW5nCi1uZXcgY29kZSBhbmQgbWFraW5nIG1vZGlmaWNhdGlvbnMuICBJIG5lZWRlZCBhIGZsZXhpYmxlLCB5ZXQgZWFzeSB0byB1c2UKLXN5c3RlbSB0aGF0IGRpZCBub3QgZ2V0IGluIHRoZSB3YXkgb2YgdGhlIHBoeXNpY2lzdHMuIDxicj4gPGJyPgotCi1TV0lHIGlzIG15IHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbS4gIFNpbXBseSBzdGF0ZWQsIFNXSUcgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgYWxsCi1vZiB0aGUgY29kZQotbmVlZGVkIHRvIGJpbmQgQy9DKysgZnVuY3Rpb25zIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlcyB1c2luZyBvbmx5Ci1hIHNpbXBsZSBpbnB1dCBmaWxlIGNvbnRhaW5pbmcgQyBmdW5jdGlvbiBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zLgotQXQgZmlyc3QsIEkgc3VwcG9ydGVkCi1hIHNjcmlwdGluZyBsYW5ndWFnZSBJIGhhZCBkZXZlbG9wZWQgc3BlY2lmaWNhbGx5IGZvciB1c2UKLW9uIG1hc3NpdmVseSBwYXJhbGxlbCBzeXN0ZW1zLiAgTGF0ZXIgSSBkZWNpZGVkIHRvIHJld3JpdGUgU1dJRyBpbiBDKysgYW5kIGV4dGVuZCBpdCB0byBzdXBwb3J0Ci1UY2wsIFB5dGhvbiwgUGVybCwgR3VpbGUgYW5kIG90aGVyIGxhbmd1YWdlcyB0aGF0IGludGVyZXN0ZWQgbWUuICAgSSBhbHNvCi1hZGRlZCBtb3JlIGRhdGEtdHlwZXMsIHN1cHBvcnQgZm9yIHBvaW50ZXJzLCBDKysgY2xhc3NlcywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLCBhbmQKLWEgZmV3IG90aGVyIGZlYXR1cmVzLiA8YnI+IDxicj4KLQotVGhpcyBwYXBlciBwcm92aWRlcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIFNXSUcgCi13aXRoIGEgcGFydGljdWxhciBlbXBoYXNpcyBvbiBUY2wvVGsuIEhvd2V2ZXIsIHRoZSByZWFkZXIgc2hvdWxkCi1yZW1haW4gYXdhcmUgdGhhdCBTV0lHIHdvcmtzIGVxdWFsbHkgd2VsbCB3aXRoCi1QZXJsIGFuZCBvdGhlciBsYW5ndWFnZXMuIEl0IGlzIG5vdCBteSBpbnRlbnQgdG8gcHJvdmlkZQotYSB0dXRvcmlhbCBvciBhIHVzZXIncyBndWlkZSwgYnV0IHJhdGhlciB0byBzaG93Ci1ob3cgU1dJRyBjYW4gYmUgdXNlZCB0byBkbyBpbnRlcmVzdGluZyB0aGluZ3Mgc3VjaCBhcyAKLWFkZGluZyBUY2wvVGsgaW50ZXJmYWNlcyB0byBleGlzdGluZyBDIGFwcGxpY2F0aW9ucywgCi1xdWlja2x5IGRlYnVnZ2luZyBhbmQgcHJvdG90eXBpbmcgQyBjb2RlLAotYW5kIGJ1aWxkaW5nIGludGVyZmFjZS1sYW5ndWFnZS1pbmRlcGVuZGVudCBDIGFwcGxpY2F0aW9ucy4gICAKLQotPGgyPiAyLiBUY2wgYW5kIFdyYXBwZXIgRnVuY3Rpb25zIDwvaDI+Ci0KLUluIG9yZGVyIHRvIGFkZCBhIG5ldyBDIG9yIEMrKyBmdW5jdGlvbiB0byBUY2wsIGl0IGlzIG5lY2Vzc2FyeSB0bwotd3JpdGUgYSBzcGVjaWFsIGBgd3JhcHBlcicnIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLXByZXNlbnRlZCBhcyBBU0NJSSBzdHJpbmdzIGJ5IHRoZSBUY2wgaW50ZXJwcmV0ZXIgaW50byBhIHJlcHJlc2VudGF0aW9uCi10aGF0IGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIEMgZnVuY3Rpb24uICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkCi10byBhZGQgdGhlIGZhY3RvcmlhbCBmdW5jdGlvbiB0byBUY2wsIGEgd3JhcHBlciBmdW5jdGlvbiBtaWdodAotbG9vayBsaWtlIHRoZSBmb2xsb3dpbmcgOiA8YnI+Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotaW50IHdyYXBfZmFjdChDbGllbnREYXRhIGNsaWVudERhdGEsCi0gICAgICAgICAgICAgIFRjbF9JbnRlcnAgKmludGVycCwKLSAgICAgICAgICAgICAgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotICAgIGludCByZXN1bHQ7Ci0gICAgaW50IGFyZzA7Ci0gICAgaWYgKGFyZ2MgIT0gMikgewotICAgICAgICBpbnRlcnAtPnJlc3VsdCA9ICJ3cm9uZyAjIGFyZ3MiOwotICAgICAgICByZXR1cm4gVENMX0VSUk9SOwotICAgIH0KLSAgICBhcmcwID0gYXRvaShhcmd2WzFdKTsKLSAgICByZXN1bHQgPSBmYWN0KGFyZzApOwotICAgIHNwcmludGYoaW50ZXJwLT5yZXN1bHQsIiVkIixyZXN1bHQpOwotICAgIHJldHVybiBUQ0xfT0s7Ci19Ci08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLUluIGFkZGl0aW9uIHRvIHdyaXRpbmcgdGhlIHdyYXBwZXIgZnVuY3Rpb24sIGEgdXNlciB3aWxsIGFsc28gbmVlZCB0byAKLXdyaXRlIGNvZGUgdG8gYWRkIHRoaXMgZnVuY3Rpb24gdG8gdGhlIFRjbCBpbnRlcnByZXRlci4gIEluIHRoZSBjYXNlIG9mCi1UY2wgNy41LCB0aGlzIGNvdWxkIGJlIGRvbmUgYnkgd3JpdGluZyBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0bwotYmUgY2FsbGVkIHdoZW4gdGhlIGV4dGVuc2lvbiBpcyBsb2FkZWQgZHluYW1pY2FsbHkuICAgV2hpbGUgd3JpdGluZwotYSB3cmFwcGVyIGZ1bmN0aW9uIHVzdWFsbHkgaXMgbm90IHRvbyBkaWZmaWN1bHQsIHRoZSBwcm9jZXNzIHF1aWNrbHkKLWJlY29tZXMgdGVkaW91cyBhbmQgZXJyb3IgcHJvbmUgYXMgdGhlIG51bWJlciBvZiBmdW5jdGlvbnMgaW5jcmVhc2VzLgotVGhlcmVmb3JlLCBhdXRvbWF0ZWQgYXBwcm9hY2hlcyBmb3IgcHJvZHVjaW5nIHdyYXBwZXIgZnVuY3Rpb25zIGFyZQotYXBwZWFsaW5nLS1lc3BlY2lhbGx5IHdoZW4gd29ya2luZyB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIEMgZnVuY3Rpb25zCi1vciB3aXRoIEMrKyAoaW4gd2hpY2ggY2FzZSB0aGUgd3JhcHBlciBjb2RlIHRlbmRzIHRvIGdldCBtb3JlIGNvbXBsaWNhdGVkKS4KLQotPGgyPiAzLiBQcmlvciBXb3JrIDwvaDI+Ci0KLVRoZSBpZGVhIG9mIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGluZyB3cmFwcGVyIGNvZGUgaXMgY2VydGFpbmx5IG5vdCBuZXcuCi1Tb21lIGVmZm9ydHMgc3VjaCBhcwotSXRjbCsrLCBPYmplY3QgVGNsLCBvciB0aGUgWFMgbGFuZ3VhZ2UgaW5jbHVkZWQgd2l0aCBQZXJsNSwgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IKLWdlbmVyYXRpbmcgd3JhcHBlciBjb2RlLCBidXQgcmVxdWlyZSB0aGUgdXNlciB0byBwcm92aWRlIGRldGFpbGVkCi1zcGVjaWZpY2F0aW9ucywgdHlwZSBjb252ZXJzaW9uIHJ1bGVzLCBvciB1c2UgYSBzcGVjaWFsaXplZAotc3ludGF4IFtoZWlkcmljaCxXZXRoZXJhbGwscGVybDVdLiAgTGFyZ2UgcGFja2FnZXMKLXN1Y2ggYXMgdGhlIFZpc3VhbGl6YXRpb24gVG9vbGtpdCAodnRrKSBtYXkgdXNlIHRoZWlyIG93biBDL0MrKyB0cmFuc2xhdG9ycywKLWJ1dCB0aGVzZSBhbG1vc3QgYWx3YXlzIHRlbmQgdG8gYmUgc29tZXdoYXQgc3BlY2lhbCBwdXJwb3NlIChpbiBmYWN0LCBTV0lHIHN0YXJ0ZWQKLW91dCBpbiB0aGlzIG1hbm5lcikgW3Z0a10uCi1JZiBzdXBwb3J0aW5nIG11bHRpcGxlIGxhbmd1YWdlcyBpcyB0aGUgdWx0aW1hdGUgZ29hbCwgYSBwcm9ncmFtbWVyIG1pZ2h0Ci1jb25zaWRlciBhIHBhY2thZ2Ugc3VjaCBhcyBJTFUgW0phbnNzZW5dLiAKLVVuZm9ydHVuYXRlbHksCi10aGlzIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHByb3ZpZGUgc3BlY2lmaWNhdGlvbnMgaW4gSURMLS1hIHByb2Nlc3Mgd2hpY2gKLWlzIHVuYXBwZWFsaW5nIHRvIG1hbnkgdXNlcnMuCi1TV0lHIGlzIG5vdCBuZWNlc3NhcmlseSBpbnRlbmRlZCB0byBjb21wZXRlIHdpdGggCi10aGVzZSBhcHByb2FjaGVzLCBidXQgcmF0aGVyIGlzIGRlc2lnbmVkIHRvIGJlIGEgbm8tbm9uc2Vuc2UgdG9vbCB0aGF0Ci1zY2llbnRpc3RzIGFuZCBlbmdpbmVlcnMgY2FuIHVzZSB0byBlYXNpbHkgYWRkIFRjbCBhbmQgb3RoZXIgc2NyaXB0aW5nCi1sYW5ndWFnZXMgdG8gdGhlaXIgb3duIGFwcGxpY2F0aW9ucy4gICBTV0lHIGlzIGFsc28gCi12ZXJ5IGRpZmZlcmVudCB0aGFuIEVtYmVkZGVkIFRrIChFVCkgd2hpY2ggYWxzbyBhaW1zIHRvCi1zaW1wbGlmeSBjb2RlIGRldmVsb3BtZW50IFtFVF0uIFVubGlrZSBFVCwgU1dJRyBpcyBkZXNpZ25lZCB0byAKLWludGVncmF0ZSBDIGZ1bmN0aW9ucyBpbnRvIFRjbC9UayBhcyBvcHBvc2VkIHRvIGludGVncmF0aW5nIFRjbC9UayBpbnRvCi1DIHByb2dyYW1zLgotCi08aDI+IDQuIEEgUXVpY2sgVG91ciBvZiBTV0lHIDwvaDI+Ci0KLTxoMz4gNC4xIE9yZ2FuaXphdGlvbiA8L2gzPgotCi08Y2VudGVyPgotPGltZyBhbHQgPSAiU1dJRyBPcmdhbml6YXRpb24iIHNyYz0iZmlnMS5naWYiPiAgPGJyPgotRmlndXJlIDEgOiBTV0lHIE9yZ2FuaXphdGlvbiA8YnI+IDxicj4KLTwvY2VudGVyPgotCi1GaWd1cmUgMSBzaG93cyB0aGUgc3RydWN0dXJlIG9mIFNXSUcuICBBdCB0aGUgY29yZSBpcyBhIFlBQ0MgcGFyc2VyCi1mb3IgcmVhZGluZyBpbnB1dCBmaWxlcyBhbG9uZyB3aXRoIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMuIAotVG8gZ2VuZXJhdGUgY29kZSwKLXRoZSBwYXJzZXIgY2FsbHMgYWJvdXQgYSBkb3plbiBmdW5jdGlvbnMgZnJvbSBhIGdlbmVyaWMgbGFuZ3VhZ2UKLWNsYXNzIHRvIGRvIHRoaW5ncyBsaWtlIHdyaXRlIGEgd3JhcHBlciBmdW5jdGlvbiwgbGluayBhCi12YXJpYWJsZSwgd3JhcCBhIEMrKyBtZW1iZXIgZnVuY3Rpb24sIGV0Yy4uLiAgRWFjaCB0YXJnZXQgbGFuZ3VhZ2UgaXMKLWltcGxlbWVudGVkIGFzIGEgQysrIGNsYXNzIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IGVtaXQKLXRoZSByZXN1bHRpbmcgQyBjb2RlLiAgIElmIGFuIGBgZW1wdHknJyBsYW5ndWFnZSBkZWZpbml0aW9uIGlzIGdpdmVuCi10byBTV0lHLCBpdCB3aWxsIHByb2R1Y2Ugbm8gb3V0cHV0LiAgIFRodXMsIGVhY2ggbGFuZ3VhZ2UgY2xhc3MgY2FuCi1iZSBpbXBsZW1lbnRlZCBpbiBhbG1vc3QgYW55IG1hbm5lci4KLVRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBpcyBpbXBsZW1lbnRlZCBpbiBhIHNpbWlsYXIgbWFubmVyIGFuZCBjYW4KLWN1cnJlbnRseSBwcm9kdWNlIEFTQ0lJLCBMYVRlWCwgb3IgSFRNTCBvdXRwdXQuICBBcyBvdXRwdXQsCi1TV0lHIHByb2R1Y2VzIGEgQyBmaWxlIHRoYXQgc2hvdWxkIGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgd2l0aCB0aGUgcmVzdCAKLW9mIHRoZSBjb2RlIGFuZCBhIGRvY3VtZW50YXRpb24gZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsYXRlciByZWZlcmVuY2UuCi0KLTxoMz4gNC4yLiBJbnRlcmZhY2UgRmlsZXMgPC9oMz4KLQotQXMgaW5wdXQsIFNXSUcgdGFrZXMgYSBzaW5nbGUgaW5wdXQgZmlsZSByZWZlcnJlZCB0byBhcyBhbiBgYGludGVyZmFjZSBmaWxlLicnCi1UaGlzIGZpbGUgY29udGFpbnMgYSBmZXcgU1dJRyBzcGVjaWZpYyBkaXJlY3RpdmVzLCBidXQgb3RoZXJ3aXNlIGNvbnRhaW5zCi1BTlNJIEMgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gICBVbmxpa2UgdGhlIGFwcHJvYWNoIGluIFtIZWlkcmljaF0sIG5vIHR5cGUgY29udmVyc2lvbiBydWxlcyBhcmUgbmVlZGVkIGFuZCBhbGwgZGVjbGFyYXRpb25zIGFyZSBtYWRlCi11c2luZyBmYW1pbGlhciBBTlNJIEMvQysrIHByb3RvdHlwZXMuICAgIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhbgotaW50ZXJmYWNlIGZpbGUgZm9yIHdyYXBwaW5nIGEgZmV3IEMgZmlsZSBJL08gYW5kIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0vKiBGaWxlIDogZmlsZS5pICovCi0lbW9kdWxlIGZpbGVpbwotJXsKLSNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotJX0KLQotRklMRQkqZm9wZW4oY2hhciAqZmlsZW5hbWUsIGNoYXIgKnR5cGUpOwotaW50CSBmY2xvc2UoRklMRSAqc3RyZWFtKTsKLXR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdAotc2l6ZV90CSBmcmVhZCh2b2lkICpwdHIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgc2l6ZV90IG5vYmosIEZJTEUgKnN0cmVhbSk7Ci1zaXplX3QJIGZ3cml0ZSh2b2lkICpwdHIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgIHNpemVfdCBub2JqLEZJTEUgKnN0cmVhbSk7Ci12b2lkCSptYWxsb2Moc2l6ZV90IG5ieXRlcyk7Ci12b2lkCSBmcmVlKHZvaWQgKik7Ci08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1UaGUgPHR0PiAlbW9kdWxlIDwvdHQ+IGRpcmVjdGl2ZQotc2V0cyB0aGUgbmFtZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICBUaGlzIGlzIG9wdGlvbmFsLCBidXQgaXMKLXJlY29tbWVuZGVkIGlmIGJ1aWxkaW5nIGEgVGNsIDcuNSBtb2R1bGUuCi1FdmVyeXRoaW5nIGluc2lkZSB0aGUgPHR0PiAleywgJX0gPC90dD4KLWJsb2NrIGlzIGNvcGllZCBkaXJlY3RseSBpbnRvIHRoZSBvdXRwdXQsIGFsbG93aW5nIHRoZSBpbmNsdXNpb24gb2YKLWhlYWRlciBmaWxlcyBhbmQgYWRkaXRpb25hbCBDIGNvZGUuCi1BZnRlcndhcmRzLCBDL0MrKyBmdW5jdGlvbiBhbmQgdmFyaWFibGUgZGVjbGFyYXRpb25zIGFyZSBsaXN0ZWQgaW4gYW55Ci1vcmRlci4KLUJ1aWxkaW5nIGEgbmV3IFRjbCBtb2R1bGUgaXMgdXN1YWxseSBhcyAKLWVhc3kgYXMgdGhlIGZvbGxvd2luZyA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotdW5peCA+IHN3aWcgLXRjbCBmaWxlLmkKLXVuaXggPiBnY2MgZmlsZV93cmFwLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUKLXVuaXggPiBsZCAtc2hhcmVkIGZpbGVfd3JhcC5vIC1vIEZpbGVpby5zbwotPC9wcmU+IDwvdHQ+IAotPC9ibG9ja3F1b3RlPgotCi0KLTxoMz4gNC4zLiBBIFRjbCBFeGFtcGxlIDwvaDM+Ci0KLU5ld2x5IGFkZGVkIGZ1bmN0aW9ucyB3b3JrIGxpa2Ugb3JkaW5hcnkgVGNsIHByb2NlZHVyZXMuICBGb3IKLWV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgVGNsIHNjcmlwdCBjb3BpZXMgYSBmaWxlIHVzaW5nIHRoZSBiaW5hcnkKLWZpbGUgSS9PIGZ1bmN0aW9ucyBhZGRlZCBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZSA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotcHJvYyBmaWxlY29weSB7bmFtZTEgbmFtZTJ9IHsKLSAgICBzZXQgYnVmZmVyIFttYWxsb2MgODE5Ml07Ci0gICAgc2V0IGYxIFtmb3BlbiAkbmFtZTEgcl07Ci0gICAgc2V0IGYyIFtmb3BlbiAkbmFtZTIgd107Ci0gICAgc2V0IG5ieXRlcyBbZnJlYWQgJGJ1ZmZlciAxIDgxOTIgJGYxXTsKLSAgICB3aGlsZSB7JG5ieXRlcyA+IDB9IHsKLSAgICAgICAgZndyaXRlICRidWZmZXIgMSAkbmJ5dGVzICRmMjsKLSAgICAgICAgc2V0IG5ieXRlcyBbZnJlYWQgJGJ1ZmZlciAxIDgxOTIgJGYxXTsKLSAgICB9Ci0gICAgZmNsb3NlICRmMTsKLSAgICBmY2xvc2UgJGYyOwotICAgIGZyZWUgJGJ1ZmZlcgotfQotPC9wcmU+IDwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gNC40LiBEYXRhdHlwZXMgYW5kIFBvaW50ZXJzIDwvaDM+Ci0KLVNXSUcgc3VwcG9ydHMgdGhlIGJhc2ljIGRhdGF0eXBlcyBvZiA8dHQ+IGludCwgc2hvcnQsCi1sb25nLCBmbG9hdCwgZG91YmxlLCBjaGFyLCA8L3R0PiBhbmQgPHR0PiB2b2lkIDwvdHQ+Ci1hcyB3ZWxsIGFzIHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlcnMuICBTV0lHCi1hbHNvIGFsbG93cyBkZXJpdmVkIHR5cGVzIHN1Y2ggYXMgcG9pbnRlcnMsIHN0cnVjdHVyZXMsIGFuZCBjbGFzc2VzLAotYnV0IHRoZXNlIGFyZSBhbGwgZW5jb2RlZCBhcyBwb2ludGVycy4gICAgCi1JZiBhbiB1bmtub3duIHR5cGUgaXMgZW5jb3VudGVyZWQsIFNXSUcgYXNzdW1lcwotdGhhdCBpdCBpcyBhIGNvbXBsZXggZGF0YXR5cGUgdGhhdCBoYXMgYmVlbiBkZWZpbmVkIGVhcmxpZXIuCi1ObyBhdHRlbXB0IGlzIG1hZGUgdG8gZmlndXJlIG91dCB3aGF0IGRhdGEgdGhhdCBkYXRhdHlwZSBhY3R1YWxseSBjb250YWlucwotb3IgaG93IGl0IHNob3VsZCBiZSB1c2VkLiAgT2YgY291cnNlLCB0aGlzIHRoaXMgaXMgb25seSBwb3NzaWJsZQotc2luY2UgU1dJRydzIG1hcHBpbmcgb2YgY29tcGxleCB0eXBlcyBpbnRvIHBvaW50ZXJzIGFsbG93cyB0aGVtCi10byBiZSBoYW5kbGVkIGluIGEgdW5pZm9ybSBtYW5uZXIuIAotQXMgYSByZXN1bHQsIFNXSUcgZG9lcyBub3Qgbm9ybWFsbHkgbmVlZCBhbnkgc29ydAotb2YgdHlwZS1tYXBwaW5nLCBidXQgPHR0PiB0eXBlZGVmIDwvdHQ+IGNhbiBiZSB1c2VkIHRvIG1hcCBhbnkgb2YgdGhlIGJ1aWx0LWluCi1kYXRhdHlwZXMgdG8gbmV3IHR5cGVzIGlmIGRlc2lyZWQuIDxicj4gPGJyPgotCi1TV0lHIGVuY29kZXMgcG9pbnRlcnMgYXMgaGV4YWRlY2ltYWwgc3RyaW5ncyB3aXRoIHR5cGUtaW5mb3JtYXRpb24uICBUaGlzCi10eXBlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSBhIHJ1bi10aW1lIHR5cGUgY2hlY2tpbmcgbWVjaGFuaXNtLgotVGh1cywgYSB0eXBpY2FsIFNXSUcgcG9pbnRlciBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIDogPGJyPiA8YnI+Ci0KLTxjZW50ZXI+Ci08dHQ+IF8xMDA4ZTYxNF9WZWN0b3JfcCA8L3R0PiA8YnI+IDxicj4KLTwvY2VudGVyPgotCi1JZiB0aGlzIHBvaW50ZXIgaXMgcGFzc2VkIGludG8gYSBmdW5jdGlvbiByZXF1aXJpbmcgc29tZSBvdGhlciBraW5kIG9mCi1wb2ludGVyLCBTV0lHIHdpbGwgZ2VuZXJhdGUgYSBUY2wgZXJyb3IgYW5kIHJldHVybiBhbiBlcnJvciBtZXNzYWdlLgotVGhlIE5VTEwgcG9pbnRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nICJOVUxMIi4gICBUaGUgU1dJRyBydW4tdGltZQotdHlwZSBjaGVja2VyIGlzIHNhYXZ5IHRvIHR5cGVkZWZzIGFuZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYmFzZSBjbGFzc2VzCi1hbmQgZGVyaXZlZCBjbGFzc2VzIGluIEMrKy4gVGh1cyBpZiBhCi11c2VyIHNwZWNpZmllcyA8YnI+IDxicj4KLQotPGNlbnRlcj4KLTx0dD4gdHlwZWRlZiBkb3VibGUgUmVhbDsgPC90dD4gPGJyPiA8YnI+Ci08L2NlbnRlcj4KLQotdGhlIHR5cGUgY2hlY2tlciBrbm93cyB0aGF0IDx0dD4gUmVhbCAqIDwvdHQ+ICBhbmQgPHR0PiBkb3VibGUgKiA8L3R0PgotYXJlIGVxdWl2YWxlbnQgKG1vcmUgb24gQysrIGluIGEgbWludXRlKS4KLUZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2Ygb3RoZXIgVGNsIGV4dGVuc2lvbnMsCi1TV0lHIHBvaW50ZXJzIHNob3VsZCBiZSBzZWVuIGFzIHNwZWNpYWwgImhhbmRsZXMiIGV4Y2VwdCB0aGF0IHRoZXkgCi1oYXBwZW4gdG8gY29udGFpbiB0aGUgcG9pbnRlciB2YWx1ZSBhbmQgaXRzIHR5cGUuIDxicj4gPGJyPgotCi1UbyBzb21lLCB0aGlzIGFwcHJvYWNoIG1heSBzZWVtIGhvcnJpYmx5IHJlc3RyaWN0aXZlIChvciBlcnJvciBwcm9uZSksCi1idXQga2VlcCBpbiBtaW5kIHRoYXQgU1dJRyB3YXMgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIHdvcmsgd2l0aAotZXhpc3RpbmcgQyBhcHBsaWNhdGlvbnMuICBTaW5jZSBtb3N0IEMgcHJvZ3JhbXMgcGFzcyBjb21wbGV4IGRhdGF0eXBlcwotYXJvdW5kIGJ5IHJlZmVyZW5jZSB0aGlzIHRlY2huaXF1ZSB3b3JrcyByZW1hcmthYmx5IHdlbGwgaW4gcHJhY3RpY2UuCi1SdW4gdGltZSB0eXBlLWNoZWNraW5nIGFsc28gZWxpbWluYXRlcyBtb3N0IGNvbW1vbiBjcmFzaGVzIGJ5IGNhdGNoaW5nCi1zdHVwaWQgbWlzdGFrZXMgc3VjaCBhcyB1c2luZyBhIHdyb25nIHZhcmlhYmxlIG5hbWUgb3IgZm9yZ2V0dGluZyB0aGUKLSIkIiBjaGFyYWN0ZXIgaW4gYSBUY2wgc2NyaXB0LiAgICBXaGlsZSBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBjcmFzaCBUY2wgYnkgZm9yZ2luZyBhCi1TV0lHIHBvaW50ZXIgdmFsdWUgKG9yIG1ha2luZyBhIGNhbGwgdG8gYnVnZ3kgQyBjb2RlKSwgaXQgaXMgd29ydGgKLWVtcGhhc2l6aW5nIHRoYXQgZXhpc3RpbmcgVGNsIGV4dGVuc2lvbnMKLW1heSBhbHNvIGNyYXNoIGlmIGdpdmVuIGFuIGludmFsaWQgaGFuZGxlLgotCi08aDM+IDQuNS4gR2xvYmFsIFZhcmlhYmxlcyBhbmQgQ29uc3RhbnRzIDwvaDM+Ci0KLVNXSUcgY2FuIGluc3RhbGwgZ2xvYmFsIEMgdmFyaWFibGVzIGFuZCBjb25zdGFudHMgdXNpbmcgVGNsJ3MgdmFyaWFibGUgbGlua2FnZQotbWVjaGFuaXNtLgotVmFyaWFibGVzIG1heSBhbHNvIGJlIGRlY2xhcmVkIGFzIGBgcmVhZCBvbmx5JycgCi13aXRoaW4gdGhlIFRjbCBpbnRlcnByZXRlci4gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cwotaG93IHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzIGNhbiBiZSBhZGRlZCB0byBUY2wgOgotCi08YmxvY2txdW90ZT4KLTx0dD4gPHByZT4KLS8vIFNXSUcgZmlsZSB3aXRoIHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzCi0lewotJX0KLQotLy8gU29tZSBnbG9iYWwgdmFyaWFibGVzCi1leHRlcm4gIGludCBNeV92YXJpYWJsZTsgICAgIAotZXh0ZXJuICBjaGFyICpkZWZhdWx0X3BhdGg7Ci1leHRlcm4gIGRvdWJsZSBNeV9kb3VibGU7Ci0KLS8vIFNvbWUgY29uc3RhbnRzCi0jZGVmaW5lICBQSSAgICAgMy4xNDE1OTI2NTM1OQotI2RlZmluZSAgUElfNCAgIFBJLzQuMAotZW51bSBjb2xvcnMge3JlZCxibHVlLGdyZWVufTsKLWNvbnN0IGludCBTSVpFT0ZfVkVDVE9SID0gc2l6ZW9mKFZlY3Rvcik7Ci0KLS8vIEEgcmVhZCBvbmx5IHZhcmlhYmxlCi0lcmVhZG9ubHkKLWV4dGVybiBpbnQgU3RhdHVzOwotJXJlYWR3cml0ZQotCi08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gNC42LiBDKysgU3VwcG9ydCA8L2gzPgotCi1UaGUgU1dJRyBwYXJzZXIgY2FuIGhhbmRsZSBzaW1wbGUgQysrIGNsYXNzIGRlZmluaXRpb25zIGFuZCBzdXBwb3J0cyBwdWJsaWMKLWluaGVyaXRhbmNlLCB2aXJ0dWFsIGZ1bmN0aW9ucywgc3RhdGljIGZ1bmN0aW9ucywgY29uc3RydWN0b3JzIGFuZAotZGVzdHJ1Y3RvcnMuICAgIEN1cnJlbnRseSwgQysrIHRyYW5zbGF0aW9uIGlzIHBlcmZvcm1lZAotYnkgcG9saXRlbHkgdHJhbmZvcm1pbmcgQysrIGNvZGUgaW50byBDIGNvZGUgYW5kIGdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yIHRoZQotQyBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBTV0lHIGludGVyZmFjZSBmaWxlCi1jb250YWluaW5nIGEgQysrIGNsYXNzIGRlZmluaXRpb246Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotJW1vZHVsZSB0cmVlCi0lewotI2luY2x1ZGUgInRyZWUuaCIKLSV9Ci0KLWNsYXNzIFRyZWUgewotcHVibGljOgotICAgVHJlZSgpOwotICB+VHJlZSgpOwotICAgdm9pZCAgaW5zZXJ0KGNoYXIgKml0ZW0pOwotICAgaW50ICAgc2VhcmNoKGNoYXIgKml0ZW0pOwotICAgaW50ICAgcmVtb3ZlKGNoYXIgKml0ZW0pOwotc3RhdGljIHZvaWQgcHJpbnQoVHJlZSAqdCk7ICAgCi19OwotPC9wcmU+Ci08L3R0PgotPC9ibG9ja3F1b3RlPgotCi1XaGVuIHRyYW5zbGF0ZWQsIHRoZSBjbGFzcyB3aWxsIGJlIGFjY2VzcyB1c2VkIHRoZSBmb2xsb3dpbmcgc2V0IG9mCi1mdW5jdGlvbnMgKGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBTV0lHKS4KLQotPGJsb2NrcXVvdGU+Ci08dHQ+Ci08cHJlPgotVHJlZSAqbmV3X1RyZWUoKTsKLXZvaWQgZGVsZXRlX1RyZWUoVHJlZSAqdGhpcyk7Ci12b2lkIFRyZWVfaW5zZXJ0KFRyZWUgKnRoaXMsIGNoYXIgKml0ZW0pOwotaW50ICBUcmVlX3NlYXJjaChUcmVlICp0aGlzLCBjaGFyICppdGVtKTsKLWludCAgVHJlZV9yZW1vdmUoVHJlZSAqdGhpcywgY2hhciAqaXRlbSk7Ci12b2lkIFRyZWVfcHJpbnQoVHJlZSAqdCk7Ci08L3ByZT4KLTwvdHQ+Ci08L2Jsb2NrcXVvdGU+Ci0KLQotQWxsIEMrKyBmdW5jdGlvbnMgd3JhcHBlZCBieSBTV0lHIGV4cGxpY2l0bHkgcmVxdWlyZSB0aGUgPHR0PiB0aGlzIDwvdHQ+IHBvaW50ZXIKLWFzIHNob3duLiAgVGhpcyBhcHByb2FjaCBoYXMgdGhlIGFkdmFudGFnZSBvZiB3b3JraW5nIGZvciBhbGwgb2YgdGhlIHRhcmdldAotbGFuZ3VhZ2VzLiAgSXQgYWxzbyBtYWtlcyBpdCBlYXNpZXIgdG8gcGFzcyBvYmplY3RzIGJldHdlZW4KLW90aGVyIEMrKyBmdW5jdGlvbnMgc2luY2UgZXZlcnkgQysrIG9iamVjdCBpcyBzaW1wbHkgcmVwcmVzZW50ZWQgYXMgYSBTV0lHIHBvaW50ZXIuICAgU1dJRyBkb2VzIG5vdCBzdXBwb3J0IGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCBidXQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMKLWNhbiBiZSByZXNvbHZlZCBieSByZW5hbWluZyB0aGVtIHdpdGggdGhlIFNXSUcgPHR0PiAlbmFtZSA8L3R0PiBkaXJlY3RpdmUgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci1jbGFzcyBMaXN0IHsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgIExpc3QoKTsKLSVuYW1lKExpc3RNYXgpIExpc3QoaW50IG1heHNpemUpOwotLi4uCi19OwotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotVGhlIGFwcHJvYWNoIHVzZWQgYnkgU1dJRyBpcwotcXVpdGUgZGlmZmVyZW50IHRoYW4gdGhhdCB1c2VkIGluIHN5c3RlbXMgc3VjaCBhcwotT2JqZWN0IFRjbCBvciB2dGsgW3Z0ayxXZXRoZXJhbGxdLiAgQXMgYSByZXN1bHQsIHVzZXJzIG9mIHRob3NlIHN5c3RlbXMKLW1heSBmaW5kIGl0IHRvIGJlIGNvbmZ1c2luZy4gIEhvd2V2ZXIsCi1JdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBtb2R1bGFyIGRlc2lnbiBvZgotU1dJRyBhbGxvd3MgdGhlIHVzZXIgdG8gY29tcGxldGVseSByZWRlZmluZSB0aGUgb3V0cHV0IGJlaGF2aW9yIG9mCi10aGUgc3lzdGVtLiAgVGh1cywgd2hpbGUgdGhlIGN1cnJlbnQgQysrIGltcGxlbWVudGF0aW9uIGlzIHF1aXRlIGRpZmZlcmVudAotdGhhbiBvdGhlciBzeXN0ZW1zIHN1cHBvcnRpbmcgQysrLCBpdCB3b3VsZCBiZSBlbnRpcmVseSBwb3NzaWJsZQotd3JpdGUgYSBuZXcgU1dJRyBtb2R1bGUgdGhhdCB3cmFwcGVkIEMrKyBjbGFzc2VzIGludG8gYSByZXByZXNlbnRhdGlvbgotc2ltaWxhciB0byB0aGF0IHVzZWQgYnkgT2JqZWN0IFRjbCAoaW4gZmFjdCwgaW4gbWlnaHQgZXZlbiBiZSBwb3NzaWJsZQotdG8gdXNlIFNXSUcgdG8gcHJvZHVjZSB0aGUgaW5wdXQgZmlsZXMgdXNlZCBmb3IgT2JqZWN0IFRjbCkuCi0KLTxoMz4gNC43LiBNdWx0aXBsZSBGaWxlcyBhbmQgQ29kZSBSZXVzZSA8L2gzPgotCi1BbiBlc3NlbnRpYWwgZmVhdHVyZSBvZiBTV0lHIGlzIGl0cyBzdXBwb3J0IGZvciBtdWx0aXBsZSBmaWxlcwotYW5kIG1vZHVsZXMuICAgQSBTV0lHIGludGVyZmFjZSBmaWxlIG1heSBpbmNsdWRlIGFub3RoZXIgaW50ZXJmYWNlCi1maWxlIHVzaW5nIHRoZSAiPHR0PiAlaW5jbHVkZSA8L3R0PiIgZGlyZWN0aXZlLiAgICBUaHVzLCBhbiBpbnRlcmZhY2UKLWZvciBhIGxhcmdlIHN5c3RlbSBtaWdodCBiZSBicm9rZW4gdXAgaW50byBhIGNvbGxlY3Rpb24gb2Ygc21hbGxlcgotbW9kdWxlcyBhcyBzaG93biAKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0lbW9kdWxlIHBhY2thZ2UKLSV7Ci0jaW5jbHVkZSAicGFja2FnZS5oIgotJX0KLQotJWluY2x1ZGUgZ2VvbWV0cnkuaQotJWluY2x1ZGUgbWVtb3J5LmkKLSVpbmNsdWRlIG5ldHdvcmsuaQotJWluY2x1ZGUgZ3JhcGhpY3MuaQotJWluY2x1ZGUgcGh5c2ljcy5pCi0KLSVpbmNsdWRlIHdpc2guaQotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotQ29tbW9uIG9wZXJhdGlvbnMgY2FuIGJlIHBsYWNlZCBpbnRvIGEgU1dJRyBsaWJyYXJ5IGZvciB1c2UgaW4KLWFsbCBhcHBsaWNhdGlvbnMuICBGb3IgZXhhbXBsZSwgdGhlIDx0dD4gJWluY2x1ZGUgd2lzaC5pIDwvdHQ+IGRpcmVjdGl2ZQotdGVsbHMgU1dJRyB0byBpbmNsdWRlIGNvZGUgZm9yIHRoZSA8dHQ+IFRjbF9BcHBJbml0KCkgPC90dD4gZnVuY3Rpb24KLW5lZWRlZCB0byByZWJ1aWxkIHRoZSA8dHQ+IHdpc2ggPC90dD4gcHJvZ3JhbS4gIFRoZSBsaWJyYXJ5IGNhbiBhbHNvIGJlCi11c2VkIHRvIGJ1aWxkIG1vZHVsZXMKLWFsbG93aW5nIFNXSUcgdG8gYmUgdXNlZCB3aXRoIGNvbW1vbiBUY2wgZXh0ZW5zaW9ucyBzdWNoCi1hcyBFeHBlY3QgW0V4cGVjdF0uIE9mIGNvdXJzZSwgdGhlIHByaW1hcnkgdXNlIG9mIHRoZSBsaWJyYXJ5IGlzIHdpdGgKLWxhcmdlIGFwcGxpY2F0aW9ucyBzdWNoIGFzIE9wZW4tSW52ZW50b3Igd2hpY2ggY29udGFpbiBodW5kcmVkcyBvZgotbW9kdWxlcyBhbmQgYSBzdWJzdGFudGlhbCBjbGFzcyBoaWVyYXJjaHkgW0ludmVudF0uICAgSW4gdGhpcyBjYXNlIGEgdXNlcgotY291bGQgdXNlIFNXSUcncyBpbmNsdWRlIG1lY2hhbmlzbSB0byBzZWxlY3RpdmVseSBwaWNrIHdoaWNoIG1vZHVsZXMKLXRoZXkgd2FudGVkIHRvIHVzZSBmb3IgYSBwYXJ0aWN1bGFyIHByb2JsZW0uCi0KLTxoMz4gNC44LiBUaGUgRG9jdW1lbnRhdGlvbiBTeXN0ZW0gPC9oMz4KLQotU1dJRyBwcm9kdWNlcyBkb2N1bWVudGF0aW9uIGluIEFTQ0lJLCBMYVRlWCwgb3IgSFRNTAotZm9ybWF0IGRlc2NyaWJpbmcgZXZlcnl0aGluZyB0aGF0IHdhcyB3cmFwcGVkLiAgVGhlIGRvY3VtZW50YXRpb24KLWZvbGxvd3MgdGhlIHN5bnRheCBydWxlcyBvZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGFuZCBjYW4KLWNhbiBiZSBmdXJ0aGVyIGVuaGFuY2VkIGJ5IGFkZGluZyBkZXNjcmlwdGlvbnMgaW4gYSBDL0MrKyBjb21tZW50Ci1pbW1lZGlhdGVseSBmb2xsb3dpbmcgYSBkZWNsYXJhdGlvbi4gIFRoZXNlIGNvbW1lbnRzIG1heSBhbHNvIGNvbnRhaW4KLWVtYmVkZGVkIExhVGVYIG9yIEhUTUwgY29tbWFuZHMuICBGb3IgZXhhbXBsZToKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci1leHRlcm4gc2l6ZV90IGZyZWFkKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgc2l6ZV90IG5vYmosIEZJTEUgKnN0cmVhbSk7Ci0vKiB7XHR0IGZyZWFkfSByZWFkcyBmcm9tIHtcdHQgc3RyZWFtfSBpbnRvCi10aGUgYXJyYXkge1x0dCBwdHJ9IGF0IG1vc3Qge1x0dCBub2JqfSBvYmplY3RzCi1vZiBzaXplIHtcdHQgc2l6ZX0uICAge1x0dCBmcmVhZH0gcmV0dXJucwotdGhlIG51bWJlciBvZiBvYmplY3RzIHJlYWQuICovCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1XaGVuIG91dHB1dCBieSBTV0lHIGFuZCBwcm9jZXNzZWQgYnkgTGFUZVgsIHRoaXMgYXBwZWFycyBhcyBmb2xsb3dzIDoKLQotPHVsPgotPHR0PiBzaXplX3QgOiBmcmVhZCBwdHIgc2l6ZSBub2JqIHN0cmVhbSA8L3R0PiA8YnI+Ci08dWw+Ci0gICAgIDx0dD4gZnJlYWQgPC90dD4gcmVhZHMgZnJvbSA8dHQ+IHN0cmVhbSA8L3R0PiBpbnRvIHRoZSBhcnJheSA8dHQ+IHB0ciA8L3R0PiBhdAotICAgICBtb3N0IDx0dD4gbm9iaiA8L3R0PiBvYmplY3RzIG9mIHNpemUgPHR0PiBzaXplIDwvdHQ+LiAgPHR0PiBmcmVhZCA8L3R0PiAKLSAgICByZXR1cm5zCi0gICAgIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyByZWFkLiAKLTwvdWw+Ci08L3VsPgotCi08aDM+IDQuOS4gRXh0ZW5kaW5nIHRoZSBTV0lHIFN5c3RlbSA8L2gzPgotCi1GaW5hbGx5LCBTV0lHIGl0c2VsZiBjYW4gYmUgZXh0ZW5kZWQgYnkgdGhlIHVzZXIgdG8gcHJvdmlkZSBuZXcKLWZ1bmN0aW9uYWxpdHkuICAgIFRoaXMgaXMgZG9uZSBieSBtb2RpZnlpbmcgYW4gZXhpc3Rpbmcgb3IgY3JlYXRpbmcgYQotbmV3IGxhbmd1YWdlIGNsYXNzLiAgIEEgdHlwaWNhbCBjbGFzcyBtdXN0IHNwZWNpZnkgdGhlIGZvbGxvd2luZwotZnVuY3Rpb25zIHRoYXQgZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgcGFyc2VyIG91dHB1dCA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotLy8gRmlsZSA6IHN3aWd0Y2wuaAotY2xhc3MgVENMIDogcHVibGljIExhbmd1YWdlIHsKLXByaXZhdGU6Ci0gIC8vIFB1dCBwcml2YXRlIHN0dWZmIGhlcmUKLXB1YmxpYyA6Ci0gIFRDTCgpOwotICBpbnQgbWFpbihpbnQsIGNoYXIgKmFyZ3ZbXSk7Ci0gIHZvaWQgY3JlYXRlX2Z1bmN0aW9uKGNoYXIgKixjaGFyICosRGF0YVR5cGUqLAotICAgICAgICAgICAgICAgICAgICAgICBQYXJtTGlzdCAqKTsKLSAgdm9pZCBsaW5rX3ZhcmlhYmxlKGNoYXIgKixjaGFyICosRGF0YVR5cGUgKik7Ci0gIHZvaWQgZGVjbGFyZV9jb25zdChjaGFyICosaW50LGNoYXIgKik7Ci0gIHZvaWQgaW5pdGlhbGl6ZSh2b2lkKTsKLSAgdm9pZCBoZWFkZXJzKHZvaWQpOwotICB2b2lkIGNsb3NlKHZvaWQpOwotICB2b2lkIHVzYWdlX3ZhcihjaGFyICosRGF0YVR5cGUqLGNoYXIgKiopOwotICB2b2lkIHVzYWdlX2Z1bmMoY2hhciAqLERhdGFUeXBlKixQYXJtTGlzdCosCi0gICAgICAgICAgICAgICAgICBjaGFyICoqKTsKLSAgdm9pZCB1c2FnZV9jb25zdChjaGFyICosaW50LGNoYXIqLGNoYXIqKik7Ci0gIHZvaWQgc2V0X21vZHVsZShjaGFyICopOwotICB2b2lkIHNldF9pbml0KGNoYXIgKik7Ci19OwotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotRGVzY3JpcHRpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgaW4gdGhlIFNXSUcKLXVzZXJzIG1hbnVhbC4gICBUbyBidWlsZCBhIG5ldyB2ZXJzaW9uIG9mIFNXSUcsIHRoZSB1c2VyCi1vbmx5IG5lZWRzIHRvIHByb3ZpZGUgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBhIG1haW4KLXByb2dyYW0gd2hpY2ggbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyA6Ci0KLTxibG9ja3F1b3RlPgotPHR0PiA8cHJlPgotCi0vLyBTV0lHIG1haW4gcHJvZ3JhbQotCi0jaW5jbHVkZSAic3dpZy5oIgotI2luY2x1ZGUgInN3aWd0Y2wuaCIKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0KLSAgTGFuZ3VhZ2UgKmxhbmc7Ci0KLSAgbGFuZyA9IG5ldyBUQ0w7Ci0gIFNXSUdfbWFpbihhcmdjLGFyZ3YsbGFuZywoRG9jdW1lbnRhdGlvbiAqKSAwKTsKLQotfQotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotV2hlbiBsaW5rZWQgd2l0aCBhIGxpYnJhcnkgZmlsZSwgYW55IGV4dGVuc2lvbnMgYW5kCi1tb2RpZmljYXRpb25zIGNhbiBub3cgYmUgdXNlZCB3aXRoIHRoZSBTV0lHIHBhcnNlci4gIFdoaWxlCi13cml0aW5nIGEgbmV3IGxhbmd1YWdlIGRlZmluaXRpb24gaXMgbm90IGVudGlyZWx5IHRyaXZpYWwsCi1pdCBjYW4gdXN1YWxseSBiZSBkb25lIGJ5IGp1c3QgY29weWluZyBvbmUgb2YgdGhlIGV4aXN0aW5nCi1tb2R1bGVzIGFuZCBtb2RpZnlpbmcgaXQgYXBwcm9wcmlhdGVseS4gICAKLQotPGgyPiA1LiBFeGFtcGxlcyA8L2gyPgotCi08aDM+IDUuMS4gQSBDLVRjbCBMaW5rZWQgTGlzdCA8L2gzPgotCi1TV0lHIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHNpbXBsZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBhcmUgdXN1YWJsZSBpbiAKLWJvdGggQyBhbmQgVGNsLiAgIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhIFNXSUcgaW50ZXJmYWNlIGZpbGUgZm9yCi1idWlsZGluZyBhIHNpbXBsZSBsaW5rZWQgbGlzdC4KLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0vKiBGaWxlIDogbGlzdC5pICovCi0lewotc3RydWN0IE5vZGUgewotICBOb2RlKGNoYXIgKm4pIHsKLSAgICBuYW1lID0gbmV3IGNoYXJbc3RybGVuKG4pKzFdOwotICAgIHN0cmNweShuYW1lLG4pOwotICAgIG5leHQgPSAwOwotICB9OwotICBjaGFyICAqbmFtZTsKLSAgTm9kZSAqbmV4dDsKLX07Ci0lfQotCi0vLyBKdXN0IGFkZCBzdHJ1Y3QgZGVmaW5pdGlvbiB0bwotLy8gdGhlIGludGVyZmFjZSBmaWxlLgotCi1zdHJ1Y3QgTm9kZSB7Ci0gIE5vZGUoY2hhciAqKTsKLSAgY2hhciAqbmFtZTsKLSAgTm9kZSAqbmV4dDsKLX07Ci0KLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVdoZW4gdXNlZCBpbiBhIFRjbCBzY3JpcHQsIHdlIGNhbiBub3cgY3JlYXRlIG5ldyBub2RlcyBhbmQgYWNjZXNzCi1pbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIDx0dD4gTm9kZSA8L3R0PiBzdHJ1Y3R1cmUuICAgSW4gZmFjdCwgd2UgY2FuCi13cml0ZSBjb2RlIHRvIGNvbnZlcnQgYmV0d2VlbiBUY2wgbGlzdHMgYW5kIGxpbmtlZCBsaXN0cyBlbnRpcmVseQotaW4gVGNsIGFzIHNob3duIDoKLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0jIEJ1aWxkcyBsaW5rZWQgbGlzdCBmcm9tIGEgVGNsIGxpc3QKLXByb2MgYnVpbGRsaXN0IHtsaXN0IGhlYWR9IHsKLSAgICBzZXQgbml0ZW1zIFtsbGVuZ3RoICRsaXN0XTsKLSAgICBmb3Ige3NldCBpIDB9IHskaSAmbHQ7ICRuaXRlbXN9IHtpbmNyIGkgLTF9IHsKLSAgICAgICAgc2V0IGl0ZW0gW2xyYW5nZSAkbGlzdCAkaSAkaV0gCi0gICAgICAgIHNldCBuIFtuZXdfTm9kZSAkaXRlbV0gICAgICAgIAotICAgICAgICBOb2RlX3NldF9uZXh0ICRuICRoZWFkICAgICAgICAKLSAgICAgICAgc2V0IGhlYWQgJG4gICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIHJldHVybiAkaGVhZAotfQotIyBCdWlsZHMgYSBUY2wgbGlzdCBmcm9tIGEgbGlua2VkIGxpc3QKLXByb2MgZ2V0X2xpc3Qge2xsaXN0fSB7Ci0gICAgc2V0IGxpc3Qge30gCi0gICAgd2hpbGUgeyRsbGlzdCAhPSAiTlVMTCJ9IHsKLSAgICAgICAgbGFwcGVuZCBsaXN0IFtOb2RlX25hbWVfZ2V0ICRsbGlzdF0KLSAgICAgICAgc2V0IGxsaXN0IFtOb2RlX2dldF9uZXh0ICRsbGlzdF0gICAKLSAgICB9Ci0gICAgcmV0dXJuICRsaXN0ICAgICAgICAgICAgICAgICAgICAgIAotfQotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotV2hlbiBydW4gaW50ZXJhY3RpdmVseSwgd2UgY291bGQgbm93IHVzZSBvdXIgVGNsIGZ1bmN0aW9ucyBhcwotZm9sbG93cy4KLQotPGJsb2NrcXVvdGU+Ci08dHQ+IDxwcmU+Ci0lIHNldCBsIHtKb2huIEFubmUgTWFyeSBKaW19Ci1Kb2huIEFubmUgTWFyeSBKaW0KLSUgc2V0IGxsIFtidWlsZGxpc3QgJGwgXzBfTm9kZV9wXSAgICAgICAgICAgCi1fMTAwMGNhYjhfTm9kZV9wCi0lIGdldF9saXN0ICRsbAotSmltIE1hcnkgQW5uZSBKb2huCi0lIHNldCBsbCBbYnVpbGRsaXN0IHtNaWtlIFBldGVyIERhdmV9ICRsbF0KLV8xMDAwY2MzOF9Ob2RlX3AKLSUgZ2V0X2xpc3QgJGxsCi1EYXZlIFBldGVyIE1pa2UgSmltIE1hcnkgQW5uZSBKb2huCi0lIAotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLUFzaWRlIGZyb20gdGhlIHBvaW50ZXIgdmFsdWVzLCBvdXIgc2NyaXB0IGFjdHMgbGlrZSBhbnkgb3RoZXIKLVRjbCBzY3JpcHQuICAgSG93ZXZlciwgd2UgaGF2ZSBidWlsdCB1cCBhIHJlYWwKLUMgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb3VsZCBiZSBlYXNpbHkgcGFzc2VkIHRvIG90aGVyIEMgZnVuY3Rpb25zCi1pZiBuZWVkZWQuCi0KLTxoMz4gNS4yLiBVc2luZyBDIERhdGEtU3RydWN0dXJlcyB3aXRoIFRrIDwvaDM+Ci0KLUluIG1hbm5lciBzaW1pbGFyIHRvIHRoZSBsaW5rZWQgbGlzdCBleGFtcGxlLCBUY2wvVGsgY2FuIGJlIHVzZWQKLXRvIGJ1aWxkIGNvbXBsZXggQy9DKysgZGF0YSBzdHJ1Y3R1cmVzLiAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHdlCi13YW50ZWQgdG8gaW50ZXJhY3RpdmVseSBidWlsZCBhIGdyYXBoIG9mIGBgTm9kZXMnJyBmb3IgdXNlIGluIGEgQwotYXBwbGljYXRpb24uCi1BIHR5cGljYWwgaW50ZXJmYWNlIGZpbGUgbWlnaHQgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLQotPGJsb2NrcXVvdGU+IDx0dD4gPHByZT4KLSV7Ci0jaW5jbHVkZSAibm9kZXMuaCIKLSV9Ci0KLSVpbmNsdWRlIHdpc2gKLWV4dGVybiBOb2RlICpuZXdfbm9kZSgpOyAgICAgICAgICAgICAgICAgCi1leHRlcm4gdm9pZCBBZGRFZGdlKE5vZGUgKm4xLCBOb2RlICpuMik7IAotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotV2l0aGluIGEgVGNsL1RrIHNjcmlwdCwgbG9vc2VseSBiYXNlZCBvbiBvbmUgdG8gbWFrZSBiYWxsIGFuZCBzdGljayBncmFwaHMKLWluIFtPdXN0ZXJob3V0XSwgYSBncmFwaCBjb3VsZCBiZSBidWlsdCBhcyBmb2xsb3dzOgotCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotcHJvYyBtYWtlTm9kZSB7eCB5fSB7Ci0gICBnbG9iYWwgbm9kZVggbm9kZVkgbm9kZVAgZWRnZUZpcnN0IGVkZ2VTZWNvbmQKLSAgIHNldCBuZXcgWy5jcmVhdGUgb3ZhbCBbZXhwciAkeC0xNV0gXAotICAgICAgICAgICBbZXhwciAkeS0xNV0gW2V4cHIgJHgrMTVdIFwKLSAgICAgICAgICAgW2V4cHIgJHkrMTVdIC1vdXRsaW5lIGJsYWNrIFwKLSAgICAgICAgICAgLWZpbGwgd2hpdGUgLXRhZ3Mgbm9kZV0KLSAgIHNldCBuZXdub2RlIFtuZXdfbm9kZV0gICAgICAgICAgIAotICAgc2V0IG5vZGVYKCRuZXcpICR4Ci0gICBzZXQgbm9kZVkoJG5ldykgJHkKLSAgIHNldCBub2RlUCgkbmV3KSAkbmV3bm9kZSAgICAgICAgIAotICAgc2V0IGVkZ2VGaXJzdCgkbmV3KSB7fQotICAgc2V0IGVkZ2VTZWNvbmQoJG5ldykge30KLX0KLXByb2MgbWFrZUVkZ2Uge2ZpcnN0IHNlY29uZH0gewotICAgZ2xvYmFsIG5vZGVYIG5vZGVZIG5vZGVQIGVkZ2VGaXJzdCBlZGdlU2Vjb25kCi0gICBzZXQgeDEgJG5vZGVYKCRmaXJzdCk7ICBzZXQgeTEgJG5vZGVZKCRmaXJzdCkKLSAgIHNldCB4MiAkbm9kZVgoJHNlY29uZCk7IHNldCB5MiAkbm9kZVkoJHNlY29uZCkKLSAgIHNldCBlZGdlIFsuYyBjcmVhdGUgbGluZSAkeDEgJHkxICR4MiAkeTIgXAotICAgICAgICAgICAgICAtdGFncyBlZGdlfQotICAgLmMgbG93ZXIgZWRnZQotICAgbGFwcGVuZCBlZGdlRmlyc3QoJGZpcnN0KSAkZWRnZQotICAgbGFwcGVuZCBlZGdlU2Vjb25kKCRmaXJzdCkgJGVkZ2UKLSAgIEFkZEVkZ2UgJG5vZGVQKCRmaXJzdCkgJG5vZGVQKCRzZWNvbmQpCi19Ci08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1UaGVzZSBmdW5jdGlvbnMgY3JlYXRlCi1UayBjYW52YXMgaXRlbXMsIGJ1dCBhbHNvIGF0dGFjaCBhIHBvaW50ZXIgdG8gYSBDIGRhdGEgc3RydWN0dXJlIHRvIGVhY2ggb25lLgotVGhpcyBpcyBkb25lIGJ5IG1haW50YWluaW5nIGFuIGFzc29jaWF0aXZlIGFycmF5IG1hcHBpbmcgCi1pdGVtIGlkZW50aWZpZXJzIHRvIHBvaW50ZXJzICh3aXRoIHRoZSA8dHQ+IG5vZGVQKCkgPC90dD4gYXJyYXkpLiAKLVdoZW4gYQotcGFydGljdWxhciBgYG5vZGUnJyBpcyByZWZlcmVuY2VkIGxhdGVyLCB3ZSBjYW4gdXNlIHRoaXMgdG8KLWdldCBpdHMgcG9pbnRlciB1c2UgaXQgaW4gY2FsbHMgdG8gQyBmdW5jdGlvbnMuCi0KLTxoMz4gNS4zLiBQYXJzaW5nIGEgQysrIFNpbXBsZSBDbGFzcyBIaWVyYXJjaHkgPC9oMz4KLQotQXMgbWVudGlvbmVkIGVhcmxpZXIsIFNXSUcgY2FuIGhhbmRsZSBDKysgY2xhc3NlcyBhbmQgcHVibGljCi1pbmhlcml0YW5jZS4gICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcHJvdmlkZXMgYSBmZXcgY2xhc3NlcwotYW5kIGlsbHVzdHJhdGVzIGhvdyB0aGlzIGlzIGFjY29tcGxpc2hlZCAoc29tZSBjb2RlIGhhcyBiZWVuCi1vbW1pdHRlZCBmb3IgcmVhZGFiaWxpdHkpLgotCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotLy8gQSBTV0lHIGluaGVyaXRhbmNlIGV4YW1wbGUKLSVtb2R1bGUgc2hhcGVzCi0lewotI2luY2x1ZGUgInNoYXBlcy5oIgotJX0KLQotY2xhc3MgU2hhcGUgewotcHJpdmF0ZToKLSAgZG91YmxlIHhjLCB5YzsKLXB1YmxpYzoKLSAgdmlydHVhbCBkb3VibGUgYXJlYSgpID0gMDsKLSAgdmlydHVhbCBkb3VibGUgcGVyaW1ldGVyKCkgPSAwOwotICB2b2lkICAgIHNldF9wb3NpdGlvbihkb3VibGUgeCwgZG91YmxlIHkpOwotICB2b2lkICAgIHByaW50X3Bvc2l0aW9uKCk7Ci19OwotCi1jbGFzcyBDaXJjbGU6IHB1YmxpYyBTaGFwZSB7Ci0gcHJpdmF0ZToKLSAgZG91YmxlIHJhZGl1czsKLSBwdWJsaWM6Ci0gIENpcmNsZShkb3VibGUgcik7Ci0gIGRvdWJsZSBhcmVhKCk7Ci0gIGRvdWJsZSBwZXJpbWV0ZXIoKTsKLX07Ci0KLWNsYXNzIFNxdWFyZSA6IHB1YmxpYyBTaGFwZSB7Ci1wcml2YXRlOgotICBkb3VibGUgd2lkdGg7Ci1wdWJsaWM6Ci0gIFNxdWFyZShkb3VibGUgdyk7Ci0gIGRvdWJsZSBhcmVhKCk7Ci0gIGRvdWJsZSBwZXJpbWV0ZXIoKTsKLX07Ci0KLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLU5vdywgd2hlbiB3cmFwcGVkIGJ5IFNXSUcgKG5vdGUgOgotV2hlbiBwYXJzaW5nIEMrKyBjbGFzc2VzLCBTV0lHIHRocm93cyBhd2F5IGV2ZXJ5dGhpbmcgZGVjbGFyZWQgYXMgcHJpdmF0ZSwKLWlubGluZSBjb2RlLCBhbmQgYWxvdCBvZiB0aGUgb3RoZXIgY2x1dHRlciBmb3VuZCBpbiBDKysgaGVhZGVyIGZpbGVzLiAgCi1QcmltYXJpbHkgdGhpcyBpcyBwcm92aWRlZCBvbmx5IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIGludGVyZmFjZXMgZnJvbQotZXhpc3RpbmcgQysrIGhlYWRlciBmaWxlcy4pLCB3ZSBjYW4gdXNlIG91ciBjbGFzcyBzdHJ1Y3R1cmUgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+IDx0dD4gPHByZT4KLSUgc2V0IGMgW25ld19DaXJjbGUgNF0KLV8xMDAwYWQ3MF9DaXJjbGVfcAotJSBzZXQgcyBbbmV3X1NxdWFyZSAxMF0KLV8xMDAwYWRjMF9TcXVhcmVfcAotJSBTaGFwZV9hcmVhICRjCi01MC4yNjU0ODI0NjQwMDAwMDIwMAotJSBTaGFwZV9hcmVhICRzCi0xMDAuMDAwMDAwMDAwMDAwMDAwMDAKLSUgU2hhcGVfc2V0X3Bvc2l0aW9uICRjIC01IDEwCi0lIENpcmNsZV9wcmludF9wb3NpdGlvbiAkYwoteGMgPSAtNSwgeWMgPSAxMAotJSAKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLUluIG91ciBleGFtcGxlLCB3ZSBoYXZlIGNyZWF0ZWQgbmV3IDx0dD4gQ2lyY2xlIDwvdHQ+IGFuZCA8dHQ+IFNxdWFyZSA8L3R0PiBvYmplY3RzLAotYnV0IHRoZXNlIGNhbiBiZSB1c2VkIGludGVyY2hhbmdhYmx5IGluIGFueSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgPHR0PiBTaGFwZSA8L3R0PgotYmFzZSBjbGFzcy4gIFRoZSBTV0lHIHR5cGUgY2hlY2tlciBpcyBlbmNvZGVkIHdpdGggdGhlIGNsYXNzIGhpZXJhcmNoeSBhbmQKLWtub3dzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZGlmZmVyZW50IGNsYXNzZXMuICAgVGh1cywgd2hpbGUgYW4KLW9iamVjdCBvZiB0eXBlIDx0dD4gQ2lyY2xlIDwvdHQ+IGlzIHBlcmZlY3RseSBhY2NlcHRhYmxlIHRvIGEgZnVuY3Rpb24gb3BlcmF0aW5nCi1vbiBzaGFwZXMsIGl0IHdvdWxkIGJlIHVuYWNjZXB0YWJsZSB0byBhIGZ1bmN0aW9uIG9wZXJhdGluZyBvbmx5IG9uIHRoZQotPHR0PiBTcXVhcmUgPC90dD4gdHlwZS4gICAgQXMgaW4gQysrLCBhbnkgZnVuY3Rpb25zIGluIHRoZSBiYXNlIGNsYXNzIGNhbiBiZQotY2FsbGVkIGluIHRoZSBkZXJpdmVkIGNsYXNzIGFzIHNob3duIGJ5IHRoZSA8dHQ+IENpcmNsZV9wcmludF9wb3NpdGlvbiA8L3R0PgotZnVuY3Rpb24gYWJvdmUuCi0KLTxoMj4gNi4gVXNpbmcgU1dJRyBpbiBSZWFsIEFwcGxpY2F0aW9ucyA8L2gyPgotCi1TbyBmYXIgb25seSBhIGZldyBzaW1wbGUgdG95IGV4YW1wbGVzIGhhdmUgYmVlbiBwcmVzZW50ZWQgdG8gaWxsdXN0cmF0ZQotdGhlIG9wZXJhdGlvbiBvZiBTV0lHIGluIGdlbmVyYWwuCi1UaGlzIHNlY3Rpb24gd2lsbCBkZXNjcmliZSBob3cgU1dJRyBjYW4gYmUgdXNlZAotd2l0aCBsYXJnZXIgYXBwbGljYXRpb25zLgotCi08aDM+IDYuMS4gVXNlIGluIFNjaWVudGlmaWMgQXBwbGljYXRpb25zIDwvaDM+Ci0gCi1NYW55IHVzZXJzLCBlc3BlY2lhbGx5IHdpdGhpbiB0aGUgc2NpZW50aWZpYyBhbmQgZW5naW5lZXJpbmcgCi1jb21tdW5pdHksIGhhdmUgc3BlbnQgeWVhcnMgZGV2ZWxvcGluZyBzaW11bGF0aW9uIGNvZGVzLgotV2hpbGUgbWFueSBvZiB0aGVzZSB1c2VycyBhcHByZWNpYXRlIHRoZQotcG93ZXIgdGhhdCBhIHNjcmlwdGluZyBsYW5ndWFnZSBjYW4gcHJvdmlkZSwgdGhleSBkb24ndCB3YW50IHRvIAotY29tcGxldGVseSByZXdyaXRlIHRoZWlyIGFwcGxpY2F0aW9ucyBvciBzcGVuZCBhbGwgb2YgdGhlaXIgdGltZQotdHJ5aW5nIHRvIGJ1aWxkIGEgdXNlci1pbnRlcmZhY2UgKG1vc3QgdXNlcnMgd291bGQgcmF0aGVyIGJlIHdvcmtpbmcKLW9uIHRoZSBzY2llbnRpZmljIHByb2JsZW0gYXQgaGFuZCkuICBXaGlsZSBTV0lHIGNlcnRhaW5seSB3b24ndCBkbyBldmVyeXRoaW5nLAotaXQgY2FuIGRyYW1hdGljYWxseSBzaW1wbGlmeSB0aGlzIHByb2Nlc3MuICAgPGJyPiA8YnI+Ci0KLUFzIGFuIGV4YW1wbGUsIHRoZSBmaXJzdCBTV0lHIGFwcGxpY2F0aW9uIHdhcyB0aGUgU1BhU00gbW9sZWN1bGFyCi1keW5hbWljcyBjb2RlIGRldmVsb3BlZCBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkKLVtCZWF6bGV5LExvbWRhaGxdLiAgIFRoaXMgY29kZSBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZCBmb3IgbWF0ZXJpYWxzCi1zY2llbmNlIHByb2JsZW1zIGFuZCBjb25zaXN0cyBvZiBtb3JlIHRoYW4gMjAwIEMgZnVuY3Rpb25zIGFuZCBhYm91dCAyMDAwMCBsaW5lcwotb2YgY29kZS4KLUluIG9yZGVyIHRvIHVzZSBTV0lHLCBvbmx5IHRoZSA8dHQ+IG1haW4oKSA8L3R0PiBmdW5jdGlvbiBoYWQgdG8gYmUKLXJld3JpdHRlbiBhbG9uZyB3aXRoIGEgZmV3IG90aGVyIG1pbm9yIG1vZGlmaWNhdGlvbnMuCi1UaGUgZnVsbCB1c2VyIGludGVyZmFjZSBpcyBidWlsdCB1c2luZyBhIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBmb3IKLXNpbXVsYXRpb24sIGdyYXBoaWNzLCBtZW1vcnkgbWFuYWdlbWVudCwgZXRjLi4uIAotQSB1c2VyIG1heSBhbHNvIHN1cHBseSB0aGVpciBvd24gaW50ZXJmYWNlIG1vZHVsZXMtLWFsbG93aW5nIHRoZSBjb2RlIHRvCi1iZSBlYXNpbHkgZXh0ZW5kZWQgd2l0aCBuZXcgZnVuY3Rpb25hbGl0eSBjYXBhYmlsaXRpZXMgYXMgbmVlZGVkLgotQWxsIG9mIHRoZSBpbnRlcmZhY2UgZmlsZXMsIGNvbnRhaW5pbmcgYSBmZXcgaHVuZHJlZCBsaW5lcyBvZgotZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBhcmUgYXV0b21hdGljYWxseSB0cmFuc2xhdGVkIGludG8gbW9yZSB0aGFuCi0yMDAwIGxpbmVzIG9mIHdyYXBwZXIgY29kZSBhdCBjb21waWxlIHRpbWUuICAgQXMgYSByZXN1bHQsIG1hbnkgdXNlcnMgCi1vZiB0aGUgc3lzdGVtIGtub3cgaG93IHRvIGV4dGVuZCBpdCwgYnV0IGFyZSB1bmF3YXJlIG9mIHRoZSBhY3R1YWwKLXdyYXBwaW5nIHByb2NlZHVyZS4gICA8YnI+IDxicj4KLQotQWZ0ZXIgbW9kaWZ5aW5nIHRoZSBTUGFTTSBjb2RlIHRvIHVzZSBTV0lHLCBtb3N0IG9mIHRoZSBDIGNvZGUgcmVtYWluZWQKLXVuY2hhbmdlZC4gIEluIGZhY3QsIGluIHN1YnNlcXVlbnQgd29yaywgd2Ugd2VyZSBhYmxlIHRvIGVsaW1pbmF0ZQotbW9yZSB0aGFuIDI1JSBvZiB0aGUgc291cmNlIGNvZGUtLWFsbW9zdCBhbGwgb2Ygd2hpY2ggd2FzIHJlbGF0ZWQgdG8gdGhlCi1ub3cgb2Jzb2xldGUgaW50ZXJmYWNlIG1ldGhvZCB0aGF0IHdlIHJlcGxhY2VkLiAgIE1vcmUgaW1wb3J0YW50bHksIHdlCi13ZXJlIGFibGUgdG8gdHVybiBhIGNvZGUgdGhhdCB3YXMgZGlmZmljdWx0IHRvIHVzZSBhbmQgbW9kaWZ5IGludG8gYSAKLWZsZXhpYmxlIHBhY2thZ2UgdGhhdCB3YXMgZWFzeSB0byB1c2UgYW5kIGV4dGVuZC4gICBUaGlzIGhhcyBoYWQgYQotaHVnZSBpbXBhY3QsIHdoaWNoIGNhbiBub3QgYmUgdW5kZXJzdGF0ZWQsIG9uIHRoZSB1c2Ugb2YgdGhlIFNQYVNNCi1jb2RlIHRvIHNvbHZlIHJlYWwgcHJvYmxlbXMuCi0KLTxoMz4gNi4yLiBPcGVuLUdMIGFuZCBJbnZlbnRvciA8L2gzPgotCi1XaGlsZSBTV0lHIHdhcyBwcmltYXJpbHkgZGVzaWduZWQgdG8gd29yayB3aXRoIGFwcGxpY2F0aW9uIGNvZGVzLCBpdAotY2FuIGFsc28gYmUgdXNlZCB0byB3cmFwIGxhcmdlIGxpYnJhcmllcy4gICBBdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLAotUGV0ZXItUGlrZSBTbG9hbiB1c2VkIFNXSUcgdG8gd3JhcCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBPcGVuLUdMCi1saWJyYXJ5IGludG8gVGNsIGZvciB1c2Ugd2l0aCBhbiBPcGVuLUdMIFRrIHdpZGdldC4gICBUaGUgcHJvY2VzcyBvZgotd3JhcHBpbmcgT3Blbi1HTCB3aXRoIFNXSUcgd2FzIGFzIHNpbXBsZSBhcyB0aGUgZm9sbG93aW5nIDoKLQotPHVsPgotPGxpPiAgTWFrZSBhIGNvcHkgb2YgdGhlIDx0dD4gZ2wuaCA8L3R0PiBoZWFkZXIgZmlsZS4KLTxsaT4gIENsZWFuIGl0IHVwIGJ5IHRha2luZyBhIGZldyBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIG91dCAKLSAgICAgIG9mIGl0LiAgIEZpeCBhIGZldyB0eXBlZGVmcy4KLTxsaT4gSW5zZXJ0IHRoZSBmb2xsb3dpbmcgY29kZSBpbnRvIHRoZSBiZWdpbm5pbmcgCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotJW1vZHVsZSBvcGVuZ2wKLSV7Ci0jaW5jbHVkZSAmbHQ7R0wvZ2wuaCZndDsKLSV9Ci0uLi4gQ29weSBlZGl0ZWQgZ2wuaCBoZXJlIC4uLgotPC9wcmU+IDwvdHQ+IDwvYmxvY2txdW90ZT4KLQotPGxpPiBNb2RpZnkgdGhlIE9wZW4tR0wgd2lkZ2V0IHRvIGNhbGwgPHR0PiBPcGVuZ2xfSW5pdCA8L3R0Pi4KLTxsaT4gUmVjb21waWxlCi08L3VsPgotCi1UaGUgZW50aXJlIHByb2Nlc3MgcmVxdWlyZWQgb25seSBhYm91dCAxMCBtaW51dGVzIG9mIHdvcmssIGJ1dCByZXN1bHRlZAotaW4gbW9yZSB0aGFuIDUwMCBjb25zdGFudHMgYW5kIDM2MCBmdW5jdGlvbnMgYmVpbmcgYWRkZWQgdG8gVGNsLiAgRnVydGhlcm1vcmUsCi10aGlzIGV4dGVuc2lvbiBhbGxvd3MgT3Blbi1HTCBjb21tYW5kcyB0byBiZSBpc3N1ZWQgZGlyZWN0bHkgZnJvbSBUY2wncwotaW50ZXJwcmV0ZWQgZW52aXJvbm1lbnQgYXMgc2hvd24gaW4gdGhpcyBleGFtcGxlCi0oZnJvbSB0aGUgT3Blbi1HTCBtYW51YWwgW09wZW5HTF0pLgotCi08YmxvY2txdW90ZT4gPHR0PiA8cHJlPgotJSAuLi4gb3BlbiBHTCB3aWRnZXQgaGVyZSAuLi4KLSUgZ2xDbGVhckNvbG9yIDAuMCAwLjAgMC4wIDAuMAotJSBnbENsZWFyICRHTF9DT0xPUl9CVUZGRVJfQklUCi0lIGdsQ29sb3IzZiAxLjAgMS4wIDEuMAotJSBnbE9ydGhvIC0xLjAgMS4wIC0xLjAgMS4wIC0xLjAgMS4wCi0lIGdsQmVnaW4gJEdMX1BPTFlHT04KLSUgICAgZ2xWZXJ0ZXgyZiAtMC41IC0wLjUKLSUgICAgZ2xWZXJ0ZXgyZiAtMC41IDAuNQotJSAgICBnbFZlcnRleDJmIDAuNSAwLjUKLSUgICAgZ2xWZXJ0ZXgyZiAwLjUgLTAuNQotJSBnbEVuZAotJSBnbEZsdXNoCi08L3ByZT4gPC90dD4gPC9ibG9ja3F1b3RlPgotCi1FYXJseSB3b3JrIGhhcyBhbHNvIGJlZW4gcGVyZm9ybWVkIG9uIHVzaW5nIFNXSUcgdG8gd3JhcCBwb3J0aW9ucyAKLW9mIHRoZSBPcGVuLUludmVudG9yIHBhY2thZ2UgW0ludmVudF0uICAgVGhpcyBpcyBhIG1vcmUgYW1iaXRpb3VzIHByb2plY3QKLXNpbmNlIE9wZW4tSW52ZW50b3IgY29uc2lzdHMgb2YgYSB2ZXJ5IGxhcmdlIGNvbGxlY3Rpb24gb2YgaGVhZGVyCi1maWxlcyBhbmQgQysrIGNsYXNzZXMuICAgIEhvd2V2ZXIsICB0aGUgU1dJRyBsaWJyYXJ5IG1lY2hhbmlzbSBjYW4gYmUKLXVzZWQgZWZmZWN0aXZlIGluIHRoaXMgY2FzZS4gICBGb3IgZWFjaCBJbnZlbnRvciBoZWFkZXIsIHdlIGNhbiBjcmVhdGUKLWEgc2FuaXRpemVkIFNXSUcgaW50ZXJmYWNlIGZpbGUgKHJlbW92aW5nIGFsb3Qgb2YgdGhlIGNsdXR0ZXIgZm91bmQgaW4KLXRoZSBoZWFkZXIgZmlsZXMpLiAgIFRoZXNlIGludGVyZmFjZSBmaWxlcyBjYW4gdGhlbiBiZSBvcmdhbml6ZWQgdG8gbWlycm9yIHRoZQotc3RydWN0dXJlIG9mIHRoZSBJbnZlbnRvciBzeXN0ZW0uICAgIFRvIGJ1aWxkIGEgbW9kdWxlIGZvciBUY2wsIGEgdXNlcgotY291bGQgc2ltcGx5IHNwZWNpZnkgd2hpY2ggbW9kdWxlcyB0aGV5IHdhbnRlZCB0byB1c2UgYXMgZm9sbG93cyA6Ci0KLTxibG9ja3F1b3RlPiA8dHQ+IDxwcmU+Ci0lbW9kdWxlIGludmVudAotJXsKLS4uLiBwdXQgaGVhZGVycyBoZXJlIC4uLgotJX0KLQotJWluY2x1ZGUgIkludmVudG9yL1h0L1NvWHQuaSIKLSVpbmNsdWRlICJJbnZlbnRvci9YdC9Tb1h0UmVuZGVyQXJlYS5pIgotJWluY2x1ZGUgIkludmVudG9yL25vZGVzL1NvQ29uZS5pIgotJWluY2x1ZGUgIkludmVudG9yL25vZGVzL1NvRGlyZWN0aW9uYWxMaWdodC5pIgotJWluY2x1ZGUgIkludmVudG9yL25vZGVzL1NvTWF0ZXJpYWwuaSIKLSVpbmNsdWRlICJJbnZlbnRvci9ub2Rlcy9Tb1BlcnNwZWN0aXZlQ2FtZXJhLmkiCi0laW5jbHVkZSAiSW52ZW50b3Ivbm9kZXMvU29TZXBhcmF0b3IuaSIKLTwvcHJlPiA8L3R0PiA8L2Jsb2NrcXVvdGU+Ci0KLVdoaWxlIHdyYXBwaW5nIHRoZSBJbnZlbnRvciBsaWJyYXJ5IHdpbGwgcmVxdWlyZSBzaWduaWZpY2FudGx5Ci1tb3JlIHdvcmsgdGhhbiBPcGVuLUdMLCBTV0lHIGNhbiBiZSB1c2VkIGVmZmVjdGl2ZWx5IHdpdGggc3VjaAotc3lzdGVtcy4gICAKLQotPGgzPiA2LjMuIEJ1aWxkaW5nIEludGVyZXN0aW5nIEFwcGxpY2F0aW9ucyBieSBDdXQgYW5kIFBhc3RlIDwvaDM+Ci0KLVNXSUcgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IHRvb2xzIG91dCBvZiBkaXNzaW1pbGlhciAKLXBhY2thZ2VzIGFuZCBsaWJyYXJpZXMuICAgCi1JbiBjb250cmFzdCB0byBjb21iaW5pbmcgcGFja2FnZXMgYXQgYW4gaW5wdXQgbGV2ZWwgYXMgb25lIG1pZ2h0Ci1kbyB3aXRoIHdpdGggRXhwZWN0LCBTV0lHIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyBhdCBhCi1mdW5jdGlvbiBsZXZlbCBbRXhwZWN0XS4KLUZvciBleGFtcGxlLCB1c2luZwotYSBzaW1wbGUgaW50ZXJmYWNlIGZpbGUsIHlvdSBjYW4gd3JhcCB0aGUKLUMgQVBJIG9mIE1BVExBQiA0LjIgW01BVExBQl0uCi1UaGlzIGluIHR1cm4gbGV0cyB5b3UgYnVpbGQgYSBUY2wvVGsgaW50ZXJmYWNlIGZvciBjb250cm9sbGluZwotTUFUTEFCIHByb2dyYW1zLiAgU2VwYXJhdGVseSwgeW91IGNvdWxkIHdyYXAgYSBudW1lcmljYWwgc2ltdWxhdGlvbgotY29kZS4gICBOb3csIGEgZmV3IHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyBjb3VsZCBiZSB3cml0dGVuIGFuZCBib3RoCi1wYWNrYWdlcyBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIFRjbC9UayBhcHBsaWNhdGlvbi4gICBZb3UgaGF2ZQotbm93IGJ1aWx0IGEgc2ltcGxlIGBgY29tcHV0YXRpb25hbCBzdGVlcmluZycnIHN5c3RlbSB0aGF0IGFsbG93cyB5b3UKLXRvIHJ1biBhIHNpbXVsYXRpb24gY29kZSwgdmlzdWFsaXplIGRhdGEgaW4gTUFUTEFCLCBhbmQgY29udHJvbCB0aGUKLWVudGlyZSBzeXN0ZW0gd2l0aCBhIFRjbC9UayBiYXNlZCBpbnRlcmZhY2UuICAgIEZpZ3VyZSAyIHNob3dzCi1hIHNjcmVlbiBzbmFwc2hvdCBmcm9tIHN1Y2ggYSBzaW11bGF0aW9uIGluIHdoaWNoIHRoZSBTUGFTTSBtb2xlY3VsYXIKLWR5bmFtaWNzIGNvZGUsIGEgdmlzdWFsaXphdGlvbiBtb2R1bGUgbGlicmFyeSwgaW1hZ2Ugc2VydmVyICh1c2luZyB4diksCi1hbmQgTUFUTEFCIGhhdmUgYmVlbgotY29tYmluZWQuICAgVW5kZXIgdGhpcyBzeXN0ZW0sIHRoZSB1c2VyIGNhbiBpbnRlcmFjdGl2ZWx5IHNldCB1cAotYW5kIHJ1biBzaW11bGF0aW9ucyB3aGlsZSB3YXRjaGluZyB0aGUgcmVzdWx0cyBldm9sdmUgaW4gcmVhbC10aW1lLgotPGJyPiA8YnI+Ci08Y2VudGVyPgotPGltZyBhbHQgPSAiVGNsL1RrL01BVExBQi9TUEFTTSBGaWd1cmUiIHNyYz0ic3RlZXIyLmdpZiI+IDxicj4KLUZpZ3VyZSAyOiBTaW1wbGUgVGNsL1RrIFN0ZWVyaW5nIEFwcGxpY2F0aW9uIEJ1aWx0IHdpdGggU1dJRyA8YnI+Ci08L2NlbnRlcj4KLQotPGgzPiA2LjQuIExhbmd1YWdlIEluZGVwZW5kZW50IEFwcGxpY2F0aW9ucyA8L2gzPgotCi0KLUVhY2ggc2NyaXB0aW5nIGxhbmd1YWdlIGhhcyBpdCdzIG93biBzdHJlbmd0aHMgYW5kIHdlYWtuZXNzZXMuICAKLVJhdGhlcgotdGhhbiB0cnlpbmcgdG8gY2hvb3NlIHRoZSBsYW5ndWFnZSB0aGF0IGlzIHRoZSBiZXN0IGF0IGV2ZXJ5dGhpbmcgKHdoaWNoCi1pcyBwcm9iYWJseSBpbXBvc3NpYmxlKSwKLVNXSUcgYWxsb3dzIGEgdXNlciB0byB1c2UgdGhlIGJlc3QgbGFuZ3VhZ2UgZm9yIHRoZSBqb2IgYXQgaGFuZC4gIEknbQotYWx3YXlzIGZpbmRpbmcgbXlzZWxmIHdyaXRpbmcgbGl0dGxlIHV0aWxpdGllcyBhbmQgcHJvZ3JhbXMgdG8gc3VwcG9ydAotbXkgc2NpZW50aWZpYyBjb21wdXRpbmcgd29yay4gIFdoeSBzaG91bGQgSSBiZSBmb3JjZWQgdG8gdXNlIG9ubHkgb25lCi1sYW5ndWFnZSBmb3IgZXZlcnl0aGluZz8gIFdpdGggU1dJRywgSSBjYW4gcHV0IGEgUGVybCBpbnRlcmZhY2Ugb24gYQotdG9vbCBhbmQgc3dpdGNoIG92ZXIgdG8gVGNsL1RrIGF0IGFueXRpbWUgYnkganVzdCBjaGFuZ2luZyBhIGZldwotTWFrZWZpbGUgb3B0aW9ucy4gPGJyPiA8YnI+Ci0KLVNpbmNlIFNXSUcgcHJvdmlkZXMgYSBsYW5ndWFnZS1pbmRlcGVuZGVudCBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiwKLWl0IGlzIHJlbGF0aXZlbHkgZWFzeSB0byB1c2UgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyBpbiBhIHZhcmlldHkgb2YKLWludGVyZXN0aW5nIGFwcGxpY2F0aW9ucy4gIEZvciBleGFtcGxlLCB0aGUgaWRlbnRpY2FsIE1BVExBQgotbW9kdWxlIHVzZWQgaW4gdGhlIGxhc3QgVGNsIGV4YW1wbGUgY291bGQgYmUgaW1wb3J0ZWQgYXMgUGVybDUgbW9kdWxlCi1hbmQgY29tYmluZWQgd2l0aCBhIFBlcmwgc2NyaXB0IHRvIHByb2R1Y2UgZ3JhcGhpY2FsIGRpc3BsYXlzIGZyb20KLVdlYi1zZXJ2ZXIgbG9ncyBhcyBzaG93biBpbiBGaWd1cmUgMy4gPGJyPiA8YnI+Ci0KLTxjZW50ZXI+Ci08aW1nIGFsdD0iUGVybDUgd2ViIHN0YXRzIGV4YW1wbGUiIHNyYz0iaGl0cy5naWYiPiA8YnI+Ci1GaWd1cmUgMzpXZWItc2VydmVyIGFjdGl2aXR5IGdyYXBoLiAgR2VuZXJhdGVkIGZyb20gYSBQZXJsIHNjcmlwdCwgYnV0Ci11c2VzIGFuIHVubW9kaWZpZWQgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlIGZvciBpbnRlZ3JhdGluZyBNQVRMQUIgd2l0aCBUY2wvVGsuIDxicj4gPGJyPgotPC9jZW50ZXI+Ci0KLVNvbWUgaGF2ZSBwcm9tb3RlZCB0aGUgaWRlYSBvZiBlbmNhcHN1bGF0aW5nIHNldmVyYWwgbGFuZ3VhZ2VzIGludG8KLWEgaGlnaGVyIGxldmVsIGxhbmd1YWdlIGFzIGhhcyBiZWVuIHByb3Bvc2VkIHdpdGggR3VpbGUgW0xvcmRdLgotVGhpcyBtYXkgYmUgZmluZSBpZiBvbmUgd2FudHMgdG8gd3JpdGUgY29kZSB0aGF0IHVzZXMgZGlmZmVyZW50IGxhbmd1YWdlcwotYWxsIGF0IG9uY2UsIGJ1dCB3aGVuIEkgd2FudCB0byB1c2Ugb25seSBUY2wgb3IgUGVybCBmb3IgYW4gYXBwbGljYXRpb24sCi1JIGFsbW9zdCBhbHdheXMgcHJlZmVyIHVzaW5nIHRoZSByZWFsIHZlcnNpb25zIGluc3RlYWQgb2YgYW4gZW5jYXBzdWxhdGVkCi12YXJpYW50LiAgICAgU1dJRyBtYWtlcyB0aGlzIHBvc3NpYmxlIHdpdGhvdXQgbXVjaCBlZmZvcnQuCi0KLTxoMz4gNi41LiBVc2luZyBUY2wgYXMgYSBkZWJ1Z2dlciA8L2gzPgotCi1TaW5jZSBTV0lHIGNhbiB3b3JrIHdpdGggZXhpc3RpbmcgQyBjb2RlLCBpdCBjYW4gYmUgdXNlZCBxdWl0ZSBlZmZlY3RpdmVseQotYXMgYSBkZWJ1Z2dlci4KLVlvdSBjYW4gd3JhcCBDIGZ1bmN0aW9ucyBhbmQgaW50ZXJhY3QKLXdpdGggdGhlbSBmcm9tIDx0dD4gdGNsc2ggPC90dD4gb3IgPHR0PiB3aXNoIDwvdHQ+LgotVW5saWtlIG1vc3QgdHJhZGl0aW9uYWwgZGVidWdnZXJzLCB5b3UKLWNhbiBjcmVhdGUgb2JqZWN0cywgYnVmZmVycywgYXJyYXlzLCBhbmQgb3RoZXIgdGhpbmdzIG9uIHRoZSBmbHkKLWJ5IHB1dHRpbmcgYXBwcm9wcmlhdGUgZGVmaW5pdGlvbnMgaW4gdGhlIGludGVyZmFjZSBmaWxlLgotU2luY2UgPHR0PiB0Y2xzaCA8L3R0PiBvciA8dHQ+IHdpc2ggPC90dD4gcHJvdmlkZXMgYSA8dHQ+IG1haW4oKSA8L3R0PiBmdW5jdGlvbiwgeW91Ci1jYW4gZXZlbiByaXAgc21hbGwgcGllY2VzIG91dCBvZiBhIGxhcmdlciBwYWNrYWdlIHdpdGhvdXQgaW5jbHVkaW5nCi10aGF0IHBhY2thZ2UncyBtYWluIHByb2dyYW0uCi1TY3JpcHRzIGNhbiBiZSB3cml0dGVuIHRvIHRlc3Qgb3V0IGRpZmZlcmVudCBwYXJ0cyBvZiB5b3VyCi1jb2RlIGFzIGl0IGlzIGRldmVsb3BlZC4gICAgV2hlbiB5b3UgYXJlIHNhdGlzZmllZCB3aXRoIHRoZSBtb2R1bGUsCi1yZW1vdmluZyB0aGUgaW50ZXJmYWNlIGlzIGFzIGVhc3kgYXMgZGlzY2FyZGluZyB0aGUgU1dJRyBpbnRlcmZhY2UKLWZpbGUuICAgSSBoYXZlIHVzZWQgU1dJRyBhcyBhIGRlYnVnZ2VyIGZvciBkZXZlbG9waW5nIGdyYXBoaWNzIGxpYnJhcmllcywKLW5ldHdvcmsgc2VydmVycywgc2ltdWxhdGlvbiBjb2RlcywgYW5kIGEgd2lkZSByYW5nZSBvZiBvdGhlciBwcm9qZWN0cy0tc29tZQotb2Ygd2hpY2ggZGlkbid0IGV2ZW4gdXNlIGEgc2NyaXB0aW5nIGxhbmd1YWdlIHdoZW4gY29tcGxldGVkLgotCi08aDI+IDcuIExpbWl0YXRpb25zIDwvaDI+Ci0KLVNXSUcgcmVwcmVzZW50cyBhIGJhbGFuY2Ugb2YgZmxleGliaWxpdHkgYW5kIGVhc2Ugb2YgdXNlLgotSSBoYXZlIGFsd2F5cyBmZWx0IHRoYXQgdGhlIHRvb2wgc2hvdWxkbid0IGJlIG1vcmUgY29tcGxpY2F0ZWQgdGhhbgotdGhlIG9yaWdpbmFsIHByb2JsZW0uICAgIFRoZXJlZm9yZSwgU1dJRyBjZXJ0YWlubHkgd29uJ3QgZG8gZXZlcnl0aGluZy4KLVdoaWxlIEkgYmVsaWV2ZSB0aGUgcG9pbnRlciByZXByZXNlbnRhdGlvbiBvZiBjb21wbGV4IGRhdGF0eXBlcyB3b3Jrcwotd2VsbCBpbiBwcmFjdGljZSwgc29tZSB1c2VycyBoYXZlIGZvdW5kIHRoaXMgdG8gYmUgdG9vIGdlbmVyYWwgb3IKLWNvbmZ1c2luZy4gICAgU1dJRydzCi1zdXBwb3J0IGZvciBDKysgaXMgYWxzbyBsaW1pdGVkIGJ5IHRoZSBmYWN0IHRoYXQgU1dJRyBkb2VzIG5vdCBzdXBwb3J0Ci1vcGVyYXRvciBvdmVybG9hZGluZywgbXVsdGlwbGUgaW5oZXJpdGFuY2UsIHRlbXBsYXRlcywgYW5kIGEgbnVtYmVyCi1vZiBvdGhlciBtb3JlIGFkdmFuY2VkIEMrKyBmZWF0dXJlcy4gICAgU1dJRyBhbHNvIGxhY2tzIHN1cHBvcnQgZm9yCi1kZWZhdWx0IG9yIHZhcmlhYmxlIGxlbmd0aCBmdW5jdGlvbiBhcmd1bWVudHMsIGFycmF5IG5vdGF0aW9uLAotcG9pbnRlcnMgdG8gZnVuY3Rpb25zICh1bmxlc3MgaGlkZGVuIGJ5IGEgdHlwZWRlZikgYW5kIGFuIGV4Y2VwdGlvbgotbWVjaGFuaXNtLiAKLUZpbmFsbHksIFNXSUcKLWRvZXMKLW5vdCBzdXBwb3J0IGFsbCBvZiB0aGUgZmVhdHVyZXMgb2YgVGNsIHN1Y2ggYXMgYXNzb2NpYXRpdmUgYXJyYXlzLgotVGhlc2UgYXJlbid0IGFuIGluaGVyZW50IHBhcnQgb2YgdGhlIEMgbGFuZ3VhZ2Ugc28gaXQgaXMgZGlmZmljdWx0Ci10byBnZW5lcmFsaXplIGhvdyB0aGV5IHNob3VsZCBiZSBoYW5kbGVkIG9yIGdlbmVyYXRlZC4gSSBwcmVmZXIgdG8KLWtlZXAgdGhlIHRvb2wgc2ltcGxlIHdoaWxlIGxlYXZpbmcgdGhlc2UgaXNzdWVzIHVwIHRvIHRoZSBpbmRpdmlkdWFsCi1wcm9ncmFtbWVyLiAgPGJyPiA8YnI+Ci0KLQotRm9ydHVuYXRlbHksIGl0IGlzIGFsbW9zdCBhbHdheXMgcG9zc2libGUgdG8gd29yayBhcm91bmQKLW1hbnkgcHJvYmxlbXMgYnkgd3JpdGluZyBzcGVjaWFsIGxpYnJhcnkgZnVuY3Rpb25zIG9yIG1ha2luZwotbW9kaWZpY2F0aW9ucyB0byB0aGUgU1dJRyBsYW5ndWFnZSBtb2R1bGVzIHRvIHByb2R1Y2UgdGhlIGRlc2lyZWQgZWZmZWN0LgotRm9yIGV4YW1wbGUsIHdoZW4gd3JhcHBpbmcgT3Blbi1HTCwgU1dJRyBpbnN0YWxsZWQgYWxsIG9mIHRoZSBPcGVuLUdMCi1jb25zdGFudHMgYXMgVGNsIGdsb2JhbCB2YXJpYWJsZXMuICAgVW5mb3J0dW5hdGVseSwgbm9uZSBvZiB0aGVzZQotdmFyaWFibGVzIHdlcmUgYWNjZXNzaWJsZSBpbnNpZGUgVGNsIHByb2NlZHVyZXMgdW5sZXNzIHRoZXkgd2VyZSBleHBsaWNpdGx5Ci1kZWNsYXJlZCBnbG9iYWwuICAgQnkgbWFraW5nIGEgbW9kaWZpY2F0aW9uIHRvIHRoZSBUY2wgbGFuZ3VhZ2UgbW9kdWxlLAotaXQgd2FzIHBvc3NpYmxlIHRvIHB1dCB0aGUgR0wgY29uc3RhbnRzIGludG8gaGFzaCB0YWJsZSBhbmQgcGVyZm9ybQotYSBoaWRkZW4gYGBsb29rdXAnJyBpbnNpZGUgYWxsIG9mIHRoZSBHTC1yZWxhdGVkIGZ1bmN0aW9ucy4gIFNpbWlsYXJseSwKLW11Y2ggb2YgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgU1dJRyBjYW4gYmUgcGxhY2VkIGludG8gbGlicmFyeQotZmlsZXMgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzLgotCi08aDI+IDguIENvbmNsdXNpb25zIDwvaDI+Ci0KLVNXSUcgaGFzIGJlZW4gaW4gdXNlIGZvciBhcHByb3hpbWF0ZWx5IG9uZSB5ZWFyLiAgQXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCBpdHMgdXNlIHdpdGggdGhlIFNQYVNNIGNvZGUgaGFzCi1wcm92ZW4gdG8KLWJlIGEgcmVtYXJrYWJseSBzaW1wbGUsIHN0YWJsZSwgYW5kIGJ1Zy1mcmVlIHdheSB0byBidWlsZCBhbmQgbW9kaWZ5IHVzZXIKLWludGVyZmFjZXMuICAgQXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCwgU1dJRyBpcyBiZWluZyB1c2VkIGluIGEgdmFyaWV0eQotb2Ygb3RoZXIgYXBwbGljYXRpb25zIHdoZXJlIHRoZSB1c2VycyBoYXZlIHF1aWNrbHkgY29tZSB0byBhcHByZWNpYXRlIGl0cwotZWFzZSBvZiB1c2UgYW5kIGZsZXhpYmlsaXR5LiA8YnI+IDxicj4KLQotV2hpbGUgU1dJRyBtYXkgYmUgaW5hcHByb3ByaWF0ZSBmb3IgY2VydGFpbiBhcHBsaWNhdGlvbnMsIEkgZmVlbCB0aGF0IGl0Ci1vcGVucyB1cCBUY2wvVGssIFB5dGhvbiwgUGVybCwgR3VpbGUsIGFuZCBvdGhlciBsYW5ndWFnZXMgIHRvIAotdXNlcnMgd2hvIHdvdWxkIGxpa2UgdG8gZGV2ZWxvcCBpbnRlcmVzdGluZyB1c2VyIGludGVyZmFjZXMgZm9yIHRoZWlyIGNvZGVzLAotYnV0IHdobyBkb24ndCB3YW50IHRvIHdvcnJ5IGFib3V0IHRoZSBsb3ctbGV2ZWwgZGV0YWlscyBvciBmaWd1cmluZwotb3V0IGhvdyB0byB1c2UgYSBjb21wbGljYXRlZCB0b29sLiAgPGJyPiA8YnI+Ci0gIAotRnV0dXJlIGRpcmVjdGlvbnMgZm9yIFNXSUcgaW5jbHVkZSBzdXBwb3J0IGZvciBvdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2VzLAotYW5kIGEgbGlicmFyeSBvZiBleHRlbnNpb25zLiAgU1dJRyBtYXkgYWxzbyBiZSBleHRlbmRlZCB0byBzdXBwb3J0IHBhY2thZ2VzCi1zdWNoIGFzIGluY3JlbWVudGFsIFRjbC4gV29yayBpcyBhbHNvIHVuZGVyd2F5IHRvIHBvcnQgU1dJRyB0byBub24tdW5peAotcGxhdGZvcm1zLgotCi08aDI+IEFja25vd2xlZGdtZW50cyA8L2gyPgotCi1UaGlzIHByb2plY3Qgd291bGQgbm90IGhhdmUgYmVlbiBwb3NzaWJsZSB3aXRob3V0IHRoZSBzdXBwb3J0IG9mIGEgbnVtYmVyCi1vZiBwZW9wbGUuICAgUGV0ZXIgTG9tZGFobCwgU2h1amlhIFpob3UsIEJyYWQgSG9saWFuLCBUaW0gR2VybWFubiwgYW5kIE5pZWxzCi1KZW5zZW4gYXQgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5IHdlcmUgdGhlIGZpcnN0IHVzZXJzIGFuZCB3ZXJlCi1pbnN0cnVtZW50YWwgaW4gdGVzdGluZyBvdXQgdGhlIGZpcnN0IGRlc2lnbnMuICAgUGF0cmljayBUdWxsbWFubiBhdAotdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBzdWdnZXN0ZWQgdGhlIGlkZWEgb2YgYXV0b21hdGljIGRvY3VtZW50YXRpb24KLWdlbmVyYXRpb24uICBKb2huIFNjaG1pZHQsIEt1cnRpcwotQmxlZWtlciwgUGV0ZXItUGlrZSBTbG9hbiwgYW5kIFN0ZXZlIFBhcmtlciBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIHRlc3RlZCBvdXQgc29tZSBvZiB0aGUgbmV3ZXIgdmVyc2lvbnMgYW5kCi1wcm92aWRlZCB2YWx1YWJsZSBmZWVkYmFjay4gICBKb2huIEJ1Y2ttYW4gc3VnZ2VzdGVkIG1hbnkgaW50ZXJlc3RpbmcKLWltcHJvdmVtZW50cyBhbmQgaGFzIGJlZW4gaW5zdHJ1bWVudGFsIHRoZSByZWNlbnQgZGV2ZWxvcG1lbnQgb2YgU1dJRy4KLUZpbmFsbHkKLUknZCBsaWtlIHRvIHRoYW5rIENocmlzIEpvaG5zb24gYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBTY2llbnRpZmljCi1Db21wdXRpbmcgYW5kIEltYWdpbmcgZ3JvdXAgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBmb3IgdGhlaXIgY29udGludWVkCi1zdXBwb3J0IGFuZCBmb3IgcHV0dGluZyB1cCB3aXRoIG15IHdyYXBwaW5nIGV2ZXJ5IHNvZnR3YXJlIHBhY2thZ2UKLUkgY291bGQgZ2V0IG15IGhhbmRzIG9uLiAgICBTV0lHIHdhcyBkZXZlbG9wZWQgaW4gcGFydCB1bmRlciB0aGUKLWF1c3BpY2VzIG9mIHRoZSBVUyBEZXBhcnRtZW50IG9mIEVuZXJneSwgdGhlIE5hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiwgCi1hbmQgTmF0aW9uYWwgSW5zdGl0dXRlcyBvZiBIZWFsdGguCi0KLTxoMj4gQXZhaWxhYmlsaXR5IDwvaDI+Ci0KLVNXSUcgaXMgZnJlZSBzb2Z0d2FyZSBhbmQgYXZhaWxhYmxlIHZpYSBhbm9ueW1vdXMgRlRQIGF0ICA8YnI+IDxicj4KLQotPGNlbnRlcj4KLTx0dD4gZnRwLmNzLnV0YWguZWR1L3B1Yi9iZWF6bGV5L1NXSUcgPC90dD4gPGJyPiA8YnI+Ci08L2NlbnRlcj4KLQotTW9yZSBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSBvbiB0aGUgU1dJRyBob21lcGFnZSBhdCAgPGJyPiA8YnI+Ci0KLTxjZW50ZXI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmNzLnV0YWguZWR1L35iZWF6bGV5L1NXSUciPiA8dHQ+IGh0dHA6Ly93d3cuY3MudXRhaC5lZHUvfmJlYXpsZXkvU1dJRyA8L3R0PiA8L2E+Ci08L2NlbnRlcj4gPGJyPiA8YnI+Ci0KLTxoMj4gUmVmZXJlbmNlcyA8L2gyPgotCi1bQmVhemxleV0gRC5NLiBCZWF6bGV5IGFuZCBQLlMuIExvbWRhaGwsIAotPGVtPiBNZXNzYWdlLVBhc3NpbmcgTXVsdGktQ2VsbCBNb2xlY3VsYXIgRHluYW1pY3Mgb24gdGhlIENvbm5lY3Rpb24KLU1hY2hpbmUgNSA8L2VtPiwgUGFyYWxsZWwgQ29tcHV0aW5nIDIwICgxOTk0KSBwLiAxNzMtMTk1LiA8YnI+IDxicj4KLQotW0VUXSBFbWJlZGRlZCBUaywgPGJyPgotPHR0PiBmdHA6Ly9mdHAudm5ldC5uZXQvcHViL3VzZXJzL2RyaC9FVC5odG1sIDwvdHQ+IDxicj4gPGJyPgotCi1bRXhwZWN0XSBEb24gTGliZXMsIDxlbT4gRXhwbG9yaW5nIEV4cGVjdCA8L2VtPiwgTydSZWlsbHkgJmFtcDsgQXNzb2NpYXRlcywgSW5jLiAoMTk5NSkuIDxicj4gPGJyPgotCi1bSGVpZHJpY2hdIFdvbGZnYW5nIEhlaWRyaWNoIGFuZCBQaGlsaXBwIFNsdXNhbGxlaywgPGVtPgotQXV0b21hdGljIEdlbmVyYXRpb24gb2YgVGNsIEJpbmRpbmdzIGZvciBDIGFuZCBDKysgTGlicmFyaWVzLjwvZW0+LAotVVNFTklYIDNyZCBBbm51YWwgVGNsL1RrIFdvcmtzaG9wICgxOTk1KS4gPGJyPiA8YnI+Ci0KLVtKYW5zc2VuXSBCaWxsIEphbnNzZW4sIE1pa2UgU3ByZWl0emVyLCA8ZW0+IElMVSA6IEludGVyLUxhbmd1YWdlIFVuaWZpY2F0aW9uIHZpYSBPYmplY3QgTW9kdWxlcyA8L2VtPiwgT09QU0xBIDk0IFdvcmtzaG9wIG9uIE11bHRpLUxhbmd1YWdlCi1PYmplY3QgTW9kZWxzLiA8YnI+IDxicj4KLQotW0xvbWRhaGxdIFAuUy4gTG9tZGFobCwgUC4gVGFtYXlvLCAKLU4uR3JvbmJlY2gtSmVuc2VuLCBhbmQgRC5NLiBCZWF6bGV5LCAKLTxlbT4gUHJvYy4gb2YgU3VwZXJjb21wdXRpbmcgOTMgPC9lbT4sIElFRUUgQ29tcHV0ZXIgU29jaWV0eSAoMTk5MyksIHAuIDUyMC01MjcuCi08YnI+IDxicj4KLQotW0xvcmRdIFRob21hcyBMb3JkLCA8ZW0+IEFuIEFuYXRvbXkgb2YgR3VpbGUsIFRoZSBJbnRlcmZhY2UgdG8gCi1UY2wvVGsgPC9lbT4sIFByb2NlZWRpbmdzIG9mIHRoZSBVU0VOSVggM3JkIEFubnVhbCBUY2wvVGsgV29ya3Nob3AgKDE5OTUpLiA8YnI+IDxicj4KLQotW01BVExBQl0gPGVtPiBNQVRMQUIgRXh0ZXJuYWwgSW50ZXJmYWNlIEd1aWRlIDwvZW0+LCBUaGUgTWF0aCBXb3JrcywgSW5jLiAgKDE5OTMpLgotPGJyPiA8YnI+Ci0KLVtPdXN0ZXJob3V0XSBKb2huIEsuIE91c3RlcmhvdXQsIDxlbT4gVGNsIGFuZCB0aGUgVGsgVG9vbGtpdCA8L2VtPiwgQWRkaXNvbi1XZXNsZXkgUHVibGlzaGVycyAoMTk5NCkuIDxicj4gPGJyPgotCi1bUGVybDVdIFBlcmw1IFByb2dyYW1tZXJzIHJlZmVyZW5jZSwgPGJyPgotPHR0PiBodHRwOi8vd3d3Lm1ldHJvbmV0LmNvbS9wZXJsaW5mby9kb2MgPC90dD4sICgxOTk2KS4gPGJyPiA8YnI+Ci0KLVt2dGtdIFcuIFNjaHJvZWRlciwgSy4gTWFydGluLCBhbmQgQi4gTG9yZW5zZW4sIDxlbT4gVGhlCi1WaXN1YWxpemF0aW9uIFRvb2xraXQgPC9lbT4sIFByZW50aWNlIEhhbGwgICgxOTk1KS4gPGJyPiA8YnI+Ci0KLVtJbnZlbnRdIEouIFdlcm5lY2tlLDxlbT4gVGhlIEludmVudG9yIE1lbnRvciA8L2VtPiwgQWRkaXNvbi1XZXNsZXkgUHVibGlzaGluZyAoMTk5NCkuIDxicj4gPGJyPgotCi1bV2V0aGVyYWxsXSBELiBXZXRoZXJhbGwsIEMuIEouIExpbmRibGFkLCA8ZW0+IEV4dGVuZGluZyBUY2wgZm9yCi1EeW5hbWljIE9iamVjdC1PcmllbnRlZCBQcm9ncmFtbWluZyA8L2VtPiwgUHJvY2VlZGluZ3Mgb2YgdGhlIFVTRU5JWCAzcmQgQW5udWFsIFRjbC9UayBXb3Jrc2hvcCAoMTk5NSkuIDxicj4gPGJyPgotCi1bT3BlbkdMXSBKLiBOZWlkZXIsIFQuIERhdmlzLCBNLiBXb28sIDxlbT4gT3BlbkdMIFByb2dyYW1taW5nIEd1aWRlIDwvZW0+LCBBZGRpc29uLVdlc2xleSBQdWJsaXNoaW5nICgxOTkzKS4gPGJyPiA8YnI+Ci0KLTwvYm9keT4KLTwvaHRtbD4KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL3BhcGVycy9UY2w5OC9UY2xDaGFwLmh0bWwgYi9zd2lnd2ViL3BhcGVycy9UY2w5OC9UY2xDaGFwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYWVhODUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvVGNsOTgvVGNsQ2hhcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg5OCArMCwwIEBACi08IS0tIFB1Ymxpc2hlZCBieSBRdWFkcmFsYXkgV2ViV29ya3MgSFRNTCBMaXRlIDEuNS4xIC0tPgotPCEtLSBBbmQgbXVuZ2VkIGJ5IERhdmUncyBzcGVjaWFsIFB5dGhvbiBzY3JpcHQgLS0+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlRjbCBhbmQgU1dJRyBhcyBhIEMvQysrIERldmVsb3BtZW50IFRvb2w8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxhIG5hbWU9Im4wIj48L2E+PGgxPiBUY2wgYW5kIFNXSUcgYXMgYSBDL0MrKyBEZXZlbG9wbWVudCBUb29sPC9oMT4KLQotRGF2aWQgTS4gQmVhemxleSA8YnI+Ci1EZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgPGJyPgotVW5pdmVyc2l0eSBvZiBDaGljYWdvPGJyPgotQ2hpY2FnbywgSWxsaW5vaXMgICA2MDYzNyA8YnI+Ci08YWRkcmVzcz4gPGEgaHJlZj0iaHR0cDovL3d3dy5jcy51Y2hpY2Fnby5lZHUvfmJlYXpsZXkiPmJlYXpsZXlAY3MudWNoaWNhZ28uZWR1PC9hPjwvYWRkcmVzcz4gPGJyPgotPHA+Ci0KLUNvcHlyaWdodCAoQykgMTk5OCA8YnI+Ci1BbGwgUmlnaHRzIFJlc2VydmVkIDxicj4KLQotPGgyPiBBYm91dCBUaGlzIERvY3VtZW50IDwvaDI+Ci0KLVRoaXMgcGFwZXIgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBhcyBhIGNoYXB0ZXIgZm9yIGEgVGNsIGJvb2sgcHJvamVjdC4KLUhvd2V2ZXIsIHRoYXQgcHJvamVjdCByYW4gaW50byBzb21lIGRpZmZpY3VsdGllcyBzbyB0aGUgY2hhcHRlciAoYW5kCi10aGUgYm9vayBpdHNlbGYpIG5ldmVyIGFwcGVhcmVkLiAgU2luY2UgdGhlIGNoYXB0ZXIgbWF5IGJlIG9mIHVzZSB0bwotU1dJRyBhbmQgVGNsIHVzZXJzLCBpdCBoYXMgYmVlbiBzbGlnaHRseSByZXZhbXBlZCBhbmQgcmVwdWJsaXNoZWQgaW4KLWVsZWN0cm9uaWMgZm9ybSBoZXJlLiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byBkaXN0cmlidXRlIHRoaXMKLWRvY3VtZW50IGluIGVsZWN0cm9uaWMgZm9ybSB3aXRob3V0IHJveWFsdGllcyBvciBmZWVzIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi1jb3B5cmlnaHQgYW5kIHRoaXMgbm90aWNlIGFwcGVhciBpbiBhbGwgcmVwcm9kdWN0aW9ucy4gIAotSGFyZC1jb3B5IChwYXBlcikgcmVwcm9kdWN0aW9ucyBvZiB0aGlzIGFydGljbGUgYXJlIHN0cmljdGx5Ci1wcm9oaWJpdGVkIHdpdGhvdXQgdGhlIHdyaXR0ZW4gY29uc2VudCBvZiB0aGUgYXV0aG9yLgotCi08YSBuYW1lPSJuMSI+PC9hPjxoMj4gSW50cm9kdWN0aW9uPC9oMj4KLU9uZSBvZiB0aGUgZ3JlYXRlc3Qgc3RyZW5ndGhzIG9mIFRjbCBpcyBpdHMgYWJpbGl0eSB0byBiZSBlYXNpbHkgZXh0ZW5kZWQgd2l0aCBjb2RlIHdyaXR0ZW4gaW4gQyBvciBDKysuICBNb3JlIG9mdGVuIHRoYW4gbm90LCBjb21waWxlZCBleHRlbnNpb25zIHRvIFRjbCB0YWtlIHRoZSBmb3JtIG9mIFRrIHdpZGdldHMgYW5kIGdlbmVyYWwgcHVycG9zZSBsaWJyYXJpZXMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byBkYXRhYmFzZXMsIHNvY2tldHMsIGFuZCBvdGhlciBzeXN0ZW0gc2VydmljZXMuICAgQXBwbGljYXRpb24gZGV2ZWxvcGVycyBtaWdodCBhbHNvIGV4dGVuZCBUY2wgaW4gb3JkZXIgdG8gYnVpbGQgYSB1c2VyLWludGVyZmFjZSB0byBhIGxhcmdlIHBhY2thZ2Ugd3JpdHRlbiBpbiBhIGNvbXBpbGVkIGxhbmd1YWdlLiAgSG93ZXZlciwgbWFueSBDL0MrKyBkZXZlbG9wZXJzIG1pZ2h0IGJlIHN1cnByaXNlZCB0byBsZWFybiB0aGF0IFRjbCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgZ2VuZXJhbCBwdXJwb3NlIEMvQysrIGRldmVsb3BtZW50IHRvb2wtLWV2ZW4gaW4gc2l0dWF0aW9ucyB3aGVyZSBUY2wgaXMgbm90IHBhcnQgb2YgdGhlIGZpbmFsIHByb2R1Y3Qgb3IgZGVzaWduLjxwPgotPHA+Ci1UbyBhbnN3ZXIgdGhlIHF1ZXN0aW9uIG9mIHdoeSBvbmUgbWlnaHQgd2FudCB0byB1c2UgVGNsIGZvciB0aGlzIHB1cnBvc2UsIGNvbnNpZGVyIHRoZSBmZWF0dXJlcyB0aGF0IFRjbCBwcm92aWRlcy4gIEZpcnN0LCBUY2wgcHJvdmlkZXMgYW4gaW50ZXJwcmV0ZWQgZW52aXJvbm1lbnQgdGhhdCBhbGxvd3MgeW91IGludGVyYWN0aXZlbHkgY29udHJvbCBhbmQgbWFuaXB1bGF0ZSB0aGUgdW5kZXJseWluZyBDIHByb2dyYW0uICAgSW4gb3RoZXIgd29yZHMsIGEgVGNsIGludGVyZmFjZSBhbGxvd3MgeW91IHRvIGNhbGwgQyBmdW5jdGlvbnMsIGV4YW1pbmUgdmFyaWFibGVzLCBhbmQgcGVyZm9ybSB0YXNrcyB0aGF0IG1pZ2h0IG90aGVyd2lzZSBiZSBmb3VuZCBpbiBhIGRlYnVnZ2VyLiAgIFNlY29uZCwgVGNsIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHByb2dyYW1zLCByYXBpZGx5IHByb3RvdHlwZSBuZXcgZmVhdHVyZXMsIGRldmVsb3AgdGVzdGluZyBzY3JpcHRzLCBhbmQgaW50ZXJhY3Qgd2l0aCBDIGNvZGUgaW4gYSBoaWdobHkgZmxleGlibGUgbWFubmVyLiAgICBBbmQgZmluYWxseSwgb25lIHNob3VsZG4ndCBmb3JnZXQgdGhhdCBUY2wgYWxsb3dzIHlvdSB0byB1dGlsaXplIG90aGVyIGV4dGVuc2lvbnMgYW5kIG1vZHVsZXMgcGVvcGxlIGhhdmUgZGV2ZWxvcGVkIChmb3IgZXhhbXBsZSwgeW91IGNvdWxkIGxhdGVyIHdyaXRlIGEgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIGluIFRrLCBhY2Nlc3MgZGF0YWJhc2Ugc3lzdGVtcyB3aXRoIE9yYVRjbCwgYW5kIHNvIGZvcnRoKS4gIEluIHNob3J0LCBUY2wgcHJvdmlkZXMgYSBudW1iZXIgb2YgYXR0cmFjdGl2ZSBmZWF0dXJlcyB0aGF0IHNpbXBseSBhcmVuJ3QgZm91bmQgaW4gYSB0eXBpY2FsIEMvQysrIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAgIDxwPgotPHA+Ci1JbiB0aGlzIGNoYXB0ZXIsIEkgZGVzY3JpYmUgU1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKSwgYSBkZXZlbG9wbWVudCB0b29sIHRoYXQgaW50ZWdyYXRlcyBDL0MrKyBjb2RlIHdpdGggVGNsIGFuZCBvdGhlciBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiAgIFNXSUcgaXMgYSBjb21waWxlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgVGNsIGV4dGVuc2lvbnMgdG8gZXhpc3RpbmcgQyBjb2RlLiAgIEl0IHJlcXVpcmVzIG5vIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgY29kZSBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIG1vc3QgQyBwcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgcG9pbnRlcnMsIGFycmF5cywgc3RydWN0dXJlcywgY2xhc3NlcywgYW5kIHNvIGZvcnRoLiAgICBVbmxpa2UgdHJhZGl0aW9uYWwgVGNsIGV4dGVuc2lvbiBwcm9ncmFtbWluZywgU1dJRyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBleHRlbnNpb25zIGFuZCBoaWRlcyBhbG1vc3QgYWxsIG9mIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMuICAgQXMgYSByZXN1bHQsIFNXSUcgbWFrZXMgaXQgZWFzeSB0byB1c2UgVGNsIGluIGEgcmFwaWRseSBjaGFuZ2luZyBDL0MrKyBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC0tZXZlbiBpZiB0aGUgdW5kZXJseWluZyBDL0MrKyBjb2RlIGRvZXMgbm90IGludm9sdmUgVGNsLiAgIDxwPgotPHA+Ci1TV0lHIGlzIGZyZWVseSBhdmFpbGFibGUgZnJvbSA8YSBocmVmPSJodHRwOi8vd3d3LnN3aWcub3JnIj53d3cuc3dpZy5vcmc8L2E+IGFuZCBzdXBwb3J0cyBUY2wgb24gVW5peCwgV2luZG93cy1OVCwgYW5kIE1hY2ludG9zaCBwbGF0Zm9ybXMuICBTV0lHIGFsc28gZ2VuZXJhdGVzIFBlcmwgYW5kIFB5dGhvbiBleHRlbnNpb25zIGFuZCBtYW55IG9mIHRoZSBmZWF0dXJlcyBkZXNjcmliZWQgaW4gdGhpcyBjaGFwdGVyIGFsc28gYXBwbHkgdG8gdGhvc2UgbGFuZ3VhZ2VzLiAgIEZpbmFsbHksIFNXSUcgaXMgcGFja2FnZWQgd2l0aCBtb3JlIHRoYW4gMzAwIHBhZ2VzIG9mIHR1dG9yaWFsLXN0eWxlIGRvY3VtZW50YXRpb24uICAgSXQgaXMgbm90IG15IGludGVudCB0byByZXBlYXQgdGhhdCBkb2N1bWVudGF0aW9uIGhlcmUgYWx0aG91Z2ggdGhlcmUgd2lsbCBiZSBzb21lIHVuYXZvaWRhYmxlIG92ZXJsYXAuICAgUmF0aGVyLCB0aGUgZ29hbCBpcyB0byBkZXNjcmliZSBob3cgU1dJRyB3b3Jrcywgd2hhdCBpdCBkb2VzLCBhbmQgaG93IGl0IGNhbiBiZSB1c2VkIGFzIGEgQy9DKysgZGV2ZWxvcG1lbnQgdG9vbC48cD4KLTxhIG5hbWU9Im42Ij48L2E+PGgzPiBUY2wgRXh0ZW5zaW9uIEJ1aWxkaW5nPC9oMz4KLVRjbCBwcm92aWRlcyBhbiBleHRlbnNpdmUgQyBBUEkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgY29tcGlsZWQgZXh0ZW5zaW9ucyBpbiBDIG9yIEMrKy4gICAgVG8gaW50ZWdyYXRlIFRjbCBhbmQgQy9DKyssIGl0IGlzIG5lY2Vzc2FyeSB0byB3cml0ZSAid3JhcHBlciBmdW5jdGlvbnMiIHRoYXQgcHJvdmlkZSB0aGUgZ2x1ZSBiZXR3ZWVuICBDIGFuZCB0aGUgVGNsIGludGVycHJldGVyLiAgIFRvIGlsbHVzdHJhdGUsIHN1cHBvc2UgdGhhdCB5b3Ugd2FudGVkIHRvIGFjY2VzcyB0aGUgcG93KHgseSkgZnVuY3Rpb24gaW4gdGhlIEMgbWF0aCBsaWJyYXJ5IGZyb20gVGNsLiAgICBUbyBkbyB0aGlzLCB5b3UgIHdvdWxkIHdyaXRlIGEgd3JhcHBlciBmdW5jdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIFBvd09iakNtZCAKLSAqCi0gKiBUY2wgOC54IHdyYXBwZXIgZm9yIHRoZSBwb3coeCx5KSBmdW5jdGlvbi4KLSAqLwotCi0jaW5jbHVkZSAmbHQ7bWF0aC5oJmd0OwotaW50IAotUG93T2JqQ21kKENsaWVudERhdGEgY2xpZW50RGF0YSwgVGNsX0ludGVycCAqaW50ZXJwLAotICAgICAgICAgIGludCBvYmpjLCBUY2xfT2JqICpDT05TVCBvYmp2W10pCi17Ci0JCVRjbF9PYmogICpyZXN1bHRwdHI7Ci0JCWRvdWJsZSAgICB4LHkscmVzdWx0OwotCQlpbnQgICAgICAgZXJyb3I7Ci0KLQkJaWYgKG9iamMgIT0gMykgewotCQkJVGNsX1dyb25nTnVtQXJncyhpbnRlcnAsMixvYmp2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzYWdlIDogcG93IHggeSIpOwotCQkJcmV0dXJuIFRDTF9FUlJPUjsKLQkJfQotCQllcnJvciA9IFRjbF9HZXREb3VibGVGcm9tT2JqKGludGVycCwgb2JqdlsxXSwgJmFtcDt4KTsKLQkJaWYgKGVycm9yICE9IFRDTF9PSykgcmV0dXJuIGVycm9yOwotCQllcnJvciA9IFRjbF9HZXREb3VibGVGcm9tT2JqKGludGVycCwgb2JqdlsyXSwgJmFtcDt5KTsKLQkJaWYgKGVycm9yICE9IFRDTF9PSykgcmV0dXJuIGVycm9yOwotCi0JCXJlc3VsdCA9IHBvdyh4LHkpOwotCQlyZXN1bHRwdHIgPSBUY2xfR2V0T2JqUmVzdWx0KGludGVycCk7Ci0JCVRjbF9TZXREb3VibGVPYmoocmVzdWx0cHRyLHJlc3VsdCk7Ci0JCXJldHVybiBUQ0xfT0s7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRvIG1ha2UgdGhpcyBuZXcgY29tbWFuZCBhdmFpbGFibGUgdG8gVGNsLCB5b3UgYWxzbyBuZWVkIHRvIHdyaXRlIGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHN1Y2ggYXMgZm9sbG93czo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbnQgCi1FeGFtcGxlX0luaXQoVGNsX0ludGVycCAqaW50ZXJwKSB7Ci0JCVRjbF9DcmVhdGVPYmpDb21tYW5kKGludGVycCwgInBvdyIsIFBvd09iakNtZCwKLQkJICAgICAgICAoQ2xpZW50RGF0YSkgTlVMTCwgKFRjbF9DbWREZWxldGVQcm9jICopIE5VTEwpOwotCQlyZXR1cm4gVENMX09LOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1GaW5hbGx5LCB0byBidWlsZCB0aGUgVGNsIGV4dGVuc2lvbiwgdGhlc2UgZnVuY3Rpb25zIChhbmQgdGhlIG9yaWdpbmFsIEMgZnVuY3Rpb25zKSBhcmUgY29tcGlsZWQgaW50byBhbiBleHRlbnNpb24gbW9kdWxlLiAgICBJbiBuZXdlciB2ZXJzaW9ucyBvZiBUY2wsIHRoaXMgaXMgdXN1YWxseSBkb25lIGJ5IGNvbXBpbGluZyB0aGUgZXh0ZW5zaW9uIG1vZHVsZSBpbnRvIGEgc2hhcmVkIGxpYnJhcnkgb3IgRExMIHRoYXQgY2FuIGJlIGR5bmFtaWNhbGx5IGxvYWRlZCBpbnRvIHRoZSBUY2wgaW50ZXJwcmV0ZXIuICAgIEluIHRoaXMgY2FzZSwgdXNpbmcgdGhlIG1vZHVsZSBmcm9tIFRjbCBtaWdodCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dGNsc2gKLSUgbG9hZCAuL2V4YW1wbGUuc28gRXhhbXBsZQotJSBwb3cgMiAzCi04LjAKLSUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gY2FzZXMgd2hlcmUgZHluYW1pYyBsb2FkaW5nIGlzIG5vdCBzdXBwb3J0ZWQsIGV4dGVuc2lvbiBtb2R1bGVzIGNhbiBiZSBjb21waWxlZCBpbnRvIHRoZSB0Y2xzaCBvciB3aXNoIGV4ZWN1dGFibGUgZGlyZWN0bHkgKGFsc28ga25vd24gYXMgc3RhdGljIGxpbmtpbmcpLiAgIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHdyaXRpbmcgYSA8dHQ+VGNsX0FwcEluaXQoKTwvdHQ+IGZ1bmN0aW9uIGFuZCBhIDx0dD5tYWluKCk8L3R0PiBmdW5jdGlvbi48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vKiBtYWluLmMgKi8KLSNpbmNsdWRlICZsdDt0Y2wuaCZndDsKLWludCBUY2xfQXBwSW5pdChUY2xfSW50ZXJwICppbnRlcnApOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0gICAgVGNsX01haW4oYXJnYywgYXJndiwgVGNsX0FwcEluaXQpOwotfQotaW50IFRjbF9BcHBJbml0KFRjbF9JbnRlcnAgKmludGVycCkgewotICAgICAgLyogSW5pdGlhbGl6ZSBUY2wgKi8KLSAgICAgIGlmIChUY2xfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikgewotICAgICAgICAgICByZXR1cm4gVENMX0VSUk9SOwotICAgICAgfQotICAgICAgLyogSW5pdGlhbGl6ZSBvdXIgZXh0ZW5zaW9uICovCi0gICAgICBpZiAoRXhhbXBsZV9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7Ci0gICAgICAgICAgIHJldHVybiBUQ0xfRVJST1I7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gVENMX09LOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbHRob3VnaCB3cml0aW5nIGEgc2ltcGxlIFRjbCBleHRlbnNpb24gbWF5IGJlIGVhc3kgZW5vdWdoLCBjb25zaWRlciB0aGUgcHJvYmxlbSBvZiBwcm92aWRpbmcgYSBUY2wgaW50ZXJmYWNlIHRvIGEgbGFyZ2UgQy9DKysgbGlicmFyeSBjb250YWluaW5nIGh1bmRyZWRzIG9mIGZ1bmN0aW9ucywgY2xhc3NlcywgIG9iamVjdHMsIHZhcmlhYmxlcywgYW5kIGNvbnN0YW50cy4gICBJbiB0aGlzIGNhc2UsIGl0IHdvdWxkIGJlIG5lY2Vzc2FyeSB0byB3cml0ZSBodW5kcmVkcyBvZiBjb21wbGljYXRlZCB3cmFwcGVyIGZ1bmN0aW9ucy0tLWEgdGltZSBjb25zdW1pbmcgdGFzayB0byBiZSBjZXJ0YWluLiAgTm90IG9ubHkgdGhhdCwgcHJvdmlkaW5nIGEgbWFwcGluZyBiZXR3ZWVuIEMgYW5kIFRjbCBpcyBmdXJ0aGVyIGNvbXBsaWNhdGVkIGJ5IGRhdGEgcmVwcmVzZW50YXRpb24gaXNzdWVzIGFuZCBvYmplY3QgbWFuYWdlbWVudCAoaS5lLiBob3cgZG8geW91IG1hbmFnZSBDL0MrKyBvYmplY3RzLCBwb2ludGVycywgYXJyYXlzLCBldGMuLi4pLiAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCBjb25zaWRlciB0aGUgdXNlIG9mIFRjbCBpbiBhIHJhcGlkbHkgY2hhbmdpbmcgQy9DKysgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgd2hlcmUgQVBJcyBhcmUgZXZvbHZpbmcsIHBhY2thZ2VzIG1pZ2h0IG9ubHkgYmUgcGFydGlhbGx5IGltcGxlbWVudGVkLCBhbmQgZGVzaWducyBhcmUgYmVpbmcgcmV2aXNlZC4gICBOZWVkbGVzcyB0byBzYXksIGl0IGlzIGRpZmZpY3VsdCB0byB3cml0ZSBhbmQgbWFpbnRhaW4gVGNsIHdyYXBwZXJzIGluIHRoaXMgc2V0dGluZy4gR2l2ZW4gdGhlIGNob2ljZSwgbW9zdCBkZXZlbG9wZXJzIHdvdWxkIHJhdGhlciBjb25jZW50cmF0ZSBvbiB0aGUgam9iIGF0IGhhbmQtLW5vdCB0aGUgdGFzayBvZiB3cml0aW5nIFRjbCB3cmFwcGVyIGNvZGUuICAgQXMgYSByZXN1bHQsIHRoZSB1c2Ugb2YgVGNsIG1pZ2h0IGJlIGlnbm9yZWQgZW50aXJlbHkgb3Igb25seSBjb25zaWRlcmVkIG11Y2ggbGF0ZXIgaW4gYSBwcm9qZWN0IChhZnRlciB0aGUgY29kZSBoYXMgc3RhYmlsaXplZCkuPHA+Ci08YSBuYW1lPSJuNyI+PC9hPjxoMz4gQSAzMCBTZWNvbmQgSW50cm9kdWN0aW9uIHRvIFNXSUc8L2gzPgotU1dJRyBpcyBhIGRldmVsb3BtZW50IHRvb2wgdGhhdCBhdXRvbWF0ZXMgdGhlIFRjbCBleHRlbnNpb24gYnVpbGRpbmcgcHJvY2Vzcy4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZWFybGllciBleGFtcGxlIG9mIHRoZSBwb3coeCx5KSBmdW5jdGlvbi4gICBXaXRoIFNXSUcsIHRoZSBUY2wgZXh0ZW5zaW9uIGNhbiBiZSBkZWZpbmVkIGVudGlyZWx5IGJ5IHRoZSBmb2xsb3dpbmcgZmlsZSAoYnkgY29udmVudGlvbiB0aGVzZSBhcmUgY2FsbGVkICJpbnRlcmZhY2UgZmlsZXMiIGFuZCBhcmUgdXN1YWxseSBnaXZlbiBhIDx0dD4uaTwvdHQ+IHN1ZmZpeCkgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPgotLy8gZXhhbXBsZS5pIDogQSBTaW1wbGUgU1dJRyBpbnRlcmZhY2UKLSVtb2R1bGUgZXhhbXBsZQotJXsKLSNpbmNsdWRlICZsdDttYXRoLmgmZ3Q7Ci0lfQotCi0vLyBBTlNJIEMvQysrIHByb3RvdHlwZXMKLWRvdWJsZSBwb3coZG91YmxlIHgsIGRvdWJsZSB5KTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBmaWxlLCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgVGNsIG1vZHVsZSBpcyBkZWZpbmVkIGVudGlyZWx5IHdpdGggQU5TSSBDIHByb3RvdHlwZXMuIEluc3RlYWQgb2Ygd3JpdGluZyB3cmFwcGVyIGNvZGUsIHlvdSBvbmx5IG5lZWQgdG8gbGlzdCB0aGUgZnVuY3Rpb25zIHRoYXQgeW91IHdhbnQgdG8gYWNjZXNzLiAgIEluIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlLCB0aGUgPHR0PiVtb2R1bGU8L3R0PiBkaXJlY3RpdmUgbmFtZXMgdGhlIGV4dGVuc2lvbiBtb2R1bGUuIFRoZSA8dHQ+JXssICV9PC90dD4gc2VjdGlvbiBpcyB1c2VkIHRvIGVuY2xvc2UgY29kZSB0aGF0IHNob3VsZCBiZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IHdyYXBwZXIgY29kZSAodXN1YWxseSB0aGlzIGlzIHVzZWQgdG8gZ3JhYiB0aGUgcmlnaHQgaGVhZGVyIGZpbGVzIGFuZCBwcm92aWRlIGFkZGl0aW9uYWwgc3VwcG9ydCBjb2RlIHdoZW4gbmVlZGVkKS48cD4KLTxwPgotVG8gYnVpbGQgdGhlIGV4dGVuc2lvbiwgeW91IHNpbXBseSBydW4gU1dJRyBvbiB0aGlzIGZpbGUgdG8gZ2VuZXJhdGUgdGhlIFRjbCB3cmFwcGVyIGNvZGUgKGluIHRoaXMgY2FzZSBTV0lHIGNyZWF0ZXMgYSBmaWxlIGNhbGxlZCBleGFtcGxlX3dyYXAuYykuICAgVGhpcyBmaWxlIGlzIHRoZW4gY29tcGlsZWQgaW50byBhIFRjbCBleHRlbnNpb24gbW9kdWxlIGV4YWN0bHkgYXMgYmVmb3JlLiBGb3IgZXhhbXBsZSAoc2hvd24gZm9yIExpbnV4KSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Jmd0OyBzd2lnIC10Y2w4IGV4YW1wbGUuaQotR2VuZXJhdGluZyB3cmFwcGVycyBmb3IgVGNsIDgueAotJmd0OyBnY2MgLWZwaWMgLWMgZXhhbXBsZV93cmFwLmMgCi0mZ3Q7IGdjYyAtc2hhcmVkIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28gLWxtIAotJmd0OyB0Y2xzaAotJSBsb2FkIC4vZXhhbXBsZS5zbyBleGFtcGxlCi0lIHBvdyAyIDMKLTguMAotJQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1XaXRoIFNXSUcsIHRoZSBleHRlbnNpb24gbW9kdWxlIHdvcmtzIGV4YWN0bHkgYXMgZXhwZWN0ZWQtLWhvd2V2ZXIsIHlvdSBkaWRuJ3QgaGF2ZSB0byBrbm93IGFueXRoaW5nIGFib3V0IFRjbCBvdGhlciB0aGFuIGtub3dpbmcgaG93IHRvIGNvbXBpbGUgYW5kIGxpbmsgdGhlIGZpbmFsIGV4dGVuc2lvbiBtb2R1bGUuIDxwPgotPHA+Ci1Vbmxpa2Ugbm9ybWFsIFRjbCBleHRlbnNpb24gYnVpbGRpbmcsIFNXSUcgZXh0ZW5zaW9ucyBjYW4gYmUgdmVyeSBlYXN5IHRvIGdlbmVyYXRlLiAgSW4gdGhlIGV4YW1wbGUsIHlvdSBjb3VsZCBlYXNpbHkgbWFrZSBhbiBpbnRlcmZhY2UgdG8gdGhlIGVudGlyZSAmbHQ7bWF0aC5oJmd0OyBsaWJyYXJ5IGJ5IHNpbXBseSBjb3B5aW5nIGFsbCBvZiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlcyBvdXQgb2YgdGhlIGhlYWRlciBmaWxlIGFuZCBwbGFjaW5nIHRoZW0gaW4gdGhlIGludGVyZmFjZS4gICBJZiB5b3UgbGF0ZXIgd2FudGVkIHRvIGNoYW5nZSB0aGUgVGNsIGludGVyZmFjZSwgeW91IHdvdWxkIHNpbXBseSBtYWtlIHRoZXNlIGNoYW5nZXMgdG8gdGhlIGludGVyZmFjZSBmaWxlLiAgVGhlIHJlc3VsdGluZyBUY2wgaW50ZXJmYWNlIHdvdWxkIHRoZW4gYmUgdXBkYXRlZCB3aGVuIHRoZSBleHRlbnNpb24gbW9kdWxlIHdhcyByZWNvbXBpbGVkLjxwPgotPHA+Ci1BdCB0aGlzIHBvaW50LCB5b3Uga25vdyBhYm91dCA5MCUgb2Ygd2hhdCB5b3UgbmVlZCB0byBrbm93IHRvIHN0YXJ0IHVzaW5nIFNXSUcgKGFuZCB0aGUgc2ltcGxlIGV4YW1wbGUgZ2l2ZW4gaGVyZSBjYW4gZXZlbiBiZSB1c2VkIGFzIGEgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgb3duIGFwcGxpY2F0aW9ucykuICAgVGhlIGtleSB0aGluZyB0byBrZWVwIGluIG1pbmQgaXMgdGhhdCBTV0lHIGlzIGVudGlyZWx5IGF1dG9tYXRpYyBhbmQgaXQgdXNlcyBhbiBleHRlbmRlZCBzdWJzZXQgb2YgQU5TSSBDIHN5bnRheC4gTW9kdWxlcyBjYW4gdXN1YWxseSBiZSBjcmVhdGVkIGJ5IHNpbXBseSBtYXNzYWdpbmcgZXhpc3RpbmcgaGVhZGVyIGZpbGVzIGFuZCBvdGhlciBzb3VyY2VzIG9mIEFOU0kgQyBwcm90b3R5cGVzLiAgICBJbiBmYWN0LCBtYW55IHVzZXJzIGFyZSBzdXJwcmlzZWQgdG8gZmluZCBvdXQgaG93IGVhc3kgaXQgY2FuIGJlIHRvIGJ1aWxkIFRjbCBleHRlbnNpb25zIGluIHRoaXMgbWFubmVyIChpbiBmYWN0LCAgb25lIGVhcmx5IFNXSUcgdXNlciB3YXMgYWJsZSB0byB3cmFwIHRoZSBlbnRpcmUgT3BlbkdMIGxpYnJhcnkgaW50byBhIFRjbCBtb2R1bGUgd2l0aCBsZXNzIHRoYW4gdGVuIG1pbnV0ZXMgb2YgZWZmb3J0ISkuPHA+Ci08YSBuYW1lPSJuMiI+PC9hPjxoMj4gQSBUb3VyIG9mIFNXSUc8L2gyPgotSW4gdGhpcyBzZWN0aW9uLCBJIHByb3ZpZGUgYSBoaWdoLWxldmVsIHRvdXIgb2YgU1dJRy4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSBxdWljayBvdmVydmlldyBhbmQgbm90IGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBTV0lHIHVzZXJzIG1hbnVhbCAod2hpY2ggY29udGFpbnMgYWxsIG9mIHRoZSBnb3J5IGRldGFpbHMpLiAgPHA+Ci08YSBuYW1lPSJuOCI+PC9hPjxoMz4gVGhlIERlc2lnbiBhbmQgSW1wbGVtZW50YXRpb24gb2YgU1dJRzwvaDM+Ci1JbiBhIG51dHNoZWxsLCBTV0lHIGlzIGEgc3BlY2lhbCBwdXJwb3NlIEMvQysrIGNvbXBpbGVyLiAgICBBcyBpbnB1dCwgU1dJRyBhY2NlcHRzIEFOU0kgQy9DKysgZGVmaW5pdGlvbnMgYW5kIHRyYW5zbGF0ZXMgdGhlbSBpbnRvIHRoZSBDIHdyYXBwZXIgY29kZSBuZWVkZWQgdG8gYWNjZXNzIHRoYXQgZnVuY3Rpb25hbGl0eSBmcm9tIGEgdmFyaWV0eSBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiAgU1dJRyBhbHNvIHVuZGVyc3RhbmRzIGEgbnVtYmVyIG9mIGRpcmVjdGl2ZXMgdGhhdCBhcmUgcHJlY2VkZWQgYnkgYSBgJScuICAgVGhlc2UgZGlyZWN0aXZlcyBhdWdtZW50IHRoZSBBTlNJIEMgZGVmaW5pdGlvbnMgYW5kIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IFNXSUcgdXNlcyB3aGVuIGdlbmVyYXRpbmcgdGhlIHdyYXBwZXIgY29kZS4gICAgIEZpbmFsbHksIGluIGFkZGl0aW9uIHRvIHByb2R1Y2luZyB3cmFwcGVyIGNvZGUsIFNXSUcgYWxzbyBnZW5lcmF0ZXMgZG9jdW1lbnRhdGlvbiBmaWxlcyAoaW4gQVNDSUksIEhUTUwsIG9yIExhVGVYKS4gICA8cD4KLTxwPgotCi1TV0lHIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuc2libGUgd2l0aCBuZXcgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgZG9jdW1lbnRhdGlvbiBtZXRob2RzLiAgIEluIGFkZGl0aW9uIHRvIHByb2R1Y2luZyB3cmFwcGVycyBmb3IgVGNsLCBTV0lHIGNhbiBiZSB1c2VkIGZvciBpbnRlcmZhY2luZyB3aXRoIGEgdmFyaWV0eSBvZiBvdGhlciBsYW5ndWFnZXMgaW5jbHVkaW5nIFBlcmwsIFB5dGhvbiwgYW5kIEd1aWxlIChpbiBmYWN0LCB1c2VycyBoYXZlIGV2ZW4gZGV2ZWxvcGVkIG1vZHVsZXMgZm9yIEphdmEgYW5kIGNvbW1lcmNpYWwgcGFja2FnZXMgc3VjaCBhcyBNQVRMQUIpLjxwPgotPHA+Ci1TV0lHIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkgYXMgYSBkZXZlbG9wbWVudCB0b29sIGZvciBpbnRlZ3JhdGluZyBwaHlzaWNzIGFwcGxpY2F0aW9ucyB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZXMuICAgIFdpdGggdGhpcyBpbiBtaW5kLCB0aGVyZSB3ZXJlIGEgbnVtYmVyIG9mIGRlc2lnbiBnb2FscyA6PHA+Ci08cD4KLTx1bD4KLTxsaT5Db21wbGV0ZSBhdXRvbWF0aW9uLiAgTW9kdWxlcyBzaG91bGQgYmUgY29tcGxldGVseSBkZWZpbmVkIGJ5IHRoZSBpbnB1dCB0byBTV0lHIGFuZCBmdWxseSBmdW5jdGlvbmFsLiAgIEluIG90aGVyIHdvcmRzLCBhIHVzZXIgc2hvdWxkIG5ldmVyIGhhdmUgdG8gbW9kaWZ5IFNXSUcncyBvdXRwdXQuCi08bGk+VXNlIEFOU0kgQy9DKysgc3ludGF4LiAgVGhpcyBtYWtlcyBTV0lHIGVhc3kgdG8gYXBwbHkgdG8gZXhpc3Rpbmcgc29mdHdhcmUgcGFja2FnZXMgYmVjYXVzZSBpbnRlcmZhY2VzIGNhbiBiZSBidWlsdCBmcm9tIGhlYWRlciBmaWxlcy4gIFRoZSBvdGhlciBiZW5lZml0IGlzIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gbGVhcm4gYSBzcGVjaWFsIGludGVyZmFjZSBkZWZpbml0aW9uIGxhbmd1YWdlIHRvIHVzZSBTV0lHLS1pZiB5b3Uga25vdyBDLCB0aGVuIHlvdSBhbHJlYWR5IGtub3cgbW9zdCBvZiBTV0lHLgotPGxpPk5vbi1pbnZhc2l2ZSBpbnRlcmZhY2UgYnVpbGRpbmcuICBTV0lHIGF0dGVtcHRzIHRvIG1ha2Ugc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMgd2l0aG91dCByZXF1aXJpbmcgbW9kaWZpY2F0aW9ucyB0byB0aGUgdW5kZXJseWluZyBDL0MrKyBjb2RlLiAgIAotPGxpPkxhbmd1YWdlIGluZGVwZW5kZW5jZS4gICBVc2luZyBhIGNvbW1vbiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiwgU1dJRyBjYW4gZ2VuZXJhdGUgbW9kdWxlcyBmb3IgUGVybCwgUHl0aG9uLCBHdWlsZSwgYW5kIGEgdmFyaWV0eSBvdGhlciBzeXN0ZW1zLiAgIERpZmZlcmVudCBsYW5ndWFnZXMgYXJlIGJldHRlciBhdCBkaWZmZXJlbnQgdGFza3MgKGFuZCBldmVyeW9uZSBzZWVtcyB0byBoYXZlIGEgcGVyc29uYWwgcHJlZmVyZW5jZSkuICBTV0lHIGFsbG93cyB5b3UgdG8ga2VlcCB5b3VyIG9wdGlvbnMgb3Blbi4KLTxsaT5BZGFwdGFiaWxpdHkuICAgR2l2ZW4gdGhlIGh1Z2UgdmFyaWV0eSBvZiBDL0MrKyBjb2Rpbmcgc3R5bGVzIGFuZCB0ZWNobmlxdWVzLCBTV0lHIG5lZWRzIHRvIGJlIGFibGUgdG8gYWRhcHQgaXRzZWxmIHRvIGFueSBudW1iZXIgb2Ygc2l0dWF0aW9ucy4gICBBcyBhIHJlc3VsdCwgU1dJRyBwcm92aWRlcyBhIHZhcmlldHkgb2YgY3VzdG9taXphdGlvbiBvcHRpb25zIGFzIHdlbGwgYXMgdGhlIGFiaWxpdHkgdG8gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QgaWYgbmVjZXNzYXJ5LiAgIExvb2tpbmcgYXQgaXQgYW5vdGhlciB3YXksIFNXSUcgaXMgZGVzaWduZWQgdG8gYnVpbGQgc2NyaXB0aW5nIGludGVyZmFjZXMsIG5vdCBsZWdpc2xhdGUgbW9yYWxpdHkuCi08bGk+RXh0ZW5zaWJpbGl0eS4gICAgVGhlIFNXSUcgY29tcGlsZXIgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgd2l0aCBuZXcgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgY2FwYWJpbGl0aWVzLiAgSW4gYWRkaXRpb24sIFNXSUcgaW5jbHVkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IHRoYXQgY2FuIGJlIHVzZWQgdG8gaGVscCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIGludGVyZmFjZXMgYW5kIHRvIHByb3ZpZGUgbW9yZSBmdW5jdGlvbmFsaXR5LgotPC91bD4KLTxwPgotVGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgaW50ZXJmYWNlIGRlc2NyaXB0aW9uIGFuZCB3cmFwcGVyIGNvZGUgaXMgb25lIG9mIFNXSUcncyBtb3N0IGltcG9ydGFudCBmZWF0dXJlcy4gICAgRmlyc3QsIGl0IGFsbG93cyBUY2wgdG8gYmUgdXNlZCB3aXRoIG9yZGluYXJ5IEMvQysrIGNvZGUtLWluIGZhY3QsIHRoaXMgY29kZSBkb2Vzbid0IG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgVGNsIGludGVyZmFjZS4gICAgU2Vjb25kLCAgdGhpcyBhbGxvd3MgZm9yIHJhcGlkIGNoYW5nZSBhbmQgZGV2ZWxvcG1lbnQuICAgSWYgdGhlIEMgY29kZSBjaGFuZ2VzIGluIHNvbWUgbWFubmVyLCB0aGUgVGNsIGludGVyZmFjZSBjYW4gYmUgZWFzaWx5IHJlZ2VuZXJhdGVkIHRvIHJlZmxlY3QgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbi4gICBJdCBpcyBhbHNvIGVhc3kgdG8gYnVpbGQgYSBzdGFuZC1hbG9uZSBDIGFwcGxpY2F0aW9uLCBzd2l0Y2ggc2NyaXB0aW5nIGxhbmd1YWdlcywgb3IgZXZlbiB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIG9mIFRjbCAoZm9yIGV4YW1wbGUsIHN3aXRjaGluZyBmcm9tIFRjbCA3LjYgdG8gVGNsIDguMCkuICAgRmluYWxseSwgU1dJRyBzaGlmdHMgdGhlIGZvY3VzIGZyb20gdGhlIGRldmVsb3BtZW50IG9mIFRjbCB3cmFwcGVyIGZ1bmN0aW9ucyB0byB0aGUgIHByb2JsZW0gYXQgaGFuZC4gIEFzIGEgcmVzdWx0LCBpdCBiZWNvbWVzIHBvc3NpYmxlIHRvIHVzZSBUY2wgaW4gc2l0dWF0aW9ucyB3aGVyZSBpdCBtaWdodCBvdGhlcndpc2UgaGF2ZSBub3QgYmVlbiBjb25zaWRlcmVkLjxwPgotPGEgbmFtZT0ibjkiPjwvYT48aDM+IFJ1bm5pbmcgU1dJRzwvaDM+Ci1TV0lHIGlzIGludm9rZWQgdXNpbmcgdGhlIDx0dD5zd2lnPC90dD4gY29tbWFuZC4gIFNXSUcgb3BlcmF0ZXMgbGlrZSBhIEMgY29tcGlsZXIgYW5kIGFjY2VwdHMgYSBudW1iZXIgb2Ygb3B0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3dpZyAmbHQ7b3B0aW9ucyZndDsgZmlsZW5hbWUKLQotLXRjbCAgICAgICAgICAgICAgIEdlbmVyYXRlIFRjbCA3Lnggd3JhcHBlcnMKLS10Y2w4ICAgICAgICAgICAgICBHZW5lcmF0ZSBUY2wgOC54IHdyYXBwZXJzCi0tcGVybDUgICAgICAgICAgICAgR2VuZXJhdGUgUGVybDUgd3JhcHBlcnMKLS1weXRob24gICAgICAgICAgICBHZW5lcmF0ZSBQeXRob24gd3JhcHBlcnMKLS1kYXNjaWkgICAgICAgICAgICBQcm9kdWNlIEFTQ0lJIGRvY3VtZW50YXRpb24KLS1kaHRtbCAgICAgICAgICAgICBQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbgotLWRsYXRleCAgICAgICAgICAgIFByb2R1Y2UgTGFUZVggZG9jdW1lbnRhdGlvbgotLWMrKyAgICAgICAgICAgICAgIEVuYWJsZSBDKysgbW9kZQotLW9iamMgICAgICAgICAgICAgIEVuYWJsZSBPYmplY3RpdmUtQyBtb2RlCi0tSWRpciAgICAgICAgICAgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBTV0lHIHNlYXJjaCBwYXRoCi0tbGZpbGUgICAgICAgICAgICAgSW5jbHVkZSBhIFNXSUcgbGlicmFyeSBmaWxlCi0tbyBvdXRmaWxlICAgICAgICAgU2V0IHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZQotLW1vZHVsZSBuYW1lICAgICAgIFNldCB0aGUgbW9kdWxlIG5hbWUKLS1Ec3ltYm9sICAgICAgICAgICBEZWZpbmUgYSBzeW1ib2wKLS12ZXJzaW9uICAgICAgICAgICBEaXNwbGF5IFNXSUcncyB2ZXJzaW9uIG51bWJlcgotLWhlbHAgICAgICAgICAgICAgIERpc3BsYXkgYWxsIG9wdGlvbnMKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyBpcyBvbmx5IGEgcGFydGlhbCBsaXN0IG9mIG9wdGlvbnMuICAgQSBmdWxsIGxpc3Rpbmcgb2Ygb3B0aW9ucyBjYW4gYmUgb2J0YWluZWQgYnkgaW52b2tpbmcgInN3aWcgLWhlbHAiLjxwPgotPHA+Ci1XaGVuIGdpdmVuIGFuIGlucHV0IGZpbGUgb2YgYDx0dD5teWZpbGUuaTwvdHQ+JywgU1dJRyB3aWxsIHByb2R1Y2UgYW4gb3V0cHV0IGZpbGUgb2YgYDx0dD5teWZpbGVfd3JhcC5jPC90dD4nIGFzIHdlbGwgYXMgYSBkb2N1bWVudGF0aW9uIGZpbGUuICBJZiBuZWNlc3NhcnksIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUgPHR0Pi1vPC90dD4gb3B0aW9uICh0aGlzIGlzIHNvbWV0aW1lcyBuZWNlc3Nhcnkgd2hlbiB3b3JraW5nIHdpdGggQysrIGNvbXBpbGVycyB0aGF0IGV4cGVjdCB0byBzZWUgYSBDKysgc3VmZml4IG9uIHNvdXJjZSBmaWxlcykuPHA+Ci08cD4KLUFsdGhvdWdoIFNXSUcgY2FuIGJlIGludm9rZWQgZGlyZWN0bHkgb24gdGhlIGNvbW1hbmQgbGluZSwgbW9zdCB1c2VycyBmaW5kIGl0IGVhc2llciB0byBpbnZva2UgU1dJRyB3aXRoaW4gYSBNYWtlZmlsZS4gIEEgdHlwaWNhbCBUY2wgTWFrZWZpbGUgbWlnaHQgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgU2FtcGxlIE1ha2VmaWxlIGZvciBhIFRjbCBleHRlbnNpb24KLVNSQ1MgICAgICAgICAgPSBleGFtcGxlLmMgICAgICAgICAjIFNvdXJjZSBmaWxlcwotT0JKUyAgICAgICAgICA9ICAgICAgICAgICAgICAgICAgICMgT2JqZWN0IGZpbGVzIChhbHJlYWR5IGNyZWF0ZWQpCi1JTlRFUkZBQ0UgICAgID0gZXhhbXBsZS5pICAgICAgICAgIyBTV0lHIEludGVyZmFjZSBmaWxlCi1XUkFQRklMRSAgICAgID0gJChJTlRFUkZBQ0U6Lmk9X3dyYXAuYykKLVdSQVBPQkogICAgICAgPSAkKElOVEVSRkFDRTouaT1fd3JhcC5vKQotVEFSR0VUICAgICAgICA9IGV4YW1wbGUuc28gICAgICAgICMgT3V0cHV0IGZpbGUKLQotCi0jIENvbXBpbGVyIG9wdGlvbnMKLUNDICAgICAgICAgICAgPSBnY2MKLUNGTEFHUyAgICAgICAgPQotSU5DTFVERSAgICAgICA9Ci0KLSMgU1dJRyBPcHRpb25zCi1TV0lHICAgICAgICAgID0gL3Vzci9sb2NhbC9iaW4vc3dpZwotU1dJR09QVCAgICAgICA9IC10Y2wgIyB1c2UgLXRjbDggZm9yIFRjbCA4LjAKLVNXSUdDQyAgICAgICAgPSAkKENDKQotCi0jIFJ1bGVzIGZvciBjcmVhdGluZyAubyBmaWxlcyBmcm9tIHNvdXJjZS4KLUNPQkpTICAgICAgICAgPSAkKFNSQ1M6LmM9Lm8pCi1BTExPQkpTICAgICAgID0gJChDT0JKUykgJChPQkpTKQotCi0jIFNoYXJlZCBsaWJyYXJ5IG9wdGlvbnMgKFNob3duIGZvciBMaW51eCkKLUNDU0hBUkVEICAgICAgPSAtZnBpYwotQlVJTEQgICAgICAgICA9ICQoQ0MpIC1zaGFyZWQKLQotIyBUY2wgaW5zdGFsbGF0aW9uICh3aGVyZSBpcyBUY2wvVGsgbG9jYXRlZCkKLVRDTF9JTkNMVURFICAgPSAtSS91c3IvbG9jYWwvaW5jbHVkZQotVENMX0xJQiAgICAgICA9IC1ML3Vzci9sb2NhbC9saWIKLQotIyBBZGRpdGlvbmFsIGxpbmsgbGlicmFyaWVzCi1MSUJTICAgICAgICAgID0gCi0KLS5TVUZGSVhFUzogLmMKLQotLmMubzoKLSAgICAgICAgJChDQykgJChDQ1NIQVJFRCkgJChDRkxBR1MpICQoSU5DTFVERSkgLWMgJCZsdDsKLQotYWxsOiAkKFRBUkdFVCkKLQotIyBDb252ZXJ0IHRoZSBTV0lHIHdyYXBwZXIgZmlsZSBpbnRvIGFuIG9iamVjdCBmaWxlCi0kKFdSQVBPQkopIDogJChXUkFQRklMRSkKLSAgICAgICAgJChTV0lHQ0MpIC1jICQoQ0NTSEFSRUQpICQoQ0ZMQUdTKSAkKFdSQVBGSUxFKSAkKElOQ0xVREUpIFwgCi0gICAgICAgICAgICAgJChUQ0xfSU5DTFVERSkKLQotIyBSdW4gU1dJRwotJChXUkFQRklMRSkgOiAkKElOVEVSRkFDRSkKLSAgICAgICAgJChTV0lHKSAkKFNXSUdPUFQpIC1vICQoV1JBUEZJTEUpICQoSU5URVJGQUNFKQotCi0jIEJ1aWxkIHRoZSBmaW5hbCBleHRlbnNpb24gbW9kdWxlCi0kKFRBUkdFVCk6ICQoV1JBUE9CSikgJChBTExPQkpTKQotICAgICAgICAkKEJVSUxEKSAkKFdSQVBPQkopICQoQUxMT0JKUykgJChMSUJTKSAtbyAkKFRBUkdFVCkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaW5kb3dzLU5UIHVzZXJzIGNhbiBpbnZva2UgU1dJRyBkaXJlY3RseSBmcm9tIHRoZSBNUy1ET1MgY29tbWFuZCBzaGVsbCwgZnJvbSBNYWtlZmlsZXMsIG9yIGFzIGEgc3BlY2lhbCBwcm9jZXNzaW5nIG9wdGlvbiBpbiB3aGF0ZXZlciBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0aGF0IHRoZXkgYXJlIHVzaW5nLiAgIEZvciBleGFtcGxlLCBpbiBWaXN1YWwgQysrLCB5b3UgY2FuIGludm9rZSBTV0lHIGluIHRoZSBzYW1lIG1hbm5lciBhcyB5b3Ugd291bGQgaW52b2tlIG90aGVyIGNvZGUgZ2VuZXJhdGlvbiB0b29scyBzdWNoIGFzIExleCBhbmQgWWFjYy4gICBDb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGZvciB5b3VyIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBtb3JlIGRldGFpbHMuPHA+Ci08YSBuYW1lPSJuMTAiPjwvYT48aDM+IFRoZSBJbnB1dCB0byBTV0lHPC9oMz4KLU1vc3QgaW50ZXJmYWNlIGZpbGVzIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQgPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBteW1vZHVsZQotJXsKLS8qIEluY2x1ZGUgaGVhZGVyIGZpbGVzIGhlcmUgKi8KLSNpbmNsdWRlICJteWhlYWRlci5oIgotJX0KLS8vIE5vdyBsaXN0IEFOU0kgQyBkZWNsYXJhdGlvbnMKLWV4dGVybiBkb3VibGUgZm9vKGRvdWJsZSk7Ci0uLi4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotU1dJRyBhbHNvIGluY2x1ZGVzIGEgcHJlcHJvY2Vzc29yIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGFuZCBtYWNybyBleHBhbnNpb24uICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG1peGVkIGludGVyZmFjZS9oZWFkZXIgZmlsZXMgdGhhdCBhcmUgYWNjZXB0YWJsZSB0byBib3RoIFNXSUcgYW5kIHRoZSBDIGNvbXBpbGVyLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8qIGV4YW1wbGUuaCA6IEEgTWl4ZWQgU1dJRy9DIGZpbGUgKi8KLQotI2lmZGVmIFNXSUcKLSVtb2R1bGUgZXhhbXBsZQotJXsKLSNpbmNsdWRlICJleGFtcGxlLmgiCi0lfQotI2VuZGlmCi0KLSNpZmRlZiBfX1NURENfXwotI2RlZmluZSBfQU5TSV9BUkdTKGEpICAgIGEKLSNlbHNlCi0jZGVmaW5lIF9BTlNJX0FSR1MoYSkgICAgKCkKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEVYVEVSTiAgIGV4dGVybiAiQyIKLSNlbHNlCi0jZGVmaW5lIEVYVEVSTiAgIGV4dGVybgotI2VuZGlmCi0KLS8qIE5vdyBkZWNsYXJlIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLUVYVEVSTiBkb3VibGUgZm9vIF9BTlNJX0FSR1MoKGRvdWJsZSkpOwotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUluIHN5c3RlbXMgdGhhdCBjaGFuZ2UgYWxvdCwgdGhpcyBhcHByb2FjaCBtYWtlcyBpdCBlYXNpZXIgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgYmV0d2VlbiBoZWFkZXIgZmlsZXMgYW5kIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoZXZlbiBpZiBoZWFkZXIgZmlsZXMgcGxheSBwcmVwcm9jZXNzb3IgdHJpY2tzIHRvIGFkZHJlc3Mgc3lzdGVtIGFuZCBjb21waWxlciBkZXBlbmRlbmNpZXMpLjxwPgotPHA+Ci1Gb3IgdGhlIG1vc3QgcGFydCwgYW55dGhpbmcgdGhhdCBjYW4gYmUgZ2l2ZW4gdG8gYSBDIGNvbXBpbGVyIGNhbiBhbHNvIGJlIGdpdmVuIHRvIFNXSUcuICAgSG93ZXZlciwgaXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhhdCBTV0lHIGlzIG5vdCBhIGZ1bGwgQy9DKysgY29tcGlsZXIuICBJbiBzb21lIGNhc2VzLCBpdCBtYXkgZ2V0IGNvbmZ1c2VkIGJ5IGV4dHJlbWVseSBjb21wbGljYXRlZCBkZWNsYXJhdGlvbnMuICAgT3RoZXIgZmVhdHVyZXMgc2ltcGx5IGFyZW4ndCBzdXBwb3J0ZWQtLWZvciBleGFtcGxlLCB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLCBvcGVyYXRvciBvdmVybG9hZGluZywgdGVtcGxhdGVzLCBldGMuLi4gIFdoZW4gaW4gZG91YnQsIHRoZSBiZXN0IHRoaW5nIHRvIGRvIGlzIHRyeSBpdCBhbmQgc2VlLiAgSWYgU1dJRyBjb21wbGFpbnMsIHlvdSBjYW4gZWl0aGVyIHJlbW92ZSB0aGUgb2ZmZW5kaW5nIGRlY2xhcmF0aW9uLCBjb21tZW50IGl0IG91dCwgb3IgdXNlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIGhpZGUgaXQuICAgIEhvd2V2ZXIsIHRoZSBTV0lHIGNvbXBpbGVyIGlzIGFsd2F5cyBpbXByb3Zpbmcgc28gY3VycmVudCBsaW1pdGF0aW9ucyBtYXkgYmUgZWxpbWluYXRlZCBpbiB0aGUgZnV0dXJlLjxwPgotPGEgbmFtZT0ibjExIj48L2E+PGgzPiBUaGUgQmFzaWMgVGNsIEludGVyZmFjZTwvaDM+Ci1TV0lHIGF0dGVtcHRzIHRvIHByb3ZpZGUgYSBkaXJlY3QgbWFwcGluZyBiZXR3ZWVuIEMgYW5kIFRjbC4gICBDIGZ1bmN0aW9ucyBhcmUgdHVybmVkIGludG8gbmV3IFRjbCBjb21tYW5kcy4gIEdsb2JhbCB2YXJpYWJsZXMgYXJlIHR1cm5lZCBpbnRvIFRjbCB2YXJpYWJsZXMgdXNpbmcgdGhlIHZhcmlhYmxlIGxpbmtpbmcgbWVjaGFuaXNtIGlmIHBvc3NpYmxlLiAgIENvbnN0YW50cyBhcmUgc2ltcGx5IHR1cm5lZCBpbnRvIHJlYWQtb25seSBUY2wgdmFyaWFibGVzLiAgICBUaHVzLCBpZiB5b3UgZ2l2ZSBTV0lHIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGZpbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUKLWV4YW1wbGUKLQotaW50IGZhY3RvcmlhbChpbnQgbik7Ci1leHRlcm4gZG91YmxlIE15X3ZhcmlhYmxlOwotI2RlZmluZSBQSSAzLjE0MTU5MjYKLWNvbnN0IGludCBTUEFNID0gNDI7Ci0uLi4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlc2UgZGVjbGFyYXRpb25zIGFyZSBhY2Nlc3NpYmxlIGluIFRjbCBhcyBmb2xsb3dzPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBwdXRzIFtmYWN0b3JpYWwgNF0gICAgICAgICAgIDsjIENhbGwgYSBDIGZ1bmN0aW9uCi0yNAotJSBzZXQgTXlfdmFyaWFibGUgMy40ICAgICAgICAgIDsjIENoYW5nZSBhIEMgZ2xvYmFsIHZhcmlhYmxlCi0lIHB1dHMgJE15X3ZhcmlhYmxlICAgICAgICAgICAgOyMgUmVhZCBhIEMgZ2xvYmFsIHZhcmlhYmxlCi0zLjQKLSUgcHV0cyAkUEkgICAgICAgICAgICAgICAgICAgICA7IyBPdXRwdXQgdGhlIHZhbHVlIG9mIGEgQyBjb25zdGFudAotMy4xNDE1OTI2Ci0lIHB1dHMgJFNQQU0KLTQyCi0lCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUZvciBDIGdsb2JhbCB2YXJpYWJsZXMsIHRoZSBUY2wgaW50ZXJwcmV0ZXIgb25seSBzdXBwb3J0cyBhIHNtYWxsIHN1YnNldCBvZiBDIGRhdGF0eXBlcyAoaW50LCBkb3VibGUsIGFuZCBjaGFyICopLiAgICBXaGVuIG90aGVyIGRhdGF0eXBlcyBhcmUgdXNlZCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcsPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c2hvcnQgTXlfc2hvcnQ7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNXSUcgY3JlYXRlcyBhIHBhaXIgb2YgYWNjZXNzb3IgZnVuY3Rpb25zIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnB1dHMgW015X3Nob3J0X2dldF0gICAgICAgICAgOyMgR2V0IHZhbHVlIG9mIGEgZ2xvYmFsIHZhcmlhYmxlCi1NeV9zaG9ydF9zZXQgNS41ICAgICAgICAgICAgIDsjIFNldCB2YWx1ZSBvZiBhIGdsb2JhbCB2YXJpYWJsZQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTIiPjwvYT48aDM+IFBvaW50ZXJzPC9oMz4KLVNXSUcgc3VwcG9ydHMgQy9DKysgcG9pbnRlcnMgYnkgbWFwcGluZyB0aGVtIGludG8gY2hhcmFjdGVyIHN0cmluZ3MgdGhhdCBlbmNvZGUgdGhlIHZhbHVlIGFuZCB0eXBlLiAgIEZvciBleGFtcGxlLCBhIHBvaW50ZXIgb2YgdHlwZSAiPHR0PlZlY3RvciAqPC90dD4iIHdvdWxkIGxvb2sgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIGluIFRjbCA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+XzEwMGY4ZTJfVmVjdG9yX3AKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotUG9pbnRlcnMgbWF5IGFwcGVhciB0aHJvdWdob3V0IGEgU1dJRyBpbnRlcmZhY2UgZmlsZS4gIEZ1cnRoZXJtb3JlLCB0eXBlIGRlZmluaXRpb25zIGFyZSBub3QgZ2VuZXJhbGx5IHJlcXVpcmVkLiAgRm9yIGV4YW1wbGUgOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSVtb2R1bGUgdmVjdG9yCi0lewotI2luY2x1ZGUgInZlY3Rvci5oIgotJX0KLQotVmVjdG9yICpuZXdfdmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopOwotZG91YmxlIGRvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKTsKLS4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiBUY2wsIHBvaW50ZXJzIGFyZSBvcGFxdWUgb2JqZWN0cyB0aGF0IGNhbiBiZSBwYXNzZWQgYXJvdW5kIGJldHdlZW4gZGlmZmVyZW50IEMgZnVuY3Rpb25zIGFuZCBvcGVyYXRlIGxpa2UgeW91IHdvdWxkIGV4cGVjdC4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCB2MSBbbmV3X1ZlY3RvciAyIDMgNF0gICAgICAgICMgQ3JlYXRlIHR3byB2ZWN0b3JzCi0lIHNldCB2MiBbbmV3X1ZlY3RvciA1IDYgN10KLSUgcHV0cyAkdjEgCi1fMTAwZjhlMl9WZWN0b3JfcAotJSBkb3RfcHJvZHVjdCAkdjEgJHYyCi01NgotJQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Gb3IgdGhlIG1vc3QgcGFydCwgcG9pbnRlcnMgaW4gVGNsIHdvcmsgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZXkgZG8gaW4gQy4gIEhvd2V2ZXIsICB0aGUgcHJpbWFyeSBkaWZmZXJlbmNlIGlzIHRoYXQgcG9pbnRlcnMgY2FuJ3QgYmUgZGVyZWZlcmVuY2VkIGluIFRjbC4gICBJbiBvdGhlciB3b3JkcywgeW91IGNhbid0IHBlZXIgaW5zaWRlIG9iamVjdHMgYW5kIG1hbmlwdWxhdGUgdGhlbSAod2VsbCwgYXQgbGVhc3Qgbm90IHdpdGhvdXQgYSBsaXR0bGUgaGVscCkuPHA+Ci08cD4KLUludGVyZXN0aW5nbHkgZW5vdWdoLCB0aGlzIGFwcHJvYWNoIGF2b2lkcyBhIG51bWJlciBvZiBkaWZmaWN1bHQgcHJvYmxlbXMgcmVsYXRlZCB0byBkYXRhIHJlcHJlc2VudGF0aW9uIGFuZCB3b3JraW5nIHdpdGggbXVsdGlwbGUgbGFuZ3VhZ2VzLiAgIEJ5IHN1cHBvcnRpbmcgcG9pbnRlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIFNXSUcgb3IgVGNsIHRvIHVuZGVyc3RhbmQgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgQy9DKysgb2JqZWN0cy4gIEluIGZhY3QsIFNXSUcgZG9lcyBub3QgbmVlZCB0aGUgZGVmaW5pdGlvbiBvZiBjb21wbGV4IG9iamVjdHMgaW4gb3JkZXIgdG8gdXNlIHRoZW0uICBGb3IgZXhhbXBsZSwgdGhlIFZlY3RvciB0eXBlIHdhcyB1c2VkIGFib3ZlLCBidXQgdGhlIGRlZmluaXRpb24gb2YgVmVjdG9ycyB3YXMgbmV2ZXIgc3BlY2lmaWVkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS48cD4KLTxwPgotRmluYWxseSwgU1dJRyB1c2VzIHRoZSBwb2ludGVyIHR5cGUtc2lnbmF0dXJlIHRvIHBlcmZvcm0gdHlwZS1jaGVja2luZy4gICBXaGVuZXZlciBhIHBvaW50ZXIgaXMgcGFzc2VkIHRvIGEgQyBmdW5jdGlvbiwgaXRzIHR5cGUgaXMgY2hlY2tlZCBhZ2FpbnN0IGFuIGV4cGVjdGVkIHZhbHVlLiAgSWYgYSBtaXNtYXRjaCBvY2N1cnMsIHRoZSBwb2ludGVyIHdpbGwgYmUgcmVqZWN0ZWQgYW5kIGEgVGNsIGVycm9yIHJhaXNlZC4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHNldCB2MSBbbmV3X3ZlY3RvciAyIDMgNF0KLSUgc2V0IG0gW25ld19tYXRyaXggMTAgMTBdCi0lIGRvdF9wcm9kdWN0ICR2MSAkbQotVHlwZSBlcnJvciBpbiBhcmd1bWVudCAyIG9mIGRvdF9wcm9kdWN0LiBFeHBlY3RlZCBfVmVjdG9yX3AuCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVdpdGggdHlwZSBjaGVja2luZywgaXQgaXMgc2FmZSB0byBwYXNzIHBvaW50ZXJzIGFyb3VuZCBpbiBUY2wgbXVjaCBpbiB0aGUgc2FtZSB3YXkgYXMgd291bGQgYmUgZG9uZSBpbiBDL0MrKyAod2hpY2ggbWF5IGJlIGEgZ29vZCBvciBiYWQgdGhpbmcgZGVwZW5kaW5nIG9uIHlvdXIgcG9pbnQgb2Ygdmlldy0tb3IgYWxsIGJhZCBpZiB5b3UncmUgYSBsYW5ndWFnZSBwdXJpc3QpLiAgIDxwPgotPGEgbmFtZT0ibjEzIj48L2E+PGgzPiBTdHJ1Y3R1cmVzIGFuZCBDbGFzc2VzPC9oMz4KLVRoZSBTV0lHIHBvaW50ZXIgbWVjaGFuaXNtIGlzIGEgcG93ZXJmdWwgd2F5IHRvIG1hbmlwdWxhdGUgQyBvYmplY3RzIGZyb20gVGNsLiAgSG93ZXZlciwgeW91IG1heSBhbHNvIHdhbnQgdG8gYWNjZXNzIHRoZSBpbnRlcm5hbHMgb2YgYW4gb2JqZWN0LiAgIFRvIHN1cHBvcnQgdGhpcywgU1dJRyBjYW4gcGFyc2UgQyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgYW5kIHR1cm4gdGhlbSBpbnRvICJhY2Nlc3NvciIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c3RydWN0IFZlY3RvciB7Ci0gICAgICBkb3VibGUgeCx5LHo7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1pcyB0cmFuc2xhdGVkIGludG8gdGhlIGZvbGxvd2luZyBjb2xsZWN0aW9uIG9mIEMgZnVuY3Rpb25zIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5kb3VibGUgVmVjdG9yX3hfZ2V0KHN0cnVjdCBWZWN0b3IgKm9iaikgewotCQlyZXR1cm4gb2JqLSZndDt4OwotfQotZG91YmxlIFZlY3Rvcl94X3NldChzdHJ1Y3QgVmVjdG9yICpvYmosIGRvdWJsZSB4KSB7Ci0JCXJldHVybiAob2JqLSZndDt4ID0geCk7Ci19Ci1kb3VibGUgVmVjdG9yX3lfZ2V0KHN0cnVjdCBWZWN0b3IgKm9iaikgewotCQlyZXR1cm4gb2JqLSZndDt5OwotfQotZG91YmxlIFZlY3Rvcl95X3NldChzdHJ1Y3QgVmVjdG9yICpvYmosIGRvdWJsZSB5KSB7Ci0JCXJldHVybiAob2JqLSZndDt5ID0geSk7Ci19Ci1kb3VibGUgVmVjdG9yX3pfZ2V0KHN0cnVjdCBWZWN0b3IgKm9iaikgewotCQlyZXR1cm4gb2JqLSZndDt6OwotfQotZG91YmxlIFZlY3Rvcl96X3NldChzdHJ1Y3QgVmVjdG9yICpvYmosIGRvdWJsZSB6KSB7Ci0JCXJldHVybiAob2JqLSZndDt6ID0geik7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFjY2Vzc29yIGZ1bmN0aW9ucyBzaW1wbHkgdGFrZSBhbiBvYmplY3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCBwcm92aWRlIGEgd2F5IHRvIG1hbmlwdWxhdGUgaXRzIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGZyb20gVGNsLiAgRm9yIGV4YW1wbGU8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIHYgaXMgYSBWZWN0b3IgdGhhdCBnb3QgY3JlYXRlZCBzb21laG93Ci0lIFZlY3Rvcl94X2dldCAkdgotMy41Ci0lIFZlY3Rvcl94X3NldCAkdiA3LjggICAgICAgICAgICA7IyBDaGFuZ2UgeCBjb21wb25lbnQKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU2ltaWxhciBhY2Nlc3MgaXMgcHJvdmlkZWQgZm9yIHVuaW9ucyBhbmQgdGhlIGRhdGEgbWVtYmVycyBvZiBDKysgY2xhc3Nlcy4gICA8cD4KLTxwPgotRm9yIEMrKyBjbGFzcyBkZWZpbml0aW9ucywgdGhlIHNhbWUgdGVjaG5pcXVlIGlzIHVzZWQgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gbWVtYmVyIGZ1bmN0aW9ucywgY29uc3RydWN0b3JzLCBhbmQgZGVzdHJ1Y3RvcnMuICAgRm9yIGV4YW1wbGUsPHA+Ci08YmxvY2txdW90ZT48cHJlPgotY2xhc3MgTGlzdCB7Ci1wdWJsaWM6Ci0gIExpc3QoKTsKLSAgfkxpc3QoKTsKLSAgaW50ICBzZWFyY2goY2hhciAqaXRlbSk7Ci0gIHZvaWQgaW5zZXJ0KGNoYXIgKml0ZW0pOwotICB2b2lkIHJlbW92ZShjaGFyICppdGVtKTsKLSAgY2hhciAqZ2V0KGludCBuKTsKLSAgaW50ICBsZW5ndGg7Ci1zdGF0aWMgdm9pZCBwcmludChMaXN0ICpsKTsKLX07Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLWlzIHRyYW5zbGF0ZWQgaW50byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+TGlzdCAgICAqbmV3X0xpc3QoKSB7Ci0JCXJldHVybiBuZXcgTGlzdDsKLX07Ci12b2lkICAgICBkZWxldGVfTGlzdChMaXN0ICpsKSB7Ci0JCWRlbGV0ZSBsOwotfQotaW50ICAgICAgTGlzdF9zZWFyY2goTGlzdCAqbCwgY2hhciAqaXRlbSkgewotCQlyZXR1cm4gbC0mZ3Q7c2VhcmNoKGl0ZW0pOwotfQotdm9pZCAgICAgTGlzdF9pbnNlcnQoTGlzdCAqbCwgY2hhciAqaXRlbSkgewotCQlsLSZndDtpbnNlcnQoaXRlbSk7Ci19Ci12b2lkICAgICBMaXN0X3JlbW92ZShMaXN0ICpsLCBjaGFyICppdGVtKSB7Ci0JCWwtJmd0O3JlbW92ZShpdGVtKTsKLX0KLWNoYXIgICAgKkxpc3RfZ2V0KExpc3QgKmwsIGludCBuKSB7Ci0JCXJldHVybiBsLSZndDtnZXQobik7Ci19Ci1pbnQgICAgICBMaXN0X2xlbmd0aF9nZXQoTGlzdCAqbCkgewotCQlyZXR1cm4gbC0mZ3Q7bGVuZ3RoOwotfQotaW50ICAgICAgTGlzdF9sZW5ndGhfc2V0KExpc3QgKmwsIGludCBuKSB7Ci0JCXJldHVybiAobC0mZ3Q7bGVuZ3RoID0gbik7Ci19Ci12b2lkICAgICBMaXN0X3ByaW50KExpc3QgKmwpIHsKLQkJTGlzdDo6cHJpbnQobCk7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdpdGhpbiBUY2wsIHlvdSBjYW4gdXNlIHRoZSBmdW5jdGlvbnMgYXMgZm9sbG93cyA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBzZXQgbCBbbmV3X0xpc3RdCi0lIExpc3RfaW5zZXJ0ICRsIEFsZQotJSBMaXN0X2luc2VydCAkbCBTdG91dAotJSBMaXN0X2luc2VydCAkbCBMYWdlcgotJSBMaXN0X3ByaW50ICRsCi1MYWdlcgotU3RvdXQKLUFsZQotJSBwdXRzIFtMaXN0X2xlbmd0aF9nZXQgJGxdCi0zCi0lIHB1dHMgJGwKLV8xMDA4NTYwX0xpc3RfcAotJSAKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1XaGlsZSBzb21ld2hhdCBwcmltaXRpdmUsIHRoZSBsb3ctbGV2ZWwgU1dJRyBpbnRlcmZhY2UgcHJvdmlkZXMgZGlyZWN0IGFuZCBmbGV4aWJsZSBhY2Nlc3MgdG8gYWxtb3N0IGFueSBDKysgb2JqZWN0LiAgICBBcyBpdCB0dXJucyBvdXQsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gcHJvdmlkZSBTV0lHIHdpdGggdGhlIGNvbXBsZXRlIGRlZmluaXRpb24gb2YgYSBzdHJ1Y3R1cmUgb3IgY2xhc3MuICAgQWNjZXNzIGNhbiBiZSByZXN0cmljdGVkIGJ5IG9ubHkgcHJvdmlkaW5nIGEgbGltaXRlZCBkZWZpbml0aW9uIChvciBubyBkZWZpbml0aW9uIGF0IGFsbCkuICA8cD4KLTxwPgotRm9yIEMrKywgU1dJRyBhbHNvIHN1cHBvcnRzIGluaGVyaXRhbmNlIChpbmNsdWRpbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2UpLiAgICBJbmhlcml0YW5jZSBoaWVyYXJjaGllcyBhcmUgZW5jb2RlZCBpbnRvIHRoZSBydW4tdGltZSBwb2ludGVyIHR5cGUtY2hlY2tlciBhbmQgd29yayBhcyB5b3Ugd291bGQgZXhwZWN0LiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCB0aGUgZm9sbG93aW5nIGNsYXNzZXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmNsYXNzIFNoYXBlIHsKLXB1YmxpYzoKLQkJdmlydHVhbCBkb3VibGUgYXJlYSgpID0gMDsKLQkJdmlydHVhbCBkb3VibGUgcGVyaW1ldGVyKCkgPSAwOwotfTsKLQotY2xhc3MgQ2lyY2xlIDogcHVibGljIFNoYXBlIHsKLXB1YmxpYzoKLQkJQ2lyY2xlKGRvdWJsZSByYWRpdXMpOwotCQl+Q2lyY2xlKCk7Ci0JCWRvdWJsZSBhcmVhKCk7Ci0JCWRvdWJsZSBwZXJpbWV0ZXIoKTsKLX07Ci0KLWNsYXNzIFNxdWFyZSA6IHB1YmxpYyBTaGFwZSB7Ci1wdWJsaWM6Ci0JCVNxdWFyZShkb3VibGUgd2lkdGgpOwotCQl+U3F1YXJlKCk7Ci0JCWRvdWJsZSBhcmVhKCk7Ci0JCWRvdWJsZSBwZXJpbWV0ZXIoKTsKLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIHRoZSBUY2wgaW50ZXJmYWNlLCAiQ2lyY2xlIiBhbmQgIlNxdWFyZSIgb2JqZWN0cyB3b3VsZCBiZSBhY2NlcHRlZCBhbnkgcGxhY2UgYSAiU2hhcGUiIGlzIGV4cGVjdGVkLiAgSG93ZXZlciwgdGhlIHR5cGUgc3lzdGVtIGRvZXMgbm90IGFsbG93IHNpdHVhdGlvbnMgdGhhdCBhcmUgaWxsZWdhbCAob3IgcHJvYmxlbWF0aWMpIGluIEMrKy4gRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnRjbHNoCi0lIHNldCBjIFtuZXdfQ2lyY2xlIDRdICAgICAgICAgICAgOyMgQ3JlYXRlIGEgY2lyY2xlCi0lIHNldCBzIFtuZXdfU3F1YXJlIDEwXSAgICAgICAgICAgOyMgQ3JlYXRlIGEgc3F1YXJlCi0lIFNxdWFyZV9hcmVhICRhICAgICAgICAgICAgICAgICAgOyMgVXNlIGRlcml2ZWQgY2xhc3MKLTEwMC4wCi0lIFNoYXBlX2FyZWEgJHMgICAgICAgICAgICAgICAgICAgOyMgVXNlIGJhc2UgY2xhc3MKLTEwMC4wCi0lIFNoYXBlX3BlcmltZXRlciAkYwotMjUuMTMyNzQxMjI4NwotJSBTcXVhcmVfYXJlYSAkYyAgICAgICAgICAgICAgICAgIyBUcnkgdG8gdmlvbGF0ZSB0aGUgdHlwZSBzeXN0ZW0KLVR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMSBvZiBTcXVhcmVfYXJlYS4gRXhwZWN0ZWQgX1NxdWFyZV9wLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMTQiPjwvYT48aDM+IFRoZSBPYmplY3QgSW50ZXJmYWNlPC9oMz4KLUFsdGhvdWdoIFNXSUcgdHVybnMgc3RydWN0dXJlcyBhbmQgY2xhc3NlcyBpbnRvIGFjY2Vzc29yIGZ1bmN0aW9ucywgYW4gb3B0aW9uYWwgb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSBpcyBhbHNvIGF2YWlsYWJsZS4gICBUaGlzIGludGVyZmFjZSBhbGxvd3MgQy9DKysgb2JqZWN0cyB0byBhcHBlYXIgbGlrZSBUY2wgb2JqZWN0cyAob3IgVGsgd2lkZ2V0cykuICAgICAgIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBMaXN0IGNsYXNzIG1lbnRpb25lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gICBVc2luZyB0aGUgb3B0aW9uYWwgb2JqZWN0IGludGVyZmFjZSwgeW91IGNvdWxkIHdyaXRlIHRoZSBmb2xsb3dpbmcgVGNsIGNvZGU8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIExpc3QgbCAgICAgICAgICAgICAgICAgIDsjIENyZWF0ZSBhIG5ldyBsaXN0Ci0lIGwgaW5zZXJ0IEFsZSAgICAgICAgICAgIDsjIEludm9rZSBzb21lIG1lbWJlciBmdW5jdGlvbnMKLSUgbCBpbnNlcnQgU3RvdXQKLSUgbCBpbnNlcnQgTGFnZXIKLSUgTGlzdF9wcmludCBbbCBjZ2V0IC10aGlzXQotTGFnZXIKLVN0b3V0Ci1BbGUKLSUgcHV0cyBbbCBjZ2V0IC1sZW5ndGhdICAgOyMgR2V0IHRoZSBsZW5ndGgKLTMKLSUgcHV0cyBbbCBjZ2V0IC10aGlzXSAgICAgOyMgR2V0IHRoZSBgdGhpcycgcG9pbnRlcgotXzEwMDg1NjBfTGlzdF9wCi0lIHJlbmFtZSBsICIiICAgICAgICAgICAgIDsjIERlbGV0ZSBsCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUZvciBtYW55IHVzZXJzLCB0aGlzIHByb3ZpZGVzIGEgbXVjaCBtb3JlIG5hdHVyYWwgaW50ZXJmYWNlIHRvIEMvQysrIG9iamVjdHMuICAgSXQgYWxzbyBsb29rcyByYXRoZXIgZmFtaWxpYXIgdG8gd2hhdCBpcyBkb25lIGluIFRjbCBleHRlbnNpb25zIHN1Y2ggYXMgW2luY3IgVGNsXS4gICAgRXZlbiB0aG91Z2ggdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgbWVjaGFuaXNtIGZvciBtYW5hZ2luZyBvYmplY3RzLCBpdCBpcyBzdGlsbCBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIHBvaW50ZXIgaGFuZGxpbmcgbWVjaGFuaXNtIGFscmVhZHkgZGVzY3JpYmVkLiAgIEluIHBhcnRpY3VsYXIsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gZXh0cmFjdCBhIHBvaW50ZXIgdmFsdWUgZnJvbSBhIFRjbCBvYmplY3QuICAgVGhpcyBjYW4gYmUgZG9uZSBieSBleHRyYWN0aW5nIHRoZSBgdGhpcycgdmFsdWUgZnJvbSBhbiBvYmplY3QgYXMgZm9sbG93czo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zZXQgdCBbbCBjZ2V0IC10aGlzXSAgICAgICMgRXh0cmFjdCB0aGUgcG9pbnRlciB2YWx1ZQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiBvdGhlciBjYXNlcywgaXQgbWF5IGJlIHVzZWZ1bCB0byB0dXJuIGFuIGV4aXN0aW5nIHBvaW50ZXIgaW50byBhIFRjbCBvYmplY3QuICAgVGhpcyBjYW4gYmUgZG9uZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5MaXN0IGwgLXRoaXMgJHQgICAgICAgICAgICMgVHVybiBhIHBvaW50ZXIgaW50byBhbiBvYmplY3QKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1BbHRob3VnaCB0aGUgb2JqZWN0IGludGVyZmFjZSBwcm92aWRlcyBhICJuYXR1cmFsIiBpbnRlcmZhY2UgdG8gb2JqZWN0cywgaXQgYWxzbyBoYXMgYSBudW1iZXIgb2YgbGltaXRhdGlvbnMuICBGaXJzdCwgaXQgY2FuIHJlc3VsdCBpbiBhIHN1YnN0YW50aWFsIGFtb3VudCBvZiBhZGRpdGlvbmFsIHdyYXBwZXIgY29kZS4gIElmIHdyYXBwaW5nIGh1bmRyZWRzIG9mIHN0cnVjdHVyZXMgYW5kIGNsYXNzZXMsIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUgY3JlYXRlZCBieSBTV0lHIGNhbiBiZSBxdWl0ZSBsYXJnZS4gIElmIHRoaXMgaXMgYSBjb25jZXJuLCB0aGUgb2JqZWN0IGludGVyZmFjZSBjYW4gYmUgZGlzYWJsZWQgYnkgcnVubmluZyBTV0lHIHdpdGggdGhlIGA8dHQ+LW5vb2JqZWN0PC90dD4nIG9wdGlvbi4gIFNlY29uZCwgU1dJRyBkb2VzIG5vdCBtYWtlIFRjbCBvYmplY3Qtb3JpZW50ZWQgaW4gdGhlIHNhbWUgc2Vuc2UgYXMgZXh0ZW5zaW9ucyBzdWNoIGFzIFtpbmNyIFRjbF0uICBGb3IgZXhhbXBsZSwgeW91IHdvdWxkIG5vdCBiZSBhYmxlIHRvIGluaGVyaXQgZnJvbSBvYmplY3RzIHdyYXBwZWQgYnkgU1dJRy4gIEZpbmFsbHksIHRoZSBvYmplY3QgaW50ZXJmYWNlIGNhbiBiZSBhd2t3YXJkIHRvIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIGZ1bmN0aW9ucyBleHBlY3RpbmcgcG9pbnRlcnMgc2luY2UgeW91IHdpbGwgbmVlZCB0byBjb252ZXJ0IGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gb2JqZWN0IG1vZGVsIGFuZCB0aGUgcG9pbnRlciBtb2RlbC4gIEFsdGhvdWdoIHRoaXMgaW50ZXJmYWNlIHdvbid0IGJlIGRlc2NyaWJlZCBtdWNoIGZ1cnRoZXIsIGFsbCBvZiB0aGUgZ29yeSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgU1dJRyBVc2VycyBNYW51YWwuPHA+Ci08YSBuYW1lPSJuMTUiPjwvYT48aDM+IFJlbmFtaW5nPC9oMz4KLVNvbWV0aW1lcyB0aGUgY29udGVudHMgb2YgYSBDL0MrKyBsaWJyYXJ5IHdpbGwgZ2VuZXJhdGUgYSBuYW1lc3BhY2UgY2xhc2ggd2l0aCBleGlzdGluZyBUY2wga2V5d29yZHMgYW5kIGNvbW1hbmRzLiAgIFRvIHJlc29sdmUgdGhlc2UgY29uZmxpY3RzLCBTV0lHIHByb3ZpZGVzIHRoZSA8dHQ+JW5hbWU8L3R0PiBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0uLi4KLSVuYW1lKG15bGluZGV4KSBpbnQgbGluZGV4KCk7Ci0uLi4KLSVuYW1lKGNsaXN0KSBjbGFzcyBsaXN0IHsKLXB1YmxpYzoKLSAgICAuLi4KLX07Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0dD4lbmFtZTwvdHQ+IHNpbXBseSBjaGFuZ2VzIHRoZSBuYW1lIG9mIGEgY29tbWFuZCwgY2xhc3MsIG9yIG1lbWJlciBmdW5jdGlvbiB3aGVuIHVzZWQgaW4gVGNsIChpdCBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIEMgY29kZSkuPHA+Ci08YSBuYW1lPSJuMTYiPjwvYT48aDM+IFJlYWQtb25seSB2YXJpYWJsZXM8L2gzPgotVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGRhdGEgbWVtYmVycyBvZiBzdHJ1Y3R1cmVzLCBTV0lHIHByb3ZpZGVzIHRoZSA8dHQ+JXJlYWRvbmx5PC90dD4gYW5kIDx0dD4lcmVhZHdyaXRlPC90dD4gZGlyZWN0aXZlcy4gICAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVyZWFkb25seQotZG91YmxlIGZvbzsgICAgICAgICAvLyBmb28gd2lsbCBiZSByZWFkLW9ubHkKLWludCAgICBiYXI7ICAgICAgICAgLy8gYmFyIHdpbGwgYmUgcmVhZC1vbmx5Ci0lcmVhZHdyaXRlCi1pbnQgc3BhbSA9IDQyOyAgICAgIC8vIHNwYW0gaXMgcmVhZC13cml0ZQotCi1jbGFzcyBMaXN0IHsKLXB1YmxpYzoKLS4uLgotJXJlYWRvbmx5Ci0gICAgIGludCBsZW5ndGg7ICAgICAgICAvLyBsZW5ndGggd2lsbCBiZSByZWFkb25seQotJXJlYWR3cml0ZQotLi4uCi19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1SZWFkLW9ubHkgbW9kZSBzdGF5cyBpbiBlZmZlY3QgdW50aWwgaXQgaXMgZXhwbGljaXRseSBkaXNhYmxlZCB3aXRoIHRoZSA8dHQ+JXJlYWR3cml0ZTwvdHQ+IGRpcmVjdGl2ZS48cD4KLTxhIG5hbWU9Im4xNyI+PC9hPjxoMz4gRmlsZSBJbmNsdXNpb24gYW5kIHRoZSBTV0lHIExpYnJhcnk8L2gzPgotU1dJRyBwcm92aWRlcyBhbiA8dHQ+JWluY2x1ZGU8L3R0PiBkaXJlY3RpdmUgdGhhdCBjYW4gYmUgdXNlZCB0byBicmVhayB1cCBpbnRlcmZhY2VzIGludG8gbXVsdGlwbGUgZmlsZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdlcmUgY3JlYXRpbmcgYW4gaW50ZXJmYWNlIHRvIGEgbGFyZ2UgcGFja2FnZSwgeW91IG1pZ2h0IHdyaXRlIGFuIGludGVyZmFjZSBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEludGVyZmFjZSB0byBPcGVuR0wKLSVtb2R1bGUgb3BlbmdsCi0KLS8vIEluY2x1ZGUgYSB2YXJpZXR5IG9mIHBpZWNlcwotJWluY2x1ZGUgZ2wuaQotJWluY2x1ZGUgZ2x1LmkKLSVpbmNsdWRlICJHTC9nbHVhdXguaCIKLSVpbmNsdWRlICJ0ZXN0LmMiCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBvdGhlciB1c2Ugb2YgPHR0PiVpbmNsdWRlPC90dD4gaXMgdG8gcmV0cmlldmUgZmlsZXMgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5LS1hIHJlcG9zaXRvcnkgb2YgY29tbW9uIG1vZHVsZXMgYW5kIGV4dGVuc2lvbnMgdGhhdCBpcyBwYWNrYWdlZCB3aXRoIHRoZSBTV0lHIGRpc3RyaWJ1dGlvbi4gICAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gcmVsaW5rIHRoZSA8dHQ+dGNsc2g8L3R0PiBpbnRlcnByZXRlciB3aXRoIGEgU1dJRyBleHRlbnNpb24gYWRkZWQgdG8gaXQsIHlvdSBjYW4gZG8gdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0lewotI2luY2x1ZGUgIm15aGVhZGVyLmgiCi0lfQotJWluY2x1ZGUgdGNsc2guaSAgICAgICAgICAgICAgLy8gSW5jbHVkZSBUY2xfQXBwSW5pdCgpIGNvZGUgZm9yIHRjbHNoCi0KLS8vIEMgZGVjbGFyYXRpb25zCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIHRoaXMgY2FzZSwgdGhlIGxpYnJhcnkgZmlsZSBwcm92aWRlcyBhbGwgb2YgdGhlIGFkZGl0aW9uYWwgc3VwcG9ydCBjb2RlICg8dHQ+VGNsX0FwcEluaXQoKSwgbWFpbigpPC90dD4sIGV0Yy4uLikgbmVlZGVkIHRvIGJ1aWxkIGEgbmV3IHZlcnNpb24gb2YgPHR0PnRjbHNoPC90dD4uPHA+Ci08cD4KLUxpYnJhcnkgZmlsZXMgY2FuIGFsc28gYmUgaW5jbHVkZWQgb24gdGhlIGNvbW1hbmQgbGluZSB1c2luZyB0aGUgPHR0Pi1sPC90dD4gb3B0aW9uLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc3dpZyAtdGNsOCAtbHdpc2guaSBleGFtcGxlLmkKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotV2hlbiBmaWxlcyBhcmUgaW5jbHVkZWQgaW4gdGhpcyBtYW5uZXIsIHRoZXkgYXJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIFNXSUcgaW5wdXQgZmlsZSAoaS5lLiBmaWxlcyBpbmNsdWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBwYXJzZWQgbGFzdCkuPHA+Ci08YSBuYW1lPSJuMTgiPjwvYT48aDM+IENvZGUgSW5zZXJ0aW9uPC9oMz4KLVNvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8gaW5zZXJ0IHN1cHBvcnQgY29kZSBpbnRvIHRoZSByZXN1bHRpbmcgd3JhcHBlciBmaWxlIGdlbmVyYXRlZCBieSBTV0lHLiAgIFRoZSB3cmFwcGVyIGZpbGUgcHJvZHVjZWQgYnkgU1dJRyBjb25zaXN0cyBvZiB0aHJlZSBzZWN0aW9ucy0tLWEgaGVhZGVyIHNlY3Rpb24gY29udGFpbmluZyBkZWNsYXJhdGlvbnMgdGhhdCBtdXN0IGFwcGVhciBiZWZvcmUgYW55IHdyYXBwZXIgZnVuY3Rpb25zLCBhIHdyYXBwZXIgY29kZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCBUY2wgd3JhcHBlciBmdW5jdGlvbnMsIGFuZCBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0aGF0IHJlZ2lzdGVycyB0aGUgbW9kdWxlJ3MgZnVuY3Rpb25hbGl0eSB3aXRoIFRjbC48cD4KLTxwPgotPHA+Ci1Db2RlIGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBoZWFkZXIgc2VjdGlvbiBieSBlbmNsb3NpbmcgaXQgd2l0aCAleywgJX0gKHRoZXNlIGFyZSBhbHNvIGtub3duIGFzIGNvZGUgYmxvY2tzKS4gICBXZSBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIHVzZWQgdG8gaW5jbHVkZSB0aGUgcmlnaHQgaGVhZGVyIGZpbGVzLiAgSG93ZXZlciwgeW91IGNhbiBhbHNvIGluY2x1ZGUgc3VwcG9ydGluZyBDIGZ1bmN0aW9ucy4gICBGb3IgZXhhbXBsZSA6PHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBteW1vZHVsZQotJXsKLSNpbmNsdWRlICJteV9oZWFkZXIuaCIKLSV9Ci0KLS4uLiBEZWNsYXJlIEMgZnVuY3Rpb25zIGhlcmUKLQotLy8gTm93IGluY2x1ZGUgYSBUY2xfQXBwSW5pdCBmdW5jdGlvbiAobm90ZTogdGhlIHRjbHNoLmkgbGlicmFyeSBmaWxlCi0vLyBkb2VzIHRoZSBzYW1lIHRoaW5nKS4KLSV7Ci1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgVGNsX01haW4oYXJnYywgYXJndiwgVGNsX0FwcEluaXQpOwotICByZXR1cm4oMCk7Ci19Ci0KLWludCBUY2xfQXBwSW5pdChUY2xfSW50ZXJwICppbnRlcnApewotICBpbnQgTXltb2R1bGVfSW5pdChUY2xfSW50ZXJwICopOyAKLQotICBpZiAoVGNsX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIAotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0KLSAgLyogTm93IGluaXRpYWxpemUgb3VyIGZ1bmN0aW9ucyAqLwotICBpZiAoTXltb2R1bGVfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikKLSAgICByZXR1cm4gVENMX0VSUk9SOwotICByZXR1cm4gVENMX09LOwotfQotJX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQ29kZSBibG9ja3MgYXJlIGFsc28gc29tZXRpbWVzIHVzZWQgdG8gd3JpdGUgaGVscGVyIGZ1bmN0aW9ucy4gICBUaGVzZSBhcmUgQyBmdW5jdGlvbnMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIGluIHRoZSBUY2wgaW50ZXJmYWNlLCBidXQgbWlnaHQgbm90IGJlIHBhcnQgb2YgdGhlIG9yaWdpbmFsIEMgbGlicmFyeSBvciBwYWNrYWdlLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEluY2x1ZGUgYSBzdXBwb3J0IGZ1bmN0aW9uIGluIG91ciBtb2R1bGUKLSV7Ci0vKiBDcmVhdGUgYSBuZXcgdmVjdG9yICovCi1zdGF0aWMgVmVjdG9yICpuZXdfVmVjdG9yKCkgewotICAgIHJldHVybiAoVmVjdG9yICopIG1hbGxvYyhzaXplb2YoVmVjdG9yKSk7Ci19Ci0lfQotCi0vLyBOb3cgdGVsbCBTV0lHIGFib3V0IGl0LgotVmVjdG9yICpuZXdfVmVjdG9yKCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVNpbmNlIHdyaXRpbmcgaGVscGVyIGZ1bmN0aW9ucyBpcyByZWxhdGl2ZWx5IGNvbW1vbiwgYSBzaG9ydGhhbmQgZm9ybSBvZiB0aGUgYWJvdmUgaXMgYXZhaWxhYmxlIHVzaW5nIHRoZSA8dHQ+JWlubGluZTwvdHQ+IGRpcmVjdGl2ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4laW5saW5lICV7Ci0vKiBDcmVhdGUgYSBuZXcgdmVjdG9yICovCi1WZWN0b3IgKm5ld19WZWN0b3IoKSB7Ci0gICAgcmV0dXJuIChWZWN0b3IgKikgbWFsbG9jKHNpemVvZihWZWN0b3IpKTsKLX0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZTx0dD4gJWlubGluZTwvdHQ+IGRpcmVjdGl2ZSBpcyByZWFsbHkganVzdCBhIGNvbnZlbmllbnQgd2F5IHRvIHdyaXRlIG5ldyBDL0MrKyBmdW5jdGlvbnMgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBpbmNsdWRlIGluIHlvdXIgVGNsIGludGVyZmFjZS48cD4KLTxwPgotSWYgeW91IHdhbnQgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLCB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVpbml0ICV7Ci0gICAgaW5pdF9tb2R1bGUoKTsgICAgICAgLy8gUGVyZm9ybSBtb2R1bGUtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KLSV9Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgY29kZSB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gVGNsIGxvYWRzIG9yIGluaXRpYWxpemVzIHlvdXIgZXh0ZW5zaW9uIG1vZHVsZSBhbmQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB5b3VyIGFwcGxpY2F0aW9uLjxwPgotPHA+Ci1GaW5hbGx5LCB0aGVyZSBpcyBhIDx0dD4ld3JhcHBlcjwvdHQ+IGRpcmVjdGl2ZSBmb3IgaW5jbHVkaW5nIGNvZGUgaW50byB0aGUgd3JhcHBlciBzZWN0aW9uIG9mIFNXSUcncyBvdXRwdXQuICAgVGhpcyBpcyByYXJlbHkgdXNlZCAob3IgbmVjZXNzYXJ5KSBidXQgaXMgYXZhaWxhYmxlIGZvciBzcGVjaWFsIGNhc2VzLjxwPgotPGEgbmFtZT0ibjE5Ij48L2E+PGgzPiBTdHJ1Y3R1cmUgYW5kIENsYXNzIEV4dGVuc2lvbjwvaDM+Ci1UaGUgb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSBwcm92aWRlcyBhIG5pY2Ugd2F5IHRvIG1hbmlwdWxhdGUgQyBzdHJ1Y3R1cmVzIGFuZCBDKysgY2xhc3Nlcy4gIEhvd2V2ZXIsICBpbiBzb21lIGNhc2VzLCB5b3UgbWF5IHdhbnQgdG8gZXh0ZW5kIHN0cnVjdHVyZXMgYW5kIGNsYXNzZXMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50ZWQgdG8gbWFuaXB1bGF0ZSB0aGUgZm9sbG93aW5nIEMgc3RydWN0dXJlIGZyb20gVGNsIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zdHJ1Y3QgVmVjdG9yIHsKLSAgICAgZG91YmxlIHgsIHksIHo7Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BcyBpcywgdGhlcmUgaXMgbm8gd2F5IHRvIGNyZWF0ZSwgZGVzdHJveSwgb3IgbG9vayBhdCBWZWN0b3JzIGluIGEgY29udmVuaWVudCBtYW5uZXIuICBIb3dldmVyLCB3aXRoIFNXSUcsIHlvdSBjYW4gZXh0ZW5kIHRoZSBWZWN0b3IgY2xhc3Mgd2l0aCBzb21lIG5ldyBtZXRob2RzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgdmVjdG9yCi0lewotI2luY2x1ZGUgInZlY3Rvci5oIgotJX0KLQotc3RydWN0IFZlY3RvciB7Ci0gICAgIGRvdWJsZSB4LHksejsKLX07Ci0KLS8vIE5vdyBleHRlbmQgdGhlIFZlY3RvciBzdHJ1Y3R1cmUgd2l0aCBzb21lIG1ldGhvZHMKLSVhZGRtZXRob2RzIFZlY3RvciB7Ci0gICAgICAvLyBDcmVhdGUgYSBuZXcgdmVjdG9yCi0gICAgICBWZWN0b3IoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeikgewotICAgICAgICAgIFZlY3RvciAqdiA9IChWZWN0b3IgKikgbWFsbG9jKHNpemVvZihWZWN0b3IpKTsKLSAgICAgICAgICB2LSZndDt4ID0geDsKLSAgICAgICAgICB2LSZndDt5ID0geTsKLSAgICAgICAgICB2LSZndDt6ID0gejsKLSAgICAgICAgICByZXR1cm4gejsKLSAgICAgIH0KLSAgICAgIC8vIERlc3Ryb3kgYSB2ZWN0b3IKLSAgICAgIH5WZWN0b3IoKSB7Ci0gICAgICAgICAgZnJlZShzZWxmKTsKLSAgICAgICB9Ci0gICAgICAgLy8gUHJpbnQgb3V0IGEgdmVjdG9yIGZvciBkZWJ1Z2dpbmcKLSAgICAgICB2b2lkIG91dHB1dCgpIHsKLSAgICAgICAgICBwcmludGYoIlsgJWcsICVnLCAlZyBdXG4iLCBzZWxmLSZndDt4LCBzZWxmLSZndDt5LCBzZWxmLSZndDt6KTsKLSAgICAgICB9Ci19OwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Ob3csIGluIFRjbCwgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIFZlY3RvciB2IDIgNS41IC05ICAgICAgICAgIDsgIyBDcmVhdGUgYSBuZXcgdmVjdG9yCi0lIHYgb3V0cHV0ICAgICAgICAgICAgICAgICAgIDsgIyBPdXRwdXQgaXQncyB2YWx1ZQotWyAyLCA1LjUsIC05IF0KLSUgcmVuYW1lIHYgIiIgICAgICAgICAgICAgICAgOyAjIERlc3Ryb3kgdiAoY2FsbHMgdGhlIGRlc3RydWN0b3IpCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRodXMsIHdpdGgganVzdCBhIGxpdHRsZSB3b3JrLCB5b3UgY2FuIHR1cm4gYSBDIHN0cnVjdHVyZSBpbnRvIHNvbWV0aGluZyB0aGF0IGxvb2tzIGFsb3QgbGlrZSBhIEMrKyBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgbWV0aG9kcy4gICBIb3dldmVyLCB0aGlzIGlzIGRvbmUgd2l0aG91dCBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIEMgc3RydWN0dXJlIG9yIHJlcXVpcmluZyBhIEMrKyBjb21waWxlci48cD4KLTxwPgotSnVzdCBhcyBDIHN0cnVjdHVyZXMgY2FuIGJlIGV4dGVuZGVkLCBDKysgY2xhc3NlcyBjYW4gYWxzbyBiZSBleHRlbmRlZCB3aXRoIG5ldyBtZXRob2RzLiAgVGhlIGV4dGVuc2lvbiBwcm9jZXNzIGRvZXMgbm90IG1vZGlmeSB0aGUgb3JpZ2luYWwgY2xhc3Mgbm9yIGRvZXMgaXQgcmVseSB1cG9uIEMrKyBpbmhlcml0YW5jZS4gIDxwPgotPGEgbmFtZT0ibjIwIj48L2E+PGgzPiBFeGNlcHRpb24gSGFuZGxpbmc8L2gzPgotSW4gc29tZSBDL0MrKyBhcHBsaWNhdGlvbnMgaXQgbWF5IGJlIHVzZWZ1bCB0byBjYXRjaCBlcnJvcnMgYW5kIHRyYW5zbGF0ZSB0aGVtIGludG8gVGNsIGVycm9ycy4gIFRoaXMgY2FuIGJlIGRvbmUgdXNpbmcgdGhlIDx0dD4lZXhjZXB0PC90dD4gZGlyZWN0aXZlLiAgIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBDb2RlIGZvciBjYXRjaGluZyBhIEMrKyBleGNlcHRpb24KLSVleGNlcHQodGNsKSB7Ci0gICAgdHJ5IHsKLSAgICAgICAgICRmdW5jdGlvbiAgICAgICAvLyBUaGUgcmVhbCBmdW5jdGlvbiBjYWxsIGlzIHBsYWNlZCBoZXJlCi0gICAgfSBjYXRjaCAoUmFuZ2VFcnJvcikgewotICAgICAgICAgaW50ZXJwLSZndDtyZXN1bHQgPSAiT3V0IG9mIGJvdW5kcy4iOwotICAgICAgICAgcmV0dXJuIFRDTF9FUlJPUjsKLSAgICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBjb2RlIHlvdSBzdXBwbHkgaXMgaW5zZXJ0ZWQgZGlyZWN0bHkgaW50byB0aGUgd3JhcHBlciBjb2RlIGNyZWF0ZWQgYnkgU1dJRy4gIFRoZSBgJGZ1bmN0aW9uJyB0b2tlbiBpcyBzaW1wbHkgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGFjdHVhbCBDL0MrKyBmdW5jdGlvbiBjYWxsLiAgIFRoZSBleGNlcHRpb24gaGFuZGxlciByZW1haW5zIGluIGVmZmVjdCB1bmRlciBpdCBpcyByZWRlZmluZWQgb3IgZGlzYWJsZWQuICAgRXhjZXB0aW9ucyBjYW4gYmUgZGlzYWJsZWQgYnkgc2ltcGx5IG9taXR0aW5nIHRoZSBjb2RlLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiAlZXhjZXB0KHRjbCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRXhjZXB0aW9uIGhhbmRsaW5nIGlzIG5vdCBsaW1pdGVkIHRvIEMrKyBleGNlcHRpb25zIG9yIGFueSBwYXJ0aWN1bGFyIGVycm9yIGhhbmRsaW5nIG1lY2hhbmlzbS4gICBFc3NlbnRpYWxseSBhbnkgdmFsaWQgQy9DKysgY29kZSBmb3IgY2hlY2tpbmcgZXJyb3JzIGNhbiBiZSB1c2VkIHdpdGggdGhlIDx0dD4lZXhjZXB0PC90dD4gZGlyZWN0aXZlLjxwPgotPHA+Ci1TV0lHIGFsc28gcHJvdmlkZXMgYW4gZXhjZXB0aW9uIGhhbmRsaW5nIGxpYnJhcnksIDx0dD5leGNlcHRpb24uaTwvdHQ+LCAgdGhhdCBjYW4gYmUgdXNlZCB0byBoYW5kbGUgZXhjZXB0aW9ucyBpbiBhIGxhbmd1YWdlLW5ldXRyYWwgbWFubmVyLiAgIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBJbmNsdWRlIHRoZSBTV0lHIGV4Y2VwdGlvbiBoYW5kbGluZyBsaWJyYXJ5Ci0laW5jbHVkZSBleGNlcHRpb24uaQotLy8gU3BlY2lmeSBhIGdlbmVyaWMgZXhjZXB0aW9uIGhhbmRsZXIgKHdvcmtzIHdpdGggYWxsIHRhcmdldCBsYW5ndWFnZXMpCi0lZXhjZXB0IHsKLSAgICAgdHJ5IHsKLSAgICAgICAgJGZ1bmN0aW9uCi0gICAgIH0gY2F0Y2ggKFJhbmdlRXJyb3IpIHsKLSAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19SdW50aW1lRXJyb3IsICJSYW5nZSBFcnJvciIpOwotICAgICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZSBiZW5lZml0IG9mIHVzaW5nIHRoZSBleGNlcHRpb24gbGlicmFyeSBpcyB0aGF0IGV4Y2VwdGlvbiBoYW5kbGVycyBjYW4gYmUgZWFzaWx5IHdyaXR0ZW4gb25jZSBhbmQgdXNlZCBieSBhbGwgb2YgdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSBTV0lHLjxwPgotPGEgbmFtZT0ibjIxIj48L2E+PGgzPiBUeXBlbWFwczwvaDM+Ci1Nb3N0IG9mIFNXSUcncyBpbnRlcm5hbCBwcm9jZXNzaW5nIGlzIGRyaXZlbiBieSB0aGUgaGFuZGxpbmcgb2YgQyBkYXRhdHlwZXMtLWluIHBhcnRpY3VsYXIsIHJ1bGVzIGZvciBjb252ZXJ0aW5nIEMgZGF0YXR5cGVzIHRvIGFuZCBmcm9tIFRjbCAoYW5kIG90aGVyIHNjcmlwdGluZyBsYW5ndWFnZXMpLiAgICAgRm9yIGV4YW1wbGUsIHdoZW4gU1dJRyBlbmNvdW50ZXJzIGFuICJpbnQiLCBpdCBuZWVkcyB0byBrbm93IGhvdyB0byBjb252ZXJ0IGFuIGludGVnZXIgZnJvbSBUY2wgdG8gQywgcmV0dXJuIGFuIGludGVnZXIgcmVzdWx0IHRvIFRjbCwgbGluayB0byBpbnRlZ2VyIHZhcmlhYmxlcywgYW5kIHNvIGZvcnRoLiAgICBCeSBkZWZhdWx0LCBTV0lHIGFscmVhZHkga25vd3MgaG93IHRvIHBlcmZvcm0gdGhlc2Ugc2ltcGxlIGNvbnZlcnNpb25zIGFzIHdlbGwgYXMgbWFwcGluZyBjb21wbGV4IG9iamVjdHMgaW50byBwb2ludGVycy48cD4KLTxwPgotRm9yIG1vc3QgdXNlcnMsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGVub3VnaCB0byBnZXQgc3RhcnRlZC4gICBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCBpdCBtYXkgYmUgdXNlZnVsIHRvIGNoYW5nZSBTV0lHJ3MgaGFuZGxpbmcgb2YgYSBwYXJ0aWN1bGFyIGRhdGF0eXBlIChieSBhZGRpbmcgc3BlY2lhbCBwcm9jZXNzaW5nIG9yIG1hcHBpbmcgYSBkYXRhdHlwZSBpbnRvIFRjbCBpbiBhIGRpZmZlcmVudCBtYW5uZXIpLiAgICAgVG8gc3VwcG9ydCB0aGlzLCBTV0lHIHByb3ZpZGVzIGEgY3VzdG9taXphdGlvbiBtZWNoYW5pc20ga25vd24gYXMgInR5cGVtYXBzLiIgICAgSW4gYSBudXRzaGVsbCwgYSB0eXBlbWFwIGlzIGEgc3BlY2lhbCBwcm9jZXNzaW5nIHJ1bGUgdGhhdCBpcyBhdHRhY2hlZCB0byBwYXJ0aWN1bGFyIEMvQysrIGRhdGF0eXBlcy4gICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSB2ZXJ5IHNpbXBsZSB0eXBlbWFwIGluIGFjdGlvbiA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0KLS8vIFR5cGVtYXAgZm9yIGNvbnZlcnRpbmcgVGNsOCBpbnRlZ2VycyB0byBDIGludGVnZXJzCi0vLyAgICAgICAkc291cmNlIGlzIHRoZSBUY2wgaW5wdXQgb2JqZWN0IAotLy8gICAgICAgJHRhcmdldCBpcyB0aGUgQyB2YXJpYWJsZSAoYW4gaW50KS4KLSV0eXBlbWFwKHRjbDgsaW4pIGludCB7Ci0gICAgICBpbnQgZXJyb3IgPSBUY2xfR2V0RG91YmxlRnJvbU9iaihpbnRlcnAsICRzb3VyY2UsICZhbXA7JHRhcmdldCk7Ci0gICAgICBpZiAoZXJyb3IgIT0gVENMX09LKSByZXR1cm4gZXJyb3I7Ci0JCXByaW50ZigiUmVjZWl2ZWQgOiAlZFxuIiwgJHRhcmdldCk7Ci19Ci0uLi4KLWV4dGVybiBpbnQgZmFjdChpbnQgbik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gdGhpcyBleGFtcGxlIGlzIGNvbXBpbGVkIGludG8gYSBUY2wgOCBtb2R1bGUsIGl0IHdpbGwgb3BlcmF0ZSBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIGZhY3QgNgotUmVjZWl2ZWQgOiA2Ci03MjAKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotSW4gdGhpcyBjYXNlLCB0aGUgQyBjb2RlIHVzZWQgZm9yIGNvbnZlcnRpbmcgaW50ZWdlcnMgZnJvbSBUY2wgdG8gQyBoYXMgYmVlbiBjaGFuZ2VkLiAgIDxwPgotPHA+Ci1UeXBlbWFwcyBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIG5hbWVkIGRhdGF0eXBlcyBzdWNoIGFzIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSVpbmNsdWRlIGV4Y2VwdGlvbi5pCi0vLyBUeXBlbWFwIGZvciBjaGVja2luZyB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgYXJndW1lbnQKLS8vICh0aGlzIGlzIGRvbmUgYWZ0ZXIgaXQgaGFzIGJlZW4gY29udmVydGVkIGZyb20gVGNsIHRvIEMpCi0ldHlwZW1hcCh0Y2w4LGNoZWNrKSBkb3VibGUgcG9zaXRpdmUgewotICAgIGlmICgkc291cmNlICZsdDs9IDApIHsKLSAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX1ZhbHVlRXJyb3IsICJFeHBlY3RlZCBhIHBvc2l0aXZlIHZhbHVlIik7Ci0gICAgfQotfQotCi1kb3VibGUgbG9nMTAoZG91YmxlIHBvc2l0aXZlKTsKLWRvdWJsZSBleHAoZG91YmxlKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotSW4gdGhpcyBjYXNlLCB0aGUgdHlwZW1hcCBpcyBvbmx5IGFwcGxpZWQgdG8gZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgZXhhY3RseSBtYXRjaCAiZG91YmxlIHBvc2l0aXZlIi4gICBUaHVzLCBmcm9tIFRjbCwgdGhlc2UgZnVuY3Rpb25zIHdvdWxkIG9wZXJhdGUgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBsb2cxMCAyCi0wLjMwMTAyOTk5NjU1NAotJSBleHAgLTEKLTAuMzY3ODc5NDQxMTcxCi0lIGxvZyAtMQotRXhwZWN0ZWQgYSBwb3NpdGl2ZSB2YWx1ZSEKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVHlwZW1hcHMgYXJlIGFwcGxpZWQgdXNpbmcgYSBzaW1wbGUgbmFtZS1iYXNlZCBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGUuICAgV2hlbiBhIHR5cGVtYXAgZm9yIGA8dHQ+aW50PC90dD4nIGlzIGdpdmVuLCBpdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGZ1dHVyZSBvY2N1cnJlbmNlcyBvZiBgPHR0PmludDwvdHQ+Jy4gICBXaGVuIGEgdHlwZW1hcCBmb3IgYDx0dD5kb3VibGUgcG9zaXRpdmU8L3R0PicgaXMgZ2l2ZW4sIGl0IHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIGFyZ3VtZW50cyB0aGF0IG1hdGNoIGA8dHQ+ZG91YmxlIHBvc2l0aXZlPC90dD4nIChpdCB3b3VsZCBub3QgYmUgYXBwbGllZCB0byBvdGhlciB1c2VzIG9mIGA8dHQ+ZG91YmxlPC90dD4nKS4gICAgIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvIGFwcGx5IGV4aXN0aW5nIHR5cGVtYXAgcnVsZXMgdG8gb3RoZXIgZGF0YXR5cGVzIHVzaW5nIHRoZSA8dHQ+JWFwcGx5PC90dD4gZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgZXhhbXBsZQotJWluY2x1ZGUgZXhjZXB0aW9uLmkKLS8vIFR5cGVtYXAgZm9yIGNoZWNraW5nIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBhcmd1bWVudAotLy8gKHRoaXMgaXMgZG9uZSBhZnRlciBpdCBoYXMgYmVlbiBjb252ZXJ0ZWQgZnJvbSBUY2wgdG8gQykKLSV0eXBlbWFwKHRjbDgsY2hlY2spIGRvdWJsZSBwb3NpdGl2ZSB7Ci0gICAgaWYgKCRzb3VyY2UgJmx0Oz0gMCkgewotICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfVmFsdWVFcnJvciwiRXhwZWN0ZWQgYSBwb3NpdGl2ZSB2YWx1ZSIpOwotICAgIH0KLX0KLQotLy8gTm93IGFwcGx5IHRoaXMgdHlwZW1hcCB0byBzb21lIG90aGVyIGRhdGF0eXBlcwotJWFwcGx5IGRvdWJsZSBwb3NpdGl2ZSB7IGRvdWJsZSBweCwgUmVhbCBwb3NpdGl2ZSB9OwotCi1kb3VibGUgbG9nMTAoZG91YmxlIHB4KTsgICAgICAgICAvLyBPbmx5IGFjY2VwdHMgcG9zaXRpdmUgdmFsdWVzCi0KLXR5cGVkZWYgZG91YmxlIFJlYWw7Ci1SZWFsIGxvZyhSZWFsIHBvc2l0aXZlKTsgICAgICAgIC8vIE9ubHkgYWNjZXB0cyBwb3NpdGl2ZSB2YWx1ZXMKLS4uLgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BdCBmaXJzdCBnbGFuY2UsIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgdHlwZW1hcCBtYXkgbG9vayBsaWtlIGEgaG9ycmlkIG1lc3MgKHdoaWNoIGlzIHByb2JhYmx5IHRydWUpLCBidXQgdGhlcmUgaXMgYSBtZXRob2QgYmVoaW5kIHRoZSBtYWRuZXNzLiAgVHlwZW1hcHMgaGF2ZSBmb3VyIGVzc2VudGlhbCBwaWVjZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiV0eXBlbWFwKGxhbmcsIG1ldGhvZCkgdHlwZSBbbmFtZV0gWyx0eXBlMiBbbmFtZV0sdHlwZTMgW25hbWVdLC4uLl0gewotICAgICAgIENvbnZlcnNpb24gQ29kZQotfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHR0Pmxhbmc8L3R0PiBleHBsaWNpdGx5IHNwZWNpZmllcyB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4gICBUeXBlbWFwcyBmb3IgYW55IG9mIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlcyBjYW4gYXBwZWFyIGF0IGFueSB0aW1lIGluIFNXSUcncyBpbnB1dC4gIEhvd2V2ZXIsIG9ubHkgdGhvc2UgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgdGFyZ2V0IGxhbmd1YWdlIHdpbGwgZXZlciBiZSB1c2VkLiAgPHR0Pm1ldGhvZDwvdHQ+IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHBhcnRpY3VsYXIgdHlwZSBjb252ZXJzaW9uLiAgIFRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCB0eXBlcyBvZiBjb252ZXJzaW9ucywgYnV0IHNvbWUgb2YgdGhlIG1vcmUgY29tbW9uIG9uZXMgYXJlIGFzIGZvbGxvd3M8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5pbiAgICAgICAtIENvbnZlcnQgZnVuY3Rpb24gYXJndW1lbnRzIGZyb20gVGNsIHRvIEMuCi1vdXQgICAgICAtIENvbnZlcnQgZnVuY3Rpb24gcmVzdWx0IGZyb20gQyB0byBUY2wuCi1hcmdvdXQgICAtIENvbnZlcnQgYSByZXN1bHQgcmV0dXJuZWQgaW4gYW4gYXJndW1lbnQgZnJvbSBDIHRvIFRjbC4KLWRlZmF1bHQgIC0gRGVmYXVsdCBhcmd1bWVudCB2YWx1ZQotY2hlY2sgICAgLSBDaGVja3MgdGhlIHZhbHVlIG9mIGFuIGlucHV0IGFyZ3VtZW50LgotcmV0ICAgICAgLSBDbGVhbiB1cCB0aGUgcmV0dXJuIHJlc3VsdCBvZiBhIGZ1bmN0aW9uCi1pZ25vcmUgICAtIFRlbGwgU1dJRyB0byBpZ25vcmUgYSBmdW5jdGlvbiBhcmd1bWVudC4KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHR0PnR5cGU8L3R0PiBhbmQgPHR0Pm5hbWU8L3R0PiBzcGVjaWZ5IHRoZSBDL0MrKyBkYXRhdHlwZSB0aGF0IHRoZSB0eXBlbWFwIGNvbnZlcnNpb24gaXMgYmVpbmcgZ2l2ZW4gZm9yLiBBZGRpdGlvbmFsIGRhdGF0eXBlcyBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0LiAgIEZpbmFsbHksIHRoZSBDL0MrKyBjb252ZXJzaW9uIGNvZGUgaXMgZ2l2ZW4gaW4gYnJhY2VzLiAgV2l0aGluIHRoZSBjb252ZXJzaW9uIGNvZGUsIGEgbnVtYmVyIG9mIHNwZWNpYWwgcGxhY2Vob2xkZXJzIGNhbiBiZSBpbmNsdWRlZCAodGhpcyBpcyBvbmx5IGEgcGFydGlhbCBsaXN0KSAgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiRzb3VyY2UgIC0gVGhlIG9yaWdpbmFsIHZhbHVlIChiZWZvcmUgY29udmVyc2lvbikKLSR0YXJnZXQgIC0gVGhlIHJlc3VsdCBvZiBhIGRhdGEgY29udmVyc2lvbgotJHR5cGUgICAgLSBUaGUgQyBkYXRhdHlwZSB1c2VkIGluIHRoZSB0eXBlbWFwCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBwbGFjZWhvbGRlcnMgZ2V0IGZpbGxlZCBpbiBieSBhcHByb3ByaWF0ZSB2YWx1ZXMgd2hlbiBTV0lHIGdlbmVyYXRlcyB3cmFwcGVyIGNvZGUuVGh1cywgYSBtb3JlIGNvbXBsaWNhdGVkIHR5cGVtYXAgc3BlY2lmaWNhdGlvbiBtaWdodCBsb29rIGxpa2UgdGhpcyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gQ29udmVydCBhIHZhcmlldHkgb2YgaW50ZWdlciB0eXBlcyBmcm9tIFRjbCB0byBDCi0ldHlwZW1hcCh0Y2w4LGluKSBpbnQsCi0gICAgICAgICAgICAgICAgICBzaG9ydCwKLSAgICAgICAgICAgICAgICAgIGxvbmcsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCwKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0LAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAKLXsKLSAgICAgIGludCB0ZW1wOwotICAgICAgaWYgKFRjbF9HZXRJbnRGcm9tT2JqKGludGVycCwgJHNvdXJjZSwgJmFtcDt0ZW1wKSA9PSBUQ0xfRVJST1IpIHsKLSAgICAgICAgICByZXR1cm4gVENMX0VSUk9SOwotICAgICAgJHRhcmdldCA9ICgkdHlwZSkgdGVtcDsKLX0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQXQgdGhpcyBwb2ludCwgIGFzc3VtaW5nIHRoYXQgeW91J3JlIG5vdCBjb21wbGV0ZWx5IGNvbmZ1c2VkLCB5b3UgbWF5IGJlIHdvbmRlcmluZyBob3cgdGhlIHR5cGVtYXAgc3lzdGVtIGlzIHJlYWxseSBpbnRlbmRlZCB0byB3b3JrLiAgICBBbHRob3VnaCBtYW55IG9mIHRoZSBkZXRhaWxzIGFib3V0IHR5cGVtYXBzIGhhdmUgYmVlbiBvbWl0dGVkIGhlcmUsIHRoZSB1bmRlcmx5aW5nIGlkZWEgYmVoaW5kIHR5cGVtYXBzIGlzIHRoYXQgeW91IGNhbiBzcGVjaWZ5IHNwZWNpYWwgcHJvY2Vzc2luZyBydWxlcyBpbiBhZHZhbmNlIGFuZCB1c2UgdGhlbSBpbiBhbiBpbnRlcmZhY2UgYnkgc2ltcGx5IGZvbGxvd2luZyBhIG5hbWluZyBjb252ZW50aW9uLiAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIHdyYXAgdGhlIEMgbWF0aCBsaWJyYXJ5IHdpdGggc29tZSBhZGRlZCBlcnJvciBjaGVja2luZywgaXQgbWlnaHQgbG9vayBsaWtlIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVtb2R1bGUgbWF0aAotJXsKLSNpbmNsdWRlICZsdDttYXRoLmgmZ3Q7Ci0lfQotCi10eXBlbWFwKHRjbDgsY2hlY2spIGRvdWJsZSBwb3NpdGl2ZSB7IC4uLiB9Ci10eXBlbWFwKHRjbDgsY2hlY2spIGRvdWJsZSBub25uZWdhdGl2ZSB7IC4uLiB9Ci10eXBlbWFwKHRjbDgsY2hlY2spIGRvdWJsZSBub256ZXJvIHsgLi4uIH0KLQotLi4uCi0vLyBOb3cgbGlzdCBBTlNJIEMgZGVjbGFyYXRpb25zCi1kb3VibGUgc2luKGRvdWJsZSk7Ci1kb3VibGUgY29zKGRvdWJsZSk7Ci1kb3VibGUgbG9nKGRvdWJsZSBwb3NpdGl2ZSk7Ci1kb3VibGUgbG9nMTAoZG91YmxlIHBvc2l0aXZlKTsKLWRvdWJsZSBzcXJ0KGRvdWJsZSBub25uZWdhdGl2ZSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoZW4gd29ya2luZyB3aXRoIG1peGVkIFNXSUcvQyBoZWFkZXIgZmlsZXMsIHRoaXMgYXJyYW5nZW1lbnQgYWxsb3dzIGEgZmlsZSB0byBiZSBhY2NlcHRhYmxlIHRvIGJvdGggU1dJRyBhbmQgdGhlIEMgY29tcGlsZXIgKHByb3ZpZGVkIHRoYXQgdGhlIFNXSUcgZGlyZWN0aXZlcyBhcmUgY29uZGl0aW9uYWxseSBjb21waWxlZCBvZiBjb3Vyc2UpLiAgIEl0IGFsc28gZW5jb3VyYWdlcyBoZWFkZXIgZmlsZXMgYW5kIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyB0byB1c2UgYSBjb25zaXN0ZW50IG5hbWluZyBzY2hlbWUgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBmdW5jdGlvbiBhcmd1bWVudHMuPHA+Ci08YSBuYW1lPSJuMjIiPjwvYT48aDM+IEV4dGVuc2l2ZSBpbmZvcm1hdGlvbiBhYm91dCB0eXBlbWFwcyBpcyBwcm92aWRlZCBpbiB0aGUgU1dJRyBVc2VycyBNYW51YWwuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgY2hhcHRlciwgeW91IHNob3VsZCBrbm93IHRoYXQgdHlwZW1hcHMgZXhpc3QgYW5kIHRoYXQgdGhleSBhcmUgb2Z0ZW4gdXNlZCBiZWhpbmQgdGhlIHNjZW5lcyB0byBwZXJmb3JtIG1hbnkgbWFnaWNhbCB0YXNrcy4gICBBcyBpdCB0dXJucyBvdXQsIGEgbnVtYmVyIG9mIHVzZWZ1bCB0eXBlbWFwcyBhcmUgaW5jbHVkZWQgaW4gdGhlIFNXSUcgbGlicmFyeS0tLXNwYXJpbmcgeW91IHRoZSB0cm91YmxlIG9mIHdyaXRpbmcgdGhlbSBieSBoYW5kIChidXQsIG1vcmUgYWJvdXQgdGhhdCBpbiBhIGxpdHRsZSBiaXQpLjwvaDM+Ci08YSBuYW1lPSJuMyI+PC9hPjxoMj4gVXNpbmcgU1dJRzwvaDI+Ci1Ob3cgdGhhdCB5b3UndmUgaGFkIGEgcXVpY2sgdG91ciBvZiB0aGUgU1dJRyBjb21waWxlciwgaXQncyB0aW1lIHRvIHN0YXJ0IHVzaW5nIGl0LiAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBvZiB0aGUgdGVjaG5pcXVlcyAoYW5kIHRyaWNrcykgIHRoYXQgYXJlIGNvbW1vbmx5IHVzZWQgdG8gYnVpbGQgVGNsIGludGVyZmFjZXMgdG8gQy9DKysgY29kZS4gICAgUmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBjb3ZlciBldmVyeSBwb3NzaWJsZSBzaXR1YXRpb24sIHRoaXMgc2VjdGlvbiBjb3ZlcnMgbWFueSBvZiB0aGUgbW9zdCBjb21tb24gcHJvYmxlbXMgYW5kIHNvbHV0aW9ucy4gICAgSG93ZXZlciwgZ2l2ZW4gdGhlIGZsZXhpYmlsaXR5IHRoYXQgU1dJRyBwcm92aWRlcywgdGhlcmUgaXMgdXN1YWxseSBtb3JlIHRoYW4gb25lIHdheSB0byBkbyBpdCAoanVzdCBzb21ldGhpbmcgdG8ga2VlcCBpbiBtaW5kKTxwPgotPGEgbmFtZT0ibjIzIj48L2E+PGgzPiBQcmVwYXJpbmcgdG8gU1dJRzwvaDM+Ci1Vc2luZyBTV0lHIGdlbmVyYWxseSBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHN0ZXBzOjxwPgotPHA+Ci08dWw+Ci08bGk+R3JhYiBhIGhlYWRlciBmaWxlLgotPGxpPlR1cm4gdGhlIGhlYWRlciBmaWxlIGludG8gYSBTV0lHIGludGVyZmFjZSBmaWxlIGFuZCB0d2VhayBpdCBpZiBuZWNlc3NhcnkuCi08bGk+UnVuIFNXSUcgYW5kIG1ha2UgYSBUY2wgaW50ZXJmYWNlLgotPC91bD4KLTxwPgotPHA+Ci1JbiBhZGRpdGlvbiB0byBwcmVwYXJpbmcgYW4gaW5wdXQgZmlsZSwgeW91IG1heSBuZWVkIHRvIGVsaW1pbmF0ZSB0aGUgPHR0Pm1haW4oKTwvdHQ+IGZ1bmN0aW9uIGZyb20gdGhlIG9yaWdpbmFsIEMvQysrIGFwcGxpY2F0aW9uLiAgICBTY3JpcHRpbmcgbGFuZ3VhZ2VzIHByb3ZpZGUgdGhlaXIgb3duIG1haW4oKSB0aGF0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLiAgICBUbyBlbGltaW5hdGUgPHR0Pm1haW4oKTwvdHQ+LCB5b3UgY2FuIGVpdGhlciBvbWl0IGl0IHdoZW4geW91IGNvbXBpbGUgdGhlIEMgY29kZSBvciBzaW1wbHkgcmVkZWZpbmUgdGhlIHN5bWJvbCBzdWNoIGFzIDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgY2MgLWMgLURtYWluPW15bWFpbiBtYWluLmMKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotRmluYWxseSwgU1dJRyBpcyBub3QgYSBmdWxsIEMvQysrIGNvbXBpbGVyIGFuZCBtYXkgbm90IHN1cHBvcnQgY2VydGFpbiBmZWF0dXJlcy4gICBTV0lHIHdpbGwgcmVwb3J0IGNvbXBpbGF0aW9uIHByb2JsZW1zIGluIHRoZXNlIGNhc2VzLiAgIFRvIGVsaW1pbmF0ZSB0aGUgcHJvYmxlbXMsIHlvdSBtYXkgaGF2ZSB0byB0d2VhayAgdGhlIFNXSUcgaW5wdXQgZmlsZSBzb21ld2hhdC4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jaWZuZGVmIFNXSUcKLWludCBwcmludGYoY2hhciAqZm10LCAuLi4pOyAgICAgICAvLyB2YXJhZ3Mgbm90IHN1cHBvcnRlZCBieSBTV0lHCi0jZWxzZQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMjQiPjwvYT48aDM+IEludGVyZmFjZSBCdWlsZGluZyBDb25zaWRlcmF0aW9uczwvaDM+Ci1NYW55IHVzZXJzIGFyZSBzdXJwcmlzZWQgdG8gZmluZCBvdXQgaG93IGVhc3kgaXQgaXMgdG8gdXNlIFNXSUcuICBIb3dldmVyLCB0aGlzIGRvZXNuJ3QgbWVhbiB0aGF0IHlvdSB3aWxsIGdldCBhIGdvb2QgVGNsIGludGVyZmFjZSBvbiB0aGUgZmlyc3QgdHJ5LiAgIEluIGZhY3QsIHRoZXJlIGFyZSBhIGZldyB0aGluZ3MgdG8ga2VlcCBpbiBtaW5kPHA+Ci08cD4KLTx1bD4KLTxsaT5TV0lHIG1heSBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgdGhhdCBpcyBhd2t3YXJkIG9yIHVudXNhYmxlLiAgIFRoaXMgY2FuIGJlIGF2b2lkZWQsIGJ1dCBpdCBtYXkgcmVxdWlyZSBhIGxpdHRsZSBtb3JlIHdvcmsgKHN0YXkgdHVuZWQpLgotPGxpPkl0IGlzIG9mdGVuIHVubmVjZXNzYXJ5IHRvIHdyYXAgZXZlcnl0aGluZyBpbiBhIGh1Z2UgbGlicmFyeS4gIElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGEgc21hbGwgc3Vic2V0IG9mIGEgbGlicmFyeSwgaXQgbWF5IG1ha2UgbW9yZSBzZW5zZSB0byBzaW1wbHkgd3JhcCB0aG9zZSBwaWVjZXMuIAotPGxpPk5vdCBhbGwgQyBkZWNsYXJhdGlvbnMgY2FuIGJlIGVmZmVjdGl2ZWx5IHRyYW5zbGF0ZWQgaW50byBhIHNjcmlwdGluZyBlbnZpcm9ubWVudC4gRm9yIGV4YW1wbGUsIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBhbmQgQysrIHRlbXBsYXRlcyBtYXkgbm90IG1ha2UgbXVjaCBzZW5zZSB3aGVuIHdvcmtpbmcgd2l0aCBUY2wuICBBbHRob3VnaCBpdCBpcyBjZXJ0YWlubHkgcG9zc2libGUgdG8gaGFuZGxlIHN1Y2ggc2l0dWF0aW9ucywgaXQgbWF5IHJlcXVpcmUgYSBsaXR0bGUgbW9yZSB3b3JrLgotPGxpPlNXSUcgaXMgbm90IGEgc3Vic3RpdHV0ZSBmb3IgZGVzaWduLiAgIEdlbmVyYWxseSBzcGVha2luZywgeW91IHdpbGwgZ2V0IGJldHRlciByZXN1bHRzIGJ5IHRoaW5raW5nIGFib3V0IHRoZSBUY2wgdXNlciBpbnRlcmZhY2UgdG8geW91ciBDL0MrKyBsaWJyYXJpZXMgaW4gYWR2YW5jZS4gICBIb3dldmVyLCBvbmUgb2YgU1dJRydzIG1vc3QgcG93ZXJmdWwgZmVhdHVyZXMgaXMgaXRzIGFiaWxpdHkgdG8gYXR0YWNoIHRvIGV4aXN0aW5nIGNvZGUtLXJlZ2FyZGxlc3Mgb2YgdGhlIGV4aXN0aW5nIGRlc2lnbiAoZm9yIGJldHRlciBvciBmb3Igd29yc2UpLgotPGxpPlNXSUcgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBmb3IgZXZlcnkgVGNsL1RrIHByb2plY3QuICAgRm9yIGV4YW1wbGUsIHlvdSBwcm9iYWJseSB3b3VsZG4ndCB3cml0ZSBhIFRrIHdpZGdldCB1c2luZyBTV0lHLiAgIElmIGNhbGxpbmcgVGNsL1RrIGZyb20gQyBpcyB5b3VyIGdhbWUsIHlvdSBtaWdodCBoYXZlIGJldHRlciBsdWNrIHVzaW5nIGEgdG9vbCBzdWNoIGFzIEVULiAgIExpa2V3aXNlLCBhIHZhcmlldHkgb2Ygb2JqZWN0LW9yaWVudGVkIFRjbCBleHRlbnNpb25zIGFyZSBhdmFpbGFibGUgdGhhdCBtYXkgYmUgYmV0dGVyIHN1aXRlZCB0byBjZXJ0YWluIGFwcGxpY2F0aW9ucy4gIEluIG90aGVyIHdvcmRzLCB5b3VyIG1pbGVhZ2Ugd2lsbCB2YXJ5LgotPC91bD4KLTxhIG5hbWU9Im4yNSI+PC9hPjxoMz4gQ3JlYXRpbmcgYW5kIERlc3Ryb3lpbmcgU2ltcGxlIE9iamVjdHM8L2gzPgotU29tZXRpbWVzIGl0IGlzIG5lY2Vzc2FyeSB0byBtYW51ZmFjdHVyZSB2YXJpb3VzIEMvQysrIG9iamVjdHMgZnJvbSBhIFRjbCBpbnRlcmZhY2UuICBJbiBDLCBvYmplY3RzIGFyZSBlYXNpbHkgY29uc3RydWN0ZWQgdXNpbmcgbWFsbG9jKCkgb3IgbmV3LCBidXQgVGNsIG5lZWRzIGEgbGl0dGxlIGV4dHJhIGhlbHAuICAgVGh1cywgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZnRlbiByZXF1aXJlcyB0aGUgdXNlIG9mIGhlbHBlciBmdW5jdGlvbnMuIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGV4YW1wbGUKLSV7Ci0jaW5jbHVkZSAidmVjdG9yLmgiCi0lfQotCi0vLyBOb3cgZGVmaW5lIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcvZGVzdHJveWluZyB2ZWN0b3JzCi0laW5saW5lICV7Ci1WZWN0b3IgKm5ld19WZWN0b3IoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeikgewotICAgICBWZWN0b3IgKnYgPSAoVmVjdG9yICopIG1hbGxvYyhzaXplb2YoVmVjdG9yKSk7Ci0gICAgIHYtJmd0O3ggPSB4OwotICAgICB2LSZndDt5ID0geTsKLSAgICAgdi0mZ3Q7eiA9IHo7Ci0gICAgIHJldHVybiB2OwotfQotCi12b2lkIGRlbGV0ZV9WZWN0b3IoVmVjdG9yICp2KSB7Ci0gICAgIGZyZWUodik7Ci19Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byB3cml0aW5nIGhlbHBlciBmdW5jdGlvbnMgaXMgdG8gZXhwbGljaXRseSBzcGVjaWZ5IEMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlCi0lewotI2luY2x1ZGUgInZlY3Rvci5oIgotJX0KLQotc3RydWN0IFZlY3RvciB7Ci0gICAgVmVjdG9yKCk7Ci0gICB+VmVjdG9yKCk7Ci0gICAgZG91YmxlIHgseSx6OwotfTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhpcyBhcHByb2FjaCB3b3JrcyBmcm9tIGJvdGggQyBhbmQgQysrLiAgSW4gdGhlIGNhc2Ugb2YgQU5TSSBDLCBTV0lHIHdpbGwgc2ltcGx5IGNyZWF0ZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCBhcmUgbWFwcGVkIG9udG8gPHR0Pm1hbGxvYygpPC90dD4gYW5kIDx0dD5mcmVlKCk8L3R0Pi48cD4KLTxhIG5hbWU9Im4yNiI+PC9hPjxoMz4gQXJyYXlzPC9oMz4KLU1hbmlwdWxhdGluZyBhcnJheXMgaXMgY29tbW9uIHByYWN0aWNlIGluIG1hbnkgQyBhcHBsaWNhdGlvbnMuICBDIGFycmF5cyBjYW4gYWxzbyBiZSBoYW5kbGVkIHRocm91Z2ggdGhlIHVzZSBvZiBoZWxwZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIFNXSUcgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYXJyYXlzCi0laW5saW5lICV7Ci0vKiBDcmVhdGUgYW4gYXJyYXkgKi8KLWRvdWJsZSAqZG91YmxlX2FycmF5KGludCBzaXplKSB7Ci0gICAgcmV0dXJuIChkb3VibGUgKikgbWFsbG9jKHNpemUqc2l6ZW9mKGRvdWJsZSkpOwotfQotCi0vKiBHZXQgYSB2YWx1ZSBmcm9tIGFuIGFycmF5ICovCi1kb3VibGUgZG91YmxlX2dldChkb3VibGUgKmEsIGludCBpbmRleCkgewotICAgICByZXR1cm4gYVtpbmRleF07Ci19Ci0vKiBTZXQgYSB2YWx1ZSBpbiB0aGUgYXJyYXkgKi8KLWRvdWJsZSBkb3VibGVfc2V0KGRvdWJsZSAqYSwgaW50IGluZGV4LCBkb3VibGUgdmFsdWUpIHsKLSAgICAgcmV0dXJuIChhW2luZGV4XSA9IHZhbHVlKTsKLX0KLSV9Ci0lbmFtZShkb3VibGVfZGVzdHJveSkgdm9pZCBmcmVlKHZvaWQgKik7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUZyb20gVGNsLCB0aGVzZSBmdW5jdGlvbnMgd291bGQgYmUgY2FsbGVkIGV4cGxpY2l0bHkgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc2V0IGQgW2FycmF5X2RvdWJsZSAxMDBdICAgICAgICAgICAgIDsjIENyZWF0ZSAxMDAgZG91YmxlcwotJSBwdXRzICRkCi1fMTAwNDVmOF9kb3VibGVfcAotJSBmb3Ige3NldCBpIDB9IHskaSAmbHQ7IDEwMH0ge2luY3IgaX0geyAgCi0gICAgICBkb3VibGVfc2V0ICRkICRpICRpICAgICAgICAgICAgICA7IyBTZXQgYSB2YWx1ZQotfQotJSBwdXRzIFtkb3VibGVfZ2V0ICRkIDUwXSAgICAgICAgICAgICAgOyMgR2V0IGEgdmFsdWUKLTUwLjAKLSUgZG91YmxlX2Rlc3Ryb3kgJGQgICAgICAgICAgICAgICAgICAgIDsjIERlc3Ryb3kgdGhlIGFycmF5Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUluIHRoaXMgY2FzZSwgdGhlIGFycmF5IGlzIHNpbXBseSBtYW5hZ2VkIGFzIGEgcG9pbnRlciB0aGF0IGNhbiBiZSBwYXNzZWQgYXJvdW5kIHRvIGFueSBDIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIGRvdWJsZSAqLiAgICBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoaXMgaXMgYSBnb29kIGFwcHJvYWNoIGlmIHlvdSBhcmUgd29ya2luZyB3aXRoIHZlcnkgbGFyZ2UgQyBhcnJheXMgc2luY2UgdGhleSBjYW4gYmUgY3JlYXRlZCBhbmQgcGFzc2VkIGFyb3VuZCB3aXRob3V0IGFueSBkYXRhIGNvcHlpbmcuPHA+Ci08cD4KLVNXSUcgcHJvdmlkZXMgYSBsaWJyYXJ5IGZpbGUgPHR0PmFycmF5Lmk8L3R0PiB0aGF0IGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgZm9yIDx0dD5pbnQ8L3R0PiwgPHR0PmZsb2F0PC90dD4sIDx0dD5kb3VibGU8L3R0PiwgYW5kIDx0dD5jaGFyICo8L3R0PiBkYXRhdHlwZXMuICAgIFRvIHVzZSB0aGlzIGxpYnJhcnksIHNpbXBseSBwbGFjZSB0aGUgYDx0dD4laW5jbHVkZSBhcnJheS5pPC90dD4nIGRpcmVjdGl2ZSBpbnRvIHlvdXIgaW50ZXJmYWNlIGZpbGUuPHA+Ci08cD4KLUEgY29tbW9uIHF1ZXN0aW9uIHRoYXQgYXJpc2VzIHdpdGggYXJyYXlzIGlzICJjYW4gSSBjb252ZXJ0IGEgVGNsIGxpc3QgaW50byBhIEMgYXJyYXk/IiAgQWx0aG91Z2ggdGhlIHBvaW50ZXIgbW9kZWwgaXMgYWRlcXVhdGUgZm9yIG1hbnkgIHNpdHVhdGlvbnMsIGl0IG1heSBtYWtlIG1vcmUgc2Vuc2UgdG8gd29yayB3aXRoIFRjbCBsaXN0cyBpbiBjZXJ0YWluIGNhc2VzLiAgVGhlcmUgYXJlIGEgY291cGxlIG9mIHdheXMgdG8gaGFuZGxlIHRoaXMuICBGaXJzdCwgeW91IGNhbiB3cml0ZSBmdW5jdGlvbnMgaW4gVGNsIHRvIGNvbnZlcnQgYSBsaXN0IHRvIGEgcG9pbnRlci4gICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBUY2wgZnVuY3Rpb25zIGZvciBjb252ZXJ0aW5nIGEgVGNsIGxpc3QgdG8gYSBDIGFycmF5Ci1wcm9jIERvdWJsZUxpc3RUb0FycmF5IHtsfSB7Ci0gICAgc2V0IGxlbmd0aCBbbGxlbmd0aCAkbF0KLSAgICBzZXQgYSBbZG91YmxlX2FycmF5ICRsZW5ndGhdCi0gICAgc2V0IGkgMAotICAgIGZvcmVhY2ggaXRlbSAkbCB7Ci0gICAgICAgIGRvdWJsZV9zZXQgJGEgJGkgJGl0ZW0KLSAgICAgICAgaW5jciBpIDEKLSAgICB9Ci0gICAgcmV0dXJuIGEKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2l0aGluIGEgVGNsIHNjcmlwdCwgeW91IHdvdWxkIG5vdyBkbyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5zZXQgYSBbRG91YmxlTGlzdFRvQXJyYXkgezIuMyA0LjUgMC41IC0xMy4wfV0gICAgOyMgQ3JlYXRlIGFuIGFycmF5Ci1mb28gJGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyMgQ2FsbCBhIEMgZnVuY3Rpb24KLWRvdWJsZV9kZXN0cm95ICRhCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFsdGVybmF0aXZlbHksICBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdHlwZW1hcHMgYXMgYSBjb252ZXJzaW9uIG1lY2hhbmlzbS4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4ldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbQU5ZXSAoZG91YmxlIHRlbXBbJGRpbTBdKSB7Ci0gICAgICBjaGFyICoqaXRlbXM7Ci0gICAgICBpbnQgIGl0ZW1jLGk7Ci0gICAgICBpZiAoVGNsX1NwbGl0TGlzdChpbnRlcnAsJHNvdXJjZSwmYW1wO2l0ZW1jLCZhbXA7aXRlbXMpID09IFRDTF9FUlJPUikgewotICAgICAgICAgICByZXR1cm4gVENMX0VSUk9SOwotICAgICAgfQotICAgICAgaWYgKGl0ZW1jICE9ICRkaW0wKSB7Ci0gICAgICAgICAgIGludGVycC0mZ3Q7cmVzdWx0ID0gIkFycmF5IHNpemUgbWlzbWF0Y2ghIjsKLSAgICAgICAgICAgZnJlZShpdGVtcyk7Ci0gICAgICAgICAgIHJldHVybiBUQ0xfRVJST1I7Ci0gICAgICB9Ci0gICAgICBmb3IgKGkgPSAwOyBpICZsdDsgaXRlbWM7IGkrKykgewotICAgICAgICAgIHRlbXBbaV0gPSBhdG9mKGl0ZW1zW2ldKTsKLSAgICAgIH0KLSAgICAgICR0YXJnZXQgPSB0ZW1wOwotICAgICAgZnJlZShpdGVtcyk7Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFsdGhvdWdoIHRoaXMgbWlnaHQgdGFrZSBhIGxpdHRsZSB0aW1lIHRvIGRpZ2VzdCAoY29uc2lkZXJpbmcgb3VyIGxpbWl0ZWQgZGlzY3Vzc2lvbiBvZiB0eXBlbWFwcyksIHdoZW4gZ2l2ZW4gYSBDIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyw8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGZvbyAoZG91YmxlIGFbNF0pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci10aGUgdHlwZW1hcCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmcm9tIFRjbCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5mb28geyAyLjMgNC41IDAuNSAtMS4zMCB9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUlmIHRoZSBsaXN0IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gZG9lcyBub3QgbWF0Y2ggdGhlIEMgYXJyYXkgc2l6ZSwgYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQuICBOZWVkbGVzcyB0byBzYXksIHRoZXJlIGFyZSBhIHZhcmlldHkgb2Ygd2F5cyB0byBtYW5hZ2UgYXJyYXlzIGRlcGVuZGluZyBvbiB0aGUgcHJvYmxlbSBhdCBoYW5kIGFuZCB5b3VyIHBlcnNvbmFsIHByZWZlcmVuY2UuPHA+Ci08YSBuYW1lPSJuMjciPjwvYT48aDM+IE91dHB1dCBBcmd1bWVudHM8L2gzPgotU29tZXRpbWVzIEMgZnVuY3Rpb25zIHJldHVybiByZXN1bHRzIGluIG9uZSBvZiB0aGVpciBhcmd1bWVudHMgc3VjaCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkIGFkZChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSAqcmVzdWx0KSB7Ci0gICAgICAqYyA9IGErYjsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlIG91dHB1dCBhcmd1bWVudCBtYWtlcyB0aGlzIGEgbGl0dGxlIHRyaWNreSB0byBoYW5kbGUgZnJvbSBUY2wsIGJ1dCB0aGVyZSBhcmUgc2V2ZXJhbCB0ZWNobmlxdWVzLiAgVGhhdCBjYW4gYmUgdXNlZC4gICBPbmUgYXBwcm9hY2ggaXMgdG8gd3JpdGUgZnVuY3Rpb25zIHRoYXQgbWFudWZhY3R1cmUgYSBgZG91YmxlJyBhbmQgcGFzcyBpdCB0byB0aGUgQyBmdW5jdGlvbi4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4laW5saW5lICV7Ci1kb3VibGUgKmNyZWF0ZV9kb3VibGUoZG91YmxlIHZhbCkgewotICAgICBkb3VibGUgKmQgPSAoZG91YmxlICopIG1hbGxvYyhzaXplb2YoZG91YmxlKSk7Ci0gICAgICpkID0gdmFsOwotICAgICAgcmV0dXJuIGQ7Ci19Ci1kb3VibGUgZ2V0X2RvdWJsZShkb3VibGUgKmQpIHsKLSAgICAgcmV0dXJuICpkOwotfQotZG91YmxlIHNldF9kb3VibGUoZG91YmxlICpkLCBkb3VibGUgdmFsKSB7Ci0gICAgIHJldHVybiAoKmQgPSB2YWwpOwotfQotJX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCBmcm9tIFRjbCwgeW91IHdvdWxkIGRvIHRoaXMgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc2V0IHJlc3VsdCBbY3JlYXRlX2RvdWJsZSAwLjBdCi0lIGFkZCA0LjUgOSAkcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgIDsgQ2FsbCBvdXIgQyBmdW5jdGlvbgotJSBwdXRzIFtnZXRfZG91YmxlICRyZXN1bHRdCi0xMy41Ci0lCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLUlmIHdvcmtpbmcgd2l0aCBDIGJ1aWx0LWluIGRhdGF0eXBlcywgaXQgbWF5IGJlIGVhc2llciB0byB1c2UgdGhlIFNXSUcgcG9pbnRlciBsaWJyYXJ5IGJ5IGluY2x1ZGluZyB0aGUgZmlsZSBgPHR0PnBvaW50ZXIuaTwvdHQ+JyBpbiB5b3VyIGludGVyZmFjZS4gICBUaGUgcG9pbnRlciBsaWJyYXJ5IGFkZHMgc2V2ZXJhbCBuZXcgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgcG9pbnRlcnMgdG8gdmFyaW91cyBidWlsdC1pbiBkYXRhdHlwZXMgYW5kIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc2V0IHJlc3VsdCBbcHRyY3JlYXRlIGRvdWJsZV0gICAgICA7ICMgQ3JlYXRlIGEgZG91YmxlCi0lIGFkZCA0LjUgOSAkcmVzdWx0ICAgICAgICAgICAgICAgICAgCi0lIHB1dHMgW3B0cnZhbHVlICRyZXN1bHRdICAgICAgICAgICAgOyAjIERlcmVmZXJlbmNlIHRoZSByZXN1bHQKLTEzLjUKLSUgcHRyZnJlZSAkcmVzdWx0Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUZpbmFsbHksIHNpbXBsZSBvdXRwdXQgYXJndW1lbnRzIGNhbiBiZSBoYW5kbGVkIHRocm91Z2ggdGhlIHVzZSBvZiB0eXBlbWFwcy4gICBUaGlzIGNhbiBiZSBkb25lIGJ5IGluY2x1ZGluZyB0aGUgZmlsZSBgPHR0PnR5cGVtYXBzLmk8L3R0PicgaW4geW91ciBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0laW5jbHVkZSB0eXBlbWFwcy5pCi0KLS8vIEFwcGx5IGFuIG91dHB1dCBydWxlIHRvIHRoZSBvdXRwdXQgYXJndW1lbnQKLSVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqcmVzdWx0IH07Ci0KLS8vIE5vdyBkZWNsYXJlIHRoZSBmdW5jdGlvbgotdm9pZCBhZGQoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgKnJlc3VsdCk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdywgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgc2V0IHJlc3VsdCBbYWRkIDQuNSA5XQotJSBwdXRzICRyZXN1bHQKLTEzLjUKLSUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjI4Ij48L2E+PGgzPiBXcmFwcGluZyBQcmVwcm9jZXNzb3IgTWFjcm9zPC9oMz4KLU1hbnkgQyBwcm9ncmFtcyB1c2UgbWFjcm9zIGluc3RlYWQgb2YgZnVuY3Rpb24gY2FsbHMgdG8gcGVyZm9ybSBzb21lIG9wZXJhdGlvbi4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jZGVmaW5lIEltYWdlX3dpZHRoKGltKSAgKGltLSZndDt4cGl4ZWxzKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1TV0lHIGlzIHVuYWJsZSB0byBjcmVhdGUgVGNsIHdyYXBwZXJzIGZvciBtYWNyb3MgYmVjYXVzZSB0aGVyZSBpcyBubyB0eXBlIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIEhvd2V2ZXIsIHlvdSBjYW4gY3JlYXRlIGEgd3JhcHBlciBieSBzaW1wbHkgZ2l2aW5nIFNXSUcgYSBmdW5jdGlvbiBwcm90b3R5cGUuPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JW1vZHVsZSBleGFtcGxlCi0lewotI2luY2x1ZGUgImhlYWRlci5oIgotJX0KLS8vIEEgd3JhcHBlciBmb3IgYSBDIG1hY3JvCi11bnNpZ25lZCBJbWFnZV93aWR0aChJbWFnZSAqaW0pOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1UaGUgcHJvdG90eXBlIGdpdmVzIFNXSUcgdGhlIHR5cGUgaW5mb3JtYXRpb24gaXQgbmVlZHMgdG8gZ2VuZXJhdGUgYSB3cmFwcGVyLiAgT3RoZXJ3aXNlLCB0aGUgZmFjdCB0aGF0IHRoZSAiZnVuY3Rpb24iIGlzIHJlYWxseSBhIG1hY3JvIGRvZXNuJ3QgbWF0dGVyLjxwPgotPGEgbmFtZT0ibjI5Ij48L2E+PGgzPiBPdmVybG9hZGluZzwvaDM+Ci1BcyBvZiB0aGlzIHdyaXRpbmcsIFNXSUcgZG9lcyBub3Qgc3VwcG9ydCBDKysgb3ZlcmxvYWRpbmcgb2YgZnVuY3Rpb25zIG9yIG9wZXJhdG9ycy4gIFRvIHJlc29sdmUgb3ZlcmxvYWRlZCBmdW5jdGlvbnMsIHRoZSA8dHQ+JW5hbWUoKTwvdHQ+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZC4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5jbGFzcyBmb28gewotcHVibGljOgotICAgICAgZm9vKCk7Ci0lbmFtZShjb3B5X2ZvbykgZm9vKGZvbyAmYW1wO2YpOwotICAgICAgLi4uCi19OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1PdmVybG9hZGVkIG9wZXJhdG9ycyBjYW4gYmUgaGFuZGxlZCBieSB3cml0aW5nIGhlbHBlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JWlubGluZSAlewotVmVjdG9yIHZlY3Rvcl9hZGQoVmVjdG9yICZhbXA7YSwgVmVjdG9yICZhbXA7YikgewotICAgICAgIHJldHVybiBhK2I7Ci19Ci0lfQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1Ib3dldmVyLCB0aGUgdXNlIG9mIG9wZXJhdG9ycyBmcm9tIFRjbCBtYXkgcmVzdWx0ICBpbiBtZW1vcnkgbGVha3MgYW5kIG90aGVyIHByb2JsZW1zIHdpdGhvdXQgc29tZSBzcGVjaWFsIGNhcmUuICBJbiB0aGUgYWJvdmUgY2FzZSwgU1dJRyB3b3VsZCBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgdGhlIHJlc3VsdCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBUY2wuICBJdCB3b3VsZCBiZSB1cCB0byB5b3UgdG8gZXhwbGljaXRseSBmcmVlIHRoaXMgbWVtb3J5IHdoZW4geW91IHdlcmUgZG9uZSB3aXRoIGl0LiAgPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+c2V0IHIgW3ZlY3Rvcl9hZGQgJHYxICR2Ml0gICAgICAgIDsjIENyZWF0ZXMgYSBuZXcgdmVjdG9yCi0uLi4gdXNlIGl0IC4uLgotZGVsZXRlX1ZlY3RvciAkciAgICAgICAgICAgICAgICAgIDsjIEZyZWUgdGhlIHJlc3VsdAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci08YSBuYW1lPSJuMzAiPjwvYT48aDM+IFdvcmtpbmcgd2l0aCBvdGhlciBUY2wgRXh0ZW5zaW9uczwvaDM+Ci1BbHRob3VnaCBTV0lHIGdlbmVyYXRlcyBldmVyeXRoaW5nIHlvdSBuZWVkIHRvIGJ1aWxkIGFuIGludGVyZmFjZSwgaXQgY2FuIGFsc28gYmUgdXNlZCB3aXRoIG90aGVyIFRjbCBleHRlbnNpb25zLiAgICAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaW5pdGlhbGl6ZSBhbm90aGVyIFRjbCBtb2R1bGUgd2hlbiB5b3VyIG1vZHVsZSBpcyBsb2FkZWQsIHlvdSBjYW4gd3JpdGUgdGhlIGZvbGxvd2luZyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ly8gSW5pdGlhbGl6ZSBCTFQgd2hlbiBsb2FkZWQKLSVpbml0ICV7Ci0gICAgIGlmIChCbHRfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikgewotICAgICAgICAgIHJldHVybiBUQ0xfRVJST1I7Ci0gICAgIH0KLSV9Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUlmIHlvdSBoYXZlIGFscmVhZHkgd3JpdHRlbiBzb21lIFRjbCB3cmFwcGVyIGZ1bmN0aW9ucywgdGhlc2UgY2FuIGJlIGFkZGVkIHRvIGEgU1dJRyBpbnRlcmZhY2UgdXNpbmcgdGhlIDx0dD4lbmF0aXZlPC90dD4gZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiVuYXRpdmUoZm9vKSBpbnQgZm9vX3dyYXAoVGNsX0ludGVycCAqLCBDbGllbnREYXRhLCBpbnQsIGNoYXIgKiopOwotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1vciBzaW1wbHk8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbmF0aXZlKGZvbykgZm9vX3dyYXA7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVRoZXNlIGRlY2xhcmF0aW9ucyBjcmVhdGUgYSBuZXcgVGNsIGNvbW1hbmQgYGZvbycgIHRoYXQgaXMgbWFwcGVkIG9udG8gdGhlIFRjbCB3cmFwcGVyIGZ1bmN0aW9uIDx0dD5mb29fd3JhcDwvdHQ+LjxwPgotPGEgbmFtZT0ibjMxIj48L2E+PGgzPiBTV0lHIFByZXByb2Nlc3NvciBNYWdpYzwvaDM+Ci1UaGUgU1dJRyBjb21waWxlciBpbmNsdWRlcyBhIGZ1bGwgQyBwcmVwcm9jZXNzb3IgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHZhcmlldHkgb2YgdW51c3VhbCB3YXlzLiAgSW4gZmFjdCwgdGhlIHByZXByb2Nlc3NvciBjYW4gYmUgYW4gZXh0cmVtZWx5IHVzZWZ1bCB0b29sIGZvciBxdWlja2x5IGdlbmVyYXRpbmcgaGVscGVyIGZ1bmN0aW9ucyBhbmQgb3RoZXIgYXNwZWN0cyBvZiBhIFRjbCBpbnRlcmZhY2UuICAgIE9uZSBvZiB0aGUgbW9yZSB1c2VmdWwgY2FwYWJpbGl0aWVzIG9mIHRoZSBwcmVwcm9jZXNzb3IgaXMgdGhlIDx0dD4lZGVmaW5lPC90dD4gZGlyZWN0aXZlIHRoYXQgbGV0cyB5b3UgZGVmaW5lIGNvbXBsaWNhdGVkIG1hY3Jvcy4gICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgZmlsZSBjb3VsZCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgdmFyaWV0eSBvZiBhcnJheSBoZWxwZXIgZnVuY3Rpb25zPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0vLyBBcnJheSBhY2Nlc3MgaGVscGVyIGZ1bmN0aW9ucwotJW1vZHVsZSBhcnJheQotCi0vLyBEZWZpbmUgYSBtYWNybyBmb3IgY3JlYXRpbmcgaGVscGVyIGZ1bmN0aW9ucwotJWRlZmluZSBBUlJBWShUeXBlLE5hbWUpCi0laW5saW5lICV7Ci0vKiBDcmVhdGUgYW4gYXJyYXkgKi8KLVR5cGUgKiBOYW1lICMjIF9hcnJheSAoaW50IHNpemUpIHsKLSAgICAgcmV0dXJuIChUeXBlICopIG1hbGxvYyhzaXplb2YoIFR5cGUgKSk7Ci19Ci0vKiBHZXQgYW4gaXRlbSAqLwotVHlwZSBOYW1lICMjIF9nZXQgKFR5cGUgKmEsIGludCBpbmRleCkgewotICAgICByZXR1cm4gYVtpbmRleF07Ci19Ci0vKiBTZXQgYW4gaXRlbSAqLwotVHlwZSBOYW1lICMjIF9zZXQgKFR5cGUgKmEsIGludCBpbmRleCwgVHlwZSB2YWx1ZSkgewotICAgICByZXR1cm4gKGFbaW5kZXhdID0gdmFsdWUpOwotfQotLyogRGVsZXRlIHRoZSBhcnJheSAqLwotdm9pZCBOYW1lICMjIF9kZXN0cm95IChUeXBlICphKSB7Ci0gICAgIGZyZWUoYSk7Ci19Ci0lfQotJWVuZGRlZgotCi0vLyBOb3cgY3JlYXRlIGEgYnVuY2ggb2YgaGVscGVyIGZ1bmN0aW9ucwotQVJSQVkoZG91YmxlLGRvdWJsZSkKLUFSUkFZKGZsb2F0LGZsb2F0KQotQVJSQVkoaW50LGludCkKLUFSUkFZKHNob3J0LHNob3J0KQotQVJSQVkodW5zaWduZWQgaW50LCB1bnNpZ25lZCkKLUFSUkFZKGxvbmcsIGxvbmcpCi1BUlJBWShzdHJ1Y3Qgbm9kZSwgbm9kZSkKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU2ltaWxhciB0ZWNobmlxdWVzIGNhbiBiZSB1c2VkIHRvIHdyYXAgQysrIHRlbXBsYXRlcyBhbmQgd29yayB3aXRoIG90aGVyIGNvbXBsaWNhdGVkIGRlY2xhcmF0aW9ucy4gICBPZiBjb3Vyc2UsIGl0J3MgYWxzbyBwb3NzaWJsZSB0byBjb25mdXNlIHlvdXJzZWxmLjxwPgotPGEgbmFtZT0ibjQiPjwvYT48aDI+IFB1dHRpbmcgaXQgQWxsIFRvZ2V0aGVyPC9oMj4KLVNvIGZhciwgeW91IGhhdmUgYmVlbiBnaXZlbiBhIGNyYXNoIGNvdXJzZSBpbiBTV0lHIGFuZCBzb21lIGludGVyZmFjZSBidWlsZGluZyB0ZWNobmlxdWVzLiAgSW4gdGhpcyBzZWN0aW9uLCB3ZSB3aWxsIGJ1aWxkIGEgVGNsIGludGVyZmFjZSB0byBhIEMgbGlicmFyeSwgd3JpdGUgc29tZSBzY3JpcHRzLCBhbmQgc2hvdyBob3cgeW91IGNhbiB1c2UgVGNsIHRvIGludGVyYWN0IHdpdGggdGhlIGxpYnJhcnkuICAgICBJbiB0aGlzIGV4YW1wbGUsIHdlIHdpbGwgdXNlIHRoZSBnZC0xLjIgbGlicmFyeSB3cml0dGVuIGJ5IFRob21hcyBCb3V0ZWxsIGFuZCBhdmFpbGFibGUgYXQgd3d3LmJvdXRlbGwuY29tLiAgIGdkIGlzIHJlbGF0aXZlbHkgc2ltcGxlIGFuZCBjYW4gYmUgdXNlZCBvbiBib3RoIFVuaXggYW5kIFdpbmRvd3MgcGxhdGZvcm1zIChtYWtpbmcgaXQgYSBnb29kIGV4YW1wbGUpLiAgIEZ1cnRoZXJtb3JlLCB0aGVyZSBhcmUgYWxyZWFkeSBUY2wgaW50ZXJmYWNlcyB0byBnZCwgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGNvbXBhcmUgdG8gb3RoZXIgYXBwcm9hY2hlcyBpZiB5b3UgYXJlIHNvIGluY2xpbmVkLjxwPgotPGEgbmFtZT0ibjMyIj48L2E+PGgzPiBBIEJyaWVmIEludHJvZHVjdGlvbiB0byBnZDwvaDM+Ci1nZCBpcyBhIEMgbGlicmFyeSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIEdJRiBpbWFnZXMuICBBIHZlcnkgc2ltcGxlIGV4YW1wbGUgaW4gQyBpcyBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSNpbmNsdWRlICZsdDtnZC5oJmd0OwotI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7Ci0KLWludCBtYWluKCkgewotICAgICBnZEltYWdlUHRyIGltOwotICAgICBGSUxFICpvdXQ7Ci0gICAgIGludCAgYmxhY2ssIHdoaXRlOwotCi0gICAgIC8qIENyZWF0ZSBhbiBpbWFnZSAqLwotICAgICBpbSA9IGdkSW1hZ2VDcmVhdGUoMjAwLDIwMCk7Ci0gICAgIAotICAgICAvKiBBbGxvY2F0ZSBzb21lIGNvbG9ycyAqLwotICAgICBibGFjayA9IGdkSW1hZ2VDb2xvckFsbG9jYXRlKGltLDAsMCwwKTsKLSAgICAgd2hpdGUgPSBnZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwyNTUsMjU1LDI1NSk7Ci0gIAotICAgICAvKiBEcmF3IGEgbGluZSAqLwotICAgICBnZEltYWdlTGluZShpbSwyMCw1MCwxODAsMTQwLHdoaXRlKTsKLQotICAgICAvKiBPdXRwdXQgdGhlIGltYWdlICovCi0gICAgIG91dCA9IGZvcGVuKCJ0ZXN0LmdpZiIsIndiIik7Ci0gICAgIGdkSW1hZ2VHaWYoaW0sb3V0KTsKLSAgICAgZmNsb3NlKG91dCk7Ci0KLSAgICAgLyogQ2xlYW4gdXAgKi8KLSAgICAgZ2RJbWFnZURlc3Ryb3koaW0pOwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BIHZhcmlldHkgb2YgcGxvdHRpbmcgcHJpbWl0aXZlcyBzdWNoIGFzIGxpbmVzLCBjaXJjbGVzLCBib3hlcywgYW5kIGZvbnRzIGFyZSBhbHNvIGF2YWlsYWJsZSB0byBtYWtlIG1vcmUgY29tcGxpY2F0ZWQgaW1hZ2VzLjxwPgotPGEgbmFtZT0ibjMzIj48L2E+PGgzPiBBIFNpbXBsZSBTV0lHIGludGVyZmFjZTwvaDM+Ci1UbyBidWlsZCBhIFRjbCBpbnRlcmZhY2UgdG8gZ2QsIHdlIGNhbiBzdGFydCB3aXRoIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdkCi0lewotI2luY2x1ZGUgJmx0O2dkLmgmZ3Q7Ci0lfQotCi0vLyBKdXN0IGdyYWIgdGhlIGdkLmggaGVhZGVyIGZpbGUKLSVpbmNsdWRlIGdkLmgKLQotLy8gUGx1cyBhIGZldyBmaWxlIEkvTyBmdW5jdGlvbnMgKHRvIGJlIGV4cGxhaW5lZCBzaG9ydGx5KQotRklMRSAqZm9wZW4oY2hhciAqZmlsZW5hbWUsIGNoYXIgKm1vZGUpOwotdm9pZCBmY2xvc2UoRklMRSAqZik7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLU5vdywgeW91IGNhbiBjb21waWxlIGEgbW9kdWxlIChzaG93biBmb3IgTGludXgpPHA+Ci08YmxvY2txdW90ZT48cHJlPgotJSBzd2lnIC10Y2wgZ2QuaQotTWFraW5nIHdyYXBwZXJzIGZvciBUY2wKLWdkLmggOiBMaW5lIDMxLiBXYXJuaW5nLiBBcnJheSBtZW1iZXIgd2lsbCBiZSByZWFkLW9ubHkuCi1nZC5oIDogTGluZSAzMi4gV2FybmluZy4gQXJyYXkgbWVtYmVyIHdpbGwgYmUgcmVhZC1vbmx5LgotZ2QuaCA6IExpbmUgMzMuIFdhcm5pbmcuIEFycmF5IG1lbWJlciB3aWxsIGJlIHJlYWQtb25seS4KLWdkLmggOiBMaW5lIDM0LiBXYXJuaW5nLiBBcnJheSBtZW1iZXIgd2lsbCBiZSByZWFkLW9ubHkuCi1nZC5oIDogTGluZSA0MC4gV2FybmluZy4gQXJyYXkgbWVtYmVyIHdpbGwgYmUgcmVhZC1vbmx5LgotZ2QuaCA6IExpbmUgNDEuIFdhcm5pbmcuIEFycmF5IG1lbWJlciB3aWxsIGJlIHJlYWQtb25seS4KLSUgZ2NjIC1jIC1mcGljIGdkX3dyYXAuYwotJSBnY2MgLXNoYXJlZCBnZF93cmFwLm8gLW8gZ2Quc28gLWxnZAotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UaGUgd2FybmluZyBtZXNzYWdlcyB3aWxsIGJlIGV4cGxhaW5lZCBzaG9ydGx5IGFuZCBjYW4gYmUgaWdub3JlZC4gICAgTm93LCB5b3UgY2FuIHdyaXRlIGEgc2ltcGxlIFRjbCBzY3JpcHQ8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5sb2FkIC4vZ2Quc28gZ2QKLQotIyBDcmVhdGUgYW4gaW1hZ2UKLXNldCBpbSBbZ2RJbWFnZUNyZWF0ZSAyMDAgMjAwXQotCi0jIEFsbG9jYXRlIGNvbG9ycwotc2V0IGJsYWNrIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMCAwIDBdCi1zZXQgd2hpdGUgW2dkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAyNTUgMjU1IDI1NV0KLQotIyBEcmF3IGEgbGluZQotZ2RJbWFnZUxpbmUgJGltIDIwIDUwIDE4MCAxNDAgJHdoaXRlCi0KLSMgV3JpdGUgdGhlIGltYWdlCi1zZXQgb3V0IFtmb3BlbiB0ZXN0LmdpZiB3Yl0KLWdkSW1hZ2VHaWYgJGltICRvdXQKLWZjbG9zZSAkb3V0Ci0KLSMgQ2xlYW4gdXAKLWdkSW1hZ2VEZXN0cm95ICRpbQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiBhIG1hbm5lciBvZiBvbmx5IGEgZmV3IG1pbnV0ZXMsIHdlIGhhdmUgYnVpbHQgYSBUY2wgaW50ZXJmYWNlIHRoYXQgc2VlbXMgdG8gd29yay48cD4KLTxhIG5hbWU9Im4zNCI+PC9hPjxoMz4gVW5kZXJzdGFuZGluZyB0aGUgV2FybmluZyBNZXNzYWdlczwvaDM+Ci1UaGUgd2FybmluZyBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgU1dJRyB3ZXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmUgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPnR5cGVkZWYgc3RydWN0IGdkSW1hZ2VTdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBjaGFyICoqIHBpeGVsczsKLSAgICAgICAgaW50IHN4OwotICAgICAgICBpbnQgc3k7Ci0gICAgICAgIGludCBjb2xvcnNUb3RhbDsKLSAgICAgICAgaW50IHJlZFtnZE1heENvbG9yc107ICAgICAgICAgICAgICAgICEgV2FybmluZwotICAgICAgICBpbnQgZ3JlZW5bZ2RNYXhDb2xvcnNdOyAgICAgICAgICAgICAgISBXYXJuaW5nCi0gICAgICAgIGludCBibHVlW2dkTWF4Q29sb3JzXTsgICAgICAgICAgICAgICAhIFdhcm5pbmcKLSAgICAgICAgaW50IG9wZW5bZ2RNYXhDb2xvcnNdOyAgICAgICAgICAgICAgICEgV2FybmluZwotICAgICAgICBpbnQgdHJhbnNwYXJlbnQ7Ci0gICAgICAgIGludCAqcG9seUludHM7Ci0gICAgICAgIGludCBwb2x5QWxsb2NhdGVkOwotICAgICAgICBzdHJ1Y3QgZ2RJbWFnZVN0cnVjdCAqYnJ1c2g7Ci0gICAgICAgIHN0cnVjdCBnZEltYWdlU3RydWN0ICp0aWxlOwotICAgICAgICBpbnQgYnJ1c2hDb2xvck1hcFtnZE1heENvbG9yc107ICAgICAgISBXYXJuaW5nCi0gICAgICAgIGludCB0aWxlQ29sb3JNYXBbZ2RNYXhDb2xvcnNdOyAgICAgICAhIFdhcm5pbmcKLSAgICAgICAgaW50IHN0eWxlTGVuZ3RoOwotICAgICAgICBpbnQgc3R5bGVQb3M7Ci0gICAgICAgIGludCAqc3R5bGU7Ci0gICAgICAgIGludCBpbnRlcmxhY2U7Ci19IGdkSW1hZ2U7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBtZXNzYWdlICJBcnJheSBtZW1iZXIgd2lsbCBiZSByZWFkLW9ubHkiIG1lYW5zIHRoYXQgU1dJRyBrbm93cyBob3cgdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiBhbiBhcnJheSBkYXRhIG1lbWJlciAodGhlIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCksIGJ1dCBkb2VzIG5vdCBrbm93IGhvdyB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSBhcnJheS4gICAgRnJvbSBUY2wsIHlvdSB3aWxsIHNlZSB0aGUgZm9sbG93aW5nIGJlaGF2aW9yPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzZXQgaW0gW2dkSW1hZ2VDcmVhdGUgMjAwIDIwMF0KLV84MGI1MWU4X2dkSW1hZ2VQdHIKLSUgZ2RJbWFnZV9yZWRfZ2V0ICRpbSAgICAgICAgICAgICA7ICMgR2V0IGFuIGFycmF5IG1lbWJlcgotXzgwYjUxZjhfaW50X3AKLSUgZ2RJbWFnZV9yZWRfc2V0ICRpbSAwICAgICAgICAgICA7ICMgVHJ5IHRvIGNoYW5nZSBhIHJlYWQtb25seSBtZW1iZXIKLWludmFsaWQgY29tbWFuZCBuYW1lICJnZEltYWdlX3JlZF9zZXQiCi0lCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFsdGhvdWdoIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb2RpZnkgYXJyYXkgc3RydWN0dXJlIG1lbWJlcnMgYXMgc2hvd24sIHlvdSBjb3VsZCBkbyBzbyB1c2luZyB0aGUgU1dJRyBwb2ludGVyIGxpYnJhcnkgb3IgaGVscGVyIGZ1bmN0aW9ucy4gICBGb3IgZXhhbXBsZSw8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lIHN3aWcgLXRjbCAtbHBvaW50ZXIuaSBnZC5pCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdywgaW4gVGNsPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzZXQgaW0gW2dkSW1hZ2VDcmVhdGUgMjAwIDIwMF0KLSUgZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDUwIDIwMCAxMDAKLSUgZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDM1IDIxMCA3NQotJSBzZXQgciBbZ2RJbWFnZV9yZWRfZ2V0ICRpbV0KLV84MGI1MWY4X2ludF9wCi0lIHB0cnZhbHVlICRyIDAgICAgICAgICAgICAgICAgICAgOyMgR2V0IHJbMF0KLTUwCi0lIHB0cnZhbHVlICRyIDEgICAgICAgICAgICAgICAgICAgOyMgR2V0IHJbMV0KLTM1Ci0lIHB0cnNldCAkciA3MCAxICAgICAgICAgICAgICAgICAgOyMgY2hhbmdlIHJbMV0KLSUgcHRydmFsdWUgJHIgMQotNzAKLSUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLU9mIGNvdXJzZSwgeW91IGNvdWxkIGFsc28gZW5kIHVwIHNob290aW5nIHlvdXJzZWxmIGluIHRoZSBmb290IGJ5IG1hbmlwdWxhdGluZyB0aGluZ3MgaW4gYml6YXJyZSB3YXlzIChTV0lHIGNlcnRhaW5seSB3b24ndCBzdG9wIHlvdSBmcm9tIGRvaW5nIHRoaXMpLjxwPgotPGEgbmFtZT0ibjM1Ij48L2E+PGgzPiBXb3JraW5nIHdpdGggRmlsZXM8L2gzPgotSW4gb3VyIHNpbXBsZSBpbnRlcmZhY2Ugd2UgaW5jbHVkZWQgdHdvIGZ1bmN0aW9ucyB0byBvcGVuIGFuZCBjbG9zZSBmaWxlcy4gICAgQSB2YXJpZXR5IG9mIGZ1bmN0aW9ucyBpbiB0aGUgZ2QgbGlicmFyeSByZXF1aXJlIHRoZSB1c2Ugb2YgYSA8dHQ+RklMRSAqPC90dD4gYXJndW1lbnQgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT5nZEltYWdlUHRyIGdkSW1hZ2VDcmVhdGVGcm9tR2lmKEZJTEUgKmZkKTsKLWdkSW1hZ2VQdHIgZ2RJbWFnZUNyZWF0ZUZyb21HZChGSUxFICppbik7Ci1nZEltYWdlUHRyIGdkSW1hZ2VDcmVhdGVGcm9tWGJtKEZJTEUgKmZkKTsKLXZvaWQgZ2RJbWFnZUdpZihnZEltYWdlUHRyIGltLCBGSUxFICpvdXQpOwotdm9pZCBnZEltYWdlR2QoZ2RJbWFnZVB0ciBpbSwgRklMRSAqb3V0KTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotQW4gaWRlYWwgc29sdXRpb24gd291bGQgYmUgdG8gdXNlIFRjbCBmaWxlIGhhbmRsZXMgYXMgPHR0PkZJTEUgKjwvdHQ+IGFyZ3VtZW50cy4gIFVuZm9ydHVuYXRlbHksIHRoaXMgcmVxdWlyZXMgeW91IHRvIHVucmF2ZWwgZmlsZSBoYW5kbGVzIGFuZCBjb252ZXJ0IHRoZW0gaW50byB0aGUgY29ycmVzcG9uZGluZyA8dHQ+RklMRSAqPC90dD4gc3RydWN0dXJlLS1hIHRhc2sgdGhhdCBpcyBub3QgZWFzaWx5IGFjY29tcGxpc2hlZC4gICBGb3IgdGhlIHB1cnBvc2VzIG9mIHF1aWNrbHkgbWFraW5nIGFuIGludGVyZmFjZSwgaXQgaXMgb2Z0ZW4gZWFzaWVyIHRvIHNpbXBseSBpbmNsdWRlIGEgZmV3IHN1cHBvcnRpbmcgZnVuY3Rpb25zIHN1Y2ggYXMgZm9wZW4oKSBhbmQgZmNsb3NlKCkuICBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSB0byBjcmVhdGUgZmlsZXMgZm9yIHVzZSB3aXRoIHRoZSBsaWJyYXJ5LiAgIEFsdGhvdWdoIGZpbGVzIGNyZWF0ZWQgd2l0aCB0aGVzZSBmdW5jdGlvbnMgYXJlIG5vdCB0aGUgc2FtZSBhcyBUY2wgZmlsZSBoYW5kbGVzLCB0aGV5IGFyZSBzdGlsbCBlYXN5IHRvIHVzZS48cD4KLTxhIG5hbWU9Im4zNiI+PC9hPjxoMz4gV3JhcHBpbmcgTWFjcm9zPC9oMz4KLVRoZSBnZCBsaWJyYXJ5IHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiBtYWNyb3MgZm9yIGFjY2Vzc2luZyB2YXJpb3VzIGltYWdlIGF0dHJpYnV0ZXMuICBSYXRoZXIgdGhhbiBtYW5pcHVsYXRpbmcgdGhlIEMgZGF0YSBzdHJ1Y3R1cmUgZGlyZWN0bHksICB1c2VycyBhcmUgYWR2aXNlZCB0byB1c2UgdGhlc2UgbWFjcm9zLjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiNkZWZpbmUgZ2RJbWFnZVNYKGltKSAoKGltKS0mZ3Q7c3gpCi0jZGVmaW5lIGdkSW1hZ2VTWShpbSkgKChpbSktJmd0O3N5KQotI2RlZmluZSBnZEltYWdlQ29sb3JzVG90YWwoaW0pICgoaW0pLSZndDtjb2xvcnNUb3RhbCkKLSNkZWZpbmUgZ2RJbWFnZVJlZChpbSwgYykgKChpbSktJmd0O3JlZFsoYyldKQotI2RlZmluZSBnZEltYWdlR3JlZW4oaW0sIGMpICgoaW0pLSZndDtncmVlblsoYyldKQotI2RlZmluZSBnZEltYWdlQmx1ZShpbSwgYykgKChpbSktJmd0O2JsdWVbKGMpXSkKLSNkZWZpbmUgZ2RJbWFnZUdldFRyYW5zcGFyZW50KGltKSAoKGltKS0mZ3Q7dHJhbnNwYXJlbnQpCi0jZGVmaW5lIGdkSW1hZ2VHZXRJbnRlcmxhY2VkKGltKSAoKGltKS0mZ3Q7aW50ZXJsYWNlKQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TV0lHIHdvbid0IHdyYXAgdGhlc2UgbWFjcm9zIGRpcmVjdGx5LCBidXQgeW91IGNhbiB3cml0ZSBzb21lIGZ1bmN0aW9uIHByb3RvdHlwZXMgdG8gYWNjb21wbGlzaCB0aGUgc2FtZSB0aGluZy4gPHA+Ci08YmxvY2txdW90ZT48cHJlPgotJW1vZHVsZSBnZAotJXsKLSNpbmNsdWRlICZsdDtnZC5oJmd0OwotJX0KLQotLy8gSnVzdCBncmFiIHRoZSBnZC5oIGhlYWRlciBmaWxlCi0laW5jbHVkZSBnZC5oCi0KLS8vIENsZWFyIHRoZSBwcmV2aW91cyBtYWNybyBkZWZpbml0aW9ucyBpbmNsdWRlZCBpbiBnZC5oCi0jdW5kZWYgZ2RJbWFnZVNYCi0jdW5kZWYgZ2RJbWFnZVNZCi0jdW5kZWYgZ2RJbWFnZUNvbG9yc1RvdGFsCi0jdW5kZWYgZ2RJbWFnZVJlZAotI3VuZGVmIGdkSW1hZ2VHcmVlbgotI3VuZGVmIGdkQmx1ZQotI3VuZGVmIGdkSW1hZ2VHZXRUcmFuc3BhcmVudAotI3VuZGVmIGdkSW1hZ2VHZXRJbnRlcmxhY2VkCi0KLS8vIFByb3ZpZGUgU1dJRyB3aXRoIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBtYWNyb3MKLWludCBnZEltYWdlU1goZ2RJbWFnZVB0ciBpbSk7Ci1pbnQgZ2RJbWFnZVNZKGdkSW1hZ2VQdHIgaW0pOwotaW50IGdkSW1hZ2VDb2xvcnNUb3RhbChnZEltYWdlUHRyIGltKTsKLWludCBnZEltYWdlUmVkKGdkSW1hZ2VQdHIgaW0sIGludCBjKTsKLWludCBnZEltYWdlR3JlZW4oZ2RJbWFnZVB0ciBpbSwgaW50IGMpOwotaW50IGdkSW1hZ2VCbHVlKGdkSW1hZ2VQdHIgaW0sIGludCBjKTsKLWludCBnZEltYWdlR2V0VHJhbnNwYXJlbnQoZ2RJbWFnZVB0ciBpbSk7Ci1pbnQgZ2RJbWFnZUdldEludGVybGFjZWQoZ2RJbWFnZVB0ciBpbSk7Ci0KLS8vIFBsdXMgYSBmZXcgZmlsZSBJL08gZnVuY3Rpb25zCi1GSUxFICpmb3BlbihjaGFyICpmaWxlbmFtZSwgY2hhciAqbW9kZSk7Ci12b2lkIGZjbG9zZShGSUxFICpmKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotV2l0aGluIFRjbCwgdGhlc2UgbWFjcm9zIGNhbiBub3cgYmUgdXNlZCBqdXN0IGxpa2Ugb3JkaW5hcnkgZnVuY3Rpb25zPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSBzZXQgaW0gW2dkSW1hZ2VDcmVhdGUgMjAwIDIwMF0KLSUgZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDIzMyA1MCA0MAotJSBnZEltYWdlU1ggJGltCi0yMDAKLSUgZ2RJbWFnZUNvbG9yc1RvdGFsICRpbQotMQotJQotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGEgbmFtZT0ibjM3Ij48L2E+PGgzPiBXcmFwcGluZyB0aGUgRm9udHM8L2gzPgotZ2QgaXMgcGFja2FnZWQgd2l0aCBmaXZlIGRpZmZlcmVudCBmb250cyB0aGF0IGFyZSB1c2VkIHdpdGggZnVuY3Rpb25zIHN1Y2ggYXM8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT52b2lkCi1nZEltYWdlQ2hhcihnZEltYWdlUHRyIGltLCBnZEZvbnRQdHIgZiwgaW50IHgsIGludCB5LCBpbnQgYywgaW50IGNvbG9yKTsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotd2hlcmUgZ2RGb250UHRyIGlzIGEgcG9pbnRlciB0byBhIGZvbnQgc3RydWN0dXJlLiAgICAgRWFjaCBmb250IGlzIGRlZmluZWQgYnkgYSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBkZWZpbmVkIGluIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUgc3VjaCBhcyB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jaWZuZGVmIEdERk9OVFNfSAotI2RlZmluZSBHREZPTlRTX0ggMQotCi0vKiBnZGZvbnRzLmg6IGJyaW5ncyBpbiB0aGUgc21hbGxlciBvZiB0aGUgdHdvIHByb3ZpZGVkIGZvbnRzLgotICAgICAgICBBbHNvIGxpbmsgd2l0aCBnZGZvbnRzLmMuICovCi0KLSNpbmNsdWRlICJnZC5oIgotCi0vKiA2eDEyIGZvbnQgZGVyaXZlZCBmcm9tIGEgcHVibGljIGRvbWFpbiBmb250IGluIHRoZSBYCi0gICAgICAgIGRpc3RyaWJ1dGlvbi4gT25seSBjb250YWlucyB0aGUgOTYgc3RhbmRhcmQgYXNjaWkgY2hhcmFjdGVycywKLSAgICAgICAgc29ycnkuIEZlZWwgZnJlZSB0byBpbXByb3ZlIG9uIHRoaXMuICovCi0KLWV4dGVybiBnZEZvbnRQdHIgZ2RGb250U21hbGw7Ci0KLSNlbmRpZgotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1UbyBtYWtlIHRoZSBidWlsdC1pbiBmb250cyBhdmFpbGFibGUgdG8gb3VyIFRjbCBpbnRlcmZhY2UsIHlvdSBuZWVkIHRvIG1ha2UgdGhlIGZvbnQgcG9pbnRlcnMgYXZhaWxhYmxlLiAgU2luY2UgdGhlIGZvbnQgaGVhZGVyIGZpbGVzIGFyZSBmYWlybHkgc2ltcGxlLCB0aGlzIGNhbiBiZSBkb25lIGJ5IHNpbXBseSBpbmNsdWRpbmcgdGhlIGhlYWRlciBmaWxlcyBpbiBvdXIgU1dJRyBpbnRlcmZhY2Ugc3VjaCBhcyBmb2xsb3dzIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBNYWtlIHRoZSBnZCBmb250cyBhdmFpbGFibGUgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcwotJXJlYWRvbmx5Ci0laW5jbHVkZSAiZ2Rmb250dC5oIgotJWluY2x1ZGUgImdkZm9udHMuaCIKLSVpbmNsdWRlICJnZGZvbnRtYi5oIgotJWluY2x1ZGUgImdkZm9udGwuaCIKLSVpbmNsdWRlICJnZGZvbnRnLmgiCi0lcmVhZHdyaXRlCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoZSBmYWN0IHRoYXQgdGhlIGZvbnRzIGFyZSBnbG9iYWwgdmFyaWFibGVzIHByZXNlbnRzIHVzIHdpdGggYSBzbGlnaHQgY29tcGxpY2F0aW9uLiAgIFNXSUcgbm9ybWFsbHkgdHJpZXMgdG8gdXNlIHRoZSBUY2wgdmFyaWFibGUgbGlua2luZyBtZWNoYW5pc20sIGJ1dCB0aGlzIG9ubHkgc3VwcG9ydHMgdGhlIGJhc2ljIGRhdGF0eXBlcyBvZiA8dHQ+ZG91YmxlPC90dD4sIDx0dD5pbnQ8L3R0PiwgYW5kIDx0dD5jaGFyICo8L3R0Pi4gIFRvIGFjY2VzcyBvdGhlciB0eXBlcyAoaW5jbHVkaW5nIHBvaW50ZXJzKSwgU1dJRyBnZW5lcmF0ZXMgYWNjZXNzb3IgZnVuY3Rpb25zLiAgVGh1cywgaW4gVGNsLCB0aGVzZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkIGFzIGZvbGxvd3MgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgZ2RGb250VGlueV9nZXQKLV80MDBmNjk1Y19nZEZvbnRQdHIKLSUgZ2RJbWFnZUNoYXIgJGltIFtnZEZvbnRUaW55X2dldF0gMjAgMjAgQSAkd2hpdGUKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotU2luY2UgdGhpcyBjYW4gYmUgYSBsaXR0bGUgYXdrd2FyZCwgaXQgbWF5IG1ha2UgbW9yZSBzZW5zZSB0byB3cml0ZSBhIHNpbXBsZSBUY2wgc2NyaXB0IHRvIGZpeCB0aGUgcHJvYmxlbTxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgZ2Rmb250cy50Y2wgOiBFeHRyYWN0IHRoZSBmb250cyBpbnRvIFRjbCB2YXJpYWJsZXMKLXNldCBnZEZvbnRUaW55ICAgICAgIFtnZEZvbnRUaW55X2dldF0KLXNldCBnZEZvbnRTbWFsbCAgICAgIFtnZEZvbnRTbWFsbF9nZXRdCi1zZXQgZ2RGb250TWVkaXVtQm9sZCBbZ2RGb250TWVkaXVtQm9sZF9nZXRdCi1zZXQgZ2RGb250TGFyZ2UgICAgICBbZ2RGb250TGFyZ2VfZ2V0XQotc2V0IGdkRm9udEdpYW50ICAgICAgW2dkRm9udEdpYW50X2dldF0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotTm93LCB5b3Ugd291bGQganVzdCB3cml0ZSB0aGUgZm9sbG93aW5nIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIFNpbXBsZSBnZCBzY3JpcHQKLWxvYWQgLi9nZC5zbwotc291cmNlIGdkZm9udHMudGNsCi0KLXNldCBpbSBbZ2RJbWFnZUNyZWF0ZSAyMDAgMjAwXQotc2V0IGJsYWNrIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMCAwIDBdCi1zZXQgd2hpdGUgW2dkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAyNTUgMjU1IDI1NV0KLQotIyBEcmF3IHNvbWUgdGV4dAotZ2RJbWFnZVN0cmluZyAkaW0gJGdkRm9udExhcmdlIDEwIDUwICJIZWxsbyBXb3JsZCIgJHdoaXRlCi0KLSMgV3JpdGUgdGhlIGltYWdlCi1zZXQgb3V0IFtmb3BlbiB0ZXN0LmdpZiB3Yl0KLWdkSW1hZ2VHaWYgJGltICRvdXQKLWZjbG9zZSAkb3V0Ci0KLSMgQ2xlYW4gdXAKLWdkSW1hZ2VEZXN0cm95ICRpbQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JZiB3cml0aW5nIGEgbGl0dGxlIFRjbCBzY3JpcHQgdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW0gaXNuJ3QgeW91ciBwcmVmZXJlbmNlLCBpdCdzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIHRoZSB2YXJpYWJsZXMgd2l0aGluIHRoZSBTV0lHIG1vZHVsZS4gIEZvciBleGFtcGxlIDo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4vLyBDcmVhdGUgc29tZSBUY2wgdmFyaWFibGVzIGZvciB0aGUgZm9udHNzdGFydHVwCi0jaWZkZWYgU1dJR1RDTAotJWluaXQgJXsKLXsKLSAgICBjaGFyIHRlbXBbNjRdOwotICAgIFNXSUdfTWFrZVB0cih0ZW1wLCBnZEZvbnRUaW55LCAiX2dkRm9udFB0ciIpOwotICAgIFRjbF9TZXRWYXIoaW50ZXJwLCJnZEZvbnRUaW55Iix0ZW1wLDApOwotICAgIFNXSUdfTWFrZVB0cih0ZW1wLCBnZEZvbnRTbWFsbCwgIl9nZEZvbnRQdHIiKTsKLSAgICBUY2xfU2V0VmFyKGludGVycCwiZ2RGb250U21hbGwiLHRlbXAsMCk7Ci0gICAgU1dJR19NYWtlUHRyKHRlbXAsIGdkRm9udE1lZGl1bUJvbGQsICJfZ2RGb250UHRyIik7Ci0gICAgVGNsX1NldFZhcihpbnRlcnAsImdkRm9udE1lZGl1bUJvbGQiLHRlbXAsMCk7Ci0gICAgU1dJR19NYWtlUHRyKHRlbXAsIGdkRm9udExhcmdlLCAiX2dkRm9udFB0ciIpOwotICAgIFRjbF9TZXRWYXIoaW50ZXJwLCJnZEZvbnRMYXJnZSIsdGVtcCwwKTsKLSAgICBTV0lHX01ha2VQdHIodGVtcCwgZ2RGb250R2lhbnQsICJfZ2RGb250UHRyIik7Ci0gICAgVGNsX1NldFZhcihpbnRlcnAsImdkRm9udEdpYW50Iix0ZW1wLDApOwotfQotJX0KLSNlbmRpZgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dHQ+U1dJR19NYWtlUHRyKCk8L3R0PiBpcyBhIGZ1bmN0aW9uIFNXSUcgdXNlcyB0byBjcmVhdGUgcG9pbnRlciB2YXJpYWJsZXMuICAgU2luY2UgdGhpcyBhcHByb2FjaCB3b3VsZCBvbmx5IHdvcmsgd2l0aCBUY2wsIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoaXMgY29kZSBpc24ndCBpbmNsdWRlZCB3aGVuIHByb2R1Y2luZyBpbnRlcmZhY2VzIGZvciBvdGhlciBsYW5ndWFnZXMgKDx0dD5TV0lHVENMPC90dD4gaXMgYSBzeW1ib2wgZGVmaW5lZCBieSBTV0lHIHdoZW4gaXQgaXMgcnVubmluZyBpbiBUY2wgbW9kZSkuIDxwPgotPGEgbmFtZT0ibjM4Ij48L2E+PGgzPiBDcmVhdGluZyBQb2ludHM8L2gzPgotRmluYWxseSwgdGhlIGdkIGxpYnJhcnkgY29udGFpbnMgYSBmZXcgZnVuY3Rpb25zIGZvciBkcmF3aW5nIHBvbHlnb25zIHN1Y2ggYXMgPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dm9pZCBnZEltYWdlUG9seWdvbihnZEltYWdlUHRyIGltLCBnZFBvaW50UHRyIHAsIGludCBuLCBpbnQgYyk7Ci12b2lkIGdkSW1hZ2VGaWxsZWRQb2x5Z29uKGdkSW1hZ2VQdHIgaW0sIGdkUG9pbnRQdHIgcCwgaW50IG4sIGludCBjKTsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotVGhlc2UgZnVuY3Rpb25zIHJlcXVpcmUgYW4gYXJyYXkgb2YgcG9pbnRzIHRvIGJlIHBhc3NlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiAgIFBvaW50cyBhcmUgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+dHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBpbnQgeCwgeTsKLX0gZ2RQb2ludCwgKmdkUG9pbnRQdHI7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFzIGlzLCBvdXIgVGNsIGludGVyZmFjZSBoYXMgbm8gbWVjaGFuaXNtIGZvciBjcmVhdGluZyBhcnJheXMgb2YgcG9pbnRzIHNvIHdlIHdpbGwgbmVlZCB0byBwcm92aWRlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhpcy4gICBIZXJlJ3Mgb25lIHdheSB0byBkbyBpdDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHBvaW50cwotJWlubGluZSAlewotICAgZ2RQb2ludCAqbmV3X3BvaW50cyhpbnQgbnBvaW50cykgewotICAgICAgICByZXR1cm4gKGdkUG9pbnQgKikgbWFsbG9jKG5wb2ludHMqc2l6ZW9mKGdkUG9pbnQpKTsKLSAgIH0KLSAgIHZvaWQgZGVsZXRlX3BvaW50cyhnZFBvaW50ICpwKSB7Ci0gICAgICAgIGZyZWUocCk7Ci0gICB9Ci0gICB2b2lkIHNldF9wb2ludChnZFBvaW50ICpwLCBpbnQgbiwgaW50IHgsIGludCB5KSB7Ci0gICAgICAgIHBbbl0ueCA9IHg7Ci0gICAgICAgIHBbbl0ueSA9IHk7Ci0gICB9Ci0lfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Gcm9tIFRjbCwgcG9pbnRzIGNhbiBub3cgYmUgY3JlYXRlZCBhbmQgbWFuaXB1bGF0ZWQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBDcmVhdGUgYW4gYXJyYXkgb2YgcG9pbnRzCi1zZXQgcCBbbmV3X3BvaW50cyA0XQotc2V0X3BvaW50ICRwIDAgMTAgMjAKLXNldF9wb2ludCAkcCAxIDE1MCAzMAotc2V0X3BvaW50ICRwIDIgOTUgMTUwCi1zZXRfcG9pbnQgJHAgMyAyMCA3MAotCi0jIERyYXcgYSBwb2x5Z29uCi1nZEltYWdlUG9seWdvbiAkaW0gJHAgNCAkd2hpdGUKLQotIyBEZWxldGUgdGhlIHBvaW50cwotZGVsZXRlX3BvaW50cyAkcAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuMzkiPjwvYT48aDM+IFVzaW5nIHRoZSBNb2R1bGU8L2gzPgotV2l0aCBhIGp1c3QgYSBsaXR0bGUgd29yaywgdGhlIGdkIG1vZHVsZSBpcyBub3cgZnVsbHkgZnVuY3Rpb25hbCBhbmQgcmVhZHkgdG8gYmUgdXNlZC4gICBGcm9tIFRjbCwgIHlvdSBjYW4gaW50ZXJhY3RpdmVseSBwbGF5IHdpdGggbGlicmFyeSBhbmQgdGVzdCBvdXQgaXRzIHZhcmlvdXMgZnVuY3Rpb25zLiAgSW4gZmFjdCB5b3UgY2FuIGV2ZW4gd3JpdGUgYSBzaW1wbGUgVGsgc2NyaXB0IHRvIHdhdGNoIHRoZSBvdXRwdXQgZmlsZSBhbmQgZGlzcGxheSBpbWFnZXMgaW4gYSBjYW52YXMuICBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyB3YXRjaGdpZi50Y2wgOiBQZXJpb2RpY2FsbHkgcG9sbCBhIGZpbGUgYW5kIGRpc3BsYXkgaW4gdGhlIGNhbnZhcwotc2V0IGF0aW1lICIiCi1zZXQgY2FudmFzaW5pdCAwCi1zZXQgY3VycmVudF9pbWcgIiIKLQotcHJvYyB3YXRjaGdpZiB7Zm5hbWV9IHsKLSAgICBnbG9iYWwgYXRpbWUgZmlsZW5hbWUKLSAgICBzZXQgZmlsZW5hbWUgJGZuYW1lCi0gICAgc2V0IG5ld2F0aW1lICIiCi0gICAgY2F0Y2gge3NldCBuZXdhdGltZSBbZmlsZSBtdGltZSAkZmlsZW5hbWVdfQotICAgIGlmIHsgJG5ld2F0aW1lICE9ICRhdGltZSB9IHsKLSAgICAgICAgc2V0IGF0aW1lICRuZXdhdGltZQotICAgICAgICB1cGRhdGVfaW1hZ2UKLSAgICB9Ci0gICAgYWZ0ZXIgMTAwMCAid2F0Y2hnaWYgJGZpbGVuYW1lIgotfQotCi1wcm9jIHVwZGF0ZV9pbWFnZSB7fSB7Ci0gICAgZ2xvYmFsIGNhbnZhc2luaXQgY2FudmFzIGN1cnJlbnRfaW1nIGZpbGVuYW1lCi0gICAgc2V0IGltZyBbaW1hZ2UgY3JlYXRlIHBob3RvIC1maWxlICRmaWxlbmFtZV0KLSAgICBpZiB7JGNhbnZhc2luaXQgPT0gMCB9IHsKLSAgICAgICAgY2FudmFzIC5pbWcKLSAgICAgICAgcGFjayAuaW1nCi0gICAgICAgIHNldCBjYW52YXNpbml0IDEKLSAgICB9IGVsc2UgewotICAgICAgICBpbWFnZSBkZWxldGUgJGN1cnJlbnRfaW1nCi0gICAgfQotICAgIC5pbWcgZGVsZXRlIGltYWdlZGF0YQotICAgIHNldCB3aWR0aCBbaW1hZ2Ugd2lkdGggJGltZ10KLSAgICBzZXQgaGVpZ2h0IFtpbWFnZSBoZWlnaHQgJGltZ10KLSAgICAuaW1nIGNvbmZpZ3VyZSAtd2lkdGggJHdpZHRoIC1oZWlnaHQgJGhlaWdodAotICAgIC5pbWcgY3JlYXRlIGltYWdlIDAgMCAtaW1hZ2UgJGltZyAtYW5jaG9yIG53IC10YWcgaW1hZ2VkYXRhCi0gICAgc2V0IGN1cnJlbnRfaW1nICRpbWcKLX0KLQotcHJvYyB3cml0ZSB7aW19IHsKLSAgICBnbG9iYWwgZmlsZW5hbWUKLSAgICBzZXQgb3V0IFtmb3BlbiAkZmlsZW5hbWUgd2JdCi0gICAgZ2RJbWFnZUdpZiAkaW0gJG91dAotICAgIGZjbG9zZSAkb3V0Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdyBhbiBpbnRlcmFjdGl2ZSBnZCBzZXNzaW9uPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+Jmd0OyB3aXNoCi0lIGxvYWQgLi9nZC5zbwotJSBzb3VyY2UgZ2Rmb250cy50Y2wKLSUgc291cmNlIHdhdGNoZ2lmLnRjbAotJSB3YXRjaGdpZiB0ZXN0LmdpZiAgICAgICAgICAgICAgICA7IyBXYXRjaCBhIGZpbGUgZm9yIGNoYW5nZXMgYW5kIGRpc3BsYXkKLSUgc2V0IGltIFtnZEltYWdlQ3JlYXRlIDMwMCAzMDBdCi1fODE3ZDEwOF9nZEltYWdlUHRyCi0lIHNldCBibGFjayBbZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDAgMCAwXQotMAotJSBzZXQgd2hpdGUgW2dkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAyNTUgMjU1IDI1NV0KLTEKLSUgZ2RJbWFnZUxpbmUgJGltIDIwIDIwIDI1MCA3MCAkd2hpdGUKLSUgZ2RJbWFnZVN0cmluZyAkaW0gJGdkRm9udExhcmdlIDIwIDcwICJIZWxsbyBXb3JsZCIgJHdoaXRlCi0lIHdyaXRlICRpbSAgICAgICAKLSUgZ2RJbWFnZUFyYyAkaW0gMTAwIDEwMCA1MCAyMCAwIDI3MCAkd2hpdGUKLSUgd3JpdGUgJGltICAgICAgICAgICAgICAgICAgIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JcyB0aGlzIGV4YW1wbGUsIHZhcmlvdXMgZ2QgbGlicmFyeSBmdW5jdGlvbnMgYXJlIGlzc3VlZCBpbnRlcmFjdGl2ZWx5LiAgV2hlbmV2ZXIgeW91IHdhbnQgdG8gc2VlIHRoZSBjdXJyZW50IGltYWdlLCBzaW1wbHkgdHlwZSBgPHR0PndyaXRlICRpbTwvdHQ+JyBhbmQgdGhlIGltYWdlIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIGNhbnZhcyB3aWxsIGJlIHVwZGF0ZWQuICAgVGhlIGludGVyZmFjZSBpcyBtaW5pbWFsLCBidXQgeW91IGNhbiB1c2UgaXQgdG8gcGxheSB3aXRoIHRoZSBsaWJyYXJ5LCBzZWUgaG93IGl0IHdvcmtzLCBhbmQgZXZlbiB3cml0ZSBsaXR0bGUgVGNsIHNjcmlwdHMgdG8gdHJ5IHRoaW5ncyBvdXQuPHA+Ci08YSBuYW1lPSJuNDAiPjwvYT48aDM+IFdyaXRpbmcgVGVzdCBTY3JpcHRzPC9oMz4KLVdoZXJlIHRoaXMgYXBwcm9hY2ggcmVhbGx5IHNoaW5lcyBpcyB0aGUgYWJpbGl0eSB0byB3cml0ZSBmbGV4aWJsZSB0ZXN0IHNjcmlwdHMuICBXaGVuIGRldmVsb3BpbmcgQyBsaWJyYXJpZXMsIEkgYWx3YXlzIHNlZW0gdG8gZmluZCBteXNlbGYgc3BlbmRpbmcgYSBodWdlIGFtb3VudCBvZiB0aW1lIHdyaXRpbmcgdGVzdCBwcm9ncmFtcyB0byBleGVyY2lzZSB2YXJpb3VzIHBhcnRzIG9mIHRoZSBsaWJyYXJ5LiAgIEFsdGhvdWdoIEkgY291bGQgd3JpdGUgYSBjb2xsZWN0aW9uIG9mIEMgcHJvZ3JhbXMgdG8gZG8gdGhpcywgdXNpbmcgVGNsIGlzIG9mdGVuIG11Y2ggbW9yZSBmbGV4aWJsZS4gICBTdXBwb3NlIHlvdSB3YW50ZWQgdG8gdGVzdCB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIGdkIGxpYnJhcnkuICBUbyBkbyB0aGlzLCB5b3UgbWlnaHQgd3JpdGUgYSBnZW5lcmljIHRlc3Qgc2NyaXB0IHN1Y2ggYXMgdGhlIGZvbGxvd2luZzxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgZ2R0ZXN0LnRjbCA6IEdlbmVyaWMgZ2QgdGVzdCBzY3JpcHQKLSMKLSMgVGhpcyBzY3JpcHRzIHNldHMgdXAgc29tZSBkZWZhdWx0IHZhbHVlcywgY3JlYXRlcyBhbiBpbWFnZQotIyBhbmQgZXhlY3V0ZXMgYSB0ZXN0IHNjcmlwdC4KLSMKLSMgdXNhZ2UgOiB0Y2xzaCBnZHRlc3QudGNsIHNjcmlwdC50Y2wKLQotbG9hZCAuL2dkLnNvCi1zb3VyY2UgZ2Rmb250cy50Y2wKLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMKLQotc2V0IHdpZHRoIDQwMAotc2V0IGhlaWdodCA0MDAKLQotIyBDcmVhdGUgYW4gaW1hZ2UKLXNldCBpbSBbZ2RJbWFnZUNyZWF0ZSAkd2lkdGggJGhlaWdodF0KLQotIyBDcmVhdGUgc29tZSBjb2xvcnMKLXNldCBibGFjayAgIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMCAwIDBdCi1zZXQgd2hpdGUgICBbZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDI1NSAyNTUgMjU1XQotc2V0IHJlZCAgICAgW2dkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAyNTUgMCAwIF0KLXNldCBncmVlbiAgIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMCAyNTUgMCBdCi1zZXQgYmx1ZSAgICBbZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDAgMCAyNTVdCi1zZXQgeWVsbG93ICBbZ2RJbWFnZUNvbG9yQWxsb2NhdGUgJGltIDI1NSAyNTUgMF0KLXNldCBjeWFuICAgIFtnZEltYWdlQ29sb3JBbGxvY2F0ZSAkaW0gMCAyNTUgMjU1XQotc2V0IG1hZ2VudGEgW2dkSW1hZ2VDb2xvckFsbG9jYXRlICRpbSAyNTUgMCAyNTVdCi0KLSMgR2V0IHRoZSBmaWxlbmFtZSBvZiB0aGUgdGVzdCBzY3JpcHQKLXNldCBmaWxlbmFtZSBbbGluZGV4ICRhcmd2IDBdCi0KLSMgUnVuIHRoZSB0ZXN0IHNjcmlwdAotc291cmNlICRmaWxlbmFtZQotCi0jIE91dHB1dCB0aGUgaW1hZ2UKLWFwcGVuZCBmaWxlbmFtZSAiLmdpZiIKLXNldCBvdXQgW2ZvcGVuICRmaWxlbmFtZSB3Yl0KLWdkSW1hZ2VHaWYgJGltICRvdXQKLWZjbG9zZSAkb3V0Ci0KLXB1dHMgIkltYWdlIHdyaXR0ZW4gdG8gJGZpbGVuYW1lIgotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgc2NyaXB0IHNpbXBseSBzZXRzIHVwIGFuIGltYWdlIGFuZCBzb21lIGRlZmF1bHQgdmFsdWVzLiAgVG8gdXNlIGl0LCAgeW91IHdvdWxkIHdyaXRlIGEgc2hvcnQgdGVzdCBzY3JpcHQgc3VjaCBhczxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiMgbGluZXMudGNsIDogRHJhdyBzb21lIGxpbmVzCi1nZEltYWdlTGluZSAkaW0gMTAgMTAgMzAwIDUwICR3aGl0ZQotZ2RJbWFnZUxpbmUgJGltIDUwIDIwMCAyOTAgMTAgJHJlZAotLi4uCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLWFuZCBydW4gaXQgYXMgZm9sbG93cyA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+JSB0Y2xzaCBnZHRlc3QudGNsIGxpbmVzLnRjbAotSW1hZ2Ugd3JpdHRlbiB0byBsaW5lcy50Y2wuZ2lmCi0lIAotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1GaW5hbGx5LCBpZiB5b3Ugd2FudGVkIHRvIGRldmVsb3AgYW4gZW50aXJlIHRlc3Rpbmcgc3VpdGUsIHlvdSBjYW4gd3JpdGUgYSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgdG8gZXhlcmNpc2UgdmFyaW91cyBmZWF0dXJlcyBhbG9uZyB3aXRoIGEgc2ltcGxlIHRlc3RpbmcgcHJvZ3JhbS48cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4jIGdkIHRlc3Rpbmcgc2NyaXB0Ci0KLXNldCBmaWxlcyB7IGxpbmVzLnRjbCBhcmNzLnRjbCBmb250cy50Y2wgZmlsbC50Y2wgcG9seWdvbnMudGNsIC4uLiB9Ci0KLWZvcmVhY2ggZiAkZmlsZXMgewotICAgIHB1dHMgLW5vbmV3bGluZSAiVGVzdGluZyAkZiAuLi4gIgotICAgIGlmIFtjYXRjaCB7c2V0IG1zZyBbZXhlYyB0Y2xzaCBnZHRlc3QudGNsICRmIF19XSB7Ci0gICAgIHNldCBtc2cgIkZhaWxlZCEiCi0gICAgfQotICAgIHB1dHMgJG1zZwotfQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1JbiB0aGUgdGVzdCBwcm9ncmFtLCBlYWNoIHRlc3QgaXMgcnVuIGFzIGEgc2VwYXJhdGUgcHJvY2VzcyB1c2luZyBgZXhlYycuICAgIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBpZiBhIHRlc3QgZmFpbHMgd2l0aCBhbiBpbnRlcm5hbCBlcnJvciAoc3VjaCBhcyBhIHNlZ21lbnRhdGlvbiBmYXVsdCksIGl0IHdvbid0IGFmZmVjdCBhbnkgb2YgdGhlIG90aGVyIHRlc3RzIChpbiBvdGhlciB3b3JkcywgdGVzdGluZyBjYW4gcHJvY2VlZCBldmVuIGlmIGluZGl2aWR1YWwgcGFydHMgZmFpbCkuICAgV2hlbiBydW5uaW5nIHRoZSB0ZXN0LCB5b3Ugd2lsbCBub3cgZ2V0IG91dHB1dCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOjxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPiUgdGNsc2ggdGVzdC50Y2wKLVRlc3RpbmcgbGluZXMudGNsIC4uLiBJbWFnZSB3cml0dGVuIHRvIGxpbmVzLnRjbC5naWYKLVRlc3RpbmcgYXJjcy50Y2wgLi4uIEltYWdlIHdyaXR0ZW4gdG8gYXJjLnRjbC5naWYKLVRlc3RpbmcgZm9udHMudGNsIC4uLiBJbWFnZSB3cml0dGVuIHRvIGZvbnRzLnRjbC5naWYKLVRlc3RpbmcgZmlsbC50Y2wgLi4uIEZhaWxlZCEKLVRlc3RpbmcgcG9seWdvbnMudGNsIC4uLiBJbWFnZSB3cml0dGVuIHRvIHBvbHlnb25zLnRjbC5naWYKLSUgCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLVdoaWxlIHNpbXBsZSwgeW91IGNhbiBpbWFnaW5lIHdyaXRpbmcgYSBsYXJnZSBjb2xsZWN0aW9uIG9mIHRlc3Qgc2NyaXB0cyB0byBleGVyY2lzZSB2YXJpb3VzIGZlYXR1cmVzIG9mIGEgbGlicmFyeS4gICAgQnkgd3JpdGluZyB0aGUgdGVzdCBzY3JpcHRzIGluIFRjbCwgdGhleSBhcmUgZWFzeSB0byB3cml0ZSBhbmQgZWFzeSB0byBtb2RpZnkuICAgSW4gZmFjdCwgYSBwb3dlcmZ1bCB0ZXN0aW5nIHN1aXRlIGNhbiBiZSBkZXZlbG9wZWQgd2l0aG91dCBoYXZpbmcgdG8gd3JpdGUgYWRkaXRpb25hbCBwcm9ncmFtcyBpbiBDL0MrKy48cD4KLTxhIG5hbWU9Im40MSI+PC9hPjxoMz4gQnVpbGRpbmcgYW4gT2JqZWN0IE9yaWVudGVkIEludGVyZmFjZSA8L2gzPgotT25lIG9mIHRoZSBpbnRlcmVzdGluZyBwYXJ0cyBvZiB1c2luZyBTV0lHIGlzIHRoYXQgdGhlcmUgaXMgYWxtb3N0IGFsd2F5cyBtb3JlIHRoYW4gb25lIHdheSB0byBkbyB0aGluZ3MuICBJbiB0aGUgZ2QgZXhhbXBsZSwgYSBzdHJhaWdodGZvcndhcmQgVGNsIGludGVyZmFjZSBoYXMgYmVlbiBidWlsdCB0byBDIGxpYnJhcnkuICBGcm9tIFRjbCwgdGhlIGxpYnJhcnkgd29ya3MgaW4gZXNzZW50aWFsbHkgdGhlIHNhbWUgbWFubmVyIGFzIGl0IGRvZXMgaW4gQy4gICAgSG93ZXZlciwgaXQncyBhbHNvIHBvc3NpYmxlIHRvIHBhY2thZ2UgbGlicmFyaWVzIGluIGFuIGVudGlyZWx5IGRpZmZlcmVudCBtYW5uZXIuICAgIFVzaW5nIHRoZSBTV0lHIGNsYXNzIGV4dGVuc2lvbiBtZWNoYW5pc20sICB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIGFkZGVkIHRvIHRoZSBTV0lHIGludGVyZmFjZTo8cD4KLTxwPgotPGJsb2NrcXVvdGU+PHByZT4lbW9kdWxlIGdkCi0lewotI2luY2x1ZGUgImdkLmgiCi0lfQotJWluY2x1ZGUgZ2QuaAotLi4uCi0lYWRkbWV0aG9kcyBnZEltYWdlIHsKLSAgICBnZEltYWdlKGludCB3LCBpbnQgaCkgewotICAgICAgIHJldHVybiBnZEltYWdlQ3JlYXRlKHcsaCk7Ci0gICAgfQotICAgIH5nZEltYWdlKCkgewotICAgICAgIGdkSW1hZ2VEZXN0cm95KHNlbGYpOwotICAgIH0KLSAgICBpbnQgY29sb3IoaW50IHIsIGludCBnLCBpbnQgYikgewotICAgICAgIHJldHVybiBnZEltYWdlQ29sb3JBbGxvY2F0ZShzZWxmLHIsZyxiKTsKLSAgICB9Ci0gICAgdm9pZCBwbG90KGludCB4LCBpbnQgeSwgaW50IGMpIHsKLSAgICAgICBnZEltYWdlU2V0UGl4ZWwoc2VsZiwgeCwgeSwgYyk7Ci0gICAgfQotICAgIHZvaWQgbGluZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBjKSB7Ci0gICAgICAgZ2RJbWFnZUxpbmUoc2VsZix4MSx5MSx4Mix5MixjKTsKLSAgICB9Ci0gICAgdm9pZCBwb2x5KGdkUG9pbnRQdHIgcHRzLCBpbnQgbnBvaW50cywgaW50IGMpIHsKLSAgICAgICBnZEltYWdlUG9seWdvbihzZWxmLHB0cywgbnBvaW50cywgYyk7Ci0gICAgfQotICAgIHZvaWQgcmVjdChpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIsIGludCBjKSB7Ci0gICAgICAgZ2RJbWFnZVJlY3RhbmdsZShzZWxmLHgxLHkxLHgyLHkyLGMpOwotICAgIH0KLSAgICB2b2lkIHN0cmluZyhnZEZvbnRQdHIgZm9udCwgaW50IHgsIGludCB5LCBjaGFyICpzdHIsIGludCBjKSB7Ci0gICAgICAgZ2RJbWFnZVN0cmluZyhzZWxmLGZvbnQseCx5LHN0cixjKTsKLSAgICB9Ci0gICAgdm9pZCB3cml0ZShjaGFyICpmaWxlbmFtZSkgewotICAgICAgIEZJTEUgKmYgPSBmb3BlbihmaWxlbmFtZSwid2IiKTsKLSAgICAgICBpZiAoZiA9PSBOVUxMKSByZXR1cm47Ci0gICAgICAgZ2RJbWFnZUdpZihzZWxmLGYpOwotICAgICAgIGZjbG9zZShmKTsKLSAgICB9Ci19Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLU5vdywgaW1hZ2VzIGNhbiBiZSBtYW5pcHVsYXRlZCBhbG1vc3QgbGlrZSBhIFRrIHdpZGdldDxwPgotPHA+Ci08YmxvY2txdW90ZT48cHJlPmxvYWQgLi9nZC5zbwotZ2RJbWFnZSBpbWcgNDAwIDQwMCAgICAgICAgICAgICAgICAgICAgOyMgQ3JlYXRlIGFuIGltYWdlCi1zZXQgYmxhY2sgW2ltZyBjb2xvciAwIDAgMF0gICAgICAgICAgICA7IyBBbGxvY2F0ZSBzb21lIGNvbG9ycwotc2V0IHdoaXRlIFtpbWcgY29sb3IgMjU1IDI1NSAyNTVdICAgICAKLWltZyBsaW5lIDIwIDIwIDMwMCAzMDAgJHdoaXRlICAgICAgICAgIDsjIERyYXcgc29tZSBvYmplY3RzCi1pbWcgcmVjdCA0MCA0MCAyNTAgMjUwICR3aGl0ZQotaW1nIHN0cmluZyAkZ2RGb250TGFyZ2UgMTAgMTAwICJIZWxsbyBXb3JsZCIgJHdoaXRlCi1pbWcgd3JpdGUgInRlc3QuZ2lmIiAgICAgICAgICAgICAgICAgICA7IyBPdXRwdXQgdGhlIGltYWdlCi1yZW5hbWUgaW1nICIiICAgICAgICAgICAgICAgICAgICAgICAgICA7IyBEZXN0cm95IHRoZSBpbWFnZQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08YSBuYW1lPSJuNDIiPjwvYT48aDM+IFBvcnRpbmcgdG8gT3RoZXIgTGFuZ3VhZ2VzPC9oMz4KLUFsdGhvdWdoIHRoaXMgY2hhcHRlciBoYXMgZm9jdXNlZCBleGNsdXNpdmVseSBvbiB0aGUgdXNlIG9mIFNXSUcgYW5kIFRjbCwgbm90aGluZyBwcmV2ZW50cyB1cyBmcm9tIHVzaW5nIG90aGVyIHNjcmlwdGluZyBsYW5ndWFnZXMuICBJbiBmYWN0LCBsb29raW5nIGF0IHRoZSBleGFtcGxlLCBubyBUY2wgc3BlY2lmaWMgY29kZSBpcyBpbnZvbHZlZCBpbiBjcmVhdGluZyB0aGUgc2NyaXB0aW5nIGludGVyZmFjZSAodW5sZXNzIHlvdSB3ZW50IG92ZXJib2FyZCB3aXRoIHR5cGVtYXBzIG9yIFRjbCBzcGVjaWZpYyBoZWxwZXIgZnVuY3Rpb25zKS4gICBCZWNhdXNlIG9mIHRoaXMsIGl0IGlzIHRyaXZpYWwgdG8gcmV0YXJnZXQgdGhlIGludGVyZmFjZSB0byBvdGhlciBlbnZpcm9ubWVudHMgYnkgc2ltcGx5IHJ1bm5pbmcgU1dJRyB3aXRoIGRpZmZlcmVudCBjb21tYW5kIGxpbmUgb3B0aW9uczxwPgotPGJsb2NrcXVvdGU+PHByZT4KLXN3aWcgLXBlcmw1IGdkLmkgICAgICAgICAgICAgICAgICMgQ3JlYXRlIFBlcmw1IG1vZHVsZQotc3dpZyAtcHl0aG9uIGdkLmkgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBQeXRob24gbW9kdWxlCi0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLUFzIGEgcmVzdWx0LCBpdCBpcyBlYXN5IHRvIHdyaXRlIHNjcmlwdHMgaW4gb3RoZXIgbGFuZ3VhZ2VzLiBGb3IgZXhhbXBsZSA6PHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBBIFBlcmw1IFNjcmlwdAotdXNlIGdkOwotIyBDcmVhdGUgYW4gaW1hZ2UKLSRpbSA9IGdkOjpnZEltYWdlQ3JlYXRlKDIwMCwyMDApOwotCi0jIEFsbG9jYXRlIGNvbG9ycwotJGJsYWNrID0gZ2Q6OmdkSW1hZ2VDb2xvckFsbG9jYXRlKCRpbSwwLDAsMCk7Ci0kd2hpdGUgPSBnZDo6Z2RJbWFnZUNvbG9yQWxsb2NhdGUoJGltLDI1NSwyNTUsMjU1KTsKLQotIyBEcmF3IGEgbGluZQotZ2Q6OmdkSW1hZ2VMaW5lKCRpbSwyMCw1MCwxODAsMTQwLCR3aGl0ZSk7Ci0KLSMgV3JpdGUgdGhlIGltYWdlCi0kb3V0ID0gZ2Q6OmZvcGVuKCJ0ZXN0LmdpZiIsd2IpOwotZ2Q6OmdkSW1hZ2VHaWYoJGltLCRvdXQpOwotZ2Q6OmZjbG9zZSgkb3V0KTsKLQotIyBDbGVhbiB1cAotZ2Q6OmdkSW1hZ2VEZXN0cm95KCRpbSk7Ci0KLTwvcHJlPjwvYmxvY2txdW90ZT4KLW9yPHA+Ci08cD4KLTxibG9ja3F1b3RlPjxwcmU+IyBBIFB5dGhvbiBzY3JpcHQKLWltcG9ydCBnZAotaW0gPSBnZC5nZEltYWdlQ3JlYXRlKDIwMCwyMDApCi0KLSMgQWxsb2NhdGUgY29sb3JzCi1ibGFjayA9IGdkLmdkSW1hZ2VDb2xvckFsbG9jYXRlKGltLDAsMCwwKQotd2hpdGUgPSBnZC5nZEltYWdlQ29sb3JBbGxvY2F0ZShpbSwyNTUsMjU1LDI1NSkKLQotIyBEcmF3IGEgbGluZQotZ2QuZ2RJbWFnZUxpbmUoaW0sMjAsNTAsMTgwLDE0MCx3aGl0ZSkKLQotIyBXcml0ZSB0aGUgaW1hZ2UKLW91dCA9IGdkLmZvcGVuKCJ0ZXN0LmdpZiIsd2IpCi1nZC5nZEltYWdlR2lmKGltLG91dCkKLWdkLmZjbG9zZShvdXQpCi0KLSMgQ2xlYW4gdXAKLWdkLmdkSW1hZ2VEZXN0cm95KGltKQotCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BbHRob3VnaCB5b3UgbWlnaHQgbm90IGNvbnNpZGVyIHRoZSB1c2Ugb2Ygb3RoZXIgc2NyaXB0aW5nIGxhbmd1YWdlcyB0byBiZSBzbyBpbXBvcnRhbnQsICBjb25zaWRlciB0aGUgcHJvY2VzcyBvZiB1cGdyYWRpbmcgdG8gbmV3ZXIgdmVyc2lvbiBvZiBUY2wuICBUY2wgNyB3YXMgYmFzZWQgZW50aXJlbHkgb24gc3RyaW5ncyAodGhlICJldmVyeXRoaW5nIGlzIGEgc3RyaW5nIiBtb2RlbCkgd2hpbGUgVGNsIDggdXNlcyBkdWFsLXBvcnRlZCBvYmplY3RzLiAgIFVzaW5nIG9iamVjdHMgcHJvdmlkZXMgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZCB1cGdyYWRpbmcgYSBTV0lHIG1vZHVsZSBmcm9tIFRjbCA3IHRvIFRjbCA4IGlzIHVzdWFsbHkgdHJpdmlhbCAtLSBqdXN0IHJlYnVpbGQgYWxsIG9mIHlvdXIgaW50ZXJmYWNlcyBieSBydW5uaW5nIFNXSUcgd2l0aCB0aGUgPHR0Pi10Y2w4PC90dD4gb3B0aW9uLjxwPgotPGEgbmFtZT0ibjUiPjwvYT48aDI+IFN1bW1hcnk8L2gyPgotSSBob3BlIHRvIGhhdmUgZ2l2ZW4geW91IGEgc21hbGwgdGFzdGUgb2YgU1dJRyBhbmQgaG93IGl0IGNhbiBiZSB1c2VkIHdpdGggQy9DKysgYXBwbGljYXRpb25zLiAgIEZyb20gYSBwZXJzb25hbCBwZXJzcGVjdGl2ZSwgSSBoYXZlIGZvdW5kIHRoZSBjb21iaW5hdGlvbiBvZiBTV0lHIGFuZCBUY2wgdG8gYmUgYSBwb3dlcmZ1bCBkZXZlbG9wbWVudCB0b29sLiAgIEZpcnN0LCBTV0lHIG1ha2VzIGl0IHJlbGF0aXZlbHkgZWFzeSB0byBidWlsZCBUY2wgaW50ZXJmYWNlcyB0byBleGlzdGluZyBDIGNvZGUtLWluIGZhY3QsIEkgcmFyZWx5IGhhdmUgdG8gZGlnIG91dCBteSBUY2wgYm9va3MgZm9yIHRoaXMuICAgU2Vjb25kLCBUY2wgaXMgYSBncmVhdCB3YXkgdG8gaW50ZXJhY3Qgd2l0aCBDIGxpYnJhcmllcy4gIE5vdCBvbmx5IGNhbiBJIGludGVyYWN0aXZlbHkgdHdlYWsgcGFyYW1ldGVycywgY2FsbCBmdW5jdGlvbnMsIGFuZCB0cnkgdGhpbmdzLCBJIGNhbiB3cml0ZSB0ZXN0aW5nIHNjcmlwdHMgYW5kIHNob3J0IHByb2dyYW1zIHdpdGhvdXQgaGF2aW5nIHRvIHdyaXRlIGFkZGl0aW9uYWwgQyBjb2RlLiAgRmluYWxseSwgIHRoaXMgYXBwcm9hY2ggaGFzIGhhZCBhIG5vdGljZWFibGUgaW1wYWN0IG9uIHRoZSBxdWFsaXR5IG9mIHRoZSBzb2Z0d2FyZSBJIGhhdmUgZGV2ZWxvcGVkLiAgIEJlZm9yZSBoYXZpbmcgdGhlIFRjbCBpbnRlcmZhY2UsIGl0IHdhcyBhbHdheXMgYSBzdHJ1Z2dsZSB0byB1c2UgdGhlIGNvZGUgSSBoYWQgZGV2ZWxvcGVkLiAgTW9yZSBvZnRlbiB0aGFuIG5vdCwgSSB3b3VsZCBzcGVuZCBpbm9yZGluYXRlIGFtb3VudHMgb2YgdGltZSB3cml0aW5nIGJhZCB1c2VyIGludGVyZmFjZXMgYW5kIHRlc3QgcHJvZ3JhbXMuICBIb3dldmVyLCBieSBoYXZpbmcgYSBUY2wgaW50ZXJmYWNlLCAgSSB3YXMgZ2l2ZW4gYW4gZW52aXJvbm1lbnQgdGhhdCBsZXRzIG1lIHBsYXkgd2l0aCBsaWJyYXJpZXMsIHRlc3QgY29tcG9uZW50cywgYW5kIGNvbmNlbnRyYXRlIG9uIHRoZSBwcm9ibGVtIGF0IGhhbmQuICBJbiBtYW55IGNhc2VzLCB0aGlzIGhhcyBhbGxvd2VkIG1lIHRvIGZpbmQgZGVzaWduIGZsYXdzIGFuZCBjb3JyZWN0IHJlbGlhYmlsaXR5IHByb2JsZW1zIG11Y2ggZWFybGllciB0aGFuIGJlZm9yZS48cD4KLTxwPgotVGhpcyBjaGFwdGVyIGhhcyBvbmx5IHNjcmF0Y2hlZCB0aGUgc3VyZmFjZSBvZiBTV0lHIGFuZCBpdHMgdXNlIHdpdGggVGNsLiAgICBJbiBhZGRpdGlvbiB0byBpdHMgdXNlIGluIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50LCBTV0lHIGNhbiBhbHNvIGJlIHVzZWQgdG8gYnVpbGQgZ2VuZXJhbCBwdXJwb3NlIFRjbCBleHRlbnNpb24gbW9kdWxlcyBhbmQgYXMgYSB0b29sIGZvciBidWlsZGluZyBncmFwaGljYWwgdXNlciBpbnRlcmZhY2VzIHRvIEMvQysrIGFwcGxpY2F0aW9ucyAodXNpbmcgVGspLiAgIFJlYWRlcnMgaW50ZXJlc3RlZCBpbiBvdGhlciBTV0lHIGFwcGxpY2F0aW9ucyBzaG91bGQgdGFrZSBhIGxvb2sgYXQgdGhlIHdlYi1wYWdlICh3d3cuc3dpZy5vcmcpIGFuZCB0aGUgU1dJRyBVc2VycyBNYW51YWwuPHA+Ci08cD4KLVNXSUcgd291bGQgbm90IGJlIHBvc3NpYmxlIHdpdGhvdXQgdGhlIHZhbHVhYmxlIGNvbnRyaWJ1dGlvbnMgb2YgaXRzIHVzZXJzLiAgQWx0aG91Z2ggdGhlcmUgYXJlIGZhciB0b28gbWFueSBwZW9wbGUgdG8gdGhhbmsgaW5kaXZpZHVhbGx5IGF0IHRoaXMgcG9pbnQsIHlvdSBrbm93IHdobyB5b3UgYXJlLiAgU1dJRyB3b3VsZCBjZXJ0YWlubHkgbm90IGJlIGluIGl0cyBjdXJyZW50IHN0YXRlIHdpdGhvdXQgdGhlaXIgZmVlZGJhY2suPHA+Ci08cD4KLQotPHA+PGhyPgotCi08YWRkcmVzcz5iZWF6bGV5QGNzLnVjaGljYWdvLmVkdSAgRnJpIEF1ZyAxNCAxMDoyNToxOSAxOTk4PC9hZGRyZXNzPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3dpZ3dlYi9wYXBlcnMvVGNsVHV0b3JpYWw5OC9UY2xUdXRvcmlhbDk4LnBkZiBiL3N3aWd3ZWIvcGFwZXJzL1RjbFR1dG9yaWFsOTgvVGNsVHV0b3JpYWw5OC5wZGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTE1NWMuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wYXBlcnMvVGNsVHV0b3JpYWw5OC9UY2xUdXRvcmlhbDk4LnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcHJvamVjdHMuaHQgYi9zd2lnd2ViL3Byb2plY3RzLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmEyNTIzLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcHJvamVjdHMuaHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotVGhlIFNXSUcgRmlsZXMKLQotPHA+PGltZyBzcmM9ImltYWdlcy9wcm9qZWN0cy5wbmciIGFsdD0iUHJvamVjdHMiPgotCi08cD4KLVNXSUcgaXMgYmVpbmcgdXNlZCBpbiBhbiBpbmNyZWFzaW5nIG51bWJlciBvZiBhcHBsaWNhdGlvbnMsIG1vc3Qgb2YKLXdoaWNoIGFyZSByZWxhdGVkIHRvIHJlc2VhcmNoIGFuZCBkZXZlbG9wbWVudCwgcHJvdG90eXBpbmcsIHNvZnR3YXJlIHRlc3RpbmcsCi1hbmQgY29uc3RydWN0aW9uIG9mIHNwZWNpYWxpemVkIHN5c3RlbXMuICBUaGlzIHBhZ2UgZGVzY3JpYmVzCi1zb21lIG9mIHRoZSB3YXlzIGluIHdoaWNoIFNXSUcgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQuIAotCi08cD4KLShOb3RlIDogdGhlCi1vcGluaW9ucyBleHByZXNzZWQgaGVyZSBkbyBub3QgbmVjZXNzYXJpbHkgcmVmbGVjdCB0aG9zZSBvZiBhbnkKLWdpdmVuIGVtcGxveWVyIG9yIG9yZ2FuaXphdGlvbikuCi0KLTxocj4KLTxwPgotRGF2aWQgQmVhemxleSAoZG1iQHZpa2luZy5sYW5sLmdvdikgYW5kIFBldGVyIExvbWRhaGwgKHB4bEB2aWtpbmcubGFubC5nb3YpPGJyPgotCi08cD4KLVNXSUcgaXMgYmVpbmcgdXNlZCB0byBjb25zdHJ1Y3QgYSBQeXRob24gaW50ZXJmYWNlIHRvIHRoZSA8YQotaHJlZj0iaHR0cDovL2JpZnJvc3QubGFubC5nb3YvTUQvTUQuaHRtbCI+U1BhU008L2E+IG1vbGVjdWxhciBkeW5hbWljcwotY29kZSBhdCBMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkuICBDdXJyZW50bHkgdGhpcyBjb2RlIGlzIGJlaW5nCi11c2VkIHRvIHBlcmZvcm0gbGFyZ2Utc2NhbGUgc2ltdWxhdGlvbnMgb2YgZnJhY3R1cmUsIHNob2NrIHdhdmVzLCBhbmQKLWRpc2xvY2F0aW9uIGR5bmFtaWNzLiBUaGUgc3lzdGVtIHJ1bnMgaW4gcGFyYWxsZWwgb24gYSAxMiBwcm9jZXNzb3IKLVN1biBFbnRlcnByaXNlIDQwMDAgc2VydmVyIGFuZCBpcyBpbXBsZW1lbnRlZCB3aXRoIE1QSSBhbmQgU29sYXJpcwotbXVsdGl0aHJlYWRpbmcuICBUaGUgUHl0aG9uIGludGVyZmFjZSBpcyB1c2VkIHRvIHByb3ZpZGUgdXNlcnMgd2l0aCBhbgotaW50ZXJhY3RpdmUgZGF0YSBhbmFseXNpcywgdmlzdWFsaXphdGlvbiwgYW5kIHByb3RvdHlwaW5nIGVudmlyb25tZW50LgotVXNlcnMgY2FuIGFsc28gaW50ZXJhY3Qgd2l0aCB1bmRlcmx5aW5nIEMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCAic3RlZXIiCi1jb21wdXRhdGlvbnMgYXMgbmVlZGVkLiAgT25lIG9mIHRoZSBhZHZhbnRhZ2VzIG9mIFNXSUcgaXMgdGhhdCBpdAotYWxsb3dzIGludGVyZmFjZXMgdG8gYmUgZWFzaWx5IGNvbnN0cnVjdGVkIGZyb20gZXhpc3RpbmcgY29kZS4gIFRoZQotU1BhU00gc3lzdGVtIGNvbnNpc3RzIG9mIG5lYXJseSAzMDAgQyBmdW5jdGlvbnMgYW5kIHRoZSBQeXRob24KLWludGVyZmFjZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkdXJpbmcgY29tcGlsYXRpb24uICBUaGlzIHdvcmsKLXdhcyByZWNlbnRseSBmZWF0dXJlZCBvbiB0aGUgY292ZXIgb2YgIkNvbXB1dGVycyBpbiBQaHlzaWNzIiAoSnVuZSwKLTE5OTcpLgotCi08aHI+Ci08cD4KLUpvaG4gU2NobWlkdCAoamFzQGNzLnV0YWguZWR1KSA8YnI+Ci0KLTxwPgotSSBhbSB1c2luZyBTV0lHIHRvIGludGVncmF0ZSBmb3VyIHN0YW5kIGFsb25lIHNvZnR3YXJlIHBhY2thZ2VzIGludG8gYQotdW5pZmllZCBzeXN0ZW0gY29udHJvbGxlZCBieSBUY2wvVGsgc2NyaXB0cy4gIFRoZSB1bmlmaWVkIHNvZnR3YXJlCi1zeXN0ZW0gaXMgdXNlZCB0byBkZXNpZ24gYW5kIHRlc3QgZGVmaWJyaWxsYXRpb24gZWxlY3Ryb2RlcyB2aWEKLWNvbXB1dGVyIHNpbXVsYXRpb25zIG9mIGEgaHVtYW4gc3ViamVjdC4gIFRoZSBpbmRpdmlkdWFsIHNvZnR3YXJlCi1waWVjZXMgaW5jbHVkZTogYSB2aXN1YWxpemF0aW9uIHBhY2thZ2Ugd3JpdHRlbiBpbiBDKysgdXNpbmcKLU9wZW5JbnZlbnRvciBhbmQgTW90aWYsIGFuIHVuc3RydWN0dXJlZCBtZXNoIGdlbmVyYXRvciB3cml0dGVuIGluIEMsIGEKLUZpbml0ZSBFbGVtZW50IFNvbHZlciB3cml0dGVuIGluIEMsIGFuZCBhIHNlZ21lbnRhdGlvbiBzb2Z0d2FyZQotd3JpdHRlbiBpbiBDKysgdXNpbmcgT3BlbkdMIGFuZCBNb3RpZi4gIFNXSUcgaGFzIGJlZW4gY3J1Y2lhbCB0byB0aGUKLWRldmVsb3BtZW50IG9mIHRoaXMgcHJvamVjdC4gIFdpdGggU1dJRywgdGhlIGludGVncmF0aW9uIG9mIHRoZQotaW5kaXZpZHVhbCBwaWVjZXMgd2FzIHRyaXZpYWwuCi0KLTxocj4KLTxwPgotRGF2aWQgQnJ5ZG9uIChicnlkb25AbGFubC5nb3YpIDxicj4KLQotPHA+Ci1XZSBhcmUgdXNpbmcgc3dpZyB3aXRoIHB5dGhvbiB0byByZXRyaWV2ZSwgYW5hbHl6ZSwgYW5kIHZpc3VhbGl6ZSB2ZXJ5Ci1sYXJnZSBkYXRhIHNldHMgZnJvbSBvY2VhbiBtb2RlbCBzaW11bGF0aW9ucyBvbiBwYXJhbGxlbCBjb21wdXRlcnMuCi1XZSBoYXZlIHdyaXR0ZW4gQyByb3V0aW5lcyB0aGF0IGFjY2VzcyBvdXIgZGF0YS4gIEdyYXBoaWNzIGxpYnJhcmllcwotYW5kIE1hdGxhYiBhcmUgdXNlZCB0byB2aXN1YWxpemUgdGhlIGRhdGEuICBXZSBhcmUgdmVyeSBoYXBweSB3aXRoIHRoZQotZmxleGlibGUsIHByb2dyYW1tYWJsZSwgcG93ZXJmdWwgdG9vbCB0aGF0IHJlc3VsdHMuCi0KLTxocj4gCQotPHA+Ci1NaWtlIFdlaWJsZW4gKG1ld0BwYXJhZGlnbXNpbS5jb20pIDxicj4KLQotPHA+Ci1QYXJhZGlnbSBzZWxscyBtb2R1bGFyIEMgdG9vbGtpdHMgZm9yIGRldmVsb3BpbmcgdmlzdWFsCi1zaW11bGF0aW9uL3ZpcnR1YWwgcmVhbGl0eSBncmFwaGljcyBhcHBsaWNhdGlvbnMgY2FsbGVkIFZlZ2EgYW5kIGFub3RoZXIKLWZvciBzcGF0aWFsIGF1ZGlvIHNpbXVsYXRpb24gY2FsbGVkIEF1ZGlvV29ya3MuICBJJ3ZlIHVzZWQgU1dJRyB0byB3cmFwCi1WZWdhJ3MgYW5kIEFXJ3MgQVBJcyB3aXRoIFNpbGljb24gR3JhcGhpY3MnICJzZ2l0Y2wiIHRvIGNyZWF0ZSAidmdUY2wiCi1hbmQgImF3VGNsIi4gIEV4cGxvaXRpbmcgdGhlIHBvd2VyIG9mIGludGVyYWN0aXZlIHNjcmlwdGluZyBsYW5ndWFnZXMsCi10aGV5IHByb3ZpZGUgdGhlIGZ1bGwgcG93ZXIgb2YgdGhlIEFQSXMgYXQgcnVudGltZSwgd2l0aG91dCBhbgotYXBwbGljYXRpb24gZGV2ZWxvcGVyIGhhdmluZyB0byBhbnRpY2lwYXRlIGZsZXhpYmlsaXR5IGEgcHJpb3JpLiAgU1dJRwotaGFzIGVuYWJsZWQgb3VyIGN1c3RvbWVycyB0byBpbnRlcmFjdCB3aXRoIG91ciB0b29sa2l0cyBpbiBmdW5kYW1lbnRhbGx5Ci1uZXcgd2F5cy4KLTxwPgotU2V2ZXJhbCB5ZWFycyBhZ28gKEkgYmVsaWV2ZSB3ZSBkaXNjdXNzZWQgdGhpcyBzdHVmZiB3YXkgYmFjayBpbiAxOTk0Ci07LSksIEkgY3JlYXRlZCBhIHNldCBvZiBDIHByZXByb2Nlc3NvciBtYWNyb3MgdGhhdCBkaWQgU1dJRy1saWtlCi10aGluZ3MuICBJdCB3YXMgYSB2ZXJ5IHRlZGlvdXMgcHJvY2VzcywgbWFraW5nIGl0IGRpZmZpY3VsdCB0byBmb2xsb3cKLWNoYW5nZXMgdG8gYW4gZXZvbHZpbmcgQVBJLCBidXQgaXQgd2FzIHVzZWZ1bCBmb3IgcHJvb2Ytb2YtY29uY2VwdC4gCi1XaGVuIFNXSUcgMS4xQjEgY2FtZSBvdXQgaW4gT2N0b2JlciwgSSB3YXMgZ2VuZXJvdXNseSBnaXZlbiBhIFImYW1wO0QgYnVkZ2V0Ci10byByZWltcGxlbWVudCBteSBwcm9qZWN0IGluIFNXSUcuICBUaGUgcHJvamVjdCBoYXMgYmVlbiBhIHJlc291bmRpbmcKLXN1Y2Nlc3MhICAKLQotPGhyPgotPHA+Ci1Kb25haCBMZWUgKGpvbmFoQG1lbGFiLnVhZnNvZS5hbGFza2EuZWR1KQotCi08cD4KLVtXZSdyZSB1c2luZyBTV0lHIGZvcl0gd3JhcHBpbmcgdXAgZW5naW5lZXJpbmcgYXBwbGljYXRpb25zIHVzaW5nCi1maW5pdGUgZWxlbWVudCBtZXRob2QgaW5jbHVkaW5nIHByZS0gYW5kIHBvc3QtcHJvY2Vzc2luZy4gTXkgcHJvZ3JhbQotaXMgc29tZXdoYXQgZ2VuZXJhbCBhbmQgaXMgdXNlZCB0byBzb2x2ZSBwcm9ibGVtcyBmb3IgZW5naW5lZXJpbmcKLW1hdGVyaWFscy0tbWV0YWxzLCBwb2x5bWVycyBhbmQgaWNlLS0gdW5kZXJnb2luZyBwbGFzdGljIChwZXJtYW5lbnQpCi1kZWZvcm1hdGlvbnMuIEl0J3MgbWFpbmx5IHVzZWQgZm9yIHJhcGlkIHByb3RvdHlwaW5nLCBkZXZlbG9wbWVudCBhbmQKLXRlc3RpbmcuIFRoZSBjb2RlIHJ1bnMgb24gd29ya3N0YXRpb25zLCBDcmF5IFktTVBzIGFuZCBDcmF5IFQzRSAod2hlbgotSSBnZXQgdGhlcmUuLi4gIHRoYXQgaXMpLgotCi08aHI+Ci08cD5Kb2R5IFdpbnN0b24gKGpvZHlAc2Njc2kuY29tKSAKLQotPHA+Ci0KLUkgaGF2ZSB1c2VkIFNXSUcgdG8gd3JhcCBhbiBBUEkgdGhhdCBjb250cm9sbGVkIHR3byBzdGVwcGVyIG1vdG9ycyBhbmQKLWEgQ0NEIGNhbWVyYSBvbiBhIExpbnV4IHN5c3RlbSB0aGF0IGdhdGhlcmVkIHJlYWwgdGltZSBpbWFnZSBkYXRhLiAgSW4KLVdpbmRvd3MsIEkgd3JhcHBlZCBhbiBhcHBsaWNhdGlvbidzIEMrKyBBUEkgYW5kIHVzZWQgU1dJRyB0byBlbWJlZCBhCi1QeXRob24gKHB5d2luKSBpbnRlcnByZXRlciBpbnRvIHRoZSBDKysgYXBwbGljYXRpb24uICBJIGFsc28gdXNlZCBTV0lHCi10byB3cmFwIGEgRk9SVFJBTiBBUEkgdGhhdCB3YXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBkYXRhIGludG8gYQotY3VzdG9tIGRhdGEgYmFzZS4gIAotPHA+Ci1TV0lHIGhhcyBhbGxvd2VkIG1lIHRvIG1vdmUgdGhlIHRpbWUgY3JpdGljYWwgY29kZSBpbnRvIEMsIEMrKywgb3IKLUZPUlRSQU4gd2hpbGUgaGF2aW5nIHRoZSBhcHBsaWNhdGlvbiBiZWluZyBjb250cm9sbGVkIGJ5IFB5dGhvbi4gIEkKLWNhbiBxdWlja2x5IGVtYmVkIGFuIGludGVycHJldGVyIGludG8gYW4gYXBwbGljYXRpb24uCi0KLTxocj4KLTxwPgotUGV0ZXIgTGlzdGVyIChwLmxpc3RlckBjcmFuZmllbGQuYWMudWspPGJyPgotCi08cD4KLUknbSB1c2luZyBbU1dJR10gZm9yIGEgUGVybCBzY3JpcHRhYmxlIHZlcnNpb24gb2YgVmFuIEphY29ic29uJ3MgbGlicGNhcAotcGFja2V0IGNhcHR1cmUgbGlicmFyeS4gSSBjYW4gbm93IHVzZSBQZXJsIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8KLXByb2Nlc3MgcGFja2V0cyBvbiB0aGUgZmx5LiBNeSBtYWluIHJlYXNvbiBpcyB0byBleHRyYWN0IGluZm9ybWF0aW9uCi1mcm9tIEFSUCBwYWNrZXRzIGFuZCBhdXRvbWF0aWNhbGx5IG1haW50YWluIG91ciBkYXRhYmFzZSBvZiBJUC9NQUMKLWFkZHJlc3MgbWFwcGluZ3MgZGlyZWN0bHkgZnJvbSBwZXJsIHJhdGhlciB0aGFuIGhhY2tpbmcgdGhlIG91dHB1dCBvZgotYXJwd2F0Y2ggb3IgdGNwZHVtcC4KLQotPGhyPgotPHA+Ci1IYXJhbGQgU2luZ2VyIChzaW5nZXJAaXRsLmF0ci5jby5qcCkKLQotPHA+Ci1bV2UgYXJlIHVzaW5nIFNXSUcgZm9yXSB3cmFwcGluZyBDIGxpYnJhcmllcyAgdG8gUHl0aG9uIGZvciBzcGVlY2ggcmVjb2duaXRpb24gcmVzZWFyY2gKLWF0IEFUUiBJbnRlcnByZXRpbmcgVGVsZWNvbW11bmljYXRpb25zIExhYm9yYXRvcmllcy4KLTxwPgotV2UgYXJlIHdvcmtpbmcgaW4gYSBtdWx0aS12ZW5kb3IgZW52aXJvbm1lbnQgKEhQLVVYLCBPU0YxLCBMaW51eCwKLVN1bk9TLCBTb2xhcmlzKSBhbmQgd3JpdGluZyBuZXcgYXBwbGljYXRpb25zIGhhcyBiZWNvbWUgdmVyeSB0ZWRpb3VzLgotVGhlcmVmb3JlLCB3ZSBkZWNpZGVkIHRvIGVtcGxveSBweXRob24sIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIHdlIHdvdWxkCi1saWtlIHRvIGhhdmUgYWNjZXNzIHRvIG91ciBzaWduYWwgcHJvY2Vzc2luZyBsaWJyYXJpZXMgZXRjLiB0aGF0IHdlcmUKLWFuZCBhcmUgc3RpbGwgd3JpdHRlbiBpbiBDLgotPHA+Ci1UaGUgYWR2YW50YWdlcyBvZiB1c2luZyBQeXRob24gYmVjb21lIG1vcmUgZXZpZGVudCBldmVyeSBkYXkuIEZvcgotZXhhbXBsZSwgaXQgd2FzIGZhaXJseSBlYXN5IHRvIHdyaXRlIGEgR1VJIHVzaW5nIHB5dGhvbi90ay4gV2UgYXJlCi11c2luZyB0aGlzIG5vdyBmb3IgaW50ZXJhY3RpdmUgZXJyb3IgYW5hbHlzaXMuIEEgdHlwaWNhbCBzY2VuYXJpbyBpcwotbGlrZSB0aGlzOgotCi08dWw+Ci08bGk+IGF1ZGlvIGRhdGEgaXMgY29sbGVjdGVkIHZpYSBtaWNyb3Bob25lL0FEIChpbiBQeXRob24pIGFuZCBzZW50IHRvIHRoZQotcmVjb2duaXplciBmcmFtZSBieSBmcmFtZS4gCi0KLTxsaT4gdGhlIHJlY29nbml6ZXIgKEMgY29kZSkgbWFrZXMgYSBkZWNpc2lvbiBhYm91dCBzcGVlY2ggZW5kcG9pbnRpbmcgYW5kCi1vbmNlIGl0IGhhcyBkaXNjb3ZlcmVkIGVuZCBvZiB1dHRlcmFuY2UgZG9lcyBhIGNhbGxiYWNrIHRvIHRoZQotYXBwbGljYXRpb24gKHB5dGhvbi90aykgd2l0aCBhIHdvcmQgbGF0dGljZSBhcyByZXN1bHQuCi0KLTxsaT4gdGhpcyB3b3JkIGxhdHRpY2UgaXMgbm93IGRpc3BsYXllZCBmb3IgdGhlIHVzZXIgaW4gcHl0aG9uL3RrLiAKLQotPGxpPiB0aGUgdXNlciBjYW4gbm93IGludGVyYWN0aXZlbHkgcmVzY29yZSBwYXJ0IG9mIHRoZSBsYXR0aWNlcywgbG9vayBhdAotdGhlIGRldGFpbGVkIGFjb3VzdGljIGFuZCBsYW5ndWFnZSBtb2RlbCBzY29yZXMsIGxpc3RlbiB0byBwYXJ0cyBvZgotdGhlIHV0dGVyYW5jZSwgZXRjLgotPC91bD4KLTxwPgotU1dJRyBoZWxwcyB1cyBpbiB0YWtpbmcgYXdheSBwYXJ0IG9mIHRoZSBlcnJvci1wcm9uZSB0YXNrIG9mIG1ha2luZwotdGhlIEMgcm91dGluZXMgYWNjZXNzaWJsZSBmcm9tIHB5dGhvbiBhbmQgaGFzIGNvbnNpZGVyYWJseSBpbXByb3ZlZAotb3VyIGVmZmljaWVuY3kuCi0KLTxocj4KLTxwPgotRG9taW5pcXVlIER1bW9udCAoZG9taUBzczdzZXJ2LmdyZW5vYmxlLmhwLmNvbSkKLTxwPgotSSdtIHVzaW5nIFNXSUcgdG8gZ2VuZXJhdGUgYSBwZXJsNSBBUEkgb24gdG9wIG9mIEhQJ3MgT3BlbkNhbGwgVENBUAotQVBJLiBUQ0FQIGlzIHRoZSB0b3AgcHJvdG9jb2wgbGF5ZXIgb2YgSFAncyBTUzcgc3RhY2sgb2YgdGVsZWNvbSAKLXByb3RvY29sLiBUaGUgcGVybDUgQVBJIGRldmVsb3BlbW50IGVmZm9ydCBpcyBhIHBhcnQgb2YgdGhlIHN5c3RlbWF0aWMKLXRlc3RpbmcgYXBwcm9hY2ggd2UncmUgaW1wbGVtZW50aW5nIGluIHRoZSBkaXZpc2lvbi4gCi08cD4KLVRoZSB1c3VhbCB3YXkgd2FzIHRvIHdyaXRlIHRlc3QgcHJvZ3JhbXMKLWluIEMuIFRoZSBtYWluIGRyYXdiYWNrIGJlaW5nIHRoYXQgZGV2ZWxvcGluZyBhbmQgcnVubmluZyB0aGUgdGVzdHMKLWNvbnN1bWVzIGEgbG90IG9mIHRpbWUuIAotPHA+Ci1Ob3cgdGhlIGdvYWwgaXMgdG8gd3JpdGUgYWxsIChvciBhdCBsZWFzdCBtb3N0IG9mKSB0aGUgdGVzdCBpbiBwZXJsCi1hbGxvd2luZyBhIGZhc3RlciBjeWNsZSB0aW1lIGJldHdlZW4gbW9kaWZ5aW5nIHRoZSBBUEkgYW5kIHRlc3RpbmcKLWl0LiAoV2UnbGwgYWxzbyBiZSBhYmxlIHRvIGRlYnVnIGZhc3RlciB0aGUgdGVzdCBwcm9ncmFtcykuCi08cD4KLVBlcmwncyBwb3dlciBhbHNvIGVuYWJsZXMgdXMgdG8gd3JpdGUgdGVzdCB1c2luZyBvbyBtZXRob2RvbG9neQotKGFsdGhvdWdoIHRoZSBBUEkgaXMgc3RyaWN0bHkgcHJvY2VkdXJhbCksIHRodXMgd2UgY2FuIGVhc2lseSBkZXZlbG9wIAotY29tcGxleCB0ZXN0IHNjZW5hcmlvcy4KLTxwPgotSG9wZWZ1bGx5IChpLmUuIGlmIHdlIGhhdmUgc29tZSBzcGFyZSB0aW1lKSwgdGhlIG5leHQgc3RlcCB3aWxsIGJlIHRvCi1jb21iaW5lIFRrIHdpdGggUGVybCBhbmQgU1dJRyBzbyB3ZSdsbCBiZSBhYmxlIHRvIG1vbml0b3Igd2l0aCBhIHVzZXIKLWZyaWVuZGx5IGludGVyZmFjZSB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHRlc3Qgc3VpdGUuCi0KLTxocj4KLTxwPkRhbmllbCBNaWNoZWxzb24gKERhbmllbC5NaWNoZWxzb25Ac21oaS5zZSkKLQotPHA+Ci1BIGNvbGxlZ3VlIGFuZCBJIGFyZSB1c2luZyBTV0lHIGZvciB0d28gcHVycG9zZXMsIGJvdGggb2Ygd2hpY2gKLWNlbnRyZSBhcm91bmQgdGhlIGNyZWF0aW9uIG9mIGEgUHl0aG9uLWJhc2VkIGVudmlyb25tZW50IGZvciBhbmFseXNpcwotYW5kIHZpc3VhbGl6YXRpb24gb2YgZGF0YSBmcm9tIHRoZSBTd2VkaXNoIG5hdGlvbmFsIHdlYXRoZXIgcmFkYXIKLW5ldHdvcms6Ci08dWw+Ci08bGk+IGludGVyZmFjaW5nIG9sZCBjb2RlCi08bGk+IGludGVyZmFjaW5nIG5ldywgcGVyZm9ybWFuY2UgY3JpdGljYWwsIGNvZGUuCi08L3VsPgotPHA+Ci1XZSBoYXZlIGEgY291cGxlIG9mIG90aGVyIGNvbGxlZ3VlcywgYWxzbyBhdCBTTUhJIFImYW1wO0QsIHdobyBhcmUgd29ya2luZwotaW4gc2F0ZWxsaXRlLWJhc2VkIHJlbW90ZSBzZW5zaW5nIGFjdGl2aXRpZXMgYW5kIHdobyB3aWxsIGJlIHN0YXJ0aW5nIHRvCi11c2UgU1dJRyBpbiB0aGUgbmVhciBmdXR1cmUgZm9yIHRoZWlyIHB1cnBvc2VzLgotCi08aHI+Ci08cD5Sb2dlciBCdXJuaGFtIChyYnVybmhhbUBjcmktaW5jLmNvbSkKLQotPHA+Ci1UaGFua3MgYWdhaW4gZm9yIFNXSUcuLi4gSXRzIGZ1biwgYWxsb3dzIGdyZWF0IHByb2R1Y3Rpdml0eSB3aGlsZSAKLWF2b2lkaW5nIG11Y2ggdGVkaXVtLi4uCi08cD4KLVRoZSBjdXJyZW50IGFwcGxpY2F0aW9uICh0aGVyZSB3aWxsIGJlIG1hbnkgc3Bpbi1vZmZzL3ZhcmlhdGlvbnMpIGlzIAotaW4gcG9sYXJpemF0aW9uIG1pY3Jvc2NvcHkuICBXZSBtYW51ZmFjdHVyZSBlbGVjdHJvbmljYWxseSAKLWNvbnRyb2xsYWJsZSByZXRhcmRlciBwbGF0ZXMsIGFuZCBhbG9uZyB3aXRoIGEgc2NpZW50aXN0IGF0IHRoZSAKLU1hcmluZSBCaW9sb2dpY2FsIExhYiBpbiBXb29kcyBIb2xlIGhhdmUgZGV2ZWxvcGVkIGFuIGFsZ28vbWV0aG9kIAotdGhhdCBhbGxvd3MgdXMgdG8gdmlzdWFsaXplIGEgc2FtcGxlJ3MgcmV0YXJkYW5jZSAoZGlyZWN0aW9uIGFuZCAKLW1hZ25pdHVkZSkgb3ZlciB0aGUgd2hvbGUgaW1hZ2UuICBDb252ZW50aW9uYWwgbWV0aG9kcyBhbGxvdyB5b3UgdG8gCi1zZWUgdGhpcyBzdHJ1Y3R1cmUgb25seSBhbG9uZyBvbmUgYXhpcyBhdCBhIHRpbWUuLi4gIFRoZSBtYWluIHRvb2xzIAotSSdtIHVzaW5nIGFyZSBQeXRob24vVGtpbnRlci9QSUwvTnVtUHkvU1dJRy4KLTxwPgotU28sIEkndmUgdXNlIFNXSUcgdG86Ci08dWw+Ci08bGk+IFdyYXAgYSBjb21tZXJjaWFsIHNlcmlhbCBjb21tdW5pY2F0aW9ucyBETEwuCi08bGk+IFdyYXAgYSBjb21tZXJjaWFsIGZyYW1lIGdyYWJiZXIgaW50ZXJmYWNlCi08bGk+IEFmdGVyIHByb3RvdHlwaW5nIGluIFB5dGhvbiwgSSBtb3ZlIGNvbXB1dGUgaW50ZW5zaXZlIHJvdXRpbmVzIAotICAgICBpbnRvIERMTCdzLgotPC91bD4KLU91ciBhcHBzIGFyZSBydW5uaW5nIHVuZGVyIFdpbjk1LiAgSSB0aG91Z2h0IGl0IHdhcyBwcmV0dHkgY29vbCB0byBiZSAKLWFibGUgdG8gY29udHJvbCBhIGZyYW1lIGdyYWJiZXIsIGRpc3BsYXkgbGl2ZS9hY3F1aXJlZCBpbWFnZXMsIGFsbCAKLWZyb20gd2l0aGluIFB5dGhvbiwgd2l0aGluIHRoZSBzYW1lIGRheSBJIHJlY2VpdmVkIHRoZSBmcmFtZSBncmFiYmVyIAotU0RLLCBuZXZlciBoYXZpbmcgZGVhbHQgd2l0aCBzdWNoIGhhcmR3YXJlIGJlZm9yZSEKLQotPGhyPgotPHA+Ci1TaW1vbiBHaWJzb24gKGdpYnNvbkBkc3RjLnF1dC5lZHUuYXUpCi08cD4KLQotSSBoYXZlIGJlZW4gdXNpbmcgU1dJRyB0byBjcmVhdGUgYSBQeXRob24gaW50ZXJmYWNlIGZvciBvdXIKLXByb3RvdHlwZSBpbXBsZW1lbnRhdGlvbiBvZiBHU1NBUEkuIFRoaXMgaXMgYmVpbmcgZG9uZSBzbwotdGhhdCB3ZSBjYW4gaW5jb3Jwb3JhdGUgc2VjdXJpdHkgaW50byB0aGUgSGVjdG9yIHByb2plY3QgaGVyZQotYXQgRFNUQy4gSXQgYWxzbyBtZWFucyB0aGF0IEkgY2FuIHdyaXRlIFB5dGhvbiBhcHBsaWNhdGlvbgotcHJvZ3JhbW1lcy4gQWxzbyBub3cgd2UgaGF2ZSBhIHN0YW5kYXJkIGludGVyZmFjZSB0byBHU1NBUEkKLWFuZCBhbnkgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGFibGUgdG8gYmUgcGx1Z2dlZCBpbi4KLTxwPgotSGVjdG9yIGlzIGRlc2NyaWJlZCBpbiBhbiBhcnRpY2xlIGluIHRoZSBKYW51YXJ5L0ZlYnJ1YXJ5Ci0xOTk3IC0gRGlzdHJpYnV0ZWQgT2JqZWN0cyA8YSBocmVmPSJodHRwOi8vd3d3LmRkai5jb20vZGRzYmsvMTk5Ny8xOTk3LjAxL2luZGV4Lmh0bSI+RHIuIERvYmIncyBTb3VyY2Vib29rPC9hPi4KLQotPGhyPgotPHA+Ci1NYXJrIEhhbW1vbmQgKE1IYW1tb25kQHNraXBwaW5ldC5jb20uYXUpCi0KLTxwPgotCi1JJ20gdXNpbmcgW1NXSUddIHRvIHdyaXRlIGEgY29tbWVyaWNpYWwgYXBwbGljYXRpb24sIHdoaWNoIHJ1bnMgYXMgYW4gTlQKLXNlcnZpY2UuICBJdCB1c2VzIHRoZSBDT00gZXh0ZW5zaW9ucyB0byB0YWxrIG5hdGl2ZSBNQVBJIHRvIGV4Y2hhbmdlCi1zZXJ2ZXIsIHRoZSBzZXJ2aWNlIGV4dGVuc2lvbnMgdG8gcnVuIHVuYXR0ZW5kZWQgb24gTlQsIGFuZCB0aGUgcGlwZSwgZmlsZQotYW5kIGV2ZW50IG1vZHVsZXMgdG8gbWFuYWdlIHRoZSBzZXJ2aWNlIGNvbnRyb2wgbWVzc2FnZXMgYW5kIG5hbWVkIHBpcGUKLWNvbm5lY3Rpb25zIGZyb20gY2xpZW50cy4gIEFsbCBtb2R1bGVzIG5hbWVkIGFib3ZlIHdlcmUgZ2VuZXJhdGVkIGJ5IFNXSUcuIAotVGhlIENPTSBleHRlbnNpb25zIHdpbGwgYWxsb3cgKG9uY2UgdGhlIC5pIGZpbGUgaXMgdXAgdG8gaXQgOi0pIGFueSBuYXRpdmUKLUNPTSBpbnRlcmZhY2UgKGllLCBub3QgSURpc3BhdGNoIChlZywgVkIvV29yZC9FeGNlbCkgYmFzZWQpIHRvIGJlIHN1cHBvcnRlZAotYnkgUHl0aG9uLgotCi08aHI+Ci08cD4gTWljaGFlbCBCZWxsIChtaWNoYWVsYkBnb2xkLm5ldC5hdSkKLQotPHA+Ci1JJ3ZlIHVzZWQgU1dJRyBvbiBhIExpbnV4IHBsYXRmb3JtIHRvIGNyZWF0ZSBQeXRob24gbW9kdWxlcyBmb3IKLWdyYXBoaW5nIGFuZCBkYXRhYmFzZSBhY2Nlc3MuCi08cD4KLVRoZSBQR1BMT1QgR3JhcGhpY3MgU3Vicm91dGluZSBMaWJyYXJ5IGlzIGEgRm9ydHJhbiBsaWJyYXJ5IGJ5IFRpbQotUGVhcnNvbiAodGpwQGFzdHJvLmNhbHRlY2guZWR1KS4gSSB1bmRlcnN0YW5kIGl0IGlzIG9mdGVuIHVzZWQgYnkKLWFzdHJvbm9tZXJzLiAgSXQgbWF5IGFsc28gYmUgYnVpbHQgaW50byBhIEMgbGlicmFyeS4KLTxwPgotSSB1c2VkIFNXSUcgdG8gd3JhcCB0aGUgQyBsaWJyYXJ5IHdyYXBwaW5nIHRoZSBGb3J0cmFuIGxpYnJhcnkgKCEpCi1pbnRvIGEgUHl0aG9uIG1vZHVsZSwgdXNpbmcgc29tZSBzdHJhaWdodGZvcndhcmQgdHlwZW1hcHMgdG8gY29udmVydAotb25lIGFuZCB0d28gZGltZW5zaW9uYWwgUHl0aG9uIE51bWVyaWMgYXJyYXlzIGludG8gdGhlIGFwcHJvcHJpYXRlCi1wb2ludGVycy4gIEkgaGF2ZW4ndCBtZXRob2RpY2FsbHkgdGVzdGVkIHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHksIGJ1dAotZXZlcnl0aGluZyBJIHRyaWVkIHdvcmtzIGp1c3QgZmluZS4KLTxwPgotSSd2ZSBhbHNvIHVzZWQgU1dJRyB0byB3cmFwIHVwIGEgbGlicmFyeSBvZiBGb3J0cmFuIHN1YnJvdXRpbmVzCi1kZXZlbG9wZWQgd2l0aGluIHRoZSBXZXN0ZXJuIEF1c3RyYWxpYW4gRGVwYXJ0bWVudCBvZiBFbnZpcm9ubWVudGFsCi1Qcm90ZWN0aW9uIHRvIG1hbmFnZSBkYXRhYmFzZXMgb2YgdGltZSBzZXJpZXMgbWV0ZW9yb2xvZ2ljYWwgYW5kIGFpcgotcXVhbGl0eSBkYXRhLiAgSSB1c2VkIFNXSUcgdG8gZ2VuZXJhdGUgYSBzaW1wbGUgc2hhZG93IGNsYXNzIHdoaWNoIEkKLXRoZW4gZXh0ZW5kZWQgZnVydGhlciB0byBtYWtlIHRoZSBpbnRlcmZhY2UgbmljZXIuCi08cD4KLVRoZSBvcmlnaW5hbCBsaWJyYXJ5IHByb3ZpZGVkLCBmb3IgaW5zdGFuY2UsIHN1YnJvdXRpbmVzIG9wZW5kYigpLAotd3JpdGRiKCksIHJlYWRkYigpIGFuZCBjbG9zZGIoKS4gIE15IG1vZHVsZSwgZXBhZGIucHksIHByb3ZpZGVzIGEKLWRhdGFiYXNlIGNsYXNzLCBlcGFkYi5EQiwgd2hpY2ggaXMgaW5zdGFudGlhdGVkLCBkPWVwYWRiLkRCKCkuICBUaGUKLWRhdGFiYXNlIGluc3RhbmNlIHRoZW4gcHJvdmlkZXMgbWV0aG9kcyBkLm9wZW4oKSwgZC5yZWFkKCksIGQud3JpdGUoKQotYW5kIGQuY2xvc2UoKSwgcmV0dXJuaW5nIGRhdGEgYXMgUHl0aG9uIGxpc3RzIGFuZCBhcnJheXMuCi08cD4KLUknbSBwYXJ0aWN1bGFybHkgcGxlYXNlZCB0aGF0IEkgbWFuYWdlZCB0byBkbyB0aGVzZSB0aGluZ3Mgd2l0aCBteQotcmVhZGluZyBvbmx5IGtub3dsZWRnZSBvZiBDLCBhbmQgbG90cyBvZiBjdXR0aW5nIGFuZCBwYXN0aW5nLgotCi08aHI+Ci08cD4KLVNvZXJlbiBIZW5rZWwgKHNvZXJlbkBobmkudW5pLXBhZGVyYm9ybi5kZSkKLTxwPgotV2UgYXJlIGN1cnJlbnRseSBpbiB0aGUgcHJvY2VzcyBvZiByZWRldmVsb3BpbmcgT09QVVMsIGEgc3lzdGVtIGZvcgotbW9kZWxpbmcgcGxhbnQgc3lzdGVtcyBhbmQgZ2VuZXJhdGUgcGxhbnQgY29udHJvbCBzb2Z0d2FyZSBmcm9tIGEgbW9kZWwuCi0oRG9uJ3QgYXNrIHdoYXQgT09QVVMgc3RhbmRzIGZvciAtaXQncyBhIEdlcm1hbiBhY3JvbnltLikgV2UgZGVjaWRlZCB0byAKLXJlaW1wbGVtZW50IGl0cyB1c2VyIGludGVmYWNlIHVzaW5nIFRjbC9Uay4gT09QVVMgcHV0cyBpdHMgbW9kZWxzCi1pbnRvIGFuIE9PREJNUywgbmFtZWx5IFBPRVQuIFNvIHdlIG5lZWRlZCBhbiBpbnRlZ3JhdGlvbiBvZiBQT0VUCi0od2hpY2ggaXMgdGlnaHRseSBjb3VwbGVkIHRvIEMrKykgd2l0aCBUY2wvVGssIGFuZCB3ZSd2ZSBzdWNjZXNzZnVsbHkKLWRvbmUgdGhhdCB3aXRoIFNXSUcuCi0KLTxocj4KLTxwPgotUGV0ZXIgQS4gVGlua2VyIChwYXRpbmtlckBtc21haWw0LmhhYy5jb20pCi08cD4KLVdlJ3JlIHVzaW5nIFNXSUcgdG8gImdsdWUiIFRjbC9UayB0byBjdXN0b20gYW5kIHRoaXJkLXBhcnR5IGxpYnJhcmllcy4gSW4KLXBhcnRpY3VsYXIsIFNXSUcgcHJvdmlkZXMgYW4gZWxlZ2FudCBtZWFucyBmb3IgY29udHJvbGxpbmcgU2Vuc2U4Ci1Db3Jwb3JhdGlvbidzIFdvcmxkVG9vbEtpdCAoV1RLKSB2aXJ0dWFsIGVudmlyb25tZW50IGRldmVsb3BtZW50IHN5c3RlbSBmcm9tIGEKLVRrIEdVSS4gVGhlIHJlc3VsdCBpcyBoaWdobHkgcG9ydGFibGUgY29kZSB0aGF0IGlzCi1pbmRlcGVuZGVudCBvZiBXVEsncyBwcm9wcmlldGFyeSBHVUkgeWV0IGFsbG93cyBhY2Nlc3MgdG8gdmlydHVhbGx5IGFsbCBXVEsKLWZ1bmN0aW9ucyBmcm9tIGEgVGNsIHNjcmlwdCBhbmQvb3IgYSBUayBHVUkuIFRoaXMgYXBwcm9hY2ggaXMKLWJlaW5nIHVzZWQgaW4gYSB2YXJpZXR5IG9mIHByb2plY3RzIGludm9sdmluZyBhZHZhbmNlZCAzRCB2aXN1YWxpemF0aW9uCi1vbiBhIHZhcmlldHkgb2YgaW1jb21wYXRpYmxlIHN5c3RlbXMuCi0KLTxocj4KLTxwPgotUGV0ZXItUGlrZSBTbG9hbiAocHBzbG9hbkBjcy51dGFoLmVkdSkKLTxwPgotSSBoYXZlIGJlZW4gdXNpbmcgU1dJRyBmb3Igc2V2ZXJhbCBwcm9qZWN0cywgbW9zdGx5IHRvIHN0cmVhbWxpbmUKLXdvcmtpbmcgd2l0aCBPcGVuR0wgdW5kZXIgVGNsL1RrLiAgRXhhbXBsZXMgYXJlIGEgdGltZS1jcml0aWNhbAotZnJhbWV3b3JrIGZvciB2aWV3aW5nIEx1bWlncmFwaHMgKGJhc2ljYWxseSBhIGRpZ2l0YWwgaG9sb2dyYW0pIGFuZCBhCi1wcm9vZiBvZiBjb25jZXB0IGFwcGxpY2F0aW9uIGZvciBvcHRpbWl6aW5nIHRleHR1cmUgY29vcmRpbmF0ZXMgYmFzZWQKLW9uIHJlbGF0aXZlIGltcG9ydGFuY2UgKGRldGVybWluZWQgYnkgYW5hbHl6aW5nIHRoZSBleGlzdGluZyB0ZXh0dXJlCi1hbmQgdXNlciBzcGVjaWZpY2F0aW9uLikgIFVzaW5nIFNXSUcgaGFzIGRyYW1hdGljYWxseSByZWR1Y2VkIG15Ci1kZXZlbG9wbWVudCB0aW1lIGFsbG93aW5nIG1lIHRvIGRldmVsb3AgY29kZSBhbmQgZGVidWcgc3RhdGUgaW4gYW4KLWludGVycHJldGVkIGVudmlyb25tZW50IChjdXJyZW50bHkgVGNsLCBidXQgSSB0aGluayBJIGFtIGdvaW5nIHRvIG1vdmUKLXRvIFB5dGhvbikuCi0KLTxocj4KLTxwPgotQ2hyaXMgTXllcnMgKG15ZXJzQGJlYW10ZWNoLmNvbSkKLTxwPgotV2UgYXQgQmVhbSBUZWNobm9sb2dpZXMsIEluYy4gaGF2ZSB1c2VkIFNXSUcgdG8gYmVnaW4gZGV2ZWxvcGluZyBhbgotaW50ZXJwcmV0ZWQgUHl0aG9uIGludGVyZmFjZSB0byBvdXIgUERFU29sdmUgbGlicmFyeS4gIFBERVNvbHZlIGlzIGEKLUMrKyBjbGFzcyBsaWJyYXJ5IGZvciBmb3JtdWxhdGluZyBhbmQgc29sdmluZyBwYXJ0aWFsIGRpZmZlcmVudGlhbAotZXF1YXRpb25zICh1c2luZyBlaXRoZXIgZmluaXRlIGRpZmZlcmVuY2UgbWV0aG9kcyBvciBmaW5pdGUgZWxlbWVudAotbWV0aG9kcyksIGFuZCBtYWtlcyB1c2Ugb2YgT08gdGVjaG5vbG9neSB0byBwcmVzZW50IGEgaGlnaC1sZXZlbAotc3ltYm9saWMgaW50ZXJmYWNlIHRvIHRoZSBwcm9ncmFtbWVyLiAgVGhpcyBtYWtlcyB0aGUgZGVzY3JpcHRpb24gb2YKLVBERS1iYXNlZCBwcm9ibGVtcyBjb25jaXNlLCBhbmQgZW5hYmxlcyB0aGUgZW1iZWRkaW5nIG9mIFBERS1iYXNlZAotbW9kZWxzIGluIGxhcmdlciBjb21wdXRhdGlvbmFsIGZyYW1ld29ya3MgKGUuZy4sIHRvIGRvIFBERS1iYXNlZAotZGVzaWduIG9wdGltaXphdGlvbiBvciBjb3VwbGVkIFBERS1iYXNlZCBzeXN0ZW1zKS4gIFNXSUcgaGFzIGFsbG93ZWQKLXVzIHZlcnkgcXVpY2tseSB0byBkZXZlbG9wIGEgcHJvdG90eXBlIFB5dGhvbiBpbnRlcmZhY2UgdG8gdGhhdAotbGlicmFyeS4gIFN1Y2ggYW4gaW50ZXJmYWNlIGhvbGRzIHRoZSBwcm9taXNlIG9mOiAoMSkgYWxsb3dpbmcgZXZlbgotbW9yZSByYXBpZCBwcm90b3R5cGluZyBvZiBtb2RlbHMsICgyKSBkeW5hbWljIGZvcm11bGF0aW9uIG9mIG1vZGVscwotYW5kIHNvbHV0aW9uIG1ldGhvZHMsIGFuZCAoMykgYSBtZXRob2QgZm9yIGNvbnZlbmllbnRseSBpbnRlZ3JhdGluZwotUERFU29sdmUgd2l0aCBvdGhlciBwYWNrYWdlcyAoaS5lLiwgdGhyb3VnaCB0aGUgUHl0aG9uIHN1YnN0cmF0ZSkuCi1NeSBob3BlIGlzIHRvIG1ha2UgYSBQeXRob24tZW5hYmxlZCBQREVTb2x2ZSBhIHRvb2wgZm9yIFBERXMgc29tZXRoaW5nCi1saWtlIHdoYXQgTWF0bGFiIHByb3ZpZGVzIGZvciBsaW5lYXIgYWxnZWJyYSwgaS5lLiwgYSBoaWdoLWxldmVsLAotaW50ZXJwcmV0ZWQgZW52aXJvbm1lbnQgZm9yIHJhcGlkIHByb3RvdHlwaW5nIGFuZCBpbnRlcmFjdGl2ZQotZXhwbG9yYXRpb24sIHdpdGggYW4gZW1iZWRkZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgZm9yIHNjcmlwdGluZwotY29tcGxleCBjb2Rlcy4KLQotPHA+Ci1BbmQgd2hpbGUgSSBoYXZlIGJlZW4gbG9va2luZyBmb3IgYSB3aGlsZSBmb3IgYSBwb3dlcmZ1bCBhbmQKLWV4dGVuc2libGUgaW50ZXJwcmV0ZWQgbGFuZ3VhZ2UgZm9yIHVzZSBhcyBhIGZyb250LWVuZCB0byBjb21waWxlIGNvZGVzCi0od2hpY2ggUHl0aG9uIGlzKSwgU1dJRyBoYXMgbWFkZSB0aGUgaW50ZXJmYWNpbmcgb2YgdGhhdCBjb2RlIHZhc3RseQotZWFzaWVyIHRoYW4gaXQgd291bGQgaGF2ZSBiZWVuIG90aGVyd2lzZS4gIFdoaWxlIHdlIGFyZSBzdGlsbCBpbiB0aGUKLXByb3RvdHlwaW5nIHN0YWdlcyBvZiB0aGlzIG92ZXJhbGwgYXBwcm9hY2gsIFNXSUcgZW5hYmxlZCB1cyB0byBnZXQgdXAKLWFuZCBydW5uaW5nIHF1aWNrbHkgd2l0aCBhIFB5dGhvbiBpbnRlcmZhY2UgdG8gUERFU29sdmUsIGFuZAotZGVtb25zdHJhdGUgdGhlIHV0aWxpdHkgb2Ygc3VjaCBhbiBhcHByb2FjaCBmb3IgYSBjb21wbGV4IEMrKyBsaWJyYXJ5Ci0oc29tZXRoaW5nIHRoYXQgU1dJRyB3YXMgbm90IG9yaWdpbmFsbHkgZGVzaWduZWQgdG8gcmVhbGx5IHRhY2tsZSkuCi0KLTxocj4KLTxwPgotVmxhZGltaXIgSS5VbG9nb3YgKGdhbmRhbGZAc3RhcnNoaXAuc2t5cG9ydC5uZXQpCi08cD4KLQotU1dJRyBpcyBiZWluZyB1c2VkIHRvIGNyZWF0ZSBhIFB5dGhvbiBpbnRlcmZhY2UgdG8gQ0xJUFMgZXhwZXJ0IHN5c3RlbSBzaGVsbAotaW5zaWRlIG15IGdlbmVyYWwgcmVzZWFyY2ggam9iIHVuZGVyIE9PREJNUyBETkVULiBUaGlzIGV4dGVudGlvbiBtb2R1bGUKLXByb3ZpZGUgZnVsbCBjb250cm9sIGZyb20gUHl0aG9uIGVudmlyb25tZW50IHRvIGV4cGVydCBzeXN0ZW06IENoYW5nZSBhCi1nbG9iYWwgdmFsaWFibGVzLCByZWdpc3RlciBhIGZhY3QsIG1hbmlwdWxhdGlvbiB3aXRoIGFnZW5kYSwgZmFjdCBsaXN0cywKLW1vZHVsZXMsIGZ1bmN0aW9ucywgY2xhc3NlcyBhbmQgaW5zdGFuY2VzLiBZb3UgY2FuIGR5bmFtaWNhbHkgY3JlYXRlIGFuZAotZXhlY3V0ZSBDTElQUyBjb21tYW5kcyB1c2luZyBjbGlwcy5Sb3V0ZUNvbW1hbmQgZnVuY3Rpb24gY2FsbC4gTW9kdWxlCi1pbnRlcmZhY2UgYXJlIHNpbWlsYXIgdG8gQ0xJUFMgQWR2YW5jZWQgQVBJLCB3aG8gZGVzY3JpYmVkIGludG8gQ0xJUFMKLWRvY3VtZW50YXRpb24uIEFsbCBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24sIFB5dGhvbiBjbGFzc2VzIGFyZSBkaXN0cmlidXRlZAotdG9vLiBNb2R1bGUgd2FzIGJlIHRlc3RlZCBvbiBXaW5kb3dzL05UIGFuZCBTVU4gU29sYXJpcyAyLjQgaG9zdCBwbGF0Zm9ybXMsCi1DTElQUyB2ZXJzaW9uOiA2LjA0LCBQeXRob24gdmVyc2lvbiAxLjQuIFRoaXMgbW9kdWxlIGNvbnNpc3QgYWJvdXQgMjcwCi1mdW5jdGlvbnMuIFRoaXMgam9iIHRvb2sgMyBkYXlzIG9mIG15IGpvYiBhdCBvY3RvYmVyIDE5OTcuCi0KLTxocj4KLTxwPgotUGluaG9uZyBDaGVuIChwaGNoZW5iQHRzbWMuY29tKQotPHA+Ci1JIGdvdCBhIHBhZ2UgZm9yCi08YSBocmVmPSJodHRwOi8vd3d3LWNhZC5lZWNzLmJlcmtlbGV5LmVkdS9+cGluaG9uZy9zY3JpcHRFREEiCi0+RURBIGFwcGxpY2F0aW9uczwvYT4KLXVzaW5nIFNXSUcuCi0KLTxocj4KLTxoMz4gVG9vbHMgYW5kIE1vZHVsZXMgPC9oMz4KLVRoZSBmb2xsb3dpbmcgdG9vbHMgYW5kIG1vZHVsZXMgaGF2ZSBiZWVuIHByb2R1Y2VkIHVzaW5nIFNXSUcKLW9yIGFyZSByZWxhdGVkIHRvIFNXSUcuCi0KLTx1bD4KLTxsaT48cD48YSBocmVmPSJodHRwOi8vd3d3LnRoZXN0dWZmLm5ldC9ib2IvcHJvamVjdHMvYmxhZGUiPkJMQURFPC9hPi4gQSB3ZWIgcHVibGlzaGluZyBlbnZpcm9ubWVudC4KLQotPGxpPjxwPjxhIGhyZWY9Imh0dHA6Ly9zdHVkZW50cy5jcy5ieXUuZWR1L35idXRsZXIvam5pL1B5SmF2YS5odG1sIj5QeUphdmE8L2E+LiBQcm92aWRlcwotUHl0aG9uIGFjY2VzcyB0byBKYXZhIG1ldGhvZHMgKEtldmluIEJ1dGxlcikuIAotCi08bGk+PHA+PGEgaHJlZj0iaHR0cDovL3BsYXlncm91bmQuc3VuLmNvbS9+YmhhcmF0L3BpbG90bWdyLmh0bWwiPlBpbG90IE1hbmFnZXI8L2E+LiBIb29rCi15b3VyIFVTIFJvYm90aWNzIFBhbG1QaWxvdCB1cCB0byB5b3VyIFN1biB3b3Jrc3RhdGlvbiAoQmhhcmF0IE1lZGlyYXR0YSkuCi0KLTxsaT48cD4gPGEgaHJlZj0iaHR0cDovL3d3dy5taWMuYXRyLmNvLmpwL35ndWxsaXZlci9XVEsvd3d3Ij5QeVdUSzwvYT4uICBBIFB5dGhvbgotaW50ZXJmYWNlIHRvIHRoZSBXb3JsZFRvb2xLaXQgKGEgdmlydHVhbCByZWFsaXR5IG1vZGVsaW5nIHRvb2xraXQpLiAoUm9iZXJ0byBMb3BleiBHdWxsaXZlcikKLQotPGxpPjxwPiBBIFB5dGhvbiBpbnRlcmZhY2UgdG8KLTxhIGhyZWY9Imh0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L2NyZXcvcm9iaW5kL2luZGV4Lmh0bWwiPkJTRCBEQiAyLjcueDwvYT4gKFJvYmluIER1bm4pLgotCi08bGk+PHA+PGEgaHJlZj0iaHR0cDovL2FsbGR1bm4uY29tL3d4UHl0aG9uL2luZGV4Lmh0bWwiPnd4UHl0aG9uPC9hPi4gQSBQeXRob24gZXh0ZW5zaW9uCi1tb2R1bGUgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHd4V2luZG93cyBHVUkgY2xhc3Nlcy4KLQotPGxpPjxwPiBOZXQtUGNhcC4gIEEgUGVybCBpbnRlcmZhY2UgdG8gdGhlIGxpYnBjYXAgbGlicmFyeSAoUGV0ZXIgTGlzdGVyKS4KLQotPGxpPjxwPiBYMTE6OldjbC4gQSBQZXJsIGludGVyZmFjZSB0byB0aGUgV2lkZ2V0IENyZWF0aW9uIExpYnJhcnkgKEpvZSBCdWVobGVyKS4KLQotPC91bD4KLQotPGhyPgotPGgzPiBPdGhlciBBcHBsaWNhdGlvbiBBcmVhcyA8L2gzPgotCi1UaGVzZSBhcmUgc29tZSBvZiB0aGUgYXBwbGljYXRpb24gYXJlYXMgdGhhdCBJJ3ZlIGhlYXJkIGFib3V0IFNXSUcgYmVpbmcKLXVzZWQgKGJ1dCBkb24ndCBoYXZlIG1hbnkgZGV0YWlscykuCi0KLTx1bD4KLTxsaT4gU2VtaWNvbmR1Y3RvciBDQUQuCi08bGk+IERhdGFiYXNlcy4KLTxsaT4gUmVtb3RlIHNlbnNpbmcuCi08bGk+IFNjaWVudGlmaWMgdmlzdWFsaXphdGlvbiBhbmQgc2ltdWxhdGlvbi4KLTxsaT4gRmluYW5jaWFsIE1vZGVsaW5nLgotPGxpPiBEaXN0cmlidXRlZCBhbmQgcGFyYWxsZWwgY29tcHV0aW5nLgotPGxpPiBEaXN0cmlidXRlZCBvYmplY3RzICh1c2Ugd2l0aCBDT1JCQSkuCi08bGk+IFNvZnR3YXJlIHRlc3RpbmcuCi08L3VsPgotCi08aHI+Ci08aDM+IEhvdyBhcmUgeW91IHVzaW5nIFNXSUc/IDwvaDM+Ci0KLUlmIHlvdSB3b3VsZCBsaWtlIHRvIGxpc3QgeW91ciBwcm9qZWN0IGhlcmUsIHBsZWFzZQotc2VuZCBlLW1haWwgdG8gYmVhemxleUBjcy51Y2hpY2Fnby5lZHUuCmRpZmYgLS1naXQgYS9zd2lnd2ViL3Byb3BhZ2FuZGEuaHQgYi9zd2lnd2ViL3Byb3BhZ2FuZGEuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YWJiMzUuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9wcm9wYWdhbmRhLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLVNXSUcgUHJvcGFnYW5kYQotCi08cD48aW1nIHNyYz0iaW1hZ2VzL3Byb3BhZ2FuZGEucG5nIiBhbHQ9IlByb3BhZ2FuZGEiPgotCi08cD4KLVRoZSBmb2xsb3dpbmcgY29tbWVudHMgYWJvdXQgU1dJRyB3ZXJlIGNvbGxlY3RlZCBieSBhIHVzZXIgc3VydmV5IGNvbmR1Y3RlZAotaW4gTWFyY2gsIDE5OTguICAgIAotCi08dWw+Ci0KLTxsaT48cD4iU1dJRyBoYXMgaGVscGVkIHVzIG1pbmltaXplIHRoZSBoYXNzbGUgb2Ygd3JpdGluZyBtYW51YWwgd3JhcHBlcnMuCi1TaW5jZSBTV0lHIGhhcyBwcm92ZW4gdG8gYmUgcmF0aGVyIGVhc3kgdG8gdXNlLCBJIGZpbmQgSSBjYW4gY2Fycnkgb3V0IHRoZSB0eXBlcyBvZiB3cmFwcGluZwotYWN0aXZpdGllcyB3aGljaCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhCi1jb21wdXRlciBzY2llbnRpc3QuIgotCi08bGk+PHA+IkkgcmVhbGx5IGxvdmUgdGhlIGZhY3QgdGhhdCB0aGUgbGVhcm5pbmcgY3VydmUgaXMgc2hvcnQKLWFuZCBmbGF0LiAgSSBkb24ndCBuZWVkIHRvIHVzZSB0aGlzIGZhY2lsaXR5IHZlcnkgb2Z0ZW4sCi1idXQgd2hlbiBJIGFic29sdXRlbHkgaGF2ZSB0byBsaW5rIGluIGV4dGVybmFsIEMgcm91dGluZXMsCi1vciB3aGVuIEkgaGF2ZSB0byBnZXQgdGhlIGxhc3QgZHJvcCBvZiBzcGVlZCBmcm9tIHNvbWV0aGluZwotcHJldmlvdXNseSB3cml0dGVuIGluIFBlcmwsIEkgY2FuIGNvdW50IG9uIFNXSUcgdG8gYmUgdGhlcmUuCi1XaGVuIEkgZG8gdXNlIFNXSUcsIEkgZG9uJ3QgbmVlZCB0byBzcGVuZCBob3VycyBsZWFybmluZwotYW5kIGRlYnVnZ2luZyB0aGUgc3lzdGVtLiAgVGhpcyBpcyB0aGUgY2xvc2VzdCB0aGluZyB0bwotY3V0LWFuZC1wYXN0ZSBJJ3ZlIGV2ZXIgc2VlbiBpbiBpbnRlci1sYW5ndWFnZSBsaWJyYXJ5Ci1jcmVhdGlvbi4iCi0KLTxsaT48cD4iV2UgYXJlIGEgcmVzZWFyY2ggZ3JvdXAgdGhhdCBkZXZlbG9wcyBtZWRpY2FsIGltYWdpbmcgc29mdHdhcmUuCi1XZSBhcmUgaW50ZXJlc3RlZCBpbiBpbWFnZSBwcm9jZXNzaW5nL3Zpc3VhbGl6YXRpb24gcmVzZWFyY2gsCi1hbmQgZm9yIG91ciBzb2Z0d2FyZSwgd2Ugd2FudCBhIHNpbXBsZSBhbmQgcG9ydGFibGUgdG9vbCB0bwotZ2VuZXJhdGUgdXNlciBpbnRlcmZhY2VzLiBGb3IgdGhpcywgd2UgY3VycmVudGx5IHVzZQotVGNsL1RrLCBhbmQgU1dJRyB3aGljaCBwcm92aWRlcyBhIG5pY2Ugd2F5IHRvIGNvbm5lY3Qgb3VyCi1zb2Z0d2FyZSAoaW4gQysrKSB0byB0aGUgdGNsLXNjcmlwdHMuIgotCi08bGk+PHA+IlZlcnkgcXVpY2sgZmlyc3QgcmVzdWx0cy4iCi0KLTxsaT48cD4iRWFzeSB0byB1c2UsIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgbGFuZ3VhZ2UgaW50ZXJuYWxzLiBJdCBpcyBhIGJvb24gZm9yIGFwcGxpY2F0aW9uIGRldmVsb3BlcnMsIGxpa2UgbWUuIgotCi08bGk+PHA+IkkgbGlrZSB0aGUgZmFjdCB0aGF0IGl0IGF1dG9tYXRlcyBtdWNoIG9mIHRoZSB0ZWRpb3VzIHdvcmsKLWluIGJ1aWxkaW5nIGFuIGludGVyZmFjZSBDL0MrKyBmdW5jdGlvbnMuICBUaGlzIG1ha2VzIGRldmVsb3BtZW50IGVhc2llci4iCi0KLTxsaT48cD4iU1dJRyBpcyBieSBmYXIgdGhlIGVhc2llc3Qgd2F5IEkgaGF2ZSBmb3VuZCB0byBnZW5lcmF0ZSAKLXNjcmlwdGluZyBpbnRlcmZhY2VzIGZvciBzY2llbnRpZmljIHNvZnR3YXJlLiBTV0lHIG1ha2VzIGl0IAotcHJhY3RpY2FsIHRvIHVzZSBhIHNpbmdsZSwgcG93ZXJmdWwgc2NyaXB0aW5nIGxhbmd1YWdlIGZvciAKLWFsbCBwcm9qZWN0cyByYXRoZXIgdGhhbiB3cml0aW5nIGEgY3VzdG9tIGludGVyZmFjZSB0byBlYWNoLiAKLUl0IGFsc28gZW5jb3VyYWdlcyBhIGNvbnNpc3RlbnQgYW5kIG1vZHVsYXIgZm9ybSBmb3IgYSBwcm9ncmFtLAotYW5kIG1ha2VzIGl0IGVhc2llciB0byBhZGQgY29udHJpYnV0aW9ucyB0byBteSBwcm9ncmFtcyBmcm9tIAotb3RoZXIgdXNlcnMvcHJvZ3JhbW1lcnMuIgotCi08bGk+PHA+IkkgbGlrZSB0aGUgZWFzZSB3aXRoIHdoaWNoIHNjcmlwdGluZyBsYW5ndWFnZXMgY2FuIGJlIGV4dGVuZGVkLgotVGhlIGZhY3QgdGhhdCB3ZSBjb3VsZCBzbyBlYXNpbHkgaW50ZXJmYWNlIHdpdGggTG90dXMgTm90ZXMgb24gTlQgdXNpbmcgUHl0aG9uIHdhcyBqdXN0IGFtYXppbmcuIgotCi08bGk+PHA+IlNXSUcgbWFrZXMgbGlua2luZwotbXkgYXBwbGljYXRpb24gdG8gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgZWFzeSBlbm91Z2gKLXRoYXQgaXQgaXMgd29ydGh3aGlsZS4iCi0KLTxsaT48cD4iSSBjYW1lLCBJIHNhdywgSSB3cmFwcGVkLiAgQW5kIGl0IHJhbi4gIFdvbyBob28hIgotCi08bGk+PHA+IldpdGhvdXQgU1dJRyBpdCB3b3VsZCBoYXZlIHRha2VuIG11Y2gsIG11Y2ggbG9uZ2VyIGZvcgotb3VyIGdyb3VwIHRvIHVzZSBQeXRob24gYXMgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlLiAgT3VyIHdob2xlCi1hcHBsaWNhdGlvbiB3YXMgd3JpdHRlbiBtb3N0bHkgaW4gQysrLiAgV2Ugd2FudGVkIHRvIGxvb2sKLWludG8gdXNpbmcgUHl0aG9uIGZvciBwb3J0aW9ucyBvZiBpdCBpbiBvcmRlciB0byBtYWtlIGl0Ci1lYXNpZXIgdG8gZXh0ZW5kLiAgUHl0aG9uIGhhcyBhIGZhaXJseSBuaWNlIGludGVyZmFjZSBmb3IKLWRvaW5nIHRoaXMgc29ydCBvZiB0aGluZy4gIFRoZSB0cm91YmxlIHdhcyB0aGF0IHdlIG5lZWRlZCB0bwotbWFrZSBodW5kcmVkcyBvZiBDKysgY2xhc3NlcyBhdmFpbGFibGUgdG8gUHl0aG9uLiAgVGhpcwotd291bGQgaGF2ZSB0YWtlbiBhIHZlcnkgbG9uZyB0aW1lICh0byB3cml0ZSB0aGUgd3JhcHBlciBjb2RlKS4KLVNXSUcgYWxsb3dlZCB1cyB0byBzcGVuZCBhIG1pbmltYWwgYW1vdW50IG9mIHRpbWUgd2l0aAotdGhlIHdyYXBwZXIgY29kZSBhbmQgbW9zdCBvZiBvdXIgdGltZSBtb3Zpbmcgc3R1ZmYgdG8gUHl0aG9uCi0od2hpY2ggd2FzIHRoZSBiaWcgcG9pbnQgaW4gdGhlIGZpcnN0IHBsYWNlKS4iCi0KLTxsaT48cD4iU1dJRyBpcyBhIGh1Z2UgdGltZS1zYXZlci4gIEkgaGF2ZSBhcHByb3hpbWF0ZWx5IDMwLDAwMCAKLWxpbmVzIG9mIEMgYW5kIFB5dGhvbiBjb2RlIHRoYXQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSAKLVNXSUcgdGhhdCBJIGRpZG4ndCBoYXZlIHRvIHdyaXRlIGJ5IGhhbmQsIGRvbid0Ci1oYXZlIHRvIGZpeCBzeW50YXggYW5kIGZ1bWJsZS1maW5nZXIgZXJyb3JzIGluLCBhbmQgCi1kb24ndCBoYXZlIHRvIGFnZ3Jlc3NpdmVseSB0ZXN0LiIKLQotPGxpPjxwPiJTV0lHIGhlbHBzIHVzIGluIHRha2luZyBhd2F5IHBhcnQgb2YgdGhlIGVycm9yLXByb25lIHRhc2sgb2YgbWFraW5nCi10aGUgQyByb3V0aW5lcyBhY2Nlc3NpYmxlIGZyb20gUHl0aG9uIGFuZCBoYXMgY29uc2lkZXJhYmx5IGltcHJvdmVkCi1vdXIgZWZmaWNpZW5jeS4iCi0KLTxsaT48cD4iSSBsaWtlIGFsbCB0aGUgdGltZSBJIGhhdmUgc2F2ZWQgYnkgbm90IHdyaXRpbmcgdGhlIGludGVyZmFjZXMgbXlzZWxmLiIKLQotPGxpPjxwPiJTV0lHIHNhdmVzIGEgbG90IG9mIG15IGVuZXJneSBpbiBpbnRlcmZhY2luZyB3aXRoIG1hbnkgZnJlZQotQy9DKysgbGlicmFyaWVzIGluIG15IHByb2plY3QuIgotCi08bGk+PHA+IlNXSUcgaGFuZGxlcyB0aGUgZ29yeSBkZXRhaWxzIGFuZCBhbGxvd3MgbWUgdG8gY29uY2VudHJhdGUgb24gdGhlIGltcG9ydGFudCB0aGluZ3MuIgotCi08bGk+PHA+IlVzaW5nIFNXSUcgaXMgcmVhbGx5IGZ1biwgYmVjYXVzZSBpdCBzYXZlcyB5b3UgZnJvbSAKLWEgbG90IG9mIG1lY2hhbmljYWwgd29yayBhbmQgaXQgdGFrZXMgY2FyZSBvZiBhbGwgdGhlIAotZGV0YWlscyB5b3UgZG9uJ3Qgd2FudCB0byBib3RoZXIgd2l0aCBsZXR0aW5nIHlvdSAKLWNvbmNlbnRyYXRlIG9uIHRoZSByZWFsIHByb2JsZW0uIgotCi08bGk+PHA+IlRoYW5rcyBhZ2FpbiBmb3IgU1dJRy4uLiBJdCdzIGZ1biBhbmQgYWxsb3dzIGdyZWF0IHByb2R1Y3Rpdml0eSB3aGlsZQotYXZvaWRpbmcgbXVjaCB0ZWRpdW0uIgotCi08bGk+PHA+IltJIGxpa2VdIHRoZSBhYmlsaXR5IHRvIHdyaXRlIGV4dGVuc2lvbnMgYmFzaWNhbGx5IHdpdGhvdXQgaGF2aW5nIHRvIHRoaW5rIHRvbwotaGFyZCBhYm91dCB3aGF0IEknbSBkb2luZy4iCi0KLTxsaT48cD4iU1dJRyBhbGxvd3MgbWUgdG8gZ2V0IG9uIHdpdGggc2NyaXB0aW5nCi1hbmQgd3JpdGluZyBDKysgY29kZSB3aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCB0aGUgCi0odXN1YWxseSBjb25zaWRlcmFibGUpIGlzc3VlcyBpbnZvbHZlZCBpbiBleHRlbmRpbmcgdGhlCi1zY3JpcHRpbmcgbGFuZ3VhZ2Ugd2l0aCBteSBjdXN0b20gY29tcG9uZW50cy4iCi0KLTxsaT48cD4iVXNpbmcgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYXMgZ2x1ZSBiZXR3ZWVuIEMrKyBjb21wb25lbnRzCi1pcyBhIHBvd2VyZnVsIHBhcmFkaWdtIGZvciBjb21iaW5pbmcgZmxleGliaWxpdHkgd2l0aCAKLXJvYnVzdG5lc3MgYW5kIGVmZmljaWVuY3kuICBTV0lHIGVuYWJsZXMgdGhpcyBtb2RlbCBieQotcHJvdmlkaW5nIGEgc29saWQgYnJpZGdlIGJldHdlZW4gdGhlIEMrKyBjb21wb25lbnQgYW5kIAotdGhlIHNjcmlwdGluZyBsYW5ndWFnZS4iCi0KLTxsaT48cD4iVGhlIGFiaWxpdHkgdG8gYGBmb2xsb3cnJyB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIGNvcmUKLWFwcGxpY2F0aW9uIHdpdGhvdXQgY29uc3RhbnRseSByZWJ1aWxkaW5nIHRoZSBpbnRlcmZhY2UKLWlzIHZlcnkgZWZmZWN0aXZlLiBUaGUgZGV2ZWxvcG1lbnRzIG9mIHRoZSBrZXJuZWwgYW5kIGl0cyBpbnRlcmZhY2UgYXJlIAotbXV0dWFsbHkgcHJvdGVjdGVkIHRvIGEgbGFyZ2UgZGVncmVlLiIKLQotPGxpPjxwPiJTV0lHIGFsbG93cyB1cyB0byByZWN5Y2xlIGEgbG90IG9mIHVnbHkgb2xkIEMgY29kZSBhbmQgcHV0Ci1pdCBpbnRvIGEgcmVhc29uYWJsZSBtb2R1bGUgc3RydWN0dXJlIGFuZCBzbmF6enkgbmV3IHVzZXIKLWludGVyZmFjZXMuIgotCi08bGk+PHA+Ikl0IGFsbG93cyB1cyB0byBsZXZlcmFnZSB0aGUgYWR2YW50YWdlcyBvZiB0aGUgc2NyaXB0aW5nCi1sYW5ndWFnZSwgZXNwZWNpYWxseSB3aGVuIHNvIG1hbnkgb3RoZXIgc2NyaXB0cyBhcmUgYWxyZWFkeQotYmVpbmcgd3JpdHRlbiB0byBnbHVlIHByb2dyYW1zIHRvZ2V0aGVyIGFuZCBzb21lIG9mIG91cgotb3RoZXIgdG9vbHMgaGF2ZSB0aGVpciBvd24gc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZS4KLVVzaW5nIFNXSUcgd2lsbCBhbGxvdyB1cyB0byBwcm9wZXJseSBpbnRlZ3JhdGUgZWFjaCBvZiB0aGUKLXBhcnRzIGRpcmVjdGx5IGludG8gdGhlIGxhbmd1YWdlIGluc3RlYWQgb2YgYSBjb2xsZWN0aW9uCi1vZiBzeXN0ZW0oKSBjYWxscy4iCi0KLTxsaT48cD4iQmVmb3JlIEkgaGFkIHRvIHVzZSBDKysgZm9yIG15IGBgcmFwaWQnJyBwcm90b3R5cGluZy4KLU5vdyBJIGNhbiBzY3JpcHQgaXQhIgotCi08bGk+PHA+Ik15IGNvZGUgaXMgY2xlYW5lciBhbmQgbW9yZSBjb21wYWN0IHdoaWNoIG1ha2VzIGl0IGVhc2llciB0bwotcmVhZCBhbmQgdW5kZXJzdGFuZC4gIFNXSUcgYWxzbyBlbmNvdXJhZ2VzIG1vZHVsYXJpemUgY29kZS0tYWxsb3dpbmcKLW9uZSB0byB0ZXN0L2RlYnVnIG1vZHVsZXMgaW5kZXBlbmRlbnRseS4gIFRoaXMgbWFrZXMgY29ubmVjdGluZwotZXZlcnl0aGluZyB0b2dldGhlciBhIGJyZWV6ZS4iCi0KLTxsaT48cD4iVGhlIHZlcnkgaWRlYSBvZiBzY3JpcHRpbmcgcHJvZ3JhbW1pbmcgb24gdGhlIG9uZSBoYW5kIGFuZAotc3lzdGVtcyBwcm9ncmFtbWluZyBvbiB0aGUgb3RoZXIgaXMgcXVpdGUgbmljZSwgdGhlIG1vc3QKLWltcG9ydGFudCBmZWF0dXJlIG9mIFNXSUcgaXMgdG8gbWFrZSB0aGlzIGFwcHJvYWNoCi1wcmFjdGljYWwgb24gYSBkYXktYnktZGF5IGJhc2lzLiIKLQotPGxpPjxwPiJPbiB0aGUgd2hvbGUsIFNXSUcgaXMgbXkgbW9zdCBpbXBvcnRhbnQgZGV2ZWxvcG1lbnQgdG9vbCAKLWFmdGVyIGdjYyEiCi0KLTxsaT48cD4iU1dJRyBoYXMgZW5hYmxlZCBvdXIgY3VzdG9tZXJzIHRvIGludGVyYWN0IHdpdGggb3VyIHRvb2xraXRzIGluIGZ1bmRhbWVudGFsbHkKLW5ldyB3YXlzLiIKLQotPGxpPjxwPiJXZSBhcmUgdXNpbmcgVGNsIHNjcmlwdHMgYXMgdGhlIGRhdGEgZmlsZXMgZHJpdmluZyBvdXIgCi1zaW11bGF0aW9ucy4gIE9uY2UgdGhlIGRhdGEgaXMgZGVmaW5lZCB1c2luZyBhIHByb2dyYW0KLSh3aGljaCBpcyBwcmV0dHkgY29vbCBpbiBpdHNlbGYpLCB3ZSBjYW4gYWN0dWFsbHkgcnVuIHRoZQotc2ltdWxhdGlvbiBmcm9tIHNjcmlwdCBjb21tYW5kcy4gIEluIG91ciBleHBlcmltZW50YWwgCi1lbnZpcm9ubWVudCwgdGhhdCBzYXZlcyByZXdyaXRpbmcgYSBsb3Qgb2YgIm1haW4iIHByb2dyYW1zCi10aGF0IGV4ZXJjaXNlIHRoZSBzYW1lIGJhc2ljIG9iamVjdHMuIFRoaXMgaXNuJ3QgZXhhY3RseSBjb21wdXRhdGlvbmFsIHN0ZWVyaW5nLCBidXQgaXQgZG9lcyBnaXZlCi1vdXIgZW5naW5lZXJzIGEgbG90IG9mIGZsZXhpYmlsaXR5LiIKLQotPGxpPjxwPiJBbGwgKHdlbGwgbW9zdCkgb2YgbXkgQysrIGNvZGUgKE1DIHNpbXVsYXRpb25zIG9mCi1wcm90ZWlucyBhbmQgc2VxdWVuY2UgYW5hbHlzaXMpIGlzIG5vdyBkcml2ZW4gYnkKLWEgUHl0aG9uIGludGVyZmFjZSB0aGFua3MgdG8gU1dJRy4gIE9uY2UgSSBoYXZlIGRlY2lkZWQgb24gYW4gaW50ZXJmYWNlLCB0aGUKLXByb2Nlc3Mgb2YgIGJ1aWxkaW5nIGl0IGlzIHVzdWFsbHkgdHJpdmlhbC4iCi0KLTxsaT48cD4iU1dJRyBpcyBhbiBpbnRlZ3JhbCBwYXJ0IG9mIGEgdXNlciBlbnZpcm9ubWVudCBJIGFtIGNyZWF0aW5nIGZvciBhIE1vbGVjdWxhciBEeW5hbWljcyBjb21wYW55LgotVGhleSBoYXZlIEZPUlRSQU4gbW9kdWxlcyB0aGF0IHJlcXVpcmUgYSBzdGVlcmluZyBsYW5ndWFnZSAoUHl0aG9uKSB0byBlbmFibGUgZmxleGlibGUgY29tcHV0YXRpb25hbAotcmVzZWFyY2guIgotCi08bGk+PHA+IlNXSUcgcGxheXMgYSBjcml0aWNhbCByb2xlIHRvIGF1dG9tYXRlIHRoZSBnZW5lcmF0aW9uIG9mCi1QZXJsIGNsaWVudCBpbnRlcmZhY2VzIGZyb20gdGhlIE9NRyBJRExzIGZvciBhIENPUkJBIE9SQi4KLVRoZSBQZXJsIGNsaWVudCBpbnRlcmZhY2UgaXMgZXNzZW50aWFsIGluIHNjcmlwdCBkcml2ZW4KLXRlc3RpbmcuIgotCi08bGk+PHA+IkkgYW0gZW5qb3lpbmcgcmFwaWRseSBkZXZlbG9waW5nIGNvbXBsZXggcHJvamVjdHMgdXNpbmcgT08KLWFuZCBQeXRob24sIGJ1dCBjb21pbmcgZnJvbSBhIG51bWVyaWNhbCBiYWNrZ3JvdW5kLCBJIGxpa2UKLXRoYXQgSSBjYW4gZ2V0IGZhc3QgbnVtYmVyIGNydW5jaGluZyBwZXJmb3JtYW5jZSB3aGVuIEkgCi1uZWVkIGl0IGZyb20gQyBtb2R1bGVzIHdyYXBwZWQgdXAgYnkgU1dJRy4gIgotPC91bD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcmFudHMuaHQgYi9zd2lnd2ViL3JhbnRzLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzdlYzljLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvcmFudHMuaHQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNXSUcgUmFudHMKLQotPHA+Ci08aW1nIHNyYz0iaW1hZ2VzL3JhbnRzLnBuZyIgYWx0PSJSYW50cyI+Ci0KLTxwPgotV2VsbCwgdGhlcmUncyBub3RoaW5nIGhlcmUgeWV0LCBidXQgcmVzdCBhc3N1cmVkLCB0aGVyZSBhcmUgcGxlbnR5IG9mIHRoaW5ncyB0byByYW50Ci1hYm91dC4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvcmVsZWFzZS5odCBiL3N3aWd3ZWIvcmVsZWFzZS5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExNDhkMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3JlbGVhc2UuaHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1SZWxlYXNlIE5vdGVzCi0KLTxoMj5SZWxlYXNlIE5vdGVzPC9oMj4KLQotVGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIFNXSUcgQ1ZTIHJlcG9zaXRvcnkuCi0KLTx1bD4KLTxsaT48YSBocmVmPSJSZWxlYXNlL1JFQURNRSI+UkVBRE1FPC9hPgotPGxpPjxhIGhyZWY9IlJlbGVhc2UvQ0hBTkdFUyI+Q0hBTkdFUzwvYT4KLTxsaT48YSBocmVmPSJSZWxlYXNlL0NIQU5HRVMuY3VycmVudCI+Q0hBTkdFUy5jdXJyZW50PC9hPgotPGxpPjxhIGhyZWY9IlJlbGVhc2UvTkVXIj5ORVc8L2E+Ci08bGk+PGEgaHJlZj0iUmVsZWFzZS9MSUNFTlNFIj5MSUNFTlNFPC9hPgotPC91bD4KLQotCmRpZmYgLS1naXQgYS9zd2lnd2ViL3NjcmVlbnNob3QuaHQgYi9zd2lnd2ViL3NjcmVlbnNob3QuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMjhmMjQuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9zY3JlZW5zaG90Lmh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TV0lHIFNjcmVlbnNob3QKLQotPHA+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4ucG5nIiBhbHQ9IlNjcmVlbnNob3QiPgotCi08cD48aW1nIHNyYz0iaW1hZ2VzL3NjcmVlbnNob3QucG5nIiBhbHQ9IlNjcmVlbnNob3QgaW1hZ2UiPgotCi08cD4KLUl0IGlzIGxvdmVseSwgaXNuJ3QgaXQ/CmRpZmYgLS1naXQgYS9zd2lnd2ViL3NjcmVlbnNob3QyLmh0IGIvc3dpZ3dlYi9zY3JlZW5zaG90Mi5odApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0YTE3ZS4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3NjcmVlbnNob3QyLmh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TV0lHIFNjcmVlbnNob3QKLQotPHA+PGltZyBzcmM9ImltYWdlcy9zY3JlZW4ucG5nIiBhbHQ9IlNjcmVlbnNob3QiPgotCi08cD48aW1nIHNyYz0iaW1hZ2VzL3NjcmVlbnNob3QyLnBuZyIgYWx0PSJTY3JlZW5zaG90IGltYWdlIj4KLQotPHA+Ci1NdWNoIGJldHRlciB0aGFuIGJlZm9yZSwgZG9uJ3QgeW91IHRoaW5rPwotCmRpZmYgLS1naXQgYS9zd2lnd2ViL3N1YnZlcnNpb24uaHQgYi9zd2lnd2ViL3N1YnZlcnNpb24uaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMGEwOTAuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9zdWJ2ZXJzaW9uLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotU1dJRyBTdWJ2ZXJzaW9uCi0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvc3VidmVyc2lvbi5wbmciIGFsdD0iU3VidmVyc2lvbiI+Ci0KLTx1bD4KLTxsaT5UaGUgbmV3bHktcmV2aXNlZCBTV0lHIG1pc3Npb24gc3RhdGVtZW50OgotCi08Y2VudGVyPgotPGVtPgotIldlIGFyZSBidWlsZGluZyBhIHdyYXBwZXIgZ2VuZXJhdG9yIG9mIGV4dHJhb3JkaW5hcnkgbWFnbml0dWRlLiIKLTxicj4KLTwvZW0+Ci08L2NlbnRlcj4KLQotPGxpPkFsdGVybmF0aXZlIG1pc3Npb24gc3RhdGVtZW50OgotCi08Y2VudGVyPgotPGVtPgotIllvdSBrbm93LCBmb3Iga2lkcy4iIDxicj4KLTwvZW0+Ci08L2NlbnRlcj4KLQotPGxpPlRoZSBldmVyLXNvLWltcHJlc3NpdmUgU1dJRy0xLjEgPGEgaHJlZj0ic2NyZWVuc2hvdC5odG1sIj5zY3JlZW5zaG90PC9hPi4KLTxsaT5BbiBldmVuIG1vcmUgaW1wcmVzc2l2ZSA8YSBocmVmPSJzY3JlZW5zaG90Mi5odG1sIj5zY3JlZW5zaG90PC9hPiBzaG93aW5nIHRoZSBuZXcgc3RyZWFtbGluZWQgaW50ZXJmYWNlIHRvIFNXSUctMS4zLgotPGxpPjxhIGhyZWY9InZpc3VhbC5odG1sIj5WaXN1YWwgU1dJRyAyMDAyKysgLk5FVDwvYT4tLXRoZSB2ZXJzaW9uIGZvciBtYW5hZ2Vycy4KLTxsaT5UaGUgZ3JlYXRseSBzaW1wbGlmaWVkIDxhIGhyZWY9ImNvcHlmdW4uaHRtbCI+Y29weXJpZ2h0PC9hPi4KLTwvdWw+Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvc3VydmV5Lmh0IGIvc3dpZ3dlYi9zdXJ2ZXkuaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZGJiOWEuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi9zdXJ2ZXkuaHQKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1TdXJ2ZXkKLQotPHRhYmxlIHN1bW1hcnk9IkJlZm9yZSBkb3dubG9hZGluZy4uLiI+IDx0cj4KLTx0ZCBiZ2NvbG9yPSIjMDAwMDAwIiBhbGlnbj1jZW50ZXI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPjxiPkJlZm9yZSBkb3dubG9hZGluZy4uLjwvYj48L2ZvbnQ+PC90ZD4KLTwvdHI+IDwvdGFibGU+Ci0gCi1CZWZvcmUgZG93bmxvYWRpbmcsIHBsZWFzZSBoZWxwIHVzIGJ5IGZpbGxpbmcgaW4gdGhlIHNpbXBsZSBzdXJ2ZXkgYmVsb3cgYWJvdXQgeW91ciBpbnRlbmRlZCBTV0lHIHVzYWdlLiAKLTxwPgotSWYgeW91IGxpa2UgeW91IGNhbiBza2lwIGl0IGFuZCBnbyBzdHJhaWdodCB0byB0aGUgPGEgaHJlZj0iZG93bmxvYWQuaHRtbCI+RG93bmxvYWQgYXJlYTwvYT4uCi0KLTx0YWJsZSBzdW1tYXJ5PSJVc2FnZSBTdXJ2ZXkiPiA8dHI+Ci08dGQgYmdjb2xvcj0iIzAwMDAwMCIgYWxpZ249Y2VudGVyPjxmb250IGNvbG9yPSIjZmZmZmZmIj48Yj5TV0lHIFVzYWdlIFN1cnZleTwvYj48L2ZvbnQ+PC90ZD4KLTwvdHI+IDwvdGFibGU+Ci0gCi08Zm9ybSBtZXRob2Q9cG9zdCBhY3Rpb249Imh0dHA6Ly93d3cuc3dpZy5vcmcvY2dpLWJpbi9zdXJ2ZXlyZXNwb25zZS5wbCI+Ci08Yj4KLVdoaWNoIHRhcmdldCBsYW5ndWFnZXMgd2lsbCB5b3UgYmUgdXNpbmcgU1dJRyBmb3I/IFBsZWFzZSBzZWxlY3QgYWxsIHRoYXQgYXBwbHkuCi08L2I+Ci08YmxvY2txdW90ZT4KLQotPGlucHV0IG5hbWU9ImxhbmdDaGlja2VuIiB0eXBlPWNoZWNrYm94IGFsaWduPSJsZWZ0IiB2YWx1ZT0iMSI+IENoaWNrZW4gPGJyPgotPGlucHV0IG5hbWU9ImxhbmdDU2hhcnAiIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBDIyA8YnI+Ci08aW5wdXQgbmFtZT0ibGFuZ0d1aWxlIiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gR3VpbGUgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdKYXZhIiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gSmF2YSA8YnI+Ci08aW5wdXQgbmFtZT0ibGFuZ016c2NoZW1lIiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gTXpTY2hlbWUgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdPY2FtbCIgdHlwZT1jaGVja2JveCB2YWx1ZT0iMSI+IE9jYW1sIDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nUGVybCIgdHlwZT1jaGVja2JveCB2YWx1ZT0iMSI+IFBlcmwgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdQaHAiIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBQaHAgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdQaWtlIiB0eXBlPWNoZWNrYm94IHZhbHVlPSIxIj4gUGlrZSA8YnI+Ci08aW5wdXQgbmFtZT0ibGFuZ1B5dGhvbiIgdHlwZT1jaGVja2JveCB2YWx1ZT0iMSI+IFB5dGhvbiA8YnI+Ci08aW5wdXQgbmFtZT0ibGFuZ1J1YnkiIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBSdWJ5IDxicj4KLTxpbnB1dCBuYW1lPSJsYW5nU2V4cCIgdHlwZT1jaGVja2JveCB2YWx1ZT0iMSI+IExpc3AgUy1leHAgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdUY2wiIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBUY2wgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdYbWwiIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBYbWwgPGJyPgotPGlucHV0IG5hbWU9ImxhbmdPdGhlckxhbmciIHR5cGU9Y2hlY2tib3ggdmFsdWU9IjEiPiBPdGhlciwgcGxlYXNlIHNwZWNpZnk6IDxpbnB1dCBuYW1lPSJuYW1lZExhbmd1YWdlIiBzaXplPSIyMCI+IDxicj4KLQotPC9ibG9ja3F1b3RlPgotPHA+Ci0KLTxiPgotV2hpY2ggb3BlcmF0aW5nIHN5c3RlbXMgd2lsbCB5b3UgYmUgcnVubmluZyBTV0lHIG9uPyBQbGVhc2Ugc2VsZWN0IGFsbCB0aGF0IGFwcGx5LgotPC9iPgotPGJsb2NrcXVvdGU+Ci0KLTxpbnB1dCBuYW1lPSJvc0JTRCIgdHlwZT1jaGVja2JveCBhbGlnbj0ibGVmdCIgdmFsdWU9IjEiPiBGcmVlQlNEL09wZW5CU0QvTmV0QlNEIDxicj4KLTxpbnB1dCBuYW1lPSJvc0hQVVgiIHR5cGU9Y2hlY2tib3ggYWxpZ249ImxlZnQiIHZhbHVlPSIxIj4gSFAtVVggPGJyPgotPGlucHV0IG5hbWU9Im9zTGludXgiIHR5cGU9Y2hlY2tib3ggYWxpZ249ImxlZnQiIHZhbHVlPSIxIj4gTGludXggPGJyPgotPGlucHV0IG5hbWU9Im9zTWFjT1NYIiB0eXBlPWNoZWNrYm94IGFsaWduPSJsZWZ0IiB2YWx1ZT0iMSI+IE1hYyBPUyBYIDxicj4KLTxpbnB1dCBuYW1lPSJvc1NvbGFyaXMiIHR5cGU9Y2hlY2tib3ggYWxpZ249ImxlZnQiIHZhbHVlPSIxIj4gU29sYXJpcyA8YnI+Ci08aW5wdXQgbmFtZT0ib3NXaW5kb3dzIiB0eXBlPWNoZWNrYm94IGFsaWduPSJsZWZ0IiB2YWx1ZT0iMSI+IFdpbmRvd3MgPGJyPgotPGlucHV0IG5hbWU9Im9zT3RoZXJPUyIgdHlwZT1jaGVja2JveCBhbGlnbj0ibGVmdCIgdmFsdWU9IjEiPiBPdGhlciwgcGxlYXNlIHNwZWNpZnk6IDxpbnB1dCBuYW1lPSJuYW1lZE9TIiBzaXplPSIyMCI+IDxicj4KLQotPC9ibG9ja3F1b3RlPgotCi08aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IlN1Ym1pdCI+IAotCi08L2Zvcm0+Ci0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvdHV0b3JpYWwuaHQgYi9zd2lnd2ViL3R1dG9yaWFsLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmNhMTI2Li4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvdHV0b3JpYWwuaHQKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotU1dJRyBUdXRvcmlhbAotCi08cD4KLTxpbWcgc3JjPSJpbWFnZXMvdHV0b3JpYWwucG5nIiBhbHQ9IlR1dG9yaWFsIj4KLQotPHA+Ci1TbyB5b3Ugd2FudCB0byBnZXQgZ29pbmcgaW4gYSBodXJyeT8gIFRvIGlsbHVzdHJhdGUgdGhlIHVzZSBvZiBTV0lHLAotc3VwcG9zZSB5b3UgaGF2ZSBzb21lIEMgZnVuY3Rpb25zIHlvdSB3YW50IGFkZGVkIHRvIFRjbCwgUGVybCwgUHl0aG9uLCBKYXZhIGFuZCBDIy4KLVNwZWNpZmljYWxseSwgbGV0J3Mgc2F5IHlvdSBoYXZlIHRoZW0gaW4gYSBmaWxlICdleGFtcGxlLmMnCi0KLTxibG9ja3F1b3RlPjxwcmU+Ci0vKiBGaWxlIDogZXhhbXBsZS5jICovCi0KLSNpbmNsdWRlICZsdDt0aW1lLmgmZ3Q7Ci1kb3VibGUgTXlfdmFyaWFibGUgPSAzLjA7Ci0KLWludCBmYWN0KGludCBuKSB7Ci0gICAgaWYgKG4gJmx0Oz0gMSkgcmV0dXJuIDE7Ci0gICAgZWxzZSByZXR1cm4gbipmYWN0KG4tMSk7Ci19Ci0KLWludCBteV9tb2QoaW50IHgsIGludCB5KSB7Ci0gICAgcmV0dXJuICh4JXkpOwotfQotCQotY2hhciAqZ2V0X3RpbWUoKQotewotICAgIHRpbWVfdCBsdGltZTsKLSAgICB0aW1lKCZhbXA7bHRpbWUpOwotICAgIHJldHVybiBjdGltZSgmYW1wO2x0aW1lKTsKLX0KLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08aDM+SW50ZXJmYWNlIGZpbGUgPC9oMz4KLQotTm93LCBpbiBvcmRlciB0byBhZGQgdGhlc2UgZmlsZXMgdG8geW91ciBmYXZvcml0ZSBsYW5ndWFnZSwgeW91IG5lZWQgdG8gd3JpdGUgYW4KLSJpbnRlcmZhY2UgZmlsZSIgd2hpY2ggaXMgdGhlIGlucHV0IHRvIFNXSUcuICBBbiBpbnRlcmZhY2UgZmlsZSBmb3IgdGhlc2UKLUMgZnVuY3Rpb25zIG1pZ2h0IGxvb2sgbGlrZSB0aGlzIDoKLQotPGJsb2NrcXVvdGU+PHByZT4KLS8qIGV4YW1wbGUuaSAqLwotJW1vZHVsZSBleGFtcGxlCi0lewotLyogUHV0IGhlYWRlciBmaWxlcyBoZXJlIG9yIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBsaWtlIGJlbG93ICovCi1leHRlcm4gZG91YmxlIE15X3ZhcmlhYmxlOwotZXh0ZXJuIGludCBmYWN0KGludCBuKTsKLWV4dGVybiBpbnQgbXlfbW9kKGludCB4LCBpbnQgeSk7Ci1leHRlcm4gY2hhciAqZ2V0X3RpbWUoKTsKLSV9Ci0KLWV4dGVybiBkb3VibGUgTXlfdmFyaWFibGU7Ci1leHRlcm4gaW50IGZhY3QoaW50IG4pOwotZXh0ZXJuIGludCBteV9tb2QoaW50IHgsIGludCB5KTsKLWV4dGVybiBjaGFyICpnZXRfdGltZSgpOwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08aDM+IEJ1aWxkaW5nIGEgVGNsIG1vZHVsZSA8L2gzPgotCi1BdCB0aGUgVU5JWCBwcm9tcHQsIHR5cGUgdGhlIGZvbGxvd2luZyAoc2hvd24gZm9yIExpbnV4LCBzZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9zd2lnLmNzLnVjaGljYWdvLmVkdS9jZ2ktYmluL3dpa2kucGw/U3dpZ0ZhcS9TaGFyZWRMaWJyYXJpZXMiPlNXSUcgV2lraSBTaGFyZWQgTGlicmFyaWVzPC9hPiBwYWdlIGZvciBoZWxwIHdpdGggb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMpOgotCi08YmxvY2txdW90ZT4KLTxwcmU+Ci11bml4ICUgc3dpZyAtdGNsIGV4YW1wbGUuaQotdW5peCAlIGdjYyAtZnBpYyAtYyBleGFtcGxlLmMgZXhhbXBsZV93cmFwLmMgXAotICAgICAgIC1JL3Vzci9sb2NhbC9pbmNsdWRlIAotdW5peCAlIGdjYyAtc2hhcmVkIGV4YW1wbGUubyBleGFtcGxlX3dyYXAubyAtbyBleGFtcGxlLnNvCi11bml4ICUgdGNsc2gKLSUgbG9hZCAuL2V4YW1wbGUuc28gZXhhbXBsZQotJSBwdXRzICRNeV92YXJpYWJsZQotMy4wCi0lIGZhY3QgNQotMTIwCi0lIG15X21vZCA3IDMKLTEKLSUgZ2V0X3RpbWUKLVN1biBGZWIgMTEgMjM6MDE6MDcgMTk5NgotCi0lIAotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi1UaGUgPHR0PiBzd2lnIDwvdHQ+IGNvbW1hbmQgcHJvZHVjZXMgYSBmaWxlIDxhIGhyZWYgPSAidHV0b3JpYWwvZXhhbXBsZV93cmFwLmh0bWwiPgotPHR0PiBleGFtcGxlX3dyYXAuYyA8L3R0PiA8L2E+IHRoYXQgc2hvdWxkIGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgd2l0aAotdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uICBJbiB0aGlzIGNhc2UsIHdlIGhhdmUgYnVpbHQgYSBkeW5hbWljYWxseSAKLWxvYWRhYmxlIGV4dGVuc2lvbiB0aGF0IGNhbiBiZSBsb2FkZWQgaW50byB0aGUgVGNsIGludGVycHJldGVyIHVzaW5nCi10aGUgJ2xvYWQnIGNvbW1hbmQuICAgCi0KLTxoMz4gQnVpbGRpbmcgYSBQeXRob24gbW9kdWxlIDwvaDM+Ci0KLVR1cm5pbmcgQyBjb2RlIGludG8gYSBQeXRob24gbW9kdWxlIGlzIGFsc28gZWFzeS4gIFNpbXBseSBkbyB0aGUgZm9sbG93aW5nIChzaG93biBmb3IgSXJpeCwgc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vc3dpZy5jcy51Y2hpY2Fnby5lZHUvY2dpLWJpbi93aWtpLnBsP1N3aWdGYXEvU2hhcmVkTGlicmFyaWVzIj5TV0lHIFdpa2kgU2hhcmVkIExpYnJhcmllczwvYT4gcGFnZSBmb3IgaGVscCB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zKToKLQotPGJsb2NrcXVvdGU+IDxwcmU+Ci0KLXVuaXggJSBzd2lnIC1weXRob24gZXhhbXBsZS5pCi11bml4ICUgZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyBcCi0gICAgICAgLUkvdXNyL2xvY2FsL2luY2x1ZGUvcHl0aG9uMi4xCi11bml4ICUgbGQgLXNoYXJlZCBleGFtcGxlLm8gZXhhbXBsZV93cmFwLm8gLW8gX2V4YW1wbGUuc28gCi08L3ByZT4gPC9ibG9ja3F1b3RlPgotCi1XZSBjYW4gbm93IHVzZSB0aGUgUHl0aG9uIG1vZHVsZSBhcyBmb2xsb3dzIDogCi08YmxvY2txdW90ZT4gPHByZT4KLSZndDsmZ3Q7Jmd0OyBpbXBvcnQgZXhhbXBsZQotJmd0OyZndDsmZ3Q7IGV4YW1wbGUuZmFjdCg1KQotMTIwCi0mZ3Q7Jmd0OyZndDsgZXhhbXBsZS5teV9tb2QoNywzKQotMQotJmd0OyZndDsmZ3Q7IGV4YW1wbGUuZ2V0X3RpbWUoKQotJ1N1biBGZWIgMTEgMjM6MDE6MDcgMTk5NicKLSZndDsmZ3Q7Jmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gQnVpbGRpbmcgYSBQZXJsIG1vZHVsZSA8L2gzPgotWW91IGNhbiBhbHNvIGJ1aWxkIGEgUGVybDUgbW9kdWxlIGFzIGZvbGxvd3MgKHNob3duIGZvciBTb2xhcmlzLCBzZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9zd2lnLmNzLnVjaGljYWdvLmVkdS9jZ2ktYmluL3dpa2kucGw/U3dpZ0ZhcS9TaGFyZWRMaWJyYXJpZXMiPlNXSUcgV2lraSBTaGFyZWQgTGlicmFyaWVzPC9hPiBwYWdlIGZvciBoZWxwIHdpdGggb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMpOgotCi08YmxvY2txdW90ZT48cHJlPgotdW5peCAlIHN3aWcgLXBlcmw1IGV4YW1wbGUuaQotdW5peCAlIGdjYyAtYyBleGFtcGxlLmMgZXhhbXBsZV93cmFwLmMgXAotICAgICAgIC1JL3Vzci9saWIvcGVybC9zb2xhcmlzLzUuMDAzL0NPUkUgCi11bml4ICUgbGQgLUcgZXhhbXBsZS5vIGV4YW1wbGVfd3JhcC5vIC1vIGV4YW1wbGUuc28KLXVuaXggJSBwZXJsCi11c2UgZXhhbXBsZTsKLXByaW50ICRleGFtcGxlOjpNeV92YXJpYWJsZSwiXG4iOwotcHJpbnQgZXhhbXBsZTo6ZmFjdCg1KSwiXG4iOwotcHJpbnQgZXhhbXBsZTo6Z2V0X3RpbWUoKSwiXG4iOwotJmx0O2N0cmwtZCZndDsKLTMuMAotMTIwCi1TdW4gRmViIDExIDIzOjAxOjA3IDE5OTYKLXVuaXggJSAKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPGgzPiBCdWlsZGluZyBhIEphdmEgbW9kdWxlIDwvaDM+Ci1TV0lHIHdpbGwgYWxzbyBnZW5lcmF0ZSBKTkkgY29kZSBmb3IgYWNjZXNzaW5nIEMvQysrIGNvZGUgZnJvbSBKYXZhLiBIZXJlIGlzIGFuIGV4YW1wbGUgYnVpbGRpbmcgYSBKYXZhIG1vZHVsZSAoc2hvd24gZm9yIEN5Z3dpbiwgc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vc3dpZy5jcy51Y2hpY2Fnby5lZHUvY2dpLWJpbi93aWtpLnBsP1N3aWdGYXEvU2hhcmVkTGlicmFyaWVzIj5TV0lHIFdpa2kgU2hhcmVkIExpYnJhcmllczwvYT4gcGFnZSBmb3IgaGVscCB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zKToKLQotPGJsb2NrcXVvdGU+PHByZT4KLSQgc3dpZyAtamF2YSBleGFtcGxlLmkKLSQgZ2NjIC1jIGV4YW1wbGUuYyBleGFtcGxlX3dyYXAuYyAtSS9jL2pkazEuMy4xL2luY2x1ZGUgLUkvYy9qZGsxLjMuMS9pbmNsdWRlL3dpbjMyCi0kIGdjYyAtc2hhcmVkIGV4YW1wbGUubyAgZXhhbXBsZV93cmFwLm8gLW1uby1jeWd3aW4gLVdsLC0tYWRkLXN0ZGNhbGwtYWxpYXMgIC1vIGV4YW1wbGUuZGxsCi0kIGNhdCBtYWluLmphdmEKLXB1YmxpYyBjbGFzcyBtYWluIHsKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZXhhbXBsZSIpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGFtcGxlLmdldE15X3ZhcmlhYmxlKCkpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGFtcGxlLmZhY3QoNSkpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGFtcGxlLmdldF90aW1lKCkpOwotICB9Ci19Ci0kIGphdmFjIG1haW4uamF2YQotJCBqYXZhIG1haW4KLTMuMAotMTIwCi1Nb24gTWFyICA0IDE4OjIwOjMxICAyMDAyCi0kCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gQnVpbGRpbmcgYSBDIyBtb2R1bGUgPC9oMz4KLVNXSUcgd2lsbCBhbHNvIGdlbmVyYXRlIGNvZGUgZm9yIGFjY2Vzc2luZyBDL0MrKyBjb2RlIGZyb20gQyMgdXNpbmcgUEludm9rZS4gSGVyZSBpcyBhbiBleGFtcGxlIGJ1aWxkaW5nIGEgQyMgbW9kdWxlIChzaG93biBmb3IgTGludXgsIHNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3N3aWcuY3MudWNoaWNhZ28uZWR1L2NnaS1iaW4vd2lraS5wbD9Td2lnRmFxL1NoYXJlZExpYnJhcmllcyI+U1dJRyBXaWtpIFNoYXJlZCBMaWJyYXJpZXM8L2E+IHBhZ2UgZm9yIGhlbHAgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcykuIEl0IHVzZXMgdGhlIG9wZW4gc291cmNlIDxhIGhyZWY9Imh0dHA6Ly93d3cuc291dGhlcm4tc3Rvcm0uY29tLmF1L3BvcnRhYmxlX25ldC5odG1sIj5Eb3RHTlUgUG9ydGFibGUuTkVUPC9hPiBDIyBjb21waWxlciB3aGljaCBydW5zIG9uIG1vc3QgVW5peCBzeXN0ZW1zLCBidXQgd29ya3MgZXF1YWxseSB3ZWxsIHVzaW5nIG90aGVyIEMjIGNvbXBpbGVyczoKLQotPGJsb2NrcXVvdGU+PHByZT4KLSQgc3dpZyAtY3NoYXJwICBleGFtcGxlLmkKLSQgZ2NjIC1jIC1mcGljICBleGFtcGxlLmMgZXhhbXBsZV93cmFwLmMKLSQgZ2NjIC1zaGFyZWQgZXhhbXBsZS5vICBleGFtcGxlX3dyYXAubyAgIC1vIGxpYmV4YW1wbGUuc28KLSQgY3NjYyAtbyBydW5tZSAqLmNzCi0kIGNhdCBydW5tZS5jcwotdXNpbmcgU3lzdGVtOwotcHVibGljIGNsYXNzIHJ1bm1lIHsKLSAgICBzdGF0aWMgdm9pZCBNYWluKCkgewotICAgICAgICBDb25zb2xlLldyaXRlTGluZShleGFtcGxlLk15X3ZhcmlhYmxlKTsKLSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXhhbXBsZS5mYWN0KDUpKTsKLSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXhhbXBsZS5nZXRfdGltZSgpKTsKLSAgICB9Ci19Ci0kIGlscnVuIHJ1bm1lCi0zCi0xMjAKLVR1ZSBNYXkgMTMgMTA6NDU6NDUgMjAwMwotCi0kCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxoMz4gU1dJRyBmb3IgdGhlIHRydWx5IGxhenkgPC9oMz4KLQotQXMgaXQgdHVybnMgb3V0LCBpdCBpcyBub3QgYWx3YXlzIG5lY2Vzc2FyeSB0byB3cml0ZSBhIHNwZWNpYWwgaW50ZXJmYWNlCi1maWxlLiAgSWYgeW91IGhhdmUgYSBoZWFkZXIgZmlsZSwgeW91IGNhbiBvZnRlbiBqdXN0IGluY2x1ZGUgaXQgZGlyZWN0bHkgaW4gdGhlCi1TV0lHIGludGVyZmFjZS4gRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSVtb2R1bGUgZXhhbXBsZQotJXsKLS8qIEluY2x1ZGVzIHRoZSBoZWFkZXIgaW4gdGhlIHdyYXBwZXIgY29kZSAqLwotI2luY2x1ZGUgImhlYWRlci5oIgotJX0KLQotLyogUGFyc2UgdGhlIGhlYWRlciBmaWxlIHRvIGdlbmVyYXRlIHdyYXBwZXJzICovCi0laW5jbHVkZSAiaGVhZGVyLmgiCi08L3ByZT4KLTwvYmxvY2txdW90ZT4KLQotQWx0ZXJuYXRpdmVseSwgc29tZSBwZW9wbGUgbWlnaHQganVzdCBpbmNsdWRlIFNXSUcgZGlyZWN0aXZlcyBpbiBhIGhlYWRlcgotZmlsZSB3aXRoIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLiAgRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLSNpZmRlZiBTV0lHCi0lbW9kdWxlIGV4YW1wbGUKLSV7Ci0jaW5jbHVkZSAiaGVhZGVyLmgiCi0lfQotI2VuZGlmCi0KLWV4dGVybiBpbnQgZmFjdChpbnQgbik7Ci0uLi4KLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi08aDM+IFJ1bm5pbmcgU1dJRyB1bmRlciBNaWNyb3NvZnQgV2luZG93cyA8L2gzPgotCi1TV0lHIGFsc28gd29ya3MgcGVyZmVjdGx5IHdlbGwgdW5kZXIgYWxsIGtub3duIDMyIGJpdCB2ZXJzaW9ucyBvZgotV2luZG93cyBpbmNsdWRpbmcgOTUvOTgvTlQvMjAwMC9YUC4gIFNXSUcgaXMgdHlwaWNhbGx5IGludm9rZWQgZnJvbQotdGhlIGNvbW1hbmQgcHJvbXB0IGFuZCBjYW4gYmUgdXNlZCB3aXRoIE5NQUtFLiAgTW9kdWxlcyBhcmUgdHlwaWNhbGx5Ci1jb21waWxlZCBpbiB0aGUgZm9ybSBvZiBhIERMTCB0aGF0IGNhbiBiZSBkeW5hbWljYWxseSBsb2FkZWQgaW50byBUY2wsCi1QeXRob24sIG9yIHdoYXRldmVyIGxhbmd1YWdlIHlvdSBhcmUgdXNpbmcuICBXaXRoIGEgbGl0dGxlIHdvcmssIFNXSUcKLWNhbiBhbHNvIGJlIHVzZWQgYXMgYSBjdXN0b20gYnVpbGQgb3B0aW9uIHdpdGhpbiBNUyBEZXZlbG9wZXIgU3R1ZGlvLgotCi08aDM+VGhhdCdzIGl0ICh3ZWxsLCBtb3JlIG9yIGxlc3MpPC9oMz4KLQotVGhhdCdzIGFib3V0IGV2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdyB0byBnZXQgc3RhcnRlZC4gSGVyZSdzIHRoZSBzaG9ydCBjaGVja2xpc3QgOgotCi08dWw+Ci08bGk+IE1ha2Ugc3VyZSB5b3Ugc3BlY2lmeSBhIG1vZHVsZSBuYW1lLgotPGxpPiBVc2UgQU5TSSBDL0MrKyBzeW50YXgKLTxsaT4gRmlndXJlIG91dCBob3cgdG8gY29tcGlsZSBhIHNoYXJlZCBsaWJyYXJ5IG1vZHVsZSAvIGR5bmFtaWMgbGluayBsaWJyYXJ5IChtYXkgcmVxdWlyZSByZWFkaW5nIGEgZmV3IG1hbiAKLXBhZ2VzIGZvciB5b3VyIGNvbXBpbGVyKS4KLTxsaT4gUmVsYXguCi08L3VsPgotCi08aDM+U3VyZWx5IHRoZXJlJ3MgbW9yZSB0byBpdC4uLjwvaDM+Ci0KLVRoZSBhYm92ZSBleGFtcGxlIGlzIGludGVudGlvbmFsbHkgc2ltcGxlLCBidXQgdGhlIGdlbmVyYWwgaWRlYQotZXh0ZW5kcyB0byBtb3JlIGNvbXBsaWNhdGVkIEMvQysrIHByb2dyYW1taW5nIHRhc2tzLiAgSW4gZmFjdCwgaXQgaXMKLWltcG9ydGFudCB0byBrbm93IHRoYXQgU1dJRyBpcyBhIGZhaXJseSBjb21wbGV0ZSBDKysgY29tcGlsZXIgd2l0aAotc3VwcG9ydCBmb3IgbmVhcmx5IGV2ZXJ5IGxhbmd1YWdlIGZlYXR1cmUuICBUaGlzIGluY2x1ZGVzCi1wcmVwcm9jZXNzaW5nLCBwb2ludGVycywgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBldmVuIEMrKyB0ZW1wbGF0ZXMuCi1TV0lHIGNhbiBhbHNvIGJlIHVzZWQgdG8gcGFja2FnZSBzdHJ1Y3R1cmVzIGFuZCBjbGFzc2VzIGludG8gcHJveHkKLWNsYXNzZXMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS0tLWV4cG9zaW5nIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uYWxpdHkgaW4gYSB2ZXJ5Ci1uYXR1cmFsIG1hbm5lci4KLQotPHA+Ci1UbyBpbGx1c3RyYXRlLCBzdXBwb3NlIHlvdSB3YW50ZWQgdG8gd3JhcCB0aGUgZm9sbG93aW5nIEMrKyBkYXRhIHN0cnVjdHVyZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotLy8gcGFpci5oLiAgQSBwYWlyIGxpa2UgdGhlIFNUTAotbmFtZXNwYWNlIHN0ZCB7Ci0gICB0ZW1wbGF0ZSZsdDtjbGFzcyBUMSwgY2xhc3MgVDImZ3Q7IHN0cnVjdCBwYWlyIHsKLSAgICAgICBUMSBmaXJzdDsKLSAgICAgICBUMiBzZWNvbmQ7Ci0gICAgICAgcGFpcigpIDogZmlyc3QoVDEoKSksIHNlY29uZChUMigpKSB7IH07Ci0gICAgICAgcGFpcihjb25zdCBUMSAmYW1wO2YsIGNvbnN0IFQyICZhbXA7cykgOiBmaXJzdChmKSwgc2Vjb25kKHMpIHsgfQotICAgfTsKLX0KLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1UbyB3cmFwIHdpdGggU1dJRywgeW91IG1pZ2h0IHNwZWNpZnkgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2U6Ci0KLTxibG9ja3F1b3RlPgotPHByZT4KLS8vIHBhaXIuaSAtIFNXSUcgaW50ZXJmYWNlCi0lbW9kdWxlIHBhaXIKLSV7Ci0jaW5jbHVkZSAicGFpci5oIgotJX0KLQotLy8gSWdub3JlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0laWdub3JlIHN0ZDo6cGFpcjo6cGFpcigpOyAgICAgIAotCi0vLyBQYXJzZSB0aGUgb3JpZ2luYWwgaGVhZGVyIGZpbGUKLSVpbmNsdWRlICJwYWlyLmgiCi0KLS8vIEluc3RhbnRpYXRlIHNvbWUgdGVtcGxhdGVzCi0KLSV0ZW1wbGF0ZShwYWlyaWkpIHN0ZDo6cGFpciZsdDtpbnQsaW50Jmd0OzsKLSV0ZW1wbGF0ZShwYWlyZGkpIHN0ZDo6cGFpciZsdDtkb3VibGUsaW50Jmd0OzsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1Ob3csIGNvbXBpbGluZyAoUHl0aG9uKToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotJCBzd2lnIC1weXRob24gLWMrKyBwYWlyLmkKLSQgYysrIC1jIHBhaXJfd3JhcC5jIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjIuMQotJCBjKysgLXNoYXJlZCBwYWlyX3dyYXAubyAtbyBfcGFpci5zbwotJCBweXRob24KLVB5dGhvbiAyLjEgKCMzLCBBdWcgMjAgMjAwMSwgMTU6NDE6NDIpIAotW0dDQyAyLjk1LjIgMTk5OTEwMjQgKHJlbGVhc2UpXSBvbiBzdW5vczUKLVR5cGUgImNvcHlyaWdodCIsICJjcmVkaXRzIiBvciAibGljZW5zZSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0mZ3Q7Jmd0OyZndDsgaW1wb3J0IHBhaXIKLSZndDsmZ3Q7Jmd0OyBhID0gcGFpci5wYWlyaWkoMyw0KQotJmd0OyZndDsmZ3Q7IGEuZmlyc3QKLTMKLSZndDsmZ3Q7Jmd0OyBhLnNlY29uZAotNAotJmd0OyZndDsmZ3Q7IGEuc2Vjb25kID0gMTYKLSZndDsmZ3Q7Jmd0OyBhLnNlY29uZAotMTYKLSZndDsmZ3Q7Jmd0OyBiID0gcGFpci5wYWlyZGkoMy41LDgpCi0mZ3Q7Jmd0OyZndDsgYi5maXJzdAotMy41Ci0mZ3Q7Jmd0OyZndDsgYi5zZWNvbmQKLTgKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCmRpZmYgLS1naXQgYS9zd2lnd2ViL3R1dG9yaWFsL2V4YW1wbGVfd3JhcC5odG1sIGIvc3dpZ3dlYi90dXRvcmlhbC9leGFtcGxlX3dyYXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTExMjAwMi4uMDAwMDAwMAotLS0gYS9zd2lnd2ViL3R1dG9yaWFsL2V4YW1wbGVfd3JhcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+IDwvaGVhZD4KLTxib2R5IEJHQ09MT1I9IiNGRkZGRkYiPgotPHR0PiA8cHJlPgotCi0vKgotICogRmlsZSA6IGV4YW1wbGVfd3JhcC5jCi0gKiBUaHUgQXByICA0IDEzOjExOjQ1IDE5OTYKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IDoKLSAqIFNpbXBsaWZpZWQgV3JhcHBlciBhbmQgSW50ZXJmYWNlIEdlbmVyYXRvciAoU1dJRykKLSAqIAotICogQ29weXJpZ2h0IChjKSAxOTk1LDE5OTYKLSAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYW5kCi0gKiBUaGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gKgotICovCi0KLS8qIEltcGxlbWVudGF0aW9uIDogVENMICovCi0KLSNkZWZpbmUgSU5DTFVERV9UQ0wgICAgPHRjbC5oPgotI2RlZmluZSBJTkNMVURFX1RLICAgICA8dGsuaD4KLSNpbmNsdWRlIElOQ0xVREVfVENMCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci1zdGF0aWMgdm9pZCBfc3dpZ19tYWtlX2hleChjaGFyICpfYywgdm9pZCAqX3B0ciwgY2hhciAqdHlwZSkgewotc3RhdGljIGNoYXIgX2hleFsxNl0gPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywKLQkJCSdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKLSAgdW5zaWduZWQgbG9uZyBfcCxfczsKLSAgY2hhciAgICAgX3Jlc3VsdFsxMjhdLCAqX3I7Ci0gIF9yID0gX3Jlc3VsdDsKLSAgX3AgPSAodW5zaWduZWQgbG9uZykgX3B0cjsKLSAgaWYgKF9wID4gMCkgewotICAgICB3aGlsZSAoX3AgPiAwKSB7Ci0gICAgICAgIF9zID0gX3AgJiAweGY7Ci0gICAgICAgICooX3IrKykgPSBfaGV4W19zXTsKLSAgICAgICAgX3AgPSBfcCA+PiA0OwotICAgICB9IAotICAgICAqX3IgPSAnXyc7Ci0gICAgIHdoaWxlIChfciA+PSBfcmVzdWx0KSAqKF9jKyspID0gKihfci0tKTsKLSAgfSBlbHNlIHsKLSAgICAgc3RyY3B5KF9jLCJOVUxMIik7Ci0gIH0KLSAgaWYgKF9wdHIpIHN0cmNweShfYyx0eXBlKTsKLX0KLXN0YXRpYyBjaGFyICpfc3dpZ19nZXRfaGV4KGNoYXIgKl9jLCB2b2lkICoqcHRyLCBjaGFyICpfdCkgewotICB1bnNpZ25lZCBsb25nIF9wOwotICBjaGFyICpfdHQ7Ci0gIF9wID0gMDsKLSAgaWYgKCpfYyA9PSAnXycpIHsgCi0gICAgIF9jKys7Ci0gICAgIHdoaWxlICgqX2MpIHsKLSAgICAgICBpZiAoKCpfYyA+PSAnMCcpICYmICgqX2MgPD0gJzknKSkgX3AgPSAoX3AgPDwgNCkgKyAoKl9jIC0gJzAnKTsKLSAgICAgICBlbHNlIGlmICgoKl9jID49ICdhJykgJiYgKCpfYyA8PSAnZicpKSBfcCA9IChfcCA8PCA0KSArICgoKl9jIC0gJ2EnKSArIDEwKTsKLSAgICAgICBlbHNlIGJyZWFrOyAKLSAgICAgICBfYysrOwotICAgICB9Ci0gICAgIGlmIChfcCA9PSAwKSB7Ci0gICAgICAgICByZXR1cm4gKGNoYXIgKikgX2M7Ci0gICAgIH0KLSAgICAgX3R0ID0gX2M7Ci0gICAgIGlmIChfdCkgewotICAgICAgICBpZiAoc3RyY21wKF9jLF90KSkgcmV0dXJuIF90dDsKLSAgICAgfQotICAgICAqcHRyID0gKHZvaWQgKikgX3A7Ci0gICAgICByZXR1cm4gKGNoYXIgKikgMDsKLSAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RyY21wKF9jLCJOVUxMIikgPT0gMCkgewotICAgICAgICAgKnB0ciA9ICh2b2lkICopIDA7Ci0gICAgICAgICByZXR1cm4gKGNoYXIgKikgMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgIHJldHVybiBfYzsKLSAgfQotfQotCi0jZGVmaW5lIFNXSUdfaW5pdCAgICBXcmFwX0luaXQKLQotCi0KLQotLyogQSBUQ0xfQXBwSW5pdCgpIGZ1bmN0aW9uIHRoYXQgbGV0cyB5b3UgYnVpbGQgYSBuZXcgY29weQotICogb2YgdGNsc2guCi0gKgotICogVGhlIG1hY3JvIFdHX2luaXQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGluaXRpYWxpemF0aW9uCi0gKiBmdW5jdGlvbiBpbiB0aGUgd3JhcHBlciBmaWxlLgotICovCi0KLSNpZm5kZWYgU1dJR19SY0ZpbGVOYW1lCi1jaGFyICpTV0lHX1JjRmlsZU5hbWUgPSAifi8ubXlhcHByYyI7Ci0jZW5kaWYKLQotI2lmIFRDTF9NQUpPUl9WRVJTSU9OID09IDcgJiYgVENMX01JTk9SX1ZFUlNJT04gPj0gNAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0KLSAgVGNsX01haW4oYXJnYywgYXJndiwgVGNsX0FwcEluaXQpOwotICByZXR1cm4oMCk7Ci0KLX0KLSNlbHNlCi1leHRlcm4gaW50IG1haW4oKTsKLSNlbmRpZgotCi1pbnQgVGNsX0FwcEluaXQoVGNsX0ludGVycCAqaW50ZXJwKXsKLSAgaW50IFNXSUdfaW5pdChUY2xfSW50ZXJwICopOyAgLyogRm9yd2FyZCByZWZlcmVuY2UgKi8KLQotICBpZiAoVGNsX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIAotICAgIHJldHVybiBUQ0xfRVJST1I7Ci0KLSAgLyogTm93IGluaXRpYWxpemUgb3VyIGZ1bmN0aW9ucyAqLwotCi0gIGlmIChTV0lHX2luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpCi0gICAgcmV0dXJuIFRDTF9FUlJPUjsKLQotICB0Y2xfUmNGaWxlTmFtZSA9IFNXSUdfUmNGaWxlTmFtZTsKLSAgcmV0dXJuIFRDTF9PSzsKLX0KLQotZXh0ZXJuIGRvdWJsZSAgIE15X3ZhcmlhYmxlOwotZXh0ZXJuIGludCAgZmFjdChpbnQgICk7Ci1leHRlcm4gaW50ICBtb2QoaW50ICAsaW50ICApOwotZXh0ZXJuIGNoYXIgKiBnZXRfdGltZSgpOwotaW50IF93cmFwX3RjbF9mYWN0KENsaWVudERhdGEgY2xpZW50RGF0YSwgVGNsX0ludGVycCAqaW50ZXJwLCBpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0JIGludCAgX3Jlc3VsdDsKLQkgaW50IF9hcmcwOwotCi0JIGlmIChhcmdjICE9IDIpIHsKLQkJIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCAiV3JvbmcgIyBhcmdzICBpbnQgIDogZmFjdCBuICIsVENMX1NUQVRJQyk7Ci0JCSByZXR1cm4gVENMX0VSUk9SOwotCX0KLQkgX2FyZzAgPSAoaW50ICkgYXRvbChhcmd2WzFdKTsKLQkgX3Jlc3VsdCA9IGZhY3QoX2FyZzApOwotCSBzcHJpbnRmKGludGVycC0+cmVzdWx0LCIlbGQiLCAobG9uZykgX3Jlc3VsdCk7Ci0JIHJldHVybiBUQ0xfT0s7Ci19Ci1pbnQgX3dyYXBfdGNsX21vZChDbGllbnREYXRhIGNsaWVudERhdGEsIFRjbF9JbnRlcnAgKmludGVycCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotCSBpbnQgIF9yZXN1bHQ7Ci0JIGludCBfYXJnMDsKLQkgaW50IF9hcmcxOwotCi0JIGlmIChhcmdjICE9IDMpIHsKLQkJIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCAiV3JvbmcgIyBhcmdzICBpbnQgIDogbW9kIHggeSAiLFRDTF9TVEFUSUMpOwotCQkgcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0JIF9hcmcwID0gKGludCApIGF0b2woYXJndlsxXSk7Ci0JIF9hcmcxID0gKGludCApIGF0b2woYXJndlsyXSk7Ci0JIF9yZXN1bHQgPSBtb2QoX2FyZzAsX2FyZzEpOwotCSBzcHJpbnRmKGludGVycC0+cmVzdWx0LCIlbGQiLCAobG9uZykgX3Jlc3VsdCk7Ci0JIHJldHVybiBUQ0xfT0s7Ci19Ci1pbnQgX3dyYXBfdGNsX2dldF90aW1lKENsaWVudERhdGEgY2xpZW50RGF0YSwgVGNsX0ludGVycCAqaW50ZXJwLCBpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0JIGNoYXIgKiBfcmVzdWx0OwotCi0JIGlmIChhcmdjICE9IDEpIHsKLQkJIFRjbF9TZXRSZXN1bHQoaW50ZXJwLCAiV3JvbmcgIyBhcmdzICBjaGFyICogOiBnZXRfdGltZSAiLFRDTF9TVEFUSUMpOwotCQkgcmV0dXJuIFRDTF9FUlJPUjsKLQl9Ci0JIF9yZXN1bHQgPSBnZXRfdGltZSgpOwotCSBUY2xfU2V0UmVzdWx0KGludGVycCwgX3Jlc3VsdCwgVENMX1ZPTEFUSUxFKTsKLQkgcmV0dXJuIFRDTF9PSzsKLX0KLWludCBXcmFwX0luaXQoVGNsX0ludGVycCAqaW50ZXJwKSB7Ci0JIGlmIChpbnRlcnAgPT0gMCkgCi0JCSByZXR1cm4gVENMX0VSUk9SOwotCSBUY2xfTGlua1ZhcihpbnRlcnAsICJNeV92YXJpYWJsZSIsIChjaGFyICopICZNeV92YXJpYWJsZSwgVENMX0xJTktfRE9VQkxFKTsKLQkgVGNsX0NyZWF0ZUNvbW1hbmQoaW50ZXJwLCAiZmFjdCIsIF93cmFwX3RjbF9mYWN0LCAoQ2xpZW50RGF0YSkgTlVMTCwgKFRjbF9DbWREZWxldGVQcm9jICopIE5VTEwpOwotCSBUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsICJtb2QiLCBfd3JhcF90Y2xfbW9kLCAoQ2xpZW50RGF0YSkgTlVMTCwgKFRjbF9DbWREZWxldGVQcm9jICopIE5VTEwpOwotCSBUY2xfQ3JlYXRlQ29tbWFuZChpbnRlcnAsICJnZXRfdGltZSIsIF93cmFwX3RjbF9nZXRfdGltZSwgKENsaWVudERhdGEpIE5VTEwsIChUY2xfQ21kRGVsZXRlUHJvYyAqKSBOVUxMKTsKLQkgcmV0dXJuIFRDTF9PSzsKLX0KLQotPC9wcmU+IDwvdHQ+IDwvYm9keT4KLTwvaHRtbD4KLQotCi0KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvdHV0b3JpYWwvZXhhbXBsZV93cmFwX3Blcmw1Lmh0bWwgYi9zd2lnd2ViL3R1dG9yaWFsL2V4YW1wbGVfd3JhcF9wZXJsNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyOTE0MWExLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIvdHV0b3JpYWwvZXhhbXBsZV93cmFwX3Blcmw1Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08SFRNTD4KLTxIRUFEPgotPFRJVExFPgotU2ltcGxlIEV4YW1wbGU8L1RJVExFPgotPEJPRFkgQkdDT0xPUj0iI2ZmZmZmZiI+Ci08SDE+U2ltcGxlIEV4YW1wbGU8L0gxPgotWyBNb2R1bGUgIDogc3dpZywgUGFja2FnZSA6IHN3aWcgXTxCUj4KLQotPEhSPjxIMT4gQ29udGVudHMgPC9IMT4KLTxVTD48TEk+IDxBIEhSRUY9IiNzMV8iPjEuIE15IENvbW1hbmRzPC9BPgotPC9VTD4KLQotPEEgbmFtZT0iczFfIj4KLTxIUj48SDI+MS4gTXkgQ29tbWFuZHM8L0gyPjwvQT4KLTxQPjxUVD48Qj4kTXlfdmFyaWFibGU8L0I+PC9UVD4KLTxCTE9DS1FVT1RFPlsgR2xvYmFsIDogZG91YmxlICBNeV92YXJpYWJsZSBdCi08QlI+ICAgVGhpcyBpcyBhbiBpbnRlcmVzdGluZyB2YXJpYWJsZQotPC9CTE9DS1FVT1RFPgotCi08UD48VFQ+PEI+ZmFjdChuKTs8L0I+PC9UVD4KLTxCTE9DS1FVT1RFPlsgcmV0dXJucyBpbnQgIF0KLTxCUj4gICBDb21wdXRlcyBuIGZhY3RvcmlhbAotPC9CTE9DS1FVT1RFPgotCi08UD48VFQ+PEI+bXlfbW9kKHgseSk7PC9CPjwvVFQ+Ci08QkxPQ0tRVU9URT5bIHJldHVybnMgaW50ICBdCi08QlI+ICAgQ2FsY3VsYXRlcyB4ICUgeQotPC9CTE9DS1FVT1RFPgotCi08UD48VFQ+PEI+Z2V0X3RpbWUoKTs8L0I+PC9UVD4KLTxCTE9DS1FVT1RFPlsgcmV0dXJucyBjaGFyICogXQotPEJSPiAgIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBhcyBhIHN0cmluZyAgIAotPC9CTE9DS1FVT1RFPgotCi0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3N3aWd3ZWIvdHV0b3JpYWwvZXhhbXBsZV93cmFwX3RjbC5odG1sIGIvc3dpZ3dlYi90dXRvcmlhbC9leGFtcGxlX3dyYXBfdGNsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkM2Y0Y2UuLjAwMDAwMDAKLS0tIGEvc3dpZ3dlYi90dXRvcmlhbC9leGFtcGxlX3dyYXBfdGNsLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08SFRNTD4KLTxIRUFEPgotPFRJVExFPgotU2ltcGxlIEV4YW1wbGU8L1RJVExFPgotPEJPRFkgQkdDT0xPUj0iI2ZmZmZmZiI+Ci08SDE+U2ltcGxlIEV4YW1wbGU8L0gxPgotCi08SFI+PEgxPiBDb250ZW50cyA8L0gxPgotPFVMPjxMST4gPEEgSFJFRj0iI3MxXyI+MS4gTXkgQ29tbWFuZHM8L0E+Ci08L1VMPgotCi08QSBuYW1lPSJzMV8iPgotPEhSPjxIMj4xLiBNeSBDb21tYW5kczwvSDI+PC9BPgotPFA+PFRUPjxCPiRNeV92YXJpYWJsZTwvQj48L1RUPgotPEJMT0NLUVVPVEU+WyBHbG9iYWwgOiBkb3VibGUgIE15X3ZhcmlhYmxlIF0KLTxCUj4gICBUaGlzIGlzIGFuIGludGVyZXN0aW5nIHZhcmlhYmxlCi08L0JMT0NLUVVPVEU+Ci0KLTxQPjxUVD48Qj5mYWN0IG4gPC9CPjwvVFQ+Ci08QkxPQ0tRVU9URT5bIHJldHVybnMgaW50ICBdCi08QlI+ICAgQ29tcHV0ZXMgbiBmYWN0b3JpYWwKLTwvQkxPQ0tRVU9URT4KLQotPFA+PFRUPjxCPm15X21vZCB4IHkgPC9CPjwvVFQ+Ci08QkxPQ0tRVU9URT5bIHJldHVybnMgaW50ICBdCi08QlI+ICAgQ2FsY3VsYXRlcyB4ICUgeQotPC9CTE9DS1FVT1RFPgotCi08UD48VFQ+PEI+Z2V0X3RpbWUgPC9CPjwvVFQ+Ci08QkxPQ0tRVU9URT5bIHJldHVybnMgY2hhciAqIF0KLTxCUj4gICBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgYXMgYSBzdHJpbmcgICAKLTwvQkxPQ0tRVU9URT4KLQotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9zd2lnd2ViL3kyay5odCBiL3N3aWd3ZWIveTJrLmh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmE2ZDBlLi4wMDAwMDAwCi0tLSBhL3N3aWd3ZWIveTJrLmh0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotU1dJRzJLCi0KLTxwPjxpbWcgc3JjPSJpbWFnZXMveTJrLnBuZyIgYWx0PSJZMksiPgotCi08cD4KLVNXSUcgZG9lcyBub3QgdXNlIHRoZSBkYXRlIGFuZCBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IFkySy4KLUhvd2V2ZXIsIGxpa2UgYW55IGRldmVsb3BtZW50IHRvb2wsIFNXSUcgd2lsbCBub3QgcHJldmVudCB5b3UgZnJvbQotY3JlYXRpbmcgYSBidWdneSBhcHBsaWNhdGlvbi4gIFNXSUcgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGZvbGxvd2luZwotdGVybXMgOgotCi08cHJlPgotCi1JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SLCBUSEUgVU5JVkVSU0lUWSBPRiBDQUxJRk9STklBLCBUSEUgCi1VTklWRVJTSVRZIE9GIFVUQUggT1IgRElTVFJJQlVUT1JTIE9GIFRISVMgU09GVFdBUkUgQkUgTElBQkxFIFRPIEFOWQotUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTiwKLUVWRU4gSUYgVEhFIEFVVEhPUlMgT1IgQU5ZIE9GIFRIRSBBQk9WRSBQQVJUSUVTIEhBVkUgQkVFTiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLVRIRSBBVVRIT1IsIFRIRSBVTklWRVJTSVRZIE9GIENBTElGT1JOSUEsIEFORCBUSEUgVU5JVkVSU0lUWSBPRiBVVEFICi1TUEVDSUZJQ0FMTFkgRElTQ0xBSU0gQU5ZIFdBUlJBTlRJRVMsSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIAotVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotUFVSUE9TRS4gVEhFIFNPRlRXQVJFIFBST1ZJREVEIEhFUkVVTkRFUiBJUyBPTiBBTiAiQVMgSVMiIEJBU0lTLCBBTkQgCi1USEUgQVVUSE9SUyBBTkQgRElTVFJJQlVUT1JTIEhBVkUgTk8gT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLAotU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgotPC9wcmU+Cg==