MjAwOC0wNi0wNiAgUmVsZWFzZSBNYW5hZ2VyCgoJKiBHQ0MgNC4zLjEgcmVsZWFzZWQuCgoyMDA4LTAzLTA1ICBSZWxlYXNlIE1hbmFnZXIKCgkqIEdDQyA0LjMuMCByZWxlYXNlZC4KCgogICAgICAgICAgICAgICAgQ2hhbmdlTG9nIGZpbGUgZm9yIHpsaWIKCkNoYW5nZXMgaW4gMS4yLjMgKDE4IEp1bHkgMjAwNSkKLSBBcHBseSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGZpeGVzIHRvIGNvbnRyaWIvaW5mYmFjazkgYXMgd2VsbAotIENsZWFuIHVwIHNvbWUgdGV4dCBmaWxlcyAoY2FycmlhZ2UgcmV0dXJucywgdHJhaWxpbmcgc3BhY2UpCi0gVXBkYXRlIHRlc3R6bGliLCB2c3R1ZGlvLCBtYXNteDY0LCBhbmQgbWFzbXg4NiBpbiBjb250cmliIFtWb2xsYW50XQoKQ2hhbmdlcyBpbiAxLjIuMi40ICgxMSBKdWx5IDIwMDUpCi0gQWRkIGluZmxhdGVQcmltZSgpIGZ1bmN0aW9uIGZvciBzdGFydGluZyBpbmZsYXRpb24gYXQgYml0IGJvdW5kYXJ5Ci0gQXZvaWQgc29tZSBWaXN1YWwgQyB3YXJuaW5ncyBpbiBkZWZsYXRlLmMKLSBBdm9pZCBtb3JlIHNpbGx5IFZpc3VhbCBDIHdhcm5pbmdzIGluIGluZmxhdGUuYyBhbmQgaW5mdHJlZXMuYyBmb3IgNjQtYml0CiAgY29tcGlsZQotIEZpeCBzb21lIHNwZWxsaW5nIGVycm9ycyBpbiBjb21tZW50cyBbQmV0dHNdCi0gQ29ycmVjdCBpbmZsYXRlSW5pdDIoKSBlcnJvciByZXR1cm4gZG9jdW1lbnRhdGlvbiBpbiB6bGliLmgKLSBBZGRlZCB6cmFuLmMgZXhhbXBsZSBvZiBjb21wcmVzc2VkIGRhdGEgcmFuZG9tIGFjY2VzcyB0byBleGFtcGxlcwogIGRpcmVjdG9yeSwgc2hvd3MgdXNlIG9mIGluZmxhdGVQcmltZSgpCi0gRml4IGNhc3QgZm9yIGFzc2lnbm1lbnRzIHRvIHN0cm0tPnN0YXRlIGluIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jCi0gRml4IHpsaWJDb21waWxlRmxhZ3MoKSBpbiB6dXRpbC5jIHRvIHVzZSAxTCBmb3IgbG9uZyBzaGlmdHMgW09iZXJodW1lcl0KLSBNb3ZlIGRlY2xhcmF0aW9ucyBvZiBnZjIgZnVuY3Rpb25zIHRvIHJpZ2h0IHBsYWNlIGluIGNyYzMyLmMgW09iZXJodW1lcl0KLSBBZGQgY2FzdCBpbiB0cmVlcy5jIHQgYXZvaWQgYSB3YXJuaW5nIFtPYmVyaHVtZXJdCi0gQXZvaWQgc29tZSB3YXJuaW5ncyBpbiBmaXRibGsuYywgZ3VuLmMsIGd6am9pbi5jIGluIGV4YW1wbGVzIFtPYmVyaHVtZXJdCi0gVXBkYXRlIG1ha2Vfdm1zLmNvbSBbWmluc2VyXQotIEluaXRpYWxpemUgc3RhdGUtPndyaXRlIGluIGluZmxhdGVSZXNldCgpIHNpbmNlIGNvcGllZCBpbiBpbmZsYXRlX2Zhc3QoKQotIEJlIG1vcmUgc3RyaWN0IG9uIGluY29tcGxldGUgY29kZSBzZXRzIGluIGluZmxhdGVfdGFibGUoKSBhbmQgaW5jcmVhc2UKICBFTk9VR0ggYW5kIE1BWEQgLS0gdGhpcyByZXBhaXJzIGEgcG9zc2libGUgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBmb3IKICBpbnZhbGlkIGluZmxhdGUgaW5wdXQuICBUaGFua3MgdG8gVGF2aXMgT3JtYW5keSBhbmQgTWFya3VzIE9iZXJodW1lciBmb3IKICBkaXNjb3ZlcmluZyB0aGUgdnVsbmVyYWJpbGl0eSBhbmQgcHJvdmlkaW5nIHRlc3QgY2FzZXMuCi0gQWRkIGlhNjQgc3VwcG9ydCB0byBjb25maWd1cmUgZm9yIEhQLVVYIFtTbWl0aF0KLSBBZGQgZXJyb3IgcmV0dXJuIHRvIGd6cmVhZCgpIGZvciBmb3JtYXQgb3IgaS9vIGVycm9yIFtMZXZpbl0KLSBVc2UgbWFsbG9jLmggZm9yIE9TLzIgW05lY2FzZWtdCgpDaGFuZ2VzIGluIDEuMi4yLjMgKDI3IE1heSAyMDA1KQotIFJlcGxhY2UgMVUgY29uc3RhbnRzIGluIGluZmxhdGUuYyBhbmQgaW5mdHJlZXMuYyBmb3IgNjQtYml0IGNvbXBpbGUKLSBUeXBlY2FzdCBmcmVhZCgpIHJldHVybiB2YWx1ZXMgaW4gZ3ppby5jIFtWb2xsYW50XQotIFJlbW92ZSB0cmFpbGluZyBzcGFjZSBpbiBtaW5pZ3ppcC5jIG91dG1vZGUgKFZDKysgY2FuJ3QgZGVhbCB3aXRoIGl0KQotIEZpeCBjcmMgY2hlY2sgYnVnIGluIGd6cmVhZCgpIGFmdGVyIGd6dW5nZXRjKCkgW0hlaW5lcl0KLSBBZGQgdGhlIGRlZmxhdGVUdW5lKCkgZnVuY3Rpb24gdG8gYWRqdXN0IGludGVybmFsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMKLSBBZGQgYSBmYXN0IGd6aXAgZGVjb21wcmVzc29yLCBndW4uYywgdG8gZXhhbXBsZXMgKHVzZSBvZiBpbmZsYXRlQmFjaykKLSBSZW1vdmUgYW4gaW5jb3JyZWN0IGFzc2VydGlvbiBpbiBleGFtcGxlcy96cGlwZS5jCi0gQWRkIEMrKyB3cmFwcGVyIGluIGluZmJhY2s5LmggW0RvbmFpc10KLSBGaXggYnVnIGluIGluZmxhdGVDb3B5KCkgd2hlbiBkZWNvZGluZyBmaXhlZCBjb2RlcwotIE5vdGUgaW4gemxpYi5oIGhvdyBtdWNoIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkgYWN0dWFsbHkgdXNlcwotIFJlbW92ZSBVU0VfRElDVF9IRUFEIGluIGRlZmxhdGUuYyAod291bGQgbWVzcyB1cCBpbmZsYXRlIGlmIHVzZWQpCi0gQWRkIF9XSU4zMl9XQ0UgdG8gZGVmaW5lIFdJTjMyIGluIHpjb25mLmluLmggW1NwZW5jZXJdCi0gRG9uJ3QgaW5jbHVkZSBzdGRlcnIuaCBvciBlcnJuby5oIGZvciBfV0lOMzJfV0NFIGluIHp1dGlsLmggW1NwZW5jZXJdCi0gQWRkIGd6ZGlyZWN0KCkgZnVuY3Rpb24gdG8gaW5kaWNhdGUgdHJhbnNwYXJlbnQgcmVhZHMKLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIEZpeCBjb21waWxhdGlvbiBvZiBkZWZsYXRlLmMgd2hlbiBib3RoIEFTTVYgYW5kIEZBU1RFU1QgW09iZXJodW1lcl0KLSBBZGQgY2FzdHMgaW4gY3JjMzIuYyB0byBhdm9pZCB3YXJuaW5ncyBbT2Jlcmh1bWVyXQotIEFkZCBjb250cmliL21hc214NjQgW1ZvbGxhbnRdCi0gVXBkYXRlIGNvbnRyaWIvYXNtNTg2LCBhc202ODYsIG1hc214ODYsIHRlc3R6bGliLCB2c3R1ZGlvIFtWb2xsYW50XQoKQ2hhbmdlcyBpbiAxLjIuMi4yICgzMCBEZWNlbWJlciAyMDA0KQotIFJlcGxhY2Ugc3RydWN0dXJlIGFzc2lnbm1lbnRzIGluIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jIHdpdGggem1lbWNweSB0bwogIGF2b2lkIGltcGxpY2l0IG1lbWNweSBjYWxscyAocG9ydGFiaWxpdHkgZm9yIG5vLWxpYnJhcnkgY29tcGlsYXRpb24pCi0gSW5jcmVhc2Ugc3ByaW50ZigpIGJ1ZmZlciBzaXplIGluIGd6ZG9wZW4oKSB0byBhbGxvdyBmb3IgbGFyZ2UgbnVtYmVycwotIEFkZCBJTkZMQVRFX1NUUklDVCB0byBjaGVjayBkaXN0YW5jZXMgYWdhaW5zdCB6bGliIGhlYWRlcgotIEltcHJvdmUgV2luQ0UgZXJybm8gaGFuZGxpbmcgYW5kIGNvbW1lbnRzIFtDaGFuZ10KLSBSZW1vdmUgY29tbWVudCBhYm91dCBubyBnemlwIGhlYWRlciBwcm9jZXNzaW5nIGluIEZBUQotIEFkZCBaX0ZJWEVEIHN0cmF0ZWd5IG9wdGlvbiB0byBkZWZsYXRlSW5pdDIoKSB0byBmb3JjZSBmaXhlZCB0cmVlcwotIEFkZCB1cGRhdGVkIG1ha2Vfdm1zLmNvbSBbQ29naGxhbl0sIHVwZGF0ZSBSRUFETUUKLSBDcmVhdGUgYSBuZXcgImV4YW1wbGVzIiBkaXJlY3RvcnksIG1vdmUgZ3phcHBlbmQuYyB0aGVyZSwgYWRkIHpwaXBlLmMsCiAgZml0YmxrLmMsIGd6bG9nLltjaF0sIGd6am9pbi5jLCBhbmQgemxpYl9ob3cuaHRtbC4KLSBBZGQgRkFRIGVudHJ5IGFuZCBjb21tZW50cyBpbiBkZWZsYXRlLmMgb24gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzCi0gQWRkIFNvbGFyaXMgOSBtYWtlIG9wdGlvbnMgaW4gY29uZmlndXJlIFtHaWxiZXJ0XQotIEFsbG93IHN0cmVycm9yKCkgdXNhZ2UgaW4gZ3ppby5jIGZvciBTVERDCi0gRml4IERlY29tcHJlc3NCdWYgaW4gY29udHJpYi9kZWxwaGkvWkxpYi5wYXMgW01hbkNoZXNUZXJdCi0gVXBkYXRlIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gYW5kIGd2bWF0MzIuYXNtIFtWb2xsYW50XQotIFVzZSB6X29mZl90IGZvciBhZGxlcjMyX2NvbWJpbmUoKSBhbmQgY3JjMzJfY29tYmluZSgpIGxlbmd0aHMKLSBNYWtlIGFkbGVyMzIoKSBtdWNoIGZhc3RlciBmb3Igc21hbGwgbGVuCi0gVXNlIE9TX0NPREUgaW4gZGVmbGF0ZSgpIGRlZmF1bHQgZ3ppcCBoZWFkZXIKCkNoYW5nZXMgaW4gMS4yLjIuMSAoMzEgT2N0b2JlciAyMDA0KQotIEFsbG93IGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCBmb3IgcmF3IGluZmxhdGUKLSBGaXggaW5mbGF0ZSBoZWFkZXIgY3JjIGNoZWNrIGJ1ZyBmb3IgZmlsZSBuYW1lcyBhbmQgY29tbWVudHMKLSBBZGQgZGVmbGF0ZVNldEhlYWRlcigpIGFuZCBnel9oZWFkZXIgc3RydWN0dXJlIGZvciBjdXN0b20gZ3ppcCBoZWFkZXJzCi0gQWRkIGluZmxhdGVHZXRoZWFkZXIoKSB0byByZXRyaWV2ZSBnemlwIGhlYWRlcnMKLSBBZGQgY3JjMzJfY29tYmluZSgpIGFuZCBhZGxlcjMyX2NvbWJpbmUoKSBmdW5jdGlvbnMKLSBBZGQgYWxsb2NfZnVuYywgZnJlZV9mdW5jLCBpbl9mdW5jLCBvdXRfZnVuYyB0byBaX1BSRUZJWCBsaXN0Ci0gVXNlIHpzdHJlYW1wIGNvbnNpc3RlbnRseSBpbiB6bGliLmggKGluZmxhdGVfYmFjayBmdW5jdGlvbnMpCi0gUmVtb3ZlIEdVTlpJUCBjb25kaXRpb24gZnJvbSBkZWZpbml0aW9uIG9mIGluZmxhdGVfbW9kZSBpbiBpbmZsYXRlLmgKICBhbmQgaW4gY29udHJpYi9pbmZsYXRlODYvaW5mZmFzdC5TIFtUcnV0YSwgQW5kZXJzb25dCi0gQWRkIHN1cHBvcnQgZm9yIEFNRDY0IGluIGNvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMgW0FuZGVyc29uXQotIFVwZGF0ZSBwcm9qZWN0cy9SRUFETUUucHJvamVjdHMgYW5kIHByb2plY3RzL3Zpc3VhbGM2IFtUcnV0YV0KLSBVcGRhdGUgd2luMzIvRExMX0ZBUS50eHQgW1RydXRhXQotIEF2b2lkIHdhcm5pbmcgdW5kZXIgTk9fR1pDT01QUkVTUyBpbiBnemlvLmM7IGZpeCB0eXBvIFtUcnV0YV0KLSBEZXByZWNhdGUgWl9BU0NJSTsgdXNlIFpfVEVYVCBpbnN0ZWFkIFtUcnV0YV0KLSBVc2UgYSBuZXcgYWxnb3JpdGhtIGZvciBzZXR0aW5nIHN0cm0tPmRhdGFfdHlwZSBpbiB0cmVlcy5jIFtUcnV0YV0KLSBEbyBub3QgZGVmaW5lIGFuIGV4aXQoKSBwcm90b3R5cGUgaW4genV0aWwuYyB1bmxlc3MgREVCVUcgZGVmaW5lZAotIFJlbW92ZSBwcm90b3R5cGUgb2YgZXhpdCgpIGZyb20genV0aWwuYywgZXhhbXBsZS5jLCBtaW5pZ3ppcC5jIFtUcnV0YV0KLSBBZGQgY29tbWVudCBpbiB6bGliLmggZm9yIFpfTk9fRkxVU0ggcGFyYW1ldGVyIHRvIGRlZmxhdGUoKQotIEZpeCBEYXJ3aW4gYnVpbGQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiBbUGV0ZXJzb25dCgpDaGFuZ2VzIGluIDEuMi4yICgzIE9jdG9iZXIgMjAwNCkKLSBVcGRhdGUgemxpYi5oIGNvbW1lbnRzIG9uIGd6aXAgaW4tbWVtb3J5IHByb2Nlc3NpbmcKLSBTZXQgYWRsZXIgdG8gMSBpbiBpbmZsYXRlUmVzZXQoKSB0byBzdXBwb3J0IEphdmEgdGVzdCBzdWl0ZSBbV2FsbGVzXQotIEFkZCBjb250cmliL2RvdHpsaWIgW1Jhdm5dCi0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIE1vdmUgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IHRvIG9sZC8gW1RydXRhXQotIEZpeCBhc3NlbWJsZXIgYnVpbGRzIGluIHByb2plY3RzL3Zpc3VhbGM2LyBbVHJ1dGFdCgpDaGFuZ2VzIGluIDEuMi4xLjIgKDkgU2VwdGVtYmVyIDIwMDQpCi0gVXBkYXRlIElOREVYIGZpbGUKLSBGaXggdHJlZXMuYyB0byB1cGRhdGUgc3RybS0+ZGF0YV90eXBlIChubyBvbmUgZXZlciBub3RpY2VkISkKLSBGaXggYnVnIGluIGVycm9yIGNhc2UgaW4gaW5mbGF0ZS5jLCBpbmZiYWNrLmMsIGFuZCBpbmZiYWNrOS5jIFtCcm93bl0KLSBBZGQgInZvbGF0aWxlIiB0byBjcmMgdGFibGUgZmxhZyBkZWNsYXJhdGlvbiAoZm9yIERZTkFNSUNfQ1JDX1RBQkxFKQotIEFkZCBsaW1pdGVkIG11bHRpdGFza2luZyBwcm90ZWN0aW9uIHRvIERZTkFNSUNfQ1JDX1RBQkxFCi0gQWRkIE5PX3ZzbnByaW50ZiBmb3IgVk1TIGluIHp1dGlsLmggW01vemlsbGFdCi0gRG9uJ3QgZGVjbGFyZSBzdHJlcnJvcigpIHVuZGVyIFZNUyBbTW96aWxsYV0KLSBBZGQgY29tbWVudCB0byBEWU5BTUlDX0NSQ19UQUJMRSB0byB1c2UgZ2V0X2NyY190YWJsZSgpIHRvIGluaXRpYWxpemUKLSBVcGRhdGUgY29udHJpYi9hZGEgW0FuaXNpbWtvdl0KLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIEZpeCBjb25maWd1cmUgdG8gbm90IGhhcmRjb2RlIGRpcmVjdG9yaWVzIGZvciBEYXJ3aW4gW1BldGVyc29uXQotIEZpeCBnemlvLmMgdG8gbm90IHJldHVybiBlcnJvciBvbiBlbXB0eSBmaWxlcyBbQnJvd25dCi0gRml4IGluZGVudGF0aW9uOyB1cGRhdGUgdmVyc2lvbiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBhbmQKICBjb250cmliL3Bhc2NhbC96bGlicGFzLnBhcyBbVHJ1dGFdCi0gVXBkYXRlIG1rYXNtLmJhdCBpbiBjb250cmliL21hc214ODYgW1RydXRhXQotIFVwZGF0ZSBjb250cmliL3VudGd6IFtUcnV0YV0KLSBBZGQgcHJvamVjdHMvUkVBRE1FLnByb2plY3RzIFtUcnV0YV0KLSBBZGQgcHJvamVjdCBmb3IgTVMgVmlzdWFsIEMrKyA2LjAgaW4gcHJvamVjdHMvdmlzdWFsYzYgW0NhZGlldXgsIFRydXRhXQotIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCi0gVXBkYXRlIGxpc3Qgb2YgWl9QUkVGSVggc3ltYm9scyBpbiB6Y29uZi5oIFtSYW5kZXJzLVBlaHJzb24sIFRydXRhXQotIFJlbW92ZSBhbiB1bm5lY2Vzc2FyeSBhc3NpZ25tZW50IHRvIGN1cnIgaW4gaW5mdHJlZXMuYyBbVHJ1dGFdCi0gQWRkIE9TLzIgdG8gZXhlIGJ1aWxkcyBpbiBjb25maWd1cmUgW1BvbHRvcmFrXQotIFJlbW92ZSBlcnIgZHVtbXkgcGFyYW1ldGVyIGluIHpsaWIuaCBbS2llbnR6bGVdCgpDaGFuZ2VzIGluIDEuMi4xLjEgKDkgSmFudWFyeSAyMDA0KQotIFVwZGF0ZSBlbWFpbCBhZGRyZXNzIGluIFJFQURNRQotIFNldmVyYWwgRkFRIHVwZGF0ZXMKLSBGaXggYSBiaWcgZmF0IGJ1ZyBpbiBpbmZ0cmVlcy5jIHRoYXQgcHJldmVudGVkIGRlY29kaW5nIHZhbGlkCiAgZHluYW1pYyBibG9ja3Mgd2l0aCBvbmx5IGxpdGVyYWxzIGFuZCBubyBkaXN0YW5jZSBjb2RlcyAtLQogIFRoYW5rcyB0byAiSG90IEVtdSIgZm9yIHRoZSBidWcgcmVwb3J0IGFuZCBzYW1wbGUgZmlsZQotIEFkZCBhIG5vdGUgdG8gcHVmZi5jIG9uIG5vIGRpc3RhbmNlIGNvZGVzIGNhc2UuCgpDaGFuZ2VzIGluIDEuMi4xICgxNyBOb3ZlbWJlciAyMDAzKQotIFJlbW92ZSBhIHRhYiBpbiBjb250cmliL2d6YXBwZW5kL2d6YXBwZW5kLmMKLSBVcGRhdGUgc29tZSBpbnRlcmZhY2VzIGluIGNvbnRyaWIgZm9yIG5ldyB6bGliIGZ1bmN0aW9ucwotIFVwZGF0ZSB6bGliIHZlcnNpb24gbnVtYmVyIGluIHNvbWUgY29udHJpYiBlbnRyaWVzCi0gQWRkIFdpbmRvd3MgQ0UgZGVmaW5pdGlvbiBmb3IgcHRyZGlmZl90IGluIHp1dGlsLmggW01haSwgVHJ1dGFdCi0gU3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIEh1cmQgYW5kIEtGcmVlQlNEIFtCcm93bl0KLSBGaXggZXJyb3IgaW4gTk9fRElWSURFIG9wdGlvbiBvZiBhZGxlcjMyLmMKCkNoYW5nZXMgaW4gMS4yLjAuOCAoNCBOb3ZlbWJlciAyMDAzKQotIFVwZGF0ZSB2ZXJzaW9uIGluIGNvbnRyaWIvZGVscGhpL1pMaWIucGFzIGFuZCBjb250cmliL3Bhc2NhbC96bGlicGFzLnBhcwotIEFkZCBleHBlcmltZW50YWwgTk9fRElWSURFICNkZWZpbmUgaW4gYWRsZXIzMi5jCiAgICAtIFBvc3NpYmx5IGZhc3RlciBvbiBzb21lIHByb2Nlc3NvcnMgKGxldCBtZSBrbm93IGlmIGl0IGlzKQotIENvcnJlY3QgWl9CTE9DSyB0byBub3QgcmV0dXJuIG9uIGZpcnN0IGluZmxhdGUgY2FsbCBpZiBubyB3cmFwCi0gRml4IHN0cm0tPmRhdGFfdHlwZSBvbiBpbmZsYXRlKCkgcmV0dXJuIHRvIGNvcnJlY3RseSBpbmRpY2F0ZSBFT0IKLSBBZGQgZGVmbGF0ZVByaW1lKCkgZnVuY3Rpb24gZm9yIGFwcGVuZGluZyBpbiB0aGUgbWlkZGxlIG9mIGEgYnl0ZQotIEFkZCBjb250cmliL2d6YXBwZW5kIGZvciBhbiBleGFtcGxlIG9mIGFwcGVuZGluZyB0byBhIHN0cmVhbQotIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdCi0gRGVsZXRlIFR1cmJvIEMgY29tbWVudCBpbiBSRUFETUUgW1RydXRhXQotIEltcHJvdmUgc29tZSBpbmRlbnRhdGlvbiBpbiB6Y29uZi5oIFtUcnV0YV0KLSBGaXggaW5maW5pdGUgbG9vcCBvbiBiYWQgaW5wdXQgaW4gY29uZmlndXJlIHNjcmlwdCBbQ2h1cmNoXQotIEZpeCBnemVvZigpIGZvciBjb25jYXRlbmF0ZWQgZ3ppcCBmaWxlcyBbSm9obnNvbl0KLSBBZGQgZXhhbXBsZSB0byBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgW01pY2hhZWwgQi5dCi0gQWRkIC1wIHRvIG1rZGlyJ3MgaW4gTWFrZWZpbGUuaW4gW3ZkYV0KLSBGaXggY29uZmlndXJlIHRvIHByb3Blcmx5IGRldGVjdCBwcmVzZW5jZSBvciBsYWNrIG9mIHByaW50ZiBmdW5jdGlvbnMKLSBBZGQgQVM0MDAgc3VwcG9ydCBbTW9ubmVyYXRdCi0gQWRkIGEgbGl0dGxlIEN5Z3dpbiBzdXBwb3J0IFtXaWxzb25dCgpDaGFuZ2VzIGluIDEuMi4wLjcgKDIxIFNlcHRlbWJlciAyMDAzKQotIENvcnJlY3Qgc29tZSBkZWJ1ZyBmb3JtYXRzIGluIGNvbnRyaWIvaW5mYmFjazkKLSBDYXN0IGEgdHlwZSBpbiBhIGRlYnVnIHN0YXRlbWVudCBpbiB0cmVlcy5jCi0gQ2hhbmdlIHNlYXJjaCBhbmQgcmVwbGFjZSBkZWxpbWl0ZXIgaW4gY29uZmlndXJlIGZyb20gJSB0byAjIFtCZWViZV0KLSBVcGRhdGUgY29udHJpYi91bnRneiB0byAwLjIgd2l0aCB2YXJpb3VzIGZpeGVzIFtUcnV0YV0KLSBBZGQgYnVpbGQgc3VwcG9ydCBmb3IgQW1pZ2EgW05pa2xdCi0gUmVtb3ZlIHNvbWUgZGlyZWN0b3JpZXMgaW4gb2xkIHRoYXQgaGF2ZSBiZWVuIHVwZGF0ZWQgdG8gMS4yCi0gQWRkIGR5bGliIGJ1aWxkaW5nIGZvciBNYWMgT1MgWCBpbiBjb25maWd1cmUgYW5kIE1ha2VmaWxlLmluCi0gUmVtb3ZlIG9sZCBkaXN0cmlidXRpb24gc3R1ZmYgZnJvbSBNYWtlZmlsZQotIFVwZGF0ZSBSRUFETUUgdG8gcG9pbnQgdG8gRExMX0ZBUS50eHQsIGFuZCBhZGQgY29tbWVudCBvbiBNYWMgT1MgWAotIFVwZGF0ZSBsaW5rcyBpbiBSRUFETUUKCkNoYW5nZXMgaW4gMS4yLjAuNiAoMTMgU2VwdGVtYmVyIDIwMDMpCi0gTWlub3IgRkFRIHVwZGF0ZXMKLSBVcGRhdGUgY29udHJpYi9taW5pemlwIHRvIDEuMDAgW1ZvbGxhbnRdCi0gUmVtb3ZlIHRlc3Qgb2YgZ3ogZnVuY3Rpb25zIGluIGV4YW1wbGUuYyB3aGVuIEdaX0NPTVBSRVNTIGRlZmluZWQgW1RydXRhXQotIFVwZGF0ZSBQT1NUSU5DIGNvbW1lbnQgZm9yIDY4MDYwIFtOaWtsXQotIEFkZCBjb250cmliL2luZmJhY2s5IHdpdGggZGVmbGF0ZTY0IGRlY29kaW5nICh1bnN1cHBvcnRlZCkKLSBGb3IgTVZTIGRlZmluZSBOT192c25wcmludGYgYW5kIHVuZGVmaW5lIEZBUiBbdmFuIEJ1cmlrXQotIEFkZCBwcmFnbWEgZm9yIGZkb3BlbiBvbiBNVlMgW3ZhbiBCdXJpa10KCkNoYW5nZXMgaW4gMS4yLjAuNSAoOCBTZXB0ZW1iZXIgMjAwMykKLSBBZGQgT0YgdG8gaW5mbGF0ZUJhY2tFbmQoKSBkZWNsYXJhdGlvbiBpbiB6bGliLmgKLSBSZW1lbWJlciBzdGFydCB3aGVuIHVzaW5nIGd6ZG9wZW4gaW4gdGhlIG1pZGRsZSBvZiBhIGZpbGUKLSBVc2UgaW50ZXJuYWwgb2ZmX3QgY291bnRlcnMgaW4gZ3oqIGZ1bmN0aW9ucyB0byBwcm9wZXJseSBoYW5kbGUgc2Vla3MKLSBQZXJmb3JtIG1vcmUgcmlnb3JvdXMgY2hlY2sgZm9yIGRpc3RhbmNlLXRvby1mYXIgaW4gaW5mZmFzdC5jCi0gQWRkIFpfQkxPQ0sgZmx1c2ggb3B0aW9uIHRvIHJldHVybiBmcm9tIGluZmxhdGUgYXQgYmxvY2sgYm91bmRhcnkKLSBTZXQgc3RybS0+ZGF0YV90eXBlIG9uIHJldHVybiBmcm9tIGluZmxhdGUKICAgIC0gSW5kaWNhdGUgYml0cyB1bnVzZWQsIGlmIGF0IGJsb2NrIGJvdW5kYXJ5LCBhbmQgaWYgaW4gbGFzdCBibG9jawotIFJlcGxhY2Ugc2l6ZV90IHdpdGggcHRyZGlmZl90IGluIGNyYzMyLmMsIGFuZCBjaGVjayBmb3IgY29ycmVjdCBzaXplCi0gQWRkIGNvbmRpdGlvbiBzbyBvbGQgTk9fREVGTEFURSBkZWZpbmUgc3RpbGwgd29ya3MgZm9yIGNvbXBhdGliaWxpdHkKLSBGQVEgdXBkYXRlIHJlZ2FyZGluZyB0aGUgV2luZG93cyBETEwgW1RydXRhXQotIElOREVYIHVwZGF0ZTogYWRkIHFueCBlbnRyeSwgcmVtb3ZlIGFpeCBlbnRyeSBbVHJ1dGFdCi0gSW5zdGFsbCB6bGliLjMgaW50byBtYW5kaXIgW1dpbHNvbl0KLSBNb3ZlIGNvbnRyaWIvemxpYl9kbGxfRkFRLnR4dCB0byB3aW4zMi9ETExfRkFRLnR4dDsgdXBkYXRlIFtUcnV0YV0KLSBBZGFwdCB0aGUgemxpYiBpbnRlcmZhY2UgdG8gdGhlIG5ldyBETEwgY29udmVudGlvbiBndWlkZWxpbmVzIFtUcnV0YV0KLSBJbnRyb2R1Y2UgWkxJQl9XSU5BUEkgbWFjcm8gdG8gYWxsb3cgdGhlIGV4cG9ydCBvZiBmdW5jdGlvbnMgdXNpbmcKICB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbiwgZm9yIFZpc3VhbCBCYXNpYyBbVm9sbGFudCwgVHJ1dGFdCi0gVXBkYXRlIG1zZG9zIGFuZCB3aW4zMiBzY3JpcHRzIGFuZCBtYWtlZmlsZXMgW1RydXRhXQotIEV4cG9ydCBzeW1ib2xzIGJ5IG5hbWUsIG5vdCBieSBvcmRpbmFsLCBpbiB3aW4zMi96bGliLmRlZiBbVHJ1dGFdCi0gQWRkIGNvbnRyaWIvYWRhIFtBbmlzaW1rb3ZdCi0gTW92ZSBhc20gZmlsZXMgZnJvbSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL2FzbTM4NiBbVHJ1dGFdCi0gUmVuYW1lIGNvbnRyaWIvYXNtMzg2IHRvIGNvbnRyaWIvbWFzbXg4NiBbVHJ1dGEsIFZvbGxhbnRdCi0gQWRkIGNvbnRyaWIvbWFzbTY4NiBbVHJ1dGFdCi0gRml4IG9mZnNldHMgaW4gY29udHJpYi9pbmZsYXRlODYgYW5kIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20KICBbVHJ1dGEsIFZvbGxhbnRdCi0gVXBkYXRlIGNvbnRyaWIvZGVscGhpOyByZW5hbWUgdG8gY29udHJpYi9wYXNjYWw7IGFkZCBleGFtcGxlIFtUcnV0YV0KLSBSZW1vdmUgY29udHJpYi9kZWxwaGkyOyBhZGQgYSBuZXcgY29udHJpYi9kZWxwaGkgW1RydXRhXQotIEF2b2lkIGluY2x1c2lvbiBvZiB0aGUgbm9uc3RhbmRhcmQgPG1lbW9yeS5oPiBpbiBjb250cmliL2lvc3RyZWFtLAogIGFuZCBmaXggc29tZSBtZXRob2QgcHJvdG90eXBlcyBbVHJ1dGFdCi0gRml4IHRoZSBaQ1JfU0VFRDIgY29uc3RhbnQgdG8gYXZvaWQgd2FybmluZ3MgaW4gY29udHJpYi9taW5pemlwCiAgW1RydXRhXQotIEF2b2lkIHRoZSB1c2Ugb2YgYmFja3NsYXNoIChcKSBpbiBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdCi0gRml4IGZpbGUgdGltZSBoYW5kbGluZyBpbiBjb250cmliL3VudGd6OyB1cGRhdGUgbWFrZWZpbGVzIFtUcnV0YV0KLSBVcGRhdGUgY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIgdG8gY29tcGx5IHdpdGggdGhlIG5ldyBETEwgZ3VpZGVsaW5lcwogIFtWb2xsYW50XQotIFJlbW92ZSBjb250cmliL3ZzdHVkaW8vdmMxNV8xNiBbVm9sbGFudF0KLSBSZW5hbWUgY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIgdG8gY29udHJpYi92c3R1ZGlvL3ZjNyBbVHJ1dGFdCi0gVXBkYXRlIFJFQURNRS5jb250cmliIFtUcnV0YV0KLSBJbnZlcnQgdGhlIGFzc2lnbm1lbnQgb3JkZXIgb2YgbWF0Y2hfaGVhZCBhbmQgcy0+cHJldlsuLi5dIGluCiAgSU5TRVJUX1NUUklORyBbVHJ1dGFdCi0gQ29tcGFyZSBUT09fRkFSIHdpdGggMzI3NjcgaW5zdGVhZCBvZiAzMjc2OCwgdG8gYXZvaWQgMTYtYml0IHdhcm5pbmdzCiAgW1RydXRhXQotIENvbXBhcmUgZnVuY3Rpb24gcG9pbnRlcnMgd2l0aCAwLCBub3Qgd2l0aCBOVUxMIG9yIFpfTlVMTCBbVHJ1dGFdCi0gRml4IHByb3RvdHlwZSBvZiBzeW5jc2VhcmNoIGluIGluZmxhdGUuYyBbVHJ1dGFdCi0gSW50cm9kdWNlIEFTTUlORiBtYWNybyB0byBiZSBlbmFibGVkIHdoZW4gdXNpbmcgYW4gQVNNIGltcGxlbWVudGF0aW9uCiAgb2YgaW5mbGF0ZV9mYXN0IFtUcnV0YV0KLSBDaGFuZ2UgTk9fREVGTEFURSB0byBOT19HWkNPTVBSRVNTIFtUcnV0YV0KLSBNb2RpZnkgdGVzdF9nemlvIGluIGV4YW1wbGUuYyB0byB0YWtlIGEgc2luZ2xlIGZpbGUgbmFtZSBhcyBhCiAgcGFyYW1ldGVyIFtUcnV0YV0KLSBFeGl0IHRoZSBleGFtcGxlLmMgcHJvZ3JhbSBpZiBnem9wZW4gZmFpbHMgW1RydXRhXQotIEFkZCB0eXBlIGNhc3RzIGFyb3VuZCBzdHJsZW4gaW4gZXhhbXBsZS5jIFtUcnV0YV0KLSBSZW1vdmUgY2FzdGluZyB0byBzaXplb2YgaW4gbWluaWd6aXAuYzsgZ2l2ZSBhIHByb3BlciB0eXBlCiAgdG8gdGhlIHZhcmlhYmxlIGNvbXBhcmVkIHdpdGggU1VGRklYX0xFTiBbVHJ1dGFdCi0gVXBkYXRlIGRlZmluaXRpb25zIG9mIFNUREMgYW5kIFNUREM5OSBpbiB6Y29uZi5oIFtUcnV0YV0KLSBTeW5jaHJvbml6ZSB6Y29uZi5oIHdpdGggdGhlIG5ldyBXaW5kb3dzIERMTCBpbnRlcmZhY2UgW1RydXRhXQotIFVzZSBTWVMxNkJJVCBpbnN0ZWFkIG9mIF9fMzJCSVRfXyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCiAgMTYtIGFuZCAzMi1iaXQgcGxhdGZvcm1zIFtUcnV0YV0KLSBVc2UgZmFyIG1lbW9yeSBhbGxvY2F0b3JzIGluIHNtYWxsIDE2LWJpdCBtZW1vcnkgbW9kZWxzIGZvcgogIFR1cmJvIEMgW1RydXRhXQotIEFkZCBpbmZvIGFib3V0IHRoZSB1c2Ugb2YgQVNNViwgQVNNSU5GIGFuZCBaTElCX1dJTkFQSSBpbgogIHpsaWJDb21waWxlRmxhZ3MgW1RydXRhXQotIEN5Z3dpbiBoYXMgdnNucHJpbnRmIFtXaWxzb25dCi0gSW4gV2luZG93czE2LCBPU19DT0RFIGlzIDAsIGFzIGluIE1TRE9TIFtUcnV0YV0KLSBJbiBDeWd3aW4sIE9TX0NPREUgaXMgMyAoVW5peCksIG5vdCAxMSAoV2luZG93czMyKSBbV2lsc29uXQoKQ2hhbmdlcyBpbiAxLjIuMC40ICgxMCBBdWd1c3QgMjAwMykKLSBNaW5vciBGQVEgdXBkYXRlcwotIEJlIG1vcmUgc3RyaWN0IHdoZW4gY2hlY2tpbmcgaW5mbGF0ZUluaXQyJ3Mgd2luZG93Qml0cyBwYXJhbWV0ZXIKLSBDaGFuZ2UgTk9fR1VOWklQIGNvbXBpbGUgb3B0aW9uIHRvIE5PX0daSVAgdG8gY292ZXIgZGVmbGF0ZSBhcyB3ZWxsCi0gQWRkIGd6aXAgd3JhcHBlciBvcHRpb24gdG8gZGVmbGF0ZUluaXQyIHVzaW5nIHdpbmRvd0JpdHMKLSBBZGQgdXBkYXRlZCBRTlggcnVsZSBpbiBjb25maWd1cmUgYW5kIHFueCBkaXJlY3RvcnkgW0Jvbm5lZm95XQotIE1ha2UgaW5mbGF0ZSBkaXN0YW5jZS10b28tZmFyIGNoZWNrcyBtb3JlIHJpZ29yb3VzCi0gQ2xlYW4gdXAgRkFSIHVzYWdlIGluIGluZmxhdGUKLSBBZGQgY2FzdGluZyB0byBzaXplb2YoKSBpbiBnemlvLmMgYW5kIG1pbmlnemlwLmMKCkNoYW5nZXMgaW4gMS4yLjAuMyAoMTkgSnVseSAyMDAzKQotIEZpeCBzaWxseSBlcnJvciBpbiBnenVuZ2V0YygpIGltcGxlbWVudGF0aW9uIFtWb2xsYW50XQotIFVwZGF0ZSBjb250cmliL21pbml6aXAgYW5kIGNvbnRyaWIvdnN0dWRpbyBbVm9sbGFudF0KLSBGaXggcHJpbnRmIGZvcm1hdCBpbiBleGFtcGxlLmMKLSBDb3JyZWN0IGNkZWNsIHN1cHBvcnQgaW4gemNvbmYuaW4uaCBbQW5pc2lta292XQotIE1pbm9yIEZBUSB1cGRhdGVzCgpDaGFuZ2VzIGluIDEuMi4wLjIgKDEzIEp1bHkgMjAwMykKLSBBZGQgWkxJQl9WRVJOVU0gaW4gemxpYi5oIGZvciBudW1lcmljYWwgcHJlcHJvY2Vzc29yIGNvbXBhcmlzb25zCi0gQXR0ZW1wdCB0byBhdm9pZCB3YXJuaW5ncyBpbiBjcmMzMi5jIGZvciBwb2ludGVyLWludCBjb252ZXJzaW9uCi0gQWRkIEFJWCB0byBjb25maWd1cmUsIHJlbW92ZSBhaXggZGlyZWN0b3J5IFtCYWtrZXJdCi0gQWRkIHNvbWUgY2FzdHMgdG8gbWluaWd6aXAuYwotIEltcHJvdmUgY2hlY2tpbmcgYWZ0ZXIgaW5zZWN1cmUgc3ByaW50ZigpIG9yIHZzcHJpbnRmKCkgY2FsbHMKLSBSZW1vdmUgI2VsaWYncyBmcm9tIGNyYzMyLmMKLSBDaGFuZ2UgbGVhdmUgbGFiZWwgdG8gaW5mX2xlYXZlIGluIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jIHRvIGF2b2lkCiAgbGlicmFyeSBjb25mbGljdHMKLSBSZW1vdmUgaW5mbGF0ZSBnemlwIGRlY29kaW5nIGJ5IGRlZmF1bHQtLW9ubHkgZW5hYmxlIGd6aXAgZGVjb2RpbmcgYnkKICBzcGVjaWFsIHJlcXVlc3QgZm9yIHN0cmljdGVyIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSBBZGQgemxpYkNvbXBpbGVGbGFncygpIGZ1bmN0aW9uIHRvIHJldHVybiBjb21waWxhdGlvbiBpbmZvcm1hdGlvbgotIE1vcmUgdHlwZWNhc3RpbmcgaW4gZGVmbGF0ZS5jIHRvIGF2b2lkIHdhcm5pbmdzCi0gUmVtb3ZlIGxlYWRpbmcgdW5kZXJzY29yZSBmcm9tIF9DYXBpdGFsICNkZWZpbmVzIFtUcnV0YV0KLSBGaXggY29uZmlndXJlIHRvIGxpbmsgc2hhcmVkIGxpYnJhcnkgd2hlbiB0ZXN0aW5nCi0gQWRkIHNvbWUgV2luZG93cyBDRSB0YXJnZXQgYWRqdXN0bWVudHMgW01haV0KLSBSZW1vdmUgI2RlZmluZSBaTElCX0RMTCBpbiB6Y29uZi5oIFtWb2xsYW50XQotIEFkZCB6bGliLjMgW1JvZGdlcnNdCi0gVXBkYXRlIFJGQyBVUkwgaW4gZGVmbGF0ZS5jIGFuZCBhbGdvcml0aG0udHh0IFtNYWldCi0gQWRkIHpsaWJfZGxsX0ZBUS50eHQgdG8gY29udHJpYiBbVHJ1dGFdCi0gQWRkIFVMIHRvIHNvbWUgY29uc3RhbnRzIFtUcnV0YV0KLSBVcGRhdGUgbWluaXppcCBhbmQgdnN0dWRpbyBbVm9sbGFudF0KLSBSZW1vdmUgdmVzdGlnaWFsIE5FRURfRFVNTVlfUkVUVVJOIGZyb20gemNvbmYuaW4uaAotIEV4cGFuZCB1c2Ugb2YgTk9fRFVNTVlfREVDTCB0byBhdm9pZCBhbGwgZHVtbXkgc3RydWN0dXJlcwotIEFkZGVkIGlvc3RyZWFtMyB0byBjb250cmliIFtTY2h3YXJkdF0KLSBSZXBsYWNlIHJld2luZCgpIHdpdGggZnNlZWsoKSBmb3IgV2luQ0UgW1RydXRhXQotIEltcHJvdmUgc2V0dGluZyBvZiB6bGliIGZvcm1hdCBjb21wcmVzc2lvbiBsZXZlbCBmbGFncwogICAgLSBSZXBvcnQgMCBmb3IgaHVmZm1hbiBhbmQgcmxlIHN0cmF0ZWdpZXMgYW5kIGZvciBsZXZlbCA9PSAwIG9yIDEKICAgIC0gUmVwb3J0IDIgb25seSBmb3IgbGV2ZWwgPT0gNgotIE9ubHkgZGVhbCB3aXRoIDY0SyBsaW1pdCB3aGVuIG5lY2Vzc2FyeSBhdCBjb21waWxlIHRpbWUgW1RydXRhXQotIEFsbG93IFRPT19GQVIgY2hlY2sgdG8gYmUgdHVybmVkIG9mZiBhdCBjb21waWxlIHRpbWUgW1RydXRhXQotIEFkZCBnemNsZWFyZXJyKCkgZnVuY3Rpb24gW1NvdXphXQotIEFkZCBnenVuZ2V0YygpIGZ1bmN0aW9uCgpDaGFuZ2VzIGluIDEuMi4wLjEgKDE3IE1hcmNoIDIwMDMpCi0gQWRkIFpfUkxFIHN0cmF0ZWd5IGZvciBydW4tbGVuZ3RoIGVuY29kaW5nIFtUcnV0YV0KICAgIC0gV2hlbiBaX1JMRSByZXF1ZXN0ZWQsIHJlc3RyaWN0IG1hdGNoZXMgdG8gZGlzdGFuY2Ugb25lCiAgICAtIFVwZGF0ZSB6bGliLmgsIG1pbmlnemlwLmMsIGd6b3BlbigpLCBnemRvcGVuKCkgZm9yIFpfUkxFCi0gQ29ycmVjdCBGQVNURVNUIGNvbXBpbGF0aW9uIHRvIGFsbG93IGxldmVsID09IDAKLSBDbGVhbiB1cCB3aGF0IGdldHMgY29tcGlsZWQgZm9yIEZBU1RFU1QKLSBJbmNvcnBvcmF0ZSBjaGFuZ2VzIHRvIHpjb25mLmluLmggW1ZvbGxhbnRdCiAgICAtIFJlZmluZSBkZXRlY3Rpb24gb2YgVHVyYm8gQyBuZWVkIGZvciBkdW1teSByZXR1cm5zCiAgICAtIFJlZmluZSBaTElCX0RMTCBjb21waWxhdGlvbgogICAgLSBJbmNsdWRlIGFkZGl0aW9uYWwgaGVhZGVyIGZpbGUgb24gVk1TIGZvciBvZmZfdCB0eXBlZGVmCi0gVHJ5IHRvIHVzZSBfdnNucHJpbnRmIHdoZXJlIGl0IHN1cHBsYW50cyB2c3ByaW50ZiBbVm9sbGFudF0KLSBBZGQgc29tZSBjYXN0cyBpbiBpbmZmYXN0LmMKLSBFbmNoYW5jZSBjb21tZW50cyBpbiB6bGliLmggb24gd2hhdCBoYXBwZW5zIGlmIGd6cHJpbnRmKCkgdHJpZXMgdG8KICB3cml0ZSBtb3JlIHRoYW4gNDA5NSBieXRlcyBiZWZvcmUgY29tcHJlc3Npb24KLSBSZW1vdmUgdW51c2VkIHN0YXRlIGZyb20gaW5mbGF0ZUJhY2tFbmQoKQotIFJlbW92ZSBleGl0KDApIGZyb20gbWluaWd6aXAuYywgZXhhbXBsZS5jCi0gR2V0IHJpZCBvZiBhbGwgdGhvc2UgZGFybiB0YWJzCi0gQWRkICJjaGVjayIgdGFyZ2V0IHRvIE1ha2VmaWxlLmluIHRoYXQgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyAidGVzdCIKLSBBZGQgIm1vc3RseWNsZWFuIiBhbmQgIm1haW50YWluZXItY2xlYW4iIHRhcmdldHMgdG8gTWFrZWZpbGUuaW4KLSBVcGRhdGUgY29udHJpYi9pbmZsYXRlODYgW0FuZGVyc29uXQotIFVwZGF0ZSBjb250cmliL3Rlc3R6bGliLCBjb250cmliL3ZzdHVkaW8sIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KLSBBZGQgbXNkb3MgYW5kIHdpbjMyIGRpcmVjdG9yaWVzIHdpdGggbWFrZWZpbGVzIFtUcnV0YV0KLSBNb3JlIGFkZGl0aW9ucyBhbmQgaW1wcm92ZW1lbnRzIHRvIHRoZSBGQVEKCkNoYW5nZXMgaW4gMS4yLjAgKDkgTWFyY2ggMjAwMykKLSBOZXcgYW5kIGltcHJvdmVkIGluZmxhdGUgY29kZQogICAgLSBBYm91dCAyMCUgZmFzdGVyCiAgICAtIERvZXMgbm90IGFsbG9jYXRlIDMySyB3aW5kb3cgdW5sZXNzIGFuZCB1bnRpbCBuZWVkZWQKICAgIC0gQXV0b21hdGljYWxseSBkZXRlY3RzIGFuZCBkZWNvbXByZXNzZXMgZ3ppcCBzdHJlYW1zCiAgICAtIFJhdyBpbmZsYXRlIG5vIGxvbmdlciBuZWVkcyBhbiBleHRyYSBkdW1teSBieXRlIGF0IGVuZAogICAgLSBBZGRlZCBpbmZsYXRlQmFjayBmdW5jdGlvbnMgdXNpbmcgYSBjYWxsYmFjayBpbnRlcmZhY2UtLWV2ZW4gZmFzdGVyCiAgICAgIHRoYW4gaW5mbGF0ZSwgdXNlZnVsIGZvciBmaWxlIHV0aWxpdGllcyAoZ3ppcCwgemlwKQogICAgLSBBZGRlZCBpbmZsYXRlQ29weSgpIGZ1bmN0aW9uIHRvIHJlY29yZCBzdGF0ZSBmb3IgcmFuZG9tIGFjY2VzcyBvbgogICAgICBleHRlcm5hbGx5IGdlbmVyYXRlZCBkZWZsYXRlIHN0cmVhbXMgKGUuZy4gaW4gZ3ppcCBmaWxlcykKICAgIC0gTW9yZSByZWFkYWJsZSBjb2RlIChJIGhvcGUpCi0gTmV3IGFuZCBpbXByb3ZlZCBjcmMzMigpCiAgICAtIEFib3V0IDUwJSBmYXN0ZXIsIHRoYW5rcyB0byBzdWdnZXN0aW9ucyBmcm9tIFJvZG5leSBCcm93bgotIEFkZCBkZWZsYXRlQm91bmQoKSBhbmQgY29tcHJlc3NCb3VuZCgpIGZ1bmN0aW9ucwotIEZpeCBtZW1vcnkgbGVhayBpbiBkZWZsYXRlSW5pdDIoKQotIFBlcm1pdCBzZXR0aW5nIGRpY3Rpb25hcnkgZm9yIHJhdyBkZWZsYXRlIChmb3IgcGFyYWxsZWwgZGVmbGF0ZSkKLSBGaXggY29uc3QgZGVjbGFyYXRpb24gZm9yIGd6d3JpdGUoKQotIENoZWNrIGZvciBzb21lIG1hbGxvYygpIGZhaWx1cmVzIGluIGd6aW8uYwotIEZpeCBidWcgaW4gZ3pvcGVuKCkgb24gc2luZ2xlLWJ5dGUgZmlsZSAweDFmCi0gRml4IGJ1ZyBpbiBnenJlYWQoKSBvbiBjb25jYXRlbmF0ZWQgZmlsZSB3aXRoIDB4MWYgYXQgZW5kIG9mIGJ1ZmZlcgogIGFuZCBuZXh0IGJ1ZmZlciBkb2Vzbid0IHN0YXJ0IHdpdGggMHg4YgotIEZpeCB1bmNvbXByZXNzKCkgdG8gcmV0dXJuIFpfREFUQV9FUlJPUiBvbiB0cnVuY2F0ZWQgaW5wdXQKLSBGcmVlIG1lbW9yeSBhdCBlbmQgb2YgZXhhbXBsZS5jCi0gUmVtb3ZlIE1BWCAjZGVmaW5lIGluIHRyZWVzLmMgKGNvbmZsaWN0ZWQgd2l0aCBzb21lIGxpYnJhcmllcykKLSBGaXggc3RhdGljIGNvbnN0J3MgaW4gZGVmbGF0ZS5jLCBnemlvLmMsIGFuZCB6dXRpbC5bY2hdCi0gRGVjbGFyZSBtYWxsb2MoKSBhbmQgZnJlZSgpIGluIGd6aW8uYyBpZiBTVERDIG5vdCBkZWZpbmVkCi0gVXNlIG1hbGxvYygpIGluc3RlYWQgb2YgY2FsbG9jKCkgaW4genV0aWwuYyBpZiBpbnQgYmlnIGVub3VnaAotIERlZmluZSBTVERDIGZvciBBSVgKLSBBZGQgYWl4LyB3aXRoIGFwcHJvYWNoIGZvciBjb21waWxpbmcgc2hhcmVkIGxpYnJhcnkgb24gQUlYCi0gQWRkIEhQLVVYIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gY29uZmlndXJlCi0gQWRkIE9wZW5VTklYIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gY29uZmlndXJlCi0gVXNlICRjYyBpbnN0ZWFkIG9mIGdjYyB0byBidWlsZCBzaGFyZWQgbGlicmFyeQotIE1ha2UgcHJlZml4IGRpcmVjdG9yeSBpZiBuZWVkZWQgd2hlbiBpbnN0YWxsaW5nCi0gQ29ycmVjdCBNYWNpbnRvc2ggYXZvaWRhbmNlIG9mIHR5cGVkZWYgQnl0ZSBpbiB6Y29uZi5oCi0gQ29ycmVjdCBUdXJibyBDIG1lbW9yeSBhbGxvY2F0aW9uIHdoZW4gdW5kZXIgTGludXgKLSBVc2UgbGliei5hIGluc3RlYWQgb2YgLWx6IGluIE1ha2VmaWxlIChhc3N1cmUgdXNlIG9mIGNvbXBpbGVkIGxpYnJhcnkpCi0gVXBkYXRlIGNvbmZpZ3VyZSB0byBjaGVjayBmb3Igc25wcmludGYgb3IgdnNucHJpbnRmIGZ1bmN0aW9ucyBhbmQgdGhlaXIKICByZXR1cm4gdmFsdWUsIHdhcm4gZHVyaW5nIG1ha2UgaWYgdXNpbmcgYW4gaW5zZWN1cmUgZnVuY3Rpb24KLSBGaXggY29uZmlndXJlIHByb2JsZW0gd2l0aCBjb21waWxlLXRpbWUga25vd2xlZGdlIG9mIEhBVkVfVU5JU1REX0ggdGhhdAogIGlzIGxvc3Qgd2hlbiBsaWJyYXJ5IGlzIHVzZWQtLXJlc29sdXRpb24gaXMgdG8gYnVpbGQgbmV3IHpjb25mLmgKLSBEb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cyAoaW4gemxpYi5oKToKICAgIC0gRG9jdW1lbnQgcmF3IGRlZmxhdGUgYW5kIGluZmxhdGUKICAgIC0gVXBkYXRlIFJGQ3MgVVJMCiAgICAtIFBvaW50IG91dCB0aGF0IHpsaWIgYW5kIGd6aXAgZm9ybWF0cyBhcmUgZGlmZmVyZW50CiAgICAtIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwKICAgIC0gRG9jdW1lbnQgc3RyaW5nIGxpbWl0IGZvciBnenByaW50ZigpIGFuZCBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cKICAgIC0gTm90ZSByZXF1aXJlbWVudCBvbiBhdmFpbF9vdXQgd2hlbiBmbHVzaGluZwogICAgLSBOb3RlIHBlcm1pdHRlZCB2YWx1ZXMgb2YgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKQotIEFkZCBzb21lIEZBUXMgKGFuZCBldmVuIGFuc3dlcnMpIHRvIHRoZSBGQVEKLSBBZGQgY29udHJpYi9pbmZsYXRlODYvIGZvciB4ODYgZmFzdGVyIGluZmxhdGUKLSBBZGQgY29udHJpYi9ibGFzdC8gZm9yIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgZGVjb21wcmVzc2lvbgotIEFkZCBjb250cmliL3B1ZmYvIHNpbXBsZSBpbmZsYXRlIGZvciBkZWZsYXRlIGZvcm1hdCBkZXNjcmlwdGlvbgoKQ2hhbmdlcyBpbiAxLjEuNCAoMTEgTWFyY2ggMjAwMikKLSBaRlJFRSB3YXMgcmVwZWF0ZWQgb24gc2FtZSBhbGxvY2F0aW9uIG9uIHNvbWUgZXJyb3IgY29uZGl0aW9ucy4KICBUaGlzIGNyZWF0ZXMgYSBzZWN1cml0eSBwcm9ibGVtIGRlc2NyaWJlZCBpbgogIGh0dHA6Ly93d3cuemxpYi5vcmcvYWR2aXNvcnktMjAwMi0wMy0xMS50eHQKLSBSZXR1cm5lZCBpbmNvcnJlY3QgZXJyb3IgKFpfTUVNX0VSUk9SKSBvbiBzb21lIGludmFsaWQgZGF0YQotIEF2b2lkIGFjY2Vzc2VzIGJlZm9yZSB3aW5kb3cgZm9yIGludmFsaWQgZGlzdGFuY2VzIHdpdGggaW5mbGF0ZSB3aW5kb3cKICBsZXNzIHRoYW4gMzJLLgotIGZvcmNlIHdpbmRvd0JpdHMgPiA4IHRvIGF2b2lkIGEgYnVnIGluIHRoZSBlbmNvZGVyIGZvciBhIHdpbmRvdyBzaXplCiAgb2YgMjU2IGJ5dGVzLiAoQSBjb21wbGV0ZSBmaXggd2lsbCBiZSBhdmFpbGFibGUgaW4gMS4xLjUpLgoKQ2hhbmdlcyBpbiAxLjEuMyAoOSBKdWx5IDE5OTgpCi0gZml4ICJhbiBpbmZsYXRlIGlucHV0IGJ1ZmZlciBidWcgdGhhdCBzaG93cyB1cCBvbiByYXJlIGJ1dCBwZXJzaXN0ZW50CiAgb2NjYXNpb25zIiAoTWFyaykKLSBmaXggZ3pyZWFkIGFuZCBnenRlbGwgZm9yIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMgKERpZGllciBMZSBCb3RsYW4pCi0gZml4IGd6c2VlayguLi4sIFNFRUtfU0VUKSBpbiB3cml0ZSBtb2RlCi0gZml4IGNyYyBjaGVjayBhZnRlciBhIGd6ZWVrIChGcmFuayBGYXViZXJ0KQotIGZpeCBtaW5pdW56aXAgd2hlbiB0aGUgbGFzdCBlbnRyeSBpbiBhIHppcCBmaWxlIGlzIGl0c2VsZiBhIHppcCBmaWxlCiAgKEogTGlsbGdlKQotIGFkZCBjb250cmliL2FzbTU4NiBhbmQgY29udHJpYi9hc202ODYgKEJyaWFuIFJhaXRlcikKICBTZWUgaHR0cDovL3d3dy5tdXBwZXRsYWJzLmNvbS9+YnJlYWRib3gvc29mdHdhcmUvYXNzZW1ibHkuaHRtbAotIGFkZCBzdXBwb3J0IGZvciBEZWxwaGkgMyBpbiBjb250cmliL2RlbHBoaSAoQm9iIERlbGxhY2EpCi0gYWRkIHN1cHBvcnQgZm9yIEMrK0J1aWxkZXIgMyBhbmQgRGVscGhpIDMgaW4gY29udHJpYi9kZWxwaGkyIChEYXZpZGUgTW9yZXR0aSkKLSBkbyBub3QgZXhpdCBwcmVtYXR1cmVseSBpbiB1bnRneiBpZiAwIGF0IHN0YXJ0IG9mIGJsb2NrIChNYWdudXMgSG9sbWdyZW4pCi0gdXNlIG1hY3JvIEVYVEVSTiBpbnN0ZWFkIG9mIGV4dGVybiB0byBzdXBwb3J0IERMTCBmb3IgQmVPUyAoU2FuZGVyIFN0b2tzKQotIGFkZGVkIGEgRkFRIGZpbGUKCi0gU3VwcG9ydCBnemRvcGVuIG9uIE1hYyB3aXRoIE1ldHJvd2Vya3MgKEphc29uIExpbmhhcnQpCi0gRG8gbm90IHJlZGVmaW5lIEJ5dGUgb24gTWFjIChCcmFkIFBldHRpdCAmIEphc29uIExpbmhhcnQpCi0gZGVmaW5lIFNFRUtfRU5EIHRvbyBpZiBTRUVLX1NFVCBpcyBub3QgZGVmaW5lZCAoQWxiZXJ0IENoaW4tQS1Zb3VuZykKLSBhdm9pZCBzb21lIHdhcm5pbmdzIHdpdGggQm9ybGFuZCBDIChUb20gVGFubmVyKQotIGZpeCBhIHByb2JsZW0gaW4gY29udHJpYi9taW5pemlwL3ppcC5jIGZvciAxNi1iaXQgTVNET1MgKEdpbGxlcyBWb2xsYW50KQotIGVtdWxhdGUgdXRpbWUoKSBmb3IgV0lOMzIgaW4gY29udHJpYi91bnRneiAgKEdpbGxlcyBWb2xsYW50KQotIGFsbG93IHNldmVyYWwgYXJndW1lbnRzIHRvIGNvbmZpZ3VyZSAoVGltIE1vb25leSwgRnJvZG8gTG9vaWphYXJkKQotIHVzZSBsaWJkaXIgYW5kIGluY2x1ZGVkaXIgaW4gTWFrZWZpbGUuaW4gKFRpbSBNb29uZXkpCi0gc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIE9TRjEgVjQgKFRpbSBNb29uZXkpCi0gcmVtb3ZlIHNvX2xvY2F0aW9ucyBpbiAibWFrZSBjbGVhbiIgIChUaW0gTW9vbmV5KQotIGZpeCBtYWtldHJlZS5jIGNvbXBpbGF0aW9uIGVycm9yIChHbGVubiwgTWFyaykKLSBQeXRob24gaW50ZXJmYWNlIHRvIHpsaWIgbm93IGluIFB5dGhvbiAxLjUgKEplcmVteSBIeWx0b24pCi0gbmV3IE1ha2VmaWxlLnJpc2NvcyAoUmljaCBXYWxrZXIpCi0gaW5pdGlhbGl6ZSBzdGF0aWMgZGVzY3JpcHRvcnMgaW4gdHJlZXMuYyBmb3IgZW1iZWRkZWQgdGFyZ2V0cyAoTmljayBTbWl0aCkKLSB1c2UgImZvby1neiIgaW4gZXhhbXBsZS5jIGZvciBSSVNDT1MgYW5kIFZNUyAoTmljayBTbWl0aCkKLSBhZGQgdGhlIE9TLzIgZmlsZXMgaW4gTWFrZWZpbGUuaW4gdG9vIChBbmRyZXcgWmFib2xvdG55KQotIGZpeCBmZG9wZW4gYW5kIGhhbGxvYyBtYWNyb3MgZm9yIE1pY3Jvc29mdCBDIDYuMCAoVG9tIExhbmUpCi0gZml4IG1ha2V0cmVlLmMgdG8gYWxsb3cgY2xlYW4gY29tcGlsYXRpb24gb2YgaW5mZml4ZWQuaCAoTWFyaykKLSBmaXggcGFyYW1ldGVyIGNoZWNrIGluIGRlZmxhdGVDb3B5IChHdW50aGVyIE5pa2wpCi0gY2xlYW51cCB0cmVlcy5jLCB1c2UgY29tcHJlc3NlZF9sZW4gb25seSBpbiBkZWJ1ZyBtb2RlIChDaHJpc3RpYW4gU3BpZWxlcikKLSBNYW55IHBvcnRhYmlsaXR5IHBhdGNoZXMgYnkgQ2hyaXN0aWFuIFNwaWVsZXI6CiAgLiB6dXRpbC5jLCB6dXRpbC5oOiBhZGRlZCAiY29uc3QiIGZvciB6bWVtKgogIC4gTWFrZV92bXMuY29tOiBmaXhlZCBzb21lIHR5cG9zCiAgLiBNYWtlX3Ztcy5jb206IG1zZG9zL01ha2VmaWxlLio6IHJlbW92ZWQgenV0aWwuaCBmcm9tIHNvbWUgZGVwZW5kZW5jeSBsaXN0cwogIC4gbXNkb3MvTWFrZWZpbGUubXNjOiByZW1vdmUgImRlZmF1bHQgcnRsIGxpbmsgbGlicmFyeSIgaW5mbyBmcm9tIG9iaiBmaWxlcwogIC4gbXNkb3MvTWFrZWZpbGUuKjogdXNlIG1vZGVsLWRlcGVuZGVudCBuYW1lIGZvciB0aGUgYnVpbHQgemxpYiBsaWJyYXJ5CiAgLiBtc2Rvcy9NYWtlZmlsZS5lbXgsIG50L01ha2VmaWxlLmVteCwgbnQvTWFrZWZpbGUuZ2NjOgogICAgIG5ldyBtYWtlZmlsZXMsIGZvciBlbXggKERPUy9PUzIpLCBlbXgmcnN4bnQgYW5kIG1pbmd3MzIgKFdpbmRvd3MgOXggLyBOVCkKLSB1c2UgZGVmaW5lIGluc3RlYWQgb2YgdHlwZWRlZiBmb3IgQnl0ZWYgYWxzbyBmb3IgTVNDIHNtYWxsL21lZGl1bSAoVG9tIExhbmUpCi0gcmVwbGFjZSBfX2ZhciB3aXRoIF9mYXIgZm9yIGJldHRlciBwb3J0YWJpbGl0eSAoQ2hyaXN0aWFuIFNwaWVsZXIsIFRvbSBMYW5lKQotIGZpeCB0ZXN0IGZvciBlcnJuby5oIGluIGNvbmZpZ3VyZSAoVGltIE5ld3NoYW0pCgpDaGFuZ2VzIGluIDEuMS4yICgxOSBNYXJjaCA5OCkKLSBhZGRlZCBjb250cmliL21pbnppcCwgbWluaSB6aXAgYW5kIHVuemlwIGJhc2VkIG9uIHpsaWIgKEdpbGxlcyBWb2xsYW50KQogIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwKLSBwcmVpbml0aWFsaXplIHRoZSBpbmZsYXRlIHRhYmxlcyBmb3IgZml4ZWQgY29kZXMsIHRvIG1ha2UgdGhlIGNvZGUKICBjb21wbGV0ZWx5IHRocmVhZCBzYWZlIChNYXJrKQotIHNvbWUgc2ltcGxpZmljYXRpb25zIGFuZCBzbGlnaHQgc3BlZWQtdXAgdG8gdGhlIGluZmxhdGUgY29kZSAoTWFyaykKLSBmaXggZ3plb2Ygb24gbm9uLWNvbXByZXNzZWQgZmlsZXMgKEFsbGFuIFNjaHJ1bSkKLSBhZGQgLXN0ZDEgb3B0aW9uIGluIGNvbmZpZ3VyZSBmb3IgT1NGMSB0byBmaXggZ3pwcmludGYgKE1hcnRpbiBNb2tyZWpzKQotIHVzZSBkZWZhdWx0IHZhbHVlIG9mIDRLIGZvciBaX0JVRlNJWkUgZm9yIDE2LWJpdCBNU0RPUyAoVGltIFdlZ25lciArIEdsZW5uKQotIGFkZGVkIG9zMi9NYWtlZmlsZS5kZWYgYW5kIG9zMi96bGliLmRlZiAoQW5kcmV3IFphYm9sb3RueSkKLSBhZGQgc2hhcmVkIGxpYiBzdXBwb3J0IGZvciBVTklYX1NWNC4yTVAgKE1BVFNVVVJBIFRha2Fub3JpKQotIGRvIG5vdCB3cmFwIGV4dGVybiAiQyIgYXJvdW5kIHN5c3RlbSBpbmNsdWRlcyAoVG9tIExhbmUpCi0gbWVudGlvbiB6bGliIGJpbmRpbmcgZm9yIFRDTCBpbiBSRUFETUUgKEFuZHJlYXMgS3VwcmllcykKLSBhZGRlZCBhbWlnYS9NYWtlZmlsZS5wdXAgZm9yIEFtaWdhIHBvd2VyVVAgU0FTL0MgUFBDIChBbmRyZWFzIEtsZWluZXJ0KQotIGFsbG93ICJtYWtlIGluc3RhbGwgcHJlZml4PS4uLiIgZXZlbiBhZnRlciBjb25maWd1cmUgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKLSBhbGxvdyAiY29uZmlndXJlIC0tcHJlZml4ICRIT01FIiAoVGltIE1vb25leSkKLSByZW1vdmUgd2FybmluZ3MgaW4gZXhhbXBsZS5jIGFuZCBnemlvLmMgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKLSBtb3ZlIE1ha2VmaWxlLnNhcyB0byBhbWlnYS9NYWtlZmlsZS5zYXMKCkNoYW5nZXMgaW4gMS4xLjEgKDI3IEZlYiA5OCkKLSBmaXggbWFjcm9zIF90cl90YWxseV8qIGluIGRlZmxhdGUuaCBmb3IgZGVidWcgbW9kZSAgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikKLSByZW1vdmUgYmxvY2sgdHJ1bmNhdGlvbiBoZXVyaXN0aWMgd2hpY2ggaGFkIHZlcnkgbWFyZ2luYWwgZWZmZWN0IGZvciB6bGliCiAgKHNtYWxsZXIgbGl0X2J1ZnNpemUgdGhhbiBpbiBnemlwIDEuMi40KSBhbmQgZGVncmFkZWQgYSBsaXR0bGUgdGhlCiAgY29tcHJlc3Npb24gcmF0aW8gb24gc29tZSBmaWxlcy4gVGhpcyBhbHNvIGFsbG93cyBpbmxpbmluZyBfdHJfdGFsbHkgZm9yCiAgbWF0Y2hlcyBpbiBkZWZsYXRlX3Nsb3cuCi0gYWRkZWQgbXNkb3MvTWFrZWZpbGUudzMyIGZvciBXSU4zMiBNaWNyb3NvZnQgVmlzdWFsIEMrKyAoQm9iIEZyYXppZXIpCgpDaGFuZ2VzIGluIDEuMS4wICgyNCBGZWIgOTgpCi0gZG8gbm90IHJldHVybiBTVFJFQU1fRU5EIHByZW1hdHVyZWx5IGluIGluZmxhdGUgKEpvaG4gQm93bGVyKQotIHJldmVydCB0byB0aGUgemxpYiAxLjAuOCBpbmZsYXRlIHRvIGF2b2lkIHRoZSBnY2MgMi44LjAgYnVnIChKZXJlbXkgQnVobGVyKQotIGNvbXBpbGUgd2l0aCAtREZBU1RFU1QgdG8gZ2V0IGNvbXByZXNzaW9uIGNvZGUgb3B0aW1pemVkIGZvciBzcGVlZCBvbmx5Ci0gaW4gbWluaWd6aXAsIHRyeSBtbWFwJ2luZyB0aGUgaW5wdXQgZmlsZSBmaXJzdCAoTWlndWVsIEFsYnJlY2h0KQotIGluY3JlYXNlIHNpemUgb2YgSS9PIGJ1ZmZlcnMgaW4gbWluaWd6aXAuYyBhbmQgZ3ppby5jIChub3QgYSBiaWcgZ2FpbgogIG9uIFN1biBidXQgc2lnbmlmaWNhbnQgb24gSFApCgotIGFkZCBhIHBvaW50ZXIgdG8gZXhwZXJpbWVudGFsIHVuemlwIGxpYnJhcnkgaW4gUkVBRE1FIChHaWxsZXMgVm9sbGFudCkKLSBpbml0aWFsaXplIHZhcmlhYmxlIGdjYyBpbiBjb25maWd1cmUgKENocmlzIEhlcmJvcnRoKQoKQ2hhbmdlcyBpbiAxLjAuOSAoMTcgRmViIDE5OTgpCi0gYWRkZWQgZ3pwdXRzIGFuZCBnemdldHMgZnVuY3Rpb25zCi0gZG8gbm90IGNsZWFyIGVvZiBmbGFnIGluIGd6c2VlayAoTWFyayBEaWVraGFucykKLSBmaXggZ3pzZWVrIGZvciBmaWxlcyBpbiB0cmFuc3BhcmVudCBtb2RlIChNYXJrIERpZWtoYW5zKQotIGRvIG5vdCBhc3N1bWUgdGhhdCB2c3ByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAoSmVucyBLcmlua2UpCi0gcmVwbGFjZSBFWFBPUlQgd2l0aCBaRVhQT1JUIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggb3RoZXIgcHJvZ3JhbXMKLSBhZGRlZCBjb21wcmVzczIgaW4gemNvbmYuaCwgemxpYi5kZWYsIHpsaWIuZG50Ci0gbmV3IGFzbSBjb2RlIGZyb20gR2lsbGVzIFZvbGxhbnQgaW4gY29udHJpYi9hc20zODYKLSBzaW1wbGlmeSB0aGUgaW5mbGF0ZSBjb2RlIChNYXJrKToKIC4gUmVwbGFjZSBaQUxMT0MncyBpbiBodWZ0X2J1aWxkKCkgd2l0aCBzaW5nbGUgWkFMTE9DIGluIGluZmxhdGVfYmxvY2tzX25ldygpCiAuIFpBTExPQyB0aGUgbGVuZ3RoIGxpc3QgaW4gaW5mbGF0ZV90cmVlc19maXhlZCgpIGluc3RlYWQgb2YgdXNpbmcgc3RhY2sKIC4gWkFMTE9DIHRoZSB2YWx1ZSBhcmVhIGZvciBodWZ0X2J1aWxkKCkgaW5zdGVhZCBvZiB1c2luZyBzdGFjawogLiBTaW1wbGlmeSBaX0ZJTklTSCBjaGVjayBpbiBpbmZsYXRlKCkKCi0gQXZvaWQgZ2NjIDIuOC4wIGNvbXBhcmlzb24gYnVnIGEgbGl0dGxlIGRpZmZlcmVudGx5IHRoYW4gemxpYiAxLjAuOAotIGluIGluZnRyZWVzLmMsIGF2b2lkIGNjIC1PIGJ1ZyBvbiBIUCAoRmFyc2hpZCBFbGFoaSkKLSBpbiB6Y29uZi5oIG1vdmUgdGhlIFpMSUJfRExMIHN0dWZmIGVhcmxpZXIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aAogIHRoZSBkZWNsYXJhdGlvbiBvZiBGQVIgKEdpbGxlcyBWT2xsYW50KQotIGluc3RhbGwgbGliei5zbyogd2l0aCBtb2RlIDc1NSAoZXhlY3V0YWJsZSkgaW5zdGVhZCBvZiA2NDQgKE1hcmMgTGVobWFubikKLSByZWFkX2J1ZiBidWYgcGFyYW1ldGVyIG9mIHR5cGUgQnl0ZWYqIGluc3RlYWQgb2YgY2hhcmYqCi0gem1lbWNweSBwYXJhbWV0ZXJzIGFyZSBvZiB0eXBlIEJ5dGVmKiwgbm90IGNoYXJmKiAoSm9zZXBoIFN0cm91dCkKLSBkbyBub3QgcmVkZWNsYXJlIHVubGluayBpbiBtaW5pZ3ppcC5jIGZvciBXSU4zMiAoSm9obiBCb3dsZXIpCi0gZml4IGNoZWNrIGZvciBwcmVzZW5jZSBvZiBkaXJlY3RvcmllcyBpbiAibWFrZSBpbnN0YWxsIiAoSWFuIFdpbGxpcykKCkNoYW5nZXMgaW4gMS4wLjggKDI3IEphbiAxOTk4KQotIGZpeGVkIG9mZnNldHMgaW4gY29udHJpYi9hc20zODYvZ3ZtYXQzMi5hc20gKEdpbGxlcyBWb2xsYW50KQotIGZpeCBnemdldGMgYW5kIGd6cHV0YyBmb3IgYmlnIGVuZGlhbiBzeXN0ZW1zIChNYXJrdXMgT2Jlcmh1bWVyKQotIGFkZGVkIGNvbXByZXNzMigpIHRvIGFsbG93IHNldHRpbmcgdGhlIGNvbXByZXNzaW9uIGxldmVsCi0gaW5jbHVkZSBzeXMvdHlwZXMuaCB0byBnZXQgb2ZmX3Qgb24gc29tZSBzeXN0ZW1zIChNYXJjIExlaG1hbm4gJiBRaW5nTG9uZykKLSB1c2UgY29uc3RhbnQgYXJyYXlzIGZvciB0aGUgc3RhdGljIHRyZWVzIGluIHRyZWVzLmMgaW5zdGVhZCBvZiBjb21wdXRpbmcKICB0aGVtIGF0IHJ1biB0aW1lICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4gZm9yIHRoaXMgc3VnZ2VzdGlvbikuIFRvIGNyZWF0ZQogIHRyZWVzLmgsIGNvbXBpbGUgd2l0aCBHRU5fVFJFRVNfSCBhbmQgcnVuICJtYWtlIHRlc3QiLgotIGNoZWNrIHJldHVybiBjb2RlIG9mIGV4YW1wbGUgaW4gIm1ha2UgdGVzdCIgYW5kIGRpc3BsYXkgcmVzdWx0Ci0gcGFzcyBtaW5pZ3ppcCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBmaWxlX2NvbXByZXNzCi0gc2ltcGxpZnlpbmcgY29kZSBvZiBpbmZsYXRlU3luYyB0byBhdm9pZCBnY2MgMi44IGJ1ZwoKLSBzdXBwb3J0IENDPSJnY2MgLVdhbGwiIGluIGNvbmZpZ3VyZSAtcyAoUWluZ0xvbmcpCi0gYXZvaWQgYSBmbHVzaCBjYXVzZWQgYnkgZnRlbGwgaW4gZ3pvcGVuIGZvciB3cml0ZSBtb2RlIChLZW4gUmFlYnVybikKLSBmaXggdGVzdCBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncwotIHpsaWIubGliIC0+IHpsaWIuZGxsIGluIG1zZG9zL3psaWIucmMgKEdpbGxlcyBWb2xsYW50KQotIGNoZWNrIGZvciBUQVJHRVRfT1NfTUFDIGluIGFkZGl0aW9uIHRvIE1BQ09TIChCcmFkIFBldHRpdCkKLSBkbyBub3QgdXNlIGZkb3BlbiBmb3IgTWV0cm93ZXJrcyBvbiBNYWMgKEJyYWQgUGV0dGl0KSkKLSBhZGQgY2hlY2tzIGZvciBnenB1dGMgYW5kIGd6cHV0YyBpbiBleGFtcGxlLmMKLSBhdm9pZCB3YXJuaW5ncyBpbiBnemlvLmMgYW5kIGRlZmxhdGUuYyAoQW5kcmVhcyBLbGVpbmVydCkKLSB1c2UgY29uc3QgZm9yIHRoZSBDUkMgdGFibGUgKEtlbiBSYWVidXJuKQotIGZpeGVkICJtYWtlIHVuaW5zdGFsbCIgZm9yIHNoYXJlZCBsaWJyYXJpZXMKLSB1c2UgVHJhY2V2IGluc3RlYWQgb2YgVHJhY2UgaW4gaW5mYmxvY2suYwotIGluIGV4YW1wbGUuYyB1c2UgY29ycmVjdCBjb21wcmVzc2VkIGxlbmd0aCBmb3IgdGVzdF9zeW5jCi0gc3VwcHJlc3MgK3Zub2NvbXBhdHdhcm5pbmdzIGluIGNvbmZpZ3VyZSBmb3IgSFBVWCAobm90IGFsd2F5cyBzdXBwb3J0ZWQpCgpDaGFuZ2VzIGluIDEuMC43ICgyMCBKYW4gMTk5OCkKLSBmaXggZ3pzZWVrIHdoaWNoIHdhcyBicm9rZW4gaW4gd3JpdGUgbW9kZQotIHJldHVybiBlcnJvciBmb3IgZ3pzZWVrIHRvIG5lZ2F0aXZlIGFic29sdXRlIHBvc2l0aW9uCi0gZml4IGNvbmZpZ3VyZSBmb3IgTGludXggKENodW4tQ2h1bmcgQ2hlbikKLSBpbmNyZWFzZSBzdGFjayBzcGFjZSBmb3IgTVNDIChUaW0gV2VnbmVyKQotIGdldF9jcmNfdGFibGUgYW5kIGluZmxhdGVTeW5jUG9pbnQgYXJlIEVYUE9SVGVkIChHaWxsZXMgVm9sbGFudCkKLSBkZWZpbmUgRVhQT1JUVkEgZm9yIGd6cHJpbnRmIChHaWxsZXMgVm9sbGFudCkKLSBhZGRlZCBtYW4gcGFnZSB6bGliLjMgKFJpY2sgUm9kZ2VycykKLSBmb3IgY29udHJpYi91bnRneiwgZml4IG1ha2VkaXIoKSBhbmQgaW1wcm92ZSBNYWtlZmlsZQoKLSBjaGVjayBnenNlZWsgaW4gd3JpdGUgbW9kZSBpbiBleGFtcGxlLmMKLSBhbGxvY2F0ZSBleHRyYSBidWZmZXIgZm9yIHNlZWtzIG9ubHkgaWYgZ3pzZWVrIGlzIGFjdHVhbGx5IGNhbGxlZAotIGF2b2lkIHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29ucyAoVGltIFdlZ25lciwgR2lsbGVzIFZvbGxhbnQpCi0gYWRkIGluZmxhdGVTeW5jUG9pbnQgaW4gemNvbmYuaAotIGZpeCBsaXN0IG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiBudC96bGliLmRudCBhbmQgbWRzb3MvemxpYi5kZWYKCkNoYW5nZXMgaW4gMS4wLjYgKDE5IEphbiAxOTk4KQotIGFkZCBmdW5jdGlvbnMgZ3pwcmludGYsIGd6cHV0YywgZ3pnZXRjLCBnenRlbGwsIGd6ZW9mLCBnenNlZWssIGd6cmV3aW5kIGFuZAogIGd6c2V0cGFyYW1zICh0aGFua3MgdG8gUm9sYW5kIEdpZXJzaWcgYW5kIEtldmluIFJ1bGFuZCBmb3Igc29tZSBvZiB0aGlzIGNvZGUpCi0gRml4IGEgZGVmbGF0ZSBidWcgb2NjdXJyaW5nIG9ubHkgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCAwICh0aGFua3MgdG8KICBBbmR5IEJ1Y2tsZXIgZm9yIGZpbmRpbmcgdGhpcyBvbmUpLgotIEluIG1pbmlnemlwLCBwYXNzIHRyYW5zcGFyZW50bHkgYWxzbyB0aGUgZmlyc3QgYnl0ZSBmb3IgLlogZmlsZXMuCi0gcmV0dXJuIFpfQlVGX0VSUk9SIGluc3RlYWQgb2YgWl9PSyBpZiBvdXRwdXQgYnVmZmVyIGZ1bGwgaW4gdW5jb21wcmVzcygpCi0gY2hlY2sgWl9GSU5JU0ggaW4gaW5mbGF0ZSAodGhhbmtzIHRvIE1hcmMgU2NobHVwZXIpCi0gSW1wbGVtZW50IGRlZmxhdGVDb3B5ICh0aGFua3MgdG8gQWRhbSBDb3N0ZWxsbykKLSBtYWtlIHN0YXRpYyBsaWJyYXJpZXMgYnkgZGVmYXVsdCBpbiBjb25maWd1cmUsIGFkZCAtLXNoYXJlZCBvcHRpb24uCi0gbW92ZSBNU0RPUyBvciBXaW5kb3dzIHNwZWNpZmljIGZpbGVzIHRvIGRpcmVjdG9yeSBtc2RvcwotIHN1cHByZXNzIHRoZSBub3Rpb24gb2YgcGFydGlhbCBmbHVzaCB0byBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlCiAgKGJ1dCB0aGUgc3ltYm9sIFpfUEFSVElBTF9GTFVTSCBpcyBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4wLjQpCi0gc3VwcHJlc3MgaGlzdG9yeSBidWZmZXIgcHJvdmlkZWQgYnkgYXBwbGljYXRpb24gdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQogICh0aGlzIGZlYXR1cmUgd2FzIG5vdCBpbXBsZW1lbnRlZCBhbnl3YXkgaW4gMS4wLjQpCi0gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBpbmZsYXRlSW5pdCBvcgogIGluZmxhdGVJbml0MgotIGFkZCBFWFBPUlQgaW4gYWxsIGV4cG9ydGVkIGZ1bmN0aW9ucyAoZm9yIFdpbmRvd3MgRExMKQotIGFkZGVkIE1ha2VmaWxlLm50ICh0aGFua3MgdG8gU3RlcGhlbiBXaWxsaWFtcykKLSBhZGRlZCB0aGUgdW5zdXBwb3J0ZWQgImNvbnRyaWIiIGRpcmVjdG9yeToKICAgY29udHJpYi9hc20zODYvIGJ5IEdpbGxlcyBWb2xsYW50IDxpbmZvQHdpbmltYWdlLmNvbT4KICAgICAgICAzODYgYXNtIGNvZGUgcmVwbGFjaW5nIGxvbmdlc3RfbWF0Y2goKS4KICAgY29udHJpYi9pb3N0cmVhbS8gYnkgS2V2aW4gUnVsYW5kIDxrZXZpbkByb2Rpbi53dXN0bC5lZHU+CiAgICAgICAgQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKICAgY29udHJpYi9pb3N0cmVhbTIvICBieSBUeWdlIEz4dnNldCA8VHlnZS5Mb3ZzZXRAY21yLm5vPgogICAgICAgIEFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQogICBjb250cmliL3VudGd6LyAgYnkgIlBlZHJvIEEuIEFyYW5kYSBHdXRpXGlycmV6IiA8cGFhZ0B0aWQuZXM+CiAgICAgICAgQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYgogICBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KICAgICAgICBIb3cgdG8gdXNlIGNvbXByZXNzKCksIHVuY29tcHJlc3MoKSBhbmQgdGhlIGd6KiBmdW5jdGlvbnMgZnJvbSBWQi4KLSBwYXNzIHBhcmFtcyAtZiAoZmlsdGVyZWQgZGF0YSksIC1oIChodWZmbWFuIG9ubHkpLCAtMSB0byAtOSAoY29tcHJlc3Npb24KICBsZXZlbCkgaW4gbWluaWd6aXAgKHRoYW5rcyB0byBUb20gTGFuZSkKCi0gdXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gZGVmbGF0ZQotIGFkZGVkIHRlc3QgZm9yIGd6c2VlayBhbmQgZ3p0ZWxsIGluIGV4YW1wbGUuYwotIGFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gaW5mbGF0ZVN5bmNQb2ludCgpIChoYWNrIGZvciBQYXVsIE1hY2tlcnJhcykKLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIHpFcnJvciB0byBjb252ZXJ0IGVycm9yIGNvZGUgdG8gc3RyaW5nCiAgKGZvciBUaW0gU21pdGhlcnMpCi0gQWxsb3cgY29tcGlsYXRpb24gb2YgZ3ppbyB3aXRoIC1ETk9fREVGTEFURSB0byBhdm9pZCB0aGUgY29tcHJlc3Npb24gY29kZS4KLSBVc2UgZGVmYXVsdCBtZW1jcHkgZm9yIFN5bWFudGVjIE1TRE9TIGNvbXBpbGVyLgotIEFkZCBFWFBPUlQga2V5d29yZCBmb3IgY2hlY2tfZnVuYyAobmVlZGVkIGZvciBXaW5kb3dzIERMTCkKLSBhZGQgY3VycmVudCBkaXJlY3RvcnkgdG8gTERfTElCUkFSWV9QQVRIIGZvciAibWFrZSB0ZXN0IgotIGNyZWF0ZSBhbHNvIGEgbGluayBmb3IgbGliei5zby4xCi0gYWRkZWQgc3VwcG9ydCBmb3IgRlVKSVRTVSBVWFAvRFMgKHRoYW5rcyB0byBUb3NoaWFraSBOb211cmEpCi0gdXNlICQoU0hBUkVETElCKSBpbnN0ZWFkIG9mIGxpYnouc28gaW4gTWFrZWZpbGUuaW4gKGZvciBIUFVYKQotIGFkZGVkIC1zb25hbWUgZm9yIExpbnV4IGluIGNvbmZpZ3VyZSAoQ2h1bi1DaHVuZyBDaGVuLAotIGFzc2lnbiBudW1iZXJzIHRvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgaW4gemxpYi5kZWYgKGZvciBXaW5kb3dzIERMTCkKLSBhZGQgYWR2aWNlIGluIHpsaWIuaCBmb3IgYmVzdCB1c2FnZSBvZiBkZWZsYXRlU2V0RGljdGlvbmFyeQotIHdvcmsgYXJvdW5kIGNvbXBpbGVyIGJ1ZyBvbiBBdGFyaSAoY2FzdCBaX05VTEwgaW4gY2FsbCBvZiBzLT5jaGVja2ZuKQotIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgZm9yIFR1cmJvQyBpbiBsYXJnZSBtb2RlbAotIGF2b2lkICJ2ZXJzaW9uU3RyaW5nIlswXSAoQm9ybGFuZCBidWcpCi0gYWRkIE5FRURfRFVNTVlfUkVUVVJOIGZvciBCb3JsYW5kCi0gdXNlIHZhcmlhYmxlIHpfdmVyYm9zZSBmb3IgdHJhY2luZyBpbiBkZWJ1ZyBtb2RlIChMLiBQZXRlciBEZXV0c2NoKS4KLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIENDCi0gZGVmaW5lZCBTVERDIGZvciBPUy8yIChEYXZpZCBDaGFybGFwKQotIGxpbWl0IGV4dGVybmFsIG5hbWVzIHRvIDggY2hhcnMgZm9yIE1WUyAoVGhvbWFzIEx1bmQpCi0gaW4gbWluaWd6aXAuYywgdXNlIHN0YXRpYyBidWZmZXJzIG9ubHkgZm9yIDE2LWJpdCBzeXN0ZW1zCi0gZml4IHN1ZmZpeCBjaGVjayBmb3IgIm1pbmlnemlwIC1kIGZvby5neiIKLSBkbyBub3QgcmV0dXJuIGFuIGVycm9yIGZvciB0aGUgMm5kIG9mIHR3byBjb25zZWN1dGl2ZSBnemZsdXNoKCkgKEZlbGl4IExlZSkKLSB1c2UgX2Zkb3BlbiBpbnN0ZWFkIG9mIGZkb3BlbiBmb3IgTVNDID49IDYuMCAoVGhvbWFzIEZhbnNsYXUpCi0gYWRkZWQgbWFrZWxjYy5iYXQgZm9yIGxjYy13aW4zMiAoVG9tIFN0IERlbmlzKQotIGluIE1ha2VmaWxlLmRqMiwgdXNlIGNvcHkgYW5kIGRlbCBpbnN0ZWFkIG9mIGluc3RhbGwgYW5kIHJtIChGcmFuayBEb25haG9lKQotIEF2b2lkIGV4cGFuZGVkICRJZDogQ2hhbmdlTG9nLHYgMS41IDIwMDIvMDUvMDggMDQ6Mzg6MDAgYW9saXZhIEV4cCAkLiBVc2UgInJjcyAta2IiIG9yICJjdnMgYWRtaW4gLWtiIiB0byBhdm9pZCBJZCBleHBhbnNpb24uCi0gY2hlY2sgZm9yIHVuaXN0ZC5oIGluIGNvbmZpZ3VyZSAoZm9yIG9mZl90KQotIHJlbW92ZSB1c2VsZXNzIGNoZWNrIHBhcmFtZXRlciBpbiBpbmZsYXRlX2Jsb2Nrc19mcmVlCi0gYXZvaWQgdXNlbGVzcyBhc3NpZ25tZW50IG9mIHMtPmNoZWNrIHRvIGl0c2VsZiBpbiBpbmZsYXRlX2Jsb2Nrc19uZXcKLSBkbyBub3QgZmx1c2ggdHdpY2UgaW4gZ3pjbG9zZSAodGhhbmtzIHRvIEtlbiBSYWVidXJuKQotIHJlbmFtZSBGT1BFTiBhcyBGX09QRU4gdG8gYXZvaWQgY2xhc2ggd2l0aCAvdXNyL2luY2x1ZGUvc3lzL2ZpbGUuaAotIHVzZSBOT19FUlJOT19IIGluc3RlYWQgb2YgZW51bWVyYXRpb24gb2Ygb3BlcmF0aW5nIHN5c3RlbXMgd2l0aCBlcnJuby5oCi0gd29yayBhcm91bmQgYnVnZ3kgZmNsb3NlIG9uIHBpcGVzIGZvciBIUC9VWAotIHN1cHBvcnQgemxpYiBETEwgd2l0aCBCT1JMQU5EIEMrKyA1LjAgKHRoYW5rcyB0byBHbGVubiBSYW5kZXJzLVBlaHJzb24pCi0gZml4IGNvbmZpZ3VyZSBpZiBDQyBpcyBhbHJlYWR5IGVxdWFsIHRvIGdjYwoKQ2hhbmdlcyBpbiAxLjAuNSAoMyBKYW4gOTgpCi0gRml4IGluZmxhdGUgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgd2hlbiBmZWQgY29ycnVwdGVkIG9yIGludmFsaWQgZGF0YQotIFVzZSBjb25zdCBmb3Igcm9tbWFibGUgY29uc3RhbnRzIGluIGluZmxhdGUKLSBFbGltaW5hdGUgbWVtb3J5IGxlYWtzIG9uIGVycm9yIGNvbmRpdGlvbnMgaW4gaW5mbGF0ZQotIFJlbW92ZWQgc29tZSB2ZXN0aWdpYWwgY29kZSBpbiBpbmZsYXRlCi0gVXBkYXRlIHdlYiBhZGRyZXNzIGluIFJFQURNRQoKQ2hhbmdlcyBpbiAxLjAuNCAoMjQgSnVsIDk2KQotIEluIHZlcnkgcmFyZSBjb25kaXRpb25zLCBkZWZsYXRlKHMsIFpfRklOSVNIKSBjb3VsZCBmYWlsIHRvIHByb2R1Y2UgYW4gRU9GCiAgYml0LCBzbyB0aGUgZGVjb21wcmVzc29yIGNvdWxkIGRlY29tcHJlc3MgYWxsIHRoZSBjb3JyZWN0IGRhdGEgYnV0IHdlbnQKICBvbiB0byBhdHRlbXB0IGRlY29tcHJlc3NpbmcgZXh0cmEgZ2FyYmFnZSBkYXRhLiBUaGlzIGFmZmVjdGVkIG1pbmlnemlwIHRvby4KLSB6bGliVmVyc2lvbiBhbmQgZ3plcnJvciByZXR1cm4gY29uc3QgY2hhciogKG5lZWRlZCBmb3IgRExMKQotIHBvcnQgdG8gUklTQ09TIChubyBmZG9wZW4sIG5vIG11bHRpcGxlIGRvdHMsIG5vIHVubGluaywgbm8gZmlsZW5vKQotIHVzZSB6X2Vycm9yIG9ubHkgZm9yIERFQlVHIChhdm9pZCBwcm9ibGVtIHdpdGggRExMcykKCkNoYW5nZXMgaW4gMS4wLjMgKDIgSnVsIDk2KQotIHVzZSB6X3N0cmVhbXAgaW5zdGVhZCBvZiB6X3N0cmVhbSAqLCB3aGljaCBpcyBub3cgYSBmYXIgcG9pbnRlciBpbiBNU0RPUwogIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWxzOyB0aGlzIG1ha2VzIHRoZSBsaWJyYXJ5IGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzCiAgdmVyc2lvbnMgZm9yIHRoZXNlIG1vZGVscy4gKE5vIGVmZmVjdCBpbiBsYXJnZSBtb2RlbCBvciBvbiBvdGhlciBzeXN0ZW1zLikKLSByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgaWYgcHJldmlvdXMgZGVmbGF0ZSBjYWxsIHJldHVybmVkIHdpdGgKICBhdmFpbF9vdXQgYXMgemVybyBidXQgdGhlcmUgaXMgbm90aGluZyB0byBkbwotIGFkZGVkIG1lbWNtcCBmb3Igbm9uIFNUREMgY29tcGlsZXJzCi0gZGVmaW5lIE5PX0RVTU1ZX0RFQ0wgZm9yIG1vcmUgTWFjIGNvbXBpbGVycyAoLmggZmlsZXMgbWVyZ2VkIGluY29ycmVjdGx5KQotIGRlZmluZSBfXzMyQklUX18gaWYgX18zODZfXyBvciBpMzg2IGlzIGRlZmluZWQgKHBiLiB3aXRoIFdhdGNvbSBhbmQgU0NPKQotIGJldHRlciBjaGVjayBmb3IgMTYtYml0IG1vZGUgTVNDIChhdm9pZHMgcHJvYmxlbSB3aXRoIFN5bWFudGVjKQoKQ2hhbmdlcyBpbiAxLjAuMiAoMjMgTWF5IDk2KQotIGFkZGVkIFdpbmRvd3MgRExMIHN1cHBvcnQKLSBhZGRlZCBhIGZ1bmN0aW9uIHpsaWJWZXJzaW9uIChmb3IgdGhlIERMTCBzdXBwb3J0KQotIGZpeGVkIGRlY2xhcmF0aW9ucyB1c2luZyBCeXRlZiBpbiBpbmZ1dGlsLmMgKHBiIHdpdGggTVNET1MgbWVkaXVtIG1vZGVsKQotIEJ5dGVmIGlzIGRlZmluZSdzIGluc3RlYWQgb2YgdHlwZWRlZidkIG9ubHkgZm9yIEJvcmxhbmQgQwotIGF2b2lkIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gZXhhbXBsZS5jCi0gbWVudGlvbiBpbiBSRUFETUUgdGhhdCB0aGUgemxpYiBmb3JtYXQgaXMgbm93IFJGQzE5NTAKLSB1cGRhdGVkIE1ha2VmaWxlLmRqMgotIGFkZGVkIGFsZ29yaXRobS5kb2MKCkNoYW5nZXMgaW4gMS4wLjEgKDIwIE1heSA5NikgWzEuMCBza2lwcGVkIHRvIGF2b2lkIGNvbmZ1c2lvbl0KLSBmaXggYXJyYXkgb3ZlcmxheSBpbiBkZWZsYXRlLmMgd2hpY2ggc29tZXRpbWVzIGNhdXNlZCBiYWQgY29tcHJlc3NlZCBkYXRhCi0gZml4IGluZmxhdGUgYnVnIHdpdGggZW1wdHkgc3RvcmVkIGJsb2NrCi0gZml4IE1TRE9TIG1lZGl1bSBtb2RlbCB3aGljaCB3YXMgYnJva2VuIGluIDAuOTkKLSBmaXggZGVmbGF0ZVBhcmFtcygpIHdoaWNoIGNvdWxkIGdlbmVyYXRlZCBiYWQgY29tcHJlc3NlZCBkYXRhLgotIEJ5dGVmIGlzIGRlZmluZSdkIGluc3RlYWQgb2YgdHlwZWRlZidlZCAod29yayBhcm91bmQgQm9ybGFuZCBidWcpCi0gYWRkZWQgYW4gSU5ERVggZmlsZQotIG5ldyBtYWtlZmlsZXMgZm9yIERKR1BQIChNYWtlZmlsZS5kajIpLCAzMi1iaXQgQm9ybGFuZCAoTWFrZWZpbGUuYjMyKSwKICBXYXRjb20gKE1ha2VmaWxlLndhdCksIEFtaWdhIFNBUy9DIChNYWtlZmlsZS5zYXMpCi0gc3BlZWQgdXAgYWRsZXIzMiBmb3IgbW9kZXJuIG1hY2hpbmVzIHdpdGhvdXQgYXV0by1pbmNyZW1lbnQKLSBhZGRlZCAtYW5zaSBmb3IgSVJJWCBpbiBjb25maWd1cmUKLSBzdGF0aWNfaW5pdF9kb25lIGluIHRyZWVzLmMgaXMgYW4gaW50Ci0gZGVmaW5lIHVubGluayBhcyBkZWxldGUgZm9yIFZNUwotIGZpeCBjb25maWd1cmUgZm9yIFFOWAotIGFkZCBjb25maWd1cmUgYnJhbmNoIGZvciBTQ08gYW5kIEhQVVgKLSBhdm9pZCBtYW55IHdhcm5pbmdzICh1bnVzZWQgdmFyaWFibGVzLCBkZWFkIGFzc2lnbm1lbnRzLCBldGMuLi4pCi0gbm8gZmRvcGVuIGZvciBCZU9TCi0gZml4IHRoZSBXYXRjb20gZml4IGZvciAzMiBiaXQgbW9kZSAoZGVmaW5lIEZBUiBhcyBlbXB0eSkKLSByZW1vdmVkIHJlZGVmaW5pdGlvbiBvZiBCeXRlIGZvciBNS1dFUktTCi0gd29yayBhcm91bmQgYW4gTVdLRVJLUyBidWcgKGluY29ycmVjdCBtZXJnZSBvZiBhbGwgLmggZmlsZXMpCgpDaGFuZ2VzIGluIDAuOTkgKDI3IEphbiA5NikKLSBhbGxvdyBwcmVzZXQgZGljdGlvbmFyeSBzaGFyZWQgYmV0d2VlbiBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IKLSBhbGxvdyBjb21wcmVzc2lvbiBsZXZlbCAwIChubyBjb21wcmVzc2lvbikKLSBhZGQgZGVmbGF0ZVBhcmFtcyBpbiB6bGliLmg6IGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCiAgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LgotIHRlc3QgbGFyZ2UgYnVmZmVycyBhbmQgZGVmbGF0ZVBhcmFtcyBpbiBleGFtcGxlLmMKLSBhZGQgb3B0aW9uYWwgImNvbmZpZ3VyZSIgdG8gYnVpbGQgemxpYiBhcyBhIHNoYXJlZCBsaWJyYXJ5Ci0gc3VwcHJlc3MgTWFrZWZpbGUucW54LCB1c2UgY29uZmlndXJlIGluc3RlYWQKLSBmaXhlZCBkZWZsYXRlIGZvciA2NC1iaXQgc3lzdGVtcyAoZGV0ZWN0ZWQgb24gQ3JheSkKLSBmaXhlZCBpbmZsYXRlX2Jsb2NrcyBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIEFscGhhKQotIGRlY2xhcmUgWl9ERUZMQVRFRCBpbiB6bGliLmggKHBvc3NpYmxlIHBhcmFtZXRlciBmb3IgZGVmbGF0ZUluaXQyKQotIGFsd2F5cyByZXR1cm4gWl9CVUZfRVJST1Igd2hlbiBkZWZsYXRlKCkgaGFzIG5vdGhpbmcgdG8gZG8KLSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYXJlIG5vdyBtYWNyb3MgdG8gYWxsb3cgdmVyc2lvbiBjaGVja2luZwotIHByZWZpeCBhbGwgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgd2l0aCB6XyB3aXRoIC1EWl9QUkVGSVgKLSBtYWtlIGZhbGxvYyBjb21wbGV0ZWx5IHJlZW50cmFudCAoaW5mdHJlZXMuYykKLSBmaXhlZCB2ZXJ5IHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIGluIGN0X3N0YXRpY19pbml0Ci0gZnJlZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb24gdG8gaGVscCBtZW1vcnkgbWFuYWdlcgotIHVzZSB6bGliLTEuMC8qIGluc3RlYWQgb2YgemxpYi8qIGluc2lkZSB0aGUgdGFyLmd6Ci0gbWFrZSB6bGliIHdhcm5pbmctZnJlZSB3aXRoICJnY2MgLU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGgKICAtV2NvbnZlcnNpb24gLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyIKLSBhbGxvdyBnenJlYWQgb24gY29uY2F0ZW5hdGVkIC5neiBmaWxlcwotIGRlZmxhdGVFbmQgbm93IHJldHVybnMgWl9EQVRBX0VSUk9SIGlmIGl0IHdhcyBwcmVtYXR1cmUKLSBkZWZsYXRlIGlzIGZpbmFsbHkgKD8pIGZ1bGx5IGRldGVybWluaXN0aWMgKG5vIG1hdGNoZXMgYmV5b25kIGVuZCBvZiBpbnB1dCkKLSBEb2N1bWVudCBaX1NZTkNfRkxVU0gKLSBhZGQgdW5pbnN0YWxsIGluIE1ha2VmaWxlCi0gQ2hlY2sgZm9yIF9fY3BsdXBsdXMgaW4gemxpYi5oCi0gQmV0dGVyIHRlc3QgaW4gY3RfYWxpZ24gZm9yIHBhcnRpYWwgZmx1c2gKLSBhdm9pZCBoYXJtbGVzcyB3YXJuaW5ncyBmb3IgQm9ybGFuZCBDKysKLSBpbml0aWFsaXplIGhhc2hfaGVhZCBpbiBkZWZsYXRlLmMKLSBhdm9pZCB3YXJuaW5nIG9uIGZkb3BlbiAoZ3ppby5jKSBmb3IgSFAgY2MgLUFhCi0gaW5jbHVkZSBzdGRsaWIuaCBmb3IgU1REQyBjb21waWxlcnMKLSBpbmNsdWRlIGVycm5vLmggZm9yIENyYXkKLSBpZ25vcmUgZXJyb3IgaWYgcmFubGliIGRvZXNuJ3QgZXhpc3QKLSBjYWxsIHJhbmxpYiB0d2ljZSBmb3IgTmVYVFNURVAKLSB1c2UgZXhlY19wcmVmaXggaW5zdGVhZCBvZiBwcmVmaXggZm9yIGxpYnouYQotIHJlbmFtZWQgY3RfKiBhcyBfdHJfKiB0byBhdm9pZCBjb25mbGljdCB3aXRoIGFwcGxpY2F0aW9ucwotIGNsZWFyIHotPm1zZyBpbiBpbmZsYXRlSW5pdDIgYmVmb3JlIGFueSBlcnJvciByZXR1cm4KLSBpbml0aWFsaXplIG9wYXF1ZSBpbiBleGFtcGxlLmMsIGd6aW8uYywgZGVmbGF0ZS5jIGFuZCBpbmZsYXRlLmMKLSBmaXhlZCB0eXBvIGluIHpjb25mLmggKF9HTlVDX18gPT4gX19HTlVDX18pCi0gY2hlY2sgZm9yIFdJTjMyIGluIHpjb25mLmggYW5kIHp1dGlsLmMgKGF2b2lkIGZhcm1hbGxvYyBpbiAzMi1iaXQgbW9kZSkKLSBmaXggdHlwbyBpbiBNYWtlX3Ztcy5jb20gKGYkdHJubG5tIC0+IGYkZ2V0c3lpKQotIGluIGZjYWxsb2MsIG5vcm1hbGl6ZSBwb2ludGVyIGlmIHNpemUgPiA2NTUyMCBieXRlcwotIGRvbid0IHVzZSBzcGVjaWFsIGZjYWxsb2MgZm9yIDMyIGJpdCBCb3JsYW5kIEMrKwotIHVzZSBTVERDIGluc3RlYWQgb2YgX19HTzMyX18gdG8gYXZvaWQgcmVkZWNsYXJpbmcgZXhpdCwgY2FsbG9jLCBldGMuLi4KLSB1c2UgWl9CSU5BUlkgaW5zdGVhZCBvZiBCSU5BUlkKLSBkb2N1bWVudCB0aGF0IGd6Y2xvc2UgYWZ0ZXIgZ3pkb3BlbiB3aWxsIGNsb3NlIHRoZSBmaWxlCi0gYWxsb3cgImEiIGFzIG1vZGUgaW4gZ3pvcGVuLgotIGZpeCBlcnJvciBjaGVja2luZyBpbiBnenJlYWQKLSBhbGxvdyBza2lwcGluZyAuZ3ogZXh0cmEtZmllbGQgb24gcGlwZXMKLSBhZGRlZCByZWZlcmVuY2UgdG8gUGVybCBpbnRlcmZhY2UgaW4gUkVBRE1FCi0gcHV0IHRoZSBjcmMgdGFibGUgaW4gRkFSIGRhdGEgKEkgZGlzbGlrZSBtb3JlIGFuZCBtb3JlIHRoZSBtZWRpdW0gbW9kZWwgOikKLSBhZGRlZCBnZXRfY3JjX3RhYmxlCi0gYWRkZWQgYSBkaW1lbnNpb24gdG8gYWxsIGFycmF5cyAoQm9ybGFuZCBDIGNhbid0IGNvdW50KS4KLSB3b3JrYXJvdW5kIEJvcmxhbmQgQyBidWcgaW4gZGVjbGFyYXRpb24gb2YgaW5mbGF0ZV9jb2Rlc19uZXcgJiBpbmZsYXRlX2Zhc3QKLSBndWFyZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiBvZiAqLmggKGZvciBwcmVjb21waWxlZCBoZWFkZXIgb24gTWFjKQotIFdhdGNvbSBDIHByZXRlbmRzIHRvIGJlIE1pY3Jvc29mdCBDIHNtYWxsIG1vZGVsIGV2ZW4gaW4gMzIgYml0IG1vZGUuCi0gZG9uJ3QgdXNlIHVuc2l6ZWQgYXJyYXlzIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIGJ5IFZpc3VhbCBDKys6CiAgICAgd2FybmluZyBDNDc0NjogJ2luZmxhdGVfbWFzaycgOiB1bnNpemVkIGFycmF5IHRyZWF0ZWQgYXMgICdfX2ZhcicKICAgICAod2hhdCdzIHdyb25nIHdpdGggZmFyIGRhdGEgaW4gZmFyIG1vZGVsPykuCi0gZGVmaW5lIGVudW0gb3V0IG9mIGluZmxhdGVfYmxvY2tzX3N0YXRlIHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQysrCgpDaGFuZ2VzIGluIDAuOTUgKDE2IEF1ZyA5NSkKLSBmaXggTVNET1Mgc21hbGwgYW5kIG1lZGl1bSBtb2RlbCAobm93IGVhc2llciB0byBhZGFwdCB0byBhbnkgY29tcGlsZXIpCi0gaW5saW5lZCBzZW5kX2JpdHMKLSBmaXggdGhlIGZpbmFsICg6LSkgYnVnIGZvciBkZWZsYXRlIHdpdGggZmx1c2ggKG91dHB1dCB3YXMgY29ycmVjdCBidXQKICBub3QgY29tcGxldGVseSBmbHVzaGVkIGluIHJhcmUgb2NjYXNpb25zKS4KLSBkZWZhdWx0IHdpbmRvdyBzaXplIGlzIHNhbWUgZm9yIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCiAgKGl0J3Mgbm93IHN1ZmZpY2llbnQgdG8gc2V0IE1BWF9XQklUUyBpbiB6Y29uZi5oKS4KLSB2b2lkcCAtPiB2b2lkcGYgYW5kIHZvaWRucCAtPiB2b2lkcCAoZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIKICB0eXBlZGVmcyBhbmQgYmVjYXVzZSB2b2lkbnAgd2FzIG5vdCBuZWFyIGluIGxhcmdlIG1vZGVsKS4KCkNoYW5nZXMgaW4gMC45NCAoMTMgQXVnIDk1KQotIHN1cHBvcnQgTVNET1MgbWVkaXVtIG1vZGVsCi0gZml4IGRlZmxhdGUgd2l0aCBmbHVzaCAoY291bGQgc29tZXRpbWVzIGdlbmVyYXRlIGJhZCBvdXRwdXQpCi0gZml4IGRlZmxhdGVSZXNldCAoemxpYiBoZWFkZXIgd2FzIGluY29ycmVjdGx5IHN1cHByZXNzZWQpCi0gYWRkZWQgc3VwcG9ydCBmb3IgVk1TCi0gYWxsb3cgYSBjb21wcmVzc2lvbiBsZXZlbCBpbiBnem9wZW4oKQotIGd6Zmx1c2ggbm93IGNhbGxzIGZmbHVzaAotIEZvciBkZWZsYXRlIHdpdGggZmx1c2gsIGZsdXNoIGV2ZW4gaWYgbm8gbW9yZSBpbnB1dCBpcyBwcm92aWRlZC4KLSByZW5hbWUgbGliZ3ouYSBhcyBsaWJ6LmEKLSBhdm9pZCBjb21wbGV4IGV4cHJlc3Npb24gaW4gaW5mY29kZXMuYyB0cmlnZ2VyaW5nIFR1cmJvIEMgYnVnCi0gd29yayBhcm91bmQgYSBwcm9ibGVtIHdpdGggZ2NjIG9uIEFscGhhIChpbiBJTlNFUlRfU1RSSU5HKQotIGRvbid0IHVzZSBpbmxpbmUgZnVuY3Rpb25zIChwcm9ibGVtIHdpdGggc29tZSBnY2MgdmVyc2lvbnMpCi0gYWxsb3cgcmVuYW1pbmcgb2YgQnl0ZSwgdUludCwgZXRjLi4uIHdpdGggI2RlZmluZS4KLSBhdm9pZCB3YXJuaW5nIGFib3V0ICh1bnVzZWQpIHBvaW50ZXIgYmVmb3JlIHN0YXJ0IG9mIGFycmF5IGluIGRlZmxhdGUuYwotIGF2b2lkIHZhcmlvdXMgd2FybmluZ3MgaW4gZ3ppby5jLCBleGFtcGxlLmMsIGluZmJsb2NrLmMsIGFkbGVyMzIuYywgenV0aWwuYwotIGF2b2lkIHJlc2VydmVkIHdvcmQgJ25ldycgaW4gdHJlZXMuYwoKQ2hhbmdlcyBpbiAwLjkzICgyNSBKdW5lIDk1KQotIHRlbXBvcmFyaWx5IGRpc2FibGUgaW5saW5lIGZ1bmN0aW9ucwotIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljCi0gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBQQVJUSUFMX0ZMVVNICi0gU2V0IGJpbmFyeSBtb2RlIGZvciBzdGRpbi9zdGRvdXQgaW4gbWluaWd6aXAuYyBmb3IgT1MvMgotIGRvbid0IGV2ZW4gdXNlIHNpZ25lZCBjaGFyIGluIGluZmxhdGUgKG5vdCBwb3J0YWJsZSBlbm91Z2gpCi0gZml4IGluZmxhdGUgbWVtb3J5IGxlYWsgZm9yIHNlZ21lbnRlZCBhcmNoaXRlY3R1cmVzCgpDaGFuZ2VzIGluIDAuOTIgKDMgTWF5IDk1KQotIGRvbid0IGFzc3VtZSB0aGF0IGNoYXIgaXMgc2lnbmVkIChwcm9ibGVtIG9uIFNHSSkKLSBDbGVhciBiaXQgYnVmZmVyIHdoZW4gc3RhcnRpbmcgYSBzdG9yZWQgYmxvY2sKLSBubyBtZW1jcHkgb24gUHlyYW1pZAotIHN1cHByZXNzZWQgaW5mdGVzdC5jCi0gb3B0aW1pemVkIGZpbGxfd2luZG93LCBwdXQgbG9uZ2VzdF9tYXRjaCBpbmxpbmUgZm9yIGdjYwotIG9wdGltaXplZCBpbmZsYXRlIG9uIHN0b3JlZCBibG9ja3MuCi0gdW50YWJpZnkgYWxsIHNvdXJjZXMgdG8gc2ltcGxpZnkgcGF0Y2hlcwoKQ2hhbmdlcyBpbiAwLjkxICgyIE1heSA5NSkKLSBEZWZhdWx0IE1FTV9MRVZFTCBpcyA4IChub3QgOSBmb3IgVW5peCkgYXMgZG9jdW1lbnRlZCBpbiB6bGliLmgKLSBEb2N1bWVudCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBpbiB6Y29uZi5oCi0gYWRkZWQgIm1ha2UgaW5zdGFsbCIKLSBmaXggc3luYyBzZWFyY2ggbG9naWMgaW4gaW5mbGF0ZVN5bmMKLSBkZWZsYXRlKFpfRlVMTF9GTFVTSCkgbm93IHdvcmtzIGV2ZW4gaWYgb3V0cHV0IGJ1ZmZlciB0b28gc2hvcnQKLSBhZnRlciBpbmZsYXRlU3luYywgZG9uJ3Qgc2NhcmUgcGVvcGxlIHdpdGgganVzdCAibG8gd29ybGQiCi0gYWRkZWQgc3VwcG9ydCBmb3IgREpHUFAKCkNoYW5nZXMgaW4gMC45ICgxIE1heSA5NSkKLSBkb24ndCBhc3N1bWUgdGhhdCB6YWxsb2MgY2xlYXJzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICh0aGUgVHVyYm9DIGJ1ZwogIHdhcyBNYXJrJ3MgYnVnIGFmdGVyIGFsbCA6KQotIGxldCBhZ2FpbiBnenJlYWQgY29weSB1bmNvbXByZXNzZWQgZGF0YSB1bmNoYW5nZWQgKHdhcyB3b3JraW5nIGluIDAuNzEpCi0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpLCBpbmZsYXRlUmVzZXQgYW5kIGluZmxhdGVTeW5jIGFyZSBub3cgZnVsbHkgaW1wbGVtZW50ZWQKLSBhZGRlZCBhIHRlc3Qgb2YgaW5mbGF0ZVN5bmMgaW4gZXhhbXBsZS5jCi0gbW92ZWQgTUFYX1dCSVRTIHRvIHpjb25mLmggYmVjYXVzZSB1c2VycyBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGF0LgotIGRvY3VtZW50IGV4cGxpY2l0bHkgdGhhdCB6YWxsb2MoNjRLKSBvbiBNU0RPUyBtdXN0IHJldHVybiBhIG5vcm1hbGl6ZWQKICBwb2ludGVyICh6ZXJvIG9mZnNldCkKLSBhZGRlZCBNYWtlZmlsZXMgZm9yIE1pY3Jvc29mdCBDLCBUdXJibyBDLCBCb3JsYW5kIEMrKwotIGZhc3RlciBjcmMzMigpCgpDaGFuZ2VzIGluIDAuOCAoMjkgQXByaWwgOTUpCi0gYWRkZWQgZmFzdCBpbmZsYXRlIChpbmZmYXN0LmMpCi0gZGVmbGF0ZShaX0ZJTklTSCkgbm93IHJldHVybnMgWl9TVFJFQU1fRU5EIHdoZW4gZG9uZS4gV2FybmluZzogdGhpcwogIGlzIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIHpsaWIgd2hpY2ggcmV0dXJuZWQgWl9PSy4KLSB3b3JrIGFyb3VuZCBhIFR1cmJvQyBjb21waWxlciBidWcgKGJhZCBjb2RlIGZvciBiIDw8IDAsIHNlZSBpbmZ1dGlsLmgpCiAgKGFjdHVhbGx5IHRoYXQgd2FzIG5vdCBhIGNvbXBpbGVyIGJ1Zywgc2VlIDAuODEgYWJvdmUpCi0gZ3pyZWFkIG5vIGxvbmdlciByZWFkcyBvbmUgZXh0cmEgYnl0ZSBpbiBjZXJ0YWluIGNhc2VzCi0gSW4gZ3ppbyBkZXN0cm95KCksIGRvbid0IHJlZmVyZW5jZSBhIGZyZWVkIHN0cnVjdHVyZQotIGF2b2lkIG1hbnkgd2FybmluZ3MgZm9yIE1TRE9TCi0gYXZvaWQgdGhlIEVSUk9SIHN5bWJvbCB3aGljaCBpcyB1c2VkIGJ5IE1TIFdpbmRvd3MKCkNoYW5nZXMgaW4gMC43MSAoMTQgQXByaWwgOTUpCi0gRml4ZWQgbW9yZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcyA6KCBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB3aXRoCiAgVHVyYm9DIGxhcmdlIG1vZGVsLgoKQ2hhbmdlcyBpbiAwLjcgKDE0IEFwcmlsIDk1KQotIEFkZGVkIGZ1bGwgaW5mbGF0ZSBzdXBwb3J0LgotIFNpbXBsaWZpZWQgdGhlIGNyYzMyKCkgaW50ZXJmYWNlLiBUaGUgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcKICAob25lJ3MgY29tcGxlbWVudCkgaXMgbm93IGRvbmUgaW5zaWRlIGNyYzMyKCkuIFdBUk5JTkc6IHRoaXMgaXMKICBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9uczsgc2VlIHpsaWIuaCBmb3IgdGhlIG5ldyB1c2FnZS4KCkNoYW5nZXMgaW4gMC42MSAoMTIgQXByaWwgOTUpCi0gd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gVHVyYm9DLiBleGFtcGxlIGFuZCBtaW5pZ3ppcCBub3cgd29yayBvbiBNU0RPUy4KCkNoYW5nZXMgaW4gMC42ICgxMSBBcHJpbCA5NSkKLSBhZGRlZCBtaW5pZ3ppcC5jCi0gYWRkZWQgZ3pkb3BlbiB0byByZW9wZW4gYSBmaWxlIGRlc2NyaXB0b3IgYXMgZ3pGaWxlCi0gYWRkZWQgdHJhbnNwYXJlbnQgcmVhZGluZyBvZiBub24tZ3ppcGVkIGZpbGVzIGluIGd6cmVhZC4KLSBmaXhlZCBidWcgaW4gZ3pyZWFkIChkb24ndCByZWFkIGNyYyBhcyBkYXRhKQotIGZpeGVkIGJ1ZyBpbiBkZXN0cm95IChnemlvLmMpIChkb24ndCByZXR1cm4gWl9TVFJFQU1fRU5EIGZvciBnemNsb3NlKS4KLSBkb24ndCBhbGxvY2F0ZSBiaWcgYXJyYXlzIGluIHRoZSBzdGFjayAoZm9yIE1TRE9TKQotIGZpeCBzb21lIE1TRE9TIGNvbXBpbGF0aW9uIHByb2JsZW1zCgpDaGFuZ2VzIGluIDAuNToKLSBkbyByZWFsIGNvbXByZXNzaW9uIGluIGRlZmxhdGUuYy4gWl9QQVJUSUFMX0ZMVVNIIGlzIHN1cHBvcnRlZCBidXQKICBub3QgeWV0IFpfRlVMTF9GTFVTSC4KLSBzdXBwb3J0IGRlY29tcHJlc3Npb24gYnV0IG9ubHkgaW4gYSBzaW5nbGUgc3RlcCAoZm9yY2VkIFpfRklOSVNIKQotIGFkZGVkIG9wYXF1ZSBvYmplY3QgZm9yIHphbGxvYyBhbmQgemZyZWUuCi0gYWRkZWQgZGVmbGF0ZVJlc2V0IGFuZCBpbmZsYXRlUmVzZXQKLSBhZGRlZCBhIHZhcmlhYmxlIHpsaWJfdmVyc2lvbiBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuCi0gcmVuYW1lZCB0aGUgJ2ZpbHRlcicgcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0MiBhcyAnc3RyYXRlZ3knLgogIEFkZGVkIFpfRklMVEVSRUQgYW5kIFpfSFVGRk1BTl9PTkxZIGNvbnN0YW50cy4KCkNoYW5nZXMgaW4gMC40OgotIGF2b2lkICJ6aXAiIGV2ZXJ5d2hlcmUsIHVzZSB6bGliIGluc3RlYWQgb2YgemlwbGliLgotIHN1cHByZXNzIFpfQkxPQ0tfRkxVU0gsIGludGVycHJldCBaX1BBUlRJQUxfRkxVU0ggYXMgYmxvY2sgZmx1c2gKICBpZiBjb21wcmVzc2lvbiBtZXRob2QgPT0gOC4KLSBhZGRlZCBhZGxlcjMyIGFuZCBjcmMzMgotIHJlbmFtZWQgZGVmbGF0ZU9wdGlvbnMgYXMgZGVmbGF0ZUluaXQyLCBjYWxsIG9uZSBvciB0aGUgb3RoZXIgYnV0IG5vdCBib3RoCi0gYWRkZWQgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0Mi4KLSBhZGRlZCBpbmZsYXRlSW5pdDIKLSBzaW1wbGllZCBjb25zaWRlcmFibHkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGJ5IG5vdCBzdXBwb3J0aW5nCiAgdXNlci1wcm92aWRlZCBoaXN0b3J5IGJ1ZmZlci4gVGhpcyBpcyBzdXBwb3J0ZWQgb25seSBpbiBkZWZsYXRlSW5pdDIKICBhbmQgaW5mbGF0ZUluaXQyLgoKQ2hhbmdlcyBpbiAwLjM6Ci0gcHJlZml4IGFsbCBtYWNybyBuYW1lcyB3aXRoIFpfCi0gdXNlIFpfRklOSVNIIGluc3RlYWQgb2YgZGVmbGF0ZUVuZCB0byBmaW5pc2ggY29tcHJlc3Npb24uCi0gYWRkZWQgWl9IVUZGTUFOX09OTFkKLSBhZGRlZCBnemVycm9yKCkK