ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpWZXJzaW9uIDcuMS4xCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAwKQotIEdvdCBtb3JlIHBlb3BsZSBpbnZvbHZlZCBpbiB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgbWVzcy4gQ2FvbGFuIE1jTmFtYXJhIHNlbnQKICBtZSBjb25maWd1cmUtY29kZSB0aGF0IHR1cm5lZCBvdXQgdG8gYmUgdmVyeSBzaW1pbGFyIHRvIG15IGV4aXN0aW5nIHRlc3RzCiAgd2hpY2ggb25seSBtYWtlIG1lIG1vcmUgc3VyZSBJJ20gb24gdGhlIHJpZ2h0IHBhdGguIEkgY2hhbmdlZCB0aGUgb3JkZXIgb2YKICB0aGUgdGVzdHMgc2xpZ2h0bHksIGFzIGl0IHNlZW1zIHRoYXQgc29tZSBjb21waWxlcnMgZG9uJ3QgeWVsbCBlcnJvciBpZiBhCiAgZnVuY3Rpb24gaXMgdXNlZCB3aXRoIHRvbyBtYW55IHBhcmFtZXRlcnMuIFRodXMsIHRoZSBmaXJzdCB0ZXN0ZWQgZnVuY3Rpb24KICB3aWxsIHNlZW0gb2suLi4gTGV0J3MgaG9wZSBtb3JlIGNvbXBpbGVycyB0aGluayBvZiB0b28tZmV3IHBhcmFtZXRlcnMgYXMgYmFkCiAgbWFubmVycywgYXMgd2UncmUgbm93IHRyeWluZyB0aGUgZnVuY3Rpb25zIGluIHRoYXQgb3JkZXI7IGZld2VyIGZpcnN0LiBJCiAgc2hvdWxkIGFsc28gYWRkIHRoYXQgTGFycyBIZWNraW5nIG1haWxlZCBtZSBhbmQgdm9sdW50ZWVyZWQgdG8gcnVuIHRlc3RzIG9uCiAgYSBmZXcgb2RkIHN5c3RlbXMuIENvYWxhbiBpcyBrZWVwaW5nIGhpcyB3b3JrIG92ZXIgYXQKICBodHRwOi8vd3d3LmNzbi51bC5pZS9+Y2FvbGFuL3B1YmxpbmsvZ2V0aG9zdGJ5bmFtZV9yLy4gTWlnaHQgYmUgaGFuZHkgaW4gdGhlCiAgZnV0dXJlIGFzIHdlbGwuCgpEYW5pZWwgKDE4IEF1Z3VzdCAyMDAwKQotIEkgbm90aWNlZCBJIGhhZG4ndCBpbmNyZWFzZWQgdGhlIG5hbWUgbG9va3VwIGJ1ZmZlciBpbiBsaWIvZnRwLmMuIEkgZG9uJ3QKICB0aGluayB0aGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSBjb250aW51ZWQgdHJvdWJsZSB0aG91Z2guCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDAwKQotIEZyZWQgTm96IGNvcnJlY3RlZCBteSBzdHVwaWQgbWlzdGFrZXMgaW4gdGhlIGdldGhvc3RieW5hbWVfcigpIGZsdWZmLiBJdAogIHNob3VsZCBhZmZlY3Qgc29tZSBBSVgsIERpZ2l0YWwgVW5peCBhbmQgSFBVWCAxMCBzeXN0ZW1zLgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwMCkKLSBNYXRoaWV1IExlZ2FyZSBjb21waWxlZCBhbmQgYnVpbGQgNy4xIHdpdGhvdXQgZXJyb3JzIG9uIGJvdGggQUlYIDQuMiBhcyB3ZWxsCiAgYXMgQUlYIDQuMy4gTm93IHdoeSBkaWQgcHJvYmxlbXMgb2NjdXIgYmVmb3JlPwoKLSBGcmVkIE5veiByZXBvcnRlZCBhIC13Ly0td3JpdGUtb3V0IGJ1ZyB0aGF0IGNhdXNlZCBpdCB0byBtYWxmdW5jdGlvbiB3aGVuCiAgdXNlZCBjb21iaW5lZCB3aXRoIG11bHRpcGxlIFVSTCByZXRyaWV2YWxlcy4gQWxsIGJ1dCB0aGUgZmlyc3QgZGlzcGxheSBnb3QKICBzY3Jld2VkIHVwIQoKRGFuaWVsICgxMSBBdWd1c3QgMjAwMCkKLSBKYXNvbiBQcmllYmUgYW5kIGFuIGFub255bW91cyBmcmllbmQgZm91bmQgc29tZSBob3N0IG5hbWVzIHRoZSBMaW51eCB2ZXJzaW9uCiAgb2YgY3VybCBjb3VsZCBub3QgcmVzb2x2ZS4gSXQgdHVybmVkIG91dCB0aGUgYnVmZmVyIHVzZWQgdG8gcmV0cmlldmUgdGhhdAogIGluZm9ybWF0aW9uIHdhcyB0b28gc21hbGwuIEZpeGVkLiBPbmUgY291bGQgYXJndWUgYWJvdXQgdGhlIHVzZWZ1bG5lc3Mgb2YKICBub3QgaGF2aW5nIHRoZSBzbGlnaHRlc3QgdHJhY2Ugb2YgYSBtYW4gcGFnZSBmb3IgZ2V0aG9zdGJ5bmFtZV9yKCkgb24gbXkKICBMaW51eCBSZWRoYXQgaW5zdGFsbGF0aW9uLi4uCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDAwKQotIEJhbGFqaSBTIFJhbyB3YXMgZmlyc3QgaW4gbGluZSB0byBub3RlIHRoZSBtaXNzaW5nIHBvc3NpYmlsaXR5IHRvIHJlcGxhY2UKICB0aGUgQ29udGVudC1UeXBlOiBhbmQgQ29udGVudC1MZW5ndGg6IGhlYWRlcnMgd2hlbiBkb2luZyAtZCBwb3N0cy4gSSBhZGRlZAogIHRoZSBwb3NzaWJpbGl0eSBqdXN0IG5vdy4gSXQgc2VlbXMgc29tZSBwZW9wbGUgd2FudHMgdG8gZG8gc3RhbmRhcmQgcG9zdHMKICB1c2luZyBjdXN0b20gQ29udGVudC1UeXBlcy4KCkRhbmllbCAoOCBBdWd1c3QgMjAwMCkKLSBNaWtlIERvd2VsbCBjb3JyZWN0bHkgZGlzY292ZXJlZCB0aGF0IGN1cmwgZGlkIG5vdCBhcHByb3ZlIG9mIFVSTHMgd2l0aCBubwogIHVzZXIgbmFtZSBidXQgcGFzc3dvcmQuIEFzIGluICdodHRwOi8vOmZvb0BoYXh4LnNlJy4gSSBjb3JyZWN0ZWQgdGhpcy4KClZlcnNpb24gNy4xCgpEYW5pZWwgKDcgQXVndXN0IDIwMDApCi0gTXkgQUlYIDQgZml4IGRvZXMgbm90IHdvcmsuIEkgbmVlZCBoZWxwIGZyb20gYSBBSVggNCBoYWNrZXIuCgotIEkgYWRkZWQgbXkgbmV3IGRvY3VtZW50IGluIHRoZSBkb2NzIGRpcmVjdG9yeS4gSXQgaXMgYWltZWQgdG8gYmVjb21lIGEgc29ydAogIG9mIHR1dG9yaWFsIG9uIGhvdyB0byBkbyBIVFRQIHNjcmlwdGluZyB3aXRoIGN1cmwuCgpEYW5pZWwgKDQgQXVndXN0IDIwMDApCi0gV29ya2luZyB3aXRoIFJpY2ggR3JheSBvbiBjb21waWxpbmcgY3VybCBmb3IgbG90cyBvZiBkaWZmZXJlbnQgcGxhdGZvcm1zLgogIE15IGZpeCBmb3IgQUlYIDMuMiB3YXMgbm90IGdvb2QgZW5vdWdoIGFuZCB3YXMgc2xpZ2h0bHkgY2hhbmdlZCwgSSBoYWQgdG8KICBtb3ZlIGFuIGluY2x1ZGUgZmlsZSBiZWZvcmUgYW5vdGhlciwgYXMgaXMgbm93IGRlc2NyaWJlZCBpbiB0aGUgc291cmNlLgoKICBBSVggNC4yICg0Llg/KSBoYXMgZGlmZmVyZW50IGdldGhvc3RieW5hbWVfcigpIGFuZCBnZXRob3N0YnlhZGRyX3IoKQogIGZ1bmN0aW9ucyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGRpZG4ndCBjaGVjayBmb3IgYW5kIHRodXMgdGhlIGNvbXBpbGUKICBicm9rZSB3aXRoIGFuIGVycm9yLiBJIGhhdmUgbm93IGNoYW5nZWQgdGhlIGdldGhvc3RieW5hbWVfcigpIGNoZWNrIGluIHRoZQogIGNvbmZpZ3VyZSBmaWxlIHRvIHN1cHBvcnQgYWxsIHRocmVlIHZlcnNpb25zIG9mIGJvdGggdGhlc2UgZnVuY3Rpb25zLiBNeQogIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGUgQUlYLXN0eWxlIGlzIHRob3VnaCBub3QgeWV0IHZlcmlmaWVkIGFuZCBJIG1heQogIGdldCBwcm9ibGVtcyB0byBmaXggaXQgaWYgaXQgdHVybnMgb3V0IHRvIGJ1ZyBzaW5jZSBJIGRvbid0IGhhdmUgYWNjZXNzIHRvCiAgYW55IHN5c3RlbSB1c2luZyB0aGF0LgoKICBGb3IgcHJvYmxlbXMgbGlrZSB0aGF0LCBJIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYWxsb3cgLS1kaXNhYmxlLXRocmVhZAogIHRvIGNvbXBsZXRlbHkgc3dpdGNoIG9mZiB0aGUgY2hlY2sgZm9yIHRocmVhZHNhZmUgdmVyc2lvbnMgb2YgYSBmZXcKICBmdW5jdGlvbnMgYW5kIHRodXMgZ28gd2l0aCB0aGUgImdvb2Qgb2xkIHZlcnNpb25zIiB0aGF0IHRlbmQgdG8gd29yawogIGFsdGhvdWdoIHdpbGwgYnJlYWsgdGhyZWFkLXNhZmVuZXNzIGZvciBsaWJjdXJsLiBNb3N0IHBlb3BsZSB3b24ndCB1c2UKICBsaWJjdXJsIGZvciBvdGhlciB0aGluZ3MgdGhhbiBjdXJsIHRob3VnaCwgYW5kIGN1cmwgZG9lc24ndCBuZWVkIGEKICB0aHJlYWQtc2FmZSBsaWIuCgotIFdvcmtpbmcgb24gbXkgYmlnIHR1dG9yaWFsIGFib3V0IEhUVFAgc2NyaXB0aW5nIHdpdGggY3VybC4KCkRhbmllbCAoMSBBdWd1c3QgMjAwMCkKLSBSaWNoIEdyYXkgc3BvdHRlZCBhIHByb2JsZW0gaW4gc3JjL3NldHVwLmggY2F1c2VkIGJ5IGEgI2RlZmluZSBzdHJlcXVhbCgpCiAgdGhhdCB3YXMganVzdCBhIGxlZnQtb3ZlciBmcm9tIHBhc3NlZCB0aW1lcy4gVGhlIHN0cmVxdWFsKCkgaXMgbm93IGEgdHJ1ZQogIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IGxpYmN1cmwgZm9yIGEgcG9ydGFibGUgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcKICBjb21wYXJpc29uLiBJIGFkZGVkIHRoZSBwcm90b3R5cGVzIGluIGluY2x1ZGUvY3VybC5oIGFuZCByZW1vdmVkIHRoZQogIG5vdyBvYnNvbGV0ZSAjZGVmaW5lLgoKLSBJZ29yIEtocmlzdG9waG9yb3YgbWFkZSBhIGZpeCB0byBhbGxvdyByZXN1bWVkIGRvd25sb2FkIGZyb20gU3VuJ3MKICBKYXZhV2ViU2VydmVyLzEuMS4xLiBJdCBzZWVtcyB0aGF0IHRoZWlyIHNlcnZlciBzZW5kcyBiYWQgQ29udGVudC1SYW5nZQogIGhlYWRlcnMuCgotIFRoZSBtYWtlZmlsZXMgZm9yY2VkIGEgc3RhdGljIGxpYnJhcnkgYnVpbGQsIHdoaWNoIGlzIGJhZCBzaW5jZSB3ZSBub3cgdXNlCiAgbGlidG9vbCBhbmQgdGh1cyBoYXZlIGV4Y2VsbGVudCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0ISBBbGJlcnQgQ2hpbi1BLVlvdW5nCiAgZm91bmQgb3V0LgoKVmVyc2lvbiA3LjAuMTFiZXRhCgpEYW5pZWwgKDEgQXVndXN0IDIwMDApCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBwb2ludGVkIG91dCB0aGF0ICdtYWtlIGluc3RhbGwnIGRpZCBub3QgcHJvcGVybHkgY3JlYXRlCiAgdGhlIGhlYWRlciBpbmNsdWRlIGRpcmVjdG9yeSwgd2h5IGl0IGZhaWxlZCB0byBpbnN0YWxsIHRoZSBoZWFkZXIgZmlsZXMgYXMKICBpdCBzaG91bGQuIEF1dG9tYWtlIGlzbid0IHJlYWxseSBlcXVpcHBlZCB0byBkZWFsIHdpdGggc3ViZGlyZWN0b3JpZXMKICB3aXRob3V0IE1ha2VmaWxlcyBpbiBhbnkgbmljZSB3YXkuIEkgaGFkIHRvIHJ1biBhaGVhZCBhbmQgYWRkIE1ha2VmaWxlcyBpbgogIGJvdGggaW5jbHVkZSBhbmQgaW5jbHVkZS9jdXJsIGJlZm9yZSBJIG1hbmFnZWQgdG8gY3JlYXRlIGEgdG9wLWxldmVsCiAgbWFrZWZpbGUgdGhhdCBzdWNjZWVkcyBpbiBpbnN0YWxsIGV2ZXJ5dGhpbmcgcHJvcGVybHkhCgotIE9rLCBubyBtb3JlICJmZWF0dXJlcyIgYWRkZWQgbm93LiBMZXQncyBqdXN0IHZlcmlmeSB0aGF0IHRoZXJlJ3Mgbm8gbWFqb3IKICBmbGF3cyBhZGRlZCBub3cuCgpEYW5pZWwgKDMxIEp1bHkgMjAwMCkKLSBCb3RoIEplZmYgU2NoYXNueSBhbmQgS2V0aWwgRnJveW4gYXNrZWQgbWUgaG93IHRvIHRlbGwgY3VybCBub3QgdG8gc2VuZCBvbmUKICBvZiB0aG9zZSBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXJzLiBUaGV5IGRpZG4ndCBzZXR0bGUgd2l0aCB0aGUgYmxhbmsKICBvbmVzIHlvdSBjb3VsZCB0ZWxsIGN1cmwgdG8gdXNlLiBJIHJld3JvdGUgdGhlIGhlYWRlci1yZXBsYWNlIHN0dWZmIGEKICBsaXR0bGUuIE5vdywgaWYgeW91IHJlcGxhY2UgYW4gaW50ZXJuYWwgaGVhZGVyIHdpdGggeW91ciBvd24gYW5kIHRoYXQgbmV3CiAgb25lIGlzIGEgYmxhbmsgaGVhZGVyIHlvdSB3aWxsIG9ubHkgcmVtb3ZlIHRoZSBpbnRlcm5hbCBvbmUgYW5kIG5vdCBnZXQgYW55CiAgYmxhbmsuIEkgY291bGRuJ3QgZmlndXJlIG91dCBhbnkgY2FzZSB3aGVuIHlvdSB3YW50IHRoYXQgYmxhbmsgaGVhZGVyLgoKRGFuaWVsICgyOSBKdWx5IDIwMDApCi0gSXQgc3RydWNrIG1lIHRoYXQgdGhlIGxpYiB1c2VkIGxvY2FsdGltZSgpIHdoaWNoIGlzIG5vdCB0aHJlYWQtc2FmZSwgc28gbm93CiAgSSB1c2UgbG9jYWx0aW1lX3IoKSBpbiB0aGUgc3lzdGVtcyB0aGF0IGhhcyBpdC4KCi0gSSB3ZW50IHRocm91Z2ggdGhpcyBlbnRpcmUgZG9jdW1lbnQgYW5kIHJlbW92ZWQgYWxsIGVtYWlsIGFkZHJlc3NlcyBhbmQgbGVmdAogIG5hbWVzIG9ubHkuIEkndmUgcmVhbGx5IG1hZGUgYW4gZWZmb3J0IHRvIGFsd2F5cyBub3RlIHdobyBicm91Z2h0IGJlIGJ1ZwogIHJlcG9ydHMgb3IgZml4ZXMsIGJ1dCBtb3JlIGFuZCBtb3JlIHBlb3BsZSBhc2sgbWUgdG8gcmVtb3ZlIHRoZSBlbWFpbAogIGFkZHJlc3NlcyBzaW5jZSB0aGV5IGJlY29tZSB2aWN0aW1zIGZvciBzcGFtcyB0aGlzIHdheS4gR29yZG9uIEJlYXRvbiBnb3QgbWUKICB3b3JraW5nIG9uIHRoaXMuCgpEYW5pZWwgKDI3IEp1bHkgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGZvdW5kIG91dCB0aGF0IHdoZW4geW91IHNwZWNpZmllZCBhIEhUVFAgcHJveHkgaW4gYW4KICBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgdXNlZCAtTCwgY3VybCBmYWlsZWQgaW4gdGhlIHNlY29uZCBmZXRjaC4gSQogIGNvcnJlY3RlZCB0aGlzIHByb2JsZW0gYW5kIHBvc3RlZCBhIHBhdGNoIHRvIHRoZSBsaXN0LiBObyBuZWVkIGZvciBhbiBleHRyYQogIGJldGEgcmVsZWFzZSBqdXN0IGZvciB0aGlzLgoKVmVyc2lvbiA3LjAuMTBiZXRhCgpEYW5pZWwgKDI3IEp1bHkgMjAwMCkKLSBTbywgbGlidG9vbCByZXBsYWNlZCB0d28gb2YgbXkgZmlsZXMgd2l0aCBzeW1ib2xpYyBsaW5rcyBhbmQgSSBmb3Jnb3QgdG8gYWRkCiAgdGhlIHR3byBuZXcgbGlidG9vbCBmaWxlcyB0byB0aGUgcmVsZWFzZSBhcmNoaXZlIChhbmQgdGhleSB3ZXJlIGFkZGVkIGFzCiAgc3ltbGlua3MgYXMgd2VsbCEpIFRoaXMgb2YgY291cnNlIGxlYWQgdG8gdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBmYWlsZWQKICBvbiA3LjAuOS4uLgoKVmVyc2lvbiA3LjAuOWJldGEKCkRhbmllbCAoMjUgSnVseSAyMDAwKQotIEtyaXN0aWFuIEv2aG50b3BwIDxrcmlzIGF0IGtvZWhudG9wcC5kZT4gYnJvdWdodCBhIGZpeCB0aGF0IG1ha2VzIGxpYmN1cmwKICBsaWJ0b29saWZpZWQsIGp1c3QgYXMgd2UndmUgd2FudGVkIGZvciBhIHdoaWxlIG5vdy4gSGUgYWxzbyBtYWRlIHRoZQogIHJlY2VudGx5IGFkZGVkIG1hbiBwYWdlcyBnZXQgaW5zdGFsbGVkIHByb3Blcmx5IG9uICdtYWtlIGluc3RhbGwnIGFuZCBzb21lCiAgb3RoZXIgbmljZSBjbGVhbnVwcy4KCi0gSW4gYSBkaXNjdXNzaW9uIHdpdGggRWV0dSBPamFuZW4gaXQgc3RydWNrIG1lIHRoYXQgaWYgd2UgdXNlIGN1cmwgdG8gZ2V0IGEKICBwYWdlIHVzaW5nIGEgcGFzc3dvcmQsIGFuZCB0aGF0IHBhZ2UgdGhlbiBzZW5kcyBhIExvY2F0aW9uOiB0byBhbm90aGVyCiAgc2VydmVyIHRoYXQgY3VybCBmb2xsb3dzLCBjdXJsIHdpbGwgc2VuZCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGF0CiAgc2VydmVyIGFzIHdlbGwuCgogIE5vdywgSSdsbCBuZXZlciBiZSBhYmxlIHRvIG1ha2UgY3VybCBkbyBMb2NhdGlvbjogZm9sbG93aW5nIGFsbCB0aGF0IHBlcmZlY3QKICBhbmQgeW91J3JlIGFsbCBzb29uZXIgb3IgbGF0ZXIgcmVxdWlyZWQgdG8gd3JpdGUgYSBzY3JpcHQgdG8gZG8gc2V2ZXJhbAogIGZldGNoZXMgd2hlbiB5b3UncmUgZG9pbmcgYWR2YW5jZWQgc3R1ZmYsIGJ1dCBub3cgSSd2ZSBtb2RpZmllZCBjdXJsIHRvIGF0CiAgbGVhc3QgKm9ubHkqIHNlbmQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIG9yaWdpbmFsIHNlcnZlci4gV2hpY2gKICBtZWFucyB0aGF0IGlmIGdldCBhIHBhZ2UgZnJvbSBzZXJ2ZXIgQSB3aXRoIGEgcGFzc3dvcmQsIHRoYXQgZm9yd2FyZHMgY3VybAogIHRvIHNlcnZlciBCLCBjdXJsIHdvbid0IHVzZSB0aGUgcGFzc3dvcmQgdGhlcmUuIElmIHNlcnZlciBCIHRoZW4gZm9yd2FyZHMKICBjdXJsIGJhY2sgdG8gc2VydmVyIEEgYWdhaW4sIHRoZSBwYXNzd29yZCB3aWxsIGJlIHVzZWQgYWdhaW4uCgogIFRoaXMgaXMgbm90IGEgcGVyZmVjdCBpbXBsZW1lbnRhdGlvbiwgYXMgaW4gYSBicm93c2VyIGNhc2UgaXQgd291bGQgb25seSB1c2UKICB0aGUgcGFzc3dvcmQgaWYgdGhlIGxlZnQtcHJlZml4IG9mIHRoZSBmaXJzdCBwYXRoIGlzIHRoZSBzYW1lLiBJIGp1c3QgdGhpbmsKICB0aGF0IHRoaXMgZml4IHByZXZlbnRzIGEgc29tZXdoYXQgbHVya3kgInNlY3VyaXR5IGhvbGUiLgoKICBBcyBhIHNpZGUtbm90ZSBpbiB0aGlzIHN1YmplY3Q6IEhUVFAgcGFzc3dvcmRzIGFyZSBzZW50IGluIGNsZWFydGV4dCBhbmQKICB3aWxsIG5ldmVyIGJlIGNvbnNpZGVyZWQgdG8gYmUgc2FmZSBvciBzZWN1cmUuIFVzZSBIVFRQUyBmb3IgdGhhdC4KCi0gQXMgZGlzY3Vzc2VkIG9uIHRoZSBtYWlsaW5nIGxpc3QsIEkgY29udmVydGVkIHRoZSBGVFAgcmVzcG9uc2UgcmVhZGluZwogIGZ1bmN0aW9uIGludG8gdXNpbmcgc2VsZWN0KCkgd2hpY2ggdGhlbiBhbGxvd3MgdGltZW91dHMgKGV2ZW4gdW5kZXIgd2luMzIhKQogIGlmIHRoZSBjb21tYW5kLXJlcGx5IHNlc3Npb24gZ2V0cyB0b28gc2xvdyBvciBkaWVzIGNvbXBsZXRlbHkuIEkgbWFkZSBhCiAgZGVmYXVsdCB0aW1lb3V0IG9uIDM2MDAgc2Vjb25kcyB1bmxlc3MgYW55dGhpbmcgZWxzZSBpcyBzcGVjaWZpZWQsIHNpbmNlIEkKICBkb24ndCB0aGluayBhbnlvbmUgd2FudHMgdG8gd2FpdCBtb3JlIHRoYW4gdGhhdCBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyIHRvCiAgZ2V0IHJlY2VpdmVkLi4uCgotIFRvcnN0ZW4gRm9lcnRzY2ggPHRvcnN0ZW4uZm9lcnRzY2ggYXQgZ214Lm5ldD4gYnJvdWdodCBhIHNldCBvZiBmaXhlcyBmb3IKICB0aGUgcmZjMTg2NyBmb3JtIHBvc3RzLiBIZSBpbnRyb2R1Y2VkICduYW1lPTxmaWxlJyB3aGljaCBicmluZ3MgYSBtZWFucyB0bwogIHN1dXBseSB2ZXJ5IGxhcmdlIHRleHQgY2h1bmtzIHJlYWQgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBuYW1lLiBJdCBkaWZmZXJzIGZyb20KICAnbmFtZT1AZmlsZScgaW4gdGhlIHdheSB0aGF0IHRoaXMgbGF0dGVyIHRoaW5nIGlzIG1hcmtlZCBpbiB0aGUgdXBsb2FkZWQKICBjb250ZW50cyBhcyBhIGZpbGUgdXBsb2FkLCB3aGlsZSB0aGUgZmlyc3QgaXMganVzdCB0ZXh0IChhcyBpbiBhIGlucHV0IG9yCiAgdGV4dGFyZWEgZmllbGQpLiBUb3JzdGVuIGFsc28gY29ycmVjdGVkIGEgYnVnIHRoYXQgd291bGQgaGFwcGVuIGlmIHlvdSB1c2VkCiAgJXMgb3Igc2ltaWxhciBpbiBhIC1GIGZpbGUgbmFtZS4KCi0gQXMgZGlzY292ZXJlZCBieSBOaWNvIEJhZ2d1cyA8Tmljby5CYWdndXMgYXQgbWFpbC5pbmcubmw+LCB3aGVuIHRyYW5zZmVycmluZwogIGZpbGVzIHRvL2Zyb20gRlRQIHVzaW5nIHR5cGUgQVNDSUkgY3VybCBzaG91bGQgbm90IGV4cGVjdCB0aGUgdHJhbnNmZXIgdG8gYmUKICB0aGUgZXhhY3Qgc2l6ZSByZXBvcnRlZCBieSB0aGUgc2VydmVyIGFzIHRoZSBmaWxlIHNpemUuIFNpbmNlIEFTQ0lJIG1heSB2ZXJ5CiAgd2VsbCBtZWFuIHRoYXQgdGhlIGNvbnRlbnQgaXMgdHJhbnNsYXRlZCB3aGlsZSB0cmFuc2ZlcmVkLCB0aGUgZmluYWwgc2l6ZQogIG1heSB2ZXJ5IHdlbGwgZGlmZmVyLiBUaGVyZWZvciwgY3VybCBub3cgaWdub3JlcyB0aGUgZmlsZSBzaXplIHdoZW4gZG9pbmcKICBBU0NJSSB0cmFuc2ZlcnMgaW4gRlRQLgoKRGFuaWVsICgyNCBKdWx5IDIwMDApCi0gQWRkZWQgQ1VSTE9QVF9QUk9YWVBPUlQgdG8gdGhlIGN1cmxfZWFzeV9zZXRvcHQoKSBjYWxsIHRvIGFsbG93IHRoZSBwcm94eQogIHBvcnQgbnVtYmVyIHRvIGJlIHNldCBzZXBhcmF0ZWx5IGZyb20gdGhlIHByb3h5IGhvc3QgbmFtZS4KCi0gQW5kcmV3IDxhbmRyZXcgYXQgdWdoLm5ldC5hdT4gcG9pbnRlZCBvdXQgYSBuZXRyYyBtYW51YWwgYnVnLgoKLSBUaGUgRlRQIHRyYW5zZmVyIGNvZGUgbm93IGFjY2VwdHMgYSAyNTAtY29kZSBhcyB3ZWxsIGFzIHRoZSBwcmV2aW91c2x5CiAgYWNjZXB0ZWQgMjI2LCBhZnRlciBhIHN1Y2Nlc3NmdWwgZmlsZSB0cmFuc2Zlci4gTW9oYW4gPG1uYWlyIGF0CiAgZXZlcmdyZWVuLWZ1bmRzLmNvbT4gcG9pbnRlZCB0aGlzIG91dC4KCi0gVGhlIGNoZWNrIGZvciAqYm90aCogbnNsIGFuZCBzb2NrZXQgd2FzIG5ldmVyIGFkZGVkIGluIHRoZSB2NyBjb25maWd1cmUuaW4KICB3aGVuIEkgbW92ZWQgdGhlIG1haW4gYnJhbmNoLiBJIHJlLWFkZGVkIHRoYXQgY2hlY2sgdG8gY29uZmlndXJlLmluLiBUaGlzIHdhcwogIGRpc2NvdmVyZWQgYnkgUmljaCBHcmF5LgoKLSBIb3dhcmQsIEJsYWlzZSA8QmxhaXNlLkhvd2FyZCBhdCBmYWN0aXZhLmNvbT4gcG9pbnRlZCBvdXQgYSBtaXNzaW5nIGZyZWUoKSBpbgogIGN1cmxfZGlzY29ubmVjdCgpIHdoaWNoIG9mIGNvdXJzZSBtZWFudCBsaWJjdXJsIGF0ZSBtZW1vcnkuCgotIEJyaWFuIEUuIEdhbGxldyBub3RlZCB0aGF0IHRoZSBIVFRQICdIb3N0OicgaGVhZGVyIGN1cmwgc2VudCBkaWQgbm90CiAgcHJvcGVybHkgaW5jbHVkZSB0aGUgcG9ydCBudW1iZXIgaWYgbm9uLWRlZmF1bHQgcG9ydHMgd2VyZSB1c2VkLiBUaGlzIHNob3VsZAogIG5vdyBoYXZlIGJlZW4gZml4ZWQuCgotIEhUVFAgY29ubmVjdCBlcnJvcnMgbm93IHJldHVybiBlcnJvcnMgZWFybGllci4gVGhpcyB3YXMgbW9zdCBub3RhYmx5IGNhdXNpbmcKICBwcm9ibGVtcyB3aGVuIHRoZSBIVFRQUyBjZXJ0aWZpY2F0ZSBoYWQgcHJvYmxlbXMgYW5kIGxhdGVyIGNhdXNlZCBhIGNyYXNoLgogIE1hbnkgdGhhbmtzIHRvIEdyZWdvcnkgTmljaG9sbHMgPGduaWNob2xscyBhdCBsZXZlbDguY29tPiBmb3IgZGlzY292ZXJpbmcKICBhbmQgc3VnZ2VzdGluZyBhIGZpeC4uLgoKRGFuaWVsICgyMSBKdW5lIDIwMDApCi0gQWZ0ZXIgYSAiYnVnIHJlcG9ydCIgSSByZWNlaXZlZCB3aGVyZSB0aGUgdXNlciB3YXMgdXNpbmcgYm90aCAtRiBhbmQgLUkgaW4gYQogIEhUVFAgcmVxdWVzdCAoaXQgc2V2ZXJseSBjb25mdXNlZCB0aGUgbGlicmFyeSBJIHNob3VsZCBhZGQpLCBJIGFkZGVkIHNvbWUKICBjaGVja3MgdG8gc3JjL21haW4uYyB0aGF0IHByZXZlbnRzIHNldHRpbmcgbW9yZSB0aGFuIG9uZSBIVFRQIHJlcXVlc3QKICBjb21tYW5kLCBubyBtYXR0ZXIgd2hhdCB0aGUgdXNlciB3YW50cyEgOy0pCgpWZXJzaW9uIDcuMC44YmV0YQoKRGFuaWVsICgyMCBKdW5lIDIwMDApCi0gSSBkaWQgYSBtYWpvciByZXBsYWNlIGluIG1hbnkgZmlsZXMgdG8gdXNlIHRoZSBuZXcgY3VybCBkb21haW4gaGF4eC5zZQogIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIG9uZS4KCi0gQXMgRWV0dSBPamFuZW4gc3VnZ2VzdGVkLCBJIGZpbmFsbHkgdG9vayB0aGUgc3RlcCBhbmQgbm93IGxpYmN1cmwgbm8gbG9uZ2VyCiAgbWFrZXMgYSBQT1NUIGFmdGVyIGl0IGhhcyBmb2xsb3dlZCBhIGxvY2F0aW9uLiBXaGVuIHRoZSBpbml0aWFsIFBPU1QgaGFzCiAgYmVlbiBkb25lLCBpdCdsbCB0dXJuZWQgaW50byBhIEdFVCBmb3IgdGhlIGZ1cnRoZXIgcmVxdWVzdHMuIFRoaXMgaXMgb25seQogIGludGVyZXN0aW5nIHdoZW4gdXNpbmcgLUwvLS1sb2NhdGlvbiAqYW5kKiBkb2luZyBhIFBPU1QgYXQgdGhlIHNhbWUgdGltZS4KCiAgV2hpbGUgbWVzc2luZyB3aXRoIHRoaXMsIEkgYWRkZWQgYW5vdGhlciB3ZWlyZCBmZWF0dXJlIEkgY2FsbCAnYXV0bwogIHJlZmVyZXInLiBJZiB5b3UgYXBwZW5kICc7YXV0bycgdG8gdGhlIHJpZ2h0IG9mIGEgZ2l2ZW4gcmVmZXJlciBzdHJpbmcgKG9yCiAgb25seSB1c2UgdGhhdCBzdHJpbmcgYXMgcmVmZXJlciksIGxpYmN1cmwgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUKICBwcmV2aW91ZCBVUkwgYXMgcmVmZXJlZCB3aGVuIGl0IGZvbGxvd3MgYSBMb2NhdGlvbjogYW5kIGdldHMgYSBzdWNjZWVkaW5nCiAgZG9jdW1lbnQuCgotIE15IGhlcm8gUmljaCBHcmF5IGZvdW5kIHRoZSB2ZXJ5IG9ic2N1cmUgRlRQIGJ1ZyB0aGF0IGhhcHBlbmVkIHRvIGhpbSBvbmx5CiAgd2hlbiBwYXNzaW5nIHRocm91Z2ggYSBwYXJ0aWN1bGFyIGZpcmV3YWxsIGFuZCB1c2luZyB0aGUgUE9SVCBjb21tYW5kLiBJdAogIHR1cm5lZCBvdXQgdGhhdCBQT1JUIHdhcyB0aGUgb25seSBjb21tYW5kIGluIHRoZSBsaWIvZnRwLmMgc291cmNlIHRoYXQKICBkaWRuJ3Qgc2VuZCBhIHByb3BlciBcclxuIHNlcXVlbmNlIGJ1dCBpbnN0ZWFkIHVzZWQgdGhlIGZhdWx0eSBcbiB3aGljaCBhcwogIGl0IHNlZW1lZCBpcyBzdXBwb3J0ZWQgYnkgbW9zdCBtYWpvciBmdHAgc2VydmVycy4uLiA6LU8KClZlcnNpb24gNy4wLjdiZXRhCgpEYW5pZWwgKDE2IEp1bmUgMjAwMCkKLSBJIGhhZCBhdm9pZGVkIHRoaXMgbG9uZyBlbm91Z2ggbm93LCBzbyBJIG1vdmVkIHRoZSBhbHRlcm5hdGl2ZSBwcm9ncmVzcyBiYXIKICBzdHVmZiBmcm9tIHRoZSBsaWIgYW5kIGFkZGVkIGl0IHRvIHRoZSBjbGllbnQgY29kZS4gVGhpcyBpcyBub3cgdXNpbmcgdGhlCiAgcmVjZW50bHkgYWRkZWQgcHJvZ3Jlc3MgY2FsbGJhY2sgYW5kIGl0IHNlZW1zIHRvIHdvcmsgcHJldHR5IG11Y2ggbGlrZQogIGJlZm9yZS4gU2luY2UgaXQgaXMgb25seSBvbmUgcHJvZ3Jlc3MgYmFyIGFuZCB5b3UgYW5kIGRvd25sb2FkIGFuZCB1cGxvYWQgYXQKICB0aGUgc2FtZSB0aW1lLCB0aGlzIGJhciBzaG93cyB0aGUgY29tYmluZWQgcHJvZ3Jlc3Mgb2YgYm90aCBkaXJlY3Rpb25zLiBUaGlzCiAgY29kZSB3YXMganVzdCBwb3J0ZWQgZnJvbSB0aGUgb2xkIHBsYWNlIHRvIHRoaXMsIExhcnMgaXMgc3RpbGwgb3VyIHNhdmlvdXIhCiAgOy0pIFRoaXMgYWxzbyBtYWRlIHRoZSBkb2N1bWVudGF0aW9uIG1vcmUgYWNjdXJhdGUgc2luY2UgSSBuZXZlciByZW1vdmVkCiAgdGhpcyBmdW5jdGlvbiBmcm9tIGFueSBkb2NzISBBbHRob3VnaCBJIG5vdyByZW1vdmVkIHRoZSBDVVJMT1BUX1BST0dSRVNTTU9ERQogIGZyb20gdGhlIGxpYnJhcnkgc2luY2UgdGhlIGxpYiBoYXMgb25seSBvbmUgaW50ZXJuYWwgcHJvZ3Jlc3MgbWV0ZXIgYW5kIGl0CiAgd2lsbCBuZXZlciBnZXQgYW5vdGhlci4gSXQgaXMgYWx0aG91Z2ggbGlrZWx5IHRoYXQgdGhlIGludGVybmFsIG9uZSBhbHNvCiAgd2lsbCBiZSBtb3ZlZCB0byB0aGUgY2xpZW50IGNvZGUgaW4gdGhlIGZ1dHVyZSAod2hlbiBJIGhhdmUgb3RoZXIgbWVhbnMgb2YKICBnZXR0aW5nIHRoZSB3cml0ZW91dCBkYXRhIGFuZCBtb3ZlIHRoYXQgdG9vIHRvIHRoZSBjbGllbnQpLgoKLSBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvIHZlcmlmeSB0aGF0IHN0YW5kYXJkIHByb2dyZXNzIG1ldGVyIHdvcmtzIGFuZCBJCiAgZm91bmQgb3V0IGl0IGRpZG4ndCBnZXQgaW5pdGVkIHByb3Blcmx5LiBHcnJyLiBJIGNvcnJlY3RlZCB0aGF0IGFzIHdlbGwuCgpEYW5pZWwgKDE1IEp1bmUgMjAwMCkKLSBJIHRob3VnaHQgSSdkIGJldHRlciB2ZXJpZnkgdGhhdCB0aGUgLUYgb3B0aW9uIHN0aWxsIHdvcmtzIGluIHY3IGFuZCBvZgogIGNvdXJzZSBpdCBkaWRuJ3QuLi4gOi0vIEFueXdheSwgSSBoYWQgdGhlIHByb2JsZW1zIEkgY291bGQgZGlzY292ZXIKICBjb3JyZWN0ZWQuIEFib3V0IG9uZSBtb250aCBvZiBiZXRhIHRlc3RpbmcgYW5kIG5vdCBhIHNpbmdsZSBwZXJzb24gaGFzIHVzZWQKICB0aGlzIGZlYXR1cmUgd2l0aCB2Nz8KCi0gQmr2cm4gY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIC0tcHJvZ3Jlc3MtYmFyIHN0aWxsIGRvZXNuJ3Qgd29yayBpbgogIHY3LiBIbS4KCkRhbmllbCAoMTQgSnVuZSAyMDAwKQotIFRpbSBUYXNzb25pcyBkaXNjb3ZlcmVkIHRoYXQgY3VybCA3IGRpZG4ndCBoYW5kbGUgbm9ybWFsIGh0dHAgUE9TVCBhcyBpdAogIHNob3VsZC4gSSBjb3JyZWN0ZWQgdGhpcy4KClZlcnNpb24gNy4wLjZiZXRhCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBCavZybiBTdGVuYmVyZyBwb2ludGVkIG91dCBzZXZlcmFsIHByb2JsZW1zIChyZWxhdGVkIHRvIHdpbjMyIGNvbXBpbGluZyk6CiAgbGliL3N0cmVxdWFsLmMgaGFkIGEgYmFkICNpZmRlZiBmb3Igb25lIG9mIHRoZSBzdHJpbmcgY29tcGFyaXNvbnMgKHdpbjMyKQogIHNyYy9tYWluLmMgaGFkIHNldmVyYWwgbWlub3IgcHJvYmxlbXMKICBsaWIvbWFrZWZpbGUubTMyIGhhZCBnZXRwYXNzLltjb10gdHdpY2UKICBzcmMvY29uZmlnLXdpbjMyLmggbGFja2VkIHRoZSBIQVZFX0ZDTlRMX0ggZGVmaW5lCiAgYm90aCBjb25maWctd2luMzIuaCBmaWxlcyBub3cgb25seSBzZXQgdGhlIEhBVkVfVU5JU1REX0ggZGVmaW5lIGlmIHRoZQogIGRlZmluZSBNSU5HVzMyIGlzIHNldCwgYW5kIEkgbW9kaWZpZWQgc3JjL21ha2VmaWxlLm0zMiBhbmQgbGliL21ha2VmaWxlLm0zMgogIHRvIHNldCBpdC4KClZlcnNpb24gNy4wLjViZXRhCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBBcHBsaWVkIEx1b25nIERpbmggRHVuZydzIGNvbW1lbnRzIGFib3V0IGEgZmV3IHdpbjMyIGNvbXBpbGUgcHJvYmxlbXMuCgotIEFwcGxpZWQgQmr2cm4gU3RlbmJlcmcncyBzdWdnZXN0ZWQgZml4IHRoYXQgdHVybnMgdGhlIHdpbjMyIHN0ZG91dCB0bwogIGJpbmFyeS4gSXQgd29uJ3QgZG8gaXQgaWYgdGhlIC1CIC8gLS11c2UtYXNjaWkgb3B0aW9uIGlzIHVzZWQuIFRoYXQgb3B0aW9uCiAgaXMgbm93IGFuIGV4dGVuZGVkIHZlcnNpb24gb2YgdGhlIHByZXZpb3VzIC1CIC8tLWZ0cC0tYXNjaWkuIFRoZSBmbGFnIHdhcwogIGFscmVhZHkgaW4gdXNlIGJlIHRoZSBsZGFwIGFzIHdlbGwgc28gdGhlIG5ldyBuYW1lIGZpdHMgcHJldHR5IGdvb2QuIFRoZQogIGxpYmN5cmwgQ1VSTE9QVF9UUkFOU0ZFUlRFWFQgd2FzIGFsc28gaW50cm9kdWNlZCBhcyBhbiBhbGlhcyB0byB0aGUgbm93CiAgb2Jzb2xldGUgQ1VSTE9QVF9GVFBBU0NJSS4gQ2FuJ3QgdmVyaWZ5IHRoaXMgZml4IG15c2VsZiBhcyBJIGhhdmUgbm8gd2luMzIKICBjb21waWxlciBhcm91bmQuCgpEYW5pZWwgKDEzIEp1bmUgMjAwMCkKLSBMdW9uZyBEaW5oIER1bmcgPGR1bmcgYXQgc2NoLmJtZS5odT4gZm91bmQgYSBwcm9ibGVtIGluIGN1cmxfZWFzeV9jbGVhbnVwKCkKICBzaW5jZSBpdCBmcmVlKCllZCB0aGUgbWFpbiBjdXJsIHN0cnVjdCAqdHdpY2UqLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgpEYW5pZWwgKDkgSnVuZSAyMDAwKQotIFVwZGF0ZWQgdGhlIFJFU09VUkNFUyBmaWxlLCBhZGRlZCBhIFJFQURNRS53aW4zMiBmaWxlLgoKRGFuaWVsICg4IEp1bmUgMjAwMCkKLSBTbyBJIGZpbmFsbHkgYWRkZWQgdGhlIHByb2dyZXNzIGNhbGxiYWNrIHRvIHRoZSAqc2V0b3B0KCkgb3B0aW9ucyBhbmQgaXQKICBzaG91bGQgd29yayBub3cuIEkgZG9uJ3QgaGF2ZSB0aGUgZW5lcmd5IHRvIHdyaXRlIGFueSB0ZXN0IHByb2dyYW0gZm9yIGl0CiAgcmlnaHQgbm93LgotIE1hZGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHR5cGVkZWZzIHB1YmxpYyBpbiBjdXJsL2N1cmwuaCBmb3IgY29tZm9ydC4gSnVzdAogIGluIGNhc2UgYW55b25lIHdhbm5hIGZpZGRsZSB3aXRoIHN1Y2ggcG9pbnRlcnMuCi0gVXBkYXRlZCB0aGUgY3VybF9lYXN5X3NldG9wdCgpIG1hbiBwYWdlIGFjY29yZGluZ2x5LgoKVmVyc2lvbiA3LjAuNGJldGEKCkRhbmllbCAoMiBKdW5lIDIwMDApCi0gSSBub3RpY2VkIHRoYXQgd2hlbiBkb2luZyBMb2NhdGlvbjogZm9sbG93aW5nLCB3ZSBsb3N0IGN1c3RvbSBoZWFkZXJzIGluIGFsbAogIGJ1dCB0aGUgZmlyc3QgcmVxdWVzdC4KLSBSZW1vdmVkIHRoZSAnSHR0cFBvc3QnIHN0cnVjdCBhbmQgbW92ZWQgdGhlIGhlYWRlciBzdHVmZiB0byB0aGUgbW9yZSBnZW5lcmljCiAgY3VybF9zbGlzdC4KLSBBZGRlZCBzb21lIGJldHRlciBzbGlzdC1jbGVhbnVwcyBpbiBzcmMvbWFpbi5jCgpWZXJzaW9uIDcuMC4zYmV0YQoKRGFuaWVsICgzMSBNYXkgMjAwMCkKLSBTbyBJIGRpc2NvdmVyZWQgdGhhdCBJIHJlbGVhc2VkIHRoZSA3LjAuMmJldGEgd2l0aG91dCBpdCBiZWluZyBhYmxlIHRvCiAgY29tcGlsZSB1bmRlciBMaW51eC4gZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIGdldGhvc3RieWFkZHJfcigpIHR1cm5lZCBvdXQgdG8KICBmZWF0dXJlIGEgZGlmZmVyZW50IGFtb3VudCBvZiBhcmd1bWVudHMgb24gZGlmZmVyZW50IHN5c3RlbXMgc28gSSBoYWQgdG8gYWRkCiAgYSBjb25maWd1cmUgY2hlY2sgZm9yIHRoaXMgYW5kIGFkanVzdCB0aGUgY29kZSBzbGlnaHRseS4KClZlcnNpb24gNy4wLjJiZXRhCgpEYW5pZWwgKDI5IE1heSAyMDAwKQotIENvcnJlY3RlZCB0aGUgYml0cy4qIGFzc2lnbm1lbnRzIHdoZW4gdXNpbmcgQ1VSTE9QVCBvcHRpb25zIHRoYXQgb25seQogIHRvZ2dsZXMgb25lIG9mIHRob3NlIGJpdHMuCgotIEFwcGxpZWQgdGhlIGh1Z2UgcGF0Y2hlcyBmcm9tIERhdmlkIExlQmxhbmMgPGRsZWJsYW5jIGF0IHFueC5jb20+IHRoYXQgYWRkCiAgdXNhZ2Ugb2YgdGhlIGdldGhvc3RieW5hbWVfcigpIGFuZCBzaW1pbGFyIGZ1bmN0aW9ucyBpbiBjYXNlIHRoZXkncmUgYXJvdW5kLAogIHNpbmNlIHRoYXQgbWFrZSBsaWJjdXJsIG11Y2ggYmV0dGVyIHRocmVhZHNhZmUgaW4gbWFueSBzeXN0ZW1zIChzdWNoIGFzCiAgc29sYXJpcykuIEkgYWRkZWQgdGhlIGNoZWNrcyBmb3IgdGhlc2UgZnVuY3Rpb25zIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKICBJIGNhbid0IGV4cGxhaW4gd2h5LCBidXQgdGhlIGluZXRfbnRvYV9yKCkgZnVuY3Rpb24gZGlkIG5vdCBhcHBlYXIgaW4gbXkKICBTb2xhcmlzIGluY2x1ZGUgZmlsZXMsIEkgaGFkIHRvIGFkZCBteSBvd24gaW5jbHVkZSBmaWxlIGZvciB0aGlzIGZvciBub3cuCgpEYW5pZWwgKDIyIE1heSAyMDAwKQotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBmaXhlcyB0byBtYWtlIHRoZSB3aW4zMiB2ZXJzaW9uIGNvbXBpbGUgcHJvcGVybHkgYXMKICB3ZWxsIGFzIGEgcmVuYW1lIG9mIHRoZSAnaW50ZXJmYWNlJyBmaWVsZCBpbiB0aGUgdXJsZGF0YSBzdHJ1Y3QsIGFzIGl0IHNlZW1zCiAgdG8gYmUgcmVzZXJ2ZWQgaW4gc29tZSBnY2MgdmVyc2lvbnMhCgotIFJpY2ggR3JheSBzdHJ1Y2sgYmFjayB3aXRoIHlldCBzb21lIHBvcnRhYmlsaXR5IHJlcG9ydHMuIERhdGEgR2VuZXJhbCBERy9VWAogIG5lZWRlZCBhIGxpdHRsZSBmaXggaW4gbGliL2xkYXAuYyBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgUlRMRF9HTE9CQUwgZGVmaW5lZC4KICBNb3JlIGZpeGVzIGFyZSBleHBlY3RlZCBhcyBhIHJlc3VsdCBvZiBSaWNoaWVzIHZlcnkgaGVscGZ1bCB3b3JrLgoKVmVyc2lvbiA3LjAuMWJldGEKCkRhbmllbCAoMjEgTWF5IDIwMDApCi0gVXBkYXRlZCBsb3RzIG9mICNkZWZpbmVzLCBlbnVtcyBhbmQgdmFyaWFibGUgdHlwZSBuYW1lcyBpbiB0aGUgbGlicmFyeS4gTm8KICBtb3JlIHdlaXJkIFVSRyBvciBVUkxUQUcgcHJlZml4ZXMuIEFsbCB0eXBlcyBhbmQgbmFtZXMgc2hvdWxkIGJlIGN1cmwtCiAgcHJlZml4ZWQgdG8gYXZvaWQgbmFtZSBzcGFjZSBjbGFzaGVzLiBUaGUgRkxBR1MtcGFyYW1ldGVyIHRvIHRoZSBmb3JtZXIKICBjdXJsX3VybGdldCgpIGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGEgYnVuY2ggb2YgZmxhZ3MgdG8gdXNlIGluIHNlcGFyYXRlCiAgc2V0b3B0IGNhbGxzLiBJJ20gc3RpbGwgZm9jdXNpbmcgb24gdGhlIGVhc3ktaW50ZXJmYWNlLCBhcyB0aGUgY3VybCB0b29sIGlzCiAgbm93IHVzaW5nIHRoYXQuCgotIEJqb3JuIFJlZXNlIGhhcyBwcm92aWRlZCBtZSB3aXRoIGFuIGFzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVyIHRoYXQgSSBwbGFuCiAgdG8gdXNlIGluIHVwY29taW5nIHZlcnNpb25zIG9mIGN1cmwgdG8gYmUgYWJsZSB0byBncmFjZWZ1bGx5IHRpbWVvdXQgbmFtZQogIGxvb2t1cHMuCgpWZXJzaW9uIDcuMGJldGEKCkRhbmllbCAoMTggTWF5IDIwMDApCi0gSW50cm9kdWNlZCBMSUJDVVJMX1ZFUlNJT05fTlVNIHRvIHRoZSBjdXJsLmggaW5jbHVkZSBmaWxlIHRvIGJldHRlciBhbGxvdwogIHNvdXJjZSBjb2RlcyB0byBiZSBkZXBlbmRlbnQgb24gdGhlIGxpYiB2ZXJzaW9uLiBUaGlzIGRlZmluZSBpcyBub3cgc2V0IHRvCiAgYSBkZXhhZGVjaW1hbCBudW1iZXIsIHdpdGggOCBiaXRzIGVhY2ggZm9yIG1ham9yIG51bWJlciwgbWlub3IgbnVtYmVyIGFuZAogIHBhdGNoIG51bWJlci4gSW4gb3RoZXIgd29yZHMsIHZlcnNpb24gMS4yLjMgd291bGQgbWFrZSBpdCAweDAxMDIwMy4gSXQgYWxzbwogIG1ha2VzIGEgbGFyZ2VyIG51bWJlciBhIG5ld2VyIHZlcnNpb24uCgpEYW5pZWwgKDE3IE1heSAyMDAwKQotIE1hcnRpbiBLYW1tZXJob2ZlciBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgc2V2ZXJhbCBmbGF3cyBpbiB0aGUgRlRQIHJhbmdlCiAgb3B0aW9uLiBJIGNvcnJlY3RlZCB0aGVtLgotIFJlbW92ZWQgdGhlIHdpbjMyIHdpbnNvY2sgaW5pdCBjcmFwIGZyb20gdGhlIGxpYiB0byB0aGUgc3JjL21haW4uYyBmaWxlCiAgaW4gdGhlIGFwcGxpY2F0aW9uIGluc3RlYWQuIFRoZXkgY2FuJ3QgYmUgaW4gdGhlIGxpYiwgZXNwZWNpYWxseSBub3QgZm9yCiAgbXVsdGl0aHJlYWRlZCBwdXJwb3Nlcy4KCkRhbmllbCAoMTYgTWF5IDIwMDApCi0gUmV3cm90ZSB0aGUgc3JjL21haW4uYyBzb3VyY2UgdG8gdXNlIHRoZSBuZXcgZWFzeS1pbnRlcmZhY2UgdG8gbGliY3VybCA3LgogIFRoZXJlIGlzIHN0aWxsIG1vcmUgd29yayB0byBkbywgYnV0IHRoZSBmaXJzdCBzdGVwIGlzIG5vdyB0YWtlbi4KICA8Y3VybC9lYXN5Lmg+IGlzIHRoZSBpbmNsdWRlIGZpbGUgdG8gdXNlLgoKRGFuaWVsICgxNCBNYXkgMjAwMCkKLSBGVFAgVVJMcyBhcmUgbm93IHRyZWF0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50LCBtb3JlIGFjY29yZGluZyB0byBSRkMgMTczOC4KLSBGVFAgc2Vzc2lvbnMgYXJlIG5vdyBwZXJmb3JtZWQgZGlmZmVyZW50bHksIHdpdGggQ1dEIGNvbW1hbmRzIHRvIGNoYW5nZQogIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIFJFVFIvU1RPUi9MSVNUIHdpdGggdGhlIGZ1bGwgcGF0aC4gRGlzY3Vzc2lvbnMgd2l0aAogIFJpY2ggR3JheSBtYWRlIG1lIG5vdGljZSB0aGVzZSBwcm9ibGVtcy4KLSBKYW5uZSBKb2hhbnNzb24gZGlzY292ZXJlZCBhbmQgY29ycmVjdGVkIGEgYnVmZmVyIG92ZXJmbG93IGluIHRoZQogIHNyYy91c3JnbG9iLmMgZmlsZS4KLSBJIGhhZCB0byBhZGQgYSBsaWIvc3RyZXF1YWwuYyBmaWxlIGZvciBkb2luZyBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZwogIGNvbXBhcmVzIG9uIGFsbCBwbGF0Zm9ybXMuCgpEYW5pZWwgKDggTWF5IDIwMDApOgotIEJlZW4gd29ya2luZyBsb3RzIG9uIHRoZSBuZXcgbGliLgotIFRvZ2V0aGVyIHdpdGggUmljaCBHcmF5LCBJJ3ZlIHRyaWVkIHRvIGFkanVzdCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB3b3JrCiAgYmV0dGVyIG9uIHRoZSBOQ1IgTVAtUkFTIFVuaXguCgpEYW5pZWwgKDIgTWF5IDIwMDApOgotIEFsYmVydCBDaGluLUEtWW91bmcgcG9pbnRlZCBvdXQgdGhhdCBJIGhhZCBhIGZldyB0b28gbWFueSBpbnN0cnVjdGlvbnMgaW4KICBjb25maWd1cmUuaW4gdGhhdCBkaWRuJ3QgZG8gYW55IGdvb2QuCgpEYW5pZWwgKDI0IEFwcmlsIDIwMDApOgotIEFkZGVkIGEgbmV3IHBhcmFncmFwaCB0byB0aGUgRkFRIGFib3V0IHdoYXQgdG8gZG8gd2hlbiBjb25maWd1cmUgY2FuJ3QKICBmaW5kIE9wZW5TU0wgZXZlbiB0aG91Z2ggaXQgaXMgaW5zdGFsbGVkLiBTdXBwbGllZCBieSBCb2IgQWxsaXNvbgoKRGFuaWVsICgxMiBBcHJpbCAyMDAwKToKLSBTdGFydGVkIG1lc3NpbmcgYXJvdW5kIGJpZy10aW1lIHRvIGNvbnZlcnQgdGhlIG9sZCBsaWJyYXJ5IGludGVyZmFjZSB0byBhCiAgYmV0dGVyIG9uZS4uLgoKRGFuaWVsICg4IEFwcmlsIDIwMDApOgotIE1hZGUgdGhlIHByb2dyZXNzIGJhciBsb29rIGJldHRlciBmb3IgZmlsZSBzaXplcyBiZXR3ZWVuIDk5OTkga2lsb2J5dGVzCiAgYW5kIDEwMCBtZWdhYnl0ZXMuIFRoZXkncmUgbm93IGRpc3BsYXllZCBYWC5YTS4KLSBJIGFsc28gbm90aWNlZCB0aGF0IGZ0cCBmZXRjaGVzIHRocm91Z2ggSFRUUCBwcm94aWVzIGRpZG4ndCBhZGQgdGhlIHVzZXIKICBhZ2VudCBzdHJpbmcuIEl0IGRvZXMgbm93LgotIEhhYmliaWUgPGhhYmliaWUgYXQgTWFpbGFuZE5ld3MuY29tPiBzdXBwbGllZCBhIHByZXR0eSBnb29kIHdheSB0byBidWlsZCBSUE1zCiAgb24gYSBMaW51eCBtYWNoaW5lLiBJdCBzdGlsbCBhKSByZXF1aXJlcyBtZSB0byBiZSByb290IHRvIGRvIGl0LCBiKSBsZWF2ZXMKICB0aGUgcnBtIHBhY2thZ2VzIGxheWluZyBhdCBzb21lIG9kZCBwbGFjZSBvbiBteSBkaXNrIGMpIGRvZXNuJ3Qgd29yayB0bwogIGJ1aWxkIHRoZSBzc2wgdmVyc2lvbiBvZiBjdXJsIHNpbmNlIEkgZGlkbid0IGluc3RhbGwgb3BlbnNzbCBmcm9tIGFuIHJwbQogIHBhY2thZ2Ugc28gbm93IHRoZSBycG0gY3JhcCB0aGlua3MgSSBkb24ndCBoYXZlIG9wZW5zc2wgYW5kIHJlZnVzZXMgdG8gYnVpbGQKICBhIHBhY2thZ2UgdGhhdCBkZXBlbmRzIG9uIHNzbC4uLiBEaWQgSSBtZW50aW9uIEkgZG9uJ3QgZ2V0IGFsb25nIHdpdGggUlBNPwotIE9uY2UgYWdhaW4gSSByZWNlaXZlZCBhIGJ1ZyByZXBvcnQgYWJvdXQgYXV0b2NvbmYgbm90IHNldHRpbmcgLUwgcHJpb3IgdG8gLWwKICBvbiB0aGUgY29tbWFuZCBsaW5lIHdoZW4gY2hlY2tpbmcgZm9yIGxpYnMuIEluIHRoaXMgY2FzZSBpdCBtYWRlIHRoZSBuYXRpdmUKICBjYyBjb21waWxlciBvbiBTb2xhcmlzIDcgdG8gZmFpbCB0aGUgT3BlblNTTCBjaGVjay4gVGhpcyBoYXMgcHJldmlvdXNseSBiZWVuCiAgcmVwb3J0ZWQgdG8gY2F1c2UgcHJvYmxlbXMgb24gSFAtVVggYW5kIGlzIGEga25vd24gZmxhdyBpbiBhdXRvY29uZiAyLjEzLiBJdAogIGlzIGEgcGl0eSB0aGVyZSdzIG5vIG5ld2VyIHJlbGVhc2UgYXJvdW5kLi4uCgpEYW5pZWwgKDQgQXByaWwgMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gc3VwcGxpZWQgbWUgd2l0aCB0d28gZml4ZXMgdGhhdAogIGFwcGVhcmFudGx5IG1ha2VzIHRoZSBPUy8yIHBvcnQgd29yayBiZXR0ZXIgd2l0aCBtdWx0aXBsZSBVUkxzLgoKRGFuaWVsICgyIEFwcmlsIDIwMDApOgotIEFub3RoZXIgTG9jYXRpb246IGZpeC4gVGhpcyB0aW1lLCB3aGVuIGN1cmwgY29ubmVjdGVkIHRvIGEgcG9ydCBhbmQgdGhlbgogIGZvbGxvd2VkIGEgbG9jYXRpb24gd2l0aCBhbiBhYnNvbHV0ZSBVUkwgdG8gYW5vdGhlciBwb3J0LCBpdCBtaXNiZWhhdmVkLgoKRGFuaWVsICgyNyBNYXJjaCAyMDAwKToKLSBILiBEYXBobmUgTHVvbmcgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyB3cm9uZ2x5CiAgbWVzc2luZyB1cCB0aGUgcHJveHkgc3RyaW5nIHdoZW4gZmV0Y2hpbmcgYSBkb2N1bWVudCB0aHJvdWdoIGEgaHR0cCBwcm94eSwKICB3aGljaCBzY3Jld2VkIHVwIG11bHRpcGxlIGZldGNoZXMgc3VjaCBhcyBpbiBsb2NhdGlvbjogZm9sbG93aW5ncy4KCkRhbmllbCAoMjMgTWFyY2ggMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gY29ycmVjdGVkIG15IGJhZGx5IGFwcGxpZWQgcGF0Y2ggaGUKICBhY3R1YWxseSBhbHJlYWR5IHRvbGQgbWUgYWJvdXQhCgotIEguIERhcGhuZSBMdW9uZyBicm91Z2h0IG1lIGEgZml4IHRoYXQgbm93IG1ha2VzIGN1cmwKICBpZ25vcmUgc2VsZWN0KCkgZXJyb3JzIGluIHRoZSBkb3dubG9hZCBpZiBlcnJubyBpcyBFSU5UUiwgd2hpY2ggdHVybnMgb3V0IHRvCiAgaGFwcGVuIGV2ZXJ5IG5vdyBhbmQgdGhlbiB3aGVuIHVzaW5nIGxpYmN1cmwgbXVsdGktdGhyZWFkZWQuLi4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMCk6Ci0gV2hhbSBCYW5nIHN1cHBsaWVkIGEgY291cGxlIG9mIHdpbjMyIGZpeGVzLiBIQVZFX1VOQU1FCiAgd2FzIGFjY2lkZW50YWxseSAjZGVmaW5lZCBpbiBjb25maWctd2luMzIuaCwgd2hpY2ggaXQgc2hvdWxkbid0IGhhdmUgYmVlbi4KICBUaGUgSEFWRV9VTklTVERfSCBpcyBub3QgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB3aXRoIHRoZSBNYWtlZmlsZS52YzYKICBtYWtlZmlsZSBmb3IgTVMgVkMrKy4KCkRhbmllbCAoMjEgTWFyY2ggMjAwMCk6Ci0gSSByZW1vdmVkIHRoZSBBQ19QUk9HX0lOU1RBTEwgbWFjcm8gZnJvbSBjb25maWd1cmUuaW4sIHNpbmNlIGl0IGFwcGVhcnMgdGhhdAogIG9uZSBvZiB0aGUgQU1fKiBtYWNyb3Mgc2VhcmNoZXMgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCBhbHJlYWR5LiBKYW5uZQogIEpvaGFuc3NvbiBtYWRlIG1lIGF3YXJlIG9mIHRoaXMuCgpWZXJzaW9uIDYuNS4yCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIFBhdWwgSGFycmluZ3RvbiBxdWlja2x5IHBvaW50ZWQgb3V0IHRvIG1lIHRoYXQgNi41LjEKICBjcmFzaGVzIGhhcmQuIEkgdXBsb2FkIDYuNS4yIG5vdyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlISBUaGUgcHJvYmxlbSB3YXMKICB0aGUgLUQgYWRqdXN0bWVudHMgaW4gc3JjL21haW4uYy4KClZlcnNpb24gNi41LjEKCkRhbmllbCAoMjAgTWFyY2ggMjAwMCk6Ci0gQW4gYW5vbnltb3VzIHBvc3Qgb24gc291cmNlZm9yZ2UgY29ycmVjdGx5IHBvaW50ZWQgb3V0IGEgcG9zc2libGUgYnVmZmVyCiAgb3ZlcmZsb3cgaW4gdGhlIGN1cmxfdW5lc2NhcGUoKSBmdW5jdGlvbiBmb3IgVVJMIGNvbnZlcnNpb25zLiBUaGUgbWFpbgogIHByb2JsZW0gd2l0aCB0aGlzIGJ1ZyBpcyB0aGF0IHRoZSBmdHAgZG93bmxvYWQgdXNlcyB0aGF0IGZ1bmN0aW9uIGFuZCB0aGlzCiAgc2luZ2xlLSBieXRlIG92ZXJmbG93IGNvdWxkIGxlYWQgdG8gdmVyeSBvZGQgYnVncyAoYXMgb25lIHJlcG9ydGVkIGJ5IEphbm5lCiAgSm9oYW5zc29uKS4KCkRhbmllbCAoMTkgTWFyY2ggMjAwMCk6Ci0gTWFyY28gRy4gU2FsdmFnbm8gc3VwcGxpZWQgbWUgd2l0aCBhIHNlcmllcyBvZiBwYXRjaGVzCiAgdGhhdCBub3cgYWxsb3dzIGN1cmwgdG8gZ2V0IGNvbXBpbGVkIG9uIE9TLzIuIEl0IGV2ZW4gaW5jbHVkZXMgYSBzZWN0aW9uIGluCiAgdGhlIElOU1RBTEwgZmlsZS4gVmVyeSBuaWNlIGpvYiEKCkRhbmllbCAoMTcgTWFyY2ggMjAwMCk6Ci0gV2hhbSBCYW5nIHN1cHBsaWVkIGEgcGF0Y2ggZm9yIHRoZSBsaWIvTWFrZWZpbGUudmM2CiAgZmlsZS4gV2Ugc3RpbGwgbmVlZCBzb21lIGZpeGVzIGZvciB0aGUgY29uZmlnLXdpbjMyLmggc2luY2UgaXQgYXBwZWFycyB0aGF0CiAgVkMrKyBhbmQgbWluZ3czMiBoYXZlIGRpZmZlcmVudCBvcGluaW9ucyBhYm91dCAoYXQgbGVhc3QpIHVuaXN0ZC5oJ3MKICBleGlzdGVuY2UuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDApOgotIEkgbW9kaWZpZWQgdGhlIC1ELy0tZHVtcC1oZWFkZXIgd29ya2luZ3Mgc28gdGhhdCBpdCBkb2Vzbid0IHdyaXRlIGFueXRoaW5nCiAgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8uIFRoaXMgd2F5LCB5b3UgY2FuIGFjdHVhbGx5IHVzZSAtYiBhbmQgLUQKICBvbiB0aGUgc2FtZSBmaWxlIGlmIHlvdSB3YW50IHJlcGVhdGVkIGludm9rZXMgdG8gc3RvcmUgYW5kIHJlYWQgdGhlIGNvb2tpZXMKICBpbiB0aGF0IG9uZSBzaW5nbGUgZmlsZS4KCi0gUG9rZWQgYXJvdW5kIGluIGxvdHMgb2YgdGV4dHMuIEFkZGVkIHRoZSBCVUdTIGZpbGUgZm9yIGJ1ZyByZXBvcnRpbmcgc3R1ZmYuCiAgQWRkZWQgdGhlIGNsYXNzaWMgSFRUUCBQT1NUIHF1ZXN0aW9uIHRvIHRoZSBGQVEsIHJlbW92ZWQgc29tZSAjaWZkZWYgV0lOMzIKICBzdHVmZiBmcm9tIHRoZSBzb3VyY2VzICh0aGV5J3JlIGNvdmVyZWQgYnkgdGhlIGNvbmZpZy13aW4zMi5oIG5vdykuCgotIFBhc2NhbCBHYXVkZXR0ZSBmaXhlZCBhIG1pc3NpbmcgbGRhcC5jIHByb2JsZW0gaW4gdGhlCiAgTWFrZWZpbGUudmM2IGZpbGUuIEhlIGFsc28gYWRkcmVzc2VkIGEgcHJvYmxlbSBpbiBzcmMvY29uZmlnLXdpbjMyLmguCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDApOgotIFBhdWwgSGFycmluZ3RvbiBwb2ludGVkIG91dCB0aGF0IHRoZSAnaHR0cF9jb2RlJyB2YXJpYWJsZSBpbiB0aGUgLXcgb3V0cHV0CiAgd2FzIG5ldmVyIHdyaXR0ZW4uIEkgZml4ZWQgaXQgbm93LgoKLSBKYW5uZSBKb2hhbnNzb24gcmVwb3J0ZWQgdGhlIGNvbXBsYWludHMgdGhhdCBPcGVuQlNEIGRvZXMKICB3aGVuIGdldGRhdGUuYyAjaW5jbHVkZXMgbWFsbG9jLmguIEl0IGNsYWltcyBzdGRsaWIuaCBzaG91bGQgYmUgaW5jbHVkZWQKICBpbnN0ZWFkLiBJIGFkZGVkICNpZmRlZiBIQVZFX01BTExPQ19IIGNvZGUgaW4gZ2V0ZGF0ZS55IGFuZCB0d28gY2hlY2tzIGluCiAgdGhlIGNvbmZpZ3VyZS5pbiBmb3IgbWFsbG9jLmggYW5kIHN0ZGxpYi5oLgoKVmVyc2lvbiA2LjUKCkRhbmllbCAoMTMgTWFyY2ggMjAwMCk6Ci0gPGN1cmwgYXQgc3BhbS53b2x2ZXNiYW5lLm5ldD4gcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2F5IGN1cmwgc2VudCBjb29raWVzIGluIGEKICBzaW5nbGUgbGluZSB3YXNuJ3QgZW5qb3llZCBieSBJSVM0LjAgc2VydmVycy4gSW4gbXkgdmlldywgdGhhdCBpcyBub3Qgd2hhdAogIHRoZSBzdGFuZGFyZHMgc2F5LCBidXQgSSBhZGRlZCBhIHdoaXRlIHNwYWNlIGJldHdlZW4gdGhlIG5hbWUvdmFsdWUgcGFpcnMgdG8KICBwZXJoYXBzIG1ha2UgdGhlbSB3b3JrIGJldHRlci4KCi0gQWRkZWQgdGhlIHBlcmwgY2hlY2sgYmFjayBpbiB0aGUgY29uZmlndXJlLmluIGFnYWluIHNpbmNlIHRoZSBta2hlbHAucGwKICBzY3JpcHQgbmVlZHMgaXQhCgotIE1hZGUgc29tZSBiZWF1dGlmaWNhdGlvbnMgaW4gdGhlIGN1cmwgbWFuIHBhZ2UuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gSvZybiBoZWxwZWQgbWUgdXBkYXRlIHRoZSBjb25maWctd2luMzIuaCBmaWxlcyB3aXRoIEhBVkVfU0VUVkJVRiBhbmQKICBIQVZFX1NUUkRVUC4KCkRhbmllbCAoMyBNYXJjaCAyMDAwKToKLSBVcGxvYWRlZCB0aGUgNi41cHJlMiBwYWNrYWdlLgoKRGFuaWVsICgyIE1hcmNoIDIwMDApOgotIFJlbW92ZWQgdGhlIHBlcmwtcHJvZ3JhbXMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uLCB0aGV5IG5ldmVyIG1hZGUgbWFueSBwZW9wbGUKICBoYXBweSBhbmQgSSdsbCBzdGlsbCBrZWVwIHRoZW0gYXZhaWxhYmxlIG9uIHRoZSB3ZWIuCgotIEFkZGVkIHRoZSAtdyBhbmQgLU4gc3R1ZmYgdG8gdGhlIG1hbiBwYWdlLiBEb2N1bWVudGVkIHRoZSBuZXcgcHJvZ3Jlc3MgbWV0ZXIKICBkaXNwbGF5IGluIFJFQURNRS5jdXJsLgoKLSBK9nJuIEhhcnRyb3RoLCBDaHJpcyA8Y2JheWxpc3MgYXQgY3NjLmNvbWU+IGFuZCBVbGYKICBN9mxsZXIgZnJvbSB0aGUgb3BlbnNzbCBkZXZlbG9wbWVudCB0ZWFtIGhlbHBlZCBicmluZ2luZyBtZSB0aGUgZGV0YWlscyBmb3IKICBmaXhpbmcgYW4gT3BlblNTTCB1c2FnZSBmbGF3LiBJdCBiZWNhbWUgYXBwYXJlbnQgd2hlbiB0aGV5IHJlbGVhc2VkIG9wZW5zc2wKICAwLjkuNSBzaW5jZSB0aGF0IGJhcmZlZCBvbiBjdXJsJ3MgYmFkIGJlaGF2aW9yIChub3Qgc2VlZGluZyBhIHJhbmRvbSBudW1iZXIKICB0aGluZykuCgotIFlldCBhbm90aGVyIG9wdGlvbjogLU4vLS1uby1idWZmZXIgZGlzYWJsZXMgYnVmZmVyaW5nIGluIHRoZSBvdXRwdXQgc3RyZWFtLgogIFByb2JhYmx5IG1vc3QgdXNlZnVsIGZvciB2ZXJ5IHNsb3cgdHJhbnNmZXJzIHdoZW4geW91IHJlYWxseSB3YW50IHRvIGdldAogIGV2ZXJ5IGJ5dGUgY3VybCByZWNlaXZlcyB3aXRoaW4gc29tZSBwcmVmZXJyZWQgdGltZS4gQW5kcmV3IDx0bXIgYXQgZ2NpLm5ldD4KICBzdWdnZXN0ZWQgdGhpcy4KCi0gRGFtaWVuIEFkYW50IG1haWxlZCBtZSBoaXMgZml4ZXMgZm9yIG1ha2luZyBjdXJsIGNvbXBpbGUgb24gVWx0cml4LgoKRGFuaWVsICgyNCBGZWJydWFyeSAyMDAwKToKLSBBcHBsaWVkIEr2cm4gSGFydHJvdGgncyBmaXhlcyBmb3IgY29uZmlnLXdpbjMyLmggYW5kIGxpYi9NYWtlZmlsZS53MzIuCgogIEkgc2hvdWxkIGFsc28gbWFrZSBhIG5vdGUgaGVyZSwgaWYgbm90aGluZyBlbHNlIHRvIG15c2VsZiwgdGhhdCB3aGVuIHVzaW5nCiAgdGhlICUtc3ludGF4IGZvciB2YXJpYWJsZXMgaW4gRE9TIGNvbW1hbmQgcHJvbXB0cywgeW91IG11c3QgdXNlIHR3byAlLQogIGxldHRlcnMgZm9yIGVhY2ggb25lIHNpbmNlIHRoYXQgaXMgYW4gZXNjYXBlIGxldHRlciB0aGVyZSEgTWF5YmUgSSBzaG91bGQKICB1c2UgYW5vdGhlciBsZXR0ZXIgaW5zdGVhZCEKCi0gQWRkZWQgbW9yZSB2YXJpYWJsZXMgdG8gLXc6CgogICdodHRwX2NvZGUnCiAgJ3RpbWVfbmFtZWxvb2t1cCcKICAndGltZV9jb25uZWN0JwogICd0aW1lX3ByZXRyYW5zZmVyJwogICd1cmxfZWZmZWN0aXZlJwoKLSBNYWRlIC13QGZpbGVuYW1lIHJlYWQgdGhlIHN5bnRheCBmcm9tIGEgZmlsZSBhbmQgLXdALSByZWFkcyB0aGUgc3ludGF4IGZyb20KICBzdGRpbiBpbiB0aGUgZ29vZCBvbGQgInN0YW5kYXJkIiBjdXJsIHdheS4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMCk6Ci0gUmVsZWFzZWQgYSA2LjVwcmUxIHZlcnNpb24gdG8gZ2V0IHNvbWUgdGVzdCBhbmQgdXNlciBmZWVkYmFjay4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwMCk6CgotIEkgYWRkZWQgdGhlIC13Ly0td3JpdGUtb3V0IGZsYWcgYW5kIHNvbWUgdmFyaWFibGVzIHRvIGdvIHdpdGggaXQuIC13IGlzIGEKICBzaW5nbGUgc3RyaW5nLCB3aGF0ZXZlciB5b3UgZW50ZXIgdGhlcmUgd2lsbCBiZSB3cml0dGVuIG91dCB3aGVuIGN1cmwgaGFzCiAgY29tcGxldGVkIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0LiBUaGVyZSBhcmUgc29tZSB2YXJpYWJsZSBzdWJzdGl0dXRpb25zIGFuZAogIHRoZXkgYXJlIHNwZWNpZmllZCBhcyAnJXt2YXJpYWJsZX0nICh3aXRob3V0IHRoZSBxdW90ZXMpLiBWYXJpYWJsZXMgdGhhdAogIGV4aXN0IGFzIG9mIHRoaXMgbW9tZW50IGFyZToKCiAgICAgICAgdG90YWxfdGltZSAgICAgLSB0b3RhbCB0cmFuc2ZlciB0aW1lIGluIHNlY29uZHMgKHdpdGggMiBkZWNpbWFscykKICAgICAgICBzaXplX2Rvd25sb2FkICAtIHRvdGFsIGRvd25sb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc2l6ZV91cGxvYWQgICAgLSB0b3RhbCB1cGxvYWRlZCBhbW91bnQgb2YgYnl0ZXMKICAgICAgICBzcGVlZF9kb3dubG9hZCAtIHRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBlbnRpcmUgZG93bmxvYWQKICAgICAgICBzcGVlZF91cGxvYWQgICAtIHRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBlbnRpcmUgdXBsb2FkCgogIEkgd2lsbCBvZiBjb3Vyc2UgYWRkIG1vcmUgdmFyaWFibGVzLCBidXQgSSBuZWVkIGlucHV0IG9uIHRoZXNlIGFuZCBvdGhlcnMuCgotIEl0IHN0cnVjayBtZSB0aGF0IHRoZSAtIyBwcm9ncmVzcyBiYXIgd2lsbCBiZSBoYXJkIHRvIGp1c3QgYXBwbHkgb24gdGhlIG5ldwogIHByb2dyZXNzIGJhciBjb25jZXB0LiBJIG5lZWQgc29tZSBmZWVkYmFjayBvbiB0aGlzIGJlZm9yZSB0aGF0J2xsIGdldCByZS0KICBpbnRyb2R1Y2VkISA6LS8KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwMCk6Ci0gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHNvbWUgZml4ZXMgZm9yIHRoZSBwcm9ncmVzcyBtZXRlciBhbmQgSSBjb250aW51ZWQKICB3b3JraW5nIG9uIGl0LiBJdCBzZWVtcyB0byB3b3JrIGZvciBodHRwIGRvd25sb2FkLCBodHRwIHBvc3QsIGZ0cCBkb3dubG9hZAogIGFuZCBmdHAgdXBsb2FkLiBJdCBzaG91bGQgYmUgYSBwcmV0dHkgZ29vZCB0ZXN0IGl0IHdvcmtzIGdlbmVyYWxseSBnb29kLgoKLSBTdGlsbCBuZWVkIHRvIGFkZCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIGludG8gdGhlIG5ldyBzdHlsZSBwcm9ncmVzcyBpbnRlcmZhY2UuCgotIEdvbm5hIGhhdmUgYSBnbyBhdCBteSBuZXcgb3V0cHV0IG9wdGlvbiBwYXJhbWV0ZXIgbmV4dC4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwMCk6Ci0gVGhlIHByb2dyZXNzIG1ldGVyIHN0dWZmIGlzIHNsb3dseSB0YWtpbmcgcGxhY2UuIFRoZXJlJ3MgbW9yZSBsZWZ0IGJlZm9yZSBpdAogIGlzIHdvcmtpbmcgb2sgYW5kIGV2ZXJ5dGhpbmcgaXMgdGVzdGVkLCBidXQgd2UncmUgcmVhY2hpbmcgdGhlcmUuIFNsb3dseSEKCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwMCk6Ci0gUGF1bCBNYXJxdWlzIGZpeGVkIHRoZSBjb25maWcgZmlsZSBwYXJzaW5nIG9mIGN1cmwgdG8KICBkZWFsIHdpdGggYW55LWxlbmd0aCBsaW5lcywgcmVtb3ZpbmcgdGhlIHByZXZpb3VzIGxpbWl0IG9mIDRLLgoKLSBFZXR1IE9qYW5lbidzIHN1Z2dlc3Rpb24gb2Ygc3VwcG9ydGluZyB0aGUgQC1zdHlsZSBmb3IgLWIKICBpcyBpbXBsZW1lbnRlZC4gTm93IC1iQDxmaWxlbmFtZT4gd29ya3MgYXMgd2VsbCBhcyB0aGUgb2xkIHN0eWxlLiAtYkAtIGFsc28KICBzaW1pbGFybHkgcmVhZHMgdGhlIGNvb2tpZXMgZnJvbSBzdGRpbi4KCi0gUmVtaW5kZXI6IC1EIHNob3VsZCBub3Qgd3JpdGUgdG8gdGhlIGZpbGUgdW50aWwgaXQgbmVlZHMgdG8sIGluIHRoZSBzYW1lIHdheQogIC1vIGRvZXMuIFRoYXQgd291bGQgZW5hYmxlIGN1cmwgdG8gdXNlIC1iIGFuZCAtRCBvbiB0aGUgc2FtZSBmaWxlLi4uCgotIEVsbGlzIFByaXRjaGFyZCBtYWRlIGdldGRhdGUueSB3b3JrIGZvciBNYWNPUyBYLgoKLSBQYXVsIEhhcnJpbmd0b24gaGVscGVkIG1lIG91dCBmaW5kaW5nIHRoZSBjcmFzaCBpbiB0aGUKICBjb29raWUgcGFyc2VyLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGN1cmwncyBoYWJpdCBvZiBzZW5kaW5nIGVtcHR5IGNvb2tpZXMgdG8KICB0aGUgc2VydmVyLgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDApOgogLSBSb24gWmFwcCBjb3JyZWN0ZWQgYSBwcm9ibGVtIGluIHNyYy91cmxnbG9iLmMgdGhhdAogICBwcmV2ZW50ZWQgY3VybCBmcm9tIGdldHRpbmcgY29tcGlsZWQgb24gc3Vub3MgNC4gVGhlIHByb2JsZW0gaGFkIHRvIGRvCiAgIHdpdGggdGhlIGRpZmZlcmVuY2UgaW4gc3ByaW50ZigpIHJldHVybiBjb2RlIHR5cGVzLgoKIC0gVHJhbnNmZXIoKSBzaG91bGQgbm93IGJlIGFibGUgdG8gZG93bmxvYWQgYW5kIHVwbG9hZCBzaW11bHRhbmVvdXNseS4gTGV0J3MKICAgZG8gc29tZSBwcm9ncmVzcyBtZXRlciBmaXhlcyBsYXRlciB0aGlzIHdlZWsuCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMCk6CiAtIFBhdWwgSGFycmluZ3RvbiBmb3VuZCBhbm90aGVyIGNvcmUgZHVtcCBpbiB0aGUgY29va2llCiAgIHBhcnNlci4gQ3VybCBkb2Vzbid0IHByb3Blcmx5IHJlY29nbml6ZSB0aGUgJ3ZlcnNpb24nIGtleXdvcmQgYW5kIEkgdGhpbmsKICAgdGhhdCBpcyB3aGF0IGNhdXNlZCB0aGlzLiBJIG5lZWQgdG8gcmVmcmVzaCBzb21lIHNwZWNzIG9uIGNvb2tpZXMgYW5kIHNlZQogICB3aGF0IGVsc2UgY3VybCBsYWNrcyB0byBpbXByb3ZlIHRoaXMgYSBiaXQgbW9yZSBvbmNlIGFuZCBmb3IgYWxsLgoKICAgUkZDIDIxMDkgY2xlYXJseSBzcGVjaWZpZXMgaG93IGNvb2tpZXMgc2hvdWxkIGJlIGRlYWx0IHdpdGggd2hlbiB0aGV5IGFyZQogICBjb21wbGlhbnQgd2l0aCB0aGF0IHNwZWMuIEkgZG9uJ3QgdGhpbmsgbWFueSBzZXJ2ZXJzIGFyZSB0aG91Z2guLi4KCiAtIE1hcmsgVy4gRWljaGluIGZvdW5kIHRoYXQgd2hpbGUgY3VybCBpcyB1cGxvYWRpbmcgYSBmb3JtCiAgIHRvIGEgd2ViIHNpdGUsIGl0IGRvZXNuJ3QgcmVhZCBpbmNvbWluZyBkYXRhIHdoeSBpdCdsbCBoYW5nIGFmdGVyIGEgd2hpbGUKICAgc2luY2UgdGhlIHNvY2tldCAicGlwZSIgYmVjb21lcyBmdWxsLgoKICAgSXQgdG9vayBtZSB0d28gaG91cnMgdG8gcmV3cml0ZSBEb3dubG9hZCgpIGFuZCBVcGxvYWQoKSBpbnRvIHRoZSBuZXcKICAgc2luZ2xlIGZ1bmN0aW9uIFRyYW5zZmVyKCkuIEl0IGV2ZW4gc2VlbXMgdG8gd29yayEgTW9yZSB0ZXN0aW5nIGlzIHJlcXVpcmVkCiAgIG9mIGNvdXJzZS4uLiBJIHNob3VsZCBnZXQgdGhlIGhlYWRlci1zZW5kaW5nIHRvZ2V0aGVyIGluIGEga2luZCBvZiBxdWV1ZQogICBhbmQgbGV0IHRoZW0gZ2V0ICJ1cGxvYWRlZCIgaW4gVHJhbnNmZXIoKSBhcyB3ZWxsLgoKIC0gWmhpYmlhbyBXdSBwb2ludGVkIG91dCBhIGN1cmwgYnVnIGluIHRoZSBsb2NhdGlvbjogYXJlYSwKICAgYWx0aG91Z2ggSSBkaWQgbm90IGdldCBhIHJlcHJvZHVjaWJsZSB3YXkgdG8gZG8gdGhpcyB3aHkgSSBoYXZlIHRvIHdhaXQKICAgd2l0aCBmaXhpbmcgYW55dGhpbmcuCgogLSBCb2IgU2NoYWRlciBzdWdnZXN0ZWQgSSBzaG91bGQgaW1wbGVtZW50IHJlc3VtZQogICBzdXBwb3J0IGZvciB0aGUgSFRUUCBQVVQgb3BlcmF0aW9uLCBhbmQgYXMgSSB0aGluayBpdCBpcyBhIHZhbGlkIHN1Z2dlc3Rpb24KICAgSSdsbCB3b3JrIG9uIGl0LgoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDApOgogLSBNIFRyYXZpcyBPYmVuaGF1cyBwb2ludGVkIG91dCBhIG1hbnVhbCBtaXh1cCB3aXRoIC15IGFuZCAtWSB0aGF0IHdhcwogICBjb3JyZWN0ZWQuCgogLSBKZW5zIFNjaGxldXNlbmVyIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB0byBjb21waWxlCiAgIGN1cmwgb24gQUlYIDQuMS40IGFuZCBnYXZlIG1lIGEgc29sdXRpb24uIFRoaXMgcHJvYmxlbSB3YXMgYWxyZWFkeSBmaXhlZAogICBieSBK9nJuJ3MgcmVjZW50ICNpbmNsdWRlIG1vZGlmaWNhdGlvbnMhCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMCk6CiAtIE9za2FyIExpbGplYmxhZCBwb2ludGVkIG91dCBhbmQgY29ycmVjdGVkIGEgcHJvYmxlbQogICBpbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBzeXN0ZW0gdGhhdCBtYWRlIGN1cmwgZm9sbG93aW5nIGEgbG9jYXRpb246IHRvIGEKICAgZGlmZmVyZW50IHByb3RvY29sIHRvIGZhaWwuCgogICBBdCBKYW51YXJ5IDMxc3QgSSByZS1jb25zaWRlcmVkIHRoaXMgZml4IGFuZCB0aGUgc3Vycm91bmRpbmcgc291cmNlIGNvZGUuIEkKICAgY291bGQgbm90IHJlYWxseSBzZWUgdGhhdCB0aGUgcGF0Y2ggZGlkIGFueSBkaWZmZXJlbmNlLCB3aHkgSSByZW1vdmVkIGl0CiAgIGFnYWluIGZvciBmdXJ0aGVyIHJlc2VhcmNoIGFuZCBkZWJ1Z2dpbmcuIChJdCBkaXNhYmxlZCBsb2NhdGlvbjogZm9sbG93aW5nCiAgIG9uIHNlcnZlciBub3QgcnVubmluZyBvbiBkZWZhdWx0IHBvcnRzLikKCiAtIEr2cm4gSGFydHJvdGggYnJvdWdodCBhIGZpeCB0aGF0IG9uY2UgYWdhaW4KICAgbWFkZSBpdCBwb3NzaWJsZSB0byBzZWxlY3QgcHJvZ3Jlc3MgYmFyLgoKIC0gSvZybiBhbHNvIGZpeGVkIGEgZmV3IGluY2x1ZGUgcHJvYmxlbXMuCgpWZXJzaW9uIDYuNAoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDApOgogLSBCYXNlZCBvbiBzdWdnZXN0aW9ucyBmcm9tIEJq9nJuIFN0ZW5iZXJnLCBJIG1hZGUgdGhlCiAgIHByb2dyZXNzIGRlYWwgYmV0dGVyIHdpdGggbGFyZ2VyIGZpbGVzIGFuZCBhZGRlZCBhICJUaW1lIiBmaWVsZCB3aGljaCBzaG93cwogICB0aGUgdGltZSBzcGVudCBvbiB0aGUgZG93bmxvYWQgc28gZmFyLgogLSBJJ20gbm93IHVzaW5nIHRoZSBDVlMgcmVwb3NpdG9yeSBvbiBzb3VyY2Vmb3JnZS5uZXQsIHdoaWNoIGFsc28gYWxsb3dzIHdlYgogICBicm93c2luZy4gU2VlIGh0dHA6Ly9jdXJsLmhheHgubnUuCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwMCk6CiAtIFJlbnVtYmVyZWQgc29tZSBlbnVtcyBpbiBjdXJsL2N1cmwuaCBzaW5jZSB0YWcgbnVtYmVyIDM1IHdhcyB1c2VkIHR3aWNlIQogLSBBZGRlZCAicG9zdHF1b3RlIiBzdXBwb3J0IHRvIHRoZSBmdHAgc2VjdGlvbiB0aGF0IGVuYWJsZXMgcG9zdC1mdHAtdHJhbnNmZXIKICAgcXVvdGUgY29tbWFuZHMuCiAtIE5vdyBtYWRlIHRoZSAtUS8tLXF1b3RlIHBhcmFtZXRlciByZWNvZ25pemUgJy0nIGFzIGEgcHJlZml4LCB3aGljaCBtZWFucwogICB0aGF0IGNvbW1hbmQgd2lsbCBiZSBpc3N1ZWQgQUZURVIgYSBzdWNjZXNzZnVsIGZ0cCB0cmFuc2Zlci4gVGhpcyBjYW4gb2YKICAgY291cnNlIGJlIHVzZWQgdG8gZGVsZXRlIG9yIHJlbmFtZSBhIGZpbGUgYWZ0ZXIgaXQgaGFzIGJlZW4gdXBsb2FkZWQgb3IKICAgZG93bmxvYWRlZC4gVXNlIHlvdXIgaW1hZ2luYXRpb24hIDstKQogLSBTaW5jZSBJIGRvIHRoZSBtYWluIGRldmVsb3BtZW50IG9uIHNvbGFyaXMgMi42IG5vdywgSSBoYWQgdG8gZG93bmxvYWQgYW5kCiAgIGluc3RhbGwgR05VIGdyb2ZmIHRvIGdlbmVyYXRlIHRoZSBodWdlaGVscC5jIGZpbGUuIFRoZSBzb2xhcmlzIG5yb2ZmIGNvcmVzCiAgIG9uIHRoZSBtYW4gcGFnZSEgU28sIGluIG9yZGVyIHRvIG1ha2UgdGhlIHNvbGFyaXMgY29uZmlndXJlIHNjcmlwdCBmaW5kIGEKICAgYmV0dGVyIHJlc3VsdCBJIG1hZGUgZ25yb2ZmIGdldCBjaGVja2VkIHByaW9yIHRvIHRoZSByZWd1bGFyIG5yb2ZmLgogLSBBZGRlZCBhbGwgdGhlIGN1cmwgZXhpdCBjb2RlcyB0byB0aGUgbWFuIHBhZ2UuCiAtIEppbSBHYWxsYWdoZXIgcHJvcGVybHkgdHJhY2tlZCBkb3duIGEgYnVnIGluIGF1dG9jb25mCiAgIDIuMTMuIFRoZSBBQ19DSEVDS19MSUIoKSBtYWNybyB3cm9uZ2Z1bGx5IHVzZXMgdGhlIC1sIGZsYWcgYmVmb3JlIHRoZSAtTAogICBmbGFnIHRvICdsZCcgd2hpY2ggY2F1c2VzIHRoZSBIUC1VWCAxMC4yMCBmbGF2b3VyIHRvIGZhaWwgb24gYWxsIGxpYmNoZWNrcwogICBhbmQgdGhlcmVmb3JlIHlvdSBjYW4ndCBtYWtlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmQgdGhlIG9wZW5zc2wgbGlicyEKCkRhbmllbCAoMjggRGVjZW1iZXIgMTk5OSk6CiAtIFRpbSBWZXJob2V2ZW4gY29ycmVjdGx5IGlkZW50aWZpZWQgdGhhdCBjdXJsCiAgIGRvZXNuJ3Qgc3VwcG9ydCBVUkwgZm9ybWF0dGVkIGZpbGUgbmFtZXMgd2hlbiBnZXR0aW5nIGZ0cC4gTm93LCB0aGVyZSdzIGEKICAgcHJvYmxlbSB3aXRoIGdldHRpbmcgdmVyeSB3ZWlyZCBmaWxlIG5hbWVzIG9mZiBGVFAgc2VydmVycy4gUkZDIDk1OSBkZWZpbmVzCiAgIHRoYXQgdGhlIGZpbGUgbmFtZSBzeW50YXggdG8gdXNlIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbiB0aGUgbmF0aXZlIE9TIG9mCiAgIHRoZSBzZXJ2ZXIuIFNpbmNlIHdlIGRvbid0IGtub3cgdGhlIHBlZXIgc2VydmVyIHN5c3RlbSB3ZSBjdXJyZW50bHkganVzdAogICB0cmFuc2xhdGUgdGhlIFVSTCBzeW50YXggaW50byBwbGFpbiBsZXR0ZXJzLiBJdCBpcyBzdGlsbCBiZXR0ZXIgYW5kIHdpdGgKICAgdGhlIHNvbGFyaXMgMi42LXN1cHBsaWVkIGZ0cCBzZXJ2ZXIgaXQgd29ya3Mgd2l0aCBzcGFjZXMgaW4gdGhlIGZpbGUgbmFtZXMuCgpEYW5pZWwgKDI3IERlY2VtYmVyIDE5OTkpOgogLSBXaGVuIGN1cmwgcGFyc2VkIGNvb2tpZXMgc3RyYWlnaHQgb2ZmIGEgcmVtb3RlIHNpdGUsIGl0IGNvcnJ1cHRlZCB0aGUgaW5wdXQKICAgZGF0YSwgd2hpY2gsIGlmIHRoZSBkb3dubG9hZGVkIGhlYWRlcnMgd2VyZSBzdG9yZWQgbWFkZSB2ZXJ5IG9kZCBjaGFyYWN0ZXJzCiAgIGluIHRoZSBzYXZlZCBkYXRhLiBDb3JyZWN0bHkgaWRlbnRpZmllZCBhbmQgcmVwb3J0ZWQgYnkgUGF1bCBIYXJyaW5ndG9uLgoKRGFuaWVsICgxMyBEZWNlbWJlciAxOTk5KToKIC0gR2VuZXJhbCBjbGVhbnVwcyBpbiB0aGUgbGlicmFyeSBpbnRlcmZhY2UuIFRoZXJlIGhhZCBiZWVuIHNvbWUgYmFkIGtsdWRnZXMKICAgYWRkZWQgZHVyaW5nIHRpbWVzIG9mIHN0cmVzcyBhbmQgSSBkaWQgbXkgYmVzdCB0byBjbGVhbiB0aGVtIG9mZi4gSXQgd2FzCiAgIGJvdGggcmVnYXJkaW5nIHRoZSBsaWIgQVBJIGFzIHdlbGwgYXMgaW5jbHVkZSBmaWxlIGNvbmZ1c2lvbnMuCgpEYW5pZWwgKDMgRGVjZW1iZXIgMTk5OSk6CiAtIEEgc21hbGwgLS1zdGRlcnIgYnVnIHdhcyByZXBvcnRlZCBieSBFZXR1IE9qYW5lbi4uLgoKIC0gd2hvIGFsc28gYnJvdWdodCB0aGUgc3VnZ2VzdGlvbiBvZiBleHRlbmRpbmcgdGhlIC1YIGZsYWcgdG8gZnRwIGxpc3QgYXMKICAgd2VsbC4gU28sIG5vdyBpdCBpcyBhbmQgdGhlIGxvbmcgb3B0aW9uIGlzIG5vdyAtLXJlcXVlc3QgaW5zdGVhZC4gSXQgaXMKICAgb25seSBmb3IgZnRwIGxpc3QgZm9yIG5vdyAoYW5kIHRoZSBmb3JtZXIgaHR0cCBzdHVmZiB0b28gb2YgY291cnNlKS4KCkxhcnMgSi4gQWFzICgyNCBOb3ZlbWJlciAxOTk5KToKIC0gUGF0Y2hlZCBjdXJsIHRvIGNvbXBpbGUgYW5kIGJ1aWxkIHVuZGVyIEJlT1MuIERvZXNuJ3Qgd29yayB5ZXQgdGhvdWdoIQoKIC0gQ29ycmVjdGVkIHRoZSBNYWtlZmlsZS5hbSBmaWxlcyB0byBhbGxvdyBwdXR0aW5nIG9iamVjdCBmaWxlcyBpbgogICBkaWZmZXJlbnQgZGlyZWN0b3JpZXMgdGhhbiB0aGUgc291cmNlcy4KClZlcnNpb24gNi4zLjEKCkRhbmllbCAoMjMgTm92ZW1iZXIgMTk5OSk6CiAtIEkndmUgaGFkIHRoaXMgbWFqb3IgZGlzayBjcmFzaC4gTXkgZ29vZCBvbGQgdHJ1c3Qtd29ydGh5IHNvdXJjZSBkaXNrIGRpZWQKICAgYWxvbmcgd2l0aCB0aGUgbWFjaGluZSB0aGF0IGhvc3RlZCBpdC4gVGhhbmsgZ29vZG5lc3MgbW9zdCBvZiBhbGwgdGhlCiAgIHRoaW5ncyBJJ3ZlIGRvbmUgYXJlIGVpdGhlciBiYWNrZWQgdXAgZWxzZXdoZXJlIG9yIHN0b3JlZCBpbiB0aGlzIENWUwogICBzZXJ2ZXIhCgogLSBNaWNoYWVsIFMuIFN0ZXVlciBwb2ludGVkIG91dCBhIGJ1ZyBpbiB0aGUgLUYgaGFuZGxpbmcKICAgdGhhdCBtYWRlIGN1cmwgaGFuZyBpZiB5b3UgcG9zdGVkIGFuIGVtcHR5IHZhcmlhYmxlIHN1Y2ggYXMgJy1GIG5hbWU9Jy4gSXQKICAgd2FzIG9uZSBvZiB0aG9zZSBvbGQgYnVncyB0aGF0IG5ldmVyIGhhdmUgd29ya2VkIHByb3Blcmx5Li4uCgogLSBKYXNvbiBCYWlldHRvIHBvaW50ZWQgb3V0IGEgZ2VuZXJhbCBmbGF3IGluIHRoZSBIVFRQCiAgIGRvd25sb2FkLiBDdXJsIGRpZG4ndCBjb21wbGFpbiBpZiBpdCB3YXMgcHJlbWF0dXJlbHkgYWJvcnRlZCBiZWZvcmUgdGhlCiAgIGVudGlyZSBkb3dubG9hZCB3YXMgY29tcGxldGVkLiBJdCBkb2VzIG5vdy4KCkRhbmllbCAoMTkgTm92ZW1iZXIgMTk5OSk6CiAtIENocmlzIE1hbHRieSB2ZXJ5IGFjY3VyYXRlbHkgY3JpdGljaXplZCB0aGUgbGFjayBvZgogICByZXR1cm4gY29kZSBjaGVja3Mgb24gdGhlIGZ3cml0ZSgpIGNhbGxzLiBJIGRpZCBhIHRob3JvdWdoIGNoZWNrIGZvciBhbGwKICAgb2NjdXJyZW5jZXMgYW5kIGNvcnJlY3RlZCB0aGlzLgoKRGFuaWVsICgxNyBOb3ZlbWJlciAxOTk5KToKIC0gUGF1bCBIYXJyaW5ndG9uIHBvaW50ZWQgb3V0IHRoYXQgdGhlIC1tLy0tbWF4LXRpbWUgb3B0aW9uCiAgIGRvZXNuJ3Qgd29yayBmb3IgdGhlIHNsb3cgc3lzdGVtIGNhbGxzIGxpa2UgZ2V0aG9zdGJ5bmFtZSgpLi4uIEkgZG9uJ3QgaGF2ZQogICBhbnkgZ29vZCBmaXggeWV0LCBqdXN0IGEgc2xpZ2h0bHkgbGVzcyBiYWQgb25lIHRoYXQgbWFrZXMgY3VybCBleGl0IGhhcmQKICAgd2hlbiB0aGUgdGltZW91dCBpcyByZWFjaGVkLgoKIC0gQmpvcm4gUmVlc2UgaGVscGVkIG1lIHBvaW50IG91dCBhIHBvc3NpYmxlIHByb2JsZW0gdGhhdCBtaWdodCBiZSB0aGUgcmVhc29uCiAgIHdoeSBUaG9tYXMgSHVyc3QgZXhwZXJpZW5jZSBwcm9ibGVtcyBpbiBoaXMgQW1pZ2EgdmVyc2lvbi4KCiBEYW5pZWwgKDEyIE5vdmVtYmVyIDE5OTkpOgogLSBJIGZvdW5kIGEgY3Jhc2ggaW4gdGhlIG5ldyBjb29raWUgZmlsZSBwYXJzZXIuIEl0IGNyYXNoZWQgd2hlbiB5b3UgZ2F2ZQogICBhIHBsYWluIGh0dHAgaGVhZGVyIGZpbGUgYXMgaW5wdXQuLi4KClZlcnNpb24gNi4zCgogRGFuaWVsICgxMCBOb3ZlbWJlciAxOTk5KToKIC0gSSBraW5kIG9mIGZvdW5kIG91dCB0aGF0IHRoZSBIVFRQIHRpbWUtY29uZGl0aW9uYWwgR0VUcyAoLXopIGFyZW4ndCBhbHdheXMKICAgcmVzcGVjdGVkIGJ5IHRoZSB3ZWIgc2VydmVyIGFuZCB0aGUgZG9jdW1lbnQgaXMgdGhlcmVmb3JlIHNlbnQgaW4gd2hvbGUKICAgYWdhaW4sIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgbWF0Y2ggdGhlIHJlcXVlc3RlZCBjb25kaXRpb24uIEFmdGVyIHJlYWRpbmcKICAgc2VjdGlvbiAxMy4zLjQgb2YgUkZDIDI2MTYsIEkgdGhpbmsgSSdtIGRvaW5nIHRoZSByaWdodCB0aGluZyBub3cgd2hlbiBJIGRvCiAgIG15IG93biBjaGVjayBhcyB3ZWxsLiBJZiBjdXJsIHRoaW5rcyB0aGUgY29uZGl0aW9uIGlzbid0IG1ldCwgdGhlIHRyYW5zZmVyCiAgIGlzIGFib3J0ZWQgcHJlbWF0dXJlbHkgKGFmdGVyIGFsbCB0aGUgaGVhZGVycyBoYXZlIGJlZW4gcmVjZWl2ZWQpLgoKIC0gQWZ0ZXIgY29tbWVudHMgZnJvbSBSb2JlcnQgTGluZGVuIEkgYWxzbyByZXdyb3RlIHNvbWUgcGFydHMgb2YgdGhlIG1hbiBwYWdlCiAgIHRvIGJldHRlciBkZXNjcmliZSBob3cgdGhlIC1GIHdvcmtzLgoKIC0gTWljaGFlbCBBbnRpIHB1dCB1cCBhIG5ldyBjdXJsIGRvd25sb2FkIG1pcnJvciBpbgogICBDaGluYTogIGh0dHA6Ly93d3cucHNob3dpbmcuY29tL2N1cmwvCgogLSBJIGFkZGVkIHRoZSBsaXN0IG9mIGRvd25sb2FkIG1pcnJvcnMgdG8gdGhlIFJFQURNRSBmaWxlCgogLSBJIGRpZCBhZGQgbW9yZSBleHBsYW5hdGlvbnMgdG8gdGhlIG1hbiBwYWdlCgogRGFuaWVsICg4IE5vdmVtYmVyIDE5OTkpOgogLSBJIG1hZGUgdGhlIC1iLy0tY29va2llIG9wdGlvbiBjYXBhYmxlIG9mIHJlYWRpbmcgbmV0c2NhcGUgZm9ybWF0dGVkIGNvb2tpZQogICBmaWxlcyBhcyB3ZWxsIGFzIG5vcm1hbCBodHRwLWhlYWRlciBmaWxlcy4gSXQgc2hvdWxkIGJlIGFibGUgdG8KICAgdHJhbnNwYXJlbnRseSBmaWd1cmUgb3V0IHdoYXQga2luZCBvZiBmaWxlIGl0IGdvdCBhcyBpbnB1dC4KCiBEYW5pZWwgKDI5IE9jdG9iZXIgMTk5OSk6CiAtIEFub3RoZXIgb25lIG9mIFNlYmFzdGlhYW4gdmFuIEVyaydzIGlkZWFzICh0aGF0IGhhcyBiZWVuIHJlcXVlc3RlZCBiZWZvcmUKICAgYnV0IEkgc2VlbSB0byBoYXZlIGZvcmdvdHRlbiB3aG8gaXQgd2FzKSwgaXMgdG8gYWRkIHN1cHBvcnQgZm9yIHJhbmdlcyBpbgogICBGVFAgZG93bmxvYWRzLiBBcyB1c3VhbCwgb25lIHJlcXVlc3QgaXMganVzdCBhIHJlcXVlc3QsIHdoZW4gdGhleSdyZSB0d28KICAgaXQgaXMgYSBkZW1hbmQuIEkndmUgYWRkZWQgc2ltcGxlIHN1cHBvcnQgZm9yIFgtWSBzdHlsZSBmZXRjaGVzLiBYIGhhcyB0bwogICBiZSB0aGUgbG93ZXIgbnVtYmVyLCB0aG91Z2ggeW91IG1heSBvbWl0IG9uZSBvZiB0aGUgbnVtYmVycy4gVXNlIHRoZSAtci8KICAgLS1yYW5nZSBzd2l0Y2ggKHByZXZpb3VzbHkgSFRUUC1vbmx5KS4KCiAtIFNlYmFzdGlhYW4gdmFuIEVyayBzdWdnZXN0ZWQgdGhhdCBjdXJsIHNob3VsZCBiZQogICBhYmxlIHRvIHNob3cgdGhlIGZpbGUgc2l6ZSBvZiBhIHNwZWNpZmllZCBmaWxlLiBJIHRoaW5rIHRoaXMgaXMgYSBzcGxlbmRpZAogICBpZGVhIGFuZCB0aGUgLUkgZmxhZyBpcyBub3cgd29ya2luZyBmb3IgRlRQLiBJdCBkaXNwbGF5cyB0aGUgZmlsZSBzaXplIGluCiAgIHRoaXMgbWFubmVyOgogICAgICAgIENvbnRlbnQtTGVuZ3RoOiBYWFhYCiAgIEFzIGl0IHJlc2VtYmxlcyBub3JtYWwgaGVhZGVycywgYW5kIGxlYXZlcyB1cyB0aGUgb3Bwb3J0dW5pdHkgdG8gYWRkIG1vcmUKICAgaW5mbyBpbiB0aGF0IGRpc3BsYXkgaWYgd2UgY2FuIGNvbWUgdXAgd2l0aCBtb3JlIGluIHRoZSBmdXR1cmUhIEl0IGFsc28KICAgbWFrZXMgc2Vuc2Ugc2luY2UgaWYgeW91IGFjY2VzcyBmdHAgdGhyb3VnaCBhIEhUVFAgcHJveHksIHlvdSdkIGdldCB0aGUKICAgZmlsZSBzaXplIHRoZSBzYW1lIHdheS4KCiAgIEkgY2hhbmdlZCB0aGUgb3JkZXIgb2YgdGhlIFFVT1RFIGNvbW1hbmQgZXhlY3V0aW9ucy4gVGhleSdyZSBub3cgZXhlY3V0ZWQKICAganVzdCBhZnRlciB0aGUgbG9naW4gYW5kIGJlZm9yZSBhbnkgb3RoZXIgY29tbWFuZC4gSSBtYWRlIHRoaXMgdG8gZW5hYmxlCiAgIHF1b3RlIGNvbW1hbmRzIHRvIHJ1biBiZWZvcmUgdGhlIC1JIHN0dWZmIGlzIGRvbmUgdG9vLgoKIC0gSSBmb3VuZCBvdXQgdGhhdCAtRC8tLWR1bXAtaGVhZGVyIGFuZCAtVi8tLXZlcnNpb24gd2VyZW4ndCBkb2N1bWVudGVkIGluCiAgIHRoZSBtYW4gcGFnZS4KCiAtIE1hbnkgSFRUUC8xLjEgc2VydmVycyBkbyBub3Qgc3VwcG9ydCByYW5nZXMuIERvbid0IGFzayBtZSB3aHkuIEkgZGlkIGFkZAogICBzb21lIHRleHQgYWJvdXQgdGhpcyBpbiB0aGUgbWFuIHBhZ2UgZm9yIHRoZSByYW5nZSBvcHRpb24uIFRoZSB0aHJlYWQgaW4KICAgdGhlIG1haWxpbmcgbGlzdCB0aGF0IHN0YXJ0ZWQgdGhpcyB3YXMgaW5pdGlhdGVkIGJ5IE1pY2hhZWwgQW50aS4KCiAtIEkgZ2V0IHJlcG9ydHMgYWJvdXQgbnJvZmYgY3Jhc2hlcyBvbiBzb2xhcmlzIDIuNisgd2hlbiBkaXNwbGF5aW5nIHRoZSBjdXJsCiAgIG1hbiBwYWdlLiBTd2l0Y2ggdG8gZ25yb2ZmIGluc3RlYWQsIGl0IGlzIHJlcG9ydGVkIHRvIHdvcmsoISkuIEFkYW0gQmFyY2xheQogICByZXBvcnRlZCBhbmQgYnJvdWdodCB0aGUgc3VnZ2VzdGlvbi4KCiAtIEluIGEgZGlhbG9ndWUgd2l0aCBKb2hhbm5lcyBHLiBLcmlzdGluc3NvbiB3ZSBjYW1lCiAgIHVwIHdpdGggdGhlIGlkZWEgdG8gbGV0IC1ILy0taGVhZGVyIHNwZWNpZmllZCBoZWFkZXJzIHJlcGxhY2UgdGhlCiAgIGludGVybmFsbHkgZ2VuZXJhdGVkIGhlYWRlcnMsIGlmIHlvdSBoYXBwZW5lZCB0byBzZWxlY3QgdG8gYWRkIGEgaGVhZGVyCiAgIHRoYXQgY3VybCBub3JtYWxseSB1c2VzIGJ5IGl0c2VsZi4gVGhlIGFkdmFudGFnZSB3aXRoIHRoaXMgaXMgbm90IGVudGlyZWx5CiAgIG9idmlvdXMsIGJ1dCBpbiBKb2hhbm5lcycgY2FzZSBpdCBtZWFucyB0aGF0IGhlIGNhbiB1c2UgYW5vdGhlciBIb3N0OiB0aGFuCiAgIHRoZSBvbmUgY3VybCB3b3VsZCBzZXQuCgogRGFuaWVsICgyNyBPY3RvYmVyIDE5OTkpOgogLSBKb25na2kgU3V3YW5kaSBicm91Z2h0IGEgbmljZSBwYXRjaCBmb3IgKHlldCBhbm90aGVyKSBjcmFzaCB3aGVuIGZvbGxvd2luZwogICBhIGxvY2F0aW9uOi4gVGhpcyB0aW1lIHlvdSBoYWQgdG8gZm9sbG93IGEgaHR0cHM6Ly8gc2VydmVyJ3MgcmVkaXJlY3QgdG8KICAgZ2V0IHRoZSBjb3JlLgoKVmVyc2lvbiA2LjIKCiBEYW5pZWwgKDIxIE9jdG9iZXIgMTk5OSk6CiAtIEkgdGhpbmsgSSBtYW5hZ2VkIHRvIHJlbW92ZSB0aGUgc3VzcGljaW91cyAobmlsKSB0aGF0IGhhcyBiZWVuIHNlZW4ganVzdAogICBiZWZvcmUgdGhlICJIb3N0OiIgaW4gSFRUUCByZXF1ZXN0cyB3aGVuIC12IHdhcyB1c2VkLgogLSBJIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBmb2xsb3dlZCBhIGxvY2F0aW9uOiB3aGVuIHVzaW5nIGEgcHJveHksIHdpdGhvdXQKICAgaGF2aW5nIHNwZWNpZmllZCBodHRwOi8vIGluIHRoZSBVUkwsIHRoZSBwcm90b2NvbCBwYXJ0IHdhcyBhZGRlZCBvbmNlIGFnYWluCiAgIHdoZW4gbW92aW5nIHRvIHRoZSBuZXh0IFVSTCEgKFRoZSBwcm90b2NvbCBwYXJ0IGhhcyB0byBiZSBhZGRlZCB0byB0aGUKICAgVVJMIHdoZW4gZ29pbmcgdGhyb3VnaCBhIHByb3h5IHNpbmNlIGl0IGhhcyBubyBwcm90b2NvbC1ndWVzc2luZyBzeXN0ZW0KICAgc3VjaCBhcyBjdXJsIGhhcy4pCiAtIEJlbmphbWluIFJpdGNleSByZXBvcnRlZCBhIGNvcmUgZHVtcCB1bmRlciBzb2xhcmlzIDIuNgogICB3aXRoIE9wZW5TU0wgMC45LjQuIEl0IHR1cm5lZCBvdXQgdGhpcyB3YXMgZHVlIHRvIGEgYmFkIGZyZWUoKSBpbiBtYWluLmMKICAgdGhhdCBvY2N1cnJlZCBhZnRlciB0aGUgZG93bmxvYWQgd2FzIGRvbmUgYW5kIGNvbXBsZXRlZC4KIC0gQmVuamFtaW4gZm91bmQgZnRwIGRvd25sb2FkcyB0byBzaG93IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBkb3dubG9hZCBtZXRlcgogICB0byBnZXQgd3JpdHRlbiB0d2ljZSwgYW5kIEkgcmVtb3ZlZCB0aGF0IHByb2JsZW0uIEl0IHdhcyBpbnRyb2R1Y2VkIHdpdGgKICAgdGhlIG11bHRpcGxlIFVSTCBzdXBwb3J0LgogLSBEYW4gWml0dGVyIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IGN1cmwgNi4xIGFuZCBlYXJsaWVyIHZlcnNpb25zIGRpZG4ndAogICBob25vciBSRkMgMjYxNiBjaGFwdGVyIDQgc2VjdGlvbiAyLCAiTWVzc2FnZSBIZWFkZXJzIjogIi4uLkZpZWxkIG5hbWVzIGFyZQogICBjYXNlLWluc2Vuc2l0aXZlLi4uIiAgSFRUUCBoZWFkZXIgcGFyc2luZyBhc3N1bWVkIGEgY2VydGFpbiBjYXNpbmcuIERhbgogICBhbHNvIHByb3ZpZGVkIG1lIHdpdGggYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCB0aGlzLCB3aGljaCBJIHRvb2sgdGhlIGxpYmVydHkKICAgb2YgZWRpdGluZyBzbGlnaHRseS4KIC0gRGFuIFppdHRlciBhbHNvIHByb3ZpZGVkIGEgbmljZSBwYXRjaCBmb3IgY29uZmlnLmd1ZXNzIHRvIGJldHRlciByZWNvZ25pemUKICAgdGhlIE1hYyBPUyBYCiAtIERhbiBhbHNvIGNvcnJlY3RlZCBhIG1pbm9yIHByb2JsZW0gaW4gdGhlIGxpYi9NYWtlZmlsZSB0aGF0IGNhdXNlZCBsaW5raW5nCiAgIHRvIGZhaWwgb24gT1MgWC4KCiBEYW5pZWwgKDE5IE9jdG9iZXIgMTk5OSk6CiAtIExlbiBNYXJpbmFjY2lvIGNhbWUgdXAgd2l0aCBzb21lIHByb2JsZW1zIHdpdGggY3VybC4gIFNpbmNlIFdpbmRvd3MgaGFzIGEKICAgY3JpcHBsZWQgc2hlbGwsIGl0IGNhbid0IHJlZGlyZWN0IHN0ZGVyciBhbmQgdGhhdCBjYXVzZXMgdHJvdWJsZS4gSSBhZGRlZAogICAtLXN0ZGVyciB0b2RheSB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gcmVkaXJlY3QgdGhlIHN0ZGVyciBzdHJlYW0gdG8gYQogICBmaWxlIG9yIHN0ZG91dC4KCiBEYW5pZWwgKDE4IE9jdG9iZXIgMTk5OSk6CiAtIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyB1bmRlcnN0YW5kcyB0aGUgJy0td2l0aG91dC1zc2wnIGZsYWcsIHdoaWNoIG5vdwogICB0b3RhbGx5IGRpc2FibGUgU1NML2h0dHBzIHN1cHBvcnQuIFByZXZpb3VzbHkgaXQgd2Fzbid0IHBvc3NpYmxlIHRvIGZvcmNlCiAgIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGxlYXZlIFNTTCBhbG9uZS4gVGhlIHByZXZpb3VzIGZ1bmN0aW9uYWxpdHkgaGFzCiAgIGJlZW4gcmV0YWluZWQuIFRyb3kgRW5nZWwgaGVscGVkIHRlc3QgdGhpcyBuZXcgb25lLgoKVmVyc2lvbiA2LjEKCiBEYW5pZWwgKDE3IE9jdG9iZXIgMTk5OSk6CiAtIEkgaWZkZWYnZWQgb3IgY29tbWVudGVkIGFsbCB0aGUgemxpYiBzdHVmZiBpbiB0aGUgc291cmNlcyBhbmQgY29uZmlndXJlCiAgIHNjcmlwdC4gSXQgdHVybmVkIG91dCB3ZSBuZWVkZWQgdG8gbW9jayBtb3JlIHdpdGggemxpYiB0aGFuIEkgaW5pdGlhbGx5CiAgIHRob3VnaHQsIHRvIG1ha2UgaXQgY2FwYWJsZSBvZiBkb3dubG9hZGluZyBjb21wcmVzc2VkIEhUVFAgZG9jdW1lbnRzIGFuZAogICB1bmNvbXByZXNzIHRoZW0gb24gdGhlIGZseS4gSSBkaWRuJ3QgbWVhbiB0aGUgemxpYiBwYXJ0cyBvZiBjdXJsIHRvIGJlY29tZQogICBtb3JlIHRoYW4gbWlub3Igc28gdGhpcyBtZWFucyBJIGhhbHQgdGhlIHpsaWIgZXhwZWRpdGlvbiBmb3Igbm93IGFuZCB3YWl0CiAgIHVudGlsIHNvbWVvbmUgZWl0aGVyIHdyaXRlcyB0aGUgY29kZSBvciB6bGliIGdldHMgdXBkYXRlZCBhbmQgYmV0dGVyCiAgIGFkanVzdGVkIGZvciB0aGlzIGtpbmQgb2YgdXNhZ2UuICBJIHdvbid0IGdldCBpbnRvIGRldGFpbHMgaGVyZSwgYnV0IGEKICAgc2hvcnQgYSBzdW1tYXJ5IGlzIHN1aXRhYmxlOgogICAtIHpsaWIgY2FuJ3QgYXV0b21hdGljYWxseSBkZXRlY3Qgd2hldGhlciB0byB1c2UgemxpYiBvciBnemlwCiAgICAgZGVjb21wcmVzc2lvbiBtZXRob2RzLgogICAtIHpsaWIgaXMgdmVyeSBuZWF0IGZvciByZWFkaW5nIGd6aXBwZWQgZmlsZXMgZnJvbSBhIGZpbGUgZGVzY3JpcHRvciwKICAgICBhbHRob3VnaCBub3QgYXMgbmljZSBmb3IgcmVhZGluZyBidWZmZXItYmFzZWQgZGF0YSBzdWNoIGFzIHdlIHdvdWxkCiAgICAgd2FudCBpdC4KICAgLSB0aGVyZSBhcmUgc3RpbGwgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSB3aW4zMiB2ZXJzaW9uIHdoZW4gcmVhZGluZyBmcm9tCiAgICAgYSBmaWxlIGRlc2NyaXB0b3IgaWYgdGhhdCBpcyBhIHNvY2tldAoKIERhbmllbCAoMTQgT2N0b2JlciAxOTk5KToKIC0gTW92ZWQgdGhlIChleHRlcm5hbCkgaW5jbHVkZSBmaWxlcyBmb3IgbGliY3VybCBpbnRvIGEgc3ViZGlyZWN0b3J5IG5hbWVkCiAgIGN1cmwgYW5kIGFkanVzdGVkIGFsbCAjaW5jbHVkZSBsaW5lcyB0byB1c2UgPGN1cmwvWFhYWD4gdG8gbWFpbnRhaW4gYQogICBiZXR0ZXIgbmFtZSBzcGFjZSBhbmQgY29udHJvbCBvZiB0aGUgaGVhZGVycy4gVGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQuCgogRGFuaWVsICgxMiBPY3RvYmVyIDE5OTkpOgogLSBJIG1vZGlmaWVkIHRoZSAnbWFrZXRneicgc2NyaXB0IHRvIHBlcmZvcm0gYSAnbWFrZScgdG9vIGJlZm9yZSBhIHJlbGVhc2UKICAgYXJjaGl2ZSBpcyBwdXQgdG9nZXRoZXIgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSB0aW1lIHN0YW1wcyBiZXR0ZXIgYW5kCiAgIGhvcGVmdWxseSBhdm9pZCB0aGUgZG91YmxlIGNvbmZpZ3VyZS1ydW5uaW5nIHRoYXQgdXNlIHRvIG9jY3VyLgoKIERhbmllbCAoMTEgT2N0b2JlciAxOTk5KToKIC0gQXBwbGllZCBK9nJuJ3MgcGF0Y2hlcyB0aGF0IGZpeGVzIHpsaWIgZm9yIG1pbmd3MzIgY29tcGlsZXMgYXMgd2VsbCBhcwogICBzb21lIG90aGVyIG1pc3NpbmcgemxpYiAjaWZkZWYgYW5kIG1vcmUgdGV4dCBvbiB0aGUgbXVsdGlwbGUgVVJMIGRvY3MgaW4KICAgdGhlIG1hbiBwYWdlLgoKVmVyc2lvbiA2LjFiZXRhCgogRGFuaWVsICg2IE9jdG9iZXIgMTk5OSk6CiAtIERvdWdsYXMgRS4gV2Vnc2NoZWlkIHNlbnQgbWUgYSBwYXRjaCB0aGF0IG1hZGUgdGhlIGV4YWN0IHNhbWUgdGhpbmcgYXMgSQogICBqdXN0IG1hZGU6IHRoZSAtZCBzd2l0Y2ggaXMgbm93IGNhcGFibGUgb2YgcmVhZGluZyBwb3N0IGRhdGEgZnJvbSBhIG5hbWVkCiAgIGZpbGUgb3Igc3RkaW4uICBVc2UgaXQgc2ltaWxhcmx5IHRvIHRoZSAtRi4gVG8gcmVhZCB0aGUgcG9zdCBkYXRhIGZyb20gYQogICBnaXZlbiBmaWxlOgoKICAgICAgICBjdXJsIC1kIEBwYXRoL3RvL2ZpbGVuYW1lIHd3dy5wb3N0c2l0ZS5jb20KCiAgIG9yIGxldCBjdXJsIHJlYWQgaXQgb3V0IGZyb20gc3RkaW46CgogICAgICAgIGN1cmwgLWQgQC0gd3d3LnBvc3RpdC5jb20KCiBK9nJuIEhhcnRyb3RoICgzIE9jdG9iZXIgMTk5OSk6CiAtIEJyb3VnaHQgc29tZSBtb3JlIHBhdGNoZXMgZm9yIG11bHRpcGxlIFVSTCBmdW5jdGlvbmFsaXR5LiBUaGUgTUlNRQogICBzZXBhcmF0aW9uIGlkZWFzIGFyZSBhbG1vc3Qgc2NyYXBwZWQgbm93LCBhbmQgYSBjdXN0b20gc2VwYXJhdG9yIGlzIGJlaW5nCiAgIHVzZWQgaW5zdGVhZC4gVGhpcyBpcyBzdGlsbCBjb21waWxlLXRpbWUgImZsYWdnZWQiLgoKIERhbmllbAogLSBVcGRhdGVkIGN1cmwuMSB3aXRoIG11bHRpcGxlIFVSTCBpbmZvLgoKIERhbmllbCAoMzAgU2VwdGVtYmVyIDE5OTkpOgogLSBGZWxpeCB2b24gTGVpdG5lciBicm91Z2h0IG9wZW5zc2wtY2hlY2sgZml4ZXMgZm9yIGNvbmZpZ3VyZS5pbiB0byB3b3JrCiAgIG91dC1vZi10aGUtYm94IHdoZW4gdGhlIG9wZW5zc2wgZmlsZXMgYXJlIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtIGRlZmF1bHQKICAgZGlycy4KCiBEYW5pZWwgKDI4IFNlcHRlbWJlciAxOTk5KQogLSBBZGRlZCBsaWJ6IGZ1bmN0aW9uYWxpdHkuIFRoaXMgc2hvdWxkIGVuYWJsZSBkZWNvbXByZXNzaW5nIGd6aXAsIGNvbXByZXNzCiAgIG9yIGRlZmxhdGUgZW5jb2RpbmcgSFRUUCBkb2N1bWVudHMuIEl0IGFsc28gbWFrZXMgY3VybCBzZW5kIGFuIGFjY2VwdCB0aGF0CiAgIGl0IGFjY2VwdHMgdGhhdCBraW5kIG9mIGVuY29kaW5nLiBDb21wcmVzc2VkIGNvbnRlbnRzIHVzdWFsbHkgc2hvcnRlbnMKICAgZG93bmxvYWQgdGltZS4gSSAqbmVlZCogc29tZW9uZSB0byB0ZWxsIG1lIGEgc2l0ZSB0aGF0IHVzZXMgY29tcHJlc3NlZCBIVFRQCiAgIGRvY3VtZW50cyBzbyB0aGF0IEkgY2FuIHRlc3QgdGhpcyBvdXQgcHJvcGVybHkuCgogLSBBcyBhIHJlc3VsdCBvZiB0aGUgYWRkaW5nIG9mIHpsaWIgYXdhcmVuZXNzLCBJIGNoYW5nZWQgdGhlIHZlcnNpb24gc3RyaW5nCiAgIGEgbGl0dGxlLiBJIHBsYW4gdG8gYWRkIG9wZW5sZGFwIHZlcnNpb24gcmVwb3J0aW5nIGluIHRoZXJlIHRvby4KCiBEYW5pZWwgKDE3IFNlcHRlbWJlciAxOTk5KQogLSBNYWRlIHRoZSAtRiBvcHRpb24gYWxsb3cgc3RkaW4gd2hlbiBzcGVjaWZ5aW5nIGZpbGVzLiBCeSB1c2luZyAnLScgaW5zdGVhZAogICBvZiBmaWxlIG5hbWUsIHRoZSBkYXRhIHdpbGwgYmUgcmVhZCBmcm9tIHN0ZGluLgoKVmVyc2lvbiA2LjAKCiBEYW5pZWwgKDEzIFNlcHRlbWJlciAxOTk5KQogLSBBZGRlZCAtWC8tLWh0dHAtcmVxdWVzdCA8cmVxdWVzdD4gdG8gZW5hYmxlIGFueSBIVFRQIGNvbW1hbmQgdG8gYmUgc2VudC4KICAgRG8gbm90IHRoYXQgeW91ciBzZXJ2ZXIgaGFzIHRvIHN1cHBvcnQgdGhlIGV4YWN0IHN0cmluZyB5b3UgZW50ZXIuIFRoaXMKICAgc2hvdWxkIHBvc3NpYmx5IGEgc3RyaW5nIGxpa2UgREVMRVRFIG9yIFRSQUNFLgoKIC0gQXBwbGllZCBEb3VnbGFzJyBtaW5ndzMyLWZpeGVzIGZvciB0aGUgbWFrZWZpbGVzLgoKIERhbmllbCAoMTAgU2VwdGVtYmVyIDE5OTkpCiAtIERvdWdsYXMgRS4gV2Vnc2NoZWlkIHBvaW50ZWQgb3V0IGEgcHJvYmxlbS4gQ3VybCBkaWRuJ3QgY2hlY2sgdGhlIEZUUAogICBzZXJ2ZXJzIHJldHVybiBjb2RlIHByb3Blcmx5IGFmdGVyIHRoZSAtLXF1b3RlIGNvbW1hbmRzIHdlcmUgaXNzdWVkLiBJdAogICB0b29rIGFueXRoaW5nIG5vbiAyMDAgYXMgYW4gZXJyb3IsIHdoZW4gYWxsIDJYWCBjb2RlcyBzaG91bGQgYmUgYWNjZXB0ZWQgYXMKICAgT0suCgogLSBTZW5kaW5nIGNvb2tpZXMgdG8gdGhlIHNhbWUgc2l0ZSBpbiBtdWx0aXBsZSBsaW5lcyBsaWtlIGN1cmwgdXNlZCB0byBkbwogICB0dXJuZWQgb3V0IHRvIGJlIGJhZCBhbmQgYnJlYWtpbmcgdGhlIGNvb2tpZSBzcGVjcy4gQ3VybCBub3cgc2VuZHMgYWxsCiAgIGNvb2tpZXMgb24gYSBzaW5nbGUgQ29va2llOiBsaW5lLiBDdXJsIGlzIG5vdCB5ZXQgUkZDIDIxMDkgY29tcGxpYW50LCBidXQgSQogICBkb3VidCB0aGF0IG1hbnkgc2VydmVycyBkbyB1c2UgdGhhdCBzeW50YXggKHlldCkuCgogRGFuaWVsICg4IFNlcHRlbWJlciAxOTk5KQogLSBK9nJuIGhlbHBlZCBtZSBtYWtlIHN1cmUgaXQgc3RpbGwgY29tcGlsZXMgbmljZWx5IHdpdGggbWluZ3czMiB1bmRlciB3aW4zMi4KCiBEYW5pZWwgKDcgU2VwdGVtYmVyIDE5OTkpCiAtIEZUUCB1cGxvYWQgdGhyb3VnaCBwcm94eSBpcyBub3cgdHVybmVkIGludG8gYSBIVFRQIFBVVC4gUmVxdWVzdGVkIGJ5CiAgIFN0ZWZhbiBLYW50aGFrLgoKIC0gQWRkZWQgdGhlIGxkYXAgZmlsZXMgdG8gdGhlIC5tMzIgbWFrZWZpbGUuCgogRGFuaWVsICgzIFNlcHRlbWJlciAxOTk5KQogLSBNYWRlIGNvb2tpZSBtYXRjaGluZyB3b3JrIHdoaWxlIHVzaW5nIEhUVFAgcHJveHkuCgogQmpvcm4gUmVlc2UgKDMxIEF1Z3VzdCAxOTk5KQogLSBQYXNzZWQgaGlzIGxkYXA6Ly8gcGF0Y2guIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHRoZSBvcGVubGRhcCBzaGFyZWQKICAgbGlicmFyeSB0byBiZSBpbnN0YWxsZWQgYW5kIHRoYXQgTERfTElCUkFSWV9QQVRIIHBvaW50cyB0byB0aGUKICAgZGlyZWN0b3J5IHdoZXJlIHRoZSBsaWIgd2lsbCBiZSBmb3VuZCB3aGVuIGN1cmwgaXMgcnVuIHdpdGggYQogICBsZGFwOi8vIFVSTC4KCiBK9nJuIEhhcnRyb3RoICgzMSBBdWd1c3QgMTk5OSkKIC0gTWFkZSB0aGUgTWluZ3czMiBtYWtlZmlsZXMgaW50byBzaW5nbGUgZmlsZXMuCiAtIE1hZGUgZmlsZTovLyB3b3JrIGZvciBXaW4zMi4gVGhlIHNhbWUgY29kZSBpcyBub3cgdXNlZCBmb3IgdW5peCBhcyB3ZWxsIGZvcgogICBwZXJmb3JtYW5jZSByZWFzb25zLgoKIERvdWdsYXMgRS4gV2Vnc2NoZWlkICgzMCBBdWd1c3QgMTk5OSkKIC0gUGF0Y2hlZCB0aGUgTWluZ3czMiBtYWtlZmlsZXMgZm9yIFNTTCBidWlsZHMuCgogTWF0dGhldyBDbGFya2UgKDMwIEF1Z3VzdCAxOTk5KQogLSBNYWRlIGEgY29vbCBwYXRjaCBmb3IgY29uZmlndXJlLmluIHRvIGFsbG93IC0td2l0aC1zc2wgdG8gc3BlY2lmeSB0aGUKICAgcm9vdCBkaXIgb2YgdGhlIG9wZW5zc2wgaW5zdGFsbGF0aW9uLCBhcyBpbgoKICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtc3NsPS91c3Ivc3NsX2hlcmUKCiAtIENvcnJlY3RlZCB0aGUgJ3JlY29uZicgc2NyaXB0IHRvIHdvcmsgYmV0dGVyIHdpdGggc29tZSBzaGVsbHMuCgogSvZybiBIYXJ0cm90aCAoMjYgQXVndXN0IDE5OTkpCiAtIEZpeGVkIHRoZSBNaW5ndzMyIG1ha2VmaWxlcyBpbiBsaWIvIGFuZCBjb3JyZWN0ZWQgdGhlIGZpbGUuYyBmb3Igd2luMzIKICAgY29tcGlsZXMuCgpWZXJzaW9uIDUuMTEKCiBEYW5pZWwgKDI1IEF1Z3VzdCAxOTk5KQogLSBKb2huIFdlaXNtaWxsZXIgcG9pbnRlZCBvdXQgYSBidWcgaW4gdGhlIGhlYWRlci1saW5lCiAgIHJlYWxsb2MoKSBzeXN0ZW0gaW4gZG93bmxvYWQuYy4KCiAtIEkgYWRkZWQgbGliL2ZpbGUuW2NoXSB0byBvZmZlciBhIGZpcnN0LCBzaW1wbGUsIGZpbGU6Ly8gc3VwcG9ydC4gSXQKICAgcHJvYmFibHkgd29uJ3QgZG8gbXVjaCBnb29kIG9uIHdpbjMyIHN5c3RlbSBhdCB0aGlzIHBvaW50LCBidXQgSSBzZWUgaXQKICAgYXMgYSBzdGFydC4KCiAtIE1hZGUgdGhlIHJlbGVhc2UgYXJjaGl2ZXMgZ2V0IGEgTWFrZWZpbGUgaW4gdGhlIHJvb3QgZGlyLCB3aGljaCBjYW4gYmUKICAgdXNlZCB0byBzdGFydCB0aGUgY29tcGlsaW5nL2J1aWxkaW5nIHByb2Nlc3MgZWFzaWVyLiBJIGhhdmVuJ3QgcmVhbGx5CiAgIGNoYW5nZWQgYW55IElOU1RBTEwgdGV4dCB5ZXQsIEkgd2FudGVkIHRvIGdldCBzb21lIGZlZWQtYmFjayBvbiB0aGlzCiAgIGZpcnN0LgoKIERhbmllbCAoMTcgQXVndXN0IDE5OTkpCiAtIEFub3RoZXIgTG9jYXRpb246IGJ1Zy4gQ3VybCBkaWRuJ3QgZG8gcHJvcGVyIHJlbGF0aXZlIGxvY2F0aW9ucyBpZiB0aGUKICAgb3JpZ2luYWwgVVJMIGhhZCBjZ2ktcGFyYW1ldGVycyB0aGF0IGNvbnRhaW5lZCBhIHNsYXNoLiBOdXN1J3MgcGFnZQogICBhZ2Fpbi4KCiAtIENvcnJlY3RlZCB0aGUgTk9fUFJPWFkgdXNhZ2UuIEl0IGlzIGEgbGlzdCBvZiBzdWJzdHJpbmdzIHRoYXQgaWYgb25lIG9mCiAgIHRoZW0gbWF0Y2hlcyB0aGUgdGFpbCBvZiB0aGUgaG9zdCBuYW1lIGl0IHNob3VsZCBjb25uZWN0IHRvLCBjdXJsIHNob3VsZAogICBub3QgdXNlIGEgcHJveHkgdG8gY29ubmVjdCB0aGVyZS4gUG9pbnRlZCBvdXQgdG8gbWUgYnkgRG91Z2xhcwogICBFLiBXZWdzY2hlaWQuICBJIGFsc28gY2hhbmdlZCB0aGUgUkVBRE1FIHRleHQgYSBsaXR0bGUgcmVnYXJkaW5nIHRoaXMuCgogRGFuaWVsICgxNiBBdWd1c3QgMTk5OSkKIC0gRml4ZWQgYSBtZW1vcnkgYnVnIHdpdGggaHR0cC1zZXJ2ZXJzIHRoYXQgc2VudCBMb2NhdGlvbjogdG8gYSBMb2NhdGlvbjoKICAgcGFnZS4gTnVzdSdzIHBhZ2Ugc2hvd2VkIHRoaXMgdG9vLgoKIC0gTWFkZSBjb29raWVzIHdvcmsgYSBsb3QgYmV0dGVyLiBTZXR0aW5nIHRoZSBzYW1lIGNvb2tpZSBuYW1lIHNldmVyYWwgdGltZXMKICAgdXNlZCB0byBhZGQgbW9yZSBjb29raWVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZSBmb3JtZXIgb25lIHdoaWNoIGl0CiAgIHNob3VsZCd2ZS4gTnVzdSA8bnVzIGF0IGludGVyZ29yai5ybz4gYnJvdWdodCBtZSBhbiBVUkwgdGhhdCBtYWRlIHRoaXMKICAgcGFpbmZ1bGx5IHZpc2libGUuLi4KCiBUcm95ICgxNSBBdWd1c3QgMTk5OSkKIC0gQnJvdWdodCBuZXcgLnNwZWMgZmlsZXMgYXMgd2VsbCBhcyBhIHBhdGNoIGZvciBjb25maWd1cmUuaW4gdGhhdCBsZXRzIHRoZQogICBjb25maWd1cmUgc2NyaXB0IGZpbmQgdGhlIG9wZW5zc2wgZmlsZXMgYmV0dGVyLCBldmVuIHdoZW4gdGhlIGluY2x1ZGUKICAgZmlsZXMgYXJlIGluIC91c3IvaW5jbHVkZS9vcGVuc3NsCgpWZXJzaW9uIDUuMTAKCiBEYW5pZWwgKDEzIEF1Z3VzdCAxOTk5KQogLSBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYigpIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSAwLjkuNCB2ZXJzaW9uIG9mCiAgIE9wZW5TU0wuIE5vdyB3aHkgY291bGRuJ3QgdGhleSBzaW1wbHkgYWRkIGEgKm5ldyogZnVuY3Rpb24gaW5zdGVhZCBvZgogICBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlcnMgb2YgYW4gYWxyZWFkeSBleGlzdGluZyBmdW5jdGlvbj8gVGhpcyB3YXksIHdlIGdldAogICBhIGNvbXBpbGVyIHdhcm5pbmcgaWYgY29tcGlsaW5nIHdpdGggMC45LjQgYnV0IG5vdCB3aXRoIGVhcmxpZXIuIFNvLCBJIGhhZAogICB0byBjb21lIHVwIHdpdGggYSAjaWYgY29uc3RydWN0aW9uIHRoYXQgZGVhbHMgd2l0aCB0aGlzLi4uCgogLSBNYWRlIGN1cmwgb3V0cHV0IHRoZSBTU0wgdmVyc2lvbiBudW1iZXIgZ2V0IGRpc3BsYXllZCBwcm9wZXJseSB3aXRoIDAuOS40LgoKIFRyb3kgKDEyIEF1Z3VzdCAxOTk5KQogLSBBZGRlZCBNaW5nVzMyIChHQ0MtMi45NSkgc3VwcG9ydCB1bmRlciBXaW4zMi4gVGhlIElOU1RBTEwgZmlsZSB3YXMgYWxzbwogICBhIGJpdCByZWFycmFuZ2VkLgogCiBEYW5pZWwgKDEyIEF1Z3VzdCAxOTk5KQogLSBJIGhhZCB0byBjb3B5IGEgZ29vZCA8YXJwYS90ZWxuZXQuaD4gaW5jbHVkZSBmaWxlIGludG8gdGhlIGN1cmwgc291cmNlCiAgIHRyZWUgdG8gZW5hYmxlIHRoZSBzaWxseSB3aW4zMiBzeXN0ZW1zIHRvIGNvbXBpbGUuIFRoZSBkaXN0cmlidXRpb24gcmlnaHRzCiAgIGFsbG93cyB1cyB0byBkbyB0aGF0IGFzIGxvbmcgYXMgdGhlIGZpbGUgcmVtYWlucyB1bm1vZGlmaWVkLgoKIC0gSSBjb3JyZWN0ZWQgYSBmZXcgbWlub3IgdGhpbmdzIHRoYXQgbWFkZSB0aGUgY29tcGlsZXIgY29tcGxhaW4gd2hlbgogICAtV2FsbCAtcGVkYW50aWMgd2FzIHVzZWQuCgogLSBJJ20gbW92aW5nIHRoZSBvZmZpY2lhbCBjdXJsIHdlYiBwYWdlIHRvIGh0dHA6Ly9jdXJsLmhheHgubnUuIEkgdGhpbmsgaXQKICAgd2lsbCBtYWtlIGl0IGVhc2llciB0byByZW1lbWJlciBhcyBpdCBpcyBhIGxvdCBzaG9ydGVyIGFuZCBsZXNzIGNyeXB0aWMuCiAgIFRoZSBvbGQgb25lIHN0aWxsIHdvcmtzIGFuZCBzaG93cyB0aGUgc2FtZSBpbmZvLgoKIERhbmllbCAoMTEgQXVndXN0IDE5OTkpCiAtIEFsYmVydCBDaGluLUEtWW91bmcgbWFpbGVkIG1lIGFub3RoZXIgY29ycmVjdGlvbiBmb3IgTlJPRkYgaW4gdGhlCiAgIGNvbmZpZ3VyZS5pbiB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIGJldHRlciBmb3IgSVJJWCB1c2Vycy4KCiBEYW5pZWwgKDEwIEF1Z3VzdCAxOTk5KQogLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGhlbHBlZCBtZSB3aXRoIHNvbWUgc3R1cGlkIE1ha2VmaWxlIHRoaW5ncywgYXMgd2VsbCBhcwogICBzb21lIGZpZGRsaW5nIHdpdGggdGhlIGdldGRhdGUuYyBzdHVmZiB0aGF0IGhlIGhhZCBwcm9ibGVtcyB3aXRoIHVuZGVyCiAgIEhQLVVYIHYxMC4gZ2V0ZGF0ZS55IHdpbGwgbm93IGJlIGNvbXBpbGVkIGludG8gZ2V0ZGF0ZS5jIGlmIHRoZSBhcHByb3ByaWF0ZQogICB5YWNjIG9yIGJpc29uIGlzIGZvdW5kIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LiBTaW5jZSB0aGlzIGlzIHNsaWdodGx5IG5ldywKICAgd2UgbmVlZCB0byB0ZXN0IHRoZSBvdXRwdXQgZ2V0ZGF0ZS5jIHdpdGggd2luMzIgc3lzdGVtcyB0byBtYWtlIHN1cmUgaXQKICAgc3RpbGwgY29tcGlsZXMgdGhlcmUuCgogRGFuaWVsICg1IEF1Z3VzdCAxOTk5KQogLSBJJ3ZlIGp1c3Qgc2V0dXAgYSBuZXcgbWFpbGluZyBsaXN0IHdpdGggdGhlIGludGVudGlvbiB0byBrZWVwIGRpc2N1c3Npb25zCiAgIGFyb3VuZCBsaWJjdXJsIGRldmVsb3BtZW50IGluIGl0LiBJIG1haW5seSBleHBlY3QgaXQgdG8gYmUgZm9yIHRob3VnaHRzIGFuZAogICBicmFpbnN0b3JtaW5nIGFyb3VuZCBhICJuZXh0IGdlbmVyYXRpb24iIGxpYnJhcnksIHJhdGhlciB0aGFuIG5pdHBpY2tpbmcKICAgYWJvdXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb3IgZGV0YWlscyBpbiB0aGUgY3VycmVudCBsaWJjdXJsLgoKICAgVG8gam9pbiBvdXIgaGFwcHkgYnVuY2ggb2YgZnV0dXJlLWxvb2tpbmcgZ2Vla3MsIGVudGVyICdzdWJzY3JpYmUKICAgPGFkZHJlc3M+JyBpbiB0aGUgYm9keSBvZiBhIG1haWwgYW5kIHNlbmQgaXQgdG8KICAgbGliY3VybC1yZXF1ZXN0QGxpc3RzZXJ2LmZ0cy5mcm9udGVjLnNlLiAgQ3VybCBidWcgcmVwb3J0cywgdGhlIHVzdWFsIGN1cmwKICAgdGFsayBhbmQgZXZlcnl0aGluZyBlbHNlIHNob3VsZCBzdGlsbCBiZSBrZXB0IGluIHRoaXMgbWFpbGluZyBsaXN0LiBJJ3ZlCiAgIHN0YXJ0ZWQgdG8gYXJjaGl2ZSB0aGlzIG1haWxpbmcgbGlzdCBhbmQgaGF2ZSBwdXQgdGhlIGxpYmN1cmwgd2ViIHBhZ2UgYXQKICAgd3d3LmZ0cy5mcm9udGVjLnNlL35kYXN0L2xpYmN1cmwvLgoKIC0gU3RlZmFuIEthbnRoYWsgY29udGFjdGVkIG1lIHJlZ2FyZGluZyBhIGZldyBwcm9ibGVtcyBpbiB0aGUgY29uZmlndXJlCiAgIHNjcmlwdCB3aGljaCBoZSBkaXNjb3ZlcmVkIHdoZW4gdHJ5aW5nIHRvIG1ha2UgY3VybCBjb21waWxlIGFuZCBidWlsZCB1bmRlcgogICBTaWVtZW5zIFNJTklYLVogVjUuNDJCMjAwNCEKCiAtIE1hcmN1cyBLbGVpbiB2ZXJ5IGFjY3VyYXRlbHkgaW5mb3JtZWQgbWUgdGhhdCBzcmMvdmVyc2lvbi5oIHdhcyBub3QgcHJlc2VudAogICBpbiB0aGUgQ1ZTIHJlcG9zaXRvcnkuIE9oLCBob3cgc2lsbHkuLi4KCiAtIExpbnVzIE5pZWxzZW4gcmV3cm90ZSB0aGUgdGVsbmV0Oi8vIHBhcnQgYW5kIG5vdyBjdXJsIG9mZmVycyBsaW1pdGVkIHRlbG5ldAogICBzdXBwb3J0LiBJZiB5b3UgcnVuIGN1cmwgbGlrZSAnY3VybCB0ZWxuZXQ6Ly9ob3N0JyB5b3UnbGwgZ2V0IGFsbCBvdXRwdXQgb24KICAgdGhlIHNjcmVlbiBhbmQgY3VybCB3aWxsIHJlYWQgaW5wdXQgZnJvbSBzdGRpbi4gWW91J2xsIGJlIGFibGUgdG8gbG9naW4gYW5kCiAgIHJ1biBjb21tYW5kcyBldGMsIGJ1dCBzaW5jZSB0aGUgb3V0cHV0IGlzIGJ1ZmZlcmVkLCBleHBlY3QgdG8gZ2V0IGEgbGl0dGxlCiAgIHdlaXJkIG91dHB1dC4KCiAgIFRoaXMgaXMgc3RpbGwgaW4gaXRzIGluZmFuY3kgYW5kIGl0IG1pZ2h0IGdldCBjaGFuZ2VkLiBXZSBuZWVkIHlvdXIKICAgZmVlZC1iYWNrIGFuZCBpbnB1dCBpbiBob3cgdGhpcyBpcyBiZXN0IGRvbmUuCgogICBXSU4zMiBOT1RFOiBJIGJldCB3ZSdsbCBnZXQgcHJvYmxlbXMgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSB0aGUgY3VycmVudAogICBsaWIvdGVsbmV0LmMgb24gd2luMzIsIGJ1dCBJIHRoaW5rIHdlIGNhbiBzb3J0IHRoZW0gb3V0IGluIHRpbWUuCgogLSBEYXZpZCBTYW5kZXJzb24gcmVwb3J0ZWQgdGhhdCBGT1JDRV9BTExPQ0FfSCBvciBIQVZFX0FMTE9DQV9IIG11c3QgYmUKICAgZGVmaW5lZCBmb3IgZ2V0ZGF0ZS5jIHRvIGNvbXBpbGUgcHJvcGVybHkgb24gSFAtVVggMTEuMC4gSSB1cGRhdGVkIHRoZQogICBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciBhbGxvY2EuaCB3aGljaCBzaG91bGQgbWFrZSBpdC4KCiBEYW5pZWwgKDQgQXVndXN0IDE5OTkpCiAtIEkgZmluYWxseSBnb3QgdG8gdW5kZXJzdGFuZCBNYXJjdXMgS2xlaW4ncyBmdHAgZG93bmxvYWQgcmVzdW1lIHByb2JsZW0sCiAgIHdoaWNoIHR1cm5zIG91dCB0byBiZSBkdWUgdG8gZGlmZmVyZW50IG91dHB1dHMgZnJvbSBkaWZmZXJlbnQgZnRwCiAgIHNlcnZlcnMuIEl0IG1ha2VzIGZ0cCBkb3dubG9hZCByZXN1bWluZyBhIGxpdHRsZSB0cmlja2llciwgYnV0IEkndmUgbWFkZQogICBzb21lIG1vZGlmaWNhdGlvbnMgSSByZWFsbHkgYmVsaWV2ZSB3aWxsIHdvcmsgZm9yIG1vc3QgZnRwIHNlcnZlcnMgYW5kIEkgZG8KICAgaG9wZSB5b3UgcmVwb3J0IGlmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggdGhpcyEKCiAtIEFkZGVkIHRleHQgYWJvdXQgZmlsZSB0cmFuc2ZlciByZXN1bWluZyB0byBSRUFETUUuY3VybC4KCiBEYW5pZWwgKDIgQXVndXN0IDE5OTkpCiAtIEFwcGxpZWQgYSBwcm9ncmVzcy1iYXIgcGF0Y2ggZnJvbSBMYXJzIEouIEFhcy4gSXQgb2ZmZXJzCiAgIGEgbmV3IHN0eWxlZCBwcm9ncmVzcyBiYXIgZW5hYmxlZCB3aXRoIC0jLy0tcHJvZ3Jlc3MtYmFyLiAKCiBULiBZYW1hZGEgPHRhaSBhdCBpbWFzeS5vci5qcD4gKDMwIEp1bHkgMTk5OSkKIC0gSXQgYnJlYWtzIHdpdGggc2VnZmF1bHQgd2hlbiAxKSBjdXJsIGlzIHVzaW5nIC5uZXRyYyB0byBvYnRhaW4KICAgdXNlcm5hbWUvcGFzc3dvcmQgKG9wdGlvbiAnLW4nKSwgYW5kIDIpIGlzIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3RlZCB0bwogICBhbm90aGVyIGxvY2F0aW9uIChvcHRpb24gJy1MJykuCgogICBUaGVyZSBpcyBhIHNtYWxsIGJ1ZyBpbiBsaWIvdXJsLmMgKGJsb2NrIHN0YXJ0aW5nIGZyb20gbGluZSA2NDEpLCB3aGljaAogICB0cmllcyB0byB0YWtlIG91dCB1c2VybmFtZS9wYXNzd29yZCBmcm9tIHVzZXItIHN1cHBsaWVkIGNvbW1hbmQtbGluZQogICBhcmd1bWVudCAoJy11JyBvcHRpb24pLiBUaGlzIGJsb2NrIGlzIG5ldmVyIGV4ZWN1dGVkIG9uIGZpcnN0IGF0dGVtcHQgc2luY2UKICAgQ09ORl9VU0VSUFdEIGJpdCBpc24ndCBzZXQgYXQgZmlyc3QsIGJ1dCBjdXJsIGxhdGVyIHR1cm5zIGl0IG9uIHdoZW4gaXQKICAgY2hlY2tzIGZvciBDT05GX05FVFJDIGJpdC4gU28gd2hlbiBjdXJsIHRyaWVzIHRvIHJlZG8gZXZlcnl0aGluZyBkdWUgdG8KICAgcmVkaXJlY3Rpb24sIGl0IHNlZ2ZhdWx0cyB0cnlpbmcgdG8gYWNjZXNzICpkYXRhLT51c2VycHdkLgoKVmVyc2lvbiA1LjkuMQoKIERhbmllbCAoMzAgSnVseSAxOTk5KQogLSBTdGV2ZSBXYWxjaCBwb2ludGVkIG91dCB0aGF0IHRoZXJlIGlzIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGZvcm1kYXRhCiAgIGZ1bmN0aW9ucy4gSSBhZGRlZCBhIEZvcm1GcmVlKCkgZnVuY3Rpb24gdGhhdCBpcyBub3cgdXNlZCBhbmQgc3VwcG9zZWQgdG8KICAgY29ycmVjdCB0aGlzIGZsYXcuCgogLSBNYXJrIFdvdHRvbiByZXBvcnRlZDoKICAgJ2N1cmwgLUwgaHR0cHM6Ly93d3cuY3dhLmNvbS5hdS8nIGNvcmUgZHVtcHMuICBJIG1hbmFnZWQgdG8gY3VyZSB0aGlzIGJ5CiAgIGNvcnJlY3RpbmcgdGhlIGNsZWFudXAgcHJvY2VkdXJlLiBUaGUgYnVnIHNlZW1zIHRvIGJlIGdvbmUgd2l0aCBteSBPcGVuU1NMCiAgIDAuOS4yYiwgYWx0aG91Z2ggc3RpbGwgb2NjdXJzIHdoZW4gSSBydW4gdGhlIH4xMDAgeWVhcnMgb2xkIFNTTGVheSAwLjguMC4gSQogICBkb24ndCBrbm93IHdoZXRoZXIgaXQgaXMgY3VybCBvciBTU0xlYXkgdGhhdCBpcyB0byBibGFtZSBmb3IgdGhhdC4KCiAtIE1hcmN1cyBLbGVpbjoKICAgUmVwb3J0ZWQgYW4gRlRQIHVwbG9hZCByZXN1bWUgYnVnIHRoYXQgSSByZWFsbHkgY2FuJ3QgcmVwZWF0IG5vciB1bmRlcnN0YW5kLgogICBJIGxlYXZlIGl0IGhlcmUgc28gdGhhdCBpdCB3b24ndCBiZSBmb3Jnb3R0ZW4uCgogRGFuaWVsICgyOSBKdWx5IDE5OTkpCiAtIENvc3R5YSBTaHVseXVwaW4gc3VnZ2VzdGVkIHN1cHBvcnQgZm9yIGxvbmdlciBVUkxzIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOgogICBhbmQgSSBjb3VsZCBvbmx5IGFncmVlIGFuZCBmaXggaXQhCgogLSBMZWlnaCBQdXJkaWUgZm91bmQgYSBwcm9ibGVtIGluIHRoZSB1cGxvYWQvUE9TVCBkZXBhcnRtZW50LiBJdCB0dXJuZWQgb3V0CiAgIHRoYXQgaHR0cC5jIGFjY2lkZW50YWx5IGNsZWFyZWQgdGhlIHBvaW50ZXIgaW5zdGVhZCBvZiB0aGUgYnl0ZSBjb3VudGVyCiAgIHdoZW4gc3VwcG9zZWQgdG8uCgogLSBDb3N0eWEgU2h1bHl1cGluIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHBvcnQgbnVtYmVycyBhbmQgTG9jYXRpb246LiBJZgogICB5b3UgaGFkIGEgc2VydmVyIGF0IGEgbm9uLXN0YW5kYXJkIHBvcnQgdGhhdCByZWRpcmVjdGVkIHRvIGFuIFVSTCB1c2luZyBhCiAgIHN0YW5kYXJkIHBvcnQgbnVtYmVyLCBjdXJsIHN0aWxsIHVzZWQgdGhhdCBmaXJzdCBwb3J0IG51bWJlci4KCiAtIFJhbHBoIEJlY2ttYW5uIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aGVuIHVzaW5nIGJvdGggQ09ORl9GT0xMT1dMT0NBVElPTgogICBhbmQgQ09ORl9GQUlMT05FUlJPUiBzaW11bHRhbmVvdXNseS4gU2luY2UgdGhlIENPTkZfRkFJTE9ORVJST1IgZXhpdHMgb24KICAgdGhlIDMwMi1jb2RlIHRoYXQgdGhlIGZvbGxvdyBsb2NhdGlvbiBoZWFkZXIgb3V0cHV0cyBpdCB3aWxsIG5ldmVyIHNob3cgYW55CiAgIGh0bWwgb24gbG9jYXRpb246IHBhZ2VzLiBJIGhhdmUgbm93IG1hZGUgaXQgbG9vayBmb3IgPj00MDAgY29kZXMgaWYKICAgQ09ORl9GT0xMT1dMT0NBVElPTiBpcyBzZXQuCgogLSAnc3RydWN0IHNsaXN0JyBpcyBub3cgcmVuYW1lZCB0byAnc3RydWN0IGN1cmxfc2xpc3QnIChhcyBzdWdnZXN0ZWQgYnkgUmFscGgKICAgQmVja21hbm4pLgoKIC0gSm9zaHVhIFN3aW5rIGFuZCBSaWNrIFdlbHlrb2NoeSB3ZXJlIHRoZSBmaXJzdCB0byBwb2ludCBvdXQgdG8gbWUgdGhhdCB0aGUKICAgbGF0ZXN0IE9wZW5TU0wgcGFja2FnZSBub3cgaGF2ZSBtb3ZlZCB0aGUgc3RhbmRhcmQgaW5jbHVkZSBwYXRoLiBJdCBpcyBub3cKICAgaW4gL3Vzci9sb2NhbC9zc2wvaW5jbHVkZS9vcGVuc3NsIGFuZCBJIGhhdmUgbm93IG1vZGlmaWVkIHRoZSAtLWVuYWJsZS1zc2wKICAgb3B0aW9uIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB1c2UgdGhhdCBhcyB0aGUgcHJpbWFyeSBwYXRoLCBhbmQgSQogICBsZWF2ZSB0aGUgZm9ybWVyIHBhdGggdG9vIHRvIHdvcmsgd2l0aCBvbGRlciBwYWNrYWdlcyBvZiBPcGVuU1NMIHRvby4KCiBEYW5pZWwgKDkgSnVuZSAxOTk5KQogLSBJIGZpbmFsbHkgdW5kZXJzdG9vZCB0aGUgSVJJWCBwcm9ibGVtIGFuZCBub3cgaXQgc2VlbSB0byBjb21waWxlIG9uIGl0IQogICBJIGFtIGdvbm5hIHJlbW92ZSB0aG9zZSAjZGVmaW5lIHN0cmNhc2VjbXAoKSB0aGluZ3Mgb25jZSBhbmQgZm9yIGFsbCBub3cuCgogRGFuaWVsICg0IEp1bmUgMTk5OSkKIC0gSSBhZGp1c3RlZCB0aGUgRlRQIHJlcGx5IDIyNyBwYXJzZXIgdG8gbWFrZSB0aGUgUEFTViBjb21tYW5kIHdvcmsgYmV0dGVyCiAgIHdpdGggbW9yZSBmdHAgc2VydmVycy4gQXBwZWFyYW50bHkgdGhlIFJveGVuIENoYWxsYW5nZXIgc2VydmVyIHJlcGxpZWQKICAgc29tZXRoaW5nIGN1cmwgNS45IGNvdWxkIGRlYWwgd2l0aCEgOi0oIFJlcG9ydGVkIGJ5IEFzaGxleSBSZWlkLU1vbnRhbmFybwogICBhbmQgTWFyayBCdXRsZXIgYnJvdWdodCBhIHNvbHV0aW9uIGZvciBpdC4KCiBEYW5pZWwgKDI2IE1heSAxOTk5KQogLSBSZWFycmFuZ2VkLiBSRUFETUUgaXMgbmV3LCB0aGUgb2xkIG9uZSBpcyBub3cgUkVBRE1FLmN1cmwgYW5kIEkgYWRkZWQgYQogICBSRUFETUUubGliY3VybCB3aXRoIHRleHQgSSBnb3QgZnJvbSBSYWxwaCBCZWNrbWFubi4KCiAtIEkgYWxzbyB1cGRhdGVkIHRoZSBJTlNUQUxMIHRleHQuCgogRGFuaWVsICgyNSBNYXkgMTk5OSkKIC0gRGF2aWQgSm9uYXRoYW4gTG93c2t5IGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IGN1cmwgZGlkbid0IHByb3Blcmx5IGRlYWwKICAgd2l0aCBmb3JtIHBvc3Rpbmcgd2hlcmUgdGhlIHZhcmlhYmxlIHNob3VsZG4ndCBoYXZlIGFueSBjb250ZW50LCBhcyBpbiBjdXJsCiAgIC1GICJmb3JtPSIgd3d3LnNpdGUuY29tLiBJdCB3YXMgbm93IGZpeGVkLgoKVmVyc2lvbiA1LjkKCiBEYW5pZWwgKDIyIE1heSAxOTk5KQogLSBJJ3ZlIGdvdCBhIGJ1ZyByZXBvcnQgZnJvbSBBYXJvbiBTY2FyaXNicmljayBpbiB3aGljaCBoZSBzdGF0ZXMgaGUgaGFzIHNvbWUKICAgcHJvYmxlbXMgd2l0aCAtTCB1bmRlciBGcmVlQlNEIDMuMC4gSSBoYXZlIHByZXZpb3VzbHkgZ290IGFub3RoZXIgYnVnCiAgIHJlcG9ydCBmcm9tIFN0ZWZhbiBHcmV0aGVyIHdoaWNoIHBvaW50cyBhdCBhbiBlcnJvciB3aXRoIHNpbWlsYXIgc3ltcHRob21zCiAgIHdoZW4gdXNpbmcgd2luMzIuIEkgbWFkZSB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgbmV3IHVybCBzdHJpbmcgYSBiaXQgZmFzdGVyCiAgIGFuZCBkaWZmZXJlbnQsIGRvbid0IGtub3cgaWYgaXQgYWN0dWFsbHkgaW1wcm92ZXMgYW55dGhpbmcgdGhvdWdoLi4uCgogRGFuaWVsICgyMCBNYXkgMTk5OSkKIC0gTWFkZSB0aGUgY29va2llIHBhcnNlciBkZWFsIHdpdGggQ1JMRiBuZXdsaW5lcyB0b28uCgogRGFuaWVsICgxOSBNYXkgMTk5OSkKIC0gRG93bmxvYWQoKSBkaWRuJ3QgcHJvcGVybHkgZGVhbCB3aXRoIGZhaWxpbmcgcmV0dXJuIGNvZGVzIGZyb20gdGhlIHNyZWFkKCkKICAgZnVuY3Rpb24uIEFkYW0gQ295bmUgZm91bmQgdGhlIHByb2JsZW0gaW4gdGhlIHdpbjMyIHZlcnNpb24sIGFuZCBUcm95IEVuZ2VsCiAgIGhlbHBlZCBtZSBvdXQgaXNvbGF0aW5nIGl0LgoKIERhbmllbCAoMTYgTWF5IDE5OTkpCiAtIFJpY2hhcmQgQWRhbXMgcG9pbnRlZCBvdXQgYSBidWcgSSBpbnRyb2R1Y2VkIGluIDUuOC4gLS1kdW1wLWhlYWRlciBkb2Vzbid0CiAgIHdvcmsgYW55bW9yZSEgOi0vIEkgZml4ZWQgaXQgbm93LgoKIC0gQWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEpvc2h1YSBTd2luayBJIGFkZGVkIC1TIC8gLS1zaG93LWVycm9yIHRvIGZvcmNlIGN1cmwKICAgdG8gZGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mIGFuIGVycm9yLCBldmVuIGlmIC1zLy0tc2lsZW50IHdhcwogICB1c2VkLgoKIERhbmllbCAoMTAgTWF5IDE5OTkpCiAtIEkgbW92ZWQgdGhlIHN0dWZmIGNvbmNlcm5pbmcgSFRUUCwgRElDVCBhbmQgVEVMTkVUIGl0IHRoZWlyIG93biBzb3VyY2UKICAgZmlsZXMgbm93LiBJdCBpcyBhIGJlZ2lubmluZyBvbiBteSBjbGVhbi11cCBvZiB0aGUgc291cmNlcyB0byBtYWtlIHRoZW0KICAgbGF5ZXIgYWxsIHRob3NlIHByb3RvY29scyBiZXR0ZXIgdG8gZW5hYmxlIG1vcmUgdG8gYmUgYWRkZWQgZWFzaWVyIGluIHRoZQogICBmdXR1cmUhCgogLSBMZW9uIEJyZWVkdCBzZW50IG1lIHNvbWUgZmlsZXMgSSd2ZSBub3QgcHV0IGludG8gdGhlIG1haW4gY3VybAogICBhcmNoaXZlLiBUaGV5J3JlIGZvciBjcmVhdGluZyB0aGUgRGViaWFuIHBhY2thZ2UgdGhpbmdpZS4gSGUgYWxzbyBzZW50IG1lIGEKICAgZGViaWFuIHBhY2thZ2UgdGhhdCBJJ3ZlIG1hZGUgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhdCB0aGUgd2ViIHBhZ2UKCiBEYW5pZWwgKDkgTWF5IDE5OTkpCiAtIE1hZGUgaXQgY29tcGlsZSBvbiBjeWd3aW4gdG9vLgoKIFRyb3kgRW5nZWwgKDcgTWF5IDE5OTkpCiAtIEJyb3VnaHQgYSBzZXJpZXMgb2YgcGF0Y2hlcyB0byBhbGxvdyBjdXJsIHRvIGNvbXBpbGUgc21vb3RobHkgb24gTVNWQysrIDYKICAgYWdhaW4hCgogRGFuaWVsICg2IE1heSAxOTk5KQogLSBJIGNoYW5nZWQgdGhlICNpZmRlZiBIQVZFX1NUUkZUSU1FIHBsYWNlbWVudCBmb3IgdGhlIC16IGNvZGUgc28gdGhhdCBpdAogICB3aWxsIGJlIGVhc2llciB0byBkaXNjb3ZlciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGF0IGZ1bmN0aW9uIGFuZCB0aHVzCiAgIGNhbid0IHVzZSAteiBzdWNjZXNzZnVsbHkuIE1hZGUgdGhlIHN0cmZ0aW1lKCkgZ2V0IHVzZWQgaWYgV0lOMzIgaXMgZGVmaW5lZAogICB0b28uCgpWZXJzaW9uIDUuOAoKIERhbmllbCAoNSBNYXkgMTk5OSkKIC0gSSd2ZSBoYWQgaXQgd2l0aCB0aGlzIGF1dG9jb25mL2F1dG9tYWtlIG1lc3MuIEl0IHNlZW1zIHRvIHdvcmsgYWxscmlnaHQKICAgZm9yIG1vc3QgcGVvcGxlIHdobyBkb24ndCBoYXZlIGF1dG9tYWtlIGluc3RhbGxlZCwgYnV0IGZvciB0aG9zZSB3aG8gaGF2ZQogICB0aGVyZSBhcmUgcHJvYmxlbXMgYWxsIG92ZXIuCgogICBJJ3ZlIGdvdCBsaWtlIGZpdmUgZGlmZmVyZW50IGJ1ZyByZXBvcnRzIG9uIHRoaXMgb25seSB0aGUgbGFzdAogICB3ZWVrLi4uIENsYXVkaW8gTmV2ZXMgYW5kIEZlZGVyaWNvIEJpYW5jaGkgYW5kIHJvb3QgPGR1Z2dlcmowMDEgYXQKICAgaGF3YWlpLnJyLmNvbT4gYXJlIHNvbWUgb2YgdGhlbSByZXBvcnRpbmcgdGhpcy4KCiAgIEN1cnJlbnRseSwgSSBoYXZlIG5vIHJlYWxseSBnb29kIGZpeCBzaW5jZSBJIHdhbnQgdG8gdXNlIGF1dG9tYWtlIG15c2VsZiB0bwogICBnZW5lcmF0ZSB0aGUgTWFrZWZpbGUuaW4gZmlsZXMuIEkndmUgZm91bmQgb3V0IHRoYXQgdGhlIEBTSEVMTEAtcHJvYmxlbXMKICAgY2FuIG9mdGVuIGJlIGZpeGVkIGJ5IG1hbnVhbGx5IGludm9raW5nICdhdXRvbWFrZScgaW4gdGhlIGFyY2hpdmUgcm9vdAogICBiZWZvcmUgeW91IHJ1biAuL2NvbmZpZ3VyZS4uLiBJJ3ZlIGhhY2tlZCBteSBtYWtldGd6IHNjcmlwdCBub3cgdG8gZmlkZGxlCiAgIGEgYml0IHdpdGggdGhpcyBhbmQgbXkgdGVzdHMgc2VlbSB0byB3b3JrIGJldHRlciB0aGFuIGJlZm9yZSBhdCBsZWFzdCEKCiBEYW5pZWwgKDQgTWF5IDE5OTkpCiAtIG1raGVscC5wbCBoYXMgYmVlbiBkb2luZyBiYWRseSBsYXRlbHkuIEkgY29ycmVjdGVkIGEgY2FzZSBwcm9ibGVtIGluCiAgIHRoZSByZWdleGVzLgoKIC0gSSd2ZSBub3cgcmVtYWRlIHRoZSAtbyBvcHRpb24gdG8gbm90IHRvdWNoIHRoZSBmaWxlIHVubGVzcyBpdCBuZWVkcyB0by4KICAgSSBoYWQgdG8gZG8gdGhpcyB0byBtYWtlIC16IG9wdGlvbiByZWFsbHkgZmluZSwgc2luY2Ugbm93IHlvdSBjYW4gbWFrZSBhCiAgIGN1cmwgZmV0Y2ggYW5kIHVzZSBhIGxvY2FsIGNvcHkncyB0aW1lIHdoZW4gZG93bmxvYWRpbmcgdG8gdGhhdCBmaWxlLCBhcwogICBpbjoKCiAgICAgICAgY3VybCAteiBkdW1wIC1vIGR1bXAgcmVtb3RlLnNpdGUuY29tL2ZpbGUuaHRtbAoKICAgVGhpcyB3aWxsIG9ubHkgZ2V0IHRoZSBmaWxlIGlmIHRoZSByZW1vdGUgb25lIGlzIG5ld2VyIHRoYW4gdGhlIGxvY2FsLgogICBJJ20gYXdhcmUgdGhhdCB0aGlzIGFsdGVycyBwcmV2aW91cyBiZWhhdmlvdXIgYSBsaXR0bGUuIFNvbWUgc2NyaXB0cyBvdXQKICAgdGhlcmUgbWF5IGRlcGVuZCBvbiB0aGF0IHRoZSBmaWxlIGlzIGFsd2F5cyB0b3VjaGVkLi4uCgogLSBDb3JyZWN0ZWQgYSBidWcgaW4gdGhlIFNTTHYyL3YzIHNlbGVjdGlvbi4KCiAtIEZlbGl4IHZvbiBMZWl0bmVyIHJlcXVlc3RlZCB0aGF0IGN1cmwgc2hvdWxkIGJlIGFibGUgdG8gc2VuZAogICAiSWYtTW9kaWZpZWQtU2luY2UiIGhlYWRlcnMsIHdoaWNoIGluZGVlZCBpcyBhIGZhaXIgaWRlYS4gIEkgaW1wbGVtZW50ZWQgaXQKICAgcmlnaHQgYXdheSEgVHJ5IC16IDxleHByZXNzaW9uPiB3aGVyZSBleHByZXNzaW9uIGlzIGEgZnVsbCBHTlUgZGF0ZQogICBleHByZXNzaW9uIG9yIGEgZmlsZSBuYW1lIHRvIGdldCB0aGUgZGF0ZSBmcm9tIQoKIFN0ZXBoYW4gTGFnZXJob2xtICgzMCBBcHIgMTk5OSkKIC0gUG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggdGhlIHNyYy9NYWtlZmlsZSBmb3IgRnJlZUJTRC4gVGhlIFJNIHZhcmlhYmxlCiAgIGlzbid0IHNldCBhbmQgY2F1c2VzIHRoZSBtYWtlIHRvIGZhaWwuCgogRGFuaWVsICgyNiBBcHJpbCAxOTk5KQogLSBBbSBJIHNpbGx5IG9yIHdoYXQ/IElydmluZyBXb2xmZSBwb2ludGVkIG91dCB0byBtZSB0aGF0IHRoZSBjdXJsIHZlcnNpb24KICAgbnVtYmVyIHdhcyBub3Qgc2V0IHByb3Blcmx5LiBIYXNuJ3QgYmVlbiBzaW5jZSA1LjYuIFRoaXMgd2FzIGR1ZSB0byBhIGJ1ZwogICBpbiBteSBtYWtldGd6IHNjcmlwdCEKCiBEYXZpZCBFcmlrc3NvbiAoMjUgQXByIDE5OTkpCiAtIEZvdW5kIGEgYnVnIGluIGNvb2tpZXMuYyB0aGF0IG1hZGUgaXQgY3Jhc2ggYXQgdGltZXMuCgpWZXJzaW9uIDUuNy4xCgogRG91ZyBLYXVmbWFuICgyMyBBcHIgMTk5OSkKIC0gQnJvdWdodCB0d28gc3Vub3MgNCBmaXhlcy4gT25lIG9mIHRoZW0gYmVpbmcgdGhlIGhvc3RpcC5jIGZpeCBtZW50aW9uZWQKICAgYmVsb3cgYW5kIHRoZSBvdGhlciBvbmUgYSBjb3JyZWN0aW9uIGluIGluY2x1ZGUvc3RkY2hlYWRlcnMuaAoKIC0gQWRkZWQgYSBwYXJhZ3JhcGggYWJvdXQgY29tcGlsaW5nIHdpdGggdGhlIFVTLXZlcnNpb24gb2Ygb3BlbnNzbCB0byB0aGUKICAgSU5TVEFMTCBmaWxlLgoKIERhbmllbAogLSBOZXcgbWFpbGluZyBsaXN0IGFkZHJlc3MuIEluZm8gdXBkYXRlZCBvbiB0aGUgd2ViIHBhZ2UgYXMgd2VsbCBhcyBpbiB0aGUKICAgUkVBRE1FIGZpbGUKCiBHcmVnIE9udWZlciAoMjAgQXByIDE5OTkpCiAtIGhvc3RpcC5jIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IG9uIFN1bk9TIDUuNS4xLgogICBJdCBuZWVkcyBhbiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgpWZXJzaW9uIDUuNwoKIERhbmllbCAoQXByIDIwIDE5OTkpCiAtIERlY2lkZWQgdG8gdXBsb2FkIGEgbm9uLWJldGEgdmVyc2lvbiByaWdodCBub3chCgogLSBNYWRlIGN1cmwgc3VwcG9ydCBhbnktbGVuZ3RoIEhUVFAgaGVhZGVycy4gVGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyBub3cKICAgc2ltcGx5IGVubGFyZ2VkIGV2ZXJ5IHRpbWUgaXQgdHVybnMgb3V0IHRvIGJlIHRvbyBzbWFsbCEKCiAtIEFkZGVkIHRoZSBGQVEgZmlsZSB0byB0aGUgYXJjaGl2ZS4gU3RpbGwgYSBiaXQgc21hbGxpc2gsIGJ1dCBpdCBpcyBhCiAgIHN0YXJ0LgoKIEVyaWMgVGhlbGluICgxNSBBcHIgMTk5OSkKIC0gTWFkZSAtRCBhY2NlcHQgJy0nIGluc3RlYWQgb2YgZmlsZW5hbWUgdG8gd3JpdGUgdG8gc3Rkb3V0LgoKVmVyc2lvbiA1LjYuM2JldGEKCiBEYW5pZWwgKEFwciAxMiAxOTk5KQoKIC0gQ2hhbmdlZCB0d28gI2lmZGVmIFdJTjMyIHRvIGJldHRlciAjaWZkZWYgPGVycm9yY29kZT4gd2hlbiBjb25uZWN0KClpbmcKICAgaW4gdXJsLmMgYW5kIGZ0cC5jLiBNYWtlcyBjeWd3aW4zMiBkZWFsIHdpdGggdGhlbSBiZXR0ZXIgdG9vLiBXZSBzaG91bGQKICAgdHJ5IHRvIGdldCBzb21lIGRlY2VudCB3aW4zMi1yZXBsYWNlbWVudCB0aGVyZS4gQW55b25lPwoKIC0gVGhlIG9sZCAtMy8tLWNybGYgb3B0aW9uIGlzIG5vdyBPTkxZIC0tY3JsZiEKCiAtIEkgY2hhbmdlZCB0aGUgIlNTTCBmaXgiIHRvIGEgbW9yZSBsYW1lIG9uZSwgYnV0IHRoYXQgZG9lc24ndCByZW1vdmUgYXMKICAgbXVjaCBmdW5jdGlvbmFsaXR5LiBOb3cgSSd2ZSBlbmFibGVkIHRoZSBsaWIgdG8gc2VsZWN0IHdoYXQgU1NMIHZlcnNpb24gaXQKICAgc2hvdWxkIHRyeSBmaXJzdC4gQXBwZWFyYW50bHkgc29tZSBvbGRlciBTU0wtc2VydmVycyBkb24ndCBsaWtlIHdoZW4geW91CiAgIHRhbGsgdjMgd2l0aCB0aGVtIHNvIHlvdSBuZWVkIHRvIGJlIGFibGUgdG8gZm9yY2UgY3VybCB0byB0YWxrIHYyIGZyb20gdGhlCiAgIHN0YXJ0LiBUaGUgZml4IGRhdGVkIEFwcmlsIDYgYW5kIHBvc3RlZCBvbiB0aGUgbWFpbGluZyBsaXN0IGZvcmNlZCBjdXJsIHRvCiAgIHVzZSB2MiBhdCBhbGwgdGltZXMgdXNpbmcgYSBtb2Rlcm4gT3BlblNTTCB2ZXJzaW9uLCBidXQgd2UgZG9uJ3QgcmVhbGx5CiAgIHdhbnQgc3VjaCBhIGNyaXBwbGVkIHNvbHV0aW9uLgogCiAtIE1hcmMgQm91Y2hlciBzZW50IG1lIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgYSBtYXRoIGVycm9yIGZvciB0aGUKICAgIkN1cnIuU3BlZWQiIHByb2dyZXNzIG1ldGVyLgoKIC0gRXJpYyBUaGVsaW4gc2VudCBtZSBhIHBhdGNoIHRoYXQgZW5hYmxlcyAnLUsgLScgdG8gcmVhZCBhIGNvbmZpZyBmaWxlIGZyb20KICAgc3RkaW4uCgogLSBJIGZvdW5kIG91dCB3ZSBkaWRuJ3QgY2xvc2UgdGhlIGZpbGUgcHJvcGVybHkgYmVmb3JlIHNvIEkgYWRkZWQgaXQhCgogRGFuaWVsIChBcHIgOSAxOTk5KQogLSBZdSBYaW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggZnRwIGRvd25sb2FkIHJlc3VtZS4gIEl0IGRpZG4ndCB3b3JrIGF0CiAgIGFsbCEgOy1PCgogRGFuaWVsIChBcHIgNiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIHZlcnNpb24gc3RyaW5nIHBhcnQgZ2VuZXJhdGVkIGZvciB0aGUgU1NMIHZlcnNpb24uCgogLSBJIGZvdW5kIGEgd2F5IHRvIG1ha2Ugc29tZSBvdGhlciBTU0wgcGFnZSB3b3JrIHdpdGggb3BlbnNzbCAwLjkuMSsgdGhhdAogICBwcmV2aW91c2x5IGRpZG4ndCAoc3NsZWF5IDAuOC4wIHdvcmtzIHdpdGggaXQgdGhvdWdoISkuIFRyeWluZyB0byBnZXQKICAgc29tZSByZWFsIGluZm8gZnJvbSB0aGUgT3BlblNTTCBndXlzIHRvIHNlZSBob3cgSSBzaG91bGQgZG8gdG8gYmVoYXZlIHRoZQogICBiZXN0IHdheS4gU1NMZWF5IDAuOC4wIHNob3VsZG4ndCBiZSB0aGF0IG11Y2ggaW4gdXNlIGFueXdheSB0aGVzZSBkYXlzIQoKVmVyc2lvbiA1LjYuMmJldGEKCiBEYW5pZWwgKEFwciA0IDE5OTkpCiAtIEZpbmFsbHkgaGF2ZSBjdXJsIG1vcmUgY29va2llICJhd2FyZSIuIE5vdyByZWFkIGNhcmVmdWxseS4gVGhpcyBpcyBob3cKICAgaXQgd29ya3MuCiAgIFRvIG1ha2UgY3VybCByZWFkIGNvb2tpZXMgZnJvbSBhbiBhbHJlYWR5IGV4aXN0aW5nIGZpbGUsIGluIHBsYWluIGhlYWRlci0KICAgZm9ybWF0IChsaWtlIGZyb20gdGhlIGhlYWRlcnMgb2YgYSBwcmV2aW91cyBmZXRjaCkgaW52b2tlIGN1cmwgd2l0aCB0aGUKICAgLWIgZmxhZyBsaWtlOgoKICAgICAgICBjdXJsIC1iIGZpbGUgaHR0cDovL3NpdGUvZm9vLmh0bWwKCiAgIEN1cmwgd2lsbCB0aGVuIHVzZSBhbGwgY29va2llcyBpdCBmaW5kcyBtYXRjaGluZy4gVGhlIG9sZCBzdHlsZSB0aGF0IHNldHMKICAgYSBzaW5nbGUgY29va2llIHdpdGggLWIgaXMgc3RpbGwgc3VwcG9ydGVkIGFuZCBpcyB1c2VkIGlmIHRoZSBzdHJpbmcKICAgZm9sbG93aW5nIC1iIGluY2x1ZGVzIGEgJz0nIGxldHRlciwgYXMgaW4gIi1iIG5hbWU9ZGFuaWVsIi4KCiAgIFRvIG1ha2UgY3VybCByZWFkIHRoZSBjb29raWVzIHNlbnQgaW4gY29tYmluYXRpb24gd2l0aCBhIGxvY2F0aW9uOiAod2hpY2gKICAgc2l0ZXMgb2Z0ZW4gZG8pIHBvaW50IGN1cmwgdG8gcmVhZCBhIG5vbi1leGlzdGluZyBmaWxlIGF0IGZpcnN0IChpLmUKICAgdG8gc3RhcnQgd2l0aCBubyBleGlzdGluZyBjb29raWVzKSwgbGlrZToKCiAgICAgICAgY3VybCAtYiBub3doZXJlIGh0dHA6Ly9zaXRlL3NldGNvb2tpZWFuZHJlbG9jYXRlLmh0bWwKCiAtIEFkZGVkIGEgcGFyYWdyYXBoIGluIHRoZSBUT0RPIGZpbGUgYWJvdXQgdGhlIFNTTCBwcm9ibGVtcyByZWNlbnRseQogICByZXBvcnRlZC4gRXZpZGVudGx5LCBzb21lIGtpbmQgb2YgU1NMLXByb2JsZW0gY3VybCBtYXkgbmVlZCB0byBhZGRyZXNzLgoKIC0gQmV0dGVyICJMb2NhdGlvbjoiIGZvbGxvd2luZy4KCiBEb3VnbGFzIEUuIFdlZ3NjaGVpZCAoVHVlLCAzMCBNYXIgMTk5OSkKIC0gQSBzdWJzZWNvbmQgZGlzcGxheSBwYXRjaC4KCiBEYW5pZWwgKE1hciAxNCAxOTk5KQogLSBJJ3ZlIHNlcGFyYXRlZCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbGliY3VybCBhbmQgY3VybCBub3cuIFRvIG1ha2UKICAgdGhpbmdzIGEgbGl0dGxlIGVhc2llciwgSSBkZWNpZGVkIHRvIHN0YXJ0IHRoZSBjdXJsIG51bWJlcmluZyBmcm9tCiAgIDUuNiBhbmQgdGhlIGZvcm1lciB2ZXJzaW9uIG51bWJlciBrbm93biBhcyAiY3VybCIgaXMgbm93IHRoZSBvbmUKICAgc2V0IGZvciBsaWJjdXJsLgoKIC0gUmVtb3ZlZCB0aGUgJ2VuYWJsZS1uby1wYXNzJyBmcm9tIGNvbmZpZ3VyZSwgSSBkb3VidCBhbnlvbmUgd2FudGVkCiAgIHRoYXQuCgogLSBNYWRlIGxvdHMgb2YgdGlueSBhZGp1c3RtZW50cyB0byBjb21waWxlIHNtb290aGx5IHdpdGggY3lnd2luIHVuZGVyCiAgIHdpbjMyLiBJdCdzIGEga2lsbGVyIGZvciBwb3J0aW5nIHRoaXMgdG8gd2luMzIsIGJ5ZSBieWUgVkMrKyEgOy0pCiAgIENvbXBpbGVzIGFuZCBidWlsZHMgb3V0LW9mLXRoZS1ib3ggbm93LiBTZWUgdGhlIG5ldyB3b3JkaW5ncyBpbgogICBJTlNUQUxMIGZvciBkZXRhaWxzLgoKIC0gQmVnaW5uaW5nIGV4cGVyaW1lbnRzIHdpdGggZG93bmxvYWRpbmcgbXVsdGlwbGUgZG9jdW1lbnQgZnJvbSBhIGh0dHAKICAgc2VydmVyIHdoaWxlIHJlbWFpbmluZyBjb25uZWN0ZWQuCgpWZXJzaW9uIDUuNmJldGEKCiBEYW5pZWwgKE1hciAxMyAxOTk5KQogLSBTaW5jZSBJJ3ZlIGNoYW5nZWQgc28gbXVjaCwgSSB0aG91Z2h0IEknZCBqdXN0IGdvIGFoZWFkIGFuZCBpbXBsZW1lbnQgdGhlCiAgIHN1Z2dlc3Rpb24gZnJvbSBEb3VnbGFzIEUuIFdlZ3NjaGVpZC4gLUQgb3IgLS1kdW1wLWhlYWRlciBpcyBub3cgc3RvcmluZwogICBIVFRQIGhlYWRlcnMgc2VwYXJhdGVseSBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogLSBBZGRlZCBuZXcgdGV4dCB0byBJTlNUQUxMIG9uIHdoYXQgdG8gZG8gdG8gYnVpbGQgdGhpcyBvbiB3aW4zMiBub3cuCgogLSBBYWFyZ2guIEkgaGFkIHRvIHRha2UgYSBzdGVwIGJhY2sgYW5kIHByZWZpeCB0aGUgc2hhcmVkICNpbmNsdWRlIGZpbGVzCiAgIGluIHRoZSBzb3VyY2VzIHdpdGggIi4uL2luY2x1ZGUvIiB0byBwbGVhc2UgVkMrKy4uLgoKIERhbmllbCAoTWFyIDEyIDE5OTkpCiAtIFNwbGl0IHRoZSB1cmwuYyBzb3VyY2UgaW50byBtYW55IHRpbnkgc291cmNlcyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CiAgIGFuZCBzbWFsbGVyIHNpemUuCgogRGFuaWVsIChNYXIgMTEgMTk5OSkKIC0gU3RhcnRlZCB0byBjaGFuZ2Ugc3R1ZmYgZm9yIGEgbW92ZSB0byBtYWtlIGxpYmN1cmwgYW5kIGEgbW9yZSBzZXBhcmF0ZQogICBjdXJsIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGUgbGliY3VybC4gTWFkZSB0aGUgbGliY3VybCBzb3VyY2VzIGludG8KICAgdGhlIG5ldyBsaWIgZGlyZWN0b3J5IHdoaWxlIHRoZSBjdXJsIGFwcGxpY2F0aW9uIHdpbGwgcmVtYWluIGluIHNyYyBhcwogICBiZWZvcmUuIE5ldyBtYWtlZmlsZXMsIGFkanVzdGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIHNvLgoKICAgbGliY3VybC5hIGJ1aWx0IHF1aWNrbHkgYW5kIGVhc2lseS4gSSBiZXR0ZXIgbWFrZSBhIGJldHRlciBpbnRlcmZhY2UgdG8KICAgdGhlIGxpYiBmdW5jdGlvbnMgdGhvdWdoLgoKICAgVGhlIG5ldyByb290IGRpciBpbmNsdWRlLyBpcyBzdXBwb3NlZCB0byBjb250YWluIHRoZSBwdWJsaWMgaW5mb3JtYXRpb24KICAgYWJvdXQgdGhlIG5ldyBsaWJjdXJsLiBJdCBpcyBhIGxpdHRsZSB1Z2x5IHNvIGZhciA6LSkKCgogRGFuaWVsIChNYXIgMSAxOTk5KQogLSBUb2RkIEthdWZtYW5uIHNlbnQgbWUgYSBnb29kIGxpbmsgdG8gTmV0c2NhcGUncyBjb29raWUgc3BlYyBhcyB3ZWxsIGFzIHRoZQogICBpbmZvIHRoYXQgUkZDIDIxMDkgc3BlY2lmaWVzIGhvdyB0byB1c2UgdGhlbS4gIFRoZSBsaW5rIGlzIG5vdyBpbiB0aGUKICAgUkVBRE1FIGFuZCB0aGUgUkZDIGluIHRoZSBSRVNPVVJDRVMuCgogRGFuaWVsIChGZWIgMjMgMTk5OSkKIC0gRmluYWxseSBtYWRlIGNvbmZpZ3VyZSBhY2NlcHQgLS13aXRoLXNzbCB0byBsb29rIGZvciBTU0wgbGlicyBhbmQgaW5jbHVkZXMKICAgaW4gdGhlICJzdGFuZGFyZCIgcGxhY2UgL3Vzci9sb2NhbC9zc2wuLi4KCiBEYW5pZWwgKEZlYiAyMiAxOTk5KQogLSBWZXJpZmllZCB0aGF0IGN1cmwgbGlua2VkIGZpbmUgd2l0aCBPcGVuU1NMIDAuOS4xYyB3aGljaCBzZWVtcyB0byBiZQogICB0aGUgbW9zdCByZWNlbnQuCgogSGVucmkgR29tZXogKEZyaSBGZWIgIDUgMTk5OSkKIC0gU2VudCBpbiBhbiB1cGRhdGVkIGN1cmwtc3NsLnNwZWMuIEkgc3RpbGwgbWlzcyB0aGUgc2NyaXB0IHRoYXQgYnVpbGRzIGFuCiAgIFJQTSBhdXRvbWF0aWNhbGx5Li4uCgpWZXJzaW9uIDUuNS4xCgogTWFyayBCdXRsZXIgKDI3IEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgcHJvYmxlbXMgaW4gRG93bmxvYWQoKS4KCiBEYW5pdGVsIFN0ZW5iZXJnICgyNSBKYW4gMTk5OSkKIC0gSmVyZW1pZSBQZXRpdCBwb2ludGVkIG91dCBhIGZldyBmbGF3cyBpbiB0aGUgc291cmNlIHRoYXQgcHJldmVudGVkIGl0IGZyb20KICAgY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGUgbmF0aXZlIGNvbXBpbGVyIHVuZGVyIERpZ2l0YWwgVW5peCB2NC4wZC4KClZlcnNpb24gNS41CgogRGFuaWVsIFN0ZW5iZXJnICgxNSBKYW4gMTk5OSkKIC0gQWRkZWQgQmpvcm5zIHNtYWxsIHRleHQgdG8gdGhlIFJFQURNRSBhYm91dCB0aGUgRElDVCBwcm90b2NvbC4KCiBEYW5pZWwgU3RlbmJlcmcgKDExIEphbiAxOTk5KQogLSA8anN3aW5rIGF0IHNvZnRjb20ubmV0PiByZXBvcnRlZCBhYm91dCB0aGUgd2luMzItdmVyc2lvaW46ICJEb2Vzbid0IHVzZQogICBBTExfUFJPWFkgZW52aXJvbm1lbnQgdmFyaWFibGUiLiBUdXJuZWQgb3V0IHRvIGJlIGJlY2F1c2Ugb2YgdGhlIHN0YXRpYy0KICAgYnVmZmVyIG5hdHVyZSBvZiB0aGUgd2luMzIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FsbHMhCgogQmpvcm4gUmVlc2UgKDEwIEphbiAxOTk5KQogLSBJIGhhdmUgYXR0YWNoZWQgYSBzaW1wbGUgYWRkaXRpb24gZm9yIHRoZSBESUNUIHByb3RvY29sIChSRkMgMjIyOSkuCiAgIEl0IHBlcmZvcm1zIGRpY3Rpb25hcnkgbG9va3Vwcy4gVGhlIG91dHB1dCBzdGlsbCBuZWVkcyB0byBiZSBiZXR0ZXIKICAgZm9ybWF0dGVkLgoKICAgVG8gdGVzdCBpdCB0cnkgKHRoZSBleGFjdCBmb3JtYXQsIGFuZCBtb3JlIGV4YW1wbGVzIGFyZSBkZXNjcmliZWQgaW4KICAgdGhlIFJGQykKCiAgICAgICAgZGljdDovL2RpY3Qub3JnL206aGVsbG8KICAgICAgICBkaWN0Oi8vZGljdC5vcmcvbTpoZWxsbzo6c291bmRleAoKCiBWaWNlbnRlIEdhcmNpYSAoMTAgSmFuIDE5OTkpCiAtIENvcnJlY3RlZCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDIwTUIuCgogRGFuaWVsIFN0ZW5iZXJnICg3IEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIC10IGFuZCAtVCBoZWxwIHRleHRzLiBUaGV5IGNsYWltZWQgdG8gYmUgRlRQIG9ubHkuCgpWZXJzaW9uIDUuNAoKIERhbmllbCBTdGVuYmVyZwogKDcgSmFuIDE5OTkpCiAtIElydmluZyBXb2xmZSByZXBvcnRlZCB0aGF0IGN1cmwgLXMgZGlkbid0IGFsd2F5cyBzdXByZXNzIHRoZSBwcm9ncmVzcwogICByZXBvcnRpbmcuIEl0IHdhcyB0aGUgZm9ybSBwb3N0IHRoYXQgYXV0b2FtdGljYWxseSBhbHdheXMgc3dpdGNoZWQgaXQgb24KICAgYWdhaW4uIFRoaXMgaXMgbm93IGNvcnJlY3RlZCEKCiAoNCBKYW4gMTk5OSkKIC0gQW5kcmVhcyBLb3N0eXJrYSBzdWdnZXN0ZWQgSSdkIGFkZCBQVVQgYW5kIGhlIGhlbHBlZCBtZSBvdXQgdG8gdGVzdCBpdC4gSWYKICAgeW91IHVzZSAtdCBvciAtVCBub3cgb24gYSBodHRwIG9yIGh0dHBzIHNlcnZlciwgUFVUIHdpbGwgYmUgdXNlZCBmb3IgZmlsZQogICB1cGxvYWQuCgogICBJIHJlbW92ZWQgdGhlIGZvcm1lciB1c2Ugb2YgLVQgd2l0aCBIVFRQLiBJIGRvdWJ0IGFueW9uZSBldmVyIHJlYWxseSB1c2VkCiAgIHRoYXQuCgogKDQgSmFuIDE5OTkpCiAtIEVyaWsgSmFjb2JzZW4gZm91bmQgYSB3aWR0aCBidWcgaW4gdGhlIG1wcmludGYoKSBmdW5jdGlvbi4gIEkgY29ycmVjdGVkIGl0CiAgIG5vdy4KCiAoNCBKYW4gMTk5OSkKIC0gQXMgSm9obiBWLiBDaG93IHBvaW50ZWQgb3V0IHRvIG1lLCBjdXJsIGFjY2VwdGVkIHZlcnkgbGltaXRlZCBVUkwgc2l6ZXMuIEl0CiAgIHNob3VsZCBub3cgYWNjZXB0IHBhdGggcGFydHMgdGhhdCBhcmUgdXAgdG8gYXQgbGVhc3QgNDA5NiBieXRlcy4KCiAtIFNvbWVob3cgSSBzY3Jld2VkIHVwIHdoZW4gYXBwbHlpbmcgdGhlIEFJWCBmaXggZnJvbSBHaWxiZXJ0IFJhbWlyZXosIHNvCiAgIEkgcmVkaWQgdGhhdCBub3cuCgpWZXJzaW9uIDUuM2EgKHdpbjMyIG9ubHkpCgogVHJveSBFbmdlbAogLSBDb3JyZWN0ZWQgYSB3aW4zMiBidWcgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHBhcnQuCgpWZXJzaW9uIDUuMwoKIEdpbGJlcnQgUmFtaXJleiBKci4gKDIxIERlYyAxOTk4KQogLSBJIGhhdmUgaW1wbGVtZW50ZWQgdGhlICJxdW90ZSIgZnVuY3Rpb24gb2YgRlRQIGNsaWVudHMuIEl0IGFsbG93cyB5b3UgdG8KICAgc2VuZCBhcmJpdHJhcnkgY29tbWFuZHMgdG8gdGhlIHJlbW90ZSBGVFAgc2VydmVyLiBJIGNob3NlIHRoZSAtUS8tLXF1b3RlCiAgIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCgogICBZb3UgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZSBxdW90ZWQgc3RyaW5nLCBhbmQgY3VybCB3aWxsIGFwcGx5IHRoZW0gaW4KICAgb3JkZXIuICBUaGlzIGlzIHdoYXQgSSB1c2UgZm9yIG15IE1WUyB1cGxvYWQ6CgogIGN1cmwgLUIgLS1jcmxmIC1RICJzaXRlIGxyZWNsPTgwIiAtUSAic2l0ZSBibGs9ODAwMCIgLVQgZmlsZSBmdHA6Ly9vczM5MC90ZXN0CgogICBDdXJsIHdpbGwgc2VuZCB0aGUgdHdvIHF1b3RlZCAic2l0ZSIgY29tbWFuZHMgaW4gdGhlIHByb3BlciBvcmRlci4KCiAtIE1hZGUgaXQgY29tcGlsZSBzbW9vdGhseSBvbiBBSVguCgogR2lsYmVydCBSYW1pcmV6IEpyLiAoMTggRGVjIDE5OTgpCiAtIEJyb3VnaHQgYW4gTVZTIHBhdGNoOiAtMy8tLW12cywgZm9yIGZ0cCB1cGxvYWQgdG8gdGhlIE1WUyBmdHAgc2VydmVyLgoKIFRyb3kgRW5nZWwgKDE3IERlYyAxOTk4KQogLSBCcm91Z2h0IGEgY29ycmVjdGlvbiB0aGF0IGZpeGVzIHRoZSB3aW4zMiBjdXJsIGJ1Zy4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQSBidWcsIHBvaW50ZWQgb3V0IHRvIG1lIGJ5IERyIEguIFQuIExldW5nLCBjYXVzZWQgY3VybCB0byBjcmFzaCBvbiB0aGUgLUEKICAgZmxhZyBvbiBjZXJ0YWluIHN5c3RlbXMuIEFjdHVhbGx5LCBhbGwgc3lzdGVtcyBzaG91bGQndmUhCgogLSBBZGRlZCBhIGZldyBkZWZpbmVzIHRvIG1ha2UgZGlyZWN0b3JpZXMvZmlsZSBuYW1lcyBnZXQgYnVpbGQgbmljZXIgKHdpdGggXwogICBpbnN0ZWFkIG9mIC4gYW5kIFwgaW5zdGVhZCBvZiAvIGluIHdpbjMyKS4KCiAtIHN0ZXZlIDxmaXNrIGF0IHBvbGFyLmJvd2RvaW4uZWR1PiByZXBvcnRlZCBhIHdlaXJkIGJ1ZyB0aGF0IG9jY3VyZWQgaWYgdGhlCiAgIGZ0cCBzZXJ2ZXIgcmVzcG9uc2UgbGluZSBoYWQgYSBwYXJlbnRoZXNpcyBvbiB0aGUgbGluZSBiZWZvcmUgdGhlIChzaXplKQogICBpbmZvLiBJIGhvcGUgaXQgd29ya3MgYmV0dGVyIG5vdyEKClZlcnNpb24gNS4yLjEKCiBTdGV2ZW4gRy4gSm9obnNvbiAoRGVjIDE0LCAxOTk4KQogLSBCcm91Z2h0IGEgZml4IHRoYXQgY29ycmVjdGVkIGEgY3Jhc2ggaW4gNS4yIGR1ZSB0byBiYWQgdHJlYXRtZW50IG9mIHRoZQogICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgpWZXJzaW9uIDUuMgoKIERhbmllbCBTdGVuYmVyZyAoRGVjIDE0LCAxOTk4KQogLSBSZXdyb3RlIHRoZSBta2hlbHAgc2NyaXB0IGFuZCBub3csIHRoZSBta2hlbHAucGwgc2NyaXB0IGdlbmVyYXRlcyB0aGUKICAgaHVnZWhlbHAuYyBmaWxlIGZyb20gdGhlIFJFQURNRSAqYW5kKiB0aGUgbWFuIHBhZ2UgZmlsZSBjdXJsLjEuIEJ5IHVzaW5nCiAgIGJvdGggZmlsZXMsIEkgbm8gbG9uZ2VyIG5lZWQgdG8gaGF2ZSBkb3VibGUgaW5mb3JtYXRpb24gaW4gYm90aCB0aGUgbWFuCiAgIHBhZ2UgYW5kIHRoZSBSRUFETUUgYXMgd2VsbC4gU28sIHdpbjMyLXVzZXJzIHdpbGwgb25seSBoYXZlIHRoZSBodWdlaGVscC5jCiAgIGZpbGUgZm9yIGFsbCBpbmZvLCBidXQgdGhlbiwgdGhleSBkb3dubG9hZCB0aGUgcGxhaW4gYmluYXJ5IG1vc3QgdGltZXMKICAgYW55d2F5LgoKIC0gZ2NjMi44LjEgd2l0aCB0aGUgLVdhbGwgZmxhZyBjb21wbGFpbnRzIGEgbG90IG9uIHN1YnNjcmlwdCBoYXMgdHlwZSBgY2hhcicKICAgaWYgSSBkb24ndCBleHBsaWNpdGx5IHR5cGVjYXN0IHRoZSBhcmd1bWVudCB0byBpc2RpZ2l0KCkgb3IgaXNzcGFjZSgpIHRvCiAgIGludC4gU28gSSBkaWQgdG8gY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGF0IHRvby4KCiAtIEFkZGVkIGNoZWNrcyBmb3IgJ2xvbmcgZG91YmxlJyBhbmQgJ2xvbmcgbG9uZycgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuIEkKICAgbmVlZCB0aG9zZSBmb3IgdGhlIG1wcmludGYuYyBzb3VyY2UgdG8gY29tcGlsZSB3ZWxsIG9uIG5vbiBsb25nIGxvbmcKICAgY29tZm9ybWluZyBzeXN0ZW1zIQoKVmVyc2lvbiA1LjEgKG5vdCBwdWJsaWNseSByZWxlYXNlZCkKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxMCwgMTk5OCkKIC0gSSBnb3QgYSByZXF1ZXN0IGZvciBhIHByZS1jb21waWxlZCBOVCBBbHBoYSB2ZXJzaW9uLiBBbnlvbmU/CgogLSBBZGRlZCBMeW54L0NFUk4gd3d3IGxpYiBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzdXBwb3J0LiBUaGF0IG1lYW5zIGN1cmwKICAgbm93IHJlYWRzIGFuZCB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczoKCglIVFRQX1BST1hZLCBIVFRQU19QUk9YWSwgRlRQX1BST1hZLCBHT1BIRVJfUFJPWFkKCiAgIFRoZXkgc2hvdWxkIGJlIHNldCBmb3IgcHJvdG9jb2wtc3BlY2lmaWMgcHJveGllcy4gR2VuZXJhbCBwcm94eSBzaG91bGQgYmUKICAgc2V0IHdpdGgKCQoJQUxMX1BST1hZCgogICBBbmQgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBob3N0IG5hbWVzIHRoYXQgc2hvdWxkbid0IGdvIHRocm91Z2ggYW55CiAgIHByb3h5IGlzIHNldCBpbiAob25seSBhbiBhc3RlcmlzaywgJyonIG1hdGNoZXMgYWxsIGhvc3RzKS4KCglOT19QUk9YWQoKICAgVGhlIHVzYWdlIG9mIHRoZSAteC8tLXByb3h5IGZsYWcgb3ZlcnJpZGVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgogLSBQcm94eSBjYW4gbm93IGJlIHNwZWNpZmllZCB3aXRoIGEgcHJvY290b2w6Ly8gcHJlZml4LgoKIC0gV3JvdGUgdGhlIGN1cmwuMSBtYW4gcGFnZS4KCiAtIEludHJvZHVjZWQgYSB3aG9sZSBuZXcgZHluYW1pYyBidWZmZXIgc3lzdGVtIGZvciBhbGwgc3ByaW50Zigpcy4gSXQgaXMKICAgYmFzZWQgb24gdGhlICpwcmludGYoKSBwYWNrYWdlIGJ5IHlvdXJzIHRydWx5IGFuZCBCam9ybiBSZWVzZS4gSG9wZWZ1bGx5LAogICB0aGVyZSBhcmVuJ3QgdGhhdCBtYW55IGJ1ZmZlciBvdmVyZmxvdyByaXNrcyBsZWZ0IG5vdy4KCiAtIEFoLCBJIHNob3VsZCBtZW50aW9uIEkndmUgY29tcGlsZWQgYW5kIGJ1aWx0IGN1cmwgc3VjY2Vzc2Z1bGx5IHVuZGVyCiAgIHNvbGFyaXMgMi42IHdpdGggZ2NjIG5vdywgZ2NjIDIuNy4yIHdvbid0IHdvcmsgYnV0IDIuOC4xIGRpZCBvay4KCiBPcmVuIFRpcm9zaCAoRGVjIDMsIDE5OTgpCiAtIEJyb3VnaHQgdHdvIC5zcGVjIGZpbGVzLCB0byB1c2Ugd2hlbiBjcmVhdGluZyAoTGludXgpIFJlZGhhdCBzdHlsZSBSUE0KICAgcGFja2FnZXMuIFRoZXkncmUgbmFtZWQgY3VybC5zcGVjIGFuZCBjdXJsLXNzbC5zcGVjLgoKIFRyb3kgRW5nZWwKIC0gU3VwcGxpZWQgdGhlIHNyYy9NYWtlZmlsZS52YzYgZm9yIGVhc3kgY29tcGlsaW5nIHdpdGggVkMrKyB1bmRlciBXaW4zMi4KClZlcnNpb24gNS4wCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMSwgMTk5OCkKIC0gTm90IGEgc2luZ2xlIGJ1ZyByZXBvcnQgaW4gYWdlcy4KIC0gQ29ycmVjdGVkIGdldHBhc3MuYyBhbmQgbWFpbi5jIHRvIGNvbXBpbGUgd2FybmluZyBhbmQgZXJyb3IgZnJlZSB3aXRoIHRoZQogICBXaW4zMiBWQysrIGNyYXAuCgpWZXJzaW9uIDUuMCBiZXRhIDI0CgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMjAsIDE5OTgpCgogSE9XIFRPIEJVSUxEIEEgUkVMRUFTRSBBUkNISVZFOgoKICogUHJlLXJlcXVpc2l0ZSBzb2Z0d2FyZToKICAgV2hhdAkJICAgICBUbyBidWlsZCB3aGF0ICAgICAgICAgICAgIFJlYWRzIGRhdGEgZnJvbQogICA9PT09ICAgICAgICAgICAgICA9PT09PT09PT09PT09ICAgICAgICAgICAgID09PT09PT09PT09PT09PQogICBHTlUgYXV0b21ha2UgICAgICBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNCAgIGNvbmZpZ3VyZS5pbgogICAgIEdOVSBtYWtlKDEpICAgICAgLSAiIC0KICAgICBHTlUgZ2NjKDEpICAgICAgIC0gIiAtCiAgIEdOVSBhdXRvY29uZiAgICAgIGNvbmZpZ3VyZSAgICAgICAgICAgICAgICAgY29uZmlndXJlLmluCiAgIEdOVSBhdXRvaGVhZGVyKDIpIGNvbmZpZy5oLmluCSAgICAgICBjb25maWd1cmUuaW4sIGFjY29uZmlnLmgKCiAqIE1ha2Ugc3VyZSBhbGwgZmlsZXMgdGhhdCBzaG91bGQgYmUgcGFydCBvZiB0aGUgYXJjaGl2ZSBhcmUgcHV0IGluIEZJTEVTLgoKICogUnVuICcuL21ha2V0Z3onIGFuZCBlbnRlciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbmV3IHRvIGJlY29tZSBhcmNoaXZlLgoKICAgbWFrZXRneiBkb2VzOgoKICAgLSBFbnRlcnMgdGhlIG5ld2x5IGNyZWF0ZWQgdmVyc2lvbiBudW1iZXIgaW4gdXJsLmguCiAgIC0gKElmIHlvdSBkb24ndCBoYXZlIGF1dG9tYWtlLCB0aGlzIHNjcmlwdCB3aWxsIHdhcm4gYWJvdXQgdGhhdCwgYnV0IHVubGVzcwogICAgIHlvdSBoYXZlIGNoYW5nZWQgdGhlIE1ha2VmaWxlLmFtIGZpbGVzLCB0aGF0IGlzIG5vdGhpbmcgdG8gY2FyZSBhYm91dC4pCiAgICAgSWYgeW91IGhhdmUgaXQsIGl0J2xsIHJ1biBpdC4KICAgLSBJZiB5b3UgaGF2ZSBhdXRvY29uZiwgdGhlIGNvbmZpZ3VyZS5pbiB3aWxsIGJlIGVkaXRlZCB0byBnZXQgdGhlIG5ld2x5CiAgICAgY3JlYXRlZCB2ZXJzaW9uIG51bWJlciBhbmQgYXV0b2NvbmYgd2lsbCBiZSBydW4uCiAgIC0gQ3JlYXRlcyBhIG5ldyBkaXJlY3RvcnkgbmFtZWQgY3VybC08dmVyc2lvbj4uIChBY3R1YWxseSwgaXQgdXNlcyB0aGUgYmFzZQogICAgIG5hbWUgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVwIHRvIHRoZSBmaXJzdCAnLScuKQogICAtIENvcGllcyBhbGwgZmlsZXMgbWVudGlvbmVkIGluIEZJTEVTIHRvIHRoZSBuZXcgZGlyZWN0b3J5LiBTYXZpbmcKICAgICBwZXJtaXNzaW9ucyBhbmQgZGlyZWN0b3J5IHN0cnVjdHVyZS4KICAgLSBVc2VzIHRhciB0byBjcmVhdGUgYW4gYXJjaGl2ZSBvZiBpdCBhbGwsIG5hbWVkIGN1cmwtPHZlcnNpb24+LnRhci5negogICAtIGd6aXBzIHRoZSBhcmNoaXZlCiAgIC0gUmVtb3ZlcyB0aGUgbmV3IGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBjb250ZW50cy4KCiAqIFdoZW4gZG9uZSwgeW91IGhhdmUgYW4gYXJjaGl2ZSBzdG9yZWQgaW4geW91ciBkaXJlY3RvcnkgbmFtZWQKICAgY3VybC08dmVyc2lvbj4udGFyLmd6LgoKICAgRG9uZSEKCiAgICgxKSBUaGV5J3JlIHJlcXVpcmVkIHRvIG1ha2UgYXV0b21ha2UgcnVuIHByb3Blcmx5LgogICAoMikgSXQgaXMgZGlzdHJpYnV0ZWQgYXMgYSBwYXJ0IG9mIHRoZSBHTlUgYXV0b2NvbmYgYXJjaGl2ZS4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxOCwgMTk5OCkKIC0gSSBjaGFuZ2VkIHRoZSBUQUctc3lzdGVtLiBJZiB5b3UgZXZlciB1c2VkIHVybGdldCgpIGZyb20gdGhpcyBwYWNrYWdlIGluCiAgIGFub3RoZXIgcHJvZHVjdCwgeW91IG5lZWQgdG8gcmVjb21waWxlIHdpdGggdGhlIG5ldyBoZWFkZXJzLiBJIGRpZCB0aGlzCiAgIG5ldyBzdHVmZiB0byBiZXR0ZXIgZGVhbCB3aXRoIGRpZmZlcmVudCBjb21waWxlcnMgYW5kIHN5c3RlbSB3aXRoIGRpZmZlcmVudAogICB2YXJpYWJsZSBzaXplcy4gSSB0aGluayBpdCBtYWtlcyBpdCBhIGxpdHRsZSBtb3JlIHBvcnRhYmxlLiBUaGlzIHByb3ZlcwogICB0byBjb21waWxlIHdhcm5pbmcgZnJlZSB3aXRoIHRoZSBwcm9ibGVtYXRpYyBJUklYIGNvbXBpbGVyIQogLSBXaW4zMiBjb21waWxlZCB3aXRoIGEgc2lsbHkgZXJyb3IuIENvcnJlY3RlZCBub3cuCiAtIEJyaWFuIENoYXBsaW4gcmVwb3J0ZWQgeWV0IGFub3RoZXIgcHJvYmxlbSBpbgogICBtdWx0aWxpbmUgRlRQIHJlc3BvbnNlcy4gSSd2ZSB0cmllZCB0byBjb3JyZWN0IGl0LiBJIG1haWxlZCBoaW0gYSBuZXcKICAgdmVyc2lvbiBhbmQgSSBob3BlIGhlIGdldHMgYmFjayBzb29uIHdpdGggcG9zaXRpdmUgZmVlZGJhY2shCiAtIEltcHJvdmVkIHRoZSAnbWFrZXRneicgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0cmVlIHdoaWNoIGl0IG1ha2VzCiAgIGFuIGFyY2hpdmUgZnJvbSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyByZW5hbWluZyBvZiB0aGUgY3VycmVudCBvbmUuCiAtIE1haWxpbmcgbGlzdCBvcGVuZWQgKHNlZSBSRUFETUUpLgogLSBNYWRlIC12IG1vcmUgdmVyYm9zZSBvbiB0aGUgUEFTViBzZWN0aW9uIG9mIGZ0cCB0cmFuc2ZlcnMuIE5vdyBpdCB0ZWxscwogICBob3N0IG5hbWUgYW5kIElQIG9mIHRoZSBuZXcgaG9zdCAoYW5kIHBvcnQgbnVtYmVyKS4gSSBhbHNvIGFkZGVkIGEgc2VjdGlvbgogICBhYm91dCBQT1JUIHZzIFBBU1YgaW4gdGhlIFJFQURNRS4KClZlcnNpb24gNS4wIGJldGEgMjEKCiBBbmd1cyBNYWNrYXkgKE5vdiAxNSwgMTk5OCkKIC0gSW50cm9kdWNlZCBhdXRvbWFrZSBzdHVmZi4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMywgMTk5OCkKIC0gSnVzdCBtYWRlIGEgc3VjY2Vzc2Z1bCBHRVQgb2YgYSBkb2N1bWVudCBmcm9tIGFuIFNTTC1zZXJ2ZXIgdXNpbmcgbXkgb3duCiAgIHByaXZhdGUgY2VydGlmaWNhdGUgZm9yIGF1dGhlbnRpY2F0aW9uISBUaGUgY2VydGlmaWNhdGUgaGFzIHRvIGJlIGluIFBFTQogICBmb3JtYXQuIFlvdSBkbyB0aGF0IHRoZSBlYXNpZXN0IHdheSAoYWx0aG91Z2ggbm90ICp0aGF0KiBlYXN5KSBieQogICBkb3dubG9hZGluZyB0aGUgU1NMeWVheSBQS0NTIzEyLXBhdGNoIGJ5IERyIFN0ZXBoZW4gTi4gSGVuc29uIGZyb20gaGlzIHNpdGUKICAgYXQ6IGh0dHA6Ly93d3cuZHJoLWNvbnN1bHRhbmN5LmRlbW9uLmNvLnVrLy4gVXNpbmcgaGlzIHRvb2wsIHlvdSBjYW4KICAgY29udmVydCBhbnkgbW9kZXJuIE5ldHNjYXBlIG9yIChldmVuKSBNU0lFIGNlcnRpZmljYXRlIHRvIFBFTS1mb3JtYXQuICBVc2UKICAgaXQgd2l0aCAnY3VybCAtRSA8Y2VydGlmaWNhdGU6cGFzc3dvcmQ+IGh0dHBzOi8vc2l0ZS5jb20nLiAgSWYgdGhpcyBpc24ndCBhCiAgIGNvb2wgZmVhdHVyZSwgdGhlbiBJIGRvbid0IGtub3cgd2hhdCBjb29sIGZlYXR1cmVzIGxvb2sgbGlrZSEgOy0pCiAtIFdvcmtpbmcgc2xvd2x5IG9uIHRlbG5ldCBjb25uZWN0aW9ucy4gI2RlZmluZSBUUllfVEVMTkVUIHRvIHRyeSBpdCBvdXQuCiAgIChjdXJsIC11IHVzZXI6cGFzc3dkICJ0ZWxuZXQ6Ly9ob3N0LmNvbS9jYXQgLmxvZ2luIiBpcyBvbmUgZXhhbXBsZSkgSSBkbwogICBoYXZlIHByb2JsZW0gdG8gZGVmaW5lIGhvdyBpdCBzaG91bGQgd29yay4gVGhlIHByaW1lIHB1cnBvc2UgZm9yIHRoaXMgbXVzdAogICBiZSB0byBnZXQgKDhiaXQgY2xlYW4pIGZpbGVzIHZpYSB0ZWxuZXQsIGFuZCBpdCByZWFsbHkgaXNuJ3QgdGhhdCBlYXN5IHRvCiAgIGdldCBmaWxlcyB0aGlzIHdheS4gU3RpbGwgaGF2aW5nIHByb2JsZW1zIHdpdGggXG4gYmVpbmcgY29udmVydGVkIHRvIFxyXG4uCgogQW5ndXMgTWFja2F5IChOb3YgMTIsIDE5OTgpCiAtIENvcnJlY3RlZCBhbm90aGVyIGJ1ZyBpbiB0aGUgbG9uZyBwYXJhbWV0ZXIgbmFtZSBwYXJzZXIuCiAtIE1vZGlmaWVkIGdldHBhc3MuYyAoTk9URTogc2VlIHRoZSBzcGVjaWFsIGxpY2Vuc2luZyBpbiB0aGUgdG9wIG9mIHRoYXQKICAgc291cmNlIGZpbGUpLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEyLCAxOTk4KQogLSBXZSBtYXkgaGF2ZSByZW1vdmVkIHRoZSBzaWxseSB3YXJuaW5ncyBmcm9tIHVybC5jIHdoZW4gY29tcGlsZWQgdW5kZXIgSVJJWC4KICAgVGhhbmtzIGFnYWluIHRvIEJqb3JuIFJlZXNlIGFuZCBNYXJ0aW4gU3RhYWVsLgogLSBXcm90ZSBmb3JtZmluZC5wbCB3aGljaCBpcyBhIG5ldyBwZXJsIHNjcmlwdCBpbnRlbmRlZCB0byBoZWxwIHlvdSBmaW5kIG91dAogICBob3cgYSBGT1JNIHN1Ym1pc3Npb24gc2hvdWxkIGJlIGRvbmUuIFRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrIHRvIGdldAogICByZWFsbHkgZ29vZC4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMSwgMTk5OCkKIC0gTWFkZSB0aGUgSFRUUCBoZWFkZXItY2hlY2tlciBhY2NlcHQgd2hpdGUgc3BhY2VzIGJlZm9yZSB0aGUgSFRUUC8xLj8gbGluZS4KICAgQXBwZWFyYW50bHkgc29tZSBwcm94aWVzL3NpdGVzIGFkZCBzdWNoIGF0IHRpbWVzIChteSB0ZXN0IHByb3h5IGRpZCB3aGVuIEkKICAgZG93bmxvYWRlZCBhIGdvcGhlciBwYWdlIHdpdGggaXQpIQogLSBNb3ZlZCB0aGUgZm9ybWVyIC1oIHRvIC1NIGFuZCBtYWRlIC1oIHNob3cgdGhlIHNob3J0IGhlbHAgdGV4dCBpbnN0ZWFkLiBJCiAgIGhhZCB0byBlbmFibGUgYSBmb3JjZWQgaGVscCB0ZXh0IG9wdGlvbi4gTm93IGFuIGV2ZW4gc2hvcnRlciBoZWxwIHRleHQgd2lsbAogICBiZSBwcmVzZW50ZWQgd2hlbiBhbiB1bmtub3duIG9wdGlvbiBhbmQgc2ltaWxhciwgaXMgdXNlZC4KIC0gc3RkY2hlYWRlcnMuaCBkaWRuJ3Qgd29yayB3aXRoIElSSVggNi40IG5hdGl2ZSBjYyBjb21waWxlci4gSSBob3BlIG15CiAgIGNoYW5nZXMgZG9uJ3QgbWFrZSBvdGhlciB2ZXJzaW9ucyBnbyBudXRzIGluc3RlYWQuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTAsIDE5OTgpCiAtIEFkZGVkIGEgd2VpcmQgY2hlY2sgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gY2hlY2sgZm9yIHRoZSBzaWxseSBBSVgKICAgd2FybmluZ3MgYWJvdXQgbXkgI2RlZmluZSBzdHJjYXNlY21wKCkgc3R1ZmYuIEkgZG8gdGhhdCBkZWZpbmUgdG8gcHJldmVudAogICBtZSBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHRvIGFjY2lkZW50YWx5IHVzZSB0aGF0IGZ1bmN0aW9uIG5hbWUgaW5zdGVhZAogICBvZiBzdHJlcXVhbCgpLi4uCiAtIEkgYnVnZml4ZWQgQW5ndXMncyBnZXRwYXNzLmMgdmVyeSBsaXR0bGUuCiAtIEZpeGVkIHRoZSB2ZXJib3NlIGZsYWcgbmFtZXMgdG8gZ2V0b3B0LXN0eWxlLCBpLmUgJ2N1cmwgLS1sb2MnIHdpbGwgYmUKICAgc3VmZmljaWVudCBpbnN0ZWFkIG9mIC0tbG9jYXRpb24gYXMgImxvYyIgaXMgYSB1bmlxdWUgcHJlZml4LiBBbHNvLCBhbnl0aGluZwogICBhZnRlciBhICctLScgaXMgdHJlYXRlZCBhcyBhbiBVUkwuIFNvIGlmIHlvdSBkbyBoYXZlIGEgaG9zdCB3aXRoIGEgd2VlZWlyZAogICBuYW1lIHlvdSBjYW4gZG8gJ2N1cmwgLS0gLWhvc3QuY29tJy4KIC0gQW5vdGhlciBnZXRvcHQtYWRqdXN0OyBjdXJsIG5vdyBhY2NlcHRzIGZsYWdzIGFmdGVyIHRoZSBVUkwgb24gdGhlIGNvbW1hbmQKICAgbGluZS4gJ2N1cmwgd3d3LmZvby5jb20gLU8nIGlzIHBlcmZlY3RseSB2YWxpZC4KIC0gQ29ycmVjdGVkIHRoZSAuY3VybHJjIHBhcnNlciBzbyB0aGF0IHN0cnRvaygpIGlzIG5vIGxvbmdlciB1c2VkIGFuZCBJCiAgIGJlbGlldmUgaXQgd29ya3MgYmV0dGVyLiBFdmVuIFVSTHMgY2FuIGJlIHNwZWNpZmllZCBpbiBpdCBub3cuCgogQW5ndXMgTWFja2F5IChOb3YgOSwgMTk5OCkKIC0gUmVwbGFjZWQgZ2V0cGFzcy5jIHdpdGggYSBuZXdseSB3cml0dGVuIG9uZSwgbm90IHVuZGVyIEdQTCBsaWNlbnNlCiAtIENoYW5nZWQgT1MgdG8gYSAjZGVmaW5lIGluIGNvbmZpZy5oIGluc3RlYWQgb2YgY29tcGlsZXIgZmxhZwogLSBNYWtlZmlsZSBub3cgdXNlcyAtREhBVkVfQ09ORklHX0gKCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiA5LCAxOTk4KQogLSBPaywgSSBleHBhbmRlZCB0aGUgdGd6LXRhcmdldCB0byB1cGRhdGUgdGhlIHZlcnNpb24gc3RyaW5nIG9uIGVhY2ggb2NjYXRpb24KICAgSSBidWlsZCBhIHJlbGVhc2UgYXJjaGl2ZSEKIC0gSSByZWFjdGVkIG9uIEFuZ3VzIE1hY2theSdzIGluaXRpYXRpdmUgYW5kIHJlbWFkZSB0aGUgcGFyYW1ldGVyIHBhcnNlciB0bwogICBiZSBtb3JlIGdldG9wdCBjb21wbGlhbnQuIEN1cmwgbm93IHN1cHBvcnRzICJtZXJnZWQiIGZsYWdzIGFzIGluIAoJY3VybCAtbHN2IGZ0cC5zaXRlLmNvbQogICBEbyBub3RlIHRoYXQgSSBoYWQgdG8gbW92ZSB0aHJlZSBzaG9ydC1uYW1lcyBvZiB0aGUgb3B0aW9ucy4gUGFyYW1ldGVycwogICB0aGF0IG5lZWRzIGFuIGFkZGl0aW9uYWwgc3RyaW5nIHN1Y2ggYXMgLXggbXVzdCBiZSBzdGFuZC1hbG9uZSBvciB0aGUKICAgbGFzdCBpbiBhIG1lcmdlZCBzZXF1ZW5jZToKCWN1cmwgLWxzeCBteS1wcm94eSBmdHAuc2l0ZS5jb20KICAgaXMgb2ssIGJ1dCB1c2luZyB0aGUgZmxhZ3MgaW4gYSBkaWZmZXJlbnQgb3JkZXIgbGlrZSAnLWx4cycgd291bGQgY2F1c2UKICAgdW5leHBlY3RlZCByZXN1bHRzIChhcyB0aGUgJ3MnIG9wdGlvbiB3b3VsZCBiZSBza2lwcGVkKS4KIC0gSSd2ZSBjaGFuZ2VkIHRoZSBoZWFkZXJzIGluIGFsbCBmaWxlcyB0aGF0IGFyZSBzdWJqZWN0IHRvIHRoZSBNb3pQTAogICBsaWNlbnNlLCBhcyB0aGV5IGFyZSBzdXBwb3NlZCB0byBsb29rIGxpa2Ugd2hlbiBjb25mb3JtaW5nLgogLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IG1ha2UgdGhlIGNvbmZpZy5oLiBUaGUgZm9ybWVyIGNvbmZpZy5oIGlzIG5vdwogICBzZXR1cC5oLgogLSBUaGUgUkVTT1VSQ0VTIGFuZCBUT0RPIGZpbGVzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KCiBBbmd1cyBNYWNrYXkgKE5vdiA1LCAxOTk4KQogLSBGaXhlZCBnZXRwYXNzLmMgYW5kIHZhcmlvdXMgY29uZmlndXJlIHN0dWZmCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMywgMTk5OCkKIC0gVXNlIC1ILy0taGVhZGVyIGZvciBjdXN0b20gSFRUUC1oZWFkZXJzLiBMZXRzIHlvdSBwYXNzIG9uIHlvdXIgb3duCiAgIHNwZWNpZmllZCBoZWFkZXJzIHRvIHRoZSByZW1vdGUgc2VydmVyLiBJIHdvdWxkbid0IHJlY29tbWVuZCB0cnlpbmcgdG8gdXNlCiAgIGEgaGVhZGVyIHdpdGggYSBkZWZpbmVkIHVzYWdlIGFjY29yZGluZyB0byBzdGFuZGFyZHMuIFVzZSB0aGlzIGZsYWcgb25jZQogICBmb3IgZXZlcnkgY3VzdG9tIGhlYWRlciB5b3Ugd2FudCB0byBhZGQuCiAtIFVzZSAtQi8tLWZ0cC1hc2NpaSB0byBmb3JjZSBmdHAgdG8gdXNlIEFTQ0lJIG1vZGUgd2hlbiB0cmFuc2ZlcmluZyBmaWxlcy4KIC0gQ29ycmVjdGVkIHRoZSAnZ2V0bGlua3MucGwnIHNjcmlwdCwgSSBhY2NpZGVudGFsbHkgbGVmdCBteSBzaWxseSBwcm94eQogICB1c2FnZSBpbiB0aGVyZSEgU2luY2UgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgLmN1cmxyYyBmaWxlLCBpdCBpcyBlYXNpZXIgdG8KICAgd3JpdGUgc2NyaXB0cyB0aGF0IHVzZSBjdXJsIHNpbmNlIHByb3hpZXMgYW5kIHN0dWZmIHNob3VsZCBiZSBpbiB0aGUKICAgLmN1cmxyYyBmaWxlIGFueXdheS4KIC0gSW50cm9kdWNpbmcgdGhlIG5ldyAtRiBmbGFnIGZvciBIVFRQIFBPU1QuIEl0IHN1cHBvcnRzIG11bHRpcGFydC9mb3JtLWRhdGEKICAgd2hpY2ggbWVhbnMgaXQgaXMgZ29ubmEgYmUgcG9zc2libGUgdG8gdXBsb2FkIGZpbGVzIGV0YyB0aHJvdWdoIEhUVFAgUE9TVC4KICAgU2hpcmF6IEthbmdhIGFza2VkIGZvciB0aGUgZmVhdHVyZSBhbmQgbXkgYnJvdGhlciwKICAgQmr2cm4gU3RlbmJlcmcgaGVscGVkIG1lIGRlc2lnbiB0aGUgdXNlcgogICBpbnRlcmZhY2UgZm9yIHRoaXMgYmVhc3QuICBUaGlzIGZlYXR1cmUgcmVxdWlyZXMgcXVpdGUgc29tZSBkb2NzLAogICBzaW5jZSBpdCBoYXMgdHVybmVkIG91dCBub3Qgb25seSBxdWl0ZSBjYXBhYmxlLCBidXQgYWxzbyBjb21wbGljYXRlZCEgOi0pCiAtIEEgbm90ZSBoZXJlLCBzaW5jZSBJJ3ZlIHJlY2VpdmVkIG1haWwgYWJvdXQgaXQuIFNTTGVheSB2ZXJzaW9ucyBwcmlvciB0bwogICAwLjggd2lsbCAqbm90KiB3b3JrIHdpdGggY3VybCEKIC0gV2lsIExhbmdmb3JkIHJlcG9ydGVkIGEgYnVnIHRoYXQgb2NjdXJyZWQgc2luY2UgY3VybAogICBkaWQgbm90IHByb3Blcmx5IHVzZSBDUkxGIHdoZW4gaXNzdWluZyBmdHAgY29tbWFuZHMuIEkgZml4ZWQgaXQuCiAtIFJlYXJyYW5nZWQgdGhlIG9yZGVyIGNvbmZpZyBmaWxlcyBhcmUgcmVhZC4gLmN1cmxyYyBpcyBub3cgKmFsd2F5cyogcmVhZAogICBmaXJzdCBhbmQgYmVmb3JlIHRoZSBjb21tYW5kIGxpbmUgZmxhZ3MuIC1LIGNvbmZpZyBmaWxlcyB0aGVuIGFjdCBhcwogICBhZGRpdGlvbmFsIGNvbmZpZyBpdGVtcy4KIC0gVXNlIC1xIEFTIFRIRSBGSVJTVCBPUFRJT04gc3BlY2lmaWVkIHRvIHByZXZlbnQgLmN1cmxyYyBmcm9tIGJlaW5nIHJlYWQuCiAtIFlvdSBjYW4gbm93IGRpc2FibGUgYSBwcm94eSBieSB1c2luZyAteCAiIi4gVXNlZnVsIGlmIHRoZSAuY3VybHJjIGZpbGUKICAgc3BlY2lmaWVzIGEgcHJveHkgYW5kIHlvdSB3YW5uYSBmZXRjaCBzb21ldGhpbmcgd2l0aG91dCBnb2luZyB0aHJvdWdoCiAgIHRoYXQuCiAtIEknbSB0aGlua2luZyBvZiBkcm9wcGluZyB0aGUgLXAgc3VwcG9ydC4gSXRzIHJlYWxseSBub3QgdXNlZnVsIHNpbmNlIHBvcnRzCiAgIGNvdWxkIChhbmQgc2hvdWxkPykgYmUgc3BlY2lmaWVkIGFzIDo8cG9ydD4gYXBwZW5kZWQgb24gdGhlIGhvc3QgbmFtZQogICBpbnN0ZWFkLCBib3RoIGluIFVSTHMgYW5kIHRvIHByb3h5IGhvc3QgbmFtZXMuCiAtIE1hcnRpbiBTdGFhZWwgcmVwb3J0cyBjdXJsIC1MIGJ1Z3MgdW5kZXIgV2luZG93cyBOVAogICAodGVzdCB3aXRoIFVSTCBodHRwOi8vY29tZS50by9zY3NkZSkuIFRoaXMgYnVnIGlzIG5vdCBwcmVzZW50IGluIHRoaXMKICAgdmVyc2lvbiBhbnltb3JlLgogLSBBZGRlZCBzdXBwb3J0IGZvciB0aGUgd2VpcmQgRlRQIFVSTCB0eXBlPSB0aGluZy4gWW91IGNhbiBkb3dubG9hZCBhIGZpbGUKICAgdXNpbmcgQVNDSUkgdHJhbnNmZXIgYnkgYXBwZW5kaW5nICI7dHlwZT1BIiB0byB0aGUgcmlnaHQgb2YgaXQuIE90aGVyCiAgIGF2YWlsYWJsZSB0eXBlcyBhcmUgdHlwZT1EIGZvciBkaXItbGlzdCAoTkxTVCkgYW5kIHR5cGU9SSBmb3IgYmluYXJ5CiAgIHRyYW5zZmVyLiBJIGNhbid0IHNheSBJJ3ZlIGV2ZXIgc2VlbiBhbnlvbmUgdXNlIHRoaXMga2luZCBvZiBVUkwgdGhvdWdoIQogICA6LSkKIC0gVHJveSBFbmdlbCBwb2ludGVkIG91dCBhIGJ1ZyBpbiBteSBnZXRlbnYoIkhPTUUiKQogICB1c2FnZSBmb3Igd2luMzIgc3lzdGVtcy4gSSBpbnRyb2R1Y2UgZ2V0ZW52LmMgdG8gYmV0dGVyIGNvcGUgd2l0aAogICB0aGlzLiBNciBFbmdlbCBoZWxwcyBtZSB3aXRoIHRoZSBkZXRhaWxzIGFyb3VuZCB0aGF0Li4uCiAtIEEgbGl0dGxlIG5vdGUgdG8gbXlzZWxmIGFuZCBvdGhlcnMsIEkgc2hvdWxkIG1ha2UgdGhlIHdpbjMyLWJpbmFyeSBidWlsdAogICB3aXRoIFNTTCBzdXBwb3J0Li4uCiAtIFJ5YW4gTmVsc29uIHNlbnQgbWUgY29tbWVudHMgYWJvdXQgYnVpbGRpbmcgY3VybAogICB3aXRoIFNTTCB1bmRlciBGcmVlQlNELiBTZWUgdGhlIE1ha2VmaWxlIGZvciBkZXRhaWxzLiBVc2luZyB0aGUgY29uZmlndXJlCiAgIHNjcmlwdCwgaXQgc2hvdWxkIHdvcmsgYmV0dGVyIGFuZCBhdXRvbWF0aWNhbGx5IG5vdy4uLgogLSBDbGVhbmVkIHVwIGluIHRoZSBwb3J0IG51bWJlciBtZXNzIGluIHRoZSBzb3VyY2UuIE5vIGxvbmdlciBzdG9yZXMgYW5kIHVzZXMKICAgcHJveHkgcG9ydCBudW1iZXIgc2VwYXJhdGUgZnJvbSBub3JtYWwgcG9ydCBudW1iZXIuCiAtICdjb25maWd1cmUnIHNjcmlwdCB3b3JraW5nLiBDb25maXJtZWQgY29tcGlsZXMgb246CiAgICBIb3N0ICAgICAgICAgU1NMICBDb21waWxlcgogICAgU3VuT1MgNS41ICAgIG5vICAgZ2NjCiAgICBTdW5PUyA1LjUuMSAgeWVzICBnY2MKICAgIFN1bk9TIDUuNiAgICBubyAgIGNjICAod2l0aCBnY2MsIGl0IGhhcyB0aGUgImdjYyBpbmNsdWRlIGZpbGVzIiBwcm9ibGVtKQogICAgU3VuT1MgNC4xLjMgIG5vICAgZ2NjICh3aXRob3V0IEFOU0kgQyBoZWFkZXJzKQogICAgU3VuT1MgNC4xLjIgIG5vICAgZ2NjIChuYXRpdmUgY29tcGlsZXIgZmFpbGVkKQogICAgTGludXggMi4wLjE4IG5vICAgZ2NjCiAgICBMaW51eCAyLjAuMzIgeWVzICBnY2MKICAgIExpbnV4IDIuMC4zNSBubyAgIGdjYyAod2l0aCBnbGliYykKICAgIElSSVggNi4yICAgICBubyAgIGdjYyAoY2MgY29tcGlsZXMgZ2VuZXJhdGUgYSBmZXcgd2FybmluZ3MpCiAgICBJUklYIDYuNCAgICAgbm8gICBjYyAgKGdlbmVyYXRlZCB3YXJuaW5ncyB0aG91Z2gpCiAgICBXaW4zMiAgICAgICAgbm8gICBCb3JsYW5kCiAgICBPU0Y0LjAJIG5vICAgPwoKIC0gT29vcHMuIFRoZSA1YmV0YSAoYW5kIDQuMTApIHVuZGVyIHdpbjMyIGZhaWxlZCBpZiB0aGUgSE9NRSB2YXJpYWJsZSB3YXNuJ3QKICAgc2V0LgogLSBXaGVuIHVzaW5nIGEgcHJveHksIGN1cmwgbm93IGd1ZXNzZXMgYW5kIHVzZXMgdGhlIHByb3RvY29sIHBhcnQgaW4gY2FzZXMKICAgbGlrZToKCWN1cmwgLXggcHJveHk6ODAgd3d3LnNpdGUuY29tCiAgIFByb3hpZXMgbm9ybWFsbHkgZ28gbnV0cyB1bmxlc3MgaHR0cDovLyBpcyBwcmVwZW5kZWQgdG8gdGhlIGhvc3QgbmFtZSwgc28KICAgaWYgY3VybCBpcyB1c2VkIGxpa2UgdGhpcywgaXQgZ3Vlc3NlcyBwcm90b2NvbCBhbmQgYXBwZW5kcyB0aGUgcHJvdG9jb2wKICAgc3RyaW5nIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSBwcm94eS4gSXQgYWxyZWFkeSBkaWQgdGhpcyB3aGVuIHVzZWQKICAgd2l0aG91dCBwcm94eS4KIC0gQmV0dGVyIHBvcnQgdXNhZ2Ugd2l0aCBTU0wgdGhyb3VnaCBwcm94eSBub3cuIElmIHlvdSBzcGVjaWZpZWQgYSBkaWZmZXJlbnQKICAgaHR0cHMtcG9ydCB3aGVuIGFjY2Vzc2luZyB0aHJvdWdoIGEgcHJveHksIGl0IGRpZG4ndCB1c2UgdGhhdCBudW1iZXIKICAgY29ycmVjdGx5LiBJIGFsc28gcmV3cm90ZSB0aGUgY29kZSB0aGF0IHBhcnNlcyB0aGUgc3R1ZmYgcmVhZCBmcm9tIHRoZQogICBwcm94eSB3aGVuIHlvdSB3YW5uYSBjb25uZWN0IHRocm91Z2ggaXQgd2l0aCBTU0wuCiAtIEJqb3JuIFJlZXNlIGhlbHBlZCBtZSB3b3JrIGFyb3VuZCBvbmUgb2YgdGhlIGNvbXBpbGVyCiAgIHdhcm5pbmdzIG9uIElSSVggbmF0aXZlIGNjIGNvbXBpbGVzLgoKVmVyc2lvbiA0LjEwIChPY3QgMjYsIDE5OTgpCiBEYW5pZWwgU3RlbmJlcmcKIC0gSm9obiBBLiBCcmlzdG9yIHN1Z2dlc3RlZCBhIGNvbmZpZyBmaWxlIHN3aXRjaCwKICAgYW5kIHNpbmNlIEkndmUgYmVlbiBoYXZpbmcgdGhhdCBpZGVhIGtpbmQgb2YgaW4gdGhlIGJhY2tncm91bmQgZm9yIGEgbG9uZwogICB0aW1lIEkgcmV3cm90ZSB0aGUgcGFyYW1ldGVyIHBhcnNpbmcgZnVuY3Rpb24gYSBsaXR0bGUgYW5kIG5vdyBJIGludHJvZHVjZQogICB0aGUgLUsvLS1jb25maWcgZmxhZy4gSSBhbHNvIG1hZGUgY3VybCAqYWx3YXlzKiAodW5sZXNzIC1LIGlzIHVzZWQpIHRyeSB0bwogICBsb2FkIHRoZSAuY3VybHJjIGZpbGUgZm9yIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLiBUaGUgc3ludGF4IGZvciB0aGUKICAgY29uZmlnIGZpbGUgaXMgdGhlIHN0YW5kYXJkIGNvbW1hbmQgbGluZSBhcmd1bWVudCBzdHlsZS4gRGV0YWlscyBpbiAnY3VybAogICAtaCcgb3IgdGhlIFJFQURNRS4KIC0gSSByZW1vdmVkIHRoZSAtayBvcHRpb24uIEtlZXAtYWxpdmUgaXNuJ3QgcmVhbGx5IGFueXRoaW5nIGFueW9uZSB3b3VsZAogICB3YW50IHRvIGVuYWJsZSB3aXRoIGN1cmwgYW55d2F5LgogLSBNYXJ0aW4gU3RhYWVsIGhlbHBlZCBtZSBhZGQgdGhlICdpcml4JyB0YXJnZXQuIE5vdwogICAibWFrZSBpcml4IiBzaG91bGQgYnVpbGQgY3VybCBzdWNjZXNzZnVsbHkgb24gbm9uLWdjYyBTR0kgbWFjaGluZXMuCiAtIFNpbmdsZSBzd2l0Y2hlcyBub3cgdG9nZ2xlIGJlaGF2aW91cnMuIEkuZSBpZiB5b3UgdXNlIC12IC12IHRoZSBzZWNvbmQKICAgd2lsbCBzd2l0Y2ggb2ZmIHRoZSB2ZXJib3NlIG1vZGUgdGhlIGZpcnN0IG9uZSBlbmFibGVkLiBUaGlzIGlzIHNvIHRoYXQKICAgeW91IGNhbiBkaXNhYmxlIGEgZGVmYXVsdCBzZXR0aW5nIGEgLmN1cmxyYyBmaWxlIGVuYWJsZXMgZXRjLgoKVmVyc2lvbiA0LjkgKE9jdCA3LCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hcnRpbiBTdGFhZWwgc3VnZ2VzdGVkIGN1cmwgd291bGQgc3VwcG9ydCBjb29raWVzLgogICBJIGFkZGVkIC1iLy0tY29va2llIHRvIGVuYWJsZSBmcmVlLXRleHQgY29va2llIGRhdGEgdG8gYmUgcGFzc2VkLiBUaGVyZSdzCiAgIGFsc28gYSBsaXR0bGUgYmx1cmIgYWJvdXQgZ2VuZXJhbCBjb29raWUgc3R1ZmYgaW4gdGhlIFJFQURNRS9oZWxwIHRleHQuCiAtIGRtaCA8ZG1oIGF0IGpldC5lcz4gc3VnZ2VzdGVkIEhUVFAgcmVzdW1lIGNhcGFiaWxpdGllcy4gQWx0aG91Z2ggeW91IGNvdWxkCiAgIG1hbnVhbGx5IGdldCBjdXJsIHRvIHJlc3VtZSBIVFRQIGRvY3VtZW50cywgSSBtYWRlIHRoZSAtYyByZXN1bWUgZmxhZyB3b3JrCiAgIGZvciBIVFRQIHRvbyAodW5sZXNzIC1yIGlzIHVzZWQgdG9vLCB3aGljaCB3b3VsZCBiZSB2ZXJ5IG9kZCBhbnl3YXkpLgogLSBBZGRlZCBjaGVja2xpbmtzLnBsIHRvIHRoZSBhcmNoaXZlLiBJdCBpcyBhIHN0aWxsIGV4cGVyaW1lbnRhbCBwZXJsIHNjcmlwdAogICB0aGF0IGNoZWNrcyBhbGwgbGlua3Mgb2YgYSB3ZWIgcGFnZSBieSB1c2luZyBjdXJsLgogLSBSZWFycmFuZ2VkIHRoZSBhcmNoaXZlIGhpZXJhcmNoeSBhIGxpdHRsZS4gQnVpbGQgdGhlIGV4ZWN1dGFibGUgaW4gdGhlCiAgIHNyYy8gZGlyIGZyb20gbm93IG9uIQogLSBWZXJzaW9uIDQuOSBhbmQgaGVyZWFmdGVyLCBpcyBubyBsb25nZXIgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCBsaWNlbnNlLgogICBJIGhhdmUgbm93IHVwZGF0ZWQgdGhlIExFR0FMIGZpbGUgZXRjIGFuZCBub3cgdGhpcyBpcyByZWxlYXNlZCB1c2luZyB0aGUKICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSB0byBhdm9pZCB0aGUgcGxhZ3VlIGtub3duIGFzICJ0aGUgR1BMIHZpcnVzIi4gWW91CiAgIG11c3QgbWFrZSB0aGUgc291cmNlIGF2YWlsYWJsZSBpZiB5b3UgZGVjaWRlIHRvIGNoYW5nZSBhbmQvb3IgcmVkaXN0cmlidXRlCiAgIGN1cmwsIGJ1dCBpZiB5b3UgZGVjaWRlIHRvIHVzZSBjdXJsIHdpdGhpbiBzb21ldGhpbmcgZWxzZSB5b3UgZG8gbm90IG5lZWQKICAgdG8gb2ZmZXIgdGhlIHdvcmxkIHRoZSBzb3VyY2UgdG8gdGhhdCB0b28uCiAtIEN1cmwgZGlkIG5vdCBsaWtlIEhUVFAgc2VydmVycyB0aGF0IHNlbnQgbm8gaGVhZGVycyBhdCBhbGwgb24gYSBHRVQKICAgcmVxdWVzdC4gIEl0IGlzIGEgdmlvbGF0aW9uIG9mIFJGQzIwNjggYnV0IGFwcGVhcmFudGx5IHNvbWUgc2VydmVycyBkbwogICB0aGF0IGFueXdheS4gIFRoYW5rcyB0byBHb3Jkb24gQmVhdG9uIGZvciB0aGUgcmVwb3J0IQogLSAtTC8tLWxvY2F0aW9uIHdhcyBhZGRlZCBhZnRlciBhIHN1Z2dlc3Rpb24gZnJvbSBNYXJ0aW4gU3RhYWVsLiBUaGlzIG1ha2VzCiAgIGN1cmwgQVRURU1QVCB0byBmb2xsb3cgdGhlIExvY2F0aW9uOiByZWRpcmVjdCBpZiBvbmUgaXMgcHJlc2VudCBpbiB0aGUgSFRUUAogICBoZWFkZXJzLiBJZiAtaSBvciAtSSBpcyB1c2VkIHdpdGggdGhpcyBmbGFnLCB5b3Ugd2lsbCBzZWUgaGVhZGVycyBmcm9tIGFsbAogICBzaXRlcyB0aGUgTG9jYXRpb246IHBvaW50cyB0by4gRG8gbm90ZSB0aGF0IHRoZSBmaXJzdCBzZXJ2ZXIgY2FuIHBvaW50IHRvIGEKICAgc2Vjb25kIHRoYXQgcG9pbnRzIHRvIGEgdGhpcmQgZXRjLiBJdCBzZWVtcyB0aGUgTG9jYXRpb246IHBhcmFtZXRlciAoc2FpZAogICB0byBiZSBhbiBBYnNvbHV0ZVVSSSBpbiBSRkMyMDY4KSBpc24ndCBhbHdheXMgYWJzb2x1dGUuLiA6LS8gQW55d2F5LCBJJ3ZlCiAgIG1hZGUgY3VybCBBVFRFTVBUIHRvIGRvIHRoZSBiZXN0IGl0IGNhbiB0byBkZWFsIHdpdGggdGhlIHJlYWxpdHkuCiAtIEFkZGVkIGdldGxpbmtzLnBsIHRvIHRoZSBhcmNoaXZlLiBnZXRsaW5rcy5wbCBzZWxlY3RpdmVseSBkb3dubG9hZHMKICAgZmlsZXMgdGhhdCBhIHdlYiBwYWdlIGxpbmtzIHRvLgoKVmVyc2lvbiA0LjguNAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFzIEp1bGlhbiBSb21lcm8gTmlldG8gcmVwb3J0ZWQsIGN1cmwgcmVwb3J0ZWQgd3JvbmcgdmVyc2lvbiBudW1iZXIuCiAtIEFzIFRlZW11IFlsaS1FbHNpbGEgcG9pbnRlZCBvdXQsIHRoZSB3aW4zMiB2ZXJzaW9uIG9mIDQuOCAoYW5kIHByb2JhYmx5IGFsbAogICBvdGhlciB2ZXJzaW9ucyBmb3Igd2luMzIpIGRpZG4ndCB3b3JrIHdpdGggYmluYXJ5IGZpbGVzIHNpbmNlIEknbSB0b28gdXNlZAogICB0byB0aGUgVU5JWCBzdHlsZSBmb3BlbigpIHdoZXJlIGJpbmFyeSBhbmQgdGV4dCBkb24ndCBkaWZmZXIuLi4KIC0gUmFscGggQmVja21hbm4gYnJvdWdodCBtZSBzb21lIGNoYW5nZXMgdGhhdCBsZXRzIGN1cmwgY29tcGlsZSBlcnJvciBhbmQKICAgd2FybmluZyBmcmVlIHdpdGggLVdhbGwgLXBlZGFudGljIHdpdGggZysrLiBJIGFsc28gdG9vayB0aGUgb3Bwb3J0dW5pdHkgdG8KICAgY2xlYW4gb2ZmIHNvbWUgdW51c2VkIHZhcmlhYmxlcyBhbmQgc2ltaWxhci4KIC0gUmFscGggQmVja21hbm4gbWFkZSBtZSBhd2FyZSBvZiBhIHJlYWxseSBvZGQgYnVnIG5vdyBjb3JyZWN0ZWQuIFdoZW4gY3VybAogICByZWFkIGEgc2V0IG9mIGhlYWRlcnMgZnJvbSBhIEhUVFAgc2VydmVyLCBkaXZpZGVkIGludG8gbW9yZSB0aGFuIG9uZSByZWFkCiAgIGFuZCB0aGUgZmlyc3QgcmVhZCBzaG93ZWQgYSBmdWxsIGxpbmUgKmV4YWN0bHkqIChpLmUgZW5kaW5nIHdpdGggYQogICBuZXdsaW5lKSwgY3VybCBkaWQgbm90IGJlaGF2ZSB3ZWxsLgoKVmVyc2lvbiA0LjguMwogRGFuaWVsIFN0ZW5iZXJnCiAtIEkgd2FzIHRvbyBxdWljayB0byByZWxlYXNlIDQuOC4yIHdpdGggdG9vIGxpdHRsZSB0ZXN0aW5nLiBPbmUgb2YgdGhlCiAgIGNoYW5nZXMgaXMgbm93IHJldmVydGVkIHNsaWdodGx5IHRvIHRoZSA0LjguMSB3YXkgc2luY2UgNC44LjIgY291bGRuJ3QKICAgdXBsb2FkIGZpbGVzLiBJIHN0aWxsIHRoaW5rIGJvdGggcHJvYmxlbXMgY29ycmVjdGVkIGluIDQuOC4yIHJlbWFpbgogICBjb3JyZWN0ZWQuICBSZXBvcnRlZCBieSBKdWxpYW4gUm9tZXJvIE5pZXRvLgoKVmVyc2lvbiA0LjguMgogRGFuaWVsIFN0ZW5iZXJnCiAtIEJlcm5oYXJkIElzZWxib3JuIHJlcG9ydGVkIHR3byBGVFAgcHJvdG9jb2wgZXJyb3JzIGN1cmwgZGlkLiBUaGV5J3JlIG5vdwogICBjb3JyZWN0ZWQuIEJvdGggYXBwZWFyZWQgd2hlbiBnZXR0aW5nIGZpbGVzIGZyb20gYSBNUyBGVFAgc2VydmVyISA6LSkKClZlcnNpb24gNC44LjEKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBhIGxhc3QgdXBkYXRlIG9mIHRoZSBwcm9ncmVzcyBtZXRlciB3aGVuIHRoZSB0cmFuc2ZlciBpcyBkb25lLiBUaGUKICAgZmluYWwgb3V0cHV0IG9uIHRoZSBzY3JlZW4gZGlkbid0IGhhdmUgdG8gYmUgdGhlIGZpbmFsIHNpemUgdHJhbnNmZXJlZAogICB3aGljaCBtYWRlIGl0IHNvbWV0aW1lcyBsb29rIG9kZC4KIC0gVGhhbmtzIHRvIERhdmlkIExvbmcgSSBnb3QgcmlkIG9mIGEgc2lsbHkgYnVnIHRoYXQgaGFwcGVuZWQgaWYgYSBIVFRQLXBhZ2UKICAgaGFkIG5vdGhpbmcgYnV0IGhlYWRlci4gQXBwZWFyYW50bHkgU29sYXJpcyBkZWFscyB3aXRoIG5lZ2F0aXZlIHNpemVzIGluCiAgIGZ3cml0ZSgpIGNhbGxzIGEgbG90IGJldHRlciB0aGFuIExpbnV4IGRvZXMuLi4gPUItXQoKVmVyc2lvbiA0LjgKIERhbmllbCBTdGVuYmVyZwogLSBDb250aW51ZSBGVFAgZmlsZSB0cmFuc2Zlci4gLWMgaXMgdGhlIHN3aXRjaC4gTm90ZSB0aGF0IHlvdSBuZWVkIHRvCiAgIHNwZWNpZnkgYSBmaWxlIG5hbWUgaWYgeW91IHdhbm5hIHJlc3VtZSBhIGRvd25sb2FkICh5b3UgY2FuJ3QgcmVzdW1lIGEKICAgZG93bmxvYWQgc2VudCB0byBzdGRvdXQpLiBSZXN1bWluZyB1cGxvYWQgbWF5IGJlIGxpbWl0ZWQgYnkgdGhlIHNlcnZlcgogICBzaW5jZSBjdXJsIGlzIHRoZW4gdXNpbmcgdGhlIG5vbi1SRkM5NTkgY29tbWFuZCBTSVpFIHRvIGdldCB0aGUgc2l6ZSBvZgogICB0aGUgdGFyZ2V0IGZpbGUgYmVmb3JlIHVwbG9hZCBiZWdpbnMgKHRvIGZpZ3VyZSBvdXQgd2hpY2ggb2Zmc2V0IHRvCiAgIHVzZSkuIFVzZSAtQyB0byBzcGVjaWZ5IHRoZSBvZmZzZXQgeW91cnNlbGYhIC1DIGlzIGhhbmR5IGlmIHlvdSdyZSBkb2luZwogICB0aGUgb3V0cHV0IHRvIHNvbWV0aGluZyBlbHNlIGJ1dCBhIHBsYWluIGZpbGUgb3Igd2hlbiB5b3UganVzdCB3YW50IHRvIGdldAogICB0aGUgZW5kIG9mIGEgZmlsZS4KIC0gcmVjdXJzaXZlZnRwZ2V0LnBsIG5vdyBmZWF0dXJlcyBhIG1heGltdW0gcmVjdXJzaXZlIGxldmVsIGFyZ3VtZW50LgoKVmVyc2lvbiA0LjcKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBzdXBwb3J0IHRvIGFib3J0IGEgZG93bmxvYWQgaWYgdGhlIHNwZWVkIGlzIGJlbG93IGEgY2VydGFpbiBhbW91bnQKICAgKHNwZWVkLWxpbWl0KSBieXRlcyBwZXIgc2Vjb25kIGZvciBhIGNlcnRhaW4gKHNwZWVkLXRpbWUpIHRpbWUuCiAtIFdyb3RlIGEgcGVybCBzY3JpcHQgJ3JlY3Vyc2l2ZWZ0cGdldC5wbCcgdG8gcmVjdXJzaXZlbHkgdXNlIGN1cmwgdG8gZ2V0IGEKICAgd2hvbGUgZnRwIGRpcmVjdG9yeSB0cmVlLiBJdCBpcyBtZWFudCBhcyBhbiBleGFtcGxlIG9mIGhvdyBjdXJsIGNhbiBiZQogICB1c2VkLiAgSSBhZ3JlZSBpdCBpc24ndCB0aGUgd2lzZXN0IHRoaW5nIHRvIGRvIHRvIG1ha2UgYSBzZXBhcmF0ZSBuZXcKICAgY29ubmVjdGlvbiBmb3IgZWFjaCBmaWxlIGFuZCBkaXJlY3RvcnkgZm9yIHRoaXMuCgpWZXJzaW9uIDQuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIGEgZmlyc3QgYXR0ZW1wdCB0byBvcHRpb25hbGx5IHBhcnNlIHRoZSAubmV0cmMgZmlsZSBmb3IgbG9naW4gdXNlcgogICBhbmQgcGFzc3dvcmQuIElmIHVzZWQgd2l0aCBodHRwLCBpdCBlbmFibGVzIHVzZXIgYXV0aGVudGljYXRpb24uIC1uIGlzCiAgIHRoZSBuZXcgc3dpdGNoLgogLSBSZW1vdmVkIHRoZSBleHRyYSBuZXdsaW5lcyBvbiB0aGUgZGVmYXVsdCB1c2VyLWFnZW50IHN0cmluZy4KIC0gQ29ycmVjdGVkIHRoZSBtaXNzaW5nIGZ0cCB1cGxvYWQgZXJyb3IgbWVzc2FnZXMgd2hlbiBpdCBmYWlsZWQgd2l0aG91dCB0aGUKICAgdmVyYm9zZSBmbGFnIHNldC4gR2FyeSBXLiBTd2VhcmluZ2VuIGZvdW5kIGl0LgogLSBOb3cgdXNpbmcgYWxhcm0oKSB0byBlbmFibGUgc2Vjb25kLXByZWNpc2lvbiB0aW1lb3V0IGV2ZW4gb24gdGhlIG5hbWUKICAgcmVzb2x2aW5nL2Nvbm5lY3RpbmcgcGhhc2UuIFRoZSB0aW1lb3V0IGlzIGFsdGhvdWdoIHJlc2V0IGFmdGVyIHRoYXQgZmlyc3QKICAgc2VxdWVuY2UuIChUaGlzIHNob3VsZCBiZSBjb3JyZWN0ZWQuKSBHYXJ5IFcuIFN3ZWFyaW5nZW4gcmVwb3J0ZWQuCiAtIE5vdyBzcGVsbHMgIlVua25vd24iIHByb3Blcmx5LCBhcyBpbiAiVW5rbm93biBvcHRpb24gJ3onIi4uLiA6LSkKIC0gQWRkZWQgYnVnIHJlcG9ydCBlbWFpbCBhZGRyZXNzIGluIHRoZSBSRUFETUUuCiAtIEFkZGVkIGEgImN1cnJlbnQgc3BlZWQiIGZpZWxkIHRvIHRoZSBwcm9ncmVzcyBtZXRlci4gSXQgc2hvd3MgdGhlIGF2ZXJhZ2UKICAgc3BlZWQgdGhlIGxhc3QgNSBzZWNvbmRzLiBUaGUgb3RoZXIgc3BlZWQgZmllbGQgc2hvd3MgdGhlIGF2ZXJhZ2Ugc3BlZWQgb2YKICAgdGhlIGVudGlyZSB0cmFuc2ZlciBzbyBmYXIuCgpWZXJzaW9uIDQuNS4xCiBMaW5hcyBWZXBzdGFzCiAtIFNTTCB0aHJvdWdoIHByb3h5IGZpeAogLSBBZGRlZCAtQSB0byBhbGxvdyBVc2VyLUFnZW50OiBjaGFuZ2VzCgogRGFuaWVsIFN0ZW5iZXJnIAogLSBNYWRlIHRoZSAtQSB3b3JrIHdoZW4gU1NMLXRocm91Z2gtcHJveHkuCgpWZXJzaW9uIDQuNQogTGluYXMgVmVwc3RhcwogLSBNb3JlIFNTTCBjb3JyZWN0aW9ucwogLSBJJ3ZlIGFkZGVkIGEgcG9ydCB0byBBSVguCiAtIHJ1bm5pbmcgU1NMIHRocm91Z2ggYSBwcm94eSBjYXVzZXMgYSBjaHVuayBvZiBjb2RlIHRvIGJlIGV4ZWN1dHJlZCB0d2ljZS4KICAgb25lIG9mIHRob3NlIGJsb2NrcyBuZWVkcyB0byBiZSBkZWxldGVkLgoKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIC1pIGFuZCAtSSB3b3JrIGFnYWluCgpWZXJzaW9uIDQuNAogTGluYXMgVmVwc3RhcwogLSAteCBjYW4gbm93IGFsc28gc3BlY2lmeSBwcm94eXBvcnQgd2hlbiB1c2VkIGFzIGluICdwcm94eWhvc3Q6cHJveHlwb3J0JwogLSBTU0wgZml4ZXMKClZlcnNpb24gNC4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRqdXN0ZWQgdG8gY29tcGlsZSB1bmRlciB3aW4zMiAoVmlzdWFsQysrIDUpLiBUaGUgLVAgc3dpdGNoIGRvZXMgbm90CiAgIHN1cHBvcnQgbmV0d29yayBpbnRlcmZhY2UgbmFtZXMgaW4gd2luMzIuIEkgY291bGRuJ3QgZmlndXJlIG91dCBob3chCgpWZXJzaW9uIDQuMgogTGluYXMgVmVwc3RhcyAvIFNhbXBvIEtlbGxvbWFraQogLSBBZGRlZCBTU0wgLyBTU0xlYXkgc3VwcG9ydCAoaHR0cHM6Ly8pCiAtIEFkZGVkIHRoZSAtVCB1c2FnZSBmb3IgSFRUUCBQT1NULgoKIERhbmllbCBTdGVuYmVyZwogLSBCdWdmaXhlZCB0aGUgU1NMIGltcGxlbWVudGF0aW9uLgogLSBNYWRlIC1QIGEgbG90IGJldHRlciB0byB1c2Ugb3RoZXIgSVAgYWRkcmVzc2VzLiBJdCBub3cgYWNjZXB0cyBhIGZvbGxvd2luZwogICBwYXJhbWV0ZXIgdGhhdCBjYW4gYmUgZWl0aGVyCiAgICAgICAgaW50ZXJmYWNlIC0gaS5lICJldGgwIiB0byBzcGVjaWZ5IHdoaWNoIGludGVyZmFjZSdzIElQIGFkZHJlc3MgeW91CiAgICAgICAgICAgICAgICAgICAgd2FudCB0byB1c2UKICAgICAgICBJUCBhZGRyZXNzIC0gaS5lICIxOTIuMTY4LjEwLjEiIHRvIHNwZWNpZnkgZXhhY3QgSVAgbnVtYmVyCiAgICAgICAgaG9zdCBuYW1lIC0gaS5lICJteS5ob3N0LmRvbWFpbiIgdG8gc3BlY2lmeSBtYWNoaW5lCiAgICAgICAgIi0iICAgICAgIC0gKGFueSBzaW5nbGUtbGV0dGVyIHN0cmluZykgdG8gbWFrZSBpdCBwaWNrIHRoZSBtYWNoaW5lJ3MKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0CiAtIFRoZSBNYWtlZmlsZSBpcyBub3cgcmVhZHkgdG8gY29tcGlsZSBmb3Igc29sYXJpcywgc3Vub3M0IGFuZCBsaW51eCByaWdodAogICBvdXQgb2YgdGhlIGJveC4KIC0gQmV0dGVyIGdlbmVyYXRlZCB2ZXJzaW9uIHN0cmluZyBzZWVuIHdpdGggJ2N1cmwgLVYnCgpWZXJzaW9uIDQuMQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBJUCBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZ0cCBzZXJ2ZXIgYXMgYSByZXBseSB0byBQQVNWIGRvZXMgbm8gbG9uZ2VyCiAgIGhhdmUgdG8gRE5TIHJlc29sdmUuIEluIGZhY3QsIG5vIElQLW51bWJlci1vbmx5IGFkZHJlc3NlcyBoYXZlIHRvIGFueW1vcmUuCiAtIEJpbmRzIGJldHRlciB0byBhdmFpbGFibGUgcG9ydCB3aGVuIC1QIGlzIHVzZWQuCiAtIE5vdyBMSVNUcyAuLyBpbnN0ZWFkIG9mIC8gd2hlbiB1c2VkIGFzIGluIGZ0cDovL2Z0cC5mdW5ldC5maS8uIFRoZSByZWFzb24KICAgZm9yIHRoaXMgaXMgdGhhdCBleGFjdGx5IHRoYXQgc2l0ZSwgZnRwLmZ1bmV0LmZpLCBkb2VzIG5vdCBhbGxvdyBMSVNUIC8KICAgd2hpbGUgTElTVCAuLyBpcyBmaW5lLiBBbnkgb2JqZWN0aW9ucz8KClZlcnNpb24gNCAoMTk5OC0wMy0yMCkKIERhbmllbCBTdGVuYmVyZwogLSBJIHRvb2sgYW5vdGhlciBodWdlIHN0ZXAgYW5kIGNoYW5nZWQgYm90aCB2ZXJzaW9uIG51bWJlciBhbmQgcHJvamVjdCBuYW1lIQogICBUaGUgcmVhc29uIGZvciB0aGUgbmV3IG5hbWUgaXMgdGhhdCB0aGVyZSBhcmUganVzdCBvbmUgdG9vIG1hbnkgcHJvZ3JhbXMKICAgbmFtZWQgdXJsZ2V0IGFscmVhZHkgYW5kIHRoaXMgcHJvZ3JhbSBhbHJlYWR5IGNhbiBhIGxvdCBtb3JlIHRoYW4gbWVyZWx5CiAgIGdldHRpbmcgVVJMcywgYW5kIHRoZSByZWFzb24gZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBpcyB0aGF0IEkgZGlkIGFkZCB0aGUKICAgcHJldHR5IGJpZyBjaGFuZ2UgaW4gLVAgYW5kIHNpbmNlIEkgY2hhbmdlZCBuYW1lIEkgd2FudGVkIHRvIHN0YXJ0IHdpdGgKICAgc29tZXRoaW5nIGZyZXNoIQogLSBUaGUgLS1zdHlsZSBmbGFncyBhcmUgd29ya2luZyBiZXR0ZXIgbm93LgogLSBMaXN0aW5nIGRpcmVjdG9yaWVzIHdpdGggRlRQIG9mdGVuIHJlcG9ydGVkIHRoYXQgdGhlIGZpbGUgdHJhbnNmZXIgd2FzCiAgIGluY29tcGxldGUuIFdyb25nIGFzc3VtcHRpb25zIHdlcmUgdG9vIGNvbW1vbiBmb3IgZGlyZWN0b3JpZXMsIHdoeSBubwogICBzaXplIHdpbGwgYmUgYXR0ZW1wdGVkIHRvIGdldCBjb21wYXJlZCBvbiB0aGVtIGZyb20gbm93IG9uLgogLSBJbXBsZW1lbnRlZCB0aGUgLVAgZmxhZyB0aGF0IGxldCdzIHRoZSBmdHAgY29udHJvbCBpc3N1ZSBhIFBPUlQgY29tbWFuZAogICBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBQQVNWLgogLSAtYSBmb3IgYXBwZW5kaW5nIEZUUCB1cGxvYWRzIHdvcmtzLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpWZXJzaW9uIDMuMTIKIERhbmllbCBTdGVuYmVyZwogLSBFbmQtb2YtaGVhZGVyIHRyYWNraW5nIHN0aWxsIGxhY2tlZCBzdXBwb3J0IGZvciBcclxuIG9yIGp1c3QgXG4gYXQgdGhlCiAgIGVuZCBvZiB0aGUgbGFzdCBoZWFkZXIgbGluZS4KIFNlcmdpbyBCYXJyZXNpCiAtIEFkZGVkIFBST1hZIGF1dGhlbnRpY2F0aW9uLgogUmFmYWVsIFNhZ3VsYQogLSBGaXhlZCBzb21lIGxpdHRsZSBidWdzLgoKVmVyc2lvbiAzLjExCiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIGhlYWRlciBwYXJzaW5nIHdhcyBzdGlsbCBub3QgY29ycmVjdCBzaW5jZSB0aGUgMy4yIG1vZGlmaWNhdGlvbi4uLgoKVmVyc2lvbiAzLjEwCiBEYW5pZWwgU3RlbmJlcmcKIC0gMy43IGFuZCAzLjkgd2VyZSBzaW11bHRhbmVvdXNseSBkZXZlbG9wZWQgYW5kIG1lcmdlZCBpbnRvIHRoaXMgdmVyc2lvbi4KIC0gRlRQIHVwbG9hZCBkaWQgbm90IHdvcmsgY29ycmVjdGx5IHNpbmNlIDMuMi4KClZlcnNpb24gMy45CiBSYWZhZWwgU2FndWxhCiAtIEFkZGVkIHRoZSAiLWUgPHVybD4gLyAtLXJlZmVyZXIgPHVybD4iIG9wdGlvbiB3aGVyZSB3ZSBjYW4gc3BlY2lmeQogICB0aGUgcmVmZXJlciBwYWdlLiBPYnZpb3VzbHksIHRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgdG8gZm9vbCB0aGUKICAgc2VydmVyLCBidXQuLi4KClZlcnNpb24gMy43CiBEYW5pZWwgU3RlbmJlcmcKIC0gTm93IGNoZWNrcyB0aGUgbGFzdCBlcnJvciBjb2RlIHNlbnQgZnJvbSB0aGUgZnRwIHNlcnZlciBhZnRlciBhIGZpbGUgaGFzCiAgIGJlZW4gcmVjZWl2ZWQgb3IgdXBsb2FkZWQuIFdhc24ndCBkb25lIHByZXZpb3VzbHkuCiAtIFdoZW4gJ3VybGdldCA8aG9zdD4nIGlzIHVzZWQgd2l0aG91dCBhICdwcm90b2NvbDovLycgZmlyc3QgaW4gdGhlIGhvc3QgcGFydCwKICAgaXQgbm93IGNoZWNrcyBmb3IgaG9zdCBuYW1lcyBzdGFydGluZyB3aXRoIGZ0cCBvciBnb3BoZXIgYW5kIGlmIGl0IGRvZXMsCiAgIGl0IHVzZXMgdGhhdCBwcm90b2NvbCBieSBkZWZhdWx0IGluc3RlYWQgb2YgaHR0cC4KClZlcnNpb24gMy42CiBEYW5pZWwgU3RlbmJlcmcKIC0gU2lsbHkgbWlzdGFrZSBtYWRlIHRoZSBQT1NUIGJ1Zy4gVGhpcyBoYXMgbm93IGFsc28gYmVlbiB0ZXN0ZWQgdG8gd29yayB3aXRoCiAgIHByb3h5LgoKVmVyc2lvbiAzLjUKIERhbmllbCBTdGVuYmVyZwogLSBIaWdobHkgaW5zcGlyZWQgYnkgUmFmYWVsIFNhZ3VsYSdzIGNoYW5nZXMgdG8gdGhlIDMuMSB0aGF0IGFkZGVkIGFuIGFsbW9zdAogICBmdW5jdGlvbmFsIFBPU1QsIEkgYXBwbGllZCBoaXMgY2hhbmdlcyBpbnRvIHRoaXMgdmVyc2lvbiBhbmQgbWFkZSB0aGVtIHdvcmsuCiAgIChJdCBzZWVtcyBQT1NUIHJlcXVpcmVzIHRoZSBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtTGVuZ3RoIGhlYWRlcnMuKSBJdCBpcwogICBub3cgdXNhYmxlIHdpdGggdGhlIC1kIHN3aXRjaC4KClZlcnNpb24gMy4zIC0gMy40CiBQYXNzZWQgdG8gYXZvaWQgY29uZnVzaW9ucwoKVmVyc2lvbiAzLjIKIERhbmllbCBTdGVuYmVyZwogLSBNYWpvciByZXdyaXRlIG9mIHR3byBjcnVjaWFsIHBhcnRzIG9mIHRoaXMgY29kZTogdXBsb2FkIGFuZCBkb3dubG9hZC4KICAgVGhleSBhcmUgYm90aCBub3cgdXNpbmcgYSBzZWxlY3QoKSBzd2l0Y2gsIHRoYXQgYWxsb3dzIG11Y2ggYmV0dGVyCiAgIHByb2dyZXNzIG1ldGVyIGFuZCB0aW1lIGNvbnRyb2wuIAogLSBhbGFybSgpIHVzYWdlIHJlbW92ZWQgY29tcGxldGVseQogLSBGVFAgZ2V0IGNhbiBub3cgbGlzdCBkaXJlY3RvcnkgY29udGVudHMgaWYgdGhlIHBhdGggZW5kcyB3aXRoIGEgc2xhc2ggJy8nLgogICBVcmxnZXQgb24gYSBmdHAtcGF0aCB0aGF0IGRvZXNuJ3QgZW5kIHdpdGggYSBzbGFzaCBtZWFucyB1cmxnZXQgd2lsbAogICBhdHRlbXB0IGdldHRpbmcgaXQgYXMgYSBmaWxlIG5hbWUuCiAtIEZUUCBkaXJlY3RvcnkgdmlldyBzdXBwb3J0cyAtbCBmb3IgImxpc3Qtb25seSIgd2hpY2ggbGlzdHMgdGhlIGZpbGUgbmFtZXMKICAgb25seS4KIC0gQWxsIG9wZXJhdGlvbnMgc3VwcG9ydCAtbSBmb3IgbWF4IHRpbWUgdXNhZ2UgaW4gc2Vjb25kcyBhbGxvd2VkLgogLSBGVFAgdXBsb2FkIG5vdyBhbGxvd3MgdGhlIHNpemUgb2YgdGhlIHVwbG9hZGVkIGZpbGUgdG8gYmUgcHJvdmlkZWQsIGFuZAogICB0aHVzIGl0IGNhbiBiZXR0ZXIgY2hlY2sgaXQgYWN0dWFsbHkgdXBsb2FkZWQgdGhlIHdob2xlIGZpbGUuIEl0IGFsc28KICAgbWFrZXMgdGhlIHByb2dyZXNzIG1ldGVyIGZvciB1cGxvYWRzIG11Y2ggYmV0dGVyIQogLSBNYWRlIHRoZSBwYXJhbWV0ZXIgcGFyc2luZyBmYWlsIGluIGNhc2VzIGxpa2UgJ3VybGdldCAtciA5MDAnIHdoaWNoCiAgIHByZXZpb3VzbHkgdHJpZWQgdG8gY29ubmVjdCB0byB0aGUgaG9zdCBuYW1lZCAnOTAwJy4KClZlcnNpb24gMy4xCiBLamVsbCBFcmljc29uCiAtIFBvaW50ZWQgb3V0IGhvdyB0byBjb3JyZWN0IHRoZSAzIHdhcm5pbmdzIGluIHdpbjMyLWNvbXBpbGVzLgoKIERhbmllbCBTdGVuYmVyZwogLSBSZW1vdmVkIGFsbCBjYWxscyB0byBleGl0KCkuCiAtIE1hZGUgdGhlIHNob3J0IGhlbHAgdGV4dCBnZXQgd3JpdHRlbiB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIuCiAtIE1hZGUgdGhpcyBmaWxlIGluc3RlYWQgb2Yga2VlcGluZyB0aGVzZSBjb21tZW50cyBpbiB0aGUgc291cmNlLgogLSBNYWRlIHR3byBjYWxsYmFjayBob29rcywgdGhhdCBlbmFibGUgZXh0ZXJuYWwgcHJvZ3JhbXMgdG8gdXNlIHVybGdldCgpCiAgIGVhc2llciBhbmQgdG8gZ3JhYiB0aGUgb3V0cHV0L29mZmVyIHRoZSBpbnB1dCBlYXNpZXIuCiAtIEl0IGlzIGV2aWRlbnQgdGhhdCBXaW4zMi1jb21waWxlcyBhcmUgcGFpbmZ1bC4gSSB3YXRjaGVkIHRoZSBvdXRwdXQgZnJvbQogICB0aGUgQm9ybGFuZCBDKysgdjUgYW5kIGl0IHdhcyBhd2Z1bC4gSnVzdCBpZ25vcmUgYWxsIHRob3NlIHdhcm5pbmdzLgoKVmVyc2lvbiAzLjAKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBGVFAgdXBsb2FkIGNhcGFiaWxpdGllcy4gVGhlIG5hbWUgdXJsZ2V0IGdldHMgYSBiaXQgc2lsbHkgbm93CiAgIHdoZW4gd2UgY2FuIHB1dCB0b28uLi4gPSkKIC0gUmVzdHJ1Y3R1cmVkIHRoZSBzb3VyY2UgcXVpdGUgYSBsb3QuCiAgIENoYW5nZWQgdGhlIHVybGdldCgpIGludGVyZmFjZS4gVGhpcyB3YXksIHdlIHdpbGwgc3Vydml2ZSBjaGFuZ2VzIG11Y2gKICAgYmV0dGVyLiBOZXcgZmVhdHVyZXMgY2FuIGNvbWUgYW5kIG9sZCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IHVzIG5lZWRpbmcKICAgdG8gY2hhbmdlIHRoZSBpbnRlcmZhY2UuIEkndmUgd3JpdHRlbiBhIHNtYWxsIGV4cGxhbmF0aW9uIGluIHVybGdldC5oCiAgIHRoYXQgZXhwbGFpbnMgaXQuCiAtIE5ldyBmbGFncyBpbmNsdWRlIC10LCAtVCwgLU8gYW5kIC1oLiBUaGUgLWggdGV4dCBpcyBnZW5lcmF0ZWQgYnkgdGhlIG5ldwogICBta2hlbHAgc2NyaXB0LgoKVmVyc2lvbiAyLjkKIFJlbWNvIHZhbiBIb29mZgogLSBBZGRlZCBhIGZpeCB0byBtYWtlIGl0IGNvbXBpbGUgc21vb3RobHkgb24gQW1pZ2EgdXNpbmcgdGhlIFNBUy9DCiAgIGNvbXBpbGVyLgogIAogRGFuaWVsIFN0ZW5iZXJnCiAtIEJlbGlldmUgaXQgb3Igbm90LCBidXQgdGhlIFNUVVBJRCBOb3ZlbGwgd2ViIHNlcnZlciBzZWVtcyB0byByZXF1aXJlCiAgIHRoYXQgdGhlIEhvc3Q6IGtleXdvcmQgaXMgdXNlZCwgc28gd2VsbCBJIHVzZSBpdCBhbmQgSSAocmUtaW50cm9kdWNlKSB0aGUKICAgdXJsZ2V0IFVzZXItQWdlbnQ6LiBJIHN0aWxsIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGlzIEhvc3Q6IHVzYWdlIHdvcmtzIHdpdGgKICAgcHJveGllcy4uLiAnSG9zdDonIGlzIHJlcXVpcmVkIGZvciBIVFRQLzEuMSBHRVQgYWNjb3JkaW5nIHRvIFJGQzIwNjguCgpWZXJzaW9uIDIuOAogUmFmYWVsIFNhZ3VsYQogLSBzb21lIGxpdHRsZSBtb2RpZmljYXRpb25zCgpWZXJzaW9uIDIuNwogRGFuaWVsIFN0ZW5iZXJnCiAtIFJlbW92ZWQgdGhlIC1sIG9wdGlvbiBhbmQgaW50cm9kdWNlZCB0aGUgLWYgb3B0aW9uIGluc3RlYWQuIE5vdyBJJ2xsCiAgIHJld3JpdGUgdGhlIGZvcm1lciAtbCBrbHVkZ2UgaW4gYW4gZXh0ZXJuYWwgc2NyaXB0IHRoYXQnbGwgdXNlIHVybGdldCB0bwogICBmZXRjaCBtdWx0aXBhcnQgZmlsZXMgbGlrZSB0aGF0LgogLSAnLWYnIGlzIGludHJvZHVjZWQsIGl0IG1lYW5zIEZhaWwgd2l0aG91dCBvdXRwdXQgaW4gY2FzZSBvZiBIVFRQIHNlcnZlcgogICBlcnJvcnMgKHJldHVybiBjb2RlID49MzAwKS4KIC0gQWRkZWQgc3VwcG9ydCBmb3IgLXIsIHJhbmdlcy4gU3BlY2lmeSB3aGljaCBwYXJ0IG9mIGEgZG9jdW1lbnQgeW91IAogICB3YW50LCBhbmQgb25seSB0aGF0IHBhcnQgaXMgcmV0dXJuZWQuIE9ubHkgd2l0aCBIVFRQLzEuMS1zZXJ2ZXJzLgogLSBTcGxpdCB1cCB0aGUgc291cmNlIGluIDMgcGFydHMuIE5vdyBhbGwgcHVyZSBVUkwgZnVuY3Rpb25zIGFyZSBpbgogICB1cmxnZXQuYyBhbmQgc3R1ZmYgdGhhdCBkZWFscyB3aXRoIHRoZSBzdGFuZC1hbG9uZSBwcm9ncmFtIGlzIGluIG1haW4uYy4KIC0gSSB0b29rIGEgZmV3IG1pbnV0ZXMgYW5kIHdyb3RlIGFuIGVtYnJ5byBvZiBhIFJFQURNRSBmaWxlIHRvIGV4cGxhaW4KICAgYSBmZXcgdGhpbmdzLgoKVmVyc2lvbiAyLjYKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIHRoZSAtbCAobG9vcCkgdGhpbmcgdXNlIHRoZSBuZXcgQ09ORl9GQUlMT05FUlJPUiB3aGljaCBtYWtlcwogICB1cmxnZXQoKSByZXR1cm4gZXJyb3IgY29kZSBpZiBub24tc3VjY2Vzc2Z1bC4gSXQgYWxzbyB3b24ndCBvdXRwdXQgYW55dGhpbmcKICAgdGhlbi4gTm93IGZpbmFsbHkgcmVtb3ZlZCB0aGUgSFRUUCAxLjAgYW5kIGVycm9yIDQwNCBkZXBlbmRlbmNpZXMuCiAtIEFkZGVkIC1JIHdoaWNoIHVzZXMgdGhlIEhFQUQgcmVxdWVzdCB0byBnZXQgdGhlIGhlYWRlciBvbmx5IGZyb20gYQogICBodHRwLXNlcnZlci4KClZlcnNpb24gMi41CiBSYWZhZWwgU2FndWxhCiAtIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHVzZSBISEg6TU06U1MgaW5zdGVhZCBvZiBvbmx5IHNlY29uZHMuCgpWZXJzaW9uIDIuNAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIHByb2dyZXNzIG1ldGVyLiBJdCBhcHBlYXJzIHdoZW4gZG93bmxvYWRpbmcgPiBCVUZGRVIgU0laRSBhbmQKICAgbXV0ZSBpcyBub3Qgc2VsZWN0ZWQuIEkgZm91bmQgb3V0IHRoYXQgd2hlbiBkb3dubG9hZGluZyBsYXJnZSBmaWxlcyBmcm9tCiAgIHJlYWxseSByZWFsbHkgc2xvdyBzaXRlcywgaXQgaXMgZGVzaXJhYmxlIHRvIGtub3cgdGhlIHN0YXR1cyBvZiB0aGUKICAgZG93bmxvYWQuIERvIG5vdGUgdGhhdCBzb21lIGRvd25sb2FkcyBhcmUgZG9uZSB1bmF3YXJpbmcgb2YgdGhlIHNpemUsIHdoaWNoCiAgIG1ha2VzIHRoZSBwcm9ncmVzcyBtZXRlciBsZXNzIHRocmlsbGluZyA7KSBJZiB0aGUgb3V0cHV0IGlzIHNlbnQgdG8gYSB0dHksCiAgIHRoZSBwcm9ncmVzcyBtZXRlciBpcyBzaHV0IG9mZi4KIC0gSW5jcmVhc2VkIGJ1ZmZlciBzaXplIHVzZWQgZm9yIHJlYWRpbmcuCiAtIEFkZGVkIGxlbmd0aCBjaGVja3MgaW4gdGhlIHVzZXIrcGFzc3dkIHBhcnNpbmcuCiAtIE1hZGUgaXQgZ3JvayB1c2VyK3Bhc3N3ZCBmb3IgSFRUUCBmZXRjaGVzLiBUaGUgdHJpY2sgaXMgdG8gYmFzZTY0CiAgIGVuY29kZSB0aGUgdXNlcitwYXNzd2QgYW5kIHNlbmQgYW4gZXh0cmEgaGVhZGVyIGxpbmUuIFJlYWQgY2hhcHRlciAxMS4xIGluCiAgIFJGQzIwNjggZm9yIGRldGFpbHMuIEkgYWRkZWQgaXQgdG8gYmUgdXNlZCBqdXN0IGxpa2UgdGhlIGZ0cCBvbmUuICBUbyBnZXQgYQogICBodHRwIGRvY3VtZW50IGZyb20gYSBwbGFjZSB0aGF0IHJlcXVpcmVzIHVzZXIgYW5kIHBhc3N3b3JkLCB1c2UgYW4gVVJMCiAgIGxpa2U6CgogICAgICAgIGh0dHA6Ly91c2VyOnBhc3N3ZEB3d3cuc2l0ZS50by5sZWFjaC9kb2MuaHRtbAoKICAgSSBhbHNvIGFkZGVkIHRoZSAtdSBmbGFnLCBzaW5jZSBXSEVOIFVTSU5HIEEgUFJPWFkgWU9VIENBTidUIFNQRUNJRlkgVEhFCiAgIFVTRVIgQU5EIFBBU1NXT1JEIFdJVEggSFRUUCBMSUtFIFRIQVQuIFRoZSAtdSBmbGFnIHdvcmtzIGZvciBmdHAgdG9vLCBidXQKICAgbm90IGlmIHVzZWQgd2l0aCBwcm94eS4gVG8gZG8gdGhlIHNhbWUgYXMgdGhlIGFib3ZlIG9uZSwgeW91IGNhbiBpbnZva2U6CgogICAgICAgIHVybGdldCAtdSB1c2VyOnBhc3N3ZCBodHRwOi8vd3d3LnNpdGUudG8ubGVhY2gvZG9jLmh0bWwKClZlcnNpb24gMi4zCiBSYWZhZWwgU2FndWxhCiAtIEFkZGVkICItbyIgb3B0aW9uIChvdXRwdXQgZmlsZSkKIC0gQWRkZWQgVVJHX0hUVFBfTk9UX0ZPVU5EIHJldHVybiBjb2RlLgogICAoRGFuaWVsJ3Mgbm90ZTopCiAgIFBlcmhhcHMgd2Ugc2hvdWxkIGRldGVjdCBhbGwga2luZHMgb2YgZXJyb3JzIGFuZCBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhhdAogICBjdXN0b20gc3RyaW5nIGZvciB0aGUgcGFydGljdWxhciA0MDQtZXJyb3IsIHVzZSB0aGUgZXJyb3IgdGV4dCB3ZSBhY3R1YWxseQogICBnZXQgZnJvbSB0aGUgc2VydmVyLiBTZWUgZnVydGhlciBkZXRhaWxzIGluIFJGQzIwNjggKEhUVFAgMS4xCiAgIGRlZmluaXRpb24pLiBUaGUgY3VycmVudCB3YXkgYWxzbyByZWxpZXMgb24gYSBIVFRQLzEuMCByZXBseSwgd2hpY2ggbmV3ZXIKICAgc2VydmVycyBtaWdodCBub3QgZG8uCiAtIExvb3BpbmcgbW9kZSAoIi1sIiBvcHRpb24pLiBJdCdzIGVhc2llciB0byBnZXQgdmFyaW91cyBzcGxpdCBmaWxlcy4KICAgKERhbmllbCdzIG5vdGU6KQogICBVc2UgaXQgbGlrZSAndXJsZ2V0IC1sIDEgaHR0cDovL2Zyb20udGhpcy5zaXRlL2ZpbGUlZC5odG1sJywgd2hpY2ggd2lsbAogICBtYWtlIHVybGdldCB0byBhdHRlbXB0IHRvIGZldGNoIGFsbCBmaWxlcyBuYW1lZCBmaWxlMS5odG1sLCBmaWxlMi5odG1sIGV0YwogICB1bnRpbCBubyBtb3JlIGZpbGVzIGFyZSBmb3VuZC4gVGhpcyBpcyBvbmx5IGEgbW9kaWZpY2F0aW9uIG9mIHRoZQogICBTVEFORF9BTE9ORSBwYXJ0LCBub3RoaW5nIGluIHRoZSB1cmxnZXQoKSBmdW5jdGlvbiB3YXMgbW9kZmlmaWVkIGZvciB0aGlzLgogRGFuaWVsIFN0ZW5iZXJnCiAtIENoYW5nZWQgdGhlIC1oIHRvIGJlIC1pIGluc3RlYWQuIC1oIHNob3VsZCBiZSBwcmVzZXJ2ZWQgdG8gaGVscCB1c2UuCiAtIEJqb3JuIFJlZXNlIGluZGljYXRlZCB0aGF0IEJvcmxhbmQgX21pZ2h0XyB1c2UgJ19XSU4zMicgaW5zdGVhZCBvZiB0aGUKICAgVkMrKyBXSU4zMiBkZWZpbmUgYW5kIHRoZXJlZm9yZSBJIGFkZGVkIGEgbGl0dGxlIGZpeCBmb3IgdGhhdC4KClZlcnNpb24gMi4yCiBKb2hhbiBBbmRlcnNzb24KIC0gVGhlIHVybGdldCBmdW5jdGlvbiBkaWRuJ3Qgc2V0IHRoZSBwYXRoIHRvIHVybCB3aGVuIHVzaW5nIHByb3h5LgogLSBGaXhlZCBidWcgd2l0aCBJTUMgcHJveHkuIE5vdyB1c2luZyAoYWxtb3N0KSBjb21wbGV0ZSBHRVQgY29tbWFuZC4KICAKIERhbmllbCBTdGVuYmVyZwogLSBNYWRlIGl0IGNvbXBpbGUgb24gU29sYXJpcy4gSGFkIHRvIHJlb3JnYW5pemUgdGhlIGluY2x1ZGVzIGEgYml0LgogICAoc28gV2luMzIsIExpbnV4LCBTdW5PUyA0IGFuZCBTb2xhcmlzIDIgY29tcGlsZSBmaW5lLikKIC0gTWFkZSBKb2hhbidzIGtlZXBhbGl2ZSBrZXl3b3JkIG9wdGlvbmFsIHdpdGggdGhlIC1rIGZsYWcgKHNpbmNlIGl0CiAgIG1ha2VzIGEgbG90IG9mIHVybGdldHMgdGFrZSBhIGxvdCBsb25nZXIgdGltZSkuCiAtIE1hZGUgYSAnLWgnIHN3aXRjaCBpbiBjYXNlIHlvdSB3YW50IHRoZSBIVFRQLWhlYWRlciBpbiB0aGUgb3V0cHV0LgoKVmVyc2lvbiAyLjEKIERhbmllbCBTdGVuYmVyZyBhbmQgS2plbGwgRXJpY3NvbgogLSBXaW4zMi1jb21waWxhYmxlCiAtIE5vIG1vcmUgZ2xvYmFsIHZhcmlhYmxlcwogLSBNdXRlIG9wdGlvbiAobm8gb3V0cHV0IGF0IGFsbCB0byBzdGRlcnIpCiAtIEZ1bGwgcmFuZ2Ugb2YgcmV0dXJuIGNvZGVzIGZyb20gdXJsZ2V0KCksIHdoaWNoIGlzIG5vdyB3cml0dGVuIHRvIGJlIGEKICAgZnVuY3Rpb24gZm9yIGVhc3ktdG8tdXNlIGluIFtvdGhlcl0gcHJvZ3JhbXMuCiAtIERlZmluZSBTVEFORF9BTE9ORSB0byBjb21waWxlIHRoZSBzdGFuZCBhbG9uZSB1cmxnZXQgcHJvZ3JhbQogLSBOb3cgY29tcGlsZXMgd2l0aCBnY2Mgb3B0aW9ucyAtYW5zaSAtV2FsbCAtcGVkYW50aWMgOykKClZlcnNpb24gMi4wCiAtIEludHJvZHVjaW5nIGZ0cCBHRVQgc3VwcG9ydC4gVGhlIEZUUCBVUkwgdHlwZSBpcyByZWNvZ25pemVkIGFuZCB1c2VkLgogLSBSZW5hbWVkIHRoZSBwcm9qZWN0IHRvICd1cmxnZXQnLgogLSBTdXBwb3J0cyB0aGUgdXNlcitwYXNzd2QgaW4gdGhlIEZUUCBVUkwgKG90aGVyd2lzZSBpdCB0cmllcyBhbm9ueW1vdXMKICAgbG9naW4gd2l0aCBhIHdlaXJkIGVtYWlsIGFkZHJlc3MgYXMgcGFzc3dvcmQpLgoKVmVyc2lvbiAxLjUKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgc2tpcF9oZWFkZXIoKSBjcmFwIG1lc3NlZCBpdCB1cCBiaWctdGltZS4gQnkgc2ltcGx5IHJlbW92aW5nIHRoYXQKICAgb25lIHdlIGNhbiBhbGwgb2YgYSBzdWRkZW4gZG93bmxvYWQgYW55dGhpbmcgOykKIC0gTm8gbG9uZ2VyIHJlcXVpcmVzIGEgdHJhaWxpbmcgc2xhc2ggb24gdGhlIFVSTHMuCiAtIElmIHRoZSBnaXZlbiBVUkwgaXNuJ3QgcHJlZml4ZWQgd2l0aCAnaHR0cDovLycsIEhUVFAgaXMgYXNzdW1lZCBhbmQKICAgZ2l2ZW4gYSB0cnkhCiAtICd2b2lkIG1haW4oKScgaXMgaGlzdG9yeS4KClZlcnNpb24gMS40CiBEYW5pZWwgU3RlbmJlcmcKIC0gVGhlIGdvcGhlciBzb3VyY2UgdXNlZCB0aGUgcHBhdGggdmFyaWFibGUgaW5zdGVhZCBvZiBwYXRoIHdoaWNoIGNvdWxkCiAgIGxlYWQgdG8gZGlzYXN0ZXIuCgpWZXJzaW9uIDEuMwogRGFuaWVsIFN0ZW5iZXJnCiAtIFdlbGwsIEkgYWRkZWQgYSBsYW1lIHRleHQgYWJvdXQgdGhlIHRpbWUgaXQgdG9vayB0byBnZXQgdGhlIGRhdGEuIEkgYWxzbwogICBmb3VnaHQgYWdhaW5zdCBKb2hhbiB0byBwcmV2ZW50IGhpcyAtZiBvcHRpb24gKHRvIHNwZWNpZnkgYSBmaWxlIG5hbWUKICAgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiBpbnN0ZWFkIG9mIHN0ZG91dCkhID0pCiAtIE1hZGUgaXQgd3JpdGUgJ2Nvbm5lY3Rpb24gcmVmdXNlZCcgZm9yIHRoYXQgcGFydGljdWxhciBjb25uZWN0KCkKICAgcHJvYmxlbS4KIC0gUmVudW1iZXJlZCB0aGUgdmVyc2lvbi4gTGV0J3Mgbm90IG1ha2Ugc2lsbHkgMS4wLlggdmVyc2lvbnMsIHRoaXMgaXMKICAgYSBwbGFpbiAxLjMgaW5zdGVhZC4KClZlcnNpb24gMS4yCiBKb2hhbiBBbmRlcnNzb24KIC0gRGlzY292ZXJlZCBhbmQgZml4ZWQgdGhlIHByb2JsZW0gd2l0aCBnZXR0aW5nIGJpbmFyeSBmaWxlcy4gcHV0cygpIGlzCiAgIG5vdyByZXBsYWNlZCB3aXRoIGZ3cml0ZSgpLiAoRGFuaWVsJ3Mgbm90ZTogdGhpcyBhbHNvIGZpeGVkIHRoZSBidWZmZXIKICAgb3ZlcndyaXRlIHByb2JsZW0gSSBmb3VuZCBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbi4pCgogUmFmYWVsIFNhZ3VsYQogLSBMZXQgIi1wIiBiZWZvcmUgIi14Ii4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQnVnZml4ZWQgdGhlIHByb3h5IHVzYWdlLiBJdCBzaG91bGQgKk5PVCogdXNlIG5vciBzdHJpcCB0aGUgcG9ydCBudW1iZXIKICAgZnJvbSB0aGUgVVJMIGJ1dCBzaW1wbHkgcGFzcyB0aGF0IGluZm9ybWF0aW9uIHRvIHRoZSBwcm94eS4gVGhpcyBhbHNvCiAgIG1hZGUgdGhlIHVzZXIvcGFzc3dvcmQgZmllbGRzIHBvc3NpYmxlIHRvIHVzZSBpbiBwcm94eSBbZnRwLV0gVVJMcy4KICAgKGxpa2UgaW4gZnRwOi8vdXNlcjpwYXNzd29yZEBmdHAubXkuc2l0ZTo4MDIxL1JFQURNRSkKCiBKb2hhbiBBbmRlcnNzb24KIC0gSW1wbGVtZW50ZWQgSFRUUCBwcm94eSBzdXBwb3J0LgogLSBSZWNlaXZlIGJ5dGUgY291bnRlciBhZGRlZC4KCiBCam9ybiBSZWVzZQogLSBJbXBsZW1lbnRlZCBVUkxzIChhbmQgc2tpcHBlZCB0aGUgb2xkIHN5bnRheCkuCiAtIE91dHB1dCBpcyB3cml0dGVuIHRvIHN0ZG91dCwgc28gdG8gYWNoaWV2ZSB0aGUgYWJvdmUgZXhhbXBsZSwgZG86CiAgIGh0dHBnZXQgaHR0cDovLzE0My41NC4xMC42L2luZm9fbG9nby5naWYgPiB0ZXN0LmdpZgoKVmVyc2lvbiAxLjEKIERhbmllbCBTdGVuYmVyZwogLSBBZGp1c3RlZCBpdCBzbGlnaHRseSB0byBhY2NlcHQgbmFtZWQgaG9zdHMgb24gdGhlIGNvbW1hbmQgbGluZS4gV2UKICAgd291bGRuJ3Qgd2FubmEgdXNlIElQIG51bWJlcnMgZm9yIHRoZSByZXN0IG9mIG91ciBsaWZlcywgd291bGQgd2U/CgpWZXJzaW9uIDEuMAogIFJhZmFlbCBTYWd1bGEKICAtIFdyb3RlIHRoZSBpbml0aWFsIGh0dHBnZXQsIHdoaWNoIHN0YXJ0ZWQgYWxsIHRoaXMhCg==