RGFuaWVsICgxOSBEZWNlbWJlcikKLSBDVVJMT1BUX0lQUkVTT0xWRSB3YXMgbm90IHBvc3NpYmxlIHRvIHNldC4KCi0gR2lzbGUgVmFuZW0gdXBkYXRlZCB0aGUgZGpncHAgYnVpbGQgZmlsZXMuCgpEYW5pZWwgKDE4IERlY2VtYmVyKQotIEpvaG4gTWNHb3dhbiByZXBvcnRlZCBhIHJlZGlyZWN0LXByb2JsZW0gdGhhdCBoYXBwZW5lZCBpZiBhIHNpdGUgdXNlZCBhIFVSTAogIGxpa2UgInVybC5jb20/dmFyPWNvbnRlbnQiICh3aXRob3V0IGEgcHJvcGVyIHNsYXNoKSBhbmQgZnJvbSB0aGF0IGFkZHJlc3MKICByZWRpcmVjdGVkIHRoZSB1c2VyLWFnZW50IHRvIGFuIGFic29sdXRlIGRpcmVjdG9yeS4KCi0gRGF2aWQgQnlyb24gbWFkZSBsaWJjdXJsIGJ1aWxkIGZpbmUgd2l0aCBib3RoIHRoZSAuTkVUIGFuZCBWQzYgdmVyc2lvbnMgb2YKICBNU1ZDCgpEYW5pZWwgKDE2IERlY2VtYmVyKQotIFVwZGF0ZWQgdGVzdCA1MDYgc2luY2UgaXQgc3RhcnRlZCB0byBmYWlsIGFmdGVyIHRoZSBjYWNoZSBwcnVuZSBjaGFuZ2UKICB5ZXN0ZXJkYXkuIEkgYWxzbyBjaGFuZ2VkIGl0IHNsaWdodGx5IHRvIGZlYXR1cmUgYSBjb3VudGVyIGluIGVhY2ggZGVidWcKICBvdXRwdXQgZm9yIGVhc2llciB0cmFjaW5nLgoKRGFuaWVsICgxNSBEZWNlbWJlcikKLSBPbGQgRE5TIGNhY2hlIGVudHJpZXMgYXJlIG5vdyBvbmx5IHBydW5lZCBhZnRlciBjdXJsIGlzIGRvbmUgd2l0aCBhIHJlcXVlc3QsCiAgYW5kIG5vdCBpbiB0aGUgYWN0dWFsIG5hbWUgcmVzb2x2ZSBjYWxsLgoKLSBjb3JyZWN0ZWQgdGhlIC0tZW5hYmxlLWFyZXMgcGF0Y2gKCi0gR2l1c2VwcGUgQXR0YXJkaSBmb3VuZCBhbmQgZml4ZWQgYSBwcm9ibGVtIHdpdGhpbiBsaWJjdXJsIHRoYXQgcmUtdXNlZAogIGFscmVhZHkgZnJlZWQgbWVtb3J5LgoKRGFuaWVsICgxMCBEZWNlbWJlcikKLSBHaXNsZSBWYW5lbSByZXBvcnRlZCB0aGF0IHRoZSBkaWN0IHN1cHBvcnQgd2FzIGJyb2tlbi4gSSBicm9rZSBpdCBkdXJpbmcgbXkKICBmdHBzLWNoYW5nZXMgb3ZlcmhhdWwuIEkndmUgbm93IGFkZGVkIGEgJ2N1cmxhc3NlcnQnIGZ1bmN0aW9uIHRoYXQgY2FuIGJlCiAgdXNlZCB0byB2ZXJpZnkgZXhwcmVzc2lvbnMsIHRvIHByZXZlbnQgZnV0dXJlIGVycm9ycyBvZiB0aGUgc2FtZQogIGtpbmQuIFRoZXkncmUgb25seSBwcmVzZW50IGluIGRlYnVnLWJ1aWxkcy4KCi0gRGllZ28gQ2Fzb3JyYW4gbWFkZSBjdXJsIGFuZCBsaWJjdXJsIHBvc3NpYmxlIHRvIGJ1aWxkIG5hdGl2ZWx5IChubyBtb3JlCiAgbmVlZCBmb3IgdGhlIGl4ZW11bCBsaWJyYXJ5KSBvbiBBbWlnYU9TLgoKLSBEb21pbmljayBNZWdsaW8gbWFkZSBjb25maWd1cmUgLS1lbmFibGUtYXJlcyBzdXBwb3J0IGEgZ2l2ZW4gcGF0aCB0byB0aGUKICBpbnN0YWxsZWQgYXJlcyBsaWIsIGluc3RlYWQgb2YgYWx3YXlzIHVzaW5nIGl0IGluIHRoZSBjdXJsIHNvdXJjZSB0cmVlLgogIFRoaXMgYWxzbyBmaXhlZCB0aGUgY3VybC1jb25maWcgLS1saWJzIG91dHB1dC4KCi0gRXJpYyBTLiBSYXltb25kIHBhdGNoZWQgYSB2ZXJ5IG1pbm9yIG1hbiBwYWdlIGZvcm1hdCBlcnJvciBpbgogIGxpYmN1cmwtZXJyb3JzLjMKCkRhbmllbCAoOCBEZWNlbWJlcikKLSBGaXhlZCB0aGUgZmxhdyB0aGF0IG1hZGUgLWx6IGFwcGVhciB0d2ljZSBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUuCgotIEFmdGVyIGNvcnJlc3BvbmRlbmNlIHdpdGggR2lzbGUgVmFuZW0sIEkgY2hhbmdlZCB0aGUgJ2Nvbm5lY3Rpb24gYWJvcnRlZCcKICBlcnJvciB0ZXh0IHdoZW4gdGhlIEZUUCByZXNwb25zZSByZWFkZXIgZmFpbGVkIHRvIG1vcmUgc3BlY2lmaWNseSBpZGVudGlmeQogIHdoYXQgdGhlIHByb2JsZW0gaXMuCgotIEJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBEb21pbmljayBNZWdsaW8sIGN1cmwtY29uZmlnIC0tZmVhdHVyZSBub3cgb3V0cHV0cwogICdBc3luY2hETlMnIGFzIGEgZmVhdHVyZSBpZiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoIGFyZXMuIFRoZSBmZWF0dXJlIG5hbWUKICBpcyB0aGUgc2FtZSB0aGF0ICdjdXJsIC1WJyBvdXRwdXRzLCBmb3Igc2ltcGxpY2l0eS4KCkRhbmllbCAoMyBEZWNlbWJlcikKLSBNYXJ0eSBLdWhydCBtYWRlIHRoZSBidWlsZCB1cC10by1kYXRlIG9uIFZNUywgYW5kIG1vdmVkIG1vc3Qgb2YgdGhlIFZNUy0KICBzcGVjaWZpYyBzdHVmZiBpbiB0aGUgY2xpZW50IGNvZGUgdG8gYSBzZXBhcmF0ZSBoZWFkZXIgZmlsZS4KCi0gU3RldmUgR3JlZW4gZml4ZWQgYSByZXR1cm4gY29kZSBidWcgaW4gQ3VybF9yZXNvbHYoKSwgdGhhdCBtYWRlIHRoZSBzb2NrczUKICBjb2RlIGZhaWwuCgotIHN3YWxrYXVzIGF0IHlhaG9vLmNvbSBwYXRjaGVkIGxpYmN1cmwgdG8gaWdub3JlIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXJzCiAgd2hlbiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCBpcyB1c2VkLCBhcyBtYW5kYXRlZCBieSBSRkMyNjE2LgoKRGFuaWVsICgyIERlY2VtYmVyKQotIC0tZnRwLXBhc3Ygd2FzIGFkZGVkLCB3aGljaCBzZXJ2ZXMgdGhlIG9ubHkgcHVycG9zZSBvZiBvdmVycmlkaW5nIGEKICBwcmV2aW91c2x5IHNldCAtLWZ0cHBvcnQgb3B0aW9uLiBTdGFydGluZyBub3csIC0tZnRwLXBvcnQgaXMgYSByZWNvZ25pemVkCiAgYWxpYXMgZm9yIC0tZnRwcG9ydCBmb3IgY29uc2lzdGVuY3kuCgotIEdpdXNlcHBlIEF0dGFyZGkgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaG91bGQgdXNlIE1TR19OT1NJR05BTCB3aGVuIHdlIHVzZQogIHNlbmQoKSBhbmQgcmVjdigpLiBJIGFkZGVkIGNoZWNrcyBmb3IgdGhlIGRlZmluZSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQKICBhZGp1c3RlZCB0aGUgY29kZSBhY2NvcmRpbmdseS4gSWYgdGhlIHN5bWJvbCBpcyBwcmVzZW50LCB3ZSB3b24ndCBhdHRlbXB0CiAgdG8gaWdub3JlIHRoZSBTSUdQSVBFIHNpZ25hbC4KCkRhbmllbCAoMSBEZWNlbWJlcikKLSBNYXRoaWFzIEF4ZWxzc29uIHNldCB1cCBhIGJzZGZ0cGQtc3NsIHNlcnZlciBmb3IgbWUgYW5kIEkgY291bGQgbWFrZSBjdXJsCiAgcnVuIGZpbmUgYWdhaW5zdCBpdHMgRlRQUyBpbXBsZW1lbnRhdGlvbi4gTm93IHRoZXNlIEZUUFMtcmVsYXRlZCB0aGluZ3MKICB3b3JrOgogICBvIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBGVFBTCiAgIG8gYWN0aXZlIChQT1JUKSBhbmQgcGFzc2l2ZSAoUEFTVikKICAgbyB1cGxvYWQgYW5kIGRvd25sb2FkCiAgIG8gdmVyaWZpZWQgYWdhaW5zdCBic2RmdHBkLXNzbCBhbmQgUmFpZGVuRlRQRAoKRGFuaWVsICgyNyBOb3ZlbWJlcikKLSBKYW1lcyBDbGFuY3kgbWFkZSB0aGUgQm9ybGFuZCBNYWtlZmlsZXMgdXAgdG8gZGF0ZS4KCi0gTWFya3VzIE1vZWxsZXIgaW1wcm92ZWQgdGhlIFNQTkVHTyBkZXRlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgpEYW5pZWwgKDI1IE5vdmVtYmVyKQotIERhdmUgTWF5IGZpbGVkIGJ1ZyByZXBvcnQgIzg0ODM3MSwgaWRlbnRpZnlpbmcgdGhhdCBpZiB5b3UnZCBkbyBQT1NUIG92ZXIgYQogIHByb3h5IHRvIGEgaHR0cHMgc2VydmVyLCBsaWJjdXJsIGRpZG4ndCBQT1NUIGF0IGFsbCwgaXQganVzdCBtYWRlIGEgR0VUISBJdAogIHR1cm5lZCBvdXQgdG8gYmUgYmVjYXVzZSBsaWJjdXJsIHdyb25nbHkgZGlkbid0IGNvbnNpZGVyIHRoZSBhdXRoZW50aWNhdGlvbgogICJuZWdvdGlhdGlvbiBwaGFzZSIgdG8gYmUgY29tcGxldGUgeWV0LgoKICBJIGFkZGVkIHRlc3QgY2FzZSA5NSB0byB2ZXJpZnkgbXkgZml4IGZvciB0aGlzLgoKRGFuaWVsICgyNCBOb3ZlbWJlcikKLSBUaGFua3MgdG8gTWF0aGlhcyBBeGVsc3NvbiwgSSd2ZSBiZWVuIGFibGUgdG8gd29yayBvbiBGVFBTIGZvciBsaWJjdXJsIGFuZCBpdAogIHNlZW1zIHRvIHdvcmsgc29tZXdoYXQgZmluZSBub3cuCgogIFRoZSBGVFBTIHN0dWZmIGlzIGJhc2VkIG9uIFJGQzIyMjggYW5kIHRoZSBtdXJyYXktYXV0aC1mdHAtc3NsIGRyYWZ0CiAgKHZlcnNpb24gMTIpLiBUaGVyZSBzZWVtcyB0byBleGlzdCBxdWl0ZSBhIGZldyBzZXJ2ZXJzIHRoYXQgaGF2ZSBpbXBsZW1lbnRlZAogIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGlzLgoKICBXZSBjYW4gbm93IHVzZSBmdHBzOi8vIFVSTHMgdG8gZXhwbGljaXRseSBzd2l0Y2ggb24gU1NML1RTTCBmb3IgdGhlIGNvbnRyb2wKICBjb25uZWN0aW9uIGFuZCB0aGUgZGF0YSBjb25uZWN0aW9uIChkZWFsaW5nIHdpdGggdHdvIFNTTCBjb25uZWN0aW9ucyBmb3JjZWQKICBtZSB0byBjaGFuZ2UgYSBsb3Qgb2Ygc3R1ZmYgaW4gbGliY3VybCkuCgogIEFsdGVybmF0aXZlbHksIGFuZCB3aGF0IHNlZW1zIHRvIGJlIHRoZSByZWNvbW1lbmRlZCB3YXksIHdlIGNhbiBzZXQgdGhlIG5ldwogIG9wdGlvbiBDVVJMT1BUX0ZUUF9TU0wgdG8gb25lIG9mIHRoZXNlIHZhbHVlczoKCiAgICAgQ1VSTEZUUFNTTF9OT1BFLCAgIC0gZG8gbm90IGF0dGVtcHQgdG8gdXNlIFNTTAogICAgIENVUkxGVFBTU0xfVFJZICAgICAtIHRyeSB1c2luZyBTU0wsIHByb2NlZWQgYW55d2F5IG90aGVyd2lzZQogICAgIENVUkxGVFBTU0xfQ09OVFJPTCAtIFNTTCBmb3IgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBvciBmYWlsCiAgICAgQ1VSTEZUUFNTTF9BTEwgICAgIC0gU1NMIGZvciBhbGwgY29tbXVuaWNhdGlvbiBvciBmYWlsCgogIEFueSBmYWlsdXJlIHRvIHNldCB0aGUgZGVzaXJlZCBsZXZlbCB3aWxsIG1ha2UgbGliY3VybCBmYWlsIHdpdGggdGhlIGVycm9yCiAgY29kZSBDVVJMRV9GVFBfU1NMX0ZBSUxFRC4gVGhpcyBuZXcgb3B0aW9uIG1ha2VzIGEgIm5vcm1hbCIgZnRwOi8vIHRyYW5zZmVyCiAgYXR0ZW1wdCB0byBiZSBtYWRlIHNlY3VyZWx5LgoKICBJJ3ZlIGJlZW4gYWJsZSB0byBsb2dpbiBhbmQgZ2V0IGZpbGVzIChwYXNzaXZlbHkpIGZyb20gTWF0aGlhcycgc2VydmVyIHVzaW5nCiAgYm90aCBmdHBzOi8vIGFuZCBDVVJMT1BUX0ZUUF9TU0wuIChJJ3ZlIG1hZGUgJ2N1cmwnIHVuZGVyc3RhbmQgdGhlIC0tZnRwLXNzbAogIG9wdGlvbiB0aGF0IHNldHMgQ1VSTEZUUFNTTF9UUlkuKQoKLSBHYXogSXFiYWwgZml4ZWQgYSByYW5nZSBzdHJpbmcgbWVtb3J5IGxlYWsuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBXaW5kb3dzIGJ1aWxkcy4KCi0gQWRkZWQgdGhlIG5ldyBGVFBTU0wgZGVmaW5lcyBpbiBjdXJsL2N1cmwuaAoKRGFuaWVsICgyMCBOb3ZlbWJlcikKLSBKb3NoIEthcGVsbCBmaWxlZCBidWcgcmVwb3J0ICM4NDUyNDcgYXMgaGUgZm91bmQgYW4gZW5kbGVzcyBsb29wIHdoZW4KICBnZXR0aW5nIGEgNDA3IGJhY2sgZnJvbSBhIHByb3h5IHdoZW4gbm8gdXNlcitwYXNzd29yZCB3YXMgZ2l2ZW4uIEFkZGVkIHRlc3QKICBjYXNlIDk0IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxOSBOb3ZlbWJlcikKLSBLZXZpbiBSb3RoIGZpeGVkIGEgcHJvZ3Jlc3MtYmFyIHByb2JsZW0gb24gV2luZG93cy4KCi0gV2hpbGUgd29ya2luZyB3aXRoIE5pY29sYXMgQ3JvaXNldCdzIGJ1ZyByZXBvcnQgIzg0MzczOSwgSSBub3RpY2VkIHR3byBtaW5vcgogIHByb2JsZW1zIHJlbGF0ZWQgdG8gZnRwIHBhcnRpYWwgZG93bmxvYWRzOiBpZiBhIHBhcnRpYWwgdHJhbnNmZXIgaXMKICBkZXRlY3RlZCwgd2UgbXVzdCBjbG9zZSB0aGUgY29ubmVjdGlvbiBhcyB3ZSBjYW5ub3Qga25vdyBpbiB3aGF0IHN0YXRlIGl0IGlzCiAgYW55bW9yZS4gVGhpcyBsb29rcyBsaWtlIGEgUHJvRlRQRCBidWc6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDAzLTExLzAwNzkuaHRtbAoKRGFuaWVsICgxNyBOb3ZlbWJlcikKLSBNYWNpZWogVy4gUm96eWNraSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IHVzZSBhIGNhY2hlIHZhcmlhYmxlIGZvciB0aGUKICB3cml0YWJsZSBhcmd2IHRlc3QuIFRoaXMgd2F5LCB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBiZXR0ZXIgKGZvcgogIGNyb3NzLWNvbXBpbGVzIGV0YykKCkRhbmllbCAoMTUgTm92ZW1iZXIpCi0gTWF0aGlhcyBBeGVsc3NvbiBmb3VuZCBvdXQgbGliY3VybCBzb21ldGltZXMgZnJlZWQgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZQogIHR3aWNlLCBsZWFkaW5nIHRvIGNyYXNoZXMhCgpEYW5pZWwgKDE0IE5vdmVtYmVyKQotIFNpZGRoYXJ0aGEgUHJha2FzaCBKYWluIGZvdW5kIGEgY2FzZSB3aXRoIGEgYmFkIHJlc29sdmUgdGhhdCB3ZSBkaWRuJ3QKICBwcm9wZXJseSBiYWlsIG91dCBmcm9tLCB3aGVuIHVzaW5nIGFyZXMuCgpEYW5pZWwgKDEzIE5vdmVtYmVyKQotIERlZmF1bHQgQ29udGVudC1UeXBlIGZvciBwYXJ0cyBpbiBtdWx0aXBhcnQgZm9ybXBvc3RzIGhhcyBjaGFuZ2VkIHRvCiAgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIuICBUaGlzIHNlZW1zIG1vcmUgYXBwcm9wcmlhdGUsIGFuZCBJIGJlbGlldmUKICBtb3ppbGxhIGFuZCB0aGUgbGlrZXMgZG8gdGhpcy4gSW4gdGhlIHNhbWUgYXJlYTogLmh0bWwgZmlsZXMgbm93IGdldAogIHRleHQvaHRtbCBhcyBDb250ZW50LVR5cGUuIChQb2ludGVkIG91dCBpbiBidWcgcmVwb3J0ICM4Mzk4MDYpCgotIEdpc2xlIFZhbmVtIGNvcnJlY3RlZCB0aGUgLS1wcm9ncmVzcy1iYXIgb3V0cHV0IGJ5IGRvaW5nIGEgZmx1c2ggb2YgdGhlCiAgb3V0cHV0LCB3aGljaCBhcHBhcmVudGx5IG1ha2VzIGl0IGxvb2sgYmV0dGVyIG9uIGF0IGxlYXN0IHdpbmRvd3MsIGJ1dAogIHBvc3NpYmx5IG90aGVyIHBsYXRmb3JtcyB0b28uCgotIFBldGVyIFN5bHZlc3RlciBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiB0aGUgY29ubmVjdCBjb2RlLCB3aGljaCBtYWRlIHRoZQogIG11bHRpIGludGVyZmFjZSBvbiBhIGlwdjYtZW5hYmxlZCBzb2xhcmlzIGJveCBkbyBiYWQuIFRlc3QgY2FzZSA1MDQgdG8gYmUKICBzcGVjaWZpYy4gSSd2ZSBzcGVudCBzb21lIHRpbWUgdG8gY2xlYW4tdXAgdGhlIEN1cmxfY29ubmVjdGhvc3QoKSBmdW5jdGlvbgogIG5vdyB0byB1c2UgbGVzcyBkdXBsaWNhdGVkIGNvZGUgZm9yIHRoZSB0d28gZGlmZmVyZW50IHNlY3Rpb25zOiBpcHY2IGFuZAogIGlwdjQuCgpEYW5pZWwgKDExIE5vdmVtYmVyKQotIEFkZGVkIENVUkxPUFRfTkVUUkNfRklMRS4gVXNlIHRoaXMgdG8gdGVsbCBsaWJjdXJsIHdoaWNoIGZpbGUgdG8gdXNlIGluc3RlYWQKICBvZiB0cnlpbmcgdG8gZmluZCBhIC5uZXRyYyBpbiB0aGUgY3VycmVudCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuIFRoZQogIGV4aXN0aW5nIC5uZXRyYyBmaWxlIGZpbmRlciBpcyBzb21ld2hhdCBuYWl2ZSBhbmQgaXMgZmFyIGZyb20gcGVyZmVjdCBvbgogIHNldmVyYWwgcGxhdGZvcm1zIHRoYXQgYXJlbid0IHVuaXgtc3R5bGUuIElmIHRoaXMgb3B0aW9uIGlzbid0IHNldCB3aGVuCiAgQ1VSTE9QVF9ORVRSQyBpcyBzZXQsIHRoZSBwcmV2aW91cyBhcHByb2FjaCB3aWxsIHN0aWxsIGJlIHVzZWQuCgogIFRoZSBjdXJyZW50IC5uZXRyYyBjaGVjayBjb2RlIG5vdyBhbHNvIHN1cHBvcnQgbG9uZ2VyIHRoYW4gMjU2IGJ5dGVzIHBhdGgKICBuYW1lcy4KCkRhbmllbCAoMTAgTm92ZW1iZXIpCi0gS2FuZy1KaW4gTGVlIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGdlbmVyYXRlZCBjYS1idW5kbGUuaCBmaWxlIHNob3VsZG4ndCBiZQogIHdyaXR0ZW4gaW4gdGhlIHNvdXJjZSBkaXIgaWYgYSBkaWZmZXJlbnQgYnVpbGQgZGlyIGlzIHVzZWQuCgotIEFmdGVyIFPpYmFzdGllbiBXaWxsZW1pam5zJyBidWcgcmVwb3J0LCB3ZSBub3cgY2hlY2sgdGhlIHNlcGFyYXRvcnMgcHJvcGVybHkKICBpbiB0aGUgMjI5LXJlcGx5IHNlcnZlcnMgcmVzcG9uZCBvbiBhIEVQU1YgY29tbWFuZCBhbmQgYmFpbCBvdXQgYmV0dGVyIGlmCiAgdGhlIHJlcGx5IHN0cmluZyBpcyBub3QgUkZDMjQyOC1jb21wbGlhbnQuCgpEYW5pZWwgKDcgTm92ZW1iZXIpCi0gQmFzZWQgb24gR2lzbGUgVmFuZW0ncyBwYXRjaCwgSSBtYWRlIGN1cmwgdHJ5IGhhcmRlciB0byBnZXQgdGhlIGhvbWUKICBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgdXNlciwgaW4gb3JkZXIgdG8gZmluZCB0aGUgZGVmYXVsdCAuY3VybHJjIGZpbGUuCiAgV2UncmUgYWxzbyBjb25zaWRlcmluZyBtb3Zpbmcgb3V0IHRoZSBIT01FLWRpciBjb2RlIGZyb20gbGliY3VybCwgYW5kCiAgaW5zdGVhZCBoYXZlIHRoZSBhcHAgcGFzcyBpbiB0aGUgcGF0aCB0byB0aGUgLm5ldHJjIGZpbGUgKHdoaWNoIGlzIHRoZSBvbmx5CiAgbG9naWMgbGVmdCBpbiBsaWJjdXJsIHRoYXQgdXNlcyB0aGUgSE9NRSBkaXIpLiBUaGVuIGN1cmwgY2FuIHVzZSB0aGUgaG9tZQogIGRpciBmb3IgdGhhdCBwdXJwb3NlIHRvby4KCi0gUmFscGggTWl0Y2hlbGwncyB1cGRhdGVkIHRlc3RjdXJsLnNoIHRvIHRoZSBzY3JpcHQgdG8gdGFrZSBhbiBleGlzdGluZwogIGRpcmVjdG9yeSBuYW1lIGFuZCBidWlsZC9ydW4vdGVzdCBjdXJsIGluIHRoZXJlIGluc3RlYWQgb2YgdHJ5aW5nIHRvIHVwZGF0ZQogIGZyb20gQ1ZTLiBVc2luZyB0aGlzIGFwcHJvYWNoLCB0aGUgc2NyaXB0IGNhbiBub3cgYmUgdXNlZCB0byB0ZXN0IGRhaWx5CiAgdGFyYmFsbHMgZXRjLgoKLSBHaXNsZSBWYW5lbSBhZGRlZCBhICJyZXNvdXJjZSBmaWxlIiB0byB0aGUgV2luZG93cyBETEwgYnVpbGRzLCB0byBjb250YWluCiAgaW5mb3JtYXRpb24gc3VjaCBhcyB2ZXJzaW9uIG51bWJlciwgbGlicmFyeSBuYW1lLCBjb3B5cmlnaHQgaW5mbyBldGMuCgpEYW5pZWwgKDYgTm92ZW1iZXIpCi0gY3VybCBjaGVja3MgaWYgdGhlIGV4aXN0aW5nIGxpYmN1cmwgc3VwcG9ydHMgdGhpbmdzIGxpa2UgLS1udGxtLCAtLW5lZ290aWF0ZQogIGFuZCAtLWtyYjQgYW5kIHJldHVybnMgZXJyb3IgaWYgbm90LgoKLSBJIGFkZGVkIHRocmVlIG5ldyBnbG9iYWwgZGVmaW5lcyBpbiB0aGUgY3VybC9jdXJsLmggaGVhZGVyOgogIExJQkNVUkxfVkVSU0lPTl9NQUpPUiwgTElCQ1VSTF9WRVJTSU9OX01JTk9SIGFuZCBMSUJDVVJMX1ZFUlNJT05fUEFUQ0guIFRoZXkKICBhcmUgdGhlIHRocmVlIG51bWJlcnMgaW4gdGhlIGxpYnJhcnkncyB2ZXJzaW9uIG51bWJlciwgc2VwYXJhdGVkIGZvciBlYXNpZXIKICB1c2FnZS4gJ21ha2V0Z3onIHdhcyB1cGRhdGVkIGFjY29yZGluZ2x5IHRvIGdlbmVyYXRlIHRoZXNlIG51bWJlcnMgcHJvcGVybHkKICB3aGVuIGJ1aWxkaW5nIHJlbGVhc2UtYXJjaGl2ZXMuCgotIFVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgZml4LCByZXBvcnRlZCBieSBib3RoIE1hcnR5IEt1aHJ0IGFuZCBCZW5qYW1pbgogIEdlcmFyZC4KCi0gTWF0dCBWZWVuc3RyYSBwcm92aWRlZCBidWlsZCBmaWxlcyB0byBidWlsZCBsaWJjdXJsIGFzIGEgImZyYW1ld29yayIgdW5kZXIKICBNYWMgT1MgWC4gU2VlIHRoZSBsaWIvbGliY3VybC5mcmFtZXdvcmsubWFrZSBmb3IgZGV0YWlscy4KCi0gUmVtb3ZlZCB0aGUgZGVmaW5lcyBvZiBUUlVFIGFuZCBGQUxTRSBmcm9tIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXIgZmlsZS4KICBUaGV5J3JlIG5vdCBpbiBvdXIgbmFtZSBzcGFjZSBzbyB3ZSBzaG91bGQgbm90IGZpZGRsZSB3aXRoIHRoZW0uCgpEYW5pZWwgKDUgTm92ZW1iZXIpCi0gUmVwbGFjZWQgdGhlIG1hbiBwYWdlIHRvIEhUTUwgY29udmVydGVyIHByb2dyYW0gd2l0aCBhIG5ldyBvbmU6IHJvZmZpdC4KICBNYWtlcyBuaWNlciB3ZWIgcGFnZXMuCgpEYW5pZWwgKDQgTm92ZW1iZXIpCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZpeGVkIHRoZSBNU1ZDIG1ha2VmaWxlcyB0byBsZXQgdGhlbSBidWlsZCBjdXJsIGZpbmUKICBvbiBXaW5kb3dzLgoKLSBLZXZpbiBSb3RoIGNvcnJlY3RlZCB0aGUgY3lnd2luIHBhY2thZ2UgZ2VuZXJhdG9yIGFuZCBzcGVsbC1maXhlZCB0aGUKICBjb21tZW50IGluIHRoZSBjYS1idW5kbGUuaCBmaWxlLgoKVmVyc2lvbiA3LjEwLjggKDEgTm92ZW1iZXIgMjAwMykKCkRhbmllbCAoMzEgT2N0b2JlcikKLSBBc3N1bWUgdGhhdCBNRFRNIG9uIGFuIEZUUCBzZXJ2ZXIgcmV0dXJucyB0aGUgdGltZXN0YW1wIHVzaW5nIHRoZSBVVEMgdGltZQogIHpvbmUuIFRoaXMgY2hhbmdlcyB0aGUgdGltZSBDVVJMSU5GT19GSUxFVElNRSByZXR1cm5zIGZvciBhIGdpdmVuIGZpbGUgb3ZlcgogIEZUUCwgYW5kIHdpbGwgY2hhbmdlIGV4aXN0aW5nIHVzZXMgb2YgQ1VSTE9QVF9USU1FQ09ORElUSU9OLiBJdCB3aWxsIG1ha2UKICB0aGUgZnVuY3Rpb25hbGl0eSBtb3JlIHNpbWlsYXIgdG8gaG93IHRoZSBIVFRQIG9uZSBpcyBhbHJlYWR5IHdvcmtpbmcuCgotIENvbW1hbmQgbGluZSBvcHRpb25zIHRoYXQgdGFrZSBudW1lcmljYWwgcGFyYW1ldGVycyAoc3VjaCBhcyAteSwgLVksIC1DIGV0YykKICBub3cgcmVwb3J0IGVycm9yIGFuZCBleGl0IGlmIHRoZSBwYXJhbWV0ZXIgaXNuJ3QgdHJ1bHkgYSBudW1iZXIgZ3JlYXRlciB0aGFuCiAgb3IgZXF1YWwgdG8gemVyby4gVGhpcyBoZWxwcyB1c2VycyB0byBub3RpY2UgYmFkIHVzYWdlIGVhcmxpZXIuIEJlZm9yZSwgd2hlbgogIGEgdXNlciBmb3Jnb3Qgb3IgbWlzc2VkIHRvIGFkZCBhIG51bWVyaWNhbCBwYXJhbWV0ZXIgdG8gYW4gb3B0aW9uLCB0aGUKICBjb21tYW5kIGxpbmUgcGFyc2VyIHdvdWxkIHNpbXBseSAiZWF0IiB0aGUgZm9sbG93aW5nIG9wdGlvbiBhbmQgaXQgd291bGQKICBjYXVzZSBncmVhdCBjb25mdXNpb24uCgpEYW5pZWwgKDMwIE9jdG9iZXIpCi0gRGF2aWQgSHVsbCBtYWRlIGxpYmN1cmwgZGVhbCB3aXRoIE5PQk9EWSBhbmQgSEVBREVSIGZvciBmaWxlOi8vIHRoZSBzYW1lIHdheQogIGl0IGFscmVhZHkgZG9lcyBmb3IgRlRQOiBpdCBwcm92aWRlcyBIVFRQLWxvb2tpbmcgaGVhZGVycyB0aGF0IHByb3ZpZGUgaW5mbwogIG9ubHkgYWJvdXQgdGhlIGZpbGUsIHdpdGhvdXQgZG9pbmcgdGhlIGFjdHVhbCB0cmFuc2Zlci4gVGhlIGN1cmwgdG9vbCB0aGVuCiAgbGV0cyAtLWhlYWQgZG8gdGhpcy4KCkRhbmllbCAoMjkgT2N0b2JlcikKLSBydW50ZXN0cy5wbCBub3cgY2hlY2tzIGZvciBhbmQgdXNlIHZhbGdyaW5kIGlmIHByZXNlbnQuIEl0IHdpbGwgcmVkaXJlY3QgdGhlCiAgdmFsZ3JpbmQgcmVzdWx0cyBpbiBsb2cvdmFsZ3JpbmRbbnVtXSBidXQgaXQgY3VycmVudGx5IGRvZXNuJ3Qgc2NhbiB0aGF0CiAgZmlsZSBmb3IgYW55IGVycm9ycyBvciBhbnl0aGluZywgdGhhdCBpcyBzdGlsbCBvbmx5IG1hZGUgbWFudWFsbHkuCgotIERhdmlkIEh1bGwgbWFkZSB0aGUgZmlsZTogVVJMIHBhcnNlciBhbHNvIGFjY2VwdCB0aGUgc29tZXdoYXQgc2xvcHB5IGZpbGUKICBzeW50YXg6IGZpbGU6L3BhdGguIEkgYWRkZWQgdGVzdCBjYXNlIDIwMyB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMjggT2N0b2JlcikKLSBEYW4gQyB0cmFja2VkIGRvd24geWV0IGFub3RoZXIgd2VpcmQgYmVoYXZpb3IgaW4gdGhlIGdsaWJjIGdldGhvc3RieW5hbWVfcigpCiAgZnVuY3Rpb24gZm9yIHNvbWUgc3BlY2lmaWMgdmVyc2lvbnMgKHJlcG9ydGVkIG9uIDIuMi41IGFuZCAyLjEuMSksIGFuZAogIHByb3ZpZGVkIGEgZml4LiBPbiBMaW51eCBtYWNoaW5lcyB3aXRoIHRoZXNlIGdsaWJjIHZlcnNpb25zLCBub24taXB2NgogIGJ1aWxkcyBvZiBsaWJjdXJsIHdvdWxkIG9mdGVuIGZhaWwgdG8gcmVzb2x2ZSBwZXJmZWN0bHkgcmVzb2x2YWJsZSBob3N0CiAgbmFtZXMuCgpEYW5pZWwgKDI2IE9jdG9iZXIpCi0gSmFtZXMgQnVyc2EgZm91bmQgb3V0IHRoYXQgY3VybF9tc25wcmludGYoKSBjb3VsZCB3cml0ZSB0aGUgdHJhaWxpbmcKICB6ZXJvLWJ5dGUgb3V0c2lkZSBpdHMgZ2l2ZW4gYnVmZmVyIHNpemUuIFRoaXMgY291bGQgaGFwcGVuIGlmIHlvdSBnZW5lcmF0ZWQKICBhIHZlcnkgbG9uZyBlcnJvciBtZXNzYWdlIGFzIHRoZW4gbGliY3VybCB3b3VsZCBvdmVyd3JpdGUgdGhlIEVSUk9SQlVGRkVSCiAgd2l0aCBvbmUgYnl0ZS4gVXNpbmcgYSBub24tZXhpc3RpbmcgdmVyeSBsb25nIGxvY2FsIGZpbGU6Ly8gbmFtZSBpcyBvbmUgY2FzZQogIHRoYXQgY291bGQgbWFrZSB0aGlzIG9jY3VyLgoKRGFuaWVsICgyNCBPY3RvYmVyKQotIERhdmlkIEh1bGwgZmlsZWQgYnVnIHJlcG9ydCAjODI5ODI3LiBJdCBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aXRoIC1DIC0gaWYKICB0aGUgZnVsbCBmaWxlIGFscmVhZHkgd2FzIGRvd25sb2FkZWQgYW5kIHRodXMgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhCiAgNDE2LiBsaWJjdXJsIHdvdWxkIHRoZW4gd3JvbmdseSB1c2UgdGhlIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIgYW5kIGV4cGVjdAogIHRoYXQgc2l6ZSB0byBnZXQgdHJhbnNmZXIsIGNhdXNpbmcgYSAiaGFuZyIgdW50aWwgdGhlIHNlcnZlciBjbG9zZWQgdGhlCiAgY29ubmVjdGlvbiBhbmQgdGhlbiBhbiBlcnJvciAxOCAoInN0aWxsIE4gYnl0ZXMgZGF0YSBsZWZ0IG9mIHRoZSB0cmFuc2ZlciIpLgoKICBOb3cgd2UgZG9uJ3QgcmV0dXJuIGFueSBlcnJvciBhdCBhbGwsIGJ1dCBJIHRoaW5rIGxpYmN1cmwgc2hvdWxkIHBlcmhhcHMKICByZXR1cm4gc29tZSBraW5kIG9mIGluZm8gc2luY2UgdGhlIHJlcXVlc3RlZCByYW5nZSB3YXMgb3V0IG9mIHRoZSBzaXplIG9mCiAgdGhlIGRvY3VtZW50LgoKLSBCYXNlZCBvbiBEYXZpZCBIdWxsJ3MgZml4IGluIGJ1ZyByZXBvcnQgIzgwNDU5OSwgd2Ugbm93IGNoZWNrIGZvciBzb2xhcmlzIGFuZAogIGdjYyBpbiBjb25maWd1cmUgYW5kIHNldCB0aGUgLW1pbXB1cmUtdGV4dCBsaW5rIGZsYWcgZm9yIGxpbmtpbmcgdGhlIGxpYgogIGJldHRlci4KCi0gSSd2ZSBpbnRyb2R1Y2VkIGEgLXQgb3B0aW9uIHRvIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQuIFdpdGggdGhhdCBvcHRpb24gc2V0LAogIHRoZSBzY3JpcHQgcnVucyBzcGVjaWFsICJtZW1vcnkgdG9ydHVyZSIgdGVzdHMuIEZvciBlYWNoIHRlc3QgY29tbWFuZCBsaW5lCiAgaW4gdGhhdCBzZWN0aW9uLCB0aGUgc2NyaXB0IGZpcnN0IHJ1bnMgdGhlIGNvbW1hbmQgbGluZSBhbmQgY291bnRzIHRoZSB0b3RhbAogIGFtb3VudCBvZiBhbGxvY2F0aW9ucyBtYWRlLiBJdCB0aGVuIHJ1bnMgdGhlIGV4YWN0IHNhbWUgY29tbWFuZCBsaW5lIGFnYWluLAogIGZvcmNpbmcgYWxsb2NhdGlvbiBudW1iZXIgTiB0byBmYWlsLiBJdCB3aWxsIHRyeSBldmVyeSBOIGZyb20gMSB0byB0aGUgdG90YWwKICBudW1iZXIgb2YgYW1vdW50cyBtYWRlLiBGb3IgZXZlcnkgaW52b2tlLCBpdCBjaGVja3MgdGhhdCBubyBtZW1vcnkgd2FzCiAgbGVha2VkIGFzIHRoYXQgd291bGQgaW5kaWNhdGUgYSBiYWQgY2xlYW51cCBzb21ld2hlcmUgaW4gdGhlIGNvZGUuCgogIFRoaXMgaXMganVzdCBiZWdpbm5pbmcgdG8gd29yaywgYW5kIEkndmUgYWxyZWFkeSBtYWRlIHNvbWUgY29ycmVjdGlvbnMgaW4KICBsaWJjdXJsIGNvZGUuIFdoZW4gdGhpcyBjb2RlIHdvcmtzIHNvbWV3aGF0IGZpbmUsIEknbGwgbWFrZSBzdXJlICdtYWtlIHRlc3QnCiAgaW4gdGhlIHJvb3QgZGlyIHdpbGwgcnVuIHRoZXNlIHRlc3RzIGFzIHdlbGwuCgpEYW5pZWwgKDIzIE9jdG9iZXIpCi0gR2VvcmcgSG9ybiBmaXhlZCBob3cgdGhlIENBIHZlcmlmaWNhdGlvbiBpcyBtYWRlLiBWZXJpZmljYXRpb25zIGNhbiBub3cgYmUKICBtYWRlIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgdGhlIHJlc3VsdCBvZiBpdCBjYW4gYmUgaWdub3JlZC4gVGhpcyBhbHNvCiAgYWZmZWN0cyB0aGUgY3VybCB0b29sIGFzIC1rIGNhbiBub3cgYmUgdXNlZCB0b2dldGhlciB3aXRoIC0tY2FjZXJ0IG9yCiAgLS1jYXBhdGguCgpEYW5pZWwgKDIyIE9jdG9iZXIpCi0gR2lzbGUgVmFuZW0gZm91bmQgb3V0IC0tZGlzYWJsZS1lcHJ0IGRpZG4ndCB3b3JrIGFuZCBwYXRjaGVkIGl0LgoKLSBUZXN0IGNhc2UgOTEgd2FzIG1vZGlmaWVkIGFuZCBjb3VsZCBub3cgcmVwZWF0IHRoZSBwcm9ibGVtIEtldmluIFJvdGggaGFzCiAgcmVwb3J0ZWQsIGFuZCB0aGUgYnVnIHdhcyBmaXhlZC4KCi0gRHlsYW4gRWxsaWNvdHQgYWRkZWQgdmMtbGliY3VybC1zc2wtZGxsIGFzIGEgdGFyZ2V0IHRvIHRoZSByb290IG1ha2VmaWxlCiAgdG8gYnVpbGQgYSBzdGF0aWMgbGliY3VybCB0aGF0IGxpbmtzIHdpdGggYSBzaGFyZWQgT3BlblNTTCB1c2luZyBNU1ZDLgoKRGFuaWVsICgyMSBPY3RvYmVyKQotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3czMiBtYWtlZmlsZXMuCgpWZXJzaW9uIDcuMTAuOC1wcmU1ICgyMSBPY3RvYmVyIDIwMDMpCgpEYW5pZWwgKDE5IE9jdG9iZXIpCi0gR2VvcmcgSG9ybiBtYWRlIGxpYmN1cmwgb3V0cHV0IG1vcmUgaW5mbyBvbiBTU0wgZmFpbHVyZXMgd2hlbiByZWNlaXZpbmcKICBkYXRhLgoKVmVyc2lvbiA3LjEwLjgtcHJlNCAoMTggT2N0b2JlciAyMDAzKQoKRGFuaWVsICgxNyBPY3RvYmVyKQotIERvbWluaWNrIE1lZ2xpbyBpbXBsZW1lbnRlZCBDVVJMT1BUX01BWEZJTEVTSVpFIGFuZCAtLW1heC1maWxlc2l6ZS4KCi0gTWFkZSBsaWJjdXJsIHNob3cgdmVyYm9zZSBpbmZvIGFib3V0IHdoYXQgYXV0aCB0eXBlIGFuZCB1c2VyIG5hbWUgdGhhdCBpcwogIGJlaW5nIHNlbnQgaW4gaXRzIEhUVFAgcmVxdWVzdC1oZWFkZXJzLgoKRGFuaWVsICgxNiBPY3RvYmVyKQotIFJlbW92ZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9QQVNTV0RGVU5DVElPTiBhbmQgQ1VSTE9QVF9QQVNTV0REQVRBLiBsaWJjdXJsCiAgbm8gbG9uZ2VyIHByb21wdCBmb3IgcGFzc3dvcmRzIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLiBQYXNzd29yZCBwcm9tcHRpbmcKICB3YXMgaW5zdGVhZCBtb3ZlZCB0byBjdXJsLCB3aGljaCBub3cgcHJvbXB0cyBmb3IgcGFzc3dvcmQgaWYgLXUgb3IgLVUgbGFjawogIGl0LiBUaGlzIHNvbHZlcyB0aGUgcHJvYmxlbSBLZXZpbiBSb3RoIHJlcG9ydGVkIHdoZW4gY3VybCBwcm9tcHRlZCBmb3IKICBwYXNzd29yZCB0d2ljZSB3aGVuIGRvaW5nIE5UTE0gYXV0aGVudGljYXRpb24uCgotIEkgcmV3cm90ZSB0aGUgU1NMIHN1YmplY3RBbHROYW1lIGNoZWNrIHRvIGF2b2lkIGhhdmluZyB0byByZWx5IG9uIE9wZW5MREFQLQogIGxpY2Vuc2VkIGRlcml2YXRlIGNvZGUuCgpEYW5pZWwgKDE1IE9jdG9iZXIpCi0gQXZvaWQgZG9pbmcgZ2V0c29ja29wdCgpIG9uIFdpbmRvd3MgdG8gdmVyaWZ5IGNvbm5lY3RzLiBJdCBzZWVtcyB0aGF0IHRoaXMKICBob2dzIFdpbmRvd3MgbWFjaGluZXMgd2hlbiBsaWJjdXJsIGlzIGJlaW5nIHVzZWQgbXVsdGktdGhyZWFkZWQgKHdpdGggPiB+NTAKICB0aHJlYWRzKS4gQW5kcmV3IEZ1bGxlciBoZWxwZWQgdXMgdmVyaWZ5IGFuZCB0ZXN0IHRoaXMuCgpEYW5pZWwgKDE0IE9jdG9iZXIpCi0gS2ltbW8gS2lubnVuZW4gZml4ZWQgYSBjcmFzaCB3aXRoIGR1cGhhbmRsZSgpIHdoZW4gQ1VSTERFQlVHIGlzIHNldC4KCi0gR2lzbGUgVmFuZW0gbWFkZSBsaWJjdXJsIGJ1aWxkIGFuZCB3b3JrIHdpdGggSVB2NiBvbiBXaW5kb3dzLgoKRGFuaWVsICgxMyBPY3RvYmVyKQotIEdpdXNlcHBlIEF0dGFyZGkgcmVwb3J0ZWQgeWV0IGFub3RoZXIgc2VnZmF1bHQgd2l0aCBhcmVzIGFuZCB0aGUgbXVsdGkKICBpbnRlcmZhY2UuIE1lIGZpeGVkLgoKLSBEb21lbmljbyBBbmRyZW9saSByZW1vdmVkIHRoZSBleHRyYSBMREZMQUdTIGFzc2lnbm1lbnQgaW4gbGliL01ha2VmaWxlLmFtCiAgdGhhdCB3YXMgcmVwb3J0ZWQgYWJvdXQgaW4gdGhlIGRlYmlhbiBidWcgcmVwb3J0ICMyMTIwODYuCgogIERvbWVuaWNvIGFsc28gZml4ZWQgdHdvIG1ha2VmaWxlcyB3aGVyZSB3ZSB1c2VkICdnbnJvZmYnIGluc3RlYWQgb2YgdGhlIG1vcmUKICBwb3J0YWJsZSAkKE5ST0ZGKS4KCkRhbmllbCAoMTIgT2N0b2JlcikKLSBEaXJrIE1hbnNrZSBtYWRlIHRoZSBzaGFyZSBsb2NraW5nIGFyb3VuZCBETlMgbG9va3VwcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8KICBhbGxvdyB0aGUgc2hhcmUgc3lzdGVtJ3MgRE5TIGxvb2t1cHMgdG8gcnVuIHNvbWV3aGF0IG1vcmUKICBpbmRlcGVuZGVudC9mYXN0ZXIuCgpEYW5pZWwgKDkgT2N0b2JlcikKLSBMYWNobGFuIE8nRGVhIGZpeGVkIGEgcmVzdW1lIHByb2JsZW06ICJJZiBJIHNldCBDVVJMT1BUX1JFU1VNRV9GUk9NLCBwZXJmb3JtCiAgYW4gSFRUUCBkb3dubG9hZCwgdGhlbiByZXNldCBDVVJMT1BUX1JFU1VNRV9GUk9NIHRvIDAsIHRoZSBuZXh0IGRvd25sb2FkCiAgc3RpbGwgaGFzIGEgUmFuZ2UgaGVhZGVyIHdpdGggYSBnYXJiYWdlIHZhbHVlLiIgYnVnIHJlcG9ydCAjODIwNTAyCgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIHRoZSBpbmV0X3B0b24uYyBmaWxlIGJ1aWxkIGZpbmUgdXNpbmcgTVNWQy4KCi0gVGhlICdzd3MnIHRlc3Qgc3VpdGUgd2ViIHNlcnZlciBub3cgI2luY2x1ZGUgc2V0dXAuaCBmcm9tIHRoZSBsaWIgZGlyZWN0b3J5LgogIFRoaXMgbWFrZXMgaXQgbW9yZSBwb3J0YWJsZSBlYXNpZXIuCgpWZXJzaW9uIDcuMTAuOC1wcmUzICg4IE9jdG9iZXIgMjAwMykKCkRhbmllbCAoOCBPY3RvYmVyKQotIEZyYW5rIFRpY2hlbGVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBmaXhlcyBob3cgbGliY3VybCBjb25uZWN0cyB0byBtdWx0aXBsZQogIGFkZHJlc3NlcywgaWYgb25lIG9mIHRoZW0gZmFpbHMgKGlwdjQtY29kZSkuCgpEYW5pZWwgKDcgT2N0b2JlcikKLSBOZWlsIER1bmJhciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgY2hlY2sgU1NMCiAgc3ViamVjdEFsdE5hbWVzIHdoZW4gbWF0Y2hpbmcgY2VydHMuIFRoaXMgaXMgYXBwYXJlbnRseSBkZXRhaWxlZCBpbiBSRkMyODE4CiAgYXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiBJIGhhZCB0byBhZGQgY29uZmlndXJlIGNoZWNrcyBmb3IgaW5ldF9wdG9uKCkgYW5kCiAgb3VyIG93biAoc3RyaWN0bHkgc3BlYWtpbmcsIGNvZGUgZnJvbSBCSU5EIHdyaXR0ZW4gYnkgUGF1bCBWaXhpZSkgcHJvdmlkZWQKICBjb2RlIGZvciB0aGUgZnVuY3Rpb24gZm9yIHBsYXRmb3JtcyB0aGF0IG1pc3MgaXQuCgotIEhUVFAgUE9TVCB1c2luZyB0aGUgcmVhZCBjYWxsYmFjayBkaWRuJ3Qgd29yaywgYXMgRmxvcmlhbiBTY2hvcHBtYW5uCiAgcmVwb3J0ZWQuCgpEYW5pZWwgKDUgT2N0b2JlcikKLSBTaGFyZWQgcHJvdmlkZWQgYSBmZXcgZml4ZXMgdG8gbWFrZSBsaWJjdXJsIGJ1aWxkIG9uIEJlT1MKICBvdXQtb2YtdGhlLWJveC4gTmV3IGNvZGUgZm9yIEJlT1Mtc3R5bGUgbm9uLWJsb2NraW5nIHNvY2tldHMsIHByb3ZpZGVkIGJ5CiAgU2hhcmQgYW5kIEplcmVteSBGcmllc25lci4gTW9kaWZpZWQgdGhlIGF1dG9jb25mIGNoZWNrIGZvciBub24tYmxvY2tpbmcKICBzb2NrZXRzIHRvIGNoZWNrIGZvciB0aGlzIGtpbmQgdG9vLgoKRGFuaWVsICg0IE9jdG9iZXIpCi0gVmluY2VudCBCcm9ubmVyIHBvaW50ZWQgb3V0IHRoYXQgaWYgeW91IHNldCBDVVJMT1BUX0NPT0tJRSBmb3IgYSB0cmFuc2ZlcgogIGFuZCB0aGVuIHNldCBpdCB0byBOVUxMIGluIGEgc3Vic2VxdWVudCBvbmUsIHRoZSBwcmV2aW91cyBjb29raWUgd2FzIHN0aWxsCiAgc2VudCBvZmYhCgotIEpvbiBUdXJuZXIgZml4ZWQgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gaXQgZmFpbGVkIG9uIGFuIEZUUCB0cmFuc2ZlciBkdWUKICB0byBhIGJhZCBwYXRoLCBpdCB3b3VsZCBjYXVzZSB0aGUgbmV4dCB0cmFuc2ZlciB0byB1c2UgYSBiYWQgcGF0aCBhcyB3ZWxsLgoKLSBTaWRkaGFydGhhIFByYWthc2ggSmFpbiBwcm92aWRlZCBhIHBhdGNoIHdpdGggYSBmaXggZm9yIGxpYmN1cmwgd2l0aCBhcmVzLAogIHdoZW4gd29ya2luZyBvbiBJUC1vbmx5IG5hbWVzIGFzIHdlIHRoZW4gY291bGQgcmV0dXJuICJ3YWl0IiBzdGF0dXMgd2hlbiB0aGUKICBuYW1lIGluIGZhY3QgYWxyZWFkeSB3YXMgcmVzb2x2ZWQuIEkgZWRpdGVkIHRoZSBwYXRjaCBzbGlnaHRseSB0byBub3QgZXhwb3NlCiAgYXN5bmNoIGRldGFpbHMgdG8gbm9uLWFyZXMgYXdhcmUgc291cmNlIGNvZGUuCgpEYW5pZWwgKDMgT2N0b2JlcikKLSBOZWlsIFNwcmluZyBwb3N0ZWQgdGhlIGRlYmlhbiBidWcgcmVwb3J0ICMyMTMxODAsIGFuZCBwb2ludGVkIG91dCB0aGF0IHVzaW5nCiAgdGhlIG5hbWUgJ2FjY2VzcycgaW4gYSBmdW5jdGlvbiBwcm90b3R5cGUgaXMgbm90IHZlcnkgd2lzZSBhcyBzb21lIGNvbXBpbGVycwogIGNvbXBsYWluLgoKLSBQZXRlciBTeWx2ZXN0ZXIgcHJvdmlkZWQgaGlzIGFuZCBKZWFuLVBhdWwgTWVybGluJ3MgY3VybHguYyBleGFtcGxlIHNvdXJjZQogIGNvZGUgdGhhdCBzaG93cyBob3cgdGhleSB1c2Ugc3NsIGFuZCBjYWxsYmFja3MuCgpEYW5pZWwgKDIgT2N0b2JlcikKLSBKYW1lcyBNYWNNaWxsYW4ncyBwYXRjaCBtYWtlcyBjdXJsIGJ1aWxkIG9uIFFOWCA2LjIueC4KCkRhbmllbCAoMjYgU2VwdGVtYmVyKQotIE15IGRhdWdodGVyIHdhcyBib3JuIQoKRGFuaWVsICgyMyBTZXB0ZW1iZXIpCi0gQWRkZWQgc3VwcG9ydCBmb3IgLTQvLS1pcHY0IGFuZCAtNi8tLWlwdjYgdG8gZm9yY2UgbmFtZXMgdG8gcmVzb2x2ZSB0byB0aGF0CiAgcGFydGljdWxhciBJUCB2ZXJzaW9uLiBUaGV5IG9ubHkgd29yayBmb3IgSVB2Ni1lbmFibGVkIGxpYmN1cmxzLgoKLSBjdXJsIC1WIG5vdyBvdXRwdXRzICdTUE5FR08nIGFzIGEgZmVhdHVyZSBpbiBjYXNlIGxpYmN1cmwgd2FzIGJ1aWx0IHRvCiAgc3VwcG9ydCB0aGF0LgoKVmVyc2lvbiA3LjEwLjgtcHJlMiAoMjIgU2VwdGVtYmVyIDIwMDMpCgpEYW5pZWwgKDIyIFNlcHRlbWJlcikKLSBHaXVzZXBwZSBBdHRhcmRpIGZvdW5kIGEgc2VnZmF1bHQgaW4gbGliY3VybCB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UKICB3aXRoIGFyZXMgYW5kIGRvaW5nIHJlcGVhdGVkIG9wZXJhdGlvbnMgYWdhaW5zdCBhIG5vbi1yZXNvbHZpbmcgaG9zdCBuYW1lLgoKRGFuaWVsICgxOSBTZXB0ZW1iZXIpCi0gQWRkZWQgdGhlIENVUkxPUFRfSVBSRVNPTFZFIG9wdGlvbiwgdGhhdCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gc2VsZWN0CiAgd2hhdCBraW5kIG9mIElQIGFkZHJlc3NlcyBoZSB3YW50cyB0byB1c2Ugd2hlbiByZXNvbHZpbmcgaG9zdCBuYW1lcy4gVGhpcwogIGlzIG9ubHkgaW50ZXJlc3Rpbmcgd2hlbiB1c2luZyBob3N0IG5hbWVzIHRoYXQgcmVzb2x2ZSBhZGRyZXNzZXMgdXNpbmcgbW9yZQogIHRoYW4gb25lIHZlcnNpb24gb2YgSVAuCgotIEFwcGxpZWQgTWFya3VzIE1vZWxsZXIncyBwYXRjaCB0aGF0IGludHJvZHVjZXMgU1BORUdPIHN1cHBvcnQgaWYgbGliY3VybAogIGlzIGJ1aWx0IHdpdGggdGhlIEZCb3BlbnNzbCBsaWJyYXJpZXMuIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMKICBpbmZvIG9uIFNQTkVHTyBhdmFpbGFiaWxpdHkuIFRoZSBwYXRjaCBhbHNvIG1hZGUgdGhlIEdTU0FQSSBzdHVmZiB3b3JrIGZpbmUKICB3aXRoIHRoZSBNSVQgR1NTLWxpYnJhcnkgKHRoZSBIZWltZGFsIG9uZSBzdGlsbCB3b3JrcyB0b28pLgoKRGFuaWVsICgxNiBTZXB0ZW1iZXIpCi0gRG9pbmcgUFVUIHdpdGggLS1kaWdlc3QgZmFpbGVkLCBhcyByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICM4MDU4NTMuCgotIFVzaW5nIC0tYW55YXV0aCB0aGF0IHBpY2tlZCBOVExNLCBhbmQgdGhlbiBhIHJlZGlyZWN0IGNsb3NlZCB0aGUgY29ubmVjdGlvbgogIGFuZCB0b29rIGN1cmwgdG8gYSBzZWNvbmQgTlRMTSBwYWdlIG1hZGUgY3VybCBmYWlsLiBCdWcgcmVwb3J0ICM4MDYzMjgKICBpZGVudGlmaWVkIHRoZSBwcm9ibGVtLCB0ZXN0IGNhc2UgOTAgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxNCBTZXB0ZW1iZXIpCi0gY29kZW1hc3RyIGJyb3VnaHQgYSBwYXRjaCBmb3IgYXJlcyB0byBtYWtlIHRoZSBXaW5kb3dzIHBvcnRpb25zIG9mIGl0IHdvcmsKICBwcm9wZXJseSBvbiBOVDQuIEkgdXBsb2FkZWQgYSBuZXcgZGlmZiBhbmQgdXBkYXRlZCB0aGUgZG9jcyBvbiB3aGVyZSB0byBnZXQKICBpdCBldGMuCgotIEplZmYgUG9obG1leWVyIHRyYWNrZWQgZG93biBhIHZlcnkgaGFyZC10by1maW5kIGJ1ZyB3aGVyZSB3ZSByZW1vdmVkIGEKICBjYWNoZWQgRE5TIGVudHJ5IGV2ZW4gdGhvdWdoIGl0IG1heSBiZSBpbiB1c2UsIHdoaWNoIGNhdXNlZCAicmFuZG9tIiBtZW1vcnkKICB0byBnZXQgb3ZlcndyaXR0ZW4gYW5kIHRodXMgInJhbmRvbSIgY3Jhc2hlcy4KCkRhbmllbCAoMTIgU2VwdGVtYmVyKQotIEJhc2VkIG9uIGEgYnVnIHJlcG9ydCBieSBEYXZpZCBLaW1kb24sIEkgbWFkZSB0aGUgcnVudGVzdHMucGwgc2NyaXB0IGNsZWFyCiAgYWxsIHBvc3NpYmxlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcyBiZWZvcmUgdGhlIHRlc3RzIGFyZSBydW4uCgotIEJ5IGRlZmF1bHQsIGVhc3kgaGFuZGxlcyB3aXRoaW4gYSBtdWx0aSBoYW5kbGUgbm93IHNoYXJlIEROUyBjYWNoZS4KCi0gVGltIEJhcnRsZXkgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIEdTU05FR09USUFURSBvcHRpb24gd29yayBmb3IKICBNaWNyb3NvZnQncyAiTmVnb3RpYXRlIiBhdXRoZW50aWNhdGlvbiBhcyB3ZWxsLgoKRGFuaWVsICgxMSBTZXB0ZW1iZXIpCi0gQSB6ZXJvLWxlbmd0aCBwcm94eSBzdHJpbmcgY29uZnVzZWQgRlRQIHRyYW5zZmVycy4KCi0gQmpvcm4gUmVlc2UgZm91bmQgYSBjYXNlIHdpdGggYW4gdW5pbml0aWFsaXplZCBwb2ludGVyLCBvbmx5IHByZXNlbnQgd2hlbgogIGJ1aWx0IGZvciBhcmVzLgoKVmVyc2lvbiA3LjEwLjgtcHJlMSAoOCBTZXB0ZW1iZXIgMjAwMykKCkRhbmllbCAoNyBTZXB0ZW1iZXIpCi0gSnVyaWogU21ha292IGZvdW5kIG91dCB0aGF0IHRoZSBub24tT3BlblNTTCBNRDUgY29kZSB3YXMgbm90IHdvcmtpbmcgb24KICBBbHBoYSAob3IgaWE2NCkuIE9ubHkgdGhlIE9wZW5TU0wtdmVyc2lvbiBkaWQuIEkgbWFkZSBhIGZpeCBJIHRoaW5rIGNvcnJlY3RzCiAgdGhlIHByb2JsZW0uIAoKRGFuaWVsICg1IFNlcHRlbWJlcikKLSBLZXZpbiBGaXNrIHJlcG9ydGVkIHRoYXQgY29uZmlndXJlIC0tZW5hYmxlLXRocmVhZCBkaWRuJ3Qgd29yay4gSSBmaXhlZC4KCi0gRGUtbWFjcm9maWVkIHRoZSBsaWIvaGFzaC5jIHNvdXJjZSBjb2RlIHNvbWV3aGF0LgoKRGFuaWVsICg0IFNlcHRlbWJlcikKLSBDVVJMSU5GT19IVFRQQVVUSF9BVkFJTCBhbmQgQ1VSTElORk9fUFJPWFlBVVRIX0FWQUlMIGFkZGVkLCBCYXNlZCBvbiBKb2VyZwogIE11ZWxsZXItVG9saydzIHBhdGNoLAoKRWFybHkgKDQgU2VwdGVtYmVyKQotIEFkZGVkIENVUkxPUFRfRlRQX1JFU1BPTlNFX1RJTUVPVVQgLSBhbGxvd3MgdXNlciB0byBzZXQgc3RyaWN0IHRpbWVvdXQKICByZXF1aXJlbWVudHMgb24gdGhlIEZUUCBzZXJ2ZXIncyBhYmlsaXR5IHRvIHJlc3BvbmQgdG8gaW5kaXZpZHVhbCBjb21tYW5kcwogIHdpdGhvdXQgcGxhY2luZyBnbG9iYWwgcmVxdWlyZW1lbnRzIG9uIHRyYW5zZmVyIG9yIGNvbm5lY3QgdGltZS4gIEZpbGVzCiAgYWZmZWN0ZWQ6CiAgICAtIGluY2x1ZGUvY3VybC9jdXJsLmgKICAgICAgICBBZGRlZCBvcHRpb24gQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVAogICAgLSBsaWIvZnRwLmMKICAgICAgICBBZGRlZCBicmFuY2ggaW5zaWRlIEN1cmxfR2V0RlRQUmVzcG9uc2UgdG8gY2hlY2sgZm9yIAogICAgICAgIGRhdGEtPnNldC5mdHBfcmVzcG9uc2VfdGltZW91dAogICAgLSBsaWIvdXJsLmMKICAgICAgICBNb2RpZmllZCBDdXJsX3NldG9wdCB0byByZWNvZ25pemUgQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVAogICAgLSBsaWIvdXJsZGF0YS5oCiAgICAgICAgQWRkZWQgZnRwX3Jlc3BvbnNlX3RpbWVvdXQgdG8gc3RydWN0IFVzZXJEZWZpbmVkCgpEYW5pZWwgKDMgU2VwdGVtYmVyKQotIFBldGVyIFBlbnRjaGV2IGZvdW5kIGFuZCBmaXhlZCB0d28gcHJvYmxlbXMgaW4gdGhlIHRlc3Qgc3VpdGUncyB3ZWIgc2VydmVyCiAgY29kZSwgdGhhdCBtYWRlIGl0IHNlZ2ZhdWx0IGF0IHRpbWVzLgoKLSBK9nJnIE11ZWxsZXItVG9sayBpbXByb3ZlZCB0aGUgcHJveHkgdXNlcitwYXNzd29yZCBoYW5kbGluZywgZXNwZWNpYWxseQogIHdoZW4gcHJvdmlkaW5nIGEgYmxhbmsgcGFzc3dvcmQuCgpEYW5pZWwgKDIgU2VwdGVtYmVyKQotIEZpeCBmb3IgbWFraW5nIENPTk5FQ1QgdG8gcHJveGllcyBkbyB0aGUgY29ycmVjdCBtYWdpYyB0byBhbGxvdyBOVExNLCBEaWdlc3QKICBhbmQgc2ltaWxhciB0byB3b3JrLgoKRGFuaWVsICgxIFNlcHRlbWJlcikKLSBIZW5yaWsgU3Rvcm5lciBtYWRlIGxpYmN1cmwgd29yayBmaW5lIHdpdGggT3BlbkxEQVAgMi4xLjIyIChjdXJyZW50KS4KCi0gSmVmZiBQb2hsbWV5ZXIgYWRkZWQgYSBwcm9wZXIgZXJyb3IgbWVzc2FnZSBmb3Igbm9uLXJlc29sdmluZyBob3N0cyB3aGVuCiAgdXNpbmcgYXJlcyBmb3IgbG9va3Vwcy4KCkRhbmllbCAoMjUgQXVndXN0KQotIEpvaG4gTWNHb3dhbiByZXBvcnRlZCB0aGF0IGN1cmwgLWsgc3RpbGwgZmFpbGVkIGlmIHRoZSBIVFRQUyBzZXJ2ZXIncyBDTgogIGZpZWxkIHdhc24ndCBvYnRhaW5hYmxlLiBUaGlzIHdhcyBkdWUgdG8gdGhlIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QgYmVpbmcKICBzZXQgdG8gMSwgYW5kIGxpYmN1cmwgZmFpbGVkIGlmIHRoZSBDTiB3YXMgbWlzc2luZy4gU3RhcnRpbmcgbm93LCBoYXZpbmcgaXQKICBzZXQgdG8gMSB3aWxsIHNpbXBseSBvdXRwdXQgYSB3YXJuaW5nIGlmIG5vIENOIGNvdWxkIGJlIG9idGFpbmVkIChhcyBoYXZpbmcKICBhIG1pc21hdGNoIGlzIE9LKS4KCkRhbmllbCAoMjEgQXVndXN0KQotIFZpbmNlbnQgU2FuZGVycyBwcm92aWRlZCBhIGZpeCBmb3IgbmFtZSByZXNvbHZpbmcgd2hlbiBsaW5rZWQgd2l0aCB1Q2xpYmMuCgpEYW5pZWwgKDIwIEF1Z3VzdCkKLSBHZXJkIHYuIEVnaWR5IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHN0b3JlIHRoZSBGVFAgcmVzcG9uc2UKICBjb2RlIGZyb20gZnRwIHNlcnZlcnMuIFVzaW5nIGN1cmxfZWFzeV9nZXRpbmZvKCkgd2l0aCBDVVJMSU5GT19IVFRQX0NPREUKICByZXR1cm5zIHRoYXQgZGF0YS4gVGhlIG9wdGlvbiBpcyB0aGVyZWZvcmUgbm93IGFsc28ga25vd24gYXMKICBDVVJMSU5GT19SRVNQT05TRV9DT0RFLgoKLSBBbnRvaW5lIENhbGFuZG8gZm91bmQgYSBzZWdmYXVsdCB3aGVuIGRvaW5nIG11bHRpLXBhcnQvZm9ybXBvc3QgdXNpbmcKICB0aGUgbXVsdGkgaW50ZXJmYWNlLgoKLSBBbnRvaW5lIENhbGFuZG8gcG9pbnRlZCBvdXQgdGhhdCBjdXJsX211bHRpX2luZm9fcmVhZCgpIGRpZG4ndCBzZXQgdGhlCiAgbXNnc19pbl9xdWV1ZSB0byAwIHByb3Blcmx5IHdoZW4gcmV0dXJuaW5nIE5VTEwuCgpEYW5pZWwgKDE5IEF1Z3VzdCkKLSBJIG1hZGUgY3VybCBzdXBwb3J0IG11bHRpcGxlIC1UIG9wdGlvbnMsIGFzIHdlbGwgYXMgLVQgIntmaWxlMSxmaWxlMn0iCiAgc3R5bGUgZ2xvYmJpbmcuIE9uZSAtVCBmb3IgZWFjaCBVUkwgaXMgc3VwcG9ydGVkLgoKLSBKZWZmIFBvaGxtZXllciBmb3VuZCBhIHNlZ2ZhdWx0IHdoZW4gdXNpbmcgYXJlcy1lbmFibGVkIGxpYmN1cmwgYW5kIHRoZQogIG11bHRpIGludGVyZmFjZSB3aGVuIHRyeWluZyBhIG5vbi1leGlzdGluZyBob3N0IG5hbWUuCgotIE1hZGUgdGhlIGxpYmN1cmwgcHJpbnRmIGNvZGUgc3VwcG9ydCBsb25nIGxvbmdzIGlmIGF2YWlsYWJsZS4KCi0gTG9yZW4gS2lya2J5IHBvaW50ZWQgb3V0IHRoYXQgd2UgZGlkIG5vdCBjbGVhbiB1cCBhbGwgU1NMLWFsbG9jYXRlZCBtZW1vcnkKICBpbiBjdXJsX2dsb2JhbF9jbGVhbnVwKCkuCgpEYW5pZWwgKDE3IEF1Z3VzdCkKLSBTZXR0aW5nIENVUkxPUFRfV1JJVEVGVU5DVElPTiBvciBDVVJMT1BUX1JFQURGVU5DVElPTiB0byBOVUxMIHdpbGwgbm93IG1ha2UKICB0aGVtIGdldCB0aGUgaW50ZXJuYWwgZGVmYXVsdHMgcmVzdG9yZWQuIFByZXZpb3VzbHkgdGhpcyBjb3VsZCBjYXVzZSBhCiAgc2VnZmF1bHQuIFdlIHNob3VsZCBhaW0gYXQgaGF2aW5nIGFsbCBwb2ludGVyLXJlbGF0ZWQgb3B0aW9ucyBnZXQgcmVzdG9yZWQKICB0byBkZWZhdWx0L3NhZmUgdmFsdWVzIHdoZW4gc2V0IHRvIE5VTEwuCgpWZXJzaW9uIDcuMTAuNyAoMTUgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDE0IEF1Z3VzdCkKLSBJIG1vZGlmaWVkIHRoZSBtZW1kZWJ1ZyBzeXN0ZW0gdG8gcmV0dXJuIGZhaWx1cmUgb24gbWVtb3J5IGFsbG9jYXRpb24KICBmdW5jdGlvbnMgYWZ0ZXIgYSBzZXQgYW1vdW50IG9mIHN1Y2Nlc3NmdWwgb25lcy4gVGhpcyBlbmFibGVzIHVzIHRvIHRlc3QKICBvdXQtb2YtbWVtb3J5IHNpdHVhdGlvbnMgaW4gYSBjb250cm9sbGVkIG1hbm5lciBhbmQgd2UgY2FuIG1ha2Ugc3VyZSB0aGF0CiAgY3VybC9saWJjdXJsIGJlaGF2ZXMgZ29vZCBpbiB0aG9zZS4KCiAgVGhpcyBtYWRlIG1lIGZpbmQgYW5kIGZpeCBzZXZlcmFsIHNwb3RzIHdoZXJlIHdlIGRpZCBub3QgY2xlYW51cCBwcm9wZXJseQogIHdoZW4gYmFpbGluZyBvdXQgZHVlIHRvIGVycm9ycyAobG93IG1lbW9yeSkuCgotIENvcnJlY3RlZCB0ZXN0IGNhc2UgNzQuIE1hZGUgdXNpbmcgLW8gd2l0aCBiYWQgI1tudW1dIGNvZGVzIGNvbXBsYWluIGFuZAogIGJhaWwgb3V0LiBNYWRlICNbbnVtXSBzdXBwb3J0IG51bWJlcnMgbGFyZ2VyIHRoYW4gOSBhcyB3ZWxsLiBBZGRlZCB0ZXN0CiAgY2FzZSA4NiBmb3IgYSBwcm9wZXIgcmFuZ2UgZ2xvYmJpbmcgdGVzdCBhcyB3ZWxsLgoKVmVyc2lvbiA3LjEwLjctcHJlNCAoMTIgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDEyIEF1Z3VzdCkKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgZmxhZyBpZiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoIGFzeW5jaCBETlMKICBzdXBwb3J0LCBhbmQgdGhpcyBpcyBub3cgYWxzbyBkaXNwbGF5ZWQgd2l0aCAnY3VybCAtVicuCgotIEFkZGVkIGEgZmV3IG5ldyBtYW4gcGFnZXMgdG8gdGhlIGRvY3MvbGliY3VybCBkaXI6IGN1cmxfc2hhcmVfaW5pdCwKICBjdXJsX3NoYXJlX3NldG9wdCwgY3VybF9zaGFyZV9jbGVhbnVwLCBsaWJjdXJsLWVhc3kgYW5kIGxpYmN1cmwtc2hhcmUuCgpEYW5pZWwgKDExIEF1Z3VzdCkKLSBNaWtlIENoZXJlcG92IG1hZGUgdGhlIGxvY2FsIGJpbmRpbmcgY29kZSB3b3JrIGZvciBXaW5kb3dzLCB3aGljaCBtYWtlcwogIHRoZSBvcHRpb24gQ1VSTE9QVF9JTlRFUkZBQ0Ugd29yayBvbiBXaW5kb3dzIGFzIHdlbGwuCgotIFZpbmNlbnQgU2FuZGVycyB1cGRhdGVkIHRoZSBmb3Blbi5jIGV4YW1wbGUgY29kZSBhIGxvdC4KCi0gLS1wcm94eS1udGxtIGlzIG5vdyBzdXBwb3J0ZWQgYnkgdGhlIGN1cmwgdG9vbC4gSXQgZm9yY2VzIHRoZSBwcm94eQogIGF1dGhlbnRpY2F0aW9uIHRvIGJlIG1hZGUgdXNpbmcgTlRMTS4gSXQgZG9lcyBub3QgeWV0IHdvcmsgZm9yIEhUVFBTIG92ZXIKICBwcm94aWVzIChvciBvdGhlciBwcm94eS10dW5uZWxpbmcgb3B0aW9ucykuIFRlc3QgY2FzZSA4MSBhbmQgODIgZG8gc29tZQogIHNpbXBsZSBpbml0aWFsIG50bG0gdGVzdGluZy4KCi0gRm91bmQgYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgb24gcmUtdXNlZCBjb25uZWN0aW9ucyB3aXRoCiAgcHJveHktYXV0aGVudGljYXRpb24uCgotIEkgcmVtb3ZlZCAtQCBhbmQgLVogYXMgdmFsaWQgc2hvcnQgb3B0aW9ucy4gVGhleSB3ZXJlIHZlcnkgcmFyZWx5IHVzZWQgKEAKICB3YXNuJ3QgZXZlbiBkb2N1bWVudGVkKS4KCi0gU2VyZ2UgU2VtYXNoa28gaW50cm9kdWNlZCBDVVJMT1BUX1BST1hZQVVUSCwgYW5kIG1ha2UgaXQgd29yayB3aGVuIHNldCB0bwogIENVUkxBVVRIX05UTE0gYW5kL29yIENVUkxBVVRIX0JBU0lDLiBUaGUgUFJPWEFVVEggaXMgc2ltaWxhciB0byBIVFRQQVVUSCwKICBidXQgaXMgZm9yIHRoZSBwcm94eSBjb25uZWN0aW9uIG9ubHksIGFuZCBIVFRQQVVUSCBpcyBmb3IgdGhlIHJlbW90ZSBob3N0LgoKLSBGaXhlZCBsb2FkaW5nIG9mIGNvb2tpZXMgd2l0aCBibGFuayBjb250ZW50cyBmcm9tIGEgY29va2llIGphci4gQWxzbyBtYWRlIHRoZQogIGNvb2tpZSBmdW5jdGlvbnMgaW5mb3JtIG9uIGFkZGVkIGFuZCBza2lwcGVkIGNvb2tpZXMgKGZvciBjb29raWUgZGVidWdnaW5nKS4KClZlcnNpb24gNy4xMC43LXByZTMgKDggQXVndXN0IDIwMDMpCgpEYW5pZWwgKDggQXVndXN0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBmaXggZm9yIGZpbGU6Ly8gVVJMcyB3aXRoIGRyaXZlIGxldHRlcnMgaW5jbHVkZWQuCgotIEkgYWRkZWQgdGhlIC0tZnRwLWNyZWF0ZS1kaXJzIHRvIHRoZSBjbGllbnQgY29kZSwgd2hpY2ggYWN0aXZhdGVzIEVhcmx5J3MKICBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIG9wdGlvbiwgYW5kIHdyb3RlIHRlc3QgY2FzZSAxNDcgdG8gdmVyaWZ5CiAgaXQuIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlIGN1cmwuMSBtYW4gcGFnZSB0b28uIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlCiAgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlIHRvby4KCkRhbmllbCAoNyBBdWd1c3QpCi0gVGVzdCBjYXNlIDYwIGZhaWxlZCBvbiBpYTY0IGFuZCBBTUQgT3B0ZXJvbi4gRml4ZWQgbm93LgoKLSBGaXhlZCBhIHByaW50ZiBwcm9ibGVtIHRoYXQgcmVzdWx0ZWQgaW4gdXJsZ2xvYmJpbmcgYnVncyAoYnVnICMyMDM4MjcgaW4gdGhlCiAgZGViaWFuIGJ1ZyB0cmFja2VyKS4gQWRkZWQgdGVzdCBjYXNlIDc0IHRvIHZlcmlmeSB0aGUgZml4IGFuZCB0byBkaXNjb3ZlciBpZgogIHRoaXMgYnJlYWtzIGluIHRoZSBmdXR1cmUuCgotICJtYWtlIGRpc3RjaGVjayIgd29ya3MgYWdhaW4uCgpWZXJzaW9uIDcuMTAuNy1wcmUyICg2IEF1Z3VzdCAyMDAzKQoKRGFuaWVsICg1IEF1Z3VzdCkKLSBEdW5jYW4gV2lsY294IGhlbHBlZCBtZSB2ZXJpZnkgdGhhdCB0aGUgbGF0ZXN0IGluY2FybmF0aW9uIG9mIG15IGFyZXMgcGF0Y2gKICBidWlsZHMgZmluZSBvbiBNYWMgT1MgWCAoc2VlIHRoZSBuZXcgbGliL1JFQURNRS5hcmVzKSBmaWxlIGZvciBhbGwgZGV0YWlscy4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZmlsZWQgYnVnIHJlcG9ydCAjNzgzMTE2IGFuZCBFYXJseSBFaGxpbmdlciBwb3N0ZWQgYQogIGJ1ZyByZXBvcnQgdG8gdGhlIGxpYmN1cmwgbGlzdCwgYm90aCBpZGVudGlmeWluZyBhIHByb2JsZW0gd2l0aCBGVFAKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBob3cgdGhlIGRpciBoaWVyYXJjaHkgd2FzIG5vdCBwcm9wZXJseSByZXNldAogIGJldHdlZW4gZmlsZXMuCgotIERhdmlkIEJ5cm9uJ3MgdGhvdWdodHMgb24gYSBmaXhlZCBNYWtlZmlsZSBpbiB0ZXN0cy8gd2VyZSBhcHBsaWVkLgoKLSBKYW4gU3VuZGluIHJlcG9ydGVkIGEgY2FzZSB3aGVyZSBjdXJsIGlnbm9yZWQgYSBjb29raWUgdGhhdCBicm93c2VycyBkb24ndCwKICB3aGljaCB0dXJuZWQgdXAgdG8gYmUgZHVlIHRvIHRoZSBudW1iZXIgb2YgZG90cyBpbiB0aGUgJ2RvbWFpbicuIEkndmUgbm93CiAgbWFkZSBjdXJsIGZvbGxvdyB0aGUgdGhlIG9yaWdpbmFsIG5ldHNjYXBlIGNvb2tpZSBzcGVjIGxlc3Mgc3RyaWN0IG9uIHRoYXQKICBwYXJ0LgoKRGFuaWVsICg0IEF1Z3VzdCkKLSBEaXJrIE1hbnNrZSBhZGRlZCBjb29raWUgc3VwcG9ydCBmb3IgdGhlIGV4cGVyaW1lbnRhbCwgaGlkZGVuIGFuZCBzdGlsbAogIHVuZG9jdW1lbnRlZCBzaGFyZSBmZWF0dXJlIQoKLSBNYXJrIEZsZXRjaGVyIHByb3ZpZGVkIGFuIGV4Y2VsbGVudCBidWcgcmVwb3J0IHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIEZPTExPV0xPQ0FUSU9OIGFuZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLCBhcyBsaWJjdXJsIHdvdWxkIG5vdAogIHByb3Blcmx5IGlnbm9yZSB0aGUgYm9keSBjb250ZW50cyBvZiAzWFggcmVzcG9uc2UgdGhhdCBpbmNsdWRlZCB0aGUKICBMb2NhdGlvbjogaGVhZGVyLgoKRWFybHkgKDYgQXVndXN0KQotIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICBUaGlzIG9wdGlvbiB3aWxsIGZvcmNlIHRoZSB0YXJnZXQgZmlsZSdzIHBhdGggdG8gYmUgY3JlYXRlZCBpZiBpdAogICAgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgcmVtb3RlIHN5c3RlbS4KIAogIEZpbGVzIGFmZmVjdGVkOgogICAgLSBpbmNsdWRlL2N1cmwvY3VybC5oCiAgICAgICAgQWRkZWQgb3B0aW9uIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMKICAgIC0gbGliL2Z0cC5jCiAgICAgICAgQWRkZWQgZnVuY3Rpb24gZnRwX21rZCwgd2hpY2ggaXNzdWVzIGEgTUtEIGNvbW1hbmQKICAgICAgICBBZGRlZCBmdW5jdGlvbiBmdHBfZm9yY2VfY3dkLCB3aGljaCBhdHRlbXB0cyBhIENXRCwKICAgICAgICAgIGFuZCBkb2VzIGEgTUtEIGFuZCByZXRyaWVzIHRoZSBDV0QgaWYgdGhlIG9yaWdpbmFsIENXRAogICAgICAgICAgZmFpbHMKICAgICAgICBNb2RpZmllZCBmdHBfcGVyZm9ybSgpIHRvIGNhbGwgaXRzIGNoYW5nZSBkaXJlY3RvcnkgZnVuY3Rpb24KICAgICAgICAgIHRocm91Z2ggYSBwb2ludGVyLiAgVGhlIHBvaW50ZXIgcG9pbnRzIHRvIGZ0cF9jd2QgYnkgZGVmYXVsdCwKICAgICAgICAgIGFuZCBpcyBtb2RpZmllZCB0byBwb2ludCB0byBmdHBfZm9yY2VfY3dkIElGRgogICAgICAgICAgZGF0YS0+c2V0LmZ0cF9jcmVhdGVfbWlzc2luZ19kaXJzIGlzIG5vdCAwLiAgICAgICAgCiAgICAtIGxpYi91cmwuYwogICAgICAgIE1vZGlmaWVkIEN1cmxfc2V0b3B0IHRvIHJlY29nbml6ZSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICAtIGxpYi91cmxkYXRhLmgKICAgICAgICBBZGRlZCBmdHBfY3JlYXRlX21pc3NpbmdfZGlycyB0byBzdHJ1Y3QgVXNlckRlZmluZWQKICAgICAgIAotIE1pbm9yIEJ1Z2ZpeCBmb3IgQ1VSTE9QVF9USU1FQ09ORElUSU9OIHdpdGggRlRQIC0gaWYgdGhlIGZpbGUgd2FzIG5vdAogIHByZXNlbnQgdG8gZG8gdGhlIHRpbWUgY29tcGFyaXNvbiwgaXQgd291bGQgZmFpbC4KICBGaWxlcyBhZmZlY3RlZDoKICAgIC0gbGliL2Z0cC5jCiAgICAgICAgSW4gZnRwX3BlcmZvcm0oKSwgdGhlIGNhbGwgdG8gZnRwX2dldGZpbGV0aW1lKCkgdXNlZCB0byBiZSBmb2xsb3dlZAogICAgICAgIGJ5CgkgIGlmIChyZXN1bHQpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgQW5kIHRoZW4gYnkgdGhlIGNvZGUgdGhhdCBhY3R1YWxseSBkaWQgdGhlIHRpbWUgY29tcGFyaXNvbi4KICAgICAgICBUaGUgY29kZSB0aGF0IGRpZCB0aGUgY29tcGFyaXNvbiBoYW5kbGVkIHRoZSBjYXNlIHdoZXJlIHRoZSBmaWxldGltZQogICAgICAgIHdhcyBub3QgYXZhaWxhYmxlIChhcyBpbmRpY2F0ZWQgYnkgaW5mby5maWxldGltZSA8IDAgb3Igc2V0LnRpbWV2YWx1ZSAKICAgICAgICA8IDApLCBzbyBJIHJlcGxhY2VkIHRoZSBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0IHdpdGggYSBzd2l0Y2gocmVzdWx0KQogICAgICAgIHRoYXQgYWxsb3dzIENVUkxFX0ZUUF9DT1VMRE5UX1JFVFJfRklMRSB0byBmYWxsIHRocm91Z2ggdG8gdGhlIAogICAgICAgIG5vcm1hbCB0aW1lIGNvbXBhcmlzb24uCgpEYW5pZWwgKDMgQXVndXN0KQotIFdoZW4gcHJveHkgYXV0aGVudGljYXRpb24gaXMgdXNlZCBpbiBhIENPTk5FQ1QgcmVxdWVzdCAoYXMgdXNlZCBmb3IgYWxsIFNTTAogIGNvbm5lY3RzIGFuZCBvdGhlcndpc2UgZW5mb3JjZWQgdHVubmVsLXRocnUtcHJveHkgcmVxdWVzdHMpLCB0aGUgc2FtZQogIGF1dGhlbnRpY2F0aW9uIGhlYWRlciBpcyBhbHNvIHdyb25nbHkgc2VudCB0byB0aGUgcmVtb3RlIGhvc3QuCgogIFRoaXMgaXMgYSByYXRoZXIgc2lnbmlmaWNhbnQgaW5mbyBsZWFrLiBJJ3ZlIGZpeGVkIGl0IG5vdyBhbmQgbWFpbGVkIGEgcGF0Y2gKICBhbmQgd2FybmluZyB0byB0aGUgbWFpbGluZyBsaXN0cy4KCkRhbmllbCAoMSBBdWd1c3QpCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSBwYXRjaCB0byBtYWtlIDcuMTAuNiBidWlsZCBjb3JyZWN0bHkgd2l0aCB0aGUKICBjb21wcmVzc2VkIGh1Z2VoZWxwLmMgc291cmNlIGZpbGUuCgpWZXJzaW9uIDcuMTAuNy1wcmUxICgzMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDMwIEp1bHkpCi0gSvZyZyBN/GxsZXItVG9sayB1cGRhdGVkIHRoZSBWQyBtYWtlZmlsZS4KCi0gRGFuaWVsIE5vZ3Vlcm9sIG1hZGUgdGhlIGZ0cCBjb2RlIG91dHB1dCAiQWNjZXB0LVJhbmdlczogYnl0ZXMiIGluIHNpbWlsYXIKICBzdHlsZSBsaWtlIG90aGVyIGZha2VkIEhUVFAgaGVhZGVycyB3aGVuIE5PQk9EWSBhbmQgSEVBREVSIGFyZSB1c2VkLiBJCiAgdXBkYXRlZCB0d28gY29ycmVzcG9uZGluZyB0ZXN0IGNhc2VzIHRvby4KCi0gTWFydHkgS3VocnQgcG9pbnRlZCBvdXQgYSBjb21waWxhdGlvbiBwcm9ibGVtIG9uIFZNUyBkdWUgdG8gbXkgaGF2aW5nCiAgY2hhbmdlZCBhIHR5cGUgZnJvbSBsb25nIHRvIHRpbWVfdCwgYW5kIEknbSBub3cgY2hhbmdpbmcgaXQgYmFjayB0byB3b3JrCiAgbW9yZSBwb3J0YWJseS4uLgoKICBIZSBhbHNvIGluZGljYXRlZCB0aGF0IGRpc3RyaWJ1dGluZyB0aGUgc3JjL2h1Z2VoZWxwLmMgaW4gYSBjb21wcmVzc2VkIHN0YXRlCiAgbGlrZSBJIGFjY2lkZW50YWxseSBkaWQgbWF5IG5vdCBiZSB0aGUgc21hcnRlc3QgbW92ZS4uLiBJJ3ZlIG5vdyBmaXhlZCB0aGUKICBkaXN0cmlidXRlIHByb2NlZHVyZSB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIHdoZW4gSQogIG1ha2UgcmVsZWFzZSBhcmNoaXZlcy4KCkRhbmllbCAoMjkgSnVseSkKLSBHaXNsZSBWYW5lbSBicm91Z2h0IGNoYW5nZXMgdG8gdGhlIG1raGVscCBzY3JpcHQgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQogIGNvbXByZXNzZWQgaGVscCB0ZXh0IG9uIHNvbWUgcGxhdGZvcm1zLgoKVmVyc2lvbiA3LjEwLjYgKDI4IEp1bHkgMjAwMykKCkRhbmllbCAoMjggSnVseSkKLSBGcmFu529pcyBQb25zIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG9uY2UgYWdhaW4gbWFkZSBjdXJsIGRlYWwgd2l0aCBmdHAgYW5kCiAgImRvdWJsZSBzbGFzaCIgYXMgaW5kaWNhdGluZyB0aGUgcm9vdCBkaXJlY3RvcnkuIEluIHRoZSBSRkMxNzM4LWZpeCBvZiBBcHJpbAogIDMwLCB0aGF0IGFiaWxpdHkgd2FzIHJlbW92ZWQgKHNpbmNlIGl0IGlzIG5vdCB0aGUgInJpZ2h0IiB3YXkpLiBTbywgc3RhcnRpbmcKICBub3cgd2UgY2FuIGxpc3QgdGhlIHJvb3QgZGlyIG9mIGFuIGZ0cCBzZXJ2ZXIgYm90aCB0aGVzZSB3YXlzOgoKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8lMmYgIGFzIHdlbGwgYXMKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8vCgpEYW5pZWwgKDI0IEp1bHkpCi0gSGVucnkgQmxhbmQgcG9pbnRlZCBvdXQgdGhhdCB3ZSBpbmNsdWRlZCBzeXMvcmVzb3VyY2UuaCB3aXRob3V0IGdvb2QgcmVhc29uCiAgaW4gc2V2ZXJhbCBzb3VyY2UgZmlsZXMuIFdpdGhvdXQgaXQgaW5jbHVkZWQsIFFOWCBidWlsZHMgYmV0dGVyLi4uCgotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3cgbWFrZWZpbGVzLgoKRGFuaWVsICgyMyBKdWx5KQotIFRyYWN5IEJvZWhyZXIgZXhwZXJpZW5jZWQgRE5TIGNhY2hlIHByb2JsZW1zIGFuZCBkaWQgc29tZSBuaWNlIGRlYnVnZ2luZwogIGFuZCB0cmFja2luZyB3aGljaCBtYWRlIGl0IGVhc3kgZm9yIG1lIHRvIGNvcnJlY3QgdGhlIHByb2JsZW0gYW5kIFRyYWN5CiAgY291bGQgdmVyaWZ5IHRoYXQgaXQgZGlkIGN1cmUgdGhlIHByb2JsZW0hIFdoZW4gcmUtdXNpbmcgYSBjb25uZWN0aW9uIHdlCiAgbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCByZS11c2UgdGhlICdjb25uZWN0X2FkZHInIHN0cnVjdC4KCi0gRGFuaWVsIEtvdXJpbCBjb3JyZWN0ZWQgdGhlIEdTUy1OZWdvdGlhdGUgY29kZS4KCi0gSnVhbiBGLiBDb2RhZ25vbmUgcHJvdmlkZWQgZml4ZXMgdG8gYWxsb3cgY3VybCB0byBidWlsZCBmaW5lIG9uIFdpbmRvd3MKICBhZ2Fpbi4KCkRhbmllbCAoMjIgSnVseSkKLSBFZGl0ZWQgdGhlIGN1cmwvY3VybC5oIGluY2x1ZGUgZmlsZSB0byBidWlsZCBvbiBXaW5kb3dzIHByb3Blcmx5LgoKRGFuaWVsICgyMSBKdWx5KQotIE1vdmVkIHRoZSBwcm94eSBjcmVkZW50aWFscyBmcm9tIHRoZSBTZXNzaW9uSGFuZGxlIHN0cnVjdCB0byB0aGUgY29ubmVjdGRhdGEKICBzdHJ1Y3QsIHRvIG1ha2UgbXVsdGlwbGUgcHJveHkgY29ubmVjdGlvbnMgd2l0aCBkaWZmZXJlcmVudCB1c2VyIG5hbWVzIHdvcmsuCgotIEFkanVzdGVkIHRoZSBOVExNIGNvZGUgdG8gc3VwcG9ydCBwcm94eSBmdW5jdGlvbmFsaXR5LgoKLSBNYWRlIHRoZSBrcmI0IHN0dWZmIGNvbXBpbGUgd2l0aCB0aGUgdXNlcitwYXNzd29yZCBmaWVsZHMgbW92ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmU0ICgyMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDIwIEp1bHkpCi0gRGF2aWQgR2FyZG5lciBwb2ludGVkIG91dCBpbiBidWcgcmVwb3J0IDc3MDc1NSB0aGF0IHVzaW5nIHRoZSBGVFAgY29tbWFuZAogIENXRCB3aXRoIGEgYmxhbmsgYXJndW1lbnQgaXMgYSBiYWQgaWRlYSBhbmQgSSBtYWRlIGxpYmN1cmwgc2tpcCBlbXB0eSBwYXRoCiAgc2VnbWVudHMgc3RhcnRpbmcgbm93LgoKRGFuaWVsICgxOCBKdWx5KQotIENyaXMgcG9pbnRlZCBvdXQgdGhhdCBteSBmaXggb24gSnVseSAxNnRoIGRpZG4ndCB3b3JrIGZ1bGx5LiBIaXMgcG9pbnRpbmcKICBvdXQgdGhpcyAoYW5kIGhpcyBwYXRjaCkgYWxzbyBtYWRlIG1lIHJlYWxpemUgdGhhdCB3ZSBoYXZlIGEgdmVyeSBzaW1pbGFyCiAgYnVnIGluIHRoZSBGVFAgY29ubmVjdGlvbiByZS11c2UgY29kZS4gV2UgbXVzdCBzdG9yZSBhIHNlcGFyYXRlIHVzZXIgYW5kCiAgcGFzc3dvcmQgZmllbGQgZm9yIGVhY2ggY29ubmVjdGlvbiB3ZSBrZWVwIChhdCBsZWFzdCBmb3IgRlRQIGFuZCBIVFRQK05UTE0KICBjb25uZWN0aW9ucywgc28gSSBtYWRlIHVzIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5KS4KCi0gU2luY2UgTlRMTSBhdXRoZW50aWNhdGVzIGNvbm5lY3Rpb25zIGluc3RlYWQgb2Ygc2luZ2xlIHJlcXVlc3RzLCBJIGhhZCB0bwogIHJlLWFycmFuZ2UgaG93IHdlIHN0b3JlIHRoZSBOVExNIGRhdGEgYW5kIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3Qgc3VpdGUgdG8KICBmaW5hbGx5IHdvcmsgcHJvcGVybHkgd2l0aCBwZXJzaXN0ZW5jeSB0byBtYWtlIHRoZSBOVExNIHRlc3RzIHJ1biBmaW5lCiAgYWdhaW4uIFRoaXMgYWxzbyBmb3JjZWQgbWUgdG8gaGF2ZSB0byB1cGRhdGUgbG90cyBvZiBIVFRQIHRlc3QgY2FzZXMuCgpEYW5pZWwgKDE2IEp1bHkpCi0gQ3JpcyBCYWlsaWZmJ3MgYnVnIHJlcG9ydCA3NjgyNzUgcG9pbnRlZCBvdXQgdGhhdCB1c2luZyBCYXNpYyBhdXRoIHdpdGgKICB3cm9uZyB1c2VyK3Bhc3N3b3JkIGNhdXNlZCBhbiBlbmRsZXNzIGxvb3AuIEZpeGVkIG5vdy4gSGUgYWxzbyBmb3VuZCBvdXQgdGhhdAogIHdlIGRpZG4ndCBwcm9wZXJseSBhdXRoZW50aWNhdGUgY29ubmVjdGlvbnMgd2l0aCBOVExNLiBGaXhlZCB0b28uCgotIERhbiBXaW5zaGlwIHByb3ZpZGVkIGZpeGVzIGZvciB0aGUgTlRMTSBjb2RlLgoKRGFuaWVsICg1IEp1bHkpCi0gRG91ZyBLYXVmbWFuIHByb3ZpZGVkIGFkZGl0aW9uYWwgZml4ZXMgZm9yIHRoZSBET1MgcG9ydC4KCkRhbmllbCAoNCBKdWx5KQotIFJpY2sgUmljaGFyZHNvbiBwb2ludGVkIG91dCB0aGF0IHVzaW5nIHNldHZidWYoKSB0byBhY2hpZXZlIG5vbi1idWZmZXJpbmcKICBvbiBvdXRwdXQgaXMgbm8tZ29vZCBmb3IgU0NPIFhlbml4IGFuZCBvdGhlciB1bml4ZXMuIFdlIHN3aXRjaGVkIG92ZXIgdG8KICB1c2luZyBwbGFpbiBmZmx1c2goKSBpbnN0ZWFkLgoKLSBEYW4gR3JheXNvbiBwb2ludGVkIG91dCB0aGF0IHdlIHNldCB0aGUgQ1VSTF9DQV9CVU5ETEUgdmFyaWFibGUgd3JvbmdseSBpbgogIHRoZSBjb25maWd1cmUgc2NyaXB0LCBhbmQgSSBoYWQgdG8gY2hhbmdlIHNvbWUgYnVpbGQgc3R1ZmYgdG8gbWFrZSB0aGUgbmV3CiAgd2F5IHdvcmsuCgotIFBldGVyIFN5bHZlc3RlcidzIHBhdGNoIHdhcyBhcHBsaWVkIHRoYXQgaW50cm9kdWNlcyB0aGUgZm9sbG93aW5nOgoKICAgQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OIHRvIHNldCBhIGNhbGxiYWNrIHRoYXQgZ2V0cyBjYWxsZWQgd2l0aCB0aGUKICAgT3BlblNTTCdzIHNzbF9jdHggcG9pbnRlciBwYXNzZWQgaW4gYW5kIGFsbG93IGEgY2FsbGJhY2sgdG8gYWN0IG9uIGl0LiBJZgogICBhbnl0aGluZyBidXQgQ1VSTEVfT0sgaXMgcmV0dXJuZWQsIHRoYXQgd2lsbCBhbHNvIGJlIHJldHVybmVkIGJ5IGxpYmN1cmwKICAgYWxsIHRoZSB3YXkgYmFjay4gSWYgdGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBDVVJMT1BUX1VSTCwgbGliY3VybCB3aWxsCiAgIGRldGVjdCB0aGlzIGFuZCBpbnN0ZWFkIGdvIHVzZSB0aGUgbmV3IFVSTC4KCiAgIENVUkxPUFRfU1NMX0NUWF9EQVRBIGlzIGEgcG9pbnRlciB5b3Ugc2V0IHRvIGdldCBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHNldAogICB3aXRoIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTi4KCkRhbmllbCAoMSBKdWx5KQotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhbGxvd3MgYSBjbGllbnQgdG8gcXVpdCB0aGUgdGVzdCBzdWl0ZSdzCiAgSFRUUCBzZXJ2ZXIuCgotIEdpc2xlIFZhbmVtIGZvdW5kIGFuZCBwYXRjaGVkIGEgbGliIGhhbmRsZSBsZWFrIGluIHRoZSBsZGFwIGNvZGUuCgpEYW5pZWwgKDI1IEp1bmUpCi0gTW9yZSBOVExNLWltcHJvdmVtZW50cy4gTGVzcyBjb2RlLiBTbWFsbGVyIHBhY2tldHMgYmFjayBhbmQgZm9ydGguCgpEYW5pZWwgKDIzIEp1bmUpCi0gRXJpYyBHbGFzcyBwcm92aWRlZCB1cyB3aXRoIGEgYmV0dGVyIGRvYyBvbiBOVExNIGRldGFpbHMsIGFuZCBJIGFkZGVkIG1vcmUKICBjb21tZW50cyBhbmQgY2xhcmlmaWVkIHRoZSBjdXJyZW50IGNvZGUgbW9yZS4gVXNpbmcgdGhlIG5ldyBrbm93bGVkZ2UsIHdlCiAgc2hvdWxkIGJlIGFibGUgdG8gbWFrZSB0aGUgTlRMTSBzdHVmZiB3b3JrIGV2ZW4gYmV0dGVyLgogIEVyaWMncyBvcmlnaW5hbCBVUkw6IGh0dHA6Ly9kYXZlbnBvcnQuc291cmNlZm9yZ2UubmV0L250bG0uaHRtbAogIFZlcnNpb24gc3RvcmVkIGFuZCBwcm92aWRlZCBhdCBjdXJsIHNpdGU6IGh0dHA6Ly9jdXJsLmhheHguc2UvcmZjL250bG0uaHRtbAoKLSBGaXhlZCB0aGUgbWlub3IgY29tcGlsZSBwcm9ibGVtcyBwcmUzIGhhZCBpZiBidWlsdCB3aXRob3V0IEdTU0FQSSBhbmQvb3IKICBTU0wuCgpWZXJzaW9uIDcuMTAuNi1wcmUzICgxOSBKdW5lIDIwMDMpCgpEYW5pZWwgKDE5IEp1bmUpCi0gTWFkZSBjdXJsIHVzZSBjdXJsX2ZyZWUoKSBvbiBtZW1vcnkgcmV0dXJuZWQgYnkgY3VybF9nZXRlbnYoKSwgYXMgdGhpcwogIHNob3VsZCB0aGVvcmV0aWNseSBtYWtlIGl0IHBvc3NpYmx5IHRvIGJ1aWxkIGFuZCBydW4gY3VybCBhbmQgbGliY3VybCB3aXRoCiAgZGlmZmVyZW50IG1lbW9yeSBhbGxvY2F0aW9uIHNjaGVtZXMgd2l0aCBubyBwcm9ibGVtcy4KCkRhbmllbCAoMTggSnVuZSkKLSBJbXByb3ZlZCB0aGUgbWtoZWxwLnBsIGEgYml0IGZ1cnRoZXIgdG8gbWFrZSBhIG5pY2VyIGh1Z2VoZWxwIHRleHQgYW5kIHRvCiAgaW5jbHVkZSBhIGJldHRlciBjb21tZW50IGluIHRoZSB0b3AgZm9yIHRoZSBnemlwIGNvbXByZXNzZWQgdmVyc2lvbi4KCkRhbmllbCAoMTcgSnVuZSkKLSBDVVJMT1BUX0hUVFBBVVRIIGlzIG5vdyBhIGJpdG1hc2ssIGluIHdoaWNoIHlvdSBzZXQgd2hpY2ggYXV0aGVudGljYXRpb24KICB0eXBlKHMpIHlvdSB3YW50IHRvIHVzZS4gSWYgbW9yZSB0aGFuIG9uZSBpcyBzZXQsIGxpYmN1cmwgd2lsbCB1c2Ugb25lIG9mCiAgdGhlIHNlbGVjdGVkIG9uZSBhbmQgdGhlIG9uZSBpdCBjb25zaWRlcnMgaXMgbW9yZSBzZWN1cmUuIFRlc3QgY2FzZSA2NyBhbmQKICA2OCAoZm9yIE5UTE0pIHdlcmUgZml4ZWQgYW5kIHdlJ3ZlIHJlZHVjZWQgYSByb3VuZC10cmlwIGZvciBzcGVjaWZpYyAtLW50bG0KICBmZXRjaGVzLCBhbmQgdGVzdCBjYXNlIDY5IGFuZCA3MCB3ZXJlIGFkZGVkIGZvciB0ZXN0aW5nIGF1dGhlbnRpY2F0aW9uCiAgInBpY2tpbmciLiAtLWFueWF1dGggaXMgdGhlIG5ldyBjb21tYW5kIGxpbmUgdG9vbCBvcHRpb24sIGFuZCBJIGFsc28gYWRkZWQKICAtLWJhc2ljIGZvciBjb21wbGV0ZW5lc3MgKHRoYXQncyB0aGUgZGVmYXVsdCB0eXBlKS4KCi0gRml4ZWQgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCB0byB1c2UgdGhlIGluZm8gcHJvdmlkZWQgYnkgdGhlIG5ldyBjdXJsIC1WCiAgb3V0cHV0LgoKLSAtLWVuYWJsZS1kZWJ1ZyBub3cgc2V0cyB0aGUgQ1VSTERFQlVHIGRlZmluZSBpbnN0ZWFkIG9mIE1BTExPQ0RFQlVHLCBhcyBpdAogIGlzIG1lYW50IHRvIGJlIGEgZ2VuZXJpYyBkZWJ1ZyBjb25kaXRpb25hbC4KCi0gY3VybF92ZXJzaW9uX2luZm8oKSBjYW4gbm93IHJldHVybiBDVVJMX1ZFUlNJT05fREVCVUcgYXMgYSBmZWF0dXJlIGJpdCwgdG8KICBpbmRpY2F0ZSB0aGF0IHRoZSBsaWJyYXJ5IHdhcyBidWlsdCB3aXRoIENVUkxERUJVRyBzZXQuCgotIFJhbHBoIE1pdGNoZWxsIGZvdW5kIG91dCB0aGF0IHNvbWUgd2ViIGFwcGxpY2F0aW9ucyB2ZXJ5IGJhZGx5IHVzZXMgd2hpdGUKICBzcGFjZXMgaW4gTG9jYXRpb246IHJlZGlyZWN0cywgYW5kIGFwcGFyZW50bHkgSUUgaXMgYSBicm93c2VyICh0aGUgb25seQogIG9uZT8pIHRoYXQgc3VwcG9ydHMgdGhpcyBhYm9taW5hdGlvbi4gQmFzZWQgb24gUmFscGgncyBwYXRjaCwgSSBhZGRlZCBjb2RlCiAgdGhhdCBub3cgYXR0ZW1wdHMgdG8gcmVwbGFjZSB3aGl0ZSBzcGFjZXMgd2l0aCB0aGUgcHJvcGVyICIlMjAiIG9yICIrIi4KICBUZXN0IGNhc2UgNDAgYW5kIDQyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5IG15IGNoYW5nZXMuCgotIGN1cmwgLVYgbm93IGFsc28gb3V0cHV0cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhlIGF2YWlsYWJsZSBsaWJyYXJ5IG9mZmVycyAoaWYKICBhbnkpLgoKLSBUaGUgY3VybF92ZXJzaW9uKCkgc3RyaW5nIG5vdyBpbmNsdWRlcyAiR1NTIiBpZiBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggR1NTQVBJCiAgc3VwcG9ydC4KCi0gRGF2aWQgT3JyZWxsIHJlcG9ydGVkIHRoYXQgbGliY3VybCBzdGlsbCBjcmFzaGVkIHdoZW4gc2VuZGluZyBIVUdFIHJlcXVlc3RzCiAgb3ZlciBIVFRQUy4uLiBJIGZpeGVkLgoKVmVyc2lvbiA3LjEwLjYtcHJlMiAoMTYgSnVuZSAyMDAzKQoKRGFuaWVsICgxNiBKdW5lKQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYml0bWFza2VkIGluZm9ybWF0aW9uIHdlYXRoZXIgTlRMTSBhbmQKICBHU1NORUdPVElBVEUgYXJlIHN1cHBvcnRlZCwgc2luY2UgaXQgaXMgZG9vbWVkIHRvIHZhcnkgb24gZGlmZmVyZW50CiAgaW5zdGFsbGF0aW9ucy4KCi0gSSByZW1hZGUgdGhlIEhUVFAgRGlnZXN0IGNvZGUgdG8gdXNlIHRoZSBNRDUtY29kZSBwcm92aWRlZCBieSBPcGVuU1NMIGlmCiAgdGhhdCBpcyBwcmVzZW50LCBhbmQgb25seSB1c2Ugb3VyIG93biBNRDUtY29kZSBpZiBpdCBpc24ndC4KICAKRGFuaWVsICgxMyBKdW5lKQotIE1vcmUgTlRMTSBoZWxwLCBmaXhlcyBhbmQgcGF0Y2hlcyBmcm9tIENyaXMgQmFpbGlmZi4KCi0gTWFydHkgS3VocnQgYnJvdWdodCBpbmNsdWRlIGZpeGVzIGZvciBtYWtpbmcgVk1TIGJ1aWxkcyB3YXJuaW5nLWZyZWUuCgpEYW5pZWwgKDEyIEp1bmUpCi0gTlRMTSBhdXRoZW50aWNhdGlvbiB3b3JrcyBzb21ld2hhdCBhZ2FpbnN0IHRoZSB0ZXN0IHNlcnZlcnMgcHJvdmlkZWQgYnkKICBNYXRoaWFzIEF4ZWxzc29uIGFuZCBDcmlzIEJhaWxpZmYuIFVzZSBieSBzZXR0aW5nIENVUkxPUFRfSFRUUEFVVEggdG8KICBDVVJMQVVUSF9OVExNIHRvIGxpYmN1cmwsIG9yIC0tbnRsbSBmb3IgdGhlIGN1cmwgdG9vbC4gVGVzdCBjYXNlIDY3IGFuZCA2OAogIHdlcmUgYWRkZWQgZm9yIHRoaXMuIE5UTE0tc3VwcG9ydCByZXF1aXJlcyBPcGVuU1NMLgoKLSBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYSBwYXRjaCwgdGhhdCBncmFudGVkIHRoYXQgZ3ppcCBhbmQgbGlieiBhcmUgYXZhaWxhYmxlCiAgYXQgYnVpbGQtdGltZSwgY29tcHJlc3NlcyB0aGUgaHVnZWhlbHAgdGV4dCBpbiB0aGUgY3VybCBjb21tYW5kIGxpbmUgYW5kCiAgdW5jb21wcmVzc2VzIGl0IGF0IHJlcXVlc3QuIFNhdmVzIHNvbWUgfjYwSyBpbiB0aGUgZmluYWwgb3V0cHV0IGV4ZWN1dGFibGUuCgpEYW5pZWwgKDExIEp1bmUpCi0gTG9uZyBkYXkgb2YgZmlnaHRpbmcgdGhlIE5UTE0gZGVtb25zLgoKRGFuaWVsICgxMCBKdW5lKQotIE1vZGlmaWVkIGhvdyB0byBzZXQgYXV0aCB0eXBlIHRvIGxpYmN1cmwuIE5vdyB1c2UgQ1VSTE9QVF9IVFRQQVVUSCBpbnN0ZWFkLAogIGFuZCBwaWNrIG1ldGhvZC4gU3VwcG9ydGVkIG9uZXMgY3VycmVudGx5IGFyZToKICBDVVJMQVVUSF9CQVNJQyAgICAgLSBkZWZhdWx0IHNlbGVjdGlvbgogIENVUkxBVVRIX0RJR0VTVCAgICAtIGZvcm1lcmx5IENVUkxPUFRfSFRUUERJR0VTVAogIENVUkxBVVRIX0dTU05FR09USUFURQoKLSBEYW5pZWwgS291cmlsIGFkZGVkIEhUVFAgR1NTLU5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbiBzdXBwb3J0LCBhcyBkZWZpbmVkIGluCiAgdGhlIElFVEYgZHJhZnQgZHJhZnQtYnJlemFrLXNwbmVnby1odHRwLTA0LnR4dC4gSW4gdXNlIGFscmVhZHkgYnkgdmFyaW91cwogIE1pY3Jvc29mdCB3ZWIgYXBwbGljYXRpb25zLiAtLW5lZ290aWF0ZSBpcyB0aGUgbmV3IGZhbWlseSBtZW1iZXIuIFRvIHRha2UKICBhZHZhbnRhZ2Ugb2YgdGhpcywgeW91IG5lZWQgb25lIG9mIHRoZXNlIHBhY2thZ2VzOgoKICBvIEhlaW1kYWwgS2VyYmVyb3M1ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5wZGMua3RoLnNlL2hlaW1kYWwvaGVpbWRhbC5odG1sCiAgbyBHU1NBUEkgZnJvbSBHbG9idXMgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5nbG9idXMub3JnLwogIG8gR1NTQVBJIGxpYnJhcmllcyBmcm9tIE1JVCBLZXJiZXJvczUgIGh0dHA6Ly93ZWIubWl0LmVkdS9rZXJiZXJvcy93d3cvCgotIEEgbWlzc2luZyBlbmRpbmcgYnJhY2tldCAoJ10nKSB3aGlsZSBkb2luZyBVUkwgZ2xvYmJpbmcgY291bGQgbGVhZCB0byBhCiAgc2VnZmF1bHQuIFdoaWxlIGZpeGluZyB0aGlzLCBJIGFsc28gaW50cm9kdWNlZCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluIHRoZQogIGdsb2JiaW5nIGNvZGUuIChBbGwgdGhpcyBpcyBhcHBsaWNhdGlvbiBjb2RlIG91dHNpZGUgbGliY3VybC4pCgpEYW5pZWwgKDYgSnVuZSkKLSBEYXZpZCBPcnJlbGwgZm91bmQgb3V0IHRoYXQgc2VuZGluZyBhIGh1Z2UgR0VUIHJlcXVlc3Qgb3ZlciBIVFRQUyBjb3VsZAogIG1ha2UgbGliY3VybCBmYWlsIGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZS4KCkRhbmllbCAoMiBKdW5lKQotIFJpY2hhcmQgQnJhbWFudGUgZm91bmQgb3V0IHRoYXQgIkNvbnRlbnQtTGVuZ3RoOiAwIiB3YXMgbm90IHByb3Blcmx5IHVzZWQgYnkKICBsaWJjdXJsIGlmIHRoZSByZXNwb25zZS1oZWFkZXJzIGluZGljYXRlZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdvdWxkIGJlCiAgY2xvc2VkLgoKLSBEYXZpZCBCeXJvbidzIHBhdGNoIHdhcyBhcHBsaWVkLCB0aGF0IG1ha2VzIHRoZSAtLXByb2dyZXNzLWJhciB0YWtlIHRoZQogIGxvY2FsIHNpemUgaW50byBhY2NvdW50IHdoZW4gZG9pbmcgcmVzdW1lZCBkb3dubG9hZHMuCgotIEZlZWRiYWNrIGZyb20gU2VyZ2UgU2VtYXNoa28gbWFkZSBtZSBjaGFuZ2UgdGhlIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgd2hlbgogIENVUkxFX0hUVFBfUkVUVVJORURfRVJST1IgaXMgcmV0dXJuZWQuCgotIEFub255bW91cyBpbiBidWcgcmVwb3J0ICM3NDUxMjIgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaG91bGQgcmVhbGx5IGJlIHVzaW5nCiAgU1NMX0NUWF9zZXRfb3B0aW9ucyguLi4gU1NMX09QX0FMTCkgdG8gd29yayBhcm91bmQgZmxhd3MgaW4gZXhpc3RpbmcgU1NMCiAgaW1wbGVtZW50YXRpb25zLgoKRGFuaWVsICgyNyBNYXkpCi0gQW5kcmVhcyBMZXkgYW5kIFJpY2ggR3JheSBoZWxwZWQgbWUgcG9pbnQgb3V0IHRoYXQgbm8gdmVyc2lvbiBvZiBIUC1VWCBoYXMKICB0aGUgc3lzL3NlbGVjdC5oIGhlYWRlciBmaWxlIHNvIGluY2x1ZGluZyBpdCB1bmNvbmRpdGlvbmFsbHkgaW4gY3VybC9tdWx0aS5oCiAgaXMgbm90IGEgZ29vZCB0aGluZy4gTm93IHdlIGNoZWNrIGZvciBIUFVYIGFuZCBhdm9pZCB1c2luZyB0aGF0IGhlYWRlciBvbgogIHN1Y2ggc3lzdGVtcy4KCi0gUnVkeSBLb2VudG8gZXhwZXJpZW5jZWQgcHJvYmxlbXMgd2l0aCBjdXJsJ3MgcmVjZW50IGhhYml0IG9mIFBPU1RpbmcgZGF0YSBpbgogIHR3byBzZXBhcmF0ZSBzZW5kKCkgY2FsbHMsIGZpcnN0IHRoZSBoZWFkZXJzIGFuZCB0aGVuIHRoZSBkYXRhLiBJJ3ZlIG5vdwogIG1hZGUgYSBmaXggdGhhdCBmb3Igc3RhdGljIGFuZCBrbm93biBjb250ZW50IHRoYXQgaXMgbGVzcyB0aGFuIDEwMEsgaW4gc2l6ZSwKICBldmVyeXRoaW5nIGlzIG5vdyBzZW50IGluIG9uZSBzaW5nbGUgc3lzdGVtIGNhbGwgYWdhaW4uIFRoaXMgaXMgYWxzbyBiZXR0ZXIKICBmb3IgbmV0d29yayBwZXJmb3JtYW5jZSByZWFzb25zLgoKLSBJIG1vZGlmaWVkIHRoZSBtYWluIG1ha2VmaWxlIHRvIG5vdCBidWlsZCB0aGUgdGVzdCBzdWl0ZSBhbmQgYSBmZXcgb3RoZXIKICB1bm5lY2Vzc2FyeSB0aGluZ3MgYnkgZGVmYXVsdC4gTm93LCB0aGUgdGVzdCBzdWl0ZSBpcyBidWlsdCB3aGVuICdtYWtlIHRlc3QnCiAgaXMgcnVuLiAgVGhpcyByZWR1Y2VzIGJ1aWxkIHRpbWUgZm9yIHRob3NlIHdobyBkb24ndCBjYXJlIGZvciB0aGUgdGVzdAogIHN1aXRlLCBhbmQgaXQgYWxzbyByZWR1Y2VzIGNvbmZ1c2lvbiBmb3IgcGVvcGxlIHVzaW5nIHBsYXRmb3JtcyB3aGVyZSB0aGUKICB0ZXN0IHN1aXRlIGJ1aWxkIGZhaWxzIQoKRGFuaWVsICgyNiBNYXkpCi0gQ2hyaXMgTGV3aXMgcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSAjaWZkZWZzIGluIGN1cmwvbXVsdGkuaCBmb3IgV2luZG93cywKICB3aGljaCBpcyBub3cgY29ycmVjdGVkLgoKLSBKaXMgSm95IGZvdW5kIGFub3RoZXIgZmxhdyBpbiB0aGUgU09DSzUgY29kZSwgYXMgbGliY3VybCB0cmVhdGVkIHRoZSBzb2NrczUKICBwcm94eSBhIGxpdHRsZSB0b28gbXVjaCBsaWtlIGFzIGlmIGl0IHdhcyBhIGh0dHAgcHJveHkuCgpEYW5pZWwgKDIzIE1heSkKLSBSaWNhcmRvIENhZGltZSBmb3VuZCBhIHNvY2tldCBsZWFrIHdoZW4gbGlzdGluZyBkaXJlY3RvcmllcyB3aXRob3V0CiAgY29udGVudHMuIFRlc3QgY2FzZXMgMTQ0IGFuZCAxNDUgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gUnVkeSBLb2VudG8gZm91bmQgeWV0IGFub3RoZXIgcHJvYmxlbSB3aGVuIGEgSFRUUCBzZXJ2ZXIgcmV0dXJucyBvbmx5IGEKICBzaW5nbGUtbGluZSBvZiBjb250ZW50cyB3aXRob3V0IGFueSBoZWFkZXJzIGF0IGFsbC4gbGliY3VybCB0aGVuIGZhaWxlZCB0bwogIGNvdW50IHRoZSBkYXRhLCB0aHVzIHJldHVybmluZyBlcnJvciA1MiAibm8gY29udGVudHMiLiBUZXN0IGNhc2UgNjYgd2FzCiAgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgd2Ugbm93IGRvIHJpZ2h0LgoKVmVyc2lvbiA3LjEwLjYtcHJlMSAoMjMgTWF5IDIwMDMpCgpEYW5pZWwgKDIzIE1heSkKLSBKaXMgaW4gYnVnIHJlcG9ydCAjNzQxODQxLCBmaXhlZCBhIGJ1ZyBpbiB0aGUgU09DS1M1IHByb3h5LXVzaW5nIGNvZGUuCgpEYW5pZWwgKDIyIE1heSkKLSBEYXZpZCBSZW1haGwgc2V0IHVwIGEgdGVzdC1zZXJ2ZXIgZm9yIG1lIHByb3ZpZGluZyBEaWdlc3QgYXV0aGVudGljYXRpb24sCiAgYW5kIEkgd3JvdGUgdGhlIGZpcnN0IHdvcmtpbmcgY29kZSB0aGF0IHN1cHBvcnQgaXQuIFRoZSB0ZXN0IHN1aXRlIHdhcwogIG1vZGlmaWVkIHNsaWdodGx5IGFzIHdlbGwgdG8gd29yayBiZXR0ZXIgZm9yIGl0IGFuZCAtLWRpZ2VzdCB3YXMgYWRkZWQgdG8KICB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgKGFuZCBDVVJMT1BUX0hUVFBESUdFU1QgdG8gdGhlIGxpYnJhcnkpLi4uICBSRkMyNjE3CiAgaGFzIGFsbCB0aGUgZ29yeSBkZXRhaWxzLgoKRGFuaWVsICgyMSBNYXkpCi0gRGF2aWQgQmFsYXppYyBwb2ludGVkIG91dCB0aGF0IGN1cmxfdW5lc2NhcGUoKSBkaWRuJ3QgY2hlY2sgdGhhdCAlLWNvZGVzCiAgd2VyZSBjb3JyZWN0bHkgZm9sbG93ZWQgYnkgdHdvIGhleGFkZWNpbWFsIGRpZ2l0cyB3aGVuIGl0IHVuZXNjYXBlIHN0cmluZ3MuCiAgTm93LCB3ZSBkbyB0aGUgY2hlY2sgYW5kIG9ubHkgJVhYIGNvZGVzIGFyZSB1bmVzY2FwZWQgaWYgdGhlIFggbGV0dGVycyBhcmUKICBoZXhhZGVjaW1hbHMuCgotIEdpc2xlIFZhbmVtIG1hZGUgY3VybCBidWlsZCB3aXRoIGRqZ3BwIG9uIERPUy4KCi0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgdGhlIG1raGVscC5wbCBzY3JpcHQgdG8gbWFrZSBhIG5pY2VyIG1hbnVhbCB0aGF0IGlzCiAgc2hvd24gd2l0aCBjdXJsIC1NLgoKRGFuaWVsICgyMCBNYXkpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsIG1vcmUgY29uc2VydmF0aXZlLCBub3QKICBleHBlY3RpbmcgaF9hbGlhc2VzIG9mIHRoZSBob3N0ZW50IHN0cnVjdCB0byBhbHdheXMgYmUgbm9uLU5VTEwuCgpEYW5pZWwgKDE5IE1heSkKLSBBcyByZXF1ZXN0ZWQgYnkgTWFydGluIE1pY2hsbWF5ciBpbiBEZWJpYW4gYnVnIHJlcG9ydCAjMTkzNjMwLCBsaWJjdXJsIG5vdwogIHN1cHBvcnRzIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaW4gdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy4gQWRkZWQKICB0ZXN0IGNhc2UgNjMgdG8gdmVyaWZ5IHRoaXMuCgpWZXJzaW9uIDcuMTAuNSAoMTkgTWF5IDIwMDMpCgpEYW5pZWwgKDE1IE1heSkKLSBDaGFuZ2VkIHRoZSBvcmRlciBmb3IgdGhlIGluX2FkZHJfdCB0ZXN0aW5nLCBhcyAndW5zaWduZWQgbG9uZycgc2VlbXMgdG8gYmUKICBhIHZlcnkgY29tbW9uIHR5cGUgaW5ldF9hZGRyKCkgcmV0dXJucy4KCkRhbmllbCAoMTQgTWF5KQotIEdlb3JnZSBDb21uaW5vcyBwcm92aWRlZCBhIGZpeCB0aGF0IGNhbGxzIHRoZSBwcm9ncmVzcyBtZXRlciB3aGVuIHdhaXRpbmcKICBmb3IgRlRQIGNvbW1hbmQgcmVzcG9uc2VzIHRha2UgPjEgc2Vjb25kLiBJdCdsbCBtYWtlIGFwcGxpY2F0aW9ucyBtb3JlCiAgInJlc3BvbnNpdmUiIGV2ZW4gd2hlbiBkZWFsaW5nIHdpdGggdmVyeSBzbG93IGZ0cCBzZXJ2ZXJzLgoKRGFuaWVsICgxMiBNYXkpCi0gR2VvcmdlIENvbW5pbm9zIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB1cGxvYWRzIGhhZCB0d28gcXVpcmtzOgogICBvIHdoZW4gdXNpbmcgRlRQIFBPUlQgY29tbWFuZCwgaXQgdXNlZCBibG9ja2luZyBzb2NrZXRzIQogICBvIGl0IGNvdWxkIGxvb3AgYSBsb25nIHRpbWUgd2l0aG91dCBkb2luZyBwcm9ncmVzcyBtZXRlciB1cGRhdGVzCiAgQm90aCBpdGVtcyBhcmUgZml4ZWQgbm93LgoKRGFuaWVsICg5IE1heSkKLSBEYW4gRmFuZHJpY2ggY2hhbmdlZCBDVVJMT1BUX0VOQ09ESU5HIHRvIHNlbGVjdCBhbGwgc3VwcG9ydGVkIGVuY29kaW5ncyBpZgogIHNldCB0byAiIi4gIFRoaXMgZnJlZXMgdGhlIGFwcGxpY2F0aW9uIGZyb20gaGF2aW5nIHRvIGtub3cgd2hpY2ggZW5jb2RpbmdzCiAgdGhlIGxpYnJhcnkgc3VwcG9ydHMuCgotIERhbiBGYW5kcmljaCBwb2ludGVkIG91dCB3ZSBoYWQgdGhyZWUgdW5uZWNlc3NhcnkgZmlsZXMgaW4gQ1ZTIHRoYXQgaXMKICBnZW5lcmF0ZWQgd2l0aCBsaWJ0b29saXplLCBzbyB0aGV5J3JlIG5vdyByZW1vdmVkIGFuZCBsaWJ0b29saXplIGlzIGludm9rZWQKICBhY2NvcmRpbmdseSBpbiB0aGUgYnVpbGRjb25mIHNjcmlwdC4KCi0gQXZlcnkgRmF5IGZvdW5kIG91dCB0aGF0IHRoZSBDVVJMT1BUX0lOVEVSRkFDRSB3YXkgb2YgZmlyc3QgY2hlY2tpbmcgaWYgdGhlCiAgZ2l2ZW4gbmFtZSBpcyBhIG5ldHdvcmsgaW50ZXJmYWNlIGdhdmUgYSByZWFsIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gTGludXgsCiAgc28gbm93IHdlIG1vcmUgYXBwcm9wcmlhdGVseSBmaXJzdCBjaGVjayBpZiBpdCBpcyBhbiBJUCBudW1iZXIgYW5kIGlmIHNvCiAgd2UgZG9uJ3QgY2hlY2sgZm9yIGEgbmV0d29yayBpbnRlcmZhY2Ugd2l0aCB0aGF0IG5hbWUuCgotIENVUkxPUFRfRlRQX1VTRV9FUFJUIGFkZGVkLiBTZXQgdGhpcyB0byBGQUxTRSB0byBkaXNhYmxlIGxpYmN1cmwncyBhdHRlbXB0cwogIHRvIHVzZSBFUFJUIGFuZCBMUFJUIGJlZm9yZSB0aGUgdHJhZGl0aW9uYWwgUE9SVCBjb21tYW5kLiBUaGUgY29tbWFuZCBsaW5lCiAgdG9vbCBzZXRzIHRoaXMgb3B0aW9uIHdpdGggJy0tZGlzYWJsZS1lcHJ0Jy4KClZlcnNpb24gNy4xMC41LXByZTIgKDYgTWF5IDIwMDMpCgpEYW5pZWwgKDYgTWF5KQotIEtldmluIERlbGFmaWVsZCByZXBvcnRlZCBhbm90aGVyIGNhc2Ugd2hlcmUgd2UgZGlkbid0IGNvcnJlY3RseSBjaGVjayBmb3IKICBFQUdBSU4gYnV0IG9ubHkgRVdPVUxEQkxPQ0ssIHdoaWNoIGNhdXNlZCBiYWRuZXNzIG9uIEhQVVguCgpEYW5pZWwgKDQgTWF5KQotIEJlbiBHcmVlYXIgbm90aWNlZCB0aGF0IHRoZSBjaGVjayBmb3IgJ3dyaXRhYmxlIGFyZ3YnIGV4aXRlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHdoZW4gcnVuIGZvciBjcm9zcy1jb21waWxpbmcsIHdoaWNoIHdhc24ndCBuaWNlLiBOb3cgaXQnbGwgZGVmYXVsdCB0bwogIG5vIGFuZCBvdXRwdXQgYSB3YXJuaW5nIGFib3V0IHRoZSBmYWN0IHRoYXQgaXQgd2FzIG5vdCBjaGVja2VkIGZvci4KCkRhbmllbCAoMiBNYXkpCi0gQWRkZWQgdGVzdCBjYXNlIDYyIGFuZCBmaXhlZCBzb21lIG1vcmUgb24gdGhlIGNvb2tpZSBzZW5kaW5nIHdpdGggYSBjdXN0b20KICBIb3N0OiBoZWFkZXIgc2V0LgoKRGFuaWVsICgxIE1heSkKLSBBbmR5IENlZGlsbmlrIGZpeGVkIGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzLgoKLSBNYWRlIHRoZSAiU1NMIHJlYWQgZXJyb3I6IDUiIGVycm9yIG1lc3NhZ2UgbW9yZSB2ZXJib3NlLCBieSBhZGRpbmcgY29kZSB0aGF0CiAgcXVlcmllcyB0aGUgT3BlblNTTCBsaWJyYXJ5IHRvIGZpbGwgaW4gdGhlIGVycm9yIGJ1ZmZlci4KCkRhbmllbCAoMzAgQXByKQotIEFkZGVkIHN5cy9zZWxlY3QuaCBpbmNsdWRlIGluIHRoZSBjdXJsL211bHRpLmggZmlsZSwgYWZ0ZXIgaGF2aW5nIGJlZW4KICByZW1pbmRlZCBhYm91dCB0aGlzIGJ5IFJpY2ggR3JheS4KCi0gSSBtYWRlIGVhY2ggdGVzdCBzZXQgaXRzIG93biBzZXJ2ZXIgcmVxdWlyZW1lbnRzLCB0aHVzIGFiYW5kb25pbmcgdGhlCiAgcHJldmlvdXMgc3lzdGVtIHdoZXJlIHRoZSB0ZXN0IG51bWJlciBpbXBsaWVkIHdoYXQgc2VydmVyKHMpIHRvIHVzZSBmb3IgYQogIHNwZWNpZmljIHRlc3QuCgotIERhdmlkIEJhbGF6aWMgbWFkZSBjdXJsIG1vcmUgUkZDMTczOC1jb21wbGlhbnQgZm9yIEZUUCBVUkxzLCBieSBmaXhpbmcgc28KICB0aGF0IGxpYmN1cmwgbm93IHVzZXMgb25lIENXRCBjb21tYW5kIGZvciBlYWNoIHBhdGggcGFydC4gQSBidW5jaCBvZiB0ZXN0CiAgY2FzZXMgd2VyZSBmaXhlZCB0byB3b3JrIGFjY29yZGluZ2x5LgoKLSBDb29raWUgZml4ZXM6CgogIEEuIFNhdmUgZG9tYWlucyBpbiBqYXJzIGxpa2UgTW96aWxsYSBkb2VzLiBJdCBtZWFucyBhbGwgZG9tYWlucyBzZXQgaW4KICAgICBTZXQtQ29va2llOiBoZWFkZXJzIGFyZSBkb3QtcHJlZml4ZWQuCiAgQi4gU2F2ZSBhbmQgdXNlIHRoZSAndGFpbG1hdGNoJyBmaWVsZCBpbiB0aGUgTW96aWxsYS9OZXRzY2FwZSBjb29raWUgamFycwogICAgICh0aGUgc2Vjb25kIGNvbHVtbikuCiAgQy4gUmVqZWN0IGNvb2tpZXMgdXNpbmcgaWxsZWdhbCBkb21haW5zIGluIHRoZSBTZXQtQ29va2llOiBsaW5lLiBDb25jZXJucwogICAgIGJvdGggZG9tYWlucyB3aXRoIHRvbyBmZXcgZG90cyBvciBkb21haW5zIHRoYXQgYXJlIG91dHNpZGUgdGhlIGN1cnJlbnRseQogICAgIG9wZXJhdGluZyBzZXJ2ZXIgaG9zdCdzIGRvbWFpbi4KICBELiBTZXQgdGhlIHBhdGggcGFydCBieSBkZWZhdWx0IHRvIHRoZSBvbmUgdXNlZCBpbiB0aGUgcmVxdWVzdCwgaWYgbm9uZSB3YXMKICAgICBzZXQgaW4gdGhlIFNldC1Db29raWUgbGluZS4KCiAgVG8gbWFrZSBpdGVtIEMgcmVhbGx5IGdvb2QsIEkgYWxzbyBtYWRlIGxpYmN1cmwgbm90aWNlIGN1c3RvbSBIb3N0OiBoZWFkZXJzCiAgYW5kIGV4dHJhY3QgdGhlIGhvc3QgbmFtZSBzZXQgaW4gdGhlcmUgYW5kIHVzZSB0aGF0IGFzIHRoZSBob3N0IG5hbWUgZm9yIHRoZQogIHNpdGUgd2UncmUgZ2V0dGluZyB0aGUgY29va2llcyBmcm9tLiBUaGlzIGFsbG93cyB1c2VyIHRvIHNwZWNpZnkgYSBzaXRlJ3MKICBJUC1hZGRyZXNzLCBidXQgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGFuZCBzZW5kIGl0cyBjb29raWVzIHByb3Blcmx5IGlmCiAgeW91IHByb3ZpZGUgYSB2YWxpZCBIb3N0OiBuYW1lIGZvciB0aGUgc2l0ZS4KCkRhbmllbCAoMjkgQXByKQotIFBldGVyIEtvdmFjcyBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIENVUkxJTkZPX0NPTk5FQ1RfVElNRSB3b3JrIGZpbmUKICB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgKHRvbykuCgpWZXJzaW9uIDcuMTAuNS1wcmUxICgyMyBBcHIgMjAwMykKCkRhbmllbCAoMjMgQXByKQotIFVwZ3JhZGVkIHRvIGxpYnRvb2wgMS41LgoKRGFuaWVsICgyMiBBcHIpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHRoYXQgY3VybF9lYXN5X3NldG9wdCgpIHdpbGwgYWx3YXlzICh3cm9uZ2x5KQogIHJldHVybiBDVVJMRV9PSyBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgc29tZSBnemlwIGRlY29tcHJlc3Npb24gYnVncyBhbmQgZmxhd3MuCgpEYW5pZWwgKDE2IEFwcikKLSBGaXhlZCBtaW5vciB0eXBvIGluIG1hbiBwYWdlLCByZXBvcnRlZCBpbiB0aGUgRGViaWFuIGJ1ZyB0cmFja2VyLgoKRGFuaWVsICgxNSBBcHIpCi0gRml4ZWQgc29tZSBGVFAgdGVzdHMgaW4gdGhlIHRlc3Qgc3VpdGUgdGhhdCBmYWlsZWQgb24gbXkgU29sYXJpcyBob3N0LCBkdWUKICB0byB0aGUgY29uZmlnLmggbm90IGJlaW5nIGluY2x1ZGVkIGJlZm9yZSB0aGUgc3lzdGVtIGhlYWRlcnMuIFdoZW4gZG9uZSB0aGF0CiAgd2F5LCBpdCBkaWQgZ2V0IGEgbWl4ZWQgc2Vuc2Ugb2YgaWYgYmlnIGZpbGVzIGFyZSBzdXBwb3J0ZWQgb3Igbm90IGFuZCB0aGVuCiAgc3RhdCgpIGFuZCBmc3RhdCgpIChhcyB1c2VkIGluIHRlc3QgY2FzZSA1MDUpIGdvdCBjb25mdXNlZCBhbmQgZmFpbGVkIHRvCiAgcmV0dXJuIGEgcHJvcGVyIGZpbGUgc2l6ZS4KCi0gRm9ybXBvc3RpbmcgYSBmaWxlIHVzaW5nIGEgLmh0bWwgc3VmZml4IGlzIG5vdyBwcm9wZXJseSBzZXQgdG8gQ29udGVudC1UeXBlOiAgICB0ZXh0L2h0bWwuCgpEYW5pZWwgKDE0IEFwcikKLSBGaXhlZCB0aGUgU1NMIGVycm9yIGhhbmRsaW5nIHRvIHJldHVybiBwcm9wZXIgU1NMIGVycm9yIG1lc3NhZ2VzIGFnYWluLCB0aGV5CiAgYnJva2UgaW4gNy4xMC40LiBJIGFsc28gYXR0ZW1wdCB0byB0cmFjayBkb3duIENBIGNlcnQgcHJvYmxlbXMgYW5kIHRoZW4KICByZXR1cm4gdGhlIENVUkxFX1NTTF9DQUNFUlQgZXJyb3IgY29kZS4KCi0gVGhlIGN1cmwgdG9vbCBub3cgaW50ZXJjZXB0cyB0aGUgQ1VSTEVfU1NMX0NBQ0VSVCBlcnJvciBjb2RlIGFuZCBkaXNwbGF5cwogIGEgZmFpcmx5IGJpZyBhbmQgZXhwbGFuYXRvcnkgZXJyb3IgbWVzc2FnZS4gS2V2aW4gUm90aCBoZWxwZWQgbWUgb3V0IHdpdGgKICB0aGUgd29yZGluZy4KCkRhbmllbCAoMTEgQXByKQotIE5pYyBIaW5lcyBwcm92aWRlZCBhIHNlY29uZCBwYXRjaCBmb3IgZ3ppcCBkZWNvbXByZXNzaW9uLCBhbmQgZml4ZWQgYSBidWcKICB3aGVuIGRlZmxhdGUgb3IgZ3ppcCBjb250ZW50cyB3ZXJlIGRvd25sb2FkZWQgdXNpbmcgY2h1bmtlZCBlbmNvZGluZy4KCi0gRGFuIEZhbmRyaWNoIG1hZGUgbGliY3VybCBzdXBwb3J0IGF1dG9tYXRpYyBkZWNvbXByZXNzaW9uIG9mIGd6aXAgY29udGVudHMKICAoYXMgYW4gYWRkaXRpb24gdG8gdGhlIHByZXZpb3VzIGRlZmxhdGUgc3VwcG9ydCkuCgotIEkgbWFkZSB0aGUgQ1dEIGNvbW1hbmQgZHVyaW5nIEZUUCBzZXNzaW9uIGNvbnNpZGVyIGFsbCAyeHkgY29kZXMgdG8gYmUgT0sKICByZXNwb25zZXMuCgpEYW5pZWwgKDEwIEFwcikKLSBWbGFkIEtydXBpbiBmaXhlZCBhIFVSTCBwYXJzaW5nIGlzc3VlLiBVUkxzIHRoYXQgd2VyZSBub3QgdXNpbmcgYSBzbGFzaAogIGFmdGVyIHRoZSBob3N0IG5hbWUsIGJ1dCBzdGlsbCBoYWQgIj8iIGFuZCBwYXJhbWV0ZXJzIGFwcGVuZGVkLCBhcyBpbgogICJodHRwOi8vaG9zdG5hbWUuY29tP2Zvb2Jhcj1tb28iLCB3ZXJlIG5vdCBwcm9wZXJseSBwYXJzZWQgYnkgbGliY3VybC4KCkRhbmllbCAoOSBBcHIpCi0gTWFkZSBDVVJMT1BUX1RJTUVDT05ESVRJT04gd29yayBmb3IgRlRQIHRyYW5zZmVycywgdXNpbmcgdGhlIHNhbWUgc3ludGF4IGFzCiAgZm9yIEhUVFAuIFRoaXMgdGhlbiBtYWRlIC16IHdvcmsgZm9yIGZ0cCB0cmFuc2ZlcnMgdG9vLiBBZGRlZCB0ZXN0IGNhc2UgMTM5CiAgYW5kIDE0MCBmb3IgdmVyaWZ5aW5nIHRoaXMuCgotIEdldHRpbmcgdGhlIGZpbGUgZGF0ZSBvZiBhbiBmdHAgZmlsZSB1c2VkIHRoZSB3cm9uZyB0aW1lIHpvbmUgd2hlbgogIGRpc3BsYXllZC4gSXQgaXMgc3VwcG9zZWRseSBhbHdheXMgR01ULiBBZGRlZCB0ZXN0IGNhc2UgMTQxIGZvciB0aGlzLgoKLSBNYWRlIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciBzdXBwb3J0IE1EVE0uCgotIFRoZSBkZWZhdWx0IERFQlVHRlVOQ1RJT04sIGFzIGVuYWJsZWQgd2l0aCBDVVJMT1BUX1ZFUkJPU0Ugbm93IG91dHB1dHMKICBDVVJMSU5GT19IRUFERVJfSU4gZGF0YSBhcyB3ZWxsLiBUaGUgbW9zdCBub3RhYmxlIGVmZmVjdCBmcm9tIHRoaXMgaXMgdGhhdAogIHVzaW5nIGN1cmwgLXYsIHlvdSBnZXQgdG8gc2VlIHRoZSBpbmNvbWluZyAiaGVhZGVycyIgYXMgd2VsbC4gVGhpcyBpcwogIHBlcmhhcHMgbW9zdCB1c2VmdWwgd2hlbiBkb2luZyBmdHAuCgpEYW5pZWwgKDggQXByKQotIEphbWVzIEJ1cnNhIGZpeGVkIGEgZmxhdyBpbiB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gY29kZSwgd2hpY2ggbWlzc2VkCiAgdGhlIGZpcnN0IGxldHRlciBpZiBubyBzcGFjZSBmb2xsb3dlZCB0aGUgY29sb24uCgotIE1hZ251cyBOaWxzc29uIHBvaW50ZWQgb3V0IHRoYXQgc2hhcmUuYyB3YXMgbWlzc2luZyBpbiB0aGUgTVNWQyBwcm9qZWN0CiAgZmlsZS4KCkRhbmllbCAoNiBBcHIpCi0gUnlhbiBXZWF2ZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBDQSBjZXJ0IGJ1bmRsZSBub3QgZ2V0IGluc3RhbGxlZAogIGFueW1vcmUgd2hlbiAnY29uZmlndXJlIC0td2l0aG91dC1zc2wnIGhhcyBiZWVuIHVzZWQuCgpEYW5pZWwgKDQgQXByKQotIE1hcnRpam4gQnJvZW5sYW5kIGZvdW5kIGFub3RoZXIgY2FzZXMgd2hlcmUgYSBzZXJ2ZXIgYXBwbGljYXRpb24gZGlkbid0CiAgbGlrZSB0aGUgYm91bmRhcnkgc3RyaW5nIHVzZWQgYnkgY3VybCB3aGVuIGRvaW5nIGEgbXVsdGktcGFydC9mb3JtcG9zdC4gV2UKICBtb2RpZmllZCB0aGUgYm91bmRhcnkgc3RyaW5nIHRvIGxvb2sgbGlrZSB0aGUgb25lIElFIHVzZXMsIGFzIHRoaXMgaXMKICBwcm9iYWJseSBnb25uYSBtYWtlIGN1cmwgd29yayB3aXRoIG1vcmUgYXBwbGljYXRpb25zLgoKRGFuaWVsICgzIEFwcikKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHRoYXQgYSBidW5jaCBvZiB0ZXN0cyBmYWlscyBvbiBjeWd3aW4uIE9uZSBzZXQgZmFpbHMKICB3aGVuIHVzaW5nIHBlcmwgNS44IChhbmQgdGhleSBydW4gZmluZSB3aXRoIHBlcmwgNS42KSwgYW5kIGFub3RoZXIgc2V0CiAgZmFpbGVkIGJlY2F1c2Ugb2YgYW4gYXJ0aWZhY3QgaW4gdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRoYXQgSQogIGNvcnJlY3RlZC4gSXQgdHVybmVkIG91dCB0aGUgRlRQIHNlcnZlciBjb2RlIHdhcyBzdGlsbCBoYXZpbmcgYSBmaWxlIG9wZW5lZAogIHdoaWxlIHRoZSBtYWluIHRlc3Qgc2NyaXB0IHJlbW92ZWQgaXQgYW5kIGludm9rZWQgdGhlIEhUVFAgc2VydmVyIHRoYXQKICBhdHRlbXB0ZWQgdG8gY3JlYXRlIHRoZSBzYW1lIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgRlRQIHNlcnZlciBrZXB0IG9wZW4uCiAgVGhpcyBvcGVyYXRpb24gd29ya3MgZmluZSBvbiB1bml4LCBidXQgbm90IG9uIGN5Z3dpbi4KClZlcnNpb24gNy4xMC40ICgyIEFwciAyMDAzKQoKRGFuaWVsICgxIEFwcikKLSBBZGRlZCB0ZXN0IGNhc2UgNTA1IHRvIGV4ZXJjaXNlIEZUUCB1cGxvYWQgd2l0aCByZW5hbWUgZG9uZSB3aXRoIGxpYmN1cmwsCiAgYW5kIGZvciB0aGF0IEkgaGFkIHRvIGV4dGVuZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gZGVhbCB3aXRoIHRoZQogIFJORlIgYW5kIFJOVE8gY29tbWFuZHMuCgpEYW5pZWwgKDMxIE1hcikKLSBFdmVuIG1vcmUgU1NMIGNvbmZpZyBjaGVjayBtb2RpZmljYXRpb25zIGFmdGVyIFJpY2hhcmQncyB0ZXN0aW5nLgoKVmVyc2lvbiA3LjEwLjQtcHJlNiAoMzEgTWFyIDIwMDMpCgpEYW5pZWwgKDMxIE1hcikKLSBNb3JlIGZpeGVzIGZvciB0aGUgU1NMIHNlc3Npb24gSUQgY2FjaGUgY2hlY2tzIHdoZW4gU1NMIGNvbmZpZ3MgYXJlIGNoYW5nZWQKICBiZXR3ZWVuIGNvbm5lY3Rpb25zLiBCYXNlZCBvbiB0ZXN0cyBhbmQgdGFsa3Mgd2l0aCBSaWNoYXJkIEJyYW1hbnRlLgoKLSBHdWlsbGF1bWUgQ290dGVuY2VhdSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWRkZWQgQ1VSTE9QVF9VTlJFU1RSSUNURURfQVVUSC4KICBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgcHJldmVudCBsaWJjdXJsIGZyb20gbGltaXRpbmcgdG8gd2hpY2ggaG9zdCBpdCBzZW5kcwogIHVzZXIrcGFzc3dvcmQgdG8gd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLiBCeSBkZWZhdWx0LCBsaWJjdXJsIG9ubHkgc2VuZHMKICBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgaG9zdCB1c2VkIGluIHRoZSBmaXJzdCBVUkwsIGJ1dCB3aXRoIHRoaXMKICBvcHRpb24gc2V0IGl0IHdpbGwgc2VuZCB0aGUgYXV0aCBpbmZvIHRvIGFsbCBob3N0cyBpdCBmb2xsb3dzIGxvY2F0aW9uCiAgaGVhZGVycyB0by4gVGhlIG5ldyB0b29sIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHRoaXMgaXMgbmFtZWQKICAiLS1sb2NhdGlvbi10cnVzdGVkIi4KCi0gRnJhbmtpZSBGb25nIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgaWYgeW91IHJlLXVzZWQgYW4gZWFzeSBoYW5kbGUKICB3aXRoIGEgcHJveHksIGFuZCB5b3UgZmlyc3QgbWFkZSBhIGh0dHBzOi8vIGNvbm5lY3Rpb24gdG8gYSBob3N0IGFuZCB0aGVuCiAgc3dpdGNoZWQgdG8gYSBodHRwOi8vIG9uZSB0byB0aGUgc2FtZSBob3N0LiBsaWJjdXJsIHdvdWxkIHRoZW4gd3JvbmdseSByZS11c2UKICB0aGUgc2FtZSBjb25uZWN0aW9uIGZvciBpdCBhbmQgZmFpbCB0byBnZXQgdGhlIHNlY29uZCBVUkwgcHJvcGVybHkKCkRhbmllbCAoMjkgTWFyKQotIERhbiBTaGVhcmVyJ3MgZml4IHRoYXQgbWFrZXMgY3VybCBjb21wbGFpbiBpZiBpbnZva2VkIHdpdGggbm90aGluZyBidXQgImN1cmwKICAtTyIgd2FzIGFwcGxpZWQuCgpEYW5pZWwgKDI2IE1hcikKLSBCcnlhbiBLZW1wIHdhcyBmcmllbmRseSBlbm91Z2ggdG8gbGVuZCBtZSBhbiBhY2NvdW50IG9uIGhpcyBSZWRoYXQgOSBib3ggYW5kCiAgSSBjb3VsZCBmaXggdGhlIGNvbmZpZ3VyZSBwcm9ibGVtcyBvbiByZWRoYXQgOC4xIGFuZCA5IGluIG5vIHRpbWUgdGhhbmtzIHRvCiAgdGhpcy4gVGhhbmtzIGEgYnVuY2ggQnJ5YW4hCgpEYW5pZWwgKDI1IE1hcikKLSBSZW5hbWVkIGNvbmZpZ3VyZS5pbiB0byBjb25maWd1cmUuYWMKClZlcnNpb24gNy4xMC40LXByZTUgKDI1IE1hciAyMDAzKQoKRGFuaWVsICgyNSBNYXIpCi0gUmljaGFyZCBCcmFtYW50ZSBwcm92aWRlZCBhIGZpeCBmb3IgYSBoYW5kbGUgcmUtdXNlIHByb2JsZW0gc2VlbiB3aGVuIHlvdQogIGNoYW5nZSBvcHRpb25zIG9uIGFuIFNTTC1lbmFibGVkIGNvbm5lY3Rpb24gYmV0d2VlbiByZXF1ZXN0cy4gUHJldmlvdXNseSwKICBjaGFuZ2luZyBwZWVyIHZlcmlmaWNhdGlvbiBvciBob3N0IHZlcmlmaWNhdGlvbiBhbmQgc2ltaWxhciB0aGluZ3Mgd2FzIG5vdAogIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGEgY29ubmVjdGlvbiB3ZXJlIGNoZWNrZWQgZm9yIHJlLXVzZSBhbmQgdGh1cwogIGVuYWJsaW5nIHN0cmljdGVyIGNoZWNrIGJldHdlZW4gcmVxdWVzdHMgb24gYSByZS11c2VkIGNvbm5lY3Rpb24gbWFkZSBubwogIGRpZmZlcmVuY2UgYW5kIHRoZSBjb25uZWN0aW9uIHdvdWxkIHRodXMgYmUgdXNlZCBlcnJvbmVvdXNseS4KCkRhbmllbCAoMjQgTWFyKQotIEf2dHogQmFiaW4tRWJlbGwgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY2EtYnVuZGxlLmNydCBmaWxlIGNvbnRhaW5lZCBhCiAgY2VydGlmaWNhdGUgZnJvbSBUcnVzdGNlbnRlciB0aGF0IHdhcyBhIGRlbW8gY2VydGlmaWNhdGUgb25seSB0aGF0IHdhcyBuZXZlcgogIGludGVuZGVkIHRvIGJlIHBhcnQgb2YgYSBDQSBidW5kbGUuCgpEYW5pZWwgKDIxIE1hcikKLSBMaWZlIGlzIGEgbXlzdGVyeS4gV2l0aGluIGEgdGltZSBwZXJpb2Qgb2YgMTcgaG91cnMsIFRpbSBQb3BlIGFuZCBNaWNoYWVsCiAgQ2h1cmNoaWxsIGZpbGVkIG9uZSBidWcgcmVwb3J0IGVhY2gsIGJvdGggaWRlbnRpZnlpbmcgcHJvYmxlbXMgd2l0aCBhIHNlY29uZAogIHRyYW5zZmVyIHdoZW4gZG9pbmcgcGVyc2lzdGVudCB0cmFuc2ZlcnMgcmUtdXNpbmcgYSBjb25uZWN0aW9uLiBUaW0ncyBvbmUgaXMKICAjNzA2NjI0LCBsYWJlbGVkICJNdWx0aXBsZSB1cGxvYWRzIHBlciBoYW5kbGUgZmFpbCIgYW5kIE1pY2hhZWwncyAjNzA3MDAzCiAgIkRvZXMgbm90IHNlbmQgQXV0aG9yaXphdGlvbjogaGVhZGVyIHdoZW4gcmV1c2luZyBjb25uZWN0aW9uIi4gSSBjb3VsZCB0cmFjawogIGJvdGggZG93biB0byB0aGUgc2FtZSBwaWVjZSBvZiBsb2dpYyBhbmQgaXQgdHVybmVkIG91dCBsaWJjdXJsIHdhcyBub3QgdXNpbmcKICBuZXcgc2V0dGluZ3MgcHJvcGVybHkgd2hlbiByZS11c2luZyBhbiBleGlzdGluZyBjb25uZWN0aW9uLiBUaGlzIGNvbmNlcm5lZAogIGJvdGggdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZyBhbmQgaW52b2x2ZWQgZXhhY3RseSB0aG9zZSBwaWVjZXMgdGhlc2UgdHdvCiAgcmVwb3J0cyBpZGVudGlmaWVkLiBUaGlzIGNvZGUgaGFzIGJlZW4gdGhpcyBmYXVsdHkgc2luY2UgdGhlIGRheSBJCiAgaW50cm9kdWNlZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLCBtb3JlIHRoYW4gMiB5ZWFycyBhZ28uCgpEYW5pZWwgKDIwIE1hciAyMDAzKQotIEZpdmUgeWVhciBhbm5pdmVyc2FyeS4gVG9kYXkgZml2ZSB5ZWFycyBhZ28sIHRoZSBmaXJzdCBldmVyIGN1cmwgcmVsZWFzZSBzYXcKICB0aGUgbGlnaHQgb2YgZGF5LgoKRGFuaWVsICgxNyBNYXIpCi0gQW5keSBDZWRpbG5payBjb3JyZWN0ZWQgZmxhd3MgaW4gc29tZSBsaWJjdXJsIGV4YW1wbGUtdXNhZ2Ugc291cmNlcy4KCkRhbmllbCAoMTYgTWFyKQotIEp1YW4gRi4gQ29kYWdub25lIHJlcG9ydGVkIHRoYXQgdGhlIGZpeCBmcm9tIE1hcmNoIDJuZCB3YXMgaW5jb21wbGV0ZS4KCi0gQWRkZWQgY29kZSB0byB0aGUgY29uZmlndXJlLmluIHRvIGNoZWNrIGZvciBzZWxlY3QoKSBhcmd1bWVudCB0eXBlcy4gSSd2ZQogIG5vdCBtYWRlIGFueSBjb2RlIHVzZSB0aGUgcmVzdWx0cyBqdXN0IHlldCB0aG91Z2guCgpEYW5pZWwgKDE1IE1hcikKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCB0d28gcGF0Y2hlcyB0byBidWlsZCBiZXR0ZXIgb24gV2luZG93cy4KCi0gQWRqdXN0ZWQgdGhlIHRlc3Qgc3VpdGUgY29kZSB0byBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgdGhlIHNlcnZlcihzKSByZXF1aXJlZAogIGZvciBhIHNwZWNpZmljIHRlc3QgaXMgcHJvcGVybHkgc3RhcnRlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBpcyBhdHRlbXB0ZWQuCiAgTWFueSB0ZXN0cyBub3cgcnVuIGEgbG90IGZhc3RlciB0aGFuIGJlZm9yZS4KCkRhbmllbCAoMTQgTWFyKQotIEFub3RoZXIgY29uZmlndXJlLmluIGFkanVzdG1lbnQgbWFkZSB0aGUgY29uZmlndXJlIGRldGVjdCBmdW5jdGlvbnMgcHJvcGVybHkKICBvbiBIUFVYIG5vdy4KCkRhbmllbCAoMTMgTWFyKQotIFBoaWxpcHBlIFJhb3VsdCBmaXhlZCBwcmU0LWNvbXBpbGUgcXVpcmtzIGZvciBGcmVlQlNELgoKVmVyc2lvbiA3LjEwLjQtcHJlNCAoMTMgTWFyIDIwMDMpCgpEYW5pZWwgKDEzIE1hcikKLSBBZGRlZCBhIGJhY2t1cC1jaGVjayBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGZvdW5kIGJ5IEFDX0NIRUNLX0ZVTkNTKCkKICBhcyBJIGJlbGlldmUgc29tZSBjaGVja3Mgb24gSFBVWCBuZWVkIHRoaXMuIEF0IGxlYXN0IHNvbWUgb2YgdGhlIGluZm8gZ2l2ZW4KICB0byB1cyBieSBSaWNrIEpvbmVzIHNlZW1lZCB0byBpbmRpY2F0ZSB0aGlzLgoKRGFuaWVsICgxMiBNYXIpCi0gVGhvbWFzIFRvbmlubyBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCB0aGUgY3VybCB0b29sIHRvIGRvIFBVVCBvcGVyYXRpb25zCiAgYXMgaW4gJ2N1cmwgd3d3LmZvby5jb20vZGlyLyAtVCBmaWxlJyBhbmQgdGhlIGZpbGUgbmFtZSBpbmNsdWRlZCBmb3IgZXhhbXBsZQogIHNwYWNlIG9yIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBiZWxvbmcgaW4gVVJMcywgY3VybCBkaWQgbm90IHByb3Blcmx5CiAgVVJMIGVuY29kZSB0aGVtIGJlZm9yZSB1c2luZyB0aGVtIGluIHRoZSBVUkwuCgotIEFkZGVkIGFuIG9wdGlvbiB0byBjb25maWd1cmUgY2FsbGVkIC0tZW5hYmxlLWxpYmdjYyB0aGF0IHNpbXBseSBhZGRzIC1sZ2NjCiAgdG8gdGhlIExJQlMgdmFyaWFibGUsIGFzIHRoaXMgc2VlbXMgdG8gYmUgYSBjb21tb24gcHJvYmxlbS4KCi0gSSBtb2RpZmllZCB0aGUgY29uZmlndXJlLmluIGZpbGUsIHNvIHRoYXQgdGhlIGhlYWRlcnMgYXJlIG5vdyBjaGVja2VkIGluIGFuCiAgb3JkZXIgb2YgInZpYWxpdHkiLiBXZSBtdXN0IGFsc28gbWFrZSBzdXJlIHRvIHVzZSB0aGUgImRlZmF1bHQgaGVhZGVycyIKICBwYXJhbWV0ZXIgdG8gQUNfQ0hFQ0tfSEVBREVSUygpIHNvIHRoYXQgaGVhZGVycyBhcmUgY2hlY2tlZCB3aXRoIHRoZSBwcm9wZXIKICBwcmVyZXF1aXNpdGVzIGluY2x1ZGVkIChpLmUgYWxsIHRoZSBtYWpvciBhbmQgZ2VuZXJhbGx5IGltcG9ydGFudCBoZWFkZXIKICBmaWxlcyBhcmUgaW5jbHVkZWQgdGhlcmUgYnkgZGVmYXVsdCkuIFRoaXMgbWlnaHQgYmUgd2hhdCB3ZSBuZWVkIGZvciB2YXJpb3VzCiAgU3VuLCBIUCwgQUlYIGFuZCBUcnU2NCBzeXN0ZW1zIHRvIGJlaGF2ZSBnb29kIGFnYWluIG9uIHRoZSBoZWFkZXIgY2hlY2sKICBmcm9udC4KCi0gUmljayBKb25lcyBwb2ludGVkIG91dCBhIGZldyBjb21waWxlciB3YXJuaW5ncyBvbiBIUC1VWCB0aGF0IEkgYWRkcmVzc2VkLgoKLSBJIG1hZGUgdGhlIGNvbmZpZ3VyZSAtLWhlbHAgb3V0cHV0IG5pY2VyIGJ5IHVzaW5nIEFDX0hFTFBfU1RSSU5HKCkgYSBsb3QKICBtb3JlLgoKRGFuaWVsICgxMSBNYXIpCi0gQ2hyaXN0b3BoZSBEZW1vcnkgZml4ZWQgdGhlIHNvY2tldCBzZW5kaW5nIGNvZGUgdG8gd29yayBiZXR0ZXIgb24gSFAtVVgKICB3aGVuIHNlbmRpbmcgZGF0YSB0byBhIHNvY2tldCB0aGF0IHdvdWxkIGJsb2NrLiBJdCB0aGVuIHJldHVybnMgRUFHQUlOLCBub3QKICBFV09VTERCTE9DSy4KCi0gUmljaGFyZCBHb3J0b24gaW1wcm92ZWQgdGhlIHNlZWRpbmcgZnVuY3Rpb24gZm9yIHN5c3RlbXMgd2l0aG91dCBhIGdvb2QKICBhbmQgcmVsaWFibGUgcmFuZG9tIHNvdXJjZS4KCi0gUmljaGFyZCBHb3J0b24gZml4ZWQgYSBmZXcgd2FybmluZ3MgdGhhdCBwb3BwZWQgdXAgd2hlbiB5b3UgYnVpbHQgY3VybAogIHVzaW5nIHRoZSBTdW4gY29tcGlsZXIgb24gYSA2NGJpdCBTUEFSQyBwbGF0Zm9ybS4KCi0gTWFydGluIEMuIE1hcnRpbiBmaXhlZCBhIGNhc2Ugd2hlcmUgYSBjb25uZWN0IGZhaWx1cmUgdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGRpZG4ndCBwcm9kdWNlIGEgaHVtYW4gcmVhZGFibGUgZXJyb3Igc3RyaW5nLgoKRGFuaWVsICgxMCBNYXIpCi0gUmV2ZXJ0ZWQgbHRtYWluLnNoIGJhY2sgdG8gbGlidG9vbCAxLjQuMiBzdGF0dXMgYWdhaW4sIGFzIHRoZSAxLjQuMyB2ZXJzaW9uCiAgYnJva2UgdGhlIGJ1aWxkIG9uIG51bWVyb3VzIHBsYXRmb3Jtcy4gSXQgc2VlbXMgdGhhdCBsaWJ0b29sIDEuNC4zIHB1dHMgc29tZQogIHJlcXVpcmVtZW50cyBvbiB3aGF0IHZlcnNpb25zIG9mIHRoZSBvdGhlciB0b29scyAoYXV0b2NvbmYgKyBhdXRvbWFrZSkgdGhhdAogIEkgYW0gbm90IGZhbWlsaWFyIHdpdGggYW5kIHRodXMgSSBjb3VsZG4ndCBmdWxmaWxsIGF0IHRoaXMgcG9pbnQuCgogIFllcywgdGhpcyBpcyBtb3JlIHRoYW4gbWlsZGx5IGZydXN0cmF0aW5nLgoKRGFuaWVsICg3IE1hcikKLSBSdW4gbGlidG9vbGl6ZSB2ZXJzaW9uIDEuNC4zLgoKVmVyc2lvbiA3LjEwLjQtcHJlMyAoNCBNYXIgMjAwMykKCkRhbmllbCAoMyBNYXIpCi0gQWRkZWQgc2hhcmUub2JqIHRvIHRoZSBWQzYgYW5kIEJvcmxhbmQgbGliY3VybCBtYWtlZmlsZXMuCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmb3VuZCBhbmQgaW52ZXN0aWdhdGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgb24gQUlYLAogIHByZXN1bWFibHkgb25seSBvbiA0LjMgb3IgbGF0ZXIuIGdldGhvc3RieW5hbWVfcigpIGlzIG5vdCByZXR1cm5pbmcgZGF0YQogIHRoYXQgaXMgcG9zc2libGUgdG8gImtlZXAiIGFuZCBjYWNoZSB0aGUgd2F5IGxpYmN1cmwgZG9lcy4gQnV0IGluc3RlYWQgdGhlc2UKICB2ZXJzaW9ucyBvZiBBSVggdXNlcyBhIGdldGhvc3RieW5hbWUoKSB0aGF0IHdvcmtzIHRocmVhZC1zYWZlbHkgd2UgY2FuCiAgaW5zdGVhZCB1c2UgdGhlIG9yZGluYXJ5IGdldGhvc3RieW5hbWUoKSBhbmQgb3VyIHBhY2tfaG9zdGVudCgpIGFwcHJvYWNoIHRvCiAgYWNoaWV2ZSB3aGF0IHdlIHdhbnQuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBhdHRlbXB0cyB0byBkZXRlY3QgQUlYIDQuMyBvcgogIGxhdGVyIHRvIGFkanVzdCBmb3IgdGhpcy4KCkRhbmllbCAoMiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgZm91bmQgYSBwcm9ibGVtIGludHJvZHVjZWQgaW4gNy4xMC4zIHdoZW4geW91IGZpcnN0IGRpZCBhCiAgUE9TVCBhbmQgdGhlbiBiYWNrIHRvIGEgR0VUIHVzaW5nIHRoZSBzYW1lIGVhc3kgaGFuZGxlLgoKRGFuaWVsICgyOCBGZWIpCi0gUmVtb3ZlZCB0aGUgc3RyZXF1YWwgYW5kIHN0cm5lcXVhbCBkZWZpbmVzIGZyb20gY3VybC9jdXJsLmggaGVhZGVyLiBUaGV5CiAgd2VyZSBuZXZlciBtZWFudCBmb3IgdGhlIHB1YmxpYyBoZWFkZXIgYW55d2F5LiBQaGlsaXBwZSBSYW91bHQgYnJvdWdodCBpdAogIHVwLgoKLSBKYW1lcyBCdXJzYSBmaXhlZCB0aGUgUklTQyBPUyBidWlsZC4KCkRhbmllbCAoMjcgRmViKQotIEF2ZXJ5IEZheSBwb2ludGVkIG91dCB0aGUgdmVyeSBtaXNsZWFkaW5nIGN1cmxfbXVsdGlfaW5mb19yZWFkIG1hbiBwYWdlLCBhbmQKICBJIHVwZGF0ZWQgaXQgdG8gYmVjb21lIG1vcmUgYWNjdXJhdGUuCgotIFNhbHZhdG9yZSBTb3JyZW50aW5vIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZGluZyB0aGF0IHR1cm5lZCBvdXQgdG8KICBiZSBoaXMgRlRQIHNlcnZlciByZXR1cm5pbmcgc2l6ZSB6ZXJvICgwIGJ5dGVzKSB3aGVuIFNJWkUgd2FzIHVzZWQgb24gYSBmaWxlCiAgd2hpbGUgYmVpbmcgaW4gQklOQVJZIG1vZGUuIFdlIG5vdyBtYWtlIGEgc2Vjb25kIGNoZWNrIGZvciB0aGUgYWN0dWFsIHNpemUKICBieSBzY2FubmluZyB0aGUgUkVUUiByZXBseSBhbnl3YXksIGV2ZW4gaWYgdGhlIFNJWkUgY29tbWFuZCByZXR1cm5lZCAwLgoKRGFuaWVsICgyNiBGZWIpCi0gS3lsZSBTYWxsZWUgcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIGhlIHdvdWxkIGRvIGEgdHJhbnNmZXIgdGhhdCBkaWRuJ3QgdXBkYXRlCiAgdGhlIHByb2dyZXNzIG1ldGVyIHByb3Blcmx5LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgY2FzZSB3aGVyZSBsaWJjdXJsIHdvdWxkCiAgbG9vcCBhIGxpdHRsZSB0b28gZWFnZXJseSBpbiB0aGUgdHJhbnNmZXIgbG9vcCwgd2hpY2ggaXNuJ3QgcmVhbGx5IGdvb2QgZm9yCiAgdGhlIEFQSXMsIGVzcGVjaWFsbHkgbm90IHRoZSBtdWx0aSBBUEkuCgpWZXJzaW9uIDcuMTAuNC1wcmUyICgyNCBGZWIgMjAwMykKCkRhbmllbCAoMjQgRmViKQotIEtqZXRpbCBKYWNvYnNlbiBmb3VuZCBvdXQgdGhhdCBzZXR0aW5nIENVUkxPUFRfTUFYQ09OTkVDVFMgdG8gYSB2YWx1ZSBoaWdoZXIKICB0aGFuIDUgY291bGQgY2F1c2UgYSBzZWdmYXVsdC4KCi0gSSBiZWxpZXZlIEkgZml4ZWQgdGhlICdFeHBlY3Q6IDEwMC1jb250aW51ZScgYmVoYXZpb3IgdGhhdCBoYXMgYmVlbiBicm9rZW4KICBmb3IgYSB3aGlsZSAoSSB0aGluayBzaW5jZSBteSBjaGFuZ2UgZGF0ZWQgRGVjIDEwIDIwMDIpLiBXaGVuIHRoaXMgaGVhZGVyIGlzCiAgdXNlZCwgbGliY3VybCBzaG91bGQgd2FpdCBmb3IgYSBIVFRQIDEwMCAob3IgdGltZW91dCkgYmVmb3JlIHNlbmRpbmcgdGhlCiAgcG9zdC9wdXQgZGF0YS4KCkRhbmllbCAoMTQgRmViKQotIE1hdHRoZXcgQ2xhcmtlIHByb3ZpZGVkIHNvbWUgaW5mbyB3aGF0IHRvIG1vZGlmeSB0byBtYWtlIGN1cmwgYnVpbGQKICBmbGF3bGVzc2x5IG9uIEFJWCAzLjIuNS4KCi0gTWFydGluIEMuIE1hcnRpbiBmb3VuZCBhbmQgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbgogIHJ1bm5pbmcgb24gV2luZG93cyBhbmQgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gYSBwb3J0IHdpdGhvdXQgYSBsaXN0ZW5lci4KCkRhbmllbCAoMTMgRmViKQotIENocmlzdG9waGVyIFIuIFBhbG1lciBmaXhlZCBDdXJsX2Jhc2U2NF9lbmNvZGUoKSB0byBkZWFsIHdpdGggemVyb2VzIGluIHRoZQogIGRhdGEgdG8gZW5jb2RlLgoKRGFuaWVsICg0IEZlYikKLSBKZWFuLVBoaWxpcHBlIGFkZGVkIHRoZSBmaXJzdCBjb2RlIHRoYXQgZW5hYmxlcyB0aGUgJ3NoYXJlJyBzeXN0ZW0uIFRoaXMKICBzaG91bGQgbm93IGVuYWJsZSBzaGFyaW5nIG9mIEROUyBkYXRhIGJldHdlZW4gdHdvIGN1cmwgZWFzeSBoYW5kbGVzLgoKLSBJbmNvcnBvcmF0ZWQgTmljbyBCYWdndXMnIGZpeGVzIHRvIGFnYWluIGNvbXBpbGUgZmxhd2xlc3NseSBvbiBWTVMuCgotIEphbWVzIEJ1cnNhIGNvcnJlY3RlZCBhIGJhZCBjb21tZW50IGluIHRoZSBwdWJsaWMgaW5jbHVkZSBmaWxlIGN1cmwvbXVsdGkuaAoKLSBQZXRlciBGb3JyZXQgcmVwb3J0ZWQgb25lIG9mIHRob3NlIGVycm9yOjAwMDAwMDAwIGNhc2VzIGluIGxpYmN1cmwgYWdhaW4KICB3aGVuIGNvbm5lY3RpbmcgdG8gYSBIVFRQUyBzaXRlLCBhbmQgdGhpcyB0aW1lIEkgZGlkIGRpc2NvdmVyIHNvbWUgb2RkaXRpZXMKICBpbiBob3cgY3VybCByZXBvcnRzIFNTTCBlcnJvcnMgYmFjay4gSXQgY291bGQgbWlzcyBzaG93aW5nIHRoZSBhY3R1YWwgZXJyb3IuCgpWZXJzaW9uIDcuMTAuNC1wcmUxICgzIEZlYiAyMDAzKQoKRGFuaWVsICgzIEZlYikKLSBSZW1vdmVkIHRoaW5ncyBpbiB0aGUgZG9jcyBzYXlpbmcgY2FwYXRoIGRvZXNuJ3Qgd29yayBvbiBXaW5kb3dzLCBhcyBKdWxpYW4KICBOb2JsZSB0b2xkIHVzIGl0IHdvcmtzIGZpbmUuCgpEYW5pZWwgKDMxIEphbikKLSBLZXZpbiBSb3RoIGZpeGVkIHRoZSB6bGliIGJ1aWxkIHN0dWZmIGluIHRoZSBNaW5ndzMyIG1ha2VmaWxlLgoKRGFuaWVsICgzMCBKYW4pCi0gS2V2aW4gUm90aCBmb3VuZCBvdXQgdGhhdCBjdXJsIG9uIFdpbmRvd3MgYWx3YXlzIGNoZWNrZWQgZm9yIHRoZSBDQSBjZXJ0CiAgYnVuZGxlIHVzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdGhlIHBhdGggc2NhbiwgZXZlbiB0aG91Z2gKICAtay8tLWluc2VjdXJlIHdhcyB1c2VkLgoKLSBIYW1pc2ggTWFja2VuemllIHBvaW50ZWQgb3V0IHRoYXQgY3VybCBvbmx5IGRpZCBzdHJpY3QgaG9zdCBuYW1lIHZlcmlmeWluZwogIGlmIGNhcGF0aCBvciBjYWluZm8gd2FzIHVzZWQuIE5vdyBpdCdsbCBhbHdheXMgZG8gaXQgdW5sZXNzIC1rIC8gLS1pbnNlY3VyZQogIGlzIHVzZWQhCgotIFBhdmVsIENlbmVrIHBvaW50ZWQgb3V0IHRoYXQgdGhlIENvbnRlbnQtVHlwZSBleHRyYWN0aW9uIHdhcyBkb25lIHdyb25nbHkKICBhcyB0aGUgZnVsbCBzdHJpbmcgd2FzIG5vdCBmZXRjaGVkLiBBZGRlZCB0ZXN0IGNhc2UgNTcgdG8gdmVyaWZ5IHRoYXQgY3VybAogIGRvZXMgaXQgcmlnaHQgbm93LgoKRGFuaWVsICgyOSBKYW4pCi0gSmFtaWUgV2lsa2luc29uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgY3VybCBhdHRlbXB0IHRvIGNsZWFyIG91dAogICJzZW5zaXRpdmUiIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgc28gdGhhdCB0aGV5IGRvbid0IGFwcGVhciBpbiBwcyBvdXRwdXRzCiAgKG9ubHkgb24gcGxhdGZvcm1zIHRoYXQgYWxsb3cgd3JpdGluZyB0byBhcmd2W10pLgoKLSBKb2huIE1jR293YW4gZm91bmQgb3V0IHRoYXQgdGhlIERFQlVHRlVOQ1RJT04gY291bGQgYmUgY2FsbGVkIHdpdGggYmFkCiAgYXJndW1lbnRzIGFuZCB0aHVzIGNhdXNlIHRoZSAtLXRyYWNlIG91dHB1dHMgdG8gZ28gd3JvbmcuCgotIFJlbW92ZWQgYWxsIHRoZSBlbWFjcyBsb2NhbCB2YXJpYWJsZXMgZnJvbSBhbGwgZmlsZXMuIE1hdHMgTGlkZWxsIHByb3ZpZGVkCiAgdGhlIG5ldyBzYW1wbGUuZW1hY3MgZmlsZSAoZm9yIGEgc2FtcGxlIG9mIHdoYXQgdG8gaW5jbHVkZSBpbiB5b3VyIC5lbWFjcykKICBhbmQgdGhlIGN1cmwtc3R5bGUuZWwgdGhhdCBzZXRzIGEgYmV0dGVyIGMtc3R5bGUgZm9yIGVkaXRpbmcgY3VybCBzb3VyY2VzLgoKLSBEYXZlIEhhbGJha2tlbiBmb3VuZCBhIHByb2JsZW0gd2l0aCBGVFAgZG93bmxvYWRzIHRoYXQgY291bGQgYWNjaWRlbnRseQogIHJldHVybiBDVVJMRV9QQVJUSUFMX0ZJTEUgd2hlbiBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdhcyBjYWxsZWQgd2l0aCBOT0JPRFkKICBzZXQgVFJVRS4KCkRhbmllbCAoMjcgSmFuKQotIFRoZSBmb3Blbi5jIGV4YW1wbGUgd2FzIGZsYXdlZCBhcyBOaWNrIEh1bWZyZXkgbm90aWNlZCwgYW5kIEkgZml4ZWQgaXQgdG8KICB3b3JrIGFnYWluLgoKRGFuaWVsICgyNCBKYW4pCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZm91bmQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgKHRoZSBjb250ZW50LXR5cGUgc3RyaW5nKQogIHdoZW4gZm9sbG93aW5nIGxvY2F0aW9ucy4KCkRhbmllbCAoMjIgSmFuIDIwMDMpCi0gSWFuIFdpbGtlcyBhbmQgTGVnb2ZmIFZpbmNlbnQgYm90aCBpbmRlcGVuZGVudGx5IHByb3ZpZGVkIGZpeGVzIGZvciBtYWtpbmcKICBjdXJsL211bHRpLmggd29yayBwcm9wZXJseSB3aGVuIGNvbXBpbGVkIHdpdGggYSBDKysgY29tcGlsZXIuCgpEYW5pZWwgKDIwIEphbiAyMDAzKQotIEZpeGVkICdidWlsZGNvbmYnIHRvIGNoZWNrIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZXF1aXJlZCB0b29scyBiZWZvcmUKICB0aGV5J3JlIGFjdHVhbGx5IHVzZWQuCgotIFdyb3RlICd0ZXN0Y3VybC5zaCcsIGEgc2NyaXB0IHRhcmdldGVkIGZvciBhdXRvbWF0aWMgYW5kIGRpc3RyaWJ1dGVkIGN1cmwKICB0ZXN0cyBvbiB2YXJpb3VzIHBsYXRmb3Jtcy4KCi0gRGF2aWQgVGhpZWwgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLm5ldHJjIGZpbGUgd2FzIG5vdCBiZWluZyBkZWFsdCB3aXRoCiAgcHJvcGVybHkgYW55bW9yZS4gSSBicm9rZSB0aGlzIGluIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcgImZpeCIuCgotIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIHBhdGNoZWQgbGliY3VybCB0byBhbGxvY2F0ZSB0aGUgc2NyYXRjaCBidWZmZXIgb25seQogIG9uIGRlbWFuZCBhbmQgdGh1cyB3ZSBzYXZlIDMyS0IgaW4gZWFjaCBjdXJsIGhhbmRsZSB0aGF0IGRvbid0IHVzZSB0aGF0CiAgYnVmZmVyLiBUaGlzIG5lZWQgYXBwZWFyZWQgd2hlbiBzb21lIHBlb3BsZSBzdGFydGVkIHVzaW5nIHRob3VzYW5kcyBvZgogIHNpbXVsdGFuZW91cyBjdXJsIGhhbmRsZXMuLi4gOi0pCgpEYW5pZWwgKDE2IEphbiAyMDAzKQotIE1hcmt1cyBPYmVyaHVtZXIgZml4ZWQgY3VybC1jb25maWcgLS1jZmxhZ3Mgd2hlbiB0aGUgaW5jbHVkZWRpciB3YXMgbm90CiAgL3Vzci9pbmNsdWRlLgoKLSBNYXJrdXMgT2Jlcmh1bWVyIGZpeGVkIENVUkxJTkZPX1BSSVZBVEUgdG8gcHJvcGVybHkgcmV0dXJuIE5VTEwgaWYgaXQgd2FzCiAgc2V0IHRvIE5VTEwhCgpWZXJzaW9uIDcuMTAuMyAoMTQgSmFuIDIwMDMpCgpEYW5pZWwgKDEwIEphbiAyMDAzKQotIFN0ZXZlIE9saXBoYW50IHBvaW50ZWQgb3V0IHRoYXQgdGVzdCBjYXNlIDEwNSBkaWQgbm90IHdvcmsgYW55bW9yZSBhbmQgdGhpcwogIHdhcyBkdWUgdG8gYSBtaXNzaW5nIGZpeCBmb3IgdGhlIHBhc3N3b3JkIHByb21wdGluZy4KClZlcnNpb24gNy4xMC4zLXByZTYgKDEwIEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIEJyeWFuIEtlbXAgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIC11IGNvdWxkIG5vdCBwcm92aWRlIGEgYmxhbmsgcGFzc3dvcmQKICB3aXRob3V0IHByb21wdGluZyB0aGUgdXNlci4gSXQgY2FuIG5vdy4gLXUgdXNlcm5hbWU6IG1ha2VzIHRoZSBwYXNzd29yZAogIGVtcHR5LCB3aGlsZSAtdSB1c2VybmFtZSBtYWtlcyBjdXJsIHByb21wdCB0aGUgdXNlciBmb3IgYSBwYXNzd29yZC4KCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIGEgcmVtYWluaW5nIGNvbm5lY3QgcHJvYmxlbSBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIG9uCiAgaXB2NCBzeXN0ZW1zIChMaW51eCBvbmx5PyksIHRoYXQgSSBmaXhlZCBhbmQgS2pldGlsIHZlcmlmaWVkIHRoYXQgaXQgZml4ZWQKICBoaXMgcHJvYmxlbXMuCgotIG1lbWFuYWx5emUucGwgbm93IHJlYWRzIGEgZmlsZSBuYW1lIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgYW5kIG5vIGxvbmdlcgogIHRha2VzIHRoZSBkYXRhIG9uIHN0ZGluIGFzIGJlZm9yZS4KClZlcnNpb24gNy4xMC4zLXByZTUgKDkgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gRml4ZWQgdGVzdHMvbWVtYW5hbHl6ZS5wbCB0byB3b3JrIHdpdGggZmlsZSBuYW1lcyB0aGF0IGNvbnRhaW4gY29sb25zIChhcyBvbgogIFdpbmRvd3MpLgogIAotIEtqZXRpbCBKYWNvYnNlbiBxdWlja2x5IHBvaW50ZWQgb3V0IHRoYXQgbGliL3NoYXJlLmggd2FzIG1pc3NpbmcuLi4KClZlcnNpb24gNy4xMC4zLXByZTQgKDkgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gVXBkYXRlZCBsaWIvc2hhcmUuYyBxdWl0ZSBhIGJpdCB0byBtYXRjaCB0aGUgZGVzaWduIGRvY3VtZW50IGF0CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9kZXYvc2hhcmluZy50eHQgYSBsb3QgbW9yZS4KCiAgSSdsbCB0cnkgdG8gdXBkYXRlIHRoZSBkb2N1bWVudCBzb29uaXNoLiBzaGFyZS5jIGlzIHN0aWxsIG5vdCBhY3R1YWxseSB1c2VkCiAgYnkgbGliY3VybCwgYnV0IHRoZSBBUEkgaXMgc2xvd2x5IGdldHRpbmcgdGhlcmUgYW5kIHdlIGNhbiBzdGFydAogIGltcGxlbWVudGluZyBjb2RlIHRoYXQgdGFrZXMgYWR2YW50YWdlIG9mIHRoaXMgc3lzdGVtLgoKRGFuaWVsICg4IEphbiAyMDAzKQotIFVwZGF0ZWQgc2hhcmUgc3R1ZmYgaW4gY3VybC9jdXJsLmgsIGluY2x1ZGluZyBkYXRhIHR5cGVzLCBzdHJ1Y3RzIGFuZAogIGZ1bmN0aW9uIHByb3RvdHlwZXMuIFRoZSBjb3JyZXNwb25kaW5nIGZpbGVzIGluIGxpYi8gd2VyZSBhbHNvIG1vZGlmaWVkCiAgb2YgY291cnNlIHRvIHJlbWFpbiBjb21waWxhYmxlLiBCYXNlZCBvbiBpbnB1dCBmcm9tIEplYW4tUGhpbGlwcGUgYW5kIGFsc28KICB0byBtYWtlIGl0IG1vcmUgaW4gbGluZSB3aXRoIHRoZSBkZXNpZ24gZG9jdW1lbnQuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgcGF0Y2hlZCBhIHZlcnkgdHJpdmlhbCBtZW1vcnkgbGVhayBpbgogIGN1cmxfZXNjYXBlKCkgdGhhdCB3b3VsZCBoYXBwZW4gd2hlbiByZWFsbG9jKCkgcmV0dXJucyBOVUxMLi4uCgotIE1hdHRoZXcgQmxhaW4gcHJvdmlkZWQgZmVlZGJhY2sgdG8gbWFrZSB0aGUgLS1jcmVhdGUtZGlycyBzdHVmZiBidWlsZAogIHByb3Blcmx5IG9uIFdpbmRvd3MuCgotIEZpeGVkIHRoZSAjaW5jbHVkZSBpbiB0ZXN0cy9saWJ0ZXN0L2ZpcnN0LmMgYXMgTGVnb2ZmIFZpbmNlbnQgcG9pbnRlZCBvdXQuCgpEYW5pZWwgKDcgSmFuIDIwMDMpCi0gUGhpbGlwcGUgUmFvdWx0IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgbGliY3VybCBwcm9wZXJseSBzdXBwb3J0CiAgd2lsZGNhcmQgY2hlY2tzIGZvciBjZXJ0aWZpY2F0ZSBuYW1lcy4KCi0gU2ltb24gTGl1IGFkZGVkIENVUkxPUFRfSFRUUDIwMEFMSUFTRVMsIHRvIGxldCBhbiBhcHBsaWNhdGlvbiBzZXQgb3RoZXIKICBzdHJpbmdzIHJlY29nbml6ZWQgYXMgIkhUVFAgMjAwIiB0byBhbGxvdyBodHRwLWxpa2UgcHJvdG9jb2xzIHRvIGdldAogIGRvd25sb2FkZWQgZmluZSBieSBjdXJsLgoKLSBOb3cgdXNpbmcgYXV0b2NvbmYgMi41NyBhbmQgYXV0b21ha2UgMS43LjIKCi0gRG9pbmcgImN1cmwgLUkgZnRwOi8vZG9tYWluL25vbi1leGlzdGluZy1maWxlIiBzdGlsbCBvdXRwdXRlZCBhIGRhdGUhCiAgV2F5bmUgSGFpZ2ggcmVwb3J0ZWQuCgotIFRoZSBlcnJvciBtZXNzYWdlIGlzIG5vdyB3cml0dGVuIHByb3Blcmx5IHdpdGggYSBuZXdsaW5lIGluIHRoZSAtLXRyYWNlCiAgZmlsZS4KCkRhbmllbCAoNiBKYW4gMjAwMykKLSBTdGVybGluZyBIdWdoZXMgZml4ZWQgYSBwb3NzaWJsZSBidWc6IHByZXZpb3VzbHksIGlmIHlvdSBjYWxsZWQKICBjdXJsX2Vhc3lfcGVyZm9ybSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBkbnMgY2FjaGUsIHRoZSBnbG9iYWwgY2FjaGUKICB3b3VsZG4ndCBiZSB1c2VkLiBQb2ludGVkIG91dCBieSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlLgoKLSBNYXR0aGV3IEJsYWluJ3MgZml4ZWQgdGhlIFZDNiBsaWJjdXJsIG1ha2VmaWxlIHRvIGluY2x1ZGUgYmV0dGVyIGRlYnVnIGRhdGEKICBvbiBkZWJ1ZyBidWlsZHMuCg==